diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 1bf0cfe712c5ecec29cb5f8262cda25373fb586b..7c5f95bd3285a2cdd28c9d17d73aa8b642be1dd3 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -10,7 +10,7 @@ variables:
 # Builds for all branches
 # -----------------------
 
-linux64_docker:
+linux64_docker_ci:
   image: onelab/ubuntu16.04
   script:
     - mkdir build
@@ -21,8 +21,10 @@ linux64_docker:
   tags:
     - linux64
     - docker
+  except:
+    - tags
 
-linux64_docker_cxx98_compat:
+linux64_docker_cxx98_compat_ci:
   image: onelab/ubuntu16.04
   script:
     - mkdir build
@@ -33,8 +35,10 @@ linux64_docker_cxx98_compat:
   tags:
     - linux64
     - docker
+  except:
+    - tags
 
-linux64_docker_minimal:
+linux64_docker_minimal_ci:
   image: onelab/ubuntu16.04
   script:
     - mkdir build
@@ -44,8 +48,10 @@ linux64_docker_minimal:
   tags:
     - linux64
     - docker
+  except:
+    - tags
 
-windows64_msvc:
+windows64_msvc_ci:
   script:
     - md build
     - cd build
@@ -54,12 +60,14 @@ windows64_msvc:
   tags:
     - windows64
     - official
+  except:
+    - tags
 
 # ------------------------------------------
 # Official Linux builds (master branch only)
 # ------------------------------------------
 
-linux64_official:
+.linux64_official: &linux64_official
   only:
     - master
   script:
@@ -73,11 +81,23 @@ linux64_official:
     - linux64
     - official
 
+linux64_official_snapshot:
+  <<: *linux64_official
+  except:
+    - tags
+
+linux64_official_release:
+  variables:
+    EXTRA_VERSION: ""
+  <<: *linux64_official
+  only:
+    - /^gmsh_.*$/
+
 # --------------------------------------------
 # Official Windows builds (master branch only)
 # --------------------------------------------
 
-.windows_official: &ref_windows_official
+.windows_official: &windows_official
   only:
     - master
   script:
@@ -88,24 +108,48 @@ linux64_official:
     - bash -c "/usr/bin/scp -o StrictHostKeyChecking=no -i /home/geuzaine/.ssh/id_rsa gmsh-*.zip geuzaine@gmsh.info:.wwwgmsh/bin/Windows/"
     - bash -c "/usr/bin/ctest -D Experimental -j 1 --output-on-failure"
 
-windows64_official:
-  <<: *ref_windows_official
+windows64_official_snapshot:
+  <<: *windows_official
+  tags:
+    - windows64
+    - official
+  except:
+    - tags
+
+windows64_official_release:
+  variables:
+    EXTRA_VERSION: ""
+  <<: *windows_official
   tags:
     - windows64
     - official
+  only:
+    - /^gmsh_.*$/
 
-windows32_official:
-  <<: *ref_windows_official
+windows32_official_snapshot:
+  <<: *windows_official
   tags:
     - windows32
     - official
+  except:
+    - tags
   allow_failure: true
 
+windows32_official_release:
+  variables:
+    EXTRA_VERSION: ""
+  <<: *windows_official
+  tags:
+    - windows32
+    - official
+  only:
+    - /^gmsh_.*$/
+
 # ------------------------------------------
 # Official MacOS builds (master branch only)
 # ------------------------------------------
 
-macos64_official:
+.macos64_official: &macos64_official
   only:
     - master
   script:
@@ -123,11 +167,23 @@ macos64_official:
     - macos64
     - official
 
+macos64_official_snapshot:
+  <<: *macos64_official
+  except:
+    - tags
+
+macos64_official_release:
+  variables:
+    EXTRA_VERSION: ""
+  <<: *macos64_official
+  only:
+    - /^gmsh_.*$/
+
 # ----------------------------------------------
 # Official source snapshots (master branch only)
 # ----------------------------------------------
 
-source_official:
+.source_official: &source_official
   only:
     - master
   script:
@@ -139,3 +195,15 @@ source_official:
   tags:
     - linux64
     - official
+
+source_official_snapshot:
+  <<: *source_official
+  except:
+    - tags
+
+source_official_release:
+  variables:
+    EXTRA_VERSION: ""
+  <<: *source_official
+  only:
+    - /^gmsh_.*$/
diff --git a/CHANGELOG.txt b/CHANGELOG.txt
index fa86b4f17cf58dc79d1c445a42a386b2e489908e..501bfd9732a0f4e1dc24a172ab2583083ee911e6 100644
--- a/CHANGELOG.txt
+++ b/CHANGELOG.txt
@@ -1,5 +1,10 @@
-3.0.6: improved meshing of spheres; implement "Coherence" for OpenCASCADE
-kernel, as a shortcut to BooleanFragments; bug fixes.
+3.1.0: generalized handling of "all" entities in geo file (using {:} notation);
+removed GModelFactory.
+
+3.0.6 (Novmeber 5, 2017): improved meshing of spheres; improved handling of mesh
+size constraints with OpenCASCADE kernel; implemented "Coherence" for
+OpenCASCADE kernel (shortcut for BooleanFragments); added GAMBIT Neutral File
+export; small improvements and bug fixes.
 
 3.0.5 (September 6, 2017): bug fixes.
 
@@ -148,11 +153,11 @@ understand; many bug fixes and usability improvements all over the place.
 mesh and graphics code refactoring, small usability enhancements and bug fixes.
 
 2.4.0 (Aug 22, 2009): switched build system to CMake; optionally copy
-transfinite mesh contraints during geometry transformations; bumped mesh version
-format to 2.1 (small change in the $PhysicalNames section, where the group
-dimension is now required); ported most plugins to the new post-processing API;
-switched from MathEval to MathEx and Flu_Tree_Browser to Fl_Tree; small bug
-fixes and improvements all over the place.
+transfinite mesh constraints during geometry transformations; bumped mesh
+version format to 2.1 (small change in the $PhysicalNames section, where the
+group dimension is now required); ported most plugins to the new
+post-processing API; switched from MathEval to MathEx and Flu_Tree_Browser to
+Fl_Tree; small bug fixes and improvements all over the place.
 
 2.3.1 (Mar 18, 2009): removed GSL dependency (Gmsh now simply uses Blas and
 Lapack); new per-window visibility; added support for composite window printing
diff --git a/CMakeLists.txt b/CMakeLists.txt
index aa72738f0e95f3af52e2a3d0779e42eb95dfb066..a7413c39afbf4af2d664983096797ed388e8c08f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -89,13 +89,13 @@ opt(TCMALLOC "Enable libtcmalloc, a fast malloc implementation but that does not
 opt(TETGEN "Enable Tetgen 3D initial mesh generator" ${DEFAULT})
 opt(VISUDEV "Enable additional visualization capabilities for development purpose" OFF)
 opt(VORO3D "Enable Voro3D (for hex meshing, experimental)" ${DEFAULT})
-opt(WRAP_JAVA "Enable generation of Java wrappers (experimental)" OFF)
-opt(WRAP_PYTHON "Enable generation of Python wrappers" OFF)
+opt(WRAP_JAVA_DEPRECATED "Enable generation of Java wrappers (deprecated)" OFF)
+opt(WRAP_PYTHON_DEPRECATED "Enable generation of Python wrappers (deprecated)" OFF)
 opt(ZIPPER "Enable Zip file compression/decompression" OFF)
 
 set(GMSH_MAJOR_VERSION 3)
 set(GMSH_MINOR_VERSION 0)
-set(GMSH_PATCH_VERSION 6)
+set(GMSH_PATCH_VERSION 7)
 set(GMSH_EXTRA_VERSION "" CACHE STRING "Gmsh extra version string")
 
 set(GMSH_VERSION "${GMSH_MAJOR_VERSION}.${GMSH_MINOR_VERSION}")
@@ -103,6 +103,11 @@ set(GMSH_VERSION "${GMSH_VERSION}.${GMSH_PATCH_VERSION}${GMSH_EXTRA_VERSION}")
 set(GMSH_SHORT_LICENSE "GNU General Public License")
 
 set(GMSH_API
+  ${CMAKE_CURRENT_BINARY_DIR}/Common/GmshConfig.h
+  ${CMAKE_CURRENT_BINARY_DIR}/Common/GmshVersion.h
+  Common/GmshAPI.h)
+
+set(GMSH_API_DEPRECATED
   ${CMAKE_CURRENT_BINARY_DIR}/Common/GmshConfig.h
   ${CMAKE_CURRENT_BINARY_DIR}/Common/GmshVersion.h
   Common/Gmsh.h Common/Context.h Common/GmshDefines.h Common/GmshMessage.h
@@ -166,11 +171,6 @@ set(GMSH_API
   contrib/MeshQualityOptimizer/MeshQualityOptimizer.h
   contrib/MathEx/mathex.h)
 
-get_property(IAMCHILD DIRECTORY  PROPERTY PARENT_DIRECTORY)
-if(IAMCHILD)
-  set(GMSH_API ${GMSH_API} PARENT_SCOPE)
-endif(IAMCHILD)
-
 if(${CMAKE_MAJOR_VERSION} GREATER 2)
   string(TIMESTAMP DATE "%Y%m%d")
 else(${CMAKE_MAJOR_VERSION} GREATER 2)
@@ -236,9 +236,9 @@ if(NOT APPLE)
   endif(HAVE_64BIT_SIZE_T)
 endif(NOT APPLE)
 
-if(ENABLE_WRAP_PYTHON AND NOT ENABLE_BUILD_SHARED)
+if(ENABLE_WRAP_PYTHON_DEPRECATED AND NOT ENABLE_BUILD_SHARED)
   set(ENABLE_BUILD_DYNAMIC ON)
-endif(ENABLE_WRAP_PYTHON AND NOT ENABLE_BUILD_SHARED)
+endif(ENABLE_WRAP_PYTHON_DEPRECATED AND NOT ENABLE_BUILD_SHARED)
 
 if(MSVC)
   # remove annoying warning about bool/int cast performance
@@ -1252,7 +1252,7 @@ if(ENABLE_ZIPPER)
   endif(HAVE_LIBZ)
 endif(ENABLE_ZIPPER)
 
-if(ENABLE_WRAP_PYTHON)
+if(ENABLE_WRAP_PYTHON_DEPRECATED)
   find_package(SWIG)
   find_package(PythonLibs)
   find_package(PythonInterp)# ${PYTHONLIBS_VERSION_STRING} EXACT)
@@ -1266,7 +1266,7 @@ if(ENABLE_WRAP_PYTHON)
       mark_as_advanced(CLEAR PYTHON_LIBRARY PYTHON_INCLUDE_DIR)
     endif(SWIG_MAJOR_VERSION EQUAL 1)
   endif(SWIG_FOUND AND PYTHONLIBS_FOUND)
-endif(ENABLE_WRAP_PYTHON)
+endif(ENABLE_WRAP_PYTHON_DEPRECATED)
 
 if(HAVE_PYTHON)
   if(ENABLE_NUMPY)
@@ -1536,7 +1536,7 @@ endif(ENABLE_BUILD_ANDROID)
 
 # shared library target
 if(ENABLE_BUILD_SHARED OR ENABLE_BUILD_DYNAMIC OR
-   ENABLE_WRAP_PYTHON OR ENABLE_WRAP_JAVA)
+   ENABLE_WRAP_PYTHON_DEPRECATED OR ENABLE_WRAP_JAVA_DEPRECATED)
   add_library(shared SHARED ${GMSH_SRC})
   set_target_properties(shared PROPERTIES OUTPUT_NAME Gmsh)
   set_target_properties(shared PROPERTIES
@@ -1551,7 +1551,7 @@ if(ENABLE_BUILD_SHARED OR ENABLE_BUILD_DYNAMIC OR
   endif(MSVC AND ENABLE_MSVC_STATIC_RUNTIME)
   target_link_libraries(shared ${LINK_LIBRARIES})
 endif(ENABLE_BUILD_SHARED OR ENABLE_BUILD_DYNAMIC OR
-      ENABLE_WRAP_PYTHON OR ENABLE_WRAP_JAVA)
+      ENABLE_WRAP_PYTHON_DEPRECATED OR ENABLE_WRAP_JAVA_DEPRECATED)
 
 # binary targets
 if(HAVE_FLTK)
@@ -1665,15 +1665,18 @@ if(WIN32 OR CYGWIN)
     set(GMSH_LIB .)
     set(GMSH_DOC .)
     set(GMSH_MAN .)
+    set(GMSH_INC .)
   else(ENABLE_OS_SPECIFIC_INSTALL)
     include(GNUInstallDirs)
     set(GMSH_BIN ${CMAKE_INSTALL_BINDIR})
     set(GMSH_LIB ${CMAKE_INSTALL_LIBDIR})
     set(GMSH_DOC ${CMAKE_INSTALL_DOCDIR})
     set(GMSH_MAN ${CMAKE_INSTALL_MANDIR}/man1)
+    set(GMSH_INC ${CMAKE_INSTALL_INCLUDEDIR})
   endif(ENABLE_OS_SPECIFIC_INSTALL)
   if(CYGWIN)
     unix2dos(GMSH_API)
+    unix2dos(GMSH_API_DEPREATED)
     unix2dos(WELCOME_FILE)
     unix2dos(LICENSE_FILE)
     unix2dos(CREDITS_FILE)
@@ -1691,11 +1694,14 @@ elseif(APPLE AND ENABLE_OS_SPECIFIC_INSTALL)
   set(GMSH_LIB ../MacOS)
   set(GMSH_DOC ../../..)
   set(GMSH_MAN ../../..)
+  set(GMSH_INC ../MacOS)
 else(WIN32 OR CYGWIN)
-  set(GMSH_BIN bin)
-  set(GMSH_LIB lib)
-  set(GMSH_DOC share/doc/gmsh)
-  set(GMSH_MAN share/man/man1)
+  include(GNUInstallDirs)
+  set(GMSH_BIN ${CMAKE_INSTALL_BINDIR})
+  set(GMSH_LIB ${CMAKE_INSTALL_LIBDIR})
+  set(GMSH_DOC ${CMAKE_INSTALL_DOCDIR})
+  set(GMSH_MAN ${CMAKE_INSTALL_MANDIR}/man1)
+  set(GMSH_INC ${CMAKE_INSTALL_INCLUDEDIR})
 endif(WIN32 OR CYGWIN)
 
 # mark targets as optional so we can install them separately if needed
@@ -1746,7 +1752,8 @@ if(ENABLE_ONELAB)
   install(FILES ${ONELAB_PY} DESTINATION ${GMSH_BIN})
 endif(ENABLE_ONELAB)
 if(ENABLE_BUILD_LIB OR ENABLE_BUILD_SHARED OR ENABLE_BUILD_DYNAMIC)
-  install(FILES ${GMSH_API} DESTINATION include/gmsh)
+  install(FILES ${GMSH_API} DESTINATION ${GMSH_INC})
+  install(FILES ${GMSH_API_DEPRECATED} DESTINATION ${GMSH_INC}/gmsh)
 endif(ENABLE_BUILD_LIB OR ENABLE_BUILD_SHARED OR ENABLE_BUILD_DYNAMIC)
 install(FILES ${WELCOME_FILE} DESTINATION ${GMSH_DOC} RENAME README.txt)
 install(FILES ${LICENSE_FILE} DESTINATION ${GMSH_DOC})
@@ -1766,6 +1773,11 @@ add_custom_target(get_headers
   COMMAND ${CMAKE_COMMAND} -E make_directory Headers/gmsh
   WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
 foreach(FILE ${GMSH_API})
+  add_custom_command(TARGET get_headers POST_BUILD COMMAND ${CMAKE_COMMAND}
+    -E copy_if_different ${FILE} ${CMAKE_CURRENT_BINARY_DIR}/Headers/
+    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+endforeach(FILE)
+foreach(FILE ${GMSH_API_DEPRECATED})
   add_custom_command(TARGET get_headers POST_BUILD COMMAND ${CMAKE_COMMAND}
     -E copy_if_different ${FILE} ${CMAKE_CURRENT_BINARY_DIR}/Headers/gmsh/
     WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
@@ -1840,6 +1852,11 @@ if(APPLE AND ENABLE_BUILD_LIB)
         ${FILE} ${CMAKE_CURRENT_BINARY_DIR}/Gmsh.framework/Headers/
         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
   endforeach(FILE)
+  foreach(FILE ${GMSH_API_DEPRECATED})
+    add_custom_command(TARGET framework POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy
+        ${FILE} ${CMAKE_CURRENT_BINARY_DIR}/Gmsh.framework/Headers/
+        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+  endforeach(FILE)
 endif(APPLE AND ENABLE_BUILD_LIB)
 
 set(CPACK_PACKAGE_VENDOR "Christophe Geuzaine and Jean-Francois Remacle")
@@ -1853,7 +1870,7 @@ if(GMSH_EXTRA_VERSION MATCHES "-git.*") # so that we'll overwrite the archives
   set(CPACK_PACKAGE_FILE_NAME gmsh-git-${GMSH_OS})
   set(CPACK_SOURCE_PACKAGE_FILE_NAME gmsh-git-source)
 else(GMSH_EXTRA_VERSION MATCHES "-git.*")
-  set(CPACK_PACKAGE_FILE_NAME gmsh-${GMSH_VERSION}-${GMSH_OS})      
+  set(CPACK_PACKAGE_FILE_NAME gmsh-${GMSH_VERSION}-${GMSH_OS})
   set(CPACK_SOURCE_PACKAGE_FILE_NAME gmsh-${GMSH_VERSION}-source)
 endif(GMSH_EXTRA_VERSION MATCHES "-git.*")
 set(CPACK_PACKAGE_INSTALL_DIRECTORY "Gmsh")
@@ -1906,12 +1923,12 @@ if(HAVE_PYTHON)
   add_subdirectory(wrappers/gmshpy)
 endif(HAVE_PYTHON)
 
-if(ENABLE_WRAP_JAVA)
+if(ENABLE_WRAP_JAVA_DEPRECATED)
   if(NOT HAVE_BLAS OR NOT HAVE_LAPACK)
     message(WARNING "Java wrapping samples will not work without BLAS and LAPACK")
   endif(NOT HAVE_BLAS OR NOT HAVE_LAPACK)
   add_subdirectory(wrappers/java)
-endif(ENABLE_WRAP_JAVA)
+endif(ENABLE_WRAP_JAVA_DEPRECATED)
 
 include(CPack)
 
diff --git a/Common/CommandLine.cpp b/Common/CommandLine.cpp
index 19c233f24cb160fcbfcc24bc40322283a00c8005..c8bf5ee141e427da8cc0b1718dbd5465bcc9f5af 100644
--- a/Common/CommandLine.cpp
+++ b/Common/CommandLine.cpp
@@ -150,6 +150,7 @@ std::vector<std::pair<std::string, std::string> > GetUsage()
   s.push_back(mp("-setstring name value", "Set constant string name=value"));
   s.push_back(mp("-option file",       "Parse option file at startup"));
   s.push_back(mp("-convert files",     "Convert files into latest binary formats, then exit"));
+  s.push_back(mp("-nt int",            "Set number of threads"));
   s.push_back(mp("-cpu",               "Report CPU times for all operations"));
   s.push_back(mp("-version",           "Show version number"));
   s.push_back(mp("-info",              "Show detailed version information"));
@@ -1028,7 +1029,7 @@ void GetOptions(int argc, char *argv[])
       else if(!strcmp(argv[i] + 1, "nt")) {
         i++;
         if(argv[i])
-          Msg::SetNumThreads(atoi(argv[i++]));
+          opt_general_num_threads(0, GMSH_SET, atoi(argv[i++]));
         else
           Msg::Fatal("Missing number");
       }
diff --git a/Common/Context.h b/Common/Context.h
index 0b0dad6c0d5d32dfc6c405aacbee3364a712246b..f3b066d3ce74caefd8385b69ea3b048646919c54 100644
--- a/Common/Context.h
+++ b/Common/Context.h
@@ -62,6 +62,7 @@ struct contextMeshOptions {
   int NewtonConvergenceTestXYZ;
   int preserveNumberingMsh2;
   int ignorePeriodicity;
+  int maxNumThreads1D, maxNumThreads2D, maxNumThreads3D;
 };
 
 struct contextGeometryOptions {
diff --git a/Common/DefaultOptions.h b/Common/DefaultOptions.h
index 471f794d4a302426ab1cde4dbcc3caed1ddae01f..b46b59db529f3aa31221a8e84b5ae2ea5eda32e3 100644
--- a/Common/DefaultOptions.h
+++ b/Common/DefaultOptions.h
@@ -40,6 +40,8 @@ StringXString GeneralOptions_String[] = {
 
   { F|O, "BackgroundImageFileName" , opt_general_background_image_filename , "" ,
     "Background image file in JPEG, PNG or PDF format" },
+  { F,   "BuildOptions" , opt_general_build_options , "" ,
+    "Gmsh build options (read-only)" },
 
   { F|O, "DefaultFileName" , opt_general_default_filename , "untitled.geo" ,
     "Default project file name" },
@@ -123,6 +125,9 @@ StringXString GeneralOptions_String[] = {
 #endif
     "Temporary file used by the geometry module" },
 
+  { F,   "Version" , opt_general_version , "" ,
+    "Gmsh version (read-only)" },
+
   { F, "WatchFilePattern", opt_general_watch_file_pattern , "" ,
      "Pattern of files to merge as they become available"},
 
@@ -675,6 +680,8 @@ StringXNumber GeneralOptions_Number[] = {
   { F|O, "NoPopup" , opt_general_nopopup , 0. ,
     "Disable interactive dialog windows in scripts (and use default values "
     "instead)" },
+  { F|O, "NumThreads" , opt_general_num_threads , 1. ,
+    "Set (maximum) number of threads" },
 
   { F|S, "OptionsPositionX" , opt_general_option_position0 , 650. ,
     "Horizontal position (in pixels) of the upper left corner of the option "
@@ -1062,7 +1069,7 @@ StringXNumber MeshOptions_Number[] = {
     "Element shrinking factor (between 0 and 1)" },
 
   { F|O, "FlexibleTransfinite" , opt_mesh_flexible_transfinite , 0 ,
-    "Allow transfinite contraints to be modified for Blossom or by global mesh size factor" },
+    "Allow transfinite constraints to be modified for Blossom or by global mesh size factor" },
   { F|O, "NewtonConvergenceTestXYZ" , opt_mesh_newton_convergence_test_xyz , 0. ,
     "Force inverse surface mapping algorithm (Newton-Raphson) to converge in real "
     "coordinates (experimental)" },
@@ -1106,6 +1113,12 @@ StringXNumber MeshOptions_Number[] = {
   { F|O, "LineWidth" , opt_mesh_line_width , 1.0 ,
     "Display width of mesh lines (in pixels)" },
 
+  { F|O, "MaxNumThreads1D" , opt_mesh_max_num_threads_1d , 0. ,
+    "Maximum number of threads for 1D meshing (0: use default number of threads)" },
+  { F|O, "MaxNumThreads2D" , opt_mesh_max_num_threads_2d , 0. ,
+    "Maximum number of threads for 2D meshing (0: use default number of threads)" },
+  { F|O, "MaxNumThreads3D" , opt_mesh_max_num_threads_3d , 0. ,
+    "Maximum number of threads for 3D meshing (0: use default number of threads)" },
   { F|O, "MeshOnlyVisible" , opt_mesh_mesh_only_visible, 0. ,
     "Mesh only visible entities (experimental: use with caution!)" },
   { F|O, "MetisAlgorithm" , opt_mesh_partition_metis_algorithm, 1. ,
@@ -1213,7 +1226,7 @@ StringXNumber MeshOptions_Number[] = {
     "Preserve element numbering in MSH2 format (will break meshes with multiple "
     "physical groups for a single elementary entity)"},
   { F|O, "IgnorePeriodicity" , opt_mesh_ignore_periodicity , 0. ,
-    "Ignore alignement of periodic boundaries when reading the mesh "
+    "Ignore alignment of periodic boundaries when reading the mesh "
     "(used by ParaView plugin)"},
 #if defined(HAVE_BLOSSOM)
   { F|O, "RecombinationAlgorithm" , opt_mesh_algo_recombine , 1 ,
diff --git a/Common/GmshAPI.cpp b/Common/GmshAPI.cpp
index 1246a0210ccf31358dcab4a82d86f92ead958767..b3e1585bc068b3b78ab3600a834d9f79d0237d65 100644
--- a/Common/GmshAPI.cpp
+++ b/Common/GmshAPI.cpp
@@ -1,118 +1,117 @@
-/* Gmsh - Copyright (C) 1997-2017 C. Geuzaine, J.-F. Remacle
- *
- * See the LICENSE.txt file for license information. Please report all
- * bugs and problems to the public mailing list <gmsh@onelab.info>.
- */
-
-/*
-  This is the embryo of what will become the Gmsh API.
-
-  Don't use it, it's not ready :-) We plan to release a first version in Gmsh
-  3.1, and something more complete in Gmsh 4.0.
-
-  Your input is welcome: please contribute your ideas on
-  http://gitlab.onelab.info/gmsh/gmsh/issues/188
- */
+// Gmsh - Copyright (C) 1997-2017 C. Geuzaine, J.-F. Remacle
+//
+// See the LICENSE.txt file for license information. Please report all
+// bugs and problems to the public mailing list <gmsh@onelab.info>.
 
 #include "Gmsh.h"
+#include "GmshAPI.h"
+#include "GModel.h"
+#include "GModelIO_GEO.h"
+#include "GModelIO_OCC.h"
 
-extern "C"
-{
-  /* Gmsh */
-  int gmshInitialize(int argc, char **argv)
-  {
-    return !GmshInitialize(argc, argv);
-  }
-
-  int gmshFinalize()
-  {
-    return !GmshFinalize();
-  }
-
-  int gmshOpen(const char *fileName)
-  {
-    return !GmshOpenProject(fileName);
-  }
-
-  int gmshMerge(const char *fileName)
-  {
-    return !GmshMergeFile(fileName);
-  }
+// Gmsh
 
-  int gmshExport(const char *fileName)
-  {
-    return 1;
-  }
+int gmshInitialize(int argc, char **argv)
+{
+  return !GmshInitialize(argc, argv);
+}
 
-  int gmshClear()
-  {
-    return 1;
-  }
+int gmshFinalize()
+{
+  return !GmshFinalize();
+}
 
-  /* Gmsh Options */
-  int gmshOptionsSetNumber(const char *name, double value)
-  {
-    return 1;
-  }
+int gmshOpen(const std::string &fileName)
+{
+  return !GmshOpenProject(fileName);
+}
 
-  int gmshOptionsGetNumber(const char *name, double *value)
-  {
-    return 1;
-  }
+int gmshMerge(const std::string &fileName)
+{
+  return !GmshMergeFile(fileName);
+}
 
-  /* Gmsh Model */
-  int gmshModelCreate(const char *name)
-  {
-    return 1;
-  }
+int gmshExport(const std::string &fileName)
+{
+  return !GmshWriteFile(fileName);
+}
 
-  int gmshModelSetCurrent(const char *name)
-  {
-    return 1;
-  }
+int gmshClear()
+{
+  return !GmshClearProject();
+}
 
-  int gmshModelDestroy()
-  {
-    return 1;
-  }
+// GmshOption
 
-  int gmshModelMesh(int dim)
-  {
-    return 1;
-  }
+static void splitOptionName(const std::string &fullName, std::string &category,
+                            std::string &name, int &index)
+{
+  std::string::size_type d = fullName.find_first_of('.');
+  category = fullName.substr(0, d);
+  std::string::size_type b1 = fullName.find_first_of('[');
+  std::string::size_type b2 = fullName.find_last_of(']');
+  if(b1 != std::string::npos && b2 != std::string::npos){
+    std::string id = fullName.substr(b1, b2 - b1);
+    name = fullName.substr(d, b1 - d);
+  }
+  else{
+    index = 0;
+    name = fullName.substr(d);
+  }
+  Msg::Debug("Decoded option name '%s' . '%s' '[%d]'", category.c_str(),
+             name.c_str(), index);
+}
 
-  int gmshModelAddEmbeddedVertex(int tag, int inDim, int inTag)
-  {
-    return 1;
-  }
+int gmshOptionSetNumber(const std::string &name, double value)
+{
+  std::string c, n;
+  int i;
+  splitOptionName(name, c, n, i);
+  return !GmshSetOption(c, n, value, i);
+}
 
-  /* Gmsh Model Geo Internals */
+int gmshOptionGetNumber(const std::string &name, double &value)
+{
+  std::string c, n;
+  int i;
+  splitOptionName(name, c, n, i);
+  return !GmshGetOption(c, n, value, i);
+}
 
-  int gmshModelGeoAddPoint(int *tag, double x, double y, double z, double lc)
-  {
-    return 1;
-  }
+int gmshOptionSetString(const std::string &name, const std::string &value)
+{
+  std::string c, n;
+  int i;
+  splitOptionName(name, c, n, i);
+  return !GmshSetOption(c, n, value, i);
+}
 
-  int gmshModelGeoAddLine(int *tag, int startVertexTag, int endVertexTag)
-  {
-    return 1;
-  }
+int gmshOptionGetString(const std::string &name, std::string &value)
+{
+  std::string c, n;
+  int i;
+  splitOptionName(name, c, n, i);
+  return !GmshGetOption(c, n, value, i);
+}
 
-  int gmshModelGeoSynchronize()
-  {
-    return 1;
-  }
+// GmshModel
 
-  /* Gmsh Model OCC Internals */
+int gmshModelCreate(const std::string &name)
+{
+  return 0;
+}
 
-  int gmshModelOCCAddPoint(int *tag, double x, double y, double z, double lc)
-  {
-    return 1;
-  }
+int gmshModelSetCurrent(const std::string &name)
+{
+  return 0;
+}
 
-  int gmshModelOCCSynchronize()
-  {
-    return 1;
-  }
+int gmshModelDestroy()
+{
+  return 0;
+}
 
+int gmshModelMesh(int dim)
+{
+  return 0;
 }
diff --git a/Common/GmshAPI.h b/Common/GmshAPI.h
index 652560261261bd97154b64b642b843d91d64b52f..2e471a094d2325820936b2120ab62b13cf82d532 100644
--- a/Common/GmshAPI.h
+++ b/Common/GmshAPI.h
@@ -1,21 +1,26 @@
-/* Gmsh - Copyright (C) 1997-2017 C. Geuzaine, J.-F. Remacle
- *
- * See the LICENSE.txt file for license information. Please report all
- * bugs and problems to the public mailing list <gmsh@onelab.info>.
- */
+// Gmsh - Copyright (C) 1997-2017 C. Geuzaine, J.-F. Remacle
+//
+// See the LICENSE.txt file for license information. Please report all
+// bugs and problems to the public mailing list <gmsh@onelab.info>.
 
-/*
-  This is the embryo of what will become the Gmsh API.
+#ifndef _GMSH_API_H_
+#define _GMSH_API_H_
 
-  Don't use it, it's not ready :-) We plan to release a first version in Gmsh
-  3.1, and something more complete in Gmsh 4.0.
+// This is the embryo of what will become the Gmsh API.
+//
+// Don't use it yet, it's not ready :-) We plan to release a first version in
+// Gmsh 3.1, and something more complete in Gmsh 4.0.
+//
+// Your input is welcome: please contribute your ideas on
+// https://gitlab.onelab.info/gmsh/gmsh/issues/188
+//
+// By design, the API is purely functional, and only uses elementary C++ types
+// from the standard library. This design should not and will not change.
 
-  Your input is welcome: please contribute your ideas on
-  http://gitlab.onelab.info/gmsh/gmsh/issues/188
- */
+// All functions return 0 on successful completion.
 
-#ifndef _GMSH_API_H_
-#define _GMSH_API_H_
+#include <vector>
+#include <string>
 
 #if defined(WIN32)
 #define GMSH_API __declspec(dllexport) int
@@ -23,48 +28,119 @@
 #define GMSH_API int
 #endif
 
-typedef struct gmshEntity{ int dim, tag; };
-typedef struct gmshIntVector{ int n; int *v; };
-typedef struct gmshDoubleVector{ int n; double *v; };
-typedef struct gmshEntityVector{ int n; gmshEntity *v; };
+// Gmsh
+GMSH_API gmshInitialize(int argc, char **argv);
+GMSH_API gmshFinalize();
+GMSH_API gmshOpen(const std::string &fileName);
+GMSH_API gmshMerge(const std::string &fileName);
+GMSH_API gmshExport(const std::string &fileName);
+GMSH_API gmshClear();
+
+// GmshOption
+GMSH_API gmshOptionSetNumber(const std::string &name, double value);
+GMSH_API gmshOptionGetNumber(const std::string &name, double &value);
+GMSH_API gmshOptionSetString(const std::string &name, const std::string &value);
+GMSH_API gmshOptionGetString(const std::string &name, std::string &value);
 
-/* all functions return 0 on successful completion */
+// GmshModel
+GMSH_API gmshModelCreate(const std::string &name);
+GMSH_API gmshModelSetCurrent(const std::string &name);
+GMSH_API gmshModelDestroy();
+GMSH_API gmshModelMesh(int dim);
+GMSH_API gmshModelGetElementaryTags(int dim, std::vector<int> &tags);
+GMSH_API gmshModelGetPhysicalTags(int dim, std::vector<int> &tags);
+GMSH_API gmshModelSetPhysicalGroup(int dim, int tag, const std::vector<int> &tags);
+GMSH_API gmshModelGetPhysicalGroup(int dim, int tag, std::vector<int> &tags);
+GMSH_API gmshModelSetPhysicalName(int dim, int tag, const std::string &name);
+GMSH_API gmshModelGetPhysicalName(int dim, int tag, std::string &name);
+GMSH_API gmshModelGetVertexCoordinates(int tag, double &x, std::vector<double> &coord);
+GMSH_API gmshModelGetMeshVertices(int dim, int tag, std::vector<int> &vertexTags,
+                                  std::vector<double> &coords,
+                                  std::vector<double> &parametricCoords);
+GMSH_API gmshModelGetMeshElements(int dim, int tag, std::vector<int> &types,
+                                  std::vector<std::vector<int> > &elementTags,
+                                  std::vector<std::vector<int> > &vertexTags);
+GMSH_API gmshModelGetBoundaryTags(const std::vector<std::pair<int, int> > &inDimTags,
+                                  std::vector<std::pair<int, int> > &outDimTags,
+                                  bool combined, bool oriented, bool recursive);
+GMSH_API gmshModelSetMeshSize(int dim, int tag, double size);
+GMSH_API gmshModelSetCompoundMesh(int dim, const std::vector<int> &tags);
+GMSH_API gmshModelSetTransfiniteLine(int tag, int nPoints, int type, double coef);
+GMSH_API gmshModelSetTransfiniteSurface(int tag, int arrangement,
+                                        const std::vector<int> &cornerTags);
+GMSH_API gmshModelSetTransfiniteVolume(int tag, const std::vector<int> &cornerTags);
+GMSH_API gmshModelSetRecombine(int dim, int tag, double angle);
+GMSH_API gmshModelSetSmoothing(int tag, int val);
+GMSH_API gmshModelSetReverseMesh(int dim, int tag);
+GMSH_API gmshModelAddEmbeddedVertex(int tag, int inDim, int inTag);
 
-extern "C"
-{
-  /* Gmsh */
-  GMSH_API gmshInitialize(int argc, char **argv);
-  GMSH_API gmshFinalize();
-  GMSH_API gmshOpen(const char *fileName);
-  GMSH_API gmshMerge(const char *fileName);
-  GMSH_API gmshExport(const char *fileName);
-  GMSH_API gmshClear();
+// GmshModelGeo
+GMSH_API gmshModelGeoAddVertex(int &tag, double x, double y, double z, double lc);
+GMSH_API gmshModelGeoAddLine(int &tag, int startTag, int endTag);
+GMSH_API gmshModelGeoAddCircleArc(int &tag, int startTag, int centerTag, int EndTag,
+                                  double nx=0., double ny=0., double nz=0.);
+GMSH_API gmshModelGeoAddEllipseArc(int &tag, int startTag, int centerTag, int majorTag,
+                                   int endTag, double nx=0., double ny=0., double nz=0.);
+GMSH_API gmshModelGeoAddSpline(int &tag, const std::vector<int> &vertexTags);
+GMSH_API gmshModelGeoAddBSpline(int &tag, const std::vector<int> &vertexTags);
+GMSH_API gmshModelGeoAddBezier(int &tag, const std::vector<int> &vertexTags);
+GMSH_API gmshModelGeoAddNurbs(int &tag, const std::vector<int> &vertexTags,
+                              const std::vector<double> &knots);
+GMSH_API gmshModelGeoAddLineLoop(int &tag, const std::vector<int> &edgeTags);
+GMSH_API gmshModelGeoAddPlaneSurface(int &tag, const std::vector<int> &wireTags);
+GMSH_API gmshModelGeoAddDiscreteSurface(int &tag);
+GMSH_API gmshModelGeoAddSurfaceFilling(int &tag, const std::vector<int> &wireTags,
+                                       int sphereCenterTag=-1);
+GMSH_API gmshModelGeoAddSurfaceLoop(int &tag, const std::vector<int> &faceTags);
+GMSH_API gmshModelGeoAddVolume(int &tag, const std::vector<int> &shellTags);
+GMSH_API gmshModelGeoExtrude(const std::vector<std::pair<int, int> > &inDimTags,
+                             double dx, double dy, double dz,
+                             std::vector<std::pair<int, int> > &outDimTags,
+                             const std::vector<int> &numElements,
+                             const std::vector<double> &heights, bool recombine);
+GMSH_API gmshModelGeoRevolve(const std::vector<std::pair<int, int> > &inDimTags,
+                             double x, double y, double z,
+                             double ax, double ay, double az, double angle,
+                             std::vector<std::pair<int, int> > &outDimTags,
+                             const std::vector<int> &numElements,
+                             const std::vector<double> &heights, bool recombine);
+GMSH_API gmshModelGeoTwist(const std::vector<std::pair<int, int> > &inDimTags,
+                           double x, double y, double z,
+                           double dx, double dy, double dz,
+                           double ax, double ay, double az, double angle,
+                           std::vector<std::pair<int, int> > &outDimTags,
+                           const std::vector<int> &numElements,
+                           const std::vector<double> &heights, bool recombine);
+GMSH_API gmshModelGeoTranslate(const std::vector<std::pair<int, int> > &dimTags,
+                               double dx, double dy, double dz);
+GMSH_API gmshModelGeoRotate(const std::vector<std::pair<int, int> > &dimTags,
+                            double x, double y, double z, double ax, double ay, double az,
+                            double angle);
+GMSH_API gmshModelGeoDilate(const std::vector<std::pair<int, int> > &dimTags,
+                            double x, double y, double z,
+                            double a, double b, double c);
+GMSH_API gmshModelGeoSymmetry(const std::vector<std::pair<int, int> > &dimTags,
+                              double a, double b, double c, double d);
+GMSH_API gmshModelGeoCopy(const std::vector<std::pair<int, int> > &inDimTags,
+                          std::vector<std::pair<int, int> > &outDimTags);
+GMSH_API gmshModelGeoRemove(const std::vector<std::pair<int, int> > &dimTags,
+                            bool recursive=false);
+GMSH_API gmshModelGeoRemoveAllDuplicates();
+GMSH_API gmshModelGeoSynchronize();
 
-  /* Gmsh Options */
-  GMSH_API gmshOptionsSetNumber(const char *name, double value);
-  GMSH_API gmshOptionsGetNumber(const char *name, double *value);
+// GmshModelOCC
+GMSH_API gmshModelOCCAddVertex(int &tag, double x, double y, double z, double lc);
+GMSH_API gmshModelOCCAddLine(int &tag, int startVertexTag, int endVertexTag);
+GMSH_API gmshModelOCCExtrude(const std::vector<std::pair<int, int> > &inDimTag,
+                             double dx, double dy, double dz,
+                             std::vector<std::pair<int, int> > &outDimTags);
+GMSH_API gmshModelOCCRemoveAllDuplicates();
+GMSH_API gmshModelOCCSynchronize();
 
-  /* Gmsh Model */
-  GMSH_API gmshModelCreate(const char *name);
-  GMSH_API gmshModelSetCurrent(const char *name);
-  GMSH_API gmshModelDestroy();
-  GMSH_API gmshModelMesh(int dim);
-  GMSH_API gmshModelAddEmbeddedVertex(int tag, int inDim, int inTag);
+// GmshSolver
 
-  /* Gmsh Model Geo Internals */
-  GMSH_API gmshModelGeoAddVertex(int *tag, double x, double y, double z, double lc);
-  GMSH_API gmshModelGeoAddLine(int *tag, int startVertexTag, int endVertexTag);
-  GMSH_API gmshModelGeoAddPolyLine(int *tag, const gmshIntVector *vertexTags);
-  GMSH_API gmshModelGeoExtrude(const gmshEntityVector *in, double dx, double dy,
-                               double dz, gmshEntityVector *out);
-  GMSH_API gmshModelGeoSynchronize();
+// GmshPost
 
-  /* Gmsh Model OCC Internals */
-  GMSH_API gmshModelOCCAddVertex(int *tag, double x, double y, double z, double lc);
-  GMSH_API gmshModelOCCAddLine(int *tag, int startVertexTag, int endVertexTag);
-  GMSH_API gmshModelOCCExtrude(const gmshEntityVector *in, double dx, double dy,
-                               double dz, gmshEntityVector *out);
-  GMSH_API gmshModelOCCSynchronize();
-}
+// GmshPlugin
 
 #endif
diff --git a/Common/GmshMessage.cpp b/Common/GmshMessage.cpp
index 46be74aee5461c5c29edae61b159bfe28e1f6d9f..cf296907cd3e5592f1fcc751d37ebe4c6c74f1b4 100644
--- a/Common/GmshMessage.cpp
+++ b/Common/GmshMessage.cpp
@@ -454,6 +454,7 @@ void Msg::Fatal(const char *fmt, ...)
   va_start(args, fmt);
   vsnprintf(str, sizeof(str), fmt, args);
   va_end(args);
+  int l = strlen(str); if(str[l-1] == '\n') str[l-1] = '\0';
 
   if(_logFile) fprintf(_logFile, "Fatal: %s\n", str);
   if(_callback) (*_callback)("Fatal", str);
@@ -503,6 +504,7 @@ void Msg::Error(const char *fmt, ...)
   va_start(args, fmt);
   vsnprintf(str, sizeof(str), fmt, args);
   va_end(args);
+  int l = strlen(str); if(str[l-1] == '\n') str[l-1] = '\0';
 
   if(_logFile) fprintf(_logFile, "Error: %s\n", str);
   if(_callback) (*_callback)("Error", str);
@@ -544,6 +546,7 @@ void Msg::Warning(const char *fmt, ...)
   va_start(args, fmt);
   vsnprintf(str, sizeof(str), fmt, args);
   va_end(args);
+  int l = strlen(str); if(str[l-1] == '\n') str[l-1] = '\0';
 
   if(_logFile) fprintf(_logFile, "Warning: %s\n", str);
   if(_callback) (*_callback)("Warning", str);
@@ -582,6 +585,7 @@ void Msg::Info(const char *fmt, ...)
   va_start(args, fmt);
   vsnprintf(str, sizeof(str), fmt, args);
   va_end(args);
+  int l = strlen(str); if(str[l-1] == '\n') str[l-1] = '\0';
 
   if(_infoCpu){
     std::string res = PrintResources(false, true, true, true);
@@ -623,6 +627,7 @@ void Msg::Direct(const char *fmt, ...)
   va_start(args, fmt);
   vsnprintf(str, sizeof(str), fmt, args);
   va_end(args);
+  int l = strlen(str); if(str[l-1] == '\n') str[l-1] = '\0';
 
   if(_logFile) fprintf(_logFile, "Direct: %s\n", str);
   if(_callback) (*_callback)("Direct", str);
@@ -659,6 +664,7 @@ void Msg::StatusBar(bool log, const char *fmt, ...)
   va_start(args, fmt);
   vsnprintf(str, sizeof(str), fmt, args);
   va_end(args);
+  int l = strlen(str); if(str[l-1] == '\n') str[l-1] = '\0';
 
   if(_infoCpu){
     std::string res = PrintResources(false, true, true, true);
@@ -699,6 +705,8 @@ void Msg::StatusGl(const char *fmt, ...)
   va_start(args, fmt);
   vsnprintf(str, sizeof(str), fmt, args);
   va_end(args);
+  int l = strlen(str); if(str[l-1] == '\n') str[l-1] = '\0';
+
   if(FlGui::available())
     FlGui::instance()->setStatus(str, true);
 #endif
@@ -722,6 +730,7 @@ void Msg::Debug(const char *fmt, ...)
   va_start(args, fmt);
   vsnprintf(str, sizeof(str), fmt, args);
   va_end(args);
+  int l = strlen(str); if(str[l-1] == '\n') str[l-1] = '\0';
 
   if(_logFile) fprintf(_logFile, "Debug: %s\n", str);
   if(_callback) (*_callback)("Debug", str);
@@ -758,6 +767,8 @@ void Msg::ProgressMeter(int n, int N, bool log, const char *fmt, ...)
     va_start(args, fmt);
     vsnprintf(str, sizeof(str), fmt, args);
     va_end(args);
+    int l = strlen(str); if(str[l-1] == '\n') str[l-1] = '\0';
+
     sprintf(str2, "%3d%%    : %s", _progressMeterCurrent, str);
 
     if(_client) _client->Progress(str2);
diff --git a/Common/GmshRemote.cpp b/Common/GmshRemote.cpp
index f0490d53efe02dd66d3d29b7ad2e45e943562096..daca9f14d005e4d168bfba8f3432c674c3b5f480 100644
--- a/Common/GmshRemote.cpp
+++ b/Common/GmshRemote.cpp
@@ -187,7 +187,7 @@ int GmshRemote()
       // stop if we have no communications for 5 minutes
       int ret = client->Select(300, 0);
       if(!ret){
-        client->Info("Timout: stopping remote Gmsh...");
+        client->Info("Timeout: stopping remote Gmsh...");
         break;
       }
       else if(ret < 0){
diff --git a/Common/Options.cpp b/Common/Options.cpp
index bdbc331eadb41b9cefca3fabb10b30d9fe1496ee..814fcef4ba45dad351b5c66a44ef4fb22ad9bbfa 100644
--- a/Common/Options.cpp
+++ b/Common/Options.cpp
@@ -7,6 +7,7 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include "GmshConfig.h"
+#include "GmshVersion.h"
 #include "GmshDefines.h"
 #include "GmshMessage.h"
 #include "StringUtils.h"
@@ -1121,6 +1122,16 @@ std::string opt_general_background_image_filename(OPT_ARGS_STR)
   return CTX::instance()->bgImageFileName;
 }
 
+std::string opt_general_version(OPT_ARGS_STR)
+{
+  return GMSH_VERSION;
+}
+
+std::string opt_general_build_options(OPT_ARGS_STR)
+{
+  return GMSH_CONFIG_OPTIONS;
+}
+
 std::string opt_general_filename(OPT_ARGS_STR)
 {
   return GModel::current()->getFileName();
@@ -4243,6 +4254,13 @@ double opt_general_light53(OPT_ARGS_NUM)
   return CTX::instance()->lightPosition[5][3];
 }
 
+double opt_general_num_threads(OPT_ARGS_NUM)
+{
+  if(action & GMSH_SET)
+    Msg::SetNumThreads(val);
+  return Msg::GetNumThreads();
+}
+
 double opt_geometry_transform(OPT_ARGS_NUM)
 {
   if(action & GMSH_SET){
@@ -6617,6 +6635,26 @@ double opt_mesh_ignore_periodicity(OPT_ARGS_NUM)
   return CTX::instance()->mesh.ignorePeriodicity;
 }
 
+double opt_mesh_max_num_threads_1d(OPT_ARGS_NUM)
+{
+  if(action & GMSH_SET)
+    CTX::instance()->mesh.maxNumThreads1D = (int) val;
+  return CTX::instance()->mesh.maxNumThreads1D;
+}
+
+double opt_mesh_max_num_threads_2d(OPT_ARGS_NUM)
+{
+  if(action & GMSH_SET)
+    CTX::instance()->mesh.maxNumThreads2D = (int) val;
+  return CTX::instance()->mesh.maxNumThreads2D;
+}
+
+double opt_mesh_max_num_threads_3d(OPT_ARGS_NUM)
+{
+  if(action & GMSH_SET)
+    CTX::instance()->mesh.maxNumThreads3D = (int) val;
+  return CTX::instance()->mesh.maxNumThreads3D;
+}
 
 double opt_solver_listen(OPT_ARGS_NUM)
 {
diff --git a/Common/Options.h b/Common/Options.h
index b02ddaf7829d43f0137b59212b962420194708ec..26a6fd8124de3cf6d9558ad3f614c24dbe66a750 100644
--- a/Common/Options.h
+++ b/Common/Options.h
@@ -35,6 +35,8 @@ std::string opt_general_axes_format1(OPT_ARGS_STR);
 std::string opt_general_axes_format2(OPT_ARGS_STR);
 std::string opt_general_background_image_filename(OPT_ARGS_STR);
 std::string opt_general_display(OPT_ARGS_STR);
+std::string opt_general_version(OPT_ARGS_STR);
+std::string opt_general_build_options(OPT_ARGS_STR);
 std::string opt_general_filename(OPT_ARGS_STR);
 std::string opt_general_executable_filename(OPT_ARGS_STR);
 std::string opt_general_default_filename(OPT_ARGS_STR);
@@ -344,6 +346,7 @@ double opt_general_light50(OPT_ARGS_NUM);
 double opt_general_light51(OPT_ARGS_NUM);
 double opt_general_light52(OPT_ARGS_NUM);
 double opt_general_light53(OPT_ARGS_NUM);
+double opt_general_num_threads(OPT_ARGS_NUM);
 double opt_geometry_transform(OPT_ARGS_NUM);
 double opt_geometry_transform00(OPT_ARGS_NUM);
 double opt_geometry_transform01(OPT_ARGS_NUM);
@@ -551,6 +554,9 @@ double opt_mesh_clip(OPT_ARGS_NUM);
 double opt_mesh_ignore_part_bound(OPT_ARGS_NUM);
 double opt_mesh_ignore_periodicity(OPT_ARGS_NUM);
 double opt_mesh_preserve_numbering_msh2(OPT_ARGS_NUM);
+double opt_mesh_max_num_threads_1d(OPT_ARGS_NUM);
+double opt_mesh_max_num_threads_2d(OPT_ARGS_NUM);
+double opt_mesh_max_num_threads_3d(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/SmoothData.cpp b/Common/SmoothData.cpp
index db53521c061bbabaec3ec623c77a15a936011231..8b8f4eae56fa4d9d79c1b1c25ed1a0bf80343f4c 100644
--- a/Common/SmoothData.cpp
+++ b/Common/SmoothData.cpp
@@ -20,7 +20,7 @@ xyzv::xyzv(const xyzv &other)
   scaleValue = other.scaleValue;  // Added by Trevor Strickler 07/10/2013
   scale_numvals = other.scale_numvals;  // Added by Trevor Strickler 07/10/2013
   nbvals = other.nbvals;
-  nboccurences = other.nboccurences;
+  nboccurrences = other.nboccurrences;
   if(other.vals && other.nbvals) {
     vals = new double[other.nbvals];
     for(int i = 0; i < nbvals; i++)
@@ -39,7 +39,7 @@ xyzv &xyzv::operator = (const xyzv &other)
     scaleValue = other.scaleValue;  // Added by Trevor Strickler 07/10/2013
     scale_numvals = other.scale_numvals;  // Added by Trevor Strickler 07/10/2013
     nbvals = other.nbvals;
-    nboccurences = other.nboccurences;
+    nboccurrences = other.nboccurrences;
     if(other.vals && other.nbvals) {
       vals = new double[other.nbvals];
       for(int i = 0; i < nbvals; i++)
@@ -56,15 +56,15 @@ void xyzv::update(int n, double *v)
     for(int i = 0; i < n; i++)
       vals[i] = 0.0;
     nbvals = n;
-    nboccurences = 0;
+    nboccurrences = 0;
   }
   else if(nbvals != n)
     return; // error
-  double x1 = (double)(nboccurences) / (double)(nboccurences + 1);
-  double x2 = 1. / (double)(nboccurences + 1);
+  double x1 = (double)(nboccurrences) / (double)(nboccurrences + 1);
+  double x2 = 1. / (double)(nboccurrences + 1);
   for(int i = 0; i < nbvals; i++)
     vals[i] = (x1 * vals[i] + x2 * v[i]);
-  nboccurences++;
+  nboccurrences++;
 }
 
 // Added by Trevor Strickler
diff --git a/Common/SmoothData.h b/Common/SmoothData.h
index 7e43fbe46ce3cd66eac4d87fa32786994a37a967..b9a3771461d1a41254baf3c061b1159a29242ae1 100644
--- a/Common/SmoothData.h
+++ b/Common/SmoothData.h
@@ -15,14 +15,14 @@
 struct xyzv {
   double x, y, z, *vals;
   int nbvals;
-  int nboccurences;
+  int nboccurrences;
   // Added by Trevor Strickler for scaling last element layer in quadtri
   // boundary layer to make better quality interfaces
   double scaleValue;
   int scale_numvals;
   static double eps;
   xyzv(double xx, double yy, double zz)
-    : x(xx), y(yy), z(zz), vals(0), nbvals(0), nboccurences(0),
+    : x(xx), y(yy), z(zz), vals(0), nbvals(0), nboccurrences(0),
       scaleValue(1.0), scale_numvals(0) {}
   ~xyzv(){ if(vals) delete [] vals; }
   // these are needed for set<> operations since the default copy constructor
diff --git a/Common/onelab.h b/Common/onelab.h
index be36d29587f9f89f98e80a4ca11acd1304c7409f..2872b4712c679c96fe70fed8c33e6e278c3e8f69 100644
--- a/Common/onelab.h
+++ b/Common/onelab.h
@@ -1400,7 +1400,7 @@ namespace onelab{
         // stop if we have no communications for 5 minutes
         int ret = _gmshClient->Select(500, 0);
         if(!ret){
-          _gmshClient->Info("Timout: aborting remote get");
+          _gmshClient->Info("Timeout: aborting remote get");
           return false;
         }
         else if(ret < 0){
@@ -1454,7 +1454,7 @@ namespace onelab{
       while(_numSubClients > 0){
         int ret = _gmshClient->Select(500, 0);
         if(!ret){
-          _gmshClient->Info("Timout: aborting wait on subclients");
+          _gmshClient->Info("Timeout: aborting wait on subclients");
           return;
         }
         else if(ret < 0){
diff --git a/Geo/CMakeLists.txt b/Geo/CMakeLists.txt
index e8d73035adf0db89d78b9648e7a62cee26ddba3c..2dff8ae7b53c33b1854a6afcbc1985e42f738224 100644
--- a/Geo/CMakeLists.txt
+++ b/Geo/CMakeLists.txt
@@ -23,7 +23,6 @@ set(SRC
   GModel.cpp
   GModelCreateTopologyFromMesh.cpp
     GModelVertexArrays.cpp
-    GModelFactory.cpp
     GModelIO_GEO.cpp GModelIO_ACIS.cpp GModelIO_OCC.cpp GModelIO_TOCHNOG.cpp
       GModelIO_Fourier.cpp
     GModelIO_MSH.cpp GModelIO_MSH2.cpp GModelIO_VTK.cpp GModelIO_POS.cpp
diff --git a/Geo/GEdge.h b/Geo/GEdge.h
index f3992b9be0947e1f878fd677a5f17c65a9542bfb..4538a95d80af0914523a647c87a428ddee9e7eec 100644
--- a/Geo/GEdge.h
+++ b/Geo/GEdge.h
@@ -86,7 +86,7 @@ class GEdge : public GEntity {
   // get the oriented bounding box
   virtual SOrientedBoundingBox getOBB();
 
-  // regions that are boundedby this entity
+  // regions that are bounded by this entity
   virtual std::list<GRegion*> regions() const;
 
   // faces that this entity bounds
diff --git a/Geo/GFaceCompound.cpp b/Geo/GFaceCompound.cpp
index f579999b49107e8e8915eec947b3d27d7372ef37..46170ba73490387b30e98d6d97da57701dfdbae2 100644
--- a/Geo/GFaceCompound.cpp
+++ b/Geo/GFaceCompound.cpp
@@ -464,7 +464,8 @@ void GFaceCompound::printFillTris() const
 
 void GFaceCompound::fillNeumannBCS_Plane() const
 {
-#if defined(HAVE_MESH)
+#if 0
+//#if defined(HAVE_MESH)
 
   Msg::Debug("Meshing %d interior holes with planes ", _interior_loops.size()-1);
 
@@ -893,8 +894,8 @@ bool GFaceCompound::parametrize() const
     }
   }
 
-  fillNeumannBCS_Plane();
-  //fillNeumannBCS();
+  //fillNeumannBCS_Plane();
+  fillNeumannBCS();
 
   // Convex parametrization
   if (_mapping == CONVEX){
diff --git a/Geo/GModel.cpp b/Geo/GModel.cpp
index 144e06aac163f3927932f2b5fbfdd570aa05e1fd..eaf83e780824c6d8935ff8f99897e3fcfb398cab 100644
--- a/Geo/GModel.cpp
+++ b/Geo/GModel.cpp
@@ -12,7 +12,6 @@
 #include "GModel.h"
 #include "GModelIO_GEO.h"
 #include "GModelIO_OCC.h"
-#include "GModelFactory.h"
 #include "GFaceCompound.h"
 #include "GEdgeCompound.h"
 #include "MPoint.h"
@@ -70,7 +69,7 @@ GModel::GModel(std::string name)
     _checkPointedMaxVertexNum(0), _checkPointedMaxElementNum(0),
     _name(name), _visible(1), _octree(0), _geo_internals(0),
     _occ_internals(0), _acis_internals(0), _fm_internals(0),
-    _factory(0), _fields(0), _currentMeshEntity(0),
+    _fields(0), _currentMeshEntity(0),
     normals(0)
 {
   partitionSize[0] = 0; partitionSize[1] = 0;
@@ -86,10 +85,6 @@ GModel::GModel(std::string name)
   // on-demand
   _createGEOInternals();
 
-  // FIXME: GModelFactory is deprecated and will be removed in Gmsh 3.1. You
-  // should use GEO_Internals or OCC_Internals instead.
-  setFactory("Gmsh");
-
 #if defined(HAVE_MESH)
   _fields = new FieldManager();
 #endif
@@ -116,8 +111,6 @@ GModel::~GModel()
 #if defined(HAVE_MESH)
   delete _fields;
 #endif
-  if(_factory)
-    delete _factory;
 }
 
 void GModel::setFileName(std::string fileName)
@@ -155,22 +148,6 @@ int GModel::setCurrent(GModel *m)
   return _current;
 }
 
-void GModel::setFactory(std::string name)
-{
-  if(_factory) delete _factory;
-  if(name == "OpenCASCADE"){
-#if defined(HAVE_OCC)
-    _factory = new OCCFactory();
-#else
-    Msg::Error("Missing OpenCASCADE support: using Gmsh GEO factory instead");
-    _factory = new GeoFactory();
-#endif
-  }
-  else{
-    _factory = new GeoFactory();
-  }
-}
-
 GModel *GModel::findByName(const std::string &name, const std::string &fileName)
 {
   // return last mesh with given name
@@ -191,6 +168,9 @@ void GModel::destroy(bool keepName)
 
   _maxVertexNum = _maxElementNum = 0;
   _checkPointedMaxVertexNum = _checkPointedMaxElementNum = 0;
+  _currentMeshEntity = 0;
+  _lastMeshEntityError.clear();
+  _lastMeshVertexError.clear();
 
   for(riter it = firstRegion(); it != lastRegion(); ++it)
     delete *it;
@@ -260,6 +240,9 @@ void GModel::deleteMesh()
   for(viter it = firstVertex(); it != lastVertex();++it)
     (*it)->deleteMesh();
   destroyMeshCaches();
+  _currentMeshEntity = 0;
+  _lastMeshEntityError.clear();
+  _lastMeshVertexError.clear();
 }
 
 bool GModel::empty() const
@@ -3269,281 +3252,6 @@ GFace* GModel::addCompoundFace(std::vector<GFace*> faces, int param, int split,
 #endif
 }
 
-// FIXME: what follows will be removed in Gmsh 3.1
-static void factoryWarning()
-{
-  static bool warn = true;
-  if(warn){
-    Msg::Warning("GModelFactory is deprecated and will be removed in Gmsh 3.1");
-    warn = false;
-  }
-}
-
-GVertex *GModel::addVertex(double x, double y, double z, double lc)
-{
-  factoryWarning();
-  if(_factory) return _factory->addVertex(this, x, y, z, lc);
-  return 0;
-}
-
-GEdge *GModel::addLine(GVertex *v1, GVertex *v2)
-{
-  factoryWarning();
-  if(_factory) return _factory->addLine(this, v1, v2);
-  return 0;
-}
-
-GEdge *GModel::addCircleArcCenter(double x, double y, double z, GVertex *start,
-                                  GVertex *end)
-{
-  factoryWarning();
-  if(_factory)
-    return _factory->addCircleArc(this, GModelFactory::CENTER_START_END,
-                                  start, end, SPoint3(x, y, z));
-  return 0;
-}
-
-GEdge *GModel::addCircleArcCenter(GVertex *start, GVertex *center, GVertex *end)
-{
-  factoryWarning();
-  if(_factory)
-    return _factory->addCircleArc(this, start, center, end);
-  return 0;
-}
-
-GEdge *GModel::addCircleArc3Points(double x, double y, double z, GVertex *start,
-                                   GVertex *end)
-{
-  factoryWarning();
-  if(_factory)
-    return _factory->addCircleArc(this, GModelFactory::THREE_POINTS,
-                                  start, end, SPoint3(x, y, z));
-  return 0;
-}
-
-GEdge *GModel::addBezier(GVertex *start, GVertex *end,
-                         std::vector<std::vector<double> > points)
-{
-  factoryWarning();
-  if(_factory)
-    return _factory->addSpline(this, GModelFactory::BEZIER, start, end,
-                               points);
-  return 0;
-}
-
-GEdge *GModel::addBSpline(GVertex *start, GVertex *end,
-			  std::vector<std::vector<double> > points)
-{
-  factoryWarning();
-  if(_factory)
-    return _factory->addSpline(this, GModelFactory::BSPLINE, start, end,
-                               points);
-  return 0;
-}
-
-GEdge *GModel::addNURBS(GVertex *start, GVertex *end,
-                        std::vector<std::vector<double> > points,
-                        std::vector<double> knots,
-                        std::vector<double> weights,
-                        std::vector<int> mult)
-{
-  factoryWarning();
-  if(_factory)
-    return _factory->addNURBS(this, start,end,points,knots,weights, mult);
-  return 0;
-}
-
-std::vector<GFace *> GModel::addRuledFaces (std::vector<std::vector<GEdge *> > edges)
-{
-  factoryWarning();
-  std::vector<GFace *> faces;
-  if(_factory)
-    faces = _factory->addRuledFaces(this, edges);
-  return faces;
-}
-
-GFace* GModel::addFace (std::vector<GEdge *> edges,
-                        std::vector< std::vector<double > > points)
-{
-  factoryWarning();
-  if(_factory)
-    return _factory->addFace(this, edges, points);
-  return 0;
-}
-
-GFace* GModel::addPlanarFace (std::vector<std::vector<GEdge *> > edges)
-{
-  factoryWarning();
-  if(_factory)
-    return _factory->addPlanarFace(this, edges);
-  return 0;
-}
-
-GFace* GModel::addPlanarFace (std::vector<std::vector<GEdgeSigned> > edges)
-{
-  factoryWarning();
-  if(_factory)
-    return _factory->addPlanarFace(this, edges);
-  return 0;
-}
-
-GRegion* GModel::addVolume (std::vector<std::vector<GFace *> > faces)
-{
-  factoryWarning();
-  if(_factory)
-    return _factory->addVolume(this, faces);
-  return 0;
-}
-
-GFace *GModel::add2Drect(double x0, double y0, double dx, double dy)
-{
-  factoryWarning();
-  if(_factory)
-    return _factory->add2Drect(this, x0, y0, dx, dy);
-  return 0;
-}
-
-GFace *GModel::add2Dellips(double xc, double yc, double rx, double ry)
-{
-  factoryWarning();
-  if(_factory)
-    return _factory->add2Dellips(this, xc, yc, rx, ry);
-  return 0;
-}
-
-GEntity *GModel::revolve(GEntity *e, std::vector<double> p1, std::vector<double> p2,
-                         double angle)
-{
-  factoryWarning();
-  if(_factory)
-    return _factory->revolve(this, e, p1, p2, angle);
-  return 0;
-}
-
-GEntity *GModel::extrude(GEntity *e, std::vector<double> p1, std::vector<double> p2)
-{
-  factoryWarning();
-  if(_factory)
-    return _factory->extrude(this, e, p1, p2);
-  return 0;
-}
-
-std::vector<GEntity*> GModel::extrudeBoundaryLayer(GEntity *e, int nbLayers,
-                                                   double hLayers, int dir, int view)
-{
-  factoryWarning();
-  if(_factory)
-    return _factory->extrudeBoundaryLayer(this, e, nbLayers,hLayers, dir, view);
-  std::vector<GEntity*> empty;
-  return empty;
-}
-
-GEntity *GModel::addPipe(GEntity *e, std::vector<GEdge *>  edges)
-{
-  factoryWarning();
-  if(_factory)
-    return _factory->addPipe(this,e,edges);
-  return 0;
-}
-
-GEntity *GModel::addThruSections(std::vector<std::vector<GEdge *> > edges)
-{
-  factoryWarning();
-  if(_factory)
-    return _factory->addThruSections(this,edges);
-  return 0;
-}
-
-GEntity *GModel::addSphere(double cx, double cy, double cz, double radius)
-{
-  factoryWarning();
-  if(_factory) return _factory->addSphere(this, cx, cy, cz, radius);
-  return 0;
-}
-
-GEntity *GModel::addCylinder(std::vector<double> p1, std::vector<double> p2,
-                             double radius)
-{
-  factoryWarning();
-  if(_factory) return _factory->addCylinder(this, p1, p2, radius);
-  return 0;
-}
-
-GEntity *GModel::addTorus(std::vector<double> p1, std::vector<double> p2,
-                          double radius1, double radius2)
-{
-  factoryWarning();
-  if(_factory) return _factory->addTorus(this, p1, p2, radius1, radius2);
-  return 0;
-}
-
-GEntity *GModel::addBlock(std::vector<double> p1, std::vector<double> p2)
-{
-  factoryWarning();
-  if(_factory) return _factory->addBlock(this, p1, p2);
-  return 0;
-}
-
-GEntity *GModel::add3DBlock(std::vector<double> p1, double dx, double dy, double dz )
-{
-  factoryWarning();
-  if(_factory) return _factory->add3DBlock(this, p1, dx, dy, dz);
-  return 0;
-}
-
-GEntity *GModel::addCone(std::vector<double> p1, std::vector<double> p2,
-                         double radius1, double radius2)
-{
-  factoryWarning();
-  if(_factory) return _factory->addCone(this, p1, p2,radius1, radius2);
-  return 0;
-}
-
-void GModel::healGeometry(double tolerance)
-{
-  factoryWarning();
-  if(_factory) _factory->healGeometry(this, tolerance);
-}
-
-GModel *GModel::computeBooleanUnion(GModel *tool, int createNewModel)
-{
-  factoryWarning();
-  if(_factory)
-    return _factory->computeBooleanUnion(this, tool, createNewModel);
-  return 0;
-}
-
-GModel *GModel::computeBooleanIntersection(GModel *tool, int createNewModel)
-{
-  factoryWarning();
-  if(_factory)
-    return _factory->computeBooleanIntersection(this, tool, createNewModel);
-  return 0;
-}
-
-GModel *GModel::computeBooleanDifference(GModel *tool, int createNewModel)
-{
-  factoryWarning();
-  if(_factory)
-    return _factory->computeBooleanDifference(this, tool, createNewModel);
-  return 0;
-}
-
-void GModel::setPeriodicAllFaces(std::vector<double> FaceTranslationVector)
-{
-  factoryWarning();
-  if(_factory) _factory->setPeriodicAllFaces(this, FaceTranslationVector);
-}
-
-void GModel::setPeriodicPairOfFaces(int numFaceMaster, std::vector<int> EdgeListMaster,
-                                    int numFaceSlave, std::vector<int> EdgeListSlave)
-{
-  factoryWarning();
-  if(_factory)
-    _factory->setPeriodicPairOfFaces(this, numFaceMaster, EdgeListMaster,
-                                     numFaceSlave, EdgeListSlave);
-}
-
 void GModel::setPhysicalNumToEntitiesInBox(int EntityDimension, int PhysicalNumber,
                                            SBoundingBox3d box)
 {
diff --git a/Geo/GModel.h b/Geo/GModel.h
index 561e855bcf82e8c7e5a4ad6d815da3fad8719c63..d14b5ea8fab51a9afd6aa67f8925bece978fc693 100644
--- a/Geo/GModel.h
+++ b/Geo/GModel.h
@@ -31,12 +31,10 @@ class gLevelset;
 class discreteFace;
 class discreteRegion;
 class MElementOctree;
-class GModelFactory;
 
 // A geometric model. The model is a "not yet" non-manifold B-Rep.
 class GModel {
  private:
-  friend class OCCFactory;
   std::multimap<std::pair<std::vector<int>, std::vector<int> >,
                 std::pair<std::string, std::vector<int> > > _homologyRequests;
   std::set<GRegion*, GEntityLessThan> _chainRegions;
@@ -102,9 +100,6 @@ class GModel {
   void _createFMInternals();
   void _deleteFMInternals();
 
-  // CAD creation factory
-  GModelFactory *_factory;
-
   // characteristic length (mesh size) fields
   FieldManager *_fields;
 
@@ -135,6 +130,10 @@ class GModel {
   // entity that is currently being meshed (used for error reporting)
   GEntity *_currentMeshEntity;
 
+  // last entities/vertices where a meshing error has been reported
+  std::vector<GEntity*> _lastMeshEntityError;
+  std::vector<MVertex*> _lastMeshVertexError;
+
   // index of the current model (in the static list of all loaded
   // models)
   static int _current;
@@ -280,6 +279,9 @@ class GModel {
   void remove(int dim, int tag, bool recursive=false);
   void remove(const std::vector<std::pair<int, int> > &dimTags, bool recursive=false);
 
+  GEdge *addCompoundEdge(std::vector<GEdge*> edges, int num=-1);
+  GFace *addCompoundFace(std::vector<GFace*> faces, int type, int split, int num=-1);
+
   // snap vertices on model edges by using geometry tolerance
   void snapVertices();
 
@@ -410,6 +412,14 @@ class GModel {
   void setCurrentMeshEntity(GEntity *e){ _currentMeshEntity = e; }
   GEntity *getCurrentMeshEntity(){ return _currentMeshEntity; }
 
+  // set/get entities/vertices linked meshing errors
+  void clearLastMeshEntityError(){ _lastMeshEntityError.clear(); }
+  void addLastMeshEntityError(GEntity *e){ _lastMeshEntityError.push_back(e); }
+  std::vector<GEntity*> getLastMeshEntityError(){ return _lastMeshEntityError; }
+  void clearLastMeshVertexError(){ _lastMeshVertexError.clear(); }
+  void addLastMeshVertexError(MVertex *v){ _lastMeshVertexError.push_back(v); }
+  std::vector<MVertex*> getLastMeshVertexError(){ return _lastMeshVertexError; }
+
   // delete all invisble mesh elements
   void removeInvisibleElements();
 
@@ -489,69 +499,6 @@ class GModel {
   // classify a mesh for all faces on the current model
   void classifyAllFaces();
 
-  // glue entities in the model (assume a tolerance eps and merge
-  // vertices that are too close, then merge edges, faces and
-  // regions). Warning: the gluer changes the geometric model, so that
-  // some pointers could become invalid.
-  //  void glue(double eps);
-
-  // change the entity creation factory
-  void setFactory(std::string name);
-
-  // create brep geometry entities using the factory
-  GVertex *addVertex(double x, double y, double z, double lc);
-  GEdge *addLine(GVertex *v1, GVertex *v2);
-  GEdge *addCircleArcCenter(double x, double y, double z, GVertex *start, GVertex *end);
-  GEdge *addCircleArcCenter(GVertex *start, GVertex *center, GVertex *end);
-  GEdge *addCircleArc3Points(double x, double y, double z, GVertex *start, GVertex *end);
-  GEdge *addBezier(GVertex *start, GVertex *end, std::vector<std::vector<double> > points);
-  GEdge *addBSpline(GVertex *start, GVertex *end, std::vector<std::vector<double> > points);
-  GEdge *addNURBS(GVertex *start, GVertex *end,
-		  std::vector<std::vector<double> > points,
-		  std::vector<double> knots,
-		  std::vector<double> weights,
-		  std::vector<int> mult);
-  GEntity *revolve(GEntity *e, std::vector<double> p1, std::vector<double> p2,
-                   double angle);
-  GEntity *extrude(GEntity *e, std::vector<double> p1, std::vector<double> p2);
-  std::vector<GEntity*> extrudeBoundaryLayer(GEntity *e, int nbLayers, double hLayers,
-                                             int dir=1, int view=-1);
-  GEntity *addPipe(GEntity *e, std::vector<GEdge *> edges);
-  GEntity *addThruSections(std::vector<std::vector<GEdge *> > edges);
-
-  std::vector<GFace *> addRuledFaces(std::vector<std::vector<GEdge *> > edges);
-  GFace *addFace(std::vector<GEdge *> edges, std::vector< std::vector<double > > points);
-  GFace *addPlanarFace(std::vector<std::vector<GEdge *> > edges);
-  GFace *addPlanarFace (std::vector<std::vector<GEdgeSigned> > edges);
-  GFace *add2Drect(double x0, double y0, double dx, double dy);
-  GFace *add2Dellips(double xc, double yc, double rx, double ry);
-
-  GEdge *addCompoundEdge(std::vector<GEdge*> edges, int num=-1);
-  GFace *addCompoundFace(std::vector<GFace*> faces, int type, int split, int num=-1);
-  GRegion *addVolume(std::vector<std::vector<GFace*> > faces);
-
-  // create solid geometry primitives using the factory
-  GEntity *addSphere(double cx, double cy, double cz, double radius);
-  GEntity *addCylinder(std::vector<double> p1, std::vector<double> p2, double radius);
-  GEntity *addTorus(std::vector<double> p1, std::vector<double> p2, double radius1,
-                    double radius2);
-  GEntity *addBlock(std::vector<double> p1, std::vector<double> p2);
-  GEntity *add3DBlock(std::vector<double> p1, double dx, double dy , double dz);
-  GEntity *addCone(std::vector<double> p1, std::vector<double> p2, double radius1,
-                   double radius2);
-
-  // heal geometry using the factory
-  void healGeometry(double tolerance = -1);
-
-  // boolean operators acting on 2 models
-  GModel *computeBooleanUnion(GModel *tool, int createNewModel=0);
-  GModel *computeBooleanIntersection(GModel *tool, int createNewModel=0);
-  GModel *computeBooleanDifference(GModel *tool, int createNewModel=0);
-
-  void setPeriodicAllFaces(std::vector<double> FaceTranslationVector);
-  void setPeriodicPairOfFaces(int numFaceMaster, std::vector<int> EdgeListMaster,
-                              int numFaceSlave, std::vector<int> EdgeListSlave);
-
   // build a new GModel by cutting the elements crossed by the levelset ls
   // if cutElem is set to false, split the model without cutting the elements
   GModel *buildCutGModel(gLevelset *ls, bool cutElem=true, bool saveTri=false);
diff --git a/Geo/GModelFactory.cpp b/Geo/GModelFactory.cpp
deleted file mode 100644
index b275f7d03fb32a616adcd51fe1e59ade31d0bd05..0000000000000000000000000000000000000000
--- a/Geo/GModelFactory.cpp
+++ /dev/null
@@ -1,1546 +0,0 @@
-// Gmsh - Copyright (C) 1997-2017 C. Geuzaine, J.-F. Remacle
-//
-// See the LICENSE.txt file for license information. Please report all
-// bugs and problems to the public mailing list <gmsh@onelab.info>.
-
-#include <stdlib.h>
-#include "GModelFactory.h"
-#include "ListUtils.h"
-#include "Context.h"
-#include "GVertex.h"
-#include "gmshVertex.h"
-#include "gmshEdge.h"
-#include "gmshFace.h"
-#include "gmshRegion.h"
-#include "GEdgeCompound.h"
-#include "MLine.h"
-#include "GModel.h"
-#include "Numeric.h"
-#include "ExtrudeParams.h"
-#include "GModelIO_GEO.h"
-#include "Geo.h"
-#include "Parser.h"
-#include "GmshDefines.h"
-
-GVertex *GeoFactory::addVertex(GModel *gm, double x, double y, double z, double lc)
-{
-  int num =  gm->getMaxElementaryNumber(0) + 1;
-
-  x *= CTX::instance()->geom.scalingFactor;
-  y *= CTX::instance()->geom.scalingFactor;
-  z *= CTX::instance()->geom.scalingFactor;
-  lc *= CTX::instance()->geom.scalingFactor;
-  if(lc == 0.) lc = MAX_LC; // no mesh size given at the point
-  Vertex *p;
-  p = CreateVertex(num, x, y, z, lc, 1.0);
-  Tree_Add(gm->getGEOInternals()->Points, &p);
-  p->Typ = MSH_POINT;
-  p->Num = num;
-
-  GVertex *v = new gmshVertex(gm, p);
-  gm->add(v);
-
-  return v;
-}
-
-GEdge *GeoFactory::addLine(GModel *gm, GVertex *start, GVertex *end)
-{
-  int num =  gm->getMaxElementaryNumber(1) + 1;
-  List_T *iList = List_Create(2, 2, sizeof(int));
-  int tagBeg = start->tag();
-  int tagEnd = end->tag();
-  List_Add(iList, &tagBeg);
-  List_Add(iList, &tagEnd);
-
-  Curve *c = CreateCurve(num, MSH_SEGM_LINE, 1, iList, NULL,
-        -1, -1, 0., 1.);
-  Tree_Add(gm->getGEOInternals()->Curves, &c);
-  CreateReversedCurve(c);
-  List_Delete(iList);
-  c->Typ = MSH_SEGM_LINE;
-  c->Num = num;
-
-  GEdge *e = new gmshEdge(gm, c, start, end);
-  gm->add(e);
-
-  return e;
-}
-
-GFace *GeoFactory::addPlanarFace(GModel *gm, std::vector< std::vector<GEdge *> > edges)
-{
-  std::vector<std::vector<GEdgeSigned> > orientedEdges;
-  orientedEdges.reserve(edges.size());
-  for (size_t i=0; i< edges.size(); i++){
-    std::vector<GEdge *> loop = edges[i];
-    orientedEdges.push_back(std::vector<GEdgeSigned>());
-    std::vector<GEdgeSigned> &orientedLoop = orientedEdges.back();
-    orientedLoop.reserve(loop.size());
-    for (size_t j=0; j< loop.size(); j++){
-      GEdge *edge = loop[j];
-      orientedLoop.push_back(GEdgeSigned(1, edge));
-    }
-  }
-
-  return _addPlanarFace(gm, orientedEdges, true);
-}
-
-GFace *GeoFactory::addPlanarFace(GModel *gm, const std::vector<std::vector<GEdgeSigned> > &edges)
-{
-  return _addPlanarFace(gm, edges, false);
-}
-
-GRegion* GeoFactory::addVolume (GModel *gm, std::vector<std::vector<GFace *> > faces)
-{
-  //create surface loop
-  int nLoops = faces.size();
-  std::vector<SurfaceLoop *> vecLoops;
-  for (int i=0; i< nLoops; i++){
-    int nl=(int)faces[i].size();
-    List_T *temp = List_Create(nl, nl, sizeof(int));
-    for(int j = 0; j < nl; j++){
-      int numFace = faces[i][j]->tag();
-      List_Add(temp, &numFace);
-    }
-    int numfl = gm->getMaxElementaryNumber(2) + 1;
-    while (FindSurfaceLoop(numfl)){
-      numfl++;
-      if (!FindSurfaceLoop(numfl)) break;
-    }
-    SurfaceLoop *l = CreateSurfaceLoop(numfl, temp);
-    vecLoops.push_back(l);
-    Tree_Add(gm->getGEOInternals()->SurfaceLoops, &l);
-    List_Delete(temp);
-  }
-
-  //create volume
-  int numv = gm->getMaxElementaryNumber(3) + 1;
-  Volume *v = CreateVolume(numv, MSH_VOLUME);
-  List_T *temp = List_Create(nLoops, nLoops, sizeof(int));
-  for (unsigned int i = 0; i < vecLoops.size(); i++){
-    int numl = vecLoops[i]->Num;
-    List_Add(temp, &numl);
-  }
-  SetVolumeSurfaces(v, temp);
-  List_Delete(temp);
-  Tree_Add(gm->getGEOInternals()->Volumes, &v);
-  v->Typ = MSH_VOLUME;
-  v->Num = numv;
-  v->Recombine3D = 0;
-
-  //gmsh volume
-  GRegion *gr = new gmshRegion(gm,v);
-  gm->add(gr);
-
-  return gr;
-}
-
-GEdge* GeoFactory::addCircleArc(GModel *gm,GVertex *begin, GVertex *center, GVertex *end)
-{
-  int num =  gm->getMaxElementaryNumber(1) + 1;
-  List_T *iList = List_Create(2, 2, sizeof(int));
-  int tagBeg = begin->tag();
-  int tagMiddle = center->tag();
-  int tagEnd = end->tag();
-  List_Add(iList, &tagBeg);
-  List_Add(iList, &tagMiddle);
-  List_Add(iList, &tagEnd);
-
-  Curve *c = CreateCurve(num, MSH_SEGM_CIRC, 1, iList, NULL,
-        -1, -1, 0., 1.);
-  Tree_Add(gm->getGEOInternals()->Curves, &c);
-  CreateReversedCurve(c);
-  List_Delete(iList);
-  c->Typ = MSH_SEGM_CIRC;
-  c->Num = num;
-
-  GEdge *e = new gmshEdge(gm, c, begin, end);
-  gm->add(e);
-
-  return e;
-}
-
-std::vector<GFace *> GeoFactory::addRuledFaces(GModel *gm,
-                                               std::vector<std::vector<GEdge *> > edges)
-{
-  //create line loops
-  std::vector<EdgeLoop *> vecLoops;
-  int nLoops = edges.size();
-  for (int i=0; i< nLoops; i++){
-    int numl = gm->getMaxElementaryNumber(1) + i;
-    while (FindEdgeLoop(numl)){
-      numl++;
-      if (!FindEdgeLoop(numl)) break;
-    }
-    int nl=(int)edges[i].size();
-    List_T *temp = List_Create(nl, nl, sizeof(int));
-    for(int j = 0; j < nl; j++){
-      int numEdge = edges[i][j]->tag();
-      List_Add(temp, &numEdge);
-    }
-    SortEdgesInLoop(numl, temp);
-    EdgeLoop *l = CreateEdgeLoop(numl, temp);
-    vecLoops.push_back(l);
-    Tree_Add(gm->getGEOInternals()->EdgeLoops, &l);
-    l->Num = numl;
-    List_Delete(temp);
-  }
-
-  //create plane surfaces
-  int numf = gm->getMaxElementaryNumber(2) + 1;
-  Surface *s = CreateSurface(numf, MSH_SURF_TRIC);
-  List_T *iList = List_Create(nLoops, nLoops, sizeof(int));
-  for (unsigned int i=0; i< vecLoops.size(); i++){
-    int numl = vecLoops[i]->Num;
-    List_Add(iList, &numl);
-  }
-  SetSurfaceGeneratrices(s, iList);
-  EndSurface(s);
-  Tree_Add(gm->getGEOInternals()->Surfaces, &s);
-  s->Typ= MSH_SURF_TRIC;
-  s->Num = numf;
-  List_Delete(iList);
-
-  //gmsh surface
-  GFace *gf = new gmshFace(gm,s);
-  gm->add(gf);
-
-  std::vector<GFace*> faces;
-  faces.push_back(gf);
-
-  return faces;
-}
-
-std::vector<GEntity*> GeoFactory::extrudeBoundaryLayer(GModel *gm, GEntity *e,
-                                                       int nbLayers, double hLayer,
-                                                       int dir, int view)
-{
-
-  ExtrudeParams *ep = new  ExtrudeParams;
-  ep->mesh.BoundaryLayerIndex = dir;
-  ep->mesh.ViewIndex = view; //view -5 for centerline based extrude
-  ep->mesh.NbLayer = 1; //this may be more general for defining different layers
-  ep->mesh.hLayer.clear();
-  ep->mesh.hLayer.push_back(hLayer);
-  ep->mesh.NbElmLayer.clear();
-  ep->mesh.NbElmLayer.push_back(nbLayers);
-  ep->mesh.ExtrudeMesh = true;
-  if (CTX::instance()->mesh.recombineAll){
-    ep->mesh.Recombine = true;
-    //ep->mesh.QuadToTri = QUADTRI_DBL_1 ; //QUADTRI_SNGL_1_RECOMB; //QUADTRI_SNGL_1;
-  }
-  else ep->mesh.Recombine = false;
-  ep->geo.Source = e->tag();
-
-  int type  = BOUNDARY_LAYER;
-  double T0=0., T1=0., T2=0.;
-  double A0=0., A1=0., A2=0.;
-  double X0=0., X1=0., X2=0.,alpha=0.;
-
-  std::vector<GEntity*> extrudedEntities;
-
-  //extrude shape dans geo.cpp
-  Shape shape;
-  if(e->dim() == 0){
-    Vertex *v = FindPoint(e->tag());
-    if(!v) printf("vertex %d not found \n", e->tag());
-    shape.Num = v->Num;
-    shape.Type = v->Typ;
-  }
-  else if (e->dim() == 1){
-    ((GEdge*)e)->meshAttributes.extrude = ep;
-    Curve *c = FindCurve(e->tag());
-    if(!c) printf("curve %d not found \n", e->tag());
-     shape.Num = c->Num;
-     shape.Type = c->Typ;
-  }
-  else if (e->dim() == 2){
-    ((GFace*)e)->meshAttributes.extrude = ep;
-    Surface *s = FindSurface(e->tag());
-    if(!s) {
-      Msg::Error("Surface %d not found", e->tag());
-      return extrudedEntities;
-    }
-    shape.Num = s->Num;
-    shape.Type = s->Typ;
-  }
-
-  //extrude shape
-  List_T *list_out= List_Create(2, 1, sizeof(Shape));
-  List_T *tmp = List_Create(1, 1, sizeof(Shape));
-  List_Add(tmp, &shape);
-  ExtrudeShapes(type, tmp,
-                T0, T1, T2,
-                A0, A1, A2,
-                X0, X1, X2, alpha,
-                ep,
-                list_out);
-
-  //create GEntities
-  gm->getGEOInternals()->synchronize(gm);
-
-  //return the new created entity
-  int nbout = List_Nbr(list_out);
-  if(e->dim()==1){
-    Shape e;
-    Shape s;
-    List_Read(list_out, 0, &e);
-    List_Read(list_out, 1, &s);
-    GEdge *ge = gm->getEdgeByTag(e.Num);
-    GFace *gf = gm->getFaceByTag(s.Num);
-    extrudedEntities.push_back((GEntity*)ge);
-    extrudedEntities.push_back((GEntity*)gf);
-    for (int j=2; j<nbout; j++){
-      Shape el;
-      List_Read(list_out, j, &el);
-      GEdge *gel = gm->getEdgeByTag(el.Num);
-      extrudedEntities.push_back((GEntity*)gel);
-    }
-  }
-  else if(e->dim()==2){
-    Shape s;
-    Shape v;
-    List_Read(list_out, 0, &s);
-    List_Read(list_out, 1, &v);
-    GFace *gf = gm->getFaceByTag(s.Num);
-    GRegion *gr = gm->getRegionByTag(v.Num);
-    extrudedEntities.push_back((GEntity*)gf);
-    extrudedEntities.push_back((GEntity*)gr);
-    for (int j=2; j<nbout; j++){
-      Shape sl;
-      List_Read(list_out, j, &sl);
-      GFace *gfl = gm->getFaceByTag(sl.Num);
-      extrudedEntities.push_back((GEntity*)gfl);
-    }
-  }
-
-  List_Delete(list_out);
-  List_Delete(tmp);
-
-  return extrudedEntities;
-
-  // //return the new created entity
-  // GEntity *newEnt=0;
-  // if (e->dim() == 1){
-  //  for(GModel::eiter it = gm->firstEdge(); it != gm->lastEdge(); it++){
-  //    GEdge *ge = *it;
-  //   if(ge->getNativeType() == GEntity::GmshModel &&
-  //      ge->geomType() == GEntity::BoundaryLayerCurve){
-  //     ExtrudeParams *ep = ge->meshAttributes.extrude;
-  //     if(ep && ep->mesh.ExtrudeMesh && ep->geo.Mode == COPIED_ENTITY &&
-  //  std::abs(ep->geo.Source) ==e->tag() )
-  //    newEnt = ge;
-  //     }
-  //   }
-  // }
-  // else if (e->dim() ==2){
-  //   for(GModel::fiter it = gm->firstFace(); it != gm->lastFace(); it++){
-  //     GFace *gf = *it;
-  //     if(gf->getNativeType() == GEntity::GmshModel &&
-  //   gf->geomType() == GEntity::BoundaryLayerSurface){
-  //  ExtrudeParams *ep = gf->meshAttributes.extrude;
-  //  if(ep && ep->mesh.ExtrudeMesh && ep->geo.Mode == COPIED_ENTITY
-  //     && std::abs(ep->geo.Source) == e->tag())
-  //    newEnt = gf;
-  //     }
-  //   }
-  // }
-
-  // return newEnt;
-
-};
-
-void GeoFactory::healGeometry(GModel *gm, double tolerance)
-{
-  GModel *current = GModel::current();
-  GModel::setCurrent(gm);
-  ReplaceAllDuplicatesNew(tolerance);
-  gm->destroy();
-  gm->getGEOInternals()->synchronize(gm);
-  GModel::setCurrent(current);
-}
-
-GFace *GeoFactory::_addPlanarFace(GModel *gm, const std::vector<std::vector<GEdgeSigned> > &edges, bool orientEdges)
-{
-
-  //create line loops
-  int nLoops = edges.size();
-  std::vector<EdgeLoop *> vecLoops;
-  for (int i=0; i< nLoops; i++){
-    int ne=(int)edges[i].size();
-    List_T *temp = List_Create(ne, ne, sizeof(int));
-    for(int j = 0; j < ne; j++){
-      const GEdgeSigned &signedEdge = edges[i][j];
-      GEdge *ge = signedEdge.ge;
-      int numEdge = ge->tag();
-      //create curve if it does not exist
-      Curve *c = FindCurve(numEdge);
-      if(!c){
-  GVertex *gvb = ge->getBeginVertex();
-  GVertex *gve = ge->getEndVertex();
-  Vertex *vertb = FindPoint(abs(gvb->tag()));
-  Vertex *verte = FindPoint(abs(gve->tag()));
-  if (!vertb){
-    vertb = CreateVertex(gvb->tag(), gvb->x(), gvb->y(), gvb->z(),
-        gvb->prescribedMeshSizeAtVertex(), 1.0);
-    Tree_Add(gm->getGEOInternals()->Points, &vertb);
-    vertb->Typ = MSH_POINT;
-    vertb->Num = gvb->tag();
-   }
-  if (!verte){
-    verte = CreateVertex(gve->tag(), gve->x(), gve->y(), gve->z(),
-        gve->prescribedMeshSizeAtVertex(), 1.0);
-    Tree_Add(gm->getGEOInternals()->Points, &verte);
-    verte->Typ = MSH_POINT;
-    verte->Num = gve->tag();
-  }
-
-  if (ge->geomType() == GEntity::Line){
-    c = CreateCurve(numEdge, MSH_SEGM_LINE, 1, NULL, NULL, -1, -1, 0., 1.);
-  }
-  else if (ge->geomType() == GEntity::DiscreteCurve){
-    c = CreateCurve(numEdge, MSH_SEGM_DISCRETE, 1, NULL, NULL, -1, -1, 0., 1.);
-  }
-  else if(ge->geomType() == GEntity::CompoundCurve){
-    c = CreateCurve(numEdge, MSH_SEGM_COMPOUND, 1, NULL, NULL, -1, -1, 0., 1.);
-    std::vector<GEdge*> gec = ((GEdgeCompound*)ge)->getCompounds();
-    for(unsigned int i = 0; i < gec.size(); i++)
-      c->compound.push_back(gec[i]->tag());
-  }
-  else{
-    c = CreateCurve(numEdge, MSH_SEGM_DISCRETE, 1, NULL, NULL, -1, -1, 0., 1.);
-  }
-
-  c->Control_Points = List_Create(2, 1, sizeof(Vertex *));
-  List_Add(c->Control_Points, &vertb);
-  List_Add(c->Control_Points, &verte);
-  c->beg = vertb;
-  c->end = verte;
-  EndCurve(c);
-
-  Tree_Add(gm->getGEOInternals()->Curves, &c);
-  CreateReversedCurve(c);
-      }
-      int signedNumEdge = numEdge*signedEdge.getSign();
-      List_Add(temp, &signedNumEdge);
-    }
-
-    int numl = gm->getMaxElementaryNumber(1) + i;
-    while (FindEdgeLoop(numl)){
-      numl++;
-      if (!FindEdgeLoop(numl)) break;
-    }
-    SortEdgesInLoop(numl, temp, orientEdges);
-    EdgeLoop *l = CreateEdgeLoop(numl, temp);
-    vecLoops.push_back(l);
-    Tree_Add(gm->getGEOInternals()->EdgeLoops, &l);
-    l->Num = numl;
-    List_Delete(temp);
-  }
-
-  //create surface
-  int numf  = gm->getMaxElementaryNumber(2)+1;
-  Surface *s = CreateSurface(numf, MSH_SURF_PLAN);
-  List_T *temp = List_Create(nLoops, nLoops, sizeof(int));
-  for (int i = 0; i < nLoops; i++){
-    int numl = vecLoops[i]->Num;
-    List_Add(temp, &numl);
-  }
-
-  SetSurfaceGeneratrices(s, temp);
-  List_Delete(temp);
-  EndSurface(s);
-  Tree_Add(gm->getGEOInternals()->Surfaces, &s);
-
-  //gmsh surface
-  GFace *gf = new gmshFace(gm,s);
-  gm->add(gf);
-
-  return gf;
-}
-
-#if defined(HAVE_OCC)
-#include "GModelIO_OCC.h"
-#include "OCCVertex.h"
-#include "OCCEdge.h"
-#include "OCCFace.h"
-#include "OCCRegion.h"
-
-#include <BRepAdaptor_Curve.hxx>
-#include <BRepAdaptor_Surface.hxx>
-#include <BRepAlgoAPI_Common.hxx>
-#include <BRepAlgoAPI_Cut.hxx>
-#include <BRepAlgoAPI_Fuse.hxx>
-#include <BRepAlgoAPI_Section.hxx>
-#include <BRepBndLib.hxx>
-#include <BRepBuilderAPI_MakeEdge.hxx>
-#include <BRepBuilderAPI_MakeFace.hxx>
-#include <BRepBuilderAPI_MakeShell.hxx>
-#include <BRepBuilderAPI_MakeSolid.hxx>
-#include <BRepBuilderAPI_MakeVertex.hxx>
-#include <BRepBuilderAPI_MakeWire.hxx>
-#include <BRepBuilderAPI_Transform.hxx>
-#include <BRepBuilderAPI_GTransform.hxx>
-#include <BRepCheck_Analyzer.hxx>
-#include <BRepFilletAPI_MakeFillet.hxx>
-#include <BRepGProp.hxx>
-#include <BRepLProp_SLProps.hxx>
-#include <BRepLib.hxx>
-#include <BRepMesh.hxx>
-#include <BRepMesh_IncrementalMesh.hxx>
-#include <BRepOffsetAPI_MakeFilling.hxx>
-#include <BRepOffsetAPI_MakePipe.hxx>
-#include <BRepOffsetAPI_Sewing.hxx>
-#include <BRepOffsetAPI_ThruSections.hxx>
-#include <BRepPrimAPI_MakeBox.hxx>
-#include <BRepPrimAPI_MakeCone.hxx>
-#include <BRepPrimAPI_MakeCylinder.hxx>
-#include <BRepPrimAPI_MakePrism.hxx>
-#include <BRepPrimAPI_MakeRevol.hxx>
-#include <BRepPrimAPI_MakeSphere.hxx>
-#include <BRepPrimAPI_MakeTorus.hxx>
-#include <BRepTools.hxx>
-#include <BRepTools_WireExplorer.hxx>
-#include <BRep_Builder.hxx>
-#include <BRep_Tool.hxx>
-#include <Bnd_Box.hxx>
-#include <ElCLib.hxx>
-#include <GC_MakeArcOfCircle.hxx>
-#include <GProp_GProps.hxx>
-#include <Geom2d_Curve.hxx>
-#include <GeomAPI_ExtremaCurveCurve.hxx>
-#include <GeomAPI_PointsToBSpline.hxx>
-#include <GeomAPI_ProjectPointOnCurve.hxx>
-#include <GeomAPI_ProjectPointOnSurf.hxx>
-#include <GeomLProp_SLProps.hxx>
-#include <Geom_BSplineCurve.hxx>
-#include <Geom_BezierCurve.hxx>
-#include <Geom_Circle.hxx>
-#include <Geom_Curve.hxx>
-#include <Geom_Surface.hxx>
-#include <Geom_TrimmedCurve.hxx>
-#include <IGESControl_Reader.hxx>
-#include <IGESControl_Writer.hxx>
-#include <IGESToBRep_Reader.hxx>
-#include <Interface_Static.hxx>
-#include <Poly_Array1OfTriangle.hxx>
-#include <Poly_Triangle.hxx>
-#include <Poly_Triangulation.hxx>
-#include <Precision.hxx>
-#include <STEPControl_Reader.hxx>
-#include <STEPControl_StepModelType.hxx>
-#include <STEPControl_Writer.hxx>
-#include <ShapeAnalysis.hxx>
-#include <ShapeAnalysis_CheckSmallFace.hxx>
-#include <ShapeAnalysis_DataMapOfShapeListOfReal.hxx>
-#include <ShapeAnalysis_ShapeContents.hxx>
-#include <ShapeAnalysis_ShapeTolerance.hxx>
-#include <ShapeBuild_ReShape.hxx>
-#include <ShapeFix.hxx>
-#include <ShapeFix_FixSmallFace.hxx>
-#include <ShapeFix_Shape.hxx>
-#include <ShapeFix_Wireframe.hxx>
-#include <ShapeUpgrade_ShellSewing.hxx>
-#include <Standard_ErrorHandler.hxx>
-#include <Standard_Failure.hxx>
-#include <Standard_Version.hxx>
-#include <StlAPI_Writer.hxx>
-#include <TColStd_HArray1OfInteger.hxx>
-#include <TColStd_HArray1OfReal.hxx>
-#include <TColgp_Array1OfPnt2d.hxx>
-#include <TColgp_HArray1OfPnt.hxx>
-#include <TopExp.hxx>
-#include <TopExp_Explorer.hxx>
-#include <TopTools_DataMapOfIntegerShape.hxx>
-#include <TopTools_DataMapOfShapeInteger.hxx>
-#include <TopTools_IndexedMapOfShape.hxx>
-#include <TopTools_ListIteratorOfListOfShape.hxx>
-#include <TopTools_ListOfShape.hxx>
-#include <TopoDS.hxx>
-#include <TopoDS_Compound.hxx>
-#include <TopoDS_Edge.hxx>
-#include <TopoDS_Face.hxx>
-#include <TopoDS_Iterator.hxx>
-#include <TopoDS_Shape.hxx>
-#include <TopoDS_Solid.hxx>
-#include <TopoDS_Wire.hxx>
-#include <gce_MakeCirc.hxx>
-#include <gce_MakePln.hxx>
-#include <gp.hxx>
-#include <gp_Ax1.hxx>
-#include <gp_Ax2.hxx>
-#include <gp_Ax2d.hxx>
-#include <gp_Dir.hxx>
-#include <gp_Dir2d.hxx>
-#include <gp_Pnt.hxx>
-#include <gp_Pnt2d.hxx>
-#include <gp_Trsf.hxx>
-#include <gp_GTrsf.hxx>
-#include <gp_Vec.hxx>
-
-GVertex *OCCFactory::addVertex(GModel *gm, double x, double y, double z, double lc)
-{
-  if (!gm->_occ_internals)
-    gm->_occ_internals = new OCC_Internals;
-
-  gp_Pnt aPnt;
-  aPnt = gp_Pnt(x, y, z);
-  BRepBuilderAPI_MakeVertex mkVertex(aPnt);
-  TopoDS_Vertex occv = mkVertex.Vertex();
-
-  GVertex *vertex = gm->_occ_internals->addVertexToModel(gm, occv);
-
-  lc *= CTX::instance()->geom.scalingFactor;
-  if(lc == 0.) lc = MAX_LC; // no mesh size given at the point
-  vertex->setPrescribedMeshSizeAtVertex(lc);
-
-  return vertex;
-}
-
-GEdge *OCCFactory::addLine(GModel *gm, GVertex *start, GVertex *end)
-{
-  if (!gm->_occ_internals)
-    gm->_occ_internals = new OCC_Internals;
-
-  OCCVertex *occv1 = dynamic_cast<OCCVertex*>(start);
-  OCCVertex *occv2 = dynamic_cast<OCCVertex*>(end);
-  TopoDS_Edge occEdge;
-  if (occv1 && occv2){
-     occEdge = BRepBuilderAPI_MakeEdge(occv1->getShape(),
-               occv2->getShape()).Edge();
-  }
-  else{
-    gp_Pnt p1(start->x(),start->y(),start->z());
-    gp_Pnt p2(end->x(),end->y(),end->z());
-    occEdge = BRepBuilderAPI_MakeEdge(p1, p2).Edge();
-  }
-  return gm->_occ_internals->addEdgeToModel(gm,occEdge);
-}
-
-GEdge *OCCFactory::addCircleArc(GModel *gm, const arcCreationMethod &method,
-                                GVertex *start, GVertex *end,
-                                const SPoint3 &aPoint)
-{
-  if (!gm->_occ_internals)
-    gm->_occ_internals = new OCC_Internals;
-
-  gp_Pnt aP1(start->x(), start->y(), start->z());
-  gp_Pnt aP2(aPoint.x(), aPoint.y(), aPoint.z());
-  gp_Pnt aP3(end->x(), end->y(), end->z());
-  TopoDS_Edge occEdge;
-
-  OCCVertex *occv1 = dynamic_cast<OCCVertex*>(start);
-  OCCVertex *occv2 = dynamic_cast<OCCVertex*>(end);
-
-  if (method == GModelFactory::THREE_POINTS){
-    GC_MakeArcOfCircle arc(aP1, aP2, aP3);
-    if (occv1 && occv2)
-      occEdge = BRepBuilderAPI_MakeEdge(arc.Value(),occv1->getShape(),
-                                        occv2->getShape()).Edge();
-    else
-      occEdge = BRepBuilderAPI_MakeEdge(arc.Value()).Edge();
-  }
-  else if (method == GModelFactory::CENTER_START_END){
-    Standard_Real Radius = aP1.Distance(aP2);
-    gce_MakeCirc MC(aP2,gce_MakePln(aP1, aP2, aP3).Value(), Radius);
-    const gp_Circ& Circ = MC.Value();
-    Standard_Real Alpha1 = ElCLib::Parameter(Circ, aP1);
-    Standard_Real Alpha2 = ElCLib::Parameter(Circ, aP3);
-    Handle(Geom_Circle) C = new Geom_Circle(Circ);
-    Handle(Geom_TrimmedCurve) arc = new Geom_TrimmedCurve(C, Alpha1, Alpha2, false);
-    if (occv1 && occv2)
-      occEdge = BRepBuilderAPI_MakeEdge(arc, occv1->getShape(),
-                                        occv2->getShape()).Edge();
-    else
-      occEdge = BRepBuilderAPI_MakeEdge(arc).Edge();
-  }
-  return gm->_occ_internals->addEdgeToModel(gm,occEdge);
-}
-
-GEdge *OCCFactory::addSpline(GModel *gm, const splineType &type,
-                             GVertex *start, GVertex *end,
-           std::vector<std::vector<double> > points)
-{
-  if (!gm->_occ_internals)
-    gm->_occ_internals = new OCC_Internals;
-
-  TopoDS_Edge occEdge;
-
-  OCCVertex *occv1 = dynamic_cast<OCCVertex*>(start);
-  OCCVertex *occv2 = dynamic_cast<OCCVertex*>(end);
-
-  int nbControlPoints = points.size();
-  TColgp_Array1OfPnt ctrlPoints(1, nbControlPoints + 2);
-  int index = 1;
-  ctrlPoints.SetValue(index++, gp_Pnt(start->x(), start->y(), start->z()));
-
-  //  printf("%d %d %d %d\n",points.size(),points[0].size(),points[1].size(),points[2].size());
-  for (int i = 0; i < nbControlPoints; i++) {
-    //    printf("%g %g %g\n",points[i][0],points[i][1],points[i][2]);
-    gp_Pnt aP(points[i][0],points[i][1],points[i][2]);
-    ctrlPoints.SetValue(index++, aP);
-  }
-  ctrlPoints.SetValue(index++, gp_Pnt(end->x(), end->y(), end->z()));
-  if (type == BEZIER) {
-    if (nbControlPoints >= 20)Msg::Fatal("OCC Bezier Curves have a maximum degree of 20");
-    Handle(Geom_BezierCurve) Bez = new Geom_BezierCurve(ctrlPoints);
-    if (occv1 && occv2)
-      occEdge = BRepBuilderAPI_MakeEdge(Bez,occv1->getShape(),occv2->getShape()).Edge();
-    else
-      occEdge = BRepBuilderAPI_MakeEdge(Bez).Edge();
-  }
-  else if (type == BSPLINE) {
-
-    Handle(Geom_BSplineCurve) Bez = GeomAPI_PointsToBSpline(ctrlPoints).Curve();
-
-    if (occv1 && occv2)
-      occEdge = BRepBuilderAPI_MakeEdge(Bez,occv1->getShape(),occv2->getShape()).Edge();
-    else
-      occEdge = BRepBuilderAPI_MakeEdge(Bez).Edge();
-  }
-
-
-  return gm->_occ_internals->addEdgeToModel(gm, occEdge);
-}
-
-
-GEdge *OCCFactory::addNURBS(GModel *gm, GVertex *start, GVertex *end,
-          std::vector<std::vector<double> > points,
-          std::vector<double> knots,
-          std::vector<double> weights,
-          std::vector<int> mult)
-{
-  try{
-  if (!gm->_occ_internals)
-    gm->_occ_internals = new OCC_Internals;
-
-  OCCVertex *occv1 = dynamic_cast<OCCVertex*>(start);
-  OCCVertex *occv2 = dynamic_cast<OCCVertex*>(end);
-
-  int nbControlPoints = points.size() + 2;
-  TColgp_Array1OfPnt  ctrlPoints(1, nbControlPoints);
-
-  TColStd_Array1OfReal _knots(1, knots.size());
-  TColStd_Array1OfReal _weights(1, weights.size());
-  TColStd_Array1OfInteger  _mult(1, mult.size());
-
-  for (unsigned i = 0; i < knots.size(); i++) {
-    _knots.SetValue(i+1, knots[i]);
-  }
-  for (unsigned i = 0; i < weights.size(); i++) {
-    _weights.SetValue(i+1, weights[i]);
-  }
-  int totKnots = 0;
-  for (unsigned i = 0; i < mult.size(); i++) {
-    _mult.SetValue(i+1, mult[i]);
-    totKnots += mult[i];
-  }
-
-  const int degree = totKnots - nbControlPoints - 1;
-  Msg::Debug("creation of a nurbs of degree %d with %d control points",
-       degree,nbControlPoints);
-
-  int index = 1;
-  ctrlPoints.SetValue(index++, gp_Pnt(start->x(), start->y(), start->z()));
-  for (unsigned i = 0; i < points.size(); i++) {
-    gp_Pnt aP(points[i][0],points[i][1],points[i][2]);
-    ctrlPoints.SetValue(index++, aP);
-  }
-  ctrlPoints.SetValue(index++, gp_Pnt(end->x(), end->y(), end->z()));
-  Handle(Geom_BSplineCurve) NURBS = new Geom_BSplineCurve
-    (ctrlPoints, _weights, _knots, _mult, degree, false);
-  TopoDS_Edge occEdge;
-  if (occv1 && occv2)
-    occEdge = BRepBuilderAPI_MakeEdge(NURBS, occv1->getShape(),
-                                      occv2->getShape()).Edge();
-  else
-    occEdge = BRepBuilderAPI_MakeEdge(NURBS).Edge();
-  return gm->_occ_internals->addEdgeToModel(gm, occEdge);
-  }
-  catch(Standard_Failure &err){
-    Msg::Error("%s", err.GetMessageString());
-  }
-  return 0;
-}
-
-/* add2Drect: rectangluar face, given lower left point and width/height (in X-Y plane)*/
-GFace *OCCFactory::add2Drect(GModel *gm,double x0, double y0, double dx, double dy)
-{
-  Msg::Info("Default working plane is XY in add2D* functions...");
-
-  if (!gm->_occ_internals)
-    gm->_occ_internals = new OCC_Internals;
-
-  TopoDS_Vertex occv1 = BRepBuilderAPI_MakeVertex( gp_Pnt(x0   , y0   , 0.) );
-  TopoDS_Vertex occv2 = BRepBuilderAPI_MakeVertex( gp_Pnt(x0+dx, y0   , 0.) );
-  TopoDS_Vertex occv3 = BRepBuilderAPI_MakeVertex( gp_Pnt(x0+dx, y0+dy, 0.) );
-  TopoDS_Vertex occv4 = BRepBuilderAPI_MakeVertex( gp_Pnt(x0   , y0+dy, 0.) );
-
-  TopoDS_Edge occEdge1 = BRepBuilderAPI_MakeEdge(occv1,occv2);
-  TopoDS_Edge occEdge2 = BRepBuilderAPI_MakeEdge(occv2,occv3);
-  TopoDS_Edge occEdge3 = BRepBuilderAPI_MakeEdge(occv3,occv4);
-  TopoDS_Edge occEdge4 = BRepBuilderAPI_MakeEdge(occv4,occv1);
-
-  TopoDS_Wire rectWire = BRepBuilderAPI_MakeWire(occEdge1 , occEdge2 , occEdge3, occEdge4);
-  TopoDS_Face rectFace = BRepBuilderAPI_MakeFace(rectWire);
-
-  return gm->_occ_internals->addFaceToModel(gm, TopoDS::Face(rectFace));
-}
-
-/* add2Dellips: ellips face, given lower left point and width/height (in X-Y plane)*/
-GFace *OCCFactory::add2Dellips(GModel *gm, double xc, double yc, double rx, double ry)
-{
-  Msg::Info("Default working plane is XY in add2D* functions...");
-
-  if (!gm->_occ_internals)
-    gm->_occ_internals = new OCC_Internals;
-
-  gp_Dir N_dir(0., 0., 1.);
-  gp_Dir x_dir(1., 0., 0.);
-  gp_Pnt center(xc, yc, 0.);
-  gp_Ax2 axis(center, N_dir, x_dir);
-  gp_Elips ellipse = gp_Elips(axis, rx, ry);
-  // gp_Ax2(gp_Pnt(xc,yc;0),gp_Dir(0.,0.,1.)),rx,ry
-  TopoDS_Edge ellipsEdge = BRepBuilderAPI_MakeEdge(ellipse);
-  TopoDS_Wire ellipsWire = BRepBuilderAPI_MakeWire(ellipsEdge);
-  TopoDS_Face ellipsFace = BRepBuilderAPI_MakeFace(ellipsWire);
-  // TopoDS_Edge ellipsEdge = BRepBuilderAPI_MakeEdge( gp_Elips2d(gp_Ax22d(gp_Pnt2d(xc,yc),
-  //                                                   gp_Dir2d(1.,0.), gp_Dir2d(0.,1.)),rx,ry) );
-
-  return gm->_occ_internals->addFaceToModel(gm, TopoDS::Face(ellipsFace));
-}
-
-GEntity *OCCFactory::revolve(GModel *gm, GEntity* base,
-                             std::vector<double> p1,
-                             std::vector<double> p2, double angle)
-{
-  if (!gm->_occ_internals)
-    gm->_occ_internals = new OCC_Internals;
-
-  const double x1 = p1[0];
-  const double y1 = p1[1];
-  const double z1 = p1[2];
-  const double x2 = p2[0];
-  const double y2 = p2[1];
-  const double z2 = p2[2];
-
-  gp_Dir direction(x2 - x1, y2 - y1, z2 - z1);
-  gp_Ax1 axisOfRevolution(gp_Pnt(x1, y1, z1), direction);
-  BRepPrimAPI_MakeRevol MR(*(TopoDS_Shape*)base->getNativePtr(),
-                           axisOfRevolution, angle, Standard_False);
-  GEntity *ret = 0;
-  if (base->cast2Vertex()){
-    TopoDS_Edge result = TopoDS::Edge(MR.Shape());
-    ret = gm->_occ_internals->addEdgeToModel(gm, result);
-  }
-  if (base->cast2Edge()){
-    TopoDS_Face result = TopoDS::Face(MR.Shape());
-    ret = gm->_occ_internals->addFaceToModel(gm, result);
-  }
-  if (base->cast2Face()){
-    TopoDS_Solid result = TopoDS::Solid(MR.Shape());
-    ret = gm->_occ_internals->addRegionToModel(gm, result);
-  }
-  return ret;
-}
-
-GEntity *OCCFactory::extrude(GModel *gm, GEntity* base,
-                             std::vector<double> p1, std::vector<double> p2)
-{
-  if (!gm->_occ_internals)
-    gm->_occ_internals = new OCC_Internals;
-
-  const double x1 = p1[0];
-  const double y1 = p1[1];
-  const double z1 = p1[2];
-  const double x2 = p2[0];
-  const double y2 = p2[1];
-  const double z2 = p2[2];
-
-  gp_Vec direction(gp_Pnt(x1, y1, z1), gp_Pnt(x2, y2, z2));
-  BRepPrimAPI_MakePrism MP(*(TopoDS_Shape*)base->getNativePtr(), direction,
-                           Standard_False);
-  GEntity *ret = 0;
-  if (base->cast2Vertex()){
-    TopoDS_Edge result = TopoDS::Edge(MP.Shape());
-    ret = gm->_occ_internals->addEdgeToModel(gm, result);
-  }
-  if (base->cast2Edge()){
-    TopoDS_Face result = TopoDS::Face(MP.Shape());
-    ret = gm->_occ_internals->addFaceToModel(gm, result);
-  }
-  if (base->cast2Face()){
-    TopoDS_Solid result = TopoDS::Solid(MP.Shape());
-    ret = gm->_occ_internals->addRegionToModel(gm, result);
-  }
-  return ret;
-}
-
-GEntity *OCCFactory::addSphere(GModel *gm, double xc, double yc, double zc, double radius)
-{
-  if (!gm->_occ_internals)
-    gm->_occ_internals = new OCC_Internals;
-
-  gp_Pnt aP(xc, yc, zc);
-  TopoDS_Shape shape = BRepPrimAPI_MakeSphere(aP, radius).Shape();
-  gm->_occ_internals->buildShapeFromLists(shape);
-  gm->destroy();
-  gm->_occ_internals->buildLists();
-  gm->_occ_internals->buildGModel(gm);
-  return gm->_occ_internals->getRegionForOCCShape(gm, TopoDS::Solid(shape));
-}
-
-GRegion* OCCFactory::addVolume (GModel *gm, std::vector<std::vector<GFace *> > faces)
-{
-  Msg::Error("add Volume not implemented yet for OCCFactory");
-  return 0;
-}
-
-GEntity *OCCFactory::addCylinder(GModel *gm, std::vector<double> p1,
-                                 std::vector<double> p2, double radius)
-{
-  if (!gm->_occ_internals)
-    gm->_occ_internals = new OCC_Internals;
-
-  const double x1 = p1[0];
-  const double y1 = p1[1];
-  const double z1 = p1[2];
-  const double x2 = p2[0];
-  const double y2 = p2[1];
-  const double z2 = p2[2];
-
-  gp_Pnt aP(x1, y1, z1);
-  const double H = sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1) +
-                        (z2 - z1) * (z2 - z1));
-  gp_Vec aV((x2 - x1) / H, (y2 - y1) / H, (z2 - z1) / H);
-  gp_Ax2 anAxes(aP, aV);
-  BRepPrimAPI_MakeCylinder MC(anAxes, radius, H);
-  MC.Build();
-  if (!MC.IsDone()) {
-    Msg::Error("Cylinder can't be computed from the given parameters");
-    return 0;
-  }
-  TopoDS_Shape shape = MC.Shape();
-  gm->_occ_internals->buildShapeFromLists(shape);
-  gm->destroy();
-  gm->_occ_internals->buildLists();
-  gm->_occ_internals->buildGModel(gm);
-  return gm->_occ_internals->getRegionForOCCShape(gm, TopoDS::Solid(shape));
-}
-
-GEntity *OCCFactory::addTorus(GModel *gm, std::vector<double> p1,
-                              std::vector<double> p2, double radius1,
-                              double radius2)
-{
-  if (!gm->_occ_internals)
-    gm->_occ_internals = new OCC_Internals;
-
-  const double x1 = p1[0];
-  const double y1 = p1[1];
-  const double z1 = p1[2];
-  const double x2 = p2[0];
-  const double y2 = p2[1];
-  const double z2 = p2[2];
-  gp_Pnt aP(x1, y1, z1);
-  const double H = sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1) +
-                        (z2 - z1) * (z2 - z1));
-  gp_Vec aV((x2 - x1) / H, (y2 - y1) / H, (z2 - z1) / H);
-  gp_Ax2 anAxes(aP, aV);
-  BRepPrimAPI_MakeTorus MC(anAxes, radius1, radius2);
-  MC.Build();
-  if (!MC.IsDone()) {
-    Msg::Error("Cylinder can't be computed from the given parameters");
-    return 0;
-  }
-  TopoDS_Shape shape = MC.Shape();
-  gm->_occ_internals->buildShapeFromLists(shape);
-  gm->destroy();
-  gm->_occ_internals->buildLists();
-  gm->_occ_internals->buildGModel(gm);
-  return gm->_occ_internals->getRegionForOCCShape(gm, TopoDS::Solid(shape));
-}
-
-GEntity *OCCFactory::addCone(GModel *gm,  std::vector<double> p1,
-                             std::vector<double> p2, double radius1,
-                             double radius2)
-{
-  if (!gm->_occ_internals)
-    gm->_occ_internals = new OCC_Internals;
-
-  const double x1 = p1[0];
-  const double y1 = p1[1];
-  const double z1 = p1[2];
-  const double x2 = p2[0];
-  const double y2 = p2[1];
-  const double z2 = p2[2];
-
-  gp_Pnt aP(x1, y1, z1);
-  const double H = sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1) +
-                        (z2 - z1) * (z2 - z1));
-  gp_Vec aV((x2 - x1) / H, (y2 - y1) / H, (z2 - z1) / H);
-  gp_Ax2 anAxes(aP, aV);
-  BRepPrimAPI_MakeCone MC(anAxes, radius1, radius2, H);
-  MC.Build();
-  if (!MC.IsDone()) {
-    Msg::Error("Cylinder can't be computed from the given parameters");
-    return 0;
-  }
-  TopoDS_Shape shape = MC.Shape();
-  gm->_occ_internals->buildShapeFromLists(shape);
-  gm->destroy();
-  gm->_occ_internals->buildLists();
-  gm->_occ_internals->buildGModel(gm);
-  return gm->_occ_internals->getRegionForOCCShape(gm,TopoDS::Solid(shape));
-}
-
-GEntity *OCCFactory::addBlock(GModel *gm, std::vector<double> p1,
-                              std::vector<double> p2)
-{
-  if (!gm->_occ_internals)
-    gm->_occ_internals = new OCC_Internals;
-
-  gp_Pnt P1(p1[0], p1[1], p1[2]);
-  gp_Pnt P2(p2[0], p2[1], p2[2]);
-  BRepPrimAPI_MakeBox MB(P1, P2);
-  MB.Build();
-  if (!MB.IsDone()) {
-    Msg::Error("Box can not be computed from the given point");
-    return 0;
-  }
-  TopoDS_Shape shape = MB.Shape();
-  gm->_occ_internals->buildShapeFromLists(shape);
-  gm->destroy();
-  gm->_occ_internals->buildLists();
-  gm->_occ_internals->buildGModel(gm);
-  return gm->_occ_internals->getRegionForOCCShape(gm, TopoDS::Solid(shape));
-}
-
-GEntity *OCCFactory::add3DBlock(GModel *gm,std::vector<double> p1,
-                                double dx, double dy, double dz)
-{
-  if (!gm->_occ_internals)
-    gm->_occ_internals = new OCC_Internals;
-
-  gp_Pnt P1(p1[0], p1[1], p1[2]);
-  BRepPrimAPI_MakeBox MB(P1, dx, dy, dz);
-  MB.Build();
-  if (!MB.IsDone()) {
-    Msg::Error("Box can not be computed from the given point");
-    return 0;
-  }
-  TopoDS_Shape shape = MB.Shape();
-  gm->_occ_internals->buildShapeFromLists(shape);
-  gm->destroy();
-  gm->_occ_internals->buildLists();
-  gm->_occ_internals->buildGModel(gm);
-  return gm->_occ_internals->getRegionForOCCShape(gm, TopoDS::Solid(shape));
-}
-
-GModel *OCCFactory::computeBooleanUnion(GModel* obj, GModel* tool,
-                                        int createNewModel)
-{
-  try{
-    OCC_Internals *occ_obj = obj->getOCCInternals();
-    OCC_Internals *occ_tool = tool->getOCCInternals();
-
-    if (!occ_obj || !occ_tool) return NULL;
-
-    if (createNewModel){
-      GModel *temp = new GModel;
-      temp->_occ_internals = new OCC_Internals;
-      temp->_occ_internals->_addShapeToLists(occ_obj->getShape());
-      obj = temp;
-    }
-    obj->_occ_internals->applyBooleanOperator(occ_tool->getShape(),
-                                              OCC_Internals::Union);
-    obj->destroy();
-    obj->_occ_internals->buildLists();
-    obj->_occ_internals->buildGModel(obj);
-  }
-  catch(Standard_Failure &err){
-    Msg::Error("%s", err.GetMessageString());
-  }
-
-  return obj;
-}
-
-GModel *OCCFactory::computeBooleanDifference(GModel* obj, GModel* tool,
-                                             int createNewModel)
-{
-  try{
-    OCC_Internals *occ_obj = obj->getOCCInternals();
-    OCC_Internals *occ_tool = tool->getOCCInternals();
-
-    if (!occ_obj || !occ_tool) return NULL;
-
-    if (createNewModel){
-      GModel *temp = new GModel;
-      temp->_occ_internals = new OCC_Internals;
-      temp->_occ_internals->_addShapeToLists(occ_obj->getShape());
-      obj = temp;
-    }
-    obj->getOCCInternals()->applyBooleanOperator(occ_tool->getShape(),
-                                                 OCC_Internals::Difference);
-    obj->destroy();
-    obj->_occ_internals->buildLists();
-    obj->_occ_internals->buildGModel(obj);
-  }
-  catch(Standard_Failure &err){
-    Msg::Error("%s", err.GetMessageString());
-  }
-  return obj;
-}
-
-GModel *OCCFactory::computeBooleanIntersection(GModel* obj, GModel* tool,
-                                               int createNewModel)
-{
-  try{
-    OCC_Internals *occ_obj = obj->getOCCInternals();
-    OCC_Internals *occ_tool = tool->getOCCInternals();
-
-    if (!occ_obj || !occ_tool) return NULL;
-
-    if (createNewModel){
-      GModel *temp = new GModel;
-      temp->_occ_internals = new OCC_Internals;
-      temp->_occ_internals->_addShapeToLists(occ_obj->getShape());
-      obj = temp;
-    }
-    obj->getOCCInternals()->applyBooleanOperator(occ_tool->getShape(),
-                                                 OCC_Internals::Intersection);
-    obj->destroy();
-    obj->_occ_internals->buildLists();
-    obj->_occ_internals->buildGModel(obj);
-  }
-  catch(Standard_Failure &err){
-    Msg::Error("%s", err.GetMessageString());
-  }
-  return obj;
-}
-
-/* IsEqualG : a tolerance function for setPeriodicAllFaces */
-bool IsEqualG(double x, double y)
-{
-  const double epsilon = 0.00000000001;
-  return fabs(x - y) <= epsilon * (std::max(fabs(x),fabs(y)));
-}
-
-/* setPeriodicAllFaces: detects T-periodic pair of faces and uses
-   setPeriodicPairOfFaces to make them all periodic */
-void OCCFactory::setPeriodicAllFaces(GModel *gm, std::vector<double> FaceTranslationVector)
-{
-  if (!gm->_occ_internals)
-    gm->_occ_internals = new OCC_Internals;
-
-  Msg::Info("Experimental: search for 'translated' faces and calls setPeriodicPairOfFaces automatically");
-  TopoDS_Shape shape = gm->_occ_internals->getShape();
-  gp_Trsf theTransformation;
-  gp_Vec theVectorOfTranslation(FaceTranslationVector[0],
-                                FaceTranslationVector[1],
-                                FaceTranslationVector[2]);
-  int               numFaceMaster   , numFaceSlave;
-  std::list<GEdge*> ListOfEdgeMaster, ListOfEdgeSlave;
-  for(TopExp_Explorer aFaceExplorer(shape, TopAbs_FACE); aFaceExplorer.More(); aFaceExplorer.Next()){
-    TopoDS_Face aFace1 = TopoDS::Face(aFaceExplorer.Current());
-    for(TopExp_Explorer aFaceExplorer2(shape, TopAbs_FACE); aFaceExplorer2.More(); aFaceExplorer2.Next()){
-      TopoDS_Face aFace2 = TopoDS::Face(aFaceExplorer2.Current());
-      // Get number of Edges
-      int NumberOfEdgesInFace1=0;
-      int NumberOfEdgesInFace2=0;
-      for (TopExp_Explorer aEdgeExplorer1(aFace1,TopAbs_EDGE); aEdgeExplorer1.More();
-           aEdgeExplorer1.Next()) {NumberOfEdgesInFace1++;}
-      for (TopExp_Explorer aEdgeExplorer2(aFace2,TopAbs_EDGE); aEdgeExplorer2.More();
-           aEdgeExplorer2.Next()) {NumberOfEdgesInFace2++;}
-      // Get Surfaces of Faces (occtopo=>occgeom)
-      Handle(Geom_Surface) Surf1=BRep_Tool::Surface(aFace1);
-      Handle(Geom_Surface) Surf2=BRep_Tool::Surface(aFace2);
-      // Get barycenter and area
-      GProp_GProps FaceProps1;
-      GProp_GProps FaceProps2;
-      BRepGProp::SurfaceProperties(aFace1,FaceProps1);
-      BRepGProp::SurfaceProperties(aFace2,FaceProps2);
-      gp_Pnt BarycenterFace1 = FaceProps1.CentreOfMass ();
-      gp_Pnt BarycenterFace2 = FaceProps2.CentreOfMass ();
-      Standard_Real Area1 = FaceProps1.Mass();
-      Standard_Real Area2 = FaceProps2.Mass();
-      // Get surface normal
-      //Standard_Real umin, vmin;//umax,vmax
-      //GeomLProp_SLProps props1(Surf1, umin, vmin, 1, 0.01);
-      //GeomLProp_SLProps props2(Surf2, umin, vmin, 1, 0.01);
-      //gp_Dir norm1=props1.Normal();
-      //gp_Dir norm2=props2.Normal();
-
-      if(NumberOfEdgesInFace1==NumberOfEdgesInFace2
-         && IsEqualG(Area1,Area2)
-         && IsEqualG(BarycenterFace1.X()+FaceTranslationVector[0],BarycenterFace2.X())
-         && IsEqualG(BarycenterFace1.Y()+FaceTranslationVector[1],BarycenterFace2.Y())
-         && IsEqualG(BarycenterFace1.Z()+FaceTranslationVector[2],BarycenterFace2.Z())){
-        numFaceMaster = gm->getOCCInternals()->getFaceForOCCShape(gm,aFace1)->tag();
-        numFaceSlave  = gm->getOCCInternals()->getFaceForOCCShape(gm,aFace2)->tag();
-        //Msg::Info("Face %d (slave) is most likely Face %d (master) translated by (%.2e,%.2e,%.2e)!",
-        //           numFaceSlave,numFaceMaster,FaceTranslationVector[0],FaceTranslationVector[1],
-        //           FaceTranslationVector[2]);
-
-        std::vector<int>  EdgeListMaster(NumberOfEdgesInFace1);
-        std::vector<int>  EdgeListSlave(NumberOfEdgesInFace2);
-        int i1=0;//,i2=0;
-
-        // ici il faut imbriquer la seconde boucle pour fournir des edges qui match slave/master
-        for (TopExp_Explorer aEdgeExplorer1(aFace1,TopAbs_EDGE); aEdgeExplorer1.More();
-             aEdgeExplorer1.Next()) {
-          TopoDS_Edge aEdge1 = TopoDS::Edge(aEdgeExplorer1.Current());
-          int numEdgeMaster  = gm->getOCCInternals()->getEdgeForOCCShape(gm,aEdge1)->tag();
-          EdgeListMaster[i1] = numEdgeMaster;
-          //i2=0;
-          for (TopExp_Explorer aEdgeExplorer2(aFace2,TopAbs_EDGE); aEdgeExplorer2.More();
-               aEdgeExplorer2.Next()) {
-            TopoDS_Edge aEdge2 = TopoDS::Edge(aEdgeExplorer2.Current());
-            GProp_GProps EdgeProps1;
-            GProp_GProps EdgeProps2;
-            BRepGProp::LinearProperties(aEdge1, EdgeProps1);
-            BRepGProp::LinearProperties(aEdge2, EdgeProps2);
-            gp_Pnt BarycenterEdge1 = EdgeProps1.CentreOfMass ();
-            gp_Pnt BarycenterEdge2 = EdgeProps2.CentreOfMass ();
-            Standard_Real Length1 = EdgeProps1.Mass();
-            Standard_Real Length2 = EdgeProps2.Mass();
-            if(IsEqualG(Length1,Length2)
-               && IsEqualG(BarycenterEdge1.X()+FaceTranslationVector[0],BarycenterEdge2.X())
-               && IsEqualG(BarycenterEdge1.Y()+FaceTranslationVector[1],BarycenterEdge2.Y())
-               && IsEqualG(BarycenterEdge1.Z()+FaceTranslationVector[2],BarycenterEdge2.Z())){
-              int numEdgeSlave   = gm->getOCCInternals()->getEdgeForOCCShape(gm,aEdge2)->tag();
-              EdgeListSlave[i1]  = numEdgeSlave;
-            }
-          }
-          i1++;
-        }
-        if(NumberOfEdgesInFace1==4)
-          Msg::Info("Setting Periodic : Face %d  {%d,%d,%d,%d} (slave) and Face %d "
-                    "{%d,%d,%d,%d} (master)",
-                    numFaceSlave ,EdgeListSlave[0] ,EdgeListSlave[1] ,EdgeListSlave[2],
-                    EdgeListSlave[3], numFaceMaster,EdgeListMaster[0],EdgeListMaster[1],
-                    EdgeListMaster[2],EdgeListMaster[3]);
-        setPeriodicPairOfFaces(gm, numFaceMaster, EdgeListMaster, numFaceSlave, EdgeListSlave);
-      }
-      else ;
-    }
-  }
-}
-
-/* setPeriodicPairOfFaces: set periodic given a Slave/Master pair of
-   numFace-Edgelist */
-void OCCFactory::setPeriodicPairOfFaces(GModel *gm, int numFaceMaster,
-                                        std::vector<int> EdgeListMaster,
-                                        int numFaceSlave,
-                                        std::vector<int> EdgeListSlave)
-{
-  if (!gm->_occ_internals)
-    gm->_occ_internals = new OCC_Internals;
-
-  if (EdgeListMaster.size() != EdgeListSlave.size()){
-    Msg::Error("Slave/Master faces don't have the same number of edges!");
-  }
-  else {
-
-    std::map<int,int> edgeCounterparts;
-    std::vector<int>::iterator siter = EdgeListSlave.begin();
-    std::vector<int>::iterator miter = EdgeListMaster.begin();
-
-    for (;siter!=EdgeListSlave.end();++siter,++miter) {
-      edgeCounterparts[*siter] = *miter;
-    }
-
-    GFace *gf = GModel::current()->getFaceByTag(abs(numFaceSlave));
-    if (gf) {
-      GFace *master = GModel::current()->getFaceByTag(abs(numFaceMaster));
-      gf->setMeshMaster(master,edgeCounterparts);
-    }
-    else Msg::Error("Slave surface %d not found", numFaceSlave);
-  }
-}
-
-void OCCFactory::fillet(GModel *gm, std::vector<int> edges, double radius)
-{
-  if (!gm->_occ_internals)
-    gm->_occ_internals = new OCC_Internals;
-
-  try{
-    std::vector<TopoDS_Edge> edgesToFillet;
-    for (unsigned i = 0; i < edges.size(); i++){
-      GEdge *ed = gm->getEdgeByTag(edges[i]);
-      if (ed){
-  OCCEdge *occed = dynamic_cast<OCCEdge*>(ed);
-  if (occed)edgesToFillet.push_back(occed->getTopoDS_Edge());
-      }
-    }
-    gm->_occ_internals->fillet(edgesToFillet, radius);
-    gm->destroy();
-    gm->_occ_internals->buildLists();
-    gm->_occ_internals->buildGModel(gm);
-  }
-  catch(Standard_Failure &err){
-    Msg::Error("%s", err.GetMessageString());
-  }
-}
-
-void OCCFactory::translate(GModel *gm, std::vector<double> dx, int addToTheModel)
-{
-  if (!gm->_occ_internals)
-    gm->_occ_internals = new OCC_Internals;
-
-  gp_Trsf transformation;
-  transformation.SetTranslation(gp_Pnt (0,0,0),gp_Pnt (dx[0],dx[1],dx[2]));
-  BRepBuilderAPI_Transform aTransformation(gm->_occ_internals->getShape(),
-                                           transformation, Standard_False);
-  TopoDS_Shape temp = aTransformation.Shape();
-  if (!addToTheModel) gm->_occ_internals->loadShape(& temp);
-  else gm->_occ_internals->buildShapeFromLists(temp);
-  gm->destroy();
-  gm->_occ_internals->buildLists();
-  gm->_occ_internals->buildGModel(gm);
-}
-
-void OCCFactory::rotate(GModel *gm, std::vector<double> p1, std::vector<double> p2,
-                        double angle, int addToTheModel)
-{
-  if (!gm->_occ_internals)
-    gm->_occ_internals = new OCC_Internals;
-
-  const double x1 = p1[0];
-  const double y1 = p1[1];
-  const double z1 = p1[2];
-  const double x2 = p2[0];
-  const double y2 = p2[1];
-  const double z2 = p2[2];
-
-  gp_Trsf transformation;
-
-  gp_Vec direction(gp_Pnt(x1, y1, z1), gp_Pnt(x2, y2, z2));
-  gp_Ax1 axisOfRevolution(gp_Pnt(x1, y1, z1), direction);
-  transformation.SetRotation(axisOfRevolution, angle);
-  BRepBuilderAPI_Transform aTransformation(gm->_occ_internals->getShape(),
-                                           transformation, Standard_False);
-  TopoDS_Shape temp = aTransformation.Shape();
-  if (!addToTheModel) gm->_occ_internals->loadShape(&temp);
-  else gm->_occ_internals->buildShapeFromLists(temp);
-  gm->destroy();
-  gm->_occ_internals->buildLists();
-  gm->_occ_internals->buildGModel(gm);
-}
-
-void OCCFactory::dilate(GModel *gm, std::vector<double> p, std::vector<double> s,
-                        int addToTheModel)
-{
-  if (!gm->_occ_internals)
-    gm->_occ_internals = new OCC_Internals;
-
-  const double x = p[0];
-  const double y = p[1];
-  const double z = p[2];
-
-  const double a = s[0];
-  const double b = s[1];
-  const double c = s[2];
-
-  gp_GTrsf transformation;
-  transformation.SetVectorialPart(gp_Mat(a, 0, 0, 0, b, 0, 0, 0, c));
-  transformation.SetTranslationPart(gp_XYZ(x,y,z));
-  BRepBuilderAPI_GTransform aTransformation(gm->_occ_internals->getShape(),
-                                           transformation, Standard_False);
-  TopoDS_Shape temp = aTransformation.Shape();
-  if (!addToTheModel) gm->_occ_internals->loadShape(&temp);
-  else gm->_occ_internals->buildShapeFromLists(temp);
-  gm->destroy();
-  gm->_occ_internals->buildLists();
-  gm->_occ_internals->buildGModel(gm);
-}
-
-std::vector<GFace *> OCCFactory::addRuledFaces(GModel *gm,
-                                               std::vector< std::vector<GEdge *> > wires)
-{
-  if (!gm->_occ_internals)
-    gm->_occ_internals = new OCC_Internals;
-
-  std::vector<GFace*> faces;
-  Standard_Boolean anIsSolid = Standard_False;
-  Standard_Boolean anIsRuled = Standard_True;
-  BRepOffsetAPI_ThruSections aGenerator (anIsSolid,anIsRuled);
-
-  for (unsigned i=0;i<wires.size();i++) {
-    BRepBuilderAPI_MakeWire wire_maker;
-    for (unsigned j=0;j<wires[i].size();j++) {
-      GEdge *ge = wires[i][j];
-      OCCEdge *occe = dynamic_cast<OCCEdge*>(ge);
-      if (occe){
-  wire_maker.Add(occe->getTopoDS_Edge());
-      }
-    }
-    aGenerator.AddWire (wire_maker.Wire());
-  }
-
-  aGenerator.CheckCompatibility (Standard_False);
-
-  aGenerator.Build();
-
-  TopoDS_Shape aResult = aGenerator.Shape();
-
-  TopExp_Explorer exp2;
-  for(exp2.Init(TopoDS::Shell(aResult), TopAbs_FACE); exp2.More(); exp2.Next()){
-    TopoDS_Face face = TopoDS::Face(exp2.Current());
-    GFace *ret = gm->_occ_internals->addFaceToModel(gm, face);
-    faces.push_back(ret);
-  }
-  return faces;
-}
-
-GFace *OCCFactory::addFace(GModel *gm, std::vector<GEdge *> edges,
-                           std::vector< std::vector<double > > points)
-{
-  if (!gm->_occ_internals)
-    gm->_occ_internals = new OCC_Internals;
-
-  BRepOffsetAPI_MakeFilling aGenerator;
-
-  for (unsigned i = 0; i < edges.size(); i++) {
-    GEdge *ge = edges[i];
-    OCCEdge *occe = dynamic_cast<OCCEdge*>(ge);
-    if (occe){
-      aGenerator.Add(occe->getTopoDS_Edge(), GeomAbs_C0);
-    }
-  }
-  for (unsigned i = 0; i < points.size(); i++) {
-    gp_Pnt aPnt(points[i][0], points[i][1], points[i][2]);
-    aGenerator.Add(aPnt);
-  }
-
-  aGenerator.Build();
-
-  TopoDS_Shape aResult = aGenerator.Shape();
-  return gm->_occ_internals->addFaceToModel(gm, TopoDS::Face(aResult));
-}
-
-GFace *OCCFactory::addPlanarFace(GModel *gm, std::vector< std::vector<GEdge *> > wires)
-{
-  if (!gm->_occ_internals)
-    gm->_occ_internals = new OCC_Internals;
-
-  std::set<GVertex*> verts;
-  for (unsigned i = 0; i < wires.size(); i++) {
-    for (unsigned j = 0; j < wires[i].size(); j++) {
-      GEdge *ge = wires[i][j];
-      verts.insert(ge->getBeginVertex());
-      verts.insert(ge->getEndVertex());
-    }
-  }
-  std::vector<SPoint3> points;
-  std::set<GVertex*>::iterator it = verts.begin();
-  for ( ; it != verts.end(); ++it){
-    points.push_back(SPoint3((*it)->x(), (*it)->y(), (*it)->z()));
-  }
-
-  mean_plane meanPlane;
-  computeMeanPlaneSimple(points, meanPlane);
-
-  gp_Pln aPlane (meanPlane.a, meanPlane.b, meanPlane.c, -meanPlane.d);
-  BRepBuilderAPI_MakeFace aGenerator (aPlane);
-
-  for (unsigned i = 0; i < wires.size() ;i++) {
-    BRepBuilderAPI_MakeWire wire_maker;
-    for (unsigned j = 0; j < wires[i].size(); j++) {
-      GEdge *ge = wires[i][j];
-      OCCEdge *occe = dynamic_cast<OCCEdge*>(ge);
-      if (occe){
-  wire_maker.Add(occe->getTopoDS_Edge());
-      }
-    }
-    TopoDS_Wire myWire = wire_maker.Wire();
-    //if (i)myWire.Reverse();
-    aGenerator.Add (myWire);
-  }
-
-  aGenerator.Build();
-  TopoDS_Shape aResult = aGenerator.Shape();
-
-  return gm->_occ_internals->addFaceToModel(gm, TopoDS::Face(aResult));
-}
-
-GFace *OCCFactory::addPlanarFace(GModel *gm, const std::vector<std::vector<GEdgeSigned> > &edges)
-{
-  Msg::Error("addPlanarFace with oriented edges not implemented yet for OCCFactory");
-  return 0;
-}
-
-GEntity *OCCFactory::addPipe(GModel *gm, GEntity *base, std::vector<GEdge *> wire)
-{
-  if (!gm->_occ_internals)
-    gm->_occ_internals = new OCC_Internals;
-
-  BRepBuilderAPI_MakeWire wire_maker;
-  for (unsigned j = 0; j < wire.size(); j++) {
-    GEdge *ge = wire[j];
-    OCCEdge *occe = dynamic_cast<OCCEdge*>(ge);
-    if (occe){
-      wire_maker.Add(occe->getTopoDS_Edge());
-    }
-  }
-  TopoDS_Wire myWire = wire_maker.Wire();
-
-  GEntity *ret = 0;
-  if (base->cast2Vertex()){
-    OCCVertex *occv = dynamic_cast<OCCVertex*>(base);
-    BRepOffsetAPI_MakePipe myNiceLittlePipe (myWire, occv->getShape());
-    TopoDS_Edge result = TopoDS::Edge(myNiceLittlePipe.Shape());
-    ret = gm->_occ_internals->addEdgeToModel(gm, result);
-  }
-  if (base->cast2Edge()){
-    OCCEdge *occe = dynamic_cast<OCCEdge*>(base);
-    BRepOffsetAPI_MakePipe myNiceLittlePipe (myWire, occe->getTopoDS_Edge());
-    TopoDS_Face result = TopoDS::Face(myNiceLittlePipe.Shape());
-    ret = gm->_occ_internals->addFaceToModel(gm, result);
-  }
-  if (base->cast2Face()){
-    OCCFace *occf = dynamic_cast<OCCFace*>(base);
-    BRepOffsetAPI_MakePipe myNiceLittlePipe (myWire, occf->getTopoDS_Face());
-    TopoDS_Solid result = TopoDS::Solid(myNiceLittlePipe.Shape());
-    ret = gm->_occ_internals->addRegionToModel(gm, result);
-  }
-  return ret;
-}
-
-GEntity *OCCFactory::addThruSections(GModel *gm, std::vector<std::vector<GEdge *> > wire)
-{
-  if (!gm->_occ_internals)
-    gm->_occ_internals = new OCC_Internals;
-
-  BRepOffsetAPI_ThruSections aGenerator(Standard_True); // create solid
-  for (unsigned i = 0; i < wire.size(); i++) {
-    BRepBuilderAPI_MakeWire wire_maker;
-    for (unsigned j = 0; j < wire[i].size(); j++) {
-      GEdge *ge = wire[i][j];
-      OCCEdge *occe = dynamic_cast<OCCEdge*>(ge);
-      if (occe){
-        wire_maker.Add(occe->getTopoDS_Edge());
-      }
-    }
-    aGenerator.AddWire(wire_maker.Wire());
-  }
-  aGenerator.CheckCompatibility(Standard_False);
-  aGenerator.Build();
-  TopoDS_Solid result = TopoDS::Solid(aGenerator.Shape());
-  GEntity *ret = gm->_occ_internals->addRegionToModel(gm, result);
-  return ret;
-}
-
-void OCCFactory::healGeometry(GModel *gm, double tolerance)
-{
-  if (!gm->_occ_internals)
-    gm->_occ_internals = new OCC_Internals;
-
-  if (tolerance < 0.)
-    tolerance = CTX::instance()->geom.tolerance;
-  if (!gm || !gm->_occ_internals)
-    return;
-  gm->_occ_internals->_healGeometry(tolerance, true, true, true, true, true, true);
-  gm->_occ_internals->buildLists();
-  gm->_occ_internals->buildGModel(gm);
-}
-
-#endif
diff --git a/Geo/GModelFactory.h b/Geo/GModelFactory.h
deleted file mode 100644
index a8e08221b53c9d9d6505f0af8c4cc81487e95cf0..0000000000000000000000000000000000000000
--- a/Geo/GModelFactory.h
+++ /dev/null
@@ -1,295 +0,0 @@
-// Gmsh - Copyright (C) 1997-2017 C. Geuzaine, J.-F. Remacle
-//
-// See the LICENSE.txt file for license information. Please report all
-// bugs and problems to the public mailing list <gmsh@onelab.info>.
-
-#ifndef _GMODEL_FACTORY_H_
-#define _GMODEL_FACTORY_H_
-
-#include <vector>
-#include "GmshConfig.h"
-#include "GmshMessage.h"
-
-class GEntity;
-class GVertex;
-class GEdge;
-class GEdgeSigned;
-class GFace;
-class GRegion;
-class GModel;
-class SPoint3;
-
-// Abstract CAD creation factory.
-class GModelFactory {
- public:
-  GModelFactory(){}
-  virtual ~GModelFactory(){}
-  virtual std::string getName(){ return ""; }
-  // brep primitives
-  enum arcCreationMethod {THREE_POINTS=1, CENTER_START_END=2};
-  enum splineType {BEZIER=1, BSPLINE=2};
-  virtual GVertex *addVertex(GModel *gm, double x, double y, double z, double lc) = 0;
-  virtual GEdge *addLine(GModel *, GVertex *v1, GVertex *v2) = 0;
-  virtual GFace *addPlanarFace(GModel *gm, std::vector<std::vector<GEdge *> > edges) = 0;
-  virtual GFace *addPlanarFace(GModel *gm, const std::vector<std::vector<GEdgeSigned> > &edges) = 0;
-  virtual GRegion*addVolume(GModel *gm, std::vector<std::vector<GFace *> > faces) = 0;
-  virtual GEdge *addCircleArc(GModel *gm, GVertex *start, GVertex *center, GVertex *end)
-  {
-    Msg::Error("addCircleArc not implemented yet");
-    return 0;
-  }
-  virtual GEdge *addCircleArc(GModel *gm, const arcCreationMethod &method,
-                              GVertex *start, GVertex *end,
-                              const SPoint3 &aPoint)
-  {
-    Msg::Error("addCircleArc not implemented yet");
-    return 0;
-  }
-  virtual GEdge *addSpline(GModel *gm,const splineType &type,
-                           GVertex *start,
-                           GVertex *end,
-                           std::vector<std::vector<double> > controlPoints)
-  {
-    Msg::Error("addSpline not implemented yet");
-    return 0;
-  }
-  virtual GEdge *addNURBS(GModel *gm, GVertex *start, GVertex *end,
-        std::vector<std::vector<double> > controlPoints,
-        std::vector<double> knots,
-        std::vector<double> weights,
-        std::vector<int> multiplicity)
-  {
-    Msg::Error("addNURBS not implemented yet");
-    return 0;
-  }
-  // this one tries to build a model face with one single list of
-  // faces. If boundaries are co-planar, then it's a plane, otherwise,
-  // we tru ruled, sweep or other kind of surfaces
-  virtual std::vector<GFace *> addRuledFaces(GModel *gm,
-               std::vector<std::vector<GEdge *> > edges)
-  {
-    Msg::Error("addRuledFaces not implemented yet");
-    return std::vector<GFace*>();
-  }
-  virtual GFace *addFace(GModel *gm, std::vector<GEdge *> edges,
-                         std::vector< std::vector<double > > points)
-  {
-    Msg::Error("addFace not implemented yet");
-    return 0;
-  }
-  virtual GFace *add2Drect(GModel *gm,double x0, double y0, double dx, double dy)
-  {
-    Msg::Error("add2Drect not implemented yet");
-    return 0;
-  }
-  virtual GFace *add2Dellips(GModel *gm,double xc, double yc, double rx, double ry)
-  {
-    Msg::Error("add2Dellips not implemented yet");
-    return 0;
-  }
-
-  // sweep stuff
-  virtual GEntity *revolve(GModel *gm, GEntity*, std::vector<double> p1,
-                           std::vector<double> p2, double angle)
-  {
-    Msg::Error("revolve not implemented yet");
-    return 0;
-  }
-  virtual GEntity *extrude(GModel *gm, GEntity*, std::vector<double> p1,
-                           std::vector<double> p2)
-  {
-    Msg::Error("extrude not implemented yet");
-    return 0;
-  }
-  virtual std::vector<GEntity*> extrudeBoundaryLayer(GModel *gm, GEntity *e,
-                                                     int nbLayers, double hLayers,
-                                                     int dir, int view)
-  {
-    Msg::Error("extrude normals not implemented yet");
-    std::vector<GEntity*> empty;
-    return empty;
-  }
-  virtual GEntity *addPipe(GModel *gm, GEntity *base, std::vector<GEdge *> wire)
-  {
-    Msg::Error("addPipe not implemented yet");
-    return 0;
-  }
-  virtual GEntity *addThruSections(GModel *gm, std::vector<std::vector<GEdge *> > wire)
-  {
-    Msg::Error("addThruSections not implemented yet");
-    return 0;
-  }
-
-  // solid primitives
-  virtual GEntity *addSphere(GModel *gm, double cx, double cy, double cz,
-                             double radius)
-  {
-    Msg::Error("addSphere not implemented yet");
-    return 0;
-  }
-  virtual GEntity *addCylinder(GModel *gm, std::vector<double> p1,
-                               std::vector<double> p2, double radius)
-  {
-    Msg::Error("addCylinder not implemented yet");
-    return 0;
-  }
-  virtual GEntity *addTorus(GModel *gm, std::vector<double> p1,
-                            std::vector<double> p2, double radius1,
-                            double radius2)
-  {
-    Msg::Error("addTorus not implemented yet");
-    return 0;
-  }
-  virtual GEntity *addBlock(GModel *gm, std::vector<double> p1,
-                            std::vector<double> p2)
-  {
-    Msg::Error("addBlock not implemented yet");
-    return 0;
-  }
-  virtual GEntity *add3DBlock(GModel *gm, std::vector<double> p1,
-                            double dx, double dy, double dz)
-  {
-    Msg::Error("add3DBlock not implemented yet");
-    return 0;
-  }
-  virtual GEntity *addCone(GModel *gm, std::vector<double> p1,
-                           std::vector<double> p2, double radius1,
-                           double radius2)
-  {
-    Msg::Error("addCone not implemented yet");
-    return 0;
-  }
-
-  // here, we should give a list of GEdges. Yet, I still can't figure out how
-  // to get those automatically ... wait and see
-  virtual void fillet(GModel *gm, std::vector<int> edges, double radius)
-  {
-    Msg::Error("fillet not implemented yet");
-  }
-
-  // rigid body motions
-  virtual void translate(GModel *gm, std::vector<double> dx, int addToTheModel)
-  {
-    Msg::Error("translate not implemented yet");
-  }
-  virtual void rotate(GModel *gm, std::vector<double> p1,std::vector<double> p2,
-                      double angle, int addToTheModel)
-  {
-    Msg::Error("rotate not implemented yet");
-  }
-
-  // boolean operators acting on 2 GModels
-  virtual GModel *computeBooleanUnion(GModel *obj, GModel*tool, int createNewModel)
-  {
-    Msg::Error("computeBooleanUnion not implemented yet");
-    return 0;
-  }
-  virtual GModel *computeBooleanIntersection(GModel *obj, GModel*tool,
-                                             int createNewModel)
-  {
-    Msg::Error("computeBooleanIntersection not implemented yet");
-    return 0;
-  }
-  virtual GModel *computeBooleanDifference(GModel *obj, GModel*tool,
-                                           int createNewModel)
-  {
-    Msg::Error("computeBooleanDifference not implemented yet");
-    return 0;
-  }
-
-  virtual void setPeriodicAllFaces(GModel *gm, std::vector<double> FaceTranslationVector)
-  {
-    Msg::Error("findperiodic not implemented yet");
-  }
-  virtual void setPeriodicPairOfFaces(GModel *gm, int numFaceMaster,
-                                      std::vector<int> EdgeListMaster,
-                                      int numFaceSlave, std::vector<int> EdgeListSlave)
-  {
-    Msg::Error("setPeriodicPairOfFaces not implemented yet");
-  }
-  ;
-  virtual void healGeometry(GModel *gm, double tolerance = -1.) = 0;
-};
-
-class GeoFactory : public GModelFactory {
- public:
-  GeoFactory(){}
-  std::string getName(){ return "GEO"; }
-  GVertex *addVertex(GModel *gm,double x, double y, double z, double lc);
-  GEdge *addLine(GModel *gm,GVertex *v1, GVertex *v2);
-  GFace *addPlanarFace(GModel *gm, std::vector<std::vector<GEdge *> > edges);
-  GFace *addPlanarFace(GModel *gm, const std::vector<std::vector<GEdgeSigned> > &edges);
-  GRegion *addVolume(GModel *gm, std::vector<std::vector<GFace *> > faces);
-  using GModelFactory::addCircleArc;
-  GEdge *addCircleArc(GModel *gm,GVertex *begin, GVertex *center, GVertex *end);
-  std::vector<GFace *> addRuledFaces(GModel *gm, std::vector<std::vector<GEdge *> > edges);
-  std::vector<GEntity*> extrudeBoundaryLayer(GModel *gm, GEntity *e, int nbLayers,
-                                             double hLayers, int dir, int view);
-  void healGeometry(GModel *gm, double tolerance = -1.);
-
-private:
-  GFace *_addPlanarFace(GModel *gm, const std::vector<std::vector<GEdgeSigned> > &edges, bool orientEdges);
-};
-
-#if defined(HAVE_OCC)
-
-class OCCFactory : public GModelFactory {
- public:
-  OCCFactory(){}
-  std::string getName(){ return "OpenCASCADE"; }
-  GVertex *addVertex(GModel *gm,double x, double y, double z, double lc);
-  GEdge *addLine(GModel *gm,GVertex *v1, GVertex *v2);
-  GEdge *addCircleArc(GModel *gm,const arcCreationMethod &method,
-                      GVertex *start, GVertex *end,
-                      const SPoint3 &aPoint);
-  GEdge *addSpline(GModel *gm,const splineType &type,
-                   GVertex *start, GVertex *end,
-                   std::vector<std::vector<double> > controlPoints);
-  GEdge *addNURBS(GModel *gm,
-      GVertex *start, GVertex *end,
-      std::vector<std::vector<double> > controlPoints,
-      std::vector<double> knots,
-      std::vector<double> weights,
-      std::vector<int> multiplicity);
-  GEntity *revolve(GModel *gm, GEntity*,std::vector<double> p1,
-                   std::vector<double> p2, double angle);
-  GEntity *extrude(GModel *gm, GEntity*,std::vector<double> p1,
-                   std::vector<double> p2);
-  GEntity *addPipe(GModel *gm, GEntity *base, std::vector<GEdge *> wire);
-  GEntity *addThruSections(GModel *gm, std::vector<std::vector<GEdge *> > wire);
-  GEntity *addSphere(GModel *gm,double cx, double cy, double cz, double radius);
-  GEntity *addCylinder(GModel *gm,std::vector<double> p1, std::vector<double> p2,
-                       double radius);
-  std::vector<GFace *> addRuledFaces(GModel *gm, std::vector<std::vector<GEdge *> > edges);
-  GFace *addFace(GModel *gm, std::vector<GEdge *> edges,
-                 std::vector< std::vector<double > > points);
-  GFace *addPlanarFace(GModel *gm, std::vector<std::vector<GEdge *> > edges);
-  GFace *addPlanarFace(GModel *gm, const std::vector<std::vector<GEdgeSigned> > &edges);
-  GFace *add2Drect(GModel *gm,double x0, double y0, double dx, double dy);
-  GFace *add2Dellips(GModel *gm,double xc, double yc, double rx, double ry);
-  GRegion *addVolume(GModel *gm, std::vector<std::vector<GFace *> > faces);
-  GEntity *addTorus(GModel *gm,std::vector<double> p1, std::vector<double> p2,
-                    double radius1, double radius2);
-  GEntity *addBlock(GModel *gm,std::vector<double> p1, std::vector<double> p2);
-  GEntity *add3DBlock(GModel *gm,std::vector<double> p1, double dx, double dy, double dz);
-  GEntity *addCone(GModel *gm,std::vector<double> p1, std::vector<double> p2,
-                   double radius1, double radius2);
-  void translate(GModel *gm, std::vector<double> dx, int addToTheModel);
-  void rotate(GModel *gm, std::vector<double> p1,std::vector<double> p2,
-              double angle, int addToTheModel);
-  void dilate(GModel *gm, std::vector<double> p, std::vector<double> s, 
-              int addToTheModel);
-  GModel *computeBooleanUnion(GModel *obj, GModel *tool, int createNewModel);
-  GModel *computeBooleanIntersection(GModel *obj, GModel *tool, int createNewModel);
-  GModel *computeBooleanDifference(GModel *obj, GModel *tool, int createNewModel);
-
-  void setPeriodicAllFaces(GModel *gm, std::vector<double> FaceTranslationVector);
-  void setPeriodicPairOfFaces(GModel *gm, int numFaceMaster, std::vector<int> EdgeListMaster,
-                              int numFaceSlave, std::vector<int> EdgeListSlave);
-  void fillet(GModel *gm, std::vector<int> edges, double radius);
-  void healGeometry(GModel *gm, double tolerance = -1.);
-};
-
-#endif
-
-#endif
diff --git a/Geo/GModelIO_OCC.cpp b/Geo/GModelIO_OCC.cpp
index 072e7af7863e7082d74f6bfc16f6ee5bce2ee549..e3fb65ccf27396544fc17f42b15cf662bd06c560 100644
--- a/Geo/GModelIO_OCC.cpp
+++ b/Geo/GModelIO_OCC.cpp
@@ -1344,6 +1344,10 @@ bool OCC_Internals::_makeSphere(TopoDS_Solid &result, double xc, double yc, doub
     Msg::Error("Sphere radius should be positive");
     return false;
   }
+  if(angle3 <= 0 || angle3 > 2 * M_PI){
+    Msg::Error("Cannot build sphere with angle <= 0 or angle > 2*Pi");
+    return false;
+  }
   try{
     gp_Pnt p(xc, yc, zc);
     BRepPrimAPI_MakeSphere s(p, radius, angle1, angle2, angle3);
@@ -1425,6 +1429,10 @@ bool OCC_Internals::_makeCylinder(TopoDS_Solid &result, double x, double y, doub
     Msg::Error("Cannot build cylinder of zero height");
     return false;
   }
+  if(angle <= 0 || angle > 2 * M_PI){
+    Msg::Error("Cannot build cylinder with angle <= 0 or angle > 2*Pi");
+    return false;
+  }
   try{
     gp_Pnt aP(x, y, z);
     gp_Vec aV(dx / H, dy / H, dz / H);
@@ -2380,6 +2388,14 @@ bool OCC_Internals::booleanFragments(int tag,
                          outDimTags, outDimTagsMap, removeObject, removeTool);
 }
 
+int OCC_Internals::_getMaxDim()
+{
+  if(_tagSolid.Extent()) return 3;
+  if(_tagFace.Extent()) return 2;
+  if(_tagEdge.Extent()) return 1;
+  return 0;
+}
+
 void OCC_Internals::_getAllDimTags(std::vector<std::pair<int, int> > &dimTags, int dim)
 {
   for(int d = -2; d < 4; d++){
@@ -2402,7 +2418,7 @@ void OCC_Internals::removeAllDuplicates()
 {
   std::vector<std::pair<int, int> > objectDimTags, toolDimTags, outDimTags;
   std::vector<std::vector<std::pair<int, int> > > outDimTagsMap;
-  _getAllDimTags(objectDimTags); // all shapes (that will be) bound to tags
+  _getAllDimTags(objectDimTags, _getMaxDim());
   booleanFragments(-1, objectDimTags, toolDimTags, outDimTags, outDimTagsMap,
                    true, true);
 }
@@ -2483,6 +2499,23 @@ bool OCC_Internals::_transform(const std::vector<std::pair<int, int> > &inDimTag
     result = gtfo->Shape();
   }
 
+  // copy vertex-based meshing attributes
+  TopExp_Explorer exp0;
+  for(exp0.Init(c, TopAbs_VERTEX); exp0.More(); exp0.Next()){
+    TopoDS_Vertex vertex = TopoDS::Vertex(exp0.Current());
+    TopoDS_Shape transformed;
+    if(tfo)
+      transformed = tfo->ModifiedShape(vertex);
+    else if(gtfo)
+      transformed = gtfo->ModifiedShape(vertex);
+    if(!transformed.IsNull()){
+      double lc = _meshAttributes->getMeshSize(0, vertex);
+      if(lc > 0 && lc < MAX_LC)
+        _meshAttributes->insert(new OCCMeshAttributes(0, transformed, lc));
+    }
+  }
+
+  // try to re-bind trasnformed shapes to same tags as original shapes
   std::vector<TopoDS_Shape> outShapes;
   _addSimpleShapes(result, outShapes);
 
@@ -3611,461 +3644,6 @@ bool OCC_Internals::makeTorusSTL(double x, double y, double z, double r1, double
     return false;
   return true;
 }
-/*
-void dumpStepLabels(STEPControl_Reader reader)
-{
-  const Handle(XSControl_WorkSession) &theSession = reader.WS();
-  const Handle(Interface_InterfaceModel) &theModel = theSession->Model();
-  Standard_Integer nb = theModel->NbEntities();
-  for(Standard_Integer i=1; i < ....) {
-    Handle(StepRepr_Representation) entity =
-      Handle(StepRepr_Representation)::DownCast(theModel->Value(i));
-    if(entity.IsNull()){
-      continue;
-    }
-    if(entity->Name().IsNull()){
-      continue;
-    }
-    cout << Name()->ToCString();
-  }
-}
-
-void dumpIgesLabels(IGESControl_Reader reader)
-{
-  const Handle(XSControl_WorkSession) & theSession = reader.WS();
-  const Handle(Interface_InterfaceModel) & theModel = theSession->Model();
-  Standard_Integer nb = theModel->NbEntities();
-  for(Standard_Integer i=1; i<...; i++){
-    Handle(IGESData_IGESEntity) entity =
-      Handle(IGESData_IGESEntity)::DownCast(theModel->Value(i));
-    if(entity.IsNull()){
-      continue;
-    }
-    if(entity->HasName()){
-      cout << NameValue()->String().ToCString();
-    }
-  }
-}
-*/
-
-// FIXME ***************** BEGIN WILL BE REMOVED ************************
-
-void addSimpleShapes(TopoDS_Shape theShape, TopTools_ListOfShape &theList)
-{
-  if(theShape.ShapeType() != TopAbs_COMPOUND &&
-     theShape.ShapeType() != TopAbs_COMPSOLID) {
-    theList.Append(theShape);
-    return;
-  }
-
-  TopTools_MapOfShape mapShape;
-  TopoDS_Iterator It(theShape, Standard_True, Standard_True);
-
-  for(; It.More(); It.Next()) {
-    TopoDS_Shape aShape_i = It.Value();
-    if(mapShape.Add(aShape_i)) {
-      if(aShape_i.ShapeType() == TopAbs_COMPOUND ||
-         aShape_i.ShapeType() == TopAbs_COMPSOLID) {
-        addSimpleShapes(aShape_i, theList);
-      }
-      else {
-        theList.Append(aShape_i);
-      }
-    }
-  }
-}
-
-void OCC_Internals::buildLists()
-{
-  _somap.Clear();
-  _shmap.Clear();
-  _fmap.Clear();
-  _wmap.Clear();
-  _emap.Clear();
-  _vmap.Clear();
-  _addShapeToMaps(_shape);
-}
-
-void OCC_Internals::buildShapeFromGModel(GModel* gm)
-{
-  _somap.Clear();
-  _shmap.Clear();
-  _fmap.Clear();
-  _wmap.Clear();
-  _emap.Clear();
-  _vmap.Clear();
-  for (GModel::riter it = gm->firstRegion(); it != gm->lastRegion() ; ++it){
-    if ((*it)->getNativeType() == GEntity::OpenCascadeModel){
-      OCCRegion *occ = static_cast<OCCRegion*> (*it);
-      if(occ) _addShapeToMaps(occ->getTopoDS_Shape());
-    }
-  }
-  for (GModel::fiter it = gm->firstFace(); it != gm->lastFace() ; ++it){
-    if ((*it)->getNativeType() == GEntity::OpenCascadeModel){
-      OCCFace *occ = static_cast<OCCFace*> (*it);
-      if(occ) _addShapeToMaps(occ->getTopoDS_Face());
-    }
-  }
-  BRep_Builder B;
-  TopoDS_Compound C;
-  B.MakeCompound(C);
-  for(int i = 1; i <= _vmap.Extent(); i++) B.Add(C, _vmap(i));
-  for(int i = 1; i <= _emap.Extent(); i++) B.Add(C, _emap(i));
-  for(int i = 1; i <= _wmap.Extent(); i++) B.Add(C, _wmap(i));
-  for(int i = 1; i <= _fmap.Extent(); i++) B.Add(C, _fmap(i));
-  for(int i = 1; i <= _shmap.Extent(); i++) B.Add(C, _shmap(i));
-  for(int i = 1; i <= _somap.Extent(); i++) B.Add(C, _somap(i));
-  _shape = C;
-}
-
-void OCC_Internals::buildShapeFromLists(TopoDS_Shape shape)
-{
-  BRep_Builder B;
-  TopoDS_Compound C;
-  B.MakeCompound(C);
-
-  TopTools_ListOfShape theList;
-  addSimpleShapes(shape, theList);
-  TopTools_ListIteratorOfListOfShape itSub1(theList);
-  for (; itSub1.More(); itSub1.Next()) B.Add(C, itSub1.Value());
-
-  for(int i = 1; i <= _vmap.Extent(); i++) B.Add(C, _vmap(i));
-  for(int i = 1; i <= _emap.Extent(); i++) B.Add(C, _emap(i));
-  for(int i = 1; i <= _wmap.Extent(); i++) B.Add(C, _wmap(i));
-  for(int i = 1; i <= _fmap.Extent(); i++) B.Add(C, _fmap(i));
-  for(int i = 1; i <= _shmap.Extent(); i++) B.Add(C, _shmap(i));
-  for(int i = 1; i <= _somap.Extent(); i++) B.Add(C, _somap(i));
-  _shape = C;
-}
-
-GVertex *OCC_Internals::addVertexToModel(GModel *model, TopoDS_Vertex vertex)
-{
-  GVertex *gv = getVertexForOCCShape(model, vertex);
-  if(gv) return gv;
-  _addShapeToMaps(vertex);
-  buildShapeFromLists(vertex);
-  buildGModel(model);
-  return getVertexForOCCShape(model, vertex);
-}
-
-GEdge *OCC_Internals::addEdgeToModel(GModel *model, TopoDS_Edge edge)
-{
-  GEdge *ge = getEdgeForOCCShape(model, edge);
-  if(ge) return ge;
-  _addShapeToMaps(edge);
-  buildShapeFromLists(edge);
-  buildGModel(model);
-  return getEdgeForOCCShape(model, edge);
-}
-
-GFace* OCC_Internals::addFaceToModel(GModel *model, TopoDS_Face face)
-{
-  GFace *gf = getFaceForOCCShape(model, face);
-  if(gf) return gf;
-  _addShapeToMaps(face);
-  buildShapeFromLists(face);
-  buildGModel(model);
-  return getFaceForOCCShape(model, face);
-}
-
-GRegion* OCC_Internals::addRegionToModel(GModel *model, TopoDS_Solid region)
-{
-  GRegion *gr = getRegionForOCCShape(model, region);
-  if(gr) return gr;
-
-  //   FIXME THE PREVIOUS IMPLEMENTATION WAS BETTER FOR SOME USERS :-)
-  buildShapeFromLists(region);
-  model->destroy();
-  buildLists();
-  buildGModel(model);
-  return getRegionForOCCShape(model, region);
-  //  _addShapeToMaps(region);
-  //  buildShapeFromLists(region);
-  //  buildGModel(model);
-  //  return getRegionForOCCShape(model, region);
-}
-
-void OCC_Internals::buildGModel(GModel *model)
-{
-  // building geom vertices
-  int numv = model->getMaxElementaryNumber(0) + 1;
-  for(int i = 1; i <= _vmap.Extent(); i++){
-    TopoDS_Vertex vertex = TopoDS::Vertex(_vmap(i));
-    if(!getVertexForOCCShape(model, vertex)){
-      model->add(new OCCVertex(model, numv, vertex));
-      numv++;
-    }
-  }
-
-  // building geom edges
-  int nume = model->getMaxElementaryNumber(1) + 1;
-  for(int i = 1; i <= _emap.Extent(); i++){
-    int i1 = _vmap.FindIndex(TopExp::FirstVertex(TopoDS::Edge(_emap(i))));
-    int i2 = _vmap.FindIndex(TopExp::LastVertex(TopoDS::Edge(_emap(i))));
-    if(!getEdgeForOCCShape(model, TopoDS::Edge(_emap(i)))){
-      GVertex *v1 = getVertexForOCCShape(model, TopoDS::Vertex(_vmap(i1)));
-      GVertex *v2 = getVertexForOCCShape(model, TopoDS::Vertex(_vmap(i2)));
-      model->add(new OCCEdge(model, TopoDS::Edge(_emap(i)), nume, v1, v2));
-      nume++;
-    }
-  }
-
-  // building geom faces
-  int numf = model->getMaxElementaryNumber(2) + 1;
-  for(int i = 1; i <= _fmap.Extent(); i++){
-    if(!getFaceForOCCShape(model, TopoDS::Face(_fmap(i)))){
-      model->add(new OCCFace(model, TopoDS::Face(_fmap(i)), numf));
-      numf++;
-    }
-  }
-
-  // building geom regions
-  int numr = model->getMaxElementaryNumber(3) + 1;
-  for(int i = 1; i <= _somap.Extent(); i++){
-    if(!getRegionForOCCShape(model, TopoDS::Solid(_somap(i)))){
-      model->add(new OCCRegion(model, TopoDS::Solid(_somap(i)), numr));
-      numr++;
-    }
-  }
-}
-
-void OCC_Internals::applyBooleanOperator(TopoDS_Shape tool, const BooleanOperator &op)
-{
-  if(tool.IsNull()) return;
-  if(_shape.IsNull()){
-    _shape = tool;
-    return;
-  }
-
-  switch(op){
-  case OCC_Internals::Intersection :
-    {
-      TopoDS_Shape theNewShape;
-      BRep_Builder B;
-      TopoDS_Compound C;
-      B.MakeCompound(C);
-      TopTools_ListOfShape listShape1, listShape2;
-      addSimpleShapes(_shape, listShape1);
-      addSimpleShapes(tool, listShape2);
-      Standard_Boolean isCompound =
-        (listShape1.Extent() > 1 || listShape2.Extent() > 1);
-
-      TopTools_ListIteratorOfListOfShape itSub1(listShape1);
-      for(; itSub1.More(); itSub1.Next()) {
-        TopoDS_Shape aValue1 = itSub1.Value();
-        TopTools_ListIteratorOfListOfShape itSub2(listShape2);
-        for(; itSub2.More(); itSub2.Next()) {
-          TopoDS_Shape aValue2 = itSub2.Value();
-          BRepAlgoAPI_Common BO(aValue1, aValue2);
-          if(!BO.IsDone()) {
-            Msg::Error("Boolean Intersection Operator can not be performed");
-          }
-          if(isCompound) {
-            TopoDS_Shape aStepResult = BO.Shape();
-            if(aStepResult.ShapeType() == TopAbs_COMPOUND) {
-              TopoDS_Iterator aCompIter(aStepResult);
-              for(; aCompIter.More(); aCompIter.Next()) {
-                B.Add(C, aCompIter.Value());
-              }
-            }
-            else {
-              B.Add(C, aStepResult);
-            }
-          }
-          else
-            theNewShape = BO.Shape();
-        }
-      }
-      if(isCompound) {
-        TopTools_ListOfShape listShapeC;
-        addSimpleShapes(C, listShapeC);
-        TopTools_ListIteratorOfListOfShape itSubC(listShapeC);
-        //bool isOnlySolids = true;
-        for(; itSubC.More(); itSubC.Next()) {
-          TopoDS_Shape aValueC = itSubC.Value();
-          //if(aValueC.ShapeType() != TopAbs_SOLID) isOnlySolids = false;
-        }
-        // if(isOnlySolids)
-        //   theNewShape = GlueFaces(C, Precision::Confusion());
-        // else
-        theNewShape = C;
-      }
-      _shape = theNewShape;
-    }
-    break;
-  case OCC_Internals::Difference :
-    {
-      TopoDS_Shape theNewShape;
-      BRep_Builder B;
-      TopoDS_Compound C;
-      B.MakeCompound(C);
-
-      TopTools_ListOfShape listShapes, listTools;
-      addSimpleShapes(_shape, listShapes);
-      addSimpleShapes(tool, listTools);
-
-      Standard_Boolean isCompound = (listShapes.Extent() > 1);
-
-      TopTools_ListIteratorOfListOfShape itSub1(listShapes);
-      for(; itSub1.More(); itSub1.Next()) {
-        TopoDS_Shape aCut = itSub1.Value();
-        // tools
-        TopTools_ListIteratorOfListOfShape itSub2(listTools);
-        for(; itSub2.More(); itSub2.Next()) {
-          TopoDS_Shape aTool = itSub2.Value();
-          BRepAlgoAPI_Cut BO(aCut, aTool);
-          if(!BO.IsDone()) {
-            Msg::Error("Cut operation can not be performed on the given shapes");
-            return;
-          }
-          aCut = BO.Shape();
-        }
-        if(isCompound) {
-          if(aCut.ShapeType() == TopAbs_COMPOUND) {
-            TopoDS_Iterator aCompIter(aCut);
-            for(; aCompIter.More(); aCompIter.Next()) {
-              B.Add(C, aCompIter.Value());
-            }
-          }
-          else {
-            B.Add(C, aCut);
-          }
-        }
-        else
-          theNewShape = aCut;
-      }
-
-      if(isCompound) {
-        TopTools_ListOfShape listShapeC;
-        addSimpleShapes(C, listShapeC);
-        TopTools_ListIteratorOfListOfShape itSubC(listShapeC);
-        //bool isOnlySolids = true;
-        for(; itSubC.More(); itSubC.Next()) {
-          TopoDS_Shape aValueC = itSubC.Value();
-          //if(aValueC.ShapeType() != TopAbs_SOLID) isOnlySolids = false;
-        }
-        // if(isOnlySolids)
-        //   theNewShape = GlueFaces(C, Precision::Confusion());
-        // else
-        theNewShape = C;
-      }
-      _shape = theNewShape;
-    }
-    break;
-  case OCC_Internals::Union :
-    {
-      TopoDS_Solid solid1, solid2;
-      int hack = 0;
-      if(_shape.ShapeType() != TopAbs_SOLID && tool.ShapeType() != TopAbs_SOLID){
-        TopExp_Explorer exp0;
-        for(exp0.Init(_shape, TopAbs_SOLID); exp0.More(); exp0.Next()){
-          solid1 = TopoDS::Solid(exp0.Current());
-          hack++;
-          break;
-        }
-        for(exp0.Init(tool, TopAbs_SOLID); exp0.More(); exp0.Next()){
-          solid2 = TopoDS::Solid(exp0.Current());
-          hack++;
-          break;
-        }
-      }
-      if(hack == 2){ // FIXME: just a temp hack!
-        Msg::Info("Temporary hack in Fuse :-)");
-        BRepAlgoAPI_Fuse BO(solid1, solid2);
-        if(!BO.IsDone()) {
-          Msg::Error("Fuse operation can not be performed on the given shapes");
-        }
-        _shape = BO.Shape();
-      }
-      else{
-        BRepAlgoAPI_Fuse BO(tool, _shape);
-        if(!BO.IsDone()) {
-          Msg::Error("Fuse operation can not be performed on the given shapes");
-        }
-        _shape = BO.Shape();
-      }
-    }
-    break;
-  case OCC_Internals::Section :
-    {
-      TopoDS_Shape theNewShape;
-      BRep_Builder B;
-      TopoDS_Compound C;
-      B.MakeCompound(C);
-
-      TopTools_ListOfShape listShapes, listTools;
-      addSimpleShapes(_shape, listShapes);
-      addSimpleShapes(tool, listTools);
-
-      Standard_Boolean isCompound = (listShapes.Extent() > 1);
-      TopTools_ListIteratorOfListOfShape itSub1(listShapes);
-      for(; itSub1.More(); itSub1.Next()) {
-        TopoDS_Shape aValue1 = itSub1.Value();
-        TopTools_ListIteratorOfListOfShape itSub2(listTools);
-        for(; itSub2.More(); itSub2.Next()) {
-          TopoDS_Shape aValue2 = itSub2.Value();
-          BRepAlgoAPI_Section BO(aValue1, aValue2, Standard_False);
-          BO.Approximation(Standard_True);
-          BO.Build();
-          if(!BO.IsDone()) {
-            Msg::Error("Section operation can not be performed on the given shapes");
-            return;
-          }
-          if(isCompound) {
-            TopoDS_Shape aStepResult = BO.Shape();
-            if(aStepResult.ShapeType() == TopAbs_COMPOUND) {
-              TopoDS_Iterator aCompIter(aStepResult);
-              for(; aCompIter.More(); aCompIter.Next()) {
-                B.Add(C, aCompIter.Value());
-              }
-            }
-            else {
-              B.Add(C, aStepResult);
-            }
-          }
-          else
-            theNewShape = BO.Shape();
-        }
-      }
-      if(isCompound)
-        theNewShape = C;
-      _shape = theNewShape;
-    }
-    break;
-  default :
-    Msg::Error("Requested boolean operation not implemented");
-    break;
-  }
-}
-
-void OCC_Internals::fillet(std::vector<TopoDS_Edge> &edgesToFillet,
-                           double Radius)
-{
-  // create a tool for fillet
-  BRepFilletAPI_MakeFillet fill(_shape);
-  for(unsigned int i = 0; i < edgesToFillet.size(); ++i){
-    fill.Add(edgesToFillet[i]);
-  }
-  for(int i = 1; i <= fill.NbContours(); i++){
-    fill.SetRadius(Radius, i, 1);
-  }
-  fill.Build();
-  if(!fill.IsDone()) {
-    Msg::Error("Fillet can't be computed on the given shape with the given radius");
-    return;
-  }
-  _shape = fill.Shape();
-
-  if(_shape.IsNull()) return;
-
-  // Check shape validity
-  BRepCheck_Analyzer ana(_shape, false);
-  if(!ana.IsValid()) {
-    Msg::Error("Fillet algorithm have produced an invalid shape result");
-  }
-}
-
-// FIXME ***************** END OF WILL BE REMOVED ************************
 
 #endif
 
diff --git a/Geo/GModelIO_OCC.h b/Geo/GModelIO_OCC.h
index 78659be2fd8661fe3d0c75972b94f2d8b4340f2e..ced922d2515ae4b9d70d2638808f0208c07bd9d0 100644
--- a/Geo/GModelIO_OCC.h
+++ b/Geo/GModelIO_OCC.h
@@ -98,6 +98,9 @@ class OCC_Internals {
   // get the tag of a shape of a given dimension
   int _find(int dim, TopoDS_Shape shape);
 
+  // get maximum dimension of shape bound to tag
+  int _getMaxDim();
+
   // get (dim,tag) of all shapes (that will be) bound to tags
   void _getAllDimTags(std::vector<std::pair<int, int> > &dimTags, int dim=99);
 
@@ -362,36 +365,6 @@ class OCC_Internals {
   bool makeTorusSTL(double x, double y, double z, double r1, double r2, double angle,
                     std::vector<SPoint3> &vertices, std::vector<SVector3> &normals,
                     std::vector<int> &triangles);
-
-  // *** FIXME what follows will be removed ***
- private:
-  TopoDS_Shape _shape;
- public:
-  void _addShapeToLists(TopoDS_Shape shape){ _addShapeToMaps(shape); }
-  void _healGeometry(double tolerance, bool fixdegenerated,
-                     bool fixsmalledges, bool fixspotstripfaces, bool sewfaces,
-                     bool makesolids=false, double scaling=0.0)
-  {
-    _healShape(_shape, tolerance, fixdegenerated, fixsmalledges,
-               fixspotstripfaces, sewfaces, makesolids, scaling);
-  }
-  void applyBooleanOperator(TopoDS_Shape tool, const BooleanOperator &op);
-  TopoDS_Shape getShape () { return _shape; }
-  void buildLists();
-  void buildShapeFromLists(TopoDS_Shape shape);
-  void fillet(std::vector<TopoDS_Edge> &shapes, double radius);
-  void buildShapeFromGModel(GModel*);
-  void buildGModel(GModel *gm);
-  void loadShape(const TopoDS_Shape *s)
-  {
-    std::vector<std::pair<int, int> > outDimTags;
-    importShapes(s, false, outDimTags);
-  }
-  GVertex *addVertexToModel(GModel *model, TopoDS_Vertex v);
-  GEdge *addEdgeToModel(GModel *model, TopoDS_Edge e);
-  GFace *addFaceToModel(GModel *model, TopoDS_Face f);
-  GRegion *addRegionToModel(GModel *model, TopoDS_Solid r);
-  // *** FIXME end of stuff that will be removed ***
 };
 
 #else
diff --git a/Geo/Geo.cpp b/Geo/Geo.cpp
index 861f1e02db063d5ef596151d5dbdeadeed8d81f5..1197604ea86a3451b4f56eb135268832024cb190 100644
--- a/Geo/Geo.cpp
+++ b/Geo/Geo.cpp
@@ -3596,7 +3596,7 @@ bool IntersectCurvesWithSurface(List_T *curve_ids, int surface_id, List_T *shape
       }
     }
     else{
-      Msg::Error("Uknown curve %d", (int)curve_id);
+      Msg::Error("Unknown curve %d", (int)curve_id);
       return false;
     }
   }
diff --git a/Geo/MQuadrangle.cpp b/Geo/MQuadrangle.cpp
index 39ec97ab0728128da5b63854b0fa269eb83ef8ac..e3c56f5144d0c984e5ef899a6cddc6b0d8f00d2a 100644
--- a/Geo/MQuadrangle.cpp
+++ b/Geo/MQuadrangle.cpp
@@ -9,6 +9,7 @@
 #include "Context.h"
 #include "Numeric.h"
 #include "BasisFactory.h"
+#include "pointsGenerators.h"
 
 #if defined(HAVE_MESH)
 #include "qualityMeasures.h"
@@ -369,15 +370,16 @@ void MQuadrangleN::reverse()
   }
 }
 
-void MQuadrangle::reorient(int rot, bool swap) {
+void MQuadrangle::reorient(int rot, bool swap)
+{
   MVertex* tmp[4];
   if (swap) for (int i=0;i<4;i++) tmp[i] = _v[(4-i+rot)%4];
   else      for (int i=0;i<4;i++) tmp[i] = _v[(4+i-rot)%4];
   std::memcpy(_v,tmp,4*sizeof(MVertex*));
 }
 
-void MQuadrangle8::reorient(int rot, bool swap) {
-
+void MQuadrangle8::reorient(int rot, bool swap)
+{
   if (rot == 0 && !swap) return;
 
   MQuadrangle::reorient(rot,swap);
@@ -387,8 +389,8 @@ void MQuadrangle8::reorient(int rot, bool swap) {
   std::memcpy(_vs,tmp,4*sizeof(MVertex*));
 }
 
-void MQuadrangle9::reorient(int rot, bool swap) {
-
+void MQuadrangle9::reorient(int rot, bool swap)
+{
   if (rot == 0 && !swap) return;
 
   MQuadrangle::reorient(rot,swap);
@@ -398,46 +400,67 @@ void MQuadrangle9::reorient(int rot, bool swap) {
   std::memcpy(_vs,tmp,4*sizeof(MVertex*));
 }
 
-void MQuadrangleN::reorient(int rot, bool swap) {
+std::map<TupleReorientation, IndicesReoriented> MQuadrangleN::_tuple2indicesReoriented;
+
+namespace
+{
+  void _getIndicesReorientedQuad(int order, int rot, bool swap,
+                                 IndicesReoriented &indices)
+  {
+    fullMatrix<double> ref = gmshGenerateMonomialsQuadrangle(order);
+    ref.add(- order / 2.);
+
+    indices.resize(ref.size1());
+    for (int i = 0; i < ref.size1(); ++i) {
+      double u = ref(i, 0);
+      double v = ref(i, 1);
+      double tmp = u;
+      switch (rot) {
+        case 1: u =  v; v = -tmp; break;
+        case 2: u = -u; v =   -v; break;
+        case 3: u = -v; v =  tmp; break;
+      }
+      if (swap) {
+        tmp = u;
+        u = v;
+        v = tmp;
+      }
+      for (int j = 0; j < ref.size1(); ++j) {
+        if (u == ref(j, 0) && v == ref(j, 1)) {
+          indices[i] = j;
+          break;
+        }
+      }
+    }
+  }
+}
 
+void MQuadrangleN::reorient(int rot, bool swap)
+{
   if (rot == 0 && !swap) return;
 
-  MQuadrangle::reorient(rot,swap);
-  int order  = getPolynomialOrder();
-  int nbEdgePts = order - 1;
-  unsigned int idx = 0;
+  TupleReorientation mytuple(getTypeForMSH(), std::make_pair(rot, swap));
+  std::map<TupleReorientation, IndicesReoriented>::iterator it;
+  it = _tuple2indicesReoriented.find(mytuple);
+  if (it == _tuple2indicesReoriented.end()) {
+    IndicesReoriented indices;
+    _getIndicesReorientedQuad(_order, rot, swap, indices);
+    _tuple2indicesReoriented[mytuple] = indices;
+    it = _tuple2indicesReoriented.find(mytuple);
+  }
 
-  std::vector<MVertex*> tmp;
+  IndicesReoriented &indices = it->second;
 
-  if (swap) {
-    for (int iEdge=0;iEdge<4;iEdge++) {
-      int edgeIdx = ((7-iEdge+rot)%4)*nbEdgePts;
-      for (int i=nbEdgePts-1;i>=0;i--) tmp.push_back(_vs[edgeIdx+i]);
-    }
-  }
-  else {
-    for (int iEdge=0;iEdge<4;iEdge++) {
-      int edgeIdx = ((4+iEdge-rot)%4)*nbEdgePts;
-      for (int i=0;i<nbEdgePts;i++)    tmp.push_back(_vs[edgeIdx+i]);
-    }
-  }
+  // copy vertices
+  std::vector<MVertex*> oldv(4 + _vs.size());
+  std::copy(_v, _v+4, oldv.begin());
+  std::copy(_vs.begin(), _vs.end(), oldv.begin()+4);
 
-  idx += 4*nbEdgePts;
-
-  if (_vs.size() >= idx) {
-    nbEdgePts = order - 3;
-    if (order > 2) {
-      if (swap) for (int i=0;i<4;i++) tmp.push_back(_vs[idx + (4-i+rot)%4]);
-      else      for (int i=0;i<4;i++) tmp.push_back(_vs[idx + (4+i-rot)%4]);
-      idx += 4;
-      if (order > 3) {
-        if (swap) for (int i=0;i<4;i++) tmp.push_back(_vs[idx + (7-i+rot)%4]);
-        else      for (int i=0;i<4;i++) tmp.push_back(_vs[idx + (4+i-rot)%4]);
-        idx += 4;
-        if (order > 4) Msg::Error("Reorientation of quad not supported above order 4");
-      }
-    }
-    tmp.push_back(_vs[idx]);
+  // reorient
+  for (int i = 0; i < 4; ++i) {
+    _v[i] = oldv[indices[i]];
+  }
+  for (unsigned int i = 0; i < _vs.size(); ++i) {
+    _vs[i] = oldv[indices[4+i]];
   }
-  _vs = tmp;
 }
diff --git a/Geo/MQuadrangle.h b/Geo/MQuadrangle.h
index 067d6a138e0c1ca18d92c0a2e94d037cca1dd475..15cb09446efdc2fdf675c7d849e84a9403fadfc1 100644
--- a/Geo/MQuadrangle.h
+++ b/Geo/MQuadrangle.h
@@ -351,6 +351,9 @@ class MQuadrangle9 : public MQuadrangle {
   }
 };
 
+typedef std::vector<int> IndicesReoriented;
+typedef std::pair<int, std::pair<int,int> > TupleReorientation;
+
 /*
  * MQuadrangle
  *
@@ -368,6 +371,7 @@ class MQuadrangle9 : public MQuadrangle {
  *
  */
 class MQuadrangleN : public MQuadrangle {
+  static std::map<TupleReorientation, IndicesReoriented> _tuple2indicesReoriented;
  protected:
   std::vector<MVertex *> _vs;
   const char _order;
diff --git a/Geo/MTriangle.cpp b/Geo/MTriangle.cpp
index 51a729cb3eb49efeb14aeab51faf75c2928d412b..7f4a9c7a54362d21d2bb7917c390f68df2693e56 100644
--- a/Geo/MTriangle.cpp
+++ b/Geo/MTriangle.cpp
@@ -8,6 +8,7 @@
 #include "Numeric.h"
 #include "Context.h"
 #include "BasisFactory.h"
+#include "pointsGenerators.h"
 
 #if defined(HAVE_MESH)
 #include "qualityMeasures.h"
@@ -330,40 +331,65 @@ void MTriangle6::reorient(int rot, bool swap)
   else      for (int i=0;i<3;i++) _vs[i] = tmp[(3-rot+i)%3];
 }
 
+std::map<TupleReorientation, IndicesReoriented> MTriangleN::_tuple2indicesReoriented;
+
+namespace
+{
+  void _getIndicesReorientedTri(int order, int rot, bool swap,
+                                IndicesReoriented &indices)
+  {
+    fullMatrix<double> ref = gmshGenerateMonomialsTriangle(order);
+
+    indices.resize(ref.size1());
+    for (int i = 0; i < ref.size1(); ++i) {
+      double u = ref(i, 0);
+      double v = ref(i, 1);
+      double tmp;
+      switch (rot) {
+        case 1: tmp = u; u = order - u - v; v = tmp; break;
+        case 2: tmp = v; v = order - u - v; u = tmp; break;
+      }
+      if (swap) {
+        tmp = u;
+        u = v;
+        v = tmp;
+      }
+      for (int j = 0; j < ref.size1(); ++j) {
+        if (u == ref(j, 0) && v == ref(j, 1)) {
+          indices[i] = j;
+          break;
+        }
+      }
+    }
+  }
+}
+
 void MTriangleN::reorient(int rot, bool swap)
 {
   if (rot == 0 && !swap) return;
 
-  MTriangle::reorient(rot,swap);
-
-  std::vector<MVertex*> tmp;
-  int order  = getPolynomialOrder();
-  int nbEdge =  order - 1;
-  unsigned int idx = 0;
-
-  if (swap) {
-    for (int iEdge=0;iEdge<3;iEdge++) {
-      int edgeIdx = ((5-iEdge+rot)%3)*nbEdge;
-      for (int i=nbEdge-1;i>=0;i--) tmp.push_back(_vs[edgeIdx + i]);
-    }
-  }
-  else {
-    for (int iEdge=0;iEdge<3;iEdge++) {
-      int edgeIdx = ((3+iEdge-rot)%3)*nbEdge;
-      for (int i=0;i<nbEdge;i++) tmp.push_back(_vs[edgeIdx + i]);
-    }
+  TupleReorientation mytuple(getTypeForMSH(), std::make_pair(rot, swap));
+  std::map<TupleReorientation, IndicesReoriented>::iterator it;
+  it = _tuple2indicesReoriented.find(mytuple);
+  if (it == _tuple2indicesReoriented.end()) {
+    IndicesReoriented indices;
+    _getIndicesReorientedTri(_order, rot, swap, indices);
+    _tuple2indicesReoriented[mytuple] = indices;
+    it = _tuple2indicesReoriented.find(mytuple);
   }
 
-  idx += 3*nbEdge;
+  IndicesReoriented &indices = it->second;
 
-  if (_vs.size() > idx) {
-    if (order == 3) tmp.push_back(_vs[idx]);
-    if (order == 4) {
-      if (swap) for(int i=0;i<3;i++) tmp.push_back(_vs[idx+(3+rot-i)%3]);
-      else      for(int i=0;i<3;i++) tmp.push_back(_vs[idx+(3+i-rot)%3]);
-    }
-    if (order >=5)
-      Msg::Error("Reorientation of a triangle not supported above order 4");
+  // copy vertices
+  std::vector<MVertex*> oldv(3 + _vs.size());
+  std::copy(_v, _v+4, oldv.begin());
+  std::copy(_vs.begin(), _vs.end(), oldv.begin()+4);
+
+  // reorient
+  for (int i = 0; i < 3; ++i) {
+    _v[i] = oldv[indices[i]];
+  }
+  for (unsigned int i = 0; i < _vs.size(); ++i) {
+    _vs[i] = oldv[indices[3+i]];
   }
-  _vs = tmp;
 }
diff --git a/Geo/MTriangle.h b/Geo/MTriangle.h
index 795340c31c0371167307e7b3b2e00a70124e469e..098f0a24c663dd244c8c978a50ea019ceb16c700 100644
--- a/Geo/MTriangle.h
+++ b/Geo/MTriangle.h
@@ -246,6 +246,9 @@ class MTriangle6 : public MTriangle {
   virtual void reorient(int rotation, bool swap);
 };
 
+typedef std::vector<int> IndicesReoriented;
+typedef std::pair<int, std::pair<int,int> > TupleReorientation;
+
 /*
  * MTriangleN  FIXME: check the plot
  *
@@ -263,6 +266,7 @@ class MTriangle6 : public MTriangle {
  *
  */
 class MTriangleN : public MTriangle {
+  static std::map<TupleReorientation, IndicesReoriented> _tuple2indicesReoriented;
  protected:
   std::vector<MVertex *> _vs;
   const char _order;
diff --git a/Mesh/Field.cpp b/Mesh/Field.cpp
index 009aa25806224182ae08bb4602f6b11bc7cb9500..930e723ba4f85acb43c961c8d4fe496afd32e055 100644
--- a/Mesh/Field.cpp
+++ b/Mesh/Field.cpp
@@ -1866,7 +1866,7 @@ class AttractorAnisoCurveField : public Field {
       (n_nodes_by_edge, "Number of nodes used to discretized each curve",
        &update_needed);
     options["dMin"] = new FieldOptionDouble
-      (dMin, "Minimum distance, bellow this distance from the curves, "
+      (dMin, "Minimum distance, below this distance from the curves, "
        "prescribe the minimum mesh sizes.");
     options["dMax"] = new FieldOptionDouble
       (dMax, "Maxmium distance, above this distance from the curves, prescribe "
@@ -2218,24 +2218,24 @@ using namespace nanoflann;
 struct PointCloud
 {
   std::vector<SPoint3>  pts;
-}; 
+};
 
 // And this is the "dataset to kd-tree" adaptor class:
 template <typename Derived>
 struct PointCloudAdaptor
 {
-  
+
   const Derived &obj; //!< A const ref to the data set origin
-  
+
   /// The constructor that sets the data set source
   PointCloudAdaptor(const Derived &obj_) : obj(obj_) { }
-  
+
   /// CRTP helper method
   inline const Derived& derived() const { return obj; }
-  
+
   // Must return the number of data points
   inline size_t kdtree_get_point_count() const { return derived().pts.size(); }
-  
+
   // Returns the distance between the vector "p1[0:size-1]" and the data point with index "idx_p2" stored in the class:
   inline double kdtree_distance(const double *p1, const size_t idx_p2,size_t /*size*/) const
   {
@@ -2254,7 +2254,7 @@ struct PointCloudAdaptor
     else if (dim==1) return derived().pts[idx].y();
     else return derived().pts[idx].z();
   }
-  
+
   // Optional bounding-box computation: return false to default to a standard bbox computation loop.
   //   Return true if the BBOX was already computed by the class and returned in "bb" so it can be avoided to redo it again.
   //   Look at bb.size() to find out the expected dimensionality (e.g. 2 or 3 for point clouds)
@@ -2271,7 +2271,7 @@ typedef KDTreeSingleIndexAdaptor<
   PC2KD, 3 > my_kd_tree_t;
 
 class DistanceField : public Field
-{  
+{
   std::list<int> nodes_id, edges_id, faces_id;
   int _xFieldId, _yFieldId, _zFieldId;
   Field *_xField, *_yField, *_zField;
@@ -2344,7 +2344,7 @@ public:
 	  }
 	}
       }
-      
+
       for(std::list<int>::iterator it = nodes_id.begin();
           it != nodes_id.end(); ++it) {
 	GVertex *gv = GModel::current()->getVertexByTag(*it);
@@ -2356,7 +2356,7 @@ public:
 	GEdge *e = GModel::current()->getEdgeByTag(*it);
 	if(e) {
 	  if (e->mesh_vertices.size()){
-	    for(unsigned int i = 0; i < e->mesh_vertices.size(); i++) 
+	    for(unsigned int i = 0; i < e->mesh_vertices.size(); i++)
               points.push_back(SPoint3(e->mesh_vertices[i]->x(),
 				       e->mesh_vertices[i]->y(),
 				       e->mesh_vertices[i]->z()));
@@ -2370,18 +2370,18 @@ public:
 	    points.push_back(SPoint3(gp.x(),gp.y(),gp.z()));
 	  }
 	}
-      }      
-      
+      }
+
       // construct a kd-tree index:
-      
+
       //      printf("Constructing kd-tree with %lu points\n",points.size());
-      
+
       index = new my_kd_tree_t(3 , pc2kd, KDTreeSingleIndexAdaptorParams(10) );
       index->buildIndex();
       update_needed=false;
     }
   }
-  
+
   using Field::operator();
   virtual double operator() (double X, double Y, double Z, GEntity *ge=0)
   {
diff --git a/Mesh/Generator.cpp b/Mesh/Generator.cpp
index bcaa81d163a17e2e300357c8c354f6aabe01ff3d..5a774d171d72cba44dbb6ffb2574838688296492 100644
--- a/Mesh/Generator.cpp
+++ b/Mesh/Generator.cpp
@@ -312,13 +312,16 @@ static void Mesh0D(GModel *m)
 
 static void Mesh1D(GModel *m)
 {
-
   m->getFields()->initialize();
 
   if(TooManyElements(m, 1)) return;
   Msg::StatusBar(true, "Meshing 1D...");
   double t1 = Cpu();
 
+  int prevNumThreads = Msg::GetMaxThreads();
+  if(CTX::instance()->mesh.maxNumThreads1D > 0 &&
+     CTX::instance()->mesh.maxNumThreads1D <= Msg::GetMaxThreads())
+    Msg::SetNumThreads(CTX::instance()->mesh.maxNumThreads1D);
 
   std::vector<GEdge*> temp;
   for(GModel::eiter it = m->firstEdge(); it != m->lastEdge(); ++it){
@@ -353,6 +356,8 @@ static void Mesh1D(GModel *m)
     if(nIter++ > 10) break;
   }
 
+  Msg::SetNumThreads(prevNumThreads);
+
   double t2 = Cpu();
   CTX::instance()->meshTimer[0] = t2 - t1;
   Msg::StatusBar(true, "Done meshing 1D (%g s)", CTX::instance()->meshTimer[0]);
@@ -430,6 +435,11 @@ static void Mesh2D(GModel *m)
   Msg::StatusBar(true, "Meshing 2D...");
   double t1 = Cpu();
 
+  int prevNumThreads = Msg::GetMaxThreads();
+  if(CTX::instance()->mesh.maxNumThreads2D > 0 &&
+     CTX::instance()->mesh.maxNumThreads2D <= Msg::GetMaxThreads())
+    Msg::SetNumThreads(CTX::instance()->mesh.maxNumThreads2D);
+
   for(GModel::fiter it = m->firstFace(); it != m->lastFace(); ++it)
     (*it)->meshStatistics.status = GFace::PENDING;
 
@@ -528,6 +538,8 @@ static void Mesh2D(GModel *m)
 
   // collapseSmallEdges(*m);
 
+  Msg::SetNumThreads(prevNumThreads);
+
   double t2 = Cpu();
   CTX::instance()->meshTimer[1] = t2 - t1;
   Msg::StatusBar(true, "Done meshing 2D (%g s)", CTX::instance()->meshTimer[1]);
@@ -813,7 +825,7 @@ void TestConformity(GModel *gm)
       }
     }
   }
-  if (!count)Msg::Info("Mesh Conformity: OK");
+  if (!count) Msg::Info("Mesh Conformity: OK");
   else Msg::Error ("Mesh is not conforming (%d hanging faces)!",count);
 }
 
@@ -825,7 +837,10 @@ static void Mesh3D(GModel *m)
   Msg::StatusBar(true, "Meshing 3D...");
   double t1 = Cpu();
 
-  Msg::ResetProgressMeter();
+  int prevNumThreads = Msg::GetMaxThreads();
+  if(CTX::instance()->mesh.maxNumThreads3D > 0 &&
+     CTX::instance()->mesh.maxNumThreads3D <= Msg::GetMaxThreads())
+    Msg::SetNumThreads(CTX::instance()->mesh.maxNumThreads3D);
 
   if(m->getNumRegions())
     Msg::ProgressMeter(0, 100, false, "Meshing 3D...");
@@ -936,7 +951,7 @@ static void Mesh3D(GModel *m)
               nb_hexa_recombination*100./nb_elements_recombination);
     Msg::Info(".... Percentage of hexahedra (Vol) : %g",
               vol_hexa_recombination*100./vol_element_recombination);
-    //    MakeMeshConformal (m, 1);
+    // MakeMeshConformal (m, 1);
     TestConformity(m);
   }
 
@@ -950,16 +965,20 @@ static void Mesh3D(GModel *m)
 
   for (GModel::riter it = m->firstRegion(); it != m->lastRegion(); ++it) {
     if ((*it)->getNumMeshElements() == 0) {
-      Msg::Warning("Volume %d consists of no elements\n", (*it)->tag());
+      Msg::Warning("Volume %d consists of no elements", (*it)->tag());
     }
   }
 
   CTX::instance()->mesh.changed = ENT_ALL;
+
+  Msg::SetNumThreads(prevNumThreads);
+
   double t2 = Cpu();
   CTX::instance()->meshTimer[2] = t2 - t1;
 
   if(m->getNumRegions())
     Msg::ProgressMeter(100, 100, false, "Meshing 3D...");
+
   Msg::StatusBar(true, "Done meshing 3D (%g s)", CTX::instance()->meshTimer[2]);
 }
 
@@ -1053,6 +1072,9 @@ void GenerateMesh(GModel *m, int ask)
 
   Msg::ResetErrorCounter();
 
+  m->clearLastMeshEntityError();
+  m->clearLastMeshVertexError();
+
   int old = m->getMeshStatus(false);
 
   // Initialize pseudo random mesh generator with the same seed
diff --git a/Mesh/QuadTriExtruded3D.cpp b/Mesh/QuadTriExtruded3D.cpp
index 8bcdfe16a64b235499c10bd7c941a011a29a918d..37136bad4bbc18c7125179a93f3ae204754de7df 100644
--- a/Mesh/QuadTriExtruded3D.cpp
+++ b/Mesh/QuadTriExtruded3D.cpp
@@ -3841,7 +3841,7 @@ int QuadToTriEdgeGenerator(GRegion *gr,  CategorizedSourceElements &cat_src_elem
 }
 
 
-// Remesh the lateral 2D faces of QuadToTri regions using edges in quadToTri_edges as contraints
+// Remesh the lateral 2D faces of QuadToTri regions using edges in quadToTri_edges as constraints
 // Added 2010-01-24
 static bool QuadToTriLateralRemesh(GRegion *gr, std::set<std::pair<MVertex*,MVertex*> > &quadToTri_edges)
 {
diff --git a/Mesh/delaunay3d.cpp b/Mesh/delaunay3d.cpp
index c26d282d4ab1cefd1da6c633e288c2fe206d72ee..140f4a27853fb873eac7d4473eaa529b48b7591f 100644
--- a/Mesh/delaunay3d.cpp
+++ b/Mesh/delaunay3d.cpp
@@ -905,28 +905,59 @@ static bool fixDelaunayCavity (Vert *v,
   return false;
 }
 
-static void delaunayCavity2 (Tet *t,
-			    Tet *prev,
+static void delaunayCavity2 (Tet *tet,
+			    Tet *prevTet,
 			    Vert *v,
 			    cavityContainer &cavity,
 			    connContainer &bnd,
 			    int thread, int iPnt)
 {
-  t->set(thread, iPnt); // Mark the triangle
-  cavity.push_back(t);
-  for (int iNeigh=0; iNeigh<4 ; iNeigh++){
-    Tet *neigh = t->T[iNeigh];
-    if (neigh == NULL){
-      bnd.push_back(conn(t->getFace(iNeigh),iNeigh,neigh));
+  std::stack<std::pair<std::pair<Tet *, Tet *>, std::pair<int, int> > > stack;
+  bool finished = false;
+  Tet *t = tet;
+  Tet *prev = prevTet;
+  int iNeighStart = 0;
+  const int maxNumberNeigh = 4;
+  int iNeighEnd = maxNumberNeigh;
+  while (!finished) {
+    if (iNeighStart == 0){
+      t->set(thread, iPnt); // Mark the triangle
+      cavity.push_back(t);
     }
-    else if (neigh == prev){
+
+    for (int iNeigh = iNeighStart; iNeigh < iNeighEnd; iNeigh++){
+      Tet *neigh = t->T[iNeigh];
+      if (neigh == NULL){
+        bnd.push_back(conn(t->getFace(iNeigh), iNeigh, neigh));
+      }
+      else if (neigh == prev){
+      }
+      else if (!neigh->inSphere(v, thread)){
+        bnd.push_back(conn(t->getFace(iNeigh), iNeigh, neigh));
+        neigh->set(thread, iPnt);
+      }
+      else if (!(neigh->isSet(thread, iPnt))){
+        // First, add rest of neighbours to stack
+        stack.push(std::make_pair(std::make_pair(prev, t), std::make_pair(iNeigh + 1, maxNumberNeigh)));
+
+        // Second, add neighbour itself to stack
+        stack.push(std::make_pair(std::make_pair(t, neigh), std::make_pair(0, maxNumberNeigh)));
+
+        // Break out loop
+        break;
+      }
     }
-    else if (!neigh->inSphere(v,thread)){
-      bnd.push_back(conn(t->getFace(iNeigh),iNeigh,neigh));
-      neigh->set(thread, iPnt);
+
+    if (stack.empty()){
+      finished = true;
     }
-    else if (!(neigh->isSet(thread, iPnt))) {
-      delaunayCavity2 (neigh, t, v, cavity,bnd,thread, iPnt);
+    else{
+      const std::pair<std::pair<Tet *, Tet *>, std::pair<int, int> > &next = stack.top();
+      prev = next.first.first;
+      t = next.first.second;
+      iNeighStart = next.second.first;
+      iNeighEnd = next.second.second;
+      stack.pop();
     }
   }
 }
diff --git a/Mesh/meshGFace.cpp b/Mesh/meshGFace.cpp
index c3d6625f5d6e1b1708bd6a1c9aee7b331b8785d7..6508a69dea59f6bc99ff8e86ddc14ca47b230a0f 100644
--- a/Mesh/meshGFace.cpp
+++ b/Mesh/meshGFace.cpp
@@ -1598,12 +1598,21 @@ bool meshGenerator(GFace *gf, int RECUR_ITER,
 
   delete m;
 
-
-
   gf->quadrangles.insert(gf->quadrangles.begin(),blQuads.begin(),blQuads.end());
   gf->triangles.insert(gf->triangles.begin(),blTris.begin(),blTris.end());
   gf->mesh_vertices.insert(gf->mesh_vertices.begin(),verts.begin(),verts.end());
 
+#if defined(HAVE_ANN)
+  if (!CTX::instance()->mesh.recombineAll && !gf->meshAttributes.recombine){
+    FieldManager *fields = gf->model()->getFields();
+    BoundaryLayerField *blf = 0;
+    if(fields->getBoundaryLayerField() > 0){
+      Field *bl_field = fields->get(fields->getBoundaryLayerField());
+      blf = dynamic_cast<BoundaryLayerField*> (bl_field);
+      if (blf && !blf->iRecombine) quadsToTriangles(gf,10000);
+    }
+  }
+#endif
 
   if((CTX::instance()->mesh.recombineAll || gf->meshAttributes.recombine) &&
      !CTX::instance()->mesh.optimizeLloyd && !onlyInitialMesh && CTX::instance()->mesh.algoRecombine != 2)
diff --git a/Mesh/meshGFaceDelaunayInsertion.cpp b/Mesh/meshGFaceDelaunayInsertion.cpp
index 7f6b372bef9fe30388e978bf6121e9ab94feca26..37b7e568916088dadc7dd90b9ee8ef052cac24ec 100644
--- a/Mesh/meshGFaceDelaunayInsertion.cpp
+++ b/Mesh/meshGFaceDelaunayInsertion.cpp
@@ -1406,11 +1406,11 @@ void bowyerWatsonFrontal(GFace *gf,
       if (optimalPointFrontalB (gf,worst,active_edge,DATA,newPoint,metric)){
 	insertAPoint(gf, AllTris.end(), newPoint, metric, DATA, AllTris, &ActiveTris, worst);
       }
-    }    
+    }
   }
 
   nbSwaps = edgeSwapPass(gf, AllTris, SWCR_QUAL, DATA);
-  
+
   transferDataStructure(gf, AllTris, DATA);
   //  removeThreeTrianglesNodes(gf);
 
@@ -1794,7 +1794,7 @@ void bowyerWatsonParallelograms(GFace *gf,
     double t2 = Cpu();
     double DT = (double)(t2-t1);
     if (packed.size())
-      printf("points inserted DT %12.5E points per minute : %12.5E %d global searchs %d searchs per insertion\n",
+      printf("points inserted DT %12.5E points per minute : %12.5E %d global searches %d searches per insertion\n",
           DT,60.*packed.size()/DT,N_GLOBAL_SEARCH, (int)(N_SEARCH/packed.size()));
     transferDataStructure(gf, AllTris, DATA);
     backgroundMesh::unset();
@@ -1891,7 +1891,7 @@ void bowyerWatsonParallelogramsConstrained(GFace *gf,
   //  printf("%d vertices \n",(int)packed.size());
   //double t2 = Cpu();
   //double DT = t2-t1;
-  //if (packed.size())printf("points inserted DT %12.5E points per minut : %12.5E %d global searchs %d seachs per insertion\n",DT,60.*packed.size()/DT,N_GLOBAL_SEARCH,N_SEARCH / packed.size());
+  //if (packed.size())printf("points inserted DT %12.5E points per minut : %12.5E %d global searches %d seachs per insertion\n",DT,60.*packed.size()/DT,N_GLOBAL_SEARCH,N_SEARCH / packed.size());
   transferDataStructure(gf, AllTris, DATA);
   std::cout<<"out of transferDataStructure"<<std::endl;
   std::cout<<"testing all vertices of gf"<<std::endl;
diff --git a/Mesh/meshGFaceOptimize.cpp b/Mesh/meshGFaceOptimize.cpp
index 5ab5719a679801d8194aef7eefea28c2404d2598..bb9715703edcb45713c594e240fdb8a681d588ea 100644
--- a/Mesh/meshGFaceOptimize.cpp
+++ b/Mesh/meshGFaceOptimize.cpp
@@ -1522,17 +1522,16 @@ void quadsToTriangles(GFace *gf, double minqual)
       if (option == 1 || (option == 0 && qual1 > qual2)){
         gf->triangles.push_back(t11);
         gf->triangles.push_back(t12);
-	change[q] = std::make_pair(t11,t12);
+        change[q] = std::make_pair(t11,t12);
         delete t21; delete t22;
       }
       else {
         gf->triangles.push_back(t21);
         gf->triangles.push_back(t22);
-	change[q] = std::make_pair(t21,t22);
+        change[q] = std::make_pair(t21,t22);
         delete t11; delete t12;
       }
-      delete q; // FIXME this makes gmsh to crash when creating BL with triangles
-      // FIXED (JF)
+      delete q;
     }
     else {
       qds.push_back(q);
@@ -1542,23 +1541,42 @@ void quadsToTriangles(GFace *gf, double minqual)
 
   BoundaryLayerColumns* _columns = gf->getColumns();
   if (!_columns)return;
-  for ( std::map<MElement*,std::vector<MElement*> >::iterator it = _columns->_elemColumns.begin();
-	it != _columns->_elemColumns.end();it++){
-    std::vector<MElement *> &e = it->second;
-    std::vector<MElement *> eOld = e;
-    e.clear();
-    for (unsigned int i=0;i<eOld.size();i++){
-      MElement *ee = eOld[i];
-      std::map<MElement*, std::pair<MElement*,MElement*> >::iterator it2 = change.find(ee);
-      if (it2 == change.end()){
-	e.push_back(ee);
+
+  // Update the data struture for boundary layers
+  // WARNING: First quad element is replaced by one of the two triangles,
+  // without taking care of if it is the truly the first one or not.
+
+//  std::map<MElement*,MElement*> _toFirst;
+  std::map<MElement*,std::vector<MElement*> > newElemColumns;
+  std::map<MElement*,std::vector<MElement*> >::iterator it;
+  std::map<MElement*, std::pair<MElement*,MElement*> >::iterator it2;
+
+  for (it = _columns->_elemColumns.begin();
+       it != _columns->_elemColumns.end(); it++) {
+
+    MElement *firstEl = it->first;
+    it2 = change.find(firstEl);
+    if (it2 != change.end()) firstEl = it2->second.first;
+    // it2->second.first may be the one that touch boundary or not...
+
+    std::vector<MElement *> &newColumn = newElemColumns[firstEl];
+    std::vector<MElement *> &oldColumn = it->second;
+
+    for (unsigned int i = 0; i < oldColumn.size(); i++) {
+      MElement *oldEl = oldColumn[i];
+      it2 = change.find(oldEl);
+      if (it2 == change.end()) {
+        newColumn.push_back(oldEl);
+        _columns->_toFirst[oldEl] = firstEl;
       }
       else {
-	e.push_back(it2->second.first);
-	e.push_back(it2->second.second);
+        newColumn.push_back(it2->second.first);
+        newColumn.push_back(it2->second.second);
+        _columns->_toFirst.erase(oldEl);
+        _columns->_toFirst[it2->second.first] = firstEl;
+        _columns->_toFirst[it2->second.second] = firstEl;
       }
     }
   }
-
-
+  _columns->_elemColumns = newElemColumns;
 }
diff --git a/Mesh/meshGFaceOptimizeOld.cpp b/Mesh/meshGFaceOptimizeOld.cpp
deleted file mode 100644
index cfd2a9839b54049a47aebe6976ab9f81009ed5e8..0000000000000000000000000000000000000000
--- a/Mesh/meshGFaceOptimizeOld.cpp
+++ /dev/null
@@ -1,1497 +0,0 @@
-// Gmsh - Copyright (C) 1997-2017 C. Geuzaine, J.-F. Remacle
-//
-// See the LICENSE.txt file for license information. Please report all
-// bugs and problems to the public mailing list <gmsh@onelab.info>.
-
-#include <stack>
-#include "GmshConfig.h"
-#include "meshGFaceOptimize.h"
-#include "qualityMeasures.h"
-#include "GFace.h"
-#include "GEdge.h"
-#include "GVertex.h"
-#include "GModel.h"
-#include "MVertex.h"
-#include "MTriangle.h"
-#include "MQuadrangle.h"
-#include "MLine.h"
-#include "BackgroundMeshTools.h"
-#include "Numeric.h"
-#include "GmshMessage.h"
-#include "Generator.h"
-#include "Context.h"
-#include "OS.h"
-#include "SVector3.h"
-#include "SPoint3.h"
-#include "robustPredicates.h"
-#include "meshGRegionRelocateVertex.h"
-
-#if defined(HAVE_BLOSSOM)
-extern "C" struct CCdatagroup;
-extern "C" int perfect_match
-(int ncount, CCdatagroup *dat, int ecount,
- int **elist, int **elen, char *blo_filename,
- char *mat_filename, int just_fractional, int no_fractional,
- int use_all_trees, int partialprice,
- double *totalzeit) ;
-#endif
-
-edge_angle::edge_angle(MVertex *_v1, MVertex *_v2, MElement *t1, MElement *t2)
-  : v1(_v1), v2(_v2)
-{
-  if(!t2) angle = 0;
-  else{
-    double c1[3];
-    double c2[3];
-    double c3[3];
-    {
-      MVertex *p1 = t1->getVertex(0);
-      MVertex *p2 = t1->getVertex(1);
-      MVertex *p3 = t1->getVertex(2);
-      double a[3] = {p1->x() - p2->x(), p1->y() - p2->y(), p1->z() - p2->z()};
-      double b[3] = {p1->x() - p3->x(), p1->y() - p3->y(), p1->z() - p3->z()};
-      c1[2] = a[0] * b[1] - a[1] * b[0];
-      c1[1] = -a[0] * b[2] + a[2] * b[0];
-      c1[0] = a[1] * b[2] - a[2] * b[1];
-    }
-    {
-      MVertex *p1 = t2->getVertex(0);
-      MVertex *p2 = t2->getVertex(1);
-      MVertex *p3 = t2->getVertex(2);
-      double a[3] = {p1->x() - p2->x(), p1->y() - p2->y(), p1->z() - p2->z()};
-      double b[3] = {p1->x() - p3->x(), p1->y() - p3->y(), p1->z() - p3->z()};
-      c2[2] = a[0] * b[1] - a[1] * b[0];
-      c2[1] = -a[0] * b[2] + a[2] * b[0];
-      c2[0] = a[1] * b[2] - a[2] * b[1];
-    }
-    norme(c1);
-    norme(c2);
-    prodve(c1, c2, c3);
-    double cosa; prosca(c1, c2, &cosa);
-    double sina = norme(c3);
-    angle = atan2(sina, cosa);
-  }
-}
-
-static void setLcsInit(MTriangle *t, std::map<MVertex*, double> &vSizes)
-{
-  for(int i = 0; i < 3; i++){
-    for(int j = i + 1; j < 3; j++){
-      MVertex *vi = t->getVertex(i);
-      MVertex *vj = t->getVertex(j);
-      vSizes[vi] = -1;
-      vSizes[vj] = -1;
-    }
-  }
-}
-
-static void setLcs(MTriangle *t, std::map<MVertex*, double> &vSizes, bidimMeshData & data)
-{
-  for(int i = 0; i < 3; i++){
-    for(int j = i + 1; j < 3; j++){
-      MVertex *vi = t->getVertex(i);
-      MVertex *vj = t->getVertex(j);
-      if (vi != data.equivalent(vj) && vj != data.equivalent(vi) ){
-        double dx = vi->x() - vj->x();
-        double dy = vi->y() - vj->y();
-        double dz = vi->z() - vj->z();
-        double l = sqrt(dx * dx + dy * dy + dz * dz);
-        std::map<MVertex*,double>::iterator iti = vSizes.find(vi);
-        std::map<MVertex*,double>::iterator itj = vSizes.find(vj);
-        if(iti->second < 0 || iti->second > l) iti->second = l;
-        if(itj->second < 0 || itj->second > l) itj->second = l;
-      }
-    }
-  }
-}
-
-void buildMeshGenerationDataStructures(GFace *gf,
-                                       std::set<MTri3*, compareTri3Ptr> &AllTris,
-                                       bidimMeshData & data)
-{
-  std::map<MVertex*, double> vSizesMap;
-  std::list<GEdge*> edges = gf->edges();
-
-  for(unsigned int i = 0;i < gf->triangles.size(); i++)
-    setLcsInit(gf->triangles[i], vSizesMap);
-  std::map<MVertex*, double>::iterator itfind = vSizesMap.find(NULL);
-  if (itfind!=vSizesMap.end()){
-    std::cout << "***************************************** NULL" << std::endl;
-    throw;
-  }
-
-  for(unsigned int i = 0;i < gf->triangles.size(); i++)
-    setLcs(gf->triangles[i], vSizesMap, data);
-
-  // take care of embedded vertices
-  {
-    std::list<GVertex*> emb_vertx = gf->embeddedVertices();
-    std::list<GVertex*>::iterator itvx = emb_vertx.begin();
-    while(itvx != emb_vertx.end()){
-      MVertex *v = *((*itvx)->mesh_vertices.begin());
-      vSizesMap[v] = std::min(vSizesMap[v], (*itvx)->prescribedMeshSizeAtVertex());
-      ++itvx;
-    }
-  }
-
-  // take good care of embedded edges
-  {
-    std::list<GEdge*> embedded_edges = gf->embeddedEdges();
-    std::list<GEdge*>::iterator ite = embedded_edges.begin();
-    while(ite != embedded_edges.end()){
-      if(!(*ite)->isMeshDegenerated()){
-        for (unsigned int i = 0; i < (*ite)->lines.size(); i++)
-          data.internalEdges.insert(MEdge((*ite)->lines[i]->getVertex(0),
-                                          (*ite)->lines[i]->getVertex(1)));
-      }
-      ++ite;
-    }
-  }
-
-  //  int NUM = 0;
-  for(std::map<MVertex*, double>::iterator it = vSizesMap.begin();
-       it != vSizesMap.end(); ++it){
-    SPoint2 param;
-    reparamMeshVertexOnFace(it->first, gf, param);
-    data.addVertex (it->first, param[0], param[1], it->second, it->second);
-  }
-  for(unsigned int i = 0; i < gf->triangles.size(); i++){
-    double lc = 0.3333333333 * (data.vSizes[data.getIndex(gf->triangles[i]->getVertex(0))] +
-                                data.vSizes[data.getIndex(gf->triangles[i]->getVertex(1))] +
-                                data.vSizes[data.getIndex(gf->triangles[i]->getVertex(2))]);
-    AllTris.insert(new MTri3(gf->triangles[i], lc, 0, &data, gf));
-  }
-  gf->triangles.clear();
-  connectTriangles(AllTris);
-}
-
-void computeEquivalences(GFace *gf, bidimMeshData & data)
-{
-  if (data.equivalence){
-    std::vector<MTriangle*> newT;
-    for (unsigned int i=0;i<gf->triangles.size();i++){
-      MTriangle *t = gf->triangles[i];
-      MVertex *v[3];
-      for (int j=0;j<3;j++){
-        v[j] = t->getVertex(j);
-        std::map<MVertex* , MVertex*>::iterator it =  data.equivalence->find(v[j]);
-        if (it != data.equivalence->end()){
-          v[j] = it->second;
-        }
-      }
-      if (v[0] != v[1] && v[0] != v[2] && v[2] != v[1])
-        newT.push_back(new MTriangle (v[0],v[1],v[2]));
-      delete t;
-    }
-    gf->triangles = newT;
-  }
-}
-
-struct equivalentTriangle {
-  MTriangle *_t;
-  MVertex *_v[3];
-  equivalentTriangle (MTriangle *t,  std::map<MVertex* , MVertex*>* equivalence)
-    :_t(t) {
-    for (int i=0;i<3;i++){
-      MVertex *v = t->getVertex(i);
-      std::map<MVertex* , MVertex*>::iterator it = equivalence->find(v);
-      if (it == equivalence->end())_v[i] = v;
-      else _v[i] = it->second;
-    }
-    std::sort (_v,_v+3);
-  }
-  bool operator < (const equivalentTriangle &other) const{
-    for (int i=0;i<3;i++){
-      if (other._v[i] > _v[i])return true;
-      if (other._v[i] < _v[i])return false;
-    }
-    return false;
-  }
-};
-
-bool computeEquivalentTriangles (GFace *gf,
-                                 std::map<MVertex* , MVertex*>* equivalence)
-{
-  if (!equivalence)return false;
-  std::vector<MTriangle*> WTF;
-  if (!equivalence)return false;
-  std::set<equivalentTriangle> eqTs;
-  for (unsigned int i = 0; i < gf->triangles.size(); i++){
-    equivalentTriangle et (gf->triangles[i],equivalence);
-    std::set<equivalentTriangle>::iterator iteq = eqTs.find(et);
-    if (iteq == eqTs.end())eqTs.insert(et);
-    else {
-      WTF.push_back(iteq->_t);
-      WTF.push_back(gf->triangles[i]);
-    }
-  }
-
-  if (WTF.size()){
-    Msg::Info("%d triangles are equivalent", WTF.size());
-    for (unsigned int i=0;i<WTF.size();i++){
-    }
-    return true;
-  }
-  return false;
-}
-
-
-void splitEquivalentTriangles(GFace *gf, bidimMeshData & data)
-{
-  computeEquivalentTriangles (gf,data.equivalence);
-}
-
-
-void transferDataStructure(GFace *gf, std::set<MTri3*, compareTri3Ptr> &AllTris,
-                           bidimMeshData & data)
-{
-  while (1) {
-    if(AllTris.begin() == AllTris.end()) break;
-    MTri3 *worst = *AllTris.begin();
-    if(worst->isDeleted())
-      delete worst->tri();
-    else
-      gf->triangles.push_back(worst->tri());
-    delete worst;
-    AllTris.erase(AllTris.begin());
-  }
-
-  // make sure all the triangles are oriented in the same way in
-  // parameter space (it would be nicer to change the actual algorithm
-  // to ensure that we create correctly-oriented triangles in the
-  // first place)
-
-  // if BL triangles are considered, then all that is WRONG !
- 
-  
-  if(gf->triangles.size() > 1){
-
-    bool BL = !gf->getColumns()->_toFirst.empty();
-  
-    double n1[3], n2[3];
-    MTriangle *t = gf->triangles[0];
-    MVertex *v0 = t->getVertex(0), *v1 = t->getVertex(1), *v2 = t->getVertex(2);
-
-    if (!BL){
-      int index0 = data.getIndex (v0);
-      int index1 = data.getIndex (v1);
-      int index2 = data.getIndex (v2);
-      normal3points(data.Us[index0], data.Vs[index0], 0.,
-		    data.Us[index1], data.Vs[index1], 0.,
-		    data.Us[index2], data.Vs[index2], 0., n1);
-    }
-    else {
-      // BL --> PLANAR FACES !!!
-      normal3points(v0->x(),v0->y(),v0->z(),
-		    v1->x(),v1->y(),v1->z(),
-		    v2->x(),v2->y(),v2->z(), n1);
-    }
-    for(unsigned int j = 1; j < gf->triangles.size(); j++){
-      t = gf->triangles[j];
-      v0 = t->getVertex(0); v1 = t->getVertex(1); v2 = t->getVertex(2);
-      if (!BL){
-	int index0 = data.getIndex (v0);
-	int index1 = data.getIndex (v1);
-	int index2 = data.getIndex (v2);
-	normal3points(data.Us[index0], data.Vs[index0], 0.,
-		      data.Us[index1], data.Vs[index1], 0.,
-		      data.Us[index2], data.Vs[index2], 0., n2);
-      }
-      else {
-	// BL --> PLANAR FACES !!!
-	normal3points(v0->x(),v0->y(),v0->z(),
-		      v1->x(),v1->y(),v1->z(),
-		      v2->x(),v2->y(),v2->z(), n2);
-      }
-      double pp; prosca(n1, n2, &pp);
-      // orient the bignou
-      if(pp < 0) t->reverse();
-    }
-  }
-  splitEquivalentTriangles(gf, data);
-  computeEquivalences(gf, data);
-}
-
-
-
-void buildVertexToTriangle(std::vector<MTriangle*> &eles, v2t_cont &adj)
-{
-  adj.clear();
-  buildVertexToElement(eles,adj);
-}
-
-template <class T>
-void buildEdgeToElement(std::vector<T*> &elements, e2t_cont &adj)
-{
-  for(unsigned int i = 0; i < elements.size(); i++){
-    T *t = elements[i];
-    for(int j = 0; j < t->getNumEdges(); j++){
-      MEdge e = t->getEdge(j);
-      e2t_cont::iterator it = adj.find(e);
-      if(it == adj.end()){
-        std::pair<MElement*, MElement*> one = std::make_pair(t, (MElement*)0);
-        adj[e] = one;
-      }
-      else{
-        it->second.second = t;
-      }
-    }
-  }
-}
-
-void buildEdgeToElement(GFace *gf, e2t_cont &adj)
-{
-  adj.clear();
-  buildEdgeToElement(gf->triangles, adj);
-  buildEdgeToElement(gf->quadrangles, adj);
-}
-
-void buildEdgeToTriangle(std::vector<MTriangle*> &tris, e2t_cont &adj)
-{
-  adj.clear();
-  buildEdgeToElement(tris, adj);
-}
-
-void buildEdgeToElements(std::vector<MElement*> &tris, e2t_cont &adj)
-{
-  adj.clear();
-  buildEdgeToElement(tris, adj);
-}
-
-void buildListOfEdgeAngle(e2t_cont adj, std::vector<edge_angle> &edges_detected,
-                          std::vector<edge_angle> &edges_lonly)
-{
-  e2t_cont::iterator it = adj.begin();
-  for(; it != adj.end(); ++it){
-    if(it->second.second)
-      edges_detected.push_back(edge_angle(it->first.getVertex(0),
-                                          it->first.getVertex(1),
-                                          it->second.first, it->second.second));
-    else
-      edges_lonly.push_back(edge_angle(it->first.getVertex(0),
-                                       it->first.getVertex(1),
-                                       it->second.first, it->second.second));
-  }
-  std::sort(edges_detected.begin(), edges_detected.end());
-}
-
-void parametricCoordinates(MElement *t, GFace *gf, double u[4], double v[4],
-                           MVertex *close = 0)
-{
-  for(int j = 0; j < t->getNumVertices(); j++){
-    MVertex *ver = t->getVertex(j);
-    SPoint2 param, dummy;
-    if (!close) reparamMeshVertexOnFace(ver, gf, param);
-    else reparamMeshEdgeOnFace(ver, close, gf, param, dummy);
-    u[j] = param[0];
-    v[j] = param[1];
-  }
-}
-
-double surfaceFaceUV(MElement *t,GFace *gf, bool maximal = true)
-{
-  double u[4],v[4];
-  parametricCoordinates(t,gf,u,v);
-  //  printf("%g %g %g %g\n",u[0],u[1],u[2],u[3]);
-  //  printf("%g %g %g %g\n",v[0],v[1],v[2],v[3]);
-  if (t->getNumVertices() == 3)
-    return 0.5*fabs((u[1]-u[0])*(v[2]-v[0])-(u[2]-u[0])*(v[1]-v[0]));
-  else {
-    const double a1 =
-      0.5*fabs((u[1]-u[0])*(v[2]-v[0])-(u[2]-u[0])*(v[1]-v[0])) +
-      0.5*fabs((u[3]-u[2])*(v[0]-v[2])-(u[0]-u[2])*(v[3]-v[2])) ;
-    const double a2 =
-      0.5*fabs((u[2]-u[1])*(v[3]-v[1])-(u[3]-u[1])*(v[2]-v[1])) +
-      0.5*fabs((u[0]-u[3])*(v[1]-v[3])-(u[1]-u[3])*(v[0]-v[3])) ;
-    return maximal ? std::max(a2,a1) : std::min(a2,a1);
-  }
-}
-
-int _removeThreeTrianglesNodes(GFace *gf)
-{
-  v2t_cont adj;
-  buildVertexToElement(gf->triangles,adj);
-  v2t_cont :: iterator it = adj.begin();
-  int n=0;
-  std::set<MElement*> touched;
-  while (it != adj.end()) {
-    bool skip = false;
-    if(it->second.size() == 3 && it->first->onWhat()->dim() == 2) {
-      const std::vector<MElement*> &lt = it->second;
-      std::set<MVertex*> vs;
-      for(int i = 0; i < 3; i++) {
-        if(touched.find(lt[i])!=touched.end() || lt[i]->getNumVertices()!=3){
-          skip=true;
-          break;
-        }
-        for(int j = 0; j < 3; j++) {
-          if(lt[i]->getVertex(j) == it->first) {
-            vs.insert(lt[i]->getVertex((j+1)%3));
-            vs.insert(lt[i]->getVertex((j+2)%3));
-            break;
-          }
-        }
-      }
-      if(skip){
-        it++;
-        continue;
-      }
-      std::set<MVertex*>::iterator itt = vs.begin();
-      MVertex *v1 = *itt; ++itt;
-      MVertex *v2 = *itt; ++itt;
-      MVertex *v3 = *itt;
-      MTriangle *newt = new MTriangle(v1,v2,v3);
-      n++;
-      gf->triangles.push_back(newt);
-      for(int i=0;i<3;i++) {
-        touched.insert(lt[i]);
-      }
-    }
-    it++;
-  }
-  std::vector<MTriangle*> triangles2;
-  for(unsigned int i = 0; i < gf->triangles.size(); i++){
-    if(touched.find(gf->triangles[i]) == touched.end()){
-      triangles2.push_back(gf->triangles[i]);
-    }
-    else {
-      delete gf->triangles[i];
-    }
-  }
-  gf->triangles = triangles2;
-  Msg::Debug("%i three-triangles vertices removed",n);
-  return n;
-}
-
-
-void removeThreeTrianglesNodes(GFace *gf)
-{
-  while(_removeThreeTrianglesNodes(gf));
-}
-
-static int _removeTwoQuadsNodes(GFace *gf)
-{
-  v2t_cont adj;
-  buildVertexToElement(gf->triangles,adj);
-  buildVertexToElement(gf->quadrangles,adj);
-  v2t_cont :: iterator it = adj.begin();
-  std::set<MElement*>  touched;
-  std::set<MVertex*>  vtouched;
-  while (it != adj.end()) {
-    if(it->second.size()==2 && it->first->onWhat()->dim() == 2) {
-      MElement *q1 = it->second[0];
-      MElement *q2 = it->second[1];
-      if (q1->getNumVertices() == 4 &&
-          q2->getNumVertices() == 4 &&
-          touched.find(q1) == touched.end() && touched.find(q2) == touched.end()){
-        int comm = 0;
-        for (int i=0;i<4;i++){
-          if (q1->getVertex(i) == it->first){
-            comm = i;
-            break;
-          }
-        }
-        MVertex *v1 = q1->getVertex((comm+1)%4);
-        MVertex *v2 = q1->getVertex((comm+2)%4);
-        MVertex *v3 = q1->getVertex((comm+3)%4);
-        MVertex *v4 = 0;
-        for (int i=0;i<4;i++){
-          if (q2->getVertex(i) != v1 && q2->getVertex(i) != v2 &&
-              q2->getVertex(i) != v3 && q2->getVertex(i) != it->first){
-            v4 = q2->getVertex(i);
-            break;
-          }
-        }
-        if (!v4){
-          Msg::Error("BUG DISCOVERED IN _removeTwoQuadsNodes ,%p,%p,%p",v1,v2,v3);
-          q1->writePOS(stdout,true,false,false,false,false,false);
-          q2->writePOS(stdout,true,false,false,false,false,false);
-          return 0;
-        }
-        MQuadrangle *q = new MQuadrangle(v1,v2,v3,v4);
-        double s1 = surfaceFaceUV(q,gf);
-        double s2 = surfaceFaceUV(q1,gf) + surfaceFaceUV(q2,gf);;
-        if (s1 > s2){
-          delete q;
-        }
-        else{
-          touched.insert(q1);
-          touched.insert(q2);
-          gf->quadrangles.push_back(q);
-          vtouched.insert(it->first);
-        }
-      }
-    }
-    it++;
-  }
-  std::vector<MQuadrangle*> quadrangles2;
-  for(unsigned int i = 0; i < gf->quadrangles.size(); i++){
-    if(touched.find(gf->quadrangles[i]) == touched.end()){
-      quadrangles2.push_back(gf->quadrangles[i]);
-    }
-    else {
-      delete gf->quadrangles[i];
-    }
-  }
-  gf->quadrangles = quadrangles2;
-
-  std::vector<MVertex*> mesh_vertices2;
-  for(unsigned int i = 0; i < gf->mesh_vertices.size(); i++){
-    if(vtouched.find(gf->mesh_vertices[i]) == vtouched.end()){
-      mesh_vertices2.push_back(gf->mesh_vertices[i]);
-    }
-    else {
-      delete gf->mesh_vertices[i];
-    }
-  }
-  gf->mesh_vertices = mesh_vertices2;
-
-  return vtouched.size();
-}
-
-int removeTwoQuadsNodes(GFace *gf)
-{
-  int nbRemove = 0;
-  while(1){
-    int x = _removeTwoQuadsNodes(gf);
-    if (!x)break;
-    nbRemove += x;
-  }
-  Msg::Debug("%i two-quadrangles vertices removed",nbRemove);
-  return nbRemove;
-}
-
-// collapse v1 & v2 to their middle and replace into e1 & e2
-static bool _tryToCollapseThatVertex (GFace *gf,
-                                      std::vector<MElement*> &e1,
-                                      std::vector<MElement*> &e2,
-                                      MElement *q,
-                                      MVertex *v1,
-                                      MVertex *v2)
-{
-  std::vector<MElement*> e = e1;
-  e.insert(e.end(), e2.begin(), e2.end());
-
-  double uu1,vv1;
-  v1->getParameter(0,uu1);
-  v1->getParameter(1,vv1);
-  double x1 = v1->x();
-  double y1 = v1->y();
-  double z1 = v1->z();
-
-  double uu2,vv2;
-  v2->getParameter(0,uu2);
-  v2->getParameter(1,vv2);
-  double x2 = v2->x();
-  double y2 = v2->y();
-  double z2 = v2->z();
-
-  // new position of v1 && v2
-  GPoint pp = gf->point(0.5*(uu1+uu2),0.5*(vv1+vv2));
-    //GPoint pp = gf->point(uu1,vv1);
-
-  //  double surface_old = 0;
-  //  double surface_new = 0;
-  double worst_quality_old = 1.0;
-  double worst_quality_new = 1.0;
-
-  //  surface_old = surfaceFaceUV(q,gf,false);
-  int count=0;
-  for (unsigned int j=0;j<e.size();++j){
-    if (e[j] != q){
-      count++;
-      //      surface_old += surfaceFaceUV(e[j],gf,false);
-      worst_quality_old = std::min(worst_quality_old,e[j]-> etaShapeMeasure());
-      v1->x() = pp.x();v1->y() = pp.y();v1->z() = pp.z();
-      v1->setParameter(0,pp.u());v1->setParameter(1,pp.v());
-      v2->x() = pp.x();v2->y() = pp.y();v2->z() = pp.z();
-      v2->setParameter(0,pp.u());v2->setParameter(1,pp.v());
-      //      surface_new += surfaceFaceUV(e[j],gf,false);
-      worst_quality_new = std::min(worst_quality_new,e[j]-> etaShapeMeasure());
-      v1->x() = x1;v1->y() = y1;v1->z() = z1;
-      v1->setParameter(0,uu1);v1->setParameter(1,vv1);
-      v2->x() = x2;v2->y() = y2;v2->z() = z2;
-      v2->setParameter(0,uu2);v1->setParameter(1,vv2);
-    }
-  }
-
-  //  printf("%d %g %g %g %g\n", count, surface_old, surface_new, worst_quality_old , worst_quality_new);
-
-  if (worst_quality_new >  worst_quality_old ) {
-    v1->x() = pp.x();v1->y() = pp.y();v1->z() = pp.z();
-    v1->setParameter(0,pp.u());v1->setParameter(1,pp.v());
-    for (unsigned int j=0;j<e.size();++j){
-      if (e[j] != q){
-        for (int k=0;k<4;k++){
-          if (e[j]->getVertex(k) == v2){
-            e[j]->setVertex(k,v1);
-          }
-        }
-      }
-    }
-    return true;
-  }
-  return false;
-}
-
-static bool _isItAGoodIdeaToMoveThatVertex(GFace *gf,
-                                           const std::vector<MElement*> &e1,
-                                           MVertex *v1,
-                                           const SPoint2 &before,
-                                           const SPoint2 &after)
-{
-  double surface_old = 0;
-  double surface_new = 0;
-
-  GPoint gp = gf->point(after);
-  if (!gp.succeeded())return false;
-  SPoint3 pafter  (gp.x(),gp.y(),gp.z());
-  SPoint3 pbefore (v1->x(),v1->y(),v1->z());
-
-  double minq = 1.0;
-  for (unsigned int j=0;j<e1.size();++j){
-    surface_old += surfaceFaceUV(e1[j],gf,false);
-    minq = std::min(e1[j]->etaShapeMeasure(),minq);
-  }
-
-  v1->setParameter(0,after.x());
-  v1->setParameter(1,after.y());
-  v1->setXYZ(pafter.x(),pafter.y(),pafter.z());
-
-  double minq_new = 1.0;
-  for (unsigned int j=0;j<e1.size();++j){
-    surface_new += surfaceFaceUV(e1[j],gf,false);
-    minq_new = std::min(e1[j]->etaShapeMeasure(),minq_new);
-  }
-
-  v1->setParameter(0,before.x());
-  v1->setParameter(1,before.y());
-  v1->setXYZ(pbefore.x(),pbefore.y(),pbefore.z());
-  if ((1.+1.e-10)*surface_old < surface_new|| minq_new < minq) {
-    return false;
-  }
-  return true;
-}
-
-static int _removeDiamonds(GFace *gf)
-{
-  v2t_cont adj;
-  buildVertexToElement(gf->quadrangles,adj);
-  std::set<MElement*> diamonds;
-  std::set<MVertex*> touched;
-  std::set<MVertex*> deleted;
-  std::vector<MVertex*> mesh_vertices2;
-  std::vector<MQuadrangle*> quadrangles2;
-
-  for(unsigned int i = 0; i < gf->triangles.size(); i++){
-    touched.insert(gf->triangles[i]->getVertex(0));
-    touched.insert(gf->triangles[i]->getVertex(1));
-    touched.insert(gf->triangles[i]->getVertex(2));
-  }
-
-  for(unsigned int i = 0; i < gf->quadrangles.size(); i++){
-    MQuadrangle *q = gf->quadrangles[i];
-    MVertex *v1 = q->getVertex(0);
-    MVertex *v2 = q->getVertex(1);
-    MVertex *v3 = q->getVertex(2);
-    MVertex *v4 = q->getVertex(3);
-    v2t_cont::iterator it1 = adj.find(v1);
-    v2t_cont::iterator it2 = adj.find(v2);
-    v2t_cont::iterator it3 = adj.find(v3);
-    v2t_cont::iterator it4 = adj.find(v4);
-    if (touched.find(v1) == touched.end() &&
-        touched.find(v2) == touched.end() &&
-        touched.find(v3) == touched.end() &&
-        touched.find(v4) == touched.end() ) {
-      if (v1->onWhat()->dim() == 2 &&
-          v2->onWhat()->dim() == 2 &&
-          v3->onWhat()->dim() == 2 &&
-          v4->onWhat()->dim() == 2 &&
-          it1->second.size() ==3 &&  it3->second.size() == 3 &&
-          _tryToCollapseThatVertex (gf, it1->second, it3->second,
-                                      q, v1, v3)){
-        touched.insert(v1);
-        touched.insert(v2);
-        touched.insert(v3);
-        touched.insert(v4);
-        deleted.insert(v3);
-        diamonds.insert(q);
-      }
-      else if (v1->onWhat()->dim() == 2 &&
-               v2->onWhat()->dim() == 2 &&
-               v3->onWhat()->dim() == 2 &&
-               v4->onWhat()->dim() == 2 &&
-               it2->second.size() ==3 &&  it4->second.size() == 3 &&
-               _tryToCollapseThatVertex (gf, it2->second, it4->second,
-                                         q, v2, v4)){
-        touched.insert(v1);
-        touched.insert(v2);
-        touched.insert(v3);
-        touched.insert(v4);
-        deleted.insert(v4);
-        diamonds.insert(q);
-      }
-      else {
-        quadrangles2.push_back(q);
-      }
-    }
-    else{
-      quadrangles2.push_back(q);
-    }
-  }
-  gf->quadrangles = quadrangles2;
-
-  for(unsigned int i = 0; i < gf->mesh_vertices.size(); i++){
-    if(deleted.find(gf->mesh_vertices[i]) == deleted.end()){
-      mesh_vertices2.push_back(gf->mesh_vertices[i]);
-    }
-    else {
-      // FIXME : GMSH SOMETIMES CRASHES IF DELETED ....
-      //      delete gf->mesh_vertices[i];
-    }
-  }
-
-  gf->mesh_vertices = mesh_vertices2;
-
-  return diamonds.size();
-}
-
-int removeDiamonds(GFace *gf)
-{
-  int nbRemove = 0;
-  while(1){
-    int x = _removeDiamonds(gf);
-    if (!x)break;
-    nbRemove += x;
-  }
-  Msg::Debug("%i diamond quads removed",nbRemove);
-  return nbRemove;
-}
-
-struct p1p2p3 {
-  MVertex *p1,*p2;
-};
-
-
-void _relocateVertex(GFace *gf, MVertex *ver,
-                     const std::vector<MElement*> &lt)
-{
-  if(ver->onWhat()->dim() != 2) return;
-  MFaceVertex *fv = dynamic_cast<MFaceVertex*>(ver);
-  if(fv && fv->bl_data) return;
-
-  double initu, initv;
-  ver->getParameter(0, initu);
-  ver->getParameter(1, initv);
-
-  // compute the vertices connected to that one
-  std::map<MVertex*,SPoint2> pts;
-  for(unsigned int i = 0; i < lt.size(); i++){
-    for (int j=0;j<lt[i]->getNumEdges();j++){
-      MEdge e = lt[i]->getEdge(j);
-      SPoint2 param0, param1;
-      if (e.getVertex(0) == ver){
-        reparamMeshEdgeOnFace(e.getVertex(0), e.getVertex(1), gf, param0, param1);
-        pts[e.getVertex(1)] = param1;
-      }
-      else if (e.getVertex(1) == ver){
-        reparamMeshEdgeOnFace(e.getVertex(0), e.getVertex(1), gf, param0, param1);
-        pts[e.getVertex(0)] = param0;
-      }
-    }
-  }
-
-  SPoint2 before(initu,initv);
-  double metric[3];
-  SPoint2 after(0,0);
-  double COUNT = 0.0;
-  // printf("weights :");
-  for(std::map<MVertex*,SPoint2>::iterator it = pts.begin(); it != pts.end() ; ++it) {
-    SPoint2  adj = it->second;
-    SVector3 d(adj.x() - before.x(), adj.y() - before.y(), 0.0);
-    d.normalize();
-    buildMetric(gf, adj, metric);
-    const double F = sqrt(metric[0]*d.x()*d.x() +
-                          2*metric[1]*d.x()*d.y() +
-                          metric[2]*d.y()*d.y());
-    // printf("%g ",F);
-    after += adj*F;
-    COUNT += F;
-    // double RATIO = lt[i]->getVolume()/pow(metric[0]*metric[2]-metric[1]*metric[1],0.5);
-  }
-  //  printf("\n");
-  after *= (1.0/COUNT);
-  double FACTOR = 1.0;
-  const int MAXITER = 5;
-  SPoint2 actual = before;
-  for (int ITER = 0;ITER < MAXITER; ITER ++){
-    SPoint2 trial = after * FACTOR + before * (1.-FACTOR);
-    bool success = _isItAGoodIdeaToMoveThatVertex (gf,  lt, ver,actual,trial);
-    if (success){
-      GPoint pt = gf->point(trial);
-      if(pt.succeeded()){
-        actual = trial;
-        ver->setParameter(0, trial.x());
-        ver->setParameter(1, trial.y());
-        ver->x() = pt.x();
-        ver->y() = pt.y();
-        ver->z() = pt.z();
-      }
-    }
-    FACTOR /= 1.4;
-  }
-}
-
-void getAllBoundaryLayerVertices (GFace *gf, std::set<MVertex*> &vs){
-  //  return;
-  vs.clear();
-  BoundaryLayerColumns* _columns = gf->getColumns();
-  if (!_columns)return;
-  for ( std::map<MElement*,std::vector<MElement*> >::iterator it = _columns->_elemColumns.begin();
-	it != _columns->_elemColumns.end();it++){
-    std::vector<MElement *> &e = it->second;
-    for (unsigned int i=0;i<e.size();i++){
-      for (int j=0;j<e[i]->getNumVertices();j++){
-	vs.insert(e[i]->getVertex(j));
-      }
-    }
-  }
-}
-
-void laplaceSmoothing(GFace *gf, int niter, bool infinity_norm)
-{
-  if (!niter)return;
-  std::set<MVertex*> vs;
-  getAllBoundaryLayerVertices (gf, vs);
-  v2t_cont adj;
-  buildVertexToElement(gf->triangles, adj);
-  buildVertexToElement(gf->quadrangles, adj);
-  for(int i = 0; i < niter; i++){
-    v2t_cont::iterator it = adj.begin();
-    while (it != adj.end()){
-      if (vs.find(it->first) == vs.end()){
-	_relocateVertex(gf, it->first, it->second);
-      }
-      ++it;
-    }
-  }
-}
-
-bool edgeSwapDelProj (MVertex *v1, MVertex *v2, MVertex *v3, MVertex *v4)
-{
-  MTriangle t1(v1,v2,v3);
-  MTriangle t2(v2,v1,v4);
-
-  SVector3 n1 = t1.getFace(0).normal();
-  SVector3 n2 = t2.getFace(0).normal();
-  if (dot(n1,n2) <= 0) {
-    //    printf("OLA !!!\n");
-    return true;
-  }
-  return false;
-}
-
-bool edgeSwap(std::set<swapquad> &configs, MTri3 *t1, GFace *gf, int iLocalEdge,
-              std::vector<MTri3*> &newTris, const swapCriterion &cr, bidimMeshData & data)
-{
-  MTri3 *t2 = t1->getNeigh(iLocalEdge);
-  if(!t2) return false;
-
-  MVertex *v1 = t1->tri()->getVertex(iLocalEdge == 0 ? 2 : iLocalEdge - 1);
-  MVertex *v2 = t1->tri()->getVertex((iLocalEdge) % 3);
-  MVertex *v3 = t1->tri()->getVertex((iLocalEdge + 1) % 3);
-  MVertex *v4 = 0;
-
-  std::set<MEdge,Less_Edge>::iterator it = data.internalEdges.find(MEdge(v1,v2));
-  if (it != data.internalEdges.end())return false;
-
-
-  for(int i = 0; i < 3; i++)
-    if(t2->tri()->getVertex(i) != v1 && t2->tri()->getVertex(i) != v2)
-      v4 = t2->tri()->getVertex(i);
-
-  swapquad sq (v1, v2, v3, v4);
-  if(configs.find(sq) != configs.end()) return false;
-  configs.insert(sq);
-
-  if (edgeSwapDelProj(v3,v4,v2,v1))return false;
-
-
-  MTriangle *t1b = new MTriangle(v2, v3, v4);
-  MTriangle *t2b = new MTriangle(v4, v3, v1);
-
-  switch(cr){
-  case SWCR_QUAL:
-    {
-      const double triQualityRef = std::min(qmTriangle::gamma(t1->tri()),
-                                            qmTriangle::gamma(t2->tri()));
-      const double triQuality = std::min(qmTriangle::gamma(t1b),
-                                         qmTriangle::gamma(t2b));
-      if (!edgeSwapDelProj(v1,v2,v3,v4)){
-        if(triQuality < triQualityRef){
-          delete t1b;
-          delete t2b;
-          return false;
-        }
-      }
-      break;
-    }
-  case SWCR_DEL:
-    {
-      int index1 = data.getIndex(v1);
-      int index2 = data.getIndex(v2);
-      int index3 = data.getIndex(v3);
-      int index4 = data.getIndex(v4);
-      double edgeCenter[2] ={(data.Us[index1] + data.Us[index2] +
-                              data.Us[index3] + data.Us[index4]) * .25,
-                             (data.Vs[index1] + data.Vs[index2] +
-                              data.Vs[index3] + data.Vs[index4]) * .25};
-      double uv4[2] ={data.Us[index4], data.Vs[index4]};
-      double metric[3];
-      buildMetric(gf, edgeCenter, metric);
-      if(!inCircumCircleAniso(gf, t1->tri(), uv4, metric, data)){
-        delete t1b;
-        delete t2b;
-        return false;
-      }
-    }
-    break;
-  default :
-    Msg::Error("Unknown swapping criterion");
-    delete t1b;
-    delete t2b;
-    return false;
-  }
-
-  std::list<MTri3*> cavity;
-  for(int i = 0; i < 3; i++){
-    if(t1->getNeigh(i) && t1->getNeigh(i) != t2){
-      bool found = false;
-      for(std::list<MTri3*>::iterator it = cavity.begin(); it != cavity.end(); it++){
-        if(*it == t1->getNeigh(i)) found = true;
-      }
-      if(!found)cavity.push_back(t1->getNeigh(i));
-    }
-  }
-  for(int i = 0; i < 3; i++){
-    if(t2->getNeigh(i) && t2->getNeigh(i) != t1){
-      bool found = false;
-      for(std::list<MTri3*>::iterator it = cavity.begin(); it != cavity.end(); it++){
-        if(*it == t2->getNeigh(i)) found = true;
-      }
-      if(!found)cavity.push_back(t2->getNeigh(i));
-    }
-  }
-
-  int i10 = data.getIndex(t1b->getVertex(0));
-  int i11 = data.getIndex(t1b->getVertex(1));
-  int i12 = data.getIndex(t1b->getVertex(2));
-
-  int i20 = data.getIndex(t2b->getVertex(0));
-  int i21 = data.getIndex(t2b->getVertex(1));
-  int i22 = data.getIndex(t2b->getVertex(2));
-
-  double lc1 = 0.3333333333 * (data.vSizes[i10] + data.vSizes[i11] +
-                               data.vSizes[i12]);
-  double lcBGM1 = 0.3333333333 * (data.vSizesBGM[i10] + data.vSizesBGM[i11] +
-                                  data.vSizesBGM[i12]);
-
-  double lc2 = 0.3333333333 * (data.vSizes[i20] + data.vSizes[i21] +
-                               data.vSizes[i22]);
-  double lcBGM2 = 0.3333333333 * (data.vSizesBGM[i20] + data.vSizesBGM[i21] +
-                                  data.vSizesBGM[i22]);
-
-  MTri3 *t1b3 = new MTri3(t1b, Extend1dMeshIn2dSurfaces() ?
-                          std::min(lc1, lcBGM1) : lcBGM1, 0, &data, gf);
-  MTri3 *t2b3 = new MTri3(t2b, Extend1dMeshIn2dSurfaces() ?
-                          std::min(lc2, lcBGM2) : lcBGM2, 0, &data, gf);
-  //  printf("%d %d %d -- %d %d %d edge %d\n",t1->tri()->getVertex(0)->getNum(),t1->tri()->getVertex(1)->getNum(),t1->tri()->getVertex(2)->getNum(),
-  //	 t2->tri()->getVertex(0)->getNum(),t2->tri()->getVertex(1)->getNum(),t2->tri()->getVertex(2)->getNum(),iLocalEdge);
-  //  printf("%d %d %d \n",v2->getNum(),v3->getNum(),v4->getNum());
-  //  printf("%d %d %d \n",v4->getNum(),v3->getNum(),v1->getNum());
-  
-  cavity.push_back(t2b3);
-  cavity.push_back(t1b3);
-  t1->setDeleted(true);
-  t2->setDeleted(true);
-  connectTriangles(cavity);
-  newTris.push_back(t2b3);
-  newTris.push_back(t1b3);
-  //  printf("%d %d\n",t1b3->isDeleted(),t2b3->isDeleted());
-
-  return true;
-}
-
-int edgeSwapPass(GFace *gf, std::set<MTri3*, compareTri3Ptr> &allTris,
-		 const swapCriterion &cr,bidimMeshData & data)
-{
-  typedef std::set<MTri3*, compareTri3Ptr> CONTAINER;
-  
-  int nbSwapTot = 0;
-  std::set<swapquad> configs;
-
-  std::set<MTri3*, compareTri3Ptr> allTris2;
-    
-  for(int iter = 0; iter < 10; iter++){
-    int nbSwap = 0;
-    std::vector<MTri3*> newTris;
-    CONTAINER::iterator it = allTris.begin();
-    while(it != allTris.end()){
-      CONTAINER::iterator current = it++;
-      if(!(*current)->isDeleted()){
-	for(int i = 0; i < 3; i++){
-	  if(edgeSwap(configs, *current, gf, i, newTris, cr, data)){
-	    nbSwap++;
-	    break;
-	  }
-	}
-      }
-      else{
-	delete (*current)->tri();
-	delete *current;
-	allTris.erase(current);
-      }
-    }
-
-    //    allTris = allTris2;
-        
-    allTris.insert(newTris.begin(), newTris.end());
-
-    // for(CONTAINER::iterator it = allTris.begin(); it != allTris.end(); ++it){
-    //   printf("---> %d %d %d (%d)\n",(*it)->tri()->getVertex(0)->getNum(),
-    // 	     (*it)->tri()->getVertex(1)->getNum(),
-    // 	     (*it)->tri()->getVertex(2)->getNum(),(*it)->isDeleted() );
-    // }
-    
-    nbSwapTot += nbSwap;
-    if(nbSwap == 0) break;
-  }
-  return nbSwapTot;
-}
-
-int edgeSwapPass2(GFace *gf, std::set<MTri3*, compareTri3Ptr> &allTris,
-                 const swapCriterion &cr,bidimMeshData & data)
-{
-  typedef std::set<MTri3*, compareTri3Ptr> CONTAINER;
-
-  int nbSwapTot = 0;
-  std::set<swapquad> configs;
-  for(int iter = 0; iter < 1200; iter++){
-    int nbSwap = 0;
-    std::vector<MTri3*> newTris;
-    for(CONTAINER::iterator it = allTris.begin(); it != allTris.end(); ++it){
-      if(!(*it)->isDeleted()){
-        for(int i = 0; i < 3; i++){
-          if(edgeSwap(configs, *it, gf, i, newTris, cr, data)){
-            nbSwap++;
-            break;
-          }
-        }
-      }
-      else{
-        delete *it;
-        CONTAINER::iterator itb = it;
-        ++it;
-        allTris.erase(itb);
-        if(it == allTris.end()) break;
-      }
-    }
-    allTris.insert(newTris.begin(), newTris.end());
-    nbSwapTot += nbSwap;
-    if(nbSwap == 0) break;
-  }
-  return nbSwapTot;
-}
-
-
-
-
-static int _recombineIntoQuads(GFace *gf, double minqual, bool cubicGraph = 1)
-{
-  // never recombine a face that is part of a compound!
-  if(gf->getCompound()) return 0;
-  if(gf->triangles.size() == 0) return 1;
-
-  int success = 1;
-
-  std::set<MVertex*> emb_edgeverts;
-  {
-    std::list<GEdge*> emb_edges = gf->embeddedEdges();
-    std::list<GEdge*>::iterator ite = emb_edges.begin();
-    while(ite != emb_edges.end()){
-      if(!(*ite)->isMeshDegenerated()){
-        emb_edgeverts.insert((*ite)->mesh_vertices.begin(),
-                             (*ite)->mesh_vertices.end() );
-        emb_edgeverts.insert((*ite)->getBeginVertex()->mesh_vertices.begin(),
-                             (*ite)->getBeginVertex()->mesh_vertices.end());
-        emb_edgeverts.insert((*ite)->getEndVertex()->mesh_vertices.begin(),
-                             (*ite)->getEndVertex()->mesh_vertices.end());
-      }
-      ++ite;
-    }
-  }
-
-  {
-    std::list<GEdge*> _edges = gf->edges();
-    std::list<GEdge*>::iterator ite = _edges.begin();
-    while(ite != _edges.end()){
-      if(!(*ite)->isMeshDegenerated()){
-        if ((*ite)->isSeam(gf)){
-          emb_edgeverts.insert((*ite)->mesh_vertices.begin(),
-                               (*ite)->mesh_vertices.end() );
-          emb_edgeverts.insert((*ite)->getBeginVertex()->mesh_vertices.begin(),
-                               (*ite)->getBeginVertex()->mesh_vertices.end());
-          emb_edgeverts.insert((*ite)->getEndVertex()->mesh_vertices.begin(),
-                               (*ite)->getEndVertex()->mesh_vertices.end());
-        }
-      }
-      ++ite;
-    }
-  }
-  
-  e2t_cont adj;
-  buildEdgeToElement(gf->triangles, adj);
-
-  std::vector<RecombineTriangle> pairs;
-  std::map<MVertex*,std::pair<MElement*,MElement*> > makeGraphPeriodic;
-
-  for(e2t_cont::iterator it = adj.begin(); it!= adj.end(); ++it){
-    if(it->second.second &&
-        it->second.first->getNumVertices() == 3 &&
-        it->second.second->getNumVertices() == 3 &&
-        (emb_edgeverts.find(it->first.getVertex(0)) == emb_edgeverts.end() ||
-         emb_edgeverts.find(it->first.getVertex(1)) == emb_edgeverts.end())){
-      pairs.push_back(RecombineTriangle(it->first,
-                                     it->second.first,
-                                     it->second.second));
-    }
-    else if (!it->second.second &&
-             it->second.first->getNumVertices() == 3){
-      for (int i=0;i<2;i++){
-        MVertex *v = it->first.getVertex(i);
-        std::map<MVertex*,std::pair<MElement*,MElement*> > :: iterator itv =
-          makeGraphPeriodic.find(v);
-        if (itv == makeGraphPeriodic.end()){
-          makeGraphPeriodic[v] = std::make_pair(it->second.first,(MElement*)0);
-        }
-        else{
-          if ( itv->second.first !=  it->second.first)
-            itv->second.second = it->second.first;
-          else
-            makeGraphPeriodic.erase(itv);
-        }
-      }
-    }
-  }
-
-  std::sort(pairs.begin(),pairs.end());
-  std::set<MElement*> touched;
-
-  if(CTX::instance()->mesh.algoRecombine != 0){
-#if defined(HAVE_BLOSSOM)
-    int ncount = gf->triangles.size();
-    if (ncount % 2 != 0 && CTX::instance()->mesh.algoRecombine == 1) {
-      Msg::Warning("Cannot apply Blosson: odd number of triangles (%d) in surface %d",
-                   ncount, gf->tag());
-    }
-    if (ncount % 2 == 0) {
-      int ecount =  cubicGraph ? pairs.size() + makeGraphPeriodic.size() : pairs.size();
-      Msg::Info("Blossom: %d internal %d closed",
-                (int)pairs.size(), (int)makeGraphPeriodic.size());
-      //Msg::Info("Cubic Graph should have ne (%d) = 3 x nv (%d) ",ecount,ncount);
-      Msg::Debug("Perfect Match Starts %d edges %d nodes",ecount,ncount);
-      std::map<MElement*,int> t2n;
-      std::map<int,MElement*> n2t;
-      for (unsigned int i=0;i<gf->triangles.size();++i){
-        t2n[gf->triangles[i]] = i;
-        n2t[i] = gf->triangles[i];
-      }
-      //do not use new[] here, blossom will free it with free() and not with delete
-      int *elist = (int*)malloc(sizeof(int) * 2 * ecount);
-      int *elen  = (int*)malloc(sizeof(int) * ecount);
-      for (unsigned int i = 0; i < pairs.size(); ++i){
-        elist[2*i] = t2n[pairs[i].t1];
-        elist[2*i+1] = t2n[pairs[i].t2];
-        elen [i] =  (int) 1000*exp(-pairs[i].angle);
-        int NB = 0;
-        if (pairs[i].n1->onWhat()->dim() < 2) NB++;
-        if (pairs[i].n2->onWhat()->dim() < 2) NB++;
-        if (pairs[i].n3->onWhat()->dim() < 2) NB++;
-        if (pairs[i].n4->onWhat()->dim() < 2) NB++;
-        if (elen[i] > (int)1000*exp(.1) && NB > 2) { elen[i] = 5000; }
-        else if (elen[i] >= 1000 && NB > 2) { elen[i] = 10000; }
-	//	printf("%d %d %d\n", elist[2*i],elist[2*i+1],elen [i] );
-      }
-
-      if (cubicGraph){
-        std::map<MVertex*, std::pair<MElement*, MElement*> >::iterator itv =
-          makeGraphPeriodic.begin();
-        int CC = pairs.size();
-        for ( ; itv != makeGraphPeriodic.end(); ++itv){
-          elist[2*CC] = t2n[itv->second.first];
-          elist[2*CC+1] = t2n[itv->second.second];
-          elen [CC++] = 100000;
-        }
-      }
-
-      double matzeit = 0.0;
-      char MATCHFILE[256];
-      sprintf(MATCHFILE,".face.match");
-      if(perfect_match(ncount, NULL, ecount, &elist, &elen, NULL, MATCHFILE,
-                       0, 0, 0, 0, &matzeit)){
-        Msg::Error("Perfect Match failed in Quadrangulation, try something else");
-        free(elist);
-        pairs.clear();
-      }
-      else{
-        // TEST
-        for (int k = 0; k < elist[0]; k++){
-          int i1 = elist[1+3*k], i2 = elist[1+3*k+1], an=elist[1+3*k+2];
-          // FIXME !
-          if (an == 100000 /*|| an == 1000*/){
-            // toProcess.push_back(std::make_pair(n2t[i1],n2t[i2]));
-            // Msg::Warning("Extra edge found in blossom algorithm, optimization "
-            //              "will be required");
-          }
-          else{
-            MElement *t1 = n2t[i1];
-            MElement *t2 = n2t[i2];
-            touched.insert(t1);
-            touched.insert(t2);
-            MVertex *other = 0;
-            for(int i = 0; i < 3; i++) {
-              if (t1->getVertex(0) != t2->getVertex(i) &&
-                  t1->getVertex(1) != t2->getVertex(i) &&
-                  t1->getVertex(2) != t2->getVertex(i)){
-                other = t2->getVertex(i);
-                break;
-              }
-            }
-            int start = 0;
-            for(int i = 0; i < 3; i++) {
-              if (t2->getVertex(0) != t1->getVertex(i) &&
-                  t2->getVertex(1) != t1->getVertex(i) &&
-                  t2->getVertex(2) != t1->getVertex(i)){
-                start=i;
-                break;
-              }
-            }
-            MQuadrangle *q = new MQuadrangle(t1->getVertex(start),
-                                             t1->getVertex((start+1)%3),
-                                             other,
-                                             t1->getVertex((start+2)%3));
-            gf->quadrangles.push_back(q);
-          }
-        }
-        free(elist);
-        pairs.clear();
-        Msg::Debug("Perfect Match Succeeded in Quadrangulation (%g sec)", matzeit);
-      }
-    }
-
-#else
-    Msg::Warning("Gmsh should be compiled with the Blossom IV code and CONCORDE "
-                 "in order to allow the Blossom optimization");
-#endif
-  }
-
-  std::vector<RecombineTriangle>::iterator itp = pairs.begin();
-  while(itp != pairs.end()){
-    // recombine if difference between max quad angle and right
-    // angle is smaller than tol
-    //    printf("%g %g\n",gf->meshAttributes.recombineAngle,itp->angle);
-    if(itp->angle < gf->meshAttributes.recombineAngle){
-      MElement *t1 = itp->t1;
-      MElement *t2 = itp->t2;
-      if(touched.find(t1) == touched.end() &&
-          touched.find(t2) == touched.end()){
-        touched.insert(t1);
-        touched.insert(t2);
-
-        int orientation = 0;
-        for(int i = 0; i < 3; i++) {
-          if(t1->getVertex(i) == itp->n1) {
-            if(t1->getVertex((i + 1) % 3) == itp->n2)
-              orientation = 1;
-            else
-              orientation = -1;
-            break;
-          }
-        }
-        MQuadrangle *q;
-        if(orientation < 0)
-          q = new MQuadrangle(itp->n1, itp->n3, itp->n2, itp->n4);
-        else
-          q = new MQuadrangle(itp->n1, itp->n4, itp->n2, itp->n3);
-        gf->quadrangles.push_back(q);
-      }
-    }
-    ++itp;
-  }
-
-  std::vector<MTriangle*> triangles2;
-  for(unsigned int i = 0; i < gf->triangles.size(); i++){
-    if(touched.find(gf->triangles[i]) == touched.end()){
-      triangles2.push_back(gf->triangles[i]);
-    }
-    else {
-      delete gf->triangles[i];
-    }
-  }
-  gf->triangles = triangles2;
-
-  if(CTX::instance()->mesh.algoRecombine != 1){
-    quadsToTriangles(gf, minqual);
-  }
-
-  return success;
-}
-
-static double printStats(GFace *gf,const char *message)
-{
-  int nbBad=0;
-  int nbInv=0;
-  double Qav=0;
-  double Qmin=1;
-  for (unsigned int i=0;i<gf->quadrangles.size();i++){
-    double Q = gf->quadrangles[i]->etaShapeMeasure() ;
-    if (Q <= 0.0)nbInv ++;
-    if (Q <= 0.1)nbBad ++;
-    Qav += Q;
-    Qmin = std::min(Q,Qmin);
-  }
-  Msg::Info("%s: %5d quads %5d triangles %1d invalid quads %2d quads with Q < 0.1 "
-            "Avg Q = %5.3f Min Q %5.3f", message, gf->quadrangles.size(),
-            gf->triangles.size(), nbInv, nbBad, Qav/gf->quadrangles.size(), Qmin);
-  return Qmin;
-}
-
-void recombineIntoQuads(GFace *gf,
-                        bool topologicalOpti,
-                        bool nodeRepositioning,
-                        double minqual,
-                        bool firstpass)
-{
-  double t1 = Cpu();
-
-  
-  bool haveParam = true;
-  bool saveAll = false; //CTX::instance()->mesh.saveAll;
-  if(gf->geomType() == GEntity::DiscreteSurface && !gf->getCompound())
-    haveParam = false;
-
-  if (saveAll) gf->model()->writeMSH("before.msh");
-  int success = _recombineIntoQuads(gf, minqual);
-
-  if (saveAll) gf->model()->writeMSH("raw.msh");
-  if(haveParam && nodeRepositioning){
-    RelocateVertices (gf,CTX::instance()->mesh.nbSmoothing);
-  }
-
-  // blossom-quad algo
-  if(success && CTX::instance()->mesh.algoRecombine != 0){
-    if(topologicalOpti){
-      if(haveParam){
-        if (saveAll) gf->model()->writeMSH("smoothed.msh");
-        int ITER=0;
-        std::set<MEdge,Less_Edge> prioritory;
-        int nbTwoQuadNodes = 1;
-        int nbDiamonds = 1;
-        while(nbTwoQuadNodes || nbDiamonds){
-          nbTwoQuadNodes = removeTwoQuadsNodes(gf);
-          nbDiamonds = removeDiamonds(gf) ;
-          if(haveParam) RelocateVertices (gf,CTX::instance()->mesh.nbSmoothing);
-          //          printStats (gf, "toto");
-          if (ITER > 20) break;
-          ITER ++;
-        }
-      }
-    }
-    quadsToTriangles(gf, minqual);
-    if(haveParam)RelocateVertices (gf,CTX::instance()->mesh.nbSmoothing);
-
-    double t2 = Cpu();
-    char name[256];
-    sprintf(name,"Blossom completed (%4.2f s)", t2 - t1);
-    if (firstpass)printStats (gf, name);
-    else printStats (gf, "Second pass               ");
-    return;
-  }
-
-  // simple recombination algo
-  for (int IT=0;IT<2;IT++){
-    _recombineIntoQuads(gf, 0);
-    if(haveParam)     RelocateVertices (gf,CTX::instance()->mesh.nbSmoothing);
-  }
-
-  if (saveAll) gf->model()->writeMSH("after.msh");
-
-  double t2 = Cpu();
-  Msg::Info("Simple recombination algorithm completed (%g s)", t2 - t1);
-}
-
-void quadsToTriangles(GFace *gf, double minqual)
-{
-
-  std::vector<MQuadrangle*> qds;
-  std::map<MElement*, std::pair<MElement*,MElement*> > change;
-  for (unsigned int i = 0; i < gf->quadrangles.size(); i++){
-    MQuadrangle *q = gf->quadrangles[i];
-    if (q->gammaShapeMeasure() < minqual){
-      MTriangle *t11 = new MTriangle (q->getVertex(0),q->getVertex(1),q->getVertex(2));
-      MTriangle *t12 = new MTriangle (q->getVertex(2),q->getVertex(3),q->getVertex(0));
-      MTriangle *t21 = new MTriangle (q->getVertex(1),q->getVertex(2),q->getVertex(3));
-      MTriangle *t22 = new MTriangle (q->getVertex(3),q->getVertex(0),q->getVertex(1));
-      double qual1 = std::min(t11->gammaShapeMeasure(),t12->gammaShapeMeasure());
-      double qual2 = std::min(t21->gammaShapeMeasure(),t22->gammaShapeMeasure());
-
-      double surf1 = surfaceFaceUV(t11,gf) + surfaceFaceUV(t12,gf);
-      double surf2 = surfaceFaceUV(t21,gf) + surfaceFaceUV(t22,gf);
-
-      int option = 0;
-      if (surf1 > surf2 * (1.+1.e-8))option = 2;
-      else if (surf2 > surf1 * (1.+1.e-8))option = 1;
-
-      if (option == 1 || (option == 0 && qual1 > qual2)){
-        gf->triangles.push_back(t11);
-        gf->triangles.push_back(t12);
-	change[q] = std::make_pair(t11,t12);
-        delete t21; delete t22;
-      }
-      else {
-        gf->triangles.push_back(t21);
-        gf->triangles.push_back(t22);
-	change[q] = std::make_pair(t21,t22);
-        delete t11; delete t12;
-      }
-      delete q; // FIXME this makes gmsh to crash when creating BL with triangles
-      // FIXED (JF)
-    }
-    else {
-      qds.push_back(q);
-    }
-  }
-  gf->quadrangles = qds;
-
-  BoundaryLayerColumns* _columns = gf->getColumns();
-  if (!_columns)return;
-  for ( std::map<MElement*,std::vector<MElement*> >::iterator it = _columns->_elemColumns.begin();
-	it != _columns->_elemColumns.end();it++){
-    std::vector<MElement *> &e = it->second;
-    std::vector<MElement *> eOld = e;
-    e.clear();
-    for (unsigned int i=0;i<eOld.size();i++){
-      MElement *ee = eOld[i];
-      std::map<MElement*, std::pair<MElement*,MElement*> >::iterator it2 = change.find(ee);
-      if (it2 == change.end()){
-	e.push_back(ee);
-      }
-      else {
-	e.push_back(it2->second.first);
-	e.push_back(it2->second.second);
-      }
-    }
-  }
-
-
-}
diff --git a/Mesh/meshGRegion.cpp b/Mesh/meshGRegion.cpp
index 4284e3e0e39c6456b9992ff93253d95cc123bda7..7f2864c378d9de09b329a61794d50846f6b8acb1 100644
--- a/Mesh/meshGRegion.cpp
+++ b/Mesh/meshGRegion.cpp
@@ -705,9 +705,8 @@ static void MeshDelaunayVolumeNewCode(std::vector<GRegion*> &regions)
   std::list<GVertex*> oldEmbVertices = gr->embeddedVertices();
   gr->embeddedVertices() = allEmbVertices;
 
-  try{
-    meshGRegionBoundaryRecovery(gr);
-    /*
+  meshGRegionBoundaryRecovery(gr);
+  /*
     FILE *fp = Fopen("debug.pos", "w");
     if(fp){
       fprintf(fp, "View \"debug\" {\n");
@@ -716,16 +715,7 @@ static void MeshDelaunayVolumeNewCode(std::vector<GRegion*> &regions)
       fprintf(fp, "};\n");
       fclose(fp);
     }
-    */
-  }
-  catch(int err){
-    if(err == 3){
-      Msg::Warning("Self-intersecting surface mesh: TODO!");
-    }
-    else{
-      Msg::Error("Could not recover boundary: error %d", err);
-    }
-  }
+  */
 
   // sort triangles in all model faces in order to be able to search in vectors
   std::list<GFace*>::iterator itf =  allFaces.begin();
diff --git a/Mesh/meshGRegionBoundaryRecovery.cpp b/Mesh/meshGRegionBoundaryRecovery.cpp
index fdbb78dbb7143fab0e6f1ae06414123156effdf6..6eedb2369c4b5a9989bdfcb976c535caf4543ea6 100644
--- a/Mesh/meshGRegionBoundaryRecovery.cpp
+++ b/Mesh/meshGRegionBoundaryRecovery.cpp
@@ -6,10 +6,12 @@
 #include <stdio.h>
 #include <string.h>
 #include <assert.h>
+#include <sstream>
 #include "GmshConfig.h"
 #include "meshGRegionBoundaryRecovery.h"
 #include "meshGRegionDelaunayInsertion.h"
 #include "robustPredicates.h"
+#include "GModel.h"
 #include "GRegion.h"
 #include "GFace.h"
 #include "MVertex.h"
@@ -25,6 +27,15 @@
 typedef unsigned long intptr_t;
 #endif
 
+#if defined(HAVE_POST)
+#include "PView.h"
+#endif
+
+#if defined(HAVE_FLTK)
+#include "FlGui.h"
+#include "drawContext.h"
+#endif
+
 namespace tetgenBR
 {
 
@@ -92,8 +103,10 @@ static int clock(){ return 0; }
 #if !defined(TETLIBRARY)
 #define TETLIBRARY
 #endif
+#define printf Msg::Info
 #include "tetgenBR.h"
 #include "tetgenBR.cxx"
+#undef printf
 
 bool tetgenmesh::reconstructmesh(void *p)
 {
@@ -425,8 +438,6 @@ bool tetgenmesh::reconstructmesh(void *p)
     // Construct a map from points to subfaces.
     makepoint2submap(subfaces, idx2shlist, shperverlist);
 
-    //    printf("coucou1\n");
-
     // Process the set of PSC edges.
     // Remeber that all segments have default marker '-1'.
     //    int COUNTER = 0;
@@ -525,13 +536,10 @@ bool tetgenmesh::reconstructmesh(void *p)
   // Boundary recovery.
 
   clock_t t;
-  //    printf("coucou2\n");
   Msg::Info("Boundary Recovery...");
   recoverboundary(t);
-  //    printf("coucou3\n");
 
   carveholes();
-  //    printf("coucou4\n");
 
   if (subvertstack->objects > 0l) {
     suppresssteinerpoints();
@@ -539,7 +547,7 @@ bool tetgenmesh::reconstructmesh(void *p)
 
   recoverdelaunay();
 
-  // let's trry
+  // let's try
   optimizemesh();
 
   if ((dupverts > 0l) || (unuverts > 0l)) {
@@ -740,12 +748,10 @@ bool tetgenmesh::reconstructmesh(void *p)
       //      assert((int)_vertices.size() == points->items);
     }
 
-    if (!_extras.empty())Msg::Info("We add %d steiner points...",_extras.size());
-
+    if (!_extras.empty())
+      Msg::Info("We add %d steiner points...", _extras.size());
 
     if (l_edges.size() > 0) {
-
-
       // There are Steiner points on segments!
       face segloop;
       // Re-create the segment mesh in the corresponding GEdges.
@@ -1091,8 +1097,94 @@ void tetgenmesh::outmesh2medit(const char* mfilename)
 
 bool meshGRegionBoundaryRecovery(GRegion *gr)
 {
-  tetgenBR::tetgenmesh *m = new tetgenBR::tetgenmesh();
-  bool ret = m->reconstructmesh((void*)gr);
-  delete m;
+  bool ret = false;
+  try{
+    tetgenBR::tetgenmesh *m = new tetgenBR::tetgenmesh();
+    ret = m->reconstructmesh((void*)gr);
+    delete m;
+  }
+  catch(int err){
+    if(err == 1){
+      Msg::Error("Out of memory in boundary mesh recovery");
+      ret = false;
+    }
+    else if(err == 3){
+      std::string what;
+      bool pnt = true;
+      switch(tetgenBR::sevent.e_type){
+      case 1: what = "segment-segment intersection"; break;
+      case 2: what = "segment-facet intersection"; break;
+      case 3: what = "facet-facet intersection"; break;
+      case 4: what = "overlapping segments"; pnt = false; break;
+      case 5: what = "segment in facet"; pnt = false; break;
+      case 6: what = "overlapping facets"; pnt = false; break;
+      case 7: what = "vertex in segment"; break;
+      case 8: what = "vertex in facet"; break;
+      default: what = "unknown"; break;
+      }
+      int vtags[2][3] = {{tetgenBR::sevent.f_vertices1[0],
+                          tetgenBR::sevent.f_vertices1[1],
+                          tetgenBR::sevent.f_vertices1[2]},
+                         {tetgenBR::sevent.f_vertices2[0],
+                          tetgenBR::sevent.f_vertices2[1],
+                          tetgenBR::sevent.f_vertices2[2]}};
+      int ftags[2] = {tetgenBR::sevent.f_marker1, tetgenBR::sevent.f_marker2};
+      int etags[2] = {tetgenBR::sevent.s_marker1, tetgenBR::sevent.s_marker2};
+      std::ostringstream pb;
+      std::vector<double> x, y, z, val;
+      for(int f = 0; f < 2; f++){
+        if(ftags[f] > 0){
+          GFace *gf = gr->model()->getFaceByTag(ftags[f]);
+          if(gf){
+            gr->model()->addLastMeshEntityError(gf);
+            pb << " surface " << ftags[f];
+          }
+        }
+        if(etags[f] > 0){
+          GEdge *ge = gr->model()->getEdgeByTag(etags[f]);
+          if(ge){
+            gr->model()->addLastMeshEntityError(ge);
+            pb << " curve " << etags[f];
+          }
+        }
+        for(int i = 0; i < 3; i++){
+          if(vtags[f][i]){
+            MVertex *v = gr->model()->getMeshVertexByTag(vtags[f][i]);
+            if(v){
+              gr->model()->addLastMeshVertexError(v);
+              x.push_back(v->x());
+              y.push_back(v->y());
+              z.push_back(v->z());
+              val.push_back(f + 1.);
+            }
+          }
+        }
+      }
+      if(pnt){
+        double px = tetgenBR::sevent.int_point[0];
+        double py = tetgenBR::sevent.int_point[1];
+        double pz = tetgenBR::sevent.int_point[2];
+        pb << ", intersection (" << px << "," << py << "," << pz << ")";
+        x.push_back(px);
+        y.push_back(py);
+        z.push_back(pz);
+        val.push_back(3.);
+      }
+      Msg::Error("Invalid boundary mesh (%s) on%s", what.c_str(), pb.str().c_str());
+#if defined(HAVE_POST)
+      new PView("Boundary mesh issue", x, y, z, val);
+#if defined(HAVE_FLTK)
+      if(FlGui::available())
+        FlGui::instance()->updateViews(true, true);
+      drawContext::global()->draw();
+#endif
+#endif
+      ret = false;
+    }
+    else{
+      Msg::Error("Could not recover boundary mesh: error %d", err);
+      ret = false;
+    }
+  }
   return ret;
 }
diff --git a/Mesh/meshGRegionDelaunayInsertion.cpp b/Mesh/meshGRegionDelaunayInsertion.cpp
index 8e5fce55d6b749d691109debb8d6fe85666e3955..799fa79f23d5d3b787cc2169435ce2a556508721 100644
--- a/Mesh/meshGRegionDelaunayInsertion.cpp
+++ b/Mesh/meshGRegionDelaunayInsertion.cpp
@@ -1490,7 +1490,7 @@ void delaunayMeshIn3D(std::vector<MVertex*> &v, std::vector<MTetrahedron*> &resu
                       bool removeBox)
 {
   double t1 = Cpu();
-  delaunayTriangulation (1, 1, v, result);
+  delaunayTriangulation(1, 1, v, result);
   double t2 = Cpu();
   Msg::Info("Tetrahedrization of %d points in %g seconds",v.size(),t2-t1);
 }
diff --git a/Numeric/fullMatrix.cpp b/Numeric/fullMatrix.cpp
index 6e26d28bbb1f4f45e031f7d7cb628445d9001b14..09cca1cd5620a273784e9f3db9764c402ac6f2c8 100644
--- a/Numeric/fullMatrix.cpp
+++ b/Numeric/fullMatrix.cpp
@@ -23,6 +23,7 @@
 #if defined(HAVE_BLAS)
 extern "C" {
   void F77NAME(daxpy)(int *n, double *alpha, double *x, int *incx, double *y, int *incy);
+  void F77NAME(zaxpy)(int *n, std::complex<double> *alpha, std::complex<double> *x, int *incx, std::complex<double> *y, int *incy);
   void F77NAME(dcopy)(int *n, double *a, int *inca, double *b, int *incb);
   void F77NAME(zcopy)(int *n, std::complex<double> *a, int *inca, std::complex<double> *b, int *incb);
   void F77NAME(dgemm)(const char *transa, const char *transb, int *m, int *n, int *k,
@@ -52,6 +53,14 @@ void fullVector<double>::axpy(const fullVector<double> &x,double alpha)
   F77NAME(daxpy)(&M, &alpha, x._data,&INCX, _data, &INCY);
 }
 
+template<>
+void fullVector<std::complex<double> >::axpy(const fullVector<std::complex<double> > &x,
+                                             std::complex<double> alpha)
+{
+  int M = _r, INCX = 1, INCY = 1;
+  F77NAME(zaxpy)(&M, &alpha, x._data,&INCX, _data, &INCY);
+}
+
 template<>
 void fullVector<double>::setAll(const fullVector<double> &m)
 {
diff --git a/Numeric/fullMatrix.h b/Numeric/fullMatrix.h
index ec35e9b5060c44c316308859ee8e6e8a3567d5dc..d944b9160a62b6b7b13a9c0ee57deb7c212b5650 100644
--- a/Numeric/fullMatrix.h
+++ b/Numeric/fullMatrix.h
@@ -10,6 +10,7 @@
 #include "GmshMessage.h"
 #include <cmath>
 #include <cstdio>
+#include <complex>
 
 template <class scalar> class fullMatrix;
 
@@ -176,12 +177,7 @@ class fullVector
   /**
      @return Returns the @f$ L^2 @f$ norm of this fullVector.
   */
-  inline scalar norm() const
-  {
-    scalar n = 0.;
-    for(int i = 0; i < _r; ++i) n += _data[i] * _data[i];
-    return sqrt(n);
-  }
+  inline scalar norm() const; // Specialised in this file
 
   /**
      @param r A positive integer;
@@ -397,6 +393,24 @@ class fullVector
   void setOwnData(bool ownData) {_own_data = ownData;};
 };
 
+// Specialisation of fullVector<scalar>::norm() const
+template<>
+inline double fullVector<double>::norm() const
+{
+  double n = 0.;
+  for(int i = 0; i < _r; ++i) n += _data[i] * _data[i];
+  return sqrt(n);
+}
+template<>
+inline std::complex<double> fullVector<std::complex<double> >::norm() const
+{
+  double n = 0.;
+  for(int i = 0; i < _r; ++i) n += _data[i].real() * _data[i].real() +
+                                   _data[i].imag() * _data[i].imag();
+  return std::complex<double>(sqrt(n), 0.);
+}
+
+
 // An abstract interface for dense matrix of scalar
 template <class scalar>
 class fullMatrix
diff --git a/Parser/Gmsh.tab.cpp b/Parser/Gmsh.tab.cpp
index 27a6c52f61f6181431ebf71ecb63846d551e187e..833158f6e5a05d59d49f6bafe7b32ef60515875a 100644
--- a/Parser/Gmsh.tab.cpp
+++ b/Parser/Gmsh.tab.cpp
@@ -955,16 +955,16 @@ union yyalloc
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  5
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   14990
+#define YYLAST   15714
 
 /* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  249
 /* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  113
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  590
+#define YYNRULES  599
 /* YYNRULES -- Number of states.  */
-#define YYNSTATES  2077
+#define YYNSTATES  2110
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
@@ -1053,45 +1053,45 @@ static const yytype_uint16 yyprhs[] =
      929,   937,   946,   954,   962,   971,   980,   993,   994,  1004,
     1006,  1008,  1010,  1012,  1017,  1019,  1021,  1023,  1028,  1030,
     1032,  1037,  1039,  1041,  1043,  1048,  1054,  1066,  1072,  1082,
-    1092,  1097,  1107,  1117,  1119,  1121,  1122,  1125,  1132,  1141,
-    1152,  1167,  1184,  1197,  1212,  1227,  1242,  1257,  1266,  1275,
-    1282,  1287,  1293,  1300,  1307,  1311,  1316,  1320,  1326,  1333,
-    1339,  1343,  1347,  1352,  1358,  1363,  1369,  1373,  1379,  1387,
-    1395,  1399,  1407,  1411,  1414,  1417,  1420,  1423,  1426,  1442,
-    1445,  1448,  1451,  1454,  1457,  1474,  1486,  1493,  1502,  1511,
-    1522,  1524,  1527,  1530,  1532,  1536,  1540,  1545,  1550,  1552,
-    1554,  1560,  1572,  1586,  1587,  1595,  1596,  1610,  1611,  1627,
-    1628,  1635,  1645,  1648,  1652,  1663,  1665,  1668,  1674,  1682,
-    1685,  1688,  1692,  1695,  1699,  1702,  1706,  1716,  1723,  1725,
-    1727,  1729,  1731,  1733,  1734,  1737,  1741,  1745,  1750,  1760,
-    1765,  1780,  1781,  1785,  1786,  1788,  1789,  1792,  1793,  1796,
-    1797,  1800,  1807,  1815,  1822,  1828,  1832,  1841,  1847,  1852,
-    1859,  1871,  1883,  1902,  1921,  1934,  1947,  1960,  1971,  1976,
-    1981,  1986,  1991,  1994,  1998,  2005,  2007,  2009,  2011,  2014,
-    2020,  2028,  2039,  2041,  2045,  2048,  2051,  2054,  2058,  2062,
-    2066,  2070,  2074,  2078,  2082,  2086,  2090,  2094,  2098,  2102,
-    2106,  2110,  2114,  2118,  2122,  2126,  2132,  2137,  2142,  2147,
-    2152,  2157,  2162,  2167,  2172,  2177,  2182,  2189,  2194,  2199,
-    2204,  2209,  2214,  2219,  2224,  2229,  2236,  2243,  2250,  2255,
-    2257,  2259,  2261,  2263,  2265,  2267,  2269,  2271,  2273,  2275,
-    2277,  2278,  2285,  2287,  2292,  2299,  2301,  2306,  2311,  2316,
-    2323,  2329,  2337,  2346,  2357,  2362,  2367,  2374,  2379,  2383,
-    2386,  2392,  2398,  2402,  2408,  2415,  2424,  2431,  2440,  2447,
-    2452,  2460,  2467,  2474,  2481,  2486,  2493,  2498,  2499,  2502,
-    2503,  2506,  2507,  2515,  2517,  2521,  2523,  2525,  2528,  2529,
-    2533,  2535,  2538,  2541,  2545,  2549,  2561,  2571,  2579,  2587,
-    2589,  2593,  2595,  2597,  2600,  2604,  2609,  2615,  2617,  2619,
-    2622,  2626,  2630,  2636,  2641,  2644,  2648,  2665,  2671,  2673,
-    2675,  2677,  2681,  2687,  2695,  2700,  2705,  2710,  2717,  2724,
-    2733,  2742,  2747,  2762,  2767,  2772,  2774,  2776,  2780,  2784,
-    2794,  2802,  2804,  2810,  2814,  2821,  2823,  2827,  2829,  2831,
-    2836,  2841,  2845,  2851,  2858,  2867,  2874,  2880,  2886,  2892,
-    2898,  2900,  2905,  2907,  2909,  2911,  2913,  2918,  2925,  2930,
-    2937,  2943,  2951,  2956,  2961,  2966,  2975,  2980,  2985,  2990,
-    2995,  3004,  3013,  3020,  3025,  3032,  3037,  3039,  3044,  3049,
-    3050,  3057,  3062,  3065,  3070,  3075,  3077,  3079,  3083,  3085,
-    3087,  3091,  3095,  3099,  3105,  3113,  3119,  3125,  3134,  3136,
-    3138
+    1092,  1097,  1107,  1117,  1119,  1121,  1122,  1125,  1132,  1140,
+    1147,  1155,  1164,  1175,  1190,  1207,  1220,  1235,  1250,  1265,
+    1280,  1289,  1298,  1305,  1310,  1316,  1323,  1330,  1334,  1339,
+    1343,  1349,  1356,  1362,  1367,  1371,  1376,  1380,  1385,  1391,
+    1396,  1402,  1406,  1412,  1420,  1428,  1432,  1440,  1444,  1447,
+    1450,  1453,  1456,  1459,  1475,  1478,  1481,  1484,  1487,  1490,
+    1507,  1519,  1526,  1535,  1544,  1555,  1557,  1560,  1563,  1565,
+    1569,  1573,  1578,  1583,  1585,  1587,  1593,  1605,  1619,  1620,
+    1628,  1629,  1643,  1644,  1660,  1661,  1668,  1678,  1681,  1685,
+    1696,  1698,  1701,  1707,  1715,  1718,  1721,  1725,  1728,  1732,
+    1735,  1739,  1749,  1756,  1758,  1760,  1762,  1764,  1766,  1767,
+    1770,  1774,  1778,  1783,  1793,  1798,  1813,  1814,  1818,  1819,
+    1821,  1822,  1825,  1826,  1829,  1830,  1833,  1840,  1848,  1855,
+    1861,  1865,  1874,  1880,  1885,  1892,  1904,  1916,  1935,  1954,
+    1967,  1980,  1993,  2004,  2009,  2014,  2019,  2024,  2027,  2031,
+    2038,  2040,  2042,  2044,  2047,  2053,  2061,  2072,  2074,  2078,
+    2081,  2084,  2087,  2091,  2095,  2099,  2103,  2107,  2111,  2115,
+    2119,  2123,  2127,  2131,  2135,  2139,  2143,  2147,  2151,  2155,
+    2159,  2165,  2170,  2175,  2180,  2185,  2190,  2195,  2200,  2205,
+    2210,  2215,  2222,  2227,  2232,  2237,  2242,  2247,  2252,  2257,
+    2262,  2269,  2276,  2283,  2288,  2290,  2292,  2294,  2296,  2298,
+    2300,  2302,  2304,  2306,  2308,  2310,  2311,  2318,  2320,  2325,
+    2332,  2334,  2339,  2344,  2349,  2356,  2362,  2370,  2379,  2390,
+    2395,  2400,  2407,  2412,  2416,  2419,  2425,  2431,  2435,  2441,
+    2448,  2457,  2464,  2473,  2480,  2485,  2493,  2500,  2507,  2514,
+    2519,  2526,  2531,  2532,  2535,  2536,  2539,  2540,  2548,  2550,
+    2554,  2556,  2558,  2561,  2562,  2566,  2568,  2571,  2574,  2578,
+    2582,  2594,  2604,  2612,  2620,  2622,  2626,  2628,  2630,  2633,
+    2637,  2642,  2648,  2650,  2654,  2656,  2659,  2663,  2667,  2673,
+    2678,  2683,  2686,  2691,  2694,  2698,  2715,  2721,  2723,  2725,
+    2727,  2731,  2737,  2745,  2750,  2755,  2760,  2767,  2774,  2783,
+    2792,  2797,  2812,  2817,  2822,  2824,  2826,  2830,  2834,  2844,
+    2852,  2854,  2860,  2864,  2871,  2873,  2877,  2879,  2881,  2886,
+    2891,  2895,  2901,  2908,  2917,  2924,  2930,  2936,  2942,  2948,
+    2950,  2955,  2957,  2959,  2961,  2963,  2968,  2975,  2980,  2987,
+    2993,  3001,  3006,  3011,  3016,  3025,  3030,  3035,  3040,  3045,
+    3054,  3063,  3070,  3075,  3082,  3087,  3089,  3094,  3099,  3100,
+    3107,  3112,  3115,  3120,  3125,  3127,  3129,  3133,  3135,  3137,
+    3141,  3145,  3149,  3155,  3163,  3169,  3175,  3184,  3186,  3188
 };
 
 /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
@@ -1210,158 +1210,163 @@ static const yytype_int16 yyrhs[] =
      347,   244,    97,   243,   330,   244,    -1,   148,    94,   239,
      330,   240,   243,   347,   244,     6,    -1,   301,    -1,   299,
       -1,    -1,   301,   293,    -1,   301,   295,   243,   347,   244,
-       6,    -1,   138,   123,   239,   330,   240,     7,   344,     6,
-      -1,   138,    91,   239,   330,   240,     7,   243,   343,   244,
-       6,    -1,   138,   123,   239,   330,   240,     7,   243,   341,
-     248,   341,   248,   347,   244,     6,    -1,   138,   123,   239,
-     330,   240,     7,   243,   341,   248,   341,   248,   341,   248,
-     347,   244,     6,    -1,   138,    95,   239,   330,   240,     7,
-     243,   341,   248,   347,   244,     6,    -1,   138,   101,   239,
-     330,   240,     7,   243,   341,   248,   341,   248,   347,   244,
-       6,    -1,   138,   102,   239,   330,   240,     7,   243,   341,
-     248,   341,   248,   347,   244,     6,    -1,   138,   104,   239,
-     330,   240,     7,   243,   341,   248,   341,   248,   347,   244,
-       6,    -1,   138,   105,   239,   330,   240,     7,   243,   341,
-     248,   341,   248,   347,   244,     6,    -1,   138,     4,   239,
-     330,   240,     7,   344,     6,    -1,   138,     4,   239,   330,
-     240,     7,     5,     6,    -1,   138,     4,   243,   330,   244,
-       6,    -1,   149,   243,   301,   244,    -1,   132,   149,   243,
-     301,   244,    -1,   149,   185,   241,   330,   242,     6,    -1,
-     149,     4,   241,   330,   242,     6,    -1,   149,   361,     6,
-      -1,   149,     4,     4,     6,    -1,   149,    84,     6,    -1,
-     174,   348,   243,   301,   244,    -1,   132,   174,   348,   243,
-     301,   244,    -1,   209,   330,   243,   301,   244,    -1,   190,
-       5,     6,    -1,   191,     5,     6,    -1,   190,   243,   301,
-     244,    -1,   132,   190,   243,   301,   244,    -1,   191,   243,
-     301,   244,    -1,   132,   191,   243,   301,   244,    -1,   361,
-     352,     6,    -1,    73,   239,   358,   240,     6,    -1,   361,
-     361,   241,   330,   242,   351,     6,    -1,   361,   361,   361,
-     241,   330,   242,     6,    -1,   361,   330,     6,    -1,   130,
-     239,     4,   240,   245,     4,     6,    -1,   168,     4,     6,
-      -1,   183,     6,    -1,   184,     6,    -1,    70,     6,    -1,
-      71,     6,    -1,    64,     6,    -1,    64,   243,   330,   248,
-     330,   248,   330,   248,   330,   248,   330,   248,   330,   244,
-       6,    -1,    65,     6,    -1,    66,     6,    -1,    78,     6,
-      -1,    79,     6,    -1,   115,     6,    -1,   116,   243,   347,
-     244,   243,   347,   244,   243,   343,   244,   243,   330,   248,
-     330,   244,     6,    -1,   188,   239,   243,   347,   244,   248,
-     352,   248,   352,   240,     6,    -1,   176,   239,   330,     8,
-     330,   240,    -1,   176,   239,   330,     8,   330,     8,   330,
-     240,    -1,   176,     4,   177,   243,   330,     8,   330,   244,
-      -1,   176,     4,   177,   243,   330,     8,   330,     8,   330,
-     244,    -1,   178,    -1,   189,     4,    -1,   189,   352,    -1,
-     186,    -1,   187,   361,     6,    -1,   187,   352,     6,    -1,
-     179,   239,   330,   240,    -1,   180,   239,   330,   240,    -1,
-     181,    -1,   182,    -1,   137,   341,   243,   301,   244,    -1,
-     137,   243,   341,   248,   341,   248,   330,   244,   243,   301,
-     244,    -1,   137,   243,   341,   248,   341,   248,   341,   248,
-     330,   244,   243,   301,   244,    -1,    -1,   137,   341,   243,
-     301,   311,   315,   244,    -1,    -1,   137,   243,   341,   248,
-     341,   248,   330,   244,   243,   301,   312,   315,   244,    -1,
-      -1,   137,   243,   341,   248,   341,   248,   341,   248,   330,
-     244,   243,   301,   313,   315,   244,    -1,    -1,   137,   243,
-     301,   314,   315,   244,    -1,   137,   243,   301,   244,   129,
-     109,   243,   330,   244,    -1,   119,   344,    -1,   124,   119,
-     344,    -1,   121,   243,   347,   244,   243,   347,   244,   243,
-     330,   244,    -1,   316,    -1,   315,   316,    -1,   154,   243,
-     330,   244,     6,    -1,   154,   243,   344,   248,   344,   244,
-       6,    -1,   155,     6,    -1,   146,     6,    -1,   146,   330,
-       6,    -1,   160,     6,    -1,   160,   162,     6,    -1,   161,
-       6,    -1,   161,   162,     6,    -1,   156,   239,   330,   240,
-       7,   344,   129,   330,     6,    -1,   129,     4,   241,   330,
-     242,     6,    -1,   140,    -1,   141,    -1,   142,    -1,   143,
-      -1,   144,    -1,    -1,   149,     6,    -1,   132,   149,     6,
-      -1,   149,   330,     6,    -1,   132,   149,   330,     6,    -1,
-     317,   243,   301,   318,   244,   243,   301,   318,   244,    -1,
-     106,   239,   351,   240,    -1,   317,   239,   330,   240,     7,
-     243,   301,   318,   244,   243,   301,   318,   244,     6,    -1,
-      -1,   129,     4,   330,    -1,    -1,     4,    -1,    -1,     7,
-     344,    -1,    -1,     7,   330,    -1,    -1,   139,   344,    -1,
-     111,   112,   344,     7,   330,     6,    -1,   125,    94,   345,
-       7,   330,   321,     6,    -1,   125,    97,   345,   323,   322,
-       6,    -1,   125,    99,   345,   323,     6,    -1,   163,   345,
-       6,    -1,   152,    97,   243,   347,   244,     7,   330,     6,
-      -1,   146,    97,   345,   324,     6,    -1,   146,    99,   345,
-       6,    -1,   147,    97,   345,     7,   330,     6,    -1,   128,
-      94,   243,   347,   244,     7,   243,   347,   244,   325,     6,
-      -1,   128,    97,   243,   347,   244,     7,   243,   347,   244,
-     325,     6,    -1,   128,    94,   243,   347,   244,     7,   243,
-     347,   244,   133,   243,   341,   248,   341,   248,   330,   244,
-       6,    -1,   128,    97,   243,   347,   244,     7,   243,   347,
-     244,   133,   243,   341,   248,   341,   248,   330,   244,     6,
-      -1,   128,    94,   243,   347,   244,     7,   243,   347,   244,
-     134,   341,     6,    -1,   128,    97,   243,   347,   244,     7,
-     243,   347,   244,   134,   341,     6,    -1,   128,    97,   330,
-     243,   347,   244,     7,   330,   243,   347,   244,     6,    -1,
-     295,   243,   347,   244,   177,   295,   243,   330,   244,     6,
-      -1,   153,   297,   345,     6,    -1,   117,   298,   345,     6,
-      -1,   131,    94,   344,     6,    -1,   127,   296,   344,     6,
-      -1,   150,     6,    -1,   150,     4,     6,    -1,   150,    91,
-     243,   347,   244,     6,    -1,   198,    -1,   199,    -1,   200,
-      -1,   328,     6,    -1,   328,   243,   344,   244,     6,    -1,
-     328,   243,   344,   248,   344,   244,     6,    -1,   328,   239,
-     344,   240,   243,   344,   248,   344,   244,     6,    -1,   331,
-      -1,   239,   330,   240,    -1,   228,   330,    -1,   227,   330,
-      -1,   234,   330,    -1,   330,   228,   330,    -1,   330,   227,
-     330,    -1,   330,   229,   330,    -1,   330,   230,   330,    -1,
-     330,   232,   330,    -1,   330,   233,   330,    -1,   330,   231,
-     330,    -1,   330,   238,   330,    -1,   330,   221,   330,    -1,
-     330,   222,   330,    -1,   330,   226,   330,    -1,   330,   225,
-     330,    -1,   330,   220,   330,    -1,   330,   219,   330,    -1,
-     330,   218,   330,    -1,   330,   217,   330,    -1,   330,   223,
-     330,    -1,   330,   224,   330,    -1,   330,   216,   330,     8,
-     330,    -1,    16,   273,   330,   274,    -1,    17,   273,   330,
-     274,    -1,    18,   273,   330,   274,    -1,    19,   273,   330,
-     274,    -1,    20,   273,   330,   274,    -1,    21,   273,   330,
-     274,    -1,    22,   273,   330,   274,    -1,    23,   273,   330,
-     274,    -1,    24,   273,   330,   274,    -1,    26,   273,   330,
-     274,    -1,    27,   273,   330,   248,   330,   274,    -1,    28,
-     273,   330,   274,    -1,    29,   273,   330,   274,    -1,    30,
-     273,   330,   274,    -1,    31,   273,   330,   274,    -1,    32,
-     273,   330,   274,    -1,    33,   273,   330,   274,    -1,    34,
-     273,   330,   274,    -1,    35,   273,   330,   274,    -1,    36,
-     273,   330,   248,   330,   274,    -1,    37,   273,   330,   248,
-     330,   274,    -1,    38,   273,   330,   248,   330,   274,    -1,
-      25,   273,   330,   274,    -1,     3,    -1,    10,    -1,    15,
-      -1,    11,    -1,    12,    -1,   205,    -1,   206,    -1,   207,
-      -1,    75,    -1,    76,    -1,    77,    -1,    -1,    83,   273,
-     330,   332,   283,   274,    -1,   335,    -1,   196,   273,   351,
-     274,    -1,   196,   273,   351,   248,   330,   274,    -1,   337,
-      -1,   361,   241,   330,   242,    -1,   361,   239,   330,   240,
-      -1,   201,   239,   337,   240,    -1,   201,   239,   337,   245,
-     338,   240,    -1,   203,   239,   337,   333,   240,    -1,   203,
-     239,   337,   245,   338,   333,   240,    -1,   203,   239,   337,
-     273,   330,   274,   333,   240,    -1,   203,   239,   337,   245,
-     338,   273,   330,   274,   333,   240,    -1,   202,   239,   352,
-     240,    -1,   246,   361,   273,   274,    -1,   246,   337,   245,
-     338,   273,   274,    -1,    86,   273,   361,   274,    -1,    86,
-     273,   274,    -1,   361,   272,    -1,   361,   241,   330,   242,
-     272,    -1,   361,   239,   330,   240,   272,    -1,   361,   245,
-     338,    -1,   361,     9,   361,   245,   338,    -1,   361,   245,
-     338,   239,   330,   240,    -1,   361,     9,   361,   245,   338,
-     239,   330,   240,    -1,   361,   245,   338,   241,   330,   242,
-      -1,   361,     9,   361,   245,   338,   241,   330,   242,    -1,
-     361,   241,   330,   242,   245,     4,    -1,   361,   245,     4,
-     272,    -1,   361,   241,   330,   242,   245,     4,   272,    -1,
-     192,   239,   351,   248,   330,   240,    -1,    56,   239,   344,
-     248,   344,   240,    -1,    57,   273,   351,   248,   351,   274,
-      -1,    55,   273,   351,   274,    -1,    58,   273,   351,   248,
-     351,   274,    -1,    63,   239,   358,   240,    -1,    -1,   248,
-     330,    -1,    -1,   248,   351,    -1,    -1,    84,   337,   340,
-     336,   241,   284,   242,    -1,   361,    -1,   361,     9,   361,
-      -1,     4,    -1,    87,    -1,    87,   330,    -1,    -1,   239,
-     339,   240,    -1,   342,    -1,   228,   341,    -1,   227,   341,
-      -1,   341,   228,   341,    -1,   341,   227,   341,    -1,   243,
-     330,   248,   330,   248,   330,   248,   330,   248,   330,   244,
-      -1,   243,   330,   248,   330,   248,   330,   248,   330,   244,
-      -1,   243,   330,   248,   330,   248,   330,   244,    -1,   239,
-     330,   248,   330,   248,   330,   240,    -1,   344,    -1,   343,
-     248,   344,    -1,   330,    -1,   346,    -1,   243,   244,    -1,
-     243,   347,   244,    -1,   228,   243,   347,   244,    -1,   330,
-     229,   243,   347,   244,    -1,   344,    -1,     5,    -1,   228,
-     346,    -1,   330,   229,   346,    -1,   330,     8,   330,    -1,
-     330,     8,   330,     8,   330,    -1,    91,   243,   330,   244,
-      -1,   295,     5,    -1,   126,   295,   345,    -1,   295,   177,
+       6,    -1,   301,   126,   295,   243,   347,   244,     6,    -1,
+     301,   295,   243,     8,   244,     6,    -1,   301,   126,   295,
+     243,     8,   244,     6,    -1,   138,   123,   239,   330,   240,
+       7,   344,     6,    -1,   138,    91,   239,   330,   240,     7,
+     243,   343,   244,     6,    -1,   138,   123,   239,   330,   240,
+       7,   243,   341,   248,   341,   248,   347,   244,     6,    -1,
+     138,   123,   239,   330,   240,     7,   243,   341,   248,   341,
+     248,   341,   248,   347,   244,     6,    -1,   138,    95,   239,
+     330,   240,     7,   243,   341,   248,   347,   244,     6,    -1,
+     138,   101,   239,   330,   240,     7,   243,   341,   248,   341,
+     248,   347,   244,     6,    -1,   138,   102,   239,   330,   240,
+       7,   243,   341,   248,   341,   248,   347,   244,     6,    -1,
+     138,   104,   239,   330,   240,     7,   243,   341,   248,   341,
+     248,   347,   244,     6,    -1,   138,   105,   239,   330,   240,
+       7,   243,   341,   248,   341,   248,   347,   244,     6,    -1,
+     138,     4,   239,   330,   240,     7,   344,     6,    -1,   138,
+       4,   239,   330,   240,     7,     5,     6,    -1,   138,     4,
+     243,   330,   244,     6,    -1,   149,   243,   301,   244,    -1,
+     132,   149,   243,   301,   244,    -1,   149,   185,   241,   330,
+     242,     6,    -1,   149,     4,   241,   330,   242,     6,    -1,
+     149,   361,     6,    -1,   149,     4,     4,     6,    -1,   149,
+      84,     6,    -1,   174,   348,   243,   301,   244,    -1,   132,
+     174,   348,   243,   301,   244,    -1,   209,   330,   243,   301,
+     244,    -1,   190,   243,     8,   244,    -1,   190,     5,     6,
+      -1,   191,   243,     8,   244,    -1,   191,     5,     6,    -1,
+     190,   243,   301,   244,    -1,   132,   190,   243,   301,   244,
+      -1,   191,   243,   301,   244,    -1,   132,   191,   243,   301,
+     244,    -1,   361,   352,     6,    -1,    73,   239,   358,   240,
+       6,    -1,   361,   361,   241,   330,   242,   351,     6,    -1,
+     361,   361,   361,   241,   330,   242,     6,    -1,   361,   330,
+       6,    -1,   130,   239,     4,   240,   245,     4,     6,    -1,
+     168,     4,     6,    -1,   183,     6,    -1,   184,     6,    -1,
+      70,     6,    -1,    71,     6,    -1,    64,     6,    -1,    64,
+     243,   330,   248,   330,   248,   330,   248,   330,   248,   330,
+     248,   330,   244,     6,    -1,    65,     6,    -1,    66,     6,
+      -1,    78,     6,    -1,    79,     6,    -1,   115,     6,    -1,
+     116,   243,   347,   244,   243,   347,   244,   243,   343,   244,
+     243,   330,   248,   330,   244,     6,    -1,   188,   239,   243,
+     347,   244,   248,   352,   248,   352,   240,     6,    -1,   176,
+     239,   330,     8,   330,   240,    -1,   176,   239,   330,     8,
+     330,     8,   330,   240,    -1,   176,     4,   177,   243,   330,
+       8,   330,   244,    -1,   176,     4,   177,   243,   330,     8,
+     330,     8,   330,   244,    -1,   178,    -1,   189,     4,    -1,
+     189,   352,    -1,   186,    -1,   187,   361,     6,    -1,   187,
+     352,     6,    -1,   179,   239,   330,   240,    -1,   180,   239,
+     330,   240,    -1,   181,    -1,   182,    -1,   137,   341,   243,
+     301,   244,    -1,   137,   243,   341,   248,   341,   248,   330,
+     244,   243,   301,   244,    -1,   137,   243,   341,   248,   341,
+     248,   341,   248,   330,   244,   243,   301,   244,    -1,    -1,
+     137,   341,   243,   301,   311,   315,   244,    -1,    -1,   137,
+     243,   341,   248,   341,   248,   330,   244,   243,   301,   312,
+     315,   244,    -1,    -1,   137,   243,   341,   248,   341,   248,
+     341,   248,   330,   244,   243,   301,   313,   315,   244,    -1,
+      -1,   137,   243,   301,   314,   315,   244,    -1,   137,   243,
+     301,   244,   129,   109,   243,   330,   244,    -1,   119,   344,
+      -1,   124,   119,   344,    -1,   121,   243,   347,   244,   243,
+     347,   244,   243,   330,   244,    -1,   316,    -1,   315,   316,
+      -1,   154,   243,   330,   244,     6,    -1,   154,   243,   344,
+     248,   344,   244,     6,    -1,   155,     6,    -1,   146,     6,
+      -1,   146,   330,     6,    -1,   160,     6,    -1,   160,   162,
+       6,    -1,   161,     6,    -1,   161,   162,     6,    -1,   156,
+     239,   330,   240,     7,   344,   129,   330,     6,    -1,   129,
+       4,   241,   330,   242,     6,    -1,   140,    -1,   141,    -1,
+     142,    -1,   143,    -1,   144,    -1,    -1,   149,     6,    -1,
+     132,   149,     6,    -1,   149,   330,     6,    -1,   132,   149,
+     330,     6,    -1,   317,   243,   301,   318,   244,   243,   301,
+     318,   244,    -1,   106,   239,   351,   240,    -1,   317,   239,
+     330,   240,     7,   243,   301,   318,   244,   243,   301,   318,
+     244,     6,    -1,    -1,   129,     4,   330,    -1,    -1,     4,
+      -1,    -1,     7,   344,    -1,    -1,     7,   330,    -1,    -1,
+     139,   344,    -1,   111,   112,   345,     7,   330,     6,    -1,
+     125,    94,   345,     7,   330,   321,     6,    -1,   125,    97,
+     345,   323,   322,     6,    -1,   125,    99,   345,   323,     6,
+      -1,   163,   345,     6,    -1,   152,    97,   243,   347,   244,
+       7,   330,     6,    -1,   146,    97,   345,   324,     6,    -1,
+     146,    99,   345,     6,    -1,   147,    97,   345,     7,   330,
+       6,    -1,   128,    94,   243,   347,   244,     7,   243,   347,
+     244,   325,     6,    -1,   128,    97,   243,   347,   244,     7,
+     243,   347,   244,   325,     6,    -1,   128,    94,   243,   347,
+     244,     7,   243,   347,   244,   133,   243,   341,   248,   341,
+     248,   330,   244,     6,    -1,   128,    97,   243,   347,   244,
+       7,   243,   347,   244,   133,   243,   341,   248,   341,   248,
+     330,   244,     6,    -1,   128,    94,   243,   347,   244,     7,
+     243,   347,   244,   134,   341,     6,    -1,   128,    97,   243,
+     347,   244,     7,   243,   347,   244,   134,   341,     6,    -1,
+     128,    97,   330,   243,   347,   244,     7,   330,   243,   347,
+     244,     6,    -1,   295,   243,   347,   244,   177,   295,   243,
+     330,   244,     6,    -1,   153,   297,   345,     6,    -1,   117,
+     298,   345,     6,    -1,   131,    94,   344,     6,    -1,   127,
+     296,   344,     6,    -1,   150,     6,    -1,   150,     4,     6,
+      -1,   150,    91,   243,   347,   244,     6,    -1,   198,    -1,
+     199,    -1,   200,    -1,   328,     6,    -1,   328,   243,   344,
+     244,     6,    -1,   328,   243,   344,   248,   344,   244,     6,
+      -1,   328,   239,   344,   240,   243,   344,   248,   344,   244,
+       6,    -1,   331,    -1,   239,   330,   240,    -1,   228,   330,
+      -1,   227,   330,    -1,   234,   330,    -1,   330,   228,   330,
+      -1,   330,   227,   330,    -1,   330,   229,   330,    -1,   330,
+     230,   330,    -1,   330,   232,   330,    -1,   330,   233,   330,
+      -1,   330,   231,   330,    -1,   330,   238,   330,    -1,   330,
+     221,   330,    -1,   330,   222,   330,    -1,   330,   226,   330,
+      -1,   330,   225,   330,    -1,   330,   220,   330,    -1,   330,
+     219,   330,    -1,   330,   218,   330,    -1,   330,   217,   330,
+      -1,   330,   223,   330,    -1,   330,   224,   330,    -1,   330,
+     216,   330,     8,   330,    -1,    16,   273,   330,   274,    -1,
+      17,   273,   330,   274,    -1,    18,   273,   330,   274,    -1,
+      19,   273,   330,   274,    -1,    20,   273,   330,   274,    -1,
+      21,   273,   330,   274,    -1,    22,   273,   330,   274,    -1,
+      23,   273,   330,   274,    -1,    24,   273,   330,   274,    -1,
+      26,   273,   330,   274,    -1,    27,   273,   330,   248,   330,
+     274,    -1,    28,   273,   330,   274,    -1,    29,   273,   330,
+     274,    -1,    30,   273,   330,   274,    -1,    31,   273,   330,
+     274,    -1,    32,   273,   330,   274,    -1,    33,   273,   330,
+     274,    -1,    34,   273,   330,   274,    -1,    35,   273,   330,
+     274,    -1,    36,   273,   330,   248,   330,   274,    -1,    37,
+     273,   330,   248,   330,   274,    -1,    38,   273,   330,   248,
+     330,   274,    -1,    25,   273,   330,   274,    -1,     3,    -1,
+      10,    -1,    15,    -1,    11,    -1,    12,    -1,   205,    -1,
+     206,    -1,   207,    -1,    75,    -1,    76,    -1,    77,    -1,
+      -1,    83,   273,   330,   332,   283,   274,    -1,   335,    -1,
+     196,   273,   351,   274,    -1,   196,   273,   351,   248,   330,
+     274,    -1,   337,    -1,   361,   241,   330,   242,    -1,   361,
+     239,   330,   240,    -1,   201,   239,   337,   240,    -1,   201,
+     239,   337,   245,   338,   240,    -1,   203,   239,   337,   333,
+     240,    -1,   203,   239,   337,   245,   338,   333,   240,    -1,
+     203,   239,   337,   273,   330,   274,   333,   240,    -1,   203,
+     239,   337,   245,   338,   273,   330,   274,   333,   240,    -1,
+     202,   239,   352,   240,    -1,   246,   361,   273,   274,    -1,
+     246,   337,   245,   338,   273,   274,    -1,    86,   273,   361,
+     274,    -1,    86,   273,   274,    -1,   361,   272,    -1,   361,
+     241,   330,   242,   272,    -1,   361,   239,   330,   240,   272,
+      -1,   361,   245,   338,    -1,   361,     9,   361,   245,   338,
+      -1,   361,   245,   338,   239,   330,   240,    -1,   361,     9,
+     361,   245,   338,   239,   330,   240,    -1,   361,   245,   338,
+     241,   330,   242,    -1,   361,     9,   361,   245,   338,   241,
+     330,   242,    -1,   361,   241,   330,   242,   245,     4,    -1,
+     361,   245,     4,   272,    -1,   361,   241,   330,   242,   245,
+       4,   272,    -1,   192,   239,   351,   248,   330,   240,    -1,
+      56,   239,   344,   248,   344,   240,    -1,    57,   273,   351,
+     248,   351,   274,    -1,    55,   273,   351,   274,    -1,    58,
+     273,   351,   248,   351,   274,    -1,    63,   239,   358,   240,
+      -1,    -1,   248,   330,    -1,    -1,   248,   351,    -1,    -1,
+      84,   337,   340,   336,   241,   284,   242,    -1,   361,    -1,
+     361,     9,   361,    -1,     4,    -1,    87,    -1,    87,   330,
+      -1,    -1,   239,   339,   240,    -1,   342,    -1,   228,   341,
+      -1,   227,   341,    -1,   341,   228,   341,    -1,   341,   227,
+     341,    -1,   243,   330,   248,   330,   248,   330,   248,   330,
+     248,   330,   244,    -1,   243,   330,   248,   330,   248,   330,
+     248,   330,   244,    -1,   243,   330,   248,   330,   248,   330,
+     244,    -1,   239,   330,   248,   330,   248,   330,   240,    -1,
+     344,    -1,   343,   248,   344,    -1,   330,    -1,   346,    -1,
+     243,   244,    -1,   243,   347,   244,    -1,   228,   243,   347,
+     244,    -1,   330,   229,   243,   347,   244,    -1,   344,    -1,
+     243,     8,   244,    -1,     5,    -1,   228,   346,    -1,   330,
+     229,   346,    -1,   330,     8,   330,    -1,   330,     8,   330,
+       8,   330,    -1,    91,   243,   330,   244,    -1,    91,   243,
+       8,   244,    -1,    91,     5,    -1,   296,   243,     8,   244,
+      -1,   296,     5,    -1,   126,   295,   345,    -1,   295,   177,
       64,   243,   330,   248,   330,   248,   330,   248,   330,   248,
      330,   248,   330,   244,    -1,    64,   295,   243,   330,   244,
       -1,   299,    -1,   310,    -1,   319,    -1,   361,   273,   274,
@@ -1438,45 +1443,45 @@ static const yytype_uint16 yyrline[] =
     2067,  2093,  2110,  2126,  2144,  2162,  2192,  2222,  2221,  2251,
     2253,  2255,  2257,  2259,  2267,  2269,  2271,  2273,  2281,  2283,
     2285,  2293,  2295,  2297,  2299,  2309,  2325,  2341,  2357,  2373,
-    2389,  2426,  2448,  2472,  2473,  2478,  2481,  2485,  2506,  2525,
-    2546,  2561,  2577,  2595,  2646,  2667,  2689,  2712,  2817,  2833,
-    2868,  2890,  2912,  2918,  2933,  2961,  2973,  2982,  2989,  3001,
-    3020,  3026,  3032,  3039,  3046,  3053,  3065,  3138,  3156,  3173,
-    3188,  3221,  3233,  3257,  3261,  3266,  3273,  3278,  3288,  3293,
-    3299,  3307,  3311,  3315,  3324,  3388,  3404,  3421,  3438,  3460,
-    3482,  3517,  3525,  3533,  3539,  3546,  3553,  3573,  3599,  3611,
-    3622,  3640,  3658,  3677,  3676,  3701,  3700,  3727,  3726,  3751,
-    3750,  3773,  3789,  3806,  3823,  3846,  3849,  3855,  3867,  3887,
-    3891,  3895,  3899,  3903,  3907,  3911,  3915,  3924,  3937,  3938,
-    3939,  3940,  3941,  3945,  3946,  3947,  3948,  3949,  3952,  3976,
-    3995,  4018,  4021,  4037,  4040,  4057,  4060,  4066,  4069,  4076,
-    4079,  4086,  4103,  4144,  4188,  4227,  4252,  4261,  4291,  4317,
-    4343,  4375,  4402,  4428,  4454,  4480,  4506,  4528,  4539,  4587,
-    4636,  4648,  4659,  4666,  4681,  4695,  4696,  4697,  4701,  4707,
-    4719,  4737,  4765,  4766,  4767,  4768,  4769,  4770,  4771,  4772,
-    4773,  4780,  4781,  4782,  4783,  4784,  4785,  4786,  4787,  4788,
-    4789,  4790,  4791,  4792,  4793,  4794,  4795,  4796,  4797,  4798,
-    4799,  4800,  4801,  4802,  4803,  4804,  4805,  4806,  4807,  4808,
-    4809,  4810,  4811,  4812,  4813,  4814,  4815,  4816,  4817,  4826,
-    4827,  4828,  4829,  4830,  4831,  4832,  4833,  4834,  4835,  4836,
-    4841,  4840,  4848,  4850,  4855,  4860,  4864,  4869,  4874,  4878,
-    4882,  4886,  4890,  4894,  4898,  4904,  4920,  4925,  4931,  4937,
-    4956,  4977,  5010,  5014,  5019,  5023,  5027,  5031,  5036,  5041,
-    5051,  5061,  5066,  5077,  5086,  5091,  5096,  5124,  5125,  5131,
-    5132,  5138,  5137,  5160,  5162,  5167,  5176,  5178,  5184,  5185,
-    5190,  5194,  5198,  5202,  5206,  5213,  5217,  5221,  5225,  5232,
-    5237,  5244,  5249,  5253,  5258,  5262,  5270,  5281,  5285,  5297,
-    5305,  5313,  5320,  5330,  5353,  5359,  5370,  5376,  5381,  5391,
-    5401,  5411,  5423,  5427,  5432,  5444,  5448,  5452,  5456,  5474,
-    5482,  5490,  5519,  5529,  5545,  5556,  5561,  5565,  5569,  5581,
-    5585,  5597,  5614,  5624,  5628,  5643,  5648,  5655,  5659,  5664,
-    5678,  5694,  5698,  5702,  5706,  5710,  5718,  5724,  5730,  5736,
-    5745,  5749,  5753,  5761,  5767,  5773,  5777,  5785,  5793,  5800,
-    5809,  5813,  5817,  5832,  5846,  5860,  5872,  5888,  5897,  5906,
-    5916,  5927,  5935,  5943,  5947,  5966,  5973,  5979,  5986,  5994,
-    5993,  6003,  6027,  6029,  6035,  6040,  6042,  6047,  6052,  6057,
-    6059,  6063,  6075,  6089,  6093,  6100,  6108,  6116,  6127,  6129,
-    6132
+    2389,  2426,  2448,  2472,  2473,  2478,  2481,  2485,  2501,  2519,
+    2537,  2562,  2581,  2602,  2617,  2633,  2651,  2702,  2723,  2745,
+    2768,  2873,  2889,  2924,  2946,  2968,  2974,  2989,  3017,  3029,
+    3038,  3045,  3057,  3076,  3080,  3085,  3089,  3094,  3101,  3108,
+    3115,  3127,  3200,  3218,  3235,  3250,  3283,  3295,  3319,  3323,
+    3328,  3335,  3340,  3350,  3355,  3361,  3369,  3373,  3377,  3386,
+    3450,  3466,  3483,  3500,  3522,  3544,  3579,  3587,  3595,  3601,
+    3608,  3615,  3635,  3661,  3673,  3684,  3702,  3720,  3739,  3738,
+    3763,  3762,  3789,  3788,  3813,  3812,  3835,  3851,  3868,  3885,
+    3908,  3911,  3917,  3929,  3949,  3953,  3957,  3961,  3965,  3969,
+    3973,  3977,  3986,  3999,  4000,  4001,  4002,  4003,  4007,  4008,
+    4009,  4010,  4011,  4014,  4038,  4057,  4080,  4083,  4099,  4102,
+    4119,  4122,  4128,  4131,  4138,  4141,  4148,  4170,  4211,  4255,
+    4294,  4319,  4328,  4358,  4384,  4410,  4442,  4469,  4495,  4521,
+    4547,  4573,  4595,  4606,  4654,  4703,  4715,  4726,  4733,  4748,
+    4762,  4763,  4764,  4768,  4774,  4786,  4804,  4832,  4833,  4834,
+    4835,  4836,  4837,  4838,  4839,  4840,  4847,  4848,  4849,  4850,
+    4851,  4852,  4853,  4854,  4855,  4856,  4857,  4858,  4859,  4860,
+    4861,  4862,  4863,  4864,  4865,  4866,  4867,  4868,  4869,  4870,
+    4871,  4872,  4873,  4874,  4875,  4876,  4877,  4878,  4879,  4880,
+    4881,  4882,  4883,  4884,  4893,  4894,  4895,  4896,  4897,  4898,
+    4899,  4900,  4901,  4902,  4903,  4908,  4907,  4915,  4917,  4922,
+    4927,  4931,  4936,  4941,  4945,  4949,  4953,  4957,  4961,  4965,
+    4971,  4987,  4992,  4998,  5004,  5023,  5044,  5077,  5081,  5086,
+    5090,  5094,  5098,  5103,  5108,  5118,  5128,  5133,  5144,  5153,
+    5158,  5163,  5191,  5192,  5198,  5199,  5205,  5204,  5227,  5229,
+    5234,  5243,  5245,  5251,  5252,  5257,  5261,  5265,  5269,  5273,
+    5280,  5284,  5288,  5292,  5299,  5304,  5311,  5316,  5320,  5325,
+    5329,  5337,  5348,  5352,  5356,  5370,  5378,  5386,  5393,  5403,
+    5426,  5431,  5437,  5442,  5448,  5459,  5465,  5470,  5480,  5490,
+    5500,  5512,  5516,  5521,  5533,  5537,  5541,  5545,  5563,  5571,
+    5579,  5608,  5618,  5634,  5645,  5650,  5654,  5658,  5670,  5674,
+    5686,  5703,  5713,  5717,  5732,  5737,  5744,  5748,  5753,  5767,
+    5783,  5787,  5791,  5795,  5799,  5807,  5813,  5819,  5825,  5834,
+    5838,  5842,  5850,  5856,  5862,  5866,  5874,  5882,  5889,  5898,
+    5902,  5906,  5921,  5935,  5949,  5961,  5977,  5986,  5995,  6005,
+    6016,  6024,  6032,  6036,  6055,  6062,  6068,  6075,  6083,  6082,
+    6092,  6116,  6118,  6124,  6129,  6131,  6136,  6141,  6146,  6148,
+    6152,  6164,  6178,  6182,  6189,  6197,  6205,  6216,  6218,  6221
 };
 #endif
 
@@ -1620,45 +1625,45 @@ static const yytype_uint16 yyr1[] =
      293,   293,   293,   293,   293,   293,   293,   294,   293,   295,
      295,   295,   295,   295,   296,   296,   296,   296,   297,   297,
      297,   298,   298,   298,   298,   299,   299,   299,   299,   299,
-     299,   299,   299,   300,   300,   301,   301,   301,   302,   302,
-     302,   302,   302,   302,   302,   302,   302,   302,   302,   302,
-     303,   303,   303,   303,   303,   303,   303,   304,   304,   305,
-     306,   306,   306,   306,   306,   306,   307,   307,   307,   307,
+     299,   299,   299,   300,   300,   301,   301,   301,   301,   301,
+     301,   302,   302,   302,   302,   302,   302,   302,   302,   302,
+     302,   302,   302,   303,   303,   303,   303,   303,   303,   303,
+     304,   304,   305,   306,   306,   306,   306,   306,   306,   306,
+     306,   307,   307,   307,   307,   307,   307,   307,   307,   307,
      307,   307,   307,   307,   307,   307,   307,   307,   307,   307,
-     307,   307,   307,   307,   307,   308,   309,   309,   309,   309,
-     309,   309,   309,   309,   309,   309,   309,   309,   309,   309,
-     310,   310,   310,   311,   310,   312,   310,   313,   310,   314,
-     310,   310,   310,   310,   310,   315,   315,   316,   316,   316,
-     316,   316,   316,   316,   316,   316,   316,   316,   317,   317,
-     317,   317,   317,   318,   318,   318,   318,   318,   319,   319,
-     320,   321,   321,   322,   322,   323,   323,   324,   324,   325,
-     325,   326,   326,   326,   326,   326,   326,   326,   326,   326,
+     308,   309,   309,   309,   309,   309,   309,   309,   309,   309,
+     309,   309,   309,   309,   309,   310,   310,   310,   311,   310,
+     312,   310,   313,   310,   314,   310,   310,   310,   310,   310,
+     315,   315,   316,   316,   316,   316,   316,   316,   316,   316,
+     316,   316,   316,   317,   317,   317,   317,   317,   318,   318,
+     318,   318,   318,   319,   319,   320,   321,   321,   322,   322,
+     323,   323,   324,   324,   325,   325,   326,   326,   326,   326,
      326,   326,   326,   326,   326,   326,   326,   326,   326,   326,
-     326,   326,   327,   327,   327,   328,   328,   328,   329,   329,
-     329,   329,   330,   330,   330,   330,   330,   330,   330,   330,
+     326,   326,   326,   326,   326,   326,   326,   327,   327,   327,
+     328,   328,   328,   329,   329,   329,   329,   330,   330,   330,
+     330,   330,   330,   330,   330,   330,   330,   330,   330,   330,
      330,   330,   330,   330,   330,   330,   330,   330,   330,   330,
      330,   330,   330,   330,   330,   330,   330,   330,   330,   330,
      330,   330,   330,   330,   330,   330,   330,   330,   330,   330,
-     330,   330,   330,   330,   330,   330,   330,   330,   330,   331,
+     330,   330,   330,   330,   331,   331,   331,   331,   331,   331,
+     331,   331,   331,   331,   331,   332,   331,   331,   331,   331,
      331,   331,   331,   331,   331,   331,   331,   331,   331,   331,
-     332,   331,   331,   331,   331,   331,   331,   331,   331,   331,
      331,   331,   331,   331,   331,   331,   331,   331,   331,   331,
      331,   331,   331,   331,   331,   331,   331,   331,   331,   331,
-     331,   331,   331,   331,   331,   331,   331,   333,   333,   334,
-     334,   336,   335,   337,   337,   338,   339,   339,   340,   340,
-     341,   341,   341,   341,   341,   342,   342,   342,   342,   343,
-     343,   344,   344,   344,   344,   344,   344,   345,   345,   346,
+     331,   331,   333,   333,   334,   334,   336,   335,   337,   337,
+     338,   339,   339,   340,   340,   341,   341,   341,   341,   341,
+     342,   342,   342,   342,   343,   343,   344,   344,   344,   344,
+     344,   344,   345,   345,   345,   346,   346,   346,   346,   346,
      346,   346,   346,   346,   346,   346,   346,   346,   346,   346,
      346,   346,   346,   346,   346,   346,   346,   346,   346,   346,
-     346,   346,   346,   346,   346,   347,   347,   347,   347,   348,
-     348,   348,   348,   349,   349,   350,   350,   351,   351,   351,
-     351,   351,   351,   351,   351,   351,   351,   351,   351,   351,
+     346,   346,   346,   346,   347,   347,   347,   347,   348,   348,
+     348,   348,   349,   349,   350,   350,   351,   351,   351,   351,
+     351,   351,   351,   351,   351,   351,   351,   351,   351,   352,
      352,   352,   352,   352,   352,   352,   352,   352,   352,   352,
      352,   352,   352,   352,   352,   352,   352,   352,   352,   352,
-     352,   352,   352,   352,   352,   352,   352,   352,   352,   353,
-     352,   352,   354,   354,   355,   356,   356,   357,   358,   358,
-     358,   358,   359,   359,   359,   360,   360,   360,   361,   361,
-     361
+     352,   352,   352,   352,   352,   352,   352,   352,   353,   352,
+     352,   354,   354,   355,   356,   356,   357,   358,   358,   358,
+     358,   359,   359,   359,   360,   360,   360,   361,   361,   361
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
@@ -1685,45 +1690,45 @@ static const yytype_uint8 yyr2[] =
        7,     8,     7,     7,     8,     8,    12,     0,     9,     1,
        1,     1,     1,     4,     1,     1,     1,     4,     1,     1,
        4,     1,     1,     1,     4,     5,    11,     5,     9,     9,
-       4,     9,     9,     1,     1,     0,     2,     6,     8,    10,
-      14,    16,    12,    14,    14,    14,    14,     8,     8,     6,
-       4,     5,     6,     6,     3,     4,     3,     5,     6,     5,
-       3,     3,     4,     5,     4,     5,     3,     5,     7,     7,
-       3,     7,     3,     2,     2,     2,     2,     2,    15,     2,
-       2,     2,     2,     2,    16,    11,     6,     8,     8,    10,
-       1,     2,     2,     1,     3,     3,     4,     4,     1,     1,
-       5,    11,    13,     0,     7,     0,    13,     0,    15,     0,
-       6,     9,     2,     3,    10,     1,     2,     5,     7,     2,
-       2,     3,     2,     3,     2,     3,     9,     6,     1,     1,
-       1,     1,     1,     0,     2,     3,     3,     4,     9,     4,
-      14,     0,     3,     0,     1,     0,     2,     0,     2,     0,
-       2,     6,     7,     6,     5,     3,     8,     5,     4,     6,
-      11,    11,    18,    18,    12,    12,    12,    10,     4,     4,
-       4,     4,     2,     3,     6,     1,     1,     1,     2,     5,
-       7,    10,     1,     3,     2,     2,     2,     3,     3,     3,
+       4,     9,     9,     1,     1,     0,     2,     6,     7,     6,
+       7,     8,    10,    14,    16,    12,    14,    14,    14,    14,
+       8,     8,     6,     4,     5,     6,     6,     3,     4,     3,
+       5,     6,     5,     4,     3,     4,     3,     4,     5,     4,
+       5,     3,     5,     7,     7,     3,     7,     3,     2,     2,
+       2,     2,     2,    15,     2,     2,     2,     2,     2,    16,
+      11,     6,     8,     8,    10,     1,     2,     2,     1,     3,
+       3,     4,     4,     1,     1,     5,    11,    13,     0,     7,
+       0,    13,     0,    15,     0,     6,     9,     2,     3,    10,
+       1,     2,     5,     7,     2,     2,     3,     2,     3,     2,
+       3,     9,     6,     1,     1,     1,     1,     1,     0,     2,
+       3,     3,     4,     9,     4,    14,     0,     3,     0,     1,
+       0,     2,     0,     2,     0,     2,     6,     7,     6,     5,
+       3,     8,     5,     4,     6,    11,    11,    18,    18,    12,
+      12,    12,    10,     4,     4,     4,     4,     2,     3,     6,
+       1,     1,     1,     2,     5,     7,    10,     1,     3,     2,
+       2,     2,     3,     3,     3,     3,     3,     3,     3,     3,
        3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
-       3,     3,     3,     3,     3,     5,     4,     4,     4,     4,
-       4,     4,     4,     4,     4,     4,     6,     4,     4,     4,
-       4,     4,     4,     4,     4,     6,     6,     6,     4,     1,
-       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       0,     6,     1,     4,     6,     1,     4,     4,     4,     6,
-       5,     7,     8,    10,     4,     4,     6,     4,     3,     2,
-       5,     5,     3,     5,     6,     8,     6,     8,     6,     4,
-       7,     6,     6,     6,     4,     6,     4,     0,     2,     0,
-       2,     0,     7,     1,     3,     1,     1,     2,     0,     3,
-       1,     2,     2,     3,     3,    11,     9,     7,     7,     1,
-       3,     1,     1,     2,     3,     4,     5,     1,     1,     2,
-       3,     3,     5,     4,     2,     3,    16,     5,     1,     1,
-       1,     3,     5,     7,     4,     4,     4,     6,     6,     8,
-       8,     4,    14,     4,     4,     1,     1,     3,     3,     9,
-       7,     1,     5,     3,     6,     1,     3,     1,     1,     4,
-       4,     3,     5,     6,     8,     6,     5,     5,     5,     5,
-       1,     4,     1,     1,     1,     1,     4,     6,     4,     6,
-       5,     7,     4,     4,     4,     8,     4,     4,     4,     4,
-       8,     8,     6,     4,     6,     4,     1,     4,     4,     0,
-       6,     4,     2,     4,     4,     1,     1,     3,     1,     1,
-       3,     3,     3,     5,     7,     5,     5,     8,     1,     1,
-       4
+       5,     4,     4,     4,     4,     4,     4,     4,     4,     4,
+       4,     6,     4,     4,     4,     4,     4,     4,     4,     4,
+       6,     6,     6,     4,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     0,     6,     1,     4,     6,
+       1,     4,     4,     4,     6,     5,     7,     8,    10,     4,
+       4,     6,     4,     3,     2,     5,     5,     3,     5,     6,
+       8,     6,     8,     6,     4,     7,     6,     6,     6,     4,
+       6,     4,     0,     2,     0,     2,     0,     7,     1,     3,
+       1,     1,     2,     0,     3,     1,     2,     2,     3,     3,
+      11,     9,     7,     7,     1,     3,     1,     1,     2,     3,
+       4,     5,     1,     3,     1,     2,     3,     3,     5,     4,
+       4,     2,     4,     2,     3,    16,     5,     1,     1,     1,
+       3,     5,     7,     4,     4,     4,     6,     6,     8,     8,
+       4,    14,     4,     4,     1,     1,     3,     3,     9,     7,
+       1,     5,     3,     6,     1,     3,     1,     1,     4,     4,
+       3,     5,     6,     8,     6,     5,     5,     5,     5,     1,
+       4,     1,     1,     1,     1,     4,     6,     4,     6,     5,
+       7,     4,     4,     4,     8,     4,     4,     4,     4,     8,
+       8,     6,     4,     6,     4,     1,     4,     4,     0,     6,
+       4,     2,     4,     4,     1,     1,     3,     1,     1,     3,
+       3,     3,     5,     7,     5,     5,     8,     1,     1,     4
 };
 
 /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
@@ -1731,2497 +1736,2635 @@ static const yytype_uint8 yyr2[] =
    means the default is an error.  */
 static const yytype_uint16 yydefact[] =
 {
-       0,     0,     0,     2,     3,     1,   588,     0,     0,     0,
+       0,     0,     0,     2,     3,     1,   597,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,   189,     0,     0,   190,     0,     0,
      191,     0,   192,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   308,   309,   310,   311,
-     312,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   313,   314,   315,   316,
+     317,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     270,     0,     0,   278,   279,     0,     0,     0,   273,     0,
-       0,     0,     0,     0,   355,   356,   357,     0,     0,     5,
+     275,     0,     0,   283,   284,     0,     0,     0,   278,     0,
+       0,     0,     0,     0,   360,   361,   362,     0,     0,     5,
        6,     7,     8,    10,     0,    11,    24,    12,    13,    14,
       15,    23,    22,    21,    16,     0,    17,    18,    19,    20,
-       0,    25,     0,   589,     0,   215,     0,     0,     0,     0,
-       0,   257,     0,   259,   260,   255,   256,     0,   261,   262,
-     113,   123,   588,   468,   463,    70,    71,     0,     0,     0,
+       0,    25,     0,   598,     0,   215,     0,     0,     0,     0,
+       0,   262,     0,   264,   265,   260,   261,     0,   266,   267,
+     113,   123,   597,   473,   468,    70,    71,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   268,     0,   201,   202,   203,     0,     0,     0,   414,
+     415,   417,   418,   416,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   263,     0,   201,   202,   203,     0,     0,     0,   409,
-     410,   412,   413,   411,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   422,   423,
+     424,     0,     0,   189,   194,   195,   196,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   419,   420,   421,
+       0,     0,     0,     0,     0,     0,     0,     0,   507,   508,
+       0,   509,   486,   367,   427,   430,   297,   487,   468,     0,
+       0,     0,     0,     0,     0,     0,     0,   189,   190,   191,
+     192,   187,   194,   195,   196,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   417,   418,
-     419,     0,     0,   189,   190,   191,   192,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   414,   415,   416,     0,
-       0,     0,     0,     0,     0,     0,   498,   499,     0,   500,
-     481,   362,   422,   425,   292,   482,   463,     0,     0,     0,
-       0,     0,     0,     0,     0,   189,   187,   194,   195,   196,
+       0,   475,     0,     0,   215,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   597,
+       0,     0,   215,     0,     0,   357,     0,     0,     0,   198,
+     199,     0,     0,     0,     0,     0,   494,     0,     0,   492,
+       0,     0,     0,     0,     0,   597,     0,     0,   530,     0,
+       0,     0,     0,   258,   259,     0,   549,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   470,     0,     0,   215,
+     551,     0,   575,   553,   554,     0,     0,     0,     0,     0,
+       0,   552,     0,     0,     0,     0,   276,   277,     0,   215,
+       0,   215,     0,     0,     0,   468,     0,     0,     0,   215,
+     363,     0,     0,    76,     0,    63,     0,     0,    67,    66,
+      65,    64,    69,    68,    70,    71,     0,     0,     0,     0,
+       0,     0,   536,   468,     0,   214,     0,   213,     0,   168,
+       0,     0,   536,   537,     0,     0,   587,     0,   588,   537,
+     111,   111,     0,   466,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   588,     0,     0,   215,     0,     0,
-     352,     0,     0,     0,   198,   199,     0,     0,     0,     0,
-       0,   488,     0,   487,     0,     0,     0,     0,     0,   588,
-       0,     0,   521,     0,     0,     0,     0,   253,   254,     0,
-     540,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   542,     0,   566,   544,   545,     0,
-       0,     0,     0,     0,     0,   543,     0,     0,     0,     0,
-     271,   272,     0,   215,     0,   215,     0,     0,     0,   463,
-       0,     0,     0,   215,   358,     0,     0,    76,     0,    63,
-       0,     0,    67,    66,    65,    64,    69,    68,    70,    71,
-       0,     0,     0,     0,     0,     0,   527,   463,     0,   214,
-       0,   213,     0,   168,     0,     0,   527,   528,     0,     0,
-     578,     0,   579,   528,   111,   111,     0,   461,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     524,   525,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   515,   516,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    70,
+      71,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   501,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   370,     0,   369,   495,   371,
+       0,   488,     0,     0,   468,     0,   503,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    70,
+      71,     0,   444,     0,     0,     0,     0,     0,     0,   298,
+       0,   330,   330,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   215,     0,   215,   215,     0,   477,   476,     0,
+       0,     0,     0,   215,   215,     0,     0,     0,     0,   294,
+       0,   215,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   332,     0,     0,     0,     0,     0,   239,     0,
+       0,   237,   358,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   340,   257,     0,     0,     0,     0,     0,
+     215,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    70,    71,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   280,   279,     0,
+     244,     0,     0,   246,     0,     0,     0,   369,     0,   215,
+       0,     0,     0,     0,     0,     0,     0,   318,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   365,     0,   364,
-     489,   366,     0,   483,     0,     0,   463,   494,     0,     0,
+       0,     0,     0,    80,    72,    73,     0,     0,   255,    38,
+     251,     0,     0,     0,     0,     0,   210,     0,     0,     0,
+       0,   216,     0,     0,   169,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     112,     0,     0,     0,   471,     0,     0,   469,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-      70,    71,     0,   439,     0,     0,     0,     0,     0,     0,
-     293,     0,   325,   325,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   215,     0,   215,   215,     0,   472,   471,
-       0,     0,     0,     0,   215,   215,     0,     0,     0,     0,
-     289,     0,   215,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   327,     0,     0,     0,     0,     0,   236,
-       0,     0,   234,   353,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   335,   252,     0,     0,     0,     0,     0,
-     215,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   324,     0,     0,     0,   193,
+       0,     0,     0,     0,     0,     0,   354,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   275,   274,     0,
-     240,     0,   241,     0,     0,   364,     0,   215,     0,     0,
-       0,     0,     0,     0,     0,   313,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    80,    72,    73,     0,     0,   250,    38,   246,     0,
-       0,     0,     0,     0,   210,     0,     0,     0,   216,     0,
-       0,   169,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   112,     0,     0,
-       0,   466,     0,     0,   464,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   468,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   425,   443,     0,
+       0,     0,     0,   504,     0,     0,     0,     0,     0,   462,
+       0,   368,   489,     0,     0,     0,     0,   497,     0,   387,
+     386,   385,   384,   380,   381,   388,   389,   383,   382,   373,
+     372,     0,   374,   496,   375,   378,   376,   377,   379,   469,
+       0,     0,   470,   447,     0,   510,     0,     0,     0,     0,
+       0,     0,     0,   328,     0,     0,     0,     0,   356,     0,
+       0,     0,     0,   355,     0,   215,     0,     0,     0,     0,
+       0,   479,   478,     0,     0,     0,     0,     0,     0,     0,
+     288,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   343,     0,     0,   238,     0,     0,   233,
+       0,     0,     0,     0,   353,     0,     0,     0,   368,   493,
+       0,     0,     0,     0,     0,     0,     0,     0,   281,   282,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   319,     0,     0,     0,   193,     0,     0,     0,
-       0,     0,     0,   349,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   578,     0,
+       0,     0,   464,     0,     0,   243,   247,   245,   249,     0,
+     374,     0,   469,   447,   599,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    87,     0,     0,     0,     0,     0,
+     368,     0,    63,     0,     0,     0,     0,    79,     0,    63,
+      64,     0,     0,   469,     0,     0,   447,     0,     0,     0,
+     187,     0,     0,   594,    28,    26,    27,     0,     0,     0,
+       0,     0,   470,   540,    29,     0,     0,   252,   589,   590,
+       0,   591,   540,    74,   114,    75,   124,   472,   474,   130,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   463,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   420,   438,     0,     0,   495,     0,
-       0,     0,     0,     0,   457,     0,   363,   484,     0,     0,
-       0,   491,     0,   382,   381,   380,   379,   375,   376,   383,
-     384,   378,   377,   368,   367,     0,   369,   490,   370,   373,
-     371,   372,   374,   464,     0,     0,   465,   442,     0,   501,
-       0,     0,     0,     0,     0,     0,     0,   323,     0,     0,
-       0,     0,   351,     0,     0,     0,     0,   350,     0,   215,
-       0,     0,     0,     0,     0,   474,   473,     0,     0,     0,
-       0,     0,     0,     0,   283,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   338,     0,     0,
-     235,     0,     0,   230,     0,     0,     0,     0,   348,     0,
-       0,     0,   363,     0,     0,     0,     0,     0,     0,     0,
-       0,   276,   277,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   526,   527,   204,     9,   391,   392,   393,
+     394,   395,   396,   397,   398,   399,   413,   400,     0,   402,
+     403,   404,   405,   406,   523,   407,   408,   409,     0,     0,
+       0,   515,   514,   513,     0,     0,     0,   520,     0,   459,
+       0,     0,     0,   461,     0,   128,   442,   500,   499,   197,
+       0,     0,   428,   522,   433,     0,   439,     0,     0,     0,
+       0,   490,     0,     0,   440,     0,   502,     0,     0,     0,
+       0,   432,   431,   454,    70,    71,     0,     0,     0,     0,
+       0,     0,   368,   326,   331,   329,     0,   339,     0,   148,
+     149,   197,   368,     0,     0,     0,     0,   234,     0,   248,
+     250,     0,     0,     0,   205,   207,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   300,     0,   285,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   569,     0,     0,     0,   459,     0,     0,   242,   244,
-       0,   369,     0,   464,   442,   590,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,    87,     0,     0,     0,     0,
-       0,   363,     0,    63,     0,     0,     0,     0,    79,     0,
-      63,    64,     0,     0,   464,     0,     0,   442,     0,     0,
-       0,     0,     0,   585,    28,    26,    27,     0,     0,     0,
-       0,     0,   465,   531,    29,     0,     0,   247,   580,   581,
-       0,   582,   531,    74,   114,    75,   124,   467,   469,   130,
+       0,   333,   342,     0,     0,     0,     0,     0,     0,     0,
+     200,     0,     0,     0,     0,     0,     0,     0,     0,   240,
+       0,     0,     0,     0,   565,     0,   572,   561,   562,   563,
+       0,   577,   576,     0,     0,   566,   567,   568,   574,   581,
+     580,     0,   139,     0,   555,     0,   557,     0,     0,     0,
+     550,     0,   242,     0,     0,     0,     0,     0,     0,     0,
+     319,     0,     0,     0,   364,     0,   595,     0,     0,     0,
+       0,   101,    63,     0,     0,     0,     0,     0,     0,     0,
+      95,     0,     0,     0,     0,     0,     0,     0,     0,    48,
+       0,     0,     0,    61,     0,    39,    40,    41,    42,    43,
+       0,   432,   431,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   539,   538,     0,     0,     0,     0,
+       0,     0,     0,   135,     0,   131,   132,     0,     0,     0,
+     153,   153,     0,     0,     0,     0,     0,   151,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   336,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   506,     0,     0,     0,     0,     0,   462,   463,     0,
+     435,     0,     0,     0,   498,   390,   491,   448,   446,     0,
+     445,     0,     0,   511,     0,     0,     0,     0,     0,     0,
+       0,     0,   338,     0,     0,     0,     0,     0,     0,     0,
+     241,     0,     0,     0,     0,     0,     0,     0,   305,     0,
+       0,   304,     0,   307,     0,   309,     0,   295,   301,     0,
+       0,     0,   232,     0,     0,     0,     0,     0,     0,     0,
+       0,   344,     0,   236,   235,   359,     0,     0,    35,    36,
+       0,     0,     0,     0,   531,     0,     0,     0,   271,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   517,   518,   204,     9,   386,   387,   388,
-     389,   390,   391,   392,   393,   394,   408,   395,     0,   397,
-     398,   399,   400,   401,   514,   402,   403,   404,     0,     0,
-       0,   506,   505,   504,     0,     0,     0,   511,     0,   454,
-       0,     0,     0,   456,     0,   128,   437,   493,     0,     0,
-     423,   513,   428,     0,   434,     0,     0,     0,     0,   485,
-       0,     0,   435,     0,     0,     0,     0,     0,   427,   426,
-     449,    70,    71,     0,     0,     0,     0,     0,     0,   363,
-     321,   326,   324,     0,   334,     0,   148,   149,   197,   363,
-       0,     0,     0,     0,   231,     0,   243,   245,     0,     0,
-       0,   205,   207,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   295,     0,   280,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   328,   337,
-       0,     0,     0,     0,     0,     0,     0,   200,     0,     0,
-       0,     0,     0,     0,     0,     0,   237,     0,     0,     0,
-       0,   556,     0,   563,   552,   553,   554,     0,   568,   567,
-       0,     0,   557,   558,   559,   565,   572,   571,     0,   139,
-       0,   546,     0,   548,     0,     0,     0,   541,     0,   239,
-       0,     0,     0,     0,     0,     0,     0,   314,     0,     0,
-       0,   359,     0,   586,     0,     0,     0,     0,   101,    63,
-       0,     0,     0,     0,     0,     0,     0,    95,     0,     0,
-       0,     0,     0,     0,     0,     0,    48,     0,     0,     0,
-      61,     0,    39,    40,    41,    42,    43,     0,   427,   426,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   530,
-     529,     0,     0,     0,     0,     0,     0,     0,   135,     0,
-     131,   132,     0,     0,     0,   153,   153,     0,     0,     0,
-       0,     0,   151,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   331,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   497,     0,     0,     0,
-       0,     0,   457,   458,     0,   430,     0,     0,     0,   492,
-     385,   486,   443,   441,     0,   440,     0,     0,   502,     0,
-       0,     0,     0,     0,     0,     0,     0,   333,     0,     0,
-       0,     0,     0,     0,     0,   238,     0,     0,     0,     0,
-       0,     0,     0,   300,     0,     0,   299,     0,   302,     0,
-     304,     0,   290,   296,     0,     0,     0,   229,     0,     0,
-       0,     0,     0,     0,     0,     0,   339,     0,   233,   232,
-     354,     0,     0,    35,    36,     0,     0,     0,     0,   522,
-       0,     0,     0,   266,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   459,   460,   550,
-       0,   443,     0,     0,   215,   315,     0,   316,   215,     0,
-       0,   536,   537,   538,   539,     0,    86,     0,     0,     0,
-       0,    84,    91,    93,     0,   525,     0,    99,     0,     0,
-       0,     0,    81,     0,     0,     0,     0,     0,    34,   443,
-       0,     0,     0,     0,     0,     0,     0,     0,    30,    31,
-       0,   532,     0,     0,    32,     0,   532,   583,     0,   115,
-     120,     0,     0,     0,   134,   137,   138,   462,     0,    77,
-      78,   155,     0,     0,     0,     0,   156,   171,   172,     0,
-       0,     0,   157,   182,   173,   177,   178,   174,   175,   176,
-     163,     0,     0,   396,   405,   406,   407,   507,     0,     0,
-       0,   452,   453,   455,   129,   421,   451,   424,   429,     0,
-       0,   457,   183,   436,     0,    70,    71,     0,   448,   444,
-     446,   508,   179,     0,     0,   151,     0,     0,   332,     0,
-     150,     0,     0,     0,     0,   251,     0,     0,     0,     0,
-     215,   215,     0,     0,   301,   481,     0,     0,   303,   305,
-       0,     0,   284,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   180,     0,     0,     0,     0,   160,   161,
-       0,     0,     0,     0,   102,   103,   104,   108,     0,   564,
-       0,     0,   562,     0,   573,     0,     0,   140,   141,   570,
-     547,   549,     0,     0,     0,     0,     0,     0,   313,   317,
-     313,     0,   360,    85,    63,     0,     0,     0,     0,    83,
-       0,   523,     0,     0,     0,     0,     0,     0,   576,   575,
-       0,     0,     0,     0,     0,   479,     0,     0,   448,   248,
-     444,   249,     0,     0,   217,     0,     0,   535,   533,     0,
-       0,   116,   121,     0,     0,     0,   515,   516,   133,   154,
-     158,   159,   164,   181,     0,   166,     0,     0,     0,     0,
-       0,     0,   431,     0,     0,     0,     0,   503,   450,     0,
-     165,     0,   184,   322,     0,     0,   185,     0,     0,     0,
-       0,     0,     0,   478,   477,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   228,   227,     0,     0,     0,
-       0,     0,     0,     0,     0,   218,     0,     0,   336,    37,
-       0,   520,     0,     0,   268,   267,     0,     0,     0,     0,
-       0,     0,   143,   144,   147,   146,   145,     0,   551,     0,
-     587,     0,     0,     0,     0,     0,     0,    96,     0,     0,
-      97,   526,     0,     0,     0,    88,     0,     0,     0,    44,
-       0,     0,     0,     0,     0,    46,     0,    33,     0,     0,
-     584,   128,   139,     0,     0,   136,     0,     0,     0,     0,
-       0,     0,   509,   510,     0,   457,   432,     0,   445,   447,
-       0,   167,   188,     0,   329,   329,     0,   109,   110,   215,
-       0,   208,   209,   291,     0,   297,     0,     0,   215,     0,
-       0,     0,     0,     0,     0,     0,     0,   212,   211,     0,
-       0,     0,     0,   105,   106,   555,   561,   560,   142,     0,
-       0,     0,   318,     0,    92,    94,     0,   100,     0,    82,
-     577,    89,    90,    49,     0,     0,     0,     0,   480,     0,
-       0,   445,   534,     0,     0,     0,   118,   574,     0,   125,
-       0,     0,   170,     0,     0,     0,     0,   294,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   476,     0,
-     307,     0,     0,   285,     0,   219,     0,     0,     0,     0,
-       0,     0,     0,   519,   269,     0,     0,   347,   215,   361,
-       0,   524,     0,    45,     0,     0,     0,    62,    47,     0,
-     117,   122,   128,     0,     0,   152,     0,     0,   433,     0,
-       0,     0,     0,   330,   340,     0,     0,   341,     0,   206,
-       0,   298,     0,   281,     0,   215,     0,     0,     0,     0,
-       0,     0,   162,   107,   265,   313,    98,     0,     0,     0,
-       0,     0,     0,   126,   127,     0,     0,     0,   186,     0,
-     344,     0,   345,   346,   475,     0,     0,   287,   222,     0,
-       0,     0,     0,     0,     0,     0,     0,    53,     0,    59,
-       0,     0,   119,     0,     0,     0,     0,     0,   306,   286,
-     282,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   464,   465,   559,     0,   448,     0,     0,   215,
+     320,     0,   321,   215,     0,     0,   545,   546,   547,   548,
+       0,    86,     0,     0,     0,     0,    84,    91,    93,     0,
+     534,     0,    99,     0,     0,     0,     0,    81,     0,     0,
+       0,     0,     0,    34,   448,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    30,    31,     0,   541,
+       0,     0,    32,     0,   541,   592,     0,   115,   120,     0,
+       0,     0,   134,   137,   138,   467,     0,    77,    78,   155,
+       0,     0,     0,     0,   156,   171,   172,     0,     0,     0,
+     157,   182,   173,   177,   178,   174,   175,   176,   163,     0,
+       0,   401,   410,   411,   412,   516,     0,     0,     0,   457,
+     458,   460,   129,   426,   456,   429,   434,     0,     0,   462,
+     183,   441,     0,    70,    71,     0,   453,   449,   451,   517,
+     179,     0,     0,   151,     0,     0,   337,     0,   150,     0,
+       0,     0,     0,   256,     0,     0,     0,     0,   215,   215,
+       0,     0,   306,   486,     0,     0,   308,   310,     0,     0,
+     289,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   180,     0,     0,     0,     0,   160,   161,     0,     0,
+       0,     0,   102,   103,   104,   108,     0,   573,     0,     0,
+     571,     0,   582,     0,     0,   140,   141,   579,   556,   558,
+       0,     0,     0,     0,     0,     0,   318,   322,   318,     0,
+     365,    85,    63,     0,     0,     0,     0,    83,     0,   532,
+       0,     0,     0,     0,     0,     0,   585,   584,     0,     0,
+       0,     0,     0,   484,     0,     0,   453,   253,   449,   254,
+       0,     0,     0,     0,   219,   217,     0,     0,   544,   542,
+       0,     0,   116,   121,     0,     0,     0,   524,   525,   133,
+     154,   158,   159,   164,   181,     0,   166,     0,     0,     0,
+       0,     0,     0,   436,     0,     0,     0,     0,   512,   455,
+       0,   165,     0,   184,   327,     0,     0,   185,     0,     0,
+       0,     0,     0,     0,   483,   482,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   231,   230,     0,     0,
+       0,     0,     0,     0,     0,     0,   221,     0,     0,   341,
+      37,     0,   529,     0,     0,   273,   272,     0,     0,     0,
+       0,     0,     0,   143,   144,   147,   146,   145,     0,   560,
+       0,   596,     0,     0,     0,     0,     0,     0,    96,     0,
+       0,    97,   535,     0,     0,     0,    88,     0,     0,     0,
+      44,     0,     0,     0,     0,     0,    46,     0,   220,   218,
+      33,     0,     0,   593,   128,   139,     0,     0,   136,     0,
+       0,     0,     0,     0,     0,   518,   519,     0,   462,   437,
+       0,   450,   452,     0,   167,   188,     0,   334,   334,     0,
+     109,   110,   215,     0,   208,   209,   296,     0,   302,     0,
+       0,   215,     0,     0,     0,     0,     0,     0,     0,     0,
+     212,   211,     0,     0,     0,     0,   105,   106,   564,   570,
+     569,   142,     0,     0,     0,   323,     0,    92,    94,     0,
+     100,     0,    82,   586,    89,    90,    49,     0,     0,     0,
+       0,   485,     0,     0,   450,   543,     0,     0,     0,   118,
+     583,     0,   125,     0,     0,   170,     0,     0,     0,     0,
+     299,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   481,     0,   312,     0,     0,   290,     0,   222,     0,
+       0,     0,     0,     0,     0,     0,   528,   274,     0,     0,
+     352,   215,   366,     0,   533,     0,    45,     0,     0,     0,
+      62,    47,     0,   117,   122,   128,     0,     0,   152,     0,
+       0,   438,     0,     0,     0,     0,   335,   345,     0,     0,
+     346,     0,   206,     0,   303,     0,   286,     0,   215,     0,
+       0,     0,     0,     0,     0,   162,   107,   270,   318,    98,
+       0,     0,     0,     0,     0,     0,   126,   127,     0,     0,
+       0,   186,     0,   349,     0,   350,   351,   480,     0,     0,
+     292,   225,     0,     0,     0,     0,     0,     0,     0,     0,
+      53,     0,    59,     0,     0,   119,     0,     0,     0,     0,
+       0,   311,   291,   287,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     223,   224,   225,   226,     0,   220,   320,    50,     0,    57,
-       0,   258,     0,   512,     0,     0,     0,   288,     0,     0,
-      51,     0,     0,   264,     0,     0,     0,   221,     0,     0,
-       0,     0,   496,     0,     0,    54,    52,     0,    55,     0,
-     342,   343,     0,     0,    60,    58,    56
+       0,     0,     0,   226,   227,   228,   229,     0,   223,   325,
+      50,     0,    57,     0,   263,     0,   521,     0,     0,     0,
+     293,     0,     0,    51,     0,     0,   269,     0,     0,     0,
+     224,     0,     0,     0,     0,   505,     0,     0,    54,    52,
+       0,    55,     0,   347,   348,     0,     0,    60,    58,    56
 };
 
 /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-      -1,     2,     3,   109,   997,   110,   111,   983,  1778,  1784,
-    1262,  1463,  1922,  2049,  1263,  2020,  2067,  1264,  2051,  1265,
-    1266,  1467,   411,   553,   554,  1063,   112,   728,   434,  1791,
-    1932,  1792,   435,  1675,  1328,  1289,  1290,  1291,  1424,  1617,
-    1618,  1125,  1511,  1503,   708,   564,   255,   281,   327,   187,
-     256,   420,   421,   116,   117,   118,   119,   120,   121,   122,
-     123,   257,  1157,  1954,  2011,   882,  1153,  1154,   258,   960,
-     259,   127,  1356,  1123,   857,   896,  1892,   128,   129,   130,
-     131,   260,   261,  1085,  1098,  1216,   262,   733,   263,   847,
-     732,   437,   579,   296,  1654,   333,   334,   265,   524,   341,
-    1250,  1456,   430,   426,  1209,   939,  1496,  1647,  1648,   924,
-     432,   133,   389
+      -1,     2,     3,   109,  1017,   110,   111,  1002,  1809,  1815,
+    1285,  1488,  1955,  2082,  1286,  2053,  2100,  1287,  2084,  1288,
+    1289,  1492,   417,   562,   563,  1083,   112,   741,   440,  1824,
+    1965,  1825,   441,  1706,  1353,  1314,  1315,  1316,  1449,  1645,
+    1646,  1148,  1539,  1531,   721,   573,   256,   257,   332,   187,
+     258,   426,   427,   116,   117,   118,   119,   120,   121,   122,
+     123,   259,  1180,  1987,  2044,   898,  1176,  1177,   260,   979,
+     261,   127,  1381,  1146,   873,   912,  1925,   128,   129,   130,
+     131,   262,   263,  1105,  1120,  1239,   264,   746,   265,   863,
+     745,   443,   588,   301,  1682,   339,   340,   267,   532,   347,
+    1273,  1481,   436,   432,  1232,   956,  1524,  1675,  1676,   941,
+     438,   133,   395
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-#define YYPACT_NINF -1760
+#define YYPACT_NINF -1792
 static const yytype_int16 yypact[] =
 {
-   10151,   142,   223, 10302, -1760, -1760,   321,   219,   -60,     9,
-      57,    43,   313,   320,   331,   376,   146,   413,   416,   154,
-     215,    26,  -170,  -170,   263,   273,   278,    23,   300,   323,
-      24,   352,   362,   368,   382,   409,   424,   436,   458,   473,
-     476,    29,   366,   451,   649,   415,    71,   482,  5602,   510,
-     437,   655,   -32,   287,   596,    83,   256,   516,   611,   -70,
-     440,   381,   381,   514,   387,   357, -1760, -1760, -1760, -1760,
-   -1760,   549,    98,   699,   710,    30,    55,   722,   727,   297,
-     795,   845,   854,  4891,   856,   640,   641,   648,    11,    54,
-   -1760,   659,   664, -1760, -1760,   886,   899,   625, -1760, 10500,
-     676, 10530,    33,    37, -1760, -1760, -1760,  9863,   675, -1760,
-   -1760, -1760, -1760, -1760,   680, -1760, -1760, -1760, -1760, -1760,
-   -1760, -1760, -1760, -1760, -1760,   328, -1760, -1760, -1760, -1760,
-      40, -1760,   912,   677,  4652,    66,   688,   919,  9863, 10470,
-   10470, -1760,  9863, -1760, -1760, -1760, -1760, 10470, -1760, -1760,
-   -1760, -1760,   697,   725,   932, -1760, -1760, 10560,    26,  9863,
-    9863,  9863,   726,  9863,  9863,  9863,   729,  9863,  9863,  9863,
-    9863,  9863,  9863,  9863, 10470,  9863,  9863,  9863,  9863,  5839,
-     730, -1760,  7735, -1760, -1760, -1760,   704,  4891, 10470, -1760,
-   -1760, -1760, -1760, -1760,  -170,  -170,  -170,  -170,  -170,  -170,
-    -170,  -170,  -170,  -170,  -170,  -170,  -170,  -170,  -170,  -170,
-    -170,  -170,  -170,  -170,  -170,  -170,  -170,  -107,  -170,  -170,
-    -170,  -170,  -170,   731,  -170,  -170,   733,   596, -1760, -1760,
-   -1760,  -170,  -170,   734, -1760, -1760, -1760,  5839,   861,   596,
-     742,  -170,  -170,   744,   745,   746, -1760, -1760, -1760,  9863,
-    6076,  9863,  9863,  6313,    26,    28, -1760, -1760,   747, -1760,
-    7998, -1760, -1760, -1760, -1760, -1760,   119,  9863,  7735,   748,
-     752,  6550,  4891,  4891,  4891, -1760, -1760, -1760, -1760, -1760,
-     754,  6787,   758,  8608,   969,  5839,   769,    11,   770,   771,
-     381,   381,   381,  9863,  9863,  -154, -1760,   317,   381,  8685,
-     471,   389,   776,   777,   778,   779,   783,   787,   798,  9863,
-    4891,  4891,  4891,   799,     8,  1013,   800, -1760,  1034,  1036,
-   -1760,   801,   802,   803, -1760, -1760,   804,  4891,   807,   808,
-     809, -1760,  9863, -1760,  1037,  1045,  9863,  9863,  9863,   -39,
-    9863,   813, -1760,   880,  9863,  9863,  9863, -1760, -1760,  9863,
-   -1760,  -170,  -170,  -170,   819,   820,   821,  -170,  -170,  -170,
-    -170,  -170,  -170,  -170, -1760,  -170, -1760, -1760, -1760,  -170,
-    -170,   822,   823,  -170,   824, -1760,   825,  1059,  1061,   826,
-   -1760, -1760,  1067, -1760,  1068, -1760,  -170,  9863, 12711,   133,
-   10470,  7735,  9863, -1760, -1760,  5839,  5839, -1760,   832, 10560,
-     528,  1069, -1760, -1760, -1760, -1760, -1760, -1760,  9863,  9863,
-      46,  5839,  1074,   246,  2500,   838,  1076,    84,   840, -1760,
-     841, 10748,  9863, -1760,  2805,  -185, -1760,    89,   -76, 10678,
-   -1760,   -73, -1760,   106,  -182,   115,   997, -1760,    26,   842,
-     843, 13227, 13252, 13277,  9863, 13302, 13327, 13352,  9863, 13377,
-   13402, 13427, 13452, 13477, 13502, 13527,   846, 13552, 13577, 13602,
-    1871,  1081,  9863,  7735,  8321, -1760,   441,  9863,  1083,   852,
-    9863,  9863,  9863,  9863,  9863,  9863,  9863,  9863,  9863,  9863,
-    9863,  9863,  9863,  9863,  9863,  9863,  7735,  9863,  9863,  9863,
-    9863,  9863,  9863,  7735,  7735,   850,  9863,  9863, 10470,  9863,
-   10470,  5839, 10470, 10470, 10470,   851,  9863,    35,  9863,  5839,
-    4891, 10470, 10470,  7735,    26, 10560,    26,   857,  7735,   857,
-   -1760,   857, 13627, -1760,   460,   853,    97, -1760,  1032,  9863,
-    9863,  9863,  9863,  9863,  9863,  9863,  9863,  9863,  9863,  9863,
-    9863,  9863,  9863,  7024,  9863,  9863,  9863,  9863,  9863,    26,
-    9863,  9863,  1095, -1760,   532, 13652,   478,  9863,  9863,  9863,
-   -1760,  1094,  1097,  1097,   866,  9863,  9863,  1100,  7735,  7735,
-   12739,   867,  1102, -1760,   871, -1760, -1760,  -137, -1760, -1760,
-   10711, 10744,   381,   381,    66,    66,  -115,  8685,  8685,  9863,
-    5432,  -101, -1760,  9863,  9863,  9863,  9863,  9863,  9863,  9863,
-    9863,  9863, 13677,  1103,  1109,  1110,  9863,  1112,  9863, -1760,
-    9863,  5669, -1760, -1760,  7735,  7735,  7735,  9863,  1113,  9863,
-    9863,  9863, 13702, -1760, -1760, 13727, 13752, 13777,   935, 10777,
-   -1760,   873,  8556, 13802, 13827, 12822, 10470, 10470, 10470, 10470,
-   10470, 10470, 10470, 10470, 10470,  9863, 10470, 10470, 10470, 10470,
-      21, 10560, 10470, 10470, 10470,    26,    26, -1760, -1760,  7735,
-   -1760,  5906, -1760,  6143,  9863,   857,  9863, -1760,    26,  9863,
-    9863,  1095,   878,   480, 13852, 10683,   882,   506,  9863,  1117,
-     881,   883,   884,   885,  9863, 13877, 12849,   187,   887,  1118,
-    1123, -1760, -1760, -1760,  7735,   197, -1760, -1760, -1760,    26,
-    9863,  9863,  1095,   889, -1760,   892,   -11,    83, -1760,   890,
-    9734, -1760,    38,  7735,    26,  9863,  9863,  1133,  1132,  7735,
-    9863,  1134, 10470,    26,  8922,  1133,  1135, -1760,    26,  1136,
-   10470,  9863,   903,   904, -1760,  9863, 10560,  1137,  1140,  1141,
-   13902,  1142,  1144,  1145, 13927,  1149,  1150,  1151,  1152,  1153,
-    1154,  1155, -1760,  1158,  1159,  1160, -1760,  9863, 13952,  7735,
-     925,  7735,  9981, -1760,  1163, 12795, 12795, 12795, 12795, 12795,
-   12795, 12795, 12795, 12795, 12795, 12795, 10810, 12795, 12795, 12795,
-   12795,  1903,    70, 12795, 12795, 12795, 10843, 10876, 10909,  8321,
-     930,   931,   107,  7735, 10942, 10975,    70, 11008,    70,   924,
-     926,   927,   -13,  9863, 14752, -1760,    70, 11899, -1760,   928,
-     -29,    70,   -62,   937,   132,   553,  1174, -1760,  1133,    70,
-     939,  8640,  8877,  1198,  2078,   538,   538,   551,   551,   551,
-     551,   551,   551,   562,   562,  7735,   193, -1760,   193,   193,
-     857,   857,   857,   938, 13977, 12876,   343,   316,  7735, -1760,
-    1177,   942, 14002, 14027, 14052,  9863,  5839,  1182,  1181,  8376,
-   11928, 14077, -1760,   554,   573,  7735,   943, -1760,  6380, -1760,
-    6617,  6854,   381,  9863,  9863, -1760, -1760,   946,   947,  8685,
-    4149,  1063,   309,   381,  7091, 14102, 11957, 14127, 14152, 14177,
-   14202, 14227, 14252, 14277,  1186,  9863,  1189, -1760,  9863, 14302,
-   -1760, 12903, 12930, -1760,   578,   579,   581, 11986, -1760, 12957,
-   12984, 11041, -1760,  1190,  1192,  1193,   951,  9863,  7328,  9863,
-    9863, -1760, -1760,    36,    93,   354,    93,   961,   963,   957,
-      70,    70,   960, 11074,    70,    70,    70,    70,  9863,    70,
-    1201, -1760,   965,   971,   419,  -123,   972,   586, -1760, -1760,
-   12795,   193,  7565,   970,   377,   973,  1039,  1210,  1070,  9006,
-     974,   978,  1216,  5839, 12015, -1760,  9863,  9863,  9863,  9863,
-    2848,   191,    77, 10560,  9863,  1218,  1221,    31, -1760,   587,
-    1180,  1183,  5839,    22,   983, 14327, 13011,   206,  9863,  9863,
-     991,   992,  7735, -1760, -1760, -1760, -1760, 10470,     4,   987,
-   14352, 13038, -1760,   994, -1760,   173, 11107, -1760, -1760, -1760,
-     989, -1760,   996, -1760,    60, -1760, -1760, 14752, -1760,  1232,
-   12795,    70,   381,  5839,  5839,  1230,  5839,  5839,  5839,  1233,
-    5839,  5839,  5839,  5839,  5839,  5839,  5839,  5839,  5839,  5839,
-    2889,  1235,  7735,  8321, -1760, -1760, -1760, -1760, -1760, -1760,
-   -1760, -1760, -1760, -1760, -1760, -1760, -1760, -1760,  9863, -1760,
-   -1760, -1760, -1760, -1760, -1760, -1760, -1760, -1760,  9863,  9863,
-    9863, -1760, -1760, -1760,   589,  9863,  9863, -1760,  9863, -1760,
-    5839, 10470, 10470, -1760, 12044,   995, -1760, -1760,  9863,  9863,
-   -1760, -1760, -1760,  1133, -1760,  1133,  9863,  9863,   999, -1760,
-    5839,  -170, -1760,  9863,  9863,  9863,   592,  1133,   343,    -6,
-   -1760,  9863,  9863,    70,   598,  5839,  7735,  1237,  1238,  1242,
-     513, -1760, -1760,  1244, -1760,  1011, 14752,  1004, -1760,  1246,
-    1247,  1248,   599,  1252, -1760,  9891, -1760, -1760,   -98, 11140,
-   11173, -1760, -1760, 12073,     1,  1148,  1254,  9238,  1016,  1255,
-    1023,    34,    41,   -78, -1760,   -74, -1760,   309,  1256,  1258,
-    1260,  1261,  1263,  1264,  1265,  1267,  1268,  5839, 14752, -1760,
-    2938,  1022,  1270,  1271,  1272,  1184,  1273, -1760,  1276,  1277,
-    9863,  5839,  5839,  5839,  1275, 11206, -1760,  8953,  2424,    58,
-    1280, -1760,  7735, -1760, -1760, -1760, -1760, 10470, -1760, -1760,
-    9863, 10470, -1760, -1760, -1760, -1760, 14752, -1760,  1040,  1042,
-   10470, -1760, 10470, -1760,  1133, 10470,  1047, -1760,  1043, -1760,
-    1133,  9863,  9863,  1049,   596,  1050,  9322, -1760,  3122,  1052,
-    5839, -1760,  1053, -1760, 12102, 12131, 12160, 12189, -1760, -1760,
-    9863,  1290,    50,  9863,  1293,  1294,  3562, -1760,  1295,    11,
-    1297,  1060,    70,  -170,  -170,  1298, -1760,  1066,  1071,  1064,
-   -1760,  1300, -1760, -1760, -1760, -1760, -1760,  1133,   464,  2852,
-    9863, 13065, 14377,  9863,  9863,   600,  1302,   143,  1133, -1760,
-    1072,  9863,  1303,  9863,  1133,  9554,  7967,    70,  4106,  1073,
-    1065, -1760,  1305,  1306,    75,  1197,  1197,  5839,  1310,  1315,
-    1316,  5839,  1146,  1321,  1322,  1323,  1324,  1325,  1327,  1331,
-    1332,  1333, -1760,  1335,   606, 12795, 12795, 12795, 12795,    70,
-   11239, 11272, 11305,  1101,    70,    70, -1760,  1232,    70, 14402,
-   12795,  1104,   -96, 14752, 12795, -1760,  1336,    70, 11338, 14752,
-   14752, -1760,   390, -1760,  1339, -1760, 14427, 13092, -1760,    70,
-    1340,   607,  5839,  5839,  5839,  1341,  1346, -1760,   229,  9863,
-    5839,  1111,  1119,  1348,   252, -1760,  9863,  9863,  9863,  1121,
-    1122,  1125,  1115, -1760,  3588,  5839, -1760,  9863, -1760,  1347,
-   -1760,  1354, -1760, -1760,  8685,   -37,  5128, -1760,  1126,  1127,
-    1128,  1130,  1131,  1139,  7261,  1355, -1760,  7735, -1760, -1760,
-   -1760,  1143,  9863, -1760, -1760, 13119,  1369,  1371,  1207, -1760,
-    9863,  9863,  9863, -1760,  1378,  1379,  1381,   780,   431,  1147,
-    9269,  1156,  9863,    27,    70,  1157,    70,  1161, -1760, -1760,
-   10560,   453,  9863,  1162, -1760, -1760,  3713, -1760, -1760,  1164,
-    1382, -1760, -1760, -1760, -1760,  3790, -1760,   203,  1165,  1383,
-    3852, -1760, -1760, -1760,    11, -1760,   608, -1760,  9863,   229,
-     860,  1699, -1760,  1168,  9863,  9863,  5839,  1170, -1760,   236,
-    1385,  1386, 14452,  1387,  1174, 14477, 14502,  1390, -1760, -1760,
-   10470,  1169,  1394, 14527, -1760, 11371,  1172, -1760,  4391, 14752,
-   -1760,  1392,  -170,  6313, -1760, -1760, -1760, -1760,  1232, -1760,
-   -1760, -1760,   381,  1395,  1396,  1397, -1760, -1760, -1760,  1426,
-    1342,  1428, -1760, -1760, -1760, -1760, -1760, -1760, -1760, -1760,
-   -1760,  1435,  1199, -1760, -1760, -1760, -1760, -1760,  9863,  9863,
-    9863, -1760, -1760, -1760,  1065, -1760, -1760, -1760, -1760,  9863,
-    1203,  1196, -1760, -1760,  9863,  9863,  9863,    70,   343, -1760,
-   -1760, -1760, -1760,  1202,  1440,  1146,  1441,  9863, -1760,  5839,
-   14752,   666,  7735,  7735,  9863, -1760,  8376, 12218, 14552,  9194,
-      66,    66,  9863,  9863, -1760,   303,  1200, 14577, -1760, -1760,
-   12247,   -58, -1760,  1443,  1444,  5839,   381,   381,   381,   381,
-     381,  5365,  1446, -1760,   613,  9863,  4329,  1447, -1760, -1760,
-    5839,  9503,  1652, 14602, -1760, -1760, -1760, -1760,  8053, -1760,
-   10470,  9863, -1760, 10470, 14752,  8290, 10560,  1206, -1760, -1760,
-   -1760, -1760,  1215,  1208,  9863,  9863, 12276,  9863, 10683, -1760,
-   10683,  5839, -1760, -1760, 10560,  9863,  1453,  1437,    31, -1760,
-    1455, -1760,    11, 13146,  5839, 10470,  1456,    70, -1760,  1217,
-      70,  9863, 11404, 11437,   615, -1760,  9863,  9863,   466, -1760,
-    1223, -1760,  1242,  1246, -1760,  1458,  9863, -1760, -1760,  9863,
-    9631, -1760, -1760,  1224,  1699,   627,  7672,  1393, -1760,  -128,
-   -1760, -1760, -1760, -1760,  1225, -1760,  1464,  5839, 12795, 12795,
-   11470, 12795, -1760,  1231, 11503, 14627, 13173, -1760, -1760,  9863,
-   -1760,  1466, -1760, 14752,  1467,  1227, -1760,   628,   629, 12767,
-    4530,  1468,  1236, -1760, -1760,  9863,  1234,  1243, 12305, 13200,
-    1469,  5839,  1473,  1239,  9863, -1760, -1760,   630,   -36,   148,
-     202,   209,   226,  7498,   239, -1760,  1470, 12334, -1760, -1760,
-    1309, -1760,  9863,  9863, -1760, -1760,  7735,  4563,  1480,  1249,
-   12795,    70, 14752, -1760, -1760, -1760, -1760,    27, -1760, 10560,
-   -1760, 12363,  1250,  1251,  1253,  1482,  4594, -1760,  1484,  1486,
-   -1760, -1760,  1257,  1487,   637, -1760,  1490,  1492,   228, 14752,
-    9863,  9863,  1262,  5839,   638, 14752, 14652, -1760, 14677, 11536,
-   -1760,   995,  1042,  5839,    70, -1760,  9863, 10560,    26,  9863,
-    1493,   645, -1760, -1760,  9863,  1196, -1760,  9863, -1760, -1760,
-   12392, -1760, -1760,  5839,   584,   614,  7735, -1760, -1760,    66,
-    9587, -1760, -1760, -1760,  1494, -1760,  1266,  5839, -1760, 12421,
-    1495,  7735,   381,   381,   381,   381,   381, -1760, -1760,  9863,
-   12450, 12479,   646, -1760, -1760, -1760, -1760, -1760, -1760,  1269,
-    1498,  1274, -1760,  1500, -1760, -1760,    11, -1760,  1337, -1760,
-   -1760, -1760, -1760, -1760,  9863, 11569, 11602,  5839, -1760,  1501,
-    9863,  1278, -1760,  9863,  1279,  1283, -1760, -1760,  2038, -1760,
-    1281, 12508, -1760,  1285, 11635,  1282, 11668, -1760,   651,  1286,
-     381,  5839,  1502,  1287,   381,  1505,   653,  1288, -1760,  9863,
-   -1760,  1508,  1389,  9930,  1292, -1760,   656,   244,   257,   266,
-     310,   315,  4827, -1760, -1760,  1509,  1510, -1760, -1760, -1760,
-    1513, -1760,  1296, 14752,  9863,  9863,   682, -1760, 14752, 11701,
-   -1760, -1760,   995, 10560,  1284, -1760,  9863,  9863, -1760,  9863,
-    1530,   381,    88, -1760, -1760,   381,   104, -1760,  1531, -1760,
-   12537, -1760,  9863, -1760,   309, -1760,  1532,  7735,  7735,  7735,
-    7735,  7498, -1760, -1760, -1760, 10683, -1760,  9863, 14702, 11734,
-      51,  9863,  1299, -1760, -1760, 11767, 11800, 11833, -1760,   322,
-   -1760,   324, -1760, -1760, -1760,  5064,   432, 10021, -1760,   689,
-     692,   694,   695,   347,   702,  1301,   705, -1760,  9863, -1760,
-    5839, 12566, -1760,  9863,  9863,  9863,   381,   381, -1760, -1760,
-   -1760,   309,  1535,  1536,  1538,  1540,  7735,  1541,  1542,  1543,
-    1307, 14727,   708,  1545, 12595, 12795, 11866,   349,   355,   444,
-   -1760, -1760, -1760, -1760,   711, -1760, -1760, -1760, 10470, -1760,
-    1311, -1760,  1547, -1760,  9863,  9863,  9863, -1760,  1552,   713,
-   -1760,  1318,  5839, -1760, 12624, 12653, 12682, -1760,  1556, 10470,
-   10470,   714, -1760,  1557,  1558, -1760, -1760,   719, -1760,  1559,
-   -1760, -1760,  1560, 10470, -1760, -1760, -1760
+   10854,    62,    54, 11005, -1792, -1792,   -74,    61,    41,   -82,
+     -52,    20,    95,   202,   241,   252,    -9,   271,   284,    64,
+      97,    25,   -26,   -26,   112,   118,   143,    36,   167,   176,
+      46,   195,   218,   230,   236,   255,   260,   270,   321,   334,
+     344,   100,   368,   512,   361,   349,   388,   378,  6202,   393,
+     398,   561,   -55,   102,   371,   311,    81,   443,   624,    -2,
+     485,   320,   320,   496,   437,    44, -1792, -1792, -1792, -1792,
+   -1792,   492,   350,   649,   658,    18,    77,   665,   667,   542,
+     768,   789,   828,  5254,   839,   618,   627,   657,    23,    65,
+   -1792,   685,   693, -1792, -1792,   883,   898,   708, -1792, 11203,
+     733, 11233,    31,    33, -1792, -1792, -1792, 10683,   732, -1792,
+   -1792, -1792, -1792, -1792,   746, -1792, -1792, -1792, -1792, -1792,
+   -1792, -1792, -1792, -1792, -1792,    83, -1792, -1792, -1792, -1792,
+      55, -1792,   988,   763,  4060,    58,   775,  1005, 10683, 11173,
+   11173, -1792, 10683, -1792, -1792, -1792, -1792, 11173, -1792, -1792,
+   -1792, -1792,   790,   800,  1037, -1792, -1792, 11263,    25, 10683,
+   10683, 10683,   821, 10683, 10683, 10683,   826, 10683, 10683, 10683,
+   10683, 10683, 10683, 10683, 11173, 10683, 10683, 10683, 10683,  5254,
+     827, -1792,  8799, -1792, -1792, -1792,   824,  5254, 11173, -1792,
+   -1792, -1792, -1792, -1792,   -26,   -26,   -26,   -26,   -26,   -26,
+     -26,   -26,   -26,   -26,   -26,   -26,   -26,   -26,   -26,   -26,
+     -26,   -26,   -26,   -26,   -26,   -26,   -26,   281,   -26,   -26,
+     -26,   -26,   -26,   829,   -26,   -26,   831,   371, -1792, -1792,
+   -1792,   -26,   -26,    38,   894,   895,   896,   832,  6439,   955,
+     371,   837,   -26,   -26,   838,   840,   841, -1792, -1792, -1792,
+   10683,  6676, 10683, 10683,  6913,    25,   901,    48, -1792, -1792,
+     842, -1792,  2905, -1792, -1792, -1792, -1792, -1792,    70, 10683,
+    8799,   844,   845,  7150,  5254,  5254,  5254, -1792, -1792, -1792,
+   -1792, -1792, -1792, -1792, -1792,   843,  7387,   846,  4299,  1077,
+    6439,   847,    23,   849,   850,   320,   320,   320, 10683, 10683,
+      -4, -1792,   224,   320,  4387,   549,   217,   848,   855,   856,
+     857,   861,   862,   863, 10683,  5254,  5254,  5254,   864,    21,
+    1082,   865, -1792,  1098,  1099, -1792,   866,   867,   868, -1792,
+   -1792,   869,  5254,   872,   873,   874, -1792, 10683,  5491, -1792,
+    1102,  1110, 10683, 10683, 10683,   280, 10683,   875, -1792,   940,
+   10683, 10683, 10683, -1792, -1792, 10683, -1792,   -26,   -26,   -26,
+     881,   884,   885,   -26,   -26,   -26,   -26,   -26,   -26,   -26,
+   -1792,   -26, -1792, -1792, -1792,   -26,   -26,   886,   887,   -26,
+     889, -1792,   888,  1116,  1124,   890, -1792, -1792,  1125,  1129,
+    1126,  1130,   -26, 10683, 13435,    82, 11173,  8799, 10683, -1792,
+   -1792,  6439,  6439, -1792,   915, 11263,   536,  1132, -1792, -1792,
+   -1792, -1792, -1792, -1792, 10683, 10683,    30,  6439,  1154,   567,
+    1687,   919,  1157,    43,   922, -1792,   924, 11451, 10683, -1792,
+    1746,  -189, -1792,   113,  -175, 10330, -1792,  -143, -1792,   121,
+    -119,  -115,  1079, -1792,    25,   921,   928, 13951, 13976, 14001,
+   10683, 14026, 14051, 14076, 10683, 14101, 14126, 14151, 14176, 14201,
+   14226, 14251,   927, 14276, 14301, 14326,  5023,  1163, 10683,  8799,
+    3423, -1792,   239, 10683,  1165,   932, 10683, 10683, 10683, 10683,
+   10683, 10683, 10683, 10683, 10683, 10683, 10683, 10683, 10683, 10683,
+   10683, 10683,  8799, 10683, 10683, 10683, 10683, 10683, 10683,  8799,
+    8799,   934, 10683, 10683, 11173, 10683, 11173,  6439, 11173, 11173,
+   11173,   935, 10683,    53, -1792,  9672, 10683,  6439,  5254, 11173,
+   11173,  8799,    25, 11263,    25,   941,  8799,   941, -1792,   941,
+   14351, -1792,   247,   936,    89,  1118, -1792,  1172, 10683, 10683,
+   10683, 10683, 10683, 10683, 10683, 10683, 10683, 10683, 10683, 10683,
+   10683, 10683,  7624, 10683, 10683, 10683, 10683, 10683,    25, 10683,
+   10683,  1179, -1792,   625, 14376,   351, 10683, 10683, 10683, -1792,
+    1177,  1178,  1178,   947, 10683, 10683,  1182,  8799,  8799, 13463,
+     949,  1185, -1792,   950, -1792, -1792,  -138, -1792, -1792, 10555,
+   11381,   320,   320,    58,    58,  -124,  4387,  4387, 10683,  5321,
+     -62, -1792, 10683, 10683, 10683, 10683, 10683, 10683, 10683, 10683,
+   10683, 14401,  1187,  1186,  1188, 10683,  1190, 10683, -1792, 10683,
+    5558, -1792, -1792,  8799,  8799,  8799, 10683,  1191, 10683, 10683,
+   10683, 14426,   954, -1792, -1792, 14451, 14476, 14501,  1025, 11414,
+   -1792,   957,  7797, 14526, 14551, 13546, 11173, 11173, 11173, 11173,
+   11173, 11173, 11173, 11173, 11173, 10683, 11173, 11173, 11173, 11173,
+      10, 11263, 11173, 11173, 11173,    25,    25, -1792, -1792,  8799,
+   -1792,   960,  5795, -1792,   963,  6032, 10683,   941, 10683, -1792,
+      25, 10683, 10683,  1179,   966,   359, 14576, 11386,   969,   381,
+   10683,  1204,   970,   971,   973,   975, 10683, 14601, 13573,   352,
+     974,  1213,  1219, -1792, -1792, -1792,  8799,   163, -1792, -1792,
+   -1792,    25, 10683, 10683,  1179,   985, -1792,   989,   -48,   371,
+     311, -1792,   984, 12536, -1792,    94,  8799,    25, 10683, 10683,
+    1225,  1227,  8799, 10683,  1228, 11173,    25,  9749,  1225,  1230,
+   -1792,    25,  1231, 11173, 10683,   991,   997, -1792, 10683, 11263,
+    1232,  1233,  1234, 14626,  1235,  1236,  1237, 14651,  1238,  1239,
+    1241,  1244,  1245,  1247,  1248, -1792,  1249,  1250,  1251, -1792,
+   10683, 14676,  8799,  1016,  8799, 12565, -1792,  1255, 13519, 13519,
+   13519, 13519, 13519, 13519, 13519, 13519, 13519, 13519, 13519, 11447,
+   13519, 13519, 13519, 13519,   736,   428, 13519, 13519, 13519, 11480,
+   11513, 11546,  3423,  1022,  1021,   103,  8799, 11579, 11612,   428,
+   11645,   428,  1017,  1018,  1019,  -122, 10683, 15476, -1792,   428,
+    1020, 12594, 12623, -1792,  1023,  -156,   428,  -129,  1028,   168,
+     431,  1263, -1792,  1225,   428,  1029,  1030,  8029,  8735,   923,
+     688,  1075,  1075,   644,   644,   644,   644,   644,   644,   566,
+     566,  8799,   179, -1792,   179,   179,   941,   941,   941,  1031,
+   14701, 13600,  -149,   463,  8799, -1792,  1266,  1032, 14726, 14751,
+   14776, 10683,  6439,  1273,  1272,  9440, 12652, 14801, -1792,   446,
+     497,  8799,  1034, -1792,  6269, -1792,  6506,  6743,   320, 10683,
+   10683, -1792, -1792,  1036,  1039,  4387, 10012,  1152,    71,   320,
+    6980, 14826, 12681, 14851, 14876, 14901, 14926, 14951, 14976, 15001,
+    1277, 10683,  1279, -1792, 10683, 15026, -1792, 13627, 13654, -1792,
+     564,   590,   596, 12710, -1792, 13681, 13708, 11678, -1792, -1792,
+    1280,  1283,  1285,  1041, 10683,  7217, 10683, 10683, -1792, -1792,
+       8,   -20,   337,   -20,  1053,  1069,  1063,   428,   428,  1064,
+   11711,   428,   428,   428,   428, 10683,   428,  1305, -1792,  1067,
+    1076,   356,   263,  1078,   601, -1792, -1792, -1792, -1792, 13519,
+     179,  7454,  1072,   647,  1071,  1144,  1315,  1176,  9981,  1083,
+    1086,  1320,  6439, 12739, -1792, 10683, 10683, 10683, 10683,  1925,
+     483,    88, 11263, 10683,  1325,  1328,    26, -1792,   602,  1287,
+    1288,  6439,    16,  1090, 15051, 13735,   399, 10683, 10683,  1097,
+    1100,  1101,  7861, -1792, -1792, -1792, -1792, 11173,  -108,  1096,
+   15076, 13762, -1792,  1105, -1792,   -50, 11744, -1792, -1792, -1792,
+    1106, -1792,  1113, -1792,    69, -1792, -1792, 15476, -1792,  1341,
+   13519,   428,   320,  6439,  6439,  1346,  6439,  6439,  6439,  1348,
+    6439,  6439,  6439,  6439,  6439,  6439,  6439,  6439,  6439,  6439,
+    2077,  1349,  8799,  3423, -1792, -1792, -1792, -1792, -1792, -1792,
+   -1792, -1792, -1792, -1792, -1792, -1792, -1792, -1792, 10683, -1792,
+   -1792, -1792, -1792, -1792, -1792, -1792, -1792, -1792, 10683, 10683,
+   10683, -1792, -1792, -1792,   607, 10683, 10683, -1792, 10683, -1792,
+    6439, 11173, 11173, -1792, 12768,  1109, -1792, -1792, -1792,  1181,
+   10683, 10683, -1792, -1792, -1792,  1225, -1792,  1225, 10683, 10683,
+    1119, -1792,  6439,   -26, -1792, 10683, -1792, 10683, 10683,   608,
+    1225,  -149,     4, -1792, 10683, 10683,   428,   614,  6439,  8799,
+    1353,  1354,  1355,  9389, -1792, -1792,  1357, -1792,  1127, 15476,
+    1117, -1792,  1359,  1361,  1363,   616,  1360, -1792,  7691, -1792,
+   -1792,   137, 11777, 11810, -1792, -1792, 12797,  -150,  1262,  1368,
+   10065,  1134,  1367,  1139,    40,    52,   -47, -1792,   141, -1792,
+      71,  1372,  1377,  1380,  1382,  1383,  1385,  1386,  1387,  1388,
+    6439, 15476, -1792,  2678,  1141,  1392,  1393,  1394,  1304,  1395,
+   -1792,  1397,  1399, 10683,  6439,  6439,  6439,  1402, 11843, -1792,
+    9062,  1322,    63,  1403, -1792,  8799, -1792, -1792, -1792, -1792,
+   11173, -1792, -1792, 10683, 11173, -1792, -1792, -1792, -1792, 15476,
+   -1792,  1164,  1161, 11173, -1792, 11173, -1792,  1225, 11173,  1171,
+   -1792,  1166, -1792,  1225, 10683, 10683,  1169,   371,  1170, 10297,
+   -1792,  2754,  1174,  6439, -1792,  1180, -1792, 12826, 12855, 12884,
+   12913, -1792, -1792, 10683,  1412,    37, 10683,  1414,  1415,  3179,
+   -1792,  1416,    23,  1419,  1195,   428,   -26,   -26,  1420, -1792,
+    1183,  1198,  1196, -1792,  1432, -1792, -1792, -1792, -1792, -1792,
+    1225,   136,  2522, 10683, 13789, 15101, 10683,  8093, 10683,  1200,
+     635,  1439,   109,  1225, -1792,  1201, 10683,  1441, 10683,  1225,
+   10374,  9031,   428,  4706,  1209,  1206, -1792,  1450,  1451,   119,
+    1335,  1335,  6439,  1453,  1455,  1456,  6439,  1286,  1458,  1459,
+    1461,  1462,  1464,  1465,  1466,  1467,  1468, -1792,  1470,   636,
+   13519, 13519, 13519, 13519,   428, 11876, 11909, 11942,  1240,   428,
+     428, -1792,  1341,   428, 15126, 13519,  1246,   -89, 15476, 13519,
+   -1792,  1471,   428, 11975, 15476, 15476, -1792,   656, -1792,  1474,
+   -1792, 15151, 13816, -1792,   428,  1473,   637,  6439,  6439,  6439,
+    1477,  1478, -1792,   188, 10683,  6439,  1252,  1253,  1480,   547,
+   -1792, 10683, 10683, 10683,  1254,  1256,  1257,  1261, -1792,  3248,
+    6439, -1792, 10683, -1792,  1483, -1792,  1484, -1792, -1792,  4387,
+     317,  5728, -1792,  1260,  1267,  1268,  1269,  1271,  1274,  8325,
+    1486, -1792,  8799, -1792, -1792, -1792,  1276, 10683, -1792, -1792,
+   13843,  1487,  1488,  1331, -1792, 10683, 10683, 10683, -1792,  1492,
+    1500,  1503,   781,   495,  1275,  9621,  1278, 10683,    27,   428,
+    1281,   428,  1284, -1792, -1792, 11263,   664, 10683,  1282, -1792,
+   -1792,  3595, -1792, -1792,  1309,  1509, -1792, -1792, -1792, -1792,
+    3629, -1792,   569,  1289,  1513,  3654, -1792, -1792, -1792,    23,
+   -1792,   643, -1792, 10683,   188,   376,  1381, -1792,  1290, 10683,
+   10683,  6439,  1292, -1792,   594,  1512,  1516, 15176,  1518,  1263,
+   15201,  1314,   650, 15226,  1521,  1522, -1792, -1792, 11173,  1294,
+    1527, 15251, -1792, 12008,  1297, -1792,  4992, 15476, -1792,  1552,
+     -26,  6913, -1792, -1792, -1792, -1792,  1341, -1792, -1792, -1792,
+     320,  1555,  1557,  1558, -1792, -1792, -1792,  1559,  1472,  1560,
+   -1792, -1792, -1792, -1792, -1792, -1792, -1792, -1792, -1792,  1563,
+    1326, -1792, -1792, -1792, -1792, -1792, 10683, 10683, 10683, -1792,
+   -1792, -1792,  1206, -1792, -1792, -1792, -1792, 10683,  1330,  1323,
+   -1792, -1792, 10683, 10683, 10683,   428,  -149, -1792, -1792, -1792,
+   -1792,  1334,  1572,  1286,  1575, 10683, -1792,  6439, 15476,   999,
+    8799,  8799, 10683, -1792,  9440, 12942, 15276,  9705,    58,    58,
+   10683, 10683, -1792,   312,  1338, 15301, -1792, -1792, 12971,   156,
+   -1792,  1577,  1584,  6439,   320,   320,   320,   320,   320,  5965,
+    1587, -1792,   681, 10683,  3727,  1588, -1792, -1792,  6439,  9937,
+     598, 15326, -1792, -1792, -1792, -1792,  9117, -1792, 11173, 10683,
+   -1792, 11173, 15476,  9354, 11263,  1347, -1792, -1792, -1792, -1792,
+    1356,  1351, 10683, 10683, 13000, 10683, 11386, -1792, 11386,  6439,
+   -1792, -1792, 11263, 10683,  1595,  1598,    26, -1792,  1597, -1792,
+      23, 13870,  6439, 11173,  1601,   428, -1792,  1366,   428, 10683,
+   12041, 12074,   683, -1792, 10683, 10683,   154, -1792,  1365, -1792,
+    1355,  1603,  1605,  1359, -1792, -1792,  1609, 10683, -1792, -1792,
+   10683, 10606, -1792, -1792,  1374,  1381,   686,  2152,  1612, -1792,
+     573, -1792, -1792, -1792, -1792,  1378, -1792,  1599,  6439, 13519,
+   13519, 12107, 13519, -1792,  1389, 12140, 15351, 13897, -1792, -1792,
+   10683, -1792,  1614, -1792, 15476,  1617,  1384, -1792,   689,   691,
+   13491,  4005,  1620,  1390, -1792, -1792, 10683,  1396,  1398, 13029,
+   13924,  1624,  6439,  1625,  1391, 10683, -1792, -1792,   692,   191,
+     226,   265,   324,   330,  8562,   354, -1792,  1630, 13058, -1792,
+   -1792,  1475, -1792, 10683, 10683, -1792, -1792,  8799,  4446,  1631,
+    1404, 13519,   428, 15476, -1792, -1792, -1792, -1792,    27, -1792,
+   11263, -1792, 13087,  1401,  1405,  1406,  1633,  4642, -1792,  1636,
+    1640, -1792, -1792,  1407,  1642,   694, -1792,  1645,  1647,   -30,
+   15476, 10683, 10683,  1411,  6439,   699, 15476, 15376, -1792, -1792,
+   -1792, 15401, 12173, -1792,  1109,  1161,  6439,   428, -1792, 10683,
+   11263,    25, 10683,  1649,   700, -1792, -1792, 10683,  1323, -1792,
+   10683, -1792, -1792, 13116, -1792, -1792,  6439,   578,   652,  8799,
+   -1792, -1792,    58, 10246, -1792, -1792, -1792,  1651, -1792,  1417,
+    6439, -1792, 13145,  1652,  8799,   320,   320,   320,   320,   320,
+   -1792, -1792, 10683, 13174, 13203,   702, -1792, -1792, -1792, -1792,
+   -1792, -1792,  1425,  1653,  1423, -1792,  1654, -1792, -1792,    23,
+   -1792,  1493, -1792, -1792, -1792, -1792, -1792, 10683, 12206, 12239,
+    6439, -1792,  1665, 10683,  1429, -1792, 10683,  1430,  1431, -1792,
+   -1792,  2637, -1792,  1434, 13232, -1792,  1433, 12272,  1437, 12305,
+   -1792,   727,  1435,   320,  6439,  1673,  1438,   320,  1674,   737,
+    1440, -1792, 10683, -1792,  1676,  1502,  8392,  1442, -1792,   740,
+     363,   366,   444,   459,   482,  4744, -1792, -1792,  1677,  1680,
+   -1792, -1792, -1792,  1682, -1792,  1446, 15476, 10683, 10683,   742,
+   -1792, 15476, 12338, -1792, -1792,  1109, 11263,  1452, -1792, 10683,
+   10683, -1792, 10683,  1684,   320,   122, -1792, -1792,   320,   128,
+   -1792,  1685, -1792, 13261, -1792, 10683, -1792,    71, -1792,  1688,
+    8799,  8799,  8799,  8799,  8562, -1792, -1792, -1792, 11386, -1792,
+   10683, 15426, 12371,    22, 10683,  1457, -1792, -1792, 12404, 12437,
+   12470, -1792,   486, -1792,   488, -1792, -1792, -1792,  4929,   545,
+    8629, -1792,   748,   751,   753,   756,   494,   785,  1460,   786,
+   -1792, 10683, -1792,  6439, 13290, -1792, 10683, 10683, 10683,   320,
+     320, -1792, -1792, -1792,    71,  1689,  1690,  1691,  1693,  8799,
+    1694,  1699,  1706,  1476, 15451,   787,  1707, 13319, 13519, 12503,
+     499,   522,   619, -1792, -1792, -1792, -1792,   788, -1792, -1792,
+   -1792, 11173, -1792,  1479, -1792,  1708, -1792, 10683, 10683, 10683,
+   -1792,  1710,   794, -1792,  1481,  6439, -1792, 13348, 13377, 13406,
+   -1792,  1711, 11173, 11173,   813, -1792,  1712,  1714, -1792, -1792,
+     814, -1792,  1717, -1792, -1792,  1719, 11173, -1792, -1792, -1792
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-   -1760, -1760, -1760, -1760,   290, -1760, -1760, -1760, -1760,  -398,
-   -1760, -1760, -1760, -1760, -1760, -1760, -1760, -1760, -1760, -1760,
-   -1760, -1760,  -674,  -133,  3019,  2641, -1760,  1167, -1760, -1760,
-   -1760, -1760, -1760, -1760, -1759, -1760,   247,    78,  -217, -1760,
-    -180, -1760,    25,   282,  1576, -1760,    -1,   874, -1760, -1760,
-       0,  -578,  -288, -1760, -1760, -1760, -1760, -1760, -1760, -1760,
-   -1760,  1580, -1760, -1760, -1760, -1760, -1143, -1145,  1581, -1606,
-    1583, -1760, -1760, -1760,  1024, -1760,  -226, -1760, -1760, -1760,
-   -1760,  1904, -1760, -1760, -1323,   163,  1588, -1760,     2,  -661,
-   -1760, -1760,    99, -1760, -1549,   -28,  -171,  2090,   720,  -283,
-     -46, -1760,   166,   -82, -1760, -1760,   -22,   134, -1567,  -142,
-     872, -1760,    -3
+   -1792, -1792, -1792, -1792,   425, -1792, -1792, -1792, -1792,  -272,
+   -1792, -1792, -1792, -1792, -1792, -1792, -1792, -1792, -1792, -1792,
+   -1792, -1792,  -694,   -68,  3071,  3210, -1792,  1291, -1792, -1792,
+   -1792, -1792, -1792, -1792, -1791, -1792,   377,   204,   -94, -1792,
+     -54, -1792,   150,   414,  1733, -1792,     6,   -51, -1792, -1792,
+       7,  -592,  -248, -1792, -1792, -1792, -1792, -1792, -1792, -1792,
+   -1792,  1734, -1792, -1792, -1792, -1792, -1174, -1160,  1735, -1637,
+    1736, -1792, -1792, -1792,  1175, -1792,  -107, -1792, -1792, -1792,
+   -1792,  1937, -1792, -1792, -1350,   291,  1741, -1792,     2,  -675,
+   -1792, -1792,    92, -1792, -1601,   -31,  -155,  2443,   276,  -289,
+      80, -1792,   104,   -64, -1792, -1792,   105,   264, -1599,  -136,
+    1024, -1792,    -3
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
    positive, shift that token.  If negative, reduce the rule which
    number is the opposite.  If zero, do what YYDEFACT says.
    If YYTABLE_NINF, syntax error.  */
-#define YYTABLE_NINF -536
+#define YYTABLE_NINF -545
 static const yytype_int16 yytable[] =
 {
-     134,   412,   114,   115,   574,   431,   877,   878,  1383,  1540,
-     954,   590,   607,   974,  1385,   339,   468,   377,   154,   381,
-     264,   982,  1762,   153,  1763,   152,  1256,   162,   166,   611,
-     152,  1615,  1874,   527,   314,   152,  1727,   138,   382,   152,
-    1378,   987,   384,  1189,   994,   266,   394,  1380,  1755,   141,
-     687,  1146,   416,   276,  1447,   712,  1003,  1999,   343,   319,
-     726,   320,  1414,   713,  1012,   270,   727,  1286,  1147,   155,
-     418,   156,   318,   582,   583,   439,  1148,  1149,  1150,   286,
-     266,  1501,  1151,  1152,  1239,   342,   270,   271,   152,   584,
-     582,   583,  1146,   699,  1980,   661,   378,   663,   714,   582,
-     583,   561,   562,   563,   287,   675,   438,  1794,   990,  1147,
-    1982,   872,   582,   583,   315,   723,   549,  1148,  1149,  1150,
-     288,   289,  1214,  1151,  1152,  1215,   582,   583,   549,   582,
-     583,   417,   493,   879,   494,   419,   427,   427,  1801,   603,
-     604,   605,   668,   155,   433,   156,   321,   883,     4,  1479,
-    1366,   461,  1096,   582,   583,   440,   618,  1101,  1415,  1416,
-     295,   297,   183,   300,   718,   184,  1382,   721,   185,   582,
-     583,   427,   719,  1972,  1384,   722,   266,   277,  1092,   266,
-     278,   186,   279,  1093,   266,   427,  1257,  1258,  1259,  1260,
-    1724,   582,   583,   280,   973,   310,  1379,   311,  1239,    60,
-      61,    62,    63,  1381,   980,   528,   628,  1582,   136,   264,
-    1634,   692,  1831,   693,    74,   316,  1616,    77,  1693,  1089,
-     688,   689,   108,     5,  1448,  1449,   505,  1083,   582,   583,
-     406,   407,   108,   137,   266,   722,  1239,   108,   510,  1344,
-    1383,   108,   108,   560,  1277,  1370,   108,   266,   139,   608,
-     266,   526,   761,   567,   340,   136,   525,   572,  1565,  1566,
-     995,   996,   163,   167,  1888,   266,  1261,   938,   266,   266,
-     266,   266,   178,   317,  1249,   692,   383,   693,   266,   395,
-     385,  1190,   266,   396,   342,   868,   142,   870,   871,   402,
-     403,   404,   405,   344,  2000,   108,   140,  1240,  1243,   155,
-     415,   156,   582,   583,   884,   425,   428,   266,   266,   266,
-     692,   529,   693,   406,   407,   582,   583,   679,  1926,   143,
-     406,   407,  1242,   700,   266,   701,   144,  -528,   715,   702,
-     716,   582,   583,   692,   717,   693,   155,   145,   156,   808,
-     456,   722,   918,   406,   407,   724,   550,   716,   551,  1073,
-     282,   725,   552,   283,   469,   406,   407,   729,   550,  1995,
-     551,   301,   802,   727,   552,   995,   996,   676,   677,   406,
-     407,   155,   669,   156,   670,   582,   583,  1095,   671,   952,
-    1096,   272,   146,   690,   273,   147,   274,   427,   266,   577,
-     578,   324,   266,   266,   325,   150,  1832,   586,   591,   402,
-     403,   404,   405,   402,   403,   404,   405,   326,   266,   402,
-     403,   404,   981,  1282,   703,   402,   403,   404,   405,   148,
-     709,   761,   149,   406,   407,   546,   547,   406,   407,   582,
-     583,   548,  1331,   813,  1332,   734,   582,   583,  1146,   406,
-     407,   402,   403,   404,   405,  1270,  1342,  1222,   302,  -531,
-    1833,  2022,   303,   582,   583,  1147,   151,  1834,   304,   305,
-     266,   306,   307,  1148,  1149,  1150,   582,   583,  1863,  1151,
-    1152,   582,   583,   799,  1835,  1657,  1864,  1625,   179,  -532,
-     308,   560,  1885,   266,   582,   583,   692,  1836,   693,   694,
-     266,   792,  1957,   582,   583,   427,   926,   427,   266,   427,
-     427,   433,   159,  2061,   806,  1958,   266,   266,   427,   427,
-     266,   154,   160,   154,  1959,   266,   812,   161,   814,   530,
-     531,   532,   533,   534,   535,   536,   537,   538,   539,   540,
-     541,   542,   543,   544,   545,   546,   547,   582,   583,   164,
-     266,   548,   582,   583,   582,   583,   843,  1720,   180,   582,
-     583,   582,   583,  1427,   975,  1111,   672,  1112,  1960,  1431,
-     585,  1146,   165,  1961,   135,   266,   266,   392,   136,   941,
-    2006,   393,  2007,  1146,   582,   583,   582,   583,  1147,   406,
-     407,  1135,   582,   583,   419,   419,  1148,  1149,  1150,   709,
-    1147,   168,  1151,  1152,   692,  2016,   693,  2045,  1148,  1149,
-    1150,   169,  1192,  2046,  1151,  1152,  1469,   170,   291,   292,
-     709,   266,   266,   266,   291,   292,  1221,  1481,  1222,   680,
-     293,   171,   681,  1486,   294,   682,   293,   683,   593,  1545,
-     299,  1546,   594,   433,   427,   433,   427,   427,   427,   427,
-     427,   427,  1355,   427,   427,   427,   427,   940,   172,   427,
-     427,   427,   154,   946,  1021,   181,   266,   945,   182,   692,
-     709,   693,   709,   173,   796,   953,   798,  1212,   800,   801,
-    1705,   692,  1706,   693,   709,   174,  2009,   809,   810,   761,
-     268,   875,   876,   290,  1559,   760,   578,   275,  2047,   761,
-     234,   266,  1624,   235,  1625,   236,   984,   175,   582,   583,
-     406,   407,   406,   407,   817,   285,    41,  -530,   761,  -535,
-     266,   999,   176,  1110,   592,   177,   266,  1889,  1890,   433,
-    1010,   188,   851,  1891,   956,  1014,   761,   427,   761,   530,
-     531,   532,   533,   534,   535,   536,   537,   538,   539,   540,
-     541,   542,   666,   544,   545,   546,   547,  1893,  1894,   267,
-     962,   548,   269,  1891,   963,   284,   266,   298,   266,   535,
-     536,   537,   538,   539,   540,   541,   542,   666,   544,   545,
-     546,   547,   692,  1635,   693,   848,   548,  1127,   541,   542,
-     666,   544,   545,   546,   547,  1644,  1607,  1608,   309,   548,
-     266,   666,   544,   545,   546,   547,   312,  1099,  1130,   328,
-     548,   761,   761,   925,   313,   927,   928,   929,   930,   931,
-     932,  1986,   934,   935,   936,   937,   322,  1131,   942,   943,
-     944,   761,  1174,  1175,   323,  1176,   761,   761,  1121,   761,
-    1218,  1252,   266,  1319,   761,   761,  1341,   761,  1241,  1244,
-     761,  1383,  1349,  1363,  1477,   266,   761,   761,   761,   329,
-    1522,  1553,  1641,   266,   761,   761,  1642,  1736,   330,  1782,
-     335,   761,   266,  1783,   152,   350,   349,   709,  2029,   709,
-     709,  1795,  1814,  1815,  1830,  1796,   761,   761,  1783,   336,
-     337,  1860,  1869,   709,  1383,   722,  1870,   338,  1008,  1883,
-    1915,  1245,   347,  1783,   761,  1940,  1016,  1948,   345,  1783,
-    1956,   761,   466,   346,   761,   348,   351,   352,   353,   354,
-     355,   356,   357,   358,   359,   379,   390,   709,   397,   360,
-     361,   362,   363,   391,   398,   423,  1970,   364,   365,   366,
-    1783,   422,   367,  2012,   368,  1232,  2013,   761,  2014,  2015,
-     761,   438,   761,   761,   136,   369,  2017,   467,   370,  2019,
-     761,   709,  2040,  1870,  1255,  2048,  1783,  2058,  2069,   761,
-     266,  2059,  1783,  2072,   436,   444,  1455,  2073,   448,   462,
-     501,  1138,   504,   571,  1251,  1343,  1345,   508,  1144,   266,
-     509,   511,  1155,   514,   515,   516,   400,   557,   556,   266,
-     393,   558,  1716,  1717,   427,  1295,  1296,   565,  1298,  1299,
-    1300,   568,  1302,  1303,  1304,  1305,  1306,  1307,  1308,  1309,
-    1310,  1311,   573,   575,   576,   595,   596,   597,   598,   609,
-     266,   266,   599,   266,   266,   266,   600,   266,   266,   266,
-     266,   266,   266,   266,   266,   266,   266,   601,   606,   266,
-     612,   610,   613,   623,   614,   615,   616,   617,   619,   620,
-     621,   624,  1323,   371,   372,   373,   630,   631,   639,   640,
-     641,   652,   653,   655,   374,   657,   656,   658,   375,   659,
-     376,   108,  1336,   660,   662,   678,   684,   266,   427,   427,
-     691,   697,   698,   135,   731,   704,   752,  1350,   757,   763,
-     735,   736,   764,   793,   803,   548,   820,   266,   818,   846,
-     692,   855,   693,  1645,   856,   859,   862,   866,   867,   916,
-     895,   673,   266,   266,   869,   897,   919,   898,   900,   908,
-     955,  1294,   961,   965,   966,   977,   967,   968,   969,   978,
-     988,   989,   976,   992,   709,  1343,  1345,  1002,  1004,  1395,
-    1007,  1013,  1015,  1018,  1022,  1019,  1628,  1023,  1024,  1026,
-    1630,  1027,  1028,  1406,  1407,  1408,  1030,  1031,  1032,  1033,
-    1034,  1035,  1036,  1276,   266,  1037,  1038,  1039,  1042,  1046,
-    1071,  1640,  1080,  1072,  1081,  1082,  1088,  1094,   266,   266,
-     266,  1100,  1103,  1107,  1115,  1116,  1122,  1124,  1133,   266,
-    1141,  1142,  1145,  1167,   427,  1169,  1184,  1181,   427,  1182,
-    1183,  1195,  1439,  1196,  1490,  1197,  1495,   427,  1200,   427,
-    1208,  1211,   427,  1210,  1217,  1220,  1224,  1225,  1229,  1226,
-    1223,  1230,  1231,  1433,  1247,  1248,  1253,   266,  1267,  1254,
-    1273,  1274,  1278,  1281,  1284,  1285,  1288,  1297,   815,  1335,
-    1301,  1897,  1313,  1327,  1352,  1353,   342,  1324,  1325,  1354,
-    1357,  1358,  1359,  1360,  1361,  1362,  1364,  1371,  1372,  1375,
-    1494,  1376,  1377,  1386,  1387,  1397,   427,  1388,  1389,  1505,
-    1390,  1391,  1392,  1509,  1393,  1394,  1398,  1399,  1400,  1409,
-    1402,  1401,  1403,  1404,  1417,   266,  1422,  1429,   863,   864,
-    1423,  1430,  1432,  1434,   266,  1438,  1446,  1440,   266,  1451,
-    1452,  1458,  1454,  1457,  1462,  1464,  1468,  1466,  1478,  1484,
-    1465,  1499,  1500,  1498,  1636,  1497,  1506,  1482,  1649,  1649,
-    1502,  1507,  1508,  1510,  1554,  1555,  1556,  1512,  1513,  1514,
-    1515,  1516,  1561,  1517,   904,   905,   906,  1518,  1519,  1520,
-    1521,  1531,  1542,  1548,  1538,  1557,  1552,  1576,  1623,   266,
-     266,   266,  1558,  1578,  1562,  1564,  1573,   266,  1584,  1771,
-    1579,  1593,  1563,  1419,  1570,  1571,  1592,  1421,  1572,  1585,
-    1586,  1587,   266,  1588,  1589,  1598,  1425,  1599,  1426,   947,
-    1600,  1428,  1590,   266,  1604,  1605,  1595,  1606,  1632,  1658,
-    1638,   266,  1659,  1661,   266,  1610,  1664,  1620,  1667,  1673,
-    1798,  1680,  1681,  1682,  1613,  1627,  1672,  1651,  1666,  1215,
-    1637,  1670,  1631,  1656,   979,  1698,   532,   533,   534,   535,
-     536,   537,   538,   539,   540,   541,   542,   666,   544,   545,
-     546,   547,  1683,   998,  1685,  1471,   548,  1684,  1655,  1005,
-    1686,  1768,  1687,  1692,  1096,  1699,  1700,  1702,  1721,  1725,
-    1726,   342,  1735,  1739,  1757,  1758,  1759,   433,   433,  1767,
-    1671,  1770,  1775,   266,  1787,   722,  -533,  1793,  1799,  1800,
-    1813,  1806,  1811,  1812,  1818,  1825,  1837,   427,  1821,  1819,
-    1827,  1839,  1828,  1581,  1711,   266,  1844,  1822,  1854,  1845,
-     266,  1856,  1857,  1859,  1851,  1852,  1861,  1853,  1862,  1882,
-    1900,  1905,  1858,  1774,  1917,  1867,  1919,  1927,  1944,  1916,
-    1901,  1947,  1921,  1074,  1951,  1963,  1964,  1918,  1952,  1966,
-    1934,  -534,  1938,  1930,  1974,  1698,  1748,  1931,  1936,  1941,
-    1945,  1704,  1949,  1753,  1756,  1955,  1978,  1983,  1988,  1967,
-    1903,  2030,  2031,  2002,  2032,  2018,  2033,  2035,  2036,  2037,
-    2038,  2041,  1765,  2053,  2052,  1106,   266,  1655,  2057,   266,
-     266,  2060,  2065,  2070,  2071,  2074,  2075,  1480,  1114,  1996,
-     419,   419,  1740,  1920,  1534,  1875,  1678,  1848,  1504,   113,
-    1701,   991,   266,   124,   125,  1132,   126,   858,   266,  1895,
-    1622,   132,  1769,  1754,  1009,  1650,     0,   266,     0,     0,
-       0,  1679,   730,  1764,     0,     0,     0,   427,     0,     0,
-     427,     0,     0,     0,     0,     0,  1773,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   709,   266,   709,
-    1965,     0,     0,     0,     0,  1251,     0,     0,     0,   342,
-       0,   266,   433,     0,     0,     0,  1665,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,  1655,
-    1743,     0,     0,     0,     0,     0,     0,  1987,     0,     0,
-       0,   433,     0,     0,     0,     0,     0,  1849,     0,     0,
-       0,     0,     0,     0,   266,  1728,  1729,  1730,  1731,  1732,
-    1734,     0,     0,  1826,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   152,   350,     0,     0,     0,     0,     0,
-       0,     0,  1275,     0,     0,  1879,     0,     0,   266,     0,
+     134,   893,   894,   583,   286,   993,  1410,  1568,   973,   114,
+     115,   437,  1758,  1001,   152,  1212,  1408,   266,   154,  1793,
+    1279,  1794,   319,   153,   467,   616,   141,   345,  2032,   152,
+     152,  1643,   474,  1907,   699,   383,   388,   387,   390,  1006,
+     162,  1472,   272,   514,  1786,   268,  1403,   152,   306,   272,
+     166,   725,   711,   536,     5,  1023,   599,   152,  1405,   726,
+     281,   400,   424,  1032,   273,   731,   418,  1439,     4,   349,
+     422,  1009,   323,   732,   620,   137,  1311,   591,   592,   558,
+     268,   324,  1169,   325,   704,   348,   705,   412,   413,   591,
+     592,   680,  1111,   445,  1395,  1262,   384,   734,   444,  1170,
+    1014,   143,   320,   591,   592,   735,  1827,  1171,  1172,  1173,
+     888,  1114,   558,  1174,  1175,  1507,  1115,  1834,  1103,   570,
+     571,   572,   727,   739,   895,  1529,   735,   742,  2013,   740,
+     736,   423,  1302,   740,  2015,   307,   433,   433,   138,   308,
+     774,   672,   425,   675,   439,   309,   310,   291,   311,   312,
+     155,   687,   156,   300,   302,   446,   305,   139,  1123,  1118,
+     612,   613,   614,  1440,  1441,   591,   592,   313,   326,   135,
+     999,   433,   292,   136,  2005,   287,   268,   627,   288,   268,
+    1280,  1281,  1282,  1283,   268,   433,   899,   140,   293,   294,
+    1307,    60,    61,    62,    63,  1262,   274,  1407,   774,   275,
+    1169,   276,  1404,   321,   700,   701,    74,   266,   144,    77,
+    1896,  1473,  1474,   155,  1406,   156,  1644,  1170,  1897,  1724,
+     704,   108,   705,   591,   592,  1171,  1172,  1173,   735,   108,
+     147,  1174,  1175,   511,   108,   268,   108,   108,   421,   593,
+     412,   413,   569,   431,   434,  1921,   518,   145,   268,  1369,
+    1408,   268,   534,  1213,   108,   576,   955,   533,   146,   581,
+    1284,   322,   617,   142,   108,  2033,   346,   268,   136,  1272,
+     268,   268,   268,   268,   389,   163,   391,   148,   462,   412,
+     413,   515,   712,   268,   713,   167,  -537,   268,   714,   348,
+     149,   537,   475,   704,   401,   705,  1263,  1266,   402,  1959,
+     408,   409,   410,   411,   350,   150,   412,   413,   155,   559,
+     156,   560,   268,   268,   268,   561,  1015,  1016,   412,   413,
+     538,   681,   398,   682,   412,   413,   399,   683,   155,   268,
+     156,  1015,  1016,  1265,   884,   268,   886,   887,   151,   412,
+     413,   691,   559,   178,   560,  1093,   591,   592,   561,   591,
+     592,   159,   728,   900,   729,   591,   592,   160,   730,   992,
+     737,  2028,   729,   823,   591,   592,   738,   181,   591,   592,
+     688,   689,   412,   413,   815,   408,   409,   410,  1000,  -539,
+     152,   356,   161,   591,   592,  1391,   702,   586,   587,  1409,
+     412,   413,   935,   433,   268,   595,   600,  -544,   268,   268,
+     408,   409,   410,   411,  1755,   282,   164,   155,   283,   156,
+     284,   555,   556,  1117,   268,   165,  1118,   557,   591,   592,
+     715,   285,   357,   358,   359,   360,   361,   362,   363,   364,
+     365,   971,  2055,   722,   168,   366,   367,   368,   369,  1864,
+    1356,   747,  1357,   370,   371,   372,  1169,   315,   373,   316,
+     374,   591,   592,   591,   592,  1367,   602,   169,   472,   828,
+     603,   375,   277,  1170,   376,   278,   268,   594,   279,   170,
+     280,  1171,  1172,  1173,  1865,   171,   812,  1174,  1175,   183,
+     179,    41,   184,   773,  2094,   185,   569,   774,  1918,   268,
+    1262,   832,   591,   592,   172,   774,   268,   805,   186,   173,
+     684,   433,   406,   433,   268,   433,   433,   439,  1237,   174,
+     819,  1238,   943,  1866,   268,   268,   433,   433,   268,   154,
+     499,   154,   500,   268,   827,   638,   829,   136,   539,   540,
+     541,   542,   543,   544,   545,   546,   547,   548,   549,   550,
+     551,   552,   553,   554,   555,   556,   565,   296,   297,   268,
+     557,   591,   592,  1593,  1594,   859,  1751,   591,   592,   298,
+     175,  1610,  1452,   299,   408,   409,   410,   411,  1456,   377,
+     378,   379,  1867,   176,   268,   268,  1662,   704,  1868,   705,
+     380,   591,   592,   177,   381,  1215,   382,   108,   412,   413,
+     591,   592,   182,   591,   592,   867,   704,   958,   705,   774,
+     425,   425,  1869,   975,  1235,   722,  1774,   774,   809,   180,
+     811,  1990,   813,   814,  1991,  1494,   704,   188,   705,  1673,
+     268,   268,   268,   824,   825,   981,   722,   692,  1509,   982,
+     693,   994,   269,   694,  1514,   695,   329,  1158,  1293,   330,
+    1245,   270,  -540,   439,   433,   439,   433,   433,   433,   433,
+     433,   433,   331,   433,   433,   433,   433,   957,   271,   433,
+     433,   433,   154,   963,   296,   297,   268,   962,   704,  1011,
+     705,   591,   592,   685,  1169,  1121,   298,   972,   722,   774,
+     304,   722,   289,   891,   892,  1041,   591,   592,   587,  1587,
+    1153,  1170,  1992,   722,   774,   408,   409,   410,   411,  1171,
+    1172,  1173,  1134,   268,  1135,  1174,  1175,  1993,  1003,   591,
+     592,  1922,  1923,   591,   592,   591,   592,  1924,   290,   412,
+     413,   591,   592,   268,  1019,  1010,   591,   592,   295,   268,
+    1994,   314,   439,  1030,  2039,   704,  2040,   705,  1034,   303,
+     433,  1154,  2049,   774,   538,   774,   317,  2078,  1169,   591,
+     592,   942,   318,   944,   945,   946,   947,   948,   949,   327,
+     951,   952,   953,   954,   328,  1170,   959,   960,   961,   268,
+    2079,   268,   333,  1171,  1172,  1173,   591,   592,  1663,  1174,
+    1175,   408,   409,   410,   411,  1926,  1927,  1635,  1636,  2042,
+    1672,  1924,   601,   334,  1133,   678,   553,   554,   555,   556,
+     591,   592,   830,   268,   557,   412,   413,   704,  1197,   705,
+     706,  1150,   774,  2019,   539,   540,   541,   542,   543,   544,
+     545,   546,   547,   548,   549,   550,   551,   678,   553,   554,
+     555,   556,   335,  1685,  1198,  1653,   557,  -541,   774,  1028,
+    1199,  1144,  1775,   341,   774,  1241,  1275,  1036,   268,   774,
+     774,  1344,  1366,   879,   880,   774,   774,   342,  1374,  1408,
+    1388,   268,   774,  2080,   774,   704,   343,   705,   864,   268,
+    2062,   550,   551,   678,   553,   554,   555,   556,   268,  1505,
+    1550,  1581,   557,   774,   774,   774,  1244,  1669,  1245,   353,
+     722,  1670,   722,   722,  1692,  1573,   344,  1574,   774,   920,
+     921,   922,  1408,  1652,   354,  1653,   722,   542,   543,   544,
+     545,   546,   547,   548,   549,   550,   551,   678,   553,   554,
+     555,   556,  1264,  1267,   351,  1767,   557,  1813,  1268,   774,
+    1828,  1814,   352,  1847,  1829,  1848,  1863,   774,  1893,   774,
+    1814,   722,   735,  1902,  1916,   964,  1948,  1903,  1814,   355,
+     774,  1255,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   772,   553,   554,   555,   556,
+    1278,  1973,   385,   396,   557,  1814,   704,   722,   705,   268,
+    1161,  1981,   998,  1480,  1989,   774,  2003,  1167,   774,   397,
+    1814,  1178,  2045,  1274,   403,  2046,   774,  2047,   268,   774,
+    2048,   774,  1018,  1736,   774,  1737,  1747,  1748,  1025,   268,
+     404,   429,  1320,  1321,   433,  1323,  1324,  1325,   428,  1327,
+    1328,  1329,  1330,  1331,  1332,  1333,  1334,  1335,  1336,  2050,
+    2052,  2073,  2081,   774,  1903,  1814,   774,   136,  2091,   442,
+     268,   268,  2092,   268,   268,   268,   444,   268,   268,   268,
+     268,   268,   268,   268,   268,   268,   268,  2102,  2105,   268,
+     450,  1814,  2106,  1368,  1370,   454,   468,   473,   507,  1348,
+     510,  -190,  -191,  -192,   517,   516,   519,   522,   535,   523,
+     524,   580,  1094,   566,   567,   399,   574,   604,   618,   577,
+     582,  1361,   584,   585,   605,   606,   607,   268,   433,   433,
+     608,   609,   610,   615,   621,   622,   619,  1375,   633,   623,
+     624,   625,   626,   628,   629,   630,   634,   641,   640,   268,
+     649,  1301,   667,   650,   651,   662,   663,  1129,   665,   666,
+     668,   670,   673,   669,  1319,   268,   268,   671,   674,   696,
+    1137,   541,   542,   543,   544,   545,   546,   547,   548,   549,
+     550,   551,   678,   553,   554,   555,   556,  1155,   690,  1420,
+     703,   557,   709,   710,   722,   135,   744,   765,   716,   748,
+     770,   776,   777,  1431,  1432,  1433,   749,   806,   816,   557,
+     836,   833,   835,   862,   871,   872,   875,   268,   878,   882,
+    1668,   883,   913,   885,   911,   914,   916,   924,   929,   933,
+     936,   268,   268,   268,   965,  1349,  1350,   967,   974,   980,
+     984,  1656,   268,   985,   986,  1658,   987,   433,   988,   995,
+     996,   433,  1464,  1368,  1370,   997,  1007,  1012,  1008,  1022,
+     433,  1038,   433,  1024,  1027,   433,  1033,  1035,  1039,  1042,
+    1043,  1044,  1046,  1047,  1048,  1050,  1051,  1518,  1052,  1523,
+     268,  1053,  1054,  1458,  1055,  1056,  1057,  1058,  1059,  1062,
+    1930,  1066,  1091,  1092,  1107,  1100,  1101,  1102,  1116,   348,
+    1122,  1110,  1125,  1138,  1126,  1139,  1130,  1145,  1147,  1156,
+    1164,  1168,  1522,  1165,  1190,  1192,  1207,  1204,  1300,   433,
+    1205,  1533,  1206,  1218,   268,  1537,   544,   545,   546,   547,
+     548,   549,   550,   551,   678,   553,   554,   555,   556,  1219,
+     268,  1220,  1223,   557,  1231,  1233,  1234,  1243,  1246,   268,
+    1240,  1247,  1248,   268,  1444,  1249,  1254,  1252,  1446,  1253,
+    1437,  1270,  1271,  1276,  1277,  1290,  1296,  1450,  1339,  1451,
+    1298,  1303,  1453,  1297,  1306,  1313,  1582,  1583,  1584,  1677,
+    1677,  1309,  1310,  1322,  1589,  1326,  1338,  1352,  -193,  1360,
+    1377,  1378,  1379,  1382,  1389,  1384,  1385,  1383,  1386,  1604,
+    1387,  1396,  1397,  1401,   268,   268,   268,  1400,  1402,  1411,
+    1612,  1802,   268,  1412,  1422,   152,   356,  1413,  1620,  1414,
+    1415,  1651,  1416,  1417,  1418,  1419,  1496,   268,  1423,  1424,
+    1425,  1426,  1427,  1428,  1664,  1429,  1434,  1442,   268,  1448,
+    1447,  1454,  1457,  1459,  1455,  1376,   268,  1463,  1471,   268,
+    1476,  1477,  1489,  1479,  1465,  1482,  1487,   357,   358,   359,
+     360,   361,   362,   363,   364,   365,  1483,  1490,  1493,  1491,
+     366,   367,   368,   369,  1504,  1506,  1510,  1512,   370,   371,
+     372,  1525,  1703,   373,  1526,   374,  1527,  1528,  1530,  1534,
+    1683,  1535,  1536,  1538,  1540,  1541,   375,  1542,  1543,   376,
+    1544,  1545,  1546,  1547,  1548,  1549,   348,  1570,  1576,  1580,
+    1559,  1585,   439,   439,  1586,  1702,  1566,  1592,   268,  1606,
+    1607,  1443,  1621,  1626,  1627,  1590,  1591,  1598,  1632,  1599,
+    1600,  1609,  1601,  1613,  1628,   433,  1633,   406,  1729,  1634,
+    1614,  1615,  1616,   268,  1617,  1660,  1686,  1618,   268,  1623,
+    1666,  1648,  1687,  1638,  1689,  1655,  1641,  1694,  1695,  1679,
+    1742,  1698,  1238,  1697,  1665,  1684,  1701,  1805,   539,   540,
+     541,   542,   543,   544,   545,   546,   547,   548,   549,   550,
+     551,   678,   553,   554,   555,   556,  1735,  1659,  1691,  1704,
+     557,  1711,  1438,  1712,  1713,  1714,  1716,  1715,  1717,  1718,
+    1723,  1118,  1779,  1502,   377,   378,   379,  1730,  1731,  1784,
+    1787,  1733,  1683,  1756,   268,   380,  1752,   268,   268,   381,
+    1757,   382,   108,  1766,  1770,  1788,  1789,  1771,  1796,  1790,
+    1953,  1798,  1799,  1801,  1833,   425,   425,  1806,  -542,  1818,
+     268,  1819,  1696,  1936,   735,  1820,   268,  1826,  1729,  1831,
+    1844,  1832,  1710,  1845,  1673,   268,  1851,  1846,  1795,  1839,
+    1858,  1985,  1860,  1852,  1861,   433,  1870,  1877,   433,  1887,
+    1854,  1804,  1855,  1889,  1878,  1884,  1890,  1872,  1892,  1885,
+    1886,  1894,  1891,  1895,  1900,  1915,   268,  1933,  1938,  1950,
+    1952,  1934,   722,  1274,   722,  1949,  1951,   348,  1954,   268,
+     439,  1960,  -543,  1967,  1963,  1964,  1969,  1971,  1974,  1977,
+    1980,  1978,  1984,  1996,  1982,  1988,  1997,  1683,  1999,  2000,
+    2011,  2016,  2007,   708,  2021,  2063,  2064,  2065,  1622,  2066,
+    2068,  2035,   439,  1998,  2051,  2069,  1759,  1760,  1761,  1762,
+    1763,  1765,  2070,  2074,  2086,   268,  2090,  2098,  2103,  2071,
+    2104,  1859,  2085,  2107,  2093,  2108,  1882,  1508,  2029,  1562,
+    1709,  1908,   743,  1732,  1881,  1532,   113,   124,   125,   126,
+    2020,  1928,  1780,  1650,   132,  1782,  1800,   874,  1785,   268,
+    1678,     0,   724,     0,     0,     0,     0,     0,     0,  1029,
+       0,   268,     0,     0,     0,     0,  1912,     0,     0,     0,
+       0,     0,     0,     0,   268,     0,     0,     0,     0,     0,
+       0,     0,     0,  1901,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,  1909,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   268,     0,     0,     0,  1683,     0,     0,     0,     0,
+       0,     0,     0,   268,     0,     0,     0,     0,  1913,  1935,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   268,     0,     0,   268,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   268,     0,   425,
+       0,   268,     0,     0,     0,     0,  1738,  1739,     0,  1683,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   348,     0,     0,     0,
+       0,     0,     0,  1976,     0,     0,     0,   268,     0,     0,
+       0,     0,  2006,   539,   540,   541,   542,   543,   544,   545,
+     546,   547,   548,   549,   550,   551,   678,   553,   554,   555,
+     556,   268,     0,     0,     0,   557,     0,     0,     0,     0,
+       0,  1261,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   722,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,  1940,  1941,  1942,
+    1943,  1944,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,     0,   268,   268,   268,
+     268,   268,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,  1683,     0,   722,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,  1975,     0,     0,     0,  1979,
+       0,     0,     0,     0,     0,     0,   722,     0,     0,     0,
+     268,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   394,     0,   268,     0,     0,     0,
+       0,     0,     0,  1875,  1683,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,  2012,     0,   433,     0,
+    2014,   420,     0,     0,     0,   430,     0,     0,     0,   435,
+       0,     0,   268,  1337,     0,     0,  2026,     0,     0,   433,
+     433,     0,     0,     0,     0,     0,   447,   448,   449,     0,
+     451,   452,   453,   433,   455,   456,   457,   458,   459,   460,
+     461,     0,   463,   464,   465,   466,     0,     0,     0,   470,
+       0,     0,     0,     0,     0,  1929,     0,     0,     0,     0,
+       0,  2060,  2061,     0,     0,     0,     0,     0,     0,     0,
+    1939,   539,   540,   541,   542,   543,   544,   545,   546,   547,
+     548,   549,   550,   551,   678,   553,   554,   555,   556,  1830,
+     538,     0,     0,   557,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,  2083,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   525,   527,   529,
+     530,   470,     0,     0,     0,     0,  2099,  2101,     0,     0,
+       0,     0,     0,     0,     0,     0,   564,   470,     0,     0,
+    2109,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   579,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   589,   590,     0,     0,     0,
+       0,   590,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   611,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,  2022,  2023,  2024,  2025,
+    2027,     0,     0,     0,   631,   470,     0,     0,     0,   635,
+     636,   637,     0,   639,     0,     0,     0,   642,   643,   644,
+       0,     0,   645,   539,   540,   541,   542,   543,   544,   545,
+     546,   547,   548,   549,   550,   551,   678,   553,   554,   555,
+     556,     0,     0,     0,     0,   557,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,  2067,     0,     0,     0,     0,
+     677,     0,     0,     0,   470,   686,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   697,   698,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   723,     0,     0,   539,   540,
+     541,   542,   543,   544,   545,   546,   547,   548,   549,   550,
+     551,   772,   553,   554,   555,   556,     0,   753,     0,     0,
+     557,   757,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   771,   527,     0,     0,     0,
+     775,     0,     0,   778,   779,   780,   781,   782,   783,   784,
+     785,   786,   787,   788,   789,   790,   791,   792,   793,   794,
+     796,   797,   798,   799,   800,   801,   802,   802,     0,   807,
+     808,     0,   810,     0,     0,     0,     0,     0,     0,   817,
+       0,     0,   821,   822,     0,     0,     0,     0,   802,     0,
+       0,     0,     0,   470,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   837,   838,   839,   840,   841,
+     842,   843,   844,   845,   846,   847,   848,   849,   850,   852,
+     854,   855,   856,   857,   858,     0,   860,   861,     0,     0,
+       0,     0,     0,   868,   869,   870,     0,     0,     0,     0,
+       0,   876,   877,     0,   470,   470,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   152,   356,     0,     0,
+       0,     0,     0,   525,   677,   896,     0,     0,     0,   901,
+     902,   903,   904,   905,   906,   907,   908,   909,     0,     0,
+       0,     0,   915,     0,   917,     0,   918,     0,     0,     0,
+     470,   470,   470,   923,     0,   925,   926,   927,   357,   358,
+     359,   360,   361,   362,   363,   364,   365,     0,     0,     0,
+       0,   366,   367,   368,   369,     0,     0,     0,     0,   370,
+     371,   372,   950,     0,   373,     0,   374,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   470,   375,     0,     0,
+     376,     0,     0,   969,     0,   970,     0,     0,   860,   861,
+       0,     0,     0,     0,     0,   471,     0,   983,     0,     0,
+       0,     0,     0,   989,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   470,  1966,     0,     0,     0,   406,  1004,
+    1005,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   470,     0,  1020,  1021,     0,     0,   470,
+    1026,     0,     0,     0,  1020,     0,     0,     0,     0,     0,
+       0,  1037,     0,     0,  1421,  1040,     0,     0,     0,     0,
+       0,     0,     0,     0,   528,     0,     0,   471,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,  1060,     0,   852,
+       0,  1063,     0,   471,     0,   377,   378,   379,     0,     0,
+       0,     0,     0,     0,     0,     0,   380,     0,     0,     0,
+     381,     0,   382,   108,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   470,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,  1104,     0,     0,     0,     0,   412,   413,
+    1462,     0,     0,     0,     0,  -538,     0,  1495,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   471,     0,     0,     0,     0,     0,     0,   470,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     266,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   266,     0,   351,   352,   353,   354,   355,
-     356,   357,   358,   359,     0,  1868,     0,     0,   360,   361,
-     362,   363,  1314,     0,     0,  1876,   364,   365,   366,     0,
-       0,   367,     0,   368,     0,     0,  1749,     0,     0,  1751,
-     266,     0,     0,     0,   369,  1655,     0,   370,     0,     0,
-     266,     0,     0,     0,     0,  1880,     0,     0,     0,  1902,
+       0,   470,     0,     0,     0,     0,     0,     0,  1143,     0,
+       0,     0,  1149,     0,     0,     0,     0,     0,   470,     0,
+       0,     0,     0,     0,     0,     0,  1162,  1163,     0,     0,
+       0,     0,  1166,     0,     0,     0,     0,     0,     0,     0,
+     471,     0,     0,     0,     0,     0,     0,     0,  1191,     0,
+       0,  1193,     0,   539,   540,   541,   542,   543,   544,   545,
+     546,   547,   548,   549,   550,   551,   678,   553,   554,   555,
+     556,  1208,     0,  1210,  1211,   557,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     266,     0,     0,   266,     0,     0,     0,     0,     0,   419,
-       0,     0,     0,     0,   266,   400,     0,     0,   266,     0,
-       0,     0,     0,     0,     0,     0,  1351,     0,     0,  1655,
+       0,     0,  1229,     0,   539,   540,   541,   542,   543,   544,
+     545,   546,   547,   548,   549,   550,   551,   678,   553,   554,
+     555,   556,   528,   538,     0,  1251,   557,     0,     0,     0,
+       0,     0,  1257,  1258,  1259,  1260,     0,     0,     0,     0,
+    1269,     0,     0,     0,     0,   795,     0,     0,     0,     0,
+       0,     0,   803,   804,  1294,  1295,     0,     0,     0,   470,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,  1973,     0,   342,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,  1943,   266,     0,     0,     0,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,   266,     0,
-     548,     0,   371,   372,   373,     0,  1744,     0,     0,     0,
-       0,     0,   709,   374,     0,     0,     0,   375,     0,   376,
-     108,   529,  1418,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   826,     0,     0,     0,     0,   471,
+     539,   540,   541,   542,   543,   544,   545,   546,   547,   548,
+     549,   550,   551,   678,   553,   554,   555,   556,     0,     0,
+       0,     0,   557,     0,     0,   853,     0,     0,     0,   470,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,  1907,  1908,  1909,  1910,  1911,     0,     0,     0,     0,
-       0,     0,  1645,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   266,   266,   266,   266,   266,     0,
-       0,     0,     0,     0,   709,     0,     0,     0,     0,     0,
-       0,     0,  1655,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   709,     0,     0,  1942,
-       0,     0,     0,  1946,     0,     0,     0,   266,     0,     0,
+       0,     0,     0,     0,     0,  1340,     0,     0,     0,     0,
+     471,   471,     0,     0,     0,  1341,  1342,  1343,     0,     0,
+       0,     0,  1345,  1346,     0,  1347,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,  1354,  1355,     0,
+       0,     0,     0,     0,     0,  1358,  1359,     0,     0,     0,
+       0,     0,  1363,     0,  1364,  1365,   471,   471,   471,     0,
+       0,  1371,  1372,     0,     0,     0,   470,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   388,     0,   266,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,  1655,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   427,     0,     0,   414,     0,
-    1979,     0,   424,     0,  1981,  1933,   429,     0,     0,   266,
-       0,     0,     0,     0,     0,     0,   427,   427,     0,     0,
-    1993,     0,     0,   441,   442,   443,     0,   445,   446,   447,
-     427,   449,   450,   451,   452,   453,   454,   455,     0,   457,
-     458,   459,   460,     0,     0,     0,   464,   530,   531,   532,
-     533,   534,   535,   536,   537,   538,   539,   540,   541,   542,
-     666,   544,   545,   546,   547,  2027,  2028,     0,     0,   548,
-       0,     0,     0,     0,     0,   756,     0,  1594,     0,   530,
-     531,   532,   533,   534,   535,   536,   537,   538,   539,   540,
-     541,   542,   759,   544,   545,   546,   547,     0,     0,     0,
-       0,   548,     0,   692,     0,   693,     0,     0,     0,     0,
-       0,     0,     0,   517,   519,   521,   522,   464,     0,     0,
+       0,     0,     0,   157,   158,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,  1399,     0,     0,
+       0,     0,   471,     0,     0,     0,     0,     0,     0,     0,
+       0,   539,   540,   541,   542,   543,   544,   545,   546,   547,
+     548,   549,   550,   551,   552,   553,   554,   555,   556,     0,
+    1430,     0,     0,   557,     0,     0,     0,     0,     0,   471,
+       0,     0,   470,     0,     0,     0,     0,     0,     0,     0,
+    1445,     0,     0,     0,     0,     0,     0,     0,     0,   471,
+       0,     0,     0,     0,     0,   471,     0,     0,     0,     0,
+       0,  1371,  1372,     0,     0,  1478,  1461,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   555,   464,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   570,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   580,   581,     0,
-       0,     0,     0,   581,  2050,     0,     0,     0,     0,     0,
-       0,     0,     0,   602,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,  2066,  2068,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   622,     0,     0,  2076,
-     625,   626,   627,     0,   629,     0,     0,     0,   632,   633,
-     634,     0,     0,   635,   530,   531,   532,   533,   534,   535,
-     536,   537,   538,   539,   540,   541,   542,   666,   544,   545,
-     546,   547,   465,     0,     0,     0,   548,     0,     0,     0,
-       0,     0,  1707,  1708,     0,     0,     0,     0,     0,     0,
-       0,   665,     0,     0,     0,   464,   674,   533,   534,   535,
-     536,   537,   538,   539,   540,   541,   542,   666,   544,   545,
-     546,   547,   685,   686,     0,     0,   548,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   710,     0,     0,     0,
+    1470,     0,     0,  1475,     0,   419,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   853,     0,  1064,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     520,     0,     0,   465,     0,     0,     0,     0,   740,     0,
-       0,     0,   744,     0,     0,     0,     0,     0,   465,     0,
-       0,     0,     0,     0,     0,     0,   758,   519,     0,     0,
-       0,   762,     0,     0,   765,   766,   767,   768,   769,   770,
-     771,   772,   773,   774,   775,   776,   777,   778,   779,   780,
-     781,   783,   784,   785,   786,   787,   788,   789,   789,     0,
-     794,   795,     0,   797,     0,     0,     0,     0,     0,     0,
-     804,     0,   807,     0,     0,     0,     0,   789,     0,     0,
-       0,     0,   464,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,  1412,   821,   822,   823,   824,   825,   826,   827,
-     828,   829,   830,   831,   832,   833,   834,   836,   838,   839,
-     840,   841,   842,     0,   844,   845,     0,     0,     0,     0,
-       0,   852,   853,   854,     0,     0,  1842,     0,     0,   860,
-     861,     0,   464,   464,     0,     0,     0,     0,     0,     0,
-       0,   465,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   517,   665,   880,     0,     0,     0,   885,   886,   887,
-     888,   889,   890,   891,   892,   893,   696,     0,     0,     0,
-     899,     0,   901,     0,   902,     0,     0,     0,   464,   464,
-     464,   907,     0,   909,   910,   911,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,  1896,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   933,
-       0,  1906,     0,   520,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   464,     0,     0,     0,     0,   950,     0,
-     951,     0,     0,   844,   845,     0,   782,     0,     0,     0,
-       0,     0,   964,   790,   791,     0,     0,     0,   970,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   464,     0,
-       0,     0,     0,   811,   985,   986,     0,     0,   465,     0,
-       0,     0,     0,     0,     0,     0,     0,   464,     0,  1000,
-    1001,     0,     0,   464,  1006,     0,     0,     0,  1000,     0,
-       0,     0,     0,   837,     0,  1017,     0,     0,     0,  1020,
-     530,   531,   532,   533,   534,   535,   536,   537,   538,   539,
-     540,   541,   542,   666,   544,   545,   546,   547,   465,   465,
-       0,  1040,   548,   836,  1413,  1043,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,  1989,  1990,  1991,
-    1992,  1994,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   464,     0,     0,
-       0,     0,     0,     0,   465,   465,   465,  1084,     0,     0,
-       0,     0,     0,     0,     0,     0,   530,   531,   532,   533,
-     534,   535,   536,   537,   538,   539,   540,   541,   542,   666,
-     544,   545,   546,   547,     0,     0,  2034,     0,   548,   464,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   465,
-       0,     0,   464,     0,     0,     0,     0,     0,     0,  1120,
-       0,     0,     0,  1126,     0,     0,     0,     0,     0,   464,
-       0,     0,     0,     0,     0,     0,     0,  1139,  1140,     0,
-       0,     0,     0,  1143,   465,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,  1168,
-       0,     0,  1170,   465,     0,     0,     0,     0,     0,   465,
-       0,   711,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,  1185,     0,  1187,  1188,     0,     0,     0,     0,     0,
+    1497,     0,     0,  1500,   470,  1503,     0,     0,     0,     0,
+       0,     0,     0,  1511,     0,  1513,     0,  1511,  1517,   471,
+       0,     0,     0,     0,  1602,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   476,   477,   478,   479,   480,
+     481,   482,   483,   484,   485,   486,   487,   488,   489,   490,
+     491,   492,   493,   494,   495,   496,   497,   498,   501,   502,
+     503,   504,   505,   506,   471,   508,   509,     0,     0,     0,
+       0,     0,   512,   513,     0,     0,     0,   471,     0,     0,
+       0,     0,     0,   520,   521,     0,     0,     0,     0,     0,
+       0,  1588,     0,     0,   471,     0,     0,     0,  1595,  1596,
+    1597,     0,     0,     0,     0,     0,     0,  1603,     0,  1605,
+       0,     0,     0,     0,     0,     0,  1608,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   470,
+       0,     0,     0,     0,  1624,     0,     0,     0,     0,     0,
+       0,     0,  1629,  1630,  1631,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,  1642,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,  1654,   539,   540,   541,   542,   543,
+     544,   545,   546,   547,   548,   549,   550,   551,   678,   553,
+     554,   555,   556,     0,     0,     0,     0,   557,     0,     0,
+    1671,     0,     0,     0,     0,     0,  1680,  1681,   646,   647,
+     648,   538,     0,     0,   652,   653,   654,   655,   656,   657,
+     658,     0,   659,     0,     0,     0,   660,   661,     0,     0,
+     664,     0,     0,     0,     0,   471,     0,     0,  1707,     0,
+       0,     0,     0,   676,   539,   540,   541,   542,   543,   544,
+     545,   546,   547,   548,   549,   550,   551,   678,   553,   554,
+     555,   556,     0,     0,     0,     0,   557,     0,     0,     0,
+       0,     0,     0,  1719,  1720,  1721,     0,     0,     0,     0,
+       0,     0,     0,     0,  1722,   471,     0,     0,     0,  1725,
+    1726,  1727,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,  1734,     0,     0,     0,     0,   470,   470,  1740,
+       0,  1741,     0,     0,     0,     0,     0,  1749,  1750,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,  1206,     0,     0,     0,     0,     0,     0,   837,
-       0,  1044,     0,     0,  1238,     0,   152,   350,     0,     0,
-       0,     0,     0,  1228,     0,     0,     0,     0,     0,     0,
-    1234,  1235,  1236,  1237,     0,     0,     0,     0,  1246,     0,
-       0,     0,     0,   465,     0,     0,     0,     0,     0,     0,
-       0,     0,  1271,  1272,     0,  1312,   464,     0,   351,   352,
-     353,   354,   355,   356,   357,   358,   359,     0,     0,     0,
-       0,   360,   361,   362,   363,     0,     0,     0,     0,   364,
-     365,   366,     0,     0,   367,   465,   368,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   369,   465,     0,
-     370,     0,     0,     0,  1396,     0,   464,     0,     0,     0,
-       0,     0,     0,     0,     0,   465,     0,     0,     0,     0,
-       0,     0,  1315,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,  1316,  1317,  1318,     0,     0,     0,   400,  1320,
-    1321,     0,  1322,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,  1329,  1330,     0,     0,     0,     0,     0,     0,
-    1333,  1334,     0,     0,     0,     0,     0,  1338,  1339,  1340,
-       0,     0,     0,     0,     0,  1346,  1347,     0,     0,     0,
-     464,   530,   531,   532,   533,   534,   535,   536,   537,   538,
-     539,   540,   541,   542,   666,   544,   545,   546,   547,     0,
-       0,   157,   158,   548,     0,   371,   372,   373,     0,     0,
-       0,  1374,     0,     0,   695,     0,   374,     0,     0,     0,
-     375,     0,   376,   108,   530,   531,   532,   533,   534,   535,
-     536,   537,   538,   539,   540,   541,   542,   666,   544,   545,
-     546,   547,   465,     0,  1405,     0,   548,     0,   406,   407,
-       0,     0,     0,     0,     0,  -529,   464,  1470,     0,     0,
-       0,     0,     0,     0,  1420,   530,   531,   532,   533,   534,
-     535,   536,   537,   538,   539,   540,   541,   542,   666,   544,
-     545,   546,   547,     0,     0,  1346,  1347,   548,  1437,     0,
-    1436,     0,   465,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,  1445,     0,     0,  1450,   805,     0,
-       0,     0,     0,   413,   530,   531,   532,   533,   534,   535,
-     536,   537,   538,   539,   540,   541,   542,   666,   544,   545,
-     546,   547,     0,     0,  1472,     0,   548,  1475,  1476,     0,
-       0,     0,     0,     0,     0,  1483,     0,  1485,     0,  1483,
-    1489,     0,     0,     0,     0,   849,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   465,     0,     0,     0,
-       0,     0,     0,   470,   471,   472,   473,   474,   475,   476,
-     477,   478,   479,   480,   481,   482,   483,   484,   485,   486,
-     487,   488,   489,   490,   491,   492,   495,   496,   497,   498,
-     499,   500,     0,   502,   503,     0,     0,     0,     0,     0,
-     506,   507,     0,     0,     0,     0,     0,     0,     0,     0,
-     512,   513,     0,  1560,     0,     0,     0,     0,     0,     0,
-    1567,  1568,  1569,     0,     0,     0,     0,     0,     0,  1575,
-       0,  1577,   465,     0,     0,     0,     0,     0,  1580,     0,
+       0,     0,     0,     0,     0,     0,   470,     0,     0,     0,
+    1768,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,  1778,     0,     0,  1781,     0,     0,     0,
+    1783,     0,   471,     0,     0,     0,     0,     0,     0,  1726,
+    1727,     0,  1792,     0,     0,     0,     0,     0,     0,     0,
+    1797,  1657,     0,     0,     0,   834,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,  1810,     0,     0,     0,
+       0,  1816,  1817,     0,     0,     0,     0,     0,     0,   707,
+       0,     0,     0,     0,  1821,  1661,     0,  1822,  1821,   539,
+     540,   541,   542,   543,   544,   545,   546,   547,   548,   549,
+     550,   551,   772,   553,   554,   555,   556,     0,   471,     0,
+    1667,   557,     0,     0,     0,     0,     0,  1843,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   464,     0,     0,     0,     0,  1596,     0,     0,     0,
-       0,     0,     0,     0,  1601,  1602,  1603,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,  1614,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,  1626,     0,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,  1643,     0,     0,     0,     0,     0,  1652,  1653,
-     636,   637,   638,     0,     0,     0,   642,   643,   644,   645,
-     646,   647,   648,     0,   649,     0,     0,     0,   650,   651,
-       0,     0,   654,     0,     0,     0,     0,  1676,     0,     0,
-       0,     0,     0,     0,     0,   664,  1047,  1048,  1049,  1050,
-    1051,  1052,  1053,  1054,  1055,  1056,  1057,     0,  1059,  1060,
-    1061,  1062,     0,  1064,  1065,  1066,  1067,     0,     0,     0,
-       0,     0,  1688,  1689,  1690,     0,     0,  1077,     0,  1079,
-       0,     0,     0,  1691,     0,     0,     0,  1086,  1694,  1695,
-    1696,  1090,  1091,     0,     0,     0,     0,     0,     0,     0,
-    1102,  1703,     0,     0,     0,     0,   464,   464,  1709,     0,
-    1710,     0,     0,     0,     0,     0,  1718,  1719,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   465,     0,     0,
-       0,     0,     0,     0,     0,   464,     0,     0,     0,  1737,
+       0,     0,     0,  1853,     0,     0,     0,     0,     0,     0,
+       0,     0,  1862,     0,     0,     0,     0,     0,     0,     0,
+       0,   527,     0,     0,     0,     0,     0,     0,     0,     0,
+    1873,  1874,     0,     0,   470,     0,     0,     0,     0,     0,
+       0,     0,     0,   818,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,  1769,     0,     0,     0,     0,     0,     0,
+     471,     0,     0,     0,     0,     0,     0,     0,  1898,  1899,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,  1747,     0,     0,  1750,     0,     0,     0,  1752,
-       0,     0,     0,     0,     0,     0,     0,     0,  1695,  1696,
-       0,  1761,     0,     0,     0,     0,     0,     0,     0,  1766,
-       0,     0,     0,     0,     0,   819,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,  1779,     0,     0,     0,     0,
-    1785,  1786,     0,     0,     0,  1191,  1193,  1194,  1453,     0,
-    1788,  1198,  1199,  1789,  1788,  1202,  1203,  1204,  1205,     0,
-    1207,     0,     0,  1677,     0,  1213,     0,     0,     0,     0,
-       0,     0,     0,     0,  1574,     0,     0,     0,     0,     0,
-       0,     0,     0,  1810,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,  1820,
-       0,     0,     0,     0,     0,     0,     0,     0,  1829,     0,
-       0,     0,     0,     0,     0,     0,     0,   519,     0,     0,
-       0,     0,     0,     0,     0,     0,  1840,  1841,     0,     0,
-     464,     0,   465,   465,     0,     0,     0,     0,     0,     0,
-       0,  1292,  1293,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,  1911,     0,     0,  1914,
+       0,     0,     0,   865,  1917,     0,     0,  1919,     0,     0,
+       0,     0,     0,     0,     0,     0,   470,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   465,     0,     0,  1865,  1866,     0,     0,     0,     0,
+       0,   470,     0,     0,     0,     0,     0,     0,     0,  1945,
+       0,   539,   540,   541,   542,   543,   544,   545,   546,   547,
+     548,   549,   550,   551,   678,   553,   554,   555,   556,     0,
+       0,     0,     0,   557,  1956,     0,     0,     0,     0,     0,
+    1961,     0,     0,  1962,     0,   539,   540,   541,   542,   543,
+     544,   545,   546,   547,   548,   549,   550,   551,   678,   553,
+     554,   555,   556,     0,     0,   471,     0,   557,     0,  1983,
+     539,   540,   541,   542,   543,   544,   545,   546,   547,   548,
+     549,   550,   551,   678,   553,   554,   555,   556,     0,     0,
+       0,     0,   557,     0,  2001,  2002,     0,     0,     0,     0,
+    1119,     0,     0,     0,     0,     0,  2008,  2009,     0,  2010,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-    1878,     0,     0,  1881,     0,     0,     0,     0,  1884,     0,
-       0,  1886,     0,     0,     0,     0,     0,     0,     0,  1629,
-     464,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   464,     0,     0,     0,     0,
-       0,     0,     0,  1912,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,  1348,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,  1923,     0,
-       0,     0,     0,     0,  1928,     0,     0,  1929,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,  1633,     0,     0,     0,
-     548,     0,     0,  1950,   530,   531,   532,   533,   534,   535,
-     536,   537,   538,   539,   540,   541,   542,   666,   544,   545,
-     546,   547,     0,   520,     0,     0,   548,     0,  1968,  1969,
-       0,     0,     0,  1097,     0,     0,   465,     0,     0,     0,
-    1975,  1976,     0,  1977,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,  1985,     0,  1639,     0,
-       0,   464,   464,   464,   464,   464,  1113,     0,     0,     0,
-       0,  1785,     0,     0,     0,  2001,     0,     0,     0,     0,
+       0,     0,  2018,     0,     0,     0,     0,   470,   470,   470,
+     470,   470,     0,     0,  1136,     0,     0,  1816,     0,     0,
+       0,  2034,     0,   539,   540,   541,   542,   543,   544,   545,
+     546,   547,   548,   549,   550,   551,   678,   553,   554,   555,
+     556,     0,     0,     0,  1708,   557,     0,     0,  2054,     0,
+       0,     0,     0,  2057,  2058,  2059,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   470,     0,  1067,  1068,
+    1069,  1070,  1071,  1072,  1073,  1074,  1075,  1076,  1077,     0,
+    1079,  1080,  1081,  1082,     0,  1084,  1085,  1086,  1087,     0,
+       0,  1850,     0,     0,  2087,  2088,  2089,     0,     0,  1097,
+       0,  1099,     0,     0,     0,     0,     0,     0,     0,  1106,
+       0,     0,     0,   471,   471,  1112,  1113,     0,     0,     0,
+       0,     0,     0,     0,  1124,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,  1459,     0,     0,     0,     0,     0,     0,
-       0,     0,  2021,     0,     0,     0,   465,  2024,  2025,  2026,
+       0,     0,   471,   189,   152,   356,     0,   405,     0,     0,
+     190,   191,   192,     0,     0,   193,   194,   195,   196,   197,
+     198,   199,   200,   201,   202,   203,   204,   205,   206,   207,
+     208,   209,   392,   211,   212,   213,   214,   215,   216,     0,
+       0,     0,     0,     0,     0,  1312,   357,   358,   359,   360,
+     361,   362,   363,   364,   365,   222,   223,   224,   225,   366,
+     367,   368,   369,   226,     0,     0,     0,   370,   371,   372,
+       0,     0,   373,     0,   374,   228,   229,   230,     0,     0,
+       0,     0,     0,   231,    21,   375,   232,     0,   376,     0,
+       0,  1214,  1216,  1217,     0,     0,     0,  1221,  1222,     0,
+       0,  1225,  1226,  1227,  1228,     0,  1230,     0,     0,     0,
+       0,  1236,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   406,     0,     0,     0,
+       0,     0,     0,     0,  1362,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   528,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     464,   465,     0,     0,     0,     0,     0,     0,  1491,   530,
-     531,   532,   533,   534,   535,   536,   537,   538,   539,   540,
-     541,   542,   666,   544,   545,   546,   547,     0,  2054,  2055,
-    2056,   548,     0,     0,     0,     0,  1523,  1524,  1525,  1526,
-    1527,     0,     0,     0,     0,  1532,  1533,     0,     0,  1535,
-       0,  1537,     0,     0,     0,  1541,     0,     0,  1543,     0,
+     471,   539,   540,   541,   542,   543,   544,   545,   546,   547,
+     548,   549,   550,   551,   678,   553,   554,   555,   556,     0,
+       0,     0,     0,   557,     0,   407,     0,     0,     0,     0,
+    1317,  1318,   241,   377,   378,   379,   242,     0,     0,     0,
+       0,   244,   245,   246,   380,   247,   248,   249,   381,     0,
+     382,   108,   408,   409,   410,   411,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   250,   393,     0,
+       0,     0,   471,     0,   252,     0,   412,   413,     0,   414,
+       0,   415,   189,   152,     0,   416,   255,   471,     0,   190,
+     191,   192,     0,     0,   193,   194,   195,   196,   197,   198,
+     199,   200,   201,   202,   203,   204,   205,   206,   207,   208,
+     209,   392,   211,   212,   213,   214,   215,   216,     0,     0,
+       0,     0,     0,     0,     0,     0,  1373,  1485,  1486,     0,
+       0,     0,     0,     0,   222,   223,   224,   225,     0,     0,
+       0,     0,   226,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   228,   229,   230,     0,     0,     0,
+       0,     0,   231,    21,     0,   232,     0,     0,     0,     0,
+     189,   152,     0,     0,     0,     0,     0,   190,   191,   192,
+       0,     0,   193,   194,   195,   196,   197,   198,   199,   200,
+     201,   202,   203,   204,   205,   206,   207,   208,   209,   392,
+     211,   212,   213,   214,   215,   216,     0,     0,  1567,     0,
+       0,     0,     0,   471,   471,   471,   471,   471,  1575,     0,
+       0,     0,   222,   223,   224,   225,     0,     0,     0,     0,
+     226,     0,  1876,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   228,   229,   230,     0,     0,     0,     0,     0,
+     231,    21,     0,   232,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,  1484,     0,     0,     0,     0,
+       0,   241,   471,     0,     0,   242,     0,     0,     0,     0,
+     244,   245,   246,     0,   247,   248,   249,     0,     0,     0,
+     108,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,  1519,     0,     0,     0,   250,   393,     0,     0,
+       0,     0,     0,   252,     0,     0,     0,     0,   337,     0,
+       0,     0,   578,     0,     0,   255,     0,     0,     0,     0,
+    1551,  1552,  1553,  1554,  1555,     0,     0,     0,     0,  1560,
+    1561,     0,     0,  1563,     0,  1565,     0,     0,     0,  1569,
+       0,     0,  1571,     0,     0,     0,     0,     0,     0,   241,
+       0,     0,     0,   242,  1579,     0,     0,     0,   244,   245,
+     246,  1705,   247,   248,   249,     0,     0,     0,   108,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-    1551,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   530,   531,   532,   533,
-     534,   535,   536,   537,   538,   539,   540,   541,   542,   666,
-     544,   545,   546,   547,     0,     0,     0,     0,   548,     0,
-       0,     0,     0,  1287,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   465,   465,   465,
-     465,   465,     0,     0,     0,     0,     0,     0,     0,  1609,
-       0,  1612,     0,     0,     0,  1619,     0,  1621,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,  1646,     0,     0,     0,     0,   465,     0,     0,   189,
-       6,   350,     0,     0,     0,     0,   190,   191,   192,     0,
-    1337,   193,   194,   195,   196,   197,   198,   199,   200,   201,
+       0,     0,     0,     0,   596,   597,     0,     0,     0,     0,
+       0,   252,     0,     0,     0,     0,   598,     0,     0,     0,
+     299,     0,     0,   255,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,  1888,     0,
+       0,     0,     0,  1637,     0,  1640,     0,     0,     0,  1647,
+       0,  1649,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,  1674,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   189,
+       6,   356,     0,     0,     0,     0,   190,   191,   192,     0,
+       0,   193,   194,   195,   196,   197,   198,   199,   200,   201,
      202,   203,   204,   205,   206,   207,   208,   209,   210,   211,
      212,   213,   214,   215,   216,   217,   218,   219,   220,   221,
-       0,     0,  1492,   352,   353,   354,   355,   356,   357,   358,
-     359,   222,   223,   224,   225,   360,   361,   362,   363,   226,
-     227,     0,     0,   364,   365,   366,     0,     0,   367,     0,
-     368,   228,   229,   230,     0,     0,     0,     0,  1697,   231,
-      21,   369,   232,     0,   370,     0,     0,   233,     0,     0,
+    1995,     0,  1520,   358,   359,   360,   361,   362,   363,   364,
+     365,   222,   223,   224,   225,   366,   367,   368,   369,   226,
+     227,     0,     0,   370,   371,   372,     0,     0,   373,     0,
+     374,   228,   229,   230,     0,  1728,     0,     0,     0,   231,
+      21,   375,   232,     0,   376,     0,     0,   233,     0,     0,
      234,     0,     0,   235,     0,   236,     0,     0,     0,     0,
-       0,     0,    37,     0,     0,     0,    41,     0,     0,     0,
-       0,     0,     0,     0,     0,   237,     0,    50,     0,     0,
-     238,     0,   239,     0,     0,     0,     0,     0,     0,    60,
+       0,     0,    37,     0,     0,     0,   237,     0,     0,     0,
+       0,     0,     0,     0,     0,   238,     0,    50,     0,     0,
+     239,     0,   240,     0,     0,     0,     0,     0,     0,    60,
       61,    62,    63,    64,     0,     0,    66,    67,    68,    69,
-      70,     0,     0,     0,    74,     0,     0,    77,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,  1460,  1461,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,  1776,     0,
-       0,  1777,     0,     0,     0,     0,     0,     0,   240,   371,
-     372,   373,   241,   242,     0,     0,     0,   243,   244,   245,
-     374,   246,   247,   248,   375,     0,   376,   108,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,  1802,
-    1803,     0,  1805,   249,   250,  1738,     0,     0,     0,     0,
-     251,     0,     0,     0,     0,   332,     0,     0,     0,  1493,
-       0,  1539,   254,     0,     0,     0,     0,     0,     0,     0,
-       0,  1547,     0,     0,     0,   530,   531,   532,   533,   534,
-     535,   536,   537,   538,   539,   540,   541,   542,   666,   544,
-     545,   546,   547,     0,     0,     0,     0,   548,     0,   912,
-       0,  1846,  1847,     0,   189,     6,   350,   873,     0,     0,
-       0,   190,   191,   192,     0,     0,   193,   194,   195,   196,
-     197,   198,   199,   200,   201,   202,   203,   204,   205,   206,
-     207,   208,   209,   210,   211,   212,   213,   214,   215,   216,
-     217,   218,   219,   220,   221,  1877,     0,   351,   352,   353,
-     354,   355,   356,   357,   358,   359,   222,   223,   224,   225,
-     360,   361,   362,   363,   226,   227,     0,     0,   364,   365,
-     366,     0,     0,   367,     0,   368,   228,   229,   230,     0,
-       0,     0,     0,     0,   231,    21,   369,   232,     0,   370,
-       0,     0,   233,     0,     0,   234,     0,     0,   235,     0,
-     236,     0,     0,     0,     0,     0,     0,    37,     0,     0,
-       0,    41,     0,     0,     0,     0,     0,     0,     0,     0,
-     237,  1674,    50,     0,     0,   238,     0,   239,     0,     0,
-       0,     0,     0,     0,    60,    61,    62,    63,    64,     0,
-       0,    66,    67,    68,    69,    70,  1817,     0,     0,    74,
-       0,     0,    77,     0,     0,   530,   531,   532,   533,   534,
-     535,   536,   537,   538,   539,   540,   541,   542,   666,   544,
-     545,   546,   547,     0,     0,     0,     0,   548,     0,  1843,
+      70,     0,     0,     0,    74,     0,     0,    77,   539,   540,
+     541,   542,   543,   544,   545,   546,   547,   548,   549,   550,
+     551,   678,   553,   554,   555,   556,     0,     0,     0,     0,
+     557,     0,     0,     0,     0,  1807,     0,     0,  1808,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   241,   377,
+     378,   379,   242,   243,     0,     0,     0,   244,   245,   246,
+     380,   247,   248,   249,   381,     0,   382,   108,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,  1835,
+    1836,     0,  1838,   250,   251,  2041,     0,     0,     0,     0,
+     252,     0,     0,     0,     0,   337,     0,     0,     0,  1521,
+       0,     0,   255,     0,     0,     0,     0,     0,     0,     0,
+     539,   540,   541,   542,   543,   544,   545,   546,   547,   548,
+     549,   550,   551,   678,   553,   554,   555,   556,     0,     0,
+       0,     0,   557,     0,     0,     0,     0,     0,     0,     0,
+       0,  1879,  1880,     0,     0,   189,     6,   356,     0,     0,
+       0,     0,   190,   191,   192,     0,     0,   193,   194,   195,
+     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,
+     206,   207,   208,   209,   210,   211,   212,   213,   214,   215,
+     216,   217,   218,   219,   220,   221,     0,  1910,   357,   358,
+     359,   360,   361,   362,   363,   364,   365,   222,   223,   224,
+     225,   366,   367,   368,   369,   226,   227,     0,     0,   370,
+     371,   372,     0,     0,   373,     0,   374,   228,   229,   230,
+       0,     0,     0,     0,     0,   231,    21,   375,   232,     0,
+     376,     0,     0,   233,     0,     0,   234,     0,     0,   235,
+       0,   236,     0,     0,     0,     0,     0,     0,    37,     0,
+       0,     0,   237,     0,     0,     0,     0,     0,     0,     0,
+       0,   238,     0,    50,     0,     0,   239,     0,   240,     0,
+       0,     0,     0,     0,     0,    60,    61,    62,    63,    64,
+       0,     0,    66,    67,    68,    69,    70,     0,     0,     0,
+      74,     0,     0,    77,     0,   539,   540,   541,   542,   543,
+     544,   545,   546,   547,   548,   549,   550,   551,   678,   553,
+     554,   555,   556,     0,     0,     0,     0,   557,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   240,   371,   372,   373,   241,   242,     0,
-       0,     0,   243,   244,   245,   374,   246,   247,   248,   375,
-    1855,   376,   108,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   249,   250,
-       0,     0,     0,     0,     0,   251,     0,     0,     0,     0,
-     332,     0,     0,     0,   253,     0,     0,   254,     0,     0,
+       0,     0,     0,     0,   241,   377,   378,   379,   242,   243,
+       0,     0,     0,   244,   245,   246,   380,   247,   248,   249,
+     381,     0,   382,   108,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   250,
+     251,     0,     0,     0,     0,     0,   252,     0,     0,     0,
+       0,   337,     0,     0,     0,   254,     0,     0,   255,   539,
+     540,   541,   542,   543,   544,   545,   546,   547,   548,   549,
+     550,   551,   678,   553,   554,   555,   556,   189,     6,   336,
+       0,   557,     0,     0,   190,   191,   192,   769,  2076,   193,
+     194,   195,   196,   197,   198,   199,   200,   201,   202,   203,
+     204,   205,   206,   207,   208,   209,   210,   211,   212,   213,
+     214,   215,   216,   217,   218,   219,   220,   221,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   222,
+     223,   224,   225,     0,     0,     0,     0,   226,   227,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   228,
+     229,   230,     0,     0,     7,     8,     0,   231,    21,     0,
+     232,     0,     0,     0,     0,   233,     0,     0,   234,     0,
+       0,   235,     0,   236,     0,     0,     0,     0,     0,     0,
+      37,     0,     0,     0,   237,     0,     0,     0,     0,     0,
+       0,     0,     0,   238,     0,    50,     0,     0,   239,     0,
+     240,     0,     0,     0,     0,     0,     0,    60,    61,    62,
+      63,    64,     0,     0,    66,    67,    68,    69,    70,     0,
+       0,     0,    74,     0,     0,    77,     0,     0,     0,     0,
+       0,     0,    24,    25,    26,    27,    28,    29,    30,    31,
+      32,    33,    34,    35,    36,     0,     0,     0,    38,    39,
+      40,    41,     0,     0,    43,     0,     0,     0,     0,     0,
+     717,    49,     0,     0,    51,   718,   241,   719,   720,     0,
+     242,   243,     0,     0,     0,   244,   245,   246,     0,   247,
+     248,   249,     0,     0,     0,   108,    71,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   189,   152,   350,     0,   399,
-       0,     0,   190,   191,   192,     0,  2043,   193,   194,   195,
-     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,
-     206,   207,   208,   209,   386,   211,   212,   213,   214,   215,
-     216,     0,     0,     0,     0,     0,     0,     0,   351,   352,
-     353,   354,   355,   356,   357,   358,   359,   222,   223,   224,
-     225,   360,   361,   362,   363,   226,     0,     0,     0,   364,
-     365,   366,     0,     0,   367,     0,   368,   228,   229,   230,
-       0,     0,     0,     0,     0,   231,    21,   369,   232,     0,
-     370,     0,     0,     0,     0,     0,   530,   531,   532,   533,
-     534,   535,   536,   537,   538,   539,   540,   541,   542,   666,
-     544,   545,   546,   547,     0,     0,     0,     0,   548,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   400,   530,
-     531,   532,   533,   534,   535,   536,   537,   538,   539,   540,
-     541,   542,   666,   544,   545,   546,   547,     0,     0,     0,
-       0,   548,     0,     0,     0,     0,     0,     0,     0,     0,
-     530,   531,   532,   533,   534,   535,   536,   537,   538,   539,
-     540,   541,   542,   666,   544,   545,   546,   547,     0,     0,
-       0,     0,   548,  1962,     0,     0,     0,   401,     0,     0,
-       0,     0,     0,     0,   240,   371,   372,   373,   241,     0,
-       0,     0,     0,   243,   244,   245,   374,   246,   247,   248,
-     375,     0,   376,   108,   402,   403,   404,   405,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   249,
-     387,     0,     0,     0,     0,     0,   251,     0,   406,   407,
-       0,   408,     0,   409,   189,     6,   331,   410,   254,     0,
-       0,   190,   191,   192,     0,     0,   193,   194,   195,   196,
+       0,   250,   251,     0,     0,     0,     0,     0,   252,     0,
+      85,    86,    87,   337,   189,     6,     0,   338,     0,   632,
+     255,   190,   191,   192,     0,     0,   193,   194,   195,   196,
      197,   198,   199,   200,   201,   202,   203,   204,   205,   206,
      207,   208,   209,   210,   211,   212,   213,   214,   215,   216,
      217,   218,   219,   220,   221,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,   222,   223,   224,   225,
        0,     0,     0,     0,   226,   227,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   228,   229,   230,     0,
-       0,     0,     0,     0,   231,    21,     0,   232,     0,     0,
+       0,     0,     0,     0,     0,   897,   228,   229,   230,     0,
+       0,     7,     8,     0,   231,    21,     0,   232,     0,     0,
        0,     0,   233,     0,     0,   234,     0,     0,   235,     0,
      236,     0,     0,     0,     0,     0,     0,    37,     0,     0,
-       0,    41,     0,     0,     0,     0,     0,     0,     0,     0,
-     237,     0,    50,     0,     0,   238,     0,   239,     0,     0,
+       0,   237,     0,     0,     0,     0,     0,     0,     0,     0,
+     238,     0,    50,     0,     0,   239,     0,   240,     0,     0,
        0,     0,     0,     0,    60,    61,    62,    63,    64,     0,
        0,    66,    67,    68,    69,    70,     0,     0,     0,    74,
-       0,     0,    77,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,     0,     0,     0,
-    2008,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   240,     0,     0,     0,   241,   242,     0,
-       0,     0,   243,   244,   245,     0,   246,   247,   248,     0,
-       0,     0,   108,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   249,   250,
-       0,     0,     0,     0,     0,   251,     0,     0,     0,     0,
-     332,   189,     6,  1583,   253,     0,     0,   254,   190,   191,
+       0,     0,    77,     0,     0,     0,     0,     0,     0,    24,
+      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
+      35,    36,     0,     0,     0,    38,    39,    40,    41,     0,
+       0,    43,     0,     0,     0,     0,     0,   717,    49,     0,
+       0,    51,   718,   241,   719,   720,     0,   242,   243,     0,
+       0,     0,   244,   245,   246,     0,   247,   248,   249,     0,
+       0,     0,   108,    71,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   250,   469,
+       0,     0,     0,     0,     0,   252,     0,    85,    86,    87,
+     337,   189,     6,  1611,     0,   531,     0,   255,   190,   191,
      192,     0,     0,   193,   194,   195,   196,   197,   198,   199,
      200,   201,   202,   203,   204,   205,   206,   207,   208,   209,
      210,   211,   212,   213,   214,   215,   216,   217,   218,   219,
      220,   221,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,   222,   223,   224,   225,     0,     0,     0,
        0,   226,   227,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   228,   229,   230,     0,     0,     0,     0,
+       0,     0,   919,   228,   229,   230,     0,     0,     7,     8,
        0,   231,    21,     0,   232,     0,     0,     0,     0,   233,
        0,     0,   234,     0,     0,   235,     0,   236,     0,     0,
-       0,     0,     0,     0,    37,     0,     0,     0,    41,     0,
-       0,     0,     0,     0,     0,     0,     0,   237,     0,    50,
-       0,     0,   238,     0,   239,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    37,     0,     0,     0,   237,     0,
+       0,     0,     0,     0,     0,     0,     0,   238,     0,    50,
+       0,     0,   239,     0,   240,     0,     0,     0,     0,     0,
        0,    60,    61,    62,    63,    64,     0,     0,    66,    67,
       68,    69,    70,     0,     0,     0,    74,     0,     0,    77,
-     530,   531,   532,   533,   534,   535,   536,   537,   538,   539,
-     540,   541,   542,   666,   544,   545,   546,   547,     0,     0,
-       0,     0,   548,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     240,     0,     0,     0,   241,   242,     0,     0,     0,   243,
-     244,   245,     0,   246,   247,   248,     0,     0,     0,   108,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   249,   250,     0,     0,     0,
-       0,     0,   251,     0,     0,     0,     0,   332,   189,     6,
-       0,   253,     0,     0,   254,   190,   191,   192,     0,     0,
+       0,     0,     0,     0,     0,     0,    24,    25,    26,    27,
+      28,    29,    30,    31,    32,    33,    34,    35,    36,     0,
+       0,     0,    38,    39,    40,    41,     0,     0,    43,     0,
+       0,     0,     0,     0,   717,    49,     0,     0,    51,   718,
+     241,   719,   720,     0,   242,   243,     0,     0,     0,   244,
+     245,   246,     0,   247,   248,   249,     0,     0,     0,   108,
+      71,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   250,   251,     0,     0,     0,
+       0,     0,   252,     0,    85,    86,    87,   337,   189,     6,
+       0,   254,     0,     0,   255,   190,   191,   192,     0,     0,
      193,   194,   195,   196,   197,   198,   199,   200,   201,   202,
      203,   204,   205,   206,   207,   208,   209,   210,   211,   212,
      213,   214,   215,   216,   217,   218,   219,   220,   221,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
      222,   223,   224,   225,     0,     0,     0,     0,   226,   227,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   966,
      228,   229,   230,     0,     0,     7,     8,     0,   231,    21,
        0,   232,     0,     0,     0,     0,   233,     0,     0,   234,
        0,     0,   235,     0,   236,     0,     0,     0,     0,     0,
-       0,    37,     0,     0,     0,    41,     0,     0,     0,     0,
-       0,     0,     0,     0,   237,     0,    50,     0,     0,   238,
-       0,   239,     0,     0,     0,     0,     0,     0,    60,    61,
+       0,    37,     0,     0,     0,   237,     0,     0,     0,     0,
+       0,     0,     0,     0,   238,     0,    50,     0,     0,   239,
+       0,   240,     0,     0,     0,     0,     0,     0,    60,    61,
       62,    63,    64,     0,     0,    66,    67,    68,    69,    70,
        0,     0,     0,    74,     0,     0,    77,     0,     0,     0,
        0,     0,     0,    24,    25,    26,    27,    28,    29,    30,
       31,    32,    33,    34,    35,    36,     0,     0,     0,    38,
       39,    40,    41,     0,     0,    43,     0,     0,     0,     0,
-       0,   705,    49,     0,     0,    51,   706,   240,    54,   707,
-       0,   241,   242,     0,     0,     0,   243,   244,   245,     0,
-     246,   247,   248,     0,     0,     0,   108,    71,     0,     0,
+       0,   717,    49,     0,     0,    51,   718,   241,   719,   720,
+       0,   242,   243,     0,     0,     0,   244,   245,   246,     0,
+     247,   248,   249,     0,     0,     0,   108,    71,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   587,  1733,     0,     0,     0,     0,     0,   251,
-       0,    85,    86,    87,   589,   189,     6,     0,   294,   523,
-       0,   254,   190,   191,   192,     0,     0,   193,   194,   195,
+       0,     0,   596,  1764,     0,     0,     0,     0,     0,   252,
+       0,    85,    86,    87,   598,   189,     6,     0,   299,   531,
+       0,   255,   190,   191,   192,     0,     0,   193,   194,   195,
      196,   197,   198,   199,   200,   201,   202,   203,   204,   205,
      206,   207,   208,   209,   210,   211,   212,   213,   214,   215,
      216,   217,   218,   219,   220,   221,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,   222,   223,   224,
      225,     0,     0,     0,     0,   226,   227,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   881,   228,   229,   230,
+       0,     0,     0,     0,     0,     0,   968,   228,   229,   230,
        0,     0,     7,     8,     0,   231,    21,     0,   232,     0,
        0,     0,     0,   233,     0,     0,   234,     0,     0,   235,
        0,   236,     0,     0,     0,     0,     0,     0,    37,     0,
-       0,     0,    41,     0,     0,     0,     0,     0,     0,     0,
-       0,   237,     0,    50,     0,     0,   238,     0,   239,     0,
+       0,     0,   237,     0,     0,     0,     0,     0,     0,     0,
+       0,   238,     0,    50,     0,     0,   239,     0,   240,     0,
        0,     0,     0,     0,     0,    60,    61,    62,    63,    64,
        0,     0,    66,    67,    68,    69,    70,     0,     0,     0,
       74,     0,     0,    77,     0,     0,     0,     0,     0,     0,
       24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
       34,    35,    36,     0,     0,     0,    38,    39,    40,    41,
-       0,     0,    43,     0,     0,     0,     0,     0,   705,    49,
-       0,     0,    51,   706,   240,    54,   707,     0,   241,   242,
-       0,     0,     0,   243,   244,   245,     0,   246,   247,   248,
+       0,     0,    43,     0,     0,     0,     0,     0,   717,    49,
+       0,     0,    51,   718,   241,   719,   720,     0,   242,   243,
+       0,     0,     0,   244,   245,   246,     0,   247,   248,   249,
        0,     0,     0,   108,    71,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   249,
-     250,     0,     0,     0,     0,     0,   251,     0,    85,    86,
-      87,   252,   189,     6,     0,   253,     0,     0,   254,   190,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   250,
+     251,     0,     0,     0,     0,     0,   252,     0,    85,    86,
+      87,   253,   189,     6,     0,   254,     0,     0,   255,   190,
      191,   192,     0,     0,   193,   194,   195,   196,   197,   198,
      199,   200,   201,   202,   203,   204,   205,   206,   207,   208,
      209,   210,   211,   212,   213,   214,   215,   216,   217,   218,
      219,   220,   221,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,   222,   223,   224,   225,     0,     0,
        0,     0,   226,   227,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   903,   228,   229,   230,     0,     0,     7,
+       0,     0,     0,  1157,   228,   229,   230,     0,     0,     7,
        8,     0,   231,    21,     0,   232,     0,     0,     0,     0,
      233,     0,     0,   234,     0,     0,   235,     0,   236,     0,
-       0,     0,     0,     0,     0,    37,     0,     0,     0,    41,
-       0,     0,     0,     0,     0,     0,     0,     0,   237,     0,
-      50,     0,     0,   238,     0,   239,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,    37,     0,     0,     0,   237,
+       0,     0,     0,     0,     0,     0,     0,     0,   238,     0,
+      50,     0,     0,   239,     0,   240,     0,     0,     0,     0,
        0,     0,    60,    61,    62,    63,    64,     0,     0,    66,
       67,    68,    69,    70,     0,     0,     0,    74,     0,     0,
       77,     0,     0,     0,     0,     0,     0,    24,    25,    26,
       27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
        0,     0,     0,    38,    39,    40,    41,     0,     0,    43,
-       0,     0,     0,     0,     0,   705,    49,     0,     0,    51,
-     706,   240,    54,   707,     0,   241,   242,     0,     0,     0,
-     243,   244,   245,     0,   246,   247,   248,     0,     0,     0,
+       0,     0,     0,     0,     0,   717,    49,     0,     0,    51,
+     718,   241,   719,   720,     0,   242,   243,     0,     0,     0,
+     244,   245,   246,     0,   247,   248,   249,     0,     0,     0,
      108,    71,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   249,   250,     0,     0,
-       0,     0,     0,   251,     0,    85,    86,    87,   332,   189,
-       6,     0,   253,     0,     0,   254,   190,   191,   192,     0,
+       0,     0,     0,     0,     0,     0,   250,   251,     0,     0,
+       0,     0,     0,   252,     0,    85,    86,    87,   337,   189,
+       6,     0,   254,     0,     0,   255,   190,   191,   192,     0,
        0,   193,   194,   195,   196,   197,   198,   199,   200,   201,
      202,   203,   204,   205,   206,   207,   208,   209,   210,   211,
      212,   213,   214,   215,   216,   217,   218,   219,   220,   221,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,   222,   223,   224,   225,     0,     0,     0,     0,   226,
      227,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     948,   228,   229,   230,     0,     0,     7,     8,     0,   231,
+    1159,   228,   229,   230,     0,     0,     7,     8,     0,   231,
       21,     0,   232,     0,     0,     0,     0,   233,     0,     0,
      234,     0,     0,   235,     0,   236,     0,     0,     0,     0,
-       0,     0,    37,     0,     0,     0,    41,     0,     0,     0,
-       0,     0,     0,     0,     0,   237,     0,    50,     0,     0,
-     238,     0,   239,     0,     0,     0,     0,     0,     0,    60,
+       0,     0,    37,     0,     0,     0,   237,     0,     0,     0,
+       0,     0,     0,     0,     0,   238,     0,    50,     0,     0,
+     239,     0,   240,     0,     0,     0,     0,     0,     0,    60,
       61,    62,    63,    64,     0,     0,    66,    67,    68,    69,
       70,     0,     0,     0,    74,     0,     0,    77,     0,     0,
        0,     0,     0,     0,    24,    25,    26,    27,    28,    29,
       30,    31,    32,    33,    34,    35,    36,     0,     0,     0,
       38,    39,    40,    41,     0,     0,    43,     0,     0,     0,
-       0,     0,   705,    49,     0,     0,    51,   706,   240,    54,
-     707,     0,   241,   242,     0,     0,     0,   243,   244,   245,
-       0,   246,   247,   248,     0,     0,     0,   108,    71,     0,
+       0,     0,   717,    49,     0,     0,    51,   718,   241,   719,
+     720,     0,   242,   243,     0,     0,     0,   244,   245,   246,
+       0,   247,   248,   249,     0,     0,     0,   108,    71,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   249,   463,     0,     0,     0,     0,     0,
-     251,     0,    85,    86,    87,   332,   189,     6,     0,   518,
-       0,     0,   254,   190,   191,   192,     0,     0,   193,   194,
+       0,     0,     0,   250,   469,     0,     0,     0,     0,     0,
+     252,     0,    85,    86,    87,   337,   189,     6,     0,   526,
+       0,     0,   255,   190,   191,   192,     0,     0,   193,   194,
      195,   196,   197,   198,   199,   200,   201,   202,   203,   204,
      205,   206,   207,   208,   209,   210,   211,   212,   213,   214,
      215,   216,   217,   218,   219,   220,   221,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,   222,   223,
      224,   225,     0,     0,     0,     0,   226,   227,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   949,   228,   229,
+       0,     0,     0,     0,     0,     0,     0,  1160,   228,   229,
      230,     0,     0,     7,     8,     0,   231,    21,     0,   232,
        0,     0,     0,     0,   233,     0,     0,   234,     0,     0,
      235,     0,   236,     0,     0,     0,     0,     0,     0,    37,
-       0,     0,     0,    41,     0,     0,     0,     0,     0,     0,
-       0,     0,   237,     0,    50,     0,     0,   238,     0,   239,
+       0,     0,     0,   237,     0,     0,     0,     0,     0,     0,
+       0,     0,   238,     0,    50,     0,     0,   239,     0,   240,
        0,     0,     0,     0,     0,     0,    60,    61,    62,    63,
       64,     0,     0,    66,    67,    68,    69,    70,     0,     0,
        0,    74,     0,     0,    77,     0,     0,     0,     0,     0,
        0,    24,    25,    26,    27,    28,    29,    30,    31,    32,
       33,    34,    35,    36,     0,     0,     0,    38,    39,    40,
-      41,     0,     0,    43,     0,     0,     0,     0,     0,   705,
-      49,     0,     0,    51,   706,   240,    54,   707,     0,   241,
-     242,     0,     0,     0,   243,   244,   245,     0,   246,   247,
-     248,     0,     0,     0,   108,    71,     0,     0,     0,     0,
+      41,     0,     0,    43,     0,     0,     0,     0,     0,   717,
+      49,     0,     0,    51,   718,   241,   719,   720,     0,   242,
+     243,     0,     0,     0,   244,   245,   246,     0,   247,   248,
+     249,     0,     0,     0,   108,    71,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     249,   463,     0,     0,     0,     0,     0,   251,     0,    85,
-      86,    87,   332,   189,     6,     0,     0,   523,     0,   254,
+     250,   469,     0,     0,     0,     0,     0,   252,     0,    85,
+      86,    87,   337,   189,     6,     0,     0,   531,     0,   255,
      190,   191,   192,     0,     0,   193,   194,   195,   196,   197,
      198,   199,   200,   201,   202,   203,   204,   205,   206,   207,
      208,   209,   210,   211,   212,   213,   214,   215,   216,   217,
      218,   219,   220,   221,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,   222,   223,   224,   225,     0,
        0,     0,     0,   226,   227,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,  1134,   228,   229,   230,     0,     0,
+       0,     0,     0,     0,  1179,   228,   229,   230,     0,     0,
        7,     8,     0,   231,    21,     0,   232,     0,     0,     0,
        0,   233,     0,     0,   234,     0,     0,   235,     0,   236,
        0,     0,     0,     0,     0,     0,    37,     0,     0,     0,
-      41,     0,     0,     0,     0,     0,     0,     0,     0,   237,
-       0,    50,     0,     0,   238,     0,   239,     0,     0,     0,
+     237,     0,     0,     0,     0,     0,     0,     0,     0,   238,
+       0,    50,     0,     0,   239,     0,   240,     0,     0,     0,
        0,     0,     0,    60,    61,    62,    63,    64,     0,     0,
       66,    67,    68,    69,    70,     0,     0,     0,    74,     0,
        0,    77,     0,     0,     0,     0,     0,     0,    24,    25,
       26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
       36,     0,     0,     0,    38,    39,    40,    41,     0,     0,
-      43,     0,     0,     0,     0,     0,   705,    49,     0,     0,
-      51,   706,   240,    54,   707,     0,   241,   242,     0,     0,
-       0,   243,   244,   245,     0,   246,   247,   248,     0,     0,
+      43,     0,     0,     0,     0,     0,   717,    49,     0,     0,
+      51,   718,   241,   719,   720,     0,   242,   243,     0,     0,
+       0,   244,   245,   246,     0,   247,   248,   249,     0,     0,
        0,   108,    71,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   249,   250,     0,
-       0,     0,     0,     0,   251,     0,    85,    86,    87,   559,
-     189,     6,     0,   253,     0,     0,   254,   190,   191,   192,
+       0,     0,     0,     0,     0,     0,     0,   250,   251,     0,
+       0,     0,     0,     0,   252,     0,    85,    86,    87,   568,
+     189,     6,     0,   254,     0,     0,   255,   190,   191,   192,
        0,     0,   193,   194,   195,   196,   197,   198,   199,   200,
      201,   202,   203,   204,   205,   206,   207,   208,   209,   210,
      211,   212,   213,   214,   215,   216,   217,   218,   219,   220,
      221,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,   222,   223,   224,   225,     0,     0,     0,     0,
      226,   227,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,  1136,   228,   229,   230,     0,     0,     7,     8,     0,
+       0,  1209,   228,   229,   230,     0,     0,     7,     8,     0,
      231,    21,     0,   232,     0,     0,     0,     0,   233,     0,
        0,   234,     0,     0,   235,     0,   236,     0,     0,     0,
-       0,     0,     0,    37,     0,     0,     0,    41,     0,     0,
-       0,     0,     0,     0,     0,     0,   237,     0,    50,     0,
-       0,   238,     0,   239,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,    37,     0,     0,     0,   237,     0,     0,
+       0,     0,     0,     0,     0,     0,   238,     0,    50,     0,
+       0,   239,     0,   240,     0,     0,     0,     0,     0,     0,
       60,    61,    62,    63,    64,     0,     0,    66,    67,    68,
       69,    70,     0,     0,     0,    74,     0,     0,    77,     0,
        0,     0,     0,     0,     0,    24,    25,    26,    27,    28,
       29,    30,    31,    32,    33,    34,    35,    36,     0,     0,
        0,    38,    39,    40,    41,     0,     0,    43,     0,     0,
-       0,     0,     0,   705,    49,     0,     0,    51,   706,   240,
-      54,   707,     0,   241,   242,     0,     0,     0,   243,   244,
-     245,     0,   246,   247,   248,     0,     0,     0,   108,    71,
+       0,     0,     0,   717,    49,     0,     0,    51,   718,   241,
+     719,   720,     0,   242,   243,     0,     0,     0,   244,   245,
+     246,     0,   247,   248,   249,     0,     0,     0,   108,    71,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   249,   250,     0,     0,     0,     0,
-       0,   251,     0,    85,    86,    87,   566,   189,     6,     0,
-     253,     0,     0,   254,   190,   191,   192,     0,     0,   193,
+       0,     0,     0,     0,   250,   251,     0,     0,     0,     0,
+       0,   252,     0,    85,    86,    87,   575,   189,     6,     0,
+     254,     0,     0,   255,   190,   191,   192,     0,     0,   193,
      194,   195,   196,   197,   198,   199,   200,   201,   202,   203,
      204,   205,   206,   207,   208,   209,   210,   211,   212,   213,
      214,   215,   216,   217,   218,   219,   220,   221,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,   222,
      223,   224,   225,     0,     0,     0,     0,   226,   227,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,  1137,   228,
+       0,     0,     0,     0,     0,     0,     0,     0,  1242,   228,
      229,   230,     0,     0,     7,     8,     0,   231,    21,     0,
      232,     0,     0,     0,     0,   233,     0,     0,   234,     0,
        0,   235,     0,   236,     0,     0,     0,     0,     0,     0,
-      37,     0,     0,     0,    41,     0,     0,     0,     0,     0,
-       0,     0,     0,   237,     0,    50,     0,     0,   238,     0,
-     239,     0,     0,     0,     0,     0,     0,    60,    61,    62,
+      37,     0,     0,     0,   237,     0,     0,     0,     0,     0,
+       0,     0,     0,   238,     0,    50,     0,     0,   239,     0,
+     240,     0,     0,     0,     0,     0,     0,    60,    61,    62,
       63,    64,     0,     0,    66,    67,    68,    69,    70,     0,
        0,     0,    74,     0,     0,    77,     0,     0,     0,     0,
        0,     0,    24,    25,    26,    27,    28,    29,    30,    31,
       32,    33,    34,    35,    36,     0,     0,     0,    38,    39,
-      40,    41,     0,     0,    43,     0,     0,     0,     0,     0,
-     705,    49,     0,     0,    51,   706,   240,    54,   707,     0,
-     241,   242,     0,     0,     0,   243,   244,   245,     0,   246,
-     247,   248,     0,     0,     0,   108,    71,     0,     0,     0,
+      40,    41,     0,     0,    43,   937,     0,     0,     0,     0,
+     717,    49,     0,     0,    51,   718,   241,   719,   720,     0,
+     242,   243,     0,     0,     0,   244,   245,   246,     0,   247,
+     248,   249,     0,     0,     0,   108,    71,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   249,   463,     0,     0,     0,     0,     0,   251,     0,
-      85,    86,    87,   332,   189,     6,     0,   835,     0,     0,
-     254,   190,   191,   192,     0,     0,   193,   194,   195,   196,
+       0,   250,   469,     0,     0,     0,     0,     0,   252,     0,
+      85,    86,    87,   337,   189,     6,     0,   851,     0,  1299,
+     255,   190,   191,   192,     0,     0,   193,   194,   195,   196,
      197,   198,   199,   200,   201,   202,   203,   204,   205,   206,
      207,   208,   209,   210,   211,   212,   213,   214,   215,   216,
      217,   218,   219,   220,   221,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,   222,   223,   224,   225,
        0,     0,     0,     0,   226,   227,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,  1156,   228,   229,   230,     0,
-       0,     7,     8,     0,   231,    21,     0,   232,     0,     0,
+       0,     0,     0,     0,     0,  1390,   228,   229,   230,     0,
+       0,     0,     0,     0,   231,    21,     0,   232,     0,     0,
        0,     0,   233,     0,     0,   234,     0,     0,   235,     0,
      236,     0,     0,     0,     0,     0,     0,    37,     0,     0,
-       0,    41,     0,     0,     0,     0,     0,     0,     0,     0,
-     237,     0,    50,     0,     0,   238,     0,   239,     0,     0,
+       0,   237,     0,     0,     0,     0,     0,     0,     0,     0,
+     238,     0,    50,     0,     0,   239,     0,   240,     0,     0,
        0,     0,     0,     0,    60,    61,    62,    63,    64,     0,
        0,    66,    67,    68,    69,    70,     0,     0,     0,    74,
-       0,     0,    77,     0,     0,     0,     0,     0,     0,    24,
-      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
-      35,    36,     0,     0,     0,    38,    39,    40,    41,     0,
-       0,    43,     0,     0,     0,     0,     0,   705,    49,     0,
-       0,    51,   706,   240,    54,   707,     0,   241,   242,     0,
-       0,     0,   243,   244,   245,     0,   246,   247,   248,     0,
-       0,     0,   108,    71,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   249,   250,
-       0,     0,     0,     0,     0,   251,     0,    85,    86,    87,
-     332,   189,     6,     0,  1591,     0,     0,   254,   190,   191,
-     192,     0,     0,   193,   194,   195,   196,   197,   198,   199,
-     200,   201,   202,   203,   204,   205,   206,   207,   208,   209,
-     210,   211,   212,   213,   214,   215,   216,   217,   218,   219,
-     220,   221,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   222,   223,   224,   225,     0,     0,     0,
-       0,   226,   227,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,  1186,   228,   229,   230,     0,     0,     7,     8,
-       0,   231,    21,     0,   232,     0,     0,     0,     0,   233,
-       0,     0,   234,     0,     0,   235,     0,   236,     0,     0,
-       0,     0,     0,     0,    37,     0,     0,     0,    41,     0,
-       0,     0,     0,     0,     0,     0,     0,   237,     0,    50,
-       0,     0,   238,     0,   239,     0,     0,     0,     0,     0,
-       0,    60,    61,    62,    63,    64,     0,     0,    66,    67,
-      68,    69,    70,     0,     0,     0,    74,     0,     0,    77,
-       0,     0,     0,     0,     0,     0,    24,    25,    26,    27,
-      28,    29,    30,    31,    32,    33,    34,    35,    36,     0,
-       0,     0,    38,    39,    40,    41,     0,     0,    43,  1797,
-     529,     0,     0,     0,   705,    49,     0,     0,    51,   706,
-     240,    54,   707,     0,   241,   242,     0,     0,     0,   243,
-     244,   245,     0,   246,   247,   248,     0,     0,     0,   108,
-      71,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   587,  1733,     0,     0,     0,
-       0,     0,   251,     0,    85,    86,    87,   589,   189,     6,
-       0,   294,     0,     0,   254,   190,   191,   192,     0,     0,
+       0,     0,    77,   539,   540,   541,   542,   543,   544,   545,
+     546,   547,   548,   549,   550,   551,   678,   553,   554,   555,
+     556,     0,     0,     0,     0,   557,     0,  1127,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   241,     0,     0,     0,   242,   243,     0,
+       0,     0,   244,   245,   246,     0,   247,   248,   249,     0,
+       0,     0,   108,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   250,   469,
+       0,     0,     0,     0,     0,   252,   189,     6,     0,     0,
+     337,  1501,     0,   190,   191,   192,     0,   255,   193,   194,
+     195,   196,   197,   198,   199,   200,   201,   202,   203,   204,
+     205,   206,   207,   208,   209,   210,   211,   212,   213,   214,
+     215,   216,   217,   218,   219,   220,   221,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   222,   223,
+     224,   225,     0,     0,     0,     0,   226,   227,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   228,   229,
+     230,     0,     0,     0,     0,     0,   231,    21,     0,   232,
+       0,     0,     0,     0,   233,     0,     0,   234,     0,     0,
+     235,     0,   236,     0,     0,     0,     0,     0,     0,    37,
+       0,     0,     0,   237,     0,     0,     0,     0,     0,     0,
+       0,     0,   238,     0,    50,     0,     0,   239,     0,   240,
+       0,     0,     0,     0,     0,     0,    60,    61,    62,    63,
+      64,     0,     0,    66,    67,    68,    69,    70,     0,     0,
+       0,    74,     0,     0,    77,   539,   540,   541,   542,   543,
+     544,   545,   546,   547,   548,   549,   550,   551,   678,   553,
+     554,   555,   556,     0,     0,     0,     0,   557,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   241,     0,     0,     0,   242,
+     243,     0,     0,     0,   244,   245,   246,     0,   247,   248,
+     249,     0,     0,     0,   108,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     250,   469,     0,     0,     0,     0,     0,   252,   189,     6,
+       0,     0,   337,     0,     0,   190,   191,   192,     0,   255,
      193,   194,   195,   196,   197,   198,   199,   200,   201,   202,
      203,   204,   205,   206,   207,   208,   209,   210,   211,   212,
      213,   214,   215,   216,   217,   218,   219,   220,   221,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
      222,   223,   224,   225,     0,     0,     0,     0,   226,   227,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,  1219,
-     228,   229,   230,     0,     0,     0,     0,     0,   231,    21,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     228,   229,   230,     0,     0,     7,     8,     0,   231,    21,
        0,   232,     0,     0,     0,     0,   233,     0,     0,   234,
        0,     0,   235,     0,   236,     0,     0,     0,     0,     0,
-       0,    37,     0,     0,     0,    41,     0,     0,     0,     0,
-       0,     0,     0,     0,   237,     0,    50,     0,     0,   238,
-       0,   239,     0,     0,     0,     0,     0,     0,    60,    61,
+       0,    37,     0,     0,     0,   237,     0,     0,     0,     0,
+       0,     0,     0,     0,   238,     0,    50,     0,     0,   239,
+       0,   240,     0,     0,     0,     0,     0,     0,    60,    61,
       62,    63,    64,     0,     0,    66,    67,    68,    69,    70,
-       0,     0,     0,    74,     0,     0,    77,     0,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   759,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   240,     0,     0,
-       0,   241,   242,     0,     0,     0,   243,   244,   245,     0,
-     246,   247,   248,     0,     0,     0,   108,     0,     0,     0,
+       0,     0,     0,    74,     0,     0,    77,     0,     0,     0,
+       0,     0,     0,    24,    25,    26,    27,    28,    29,    30,
+      31,    32,    33,    34,    35,    36,     0,     0,     0,    38,
+      39,    40,    41,     0,     0,    43,     0,     0,     0,     0,
+       0,   717,    49,     0,     0,    51,   718,   241,   719,   720,
+       0,   242,   243,     0,     0,     0,   244,   245,   246,     0,
+     247,   248,   249,     0,     0,     0,   108,    71,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   249,   463,     0,     0,     0,     0,     0,   251,
-     189,   152,   350,     0,   332,     0,     0,   190,   191,   192,
-       0,   254,   193,   194,   195,   196,   197,   198,   199,   200,
-     201,   202,   203,   204,   205,   206,   207,   208,   209,   386,
-     211,   212,   213,   214,   215,   216,   529,     0,     0,     0,
-       0,     0,     0,   351,   352,   353,   354,   355,   356,   357,
-     358,   359,   222,   223,   224,   225,   360,   361,   362,   363,
-     226,     0,     0,     0,   364,   365,   366,     0,     0,   367,
-       0,   368,   228,   229,   230,     0,     0,     0,     0,     0,
-     231,    21,   369,   232,     0,   370,   189,   152,   350,     0,
-       0,     0,     0,   190,   191,   192,     0,     0,   193,   194,
-     195,   196,   197,   198,   199,   200,   201,   202,   203,   204,
-     205,   206,   207,   208,   209,   386,   211,   212,   213,   214,
-     215,   216,     0,     0,     0,     0,     0,     0,     0,   351,
-     352,   353,   354,   355,   356,   357,   358,   359,   222,   223,
-     224,   225,   360,   361,   362,   363,   226,     0,     0,     0,
-     364,   365,   366,     0,     0,   367,     0,   368,   228,   229,
-     230,     0,     0,     0,     0,     0,   231,    21,   369,   232,
-       0,   370,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   240,
-     371,   372,   373,   241,     0,     0,     0,     0,   243,   244,
-     245,   374,   246,   247,   248,   375,     0,   376,   108,     0,
+       0,     0,   250,   251,     0,     0,     0,     0,     0,   252,
+       0,    85,    86,    87,   337,   189,     6,     0,  1619,     0,
+       0,   255,   190,   191,   192,     0,     0,   193,   194,   195,
+     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,
+     206,   207,   208,   209,   210,   211,   212,   213,   214,   215,
+     216,   217,   218,   219,   220,   221,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   222,   223,   224,
+     225,     0,     0,     0,     0,   226,   227,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,  1986,   228,   229,   230,
+       0,     0,     7,     8,     0,   231,    21,     0,   232,     0,
+       0,     0,     0,   233,     0,     0,   234,     0,     0,   235,
+       0,   236,     0,     0,     0,     0,     0,     0,    37,     0,
+       0,     0,   237,     0,     0,     0,     0,     0,     0,     0,
+       0,   238,     0,    50,     0,     0,   239,     0,   240,     0,
+       0,     0,     0,     0,     0,    60,    61,    62,    63,    64,
+       0,     0,    66,    67,    68,    69,    70,     0,     0,     0,
+      74,     0,     0,    77,     0,     0,     0,     0,     0,     0,
+      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
+      34,    35,    36,     0,     0,     0,    38,    39,    40,    41,
+       0,     0,    43,  1128,     0,     0,     0,     0,   717,    49,
+       0,     0,    51,   718,   241,   719,   720,     0,   242,   243,
+       0,     0,     0,   244,   245,   246,     0,   247,   248,   249,
+       0,     0,     0,   108,    71,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   596,
+    1764,     0,     0,     0,     0,     0,   252,     0,    85,    86,
+      87,   598,   189,     6,     0,   299,     0,     0,   255,   190,
+     191,   192,     0,     0,   193,   194,   195,   196,   197,   198,
+     199,   200,   201,   202,   203,   204,   205,   206,   207,   208,
+     209,   210,   211,   212,   213,   214,   215,   216,   217,   218,
+     219,   220,   221,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   222,   223,   224,   225,     0,     0,
+       0,     0,   226,   227,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,  2043,   228,   229,   230,     0,     0,     0,
+       0,     0,   231,    21,     0,   232,     0,     0,     0,     0,
+     233,     0,     0,   234,     0,     0,   235,     0,   236,     0,
+       0,     0,     0,     0,     0,    37,     0,     0,     0,   237,
+       0,     0,     0,     0,     0,     0,     0,     0,   238,     0,
+      50,     0,     0,   239,     0,   240,     0,     0,     0,     0,
+       0,     0,    60,    61,    62,    63,    64,     0,     0,    66,
+      67,    68,    69,    70,     0,     0,     0,    74,     0,     0,
+      77,   539,   540,   541,   542,   543,   544,   545,   546,   547,
+     548,   549,   550,   551,   678,   553,   554,   555,   556,     0,
+       0,     0,     0,   557,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   241,     0,     0,     0,   242,   243,     0,     0,     0,
+     244,   245,   246,     0,   247,   248,   249,     0,     0,     0,
+     108,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   250,   469,     0,     0,
+       0,     0,     0,   252,   189,   152,   356,     0,   337,     0,
+       0,   190,   191,   192,     0,   255,   193,   194,   195,   196,
+     197,   198,   199,   200,   201,   202,   203,   204,   205,   206,
+     207,   208,   209,   392,   211,   212,   213,   214,   215,   216,
+    1436,     0,     0,     0,     0,     0,     0,   357,   358,   359,
+     360,   361,   362,   363,   364,   365,   222,   223,   224,   225,
+     366,   367,   368,   369,   226,     0,     0,     0,   370,   371,
+     372,     0,     0,   373,     0,   374,   228,   229,   230,     0,
+       0,     0,     0,     0,   231,    21,   375,   232,     0,   376,
+     189,   152,   356,     0,     0,     0,     0,   190,   191,   192,
+       0,     0,   193,   194,   195,   196,   197,   198,   199,   200,
+     201,   202,   203,   204,   205,   206,   207,   208,   209,   392,
+     211,   212,   213,   214,   215,   216,     0,     0,     0,     0,
+       0,     0,     0,   357,   358,   359,   360,   361,   362,   363,
+     364,   365,   222,   223,   224,   225,   366,   367,   368,   369,
+     226,     0,     0,     0,   370,   371,   372,     0,     0,   373,
+       0,   374,   228,   229,   230,     0,     0,     0,     0,     0,
+     231,    21,   375,   232,     0,   376,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   249,   387,     0,     0,     0,     0,
-       0,   251,     0,     0,     0,     0,   332,     0,     0,     0,
-    1488,     0,     0,   254,   530,   531,   532,   533,   534,   535,
-     536,   537,   538,   539,   540,   541,   542,   543,   544,   545,
-     546,   547,     0,     0,     0,     0,   548,     0,     0,     0,
-       0,     0,     0,     0,     0,   240,   371,   372,   373,   241,
-       0,     0,     0,     0,   243,   244,   245,   374,   246,   247,
-     248,   375,     0,   376,   108,     0,     0,     0,     0,     0,
+       0,     0,     0,   241,   377,   378,   379,   242,     0,     0,
+       0,     0,   244,   245,   246,   380,   247,   248,   249,   381,
+       0,   382,   108,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   250,   393,
+       0,     0,     0,     0,     0,   252,     0,     0,     0,     0,
+     337,     0,     0,     0,  1516,     0,     0,   255,   539,   540,
+     541,   542,   543,   544,   545,   546,   547,   548,   549,   550,
+     551,   678,   553,   554,   555,   556,     0,     0,     0,     0,
+     557,     0,     0,     0,     0,     0,     0,     0,     0,   241,
+     377,   378,   379,   242,     0,     0,     0,     0,   244,   245,
+     246,   380,   247,   248,   249,   381,     0,   382,   108,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     249,   387,     0,     0,     0,     0,     0,   251,     0,     0,
-       0,     0,   332,   189,   152,   350,  1746,     0,     0,   254,
+       0,     0,     0,     0,   250,   393,     0,     0,     0,     0,
+       0,   252,     0,     0,     0,     0,   337,   189,   152,   356,
+    1777,     0,     0,   255,   190,   191,   192,     0,     0,   193,
+     194,   195,   196,   197,   198,   199,   200,   201,   202,   203,
+     204,   205,   206,   207,   208,   209,   392,   211,   212,   213,
+     214,   215,   216,     0,     0,     0,     0,     0,     0,     0,
+    1520,   358,   359,   360,   361,   362,   363,   364,   365,   222,
+     223,   224,   225,   366,   367,   368,   369,   226,     0,     0,
+       0,   370,   371,   372,     0,     0,   373,     0,   374,   228,
+     229,   230,     0,     0,     0,     0,     0,   231,    21,   375,
+     232,     0,   376,   189,   152,   356,     0,     0,     0,     0,
      190,   191,   192,     0,     0,   193,   194,   195,   196,   197,
      198,   199,   200,   201,   202,   203,   204,   205,   206,   207,
-     208,   209,   386,   211,   212,   213,   214,   215,   216,   529,
-       0,     0,     0,     0,     0,     0,  1492,   352,   353,   354,
-     355,   356,   357,   358,   359,   222,   223,   224,   225,   360,
-     361,   362,   363,   226,     0,     0,     0,   364,   365,   366,
-       0,     0,   367,     0,   368,   228,   229,   230,     0,     0,
-       0,     0,     0,   231,    21,   369,   232,     0,   370,   189,
-     152,   350,     0,     0,     0,     0,   190,   191,   192,     0,
-       0,   193,   194,   195,   196,   197,   198,   199,   200,   201,
-     202,   203,   204,   205,   206,   207,   208,   209,   386,   211,
-     212,   213,   214,   215,   216,     0,     0,     0,     0,     0,
-       0,     0,   351,   352,   353,   354,   355,   356,   357,   358,
-     359,   222,   223,   224,   225,   360,   361,   362,   363,   226,
-       0,     0,     0,   364,   365,   366,     0,     0,   367,     0,
-     368,   228,   229,   230,     0,     0,     0,     0,     0,   231,
-      21,   369,   232,     0,   370,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   240,   371,   372,   373,   241,     0,     0,     0,
-       0,   243,   244,   245,   374,   246,   247,   248,   375,     0,
-     376,   108,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   249,   387,     0,
-       0,     0,     0,     0,   251,     0,     0,     0,     0,   332,
-       0,     0,     0,  1645,     0,     0,   254,   530,   531,   532,
-     533,   534,   535,   536,   537,   538,   539,   540,   541,   542,
-     759,   544,   545,   546,   547,     0,     0,     0,     0,   548,
-       0,     0,     0,     0,   920,     0,     0,     0,   240,   371,
-     372,   373,   241,     0,     0,     0,     0,   243,   244,   245,
-     374,   246,   247,   248,   375,     0,   376,   108,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   249,   387,     0,     0,     0,     0,     0,
-     251,   189,   152,     0,     0,   332,     0,     0,   190,   191,
-     192,     0,   254,   193,   194,   195,   196,   197,   198,   199,
-     200,   201,   202,   203,   204,   205,   206,   207,   208,   209,
-     386,   211,   212,   213,   214,   215,   216,     0,  1104,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   222,   223,   224,   225,     0,     0,     0,
-       0,   226,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   228,   229,   230,     0,     0,   189,   152,
-       0,   231,    21,     0,   232,   190,   191,   192,     0,     0,
-     193,   194,   195,   196,   197,   198,   199,   200,   201,   202,
-     203,   204,   205,   206,   207,   208,   209,   386,   211,   212,
-     213,   214,   215,   216,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     222,   223,   224,   225,     0,     0,     0,     0,   226,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     228,   229,   230,     0,     0,     0,     0,     0,   231,    21,
-       0,   232,   530,   531,   532,   533,   534,   535,   536,   537,
-     538,   539,   540,   541,   542,   666,   544,   545,   546,   547,
-       0,     0,     0,     0,   548,     0,     0,     0,     0,     0,
-     240,     0,     0,     0,   241,     0,     0,     0,     0,   243,
-     244,   245,     0,   246,   247,   248,     0,     0,     0,   108,
+     208,   209,   392,   211,   212,   213,   214,   215,   216,     0,
+       0,     0,     0,     0,     0,     0,   357,   358,   359,   360,
+     361,   362,   363,   364,   365,   222,   223,   224,   225,   366,
+     367,   368,   369,   226,     0,     0,     0,   370,   371,   372,
+       0,     0,   373,     0,   374,   228,   229,   230,  1380,     0,
+       0,     0,     0,   231,    21,   375,   232,     0,   376,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   249,   387,     0,     0,     0,
-       0,     0,   251,     0,     0,     0,     0,   332,     0,     0,
-       0,   569,     0,     0,   254,     0,   530,   531,   532,   533,
-     534,   535,   536,   537,   538,   539,   540,   541,   542,   666,
-     544,   545,   546,   547,     0,     0,     0,   240,   548,     0,
-       0,   241,     0,     0,     0,  1105,   243,   244,   245,     0,
-     246,   247,   248,     0,     0,     0,   108,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   241,   377,   378,   379,
+     242,     0,     0,     0,     0,   244,   245,   246,   380,   247,
+     248,   249,   381,     0,   382,   108,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   587,   588,     0,     0,     0,     0,     0,   251,
-       0,     0,     0,     0,   589,   189,   152,     0,   294,     0,
-       0,   254,   190,   191,   192,     0,     0,   193,   194,   195,
+       0,   250,   393,     0,     0,     0,     0,     0,   252,     0,
+       0,     0,     0,   337,     0,     0,     0,  1673,     0,     0,
+     255,     0,     0,     0,     0,   539,   540,   541,   542,   543,
+     544,   545,   546,   547,   548,   549,   550,   551,   678,   553,
+     554,   555,   556,     0,     0,     0,     0,   557,     0,     0,
+       0,     0,   241,   377,   378,   379,   242,     0,     0,     0,
+       0,   244,   245,   246,   380,   247,   248,   249,   381,     0,
+     382,   108,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   250,   393,     0,
+       0,     0,     0,     0,   252,   189,   152,     0,     0,   337,
+     820,     0,   190,   191,   192,     0,   255,   193,   194,   195,
      196,   197,   198,   199,   200,   201,   202,   203,   204,   205,
-     206,   207,   208,   209,   386,   211,   212,   213,   214,   215,
-     216,  1411,     0,     0,     0,     0,     0,     0,     0,     0,
+     206,   207,   208,   209,   392,   211,   212,   213,   214,   215,
+     216,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,   222,   223,   224,
      225,     0,     0,     0,     0,   226,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,   228,   229,   230,
-       0,     0,     0,     0,     0,   231,    21,     0,   232,   189,
-     152,     0,  1227,     0,     0,     0,   190,   191,   192,     0,
-       0,   193,   194,   195,   196,   197,   198,   199,   200,   201,
-     202,   203,   204,   205,   206,   207,   208,   209,   386,   211,
-     212,   213,   214,   215,   216,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   222,   223,   224,   225,     0,     0,     0,     0,   226,
+       0,     0,   189,   152,     0,   231,    21,     0,   232,   190,
+     191,   192,     0,     0,   193,   194,   195,   196,   197,   198,
+     199,   200,   201,   202,   203,   204,   205,   206,   207,   208,
+     209,   392,   211,   212,   213,   214,   215,   216,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   228,   229,   230,     0,     0,     0,     0,     0,   231,
-      21,     0,   232,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,   240,   548,     0,     0,   241,     0,
-       0,     0,     0,   243,   244,   245,     0,   246,   247,   248,
+       0,     0,     0,     0,   222,   223,   224,   225,     0,     0,
+       0,     0,   226,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   228,   229,   230,     0,     0,     0,
+       0,     0,   231,    21,     0,   232,     0,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,   704,     0,   705,   241,     0,     0,     0,   242,  1639,
+       0,     0,     0,   244,   245,   246,     0,   247,   248,   249,
        0,     0,     0,   108,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   249,
-     387,     0,     0,     0,     0,     0,   251,     0,     0,     0,
-       0,   332,  1011,     0,     0,     0,     0,     0,   254,   530,
-     531,   532,   533,   534,   535,   536,   537,   538,   539,   540,
-     541,   542,   666,   544,   545,   546,   547,     0,     0,     0,
-       0,   548,     0,     0,     0,     0,     0,     0,   240,     0,
-       0,     0,   241,     0,     0,     0,     0,   243,   244,   245,
-       0,   246,   247,   248,     0,     0,     0,   108,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   250,
+     393,     0,     0,     0,     0,     0,   252,     0,     0,     0,
+       0,   337,     0,     0,     0,     0,     0,     0,   255,     0,
+       0,   539,   540,   541,   542,   543,   544,   545,   546,   547,
+     548,   549,   550,   551,   678,   553,   554,   555,   556,     0,
+       0,   241,     0,   557,     0,   242,     0,     0,     0,  1745,
+     244,   245,   246,  1746,   247,   248,   249,     0,     0,     0,
+     108,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   250,   393,     0,     0,
+       0,     0,     0,   252,   189,   152,     0,  1250,   337,  1031,
+       0,   190,   191,   192,     0,   255,   193,   194,   195,   196,
+     197,   198,   199,   200,   201,   202,   203,   204,   205,   206,
+     207,   208,   209,   392,   211,   212,   213,   214,   215,   216,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   249,   387,     0,     0,     0,     0,     0,
-     251,   189,   152,     0,  1373,   332,     0,     0,   190,   191,
-     192,     0,   254,   193,   194,   195,   196,   197,   198,   199,
-     200,   201,   202,   203,   204,   205,   206,   207,   208,   209,
-     386,   211,   212,   213,   214,   215,   216,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   222,   223,   224,   225,
+       0,     0,     0,     0,   226,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   228,   229,   230,     0,
+       0,     0,     0,     0,   231,    21,     0,   232,   189,   152,
+       0,  1398,     0,     0,     0,   190,   191,   192,     0,     0,
+     193,   194,   195,   196,   197,   198,   199,   200,   201,   202,
+     203,   204,   205,   206,   207,   208,   209,   392,   211,   212,
+     213,   214,   215,   216,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   222,   223,   224,   225,     0,     0,     0,
-       0,   226,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   228,   229,   230,     0,     0,     0,     0,
-       0,   231,    21,     0,   232,   189,   152,     0,  1435,     0,
-       0,     0,   190,   191,   192,     0,     0,   193,   194,   195,
-     196,   197,   198,   199,   200,   201,   202,   203,   204,   205,
-     206,   207,   208,   209,   386,   211,   212,   213,   214,   215,
-     216,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   222,   223,   224,
-     225,     0,     0,     0,     0,   226,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   228,   229,   230,
-       0,     0,     0,     0,     0,   231,    21,     0,   232,     0,
-     530,   531,   532,   533,   534,   535,   536,   537,   538,   539,
-     540,   541,   542,   666,   544,   545,   546,   547,     0,     0,
-     240,     0,   548,     0,   241,     0,     0,     0,  1714,   243,
-     244,   245,  1715,   246,   247,   248,     0,     0,     0,   108,
+     222,   223,   224,   225,     0,     0,     0,     0,   226,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   249,   387,     0,     0,     0,
-       0,     0,   251,     0,     0,     0,     0,   332,     0,     0,
-       0,     0,     0,     0,   254,   530,   531,   532,   533,   534,
-     535,   536,   537,   538,   539,   540,   541,   542,   666,   544,
-     545,   546,   547,     0,     0,     0,     0,   548,     0,   692,
-       0,   693,     0,     0,   240,     0,     0,  1611,   241,     0,
-       0,     0,     0,   243,   244,   245,     0,   246,   247,   248,
-       0,     0,     0,   108,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   249,
-     387,     0,     0,     0,     0,     0,   251,   189,   152,     0,
-       0,   332,     0,     0,   190,   191,   192,     0,   254,   193,
+     228,   229,   230,     0,     0,     0,     0,     0,   231,    21,
+       0,   232,     0,   539,   540,   541,   542,   543,   544,   545,
+     546,   547,   548,   549,   550,   551,   678,   553,   554,   555,
+     556,     0,     0,   241,     0,   557,     0,   242,     0,     0,
+       0,  1772,   244,   245,   246,  1773,   247,   248,   249,     0,
+       0,     0,   108,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   250,   393,
+       0,     0,     0,     0,     0,   252,     0,     0,     0,     0,
+     337,     0,     0,     0,     0,     0,     0,   255,   539,   540,
+     541,   542,   543,   544,   545,   546,   547,   548,   549,   550,
+     551,   678,   553,   554,   555,   556,     0,     0,     0,     0,
+     557,     0,   928,     0,     0,     0,     0,   241,     0,     0,
+     889,   242,     0,     0,     0,     0,   244,   245,   246,     0,
+     247,   248,   249,     0,     0,     0,   108,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   250,   393,     0,     0,     0,     0,     0,   252,
+     189,   152,     0,  1460,   337,     0,     0,   190,   191,   192,
+       0,   255,   193,   194,   195,   196,   197,   198,   199,   200,
+     201,   202,   203,   204,   205,   206,   207,   208,   209,   392,
+     211,   212,   213,   214,   215,   216,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   222,   223,   224,   225,     0,     0,     0,     0,
+     226,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   228,   229,   230,     0,     0,   189,   152,     0,
+     231,    21,     0,   232,   190,   191,   192,     0,     0,   193,
      194,   195,   196,   197,   198,   199,   200,   201,   202,   203,
-     204,   205,   206,   207,   208,   209,   386,   211,   212,   213,
+     204,   205,   206,   207,   208,   209,   392,   211,   212,   213,
      214,   215,   216,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,   222,
      223,   224,   225,     0,     0,     0,     0,   226,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,   228,
-     229,   230,     0,     0,   189,   152,     0,   231,    21,     0,
-     232,   190,   191,   192,     0,     0,   193,   194,   195,   196,
-     197,   198,   199,   200,   201,   202,   203,   204,   205,   206,
-     207,   208,   209,   386,   211,   212,   213,   214,   215,   216,
+     229,   230,     0,     0,     0,     0,     0,   231,    21,     0,
+     232,     0,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,     0,     0,     0,   241,
+    1931,     0,     0,   242,  1932,     0,     0,     0,   244,   245,
+     246,     0,   247,   248,   249,     0,     0,     0,   108,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   222,   223,   224,   225,
-       0,     0,     0,     0,   226,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   228,   229,   230,     0,
-       0,     0,     0,     0,   231,    21,     0,   232,     0,   530,
-     531,   532,   533,   534,   535,   536,   537,   538,   539,   540,
-     541,   542,   666,   544,   545,   546,   547,     0,     0,     0,
-       0,   548,     0,     0,     0,     0,   240,  1741,     0,     0,
-     241,  1742,     0,     0,     0,   243,   244,   245,     0,   246,
-     247,   248,     0,     0,     0,   108,     0,     0,     0,     0,
+       0,     0,     0,     0,   250,   393,     0,     0,     0,     0,
+       0,   252,     0,     0,     0,     0,   337,     0,     0,     0,
+       0,     0,     0,   255,     0,     0,   539,   540,   541,   542,
+     543,   544,   545,   546,   547,   548,   549,   550,   551,   678,
+     553,   554,   555,   556,     0,     0,   241,     0,   557,     0,
+     242,     0,     0,     0,     0,   244,   245,   246,   733,   247,
+     248,   249,     0,     0,     0,   108,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   249,   387,     0,     0,     0,     0,     0,   251,     0,
-       0,     0,     0,   332,  1487,     0,     0,     0,     0,     0,
-     254,     0,     0,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,   240,     0,   548,     0,   241,     0,     0,
-       0,  1898,   243,   244,   245,  1899,   246,   247,   248,     0,
-       0,     0,   108,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   249,   387,
-       0,     0,     0,     0,     0,   251,   189,   152,     0,     0,
-     332,  1790,     0,   190,   191,   192,     0,   254,   193,   194,
+       0,   250,   393,     0,     0,     0,     0,     0,   252,   189,
+     152,     0,     0,   337,  1515,     0,   190,   191,   192,     0,
+     255,   193,   194,   195,   196,   197,   198,   199,   200,   201,
+     202,   203,   204,   205,   206,   207,   208,   209,   392,   211,
+     212,   213,   214,   215,   216,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   222,   223,   224,   225,     0,     0,     0,     0,   226,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   228,   229,   230,     0,     0,   189,   152,     0,   231,
+      21,     0,   232,   190,   191,   192,     0,     0,   193,   194,
      195,   196,   197,   198,   199,   200,   201,   202,   203,   204,
-     205,   206,   207,   208,   209,   386,   211,   212,   213,   214,
-     215,   216,     0,     0,     7,     8,     0,     0,     0,     0,
+     205,   206,   207,   208,   209,   392,   211,   212,   213,   214,
+     215,   216,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,   222,   223,
      224,   225,     0,     0,     0,     0,   226,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,   228,   229,
-     230,     0,     0,     7,     8,     0,   231,    21,     0,   232,
-     530,   531,   532,   533,   534,   535,   536,   537,   538,   539,
-     540,   541,   542,   666,   544,   545,   546,   547,     0,     0,
-       0,     0,   548,     0,     0,     0,     0,     0,   993,     0,
-       0,     0,    24,    25,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    35,    36,     0,     0,     0,    38,    39,
-      40,    41,     0,     0,    43,     0,     0,     0,     0,     0,
-     705,    49,     0,     0,    51,   706,     0,    54,   707,     0,
-       0,    24,    25,    26,    27,    28,    29,    30,    31,    32,
-      33,    34,    35,    36,     7,     8,    71,    38,    39,    40,
-      41,     0,     0,    43,     0,     0,     0,     0,     0,   705,
-      49,     0,     0,    51,   706,   240,    54,   707,     0,   241,
-      85,    86,    87,     0,   243,   244,   245,     0,   246,   247,
-     248,     0,     0,     0,   108,    71,     0,     0,     0,     0,
+     230,     0,     0,     0,     0,     0,   231,    21,     0,   232,
+       0,   539,   540,   541,   542,   543,   544,   545,   546,   547,
+     548,   549,   550,   551,   678,   553,   554,   555,   556,     0,
+       0,     0,     0,   557,     0,     0,     0,     0,   241,     0,
+       0,     0,   242,   889,     0,     0,     0,   244,   245,   246,
+       0,   247,   248,   249,     0,     0,     0,   108,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     249,   387,     0,     0,     0,     0,     0,   251,     0,    85,
-      86,    87,   332,     0,     0,     0,     0,     0,     0,   254,
-       0,     0,    24,    25,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    35,    36,     0,     0,     0,    38,    39,
-      40,    41,     0,     0,    43,  1365,     0,     0,     0,     0,
-     705,    49,     0,     0,    51,   706,     0,    54,   707,     0,
-       0,    -4,     1,     0,     0,    -4,     0,     0,     0,     0,
-       0,     0,     0,     0,    -4,    -4,    71,     0,     0,     0,
-       0,     0,     0,     0,  1953,     0,     0,     0,     0,     0,
+       0,     0,     0,   250,   393,     0,     0,     0,     0,     0,
+     252,     0,     0,     0,     0,   337,  1823,     0,     0,     0,
+       0,     0,   255,     0,    -4,     1,     0,     0,    -4,     0,
+       0,     0,     0,     0,     0,     0,     0,    -4,    -4,     0,
+       0,     0,     0,     0,     0,   241,     0,     0,     0,   242,
+       0,     0,     0,     0,   244,   245,   246,     0,   247,   248,
+     249,     0,     0,     0,   108,     0,     0,     0,    -4,    -4,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-      85,    86,    87,     0,     0,    -4,    -4,   530,   531,   532,
-     533,   534,   535,   536,   537,   538,   539,   540,   541,   542,
-     666,   544,   545,   546,   547,    -4,    -4,    -4,     0,   548,
-       0,    -4,    -4,     0,    -4,  1045,     0,     0,     0,    -4,
-      -4,     0,    -4,    -4,     0,    -4,     0,     0,     0,     0,
-      -4,    -4,    -4,    -4,    -4,    -4,    -4,    -4,    -4,    -4,
-      -4,    -4,    -4,    -4,    -4,     0,     0,    -4,    -4,    -4,
-      -4,    -4,    -4,     0,    -4,  2010,    -4,    -4,    -4,    -4,
+     250,   393,     0,     0,     0,     0,     0,   252,    -4,    -4,
+      -4,     0,   337,     0,    -4,    -4,     0,    -4,     0,   255,
+       0,     0,    -4,    -4,     0,    -4,    -4,     0,    -4,     0,
+       0,     0,     0,    -4,    -4,    -4,    -4,    -4,    -4,    -4,
+      -4,    -4,    -4,    -4,    -4,    -4,    -4,    -4,     0,     0,
+      -4,    -4,    -4,    -4,    -4,    -4,     0,    -4,     0,    -4,
+      -4,    -4,    -4,    -4,    -4,    -4,     0,    -4,    -4,    -4,
       -4,    -4,    -4,     0,    -4,    -4,    -4,    -4,    -4,    -4,
-       0,    -4,    -4,    -4,    -4,    -4,    -4,    -4,    -4,    -4,
-       0,    -4,    -4,    -4,    -4,    -4,    -4,    -4,    -4,    -4,
-      -4,    -4,    -4,    -4,    -4,     0,     6,     0,    -4,    -4,
-      -4,     0,     0,     0,    -4,     7,     8,     0,     0,    -4,
-      -4,    -4,    -4,     0,     0,    -4,     0,    -4,     0,    -4,
-      -4,    -4,    -4,    -4,    -4,    -4,    -4,    -4,    -4,    -4,
-      -4,    -4,    -4,     0,     0,     0,     9,    10,     0,    -4,
-      -4,    -4,     0,     0,     0,     0,     0,     0,     0,     0,
-      -4,     0,    -4,     0,     0,     0,    11,    12,    13,     0,
-       0,     0,    14,    15,     0,    16,     0,     0,     0,     0,
-      17,    18,     0,    19,    20,     0,    21,     0,     0,     0,
-       0,    22,    23,    24,    25,    26,    27,    28,    29,    30,
-      31,    32,    33,    34,    35,    36,     0,     0,    37,    38,
-      39,    40,    41,    42,     0,    43,     0,    44,    45,    46,
-      47,    48,    49,    50,     0,    51,    52,    53,    54,    55,
-      56,     0,    57,    58,    59,    60,    61,    62,    63,    64,
-      65,     0,    66,    67,    68,    69,    70,    71,    72,    73,
-      74,    75,    76,    77,    78,    79,     0,     0,     0,    80,
-      81,    82,     0,     0,     0,    83,     0,     0,     0,     0,
-      84,    85,    86,    87,   152,   350,    88,     0,    89,     0,
-      90,    91,    92,    93,    94,    95,    96,    97,    98,    99,
-     100,   101,   102,   103,     0,     0,     0,     0,     0,     0,
-     104,   105,   106,     0,   152,   350,     0,     0,     0,     0,
-       0,   107,     0,   108,     0,     0,   351,   352,   353,   354,
-     355,   356,   357,   358,   359,     0,     0,     0,     0,   360,
-     361,   362,   363,     0,   380,   350,     0,   364,   365,   366,
-       0,     0,   367,     0,   368,     0,   351,   352,   353,   354,
-     355,   356,   357,   358,   359,   369,     0,     0,   370,   360,
-     361,   362,   363,     0,     0,   350,     0,   364,   365,   366,
-       0,     0,   367,     0,   368,     0,   351,   352,   353,   354,
-     355,   356,   357,   358,   359,   369,     0,     0,   370,   360,
-     361,   362,   363,     0,     0,     0,   400,   364,   365,   366,
-       0,     0,   367,     0,   368,     0,   351,   352,   353,   354,
-     355,   356,   357,   358,   359,   369,     0,     0,   370,   360,
-     361,   362,   363,     0,     0,     0,     0,   364,   365,   366,
-       0,     0,   367,     0,   368,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   369,     0,     0,   370,     0,
+      -4,    -4,    -4,     0,    -4,    -4,    -4,    -4,    -4,    -4,
+      -4,    -4,    -4,    -4,    -4,    -4,    -4,    -4,     0,     6,
+       0,    -4,    -4,    -4,     0,     0,     0,    -4,     7,     8,
+       0,     0,    -4,    -4,    -4,    -4,     0,     0,    -4,     0,
+      -4,     0,    -4,    -4,    -4,    -4,    -4,    -4,    -4,    -4,
+      -4,    -4,    -4,    -4,    -4,    -4,     0,     0,     0,     9,
+      10,     0,    -4,    -4,    -4,     0,     0,     0,     0,     0,
+       0,     0,     0,    -4,     0,    -4,     0,     0,     0,    11,
+      12,    13,     0,     0,     0,    14,    15,     0,    16,     0,
+       0,     0,     0,    17,    18,     0,    19,    20,     0,    21,
+       0,     0,     0,     0,    22,    23,    24,    25,    26,    27,
+      28,    29,    30,    31,    32,    33,    34,    35,    36,     0,
+       0,    37,    38,    39,    40,    41,    42,     0,    43,     0,
+      44,    45,    46,    47,    48,    49,    50,     0,    51,    52,
+      53,    54,    55,    56,     0,    57,    58,    59,    60,    61,
+      62,    63,    64,    65,     0,    66,    67,    68,    69,    70,
+      71,    72,    73,    74,    75,    76,    77,    78,    79,     0,
+       0,     0,    80,    81,    82,     0,     0,     0,    83,     0,
+       0,     0,     0,    84,    85,    86,    87,   152,   356,    88,
+       0,    89,     0,    90,    91,    92,    93,    94,    95,    96,
+      97,    98,    99,   100,   101,   102,   103,     0,     0,     0,
+       0,     0,     0,   104,   105,   106,     0,   152,   356,     0,
+       0,     0,     0,     0,   107,     0,   108,     0,     0,   357,
+     358,   359,   360,   361,   362,   363,   364,   365,     0,     0,
+       0,     0,   366,   367,   368,   369,     0,   386,   356,     0,
+     370,   371,   372,     0,     0,   373,     0,   374,     0,   357,
+     358,   359,   360,   361,   362,   363,   364,   365,   375,     0,
+       0,   376,   366,   367,   368,   369,     0,     0,   356,     0,
+     370,   371,   372,     0,     0,   373,     0,   374,     0,   357,
+     358,   359,   360,   361,   362,   363,   364,   365,   375,     0,
+       0,   376,   366,   367,   368,   369,     0,     0,     0,   406,
+     370,   371,   372,     0,     0,   373,     0,   374,     0,   357,
+     358,   359,   360,   361,   362,   363,   364,   365,   375,     0,
+       0,   376,   366,   367,   368,   369,     0,     0,     0,     0,
+     370,   371,   372,     0,     0,   373,     0,   374,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   375,     0,
+       0,   376,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   377,   378,   379,     0,
+       0,     0,     0,     0,     0,     0,     0,   380,     0,     0,
+       0,   381,     0,   382,   108,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   377,   378,   379,     7,
+       8,     0,     0,     0,     0,     0,     0,   380,     0,     0,
+       0,   381,     0,   382,   108,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   377,   378,   379,     0,
+       0,     0,     0,     0,     0,     0,     0,   380,     0,     0,
+       0,   381,     0,   382,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   377,   378,   379,     0,
+       0,     0,     0,     0,     7,     8,     0,   380,     0,     0,
+       0,   381,     0,   382,     0,     0,     0,    24,    25,    26,
+      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+       0,     0,     0,    38,    39,    40,    41,     0,     0,    43,
+       0,     0,     0,     0,     0,   717,    49,     0,     0,    51,
+     718,     0,   719,   720,     0,     0,     0,     0,   977,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   371,   372,   373,     0,     0,     0,     0,
-       0,     0,     0,     0,   374,     0,     0,     0,   375,     0,
-     376,   108,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   371,   372,   373,     7,     8,     0,     0,
-       0,     0,     0,     0,   374,     0,     0,     0,   375,     0,
-     376,   108,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   371,   372,   373,     0,     0,     0,     0,
-       0,     0,     0,     0,   374,     0,     0,     0,   375,     0,
-     376,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   371,   372,   373,     0,     0,     0,     0,
-       0,     7,     8,     0,   374,     0,     0,     0,   375,     0,
-     376,     0,     0,     0,    24,    25,    26,    27,    28,    29,
-      30,    31,    32,    33,    34,    35,    36,     0,     0,     0,
-      38,    39,    40,    41,     0,     0,    43,     0,     0,     0,
-       0,     0,   705,    49,     0,     0,    51,   706,     0,    54,
-     707,     0,     0,     0,     0,   958,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,    71,     0,
-       0,     0,   959,     0,     0,     0,     0,     0,     0,    24,
-      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
-      35,    36,    85,    86,    87,    38,    39,    40,    41,     0,
-       0,    43,     0,     0,     0,     0,     0,   705,    49,     0,
-       0,    51,   706,     0,    54,   707,     0,     0,     0,     0,
+       0,    71,     0,     0,     0,   978,     0,     0,     0,     0,
+       0,     0,    24,    25,    26,    27,    28,    29,    30,    31,
+      32,    33,    34,    35,    36,    85,    86,    87,    38,    39,
+      40,    41,     0,     0,    43,     0,     0,     0,     0,     0,
+     717,    49,     0,     0,    51,   718,     0,   719,   720,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    71,   530,   531,   532,   533,   534,   535,
-     536,   537,   538,   539,   540,   541,   542,   666,   544,   545,
-     546,   547,     0,     0,     0,     0,   548,    85,    86,    87,
-       0,     0,     0,     0,     0,     0,   720,   530,   531,   532,
-     533,   534,   535,   536,   537,   538,   539,   540,   541,   542,
-     666,   544,   545,   546,   547,     0,     0,     0,     0,   548,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   873,
-     530,   531,   532,   533,   534,   535,   536,   537,   538,   539,
-     540,   541,   542,   666,   544,   545,   546,   547,     0,     0,
-       0,     0,   548,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   874,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   917,   530,   531,   532,   533,
-     534,   535,   536,   537,   538,   539,   540,   541,   542,   666,
-     544,   545,   546,   547,     0,     0,     0,     0,   548,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,  1058,   530,
-     531,   532,   533,   534,   535,   536,   537,   538,   539,   540,
-     541,   542,   666,   544,   545,   546,   547,     0,     0,     0,
-       0,   548,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,  1068,   530,   531,   532,   533,   534,   535,   536,   537,
-     538,   539,   540,   541,   542,   666,   544,   545,   546,   547,
-       0,     0,     0,     0,   548,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,  1069,   530,   531,   532,   533,   534,
-     535,   536,   537,   538,   539,   540,   541,   542,   666,   544,
-     545,   546,   547,     0,     0,     0,     0,   548,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,  1070,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-    1075,   530,   531,   532,   533,   534,   535,   536,   537,   538,
-     539,   540,   541,   542,   666,   544,   545,   546,   547,     0,
-       0,     0,     0,   548,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,  1076,   530,   531,   532,   533,   534,   535,
-     536,   537,   538,   539,   540,   541,   542,   666,   544,   545,
-     546,   547,     0,     0,     0,     0,   548,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,  1078,   530,   531,   532,
-     533,   534,   535,   536,   537,   538,   539,   540,   541,   542,
-     666,   544,   545,   546,   547,     0,     0,     0,     0,   548,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,  1180,
-     530,   531,   532,   533,   534,   535,   536,   537,   538,   539,
-     540,   541,   542,   666,   544,   545,   546,   547,     0,     0,
-       0,     0,   548,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,  1201,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,  1283,   530,   531,   532,   533,
-     534,   535,   536,   537,   538,   539,   540,   541,   542,   666,
-     544,   545,   546,   547,     0,     0,     0,     0,   548,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,  1367,   530,
-     531,   532,   533,   534,   535,   536,   537,   538,   539,   540,
-     541,   542,   666,   544,   545,   546,   547,     0,     0,     0,
-       0,   548,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,  1368,   530,   531,   532,   533,   534,   535,   536,   537,
-     538,   539,   540,   541,   542,   666,   544,   545,   546,   547,
-       0,     0,     0,     0,   548,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,  1410,   530,   531,   532,   533,   534,
-     535,   536,   537,   538,   539,   540,   541,   542,   666,   544,
-     545,   546,   547,     0,     0,     0,     0,   548,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,  1528,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-    1529,   530,   531,   532,   533,   534,   535,   536,   537,   538,
-     539,   540,   541,   542,   666,   544,   545,   546,   547,     0,
-       0,     0,     0,   548,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,  1530,   530,   531,   532,   533,   534,   535,
-     536,   537,   538,   539,   540,   541,   542,   666,   544,   545,
-     546,   547,     0,     0,     0,     0,   548,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,  1544,   530,   531,   532,
-     533,   534,   535,   536,   537,   538,   539,   540,   541,   542,
-     666,   544,   545,   546,   547,     0,     0,     0,     0,   548,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,  1669,
-     530,   531,   532,   533,   534,   535,   536,   537,   538,   539,
-     540,   541,   542,   666,   544,   545,   546,   547,     0,     0,
-       0,     0,   548,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,  1780,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,  1781,   530,   531,   532,   533,
-     534,   535,   536,   537,   538,   539,   540,   541,   542,   666,
-     544,   545,   546,   547,     0,     0,     0,     0,   548,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,  1804,   530,
-     531,   532,   533,   534,   535,   536,   537,   538,   539,   540,
-     541,   542,   666,   544,   545,   546,   547,     0,     0,     0,
-       0,   548,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,  1807,   530,   531,   532,   533,   534,   535,   536,   537,
-     538,   539,   540,   541,   542,   666,   544,   545,   546,   547,
-       0,     0,     0,     0,   548,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,  1873,   530,   531,   532,   533,   534,
-     535,   536,   537,   538,   539,   540,   541,   542,   666,   544,
-     545,   546,   547,     0,     0,     0,     0,   548,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,  1924,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-    1925,   530,   531,   532,   533,   534,   535,   536,   537,   538,
-     539,   540,   541,   542,   666,   544,   545,   546,   547,     0,
-       0,     0,     0,   548,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,  1937,   530,   531,   532,   533,   534,   535,
-     536,   537,   538,   539,   540,   541,   542,   666,   544,   545,
-     546,   547,     0,     0,     0,     0,   548,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,  1939,   530,   531,   532,
-     533,   534,   535,   536,   537,   538,   539,   540,   541,   542,
-     666,   544,   545,   546,   547,     0,     0,     0,     0,   548,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,  1971,
-     530,   531,   532,   533,   534,   535,   536,   537,   538,   539,
-     540,   541,   542,   666,   544,   545,   546,   547,     0,     0,
-       0,     0,   548,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,  1998,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,  2003,   530,   531,   532,   533,
-     534,   535,   536,   537,   538,   539,   540,   541,   542,   666,
-     544,   545,   546,   547,     0,     0,     0,     0,   548,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,  2004,   530,
-     531,   532,   533,   534,   535,   536,   537,   538,   539,   540,
-     541,   542,   666,   544,   545,   546,   547,     0,     0,     0,
-       0,   548,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,  2005,   530,   531,   532,   533,   534,   535,   536,   537,
-     538,   539,   540,   541,   542,   666,   544,   545,   546,   547,
-       0,     0,     0,     0,   548,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,  2044,   530,   531,   532,   533,   534,
-     535,   536,   537,   538,   539,   540,   541,   542,   666,   544,
-     545,   546,   547,     0,     0,     0,     0,   548,     0,     0,
-       0,     0,     0,  1087,   530,   531,   532,   533,   534,   535,
-     536,   537,   538,   539,   540,   541,   542,   666,   544,   545,
-     546,   547,     0,     0,     0,     0,   548,     0,     0,     0,
-       0,     0,  1128,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,     0,     0,     0,
-       0,  1159,   530,   531,   532,   533,   534,   535,   536,   537,
-     538,   539,   540,   541,   542,   666,   544,   545,   546,   547,
-       0,     0,     0,     0,   548,     0,     0,     0,     0,     0,
-    1177,   530,   531,   532,   533,   534,   535,   536,   537,   538,
-     539,   540,   541,   542,   666,   544,   545,   546,   547,     0,
-       0,     0,     0,   548,     0,     0,     0,     0,     0,  1233,
-     530,   531,   532,   533,   534,   535,   536,   537,   538,   539,
-     540,   541,   542,   666,   544,   545,   546,   547,     0,     0,
-       0,     0,   548,     0,     0,     0,     0,     0,  1326,   530,
-     531,   532,   533,   534,   535,   536,   537,   538,   539,   540,
-     541,   542,   666,   544,   545,   546,   547,     0,     0,     0,
-       0,   548,     0,     0,     0,     0,     0,  1369,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,     0,     0,     0,     0,  1441,   530,   531,   532,
-     533,   534,   535,   536,   537,   538,   539,   540,   541,   542,
-     666,   544,   545,   546,   547,     0,     0,     0,     0,   548,
-       0,     0,     0,     0,     0,  1442,   530,   531,   532,   533,
-     534,   535,   536,   537,   538,   539,   540,   541,   542,   666,
-     544,   545,   546,   547,     0,     0,     0,     0,   548,     0,
-       0,     0,     0,     0,  1443,   530,   531,   532,   533,   534,
-     535,   536,   537,   538,   539,   540,   541,   542,   666,   544,
-     545,   546,   547,     0,     0,     0,     0,   548,     0,     0,
-       0,     0,     0,  1444,   530,   531,   532,   533,   534,   535,
-     536,   537,   538,   539,   540,   541,   542,   666,   544,   545,
-     546,   547,     0,     0,     0,     0,   548,     0,     0,     0,
-       0,     0,  1712,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,     0,     0,     0,
-       0,  1723,   530,   531,   532,   533,   534,   535,   536,   537,
-     538,   539,   540,   541,   542,   666,   544,   545,   546,   547,
-       0,     0,     0,     0,   548,     0,     0,     0,     0,     0,
-    1760,   530,   531,   532,   533,   534,   535,   536,   537,   538,
-     539,   540,   541,   542,   666,   544,   545,   546,   547,     0,
-       0,     0,     0,   548,     0,     0,     0,     0,     0,  1823,
-     530,   531,   532,   533,   534,   535,   536,   537,   538,   539,
-     540,   541,   542,   666,   544,   545,   546,   547,     0,     0,
-       0,     0,   548,     0,     0,     0,     0,     0,  1838,   530,
-     531,   532,   533,   534,   535,   536,   537,   538,   539,   540,
-     541,   542,   666,   544,   545,   546,   547,     0,     0,     0,
-       0,   548,     0,     0,     0,     0,     0,  1850,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,     0,     0,     0,     0,  1887,   530,   531,   532,
-     533,   534,   535,   536,   537,   538,   539,   540,   541,   542,
-     666,   544,   545,   546,   547,     0,     0,     0,     0,   548,
-       0,     0,     0,     0,     0,  1904,   530,   531,   532,   533,
-     534,   535,   536,   537,   538,   539,   540,   541,   542,   666,
-     544,   545,   546,   547,     0,     0,     0,     0,   548,     0,
-       0,     0,     0,     0,  1913,   530,   531,   532,   533,   534,
-     535,   536,   537,   538,   539,   540,   541,   542,   666,   544,
-     545,   546,   547,     0,     0,     0,     0,   548,     0,     0,
-       0,     0,     0,  1914,   530,   531,   532,   533,   534,   535,
-     536,   537,   538,   539,   540,   541,   542,   666,   544,   545,
-     546,   547,     0,     0,     0,     0,   548,     0,     0,     0,
-       0,     0,  1935,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,     0,     0,     0,
-       0,  1984,   530,   531,   532,   533,   534,   535,   536,   537,
-     538,   539,   540,   541,   542,   666,   544,   545,   546,   547,
-       0,     0,     0,     0,   548,     0,     0,     0,     0,     0,
-    2023,   530,   531,   532,   533,   534,   535,   536,   537,   538,
-     539,   540,   541,   542,   666,   544,   545,   546,   547,     0,
-       0,     0,     0,   548,     0,     0,     0,     0,     0,  2042,
-     530,   531,   532,   533,   534,   535,   536,   537,   538,   539,
-     540,   541,   542,   666,   544,   545,   546,   547,     0,     0,
-       0,     0,   548,     0,     0,     0,     0,     0,  2062,   530,
-     531,   532,   533,   534,   535,   536,   537,   538,   539,   540,
-     541,   542,   666,   544,   545,   546,   547,     0,     0,     0,
-       0,   548,     0,     0,     0,     0,     0,  2063,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,     0,     0,     0,     0,  2064,   530,   531,   532,
-     533,   534,   535,   536,   537,   538,   539,   540,   541,   542,
-     666,   544,   545,   546,   547,     0,     0,     0,     0,   548,
-       0,     0,     0,     0,   667,   530,   531,   532,   533,   534,
-     535,   536,   537,   538,   539,   540,   541,   542,   666,   544,
-     545,   546,   547,     0,     0,     0,     0,   548,     0,     0,
-       0,     0,   865,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,     0,     0,     0,
-    1816,   530,   531,   532,   533,   534,   535,   536,   537,   538,
-     539,   540,   541,   542,   666,   544,   545,   546,   547,     0,
-       0,     0,     0,   548,     0,   692,     0,   693,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,     0,     0,   923,   530,   531,   532,   533,   534,
-     535,   536,   537,   538,   539,   540,   541,   542,   666,   544,
-     545,   546,   547,     0,     0,     0,     0,   548,     0,     0,
-       0,   972,   530,   531,   532,   533,   534,   535,   536,   537,
-     538,   539,   540,   541,   542,   666,   544,   545,   546,   547,
-       0,     0,     0,     0,   548,     0,     0,     0,  1109,   530,
-     531,   532,   533,   534,   535,   536,   537,   538,   539,   540,
-     541,   542,   666,   544,   545,   546,   547,     0,     0,     0,
-       0,   548,     0,     0,     0,  1172,   530,   531,   532,   533,
-     534,   535,   536,   537,   538,   539,   540,   541,   542,   666,
-     544,   545,   546,   547,     0,     0,     0,     0,   548,     0,
-       0,     0,  1173,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,     0,     0,  1178,
-     530,   531,   532,   533,   534,   535,   536,   537,   538,   539,
-     540,   541,   542,   666,   544,   545,   546,   547,     0,     0,
-       0,     0,   548,     0,     0,     0,  1179,   530,   531,   532,
-     533,   534,   535,   536,   537,   538,   539,   540,   541,   542,
-     666,   544,   545,   546,   547,     0,     0,     0,     0,   548,
-       0,     0,     0,  1269,   530,   531,   532,   533,   534,   535,
-     536,   537,   538,   539,   540,   541,   542,   666,   544,   545,
-     546,   547,     0,     0,     0,     0,   548,     0,     0,     0,
-    1280,   530,   531,   532,   533,   534,   535,   536,   537,   538,
-     539,   540,   541,   542,   666,   544,   545,   546,   547,     0,
-       0,     0,     0,   548,     0,     0,     0,  1473,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,     0,     0,  1550,   530,   531,   532,   533,   534,
-     535,   536,   537,   538,   539,   540,   541,   542,   666,   544,
-     545,   546,   547,     0,     0,     0,     0,   548,     0,     0,
-       0,  1597,   530,   531,   532,   533,   534,   535,   536,   537,
-     538,   539,   540,   541,   542,   666,   544,   545,   546,   547,
-       0,     0,     0,     0,   548,     0,     0,     0,  1772,   530,
-     531,   532,   533,   534,   535,   536,   537,   538,   539,   540,
-     541,   542,   666,   544,   545,   546,   547,     0,     0,     0,
-       0,   548,     0,     0,     0,  1809,   530,   531,   532,   533,
-     534,   535,   536,   537,   538,   539,   540,   541,   542,   666,
-     544,   545,   546,   547,     0,     0,     0,     0,   548,     0,
-       0,     0,  1824,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,   737,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,   738,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,   739,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,   741,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,   742,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,   743,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,   745,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,   746,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,   747,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,   748,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,   749,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,   750,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,   751,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,   753,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,   754,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,   755,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,   816,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,   850,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,   894,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,   912,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,   913,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,   914,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,   915,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,   921,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,   922,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,   957,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,   971,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,  1025,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,  1029,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,  1041,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,  1108,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,  1117,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,  1118,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,  1119,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,  1129,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,  1158,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,  1160,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,  1161,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,  1162,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,  1163,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,  1164,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,  1165,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,  1166,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,  1171,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,  1268,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,  1279,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,  1474,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,  1536,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,  1549,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,  1660,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,  1662,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,  1663,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,  1668,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,  1713,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,  1722,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,  1745,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,  1808,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,  1871,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,  1872,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548,     0,  1997,   530,   531,   532,   533,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   666,   544,   545,   546,
-     547,     0,     0,     0,     0,   548,     0,  2039,   530,   531,
-     532,   533,   534,   535,   536,   537,   538,   539,   540,   541,
-     542,   666,   544,   545,   546,   547,     0,     0,     0,     0,
-     548
+       0,     0,     0,     0,     0,     0,    71,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+      85,    86,    87,     0,     0,     0,     0,     0,     0,   890,
+     539,   540,   541,   542,   543,   544,   545,   546,   547,   548,
+     549,   550,   551,   678,   553,   554,   555,   556,     0,     0,
+       0,     0,   557,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   934,   539,   540,   541,   542,   543,   544,   545,
+     546,   547,   548,   549,   550,   551,   678,   553,   554,   555,
+     556,     0,     0,     0,     0,   557,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,  1078,   539,   540,   541,   542,
+     543,   544,   545,   546,   547,   548,   549,   550,   551,   678,
+     553,   554,   555,   556,     0,     0,     0,     0,   557,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,  1088,   539,
+     540,   541,   542,   543,   544,   545,   546,   547,   548,   549,
+     550,   551,   678,   553,   554,   555,   556,     0,     0,     0,
+       0,   557,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,  1089,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,  1090,   539,   540,   541,   542,   543,
+     544,   545,   546,   547,   548,   549,   550,   551,   678,   553,
+     554,   555,   556,     0,     0,     0,     0,   557,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,  1095,   539,   540,
+     541,   542,   543,   544,   545,   546,   547,   548,   549,   550,
+     551,   678,   553,   554,   555,   556,     0,     0,     0,     0,
+     557,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+    1096,   539,   540,   541,   542,   543,   544,   545,   546,   547,
+     548,   549,   550,   551,   678,   553,   554,   555,   556,     0,
+       0,     0,     0,   557,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,  1098,   539,   540,   541,   542,   543,   544,
+     545,   546,   547,   548,   549,   550,   551,   678,   553,   554,
+     555,   556,     0,     0,     0,     0,   557,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,  1203,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,  1224,
+     539,   540,   541,   542,   543,   544,   545,   546,   547,   548,
+     549,   550,   551,   678,   553,   554,   555,   556,     0,     0,
+       0,     0,   557,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,  1308,   539,   540,   541,   542,   543,   544,   545,
+     546,   547,   548,   549,   550,   551,   678,   553,   554,   555,
+     556,     0,     0,     0,     0,   557,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,  1392,   539,   540,   541,   542,
+     543,   544,   545,   546,   547,   548,   549,   550,   551,   678,
+     553,   554,   555,   556,     0,     0,     0,     0,   557,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,  1393,   539,
+     540,   541,   542,   543,   544,   545,   546,   547,   548,   549,
+     550,   551,   678,   553,   554,   555,   556,     0,     0,     0,
+       0,   557,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,  1435,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,  1556,   539,   540,   541,   542,   543,
+     544,   545,   546,   547,   548,   549,   550,   551,   678,   553,
+     554,   555,   556,     0,     0,     0,     0,   557,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,  1557,   539,   540,
+     541,   542,   543,   544,   545,   546,   547,   548,   549,   550,
+     551,   678,   553,   554,   555,   556,     0,     0,     0,     0,
+     557,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+    1558,   539,   540,   541,   542,   543,   544,   545,   546,   547,
+     548,   549,   550,   551,   678,   553,   554,   555,   556,     0,
+       0,     0,     0,   557,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,  1572,   539,   540,   541,   542,   543,   544,
+     545,   546,   547,   548,   549,   550,   551,   678,   553,   554,
+     555,   556,     0,     0,     0,     0,   557,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,  1700,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,  1811,
+     539,   540,   541,   542,   543,   544,   545,   546,   547,   548,
+     549,   550,   551,   678,   553,   554,   555,   556,     0,     0,
+       0,     0,   557,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,  1812,   539,   540,   541,   542,   543,   544,   545,
+     546,   547,   548,   549,   550,   551,   678,   553,   554,   555,
+     556,     0,     0,     0,     0,   557,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,  1837,   539,   540,   541,   542,
+     543,   544,   545,   546,   547,   548,   549,   550,   551,   678,
+     553,   554,   555,   556,     0,     0,     0,     0,   557,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,  1840,   539,
+     540,   541,   542,   543,   544,   545,   546,   547,   548,   549,
+     550,   551,   678,   553,   554,   555,   556,     0,     0,     0,
+       0,   557,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,  1906,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,  1957,   539,   540,   541,   542,   543,
+     544,   545,   546,   547,   548,   549,   550,   551,   678,   553,
+     554,   555,   556,     0,     0,     0,     0,   557,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,  1958,   539,   540,
+     541,   542,   543,   544,   545,   546,   547,   548,   549,   550,
+     551,   678,   553,   554,   555,   556,     0,     0,     0,     0,
+     557,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+    1970,   539,   540,   541,   542,   543,   544,   545,   546,   547,
+     548,   549,   550,   551,   678,   553,   554,   555,   556,     0,
+       0,     0,     0,   557,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,  1972,   539,   540,   541,   542,   543,   544,
+     545,   546,   547,   548,   549,   550,   551,   678,   553,   554,
+     555,   556,     0,     0,     0,     0,   557,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,  2004,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,  2031,
+     539,   540,   541,   542,   543,   544,   545,   546,   547,   548,
+     549,   550,   551,   678,   553,   554,   555,   556,     0,     0,
+       0,     0,   557,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,  2036,   539,   540,   541,   542,   543,   544,   545,
+     546,   547,   548,   549,   550,   551,   678,   553,   554,   555,
+     556,     0,     0,     0,     0,   557,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,  2037,   539,   540,   541,   542,
+     543,   544,   545,   546,   547,   548,   549,   550,   551,   678,
+     553,   554,   555,   556,     0,     0,     0,     0,   557,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,  2038,   539,
+     540,   541,   542,   543,   544,   545,   546,   547,   548,   549,
+     550,   551,   678,   553,   554,   555,   556,     0,     0,     0,
+       0,   557,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,  2077,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,     0,     0,     0,     0,
+    1013,   539,   540,   541,   542,   543,   544,   545,   546,   547,
+     548,   549,   550,   551,   678,   553,   554,   555,   556,     0,
+       0,     0,     0,   557,     0,     0,     0,     0,     0,  1065,
+     539,   540,   541,   542,   543,   544,   545,   546,   547,   548,
+     549,   550,   551,   678,   553,   554,   555,   556,     0,     0,
+       0,     0,   557,     0,     0,     0,     0,     0,  1108,   539,
+     540,   541,   542,   543,   544,   545,   546,   547,   548,   549,
+     550,   551,   678,   553,   554,   555,   556,     0,     0,     0,
+       0,   557,     0,     0,     0,     0,     0,  1109,   539,   540,
+     541,   542,   543,   544,   545,   546,   547,   548,   549,   550,
+     551,   678,   553,   554,   555,   556,     0,     0,     0,     0,
+     557,     0,     0,     0,     0,     0,  1151,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,     0,     0,     0,     0,  1182,   539,   540,   541,   542,
+     543,   544,   545,   546,   547,   548,   549,   550,   551,   678,
+     553,   554,   555,   556,     0,     0,     0,     0,   557,     0,
+       0,     0,     0,     0,  1200,   539,   540,   541,   542,   543,
+     544,   545,   546,   547,   548,   549,   550,   551,   678,   553,
+     554,   555,   556,     0,     0,     0,     0,   557,     0,     0,
+       0,     0,     0,  1256,   539,   540,   541,   542,   543,   544,
+     545,   546,   547,   548,   549,   550,   551,   678,   553,   554,
+     555,   556,     0,     0,     0,     0,   557,     0,     0,     0,
+       0,     0,  1351,   539,   540,   541,   542,   543,   544,   545,
+     546,   547,   548,   549,   550,   551,   678,   553,   554,   555,
+     556,     0,     0,     0,     0,   557,     0,     0,     0,     0,
+       0,  1394,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,     0,     0,     0,     0,
+    1466,   539,   540,   541,   542,   543,   544,   545,   546,   547,
+     548,   549,   550,   551,   678,   553,   554,   555,   556,     0,
+       0,     0,     0,   557,     0,     0,     0,     0,     0,  1467,
+     539,   540,   541,   542,   543,   544,   545,   546,   547,   548,
+     549,   550,   551,   678,   553,   554,   555,   556,     0,     0,
+       0,     0,   557,     0,     0,     0,     0,     0,  1468,   539,
+     540,   541,   542,   543,   544,   545,   546,   547,   548,   549,
+     550,   551,   678,   553,   554,   555,   556,     0,     0,     0,
+       0,   557,     0,     0,     0,     0,     0,  1469,   539,   540,
+     541,   542,   543,   544,   545,   546,   547,   548,   549,   550,
+     551,   678,   553,   554,   555,   556,     0,     0,     0,     0,
+     557,     0,     0,     0,     0,     0,  1743,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,     0,     0,     0,     0,  1754,   539,   540,   541,   542,
+     543,   544,   545,   546,   547,   548,   549,   550,   551,   678,
+     553,   554,   555,   556,     0,     0,     0,     0,   557,     0,
+       0,     0,     0,     0,  1791,   539,   540,   541,   542,   543,
+     544,   545,   546,   547,   548,   549,   550,   551,   678,   553,
+     554,   555,   556,     0,     0,     0,     0,   557,     0,     0,
+       0,     0,     0,  1856,   539,   540,   541,   542,   543,   544,
+     545,   546,   547,   548,   549,   550,   551,   678,   553,   554,
+     555,   556,     0,     0,     0,     0,   557,     0,     0,     0,
+       0,     0,  1871,   539,   540,   541,   542,   543,   544,   545,
+     546,   547,   548,   549,   550,   551,   678,   553,   554,   555,
+     556,     0,     0,     0,     0,   557,     0,     0,     0,     0,
+       0,  1883,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,     0,     0,     0,     0,
+    1920,   539,   540,   541,   542,   543,   544,   545,   546,   547,
+     548,   549,   550,   551,   678,   553,   554,   555,   556,     0,
+       0,     0,     0,   557,     0,     0,     0,     0,     0,  1937,
+     539,   540,   541,   542,   543,   544,   545,   546,   547,   548,
+     549,   550,   551,   678,   553,   554,   555,   556,     0,     0,
+       0,     0,   557,     0,     0,     0,     0,     0,  1946,   539,
+     540,   541,   542,   543,   544,   545,   546,   547,   548,   549,
+     550,   551,   678,   553,   554,   555,   556,     0,     0,     0,
+       0,   557,     0,     0,     0,     0,     0,  1947,   539,   540,
+     541,   542,   543,   544,   545,   546,   547,   548,   549,   550,
+     551,   678,   553,   554,   555,   556,     0,     0,     0,     0,
+     557,     0,     0,     0,     0,     0,  1968,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,     0,     0,     0,     0,  2017,   539,   540,   541,   542,
+     543,   544,   545,   546,   547,   548,   549,   550,   551,   678,
+     553,   554,   555,   556,     0,     0,     0,     0,   557,     0,
+       0,     0,     0,     0,  2056,   539,   540,   541,   542,   543,
+     544,   545,   546,   547,   548,   549,   550,   551,   678,   553,
+     554,   555,   556,     0,     0,     0,     0,   557,     0,     0,
+       0,     0,     0,  2075,   539,   540,   541,   542,   543,   544,
+     545,   546,   547,   548,   549,   550,   551,   678,   553,   554,
+     555,   556,     0,     0,     0,     0,   557,     0,     0,     0,
+       0,     0,  2095,   539,   540,   541,   542,   543,   544,   545,
+     546,   547,   548,   549,   550,   551,   678,   553,   554,   555,
+     556,     0,     0,     0,     0,   557,     0,     0,     0,     0,
+       0,  2096,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,     0,     0,     0,     0,
+    2097,   539,   540,   541,   542,   543,   544,   545,   546,   547,
+     548,   549,   550,   551,   678,   553,   554,   555,   556,     0,
+       0,     0,     0,   557,     0,     0,     0,     0,   679,   539,
+     540,   541,   542,   543,   544,   545,   546,   547,   548,   549,
+     550,   551,   678,   553,   554,   555,   556,     0,     0,     0,
+       0,   557,     0,     0,     0,     0,   881,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,     0,     0,     0,  1849,   539,   540,   541,   542,   543,
+     544,   545,   546,   547,   548,   549,   550,   551,   678,   553,
+     554,   555,   556,     0,     0,     0,     0,   557,     0,   704,
+       0,   705,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,     0,     0,   940,   539,
+     540,   541,   542,   543,   544,   545,   546,   547,   548,   549,
+     550,   551,   678,   553,   554,   555,   556,     0,     0,     0,
+       0,   557,     0,     0,     0,   991,   539,   540,   541,   542,
+     543,   544,   545,   546,   547,   548,   549,   550,   551,   678,
+     553,   554,   555,   556,     0,     0,     0,     0,   557,     0,
+       0,     0,  1132,   539,   540,   541,   542,   543,   544,   545,
+     546,   547,   548,   549,   550,   551,   678,   553,   554,   555,
+     556,     0,     0,     0,     0,   557,     0,     0,     0,  1195,
+     539,   540,   541,   542,   543,   544,   545,   546,   547,   548,
+     549,   550,   551,   678,   553,   554,   555,   556,     0,     0,
+       0,     0,   557,     0,     0,     0,  1196,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,     0,     0,  1201,   539,   540,   541,   542,   543,   544,
+     545,   546,   547,   548,   549,   550,   551,   678,   553,   554,
+     555,   556,     0,     0,     0,     0,   557,     0,     0,     0,
+    1202,   539,   540,   541,   542,   543,   544,   545,   546,   547,
+     548,   549,   550,   551,   678,   553,   554,   555,   556,     0,
+       0,     0,     0,   557,     0,     0,     0,  1292,   539,   540,
+     541,   542,   543,   544,   545,   546,   547,   548,   549,   550,
+     551,   678,   553,   554,   555,   556,     0,     0,     0,     0,
+     557,     0,     0,     0,  1305,   539,   540,   541,   542,   543,
+     544,   545,   546,   547,   548,   549,   550,   551,   678,   553,
+     554,   555,   556,     0,     0,     0,     0,   557,     0,     0,
+       0,  1498,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,     0,     0,  1578,   539,
+     540,   541,   542,   543,   544,   545,   546,   547,   548,   549,
+     550,   551,   678,   553,   554,   555,   556,     0,     0,     0,
+       0,   557,     0,     0,     0,  1625,   539,   540,   541,   542,
+     543,   544,   545,   546,   547,   548,   549,   550,   551,   678,
+     553,   554,   555,   556,     0,     0,     0,     0,   557,     0,
+       0,     0,  1803,   539,   540,   541,   542,   543,   544,   545,
+     546,   547,   548,   549,   550,   551,   678,   553,   554,   555,
+     556,     0,     0,     0,     0,   557,     0,     0,     0,  1842,
+     539,   540,   541,   542,   543,   544,   545,   546,   547,   548,
+     549,   550,   551,   678,   553,   554,   555,   556,     0,     0,
+       0,     0,   557,     0,     0,     0,  1857,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,   750,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,   751,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,   752,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,   754,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,   755,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,   756,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,   758,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,   759,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,   760,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,   761,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,   762,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,   763,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,   764,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,   766,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,   767,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,   768,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,   831,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,   866,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,   910,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,   928,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,   930,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,   931,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,   932,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,   938,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,   939,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,   976,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,   990,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,  1045,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,  1049,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,  1061,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,  1131,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,  1140,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,  1141,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,  1142,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,  1152,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,  1181,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,  1183,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,  1184,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,  1185,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,  1186,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,  1187,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,  1188,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,  1189,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,  1194,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,  1291,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,  1304,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,  1499,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,  1564,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,  1577,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,  1688,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,  1690,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,  1693,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,  1699,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,  1744,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,  1753,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,  1776,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,  1841,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,  1904,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,  1905,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557,     0,  2030,   539,   540,   541,
+     542,   543,   544,   545,   546,   547,   548,   549,   550,   551,
+     678,   553,   554,   555,   556,     0,     0,     0,     0,   557,
+       0,  2072,   539,   540,   541,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,   678,   553,   554,   555,   556,
+       0,     0,     0,     0,   557
 };
 
 static const yytype_int16 yycheck[] =
 {
-       3,   134,     3,     3,   287,   147,   584,   585,  1153,  1332,
-     671,   299,     4,   687,  1157,     4,   187,    99,    21,   101,
-      48,   695,  1628,    21,  1630,     4,     4,     4,     4,   317,
-       4,     4,  1791,     5,     4,     4,  1585,    97,     5,     4,
-       6,   702,     5,     7,     6,    48,     6,     6,  1615,     6,
-       4,   129,   134,    54,     4,   240,   717,     6,     4,     4,
-     242,     6,     4,   248,   725,    97,   248,     7,   146,   239,
-       4,   241,    75,   227,   228,   157,   154,   155,   156,   149,
-      83,     6,   160,   161,     7,    88,    97,   119,     4,   243,
-     227,   228,   129,     9,     6,   383,    99,   385,     9,   227,
-     228,   272,   273,   274,   174,   393,     9,  1674,   119,   146,
-       6,   248,   227,   228,    84,     9,     9,   154,   155,   156,
-     190,   191,   245,   160,   161,   248,   227,   228,     9,   227,
-     228,   134,   239,   248,   241,   135,   139,   140,  1687,   310,
-     311,   312,     9,   239,   147,   241,    91,   248,     6,     6,
-     248,   179,   248,   227,   228,   158,   327,   818,   100,   101,
-      61,    62,    91,    64,   240,    94,   244,   240,    97,   227,
-     228,   174,   248,  1932,   248,   248,   179,    94,   240,   182,
-      97,   110,    99,   245,   187,   188,   164,   165,   166,   167,
-     248,   227,   228,   110,     7,    97,   162,    99,     7,   133,
-     134,   135,   136,   162,     7,   177,   245,   244,   247,   237,
-       7,   240,   248,   242,   148,   185,   189,   151,  1541,   248,
-     174,   175,   211,     0,   174,   175,   227,   240,   227,   228,
-     236,   237,   211,    14,   237,   248,     7,   211,   239,   245,
-    1385,   211,   211,   271,   240,   244,   211,   250,   239,   241,
-     253,   254,   248,   281,   243,   247,   254,   285,     6,     7,
-     222,   223,   239,   239,  1813,   268,   244,   246,   271,   272,
-     273,   274,   243,   243,   243,   240,   243,   242,   281,   239,
-     243,   245,   285,   243,   287,   573,   243,   575,   576,   212,
-     213,   214,   215,   239,   243,   211,   239,   971,   972,   239,
-     134,   241,   227,   228,   592,   139,   140,   310,   311,   312,
-     240,     8,   242,   236,   237,   227,   228,   399,  1867,     6,
-     236,   237,   245,   239,   327,   241,     6,   243,   239,   245,
-     241,   227,   228,   240,   245,   242,   239,     6,   241,   510,
-     174,   248,   630,   236,   237,   239,   239,   241,   241,   242,
-      94,   245,   245,    97,   188,   236,   237,   242,   239,  1965,
-     241,     4,   504,   248,   245,   222,   223,   395,   396,   236,
-     237,   239,   239,   241,   241,   227,   228,   245,   245,   667,
-     248,    94,     6,   411,    97,   239,    99,   390,   391,   290,
-     291,    94,   395,   396,    97,   241,   248,   298,   299,   212,
-     213,   214,   215,   212,   213,   214,   215,   110,   411,   212,
-     213,   214,   215,   240,   417,   212,   213,   214,   215,     6,
-     421,   248,     6,   236,   237,   232,   233,   236,   237,   227,
-     228,   238,  1093,   515,  1095,   438,   227,   228,   129,   236,
-     237,   212,   213,   214,   215,   239,  1107,   241,    91,   243,
-     248,  2000,    95,   227,   228,   146,   241,   248,   101,   102,
-     463,   104,   105,   154,   155,   156,   227,   228,   240,   160,
-     161,   227,   228,   501,   248,   239,   248,   241,   112,   243,
-     123,   509,  1805,   486,   227,   228,   240,   248,   242,   243,
-     493,   494,   248,   227,   228,   498,   638,   500,   501,   502,
-     503,   504,   239,  2052,   507,   248,   509,   510,   511,   512,
-     513,   514,   239,   516,   248,   518,   514,   239,   516,   216,
-     217,   218,   219,   220,   221,   222,   223,   224,   225,   226,
-     227,   228,   229,   230,   231,   232,   233,   227,   228,   239,
-     543,   238,   227,   228,   227,   228,   549,   244,    97,   227,
-     228,   227,   228,  1214,   687,   239,   390,   241,   248,  1220,
-     243,   129,   239,   248,   243,   568,   569,   239,   247,   651,
-     248,   243,   248,   129,   227,   228,   227,   228,   146,   236,
-     237,   869,   227,   228,   584,   585,   154,   155,   156,   590,
-     146,   239,   160,   161,   240,   248,   242,   248,   154,   155,
-     156,   239,   248,   248,   160,   161,  1267,   239,   227,   228,
-     611,   614,   615,   616,   227,   228,   239,  1278,   241,    91,
-     239,   239,    94,  1284,   243,    97,   239,    99,   239,   239,
-     243,   241,   243,   636,   637,   638,   639,   640,   641,   642,
-     643,   644,   129,   646,   647,   648,   649,   650,   239,   652,
-     653,   654,   655,   656,   736,     6,   659,   655,   243,   240,
-     661,   242,   663,   239,   498,   668,   500,   248,   502,   503,
-       4,   240,     6,   242,   675,   239,   244,   511,   512,   248,
-     243,   582,   583,   243,  1358,   244,   587,    91,   244,   248,
-      94,   694,   239,    97,   241,    99,   699,   239,   227,   228,
-     236,   237,   236,   237,   244,    94,   110,   243,   248,   243,
-     713,   714,   239,   846,   243,   239,   719,   133,   134,   722,
-     723,   239,   244,   139,   244,   728,   248,   730,   248,   216,
-     217,   218,   219,   220,   221,   222,   223,   224,   225,   226,
-     227,   228,   229,   230,   231,   232,   233,   133,   134,   239,
-     244,   238,    97,   139,   248,   239,   759,   243,   761,   221,
+       3,   593,   594,   292,    55,   699,  1180,  1357,   683,     3,
+       3,   147,  1613,   707,     4,     7,  1176,    48,    21,  1656,
+       4,  1658,     4,    21,   179,     4,     6,     4,     6,     4,
+       4,     4,   187,  1824,     4,    99,     5,   101,     5,   714,
+       4,     4,    97,     5,  1643,    48,     6,     4,     4,    97,
+       4,   240,     9,     5,     0,   730,   304,     4,     6,   248,
+      54,     6,     4,   738,   119,   240,   134,     4,     6,     4,
+     134,   119,    75,   248,   322,    14,     7,   227,   228,     9,
+      83,     4,   129,     6,   240,    88,   242,   236,   237,   227,
+     228,     9,   248,   157,   244,     7,    99,   240,     9,   146,
+       6,     6,    84,   227,   228,   248,  1705,   154,   155,   156,
+     248,   240,     9,   160,   161,     6,   245,  1718,   240,   274,
+     275,   276,     9,   242,   248,     6,   248,   242,     6,   248,
+       9,   134,   240,   248,     6,    91,   139,   140,    97,    95,
+     248,   389,   135,   391,   147,   101,   102,   149,   104,   105,
+     239,   399,   241,    61,    62,   158,    64,   239,   833,   248,
+     315,   316,   317,   100,   101,   227,   228,   123,    91,   243,
+       7,   174,   174,   247,  1965,    94,   179,   332,    97,   182,
+     164,   165,   166,   167,   187,   188,   248,   239,   190,   191,
+     240,   133,   134,   135,   136,     7,    94,   244,   248,    97,
+     129,    99,   162,   185,   174,   175,   148,   238,     6,   151,
+     240,   174,   175,   239,   162,   241,   189,   146,   248,  1569,
+     240,   211,   242,   227,   228,   154,   155,   156,   248,   211,
+     239,   160,   161,   227,   211,   238,   211,   211,   134,   243,
+     236,   237,   273,   139,   140,  1846,   240,     6,   251,   245,
+    1410,   254,   255,   245,   211,   286,   246,   255,     6,   290,
+     244,   243,   241,   243,   211,   243,   243,   270,   247,   243,
+     273,   274,   275,   276,   243,   239,   243,     6,   174,   236,
+     237,   243,   239,   286,   241,   239,   243,   290,   245,   292,
+       6,   243,   188,   240,   239,   242,   990,   991,   243,  1900,
+     212,   213,   214,   215,   239,   241,   236,   237,   239,   239,
+     241,   241,   315,   316,   317,   245,   222,   223,   236,   237,
+       8,   239,   239,   241,   236,   237,   243,   245,   239,   332,
+     241,   222,   223,   245,   582,   338,   584,   585,   241,   236,
+     237,   405,   239,   243,   241,   242,   227,   228,   245,   227,
+     228,   239,   239,   601,   241,   227,   228,   239,   245,     7,
+     239,  1998,   241,   518,   227,   228,   245,     6,   227,   228,
+     401,   402,   236,   237,   510,   212,   213,   214,   215,   243,
+       4,     5,   239,   227,   228,   248,   417,   295,   296,   248,
+     236,   237,   640,   396,   397,   303,   304,   243,   401,   402,
+     212,   213,   214,   215,   248,    94,   239,   239,    97,   241,
+      99,   232,   233,   245,   417,   239,   248,   238,   227,   228,
+     423,   110,    46,    47,    48,    49,    50,    51,    52,    53,
+      54,   679,  2033,   427,   239,    59,    60,    61,    62,   248,
+    1115,   444,  1117,    67,    68,    69,   129,    97,    72,    99,
+      74,   227,   228,   227,   228,  1130,   239,   239,   182,   523,
+     243,    85,    91,   146,    88,    94,   469,   243,    97,   239,
+      99,   154,   155,   156,   248,   239,   507,   160,   161,    91,
+     112,   110,    94,   244,  2085,    97,   517,   248,  1838,   492,
+       7,   244,   227,   228,   239,   248,   499,   500,   110,   239,
+     396,   504,   126,   506,   507,   508,   509,   510,   245,   239,
+     513,   248,   648,   248,   517,   518,   519,   520,   521,   522,
+     239,   524,   241,   526,   522,   245,   524,   247,   216,   217,
+     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
+     228,   229,   230,   231,   232,   233,   270,   227,   228,   552,
+     238,   227,   228,     6,     7,   558,   244,   227,   228,   239,
+     239,   244,  1237,   243,   212,   213,   214,   215,  1243,   193,
+     194,   195,   248,   239,   577,   578,     7,   240,   248,   242,
+     204,   227,   228,   239,   208,   248,   210,   211,   236,   237,
+     227,   228,   243,   227,   228,   244,   240,   661,   242,   248,
+     593,   594,   248,   244,   248,   599,     8,   248,   504,    97,
+     506,   248,   508,   509,   248,  1290,   240,   239,   242,   243,
+     623,   624,   625,   519,   520,   244,   620,    91,  1303,   248,
+      94,   699,   239,    97,  1309,    99,    94,   885,   239,    97,
+     241,   243,   243,   646,   647,   648,   649,   650,   651,   652,
+     653,   654,   110,   656,   657,   658,   659,   660,    97,   662,
+     663,   664,   665,   666,   227,   228,   669,   665,   240,   720,
+     242,   227,   228,   397,   129,   244,   239,   680,   672,   248,
+     243,   675,   239,   591,   592,   749,   227,   228,   596,  1383,
+     244,   146,   248,   687,   248,   212,   213,   214,   215,   154,
+     155,   156,   239,   706,   241,   160,   161,   248,   711,   227,
+     228,   133,   134,   227,   228,   227,   228,   139,    94,   236,
+     237,   227,   228,   726,   727,   719,   227,   228,   243,   732,
+     248,   239,   735,   736,   248,   240,   248,   242,   741,   243,
+     743,   244,   248,   248,     8,   248,    97,   248,   129,   227,
+     228,   647,    94,   649,   650,   651,   652,   653,   654,    94,
+     656,   657,   658,   659,    97,   146,   662,   663,   664,   772,
+     248,   774,     4,   154,   155,   156,   227,   228,  1472,   160,
+     161,   212,   213,   214,   215,   133,   134,     6,     7,   244,
+    1484,   139,   243,     4,   862,   229,   230,   231,   232,   233,
+     227,   228,   526,   806,   238,   236,   237,   240,   244,   242,
+     243,   875,   248,  1987,   216,   217,   218,   219,   220,   221,
      222,   223,   224,   225,   226,   227,   228,   229,   230,   231,
-     232,   233,   240,  1447,   242,   243,   238,   859,   227,   228,
-     229,   230,   231,   232,   233,  1459,     6,     7,   239,   238,
-     793,   229,   230,   231,   232,   233,    97,   244,   244,     4,
-     238,   248,   248,   637,    94,   639,   640,   641,   642,   643,
-     644,  1954,   646,   647,   648,   649,    94,   244,   652,   653,
-     654,   248,   244,   244,    97,   244,   248,   248,   856,   248,
-     244,   244,   835,   244,   248,   248,   244,   248,   971,   972,
-     248,  1986,   244,   244,   244,   848,   248,   248,   248,     4,
-     244,   244,   244,   856,   248,   248,   248,   244,     4,   244,
-       4,   248,   865,   248,     4,     5,   241,   868,  2011,   870,
-     871,   244,   244,   244,   244,   248,   248,   248,   248,   239,
-     239,   244,   244,   884,  2029,   248,   248,   239,   722,   244,
-     244,   973,     6,   248,   248,   244,   730,   244,   239,   248,
-     244,   248,   182,   239,   248,     6,    46,    47,    48,    49,
-      50,    51,    52,    53,    54,   239,   241,   918,     6,    59,
-      60,    61,    62,   243,   247,     6,   244,    67,    68,    69,
-     248,   243,    72,   244,    74,   963,   244,   248,   244,   244,
-     248,     9,   248,   248,   247,    85,   244,   243,    88,   244,
-     248,   952,   244,   248,   982,   244,   248,   244,   244,   248,
-     963,   248,   248,   244,   239,   239,  1249,   248,   239,   239,
-     239,   872,   239,     4,   977,  1108,  1109,   243,   879,   982,
-     119,   239,   883,   239,   239,   239,   126,   239,   268,   992,
-     243,   239,  1570,  1571,   997,  1023,  1024,   243,  1026,  1027,
-    1028,   243,  1030,  1031,  1032,  1033,  1034,  1035,  1036,  1037,
-    1038,  1039,   243,   243,   243,   239,   239,   239,   239,     6,
-    1023,  1024,   239,  1026,  1027,  1028,   239,  1030,  1031,  1032,
-    1033,  1034,  1035,  1036,  1037,  1038,  1039,   239,   239,  1042,
-       6,   241,     6,     6,   243,   243,   243,   243,   241,   241,
-     241,     6,  1080,   193,   194,   195,   243,   177,   239,   239,
-     239,   239,   239,   239,   204,     6,   241,     6,   208,   243,
-     210,   211,  1100,     6,     6,   243,     7,  1080,  1081,  1082,
-       6,   243,     6,   243,    87,   244,   240,  1115,     7,     6,
-     248,   248,   240,   243,   243,   238,    64,  1100,   245,     4,
-     240,     7,   242,   243,     7,   239,     6,   240,     6,   174,
-       7,   391,  1115,  1116,   243,     6,   243,     7,     6,     6,
-     242,  1022,   240,     6,   243,     7,   243,   243,   243,     6,
-     241,   239,   245,   243,  1135,  1268,  1269,     4,     6,  1167,
-       6,     6,     6,   240,     7,   241,  1434,     7,     7,     7,
-    1438,     7,     7,  1181,  1182,  1183,     7,     7,     7,     7,
-       7,     7,     7,   997,  1167,     7,     7,     7,   243,     6,
-     240,  1454,   248,   242,   248,   248,   248,   240,  1181,  1182,
-    1183,     7,   243,   245,     7,   243,     4,     6,   245,  1192,
-     244,   244,   129,     7,  1197,     6,   245,     7,  1201,     7,
-       7,   240,  1230,   240,  1286,   248,  1288,  1210,   248,  1212,
-       9,   240,  1215,   248,   242,   245,   177,     7,   244,   149,
-     247,   243,     6,  1224,     6,     4,    46,  1230,   245,    46,
-     239,   239,   245,   239,   245,   239,     4,     7,   518,   240,
-       7,  1819,     7,   248,     7,     7,  1249,  1081,  1082,     7,
-       6,   240,   248,     7,     7,     7,     4,   109,     4,   243,
-    1288,     6,   239,     7,     6,   243,  1269,     7,     7,  1297,
-       7,     7,     7,  1301,     7,     7,     6,     6,     6,     4,
-       7,    97,     6,     6,     4,  1288,   246,   240,   568,   569,
-     248,   248,   243,   243,  1297,   243,     6,   244,  1301,     6,
-       6,   241,     7,     6,     6,   239,     6,   243,     6,     6,
-     239,     6,     6,   248,  1447,   242,     6,   245,  1460,  1461,
-     123,     6,     6,   177,  1352,  1353,  1354,     6,     6,     6,
-       6,     6,  1360,     6,   614,   615,   616,     6,     6,     6,
-       5,   240,     6,     4,   240,     4,     6,  1375,  1430,  1352,
-    1353,  1354,     6,     6,   243,     7,   241,  1360,  1386,  1642,
-       6,     6,   243,  1197,   243,   243,  1394,  1201,   243,   243,
-     243,   243,  1375,   243,   243,     6,  1210,     6,  1212,   659,
-     173,  1215,   243,  1386,     6,     6,   243,     6,     6,     4,
-       7,  1394,     6,     6,  1397,   248,     6,   240,     4,     7,
-       7,     6,     6,     6,   248,   243,  1488,   239,   239,   248,
-     245,   239,   248,   243,   694,  1548,   218,   219,   220,   221,
+     232,   233,     4,   239,   244,   241,   238,   243,   248,   735,
+     244,   872,   244,     4,   248,   244,   244,   743,   851,   248,
+     248,   244,   244,   577,   578,   248,   248,   239,   244,  2019,
+     244,   864,   248,   244,   248,   240,   239,   242,   243,   872,
+    2044,   227,   228,   229,   230,   231,   232,   233,   881,   244,
+     244,   244,   238,   248,   248,   248,   239,   244,   241,     6,
+     884,   248,   886,   887,   244,   239,   239,   241,   248,   623,
+     624,   625,  2062,   239,     6,   241,   900,   219,   220,   221,
      222,   223,   224,   225,   226,   227,   228,   229,   230,   231,
-     232,   233,     6,   713,     6,  1269,   238,    95,  1466,   719,
-       5,     4,   243,   240,   248,   243,     6,     6,   248,     6,
-       6,  1454,     6,     6,   248,   240,   248,  1460,  1461,     6,
-    1488,     6,     6,  1466,     6,   248,   243,   243,   243,     5,
-     243,   240,     6,     6,     6,     6,     6,  1480,   244,   243,
-       7,   172,   243,  1384,  1566,  1488,     6,   244,     6,   240,
-    1493,     7,     6,     6,   244,   244,     6,   244,     6,     6,
-       6,     6,   245,  1645,     6,   243,     6,     6,     6,   240,
-     244,     6,   175,   793,     6,     6,     6,   243,   129,     6,
-     239,   243,   240,   244,   240,  1658,  1608,   244,   243,   243,
-     243,  1559,   244,  1615,  1616,   243,     6,     6,     6,   243,
-    1828,     6,     6,   244,     6,   244,     6,     6,     6,     6,
-     243,     6,  1634,     6,   243,   835,  1559,  1585,     6,  1562,
-    1563,   243,     6,     6,     6,     6,     6,  1277,   848,  1967,
-    1570,  1571,  1600,  1856,  1327,  1792,  1498,  1757,  1296,     3,
-    1555,   707,  1585,     3,     3,   865,     3,   563,  1591,  1815,
-    1427,     3,  1638,  1615,   722,  1461,    -1,  1600,    -1,    -1,
-      -1,  1502,   435,  1631,    -1,    -1,    -1,  1610,    -1,    -1,
-    1613,    -1,    -1,    -1,    -1,    -1,  1644,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,  1628,  1631,  1630,
-    1918,    -1,    -1,    -1,    -1,  1638,    -1,    -1,    -1,  1642,
-      -1,  1644,  1645,    -1,    -1,    -1,  1480,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1687,
-       8,    -1,    -1,    -1,    -1,    -1,    -1,  1955,    -1,    -1,
-      -1,  1674,    -1,    -1,    -1,    -1,    -1,  1759,    -1,    -1,
-      -1,    -1,    -1,    -1,  1687,  1586,  1587,  1588,  1589,  1590,
-    1591,    -1,    -1,  1721,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,     4,     5,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   992,    -1,    -1,  1797,    -1,    -1,  1721,    -1,
+     232,   233,   990,   991,   239,   244,   238,   244,   992,   248,
+     244,   248,   239,   244,   248,   244,   244,   248,   244,   248,
+     248,   935,   248,   244,   244,   669,   244,   248,   248,   241,
+     248,   982,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+    1001,   244,   239,   241,   238,   248,   240,   971,   242,   982,
+     888,   244,   706,  1272,   244,   248,   244,   895,   248,   243,
+     248,   899,   244,   996,     6,   244,   248,   244,  1001,   248,
+     244,   248,   726,     4,   248,     6,  1598,  1599,   732,  1012,
+     247,     6,  1043,  1044,  1017,  1046,  1047,  1048,   243,  1050,
+    1051,  1052,  1053,  1054,  1055,  1056,  1057,  1058,  1059,   244,
+     244,   244,   244,   248,   248,   248,   248,   247,   244,   239,
+    1043,  1044,   248,  1046,  1047,  1048,     9,  1050,  1051,  1052,
+    1053,  1054,  1055,  1056,  1057,  1058,  1059,   244,   244,  1062,
+     239,   248,   248,  1131,  1132,   239,   239,   243,   239,  1100,
+     239,   177,   177,   177,   119,   243,   239,   239,   177,   239,
+     239,     4,   806,   239,   239,   243,   243,   239,     6,   243,
+     243,  1122,   243,   243,   239,   239,   239,  1100,  1101,  1102,
+     239,   239,   239,   239,     6,     6,   241,  1138,     6,   243,
+     243,   243,   243,   241,   241,   241,     6,   177,   243,  1122,
+     239,  1017,     6,   239,   239,   239,   239,   851,   239,   241,
+       6,     6,     6,   243,  1042,  1138,  1139,     8,     8,     7,
+     864,   218,   219,   220,   221,   222,   223,   224,   225,   226,
+     227,   228,   229,   230,   231,   232,   233,   881,   243,  1190,
+       6,   238,   243,     6,  1158,   243,    87,   240,   244,   248,
+       7,     6,   240,  1204,  1205,  1206,   248,   243,   243,   238,
+       8,   245,    64,     4,     7,     7,   239,  1190,     6,   240,
+    1479,     6,     6,   243,     7,     7,     6,     6,   244,   174,
+     243,  1204,  1205,  1206,   244,  1101,  1102,   244,   242,   240,
+       6,  1459,  1215,   243,   243,  1463,   243,  1220,   243,   245,
+       7,  1224,  1253,  1291,  1292,     6,   241,   243,   239,     4,
+    1233,   240,  1235,     6,     6,  1238,     6,     6,   241,     7,
+       7,     7,     7,     7,     7,     7,     7,  1311,     7,  1313,
+    1253,     7,     7,  1247,     7,     7,     7,     7,     7,   243,
+    1852,     6,   240,   242,   244,   248,   248,   248,   240,  1272,
+       7,   248,   243,     7,   244,   243,   245,     4,     6,   245,
+     244,   129,  1313,   244,     7,     6,   245,     7,  1012,  1292,
+       7,  1322,     7,   240,  1297,  1326,   221,   222,   223,   224,
+     225,   226,   227,   228,   229,   230,   231,   232,   233,   240,
+    1313,   248,   248,   238,     9,   248,   240,   245,   247,  1322,
+     242,   177,     7,  1326,  1220,   149,     6,   244,  1224,   243,
+       8,     6,     4,    46,    46,   245,   239,  1233,  1062,  1235,
+     239,   245,  1238,   243,   239,     4,  1377,  1378,  1379,  1485,
+    1486,   245,   239,     7,  1385,     7,     7,   248,   177,   240,
+       7,     7,     7,     6,     4,   248,     7,   240,     7,  1400,
+       7,   109,     4,     6,  1377,  1378,  1379,   243,   239,     7,
+    1411,  1670,  1385,     6,   243,     4,     5,     7,  1419,     7,
+       7,  1455,     7,     7,     7,     7,  1292,  1400,     6,     6,
+       6,    97,     7,     6,  1472,     6,     4,     4,  1411,   248,
+     246,   240,   243,   243,   248,  1139,  1419,   243,     6,  1422,
+       6,     6,   239,     7,   244,     6,     6,    46,    47,    48,
+      49,    50,    51,    52,    53,    54,   241,   239,     6,   243,
+      59,    60,    61,    62,   244,     6,   245,     6,    67,    68,
+      69,   242,  1516,    72,   248,    74,     6,     6,   123,     6,
+    1491,     6,     6,   177,     6,     6,    85,     6,     6,    88,
+       6,     6,     6,     6,     6,     5,  1479,     6,     4,     6,
+     240,     4,  1485,  1486,     6,  1516,   240,     7,  1491,     6,
+       6,  1215,     6,     6,     6,   243,   243,   243,     6,   243,
+     243,  1409,   241,   243,   173,  1508,     6,   126,  1576,     6,
+     243,   243,   243,  1516,   243,     6,     4,   243,  1521,   243,
+       7,   240,     6,   248,     6,   243,   248,     6,     6,   239,
+    1594,     4,   248,   239,   245,   243,   239,  1673,   216,   217,
+     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
+     228,   229,   230,   231,   232,   233,  1587,   248,   244,     7,
+     238,     6,   240,     6,     6,     6,     6,    95,     5,   243,
+     240,   248,  1636,  1297,   193,   194,   195,   243,     6,  1643,
+    1644,     6,  1613,     6,  1587,   204,   248,  1590,  1591,   208,
+       6,   210,   211,     6,     6,   248,   240,  1628,  1662,   248,
+    1889,     6,     4,     6,     5,  1598,  1599,     6,   243,     6,
+    1613,     6,  1508,  1861,   248,     6,  1619,   243,  1686,     7,
+       6,   243,  1530,     6,   243,  1628,     6,   243,  1659,   240,
+       6,   129,     7,   243,   243,  1638,     6,     6,  1641,     6,
+     244,  1672,   244,     7,   240,   244,     6,   172,     6,   244,
+     244,     6,   245,     6,   243,     6,  1659,     6,     6,     6,
+       6,   244,  1656,  1666,  1658,   240,   243,  1670,   175,  1672,
+    1673,     6,   243,   239,   244,   244,   243,   240,   243,     6,
+       6,   243,     6,     6,   244,   243,     6,  1718,     6,   243,
+       6,     6,   240,     6,     6,     6,     6,     6,  1422,     6,
+       6,   244,  1705,  1951,   244,     6,  1614,  1615,  1616,  1617,
+    1618,  1619,     6,     6,     6,  1718,     6,     6,     6,   243,
+       6,  1752,   243,     6,   243,     6,  1790,  1302,  2000,  1352,
+    1526,  1825,   441,  1583,  1788,  1321,     3,     3,     3,     3,
+    1988,  1848,  1638,  1452,     3,  1641,  1666,   572,  1643,  1752,
+    1486,    -1,     6,    -1,    -1,    -1,    -1,    -1,    -1,   735,
+      -1,  1764,    -1,    -1,    -1,    -1,  1830,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,  1777,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,  1814,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,  1826,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-    1733,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,  1746,    -1,    46,    47,    48,    49,    50,
-      51,    52,    53,    54,    -1,  1783,    -1,    -1,    59,    60,
-      61,    62,  1042,    -1,    -1,  1793,    67,    68,    69,    -1,
-      -1,    72,    -1,    74,    -1,    -1,  1610,    -1,    -1,  1613,
-    1783,    -1,    -1,    -1,    85,  1813,    -1,    88,    -1,    -1,
-    1793,    -1,    -1,    -1,    -1,  1798,    -1,    -1,    -1,  1827,
+      -1,  1814,    -1,    -1,    -1,  1846,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,  1826,    -1,    -1,    -1,    -1,  1831,  1860,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-    1813,    -1,    -1,  1816,    -1,    -1,    -1,    -1,    -1,  1819,
-      -1,    -1,    -1,    -1,  1827,   126,    -1,    -1,  1831,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,  1116,    -1,    -1,  1867,
+      -1,    -1,    -1,  1846,    -1,    -1,  1849,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,  1860,    -1,  1852,
+      -1,  1864,    -1,    -1,    -1,    -1,  1590,  1591,    -1,  1900,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,  1933,    -1,  1856,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,  1891,  1867,    -1,    -1,    -1,   216,   217,
+      -1,    -1,    -1,    -1,    -1,    -1,  1889,    -1,    -1,    -1,
+      -1,    -1,    -1,  1924,    -1,    -1,    -1,  1900,    -1,    -1,
+      -1,    -1,  1966,   216,   217,   218,   219,   220,   221,   222,
+     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
+     233,  1924,    -1,    -1,    -1,   238,    -1,    -1,    -1,    -1,
+      -1,     6,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,  1936,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,  1865,  1866,  1867,
+    1868,  1869,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+      -1,    -1,    -1,    -1,   238,    -1,    -1,  1990,  1991,  1992,
+    1993,  1994,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,  2033,    -1,  1998,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,  1923,    -1,    -1,    -1,  1927,
+      -1,    -1,    -1,    -1,    -1,    -1,  2020,    -1,    -1,    -1,
+    2033,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   107,    -1,  2049,    -1,    -1,    -1,
+      -1,    -1,    -1,  1777,  2085,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,  1974,    -1,  2071,    -1,
+    1978,   134,    -1,    -1,    -1,   138,    -1,    -1,    -1,   142,
+      -1,    -1,  2085,     6,    -1,    -1,  1994,    -1,    -1,  2092,
+    2093,    -1,    -1,    -1,    -1,    -1,   159,   160,   161,    -1,
+     163,   164,   165,  2106,   167,   168,   169,   170,   171,   172,
+     173,    -1,   175,   176,   177,   178,    -1,    -1,    -1,   182,
+      -1,    -1,    -1,    -1,    -1,  1849,    -1,    -1,    -1,    -1,
+      -1,  2039,  2040,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    1864,   216,   217,   218,   219,   220,   221,   222,   223,   224,
+     225,   226,   227,   228,   229,   230,   231,   232,   233,     7,
+       8,    -1,    -1,   238,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,  2071,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   250,   251,   252,
+     253,   254,    -1,    -1,    -1,    -1,  2092,  2093,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   269,   270,    -1,    -1,
+    2106,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   288,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   298,   299,    -1,    -1,    -1,
+      -1,   304,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   314,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,  1990,  1991,  1992,  1993,
+    1994,    -1,    -1,    -1,   337,   338,    -1,    -1,    -1,   342,
+     343,   344,    -1,   346,    -1,    -1,    -1,   350,   351,   352,
+      -1,    -1,   355,   216,   217,   218,   219,   220,   221,   222,
+     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
+     233,    -1,    -1,    -1,    -1,   238,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,  2049,    -1,    -1,    -1,    -1,
+     393,    -1,    -1,    -1,   397,   398,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   414,   415,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   428,    -1,    -1,   216,   217,
      218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,  1891,    -1,
-     238,    -1,   193,   194,   195,    -1,   244,    -1,    -1,    -1,
-      -1,    -1,  1903,   204,    -1,    -1,    -1,   208,    -1,   210,
-     211,     8,  1192,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     228,   229,   230,   231,   232,   233,    -1,   450,    -1,    -1,
+     238,   454,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   468,   469,    -1,    -1,    -1,
+     473,    -1,    -1,   476,   477,   478,   479,   480,   481,   482,
+     483,   484,   485,   486,   487,   488,   489,   490,   491,   492,
+     493,   494,   495,   496,   497,   498,   499,   500,    -1,   502,
+     503,    -1,   505,    -1,    -1,    -1,    -1,    -1,    -1,   512,
+      -1,    -1,   515,   516,    -1,    -1,    -1,    -1,   521,    -1,
+      -1,    -1,    -1,   526,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   538,   539,   540,   541,   542,
+     543,   544,   545,   546,   547,   548,   549,   550,   551,   552,
+     553,   554,   555,   556,   557,    -1,   559,   560,    -1,    -1,
+      -1,    -1,    -1,   566,   567,   568,    -1,    -1,    -1,    -1,
+      -1,   574,   575,    -1,   577,   578,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,     4,     5,    -1,    -1,
+      -1,    -1,    -1,   596,   597,   598,    -1,    -1,    -1,   602,
+     603,   604,   605,   606,   607,   608,   609,   610,    -1,    -1,
+      -1,    -1,   615,    -1,   617,    -1,   619,    -1,    -1,    -1,
+     623,   624,   625,   626,    -1,   628,   629,   630,    46,    47,
+      48,    49,    50,    51,    52,    53,    54,    -1,    -1,    -1,
+      -1,    59,    60,    61,    62,    -1,    -1,    -1,    -1,    67,
+      68,    69,   655,    -1,    72,    -1,    74,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   669,    85,    -1,    -1,
+      88,    -1,    -1,   676,    -1,   678,    -1,    -1,   681,   682,
+      -1,    -1,    -1,    -1,    -1,   182,    -1,   690,    -1,    -1,
+      -1,    -1,    -1,   696,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   706,     7,    -1,    -1,    -1,   126,   712,
+     713,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   726,    -1,   728,   729,    -1,    -1,   732,
+     733,    -1,    -1,    -1,   737,    -1,    -1,    -1,    -1,    -1,
+      -1,   744,    -1,    -1,     6,   748,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   251,    -1,    -1,   254,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   770,    -1,   772,
+      -1,   774,    -1,   270,    -1,   193,   194,   195,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   204,    -1,    -1,    -1,
+     208,    -1,   210,   211,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   806,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   816,    -1,    -1,    -1,    -1,   236,   237,
+       6,    -1,    -1,    -1,    -1,   243,    -1,   245,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,  1832,  1833,  1834,  1835,  1836,    -1,    -1,    -1,    -1,
-      -1,    -1,   243,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,  1957,  1958,  1959,  1960,  1961,    -1,
-      -1,    -1,    -1,    -1,  1965,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,  2000,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,  1987,    -1,    -1,  1890,
-      -1,    -1,    -1,  1894,    -1,    -1,    -1,  2000,    -1,    -1,
+      -1,   338,    -1,    -1,    -1,    -1,    -1,    -1,   851,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   107,    -1,  2016,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,  2052,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,  2038,    -1,    -1,   134,    -1,
-    1941,    -1,   138,    -1,  1945,     7,   142,    -1,    -1,  2052,
-      -1,    -1,    -1,    -1,    -1,    -1,  2059,  2060,    -1,    -1,
-    1961,    -1,    -1,   159,   160,   161,    -1,   163,   164,   165,
-    2073,   167,   168,   169,   170,   171,   172,   173,    -1,   175,
-     176,   177,   178,    -1,    -1,    -1,   182,   216,   217,   218,
-     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
-     229,   230,   231,   232,   233,  2006,  2007,    -1,    -1,   238,
-      -1,    -1,    -1,    -1,    -1,   244,    -1,  1397,    -1,   216,
-     217,   218,   219,   220,   221,   222,   223,   224,   225,   226,
-     227,   228,   229,   230,   231,   232,   233,    -1,    -1,    -1,
-      -1,   238,    -1,   240,    -1,   242,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   249,   250,   251,   252,   253,    -1,    -1,
+      -1,   864,    -1,    -1,    -1,    -1,    -1,    -1,   871,    -1,
+      -1,    -1,   875,    -1,    -1,    -1,    -1,    -1,   881,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   889,   890,    -1,    -1,
+      -1,    -1,   895,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     397,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   911,    -1,
+      -1,   914,    -1,   216,   217,   218,   219,   220,   221,   222,
+     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
+     233,   934,    -1,   936,   937,   238,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   267,   268,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   283,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   293,   294,    -1,
-      -1,    -1,    -1,   299,  2038,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   309,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,  2059,  2060,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   332,    -1,    -1,  2073,
-     336,   337,   338,    -1,   340,    -1,    -1,    -1,   344,   345,
-     346,    -1,    -1,   349,   216,   217,   218,   219,   220,   221,
+      -1,    -1,   955,    -1,   216,   217,   218,   219,   220,   221,
      222,   223,   224,   225,   226,   227,   228,   229,   230,   231,
-     232,   233,   182,    -1,    -1,    -1,   238,    -1,    -1,    -1,
-      -1,    -1,  1562,  1563,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   387,    -1,    -1,    -1,   391,   392,   219,   220,   221,
-     222,   223,   224,   225,   226,   227,   228,   229,   230,   231,
-     232,   233,   408,   409,    -1,    -1,   238,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   422,    -1,    -1,    -1,
+     232,   233,   469,     8,    -1,   978,   238,    -1,    -1,    -1,
+      -1,    -1,   985,   986,   987,   988,    -1,    -1,    -1,    -1,
+     993,    -1,    -1,    -1,    -1,   492,    -1,    -1,    -1,    -1,
+      -1,    -1,   499,   500,  1007,  1008,    -1,    -1,    -1,  1012,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     250,    -1,    -1,   253,    -1,    -1,    -1,    -1,   444,    -1,
-      -1,    -1,   448,    -1,    -1,    -1,    -1,    -1,   268,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   462,   463,    -1,    -1,
-      -1,   467,    -1,    -1,   470,   471,   472,   473,   474,   475,
-     476,   477,   478,   479,   480,   481,   482,   483,   484,   485,
-     486,   487,   488,   489,   490,   491,   492,   493,   494,    -1,
-     496,   497,    -1,   499,    -1,    -1,    -1,    -1,    -1,    -1,
-     506,    -1,   508,    -1,    -1,    -1,    -1,   513,    -1,    -1,
-      -1,    -1,   518,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,     8,   529,   530,   531,   532,   533,   534,   535,
-     536,   537,   538,   539,   540,   541,   542,   543,   544,   545,
-     546,   547,   548,    -1,   550,   551,    -1,    -1,    -1,    -1,
-      -1,   557,   558,   559,    -1,    -1,  1746,    -1,    -1,   565,
-     566,    -1,   568,   569,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   391,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   587,   588,   589,    -1,    -1,    -1,   593,   594,   595,
-     596,   597,   598,   599,   600,   601,     6,    -1,    -1,    -1,
-     606,    -1,   608,    -1,   610,    -1,    -1,    -1,   614,   615,
-     616,   617,    -1,   619,   620,   621,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,  1816,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   645,
-      -1,  1831,    -1,   463,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   659,    -1,    -1,    -1,    -1,   664,    -1,
-     666,    -1,    -1,   669,   670,    -1,   486,    -1,    -1,    -1,
-      -1,    -1,   678,   493,   494,    -1,    -1,    -1,   684,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   694,    -1,
-      -1,    -1,    -1,   513,   700,   701,    -1,    -1,   518,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   713,    -1,   715,
-     716,    -1,    -1,   719,   720,    -1,    -1,    -1,   724,    -1,
-      -1,    -1,    -1,   543,    -1,   731,    -1,    -1,    -1,   735,
+      -1,    -1,    -1,    -1,   521,    -1,    -1,    -1,    -1,   526,
      216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
-     226,   227,   228,   229,   230,   231,   232,   233,   568,   569,
-      -1,   757,   238,   759,   240,   761,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,  1957,  1958,  1959,
-    1960,  1961,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   793,    -1,    -1,
-      -1,    -1,    -1,    -1,   614,   615,   616,   803,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   216,   217,   218,   219,
-     220,   221,   222,   223,   224,   225,   226,   227,   228,   229,
-     230,   231,   232,   233,    -1,    -1,  2016,    -1,   238,   835,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   659,
-      -1,    -1,   848,    -1,    -1,    -1,    -1,    -1,    -1,   855,
-      -1,    -1,    -1,   859,    -1,    -1,    -1,    -1,    -1,   865,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   873,   874,    -1,
-      -1,    -1,    -1,   879,   694,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   895,
-      -1,    -1,   898,   713,    -1,    -1,    -1,    -1,    -1,   719,
-      -1,     6,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   917,    -1,   919,   920,    -1,    -1,    -1,    -1,    -1,
+     226,   227,   228,   229,   230,   231,   232,   233,    -1,    -1,
+      -1,    -1,   238,    -1,    -1,   552,    -1,    -1,    -1,  1062,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   938,    -1,    -1,    -1,    -1,    -1,    -1,   759,
-      -1,   761,    -1,    -1,     6,    -1,     4,     5,    -1,    -1,
-      -1,    -1,    -1,   959,    -1,    -1,    -1,    -1,    -1,    -1,
-     966,   967,   968,   969,    -1,    -1,    -1,    -1,   974,    -1,
-      -1,    -1,    -1,   793,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   988,   989,    -1,     6,   992,    -1,    46,    47,
-      48,    49,    50,    51,    52,    53,    54,    -1,    -1,    -1,
-      -1,    59,    60,    61,    62,    -1,    -1,    -1,    -1,    67,
-      68,    69,    -1,    -1,    72,   835,    74,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    85,   848,    -1,
-      88,    -1,    -1,    -1,     6,    -1,  1042,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   865,    -1,    -1,    -1,    -1,
-      -1,    -1,  1058,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,  1068,  1069,  1070,    -1,    -1,    -1,   126,  1075,
-    1076,    -1,  1078,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,  1088,  1089,    -1,    -1,    -1,    -1,    -1,    -1,
-    1096,  1097,    -1,    -1,    -1,    -1,    -1,  1103,  1104,  1105,
-      -1,    -1,    -1,    -1,    -1,  1111,  1112,    -1,    -1,    -1,
-    1116,   216,   217,   218,   219,   220,   221,   222,   223,   224,
+      -1,    -1,    -1,    -1,    -1,  1078,    -1,    -1,    -1,    -1,
+     577,   578,    -1,    -1,    -1,  1088,  1089,  1090,    -1,    -1,
+      -1,    -1,  1095,  1096,    -1,  1098,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,  1110,  1111,    -1,
+      -1,    -1,    -1,    -1,    -1,  1118,  1119,    -1,    -1,    -1,
+      -1,    -1,  1125,    -1,  1127,  1128,   623,   624,   625,    -1,
+      -1,  1134,  1135,    -1,    -1,    -1,  1139,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    22,    23,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,  1170,    -1,    -1,
+      -1,    -1,   669,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   216,   217,   218,   219,   220,   221,   222,   223,   224,
      225,   226,   227,   228,   229,   230,   231,   232,   233,    -1,
-      -1,    22,    23,   238,    -1,   193,   194,   195,    -1,    -1,
-      -1,  1147,    -1,    -1,   413,    -1,   204,    -1,    -1,    -1,
-     208,    -1,   210,   211,   216,   217,   218,   219,   220,   221,
-     222,   223,   224,   225,   226,   227,   228,   229,   230,   231,
-     232,   233,   992,    -1,  1180,    -1,   238,    -1,   236,   237,
-      -1,    -1,    -1,    -1,    -1,   243,  1192,   245,    -1,    -1,
-      -1,    -1,    -1,    -1,  1200,   216,   217,   218,   219,   220,
+    1203,    -1,    -1,   238,    -1,    -1,    -1,    -1,    -1,   706,
+      -1,    -1,  1215,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    1223,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   726,
+      -1,    -1,    -1,    -1,    -1,   732,    -1,    -1,    -1,    -1,
+      -1,  1244,  1245,    -1,    -1,     6,  1249,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    1263,    -1,    -1,  1266,    -1,   134,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   772,    -1,   774,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    1293,    -1,    -1,  1296,  1297,  1298,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,  1306,    -1,  1308,    -1,  1310,  1311,   806,
+      -1,    -1,    -1,    -1,     6,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   194,   195,   196,   197,   198,
+     199,   200,   201,   202,   203,   204,   205,   206,   207,   208,
+     209,   210,   211,   212,   213,   214,   215,   216,   217,   218,
+     219,   220,   221,   222,   851,   224,   225,    -1,    -1,    -1,
+      -1,    -1,   231,   232,    -1,    -1,    -1,   864,    -1,    -1,
+      -1,    -1,    -1,   242,   243,    -1,    -1,    -1,    -1,    -1,
+      -1,  1384,    -1,    -1,   881,    -1,    -1,    -1,  1391,  1392,
+    1393,    -1,    -1,    -1,    -1,    -1,    -1,  1400,    -1,  1402,
+      -1,    -1,    -1,    -1,    -1,    -1,  1409,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1422,
+      -1,    -1,    -1,    -1,  1427,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,  1435,  1436,  1437,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,  1447,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,  1457,   216,   217,   218,   219,   220,
      221,   222,   223,   224,   225,   226,   227,   228,   229,   230,
-     231,   232,   233,    -1,    -1,  1221,  1222,   238,     6,    -1,
-    1226,    -1,  1042,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,  1240,    -1,    -1,  1243,   507,    -1,
-      -1,    -1,    -1,   134,   216,   217,   218,   219,   220,   221,
+     231,   232,   233,    -1,    -1,    -1,    -1,   238,    -1,    -1,
+    1483,    -1,    -1,    -1,    -1,    -1,  1489,  1490,   357,   358,
+     359,     8,    -1,    -1,   363,   364,   365,   366,   367,   368,
+     369,    -1,   371,    -1,    -1,    -1,   375,   376,    -1,    -1,
+     379,    -1,    -1,    -1,    -1,  1012,    -1,    -1,  1521,    -1,
+      -1,    -1,    -1,   392,   216,   217,   218,   219,   220,   221,
      222,   223,   224,   225,   226,   227,   228,   229,   230,   231,
-     232,   233,    -1,    -1,  1270,    -1,   238,  1273,  1274,    -1,
-      -1,    -1,    -1,    -1,    -1,  1281,    -1,  1283,    -1,  1285,
-    1286,    -1,    -1,    -1,    -1,   554,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,  1116,    -1,    -1,    -1,
-      -1,    -1,    -1,   194,   195,   196,   197,   198,   199,   200,
-     201,   202,   203,   204,   205,   206,   207,   208,   209,   210,
-     211,   212,   213,   214,   215,   216,   217,   218,   219,   220,
-     221,   222,    -1,   224,   225,    -1,    -1,    -1,    -1,    -1,
-     231,   232,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     241,   242,    -1,  1359,    -1,    -1,    -1,    -1,    -1,    -1,
-    1366,  1367,  1368,    -1,    -1,    -1,    -1,    -1,    -1,  1375,
-      -1,  1377,  1192,    -1,    -1,    -1,    -1,    -1,  1384,    -1,
+     232,   233,    -1,    -1,    -1,    -1,   238,    -1,    -1,    -1,
+      -1,    -1,    -1,  1556,  1557,  1558,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,  1567,  1062,    -1,    -1,    -1,  1572,
+    1573,  1574,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,  1585,    -1,    -1,    -1,    -1,  1590,  1591,  1592,
+      -1,  1594,    -1,    -1,    -1,    -1,    -1,  1600,  1601,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,  1397,    -1,    -1,    -1,    -1,  1402,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,  1410,  1411,  1412,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,  1422,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,  1432,    -1,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
-     238,    -1,  1458,    -1,    -1,    -1,    -1,    -1,  1464,  1465,
-     351,   352,   353,    -1,    -1,    -1,   357,   358,   359,   360,
-     361,   362,   363,    -1,   365,    -1,    -1,    -1,   369,   370,
-      -1,    -1,   373,    -1,    -1,    -1,    -1,  1493,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   386,   765,   766,   767,   768,
-     769,   770,   771,   772,   773,   774,   775,    -1,   777,   778,
-     779,   780,    -1,   782,   783,   784,   785,    -1,    -1,    -1,
-      -1,    -1,  1528,  1529,  1530,    -1,    -1,   796,    -1,   798,
-      -1,    -1,    -1,  1539,    -1,    -1,    -1,   806,  1544,  1545,
-    1546,   810,   811,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     819,  1557,    -1,    -1,    -1,    -1,  1562,  1563,  1564,    -1,
-    1566,    -1,    -1,    -1,    -1,    -1,  1572,  1573,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,  1397,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,  1591,    -1,    -1,    -1,  1595,
+      -1,    -1,    -1,    -1,    -1,    -1,  1619,    -1,    -1,    -1,
+    1623,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,  1636,    -1,    -1,  1639,    -1,    -1,    -1,
+    1643,    -1,  1139,    -1,    -1,    -1,    -1,    -1,    -1,  1652,
+    1653,    -1,  1655,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    1663,     6,    -1,    -1,    -1,   534,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,  1679,    -1,    -1,    -1,
+      -1,  1684,  1685,    -1,    -1,    -1,    -1,    -1,    -1,   419,
+      -1,    -1,    -1,    -1,  1697,     6,    -1,  1700,  1701,   216,
+     217,   218,   219,   220,   221,   222,   223,   224,   225,   226,
+     227,   228,   229,   230,   231,   232,   233,    -1,  1215,    -1,
+       6,   238,    -1,    -1,    -1,    -1,    -1,  1730,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,  1608,    -1,    -1,  1611,    -1,    -1,    -1,  1615,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1624,  1625,
-      -1,  1627,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1635,
-      -1,    -1,    -1,    -1,    -1,   526,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,  1651,    -1,    -1,    -1,    -1,
-    1656,  1657,    -1,    -1,    -1,   924,   925,   926,     6,    -1,
-    1666,   930,   931,  1669,  1670,   934,   935,   936,   937,    -1,
-     939,    -1,    -1,  1493,    -1,   944,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,     6,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,  1699,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1715,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1724,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,  1733,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,  1742,  1743,    -1,    -1,
-    1746,    -1,  1562,  1563,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,  1020,  1021,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,  1746,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,  1755,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,  1764,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    1773,  1774,    -1,    -1,  1777,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   513,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,     6,    -1,    -1,    -1,    -1,    -1,    -1,
+    1297,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1811,  1812,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,  1591,    -1,    -1,  1780,  1781,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,  1829,    -1,    -1,  1832,
+      -1,    -1,    -1,   563,  1837,    -1,    -1,  1840,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,  1849,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-    1796,    -1,    -1,  1799,    -1,    -1,    -1,    -1,  1804,    -1,
-      -1,  1807,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     6,
-    1816,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,  1831,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,  1839,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,  1113,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1864,    -1,
-      -1,    -1,    -1,    -1,  1870,    -1,    -1,  1873,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,     6,    -1,    -1,    -1,
-     238,    -1,    -1,  1899,   216,   217,   218,   219,   220,   221,
-     222,   223,   224,   225,   226,   227,   228,   229,   230,   231,
-     232,   233,    -1,  1733,    -1,    -1,   238,    -1,  1924,  1925,
-      -1,    -1,    -1,   814,    -1,    -1,  1746,    -1,    -1,    -1,
-    1936,  1937,    -1,  1939,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,  1952,    -1,     6,    -1,
-      -1,  1957,  1958,  1959,  1960,  1961,   847,    -1,    -1,    -1,
-      -1,  1967,    -1,    -1,    -1,  1971,    -1,    -1,    -1,    -1,
+      -1,  1864,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1872,
+      -1,   216,   217,   218,   219,   220,   221,   222,   223,   224,
+     225,   226,   227,   228,   229,   230,   231,   232,   233,    -1,
+      -1,    -1,    -1,   238,  1897,    -1,    -1,    -1,    -1,    -1,
+    1903,    -1,    -1,  1906,    -1,   216,   217,   218,   219,   220,
+     221,   222,   223,   224,   225,   226,   227,   228,   229,   230,
+     231,   232,   233,    -1,    -1,  1422,    -1,   238,    -1,  1932,
+     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
+     226,   227,   228,   229,   230,   231,   232,   233,    -1,    -1,
+      -1,    -1,   238,    -1,  1957,  1958,    -1,    -1,    -1,    -1,
+     829,    -1,    -1,    -1,    -1,    -1,  1969,  1970,    -1,  1972,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,  1252,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,  1998,    -1,    -1,    -1,  1816,  2003,  2004,  2005,
+      -1,    -1,  1985,    -1,    -1,    -1,    -1,  1990,  1991,  1992,
+    1993,  1994,    -1,    -1,   863,    -1,    -1,  2000,    -1,    -1,
+      -1,  2004,    -1,   216,   217,   218,   219,   220,   221,   222,
+     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
+     233,    -1,    -1,    -1,  1521,   238,    -1,    -1,  2031,    -1,
+      -1,    -1,    -1,  2036,  2037,  2038,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,  2049,    -1,   778,   779,
+     780,   781,   782,   783,   784,   785,   786,   787,   788,    -1,
+     790,   791,   792,   793,    -1,   795,   796,   797,   798,    -1,
+      -1,     6,    -1,    -1,  2077,  2078,  2079,    -1,    -1,   809,
+      -1,   811,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   819,
+      -1,    -1,    -1,  1590,  1591,   825,   826,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   834,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-    2016,  1831,    -1,    -1,    -1,    -1,    -1,    -1,  1287,   216,
-     217,   218,   219,   220,   221,   222,   223,   224,   225,   226,
-     227,   228,   229,   230,   231,   232,   233,    -1,  2044,  2045,
-    2046,   238,    -1,    -1,    -1,    -1,  1315,  1316,  1317,  1318,
-    1319,    -1,    -1,    -1,    -1,  1324,  1325,    -1,    -1,  1328,
-      -1,  1330,    -1,    -1,    -1,  1334,    -1,    -1,  1337,    -1,
+      -1,    -1,  1619,     3,     4,     5,    -1,     7,    -1,    -1,
+      10,    11,    12,    -1,    -1,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,    28,    29,
+      30,    31,    32,    33,    34,    35,    36,    37,    38,    -1,
+      -1,    -1,    -1,    -1,    -1,  1034,    46,    47,    48,    49,
+      50,    51,    52,    53,    54,    55,    56,    57,    58,    59,
+      60,    61,    62,    63,    -1,    -1,    -1,    67,    68,    69,
+      -1,    -1,    72,    -1,    74,    75,    76,    77,    -1,    -1,
+      -1,    -1,    -1,    83,    84,    85,    86,    -1,    88,    -1,
+      -1,   941,   942,   943,    -1,    -1,    -1,   947,   948,    -1,
+      -1,   951,   952,   953,   954,    -1,   956,    -1,    -1,    -1,
+      -1,   961,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   126,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,  1123,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,  1764,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-    1349,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   216,   217,   218,   219,
-     220,   221,   222,   223,   224,   225,   226,   227,   228,   229,
-     230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,    -1,
-      -1,    -1,    -1,  1014,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,  1957,  1958,  1959,
-    1960,  1961,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1418,
-      -1,  1420,    -1,    -1,    -1,  1424,    -1,  1426,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
-     238,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,  1460,    -1,    -1,    -1,    -1,  2016,    -1,    -1,     3,
+    1777,   216,   217,   218,   219,   220,   221,   222,   223,   224,
+     225,   226,   227,   228,   229,   230,   231,   232,   233,    -1,
+      -1,    -1,    -1,   238,    -1,   185,    -1,    -1,    -1,    -1,
+    1040,  1041,   192,   193,   194,   195,   196,    -1,    -1,    -1,
+      -1,   201,   202,   203,   204,   205,   206,   207,   208,    -1,
+     210,   211,   212,   213,   214,   215,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   227,   228,    -1,
+      -1,    -1,  1849,    -1,   234,    -1,   236,   237,    -1,   239,
+      -1,   241,     3,     4,    -1,   245,   246,  1864,    -1,    10,
+      11,    12,    -1,    -1,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
+      31,    32,    33,    34,    35,    36,    37,    38,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,  1136,  1276,  1277,    -1,
+      -1,    -1,    -1,    -1,    55,    56,    57,    58,    -1,    -1,
+      -1,    -1,    63,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    75,    76,    77,    -1,    -1,    -1,
+      -1,    -1,    83,    84,    -1,    86,    -1,    -1,    -1,    -1,
+       3,     4,    -1,    -1,    -1,    -1,    -1,    10,    11,    12,
+      -1,    -1,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
+      33,    34,    35,    36,    37,    38,    -1,    -1,  1357,    -1,
+      -1,    -1,    -1,  1990,  1991,  1992,  1993,  1994,  1367,    -1,
+      -1,    -1,    55,    56,    57,    58,    -1,    -1,    -1,    -1,
+      63,    -1,     6,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    75,    76,    77,    -1,    -1,    -1,    -1,    -1,
+      83,    84,    -1,    86,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,  1275,    -1,    -1,    -1,    -1,
+      -1,   192,  2049,    -1,    -1,   196,    -1,    -1,    -1,    -1,
+     201,   202,   203,    -1,   205,   206,   207,    -1,    -1,    -1,
+     211,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,  1312,    -1,    -1,    -1,   227,   228,    -1,    -1,
+      -1,    -1,    -1,   234,    -1,    -1,    -1,    -1,   239,    -1,
+      -1,    -1,   243,    -1,    -1,   246,    -1,    -1,    -1,    -1,
+    1340,  1341,  1342,  1343,  1344,    -1,    -1,    -1,    -1,  1349,
+    1350,    -1,    -1,  1353,    -1,  1355,    -1,    -1,    -1,  1359,
+      -1,    -1,  1362,    -1,    -1,    -1,    -1,    -1,    -1,   192,
+      -1,    -1,    -1,   196,  1374,    -1,    -1,    -1,   201,   202,
+     203,  1520,   205,   206,   207,    -1,    -1,    -1,   211,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   227,   228,    -1,    -1,    -1,    -1,
+      -1,   234,    -1,    -1,    -1,    -1,   239,    -1,    -1,    -1,
+     243,    -1,    -1,   246,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     6,    -1,
+      -1,    -1,    -1,  1443,    -1,  1445,    -1,    -1,    -1,  1449,
+      -1,  1451,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+      -1,    -1,    -1,    -1,   238,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,  1485,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     3,
        4,     5,    -1,    -1,    -1,    -1,    10,    11,    12,    -1,
-    1101,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      -1,    15,    16,    17,    18,    19,    20,    21,    22,    23,
       24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
       34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
-      -1,    -1,    46,    47,    48,    49,    50,    51,    52,    53,
+       6,    -1,    46,    47,    48,    49,    50,    51,    52,    53,
       54,    55,    56,    57,    58,    59,    60,    61,    62,    63,
       64,    -1,    -1,    67,    68,    69,    -1,    -1,    72,    -1,
-      74,    75,    76,    77,    -1,    -1,    -1,    -1,  1547,    83,
+      74,    75,    76,    77,    -1,  1575,    -1,    -1,    -1,    83,
       84,    85,    86,    -1,    88,    -1,    -1,    91,    -1,    -1,
       94,    -1,    -1,    97,    -1,    99,    -1,    -1,    -1,    -1,
       -1,    -1,   106,    -1,    -1,    -1,   110,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,   119,    -1,   121,    -1,    -1,
      124,    -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,   133,
      134,   135,   136,   137,    -1,    -1,   140,   141,   142,   143,
-     144,    -1,    -1,    -1,   148,    -1,    -1,   151,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,  1253,  1254,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1647,    -1,
-      -1,  1650,    -1,    -1,    -1,    -1,    -1,    -1,   192,   193,
+     144,    -1,    -1,    -1,   148,    -1,    -1,   151,   216,   217,
+     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
+     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
+     238,    -1,    -1,    -1,    -1,  1675,    -1,    -1,  1678,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   192,   193,
      194,   195,   196,   197,    -1,    -1,    -1,   201,   202,   203,
      204,   205,   206,   207,   208,    -1,   210,   211,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1688,
-    1689,    -1,  1691,   227,   228,     6,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1719,
+    1720,    -1,  1722,   227,   228,     6,    -1,    -1,    -1,    -1,
      234,    -1,    -1,    -1,    -1,   239,    -1,    -1,    -1,   243,
-      -1,  1332,   246,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,  1342,    -1,    -1,    -1,   216,   217,   218,   219,   220,
-     221,   222,   223,   224,   225,   226,   227,   228,   229,   230,
-     231,   232,   233,    -1,    -1,    -1,    -1,   238,    -1,   240,
-      -1,  1750,  1751,    -1,     3,     4,     5,   248,    -1,    -1,
-      -1,    10,    11,    12,    -1,    -1,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
-      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
-      39,    40,    41,    42,    43,  1794,    -1,    46,    47,    48,
-      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
-      59,    60,    61,    62,    63,    64,    -1,    -1,    67,    68,
-      69,    -1,    -1,    72,    -1,    74,    75,    76,    77,    -1,
-      -1,    -1,    -1,    -1,    83,    84,    85,    86,    -1,    88,
-      -1,    -1,    91,    -1,    -1,    94,    -1,    -1,    97,    -1,
-      99,    -1,    -1,    -1,    -1,    -1,    -1,   106,    -1,    -1,
-      -1,   110,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     119,  1492,   121,    -1,    -1,   124,    -1,   126,    -1,    -1,
-      -1,    -1,    -1,    -1,   133,   134,   135,   136,   137,    -1,
-      -1,   140,   141,   142,   143,   144,     6,    -1,    -1,   148,
-      -1,    -1,   151,    -1,    -1,   216,   217,   218,   219,   220,
-     221,   222,   223,   224,   225,   226,   227,   228,   229,   230,
-     231,   232,   233,    -1,    -1,    -1,    -1,   238,    -1,     6,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   192,   193,   194,   195,   196,   197,    -1,
-      -1,    -1,   201,   202,   203,   204,   205,   206,   207,   208,
-       6,   210,   211,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   227,   228,
-      -1,    -1,    -1,    -1,    -1,   234,    -1,    -1,    -1,    -1,
-     239,    -1,    -1,    -1,   243,    -1,    -1,   246,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,     3,     4,     5,    -1,     7,
-      -1,    -1,    10,    11,    12,    -1,  2025,    15,    16,    17,
+      -1,    -1,   246,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
+     226,   227,   228,   229,   230,   231,   232,   233,    -1,    -1,
+      -1,    -1,   238,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,  1781,  1782,    -1,    -1,     3,     4,     5,    -1,    -1,
+      -1,    -1,    10,    11,    12,    -1,    -1,    15,    16,    17,
       18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
       28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
-      38,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    46,    47,
+      38,    39,    40,    41,    42,    43,    -1,  1827,    46,    47,
       48,    49,    50,    51,    52,    53,    54,    55,    56,    57,
-      58,    59,    60,    61,    62,    63,    -1,    -1,    -1,    67,
+      58,    59,    60,    61,    62,    63,    64,    -1,    -1,    67,
       68,    69,    -1,    -1,    72,    -1,    74,    75,    76,    77,
       -1,    -1,    -1,    -1,    -1,    83,    84,    85,    86,    -1,
-      88,    -1,    -1,    -1,    -1,    -1,   216,   217,   218,   219,
-     220,   221,   222,   223,   224,   225,   226,   227,   228,   229,
-     230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   126,   216,
-     217,   218,   219,   220,   221,   222,   223,   224,   225,   226,
-     227,   228,   229,   230,   231,   232,   233,    -1,    -1,    -1,
-      -1,   238,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
-     226,   227,   228,   229,   230,   231,   232,   233,    -1,    -1,
-      -1,    -1,   238,     6,    -1,    -1,    -1,   185,    -1,    -1,
-      -1,    -1,    -1,    -1,   192,   193,   194,   195,   196,    -1,
+      88,    -1,    -1,    91,    -1,    -1,    94,    -1,    -1,    97,
+      -1,    99,    -1,    -1,    -1,    -1,    -1,    -1,   106,    -1,
+      -1,    -1,   110,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   119,    -1,   121,    -1,    -1,   124,    -1,   126,    -1,
+      -1,    -1,    -1,    -1,    -1,   133,   134,   135,   136,   137,
+      -1,    -1,   140,   141,   142,   143,   144,    -1,    -1,    -1,
+     148,    -1,    -1,   151,    -1,   216,   217,   218,   219,   220,
+     221,   222,   223,   224,   225,   226,   227,   228,   229,   230,
+     231,   232,   233,    -1,    -1,    -1,    -1,   238,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   192,   193,   194,   195,   196,   197,
       -1,    -1,    -1,   201,   202,   203,   204,   205,   206,   207,
-     208,    -1,   210,   211,   212,   213,   214,   215,    -1,    -1,
+     208,    -1,   210,   211,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   227,
-     228,    -1,    -1,    -1,    -1,    -1,   234,    -1,   236,   237,
-      -1,   239,    -1,   241,     3,     4,     5,   245,   246,    -1,
-      -1,    10,    11,    12,    -1,    -1,    15,    16,    17,    18,
+     228,    -1,    -1,    -1,    -1,    -1,   234,    -1,    -1,    -1,
+      -1,   239,    -1,    -1,    -1,   243,    -1,    -1,   246,   216,
+     217,   218,   219,   220,   221,   222,   223,   224,   225,   226,
+     227,   228,   229,   230,   231,   232,   233,     3,     4,     5,
+      -1,   238,    -1,    -1,    10,    11,    12,   244,  2058,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
+      36,    37,    38,    39,    40,    41,    42,    43,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    55,
+      56,    57,    58,    -1,    -1,    -1,    -1,    63,    64,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    75,
+      76,    77,    -1,    -1,    13,    14,    -1,    83,    84,    -1,
+      86,    -1,    -1,    -1,    -1,    91,    -1,    -1,    94,    -1,
+      -1,    97,    -1,    99,    -1,    -1,    -1,    -1,    -1,    -1,
+     106,    -1,    -1,    -1,   110,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   119,    -1,   121,    -1,    -1,   124,    -1,
+     126,    -1,    -1,    -1,    -1,    -1,    -1,   133,   134,   135,
+     136,   137,    -1,    -1,   140,   141,   142,   143,   144,    -1,
+      -1,    -1,   148,    -1,    -1,   151,    -1,    -1,    -1,    -1,
+      -1,    -1,    91,    92,    93,    94,    95,    96,    97,    98,
+      99,   100,   101,   102,   103,    -1,    -1,    -1,   107,   108,
+     109,   110,    -1,    -1,   113,    -1,    -1,    -1,    -1,    -1,
+     119,   120,    -1,    -1,   123,   124,   192,   126,   127,    -1,
+     196,   197,    -1,    -1,    -1,   201,   202,   203,    -1,   205,
+     206,   207,    -1,    -1,    -1,   211,   145,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   227,   228,    -1,    -1,    -1,    -1,    -1,   234,    -1,
+     169,   170,   171,   239,     3,     4,    -1,   243,    -1,     8,
+     246,    10,    11,    12,    -1,    -1,    15,    16,    17,    18,
       19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
       29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
       39,    40,    41,    42,    43,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    55,    56,    57,    58,
       -1,    -1,    -1,    -1,    63,    64,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    75,    76,    77,    -1,
-      -1,    -1,    -1,    -1,    83,    84,    -1,    86,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   244,    75,    76,    77,    -1,
+      -1,    13,    14,    -1,    83,    84,    -1,    86,    -1,    -1,
       -1,    -1,    91,    -1,    -1,    94,    -1,    -1,    97,    -1,
       99,    -1,    -1,    -1,    -1,    -1,    -1,   106,    -1,    -1,
       -1,   110,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      119,    -1,   121,    -1,    -1,   124,    -1,   126,    -1,    -1,
       -1,    -1,    -1,    -1,   133,   134,   135,   136,   137,    -1,
       -1,   140,   141,   142,   143,   144,    -1,    -1,    -1,   148,
-      -1,    -1,   151,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,    -1,    -1,    -1,    -1,   238,    -1,    -1,    -1,    -1,
-       6,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   192,    -1,    -1,    -1,   196,   197,    -1,
+      -1,    -1,   151,    -1,    -1,    -1,    -1,    -1,    -1,    91,
+      92,    93,    94,    95,    96,    97,    98,    99,   100,   101,
+     102,   103,    -1,    -1,    -1,   107,   108,   109,   110,    -1,
+      -1,   113,    -1,    -1,    -1,    -1,    -1,   119,   120,    -1,
+      -1,   123,   124,   192,   126,   127,    -1,   196,   197,    -1,
       -1,    -1,   201,   202,   203,    -1,   205,   206,   207,    -1,
-      -1,    -1,   211,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   211,   145,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   227,   228,
-      -1,    -1,    -1,    -1,    -1,   234,    -1,    -1,    -1,    -1,
-     239,     3,     4,     5,   243,    -1,    -1,   246,    10,    11,
+      -1,    -1,    -1,    -1,    -1,   234,    -1,   169,   170,   171,
+     239,     3,     4,     5,    -1,   244,    -1,   246,    10,    11,
       12,    -1,    -1,    15,    16,    17,    18,    19,    20,    21,
       22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
       32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
       42,    43,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    55,    56,    57,    58,    -1,    -1,    -1,
       -1,    63,    64,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    75,    76,    77,    -1,    -1,    -1,    -1,
+      -1,    -1,   244,    75,    76,    77,    -1,    -1,    13,    14,
       -1,    83,    84,    -1,    86,    -1,    -1,    -1,    -1,    91,
       -1,    -1,    94,    -1,    -1,    97,    -1,    99,    -1,    -1,
       -1,    -1,    -1,    -1,   106,    -1,    -1,    -1,   110,    -1,
@@ -4229,22 +4372,22 @@ static const yytype_int16 yycheck[] =
       -1,    -1,   124,    -1,   126,    -1,    -1,    -1,    -1,    -1,
       -1,   133,   134,   135,   136,   137,    -1,    -1,   140,   141,
      142,   143,   144,    -1,    -1,    -1,   148,    -1,    -1,   151,
-     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
-     226,   227,   228,   229,   230,   231,   232,   233,    -1,    -1,
-      -1,    -1,   238,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     192,    -1,    -1,    -1,   196,   197,    -1,    -1,    -1,   201,
+      -1,    -1,    -1,    -1,    -1,    -1,    91,    92,    93,    94,
+      95,    96,    97,    98,    99,   100,   101,   102,   103,    -1,
+      -1,    -1,   107,   108,   109,   110,    -1,    -1,   113,    -1,
+      -1,    -1,    -1,    -1,   119,   120,    -1,    -1,   123,   124,
+     192,   126,   127,    -1,   196,   197,    -1,    -1,    -1,   201,
      202,   203,    -1,   205,   206,   207,    -1,    -1,    -1,   211,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     145,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,   227,   228,    -1,    -1,    -1,
-      -1,    -1,   234,    -1,    -1,    -1,    -1,   239,     3,     4,
+      -1,    -1,   234,    -1,   169,   170,   171,   239,     3,     4,
       -1,   243,    -1,    -1,   246,    10,    11,    12,    -1,    -1,
       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
       35,    36,    37,    38,    39,    40,    41,    42,    43,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       55,    56,    57,    58,    -1,    -1,    -1,    -1,    63,    64,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   244,
       75,    76,    77,    -1,    -1,    13,    14,    -1,    83,    84,
       -1,    86,    -1,    -1,    -1,    -1,    91,    -1,    -1,    94,
       -1,    -1,    97,    -1,    99,    -1,    -1,    -1,    -1,    -1,
@@ -4421,13 +4564,13 @@ static const yytype_int16 yycheck[] =
       -1,    -1,   148,    -1,    -1,   151,    -1,    -1,    -1,    -1,
       -1,    -1,    91,    92,    93,    94,    95,    96,    97,    98,
       99,   100,   101,   102,   103,    -1,    -1,    -1,   107,   108,
-     109,   110,    -1,    -1,   113,    -1,    -1,    -1,    -1,    -1,
+     109,   110,    -1,    -1,   113,     8,    -1,    -1,    -1,    -1,
      119,   120,    -1,    -1,   123,   124,   192,   126,   127,    -1,
      196,   197,    -1,    -1,    -1,   201,   202,   203,    -1,   205,
      206,   207,    -1,    -1,    -1,   211,   145,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,   227,   228,    -1,    -1,    -1,    -1,    -1,   234,    -1,
-     169,   170,   171,   239,     3,     4,    -1,   243,    -1,    -1,
+     169,   170,   171,   239,     3,     4,    -1,   243,    -1,     8,
      246,    10,    11,    12,    -1,    -1,    15,    16,    17,    18,
       19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
       29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
@@ -4435,142 +4578,220 @@ static const yytype_int16 yycheck[] =
       -1,    -1,    -1,    -1,    -1,    -1,    55,    56,    57,    58,
       -1,    -1,    -1,    -1,    63,    64,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,   244,    75,    76,    77,    -1,
-      -1,    13,    14,    -1,    83,    84,    -1,    86,    -1,    -1,
+      -1,    -1,    -1,    -1,    83,    84,    -1,    86,    -1,    -1,
       -1,    -1,    91,    -1,    -1,    94,    -1,    -1,    97,    -1,
       99,    -1,    -1,    -1,    -1,    -1,    -1,   106,    -1,    -1,
       -1,   110,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      119,    -1,   121,    -1,    -1,   124,    -1,   126,    -1,    -1,
       -1,    -1,    -1,    -1,   133,   134,   135,   136,   137,    -1,
       -1,   140,   141,   142,   143,   144,    -1,    -1,    -1,   148,
-      -1,    -1,   151,    -1,    -1,    -1,    -1,    -1,    -1,    91,
-      92,    93,    94,    95,    96,    97,    98,    99,   100,   101,
-     102,   103,    -1,    -1,    -1,   107,   108,   109,   110,    -1,
-      -1,   113,    -1,    -1,    -1,    -1,    -1,   119,   120,    -1,
-      -1,   123,   124,   192,   126,   127,    -1,   196,   197,    -1,
+      -1,    -1,   151,   216,   217,   218,   219,   220,   221,   222,
+     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
+     233,    -1,    -1,    -1,    -1,   238,    -1,     8,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   192,    -1,    -1,    -1,   196,   197,    -1,
       -1,    -1,   201,   202,   203,    -1,   205,   206,   207,    -1,
-      -1,    -1,   211,   145,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   211,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   227,   228,
-      -1,    -1,    -1,    -1,    -1,   234,    -1,   169,   170,   171,
-     239,     3,     4,    -1,   243,    -1,    -1,   246,    10,    11,
-      12,    -1,    -1,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
-      42,    43,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    55,    56,    57,    58,    -1,    -1,    -1,
-      -1,    63,    64,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   244,    75,    76,    77,    -1,    -1,    13,    14,
-      -1,    83,    84,    -1,    86,    -1,    -1,    -1,    -1,    91,
-      -1,    -1,    94,    -1,    -1,    97,    -1,    99,    -1,    -1,
-      -1,    -1,    -1,    -1,   106,    -1,    -1,    -1,   110,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   119,    -1,   121,
-      -1,    -1,   124,    -1,   126,    -1,    -1,    -1,    -1,    -1,
-      -1,   133,   134,   135,   136,   137,    -1,    -1,   140,   141,
-     142,   143,   144,    -1,    -1,    -1,   148,    -1,    -1,   151,
-      -1,    -1,    -1,    -1,    -1,    -1,    91,    92,    93,    94,
-      95,    96,    97,    98,    99,   100,   101,   102,   103,    -1,
-      -1,    -1,   107,   108,   109,   110,    -1,    -1,   113,     7,
-       8,    -1,    -1,    -1,   119,   120,    -1,    -1,   123,   124,
-     192,   126,   127,    -1,   196,   197,    -1,    -1,    -1,   201,
-     202,   203,    -1,   205,   206,   207,    -1,    -1,    -1,   211,
-     145,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   227,   228,    -1,    -1,    -1,
-      -1,    -1,   234,    -1,   169,   170,   171,   239,     3,     4,
-      -1,   243,    -1,    -1,   246,    10,    11,    12,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   234,     3,     4,    -1,    -1,
+     239,     8,    -1,    10,    11,    12,    -1,   246,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+      37,    38,    39,    40,    41,    42,    43,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    55,    56,
+      57,    58,    -1,    -1,    -1,    -1,    63,    64,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    75,    76,
+      77,    -1,    -1,    -1,    -1,    -1,    83,    84,    -1,    86,
+      -1,    -1,    -1,    -1,    91,    -1,    -1,    94,    -1,    -1,
+      97,    -1,    99,    -1,    -1,    -1,    -1,    -1,    -1,   106,
+      -1,    -1,    -1,   110,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   119,    -1,   121,    -1,    -1,   124,    -1,   126,
+      -1,    -1,    -1,    -1,    -1,    -1,   133,   134,   135,   136,
+     137,    -1,    -1,   140,   141,   142,   143,   144,    -1,    -1,
+      -1,   148,    -1,    -1,   151,   216,   217,   218,   219,   220,
+     221,   222,   223,   224,   225,   226,   227,   228,   229,   230,
+     231,   232,   233,    -1,    -1,    -1,    -1,   238,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   192,    -1,    -1,    -1,   196,
+     197,    -1,    -1,    -1,   201,   202,   203,    -1,   205,   206,
+     207,    -1,    -1,    -1,   211,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     227,   228,    -1,    -1,    -1,    -1,    -1,   234,     3,     4,
+      -1,    -1,   239,    -1,    -1,    10,    11,    12,    -1,   246,
       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
       35,    36,    37,    38,    39,    40,    41,    42,    43,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       55,    56,    57,    58,    -1,    -1,    -1,    -1,    63,    64,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   244,
-      75,    76,    77,    -1,    -1,    -1,    -1,    -1,    83,    84,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      75,    76,    77,    -1,    -1,    13,    14,    -1,    83,    84,
       -1,    86,    -1,    -1,    -1,    -1,    91,    -1,    -1,    94,
       -1,    -1,    97,    -1,    99,    -1,    -1,    -1,    -1,    -1,
       -1,   106,    -1,    -1,    -1,   110,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,   119,    -1,   121,    -1,    -1,   124,
       -1,   126,    -1,    -1,    -1,    -1,    -1,    -1,   133,   134,
      135,   136,   137,    -1,    -1,   140,   141,   142,   143,   144,
-      -1,    -1,    -1,   148,    -1,    -1,   151,    -1,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
-     238,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   192,    -1,    -1,
+      -1,    -1,    -1,   148,    -1,    -1,   151,    -1,    -1,    -1,
+      -1,    -1,    -1,    91,    92,    93,    94,    95,    96,    97,
+      98,    99,   100,   101,   102,   103,    -1,    -1,    -1,   107,
+     108,   109,   110,    -1,    -1,   113,    -1,    -1,    -1,    -1,
+      -1,   119,   120,    -1,    -1,   123,   124,   192,   126,   127,
       -1,   196,   197,    -1,    -1,    -1,   201,   202,   203,    -1,
-     205,   206,   207,    -1,    -1,    -1,   211,    -1,    -1,    -1,
+     205,   206,   207,    -1,    -1,    -1,   211,   145,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,   227,   228,    -1,    -1,    -1,    -1,    -1,   234,
-       3,     4,     5,    -1,   239,    -1,    -1,    10,    11,    12,
-      -1,   246,    15,    16,    17,    18,    19,    20,    21,    22,
+      -1,   169,   170,   171,   239,     3,     4,    -1,   243,    -1,
+      -1,   246,    10,    11,    12,    -1,    -1,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
+      38,    39,    40,    41,    42,    43,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    55,    56,    57,
+      58,    -1,    -1,    -1,    -1,    63,    64,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   244,    75,    76,    77,
+      -1,    -1,    13,    14,    -1,    83,    84,    -1,    86,    -1,
+      -1,    -1,    -1,    91,    -1,    -1,    94,    -1,    -1,    97,
+      -1,    99,    -1,    -1,    -1,    -1,    -1,    -1,   106,    -1,
+      -1,    -1,   110,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   119,    -1,   121,    -1,    -1,   124,    -1,   126,    -1,
+      -1,    -1,    -1,    -1,    -1,   133,   134,   135,   136,   137,
+      -1,    -1,   140,   141,   142,   143,   144,    -1,    -1,    -1,
+     148,    -1,    -1,   151,    -1,    -1,    -1,    -1,    -1,    -1,
+      91,    92,    93,    94,    95,    96,    97,    98,    99,   100,
+     101,   102,   103,    -1,    -1,    -1,   107,   108,   109,   110,
+      -1,    -1,   113,     8,    -1,    -1,    -1,    -1,   119,   120,
+      -1,    -1,   123,   124,   192,   126,   127,    -1,   196,   197,
+      -1,    -1,    -1,   201,   202,   203,    -1,   205,   206,   207,
+      -1,    -1,    -1,   211,   145,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   227,
+     228,    -1,    -1,    -1,    -1,    -1,   234,    -1,   169,   170,
+     171,   239,     3,     4,    -1,   243,    -1,    -1,   246,    10,
+      11,    12,    -1,    -1,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
+      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
+      41,    42,    43,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    55,    56,    57,    58,    -1,    -1,
+      -1,    -1,    63,    64,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   244,    75,    76,    77,    -1,    -1,    -1,
+      -1,    -1,    83,    84,    -1,    86,    -1,    -1,    -1,    -1,
+      91,    -1,    -1,    94,    -1,    -1,    97,    -1,    99,    -1,
+      -1,    -1,    -1,    -1,    -1,   106,    -1,    -1,    -1,   110,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   119,    -1,
+     121,    -1,    -1,   124,    -1,   126,    -1,    -1,    -1,    -1,
+      -1,    -1,   133,   134,   135,   136,   137,    -1,    -1,   140,
+     141,   142,   143,   144,    -1,    -1,    -1,   148,    -1,    -1,
+     151,   216,   217,   218,   219,   220,   221,   222,   223,   224,
+     225,   226,   227,   228,   229,   230,   231,   232,   233,    -1,
+      -1,    -1,    -1,   238,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   192,    -1,    -1,    -1,   196,   197,    -1,    -1,    -1,
+     201,   202,   203,    -1,   205,   206,   207,    -1,    -1,    -1,
+     211,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   227,   228,    -1,    -1,
+      -1,    -1,    -1,   234,     3,     4,     5,    -1,   239,    -1,
+      -1,    10,    11,    12,    -1,   246,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
+      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+       8,    -1,    -1,    -1,    -1,    -1,    -1,    46,    47,    48,
+      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
+      59,    60,    61,    62,    63,    -1,    -1,    -1,    67,    68,
+      69,    -1,    -1,    72,    -1,    74,    75,    76,    77,    -1,
+      -1,    -1,    -1,    -1,    83,    84,    85,    86,    -1,    88,
+       3,     4,     5,    -1,    -1,    -1,    -1,    10,    11,    12,
+      -1,    -1,    15,    16,    17,    18,    19,    20,    21,    22,
       23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
-      33,    34,    35,    36,    37,    38,     8,    -1,    -1,    -1,
+      33,    34,    35,    36,    37,    38,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    46,    47,    48,    49,    50,    51,    52,
       53,    54,    55,    56,    57,    58,    59,    60,    61,    62,
       63,    -1,    -1,    -1,    67,    68,    69,    -1,    -1,    72,
       -1,    74,    75,    76,    77,    -1,    -1,    -1,    -1,    -1,
-      83,    84,    85,    86,    -1,    88,     3,     4,     5,    -1,
-      -1,    -1,    -1,    10,    11,    12,    -1,    -1,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
-      37,    38,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    46,
-      47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
-      57,    58,    59,    60,    61,    62,    63,    -1,    -1,    -1,
-      67,    68,    69,    -1,    -1,    72,    -1,    74,    75,    76,
-      77,    -1,    -1,    -1,    -1,    -1,    83,    84,    85,    86,
-      -1,    88,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   192,
+      83,    84,    85,    86,    -1,    88,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   192,   193,   194,   195,   196,    -1,    -1,
+      -1,    -1,   201,   202,   203,   204,   205,   206,   207,   208,
+      -1,   210,   211,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   227,   228,
+      -1,    -1,    -1,    -1,    -1,   234,    -1,    -1,    -1,    -1,
+     239,    -1,    -1,    -1,   243,    -1,    -1,   246,   216,   217,
+     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
+     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
+     238,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   192,
      193,   194,   195,   196,    -1,    -1,    -1,    -1,   201,   202,
      203,   204,   205,   206,   207,   208,    -1,   210,   211,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,   227,   228,    -1,    -1,    -1,    -1,
-      -1,   234,    -1,    -1,    -1,    -1,   239,    -1,    -1,    -1,
-     243,    -1,    -1,   246,   216,   217,   218,   219,   220,   221,
-     222,   223,   224,   225,   226,   227,   228,   229,   230,   231,
-     232,   233,    -1,    -1,    -1,    -1,   238,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   192,   193,   194,   195,   196,
-      -1,    -1,    -1,    -1,   201,   202,   203,   204,   205,   206,
-     207,   208,    -1,   210,   211,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     227,   228,    -1,    -1,    -1,    -1,    -1,   234,    -1,    -1,
-      -1,    -1,   239,     3,     4,     5,   243,    -1,    -1,   246,
+      -1,   234,    -1,    -1,    -1,    -1,   239,     3,     4,     5,
+     243,    -1,    -1,   246,    10,    11,    12,    -1,    -1,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
+      36,    37,    38,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+      56,    57,    58,    59,    60,    61,    62,    63,    -1,    -1,
+      -1,    67,    68,    69,    -1,    -1,    72,    -1,    74,    75,
+      76,    77,    -1,    -1,    -1,    -1,    -1,    83,    84,    85,
+      86,    -1,    88,     3,     4,     5,    -1,    -1,    -1,    -1,
       10,    11,    12,    -1,    -1,    15,    16,    17,    18,    19,
       20,    21,    22,    23,    24,    25,    26,    27,    28,    29,
-      30,    31,    32,    33,    34,    35,    36,    37,    38,     8,
+      30,    31,    32,    33,    34,    35,    36,    37,    38,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    46,    47,    48,    49,
       50,    51,    52,    53,    54,    55,    56,    57,    58,    59,
       60,    61,    62,    63,    -1,    -1,    -1,    67,    68,    69,
-      -1,    -1,    72,    -1,    74,    75,    76,    77,    -1,    -1,
-      -1,    -1,    -1,    83,    84,    85,    86,    -1,    88,     3,
-       4,     5,    -1,    -1,    -1,    -1,    10,    11,    12,    -1,
-      -1,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,    55,    56,    57,    58,    59,    60,    61,    62,    63,
-      -1,    -1,    -1,    67,    68,    69,    -1,    -1,    72,    -1,
-      74,    75,    76,    77,    -1,    -1,    -1,    -1,    -1,    83,
-      84,    85,    86,    -1,    88,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    72,    -1,    74,    75,    76,    77,   129,    -1,
+      -1,    -1,    -1,    83,    84,    85,    86,    -1,    88,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   192,   193,   194,   195,   196,    -1,    -1,    -1,
-      -1,   201,   202,   203,   204,   205,   206,   207,   208,    -1,
-     210,   211,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   192,   193,   194,   195,
+     196,    -1,    -1,    -1,    -1,   201,   202,   203,   204,   205,
+     206,   207,   208,    -1,   210,   211,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   227,   228,    -1,    -1,    -1,    -1,    -1,   234,    -1,
+      -1,    -1,    -1,   239,    -1,    -1,    -1,   243,    -1,    -1,
+     246,    -1,    -1,    -1,    -1,   216,   217,   218,   219,   220,
+     221,   222,   223,   224,   225,   226,   227,   228,   229,   230,
+     231,   232,   233,    -1,    -1,    -1,    -1,   238,    -1,    -1,
+      -1,    -1,   192,   193,   194,   195,   196,    -1,    -1,    -1,
+      -1,   201,   202,   203,   204,   205,   206,   207,   208,    -1,
+     210,   211,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,   227,   228,    -1,
-      -1,    -1,    -1,    -1,   234,    -1,    -1,    -1,    -1,   239,
-      -1,    -1,    -1,   243,    -1,    -1,   246,   216,   217,   218,
+      -1,    -1,    -1,    -1,   234,     3,     4,    -1,    -1,   239,
+       8,    -1,    10,    11,    12,    -1,   246,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
+      38,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    55,    56,    57,
+      58,    -1,    -1,    -1,    -1,    63,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    75,    76,    77,
+      -1,    -1,     3,     4,    -1,    83,    84,    -1,    86,    10,
+      11,    12,    -1,    -1,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
+      31,    32,    33,    34,    35,    36,    37,    38,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    55,    56,    57,    58,    -1,    -1,
+      -1,    -1,    63,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    75,    76,    77,    -1,    -1,    -1,
+      -1,    -1,    83,    84,    -1,    86,    -1,   216,   217,   218,
      219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
      229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,
-      -1,    -1,    -1,    -1,     8,    -1,    -1,    -1,   192,   193,
-     194,   195,   196,    -1,    -1,    -1,    -1,   201,   202,   203,
-     204,   205,   206,   207,   208,    -1,   210,   211,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   227,   228,    -1,    -1,    -1,    -1,    -1,
-     234,     3,     4,    -1,    -1,   239,    -1,    -1,    10,    11,
-      12,    -1,   246,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    35,    36,    37,    38,    -1,     8,    -1,
+      -1,   240,    -1,   242,   192,    -1,    -1,    -1,   196,   248,
+      -1,    -1,    -1,   201,   202,   203,    -1,   205,   206,   207,
+      -1,    -1,    -1,   211,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   227,
+     228,    -1,    -1,    -1,    -1,    -1,   234,    -1,    -1,    -1,
+      -1,   239,    -1,    -1,    -1,    -1,    -1,    -1,   246,    -1,
+      -1,   216,   217,   218,   219,   220,   221,   222,   223,   224,
+     225,   226,   227,   228,   229,   230,   231,   232,   233,    -1,
+      -1,   192,    -1,   238,    -1,   196,    -1,    -1,    -1,   244,
+     201,   202,   203,   248,   205,   206,   207,    -1,    -1,    -1,
+     211,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   227,   228,    -1,    -1,
+      -1,    -1,    -1,   234,     3,     4,    -1,     6,   239,   240,
+      -1,    10,    11,    12,    -1,   246,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
+      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    55,    56,    57,    58,    -1,    -1,    -1,
-      -1,    63,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    75,    76,    77,    -1,    -1,     3,     4,
-      -1,    83,    84,    -1,    86,    10,    11,    12,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    55,    56,    57,    58,
+      -1,    -1,    -1,    -1,    63,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    75,    76,    77,    -1,
+      -1,    -1,    -1,    -1,    83,    84,    -1,    86,     3,     4,
+      -1,     6,    -1,    -1,    -1,    10,    11,    12,    -1,    -1,
       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
       35,    36,    37,    38,    -1,    -1,    -1,    -1,    -1,    -1,
@@ -4578,225 +4799,154 @@ static const yytype_int16 yycheck[] =
       55,    56,    57,    58,    -1,    -1,    -1,    -1,    63,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       75,    76,    77,    -1,    -1,    -1,    -1,    -1,    83,    84,
-      -1,    86,   216,   217,   218,   219,   220,   221,   222,   223,
-     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
-      -1,    -1,    -1,    -1,   238,    -1,    -1,    -1,    -1,    -1,
-     192,    -1,    -1,    -1,   196,    -1,    -1,    -1,    -1,   201,
-     202,   203,    -1,   205,   206,   207,    -1,    -1,    -1,   211,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   227,   228,    -1,    -1,    -1,
-      -1,    -1,   234,    -1,    -1,    -1,    -1,   239,    -1,    -1,
-      -1,   243,    -1,    -1,   246,    -1,   216,   217,   218,   219,
-     220,   221,   222,   223,   224,   225,   226,   227,   228,   229,
-     230,   231,   232,   233,    -1,    -1,    -1,   192,   238,    -1,
-      -1,   196,    -1,    -1,    -1,     8,   201,   202,   203,    -1,
+      -1,    86,    -1,   216,   217,   218,   219,   220,   221,   222,
+     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
+     233,    -1,    -1,   192,    -1,   238,    -1,   196,    -1,    -1,
+      -1,   244,   201,   202,   203,   248,   205,   206,   207,    -1,
+      -1,    -1,   211,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   227,   228,
+      -1,    -1,    -1,    -1,    -1,   234,    -1,    -1,    -1,    -1,
+     239,    -1,    -1,    -1,    -1,    -1,    -1,   246,   216,   217,
+     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
+     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
+     238,    -1,   240,    -1,    -1,    -1,    -1,   192,    -1,    -1,
+     248,   196,    -1,    -1,    -1,    -1,   201,   202,   203,    -1,
      205,   206,   207,    -1,    -1,    -1,   211,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,   227,   228,    -1,    -1,    -1,    -1,    -1,   234,
-      -1,    -1,    -1,    -1,   239,     3,     4,    -1,   243,    -1,
-      -1,   246,    10,    11,    12,    -1,    -1,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
-      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
-      38,     8,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    55,    56,    57,
-      58,    -1,    -1,    -1,    -1,    63,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    75,    76,    77,
-      -1,    -1,    -1,    -1,    -1,    83,    84,    -1,    86,     3,
-       4,    -1,     6,    -1,    -1,    -1,    10,    11,    12,    -1,
-      -1,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    55,    56,    57,    58,    -1,    -1,    -1,    -1,    63,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    75,    76,    77,    -1,    -1,    -1,    -1,    -1,    83,
-      84,    -1,    86,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,    -1,    -1,    -1,   192,   238,    -1,    -1,   196,    -1,
-      -1,    -1,    -1,   201,   202,   203,    -1,   205,   206,   207,
-      -1,    -1,    -1,   211,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   227,
-     228,    -1,    -1,    -1,    -1,    -1,   234,    -1,    -1,    -1,
-      -1,   239,   240,    -1,    -1,    -1,    -1,    -1,   246,   216,
-     217,   218,   219,   220,   221,   222,   223,   224,   225,   226,
-     227,   228,   229,   230,   231,   232,   233,    -1,    -1,    -1,
-      -1,   238,    -1,    -1,    -1,    -1,    -1,    -1,   192,    -1,
-      -1,    -1,   196,    -1,    -1,    -1,    -1,   201,   202,   203,
-      -1,   205,   206,   207,    -1,    -1,    -1,   211,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   227,   228,    -1,    -1,    -1,    -1,    -1,
-     234,     3,     4,    -1,     6,   239,    -1,    -1,    10,    11,
-      12,    -1,   246,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    35,    36,    37,    38,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    55,    56,    57,    58,    -1,    -1,    -1,
-      -1,    63,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    75,    76,    77,    -1,    -1,    -1,    -1,
-      -1,    83,    84,    -1,    86,     3,     4,    -1,     6,    -1,
-      -1,    -1,    10,    11,    12,    -1,    -1,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
-      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
-      38,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    55,    56,    57,
-      58,    -1,    -1,    -1,    -1,    63,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    75,    76,    77,
-      -1,    -1,    -1,    -1,    -1,    83,    84,    -1,    86,    -1,
-     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
-     226,   227,   228,   229,   230,   231,   232,   233,    -1,    -1,
-     192,    -1,   238,    -1,   196,    -1,    -1,    -1,   244,   201,
-     202,   203,   248,   205,   206,   207,    -1,    -1,    -1,   211,
+       3,     4,    -1,     6,   239,    -1,    -1,    10,    11,    12,
+      -1,   246,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
+      33,    34,    35,    36,    37,    38,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   227,   228,    -1,    -1,    -1,
-      -1,    -1,   234,    -1,    -1,    -1,    -1,   239,    -1,    -1,
-      -1,    -1,    -1,    -1,   246,   216,   217,   218,   219,   220,
-     221,   222,   223,   224,   225,   226,   227,   228,   229,   230,
-     231,   232,   233,    -1,    -1,    -1,    -1,   238,    -1,   240,
-      -1,   242,    -1,    -1,   192,    -1,    -1,   248,   196,    -1,
-      -1,    -1,    -1,   201,   202,   203,    -1,   205,   206,   207,
-      -1,    -1,    -1,   211,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   227,
-     228,    -1,    -1,    -1,    -1,    -1,   234,     3,     4,    -1,
-      -1,   239,    -1,    -1,    10,    11,    12,    -1,   246,    15,
+      -1,    -1,    55,    56,    57,    58,    -1,    -1,    -1,    -1,
+      63,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    75,    76,    77,    -1,    -1,     3,     4,    -1,
+      83,    84,    -1,    86,    10,    11,    12,    -1,    -1,    15,
       16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
       26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
       36,    37,    38,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    55,
       56,    57,    58,    -1,    -1,    -1,    -1,    63,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    75,
-      76,    77,    -1,    -1,     3,     4,    -1,    83,    84,    -1,
-      86,    10,    11,    12,    -1,    -1,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
-      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+      76,    77,    -1,    -1,    -1,    -1,    -1,    83,    84,    -1,
+      86,    -1,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+      -1,    -1,    -1,    -1,   238,    -1,    -1,    -1,    -1,   192,
+     244,    -1,    -1,   196,   248,    -1,    -1,    -1,   201,   202,
+     203,    -1,   205,   206,   207,    -1,    -1,    -1,   211,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    55,    56,    57,    58,
-      -1,    -1,    -1,    -1,    63,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    75,    76,    77,    -1,
-      -1,    -1,    -1,    -1,    83,    84,    -1,    86,    -1,   216,
-     217,   218,   219,   220,   221,   222,   223,   224,   225,   226,
-     227,   228,   229,   230,   231,   232,   233,    -1,    -1,    -1,
-      -1,   238,    -1,    -1,    -1,    -1,   192,   244,    -1,    -1,
-     196,   248,    -1,    -1,    -1,   201,   202,   203,    -1,   205,
+      -1,    -1,    -1,    -1,   227,   228,    -1,    -1,    -1,    -1,
+      -1,   234,    -1,    -1,    -1,    -1,   239,    -1,    -1,    -1,
+      -1,    -1,    -1,   246,    -1,    -1,   216,   217,   218,   219,
+     220,   221,   222,   223,   224,   225,   226,   227,   228,   229,
+     230,   231,   232,   233,    -1,    -1,   192,    -1,   238,    -1,
+     196,    -1,    -1,    -1,    -1,   201,   202,   203,   248,   205,
      206,   207,    -1,    -1,    -1,   211,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   227,   228,    -1,    -1,    -1,    -1,    -1,   234,    -1,
-      -1,    -1,    -1,   239,   240,    -1,    -1,    -1,    -1,    -1,
-     246,    -1,    -1,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,    -1,    -1,   192,    -1,   238,    -1,   196,    -1,    -1,
-      -1,   244,   201,   202,   203,   248,   205,   206,   207,    -1,
-      -1,    -1,   211,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   227,   228,
-      -1,    -1,    -1,    -1,    -1,   234,     3,     4,    -1,    -1,
-     239,   240,    -1,    10,    11,    12,    -1,   246,    15,    16,
+      -1,   227,   228,    -1,    -1,    -1,    -1,    -1,   234,     3,
+       4,    -1,    -1,   239,   240,    -1,    10,    11,    12,    -1,
+     246,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
+      34,    35,    36,    37,    38,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    55,    56,    57,    58,    -1,    -1,    -1,    -1,    63,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    75,    76,    77,    -1,    -1,     3,     4,    -1,    83,
+      84,    -1,    86,    10,    11,    12,    -1,    -1,    15,    16,
       17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
       27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
-      37,    38,    -1,    -1,    13,    14,    -1,    -1,    -1,    -1,
+      37,    38,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    55,    56,
       57,    58,    -1,    -1,    -1,    -1,    63,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    75,    76,
-      77,    -1,    -1,    13,    14,    -1,    83,    84,    -1,    86,
-     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
-     226,   227,   228,   229,   230,   231,   232,   233,    -1,    -1,
-      -1,    -1,   238,    -1,    -1,    -1,    -1,    -1,   244,    -1,
-      -1,    -1,    91,    92,    93,    94,    95,    96,    97,    98,
-      99,   100,   101,   102,   103,    -1,    -1,    -1,   107,   108,
-     109,   110,    -1,    -1,   113,    -1,    -1,    -1,    -1,    -1,
-     119,   120,    -1,    -1,   123,   124,    -1,   126,   127,    -1,
-      -1,    91,    92,    93,    94,    95,    96,    97,    98,    99,
-     100,   101,   102,   103,    13,    14,   145,   107,   108,   109,
-     110,    -1,    -1,   113,    -1,    -1,    -1,    -1,    -1,   119,
-     120,    -1,    -1,   123,   124,   192,   126,   127,    -1,   196,
-     169,   170,   171,    -1,   201,   202,   203,    -1,   205,   206,
-     207,    -1,    -1,    -1,   211,   145,    -1,    -1,    -1,    -1,
+      77,    -1,    -1,    -1,    -1,    -1,    83,    84,    -1,    86,
+      -1,   216,   217,   218,   219,   220,   221,   222,   223,   224,
+     225,   226,   227,   228,   229,   230,   231,   232,   233,    -1,
+      -1,    -1,    -1,   238,    -1,    -1,    -1,    -1,   192,    -1,
+      -1,    -1,   196,   248,    -1,    -1,    -1,   201,   202,   203,
+      -1,   205,   206,   207,    -1,    -1,    -1,   211,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     227,   228,    -1,    -1,    -1,    -1,    -1,   234,    -1,   169,
-     170,   171,   239,    -1,    -1,    -1,    -1,    -1,    -1,   246,
-      -1,    -1,    91,    92,    93,    94,    95,    96,    97,    98,
-      99,   100,   101,   102,   103,    -1,    -1,    -1,   107,   108,
-     109,   110,    -1,    -1,   113,   244,    -1,    -1,    -1,    -1,
-     119,   120,    -1,    -1,   123,   124,    -1,   126,   127,    -1,
-      -1,     0,     1,    -1,    -1,     4,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    13,    14,   145,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   244,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   227,   228,    -1,    -1,    -1,    -1,    -1,
+     234,    -1,    -1,    -1,    -1,   239,   240,    -1,    -1,    -1,
+      -1,    -1,   246,    -1,     0,     1,    -1,    -1,     4,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    13,    14,    -1,
+      -1,    -1,    -1,    -1,    -1,   192,    -1,    -1,    -1,   196,
+      -1,    -1,    -1,    -1,   201,   202,   203,    -1,   205,   206,
+     207,    -1,    -1,    -1,   211,    -1,    -1,    -1,    44,    45,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     169,   170,   171,    -1,    -1,    44,    45,   216,   217,   218,
-     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
-     229,   230,   231,   232,   233,    64,    65,    66,    -1,   238,
-      -1,    70,    71,    -1,    73,   244,    -1,    -1,    -1,    78,
-      79,    -1,    81,    82,    -1,    84,    -1,    -1,    -1,    -1,
-      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
-      99,   100,   101,   102,   103,    -1,    -1,   106,   107,   108,
-     109,   110,   111,    -1,   113,   244,   115,   116,   117,   118,
-     119,   120,   121,    -1,   123,   124,   125,   126,   127,   128,
-      -1,   130,   131,   132,   133,   134,   135,   136,   137,   138,
-      -1,   140,   141,   142,   143,   144,   145,   146,   147,   148,
-     149,   150,   151,   152,   153,    -1,     4,    -1,   157,   158,
-     159,    -1,    -1,    -1,   163,    13,    14,    -1,    -1,   168,
-     169,   170,   171,    -1,    -1,   174,    -1,   176,    -1,   178,
-     179,   180,   181,   182,   183,   184,   185,   186,   187,   188,
-     189,   190,   191,    -1,    -1,    -1,    44,    45,    -1,   198,
-     199,   200,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     209,    -1,   211,    -1,    -1,    -1,    64,    65,    66,    -1,
-      -1,    -1,    70,    71,    -1,    73,    -1,    -1,    -1,    -1,
-      78,    79,    -1,    81,    82,    -1,    84,    -1,    -1,    -1,
-      -1,    89,    90,    91,    92,    93,    94,    95,    96,    97,
-      98,    99,   100,   101,   102,   103,    -1,    -1,   106,   107,
-     108,   109,   110,   111,    -1,   113,    -1,   115,   116,   117,
-     118,   119,   120,   121,    -1,   123,   124,   125,   126,   127,
-     128,    -1,   130,   131,   132,   133,   134,   135,   136,   137,
-     138,    -1,   140,   141,   142,   143,   144,   145,   146,   147,
-     148,   149,   150,   151,   152,   153,    -1,    -1,    -1,   157,
-     158,   159,    -1,    -1,    -1,   163,    -1,    -1,    -1,    -1,
-     168,   169,   170,   171,     4,     5,   174,    -1,   176,    -1,
-     178,   179,   180,   181,   182,   183,   184,   185,   186,   187,
-     188,   189,   190,   191,    -1,    -1,    -1,    -1,    -1,    -1,
-     198,   199,   200,    -1,     4,     5,    -1,    -1,    -1,    -1,
-      -1,   209,    -1,   211,    -1,    -1,    46,    47,    48,    49,
-      50,    51,    52,    53,    54,    -1,    -1,    -1,    -1,    59,
-      60,    61,    62,    -1,     4,     5,    -1,    67,    68,    69,
-      -1,    -1,    72,    -1,    74,    -1,    46,    47,    48,    49,
-      50,    51,    52,    53,    54,    85,    -1,    -1,    88,    59,
-      60,    61,    62,    -1,    -1,     5,    -1,    67,    68,    69,
-      -1,    -1,    72,    -1,    74,    -1,    46,    47,    48,    49,
-      50,    51,    52,    53,    54,    85,    -1,    -1,    88,    59,
-      60,    61,    62,    -1,    -1,    -1,   126,    67,    68,    69,
-      -1,    -1,    72,    -1,    74,    -1,    46,    47,    48,    49,
-      50,    51,    52,    53,    54,    85,    -1,    -1,    88,    59,
-      60,    61,    62,    -1,    -1,    -1,    -1,    67,    68,    69,
-      -1,    -1,    72,    -1,    74,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    85,    -1,    -1,    88,    -1,
+     227,   228,    -1,    -1,    -1,    -1,    -1,   234,    64,    65,
+      66,    -1,   239,    -1,    70,    71,    -1,    73,    -1,   246,
+      -1,    -1,    78,    79,    -1,    81,    82,    -1,    84,    -1,
+      -1,    -1,    -1,    89,    90,    91,    92,    93,    94,    95,
+      96,    97,    98,    99,   100,   101,   102,   103,    -1,    -1,
+     106,   107,   108,   109,   110,   111,    -1,   113,    -1,   115,
+     116,   117,   118,   119,   120,   121,    -1,   123,   124,   125,
+     126,   127,   128,    -1,   130,   131,   132,   133,   134,   135,
+     136,   137,   138,    -1,   140,   141,   142,   143,   144,   145,
+     146,   147,   148,   149,   150,   151,   152,   153,    -1,     4,
+      -1,   157,   158,   159,    -1,    -1,    -1,   163,    13,    14,
+      -1,    -1,   168,   169,   170,   171,    -1,    -1,   174,    -1,
+     176,    -1,   178,   179,   180,   181,   182,   183,   184,   185,
+     186,   187,   188,   189,   190,   191,    -1,    -1,    -1,    44,
+      45,    -1,   198,   199,   200,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   209,    -1,   211,    -1,    -1,    -1,    64,
+      65,    66,    -1,    -1,    -1,    70,    71,    -1,    73,    -1,
+      -1,    -1,    -1,    78,    79,    -1,    81,    82,    -1,    84,
+      -1,    -1,    -1,    -1,    89,    90,    91,    92,    93,    94,
+      95,    96,    97,    98,    99,   100,   101,   102,   103,    -1,
+      -1,   106,   107,   108,   109,   110,   111,    -1,   113,    -1,
+     115,   116,   117,   118,   119,   120,   121,    -1,   123,   124,
+     125,   126,   127,   128,    -1,   130,   131,   132,   133,   134,
+     135,   136,   137,   138,    -1,   140,   141,   142,   143,   144,
+     145,   146,   147,   148,   149,   150,   151,   152,   153,    -1,
+      -1,    -1,   157,   158,   159,    -1,    -1,    -1,   163,    -1,
+      -1,    -1,    -1,   168,   169,   170,   171,     4,     5,   174,
+      -1,   176,    -1,   178,   179,   180,   181,   182,   183,   184,
+     185,   186,   187,   188,   189,   190,   191,    -1,    -1,    -1,
+      -1,    -1,    -1,   198,   199,   200,    -1,     4,     5,    -1,
+      -1,    -1,    -1,    -1,   209,    -1,   211,    -1,    -1,    46,
+      47,    48,    49,    50,    51,    52,    53,    54,    -1,    -1,
+      -1,    -1,    59,    60,    61,    62,    -1,     4,     5,    -1,
+      67,    68,    69,    -1,    -1,    72,    -1,    74,    -1,    46,
+      47,    48,    49,    50,    51,    52,    53,    54,    85,    -1,
+      -1,    88,    59,    60,    61,    62,    -1,    -1,     5,    -1,
+      67,    68,    69,    -1,    -1,    72,    -1,    74,    -1,    46,
+      47,    48,    49,    50,    51,    52,    53,    54,    85,    -1,
+      -1,    88,    59,    60,    61,    62,    -1,    -1,    -1,   126,
+      67,    68,    69,    -1,    -1,    72,    -1,    74,    -1,    46,
+      47,    48,    49,    50,    51,    52,    53,    54,    85,    -1,
+      -1,    88,    59,    60,    61,    62,    -1,    -1,    -1,    -1,
+      67,    68,    69,    -1,    -1,    72,    -1,    74,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    85,    -1,
+      -1,    88,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   193,   194,   195,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   204,    -1,    -1,
+      -1,   208,    -1,   210,   211,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   193,   194,   195,    13,
+      14,    -1,    -1,    -1,    -1,    -1,    -1,   204,    -1,    -1,
+      -1,   208,    -1,   210,   211,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   193,   194,   195,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   204,    -1,    -1,
+      -1,   208,    -1,   210,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   193,   194,   195,    -1,
+      -1,    -1,    -1,    -1,    13,    14,    -1,   204,    -1,    -1,
+      -1,   208,    -1,   210,    -1,    -1,    -1,    91,    92,    93,
+      94,    95,    96,    97,    98,    99,   100,   101,   102,   103,
+      -1,    -1,    -1,   107,   108,   109,   110,    -1,    -1,   113,
+      -1,    -1,    -1,    -1,    -1,   119,   120,    -1,    -1,   123,
+     124,    -1,   126,   127,    -1,    -1,    -1,    -1,   132,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   193,   194,   195,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   204,    -1,    -1,    -1,   208,    -1,
-     210,   211,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   193,   194,   195,    13,    14,    -1,    -1,
-      -1,    -1,    -1,    -1,   204,    -1,    -1,    -1,   208,    -1,
-     210,   211,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   193,   194,   195,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   204,    -1,    -1,    -1,   208,    -1,
-     210,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   193,   194,   195,    -1,    -1,    -1,    -1,
-      -1,    13,    14,    -1,   204,    -1,    -1,    -1,   208,    -1,
-     210,    -1,    -1,    -1,    91,    92,    93,    94,    95,    96,
-      97,    98,    99,   100,   101,   102,   103,    -1,    -1,    -1,
-     107,   108,   109,   110,    -1,    -1,   113,    -1,    -1,    -1,
-      -1,    -1,   119,   120,    -1,    -1,   123,   124,    -1,   126,
-     127,    -1,    -1,    -1,    -1,   132,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   145,    -1,
-      -1,    -1,   149,    -1,    -1,    -1,    -1,    -1,    -1,    91,
-      92,    93,    94,    95,    96,    97,    98,    99,   100,   101,
-     102,   103,   169,   170,   171,   107,   108,   109,   110,    -1,
-      -1,   113,    -1,    -1,    -1,    -1,    -1,   119,   120,    -1,
-      -1,   123,   124,    -1,   126,   127,    -1,    -1,    -1,    -1,
+      -1,   145,    -1,    -1,    -1,   149,    -1,    -1,    -1,    -1,
+      -1,    -1,    91,    92,    93,    94,    95,    96,    97,    98,
+      99,   100,   101,   102,   103,   169,   170,   171,   107,   108,
+     109,   110,    -1,    -1,   113,    -1,    -1,    -1,    -1,    -1,
+     119,   120,    -1,    -1,   123,   124,    -1,   126,   127,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   145,   216,   217,   218,   219,   220,   221,
-     222,   223,   224,   225,   226,   227,   228,   229,   230,   231,
-     232,   233,    -1,    -1,    -1,    -1,   238,   169,   170,   171,
-      -1,    -1,    -1,    -1,    -1,    -1,   248,   216,   217,   218,
+      -1,    -1,    -1,    -1,    -1,    -1,   145,   216,   217,   218,
      219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
      229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   248,
+     169,   170,   171,    -1,    -1,    -1,    -1,    -1,    -1,   248,
      216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
      226,   227,   228,   229,   230,   231,   232,   233,    -1,    -1,
       -1,    -1,   238,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
@@ -4910,18 +5060,6 @@ static const yytype_int16 yycheck[] =
      227,   228,   229,   230,   231,   232,   233,    -1,    -1,    -1,
       -1,   238,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,   248,   216,   217,   218,   219,   220,   221,   222,   223,
-     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
-      -1,    -1,    -1,    -1,   238,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   248,   216,   217,   218,   219,   220,
-     221,   222,   223,   224,   225,   226,   227,   228,   229,   230,
-     231,   232,   233,    -1,    -1,    -1,    -1,   238,    -1,    -1,
-      -1,    -1,    -1,   244,   216,   217,   218,   219,   220,   221,
-     222,   223,   224,   225,   226,   227,   228,   229,   230,   231,
-     232,   233,    -1,    -1,    -1,    -1,   238,    -1,    -1,    -1,
-      -1,    -1,   244,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,    -1,    -1,    -1,    -1,   238,    -1,    -1,    -1,    -1,
-      -1,   244,   216,   217,   218,   219,   220,   221,   222,   223,
      224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
       -1,    -1,    -1,    -1,   238,    -1,    -1,    -1,    -1,    -1,
      244,   216,   217,   218,   219,   220,   221,   222,   223,   224,
@@ -4996,20 +5134,32 @@ static const yytype_int16 yycheck[] =
      238,    -1,    -1,    -1,    -1,    -1,   244,   216,   217,   218,
      219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
      229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,
-      -1,    -1,    -1,    -1,   243,   216,   217,   218,   219,   220,
+      -1,    -1,    -1,    -1,    -1,   244,   216,   217,   218,   219,
+     220,   221,   222,   223,   224,   225,   226,   227,   228,   229,
+     230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,    -1,
+      -1,    -1,    -1,    -1,   244,   216,   217,   218,   219,   220,
      221,   222,   223,   224,   225,   226,   227,   228,   229,   230,
      231,   232,   233,    -1,    -1,    -1,    -1,   238,    -1,    -1,
-      -1,    -1,   243,   216,   217,   218,   219,   220,   221,   222,
+      -1,    -1,    -1,   244,   216,   217,   218,   219,   220,   221,
+     222,   223,   224,   225,   226,   227,   228,   229,   230,   231,
+     232,   233,    -1,    -1,    -1,    -1,   238,    -1,    -1,    -1,
+      -1,    -1,   244,   216,   217,   218,   219,   220,   221,   222,
      223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
      233,    -1,    -1,    -1,    -1,   238,    -1,    -1,    -1,    -1,
-     243,   216,   217,   218,   219,   220,   221,   222,   223,   224,
+      -1,   244,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+      -1,    -1,    -1,    -1,   238,    -1,    -1,    -1,    -1,    -1,
+     244,   216,   217,   218,   219,   220,   221,   222,   223,   224,
      225,   226,   227,   228,   229,   230,   231,   232,   233,    -1,
-      -1,    -1,    -1,   238,    -1,   240,    -1,   242,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
-     238,    -1,    -1,    -1,   242,   216,   217,   218,   219,   220,
+      -1,    -1,    -1,   238,    -1,    -1,    -1,    -1,   243,   216,
+     217,   218,   219,   220,   221,   222,   223,   224,   225,   226,
+     227,   228,   229,   230,   231,   232,   233,    -1,    -1,    -1,
+      -1,   238,    -1,    -1,    -1,    -1,   243,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,
+      -1,    -1,    -1,    -1,   243,   216,   217,   218,   219,   220,
      221,   222,   223,   224,   225,   226,   227,   228,   229,   230,
-     231,   232,   233,    -1,    -1,    -1,    -1,   238,    -1,    -1,
+     231,   232,   233,    -1,    -1,    -1,    -1,   238,    -1,   240,
       -1,   242,   216,   217,   218,   219,   220,   221,   222,   223,
      224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
       -1,    -1,    -1,    -1,   238,    -1,    -1,    -1,   242,   216,
@@ -5038,169 +5188,174 @@ static const yytype_int16 yycheck[] =
      221,   222,   223,   224,   225,   226,   227,   228,   229,   230,
      231,   232,   233,    -1,    -1,    -1,    -1,   238,    -1,    -1,
       -1,   242,   216,   217,   218,   219,   220,   221,   222,   223,
-     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
-      -1,    -1,    -1,    -1,   238,    -1,    -1,    -1,   242,   216,
-     217,   218,   219,   220,   221,   222,   223,   224,   225,   226,
-     227,   228,   229,   230,   231,   232,   233,    -1,    -1,    -1,
-      -1,   238,    -1,    -1,    -1,   242,   216,   217,   218,   219,
-     220,   221,   222,   223,   224,   225,   226,   227,   228,   229,
-     230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,    -1,
-      -1,    -1,   242,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,    -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
-     238,    -1,   240,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,    -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
-     238,    -1,   240,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,    -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
-     238,    -1,   240,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,    -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
-     238,    -1,   240,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,    -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
-     238,    -1,   240,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,    -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
-     238,    -1,   240,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,    -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
-     238,    -1,   240,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,    -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
-     238,    -1,   240,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,    -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
-     238,    -1,   240,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,    -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
-     238,    -1,   240,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,    -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
-     238,    -1,   240,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,    -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
-     238,    -1,   240,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,    -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
-     238,    -1,   240,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,    -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
-     238,    -1,   240,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,    -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
-     238,    -1,   240,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,    -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
-     238,    -1,   240,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,    -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
-     238,    -1,   240,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,    -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
-     238,    -1,   240,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,    -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
-     238,    -1,   240,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,    -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
-     238,    -1,   240,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,    -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
-     238,    -1,   240,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,    -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
-     238,    -1,   240,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,    -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
-     238,    -1,   240,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,    -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
-     238,    -1,   240,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,    -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
-     238,    -1,   240,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,    -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
-     238,    -1,   240,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,    -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
-     238,    -1,   240,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,    -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
-     238,    -1,   240,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,    -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
-     238,    -1,   240,   216,   217,   218,   219,   220,   221,   222,
-     223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,    -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
-     238,    -1,   240,   216,   217,   218,   219,   220,   221,   222,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+      -1,    -1,    -1,    -1,   238,    -1,    -1,    -1,   242,   216,
+     217,   218,   219,   220,   221,   222,   223,   224,   225,   226,
+     227,   228,   229,   230,   231,   232,   233,    -1,    -1,    -1,
+      -1,   238,    -1,    -1,    -1,   242,   216,   217,   218,   219,
+     220,   221,   222,   223,   224,   225,   226,   227,   228,   229,
+     230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,    -1,
+      -1,    -1,   242,   216,   217,   218,   219,   220,   221,   222,
      223,   224,   225,   226,   227,   228,   229,   230,   231,   232,
-     233,    -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,
-     218,   219,   220,   221,   222,   223,   224,   225,   226,   227,
-     228,   229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,
-     238
+     233,    -1,    -1,    -1,    -1,   238,    -1,    -1,    -1,   242,
+     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
+     226,   227,   228,   229,   230,   231,   232,   233,    -1,    -1,
+      -1,    -1,   238,    -1,    -1,    -1,   242,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,
+      -1,   240,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+      -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,
+      -1,   240,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+      -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,
+      -1,   240,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+      -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,
+      -1,   240,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+      -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,
+      -1,   240,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+      -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,
+      -1,   240,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+      -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,
+      -1,   240,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+      -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,
+      -1,   240,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+      -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,
+      -1,   240,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+      -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,
+      -1,   240,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+      -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,
+      -1,   240,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+      -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,
+      -1,   240,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+      -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,
+      -1,   240,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+      -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,
+      -1,   240,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+      -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,
+      -1,   240,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+      -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,
+      -1,   240,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+      -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,
+      -1,   240,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+      -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,
+      -1,   240,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+      -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,
+      -1,   240,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+      -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,
+      -1,   240,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+      -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,
+      -1,   240,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+      -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,
+      -1,   240,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+      -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,
+      -1,   240,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+      -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,
+      -1,   240,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+      -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,
+      -1,   240,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+      -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,
+      -1,   240,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+      -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,
+      -1,   240,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+      -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,
+      -1,   240,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+      -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,
+      -1,   240,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+      -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,
+      -1,   240,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+      -1,    -1,    -1,    -1,   238,    -1,   240,   216,   217,   218,
+     219,   220,   221,   222,   223,   224,   225,   226,   227,   228,
+     229,   230,   231,   232,   233,    -1,    -1,    -1,    -1,   238,
+      -1,   240,   216,   217,   218,   219,   220,   221,   222,   223,
+     224,   225,   226,   227,   228,   229,   230,   231,   232,   233,
+      -1,    -1,    -1,    -1,   238
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
@@ -5230,83 +5385,85 @@ static const yytype_uint16 yystos[] =
       22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
       32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
       42,    43,    55,    56,    57,    58,    63,    64,    75,    76,
-      77,    83,    86,    91,    94,    97,    99,   119,   124,   126,
-     192,   196,   197,   201,   202,   203,   205,   206,   207,   227,
-     228,   234,   239,   243,   246,   295,   299,   310,   317,   319,
-     330,   331,   335,   337,   344,   346,   361,   239,   243,    97,
-      97,   119,    94,    97,    99,    91,   295,    94,    97,    99,
-     110,   296,    94,    97,   239,    94,   149,   174,   190,   191,
-     243,   227,   228,   239,   243,   341,   342,   341,   243,   243,
-     341,     4,    91,    95,   101,   102,   104,   105,   123,   239,
-      97,    99,    97,    94,     4,    84,   185,   243,   361,     4,
-       6,    91,    94,    97,    94,    97,   110,   297,     4,     4,
-       4,     5,   239,   344,   345,     4,   239,   239,   239,     4,
-     243,   348,   361,     4,   239,   239,   239,     6,     6,   241,
-       5,    46,    47,    48,    49,    50,    51,    52,    53,    54,
-      59,    60,    61,    62,    67,    68,    69,    72,    74,    85,
-      88,   193,   194,   195,   204,   208,   210,   352,   361,   239,
-       4,   352,     5,   243,     5,   243,    32,   228,   330,   361,
-     241,   243,   239,   243,     6,   239,   243,     6,   247,     7,
-     126,   185,   212,   213,   214,   215,   236,   237,   239,   241,
-     245,   271,   272,   273,   330,   351,   352,   361,     4,   299,
-     300,   301,   243,     6,   330,   351,   352,   361,   351,   330,
-     351,   358,   359,   361,   277,   281,   239,   340,     9,   352,
-     361,   330,   330,   330,   239,   330,   330,   330,   239,   330,
-     330,   330,   330,   330,   330,   330,   351,   330,   330,   330,
-     330,   344,   239,   228,   330,   346,   347,   243,   345,   351,
-     273,   273,   273,   273,   273,   273,   273,   273,   273,   273,
+      77,    83,    86,    91,    94,    97,    99,   110,   119,   124,
+     126,   192,   196,   197,   201,   202,   203,   205,   206,   207,
+     227,   228,   234,   239,   243,   246,   295,   296,   299,   310,
+     317,   319,   330,   331,   335,   337,   344,   346,   361,   239,
+     243,    97,    97,   119,    94,    97,    99,    91,    94,    97,
+      99,   295,    94,    97,    99,   110,   296,    94,    97,   239,
+      94,   149,   174,   190,   191,   243,   227,   228,   239,   243,
+     341,   342,   341,   243,   243,   341,     4,    91,    95,   101,
+     102,   104,   105,   123,   239,    97,    99,    97,    94,     4,
+      84,   185,   243,   361,     4,     6,    91,    94,    97,    94,
+      97,   110,   297,     4,     4,     4,     5,   239,   243,   344,
+     345,     4,   239,   239,   239,     4,   243,   348,   361,     4,
+     239,   239,   239,     6,     6,   241,     5,    46,    47,    48,
+      49,    50,    51,    52,    53,    54,    59,    60,    61,    62,
+      67,    68,    69,    72,    74,    85,    88,   193,   194,   195,
+     204,   208,   210,   352,   361,   239,     4,   352,     5,   243,
+       5,   243,    32,   228,   330,   361,   241,   243,   239,   243,
+       6,   239,   243,     6,   247,     7,   126,   185,   212,   213,
+     214,   215,   236,   237,   239,   241,   245,   271,   272,   273,
+     330,   351,   352,   361,     4,   299,   300,   301,   243,     6,
+     330,   351,   352,   361,   351,   330,   351,   358,   359,   361,
+     277,   281,   239,   340,     9,   352,   361,   330,   330,   330,
+     239,   330,   330,   330,   239,   330,   330,   330,   330,   330,
+     330,   330,   351,   330,   330,   330,   330,   345,   239,   228,
+     330,   346,   347,   243,   345,   351,   273,   273,   273,   273,
      273,   273,   273,   273,   273,   273,   273,   273,   273,   273,
-     273,   273,   273,   239,   241,   273,   273,   273,   273,   273,
-     273,   239,   273,   273,   239,   295,   273,   273,   243,   119,
-     295,   239,   273,   273,   239,   239,   239,   330,   243,   330,
-     346,   330,   330,   244,   347,   337,   361,     5,   177,     8,
-     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
-     226,   227,   228,   229,   230,   231,   232,   233,   238,     9,
-     239,   241,   245,   272,   273,   330,   347,   239,   239,   239,
-     344,   345,   345,   345,   294,   243,   239,   344,   243,   243,
-     330,     4,   344,   243,   348,   243,   243,   341,   341,   341,
-     330,   330,   227,   228,   243,   243,   341,   227,   228,   239,
-     301,   341,   243,   239,   243,   239,   239,   239,   239,   239,
-     239,   239,   330,   345,   345,   345,   239,     4,   241,     6,
-     241,   301,     6,     6,   243,   243,   243,   243,   345,   241,
-     241,   241,   330,     6,     6,   330,   330,   330,   245,   330,
+     273,   273,   273,   273,   273,   273,   273,   273,   273,   239,
+     241,   273,   273,   273,   273,   273,   273,   239,   273,   273,
+     239,   295,   273,   273,     5,   243,   243,   119,   295,   239,
+     273,   273,   239,   239,   239,   330,   243,   330,   346,   330,
+     330,   244,   347,   337,   361,   177,     5,   243,     8,   216,
+     217,   218,   219,   220,   221,   222,   223,   224,   225,   226,
+     227,   228,   229,   230,   231,   232,   233,   238,     9,   239,
+     241,   245,   272,   273,   330,   347,   239,   239,   239,   344,
+     345,   345,   345,   294,   243,   239,   344,   243,   243,   330,
+       4,   344,   243,   348,   243,   243,   341,   341,   341,   330,
+     330,   227,   228,   243,   243,   341,   227,   228,   239,   301,
+     341,   243,   239,   243,   239,   239,   239,   239,   239,   239,
+     239,   330,   345,   345,   345,   239,     4,   241,     6,   241,
+     301,     6,     6,   243,   243,   243,   243,   345,   241,   241,
+     241,   330,     8,     6,     6,   330,   330,   330,   245,   330,
      243,   177,   330,   330,   330,   330,   273,   273,   273,   239,
      239,   239,   273,   273,   273,   273,   273,   273,   273,   273,
      273,   273,   239,   239,   273,   239,   241,     6,     6,   243,
-       6,   301,     6,   301,   273,   330,   229,   243,     9,   239,
-     241,   245,   351,   347,   330,   301,   344,   344,   243,   352,
-      91,    94,    97,    99,     7,   330,   330,     4,   174,   175,
-     344,     6,   240,   242,   243,   274,     6,   243,     6,     9,
-     239,   241,   245,   361,   244,   119,   124,   127,   293,   295,
-     330,     6,   240,   248,     9,   239,   241,   245,   240,   248,
-     248,   240,   248,     9,   239,   245,   242,   248,   276,   242,
-     276,    87,   339,   336,   361,   248,   248,   240,   240,   240,
-     330,   240,   240,   240,   330,   240,   240,   240,   240,   240,
-     240,   240,   240,   240,   240,   240,   244,     7,   330,   229,
-     244,   248,   330,     6,   240,   330,   330,   330,   330,   330,
+       6,     8,   301,     6,     8,   301,   273,   330,   229,   243,
+       9,   239,   241,   245,   351,   347,   330,   301,   344,   344,
+     243,   352,    91,    94,    97,    99,     7,   330,   330,     4,
+     174,   175,   344,     6,   240,   242,   243,   274,     6,   243,
+       6,     9,   239,   241,   245,   361,   244,   119,   124,   126,
+     127,   293,   295,   330,     6,   240,   248,     9,   239,   241,
+     245,   240,   248,   248,   240,   248,     9,   239,   245,   242,
+     248,   276,   242,   276,    87,   339,   336,   361,   248,   248,
+     240,   240,   240,   330,   240,   240,   240,   330,   240,   240,
+     240,   240,   240,   240,   240,   240,   240,   240,   240,   244,
+       7,   330,   229,   244,   248,   330,     6,   240,   330,   330,
      330,   330,   330,   330,   330,   330,   330,   330,   330,   330,
-     330,   330,   346,   330,   330,   330,   330,   330,   330,   330,
-     346,   346,   361,   243,   330,   330,   351,   330,   351,   344,
-     351,   351,   358,   243,   330,   274,   361,   330,   345,   351,
-     351,   346,   337,   352,   337,   347,   240,   244,   245,   273,
-      64,   330,   330,   330,   330,   330,   330,   330,   330,   330,
-     330,   330,   330,   330,   330,   243,   330,   346,   330,   330,
-     330,   330,   330,   361,   330,   330,     4,   338,   243,   274,
-     240,   244,   330,   330,   330,     7,     7,   323,   323,   239,
-     330,   330,     6,   347,   347,   243,   240,     6,   301,   243,
-     301,   301,   248,   248,   248,   341,   341,   300,   300,   248,
-     330,   244,   314,   248,   301,   330,   330,   330,   330,   330,
-     330,   330,   330,   330,   240,     7,   324,     6,     7,   330,
-       6,   330,   330,   244,   347,   347,   347,   330,     6,   330,
-     330,   330,   240,   240,   240,   240,   174,   248,   301,   243,
-       8,   240,   240,   242,   358,   351,   358,   351,   351,   351,
-     351,   351,   351,   330,   351,   351,   351,   351,   246,   354,
-     361,   352,   351,   351,   351,   337,   361,   347,   244,   244,
-     330,   330,   301,   361,   338,   242,   244,   240,   132,   149,
-     318,   240,   244,   248,   330,     6,   243,   243,   243,   243,
-     330,   240,   242,     7,   271,   272,   245,     7,     6,   347,
-       7,   215,   271,   256,   361,   330,   330,   338,   241,   239,
-     119,   296,   243,   244,     6,   222,   223,   253,   347,   361,
+     330,   330,   330,   330,   330,   346,   330,   330,   330,   330,
+     330,   330,   330,   346,   346,   361,   243,   330,   330,   351,
+     330,   351,   344,   351,   351,   358,   243,   330,   274,   361,
+       8,   330,   330,   345,   351,   351,   346,   337,   352,   337,
+     347,   240,   244,   245,   273,    64,     8,   330,   330,   330,
+     330,   330,   330,   330,   330,   330,   330,   330,   330,   330,
+     330,   243,   330,   346,   330,   330,   330,   330,   330,   361,
+     330,   330,     4,   338,   243,   274,   240,   244,   330,   330,
+     330,     7,     7,   323,   323,   239,   330,   330,     6,   347,
+     347,   243,   240,     6,   301,   243,   301,   301,   248,   248,
+     248,   341,   341,   300,   300,   248,   330,   244,   314,   248,
+     301,   330,   330,   330,   330,   330,   330,   330,   330,   330,
+     240,     7,   324,     6,     7,   330,     6,   330,   330,   244,
+     347,   347,   347,   330,     6,   330,   330,   330,   240,   244,
+     240,   240,   240,   174,   248,   301,   243,     8,   240,   240,
+     242,   358,   351,   358,   351,   351,   351,   351,   351,   351,
+     330,   351,   351,   351,   351,   246,   354,   361,   352,   351,
+     351,   351,   337,   361,   347,   244,   244,   244,   244,   330,
+     330,   301,   361,   338,   242,   244,   240,   132,   149,   318,
+     240,   244,   248,   330,     6,   243,   243,   243,   243,   330,
+     240,   242,     7,   271,   272,   245,     7,     6,   347,     7,
+     215,   271,   256,   361,   330,   330,   338,   241,   239,   119,
+     295,   296,   243,   244,     6,   222,   223,   253,   347,   361,
      330,   330,     4,   338,     6,   347,   330,     6,   351,   359,
      361,   240,   338,     6,   361,     6,   351,   330,   240,   241,
      330,   352,     7,     7,     7,   240,     7,     7,     7,   240,
@@ -5315,106 +5472,107 @@ static const yytype_uint16 yystos[] =
      274,   274,   274,   274,   274,   274,   274,   274,   248,   274,
      274,   274,   274,   274,   274,   274,   274,   274,   248,   248,
      248,   240,   242,   242,   347,   248,   248,   274,   248,   274,
-     248,   248,   248,   240,   330,   332,   274,   244,   248,   248,
-     274,   274,   240,   245,   240,   245,   248,   273,   333,   244,
-       7,   338,   274,   243,     8,     8,   347,   245,   240,   242,
-     272,   239,   241,   273,   347,     7,   243,   240,   240,   240,
-     330,   344,     4,   322,     6,   290,   330,   352,   244,   240,
-     244,   244,   347,   245,   244,   301,   244,   244,   341,   330,
-     330,   244,   244,   330,   341,   129,   129,   146,   154,   155,
-     156,   160,   161,   315,   316,   341,   244,   311,   240,   244,
-     240,   240,   240,   240,   240,   240,   240,     7,   330,     6,
-     330,   240,   242,   242,   244,   244,   244,   244,   242,   242,
-     248,     7,     7,     7,   245,   330,   244,   330,   330,     7,
-     245,   274,   248,   274,   274,   240,   240,   248,   274,   274,
-     248,   248,   274,   274,   274,   274,   330,   274,     9,   353,
-     248,   240,   248,   274,   245,   248,   334,   242,   244,   244,
-     245,   239,   241,   247,   177,     7,   149,     6,   330,   244,
-     243,     6,   344,   244,   330,   330,   330,   330,     6,     7,
-     271,   272,   245,   271,   272,   352,   330,     6,     4,   243,
-     349,   361,   244,    46,    46,   344,     4,   164,   165,   166,
-     167,   244,   259,   263,   266,   268,   269,   245,   240,   242,
-     239,   330,   330,   239,   239,   347,   351,   240,   245,   240,
-     242,   239,   240,   248,   245,   239,     7,   273,     4,   284,
-     285,   286,   274,   274,   341,   344,   344,     7,   344,   344,
-     344,     7,   344,   344,   344,   344,   344,   344,   344,   344,
-     344,   344,     6,     7,   347,   330,   330,   330,   330,   244,
-     330,   330,   330,   344,   351,   351,   244,   248,   283,   330,
-     330,   338,   338,   330,   330,   240,   344,   273,   330,   330,
-     330,   244,   338,   272,   245,   272,   330,   330,   274,   244,
-     344,   347,     7,     7,     7,   129,   321,     6,   240,   248,
-       7,     7,     7,   244,     4,   244,   248,   248,   248,   244,
-     244,   109,     4,     6,   330,   243,     6,   239,     6,   162,
-       6,   162,   244,   316,   248,   315,     7,     6,     7,     7,
-       7,     7,     7,     7,     7,   344,     6,   243,     6,     6,
-       6,    97,     7,     6,     6,   330,   344,   344,   344,     4,
-     248,     8,     8,   240,     4,   100,   101,     4,   347,   351,
-     330,   351,   246,   248,   287,   351,   351,   338,   351,   240,
-     248,   338,   243,   295,   243,     6,   330,     6,   243,   344,
-     244,   244,   244,   244,   244,   330,     6,     4,   174,   175,
-     330,     6,     6,     6,     7,   348,   350,     6,   241,   274,
-     273,   273,     6,   260,   239,   239,   243,   270,     6,   338,
-     245,   351,   330,   242,   240,   330,   330,   244,     6,     6,
-     253,   338,   245,   330,     6,   330,   338,   240,   243,   330,
-     352,   274,    46,   243,   344,   352,   355,   242,   248,     6,
-       6,     6,   123,   292,   292,   344,     6,     6,     6,   344,
-     177,   291,     6,     6,     6,     6,     6,     6,     6,     6,
-       6,     5,   244,   274,   274,   274,   274,   274,   248,   248,
-     248,   240,   274,   274,   285,   274,   240,   274,   240,   273,
-     333,   274,     6,   274,   248,   239,   241,   273,     4,   240,
-     242,   274,     6,   244,   344,   344,   344,     4,     6,   271,
-     330,   344,   243,   243,     7,     6,     7,   330,   330,   330,
-     243,   243,   243,   241,     6,   330,   344,   330,     6,     6,
-     330,   341,   244,     5,   344,   243,   243,   243,   243,   243,
-     243,   243,   344,     6,   347,   243,   330,   242,     6,     6,
-     173,   330,   330,   330,     6,     6,     6,     6,     7,   274,
-     248,   248,   274,   248,   330,     4,   189,   288,   289,   274,
-     240,   274,   334,   352,   239,   241,   330,   243,   301,     6,
-     301,   248,     6,     6,     7,   271,   272,   245,     7,     6,
-     348,   244,   248,   330,   271,   243,   274,   356,   357,   358,
-     356,   239,   330,   330,   343,   344,   243,   239,     4,     6,
-     240,     6,   240,   240,     6,   351,   239,     4,   240,   248,
-     239,   344,   352,     7,   273,   282,   330,   346,   286,   341,
-       6,     6,     6,     6,    95,     6,     5,   243,   330,   330,
-     330,   330,   240,   333,   330,   330,   330,   274,   272,   243,
-       6,   291,     6,   330,   344,     4,     6,   347,   347,   330,
-     330,   352,   244,   240,   244,   248,   300,   300,   330,   330,
-     244,   248,   240,   244,   248,     6,     6,   343,   341,   341,
-     341,   341,   341,   228,   341,     6,   244,   330,     6,     6,
-     344,   244,   248,     8,   244,   240,   243,   330,   352,   351,
-     330,   351,   330,   352,   355,   357,   352,   248,   240,   248,
-     244,   330,   318,   318,   344,   352,   330,     6,     4,   349,
-       6,   348,   242,   344,   358,     6,   274,   274,   257,   330,
-     248,   248,   244,   248,   258,   330,   330,     6,   330,   330,
-     240,   278,   280,   243,   357,   244,   248,     7,     7,   243,
-       5,   343,   274,   274,   248,   274,   240,   248,   240,   242,
-     330,     6,     6,   243,   244,   244,   243,     6,     6,   243,
-     330,   244,   244,   244,   242,     6,   344,     7,   243,   330,
-     244,   248,   248,   248,   248,   248,   248,     6,   244,   172,
-     330,   330,   347,     6,     6,   240,   274,   274,   289,   352,
-     244,   244,   244,   244,     6,     6,     7,     6,   245,     6,
-     244,     6,     6,   240,   248,   330,   330,   243,   344,   244,
-     248,   240,   240,   248,   283,   287,   344,   274,   330,   352,
-     361,   330,     6,   244,   330,   333,   330,   244,   343,   133,
-     134,   139,   325,   133,   134,   325,   347,   300,   244,   248,
-       6,   244,   344,   301,   244,     6,   347,   341,   341,   341,
-     341,   341,   330,   244,   244,   244,   240,     6,   243,     6,
-     348,   175,   261,   330,   248,   248,   343,     6,   330,   330,
-     244,   244,   279,     7,   239,   244,   243,   248,   240,   248,
-     244,   243,   341,   344,     6,   243,   341,     6,   244,   244,
-     330,     6,   129,   244,   312,   243,   244,   248,   248,   248,
-     248,   248,     6,     6,     6,   301,     6,   243,   330,   330,
-     244,   248,   283,   352,   240,   330,   330,   330,     6,   341,
-       6,   341,     6,     6,   244,   330,   315,   301,     6,   347,
-     347,   347,   347,   341,   347,   318,   258,   240,   248,     6,
-     243,   330,   244,   248,   248,   248,   248,   248,     6,   244,
-     244,   313,   244,   244,   244,   244,   248,   244,   244,   244,
-     264,   330,   343,   244,   330,   330,   330,   341,   341,   315,
-       6,     6,     6,     6,   347,     6,     6,     6,   243,   240,
-     244,     6,   244,   274,   248,   248,   248,   244,   244,   262,
-     351,   267,   243,     6,   330,   330,   330,     6,   244,   248,
-     243,   343,   244,   244,   244,     6,   351,   265,   351,   244,
-       6,     6,   244,   248,     6,     6,   351
+     248,   248,   248,   240,   330,   332,   274,   244,   244,   244,
+     248,   248,   274,   274,   240,   245,   240,   245,   248,   273,
+     333,   244,     7,   338,   274,   243,   244,     8,     8,   347,
+     245,   240,   242,   272,   239,   241,   273,   347,     7,   243,
+     240,   240,   240,   330,   344,     4,   322,     6,   290,   330,
+     352,   244,   240,   244,   244,   347,   245,   244,   301,   244,
+     244,   341,   330,   330,   244,   244,   330,   341,   129,   129,
+     146,   154,   155,   156,   160,   161,   315,   316,   341,   244,
+     311,   240,   244,   240,   240,   240,   240,   240,   240,   240,
+       7,   330,     6,   330,   240,   242,   242,   244,   244,   244,
+     244,   242,   242,   248,     7,     7,     7,   245,   330,   244,
+     330,   330,     7,   245,   274,   248,   274,   274,   240,   240,
+     248,   274,   274,   248,   248,   274,   274,   274,   274,   330,
+     274,     9,   353,   248,   240,   248,   274,   245,   248,   334,
+     242,   244,   244,   245,   239,   241,   247,   177,     7,   149,
+       6,   330,   244,   243,     6,   344,   244,   330,   330,   330,
+     330,     6,     7,   271,   272,   245,   271,   272,   352,   330,
+       6,     4,   243,   349,   361,   244,    46,    46,   344,     4,
+     164,   165,   166,   167,   244,   259,   263,   266,   268,   269,
+     245,   240,   242,   239,   330,   330,   239,   243,   239,     8,
+     347,   351,   240,   245,   240,   242,   239,   240,   248,   245,
+     239,     7,   273,     4,   284,   285,   286,   274,   274,   341,
+     344,   344,     7,   344,   344,   344,     7,   344,   344,   344,
+     344,   344,   344,   344,   344,   344,   344,     6,     7,   347,
+     330,   330,   330,   330,   244,   330,   330,   330,   344,   351,
+     351,   244,   248,   283,   330,   330,   338,   338,   330,   330,
+     240,   344,   273,   330,   330,   330,   244,   338,   272,   245,
+     272,   330,   330,   274,   244,   344,   347,     7,     7,     7,
+     129,   321,     6,   240,   248,     7,     7,     7,   244,     4,
+     244,   248,   248,   248,   244,   244,   109,     4,     6,   330,
+     243,     6,   239,     6,   162,     6,   162,   244,   316,   248,
+     315,     7,     6,     7,     7,     7,     7,     7,     7,     7,
+     344,     6,   243,     6,     6,     6,    97,     7,     6,     6,
+     330,   344,   344,   344,     4,   248,     8,     8,   240,     4,
+     100,   101,     4,   347,   351,   330,   351,   246,   248,   287,
+     351,   351,   338,   351,   240,   248,   338,   243,   295,   243,
+       6,   330,     6,   243,   344,   244,   244,   244,   244,   244,
+     330,     6,     4,   174,   175,   330,     6,     6,     6,     7,
+     348,   350,     6,   241,   274,   273,   273,     6,   260,   239,
+     239,   243,   270,     6,   338,   245,   351,   330,   242,   240,
+     330,     8,   347,   330,   244,   244,     6,     6,   253,   338,
+     245,   330,     6,   330,   338,   240,   243,   330,   352,   274,
+      46,   243,   344,   352,   355,   242,   248,     6,     6,     6,
+     123,   292,   292,   344,     6,     6,     6,   344,   177,   291,
+       6,     6,     6,     6,     6,     6,     6,     6,     6,     5,
+     244,   274,   274,   274,   274,   274,   248,   248,   248,   240,
+     274,   274,   285,   274,   240,   274,   240,   273,   333,   274,
+       6,   274,   248,   239,   241,   273,     4,   240,   242,   274,
+       6,   244,   344,   344,   344,     4,     6,   271,   330,   344,
+     243,   243,     7,     6,     7,   330,   330,   330,   243,   243,
+     243,   241,     6,   330,   344,   330,     6,     6,   330,   341,
+     244,     5,   344,   243,   243,   243,   243,   243,   243,   243,
+     344,     6,   347,   243,   330,   242,     6,     6,   173,   330,
+     330,   330,     6,     6,     6,     6,     7,   274,   248,   248,
+     274,   248,   330,     4,   189,   288,   289,   274,   240,   274,
+     334,   352,   239,   241,   330,   243,   301,     6,   301,   248,
+       6,     6,     7,   271,   272,   245,     7,     6,   348,   244,
+     248,   330,   271,   243,   274,   356,   357,   358,   356,   239,
+     330,   330,   343,   344,   243,   239,     4,     6,   240,     6,
+     240,   244,   244,   240,     6,     6,   351,   239,     4,   240,
+     248,   239,   344,   352,     7,   273,   282,   330,   346,   286,
+     341,     6,     6,     6,     6,    95,     6,     5,   243,   330,
+     330,   330,   330,   240,   333,   330,   330,   330,   274,   272,
+     243,     6,   291,     6,   330,   344,     4,     6,   347,   347,
+     330,   330,   352,   244,   240,   244,   248,   300,   300,   330,
+     330,   244,   248,   240,   244,   248,     6,     6,   343,   341,
+     341,   341,   341,   341,   228,   341,     6,   244,   330,     6,
+       6,   344,   244,   248,     8,   244,   240,   243,   330,   352,
+     351,   330,   351,   330,   352,   355,   357,   352,   248,   240,
+     248,   244,   330,   318,   318,   344,   352,   330,     6,     4,
+     349,     6,   348,   242,   344,   358,     6,   274,   274,   257,
+     330,   248,   248,   244,   248,   258,   330,   330,     6,     6,
+       6,   330,   330,   240,   278,   280,   243,   357,   244,   248,
+       7,     7,   243,     5,   343,   274,   274,   248,   274,   240,
+     248,   240,   242,   330,     6,     6,   243,   244,   244,   243,
+       6,     6,   243,   330,   244,   244,   244,   242,     6,   344,
+       7,   243,   330,   244,   248,   248,   248,   248,   248,   248,
+       6,   244,   172,   330,   330,   347,     6,     6,   240,   274,
+     274,   289,   352,   244,   244,   244,   244,     6,     6,     7,
+       6,   245,     6,   244,     6,     6,   240,   248,   330,   330,
+     243,   344,   244,   248,   240,   240,   248,   283,   287,   344,
+     274,   330,   352,   361,   330,     6,   244,   330,   333,   330,
+     244,   343,   133,   134,   139,   325,   133,   134,   325,   347,
+     300,   244,   248,     6,   244,   344,   301,   244,     6,   347,
+     341,   341,   341,   341,   341,   330,   244,   244,   244,   240,
+       6,   243,     6,   348,   175,   261,   330,   248,   248,   343,
+       6,   330,   330,   244,   244,   279,     7,   239,   244,   243,
+     248,   240,   248,   244,   243,   341,   344,     6,   243,   341,
+       6,   244,   244,   330,     6,   129,   244,   312,   243,   244,
+     248,   248,   248,   248,   248,     6,     6,     6,   301,     6,
+     243,   330,   330,   244,   248,   283,   352,   240,   330,   330,
+     330,     6,   341,     6,   341,     6,     6,   244,   330,   315,
+     301,     6,   347,   347,   347,   347,   341,   347,   318,   258,
+     240,   248,     6,   243,   330,   244,   248,   248,   248,   248,
+     248,     6,   244,   244,   313,   244,   244,   244,   244,   248,
+     244,   244,   244,   264,   330,   343,   244,   330,   330,   330,
+     341,   341,   315,     6,     6,     6,     6,   347,     6,     6,
+       6,   243,   240,   244,     6,   244,   274,   248,   248,   248,
+     244,   244,   262,   351,   267,   243,     6,   330,   330,   330,
+       6,   244,   248,   243,   343,   244,   244,   244,     6,   351,
+     265,   351,   244,     6,     6,   244,   248,     6,     6,   351
 };
 
 #define yyerrok		(yyerrstatus = 0)
@@ -8870,7 +9028,72 @@ yyreduce:
     break;
 
   case 218:
-#line 2507 "Gmsh.y"
+#line 2502 "Gmsh.y"
+    {
+      List_T *tmp = List_Create(10, 10, sizeof(double));
+      getElementaryTagsForPhysicalGroups((yyvsp[(3) - (7)].i), (yyvsp[(5) - (7)].l), tmp);
+      for(int i = 0; i < List_Nbr(tmp); i++){
+	double d;
+	List_Read(tmp, i, &d);
+ 	Shape s;
+	s.Num = (int)d; // FIXME
+        switch ((yyvsp[(3) - (7)].i)) {
+        case 0: s.Type = MSH_POINT    ; break;
+        case 1: s.Type = MSH_SEGM_LINE; break;
+        case 2: s.Type = MSH_SURF_PLAN; break; // we don't care about the actual type
+        case 3: s.Type = MSH_VOLUME   ; break;
+        }
+        List_Add((yyval.l), &s);
+      }
+    ;}
+    break;
+
+  case 219:
+#line 2520 "Gmsh.y"
+    {
+      List_T *tmp = List_Create(10, 10, sizeof(double));
+      getAllElementaryTags((yyvsp[(2) - (6)].i), tmp);
+      for(int i = 0; i < List_Nbr(tmp); i++){
+	double d;
+	List_Read(tmp, i, &d);
+	Shape s;
+	s.Num = (int)d;
+        switch ((yyvsp[(2) - (6)].i)) {
+        case 0: s.Type = MSH_POINT    ; break;
+        case 1: s.Type = MSH_SEGM_LINE; break;
+        case 2: s.Type = MSH_SURF_PLAN; break; // we don't care about the actual type
+        case 3: s.Type = MSH_VOLUME   ; break;
+        }
+        List_Add((yyval.l), &s);
+      }
+    ;}
+    break;
+
+  case 220:
+#line 2538 "Gmsh.y"
+    {
+      List_T *tmp = List_Create(10, 10, sizeof(double));
+      List_T *tmp2 = List_Create(10, 10, sizeof(double));
+      getAllPhysicalTags((yyvsp[(3) - (7)].i), tmp2);
+      getElementaryTagsForPhysicalGroups((yyvsp[(3) - (7)].i), tmp2, tmp);
+      for(int i = 0; i < List_Nbr(tmp); i++){
+	double d;
+	List_Read(tmp, i, &d);
+ 	Shape s;
+	s.Num = (int)d; // FIXME
+        switch ((yyvsp[(3) - (7)].i)) {
+        case 0: s.Type = MSH_POINT    ; break;
+        case 1: s.Type = MSH_SEGM_LINE; break;
+        case 2: s.Type = MSH_SURF_PLAN; break; // we don't care about the actual type
+        case 3: s.Type = MSH_VOLUME   ; break;
+        }
+        List_Add((yyval.l), &s);
+      }
+    ;}
+    break;
+
+  case 221:
+#line 2563 "Gmsh.y"
     {
       if(List_Nbr((yyvsp[(7) - (8)].l)) == 4){
         int t = (int)(yyvsp[(4) - (8)].d);
@@ -8891,8 +9114,8 @@ yyreduce:
     ;}
     break;
 
-  case 219:
-#line 2526 "Gmsh.y"
+  case 222:
+#line 2582 "Gmsh.y"
     {
       int t = (int)(yyvsp[(4) - (10)].d);
       if(gLevelset::find(t)){
@@ -8915,8 +9138,8 @@ yyreduce:
     ;}
     break;
 
-  case 220:
-#line 2548 "Gmsh.y"
+  case 223:
+#line 2604 "Gmsh.y"
     {
       int t = (int)(yyvsp[(4) - (14)].d);
       if(gLevelset::find(t)){
@@ -8932,8 +9155,8 @@ yyreduce:
     ;}
     break;
 
-  case 221:
-#line 2563 "Gmsh.y"
+  case 224:
+#line 2619 "Gmsh.y"
     {
       int t = (int)(yyvsp[(4) - (16)].d);
       if(gLevelset::find(t)){
@@ -8950,8 +9173,8 @@ yyreduce:
     ;}
     break;
 
-  case 222:
-#line 2578 "Gmsh.y"
+  case 225:
+#line 2634 "Gmsh.y"
     {
       if(List_Nbr((yyvsp[(10) - (12)].l)) == 1){
         int t = (int)(yyvsp[(4) - (12)].d);
@@ -8971,8 +9194,8 @@ yyreduce:
     ;}
     break;
 
-  case 223:
-#line 2597 "Gmsh.y"
+  case 226:
+#line 2653 "Gmsh.y"
     {
       if(List_Nbr((yyvsp[(12) - (14)].l)) == 1){
         int t = (int)(yyvsp[(4) - (14)].d);
@@ -9024,8 +9247,8 @@ yyreduce:
     ;}
     break;
 
-  case 224:
-#line 2648 "Gmsh.y"
+  case 227:
+#line 2704 "Gmsh.y"
     {
       if(List_Nbr((yyvsp[(12) - (14)].l)) == 1){
         int t = (int)(yyvsp[(4) - (14)].d);
@@ -9047,8 +9270,8 @@ yyreduce:
     ;}
     break;
 
-  case 225:
-#line 2669 "Gmsh.y"
+  case 228:
+#line 2725 "Gmsh.y"
     {
       if(List_Nbr((yyvsp[(12) - (14)].l)) == 3){
         int t = (int)(yyvsp[(4) - (14)].d);
@@ -9071,8 +9294,8 @@ yyreduce:
     ;}
     break;
 
-  case 226:
-#line 2691 "Gmsh.y"
+  case 229:
+#line 2747 "Gmsh.y"
     {
       if(List_Nbr((yyvsp[(12) - (14)].l)) == 5){
         int t = (int)(yyvsp[(4) - (14)].d);
@@ -9096,8 +9319,8 @@ yyreduce:
     ;}
     break;
 
-  case 227:
-#line 2713 "Gmsh.y"
+  case 230:
+#line 2769 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(2) - (8)].c), "Union")){
         int t = (int)(yyvsp[(4) - (8)].d);
@@ -9204,8 +9427,8 @@ yyreduce:
     ;}
     break;
 
-  case 228:
-#line 2818 "Gmsh.y"
+  case 231:
+#line 2874 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(2) - (8)].c), "MathEval")){
         int t = (int)(yyvsp[(4) - (8)].d);
@@ -9223,8 +9446,8 @@ yyreduce:
     ;}
     break;
 
-  case 229:
-#line 2834 "Gmsh.y"
+  case 232:
+#line 2890 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(2) - (6)].c), "CutMesh")){
         int t = (int)(yyvsp[(4) - (6)].d);
@@ -9256,8 +9479,8 @@ yyreduce:
     ;}
     break;
 
-  case 230:
-#line 2869 "Gmsh.y"
+  case 233:
+#line 2925 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > dimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(3) - (4)].l), dimTags);
@@ -9281,8 +9504,8 @@ yyreduce:
     ;}
     break;
 
-  case 231:
-#line 2891 "Gmsh.y"
+  case 234:
+#line 2947 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > dimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(4) - (5)].l), dimTags);
@@ -9306,8 +9529,8 @@ yyreduce:
     ;}
     break;
 
-  case 232:
-#line 2913 "Gmsh.y"
+  case 235:
+#line 2969 "Gmsh.y"
     {
 #if defined(HAVE_MESH)
       GModel::current()->getFields()->deleteField((int)(yyvsp[(4) - (6)].d));
@@ -9315,8 +9538,8 @@ yyreduce:
     ;}
     break;
 
-  case 233:
-#line 2919 "Gmsh.y"
+  case 236:
+#line 2975 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       if(!strcmp((yyvsp[(2) - (6)].c), "View")){
@@ -9333,8 +9556,8 @@ yyreduce:
     ;}
     break;
 
-  case 234:
-#line 2934 "Gmsh.y"
+  case 237:
+#line 2990 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(2) - (3)].c), "Meshes") || !strcmp((yyvsp[(2) - (3)].c), "All")){
         ClearProject();
@@ -9364,8 +9587,8 @@ yyreduce:
     ;}
     break;
 
-  case 235:
-#line 2962 "Gmsh.y"
+  case 238:
+#line 3018 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       if(!strcmp((yyvsp[(2) - (4)].c), "Empty") && !strcmp((yyvsp[(3) - (4)].c), "Views")){
@@ -9379,15 +9602,15 @@ yyreduce:
     ;}
     break;
 
-  case 236:
-#line 2974 "Gmsh.y"
+  case 239:
+#line 3030 "Gmsh.y"
     {
       gmsh_yynamespaces.clear();
     ;}
     break;
 
-  case 237:
-#line 2983 "Gmsh.y"
+  case 240:
+#line 3039 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > dimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(4) - (5)].l), dimTags);
@@ -9396,8 +9619,8 @@ yyreduce:
     ;}
     break;
 
-  case 238:
-#line 2990 "Gmsh.y"
+  case 241:
+#line 3046 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > dimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(5) - (6)].l), dimTags);
@@ -9406,8 +9629,8 @@ yyreduce:
     ;}
     break;
 
-  case 239:
-#line 3002 "Gmsh.y"
+  case 242:
+#line 3058 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > dimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(4) - (5)].l), dimTags);
@@ -9423,26 +9646,38 @@ yyreduce:
     ;}
     break;
 
-  case 240:
-#line 3021 "Gmsh.y"
+  case 243:
+#line 3077 "Gmsh.y"
+    {
+      setVisibility(-1, 1, false);
+    ;}
+    break;
+
+  case 244:
+#line 3081 "Gmsh.y"
     {
-      std::string what = (yyvsp[(2) - (3)].c);
       setVisibility(-1, 1, false);
       Free((yyvsp[(2) - (3)].c));
     ;}
     break;
 
-  case 241:
-#line 3027 "Gmsh.y"
+  case 245:
+#line 3086 "Gmsh.y"
+    {
+      setVisibility(-1, 0, false);
+    ;}
+    break;
+
+  case 246:
+#line 3090 "Gmsh.y"
     {
-      std::string what = (yyvsp[(2) - (3)].c);
       setVisibility(-1, 0, false);
       Free((yyvsp[(2) - (3)].c));
     ;}
     break;
 
-  case 242:
-#line 3033 "Gmsh.y"
+  case 247:
+#line 3095 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > dimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(3) - (4)].l), dimTags);
@@ -9451,8 +9686,8 @@ yyreduce:
     ;}
     break;
 
-  case 243:
-#line 3040 "Gmsh.y"
+  case 248:
+#line 3102 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > dimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(4) - (5)].l), dimTags);
@@ -9461,8 +9696,8 @@ yyreduce:
     ;}
     break;
 
-  case 244:
-#line 3047 "Gmsh.y"
+  case 249:
+#line 3109 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > dimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(3) - (4)].l), dimTags);
@@ -9471,8 +9706,8 @@ yyreduce:
     ;}
     break;
 
-  case 245:
-#line 3054 "Gmsh.y"
+  case 250:
+#line 3116 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > dimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(4) - (5)].l), dimTags);
@@ -9481,8 +9716,8 @@ yyreduce:
     ;}
     break;
 
-  case 246:
-#line 3066 "Gmsh.y"
+  case 251:
+#line 3128 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(1) - (3)].c), "Include")){
         std::string tmp = FixRelativePath(gmsh_yyname, (yyvsp[(2) - (3)].c));
@@ -9557,8 +9792,8 @@ yyreduce:
     ;}
     break;
 
-  case 247:
-#line 3139 "Gmsh.y"
+  case 252:
+#line 3201 "Gmsh.y"
     {
       int n = List_Nbr((yyvsp[(3) - (5)].l));
       if(n == 1){
@@ -9578,8 +9813,8 @@ yyreduce:
     ;}
     break;
 
-  case 248:
-#line 3157 "Gmsh.y"
+  case 253:
+#line 3219 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       if(!strcmp((yyvsp[(1) - (7)].c), "Save") && !strcmp((yyvsp[(2) - (7)].c), "View")){
@@ -9598,8 +9833,8 @@ yyreduce:
     ;}
     break;
 
-  case 249:
-#line 3174 "Gmsh.y"
+  case 254:
+#line 3236 "Gmsh.y"
     {
 #if defined(HAVE_POST) && defined(HAVE_MESH)
       if(!strcmp((yyvsp[(1) - (7)].c), "Background") && !strcmp((yyvsp[(2) - (7)].c), "Mesh")  && !strcmp((yyvsp[(3) - (7)].c), "View")){
@@ -9616,8 +9851,8 @@ yyreduce:
     ;}
     break;
 
-  case 250:
-#line 3189 "Gmsh.y"
+  case 255:
+#line 3251 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(1) - (3)].c), "Sleep")){
 	SleepInSeconds((yyvsp[(2) - (3)].d));
@@ -9652,8 +9887,8 @@ yyreduce:
     ;}
     break;
 
-  case 251:
-#line 3222 "Gmsh.y"
+  case 256:
+#line 3284 "Gmsh.y"
     {
 #if defined(HAVE_PLUGINS)
        try {
@@ -9667,8 +9902,8 @@ yyreduce:
      ;}
     break;
 
-  case 252:
-#line 3234 "Gmsh.y"
+  case 257:
+#line 3296 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       if(!strcmp((yyvsp[(2) - (3)].c), "ElementsFromAllViews"))
@@ -9694,23 +9929,23 @@ yyreduce:
     ;}
     break;
 
-  case 253:
-#line 3258 "Gmsh.y"
+  case 258:
+#line 3320 "Gmsh.y"
     {
       Msg::Exit(0);
     ;}
     break;
 
-  case 254:
-#line 3262 "Gmsh.y"
+  case 259:
+#line 3324 "Gmsh.y"
     {
       gmsh_yyerrorstate = 999; // this will be checked when yyparse returns
       YYABORT;
     ;}
     break;
 
-  case 255:
-#line 3267 "Gmsh.y"
+  case 260:
+#line 3329 "Gmsh.y"
     {
       // force sync
       if(GModel::current()->getOCCInternals())
@@ -9719,16 +9954,16 @@ yyreduce:
     ;}
     break;
 
-  case 256:
-#line 3274 "Gmsh.y"
+  case 261:
+#line 3336 "Gmsh.y"
     {
       new GModel();
       GModel::current(GModel::list.size() - 1);
     ;}
     break;
 
-  case 257:
-#line 3279 "Gmsh.y"
+  case 262:
+#line 3341 "Gmsh.y"
     {
       CTX::instance()->forcedBBox = 0;
       if(GModel::current()->getOCCInternals() &&
@@ -9740,16 +9975,16 @@ yyreduce:
     ;}
     break;
 
-  case 258:
-#line 3289 "Gmsh.y"
+  case 263:
+#line 3351 "Gmsh.y"
     {
       CTX::instance()->forcedBBox = 1;
       SetBoundingBox((yyvsp[(3) - (15)].d), (yyvsp[(5) - (15)].d), (yyvsp[(7) - (15)].d), (yyvsp[(9) - (15)].d), (yyvsp[(11) - (15)].d), (yyvsp[(13) - (15)].d));
     ;}
     break;
 
-  case 259:
-#line 3294 "Gmsh.y"
+  case 264:
+#line 3356 "Gmsh.y"
     {
 #if defined(HAVE_OPENGL)
       drawContext::global()->draw();
@@ -9757,8 +9992,8 @@ yyreduce:
     ;}
     break;
 
-  case 260:
-#line 3300 "Gmsh.y"
+  case 265:
+#line 3362 "Gmsh.y"
     {
 #if defined(HAVE_OPENGL)
      CTX::instance()->mesh.changed = ENT_ALL;
@@ -9768,22 +10003,22 @@ yyreduce:
     ;}
     break;
 
-  case 261:
-#line 3308 "Gmsh.y"
+  case 266:
+#line 3370 "Gmsh.y"
     {
       GModel::current()->createTopologyFromMesh();
     ;}
     break;
 
-  case 262:
-#line 3312 "Gmsh.y"
+  case 267:
+#line 3374 "Gmsh.y"
     {
       GModel::current()->createTopologyFromMesh(1);
     ;}
     break;
 
-  case 263:
-#line 3316 "Gmsh.y"
+  case 268:
+#line 3378 "Gmsh.y"
     {
       if(GModel::current()->getOCCInternals() &&
          GModel::current()->getOCCInternals()->getChanged())
@@ -9794,8 +10029,8 @@ yyreduce:
     ;}
     break;
 
-  case 264:
-#line 3326 "Gmsh.y"
+  case 269:
+#line 3388 "Gmsh.y"
     {
       int lock = CTX::instance()->lock;
       CTX::instance()->lock = 0;
@@ -9855,8 +10090,8 @@ yyreduce:
     ;}
     break;
 
-  case 265:
-#line 3389 "Gmsh.y"
+  case 270:
+#line 3451 "Gmsh.y"
     {
 #if defined(HAVE_POPPLER)
        std::vector<int> is;
@@ -9870,8 +10105,8 @@ yyreduce:
      ;}
     break;
 
-  case 266:
-#line 3405 "Gmsh.y"
+  case 271:
+#line 3467 "Gmsh.y"
     {
       LoopControlVariablesTab[ImbricatedLoop][0] = (yyvsp[(3) - (6)].d);
       LoopControlVariablesTab[ImbricatedLoop][1] = (yyvsp[(5) - (6)].d);
@@ -9890,8 +10125,8 @@ yyreduce:
     ;}
     break;
 
-  case 267:
-#line 3422 "Gmsh.y"
+  case 272:
+#line 3484 "Gmsh.y"
     {
       LoopControlVariablesTab[ImbricatedLoop][0] = (yyvsp[(3) - (8)].d);
       LoopControlVariablesTab[ImbricatedLoop][1] = (yyvsp[(5) - (8)].d);
@@ -9910,8 +10145,8 @@ yyreduce:
     ;}
     break;
 
-  case 268:
-#line 3439 "Gmsh.y"
+  case 273:
+#line 3501 "Gmsh.y"
     {
       LoopControlVariablesTab[ImbricatedLoop][0] = (yyvsp[(5) - (8)].d);
       LoopControlVariablesTab[ImbricatedLoop][1] = (yyvsp[(7) - (8)].d);
@@ -9935,8 +10170,8 @@ yyreduce:
     ;}
     break;
 
-  case 269:
-#line 3461 "Gmsh.y"
+  case 274:
+#line 3523 "Gmsh.y"
     {
       LoopControlVariablesTab[ImbricatedLoop][0] = (yyvsp[(5) - (10)].d);
       LoopControlVariablesTab[ImbricatedLoop][1] = (yyvsp[(7) - (10)].d);
@@ -9960,8 +10195,8 @@ yyreduce:
     ;}
     break;
 
-  case 270:
-#line 3483 "Gmsh.y"
+  case 275:
+#line 3545 "Gmsh.y"
     {
       if(ImbricatedLoop <= 0){
 	yymsg(0, "Invalid For/EndFor loop");
@@ -9998,8 +10233,8 @@ yyreduce:
     ;}
     break;
 
-  case 271:
-#line 3518 "Gmsh.y"
+  case 276:
+#line 3580 "Gmsh.y"
     {
       if(!FunctionManager::Instance()->createFunction
          (std::string((yyvsp[(2) - (2)].c)), gmsh_yyin, gmsh_yyname, gmsh_yylineno))
@@ -10009,8 +10244,8 @@ yyreduce:
     ;}
     break;
 
-  case 272:
-#line 3526 "Gmsh.y"
+  case 277:
+#line 3588 "Gmsh.y"
     {
       if(!FunctionManager::Instance()->createFunction
          (std::string((yyvsp[(2) - (2)].c)), gmsh_yyin, gmsh_yyname, gmsh_yylineno))
@@ -10020,8 +10255,8 @@ yyreduce:
     ;}
     break;
 
-  case 273:
-#line 3534 "Gmsh.y"
+  case 278:
+#line 3596 "Gmsh.y"
     {
       if(!FunctionManager::Instance()->leaveFunction
          (&gmsh_yyin, gmsh_yyname, gmsh_yylineno))
@@ -10029,8 +10264,8 @@ yyreduce:
     ;}
     break;
 
-  case 274:
-#line 3540 "Gmsh.y"
+  case 279:
+#line 3602 "Gmsh.y"
     {
       if(!FunctionManager::Instance()->enterFunction
          (std::string((yyvsp[(2) - (3)].c)), &gmsh_yyin, gmsh_yyname, gmsh_yylineno))
@@ -10039,8 +10274,8 @@ yyreduce:
     ;}
     break;
 
-  case 275:
-#line 3547 "Gmsh.y"
+  case 280:
+#line 3609 "Gmsh.y"
     {
       if(!FunctionManager::Instance()->enterFunction
          (std::string((yyvsp[(2) - (3)].c)), &gmsh_yyin, gmsh_yyname, gmsh_yylineno))
@@ -10049,8 +10284,8 @@ yyreduce:
     ;}
     break;
 
-  case 276:
-#line 3554 "Gmsh.y"
+  case 281:
+#line 3616 "Gmsh.y"
     {
       ImbricatedTest++;
       if(ImbricatedTest > MAX_RECUR_TESTS-1){
@@ -10072,8 +10307,8 @@ yyreduce:
     ;}
     break;
 
-  case 277:
-#line 3574 "Gmsh.y"
+  case 282:
+#line 3636 "Gmsh.y"
     {
       if(ImbricatedTest > 0){
         if (statusImbricatedTests[ImbricatedTest]){
@@ -10101,8 +10336,8 @@ yyreduce:
     ;}
     break;
 
-  case 278:
-#line 3600 "Gmsh.y"
+  case 283:
+#line 3662 "Gmsh.y"
     {
       if(ImbricatedTest > 0){
         if(statusImbricatedTests[ImbricatedTest]){
@@ -10116,8 +10351,8 @@ yyreduce:
     ;}
     break;
 
-  case 279:
-#line 3612 "Gmsh.y"
+  case 284:
+#line 3674 "Gmsh.y"
     {
       ImbricatedTest--;
       if(ImbricatedTest < 0)
@@ -10125,8 +10360,8 @@ yyreduce:
     ;}
     break;
 
-  case 280:
-#line 3623 "Gmsh.y"
+  case 285:
+#line 3685 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > inDimTags, outDimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(4) - (5)].l), inDimTags);
@@ -10146,8 +10381,8 @@ yyreduce:
     ;}
     break;
 
-  case 281:
-#line 3641 "Gmsh.y"
+  case 286:
+#line 3703 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > inDimTags, outDimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(10) - (11)].l), inDimTags);
@@ -10167,8 +10402,8 @@ yyreduce:
     ;}
     break;
 
-  case 282:
-#line 3659 "Gmsh.y"
+  case 287:
+#line 3721 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > inDimTags, outDimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(12) - (13)].l), inDimTags);
@@ -10188,8 +10423,8 @@ yyreduce:
     ;}
     break;
 
-  case 283:
-#line 3677 "Gmsh.y"
+  case 288:
+#line 3739 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
       extr.mesh.QuadToTri = NO_QUADTRI;
@@ -10197,8 +10432,8 @@ yyreduce:
     ;}
     break;
 
-  case 284:
-#line 3683 "Gmsh.y"
+  case 289:
+#line 3745 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > inDimTags, outDimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(4) - (7)].l), inDimTags);
@@ -10218,8 +10453,8 @@ yyreduce:
     ;}
     break;
 
-  case 285:
-#line 3701 "Gmsh.y"
+  case 290:
+#line 3763 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
       extr.mesh.QuadToTri = NO_QUADTRI;
@@ -10227,8 +10462,8 @@ yyreduce:
     ;}
     break;
 
-  case 286:
-#line 3707 "Gmsh.y"
+  case 291:
+#line 3769 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > inDimTags, outDimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(10) - (13)].l), inDimTags);
@@ -10250,8 +10485,8 @@ yyreduce:
     ;}
     break;
 
-  case 287:
-#line 3727 "Gmsh.y"
+  case 292:
+#line 3789 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
       extr.mesh.QuadToTri = NO_QUADTRI;
@@ -10259,8 +10494,8 @@ yyreduce:
     ;}
     break;
 
-  case 288:
-#line 3733 "Gmsh.y"
+  case 293:
+#line 3795 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > inDimTags, outDimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(12) - (15)].l), inDimTags);
@@ -10280,8 +10515,8 @@ yyreduce:
     ;}
     break;
 
-  case 289:
-#line 3751 "Gmsh.y"
+  case 294:
+#line 3813 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
       extr.mesh.QuadToTri = NO_QUADTRI;
@@ -10289,8 +10524,8 @@ yyreduce:
     ;}
     break;
 
-  case 290:
-#line 3757 "Gmsh.y"
+  case 295:
+#line 3819 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > inDimTags, outDimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(3) - (6)].l), inDimTags);
@@ -10309,8 +10544,8 @@ yyreduce:
     ;}
     break;
 
-  case 291:
-#line 3774 "Gmsh.y"
+  case 296:
+#line 3836 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > inDimTags, outDimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(3) - (9)].l), inDimTags);
@@ -10328,8 +10563,8 @@ yyreduce:
     ;}
     break;
 
-  case 292:
-#line 3790 "Gmsh.y"
+  case 297:
+#line 3852 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       bool r = true;
@@ -10348,8 +10583,8 @@ yyreduce:
     ;}
     break;
 
-  case 293:
-#line 3807 "Gmsh.y"
+  case 298:
+#line 3869 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       bool r = true;
@@ -10368,8 +10603,8 @@ yyreduce:
     ;}
     break;
 
-  case 294:
-#line 3824 "Gmsh.y"
+  case 299:
+#line 3886 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       bool r = true;
@@ -10391,20 +10626,20 @@ yyreduce:
     ;}
     break;
 
-  case 295:
-#line 3847 "Gmsh.y"
+  case 300:
+#line 3909 "Gmsh.y"
     {
     ;}
     break;
 
-  case 296:
-#line 3850 "Gmsh.y"
+  case 301:
+#line 3912 "Gmsh.y"
     {
     ;}
     break;
 
-  case 297:
-#line 3856 "Gmsh.y"
+  case 302:
+#line 3918 "Gmsh.y"
     {
       int n = (int)fabs((yyvsp[(3) - (5)].d));
       if(n){ // we accept n==0 to easily disable layers
@@ -10418,8 +10653,8 @@ yyreduce:
     ;}
     break;
 
-  case 298:
-#line 3868 "Gmsh.y"
+  case 303:
+#line 3930 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = true;
       extr.mesh.NbLayer = List_Nbr((yyvsp[(3) - (7)].l));
@@ -10441,57 +10676,57 @@ yyreduce:
     ;}
     break;
 
-  case 299:
-#line 3888 "Gmsh.y"
+  case 304:
+#line 3950 "Gmsh.y"
     {
       extr.mesh.ScaleLast = true;
     ;}
     break;
 
-  case 300:
-#line 3892 "Gmsh.y"
+  case 305:
+#line 3954 "Gmsh.y"
     {
       extr.mesh.Recombine = true;
     ;}
     break;
 
-  case 301:
-#line 3896 "Gmsh.y"
+  case 306:
+#line 3958 "Gmsh.y"
     {
       extr.mesh.Recombine = (yyvsp[(2) - (3)].d) ? true : false;
     ;}
     break;
 
-  case 302:
-#line 3900 "Gmsh.y"
+  case 307:
+#line 3962 "Gmsh.y"
     {
       extr.mesh.QuadToTri = QUADTRI_ADDVERTS_1;
     ;}
     break;
 
-  case 303:
-#line 3904 "Gmsh.y"
+  case 308:
+#line 3966 "Gmsh.y"
     {
       extr.mesh.QuadToTri = QUADTRI_ADDVERTS_1_RECOMB;
     ;}
     break;
 
-  case 304:
-#line 3908 "Gmsh.y"
+  case 309:
+#line 3970 "Gmsh.y"
     {
       extr.mesh.QuadToTri = QUADTRI_NOVERTS_1;
     ;}
     break;
 
-  case 305:
-#line 3912 "Gmsh.y"
+  case 310:
+#line 3974 "Gmsh.y"
     {
       extr.mesh.QuadToTri = QUADTRI_NOVERTS_1_RECOMB;
     ;}
     break;
 
-  case 306:
-#line 3916 "Gmsh.y"
+  case 311:
+#line 3978 "Gmsh.y"
     {
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(6) - (9)].l), tags);
       int num = (int)(yyvsp[(3) - (9)].d);
@@ -10502,8 +10737,8 @@ yyreduce:
     ;}
     break;
 
-  case 307:
-#line 3925 "Gmsh.y"
+  case 312:
+#line 3987 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(2) - (6)].c), "Index"))
         extr.mesh.BoundaryLayerIndex = (yyvsp[(4) - (6)].d);
@@ -10513,58 +10748,58 @@ yyreduce:
     ;}
     break;
 
-  case 308:
-#line 3937 "Gmsh.y"
+  case 313:
+#line 3999 "Gmsh.y"
     { (yyval.i) = OCC_Internals::Union; ;}
     break;
 
-  case 309:
-#line 3938 "Gmsh.y"
+  case 314:
+#line 4000 "Gmsh.y"
     { (yyval.i) = OCC_Internals::Intersection; ;}
     break;
 
-  case 310:
-#line 3939 "Gmsh.y"
+  case 315:
+#line 4001 "Gmsh.y"
     { (yyval.i) = OCC_Internals::Difference; ;}
     break;
 
-  case 311:
-#line 3940 "Gmsh.y"
+  case 316:
+#line 4002 "Gmsh.y"
     { (yyval.i) = OCC_Internals::Section; ;}
     break;
 
-  case 312:
-#line 3941 "Gmsh.y"
+  case 317:
+#line 4003 "Gmsh.y"
     { (yyval.i) = OCC_Internals::Fragments; ;}
     break;
 
-  case 313:
-#line 3945 "Gmsh.y"
+  case 318:
+#line 4007 "Gmsh.y"
     { (yyval.i) = 0; ;}
     break;
 
-  case 314:
-#line 3946 "Gmsh.y"
+  case 319:
+#line 4008 "Gmsh.y"
     { (yyval.i) = 1; ;}
     break;
 
-  case 315:
-#line 3947 "Gmsh.y"
+  case 320:
+#line 4009 "Gmsh.y"
     { (yyval.i) = 2; ;}
     break;
 
-  case 316:
-#line 3948 "Gmsh.y"
+  case 321:
+#line 4010 "Gmsh.y"
     { (yyval.i) = (yyvsp[(2) - (3)].d) ? 1 : 0; ;}
     break;
 
-  case 317:
-#line 3949 "Gmsh.y"
+  case 322:
+#line 4011 "Gmsh.y"
     { (yyval.i) = (yyvsp[(3) - (4)].d) ? 2 : 0; ;}
     break;
 
-  case 318:
-#line 3954 "Gmsh.y"
+  case 323:
+#line 4016 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       bool r = true;
@@ -10589,8 +10824,8 @@ yyreduce:
     ;}
     break;
 
-  case 319:
-#line 3977 "Gmsh.y"
+  case 324:
+#line 4039 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       bool r = true;
@@ -10608,8 +10843,8 @@ yyreduce:
     ;}
     break;
 
-  case 320:
-#line 3997 "Gmsh.y"
+  case 325:
+#line 4059 "Gmsh.y"
     {
       bool r = true;
       if(gmsh_yyfactory == "OpenCASCADE" && GModel::current()->getOCCInternals()){
@@ -10629,15 +10864,15 @@ yyreduce:
     ;}
     break;
 
-  case 321:
-#line 4018 "Gmsh.y"
+  case 326:
+#line 4080 "Gmsh.y"
     {
       (yyval.v)[0] = (yyval.v)[1] = 1.;
     ;}
     break;
 
-  case 322:
-#line 4022 "Gmsh.y"
+  case 327:
+#line 4084 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(2) - (3)].c), "Progression") || !strcmp((yyvsp[(2) - (3)].c), "Power"))
         (yyval.v)[0] = 1.;
@@ -10652,15 +10887,15 @@ yyreduce:
     ;}
     break;
 
-  case 323:
-#line 4037 "Gmsh.y"
+  case 328:
+#line 4099 "Gmsh.y"
     {
       (yyval.i) = -1; // left
     ;}
     break;
 
-  case 324:
-#line 4041 "Gmsh.y"
+  case 329:
+#line 4103 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(1) - (1)].c), "Right"))
         (yyval.i) = 1;
@@ -10676,57 +10911,62 @@ yyreduce:
     ;}
     break;
 
-  case 325:
-#line 4057 "Gmsh.y"
+  case 330:
+#line 4119 "Gmsh.y"
     {
      (yyval.l) = List_Create(1, 1, sizeof(double));
    ;}
     break;
 
-  case 326:
-#line 4061 "Gmsh.y"
+  case 331:
+#line 4123 "Gmsh.y"
     {
      (yyval.l) = (yyvsp[(2) - (2)].l);
    ;}
     break;
 
-  case 327:
-#line 4066 "Gmsh.y"
+  case 332:
+#line 4128 "Gmsh.y"
     {
       (yyval.i) = 45;
     ;}
     break;
 
-  case 328:
-#line 4070 "Gmsh.y"
+  case 333:
+#line 4132 "Gmsh.y"
     {
       (yyval.i) = (int)(yyvsp[(2) - (2)].d);
     ;}
     break;
 
-  case 329:
-#line 4076 "Gmsh.y"
+  case 334:
+#line 4138 "Gmsh.y"
     {
       (yyval.l) = List_Create(1, 1, sizeof(double));
     ;}
     break;
 
-  case 330:
-#line 4080 "Gmsh.y"
+  case 335:
+#line 4142 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(2) - (2)].l);
     ;}
     break;
 
-  case 331:
-#line 4087 "Gmsh.y"
+  case 336:
+#line 4149 "Gmsh.y"
     {
       // mesh sizes at vertices are stored in internal CAD data, as they can be
       // specified during vertex creation and copied around during CAD
       // operations
-      for(int i = 0; i < List_Nbr((yyvsp[(3) - (6)].l)); i++){
-	double d;
-	List_Read((yyvsp[(3) - (6)].l), i, &d);
+      List_T *tmp = (yyvsp[(3) - (6)].l);
+      if(!(yyvsp[(3) - (6)].l)){
+        tmp = List_Create(100, 100, sizeof(double));
+        getAllElementaryTags(0, tmp);
+      }
+      for(int i = 0; i < List_Nbr(tmp); i++){
+        double d;
+        List_Read(tmp, i, &d);
         int tag = (int)d;
         if(GModel::current()->getOCCInternals())
           GModel::current()->getOCCInternals()->setMeshSize(0, tag, (yyvsp[(5) - (6)].d));
@@ -10734,12 +10974,12 @@ yyreduce:
         GVertex *gv = GModel::current()->getVertexByTag(tag);
         if(gv) gv->setPrescribedMeshSizeAtVertex((yyvsp[(5) - (6)].d));
       }
-      List_Delete((yyvsp[(3) - (6)].l));
+      List_Delete(tmp);
     ;}
     break;
 
-  case 332:
-#line 4104 "Gmsh.y"
+  case 337:
+#line 4171 "Gmsh.y"
     {
       // transfinite constraints are stored in GEO internals in addition to
       // GModel, as they can be copied around during GEO operations
@@ -10782,8 +11022,8 @@ yyreduce:
     ;}
     break;
 
-  case 333:
-#line 4145 "Gmsh.y"
+  case 338:
+#line 4212 "Gmsh.y"
     {
       // transfinite constraints are stored in GEO internals in addition to
       // GModel, as they can be copied around during GEO operations
@@ -10829,8 +11069,8 @@ yyreduce:
     ;}
     break;
 
-  case 334:
-#line 4189 "Gmsh.y"
+  case 339:
+#line 4256 "Gmsh.y"
     {
       // transfinite constraints are stored in GEO internals in addition to
       // GModel, as they can be copied around during GEO operations
@@ -10871,8 +11111,8 @@ yyreduce:
     ;}
     break;
 
-  case 335:
-#line 4228 "Gmsh.y"
+  case 340:
+#line 4295 "Gmsh.y"
     {
       // transfinite constraints are stored in GEO internals in addition to
       // GModel, as they can be copied around during GEO operations
@@ -10899,8 +11139,8 @@ yyreduce:
     ;}
     break;
 
-  case 336:
-#line 4253 "Gmsh.y"
+  case 341:
+#line 4320 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (8)].l)); i++){
 	double d;
@@ -10911,8 +11151,8 @@ yyreduce:
     ;}
     break;
 
-  case 337:
-#line 4262 "Gmsh.y"
+  case 342:
+#line 4329 "Gmsh.y"
     {
       // recombine constraints are stored in GEO internals in addition to
       // GModel, as they can be copied around during GEO operations
@@ -10944,8 +11184,8 @@ yyreduce:
     ;}
     break;
 
-  case 338:
-#line 4292 "Gmsh.y"
+  case 343:
+#line 4359 "Gmsh.y"
     {
       // recombine constraints are stored in GEO internals in addition to
       // GModel, as they can be copied around during GEO operations
@@ -10973,8 +11213,8 @@ yyreduce:
     ;}
     break;
 
-  case 339:
-#line 4318 "Gmsh.y"
+  case 344:
+#line 4385 "Gmsh.y"
     {
       // smoothing constraints are stored in GEO internals in addition to
       // GModel, as they can be copied around during GEO operations
@@ -11002,8 +11242,8 @@ yyreduce:
     ;}
     break;
 
-  case 340:
-#line 4345 "Gmsh.y"
+  case 345:
+#line 4412 "Gmsh.y"
     {
       if (List_Nbr((yyvsp[(4) - (11)].l)) != List_Nbr((yyvsp[(8) - (11)].l))){
         yymsg(0, "Number of master lines (%d) different from number of "
@@ -11036,8 +11276,8 @@ yyreduce:
     ;}
     break;
 
-  case 341:
-#line 4377 "Gmsh.y"
+  case 346:
+#line 4444 "Gmsh.y"
     {
       if (List_Nbr((yyvsp[(4) - (11)].l)) != List_Nbr((yyvsp[(8) - (11)].l))){
         yymsg(0, "Number of master faces (%d) different from number of "
@@ -11065,8 +11305,8 @@ yyreduce:
     ;}
     break;
 
-  case 342:
-#line 4404 "Gmsh.y"
+  case 347:
+#line 4471 "Gmsh.y"
     {
       if (List_Nbr((yyvsp[(4) - (18)].l)) != List_Nbr((yyvsp[(8) - (18)].l))){
         yymsg(0, "Number of master edges (%d) different from number of "
@@ -11093,8 +11333,8 @@ yyreduce:
     ;}
     break;
 
-  case 343:
-#line 4430 "Gmsh.y"
+  case 348:
+#line 4497 "Gmsh.y"
     {
       if (List_Nbr((yyvsp[(4) - (18)].l)) != List_Nbr((yyvsp[(8) - (18)].l))){
         yymsg(0, "Number of master faces (%d) different from number of "
@@ -11121,8 +11361,8 @@ yyreduce:
     ;}
     break;
 
-  case 344:
-#line 4456 "Gmsh.y"
+  case 349:
+#line 4523 "Gmsh.y"
     {
       if (List_Nbr((yyvsp[(4) - (12)].l)) != List_Nbr((yyvsp[(8) - (12)].l))){
         yymsg(0, "Number of master edges (%d) different from number of "
@@ -11149,8 +11389,8 @@ yyreduce:
     ;}
     break;
 
-  case 345:
-#line 4482 "Gmsh.y"
+  case 350:
+#line 4549 "Gmsh.y"
     {
       if (List_Nbr((yyvsp[(4) - (12)].l)) != List_Nbr((yyvsp[(8) - (12)].l))){
         yymsg(0, "Number of master faces (%d) different from number of "
@@ -11177,8 +11417,8 @@ yyreduce:
     ;}
     break;
 
-  case 346:
-#line 4508 "Gmsh.y"
+  case 351:
+#line 4575 "Gmsh.y"
     {
       if (List_Nbr((yyvsp[(5) - (12)].l)) != List_Nbr((yyvsp[(10) - (12)].l))){
         yymsg(0, "Number of master surface edges (%d) different from number of "
@@ -11201,8 +11441,8 @@ yyreduce:
     ;}
     break;
 
-  case 347:
-#line 4529 "Gmsh.y"
+  case 352:
+#line 4596 "Gmsh.y"
     {
       if (((yyvsp[(6) - (10)].i)==2 || (yyvsp[(6) - (10)].i)==3) && (yyvsp[(1) - (10)].i)<(yyvsp[(6) - (10)].i) ) {
         std::vector<int> tags; ListOfDouble2Vector((yyvsp[(3) - (10)].l), tags);
@@ -11215,8 +11455,8 @@ yyreduce:
     ;}
     break;
 
-  case 348:
-#line 4540 "Gmsh.y"
+  case 353:
+#line 4607 "Gmsh.y"
     {
       // reverse mesh constraints are stored in GEO internals in addition to
       // GModel, as they can be copied around during GEO operations
@@ -11266,8 +11506,8 @@ yyreduce:
     ;}
     break;
 
-  case 349:
-#line 4588 "Gmsh.y"
+  case 354:
+#line 4655 "Gmsh.y"
     {
       if(!(yyvsp[(3) - (4)].l)){
         switch ((yyvsp[(2) - (4)].i)) {
@@ -11318,8 +11558,8 @@ yyreduce:
     ;}
     break;
 
-  case 350:
-#line 4637 "Gmsh.y"
+  case 355:
+#line 4704 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++){
 	double dnum;
@@ -11333,8 +11573,8 @@ yyreduce:
     ;}
     break;
 
-  case 351:
-#line 4649 "Gmsh.y"
+  case 356:
+#line 4716 "Gmsh.y"
     {
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(3) - (4)].l), tags);
       GModel::current()->getGEOInternals()->setCompoundMesh((yyvsp[(2) - (4)].i), tags);
@@ -11342,8 +11582,8 @@ yyreduce:
     ;}
     break;
 
-  case 352:
-#line 4660 "Gmsh.y"
+  case 357:
+#line 4727 "Gmsh.y"
     {
       if(gmsh_yyfactory == "OpenCASCADE" && GModel::current()->getOCCInternals())
         GModel::current()->getOCCInternals()->removeAllDuplicates();
@@ -11352,8 +11592,8 @@ yyreduce:
     ;}
     break;
 
-  case 353:
-#line 4667 "Gmsh.y"
+  case 358:
+#line 4734 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(2) - (3)].c), "Geometry")){
         if(gmsh_yyfactory == "OpenCASCADE" && GModel::current()->getOCCInternals())
@@ -11370,8 +11610,8 @@ yyreduce:
     ;}
     break;
 
-  case 354:
-#line 4682 "Gmsh.y"
+  case 359:
+#line 4749 "Gmsh.y"
     {
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(4) - (6)].l), tags);
       if(gmsh_yyfactory == "OpenCASCADE" && GModel::current()->getOCCInternals())
@@ -11382,23 +11622,23 @@ yyreduce:
     ;}
     break;
 
-  case 355:
-#line 4695 "Gmsh.y"
+  case 360:
+#line 4762 "Gmsh.y"
     { (yyval.c) = (char*)"Homology"; ;}
     break;
 
-  case 356:
-#line 4696 "Gmsh.y"
+  case 361:
+#line 4763 "Gmsh.y"
     { (yyval.c) = (char*)"Cohomology"; ;}
     break;
 
-  case 357:
-#line 4697 "Gmsh.y"
+  case 362:
+#line 4764 "Gmsh.y"
     { (yyval.c) = (char*)"Betti"; ;}
     break;
 
-  case 358:
-#line 4702 "Gmsh.y"
+  case 363:
+#line 4769 "Gmsh.y"
     {
       std::vector<int> domain, subdomain, dim;
       for(int i = 0; i < 4; i++) dim.push_back(i);
@@ -11406,8 +11646,8 @@ yyreduce:
     ;}
     break;
 
-  case 359:
-#line 4708 "Gmsh.y"
+  case 364:
+#line 4775 "Gmsh.y"
     {
       std::vector<int> domain, subdomain, dim;
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (5)].l)); i++){
@@ -11421,8 +11661,8 @@ yyreduce:
     ;}
     break;
 
-  case 360:
-#line 4720 "Gmsh.y"
+  case 365:
+#line 4787 "Gmsh.y"
     {
       std::vector<int> domain, subdomain, dim;
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (7)].l)); i++){
@@ -11442,8 +11682,8 @@ yyreduce:
     ;}
     break;
 
-  case 361:
-#line 4738 "Gmsh.y"
+  case 366:
+#line 4805 "Gmsh.y"
     {
       std::vector<int> domain, subdomain, dim;
       for(int i = 0; i < List_Nbr((yyvsp[(6) - (10)].l)); i++){
@@ -11468,48 +11708,48 @@ yyreduce:
     ;}
     break;
 
-  case 362:
-#line 4765 "Gmsh.y"
+  case 367:
+#line 4832 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (1)].d);           ;}
     break;
 
-  case 363:
-#line 4766 "Gmsh.y"
+  case 368:
+#line 4833 "Gmsh.y"
     { (yyval.d) = (yyvsp[(2) - (3)].d);           ;}
     break;
 
-  case 364:
-#line 4767 "Gmsh.y"
+  case 369:
+#line 4834 "Gmsh.y"
     { (yyval.d) = -(yyvsp[(2) - (2)].d);          ;}
     break;
 
-  case 365:
-#line 4768 "Gmsh.y"
+  case 370:
+#line 4835 "Gmsh.y"
     { (yyval.d) = (yyvsp[(2) - (2)].d);           ;}
     break;
 
-  case 366:
-#line 4769 "Gmsh.y"
+  case 371:
+#line 4836 "Gmsh.y"
     { (yyval.d) = !(yyvsp[(2) - (2)].d);          ;}
     break;
 
-  case 367:
-#line 4770 "Gmsh.y"
+  case 372:
+#line 4837 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) - (yyvsp[(3) - (3)].d);      ;}
     break;
 
-  case 368:
-#line 4771 "Gmsh.y"
+  case 373:
+#line 4838 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) + (yyvsp[(3) - (3)].d);      ;}
     break;
 
-  case 369:
-#line 4772 "Gmsh.y"
+  case 374:
+#line 4839 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) * (yyvsp[(3) - (3)].d);      ;}
     break;
 
-  case 370:
-#line 4774 "Gmsh.y"
+  case 375:
+#line 4841 "Gmsh.y"
     {
       if(!(yyvsp[(3) - (3)].d))
 	yymsg(0, "Division by zero in '%g / %g'", (yyvsp[(1) - (3)].d), (yyvsp[(3) - (3)].d));
@@ -11518,258 +11758,258 @@ yyreduce:
     ;}
     break;
 
-  case 371:
-#line 4780 "Gmsh.y"
+  case 376:
+#line 4847 "Gmsh.y"
     { (yyval.d) = (int)(yyvsp[(1) - (3)].d) | (int)(yyvsp[(3) - (3)].d); ;}
     break;
 
-  case 372:
-#line 4781 "Gmsh.y"
+  case 377:
+#line 4848 "Gmsh.y"
     { (yyval.d) = (int)(yyvsp[(1) - (3)].d) & (int)(yyvsp[(3) - (3)].d); ;}
     break;
 
-  case 373:
-#line 4782 "Gmsh.y"
+  case 378:
+#line 4849 "Gmsh.y"
     { (yyval.d) = (int)(yyvsp[(1) - (3)].d) % (int)(yyvsp[(3) - (3)].d); ;}
     break;
 
-  case 374:
-#line 4783 "Gmsh.y"
+  case 379:
+#line 4850 "Gmsh.y"
     { (yyval.d) = pow((yyvsp[(1) - (3)].d), (yyvsp[(3) - (3)].d));  ;}
     break;
 
-  case 375:
-#line 4784 "Gmsh.y"
+  case 380:
+#line 4851 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) < (yyvsp[(3) - (3)].d);      ;}
     break;
 
-  case 376:
-#line 4785 "Gmsh.y"
+  case 381:
+#line 4852 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) > (yyvsp[(3) - (3)].d);      ;}
     break;
 
-  case 377:
-#line 4786 "Gmsh.y"
+  case 382:
+#line 4853 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) <= (yyvsp[(3) - (3)].d);     ;}
     break;
 
-  case 378:
-#line 4787 "Gmsh.y"
+  case 383:
+#line 4854 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) >= (yyvsp[(3) - (3)].d);     ;}
     break;
 
-  case 379:
-#line 4788 "Gmsh.y"
+  case 384:
+#line 4855 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) == (yyvsp[(3) - (3)].d);     ;}
     break;
 
-  case 380:
-#line 4789 "Gmsh.y"
+  case 385:
+#line 4856 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) != (yyvsp[(3) - (3)].d);     ;}
     break;
 
-  case 381:
-#line 4790 "Gmsh.y"
+  case 386:
+#line 4857 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) && (yyvsp[(3) - (3)].d);     ;}
     break;
 
-  case 382:
-#line 4791 "Gmsh.y"
+  case 387:
+#line 4858 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) || (yyvsp[(3) - (3)].d);     ;}
     break;
 
-  case 383:
-#line 4792 "Gmsh.y"
+  case 388:
+#line 4859 "Gmsh.y"
     { (yyval.d) = ((int)(yyvsp[(1) - (3)].d) >> (int)(yyvsp[(3) - (3)].d)); ;}
     break;
 
-  case 384:
-#line 4793 "Gmsh.y"
+  case 389:
+#line 4860 "Gmsh.y"
     { (yyval.d) = ((int)(yyvsp[(1) - (3)].d) << (int)(yyvsp[(3) - (3)].d)); ;}
     break;
 
-  case 385:
-#line 4794 "Gmsh.y"
+  case 390:
+#line 4861 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (5)].d) ? (yyvsp[(3) - (5)].d) : (yyvsp[(5) - (5)].d); ;}
     break;
 
-  case 386:
-#line 4795 "Gmsh.y"
+  case 391:
+#line 4862 "Gmsh.y"
     { (yyval.d) = exp((yyvsp[(3) - (4)].d));      ;}
     break;
 
-  case 387:
-#line 4796 "Gmsh.y"
+  case 392:
+#line 4863 "Gmsh.y"
     { (yyval.d) = log((yyvsp[(3) - (4)].d));      ;}
     break;
 
-  case 388:
-#line 4797 "Gmsh.y"
+  case 393:
+#line 4864 "Gmsh.y"
     { (yyval.d) = log10((yyvsp[(3) - (4)].d));    ;}
     break;
 
-  case 389:
-#line 4798 "Gmsh.y"
+  case 394:
+#line 4865 "Gmsh.y"
     { (yyval.d) = sqrt((yyvsp[(3) - (4)].d));     ;}
     break;
 
-  case 390:
-#line 4799 "Gmsh.y"
+  case 395:
+#line 4866 "Gmsh.y"
     { (yyval.d) = sin((yyvsp[(3) - (4)].d));      ;}
     break;
 
-  case 391:
-#line 4800 "Gmsh.y"
+  case 396:
+#line 4867 "Gmsh.y"
     { (yyval.d) = asin((yyvsp[(3) - (4)].d));     ;}
     break;
 
-  case 392:
-#line 4801 "Gmsh.y"
+  case 397:
+#line 4868 "Gmsh.y"
     { (yyval.d) = cos((yyvsp[(3) - (4)].d));      ;}
     break;
 
-  case 393:
-#line 4802 "Gmsh.y"
+  case 398:
+#line 4869 "Gmsh.y"
     { (yyval.d) = acos((yyvsp[(3) - (4)].d));     ;}
     break;
 
-  case 394:
-#line 4803 "Gmsh.y"
+  case 399:
+#line 4870 "Gmsh.y"
     { (yyval.d) = tan((yyvsp[(3) - (4)].d));      ;}
     break;
 
-  case 395:
-#line 4804 "Gmsh.y"
+  case 400:
+#line 4871 "Gmsh.y"
     { (yyval.d) = atan((yyvsp[(3) - (4)].d));     ;}
     break;
 
-  case 396:
-#line 4805 "Gmsh.y"
+  case 401:
+#line 4872 "Gmsh.y"
     { (yyval.d) = atan2((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d));;}
     break;
 
-  case 397:
-#line 4806 "Gmsh.y"
+  case 402:
+#line 4873 "Gmsh.y"
     { (yyval.d) = sinh((yyvsp[(3) - (4)].d));     ;}
     break;
 
-  case 398:
-#line 4807 "Gmsh.y"
+  case 403:
+#line 4874 "Gmsh.y"
     { (yyval.d) = cosh((yyvsp[(3) - (4)].d));     ;}
     break;
 
-  case 399:
-#line 4808 "Gmsh.y"
+  case 404:
+#line 4875 "Gmsh.y"
     { (yyval.d) = tanh((yyvsp[(3) - (4)].d));     ;}
     break;
 
-  case 400:
-#line 4809 "Gmsh.y"
+  case 405:
+#line 4876 "Gmsh.y"
     { (yyval.d) = fabs((yyvsp[(3) - (4)].d));     ;}
     break;
 
-  case 401:
-#line 4810 "Gmsh.y"
+  case 406:
+#line 4877 "Gmsh.y"
     { (yyval.d) = std::abs((yyvsp[(3) - (4)].d)); ;}
     break;
 
-  case 402:
-#line 4811 "Gmsh.y"
+  case 407:
+#line 4878 "Gmsh.y"
     { (yyval.d) = floor((yyvsp[(3) - (4)].d));    ;}
     break;
 
-  case 403:
-#line 4812 "Gmsh.y"
+  case 408:
+#line 4879 "Gmsh.y"
     { (yyval.d) = ceil((yyvsp[(3) - (4)].d));     ;}
     break;
 
-  case 404:
-#line 4813 "Gmsh.y"
+  case 409:
+#line 4880 "Gmsh.y"
     { (yyval.d) = floor((yyvsp[(3) - (4)].d) + 0.5); ;}
     break;
 
-  case 405:
-#line 4814 "Gmsh.y"
+  case 410:
+#line 4881 "Gmsh.y"
     { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;}
     break;
 
-  case 406:
-#line 4815 "Gmsh.y"
+  case 411:
+#line 4882 "Gmsh.y"
     { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;}
     break;
 
-  case 407:
-#line 4816 "Gmsh.y"
+  case 412:
+#line 4883 "Gmsh.y"
     { (yyval.d) = sqrt((yyvsp[(3) - (6)].d) * (yyvsp[(3) - (6)].d) + (yyvsp[(5) - (6)].d) * (yyvsp[(5) - (6)].d)); ;}
     break;
 
-  case 408:
-#line 4817 "Gmsh.y"
+  case 413:
+#line 4884 "Gmsh.y"
     { (yyval.d) = (yyvsp[(3) - (4)].d) * (double)rand() / (double)RAND_MAX; ;}
     break;
 
-  case 409:
-#line 4826 "Gmsh.y"
+  case 414:
+#line 4893 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (1)].d); ;}
     break;
 
-  case 410:
-#line 4827 "Gmsh.y"
+  case 415:
+#line 4894 "Gmsh.y"
     { (yyval.d) = 3.141592653589793; ;}
     break;
 
-  case 411:
-#line 4828 "Gmsh.y"
+  case 416:
+#line 4895 "Gmsh.y"
     { (yyval.d) = (double)ImbricatedTest; ;}
     break;
 
-  case 412:
-#line 4829 "Gmsh.y"
+  case 417:
+#line 4896 "Gmsh.y"
     { (yyval.d) = Msg::GetCommRank(); ;}
     break;
 
-  case 413:
-#line 4830 "Gmsh.y"
+  case 418:
+#line 4897 "Gmsh.y"
     { (yyval.d) = Msg::GetCommSize(); ;}
     break;
 
-  case 414:
-#line 4831 "Gmsh.y"
+  case 419:
+#line 4898 "Gmsh.y"
     { (yyval.d) = GetGmshMajorVersion(); ;}
     break;
 
-  case 415:
-#line 4832 "Gmsh.y"
+  case 420:
+#line 4899 "Gmsh.y"
     { (yyval.d) = GetGmshMinorVersion(); ;}
     break;
 
-  case 416:
-#line 4833 "Gmsh.y"
+  case 421:
+#line 4900 "Gmsh.y"
     { (yyval.d) = GetGmshPatchVersion(); ;}
     break;
 
-  case 417:
-#line 4834 "Gmsh.y"
+  case 422:
+#line 4901 "Gmsh.y"
     { (yyval.d) = Cpu(); ;}
     break;
 
-  case 418:
-#line 4835 "Gmsh.y"
+  case 423:
+#line 4902 "Gmsh.y"
     { (yyval.d) = GetMemoryUsage()/1024./1024.; ;}
     break;
 
-  case 419:
-#line 4836 "Gmsh.y"
+  case 424:
+#line 4903 "Gmsh.y"
     { (yyval.d) = TotalRam(); ;}
     break;
 
-  case 420:
-#line 4841 "Gmsh.y"
+  case 425:
+#line 4908 "Gmsh.y"
     { init_options(); ;}
     break;
 
-  case 421:
-#line 4843 "Gmsh.y"
+  case 426:
+#line 4910 "Gmsh.y"
     {
       std::vector<double> val(1, (yyvsp[(3) - (6)].d));
       Msg::ExchangeOnelabParameter("", val, floatOptions, charOptions);
@@ -11777,92 +12017,92 @@ yyreduce:
     ;}
     break;
 
-  case 422:
-#line 4849 "Gmsh.y"
+  case 427:
+#line 4916 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (1)].d); ;}
     break;
 
-  case 423:
-#line 4851 "Gmsh.y"
+  case 428:
+#line 4918 "Gmsh.y"
     {
       (yyval.d) = Msg::GetOnelabNumber((yyvsp[(3) - (4)].c));
       Free((yyvsp[(3) - (4)].c));
     ;}
     break;
 
-  case 424:
-#line 4856 "Gmsh.y"
+  case 429:
+#line 4923 "Gmsh.y"
     {
       (yyval.d) = Msg::GetOnelabNumber((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].d));
       Free((yyvsp[(3) - (6)].c));
     ;}
     break;
 
-  case 425:
-#line 4861 "Gmsh.y"
+  case 430:
+#line 4928 "Gmsh.y"
     {
       (yyval.d) = treat_Struct_FullName_Float((yyvsp[(1) - (1)].c2).char1, (yyvsp[(1) - (1)].c2).char2);
     ;}
     break;
 
-  case 426:
-#line 4866 "Gmsh.y"
+  case 431:
+#line 4933 "Gmsh.y"
     {
       (yyval.d) = treat_Struct_FullName_Float(NULL, (yyvsp[(1) - (4)].c), 2, (int)(yyvsp[(3) - (4)].d));
     ;}
     break;
 
-  case 427:
-#line 4871 "Gmsh.y"
+  case 432:
+#line 4938 "Gmsh.y"
     {
       (yyval.d) = treat_Struct_FullName_Float(NULL, (yyvsp[(1) - (4)].c), 2, (int)(yyvsp[(3) - (4)].d));
     ;}
     break;
 
-  case 428:
-#line 4875 "Gmsh.y"
+  case 433:
+#line 4942 "Gmsh.y"
     {
       (yyval.d) = treat_Struct_FullName_Float((yyvsp[(3) - (4)].c2).char1, (yyvsp[(3) - (4)].c2).char2, 1, 0, 0., 1);
     ;}
     break;
 
-  case 429:
-#line 4879 "Gmsh.y"
+  case 434:
+#line 4946 "Gmsh.y"
     {
       (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float((yyvsp[(3) - (6)].c2).char1, (yyvsp[(3) - (6)].c2).char2, (yyvsp[(5) - (6)].c), 0, 0., 1);
     ;}
     break;
 
-  case 430:
-#line 4883 "Gmsh.y"
+  case 435:
+#line 4950 "Gmsh.y"
     {
       (yyval.d) = treat_Struct_FullName_Float((yyvsp[(3) - (5)].c2).char1, (yyvsp[(3) - (5)].c2).char2, 1, 0, (yyvsp[(4) - (5)].d), 2);
     ;}
     break;
 
-  case 431:
-#line 4887 "Gmsh.y"
+  case 436:
+#line 4954 "Gmsh.y"
     {
       (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float((yyvsp[(3) - (7)].c2).char1, (yyvsp[(3) - (7)].c2).char2, (yyvsp[(5) - (7)].c), 0, (yyvsp[(6) - (7)].d), 2);
     ;}
     break;
 
-  case 432:
-#line 4891 "Gmsh.y"
+  case 437:
+#line 4958 "Gmsh.y"
     {
       (yyval.d) = treat_Struct_FullName_Float((yyvsp[(3) - (8)].c2).char1, (yyvsp[(3) - (8)].c2).char2, 2, (int)(yyvsp[(5) - (8)].d), (yyvsp[(7) - (8)].d), 2);
     ;}
     break;
 
-  case 433:
-#line 4895 "Gmsh.y"
+  case 438:
+#line 4962 "Gmsh.y"
     {
       (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float((yyvsp[(3) - (10)].c2).char1, (yyvsp[(3) - (10)].c2).char2, (yyvsp[(5) - (10)].c), (int)(yyvsp[(7) - (10)].d), (yyvsp[(9) - (10)].d), 2);
     ;}
     break;
 
-  case 434:
-#line 4899 "Gmsh.y"
+  case 439:
+#line 4966 "Gmsh.y"
     {
       std::string tmp = FixRelativePath(gmsh_yyname, (yyvsp[(3) - (4)].c));
       (yyval.d) = !StatFile(tmp);
@@ -11870,8 +12110,8 @@ yyreduce:
     ;}
     break;
 
-  case 435:
-#line 4905 "Gmsh.y"
+  case 440:
+#line 4972 "Gmsh.y"
     {
       if(gmsh_yysymbols.count((yyvsp[(2) - (4)].c))){
         gmsh_yysymbol &s(gmsh_yysymbols[(yyvsp[(2) - (4)].c)]);
@@ -11888,15 +12128,15 @@ yyreduce:
     ;}
     break;
 
-  case 436:
-#line 4921 "Gmsh.y"
+  case 441:
+#line 4988 "Gmsh.y"
     {
       (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float_getDim((yyvsp[(2) - (6)].c2).char1, (yyvsp[(2) - (6)].c2).char2, (yyvsp[(4) - (6)].c));
     ;}
     break;
 
-  case 437:
-#line 4926 "Gmsh.y"
+  case 442:
+#line 4993 "Gmsh.y"
     {
       std::string struct_namespace((yyvsp[(3) - (4)].c));
       (yyval.d) = (double)gmsh_yynamespaces[struct_namespace].size();
@@ -11904,16 +12144,16 @@ yyreduce:
     ;}
     break;
 
-  case 438:
-#line 4932 "Gmsh.y"
+  case 443:
+#line 4999 "Gmsh.y"
     {
       std::string struct_namespace(std::string(""));
       (yyval.d) = (double)gmsh_yynamespaces[struct_namespace].size();
     ;}
     break;
 
-  case 439:
-#line 4938 "Gmsh.y"
+  case 444:
+#line 5005 "Gmsh.y"
     {
       if(!gmsh_yysymbols.count((yyvsp[(1) - (2)].c))){
 	yymsg(0, "Unknown variable '%s'", (yyvsp[(1) - (2)].c));
@@ -11934,8 +12174,8 @@ yyreduce:
     ;}
     break;
 
-  case 440:
-#line 4957 "Gmsh.y"
+  case 445:
+#line 5024 "Gmsh.y"
     {
       int index = (int)(yyvsp[(3) - (5)].d);
       if(!gmsh_yysymbols.count((yyvsp[(1) - (5)].c))){
@@ -11957,8 +12197,8 @@ yyreduce:
     ;}
     break;
 
-  case 441:
-#line 4978 "Gmsh.y"
+  case 446:
+#line 5045 "Gmsh.y"
     {
       int index = (int)(yyvsp[(3) - (5)].d);
       if(!gmsh_yysymbols.count((yyvsp[(1) - (5)].c))){
@@ -11980,58 +12220,58 @@ yyreduce:
     ;}
     break;
 
-  case 442:
-#line 5011 "Gmsh.y"
+  case 447:
+#line 5078 "Gmsh.y"
     {
       (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float(NULL, (yyvsp[(1) - (3)].c), (yyvsp[(3) - (3)].c));
     ;}
     break;
 
-  case 443:
-#line 5015 "Gmsh.y"
+  case 448:
+#line 5082 "Gmsh.y"
     {
       (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float((yyvsp[(1) - (5)].c), (yyvsp[(3) - (5)].c), (yyvsp[(5) - (5)].c));
     ;}
     break;
 
-  case 444:
-#line 5020 "Gmsh.y"
+  case 449:
+#line 5087 "Gmsh.y"
     {
       (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float(NULL, (yyvsp[(1) - (6)].c), (yyvsp[(3) - (6)].c), (int)(yyvsp[(5) - (6)].d));
     ;}
     break;
 
-  case 445:
-#line 5024 "Gmsh.y"
+  case 450:
+#line 5091 "Gmsh.y"
     {
       (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float((yyvsp[(1) - (8)].c), (yyvsp[(3) - (8)].c), (yyvsp[(5) - (8)].c), (int)(yyvsp[(7) - (8)].d));
     ;}
     break;
 
-  case 446:
-#line 5028 "Gmsh.y"
+  case 451:
+#line 5095 "Gmsh.y"
     {
       (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float(NULL, (yyvsp[(1) - (6)].c), (yyvsp[(3) - (6)].c), (int)(yyvsp[(5) - (6)].d));
     ;}
     break;
 
-  case 447:
-#line 5032 "Gmsh.y"
+  case 452:
+#line 5099 "Gmsh.y"
     {
       (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float((yyvsp[(1) - (8)].c), (yyvsp[(3) - (8)].c), (yyvsp[(5) - (8)].c), (int)(yyvsp[(7) - (8)].d));
     ;}
     break;
 
-  case 448:
-#line 5037 "Gmsh.y"
+  case 453:
+#line 5104 "Gmsh.y"
     {
       NumberOption(GMSH_GET, (yyvsp[(1) - (6)].c), (int)(yyvsp[(3) - (6)].d), (yyvsp[(6) - (6)].c), (yyval.d));
       Free((yyvsp[(1) - (6)].c)); Free((yyvsp[(6) - (6)].c));
     ;}
     break;
 
-  case 449:
-#line 5042 "Gmsh.y"
+  case 454:
+#line 5109 "Gmsh.y"
     {
       double d = 0.;
       if(NumberOption(GMSH_GET, (yyvsp[(1) - (4)].c), 0, (yyvsp[(3) - (4)].c), d)){
@@ -12043,8 +12283,8 @@ yyreduce:
     ;}
     break;
 
-  case 450:
-#line 5052 "Gmsh.y"
+  case 455:
+#line 5119 "Gmsh.y"
     {
       double d = 0.;
       if(NumberOption(GMSH_GET, (yyvsp[(1) - (7)].c), (int)(yyvsp[(3) - (7)].d), (yyvsp[(6) - (7)].c), d)){
@@ -12056,16 +12296,16 @@ yyreduce:
     ;}
     break;
 
-  case 451:
-#line 5062 "Gmsh.y"
+  case 456:
+#line 5129 "Gmsh.y"
     {
       (yyval.d) = Msg::GetValue((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].d));
       Free((yyvsp[(3) - (6)].c));
     ;}
     break;
 
-  case 452:
-#line 5067 "Gmsh.y"
+  case 457:
+#line 5134 "Gmsh.y"
     {
       int matches = 0;
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (6)].l)); i++){
@@ -12078,8 +12318,8 @@ yyreduce:
     ;}
     break;
 
-  case 453:
-#line 5078 "Gmsh.y"
+  case 458:
+#line 5145 "Gmsh.y"
     {
       std::string s((yyvsp[(3) - (6)].c)), substr((yyvsp[(5) - (6)].c));
       if(s.find(substr) != std::string::npos)
@@ -12090,24 +12330,24 @@ yyreduce:
     ;}
     break;
 
-  case 454:
-#line 5087 "Gmsh.y"
+  case 459:
+#line 5154 "Gmsh.y"
     {
       (yyval.d) = strlen((yyvsp[(3) - (4)].c));
       Free((yyvsp[(3) - (4)].c));
     ;}
     break;
 
-  case 455:
-#line 5092 "Gmsh.y"
+  case 460:
+#line 5159 "Gmsh.y"
     {
       (yyval.d) = strcmp((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].c));
       Free((yyvsp[(3) - (6)].c)); Free((yyvsp[(5) - (6)].c));
     ;}
     break;
 
-  case 456:
-#line 5097 "Gmsh.y"
+  case 461:
+#line 5164 "Gmsh.y"
     {
       int align = 0, font = 0, fontsize = CTX::instance()->glFontSize;
       if(List_Nbr((yyvsp[(3) - (4)].l)) % 2){
@@ -12133,28 +12373,28 @@ yyreduce:
     ;}
     break;
 
-  case 457:
-#line 5124 "Gmsh.y"
+  case 462:
+#line 5191 "Gmsh.y"
     { (yyval.d) = 0.; ;}
     break;
 
-  case 458:
-#line 5126 "Gmsh.y"
+  case 463:
+#line 5193 "Gmsh.y"
     { (yyval.d) = (yyvsp[(2) - (2)].d);;}
     break;
 
-  case 459:
-#line 5131 "Gmsh.y"
+  case 464:
+#line 5198 "Gmsh.y"
     { (yyval.c) = NULL; ;}
     break;
 
-  case 460:
-#line 5133 "Gmsh.y"
+  case 465:
+#line 5200 "Gmsh.y"
     { (yyval.c) = (yyvsp[(2) - (2)].c);;}
     break;
 
-  case 461:
-#line 5138 "Gmsh.y"
+  case 466:
+#line 5205 "Gmsh.y"
     {
       std::string struct_namespace((yyvsp[(2) - (3)].c2).char1? (yyvsp[(2) - (3)].c2).char1 : std::string("")),
         struct_name((yyvsp[(2) - (3)].c2).char2);
@@ -12163,8 +12403,8 @@ yyreduce:
     ;}
     break;
 
-  case 462:
-#line 5145 "Gmsh.y"
+  case 467:
+#line 5212 "Gmsh.y"
     {
       std::string struct_namespace((yyvsp[(2) - (7)].c2).char1? (yyvsp[(2) - (7)].c2).char1 : std::string("")),
         struct_name((yyvsp[(2) - (7)].c2).char2);
@@ -12179,151 +12419,151 @@ yyreduce:
     ;}
     break;
 
-  case 463:
-#line 5161 "Gmsh.y"
+  case 468:
+#line 5228 "Gmsh.y"
     { (yyval.c2).char1 = NULL; (yyval.c2).char2 = (yyvsp[(1) - (1)].c); ;}
     break;
 
-  case 464:
-#line 5163 "Gmsh.y"
+  case 469:
+#line 5230 "Gmsh.y"
     { (yyval.c2).char1 = (yyvsp[(1) - (3)].c); (yyval.c2).char2 = (yyvsp[(3) - (3)].c); ;}
     break;
 
-  case 465:
-#line 5168 "Gmsh.y"
+  case 470:
+#line 5235 "Gmsh.y"
     { (yyval.c) = (yyvsp[(1) - (1)].c); flag_tSTRING_alloc = 1; ;}
     break;
 
-  case 466:
-#line 5177 "Gmsh.y"
+  case 471:
+#line 5244 "Gmsh.y"
     { (yyval.i) = 99; ;}
     break;
 
-  case 467:
-#line 5179 "Gmsh.y"
+  case 472:
+#line 5246 "Gmsh.y"
     { (yyval.i) = (int)(yyvsp[(2) - (2)].d); ;}
     break;
 
-  case 468:
-#line 5184 "Gmsh.y"
+  case 473:
+#line 5251 "Gmsh.y"
     { (yyval.i) = 0; ;}
     break;
 
-  case 469:
-#line 5186 "Gmsh.y"
+  case 474:
+#line 5253 "Gmsh.y"
     { (yyval.i) = (yyvsp[(2) - (3)].i); ;}
     break;
 
-  case 470:
-#line 5191 "Gmsh.y"
+  case 475:
+#line 5258 "Gmsh.y"
     {
       memcpy((yyval.v), (yyvsp[(1) - (1)].v), 5*sizeof(double));
     ;}
     break;
 
-  case 471:
-#line 5195 "Gmsh.y"
+  case 476:
+#line 5262 "Gmsh.y"
     {
       for(int i = 0; i < 5; i++) (yyval.v)[i] = -(yyvsp[(2) - (2)].v)[i];
     ;}
     break;
 
-  case 472:
-#line 5199 "Gmsh.y"
+  case 477:
+#line 5266 "Gmsh.y"
     {
       for(int i = 0; i < 5; i++) (yyval.v)[i] = (yyvsp[(2) - (2)].v)[i];
     ;}
     break;
 
-  case 473:
-#line 5203 "Gmsh.y"
+  case 478:
+#line 5270 "Gmsh.y"
     {
       for(int i = 0; i < 5; i++) (yyval.v)[i] = (yyvsp[(1) - (3)].v)[i] - (yyvsp[(3) - (3)].v)[i];
     ;}
     break;
 
-  case 474:
-#line 5207 "Gmsh.y"
+  case 479:
+#line 5274 "Gmsh.y"
     {
       for(int i = 0; i < 5; i++) (yyval.v)[i] = (yyvsp[(1) - (3)].v)[i] + (yyvsp[(3) - (3)].v)[i];
     ;}
     break;
 
-  case 475:
-#line 5214 "Gmsh.y"
+  case 480:
+#line 5281 "Gmsh.y"
     {
       (yyval.v)[0] = (yyvsp[(2) - (11)].d);  (yyval.v)[1] = (yyvsp[(4) - (11)].d);  (yyval.v)[2] = (yyvsp[(6) - (11)].d);  (yyval.v)[3] = (yyvsp[(8) - (11)].d); (yyval.v)[4] = (yyvsp[(10) - (11)].d);
     ;}
     break;
 
-  case 476:
-#line 5218 "Gmsh.y"
+  case 481:
+#line 5285 "Gmsh.y"
     {
       (yyval.v)[0] = (yyvsp[(2) - (9)].d);  (yyval.v)[1] = (yyvsp[(4) - (9)].d);  (yyval.v)[2] = (yyvsp[(6) - (9)].d);  (yyval.v)[3] = (yyvsp[(8) - (9)].d); (yyval.v)[4] = 1.0;
     ;}
     break;
 
-  case 477:
-#line 5222 "Gmsh.y"
+  case 482:
+#line 5289 "Gmsh.y"
     {
       (yyval.v)[0] = (yyvsp[(2) - (7)].d);  (yyval.v)[1] = (yyvsp[(4) - (7)].d);  (yyval.v)[2] = (yyvsp[(6) - (7)].d);  (yyval.v)[3] = 0.0; (yyval.v)[4] = 1.0;
     ;}
     break;
 
-  case 478:
-#line 5226 "Gmsh.y"
+  case 483:
+#line 5293 "Gmsh.y"
     {
       (yyval.v)[0] = (yyvsp[(2) - (7)].d);  (yyval.v)[1] = (yyvsp[(4) - (7)].d);  (yyval.v)[2] = (yyvsp[(6) - (7)].d);  (yyval.v)[3] = 0.0; (yyval.v)[4] = 1.0;
     ;}
     break;
 
-  case 479:
-#line 5233 "Gmsh.y"
+  case 484:
+#line 5300 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(List_T*));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].l)));
     ;}
     break;
 
-  case 480:
-#line 5238 "Gmsh.y"
+  case 485:
+#line 5305 "Gmsh.y"
     {
       List_Add((yyval.l), &((yyvsp[(3) - (3)].l)));
     ;}
     break;
 
-  case 481:
-#line 5245 "Gmsh.y"
+  case 486:
+#line 5312 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].d)));
     ;}
     break;
 
-  case 482:
-#line 5250 "Gmsh.y"
+  case 487:
+#line 5317 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(1) - (1)].l);
     ;}
     break;
 
-  case 483:
-#line 5254 "Gmsh.y"
+  case 488:
+#line 5321 "Gmsh.y"
     {
       // creates an empty list
       (yyval.l) = List_Create(2, 1, sizeof(double));
     ;}
     break;
 
-  case 484:
-#line 5259 "Gmsh.y"
+  case 489:
+#line 5326 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(2) - (3)].l);
     ;}
     break;
 
-  case 485:
-#line 5263 "Gmsh.y"
+  case 490:
+#line 5330 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(3) - (4)].l);
       for(int i = 0; i < List_Nbr((yyval.l)); i++){
@@ -12333,8 +12573,8 @@ yyreduce:
     ;}
     break;
 
-  case 486:
-#line 5271 "Gmsh.y"
+  case 491:
+#line 5338 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(4) - (5)].l);
       for(int i = 0; i < List_Nbr((yyval.l)); i++){
@@ -12344,27 +12584,36 @@ yyreduce:
     ;}
     break;
 
-  case 487:
-#line 5282 "Gmsh.y"
+  case 492:
+#line 5349 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(1) - (1)].l);
     ;}
     break;
 
-  case 488:
-#line 5286 "Gmsh.y"
+  case 493:
+#line 5353 "Gmsh.y"
+    {
+      (yyval.l) = 0;
+    ;}
+    break;
+
+  case 494:
+#line 5357 "Gmsh.y"
     {
-      if(!strcmp((yyvsp[(1) - (1)].c), "*") || !strcmp((yyvsp[(1) - (1)].c), "all"))
+      if(!strcmp((yyvsp[(1) - (1)].c), "*") || !strcmp((yyvsp[(1) - (1)].c), "all")){
         (yyval.l) = 0;
+      }
       else{
         yyerror("Unknown special string for list replacement");
         (yyval.l) = List_Create(2, 1, sizeof(double));
       }
+      Free((yyvsp[(1) - (1)].c));
     ;}
     break;
 
-  case 489:
-#line 5298 "Gmsh.y"
+  case 495:
+#line 5371 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(2) - (2)].l);
       for(int i = 0; i < List_Nbr((yyval.l)); i++){
@@ -12374,8 +12623,8 @@ yyreduce:
     ;}
     break;
 
-  case 490:
-#line 5306 "Gmsh.y"
+  case 496:
+#line 5379 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(3) - (3)].l);
       for(int i = 0; i < List_Nbr((yyval.l)); i++){
@@ -12385,8 +12634,8 @@ yyreduce:
     ;}
     break;
 
-  case 491:
-#line 5314 "Gmsh.y"
+  case 497:
+#line 5387 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       for(double d = (yyvsp[(1) - (3)].d); ((yyvsp[(1) - (3)].d) < (yyvsp[(3) - (3)].d)) ? (d <= (yyvsp[(3) - (3)].d)) : (d >= (yyvsp[(3) - (3)].d));
@@ -12395,8 +12644,8 @@ yyreduce:
     ;}
     break;
 
-  case 492:
-#line 5321 "Gmsh.y"
+  case 498:
+#line 5394 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!(yyvsp[(5) - (5)].d)){  //|| ($1 < $3 && $5 < 0) || ($1 > $3 && $5 > 0)
@@ -12408,8 +12657,8 @@ yyreduce:
    ;}
     break;
 
-  case 493:
-#line 5331 "Gmsh.y"
+  case 499:
+#line 5404 "Gmsh.y"
     {
       (yyval.l) = List_Create(3, 1, sizeof(double));
       int tag = (int)(yyvsp[(3) - (4)].d);
@@ -12434,8 +12683,33 @@ yyreduce:
     ;}
     break;
 
-  case 494:
-#line 5354 "Gmsh.y"
+  case 500:
+#line 5427 "Gmsh.y"
+    {
+      (yyval.l) = List_Create(10, 10, sizeof(double));
+      getAllElementaryTags(0, (yyval.l));
+    ;}
+    break;
+
+  case 501:
+#line 5432 "Gmsh.y"
+    {
+      (yyval.l) = List_Create(10, 10, sizeof(double));
+      getAllElementaryTags(0, (yyval.l));
+      Free((yyvsp[(2) - (2)].c));
+    ;}
+    break;
+
+  case 502:
+#line 5438 "Gmsh.y"
+    {
+      (yyval.l) = List_Create(10, 10, sizeof(double));
+      getAllElementaryTags((yyvsp[(1) - (4)].i), (yyval.l));
+    ;}
+    break;
+
+  case 503:
+#line 5443 "Gmsh.y"
     {
       (yyval.l) = List_Create(10, 10, sizeof(double));
       getAllElementaryTags((yyvsp[(1) - (2)].i), (yyval.l));
@@ -12443,8 +12717,8 @@ yyreduce:
     ;}
     break;
 
-  case 495:
-#line 5360 "Gmsh.y"
+  case 504:
+#line 5449 "Gmsh.y"
     {
       (yyval.l) = List_Create(10, 10, sizeof(double));
       if(!(yyvsp[(3) - (3)].l)){
@@ -12457,24 +12731,24 @@ yyreduce:
     ;}
     break;
 
-  case 496:
-#line 5372 "Gmsh.y"
+  case 505:
+#line 5461 "Gmsh.y"
     {
       (yyval.l) = List_Create(10, 10, sizeof(double));
       getElementaryTagsInBoundingBox((yyvsp[(1) - (16)].i), (yyvsp[(5) - (16)].d), (yyvsp[(7) - (16)].d), (yyvsp[(9) - (16)].d), (yyvsp[(11) - (16)].d), (yyvsp[(13) - (16)].d), (yyvsp[(15) - (16)].d), (yyval.l));
     ;}
     break;
 
-  case 497:
-#line 5377 "Gmsh.y"
+  case 506:
+#line 5466 "Gmsh.y"
     {
       (yyval.l) = List_Create(10, 10, sizeof(double));
       getBoundingBox((yyvsp[(2) - (5)].i), (int)(yyvsp[(4) - (5)].d), (yyval.l));
     ;}
     break;
 
-  case 498:
-#line 5382 "Gmsh.y"
+  case 507:
+#line 5471 "Gmsh.y"
     {
       (yyval.l) = List_Create(List_Nbr((yyvsp[(1) - (1)].l)), 1, sizeof(double));
       for(int i = 0; i < List_Nbr((yyvsp[(1) - (1)].l)); i++){
@@ -12486,8 +12760,8 @@ yyreduce:
     ;}
     break;
 
-  case 499:
-#line 5392 "Gmsh.y"
+  case 508:
+#line 5481 "Gmsh.y"
     {
       (yyval.l) = List_Create(List_Nbr((yyvsp[(1) - (1)].l)), 1, sizeof(double));
       for(int i = 0; i < List_Nbr((yyvsp[(1) - (1)].l)); i++){
@@ -12499,8 +12773,8 @@ yyreduce:
     ;}
     break;
 
-  case 500:
-#line 5402 "Gmsh.y"
+  case 509:
+#line 5491 "Gmsh.y"
     {
       (yyval.l) = List_Create(List_Nbr((yyvsp[(1) - (1)].l)), 1, sizeof(double));
       for(int i = 0; i < List_Nbr((yyvsp[(1) - (1)].l)); i++){
@@ -12512,8 +12786,8 @@ yyreduce:
     ;}
     break;
 
-  case 501:
-#line 5412 "Gmsh.y"
+  case 510:
+#line 5501 "Gmsh.y"
     {
       (yyval.l) = List_Create(20, 20, sizeof(double));
       if(!gmsh_yysymbols.count((yyvsp[(1) - (3)].c)))
@@ -12527,22 +12801,22 @@ yyreduce:
     ;}
     break;
 
-  case 502:
-#line 5424 "Gmsh.y"
+  case 511:
+#line 5513 "Gmsh.y"
     {
       (yyval.l) = treat_Struct_FullName_dot_tSTRING_ListOfFloat(NULL, (yyvsp[(1) - (5)].c), (yyvsp[(3) - (5)].c));
     ;}
     break;
 
-  case 503:
-#line 5428 "Gmsh.y"
+  case 512:
+#line 5517 "Gmsh.y"
     {
       (yyval.l) = treat_Struct_FullName_dot_tSTRING_ListOfFloat((yyvsp[(1) - (7)].c), (yyvsp[(3) - (7)].c), (yyvsp[(5) - (7)].c));
     ;}
     break;
 
-  case 504:
-#line 5433 "Gmsh.y"
+  case 513:
+#line 5522 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!gmsh_yysymbols.count((yyvsp[(3) - (4)].c)))
@@ -12556,29 +12830,29 @@ yyreduce:
     ;}
     break;
 
-  case 505:
-#line 5445 "Gmsh.y"
+  case 514:
+#line 5534 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(3) - (4)].l);
     ;}
     break;
 
-  case 506:
-#line 5449 "Gmsh.y"
+  case 515:
+#line 5538 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(3) - (4)].l);
     ;}
     break;
 
-  case 507:
-#line 5453 "Gmsh.y"
+  case 516:
+#line 5542 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(4) - (6)].l);
     ;}
     break;
 
-  case 508:
-#line 5457 "Gmsh.y"
+  case 517:
+#line 5546 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!gmsh_yysymbols.count((yyvsp[(1) - (6)].c)))
@@ -12598,8 +12872,8 @@ yyreduce:
     ;}
     break;
 
-  case 509:
-#line 5475 "Gmsh.y"
+  case 518:
+#line 5564 "Gmsh.y"
     {
       (yyval.l) = List_Create(20,20,sizeof(double));
       for(int i = 0; i < (int)(yyvsp[(7) - (8)].d); i++) {
@@ -12609,8 +12883,8 @@ yyreduce:
     ;}
     break;
 
-  case 510:
-#line 5483 "Gmsh.y"
+  case 519:
+#line 5572 "Gmsh.y"
     {
       (yyval.l) = List_Create(20,20,sizeof(double));
       for(int i = 0; i < (int)(yyvsp[(7) - (8)].d); i++) {
@@ -12620,8 +12894,8 @@ yyreduce:
     ;}
     break;
 
-  case 511:
-#line 5491 "Gmsh.y"
+  case 520:
+#line 5580 "Gmsh.y"
     {
       Msg::Barrier();
       FILE *File;
@@ -12652,8 +12926,8 @@ yyreduce:
     ;}
     break;
 
-  case 512:
-#line 5520 "Gmsh.y"
+  case 521:
+#line 5609 "Gmsh.y"
     {
       double x0 = (yyvsp[(3) - (14)].d), x1 = (yyvsp[(5) - (14)].d), y0 = (yyvsp[(7) - (14)].d), y1 = (yyvsp[(9) - (14)].d), ys = (yyvsp[(11) - (14)].d);
       int N = (int)(yyvsp[(13) - (14)].d);
@@ -12665,8 +12939,8 @@ yyreduce:
     ;}
     break;
 
-  case 513:
-#line 5530 "Gmsh.y"
+  case 522:
+#line 5619 "Gmsh.y"
     {
       std::vector<double> tmp;
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++){
@@ -12684,8 +12958,8 @@ yyreduce:
     ;}
     break;
 
-  case 514:
-#line 5546 "Gmsh.y"
+  case 523:
+#line 5635 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++){
         double *d = (double*)List_Pointer((yyvsp[(3) - (4)].l), i);
@@ -12695,30 +12969,30 @@ yyreduce:
     ;}
     break;
 
-  case 515:
-#line 5557 "Gmsh.y"
+  case 524:
+#line 5646 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].d)));
     ;}
     break;
 
-  case 516:
-#line 5562 "Gmsh.y"
+  case 525:
+#line 5651 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(1) - (1)].l);
     ;}
     break;
 
-  case 517:
-#line 5566 "Gmsh.y"
+  case 526:
+#line 5655 "Gmsh.y"
     {
       List_Add((yyval.l), &((yyvsp[(3) - (3)].d)));
     ;}
     break;
 
-  case 518:
-#line 5570 "Gmsh.y"
+  case 527:
+#line 5659 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (3)].l)); i++){
 	double d;
@@ -12729,22 +13003,22 @@ yyreduce:
     ;}
     break;
 
-  case 519:
-#line 5582 "Gmsh.y"
+  case 528:
+#line 5671 "Gmsh.y"
     {
       (yyval.u) = CTX::instance()->packColor((int)(yyvsp[(2) - (9)].d), (int)(yyvsp[(4) - (9)].d), (int)(yyvsp[(6) - (9)].d), (int)(yyvsp[(8) - (9)].d));
     ;}
     break;
 
-  case 520:
-#line 5586 "Gmsh.y"
+  case 529:
+#line 5675 "Gmsh.y"
     {
       (yyval.u) = CTX::instance()->packColor((int)(yyvsp[(2) - (7)].d), (int)(yyvsp[(4) - (7)].d), (int)(yyvsp[(6) - (7)].d), 255);
     ;}
     break;
 
-  case 521:
-#line 5598 "Gmsh.y"
+  case 530:
+#line 5687 "Gmsh.y"
     {
       int flag = 0;
       if(gmsh_yystringsymbols.count((yyvsp[(1) - (1)].c))){
@@ -12763,8 +13037,8 @@ yyreduce:
     ;}
     break;
 
-  case 522:
-#line 5615 "Gmsh.y"
+  case 531:
+#line 5704 "Gmsh.y"
     {
       unsigned int val = 0;
       ColorOption(GMSH_GET, (yyvsp[(1) - (5)].c), 0, (yyvsp[(5) - (5)].c), val);
@@ -12773,15 +13047,15 @@ yyreduce:
     ;}
     break;
 
-  case 523:
-#line 5625 "Gmsh.y"
+  case 532:
+#line 5714 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(2) - (3)].l);
     ;}
     break;
 
-  case 524:
-#line 5629 "Gmsh.y"
+  case 533:
+#line 5718 "Gmsh.y"
     {
       (yyval.l) = List_Create(256, 10, sizeof(unsigned int));
       GmshColorTable *ct = GetColorTable((int)(yyvsp[(3) - (6)].d));
@@ -12795,38 +13069,38 @@ yyreduce:
     ;}
     break;
 
-  case 525:
-#line 5644 "Gmsh.y"
+  case 534:
+#line 5733 "Gmsh.y"
     {
       (yyval.l) = List_Create(256, 10, sizeof(unsigned int));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].u)));
     ;}
     break;
 
-  case 526:
-#line 5649 "Gmsh.y"
+  case 535:
+#line 5738 "Gmsh.y"
     {
       List_Add((yyval.l), &((yyvsp[(3) - (3)].u)));
     ;}
     break;
 
-  case 527:
-#line 5656 "Gmsh.y"
+  case 536:
+#line 5745 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(1) - (1)].c);
     ;}
     break;
 
-  case 528:
-#line 5660 "Gmsh.y"
+  case 537:
+#line 5749 "Gmsh.y"
     {
       // No need to extend to Struct_FullName (a Tag is not a String)
       (yyval.c) = treat_Struct_FullName_String(NULL, (yyvsp[(1) - (1)].c));
     ;}
     break;
 
-  case 529:
-#line 5665 "Gmsh.y"
+  case 538:
+#line 5754 "Gmsh.y"
     {
       std::string val;
       int j = (int)(yyvsp[(3) - (4)].d);
@@ -12842,8 +13116,8 @@ yyreduce:
     ;}
     break;
 
-  case 530:
-#line 5679 "Gmsh.y"
+  case 539:
+#line 5768 "Gmsh.y"
     {
       std::string val;
       int j = (int)(yyvsp[(3) - (4)].d);
@@ -12859,36 +13133,36 @@ yyreduce:
     ;}
     break;
 
-  case 531:
-#line 5695 "Gmsh.y"
+  case 540:
+#line 5784 "Gmsh.y"
     {
       (yyval.c) = treat_Struct_FullName_dot_tSTRING_String(NULL, (yyvsp[(1) - (3)].c), (yyvsp[(3) - (3)].c));
     ;}
     break;
 
-  case 532:
-#line 5699 "Gmsh.y"
+  case 541:
+#line 5788 "Gmsh.y"
     {
       (yyval.c) = treat_Struct_FullName_dot_tSTRING_String((yyvsp[(1) - (5)].c), (yyvsp[(3) - (5)].c), (yyvsp[(5) - (5)].c));
     ;}
     break;
 
-  case 533:
-#line 5703 "Gmsh.y"
+  case 542:
+#line 5792 "Gmsh.y"
     {
       (yyval.c) = treat_Struct_FullName_dot_tSTRING_String(NULL, (yyvsp[(1) - (6)].c), (yyvsp[(3) - (6)].c), (int)(yyvsp[(5) - (6)].d));
     ;}
     break;
 
-  case 534:
-#line 5707 "Gmsh.y"
+  case 543:
+#line 5796 "Gmsh.y"
     {
       (yyval.c) = treat_Struct_FullName_dot_tSTRING_String((yyvsp[(1) - (8)].c), (yyvsp[(3) - (8)].c), (yyvsp[(5) - (8)].c), (int)(yyvsp[(7) - (8)].d));
     ;}
     break;
 
-  case 535:
-#line 5711 "Gmsh.y"
+  case 544:
+#line 5800 "Gmsh.y"
     {
       std::string out;
       StringOption(GMSH_GET, (yyvsp[(1) - (6)].c), (int)(yyvsp[(3) - (6)].d), (yyvsp[(6) - (6)].c), out);
@@ -12898,8 +13172,8 @@ yyreduce:
     ;}
     break;
 
-  case 536:
-#line 5719 "Gmsh.y"
+  case 545:
+#line 5808 "Gmsh.y"
     {
       std::string name = GModel::current()->getPhysicalName(0, (int)(yyvsp[(4) - (5)].d));
       (yyval.c) = (char*)Malloc((name.size() + 1) * sizeof(char));
@@ -12907,8 +13181,8 @@ yyreduce:
     ;}
     break;
 
-  case 537:
-#line 5725 "Gmsh.y"
+  case 546:
+#line 5814 "Gmsh.y"
     {
       std::string name = GModel::current()->getPhysicalName(1, (int)(yyvsp[(4) - (5)].d));
       (yyval.c) = (char*)Malloc((name.size() + 1) * sizeof(char));
@@ -12916,8 +13190,8 @@ yyreduce:
     ;}
     break;
 
-  case 538:
-#line 5731 "Gmsh.y"
+  case 547:
+#line 5820 "Gmsh.y"
     {
       std::string name = GModel::current()->getPhysicalName(2, (int)(yyvsp[(4) - (5)].d));
       (yyval.c) = (char*)Malloc((name.size() + 1) * sizeof(char));
@@ -12925,8 +13199,8 @@ yyreduce:
     ;}
     break;
 
-  case 539:
-#line 5737 "Gmsh.y"
+  case 548:
+#line 5826 "Gmsh.y"
     {
       std::string name = GModel::current()->getPhysicalName(3, (int)(yyvsp[(4) - (5)].d));
       (yyval.c) = (char*)Malloc((name.size() + 1) * sizeof(char));
@@ -12934,22 +13208,22 @@ yyreduce:
     ;}
     break;
 
-  case 540:
-#line 5746 "Gmsh.y"
+  case 549:
+#line 5835 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(1) - (1)].c);
     ;}
     break;
 
-  case 541:
-#line 5750 "Gmsh.y"
+  case 550:
+#line 5839 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(3) - (4)].c);
     ;}
     break;
 
-  case 542:
-#line 5754 "Gmsh.y"
+  case 551:
+#line 5843 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc(32 * sizeof(char));
       time_t now;
@@ -12959,8 +13233,8 @@ yyreduce:
     ;}
     break;
 
-  case 543:
-#line 5762 "Gmsh.y"
+  case 552:
+#line 5851 "Gmsh.y"
     {
       std::string exe = Msg::GetExecutableName();
       (yyval.c) = (char *)Malloc(exe.size() + 1);
@@ -12968,8 +13242,8 @@ yyreduce:
     ;}
     break;
 
-  case 544:
-#line 5768 "Gmsh.y"
+  case 553:
+#line 5857 "Gmsh.y"
     {
       std::string action = Msg::GetOnelabAction();
       (yyval.c) = (char *)Malloc(action.size() + 1);
@@ -12977,15 +13251,15 @@ yyreduce:
     ;}
     break;
 
-  case 545:
-#line 5774 "Gmsh.y"
+  case 554:
+#line 5863 "Gmsh.y"
     {
       (yyval.c) = strsave((char*)"Gmsh");
     ;}
     break;
 
-  case 546:
-#line 5778 "Gmsh.y"
+  case 555:
+#line 5867 "Gmsh.y"
     {
       const char *env = GetEnvironmentVar((yyvsp[(3) - (4)].c));
       if(!env) env = "";
@@ -12995,8 +13269,8 @@ yyreduce:
     ;}
     break;
 
-  case 547:
-#line 5786 "Gmsh.y"
+  case 556:
+#line 5875 "Gmsh.y"
     {
       std::string s = Msg::GetString((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].c));
       (yyval.c) = (char *)Malloc((s.size() + 1) * sizeof(char));
@@ -13006,8 +13280,8 @@ yyreduce:
     ;}
     break;
 
-  case 548:
-#line 5794 "Gmsh.y"
+  case 557:
+#line 5883 "Gmsh.y"
     {
       std::string s = Msg::GetOnelabString((yyvsp[(3) - (4)].c));
       (yyval.c) = (char *)Malloc((s.size() + 1) * sizeof(char));
@@ -13016,8 +13290,8 @@ yyreduce:
     ;}
     break;
 
-  case 549:
-#line 5801 "Gmsh.y"
+  case 558:
+#line 5890 "Gmsh.y"
     {
       std::string s = Msg::GetOnelabString((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].c));
       (yyval.c) = (char *)Malloc((s.size() + 1) * sizeof(char));
@@ -13027,22 +13301,22 @@ yyreduce:
     ;}
     break;
 
-  case 550:
-#line 5810 "Gmsh.y"
+  case 559:
+#line 5899 "Gmsh.y"
     {
       (yyval.c) = treat_Struct_FullName_String(NULL, (yyvsp[(3) - (5)].c2).char2, 1, 0, (yyvsp[(4) - (5)].c), 2);
     ;}
     break;
 
-  case 551:
-#line 5814 "Gmsh.y"
+  case 560:
+#line 5903 "Gmsh.y"
     {
       (yyval.c) = treat_Struct_FullName_dot_tSTRING_String((yyvsp[(3) - (7)].c2).char1, (yyvsp[(3) - (7)].c2).char2, (yyvsp[(5) - (7)].c), 0, (yyvsp[(6) - (7)].c), 2);
     ;}
     break;
 
-  case 552:
-#line 5818 "Gmsh.y"
+  case 561:
+#line 5907 "Gmsh.y"
     {
       int size = 1;
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++)
@@ -13059,8 +13333,8 @@ yyreduce:
     ;}
     break;
 
-  case 553:
-#line 5833 "Gmsh.y"
+  case 562:
+#line 5922 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc((strlen((yyvsp[(3) - (4)].c)) + 1) * sizeof(char));
       int i;
@@ -13076,8 +13350,8 @@ yyreduce:
     ;}
     break;
 
-  case 554:
-#line 5847 "Gmsh.y"
+  case 563:
+#line 5936 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc((strlen((yyvsp[(3) - (4)].c)) + 1) * sizeof(char));
       int i;
@@ -13093,8 +13367,8 @@ yyreduce:
     ;}
     break;
 
-  case 555:
-#line 5861 "Gmsh.y"
+  case 564:
+#line 5950 "Gmsh.y"
     {
       std::string input = (yyvsp[(3) - (8)].c);
       std::string substr_old = (yyvsp[(5) - (8)].c);
@@ -13108,8 +13382,8 @@ yyreduce:
     ;}
     break;
 
-  case 556:
-#line 5873 "Gmsh.y"
+  case 565:
+#line 5962 "Gmsh.y"
     {
       int size = 1;
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++)
@@ -13127,8 +13401,8 @@ yyreduce:
     ;}
     break;
 
-  case 557:
-#line 5889 "Gmsh.y"
+  case 566:
+#line 5978 "Gmsh.y"
     {
       int i = 0;
       while ((yyvsp[(3) - (4)].c)[i]) {
@@ -13139,8 +13413,8 @@ yyreduce:
     ;}
     break;
 
-  case 558:
-#line 5898 "Gmsh.y"
+  case 567:
+#line 5987 "Gmsh.y"
     {
       int i = 0;
       while ((yyvsp[(3) - (4)].c)[i]) {
@@ -13151,8 +13425,8 @@ yyreduce:
     ;}
     break;
 
-  case 559:
-#line 5907 "Gmsh.y"
+  case 568:
+#line 5996 "Gmsh.y"
     {
       int i = 0;
       while ((yyvsp[(3) - (4)].c)[i]) {
@@ -13164,8 +13438,8 @@ yyreduce:
     ;}
     break;
 
-  case 560:
-#line 5917 "Gmsh.y"
+  case 569:
+#line 6006 "Gmsh.y"
     {
       if((yyvsp[(3) - (8)].d)){
         (yyval.c) = (yyvsp[(5) - (8)].c);
@@ -13178,8 +13452,8 @@ yyreduce:
     ;}
     break;
 
-  case 561:
-#line 5928 "Gmsh.y"
+  case 570:
+#line 6017 "Gmsh.y"
     {
       std::string in = (yyvsp[(3) - (8)].c);
       std::string out = in.substr((int)(yyvsp[(5) - (8)].d), (int)(yyvsp[(7) - (8)].d));
@@ -13189,8 +13463,8 @@ yyreduce:
     ;}
     break;
 
-  case 562:
-#line 5936 "Gmsh.y"
+  case 571:
+#line 6025 "Gmsh.y"
     {
       std::string in = (yyvsp[(3) - (6)].c);
       std::string out = in.substr((int)(yyvsp[(5) - (6)].d), std::string::npos);
@@ -13200,15 +13474,15 @@ yyreduce:
     ;}
     break;
 
-  case 563:
-#line 5944 "Gmsh.y"
+  case 572:
+#line 6033 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(3) - (4)].c);
     ;}
     break;
 
-  case 564:
-#line 5948 "Gmsh.y"
+  case 573:
+#line 6037 "Gmsh.y"
     {
       char tmpstring[5000];
       int i = printListOfDouble((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].l), tmpstring);
@@ -13229,8 +13503,8 @@ yyreduce:
     ;}
     break;
 
-  case 565:
-#line 5967 "Gmsh.y"
+  case 574:
+#line 6056 "Gmsh.y"
     {
       std::string tmp = FixRelativePath(gmsh_yyname, (yyvsp[(3) - (4)].c));
       (yyval.c) = (char*)Malloc((tmp.size() + 1) * sizeof(char));
@@ -13239,8 +13513,8 @@ yyreduce:
     ;}
     break;
 
-  case 566:
-#line 5974 "Gmsh.y"
+  case 575:
+#line 6063 "Gmsh.y"
     {
       std::string tmp = SplitFileName(GetAbsolutePath(gmsh_yyname))[0];
       (yyval.c) = (char*)Malloc((tmp.size() + 1) * sizeof(char));
@@ -13248,8 +13522,8 @@ yyreduce:
     ;}
     break;
 
-  case 567:
-#line 5980 "Gmsh.y"
+  case 576:
+#line 6069 "Gmsh.y"
     {
       std::string tmp = SplitFileName((yyvsp[(3) - (4)].c))[0];
       (yyval.c) = (char*)Malloc((tmp.size() + 1) * sizeof(char));
@@ -13258,8 +13532,8 @@ yyreduce:
     ;}
     break;
 
-  case 568:
-#line 5987 "Gmsh.y"
+  case 577:
+#line 6076 "Gmsh.y"
     {
       std::string tmp = GetAbsolutePath((yyvsp[(3) - (4)].c));
       (yyval.c) = (char*)Malloc((tmp.size() + 1) * sizeof(char));
@@ -13268,13 +13542,13 @@ yyreduce:
     ;}
     break;
 
-  case 569:
-#line 5994 "Gmsh.y"
+  case 578:
+#line 6083 "Gmsh.y"
     { init_options(); ;}
     break;
 
-  case 570:
-#line 5996 "Gmsh.y"
+  case 579:
+#line 6085 "Gmsh.y"
     {
       std::string val((yyvsp[(3) - (6)].c));
       Msg::ExchangeOnelabParameter("", val, floatOptions, charOptions);
@@ -13284,8 +13558,8 @@ yyreduce:
     ;}
     break;
 
-  case 571:
-#line 6004 "Gmsh.y"
+  case 580:
+#line 6093 "Gmsh.y"
     {
       std::string out;
       const std::string * key_struct = NULL;
@@ -13308,58 +13582,58 @@ yyreduce:
     ;}
     break;
 
-  case 572:
-#line 6028 "Gmsh.y"
+  case 581:
+#line 6117 "Gmsh.y"
     { struct_namespace = std::string(""); (yyval.d) = (yyvsp[(2) - (2)].d); ;}
     break;
 
-  case 573:
-#line 6030 "Gmsh.y"
+  case 582:
+#line 6119 "Gmsh.y"
     { struct_namespace = (yyvsp[(1) - (4)].c); Free((yyvsp[(1) - (4)].c)); (yyval.d) = (yyvsp[(4) - (4)].d); ;}
     break;
 
-  case 574:
-#line 6036 "Gmsh.y"
+  case 583:
+#line 6125 "Gmsh.y"
     { (yyval.l) = (yyvsp[(3) - (4)].l); ;}
     break;
 
-  case 575:
-#line 6041 "Gmsh.y"
+  case 584:
+#line 6130 "Gmsh.y"
     { (yyval.l) = (yyvsp[(1) - (1)].l); ;}
     break;
 
-  case 576:
-#line 6043 "Gmsh.y"
+  case 585:
+#line 6132 "Gmsh.y"
     { (yyval.l) = (yyvsp[(1) - (1)].l); ;}
     break;
 
-  case 577:
-#line 6048 "Gmsh.y"
+  case 586:
+#line 6137 "Gmsh.y"
     { (yyval.l) = (yyvsp[(2) - (3)].l); ;}
     break;
 
-  case 578:
-#line 6053 "Gmsh.y"
+  case 587:
+#line 6142 "Gmsh.y"
     {
       (yyval.l) = List_Create(20,20,sizeof(char*));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].c)));
     ;}
     break;
 
-  case 579:
-#line 6058 "Gmsh.y"
+  case 588:
+#line 6147 "Gmsh.y"
     { (yyval.l) = (yyvsp[(1) - (1)].l); ;}
     break;
 
-  case 580:
-#line 6060 "Gmsh.y"
+  case 589:
+#line 6149 "Gmsh.y"
     {
       List_Add((yyval.l), &((yyvsp[(3) - (3)].c)));
     ;}
     break;
 
-  case 581:
-#line 6064 "Gmsh.y"
+  case 590:
+#line 6153 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (3)].l)); i++){
 	char* c;
@@ -13370,8 +13644,8 @@ yyreduce:
     ;}
     break;
 
-  case 582:
-#line 6076 "Gmsh.y"
+  case 591:
+#line 6165 "Gmsh.y"
     {
       (yyval.l) = List_Create(20, 20, sizeof(char *));
       if(!gmsh_yystringsymbols.count((yyvsp[(1) - (3)].c)))
@@ -13387,22 +13661,22 @@ yyreduce:
     ;}
     break;
 
-  case 583:
-#line 6090 "Gmsh.y"
+  case 592:
+#line 6179 "Gmsh.y"
     {
       (yyval.l) = treat_Struct_FullName_dot_tSTRING_ListOfString(NULL, (yyvsp[(1) - (5)].c), (yyvsp[(3) - (5)].c));
     ;}
     break;
 
-  case 584:
-#line 6094 "Gmsh.y"
+  case 593:
+#line 6183 "Gmsh.y"
     {
       (yyval.l) = treat_Struct_FullName_dot_tSTRING_ListOfString((yyvsp[(1) - (7)].c), (yyvsp[(3) - (7)].c), (yyvsp[(5) - (7)].c));
     ;}
     break;
 
-  case 585:
-#line 6101 "Gmsh.y"
+  case 594:
+#line 6190 "Gmsh.y"
     {
       char tmpstr[256];
       sprintf(tmpstr, "_%d", (int)(yyvsp[(4) - (5)].d));
@@ -13412,8 +13686,8 @@ yyreduce:
     ;}
     break;
 
-  case 586:
-#line 6109 "Gmsh.y"
+  case 595:
+#line 6198 "Gmsh.y"
     {
       char tmpstr[256];
       sprintf(tmpstr, "_%d", (int)(yyvsp[(4) - (5)].d));
@@ -13423,8 +13697,8 @@ yyreduce:
     ;}
     break;
 
-  case 587:
-#line 6117 "Gmsh.y"
+  case 596:
+#line 6206 "Gmsh.y"
     {
       char tmpstr[256];
       sprintf(tmpstr, "_%d", (int)(yyvsp[(7) - (8)].d));
@@ -13434,24 +13708,24 @@ yyreduce:
     ;}
     break;
 
-  case 588:
-#line 6128 "Gmsh.y"
+  case 597:
+#line 6217 "Gmsh.y"
     { (yyval.c) = (yyvsp[(1) - (1)].c); ;}
     break;
 
-  case 589:
-#line 6130 "Gmsh.y"
+  case 598:
+#line 6219 "Gmsh.y"
     { (yyval.c) = (yyvsp[(1) - (1)].c); ;}
     break;
 
-  case 590:
-#line 6133 "Gmsh.y"
+  case 599:
+#line 6222 "Gmsh.y"
     { (yyval.c) = (yyvsp[(3) - (4)].c); ;}
     break;
 
 
 /* Line 1267 of yacc.c.  */
-#line 13455 "Gmsh.tab.cpp"
+#line 13729 "Gmsh.tab.cpp"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -13665,7 +13939,7 @@ yyreturn:
 }
 
 
-#line 6136 "Gmsh.y"
+#line 6225 "Gmsh.y"
 
 
 void assignVariable(const std::string &name, int index, int assignType,
@@ -14165,6 +14439,9 @@ void getAllPhysicalTags(int dim, List_T *out)
 
 void getElementaryTagsForPhysicalGroups(int dim, List_T *in, List_T *out)
 {
+  if(GModel::current()->getOCCInternals() &&
+     GModel::current()->getOCCInternals()->getChanged())
+    GModel::current()->getOCCInternals()->synchronize(GModel::current());
   if(GModel::current()->getGEOInternals()->getChanged())
     GModel::current()->getGEOInternals()->synchronize(GModel::current());
 
diff --git a/Parser/Gmsh.y b/Parser/Gmsh.y
index 0e39b28650e3109ce9a9c5414d2fffac5023d7be..4200917b0193120c90fcc9c1764e3eadd99c437d 100644
--- a/Parser/Gmsh.y
+++ b/Parser/Gmsh.y
@@ -2498,6 +2498,62 @@ ListOfShapes :
         List_Add($$, &s);
       }
     }
+  | ListOfShapes tPhysical GeoEntity '{' RecursiveListOfDouble '}' tEND
+    {
+      List_T *tmp = List_Create(10, 10, sizeof(double));
+      getElementaryTagsForPhysicalGroups($3, $5, tmp);
+      for(int i = 0; i < List_Nbr(tmp); i++){
+	double d;
+	List_Read(tmp, i, &d);
+ 	Shape s;
+	s.Num = (int)d; // FIXME
+        switch ($3) {
+        case 0: s.Type = MSH_POINT    ; break;
+        case 1: s.Type = MSH_SEGM_LINE; break;
+        case 2: s.Type = MSH_SURF_PLAN; break; // we don't care about the actual type
+        case 3: s.Type = MSH_VOLUME   ; break;
+        }
+        List_Add($$, &s);
+      }
+    }
+  | ListOfShapes GeoEntity '{' tDOTS '}' tEND
+    {
+      List_T *tmp = List_Create(10, 10, sizeof(double));
+      getAllElementaryTags($2, tmp);
+      for(int i = 0; i < List_Nbr(tmp); i++){
+	double d;
+	List_Read(tmp, i, &d);
+	Shape s;
+	s.Num = (int)d;
+        switch ($2) {
+        case 0: s.Type = MSH_POINT    ; break;
+        case 1: s.Type = MSH_SEGM_LINE; break;
+        case 2: s.Type = MSH_SURF_PLAN; break; // we don't care about the actual type
+        case 3: s.Type = MSH_VOLUME   ; break;
+        }
+        List_Add($$, &s);
+      }
+    }
+  | ListOfShapes tPhysical GeoEntity '{' tDOTS '}' tEND
+    {
+      List_T *tmp = List_Create(10, 10, sizeof(double));
+      List_T *tmp2 = List_Create(10, 10, sizeof(double));
+      getAllPhysicalTags($3, tmp2);
+      getElementaryTagsForPhysicalGroups($3, tmp2, tmp);
+      for(int i = 0; i < List_Nbr(tmp); i++){
+	double d;
+	List_Read(tmp, i, &d);
+ 	Shape s;
+	s.Num = (int)d; // FIXME
+        switch ($3) {
+        case 0: s.Type = MSH_POINT    ; break;
+        case 1: s.Type = MSH_SEGM_LINE; break;
+        case 2: s.Type = MSH_SURF_PLAN; break; // we don't care about the actual type
+        case 3: s.Type = MSH_VOLUME   ; break;
+        }
+        List_Add($$, &s);
+      }
+    }
 ;
 
 //  L E V E L S E T S
@@ -3017,15 +3073,21 @@ SetPartition :
 //  V I S I B I L I T Y
 
 Visibility :
-    tShow tBIGSTR tEND
+    tShow '{' tDOTS '}'
+    {
+      setVisibility(-1, 1, false);
+    }
+  | tShow tBIGSTR tEND // deprecated: use {:} instead
     {
-      std::string what = $2;
       setVisibility(-1, 1, false);
       Free($2);
     }
-  | tHide tBIGSTR tEND
+  | tHide '{' tDOTS '}'
+    {
+      setVisibility(-1, 0, false);
+    }
+  | tHide tBIGSTR tEND // deprecated: use {:} instead
     {
-      std::string what = $2;
       setVisibility(-1, 0, false);
       Free($2);
     }
@@ -4083,14 +4145,19 @@ PeriodicTransform :
 ;
 
 Constraints :
-    tCharacteristic tLength ListOfDouble tAFFECT FExpr tEND
+    tCharacteristic tLength ListOfDoubleOrAll tAFFECT FExpr tEND
     {
       // mesh sizes at vertices are stored in internal CAD data, as they can be
       // specified during vertex creation and copied around during CAD
       // operations
-      for(int i = 0; i < List_Nbr($3); i++){
-	double d;
-	List_Read($3, i, &d);
+      List_T *tmp = $3;
+      if(!$3){
+        tmp = List_Create(100, 100, sizeof(double));
+        getAllElementaryTags(0, tmp);
+      }
+      for(int i = 0; i < List_Nbr(tmp); i++){
+        double d;
+        List_Read(tmp, i, &d);
         int tag = (int)d;
         if(GModel::current()->getOCCInternals())
           GModel::current()->getOCCInternals()->setMeshSize(0, tag, $5);
@@ -4098,7 +4165,7 @@ Constraints :
         GVertex *gv = GModel::current()->getVertexByTag(tag);
         if(gv) gv->setPrescribedMeshSizeAtVertex($5);
       }
-      List_Delete($3);
+      List_Delete(tmp);
     }
   | tTransfinite tLine ListOfDoubleOrAll tAFFECT FExpr TransfiniteType tEND
     {
@@ -5282,14 +5349,20 @@ ListOfDoubleOrAll :
     {
       $$ = $1;
     }
-  | tBIGSTR
+  | '{' tDOTS '}'
+    {
+      $$ = 0;
+    }
+  | tBIGSTR // deprecated: use {:} instead
     {
-      if(!strcmp($1, "*") || !strcmp($1, "all"))
+      if(!strcmp($1, "*") || !strcmp($1, "all")){
         $$ = 0;
+      }
       else{
         yyerror("Unknown special string for list replacement");
         $$ = List_Create(2, 1, sizeof(double));
       }
+      Free($1);
     }
 ;
 
@@ -5350,7 +5423,23 @@ FExpr_Multi :
       List_Add($$, &y);
       List_Add($$, &z);
     }
-  | GeoEntity tBIGSTR
+  | tPoint '{' tDOTS '}'
+    {
+      $$ = List_Create(10, 10, sizeof(double));
+      getAllElementaryTags(0, $$);
+    }
+  | tPoint tBIGSTR // deprecated syntax: use {:} instead
+    {
+      $$ = List_Create(10, 10, sizeof(double));
+      getAllElementaryTags(0, $$);
+      Free($2);
+    }
+  | GeoEntity123 '{' tDOTS '}'
+    {
+      $$ = List_Create(10, 10, sizeof(double));
+      getAllElementaryTags($1, $$);
+    }
+  | GeoEntity123 tBIGSTR // deprecated syntax: use {:} instead
     {
       $$ = List_Create(10, 10, sizeof(double));
       getAllElementaryTags($1, $$);
@@ -6632,6 +6721,9 @@ void getAllPhysicalTags(int dim, List_T *out)
 
 void getElementaryTagsForPhysicalGroups(int dim, List_T *in, List_T *out)
 {
+  if(GModel::current()->getOCCInternals() &&
+     GModel::current()->getOCCInternals()->getChanged())
+    GModel::current()->getOCCInternals()->synchronize(GModel::current());
   if(GModel::current()->getGEOInternals()->getChanged())
     GModel::current()->getGEOInternals()->synchronize(GModel::current());
 
diff --git a/Plugin/AnalyseCurvedMesh.cpp b/Plugin/AnalyseCurvedMesh.cpp
index 3a49ddb3afd1954d9d541c94c68006cdbd2d75d2..c798ab731f8d45ea8a26b9f7c94ef87afa4643af 100644
--- a/Plugin/AnalyseCurvedMesh.cpp
+++ b/Plugin/AnalyseCurvedMesh.cpp
@@ -26,7 +26,7 @@ StringXNumber CurvedMeshOptions_Number[] = {
   {GMSH_FULLRC, "Jacobian determinant", NULL, 1},
   {GMSH_FULLRC, "IGE measure", NULL, 1},
   {GMSH_FULLRC, "ICN measure", NULL, 1},
-  {GMSH_FULLRC, "Hidding threshold", NULL, 9},
+  {GMSH_FULLRC, "Hiding threshold", NULL, 9},
   {GMSH_FULLRC, "Draw PView", NULL, 0},
   {GMSH_FULLRC, "Recompute", NULL, 0},
   {GMSH_FULLRC, "Dimension of elements", NULL, -1}
@@ -57,7 +57,7 @@ std::string GMSH_AnalyseCurvedMeshPlugin::getHelp() const
     "determinant (J), the IGE quality measure (Inverse Gradient Error) and/or "
     "the ICN quality measure (Inverse Condition Number). "
     "Statistics are printed and, if asked, a Pview is created for each measure. "
-    "The plugin hides elements for which the measure mu > 'Hidding threshold', "
+    "The plugin hides elements for which the measure mu > 'Hiding threshold', "
     "where mu is the ICN measure if asked otherwise the IGE measure if "
     "asked otherwise the Jacobian determinant.\n"
     "\n"
@@ -78,7 +78,7 @@ std::string GMSH_AnalyseCurvedMeshPlugin::getHelp() const
     "\n"
     "- ICN measure = {0, 1}\n"
     "\n"
-    "- Hidding threshold = [0, 1]: Hides all element for which min(mu) is "
+    "- Hiding threshold = [0, 1]: Hides all element for which min(mu) is "
     "strictly greater than the threshold, where mu is the ICN if ICN measure == 1, "
     "otherwise mu is the IGE it IGE measure == 1, "
     "otherwise mu is the Jacobian determinant.\n"
@@ -172,8 +172,12 @@ PView* GMSH_AnalyseCurvedMeshPlugin::execute(PView *v)
         std::map<int, std::vector<double> > dataPV;
         for (unsigned int i = 0; i < _data.size(); ++i) {
           MElement *const el = _data[i].element();
-          if (el->getDim() == dim)
-            dataPV[el->getNum()].push_back(_data[i].minJ()/_data[i].maxJ());
+          if (el->getDim() == dim) {
+            double q = 0;
+            if (_data[i].maxJ() > 0) q = _data[i].minJ() / _data[i].maxJ();
+            else if (_data[i].maxJ() < 0) q = _data[i].maxJ() / _data[i].minJ();
+            dataPV[el->getNum()].push_back(q);
+          }
         }
         if (dataPV.size()) {
           std::stringstream name;
@@ -248,6 +252,7 @@ void GMSH_AnalyseCurvedMeshPlugin::_computeMinMaxJandValidity(int dim)
       return;
   }
 
+  int cntInverted = 0;
   std::set<GEntity*, GEntityLessThan>::iterator it;
   for (it = entities.begin(); it != entities.end(); ++it) {
     GEntity *entity = *it;
@@ -335,13 +340,14 @@ void GMSH_AnalyseCurvedMeshPlugin::_computeMinMaxJandValidity(int dim)
       double min, max;
       jacobianBasedQuality::minMaxJacobianDeterminant(el, min, max, normals);
       _data.push_back(data_elementMinMax(el, min, max));
-      if (min < 0 && max < 0) {
-        Msg::Warning("Element %d is completely inverted", el->getNum());
-      }
+      if (min < 0 && max < 0) ++cntInverted;
       progress.next();
     }
     delete normals;
   }
+  if (cntInverted) {
+    Msg::Warning("%d elements are completely inverted", cntInverted);
+  }
   _computedJac[dim-1] = true;
 }
 
@@ -354,7 +360,7 @@ void GMSH_AnalyseCurvedMeshPlugin::_computeMinIGE(int dim)
   for (unsigned int i = 0; i < _data.size(); ++i) {
     MElement *const el = _data[i].element();
     if (el->getDim() != dim) continue;
-    if (_data[i].minJ() <= 0) {
+    if (_data[i].minJ() <= 0 && _data[i].maxJ() > 0) {
       _data[i].setMinS(0);
     }
     else {
@@ -375,7 +381,7 @@ void GMSH_AnalyseCurvedMeshPlugin::_computeMinICN(int dim)
   for (unsigned int i = 0; i < _data.size(); ++i) {
     MElement *const el = _data[i].element();
     if (el->getDim() != dim) continue;
-    if (_data[i].minJ() <= 0) {
+    if (_data[i].minJ() <= 0 && _data[i].maxJ() > 0) {
       _data[i].setMinI(0);
     }
     else {
@@ -438,19 +444,22 @@ void GMSH_AnalyseCurvedMeshPlugin::_printStatJacobian()
   avgminJ = avgratJ = avgratJc = 0;
 
   for (unsigned int i = 0; i < _data.size(); ++i) {
-    double q = 0;
-    if ( _data[i].minJ() > 0) q = _data[i].minJ() / _data[i].maxJ();
     infminJ = std::min(infminJ, _data[i].minJ());
     supminJ = std::max(supminJ, _data[i].minJ());
     avgminJ += _data[i].minJ();
-    infratJ = std::min(infratJ, _data[i].minJ()/_data[i].maxJ());
-    supratJ = std::max(supratJ, _data[i].minJ()/_data[i].maxJ());
-    avgratJ += _data[i].minJ()/_data[i].maxJ();
-    ++count;
+
+    double q = 0;
+    if (_data[i].maxJ() > 0) q = _data[i].minJ() / _data[i].maxJ();
+    else if (_data[i].maxJ() < 0) q = _data[i].maxJ() / _data[i].minJ();
+    infratJ = std::min(infratJ, q);
+    supratJ = std::max(supratJ, q);
+    avgratJ += q;
     if (q < 1-1e-5) {
       avgratJc += _data[i].minJ()/_data[i].maxJ();
       ++countc;
     }
+
+    ++count;
   }
   avgminJ /= count;
   avgratJ /= count;
diff --git a/Plugin/CMakeLists.txt b/Plugin/CMakeLists.txt
index 5f37603afc7d6190cd15c071f95f51cc69265ba3..b2bc58942aaebae59971ce3af89ef5c57e5efc09 100644
--- a/Plugin/CMakeLists.txt
+++ b/Plugin/CMakeLists.txt
@@ -32,7 +32,7 @@ set(SRC
   Scal2Tens.cpp Scal2Vec.cpp
   CutMesh.cpp
   NewView.cpp
-  SimplePartition.cpp Crack.cpp DuplicateBoundaries.cpp ThinLayerFixMesh.cpp
+  SimplePartition.cpp Crack.cpp ThinLayerFixMesh.cpp
   FaultZone.cpp
   MeshSubEntities.cpp
   CVTRemesh.cpp
diff --git a/Plugin/DuplicateBoundaries.cpp b/Plugin/DuplicateBoundaries.cpp
deleted file mode 100644
index 92a91a763ca78522682b040f68284b34c5a236a3..0000000000000000000000000000000000000000
--- a/Plugin/DuplicateBoundaries.cpp
+++ /dev/null
@@ -1,3905 +0,0 @@
-// Gmsh - Copyright (C) 1997-2013 C. Geuzaine, J.-F. Remacle
-//
-// See the LICENSE.txt file for license information. Please report all
-// bugs and problems to the public mailing list <gmsh@onelab.info>.
-
-#include "DuplicateBoundaries.h"
-#include "GModel.h"
-#include "discreteEdge.h"
-#include "discreteFace.h"
-#include "MElement.h"
-#include "MLine.h"
-#include "MTriangle.h"
-#include "MQuadrangle.h"
-#include "MPrism.h"
-#include "MEdge.h"
-#include <fstream>
-#include <sstream>
-#include "Context.h"
-
-StringXNumber DuplicateBoundariesOptions_Number[] = {
-  {GMSH_FULLRC, "Dummy", NULL, 1.},
-};
-
-extern "C"
-{
-  GMSH_Plugin *GMSH_RegisterDuplicateBoundariesPlugin()
-  {
-    return new GMSH_DuplicateBoundariesPlugin();
-  }
-}
-
-std::string GMSH_DuplicateBoundariesPlugin::getHelp() const
-{
-  return "Plugin(DuplicateBoundaries) is not documented yet.";
-}
-
-int GMSH_DuplicateBoundariesPlugin::getNbOptions() const
-{
-  return sizeof(DuplicateBoundariesOptions_Number) / sizeof(StringXNumber);
-}
-
-StringXNumber *GMSH_DuplicateBoundariesPlugin::getOption(int iopt)
-{
-  return &DuplicateBoundariesOptions_Number[iopt];
-}
-
-class EdgeData{
-public:
-  EdgeData(MEdge e) : edge(e) {}
-  MEdge edge;
-  std::vector<MVertex*> data;
-};
-
-struct Less_EdgeData : public std::binary_function<EdgeData, EdgeData, bool> {
-  bool operator()(const EdgeData &e1, const EdgeData &e2) const
-  {
-    if(e1.edge.getMinVertex() < e2.edge.getMinVertex()) return true;
-    if(e1.edge.getMinVertex() > e2.edge.getMinVertex()) return false;
-    if(e1.edge.getMaxVertex() < e2.edge.getMaxVertex()) return true;
-    return false;
-  }
-};
-
-//OLF VERSION ONLY DUPLICATING NODES
-
-//PView *GMSH_DuplicateBoundariesPlugin::execute(PView *view)
-//{
-//	std::cout<<"starting DuplicateBoundaries"<<std::endl;
-//	GModel *m = GModel::current();
-//	std::map<std::pair<MVertex*,GRegion*>,MVertex* > VertexAssociation;
-//	for (GModel::viter itv = m->firstVertex();itv != m->lastVertex();itv++){
-////		std::cout<<"entering first for"<<std::endl;
-//		GVertex* vTmp = (*itv);
-//		std::list<GRegion*> r = vTmp->regions();
-//		std::cout<<"size of mesh_vertices: "<<vTmp->mesh_vertices.size()<<std::endl;
-//		MVertex *vMesh = vTmp->mesh_vertices[0];
-//		std::cout<<"size of r: "<<r.size()<<std::endl;
-//		// for all regions, create association
-////		for (int i = 0; i < vTmp->getNumMeshVertices();i++){
-////			std::cout<<"entering second for"<<std::endl;
-////			MVertex* vMesh = vTmp->getMeshVertex(i);
-////			for (GModel::riter itr = vTmp->regions().begin();itr != vTmp->regions().end();itr++){
-//		for (std::list<GRegion*>::iterator itr = r.begin();itr != r.end();itr++){
-//			std::cout<<"entering third for"<<std::endl;
-//			GRegion* vReg = (*itr);
-//			//				std::cout<<"we have the region "<<vReg->
-//			MVertex *newv = new MVertex(vMesh->x(), vMesh->y(), vMesh->z(), (GEntity*)vReg);
-//			vReg->mesh_vertices.push_back(newv);
-//			VertexAssociation[std::make_pair(vMesh,vReg)] = newv;
-//			std::cout<<"end third for"<<std::endl;
-//		}
-////			std::cout<<"end second for"<<std::endl;
-////		}
-////		std::cout<<"end first for"<<std::endl;
-//	}
-//	std::cout<<"Phase 1 done for DuplicateBoundaries"<<std::endl;
-//	for (GModel::eiter ite = m->firstEdge();ite != m->lastEdge();ite++){
-//		GEdge* eTmp = (*ite);
-//		for (int i = 0; i < eTmp->mesh_vertices.size();i++){
-//			MVertex* vMesh = eTmp->mesh_vertices[i];
-//			std::list<GRegion*> r = eTmp->regions();
-//			for (std::list<GRegion*>::iterator itr = r.begin();itr != r.end();itr++){
-//				GRegion* vReg = (*itr);
-//				MVertex *newv = new MVertex(vMesh->x(), vMesh->y(), vMesh->z(), (GEntity*)vReg);
-//				vReg->mesh_vertices.push_back(newv);
-//				VertexAssociation[std::make_pair(vMesh,vReg)] = newv;
-//			}
-//		}
-//	}
-//	std::cout<<"Phase 2 done for DuplicateBoundaries"<<std::endl;
-//	for (GModel::fiter itf = m->firstFace();itf != m->lastFace();itf++){
-//		GFace* fTmp = (*itf);
-//		for (int i = 0; i < fTmp->mesh_vertices.size();i++){
-//			MVertex* vMesh = fTmp->mesh_vertices[i];
-//			std::list<GRegion*> r = fTmp->regions();
-//			for (std::list<GRegion*>::iterator itr = r.begin();itr != r.end();itr++){
-//				GRegion* vReg = (*itr);
-//				MVertex *newv = new MVertex(vMesh->x(), vMesh->y(), vMesh->z(), (GEntity*)vReg);
-//				vReg->mesh_vertices.push_back(newv);
-//				VertexAssociation[std::make_pair(vMesh,vReg)] = newv;
-//			}
-//		}
-//	}
-//	std::cout<<"Phase 3 done for DuplicateBoundaries"<<std::endl;
-//	for (GModel::riter itr = m->firstRegion();itr != m->lastRegion();itr++){
-//		GRegion* rTmp = (*itr);
-//		for (int i = 0; i < rTmp->getNumMeshElements();i++){
-//			MElement* elem = rTmp->getMeshElement(i);
-//			for (int j = 0;j < elem->getNumVertices();j++){
-//				MVertex* vert = elem->getVertex(j);
-//				std::map<std::pair<MVertex*,GRegion*>,MVertex* >::iterator itMap = VertexAssociation.find(std::make_pair(vert,rTmp));
-//				if (itMap != VertexAssociation.end()){
-//					elem->setVertex(j,itMap->second);
-//				}
-//			}
-//		}
-//	}
-//	std::cout<<"End of DuplicateBoundaries"<<std::endl;
-//	return view;
-//}
-
-double GMSH_DuplicateBoundariesPlugin::abs(double x){
-  if (x < 0.0){
-    return (-x);
-  }
-  else{
-    return x;
-  }
-}
-
-PView *GMSH_DuplicateBoundariesPlugin::executeBis(PView *view)
-{
-  std::cout<<"starting DuplicateBoundaries"<<std::endl;
-  GModel *m = GModel::current();
-  m->setFactory("geo");
-  std::set<GFace*> ToDuplicateList;
-  ToDuplicateList.clear();
-  std::set<GFace*> ToDuplicateListBoundary;
-  ToDuplicateListBoundary.clear();
-  std::vector<GFace*> facesBound;
-  facesBound.clear();
-  std::map<GFace*,SPoint3> centers;
-  std::vector<std::pair<GFace*,GFace*> > pairs;
-  //	int PhysicalSeeds = m->setPhysicalName("Seeds",3);
-  //
-  //	//std::cout<<"number for seeds: "<<PhysicalSeeds<<" and for interface: "<<PhysicalInterface<<std::endl;
-  //
-  //	for (GModel::riter itf= m->firstRegion();itf != m->lastRegion();itf++){
-  //		GRegion* fTmp = (*itf);
-  //		fTmp->addPhysicalEntity(PhysicalSeeds);
-  //	}
-  int PhysicalInterface = m->setPhysicalName("Interface",3);
-  std::cout<<"DEBUT INIT"<<std::endl;
-  for (GModel::fiter itf= m->firstFace();itf != m->lastFace();itf++){
-    GFace* fTmp = (*itf);
-
-    //for (unsigned int i = 0; i < fTmp->getNumMeshElements();i++){
-    //  MElement* elem = fTmp->getMeshElement(i);
-    //}
-
-    if (fTmp->numRegions() == 2){
-      ToDuplicateList.insert(fTmp);
-    }
-    else{
-      facesBound.push_back(fTmp);
-    }
-  }
-
-  for(unsigned int i=0;i<facesBound.size();i++){
-    double x = 0.0;
-    double y = 0.0;
-    double z = 0.0;
-
-    std::list<GVertex*> vertices;
-
-    vertices = facesBound[i]->vertices();
-
-    for(std::list<GVertex*>::iterator it2=vertices.begin();it2!=vertices.end();it2++){
-      x = x + (*it2)->x();
-      y = y + (*it2)->y();
-      z = z + (*it2)->z();
-    }
-
-    x = x/vertices.size();
-    y = y/vertices.size();
-    z = z/vertices.size();
-
-    centers.insert(std::pair<GFace*,SPoint3>(facesBound[i],SPoint3(x,y,z)));
-  }
-
-  for(unsigned int i=0;i<facesBound.size();i++){
-    for(unsigned int j=0;j<facesBound.size();j++){
-      std::map<GFace*,SPoint3>::iterator it3 = centers.find(facesBound[i]);
-      std::map<GFace*,SPoint3>::iterator it4 = centers.find(facesBound[j]);
-
-      SPoint3 p1 = it3->second;
-      SPoint3 p2 = it4->second;
-
-
-      //				categories.push_back(val);
-
-      //				print_segment(p1,p2,file);
-
-      if (abs((p2.x()-p1.x()-1.0))<0.0001){
-        if (abs((p2.y()-p1.y()))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }else if(abs((p2.z()-p1.z()-1.0))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }
-        }else if (abs((p2.y()-p1.y()-1.0))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }
-        }else if (abs((p1.y()-p2.y()-1.0))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }
-        }
-      }else if (abs((p1.x()-p2.x()-1.0))<0.0001){
-        if (abs((p2.y()-p1.y()))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            //NOTHING
-          }else if(abs((p2.z()-p1.z()-1.0))<0.0001){
-            //NOTHING
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            //NOTHING
-          }
-        }else if (abs((p2.y()-p1.y()-1.0))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            //NOTHING
-          }else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-            //NOTHING
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            //NOTHING
-          }
-        }else if (abs((p1.y()-p2.y()-1.0))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            //NOTHING
-          }else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-            //NOTHING
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            //NOTHING
-          }
-        }
-      }else if (abs((p1.x()-p2.x()))<0.0001){
-        if (abs((p2.y()-p1.y()-1.0))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }
-        }else if (abs((p1.y()-p2.y()-1.0))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            //NOTHING
-          }else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-            //NOTHING
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            //NOTHING
-          }
-        }else if (abs((p1.y()-p2.y()))<0.0001){
-          if (abs((p2.z()-p1.z()-1.0))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            //NOTHING
-          }
-        }
-      }
-    }
-  }
-
-  int counterNbDone = 10000;
-  //int tagEdges = 10000;
-  for (std::set<GFace*>::iterator itr = ToDuplicateList.begin();itr != ToDuplicateList.end();itr++){
-    counterNbDone++;
-    GFace* fTmp = (*itr);
-    //on doit dupliquer la face, les noeuds, les aretes, puis creer une region entre les deux
-    std::map<MVertex*,MVertex* > VertexAssociation;
-    std::map<GVertex*,GVertex* > GVertexAssociation;
-    std::map<GEdge*,GEdge* > GEdgeAssociation;
-    std::list<GVertex*> vlist = fTmp->vertices();
-    std::map<GVertex*,GEdge* > SurroudingEdges;
-    GRegion *rTmp = fTmp->getRegion(1);
-    std::list<GFace*> facesReg;
-    facesReg = rTmp->faces();
-    //for (std::list<GFace*>::iterator it2=facesReg.begin();it2!=facesReg.end();it2++){
-    //  GFace* fTemp = (*it2);
-    //}
-    double xCenterReg = 0.0;
-    double yCenterReg = 0.0;
-    double zCenterReg = 0.0;
-
-    int counterPts = 0;
-    for(std::list<GFace*>::iterator it2=facesReg.begin();it2!=facesReg.end();it2++){
-      GFace* fTemp = (*it2);
-      std::list<GVertex*> verticesFace = fTemp->vertices();
-      for (std::list<GVertex*>::iterator it3=verticesFace.begin();it3!=verticesFace.end();it3++){
-        xCenterReg = xCenterReg + (*it3)->x();
-        yCenterReg = yCenterReg + (*it3)->y();
-        zCenterReg = zCenterReg + (*it3)->z();
-        counterPts++;
-      }
-    }
-
-    xCenterReg = xCenterReg/counterPts;
-    yCenterReg = yCenterReg/counterPts;
-    zCenterReg = zCenterReg/counterPts;
-
-    for (std::list<GVertex*>::iterator itv = vlist.begin();itv != vlist.end();itv++){
-      //duplication Gvertex
-      GVertex* vTmp = (*itv);
-      double ponderatedX = 0.99999999999 * vTmp->x() + 0.00000000001 * xCenterReg;
-      double ponderatedY = 0.99999999999 * vTmp->y() + 0.00000000001 * yCenterReg;
-      double ponderatedZ = 0.99999999999 * vTmp->z() + 0.00000000001 * zCenterReg;
-      //			double ponderatedX = 1.0 * vTmp->x() + 0.0 * xCenterReg;
-      //			double ponderatedY = 1.0 * vTmp->y() + 0.0 * yCenterReg;
-      //			double ponderatedZ = 1.0 * vTmp->z() + 0.0 * zCenterReg;
-      //GVertex* newv = new gmshVertex(m,vTmp->prescribedMeshSizeAtVertex());
-      GVertex* newv = m->addVertex(ponderatedX,ponderatedY,ponderatedZ,vTmp->prescribedMeshSizeAtVertex());
-      GVertexAssociation[vTmp] = newv;
-      //creation des Gedge correspondantes
-      //GEdge* newE = new GEdge(m,tagEdges,vTmp,newv);
-      //tagEdges++;
-      //m->add(newE);
-      GEdge* newE = m->addLine(vTmp,newv);
-      SurroudingEdges[vTmp] = newE;
-      //maintenant traitement mesh
-      MVertex *vMesh = vTmp->mesh_vertices[0];
-      MVertex *newMv = new MVertex(vMesh->x(), vMesh->y(), vMesh->z(), (GEntity*)newv);
-      VertexAssociation[vMesh] = newMv;
-      newv->addMeshVertex(newMv);
-    }
-    std::list<GEdge*> elist = fTmp->edges();
-    std::vector<GEdge*> newEdgesVector;
-    std::vector<GFace*> SurroundingsFaces;
-    for (std::list<GEdge*>::iterator ite = elist.begin();ite != elist.end();ite++){
-      //duplication Gedge
-      GEdge* eTmp = (*ite);
-      GEdge* newE = m->addLine(GVertexAssociation[eTmp->getEndVertex()],GVertexAssociation[eTmp->getBeginVertex()]);
-      GEdgeAssociation[eTmp] = newE;
-      newEdgesVector.push_back(newE);
-      //creation des GFace correspondantes
-      GEdge* firstE = SurroudingEdges.find(eTmp->getEndVertex())->second;
-      GEdge* lastE = SurroudingEdges.find(eTmp->getBeginVertex())->second;
-      std::vector<GEdge*> VecEdgesTmp;
-      VecEdgesTmp.push_back(eTmp);
-      VecEdgesTmp.push_back(firstE);
-      VecEdgesTmp.push_back(newE);
-      VecEdgesTmp.push_back(lastE);
-      std::vector<std::vector<GEdge*> > VecOfVecTmp;
-      VecOfVecTmp.push_back(VecEdgesTmp);
-      GFace* newFaceTmp = m->addPlanarFace(VecOfVecTmp);
-      SurroundingsFaces.push_back(newFaceTmp);
-      //maintenant traitement mesh
-      for (unsigned int i = 0; i < eTmp->mesh_vertices.size();i++){
-        MVertex *vMesh = eTmp->mesh_vertices[i];
-        MVertex *newMv = new MVertex(vMesh->x(), vMesh->y(), vMesh->z(), (GEntity*)newE);
-        VertexAssociation[vMesh] = newMv;
-        newE->addMeshVertex(newMv);
-      }
-      for (unsigned int i = 0; i < eTmp->getNumMeshElements();i++){
-        MElement* elem = eTmp->getMeshElement(i);
-        MVertex *firstETmp = VertexAssociation.find(elem->getVertex(0))->second;
-        MVertex *lastETmp = VertexAssociation.find(elem->getVertex(1))->second;
-        MLine *newLine = new MLine(firstETmp,lastETmp);
-        newE->addLine(newLine);
-      }
-    }
-    std::vector<std::vector<GEdge*> > VecOfVec;
-    VecOfVec.push_back(newEdgesVector);
-    //creation de la nouvelle face
-    GFace* GFaceAssociation = m->addPlanarFace(VecOfVec);
-    //maintenant traitement mesh
-    for (unsigned int i = 0; i < fTmp->mesh_vertices.size();i++){
-      MVertex *vMesh = fTmp->mesh_vertices[i];
-      MVertex *newMv = new MVertex(vMesh->x(), vMesh->y(), vMesh->z(), (GEntity*)GFaceAssociation);
-      VertexAssociation[vMesh] = newMv;
-      GFaceAssociation->addMeshVertex(newMv);
-    }
-    for (unsigned int i = 0; i < fTmp->getNumMeshElements();i++){
-      MElement* elem = fTmp->getMeshElement(i);
-      MVertex *firstE = VertexAssociation.find(elem->getVertex(0))->second;
-      MVertex *secondE = VertexAssociation.find(elem->getVertex(1))->second;
-      MVertex *thirdE = VertexAssociation.find(elem->getVertex(2))->second;
-      MTriangle *newTri = new MTriangle(firstE,secondE,thirdE);
-      GFaceAssociation->addTriangle(newTri);
-
-
-
-    }
-    std::vector<GFace*> VectorFaces;
-    std::list<GFace*> listFaces;
-    VectorFaces.push_back(fTmp);
-    listFaces.push_back(fTmp);
-    for (unsigned int i = 0;i < SurroundingsFaces.size();i++){
-      VectorFaces.push_back(SurroundingsFaces[i]);
-      listFaces.push_back(SurroundingsFaces[i]);
-    }
-    VectorFaces.push_back(GFaceAssociation);
-    listFaces.push_back(GFaceAssociation);
-    std::vector<std::vector<GFace*> > VecOfVecGFace;
-    VecOfVecGFace.push_back(VectorFaces);
-    //creation de la nouvelle region
-
-    GRegion* createdRegion = new GRegion(m,counterNbDone);
-    createdRegion->addPhysicalEntity(PhysicalInterface);
-    createdRegion->set(listFaces);
-    m->add(createdRegion);
-    std::list<GFace*> RegFaces = rTmp->faces();
-    std::list<GFace*>::iterator it = std::find(RegFaces.begin(), RegFaces.end(), fTmp);
-    std::cout<<(*it)->tag()<<std::endl;
-    if(it != RegFaces.end()) RegFaces.erase(it);
-    RegFaces.push_back(GFaceAssociation);
-    rTmp->set(RegFaces);
-    std::list<GFace*> NewFacesReg;
-    NewFacesReg = rTmp->faces();
-    for (std::list<GFace*>::iterator it2=NewFacesReg.begin();it2!=NewFacesReg.end();it2++){
-      GFace* fTemp = (*it2);
-      for (std::list<GEdge*>::iterator ite = elist.begin();ite != elist.end();ite++){
-        GEdge* eTmp = (*ite);
-        GEdge* newE = GEdgeAssociation[eTmp];
-        fTemp->replaceEdge(eTmp,newE);
-      }
-    }
-    for (unsigned int i = 0; i < fTmp->getNumMeshElements();i++){
-      MElement* elem = fTmp->getMeshElement(i);
-
-
-
-      MVertex *firstE = VertexAssociation.find(elem->getVertex(0))->second;
-      MVertex *secondE = VertexAssociation.find(elem->getVertex(1))->second;
-      MVertex *thirdE = VertexAssociation.find(elem->getVertex(2))->second;
-
-
-
-      MPrism *newPri = new MPrism(elem->getVertex(0),elem->getVertex(1),elem->getVertex(2),firstE,secondE,thirdE);
-
-      createdRegion->addPrism(newPri);
-    }
-    for (unsigned int i = 0; i < rTmp->getNumMeshElements();i++){
-      MElement* elem = rTmp->getMeshElement(i);
-      for (int j = 0;j < elem->getNumVertices();j++){
-        MVertex* vert = elem->getVertex(j);
-        std::map<MVertex*,MVertex* >::iterator itMap = VertexAssociation.find(vert);
-        if (itMap != VertexAssociation.end()){
-          elem->setVertex(j,itMap->second);
-        }
-      }
-    }
-    int countTmp = 0;
-    //maitenant refonte points dans faces
-    for (std::list<GFace*>::iterator itTmp = NewFacesReg.begin();itTmp != NewFacesReg.end();itTmp++){
-      GFace* GFaceTmp = (*itTmp);
-      countTmp++;
-      for (unsigned int i = 0; i < GFaceTmp->getNumMeshElements();i++){
-        MElement* elem = GFaceTmp->getMeshElement(i);
-        for (int j = 0;j < elem->getNumVertices();j++){
-          MVertex* vert = elem->getVertex(j);
-          std::map<MVertex*,MVertex* >::iterator itMap = VertexAssociation.find(vert);
-          if (itMap != VertexAssociation.end()){
-            elem->setVertex(j,itMap->second);
-
-
-
-            std::vector<MVertex*> FaceVerti = GFaceTmp->mesh_vertices;
-            std::vector<MVertex*>::iterator itHere = std::find(FaceVerti.begin(), FaceVerti.end(), vert);
-            if(itHere != FaceVerti.end()) {
-              FaceVerti.erase(itHere);
-              FaceVerti.push_back(itMap->second);
-              GFaceTmp->mesh_vertices = FaceVerti;
-            }
-
-
-          }
-        }
-      }
-    }
-  }
-
-  //maintenant on attaque les faces au bord
-  for (std::set<GFace*>::iterator itr = ToDuplicateListBoundary.begin();itr != ToDuplicateListBoundary.end();itr++){
-    counterNbDone++;
-    GFace* fTmp = (*itr);
-    //on doit dupliquer la face, les noeuds, les aretes, puis creer une region entre les deux
-    std::map<MVertex*,MVertex* > VertexAssociation;
-    std::map<GVertex*,GVertex* > GVertexAssociation;
-    std::map<GEdge*,GEdge* > GEdgeAssociation;
-    std::list<GVertex*> vlist = fTmp->vertices();
-    std::map<GVertex*,GEdge* > SurroudingEdges;
-    GRegion *rTmp = fTmp->getRegion(0);
-    double xCenterReg = 0.0;
-    double yCenterReg = 0.0;
-    double zCenterReg = 0.0;
-
-    std::list<GFace*> facesReg;
-
-    facesReg = rTmp->faces();
-
-    int counterPts = 0;
-    for(std::list<GFace*>::iterator it2=facesReg.begin();it2!=facesReg.end();it2++){
-      GFace* fTemp = (*it2);
-      std::list<GVertex*> verticesFace = fTemp->vertices();
-      for (std::list<GVertex*>::iterator it3=verticesFace.begin();it3!=verticesFace.end();it3++){
-        xCenterReg = xCenterReg + (*it3)->x();
-        yCenterReg = yCenterReg + (*it3)->y();
-        zCenterReg = zCenterReg + (*it3)->z();
-        counterPts++;
-      }
-    }
-
-    xCenterReg = xCenterReg/counterPts;
-    yCenterReg = yCenterReg/counterPts;
-    zCenterReg = zCenterReg/counterPts;
-
-    for (std::list<GVertex*>::iterator itv = vlist.begin();itv != vlist.end();itv++){
-      //duplication Gvertex
-      GVertex* vTmp = (*itv);
-      double ponderatedX = 0.99999999999 * vTmp->x() + 0.00000000001 * xCenterReg;
-      double ponderatedY = 0.99999999999 * vTmp->y() + 0.00000000001 * yCenterReg;
-      double ponderatedZ = 0.99999999999 * vTmp->z() + 0.00000000001 * zCenterReg;
-      GVertex* newv = m->addVertex(ponderatedX,ponderatedY,ponderatedZ,vTmp->prescribedMeshSizeAtVertex());
-      GVertexAssociation[vTmp] = newv;
-      //creation des Gedge correspondantes
-      GEdge* newE = m->addLine(vTmp,newv);
-      SurroudingEdges[vTmp] = newE;
-      //maintenant traitement mesh
-      MVertex *vMesh = vTmp->mesh_vertices[0];
-      MVertex *newMv = new MVertex(vMesh->x(), vMesh->y(), vMesh->z(), (GEntity*)newv);
-      VertexAssociation[vMesh] = newMv;
-      newv->addMeshVertex(newMv);
-    }
-    std::list<GEdge*> elist = fTmp->edges();
-    std::vector<GEdge*> newEdgesVector;
-    std::vector<GFace*> SurroundingsFaces;
-    for (std::list<GEdge*>::iterator ite = elist.begin();ite != elist.end();ite++){
-      //duplication Gedge
-      GEdge* eTmp = (*ite);
-      GEdge* newE = m->addLine(GVertexAssociation[eTmp->getEndVertex()],GVertexAssociation[eTmp->getBeginVertex()]);
-      GEdgeAssociation[eTmp] = newE;
-      newEdgesVector.push_back(newE);
-      //creation des GFace correspondantes
-      GEdge* firstE = SurroudingEdges.find(eTmp->getEndVertex())->second;
-      GEdge* lastE = SurroudingEdges.find(eTmp->getBeginVertex())->second;
-      std::vector<GEdge*> VecEdgesTmp;
-      VecEdgesTmp.push_back(eTmp);
-      VecEdgesTmp.push_back(firstE);
-      VecEdgesTmp.push_back(newE);
-      VecEdgesTmp.push_back(lastE);
-      std::vector<std::vector<GEdge*> > VecOfVecTmp;
-      VecOfVecTmp.push_back(VecEdgesTmp);
-      GFace* newFaceTmp = m->addPlanarFace(VecOfVecTmp);
-      SurroundingsFaces.push_back(newFaceTmp);
-      //maintenant traitement mesh
-      for (unsigned int i = 0; i < eTmp->mesh_vertices.size();i++){
-        MVertex *vMesh = eTmp->mesh_vertices[i];
-        MVertex *newMv = new MVertex(vMesh->x(), vMesh->y(), vMesh->z(), (GEntity*)newE);
-        VertexAssociation[vMesh] = newMv;
-        newE->addMeshVertex(newMv);
-      }
-      for (unsigned int i = 0; i < eTmp->getNumMeshElements();i++){
-        MElement* elem = eTmp->getMeshElement(i);
-        MVertex *firstETmp = VertexAssociation.find(elem->getVertex(0))->second;
-        MVertex *lastETmp = VertexAssociation.find(elem->getVertex(1))->second;
-        MLine *newLine = new MLine(firstETmp,lastETmp);
-        newE->addLine(newLine);
-      }
-    }
-    std::vector<std::vector<GEdge*> > VecOfVec;
-    VecOfVec.push_back(newEdgesVector);
-    //creation de la nouvelle face
-    GFace* GFaceAssociation = m->addPlanarFace(VecOfVec);
-    //maintenant traitement mesh
-    for (unsigned int i = 0; i < fTmp->mesh_vertices.size();i++){
-      MVertex *vMesh = fTmp->mesh_vertices[i];
-      MVertex *newMv = new MVertex(vMesh->x(), vMesh->y(), vMesh->z(), (GEntity*)GFaceAssociation);
-      VertexAssociation[vMesh] = newMv;
-      GFaceAssociation->addMeshVertex(newMv);
-    }
-    for (unsigned int i = 0; i < fTmp->getNumMeshElements();i++){
-      MElement* elem = fTmp->getMeshElement(i);
-      MVertex *firstE = VertexAssociation.find(elem->getVertex(0))->second;
-      MVertex *secondE = VertexAssociation.find(elem->getVertex(1))->second;
-      MVertex *thirdE = VertexAssociation.find(elem->getVertex(2))->second;
-      MTriangle *newTri = new MTriangle(firstE,secondE,thirdE);
-      GFaceAssociation->addTriangle(newTri);
-    }
-    std::vector<GFace*> VectorFaces;
-    std::list<GFace*> listFaces;
-    VectorFaces.push_back(fTmp);
-    listFaces.push_back(fTmp);
-    for (unsigned int i = 0;i < SurroundingsFaces.size();i++){
-      VectorFaces.push_back(SurroundingsFaces[i]);
-      listFaces.push_back(SurroundingsFaces[i]);
-    }
-    VectorFaces.push_back(GFaceAssociation);
-    listFaces.push_back(GFaceAssociation);
-    std::vector<std::vector<GFace*> > VecOfVecGFace;
-    VecOfVecGFace.push_back(VectorFaces);
-    //creation de la nouvelle region
-
-    GRegion* createdRegion = new GRegion(m,counterNbDone);
-    createdRegion->set(listFaces);
-    createdRegion->addPhysicalEntity(PhysicalInterface);
-    m->add(createdRegion);
-
-
-    std::list<GFace*> RegFaces = rTmp->faces();
-    std::list<GFace*>::iterator it = std::find(RegFaces.begin(), RegFaces.end(), fTmp);
-    std::cout<<(*it)->tag()<<std::endl;
-    if(it != RegFaces.end()) RegFaces.erase(it);
-    RegFaces.push_back(GFaceAssociation);
-    rTmp->set(RegFaces);
-    std::list<GFace*> NewFacesReg;
-    NewFacesReg = rTmp->faces();
-    for (std::list<GFace*>::iterator it2=NewFacesReg.begin();it2!=NewFacesReg.end();it2++){
-      GFace* fTemp = (*it2);
-      for (std::list<GEdge*>::iterator ite = elist.begin();ite != elist.end();ite++){
-        GEdge* eTmp = (*ite);
-        GEdge* newE = GEdgeAssociation[eTmp];
-        fTemp->replaceEdge(eTmp,newE);
-      }
-    }
-
-
-    for (unsigned int i = 0; i < fTmp->getNumMeshElements();i++){
-      MElement* elem = fTmp->getMeshElement(i);
-      MVertex *firstE = VertexAssociation.find(elem->getVertex(0))->second;
-      MVertex *secondE = VertexAssociation.find(elem->getVertex(1))->second;
-      MVertex *thirdE = VertexAssociation.find(elem->getVertex(2))->second;
-      MPrism *newPri = new MPrism(elem->getVertex(0),elem->getVertex(1),elem->getVertex(2),firstE,secondE,thirdE);
-
-      createdRegion->addPrism(newPri);
-    }
-    for (unsigned int i = 0; i < rTmp->getNumMeshElements();i++){
-      MElement* elem = rTmp->getMeshElement(i);
-      for (int j = 0;j < elem->getNumVertices();j++){
-        MVertex* vert = elem->getVertex(j);
-        std::map<MVertex*,MVertex* >::iterator itMap = VertexAssociation.find(vert);
-        if (itMap != VertexAssociation.end()){
-          elem->setVertex(j,itMap->second);
-        }
-      }
-    }
-
-
-    int countTmp = 0;
-    //maitenant refonte points dans faces
-    for (std::list<GFace*>::iterator itTmp = NewFacesReg.begin();itTmp != NewFacesReg.end();itTmp++){
-      GFace* GFaceTmp = (*itTmp);
-      countTmp++;
-      for (unsigned int i = 0; i < GFaceTmp->getNumMeshElements();i++){
-        MElement* elem = GFaceTmp->getMeshElement(i);
-        for (int j = 0;j < elem->getNumVertices();j++){
-          MVertex* vert = elem->getVertex(j);
-          std::map<MVertex*,MVertex* >::iterator itMap = VertexAssociation.find(vert);
-          if (itMap != VertexAssociation.end()){
-            elem->setVertex(j,itMap->second);
-            std::vector<MVertex*> FaceVerti = GFaceTmp->mesh_vertices;
-            std::vector<MVertex*>::iterator itHere = std::find(FaceVerti.begin(), FaceVerti.end(), vert);
-            if(itHere != FaceVerti.end()) {
-              FaceVerti.erase(itHere);
-              FaceVerti.push_back(itMap->second);
-              GFaceTmp->mesh_vertices = FaceVerti;
-            }
-          }
-        }
-      }
-    }
-
-
-  }
-
-  /*
-  //now we put all info into a file
-  //to being with we put all boundary vertices into a unique set
-  std::vector<MEdge*> ListBoundaryVectors;
-  for (GModel::fiter itf= m->firstFace();itf != m->lastFace();itf++){
-  GFace* fTmp = (*itf);
-  if (fTmp->regions().size() == 1){
-  //for each node we are going to test the displacement
-  std::list<GEdge*> elist = fTmp->edges();
-  for (std::list<GEdge*>::iterator ite = elist.begin();ite != elist.end();ite++){
-
-  }
-  }
-  }
-  std::ofstream file2("PeriodicMatches.txt");
-  file2 << "PeriodicalNodes\n\n";
-  file2 << "Displacement 1.0 0.0 0.0\n\n";
-  file2 << "Displacement 0.0 1.0 0.0\n\n";
-  file2 << "Displacement 0.0 0.0 1.0\n\n";
-  */
-
-
-
-
-
-
-
-  return view;
-}
-
-PView *GMSH_DuplicateBoundariesPlugin::executeFourth(PView *view)
-{
-  GModel *m = GModel::current();
-  m->setFactory("geo");
-  std::set<GFace*> ToDuplicateList;
-  ToDuplicateList.clear();
-  std::set<GFace*> ToDuplicateListBoundary;
-  ToDuplicateListBoundary.clear();
-  std::vector<GFace*> facesBound;
-  facesBound.clear();
-  std::map<GFace*,SPoint3> centers;
-  std::vector<std::pair<GFace*,GFace*> > pairs;
-  std::vector<std::pair<GFace*,GFace*> > newPairs;
-  int PhysicalInterface = m->setPhysicalName("Interface",3);
-  for (GModel::fiter itf= m->firstFace();itf != m->lastFace();itf++){
-    GFace* fTmp = (*itf);
-    if (fTmp->numRegions() == 2){
-      ToDuplicateList.insert(fTmp);
-    }
-    else{
-      ToDuplicateListBoundary.insert(fTmp);
-      facesBound.push_back(fTmp);
-    }
-  }
-
-
-
-
-
-
-
-
-  for(unsigned int i=0;i<facesBound.size();i++){
-    double x = 0.0;
-    double y = 0.0;
-    double z = 0.0;
-
-    std::list<GVertex*> vertices;
-
-    vertices = facesBound[i]->vertices();
-
-    for(std::list<GVertex*>::iterator it2=vertices.begin();it2!=vertices.end();it2++){
-      x = x + (*it2)->x();
-      y = y + (*it2)->y();
-      z = z + (*it2)->z();
-    }
-
-    x = x/vertices.size();
-    y = y/vertices.size();
-    z = z/vertices.size();
-
-    centers.insert(std::pair<GFace*,SPoint3>(facesBound[i],SPoint3(x,y,z)));
-  }
-
-  for(unsigned int i=0;i<facesBound.size();i++){
-    for(unsigned int j=0;j<facesBound.size();j++){
-      std::map<GFace*,SPoint3>::iterator it3 = centers.find(facesBound[i]);
-      std::map<GFace*,SPoint3>::iterator it4 = centers.find(facesBound[j]);
-
-      SPoint3 p1 = it3->second;
-      SPoint3 p2 = it4->second;
-
-
-      //				categories.push_back(val);
-
-      //				print_segment(p1,p2,file);
-
-      if (abs((p2.x()-p1.x()-1.0))<0.0001){
-        if (abs((p2.y()-p1.y()))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }else if(abs((p2.z()-p1.z()-1.0))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }
-        }else if (abs((p2.y()-p1.y()-1.0))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }
-        }else if (abs((p1.y()-p2.y()-1.0))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }
-        }
-      }else if (abs((p1.x()-p2.x()-1.0))<0.0001){
-        if (abs((p2.y()-p1.y()))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            //NOTHING
-          }else if(abs((p2.z()-p1.z()-1.0))<0.0001){
-            //NOTHING
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            //NOTHING
-          }
-        }else if (abs((p2.y()-p1.y()-1.0))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            //NOTHING
-          }else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-            //NOTHING
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            //NOTHING
-          }
-        }else if (abs((p1.y()-p2.y()-1.0))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            //NOTHING
-          }else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-            //NOTHING
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            //NOTHING
-          }
-        }
-      }else if (abs((p1.x()-p2.x()))<0.0001){
-        if (abs((p2.y()-p1.y()-1.0))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }
-        }else if (abs((p1.y()-p2.y()-1.0))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            //NOTHING
-          }else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-            //NOTHING
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            //NOTHING
-          }
-        }else if (abs((p1.y()-p2.y()))<0.0001){
-          if (abs((p2.z()-p1.z()-1.0))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            //NOTHING
-          }
-        }
-      }
-    }
-  }
-
-
-
-
-
-
-
-
-
-
-  std::map<std::pair<MVertex*,GRegion*>,MVertex* > VertexGlobalAssociation;
-  std::map<std::pair<GVertex*,GRegion*>,GVertex* > GVertexGlobalAssociation;
-  std::map<std::pair<GEdge*,GRegion*>,GEdge* > GEdgeGlobalAssociation;
-  std::map<std::pair<GFace*,GRegion*>,GFace* > GFaceGlobalAssociation;
-
-  for (GModel::riter itr= m->firstRegion();itr != m->lastRegion();itr++){
-    GRegion* rTmp = (*itr);
-    std::list<GFace*> RegFaces = rTmp->faces();
-    std::map<MVertex*,MVertex* > VertexAssociation;
-    std::map<GVertex*,GVertex* > GVertexAssociation;
-    std::map<GEdge*,GEdge* > GEdgeAssociation;
-    //int counterNbDone = 10000;
-    double xCenterReg = 0.0;
-    double yCenterReg = 0.0;
-    double zCenterReg = 0.0;
-    int counterPts = 0;
-    for(std::list<GFace*>::iterator it2=RegFaces.begin();it2!=RegFaces.end();it2++){
-      GFace* fTemp = (*it2);
-      std::list<GVertex*> verticesFace = fTemp->vertices();
-      for (std::list<GVertex*>::iterator it3=verticesFace.begin();it3!=verticesFace.end();it3++){
-        xCenterReg = xCenterReg + (*it3)->x();
-        yCenterReg = yCenterReg + (*it3)->y();
-        zCenterReg = zCenterReg + (*it3)->z();
-        counterPts++;
-      }
-    }
-    xCenterReg = xCenterReg/counterPts;
-    yCenterReg = yCenterReg/counterPts;
-    zCenterReg = zCenterReg/counterPts;
-    //duplication noeud et aretes au niveau de la region directement
-    std::list<GVertex*> vlist;
-
-
-    std::list<GFace*> listFacesTmp = rTmp->faces();
-    for (std::list<GFace*>::iterator itTp = listFacesTmp.begin();itTp != listFacesTmp.end();itTp++){
-      std::list<GVertex*> vlist2;
-      vlist2 = (*itTp)->vertices();
-      for (std::list<GVertex*>::iterator itTp2 = vlist2.begin();itTp2 != vlist2.end();itTp2++){
-        if(std::find(vlist.begin(), vlist.end(), *itTp2) == vlist.end())
-          vlist.push_back(*itTp2);
-      }
-    }
-
-
-    for (std::list<GVertex*>::iterator itv = vlist.begin();itv != vlist.end();itv++){
-      //duplication Gvertex
-      GVertex* vTmp = (*itv);
-      double ponderatedX = 0.99999999999 * vTmp->x() + 0.00000000001 * xCenterReg;
-      double ponderatedY = 0.99999999999 * vTmp->y() + 0.00000000001 * yCenterReg;
-      double ponderatedZ = 0.99999999999 * vTmp->z() + 0.00000000001 * zCenterReg;
-      GVertex* newv = m->addVertex(ponderatedX,ponderatedY,ponderatedZ,vTmp->prescribedMeshSizeAtVertex());
-      GVertexAssociation[vTmp] = newv;
-      GVertexGlobalAssociation[std::make_pair(vTmp,rTmp)] = newv;
-      //creation des Gedge correspondantes
-      //			GEdge* newE = m->addLine(vTmp,newv);
-      //			SurroudingEdges[vTmp] = newE;
-      //maintenant traitement mesh
-      MVertex *vMesh = vTmp->mesh_vertices[0];
-      MVertex *newMv = new MVertex(vMesh->x(), vMesh->y(), vMesh->z(), (GEntity*)newv);
-      VertexAssociation[vMesh] = newMv;
-      VertexGlobalAssociation[std::make_pair(vMesh,rTmp)] = newMv;
-      newv->addMeshVertex(newMv);
-    }
-    //maintenant on soccupe de duppliquer les edges de la region
-    std::list<GEdge*> elist = rTmp->edges();
-
-    std::vector<GFace*> SurroundingsFaces;
-    for (std::list<GEdge*>::iterator ite = elist.begin();ite != elist.end();ite++){
-      //duplication Gedge
-      GEdge* eTmp = (*ite);
-      GEdge* newE = m->addLine(GVertexAssociation[eTmp->getEndVertex()],GVertexAssociation[eTmp->getBeginVertex()]);
-      GEdgeAssociation[eTmp] = newE;
-      GEdgeGlobalAssociation[std::make_pair(eTmp,rTmp)] = newE;
-      //creation des GFace correspondantes
-      //			GEdge* firstE = SurroudingEdges.find(eTmp->getEndVertex())->second;
-      //			GEdge* lastE = SurroudingEdges.find(eTmp->getBeginVertex())->second;
-      //			std::vector<GEdge*> VecEdgesTmp;
-      //			VecEdgesTmp.push_back(eTmp);
-      //			VecEdgesTmp.push_back(firstE);
-      //			VecEdgesTmp.push_back(newE);
-      //			VecEdgesTmp.push_back(lastE);
-      //			std::vector<std::vector<GEdge*> > VecOfVecTmp;
-      //			VecOfVecTmp.push_back(VecEdgesTmp);
-      //			GFace* newFaceTmp = m->addPlanarFace(VecOfVecTmp);
-      //			SurroundingsFaces.push_back(newFaceTmp);
-      //maintenant traitement mesh
-      for (unsigned int i = 0; i < eTmp->mesh_vertices.size();i++){
-        MVertex *vMesh = eTmp->mesh_vertices[i];
-        MVertex *newMv = new MVertex(vMesh->x(), vMesh->y(), vMesh->z(), (GEntity*)newE);
-        VertexAssociation[vMesh] = newMv;
-        VertexGlobalAssociation[std::make_pair(vMesh,rTmp)] = newMv;
-        newE->addMeshVertex(newMv);
-      }
-      for (unsigned int i = 0; i < eTmp->getNumMeshElements();i++){
-        MElement* elem = eTmp->getMeshElement(i);
-        MVertex *firstETmp = VertexAssociation.find(elem->getVertex(0))->second;
-        MVertex *lastETmp = VertexAssociation.find(elem->getVertex(1))->second;
-        MLine *newLine = new MLine(firstETmp,lastETmp);
-        newE->addLine(newLine);
-      }
-    }
-    for (std::list<GFace*>::iterator itf = RegFaces.begin();itf != RegFaces.end();itf++){
-      GFace* fTmp = (*itf);
-      std::vector<GEdge*> newEdgesVector;
-      std::list<GEdge*> elistFace = fTmp->edges();
-      for (std::list<GEdge*>::iterator ite = elistFace.begin();ite != elistFace.end();ite++){
-        GEdge* eTmp = (*ite);
-        GEdge* eToFind = GEdgeAssociation[eTmp];
-        newEdgesVector.push_back(eToFind);
-      }
-      std::vector<std::vector<GEdge*> > VecOfVec;
-      VecOfVec.push_back(newEdgesVector);
-      //creation de la nouvelle face
-      GFace* GFaceAssociation = m->addPlanarFace(VecOfVec);
-      //maintenant traitement mesh
-      for (unsigned int i = 0; i < fTmp->mesh_vertices.size();i++){
-        MVertex *vMesh = fTmp->mesh_vertices[i];
-        MVertex *newMv = new MVertex(vMesh->x(), vMesh->y(), vMesh->z(), (GEntity*)GFaceAssociation);
-        VertexAssociation[vMesh] = newMv;
-        VertexGlobalAssociation[std::make_pair(vMesh,rTmp)] = newMv;
-        GFaceAssociation->addMeshVertex(newMv);
-      }
-      for (unsigned int i = 0; i < fTmp->getNumMeshElements();i++){
-        MElement* elem = fTmp->getMeshElement(i);
-        MVertex *firstE = VertexAssociation.find(elem->getVertex(0))->second;
-        MVertex *secondE = VertexAssociation.find(elem->getVertex(1))->second;
-        MVertex *thirdE = VertexAssociation.find(elem->getVertex(2))->second;
-        MTriangle *newTri = new MTriangle(firstE,secondE,thirdE);
-        GFaceAssociation->addTriangle(newTri);
-      }
-      GFaceGlobalAssociation[std::make_pair(fTmp,rTmp)] = GFaceAssociation;
-    }
-  }
-  int counterNbDone = 10000;
-  //maintenant on va traiter les faces initiales
-  for (std::set<GFace*>::iterator itf = ToDuplicateList.begin();itf != ToDuplicateList.end();itf++){
-    counterNbDone++;
-    GFace* fTmp = (*itf);
-    GRegion* reg1 = fTmp->getRegion(0);
-    GRegion* reg2 = fTmp->getRegion(1);
-    //pour commencer on cree des aretes entre les vertex
-    std::list<GVertex*> vlist = fTmp->vertices();
-    std::map<GVertex*,GEdge* > SurroudingEdges;
-    for (std::list<GVertex*>::iterator itv = vlist.begin();itv != vlist.end();itv++){
-      GVertex* vTmp = (*itv);
-      GVertex* v1=0;
-      GVertex* v2=0;
-      std::map<std::pair<GVertex*,GRegion*>,GVertex* >::iterator itMap = GVertexGlobalAssociation.find(std::make_pair(vTmp,reg1));
-      if (itMap != GVertexGlobalAssociation.end()){
-        v1 = itMap->second;
-      }
-      itMap = GVertexGlobalAssociation.find(std::make_pair(vTmp,reg2));
-      if (itMap != GVertexGlobalAssociation.end()){
-        v2 = itMap->second;
-      }
-      GEdge* newE = m->addLine(v1,v2);
-      SurroudingEdges[vTmp] = newE;
-    }
-    //ici tous les vertex sont traites
-    //on va traiter les edges
-    std::list<GEdge*> elist = fTmp->edges();
-    std::vector<GEdge*> newEdgesVector;
-    std::vector<GFace*> SurroundingsFaces;
-    for (std::list<GEdge*>::iterator ite = elist.begin();ite != elist.end();ite++){
-      //duplication Gedge
-      GEdge* eTmp = (*ite);
-      GEdge* e1=0;
-      GEdge* e2=0;
-      std::map<std::pair<GEdge*,GRegion*>,GEdge* >::iterator itMap = GEdgeGlobalAssociation.find(std::make_pair(eTmp,reg1));
-      if (itMap != GEdgeGlobalAssociation.end()){
-        e1 = itMap->second;
-      }
-      itMap = GEdgeGlobalAssociation.find(std::make_pair(eTmp,reg2));
-      if (itMap != GEdgeGlobalAssociation.end()){
-        e2 = itMap->second;
-      }
-      //creation des GFace correspondantes
-      GEdge* firstE = SurroudingEdges.find(eTmp->getBeginVertex())->second;
-      GEdge* lastE = SurroudingEdges.find(eTmp->getEndVertex())->second;
-      if (firstE->getBeginVertex() != e1->getEndVertex()){
-        firstE->reverse();
-      }
-      if (firstE->getBeginVertex() != e1->getEndVertex()){
-        e1->reverse();
-      }
-      if (firstE->getBeginVertex() != e1->getEndVertex()){
-        firstE->reverse();
-      }
-      if (e2->getBeginVertex() != firstE->getEndVertex()){
-        e2->reverse();
-      }
-      if (lastE->getBeginVertex() != e2->getEndVertex()){
-        lastE->reverse();
-      }
-      std::vector<GEdge*> VecEdgesTmp;
-      VecEdgesTmp.push_back(e1);
-      VecEdgesTmp.push_back(firstE);
-      VecEdgesTmp.push_back(e2);
-      VecEdgesTmp.push_back(lastE);
-      std::vector<std::vector<GEdge*> > VecOfVecTmp;
-      VecOfVecTmp.push_back(VecEdgesTmp);
-      GFace* newFaceTmp = m->addPlanarFace(VecOfVecTmp);
-      SurroundingsFaces.push_back(newFaceTmp);
-    }
-    std::vector<GFace*> VectorFaces;
-    std::list<GFace*> listFaces;
-    GFace* f1;
-    GFace* f2;
-    std::map<std::pair<GFace*,GRegion*>,GFace* >::iterator itMap = GFaceGlobalAssociation.find(std::make_pair(fTmp,reg1));
-    if (itMap != GFaceGlobalAssociation.end()){
-      f1 = itMap->second;
-    }
-    itMap = GFaceGlobalAssociation.find(std::make_pair(fTmp,reg2));
-    if (itMap != GFaceGlobalAssociation.end()){
-      f2 = itMap->second;
-    }
-    VectorFaces.push_back(f1);
-    listFaces.push_back(f1);
-    for (unsigned int i = 0;i < SurroundingsFaces.size();i++){
-      VectorFaces.push_back(SurroundingsFaces[i]);
-      listFaces.push_back(SurroundingsFaces[i]);
-    }
-    VectorFaces.push_back(f2);
-    listFaces.push_back(f2);
-    std::vector<std::vector<GFace*> > VecOfVecGFace;
-    VecOfVecGFace.push_back(VectorFaces);
-    //creation de la nouvelle region
-    GRegion* createdRegion = new GRegion(m,counterNbDone);
-    createdRegion->addPhysicalEntity(PhysicalInterface);
-    createdRegion->set(listFaces);
-    m->add(createdRegion);
-    for (unsigned int i = 0; i < fTmp->getNumMeshElements();i++){
-      MElement* elem = fTmp->getMeshElement(i);
-      MVertex* v1=0;
-      MVertex* v2=0;
-      MVertex* v3=0;
-      MVertex* v4=0;
-      MVertex* v5=0;
-      MVertex* v6=0;
-      std::map<std::pair<MVertex*,GRegion*>,MVertex* >::iterator itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(0),reg1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v1 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(1),reg1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v2 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(2),reg1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v3 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(0),reg2));
-      if (itMap != VertexGlobalAssociation.end()){
-        v4 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(1),reg2));
-      if (itMap != VertexGlobalAssociation.end()){
-        v5 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(2),reg2));
-      if (itMap != VertexGlobalAssociation.end()){
-        v6 = itMap->second;
-      }
-      MPrism *newPri = new MPrism(v1,v2,v3,v4,v5,v6);
-
-      createdRegion->addPrism(newPri);
-    }
-    for (unsigned int i = 0; i < reg1->getNumMeshElements();i++){
-      MElement* elem = reg1->getMeshElement(i);
-      for (int j = 0;j < elem->getNumVertices();j++){
-        MVertex* vert = elem->getVertex(j);
-        std::map<std::pair<MVertex*,GRegion*>,MVertex* >::iterator itMap = VertexGlobalAssociation.find(std::make_pair(vert,reg1));
-        if (itMap != VertexGlobalAssociation.end()){
-          elem->setVertex(j,itMap->second);
-        }
-      }
-    }
-    for (unsigned int i = 0; i < reg2->getNumMeshElements();i++){
-      MElement* elem = reg2->getMeshElement(i);
-      for (int j = 0;j < elem->getNumVertices();j++){
-        MVertex* vert = elem->getVertex(j);
-        std::map<std::pair<MVertex*,GRegion*>,MVertex* >::iterator itMap = VertexGlobalAssociation.find(std::make_pair(vert,reg2));
-        if (itMap != VertexGlobalAssociation.end()){
-          elem->setVertex(j,itMap->second);
-        }
-      }
-    }
-  }
-  //maintenant on va traiter les faces du bord
-  for (std::set<GFace*>::iterator itf = ToDuplicateListBoundary.begin();itf != ToDuplicateListBoundary.end();itf++){
-    counterNbDone++;
-    GFace* fTmp = (*itf);
-    GRegion* reg1 = fTmp->getRegion(0);
-    //pour commencer on cree des aretes entre les vertex
-    std::list<GVertex*> vlist = fTmp->vertices();
-    std::map<GVertex*,GEdge* > SurroudingEdges;
-    for (std::list<GVertex*>::iterator itv = vlist.begin();itv != vlist.end();itv++){
-      GVertex* vTmp = (*itv);
-      GVertex* v1=0;
-      std::map<std::pair<GVertex*,GRegion*>,GVertex* >::iterator itMap = GVertexGlobalAssociation.find(std::make_pair(vTmp,reg1));
-      if (itMap != GVertexGlobalAssociation.end()){
-        v1 = itMap->second;
-      }
-      GEdge* newE = m->addLine(v1,vTmp);
-      SurroudingEdges[vTmp] = newE;
-    }
-    //ici tous les vertex sont traites
-    //on va traiter les edges
-    std::list<GEdge*> elist = fTmp->edges();
-    std::vector<GEdge*> newEdgesVector;
-    std::vector<GFace*> SurroundingsFaces;
-    for (std::list<GEdge*>::iterator ite = elist.begin();ite != elist.end();ite++){
-      //duplication Gedge
-      GEdge* eTmp = (*ite);
-      GEdge* e1=0;
-      std::map<std::pair<GEdge*,GRegion*>,GEdge* >::iterator itMap = GEdgeGlobalAssociation.find(std::make_pair(eTmp,reg1));
-      if (itMap != GEdgeGlobalAssociation.end()){
-        e1 = itMap->second;
-      }
-      //creation des GFace correspondantes
-      GEdge* firstE = SurroudingEdges.find(eTmp->getBeginVertex())->second;
-      GEdge* lastE = SurroudingEdges.find(eTmp->getEndVertex())->second;
-      if (firstE->getBeginVertex() != e1->getEndVertex()){
-        firstE->reverse();
-      }
-      if (firstE->getBeginVertex() != e1->getEndVertex()){
-        e1->reverse();
-      }
-      if (firstE->getBeginVertex() != e1->getEndVertex()){
-        firstE->reverse();
-      }
-      if (eTmp->getBeginVertex() != firstE->getEndVertex()){
-        eTmp->reverse();
-      }
-      if (lastE->getBeginVertex() != eTmp->getEndVertex()){
-        lastE->reverse();
-      }
-      std::vector<GEdge*> VecEdgesTmp;
-      VecEdgesTmp.push_back(e1);
-      VecEdgesTmp.push_back(firstE);
-      VecEdgesTmp.push_back(eTmp);
-      VecEdgesTmp.push_back(lastE);
-      std::vector<std::vector<GEdge*> > VecOfVecTmp;
-      VecOfVecTmp.push_back(VecEdgesTmp);
-      GFace* newFaceTmp = m->addPlanarFace(VecOfVecTmp);
-      SurroundingsFaces.push_back(newFaceTmp);
-    }
-    std::vector<GFace*> VectorFaces;
-    std::list<GFace*> listFaces;
-    GFace* f1;
-    std::map<std::pair<GFace*,GRegion*>,GFace* >::iterator itMap = GFaceGlobalAssociation.find(std::make_pair(fTmp,reg1));
-    if (itMap != GFaceGlobalAssociation.end()){
-      f1 = itMap->second;
-    }
-    VectorFaces.push_back(f1);
-    listFaces.push_back(f1);
-    for (unsigned int i = 0;i < SurroundingsFaces.size();i++){
-      VectorFaces.push_back(SurroundingsFaces[i]);
-      listFaces.push_back(SurroundingsFaces[i]);
-    }
-    VectorFaces.push_back(fTmp);
-    listFaces.push_back(fTmp);
-    std::vector<std::vector<GFace*> > VecOfVecGFace;
-    VecOfVecGFace.push_back(VectorFaces);
-    //creation de la nouvelle region
-    GRegion* createdRegion = new GRegion(m,counterNbDone);
-    createdRegion->addPhysicalEntity(PhysicalInterface);
-    createdRegion->set(listFaces);
-    m->add(createdRegion);
-    for (unsigned int i = 0; i < fTmp->getNumMeshElements();i++){
-      MElement* elem = fTmp->getMeshElement(i);
-      MVertex* v1=0;
-      MVertex* v2=0;
-      MVertex* v3=0;
-      std::map<std::pair<MVertex*,GRegion*>,MVertex* >::iterator itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(0),reg1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v1 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(1),reg1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v2 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(2),reg1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v3 = itMap->second;
-      }
-      MPrism *newPri = new MPrism(v1,v2,v3,elem->getVertex(0),elem->getVertex(1),elem->getVertex(2));
-
-      createdRegion->addPrism(newPri);
-    }
-    for (unsigned int i = 0; i < reg1->getNumMeshElements();i++){
-      MElement* elem = reg1->getMeshElement(i);
-      for (int j = 0;j < elem->getNumVertices();j++){
-        MVertex* vert = elem->getVertex(j);
-        std::map<std::pair<MVertex*,GRegion*>,MVertex* >::iterator itMap = VertexGlobalAssociation.find(std::make_pair(vert,reg1));
-        if (itMap != VertexGlobalAssociation.end()){
-          elem->setVertex(j,itMap->second);
-        }
-      }
-    }
-  }
-  std::ofstream file("MicrostructurePolycrystal3D.pos");
-  file << "View \"test\" {\n";
-
-  std::ofstream file2("PERIODIC.map");
-  for (std::vector<std::pair<GFace*,GFace*> >::iterator itP = pairs.begin();itP != pairs.end();itP++){
-    std::pair<GFace*,GFace*> pairTmp = (*itP);
-    GFace* ToReplaceFace = pairTmp.second;
-    GRegion* rTmp = ToReplaceFace->getRegion(0);
-    std::map<std::pair<GFace*,GRegion*>,GFace* >::iterator itMap = GFaceGlobalAssociation.find(std::make_pair(ToReplaceFace,rTmp));
-    if (itMap != GFaceGlobalAssociation.end()){
-      GFace* associatedFace = (*itMap).second;
-
-
-
-
-
-
-      std::map<GFace*,SPoint3>::iterator it3 = centers.find(pairTmp.first);
-      std::map<GFace*,SPoint3>::iterator it4 = centers.find(ToReplaceFace);
-
-      SPoint3 p1 = it3->second;
-      SPoint3  p2 = it4->second;
-
-      //double delta_x = fabs(p2.x()-p1.x());
-      //double delta_y = fabs(p2.y()-p1.y());
-      //double delta_z = fabs(p2.z()-p1.z());
-
-
-      file << "SL ("
-           << p1.x() << ", " << p1.y() << ", " << p1.z() << ", "
-           << p2.x() << ", " << p2.y() << ", " << p2.z()
-           << "){10, 20};\n";
-
-      //file2 << "PERIODIC\tSURFACE"<<faces[i]->tag() << "\tSURFACE" << faces[j]->tag() << "\t" << p2.x()-p1.x() << "\t" << p2.y()-p1.y() << "\t" << p2.z()-p1.z() << "\n";
-      if (abs((p2.x()-p1.x()-1.0))<0.0001){
-        if (abs((p2.y()-p1.y()))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            file2 << "NSET\tFRONT = FRONT + SURFACE"<<ToReplaceFace->tag()<<"\n";
-            file2 << "NSET\tBACK = BACK + SURFACE"<<pairTmp.first->tag()<<"\n";
-          }else if(abs((p2.z()-p1.z()-1.0))<0.0001){
-            file2 << "NSET\tFRONTTOP = FRONTTOP + SURFACE"<<ToReplaceFace->tag()<<"\n";
-            file2 << "NSET\tBACKBOTTOM = BACKBOTTOM + SURFACE"<<pairTmp.first->tag()<<"\n";
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            file2 << "NSET\tFRONTBOTTOM = FRONTBOTTOM + SURFACE"<<ToReplaceFace->tag()<<"\n";
-            file2 << "NSET\tBACKTOP = BACKTOP + SURFACE"<<pairTmp.first->tag()<<"\n";
-          }
-        }else if (abs((p2.y()-p1.y()-1.0))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            file2 << "NSET\tFRONTRIGHT = FRONTRIGHT + SURFACE"<<ToReplaceFace->tag()<<"\n";
-            file2 << "NSET\tBACKLEFT = BACKLEFT + SURFACE"<<pairTmp.first->tag()<<"\n";
-          }else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-            file2 << "NSET\tFRONTRIGHTTOP = FRONTRIGHTTOP + SURFACE"<<ToReplaceFace->tag()<<"\n";
-            file2 << "NSET\tBACKLEFTBOTTOM = BACKLEFTBOTTOM + SURFACE"<<pairTmp.first->tag()<<"\n";
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            file2 << "NSET\tFRONTRIGHTBOTTOM = FRONTRIGHTBOTTOM + SURFACE"<<ToReplaceFace->tag()<<"\n";
-            file2 << "NSET\tBACKLEFTTOP = BACKLEFTTOP + SURFACE"<<pairTmp.first->tag()<<"\n";
-          }
-        }else if (abs((p1.y()-p2.y()-1.0))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            file2 << "NSET\tFRONTLEFT = FRONTLEFT + SURFACE"<<ToReplaceFace->tag()<<"\n";
-            file2 << "NSET\tBACKRIGHT = BACKRIGHT + SURFACE"<<pairTmp.first->tag()<<"\n";
-          }else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-            file2 << "NSET\tFRONTLEFTTOP = FRONTLEFTTOP + SURFACE"<<ToReplaceFace->tag()<<"\n";
-            file2 << "NSET\tBACKRIGHTBOTTOM = BACKRIGHTBOTTOM + SURFACE"<<pairTmp.first->tag()<<"\n";
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            file2 << "NSET\tFRONTLEFTBOTTOM = FRONTLEFTBOTTOM + SURFACE"<<ToReplaceFace->tag()<<"\n";
-            file2 << "NSET\tBACKRIGHTTOP = BACKRIGHTTOP + SURFACE"<<pairTmp.first->tag()<<"\n";
-          }
-        }
-      }else if (abs((p1.x()-p2.x()-1.0))<0.0001){
-        if (abs((p2.y()-p1.y()))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            file2 << "NSET\tFRONT = FRONT + SURFACE"<<pairTmp.first->tag()<<"\n";
-            file2 << "NSET\tBACK = BACK + SURFACE"<<ToReplaceFace->tag()<<"\n";
-          }else if(abs((p2.z()-p1.z()-1.0))<0.0001){
-            file2 << "NSET\tFRONTBOTTOM = FRONTBOTTOM + SURFACE"<<pairTmp.first->tag()<<"\n";
-            file2 << "NSET\tBACKTOP = BACKTOP + SURFACE"<<ToReplaceFace->tag()<<"\n";
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            file2 << "NSET\tFRONTTOP = FRONTTOP + SURFACE"<<pairTmp.first->tag()<<"\n";
-            file2 << "NSET\tBACKBOTTOM = BACKBOTTOM + SURFACE"<<ToReplaceFace->tag()<<"\n";
-          }
-        }else if (abs((p2.y()-p1.y()-1.0))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            file2 << "NSET\tFRONTLEFT = FRONTLEFT + SURFACE"<<pairTmp.first->tag()<<"\n";
-            file2 << "NSET\tBACKRIGHT = BACKRIGHT + SURFACE"<<ToReplaceFace->tag()<<"\n";
-          }else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-            file2 << "NSET\tFRONTLEFTBOTTOM = FRONTLEFTBOTTOM + SURFACE"<<pairTmp.first->tag()<<"\n";
-            file2 << "NSET\tBACKRIGHTTOP = BACKRIGHTTOP + SURFACE"<<ToReplaceFace->tag()<<"\n";
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            file2 << "NSET\tFRONTLEFTTOP = FRONTLEFTTOP + SURFACE"<<pairTmp.first->tag()<<"\n";
-            file2 << "NSET\tBACKRIGHTBOTTOM = BACKRIGHTBOTTOM + SURFACE"<<ToReplaceFace->tag()<<"\n";
-          }
-        }else if (abs((p1.y()-p2.y()-1.0))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            file2 << "NSET\tFRONTRIGHT = FRONTRIGHT + SURFACE"<<pairTmp.first->tag()<<"\n";
-            file2 << "NSET\tBACKLEFT = BACKLEFT + SURFACE"<<ToReplaceFace->tag()<<"\n";
-          }else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-            file2 << "NSET\tFRONTRIGHTBOTTOM = FRONTRIGHTBOTTOM + SURFACE"<<pairTmp.first->tag()<<"\n";
-            file2 << "NSET\tBACKLEFTTOP = BACKLEFTTOP + SURFACE"<<ToReplaceFace->tag()<<"\n";
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            file2 << "NSET\tFRONTRIGHTTOP = FRONTRIGHTTOP + SURFACE"<<pairTmp.first->tag()<<"\n";
-            file2 << "NSET\tBACKLEFTBOTTOM = BACKLEFTBOTTOM + SURFACE"<<ToReplaceFace->tag()<<"\n";
-          }
-        }
-      }else if (abs((p1.x()-p2.x()))<0.0001){
-        if (abs((p2.y()-p1.y()-1.0))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            file2 << "NSET\tRIGHT = RIGHT + SURFACE"<<ToReplaceFace->tag()<<"\n";
-            file2 << "NSET\tLEFT = LEFT + SURFACE"<<pairTmp.first->tag()<<"\n";
-          }else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-            file2 << "NSET\tRIGHTTOP = RIGHTTOP + SURFACE"<<ToReplaceFace->tag()<<"\n";
-            file2 << "NSET\tLEFTBOTTOM = LEFTBOTTOM + SURFACE"<<pairTmp.first->tag()<<"\n";
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            file2 << "NSET\tRIGHTBOTTOM = RIGHTBOTTOM + SURFACE"<<ToReplaceFace->tag()<<"\n";
-            file2 << "NSET\tLEFTTOP = LEFTTOP + SURFACE"<<pairTmp.first->tag()<<"\n";
-          }
-        }else if (abs((p1.y()-p2.y()-1.0))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            file2 << "NSET\tRIGHT = RIGHT + SURFACE"<<pairTmp.first->tag()<<"\n";
-            file2 << "NSET\tLEFT = LEFT + SURFACE"<<ToReplaceFace->tag()<<"\n";
-          }else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-            file2 << "NSET\tRIGHTBOTTOM = RIGHTBOTTOM + SURFACE"<<pairTmp.first->tag()<<"\n";
-            file2 << "NSET\tLEFTTOP = LEFTTOP + SURFACE"<<ToReplaceFace->tag()<<"\n";
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            file2 << "NSET\tRIGHTTOP = RIGHTTOP + SURFACE"<<pairTmp.first->tag()<<"\n";
-            file2 << "NSET\tLEFTBOTTOM = LEFTBOTTOM + SURFACE"<<ToReplaceFace->tag()<<"\n";
-          }
-        }else if (abs((p1.y()-p2.y()))<0.0001){
-          if (abs((p2.z()-p1.z()-1.0))<0.0001){
-            file2 << "NSET\tTOP = TOP + SURFACE"<<ToReplaceFace->tag()<<"\n";
-            file2 << "NSET\tBOTTOM = BOTTOM + SURFACE"<<pairTmp.first->tag()<<"\n";
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            file2 << "NSET\tTOP = TOP + SURFACE"<<pairTmp.first->tag()<<"\n";
-            file2 << "NSET\tBOTTOM = BOTTOM + SURFACE"<<ToReplaceFace->tag()<<"\n";
-          }
-        }
-      }
-      //			count++;
-
-
-
-
-
-
-
-      newPairs.push_back(std::make_pair(pairTmp.first,associatedFace));
-    }
-  }
-  //	for (std::vector<std::pair<GFace*,GFace*> >::iterator itP = newPairs.begin();itP != newPairs.end();itP++){
-  //		std::pair<GFace*,GFace*> pairTmp = (*itP);
-  //	}
-
-  std::cout<<"End of DuplicateBoundaries"<<std::endl;
-  return view;
-}
-
-
-
-
-
-PView *GMSH_DuplicateBoundariesPlugin::execute(PView *view)
-{
-  GModel *m = GModel::current();
-  if (m->getDim() == 3){
-    view = GMSH_DuplicateBoundariesPlugin::executeDuplicate(view);
-  }
-  else if (m->getDim() == 2){
-    view = GMSH_DuplicateBoundariesPlugin::execute2DWithBound(view);
-  }
-  //view = GMSH_DuplicateBoundariesPlugin::ComputeBestSeeds(view);
-  //view = GMSH_DuplicateBoundariesPlugin::execute2D(view);
-  //view = GMSH_DuplicateBoundariesPlugin::execute2DWithBound(view);
-  return view;
-}
-
-
-
-PView *GMSH_DuplicateBoundariesPlugin::executeDuplicate(PView *view)
-{
-  std::cout<<"starting DuplicateBoundaries"<<std::endl;
-  GModel *m = GModel::current();
-  m->setFactory("geo");
-  std::set<GFace*> ToDuplicateList;
-  ToDuplicateList.clear();
-  std::set<GFace*> ToDuplicateListBoundary;
-  ToDuplicateListBoundary.clear();
-  std::vector<GFace*> facesBound;
-  facesBound.clear();
-  std::map<GFace*,SPoint3> centers;
-  std::vector<std::pair<GFace*,GFace*> > pairs;
-  std::vector<std::pair<GFace*,GFace*> > newPairs;
-  int PhysicalInterface = m->setPhysicalName("Interface",3);
-  for (GModel::fiter itf= m->firstFace();itf != m->lastFace();itf++){
-    GFace* fTmp = (*itf);
-    if (fTmp->numRegions() == 2){
-      ToDuplicateList.insert(fTmp);
-    }
-    else{
-      //			ToDuplicateListBoundary.insert(fTmp);
-      facesBound.push_back(fTmp);
-    }
-  }
-
-
-
-
-
-
-
-
-  for(unsigned int i=0;i<facesBound.size();i++){
-    double x = 0.0;
-    double y = 0.0;
-    double z = 0.0;
-
-    std::list<GVertex*> vertices;
-
-    vertices = facesBound[i]->vertices();
-
-    for(std::list<GVertex*>::iterator it2=vertices.begin();it2!=vertices.end();it2++){
-      x = x + (*it2)->x();
-      y = y + (*it2)->y();
-      z = z + (*it2)->z();
-    }
-
-    x = x/vertices.size();
-    y = y/vertices.size();
-    z = z/vertices.size();
-
-    centers.insert(std::pair<GFace*,SPoint3>(facesBound[i],SPoint3(x,y,z)));
-  }
-
-  for(unsigned int i=0;i<facesBound.size();i++){
-    for(unsigned int j=0;j<facesBound.size();j++){
-      std::map<GFace*,SPoint3>::iterator it3 = centers.find(facesBound[i]);
-      std::map<GFace*,SPoint3>::iterator it4 = centers.find(facesBound[j]);
-
-      SPoint3 p1 = it3->second;
-      SPoint3 p2 = it4->second;
-
-
-      //				categories.push_back(val);
-
-      //				print_segment(p1,p2,file);
-
-      if (abs((p2.x()-p1.x()-1.0))<0.0001){
-        if (abs((p2.y()-p1.y()))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }else if(abs((p2.z()-p1.z()-1.0))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }
-        }else if (abs((p2.y()-p1.y()-1.0))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }
-        }else if (abs((p1.y()-p2.y()-1.0))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }
-        }
-      }else if (abs((p1.x()-p2.x()-1.0))<0.0001){
-        if (abs((p2.y()-p1.y()))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            //NOTHING
-          }else if(abs((p2.z()-p1.z()-1.0))<0.0001){
-            //NOTHING
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            //NOTHING
-          }
-        }else if (abs((p2.y()-p1.y()-1.0))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            //NOTHING
-          }else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-            //NOTHING
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            //NOTHING
-          }
-        }else if (abs((p1.y()-p2.y()-1.0))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            //NOTHING
-          }else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-            //NOTHING
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            //NOTHING
-          }
-        }
-      }else if (abs((p1.x()-p2.x()))<0.0001){
-        if (abs((p2.y()-p1.y()-1.0))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }
-        }else if (abs((p1.y()-p2.y()-1.0))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            //NOTHING
-          }else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-            //NOTHING
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            //NOTHING
-          }
-        }else if (abs((p1.y()-p2.y()))<0.0001){
-          if (abs((p2.z()-p1.z()-1.0))<0.0001){
-            pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
-            ToDuplicateListBoundary.insert(facesBound[i]);
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            //NOTHING
-          }
-        }
-      }
-    }
-  }
-
-
-
-
-
-
-
-
-
-
-  std::map<std::pair<MVertex*,GRegion*>,MVertex* > VertexGlobalAssociation;
-  std::map<std::pair<GVertex*,GRegion*>,GVertex* > GVertexGlobalAssociation;
-  std::map<std::pair<GEdge*,GRegion*>,GEdge* > GEdgeGlobalAssociation;
-  std::map<std::pair<GFace*,GRegion*>,GFace* > GFaceGlobalAssociation;
-  //	for (GModel::viter itv= m->firstVertex();itv != m->lastVertex();itv++){
-  //		GVertex* vTmp = (*itv);
-  //		std::vector<GVertex* > vecTmp;
-  //		vecTmp.clear();
-  //		GVertexGlobalAssociation[vTmp] = vecTmp;
-  //		for (int i = 0; i < vTmp->mesh_vertices.size();i++){
-  //			MVertex *vMesh = vTmp->mesh_vertices[i];
-  //			std::vector<MVertex* > vecTmpBis;
-  //			vecTmpBis.clear();
-  //			VertexGlobalAssociation[vMesh] = vecTmpBis;
-  //		}
-  //	}
-  //	for (GModel::eiter ite= m->firstEdge();ite != m->lastEdge();ite++){
-  //		GEdge* eTmp = (*ite);
-  //		std::vector<GEdge* > vecTmp;
-  //		vecTmp.clear();
-  //		GEdgeGlobalAssociation[eTmp] = vecTmp;
-  //		for (int i = 0; i < eTmp->mesh_vertices.size();i++){
-  //			MVertex *vMesh = eTmp->mesh_vertices[i];
-  //			std::vector<MVertex* > vecTmpBis;
-  //			vecTmpBis.clear();
-  //			VertexGlobalAssociation[vMesh] = vecTmpBis;
-  //		}
-  //	}
-  //	for (GModel::fiter itf= m->firstFace();itf != m->lastFace();itf++){
-  //		GFace* fTmp = (*itf);
-  //		for (int i = 0; i < fTmp->mesh_vertices.size();i++){
-  //			MVertex *vMesh = fTmp->mesh_vertices[i];
-  //			std::vector<MVertex* > vecTmpBis;
-  //			vecTmpBis.clear();
-  //			VertexGlobalAssociation[vMesh] = vecTmpBis;
-  //		}
-  //	}
-  //	for (GModel::riter itr= m->firstRegion();itr != m->lastRegion();itr++){
-  //		GRegion* rTmp = (*itr);
-  //		for (int i = 0; i < rTmp->mesh_vertices.size();i++){
-  //			MVertex *vMesh = rTmp->mesh_vertices[i];
-  //			std::vector<MVertex* > vecTmpBis;
-  //			vecTmpBis.clear();
-  //			VertexGlobalAssociation[vMesh] = vecTmpBis;
-  //		}
-  //	}
-  for (GModel::riter itr= m->firstRegion();itr != m->lastRegion();itr++){
-    GRegion* rTmp = (*itr);
-    std::list<GFace*> RegFaces = rTmp->faces();
-    std::map<MVertex*,MVertex* > VertexAssociation;
-    std::map<GVertex*,GVertex* > GVertexAssociation;
-    std::map<GEdge*,GEdge* > GEdgeAssociation;
-    //int counterNbDone = 10000;
-    double xCenterReg = 0.0;
-    double yCenterReg = 0.0;
-    double zCenterReg = 0.0;
-    int counterPts = 0;
-    for(std::list<GFace*>::iterator it2=RegFaces.begin();it2!=RegFaces.end();it2++){
-      GFace* fTemp = (*it2);
-      std::list<GVertex*> verticesFace = fTemp->vertices();
-      for (std::list<GVertex*>::iterator it3=verticesFace.begin();it3!=verticesFace.end();it3++){
-        xCenterReg = xCenterReg + (*it3)->x();
-        yCenterReg = yCenterReg + (*it3)->y();
-        zCenterReg = zCenterReg + (*it3)->z();
-        counterPts++;
-      }
-    }
-    xCenterReg = xCenterReg/counterPts;
-    yCenterReg = yCenterReg/counterPts;
-    zCenterReg = zCenterReg/counterPts;
-    //duplication noeud et aretes au niveau de la region directement
-    std::list<GVertex*> vlist;
-
-
-    std::list<GFace*> listFacesTmp = rTmp->faces();
-    for (std::list<GFace*>::iterator itTp = listFacesTmp.begin();itTp != listFacesTmp.end();itTp++){
-      std::list<GVertex*> vlist2;
-      vlist2 = (*itTp)->vertices();
-      for (std::list<GVertex*>::iterator itTp2 = vlist2.begin();itTp2 != vlist2.end();itTp2++){
-        if(std::find(vlist.begin(), vlist.end(), *itTp2) == vlist.end())
-          vlist.push_back(*itTp2);
-      }
-    }
-
-
-    for (std::list<GVertex*>::iterator itv = vlist.begin();itv != vlist.end();itv++){
-      //duplication Gvertex
-      GVertex* vTmp = (*itv);
-      double ponderatedX = 0.99999999999 * vTmp->x() + 0.00000000001 * xCenterReg;
-      double ponderatedY = 0.99999999999 * vTmp->y() + 0.00000000001 * yCenterReg;
-      double ponderatedZ = 0.99999999999 * vTmp->z() + 0.00000000001 * zCenterReg;
-      GVertex* newv = m->addVertex(ponderatedX,ponderatedY,ponderatedZ,vTmp->prescribedMeshSizeAtVertex());
-      GVertexAssociation[vTmp] = newv;
-      GVertexGlobalAssociation[std::make_pair(vTmp,rTmp)] = newv;
-      //creation des Gedge correspondantes
-      //			GEdge* newE = m->addLine(vTmp,newv);
-      //			SurroudingEdges[vTmp] = newE;
-      //maintenant traitement mesh
-      MVertex *vMesh = vTmp->mesh_vertices[0];
-      MVertex *newMv = new MVertex(vMesh->x(), vMesh->y(), vMesh->z(), (GEntity*)newv);
-      VertexAssociation[vMesh] = newMv;
-      VertexGlobalAssociation[std::make_pair(vMesh,rTmp)] = newMv;
-      newv->addMeshVertex(newMv);
-    }
-    //maintenant on soccupe de duppliquer les edges de la region
-    std::list<GEdge*> elist = rTmp->edges();
-
-    std::vector<GFace*> SurroundingsFaces;
-    for (std::list<GEdge*>::iterator ite = elist.begin();ite != elist.end();ite++){
-      //duplication Gedge
-      GEdge* eTmp = (*ite);
-      GEdge* newE = m->addLine(GVertexAssociation[eTmp->getEndVertex()],GVertexAssociation[eTmp->getBeginVertex()]);
-      GEdgeAssociation[eTmp] = newE;
-      GEdgeGlobalAssociation[std::make_pair(eTmp,rTmp)] = newE;
-      //creation des GFace correspondantes
-      //			GEdge* firstE = SurroudingEdges.find(eTmp->getEndVertex())->second;
-      //			GEdge* lastE = SurroudingEdges.find(eTmp->getBeginVertex())->second;
-      //			std::vector<GEdge*> VecEdgesTmp;
-      //			VecEdgesTmp.push_back(eTmp);
-      //			VecEdgesTmp.push_back(firstE);
-      //			VecEdgesTmp.push_back(newE);
-      //			VecEdgesTmp.push_back(lastE);
-      //			std::vector<std::vector<GEdge*> > VecOfVecTmp;
-      //			VecOfVecTmp.push_back(VecEdgesTmp);
-      //			GFace* newFaceTmp = m->addPlanarFace(VecOfVecTmp);
-      //			SurroundingsFaces.push_back(newFaceTmp);
-      //maintenant traitement mesh
-      for (unsigned int i = 0; i < eTmp->mesh_vertices.size();i++){
-        MVertex *vMesh = eTmp->mesh_vertices[i];
-        MVertex *newMv = new MVertex(vMesh->x(), vMesh->y(), vMesh->z(), (GEntity*)newE);
-        VertexAssociation[vMesh] = newMv;
-        VertexGlobalAssociation[std::make_pair(vMesh,rTmp)] = newMv;
-        newE->addMeshVertex(newMv);
-      }
-      for (unsigned int i = 0; i < eTmp->getNumMeshElements();i++){
-        MElement* elem = eTmp->getMeshElement(i);
-        MVertex *firstETmp = VertexAssociation.find(elem->getVertex(0))->second;
-        MVertex *lastETmp = VertexAssociation.find(elem->getVertex(1))->second;
-        MVertex *midETmp = VertexAssociation.find(elem->getVertex(2))->second;
-        MLine3 *newLine = new MLine3(firstETmp,lastETmp,midETmp);
-        newE->addLine(newLine);
-      }
-    }
-    for (std::list<GFace*>::iterator itf = RegFaces.begin();itf != RegFaces.end();itf++){
-      GFace* fTmp = (*itf);
-      std::vector<GEdge*> newEdgesVector;
-      std::list<GEdge*> elistFace = fTmp->edges();
-      for (std::list<GEdge*>::iterator ite = elistFace.begin();ite != elistFace.end();ite++){
-        GEdge* eTmp = (*ite);
-        GEdge* eToFind = GEdgeAssociation[eTmp];
-        newEdgesVector.push_back(eToFind);
-      }
-      std::vector<std::vector<GEdge*> > VecOfVec;
-      VecOfVec.push_back(newEdgesVector);
-      //creation de la nouvelle face
-      GFace* GFaceAssociation = m->addPlanarFace(VecOfVec);
-      //			int tagTmp = GFaceAssociation->tag();
-      //			std::ostringstream ss;
-      //			ss << tagTmp;
-      ////			char *intStr = itoa(tagTmp);
-      //			std::string nameSurf = "SURFACE";
-      ////			nameSurf += std::string(intStr);
-      //			nameSurf += ss.str();
-      //			int PhysicalSurfaceTmp = m->setPhysicalName(nameSurf,2);
-      //			GFaceAssociation->addPhysicalEntity(PhysicalSurfaceTmp);
-      //maintenant traitement mesh
-      for (unsigned int i = 0; i < fTmp->mesh_vertices.size();i++){
-        MVertex *vMesh = fTmp->mesh_vertices[i];
-        MVertex *newMv = new MVertex(vMesh->x(), vMesh->y(), vMesh->z(), (GEntity*)GFaceAssociation);
-        VertexAssociation[vMesh] = newMv;
-        VertexGlobalAssociation[std::make_pair(vMesh,rTmp)] = newMv;
-        GFaceAssociation->addMeshVertex(newMv);
-      }
-      for (unsigned int i = 0; i < fTmp->getNumMeshElements();i++){
-        MElement* elem = fTmp->getMeshElement(i);
-        MVertex *firstE = VertexAssociation.find(elem->getVertex(0))->second;
-        MVertex *secondE = VertexAssociation.find(elem->getVertex(1))->second;
-        MVertex *thirdE = VertexAssociation.find(elem->getVertex(2))->second;
-        MVertex *fourthE = VertexAssociation.find(elem->getVertex(3))->second;
-        MVertex *fifthE = VertexAssociation.find(elem->getVertex(4))->second;
-        MVertex *sisthE = VertexAssociation.find(elem->getVertex(5))->second;
-        MTriangle6 *newTri = new MTriangle6(firstE,secondE,thirdE,fourthE,fifthE,sisthE);
-        GFaceAssociation->addTriangle(newTri);
-      }
-      GFaceGlobalAssociation[std::make_pair(fTmp,rTmp)] = GFaceAssociation;
-    }
-  }
-  int counterNbDone = 10000;
-  //maintenant on va traiter les faces initiales
-  for (std::set<GFace*>::iterator itf = ToDuplicateList.begin();itf != ToDuplicateList.end();itf++){
-    counterNbDone++;
-    GFace* fTmp = (*itf);
-    GRegion* reg1 = fTmp->getRegion(0);
-    GRegion* reg2 = fTmp->getRegion(1);
-    //pour commencer on cree des aretes entre les vertex
-    std::list<GVertex*> vlist = fTmp->vertices();
-    std::map<GVertex*,GEdge* > SurroudingEdges;
-    for (std::list<GVertex*>::iterator itv = vlist.begin();itv != vlist.end();itv++){
-      GVertex* vTmp = (*itv);
-      GVertex* v1=0;
-      GVertex* v2=0;
-      std::map<std::pair<GVertex*,GRegion*>,GVertex* >::iterator itMap = GVertexGlobalAssociation.find(std::make_pair(vTmp,reg1));
-      if (itMap != GVertexGlobalAssociation.end()){
-        v1 = itMap->second;
-      }
-      itMap = GVertexGlobalAssociation.find(std::make_pair(vTmp,reg2));
-      if (itMap != GVertexGlobalAssociation.end()){
-        v2 = itMap->second;
-      }
-      GEdge* newE = m->addLine(v1,v2);
-      SurroudingEdges[vTmp] = newE;
-    }
-    //ici tous les vertex sont traites
-    //on va traiter les edges
-    std::list<GEdge*> elist = fTmp->edges();
-    std::vector<GEdge*> newEdgesVector;
-    std::vector<GFace*> SurroundingsFaces;
-    for (std::list<GEdge*>::iterator ite = elist.begin();ite != elist.end();ite++){
-      //duplication Gedge
-      GEdge* eTmp = (*ite);
-      GEdge* e1=0;
-      GEdge* e2=0;
-      std::map<std::pair<GEdge*,GRegion*>,GEdge* >::iterator itMap = GEdgeGlobalAssociation.find(std::make_pair(eTmp,reg1));
-      if (itMap != GEdgeGlobalAssociation.end()){
-        e1 = itMap->second;
-      }
-      itMap = GEdgeGlobalAssociation.find(std::make_pair(eTmp,reg2));
-      if (itMap != GEdgeGlobalAssociation.end()){
-        e2 = itMap->second;
-      }
-      //creation des GFace correspondantes
-      GEdge* firstE = SurroudingEdges.find(eTmp->getBeginVertex())->second;
-      GEdge* lastE = SurroudingEdges.find(eTmp->getEndVertex())->second;
-      if (firstE->getBeginVertex() != e1->getEndVertex()){
-        firstE->reverse();
-      }
-      if (firstE->getBeginVertex() != e1->getEndVertex()){
-        e1->reverse();
-      }
-      if (firstE->getBeginVertex() != e1->getEndVertex()){
-        firstE->reverse();
-      }
-      if (e2->getBeginVertex() != firstE->getEndVertex()){
-        e2->reverse();
-      }
-      if (lastE->getBeginVertex() != e2->getEndVertex()){
-        lastE->reverse();
-      }
-      std::vector<GEdge*> VecEdgesTmp;
-      VecEdgesTmp.push_back(e1);
-      VecEdgesTmp.push_back(firstE);
-      VecEdgesTmp.push_back(e2);
-      VecEdgesTmp.push_back(lastE);
-      std::vector<std::vector<GEdge*> > VecOfVecTmp;
-      VecOfVecTmp.push_back(VecEdgesTmp);
-      GFace* newFaceTmp = m->addPlanarFace(VecOfVecTmp);
-      SurroundingsFaces.push_back(newFaceTmp);
-    }
-    std::vector<GFace*> VectorFaces;
-    std::list<GFace*> listFaces;
-    GFace* f1;
-    GFace* f2;
-    std::map<std::pair<GFace*,GRegion*>,GFace* >::iterator itMap = GFaceGlobalAssociation.find(std::make_pair(fTmp,reg1));
-    if (itMap != GFaceGlobalAssociation.end()){
-      f1 = itMap->second;
-    }
-    itMap = GFaceGlobalAssociation.find(std::make_pair(fTmp,reg2));
-    if (itMap != GFaceGlobalAssociation.end()){
-      f2 = itMap->second;
-    }
-    VectorFaces.push_back(f1);
-    listFaces.push_back(f1);
-    for (unsigned int i = 0;i < SurroundingsFaces.size();i++){
-      VectorFaces.push_back(SurroundingsFaces[i]);
-      listFaces.push_back(SurroundingsFaces[i]);
-    }
-    VectorFaces.push_back(f2);
-    listFaces.push_back(f2);
-    std::vector<std::vector<GFace*> > VecOfVecGFace;
-    VecOfVecGFace.push_back(VectorFaces);
-    //creation de la nouvelle region
-    GRegion* createdRegion = new GRegion(m,counterNbDone);
-    createdRegion->addPhysicalEntity(PhysicalInterface);
-    createdRegion->set(listFaces);
-    m->add(createdRegion);
-    for (unsigned int i = 0; i < fTmp->getNumMeshElements();i++){
-      MElement* elem = fTmp->getMeshElement(i);
-      MVertex* v1=0;
-      MVertex* v2=0;
-      MVertex* v3=0;
-      MVertex* v4=0;
-      MVertex* v5=0;
-      MVertex* v6=0;
-      std::map<std::pair<MVertex*,GRegion*>,MVertex* >::iterator itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(0),reg1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v1 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(3),reg1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v2 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(5),reg1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v3 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(0),reg2));
-      if (itMap != VertexGlobalAssociation.end()){
-        v4 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(3),reg2));
-      if (itMap != VertexGlobalAssociation.end()){
-        v5 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(5),reg2));
-      if (itMap != VertexGlobalAssociation.end()){
-        v6 = itMap->second;
-      }
-      MPrism *newPri = new MPrism(v1,v3,v2,v4,v6,v5);
-
-      createdRegion->addPrism(newPri);
-
-      //second
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(1),reg1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v1 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(4),reg1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v2 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(3),reg1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v3 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(1),reg2));
-      if (itMap != VertexGlobalAssociation.end()){
-        v4 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(4),reg2));
-      if (itMap != VertexGlobalAssociation.end()){
-        v5 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(3),reg2));
-      if (itMap != VertexGlobalAssociation.end()){
-        v6 = itMap->second;
-      }
-      MPrism *newPri2 = new MPrism(v1,v3,v2,v4,v6,v5);
-
-      createdRegion->addPrism(newPri2);
-      //third
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(2),reg1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v1 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(5),reg1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v2 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(4),reg1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v3 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(2),reg2));
-      if (itMap != VertexGlobalAssociation.end()){
-        v4 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(5),reg2));
-      if (itMap != VertexGlobalAssociation.end()){
-        v5 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(4),reg2));
-      if (itMap != VertexGlobalAssociation.end()){
-        v6 = itMap->second;
-      }
-      MPrism *newPri3 = new MPrism(v1,v3,v2,v4,v6,v5);
-
-      createdRegion->addPrism(newPri3);
-      //fourth
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(3),reg1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v1 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(4),reg1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v2 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(5),reg1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v3 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(3),reg2));
-      if (itMap != VertexGlobalAssociation.end()){
-        v4 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(4),reg2));
-      if (itMap != VertexGlobalAssociation.end()){
-        v5 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(5),reg2));
-      if (itMap != VertexGlobalAssociation.end()){
-        v6 = itMap->second;
-      }
-      MPrism *newPri4 = new MPrism(v1,v3,v2,v4,v6,v5);
-
-      createdRegion->addPrism(newPri4);
-    }
-    for (unsigned int i = 0; i < reg1->getNumMeshElements();i++){
-      MElement* elem = reg1->getMeshElement(i);
-      for (int j = 0;j < elem->getNumVertices();j++){
-        MVertex* vert = elem->getVertex(j);
-        std::map<std::pair<MVertex*,GRegion*>,MVertex* >::iterator itMap = VertexGlobalAssociation.find(std::make_pair(vert,reg1));
-        if (itMap != VertexGlobalAssociation.end()){
-          elem->setVertex(j,itMap->second);
-        }
-      }
-    }
-    for (unsigned int i = 0; i < reg2->getNumMeshElements();i++){
-      MElement* elem = reg2->getMeshElement(i);
-      for (int j = 0;j < elem->getNumVertices();j++){
-        MVertex* vert = elem->getVertex(j);
-        std::map<std::pair<MVertex*,GRegion*>,MVertex* >::iterator itMap = VertexGlobalAssociation.find(std::make_pair(vert,reg2));
-        if (itMap != VertexGlobalAssociation.end()){
-          elem->setVertex(j,itMap->second);
-        }
-      }
-    }
-  }
-  //maintenant on va traiter les faces du bord
-  for (std::set<GFace*>::iterator itf = ToDuplicateListBoundary.begin();itf != ToDuplicateListBoundary.end();itf++){
-    counterNbDone++;
-    GFace* fTmp = (*itf);
-    GRegion* reg1 = fTmp->getRegion(0);
-    //pour commencer on cree des aretes entre les vertex
-    std::list<GVertex*> vlist = fTmp->vertices();
-    std::map<GVertex*,GEdge* > SurroudingEdges;
-    for (std::list<GVertex*>::iterator itv = vlist.begin();itv != vlist.end();itv++){
-      GVertex* vTmp = (*itv);
-      GVertex* v1=0;
-      std::map<std::pair<GVertex*,GRegion*>,GVertex* >::iterator itMap = GVertexGlobalAssociation.find(std::make_pair(vTmp,reg1));
-      if (itMap != GVertexGlobalAssociation.end()){
-        v1 = itMap->second;
-      }
-      GEdge* newE = m->addLine(v1,vTmp);
-      SurroudingEdges[vTmp] = newE;
-    }
-    //ici tous les vertex sont traites
-    //on va traiter les edges
-    std::list<GEdge*> elist = fTmp->edges();
-    std::vector<GEdge*> newEdgesVector;
-    std::vector<GFace*> SurroundingsFaces;
-    for (std::list<GEdge*>::iterator ite = elist.begin();ite != elist.end();ite++){
-      //duplication Gedge
-      GEdge* eTmp = (*ite);
-      GEdge* e1=0;
-      std::map<std::pair<GEdge*,GRegion*>,GEdge* >::iterator itMap = GEdgeGlobalAssociation.find(std::make_pair(eTmp,reg1));
-      if (itMap != GEdgeGlobalAssociation.end()){
-        e1 = itMap->second;
-      }
-      //creation des GFace correspondantes
-      GEdge* firstE = SurroudingEdges.find(eTmp->getBeginVertex())->second;
-      GEdge* lastE = SurroudingEdges.find(eTmp->getEndVertex())->second;
-      if (firstE->getBeginVertex() != e1->getEndVertex()){
-        firstE->reverse();
-      }
-      if (firstE->getBeginVertex() != e1->getEndVertex()){
-        e1->reverse();
-      }
-      if (firstE->getBeginVertex() != e1->getEndVertex()){
-        firstE->reverse();
-      }
-      if (eTmp->getBeginVertex() != firstE->getEndVertex()){
-        eTmp->reverse();
-      }
-      if (lastE->getBeginVertex() != eTmp->getEndVertex()){
-        lastE->reverse();
-      }
-      std::vector<GEdge*> VecEdgesTmp;
-      VecEdgesTmp.push_back(e1);
-      VecEdgesTmp.push_back(firstE);
-      VecEdgesTmp.push_back(eTmp);
-      VecEdgesTmp.push_back(lastE);
-      std::vector<std::vector<GEdge*> > VecOfVecTmp;
-      VecOfVecTmp.push_back(VecEdgesTmp);
-      GFace* newFaceTmp = m->addPlanarFace(VecOfVecTmp);
-      SurroundingsFaces.push_back(newFaceTmp);
-    }
-    std::vector<GFace*> VectorFaces;
-    std::list<GFace*> listFaces;
-    GFace* f1;
-    std::map<std::pair<GFace*,GRegion*>,GFace* >::iterator itMap = GFaceGlobalAssociation.find(std::make_pair(fTmp,reg1));
-    if (itMap != GFaceGlobalAssociation.end()){
-      f1 = itMap->second;
-    }
-    VectorFaces.push_back(f1);
-    listFaces.push_back(f1);
-    for (unsigned int i = 0;i < SurroundingsFaces.size();i++){
-      VectorFaces.push_back(SurroundingsFaces[i]);
-      listFaces.push_back(SurroundingsFaces[i]);
-    }
-    VectorFaces.push_back(fTmp);
-    listFaces.push_back(fTmp);
-    std::vector<std::vector<GFace*> > VecOfVecGFace;
-    VecOfVecGFace.push_back(VectorFaces);
-    //creation de la nouvelle region
-    GRegion* createdRegion = new GRegion(m,counterNbDone);
-    createdRegion->addPhysicalEntity(PhysicalInterface);
-    createdRegion->set(listFaces);
-    m->add(createdRegion);
-    for (unsigned int i = 0; i < fTmp->getNumMeshElements();i++){
-      MElement* elem = fTmp->getMeshElement(i);
-      MVertex* v1=0;
-      MVertex* v2=0;
-      MVertex* v3=0;
-      std::map<std::pair<MVertex*,GRegion*>,MVertex* >::iterator itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(0),reg1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v1 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(3),reg1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v2 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(5),reg1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v3 = itMap->second;
-      }
-      MPrism *newPri = new MPrism(v1,v3,v2,elem->getVertex(0),elem->getVertex(5),elem->getVertex(3));
-
-      createdRegion->addPrism(newPri);
-      //second
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(1),reg1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v1 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(4),reg1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v2 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(3),reg1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v3 = itMap->second;
-      }
-      MPrism *newPri2 = new MPrism(v1,v3,v2,elem->getVertex(1),elem->getVertex(3),elem->getVertex(4));
-
-      createdRegion->addPrism(newPri2);
-      //third
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(2),reg1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v1 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(5),reg1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v2 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(4),reg1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v3 = itMap->second;
-      }
-      MPrism *newPri3 = new MPrism(v1,v3,v2,elem->getVertex(2),elem->getVertex(4),elem->getVertex(5));
-
-      createdRegion->addPrism(newPri3);
-      //fourth
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(3),reg1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v1 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(4),reg1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v2 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(5),reg1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v3 = itMap->second;
-      }
-      MPrism *newPri4 = new MPrism(v1,v3,v2,elem->getVertex(3),elem->getVertex(5),elem->getVertex(4));
-
-      createdRegion->addPrism(newPri4);
-    }
-    for (unsigned int i = 0; i < reg1->getNumMeshElements();i++){
-      MElement* elem = reg1->getMeshElement(i);
-      for (int j = 0;j < elem->getNumVertices();j++){
-        MVertex* vert = elem->getVertex(j);
-        std::map<std::pair<MVertex*,GRegion*>,MVertex* >::iterator itMap = VertexGlobalAssociation.find(std::make_pair(vert,reg1));
-        if (itMap != VertexGlobalAssociation.end()){
-          elem->setVertex(j,itMap->second);
-        }
-      }
-    }
-  }
-  std::ofstream file("MicrostructurePolycrystal3D.pos");
-  file << "View \"test\" {\n";
-
-  std::ofstream file2("PERIODIC.map");
-  std::ofstream file3("SetAdd.map");
-  for (std::vector<std::pair<GFace*,GFace*> >::iterator itP = pairs.begin();itP != pairs.end();itP++){
-    std::pair<GFace*,GFace*> pairTmp = (*itP);
-    GFace* ToReplaceFace = pairTmp.second;
-    GRegion* rTmp = ToReplaceFace->getRegion(0);
-    std::map<std::pair<GFace*,GRegion*>,GFace* >::iterator itMap = GFaceGlobalAssociation.find(std::make_pair(ToReplaceFace,rTmp));
-    if (itMap != GFaceGlobalAssociation.end()){
-      GFace* associatedFace = (*itMap).second;
-
-
-
-
-
-      file3 <<associatedFace->tag()<<"\tSURFACE"<<associatedFace->tag()<<"\tNSET "<<"\n";
-
-      int tagTmp = associatedFace->tag();
-      std::ostringstream ss;
-      ss << tagTmp;
-      //			char *intStr = itoa(tagTmp);
-      std::string nameSurf = "SURFACE";
-      //			nameSurf += std::string(intStr);
-      nameSurf += ss.str();
-      int PhysicalSurfaceTmp = m->setPhysicalName(nameSurf,2);
-      associatedFace->addPhysicalEntity(PhysicalSurfaceTmp);
-
-      std::map<GFace*,SPoint3>::iterator it3 = centers.find(pairTmp.first);
-      std::map<GFace*,SPoint3>::iterator it4 = centers.find(ToReplaceFace);
-
-      SPoint3 p1 = it3->second;
-      SPoint3  p2 = it4->second;
-
-      //double delta_x = fabs(p2.x()-p1.x());
-      //double delta_y = fabs(p2.y()-p1.y());
-      //double delta_z = fabs(p2.z()-p1.z());
-
-
-      file << "SL ("
-           << p1.x() << ", " << p1.y() << ", " << p1.z() << ", "
-           << p2.x() << ", " << p2.y() << ", " << p2.z()
-           << "){10, 20};\n";
-
-      //file2 << "PERIODIC\tSURFACE"<<faces[i]->tag() << "\tSURFACE" << faces[j]->tag() << "\t" << p2.x()-p1.x() << "\t" << p2.y()-p1.y() << "\t" << p2.z()-p1.z() << "\n";
-      if (abs((p2.x()-p1.x()-1.0))<0.0001){
-        if (abs((p2.y()-p1.y()))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            file2 << "NSET\tFRONT = FRONT + SURFACE"<<associatedFace->tag()<<"\n";
-            file2 << "NSET\tBACK = BACK + SURFACE"<<pairTmp.first->tag()<<"\n";
-          }else if(abs((p2.z()-p1.z()-1.0))<0.0001){
-            file2 << "NSET\tFRONTTOP = FRONTTOP + SURFACE"<<associatedFace->tag()<<"\n";
-            file2 << "NSET\tBACKBOTTOM = BACKBOTTOM + SURFACE"<<pairTmp.first->tag()<<"\n";
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            file2 << "NSET\tFRONTBOTTOM = FRONTBOTTOM + SURFACE"<<associatedFace->tag()<<"\n";
-            file2 << "NSET\tBACKTOP = BACKTOP + SURFACE"<<pairTmp.first->tag()<<"\n";
-          }
-        }else if (abs((p2.y()-p1.y()-1.0))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            file2 << "NSET\tFRONTRIGHT = FRONTRIGHT + SURFACE"<<associatedFace->tag()<<"\n";
-            file2 << "NSET\tBACKLEFT = BACKLEFT + SURFACE"<<pairTmp.first->tag()<<"\n";
-          }else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-            file2 << "NSET\tFRONTRIGHTTOP = FRONTRIGHTTOP + SURFACE"<<associatedFace->tag()<<"\n";
-            file2 << "NSET\tBACKLEFTBOTTOM = BACKLEFTBOTTOM + SURFACE"<<pairTmp.first->tag()<<"\n";
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            file2 << "NSET\tFRONTRIGHTBOTTOM = FRONTRIGHTBOTTOM + SURFACE"<<associatedFace->tag()<<"\n";
-            file2 << "NSET\tBACKLEFTTOP = BACKLEFTTOP + SURFACE"<<pairTmp.first->tag()<<"\n";
-          }
-        }else if (abs((p1.y()-p2.y()-1.0))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            file2 << "NSET\tFRONTLEFT = FRONTLEFT + SURFACE"<<associatedFace->tag()<<"\n";
-            file2 << "NSET\tBACKRIGHT = BACKRIGHT + SURFACE"<<pairTmp.first->tag()<<"\n";
-          }else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-            file2 << "NSET\tFRONTLEFTTOP = FRONTLEFTTOP + SURFACE"<<associatedFace->tag()<<"\n";
-            file2 << "NSET\tBACKRIGHTBOTTOM = BACKRIGHTBOTTOM + SURFACE"<<pairTmp.first->tag()<<"\n";
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            file2 << "NSET\tFRONTLEFTBOTTOM = FRONTLEFTBOTTOM + SURFACE"<<associatedFace->tag()<<"\n";
-            file2 << "NSET\tBACKRIGHTTOP = BACKRIGHTTOP + SURFACE"<<pairTmp.first->tag()<<"\n";
-          }
-        }
-      }else if (abs((p1.x()-p2.x()-1.0))<0.0001){
-        if (abs((p2.y()-p1.y()))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            file2 << "NSET\tFRONT = FRONT + SURFACE"<<pairTmp.first->tag()<<"\n";
-            file2 << "NSET\tBACK = BACK + SURFACE"<<associatedFace->tag()<<"\n";
-          }else if(abs((p2.z()-p1.z()-1.0))<0.0001){
-            file2 << "NSET\tFRONTBOTTOM = FRONTBOTTOM + SURFACE"<<pairTmp.first->tag()<<"\n";
-            file2 << "NSET\tBACKTOP = BACKTOP + SURFACE"<<associatedFace->tag()<<"\n";
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            file2 << "NSET\tFRONTTOP = FRONTTOP + SURFACE"<<pairTmp.first->tag()<<"\n";
-            file2 << "NSET\tBACKBOTTOM = BACKBOTTOM + SURFACE"<<associatedFace->tag()<<"\n";
-          }
-        }else if (abs((p2.y()-p1.y()-1.0))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            file2 << "NSET\tFRONTLEFT = FRONTLEFT + SURFACE"<<pairTmp.first->tag()<<"\n";
-            file2 << "NSET\tBACKRIGHT = BACKRIGHT + SURFACE"<<associatedFace->tag()<<"\n";
-          }else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-            file2 << "NSET\tFRONTLEFTBOTTOM = FRONTLEFTBOTTOM + SURFACE"<<pairTmp.first->tag()<<"\n";
-            file2 << "NSET\tBACKRIGHTTOP = BACKRIGHTTOP + SURFACE"<<associatedFace->tag()<<"\n";
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            file2 << "NSET\tFRONTLEFTTOP = FRONTLEFTTOP + SURFACE"<<pairTmp.first->tag()<<"\n";
-            file2 << "NSET\tBACKRIGHTBOTTOM = BACKRIGHTBOTTOM + SURFACE"<<associatedFace->tag()<<"\n";
-          }
-        }else if (abs((p1.y()-p2.y()-1.0))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            file2 << "NSET\tFRONTRIGHT = FRONTRIGHT + SURFACE"<<pairTmp.first->tag()<<"\n";
-            file2 << "NSET\tBACKLEFT = BACKLEFT + SURFACE"<<associatedFace->tag()<<"\n";
-          }else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-            file2 << "NSET\tFRONTRIGHTBOTTOM = FRONTRIGHTBOTTOM + SURFACE"<<pairTmp.first->tag()<<"\n";
-            file2 << "NSET\tBACKLEFTTOP = BACKLEFTTOP + SURFACE"<<associatedFace->tag()<<"\n";
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            file2 << "NSET\tFRONTRIGHTTOP = FRONTRIGHTTOP + SURFACE"<<pairTmp.first->tag()<<"\n";
-            file2 << "NSET\tBACKLEFTBOTTOM = BACKLEFTBOTTOM + SURFACE"<<associatedFace->tag()<<"\n";
-          }
-        }
-      }else if (abs((p1.x()-p2.x()))<0.0001){
-        if (abs((p2.y()-p1.y()-1.0))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            file2 << "NSET\tRIGHT = RIGHT + SURFACE"<<associatedFace->tag()<<"\n";
-            file2 << "NSET\tLEFT = LEFT + SURFACE"<<pairTmp.first->tag()<<"\n";
-          }else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-            file2 << "NSET\tRIGHTTOP = RIGHTTOP + SURFACE"<<associatedFace->tag()<<"\n";
-            file2 << "NSET\tLEFTBOTTOM = LEFTBOTTOM + SURFACE"<<pairTmp.first->tag()<<"\n";
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            file2 << "NSET\tRIGHTBOTTOM = RIGHTBOTTOM + SURFACE"<<associatedFace->tag()<<"\n";
-            file2 << "NSET\tLEFTTOP = LEFTTOP + SURFACE"<<pairTmp.first->tag()<<"\n";
-          }
-        }else if (abs((p1.y()-p2.y()-1.0))<0.0001){
-          if (abs((p2.z()-p1.z()))<0.0001){
-            file2 << "NSET\tRIGHT = RIGHT + SURFACE"<<pairTmp.first->tag()<<"\n";
-            file2 << "NSET\tLEFT = LEFT + SURFACE"<<associatedFace->tag()<<"\n";
-          }else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-            file2 << "NSET\tRIGHTBOTTOM = RIGHTBOTTOM + SURFACE"<<pairTmp.first->tag()<<"\n";
-            file2 << "NSET\tLEFTTOP = LEFTTOP + SURFACE"<<associatedFace->tag()<<"\n";
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            file2 << "NSET\tRIGHTTOP = RIGHTTOP + SURFACE"<<pairTmp.first->tag()<<"\n";
-            file2 << "NSET\tLEFTBOTTOM = LEFTBOTTOM + SURFACE"<<associatedFace->tag()<<"\n";
-          }
-        }else if (abs((p1.y()-p2.y()))<0.0001){
-          if (abs((p2.z()-p1.z()-1.0))<0.0001){
-            file2 << "NSET\tTOP = TOP + SURFACE"<<associatedFace->tag()<<"\n";
-            file2 << "NSET\tBOTTOM = BOTTOM + SURFACE"<<pairTmp.first->tag()<<"\n";
-          }else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-            file2 << "NSET\tTOP = TOP + SURFACE"<<pairTmp.first->tag()<<"\n";
-            file2 << "NSET\tBOTTOM = BOTTOM + SURFACE"<<associatedFace->tag()<<"\n";
-          }
-        }
-      }
-      //			count++;
-
-
-
-
-
-
-
-      newPairs.push_back(std::make_pair(pairTmp.first,associatedFace));
-    }
-  }
-  //	for (std::vector<std::pair<GFace*,GFace*> >::iterator itP = newPairs.begin();itP != newPairs.end();itP++){
-  //		std::pair<GFace*,GFace*> pairTmp = (*itP);
-  //	}
-
-  std::cout<<"End of DuplicateBoundaries"<<std::endl;
-  return view;
-}
-
-
-
-
-
-
-
-
-
-
-
-PView *GMSH_DuplicateBoundariesPlugin::execute2D(PView *view)
-{
-  std::cout<<"starting DuplicateBoundaries"<<std::endl;
-  GModel *m = GModel::current();
-  m->setFactory("geo");
-  std::set<GEdge*> ToDuplicateList;
-  ToDuplicateList.clear();
-  std::set<GFace*> ToDuplicateListBoundary;
-  ToDuplicateListBoundary.clear();
-  std::vector<GFace*> facesBound;
-  facesBound.clear();
-  std::map<GFace*,SPoint3> centers;
-  std::vector<std::pair<GFace*,GFace*> > pairs;
-  std::vector<std::pair<GFace*,GFace*> > newPairs;
-  int PhysicalInterface = m->setPhysicalName("Interface",2);
-  for (GModel::eiter ite= m->firstEdge();ite != m->lastEdge();ite++){
-    GEdge* eTmp = (*ite);
-    if (eTmp->faces().size() == 2){
-      ToDuplicateList.insert(eTmp);
-    }
-  }
-
-
-
-
-
-
-
-
-
-
-  std::map<std::pair<MVertex*,GFace*>,MVertex* > VertexGlobalAssociation;
-  std::map<std::pair<GVertex*,GFace*>,GVertex* > GVertexGlobalAssociation;
-  std::map<std::pair<GEdge*,GFace*>,GEdge* > GEdgeGlobalAssociation;
-  std::map<std::pair<GFace*,GRegion*>,GFace* > GFaceGlobalAssociation;
-  for (GModel::fiter itr= m->firstFace();itr != m->lastFace();itr++){
-    GFace* rTmp = (*itr);
-    std::list<GEdge*> RegEdges = rTmp->edges();
-    std::map<MVertex*,MVertex* > VertexAssociation;
-    std::map<GVertex*,GVertex* > GVertexAssociation;
-    std::map<GEdge*,GEdge* > GEdgeAssociation;
-    //int counterNbDone = 10000;
-    double xCenterReg = 0.0;
-    double yCenterReg = 0.0;
-    double zCenterReg = 0.0;
-    int counterPts = 0;
-    for(std::list<GEdge*>::iterator it2=RegEdges.begin();it2!=RegEdges.end();it2++){
-      GEdge* fTemp = (*it2);
-      std::list<GVertex*> verticesFace = fTemp->vertices();
-      for (std::list<GVertex*>::iterator it3=verticesFace.begin();it3!=verticesFace.end();it3++){
-        xCenterReg = xCenterReg + (*it3)->x();
-        yCenterReg = yCenterReg + (*it3)->y();
-        zCenterReg = zCenterReg + (*it3)->z();
-        counterPts++;
-      }
-    }
-    xCenterReg = xCenterReg/counterPts;
-    yCenterReg = yCenterReg/counterPts;
-    zCenterReg = zCenterReg/counterPts;
-    //duplication noeud et aretes au niveau de la region directement
-    std::list<GVertex*> vlist;
-
-
-    std::list<GEdge*> listedgesTmp = rTmp->edges();
-    std::cout<<"listeEdge size "<<listedgesTmp.size()<<std::endl;
-    for (std::list<GEdge*>::iterator itTp = listedgesTmp.begin();itTp != listedgesTmp.end();itTp++){
-      std::list<GVertex*> vlist2;
-      if(std::find(vlist.begin(), vlist.end(),(*itTp)->getBeginVertex()) == vlist.end())
-        vlist.push_back((*itTp)->getBeginVertex());
-      if(std::find(vlist.begin(), vlist.end(),(*itTp)->getEndVertex()) == vlist.end())
-        vlist.push_back((*itTp)->getEndVertex());
-    }
-
-
-    for (std::list<GVertex*>::iterator itv = vlist.begin();itv != vlist.end();itv++){
-      //duplication Gvertex
-      GVertex* vTmp = (*itv);
-      double ponderatedX = 0.99999999999 * vTmp->x() + 0.00000000001 * xCenterReg;
-      double ponderatedY = 0.99999999999 * vTmp->y() + 0.00000000001 * yCenterReg;
-      double ponderatedZ = 0.99999999999 * vTmp->z() + 0.00000000001 * zCenterReg;
-      GVertex* newv = m->addVertex(ponderatedX,ponderatedY,ponderatedZ,vTmp->prescribedMeshSizeAtVertex());
-      GVertexAssociation[vTmp] = newv;
-      GVertexGlobalAssociation[std::make_pair(vTmp,rTmp)] = newv;
-      //creation des Gedge correspondantes
-      //			GEdge* newE = m->addLine(vTmp,newv);
-      //			SurroudingEdges[vTmp] = newE;
-      //maintenant traitement mesh
-      MVertex *vMesh = vTmp->mesh_vertices[0];
-      MVertex *newMv = new MVertex(vMesh->x(), vMesh->y(), vMesh->z(), (GEntity*)newv);
-      VertexAssociation[vMesh] = newMv;
-      VertexGlobalAssociation[std::make_pair(vMesh,rTmp)] = newMv;
-      newv->addMeshVertex(newMv);
-    }
-    //maintenant on soccupe de duppliquer les edges de la region
-    std::list<GEdge*> elist = rTmp->edges();
-
-    std::vector<GFace*> SurroundingsFaces;
-    for (std::list<GEdge*>::iterator itf = RegEdges.begin();itf != RegEdges.end();itf++){
-      GEdge* eTmp = (*itf);
-      //creation de la nouvelle face
-      GEdge* newE = m->addLine(GVertexAssociation[eTmp->getBeginVertex()],GVertexAssociation[eTmp->getEndVertex()]);
-      for (unsigned int i = 0; i < eTmp->mesh_vertices.size();i++){
-        MVertex *vMesh = eTmp->mesh_vertices[i];
-        MVertex *newMv = new MVertex(vMesh->x(), vMesh->y(), vMesh->z(), (GEntity*)newE);
-        VertexAssociation[vMesh] = newMv;
-        VertexGlobalAssociation[std::make_pair(vMesh,rTmp)] = newMv;
-        newE->addMeshVertex(newMv);
-      }
-      for (unsigned int i = 0; i < eTmp->getNumMeshElements();i++){
-        MElement* elem = eTmp->getMeshElement(i);
-        MVertex *firstETmp = VertexAssociation.find(elem->getVertex(0))->second;
-        MVertex *lastETmp = VertexAssociation.find(elem->getVertex(1))->second;
-        MVertex *midETmp = VertexAssociation.find(elem->getVertex(2))->second;
-        MLine3 *newLine = new MLine3(firstETmp,lastETmp,midETmp);
-        newE->addLine(newLine);
-      }
-      GEdgeGlobalAssociation[std::make_pair(eTmp,rTmp)] = newE;
-    }
-  }
-  int counterNbDone = 10000;
-  //maintenant on va traiter les faces initiales
-  for (std::set<GEdge*>::iterator itf = ToDuplicateList.begin();itf != ToDuplicateList.end();itf++){
-    counterNbDone++;
-    GEdge* eTmp = (*itf);
-    std::list<GFace*> listFacesTmpT = eTmp->faces();
-    std::list<GFace*>::iterator itTmpFace = listFacesTmpT.begin();
-    GFace* fac1 = (*itTmpFace);
-    itTmpFace++;
-    GFace* fac2 = (*itTmpFace);
-    //pour commencer on cree des aretes entre les vertex
-    //		std::list<GVertex*> vlist = eTmp->vertices();
-    std::list<GVertex*> vlist;
-    vlist.push_back(eTmp->getBeginVertex());
-    vlist.push_back(eTmp->getEndVertex());
-    std::map<GVertex*,GEdge* > SurroudingEdges;
-    for (std::list<GVertex*>::iterator itv = vlist.begin();itv != vlist.end();itv++){
-      GVertex* vTmp = (*itv);
-      GVertex* v1=0;
-      GVertex* v2=0;
-      std::map<std::pair<GVertex*,GFace*>,GVertex* >::iterator itMap = GVertexGlobalAssociation.find(std::make_pair(vTmp,fac1));
-      if (itMap != GVertexGlobalAssociation.end()){
-        v1 = itMap->second;
-      }
-      itMap = GVertexGlobalAssociation.find(std::make_pair(vTmp,fac2));
-      if (itMap != GVertexGlobalAssociation.end()){
-        v2 = itMap->second;
-      }
-      GEdge* newE = m->addLine(v1,v2);
-      SurroudingEdges[vTmp] = newE;
-    }
-    //ici tous les vertex sont traites
-    //on va traiter les edges
-    //		std::list<GEdge*> elist = fTmp->edges();
-    std::vector<GEdge*> newEdgesVector;
-    std::vector<GFace*> SurroundingsFaces;
-    //duplication Gedge
-    //			GEdge* eTmp = (*ite);
-    GEdge* e1=0;
-    GEdge* e2=0;
-    std::map<std::pair<GEdge*,GFace*>,GEdge* >::iterator itMap = GEdgeGlobalAssociation.find(std::make_pair(eTmp,fac1));
-    if (itMap != GEdgeGlobalAssociation.end()){
-      e1 = itMap->second;
-    }
-    itMap = GEdgeGlobalAssociation.find(std::make_pair(eTmp,fac2));
-    if (itMap != GEdgeGlobalAssociation.end()){
-      e2 = itMap->second;
-    }
-    //creation des GFace correspondantes
-    GEdge* firstE = SurroudingEdges.find(eTmp->getBeginVertex())->second;
-    GEdge* lastE = SurroudingEdges.find(eTmp->getEndVertex())->second;
-    if (firstE->getBeginVertex() != e1->getEndVertex()){
-      firstE->reverse();
-    }
-    if (firstE->getBeginVertex() != e1->getEndVertex()){
-      e1->reverse();
-    }
-    if (firstE->getBeginVertex() != e1->getEndVertex()){
-      firstE->reverse();
-    }
-    if (e2->getBeginVertex() != firstE->getEndVertex()){
-      e2->reverse();
-    }
-    if (lastE->getBeginVertex() != e2->getEndVertex()){
-      lastE->reverse();
-    }
-    std::vector<GEdge*> VecEdgesTmp;
-    VecEdgesTmp.push_back(e1);
-    VecEdgesTmp.push_back(firstE);
-    VecEdgesTmp.push_back(e2);
-    VecEdgesTmp.push_back(lastE);
-    std::vector<std::vector<GEdge*> > VecOfVecTmp;
-    VecOfVecTmp.push_back(VecEdgesTmp);
-    GFace* newFaceTmp = m->addPlanarFace(VecOfVecTmp);
-    //			SurroundingsFaces.push_back(newFaceTmp);
-
-    //creation de la nouvelle region
-    //		GRegion* createdRegion = new GRegion(m,counterNbDone);
-    newFaceTmp->addPhysicalEntity(PhysicalInterface);
-    //		createdRegion->set(listFaces);
-    //		m->add(createdRegion);
-    for (unsigned int i = 0; i < eTmp->getNumMeshElements();i++){
-      MElement* elem = eTmp->getMeshElement(i);
-      MVertex* v1=0;
-      MVertex* v2=0;
-      MVertex* v3=0;
-      MVertex* v4=0;
-      //MVertex* v5;
-      //MVertex* v6;
-      std::map<std::pair<MVertex*,GFace*>,MVertex* >::iterator itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(0),fac1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v1 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(2),fac1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v2 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(2),fac2));
-      if (itMap != VertexGlobalAssociation.end()){
-        v3 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(0),fac2));
-      if (itMap != VertexGlobalAssociation.end()){
-        v4 = itMap->second;
-      }
-      //			itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(3),fac2));
-      //			if (itMap != VertexGlobalAssociation.end()){
-      //				v5 = itMap->second;
-      //			}
-      //			itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(5),fac2));
-      //			if (itMap != VertexGlobalAssociation.end()){
-      //				v6 = itMap->second;
-      //			}
-      MQuadrangle *newQua = new MQuadrangle(v1,v2,v3,v4);
-
-      newFaceTmp->addQuadrangle(newQua);
-
-      //second
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(2),fac1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v1 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(1),fac1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v2 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(1),fac2));
-      if (itMap != VertexGlobalAssociation.end()){
-        v3 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(2),fac2));
-      if (itMap != VertexGlobalAssociation.end()){
-        v4 = itMap->second;
-      }
-      //			itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(3),fac2));
-      //			if (itMap != VertexGlobalAssociation.end()){
-      //				v5 = itMap->second;
-      //			}
-      //			itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(5),fac2));
-      //			if (itMap != VertexGlobalAssociation.end()){
-      //				v6 = itMap->second;
-      //			}
-      MQuadrangle *newQua2 = new MQuadrangle(v1,v2,v3,v4);
-
-      newFaceTmp->addQuadrangle(newQua2);
-
-
-
-
-    }
-    for (unsigned int i = 0; i < fac1->getNumMeshElements();i++){
-      MElement* elem = fac1->getMeshElement(i);
-      for (int j = 0;j < elem->getNumVertices();j++){
-        MVertex* vert = elem->getVertex(j);
-        std::map<std::pair<MVertex*,GFace*>,MVertex* >::iterator itMap = VertexGlobalAssociation.find(std::make_pair(vert,fac1));
-        if (itMap != VertexGlobalAssociation.end()){
-          elem->setVertex(j,itMap->second);
-        }
-      }
-    }
-    for (unsigned int i = 0; i < fac2->getNumMeshElements();i++){
-      MElement* elem = fac2->getMeshElement(i);
-      for (int j = 0;j < elem->getNumVertices();j++){
-        MVertex* vert = elem->getVertex(j);
-        std::map<std::pair<MVertex*,GFace*>,MVertex* >::iterator itMap = VertexGlobalAssociation.find(std::make_pair(vert,fac2));
-        if (itMap != VertexGlobalAssociation.end()){
-          elem->setVertex(j,itMap->second);
-        }
-      }
-    }
-  }
-  //maintenant on va traiter les faces du bord
-  //	std::ofstream file("MicrostructurePolycrystal3D.pos");
-  //	file << "View \"test\" {\n";
-  //
-  //	std::ofstream file2("PERIODIC.map");
-  //	std::ofstream file3("SetAdd.map");
-  //	for (std::vector<std::pair<GFace*,GFace*> >::iterator itP = pairs.begin();itP != pairs.end();itP++){
-  //		std::pair<GFace*,GFace*> pairTmp = (*itP);
-  //		GFace* ToReplaceFace = pairTmp.second;
-  //		GRegion* rTmp = ToReplaceFace->getRegion(0);
-  //		std::map<std::pair<GFace*,GRegion*>,GFace* >::iterator itMap = GFaceGlobalAssociation.find(std::make_pair(ToReplaceFace,rTmp));
-  //		if (itMap != GFaceGlobalAssociation.end()){
-  //			GFace* associatedFace = (*itMap).second;
-  //
-  //
-  //
-  //
-  //
-  //			file3 <<associatedFace->tag()<<"\tSURFACE"<<associatedFace->tag()<<"\tNSET "<<"\n";
-  //
-  //			int tagTmp = associatedFace->tag();
-  //			std::ostringstream ss;
-  //			ss << tagTmp;
-  ////			char *intStr = itoa(tagTmp);
-  //			std::string nameSurf = "SURFACE";
-  ////			nameSurf += std::string(intStr);
-  //			nameSurf += ss.str();
-  //			int PhysicalSurfaceTmp = m->setPhysicalName(nameSurf,2);
-  //			associatedFace->addPhysicalEntity(PhysicalSurfaceTmp);
-  //
-  //			std::map<GFace*,SPoint3>::iterator it3 = centers.find(pairTmp.first);
-  //			std::map<GFace*,SPoint3>::iterator it4 = centers.find(ToReplaceFace);
-  //
-  //			SPoint3 p1 = it3->second;
-  //			SPoint3  p2 = it4->second;
-  //
-  //			double delta_x = fabs(p2.x()-p1.x());
-  //			double delta_y = fabs(p2.y()-p1.y());
-  //			double delta_z = fabs(p2.z()-p1.z());
-  //
-  //
-  //			file << "SL ("
-  //					<< p1.x() << ", " << p1.y() << ", " << p1.z() << ", "
-  //					<< p2.x() << ", " << p2.y() << ", " << p2.z()
-  //					<< "){10, 20};\n";
-  //
-  //			//file2 << "PERIODIC\tSURFACE"<<faces[i]->tag() << "\tSURFACE" << faces[j]->tag() << "\t" << p2.x()-p1.x() << "\t" << p2.y()-p1.y() << "\t" << p2.z()-p1.z() << "\n";
-  //			if (abs((p2.x()-p1.x()-1.0))<0.0001){
-  //				if (abs((p2.y()-p1.y()))<0.0001){
-  //					if (abs((p2.z()-p1.z()))<0.0001){
-  //						file2 << "NSET\tFRONT = FRONT + SURFACE"<<associatedFace->tag()<<"\n";
-  //						file2 << "NSET\tBACK = BACK + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //					}else if(abs((p2.z()-p1.z()-1.0))<0.0001){
-  //						file2 << "NSET\tFRONTTOP = FRONTTOP + SURFACE"<<associatedFace->tag()<<"\n";
-  //						file2 << "NSET\tBACKBOTTOM = BACKBOTTOM + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //					}else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-  //						file2 << "NSET\tFRONTBOTTOM = FRONTBOTTOM + SURFACE"<<associatedFace->tag()<<"\n";
-  //						file2 << "NSET\tBACKTOP = BACKTOP + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //					}
-  //				}else if (abs((p2.y()-p1.y()-1.0))<0.0001){
-  //					if (abs((p2.z()-p1.z()))<0.0001){
-  //						file2 << "NSET\tFRONTRIGHT = FRONTRIGHT + SURFACE"<<associatedFace->tag()<<"\n";
-  //						file2 << "NSET\tBACKLEFT = BACKLEFT + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //					}else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-  //						file2 << "NSET\tFRONTRIGHTTOP = FRONTRIGHTTOP + SURFACE"<<associatedFace->tag()<<"\n";
-  //						file2 << "NSET\tBACKLEFTBOTTOM = BACKLEFTBOTTOM + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //					}else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-  //						file2 << "NSET\tFRONTRIGHTBOTTOM = FRONTRIGHTBOTTOM + SURFACE"<<associatedFace->tag()<<"\n";
-  //						file2 << "NSET\tBACKLEFTTOP = BACKLEFTTOP + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //					}
-  //				}else if (abs((p1.y()-p2.y()-1.0))<0.0001){
-  //					if (abs((p2.z()-p1.z()))<0.0001){
-  //						file2 << "NSET\tFRONTLEFT = FRONTLEFT + SURFACE"<<associatedFace->tag()<<"\n";
-  //						file2 << "NSET\tBACKRIGHT = BACKRIGHT + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //					}else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-  //						file2 << "NSET\tFRONTLEFTTOP = FRONTLEFTTOP + SURFACE"<<associatedFace->tag()<<"\n";
-  //						file2 << "NSET\tBACKRIGHTBOTTOM = BACKRIGHTBOTTOM + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //					}else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-  //						file2 << "NSET\tFRONTLEFTBOTTOM = FRONTLEFTBOTTOM + SURFACE"<<associatedFace->tag()<<"\n";
-  //						file2 << "NSET\tBACKRIGHTTOP = BACKRIGHTTOP + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //					}
-  //				}
-  //			}else if (abs((p1.x()-p2.x()-1.0))<0.0001){
-  //				if (abs((p2.y()-p1.y()))<0.0001){
-  //					if (abs((p2.z()-p1.z()))<0.0001){
-  //						file2 << "NSET\tFRONT = FRONT + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //						file2 << "NSET\tBACK = BACK + SURFACE"<<associatedFace->tag()<<"\n";
-  //					}else if(abs((p2.z()-p1.z()-1.0))<0.0001){
-  //						file2 << "NSET\tFRONTBOTTOM = FRONTBOTTOM + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //						file2 << "NSET\tBACKTOP = BACKTOP + SURFACE"<<associatedFace->tag()<<"\n";
-  //					}else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-  //						file2 << "NSET\tFRONTTOP = FRONTTOP + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //						file2 << "NSET\tBACKBOTTOM = BACKBOTTOM + SURFACE"<<associatedFace->tag()<<"\n";
-  //					}
-  //				}else if (abs((p2.y()-p1.y()-1.0))<0.0001){
-  //					if (abs((p2.z()-p1.z()))<0.0001){
-  //						file2 << "NSET\tFRONTLEFT = FRONTLEFT + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //						file2 << "NSET\tBACKRIGHT = BACKRIGHT + SURFACE"<<associatedFace->tag()<<"\n";
-  //					}else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-  //						file2 << "NSET\tFRONTLEFTBOTTOM = FRONTLEFTBOTTOM + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //						file2 << "NSET\tBACKRIGHTTOP = BACKRIGHTTOP + SURFACE"<<associatedFace->tag()<<"\n";
-  //					}else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-  //						file2 << "NSET\tFRONTLEFTTOP = FRONTLEFTTOP + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //						file2 << "NSET\tBACKRIGHTBOTTOM = BACKRIGHTBOTTOM + SURFACE"<<associatedFace->tag()<<"\n";
-  //					}
-  //				}else if (abs((p1.y()-p2.y()-1.0))<0.0001){
-  //					if (abs((p2.z()-p1.z()))<0.0001){
-  //						file2 << "NSET\tFRONTRIGHT = FRONTRIGHT + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //						file2 << "NSET\tBACKLEFT = BACKLEFT + SURFACE"<<associatedFace->tag()<<"\n";
-  //					}else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-  //						file2 << "NSET\tFRONTRIGHTBOTTOM = FRONTRIGHTBOTTOM + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //						file2 << "NSET\tBACKLEFTTOP = BACKLEFTTOP + SURFACE"<<associatedFace->tag()<<"\n";
-  //					}else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-  //						file2 << "NSET\tFRONTRIGHTTOP = FRONTRIGHTTOP + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //						file2 << "NSET\tBACKLEFTBOTTOM = BACKLEFTBOTTOM + SURFACE"<<associatedFace->tag()<<"\n";
-  //					}
-  //				}
-  //			}else if (abs((p1.x()-p2.x()))<0.0001){
-  //				if (abs((p2.y()-p1.y()-1.0))<0.0001){
-  //					if (abs((p2.z()-p1.z()))<0.0001){
-  //						file2 << "NSET\tRIGHT = RIGHT + SURFACE"<<associatedFace->tag()<<"\n";
-  //						file2 << "NSET\tLEFT = LEFT + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //					}else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-  //						file2 << "NSET\tRIGHTTOP = RIGHTTOP + SURFACE"<<associatedFace->tag()<<"\n";
-  //						file2 << "NSET\tLEFTBOTTOM = LEFTBOTTOM + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //					}else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-  //						file2 << "NSET\tRIGHTBOTTOM = RIGHTBOTTOM + SURFACE"<<associatedFace->tag()<<"\n";
-  //						file2 << "NSET\tLEFTTOP = LEFTTOP + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //					}
-  //				}else if (abs((p1.y()-p2.y()-1.0))<0.0001){
-  //					if (abs((p2.z()-p1.z()))<0.0001){
-  //						file2 << "NSET\tRIGHT = RIGHT + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //						file2 << "NSET\tLEFT = LEFT + SURFACE"<<associatedFace->tag()<<"\n";
-  //					}else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-  //						file2 << "NSET\tRIGHTBOTTOM = RIGHTBOTTOM + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //						file2 << "NSET\tLEFTTOP = LEFTTOP + SURFACE"<<associatedFace->tag()<<"\n";
-  //					}else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-  //						file2 << "NSET\tRIGHTTOP = RIGHTTOP + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //						file2 << "NSET\tLEFTBOTTOM = LEFTBOTTOM + SURFACE"<<associatedFace->tag()<<"\n";
-  //					}
-  //				}else if (abs((p1.y()-p2.y()))<0.0001){
-  //					if (abs((p2.z()-p1.z()-1.0))<0.0001){
-  //						file2 << "NSET\tTOP = TOP + SURFACE"<<associatedFace->tag()<<"\n";
-  //						file2 << "NSET\tBOTTOM = BOTTOM + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //					}else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-  //						file2 << "NSET\tTOP = TOP + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //						file2 << "NSET\tBOTTOM = BOTTOM + SURFACE"<<associatedFace->tag()<<"\n";
-  //					}
-  //				}
-  //			}
-  ////			count++;
-  //
-  //
-  //
-  //
-  //
-  //
-  //
-  //			newPairs.push_back(std::make_pair(pairTmp.first,associatedFace));
-  //		}
-  //	}
-  //	for (std::vector<std::pair<GFace*,GFace*> >::iterator itP = newPairs.begin();itP != newPairs.end();itP++){
-  //		std::pair<GFace*,GFace*> pairTmp = (*itP);
-  //	}
-
-  std::cout<<"End of DuplicateBoundaries"<<std::endl;
-  return view;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-PView *GMSH_DuplicateBoundariesPlugin::execute2DWithBound(PView *view)
-{
-  std::cout<<"starting DuplicateBoundaries"<<std::endl;
-  GModel *m = GModel::current();
-  m->setFactory("geo");
-  std::set<GEdge*> ToDuplicateList;
-  ToDuplicateList.clear();
-  std::set<GEdge*> ToDuplicateListBoundary;
-  ToDuplicateListBoundary.clear();
-  std::vector<GFace*> facesBound;
-  facesBound.clear();
-  std::map<GFace*,SPoint3> centers;
-  std::vector<std::pair<GFace*,GFace*> > pairs;
-  std::vector<std::pair<GFace*,GFace*> > newPairs;
-  int PhysicalInterface = m->setPhysicalName("Interface",2);
-
-  for (GModel::eiter ite= m->firstEdge();ite != m->lastEdge();ite++){
-    GEdge* eTmp = (*ite);
-    if (eTmp->faces().size() == 2){
-      ToDuplicateList.insert(eTmp);
-    }
-    else{
-      ToDuplicateListBoundary.insert(eTmp);
-    }
-  }
-
-
-
-
-
-
-
-
-
-
-  std::map<std::pair<MVertex*,GFace*>,MVertex* > VertexGlobalAssociation;
-  std::map<std::pair<GVertex*,GFace*>,GVertex* > GVertexGlobalAssociation;
-  std::map<std::pair<GEdge*,GFace*>,GEdge* > GEdgeGlobalAssociation;
-  std::map<std::pair<GFace*,GRegion*>,GFace* > GFaceGlobalAssociation;
-  for (GModel::fiter itr= m->firstFace();itr != m->lastFace();itr++){
-    GFace* rTmp = (*itr);
-    std::list<GEdge*> RegEdges = rTmp->edges();
-    std::map<MVertex*,MVertex* > VertexAssociation;
-    std::map<GVertex*,GVertex* > GVertexAssociation;
-    std::map<GEdge*,GEdge* > GEdgeAssociation;
-    //int counterNbDone = 10000;
-    double xCenterReg = 0.0;
-    double yCenterReg = 0.0;
-    double zCenterReg = 0.0;
-    int counterPts = 0;
-    for(std::list<GEdge*>::iterator it2=RegEdges.begin();it2!=RegEdges.end();it2++){
-      GEdge* fTemp = (*it2);
-      std::list<GVertex*> verticesFace = fTemp->vertices();
-      for (std::list<GVertex*>::iterator it3=verticesFace.begin();it3!=verticesFace.end();it3++){
-        xCenterReg = xCenterReg + (*it3)->x();
-        yCenterReg = yCenterReg + (*it3)->y();
-        zCenterReg = zCenterReg + (*it3)->z();
-        counterPts++;
-      }
-    }
-    xCenterReg = xCenterReg/counterPts;
-    yCenterReg = yCenterReg/counterPts;
-    zCenterReg = zCenterReg/counterPts;
-    //duplication noeud et aretes au niveau de la region directement
-    std::list<GVertex*> vlist;
-
-
-    std::list<GEdge*> listedgesTmp = rTmp->edges();
-    for (std::list<GEdge*>::iterator itTp = listedgesTmp.begin();itTp != listedgesTmp.end();itTp++){
-      std::list<GVertex*> vlist2;
-      if(std::find(vlist.begin(), vlist.end(),(*itTp)->getBeginVertex()) == vlist.end())
-        vlist.push_back((*itTp)->getBeginVertex());
-      if(std::find(vlist.begin(), vlist.end(),(*itTp)->getEndVertex()) == vlist.end())
-        vlist.push_back((*itTp)->getEndVertex());
-    }
-
-
-    for (std::list<GVertex*>::iterator itv = vlist.begin();itv != vlist.end();itv++){
-      //duplication Gvertex
-      GVertex* vTmp = (*itv);
-      double ponderatedX = 0.99999999999 * vTmp->x() + 0.00000000001 * xCenterReg;
-      double ponderatedY = 0.99999999999 * vTmp->y() + 0.00000000001 * yCenterReg;
-      double ponderatedZ = 0.99999999999 * vTmp->z() + 0.00000000001 * zCenterReg;
-      GVertex* newv = m->addVertex(ponderatedX,ponderatedY,ponderatedZ,vTmp->prescribedMeshSizeAtVertex());
-      GVertexAssociation[vTmp] = newv;
-      GVertexGlobalAssociation[std::make_pair(vTmp,rTmp)] = newv;
-      //creation des Gedge correspondantes
-      //			GEdge* newE = m->addLine(vTmp,newv);
-      //			SurroudingEdges[vTmp] = newE;
-      //maintenant traitement mesh
-      MVertex *vMesh = vTmp->mesh_vertices[0];
-      MVertex *newMv = new MVertex(vMesh->x(), vMesh->y(), vMesh->z(), (GEntity*)newv);
-      VertexAssociation[vMesh] = newMv;
-      VertexGlobalAssociation[std::make_pair(vMesh,rTmp)] = newMv;
-      newv->addMeshVertex(newMv);
-    }
-    //maintenant on soccupe de duppliquer les edges de la region
-    std::list<GEdge*> elist = rTmp->edges();
-
-    std::vector<GFace*> SurroundingsFaces;
-    for (std::list<GEdge*>::iterator itf = RegEdges.begin();itf != RegEdges.end();itf++){
-      GEdge* eTmp = (*itf);
-      GEdge* newE = m->addLine(GVertexAssociation[eTmp->getBeginVertex()],GVertexAssociation[eTmp->getEndVertex()]);
-      for (unsigned int i = 0; i < eTmp->mesh_vertices.size();i++){
-        MVertex *vMesh = eTmp->mesh_vertices[i];
-        MVertex *newMv = new MVertex(vMesh->x(), vMesh->y(), vMesh->z(), (GEntity*)newE);
-        VertexAssociation[vMesh] = newMv;
-        VertexGlobalAssociation[std::make_pair(vMesh,rTmp)] = newMv;
-        newE->addMeshVertex(newMv);
-      }
-      for (unsigned int i = 0; i < eTmp->getNumMeshElements();i++){
-        MElement* elem = eTmp->getMeshElement(i);
-        MVertex *firstETmp = VertexAssociation.find(elem->getVertex(0))->second;
-        MVertex *lastETmp = VertexAssociation.find(elem->getVertex(1))->second;
-        MVertex *midETmp = VertexAssociation.find(elem->getVertex(2))->second;
-        MLine3 *newLine = new MLine3(firstETmp,lastETmp,midETmp);
-        newE->addLine(newLine);
-      }
-      GEdgeGlobalAssociation[std::make_pair(eTmp,rTmp)] = newE;
-    }
-  }
-  int counterNbDone = 10000;
-  //maintenant on va traiter les faces initiales
-  for (std::set<GEdge*>::iterator itf = ToDuplicateList.begin();itf != ToDuplicateList.end();itf++){
-    counterNbDone++;
-    GEdge* eTmp = (*itf);
-    std::list<GFace*> listFacesTmpT = eTmp->faces();
-    std::list<GFace*>::iterator itTmpFace = listFacesTmpT.begin();
-    GFace* fac1 = (*itTmpFace);
-    itTmpFace++;
-    GFace* fac2 = (*itTmpFace);
-    //pour commencer on cree des aretes entre les vertex
-    //		std::list<GVertex*> vlist = eTmp->vertices();
-    std::list<GVertex*> vlist;
-    vlist.push_back(eTmp->getBeginVertex());
-    vlist.push_back(eTmp->getEndVertex());
-    std::map<GVertex*,GEdge* > SurroudingEdges;
-    for (std::list<GVertex*>::iterator itv = vlist.begin();itv != vlist.end();itv++){
-      GVertex* vTmp = (*itv);
-      GVertex* v1=0;
-      GVertex* v2=0;
-      std::map<std::pair<GVertex*,GFace*>,GVertex* >::iterator itMap = GVertexGlobalAssociation.find(std::make_pair(vTmp,fac1));
-      if (itMap != GVertexGlobalAssociation.end()){
-        v1 = itMap->second;
-      }
-      itMap = GVertexGlobalAssociation.find(std::make_pair(vTmp,fac2));
-      if (itMap != GVertexGlobalAssociation.end()){
-        v2 = itMap->second;
-      }
-      GEdge* newE = m->addLine(v1,v2);
-      SurroudingEdges[vTmp] = newE;
-    }
-    //ici tous les vertex sont traites
-    //on va traiter les edges
-    std::vector<GEdge*> newEdgesVector;
-    std::vector<GFace*> SurroundingsFaces;
-    //duplication Gedge
-    //			GEdge* eTmp = (*ite);
-    GEdge* e1=0;
-    GEdge* e2=0;
-    std::map<std::pair<GEdge*,GFace*>,GEdge* >::iterator itMap = GEdgeGlobalAssociation.find(std::make_pair(eTmp,fac1));
-    if (itMap != GEdgeGlobalAssociation.end()){
-      e1 = itMap->second;
-    }
-    itMap = GEdgeGlobalAssociation.find(std::make_pair(eTmp,fac2));
-    if (itMap != GEdgeGlobalAssociation.end()){
-      e2 = itMap->second;
-    }
-    //creation des GFace correspondantes
-    GEdge* firstE = SurroudingEdges.find(eTmp->getBeginVertex())->second;
-    GEdge* lastE = SurroudingEdges.find(eTmp->getEndVertex())->second;
-    if (firstE->getBeginVertex() != e1->getEndVertex()){
-      firstE->reverse();
-    }
-    if (firstE->getBeginVertex() != e1->getEndVertex()){
-      e1->reverse();
-    }
-    if (firstE->getBeginVertex() != e1->getEndVertex()){
-      firstE->reverse();
-    }
-    if (e2->getBeginVertex() != firstE->getEndVertex()){
-      e2->reverse();
-    }
-    if (lastE->getBeginVertex() != e2->getEndVertex()){
-      lastE->reverse();
-    }
-    std::vector<GEdge*> VecEdgesTmp;
-    VecEdgesTmp.push_back(e1);
-    VecEdgesTmp.push_back(firstE);
-    VecEdgesTmp.push_back(e2);
-    VecEdgesTmp.push_back(lastE);
-    std::vector<std::vector<GEdge*> > VecOfVecTmp;
-    VecOfVecTmp.push_back(VecEdgesTmp);
-    GFace* newFaceTmp = m->addPlanarFace(VecOfVecTmp);
-    //			SurroundingsFaces.push_back(newFaceTmp);
-
-    //creation de la nouvelle region
-    //		GRegion* createdRegion = new GRegion(m,counterNbDone);
-    newFaceTmp->addPhysicalEntity(PhysicalInterface);
-    //		createdRegion->set(listFaces);
-    //		m->add(createdRegion);
-    for (unsigned int i = 0; i < eTmp->getNumMeshElements();i++){
-      MElement* elem = eTmp->getMeshElement(i);
-      MVertex* v1=0;
-      MVertex* v2=0;
-      MVertex* v3=0;
-      MVertex* v4=0;
-      //MVertex* v5;
-      //MVertex* v6;
-      std::map<std::pair<MVertex*,GFace*>,MVertex* >::iterator itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(0),fac1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v1 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(2),fac1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v2 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(2),fac2));
-      if (itMap != VertexGlobalAssociation.end()){
-        v3 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(0),fac2));
-      if (itMap != VertexGlobalAssociation.end()){
-        v4 = itMap->second;
-      }
-      //			itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(3),fac2));
-      //			if (itMap != VertexGlobalAssociation.end()){
-      //				v5 = itMap->second;
-      //			}
-      //			itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(5),fac2));
-      //			if (itMap != VertexGlobalAssociation.end()){
-      //				v6 = itMap->second;
-      //			}
-      MQuadrangle *newQua = new MQuadrangle(v1,v2,v3,v4);
-
-      newFaceTmp->addQuadrangle(newQua);
-
-      //second
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(2),fac1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v1 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(1),fac1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v2 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(1),fac2));
-      if (itMap != VertexGlobalAssociation.end()){
-        v3 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(2),fac2));
-      if (itMap != VertexGlobalAssociation.end()){
-        v4 = itMap->second;
-      }
-      //			itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(3),fac2));
-      //			if (itMap != VertexGlobalAssociation.end()){
-      //				v5 = itMap->second;
-      //			}
-      //			itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(5),fac2));
-      //			if (itMap != VertexGlobalAssociation.end()){
-      //				v6 = itMap->second;
-      //			}
-      MQuadrangle *newQua2 = new MQuadrangle(v1,v2,v3,v4);
-
-      newFaceTmp->addQuadrangle(newQua2);
-
-
-
-
-    }
-    for (unsigned int i = 0; i < fac1->getNumMeshElements();i++){
-      MElement* elem = fac1->getMeshElement(i);
-      for (int j = 0;j < elem->getNumVertices();j++){
-        MVertex* vert = elem->getVertex(j);
-        std::map<std::pair<MVertex*,GFace*>,MVertex* >::iterator itMap = VertexGlobalAssociation.find(std::make_pair(vert,fac1));
-        if (itMap != VertexGlobalAssociation.end()){
-          elem->setVertex(j,itMap->second);
-        }
-      }
-    }
-    for (unsigned int i = 0; i < fac2->getNumMeshElements();i++){
-      MElement* elem = fac2->getMeshElement(i);
-      for (int j = 0;j < elem->getNumVertices();j++){
-        MVertex* vert = elem->getVertex(j);
-        std::map<std::pair<MVertex*,GFace*>,MVertex* >::iterator itMap = VertexGlobalAssociation.find(std::make_pair(vert,fac2));
-        if (itMap != VertexGlobalAssociation.end()){
-          elem->setVertex(j,itMap->second);
-        }
-      }
-    }
-  }
-
-
-
-
-
-
-
-
-  //maintenant on va traiter les faces du bord
-  for (std::set<GEdge*>::iterator itf = ToDuplicateListBoundary.begin();itf != ToDuplicateListBoundary.end();itf++){
-    counterNbDone++;
-    GEdge* eTmp = (*itf);
-    std::list<GFace*> listFacesTmpT = eTmp->faces();
-    std::list<GFace*>::iterator itTmpFace = listFacesTmpT.begin();
-    GFace* fac1 = (*itTmpFace);
-    //		GFace* reg1 = fTmp->getRegion(0);
-    //pour commencer on cree des aretes entre les vertex
-    std::list<GVertex*> vlist;
-    vlist.push_back(eTmp->getBeginVertex());
-    vlist.push_back(eTmp->getEndVertex());
-    std::map<GVertex*,GEdge* > SurroudingEdges;
-    for (std::list<GVertex*>::iterator itv = vlist.begin();itv != vlist.end();itv++){
-      GVertex* vTmp = (*itv);
-      GVertex* v1=0;
-      std::map<std::pair<GVertex*,GFace*>,GVertex* >::iterator itMap = GVertexGlobalAssociation.find(std::make_pair(vTmp,fac1));
-      if (itMap != GVertexGlobalAssociation.end()){
-        v1 = itMap->second;
-      }
-      GEdge* newE = m->addLine(v1,vTmp);
-      SurroudingEdges[vTmp] = newE;
-    }
-    //ici tous les vertex sont traites
-    //on va traiter les edges
-    //		std::list<GEdge*> elist = fTmp->edges();
-    std::vector<GEdge*> newEdgesVector;
-    std::vector<GFace*> SurroundingsFaces;
-    //		for (std::list<GEdge*>::iterator ite = elist.begin();ite != elist.end();ite++){
-    //duplication Gedge
-    //			GEdge* eTmp = (*ite);
-    GEdge* e1=0;
-    std::map<std::pair<GEdge*,GFace*>,GEdge* >::iterator itMap = GEdgeGlobalAssociation.find(std::make_pair(eTmp,fac1));
-    if (itMap != GEdgeGlobalAssociation.end()){
-      e1 = itMap->second;
-    }
-    //creation des GFace correspondantes
-    GEdge* firstE = SurroudingEdges.find(eTmp->getBeginVertex())->second;
-    GEdge* lastE = SurroudingEdges.find(eTmp->getEndVertex())->second;
-    if (firstE->getBeginVertex() != e1->getEndVertex()){
-      firstE->reverse();
-    }
-    if (firstE->getBeginVertex() != e1->getEndVertex()){
-      e1->reverse();
-    }
-    if (firstE->getBeginVertex() != e1->getEndVertex()){
-      firstE->reverse();
-    }
-    if (eTmp->getBeginVertex() != firstE->getEndVertex()){
-      eTmp->reverse();
-    }
-    if (lastE->getBeginVertex() != eTmp->getEndVertex()){
-      lastE->reverse();
-    }
-    std::vector<GEdge*> VecEdgesTmp;
-    VecEdgesTmp.push_back(e1);
-    VecEdgesTmp.push_back(firstE);
-    VecEdgesTmp.push_back(eTmp);
-    VecEdgesTmp.push_back(lastE);
-    std::vector<std::vector<GEdge*> > VecOfVecTmp;
-    VecOfVecTmp.push_back(VecEdgesTmp);
-    GFace* newFaceTmp = m->addPlanarFace(VecOfVecTmp);
-    //		SurroundingsFaces.push_back(newFaceTmp);
-    //		}
-    std::vector<GFace*> VectorFaces;
-    std::list<GFace*> listFaces;
-    //		GFace* f1;
-    //		std::map<std::pair<GFace*,GRegion*>,GFace* >::iterator itMap = GFaceGlobalAssociation.find(std::make_pair(fTmp,reg1));
-    //		if (itMap != GFaceGlobalAssociation.end()){
-    //			f1 = itMap->second;
-    //		}
-    //		VectorFaces.push_back(f1);
-    //		listFaces.push_back(f1);
-    //		for (unsigned int i = 0;i < SurroundingsFaces.size();i++){
-    //			VectorFaces.push_back(SurroundingsFaces[i]);
-    //			listFaces.push_back(SurroundingsFaces[i]);
-    //		}
-    //		VectorFaces.push_back(fTmp);
-    //		listFaces.push_back(fTmp);
-    //		std::vector<std::vector<GFace*> > VecOfVecGFace;
-    //		VecOfVecGFace.push_back(VectorFaces);
-    //		//creation de la nouvelle region
-    //		GRegion* createdRegion = new GRegion(m,counterNbDone);
-    newFaceTmp->addPhysicalEntity(PhysicalInterface);
-    //		createdRegion->set(listFaces);
-    //		m->add(createdRegion);
-    for (unsigned int i = 0; i < eTmp->getNumMeshElements();i++){
-      MElement* elem = eTmp->getMeshElement(i);
-      MVertex* v1=0;
-      MVertex* v2=0;
-      //MVertex* v3;
-      std::map<std::pair<MVertex*,GFace*>,MVertex* >::iterator itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(0),fac1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v1 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(2),fac1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v2 = itMap->second;
-      }
-      MQuadrangle *newQua = new MQuadrangle(v1,v2,elem->getVertex(2),elem->getVertex(0));
-      newFaceTmp->addQuadrangle(newQua);
-      //second
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(2),fac1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v1 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(1),fac1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v2 = itMap->second;
-      }
-      MQuadrangle *newQua2 = new MQuadrangle(v1,v2,elem->getVertex(1),elem->getVertex(2));
-      newFaceTmp->addQuadrangle(newQua2);
-    }
-    for (unsigned int i = 0; i < fac1->getNumMeshElements();i++){
-      MElement* elem = fac1->getMeshElement(i);
-      for (int j = 0;j < elem->getNumVertices();j++){
-        MVertex* vert = elem->getVertex(j);
-        std::map<std::pair<MVertex*,GFace*>,MVertex* >::iterator itMap = VertexGlobalAssociation.find(std::make_pair(vert,fac1));
-        if (itMap != VertexGlobalAssociation.end()){
-          elem->setVertex(j,itMap->second);
-        }
-      }
-    }
-  }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  //	std::ofstream file("MicrostructurePolycrystal3D.pos");
-  //	file << "View \"test\" {\n";
-  //
-  //	std::ofstream file2("PERIODIC.map");
-  //	std::ofstream file3("SetAdd.map");
-  //	for (std::vector<std::pair<GFace*,GFace*> >::iterator itP = pairs.begin();itP != pairs.end();itP++){
-  //		std::pair<GFace*,GFace*> pairTmp = (*itP);
-  //		GFace* ToReplaceFace = pairTmp.second;
-  //		GRegion* rTmp = ToReplaceFace->getRegion(0);
-  //		std::map<std::pair<GFace*,GRegion*>,GFace* >::iterator itMap = GFaceGlobalAssociation.find(std::make_pair(ToReplaceFace,rTmp));
-  //		if (itMap != GFaceGlobalAssociation.end()){
-  //			GFace* associatedFace = (*itMap).second;
-  //
-  //
-  //
-  //
-  //
-  //			file3 <<associatedFace->tag()<<"\tSURFACE"<<associatedFace->tag()<<"\tNSET "<<"\n";
-  //
-  //			int tagTmp = associatedFace->tag();
-  //			std::ostringstream ss;
-  //			ss << tagTmp;
-  ////			char *intStr = itoa(tagTmp);
-  //			std::string nameSurf = "SURFACE";
-  ////			nameSurf += std::string(intStr);
-  //			nameSurf += ss.str();
-  //			int PhysicalSurfaceTmp = m->setPhysicalName(nameSurf,2);
-  //			associatedFace->addPhysicalEntity(PhysicalSurfaceTmp);
-  //
-  //			std::map<GFace*,SPoint3>::iterator it3 = centers.find(pairTmp.first);
-  //			std::map<GFace*,SPoint3>::iterator it4 = centers.find(ToReplaceFace);
-  //
-  //			SPoint3 p1 = it3->second;
-  //			SPoint3  p2 = it4->second;
-  //
-  //			double delta_x = fabs(p2.x()-p1.x());
-  //			double delta_y = fabs(p2.y()-p1.y());
-  //			double delta_z = fabs(p2.z()-p1.z());
-  //
-  //
-  //			file << "SL ("
-  //					<< p1.x() << ", " << p1.y() << ", " << p1.z() << ", "
-  //					<< p2.x() << ", " << p2.y() << ", " << p2.z()
-  //					<< "){10, 20};\n";
-  //
-  //			//file2 << "PERIODIC\tSURFACE"<<faces[i]->tag() << "\tSURFACE" << faces[j]->tag() << "\t" << p2.x()-p1.x() << "\t" << p2.y()-p1.y() << "\t" << p2.z()-p1.z() << "\n";
-  //			if (abs((p2.x()-p1.x()-1.0))<0.0001){
-  //				if (abs((p2.y()-p1.y()))<0.0001){
-  //					if (abs((p2.z()-p1.z()))<0.0001){
-  //						file2 << "NSET\tFRONT = FRONT + SURFACE"<<associatedFace->tag()<<"\n";
-  //						file2 << "NSET\tBACK = BACK + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //					}else if(abs((p2.z()-p1.z()-1.0))<0.0001){
-  //						file2 << "NSET\tFRONTTOP = FRONTTOP + SURFACE"<<associatedFace->tag()<<"\n";
-  //						file2 << "NSET\tBACKBOTTOM = BACKBOTTOM + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //					}else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-  //						file2 << "NSET\tFRONTBOTTOM = FRONTBOTTOM + SURFACE"<<associatedFace->tag()<<"\n";
-  //						file2 << "NSET\tBACKTOP = BACKTOP + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //					}
-  //				}else if (abs((p2.y()-p1.y()-1.0))<0.0001){
-  //					if (abs((p2.z()-p1.z()))<0.0001){
-  //						file2 << "NSET\tFRONTRIGHT = FRONTRIGHT + SURFACE"<<associatedFace->tag()<<"\n";
-  //						file2 << "NSET\tBACKLEFT = BACKLEFT + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //					}else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-  //						file2 << "NSET\tFRONTRIGHTTOP = FRONTRIGHTTOP + SURFACE"<<associatedFace->tag()<<"\n";
-  //						file2 << "NSET\tBACKLEFTBOTTOM = BACKLEFTBOTTOM + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //					}else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-  //						file2 << "NSET\tFRONTRIGHTBOTTOM = FRONTRIGHTBOTTOM + SURFACE"<<associatedFace->tag()<<"\n";
-  //						file2 << "NSET\tBACKLEFTTOP = BACKLEFTTOP + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //					}
-  //				}else if (abs((p1.y()-p2.y()-1.0))<0.0001){
-  //					if (abs((p2.z()-p1.z()))<0.0001){
-  //						file2 << "NSET\tFRONTLEFT = FRONTLEFT + SURFACE"<<associatedFace->tag()<<"\n";
-  //						file2 << "NSET\tBACKRIGHT = BACKRIGHT + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //					}else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-  //						file2 << "NSET\tFRONTLEFTTOP = FRONTLEFTTOP + SURFACE"<<associatedFace->tag()<<"\n";
-  //						file2 << "NSET\tBACKRIGHTBOTTOM = BACKRIGHTBOTTOM + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //					}else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-  //						file2 << "NSET\tFRONTLEFTBOTTOM = FRONTLEFTBOTTOM + SURFACE"<<associatedFace->tag()<<"\n";
-  //						file2 << "NSET\tBACKRIGHTTOP = BACKRIGHTTOP + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //					}
-  //				}
-  //			}else if (abs((p1.x()-p2.x()-1.0))<0.0001){
-  //				if (abs((p2.y()-p1.y()))<0.0001){
-  //					if (abs((p2.z()-p1.z()))<0.0001){
-  //						file2 << "NSET\tFRONT = FRONT + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //						file2 << "NSET\tBACK = BACK + SURFACE"<<associatedFace->tag()<<"\n";
-  //					}else if(abs((p2.z()-p1.z()-1.0))<0.0001){
-  //						file2 << "NSET\tFRONTBOTTOM = FRONTBOTTOM + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //						file2 << "NSET\tBACKTOP = BACKTOP + SURFACE"<<associatedFace->tag()<<"\n";
-  //					}else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-  //						file2 << "NSET\tFRONTTOP = FRONTTOP + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //						file2 << "NSET\tBACKBOTTOM = BACKBOTTOM + SURFACE"<<associatedFace->tag()<<"\n";
-  //					}
-  //				}else if (abs((p2.y()-p1.y()-1.0))<0.0001){
-  //					if (abs((p2.z()-p1.z()))<0.0001){
-  //						file2 << "NSET\tFRONTLEFT = FRONTLEFT + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //						file2 << "NSET\tBACKRIGHT = BACKRIGHT + SURFACE"<<associatedFace->tag()<<"\n";
-  //					}else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-  //						file2 << "NSET\tFRONTLEFTBOTTOM = FRONTLEFTBOTTOM + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //						file2 << "NSET\tBACKRIGHTTOP = BACKRIGHTTOP + SURFACE"<<associatedFace->tag()<<"\n";
-  //					}else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-  //						file2 << "NSET\tFRONTLEFTTOP = FRONTLEFTTOP + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //						file2 << "NSET\tBACKRIGHTBOTTOM = BACKRIGHTBOTTOM + SURFACE"<<associatedFace->tag()<<"\n";
-  //					}
-  //				}else if (abs((p1.y()-p2.y()-1.0))<0.0001){
-  //					if (abs((p2.z()-p1.z()))<0.0001){
-  //						file2 << "NSET\tFRONTRIGHT = FRONTRIGHT + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //						file2 << "NSET\tBACKLEFT = BACKLEFT + SURFACE"<<associatedFace->tag()<<"\n";
-  //					}else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-  //						file2 << "NSET\tFRONTRIGHTBOTTOM = FRONTRIGHTBOTTOM + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //						file2 << "NSET\tBACKLEFTTOP = BACKLEFTTOP + SURFACE"<<associatedFace->tag()<<"\n";
-  //					}else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-  //						file2 << "NSET\tFRONTRIGHTTOP = FRONTRIGHTTOP + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //						file2 << "NSET\tBACKLEFTBOTTOM = BACKLEFTBOTTOM + SURFACE"<<associatedFace->tag()<<"\n";
-  //					}
-  //				}
-  //			}else if (abs((p1.x()-p2.x()))<0.0001){
-  //				if (abs((p2.y()-p1.y()-1.0))<0.0001){
-  //					if (abs((p2.z()-p1.z()))<0.0001){
-  //						file2 << "NSET\tRIGHT = RIGHT + SURFACE"<<associatedFace->tag()<<"\n";
-  //						file2 << "NSET\tLEFT = LEFT + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //					}else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-  //						file2 << "NSET\tRIGHTTOP = RIGHTTOP + SURFACE"<<associatedFace->tag()<<"\n";
-  //						file2 << "NSET\tLEFTBOTTOM = LEFTBOTTOM + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //					}else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-  //						file2 << "NSET\tRIGHTBOTTOM = RIGHTBOTTOM + SURFACE"<<associatedFace->tag()<<"\n";
-  //						file2 << "NSET\tLEFTTOP = LEFTTOP + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //					}
-  //				}else if (abs((p1.y()-p2.y()-1.0))<0.0001){
-  //					if (abs((p2.z()-p1.z()))<0.0001){
-  //						file2 << "NSET\tRIGHT = RIGHT + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //						file2 << "NSET\tLEFT = LEFT + SURFACE"<<associatedFace->tag()<<"\n";
-  //					}else if (abs((p2.z()-p1.z()-1.0))<0.0001){
-  //						file2 << "NSET\tRIGHTBOTTOM = RIGHTBOTTOM + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //						file2 << "NSET\tLEFTTOP = LEFTTOP + SURFACE"<<associatedFace->tag()<<"\n";
-  //					}else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-  //						file2 << "NSET\tRIGHTTOP = RIGHTTOP + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //						file2 << "NSET\tLEFTBOTTOM = LEFTBOTTOM + SURFACE"<<associatedFace->tag()<<"\n";
-  //					}
-  //				}else if (abs((p1.y()-p2.y()))<0.0001){
-  //					if (abs((p2.z()-p1.z()-1.0))<0.0001){
-  //						file2 << "NSET\tTOP = TOP + SURFACE"<<associatedFace->tag()<<"\n";
-  //						file2 << "NSET\tBOTTOM = BOTTOM + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //					}else if (abs((p1.z()-p2.z()-1.0))<0.0001){
-  //						file2 << "NSET\tTOP = TOP + SURFACE"<<pairTmp.first->tag()<<"\n";
-  //						file2 << "NSET\tBOTTOM = BOTTOM + SURFACE"<<associatedFace->tag()<<"\n";
-  //					}
-  //				}
-  //			}
-  ////			count++;
-  //
-  //
-  //
-  //
-  //
-  //
-  //
-  //			newPairs.push_back(std::make_pair(pairTmp.first,associatedFace));
-  //		}
-  //	}
-  //	for (std::vector<std::pair<GFace*,GFace*> >::iterator itP = newPairs.begin();itP != newPairs.end();itP++){
-  //		std::pair<GFace*,GFace*> pairTmp = (*itP);
-  //	}
-
-  std::cout<<"End of DuplicateBoundaries"<<std::endl;
-  return view;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-PView *GMSH_DuplicateBoundariesPlugin::executeTer(PView *view)
-{
-  std::cout<<"starting DuplicateBoundaries"<<std::endl;
-  GModel *m = GModel::current();
-  m->setFactory("geo");
-  std::set<GFace*> ToDuplicateList;
-  ToDuplicateList.clear();
-  std::set<GFace*> ToDuplicateListBoundary;
-  ToDuplicateListBoundary.clear();
-  std::vector<GFace*> facesBound;
-  facesBound.clear();
-  std::map<GFace*,SPoint3> centers;
-  std::vector<std::pair<GFace*,GFace*> > pairs;
-  std::vector<std::pair<GFace*,GFace*> > newPairs;
-  int PhysicalInterface = m->setPhysicalName("Interface",3);
-  int PhysicalBoundary = m->setPhysicalName("Boundary",2);
-  for (GModel::fiter itf= m->firstFace();itf != m->lastFace();itf++){
-    GFace* fTmp = (*itf);
-    if (fTmp->numRegions() == 2){
-      ToDuplicateList.insert(fTmp);
-    }
-    else{
-      ToDuplicateListBoundary.insert(fTmp);
-      facesBound.push_back(fTmp);
-    }
-  }
-
-
-
-
-
-
-
-  std::map<std::pair<MVertex*,GRegion*>,MVertex* > VertexGlobalAssociation;
-  std::map<std::pair<GVertex*,GRegion*>,GVertex* > GVertexGlobalAssociation;
-  std::map<std::pair<GEdge*,GRegion*>,GEdge* > GEdgeGlobalAssociation;
-  std::map<std::pair<GFace*,GRegion*>,GFace* > GFaceGlobalAssociation;
-
-  for (GModel::riter itr= m->firstRegion();itr != m->lastRegion();itr++){
-    GRegion* rTmp = (*itr);
-    std::list<GFace*> RegFaces = rTmp->faces();
-    std::map<MVertex*,MVertex* > VertexAssociation;
-    std::map<GVertex*,GVertex* > GVertexAssociation;
-    std::map<GEdge*,GEdge* > GEdgeAssociation;
-    //int counterNbDone = 10000;
-    double xCenterReg = 0.0;
-    double yCenterReg = 0.0;
-    double zCenterReg = 0.0;
-    int counterPts = 0;
-    for(std::list<GFace*>::iterator it2=RegFaces.begin();it2!=RegFaces.end();it2++){
-      GFace* fTemp = (*it2);
-      std::list<GVertex*> verticesFace = fTemp->vertices();
-      for (std::list<GVertex*>::iterator it3=verticesFace.begin();it3!=verticesFace.end();it3++){
-        xCenterReg = xCenterReg + (*it3)->x();
-        yCenterReg = yCenterReg + (*it3)->y();
-        zCenterReg = zCenterReg + (*it3)->z();
-        counterPts++;
-      }
-    }
-    xCenterReg = xCenterReg/counterPts;
-    yCenterReg = yCenterReg/counterPts;
-    zCenterReg = zCenterReg/counterPts;
-    //duplication noeud et aretes au niveau de la region directement
-    std::list<GVertex*> vlist;
-
-
-    std::list<GFace*> listFacesTmp = rTmp->faces();
-    for (std::list<GFace*>::iterator itTp = listFacesTmp.begin();itTp != listFacesTmp.end();itTp++){
-      std::list<GVertex*> vlist2;
-      vlist2 = (*itTp)->vertices();
-      for (std::list<GVertex*>::iterator itTp2 = vlist2.begin();itTp2 != vlist2.end();itTp2++){
-        if(std::find(vlist.begin(), vlist.end(), *itTp2) == vlist.end())
-          vlist.push_back(*itTp2);
-      }
-    }
-
-
-    for (std::list<GVertex*>::iterator itv = vlist.begin();itv != vlist.end();itv++){
-      //duplication Gvertex
-      GVertex* vTmp = (*itv);
-      double ponderatedX = 0.99999999999 * vTmp->x() + 0.00000000001 * xCenterReg;
-      double ponderatedY = 0.99999999999 * vTmp->y() + 0.00000000001 * yCenterReg;
-      double ponderatedZ = 0.99999999999 * vTmp->z() + 0.00000000001 * zCenterReg;
-      GVertex* newv = m->addVertex(ponderatedX,ponderatedY,ponderatedZ,vTmp->prescribedMeshSizeAtVertex());
-      GVertexAssociation[vTmp] = newv;
-      GVertexGlobalAssociation[std::make_pair(vTmp,rTmp)] = newv;
-      //creation des Gedge correspondantes
-      //			GEdge* newE = m->addLine(vTmp,newv);
-      //			SurroudingEdges[vTmp] = newE;
-      //maintenant traitement mesh
-      MVertex *vMesh = vTmp->mesh_vertices[0];
-      MVertex *newMv = new MVertex(vMesh->x(), vMesh->y(), vMesh->z(), (GEntity*)newv);
-      VertexAssociation[vMesh] = newMv;
-      VertexGlobalAssociation[std::make_pair(vMesh,rTmp)] = newMv;
-      newv->addMeshVertex(newMv);
-    }
-    //maintenant on soccupe de duppliquer les edges de la region
-    std::list<GEdge*> elist = rTmp->edges();
-
-    std::vector<GFace*> SurroundingsFaces;
-    for (std::list<GEdge*>::iterator ite = elist.begin();ite != elist.end();ite++){
-      //duplication Gedge
-      GEdge* eTmp = (*ite);
-      GEdge* newE = m->addLine(GVertexAssociation[eTmp->getEndVertex()],GVertexAssociation[eTmp->getBeginVertex()]);
-      GEdgeAssociation[eTmp] = newE;
-      GEdgeGlobalAssociation[std::make_pair(eTmp,rTmp)] = newE;
-      //creation des GFace correspondantes
-      //			GEdge* firstE = SurroudingEdges.find(eTmp->getEndVertex())->second;
-      //			GEdge* lastE = SurroudingEdges.find(eTmp->getBeginVertex())->second;
-      //			std::vector<GEdge*> VecEdgesTmp;
-      //			VecEdgesTmp.push_back(eTmp);
-      //			VecEdgesTmp.push_back(firstE);
-      //			VecEdgesTmp.push_back(newE);
-      //			VecEdgesTmp.push_back(lastE);
-      //			std::vector<std::vector<GEdge*> > VecOfVecTmp;
-      //			VecOfVecTmp.push_back(VecEdgesTmp);
-      //			GFace* newFaceTmp = m->addPlanarFace(VecOfVecTmp);
-      //			SurroundingsFaces.push_back(newFaceTmp);
-      //maintenant traitement mesh
-      for (unsigned int i = 0; i < eTmp->mesh_vertices.size();i++){
-        MVertex *vMesh = eTmp->mesh_vertices[i];
-        MVertex *newMv = new MVertex(vMesh->x(), vMesh->y(), vMesh->z(), (GEntity*)newE);
-        VertexAssociation[vMesh] = newMv;
-        VertexGlobalAssociation[std::make_pair(vMesh,rTmp)] = newMv;
-        newE->addMeshVertex(newMv);
-      }
-      for (unsigned int i = 0; i < eTmp->getNumMeshElements();i++){
-        MElement* elem = eTmp->getMeshElement(i);
-        MVertex *firstETmp = VertexAssociation.find(elem->getVertex(0))->second;
-        MVertex *lastETmp = VertexAssociation.find(elem->getVertex(1))->second;
-        MLine *newLine = new MLine(firstETmp,lastETmp);
-        newE->addLine(newLine);
-      }
-    }
-    for (std::list<GFace*>::iterator itf = RegFaces.begin();itf != RegFaces.end();itf++){
-      GFace* fTmp = (*itf);
-      std::vector<GEdge*> newEdgesVector;
-      std::list<GEdge*> elistFace = fTmp->edges();
-      for (std::list<GEdge*>::iterator ite = elistFace.begin();ite != elistFace.end();ite++){
-        GEdge* eTmp = (*ite);
-        GEdge* eToFind = GEdgeAssociation[eTmp];
-        newEdgesVector.push_back(eToFind);
-      }
-      std::vector<std::vector<GEdge*> > VecOfVec;
-      VecOfVec.push_back(newEdgesVector);
-      //creation de la nouvelle face
-      GFace* GFaceAssociation = m->addPlanarFace(VecOfVec);
-      //maintenant traitement mesh
-      for (unsigned int i = 0; i < fTmp->mesh_vertices.size();i++){
-        MVertex *vMesh = fTmp->mesh_vertices[i];
-        MVertex *newMv = new MVertex(vMesh->x(), vMesh->y(), vMesh->z(), (GEntity*)GFaceAssociation);
-        VertexAssociation[vMesh] = newMv;
-        VertexGlobalAssociation[std::make_pair(vMesh,rTmp)] = newMv;
-        GFaceAssociation->addMeshVertex(newMv);
-      }
-      for (unsigned int i = 0; i < fTmp->getNumMeshElements();i++){
-        MElement* elem = fTmp->getMeshElement(i);
-        MVertex *firstE = VertexAssociation.find(elem->getVertex(0))->second;
-        MVertex *secondE = VertexAssociation.find(elem->getVertex(1))->second;
-        MVertex *thirdE = VertexAssociation.find(elem->getVertex(2))->second;
-        MTriangle *newTri = new MTriangle(firstE,secondE,thirdE);
-        GFaceAssociation->addTriangle(newTri);
-      }
-      GFaceGlobalAssociation[std::make_pair(fTmp,rTmp)] = GFaceAssociation;
-    }
-  }
-  int counterNbDone = 10000;
-  //maintenant on va traiter les faces initiales
-  for (std::set<GFace*>::iterator itf = ToDuplicateList.begin();itf != ToDuplicateList.end();itf++){
-    counterNbDone++;
-    GFace* fTmp = (*itf);
-    GRegion* reg1 = fTmp->getRegion(0);
-    GRegion* reg2 = fTmp->getRegion(1);
-    //pour commencer on cree des aretes entre les vertex
-    std::list<GVertex*> vlist = fTmp->vertices();
-    std::map<GVertex*,GEdge* > SurroudingEdges;
-    for (std::list<GVertex*>::iterator itv = vlist.begin();itv != vlist.end();itv++){
-      GVertex* vTmp = (*itv);
-      GVertex* v1=0;
-      GVertex* v2=0;
-      std::map<std::pair<GVertex*,GRegion*>,GVertex* >::iterator itMap = GVertexGlobalAssociation.find(std::make_pair(vTmp,reg1));
-      if (itMap != GVertexGlobalAssociation.end()){
-        v1 = itMap->second;
-      }
-      itMap = GVertexGlobalAssociation.find(std::make_pair(vTmp,reg2));
-      if (itMap != GVertexGlobalAssociation.end()){
-        v2 = itMap->second;
-      }
-      GEdge* newE = m->addLine(v1,v2);
-      SurroudingEdges[vTmp] = newE;
-    }
-    //ici tous les vertex sont traites
-    //on va traiter les edges
-    std::list<GEdge*> elist = fTmp->edges();
-    std::vector<GEdge*> newEdgesVector;
-    std::vector<GFace*> SurroundingsFaces;
-    for (std::list<GEdge*>::iterator ite = elist.begin();ite != elist.end();ite++){
-      //duplication Gedge
-      GEdge* eTmp = (*ite);
-      GEdge* e1=0;
-      GEdge* e2=0;
-      std::map<std::pair<GEdge*,GRegion*>,GEdge* >::iterator itMap = GEdgeGlobalAssociation.find(std::make_pair(eTmp,reg1));
-      if (itMap != GEdgeGlobalAssociation.end()){
-        e1 = itMap->second;
-      }
-      itMap = GEdgeGlobalAssociation.find(std::make_pair(eTmp,reg2));
-      if (itMap != GEdgeGlobalAssociation.end()){
-        e2 = itMap->second;
-      }
-      //creation des GFace correspondantes
-      GEdge* firstE = SurroudingEdges.find(eTmp->getBeginVertex())->second;
-      GEdge* lastE = SurroudingEdges.find(eTmp->getEndVertex())->second;
-      if (firstE->getBeginVertex() != e1->getEndVertex()){
-        firstE->reverse();
-      }
-      if (firstE->getBeginVertex() != e1->getEndVertex()){
-        e1->reverse();
-      }
-      if (firstE->getBeginVertex() != e1->getEndVertex()){
-        firstE->reverse();
-      }
-      if (e2->getBeginVertex() != firstE->getEndVertex()){
-        e2->reverse();
-      }
-      if (lastE->getBeginVertex() != e2->getEndVertex()){
-        lastE->reverse();
-      }
-      std::vector<GEdge*> VecEdgesTmp;
-      VecEdgesTmp.push_back(e1);
-      VecEdgesTmp.push_back(firstE);
-      VecEdgesTmp.push_back(e2);
-      VecEdgesTmp.push_back(lastE);
-      std::vector<std::vector<GEdge*> > VecOfVecTmp;
-      VecOfVecTmp.push_back(VecEdgesTmp);
-      GFace* newFaceTmp = m->addPlanarFace(VecOfVecTmp);
-      SurroundingsFaces.push_back(newFaceTmp);
-    }
-    std::vector<GFace*> VectorFaces;
-    std::list<GFace*> listFaces;
-    GFace* f1;
-    GFace* f2;
-    std::map<std::pair<GFace*,GRegion*>,GFace* >::iterator itMap = GFaceGlobalAssociation.find(std::make_pair(fTmp,reg1));
-    if (itMap != GFaceGlobalAssociation.end()){
-      f1 = itMap->second;
-    }
-    itMap = GFaceGlobalAssociation.find(std::make_pair(fTmp,reg2));
-    if (itMap != GFaceGlobalAssociation.end()){
-      f2 = itMap->second;
-    }
-    VectorFaces.push_back(f1);
-    listFaces.push_back(f1);
-    for (unsigned int i = 0;i < SurroundingsFaces.size();i++){
-      VectorFaces.push_back(SurroundingsFaces[i]);
-      listFaces.push_back(SurroundingsFaces[i]);
-    }
-    VectorFaces.push_back(f2);
-    listFaces.push_back(f2);
-    std::vector<std::vector<GFace*> > VecOfVecGFace;
-    VecOfVecGFace.push_back(VectorFaces);
-    //creation de la nouvelle region
-    GRegion* createdRegion = new GRegion(m,counterNbDone);
-    createdRegion->addPhysicalEntity(PhysicalInterface);
-    createdRegion->set(listFaces);
-    m->add(createdRegion);
-    for (unsigned int i = 0; i < fTmp->getNumMeshElements();i++){
-      MElement* elem = fTmp->getMeshElement(i);
-      MVertex* v1=0;
-      MVertex* v2=0;
-      MVertex* v3=0;
-      MVertex* v4=0;
-      MVertex* v5=0;
-      MVertex* v6=0;
-      std::map<std::pair<MVertex*,GRegion*>,MVertex* >::iterator itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(0),reg1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v1 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(1),reg1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v2 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(2),reg1));
-      if (itMap != VertexGlobalAssociation.end()){
-        v3 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(0),reg2));
-      if (itMap != VertexGlobalAssociation.end()){
-        v4 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(1),reg2));
-      if (itMap != VertexGlobalAssociation.end()){
-        v5 = itMap->second;
-      }
-      itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(2),reg2));
-      if (itMap != VertexGlobalAssociation.end()){
-        v6 = itMap->second;
-      }
-      MPrism *newPri = new MPrism(v1,v2,v3,v4,v5,v6);
-
-      createdRegion->addPrism(newPri);
-    }
-    for (unsigned int i = 0; i < reg1->getNumMeshElements();i++){
-      MElement* elem = reg1->getMeshElement(i);
-      for (int j = 0;j < elem->getNumVertices();j++){
-        MVertex* vert = elem->getVertex(j);
-        std::map<std::pair<MVertex*,GRegion*>,MVertex* >::iterator itMap = VertexGlobalAssociation.find(std::make_pair(vert,reg1));
-        if (itMap != VertexGlobalAssociation.end()){
-          elem->setVertex(j,itMap->second);
-        }
-      }
-    }
-    for (unsigned int i = 0; i < reg2->getNumMeshElements();i++){
-      MElement* elem = reg2->getMeshElement(i);
-      for (int j = 0;j < elem->getNumVertices();j++){
-        MVertex* vert = elem->getVertex(j);
-        std::map<std::pair<MVertex*,GRegion*>,MVertex* >::iterator itMap = VertexGlobalAssociation.find(std::make_pair(vert,reg2));
-        if (itMap != VertexGlobalAssociation.end()){
-          elem->setVertex(j,itMap->second);
-        }
-      }
-    }
-  }
-
-  for (std::set<GFace*>::iterator itf = ToDuplicateListBoundary.begin();itf != ToDuplicateListBoundary.end();itf++){
-    GFace* fTmp = (*itf);
-    GRegion* reg1 = fTmp->getRegion(0);
-    std::map<std::pair<GFace*,GRegion*>,GFace* >::iterator itMap = GFaceGlobalAssociation.find(std::make_pair(fTmp,reg1));
-    GFace* f1 = itMap->second;
-    f1->addPhysicalEntity(PhysicalBoundary);
-  }
-
-
-  std::cout<<"End of DuplicateBoundaries"<<std::endl;
-  return view;
-}
-
-PView *GMSH_DuplicateBoundariesPlugin::ComputeBestSeeds(PView *view)
-{
-  std::cout<<"starting DuplicateBoundaries"<<std::endl;
-  GModel *m = GModel::current();
-  m->setFactory("geo");
-  return view;
-}
diff --git a/Plugin/FaultZone.cpp b/Plugin/FaultZone.cpp
index 54ea09867cbbc889ec4c33c8b7aeb4399dcda44f..ccb1ada8217088cb8a806613a1fba770d9f78067 100644
--- a/Plugin/FaultZone.cpp
+++ b/Plugin/FaultZone.cpp
@@ -49,12 +49,12 @@ std::string GMSH_FaultZonePlugin::getHelp() const
     "command Line In Surface. "
     "The surface must be meshed with quadratic incomplete elements."
     "\n\n"
-    "`Thickness' is the thichness of the flat quadrangles. "
-    "Set a value different to zero can be helpfull to check the connectivity. "
+    "`Thickness' is the thickness of the flat quadrangles. "
+    "Set a value different to zero can be helpful to check the connectivity. "
     "\n\n"
     "`Prefix' is the prefix of the name of physicals containing the new embedded. "
     "All physicals containing embedded lines are replaced by physicals containing "
-    "the coresponding joint elements.";
+    "the corresponding joint elements.";
 }
 
 int GMSH_FaultZonePlugin::getNbOptions() const
diff --git a/Plugin/PluginManager.cpp b/Plugin/PluginManager.cpp
index bfdd58b0def96e5d3853114bcad62f28765a8053..a9256cc6b2f17ef4fee11ad4da8445d58d2a7f32 100644
--- a/Plugin/PluginManager.cpp
+++ b/Plugin/PluginManager.cpp
@@ -25,7 +25,6 @@
 #include "ExtractElements.h"
 #include "SimplePartition.h"
 #include "Crack.h"
-#include "DuplicateBoundaries.h"
 #include "ThinLayerFixMesh.h"
 #include "HarmonicToTime.h"
 #include "ModulusPhase.h"
@@ -260,8 +259,6 @@ void PluginManager::registerDefaultPlugins()
                       ("Crack", GMSH_RegisterCrackPlugin()));
     allPlugins.insert(std::pair<std::string, GMSH_Plugin*>
                       ("FaultZone", GMSH_RegisterFaultZonePlugin()));
-    allPlugins.insert(std::pair<std::string, GMSH_Plugin*>
-                      ("DuplicateBoundaries", GMSH_RegisterDuplicateBoundariesPlugin()));
     allPlugins.insert(std::pair<std::string, GMSH_Plugin*>
                       ("ThinLayerFixMesh", GMSH_RegisterThinLayerFixMeshPlugin()));
     allPlugins.insert(std::pair<std::string, GMSH_Plugin*>
diff --git a/Post/PView.cpp b/Post/PView.cpp
index ee16a36d1286b9229a89449f5b66874689731e44..51705e00fc668b265c8c4252ef3e978c3f38b15d 100644
--- a/Post/PView.cpp
+++ b/Post/PView.cpp
@@ -109,6 +109,20 @@ PView::PView(const std::string &xname, const std::string &yname,
   _options->axesLabel[0] = xname;
 }
 
+PView::PView(const std::string &name, std::vector<double> &x, std::vector<double> &y,
+             std::vector<double> &z, std::vector<double> &v)
+{
+  _init();
+  _data = new PViewDataList();
+  _data->setXYZV(x, y, z, v);
+  _data->setName(name);
+  _data->setFileName(name + ".pos");
+  _options = new PViewOptions(*PViewOptions::reference());
+  _options->axes = 3;
+  _options->pointSize = 7.;
+  _options->pointType = 1.;
+}
+
 PView::PView(const std::string &name, const std::string &type,
              GModel *model, std::map<int, std::vector<double> > &data,
              double time, int numComp)
diff --git a/Post/PView.h b/Post/PView.h
index 98a30862d44d0dfabd03efefc4e15b4e6edf6a15..7113b495f00d778bdd110b148e341591ff234a17 100644
--- a/Post/PView.h
+++ b/Post/PView.h
@@ -47,9 +47,12 @@ class PView{
   PView(PViewData *data, int tag=-1);
   // construct a new view, alias of the view "ref"
   PView(PView *ref, bool copyOptions=true);
-  // construct a new list-based view from a simple 2D dataset
+  // construct a new list-based view from a simple 2D point dataset
   PView(const std::string &xname, const std::string &yname,
         std::vector<double> &x, std::vector<double> &y);
+  // construct a new list-based view from a simple 3D point dataset
+  PView(const std::string &name, std::vector<double> &x, std::vector<double> &y,
+        std::vector<double> &z, std::vector<double> &v);
   // construct a new mesh-based view from a bunch of data
   PView(const std::string &name, const std::string &type, GModel *model,
         std::map<int, std::vector<double> > &data, double time=0.,
diff --git a/Post/PViewData.h b/Post/PViewData.h
index ccc591397256754d4f43b05d19acf53f2ebc6944..9b5449ec1227eb610707e2891c246d09dccdd6de 100644
--- a/Post/PViewData.h
+++ b/Post/PViewData.h
@@ -245,6 +245,10 @@ class PViewData {
   // set simple X-Y data
   virtual void setXY(std::vector<double> &x, std::vector<double> &y){}
 
+  // set simple pointwise XYZ data
+  virtual void setXYZV(std::vector<double> &x, std::vector<double> &y,
+                       std::vector<double> &z, std::vector<double> &v){}
+
   // ask to fill vertex arrays remotely
   virtual bool isRemote(){ return false; }
   virtual int fillRemoteVertexArrays(std::string &options){ return 0; }
diff --git a/Post/PViewDataList.cpp b/Post/PViewDataList.cpp
index 703066aa75030d722a3114fc184214ee3adaf7ef..68162e524ad107421948daf2f5f768bf89b8f32c 100644
--- a/Post/PViewDataList.cpp
+++ b/Post/PViewDataList.cpp
@@ -45,6 +45,22 @@ void PViewDataList::setXY(std::vector<double> &x, std::vector<double> &y)
   finalize();
 }
 
+void PViewDataList::setXYZV(std::vector<double> &x, std::vector<double> &y,
+                            std::vector<double> &z, std::vector<double> &v)
+{
+  NbSP = 0;
+  SP.clear();
+  int n = std::min(std::min(std::min(x.size(), y.size()), z.size()), v.size());
+  for(int i = 0; i < n; i++){
+    SP.push_back(x[i]);
+    SP.push_back(y[i]);
+    SP.push_back(z[i]);
+    SP.push_back(v[i]);
+    NbSP++;
+  }
+  finalize();
+}
+
 bool PViewDataList::finalize(bool computeMinMax, const std::string &interpolationScheme)
 {
   BBox.reset();
@@ -666,7 +682,7 @@ bool PViewDataList::combineSpace(nameData &nd)
     dVecMerge(l->TI, TI); NbTI += l->NbTI; dVecMerge(l->SY, SY); NbSY += l->NbSY;
     dVecMerge(l->VY, VY); NbVY += l->NbVY; dVecMerge(l->TY, TY); NbTY += l->NbTY;
     dVecMerge(l->VR, VR); NbVR += l->NbVR; dVecMerge(l->TR, TR); NbTR += l->NbTR;
-    
+
     // merge strings
     for(unsigned int i = 0; i < l->T2D.size(); i += 4){
       T2D.push_back(l->T2D[i]);
diff --git a/Post/PViewDataList.h b/Post/PViewDataList.h
index 4f8459cb95a10b21e3c3a3082d6c6d9a1694def9..39e62626823afc33e2cc40ed955710d8e078da58 100644
--- a/Post/PViewDataList.h
+++ b/Post/PViewDataList.h
@@ -118,6 +118,8 @@ class PViewDataList : public PViewData {
   bool combineTime(nameData &nd);
   bool combineSpace(nameData &nd);
   void setXY(std::vector<double> &x, std::vector<double> &y);
+  void setXYZV(std::vector<double> &x, std::vector<double> &y, std::vector<double> &z,
+               std::vector<double> &v);
   bool isListBased(){ return true; }
   double getMemoryInMb();
 
diff --git a/Solver/functionSpace.h b/Solver/functionSpace.h
index 674b2a062929303bce3c2311826e6f24cf6410c9..1fcb0506e0185df70a7751ee27c8d82750301398 100644
--- a/Solver/functionSpace.h
+++ b/Solver/functionSpace.h
@@ -68,9 +68,9 @@ class FunctionSpaceBase
  public:
   virtual ~FunctionSpaceBase(){}
 	virtual int getId(void) const =0;
-  virtual int getNumKeys(MElement *ele) = 0; // if one needs the number of dofs
-  virtual void getKeys(MElement *ele, std::vector<Dof> &keys) = 0;
-  virtual void getKeysOnVertex(MElement* ele, MVertex* v, const std::vector<int>& comp, std::vector<Dof>& keys){
+  virtual int getNumKeys(MElement *ele) const = 0; // if one needs the number of dofs
+  virtual void getKeys(MElement *ele, std::vector<Dof> &keys) const = 0;
+  virtual void getKeysOnVertex(MElement* ele, MVertex* v, const std::vector<int>& comp, std::vector<Dof>& keys) const{
     Msg::Warning("this function is defined to get Dofs of vertex %d on element %d",v->getNum(),ele->getNum());
   }
 	virtual FunctionSpaceBase* clone(const int id) const {return NULL;}; // copy space with new Id
@@ -87,17 +87,17 @@ class FunctionSpace : public FunctionSpaceBase
   typedef typename TensorialTraits<T>::HessType HessType;
   typedef typename TensorialTraits<T>::ThirdDevType ThirdDevType;
   virtual int getId(void) const {return _iField;}
-  virtual void f(MElement *ele, double u, double v, double w, std::vector<ValType> &vals) = 0;
-  virtual void fuvw(MElement *ele, double u, double v, double w, std::vector<ValType> &vals) {} // should return to pure virtual once all is done.
-  virtual void gradf(MElement *ele, double u, double v, double w, std::vector<GradType> &grads) = 0;
-  virtual void gradfuvw(MElement *ele, double u, double v, double w, std::vector<GradType> &grads) {} // should return to pure virtual once all is done.
-  virtual void hessfuvw(MElement *ele, double u, double v, double w, std::vector<HessType> &hess) = 0;
-  virtual void hessf(MElement *ele, double u, double v, double w,std::vector<HessType> &hess) {} //need to high order fem
-  virtual void thirdDevfuvw(MElement *ele, double u, double v, double w,std::vector<ThirdDevType> &third){}; //need to high order fem
-  virtual void thirdDevf(MElement *ele, double u, double v, double w,std::vector<ThirdDevType> &third){}; //need to high order fem
-
-  virtual int getNumKeys(MElement *ele) = 0; // if one needs the number of dofs
-  virtual void getKeys(MElement *ele, std::vector<Dof> &keys) = 0;
+  virtual void f(MElement *ele, double u, double v, double w, std::vector<ValType> &vals) const = 0;
+  virtual void fuvw(MElement *ele, double u, double v, double w, std::vector<ValType> &vals) const {} // should return to pure virtual once all is done.
+  virtual void gradf(MElement *ele, double u, double v, double w, std::vector<GradType> &grads) const = 0;
+  virtual void gradfuvw(MElement *ele, double u, double v, double w, std::vector<GradType> &grads) const {} // should return to pure virtual once all is done.
+  virtual void hessfuvw(MElement *ele, double u, double v, double w, std::vector<HessType> &hess) const = 0;
+  virtual void hessf(MElement *ele, double u, double v, double w,std::vector<HessType> &hess) const {} //need to high order fem
+  virtual void thirdDevfuvw(MElement *ele, double u, double v, double w,std::vector<ThirdDevType> &third) const {}; //need to high order fem
+  virtual void thirdDevf(MElement *ele, double u, double v, double w,std::vector<ThirdDevType> &third) const {}; //need to high order fem
+
+  virtual int getNumKeys(MElement *ele) const = 0; // if one needs the number of dofs
+  virtual void getKeys(MElement *ele, std::vector<Dof> &keys) const = 0;
 };
 
 class ScalarLagrangeFunctionSpaceOfElement : public FunctionSpace<double>
@@ -108,14 +108,14 @@ class ScalarLagrangeFunctionSpaceOfElement : public FunctionSpace<double>
   typedef TensorialTraits<double>::HessType HessType;
 
  private:
-  virtual void getKeys(MVertex *ver, std::vector<Dof> &keys)
+  virtual void getKeys(MVertex *ver, std::vector<Dof> &keys) const
   {
     keys.push_back(Dof(ver->getNum(), _iField));
   }
 
  public:
   ScalarLagrangeFunctionSpaceOfElement(int i = 0) { _iField = i; }
-  virtual void f(MElement *ele, double u, double v, double w, std::vector<ValType> &vals)
+  virtual void f(MElement *ele, double u, double v, double w, std::vector<ValType> &vals) const
   {
     if(ele->getParent()) {
       if(ele->getTypeForMSH() == MSH_LIN_B || ele->getTypeForMSH() == MSH_TRI_B ||
@@ -129,7 +129,7 @@ class ScalarLagrangeFunctionSpaceOfElement : public FunctionSpace<double>
     ele->getShapeFunctions(u, v, w, &(vals[curpos]));
   }
   // Fonction renvoyant un vecteur contenant le grandient de chaque FF
-  virtual void gradf(MElement *ele, double u, double v, double w, std::vector<GradType> &grads)
+  virtual void gradf(MElement *ele, double u, double v, double w, std::vector<GradType> &grads) const
   {
     if(ele->getParent()) {
       if(ele->getTypeForMSH() == MSH_LIN_B || ele->getTypeForMSH() == MSH_TRI_B ||
@@ -152,7 +152,7 @@ class ScalarLagrangeFunctionSpaceOfElement : public FunctionSpace<double>
       invjac[2][0] * gradsuvw[i][0] + invjac[2][1] * gradsuvw[i][1] + invjac[2][2] * gradsuvw[i][2]));
   }
   // Fonction renvoyant un vecteur contenant le hessien [][] de chaque FF dans l'espace ISOPARAMETRIQUE
-  virtual void hessfuvw(MElement *ele, double u, double v, double w, std::vector<HessType> &hess)
+  virtual void hessfuvw(MElement *ele, double u, double v, double w, std::vector<HessType> &hess) const
   {
     if(ele->getParent()) {
       if(ele->getTypeForMSH() == MSH_LIN_B || ele->getTypeForMSH() == MSH_TRI_B ||
@@ -172,7 +172,7 @@ class ScalarLagrangeFunctionSpaceOfElement : public FunctionSpace<double>
       hess.push_back(hesst);
     }
   }
-  virtual void gradfuvw(MElement *ele, double u, double v, double w, std::vector<GradType> &grads)
+  virtual void gradfuvw(MElement *ele, double u, double v, double w, std::vector<GradType> &grads) const
   {
     if(ele->getParent()) {
       if(ele->getTypeForMSH() == MSH_LIN_B || ele->getTypeForMSH() == MSH_TRI_B ||
@@ -187,11 +187,11 @@ class ScalarLagrangeFunctionSpaceOfElement : public FunctionSpace<double>
     for(int i = 0; i < ndofs; ++i)
       grads.push_back(GradType(gradsuvw[i][0], gradsuvw[i][1], gradsuvw[i][2]));
   }
-  virtual int getNumKeys(MElement *ele)
+  virtual int getNumKeys(MElement *ele) const
   {
     return ele->getNumShapeFunctions();
   }
-  virtual void getKeys(MElement *ele, std::vector<Dof> &keys) // appends ...
+  virtual void getKeys(MElement *ele, std::vector<Dof> &keys) const // appends ...
   {
     int ndofs = ele->getNumShapeFunctions();
     keys.reserve(keys.size() + ndofs);
@@ -208,13 +208,13 @@ class ScalarLagrangeFunctionSpace : public FunctionSpace<double>
   typedef TensorialTraits<double>::HessType HessType;
 
  private:
-  virtual void getKeys(MVertex *ver, std::vector<Dof> &keys)
+  virtual void getKeys(MVertex *ver, std::vector<Dof> &keys) const
   {
     keys.push_back(Dof(ver->getNum(), _iField));
   }
  public:
   ScalarLagrangeFunctionSpace(int i = 0) { _iField = i; }
-  virtual void f(MElement *ele, double u, double v, double w, std::vector<ValType> &vals)
+  virtual void f(MElement *ele, double u, double v, double w, std::vector<ValType> &vals) const
   {
     if(ele->getParent()) ele = ele->getParent();
     int ndofs = ele->getNumShapeFunctions();
@@ -223,7 +223,7 @@ class ScalarLagrangeFunctionSpace : public FunctionSpace<double>
     ele->getShapeFunctions(u, v, w, &(vals[curpos]));
   }
   // Fonction renvoyant un vecteur contenant le grandient de chaque FF
-  virtual void gradf(MElement *ele, double u, double v, double w, std::vector<GradType> &grads)
+  virtual void gradf(MElement *ele, double u, double v, double w, std::vector<GradType> &grads) const
   {
     if(ele->getParent()) ele = ele->getParent();
     int ndofs = ele->getNumShapeFunctions();
@@ -241,7 +241,7 @@ class ScalarLagrangeFunctionSpace : public FunctionSpace<double>
       invjac[2][0] * gradsuvw[i][0] + invjac[2][1] * gradsuvw[i][1] + invjac[2][2] * gradsuvw[i][2]));
   }
   // Fonction renvoyant un vecteur contenant le hessien [][] de chaque FF dans l'espace ISOPARAMETRIQUE
-  virtual void hessfuvw(MElement *ele, double u, double v, double w, std::vector<HessType> &hess)
+  virtual void hessfuvw(MElement *ele, double u, double v, double w, std::vector<HessType> &hess) const
   {
     if(ele->getParent()) ele = ele->getParent();
     int ndofs = ele->getNumShapeFunctions();
@@ -256,7 +256,7 @@ class ScalarLagrangeFunctionSpace : public FunctionSpace<double>
       hess.push_back(hesst);
     }
   }
-  virtual void gradfuvw(MElement *ele, double u, double v, double w, std::vector<GradType> &grads)
+  virtual void gradfuvw(MElement *ele, double u, double v, double w, std::vector<GradType> &grads) const
   {
     if(ele->getParent()) ele = ele->getParent();
     int ndofs = ele->getNumShapeFunctions();
@@ -266,7 +266,7 @@ class ScalarLagrangeFunctionSpace : public FunctionSpace<double>
     for(int i = 0; i < ndofs; ++i)
       grads.push_back(GradType(gradsuvw[i][0], gradsuvw[i][1], gradsuvw[i][2]));
   }
-  virtual void fuvw(MElement *ele, double u, double v, double w,std::vector<ValType> &vals)
+  virtual void fuvw(MElement *ele, double u, double v, double w,std::vector<ValType> &vals) const
   {
     if(ele->getParent()) ele = ele->getParent();
     int ndofs= ele->getNumShapeFunctions();
@@ -276,12 +276,12 @@ class ScalarLagrangeFunctionSpace : public FunctionSpace<double>
     for(int i = 0; i < ndofs; ++i)
       vals.push_back(valsuvw[i]);
   }
-  virtual int getNumKeys(MElement *ele)
+  virtual int getNumKeys(MElement *ele) const
   {
     if(ele->getParent()) ele = ele->getParent();
     return ele->getNumShapeFunctions();
   }
-  virtual void getKeys(MElement *ele, std::vector<Dof> &keys) // appends ...
+  virtual void getKeys(MElement *ele, std::vector<Dof> &keys) const // appends ...
   {
     if(ele->getParent()) ele = ele->getParent();
     int ndofs = ele->getNumShapeFunctions();
@@ -323,7 +323,7 @@ public :
 
   virtual ~ScalarToAnyFunctionSpace() {delete ScalarFS;}
 
-  virtual void f(MElement *ele, double u, double v, double w, std::vector<ValType> &vals)
+  virtual void f(MElement *ele, double u, double v, double w, std::vector<ValType> &vals) const
   {
     std::vector<double> valsd;
     ScalarFS->f(ele, u, v, w, valsd);
@@ -337,7 +337,7 @@ public :
     }
   }
 
-  virtual void gradf(MElement *ele, double u, double v, double w, std::vector<GradType> &grads)
+  virtual void gradf(MElement *ele, double u, double v, double w, std::vector<GradType> &grads) const
   {
     std::vector<SVector3> gradsd;
     ScalarFS->gradf(ele, u, v, w, gradsd);
@@ -353,11 +353,11 @@ public :
       }
     }
   }
-  virtual void hessfuvw(MElement *ele, double u, double v, double w, std::vector<HessType> &hess)
+  virtual void hessfuvw(MElement *ele, double u, double v, double w, std::vector<HessType> &hess) const
   {
     ScalarFS->hessfuvw(ele, u, v, w, hess);
   }
-  virtual void gradfuvw(MElement *ele, double u, double v, double w, std::vector<GradType> &grads)
+  virtual void gradfuvw(MElement *ele, double u, double v, double w, std::vector<GradType> &grads) const
   {
     std::vector<SVector3> gradsd;
     ScalarFS->gradfuvw(ele, u, v, w, gradsd);
@@ -374,9 +374,9 @@ public :
     }
   }
 
-  virtual int getNumKeys(MElement *ele) {return ScalarFS->getNumKeys(ele) * comp.size();}
+  virtual int getNumKeys(MElement *ele) const {return ScalarFS->getNumKeys(ele) * comp.size();}
 
-  virtual void getKeys(MElement *ele, std::vector<Dof> &keys)
+  virtual void getKeys(MElement *ele, std::vector<Dof> &keys) const
   {
     int nk = ScalarFS->getNumKeys(ele);
     std::vector<Dof> bufk;
@@ -482,25 +482,25 @@ class CompositeFunctionSpace : public FunctionSpace<T>
     for (iterFS it = _spaces.begin(); it != _spaces.end(); ++it)
       delete (*it);
   }
-  virtual void f(MElement *ele, double u, double v, double w, std::vector<ValType> &vals)
+  virtual void f(MElement *ele, double u, double v, double w, std::vector<ValType> &vals) const
   {
     for (iterFS it = _spaces.begin(); it != _spaces.end(); ++it)
       (*it)->f(ele, u, v, w, vals);
   }
 
-  virtual void gradf(MElement *ele, double u, double v, double w, std::vector<GradType> &grads)
+  virtual void gradf(MElement *ele, double u, double v, double w, std::vector<GradType> &grads) const
   {
     for (iterFS it = _spaces.begin(); it != _spaces.end(); ++it)
       (*it)->gradf(ele, u, v, w, grads);
   }
 
-  virtual void hessfuvw(MElement *ele, double u, double v, double w, std::vector<HessType> &hess)
+  virtual void hessfuvw(MElement *ele, double u, double v, double w, std::vector<HessType> &hess) const
   {
     for (iterFS it = _spaces.begin(); it != _spaces.end(); ++it)
       (*it)->hessfuvw(ele, u, v, w, hess);
   }
 
-  virtual int getNumKeys(MElement *ele)
+  virtual int getNumKeys(MElement *ele) const
   {
     int ndofs = 0;
     for (iterFS it = _spaces.begin(); it != _spaces.end(); ++it)
@@ -508,7 +508,7 @@ class CompositeFunctionSpace : public FunctionSpace<T>
     return ndofs;
   }
 
-  virtual void getKeys(MElement *ele, std::vector<Dof> &keys)
+  virtual void getKeys(MElement *ele, std::vector<Dof> &keys) const
   {
     for (iterFS it = _spaces.begin(); it != _spaces.end(); ++it)
       (*it)->getKeys(ele, keys);
@@ -527,13 +527,13 @@ class xFemFunctionSpace : public FunctionSpace<T>
    simpleFunctionOnElement<double> *_funcEnrichment;
 
  public:
-  virtual void hessfuvw(MElement *ele, double u, double v, double w,std::vector<HessType> &hess){}
+  virtual void hessfuvw(MElement *ele, double u, double v, double w,std::vector<HessType> &hess) const {}
   xFemFunctionSpace(FunctionSpace<T>* spacebase,simpleFunctionOnElement<double> *funcEnrichment) :
     _spacebase(spacebase),_funcEnrichment(funcEnrichment){}
-  virtual void f(MElement *ele, double u, double v, double w,std::vector<ValType> &vals);
-  virtual void gradf(MElement *ele, double u, double v, double w,std::vector<GradType> &grads);
-  virtual int getNumKeys(MElement *ele);
-  virtual void getKeys(MElement *ele, std::vector<Dof> &keys);
+  virtual void f(MElement *ele, double u, double v, double w,std::vector<ValType> &vals) const ;
+  virtual void gradf(MElement *ele, double u, double v, double w,std::vector<GradType> &grads) const;
+  virtual int getNumKeys(MElement *ele) const;
+  virtual void getKeys(MElement *ele, std::vector<Dof> &keys) const;
 };
 
 
@@ -548,16 +548,16 @@ class FilteredFunctionSpace : public FunctionSpace<T>
   FunctionSpace<T>* _spacebase;
   F *_filter;
  public:
-  virtual void hessfuvw(MElement *ele, double u, double v, double w, std::vector<HessType> &hess){}
+  virtual void hessfuvw(MElement *ele, double u, double v, double w, std::vector<HessType> &hess) const {}
   FilteredFunctionSpace<T,F>(FunctionSpace<T>* spacebase,F * filter) : _spacebase(spacebase), _filter(filter){}
-  virtual void f(MElement *ele, double u, double v, double w, std::vector<ValType> &vals);
-  virtual void gradf(MElement *ele, double u, double v, double w, std::vector<GradType> &grads);
-  virtual int getNumKeys(MElement *ele);
-  virtual void getKeys(MElement *ele, std::vector<Dof> &keys);
+  virtual void f(MElement *ele, double u, double v, double w, std::vector<ValType> &vals) const;
+  virtual void gradf(MElement *ele, double u, double v, double w, std::vector<GradType> &grads) const;
+  virtual int getNumKeys(MElement *ele) const;
+  virtual void getKeys(MElement *ele, std::vector<Dof> &keys) const;
 };
 
 
-template <class T> void xFemFunctionSpace<T>::f(MElement *ele, double u, double v, double w, std::vector<ValType> &vals)
+template <class T> void xFemFunctionSpace<T>::f(MElement *ele, double u, double v, double w, std::vector<ValType> &vals) const
 {
    // We need parent parameters
   MElement * elep;
@@ -586,7 +586,7 @@ template <class T> void xFemFunctionSpace<T>::f(MElement *ele, double u, double
   }
 }
 
-template <class T> void xFemFunctionSpace<T>::gradf(MElement *ele, double u, double v, double w, std::vector<GradType> &grads)
+template <class T> void xFemFunctionSpace<T>::gradf(MElement *ele, double u, double v, double w, std::vector<GradType> &grads) const
 {
 
     // We need parent parameters
@@ -629,7 +629,7 @@ template <class T> void xFemFunctionSpace<T>::gradf(MElement *ele, double u, dou
   }
 }
 
-template <class T> int xFemFunctionSpace<T>::getNumKeys(MElement *ele)
+template <class T> int xFemFunctionSpace<T>::getNumKeys(MElement *ele) const
 {
   MElement *elep;
   if (ele->getParent()) elep = ele->getParent();
@@ -638,7 +638,7 @@ template <class T> int xFemFunctionSpace<T>::getNumKeys(MElement *ele)
   return nbdofs;
 }
 
-template <class T> void xFemFunctionSpace<T>::getKeys(MElement *ele, std::vector<Dof> &keys)
+template <class T> void xFemFunctionSpace<T>::getKeys(MElement *ele, std::vector<Dof> &keys) const
 {
   MElement *elep;
   if (ele->getParent()) elep = ele->getParent();
@@ -668,7 +668,7 @@ template <class T> void xFemFunctionSpace<T>::getKeys(MElement *ele, std::vector
 // Filtered function space
 //
 
-template <class T,class F> void FilteredFunctionSpace<T,F>::f(MElement *ele, double u, double v, double w, std::vector<ValType> &vals)
+template <class T,class F> void FilteredFunctionSpace<T,F>::f(MElement *ele, double u, double v, double w, std::vector<ValType> &vals) const
 {
     // We need parent parameters
   MElement *elep;
@@ -691,7 +691,7 @@ template <class T,class F> void FilteredFunctionSpace<T,F>::f(MElement *ele, dou
 }
 
 
-template <class T,class F> void FilteredFunctionSpace<T,F>::gradf(MElement *ele, double u, double v, double w, std::vector<GradType> &grads)
+template <class T,class F> void FilteredFunctionSpace<T,F>::gradf(MElement *ele, double u, double v, double w, std::vector<GradType> &grads) const
 {
     // We need parent parameters
   MElement *elep;
@@ -714,7 +714,7 @@ template <class T,class F> void FilteredFunctionSpace<T,F>::gradf(MElement *ele,
   }
 }
 
-template <class T,class F> int FilteredFunctionSpace<T,F>::getNumKeys(MElement *ele)
+template <class T,class F> int FilteredFunctionSpace<T,F>::getNumKeys(MElement *ele) const
 {
   MElement *elep;
   if (ele->getParent()) elep = ele->getParent();
@@ -734,7 +734,7 @@ template <class T,class F> int FilteredFunctionSpace<T,F>::getNumKeys(MElement *
   return nbdofs;
 }
 
-template <class T, class F> void FilteredFunctionSpace<T, F>::getKeys(MElement *ele, std::vector<Dof> &keys)
+template <class T, class F> void FilteredFunctionSpace<T, F>::getKeys(MElement *ele, std::vector<Dof> &keys) const
 {
   MElement *elep;
   if (ele->getParent()) elep = ele->getParent();
diff --git a/Solver/solverField.h b/Solver/solverField.h
index d3afd87ac94fc52110af9af554da8aa129c51673..d366dfb52f1eb293ba4fe47e6112a6e4d4a9e79a 100644
--- a/Solver/solverField.h
+++ b/Solver/solverField.h
@@ -28,14 +28,14 @@ class SolverField : public FunctionSpace<T> // being able to use it instead of a
   FunctionSpace<T> *fs;
  public:
   SolverField(dofManager<double> *dm_, FunctionSpace<T> *fs_) : dm(dm_), fs(fs_) {}
-  virtual int getNumKeys(MVertex *ver) { return 1;}
-  virtual int getNumKeys(MElement *ele) { return 1;}
+  virtual int getNumKeys(MVertex *ver) const { return 1;}
+  virtual int getNumKeys(MElement *ele)  const { return 1;}
  private:
-  virtual void getKeys(MElement *ele, std::vector<Dof> &keys) { Msg::Error("getKeys for SolverField should'nt be called");}
-  virtual void getKeys(MVertex *ver, std::vector<Dof> &keys) {Msg::Error("getKeys for SolverField should'nt be called");}
+  virtual void getKeys(MElement *ele, std::vector<Dof> &keys) const { Msg::Error("getKeys for SolverField shouldn't be called");}
+  virtual void getKeys(MVertex *ver, std::vector<Dof> &keys) const {Msg::Error("getKeys for SolverField shouldn't be called");}
  public:
 
-  virtual void f(MElement *ele, double u, double v, double w, ValType &val)
+  virtual void f(MElement *ele, double u, double v, double w, ValType &val) const
   {
     std::vector<Dof> D;
     std::vector<ValType> SFVals;
@@ -48,14 +48,14 @@ class SolverField : public FunctionSpace<T> // being able to use it instead of a
       val += SFVals[i] * DMVals[i];
   }
 
-  virtual void f(MElement *ele, double u, double v, double w, std::vector<ValType> &vals)
+  virtual void f(MElement *ele, double u, double v, double w, std::vector<ValType> &vals) const
   {
     ValType val;
     f(ele, u, v, w, val);
     vals.push_back(val);
   }
 
-  virtual void gradf(MElement *ele, double u, double v, double w, GradType &grad)
+  virtual void gradf(MElement *ele, double u, double v, double w, GradType &grad) const
   {
     std::vector<Dof> D;
     std::vector<GradType> SFGrads;
@@ -84,13 +84,13 @@ class SolverField : public FunctionSpace<T> // being able to use it instead of a
 //      hess += SFHess[i] * DMVals[i];
   }*/
 
-  virtual void gradf(MElement *ele, double u, double v, double w, std::vector<GradType> &grads)
+  virtual void gradf(MElement *ele, double u, double v, double w, std::vector<GradType> &grads) const
   {
     GradType grad;
     gradf(ele, u, v, w, grad);
     grads.push_back(grad);
   }
-    virtual void hessfuvw(MElement *ele, double u, double v, double w, std::vector<HessType> &hess)
+    virtual void hessfuvw(MElement *ele, double u, double v, double w, std::vector<HessType> &hess) const
   {
     //HessType hes;
     fs->hessfuvw(ele, u, v, w, hess);
diff --git a/benchmarks/2d/SFR.geo b/benchmarks/2d/SFR.geo
index dc7a2253d6158db15d344e9067e937f063edc2f6..dbdd4fafdb1d0292d9a048877890181001cd7473 100644
--- a/benchmarks/2d/SFR.geo
+++ b/benchmarks/2d/SFR.geo
@@ -130,11 +130,11 @@ NbAss_0=16 ;
 NbAss_1=110 ;
 NbAss_2=1 ;
 NbAss_3=0;
- 
+
 ep_ass=206.3 ;
 pas_ass=210.3 ;
 diam_pnl=206.3 ;
- 
+
 r1=4400 ;
 r2=7900 ;
 r3=2450 ;
@@ -161,7 +161,7 @@ h5=1000 ;
 //				//
 //////////////////////////////////
 
-rap1=0.4; 
+rap1=0.4;
 r1=rap1*4400 ;
 r2=rap1*7900 ;
 r3=1.5*rap1*2450 ;
@@ -182,12 +182,12 @@ i_conf = 0;
 itype_PNL = 0;		// geometrie des P.N.L : 0 : hexagonale - 1 : Circulaire - 2 : Octogonale
 
 
-/////////////////////////////// 
+///////////////////////////////
 // param�tres de discr�tisation
 ///////////////////////////////
 
 nbpt_ssbcc = 5;		// nombre de couche entre la sortie coeur et le bcc
- 
+
 lcar  = pas_ass;	// longeur caracteristique associee aux assemblages - reflecteurs - P.N.L.
 lcar2 = 3.*lcar;	// longeur caracteristique associee a la partie inferieure de la virole du Collecteur Chaud (en-dessous de l'epaulement)
 lcar3 = 8.*lcar;	// longeur caracteristique associee a la partie superieure de la virole du Collecteur Chaud (au-dessus de l'epaulement)
@@ -4404,7 +4404,7 @@ indice1++; c[indice1]=newreg; Line(c[indice1]) = { p4, p5 } ;
 indice1++; c[indice1]=newreg; Line(c[indice1]) = { p5, p6 } ;
 indice1++; c[indice1]=newreg; Line(c[indice1]) = { p6, p1 } ;
 
-nassemblage++; lbord[nassemblage]=newreg; 
+nassemblage++; lbord[nassemblage]=newreg;
 Line Loop(lbord[nassemblage]) = { c[{ indice1-5:indice1 }] } ;
 ass[nassemblage]=newreg; Plane Surface(ass[nassemblage]) = { lbord[nassemblage] } ;
 Point { pc } In Surface { ass[nassemblage] } ;
@@ -4448,12 +4448,12 @@ l66=newreg; Line(l66) = { p6, p6h } ;
 
 Transfinite Line { l11 , l22 , l33 , l44 , l55 , l66 } = nbpt_ssbcc ;
 
-surf_lat1 = newreg; Line Loop(surf_lat1) = { c0b[indice0-5], l22 , -c0h[indice0-5] , -l11 } ; 
-surf_lat2 = newreg; Line Loop(surf_lat2) = { c0b[indice0-4], l33 , -c0h[indice0-4] , -l22 } ; 
-surf_lat3 = newreg; Line Loop(surf_lat3) = { c0b[indice0-3], l44 , -c0h[indice0-3] , -l33 } ; 
-surf_lat4 = newreg; Line Loop(surf_lat4) = { c0b[indice0-2], l55 , -c0h[indice0-2] , -l44 } ; 
-surf_lat5 = newreg; Line Loop(surf_lat5) = { c0b[indice0-1], l66 , -c0h[indice0-1] , -l55 } ; 
-surf_lat6 = newreg; Line Loop(surf_lat6) = { c0b[indice0  ], l11 , -c0h[indice0  ] , -l66 } ; 
+surf_lat1 = newreg; Line Loop(surf_lat1) = { c0b[indice0-5], l22 , -c0h[indice0-5] , -l11 } ;
+surf_lat2 = newreg; Line Loop(surf_lat2) = { c0b[indice0-4], l33 , -c0h[indice0-4] , -l22 } ;
+surf_lat3 = newreg; Line Loop(surf_lat3) = { c0b[indice0-3], l44 , -c0h[indice0-3] , -l33 } ;
+surf_lat4 = newreg; Line Loop(surf_lat4) = { c0b[indice0-2], l55 , -c0h[indice0-2] , -l44 } ;
+surf_lat5 = newreg; Line Loop(surf_lat5) = { c0b[indice0-1], l66 , -c0h[indice0-1] , -l55 } ;
+surf_lat6 = newreg; Line Loop(surf_lat6) = { c0b[indice0  ], l11 , -c0h[indice0  ] , -l66 } ;
 
 nbarre_lat++ ; barre_lat[nbarre_lat]=newreg; Ruled Surface(barre_lat[nbarre_lat]) = { surf_lat1 } ;
 nbarre_lat++ ; barre_lat[nbarre_lat]=newreg; Ruled Surface(barre_lat[nbarre_lat]) = { surf_lat2 } ;
@@ -4462,14 +4462,14 @@ nbarre_lat++ ; barre_lat[nbarre_lat]=newreg; Ruled Surface(barre_lat[nbarre_lat]
 nbarre_lat++ ; barre_lat[nbarre_lat]=newreg; Ruled Surface(barre_lat[nbarre_lat]) = { surf_lat5 } ;
 nbarre_lat++ ; barre_lat[nbarre_lat]=newreg; Ruled Surface(barre_lat[nbarre_lat]) = { surf_lat6 } ;
 
-nbarre++; 
+nbarre++;
 lbord0b[nbarre]=newreg; Line Loop(lbord0b[nbarre]) = { c0b[{ indice0-5:indice0 }] } ;
 lbord0h[nbarre]=newreg; Line Loop(lbord0h[nbarre]) = { c0h[{ indice0-5:indice0 }] } ;
 barre[nbarre]=newreg; Plane Surface(barre[nbarre]) = { lbord0b[nbarre] } ;
 Point { pc } In Surface { barre[nbarre] } ;
 
 
-//nassemblage++; lbord[nassemblage]=newreg; 
+//nassemblage++; lbord[nassemblage]=newreg;
 //Line Loop(lbord[nassemblage]) = { c[{ indice1-5:indice1 }] } ;
 //ass[nassemblage]=newreg; Plane Surface(ass[nassemblage]) = { lbord[nassemblage] } ;
 //Point { pc } In Surface { ass[nassemblage] } ;
@@ -4499,7 +4499,7 @@ indice2++; c2[indice2]=newreg; Line(c2[indice2]) = { p4, p5 } ;
 indice2++; c2[indice2]=newreg; Line(c2[indice2]) = { p5, p6 } ;
 indice2++; c2[indice2]=newreg; Line(c2[indice2]) = { p6, p1 } ;
 
-nreflecteur++; lbord2[nreflecteur]=newreg; 
+nreflecteur++; lbord2[nreflecteur]=newreg;
 Line Loop(lbord2[nreflecteur]) = { c2[{ indice2-5:indice2 }] } ;
 refl[nreflecteur]=newreg; Plane Surface(refl[nreflecteur]) = { lbord2[nreflecteur] } ;
 Point { pc } In Surface { refl[nreflecteur] } ;
@@ -4536,7 +4536,7 @@ indice4++; c4[indice4]=newreg; Line(c4[indice4]) = { p4, p5 } ;
 indice4++; c4[indice4]=newreg; Line(c4[indice4]) = { p5, p6 } ;
 indice4++; c4[indice4]=newreg; Line(c4[indice4]) = { p6, p1 } ;
 
-npnl++; lbord3[npnl]=newreg; 
+npnl++; lbord3[npnl]=newreg;
 Line Loop(lbord3[npnl]) = { c4[{ indice4-5:indice4 }] } ;
 pnl[npnl]=newreg; Plane Surface(pnl[npnl]) = { lbord3[npnl] } ;
 Point { pc } In Surface { pnl[npnl] } ;
@@ -4564,7 +4564,7 @@ indice4++; c4[indice4]=newreg; Circle(c4[indice4]) = { p2, pc, p3 } ;
 indice4++; c4[indice4]=newreg; Circle(c4[indice4]) = { p3, pc, p4 } ;
 indice4++; c4[indice4]=newreg; Circle(c4[indice4]) = { p4, pc, p1 } ;
 
-npnl++; lbord3[npnl]=newreg; 
+npnl++; lbord3[npnl]=newreg;
 Line Loop(lbord3[npnl]) = { c4[{ indice4-3:indice4 }] } ;
 pnl[npnl]=newreg; Plane Surface(pnl[npnl]) = { lbord3[npnl] } ;
 Point { pc } In Surface { pnl[npnl] } ;
@@ -4602,7 +4602,7 @@ indice4++; c4[indice4]=newreg; Line(c4[indice4]) = { p7, p8 } ;
 indice4++; c4[indice4]=newreg; Line(c4[indice4]) = { p8, p1 } ;
 
 
-npnl++; lbord3[npnl]=newreg; 
+npnl++; lbord3[npnl]=newreg;
 Line Loop(lbord3[npnl]) = { c4[{ indice4-7:indice4 }] } ;
 pnl[npnl]=newreg; Plane Surface(pnl[npnl]) = { lbord3[npnl] } ;
 Point { pc } In Surface { pnl[npnl] } ;
@@ -4718,12 +4718,12 @@ EndIf
 If (i_mesh!=2)
 
 ////////////////////////////////////
-// Generation des barres de commande 
+// Generation des barres de commande
 ////////////////////////////////////
 
   nbbarre=0;
   For k In { 0:NbAss_0-1 }
-   
+
    i=M0[k]-M_0;
    j=N0[k]-M_0;
 
@@ -4731,14 +4731,14 @@ If (i_mesh!=2)
    yc = y0+i*0.5*pas_ass+j*pas_ass;
 
    Call barre;
-   
+
    nbbarre++;
 
   EndFor
 Printf(" %g barres cr��s " , nbbarre ) ;
 
 /////////////////////////////
-// Generation des assemblages 
+// Generation des assemblages
 /////////////////////////////
 
 If (i_conf==1)
@@ -4754,7 +4754,7 @@ If (i_conf==1)
    yc = y0+i*0.5*pas_ass+j*pas_ass;
 
    Call assemblage;
-   
+
    nbass++;
 
  EndFor
@@ -4772,7 +4772,7 @@ If (i_conf==0)
 EndIf
 
 /////////////////////////////
-// Generation des reflecteurs 
+// Generation des reflecteurs
 /////////////////////////////
 
 If (i_conf==1)
@@ -4788,7 +4788,7 @@ If (i_conf==1)
    yc = y0+i*0.5*pas_ass+j*pas_ass;
 
    Call reflecteur;
-   
+
    nbrefl++;
 
  EndFor
@@ -4798,7 +4798,7 @@ Printf(" %g reflecteurs cr
 EndIf
 
 /////////////////////////////
-// Generation des P.N.L. 
+// Generation des P.N.L.
 /////////////////////////////
 
    nbpnl=0;
@@ -4812,7 +4812,7 @@ EndIf
    yc = y0+i*0.5*pas_ass+j*pas_ass;
 
    Call pnl;
-   
+
    nbpnl++;
 
  EndFor
@@ -4966,7 +4966,7 @@ For i In { 0:2 }  // Pompes
   yc = (y0+r4)*Sin(i*2*Pi/3);
 
 Call pompe_echangeur ;
- 
+
 EndFor
 
 
@@ -4978,7 +4978,7 @@ For i In { 0:2 }  // Echangeurs_gauche
   yc = (y0+r4)*Sin(i*2*Pi/3+alpha);
 
 Call pompe_echangeur ;
- 
+
 EndFor
 
 For i In { 0:2 }  // Echangeurs_droite
@@ -4987,7 +4987,7 @@ For i In { 0:2 }  // Echangeurs_droite
   yc = (y0+r4)*Sin(i*2*Pi/3-alpha);
 
 Call pompe_echangeur ;
- 
+
 EndFor
 
 
@@ -4995,10 +4995,10 @@ EndFor
 // Generation des surfaces et des volumes du collecteur
 ///////////////////////////////////////////////////////
 
-l1 = newreg; Line(l1) = { p21 , p31 } ;  l5 = newreg; Line(l5) = { p41 , p51 } ; 
-l2 = newreg; Line(l2) = { p22 , p32 } ;  l6 = newreg; Line(l6) = { p42 , p52 } ; 
-l3 = newreg; Line(l3) = { p23 , p33 } ;  l7 = newreg; Line(l7) = { p43 , p53 } ; 
-l4 = newreg; Line(l4) = { p24 , p34 } ;  l8 = newreg; Line(l8) = { p44 , p54 } ; 
+l1 = newreg; Line(l1) = { p21 , p31 } ;  l5 = newreg; Line(l5) = { p41 , p51 } ;
+l2 = newreg; Line(l2) = { p22 , p32 } ;  l6 = newreg; Line(l6) = { p42 , p52 } ;
+l3 = newreg; Line(l3) = { p23 , p33 } ;  l7 = newreg; Line(l7) = { p43 , p53 } ;
+l4 = newreg; Line(l4) = { p24 , p34 } ;  l8 = newreg; Line(l8) = { p44 , p54 } ;
 
 l1b = newreg; Line(l1b) = { p11 , p11b } ;
 l2b = newreg; Line(l2b) = { p12 , p12b } ;
@@ -5036,7 +5036,7 @@ collecteur[0] = newreg ;
 
 If(h1b==0.)
 Surface Loop(collecteur[0]) = { surf1, surf3, surf4, inter_ass,
- 				barre_lat[], ass[], refl[], pnl[], 
+ 				barre_lat[], ass[], refl[], pnl[],
 				sl1, sl2, sl3, sl4, sl5, sl6, sl7, sl8 ,
 				sl9[], sl10[], sl11[], sl12[],
 				sl9b[], sl10b[], sl11b[], sl12b[],
@@ -5045,7 +5045,7 @@ EndIf
 
 If(h1b>0.)
 Surface Loop(collecteur[0]) = { surf1, surf3, surf4, inter_ass,
- 				barre_lat[], ass[], refl[], pnl[], 
+ 				barre_lat[], ass[], refl[], pnl[],
 				sl1, sl2, sl3, sl4, sl1b, sl2b, sl3b, sl4b, sl5, sl6, sl7, sl8 ,
 				sl9[], sl10[], sl11[], sl12[],
 				sl9b[], sl10b[], sl11b[], sl12b[],
@@ -5075,4 +5075,3 @@ EndIf
 
 EndIf
 
-Show "*";
diff --git a/benchmarks/2d/embedded_points.geo b/benchmarks/2d/embedded_points.geo
index 026c83d6a8f11bd8d911bd59f4aa3554b076d5b1..a27d11a49321daf76864adc0b69150202a32b1a2 100644
--- a/benchmarks/2d/embedded_points.geo
+++ b/benchmarks/2d/embedded_points.geo
@@ -137,9 +137,9 @@ Mesh.SaveGroupsOfNodes = 1;
 
 
 // Get total number of Lines and Surfaces
-// ll[] = Line "*";
-// ss[] = Surface "*" ;
-// pp[] = Point "*";
+// ll[] = Line {:};
+// ss[] = Surface {:} ;
+// pp[] = Point {:};
 // Printf("Number of Lines in the geometry: %g", #ll[]) ;
 // Printf("Number of Surfaces in the geometry : %g", #ss[]) ;
 // Printf("Number of Points in the geometry : %g", #pp[]) ;
diff --git a/benchmarks/3d/fire2_3d.geo b/benchmarks/3d/fire2_3d.geo
index 61fcd33729bd6d36712eb16e0022f57ef2839f36..64b4b726a6ed8753bb51192b0ea9d8212380fbf7 100644
--- a/benchmarks/3d/fire2_3d.geo
+++ b/benchmarks/3d/fire2_3d.geo
@@ -570,6 +570,6 @@ Surface Loop(410) = {158, 355, 353, 332, 234, 202};
 Volume(411) = {410};
 
 
-Recombine Surface "*";
-Transfinite Surface "*";
-Transfinite Volume "*";
+Recombine Surface {:};
+Transfinite Surface {:};
+Transfinite Volume {:};
diff --git a/benchmarks/3d/induction3.geo b/benchmarks/3d/induction3.geo
index 9eab2331b55b95260b7c9429f44e1e17af1d03b4..5a1800b100e761c465cbda86daf8643cfa045db5 100644
--- a/benchmarks/3d/induction3.geo
+++ b/benchmarks/3d/induction3.geo
@@ -456,7 +456,7 @@ Transfinite Line{3000108,-3000111,3000120,3000121,3000112,-3000109} =nbind Using
 Transfinite Line{3000123,3000124,3000171,3000169} = 6 Using Power 1.0;
 Transfinite Line{3000174,3000175,3000176,3000177,3000178,3000168,3000179,3000165} = nbext Using Power pwext;
 
-// COUCHE 4 
+// COUCHE 4
 
 Point(4000001) = { -largint/4 , 0 , h4 , p1 };
 Point(4000002) = {  largint/4 , 0 , h4 , p1 };
@@ -598,7 +598,7 @@ Transfinite Line{4000108,-4000111,4000120,4000121,4000112,-4000109} =nbind Using
 Transfinite Line{4000123,4000124,4000171,4000169} = 6 Using Power 1.0;
 Transfinite Line{4000174,4000175,4000176,4000177,4000178,4000168,4000179,4000165} = nbext Using Power pwext;
 
-// COUCHE 5 
+// COUCHE 5
 
 Point(5000001) = { -largint/4 , 0 , h5 , p1 };
 Point(5000002) = {  largint/4 , 0 , h5 , p1 };
@@ -1487,9 +1487,9 @@ Surface Loop(9000330) = {9000303,9000315,9000317,5000185,-9000307,4000185};
 Volume(9000331) = {9000330};
 //Surface Loop(9000210) = {4000144,4000142,4000140,9000195,5000140,5000142,5000144,-9000199,-9000197,-9000201,-9000203,9000205,-9000207,9000209};
 
-Transfinite Surface "*";
-Recombine Surface "*";
-Transfinite Volume "*";
+Transfinite Surface {:};
+Recombine Surface {:};
+Transfinite Volume {:};
 
 //Entites physiques
 
diff --git a/benchmarks/3d/sphere_hexa.geo b/benchmarks/3d/sphere_hexa.geo
index d8d5956e7dc36c6e00bf8b177ec75fd6ee08e8ec..c49b3d94f641644e1d1a7733776d4a33a9279a61 100644
--- a/benchmarks/3d/sphere_hexa.geo
+++ b/benchmarks/3d/sphere_hexa.geo
@@ -60,10 +60,10 @@ Surface Loop(90) = {45,-77,-79,-27,83,81};Volume(91) = {90};
 Surface Loop(92) = {40,-81,-71,-28,73,-65};Volume(93) = {92};
 Surface Loop(94) = {34,61,-75,77,69,6};Volume(95) = {94};
 
-Transfinite Line "*" = n;
-Transfinite Surface "*";
-Recombine Surface "*";
-Transfinite Volume "*";
+Transfinite Line {:} = n;
+Transfinite Surface {:};
+Recombine Surface {:};
+Transfinite Volume {:};
 
 // group all hexas in a single volume
 Physical Volume(1) = {1, 85:95:2};
diff --git a/benchmarks/3d/sphere_in_cube_hexa.geo b/benchmarks/3d/sphere_in_cube_hexa.geo
index d0a1841cdc79ff192320e5f26d2db85d8174d724..544f482af76904186b3af572979ef50da6073ab0 100644
--- a/benchmarks/3d/sphere_in_cube_hexa.geo
+++ b/benchmarks/3d/sphere_in_cube_hexa.geo
@@ -72,9 +72,9 @@ Surface Loop(94) = {27,-71,-45,-73,-75,-69}; Volume(95) = {94};
 Transfinite Line {53, 59, 52, 58, 55, 56, 54, 57} = n Using Progression progr;
 Transfinite Line {42, 44, 30, 32, 36, 41, 29, 31, 9, 1, 8, 4, 11, 3, 10, 2,
                   18, 22, 14, 13, 39, 49, 37, 47} = n2;
-Transfinite Surface "*";
-Recombine Surface "*";
-Transfinite Volume "*";
+Transfinite Surface {:};
+Recombine Surface {:};
+Transfinite Volume {:};
 
 Physical Volume(1) = {85:95:2}; // ext volume
 Physical Surface(100) = {34,35,40,45,50,51}; // int surf
diff --git a/benchmarks/3d/sphere_in_sphere_hexa.geo b/benchmarks/3d/sphere_in_sphere_hexa.geo
index 2258d428879d3b012d1ba8a67a11df5aef6cebf0..4d8f348a8b3718617b2d621c51b344a64963cc08 100644
--- a/benchmarks/3d/sphere_in_sphere_hexa.geo
+++ b/benchmarks/3d/sphere_in_sphere_hexa.geo
@@ -26,10 +26,10 @@ c9 = newl; Circle(c9) = {p1,p0,p5};
 c10 = newl; Circle(c10) = {p2,p0,p6};
 c11 = newl; Circle(c11) = {p3,p0,p7};
 c12 = newl; Circle(c12) = {p4,p0,p8};
-l1 = newll; Line Loop(l1) = {c1,c2,c3,c4}; 
-l2 = newll; Line Loop(l2) = {c5,c6,c7,c8}; 
-l3 = newll; Line Loop(l3) = {c1,c10,-c5,-c9}; 
-l4 = newll; Line Loop(l4) = {c2,c11,-c6,-c10}; 
+l1 = newll; Line Loop(l1) = {c1,c2,c3,c4};
+l2 = newll; Line Loop(l2) = {c5,c6,c7,c8};
+l3 = newll; Line Loop(l3) = {c1,c10,-c5,-c9};
+l4 = newll; Line Loop(l4) = {c2,c11,-c6,-c10};
 l5 = newll; Line Loop(l5) = {c3,c12,-c7,-c11};
 l6 = newll; Line Loop(l6) = {c4,c9,-c8,-c12};
 s1 = news; Surface(s1) = {l1};
@@ -76,9 +76,9 @@ Surface Loop(5) = {23,-102,-111,106,-47,110}; Volume(5) = {5};
 Surface Loop(6) = {24,-103,-108,107,-48,111}; Volume(6) = {6};
 
 Transfinite Line{100:107} = n_layer;
-Transfinite Surface "*";
-Recombine Surface "*";
-Transfinite Volume "*";
+Transfinite Surface {:};
+Recombine Surface {:};
+Transfinite Volume {:};
 
 Physical Volume(1) = {1:6};
 Physical Surface(2) = {19:24}; // inner
diff --git a/benchmarks/3d/transfinite_auto.geo b/benchmarks/3d/transfinite_auto.geo
index 8d642c6fedc733d0ddb2cd78205863f46e512ae6..b30eb4a8c5a82f23e49f309c2a18b22b463dc581 100644
--- a/benchmarks/3d/transfinite_auto.geo
+++ b/benchmarks/3d/transfinite_auto.geo
@@ -1,7 +1,7 @@
-/********************************************************************* 
+/*********************************************************************
  *
  *  Gmsh tutorial 6
- * 
+ *
  *  Transfinite meshes
  *
  *********************************************************************/
@@ -55,13 +55,13 @@ Point(25) = {r_inf, 0, r_inf, lc2} ;
 Point(26) = {r_inf*Cos(phi1), r_inf*Sin(phi1),  r_inf, lc2} ;
 
 Circle(1) = {2,1,19};  Circle(2) = {19,1,6};  Circle(3) = {3,1,21};
-Circle(4) = {21,1,7};  Circle(5) = {4,1,23};  Circle(6) = {23,1,8};   
+Circle(4) = {21,1,7};  Circle(5) = {4,1,23};  Circle(6) = {23,1,8};
 Line(7)   = {5,25};    Line(8)   = {25,9};
 Circle(9) = {10,1,20}; Circle(10)= {20,1,6};  Circle(11) = {11,1,22};
 Circle(12)= {22,1,7};  Circle(13)= {12,1,24}; Circle(14) = {24,1,8};
 Line(15)  = {13,26};   Line(16)  = {26,9};
 Circle(17)= {19,1,20}; Circle(18)= {21,1,22}; Circle(19) = {23,1,24};
-Circle(20)= {25,1,26}; Circle(21)= {2,1,10};  Circle(22) = {3,1,11};  
+Circle(20)= {25,1,26}; Circle(21)= {2,1,10};  Circle(22) = {3,1,11};
 Circle(23)= {4,1,12};  Circle(24)= {5,1,13};
 
 Line(25) = {1,14};  Line(26) = {14,2};  Line(27) = {2,3};
@@ -191,7 +191,7 @@ Transfinite Surface{103} = {24,23,25,26};
 Transfinite Surface{119} = {9,26,25};
 Transfinite Surface{117} = {13,5,25,26};
 */
-Transfinite Surface "*"; // easier, isn't it?
+Transfinite Surface {:}; // easier, isn't it?
 
 // 3. Transfinite volumes are also defined by an ordered list of the
 // points on their boundary (the ordering defines the ordering of the
@@ -207,7 +207,7 @@ Transfinite Volume{141} = {7,22,21,8,24,23};
 Transfinite Volume{143} = {12,4,5,13,24,23,25,26};
 Transfinite Volume{145} = {8,24,23,9,26,25};
 */
-Transfinite Volume "*"; // hmmm?
+Transfinite Volume {:}; // hmmm?
 
 // As with Extruded meshes, the `Recombine' command tells Gmsh to
 // recombine the simplices into quadrangles, prisms or hexahedra when
@@ -215,7 +215,7 @@ Transfinite Volume "*"; // hmmm?
 /*
 Recombine Surface {55:127};
 */
-Recombine Surface "*";
+Recombine Surface {:};
 
 // We finish by defing some physical entities:
 
diff --git a/benchmarks/3d/transform_control_points.geo b/benchmarks/3d/transform_control_points.geo
index 664691a4319d7d8b30de9fce9ae710de88c2f2db..520faa44d16ca904281c8bbb4075201dee1a93b9 100644
--- a/benchmarks/3d/transform_control_points.geo
+++ b/benchmarks/3d/transform_control_points.geo
@@ -978,6 +978,4 @@ Transfinite Line {375, 374, 377, 376} = 17 Using Progression 1;
 //+
 Transfinite Line {379, 378, 381, 380} = 20 Using Progression 1;
 
-//+
-Show "*";
-//+
+
diff --git a/benchmarks/extrude_quadtri/READMEQUADTRI.txt b/benchmarks/extrude_quadtri/READMEQUADTRI.txt
index 2c5cf8e2528e3f53f4da90f1f1ab3b266344349a..86a5eea82d74c734c41ce7538e7f4acfef8ed30a 100644
--- a/benchmarks/extrude_quadtri/READMEQUADTRI.txt
+++ b/benchmarks/extrude_quadtri/READMEQUADTRI.txt
@@ -182,10 +182,10 @@ a. FOR TRANSFINITE VOLUMES:
 The transfinite QuadTri algorithm may be applied by using the following
 command:
 
-TransfQuadTri { expression-list } | "*";
+TransfQuadTri { expression-list } | {:};
 
 Where 'expression-list' is a list of volume numbers to apply QuadTri to.
-"*" is used to apply TransfQuadTri to all existing volumes.  A transfinite
+{:} is used to apply TransfQuadTri to all existing volumes.  A transfinite
 volume with any combination of recombined and un-recombined transfinite boundary
 surfaces is valid when meshed with TransfQuadTri. When applied to 
 non-Transfinite volumes, TransfQuadTri has NO effect on those volumes.
diff --git a/benchmarks/iges/cube1000.geo b/benchmarks/iges/cube1000.geo
index 6fb9fc0e617188750f1f458878fa7e66b1ebfb5e..8c86c3b428f70d25e09dcc48a114ddd652bdf9d3 100644
--- a/benchmarks/iges/cube1000.geo
+++ b/benchmarks/iges/cube1000.geo
@@ -5,7 +5,7 @@ Merge "cube1000.igs";
 Surface Loop(1) = {1:6};
 Volume(1) = 1;
 
-Transfinite Line "*" = 10;
-Transfinite Surface "*";
-Recombine Surface "*";
-Transfinite Volume "*";
+Transfinite Line {:} = 10;
+Transfinite Surface {:};
+Recombine Surface {:};
+Transfinite Volume {:};
diff --git a/benchmarks/misc/visibility.geo b/benchmarks/misc/visibility.geo
index bd212c0889dc9aec16dd7f2a0c89516561e05e0e..cd77ade4a85bad9581401f34fccdf55bd6a85c1b 100644
--- a/benchmarks/misc/visibility.geo
+++ b/benchmarks/misc/visibility.geo
@@ -1,6 +1,6 @@
 
 Merge "../../tutorial/t1.geo";
 
-Hide "*";
+Hide {:}
 Show { Surface{6}; Point{1:3}; Line{2}; }
 
diff --git a/demos/boolean/twist.geo b/demos/boolean/twist.geo
index 2c5c5663ef888e33421ec9c4408d78d408492e0d..a143f52fcee06f536e7fc4128364420c28f7d83d 100644
--- a/demos/boolean/twist.geo
+++ b/demos/boolean/twist.geo
@@ -31,8 +31,6 @@ EndFor
 ThruSections(1) = {1:N};
 Box(2) = {-0.5,-0.5,0, 1,1,1};
 
-Characteristic Length { PointsOf{ Volume{1}; } } = lc2;
 Characteristic Length { PointsOf{ Volume{2}; } } = lc1;
 
 BooleanFragments{ Volume{1,2}; Delete; }{}
-
diff --git a/demos/simple_geo/hex.geo b/demos/simple_geo/hex.geo
index 48f527fee2bf4625f2ac708025e5421452d37e20..6fde987f44b7d43ed24e5d5dc69b4e2c31ad7c40 100644
--- a/demos/simple_geo/hex.geo
+++ b/demos/simple_geo/hex.geo
@@ -50,10 +50,10 @@ Transfinite Volume{1} = {1,2,3,4,5,6,7,8};
 
 Or automatically:
 */
-Transfinite Line "*" = N+1;
-Transfinite Surface "*";
-Transfinite Volume "*";
-Recombine Surface "*";
+Transfinite Line {:} = N+1;
+Transfinite Surface {:};
+Transfinite Volume {:};
+Recombine Surface {:};
 
 // the same by extruding a transfinite surface mesh
 
diff --git a/demos/simple_geo/transfinite.geo b/demos/simple_geo/transfinite.geo
index d0a1841cdc79ff192320e5f26d2db85d8174d724..544f482af76904186b3af572979ef50da6073ab0 100644
--- a/demos/simple_geo/transfinite.geo
+++ b/demos/simple_geo/transfinite.geo
@@ -72,9 +72,9 @@ Surface Loop(94) = {27,-71,-45,-73,-75,-69}; Volume(95) = {94};
 Transfinite Line {53, 59, 52, 58, 55, 56, 54, 57} = n Using Progression progr;
 Transfinite Line {42, 44, 30, 32, 36, 41, 29, 31, 9, 1, 8, 4, 11, 3, 10, 2,
                   18, 22, 14, 13, 39, 49, 37, 47} = n2;
-Transfinite Surface "*";
-Recombine Surface "*";
-Transfinite Volume "*";
+Transfinite Surface {:};
+Recombine Surface {:};
+Transfinite Volume {:};
 
 Physical Volume(1) = {85:95:2}; // ext volume
 Physical Surface(100) = {34,35,40,45,50,51}; // int surf
diff --git a/doc/gmsh.html b/doc/gmsh.html
index 7cc69e620bc73052ec5bc5c5b8bf10d69a6c3845..6dc18fa6437fbc553f99d4604ba141461dd6ec94 100644
--- a/doc/gmsh.html
+++ b/doc/gmsh.html
@@ -99,13 +99,13 @@ Public License (GPL)</a>:
 <ul>
   <li>
     <p class="highlight">
-      Current stable release (version 3.0.5, September 6 2017):
-      <a href="bin/Windows/gmsh-3.0.5-Windows64.zip">Windows</a>
-      (<a href="bin/Windows/gmsh-3.0.5-Windows32.zip">32 bit</a>),
-      <a href="bin/Linux/gmsh-3.0.5-Linux64.tgz">Linux</a>,
-      <a href="bin/MacOSX/gmsh-3.0.5-MacOSX.dmg">MacOS</a>
+      Current stable release (version 3.0.6, November 5 2017):
+      <a href="bin/Windows/gmsh-3.0.6-Windows64.zip">Windows</a>
+      (<a href="bin/Windows/gmsh-3.0.6-Windows32.zip">32 bit</a>),
+      <a href="bin/Linux/gmsh-3.0.6-Linux64.tgz">Linux</a>,
+      <a href="bin/MacOSX/gmsh-3.0.6-MacOSX.dmg">MacOS</a>
       and
-      <a href="src/gmsh-3.0.5-source.tgz">source code</a>
+      <a href="src/gmsh-3.0.6-source.tgz">source code</a>
     </p>
     <p>
       <em>A <a href="doc/texinfo/gmsh.html#Tutorial"><strong>tutorial</strong></a>
@@ -244,18 +244,18 @@ directly</a> for more information.
   <li>Gmsh uses <a href="http://www.opencascade.org">OpenCascade</a> for
     constructive geometry features.
   <li>Gmsh interfaces the following additional external mesh
-    generators: <a href="http://www.hpfem.jku.at/netgen/">Netgen</a> from
-    Joachim Sch&ouml;berl
-    and <a href="http://tetgen.berlios.de/index.html">TetGen</a> from Hang
-    Si.
-  <li>Gmsh's high quality vector PostScript, PDF and SVG output is
-    produced by <a href="/gl2ps/">GL2PS</a>.
+    generators: <a href="http://ngsolve.org/">Netgen</a> from Joachim
+    Sch&ouml;berl
+    and <a href="http://wias-berlin.de/software/index.jsp?id=TetGen">TetGen</a>
+    from Hang Si.
+  <li>Gmsh's high quality vector PostScript, PDF and SVG output is produced
+    by <a href="/gl2ps/">GL2PS</a>.
   <li>Gmsh's cross-platform graphical user interface is based
     on <a href="http://www.fltk.org/">FLTK</a>
     and <a href="http://www.opengl.org/">OpenGL</a>.
   <li>Gmsh implements a <a href="http://onelab.info">ONELAB</a> server to drive
     external solvers, as for example the open source finite
-    solver <a href="http://getdp.info">GetDP</a>. 
+    solver <a href="http://getdp.info">GetDP</a>.
   <li>Gmsh and GetDP are bundled in the
     <a href="http://onelab.info/wiki/Mobile">Onelab/Mobile</a> app for
     <a href="https://itunes.apple.com/us/app/onelab/id845930897">iPhone, iPad</a> and 
diff --git a/doc/texinfo/commandline.texi b/doc/texinfo/commandline.texi
index 4443604fc3e39c3d9edc617cac159fe3930ed820..78f873b35eeca3e935fc6ffd93803ffc597e63bf 100644
--- a/doc/texinfo/commandline.texi
+++ b/doc/texinfo/commandline.texi
@@ -21,7 +21,7 @@ Perform 1D, 2D or 3D mesh generation, then exit
 @item -o file
 Specify output file name
 @item -format string
-Select output mesh format (auto (default), msh, msh1, msh2, unv, vrml, ply2, stl, mesh, bdf, cgns, p3d, diff, med, ...)
+Select output mesh format (auto (default), msh, msh1, msh2, unv, vrml, ply2, stl, mesh, bdf, cgns, p3d, diff, med, neu, ...)
 @item -bin
 Use binary format when available
 @item -refine
@@ -154,6 +154,8 @@ Set constant string name=value
 Parse option file at startup
 @item -convert files
 Convert files into latest binary formats, then exit
+@item -nt int
+Set number of threads
 @item -cpu
 Report CPU times for all operations
 @item -version
diff --git a/doc/texinfo/gmsh.texi b/doc/texinfo/gmsh.texi
index 0157b1af3bd6e2ea47046dac42d10c0d3bbc2adf..874cdf5f1954cfa5e1073ae61d0d4cbc2fd02e19 100644
--- a/doc/texinfo/gmsh.texi
+++ b/doc/texinfo/gmsh.texi
@@ -946,11 +946,11 @@ List of expressions are also widely used, and are defined as:
   @var{transform} |
   @var{extrude} |
   @var{boolean} |
-  Point @{ @var{expression} @} |
-  <Physical> Point|Line|Surface|Volume "*" |
   Point|Line|Surface|Volume In BoundingBox @{ @var{expression-list} @} |
-  BoundingBox Point|Line|Surface|Volume @{ @var{expression} @} |
-  Physical Point|Line|Surface|Volume @{ @var{expression-list} @}
+  BoundingBox Point|Line|Surface|Volume @{ @var{expression} @}
+  Point @{ @var{expression} @} |
+  Physical Point|Line|Surface|Volume @{ @var{expression-list} @} |
+  <Physical> Point|Line|Surface|Volume { : } |
 @c  @var{duplicata} - already implemented: should we explain this?
 @end example
 
@@ -968,14 +968,15 @@ a list of numbers from a file. @code{LinSpace} and @code{LogSpace}
 construct lists using linear or logarithmic spacing. The next two cases
 permit to reference an expression sublist (whose elements are those
 corresponding to the indices provided by the @var{expression-list}).
-The next two cases permit to retrieve the indices of entities created
-through geometrical transformations and extrusions (see
-@ref{Transformations}, and @ref{Extrusions}). The next two cases allow
-to retrieve entities in a given bounding box, or get the bounding box of
-a given entity. The last three cases permit to retrieve the coordinates
-of a given geometry point (@pxref{Points}), to retrieve the id numbers
-of all points, lines, surfaces or volumes in the model, or to retrieve
-the elementary entities making up physical groups.
+The next cases permit to retrieve the indices of entities created
+through geometrical transformations, extrusions and boolean operations
+(see @ref{Transformations}, @ref{Extrusions} and @ref{Boolean
+operations}). The next two cases allow to retrieve entities in a given
+bounding box, or get the bounding box of a given entity. The last three
+cases permit to retrieve the coordinates of a given geometry point
+(@pxref{Points}), to retrieve the elementary entities making up physical
+groups, and to retrieve the id numbers of all (physical or elementary)
+points, lines, surfaces or volumes in the model,
 
 To see the practical use of such expressions, have a look at the first
 couple of examples in @ref{Tutorial}. Note that, in order to lighten the
@@ -985,6 +986,20 @@ single item. Also note that a braced @var{expression-list} can be
 preceded by a minus sign in order to change the sign of all the
 @w{@var{expression-list-item}s}.
 
+For some commands it makes sense to specify all the possible expressions
+in a list. This is achieved with @var{expression-list-or-all}, defined
+as:
+
+@example
+@var{expression-list-or-all}:
+  @var{expression-list} | :
+@end example
+
+The meaning of ``all'' (@code{:}) depends on context. For example,
+@code{Line @{ : @}} will get the ids of all the existing lines in the
+model, while @code{Surface @{ : @}} will get the ids of all existing
+surfaces.
+
 @c .........................................................................
 @c Character expressions
 @c .........................................................................
@@ -2224,7 +2239,7 @@ kernel.
 
 @example
 @var{extrude-list}: 
-  Point | Line | Surface @{ @var{expression-list} @}; @dots{}
+  <Physical> Point | Line | Surface @{ @var{expression-list-or-all} @}; @dots{}
 @end example
 
 As explained in @ref{Floating point expressions}, @var{extrude} can be
@@ -2284,7 +2299,7 @@ with
 
 @example
 @var{boolean-list}: 
-  Line | Surface | Volume @{ @var{expression-list} @}; @dots{} |
+  <Physical> Line | Surface | Volume @{ @var{expression-list-or-all} @}; @dots{} |
   Delete ;
 @end example
 
@@ -2399,8 +2414,8 @@ complex part.
 
 @example
 @var{transform-list}: 
-  Point | Line | Surface | Volume @{ @var{expression-list} @}; @dots{} |
-  Duplicata @{ Point | Line | Surface | Volume @{ @var{expression-list} @}; @dots{} @} |
+  <Physical> Point | Line | Surface | Volume @{ @var{expression-list-or-all} @}; @dots{} |
+  Duplicata @{ <Physical> Point | Line | Surface | Volume @{ @var{expression-list-or-all} @}; @dots{} @} |
   @var{transform}
 @end example
 
@@ -2423,31 +2438,29 @@ set to zero (@pxref{Geometry options list}). With the OpenCASCADE
 geoemtry kernel, @code{Coherence} is simply a shortcut for a
 @code{BooleanFragments} operation on all entities.
 
-@item < Recursive > Delete @{ Point | Line | Surface | Volume @{ @var{expression-list} @}; @dots{} @}
+@item < Recursive > Delete @{ <Physical> Point | Line | Surface | Volume @{ @var{expression-list-or-all} @}; @dots{} @}
 Deletes all elementary entities whose identification numbers are given
-in @var{expression-list}. If an entity is linked to another entity (for
-example, if a point is used as a control point of a curve),
+in @var{expression-list-or-all}. If an entity is linked to another
+entity (for example, if a point is used as a control point of a curve),
 @code{Delete} has no effect (the line will have to be deleted before the
 point can). The @code{Recursive} variant deletes the entities as well as
 all its sub-entities of lower dimension.
 
-@item < Recursive > Hide @{ Point | Line | Surface | Volume @{ @var{expression-list} @}; @dots{} @}
-Hide the entities listed in @var{expression-list}, if
+@item < Recursive > Hide @{ <Physical> Point | Line | Surface | Volume @{ @var{expression-list-or-all} @}; @dots{} @}
+Hide the entities listed in @var{expression-list-or-all}, if
 @code{General.VisibilityMode} is set to @code{0} or @code{1}.
 
-@item Hide @var{char-expression};
-Hide the entity @var{char-expression}, if @code{General.VisibilityMode} is
-set to @code{0} or @code{1} (@var{char-expression} can for example be
-@code{"*"}).
+@item Hide @{ : @}
+Hide all entities, if @code{General.VisibilityMode} is set to @code{0}
+or @code{1}.
 
-@item < Recursive > Show @{ Point | Line | Surface | Volume @{ @var{expression-list} @}; @dots{} @}
-Show the entities listed in @var{expression-list}, if
+@item < Recursive > Show @{ <Physical> Point | Line | Surface | Volume @{ @var{expression-list-or-all} @}; @dots{} @}
+Show the entities listed in @var{expression-list-or-all}, if
 @code{General.VisibilityMode} is set to @code{0} or @code{1}.
 
-@item Show @var{char-expression};
-Show the entity @var{char-expression}, if @code{General.VisibilityMode} is
-set to @code{0} or @code{1} (@var{char-expression} can for example be
-@code{"*"}).
+@item Show @{ : @}
+Show all entities, if @code{General.VisibilityMode} is set to @code{0}
+or @code{1}.
 
 @end ftable
 
@@ -2914,7 +2927,7 @@ adjacent to elements with an overall average edge length of 5.0 will
 extrude to have a last layer height = (1.6-0.6) * 5.0 = 5.0.
 
 
-@item Transfinite Line @{ @var{expression-list} @} | "*" = @var{expression} < Using Progression | Bump @var{expression} >;
+@item Transfinite Line @{ @var{expression-list-or-all} @} = @var{expression} < Using Progression | Bump @var{expression} >;
 Selects the lines in @var{expression-list} to be meshed with the 1D
 transfinite algorithm. The @var{expression} on the right hand side gives
 the number of nodes that will be created on the line (this overrides any
@@ -2927,7 +2940,7 @@ as the preceding one). The optional argument `@code{Using Bump
 @var{expression}}' instructs the transfinite algorithm to distribute the
 nodes with a refinement at both ends of the line.
 
-@item Transfinite Surface @{ @var{expression-list} @} | "*" < = @{ @var{expression-list} @} > < Left | Right | Alternate | AlternateRight | AlternateLeft > ;
+@item Transfinite Surface @{ @var{expression-list-or-all}  @}  < = @{ @var{expression-list} @} > < Left | Right | Alternate | AlternateRight | AlternateLeft > ;
 Selects surfaces to be meshed with the 2D transfinite algorithm. The
 @var{expression-list} on the right-hand-side should contain the
 identification numbers of three or four points on the boundary of the
@@ -2937,7 +2950,7 @@ find the corners automatically. The optional argument specifies the way
 the triangles are oriented when the mesh is not
 recombined. (@code{Alternate} is a synonym for @code{AlternateRight}).
 
-@item Transfinite Volume @{ @var{expression-list} @} | "*" < = @{ @var{expression-list} @} > ;
+@item Transfinite Volume @{ @var{expression-list} @} < = @{ @var{expression-list} @} > ;
 Selects five- or six-face volumes to be meshed with the 3D transfinite
 algorithm.  The @var{expression-list} on the right-hand-side should
 contain the identification numbers of the six or eight points on the
@@ -2945,11 +2958,10 @@ boundary of the volume that define the corners of the transfinite
 interpolation. If no identification numbers are given, the transfinite
 algorithm will try to find the corners automatically.
 
-@item TransfQuadTri @{ @var{expression-list} @} | "*";
+@item TransfQuadTri @{ @var{expression-list} @} ;
 
 Applies the transfinite QuadTri algorithm on the @var{expression-list}
-list of volumes (@code{"*"} can be used to apply TransfQuadTri to all
-existing volumes).  A transfinite volume with any combination of
+list of volumes.  A transfinite volume with any combination of
 recombined and un-recombined transfinite boundary surfaces is valid when
 meshed with @code{TransfQuadTri}. When applied to non-Transfinite
 volumes, TransfQuadTri has no effect on those volumes.
@@ -2988,7 +3000,7 @@ Optimizes the current mesh with the given algorithm (currently
 @item AdaptMesh @{ @var{expression-list} @} @{ @var{expression-list} @} @{ @{ @var{expression-list} < , @dots{} >  @} @};
 Performs adaptive mesh generation. Documentation not yet available.
 
-@item RelocateMesh Point | Line | Surface @{ @var{expression-list} @} | "*";
+@item RelocateMesh Point | Line | Surface @{ @var{expression-list-or-all} @};
 Relocates the mesh vertices on the given entities using the parametric
 coordinates stored in the vertices. Useful for creating perturbation of
 meshes e.g. for sensitivity analyzes.
@@ -3026,22 +3038,21 @@ specified as in @ref{Transformations}.
 @item Coherence Mesh;
 Removes all duplicate mesh vertices.
 
-@item SetPartition @var{expression} @{ Point | Line | Surface | Volume @{ @var{expression-list} @}; @dots{} @}
+@item SetPartition @var{expression} @{ <Physical> Point | Line | Surface | Volume @{ @var{expression-list-or-all} @}; @dots{} @}
 Sets the partition tag of the mesh elements in the entities in @var{expression-list} to @var{expression}.
 
-@item < Recursive > Color @var{color-expression} @{ Point | Line | Surface | Volume @{ @var{expression-list} @}; @dots{} @}
+@item < Recursive > Color @var{color-expression} @{ <Physical> Point | Line | Surface | Volume @{ @var{expression-list-or-all} @}; @dots{} @}
 Sets the mesh color of the entities in @var{expression-list} to @var{color-expression}.
 
-@item < Recursive > Hide @{ Point | Line | Surface | Volume @{ @var{expression-list} @}; @dots{} @}
+@item < Recursive > Hide @{ <Physical> Point | Line | Surface | Volume @{ @var{expression-list-or-all} @}; @dots{} @}
 Hides the mesh of the entities in @var{expression-list}, if
 @code{General.VisibilityMode} is set to @code{0} or @code{2}.
 
-@item Hide @var{char-expression};
-Hides the mesh of the entity @var{char-expression}, if
-@code{General.VisibilityMode} is set to @code{0} or @code{2}
-(@var{char-expression} can for example be @code{"*"}).
+@item Hide @{ : @}
+Hide the mesh of all entities, if @code{General.VisibilityMode} is set
+to @code{0} or @code{2}.
 
-@item Recombine Surface @{ @var{expression-list} @} | "*" < = @var{expression} >;
+@item Recombine Surface @{ @var{expression-list-or-all} @}  < = @var{expression} >;
 Recombines the triangular meshes of the surfaces listed in
 @var{expression-list} into mixed triangular/quadrangular meshes. The
 optional @var{expression} on the right hand side specifies the maximum
@@ -3053,7 +3064,7 @@ default value is 45).
 @item MeshAlgorithm Surface @{ @var{expression-list} @} = @var{expression};
 Forces the meshing algorithm per surface.
 
-@item Reverse Line | Surface @{ @var{expression-list} @} | "*" ;
+@item Reverse Line | Surface @{ @var{expression-list-or-all} @} ;
 Reverses the mesh of the given line(s) or surface(s).
 
 @item Save @var{char-expression};
@@ -3062,14 +3073,13 @@ Saves the mesh in a file named @var{char-expression}, using the current
 @var{char-expression} is not absolute, @var{char-expression} is appended
 to the path of the current file.
 
-@item < Recursive > Show @{ Point | Line | Surface | Volume @{ @var{expression-list} @}; @dots{} @}
+@item < Recursive > Show @{ <Physical> Point | Line | Surface | Volume @{ @var{expression-list-or-all} @}; @dots{} @}
 Shows the mesh of the entities in @var{expression-list}, if
 @code{General.VisibilityMode} is set to @code{0} or @code{2}.
 
-@item Show @var{char-expression};
-Shows the mesh of the entity @var{char-expression}, if
-@code{General.VisibilityMode} is set to @code{0} or @code{2}
-(@var{char-expression} can for example be @code{"*"}).
+@item Show @{ : @};
+Shows the mesh of all entities, if @code{General.VisibilityMode} is set
+to @code{0} or @code{2}.
 
 @item Smoother Surface @{ @var{expression-list} @} = @var{expression};
 Sets number of elliptic smoothing steps for the surfaces listed in
diff --git a/doc/texinfo/opt_fields.texi b/doc/texinfo/opt_fields.texi
index 079edd8d8e0b9c29b93dc9399a59630ea7926c22..315e7bf7a0822f2ce37fc8ee0b2b7f1da3820767 100644
--- a/doc/texinfo/opt_fields.texi
+++ b/doc/texinfo/opt_fields.texi
@@ -55,7 +55,7 @@ Maxmium distance, above this distance from the curves, prescribe the maximum mes
 type: float@*
 default value: @code{0.5}
 @item dMin
-Minimum distance, bellow this distance from the curves, prescribe the minimum mesh sizes.@*
+Minimum distance, below this distance from the curves, prescribe the minimum mesh sizes.@*
 type: float@*
 default value: @code{0.1}
 @item lMaxNormal
diff --git a/doc/texinfo/opt_general.texi b/doc/texinfo/opt_general.texi
index c7029a2e77da62d94df74815f430cf4e33043536..74a12a3b5f83ab368e62553de569b2e4b722cd00 100644
--- a/doc/texinfo/opt_general.texi
+++ b/doc/texinfo/opt_general.texi
@@ -39,6 +39,11 @@ Background image file in JPEG, PNG or PDF format@*
 Default value: @code{""}@*
 Saved in: @code{General.OptionsFileName}
 
+@item General.BuildOptions
+Gmsh build options (read-only)@*
+Default value: @code{" 64Bit Ann Bamg Bfgs Blas(VecLib) Blossom C++11 Chaco DIntegration Dlopen Fltk GMP Gmm Jpeg(Fltk) Kbipack Lapack(VecLib) MathEx Mesh Metis Mmg3d Mpeg NativeFileChooser Netgen ONELAB ONELABMetamodel OpenCASCADE OpenGL OptHom PETSc Parser Plugins Png(Fltk) Post SLEPc Solver Taucs TetGen/BR Tetgen1.5 Voro3D Zlib"}@*
+Saved in: @code{-}
+
 @item General.DefaultFileName
 Default project file name@*
 Default value: @code{"untitled.geo"}@*
@@ -154,6 +159,11 @@ Temporary file used by the geometry module@*
 Default value: @code{".gmsh-tmp"}@*
 Saved in: @code{General.SessionFileName}
 
+@item General.Version
+Gmsh version (read-only)@*
+Default value: @code{"3.0.7"}@*
+Saved in: @code{-}
+
 @item General.WatchFilePattern
 Pattern of files to merge as they become available@*
 Default value: @code{""}@*
@@ -904,6 +914,11 @@ Disable interactive dialog windows in scripts (and use default values instead)@*
 Default value: @code{0}@*
 Saved in: @code{General.OptionsFileName}
 
+@item General.NumThreads
+Set (maximum) number of threads@*
+Default value: @code{1}@*
+Saved in: @code{General.OptionsFileName}
+
 @item General.OptionsPositionX
 Horizontal position (in pixels) of the upper left corner of the option window@*
 Default value: @code{650}@*
diff --git a/doc/texinfo/opt_mesh.texi b/doc/texinfo/opt_mesh.texi
index a7965733d333f2d9b5783de8e82b6586c95bd830..e2e984678d93818238b33cd13aaaa24f51a74a71 100644
--- a/doc/texinfo/opt_mesh.texi
+++ b/doc/texinfo/opt_mesh.texi
@@ -200,7 +200,7 @@ Default value: @code{1}@*
 Saved in: @code{General.OptionsFileName}
 
 @item Mesh.FlexibleTransfinite
-Allow transfinite contraints to be modified for Blossom or by global mesh size factor@*
+Allow transfinite constraints to be modified for Blossom or by global mesh size factor@*
 Default value: @code{0}@*
 Saved in: @code{General.OptionsFileName}
 
@@ -294,6 +294,21 @@ Display width of mesh lines (in pixels)@*
 Default value: @code{1}@*
 Saved in: @code{General.OptionsFileName}
 
+@item Mesh.MaxNumThreads1D
+Maximum number of threads for 1D meshing (0: use default number of threads)@*
+Default value: @code{0}@*
+Saved in: @code{General.OptionsFileName}
+
+@item Mesh.MaxNumThreads2D
+Maximum number of threads for 2D meshing (0: use default number of threads)@*
+Default value: @code{0}@*
+Saved in: @code{General.OptionsFileName}
+
+@item Mesh.MaxNumThreads3D
+Maximum number of threads for 3D meshing (0: use default number of threads)@*
+Default value: @code{0}@*
+Saved in: @code{General.OptionsFileName}
+
 @item Mesh.MeshOnlyVisible
 Mesh only visible entities (experimental: use with caution!)@*
 Default value: @code{0}@*
@@ -530,7 +545,7 @@ Default value: @code{0}@*
 Saved in: @code{General.OptionsFileName}
 
 @item Mesh.IgnorePeriodicity
-Ignore alignement of periodic boundaries when reading the mesh (used by ParaView plugin)@*
+Ignore alignment of periodic boundaries when reading the mesh (used by ParaView plugin)@*
 Default value: @code{0}@*
 Saved in: @code{General.OptionsFileName}
 
diff --git a/doc/texinfo/opt_plugin.texi b/doc/texinfo/opt_plugin.texi
index 280a4865dbe62643afa8382e2cd962b944d3174e..ba1781bbf9996a95857fdb954d8c594c14a60bf8 100644
--- a/doc/texinfo/opt_plugin.texi
+++ b/doc/texinfo/opt_plugin.texi
@@ -5,7 +5,7 @@
 
 @ftable @code
 @item Plugin(AnalyseCurvedMesh)
-Plugin(AnalyseCurvedMesh) analyse all elements of a given dimension. According to what is asked, it computes the minimum of the Jacobian determinant (J), the IGE quality measure (Inverse Gradient Error) and/or the ICN quality measure (Inverse Condition Number). Statistics are printed and, if asked, a Pview is created for each measure. The plugin hides elements for which the measure mu > 'Hidding threshold', where mu is the ICN measure if asked otherwise the IGE measure if asked otherwise the Jacobian determinant.@*
+Plugin(AnalyseCurvedMesh) analyse all elements of a given dimension. According to what is asked, it computes the minimum of the Jacobian determinant (J), the IGE quality measure (Inverse Gradient Error) and/or the ICN quality measure (Inverse Condition Number). Statistics are printed and, if asked, a Pview is created for each measure. The plugin hides elements for which the measure mu > 'Hiding threshold', where mu is the ICN measure if asked otherwise the IGE measure if asked otherwise the Jacobian determinant.@*
 @*
 J is faster to compute but gives information only on validity while the other measure gives also information on quality.@*
 The IGE measure is related to the error on the gradient of the finite element solution. It is the scaled Jacobian for quads and hexes and a new measure for triangles and tetrahedra.@*
@@ -20,7 +20,7 @@ Parameters:@*
 @*
 - ICN measure = @{0, 1@}@*
 @*
-- Hidding threshold = [0, 1]: Hides all element for which min(mu) is strictly greater than the threshold, where mu is the ICN if ICN measure == 1, otherwise mu is the IGE it IGE measure == 1, otherwise mu is the Jacobian determinant.@*
+- Hiding threshold = [0, 1]: Hides all element for which min(mu) is strictly greater than the threshold, where mu is the ICN if ICN measure == 1, otherwise mu is the IGE it IGE measure == 1, otherwise mu is the Jacobian determinant.@*
 If threshold == 0, hides all elements except invalid.@*
 @*
 - Draw PView = @{0, 1@}: Creates a PView of min(J)/max(J), min(IGE) and/or min(ICN) according to what is asked. If 'Recompute' = 1, new PViews are created.@*
@@ -36,7 +36,7 @@ Default value: @code{1}
 Default value: @code{1}
 @item ICN measure
 Default value: @code{1}
-@item Hidding threshold
+@item Hiding threshold
 Default value: @code{9}
 @item Draw PView
 Default value: @code{0}
@@ -366,14 +366,6 @@ Numeric options:
 Default value: @code{-1}
 @end table
 
-@item Plugin(DuplicateBoundaries)
-Plugin(DuplicateBoundaries) is not documented yet.
-Numeric options:
-@table @code
-@item Dummy
-Default value: @code{1}
-@end table
-
 @item Plugin(Eigenvalues)
 Plugin(Eigenvalues) computes the three real eigenvalues of each tensor in the view `View'.@*
 @*
@@ -441,9 +433,9 @@ Plugin(FaultZone) convert all the embedded lines of an existing surfacic mesh to
 @*
 `SurfaceTag' must be an existing plane surface containing embedded lines. Embedded lines must have been added to the surface via the command Line In Surface. The surface must be meshed with quadratic incomplete elements.@*
 @*
-`Thickness' is the thichness of the flat quadrangles. Set a value different to zero can be helpfull to check the connectivity. @*
+`Thickness' is the thickness of the flat quadrangles. Set a value different to zero can be helpful to check the connectivity. @*
 @*
-`Prefix' is the prefix of the name of physicals containing the new embedded. All physicals containing embedded lines are replaced by physicals containing the coresponding joint elements.
+`Prefix' is the prefix of the name of physicals containing the new embedded. All physicals containing embedded lines are replaced by physicals containing the corresponding joint elements.
 String options:
 @table @code
 @item Prefix
diff --git a/tutorial/t11.geo b/tutorial/t11.geo
index 4347fe4b2b9e1c10d0621ba651c5dc1f2dc0bd03..bcc402717e58b40c3468d9d9db63103bc2f1c01b 100644
--- a/tutorial/t11.geo
+++ b/tutorial/t11.geo
@@ -26,7 +26,7 @@ Background Field = 1;
 // To generate quadrangles instead of triangles, we can simply add
 Recombine Surface{100};
 
-// If we'd had several surfaces, we could have used 'Recombine Surface "*";'.
+// If we'd had several surfaces, we could have used 'Recombine Surface {:};'.
 // Yet another way would be to specify the global option "Mesh.RecombineAll =
 // 1;".
 
diff --git a/tutorial/t13.geo b/tutorial/t13.geo
index a608717b210c4285ae87ce7e4e47751f5031d4ea..14e5023587ea376fd444a1359044e714968ea705 100644
--- a/tutorial/t13.geo
+++ b/tutorial/t13.geo
@@ -23,11 +23,11 @@ CreateTopology;
 
 // We can now define a compound line (resp. surface) for each discrete line
 // (resp. surface) in the model
-ll[] = Line "*";
+ll[] = Line {:};
 For j In {0 : #ll[]-1}
   Compound Line(newl) = ll[j];
 EndFor
-ss[] = Surface "*";
+ss[] = Surface {:};
 s = news;
 For i In {0 : #ss[]-1}
   Compound Surface(s+i) = ss[i];
diff --git a/tutorial/t5.geo b/tutorial/t5.geo
index d255e41ce89482f679b1c1ff7bc9e020efe178d8..14a2f61dcefccf6717cffe3c0028529b1ac0bb78 100644
--- a/tutorial/t5.geo
+++ b/tutorial/t5.geo
@@ -155,6 +155,6 @@ Physical Volume (10) = 186 ;
 
 // We could make only part of the model visible to only mesh this subset:
 //
-// Hide "*";
+// Hide {:}
 // Recursive Show { Volume{129}; }
 // Mesh.MeshOnlyVisible=1;
diff --git a/utils/api_demos/mainGeoFactory.cpp b/utils/api_demos/mainGeoFactory.cpp
deleted file mode 100644
index 6e1662a1d7b24fc3028e040ec50c01677ae33a35..0000000000000000000000000000000000000000
--- a/utils/api_demos/mainGeoFactory.cpp
+++ /dev/null
@@ -1,31 +0,0 @@
-#include <stdio.h>
-#include "Gmsh.h"
-#include "GModel.h"
-
-int main(int argc, char **argv)
-{
-  GmshInitialize(argc, argv);
-  GModel *m = new GModel();
-
-  m->setFactory("Gmsh");
-
-  GVertex *v1 = m->addVertex(0, 0, 0, 0.1);
-  GVertex *v2 = m->addVertex(1, 0, 0, 0.1);
-  GVertex *v3 = m->addVertex(1, 1, 0, 0.1);
-  GVertex *v4 = m->addVertex(0, 1, 0, 0.1);
-
-  std::vector<GEdge*> edges;
-  edges.push_back(m->addLine(v1, v2));
-  edges.push_back(m->addLine(v2, v3));
-  edges.push_back(m->addLine(v3, v4));
-  edges.push_back(m->addLine(v4, v1));
-
-  std::vector<std::vector<GEdge*> > loop;
-  loop.push_back(edges);
-  GFace *f = m->addPlanarFace(loop);
-
-  m->mesh(2);
-  m->writeMSH("test.msh");
-  delete m;
-  GmshFinalize();
-}
diff --git a/utils/api_demos/mainOcc.cpp b/utils/api_demos/mainOcc.cpp
deleted file mode 100644
index e55e6c56ab980aa779cad1eda285e61651db5ccf..0000000000000000000000000000000000000000
--- a/utils/api_demos/mainOcc.cpp
+++ /dev/null
@@ -1,94 +0,0 @@
-// This demonstrates how to import an OpenCASCADE model WITHOUT using
-// Gmsh's own I/O layer (useful if you create OCC objects in your own
-// code, that you want to import dynamically in Gmsh).
-//
-// If you just want to load OpenCASCADE files (.brep, .step, etc.) you
-// SHOULD NOT use this interface: simply use the standard I/O API.
-
-// g++ -I/usr/local/opencascade/inc driverOCC.cpp -lGmsh
-// -L/usr/local/opencascade/lib -lTKSTEP -lTKSTEP209 -lTKSTEPAttr
-// -lTKSTEPBase -lTKIGES -lTKXSBase -lTKOffset -lTKFeat -lTKFillet
-// -lTKBool -lTKShHealing -lTKMesh -lTKHLR -lTKBO -lTKPrim -lTKTopAlgo
-// -lTKGeomAlgo -lTKBRep -lTKGeomBase -lTKG3d -lTKG2d -lTKAdvTools
-// -lTKMath -lTKernel -lm
-
-#include <stdio.h>
-#include "Gmsh.h"
-#include "GmshConfig.h"
-#include "GModel.h"
-#include "MElement.h"
-
-#if !defined(HAVE_NO_OCC_CONFIG_H)
-#include "config.h"
-#endif
-#include <TopoDS_Shape.hxx>
-#include <BRep_Tool.hxx>
-#include <BRep_Builder.hxx>
-#include <BRepTools.hxx>
-
-class mymsg : public GmshMessage{
-private:
-  GModel *_model;
-public:
-  mymsg(GModel *model) : _model(model), GmshMessage() {}
-  void operator()(std::string level, std::string msg)
-  {
-    printf("level=%s msg=%s\n", level.c_str(), msg.c_str());
-
-    if(level == "Fatal" || level == "Error"){
-      GEntity *e = _model->getCurrentMeshEntity();
-      if(e){
-        printf("error occurred while meshing entity:\n");
-        printf("  tag=%d\n", e->tag());
-        printf("  dimension=%d\n", e->dim());
-        printf("  native pointer=%p\n", e->getNativePtr());
-      }
-    }
-    if(level == "Fatal") throw "Fatal error in Gmsh";
-  }
-};
-
-int main(int argc, char **argv)
-{
-  // create an OCC shape (by loading it from a brep file)
-  TopoDS_Shape shape;
-  BRep_Builder builder;
-  BRepTools::Read(shape, argv[1], builder);
-  BRepTools::Clean(shape);
-
-  // initialize gmsh
-  GmshInitialize(argc, argv);
-
-  // create a model and set error handler 
-  GModel m;
-  mymsg c(&m);
-  GmshSetMessageHandler(&c);
-
-  // import the shape, and mesh it
-  m.importOCCShape((void*)&shape);
-  try{
-    m.mesh(2);
-  }
-  catch(...){
-    printf("Unrecoverable error in gmsh--aborting mesh!\n");
-  }
-
-  for(GModel::fiter it = m.firstFace(); it != m.lastFace(); ++it){
-    GFace *f = *it;
-    printf("Surface %d contains %d elements:\n", f->tag(), f->getNumMeshElements());
-    for(unsigned int i = 0; i < f->getNumMeshElements(); i++){
-      MElement *e = f->getMeshElement(i);
-      printf("  element %d:", e->getNum());
-      for(unsigned int j = 0; j < e->getNumVertices(); j++){
-        MVertex *v = e->getVertex(j);
-        printf(" %d (%g,%g,%g)", v->getNum(), v->x(), v->y(), v->z());
-      }
-      printf("\n");
-    }
-    printf("\n");
-  }
-
-  m.writeMSH("test.msh");
-
-  GmshFinalize();
-}
diff --git a/utils/api_demos/mainSimple.cpp b/utils/api_demos/mainSimple.cpp
index 34d02104c4359b2ea71dcb698f8ea41be79eb4eb..a33724f2b61aa948fa753c935a366f46d9e6eecb 100644
--- a/utils/api_demos/mainSimple.cpp
+++ b/utils/api_demos/mainSimple.cpp
@@ -1,12 +1,10 @@
 #include <stdio.h>
-#include "Gmsh.h"
-#include "GModel.h"
-#include "MElement.h"
+#include "GmshAPI.h"
 
 int main(int argc, char **argv)
 {
-  GmshInitialize(argc, argv);
-  GmshSetOption("Mesh", "Algorithm", 5.);
+  gmshInitialize(argc, argv);
+  gmshSetOption("Mesh", "Algorithm", 5.);
   GModel *m = new GModel();
   m->readGEO("../../tutorial/t5.geo");
   //GmshMergeFile("../../tutorial/t5.geo"); // will also set the bbox
diff --git a/utils/solvers/c++/onelab.h b/utils/solvers/c++/onelab.h
index 338ec47606225a4522908d05c128c47978250140..94ab7e5b4dedff2f931256d030192c1326766f1d 100644
--- a/utils/solvers/c++/onelab.h
+++ b/utils/solvers/c++/onelab.h
@@ -1185,7 +1185,7 @@ namespace onelab{
         // stop if we have no communications for 5 minutes
         int ret = _gmshClient->Select(500, 0);
         if(!ret){
-          _gmshClient->Info("Timout: aborting remote get");
+          _gmshClient->Info("Timeout: aborting remote get");
           return false;
         }
         else if(ret < 0){
@@ -1239,7 +1239,7 @@ namespace onelab{
       while(_numSubClients > 0){
         int ret = _gmshClient->Select(500, 0);
         if(!ret){
-          _gmshClient->Info("Timout: aborting wait on subclients");
+          _gmshClient->Info("Timeout: aborting wait on subclients");
           return;
         }
         else if(ret < 0){