new upstream 2.4.1
authorAlastair McKinstry <mckinstry@debian.org>
Wed, 4 Oct 2017 14:17:18 +0000 (15:17 +0100)
committerAlastair McKinstry <mckinstry@debian.org>
Wed, 4 Oct 2017 14:17:18 +0000 (15:17 +0100)
197 files changed:
CMakeLists.txt
ChangeLog.txt
FindMathGL2.cmake [deleted file]
cmake-qt4.txt [deleted file]
cmake-qt5.txt [deleted file]
emblem.mgl
examples/CMakeLists.txt
examples/fltk_example.cpp
examples/full_test.cpp
examples/glut_example.cpp
examples/mgl_module.cpp
examples/mpi_test.cpp
examples/qgl_example.cpp
examples/qt_example.cpp
examples/samples.cpp
examples/wnd_samples.cpp
examples/wx_example.cpp
fonts/CMakeLists.txt
fonts/make_bin.cpp
include/CMakeLists.txt
include/config.h.in
include/mgl2/Fl_MathGL.h
include/mgl2/abstract.h
include/mgl2/addon.h
include/mgl2/base.h
include/mgl2/base_cf.h
include/mgl2/canvas.h
include/mgl2/canvas_cf.h
include/mgl2/canvas_wnd.h
include/mgl2/cont.h
include/mgl2/data.h
include/mgl2/data_cf.h
include/mgl2/datac.h
include/mgl2/datac_cf.h
include/mgl2/define.h
include/mgl2/eval.h
include/mgl2/evalc.h
include/mgl2/fit.h
include/mgl2/fltk.h
include/mgl2/font.h
include/mgl2/glut.h
include/mgl2/mgl.h
include/mgl2/mgl_cf.h
include/mgl2/mpi.h
include/mgl2/opengl.h
include/mgl2/other.h
include/mgl2/parser.h
include/mgl2/pde.h
include/mgl2/plot.h
include/mgl2/prim.h
include/mgl2/qmathgl.h
include/mgl2/qt.h
include/mgl2/surf.h
include/mgl2/thread.h
include/mgl2/type.h
include/mgl2/vect.h
include/mgl2/volume.h
include/mgl2/window.h
include/mgl2/wnd.h
include/mgl2/wx.h
json/Backend.cpp
json/Backend.hpp
json/CMakeLists.txt
lang/CMakeLists.txt
lang/data.i
lang/mathgl.i
lang/mgl.i
lang/type.i
make_release [deleted file]
mgltex/CMakeLists.txt
mgltex/Recompilation_decision.eps
mgltex/Recompilation_decision.pdf
mgltex/Recompilation_decision.svg
mgltex/mgltex.dtx
mgltex/mgltex.ins
mgltex/mgltex.pdf
mgltex/sample.tex
src/CMakeLists.txt
src/addon.cpp
src/axis.cpp
src/base.cpp
src/base_cf.cpp
src/canvas.cpp
src/canvas_cf.cpp
src/complex.cpp
src/complex_ex.cpp
src/complex_io.cpp
src/cont.cpp
src/crust.cpp
src/data.cpp
src/data_ex.cpp
src/data_gr.cpp
src/data_io.cpp
src/data_png.cpp
src/def_font.cc
src/eval.cpp
src/evalc.cpp
src/evalp.cpp
src/exec.cpp [deleted file]
src/export.cpp
src/export_2d.cpp
src/export_3d.cpp
src/fft.cpp
src/fit.cpp
src/font.cpp
src/interp.hpp
src/mpi.cpp
src/obj.cpp
src/opengl.cpp
src/other.cpp
src/parser.cpp
src/pde.cpp
src/pixel.cpp
src/plot.cpp
src/prc.cpp
src/prc/PRC.h
src/prc/oPRCFile.cc
src/prim.cpp
src/s_hull/s_hull_pro.h
src/surf.cpp
src/tex_table.cc
src/vect.cpp
src/volume.cpp
src/window.cpp
texinfo/CMakeLists.txt
texinfo/appendix_en.texi
texinfo/appendix_ru.texi
texinfo/concept_en.texi
texinfo/concept_ru.texi
texinfo/core_en.texi
texinfo/core_ru.texi
texinfo/data_en.texi
texinfo/data_ru.texi
texinfo/ex_mgl_en.texi
texinfo/ex_mgl_ru.texi
texinfo/example_en.texi
texinfo/example_ru.texi
texinfo/formats_en.texi
texinfo/formats_ru.texi
texinfo/parse_en.texi
texinfo/parse_ru.texi
texinfo/symbols_en.texi
texinfo/symbols_ru.texi
texinfo/time.texi
texinfo/time_big.texi
texinfo/version_hist.txt
texinfo/web_en.texi
texinfo/web_ru.texi
texinfo/widget_en.texi
texinfo/widget_ru.texi
todo.txt
udav/CMakeLists.txt
udav/anim_dlg.cpp
udav/anim_dlg.h
udav/args_dlg.cpp
udav/calc_dlg.cpp
udav/dat_pnl.cpp
udav/data_dlg.cpp
udav/data_dlg.h
udav/files_dlg.cpp
udav/files_dlg.h
udav/find_dlg.cpp
udav/find_dlg.h
udav/help_pnl.cpp
udav/help_pnl.h
udav/hint_dlg.cpp
udav/hint_dlg.h
udav/info_dlg.cpp
udav/mem_pnl.cpp
udav/newcmd_dlg.cpp
udav/open_dlg.cpp
udav/opt_dlg.cpp
udav/opt_dlg.h
udav/plot_pnl.cpp
udav/prop_dlg.cpp
udav/qmglsyntax.cpp
udav/setup_dlg.cpp
udav/setup_dlg.h
udav/style_dlg.cpp
udav/style_dlg.h
udav/subplot_dlg.cpp
udav/text_pnl.cpp
udav/textedit.cpp
udav/textedit.h
udav/udav_wnd.cpp
utils/CMakeLists.txt
utils/make_pas.cpp
utils/mglcgi.cpp
utils/mglconv.cpp
utils/mglview.cpp
widgets/CMakeLists.txt
widgets/fltk.cpp
widgets/glut.cpp
widgets/qt.cpp
widgets/qt4/CMakeLists.txt
widgets/qt5/CMakeLists.txt
widgets/wx.cpp

index 744680e5fd4af42151228cc6d9d0b1c8b72b12a5..907059505fff356e0fe6355fc74bb9dcd116fb8c 100644 (file)
@@ -1,9 +1,13 @@
-cmake_minimum_required(VERSION 2.8.9)
+cmake_minimum_required(VERSION 2.8.12)
 if(POLICY CMP0043)
     cmake_policy(SET CMP0043 OLD)
 endif()
 
-project( MathGL )
+project( MathGL2 )
+
+set(mgl_clean_files )
+set(MGL_DEP_LIBS)
+add_definitions(-DMGL_SRC)
 
 if(NOT CMAKE_BUILD_TYPE)
        set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are:
@@ -12,8 +16,37 @@ endif(NOT CMAKE_BUILD_TYPE)
 
 set(CMAKE_VERBOSE_MAKEFILE ON)
 set(MathGL_VERSION_MAJOR 2)
-set(MathGL_VERSION_MINOR 3.4)
-set(MathGL_SOVERSION 7.4.1)
+set(MathGL_VERSION_MINOR 4)
+set(MathGL_PATCH_VERSION 1)
+set(MathGL_VERSION ${MathGL_VERSION_MAJOR}.${MathGL_VERSION_MINOR}.${MathGL_PATCH_VERSION})
+set(MathGL_SOVERSION 7.5.0)
+
+set(MathGL_INSTALL_LIB_DIR "lib" CACHE PATH "Installation directory for libraries")
+set(MathGL_INSTALL_BIN_DIR "bin" CACHE PATH "Installation directory for executables")
+set(MathGL_INSTALL_INCLUDE_DIR "include" CACHE PATH "Installation directory for headers")
+if(WIN32 AND NOT CYGWIN)
+  set(DEF_INSTALL_CMAKE_DIR cmake)
+else()
+  set(DEF_INSTALL_CMAKE_DIR lib/cmake/mathgl)
+endif()
+set(MathGL_INSTALL_CMAKE_DIR ${DEF_INSTALL_CMAKE_DIR} CACHE PATH "Installation directory for CMake files")
+# Make relative paths absolute (needed later on)
+foreach(p LIB BIN INCLUDE CMAKE)
+  set(var MathGL_INSTALL_${p}_DIR)
+  if(NOT IS_ABSOLUTE "${${var}}")
+    set(${var} "${CMAKE_INSTALL_PREFIX}/${${var}}")
+  endif()
+endforeach()
+
+macro(mgl_po_src)
+    set(l_files )
+    foreach(src_file ${ARGN})
+        get_filename_component(fp ${src_file} ABSOLUTE)
+        file(RELATIVE_PATH rel ${CMAKE_SOURCE_DIR} ${fp})
+        list(APPEND l_files "${rel}")
+    endforeach(src_file ${ARGN})
+    set(po_files ${po_files} ${l_files} PARENT_SCOPE)
+endmacro(mgl_po_src)
 
 function(mgl_add_lib mgl_tmp_lib)
        if(${mgl_tmp_lib} MATCHES mgl)
@@ -28,23 +61,37 @@ function(mgl_add_lib mgl_tmp_lib)
        add_library(${mgllib} SHARED ${mgl_src_lst})
        add_library(${mgllib}-static STATIC ${mgl_src_lst})
        set_target_properties(${mgllib} PROPERTIES SOVERSION ${MathGL_SOVERSION})
-       set_target_properties(${mgllib} PROPERTIES CLEAN_DIRECT_OUTPUT 1)
        set_target_properties(${mgllib} PROPERTIES DEFINE_SYMBOL "mgl_EXPORTS")
-       set_target_properties(${mgllib}-static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
+       set_target_properties(${mgllib} PROPERTIES C_VISIBILITY_PRESET hidden)
+       set_target_properties(${mgllib} PROPERTIES CXX_VISIBILITY_PRESET hidden)
+       set_target_properties(${mgllib} PROPERTIES VISIBILITY_INLINES_HIDDEN 1)
        target_compile_definitions(${mgllib}-static PUBLIC MGL_STATIC_DEFINE)
-
+       if(MSVC)
+          set(mgl_lib_static "-static")
+           if(CMAKE_BUILD_TYPE STREQUAL "Debug")
+               set(mgl_lib_end "d")
+          else(CMAKE_BUILD_TYPE STREQUAL "Debug")
+               set(mgl_lib_end)
+           endif(CMAKE_BUILD_TYPE STREQUAL "Debug")
+       elseif(MSVC)
+          set(mgl_lib_static)
+           set_target_properties(${mgllib} PROPERTIES CLEAN_DIRECT_OUTPUT 1)
+          set_target_properties(${mgllib}-static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
+       endif(MSVC)
        if(enable-mgl2)
-               set_target_properties(${mgllib} PROPERTIES OUTPUT_NAME "${mgllib2}")
-               set_target_properties(${mgllib}-static PROPERTIES OUTPUT_NAME "${mgllib2}")
+               set_target_properties(${mgllib} PROPERTIES OUTPUT_NAME "${mgllib2}${mgl_lib_end}")
+               set_target_properties(${mgllib}-static PROPERTIES OUTPUT_NAME "${mgllib2}${mgl_lib_static}${mgl_lib_end}")
        else(enable-mgl2)
-               set_target_properties(${mgllib}-static PROPERTIES OUTPUT_NAME "${mgllib}")
+               set_target_properties(${mgllib} PROPERTIES OUTPUT_NAME "${mgllib}${mgl_lib_end}")
+               set_target_properties(${mgllib}-static PROPERTIES OUTPUT_NAME "${mgllib}${mgl_lib_static}${mgl_lib_end}")
        endif(enable-mgl2)
 
        install(
                TARGETS ${mgllib} ${mgllib}-static
-               RUNTIME DESTINATION bin
-               ARCHIVE DESTINATION ${MGL_LIB_INSTALL_DIR}
-               LIBRARY DESTINATION ${MGL_LIB_INSTALL_DIR}
+               EXPORT MathGLTargets
+               RUNTIME DESTINATION ${MathGL_INSTALL_BIN_DIR}
+               ARCHIVE DESTINATION ${MathGL_INSTALL_LIB_DIR}
+               LIBRARY DESTINATION ${MathGL_INSTALL_LIB_DIR}
        )
 endfunction(mgl_add_lib mgl_tmp_lib)
 
@@ -91,9 +138,12 @@ MACRO(MGL_DEPENDENT_OPTION option doc default depends1 force1 depends2 force2)
 ENDMACRO(MGL_DEPENDENT_OPTION)
 include(CMakeDependentOption)
 
-set(MGL_LIB_INSTALL_DIR "lib" CACHE STRING "Set library install directory")
 string(TIMESTAMP MGL_NIGHT "%d.%m.%y")
 
+if(WIN32)
+       option(enable-dep-dll "Enable copying off all dependent dll libraries to the install directory" OFF)
+endif(WIN32)
+
 option(enable-double "Enable double precision in MathGL library" ON)
 option(enable-mpi "Enable mpi")
 option(enable-opengl "Enable OpenGL support" ON)
@@ -114,13 +164,14 @@ endif(enable-pthread AND enable-openmp)
 option(enable-lgpl "Enable only LGPL part of MathGL")
 option(enable-mgl2 "Use names 'libmgl2-*' instead of 'libmgl-*'")
 option(enable-ltdl "Enable loading modules support")
-CMAKE_DEPENDENT_OPTION(enable-doc-site "Enable HTML documentation for website" OFF "NOT enable-all-docs" ON)
+option(enable-doc-site "Enable HTML documentation for website")
+#CMAKE_DEPENDENT_OPTION(enable-doc-site "Enable HTML documentation for website" OFF "NOT enable-all-docs" ON)
 CMAKE_DEPENDENT_OPTION(enable-doc-html "Enable HTML documentation" OFF "NOT enable-all-docs" ON)
 CMAKE_DEPENDENT_OPTION(enable-doc-info "Enable INFO documentation" OFF "NOT enable-all-docs" ON)
 CMAKE_DEPENDENT_OPTION(enable-doc-pdf-ru "Enable Russian PDF documentation" OFF "NOT enable-all-docs" ON)
 CMAKE_DEPENDENT_OPTION(enable-doc-pdf-en "Enable English PDF documentation" OFF "NOT enable-all-docs" ON)
-CMAKE_DEPENDENT_OPTION(enable-doc-prc "Enable PDF samples for HTML docs" OFF "NOT enable-all-docs" ON)
-CMAKE_DEPENDENT_OPTION(enable-doc-json "Enable JSON samples for HTML docs" OFF "NOT enable-all-docs" ON)
+#CMAKE_DEPENDENT_OPTION(enable-doc-prc "Enable PDF samples for HTML docs" OFF "NOT enable-all-docs" ON)
+#CMAKE_DEPENDENT_OPTION(enable-doc-json "Enable JSON samples for HTML docs" OFF "NOT enable-all-docs" ON)
 option(enable-texi2html "Use texi2html (obsolete package) instead of texi2any" OFF)
 CMAKE_DEPENDENT_OPTION(enable-mgltex "Enable installation of mgltex package (MGL scripts in LATEX document)" OFF "NOT enable-lgpl" OFF)
 
@@ -136,26 +187,53 @@ CMAKE_DEPENDENT_OPTION(enable-glut "Enable glut support" OFF "NOT enable-all-wid
 CMAKE_DEPENDENT_OPTION(enable-fltk "Enable fltk widget" OFF "NOT enable-all-widgets" ON)
 CMAKE_DEPENDENT_OPTION(enable-wx "Enable wxWidget widget" OFF "NOT enable-all-widgets" ON)
 CMAKE_DEPENDENT_OPTION(enable-qt4 "Enable Qt4 widget" OFF "NOT enable-all-widgets" ON)
+CMAKE_DEPENDENT_OPTION(enable-qt4asqt "Set Qt4 as default libmgl-qt" OFF "enable-qt4" OFF)
 CMAKE_DEPENDENT_OPTION(enable-qt5 "Enable Qt5 widget" OFF "NOT enable-all-widgets" ON)
-CMAKE_DEPENDENT_OPTION(enable-qt5asqt "Set Qt5 as default libmgl-qt" ON "enable-qt5" OFF)
+CMAKE_DEPENDENT_OPTION(enable-qt5asqt "Set Qt5 as default libmgl-qt" OFF "enable-qt5" OFF)
+
+# msvc fwprintf print char* for the specifier of "%s" format
+if(MSVC AND MSVC_VERSION GREATER 1899)
+       SET(CMAKE_CXX_FLAGS "/EHsc -D_CRT_STDIO_ISO_WIDE_SPECIFIERS ${CMAKE_CXX_FLAGS}")
+       SET(CMAKE_C_FLAGS "-D_CRT_STDIO_ISO_WIDE_SPECIFIERS ${CMAKE_C_FLAGS}")
+endif(MSVC AND MSVC_VERSION GREATER 1899)
 
-if(UNIX AND enable-rvalue)
-       SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
-endif(UNIX AND enable-rvalue)
+include(CheckCXXSourceCompiles)
 
-# MSVC does not require any special flags
+if(${CMAKE_SIZEOF_VOID_P} EQUAL 4)
+       set(CMAKE_REQUIRED_FLAGS -msse2 -mfpmath=sse)
+       CHECK_CXX_SOURCE_COMPILES("
+               int main(void){}" mgl_sse)
+       if(mgl_sse)
+               SET(CMAKE_CXX_FLAGS "-msse2 -mfpmath=sse ${CMAKE_CXX_FLAGS}")
+               SET(CMAKE_C_FLAGS "-msse2 -mfpmath=sse ${CMAKE_C_FLAGS}")
+       endif(mgl_sse)
+       unset(CMAKE_REQUIRED_FLAGS)
+endif(${CMAKE_SIZEOF_VOID_P} EQUAL 4)
 
 if(enable-qt4 OR enable-qt5)
-set(QT_ENABLED ON)
+       set(QT_ENABLED ON)
+       if(enable-qt4asqt AND enable-qt5asqt)
+               message(SEND_ERROR "You cannot make Qt4 and Qt5 as qt at the same time.")
+       endif(enable-qt4asqt AND enable-qt5asqt)
+       if(enable-qt4 AND NOT enable-qt5)
+               set(enable-qt4asqt TRUE)
+       endif(enable-qt4 AND NOT enable-qt5)
+       if(enable-qt5 AND NOT enable-qt4)
+               set(enable-qt5asqt TRUE)
+       endif(enable-qt5 AND NOT enable-qt4)
+#      if(NOT enable-opengl)
+#              message(SEND_ERROR "You cannot build MathGL with Qt4 or Qt5 without OpenGL enabled.")
+#      endif(NOT enable-opengl)
 endif(enable-qt4 OR enable-qt5)
 
-CMAKE_DEPENDENT_OPTION(enable-json-sample "Enable JSON sample" ON "QT_ENABLED" OFF)
+CMAKE_DEPENDENT_OPTION(enable-json-sample "Enable JSON sample (WebKit variant is the default)." ON "QT_ENABLED" OFF)
+CMAKE_DEPENDENT_OPTION(enable-json-sample-we "Enable JSON sample (WebEngine variant)." OFF "enable-json-sample" OFF)
 MGL_DEPENDENT_OPTION(enable-python "Enable python interface" OFF "NOT enable-lgpl" ON "NOT enable-all-swig" ON)
 MGL_DEPENDENT_OPTION(enable-lua "Enable Lua (v.5.1) interface" OFF "NOT enable-lgpl" ON "NOT enable-all-swig" ON)
 MGL_DEPENDENT_OPTION(enable-octave "Enable octave interface" OFF "NOT enable-lgpl" ON "NOT enable-all-swig" ON)
 MGL_DEPENDENT_OPTION(enable-octave-install "Octave interface will install for all users" ON "NOT enable-lgpl" ON "NOT enable-all-swig" ON)
 
-include_directories( ${MathGL_SOURCE_DIR}/include ${MathGL_BINARY_DIR}/include)
+include_directories( ${MathGL2_SOURCE_DIR}/include ${MathGL2_BINARY_DIR}/include)
 set(MGL_INCLUDE_PATH "${CMAKE_INSTALL_PREFIX}/include/mgl2")
 set(MGL_CGI_PATH "${CMAKE_INSTALL_PREFIX}/share/mathgl" CACHE STRING "Set CGI install directory")
 set(MGL_DEF_FONT "STIX" CACHE STRING "Set default font name")
@@ -183,16 +261,18 @@ endif(WORDS_BIGENDIAN)
 CHECK_FUNCTION_EXISTS(sin MGL_SIN)
 CHECK_FUNCTION_EXISTS(memrchr HAVE_MEMRCHR)
 if(NOT MGL_SIN)
-        cmake_push_check_state()
-        set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} m)
-        CHECK_FUNCTION_EXISTS(sin MGL_SIN_M)
-        cmake_pop_check_state()
-        if(MGL_SIN_M)
-                set(M_LIB m)
-        elseif(MGL_SIN_M)
-                message(SEND_ERROR "Math library not found")
-        endif(MGL_SIN_M)
+       cmake_push_check_state()
+       set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} m)
+       CHECK_FUNCTION_EXISTS(sin MGL_SIN_M)
+       cmake_pop_check_state()
+       if(MGL_SIN_M)
+               set(M_LIB m)
+       elseif(MGL_SIN_M)
+               message(SEND_ERROR "Math library not found")
+       endif(MGL_SIN_M)
 endif(NOT MGL_SIN)
+set(MGL_DEP_LIBS ${M_LIB} ${MGL_DEP_LIBS})
+
 if(HAVE_MEMRCHR)
        ADD_DEFINITIONS(-DHAVE_MEMRCHR)
 endif(HAVE_MEMRCHR)
@@ -200,8 +280,7 @@ endif(HAVE_MEMRCHR)
 include(CheckTypeSize)
 check_type_size("long" SIZEOF_LONG)
 
-include(CheckCXXSourceCompiles)
-unset(MGL_HAVE_C99_COMPLEX)
+#unset(MGL_HAVE_C99_COMPLEX)
 CHECK_CXX_SOURCE_COMPILES(
 "#include <complex>
 #include <complex.h>
@@ -214,7 +293,7 @@ if(NOT MGL_HAVE_C99_COMPLEX)
        set(MGL_HAVE_C99_COMPLEX 0)
 endif(NOT MGL_HAVE_C99_COMPLEX)
 
-unset(MGL_HAVE_NAN_INF)
+#unset(MGL_HAVE_NAN_INF)
 CHECK_CXX_SOURCE_COMPILES(
 "#include <math.h>
 int main(){double a=NAN, b=INFINITY;return 0;}" MGL_HAVE_NAN_INF)
@@ -222,7 +301,7 @@ if(NOT MGL_HAVE_NAN_INF)
        set(MGL_HAVE_NAN_INF 0)
 endif(NOT MGL_HAVE_NAN_INF)
 
-unset(MGL_HAVE_ATTRIBUTE)
+#unset(MGL_HAVE_ATTRIBUTE)
 CHECK_CXX_SOURCE_COMPILES(
 "int __attribute__((pure)) test1() {return 0;}
 int __attribute__((const)) test2(int x) {return x*x;}
@@ -231,21 +310,30 @@ if(NOT MGL_HAVE_ATTRIBUTE)
        set(MGL_HAVE_ATTRIBUTE 0)
 endif(NOT MGL_HAVE_ATTRIBUTE)
 
-unset(MGL_HAVE_TYPEOF)
-CHECK_CXX_SOURCE_COMPILES(
-"#define mgl_isnum(a)  ({typeof (a) _a = (a); _a==_a;})
-int main(){bool a=mgl_isnum(1);return 0;}" MGL_HAVE_TYPEOF)
-if(NOT MGL_HAVE_TYPEOF)
-       set(MGL_HAVE_TYPEOF 0)
-endif(NOT MGL_HAVE_TYPEOF)
+if(NOT MSVC AND enable-rvalue)
+       SET(CMAKE_CXX_FLAGS "-std=gnu++11 ${CMAKE_CXX_FLAGS}")
+       unset(MGL_HAVE_RVAL CACHE)
+       CHECK_CXX_SOURCE_COMPILES(
+       "struct test { test() {} test(test&& a){} };
+       int main() { test t;    return 0; }" MGL_HAVE_RVAL)
+       if(NOT MGL_HAVE_RVAL)
+               message(SEND_ERROR "Couldn't enable rvalue.")
+#              set(MGL_HAVE_RVAL 0)
+       endif(NOT MGL_HAVE_RVAL)
+else(NOT MSVC AND enable-rvalue)
+       set(MGL_HAVE_RVAL 0)
+endif(NOT MSVC AND enable-rvalue)
+
+
 
-unset(MGL_HAVE_RVAL)
 CHECK_CXX_SOURCE_COMPILES(
-"struct test { test() {} test(test&& a){} };
-int main() { test t;   return 0; }" MGL_HAVE_RVAL)
-if(NOT MGL_HAVE_RVAL)
-       set(MGL_HAVE_RVAL 0)
-endif(NOT MGL_HAVE_RVAL)
+"#include <getopt.h>
+int main(int argc, char *args[]) {
+int ch = getopt(argc, args, \"1:2:3:4:5:6:7:8:9:hno:L:C:A:s:S:q:\"); return 0; }" MGL_HAVE_GETOPT)
+if(NOT MGL_HAVE_GETOPT)
+       include_directories(${MathGL2_SOURCE_DIR}/addons/getopt)
+       set(getopt_lib-static getopt-static)
+endif(NOT MGL_HAVE_GETOPT)
 
 if(enable-double)
        set(MGL_USE_DOUBLE 1)
@@ -281,24 +369,22 @@ else(enable-mpi)
        set(MGL_HAVE_MPI 0)
 endif(enable-mpi)
 
-if(enable-pthread)
-       set(MGL_HAVE_PTHREAD 1)
-       include(FindThreads)
-       if(NOT CMAKE_USE_PTHREADS_INIT)
-               message(SEND_ERROR "Couldn't find POSIX threads library.")
-       endif(NOT CMAKE_USE_PTHREADS_INIT)
-else(enable-pthread)
-       set(MGL_HAVE_PTHREAD 0)
-endif(enable-pthread)
 
 if(enable-pthr-widget OR enable-pthread)
+       if(enable-pthread)
+               set(MGL_HAVE_PTHREAD 1)
+       else(enable-pthread)
+               set(MGL_HAVE_PTHREAD 0)
+       endif(enable-pthread)
        set(MGL_HAVE_PTHR_WIDGET 1)
        include(FindThreads)
        if(NOT CMAKE_USE_PTHREADS_INIT)
                message(SEND_ERROR "Couldn't find POSIX threads library.")
        endif(NOT CMAKE_USE_PTHREADS_INIT)
+       set(MGL_DEP_LIBS ${CMAKE_THREAD_LIBS_INIT} ${MGL_DEP_LIBS})
 else(enable-pthr-widget OR enable-pthread)
        set(MGL_HAVE_PTHR_WIDGET 0)
+       set(MGL_HAVE_PTHREAD 0)
 endif(enable-pthr-widget OR enable-pthread)
 
 if(enable-gsl)
@@ -318,6 +404,8 @@ if(enable-gsl)
                int main(){gsl_multifit_fdfsolver *s=0;gsl_matrix *J = 0;
                gsl_multifit_fdfsolver_jac(s, J);}" MGL_HAVE_GSL2)
        endif(NOT GSL_LIB OR NOT GSL_CBLAS_LIB OR NOT GSL_INCLUDE_DIR)
+       set(MGL_DEP_LIBS ${GSL_LIB} ${GSL_CBLAS_LIB} ${MGL_DEP_LIBS})
+       include_directories(${GSL_INCLUDE_DIR})
 else(enable-gsl)
        set(MGL_HAVE_GSL 0)
 endif(enable-gsl)
@@ -331,6 +419,8 @@ if(enable-all OR enable-ltdl)
                message(SEND_ERROR "${LTDL_INCLUDE_DIR}")
                message(SEND_ERROR "Couldn't find LTDL library.")
        endif(NOT LTDL_LIB OR NOT LTDL_INCLUDE_DIR)
+       set(MGL_DEP_LIBS ${LTDL_LIB} ${MGL_DEP_LIBS})
+       include_directories(${LTDL_INCLUDE_DIR})
 else(enable-all OR enable-ltdl)
        set(MGL_HAVE_LTDL 0)
 endif(enable-all OR enable-ltdl)
@@ -346,6 +436,8 @@ if(enable-hdf4)
                message(SEND_ERROR "${HDF4_INCLUDE_DIR}")
                message(SEND_ERROR "Couldn't find HDF4 libraries.")
        endif(NOT HDF4_LIB OR NOT HDF4MF_LIB OR NOT HDF4_INCLUDE_DIR)
+       set(MGL_DEP_LIBS ${HDF4MF_LIB} ${HDF4_LIB} ${MGL_DEP_LIBS})
+       include_directories(${HDF4_INCLUDE_DIR})
 else(enable-hdf4)
        set(MGL_HAVE_HDF4 0)
 endif(enable-hdf4)
@@ -359,6 +451,8 @@ if(enable-hdf5)
                        message(SEND_ERROR "Couldn't find HDF5 library.")
                endif(NOT HDF5_FOUND)
        endif(NOT HDF5_FOUND)
+       set(MGL_DEP_LIBS ${HDF5_LIBRARIES} ${HDF5_C_SHARED_LIBRARY} ${MGL_DEP_LIBS})
+       include_directories(${HDF5_INCLUDE_DIRS})
 else(enable-hdf5)
        set(MGL_HAVE_HDF5 0)
 endif(enable-hdf5)
@@ -369,6 +463,8 @@ if(enable-jpeg)
        if(NOT JPEG_FOUND)
                message(SEND_ERROR "Couldn't find JPEG library.")
        endif(NOT JPEG_FOUND)
+       set(MGL_DEP_LIBS ${JPEG_LIBRARIES} ${MGL_DEP_LIBS})
+       include_directories(${JPEG_INCLUDE_DIR})
 else(enable-jpeg)
        set(MGL_HAVE_JPEG 0)
 endif(enable-jpeg)
@@ -380,6 +476,8 @@ if(enable-zlib)
        if(NOT ZLIB_FOUND)
                message(SEND_ERROR "Couldn't find ZLib library.")
        endif(NOT ZLIB_FOUND)
+       set(MGL_DEP_LIBS ${ZLIB_LIBRARIES} ${MGL_DEP_LIBS})
+       include_directories(${ZLIB_INCLUDE_DIR})
 else(enable-zlib)
        set(MGL_HAVE_ZLIB 0)
 endif(enable-zlib)
@@ -393,6 +491,8 @@ if(enable-png)
        if(NOT PNG_FOUND)
                message(SEND_ERROR "Couldn't find PNG library.")
        endif(NOT PNG_FOUND)
+       set(MGL_DEP_LIBS ${PNG_LIBRARIES} ${MGL_DEP_LIBS})
+       include_directories(${PNG_INCLUDE_DIR})
 else(enable-png)
        set(MGL_HAVE_PNG 0)
 endif(enable-png)
@@ -411,6 +511,8 @@ if(enable-pdf)
        if(NOT HPDF_INCLUDE_DIR)
                message(SEND_ERROR "Couldn't find headers of 3d-enabled version of libhpdf.")
        endif(NOT HPDF_INCLUDE_DIR)
+       include_directories(${HPDF_INCLUDE_DIR})
+       set(MGL_DEP_LIBS ${HPDF_LIB} ${MGL_DEP_LIBS})
 else(enable-pdf)
        set(MGL_HAVE_PDF 0)
 endif(enable-pdf)
@@ -421,6 +523,8 @@ if(enable-gif)
        if(NOT GIF_FOUND)
                message(SEND_ERROR "Couldn't find GIF library.")
        endif(NOT GIF_FOUND)
+       set(MGL_DEP_LIBS ${GIF_LIBRARIES} ${MGL_DEP_LIBS})
+       include_directories(${GIF_INCLUDE_DIR})
 else(enable-gif)
        set(MGL_HAVE_GIF 0)
 endif(enable-gif)
@@ -431,6 +535,8 @@ if(enable-opengl)
        if(NOT OPENGL_FOUND)
                message(SEND_ERROR "Couldn't find OpenGL libraries.")
        endif(NOT OPENGL_FOUND)
+       set(MGL_DEP_LIBS ${OPENGL_LIBRARIES} ${MGL_DEP_LIBS})
+       include_directories(${OPENGL_INCLUDE_DIR} )
 else(enable-opengl)
        set(MGL_HAVE_OPENGL 0)
 endif(enable-opengl)
@@ -450,10 +556,18 @@ endif(enable-glut)
 
 if(enable-fltk)
        set(MGL_HAVE_FLTK 1)
-       include(FindFLTK)
+       FIND_PACKAGE(FLTK)
        if(NOT FLTK_FOUND)
                message(SEND_ERROR "Couldn't find FLTK library.")
+       else(NOT FLTK_FOUND)
+               include_directories(${FLTK_INCLUDE_DIR})
+               CHECK_CXX_SOURCE_COMPILES(
+               "#include <FL/Fl_Copy_Surface.H>
+               int main(){return 0;}" MGL_HAVE_FL_COPY)
        endif(NOT FLTK_FOUND)
+       if(NOT MGL_HAVE_FL_COPY)
+               set(MGL_HAVE_FL_COPY 0)
+       endif(NOT MGL_HAVE_FL_COPY)
 else(enable-fltk)
        set(MGL_HAVE_FLTK 0)
 endif(enable-fltk)
@@ -468,6 +582,32 @@ else(enable-wx)
        set(MGL_HAVE_WX 0)
 endif(enable-wx)
 
+
+find_program(findxgettext xgettext)
+find_program(findmsgmerge msgmerge)
+find_program(findmsgfmt msgfmt)
+find_program(findmsgcat msgcat)
+if(NOT findmsgfmt OR NOT findxgettext OR NOT findmsgmerge OR NOT findmsgcat )
+       message("Building of translation files was disabled, because xgettext, msgmerge, msgcat or msgfmt was not found. Current translations will be just coped.")
+       set(USE_GETTEXT 0)
+else(NOT findmsgfmt  OR NOT findxgettext OR NOT findmsgmerge OR NOT findmsgcat )
+       set(USE_GETTEXT 1)
+endif(NOT findmsgfmt  OR NOT findxgettext OR NOT findmsgmerge OR NOT findmsgcat )
+find_package(Intl)
+if(NOT Intl_FOUND)
+       set(MGL_USE_LIBINTL 0)
+       message("Gettext and translations was fully disabled, because libintl was not found.")
+else(NOT Intl_FOUND)
+       set(MGL_USE_LIBINTL 1)
+       set(MGL_DEP_LIBS ${Intl_LIBRARIES} ${MGL_DEP_LIBS})
+       include_directories(${Intl_INCLUDE_DIRS})
+endif(NOT Intl_FOUND)
+set(po_files )
+if(WIN32)
+       set(USE_GETTEXT 0)
+       set(MGL_USE_LIBINTL 0)
+endif(WIN32)
+
 if(enable-doc-info)
        set(MGL_HAVE_DOC_INFO 1)
        find_program(findmi makeinfo)
@@ -534,20 +674,20 @@ else(enable-doc-pdf-en)
        set(MGL_HAVE_DOC_PDF_EN 0)
 endif(enable-doc-pdf-en)
 
-if(enable-doc-json)
+if(enable-doc-site)
        set(MGL_HAVE_DOC_JSON 1)
-else(enable-doc-json)
+else(enable-doc-site)
        set(MGL_HAVE_DOC_JSON 0)
-endif(enable-doc-json)
+endif(enable-doc-site)
 
-if(enable-doc-prc)
+if(enable-doc-site)
        set(MGL_HAVE_DOC_PRC 1)
        if(NOT enable-pdf)
                message(SEND_ERROR "You need to enable pdf support for MathGL.")
        endif(NOT enable-pdf)
-else(enable-doc-prc)
+else(enable-doc-site)
        set(MGL_HAVE_DOC_PRC 0)
-endif(enable-doc-prc)
+endif(enable-doc-site)
 
 if(UNIX)
        add_definitions(-DNO_COLOR_ARRAY)
@@ -557,26 +697,32 @@ if(WIN32)
        add_definitions(-DWIN32)
 endif(WIN32)
 
+if(NOT MGL_HAVE_GETOPT)
+       add_subdirectory( addons/getopt )
+endif(NOT MGL_HAVE_GETOPT)
+
 add_subdirectory( src )
 add_subdirectory( widgets )
 add_subdirectory( include )
 if(NOT enable-lgpl)
-       add_subdirectory( udav )
-       add_subdirectory( json )
+       if(MGL_HAVE_QT)
+               add_subdirectory( udav )
+               if(enable-json-sample)
+                       add_subdirectory( json )
+               endif(enable-json-sample)
+       endif(MGL_HAVE_QT)
        if(enable-python OR enable-lua OR enable-octave)
                add_subdirectory( lang )
        endif(enable-python OR enable-lua OR enable-octave)
-       if(NOT MSVC AND NOT BORLAND)
-               add_subdirectory( utils )
-       endif(NOT MSVC AND NOT BORLAND)
-       if(NOT WIN32)
-               add_subdirectory( fonts )
-       endif(NOT WIN32)
-#      add_subdirectory( mgllab )
+add_subdirectory( utils )
+add_subdirectory( examples )
+if(NOT WIN32)
+       add_subdirectory( fonts )
+endif(NOT WIN32)
+add_subdirectory( mgllab )
 endif(NOT enable-lgpl)
 
 if(NOT MSVC AND NOT BORLAND)
-       add_subdirectory( examples )
 
        if(MGL_HAVE_DOC_HTML OR MGL_HAVE_DOC_SITE OR MGL_HAVE_DOC_INFO OR MGL_HAVE_DOC_PDF_RU OR MGL_HAVE_DOC_PDF_EN )
                add_subdirectory( texinfo )
@@ -588,8 +734,36 @@ if(enable-mgltex)
        add_subdirectory( mgltex )
 endif(enable-mgltex)
 
-if(WIN32)
-       install(FILES ${CMAKE_SOURCE_DIR}/FindMathGL2.cmake DESTINATION ${CMAKE_INSTALL_PREFIX} RENAME mathgl2-config.cmake)
-else(WIN32)
-       install(FILES ${CMAKE_SOURCE_DIR}/FindMathGL2.cmake DESTINATION ${MGL_LIB_INSTALL_DIR}/cmake/mathgl2/ RENAME mathgl2-config.cmake)
-endif(WIN32)
+if(MGL_USE_LIBINTL)
+       if(USE_GETTEXT)
+               set(mgl_tl_list )
+               add_custom_command(OUTPUT mathgl.pot
+                       COMMAND ${findxgettext} -s --keyword=_ -C -c --package-name=MathGL2 --package-version=${MathGL_VERSION} -o ${MathGL2_BINARY_DIR}/mathgl.pot ${po_files}
+                       WORKING_DIRECTORY ${MathGL2_SOURCE_DIR}/
+                       DEPENDS ${po_files} )
+               set(mgl_clean_files mathgl.pot ${mgl_clean_files})
+               foreach(tl ru es) # en)
+                       add_custom_command(OUTPUT mathgl_${tl}.po.done
+                               COMMAND ${findmsgmerge} -U mathgl_${tl}.po ${MathGL2_BINARY_DIR}/mathgl.pot
+                               COMMAND ${CMAKE_COMMAND} -E touch ${MathGL2_BINARY_DIR}/mathgl_${tl}.po.done
+                               WORKING_DIRECTORY ${MathGL2_SOURCE_DIR}/
+                               DEPENDS mathgl.pot mathgl_${tl}.po)
+                       add_custom_command(OUTPUT mathgl_${tl}.mo
+                               COMMAND ${findmsgfmt} -o mathgl_${tl}.mo ${MathGL2_SOURCE_DIR}/mathgl_${tl}.po
+                               DEPENDS mathgl_${tl}.po.done)
+                       install( FILES ${MathGL2_BINARY_DIR}/mathgl_${tl}.mo DESTINATION "${CMAKE_INSTALL_PREFIX}/share/locale/${tl}/LC_MESSAGES/" RENAME mathgl.mo )
+                       set(mgl_tl_list mathgl_${tl}.mo ${mgl_tl_list})
+                       set(mgl_clean_files mathgl_${tl}.mo mathgl_${tl}.po.done ${mgl_clean_files})
+               endforeach(tl)
+               add_custom_target(mgl_translations ALL DEPENDS ${mgl_tl_list})
+       else(USE_GETTEXT)
+               foreach(tl ru es) # en)
+                       install( FILES ${MathGL2_SOURCE_DIR}/translations/mathgl_${tl}.mo DESTINATION "${CMAKE_INSTALL_PREFIX}/share/locale/${tl}/LC_MESSAGES/" RENAME mathgl.mo )
+               endforeach(tl)
+       endif(USE_GETTEXT)
+endif(MGL_USE_LIBINTL)
+
+set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${mgl_clean_files}")
+
+# WARNING!!! DO NOT ADD ANYTHING AFTER THIS LINE!
+add_subdirectory ( scripts )
index c481c3d1cbd79b19f2dc9dc1307245b1bc77b165..bc31bff515ebc431808f146336ae3a76d8ed62dd 100644 (file)
@@ -1,3 +1,121 @@
+2.4.1 Released 20 July 2017
+
+* Add 'beltc' plot, which is 'belt' with manual coloring.
+* Add style '~' for 'plot' and 'tens' to omit some points at output.
+* Add style ':' for 'axis' to draw lines through point (0,0,0).
+* Bugfixes
+
+2.4 Released 17 May 2017
+
+* Add mgllab executable, which is FLTK based version of UDAV. Most things mgllab do faster.
+* Add string manipulation in MGL language:
+       o 'str'[n] -- get string of only n-th symbol;
+       o 'str'+v -- add value v to the last character of the string;
+       o 'str',val || 'str',!val -- append numeric value to the string (as before).
+* Add time value to MGL language in format: "hh-mm-ss_DD.MM.YYYY" or "hh-mm-ss" or "DD.MM.YYYY".
+* Add 'iris' plot to show cross-dependencies of several data arrays.
+* Add 'flame2d' to draw flame fractals.
+* Add 'bbox' to set bounding box for 2D output.
+* Add 'section' to get part of data between specified values.
+* Add 'detect' to found curves along data maximums.
+* Add 'dilate' to extend the region of 1-th value.
+* Add 'erode' to narrow the region of 1-th value.
+* Add 'apde' to solve PDE equation in inhomogeneous nonlinear media with spatial dispersion.
+* Add 'symbol' to draw the glyphs defined by 'addsymbol'.
+* Add 'addsymbol' to declare user-defined symbol (or glyph), which can be used as markers for plot (with style '&') or drawn itself by 'symbol' command.
+* Add 'openhdf' to open all data arrays from HDF file.
+* Extend 'crop' to cut to optimal size for FFT (i.e. to closest of 2^n*3^m*5^l).
+* Add function mgl_data_max_first() and data suffixes .m[xyz][fl] to find first/last maximum along direction.
+* Add function mgl_datac_diff_par() to parametric derivative of complex data.
+* Add style 'F' for 'bars' and 'barh' to set fixed bar widths.
+* Add style 'a' for 'plot', 'tens', 'area' and 'region' to accurate drawing of data, which partially lie out of axis range.
+* Add style '#' for 'region' to draw wired plot.
+* Add possibility of manual shift in 'multiplot'.
+* Add parsing arguments of options for MGL commands.
+* MGL command 'correl' now can perform 2d and 3d correlations.
+* Option 'meshnum' now change the number of drawn markers for 'plot', 'tens', 'step, 'mark' and 'textmark'.
+* Function 'step' handle data with x.nx>y.nx similarly to 'bars'.
+* Extend 'tile' and 'tiles' by adding manual coloring and face orientation.
+* Add variant of MGL command 'copy' to copy data with "incorrect" names.
+* Improve tick labels drawing.
+* Improve time-ticks (add weeks) and add subticks to its.
+* Improve 'fplot' to handle several singularities.
+* Add LaTeX command \dfrac{}{}. This is full-sized version of \frac{}{}. Unfortunately, there is no support of nesting (i.e. \dfrac{\dfrac{}{}}{} not working). Contrary, \frac{}{} allow nesting.
+* Add mglODEc() -- ODE solver for complex variables.
+* Add cmplx(a,b)=a+i*b to the list of known functions in formula parsing
+* Update CMake find_package to find MathGL.
+* Increase line width for wired text.
+* Update documentation: add description of new commands, add hint @ref{Mixing bitmap and vector output}.
+* Add translation to Russian for most of labels and messages.
+* Name 'all' are reserved in MGL scripts now as synonym of -1.
+
+* INCOMPATIBLE: Replace libmgl-qt by libmgl-qt4 and libmgl-qt5 for resolving conflicts of simultaneously installed both Qt4 and Qt5.
+* Minor bugfixes.
+
+
+2.3.5.1 Released 20 June 2016
+
+* INCOMPATIBLE: library libmgl-qt is removed. You need to use libmgl-qt4 or libmgl-qt5 explicitly now.
+* Compatibility changes for latest MS VisualStudio.
+* Bugfixes.
+
+2.3.5 Released 16 May 2016
+
+* Greatly update mgltex (by Diego Sejas Viscarra)
+       o \MGL@codes: Bugfix: category code for tabulators is changed too
+       o \MGL@quality: 9 is accepted as quality value now
+       o \MGL@scale: Now accepts any positive value
+       o \MGL@test@switch: New command to verify and validate switching arguments
+       o \mglTeX: Add a small negative space in the logo, between the "mgl" and "TEX"
+       o \mglTeX: Declared now as robust command
+       o \mglcomments: Now accepts arguments 0 (equivalent to off) and 1 (equivalent to on), besides the usual off and on
+       o \mglgraphics: New command options: gray, mglscale, quality, variant
+       o \mglname: Now writes the MGL code line setsize 600 400 to the main script
+       o \mglplot: Added \bgroup and \egroup in order to keep changes private
+       o New command options: gray, mglscale, quality, variant
+       o \mglsettings: Added options gray and variant
+       o Now calls the \mglswitch and \mglcomments commands for the switch and comments options, respectively
+       o \mglswitch: Now accepts arguments 0 (equivalent to off) and 1 (equivalent to on), besides the usual off and on
+       o mglTeX now depends on the ifpdf package
+       o Change definition of \mglcommentname from MGL comment to mglTEX comment
+       o Introduce the concept of global, local and private settings in the documentation
+       o New commands: \mglgray (to activate/deactivate) gray-scale mode locally, and \mglvariant (to set variant of arguments in MGL scripts locally)
+       o New package option 9q for setting quality to 9 (for testing purposes of the author)
+       o New package options 0v, 1v, 2v to select variant of arguments in MGL scripts
+       o New package options gray, color to activate/deactivate gray-scale mode for graphics
+       o Remove the \MGL@setkeys command, since it isn’t needed as first thought
+       o Rename \MGL@document@scripts to \MGL@doc@scripts
+       o Rename \MGL@script@name to \MGL@script
+       o Rename command \MGL@graph@ext to \MGL@imgext
+       o Rename command \mglcommonscriptname to mglsetupscriptname
+       o Rename environment mglcommon to mglsetupscript (mglcommon is still available, but deprecated)
+       o Rename family MGL@keys as MGL@gr@keys for consistency
+       o Reorganize and update documentation
+       o Some minor bugfixes
+       o The MGL code line "setsize 600 400" is now automatically written to the main script in order for the scaling options and commands to work
+       o mgl: New environment options: gray, mglscale, quality, variant
+       o mglcode: New environment options: gray, mglscale, quality, variant
+* Add MGL command 'variant' to select proper variant of arguments (like "var1?var2?var3?...") in MGL commands.
+* Remove limitation of maximal number (was 1000) of arguments for MGL commands. This is actual for 'list' command.
+* Add mglWnd::Widget() for accessing widget which is used for drawing.
+* Add Gray() for producing gray-scaled image.
+* Add MGL command 'setsizescl' for scaling all further 'setsize'.
+* Add Shear() for shearing plot.
+* Add ShearPlot() for placing plots side-by-side with some shearing.
+* Add mglData::Limit() for limit maximal absolute value of data.
+* Add mglTridMat() for tridiagonal matrix algorithm.
+* Add MGL command 'diffract' for single step diffraction calculation.
+* Add 'ifsfile' for reading IFS fractal parameters from *.ifs file.
+* Add style '*' for 2d versions of Pipe() and Flow() to draw threads from points inside axis range.
+* Add "norm()" to the list of known functions
+* Compatibility changes for MS VisualStudio, MacOS, Win64.
+* Bugfix for legend export into EPS and SVG.
+* Bugfix for importing data from std::vector.
+* Improve Surf3*() drawing.
+* Force NAN if divided by 0 in formulas.
+* Option "-S" of mglconv now perform scaling in any cases
+
+
 2.3.4 Released 13 February 2016
 
 * Add mglData::Pulse() for determining pulse parameters.
diff --git a/FindMathGL2.cmake b/FindMathGL2.cmake
deleted file mode 100644 (file)
index 772b505..0000000
+++ /dev/null
@@ -1,145 +0,0 @@
-# - FindMathGL2.cmake
-# This module can be used to find MathGL v.2.* and several of its optional components.
-#
-# You can specify one or more component as you call this find module.
-# Possible components are: FLTK, GLUT, Qt, WX.
-#
-# The following variables will be defined for your use:
-#
-#  MATHGL2_FOUND           = MathGL v.2 and all specified components found
-#  MATHGL2_INCLUDE_DIRS    = The MathGL v.2 include directories
-#  MATHGL2_LIBRARIES       = The libraries to link against to use MathGL v.2
-#                           and all specified components
-#  MATHGL2_VERSION_STRING  = A human-readable version of the MathGL v.2 (e.g. 2.1)
-#  MATHGL2_XXX_FOUND       = Component XXX found (replace XXX with uppercased
-#                           component name -- for example, QT or FLTK)
-#
-# The minimum required version and needed components can be specified using
-# the standard find_package()-syntax, here are some examples:
-#  find_package(MathGL2 REQUIRED)                              - v.2.* (no interfaces), required
-#  find_package(MathGL2 2.1 REQUIRED Qt)               - v.2.1 + Qt interface, required
-#  find_package(MathGL2 2.1 REQUIRED)                  - v.2.1 (no interfaces), required
-#  find_package(MathGL2 2.0 COMPONENTS Qt WX)  - v.2.0 + Qt and WX interfaces, optional
-#  find_package(MathGL2 2.1)                                   - v.2.1 (no interfaces), optional
-#
-# Note, some cmake builds require to write "COMPONENTS" always, like
-#  find_package(MathGL2 REQUIRED COMPONENTS Qt)        - v.2.* + Qt interface, required
-#
-# Typical usage could be something like this:
-#   find_package(MathGL 2.1 GLUT REQUIRED)
-#   include_directories(${MATHGL2_INCLUDE_DIRS})
-#   add_executable(myexe main.cpp)
-#   target_link_libraries(myexe ${MATHGL2_LIBRARIES})
-#
-
-#=============================================================================
-# Copyright (c) 2011 Denis Pesotsky <denis@kde.ru>, 2014 Alexey Balakin <mathgl.abalakin@gmail.com>
-#
-# Distributed under the OSI-approved BSD License (the "License");
-# see accompanying file COPYING-CMAKE-MODULES for details.
-#
-# This software is distributed WITHOUT ANY WARRANTY; without even the
-# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-# See the License for more information.
-#=============================================================================
-
-FIND_PATH(MATHGL2_INCLUDE_DIR
-               NAMES mgl2/mgl.h
-               DOC "The MathGL2 v.2.* include directory")
-FIND_LIBRARY(MATHGL2_LIBRARY
-               NAMES mgl
-               PATHS ${MATHGL2_LIBRARY_DIR}
-               DOC "The MathGL v.2.* include directory")
-
-GET_FILENAME_COMPONENT(MATHGL2_LIBRARY_DIR ${MATHGL2_LIBRARY} PATH)
-
-SET(MATHGL2_LIBRARIES ${MATHGL2_LIBRARY})
-SET(MATHGL2_INCLUDE_DIRS ${MATHGL2_INCLUDE_DIR})
-
-IF(MATHGL2_INCLUDE_DIR)
-       SET(_CONFIG_FILE_PATH "${MATHGL2_INCLUDE_DIR}/mgl2/define.h")
-       SET(_VERSION_ERR "Cannot determine MathGL v.2.* version")
-       IF(EXISTS "${_CONFIG_FILE_PATH}")
-               FILE(STRINGS "${_CONFIG_FILE_PATH}"
-                       MATHGL2_VERSION_STRING REGEX "^#define MGL_VER2.*$")
-               IF(MATHGL2_VERSION_STRING)
-                       STRING(REGEX
-                               REPLACE "#define MGL_VER2" ""
-                               MATHGL2_VERSION_STRING ${MATHGL2_VERSION_STRING})
-                       STRING(REGEX
-                               REPLACE "//.*" ""
-                               MATHGL2_VERSION_STRING ${MATHGL2_VERSION_STRING})
-                       STRING(STRIP ${MATHGL2_VERSION_STRING} MATHGL2_VERSION_STRING)
-                       SET(MATHGL2_VERSION_STRING 2.${MATHGL2_VERSION_STRING})
-#                      MESSAGE(STATUS "Find MathGL version -- ${MATHGL2_VERSION_STRING}")
-               ELSE()
-                       SET(_ERR_MESSAGE "${_VERSION_ERR}: ${_CONFIG_FILE_PATH} parse error")
-               ENDIF()
-       ELSE()
-               SET(_ERR_MESSAGE "${_VERSION_ERR}: ${_CONFIG_FILE_PATH} not found")
-       ENDIF()
-       IF(_ERR_MESSAGE)
-               UNSET(_ERR_MESSAGE)
-               SET(_CONFIG_FILE_PATH "${MATHGL2_INCLUDE_DIR}/mgl2/config.h")
-               SET(_VERSION_ERR "Cannot determine MathGL v.2.* version")
-               IF(EXISTS "${_CONFIG_FILE_PATH}")
-                       FILE(STRINGS "${_CONFIG_FILE_PATH}"
-                               MATHGL2_VERSION_STRING REGEX "^#define MGL_VER2.*$")
-                       IF(MATHGL2_VERSION_STRING)
-                               STRING(REGEX
-                                       REPLACE "#define MGL_VER2" ""
-                                       MATHGL2_VERSION_STRING ${MATHGL2_VERSION_STRING})
-                               STRING(REGEX
-                                       REPLACE "//.*" ""
-                                       MATHGL2_VERSION_STRING ${MATHGL2_VERSION_STRING})
-                               STRING(STRIP ${MATHGL2_VERSION_STRING} MATHGL2_VERSION_STRING)
-                               SET(MATHGL2_VERSION_STRING 2.${MATHGL2_VERSION_STRING})
-       #                       MESSAGE(STATUS "Find MathGL version -- ${MATHGL2_VERSION_STRING}")
-                       ELSE()
-                               SET(_ERR_MESSAGE "${_VERSION_ERR}: ${_CONFIG_FILE_PATH} parse error")
-                       ENDIF()
-               ELSE()
-                       SET(_ERR_MESSAGE "${_VERSION_ERR}: ${_CONFIG_FILE_PATH} not found")
-               ENDIF()
-       ENDIF(_ERR_MESSAGE)
-
-       if(_ERR_MESSAGE)
-               MESSAGE(FATAL_ERROR ${_ERR_MESSAGE})
-       endif(_ERR_MESSAGE)
-ENDIF()
-
-INCLUDE(FindPackageHandleStandardArgs)
-FIND_PACKAGE_HANDLE_STANDARD_ARGS(MathGL2
-               REQUIRED_VARS MATHGL2_LIBRARY MATHGL2_INCLUDE_DIR
-               VERSION_VAR MATHGL2_VERSION_STRING)
-
-FOREACH(_Component ${MATHGL2_FIND_COMPONENTS})
-       STRING(TOLOWER ${_Component} _component)
-       STRING(TOUPPER ${_Component} _COMPONENT)
-
-       SET(MATHGL2_${_Component}_FIND_REQUIRED ${MATHGL2_FIND_REQUIRED})
-       SET(MATHGL2_${_Component}_FIND_QUIETLY true)
-       # TODO find qt.h for qt4 and qt5 !!!
-       FIND_PATH(MATHGL2_${_COMPONENT}_INCLUDE_DIR
-                               NAMES mgl2/${_component}.h
-                               PATHS ${MATHGL2_INCLUDE_DIR} NO_DEFAULT_PATH)
-       FIND_LIBRARY(MATHGL2_${_COMPONENT}_LIBRARY
-                               NAMES mgl-${_component}
-                               PATHS ${MATHGL2_LIBRARY_DIR} NO_DEFAULT_PATH)
-
-       FIND_PACKAGE_HANDLE_STANDARD_ARGS(MATHGL2_${_Component} DEFAULT_MSG
-                                                                               MATHGL2_${_COMPONENT}_LIBRARY
-                                                                               MATHGL2_${_COMPONENT}_INCLUDE_DIR)
-
-       IF(MATHGL2_${_COMPONENT}_FOUND)
-               SET(MATHGL2_LIBRARIES
-                       ${MATHGL2_LIBRARIES} ${MATHGL2_${_COMPONENT}_LIBRARY})
-               SET(MATHGL2_INCLUDE_DIRS
-                       ${MATHGL2_INCLUDE_DIRS} ${MATHGL2_${_COMPONENT}_INCLUDE_DIR})
-       ENDIF()
-
-       MARK_AS_ADVANCED(MATHGL2_${_COMPONENT}_INCLUDE_DIR
-                                       MATHGL2_${_COMPONENT}_LIBRARY)
-ENDFOREACH()
-
-MARK_AS_ADVANCED(MATHGL2_INCLUDE_DIR MATHGL2_LIBRARY)
diff --git a/cmake-qt4.txt b/cmake-qt4.txt
deleted file mode 100644 (file)
index 4208b52..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-set(MGL_HAVE_QT4 1)
-if(enable-json-sample)
-set(MGL_QT4_LIBS Core Gui Network WebKit OpenGL)
-FIND_PACKAGE(Qt4 4.8 REQUIRED QtCore QtGui QtNetwork QtWebKit QtOpenGL)
-else(enable-json-sample)
-set(MGL_QT4_LIBS Core Gui OpenGL)
-FIND_PACKAGE(Qt4 4.8 REQUIRED QtCore QtGui QtOpenGL)
-endif(enable-json-sample)
-if(NOT QT4_FOUND)
-       message(SEND_ERROR "Couldn't find Qt4 library.")
-endif(NOT QT4_FOUND)
-
-set(CMAKE_AUTOMOC ON)
-set(CMAKE_INCLUDE_CURRENT_DIR ON)
diff --git a/cmake-qt5.txt b/cmake-qt5.txt
deleted file mode 100644 (file)
index ff447f7..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-set(MGL_HAVE_QT5 1)
-find_package(Qt5Core REQUIRED)
-find_package(Qt5Widgets REQUIRED)
-find_package(Qt5Gui REQUIRED)
-find_package(Qt5PrintSupport REQUIRED)
-find_package(Qt5OpenGL REQUIRED)
-if(NOT Qt5OpenGL_FOUND)
-       message(SEND_ERROR "Couldn't find Qt5 OpenGL library.")
-endif(NOT Qt5OpenGL_FOUND)
-if(NOT Qt5Core_FOUND)
-       message(SEND_ERROR "Couldn't find Qt5 Core library.")
-endif(NOT Qt5Core_FOUND)
-if(NOT Qt5Gui_FOUND)
-       message(SEND_ERROR "Couldn't find Qt5 Gui library.")
-endif(NOT Qt5Gui_FOUND)
-if(NOT Qt5PrintSupport_FOUND)
-       message(SEND_ERROR "Couldn't find Qt5 PrintSupport library.")
-endif(NOT Qt5PrintSupport_FOUND)
-set(MGL_QT5_LIBS Core Gui Widgets PrintSupport OpenGL)
-if(enable-json-sample)
-find_package(Qt5Network REQUIRED)
-find_package(Qt5WebKit REQUIRED)
-find_package(Qt5WebKitWidgets REQUIRED)
-if(NOT Qt5Network_FOUND)
-       message(SEND_ERROR "Couldn't find Qt5 Network library.")
-endif(NOT Qt5Network_FOUND)
-if(NOT Qt5WebKit_FOUND)
-       message(SEND_ERROR "Couldn't find Qt5 WebKit library.")
-endif(NOT Qt5WebKit_FOUND)
-if(NOT Qt5WebKitWidgets_FOUND)
-       message(SEND_ERROR "Couldn't find Qt5 WebKitWidgets library.")
-endif(NOT Qt5WebKitWidgets_FOUND)
-set(MGL_QT5_LIBS ${MGL_QT5_LIBS} Network WebKit WebKitWidgets)
-endif(enable-json-sample)
-
-set(CMAKE_AUTOMOC ON)
-set(CMAKE_INCLUDE_CURRENT_DIR ON)
index 6c330c870358e6d96f3c813f49917edc7a722cf0..a3f2473d2765c1eb43f859c90c53810d21d7cf3a 100644 (file)
@@ -1,6 +1,6 @@
 setsize 1000 500
 text 0.95 0.8 'MathGL' ':RiA' -4
-text 0.05 0.15 'library\n for scientific graphics' ':LiA' -2.5
+text 0.05 0.15 'library\n for scientific graphics' ':LiA' -2.
 #rect 0.05 0.9 2 1.5 1.34 2 'w'
 xtick -3:ytick -3:ztick -3
 subplot 1 1 0 '^_'
index 75a04658ace469cc1bf179c4dbb10469b12a2368..1b9879d366158ec55c5211b6dd6288094cc49b8f 100644 (file)
@@ -1,9 +1,7 @@
-if(MGL_HAVE_GSL)
-       include_directories(${GSL_INCLUDE_DIR})
-endif(MGL_HAVE_GSL)
-
+file(COPY ${CMAKE_SOURCE_DIR}/examples/iris.dat DESTINATION ${CMAKE_BINARY_DIR}/examples)
+file(COPY ${CMAKE_SOURCE_DIR}/examples/Equirectangular-projection.jpg DESTINATION ${CMAKE_BINARY_DIR}/examples)
 add_executable(mgl_example wnd_samples.cpp full_test.cpp samples.cpp)
-target_link_libraries(mgl_example mgl)
+target_link_libraries(mgl_example mgl-static ${getopt_lib-static})
 
 if(MGL_HAVE_FLTK)
        include_directories(${FLTK_INCLUDE_DIR})
@@ -25,25 +23,24 @@ endif(MGL_HAVE_WX)
 if(QT_ENABLED)
        add_executable(mgl_qt_example wnd_samples.cpp qt_example.cpp)
        if(enable-qt5)
-               include(../cmake-qt5.txt)
+               include(../scripts/qt5.cmake)
                target_link_libraries(mgl_qt_example mgl-qt5)
        else(enable-qt5)
-               include(../cmake-qt4.txt)
+               include(../scripts/qt4.cmake)
                target_link_libraries(mgl_qt_example mgl-qt4)
        endif(enable-qt5)
-       add_executable(mgl_qgl_example wnd_samples.cpp qgl_example.cpp)
-       if(enable-qt5)
-               target_link_libraries(mgl_qgl_example mgl)
-               qt5_use_modules(mgl_qgl_example ${MGL_QT5_LIBS})
-       else(enable-qt5)
-               target_link_libraries(mgl_qgl_example mgl)
-               qt4_use_modules(mgl_qgl_example ${MGL_QT4_LIBS})
-       endif(enable-qt5)
-
+       
+       if(MGL_HAVE_OPENGL)
+               add_executable(mgl_qgl_example wnd_samples.cpp qgl_example.cpp)
+               if(enable-qt5)
+                       target_link_libraries(mgl_qgl_example mgl ${MGL_QT5_LIBS})
+               else(enable-qt5)
+                       target_link_libraries(mgl_qgl_example mgl ${MGL_QT4_LIBS})
+               endif(enable-qt5)
+       endif(MGL_HAVE_OPENGL)
 endif(QT_ENABLED)
 
 if(MGL_HAVE_LTDL)
-       include_directories(${LTDL_INCLUDE_DIR})
        add_library(mgl_module MODULE mgl_module.cpp)
        target_link_libraries(mgl_module mgl)   # for compatibility with win32
 endif(MGL_HAVE_LTDL)
index 6595211e2d4a97b7ece33a73a9ae8e3dd37898f9..9dc8db33f87290c5a42dfede306af099945f2b20 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * fltk_example.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU General Public License as published by  *\r
@@ -55,6 +55,7 @@ void *calc(void *)
 }\r
 int main(int argc,char **argv)\r
 {\r
+       mgl_textdomain(argv?argv[0]:NULL);\r
        static pthread_t thr;\r
        pthread_create(&thr,0,calc,0);\r
        pthread_detach(thr);\r
@@ -65,6 +66,7 @@ int main(int argc,char **argv)
 mglPoint pnt;  // some global variable for changeable data\r
 int main(int argc,char **argv)\r
 {\r
+       mgl_textdomain(argv?argv[0]:NULL);\r
        mglFLTK gr("test");\r
        gr.RunThr();    // <-- need MathGL version which use pthread\r
        for(int i=0;i<10;i++)   // do calculation\r
@@ -95,7 +97,7 @@ class myDraw : public mglDraw
        long i;                 // another variable to be shown\r
        mglWnd *wnd;    // external window for plotting\r
 public:\r
-       myDraw(mglWnd *w=0) : mglDraw() {       wnd=w;  }\r
+       myDraw(mglWnd *w=0) : mglDraw() {       i=0;    wnd=w;  }\r
        void SetWnd(mglWnd *w)  {       wnd=w;  }\r
        int Draw(mglGraph *gr)\r
        {\r
@@ -119,26 +121,29 @@ public:
 //-----------------------------------------------------------------------------\r
 int main(int argc,char **argv)\r
 {\r
+       mgl_textdomain(argv?argv[0]:NULL,"");\r
        mglFLTK *gr;\r
        char key = 0;\r
        if(argc>1)      key = argv[1][0]!='-' ? argv[1][0]:argv[1][1];\r
        else    printf("You may specify argument '1', '2', '3', 'd' for viewing examples of 1d, 2d, 3d, dual plotting,\nor 'm' for multi-threading sample.\n");\r
        switch(key)\r
        {\r
-       case '0':       gr = new mglFLTK((mglDraw *)NULL,"1D plots");   break;\r
+       case '0':       gr = new mglFLTK((mglDraw *)NULL,"1D plots");\r
+                               gr->Rotate(40,60);      gr->Box();      gr->Light(true);\r
+                               gr->FSurf("sin(4*pi*x*y)");     gr->Update();   break;\r
        case '1':       gr = new mglFLTK(sample_1,"1D plots");  break;\r
        case '2':       gr = new mglFLTK(sample_2,"2D plots");  break;\r
        case '3':       gr = new mglFLTK(sample_3,"3D plots");  break;\r
        case 'd':       gr = new mglFLTK(sample_d,"Dual plots");break;\r
        case 't':       gr = new mglFLTK(test_wnd,"Testing");   break;\r
+       case 'f':       gr = new mglFLTK("Frame drawing");\r
+                               gr->NewFrame(); gr->Box();      gr->EndFrame(); break;\r
 #if MGL_HAVE_PTHR_WIDGET\r
        case 'm':       gr = new mglFLTK(&dr,"Multi-threading test");\r
        dr.SetWnd(gr);  dr.Run();       break;\r
 #endif\r
        default:        gr = new mglFLTK(sample,"Drop and waves");      break;\r
        }\r
-       if(key=='0')\r
-       {       gr->Rotate(40,60);      gr->Box();      gr->Light(true);        gr->FSurf("sin(4*pi*x*y)");     gr->Update();   }\r
        gr->Run();      return 0;\r
 }\r
 #endif\r
index acf86123008d93b2a839d623914afc6315bc1e07..64dc8fbb0977b913a1fd369c70c53a329b431a9c 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * full_test.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU General Public License as published by  *\r
 #include <time.h>\r
 #include <locale.h>\r
 #include <time.h>\r
-#if !defined(_MSC_VER) && !defined(__BORLANDC__)\r
 #include <getopt.h>\r
-#endif\r
+#include <unistd.h>\r
 \r
 #include "mgl2/mgl.h"\r
 #include "mgl2/font.h"\r
 #include "mgl2/eval.h"\r
 //-----------------------------------------------------------------------------\r
-void mgl_create_cpp_font(HMGL gr, const wchar_t *how);\r
+void MGL_EXPORT mgl_create_cpp_font(HMGL gr, const wchar_t *how);\r
+long MGL_EXPORT mgl_check_tex_table();\r
 //-----------------------------------------------------------------------------\r
 struct mglSample       /// Structure for list of samples\r
 {\r
@@ -65,17 +65,25 @@ void mgls_prepare3v(mglData *ex, mglData *ey, mglData *ez);
 void save(mglGraph *gr,const char *name,const char *suf);\r
 void test(mglGraph *gr)\r
 {\r
+       mglParse par;\r
+       par.Execute(gr,"text 0 -0.2 'abcde'\ntext 0 0 'abcde'[2]\n"\r
+       "text 0 0.2 'abcde'+2\ntext 0 0.4 'abcde',2\ntext 0 0.6 'abcde',2,'k'"\r
+       "text 0 0.8 'abcde',2,'k'+1\ntext 0 1 'abcde',2,'k'[5]\ntext 0 1 'abcde''k'[5]");\r
+       return;\r
+\r
+       gr->SubPlot(2,2,0);     gr->Axis();\r
+       gr->SubPlot(2,2,1);     gr->Rotate(40,60);      gr->Axis();\r
+       gr->SetRotatedText(false);      gr->SubPlot(2,2,2);     gr->Axis();\r
+       gr->SubPlot(2,2,3);     gr->Rotate(40,60);      gr->Axis();     return;\r
        mglData a;      a.SetList(5,0.,1.,0.,1.,-1.,2.);\r
        gr->Plot(a);\r
        return;\r
-       mglParse par;\r
        par.Execute(gr,"call 'test' -1\n func 'test' 1\nline $1 0 1 1 'b'\nreturn\n");\r
 //     par.Execute(gr,"load '/home/balakin/mathgl-code/mathgl-2x/build/examples/libmgl_module.so':baxis\n");\r
 //     par.Execute(gr,"subplot 1 1 0:#rotate 40 60\nperspective 1.22:box:axis\n");\r
        return;\r
 }\r
 //-----------------------------------------------------------------------------\r
-#if !defined(_MSC_VER) && !defined(__BORLANDC__)\r
 static struct option longopts[] =\r
 {\r
        { "big",        no_argument,    &big,           1 },\r
@@ -156,7 +164,6 @@ void usage()
                "--fexport      - test most of output formats\n"\r
        );\r
 }\r
-#endif\r
 //-----------------------------------------------------------------------------\r
 void save(mglGraph *gr,const char *name,const char *suf="")\r
 {\r
@@ -389,17 +396,14 @@ void smgl_fexport(mglGraph *gr)   // test file export
        gr->ImportMGLD("fexport.mgld");\r
 }\r
 //-----------------------------------------------------------------------------\r
-extern mglTeXsymb mgl_tex_symb[];\r
-extern long mgl_tex_num;\r
-int MGL_LOCAL_PURE mgl_tex_symb_cmp(const void *a, const void *b)\r
-{\r
-       const mglTeXsymb *aa = (const mglTeXsymb *)a;\r
-       const mglTeXsymb *bb = (const mglTeXsymb *)b;\r
-       return wcscmp(aa->tex, bb->tex);\r
-}\r
-//-----------------------------------------------------------------------------\r
 int main(int argc,char **argv)\r
 {\r
+// const char *f = strrchr(argv[0],'/');\r
+// std::string p(argv[0],f-argv[0]);\r
+// printf("getcwd = '%s', argv = '%s', path = '%s', inst = '%s'\n", getcwd(NULL,0), argv[0], p.c_str(), MGL_INSTALL_DIR);\r
+// fflush(stdout);\r
+\r
+       mgl_textdomain(argv?argv[0]:NULL,"");\r
        mgl_suppress_warn(true);\r
        const char *suf = "";\r
        char name[256]="", *tmp;\r
@@ -407,7 +411,6 @@ int main(int argc,char **argv)
        time_t st,en;   time(&st);\r
        mglGraph *gr = NULL;\r
        mglSample *s=samp;\r
-#if !defined(_MSC_VER) && !defined(__BORLANDC__)\r
        while(( ch = getopt_long_only(argc, argv, "", longopts, NULL)) != -1)\r
                switch(ch)\r
                {\r
@@ -415,7 +418,7 @@ int main(int argc,char **argv)
                        case 'w':       width =atoi(optarg);    break;\r
                        case 'h':       height=atoi(optarg);    break;\r
                        case 'q':       quality =atoi(optarg);  break;\r
-                       case 'k':       strncpy(name, optarg,256);\r
+                       case 'k':       mgl_strncpy(name, optarg,256);\r
                                                tmp=strchr(name,'.');   if(tmp) *tmp=0;\r
                                                tmp=strchr(name,'-');   if(tmp) *tmp=0;\r
                                                break;\r
@@ -426,7 +429,6 @@ int main(int argc,char **argv)
                        case '?':\r
                        default:        usage();        return 0;\r
                }\r
-#endif\r
 \r
        if(dotest==1)   printf("Global (before):%s\n",mglGlobalMess.c_str());\r
        gr = new mglGraph;\r
@@ -456,7 +458,6 @@ int main(int argc,char **argv)
                delete gr;      return 0;\r
        }\r
        else if(dotest==2)      // NOTE mgl_gen_fnt[###][6] have to be updated if new glyphs will be added to built-in font\r
-\r
        {       mgl_create_cpp_font(gr->Self(), L"!-~,¡-ÿ,̀-̏,Α-ω,ϑ,ϕ,ϖ,ϰ,ϱ,ϵ,А-я,ℏ,ℑ,ℓ,ℜ,←-↙,∀-∯,≠-≯,⟂");\r
                delete gr;      return 0;       }\r
        else if(dotest==3)\r
@@ -464,7 +465,7 @@ int main(int argc,char **argv)
                int qual[7]={0,1,2,4,5,6,8};\r
                size_t ll=strlen(mmgl_dat_prepare)+1;\r
                mglParse par;\r
-               par.AllowSetSize(true); setlocale(LC_CTYPE, "");\r
+               par.AllowSetSize(true);\r
                FILE *fp = fopen(big?"time_big.texi":"time.texi","w");\r
                fprintf(fp,"@multitable @columnfractions .16 .12 .12 .12 .12 .12 .12 .12\n");\r
                fprintf(fp,"@headitem Name");\r
@@ -498,14 +499,7 @@ int main(int argc,char **argv)
        {       smgl_fexport(gr);       delete gr;      return 0;       }\r
        else if(dotest==5)\r
        {\r
-               long i=0;       while(mgl_tex_symb[i].tex[0])   i++;\r
-               if(mgl_tex_num!=i)      printf("real=%lu, set=%ld\n",i,mgl_tex_num);\r
-               for(long i=0;mgl_tex_symb[i].tex[0];i++)\r
-               {\r
-                               mglTeXsymb tst, *rts;   tst.tex = mgl_tex_symb[i].tex;\r
-                               rts = (mglTeXsymb *) bsearch(&tst, mgl_tex_symb, mgl_tex_num, sizeof(mglTeXsymb), mgl_tex_symb_cmp);\r
-                               if(!rts)        printf("Bad '%ls' at %lu\n",mgl_tex_symb[i].tex,i);\r
-               }\r
+               mgl_check_tex_table();\r
                delete gr;      return 0;\r
        }\r
 \r
@@ -522,7 +516,6 @@ int main(int argc,char **argv)
                        {\r
                                mglParse par;\r
                                par.AllowSetSize(true);\r
-                               setlocale(LC_CTYPE, "");\r
                                char *buf = new char[strlen(s->mgl)+strlen(mmgl_dat_prepare)+1];\r
                                strcpy(buf,s->mgl);             strcat(buf,mmgl_dat_prepare);\r
                                if(type!=7)     printf("\n-------\n%s\n-------\n",verbose?buf:s->mgl);\r
@@ -533,6 +526,7 @@ int main(int argc,char **argv)
                        else    s->func(gr);\r
                        save(gr, s->name, suf);\r
                        printf("%s ",s->name);  fflush(stdout); s++;\r
+                       gr->SetQuality(quality);\r
                }\r
                printf("\n");\r
        }\r
@@ -549,7 +543,6 @@ int main(int argc,char **argv)
                        {\r
                                mglParse par;\r
                                par.AllowSetSize(true);\r
-                               setlocale(LC_CTYPE, "");\r
                                char *buf = new char[strlen(s->mgl)+strlen(mmgl_dat_prepare)+1];\r
                                strcpy(buf,s->mgl);             strcat(buf,mmgl_dat_prepare);\r
                                if(type!=7)     printf("\n-------\n%s\n-------\n",verbose?buf:s->mgl);\r
index 1ae89b67bf1fbb6614a814ce15e254c224191bca..07a70f5c79ab5c6af7f5bf64057cc9fd3139d425 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * glut_example.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU General Public License as published by  *\r
@@ -56,6 +56,7 @@ printf("i=%d, gr=%p\n",i,gr); fflush(stdout);
 }\r
 int main(int argc,char **argv)\r
 {\r
+       mgl_textdomain(argv?argv[0]:NULL);\r
        static pthread_t thr;\r
        pthread_create(&thr,0,calc,0);\r
        pthread_detach(thr);\r
@@ -75,6 +76,7 @@ int sample_d(mglGraph *gr);
 typedef int (*draw_func)(mglGraph *gr);\r
 int main(int argc,char **argv)\r
 {\r
+       mgl_textdomain(argv?argv[0]:NULL,"");\r
        char key = 0;\r
        if(argc>1)      key = argv[1][0]!='-' ? argv[1][0] : argv[1][1];\r
        else    printf("You may specify argument '1', '2', '3' or 'd' for viewing examples of 1d, 2d, 3d or dual plotting\n");\r
@@ -89,4 +91,4 @@ int main(int argc,char **argv)
        }\r
        return 0;\r
 }\r
-#endif
\ No newline at end of file
+#endif\r
index 34ecf67aabea84096ed9a22d6856abd7019c0705..15616f7e69c80c52a5703c34fd717621e112b6ba 100644 (file)
@@ -7,7 +7,8 @@ int test1(mglGraph *gr, long , mglArg *a, const char *k, const char *)
        int res=0;
        if(!strcmp(k,""))       {       gr->Box();      gr->Axis();     }
        else if(!strcmp(k,"s")) {       gr->Box();      gr->Axis(a[0].s.c_str());       }
-       else res = 1;   return res;
+       else res = 1;
+       return res;
 }
 //-----------------------------------------------------------------------------
 int test2(mglGraph *gr, long , mglArg *a, const char *k, const char *)
@@ -23,7 +24,8 @@ int test2(mglGraph *gr, long , mglArg *a, const char *k, const char *)
                gr->FaceZ(mglPoint(a[0].v-a[2].v/2,a[1].v-a[3].v/2),a[2].v,a[3].v,a[5].s.c_str());
                gr->Putsw(mglPoint(a[0].v,a[1].v),a[4].w.c_str());
        }
-       else res = 1;   return res;
+       else res = 1;
+       return res;
 }
 //-----------------------------------------------------------------------------
 mglCommand mgl_cmd_extra[] = {
index 74865f733902fc05a4654110dd09a54054b47eec..f21539a5dfd9cd6e4df2aa54f2054af66553f93c 100644 (file)
@@ -4,6 +4,7 @@
 
 int main(int argc, char *argv[])
 {
+       mgl_textdomain(argv?argv[0]:NULL);
        // initialize MPI
        int rank=0, numproc=1;
        MPI_Init(&argc, &argv);
index c606a3a78068e34cc88166162f13dfefa38e5e7e..b0f0d5ce88da2dd9ff81c44dc3897947c070dc73 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************
  * qt_example.cpp is part of Math Graphic Library
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   it under the terms of the GNU General Public License as published by  *
  ***************************************************************************/
 #include "qgl_example.h"
 #include <QApplication>
+//#include <GL/gl.h>
 //-----------------------------------------------------------------------------
 int main(int argc, char *argv[])
 {
+       mgl_textdomain(argv?argv[0]:NULL,"");
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
@@ -41,7 +43,8 @@ void MainWindow::initializeGL()
 void MainWindow::paintGL()
 {
        gr->Clf();
-       gr->Rotate(40,5);
+       gr->SubPlot(1,1,0);
+       gr->Rotate(40,60);
        gr->Light(true);
        gr->AddLight(0,mglPoint(0,0,10),mglPoint(0,0,-1));
        gr->Axis();
index 1b7a3b0c08e9cce089b50f28ee1afaba788afc89..c27b101cac22a0eea2716e3afa7fa5e5efcd6723 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * qt_example.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU General Public License as published by  *\r
@@ -55,6 +55,7 @@ void *calc(void *)
 }\r
 int main(int argc,char **argv)\r
 {\r
+       mgl_textdomain(argv?argv[0]:NULL);\r
        static pthread_t thr;\r
        pthread_create(&thr,0,calc,0);\r
        pthread_detach(thr);\r
@@ -87,6 +88,7 @@ int Foo::Draw(mglGraph *gr)
 }\r
 int main(int argc,char **argv)\r
 {\r
+       mgl_textdomain(argv?argv[0]:NULL);\r
        Foo *foo = new Foo;\r
        mglQT gr(foo,"MathGL examples");\r
        foo->Gr = &gr;\r
@@ -109,7 +111,7 @@ class myDraw : public mglDraw
        long i;                 // another variable to be shown\r
        mglWnd *wnd;    // external window for plotting\r
 public:\r
-       myDraw(mglWnd *w=0) : mglDraw() {       wnd=w;  }\r
+       myDraw(mglWnd *w=0) : mglDraw() {       wnd=w;  i=0;    }\r
        void SetWnd(mglWnd *w)  {       wnd=w;  }\r
        int Draw(mglGraph *gr)\r
        {\r
@@ -133,26 +135,29 @@ public:
 //-----------------------------------------------------------------------------\r
 int main(int argc,char **argv)\r
 {\r
+       mgl_textdomain(argv?argv[0]:NULL,"");\r
        mglQT *gr;\r
        char key = 0;\r
        if(argc>1)      key = argv[1][0]!='-' ? argv[1][0]:argv[1][1];\r
        else    printf("You may specify argument '1', '2', '3', 'd' for viewing examples of 1d, 2d, 3d, dual plotting,\nor 'm' for multi-threading sample.\n");\r
        switch(key)\r
        {\r
-       case '0':       gr = new mglQT((mglDraw *)NULL,"1D plots");     break;\r
+       case '0':       gr = new mglQT((mglDraw *)NULL,"1D plots");\r
+                               gr->Rotate(40,60);      gr->Box();      gr->Light(true);\r
+                               gr->FSurf("sin(4*pi*x*y)");     gr->Update();   break;\r
        case '1':       gr = new mglQT(sample_1,"1D plots");    break;\r
        case '2':       gr = new mglQT(sample_2,"2D plots");    break;\r
        case '3':       gr = new mglQT(sample_3,"3D plots");    break;\r
        case 'd':       gr = new mglQT(sample_d,"Dual plots");  break;\r
-       case 't':       gr = new mglQT(test_wnd,"Testing");     break;\r
+       case 't':       gr = new mglQT(test_wnd,"Testing");             break;\r
+       case 'f':       gr = new mglQT("Frame drawing");\r
+                               gr->NewFrame(); gr->Box();      gr->EndFrame(); break;\r
 #if MGL_HAVE_PTHR_WIDGET\r
        case 'm':       gr = new mglQT(&dr,"Multi-threading test");\r
        dr.SetWnd(gr);  dr.Run();       break;\r
 #endif\r
        default:        gr = new mglQT(sample,"Drop and waves");        break;\r
        }\r
-       if(key=='0')\r
-       {       gr->Rotate(40,60);      gr->Box();      gr->Light(true);        gr->FSurf("sin(4*pi*x*y)");     gr->Update();   }\r
        gr->Run();      return 0;\r
 }\r
 #endif\r
index 437990d2e1ace07008bca8dd6d0e14c520d22328..7d2f8b0ef4aac9b4f5cf9ddf6039af86eaf0d20d 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************
  * samples.cpp is part of Math Graphic Library
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   it under the terms of the GNU General Public License as published by  *
@@ -105,7 +105,7 @@ void smgl_refill(mglGraph *gr)
 //-----------------------------------------------------------------------------
 const char *mmgl_indirect="subplot 1 1 0 '':title 'SubData vs Evaluate'\n"
 "new in 9 'x^3/1.1':plot in 'ko ':box\nnew arg 99 '4*x+4'\n"
-"evaluate e in arg:plot e 'b.'; legend 'Evaluate'\n"
+"evaluate e in arg off:plot e 'b.'; legend 'Evaluate'\n"
 "subdata s in arg:plot s 'r.';legend 'SubData'\nlegend 2";
 void smgl_indirect(mglGraph *gr)
 {
@@ -113,7 +113,7 @@ void smgl_indirect(mglGraph *gr)
        mglData in(9), arg(99), e, s;
        gr->Fill(in,"x^3/1.1"); gr->Fill(arg,"4*x+4");
        gr->Plot(in,"ko ");             gr->Box();
-       e = in.Evaluate(arg);   gr->Plot(e,"b.","legend 'Evaluate'");
+       e = in.Evaluate(arg,false);     gr->Plot(e,"b.","legend 'Evaluate'");
        s = in.SubData(arg);    gr->Plot(s,"r.","legend 'SubData'");
        gr->Legend(2);
 }
@@ -1786,24 +1786,26 @@ const char *mmgl_surfc="call 'prepare2d'\ntitle 'SurfC plot':rotate 50 60:light
 void smgl_surfc(mglGraph *gr)
 {
        mglData a,b;    mgls_prepare2d(&a,&b);
-       if(big!=3)      gr->Title("SurfC plot");        gr->Rotate(50,60);
-       gr->Light(true);        gr->Box();      gr->SurfC(a,b);
+       if(big!=3)      gr->Title("SurfC plot");
+       gr->Rotate(50,60);      gr->Light(true);        gr->Box();      gr->SurfC(a,b);
 }
 //-----------------------------------------------------------------------------
 const char *mmgl_surfca="call 'prepare2d'\ntitle 'SurfCA plot':rotate 50 60:light on:alpha on:box:surfca a b a";
 void smgl_surfca(mglGraph *gr)
 {
        mglData a,b;    mgls_prepare2d(&a,&b);
-       if(big!=3)      gr->Title("SurfCA plot");       gr->Rotate(50,60);
-       gr->Alpha(true);        gr->Light(true);        gr->Box();      gr->SurfCA(a,b,a);
+       if(big!=3)      gr->Title("SurfCA plot");
+       gr->Rotate(50,60);      gr->Alpha(true);        gr->Light(true);        gr->Box();
+       gr->SurfCA(a,b,a);
 }
 //-----------------------------------------------------------------------------
 const char *mmgl_surfa="call 'prepare2d'\ntitle 'SurfA plot':rotate 50 60:light on:alpha on:box:surfa a b";
 void smgl_surfa(mglGraph *gr)
 {
        mglData a,b;    mgls_prepare2d(&a,&b);
-       if(big!=3)      gr->Title("SurfA plot");        gr->Rotate(50,60);
-       gr->Alpha(true);        gr->Light(true);        gr->Box();      gr->SurfA(a,b);
+       if(big!=3)      gr->Title("SurfA plot");
+       gr->Rotate(50,60);      gr->Alpha(true);        gr->Light(true);        gr->Box();
+       gr->SurfA(a,b);
 }
 //-----------------------------------------------------------------------------
 const char *mmgl_tile="call 'prepare2d'\ntitle 'Tile plot':rotate 50 60:box:tile a";
@@ -1979,9 +1981,11 @@ void smgl_cones(mglGraph *gr)
        gr->Rotate(50,60);      gr->Box();      gr->Cones(ys,"4");
 }
 //-----------------------------------------------------------------------------
-const char *mmgl_aspect="subplot 2 2 0:box:text -1 1.1 'Just box' ':L'\ninplot 0.2 0.5 0.7 1 off:box:text 0 1.2 'InPlot example'\n"
-"subplot 2 2 1:title 'Rotate only':rotate 50 60:box\nsubplot 2 2 2:title 'Rotate and Aspect':rotate 50 60:aspect 1 1 2:box\n"
-"subplot 2 2 3:title 'Aspect in other direction':rotate 50 60:aspect 1 2 2:box";
+const char *mmgl_aspect="subplot 2 2 0:box:text -1 1.1 'Just box' ':L'\n"
+"inplot 0.2 0.5 0.7 1 off:box:text 0 1.2 'InPlot example'\n"
+"subplot 2 2 1:title 'Rotate only':rotate 50 60:box\n"
+"subplot 2 2 2:title 'Rotate and Aspect':rotate 50 60:aspect 1 1 2:box\n"
+"subplot 2 2 3:title 'Shear':box 'c':shear 0.2 0.1:box";
 void smgl_aspect(mglGraph *gr) // transformation
 {
        gr->SubPlot(2,2,0);     gr->Box();
@@ -1992,18 +1996,20 @@ void smgl_aspect(mglGraph *gr)  // transformation
        gr->Rotate(50,60);      gr->Box();
        gr->SubPlot(2,2,2);     gr->Title("Rotate and Aspect");
        gr->Rotate(50,60);      gr->Aspect(1,1,2);      gr->Box();
-       gr->SubPlot(2,2,3);     gr->Title("Aspect in other direction");
-       gr->Rotate(50,60);      gr->Aspect(1,2,2);      gr->Box();
+       gr->SubPlot(2,2,3);     gr->Title("Shear");
+       gr->Box("c");           gr->Shear(0.2,0.1);     gr->Box();
 }
 //-----------------------------------------------------------------------------
-const char *mmgl_inplot="subplot 3 2 0:title 'StickPlot'\nstickplot 3 0 20 30:box 'r':text 0 0 '0' 'r'\n"
-"stickplot 3 1 20 30:box 'g':text 0 0 '1' 'g'\nstickplot 3 2 20 30:box 'b':text 0 0 '2' 'b'\n"
+const char *mmgl_inplot="subplot 3 2 0:title 'StickPlot'\nstickplot 3 0 20 30:box 'r':text 0 0 '0' 'r'\n"
+"stickplot 3 1 20 30:box 'g':text 0 0 0 '1' 'g'\nstickplot 3 2 20 30:box 'b':text 0 9 0 '2' 'b'\n"
 "subplot 3 2 3 '':title 'ColumnPlot'\ncolumnplot 3 0:box 'r':text 0 0 '0' 'r'\n"
 "columnplot 3 1:box 'g':text 0 0 '1' 'g'\ncolumnplot 3 2:box 'b':text 0 0 '2' 'b'\n"
 "subplot 3 2 4 '':title 'GridPlot'\ngridplot 2 2 0:box 'r':text 0 0 '0' 'r'\n"
 "gridplot 2 2 1:box 'g':text 0 0 '1' 'g'\ngridplot 2 2 2:box 'b':text 0 0 '2' 'b'\n"
 "gridplot 2 2 3:box 'm':text 0 0 '3' 'm'\nsubplot 3 2 5 '':title 'InPlot':box\n"
-"inplot 0.4 1 0.6 1 on:box 'r'\nmultiplot 3 2 1 2 1 '':title 'MultiPlot':box";
+"inplot 0.4 1 0.6 1 on:box 'r'\nmultiplot 3 2 1 2 1 '':title 'MultiPlot and ShearPlot':box\n"
+"shearplot 3 0 0.2 0.1:box 'r':text 0 0 '0' 'r'\nshearplot 3 1 0.2 0.1:box 'g':text 0 0 '1' 'g'\n"
+"shearplot 3 2 0.2 0.1:box 'b':text 0 0 '2' 'b'";
 void smgl_inplot(mglGraph *gr)
 {
        gr->SubPlot(3,2,0);     gr->Title("StickPlot");
@@ -2021,7 +2027,10 @@ void smgl_inplot(mglGraph *gr)
        gr->GridPlot(2, 2, 3);  gr->Box("m");   gr->Puts(mglPoint(0),"3","m");
        gr->SubPlot(3,2,5,"");  gr->Title("InPlot");    gr->Box();
        gr->InPlot(0.4, 1, 0.6, 1, true);       gr->Box("r");
-       gr->MultiPlot(3,2,1, 2, 1,"");  gr->Title("MultiPlot"); gr->Box();
+       gr->MultiPlot(3,2,1, 2, 1,"");  gr->Title("MultiPlot and ShearPlot");   gr->Box();
+       gr->ShearPlot(3, 0, 0.2, 0.1);  gr->Box("r");   gr->Puts(mglPoint(0),"0","r");
+       gr->ShearPlot(3, 1, 0.2, 0.1);  gr->Box("g");   gr->Puts(mglPoint(0),"1","g");
+       gr->ShearPlot(3, 2, 0.2, 0.1);  gr->Box("b");   gr->Puts(mglPoint(0),"2","b");
 }
 //-----------------------------------------------------------------------------
 const char *mmgl_combined="call 'prepare2v'\ncall 'prepare3d'\nnew v 10:fill v -0.5 1:copy d sqrt(a^2+b^2)\n"
@@ -2775,7 +2784,247 @@ void smgl_ifs3d(mglGraph *gr)
        gr->Dots(f.SubData(0), f.SubData(1), f.SubData(2),"G#o","size 0.05");
 }
 //-----------------------------------------------------------------------------
+const char *mmgl_flame2d="list A [0.33,0,0,0.33,0,0,0.2] [0.33,0,0,0.33,0.67,0,0.2] [0.33,0,0,0.33,0.33,0.33,0.2]\\\n"
+"\t[0.33,0,0,0.33,0,0.67,0.2] [0.33,0,0,0.33,0.67,0.67,0.2]\n"
+"new B 2 3 A.ny '0.3'\nput B 3 0 0 -1\nput B 3 0 1 -1\nput B 3 0 2 -1\n"
+"flame2d fx fy A B 1000000\nsubplot 1 1 0 '<_':title 'Flame2d sample'\n"
+"ranges fx fy:box:axis\nplot fx fy 'r#o ';size 0.05";
+void smgl_flame2d(mglGraph *gr)
+{
+       mglData A, B(2,3,5);
+       A.SetList(35, 0.33,0.,0.,0.33,0.,0.,0.2, 0.33,0.,0.,0.33,0.67,0.,0.2, 0.33,0.,0.,0.33,0.33,0.33,0.2,
+                       0.33,0.,0.,0.33,0.,0.67,0.2, 0.33,0.,0.,0.33,0.67,0.67,0.2);
+       A.Rearrange(7);
+       for(long i=0;i<2*3*5;i++)       B.a[i] = 0.3;
+       for(long i=0;i<5;i++)   B.a[2*3*i] = B.a[2*3*i+1*2] = B.a[2*3*i+2*2] = 3;
+       mglData f(mglFlame2d(A,B,1000000));
+       gr->SubPlot(1,1,0,"<_");
+       if(big!=3)      gr->Title("Flame2d sample");
+       gr->SetRanges(f.SubData(0), f.SubData(1));
+       gr->Axis();     gr->Box();
+       gr->Plot(f.SubData(0), f.SubData(1),"r#o ","size 0.05");
+}
+//-----------------------------------------------------------------------------
+const char *mmgl_detect="subplot 1 1 0 '':title 'Detect sample'\n"
+"new a 200 100 'exp(-30*(y-0.5*sin(pi*x))^2-rnd/10)+exp(-30*(y+0.5*sin(pi*x))^2-rnd/10)+exp(-30*(x+y)^2-rnd/10)'\n"
+"ranges 0 a.nx 0 a.ny:box\nalpha on:crange a:dens a\n\n"
+"detect r a 0.1 5\nplot r(0) r(1) '.'";
+void smgl_detect(mglGraph *gr)
+{
+       mglData a(200, 100);
+       gr->Fill(a,"exp(-30*(y-0.5*sin(pi*x))^2-rnd/10)+exp(-30*(y+0.5*sin(pi*x))^2-rnd/10)+exp(-30*(x+y)^2-rnd/10)");
+       gr->SubPlot(1,1,0,"");
+       if(big!=3)      gr->Title("Detect sample");
+       gr->SetRanges(0,a.nx,0,a.ny);   gr->SetRange('c',a);
+       gr->Alpha(true);        gr->Box();      gr->Dens(a);
+       mglData r(a.Detect(0.1,5));
+       gr->Plot(r.SubData(0), r.SubData(1), ".");
+}
+//-----------------------------------------------------------------------------
+const char *mmgl_iris="read a 'iris.dat'\ncrop a 0 4 'x':rearrange a a.nx 50\n"
+"subplot 1 1 0 '':title 'Iris plot'\n"
+"iris a 'sepal\\n length;sepal\\n width;petal\\n length;petal\\n width' '. ';value -1.5;size -2";
+void smgl_iris(mglGraph *gr)
+{
+       mglData a("iris.dat");  a.Crop(0,4,'x');        a.Rearrange(4,50);
+       gr->SubPlot(1,1,0,"");
+       if(big!=3)      gr->Title("Iris sample");
+       gr->Iris(a, "sepal\nlength;sepal\nwidth;petal\nlength;petal\nwidth", ". ", "value -1.5;size -2");
+}
+//-----------------------------------------------------------------------------
+const char *mmgl_dilate="subplot 2 2 0:title 'Dilate&Erode 1D sample'\n"
+"new y 11:put y 1 5\nranges 0 10 0 1:axis:box\nplot y 'b*'\n"
+"dilate y 0.5 2\nplot y 'rs'\nerode y 0.5 1\nplot y 'g#o'\n\n"
+"subplot 2 2 1:title 'Dilate&Erode 2D sample':rotate 40 60\n"
+"ranges 0 10 0 10 0 3\naxis:box\nnew z 11 11:put z 3 5 5\n"
+"boxs z 'b':boxs z 'k#'\ndilate z 1 2\nboxs z 'r':boxs z 'k#'\n"
+"erode z 1 1\nboxs 2*z 'g':boxs 2*z 'k#'\n\n"
+"subplot 2 2 2\ntext 0.5 0.7 'initial' 'ba';size -2\n"
+"text 0.5 0.5 'dilate=2' 'ra';size -2\ntext 0.5 0.3 'erode=1' 'ga';size -2\n\n"
+"subplot 2 2 3:title 'Dilate&Erode 3D sample'\nrotate 60 50:light on:alpha on\n"
+"ranges 0 10 0 10 0 10:crange 0 3\naxis:box\nnew a 11 11 11:put a 3 5 5 5\n"
+"surf3a a a 1.5 'b'\ndilate a 1 2\nsurf3a a a 0.5 'r'\n"
+"erode a 1 1\nsurf3a 2*a 2*a 1 'g'";
+void smgl_dilate(mglGraph *gr)
+{
+       mglData y(11),  z(11,11), a(11,11,11);
+       y.a[5]=1;       z.a[5+11*5]=a.a[5+11*(5+11*5)] = 3;
+
+       if(big!=3)      {       gr->SubPlot(2,2,0);     gr->Title("Dilate&Erode 1D sample");    }
+       else    gr->SubPlot(1,1,0,"");
+       gr->SetRanges(0,10,0,1);        gr->Axis();     gr->Box();      gr->Plot(y,"b*");
+       y.Dilate(1,2);  gr->Plot(y,"rs");
+       y.Erode(1,1);   gr->Plot(y,"g#o");
+       if(big==3)      return;
+       
+       gr->SubPlot(2,2,1);     gr->Title("Dilate&Erode 2D sample");
+       gr->Rotate(40,60);      gr->SetRanges(0,10,0,10,0,3);
+       gr->Axis();     gr->Box();      gr->Boxs(z,"b");        gr->Boxs(z,"k#");
+       z.Dilate(1,2);                  gr->Boxs(z,"r");        gr->Boxs(z,"k#");
+       z.Erode(1,1);   z*=2;   gr->Boxs(z,"g");        gr->Boxs(z,"k#");
+       
+       gr->SubPlot(2,2,2);
+       gr->Puts(0.5,0.7,"initial","ba",-2);
+       gr->Puts(0.5,0.5,"dilate=2","ra",-2);
+       gr->Puts(0.5,0.3,"erode=1","ga",-2);
+       
+       gr->SubPlot(2,2,3);     gr->Title("Dilate&Erode 3D sample");
+       gr->Rotate(60,50);      gr->Alpha(true);        gr->Light(true);
+       gr->SetRanges(0,10,0,10,0,10);  gr->SetRange('c',0,3);
+       gr->Axis();     gr->Box();      gr->Surf3A(1.5,a,a,"b");
+       a.Dilate(1,2);                  gr->Surf3A(0.5,a,a,"r");
+       a.Erode(1,1);   a*=2;   gr->Surf3A(1,a,a,"g");
+}
+//-----------------------------------------------------------------------------
+const char *mmgl_section="subplot 1 1 0 '<_':title 'Section&Join sample'\n"
+"axis:box:line -1 0 1 0 'h:'\n# first lets demonstrate 'join'\n"
+"new aa 11 'x^2':new a1 3 '-x':new a2 15 'x^3'\njoin aa a1:join aa a2\n"
+"# add x-coordinate\nnew xx aa.nx 'x':join aa xx\nplot aa(:,1) aa(:,0) '2y'\n"
+"# now select 1-st (id=0) section between zeros\n"
+"section b1 aa 0 'x' 0\nplot b1(:,1) b1(:,0) 'bo'\n"
+"# next, select 3-d (id=2) section between zeros\n"
+"section b3 aa 2 'x' 0\nplot b3(:,1) b3(:,0) 'gs'\n"
+"# finally, select 2-nd (id=-2) section from the end\n"
+"section b4 aa -2 'x' 0\nplot b4(:,1) b4(:,0) 'r#o'";
+void smgl_section(mglGraph *gr)
+{
+       gr->SubPlot(1,1,0,"<_");
+       if(big!=3)      gr->Title("Section&Join sample");
+       gr->Axis();     gr->Box();      gr->Line(mglPoint(-1,0),mglPoint(1,0),"h:");
+       // first lets demonstrate 'join'
+       mglData aa(11), a1(3), a2(15);
+       gr->Fill(aa,"x^2");     gr->Fill(a1,"-x");      gr->Fill(a2,"x^3");
+       aa.Join(a1);    aa.Join(a2);
+       // add x-coordinate
+       mglData xx(aa.nx);      gr->Fill(xx,"x");       aa.Join(xx);
+       gr->Plot(aa.SubData(-1,1), aa.SubData(-1,0), "2y");
+       // now select 1-st (id=0) section between zeros
+       mglData b1(aa.Section(0,'x',0));
+       gr->Plot(b1.SubData(-1,1), b1.SubData(-1,0), "bo");
+       // next, select 3-d (id=2) section between zeros
+       mglData b2(aa.Section(2,'x',0));
+       gr->Plot(b2.SubData(-1,1), b2.SubData(-1,0), "gs");
+       // finally, select 2-nd (id=-2) section from the end
+       mglData b3(aa.Section(-2,'x',0));
+       gr->Plot(b3.SubData(-1,1), b3.SubData(-1,0), "r#o");
+}
+//-----------------------------------------------------------------------------
+const char *mmgl_3wave="define t 50\n"
+"ode !r '-b*f;a*conj(f);a*conj(b)-0.1*f' 'abf' [1,1e-3,0] 0.1 t\n"
+"ranges 0 t 0 r.max\nplot r(0) 'b';legend 'a'\n"
+"plot r(1) 'g';legend 'b'\nplot r(2) 'r';legend 'f'\n"
+"axis:box:legend";
+void smgl_3wave(mglGraph *gr)
+{
+       gr->SubPlot(1,1,0,"<_");
+       if(big!=3)      gr->Title("Complex ODE sample");
+       double t=50;
+       mglData ini;    ini.SetList(3, 1., 1e-3, 0.);
+       mglDataC r(mglODEc("-b*f;a*conj(f);a*conj(b)-0.1*f","abf",ini,0.1,t));
+       gr->SetRanges(0, t, 0, r.Maximal());
+       gr->Plot(r.SubData(0),"b","legend 'a'");
+       gr->Plot(r.SubData(1),"g","legend 'b'");
+       gr->Plot(r.SubData(2),"r","legend 'f'");
+       gr->Axis();     gr->Box();      gr->Legend();
+}
+//-----------------------------------------------------------------------------
+const char *mmgl_diffract="define n 32 #number of points\ndefine m 20 # number of iterations\n"
+"define dt 0.01 # time step\nnew res n m+1\nranges -1 1 0 m*dt 0 1\n\n"
+"#tridmat periodic variant\nnew !a n 'i',dt*(n/2)^2/2\ncopy !b !(1-2*a)\n\n"
+"new !u n 'exp(-6*x^2)'\nput res u all 0\nfor $i 0 m\ntridmat u a b a u 'xdc'\n"
+"put res u all $i+1\nnext\nsubplot 2 2 0 '<_':title 'Tridmat, periodic b.c.'\naxis:box:dens res\n\n"
+"#fourier variant\nnew k n:fillsample k 'xk'\ncopy !e !exp(-i1*dt*k^2)\n\n"
+"new !u n 'exp(-6*x^2)'\nput res u all 0\nfor $i 0 m\nfourier u 'x'\nmulto u e\nfourier u 'ix'\n"
+"put res u all $i+1\nnext\nsubplot 2 2 1 '<_':title 'Fourier method'\naxis:box:dens res\n\n"
+"#tridmat zero variant\nnew !u n 'exp(-6*x^2)'\nput res u all 0\nfor $i 0 m\ntridmat u a b a u 'xd'\n"
+"put res u all $i+1\nnext\nsubplot 2 2 2 '<_':title 'Tridmat, zero b.c.'\naxis:box:dens res\n\n"
+"#diffract exp variant\nnew !u n 'exp(-6*x^2)'\ndefine q dt*(n/2)^2/8 # need q<0.4 !!!\n"
+"put res u all 0\nfor $i 0 m\nfor $j 1 8       # due to smaller dt\ndiffract u 'xe' q\nnext\n"
+"put res u all $i+1\nnext\nsubplot 2 2 3 '<_':title 'Diffract, exp b.c.'\naxis:box:dens res";
+void smgl_diffract(mglGraph *gr)
+{
+       long n=32;      // number of points
+       long m=20;      // number of iterations
+       double dt=0.01; // time step
+       mglData res(n,m+1);
+       gr->SetRanges(-1,1, 0,m*dt, 0,1);
+
+       // tridmat periodic variant
+       mglDataC a(n), b(n);    a = dual(0,dt*n*n/8);
+       for(long i=0;i<n;i++)   b.a[i] = mreal(1)-mreal(2)*a.a[i];
+       mglDataC u(n);  gr->Fill(u,"exp(-6*x^2)");      res.Put(u,-1,0);
+       for(long i=0;i<m;i++)
+       {
+               u = mglTridMatC(a,b,a,u,"xdc");
+               res.Put(u,-1,i+1);
+       }
+       gr->SubPlot(2,2,0,"<_");        gr->Title("Tridmat, periodic b.c.");
+       gr->Axis();     gr->Box();      gr->Dens(res);
+
+       // fourier variant
+       mglData k(n);   k.FillSample("xk");
+       mglDataC e(n);  for(long i=0;i<n;i++)   e.a[i] = exp(-dual(0,dt*k.a[i]*k.a[i]));
+       gr->Fill(u,"exp(-6*x^2)");      res.Put(u,-1,0);
+       for(long i=0;i<m;i++)
+       {
+               u.FFT("x");     u *= e; u.FFT("ix");
+               res.Put(u,-1,i+1);
+       }
+       gr->SubPlot(2,2,1,"<_");        gr->Title("Fourier method");
+       gr->Axis();     gr->Box();      gr->Dens(res);
+
+       // tridmat zero variant
+       gr->Fill(u,"exp(-6*x^2)");      res.Put(u,-1,0);
+       for(long i=0;i<m;i++)
+       {
+               u = mglTridMatC(a,b,a,u,"xd");
+               res.Put(u,-1,i+1);
+       }
+       gr->SubPlot(2,2,2,"<_");        gr->Title("Tridmat, zero b.c.");
+       gr->Axis();     gr->Box();      gr->Dens(res);
+       
+       // diffract exp variant
+       gr->Fill(u,"exp(-6*x^2)");      res.Put(u,-1,0);
+       double q=dt*n*n/4/8;    // NOTE: need q<0.4 !!!
+       for(long i=0;i<m;i++)
+       {
+               for(long j=0;j<8;j++)   // due to smaller dt
+                       u.Diffraction("xe",q);
+               res.Put(u,-1,i+1);
+       }
+       gr->SubPlot(2,2,3,"<_");        gr->Title("Diffract, exp b.c.");
+       gr->Axis();     gr->Box();      gr->Dens(res);
+}
+//-----------------------------------------------------------------------------
+const char *mmgl_earth="import dat 'Equirectangular-projection.jpg' 'BbGYw' -1 1\n"
+"subplot 1 1 0 '<>':title 'Earth in 3D':rotate 40 60\n"
+"copy phi dat 'pi*x':copy tet dat 'pi*y/2'\n"
+"copy x cos(tet)*cos(phi)\ncopy y cos(tet)*sin(phi)\ncopy z sin(tet)\n\n"
+"light on\nsurfc x y z dat 'BbGYw'\ncontp [-0.5,-0.5] x y z dat 'y'";
+void smgl_earth(mglGraph *gr)
+{
+       mglData dat;    dat.Import("Equirectangular-projection.jpg","BbGYw",-1,1);
+       // Calc proper 3d coordinates from projection
+       mglData phi(dat.nx,dat.ny);     phi.Fill(-M_PI,M_PI);
+       mglData tet(dat.nx,dat.ny);     tet.Fill(-M_PI/2,M_PI/2,'y');
+       mglData x(dat.nx,dat.ny), y(dat.nx,dat.ny), z(dat.nx,dat.ny);
+#pragma omp parallel for
+       for(long i=0;i<dat.nx*dat.ny;i++)
+       {       x.a[i] = cos(tet.a[i])*cos(phi.a[i]);
+               y.a[i] = cos(tet.a[i])*sin(phi.a[i]);
+               z.a[i] = sin(tet.a[i]); }
+
+       gr->SubPlot(1,1,0,"<>");
+       if(big!=3)      gr->Title("Earth in 3D");
+       gr->Rotate(40,60);      gr->Light(true);
+       gr->SurfC(x,y,z,dat,"BbGYw");
+       mglData vals(2);        vals.a[0]=-0.5;
+       gr->ContP(vals, x,y,z,dat,"y");
+}
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
 mglSample samp[] = {
+       {"3wave", smgl_3wave, mmgl_3wave},
        {"alpha", smgl_alpha, mmgl_alpha},
        {"apde", smgl_apde, mmgl_apde},
        {"area", smgl_area, mmgl_area},
@@ -2814,13 +3063,18 @@ mglSample samp[] = {
        {"dens", smgl_dens, mmgl_dens},
        {"dens_xyz", smgl_dens_xyz, mmgl_dens_xyz},
        {"densa", smgl_densa, mmgl_densa},
+       {"detect", smgl_detect, mmgl_detect},
        {"dew", smgl_dew, mmgl_dew},
+       {"diffract", smgl_diffract, mmgl_diffract},
+       {"dilate", smgl_dilate, mmgl_dilate},
        {"dots", smgl_dots, mmgl_dots},
+       {"earth", smgl_earth, mmgl_earth},
        {"error", smgl_error, mmgl_error},
        {"error2", smgl_error2, mmgl_error2},
        {"export", smgl_export, mmgl_export},
        {"fall", smgl_fall, mmgl_fall},
        {"fit", smgl_fit, mmgl_fit},
+       {"flame2d", smgl_flame2d, mmgl_flame2d},
        {"flow", smgl_flow, mmgl_flow},
        {"fog", smgl_fog, mmgl_fog},
        {"fonts", smgl_fonts, mmgl_fonts},
@@ -2830,6 +3084,7 @@ mglSample samp[] = {
        {"ifs3d", smgl_ifs3d, mmgl_ifs3d},
        {"indirect",smgl_indirect,mmgl_indirect},
        {"inplot", smgl_inplot, mmgl_inplot},
+       {"iris", smgl_iris, mmgl_iris},
        {"label", smgl_label, mmgl_label},
        {"lamerey", smgl_lamerey, mmgl_lamerey},
        {"legend", smgl_legend, mmgl_legend },
@@ -2863,6 +3118,7 @@ mglSample samp[] = {
        {"region", smgl_region, mmgl_region},
        {"scanfile", smgl_scanfile, mmgl_scanfile },
        {"schemes", smgl_schemes, mmgl_schemes },
+       {"section", smgl_section, mmgl_section},
        {"several_light", smgl_several_light, mmgl_several_light },
        {"solve", smgl_solve, mmgl_solve},
        {"stem", smgl_stem, mmgl_stem},
index 8506f40409916765437f4f864a807a2ef3d67aa7..c054f0c0bd6096ce607f5367f0772aef78ff4a14 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * wnd_sample.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU General Public License as published by  *\r
@@ -429,8 +429,10 @@ void mgls_prepare1d(mglData *y, mglData *y1, mglData *y2, mglData *x1, mglData *
 {\r
        long n=50;\r
        if(y)   y->Create(n,3);\r
-       if(x1)  x1->Create(n);          if(x2)  x2->Create(n);\r
-       if(y1)  y1->Create(n);          if(y2)  y2->Create(n);\r
+       if(x1)  x1->Create(n);\r
+       if(x2)  x2->Create(n);\r
+       if(y1)  y1->Create(n);\r
+       if(y2)  y2->Create(n);\r
        for(long i=0;i<n;i++)\r
        {\r
                double xx = i/(n-1.);\r
@@ -450,12 +452,13 @@ void mgls_prepare1d(mglData *y, mglData *y1, mglData *y2, mglData *x1, mglData *
 void mgls_prepare2d(mglData *a, mglData *b, mglData *v)\r
 {\r
        long n=50,m=40;\r
-       if(a)   a->Create(n,m);         if(b)   b->Create(n,m);\r
+       if(a)   a->Create(n,m);\r
+       if(b)   b->Create(n,m);\r
        if(v)   {       v->Create(9);   v->Fill(-1,1);  }\r
        for(long j=0;j<m;j++)   for(long i=0;i<n;i++)\r
        {\r
                double x = i/(n-1.), y = j/(m-1.);\r
-               register long i0 = i+n*j;\r
+               long i0 = i+n*j;\r
                if(a)   a->a[i0] = 0.6*sin(2*M_PI*x)*sin(3*M_PI*y)+0.4*cos(3*M_PI*x*y);\r
                if(b)   b->a[i0] = 0.6*cos(2*M_PI*x)*cos(3*M_PI*y)+0.4*cos(3*M_PI*x*y);\r
        }\r
@@ -464,11 +467,12 @@ void mgls_prepare2d(mglData *a, mglData *b, mglData *v)
 void mgls_prepare3d(mglData *a, mglData *b)\r
 {\r
        long n=61,m=50,l=40;\r
-       if(a)   a->Create(n,m,l);               if(b)   b->Create(n,m,l);\r
+       if(a)   a->Create(n,m,l);\r
+       if(b)   b->Create(n,m,l);\r
        for(long k=0;k<l;k++)   for(long j=0;j<m;j++)   for(long i=0;i<n;i++)\r
        {\r
                double x=2*i/(n-1.)-1, y=2*j/(m-1.)-1, z=2*k/(l-1.)-1;\r
-               register long i0 = i+n*(j+m*k);\r
+               long i0 = i+n*(j+m*k);\r
                if(a)   a->a[i0] = -2*(x*x + y*y + z*z*z*z - z*z - 0.1);\r
                if(b)   b->a[i0] = 1-2*tanh((x+y)*(x+y));\r
        }\r
@@ -477,11 +481,12 @@ void mgls_prepare3d(mglData *a, mglData *b)
 void mgls_prepare2v(mglData *a, mglData *b)\r
 {\r
        long n=20,m=30;\r
-       if(a)   a->Create(n,m);         if(b)   b->Create(n,m);\r
+       if(a)   a->Create(n,m);\r
+       if(b)   b->Create(n,m);\r
        for(long j=0;j<m;j++)   for(long i=0;i<n;i++)\r
        {\r
                double x=i/(n-1.), y=j/(m-1.);\r
-               register long i0 = i+n*j;\r
+               long i0 = i+n*j;\r
                if(a)   a->a[i0] = 0.6*sin(2*M_PI*x)*sin(3*M_PI*y)+0.4*cos(3*M_PI*x*y);\r
                if(b)   b->a[i0] = 0.6*cos(2*M_PI*x)*cos(3*M_PI*y)+0.4*cos(3*M_PI*x*y);\r
        }\r
@@ -496,7 +501,7 @@ void mgls_prepare3v(mglData *ex, mglData *ey, mglData *ez)
        for(long k=0;k<n;k++)   for(long j=0;j<n;j++)   for(long i=0;i<n;i++)\r
        {\r
                double x=2*i/(n-1.)-1, y=2*j/(n-1.)-1, z=2*k/(n-1.)-1;\r
-               register long i0 = i+n*(j+k*n);\r
+               long i0 = i+n*(j+k*n);\r
 /*             r1 = 1./(x*x+y*y+z*z+0.01);     r2=exp(-0.01/r1/r1)*r1;\r
                ex->a[i0]=z*y*r2*r2;\r
                ey->a[i0]=x*y*r2*r2+1;\r
index 2c064ff6ee6904546adf599a3e0e31b998c1052c..2f827653cb8df2684ba945cae6e68476108da762 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * wx_example.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU General Public License as published by  *\r
@@ -18,6 +18,7 @@
  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *\r
  ***************************************************************************/\r
 #include <wx/wx.h>\r
+#undef _\r
 #include "mgl2/wx.h"\r
 //-----------------------------------------------------------------------------\r
 int test_wnd(mglGraph *gr);\r
index 28ea013689fb14de82d70761a16effc02f66b1a3..f529c1872cbe34cd97c19c7cb9a5fb94f322946a 100644 (file)
@@ -1,21 +1,23 @@
-
-add_executable(make_bin make_bin.cpp)
-target_link_libraries(make_bin mgl)
+include_directories( ${MathGL2_SOURCE_DIR}/include ${MathGL2_BINARY_DIR}/include)
+set(hdrF ../include/mgl2/font.h ../include/mgl2/define.h ${MathGL2_BINARY_DIR}/include/mgl2/config.h)
+add_executable(make_bin make_bin.cpp ../src/font.cpp ${hdrF})
+#target_link_libraries(make_bin mgl-static ${getopt_lib-static})
+target_link_libraries(make_bin ${MGL_DEP_LIBS})
 
 set(MGL_FONTS STIX adventor  bonum  cursor  heroscn  heros  pagella  schola  termes)
 set(MGL_FONTS_BIN )
 set(MGL_FONTS_SRC )
 
 foreach(SAMPLE ${MGL_FONTS})
-       set(MGL_FONTS_BIN ${MGL_FONTS_BIN} ${MathGL_BINARY_DIR}/fonts/${SAMPLE}.vfmb)
-       add_custom_command(OUTPUT ${MathGL_BINARY_DIR}/fonts/${SAMPLE}.vfmb
-               COMMAND make_bin -p ${MathGL_SOURCE_DIR}/fonts/ -o ${MathGL_BINARY_DIR}/fonts/${SAMPLE}.vfmb ${SAMPLE}
+       set(MGL_FONTS_BIN ${MGL_FONTS_BIN} ${MathGL2_BINARY_DIR}/fonts/${SAMPLE}.vfmb)
+       add_custom_command(OUTPUT ${MathGL2_BINARY_DIR}/fonts/${SAMPLE}.vfmb
+               COMMAND make_bin -p ${MathGL2_SOURCE_DIR}/fonts/ -o ${MathGL2_BINARY_DIR}/fonts/${SAMPLE}.vfmb ${SAMPLE}
                DEPENDS ${SAMPLE}.vfm make_bin )
 endforeach(SAMPLE)
 
 add_custom_target(fonts ALL DEPENDS ${MGL_FONTS_BIN})
 
-install(DIRECTORY ${MathGL_BINARY_DIR}/fonts/ DESTINATION ${MGL_FONT_PATH}
+install(DIRECTORY ${MathGL2_BINARY_DIR}/fonts/ DESTINATION ${MGL_FONT_PATH}
                        PATTERN "*[mM]ake*" EXCLUDE
                        PATTERN ".svn" EXCLUDE
                        PATTERN "*.vfmb")
index bb4aadad9459b6982a0f637493331a0d65714a37..600745f0ec5b6066ae8b6f3d4f504d0439c1b371 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************
  * make_bin.cpp is part of Math Graphic Library
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   it under the terms of the GNU General Public License as published by  *
index cbde2e558a39abcc8ddac42bef591bbb795a6daa..ddc3b4d9ab71d618d94a70f09d5f2b23fed6508a 100644 (file)
@@ -1,4 +1,4 @@
-configure_file(${MathGL_SOURCE_DIR}/include/config.h.in ${MathGL_BINARY_DIR}/include/mgl2/config.h)
+configure_file(${MathGL2_SOURCE_DIR}/include/config.h.in ${MathGL2_BINARY_DIR}/include/mgl2/config.h)
 
 install(DIRECTORY mgl2/ DESTINATION ${MGL_INCLUDE_PATH}
                         PATTERN ".svn" EXCLUDE
@@ -14,7 +14,7 @@ install(DIRECTORY mgl2/ DESTINATION ${MGL_INCLUDE_PATH}
                         PATTERN "*.pas"
                         PATTERN "*.h")
 
-install(FILES ${MathGL_BINARY_DIR}/include/mgl2/config.h DESTINATION ${MGL_INCLUDE_PATH})
+install(FILES ${MathGL2_BINARY_DIR}/include/mgl2/config.h DESTINATION ${MGL_INCLUDE_PATH})
 if(MGL_HAVE_FLTK)
        install(FILES mgl2/fltk.h DESTINATION ${MGL_INCLUDE_PATH})
 endif(MGL_HAVE_FLTK)
index 233e3126cab57d702183afae371b2a4028487c3a..412f647dc13ca19dce287220097f5c6648ab8ebd 100644 (file)
@@ -1,7 +1,7 @@
 #ifndef _MGL_CONFIG_H_
 #define _MGL_CONFIG_H_
 
-#define MGL_VER2       ${MathGL_VERSION_MINOR} // minor version of MathGL 2.* (like 1.3 for v.2.1.3)
+#define MGL_VER2       ${MathGL_VERSION_MINOR}.${MathGL_PATCH_VERSION} // minor version of MathGL 2.* (like 1.3 for v.2.1.3)
 
 #define MGL_USE_DOUBLE ${MGL_USE_DOUBLE}
 
 #else
 #define MGL_DEF_FONT_NAME      "${MGL_DEF_FONT}"
 #endif
+#define MGL_INSTALL_DIR        "${CMAKE_INSTALL_PREFIX}"
 
 #if defined(_MSC_VER) || defined(__BORLANDC__)
 #define MGL_SYS_NAN            0
-#define MGL_HAVE_TYPEOF        0
 #define MGL_HAVE_PTHREAD       0
 #define MGL_HAVE_PTHR_WIDGET   0
 #define MGL_HAVE_ATTRIBUTE     0
 #define MGL_HAVE_C99_COMPLEX   0
 #else
-#define MGL_HAVE_TYPEOF        ${MGL_HAVE_TYPEOF}
-#define MGL_SYS_NAN            ${MGL_HAVE_NAN_INF}
+#define MGL_SYS_NAN                    ${MGL_HAVE_NAN_INF}
 #define MGL_HAVE_PTHREAD       ${MGL_HAVE_PTHREAD}
 #define MGL_HAVE_PTHR_WIDGET   ${MGL_HAVE_PTHR_WIDGET}
 #define MGL_HAVE_ATTRIBUTE     ${MGL_HAVE_ATTRIBUTE}
@@ -40,6 +39,8 @@
 #define MGL_HAVE_PDF   ${MGL_HAVE_PDF}
 #define MGL_HAVE_HDF4  ${MGL_HAVE_HDF4}
 #define MGL_HAVE_HDF5  ${MGL_HAVE_HDF5}
+#define MGL_USE_GETTEXT        ${MGL_USE_LIBINTL}
 #define MGL_FONT_PATH  "${MGL_FONT_PATH}"
+#define MGL_HAVE_FL_COPY       ${MGL_HAVE_FL_COPY}
 
 #endif
index 387a347bf92a89fcce6ebd67fc9b3267d450a1ba..b41ef442b56c024206a9830b079dcf7504c7abf4 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * Fl_MathGL.h is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -41,9 +41,20 @@ public:
        Fl_Valuator     *tet_val;       ///< pointer to external tet-angle validator\r
        Fl_Valuator     *phi_val;       ///< pointer to external phi-angle validator\r
        mglCanvas *gr;                  ///< Built-in mglCanvas instance (mglCanvasFLTK is used by default)\r
+       std::string prim;               ///< manual primitives\r
+       bool use_pthr;                  ///< use pthread for update plot\r
 \r
        Fl_MathGL(int x, int y, int w, int h, const char *label=0);\r
        virtual ~Fl_MathGL();\r
+       \r
+       /// Set drawing functions and its parameter\r
+       inline void set_draw(int (*func)(mglBase *gr, void *par), void *par)\r
+       {       if(draw_cl)     delete draw_cl; draw_cl=0;      draw_func=func; draw_par=par;   }\r
+       /// Set drawing functions pointed on mglGraph\r
+       inline void set_draw(int (*dr)(mglGraph *gr))\r
+       {       set_draw(dr?mgl_draw_graph:0,(void*)dr);        }\r
+       /// Set drawing based on instance of mglDraw class\r
+       inline void set_draw(mglDraw *dr)       {       if(draw_cl)     delete draw_cl; draw_cl=dr;     draw_func=0;    }\r
 \r
        /// Update (redraw) plot\r
        virtual void update();\r
@@ -52,23 +63,7 @@ public:
        /// Set bitwise flags for general state (1-Alpha, 2-Light)\r
        inline void set_flag(int f)     {       flag = f;       }\r
        /// Set flags for handling mouse\r
-       void set_graph(HMGL gr);        ///< Set grapher object\r
-       inline void set_graph(mglGraph *Gr)\r
-       {       set_graph(Gr->Self());  }\r
-       /// Get pointer to grapher\r
-       inline HMGL get_graph() {       return (HMGL)gr;        }\r
-       /// Get mglDraw pointer or NULL\r
-       inline mglDraw *get_class()\r
-       {       mglDraw *d=0;\r
-               if(draw_func==mgl_draw_class)   d = (mglDraw*)draw_par;\r
-               if(draw_cl)     d = draw_cl;    return d;       }\r
-       /// Set drawing functions and its parameter\r
-       inline void set_draw(int (*func)(mglBase *gr, void *par), void *par)\r
-       {       if(draw_cl)     delete draw_cl; draw_cl=0;      draw_func=func; draw_par=par;   }\r
-       inline void set_draw(mglDraw *dr)       {       if(draw_cl)     delete draw_cl; draw_cl=dr;     draw_func=0;    }\r
-       inline void set_draw(int (*dr)(mglGraph *gr))\r
-       {       set_draw(dr?mgl_draw_graph:0,(void*)dr);        }\r
-       void set_state(bool z, bool r)  {       zoom = z;       rotate = r;     }\r
+       void set_state(bool z, bool r, bool g=false)    {       zoom = z;       rotate = r;     grid = g;       }\r
        /// Set zoom in/out region\r
        inline void set_zoom(mreal X1, mreal Y1, mreal X2, mreal Y2)\r
        {       x1 = X1;        x2 = X2;        y1 = Y1;        y2 = Y2;        update();       }\r
@@ -78,15 +73,42 @@ public:
        /// Set popup menu pointer\r
        inline void set_popup(const Fl_Menu_Item *pmenu, Fl_Widget *wdg, void *v)\r
        {       popup = pmenu;  wpar = wdg;     vpar = v;       }\r
-       inline void zoom_region(mreal xx1,mreal xx2,mreal yy1, mreal yy2)\r
-       {       x1=xx1; y1=yy1; x2=xx2; y2=yy2; }\r
+\r
+       /// Set grapher object instead of built-in one. \r
+       /// NOTE: Fl_MathGL will automatically delete this object\r
+       void set_graph(HMGL gr);\r
+       /// Set grapher object instead of built-in one. \r
+       /// NOTE: Fl_MathGL will automatically delete this object\r
+       inline void set_graph(mglGraph *Gr)\r
+       {       set_graph(Gr->Self());  }\r
+       /// Get pointer to grapher\r
+       inline HMGL get_graph() {       return (HMGL)gr;        }\r
+\r
+       /// Get mglDraw pointer or NULL\r
+       inline mglDraw *get_class()\r
+       {       mglDraw *d=0;\r
+               if(draw_func==mgl_draw_class)   d = (mglDraw*)draw_par;\r
+               if(draw_cl)     d = draw_cl;\r
+               return d;       }\r
+       \r
+       /// Show window with warnings after script parsing\r
+       inline void set_show_warn(bool s)       {       show_warn=s;    }\r
+       /// Ask to stop of script parsing\r
        void stop(bool stop=true);\r
+       /// Enable/disable key handling as in mglview (default is false)\r
+       inline void set_handle_key(bool val)    {       handle_keys=true;       }\r
+       /// Get id of last clicked object\r
+       inline int get_last_id()        {       return last_id; }\r
+       void draw_plot();       ///< Single thread drawing itself\r
+       /// Check if script is parsing now or not\r
+       inline bool running()   {       return run;     }\r
 \r
 protected:\r
        void *draw_par;         ///< Parameters for drawing function mglCanvasWnd::DrawFunc.\r
        /// Drawing function for window procedure. It should return the number of frames.\r
        int (*draw_func)(mglBase *gr, void *par);\r
        mglDraw *draw_cl;\r
+       int last_id;                                    ///< last selected object id\r
 \r
        const Fl_Menu_Item *popup;      ///< pointer to popup menu items\r
        Fl_Widget *wpar;                        ///< widget for popup menu\r
@@ -94,11 +116,18 @@ protected:
        mreal tet,phi;                          ///< rotation angles\r
        bool rotate;                            ///< flag for handle mouse\r
        bool zoom;                                      ///< flag for zoom by mouse\r
-       bool wire;\r
+       bool grid;                                      ///< flag to draw grid and edit prim\r
+       bool show_warn;                         ///< show window with warnings\r
+       bool handle_keys;\r
        mreal x1,x2,y1,y2;                      ///< zoom region\r
        int flag;                                       ///< bitwise flag for general state (1-Alpha, 2-Light)\r
        int x0,y0,xe,ye;                        ///< mouse position\r
        char pos[128];\r
+       bool run;                                       ///< flag that drawing in progress\r
+       const unsigned char *img;       ///< image for drawing\r
+#if (MGL_HAVE_PTHREAD|MGL_HAVE_PTHR_WIDGET)\r
+       pthread_t thr;                          ///< main thread for drawing\r
+#endif\r
 \r
        virtual void draw();            ///< quick drawing function\r
        int handle(int code);           ///< handle mouse events\r
@@ -118,18 +147,19 @@ public:
        mreal (*delay)(void*);  ///< Callback function for delay\r
        void (*reload)(void*);  ///< Callback function for reloading\r
 \r
-       void toggle_alpha()     {       toggle(alpha, alpha_bt, "Graphics/Alpha");      }\r
-       void toggle_light()     {       toggle(light, light_bt, "Graphics/Light");      }\r
-       void toggle_sshow()     {       toggle(sshow, anim_bt, "Graphics/Slideshow");   }\r
-       void toggle_grid()      {       toggle(grid, grid_bt, "Graphics/Grid"); }\r
+       void toggle_alpha()     {       toggle(alpha, alpha_bt, _("Graphics/Alpha"));   }\r
+       void toggle_light()     {       toggle(light, light_bt, _("Graphics/Light"));   }\r
+       void toggle_sshow()     {       toggle(sshow, anim_bt, _("Graphics/Animation/Slideshow"));      }\r
+       void toggle_grid()      {       toggle(grid, grid_bt, _("Graphics/Grid"));      }\r
        void toggle_zoom()      {       toggle(zoom, zoom_bt);  }\r
        void toggle_rotate(){   toggle(rotate, rotate_bt);      }\r
        void setoff_zoom()      {       setoff(zoom, zoom_bt);  }\r
        void setoff_rotate(){   setoff(rotate, rotate_bt);      }\r
        bool is_sshow()         {       return sshow;   }\r
-       void toggle_pause()     {       toggle(pauseC, pause_bt, "Graphics/Pause calc");        exec_pause();   }\r
+       void toggle_pause()     {       toggle(pauseC, pause_bt, _("Graphics/Pause calc"));     exec_pause();   }\r
        void adjust()\r
        {       mgl_set_size(FMGL->get_graph(),scroll->w(),scroll->h());        FMGL->size(scroll->w(),scroll->h());    update();       }\r
+       HMGL get_graph()        {       return FMGL->get_graph();       }\r
 \r
        Fl_MGLView(int x, int y, int w, int h, const char *label=0);\r
        virtual ~Fl_MGLView();\r
@@ -148,5 +178,7 @@ protected:
 };\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_makemenu_fltk(Fl_Menu_ *m, Fl_MGLView *w);\r
+MGL_EXPORT const char *mgl_file_chooser(const char *mess, const char *filter="", bool save=false);\r
+MGL_EXPORT const char *mgl_dir_chooser(const char *mess, const char *path);\r
 //-----------------------------------------------------------------------------\r
 #endif\r
index 48cc733a1fc05ea1ca02e292b6dd95d46ebd6c00..a252b636c1164279e2438ea65de731251964d529 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************
  * abstract.h is part of Math Graphic Library
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   it under the terms of the GNU Library General Public License as       *
@@ -23,7 +23,6 @@
 #include "mgl2/define.h"
 //-----------------------------------------------------------------------------
 #ifdef __cplusplus
-#include <string>
 #include "mgl2/type.h"
 #define MGL_TO_WCS(str,code)   if(str && *str){size_t s=mbstowcs(0,str,0); wchar_t *wcs=new wchar_t[s+1]; mbstowcs(wcs,str,s); wcs[s]=0; code; delete []wcs;}else{const wchar_t *wcs=L""; code;}
 //-----------------------------------------------------------------------------
@@ -45,10 +44,20 @@ typedef const mglDataA* HCDT;
 
 std::string MGL_EXPORT mgl_data_to_string(HCDT d, long ns);
 std::string MGL_EXPORT mgl_datac_to_string(HCDT d, long ns);
+/// Get section separated by symbol ch. This is analog of QString::section().
+std::string MGL_EXPORT mgl_str_arg(const std::string &str, char ch, int n1, int n2=-1);
+/// Get sections separated by symbol ch
+std::vector<std::string> MGL_EXPORT mgl_str_args(const std::string &str, char ch);
+/// Get string from real number
+std::string MGL_EXPORT mgl_str_num(double val);
+/// Get string from complex number
+std::string MGL_EXPORT mgl_str_num(dual val);
+
 extern "C" {
 
 #else
 #define mglDataA void
+#define mglNum void
 typedef void *HMGL;
 typedef void *HMDT;
 typedef void *HADT;
@@ -85,8 +94,10 @@ void MGL_EXPORT mgl_data_save_hdf_(uintptr_t *d, const char *fname, const char *
 MGL_EXPORT const char *mgl_data_info(HCDT dat);
 int MGL_EXPORT mgl_data_info_(uintptr_t *dat, char *out, int len);
 /// Put HDF data names into buf as '\t' separated.
-int MGL_EXPORT mgl_datas_hdf(const char *fname, char *buf, long size);
-int MGL_EXPORT mgl_datas_hdf_(const char *fname, char *buf, int l, int size);
+long MGL_EXPORT mgl_datas_hdf(const char *fname, char *buf, long size);
+long MGL_EXPORT mgl_datas_hdf_(const char *fname, char *buf, int l, int size);
+/// Put HDF data names as list of strings (last one is "").
+MGL_EXPORT const char * const * mgl_datas_hdf_str(const char *fname);
 
 /// Get maximal value of the data
 mreal MGL_EXPORT mgl_data_max(HCDT dat);
@@ -127,6 +138,9 @@ mreal MGL_EXPORT mgl_data_min_real_(uintptr_t *dat, mreal *x, mreal *y, mreal *z
 /// Get "energy and find 4 momenta of data: median, width, skewness, kurtosis
 mreal MGL_EXPORT mgl_data_momentum_val(HCDT d, char dir, mreal *m, mreal *w, mreal *s, mreal *k);
 mreal MGL_EXPORT mgl_data_momentum_val_(uintptr_t *dat, char *dir, mreal *m, mreal *w, mreal *s, mreal *k,int);
+/// Get first (last if from<0) maximum along direction dir, and save its orthogonal coordinates in p1, p2
+long MGL_EXPORT mgl_data_max_first(HCDT d, char dir, long from, long *p1, long *p2);
+long MGL_EXPORT mgl_data_max_first_(uintptr_t *d, const char *dir, long *from, long *p1, long *p2,int);
 
 /// Interpolate by linear function the data to given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1]
 mreal MGL_EXPORT mgl_data_linear(HCDT dat, mreal x,mreal y,mreal z);
@@ -135,12 +149,29 @@ mreal MGL_EXPORT mgl_data_linear_(uintptr_t *dat, mreal *x,mreal *y,mreal *z);
 mreal MGL_EXPORT mgl_data_linear_ext(HCDT dat, mreal x,mreal y,mreal z, mreal *dx,mreal *dy,mreal *dz);
 mreal MGL_EXPORT mgl_data_linear_ext_(uintptr_t *dat, mreal *x,mreal *y,mreal *z, mreal *dx,mreal *dy,mreal *dz);
 
+/// Internal function for (un-)locking mutex in mglStack
+void MGL_EXPORT mgl_mutex_lock(void *);
+void MGL_EXPORT mgl_mutex_unlock(void *);
+
 //-----------------------------------------------------------------------------
 /// Callback function for asking user a question. Result shouldn't exceed 1024.
 extern MGL_EXPORT void (*mgl_ask_func)(const wchar_t *quest, wchar_t *res);
 //-----------------------------------------------------------------------------
 #ifdef __cplusplus
 }
+//-----------------------------------------------------------------------------
+/// Structure for the number handling (see mglParse class).
+struct MGL_EXPORT mglNum
+{
+       mreal d;                ///< Number itself
+       dual c;
+       std::wstring s; ///< Number name
+       mglNum(mreal val=0):d(val),c(val)       {}
+       mglNum(const mglNum &n):d(n.d),c(n.c),s(n.s) {}
+       const mglNum &operator=(const mglNum &n)
+       {       d=n.d;  c=n.c;  s=n.s;  return n;       }
+};
+//-----------------------------------------------------------------------------
 /// Abstract class for data array
 class MGL_EXPORT mglDataA
 {
@@ -152,7 +183,7 @@ public:
 
        mglDataA()      {       temp=false;     func=0; o=0;    }
        virtual ~mglDataA()     {       if(func)        func(o);        }
-       virtual void set_v(mreal val, long i,long j=0,long k=0) {}
+       virtual void set_v(mreal /*val*/, long /*i*/,long /*j*/=0,long /*k*/=0) {}
        /// Get the interpolated value and its derivatives in given data cell without border checking
        virtual mreal valueD(mreal x,mreal y=0,mreal z=0,mreal *dx=0,mreal *dy=0,mreal *dz=0) const =0;
        /// Get the interpolated value in given data cell without border checking
@@ -164,7 +195,10 @@ public:
        inline mreal linearD(mreal x,mreal y=0,mreal z=0,mreal *dx=0,mreal *dy=0,mreal *dz=0)   const
        {       return mgl_data_linear_ext(this,x,y,z,dx,dy,dz);        }
        virtual mreal v(long i,long j=0,long k=0) const = 0;
-       virtual mreal vthr(long i) const = 0;
+       virtual mreal vthr(long i) const
+       {       return v(i%GetNx(), (i/GetNx())%GetNy(), i/(GetNx()*GetNy()));  }
+       virtual dual vc(long i,long j=0,long k=0) const {       return v(i,j,k);        }
+       virtual dual vcthr(long i) const        {       return vthr(i); }
        virtual long GetNx() const = 0;
        virtual long GetNy() const = 0;
        virtual long GetNz() const = 0;
@@ -192,6 +226,9 @@ public:
        /// Put HDF data names into buf as '\t' separated.
        inline static int DatasHDF(const char *fname, char *buf, long size)
        {       return mgl_datas_hdf(fname,buf,size);   }
+       /// Put HDF data names as list of strings (last one is "").
+       inline static const char * const * DatasHDF(const char *fname)
+       {       return mgl_datas_hdf_str(fname);        }
 
        /// Get information about the data (sizes and momentum) to string
        inline const char *PrintInfo() const    {       return mgl_data_info(this);     }
@@ -218,6 +255,11 @@ public:
        /// Get minimal value of the data and its approximated position
        inline mreal Minimal(mreal &x,mreal &y,mreal &z) const
        {       return mgl_data_min_real(this,&x,&y,&z);        }
+       /// Get first (last if from<0) maximum along direction dir, and save its orthogonal coordinates in p1, p2
+       inline long Maximal(char dir, long from, long &p1, long &p2) const
+       {       return mgl_data_max_first(this,dir,from,&p1,&p2);       }
+       inline long Maximal(char dir, long from) const
+       {       return mgl_data_max_first(this,dir,from,0,0);   }
        /// Get "energy" and find first (median) and second (width) momenta of data
        inline mreal Momentum(char dir,mreal &m,mreal &w) const
        {       return mgl_data_momentum_val(this,dir,&m,&w,0,0);       }
@@ -236,6 +278,34 @@ public:
        /// Find if any nonzero value of formula
        inline bool FindAny(const char *cond) const
        {       return mgl_data_find_any(this,cond);    }
+
+       /// Interpolate by cubic spline the data to given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1]
+       inline mreal Spline(mreal x,mreal y=0,mreal z=0) const
+       {       return value(x,y,z);    }
+       /// Interpolate by cubic spline the data to given point x,\a y,\a z which normalized in range [0, 1]
+       inline mreal Spline1(mreal x,mreal y=0,mreal z=0) const
+       {       return value(x*(GetNx()-1),y*(GetNy()-1),z*(GetNz()-1));        }
+       /// Interpolate by cubic spline the data and return its derivatives at given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1]
+       inline mreal Spline(mglPoint &dif, mreal x,mreal y=0,mreal z=0) const
+       {       return valueD(x,y,z, &(dif.x),&(dif.y), &(dif.z));      }
+       /// Interpolate by cubic spline the data and return its derivatives at given point x,\a y,\a z which normalized in range [0, 1]
+       inline mreal Spline1(mglPoint &dif, mreal x,mreal y=0,mreal z=0) const
+       {       mreal res=valueD(x*(GetNx()-1),y*(GetNy()-1),z*(GetNz()-1), &(dif.x),&(dif.y), &(dif.z));
+               dif.x*=GetNx()>1?GetNx()-1:1;   dif.y*=GetNy()>1?GetNy()-1:1;   dif.z*=GetNz()>1?GetNz()-1:1;   return res;     }
+
+       /// Interpolate by linear function the data to given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1]
+       inline mreal Linear(mreal x,mreal y=0,mreal z=0)        const
+       {       return mgl_data_linear_ext(this,x,y,z,0,0,0);   }
+       /// Interpolate by line the data to given point x,\a y,\a z which normalized in range [0, 1]
+       inline mreal Linear1(mreal x,mreal y=0,mreal z=0) const
+       {       return mgl_data_linear_ext(this,x*(GetNx()-1),y*(GetNy()-1),z*(GetNz()-1),0,0,0);       }
+       /// Interpolate by linear function the data and return its derivatives at given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1]
+       inline mreal Linear(mglPoint &dif, mreal x,mreal y=0,mreal z=0) const
+       {       return mgl_data_linear_ext(this,x,y,z, &(dif.x),&(dif.y), &(dif.z));    }
+       /// Interpolate by line the data and return its derivatives at given point x,\a y,\a z which normalized in range [0, 1]
+       inline mreal Linear1(mglPoint &dif, mreal x,mreal y=0,mreal z=0) const
+       {       mreal res=mgl_data_linear_ext(this,x*(GetNx()-1),y*(GetNy()-1),z*(GetNz()-1), &(dif.x),&(dif.y), &(dif.z));
+               dif.x*=GetNx()>1?GetNx()-1:1;   dif.y*=GetNy()>1?GetNy()-1:1;   dif.z*=GetNz()>1?GetNz()-1:1;   return res;     }
 };
 //-----------------------------------------------------------------------------
 /// Structure for color ID
index 801054c22b2c22f72a771204f25c9070d026871b..2e9d98f6f0e12ca09127dcc10b4af700746ac73a 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************
  * addon.h is part of Math Graphic Library
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   it under the terms of the GNU Library General Public License as       *
index 8ef2c3f97f959aff197f2ba0a64756fdeee8688d..37e10b0c65251b0949e1435eafe0867103c4c8fb 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * base.h is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -23,8 +23,6 @@
 #include "mgl2/abstract.h"\r
 \r
 #ifdef __cplusplus\r
-#include <vector>\r
-#include <string>\r
 \r
 #if (MGL_HAVE_PTHREAD|MGL_HAVE_PTHR_WIDGET)\r
 #include <pthread.h>\r
@@ -35,9 +33,6 @@
 #else\r
 #define MGL_PUSH(a,v,m)        a.push_back(v);\r
 #endif\r
-#if MGL_HAVE_OMP\r
-#include <omp.h>\r
-#endif\r
 //-----------------------------------------------------------------------------\r
 inline mreal mgl_d(mreal v,mreal v1,mreal v2) { return v2!=v1?(v-v1)/(v2-v1):NAN; }\r
 //-----------------------------------------------------------------------------\r
@@ -59,13 +54,13 @@ public:
        mglStack(const mglStack<T> &st)\r
        {       np=st.np;       dat = (T**)malloc(np*sizeof(T*));\r
                pb=st.pb;       m=n=0;  reserve(st.n);\r
-               for(size_t i=0;i<m;i++) memcpy(dat[i],st.dat[i],(1L<<pb)*sizeof(T));\r
+               for(size_t i=0;i<m;i++) memcpy(dat[i],st.dat[i],((size_t)1<<pb)*sizeof(T));\r
                n=st.n;         mutex = 0;      }\r
        mglStack(size_t Pbuf=10)\r
        {       np=16;  pb=Pbuf;        dat = (T**)malloc(np*sizeof(T*));\r
-               dat[0] = new T[1L<<pb]; n=0;    m=1;    mutex = 0;      }\r
+               dat[0] = new T[(size_t)1<<pb];  n=0;    m=1;    mutex = 0;      }\r
        ~mglStack()     {       clear();        delete [](dat[0]);      free(dat);      }\r
-       inline void set_mutex(void *m)  {       mutex = m;      }\r
+       inline void set_mutex(void *mtx)        {       mutex = mtx;    }\r
        void reserve(size_t num)\r
        {\r
                num+=n;\r
@@ -74,44 +69,30 @@ public:
                        num = 1+ (num>>pb);\r
                        if(num>np)\r
                        {       dat = (T**)realloc(dat, num*sizeof(T*));        np=num; }\r
-                       for(size_t i=m;i<num;i++)       dat[i] = new T[1L<<pb];\r
+                       for(size_t i=m;i<num;i++)       dat[i] = new T[(size_t)1<<pb];\r
                        m = num;\r
                }\r
        }\r
        void clear()\r
        {\r
-               if(mutex)\r
-               {\r
-#if MGL_HAVE_PTHREAD\r
-                       pthread_mutex_lock((pthread_mutex_t *)mutex);\r
-#elif MGL_HAVE_OMP\r
-                       omp_set_lock((omp_lock_t *)mutex);\r
-#endif\r
-               }\r
+               if(mutex)       mgl_mutex_lock(mutex);\r
                for(size_t i=0;i<m;i++) delete [](dat[i]);\r
-               dat[0] = new T[1L<<pb]; n=0;    m=1;\r
-               if(mutex)\r
-               {\r
-#if MGL_HAVE_PTHREAD\r
-                       pthread_mutex_unlock((pthread_mutex_t *)mutex);\r
-#elif MGL_HAVE_OMP\r
-                       omp_unset_lock((omp_lock_t *)mutex);\r
-#endif\r
-               }\r
+               dat[0] = new T[(size_t)1<<pb];  n=0;    m=1;\r
+               if(mutex)       mgl_mutex_unlock(mutex);\r
        }\r
-       T &operator[](size_t i) {       register size_t d=i>>pb;        return dat[d][i-(d<<pb)];       }\r
-       const T &operator[](size_t i)   const   {       register size_t d=i>>pb;        return dat[d][i-(d<<pb)];       }\r
+       T &operator[](size_t i) {       size_t d=i>>pb; return dat[d][i-(d<<pb)];       }\r
+       const T &operator[](size_t i)   const   {       size_t d=i>>pb; return dat[d][i-(d<<pb)];       }\r
        void push_back(const T &t)\r
        {\r
                if(n>=(m<<pb))  reserve(1);\r
-               register size_t d=n>>pb;\r
+               size_t d=n>>pb;\r
                dat[d][n-(d<<pb)] = t;  n++;\r
        }\r
        size_t size()   const   {       return n;       }\r
        const mglStack<T> &operator=(const mglStack<T> &st)\r
        {\r
                pb=st.pb;       clear();        reserve(st.n);\r
-               for(size_t i=0;i<st.m && i<m;i++)       memcpy(dat[i],st.dat[i],(1L<<pb)*sizeof(T));\r
+               for(size_t i=0;i<st.m && i<m;i++)       memcpy(dat[i],st.dat[i],((size_t)1<<pb)*sizeof(T));\r
                n = st.n;       return st;\r
        }\r
 };\r
@@ -167,6 +148,8 @@ struct MGL_EXPORT mglLight
 {\r
        mglLight():n(false),a(0),b(0)   {}\r
        mglLight(const mglLight &aa) : n(aa.n),d(aa.d),r(aa.r),q(aa.q),p(aa.p),a(aa.a),b(aa.b),c(aa.c)  {}\r
+       const mglLight &operator=(const mglLight &aa)\r
+       {       memcpy(this,&aa,sizeof(mglLight));      return aa;      }\r
 \r
        bool n;                 ///< Availability of light sources\r
        mglPoint d;             ///< Direction of light sources\r
@@ -238,6 +221,7 @@ struct MGL_EXPORT mglPnt    // NOTE: use float for reducing memory size
        mglPnt():x(0),y(0),z(0),u(0),v(0),w(0),r(0),g(0),b(0),a(0),xx(0),yy(0),zz(0),c(0),t(0),ta(0),sub(0)     {}\r
        mglPnt(const mglPnt &aa) : sub(aa.sub)  {       memcpy(dat,aa.dat,16*sizeof(float));    }\r
        inline const mglPnt&operator=(const mglPnt &aa) { sub=aa.sub;   memcpy(dat,aa.dat,16*sizeof(float));    return aa;      }\r
+       inline bool same(const mglPnt &p, mreal d)      const { return fabs(x-p.x)<d && fabs(y-p.y)<d;  }\r
 };\r
 inline mglPnt operator+(const mglPnt &a, const mglPnt &b)\r
 {      mglPnt p;       for(long i=0;i<10;i++)  p.dat[i] = a.dat[i]+b.dat[i];   p.sub=a.sub;    return p;       }\r
@@ -254,46 +238,49 @@ inline mglPnt operator*(float b, const mglPnt &a)
 //-----------------------------------------------------------------------------\r
 /// Structure for glyph representation\r
 struct MGL_EXPORT mglGlyph\r
-{\r
-       long nt, nl;                    ///< number of triangles and lines\r
+{      // NOTE nt<0 is used to set char id for user-defined glyphs\r
+       long nt, nl;            ///< number of triangles and lines\r
        short *trig, *line;     ///< vertexes of triangles and lines\r
 \r
        mglGlyph():nt(0),nl(0),trig(0),line(0)  {}\r
        mglGlyph(const mglGlyph &a):nt(0),nl(0),trig(0),line(0) {       *this=a;        }\r
        mglGlyph(long Nt, long Nl):nt(0),nl(0),trig(0),line(0)  {       Create(Nt,Nl);  }\r
-#if MGL_HAVE_RVAL\r
-       mglGlyph(mglGlyph &&aa) : nt(aa.nt),nl(aa.nl),trig(aa.trig), line(aa.line)      {       aa.trig=aa.line=0;      }\r
-#endif\r
        ~mglGlyph()     {       if(trig)        delete []trig;  if(line)        delete []line;  }\r
 \r
        void Create(long Nt, long Nl);\r
-       bool operator==(const mglGlyph &g) MGL_FUNC_PURE;\r
-       inline bool operator!=(const mglGlyph &g)       {       return !(*this==g);     }\r
+       bool operator==(const mglGlyph &g) const MGL_FUNC_PURE;\r
+       inline bool operator!=(const mglGlyph &g) const MGL_FUNC_PURE\r
+       {       return !(*this==g);     }\r
        inline const mglGlyph &operator=(const mglGlyph &a)\r
-       {       Create(a.nt, a.nl);     memcpy(trig, a.trig, 6*nt*sizeof(short));\r
-               memcpy(line, a.line, 2*nl*sizeof(short));       return a;       }\r
+       {       Create(a.nt, a.nl);\r
+               if(a.trig)      memcpy(trig, a.trig, 6*nt*sizeof(short));\r
+               if(a.line)      memcpy(line, a.line, 2*nl*sizeof(short));\r
+               return a;       }\r
 };\r
 //-----------------------------------------------------------------------------\r
 #define MGL_TEXTURE_COLOURS 512\r
 /// Structure for texture (color scheme + palette) representation\r
 struct MGL_EXPORT mglTexture\r
 {\r
-       mglColor col[MGL_TEXTURE_COLOURS];      ///< Colors itself\r
+       mglColor *col;  ///< Colors itself\r
        long n;                         ///< Number of initial colors along u\r
 \r
        char Sch[260];          ///< Color scheme used\r
        int Smooth;                     ///< Type of texture (smoothing and so on)\r
        mreal Alpha;                    ///< Transparency\r
 \r
-       mglTexture():n(0),Smooth(0),Alpha(1)    {}\r
+       mglTexture():n(0),Smooth(0),Alpha(1)\r
+       {       col = new mglColor[MGL_TEXTURE_COLOURS];        }\r
        mglTexture(const char *cols, int smooth=0,mreal alpha=1):n(0)\r
-       {       Set(cols,smooth,alpha); }\r
+       {       col = new mglColor[MGL_TEXTURE_COLOURS];        Set(cols,smooth,alpha); }\r
        mglTexture(const mglTexture &aa) : n(aa.n),Smooth(aa.Smooth),Alpha(aa.Alpha)\r
-       {       memcpy(col,aa.col,MGL_TEXTURE_COLOURS*sizeof(mglColor));        memcpy(Sch,aa.Sch,260); }\r
+       {       col = new mglColor[MGL_TEXTURE_COLOURS];        memcpy(Sch,aa.Sch,260);\r
+               memcpy(col,aa.col,MGL_TEXTURE_COLOURS*sizeof(mglColor));        }\r
 #if MGL_HAVE_RVAL\r
        mglTexture(mglTexture &&aa) : n(aa.n),Smooth(aa.Smooth),Alpha(aa.Alpha)\r
-       {       memcpy(col,aa.col,MGL_TEXTURE_COLOURS*sizeof(mglColor));        memcpy(Sch,aa.Sch,260); }\r
+       {       col = aa.col;   memcpy(Sch,aa.Sch,260); aa.col=0;       }\r
 #endif\r
+       ~mglTexture()   {       if(col) delete []col;   }\r
        void Clear()    {       n=0;    }\r
        void Set(const char *cols, int smooth=0,mreal alpha=1);\r
        void Set(HCDT val, const char *cols);\r
@@ -323,6 +310,18 @@ struct MGL_EXPORT mglActivePos
        int n;          ///< position of active point in command (object id)\r
 };\r
 //-----------------------------------------------------------------------------\r
+#if defined(_MSC_VER)\r
+template class MGL_EXPORT mglStack<mglPnt>;\r
+template class MGL_EXPORT mglStack<mglPrim>;\r
+template class MGL_EXPORT std::vector<mglGroup>;\r
+template class MGL_EXPORT std::vector<mglText>;\r
+template class MGL_EXPORT std::vector<mglTexture>;\r
+template class MGL_EXPORT std::vector<mglGlyph>;\r
+template class MGL_EXPORT std::vector<mglBlock>;\r
+template class MGL_EXPORT std::vector<mglMatrix>;\r
+template class MGL_EXPORT mglStack<mglActivePos>;\r
+#endif\r
+//-----------------------------------------------------------------------------\r
 /// Base class for canvas which handle all basic drawing\r
 class MGL_EXPORT mglBase\r
 {\r
@@ -336,9 +335,11 @@ public:
        std::string Mess;       ///< Buffer for receiving messages\r
        int ObjId;                      ///< object id for mglPrim\r
        int HighId;                     ///< object id to be highlited\r
-       mglStack<mglGroup> Grp;         ///< List of groups with names -- need for export\r
+       std::vector<mglGroup> Grp;      ///< List of groups with names -- need for export\r
        mglStack<mglActivePos> Act;     ///< Position of active points\r
        std::string PlotId;     ///< Id of plot for saving filename (in GLUT window for example)\r
+       int BBoxX1, BBoxY1, BBoxX2, BBoxY2;     ///< BBox region for exporting 2d graphics\r
+       std::vector<mglGlyph> UserGlf;  ///< User-defined glyphs data\r
 \r
        mreal CDef;                     ///< Default (current) color in texture\r
        mreal AlphaDef;         ///< Default value of alpha channel (transparency)\r
@@ -424,6 +425,7 @@ public:
        /// Set default palette\r
        inline void SetPalette(const char *colors)\r
        {       Txt[0].Set(mgl_have_color(colors)?colors:MGL_DEF_PAL,-1);       }\r
+       inline void ResetPal()  {       CurrPal=0;      }\r
        inline long GetNumPal(long id) const    {       return Txt[labs(id)/256].n;     }\r
        /// Set default color scheme\r
        inline void SetDefScheme(const char *colors)\r
@@ -476,11 +478,13 @@ public:
        virtual mreal GetRatio() const MGL_FUNC_CONST;\r
        virtual int GetWidth() const MGL_FUNC_CONST;\r
        virtual int GetHeight() const MGL_FUNC_CONST;\r
+       /// Add user-defined glyph\r
+       void DefineGlyph(HCDT x, HCDT y, unsigned char id=0);\r
 \r
        /// Set to use or not text rotation\r
        inline void SetRotatedText(bool val)    {       set(val,MGL_ENABLE_RTEXT);      }\r
        /// Set default font style and color\r
-       void SetFontDef(const char *font);\r
+       inline void SetFontDef(const char *font){       mgl_strncpy(FontDef, font, 31); }\r
        /// Set to use or not text rotation\r
        inline void SetTickRotate(bool val)     {       set(val,MGL_TICKS_ROTATE);      }\r
        /// Set to use or not text rotation\r
@@ -505,12 +509,14 @@ public:
        long CopyNtoC(long k, mreal c);\r
        long CopyProj(long from, mglPoint p, mglPoint n, short sub=0);\r
        void SetRGBA(long k, const mglColor &c)\r
-       {       mglPnt &p=Pnt[k];       p.r = c.r;      p.g = c.g;      p.b = c.b;      p.a = c.a;      }\r
-       virtual void Reserve(long n);           ///< Allocate n-cells for Pnt and return current position\r
+       {       if(k>=0)        {mglPnt &p=Pnt[k];      p.r = c.r;      p.g = c.g;      p.b = c.b;      p.a = c.a;}     }\r
+       virtual void Reserve(long n);   ///< Allocate n-cells for Pnt and return current position\r
        /// Set to reduce accuracy of points (to reduce size of output files)\r
        inline void SetReduceAcc(bool val)      {       set(val, MGL_REDUCEACC);        }\r
        /// Add glyph of current font to the Glf and return its position\r
        long AddGlyph(int s, long j);\r
+       /// Add glyph to the Glf and return its position\r
+       long AddGlyph(unsigned char id);\r
        /// Add active point as k-th element of Pnt\r
        void AddActive(long k,int n=0);\r
        /// Clear unused points and primitives\r
@@ -530,6 +536,13 @@ public:
        inline long GetGlfNum() const           {       return Glf.size();      }\r
        inline const mglPnt &GetPnt(long i) const       {       return Pnt[i];          }\r
        inline long GetPntNum() const           {       return Pnt.size();      }\r
+       inline bool SamePnt(long i, long j) const\r
+       {\r
+               if(i<0 || j<0)  return true;\r
+               const mglPnt &p=Pnt[i], &q=Pnt[j];\r
+//             return GetWidth()>1 ? (long(p.x)==long(q.x) && long(p.y)==long(q.y)): (p.x==q.x && p.y==q.y);\r
+               return p.x==q.x && p.y==q.y;    \r
+       }\r
 //     inline mglPrim &GetPrm(long i)          {       return Prm[i];          }\r
        inline mglPrim &GetPrm(long i, bool sort=true)\r
        {       return (sort && PrmInd) ? Prm[PrmInd[i]]:Prm[i];        }\r
@@ -570,14 +583,20 @@ public:
        virtual void line_plot(long p1, long p2)=0;\r
        virtual void trig_plot(long p1, long p2, long p3)=0;\r
        virtual void quad_plot(long p1, long p2, long p3, long p4)=0;\r
+       virtual void smbl_plot(long p1, char id, double size)=0;\r
        virtual void Glyph(mreal x, mreal y, mreal f, int style, long icode, mreal col)=0;\r
        virtual float GetGlyphPhi(const mglPnt &q, float phi)=0;\r
        virtual mreal text_plot(long p,const wchar_t *text,const char *fnt,mreal size=-1,mreal sh=0,mreal  col=-('k'),bool rot=true)=0;\r
        void vect_plot(long p1, long p2, mreal s=1);\r
+       \r
+       // check if visible\r
+       virtual bool trig_vis(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3) const =0;\r
+       virtual bool quad_vis(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3, const mglPnt &p4) const =0;\r
+\r
        inline mreal mark_size()        {       return MarkSize*font_factor;    }\r
 //     inline char last_color()        {       return last_style[1];   }\r
        inline const char *last_line()  {       return last_style;      }\r
-       int PrmCmp(long i, long j) const MGL_FUNC_PURE; // compare 2 primitives with indexes i,j\r
+       int PrmCmp(size_t i, size_t j) const MGL_FUNC_PURE;     // compare 2 primitives with indexes i,j\r
        /// Check if plot termination is asked\r
        bool NeedStop() {       if(event_cb)    event_cb(event_par);    return Stop;    }\r
        /// Ask to stop drawing\r
@@ -598,29 +617,27 @@ protected:
        mglPoint FMax;          ///< Actual upper edge after transformation formulas.\r
        mglPoint Org;           ///< Center of axis cross section.\r
        int WarnCode;           ///< Warning code\r
-       long *PrmInd;           ///< Indexes of sorted primitives\r
+       size_t *PrmInd;         ///< Indexes of sorted primitives\r
        mglStack<mglPnt> Pnt;   ///< Internal points\r
        mglStack<mglPrim> Prm;  ///< Primitives (lines, triangles and so on) -- need for export\r
        std::vector<mglBlock> Sub;      ///< InPlot regions\r
        std::vector<mglText> Ptx;       ///< Text labels for mglPrim\r
        std::vector<mglText> Leg;       ///< Text labels for legend\r
        std::vector<mglGlyph> Glf;      ///< Glyphs data\r
-       mglStack<mglTexture> Txt;       ///< Pointer to textures\r
+       std::vector<mglTexture> Txt;    ///< Pointer to textures\r
 #if MGL_HAVE_PTHREAD\r
        pthread_mutex_t mutexPnt, mutexTxt, mutexLeg, mutexGlf, mutexAct, mutexDrw;\r
        pthread_mutex_t mutexSub, mutexPrm, mutexPtx, mutexStk, mutexGrp, mutexClf;\r
 #endif\r
-#if MGL_HAVE_OMP\r
-       omp_lock_t lockClf;\r
-#endif\r
+       void *lockClf;          ///< pointer to mutex for mglStack\r
 \r
        int TernAxis;           ///< Flag that Ternary axis is used\r
        unsigned PDef;          ///< Pen bit mask\r
        mreal pPos;                     ///< Current position in pen mask\r
        mreal PenWidth;         ///< Pen width for further line plotting (must be >0 !!!)\r
 //     long numT;                      ///< Number of textures\r
-       mreal AmbBr;            ///< Default ambient light brightness   // TODO move to mglBlock\r
-       mreal DifBr;            ///< Default diffusive light brightness // TODO move to mglBlock\r
+       mreal AmbBr;            ///< Default ambient light brightness\r
+       mreal DifBr;            ///< Default diffusive light brightness\r
 \r
        mreal persp;            ///< Original value for perspective\r
        mglMatrix Bp;           ///< Transformation matrix for View() and Zoom()\r
@@ -641,7 +658,7 @@ protected:
        long CurrPal;           ///< Current palette index\r
        mreal MarkSize;         ///< The size of marks for 1D plots.\r
        mreal ArrowSize;        ///< The size of arrows.\r
-       char last_style[64];///< Last pen style\r
+       char last_style[64];///< Last pen style TODO: replace by std::string\r
        mreal font_factor;      ///< Font scaling factor\r
 \r
        long dr_x, dr_y, dr_p;  ///< default drawing region for quality&4 mode\r
index 786afa48280bed78a6e38681dc82f7467a455a9a..2a23d2070fd4b9fde1f0e79352ab9c96484dc5fc 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * base_cf.h is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -222,6 +222,9 @@ void MGL_EXPORT mgl_copy_font_(uintptr_t *gr, uintptr_t *gr_from);
 /// Restore font (load default font for new HMGL objects)\r
 void MGL_EXPORT mgl_restore_font(HMGL gr);\r
 void MGL_EXPORT mgl_restore_font_(uintptr_t *gr);\r
+/// Add user-defined glyph for symbol and set its optional id\r
+void MGL_EXPORT mgl_define_symbol(HMGL gr, char id, HCDT x, HCDT y);\r
+void MGL_EXPORT mgl_define_symbol_(uintptr_t *gr, char *id, uintptr_t *x, uintptr_t *y,int);\r
 \r
 #ifdef __cplusplus\r
 }\r
index 924147ce0bb6c6748da354a13791b552555b2d29..3bb463b0a88efbf92a4e03bbc0313c828163e7cf 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * canvas.h is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -26,15 +26,18 @@ struct GifFileType;
 /// Structure for drawing axis and ticks\r
 struct MGL_EXPORT mglAxis\r
 {\r
-       mglAxis() : dv(0),ds(0),d(0),ns(0),     v0(0),v1(0),v2(0),o(NAN),       f(0),   ch(0),  pos('t'),sh(0),inv(false)       {}\r
-       mglAxis(const mglAxis &aa) : dv(aa.dv),ds(aa.ds),d(aa.d),ns(aa.ns),     t(aa.t),fact(aa.fact),stl(aa.stl),      dir(aa.dir),a(aa.a),b(aa.b),org(aa.org), v0(aa.v0),v1(aa.v1),v2(aa.v2),o(aa.o), f(aa.f),txt(aa.txt),    ch(aa.ch),      pos(aa.pos),sh(aa.sh),inv(aa.inv)       {}\r
+       mglAxis() : dv(0),ds(0),d(0),ns(0),     v0(0),v1(0),v2(0),o(NAN),       f(0),   ch(0),  pos('t'),sh(0),inv(false),angl(NAN)     {}\r
+       mglAxis(const mglAxis &aa) : dv(aa.dv),ds(aa.ds),d(aa.d),ns(aa.ns),     t(aa.t),fact(aa.fact),stl(aa.stl),      dir(aa.dir),a(aa.a),b(aa.b),org(aa.org), v0(aa.v0),v1(aa.v1),v2(aa.v2),o(aa.o), f(aa.f),txt(aa.txt),    ch(aa.ch),      pos(aa.pos),sh(aa.sh),inv(aa.inv),angl(aa.angl) {}\r
 #if MGL_HAVE_RVAL\r
-       mglAxis(mglAxis &&aa) : dv(aa.dv),ds(aa.ds),d(aa.d),ns(aa.ns),  t(aa.t),fact(aa.fact),stl(aa.stl),      dir(aa.dir),a(aa.a),b(aa.b),org(aa.org), v0(aa.v0),v1(aa.v1),v2(aa.v2),o(aa.o), f(aa.f),txt(aa.txt),    ch(aa.ch),      pos(aa.pos),sh(aa.sh),inv(aa.inv)       {}\r
+       mglAxis(mglAxis &&aa) : dv(aa.dv),ds(aa.ds),d(aa.d),ns(aa.ns),  t(aa.t),fact(aa.fact),stl(aa.stl),      dir(aa.dir),a(aa.a),b(aa.b),org(aa.org), v0(aa.v0),v1(aa.v1),v2(aa.v2),o(aa.o), f(aa.f),txt(aa.txt),    ch(aa.ch),      pos(aa.pos),sh(aa.sh),inv(aa.inv),angl(aa.angl) {}\r
 #endif\r
-       inline void AddLabel(const wchar_t *lbl, mreal v)\r
-       {       if(mgl_isfin(v))        txt.push_back(mglText(lbl,"",v));       }\r
+\r
+       const mglAxis &operator=(const mglAxis &aa)\r
+       {       dv=aa.dv; ds=aa.ds; d=aa.d; ns=aa.ns; t=aa.t; fact=aa.fact; stl=aa.stl;\r
+               dir=aa.dir; a=aa.a; b=aa.b; org=aa.org; v0=aa.v0; v1=aa.v1; v2=aa.v2; o=aa.o;\r
+               f=aa.f; txt=aa.txt;     ch=aa.ch; pos=aa.pos; sh=aa.sh; inv=aa.inv;     return aa;      }\r
        inline void AddLabel(const std::wstring &lbl, mreal v)\r
-       {       if(mgl_isfin(v))        txt.push_back(mglText(lbl,v));  }\r
+       {       if(mgl_isfin(v))        txt.push_back(mglText(L' '+lbl+L' ',v));        }\r
        inline void Clear()\r
        {       dv=ds=d=v0=v1=v2=sh=0;  o=NAN;  ns=f=0; pos = 't';      inv=false;\r
                fact.clear();   stl.clear();    t.clear();      txt.clear();    }\r
@@ -65,11 +68,14 @@ class mglCanvas;
 /// Structure for drawing region\r
 struct MGL_EXPORT mglDrawReg\r
 {\r
-       mglDrawReg() {}\r
+       mglDrawReg() {  memset(this,0,sizeof(mglDrawReg));      }\r
        mglDrawReg(const mglDrawReg &aa) : PDef(aa.PDef),angle(aa.angle),ObjId(aa.ObjId),PenWidth(aa.PenWidth),pPos(aa.pPos) ,x1(aa.x1),x2(aa.x2),y1(aa.y1),y2(aa.y2)   {}\r
 #if MGL_HAVE_RVAL\r
        mglDrawReg(mglDrawReg &&aa) : PDef(aa.PDef),angle(aa.angle),ObjId(aa.ObjId),PenWidth(aa.PenWidth),pPos(aa.pPos) ,x1(aa.x1),x2(aa.x2),y1(aa.y1),y2(aa.y2)        {}\r
 #endif\r
+       inline void copy(const mglPrim &p)\r
+       {       PDef = p.n3;    pPos = p.s;     ObjId = p.id;   PenWidth=p.w;   angle = p.angl;\r
+               if(p.type==2 || p.type==3) PDef = p.m;  }\r
        inline const mglDrawReg &operator=(const mglDrawReg &aa)\r
        {       memcpy(this,&aa,sizeof(mglDrawReg));    return aa;      }\r
        union\r
@@ -99,8 +105,11 @@ struct MGL_EXPORT mglDrawDat
        std::vector<mglBlock> Sub;      ///< InPlot regions\r
        std::vector<mglText> Ptx;       ///< Text labels for mglPrim\r
        std::vector<mglGlyph> Glf;      ///< Glyphs data\r
-       mglStack<mglTexture> Txt;       ///< Pointer to textures\r
+       std::vector<mglTexture> Txt;    ///< Pointer to textures\r
 };\r
+#if defined(_MSC_VER)\r
+template class MGL_EXPORT std::vector<mglDrawDat>;\r
+#endif\r
 //-----------------------------------------------------------------------------\r
 union mglRGBA  {       uint32_t c; unsigned char r[4]; };\r
 //-----------------------------------------------------------------------------\r
@@ -136,13 +145,15 @@ using mglBase::Light;
        /// Get PlotFactor\r
        inline mreal GetPlotFactor()    {       return B.pf;    }\r
        /// Pop transformation matrix from stack\r
-       inline void Pop()       {       B = stack.back(); stack.pop_back();     }\r
+       void Pop();\r
        /// Clear up the frame\r
        virtual void Clf(mglColor back=NC);\r
        virtual void Clf(const char *col);\r
 \r
        /// Put further plotting in cell of stick rotated on angles tet, phi\r
        void StickPlot(int num, int i, mreal tet, mreal phi);\r
+       /// Put further plotting in cell of stick sheared on sx, sy\r
+       void ShearPlot(int num, int i, mreal sx, mreal sy, mreal xd, mreal yd);\r
        /// Put further plotting in some region of whole frame surface.\r
        inline void InPlot(mreal x1,mreal x2,mreal y1,mreal y2,bool rel=true)\r
        {       InPlot(B,x1,x2,y1,y2,rel);      }\r
@@ -153,6 +164,8 @@ using mglBase::Light;
        void Title(const wchar_t *title,const char *stl="#",mreal size=-2);\r
        /// Set aspect ratio for further plotting.\r
        void Aspect(mreal Ax,mreal Ay,mreal Az);\r
+       /// Shear a further plotting.\r
+       void Shear(mreal Sx,mreal Sy);\r
        /// Rotate a further plotting.\r
        void Rotate(mreal TetX,mreal TetZ,mreal TetY=0);\r
        /// Rotate a further plotting around vector {x,y,z}.\r
@@ -160,6 +173,12 @@ using mglBase::Light;
        /// Set perspective (in range [0,1)) for plot. Set to zero for switching off. Return the current perspective.\r
        void Perspective(mreal a, bool req=true)\r
        {       if(req) persp = Bp.pf = a;      else    Bp.pf = persp?persp:fabs(a);    }\r
+       /// Save parameters of current inplot\r
+       inline void SaveInPlot()\r
+       {       sB=B;   sW=inW, sH=inH, sZ=ZMin, sX=inX, sY=inY, sFF=font_factor;       }\r
+       /// Use saved parameters as current inplot\r
+       inline void LoadInPlot()\r
+       {       B=sB;   inW=sW, inH=sH, ZMin=sZ, inX=sX, inY=sY, font_factor=sFF;       }\r
 \r
        /// Set size of frame in pixels. Normally this function is called internaly.\r
        virtual void SetSize(int w,int h,bool clf=true);\r
@@ -179,6 +198,9 @@ using mglBase::Light;
        int GetHeight() const   {       return Height;  }\r
        /// Combine plots from 2 canvases. Result will be saved into this.\r
        void Combine(const mglCanvas *gr);\r
+       /// Set boundary box for export graphics into 2D file formats\r
+       void SetBBox(int x1=0, int y1=0, int x2=-1, int y2=-1)\r
+       {       BBoxX1=x1;      BBoxY1=y1;      BBoxX2=x2;      BBoxY2=y2;      }\r
 \r
        /// Rasterize current plot and set it as background image\r
        void Rasterize();\r
@@ -199,7 +221,7 @@ using mglBase::Light;
        inline void SetObjId(long id)   {       ObjId = id;     }\r
        /// Get object id\r
        inline int GetObjId(long xs,long ys) const\r
-       {       register long i=xs+Width*ys;    return (i>=0 && i<Width*Height)?OI[i]:-1;       }\r
+       {       long i=xs+Width*ys;     return (i>=0 && i<Width*Height)?OI[i]:-1;       }\r
        /// Get subplot id\r
        int GetSplId(long xs,long ys) const MGL_FUNC_PURE;\r
        /// Check if there is active point or primitive (n=-1)\r
@@ -360,7 +382,7 @@ protected:
        int Depth;                      ///< Depth of the image\r
        mreal inW, inH;         ///< Width and height of last InPlot\r
        mreal inX, inY;         ///< Coordinates of last InPlot\r
-       mglLight light[10];     ///< Light sources      // TODO move to mglBlock\r
+       mglLight light[10];     ///< Light sources\r
        mreal FogDist;          ///< Inverse fog distance (fog ~ exp(-FogDist*Z))\r
        mreal FogDz;            ///< Relative shift of fog\r
 \r
@@ -369,7 +391,7 @@ protected:
        /// Prepare labels for ticks\r
        void LabelTicks(mglAxis &aa);\r
        /// Draw axis\r
-       void DrawAxis(mglAxis &aa, bool text=true, char arr=0,const char *stl="",mreal angl=NAN);\r
+       void DrawAxis(mglAxis &aa, int text=1, char arr=0,const char *stl="",mreal angl=NAN);\r
        /// Draw axis grid lines\r
        void DrawGrid(mglAxis &aa, bool at_tick=false);\r
        /// Update axis ranges\r
@@ -399,6 +421,7 @@ protected:
        void trig_plot(long p1, long p2, long p3);\r
        void quad_plot(long p1, long p2, long p3, long p4);\r
        void Glyph(mreal x, mreal y, mreal f, int style, long icode, mreal col);\r
+       void smbl_plot(long p1, char id, double size);\r
        mreal text_plot(long p,const wchar_t *text,const char *fnt,mreal size=-1,mreal sh=0,mreal  col=-('k'), bool rot=true);\r
 \r
        void add_prim(mglPrim &a);      ///< add primitive to list\r
@@ -411,8 +434,18 @@ protected:
        void arrow_draw(long n1, long n2, char st, float ll);\r
        void arrow_plot_3d(long n1, long n2, char st, float ll);\r
        void glyph_draw(const mglPrim &P, mglDrawReg *d);\r
+       void glyph_draw_new(const mglPrim &P, mglDrawReg *d);\r
        bool IsSame(const mglPrim &pr,mreal wp,mglColor cp,int st);\r
 \r
+       // check if visible\r
+       bool trig_vis(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3) const;\r
+       bool quad_vis(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3, const mglPnt &p4) const;\r
+\r
+       // functions for glyph drawing\r
+       virtual void glyph_fill(mreal phi, const mglPnt &p, mreal f, const mglGlyph &g, const mglDrawReg *d);\r
+       void glyph_wire(mreal phi, const mglPnt &p, mreal f, const mglGlyph &g, const mglDrawReg *d);\r
+       void glyph_line(mreal phi, const mglPnt &p, mreal f, bool solid, const mglDrawReg *d);\r
+\r
        // restore normalized coordinates from screen ones\r
        mglPoint RestorePnt(mglPoint ps, bool norm=false) const MGL_FUNC_PURE;\r
 \r
@@ -435,6 +468,9 @@ private:
     mglCanvas(const mglCanvas &){}     // copying is not allowed\r
        const mglCanvas &operator=(const mglCanvas &t){return t;}       // copying is not allowed\r
 \r
+       mglMatrix sB;   // parameters of saved inplot\r
+       mreal sW, sH, sZ, sX, sY, sFF;\r
+\r
        uint32_t *pnt_col;\r
 //     mreal _tetx,_tety,_tetz;                // extra angles\r
        std::vector<mglMatrix> stack;   ///< stack for transformation matrices\r
@@ -468,11 +504,6 @@ private:
        /// Set coordinate and add the point, return its id\r
        long setPp(mglPnt &q, const mglPoint &p);\r
 \r
-       // functions for glyph drawing\r
-       void glyph_fill(const mglMatrix *M, const mglPnt &p, mreal f, const mglGlyph &g, const mglDrawReg *d);\r
-       void glyph_wire(const mglMatrix *M, const mglPnt &p, mreal f, const mglGlyph &g, const mglDrawReg *d);\r
-       void glyph_line(const mglMatrix *M, const mglPnt &p, mreal f, bool solid, const mglDrawReg *d);\r
-\r
        // fill pixel for given primitive\r
        void mark_pix(long i,long j,const mglPnt &p, char type, mreal size, mglDrawReg *d);\r
        void arrow_pix(long i,long j,const mglPnt &p1, const mglPnt &p2, char st, mreal size, const mglDrawReg *d);\r
@@ -497,4 +528,11 @@ struct mglThreadG
 /// Start several thread for the task\r
 void mglStartThread(void (mglCanvas::*func)(long i, long n), mglCanvas *gr, long n);\r
 //-----------------------------------------------------------------------------\r
+inline mreal get_persp(float pf, float z, float Depth)\r
+//{    return (1-pf)/(1-pf*z/Depth);   }\r
+{      return (1-pf/1.37)/(1-pf*z/Depth);      }\r
+inline mreal get_pfact(float pf, float Depth)\r
+//{    return pf/(1-pf)/Depth; }\r
+{      return pf/(1-pf/1.37)/Depth;    }\r
+//-----------------------------------------------------------------------------\r
 #endif\r
index e648164e1110bef267d6b92c2b7f7b25676bd5f7..7dcec571e2fae9aaf91b8290c427cbb82af82d18 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * canvas_cf.h is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -52,6 +52,11 @@ void MGL_EXPORT mgl_finish_(uintptr_t *gr);
 /// Force preparing the image and save result into background one.\r
 void MGL_EXPORT mgl_rasterize(HMGL gr);\r
 void MGL_EXPORT mgl_rasterize_(uintptr_t *gr);\r
+/// Set boundary box for export graphics into 2D file formats.\r
+/** If x2<0 (y2<0) then full width (height) will be used.\r
+ *  If x1<0 or y1<0 or x1>=x2|Width or y1>=y2|Height then cropping will be disabled. */\r
+void MGL_EXPORT mgl_set_bbox(HMGL gr, int x1, int y1, int x2, int y2);\r
+void MGL_EXPORT mgl_set_bbox_(uintptr_t *gr, int *x1, int *y1, int *x2, int *y2);\r
 \r
 /// Set the size of semi-transparent area around lines, marks, glyphs, ... Default is 1.\r
 void MGL_EXPORT mgl_pen_delta(HMGL gr, double d);\r
@@ -388,6 +393,9 @@ void MGL_EXPORT mgl_set_transp_type_(uintptr_t *gr, int *kind);
 /// Set the transparency on/off.\r
 void MGL_EXPORT mgl_set_alpha(HMGL gr, int enable);\r
 void MGL_EXPORT mgl_set_alpha_(uintptr_t *gr, int *enable);\r
+/// Set the gray-scale mode on/off.\r
+void MGL_EXPORT mgl_set_gray(HMGL gr, int enable);\r
+void MGL_EXPORT mgl_set_gray_(uintptr_t *gr, int *enable);\r
 /// Set the fog distance or switch it off (if d=0).\r
 void MGL_EXPORT mgl_set_fog(HMGL gr, double d, double dz);\r
 void MGL_EXPORT mgl_set_fog_(uintptr_t *gr, mreal *dist, mreal *dz);\r
@@ -464,6 +472,15 @@ void MGL_EXPORT mgl_subplot_d_(uintptr_t *gr, int *nx,int *ny,int *m, mreal *dx,
  *  '#' for using whole region. */\r
 void MGL_EXPORT mgl_multiplot(HMGL gr, int nx,int ny,int m,int dx,int dy,const char *style);\r
 void MGL_EXPORT mgl_multiplot_(uintptr_t *gr, int *nx,int *ny,int *m,int *dx,int *dy, const char *s,int);\r
+/// Put further plotting in rectangle of dx*dy cells starting from m-th cell of nx*ny grid of the image and shift it by distance {sx,sy}..\r
+/** String \a style may contain:\r
+ *  '<' for reserving space at left\r
+ *  '>' for reserving space at right\r
+ *  '^' for reserving space at top\r
+ *  '_' for reserving space at bottom\r
+ *  '#' for using whole region. */\r
+void MGL_EXPORT mgl_multiplot_d(HMGL gr, int nx,int ny,int m,int dx,int dy,const char *style,double sx,double sy);\r
+void MGL_EXPORT mgl_multiplot_d_(uintptr_t *gr, int *nx,int *ny,int *m,int *dx,int *dy, const char *s, mreal *sx, mreal *sy,int);\r
 /// Put further plotting in a region [x1,x2]*[y1,y2] of the image (x1,x2,y1,y2 in range [0, 1]).\r
 void MGL_EXPORT mgl_inplot(HMGL gr, double x1,double x2,double y1,double y2);\r
 void MGL_EXPORT mgl_inplot_(uintptr_t *gr, mreal *x1, mreal *x2, mreal *y1, mreal *y2);\r
@@ -479,6 +496,9 @@ void MGL_EXPORT mgl_gridplot_(uintptr_t *gr, int *nx, int *ny, int *m, mreal *d)
 /// Put further plotting in cell of stick rotated on angles tet, phi.\r
 void MGL_EXPORT mgl_stickplot(HMGL gr, int num, int ind, double tet, double phi);\r
 void MGL_EXPORT mgl_stickplot_(uintptr_t *gr, int *num, int *i, mreal *tet, mreal *phi);\r
+/// Put further plotting in cell of stick sheared on sx, sy.\r
+void MGL_EXPORT mgl_shearplot(HMGL gr, int num, int ind, double sx, double sy, double xd, double yd);\r
+void MGL_EXPORT mgl_shearplot_(uintptr_t *gr, int *num, int *i, mreal *sy, mreal *sx, mreal *xd, mreal *yd);\r
 /// Add title for current subplot/inplot.\r
 /** Style '#' draw box around the title. */\r
 void MGL_EXPORT mgl_title(HMGL gr, const char *title, const char *stl, double size);\r
@@ -491,6 +511,9 @@ void MGL_EXPORT mgl_set_plotfactor_(uintptr_t *gr, mreal *val);
 /// Set aspect ratio for further plotting.\r
 void MGL_EXPORT mgl_aspect(HMGL gr, double Ax,double Ay,double Az);\r
 void MGL_EXPORT mgl_aspect_(uintptr_t *gr, mreal *Ax, mreal *Ay, mreal *Az);\r
+/// Set aspect ratio for further plotting.\r
+void MGL_EXPORT mgl_shear(HMGL gr, double Sx,double Sz);\r
+void MGL_EXPORT mgl_shear_(uintptr_t *gr, mreal *Sx, mreal *Sy);\r
 /// Rotate a further plotting.\r
 void MGL_EXPORT mgl_rotate(HMGL gr, double TetX,double TetZ,double TetY);\r
 void MGL_EXPORT mgl_rotate_(uintptr_t *gr, mreal *TetX, mreal *TetZ, mreal *TetY);\r
@@ -598,6 +621,14 @@ uintptr_t MGL_EXPORT mgl_parser_get_var_(uintptr_t* p, unsigned long *id);
 long MGL_EXPORT mgl_parser_num_var(HMPR p);\r
 long MGL_EXPORT mgl_parser_num_var_(uintptr_t* p);\r
 \r
+/// Get constant with given id\r
+/// NOTE !!! You must not delete obtained data arrays !!!\r
+MGL_EXPORT mglNum *mgl_parser_get_const(HMPR p, unsigned long id);\r
+uintptr_t MGL_EXPORT mgl_parser_get_const_(uintptr_t* p, unsigned long *id);\r
+/// Get number of constants\r
+long MGL_EXPORT mgl_parser_num_const(HMPR p);\r
+long MGL_EXPORT mgl_parser_num_const_(uintptr_t* p);\r
+\r
 /// Delete variable with name\r
 void MGL_EXPORT mgl_parser_del_var(HMPR p, const char *name);\r
 void MGL_EXPORT mgl_parser_del_var_(uintptr_t* p, const char *name, int);\r
@@ -615,6 +646,10 @@ void MGL_EXPORT mgl_rk_step(HMPR pr, const char *eqs, const char *vars, mreal dt
 void MGL_EXPORT mgl_rk_step_w(HMPR pr, const wchar_t *eqs, const wchar_t *vars, mreal dt);\r
 void MGL_EXPORT mgl_rk_step_(uintptr_t *p, const char *eqs, const char *vars, double *dt, int,int);\r
 \r
+// Open all data arrays from HDF file and assign it as variables of parser p\r
+void MGL_EXPORT mgl_parser_openhdf(HMPR p, const char *fname);\r
+void MGL_EXPORT mgl_parser_openhdf_(uintptr_t *p, const char *fname,int l);\r
+\r
 /// Parse and draw single line of the MGL script\r
 int MGL_EXPORT mgl_parse_line(HMGL gr, HMPR p, const char *str, int pos);\r
 int MGL_EXPORT mgl_parse_line_(uintptr_t* gr, uintptr_t* p, const char *str, int *pos, int);\r
@@ -641,6 +676,13 @@ void MGL_EXPORT mgl_parser_allow_dll_call_(uintptr_t* p, int *a);
 /// Set flag to stop script parsing\r
 void MGL_EXPORT mgl_parser_stop(HMPR p);\r
 void MGL_EXPORT mgl_parser_stop_(uintptr_t* p);\r
+/// Set variant of argument(s) separated by '?' to be used\r
+void MGL_EXPORT mgl_parser_variant(HMPR p, int var);\r
+void MGL_EXPORT mgl_parser_variant_(uintptr_t* p, int *var);\r
+/// Set starting object ID\r
+void MGL_EXPORT mgl_parser_start_id(HMPR p, int id);\r
+void MGL_EXPORT mgl_parser_start_id_(uintptr_t* p, int *id);\r
+\r
 \r
 /// Return type of command: 0 - not found, 1 - data plot, 2 - other plot,\r
 ///            3 - setup, 4 - data handle, 5 - data create, 6 - subplot, 7 - program\r
@@ -652,7 +694,7 @@ int MGL_EXPORT mgl_parser_cmd_type_(uintptr_t* p, const char *name, int);
 MGL_EXPORT const char *mgl_parser_cmd_desc(HMPR pr, const char *name);\r
 /// Return string of command format (command name and its argument[s])\r
 MGL_EXPORT const char *mgl_parser_cmd_frmt(HMPR pr, const char *name);\r
-/// Get name of command with nmber n\r
+/// Get name of command with number n\r
 MGL_EXPORT const char *mgl_parser_cmd_name(HMPR pr, long id);\r
 /// Get number of defined commands\r
 long MGL_EXPORT mgl_parser_cmd_num(HMPR pr);\r
index b157d6dbe75bbb53f2f023afdd466950b011b01d..19091edaccadcdbef3c166c260e62167a587be40 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * canvas_wnd.h is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
index a0367df30acca1300d84812027f4261037450e9d..6f52224fbab54b88913160bdf446adf29ec543ae 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * cont.h is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -123,6 +123,20 @@ void MGL_EXPORT mgl_contv_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr
 void MGL_EXPORT mgl_contv(HMGL gr, HCDT z, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_contv_(uintptr_t *gr, uintptr_t *z, const char *sch, const char *opt,int,int);\r
 \r
+\r
+/// Draw contour lines on parametric surface at manual levels for 2d data specified parametrically\r
+/** Style ‘f’ to draw solid contours.\r
+ * Style ‘t’/‘T’ draw contour labels below/above contours. */\r
+void MGL_EXPORT mgl_contp_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, const char *opt);\r
+void MGL_EXPORT mgl_contp_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, const char *opt,int,int);\r
+/// Draw contour lines on parametric surface for 2d data specified parametrically\r
+/** Style ‘f’ to draw solid contours.\r
+ * Style ‘t’/‘T’ draw contour labels below/above contours.\r
+ * Option "value" set the number of contour levels (default is 7). */\r
+void MGL_EXPORT mgl_contp(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, const char *opt);\r
+void MGL_EXPORT mgl_contp_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, const char *opt,int,int);\r
+\r
+\r
 /// Draw axial-symmetric isosurfaces at manual levels for 2d data specified parametrically\r
 /** String \a sch may contain:\r
  * ‘#’ for wired plot;\r
index 834ca26b0d87fc938bcef49a9ab1100d93e0ed40..e0d496f4754e432e9c2f2ba0191a9674136b331e 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * data.h is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -23,8 +23,6 @@
 #include "mgl2/data_cf.h"\r
 #include "mgl2/pde.h"\r
 //-----------------------------------------------------------------------------\r
-#include <vector>\r
-#include <string>\r
 #include <stdarg.h>\r
 //-----------------------------------------------------------------------------\r
 mreal MGL_EXPORT mglLinear(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z);\r
@@ -135,9 +133,9 @@ using mglDataA::Momentum;
        {       if(d.size()>0)  {       Create(d.size());       for(long i=0;i<nx;i++)  a[i] = d[i];    }\r
                else    Create(1);      }\r
        inline void Set(const std::vector<float> &d)\r
-       {       if(d.size()>0)  Set(&(a[0]),d.size());  else    Create(1);      }\r
+       {       if(d.size()>0)  Set(&(d[0]),d.size());  else    Create(1);      }\r
        inline void Set(const std::vector<double> &d)\r
-       {       if(d.size()>0)  Set(&(a[0]),d.size());  else    Create(1);      }\r
+       {       if(d.size()>0)  Set(&(d[0]),d.size());  else    Create(1);      }\r
        /// Allocate memory and set data from variable argument list of double values\r
        inline void SetList(long n, ...)\r
        {\r
@@ -145,6 +143,7 @@ using mglDataA::Momentum;
                mgl_data_create(this,n,1,1);\r
                va_list vl;     va_start(vl,n);\r
                for(long i=0;i<n;i++)   a[i] = va_arg(vl,double);\r
+               va_end(vl);\r
        }\r
 \r
        /// Create or recreate the array with specified size and fill it by zero\r
@@ -165,15 +164,18 @@ using mglDataA::Momentum;
        /// Crop the data\r
        inline void Crop(long n1, long n2,char dir='x')\r
        {       mgl_data_crop(this,n1,n2,dir);  }\r
+       /// Crop the data to be most optimal for FFT (i.e. to closest value of 2^n*3^m*5^l)\r
+       inline void Crop(const char *how="235x")\r
+       {       mgl_data_crop_opt(this, how);   }\r
        /// Insert data rows/columns/slices\r
        inline void Insert(char dir, long at=0, long num=1)\r
        {       mgl_data_insert(this,dir,at,num);       }\r
        /// Delete data rows/columns/slices\r
        inline void Delete(char dir, long at=0, long num=1)\r
        {       mgl_data_delete(this,dir,at,num);       }\r
-       /// Remove rows with duplicate values in column id\r
-       inline void Clean(long id)\r
-       {       mgl_data_clean(this,id);        }\r
+       /// Remove rows with duplicate values in column clmn\r
+       inline void Clean(long clmn)\r
+       {       mgl_data_clean(this,clmn);      }\r
        /// Join with another data array\r
        inline void Join(const mglDataA &d)\r
        {       mgl_data_join(this,&d); }\r
@@ -278,6 +280,13 @@ using mglDataA::Momentum;
        {       return mglData(true,mgl_data_subdata_ext(this,&xx,&yy,0));      }\r
        inline mglData SubData(const mglDataA &xx) const\r
        {       return mglData(true,mgl_data_subdata_ext(this,&xx,0,0));        }\r
+       /// Get data from sections ids, separated by value val along specified direction.\r
+       /** If section id is negative then reverse order is used (i.e. -1 give last section). */\r
+       inline mglData Section(const mglDataA &ids, char dir='y', mreal val=NAN) const\r
+       {       return mglData(true,mgl_data_section(this,&ids,dir,val));       }\r
+       inline mglData Section(long id, char dir='y', mreal val=NAN) const\r
+       {       return mglData(true,mgl_data_section_val(this,id,dir,val));     }\r
+\r
        /// Get trace of the data array\r
        inline mglData Trace() const\r
        {       return mglData(true,mgl_data_trace(this));      }\r
@@ -310,14 +319,19 @@ using mglDataA::Momentum;
        inline mglData Evaluate(const mglData &idat, const mglData &jdat, const mglData &kdat, bool norm=true) const\r
        {       return mglData(true,mgl_data_evaluate(this,&idat,&jdat,&kdat,norm));    }\r
        /// Find roots for set of nonlinear equations defined by textual formula\r
-       inline mglData Roots(const char *func, char var='x') const\r
-       {       return mglData(true,mgl_data_roots(func, this, var));   }\r
+       inline mglData Roots(const char *eq, char var='x') const\r
+       {       return mglData(true,mgl_data_roots(eq, this, var));     }\r
        /// Find correlation with another data arrays\r
        inline mglData Correl(const mglDataA &dat, const char *dir) const\r
        {       return mglData(true,mgl_data_correl(this,&dat,dir));    }\r
        /// Find auto correlation function\r
        inline mglData AutoCorrel(const char *dir) const\r
        {       return mglData(true,mgl_data_correl(this,this,dir));    }\r
+       /// Get curves, separated by NAN, for maximal values of array d as function of x coordinate.\r
+       /** Noises below lvl amplitude are ignored.\r
+        * Parameter dy \in [0,ny] set the "attraction" distance of points to curve. */\r
+       inline mglData Detect(mreal lvl, mreal dj, mreal di=0, mreal min_len=0) const\r
+       {       return mglData(true,mgl_data_detect(this,lvl,dj,di,min_len));   }\r
 \r
        /// Cumulative summation the data in given direction or directions\r
        inline void CumSum(const char *dir)     {       mgl_data_cumsum(this,dir);      }\r
@@ -325,6 +339,9 @@ using mglDataA::Momentum;
        inline void Integral(const char *dir)   {       mgl_data_integral(this,dir);    }\r
        /// Differentiate the data in given direction or directions\r
        inline void Diff(const char *dir)       {       mgl_data_diff(this,dir);        }\r
+       /// Differentiate the parametrically specified data along direction v1\r
+       inline void Diff(const mglDataA &v1)\r
+       {       mgl_data_diff_par(this,&v1,0,0);        }\r
        /// Differentiate the parametrically specified data along direction v1 with v2=const\r
        inline void Diff(const mglDataA &v1, const mglDataA &v2)\r
        {       mgl_data_diff_par(this,&v1,&v2,0);      }\r
@@ -342,6 +359,12 @@ using mglDataA::Momentum;
        inline void Mirror(const char *dir)             {       mgl_data_mirror(this,dir);      }\r
        /// Sort rows (or slices) by values of specified column\r
        inline void Sort(long idx, long idy=-1) {       mgl_data_sort(this,idx,idy);    }\r
+       /// Return dilated array of 0 or 1 for data values larger val\r
+       inline void Dilate(mreal val=1, long step=1)\r
+       {       mgl_data_dilate(this, val, step);       }\r
+       /// Return eroded array of 0 or 1 for data values larger val\r
+       inline void Erode(mreal val=1, long step=1)\r
+       {       mgl_data_erode(this, val, step);        }\r
 \r
        /// Set as the data envelop\r
        inline void Envelop(char dir='x')\r
@@ -364,6 +387,9 @@ using mglDataA::Momentum;
        /// Normalize the data to range [v1,v2] slice by slice\r
        inline void NormSl(mreal v1=0,mreal v2=1,char dir='z',bool keep_en=true,bool sym=false)\r
        {       mgl_data_norm_slice(this,v1,v2,dir,keep_en,sym);        }\r
+       /// Limit the data to be inside [-v,v], keeping the original sign\r
+       inline void Limit(mreal v)\r
+       {       mgl_data_limit(this, v);        }\r
 \r
        /// Apply Hankel transform\r
        inline void Hankel(const char *dir)     {       mgl_data_hankel(this,dir);      }\r
@@ -371,7 +397,12 @@ using mglDataA::Momentum;
        inline void SinFFT(const char *dir)     {       mgl_data_sinfft(this,dir);      }\r
        /// Apply Cos-Fourier transform\r
        inline void CosFFT(const char *dir)     {       mgl_data_cosfft(this,dir);      }\r
-       /// Fill data by 'x'/'k' samples for Hankel ('h') or Fourier ('f') transform\r
+       /// Fill data by coordinates/momenta samples for Hankel ('h') or Fourier ('f') transform\r
+       /** Parameter \a how may contain:\r
+        * ‘x‘,‘y‘,‘z‘ for direction (only one will be used),\r
+        * ‘k‘ for momenta samples,\r
+        * ‘h‘ for Hankel samples,\r
+        * ‘f‘ for Cartesian/Fourier samples (default). */\r
        inline void FillSample(const char *how)\r
        {       mgl_data_fill_sample(this,how); }\r
        /// Apply wavelet transform\r
@@ -392,34 +423,6 @@ using mglDataA::Momentum;
        inline mglData Solve(mreal val, char dir, const mglData &i0, bool norm=true) const\r
        {       return mglData(true,mgl_data_solve(this, val, dir, &i0, norm)); }\r
 \r
-       /// Interpolate by cubic spline the data to given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1]\r
-       inline mreal Spline(mreal x,mreal y=0,mreal z=0) const\r
-       {       return value(x,y,z);    }\r
-       /// Interpolate by cubic spline the data to given point x,\a y,\a z which normalized in range [0, 1]\r
-       inline mreal Spline1(mreal x,mreal y=0,mreal z=0) const\r
-       {       return value(x*(nx-1),y*(ny-1),z*(nz-1));       }\r
-       /// Interpolate by linear function the data to given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1]\r
-       inline mreal Linear(mreal x,mreal y=0,mreal z=0)        const\r
-       {       return mgl_data_linear_ext(this,x,y,z,0,0,0);   }\r
-       /// Interpolate by line the data to given point x,\a y,\a z which normalized in range [0, 1]\r
-       inline mreal Linear1(mreal x,mreal y=0,mreal z=0) const\r
-       {       return mgl_data_linear_ext(this,x*(nx-1),y*(ny-1),z*(nz-1),0,0,0);      }\r
-\r
-       /// Interpolate by cubic spline the data and return its derivatives at given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1]\r
-       inline mreal Spline(mglPoint &dif, mreal x,mreal y=0,mreal z=0) const\r
-       {       return valueD(x,y,z, &(dif.x),&(dif.y), &(dif.z));      }\r
-       /// Interpolate by cubic spline the data and return its derivatives at given point x,\a y,\a z which normalized in range [0, 1]\r
-       inline mreal Spline1(mglPoint &dif, mreal x,mreal y=0,mreal z=0) const\r
-       {       mreal res=valueD(x*(nx-1),y*(ny-1),z*(nz-1), &(dif.x),&(dif.y), &(dif.z));\r
-               dif.x*=nx>1?nx-1:1;     dif.y*=ny>1?ny-1:1;     dif.z*=nz>1?nz-1:1;     return res;     }\r
-       /// Interpolate by linear function the data and return its derivatives at given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1]\r
-       inline mreal Linear(mglPoint &dif, mreal x,mreal y=0,mreal z=0) const\r
-       {       return mgl_data_linear_ext(this,x,y,z, &(dif.x),&(dif.y), &(dif.z));    }\r
-       /// Interpolate by line the data and return its derivatives at given point x,\a y,\a z which normalized in range [0, 1]\r
-       inline mreal Linear1(mglPoint &dif, mreal x,mreal y=0,mreal z=0) const\r
-       {       mreal res=mgl_data_linear_ext(this,x*(nx-1),y*(ny-1),z*(nz-1), &(dif.x),&(dif.y), &(dif.z));\r
-               dif.x*=nx>1?nx-1:1;     dif.y*=ny>1?ny-1:1;     dif.z*=nz>1?nz-1:1;     return res;     }\r
-\r
        /// Copy data from other mglData variable\r
        inline const mglDataA &operator=(const mglDataA &d)\r
        {       if(this!=&d)    mgl_data_set(this,&d);  return d;       }\r
@@ -469,13 +472,13 @@ using mglDataA::Momentum;
        mreal vthr(long i) const {      return a[i];    }\r
        // add for speeding up !!!\r
        mreal dvx(long i,long j=0,long k=0) const\r
-       {   register long i0=i+nx*(j+ny*k);\r
+       {   long i0=i+nx*(j+ny*k);\r
                return i>0? (i<nx-1? (a[i0+1]-a[i0-1])/2:a[i0]-a[i0-1]) : a[i0+1]-a[i0];        }\r
        mreal dvy(long i,long j=0,long k=0) const\r
-       {   register long i0=i+nx*(j+ny*k);\r
+       {   long i0=i+nx*(j+ny*k);\r
                return j>0? (j<ny-1? (a[i0+nx]-a[i0-nx])/2:a[i0]-a[i0-nx]) : a[i0+nx]-a[i0];}\r
        mreal dvz(long i,long j=0,long k=0) const\r
-       {   register long i0=i+nx*(j+ny*k), n=nx*ny;\r
+       {   long i0=i+nx*(j+ny*k), n=nx*ny;\r
                return k>0? (k<nz-1? (a[i0+n]-a[i0-n])/2:a[i0]-a[i0-n]) : a[i0+n]-a[i0];        }\r
 };\r
 //-----------------------------------------------------------------------------\r
@@ -539,9 +542,19 @@ inline mglData mglQO3d(const char *ham, const mglDataA &ini_re, const mglDataA &
 /// Finds ray with starting point r0, p0 (and prepares ray data for mglQO2d)\r
 inline mglData mglRay(const char *ham, mglPoint r0, mglPoint p0, mreal dt=0.1, mreal tmax=10)\r
 {      return mglData(true, mgl_ray_trace(ham, r0.x, r0.y, r0.z, p0.x, p0.y, p0.z, dt, tmax)); }\r
-/// Saves result of ODE solving (|u|^2) for "Hamiltonian" ham with initial conditions ini\r
-inline mglData mglODE(const char *df, const char *var, const mglDataA &ini, mreal dt=0.1, mreal tmax=10)\r
-{      return mglData(true, mgl_ode_solve_str(df,var, &ini, dt, tmax));        }\r
+/// Saves result of ODE solving for var complex variables with right part func (separated by ';') and initial conditions x0 over time interval [0,tmax] with time step dt\r
+inline mglData mglODE(const char *func, const char *var, const mglDataA &ini, mreal dt=0.1, mreal tmax=10)\r
+{      return mglData(true, mgl_ode_solve_str(func,var, &ini, dt, tmax));      }\r
+//-----------------------------------------------------------------------------\r
+/// Get array as solution of tridiagonal system of equations a[i]*x[i-1]+b[i]*x[i]+c[i]*x[i+1]=d[i]\r
+/** String \a how may contain:\r
+ * 'x', 'y', 'z' for solving along x-,y-,z-directions, or\r
+ * 'h' for solving along hexagonal direction at x-y plain (need nx=ny),\r
+ * 'c' for using periodical boundary conditions,\r
+ * 'd' for diffraction/diffuse calculation. */\r
+inline mglData mglTridMat(const mglDataA &A, const mglDataA &B, const mglDataA &C, const mglDataA &D, const char *how)\r
+{      return mglData(true, mgl_data_tridmat(&A, &B, &C, &D, how));    }\r
+//-----------------------------------------------------------------------------\r
 /// Calculate Jacobian determinant for D{x(u,v), y(u,v)} = dx/du*dy/dv-dx/dv*dy/du\r
 inline mglData mglJacobian(const mglDataA &x, const mglDataA &y)\r
 {      return mglData(true, mgl_jacobian_2d(&x, &y));  }\r
@@ -553,12 +566,27 @@ inline mglData mglTriangulation(const mglDataA &x, const mglDataA &y, const mglD
 {      return mglData(true,mgl_triangulation_3d(&x,&y,&z));    }\r
 inline mglData mglTriangulation(const mglDataA &x, const mglDataA &y)\r
 {      return mglData(true,mgl_triangulation_2d(&x,&y));       }\r
+/// Get curves, separated by NAN, for maximal values of array d as function of x coordinate.\r
+/** Noises below lvl amplitude are ignored.\r
+ * Parameter dy \in [0,ny] set the "attraction" distance of points to curve. */\r
+inline mglData mglDetect(const mglDataA &d, mreal lvl, mreal dj, mreal di=0, mreal min_len=0)\r
+{      return mglData(true,mgl_data_detect(&d, lvl, dj, di, min_len)); }\r
+//-----------------------------------------------------------------------------\r
 /// Get array which is n-th pairs {x[i],y[i]} for iterated function system (fractal) generated by A\r
 inline mglData mglIFS2d(const mglDataA &A, long n, long skip=20)\r
 {      return mglData(true,mgl_data_ifs_2d(&A,n,skip));        }\r
 /// Get array which is n-th points {x[i],y[i],z[i]} for iterated function system (fractal) generated by A\r
 inline mglData mglIFS3d(const mglDataA &A, long n, long skip=20)\r
 {      return mglData(true,mgl_data_ifs_3d(&A,n,skip));        }\r
+/// Get array which is n-th points {x[i],y[i],z[i]} for iterated function system (fractal) defined in *.ifs file 'fname' and named as 'name'\r
+inline mglData mglIFSfile(const char *fname, const char *name, long n, long skip=20)\r
+{      return mglData(true,mgl_data_ifs_file(fname,name,n,skip));      }\r
+/// Get array which is n-th pairs {x[i],y[i]} for Flame fractal generated by A with functions F\r
+/** NOTE: A.nx must be >= 7 and F.nx >= 2 and F.nz=A.ny.\r
+ * F[0,i,j] denote function id. F[1,i,j] give function weight, F(2:5,i,j) provide function parameters.\r
+ * Resulting point is {xnew,ynew} = sum_i F[1,i,j]*F[0,i,j]{IFS2d(A[j]){x,y}}. */\r
+inline mglData mglFlame2d(const mglDataA &A, const mglDataA &F, long n, long skip=20)\r
+{      return mglData(true,mgl_data_flame_2d(&A,&F,n,skip));   }\r
 //-----------------------------------------------------------------------------\r
 /// Get sub-array of the data with given fixed indexes\r
 inline mglData mglSubData(const mglDataA &dat, long xx, long yy=-1, long zz=-1)\r
@@ -605,7 +633,7 @@ public:
 #endif\r
 };\r
 //-----------------------------------------------------------------------------\r
-/// Class which present variable as data array\r
+/// Class which present equidistantly distributed data\r
 class MGL_EXPORT mglDataV : public mglDataA\r
 {\r
        long nx;        ///< number of points in 1st dimensions ('x' dimension)\r
@@ -663,7 +691,7 @@ public:
        mreal value(mreal x,mreal y=0,mreal z=0) const  {       return a0+di*x+dj*y+dk*z;       }\r
        mreal v(long i,long j=0,long k=0) const         {       return a0+di*i+dj*j+dk*k;       }\r
        mreal vthr(long ii) const\r
-       {       register long i=ii%nx, j=(ii/nx)%ny, k=ii/(nx*ny);      return a0+di*i+dj*j+dk*k;       }\r
+       {       long i=ii%nx, j=(ii/nx)%ny, k=ii/(nx*ny);       return a0+di*i+dj*j+dk*k;       }\r
        // add for speeding up !!!\r
        mreal dvx(long ,long =0,long =0) const  {       return di;      }\r
        mreal dvy(long ,long =0,long =0) const  {       return dj;      }\r
@@ -724,7 +752,7 @@ public:
        mreal v(long i,long j=0,long k=0) const\r
        {       return di*(i<nx/2?i:i-nx)+dj*(j<ny/2?j:j-ny)+dk*(k<nz/2?k:k-nz);        }\r
        mreal vthr(long ii) const\r
-       {       register long i=ii%nx, j=(ii/nx)%ny, k=ii/(nx*ny);\r
+       {       long i=ii%nx, j=(ii/nx)%ny, k=ii/(nx*ny);\r
                return di*(i<nx/2?i:i-nx)+dj*(j<ny/2?j:j-ny)+dk*(k<nz/2?k:k-nz);        }\r
        // add for speeding up !!!\r
        mreal dvx(long ,long =0,long =0) const  {       return di;      }\r
@@ -732,7 +760,7 @@ public:
        mreal dvz(long ,long =0,long =0) const  {       return dk;      }\r
 };\r
 //-----------------------------------------------------------------------------\r
-/// Class which present variable as data array\r
+/// Class which present function as data array\r
 class MGL_EXPORT mglDataF : public mglDataA\r
 {\r
        long nx;        ///< number of points in 1st dimensions ('x' dimension)\r
@@ -785,7 +813,9 @@ public:
        mreal valueD(mreal i,mreal j=0,mreal k=0, mreal *di=0,mreal *dj=0,mreal *dk=0) const\r
        {\r
                mreal res=0, x=v1.x+dx*i, y=v1.y+dy*j, z=v1.z+dz*k;\r
-               if(di)  *di = 0;        if(dj)  *dj = 0;        if(dk)  *dk = 0;\r
+               if(di)  *di = 0;\r
+               if(dj)  *dj = 0;\r
+               if(dk)  *dk = 0;\r
                if(dfunc)\r
                {\r
                        res = dfunc(x,y,z, par);\r
@@ -812,7 +842,7 @@ public:
        }\r
        /// Copy data from other mglDataV variable\r
        inline const mglDataF &operator=(const mglDataF &d)\r
-       {       nx=d.nx;        ny=d.ny;        nz=d.nz;        v1=d.v1;        v2=d.v2;        setD();\r
+       {       nx=d.nx;        ny=d.ny;        nz=d.nz;        v1=d.v1;        v2=d.v2;        setD(); mgl_delete_expr(ex);\r
                str=d.str;      ex = mgl_create_expr(str.c_str());      dfunc=d.dfunc;  par=d.par;      return d;       }\r
        /// Get the value in given cell of the data without border checking\r
        mreal v(long i,long j=0,long k=0) const\r
@@ -853,14 +883,16 @@ public:
        }\r
 };\r
 //-----------------------------------------------------------------------------\r
-/// Class which present variable as data array\r
+/// Class which present column of another data as data array\r
 class MGL_EXPORT mglDataT : public mglDataA\r
 {\r
        const mglDataA &dat;\r
        long ind;\r
+       const mglDataT &operator=(const mglDataT &d)    {       return d;       }\r
 public:\r
        mglDataT(const mglDataT &d) : dat(d.dat), ind(d.ind)    {       s = d.s;        }\r
        mglDataT(const mglDataA &d, long col=0) : dat(d), ind(col)      {}\r
+       mglDataT(HCDT d, long col=0) : dat(*d), ind(col)        {}\r
 #if MGL_HAVE_RVAL\r
        mglDataT(mglDataT &&d):dat(d.dat),ind(d.ind)\r
        {       s=d.s;  temp=d.temp;    func=d.func;    o=d.o;  d.func=0;       }\r
@@ -882,10 +914,10 @@ public:
        {       ind = i;        s = name;       }\r
 \r
        /// Get the interpolated value and its derivatives in given data cell without border checking\r
-       mreal valueD(mreal x,mreal y=0,mreal z=0,mreal *dx=0,mreal *dy=0,mreal *dz=0) const\r
+       mreal valueD(mreal x,mreal y=0,mreal =0,mreal *dx=0,mreal *dy=0,mreal *dz=0) const\r
        {       if(dz)  *dz=0;  return dat.valueD(ind,x,y,0,dx,dy);     }\r
        /// Get the interpolated value in given data cell without border checking\r
-       mreal value(mreal x,mreal y=0,mreal z=0) const\r
+       mreal value(mreal x,mreal y=0,mreal =0) const\r
        {       return dat.value(ind,x,y);      }\r
        /// Get the value in given cell of the data without border checking\r
        mreal v(long i,long j=0,long =0) const\r
@@ -901,13 +933,16 @@ public:
        {       return 0;       }\r
 };\r
 //-----------------------------------------------------------------------------\r
+/// Class which present row of another data as data array\r
 class MGL_EXPORT mglDataR : public mglDataA\r
 {\r
        const mglDataA &dat;\r
        long ind;\r
+       const mglDataR &operator=(const mglDataR &d)    {       return d;       }\r
 public:\r
        mglDataR(const mglDataR &d) : dat(d.dat), ind(d.ind)    {       s = d.s;        }\r
        mglDataR(const mglDataA &d, long row=0) : dat(d), ind(row)      {}\r
+       mglDataR(HCDT d, long row=0) : dat(*d), ind(row)        {}\r
 #if MGL_HAVE_RVAL\r
        mglDataR(mglDataR &&d):dat(d.dat),ind(d.ind)\r
        {       s=d.s;  temp=d.temp;    func=d.func;    o=d.o;  d.func=0;       }\r
@@ -929,10 +964,10 @@ public:
        {       ind = i;        s = name;       }\r
 \r
        /// Get the interpolated value and its derivatives in given data cell without border checking\r
-       mreal valueD(mreal x,mreal y=0,mreal z=0,mreal *dx=0,mreal *dy=0,mreal *dz=0) const\r
+       mreal valueD(mreal x,mreal =0,mreal =0,mreal *dx=0,mreal *dy=0,mreal *dz=0) const\r
        {       if(dy)  *dy=0;  if(dz)  *dz=0;  return dat.valueD(x,ind,0,dx);  }\r
        /// Get the interpolated value in given data cell without border checking\r
-       mreal value(mreal x,mreal y=0,mreal z=0) const\r
+       mreal value(mreal x,mreal =0,mreal =0) const\r
        {       return dat.value(x,ind,0);      }\r
        /// Get the value in given cell of the data without border checking\r
        mreal v(long i,long =0,long =0) const\r
@@ -940,15 +975,15 @@ public:
        mreal vthr(long i) const\r
        {       return dat.vthr(i+dat.GetNx()*ind);     }\r
        // add for speeding up !!!\r
-       mreal dvx(long i,long j=0,long =0) const\r
+       mreal dvx(long i,long =0,long =0) const\r
        {       return  dat.dvx(i,ind,0);       }\r
-       mreal dvy(long i,long j=0,long =0) const\r
+       mreal dvy(long ,long =0,long =0) const\r
        {       return 0;       }\r
        mreal dvz(long ,long =0,long =0) const\r
        {       return 0;       }\r
 };\r
 //-----------------------------------------------------------------------------\r
-/// Class for replacement of std::vector\r
+/// Class which present std::vector as data array\r
 class MGL_EXPORT mglDataS : public mglDataA\r
 {\r
 public:\r
@@ -967,21 +1002,21 @@ public:
        const std::vector<mreal> &operator=(const std::vector<mreal> &st)       {       dat = st;       return st;      }\r
 \r
        /// Get the interpolated value and its derivatives in given data cell without border checking\r
-       mreal valueD(mreal x,mreal y=0,mreal z=0,mreal *dx=0,mreal *dy=0,mreal *dz=0) const\r
+       mreal valueD(mreal x,mreal =0,mreal =0,mreal *dx=0,mreal *dy=0,mreal *dz=0) const\r
        {       return mglSpline3(dat.data(),dat.size(),1,1,x,0,0,dx,dy,dz);    }\r
        /// Get the interpolated value in given data cell without border checking\r
-       mreal value(mreal x,mreal y=0,mreal z=0) const\r
+       mreal value(mreal x,mreal =0,mreal =0) const\r
        {       return mglSpline3s(dat.data(),dat.size(),1,1,x,0,0);    }\r
 \r
-       mreal v(long i,long j=0,long k=0) const         {       return dat[i];  }\r
-       mreal vthr(long i) const        {       return dat[i];  };\r
+       mreal v(long i,long =0,long =0) const           {       return dat[i];  }\r
+       mreal vthr(long i) const        {       return dat[i];  }\r
        long GetNx() const      {       return dat.size();      }\r
        long GetNy() const      {       return 1;       }\r
        long GetNz() const      {       return 1;       }\r
-       mreal dvx(long i,long j=0,long k=0) const\r
+       mreal dvx(long i,long =0,long =0) const\r
        {       return i>0? (i<long(dat.size()-1)? (dat[i+1]-dat[i-1])/2:dat[i]-dat[i-1]) : dat[i+1]-dat[i];    }\r
-       mreal dvy(long i,long j=0,long k=0) const       {       return 1;       }\r
-       mreal dvz(long i,long j=0,long k=0) const       {       return 1;       }\r
+       mreal dvy(long ,long =0,long =0) const  {       return 0;       }\r
+       mreal dvz(long ,long =0,long =0) const  {       return 0;       }\r
 };\r
 //-----------------------------------------------------------------------------\r
 #endif\r
index b7ae601dad5fd92675fb197b043deb6417e1562f..ecb83d0d58f4eda9afd28e024779f17127389416 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * data_cf.h is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -125,6 +125,13 @@ void MGL_EXPORT mgl_data_import_(uintptr_t *dat, const char *fname, const char *
 /// Scan textual file for template and fill data array\r
 int MGL_EXPORT mgl_data_scan_file(HMDT dat,const char *fname, const char *templ);\r
 int MGL_EXPORT mgl_data_scan_file_(uintptr_t *dat,const char *fname, const char *templ,int,int);\r
+/// Read data array from Tektronix WFM file\r
+/** Parse Tektronix TDS5000/B, TDS6000/B/C, TDS/CSA7000/B, MSO70000/C, DSA70000/B/C DPO70000/B/C DPO7000/ MSO/DPO5000. */\r
+int MGL_EXPORT mgl_data_read_wfm(HMDT d,const char *fname, long num, long step, long start);\r
+int MGL_EXPORT mgl_data_read_wfm_(uintptr_t *d, const char *fname, long *num, long *step, long *start,int l);\r
+/// Read data array from Matlab MAT file (parse versions 4 and 5)\r
+int MGL_EXPORT mgl_data_read_matlab(HMDT d,const char *fname,const char *data);\r
+int MGL_EXPORT mgl_data_read_matlab_(uintptr_t *d, const char *fname, const char *data,int l,int n);\r
 \r
 /// Create or recreate the array with specified size and fill it by zero\r
 void MGL_EXPORT mgl_data_create(HMDT dat, long nx,long ny,long nz);\r
@@ -133,11 +140,14 @@ void MGL_EXPORT mgl_data_create_(uintptr_t *dat, int *nx,int *ny,int *nz);
 void MGL_EXPORT mgl_data_transpose(HMDT dat, const char *dim);\r
 void MGL_EXPORT mgl_data_transpose_(uintptr_t *dat, const char *dim,int);\r
 /// Normalize the data to range [v1,v2]\r
-void MGL_EXPORT mgl_data_norm(HMDT dat, mreal v1,mreal v2,long sym,long dim);\r
+void MGL_EXPORT mgl_data_norm(HMDT dat, mreal v1,mreal v2,int sym,long dim);\r
 void MGL_EXPORT mgl_data_norm_(uintptr_t *dat, mreal *v1,mreal *v2,int *sym,int *dim);\r
 /// Normalize the data to range [v1,v2] slice by slice\r
 void MGL_EXPORT mgl_data_norm_slice(HMDT dat, mreal v1,mreal v2,char dir,long keep_en,long sym);\r
 void MGL_EXPORT mgl_data_norm_slice_(uintptr_t *dat, mreal *v1,mreal *v2,char *dir,int *keep_en,int *sym,int l);\r
+/// Limit the data to be inside [-v,v], keeping the original sign\r
+void MGL_EXPORT mgl_data_limit(HMDT dat, mreal v);\r
+void MGL_EXPORT mgl_data_limit_(uintptr_t *dat, mreal *v);\r
 /// Get sub-array of the data with given fixed indexes\r
 HMDT MGL_EXPORT mgl_data_subdata(HCDT dat, long xx,long yy,long zz);\r
 uintptr_t MGL_EXPORT mgl_data_subdata_(uintptr_t *dat, int *xx,int *yy,int *zz);\r
@@ -147,6 +157,15 @@ uintptr_t MGL_EXPORT mgl_data_subdata_ext_(uintptr_t *dat, uintptr_t *xx,uintptr
 /// Get column (or slice) of the data filled by formulas of named columns\r
 HMDT MGL_EXPORT mgl_data_column(HCDT dat, const char *eq);\r
 uintptr_t MGL_EXPORT mgl_data_column_(uintptr_t *dat, const char *eq,int l);\r
+/// Get data from sections ids, separated by value val along specified direction.\r
+/** If section id is negative then reverse order is used (i.e. -1 give last section). */\r
+HMDT MGL_EXPORT mgl_data_section(HCDT dat, HCDT ids, char dir, mreal val);\r
+uintptr_t MGL_EXPORT mgl_data_section_(uintptr_t *d, uintptr_t *ids, const char *dir, mreal *val,int);\r
+/// Get data from section id, separated by value val along specified direction.\r
+/** If section id is negative then reverse order is used (i.e. -1 give last section). */\r
+HMDT MGL_EXPORT mgl_data_section_val(HCDT dat, long id, char dir, mreal val);\r
+uintptr_t MGL_EXPORT mgl_data_section_val_(uintptr_t *d, int *id, const char *dir, mreal *val,int);\r
+\r
 /// Set names for columns (slices)\r
 void MGL_EXPORT mgl_data_set_id(HMDT d, const char *id);\r
 void MGL_EXPORT mgl_data_set_id_(uintptr_t *dat, const char *id,int l);\r
@@ -201,6 +220,54 @@ uintptr_t MGL_EXPORT mgl_data_ifs_2d_(uintptr_t *A, long *n, long *skip);
 /** NOTE: A.nx must be >= 13. */\r
 HMDT MGL_EXPORT mgl_data_ifs_3d(HCDT A, long n, long skip);\r
 uintptr_t MGL_EXPORT mgl_data_ifs_3d_(uintptr_t *A, long *n, long *skip);\r
+/// Get array which is n-th points {x[i],y[i],z[i]} for iterated function system (fractal) defined in *.ifs file 'fname' and named as 'name'\r
+HMDT MGL_EXPORT mgl_data_ifs_file(const char *fname, const char *name, long n, long skip);\r
+uintptr_t mgl_data_ifs_file_(const char *fname, const char *name, long *n, long *skip,int l,int m);\r
+/// Codes for flame fractal functions\r
+enum {\r
+       mglFlame2d_linear=0,    mglFlame2d_sinusoidal,  mglFlame2d_spherical,   mglFlame2d_swirl,               mglFlame2d_horseshoe,\r
+       mglFlame2d_polar,               mglFlame2d_handkerchief,mglFlame2d_heart,               mglFlame2d_disc,                mglFlame2d_spiral,\r
+       mglFlame2d_hyperbolic,  mglFlame2d_diamond,             mglFlame2d_ex,                  mglFlame2d_julia,               mglFlame2d_bent,\r
+       mglFlame2d_waves,               mglFlame2d_fisheye,             mglFlame2d_popcorn,             mglFlame2d_exponential, mglFlame2d_power,\r
+       mglFlame2d_cosine,              mglFlame2d_rings,               mglFlame2d_fan,                 mglFlame2d_blob,                mglFlame2d_pdj,\r
+       mglFlame2d_fan2,                mglFlame2d_rings2,              mglFlame2d_eyefish,             mglFlame2d_bubble,              mglFlame2d_cylinder,\r
+       mglFlame2d_perspective, mglFlame2d_noise,               mglFlame2d_juliaN,              mglFlame2d_juliaScope,  mglFlame2d_blur,\r
+       mglFlame2d_gaussian,    mglFlame2d_radialBlur,  mglFlame2d_pie,                 mglFlame2d_ngon,                mglFlame2d_curl,\r
+       mglFlame2d_rectangles,  mglFlame2d_arch,                mglFlame2d_tangent,             mglFlame2d_square,              mglFlame2d_blade,\r
+       mglFlame2d_secant,              mglFlame2d_rays,                mglFlame2d_twintrian,   mglFlame2d_cross,               mglFlame2d_disc2,\r
+       mglFlame2d_supershape,  mglFlame2d_flower,              mglFlame2d_conic,               mglFlame2d_parabola,    mglFlame2d_bent2,\r
+       mglFlame2d_bipolar,             mglFlame2d_boarders,    mglFlame2d_butterfly,   mglFlame2d_cell,                mglFlame2d_cpow,\r
+       mglFlame2d_curve,               mglFlame2d_edisc,               mglFlame2d_elliptic,    mglFlame2d_escher,              mglFlame2d_foci,\r
+       mglFlame2d_lazySusan,   mglFlame2d_loonie,              mglFlame2d_preBlur,             mglFlame2d_modulus,             mglFlame2d_oscope,\r
+       mglFlame2d_polar2,              mglFlame2d_popcorn2,    mglFlame2d_scry,                mglFlame2d_separation,  mglFlame2d_split,\r
+       mglFlame2d_splits,              mglFlame2d_stripes,             mglFlame2d_wedge,               mglFlame2d_wedgeJulia,  mglFlame2d_wedgeSph,\r
+       mglFlame2d_whorl,               mglFlame2d_waves2,              mglFlame2d_exp,                 mglFlame2d_log,                 mglFlame2d_sin,\r
+       mglFlame2d_cos,                 mglFlame2d_tan,                 mglFlame2d_sec,                 mglFlame2d_csc,                 mglFlame2d_cot,\r
+       mglFlame2d_sinh,                mglFlame2d_cosh,                mglFlame2d_tanh,                mglFlame2d_sech,                mglFlame2d_csch,\r
+       mglFlame2d_coth,                mglFlame2d_auger,               mglFlame2d_flux,                mglFlame2dLAST\r
+};\r
+/// Get array which is n-th pairs {x[i],y[i]} for Flame fractal generated by A with functions F\r
+/** NOTE: A.nx must be >= 7 and F.nx >= 2 and F.nz=A.ny.\r
+ * F[0,i,j] denote function id. F[1,i,j] give function weight. F(2:5,i,j) provide function parameters.\r
+ * Resulting point is {xnew,ynew} = sum_i F[1,i,j]*F[0,i,j]{IFS2d(A[j]){x,y}}. */\r
+HMDT MGL_EXPORT mgl_data_flame_2d(HCDT A, HCDT F, long n, long skip);\r
+uintptr_t MGL_EXPORT mgl_data_flame_2d_(uintptr_t *A, uintptr_t *F, long *n, long *skip);\r
+\r
+/// Get curves, separated by NAN, for maximal values of array d as function of x coordinate.\r
+/** Noises below lvl amplitude are ignored.\r
+  * Parameter dy \in [0,ny] set the "attraction" distance of points to curve. */\r
+HMDT MGL_EXPORT mgl_data_detect(HCDT d, mreal lvl, mreal dj, mreal di, mreal min_len);\r
+uintptr_t MGL_EXPORT mgl_data_detect_(uintptr_t *d, mreal *lvl, mreal *dj, mreal *di, mreal *min_len);\r
+\r
+/// Get array as solution of tridiagonal matrix solution a[i]*x[i-1]+b[i]*x[i]+c[i]*x[i+1]=d[i]\r
+/** String \a how may contain:\r
+ * 'x', 'y', 'z' for solving along x-,y-,z-directions, or\r
+ * 'h' for solving along hexagonal direction at x-y plain (need nx=ny),\r
+ * 'c' for using periodical boundary conditions,\r
+ * 'd' for diffraction/diffuse calculation.\r
+ * NOTE: It work for flat data model only (i.e. for a[i,j]==a[i+nx*j]) */\r
+HMDT MGL_EXPORT mgl_data_tridmat(HCDT A, HCDT B, HCDT C, HCDT D, const char *how);\r
+uintptr_t MGL_EXPORT mgl_data_tridmat_(uintptr_t *A, uintptr_t *B, uintptr_t *C, uintptr_t *D, const char *how, int);\r
 \r
 /// Returns pointer to data element [i,j,k]\r
 MGL_EXPORT mreal *mgl_data_value(HMDT dat, long i,long j,long k);\r
@@ -278,6 +345,12 @@ void MGL_EXPORT mgl_data_mirror_(uintptr_t *dat, const char *dir,int);
 /// Sort rows (or slices) by values of specified column\r
 void MGL_EXPORT mgl_data_sort(HMDT dat, long idx, long idy);\r
 void MGL_EXPORT mgl_data_sort_(uintptr_t *dat, int *idx, int *idy);\r
+/// Return dilated array of 0 or 1 for data values larger val\r
+void MGL_EXPORT mgl_data_dilate(HMDT dat, mreal val, long step);\r
+void MGL_EXPORT mgl_data_dilate_(uintptr_t *dat, mreal *val, int *step);\r
+/// Return eroded array of 0 or 1 for data values larger val\r
+void MGL_EXPORT mgl_data_erode(HMDT dat, mreal val, long step);\r
+void MGL_EXPORT mgl_data_erode_(uintptr_t *dat, mreal *val, int *step);\r
 \r
 /// Apply Hankel transform\r
 void MGL_EXPORT mgl_data_hankel(HMDT dat, const char *dir);\r
@@ -288,7 +361,12 @@ void MGL_EXPORT mgl_data_sinfft_(uintptr_t *dat, const char *dir,int);
 /// Apply Cos-Fourier transform\r
 void MGL_EXPORT mgl_data_cosfft(HMDT dat, const char *dir);\r
 void MGL_EXPORT mgl_data_cosfft_(uintptr_t *dat, const char *dir,int);\r
-/// Fill data by 'x'/'k' samples for Hankel ('h') or Fourier ('f') transform\r
+/// Fill data by coordinates/momenta samples for Hankel ('h') or Fourier ('f') transform\r
+/** Parameter \a how may contain:\r
+ * ‘x‘,‘y‘,‘z‘ for direction (only one will be used),\r
+ * ‘k‘ for momenta samples,\r
+ * ‘h‘ for Hankel samples,\r
+ * ‘f‘ for Cartesian/Fourier samples (default). */\r
 void MGL_EXPORT mgl_data_fill_sample(HMDT dat, const char *how);\r
 void MGL_EXPORT mgl_data_fill_sample_(uintptr_t *dat, const char *how,int);\r
 /// Find correlation between 2 data arrays\r
@@ -367,6 +445,9 @@ void MGL_EXPORT mgl_data_sew_(uintptr_t *dat, const char *dirs, mreal *da, int);
 /// Crop the data\r
 void MGL_EXPORT mgl_data_crop(HMDT dat, long n1, long n2, char dir);\r
 void MGL_EXPORT mgl_data_crop_(uintptr_t *dat, int *n1, int *n2, const char *dir,int);\r
+/// Crop the data to be most optimal for FFT (i.e. to closest value of 2^n*3^m*5^l)\r
+void MGL_EXPORT mgl_data_crop_opt(HMDT dat, const char *how);\r
+void MGL_EXPORT mgl_data_crop_opt_(uintptr_t *dat, const char *how,int);\r
 /// Remove rows with duplicate values in column id\r
 void MGL_EXPORT mgl_data_clean(HMDT dat, long id);\r
 void MGL_EXPORT mgl_data_clean_(uintptr_t *dat, int *id);\r
index c3687fa64836401b34d95de8db2081aa97e5b54f..5e8f4a8541aa6028dbffd2593c43742c107cd957 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * datac.h is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -165,6 +165,9 @@ using mglDataA::Momentum;
        /// Crop the data\r
        inline void Crop(long n1, long n2,char dir='x')\r
        {       mgl_datac_crop(this,n1,n2,dir); }\r
+       /// Crop the data to be most optimal for FFT (i.e. to closest value of 2^n*3^m*5^l)\r
+       inline void Crop(const char *how="235x")\r
+       {       mgl_datac_crop_opt(this, how);  }\r
        /// Insert data\r
        inline void Insert(char dir, long at=0, long num=1)\r
        {       mgl_datac_insert(this,dir,at,num);      }\r
@@ -290,6 +293,13 @@ using mglDataA::Momentum;
        {       return mglDataC(true,mgl_datac_subdata_ext(this,&xx,&yy,0));    }\r
        inline mglDataC SubData(const mglDataA &xx) const\r
        {       return mglDataC(true,mgl_datac_subdata_ext(this,&xx,0,0));      }\r
+       /// Get data from sections ids, separated by value val along specified direction.\r
+       /** If section id is negative then reverse order is used (i.e. -1 give last section). */\r
+       inline mglDataC Section(const mglDataA &ids, char dir='y', mreal val=NAN) const\r
+       {       return mglDataC(true,mgl_datac_section(this,&ids,dir,val));     }\r
+       inline mglDataC Section(long id, char dir='y', mreal val=NAN) const\r
+       {       return mglDataC(true,mgl_datac_section_val(this,id,dir,val));   }\r
+\r
        /// Get trace of the data array\r
        inline mglDataC Trace() const\r
        {       return mglDataC(true,mgl_datac_trace(this));    }\r
@@ -336,6 +346,15 @@ using mglDataA::Momentum;
        inline void Integral(const char *dir)   {       mgl_datac_integral(this,dir);   }\r
        /// Differentiate the data in given direction or directions\r
        inline void Diff(const char *dir)       {       mgl_datac_diff(this,dir);       }\r
+       /// Differentiate the parametrically specified data along direction v1\r
+       inline void Diff(const mglDataA &v1)\r
+       {       mgl_datac_diff_par(this,&v1,0,0);       }\r
+       /// Differentiate the parametrically specified data along direction v1 with v2=const\r
+       inline void Diff(const mglDataA &v1, const mglDataA &v2)\r
+       {       mgl_datac_diff_par(this,&v1,&v2,0);     }\r
+       /// Differentiate the parametrically specified data along direction v1 with v2,v3=const\r
+       inline void Diff(const mglDataA &v1, const mglDataA &v2, const mglDataA &v3)\r
+       {       mgl_datac_diff_par(this,&v1,&v2,&v3);   }\r
        /// Double-differentiate (like laplace operator) the data in given direction\r
        inline void Diff2(const char *dir)      {       mgl_datac_diff2(this,dir);      }\r
 \r
@@ -354,13 +373,30 @@ using mglDataA::Momentum;
         *  By default quadratic averaging over 5 points is used. */\r
        inline void Smooth(const char *dirs="xyz",mreal delta=0)\r
        {       mgl_datac_smooth(this,dirs,delta);      }\r
+       /// Limit the data to be inside [-v,v], keeping the original sign\r
+       inline void Limit(mreal v)\r
+       {       mgl_datac_limit(this, v);       }\r
 \r
+       /// Set as the data envelop\r
+       inline void Envelop(char dir='x')       {       mgl_datac_envelop(this,dir);    }\r
        /// Hankel transform\r
        inline void Hankel(const char *dir)     {       mgl_datac_hankel(this,dir);     }\r
+       /// Apply Sin-Fourier transform\r
+       inline void SinFFT(const char *dir)     {       mgl_datac_sinfft(this,dir);     }\r
+       /// Apply Cos-Fourier transform\r
+       inline void CosFFT(const char *dir)     {       mgl_datac_cosfft(this,dir);     }\r
        /// Fourier transform\r
        inline void FFT(const char *dir)        {       mgl_datac_fft(this,dir);        }\r
        /// Calculate one step of diffraction by finite-difference method with parameter q\r
        inline void Diffraction(const char *how, mreal q)       {       mgl_datac_diffr(this,how,q);    }\r
+       /// Apply wavelet transform\r
+       /** Parameter \a dir may contain:\r
+        * ‘x‘,‘y‘,‘z‘ for directions,\r
+        * ‘d‘ for daubechies, ‘D‘ for centered daubechies,\r
+        * ‘h‘ for haar, ‘H‘ for centered haar,\r
+        * ‘b‘ for bspline, ‘B‘ for centered bspline,\r
+        * ‘i‘ for applying inverse transform. */\r
+       inline void Wavelet(const char *how, int k)     {       mgl_datac_wavelet(this, how, k);        }\r
 \r
        /// Interpolate by cubic spline the data to given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1]\r
        inline dual Spline(mreal x,mreal y=0,mreal z=0) const\r
@@ -445,26 +481,30 @@ using mglDataA::Momentum;
        /// Set the value in given cell of the data\r
        void set_v(mreal val, long i,long j=0,long k=0) {       mgl_datac_set_value(this,val,i,j,k);    }\r
 #endif\r
+       /// Get the complex value in given cell of the data\r
+       dual vc(long i,long j=0,long k=0) const {       return a[i+nx*(j+ny*k)];        }\r
+       dual vcthr(long i) const        {       return a[i];    }\r
        /// Get the interpolated value and its derivatives in given data cell without border checking\r
        mreal valueD(mreal x,mreal y=0,mreal z=0,mreal *dx=0,mreal *dy=0,mreal *dz=0) const\r
        {       dual aa,ax,ay,az;       mreal res;\r
                aa = mglSpline3C(a,nx,ny,nz,x,y,z,&ax,&ay,&az); res = abs(aa);\r
                if(dx)  *dx = res?(real(aa)*real(ax)+imag(aa)*imag(ax))/res:0;\r
                if(dy)  *dy = res?(real(aa)*real(ay)+imag(aa)*imag(ay))/res:0;\r
-               if(dz)  *dz = res?(real(aa)*real(az)+imag(aa)*imag(az))/res:0;  return res;     }\r
+               if(dz)  *dz = res?(real(aa)*real(az)+imag(aa)*imag(az))/res:0;\r
+               return res;     }\r
        /// Get the interpolated value in given data cell without border checking\r
        mreal value(mreal x,mreal y=0,mreal z=0) const\r
        {       return abs(mglSpline3Cs(a,nx,ny,nz,x,y,z));     }\r
        mreal vthr(long i) const {      return abs(a[i]);       }\r
        // add for speeding up !!!\r
        mreal dvx(long i,long j=0,long k=0) const\r
-       {   register long i0=i+nx*(j+ny*k);\r
+       {   long i0=i+nx*(j+ny*k);\r
                return i>0? abs(i<nx-1? (a[i0+1]-a[i0-1])/mreal(2):a[i0]-a[i0-1]) : abs(a[i0+1]-a[i0]); }\r
        mreal dvy(long i,long j=0,long k=0) const\r
-       {   register long i0=i+nx*(j+ny*k);\r
+       {   long i0=i+nx*(j+ny*k);\r
                return j>0? abs(j<ny-1? (a[i0+nx]-a[i0-nx])/mreal(2):a[i0]-a[i0-nx]) : abs(a[i0+nx]-a[i0]);}\r
        mreal dvz(long i,long j=0,long k=0) const\r
-       {   register long i0=i+nx*(j+ny*k), n=nx*ny;\r
+       {   long i0=i+nx*(j+ny*k), n=nx*ny;\r
                return k>0? abs(k<nz-1? (a[i0+n]-a[i0-n])/mreal(2):a[i0]-a[i0-n]) : abs(a[i0+n]-a[i0]); }\r
 };\r
 //-----------------------------------------------------------------------------\r
@@ -481,6 +521,18 @@ inline mglDataC mglQO3dc(const char *ham, const mglDataA &ini_re, const mglDataA
 {      return mglDataC(true, mgl_qo3d_solve_c(ham, &ini_re, &ini_im, &ray, r, k0, 0, 0, 0));   }\r
 inline mglDataC mglQO3dc(const char *ham, const mglDataA &ini_re, const mglDataA &ini_im, const mglDataA &ray, mglData &xx, mglData &yy, mglData &zz, mreal r=1, mreal k0=100)\r
 {      return mglDataC(true, mgl_qo3d_solve_c(ham, &ini_re, &ini_im, &ray, r, k0, &xx, &yy, &zz));     }\r
+/// Saves result of ODE solving for var complex variables with right part func (separated by ';') and initial conditions x0 over time interval [0,tmax] with time step dt\r
+inline mglDataC mglODEc(const char *func, const char *var, const mglDataA &ini, mreal dt=0.1, mreal tmax=10)\r
+{      return mglDataC(true, mgl_ode_solve_str_c(func,var, &ini, dt, tmax));   }\r
+//-----------------------------------------------------------------------------\r
+/// Get array as solution of tridiagonal system of equations a[i]*x[i-1]+b[i]*x[i]+c[i]*x[i+1]=d[i]\r
+/** String \a how may contain:\r
+ * 'x', 'y', 'z' for solving along x-,y-,z-directions, or\r
+ * 'h' for solving along hexagonal direction at x-y plain (need nx=ny),\r
+ * 'c' for using periodical boundary conditions,\r
+ * 'd' for diffraction/diffuse calculation. */\r
+inline mglDataC mglTridMatC(const mglDataA &A, const mglDataA &B, const mglDataA &C, const mglDataC &D, const char *how)\r
+{      return mglDataC(true, mgl_datac_tridmat(&A, &B, &C, &D, how));  }\r
 //-----------------------------------------------------------------------------\r
 /// Get sub-array of the data with given fixed indexes\r
 inline mglDataC mglSubDataC(const mglDataA &dat, long xx, long yy=-1, long zz=-1)\r
index 1383e84e21979777a3a8b1c3d1d5e4a06e34c873..f2626b58713491e28c966f794eb06e69f764c3f1 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * data_cf.h is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -40,6 +40,8 @@ typedef void *HADT;
 /// Get integer power of x\r
 mdual MGL_EXPORT_CONST mgl_ipowc(dual x,int n);\r
 mdual MGL_EXPORT mgl_ipowc_(dual *x,int *n);\r
+/// Get complex number from string. Parse (%g,%g), {%g,%g} and [%g,%g] if adv!=0.\r
+mdual MGL_EXPORT mgl_atoc(const char *s, int adv);\r
 /// Get exp(i*a)\r
 mdual MGL_EXPORT_CONST mgl_expi(dual a);\r
 \r
@@ -88,6 +90,16 @@ mdual MGL_EXPORT mgl_datac_get_value_(uintptr_t *d, int *i, int *j, int *k);
 void MGL_EXPORT mgl_datac_set_values(HADT dat, const char *val, long nx, long ny, long nz);\r
 void MGL_EXPORT mgl_datac_set_values_(uintptr_t *d, const char *val, int *nx, int *ny, int *nz, int l);\r
 \r
+/// Get array as solution of tridiagonal matrix solution a[i]*x[i-1]+b[i]*x[i]+c[i]*x[i+1]=d[i]\r
+/** String \a how may contain:\r
+ * 'x', 'y', 'z' for solving along x-,y-,z-directions, or\r
+ * 'h' for solving along hexagonal direction at x-y plain (need nx=ny),\r
+ * 'c' for using periodical boundary conditions,\r
+ * 'd' for diffraction/diffuse calculation.\r
+ * NOTE: It work for flat data model only (i.e. for a[i,j]==a[i+nx*j]) */\r
+HADT MGL_EXPORT mgl_datac_tridmat(HCDT A, HCDT B, HCDT C, HCDT D, const char *how);\r
+uintptr_t MGL_EXPORT mgl_datac_tridmat_(uintptr_t *A, uintptr_t *B, uintptr_t *C, uintptr_t *D, const char *how, int);\r
+\r
 /// Returns pointer to internal data array\r
 MGL_EXPORT dual *mgl_datac_data(HADT dat);\r
 /// Returns pointer to data element [i,j,k]\r
@@ -163,6 +175,14 @@ uintptr_t MGL_EXPORT mgl_datac_sum_(uintptr_t *dat, const char *dir,int);
 /// Get the data which is direct multiplication (like, d[i,j] = this[i]*a[j] and so on)\r
 HADT MGL_EXPORT mgl_datac_combine(HCDT dat1, HCDT dat2);\r
 uintptr_t MGL_EXPORT mgl_datac_combine_(uintptr_t *dat1, uintptr_t *dat2);\r
+/// Get data from sections ids, separated by value val along specified direction.\r
+/** If section id is negative then reverse order is used (i.e. -1 give last section). */\r
+HADT MGL_EXPORT mgl_datac_section(HCDT dat, HCDT ids, char dir, mreal val);\r
+uintptr_t MGL_EXPORT mgl_datac_section_(uintptr_t *d, uintptr_t *ids, const char *dir, mreal *val,int);\r
+/// Get data from section id, separated by value val along specified direction.\r
+/** If section id is negative then reverse order is used (i.e. -1 give last section). */\r
+HADT MGL_EXPORT mgl_datac_section_val(HCDT dat, long id, char dir, mreal val);\r
+uintptr_t MGL_EXPORT mgl_datac_section_val_(uintptr_t *d, int *id, const char *dir, mreal *val,int);\r
 \r
 /// Set names for columns (slices)\r
 void MGL_EXPORT mgl_datac_set_id(HADT d, const char *id);\r
@@ -196,6 +216,10 @@ void MGL_EXPORT mgl_datac_modify_(uintptr_t *dat, const char *eq,int *dim,int);
 void MGL_EXPORT mgl_datac_modify_vw(HADT dat, const char *eq,HCDT vdat,HCDT wdat);\r
 void MGL_EXPORT mgl_datac_modify_vw_(uintptr_t *dat, const char *eq, uintptr_t *vdat, uintptr_t *wdat,int);\r
 \r
+/// Limit the data to be inside [-v,v], keeping the original sign\r
+void MGL_EXPORT mgl_datac_limit(HADT dat, mreal v);\r
+void MGL_EXPORT mgl_datac_limit_(uintptr_t *dat, mreal *v);\r
+\r
 /// Put value to data element(s)\r
 void MGL_EXPORT mgl_datac_put_val(HADT dat, dual val, long i, long j, long k);\r
 void MGL_EXPORT mgl_datac_put_val_(uintptr_t *dat, dual *val, int *i, int *j, int *k);\r
@@ -237,6 +261,9 @@ void MGL_EXPORT mgl_datac_integral_(uintptr_t *dat, const char *dir,int);
 /// Differentiate the data in given direction or directions\r
 void MGL_EXPORT mgl_datac_diff(HADT dat, const char *dir);\r
 void MGL_EXPORT mgl_datac_diff_(uintptr_t *dat, const char *dir,int);\r
+/// Differentiate the parametrically specified data along direction v1 with v2,v3=const (v3 can be NULL)\r
+void MGL_EXPORT mgl_datac_diff_par(HADT dat, HCDT v1, HCDT v2, HCDT v3);\r
+void MGL_EXPORT mgl_datac_diff_par_(uintptr_t *dat, uintptr_t *v1, uintptr_t *v2, uintptr_t *v3);\r
 /// Double-differentiate (like Laplace operator) the data in given direction\r
 void MGL_EXPORT mgl_datac_diff2(HADT dat, const char *dir);\r
 void MGL_EXPORT mgl_datac_diff2_(uintptr_t *dat, const char *dir,int);\r
@@ -252,6 +279,9 @@ void MGL_EXPORT mgl_datac_mirror_(uintptr_t *dat, const char *dir,int);
 /// Crop the data\r
 void MGL_EXPORT mgl_datac_crop(HADT dat, long n1, long n2, char dir);\r
 void MGL_EXPORT mgl_datac_crop_(uintptr_t *dat, int *n1, int *n2, const char *dir,int);\r
+/// Crop the data to be most optimal for FFT (i.e. to closest value of 2^n*3^m*5^l)\r
+void MGL_EXPORT mgl_datac_crop_opt(HADT dat, const char *how);\r
+void MGL_EXPORT mgl_datac_crop_opt_(uintptr_t *dat, const char *how,int);\r
 \r
 /// Multiply the data by other one for each element\r
 void MGL_EXPORT mgl_datac_mul_dat(HADT dat, HCDT d);\r
@@ -281,6 +311,12 @@ void MGL_EXPORT mgl_datac_sub_num_(uintptr_t *dat, dual *d);
 /// Apply Hankel transform\r
 void MGL_EXPORT mgl_datac_hankel(HADT dat, const char *dir);\r
 void MGL_EXPORT mgl_datac_hankel_(uintptr_t *dat, const char *dir,int);\r
+/// Apply Sin-Fourier transform\r
+void MGL_EXPORT mgl_datac_sinfft(HADT dat, const char *dir);\r
+void MGL_EXPORT mgl_datac_sinfft_(uintptr_t *dat, const char *dir,int);\r
+/// Apply Cos-Fourier transform\r
+void MGL_EXPORT mgl_datac_cosfft(HADT dat, const char *dir);\r
+void MGL_EXPORT mgl_datac_cosfft_(uintptr_t *dat, const char *dir,int);\r
 /// Apply Fourier transform\r
 void MGL_EXPORT mgl_datac_fft(HADT dat, const char *dir);\r
 void MGL_EXPORT mgl_datac_fft_(uintptr_t *dat, const char *dir,int);\r
@@ -290,6 +326,18 @@ uintptr_t MGL_EXPORT mgl_datac_correl_(uintptr_t *dat1, uintptr_t *dat2, const c
 /// Calculate one step of diffraction by finite-difference method with parameter q\r
 void MGL_EXPORT mgl_datac_diffr(HADT dat, const char *how, mreal q);\r
 void MGL_EXPORT mgl_datac_diffr_(uintptr_t *d, const char *how, double q,int l);\r
+/// Apply wavelet transform\r
+/** Parameter \a dir may contain:\r
+ * ‘x‘,‘y‘,‘z‘ for directions,\r
+ * ‘d‘ for daubechies, ‘D‘ for centered daubechies,\r
+ * ‘h‘ for haar, ‘H‘ for centered haar,\r
+ * ‘b‘ for bspline, ‘B‘ for centered bspline,\r
+ * ‘i‘ for applying inverse transform. */\r
+void MGL_EXPORT mgl_datac_wavelet(HADT dat, const char *how, int k);\r
+void MGL_EXPORT mgl_datac_wavelet_(uintptr_t *d, const char *dir, int *k,int);\r
+/// Set as the data envelop\r
+void MGL_EXPORT mgl_datac_envelop(HADT dat, char dir);\r
+void MGL_EXPORT mgl_datac_envelop_(uintptr_t *dat, const char *dir, int);\r
 \r
 /// Get real part of data values\r
 HMDT MGL_EXPORT mgl_datac_real(HCDT dat);\r
index ada4ce50aafd39c38a50f681415a8032d0af84b4..dd60a862ea2e5e13737490c9e286800380f95cc8 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * define.h is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
 #ifndef _MGL_DEFINE_H_\r
 #define _MGL_DEFINE_H_\r
 //-----------------------------------------------------------------------------\r
+// Disable warnings for MSVC:\r
+// 4190 - C-linkage of std::complex,\r
+// 4996 - deprecated abi functions\r
+// 4786 - disable warnings on 255 char debug symbols\r
+// 4231 - disable warnings on extern before template instantiation\r
+// 4800        - "int,uint32_t,etc" forcing value to bool 'true' or 'false' (performance warning)\r
+// 4244 - conversion from 'mreal,double' to 'float', possible loss of data\r
+// 4267        - conversion from 'size_t' to 'long,int,etc', possible loss of data\r
+// 4305        - truncation from 'double' to 'float'\r
+#if defined(_MSC_VER)\r
+#pragma warning(disable: 4996 4190 4786 4231 4800 4244 4267 4305)\r
+#endif\r
+\r
 #include "mgl2/config.h"\r
 #ifndef SWIG\r
 \r
 #endif\r
 \r
 #include "mgl2/dllexport.h"\r
+#if defined(_MSC_VER)\r
+#define MGL_OBSOLETE   MGL_NO_EXPORT\r
+#else\r
+#define MGL_OBSOLETE   MGL_EXPORT\r
+#endif\r
+\r
 #if MGL_HAVE_ATTRIBUTE\r
 #define MGL_FUNC_CONST __attribute__((const))\r
 #define MGL_FUNC_PURE  __attribute__((pure))\r
 #endif\r
 \r
 #ifdef MGL_SRC\r
+\r
+#if MGL_USE_GETTEXT\r
+       #include <libintl.h>\r
+       #define _(x)    gettext(x)\r
+#else\r
+       #define _(x)    (x)\r
+#endif\r
+\r
+\r
 #if MGL_HAVE_ZLIB\r
 #include <zlib.h>\r
 #ifndef Z_BEST_COMPRESSION\r
@@ -92,8 +120,8 @@ typedef unsigned long uintptr_t;
 #include <wchar.h>\r
 \r
 #if defined(_MSC_VER)\r
-#if (_MSC_VER<=1800)\r
 #define collapse(a)    // MSVS don't support OpenMP 3.*\r
+#if (_MSC_VER<=1800)\r
 #define strtoull _strtoui64\r
 //#define hypot        _hypot\r
 #define getcwd _getcwd\r
@@ -162,28 +190,6 @@ typedef float mreal;
 #define MGL_DEF_VIEWER "evince"\r
 #endif\r
 //-----------------------------------------------------------------------------\r
-#if MGL_HAVE_TYPEOF\r
-#define mgl_isrange(a,b)       ({typeof (a) _a = (a); typeof (b) _b = (b); fabs(_a-_b)>MGL_MIN_VAL && _a-_a==mreal(0.) && _b-_b==mreal(0.);})\r
-#define mgl_isbad(a)   ({typeof (a) _a = (a); _a-_a!=mreal(0.);})\r
-#define mgl_isfin(a)   ({typeof (a) _a = (a); _a-_a==mreal(0.);})\r
-#define mgl_isnum(a)   ({typeof (a) _a = (a); _a==_a;})\r
-#define mgl_isnan(a)   ({typeof (a) _a = (a); _a!=_a;})\r
-#define mgl_min(a,b)   ({typeof (a) _a = (a); typeof (b) _b = (b); _a > _b ? _b : _a;})\r
-#define mgl_max(a,b)   ({typeof (a) _a = (a); typeof (b) _b = (b); _a > _b ? _a : _b;})\r
-#define mgl_sign(a)            ({typeof (a) _a = (a); _a<0 ? -1:1;})\r
-#define mgl_int(a)             ({typeof (a) _a = (a); long(_a+(_a>=0 ? 0.5:-0.5));})\r
-#else\r
-#define mgl_isrange(a,b)       (fabs((a)-(b))>MGL_EPSILON && (a)-(a)==mreal(0.) && (b)-(b)==mreal(0.))\r
-#define mgl_min(a,b)   (((a)>(b)) ? (b) : (a))\r
-#define mgl_max(a,b)   (((a)>(b)) ? (a) : (b))\r
-#define mgl_isnan(a)   ((a)!=(a))\r
-#define mgl_isnum(a)   ((a)==(a))\r
-#define mgl_isfin(a)   ((a)-(a)==mreal(0.))\r
-#define mgl_isbad(a)   ((a)-(a)!=mreal(0.))\r
-#define mgl_sign(a)            ((a)<0 ? -1:1)\r
-#define mgl_int(a)             (long(a+((a)>=0 ? 0.5:-0.5)))\r
-#endif\r
-//-----------------------------------------------------------------------------\r
 enum{  // types of predefined curvelinear coordinate systems\r
        mglCartesian = 0,       // no transformation\r
        mglPolar,\r
@@ -240,7 +246,7 @@ enum{       // Codes for warnings/messages
 #define MGL_COLORS     "kwrgbcymhWRGBCYMHlenpquLENPQU"\r
 //-----------------------------------------------------------------------------\r
 /// Brushes for mask with symbol "-+=;oOsS~<>jdD*^" correspondingly\r
-extern uint64_t mgl_mask_val[16];\r
+extern MGL_EXPORT uint64_t mgl_mask_val[16];\r
 #define MGL_MASK_ID            "-+=;oOsS~<>jdD*^"\r
 #define MGL_SOLID_MASK 0xffffffffffffffff\r
 //-----------------------------------------------------------------------------\r
@@ -267,6 +273,7 @@ extern uint64_t mgl_mask_val[16];
 #define MGL_PREFERVC           0x040000        ///< Prefer vertex color instead of texture if output format supports\r
 #define MGL_ONESIDED           0x080000        ///< Render only front side of surfaces if output format supports (for debugging)\r
 #define MGL_NO_ORIGIN          0x100000        ///< Don't draw tick labels at axis origin\r
+#define MGL_GRAY_MODE          0x200000        ///< Convert all colors to gray ones\r
 //-----------------------------------------------------------------------------\r
 #if MGL_HAVE_C99_COMPLEX\r
 #include <complex.h>\r
@@ -282,10 +289,26 @@ const mdual mgl_I=_Complex_I;
 #define mgl_abs(x)     cabs(x)\r
 #endif\r
 #ifdef __cplusplus\r
+#include <string>\r
+#include <vector>\r
+#if defined(_MSC_VER)\r
+template class MGL_EXPORT std::allocator<char>;\r
+template class MGL_EXPORT std::allocator<wchar_t>;\r
+template struct MGL_EXPORT std::char_traits<char>;\r
+template struct MGL_EXPORT std::char_traits<wchar_t>;\r
+template class MGL_EXPORT std::basic_string< char, std::char_traits<char>, std::allocator<char> >;\r
+template class MGL_EXPORT std::basic_string< wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >;\r
+template class MGL_EXPORT std::vector<long>;\r
+template class MGL_EXPORT std::vector<mreal>;\r
+#endif\r
 //-----------------------------------------------------------------------------\r
 extern float mgl_cos[360];     ///< contain cosine with step 1 degree\r
 //-----------------------------------------------------------------------------\r
 #include <complex>\r
+#if defined(_MSC_VER)\r
+template class MGL_EXPORT std::complex<float>;\r
+template class MGL_EXPORT std::complex<double>;\r
+#endif\r
 typedef std::complex<mreal> dual;\r
 typedef std::complex<double> ddual;\r
 #if !MGL_HAVE_C99_COMPLEX\r
@@ -294,6 +317,22 @@ typedef std::complex<double> ddual;
 #define mgl_abs(x)     abs(x)\r
 #endif\r
 //-----------------------------------------------------------------------------\r
+inline bool mgl_isrange(double a, double b)\r
+{      return fabs(a-b)>MGL_MIN_VAL && a-a==0. && b-b==0.;     }\r
+inline bool mgl_isbad(double a)        {       return a-a!=0;  }\r
+inline bool mgl_isbad(dual a)  {       return a-a!=mreal(0);   }\r
+inline bool mgl_isfin(double a)        {       return a-a==0;  }\r
+inline bool mgl_isfin(dual a)  {       return a-a==mreal(0);   }\r
+inline bool mgl_isnum(double a)        {       return a==a;    }\r
+inline bool mgl_isnum(dual a)  {       return a==a;    }\r
+inline bool mgl_isnan(double a)        {       return a!=a;    }\r
+inline bool mgl_isnan(dual a)  {       return a!=a;    }\r
+inline int mgl_sign(double a)  {       return a<0?-1:1;        }\r
+inline long mgl_int(double a)  {       return long(a+(a>=0?0.5:-0.5)); }\r
+inline double mgl_min(double a, double b)      {       return a>b?b:a; }\r
+inline double mgl_max(double a, double b)      {       return a>b?a:b; }\r
+inline void mgl_strncpy(char *a, const char *b, size_t s)      {       strncpy(a,b,s); a[s-1]=0;       }\r
+//-----------------------------------------------------------------------------\r
 extern "C" {\r
 #else\r
 #include <complex.h>\r
@@ -306,6 +345,8 @@ double MGL_EXPORT_CONST mgl_hypot(double x, double y);
 size_t MGL_EXPORT mgl_wcslen(const wchar_t *str);\r
 /// Get RGB values for given color id or fill by -1 if no one found\r
 void MGL_EXPORT mgl_chrrgb(char id, float rgb[3]);\r
+/// Get number of colors in the string\r
+size_t MGL_EXPORT mgl_get_num_color(const char *s, int smooth);\r
 /// Check if string contain color id and return its number\r
 long MGL_EXPORT mgl_have_color(const char *stl);\r
 /// Find symbol in string excluding {} and return its position or NULL\r
@@ -333,6 +374,11 @@ void MGL_EXPORT mgl_set_global_warn_(const char *text,int);
 /// Get text of global warning message(s)\r
 MGL_EXPORT const char *mgl_get_global_warn();\r
 int MGL_EXPORT mgl_get_global_warn_(char *out, int len);\r
+/// Setup gettext usage. NOTE: Russian translation MUST be installed.\r
+void MGL_EXPORT mgl_textdomain(const char *argv0, const char *locale);\r
+void MGL_EXPORT mgl_textdomain_(const char *locale, int);\r
+/// size of var array\r
+const int MGL_VS = 'z'-'a'+1;\r
 #ifdef __cplusplus\r
 }\r
 #endif\r
index 9043ccf4ece58987947d3fe45e35e6a7aa57a884..0910e93c3dd4136ccba8bf1987eb433f0976dbaa 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * eval.h is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -25,8 +25,6 @@
 #define MGL_ERR_LOG            1\r
 #define MGL_ERR_ARC            2\r
 #define MGL_ERR_SQRT   3\r
-/// size of var array\r
-const int MGL_VS = 'z'-'a'+1;\r
 //-----------------------------------------------------------------------------\r
 /// Class for evaluating formula specified by the string\r
 class MGL_EXPORT mglFormula                                    // îáúåêò äëÿ ââîäà è âû÷èñëåíèÿ ôîðìóë\r
index 202ca81badaa07db24838e40321e323b5ba5dfae..36dbeef5323ab993a4348c102bcd4bc1b4aefd3b 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * evalc.h is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
index 82e3144b753276ee706e301eee6efd0c81edd911..5f6f2e20bc200b5fc3bd1cc17292825cc0419b09 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * fit.h is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
index 129ac08e5b0712b82c66cda80917df6355e051f9..9d4a223362cb145a8af36a9f2f99030d970fddf3 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * fltk.h is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -35,6 +35,8 @@ int MGL_EXPORT mgl_fltk_run_();
 int MGL_EXPORT mgl_fltk_thr();\r
 /// Callback function for asking user.\r
 void MGL_EXPORT mgl_ask_fltk(const wchar_t *quest, wchar_t *res);\r
+/// Return pointer to widget (Fl_MGLView*) used for plotting\r
+MGL_EXPORT void *mgl_fltk_widget(HMGL gr);\r
 #ifdef __cplusplus\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -43,7 +45,7 @@ void MGL_EXPORT mgl_ask_fltk(const wchar_t *quest, wchar_t *res);
 /// Wrapper class for windows displaying graphics\r
 class MGL_EXPORT mglFLTK : public mglWnd\r
 {\r
-       mglFLTK(const mglFLTK &t) {}    // copying is not allowed\r
+       mglFLTK(const mglFLTK &) {}     // copying is not allowed\r
        const mglFLTK &operator=(const mglFLTK &t)      {       return t;       }\r
 public:\r
        mglFLTK(const char *title="MathGL") : mglWnd()\r
@@ -61,6 +63,8 @@ public:
     virtual ~mglFLTK() {}\r
        int Run()       {       return mgl_fltk_run();  }       ///< Run main loop for event handling\r
        int RunThr()    {       return mgl_fltk_thr();  }       ///< Run main loop for event handling in separate thread\r
+       /// Return pointer to widget (Fl_MGLView*) used for plotting\r
+       void *Widget()  {       return mgl_fltk_widget(gr);     }\r
 };\r
 //-----------------------------------------------------------------------------\r
 #endif\r
index 3bb937cc3c96e13ff46c35ee7379fbe3eb088da0..1c9786880726e210de18cfb9a0d67f31484840f7 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * font.h is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -22,7 +22,6 @@
 #define _MGL_FONT_H_\r
 \r
 #include "mgl2/define.h"\r
-#include <vector>\r
 //-----------------------------------------------------------------------------\r
 #define MGL_FONT_BOLD          0x01000000      // This value is used binary\r
 #define MGL_FONT_ITAL          0x02000000      // This value is used binary\r
@@ -50,7 +49,11 @@ struct mglGlyphDescr
 };\r
 inline bool operator<(const mglGlyphDescr &a,const mglGlyphDescr &b)   {       return a.id<b.id;       }\r
 inline bool operator>(const mglGlyphDescr &a,const mglGlyphDescr &b)   {       return a.id>b.id;       }\r
+#if defined(_MSC_VER)\r
+template class MGL_EXPORT std::vector<mglGlyphDescr>;\r
+#endif\r
 //-----------------------------------------------------------------------------\r
+extern const float mgl_fact;\r
 struct MGL_EXPORT mglTeXsymb   {       unsigned kod;   const wchar_t *tex;     };\r
 const float mgl_fgen = 4*14;\r
 /// Get font color, style and align for internal parser\r
index 11fb0d50a77bff6327286bb219f6cee01f15b0bc..83c345ced8eb0afd6e18e6e5ce3c47d5d64cf1f3 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * glut.h is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -51,7 +51,7 @@ void MGL_EXPORT mgl_glut_animation(HMGL gr);
 //-----------------------------------------------------------------------------\r
 class MGL_EXPORT mglGLUT: public mglGraph\r
 {\r
-       mglGLUT(const mglGLUT &t) {}    // copying is not allowed\r
+       mglGLUT(const mglGLUT &) {}     // copying is not allowed\r
        const mglGLUT &operator=(const mglGLUT &t)      {       return t;       }\r
 public:\r
        mglGLUT(int (*draw)(HMGL gr, void *p), const char *title="MathGL", void *par=0, void (*load)(void *p)=0) : mglGraph(-1)\r
index 993596a7fabd2cca4b5fe1070522a27faebdddd2..4fc85ed65e236f7f4a6772ceaa1fa4a553e0e6ac 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * mgl.h is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU General Public License as published by  *\r
 /// Wrapper class for all graphics\r
 class MGL_EXPORT mglGraph\r
 {\r
-       mglGraph(const mglGraph &t) {}  // copying is not allowed\r
+       mglGraph(const mglGraph &) {}   // copying is not allowed\r
        const mglGraph &operator=(const mglGraph &t)    {       return t;       }\r
 protected:\r
        HMGL gr;\r
 public:\r
+       HMPR pr;        ///< Pointer to associated MGL parser\r
        mglGraph(int kind=0, int width=600, int height=400)\r
-       {\r
+       {       pr = NULL;\r
                if(kind==-1)    gr=NULL;\r
 #if MGL_HAVE_OPENGL\r
                else if(kind==1)        gr=mgl_create_graph_gl();\r
@@ -47,7 +48,7 @@ public:
                else    gr=mgl_create_graph(width, height);\r
        }\r
        mglGraph(HMGL graph)\r
-       {       gr = graph;             mgl_use_graph(gr,1);    }\r
+       {       pr = NULL;      gr = graph;             mgl_use_graph(gr,1);    }\r
        virtual ~mglGraph()\r
        {       if(mgl_use_graph(gr,-1)<1)      mgl_delete_graph(gr);   }\r
        /// Get pointer to internal HMGL object\r
@@ -69,6 +70,8 @@ public:
 \r
        /// Set the transparency on/off.\r
        inline void Alpha(bool enable)                  {       mgl_set_alpha(gr, enable);      }\r
+       /// Set the gray-scale mode on/off.\r
+       inline void Gray(bool enable)                   {       mgl_set_gray(gr, enable);       }\r
        /// Set default value of alpha-channel\r
        inline void SetAlphaDef(double alpha)   {       mgl_set_alpha_default(gr, alpha);       }\r
        /// Set the transparency type (0 - usual, 1 - glass, 2 - lamp)\r
@@ -116,7 +119,7 @@ public:
        inline void CutOff(const char *EqC)             {       mgl_set_cutoff(gr, EqC);        }\r
 \r
        /// Set default font size\r
-       inline void SetFontSize(double size)    {       mgl_set_font_size(gr, size);}\r
+       inline void SetFontSize(double size)    {       mgl_set_font_size(gr, size);    }\r
        /// Set default font style and color\r
        inline void SetFontDef(const char *fnt) {       mgl_set_font_def(gr, fnt);      }\r
        /// Set FontSize by size in pt and picture DPI (default is 16 pt for dpi=72)\r
@@ -136,6 +139,9 @@ public:
        inline void SetRotatedText(bool rotated)        {       mgl_set_rotated_text(gr, rotated);      }\r
        /// Set default font for all new HMGL and mglGraph objects\r
        static inline void SetDefFont(const char *name, const char *path=NULL)  {       mgl_def_font(name,path);        }\r
+       /// Add user-defined glyph for symbol and set its optional id\r
+       inline void DefineSymbol(char id, const mglDataA &x, const mglDataA &y)\r
+       {       mgl_define_symbol(gr, id, &x, &y);      }\r
 \r
        /// Set default palette\r
        inline void SetPalette(const char *colors)      {       mgl_set_palette(gr, colors);    }\r
@@ -282,15 +288,15 @@ public:
         *  '#' for using whole region. */\r
        inline void SubPlot(int nx,int ny,int m,const char *style="<>_^", double dx=0, double dy=0)\r
        {       mgl_subplot_d(gr, nx, ny, m, style, dx, dy);    }\r
-       /// Put further plotting in rectangle of dx*dy cells starting from m-th cell of nx*ny grid of the image.\r
+       /// Put further plotting in rectangle of dx*dy cells starting from m-th cell of nx*ny grid of the image and shift it by distance {sx,sy}.\r
        /** String \a style may contain:\r
         *  '<' for reserving space at left\r
         *  '>' for reserving space at right\r
         *  '^' for reserving space at top\r
         *  '_' for reserving space at bottom\r
         *  '#' for using whole region. */\r
-       inline void MultiPlot(int nx,int ny,int m, int dx, int dy, const char *style="<>_^")\r
-       {       mgl_multiplot(gr, nx, ny, m, dx, dy, style);    }\r
+       inline void MultiPlot(int nx,int ny,int m, int dx, int dy, const char *style="<>_^", double sx=0, double sy=0)\r
+       {       mgl_multiplot_d(gr, nx, ny, m, dx, dy, style, sx, sy);  }\r
        /// Put further plotting in a region [x1,x2]*[y1,y2] of the image or subplot (x1,x2,y1,y2 in range [0, 1]).\r
        inline void InPlot(double x1,double x2,double y1,double y2, bool rel=true)\r
        {       if(rel) mgl_relplot(gr, x1, x2, y1, y2);\r
@@ -304,6 +310,9 @@ public:
        /// Put further plotting in cell of stick rotated on angles tet, phi\r
        inline void StickPlot(int num, int i, double tet, double phi)\r
        {       mgl_stickplot(gr,num,i,tet,phi);        }\r
+       /// Put further plotting in cell of stick sheared on sx, sy.\r
+       inline void ShearPlot(int num, int i, mreal sx, mreal sy, mreal xd=1, mreal yd=0)\r
+       {       mgl_shearplot(gr,num,i,sx,sy,xd,yd);    }\r
 \r
        /// Set factor of plot size\r
        inline void SetPlotFactor(double val)\r
@@ -324,6 +333,9 @@ public:
        /// Set aspect ratio for further plotting.\r
        inline void Aspect(double Ax,double Ay,double Az=1)\r
        {       mgl_aspect(gr, Ax, Ay, Az);             }\r
+       /// Shear a further plotting.\r
+       inline void Shear(double Sx,double Sy)\r
+       {       mgl_shear(gr, Sx, Sy);          }\r
        /// Rotate a further plotting.\r
        inline void Rotate(double TetX,double TetZ=0,double TetY=0)\r
        {       mgl_rotate(gr, TetX, TetZ, TetY);       }\r
@@ -361,11 +373,16 @@ public:
        /// Set drawing region for Quality&4\r
        inline void SetDrawReg(long nx=1, long ny=1, long m=0)  {       mgl_set_draw_reg(gr,nx,ny,m);   }\r
        /// Start group of objects\r
-       inline void StartGroup(const char *name)                {       mgl_start_group(gr, name);      }\r
+       inline void StartGroup(const char *name)        {       mgl_start_group(gr, name);      }\r
        /// End group of objects\r
        inline void EndGroup()  {       mgl_end_group(gr);      }\r
        /// Highlight objects with given id\r
        inline void Highlight(int id)   {       mgl_highlight(gr, id);  }\r
+       /// Set boundary box for export graphics into 2D file formats.\r
+       /** If x2<0 (y2<0) then full width (height) will be used.\r
+        *  If x1<0 or y1<0 or x1>=x2|Width or y1>=y2|Height then cropping will be disabled. */\r
+       inline void SetBBox(int x1=0, int y1=0, int x2=-1, int y2=-1)\r
+       {       mgl_set_bbox(gr,x1,y1,x2,y2);   }\r
 \r
        /// Show current image\r
        inline void ShowImage(const char *viewer, bool keep=0)\r
@@ -588,6 +605,18 @@ public:
        inline void Bifurcation(double dx, const char *func, const char *stl="", const char *opt="")\r
        {       mgl_bifurcation_str(gr,dx,func,stl,opt);        }\r
 \r
+       /// Draws Iris plots for determining cross-dependences of data arrays\r
+       /** NOTE: using the same ranges and empty ids will not draw axis. This will add data to existing Iris plot.\r
+        *      Option value set the size of data labels ids, separated by ';'.*/\r
+       inline void Iris(mglDataA &dats, const char *ids, const char *stl="", const char *opt="")\r
+       {       mgl_iris_1(gr,&dats,ids,stl,opt);       }\r
+       inline void Iris(mglDataA &dats, const wchar_t *ids, const char *stl="", const char *opt="")\r
+       {       mgl_irisw_1(gr,&dats,ids,stl,opt);      }\r
+       inline void Iris(mglDataA &dats, mglDataA &ranges, const char *ids, const char *stl="", const char *opt="")\r
+       {       mgl_iris(gr,&dats,&ranges,ids,stl,opt); }\r
+       inline void Iris(mglDataA &dats, mglDataA &ranges, const wchar_t *ids, const char *stl="", const char *opt="")\r
+       {       mgl_irisw(gr,&dats,&ranges,ids,stl,opt);        }\r
+\r
        /// Draws the face between points with color stl (include interpolation up to 4 colors).\r
        inline void Face(mglPoint p1, mglPoint p2, mglPoint p3, mglPoint p4, const char *stl="r")\r
        {       mgl_face(gr, p1.x, p1.y, p1.z, p2.x, p2.y, p2.z, p3.x, p3.y, p3.z, p4.x, p4.y, p4.z, stl);      }\r
@@ -640,8 +669,8 @@ public:
        inline void Polygon(mglPoint p1, mglPoint p2, int n, const char *stl="r")\r
        {       mgl_polygon(gr, p1.x, p1.y, p1.z, p2.x, p2.y, p2.z, n,stl);     }\r
        /// Draws the arc around axis pr with center at p0 and starting from p1, by color stl and angle a (in degrees)\r
-       inline void Arc(mglPoint p0, mglPoint pr, mglPoint p1, double a, const char *stl="r")\r
-       {       mgl_arc_ext(gr, p0.x,p0.y,p0.z, pr.x,pr.y,pr.z, p1.x,p1.y,p1.z, a,stl); }\r
+       inline void Arc(mglPoint p0, mglPoint pa, mglPoint p1, double a, const char *stl="r")\r
+       {       mgl_arc_ext(gr, p0.x,p0.y,p0.z, pa.x,pa.y,pa.z, p1.x,p1.y,p1.z, a,stl); }\r
        /// Draws the arc around axis 'z' with center at p0 and starting from p1, by color stl and angle a (in degrees)\r
        inline void Arc(mglPoint p0, mglPoint p1, double a, const char *stl="r")\r
        {       mgl_arc_ext(gr, p0.x,p0.y,p0.z, 0,0,1, p1.x,p1.y,p0.z, a,stl);  }\r
@@ -651,6 +680,13 @@ public:
        inline void Logo(const char *fname, bool smooth=false, const char *opt="")\r
        {       mgl_logo_file(gr, fname, smooth, opt);  }\r
 \r
+       /// Draw user-defined symbol in position p\r
+       inline void Symbol(mglPoint p, char id, const char *how="", double size=-1)\r
+       {       mgl_symbol(gr, p.x, p.y, p.z, id, how, size);   }\r
+       /// Draw user-defined symbol in position p along direction d\r
+       inline void Symbol(mglPoint p, mglPoint d, char id, const char *how="", double size=-1)\r
+       {       mgl_symbol_dir(gr, p.x, p.y, p.z, d.x, d.y, d.z, id, how, size);        }\r
+\r
        /// Print text in position p with specified font\r
        inline void Putsw(mglPoint p,const wchar_t *text,const char *font=":C",double size=-1)\r
        {       mgl_putsw(gr, p.x, p.y, p.z, text, font, size); }\r
@@ -1247,6 +1283,14 @@ public:
        /** Style 'x' draw belts in x-direction. */\r
        inline void Belt(const mglDataA &z, const char *stl="", const char *opt="")\r
        {       mgl_belt(gr, &z, stl, opt);     }\r
+       /// Draw belts for 2d data specified parametrically with color proportional to c\r
+       /** Style 'x' draw belts in x-direction. */\r
+       inline void BeltC(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &c, const char *stl="", const char *opt="")\r
+       {       mgl_beltc_xy(gr, &x, &y, &z, &c, stl, opt);     }\r
+       /// Draw belts for 2d data with color proportional to c\r
+       /** Style 'x' draw belts in x-direction. */\r
+       inline void BeltC(const mglDataA &z, const mglDataA &c, const char *stl="", const char *opt="")\r
+       {       mgl_beltc(gr, &z, &c, stl, opt);        }\r
 \r
        /// Draw surface for 2d data specified parametrically with color proportional to z\r
        /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/\r
@@ -1264,6 +1308,9 @@ public:
        inline void Grid(const mglDataA &z, const char *stl="", const char *opt="")\r
        {       mgl_grid(gr, &z, stl, opt);     }\r
 \r
+       /// Draw vertical tiles with manual colors c for 2d data specified parametrically\r
+       inline void Tile(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &c, const char *stl="", const char *opt="")\r
+       {       mgl_tile_xyc(gr, &x, &y, &z, &c, stl, opt);     }\r
        /// Draw vertical tiles for 2d data specified parametrically\r
        inline void Tile(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *stl="", const char *opt="")\r
        {       mgl_tile_xy(gr, &x, &y, &z, stl, opt);  }\r
@@ -1289,6 +1336,19 @@ public:
        inline void Boxs(const mglDataA &z, const char *stl="", const char *opt="")\r
        {       mgl_boxs(gr, &z, stl, opt);     }\r
 \r
+       /// Draw contour lines on parametric surface at manual levels for 2d data specified parametrically\r
+       /** Style ‘f’ to draw solid contours.\r
+        * Style 't'/'T' draw contour labels below/above contours.*/\r
+       inline void ContP(const mglDataA &v, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", const char *opt="")\r
+       {       mgl_contp_val(gr, &v, &x, &y, &z, &a, sch, opt);        }\r
+       /// Draw contour lines on parametric surface at manual levels for 2d data specified parametrically\r
+       /** Style ‘f’ to draw solid contours.\r
+        * Style ‘t’/‘T’ draw contour labels below/above contours.\r
+        * Option "value" set the number of contour levels (default is 7). */\r
+       inline void ContP(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", const char *opt="")\r
+       {       mgl_contp(gr, &x, &y, &z, &a, sch, opt);        }\r
+\r
+\r
        /// Draw contour lines at manual levels for 2d data specified parametrically\r
        /** Style ‘_’ to draw contours at bottom of axis box.\r
         * Style 't'/'T' draw contour labels below/above contours.*/\r
@@ -1509,6 +1569,9 @@ public:
        inline void Beam(double val, const mglDataA &tr, const mglDataA &g1, const mglDataA &g2, const mglDataA &a, double r, const char *stl=NULL, int flag=0)\r
        {       mgl_beam_val(gr,val,&tr,&g1,&g2,&a,r,stl,flag); }\r
 \r
+       /// Draw vertical tiles with variable size r and manual colors c for 2d data specified parametrically\r
+       inline void TileS(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &r, const mglDataA &c, const char *stl="", const char *opt="")\r
+       {       mgl_tiles_xyc(gr, &x, &y, &z, &r, &c, stl, opt);        }\r
        /// Draw vertical tiles with variable size r for 2d data specified parametrically\r
        inline void TileS(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &r, const char *stl="", const char *opt="")\r
        {       mgl_tiles_xy(gr, &x, &y, &z, &r, stl, opt);     }\r
@@ -2136,6 +2199,8 @@ public:
 class MGL_EXPORT mglParse\r
 {\r
        HMPR pr;\r
+       mglParse &operator=(mglParse &p)\r
+       {       pr = p.pr;      mgl_use_parser(pr,1);   return p;       }\r
 public:\r
        mglParse(HMPR p)                {       pr = p;         mgl_use_parser(pr,1);   }\r
        mglParse(mglParse &p)   {       pr = p.pr;      mgl_use_parser(pr,1);   }\r
@@ -2174,7 +2239,7 @@ public:
        /// Return description of MGL command\r
        inline const char *CmdDesc(const char *name)\r
        {       return mgl_parser_cmd_desc(pr, name);   }\r
-       /// Get name of command with nmber n\r
+       /// Get name of command with number n\r
        inline const char *GetCmdName(long n)\r
        {       return mgl_parser_cmd_name(pr,n);       }\r
        /// Get number of defined commands\r
@@ -2188,6 +2253,9 @@ public:
        {       mgl_rk_step(pr, eqs, vars, dt); }\r
        inline void RK_Step(const wchar_t *eqs, const wchar_t *vars, mreal dt=1)\r
        {       mgl_rk_step_w(pr, eqs, vars, dt);       }\r
+       // Open all data arrays from HDF file and assign it as variables of parser p\r
+       inline void OpenHDF(const char *fname)\r
+       {       mgl_parser_openhdf(pr, fname);  }\r
 \r
        /// Set value for parameter $N\r
        inline void AddParam(int id, const char *str)\r
@@ -2204,6 +2272,12 @@ public:
        inline void AllowDllCall(bool allow)    {       mgl_parser_allow_dll_call(pr, allow);   }\r
        /// Set flag to stop script parsing\r
        inline void Stop()      {       mgl_parser_stop(pr);    }\r
+       /// Set variant of argument(s) separated by '?' to be used in further commands\r
+       inline void SetVariant(int var=0)\r
+       {       mgl_parser_variant(pr, var);    }\r
+       /// Set starting object ID\r
+       inline void     StartID(int id=0)\r
+       {       mgl_parser_start_id(pr, id);    }\r
 \r
        /// Return result of formula evaluation\r
        inline mglData Calc(const char *formula)\r
@@ -2241,6 +2315,14 @@ public:
        inline void DeleteVar(const wchar_t *name)      {       mgl_parser_del_varw(pr, name);          }\r
        /// Delete all data variables\r
        void DeleteAll()        {       mgl_parser_del_all(pr); }\r
+\r
+       /// Get constant with given id. Can be NULL if not found.\r
+       /// NOTE !!! You must not delete obtained data arrays !!!\r
+       inline mglNum *GetConst(unsigned long id)\r
+       {       return mgl_parser_get_const(pr,id);     }\r
+       /// Get number of constants\r
+       inline long GetNumConst()\r
+       {       return mgl_parser_num_const(pr);        }\r
 };\r
 //-----------------------------------------------------------------------------\r
 #endif\r
index a0d0080f5d25cc1cdabf55c8d9ace9edbaffd67f..66d3f16f35d37bd99d019b35a19d21a65130449a 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * mgl_cf.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
index 79aacb0796a34f00c56f452943853f361f725762..1ad2145e942bba5aa0bf5ab6532b8f31d96c1f06 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * mpi.h is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU General Public License as published by  *\r
index beae2f6f5f66443ad9cd57a02afff2b9ac6dc487..98cf1f469b2e2efd8d7a76f4ab74b508d825b1a7 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * opengl.h is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -56,7 +56,8 @@ protected:
        void quad_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3, const mglPnt &p4, const mglDrawReg *d);\r
        void pnt_draw(const mglPnt &p, const mglDrawReg *d);\r
        void mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d);\r
-\r
+       void glyph_fill(mreal phi, const mglPnt &p, mreal f, const mglGlyph &g, const mglDrawReg *d);\r
+       \r
        unsigned char **GetRGBLines(long &w, long &h, unsigned char *&f, bool solid=true);\r
        void LightScale(const mglMatrix *M);\r
 \r
index 4d1675cc8acceee234a45a56e2f3002ddcdd1541..c299ba7b731741d08ec6b8fb6660592638dd9821 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * other.h is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
index f952074c2f090e7a3d84dbdaf6df74bc9bb8b001..ccf27c99501d9b5b5bfbe91e965e0f2ce068098b 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * parser.h is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -22,7 +22,6 @@
 \r
 #ifdef __cplusplus\r
 #include "mgl2/mgl.h"\r
-#include <string>\r
 #if MGL_HAVE_LTDL\r
 #include <ltdl.h>\r
 #endif\r
@@ -47,22 +46,13 @@ struct mglCommand
        const char *form;       ///< Format of command arguments (can be NULL)\r
        /// Function for executing (plotting)\r
        int (*exec)(mglGraph *gr, long n, mglArg *a, const char *k, const char *opt);\r
-       /// Type of command: 0 - data plot, 1 - other plot,\r
+       /// Type of command: 0 - special plot, 1 - other plot,\r
        ///     2 - setup, 3 - data handle, 4 - data create, 5 - subplot, 6 - program\r
        ///     7 - 1d plot, 8 - 2d plot, 9 - 3d plot, 10 - dd plot, 11 - vector plot\r
        ///     12 - axis, 13 - primitives, 14 - axis setup, 15 - text/legend, 16 - data transform\r
        int type;\r
 };\r
-extern mglCommand mgls_base_cmd[];\r
-//-----------------------------------------------------------------------------\r
-/// Structure for the number handling (see mglParse class).\r
-struct mglNum\r
-{\r
-       mreal d;                ///< Number itself\r
-       dual c;\r
-       std::wstring s; ///< Number name\r
-       mglNum(mreal val=0):d(val),c(val)       {}\r
-};\r
+extern mglCommand mgls_prg_cmd[], mgls_dat_cmd[], mgls_grf_cmd[], mgls_set_cmd[], mgls_prm_cmd[];\r
 //-----------------------------------------------------------------------------\r
 /// Structure for function name and position.\r
 struct mglFunc\r
@@ -73,6 +63,8 @@ struct mglFunc
        mglFunc(long p, const wchar_t *f);\r
        mglFunc(const mglFunc &f):pos(f.pos),narg(f.narg),func(f.func)  {}\r
        mglFunc():pos(-1),narg(-1)      {}\r
+       const mglFunc &operator=(const mglFunc &f)\r
+       {       pos=f.pos;      narg=f.narg;    func=f.func;    return f;       }\r
 };\r
 //-----------------------------------------------------------------------------\r
 /// Structure for stack of functions and its arguments.\r
@@ -103,6 +95,7 @@ public:
        mglCommand *Cmd;        ///< Table of MGL commands (can be changed by user). It MUST be sorted by 'name'!!!\r
        long InUse;                     ///< Smart pointer (number of users)\r
        const mglBase *curGr;   ///< Current grapher\r
+       int StarObhID;          ///< staring object id\r
 \r
        mglParser(bool setsize=false);\r
        virtual ~mglParser();\r
@@ -153,7 +146,7 @@ public:
        void AddParam(int n, const char *str);\r
        void AddParam(int n, const wchar_t *str);\r
        /// Add new MGL command(s) (last command MUST HAVE name[0]=0 !!!)\r
-       void AddCommand(mglCommand *cmd, int num=0);\r
+       void AddCommand(const mglCommand *cmd);\r
        /// Restore Once flag\r
        inline void RestoreOnce()       {       Once = true;    }\r
        /// Delete variable by its name\r
@@ -161,6 +154,11 @@ public:
        void DeleteVar(const wchar_t *name);\r
        /// Delete all data variables\r
        void DeleteAll();\r
+       /// Set variant of argument(s) separated by '?' to be used\r
+       inline void SetVariant(int var=0)       {       Variant = var<=0?0:var; }\r
+protected:\r
+       static mglCommand *BaseCmd;     ///< Base table of MGL commands. It MUST be sorted by 'name'!!!\r
+       static void FillBaseCmd();      ///< Fill BaseCmd at initialization stage\r
 private:\r
 //     long parlen;            ///< Length of parameter strings\r
        std::wstring par[40];   ///< Parameter for substituting instead of $1, ..., $9\r
@@ -175,7 +173,8 @@ private:
        mglData *fval;          ///< Values for for-cycle. Note that nx - number of elements, ny - next element, nz - address (or string number) of first cycle command\r
        int for_stack[40];      ///< The order of for-variables\r
        int for_addr;           ///< Flag for saving address in variable (for_addr-1)\r
-       bool for_br;            ///< Break is switched on (skip all comands until 'next')\r
+       bool for_br;            ///< Break is switched on (skip all commands until 'next')\r
+       unsigned Variant;       ///< Select variant of argument(s) separated by '?'\r
 \r
        /// Parse command\r
        int Exec(mglGraph *gr, const wchar_t *com, long n, mglArg *a, const std::wstring &var, const wchar_t *opt);\r
index f358ce7488f91247a4a327a9d08bdee0383e6e26..6b59eb4483b208cd1fba807f60024c41069243a6 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************
  * pde.h is part of Math Graphic Library
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   it under the terms of the GNU Library General Public License as       *
@@ -62,6 +62,8 @@ uintptr_t MGL_EXPORT mgl_qo3d_solve_(const char *ham, uintptr_t* ini_re, uintptr
 HMDT MGL_EXPORT mgl_ode_solve(void (*func)(const mreal *x, mreal *dx, void *par), int n, const mreal *x0, mreal dt, mreal tmax, void *par);
 /// Saves result of ODE solving for var variables with right part func (separated by ';') and initial conditions x0 over time interval [0,tmax] with time step dt
 HMDT MGL_EXPORT mgl_ode_solve_str(const char *func, const char *var, HCDT x0, mreal dt, mreal tmax);
+/// Saves result of ODE solving for var complex variables with right part func (separated by ';') and initial conditions x0 over time interval [0,tmax] with time step dt
+HADT MGL_EXPORT mgl_ode_solve_str_c(const char *func, const char *var, HCDT x0, mreal dt, mreal tmax);
 /// Saves result of ODE solving of n equations with right part func and initial conditions x0 over time interval [0,tmax] with time step dt. Function bord (if not NULL) is called each time step to apply border reflection.
 HMDT MGL_EXPORT mgl_ode_solve_ex(void (*func)(const mreal *x, mreal *dx, void *par), int n, const mreal *x0, mreal dt, mreal tmax, void *par, void (*bord)(mreal *x, const mreal *xp, void *par));
 /// Finds ray with starting point r0, p0 (and prepares ray data for mgl_qo2d_solve)
index fe7a59d65d4a04573d2039698245715ad2c1f4d1..90312dfb95766166fedde201ffacd9d7a7d03b2e 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * plot.h is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
index d6959b0ba97b396a467e63202f544f013494e098..102a76c778821dc344038ccd22ea99034cb0bc34 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * prim.h is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -148,6 +148,13 @@ void MGL_EXPORT mgl_puts_dir(HMGL graph, double x, double y, double z, double dx
 void MGL_EXPORT mgl_puts_dir_(uintptr_t *graph, mreal *x, mreal *y, mreal *z, mreal *dx, mreal *dy, mreal *dz, const char *text, const char *font, mreal *size, int, int);\r
 void MGL_EXPORT mgl_putsw_dir(HMGL graph, double x, double y, double z, double dx, double dy, double dz, const wchar_t *text, const char *font, double size);\r
 \r
+/// Draw user-defined symbol in position p\r
+void MGL_EXPORT mgl_symbol(HMGL gr, double x, double y, double z, char id, const char *how, double size);\r
+void MGL_EXPORT mgl_symbol_(uintptr_t *gr, double *x, double *y, double *z, char *id, const char *how, double *size,int,int);\r
+/// Draw user-defined symbol in position p along direction d\r
+void MGL_EXPORT mgl_symbol_dir(HMGL gr, double x, double y, double z, double dx, double dy, double dz, char id, const char *how, double size);\r
+void MGL_EXPORT mgl_symbol_dir_(uintptr_t *gr, double *x, double *y, double *z, double *dx, double *dy, double *dz, char *id, const char *how, double *size,int,int);\r
+\r
 /// Draw textual marks with size r at points {x,y,z}\r
 void MGL_EXPORT mgl_textmark_xyzr(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT r, const char *text, const char *fnt, const char *opt);\r
 void MGL_EXPORT mgl_textmark_xyzr_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *r, const char *text, const char *fnt, const char *opt,int,int,int);\r
@@ -237,6 +244,16 @@ void MGL_EXPORT mgl_bifurcation_str(HMGL gr, double dx, const char *f, const cha
 void MGL_EXPORT mgl_bifurcation_dat_(uintptr_t *gr, double *dx, uintptr_t *f, const char *stl, const char *opt, int,int);\r
 void MGL_EXPORT mgl_bifurcation_str_(uintptr_t *gr, double *dx, const char *f, const char *stl, const char *opt, int,int,int);\r
 \r
+/// Draws Iris plots for determining cross-dependences of data arrays\r
+/** NOTE: using the same ranges and empty ids will not draw axis. This will add data to existing Iris plot.\r
+ *     Option value set the size of data labels ids, separated by ';'.*/\r
+void MGL_EXPORT mgl_iris(HMGL gr, HCDT dats, HCDT ranges, const char *ids, const char *stl, const char *opt);\r
+void MGL_EXPORT mgl_iris_1(HMGL gr, HCDT dats, const char *ids, const char *stl, const char *opt);\r
+void MGL_EXPORT mgl_irisw(HMGL gr, HCDT dats, HCDT ranges, const wchar_t *ids, const char *stl, const char *opt);\r
+void MGL_EXPORT mgl_irisw_1(HMGL gr, HCDT dats, const wchar_t *ids, const char *stl, const char *opt);\r
+void MGL_EXPORT mgl_iris_(uintptr_t *gr, uintptr_t *dats, uintptr_t *ranges, const char *ids, const char *stl, const char *opt,int l,int m,int n);\r
+void MGL_EXPORT mgl_iris_1_(uintptr_t *gr, uintptr_t *dats, const char *ids, const char *stl, const char *opt,int,int,int);\r
+\r
 #ifdef __cplusplus\r
 }\r
 #endif\r
index 79ed1574890b7133ec2d8fed9c851186fa5d98bb..228ddc513c797014bf9338028de30a9d8265c05a 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * qmathgl.h is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
 #ifndef _MGL_QMATHGL_H_\r
 #define _MGL_QMATHGL_H_\r
 //-----------------------------------------------------------------------------\r
-#include <string>\r
+#include <mgl2/wnd.h>\r
 #include <QWidget>\r
 #include <QPixmap>\r
-#include <mgl2/wnd.h>\r
 //-----------------------------------------------------------------------------\r
 class QTextEdit;\r
 class QMenu;\r
@@ -66,7 +65,8 @@ public:
        inline mglDraw *getClass()\r
        {       mglDraw *d=0;\r
                if(draw_func==mgl_draw_class)   d = (mglDraw*)draw_par;\r
-               if(draw)        d = draw;       return d;       }\r
+               if(draw)        d = draw;\r
+               return d;       }\r
 \r
        int getPer() const      {return int(per);}      ///< Get perspective value\r
        int getPhi() const      {return int(phi);}      ///< Get Phi-angle value\r
@@ -206,7 +206,6 @@ protected:
        bool dotsRefr;          ///< Set dots for image preview/rotation\r
        mreal x1,x2,y1,y2;      ///< Zoom in region\r
        mreal ax1,ax2,ay1,ay2;  ///< Axis range zoom\r
-       bool showMessage;       ///< Flag for showing messages (enabled by each execute())\r
        QMenu *popup;           ///< Pointer to pop-up menu\r
        QTimer *timer;          ///< Timer for animation\r
        QTimer *timerRefr;      ///< Timer for redrawing\r
@@ -229,11 +228,20 @@ class MGL_EXPORT mglDrawScript : public mglDraw
 public:\r
        HMPR par;               ///< Parser to be used\r
        QString text;   ///< Script to be drawn\r
-       long line;              ///< Line which will be highlited\r
+       long line;              ///< Line which will be highlighted\r
        mglDrawScript(HMPR p):mglDraw() {       par=p;  line=-1;        }\r
        virtual ~mglDrawScript() {}\r
        int Draw(mglGraph *gr)\r
-       {       gr->Highlight(line+1);  mgl_parse_textw(gr->Self(),par,text.toStdWString().c_str());    return 0;       }\r
+       {\r
+               wchar_t *wtext;\r
+               wtext = new wchar_t[text.size()+1];\r
+               text.toWCharArray(wtext);\r
+               wtext[text.size()] = 0;\r
+               gr->Highlight(line + 1);\r
+               mgl_parse_textw(gr->Self(), par, wtext);\r
+               delete[] wtext;\r
+               return 0;\r
+       }\r
 };\r
 //-----------------------------------------------------------------------------\r
 /// Convert bitmap from mglCanvasWnd to QPixmap\r
index 58ef70d1768de575886bb5b9990c4d0d381cd42c..09bc0dc75693731c706868c8b677907d5a4249ce 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * qt.h is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -30,6 +30,8 @@ uintptr_t MGL_EXPORT mgl_create_graph_qt_(const char *title, int);
 /// Run main Qt loop for event handling.\r
 int MGL_EXPORT mgl_qt_run();\r
 int MGL_EXPORT mgl_qt_run_();\r
+/// Return pointer to widget (QMathGL*) used for plotting\r
+MGL_EXPORT void *mgl_qt_widget(HMGL gr);\r
 #ifdef __cplusplus\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -38,7 +40,7 @@ int MGL_EXPORT mgl_qt_run_();
 /// Wrapper class for windows displaying graphics\r
 class MGL_EXPORT mglQT : public mglWnd\r
 {\r
-       mglQT(const mglQT &t) {}        // copying is not allowed\r
+       mglQT(const mglQT &) {} // copying is not allowed\r
        const mglQT &operator=(const mglQT &t)  {       return t;       }\r
 public:\r
        mglQT(const char *title="MathGL") : mglWnd()\r
@@ -52,6 +54,8 @@ public:
                mgl_set_click_func(gr, mgl_click_class);        }\r
        virtual ~mglQT() {}\r
        int Run()       {       return mgl_qt_run();    }       ///< Run main loop for event handling\r
+       /// Return pointer to widget (QMathGL*) used for plotting\r
+       void *Widget()  {       return mgl_qt_widget(gr);       }\r
 };\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_ask_qt(const wchar_t *quest, wchar_t *res);\r
index 43f35b45f9eb1947ddb43a4054643161ef8cc9b0..c8283548ee88a4b6dce4229a0882f3fbc3cc2b13 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * surf.h is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -66,6 +66,15 @@ void MGL_EXPORT mgl_belt_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintp
 void MGL_EXPORT mgl_belt(HMGL graph, HCDT z, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_belt_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int);\r
 \r
+/// Draw belts for 2d data specified parametrically with color proportional to c\r
+/** Style 'x' draw belts in x-direction. */\r
+void MGL_EXPORT mgl_beltc_xy(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt);\r
+void MGL_EXPORT mgl_beltc_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int);\r
+/// Draw belts for 2d data with color proportional to c\r
+/** Style 'x' draw belts in x-direction. */\r
+void MGL_EXPORT mgl_beltc(HMGL graph, HCDT z, HCDT c, const char *sch, const char *opt);\r
+void MGL_EXPORT mgl_beltc_(uintptr_t *graph, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int);\r
+\r
 /// Draw surface for 2d data specified parametrically with color proportional to z\r
 /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/\r
 void MGL_EXPORT mgl_surf_xy(HMGL graph, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt);\r
@@ -93,16 +102,22 @@ void MGL_EXPORT mgl_boxs_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintp
 void MGL_EXPORT mgl_boxs(HMGL graph, HCDT z, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_boxs_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int);\r
 \r
+/// Draw vertical tiles with manual colors c for 2d data specified parametrically\r
+void MGL_EXPORT mgl_tile_xyc(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt);\r
+void MGL_EXPORT mgl_tile_xyc_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int);\r
 /// Draw vertical tiles for 2d data specified parametrically\r
 void MGL_EXPORT mgl_tile_xy(HMGL graph, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt);\r
-void MGL_EXPORT mgl_tile_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *a, const char *sch, const char *opt,int,int);\r
+void MGL_EXPORT mgl_tile_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int);\r
 /// Draw vertical tiles for 2d data\r
 void MGL_EXPORT mgl_tile(HMGL graph, HCDT z, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_tile_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int);\r
 \r
+/// Draw vertical tiles with variable size r and manual colors c for 2d data specified parametrically\r
+void MGL_EXPORT mgl_tiles_xyc(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT r, HCDT c, const char *sch, const char *opt);\r
+void MGL_EXPORT mgl_tiles_xyc_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *r, uintptr_t *c, const char *sch, const char *opt,int,int);\r
 /// Draw vertical tiles with variable size r for 2d data specified parametrically\r
 void MGL_EXPORT mgl_tiles_xy(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT r, const char *sch, const char *opt);\r
-void MGL_EXPORT mgl_tiles_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int);\r
+void MGL_EXPORT mgl_tiles_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *r, const char *sch, const char *opt,int,int);\r
 /// Draw vertical tiles with variable size r for 2d data\r
 void MGL_EXPORT mgl_tiles(HMGL graph, HCDT z, HCDT r, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_tiles_(uintptr_t *graph, uintptr_t *z, uintptr_t *r, const char *sch, const char *opt,int,int);\r
index f8c3db52d0c6d408d51fdbc46c8d3815e71e437c..537c9b0bc478f8593e042a432d81f8bfe1e53a0c 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************
  * thread.h is part of Math Graphic Library
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   it under the terms of the GNU Library General Public License as       *
index d441ec13bd4f87afd8789cfe7ea851f4bedd5c73..7028484c23dac6c403e21bd0816aadb4885bc160 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************
  * type.h is part of Math Graphic Library
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   it under the terms of the GNU Library General Public License as       *
@@ -64,9 +64,9 @@ inline mglPoint operator-(const mglPoint &a, const mglPoint &b)
 inline mglPoint operator-(const mglPoint &a)
 {      return mglPoint(-a.x, -a.y, -a.z, -a.c);        }
 inline mglPoint operator*(mreal b, const mglPoint &a)
-{      return mglPoint(a.x*b, a.y*b, a.z*b);   }
+{      return mglPoint(a.x*b, a.y*b, a.z*b, a.c*b);    }       // TODO check conficts of a.c*b!!!
 inline mglPoint operator*(const mglPoint &a, mreal b)
-{      return mglPoint(a.x*b, a.y*b, a.z*b);   }
+{      return mglPoint(a.x*b, a.y*b, a.z*b, a.c*b);    }       // TODO check conficts of a.c*b!!!
 inline mglPoint operator/(const mglPoint &a, mreal b)
 {      return mglPoint(a.x/b, a.y/b, a.z/b);   }
 inline mreal operator*(const mglPoint &a, const mglPoint &b)
@@ -81,10 +81,10 @@ inline mglPoint operator^(const mglPoint &a, const mglPoint &b)
 {      return mglPoint(a.y*b.z-a.z*b.y, a.z*b.x-a.x*b.z, a.x*b.y-a.y*b.x);     }
 inline mglPoint operator!(const mglPoint &a)
 {      mreal f=mgl_hypot(a.x,a.y);     return f==0?mglPoint(0.,1.,0.):mglPoint(-a.y/f, a.x/f, 0);      }
-inline bool operator==(const mglPoint &a, const mglPoint &b)
+inline bool operator==(const mglPoint &a, const mglPoint &b)   // NOTE: exact comparison is used here
 {      return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z)+(a.c-b.c)*(a.c-b.c)==0;      }
 //{    return !memcmp(&a, &b, sizeof(mglPoint));       }
-inline bool operator!=(const mglPoint &a, const mglPoint &b)
+inline bool operator!=(const mglPoint &a, const mglPoint &b)   // NOTE: exact comparison is used here
 {      return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z)+(a.c-b.c)*(a.c-b.c)!=0;      }
 //{    return memcmp(&a, &b, sizeof(mglPoint));        }
 inline bool operator<(const mglPoint &a, const mglPoint &b)
@@ -121,7 +121,8 @@ struct MGL_EXPORT mglColor
        /// Set color as Red, Green, Blue values
        void Set(mglColor c, float bright=1)
        {
-               if(bright<0)    bright=0;       if(bright>2.f)  bright=2.f;
+               if(bright<0)    bright=0;
+               if(bright>2.f)  bright=2.f;
                r = bright<=1 ? c.r*bright : 1 - (1-c.r)*(2-bright);
                g = bright<=1 ? c.g*bright : 1 - (1-c.g)*(2-bright);
                b = bright<=1 ? c.b*bright : 1 - (1-c.b)*(2-bright);    a = 1;
@@ -143,10 +144,10 @@ struct MGL_EXPORT mglColor
        inline const mglColor &operator=(const mglColor &p)
        {       r=p.r;  g=p.g;  b=p.b;  a=p.a;  return p;       }
        /// Copy color from other one
-       inline bool operator==(const mglColor &c) const
+       inline bool operator==(const mglColor &c) const // NOTE: exact comparison is used here
        {       return (r-c.r)*(r-c.r)+(g-c.g)*(g-c.g)+(b-c.b)*(b-c.b)+(a-c.a)*(a-c.a)==0;      }
 //     {       return !memcmp(this, &c, sizeof(mglColor));     }
-       inline bool operator!=(const mglColor &c) const
+       inline bool operator!=(const mglColor &c) const // NOTE: exact comparison is used here
        {       return (r-c.r)*(r-c.r)+(g-c.g)*(g-c.g)+(b-c.b)*(b-c.b)+(a-c.a)*(a-c.a)!=0;      }
 //     {       return memcmp(this, &c, sizeof(mglColor));              }
        inline bool operator<(const mglColor &c) const
index 388c0e077c851a2821db6f8b25cfa1d3b489fa74..120fd300b03758699108a7e83eefca311c2e6f02 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * vect.h is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
index d5ee4bc695993a64a77d29480361dd0107222c48..c5efca9835e7df45f7065311acd1f1c6b7ceb105 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * volume.h is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
index 00d52948d4970e7f438fc0b673ec7b833c208920..d20f3484fe18b3487dce7756fbb6dd718d84ce75 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * window.h is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
index ad496e72e0a5b12d00d2ae70c2bff0925f42c3d7..4e4c456a377b77b780dff8e9855939fa0e6a6d92 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * wnd.h is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -33,7 +33,7 @@ public:
        virtual void Reload(){}         ///< Function for reloading data\r
        virtual void Click() {}         ///< Callback function on mouse click\r
 #if MGL_HAVE_PTHR_WIDGET\r
-       mglDraw()       {       running=false;  pthread_mutex_init(&mutex,NULL);        }\r
+       mglDraw()       {       running=false;  pthread_mutex_init(&mutex,NULL);        thr=0;  }\r
        virtual ~mglDraw()      {       pthread_mutex_destroy(&mutex);  }\r
 \r
        virtual void Calc()     {}              ///< Function for calculations\r
@@ -56,7 +56,7 @@ public:
        pthread_t thr;\r
        bool running;\r
        pthread_mutex_t mutex;\r
-       \r
+\r
 #else\r
        mglDraw() {}\r
        virtual ~mglDraw() {}\r
@@ -74,12 +74,14 @@ void MGL_EXPORT mgl_reload_class(void *p);
 /// Abstract class for windows displaying graphics\r
 class MGL_EXPORT mglWnd : public mglGraph\r
 {\r
-       mglWnd(const mglWnd &t) {}      // copying is not allowed\r
+       mglWnd(const mglWnd &) {}       // copying is not allowed\r
        const mglWnd &operator=(const mglWnd &t)        {       return t;       }\r
 public:\r
        mglWnd() : mglGraph(-1) {}\r
        virtual ~mglWnd() {     mgl_use_graph(gr,-255); }\r
        virtual int Run()=0;            ///< Run main loop for event handling\r
+       /// Return pointer to widget used for plotting\r
+       virtual void *Widget()  {       return NULL;    }\r
 \r
        inline void ToggleAlpha()       ///< Switch on/off transparency (do not overwrite user settings)\r
        {       mgl_wnd_toggle_alpha(gr);       }\r
index 911fda4a8be899a6074204f21f3b4d16b97dec2c..b7d208ed62d60d06667e49a527dcf307b39b708e 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * wx.h.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -127,7 +127,6 @@ protected:
        bool zoom;                      ///< Mouse zoom state\r
        bool rotate;            ///< Mouse rotation state\r
        mreal x1,x2,y1,y2;      ///< Zoom in region\r
-       bool showMessage;       ///< Flag for showing messages (enabled by each execute())\r
        wxMenu *popup;          ///< Pointer to pop-up menu\r
        wxTimer *timer;         ///< Timer for animation\r
        DECLARE_EVENT_TABLE()\r
index 32fa3f07cdae98301ab83f162338092cd4877b31..0ef1541df84d8ef4d2721ce664bdaa07a2b4a27d 100644 (file)
@@ -4,6 +4,7 @@
 #include <QDebug>
 #include "Backend.hpp"
 #include <mgl2/mgl.h>
+#undef sprintf // fix libintl bug of defining sprintf
 //-----------------------------------------------------------------------------
 Backend::Backend(QObject *parent) : QObject(parent) { }
 //-----------------------------------------------------------------------------
@@ -11,13 +12,17 @@ QString Backend::show(const QString& text) const
 {
        qDebug() << __FUNCTION__;
        const char *tmp = tmpnam(0);
+       wchar_t *wtext;
        mglGraph gr;
        gr.SetFaceNum(200);
        mglParse pr;
        pr.AllowSetSize(true);
-       setlocale(LC_CTYPE, "");
-       setlocale(LC_NUMERIC, "C");
-       pr.Execute(&gr,text.toStdWString().c_str());
+       setlocale(LC_ALL, "");  setlocale(LC_NUMERIC, "C");
+       wtext = new wchar_t[text.size()+1];
+       text.toWCharArray(wtext);
+       wtext[text.size()] = 0;
+       pr.Execute(&gr,wtext);
+       delete[] wtext;
        gr.WriteJSON(tmp);
        setlocale(LC_NUMERIC, "");
 
@@ -32,13 +37,17 @@ QString Backend::show(const QString& text) const
 //-----------------------------------------------------------------------------
 QString Backend::coor(const QString& xy, const QString& text) const
 {
+       wchar_t *wtext;
        qDebug() << __FUNCTION__;
        mglGraph gr;
        mglParse pr;
        pr.AllowSetSize(true);
-       setlocale(LC_CTYPE, "");
-       setlocale(LC_NUMERIC, "C");
-       pr.Execute(&gr,text.toStdWString().c_str());
+       setlocale(LC_ALL, "");  setlocale(LC_NUMERIC, "C");
+       wtext = new wchar_t[text.size()+1];
+       text.toWCharArray(wtext);
+       wtext[text.size()] = 0;
+       pr.Execute(&gr,wtext);
+       delete[] wtext;
        gr.Finish();
 
        int x = (int)xy.section(" ",0,0).toDouble();
@@ -54,15 +63,19 @@ QString Backend::geometry(const QString& mgl) const
 {
        qDebug() << __FUNCTION__;
        const char *tmp = tmpnam(0);
+       wchar_t *wmgl;
        mglGraph gr;
 #if 0
        gr.SetFaceNum(200);
 #endif
        mglParse pr;
        pr.AllowSetSize(true);
-       setlocale(LC_CTYPE, "");
-       setlocale(LC_NUMERIC, "C");
-       pr.Execute(&gr,mgl.toStdWString().c_str());
+       setlocale(LC_ALL, "");  setlocale(LC_NUMERIC, "C");
+       wmgl = new wchar_t[mgl.size()+1];
+       mgl.toWCharArray(wmgl);
+       wmgl[mgl.size()] = 0;
+       pr.Execute(&gr,wmgl);
+       delete[] wmgl;
        gr.WriteJSON(tmp);
        setlocale(LC_NUMERIC, "");
 
index 33081d65c68d7ca6289c20a671206873b8ec4b5d..3ebb08e97c7104422aebdeba771b1687f723b7ce 100644 (file)
@@ -2,6 +2,9 @@
 
 #include <QObject>
 #include <QStringList>
+#if defined(_MSC_VER)
+#include <mgl2/define.h>
+#endif
 
 class Backend : public QObject
 {
index 5979d6ca14c7ffbc71d3d3a8223fc5ef693c1260..8e501498470324826d61bfe8f4282fe752ba1908 100644 (file)
@@ -1,24 +1,54 @@
+if(enable-qt5)
+       include(../scripts/qt5.cmake)
+
+       find_qt5_libs(OFF ON Network)
+       if(TARGET Qt5::Network)
+               set(MGL_QT5_LIBS ${MGL_QT5_LIBS} Qt5::Network)
+               find_qt5_libs(OFF OFF WebKitWidgets WebEngineWidgets)
+               if(enable-json-sample-we)
+                       if(TARGET Qt5::WebEngineWidgets)
+                               set(MGL_QT5_LIBS ${MGL_QT5_LIBS} Qt5::WebEngineWidgets)
+                               set(mgl_qt_def MGL_USE_QT5_WE)
+                       else(TARGET Qt5::WebEngineWidgets)
+                               message(STATUS "Couldn't find Qt5 WebEngineWidgets library. Trying WebKit.")
+                               set(enable-json-sample-we OFF)
+                       endif(TARGET Qt5::WebEngineWidgets)
+               endif(enable-json-sample-we)
+               if(TARGET Qt5::WebKitWidgets)
+                       set(MGL_QT5_LIBS ${MGL_QT5_LIBS} Qt5::WebKitWidgets)
+               else(TARGET Qt5::WebKitWidgets)
+                       message(STATUS "Couldn't find Qt5 WebKitWidgets library. JSON sample disabled.")
+                       set(enable-json-sample OFF)
+               endif(TARGET Qt5::WebKitWidgets)
+       else(TARGET Qt5::Network)
+               message(STATUS "Couldn't find Qt5 Network library. JSON sample disabled.")
+               set(enable-json-sample OFF)
+       endif(TARGET Qt5::Network)
+else(enable-qt5)
+       include(../scripts/qt4.cmake)
+
+       foreach(mgl_qt4_lib ${MGL_QT4_LIBS_FIND_JSON})
+               if(TARGET Qt4::${mgl_qt4_lib})
+                       set(MGL_QT4_LIBS ${MGL_QT4_LIBS} Qt4::${mgl_qt4_lib})
+               else(TARGET Qt4::${mgl_qt4_lib})
+                       message(STATUS "Couldn't find Qt4 ${mgl_qt4_lib} library. JSON sample disabled.")
+                       set(enable-json-sample OFF)
+               endif(TARGET Qt4::${mgl_qt4_lib})
+       endforeach(mgl_qt4_lib)
+endif(enable-qt5)
+
 if(enable-json-sample)
 
-set(json_src Backend.cpp MainWindow.cpp)
+set(json_src Backend.cpp MainWindow.cpp MainWindow.ui)
 set(json_moc_hdr Backend.hpp MainWindow.hpp)
 
-include_directories(${MathGL_BINARY_DIR}/json)
-if(enable-qt5)
-       include(../cmake-qt5.txt)
-       qt5_wrap_ui(json_ui_src MainWindow.ui)
-else(enable-qt5)
-       include(../cmake-qt4.txt)
-       qt4_wrap_ui(json_ui_src MainWindow.ui)
-endif(enable-qt5)
-add_executable(MglForJsTestBench ${json_src} ${json_moc_hdr} ${json_ui_src})
+include_directories(${MathGL2_BINARY_DIR}/json)
+add_executable(MglForJsTestBench ${json_src} ${json_moc_hdr})
 if(enable-qt5)
-       target_compile_definitions(MglForJsTestBench PUBLIC MGL_USE_QT5)
-       target_link_libraries(MglForJsTestBench mgl-qt5)
-       qt5_use_modules(MglForJsTestBench ${MGL_QT5_LIBS})
+       target_compile_definitions(MglForJsTestBench PUBLIC MGL_USE_QT5 ${mgl_qt_def})
+       target_link_libraries(MglForJsTestBench mgl-qt5 ${MGL_QT5_LIBS})
 else(enable-qt5)
-       target_link_libraries(MglForJsTestBench mgl-qt)
-       qt4_use_modules(MglForJsTestBench ${MGL_QT4_LIBS})
+       target_link_libraries(MglForJsTestBench mgl-qt4 ${MGL_QT4_LIBS})
 endif(enable-qt5)
 
 endif(enable-json-sample)
index d6b84c107ceb5db9ba79d08c195d0079bf79b940..5280c1c6cc4cee56316ceae6a9cbb6868504d87b 100644 (file)
@@ -54,7 +54,7 @@ if(enable-python)
        )
        add_custom_target(mgl_python_module ALL DEPENDS _mathgl mathgl.pyc)
 
-       install(FILES ${MathGL_BINARY_DIR}/lang/mathgl.py ${MathGL_BINARY_DIR}/lang/mathgl.pyc DESTINATION ${MGL_PYTHON_SITE_PACKAGES})
+       install(FILES ${MathGL2_BINARY_DIR}/lang/mathgl.py ${MathGL2_BINARY_DIR}/lang/mathgl.pyc DESTINATION ${MGL_PYTHON_SITE_PACKAGES})
        install (TARGETS _mathgl LIBRARY DESTINATION ${MGL_PYTHON_SITE_PACKAGES})
        set(mgl_clean_files ${mgl_clean_files} mathgl.py)
 endif(enable-python)
@@ -71,7 +71,7 @@ if(enable-lua)
        SWIG_LINK_LIBRARIES(mgl-lua mgl ${LUA_LIBRARIES})
        set_target_properties(mgl-lua PROPERTIES PREFIX "" BUILD_WITH_INSTALL_RPATH ON)
 
-       install (TARGETS mgl-lua LIBRARY DESTINATION ${MGL_LIB_INSTALL_DIR})
+       install (TARGETS mgl-lua LIBRARY DESTINATION ${MathGL_INSTALL_LIB_DIR})
 endif(enable-lua)
 
 if(enable-octave)
@@ -105,7 +105,7 @@ if(enable-octave)
 message(STATUS "${oct_prog} ${oct_host} ${oct_api}")
        set(oct_arch ${oct_host}-${oct_api})
        set(pkg_name mathgl)
-       set(mgl_pkg_dir ${MathGL_BINARY_DIR}/lang/${pkg_name}/inst/${oct_arch})
+       set(mgl_pkg_dir ${MathGL2_BINARY_DIR}/lang/${pkg_name}/inst/${oct_arch})
 
        add_compile_options(${oct_inc})
        SET(SWIG_MODULE_mgl-oct_EXTRA_DEPS numpy.i ${src_imp_dep})
@@ -114,10 +114,10 @@ message(STATUS "${oct_prog} ${oct_host} ${oct_api}")
        set_target_properties(mgl-oct PROPERTIES OUTPUT_NAME mathgl PREFIX "" SUFFIX ".oct" BUILD_WITH_INSTALL_RPATH ON)
        add_custom_command(OUTPUT mathgl.tar.gz
                COMMAND ${CMAKE_COMMAND} -E make_directory ${mgl_pkg_dir}
-               COMMAND ${CMAKE_COMMAND} -E copy ${MathGL_SOURCE_DIR}/COPYING ${MathGL_BINARY_DIR}/lang/${pkg_name}
-               COMMAND ${CMAKE_COMMAND} -E copy ${MathGL_SOURCE_DIR}/lang/DESCRIPTION ${MathGL_BINARY_DIR}/lang/${pkg_name}
-               COMMAND ${CMAKE_COMMAND} -E copy ${MathGL_SOURCE_DIR}/lang/INDEX ${MathGL_BINARY_DIR}/lang/${pkg_name}
-               COMMAND ${CMAKE_COMMAND} -E copy ${MathGL_SOURCE_DIR}/lang/PKG_ADD_template ${MathGL_BINARY_DIR}/lang/${pkg_name}
+               COMMAND ${CMAKE_COMMAND} -E copy ${MathGL2_SOURCE_DIR}/COPYING ${MathGL2_BINARY_DIR}/lang/${pkg_name}
+               COMMAND ${CMAKE_COMMAND} -E copy ${MathGL2_SOURCE_DIR}/lang/DESCRIPTION ${MathGL2_BINARY_DIR}/lang/${pkg_name}
+               COMMAND ${CMAKE_COMMAND} -E copy ${MathGL2_SOURCE_DIR}/lang/INDEX ${MathGL2_BINARY_DIR}/lang/${pkg_name}
+               COMMAND ${CMAKE_COMMAND} -E copy ${MathGL2_SOURCE_DIR}/lang/PKG_ADD_template ${MathGL2_BINARY_DIR}/lang/${pkg_name}
                COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:mgl-oct> ${mgl_pkg_dir}
                COMMAND ${oct_tar} cpzf mathgl.tar.gz ${pkg_name}
                WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/lang
index 9a18d508e7161ea247a8a9212ea6178484011672..e61c529065e8030f459ed166a0ba0118358ece69 100644 (file)
@@ -120,9 +120,9 @@ public:
        /// Delete data rows/columns/slices
        inline void Delete(char dir, long at=0, long num=1)
        {       mgl_data_delete(this,dir,at,num);       }
-       /// Remove rows with duplicate values in column id
-       inline void Clean(long id)
-       {       mgl_data_clean(this,id);        }
+       /// Remove rows with duplicate values in column clmn
+       inline void Clean(long clmn)
+       {       mgl_data_clean(this,clmn);      }
        /// Join with another data array
        inline void Join(const mglData &d)
        {       mgl_data_join(this,&d); }
@@ -238,6 +238,13 @@ public:
        {       return mglData(true,mgl_data_subdata_ext(this,&xx,&yy,0));      }
        inline mglData SubData(const mglData &xx) const
        {       return mglData(true,mgl_data_subdata_ext(this,&xx,0,0));        }
+       /// Get data from sections ids, separated by value val along specified direction.
+       /** If section id is negative then reverse order is used (i.e. -1 give last section). */
+       inline mglData Section(const mglData &ids, char dir='y', mreal val=NAN) const
+       {       return mglData(true,mgl_data_section(this,&ids,dir,val));       }
+       inline mglData Section(long id, char dir='y', mreal val=NAN) const
+       {       return mglData(true,mgl_data_section_val(this,id,dir,val));     }
+
        /// Get trace of the data array
        inline mglData Trace() const
        {       return mglData(true,mgl_data_trace(this));      }
@@ -270,14 +277,19 @@ public:
        inline mglData Evaluate(const mglData &idat, const mglData &jdat, const mglData &kdat, bool norm=true) const
        {       return mglData(true,mgl_data_evaluate(this,&idat,&jdat,&kdat,norm));    }
        /// Find roots for set of nonlinear equations defined by textual formula
-       inline mglData Roots(const char *func, char var='x') const
-       {       return mglData(true,mgl_data_roots(func, this, var));   }
+       inline mglData Roots(const char *eq, char var='x') const
+       {       return mglData(true,mgl_data_roots(eq, this, var));     }
        /// Find correlation with another data arrays
        inline mglData Correl(const mglData &dat, const char *dir) const
        {       return mglData(true,mgl_data_correl(this,&dat,dir));    }
        /// Find auto correlation function
        inline mglData AutoCorrel(const char *dir) const
        {       return mglData(true,mgl_data_correl(this,this,dir));    }
+       /// Get curves, separated by NAN, for maximal values of array d as function of x coordinate.
+       /** Noises below lvl amplitude are ignored.
+        * Parameter dy \in [0,ny] set the "attraction" distance of points to curve. */
+       inline mglData Detect(mreal lvl, mreal dj, mreal di=0, mreal min_len=0) const
+       {       return mglData(true,mgl_data_detect(this,lvl,dj,di,min_len));   }
 
        /// Cumulative summation the data in given direction or directions
        inline void CumSum(const char *dir)     {       mgl_data_cumsum(this,dir);      }
@@ -302,6 +314,13 @@ public:
        inline void Mirror(const char *dir)             {       mgl_data_mirror(this,dir);      }
        /// Sort rows (or slices) by values of specified column
        inline void Sort(long idx, long idy=-1) {       mgl_data_sort(this,idx,idy);    }
+       /// Return dilated array of 0 or 1 for data values larger val 
+       inline void Dilate(mreal val=1, long step=1)
+       {       mgl_data_dilate(this, val, step);       }
+       /// Return eroded array of 0 or 1 for data values larger val 
+       inline void Erode(mreal val=1, long step=1)
+       {       mgl_data_erode(this, val, step);        }
+       
 
        /// Set as the data envelop
        inline void Envelop(char dir='x')
@@ -324,6 +343,9 @@ public:
        /// Normalize the data to range [v1,v2] slice by slice
        inline void NormSl(mreal v1=0,mreal v2=1,char dir='z',bool keep_en=true,bool sym=false)
        {       mgl_data_norm_slice(this,v1,v2,dir,keep_en,sym);        }
+       /// Limit the data to be inside [-v,v], keeping the original sign
+       inline void Limit(mreal v)
+       {       mgl_data_limit(this, v);        }
 
        /// Apply Hankel transform
        inline void Hankel(const char *dir)     {       mgl_data_hankel(this,dir);      }
@@ -331,7 +353,12 @@ public:
        inline void SinFFT(const char *dir)     {       mgl_data_sinfft(this,dir);      }
        /// Apply Cos-Fourier transform
        inline void CosFFT(const char *dir)     {       mgl_data_cosfft(this,dir);      }
-       /// Fill data by 'x'/'k' samples for Hankel ('h') or Fourier ('f') transform
+       /// Fill data by coordinates/momenta samples for Hankel ('h') or Fourier ('f') transform
+       /** Parameter \a how may contain:
+        * ‘x‘,‘y‘,‘z‘ for direction (only one will be used),
+        * ‘k‘ for momenta samples,
+        * ‘h‘ for Hankel samples,
+        * ‘f‘ for Cartesian/Fourier samples (default). */
        inline void FillSample(const char *how)
        {       mgl_data_fill_sample(this,how); }
        /// Apply wavelet transform
@@ -476,9 +503,19 @@ inline mglData mglQO3d(const char *ham, const mglData &ini_re, const mglData &in
 /// Finds ray with starting point r0, p0 (and prepares ray data for mglQO2d)
 inline mglData mglRay(const char *ham, mglPoint r0, mglPoint p0, mreal dt=0.1, mreal tmax=10)
 {      return mglData(true, mgl_ray_trace(ham, r0.x, r0.y, r0.z, p0.x, p0.y, p0.z, dt, tmax)); }
-/// Saves result of ODE solving (|u|^2) for "Hamiltonian" ham with initial conditions ini
-inline mglData mglODE(const char *df, const char *var, const mglData &ini, mreal dt=0.1, mreal tmax=10)
-{      return mglData(true, mgl_ode_solve_str(df,var, &ini, dt, tmax));        }
+/// Saves result of ODE solving for var complex variables with right part func (separated by ';') and initial conditions x0 over time interval [0,tmax] with time step dt
+inline mglData mglODE(const char *func, const char *var, const mglData &ini, mreal dt=0.1, mreal tmax=10)
+{      return mglData(true, mgl_ode_solve_str(func,var, &ini, dt, tmax));      }
+//-----------------------------------------------------------------------------
+/// Get array as solution of tridiagonal system of equations a[i]*x[i-1]+b[i]*x[i]+c[i]*x[i+1]=d[i]
+/** String \a how may contain:
+ * 'x', 'y', 'z' for solving along x-,y-,z-directions, or
+ * 'h' for solving along hexagonal direction at x-y plain (need nx=ny),
+ * 'c' for using periodical boundary conditions,
+ * 'd' for diffraction/diffuse calculation. */
+inline mglData mglTridMat(const mglData &A, const mglData &B, const mglData &C, const mglData &D, const char *how)
+{      return mglData(true, mgl_data_tridmat(&A, &B, &C, &D, how));    }
+//-----------------------------------------------------------------------------
 /// Calculate Jacobian determinant for D{x(u,v), y(u,v)} = dx/du*dy/dv-dx/dv*dy/du
 inline mglData mglJacobian(const mglData &x, const mglData &y)
 {      return mglData(true, mgl_jacobian_2d(&x, &y));  }
@@ -490,12 +527,27 @@ inline mglData mglTriangulation(const mglData &x, const mglData &y, const mglDat
 {      return mglData(true,mgl_triangulation_3d(&x,&y,&z));    }
 inline mglData mglTriangulation(const mglData &x, const mglData &y)
 {      return mglData(true,mgl_triangulation_2d(&x,&y));       }
+/// Get curves, separated by NAN, for maximal values of array d as function of x coordinate.
+/** Noises below lvl amplitude are ignored.
+ * Parameter dy \in [0,ny] set the "attraction" distance of points to curve. */
+inline mglData mglDetect(const mglData &d, mreal lvl, mreal dj, mreal di=0, mreal min_len=0)
+{      return mglData(true,mgl_data_detect(&d, lvl, dj, di, min_len)); }
+//-----------------------------------------------------------------------------
 /// Get array which is n-th pairs {x[i],y[i]} for iterated function system (fractal) generated by A
 inline mglData mglIFS2d(const mglData &A, long n, long skip=20)
 {      return mglData(true,mgl_data_ifs_2d(&A,n,skip));        }
 /// Get array which is n-th points {x[i],y[i],z[i]} for iterated function system (fractal) generated by A
 inline mglData mglIFS3d(const mglData &A, long n, long skip=20)
 {      return mglData(true,mgl_data_ifs_3d(&A,n,skip));        }
+/// Get array which is n-th points {x[i],y[i],z[i]} for iterated function system (fractal) defined in *.ifs file 'fname' and named as 'name'
+inline mglData mglIFSfile(const char *fname, const char *name, long n, long skip=20)
+{      return mglData(true,mgl_data_ifs_file(fname,name,n,skip));      }
+/// Get array which is n-th pairs {x[i],y[i]} for Flame fractal generated by A with functions F
+/** NOTE: A.nx must be >= 7 and F.nx >= 2 and F.nz=A.ny.
+ * F[0,i,j] denote function id. F[1,i,j] give function weight, F(2:5,i,j) provide function parameters.
+ * Resulting point is {xnew,ynew} = sum_i F[1,i,j]*F[0,i,j]{IFS2d(A[j]){x,y}}. */
+inline mglData mglFlame2d(const mglData &A, const mglData &F, long n, long skip=20)
+{      return mglData(true,mgl_data_flame_2d(&A,&F,n,skip));   }
 //-----------------------------------------------------------------------------
 /// Get sub-array of the data with given fixed indexes
 inline mglData mglSubData(const mglData &dat, long xx, long yy=-1, long zz=-1)
index 3288af2a0137710052dd3d9221ed84cb364414d0..253ea074b3285d106748cc3adbd442ff39bf978c 100644 (file)
@@ -40,6 +40,7 @@
 #include "mgl2/type.h"
 #include "mgl2/data.h"
 #include "mgl2/mgl.h"
+const double All = -1;
 const double Pi = M_PI;
 const double NaN = NAN;
 const double Inf = INFINITY;
index d050ccc2f58bbe17d0d83372ef028d3826afee34..aad850adda2463a493d2ff4bd0455a8d68ed8338 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************
  * mgl.h is part of Math Graphic Library
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   it under the terms of the GNU General Public License as published by  *
@@ -58,6 +58,8 @@ public:
 
        /// Set the transparency on/off.
        inline void Alpha(bool enable)                  {       mgl_set_alpha(gr, enable);      }
+       /// Set the gray-scale mode on/off.
+       inline void Gray(bool enable)                   {       mgl_set_gray(gr, enable);       }
        /// Set default value of alpha-channel
        inline void SetAlphaDef(double alpha)   {       mgl_set_alpha_default(gr, alpha);       }
        /// Set the transparency type (0 - usual, 1 - glass, 2 - lamp)
@@ -105,11 +107,11 @@ public:
        inline void CutOff(const char *EqC)             {       mgl_set_cutoff(gr, EqC);        }
 
        /// Set default font size
-       inline void SetFontSize(double size)            {       mgl_set_font_size(gr, size);    }
+       inline void SetFontSize(double size)    {       mgl_set_font_size(gr, size);    }
        /// Set default font style and color
-       inline void SetFontDef(const char *fnt)         {       mgl_set_font_def(gr, fnt);      }
+       inline void SetFontDef(const char *fnt) {       mgl_set_font_def(gr, fnt);      }
        /// Set FontSize by size in pt and picture DPI (default is 16 pt for dpi=72)
-       virtual void SetFontSizePT(double pt, int dpi=72){      SetFontSize(pt*27.f/dpi);       }
+       virtual void SetFontSizePT(double pt, int dpi=72)       {       SetFontSize(pt*27.f/dpi);       }
        /// Set FontSize by size in centimeters and picture DPI (default is 0.56 cm = 16 pt)
        inline void SetFontSizeCM(double cm, int dpi=72)        {       SetFontSizePT(cm*28.45f,dpi);   }
        /// Set FontSize by size in inch and picture DPI (default is 0.22 in = 16 pt)
@@ -271,15 +273,15 @@ public:
         *  '#' for using whole region. */
        inline void SubPlot(int nx,int ny,int m,const char *style="<>_^", double dx=0, double dy=0)
        {       mgl_subplot_d(gr, nx, ny, m, style, dx, dy);    }
-       /// Put further plotting in rectangle of dx*dy cells starting from m-th cell of nx*ny grid of the image.
+       /// Put further plotting in rectangle of dx*dy cells starting from m-th cell of nx*ny grid of the image and shift it by distance {sx,sy}.
        /** String \a style may contain:
         *  '<' for reserving space at left
         *  '>' for reserving space at right
         *  '^' for reserving space at top
         *  '_' for reserving space at bottom
         *  '#' for using whole region. */
-       inline void MultiPlot(int nx,int ny,int m, int dx, int dy, const char *style="<>_^")
-       {       mgl_multiplot(gr, nx, ny, m, dx, dy, style);    }
+       inline void MultiPlot(int nx,int ny,int m, int dx, int dy, const char *style="<>_^", double sx=0, double sy=0)
+       {       mgl_multiplot_d(gr, nx, ny, m, dx, dy, style, sx, sy);  }
        /// Put further plotting in a region [x1,x2]*[y1,y2] of the image or subplot (x1,x2,y1,y2 in range [0, 1]).
        inline void InPlot(double x1,double x2,double y1,double y2, bool rel=true)
        {       if(rel) mgl_relplot(gr, x1, x2, y1, y2);
@@ -293,6 +295,9 @@ public:
        /// Put further plotting in cell of stick rotated on angles tet, phi
        inline void StickPlot(int num, int i, double tet, double phi)
        {       mgl_stickplot(gr,num,i,tet,phi);        }
+       /// Put further plotting in cell of stick sheared on sx, sy.
+       inline void ShearPlot(int num, int i, mreal sx, mreal sy, mreal xd=1, mreal yd=0)
+       {       mgl_shearplot(gr,num,i,sx,sy,xd,yd);    }
 
        /// Set factor of plot size
        inline void SetPlotFactor(double val)
@@ -313,6 +318,9 @@ public:
        /// Set aspect ratio for further plotting.
        inline void Aspect(double Ax,double Ay,double Az=1)
        {       mgl_aspect(gr, Ax, Ay, Az);             }
+       /// Shear a further plotting.
+       inline void Shear(double Sx,double Sy)
+       {       mgl_shear(gr, Sx, Sy);          }
        /// Rotate a further plotting.
        inline void Rotate(double TetX,double TetZ=0,double TetY=0)
        {       mgl_rotate(gr, TetX, TetZ, TetY);       }
@@ -350,11 +358,16 @@ public:
        /// Set drawing region for Quality&4
        inline void SetDrawReg(long nx=1, long ny=1, long m=0)  {       mgl_set_draw_reg(gr,nx,ny,m);   }
        /// Start group of objects
-       inline void StartGroup(const char *name)                {       mgl_start_group(gr, name);      }
+       inline void StartGroup(const char *name)        {       mgl_start_group(gr, name);      }
        /// End group of objects
        inline void EndGroup()  {       mgl_end_group(gr);      }
        /// Highlight objects with given id
        inline void Highlight(int id)   {       mgl_highlight(gr, id);  }
+       /// Set boundary box for export graphics into 2D file formats.
+       /** If x2<0 (y2<0) then full width (height) will be used.
+        *  If x1<0 or y1<0 or x1>=x2|Width or y1>=y2|Height then cropping will be disabled. */
+       inline void SetBBox(int x1=0, int y1=0, int x2=-1, int y2=-1)
+       {       mgl_set_bbox(gr,x1,y1,x2,y2);   }
 
        /// Show current image
        inline void ShowImage(const char *viewer, bool keep=0)
@@ -577,6 +590,18 @@ public:
        inline void Bifurcation(double dx, const char *func, const char *stl="", const char *opt="")
        {       mgl_bifurcation_str(gr,dx,func,stl,opt);        }
 
+       /// Draws Iris plots for determining cross-dependences of data arrays
+       /** NOTE: using the same ranges and empty ids will not draw axis. This will add data to existing Iris plot.
+        *      Option value set the size of data labels ids, separated by ';'.*/
+       inline void Iris(mglData &dats, const char *ids, const char *stl="", const char *opt="")
+       {       mgl_iris_1(gr,&dats,ids,stl,opt);       }
+       inline void Iris(mglData &dats, const wchar_t *ids, const char *stl="", const char *opt="")
+       {       mgl_irisw_1(gr,&dats,ids,stl,opt);      }
+       inline void Iris(mglData &dats, mglData &ranges, const char *ids, const char *stl="", const char *opt="")
+       {       mgl_iris(gr,&dats,&ranges,ids,stl,opt); }
+       inline void Iris(mglData &dats, mglData &ranges, const wchar_t *ids, const char *stl="", const char *opt="")
+       {       mgl_irisw(gr,&dats,&ranges,ids,stl,opt);        }
+
        /// Draws the face between points with color stl (include interpolation up to 4 colors).
        inline void Face(mglPoint p1, mglPoint p2, mglPoint p3, mglPoint p4, const char *stl="r")
        {       mgl_face(gr, p1.x, p1.y, p1.z, p2.x, p2.y, p2.z, p3.x, p3.y, p3.z, p4.x, p4.y, p4.z, stl);      }
@@ -629,8 +654,8 @@ public:
        inline void Polygon(mglPoint p1, mglPoint p2, int n, const char *stl="r")
        {       mgl_polygon(gr, p1.x, p1.y, p1.z, p2.x, p2.y, p2.z, n,stl);     }
        /// Draws the arc around axis pr with center at p0 and starting from p1, by color stl and angle a (in degrees)
-       inline void Arc(mglPoint p0, mglPoint pr, mglPoint p1, double a, const char *stl="r")
-       {       mgl_arc_ext(gr, p0.x,p0.y,p0.z, pr.x,pr.y,pr.z, p1.x,p1.y,p1.z, a,stl); }
+       inline void Arc(mglPoint p0, mglPoint pa, mglPoint p1, double a, const char *stl="r")
+       {       mgl_arc_ext(gr, p0.x,p0.y,p0.z, pa.x,pa.y,pa.z, p1.x,p1.y,p1.z, a,stl); }
        /// Draws the arc around axis 'z' with center at p0 and starting from p1, by color stl and angle a (in degrees)
        inline void Arc(mglPoint p0, mglPoint p1, double a, const char *stl="r")
        {       mgl_arc_ext(gr, p0.x,p0.y,p0.z, 0,0,1, p1.x,p1.y,p0.z, a,stl);  }
@@ -1253,12 +1278,16 @@ public:
        inline void Grid(const mglData &z, const char *stl="", const char *opt="")
        {       mgl_grid(gr, &z, stl, opt);     }
 
+       /// Draw vertical tiles with manual colors c for 2d data specified parametrically
+       inline void Tile(const mglData &x, const mglData &y, const mglData &z, const mglData &c, const char *stl="", const char *opt="")
+       {       mgl_tile_xyc(gr, &x, &y, &z, &c, stl, opt);     }
        /// Draw vertical tiles for 2d data specified parametrically
        inline void Tile(const mglData &x, const mglData &y, const mglData &z, const char *stl="", const char *opt="")
        {       mgl_tile_xy(gr, &x, &y, &z, stl, opt);  }
        /// Draw vertical tiles for 2d data
        inline void Tile(const mglData &z, const char *stl="", const char *opt="")
        {       mgl_tile(gr, &z, stl, opt);     }
+
        /// Draw density plot for 2d data specified parametrically
        /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/
        inline void Dens(const mglData &x, const mglData &y, const mglData &c, const char *stl="", const char *opt="")
@@ -1497,6 +1526,9 @@ public:
        inline void Beam(double val, const mglData &tr, const mglData &g1, const mglData &g2, const mglData &a, double r, const char *stl=NULL, int flag=0)
        {       mgl_beam_val(gr,val,&tr,&g1,&g2,&a,r,stl,flag); }
 
+       /// Draw vertical tiles with variable size r and manual colors c for 2d data specified parametrically
+       inline void TileS(const mglData &x, const mglData &y, const mglData &z, const mglData &r, const mglData &c, const char *stl="", const char *opt="")
+       {       mgl_tiles_xyc(gr, &x, &y, &z, &r, &c, stl, opt);        }
        /// Draw vertical tiles with variable size r for 2d data specified parametrically
        inline void TileS(const mglData &x, const mglData &y, const mglData &z, const mglData &r, const char *stl="", const char *opt="")
        {       mgl_tiles_xy(gr, &x, &y, &z, &r, stl, opt);     }
@@ -2188,6 +2220,9 @@ public:
        inline void AllowDllCall(bool allow)    {       mgl_parser_allow_dll_call(pr, allow);   }
        /// Set flag to stop script parsing
        inline void Stop()      {       mgl_parser_stop(pr);    }
+       /// Set variant of argument(s) separated by '?' to be used in further commands
+       inline void SetVariant(int var=0)
+       {       mgl_parser_variant(pr, var);    }
 
        /// Return result of formula evaluation
        inline mglData Calc(const char *formula)
index 6704b2a2ba19fede79615fb15bebae6cd3f1b3b8..721e2275279daeb2dd74411475c1834bd4701746 100644 (file)
@@ -24,6 +24,7 @@ typedef double mreal;
 typedef float mreal;
 #endif
 //-----------------------------------------------------------------------------
+const mreal All = -1;
 const mreal Pi = M_PI;
 const mreal NaN = NAN;
 const mreal Inf = INFINITY;
diff --git a/make_release b/make_release
deleted file mode 100755 (executable)
index 2fe9fe3..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-#!/bin/bash
-# Make releases
-
-VER=2.3.4
-LVER=${VER}.LGPL
-BIN=MathGL
-LBIN=MathGL-LGPL
-SRC=/home/balakin/mathgl-code/mathgl-2x
-BSRC=${SRC}/build
-
-mkdir mathgl-${VER}-mingw.i686
-mkdir mathgl-${VER}-mingw.i686/bin/
-cp -p ${BIN}/bin/* mathgl-${VER}-mingw.i686/bin/
-mkdir mathgl-${VER}-mingw.i686/lib/
-cp -p ${BIN}/lib/* mathgl-${VER}-mingw.i686/lib/
-mkdir mathgl-${VER}-mingw.i686/include/
-mkdir mathgl-${VER}-mingw.i686/include/mgl2/
-cp -p ${BIN}/include/mgl2/* mathgl-${VER}-mingw.i686/include/mgl2/
-cp -p ${SRC}/ChangeLog.txt mathgl-${VER}-mingw.i686/
-cp -p ${SRC}/FindMathGL2.cmake mathgl-${VER}-mingw.i686/mathgl2-config.cmake
-7z a mathgl-${VER}-mingw.i686.7z mathgl-${VER}-mingw.i686/
-rm -R mathgl-${VER}-mingw.i686
-
-mkdir mathgl-${LVER}-mingw.i686
-mkdir mathgl-${LVER}-mingw.i686/bin/
-cp -p ${LBIN}/bin/* mathgl-${LVER}-mingw.i686/bin/
-mkdir mathgl-${VER}-mingw.i686/lib/
-cp -p ${LBIN}/lib/* mathgl-${LVER}-mingw.i686/lib/
-mkdir mathgl-${LVER}-mingw.i686/include/
-mkdir mathgl-${LVER}-mingw.i686/include/mgl2/
-cp -p ${LBIN}/include/mgl2/* mathgl-${LVER}-mingw.i686/include/mgl2/
-cp -p ${SRC}/ChangeLog.txt mathgl-${LVER}-mingw.i686/
-cp -p ${SRC}/FindMathGL2.cmake mathgl-${LVER}-mingw.i686/mathgl2-config.cmake
-7z a mathgl-${LVER}-mingw.i686.7z mathgl-${LVER}-mingw.i686/
-rm -R mathgl-${LVER}-mingw.i686
-
-mkdir mgl_scripts-${VER}
-cp -pR ${BIN}/extra/* mgl_scripts-${VER}/
-cp -p ${BIN}/bin/* mgl_scripts-${VER}/
-cp -p ${BIN}/share/mathgl/mgl.cgi.exe mgl_scripts-${VER}/
-cp -p ${BIN}/share/udav/*.qm mgl_scripts-${VER}/
-cp -p ${BSRC}/texinfo/mgl_??.html mgl_scripts-${VER}/
-cp -p ${SRC}/ChangeLog.txt mgl_scripts-${VER}/
-7z a mgl_scripts-${VER}.7z mgl_scripts-${VER}/
-rm -R mgl_scripts-${VER}
-
-cp -p ${BSRC}/texinfo/mathgl_en.pdf mathgl-${VER}.eng.pdf
-cp -p ${BSRC}/texinfo/mgl_en.pdf mgl-${VER}.eng.pdf
-cp -p ${SRC}/ChangeLog.txt ChangeLog-${VER}.txt
-7z a mathgl-doc-html-${VER}.7z ${BSRC}/texinfo/m*html ${BSRC}/texinfo/png/
-
-svn checkout svn://svn.code.sf.net/p/mathgl/code/mathgl-2x/ mathgl-${VER}
-cd mathgl-${VER}
-./clean-svn
-cd ..
-tar -zcf mathgl-${VER}.tar.gz mathgl-${VER}/
-rm -R mathgl-${VER}
index 28844bed609291323770f805952143163aa7551a..c583a4885d06a86b64804f6b459d35e1a781c419 100644 (file)
@@ -23,9 +23,9 @@ endif(NOT TEXMFLOCALDIR)
 # set(extramgl Axis_projection Vectorial)
 
 add_custom_command(OUTPUT mgltex.sty
-       COMMAND ${CMAKE_COMMAND} -E copy ${MathGL_SOURCE_DIR}/mgltex/mgltex.ins ${MathGL_BINARY_DIR}/mgltex/
-       COMMAND ${CMAKE_COMMAND} -E copy ${MathGL_SOURCE_DIR}/mgltex/mgltex.dtx ${MathGL_BINARY_DIR}/mgltex/
-       COMMAND ${CMAKE_COMMAND} -E copy ${MathGL_SOURCE_DIR}/mgltex/Recompilation_decision.pdf ${MathGL_BINARY_DIR}/mgltex/
+       COMMAND ${CMAKE_COMMAND} -E copy ${MathGL2_SOURCE_DIR}/mgltex/mgltex.ins ${MathGL2_BINARY_DIR}/mgltex/
+       COMMAND ${CMAKE_COMMAND} -E copy ${MathGL2_SOURCE_DIR}/mgltex/mgltex.dtx ${MathGL2_BINARY_DIR}/mgltex/
+       COMMAND ${CMAKE_COMMAND} -E copy ${MathGL2_SOURCE_DIR}/mgltex/Recompilation_decision.pdf ${MathGL2_BINARY_DIR}/mgltex/
        COMMAND ${findpdflatex} mgltex.ins
        COMMAND ${findpdflatex} mgltex.dtx
        COMMAND ${findpdflatex} mgltex.dtx
@@ -33,12 +33,12 @@ add_custom_command(OUTPUT mgltex.sty
        DEPENDS mgltex.dtx Recompilation_decision.pdf )
 
 add_custom_command(OUTPUT sample.pdf
-       COMMAND ${CMAKE_COMMAND} -E make_directory ${MathGL_BINARY_DIR}/mgltex/MGL
-       COMMAND ${CMAKE_COMMAND} -E make_directory ${MathGL_BINARY_DIR}/mgltex/MGL/scripts
-       COMMAND ${CMAKE_COMMAND} -E make_directory ${MathGL_BINARY_DIR}/mgltex/MGL/backups
-       COMMAND ${CMAKE_COMMAND} -E make_directory ${MathGL_BINARY_DIR}/mgltex/MGL/graphics
-       COMMAND ${CMAKE_COMMAND} -E copy ${MathGL_SOURCE_DIR}/mgltex/sample.tex ${MathGL_BINARY_DIR}/mgltex/
-#      COMMAND ${CMAKE_COMMAND} -E copy ${MathGL_SOURCE_DIR}/mgltex/mgltex.sty ${MathGL_BINARY_DIR}/mgltex/
+       COMMAND ${CMAKE_COMMAND} -E make_directory ${MathGL2_BINARY_DIR}/mgltex/MGL
+       COMMAND ${CMAKE_COMMAND} -E make_directory ${MathGL2_BINARY_DIR}/mgltex/MGL/scripts
+       COMMAND ${CMAKE_COMMAND} -E make_directory ${MathGL2_BINARY_DIR}/mgltex/MGL/backups
+       COMMAND ${CMAKE_COMMAND} -E make_directory ${MathGL2_BINARY_DIR}/mgltex/MGL/graphics
+       COMMAND ${CMAKE_COMMAND} -E copy ${MathGL2_SOURCE_DIR}/mgltex/sample.tex ${MathGL2_BINARY_DIR}/mgltex/
+#      COMMAND ${CMAKE_COMMAND} -E copy ${MathGL2_SOURCE_DIR}/mgltex/mgltex.sty ${MathGL2_BINARY_DIR}/mgltex/
        COMMAND PATH=$<TARGET_FILE_DIR:mglconv> ${findpdflatex} --shell-escape -draftmode sample.tex
        COMMAND PATH=$<TARGET_FILE_DIR:mglconv> ${findpdflatex} --shell-escape -draftmode sample.tex
        COMMAND PATH=$<TARGET_FILE_DIR:mglconv> ${findpdflatex} --shell-escape sample.tex
@@ -49,6 +49,6 @@ get_directory_property(mglconv_clean ADDITIONAL_MAKE_CLEAN_FILES)
 set(mglconv_clean ${mglconv_clean} scripts mgltex.sty sample.tex sample.aux sample.log)
 set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${mglconv_clean}")
 
-install(FILES ${MathGL_BINARY_DIR}/mgltex/mgltex.sty DESTINATION ${TEXMFLOCALDIR}/tex/latex/mgltex/)
-install(FILES sample.tex mgltex.pdf ${MathGL_BINARY_DIR}/mgltex/sample.pdf DESTINATION ${TEXMFLOCALDIR}/doc/latex/mgltex/)
+install(FILES ${MathGL2_BINARY_DIR}/mgltex/mgltex.sty DESTINATION ${TEXMFLOCALDIR}/tex/latex/mgltex/)
+install(FILES sample.tex mgltex.pdf ${MathGL2_BINARY_DIR}/mgltex/sample.pdf DESTINATION ${TEXMFLOCALDIR}/doc/latex/mgltex/)
 install(CODE "execute_process(COMMAND ${findmktexlsr} ${TEXMFLOCALDIR})")
index b08705841ba5b212e9b0cc0e28040e6b29f2e567..c454a177e6f9a6f5652583c0c60444f258c75a5b 100644 (file)
@@ -1,6 +1,6 @@
 %!PS-Adobe-3.0 EPSF-3.0
 %%Creator: cairo 1.13.1 (http://cairographics.org)
-%%CreationDate: Sat Nov  7 08:28:35 2015
+%%CreationDate: Sat Nov  7 15:28:00 2015
 %%Pages: 1
 %%DocumentData: Clean7Bit
 %%LanguageLevel: 3
 ET
 Q q
 0 g
-2.4 w
+2.15895 w
 0 J
 0 j
 [] 0.0 d
 4 M q 1 0 0 -1 0 790.399963 cm
-316.762 33.48 m 316.762 86.008 l S Q
+316.762 37.789 m 316.762 80.293 l S Q
+321.988 721.4 m 316.781 707.248 l 311.578 721.4 l 314.652 719.138 318.855
+ 719.15 321.988 721.4 c h
+321.988 721.4 m f*
+0.809606 w
+1 j
+q 0 1 1 0 0 790.399963 cm
+-69 321.988 m -83.152 316.781 l -69 311.578 l -71.262 314.652 -71.25 318.855
+ -69 321.988 c h
+-69 321.988 m S Q
+2.15579 w
+0 j
 q 1 0 0 -1 0 790.399963 cm
-316.762 147.812 m 316.762 199.551 l S Q
+316.762 152.66 m 316.762 194.406 l S Q
+321.98 607.271 m 316.781 593.138 l 311.586 607.271 l 314.652 605.013 318.852
+ 605.029 321.98 607.271 c h
+321.98 607.271 m f*
+0.808421 w
+1 j
+q 0 1 1 0 0 790.399963 cm
+-183.129 321.98 m -197.262 316.781 l -183.129 311.586 l -185.387 314.652
+ -185.371 318.852 -183.129 321.98 c h
+-183.129 321.98 m S Q
+2.295753 w
+0 j
 q 1 0 0 -1 0 790.399963 cm
-256.559 257.719 m 139.379 257.719 l 139.379 365.215 l S Q
+252.547 257.68 m 139.148 257.68 l 139.148 359.32 l S Q
+144.703 443.091 m 139.172 428.041 l 133.637 443.091 l 136.902 440.685 141.375
+ 440.701 144.703 443.091 c h
+144.703 443.091 m f*
+0.860907 w
+1 j
+q 0 1 1 0 0 790.399963 cm
+-347.309 144.703 m -362.359 139.172 l -347.309 133.637 l -349.715 136.902
+ -349.699 141.375 -347.309 144.703 c h
+-347.309 144.703 m S Q
+2.324777 w
+0 j
 q 1 0 0 -1 0 790.399963 cm
-378.305 257.715 m 495.484 257.715 l 495.484 365.211 l S Q
+381.137 257.691 m 495.648 257.691 l 495.648 360.906 l S Q
+501.273 441.658 m 495.668 426.416 l 490.066 441.658 l 493.375 439.22 497.902
+ 439.236 501.273 441.658 c h
+501.273 441.658 m f*
+0.871792 w
+1 j
+q 0 1 1 0 0 790.399963 cm
+-348.742 501.273 m -363.984 495.668 l -348.742 490.066 l -351.18 493.375
+ -351.164 497.902 -348.742 501.273 c h
+-348.742 501.273 m S Q
+2.290224 w
+0 j
 q 1 0 0 -1 0 790.399963 cm
-225.398 398.059 m 316.828 397.484 l 316.828 474.172 l S Q
+228.438 397.988 m 317.062 397.453 l 317.062 469.492 l S Q
+322.605 332.888 m 317.086 317.873 l 311.562 332.888 l 314.824 330.49 319.281
+ 330.502 322.605 332.888 c h
+322.605 332.888 m f*
+0.858834 w
+1 j
+q 0 1 1 0 0 790.399963 cm
+-457.512 322.605 m -472.527 317.086 l -457.512 311.562 l -459.91 314.824
+ -459.898 319.281 -457.512 322.605 c h
+-457.512 322.605 m S Q
+2.300242 w
+0 j
 q 1 0 0 -1 0 790.399963 cm
-377.992 533.152 m 495.168 533.152 l 495.168 640.648 l S Q
+379.918 533.141 m 495.336 533.141 l 495.336 633.395 l S Q
+500.902 169.041 m 495.359 153.962 l 489.812 169.041 l 493.086 166.63 497.566
+ 166.646 500.902 169.041 c h
+500.902 169.041 m f*
+0.862591 w
+1 j
+q 0 1 1 0 0 790.399963 cm
+-621.359 500.902 m -636.438 495.359 l -621.359 489.812 l -623.77 493.086
+ -623.754 497.566 -621.359 500.902 c h
+-621.359 500.902 m S Q
+2.29295 w
+0 j
 q 1 0 0 -1 0 790.399963 cm
-255.668 532.582 m 138.488 532.582 l 138.488 640.078 l S Q
+252.285 532.551 m 138.273 532.551 l 138.273 633.395 l S Q
+143.824 168.998 m 138.297 153.966 l 132.77 168.998 l 136.031 166.595 140.496
+ 166.611 143.824 168.998 c h
+143.824 168.998 m f*
+0.859856 w
+1 j
+q 0 1 1 0 0 790.399963 cm
+-621.402 143.824 m -636.434 138.297 l -621.402 132.77 l -623.805 136.031
+ -623.789 140.496 -621.402 143.824 c h
+-621.402 143.824 m S Q
+2.335361 w
+0 j
 q 1 0 0 -1 0 790.399963 cm
-255.688 674.629 m 373.973 674.629 l S Q
+258.828 674.629 m 370.828 674.629 l S Q
+2.348876 w
 q 1 0 0 -1 0 790.399963 cm
-316.828 674.629 m 316.828 752.344 l S Q
+316.828 674.629 m 316.828 749.066 l S Q
+322.512 53.619 m 316.852 38.22 l 311.188 53.619 l 314.531 51.162 319.105
+ 51.173 322.512 53.619 c h
+322.512 53.619 m f*
+0.880828 w
+1 j
+q 0 1 1 0 0 790.399963 cm
+-736.781 322.512 m -752.18 316.852 l -736.781 311.187 l -739.238 314.531
+ -739.227 319.105 -736.781 322.512 c h
+-736.781 322.512 m S Q
+2.4 w
+0 j
 q 1 0 0 -1 0 790.399963 cm
 495.113 422.059 m 495.113 451.77 l 332.828 451.199 l 332.828 451.199 317.516
  429.449 301.457 451.18 c 138.828 451.484 l 138.543 532.629 l S Q
index cff8a1366f06637813738663ec827c692d01a292..a6a33bfe9457f86771536fd6785e2ef2b1fea87f 100644 (file)
Binary files a/mgltex/Recompilation_decision.pdf and b/mgltex/Recompilation_decision.pdf differ
index deabd7d5d7a145c95cee245ccabe599e67ad420a..79163b903647150d761957636463a9861e6ddaa3 100644 (file)
    sodipodi:docname="Recompilation_decision.svg">
   <defs
      id="defs4">
+    <marker
+       inkscape:isstock="true"
+       style="overflow:visible"
+       id="marker5654"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Mend">
+      <path
+         inkscape:connector-curvature="0"
+         transform="scale(-0.6,-0.6)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         id="path5656" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker5452"
+       style="overflow:visible"
+       inkscape:isstock="true"
+       inkscape:collect="always">
+      <path
+         id="path5454"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:isstock="true"
+       style="overflow:visible"
+       id="marker5256"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Mend"
+       inkscape:collect="always">
+      <path
+         inkscape:connector-curvature="0"
+         transform="scale(-0.6,-0.6)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         id="path5258" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker5066"
+       style="overflow:visible"
+       inkscape:isstock="true"
+       inkscape:collect="always">
+      <path
+         id="path5068"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:isstock="true"
+       style="overflow:visible"
+       id="marker4882"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Mend"
+       inkscape:collect="always">
+      <path
+         inkscape:connector-curvature="0"
+         transform="scale(-0.6,-0.6)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         id="path4884" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker4704"
+       style="overflow:visible"
+       inkscape:isstock="true"
+       inkscape:collect="always">
+      <path
+         id="path4706"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:isstock="true"
+       style="overflow:visible"
+       id="marker4532"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Mend"
+       inkscape:collect="always">
+      <path
+         inkscape:connector-curvature="0"
+         transform="scale(-0.6,-0.6)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         id="path4534" />
+    </marker>
     <marker
        inkscape:stockid="Arrow2Mend"
        orient="auto"
        refX="0"
        id="marker5662"
        style="overflow:visible"
-       inkscape:isstock="true">
+       inkscape:isstock="true"
+       inkscape:collect="always">
       <path
          id="path5664"
          style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
      showgrid="true"
      inkscape:current-layer="svg2"
      inkscape:document-units="px"
-     inkscape:cy="496.39986"
-     inkscape:cx="327.57307"
+     inkscape:cy="482.82902"
+     inkscape:cx="440.18293"
      inkscape:zoom="0.70000001"
      inkscape:pageshadow="2"
      inkscape:pageopacity="0.0"
         <dc:format>image/svg+xml</dc:format>
         <dc:type
            rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
+        <dc:title />
       </cc:Work>
     </rdf:RDF>
   </metadata>
      inkscape:groupmode="layer"
      id="layer1"
      transform="translate(56.035869,-48.362179)" />
-  <rect
-     style="fill:#ff9b58;fill-opacity:1;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter5398)"
-     id="rect15298"
-     width="100"
-     height="39.999996"
-     x="346.03613"
-     y="3.9999998"
-     ry="19.999998" />
-  <text
-     xml:space="preserve"
-     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:100%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     x="395.46545"
-     y="33.285709"
-     id="text15304"
-     sodipodi:linespacing="100%"><tspan
-       sodipodi:role="line"
-       id="tspan15306"
+  <g
+     id="g7122">
+    <rect
+       ry="19.999998"
+       y="3.9999998"
+       x="346.03613"
+       height="39.999996"
+       width="100"
+       id="rect15298"
+       style="fill:#ff9b58;fill-opacity:1;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter5398)" />
+    <text
+       sodipodi:linespacing="100%"
+       id="text15304"
+       y="33.285709"
        x="395.46545"
-       y="33.285709">Start</tspan></text>
-  <rect
-     style="fill:#ff9b58;fill-opacity:1;stroke:#000000;stroke-width:2.93979216;stroke-linecap:butt;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter5374)"
-     id="rect15308"
-     width="290.06018"
-     height="74.345917"
-     x="251.006"
-     y="110.82932"
-     ry="3.7605369e-06" />
-  <text
-     xml:space="preserve"
-     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:100%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     x="397.49304"
-     y="142.28799"
-     id="text15310"
-     sodipodi:linespacing="100%"><tspan
-       sodipodi:role="line"
-       id="tspan15312"
-       x="397.49304"
-       y="142.28799">Find</tspan><tspan
-       sodipodi:role="line"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:100%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       xml:space="preserve"><tspan
+         y="33.285709"
+         x="395.46545"
+         id="tspan15306"
+         sodipodi:role="line">Start</tspan></text>
+  </g>
+  <g
+     id="g7127">
+    <rect
+       ry="3.7605369e-06"
+       y="110.82932"
+       x="251.006"
+       height="74.345917"
+       width="290.06018"
+       id="rect15308"
+       style="fill:#ff9b58;fill-opacity:1;stroke:#000000;stroke-width:2.93979216;stroke-linecap:butt;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter5374)" />
+    <text
+       sodipodi:linespacing="100%"
+       id="text15310"
+       y="142.28799"
        x="397.49304"
-       y="169.78799"
-       id="tspan15314">\MGL@@@&lt;script&gt;</tspan></text>
-  <rect
-     style="fill:#ff9b58;fill-opacity:1;stroke:#000000;stroke-width:2.61052561;stroke-linecap:butt;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter5350)"
-     id="rect15316"
-     width="104.42103"
-     height="104.421"
-     x="-37.940403"
-     y="434.159"
-     ry="0"
-     transform="matrix(0.73605839,-0.67691805,0.73605839,0.67691805,27.536121,2.4999998)" />
-  <text
-     xml:space="preserve"
-     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:100%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     x="396.24426"
-     y="309.45212"
-     id="text15372"
-     sodipodi:linespacing="100%"><tspan
-       sodipodi:role="line"
-       id="tspan15374"
-       x="396.24426"
-       y="309.45212">Is it</tspan><tspan
-       sodipodi:role="line"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:100%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       xml:space="preserve"><tspan
+         y="142.28799"
+         x="397.49304"
+         id="tspan15312"
+         sodipodi:role="line">Find</tspan><tspan
+         id="tspan15314"
+         y="169.78799"
+         x="397.49304"
+         sodipodi:role="line">\MGL@@@&lt;script&gt;</tspan></text>
+  </g>
+  <g
+     id="g7133">
+    <rect
+       transform="matrix(0.73605839,-0.67691805,0.73605839,0.67691805,27.536121,2.4999998)"
+       ry="0"
+       y="434.159"
+       x="-37.940403"
+       height="104.421"
+       width="104.42103"
+       id="rect15316"
+       style="fill:#ff9b58;fill-opacity:1;stroke:#000000;stroke-width:2.61052561;stroke-linecap:butt;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter5350)" />
+    <text
+       sodipodi:linespacing="100%"
+       id="text15372"
+       y="309.45212"
        x="396.24426"
-       y="336.95212"
-       id="tspan15376">defined?</tspan></text>
-  <rect
-     style="fill:#ff9b58;fill-opacity:1;stroke:#000000;stroke-width:2.46426511;stroke-linecap:butt;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter5326)"
-     id="rect15308-5"
-     width="214.82143"
-     height="70.535728"
-     x="66.625397"
-     y="458.73218"
-     ry="3.5678115e-06" />
-  <text
-     xml:space="preserve"
-     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:100%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     x="173.32182"
-     y="487.595"
-     id="text15310-7"
-     sodipodi:linespacing="100%"><tspan
-       sodipodi:role="line"
-       id="tspan15402"
-       x="173.32182"
-       y="487.595">Compare</tspan><tspan
-       sodipodi:role="line"
-       id="tspan15404"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:100%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       xml:space="preserve"><tspan
+         y="309.45212"
+         x="396.24426"
+         id="tspan15374"
+         sodipodi:role="line">Is it</tspan><tspan
+         id="tspan15376"
+         y="336.95212"
+         x="396.24426"
+         sodipodi:role="line">defined?</tspan></text>
+  </g>
+  <g
+     id="g7149">
+    <rect
+       ry="3.5678115e-06"
+       y="458.73218"
+       x="66.625397"
+       height="70.535728"
+       width="214.82143"
+       id="rect15308-5"
+       style="fill:#ff9b58;fill-opacity:1;stroke:#000000;stroke-width:2.46426511;stroke-linecap:butt;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter5326)" />
+    <text
+       sodipodi:linespacing="100%"
+       id="text15310-7"
+       y="487.595"
        x="173.32182"
-       y="515.09497">script vs. code</tspan></text>
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:100%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       xml:space="preserve"><tspan
+         y="487.595"
+         x="173.32182"
+         id="tspan15402"
+         sodipodi:role="line">Compare</tspan><tspan
+         y="515.09497"
+         x="173.32182"
+         id="tspan15404"
+         sodipodi:role="line">script vs. code</tspan></text>
+  </g>
   <rect
      style="fill:#ff9b58;fill-opacity:1;stroke:#000000;stroke-width:2.6016953;stroke-linecap:butt;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter5302)"
      id="rect15308-5-1"
      x="483.47986"
      y="461.65802"
      ry="3.2718219e-06" />
-  <text
-     xml:space="preserve"
-     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:100%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     x="615.10748"
-     y="487.8367"
-     id="text15310-7-8"
-     sodipodi:linespacing="100%"><tspan
-       sodipodi:role="line"
-       id="tspan15430"
-       x="615.10748"
-       y="487.8367">Rewrite/recompile</tspan><tspan
-       sodipodi:role="line"
-       id="tspan15432"
+  <g
+     id="g7155">
+    <text
+       sodipodi:linespacing="100%"
+       id="text15310-7-8"
+       y="487.8367"
        x="615.10748"
-       y="515.33667">script</tspan></text>
-  <rect
-     style="fill:#ff9b58;fill-opacity:1;stroke:#000000;stroke-width:2.93979216;stroke-linecap:butt;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter5230)"
-     id="rect15308-58"
-     width="290.06018"
-     height="74.345917"
-     x="469.00604"
-     y="802.82477"
-     ry="3.7605369e-06" />
-  <text
-     xml:space="preserve"
-     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:100%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     x="615.46466"
-     y="833.83441"
-     id="text15310-2"
-     sodipodi:linespacing="100%"><tspan
-       sodipodi:role="line"
-       id="tspan15538"
-       x="615.46466"
-       y="833.83441">Undefine</tspan><tspan
-       sodipodi:role="line"
-       id="tspan15540"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:100%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       xml:space="preserve"><tspan
+         y="487.8367"
+         x="615.10748"
+         id="tspan15430"
+         sodipodi:role="line">Rewrite/recompile</tspan><tspan
+         y="515.33667"
+         x="615.10748"
+         id="tspan15432"
+         sodipodi:role="line">script</tspan></text>
+  </g>
+  <g
+     id="g7177">
+    <rect
+       ry="3.7605369e-06"
+       y="802.82477"
+       x="469.00604"
+       height="74.345917"
+       width="290.06018"
+       id="rect15308-58"
+       style="fill:#ff9b58;fill-opacity:1;stroke:#000000;stroke-width:2.93979216;stroke-linecap:butt;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter5230)" />
+    <text
+       sodipodi:linespacing="100%"
+       id="text15310-2"
+       y="833.83441"
        x="615.46466"
-       y="861.33441">\MGL@@@&lt;script&gt;</tspan></text>
-  <rect
-     style="fill:#ff9b58;fill-opacity:1;stroke:#000000;stroke-width:2.93979216;stroke-linecap:butt;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter5254)"
-     id="rect15308-7"
-     width="290.06018"
-     height="74.345917"
-     x="29.006018"
-     y="802.82477"
-     ry="3.7605369e-06" />
-  <text
-     xml:space="preserve"
-     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:100%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     x="175.46468"
-     y="833.83441"
-     id="text15310-4"
-     sodipodi:linespacing="100%"><tspan
-       sodipodi:role="line"
-       id="tspan15534"
-       x="175.46468"
-       y="833.83441">Define</tspan><tspan
-       sodipodi:role="line"
-       id="tspan15536"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:100%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       xml:space="preserve"><tspan
+         y="833.83441"
+         x="615.46466"
+         id="tspan15538"
+         sodipodi:role="line">Undefine</tspan><tspan
+         y="861.33441"
+         x="615.46466"
+         id="tspan15540"
+         sodipodi:role="line">\MGL@@@&lt;script&gt;</tspan></text>
+  </g>
+  <g
+     id="g7183">
+    <rect
+       ry="3.7605369e-06"
+       y="802.82477"
+       x="29.006018"
+       height="74.345917"
+       width="290.06018"
+       id="rect15308-7"
+       style="fill:#ff9b58;fill-opacity:1;stroke:#000000;stroke-width:2.93979216;stroke-linecap:butt;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter5254)" />
+    <text
+       sodipodi:linespacing="100%"
+       id="text15310-4"
+       y="833.83441"
        x="175.46468"
-       y="861.33441">\MGL@@@&lt;script&gt;</tspan></text>
-  <rect
-     style="fill:#ff9b58;fill-opacity:1;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter5206)"
-     id="rect15298-0"
-     width="100"
-     height="39.999996"
-     x="346.03613"
-     y="944"
-     ry="19.999998" />
-  <text
-     xml:space="preserve"
-     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:100%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     x="395.93542"
-     y="973.28571"
-     id="text15304-3"
-     sodipodi:linespacing="100%"><tspan
-       sodipodi:role="line"
-       id="tspan15563"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:100%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       xml:space="preserve"><tspan
+         y="833.83441"
+         x="175.46468"
+         id="tspan15534"
+         sodipodi:role="line">Define</tspan><tspan
+         y="861.33441"
+         x="175.46468"
+         id="tspan15536"
+         sodipodi:role="line">\MGL@@@&lt;script&gt;</tspan></text>
+  </g>
+  <g
+     id="g7189">
+    <rect
+       ry="19.999998"
+       y="944"
+       x="346.03613"
+       height="39.999996"
+       width="100"
+       id="rect15298-0"
+       style="fill:#ff9b58;fill-opacity:1;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter5206)" />
+    <text
+       sodipodi:linespacing="100%"
+       id="text15304-3"
+       y="973.28571"
        x="395.93542"
-       y="973.28571">End</tspan></text>
-  <rect
-     style="fill:#ff9b58;fill-opacity:1;stroke:#000000;stroke-width:2.61052561;stroke-linecap:butt;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter5278)"
-     id="rect15316-5"
-     width="104.42103"
-     height="104.421"
-     x="-291.92599"
-     y="688.14459"
-     ry="0"
-     transform="matrix(0.73605839,-0.67691805,0.73605839,0.67691805,27.536121,2.4999998)" />
-  <text
-     xml:space="preserve"
-     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:100%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     x="396.24426"
-     y="638.30701"
-     id="text15372-1"
-     sodipodi:linespacing="100%"><tspan
-       sodipodi:role="line"
-       id="tspan4665"
-       x="396.24426"
-       y="638.30701">Are</tspan><tspan
-       sodipodi:role="line"
-       id="tspan4667"
-       x="396.24426"
-       y="665.80701">they</tspan><tspan
-       sodipodi:role="line"
-       id="tspan4669"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:100%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       xml:space="preserve"><tspan
+         y="973.28571"
+         x="395.93542"
+         id="tspan15563"
+         sodipodi:role="line">End</tspan></text>
+  </g>
+  <g
+     id="g7160">
+    <rect
+       transform="matrix(0.73605839,-0.67691805,0.73605839,0.67691805,27.536121,2.4999998)"
+       ry="0"
+       y="688.14459"
+       x="-291.92599"
+       height="104.421"
+       width="104.42103"
+       id="rect15316-5"
+       style="fill:#ff9b58;fill-opacity:1;stroke:#000000;stroke-width:2.61052561;stroke-linecap:butt;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter5278)" />
+    <text
+       sodipodi:linespacing="100%"
+       id="text15372-1"
+       y="638.30701"
        x="396.24426"
-       y="693.30701">equal?</tspan></text>
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:100%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       xml:space="preserve"><tspan
+         y="638.30701"
+         x="396.24426"
+         id="tspan4665"
+         sodipodi:role="line">Are</tspan><tspan
+         y="665.80701"
+         x="396.24426"
+         id="tspan4667"
+         sodipodi:role="line">they</tspan><tspan
+         y="693.30701"
+         x="396.24426"
+         id="tspan4669"
+         sodipodi:role="line">equal?</tspan></text>
+  </g>
   <path
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:"
-     d="m 395.9522,41.850038 0,65.659912"
+     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.69868755;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5662)"
+     d="m 395.9522,47.234559 0,53.132841"
      id="path9635"
      inkscape:connector-curvature="0"
      sodipodi:nodetypes="cc" />
   <path
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:"
-     d="m 395.9522,184.76632 0,64.67006"
+     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.69473767;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5654)"
+     d="m 395.9522,190.82724 0,52.17876"
      id="path9668"
      inkscape:connector-curvature="0"
      sodipodi:nodetypes="cc" />
   <path
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:"
-     d="m 320.69584,322.14706 -146.47212,0 0,134.37059"
+     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.86969066;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4704)"
+     d="m 315.68408,322.10132 -141.74819,0 0,127.04843"
      id="path9880"
      inkscape:connector-curvature="0"
      sodipodi:nodetypes="ccc" />
   <path
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:"
-     d="m 472.88165,322.14453 146.47212,0 0,134.37059"
+     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.90597177;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4532)"
+     d="m 476.42192,322.11395 143.13726,0 0,129.01695"
      id="path9880-8"
      inkscape:connector-curvature="0"
      sodipodi:nodetypes="ccc" />
   <path
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:"
-     d="m 281.75015,497.57146 114.28572,-0.71429 0,95.85714"
+     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.86277986;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker4882)"
+     d="m 285.54764,497.48577 110.78038,-0.67102 0,90.05069"
      id="path11097"
      inkscape:connector-curvature="0"
      sodipodi:nodetypes="ccc" />
   <path
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:"
-     d="m 472.48848,666.43983 146.47212,0 0,134.37059"
+     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.87530303;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5066)"
+     d="m 474.89723,666.42636 144.27202,0 0,125.31464"
      id="path9880-87"
      inkscape:connector-curvature="0"
      sodipodi:nodetypes="ccc" />
   <path
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:"
-     d="m 319.58325,665.72555 -146.47211,0 0,134.37059"
+     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.86618733;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5256)"
+     d="m 315.35785,665.6901 -142.51657,0 0,126.05511"
      id="path9880-4"
      inkscape:connector-curvature="0"
      sodipodi:nodetypes="ccc" />
   <path
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:"
-     d="m 319.6073,843.28574 147.85714,0"
+     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.91920161;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+     d="m 323.53587,843.28574 140,0"
      id="path12272"
      inkscape:connector-curvature="0" />
   <path
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:"
-     d="m 396.03587,843.28574 0,97.14286"
+     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.93609476;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5452)"
+     d="m 396.03587,843.28574 0,93.04832"
      id="path12293"
      inkscape:connector-curvature="0" />
   <path
      id="path12941"
      inkscape:connector-curvature="0"
      sodipodi:nodetypes="cccccc" />
-  <rect
-     style="fill:#ffe3d0;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-     id="rect5520"
-     width="71.428574"
-     height="40"
-     x="214.67897"
-     y="301.21429"
-     ry="20" />
-  <text
-     xml:space="preserve"
-     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:100%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
-     x="227.53612"
-     y="329.78571"
-     id="text5522"
-     sodipodi:linespacing="100%"><tspan
-       sodipodi:role="line"
-       id="tspan5524"
+  <g
+     id="g7144">
+    <rect
+       ry="20"
+       y="301.21429"
+       x="214.67897"
+       height="40"
+       width="71.428574"
+       id="rect5520"
+       style="fill:#ffe3d0;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <text
+       sodipodi:linespacing="100%"
+       id="text5522"
+       y="329.78571"
        x="227.53612"
-       y="329.78571">Yes</tspan></text>
-  <rect
-     style="fill:#ffe3d0;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-     id="rect5520-4"
-     width="71.428574"
-     height="40"
-     x="213.2504"
-     y="644.64282"
-     ry="20" />
-  <text
-     xml:space="preserve"
-     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:100%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
-     x="226.10754"
-     y="673.21423"
-     id="text5522-9"
-     sodipodi:linespacing="100%"><tspan
-       sodipodi:role="line"
-       id="tspan5524-4"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:100%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
+       xml:space="preserve"><tspan
+         y="329.78571"
+         x="227.53612"
+         id="tspan5524"
+         sodipodi:role="line">Yes</tspan></text>
+  </g>
+  <g
+     id="g7172">
+    <rect
+       ry="20"
+       y="644.64282"
+       x="213.2504"
+       height="40"
+       width="71.428574"
+       id="rect5520-4"
+       style="fill:#ffe3d0;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <text
+       sodipodi:linespacing="100%"
+       id="text5522-9"
+       y="673.21423"
        x="226.10754"
-       y="673.21423">Yes</tspan></text>
-  <rect
-     style="fill:#ffe3d0;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-     id="rect5520-7"
-     width="71.428574"
-     height="40"
-     x="507.5361"
-     y="644.07141"
-     ry="20" />
-  <text
-     xml:space="preserve"
-     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:100%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
-     x="524.67896"
-     y="674.07141"
-     id="text5522-6"
-     sodipodi:linespacing="100%"><tspan
-       sodipodi:role="line"
-       id="tspan5586"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:100%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
+       xml:space="preserve"><tspan
+         y="673.21423"
+         x="226.10754"
+         id="tspan5524-4"
+         sodipodi:role="line">Yes</tspan></text>
+  </g>
+  <g
+     id="g7167">
+    <rect
+       ry="20"
+       y="644.07141"
+       x="507.5361"
+       height="40"
+       width="71.428574"
+       id="rect5520-7"
+       style="fill:#ffe3d0;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <text
+       sodipodi:linespacing="100%"
+       id="text5522-6"
+       y="674.07141"
        x="524.67896"
-       y="674.07141">No</tspan></text>
-  <rect
-     style="fill:#ffe3d0;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-     id="rect5520-7-3"
-     width="71.428574"
-     height="40"
-     x="506.10754"
-     y="301.21426"
-     ry="20" />
-  <text
-     xml:space="preserve"
-     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:100%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
-     x="523.25037"
-     y="331.21423"
-     id="text5522-6-9"
-     sodipodi:linespacing="100%"><tspan
-       sodipodi:role="line"
-       id="tspan5586-2"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:100%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
+       xml:space="preserve"><tspan
+         y="674.07141"
+         x="524.67896"
+         id="tspan5586"
+         sodipodi:role="line">No</tspan></text>
+  </g>
+  <g
+     id="g7139">
+    <rect
+       ry="20"
+       y="301.21426"
+       x="506.10754"
+       height="40"
+       width="71.428574"
+       id="rect5520-7-3"
+       style="fill:#ffe3d0;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <text
+       sodipodi:linespacing="100%"
+       id="text5522-6-9"
+       y="331.21423"
        x="523.25037"
-       y="331.21423">No</tspan></text>
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:100%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
+       xml:space="preserve"><tspan
+         y="331.21423"
+         x="523.25037"
+         id="tspan5586-2"
+         sodipodi:role="line">No</tspan></text>
+  </g>
 </svg>
index 959e117fe833b13cc68aeaba21943691a9f69545..d50fa825424da3466e34fff950551576237fc8fa 100644 (file)
 %
 %<package>
 %<package>\NeedsTeXFormat{LaTeX2e}
-%<package>\ProvidesPackage{mgltex}[2016/01/28 v4.1 Embed MGL scripts into LaTeX documents]
+%<package>\ProvidesPackage{mgltex}[2016/04/26 v4.2 Embed MGL scripts into LaTeX documents]
 %<package>
 %
 %<*driver>
 \documentclass[10pt]{ltxdoc}
 \usepackage{color}
+\usepackage{mgltex}
+\DeclareRobustCommand\mglTeX{mgl\kern-0.04em\TeX}% Otherwise, incompatibility with \CharacterTable
 \IfFileExists{hyperref.sty}{%
-       \usepackage[hidelinks=true]{hyperref}%
+  \usepackage[hidelinks]{hyperref}%
 }{}
-\usepackage{mgltex}
-\def\mglTeX{mgl\TeX} % Otherwise, incompatibility with \CharacterTable
 \EnableCrossrefs
 \CodelineIndex
 \RecordChanges
 %   \makeatother
 % \egroup
 %
-% \changes{v1.0}{2014/09/27}{Initial version}
-% \changes{v2.0}{2014/11/23}{Possible bugfix by adding \texttt{\textbackslash expandafter} to commands to ignore/write lines of MGL code}
-% \changes{v2.0}{2014/11/23}{Add environment \texttt{mglsignature} that adds a commentary every MGL script}
-% \changes{v2.0}{2014/11/23}{Eliminate line ignoring commands to create more elegant scripts, due to the a new command that adds comments to the scripts}
-% \changes{v2.0}{2014/11/23}{Move the MGL \emph{stop} command from the \texttt{\textbackslash{}AtEndDocument} command to the \texttt{\textbackslash{}mgl@func} buffer}
-% \changes{v3.0}{/2015/03/29}{Add detection of changes in MGL scripts to speed up compilation time (only changed scripts are recompiled)}
-% \changes{v3.0}{/2015/03/29}{Add command \texttt{\textbackslash mgldir}, \texttt{\textbackslash mglscriptsdir}, \texttt{\textbackslash mglgraphicsdir} and \texttt{\textbackslash mglbackupsdir} to specify a main directory for \textsf{\mglTeX} and directories for the creation of scripts, graphics and backups}
-% \changes{v3.0}{/2015/03/29}{Add the \texttt{\textbackslash mglquality} command to specify a default quality}
-% \changes{v3.0}{/2015/03/29}{Add the \texttt{\textbackslash mglwidth} and \texttt{\textbackslash mglheight} commands to specify the default size of the images produced}
-% \changes{v3.0}{/2015/03/29}{Add the \texttt{\textbackslash mglsettings} command to configure behavior of the package}
-% \changes{v3.0}{/2015/03/29}{Improve environment \texttt{mglsignature} by adding the possibility of using \LaTeX{} commands inside it}
-% \changes{v4.0}{/2015/08/17}{Completely rewrite of \textsf{\mglTeX}}
-% \changes{v4.0}{/2015/08/17}{\textsf{\mglTeX} now depends of the \textsf{verbatim} package}
-% \changes{v4.0}{/2015/08/17}{All environments write their contents \emph{verbatim}}
-% \changes{v4.0}{/2015/08/17}{Add package options \texttt{0q}, \ldots, \texttt{8q} to specify quality}
-% \changes{v4.0}{/2015/08/17}{Add the \texttt{\textbackslash mglpaths} command to add directories to the search paths for MGL scripts}
-% \changes{v4.0}{/2015/08/17}{Add the \texttt{\textbackslash mglname} command to force clousure of the current main script, its compilation, and the opening of a new main script}
-% \changes{v4.0}{/2015/08/17}{Add the option \texttt{label} to the \texttt{mgl} environment in order to override the automatic naming of the script and corresponding image}
-% \changes{v4.0}{/2015/08/17}{Add the option \texttt{label} to the \texttt{mglverbatim} environment to name the verbatim code}
-% \changes{v4.0}{/2015/08/17}{Add the option \texttt{separator} to the command \texttt{\textbackslash mglplot} to brake the code into different physical text lines}
-% \changes{v4.0}{/2015/08/17}{Add the option \texttt{path} to the commands \texttt{\textbackslash mglgraphics} and \texttt{\textbackslash mglinclude} to force a path to search MGL scripts}
-% \changes{v4.0}{/2015/08/17}{Make verbatim-like environments and \texttt{\textbackslash mglinclude} command more visually elegant}
-% \changes{v4.0}{/2015/08/17}{Numbering in verbatim-like environments is optional now}
-% \changes{v4.0}{/2015/08/17}{Add the command \texttt{\textbackslash listofmglscripts} to create a list of all MGL scripts included verbatim in the document}
-% \changes{v4.0}{/2015/08/17}{Add the command \texttt{\textbackslash mglTeXwVer} that prints the name of the package with its version in a coherent manner, and separated by an unbreakable space}
-% \changes{v4.0}{/2015/08/17}{Verbatim-like environments and the \texttt{\textbackslash mglinclude} command have starred versions wich prevent the command \texttt{\textbackslash listofmglscripts} to list them}
-% \changes{v4.0}{/2015/08/17}{Remove \texttt{mglsignature} environment for being considered useless, and to avoid interference with the detection of changes in MGL scripts, to speed up script writing and to make the package less resource-consuming}
-% \changes{v4.0}{/2015/08/17}{Remove the \texttt{\textbackslash mglwidth} and \texttt{\textbackslash mglheight} commands for being considered useless}
-% \changes{v4.0}{/2015/08/17}{Remove the \texttt{\textbackslash MGL@setkeys} command, since it isn't needed as first thought}
-% \changes{v4.0}{/2015/08/17}{Many improvements, including, but not limited to, speed up, increased coherence and cleanness of the code, less resource consumption}
-% \changes{v4.0}{/2015/08/17}{Many bugfixes}
-%
-% \changes{v4.1}{/2016/01/28}{Add the command \texttt{\textbackslash mglimgext} to specify locally the extension to save the generated graphics}
-% \changes{v4.1}{/2016/01/28}{Add the command \texttt{\textbackslash mglswitch}, which replaces \texttt{\textbackslash mgltexon} and \texttt{\textbackslash mgltexoff}}
-% \changes{v4.1}{/2016/01/28}{Rename the commands \texttt{\textbackslash mgltexon} as \texttt{\textbackslash MGL@switch@on} and \texttt{\textbackslash mgltexoff} as \texttt{\textbackslash MGL@switch@off} in order to avoid the user from unpurposely overwriting them}
-% \changes{v4.1}{/2016/01/28}{The command \texttt{\textbackslash mglcomments} has been reimplemented to accept one mandatory argument: \texttt{\textbackslash mglcomments\{on\}} replaces the old \texttt{\textbackslash mglcomments}, while \texttt{\textbackslash mglcomments\{off\}} replaces the old \texttt{\textbackslash mglnocomments}}
-% \changes{v4.1}{/2016/01/28}{Remove the command \texttt{\textbackslash mglnocomments} (rendered useless by the new implementation of \texttt{\textbackslash mglcomments})}
-% \changes{v4.1}{/2016/01/28}{Remove the command \texttt{\textbackslash mglTeXwVer} (rendered useless by the implementation of the starred version of \texttt{\textbackslash mglTeX})}
-% \changes{v4.1}{/2016/01/28}{Restore the command \texttt{\textbackslash mglsettings}, which was unintentionally deleted in version~4.0}
-% \changes{v4.1}{/2016/01/28}{Expand the key-val list family for the command \texttt{\textbackslash mglsettings}}
-% \changes{v4.1}{/2016/01/28}{Reimplement the \texttt{\textbackslash @MGL@comments@} switch}
-% \changes{v4.1}{/2016/01/28}{A starred version of the command \texttt{\textbackslash mglTeX} has been implemented, which prints the version of the package besides its name}
+%      \def\doccommand#1{\texttt{\textbackslash#1}}
+%
+% \changes{\textbf{v1.0 ------------}}{2014/09/27}{Initial version}
+%
+%
+% \changes{\textbf{v2.0 ------------}}{2014/11/23}{Possible bugfix by adding \doccommand{expandafter} to commands to ignore/write lines of MGL code}
+% \changes{\textbf{v2.0 ------------}}{2014/11/23}{Add environment \texttt{mglsignature} that adds a comment to every MGL script}
+% \changes{\textbf{v2.0 ------------}}{2014/11/23}{Eliminate line ignoring commands to create more elegant scripts, due to the a new command that adds comments to the scripts}
+% \changes{\textbf{v2.0 ------------}}{2014/11/23}{Move the MGL \emph{stop} command from the \texttt{\textbackslash{}AtEndDocument} command to the \doccommand{mgl@func} buffer}
+%
+%
+% \changes{\textbf{v3.0 ------------}}{2015/03/29}{Add detection of changes in MGL scripts to speed up compilation time (only changed scripts are recompiled)}
+% \changes{\textbf{v3.0 ------------}}{2015/03/29}{Add command \doccommand{mgldir}, \doccommand{mglscriptsdir}, \doccommand{mglgraphicsdir} and \doccommand{mglbackupsdir} to specify a main directory for \textsf{\mglTeX} and directories for the creation of scripts, graphics and backups}
+% \changes{\textbf{v3.0 ------------}}{2015/03/29}{Add the \doccommand{mglquality} command to specify a default quality}
+% \changes{\textbf{v3.0 ------------}}{2015/03/29}{Add the \doccommand{mglwidth} and \doccommand{mglheight} commands to specify the default size of the images produced}
+% \changes{\textbf{v3.0 ------------}}{2015/03/29}{Add the \doccommand{mglsettings} command to configure behavior of the package}
+% \changes{\textbf{v3.0 ------------}}{2015/03/29}{Improve environment \texttt{mglsignature} by adding the possibility of using \LaTeX{} commands inside it}
+%
+%
+% \changes{\textbf{v4.0 ------------}}{2015/08/17}{Complete rewrite of \textsf{\mglTeX}}
+% \changes{\textbf{v4.0 ------------}}{2015/08/17}{\textsf{\mglTeX} now depends of the \textsf{verbatim} package}
+% \changes{\textbf{v4.0 ------------}}{2015/08/17}{All environments write their contents \emph{verbatim}}
+% \changes{\textbf{v4.0 ------------}}{2015/08/17}{Add package options \texttt{0q}, \ldots, \texttt{8q} to specify quality}
+% \changes{\textbf{v4.0 ------------}}{2015/08/17}{Add the \doccommand{mglpaths} command to add directories to the search paths for MGL scripts}
+% \changes{\textbf{v4.0 ------------}}{2015/08/17}{Add the \doccommand{mglname} command to force clousure of the current main script, its compilation, and the opening of a new main script}
+% \changes{\textbf{v4.0 ------------}}{2015/08/17}{Add the option \texttt{label} to the \texttt{mgl} environment in order to override the automatic naming of the script and corresponding image}
+% \changes{\textbf{v4.0 ------------}}{2015/08/17}{Add the option \texttt{label} to the \texttt{mglverbatim} environment to name the verbatim code}
+% \changes{\textbf{v4.0 ------------}}{2015/08/17}{Add the option \texttt{separator} to the command \doccommand{mglplot} to brake the code into different physical text lines}
+% \changes{\textbf{v4.0 ------------}}{2015/08/17}{Add the option \texttt{path} to the commands \doccommand{mglgraphics} and \doccommand{mglinclude} to force a path to search MGL scripts}
+% \changes{\textbf{v4.0 ------------}}{2015/08/17}{Verbatim-like environments and \doccommand{mglinclude} command are more visually elegant now}
+% \changes{\textbf{v4.0 ------------}}{2015/08/17}{Numbering in verbatim-like environments is optional now}
+% \changes{\textbf{v4.0 ------------}}{2015/08/17}{Add the command \doccommand{listofmglscripts} to create a list of all MGL scripts included verbatim in the document}
+% \changes{\textbf{v4.0 ------------}}{2015/08/17}{Add the command \doccommand{mglTeXwVer} that prints the name of the package with its version in a coherent manner, and separated by an unbreakable space}
+% \changes{\textbf{v4.0 ------------}}{2015/08/17}{Verbatim-like environments and the \doccommand{mglinclude} command have starred versions wich prevent the command \doccommand{listofmglscripts} to list them}
+% \changes{\textbf{v4.0 ------------}}{2015/08/17}{Remove \texttt{mglsignature} environment for being considered useless, and to avoid interference with the detection of changes in MGL scripts, to speed up script writing and to make the package less resource-consuming}
+% \changes{\textbf{v4.0 ------------}}{2015/08/17}{Remove the \doccommand{mglwidth} and \doccommand{mglheight} commands for being considered useless}
+% \changes{\textbf{v4.0 ------------}}{2015/08/17}{Many improvements, including, but not limited to, speed up, increased coherence and cleanness of the code, less resource consumption}
+% \changes{\textbf{v4.0 ------------}}{2015/08/17}{Many bugfixes}
+%
+%
+% \changes{\textbf{v4.1 ------------}}{2016/01/28}{Add the command \doccommand{mglimgext} to specify locally the extension to save the generated graphics}
+% \changes{\textbf{v4.1 ------------}}{2016/01/28}{Add the command \doccommand{mglswitch}, which replaces \doccommand{mgltexon} and \doccommand{mgltexoff}}
+% \changes{\textbf{v4.1 ------------}}{2016/01/28}{Rename the commands \doccommand{mgltexon} as \doccommand{MGL@switch@on} and \doccommand{mgltexoff} as \doccommand{MGL@switch@off} in order to avoid the user from unpurposely overwriting them}
+% \changes{\textbf{v4.1 ------------}}{2016/01/28}{The command \doccommand{mglcomments} has been reimplemented to accept one mandatory argument: \doccommand{mglcomments\{on\}} replaces the old \doccommand{mglcomments}, while \doccommand{mglcomments\{off\}} replaces the old \doccommand{mglnocomments}}
+% \changes{\textbf{v4.1 ------------}}{2016/01/28}{Remove the command \doccommand{mglnocomments} (rendered useless by the new implementation of \doccommand{mglcomments})}
+% \changes{\textbf{v4.1 ------------}}{2016/01/28}{Remove the command \doccommand{mglTeXwVer} (rendered useless by the implementation of the starred version of \doccommand{mglTeX})}
+% \changes{\textbf{v4.1 ------------}}{2016/01/28}{Restore the command \doccommand{mglsettings}, which was unintentionally deleted in version~4.0}
+% \changes{\textbf{v4.1 ------------}}{2016/01/28}{Expand the key-val list family for the command \doccommand{mglsettings}}
+% \changes{\textbf{v4.1 ------------}}{2016/01/28}{Reimplement the \doccommand{@MGL@comments@} switch}
+% \changes{\textbf{v4.1 ------------}}{2016/01/28}{A starred version of the command \doccommand{mglTeX} has been implemented, which prints the version of the package besides its name}
+%
+%
+% \changes{\textbf{v4.2 ------------}}{2016/05/14}{New package options \texttt{gray}, \texttt{color} to activate/deactivate gray-scale mode for graphics}
+% \changes{\textbf{v4.2 ------------}}{2016/05/14}{New package options \texttt{0v}, \texttt{1v}, \texttt{2v} to select variant of arguments in MGL scripts}
+% \changes{\textbf{v4.2 ------------}}{2016/05/14}{New package option \texttt{9q} for setting quality to \texttt{9} (for testing purposes of the author)}
+% \changes{\textbf{v4.2 ------------}}{2016/05/14}{New commands: \doccommand{mglgray} (to activate/deactivate) gray-scale mode locally, and \doccommand{mglvariant} (to set variant of arguments in MGL scripts locally)}
+% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Rename environment \texttt{mglcommon} to \texttt{mglsetupscript} (\texttt{mglcommon} is still available, but deprecated)}
+% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Rename command \doccommand{mglcommonscriptname} to \texttt{mglsetupscriptname}}
+% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Rename command \doccommand{MGL@graph@ext} to \doccommand{MGL@imgext}}
+% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Rename family \texttt{MGL@keys} as \texttt{MGL@gr@keys} for consistency}
+% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Reorganize and update documentation}
+% \changes{\textbf{v4.2 ------------}}{2016/05/14}{\mglTeX{} now depends on the \texttt{ifpdf} package}
+% \changes{\textbf{v4.2 ------------}}{2016/05/14}{The MGL code line \texttt{setsize~600~400} is now automatically written to the main script in order for the scaling options and commands to work}
+% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Remove the \doccommand{MGL@setkeys} command, since it isn't needed as first thought}
+% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Some minor bugfixes}
+% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Change definition of \doccommand{mglcommentname} from \emph{MGL comment} to \emph{\mglTeX{} comment}}
+% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Rename \doccommand{MGL@document@scripts} to \doccommand{MGL@doc@scripts}}
+% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Rename \doccommand{MGL@script@name} tp \doccommand{MGL@script}}
+% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Introduce the concept of \emph{global}, \emph{local} and \emph{private} settings in the documentation}
 %
 % \GetFileInfo{mgltex.sty}
 %
 % \DoNotIndex{\@flushglue,\@for,\@ifnextchar,\@makeother,\{,\},\ ,\AtBeginDocument,\AtEndDocument,\centering}
 % \DoNotIndex{\closein,\closeout,\csname,\endcsname,\CurrentOption,\DeclareGraphicsExtensions,\define@key,\DeclareOption}
 % \DoNotIndex{\detokenize,\do,\dospecials,\endlinechar,\endlist,\escapechar,\ExecuteOptions,\expandafter,\footnotesize}
-% \DoNotIndex{\framebox,\Gin@extensions,\Huge,\ifeof,\IfFileExists,\ifx,\immediate,\include,\includegraphics,\item,\itemsep}
+% \DoNotIndex{\framebox,\Huge,\ifeof,\IfFileExists,\ifx,\immediate,\include,\includegraphics,\item,\itemsep}
 % \DoNotIndex{\itshape,\jobname,\labelsep,\leftskip,\let,\long,\mbox,\newcounter,\newread,\newtoks,\newwrite,\noexpand}
 % \DoNotIndex{\obeyspaces,\openin,\openout,\PackageError,\PackageWarning,\parfillskip,\parindent,\parskip}
 % \DoNotIndex{\PassOptionsToPackage,\ProcessOptions,\read,\relax,\RequirePackage,\rightskip,\setcounter,\setkeys,\setlength}
 % \DoNotIndex{\endcenter,\everypar,\fbox,\fboxrule,\frenchspacing,\g@addto@macro,\global,\hb@xt@,\hbadness,\hfil,\hfill}
 % \DoNotIndex{\hrule,\hskip,\hss,\if@minipage,\if@tempswa,\ifhmode,\ifnum,\interlinepenalty,\itemindent,\kern,\l@chapter}
 % \DoNotIndex{\l@section,\large,\leavevmode,\MakeUppercase,\newdimen,\nobreak,\nopagebreak,\normalfont,\null,\numberline}
-% \DoNotIndex{\p@,\par,\unpenalty,\usecounter,\@ifstar,\^}
+% \DoNotIndex{\p@,\par,\unpenalty,\usecounter,\@ifstar,\^,\iffalse,\iftrue,\ifpdf}
 %
 % \title{The \textsf{\mglTeX} package\thanks{This document corresponds to \textsf{\mglTeX}~\fileversion, dated \filedate.}}
 % \author{Diego Sejas Viscarra\\\texttt{dsejas.mathematics@gmail.com}}
 % \begin{abstract}
 % \noindent MathGL is a fast and efficient library by Alexey Balakin for the creation of high-quality publication-ready scientific graphics. Although it defines interfaces for many programming languages, it also implements its own scripting language, called \emph{MGL}, which can be used independently. With the package \textsf{\mglTeX}, MGL scripts can be embedded within any \LaTeX{} document, and the corresponding images are automatically created and included.
 %
-% This manual documents the use of the commands and environments of~\textsf{\mglTeX}.
+% This manual documents the usage of the commands and environments of~\textsf{\mglTeX}.
 % \end{abstract}
 %
 % \tableofcontents
 %
 % \section{Introduction}
-% MathGL is a fast and efficient library by Alexey Balakin for the creation of high-quality publication-ready scientific graphics. It implements more than $50$ different types of graphics for 1d, 2d and 3d large sets of data. It supports exporting images to bitmap formats (PNG, JPEG, BMP, etc.), or vector formats (EPS, \TeX, SVG, etc.), or 3d image formats (STL, OBJ, XYZ, etc.), and even its own native 3d format, MGLD. MathGL also defines its own vector font specification format, and supports UTF-16 encoding with \TeX-like symbol parsing. It supports various kinds of transparency and lighting, textual formula evaluation, arbitrary curvilinear coordinate systems, loading of subroutines from .dll or .so libraries, and many other useful features.
+% \noindent MathGL is a fast and efficient library by Alexey Balakin for the creation of high-quality publication-ready scientific graphics. It implements more than $50$ different types of graphics for 1d, 2d and 3d large sets of data. It supports exporting images to bitmap formats (PNG, JPEG, BMP, etc.), or vector formats (EPS, \TeX, SVG, etc.), or 3d image formats (STL, OBJ, XYZ, etc.), and even its own native 3d format, MGLD. MathGL also defines its own vector font specification format, and supports UTF-16 encoding with \TeX-like symbol parsing. It supports various kinds of transparency and lighting, textual formula evaluation, arbitrary curvilinear coordinate systems, loading of subroutines from .dll or .so libraries, and many other useful features.
 %
 % MathGL has interfaces for a wide variety of programming languages, such as C/C++, Fortran, Python, Octave, Pascal, Forth, and many others, but it also defines its own scripting language, called \emph{MGL}, which can be used to generate graphics independently of any programming language. The \textsf{\mglTeX} package adds support to embed MGL code inside \LaTeX{} documents, which is automatically extracted and executed, and the resulting images are included in the document.
 %
 % \begin{enumerate}
 %   \item Any meta-variable that contain the word \emph{directory} indicates the name of a directory, in the form of an absolute or relative path, ending with the slash (``/'') character.
 %   \item Any meta-variable that contain the word \emph{subdirectory} indicates a relative path ending with the slash (``/'') character.
-%   \item \meta{$x_1\vert x_2\vert\ldots\vert x_n$} indicates that any of the values $x_1$, $x_2$, \ldots, $x_n$ can be placed there.
+%   \item \meta{$x_1\vert x_2\vert\ldots\vert x_n$} indicates that any of the values $x_1$, $x_2$, \ldots, $x_n$ can be placed there. A special case is \meta{$x_1\vert x_2\vert\ldots$}, where no upper limit is set.
+%   \item The possible values of a meta-variable could also be indicated by a property. For example \meta{$x:x>0$} indicates that any positive value can be used in that location.
 %   \item A meta-variable of the form \meta{list of something} or \meta{something list} indicate a comma-separated list of values of type $\meta{something}$; if only one value is used, no comma is needed.
-% \item A meta-variable with underscores (``\_'') in its description indicate that spaces should not be used in that location.
+% \item A meta-variable with underscores (``|_|'') in its description indicate that spaces should not be used in that location.
 % \item \meta{key-val list} refers to a list of \meta{key}=\meta{value} pairs of options, where \meta{key} is a keyword name for an option and \meta{value} is a value assigned to it.
 % \end{enumerate}
 %
-% As is conventional for \LaTeX{} packages, the commands and environments of \textsf{\mglTeX{}} accept optional commands inside brackets and mandatory arguments inside curly braces.
+% As is conventional for \LaTeX{} packages, the environments and commands defined by \textsf{\mglTeX} accept optional commands inside brackets ("|[|" and "|]|"), and mandatory arguments inside curly braces ("|{|" and "|}|").
+%
+% While reading the following, it must be noted that most of \textsf{\mglTeX} settings have three modes: global, local and private. A setting is \emph{global} if it applies to the whole document, it is \emph{local} if it applies to the document from one point onwards, and it is \emph{private} if it applies only to a particular MGL script. Global settings are set thorugh package options or with the command |\mglsettings| (explained later), local settings have associated commands (subsection \ref{local setts}), and private settings are specified as optional arguments for environments and commands. An example of this would be the package option |4q|, the command |\mglquality{4}|, and the optional argument for environments and commands |quality=4|, to set the quality for graphics to |4| in the three different modes, respectively.
 %
 % \section{Usage}
 % \noindent The simplest way to load \textsf{\mglTeX} to a \LaTeX{} document is to write the command
 % \end{center}
 % where \meta{options list} can contain one or more of the following options:
 % \begin{itemize}
-%   \item |draft|: The generated images won't be included in the document. This option is useful when fast compilation of the document is needed.
-%   \item |final|: Overrides the |draft| option.
-%   \item |on|: To rewrite, recompile and include the changed MGL scripts and/or corresponding graphics.
-%   \item |off|: To avoid creation, compilation and/or inclusion of the MGL scripts and corresponding images.
-%   \item |comments|: To allow the contents of the |mglcomment| environments to be shown in the \LaTeX{} document.
-%   \item |nocomments|: To avoid showing the contents of the |mglcomment| environments in the \LaTeX{} document.
-%   \item |1x|, \ldots, |9x|: To specify the scale for the creation of graphics (|1x| is normal scaling, |2x| is twice as bigger, etc).
-%   \item |0q|, \ldots, |8q|: To specify the quality for the creation of graphics. An info message indicating the characteristics of the chosen quality is printed in the .log file according to the following table:
+%   \item \textbf{draft:} The generated images won't be included in the document. This option is useful when fast compilation of the document is needed.
+%   \item \textbf{final:} Overrides the |draft| option.
+%   \item \textbf{on:} To rewrite, recompile and include the changed MGL scripts and/or corresponding graphics.
+%   \item \textbf{off:} To avoid creation, compilation and/or inclusion of the MGL scripts and corresponding images.
+%   \item \textbf{comments:} To allow the contents of the |mglcomment| environments to be shown in the \LaTeX{} document.
+%   \item \textbf{nocomments:} To avoid showing the contents of the |mglcomment| environments in the \LaTeX{} document.
+%   \item \textbf{gray:} To create the MGL graphics in gray-scale mode.
+%   \item \textbf{color:} To create the MGL graphics in color mode.
+%   \item \textbf{1x, \ldots, 9x:} To specify the scale for the creation of graphics (|1x| is normal scaling, |2x| is twice as bigger, etc).
+%   \item \textbf{0q, \ldots, 9q:} To specify the quality for the creation of graphics. An info message indicating the characteristics of the chosen quality is printed in the .log file according to the following table:
 % \begin{center}
 %   \DeleteShortVerb{\|}
 %   \begin{tabular}{|c|l|}
 %     \hline
 %     $8$ & Draw dots instead of primitives (extremely fast)\\
 %     \hline
+%     $9$ & No drawing (for testing purposes)\\
+%     \hline
 %   \end{tabular}
 %   \MakeShortVerb{\|}
 % \end{center}
-%   \item |png|, |jpg|, |jpeg|: To export images to a bitmap format.
-%   \item |eps|, |epsz|: To export to uncompressed/compressed vectorial EPS format.
-%   \item |bps|, |bpsz|: To export to uncompressed/compressed bitmap EPS format.
-%   \item |pdf|: To export to 3D PDF format.
-%   \item |tex|: To export to \LaTeX{}/\emph{tikz} document.
+%   \item \textbf{0v, 1v, 2v:} To set the default variant of arguments for the MGL commands.
+%   \item \textbf{png, jpg, jpeg:} To export images to a bitmap format.
+%   \item \textbf{eps, epsz:} To export to uncompressed/compressed vectorial EPS format.
+%   \item \textbf{bps, bpsz:} To export to uncompressed/compressed bitmap EPS format.
+%   \item \textbf{pdf:} To export to 3D PDF format.
+%   \item \textbf{tex:} To export to \LaTeX{}/\emph{tikz} document.
 % \end{itemize}
 % If two or more mutually exclusive options are specified, only the last one will be used by \textsf{\mglTeX}. For example, if one specifies the options |0q|, |3q| and |8q|---in that order---, then the quality will be set to $8$.
 %
 % \end{quote}
 %
 % \subsection{Environments for MGL code embedding}
-% \DescribeEnv{mgl}\noindent The main environment defined by \textsf{\mglTeX} is |mgl|. It extracts its contents to a main script, called \meta{main\_script\_name}.mgl, where \meta{main\_script\_name} stands for a name specified by the user with the |\mglname| command (see below), or the name of the \LaTeX{} document being executed otherwise; this script is compiled, and the corresponding image is included.
+% \DescribeEnv{mgl}\noindent The main environment defined by \textsf{\mglTeX} is |mgl|. It extracts its contents to a main script, called \meta{main\_script\_name}.mgl, where \meta{main\_script\_name} stands for a name specified by the user with the |\mglname| command (explained later), or the name of the \LaTeX{} document being executed otherwise; this script is compiled, and the corresponding image is included.
 % \begin{center}
 %   \begin{tabular}{l}
 %     \hline\\[-0.75em]
 %     \hline
 %   \end{tabular}
 % \end{center}
-% Here, \meta{key-val list} can have the same optional arguments as the |\includegraphics| command from the \textsf{graphicx} package, plus two additional ones, |imgext|, which can be used to specify the extension to save the graphic, and |label|, which can be used to indicate a name for the corresponding graphic (otherwise, an automatic naming will be applied). The \meta{MGL code} doesn't need to contain any specific instruction to create the image since \textsf{\mglTeX} takes care of that.
+% Here, \meta{key-val list} can have the following optional arguments:
+% \begin{itemize}
+%   \item \textbf{bb, bbllx, bblly, bburx, bbury, natwidth, natheight, hiresbb, viewport, trim, angle, origin, width, height, totalheight, keepaspectratio, scale, clip, draft, type, ext, read, command:} These are the same options of the |\includegraphics| command from the \textsf{graphicx} package.
+%   \item \textbf{gray:} Can be used to activate (|gray=on| or |gray=1|) or deactivate (|gray=off| or |gray=0|) gray-scale mode privately (only for the current graphic).
+%   \item \textbf{mglscale:} Any positive value for this option is used to physically scale the resulting image file, i.g., |mglscale=2| will create an image file twice as bigger.
+%   \item \textbf{quality:} Sets the quality of the current graphic. Valid values are integers between |0| and |9|.
+%   \item \textbf{variant:} Sets the variant of argument for the commands in the current script.
+%   \item \textbf{imgext:} Can be used to set the extension for the current image.
+%   \item \textbf{label:} Can be used to indicate a name for the corresponding graphic (otherwise, an automatic naming will be applied)
+% \end{itemize}
 %
-% \DescribeEnv{mgladdon} This environment adds its contents to the document's main script, but it doesn't produce any image. It doesn't require any kind of arguments. It is useful to add ``complementary code'', like loading of dynamic libraries, set default size for the graphics, etc.
+% \DescribeEnv{mgladdon} This environment adds its contents to the document's main script, but it doesn't produce any image. It doesn't require any kind of arguments. It is useful to add ``complementary code'', like instructions to load dynamic libraries, set default size for the graphics, etc.
 % \begin{center}
 %   \begin{tabular}{l}
 %     \hline\\[-0.75em]
 %   \end{tabular}
 % \end{center}
 %
-% \DescribeEnv{mglcode} It has the same function as the |mgl| environment, but the corresponding code is written to a separate script, whose name is specified as mandatory argument. It accepts the same optional arguments as |mgl|, except, of course, the |label| option.
+% \DescribeEnv{mglcode} It has the same function as the |mgl| environment, but the corresponding code is written to a separate script, whose name is specified as mandatory argument. It accepts the following optional arguments:
+% \begin{itemize}
+%   \item \textbf{bb, bbllx, bblly, bburx, bbury, natwidth, natheight, hiresbb, viewport, trim, angle, origin, width, height, totalheight, keepaspectratio, scale, clip, draft, type, ext, read, command:} These are the same options of the |\includegraphics| command from the \textsf{graphicx} package.
+%   \item \textbf{gray:} Can be used to activate (|gray=on| or |gray=1|) or deactivate (|gray=off| or |gray=0|) gray-scale mode privately (only for the current graphic).
+%   \item \textbf{mglscale:} Any positive value for this option is used to physically scale the resulting image file, i.g., |mglscale=2| will create an image file twice as bigger.
+%   \item \textbf{quality:} Sets the quality of the current graphic. Valid values are integers between |0| and |9|.
+%   \item \textbf{variant:} Sets the variant of argument for the commands in the current script.
+%   \item \textbf{imgext:} Can be used to set the extension for the current image.
+% \end{itemize}
 % \begin{center}
 %   \begin{tabular}{l}
 %     \hline\\[-0.75em]
 %   \end{tabular}
 % \end{center}
 %
-% \DescribeEnv{mglcommon} This is used to create a common ``setup'' script to define constants, parameters, etc. that will be available to the others.
+% \DescribeEnv{mglsetupscript} This is used to create a common ``setup'' script to define constants, parameters, etc. that will be available to the others.
 % \begin{center}
 %   \begin{tabular}{l}
 %     \hline\\[-0.75em]
-%     |\begin{mglcommon}|\\[0.5em]
+%     |\begin{mglsetupscript}|\\[0.5em]
 %       \hss\meta{MGL code}\hss\\[0.5em]
-%     |\end{mglcommon}|\\[0.25em]
+%     |\end{mglsetupscript}|\\[0.25em]
 %     \hline
 %   \end{tabular}
 % \end{center}
 %
 % For example, one could write
 % \begin{quote}
-%   |\begin{mglcommon}|\\
+%   |\begin{mglsetupscript}|\\
 %   |define gravity 9.81 # [m/s^2]|\\
-%   |\end{mglcommon}|
+%   |\end{mglsetupscript}|
 % \end{quote}
 % to make the constant \emph{gravity} available to every script.
 %
+% \DescribeEnv{mglcommon} This is a synomyn for the |mglsetupscript| environment. It is and will always be kept in \textsf{\mglTeX} for backwards compatibility with older versions of the package, but its use is \emph{deprecated}.
+% \begin{center}
+%   \begin{tabular}{l}
+%     \hline\\[-0.75em]
+%     |\begin{mglcommon}|\\[0.5em]
+%       \hss\meta{MGL code}\hss\\[0.5em]
+%     |\end{mglcommon}|\\[0.25em]
+%     \hline
+%   \end{tabular}
+% \end{center}
+%
 % \subsection{Fast creation of graphics}
 % \noindent\textsf{\mglTeX} defines a convenient way to work with many graphics that have exactly the same settings (same rotation angles, same type of grid, same lighting, etc.): instead of writing repetitive code every time it's needed, it can be stored inside a |mglsetup| environment, and then can be used when needed with the |\mglplot| command.
 %
 %   \end{tabular}
 % \end{center}
 %
-% \DescribeMacro{\mglplot} This command is used for fast generation of graphics with default settings, and can be used in parallel with the |mglsetup| environment. It accepts one mandatory argument which consists of MGL instructions, separated by the symbol ``:'', and can span through various text lines. It accepts the same optional arguments as the |mgl| environment, plus two additional ones, called |setup| and |separator|. The |setup| option specifies a keyword associated to a |mglsetup| block, which will be executed before the code in the mandatory argument. The |separator| option specifies a text symbol that will break the code in the mandatory argument into a new physical line in the main script every time is encountered.
+% \DescribeMacro{\mglplot} This command is used for fast generation of graphics with default settings, and can be used in parallel with the |mglsetup| environment. It accepts one mandatory argument which consists of MGL instructions, separated by the symbol ``:'', and can span through various text lines. It accepts the following optional arguments:
+% \begin{itemize}
+%   \item \textbf{bb, bbllx, bblly, bburx, bbury, natwidth, natheight, hiresbb, viewport, trim, angle, origin, width, height, totalheight, keepaspectratio, scale, clip, draft, type, ext, read, command:} These are the same options of the |\includegraphics| command from the \textsf{graphicx} package.
+%   \item \textbf{gray:} Can be used to activate (|gray=on| or |gray=1|) or deactivate (|gray=off| or |gray=0|) gray-scale mode privately (only for the current graphic).
+%   \item \textbf{mglscale:} Any positive value for this option is used to physically scale the resulting image file, e.g., |mglscale=2| will create an image file twice as bigger.
+%   \item \textbf{quality:} Sets the quality of the current graphic. Valid values are integers between |0| and |9|.
+%   \item \textbf{variant:} Sets the variant of argument for the commands in the current script.
+%   \item \textbf{imgext:} Can be used to set the extension for the current image.
+%   \item \textbf{label:} Can be used to indicate a name for the corresponding graphic (otherwise, an automatic naming will be applied)
+%   \item \textbf{setup:} Specifies a keyword associated to a |mglsetup| block, which will be executed before the code in the mandatory argument.
+%   \item \textbf{separator:} Specifies a text symbol that will break the code in the mandatory argument into a new physical line in the main script every time is encountered.
+% \end{itemize}
 % \begin{center}
 %   \begin{tabular}{l}
 %     \hline\\[-0.75em]
 % \end{center}
 %
 % \subsection{Verbatim-like environments}
-% \noindent The main purpose of these environments is to typeset their contents to the \LaTeX{} document, elegantly separated from the rest of the text. They have two versions: an unstarred version which can be listed later with the |\listofmglscripts| command (see below), and a starred version which won't be listed.
+% \noindent The main purpose of these environments is to typeset their contents to the \LaTeX{} document, elegantly separated from the rest of the text. They have two versions: an unstarred version which can be listed later with the |\listofmglscripts| command (explained later), and a starred version which won't be listed.
 %
-% Although these environments are intended to mimic the behavior of the |verbatim| environment from \LaTeX{}, there is an important difference, namely, long lines will be broken when the page margin is reached. This intended behavior is set because a language like MGL can easily have very long lines of code, like textual formulas, vectors input as lists of values, etc. Of course, no hyphenation will be performed, but the code will be indented in the second, third, etc. continuation lines by an amount specified by |\mglbreakindent| (see below).
+% Although these environments are intended to mimic the behavior of the |verbatim| environment from \LaTeX{}, there is an important difference, namely, long lines will be broken when the page margin is reached. This intended behavior is set because a language like MGL can easily have very long lines of code, like textual formulas, vectors input as lists of values, etc. Of course, no hyphenation will be performed, but the code will be indented in the second, third, etc. continuation lines by an amount specified by |\mglbreakindent| (explained later).
 %
-% \DescribeEnv{mglblock}\DescribeEnv{mglblock*} Besides typesetting its contents to the document, |mglblock| creates a script whose name is specified as mandatory argument. It also accepts one optional argument, called |lineno|, whose default value is |true|, used to activate (|lineno=true|) or deactivate (|lineno=false|) line numbering inside the environment. The default behavior is to number each line of code.
+% \DescribeEnv{mglblock}\DescribeEnv{mglblock*} Besides typesetting its contents to the document, |mglblock| creates a script whose name is specified as mandatory argument. It accepts one optional argument:
+% \begin{itemize}
+%   \item \textbf{lineno:} Used to activate (|lineno=true| or simply |lineno|) or deactivate (|lineno=false|) line numbering inside the environment.
+% \end{itemize}
+% By default, each line of code is numbered.
 % \begin{center}
 %   \begin{tabular}{l}
 %     \hline\\[-0.75em]
 % \begin{quote}
 %   \makeatletter
 %   \MGL@set@script@name{example_script}%
-%   \refstepcounter{MGL@verb@script@no}%
-%   \addcontentsline{lms}{MGL@script}{\protect\numberline{\theMGL@verb@script@no.}{\ttfamily\protect\detokenize{\MGL@script@name.mgl}}}%
+%   \refstepcounter{MGL@verb@no}%
+%   \addcontentsline{lms}{MGL@script}{\protect\numberline{\theMGL@verb@no.}{\ttfamily\protect\detokenize{\MGL@script.mgl}}}%
 %   \setcounter{MGL@line@no}{0}%
 %   \list{\mgllinenostyle\arabic{MGL@line@no}.}{}%
 %   \MGL@set@pseudo@verb@env
 %   \fboxrule=\mgllinethickness%
-%   \item[\MGL@line@sep]\fbox{\bfseries\ttfamily\expandafter\detokenize\expandafter{\MGL@script@name.mgl}}\hskip\labelsep\MGL@line@sep\par\par%
+%   \item[\MGL@line@sep]\fbox{\bfseries\ttfamily\expandafter\detokenize\expandafter{\MGL@script.mgl}}\hskip\labelsep\MGL@line@sep\par\par%
 %   \stepcounter{MGL@line@no}%
 %   \item new x 50 40 '0.8*sin(pi*x)*sin(pi*(y+1)/2)'
 %   \stepcounter{MGL@line@no}%
 %   \endlist%
 % \end{quote}
 %
-% \DescribeEnv{mglverbatim}\DescribeEnv{mglverbatim*} This environment only typesets its contents to the \LaTeX{} document without creating any script. It accepts the |lineno| option, with default value |true|, plus an one called |label|, intended to specify a name associated to the corresponding code. The default behavior is to number each line of code.
+% \DescribeEnv{mglverbatim}\DescribeEnv{mglverbatim*} This environment only typesets its contents to the \LaTeX{} document without creating any script. It accepts two optional arguments
+% \begin{itemize}
+%   \item \textbf{lineno:} Used to activate (|lineno=true| or simply |lineno|) or deactivate (|lineno=false|) line numbering inside the environment.
+%   \item \textbf{label:} Used to specify a name associated to the corresponding code.
+% \end{itemize}
+% The default behavior is to number each line of code.
 % \begin{center}
 %   \begin{tabular}{l}
 %     \hline\\[-0.75em]
 %   \fboxrule=\mgllinethickness%
 %   \MGL@set@script@name{\mglverbatimname}%
 %   \item[\MGL@line@sep]\hskip-\labelsep\MGL@line@sep%
-%   \refstepcounter{MGL@verb@script@no}%
-%   \addcontentsline{lms}{MGL@script}{\protect\numberline{\theMGL@verb@script@no.}{\ttfamily\protect\detokenize{\MGL@script@name}}}%
+%   \refstepcounter{MGL@verb@no}%
+%   \addcontentsline{lms}{MGL@script}{\protect\numberline{\theMGL@verb@no.}{\ttfamily\protect\detokenize{\MGL@script}}}%
 %   \stepcounter{MGL@line@no}%
 %   \item new x 50 40 '0.8*sin(pi*x)*sin(pi*(y+1)/2)'
 %   \stepcounter{MGL@line@no}%
 % \end{quote}
 % \noindent If a |label| is specified, the output will look exactly as that of the |mglblock| environment.
 %
-% \DescribeEnv{mglcomment} This environment is used to embed commentaries in the \LaTeX{} document. The commentary won't be visible in the case of the user passing the option |nocomments| to the package, but it will be typeset \emph{verbatim} to the document if the user passes the option |comments|.
+% \DescribeEnv{mglcomment} This environment is used to embed comments. The comment won't be visible in the case of the user passing the option |nocomments| to the package, but it will be typeset \emph{verbatim} to the document if the user passes the option |comments|.
 % \begin{center}
 %   \begin{tabular}{l}
 %     \hline\\[-0.75em]
 %     |\begin{mglcomment}|\\[0.5em]
-%       \hss\meta{Commentary}\hss\\[0.5em]
+%       \hss\meta{Comment}\hss\\[0.5em]
 %     |\end{mglcomment}|\\[0.25em]
 %     \hline
 %   \end{tabular}
 % \end{center}
-% If the user requests visible commentaries, this will result in the appearance of something like the following in the \LaTeX{} document:
+% If the user requests visible comments, this will result in the appearance of something like the following in the \LaTeX{} document:
 % \begin{quote}
 %   \makeatletter
 %   \list{}{}%
 %   \MGL@set@pseudo@verb@env
 %   \item\hskip-\labelsep<\MGL@dash@sep\mglcommentname\MGL@dash@sep>%
-%   \item This is a MGL commentary
+%   \item This is a mglTeX comment
 %   \item\hskip-\labelsep<\MGL@dash@sep\mglcommentname\MGL@dash@sep>%
 %   \endlist%
 % \end{quote}
 %
 % \subsection{Working with external scripts}
-% \noindent External scripts exist in their own files, independently of the \LaTeX{} document ---for example, a script sent by a colleague, a script created before the actual writing of the \LaTeX{} document, etc. \textsf{\mglTeX} provides convenient ways to deal with external scripts, as if they were embedded. It must be noted, however, that the package works on the suposition that these scripts are in their final version, so no change detection is performed on them. If a external script is changed, the corresponding graphic must be manually deleted in oreder to force recompilation.
+% \noindent \textsf{\mglTeX} provides convenient ways to deal with external scripts (scripts that exist in their own files, independently of the \LaTeX{} document, like scripts sent by a colleague or created before the actual writing of the \LaTeX{} document, etc). It must be noted, however, that the package works on the suposition that these scripts are in their final version, so no change detection is performed on them. If a external script is changed, the corresponding graphic must be manually deleted in oreder to force recompilation.
+%
+% \DescribeMacro{\mglgraphics} This command takes the name of an external MGL script as mandatory argument, which will be automatically executed, and the resulting image will be included. The same optional arguments accepted by this command are:
+% \begin{itemize}
+%   \item \textbf{bb, bbllx, bblly, bburx, bbury, natwidth, natheight, hiresbb, viewport, trim, angle, origin, width, height, totalheight, keepaspectratio, clip, draft, type, ext, read, command:} These are the same options of the |\includegraphics| command from the \textsf{graphicx} package.
+%   \item \textbf{gray:} Can be used to activate (|gray=on| or |gray=1|) or deactivate (|gray=off| or |gray=0|) gray-scale mode privately (only for the current graphic).
+%   \item \textbf{mglscale:} Any positive value for this option is used to physically scale the resulting image file, i.g., |mglscale=2| will create an image file twice as bigger.
+%   \item \textbf{quality:} Sets the quality of the current graphic. Valid values are integers between |0| and |9|.
+%   \item \textbf{variant:} Sets the variant of argument for the commands in the current script.
+%   \item \textbf{imgext:} Can be used to set the extension for the current image.
+%   \item \textbf{path:} Can be used to specify the location of the script.
+% \end{itemize}
 %
-% \DescribeMacro{\mglinclude}\DescribeMacro{\mglinclude*} This command is the equivalent of the |mglverbatim| environment for external scripts. It takes one mandatory argument, which is the name of a MGL script, which will be automatically transcript \emph{verbatim} on the \LaTeX{} document. It accepts the same optional arguments as the |\mglgraphics| command, plus the |lineno| option to activate/deactivate line numbering. There are unstarred version of this command will be listed if |\listofmglscripts| is used, while the starred version won't.
+% \DescribeMacro{\mglinclude}\DescribeMacro{\mglinclude*} This command is the equivalent of the |mglverbatim| environment for external scripts. It takes one mandatory argument, which is the name of a MGL script, which will be automatically transcript \emph{verbatim} on the \LaTeX{} document. It accepts the following optional arguments:
+% \begin{itemize}
+%   \item \textbf{lineno:} Used to activate (|lineno=true| or simply |lineno|) or deactivate (|lineno=false|) line numbering inside the environment.
+%   \item \textbf{path:} Can be used to specify the location of the script.
+% \end{itemize}
+% The unstarred version of this command will be listed if |\listofmglscripts| is used (explained later), while the starred version won't.
 % \begin{center}
 %   \begin{tabular}{l}
 %     \hline\\[-0.75em]
-%     |\mglinclude|\marg{script\_name}\oarg{key-val list}\\[0.25em]
+%     |\mglinclude|\oarg{key-val list}\marg{script\_name}\\[0.25em]
 %     \hline
 %   \end{tabular}
 % \end{center}
 %   \end{tabular}
 % \end{center}
 %
-% \DescribeMacro{\mglgraphics} This takes one mandatory argument, which is the name of an external MGL script, which will be automatically executed, and the resulting image will be included. The same optional arguments as the |\includegraphics| command are accepted, plus the |imgext| option to specify the extension of the resulting graphic, and an additional option, |path|, which can be used to specify the location of the script.
+% \subsection{Additional commands}
+% \DescribeMacro{\listofmglscripts}\noindent Opens a new section or chapter---depending on the \LaTeX{} class used---, where all the scripts that have been transcript in the document with the unstarred versions of the |mglblock| and |mglverbatim| environments, and the |\mglinclude| command, are listed. In case a |mglverbatim| is used, but no |label| is specified, the default name to display is specified by the |\mglverbatimname| macro (explained later), otherwise, the corresponding label is typeset.
 % \begin{center}
 %   \begin{tabular}{l}
 %     \hline\\[-0.75em]
-%     |\mglgraphics|\oarg{key-val list}\marg{script\_name}\\[0.25em]
+%     |\listofmglscripts|\\[0.25em]
 %     \hline
 %   \end{tabular}
 % \end{center}
+% The output is like this:
+% \begin{center}
+%   \begin{minipage}{0.9\textwidth}
+%     \listofmglscripts
+%   \end{minipage}
+% \end{center}
 %
-% \subsection{Additional commands}
-% \DescribeMacro{\mglname}\noindent This command can be used in the preamble of the document to indicate the name of the main script, passed as mandatory argument. If used after the |\begin{document}| command, it will force the closure of the current main script, create the corresponding graphics, and start a new script with the specified name.
+% \DescribeMacro{\mglTeX}\DescribeMacro{\mglTeX*} This command just pretty-prints the name of the package, i.e., the logo:
+% \begin{center}
+%   \Huge\mglTeX
+% \end{center}
+% The starred version will also print the version in a coherent manner.
 % \begin{center}
 %   \begin{tabular}{l}
 %     \hline\\[-0.75em]
-%     |\mglname|\marg{main\_script\_name}\\[0.25em]
+%     |\mglTeX|\\[0.25em]
+%     \hline
+%   \end{tabular}
+% \end{center}
+% \begin{center}
+%   \begin{tabular}{l}
+%     \hline\\[-0.75em]
+%     |\mglTeX*|\\[0.25em]
 %     \hline
 %   \end{tabular}
 % \end{center}
 %
-% The use of this command is encouraged when writing large documents, like books or thesis, to create a main script per document block (section, chapter, part, etc.). Since the |mgl| environment and the |\mglplot| command use an internal counter to automatically name scripts, unless the |label| option is used; if a new script is added this way to the document, it will alter the original numbering, causing \textsf{\mglTeX} to recompile the scripts from that point on (for more details, read subsection \ref{subsection: recompilation decision}). If the |\mglname| command is used, only the scripts of the current document block will be recompiled.
+% In an environment where the typesetting of the logo is impossible (a text editor, for instance), it can (and should) be replaced by ``mglTeX''.
 %
-% \DescribeMacro{\mglimgext} Can be used to specify the extension to save graphics. Its effect is local, meaning that the new quality will be applied from the point this command is used~on.
+% \subsection{Local settings commands}\label{local setts}
+% \noindent These commands are intended to be equivalent to the package options, but with a local-only effect, meaning that the new settings are applied from the point these commands are used onward.
+%
+% \DescribeMacro{\mglswitch} This command is equivalent to the package options |on| and |off|, depending on the argument passed.
 % \begin{center}
 %   \begin{tabular}{l}
 %     \hline\\[-0.75em]
-%     |\mglimgext|\marg{image extension}\\[0.25em]
+%     |\mglswitch{|\meta{off\,$\vert$on\,$\vert$0\,$\vert$1}|}|\\[0.25em]
+%     \hline
+%   \end{tabular}
+% \end{center}
+%
+% Observe that |\mglswitch{on}| and |\mglswitch{off}| can be used to save time when writing a document, wrapping a section with them, avoiding recompilation of the corresponding scripts.
+%
+% \DescribeMacro{\mglcomments} This command is equivalent to the package options |comments| and |nocomments|, depending on the argument passed.
+% \begin{center}
+%   \begin{tabular}{l}
+%     \hline\\[-0.75em]
+%     |\mglcomments{|\meta{off\,$\vert$on\,$\vert$0\,$\vert$1}|}|\\[0.25em]
+%     \hline
+%   \end{tabular}
+% \end{center}
+%
+% \DescribeMacro{\mglgray} It is equivalent to the package options |gray| and |color|, depending on the argument passed.
+% \begin{center}
+%   \begin{tabular}{l}
+%     \hline\\[-0.75em]
+%     |\mglgray{|\meta{off\,$\vert$on\,$\vert$0\,$\vert$1}|}|\\[0.25em]
+%     \hline
+%   \end{tabular}
+% \end{center}
+%
+% \DescribeMacro{\mglscale} Can be used to specify the default scaling for the creation of MGL graphics (1 is normal scaling, 2 is twice as bigger, etc.).
+% \begin{center}
+%   \begin{tabular}{l}
+%     \hline\\[-0.75em]
+%     |\mglscale|\marg{$x:x>0$}\\[0.25em]
 %     \hline
 %   \end{tabular}
 % \end{center}
 %     \hline
 %     $8$ & Draw dots instead of primitives (extremely fast)\\
 %     \hline
+%     $9$ & No drawing (for testing purposes)\\
+%     \hline
 %   \end{tabular}
 %   \MakeShortVerb{\|}
 % \end{center}
 % \begin{center}
 %   \begin{tabular}{l}
 %     \hline\\[-0.75em]
-%     |\mglquality|\marg{0$\vert$1$\vert$\ldots$\vert$8}\\[0.25em]
+%     |\mglquality|\marg{0\,$\vert$1\,$\vert$\ldots\,$\vert$9}\\[0.25em]
 %     \hline
 %   \end{tabular}
 % \end{center}
 %
-% \DescribeMacro{\mglscale} Can be used to specify the default scaling for the creation of MGL graphics (1 is normal scaling, 2 is twice as bigger, etc.). Its effect is local, meaning that the new scaling will be applied from the point this command is used on. Any non negative value can be specified.
+% \DescribeMacro{\mglvariant} It is useful to set the default variant of arguments for MGL commands.
 % \begin{center}
 %   \begin{tabular}{l}
 %     \hline\\[-0.75em]
-%     |\mglscale|\marg{1$\vert$2$\vert$\ldots$\vert$9}\\[0.25em]
+%     |\mglvariant|\marg{0\,$\vert$1\,$\vert$\ldots}\\[0.25em]
 %     \hline
 %   \end{tabular}
 % \end{center}
 %
-% \DescribeMacro{\mglswitch} This command is equivalent to the package options |on| and |off|, depending on the argument passed, but it's effect is local.
+% \DescribeMacro{\mglimgext} Can be used to specify the extension to save graphics.
 % \begin{center}
 %   \begin{tabular}{l}
 %     \hline\\[-0.75em]
-%     |\mglswitch{|\meta{on$\vert$off}|}|\\[0.25em]
+%     |\mglimgext|\marg{image extension}\\[0.25em]
 %     \hline
 %   \end{tabular}
 % \end{center}
 %
-% Observe that |\mglswitch{on}| and |\mglswitch{off}| can be used to save time when writing a document, wrapping a section with them, avoiding recompilation of the corresponding scripts.
-%
-% \DescribeMacro{\mglcomments} This command is equivalent to the package options |comments| and |nocomments|, depending on the argument passed, but its effect is local.
+% \DescribeMacro{\mglname}\noindent If used in the preamble of the document this commands just sets the name of the. If used after the |\begin{document}| command, it will force the closure of the current main script, create the corresponding graphics, and start a new main script with the specified name.
 % \begin{center}
 %   \begin{tabular}{l}
 %     \hline\\[-0.75em]
-%     |\mglcomments{|\meta{on$\vert$off$\vert$true$\vert$false}|}|\\[0.25em]
+%     |\mglname|\marg{main\_script\_name}\\[0.25em]
 %     \hline
 %   \end{tabular}
 % \end{center}
 %
-% \DescribeMacro{\listofmglscripts} Opens a new section or chapter---depending on the \LaTeX{} class used---, where all the scripts that have been transcript in the document with the unstarred versions of the |mglblock| and |mglverbatim| environments, and the |\mglinclude| command, are listed. In case a |mglverbatim| is used, but no |label| is specified, the default name to display is specified by the |\mglverbatimname| macro (see below), otherwise, the corresponding label is typeset.
-% \begin{center}
-%   \begin{tabular}{l}
-%     \hline\\[-0.75em]
-%     |\listofmglscripts|\\[0.25em]
-%     \hline
-%   \end{tabular}
-% \end{center}
-% The output is like this:
-% \begin{center}
-%   \begin{minipage}{0.9\textwidth}
-%     \listofmglscripts
-%   \end{minipage}
-% \end{center}
-%
-% \DescribeMacro{\mglTeX}\DescribeMacro{\mglTeX*} This command just pretty-prints the name of the package; if followed by an asterisk, it will also print the version, separated with an unbreakable space.
-% \begin{center}
-%   \begin{tabular}{l}
-%     \hline\\[-0.75em]
-%     |\mglTeX|\\[0.25em]
-%     \hline
-%   \end{tabular}
-% \end{center}
-% \begin{center}
-%   \begin{tabular}{l}
-%     \hline\\[-0.75em]
-%     |\mglTeX*|\\[0.25em]
-%     \hline
-%   \end{tabular}
-% \end{center}
+% The use of this command is encouraged when writing large documents, like books or thesis, to create a main script per document block (section, chapter, part, etc.). Since the |mgl| environment and the |\mglplot| command use an internal counter to automatically name scripts, unless the |label| option is used; if a new script is added this way to the document, it will alter the original numbering, causing \textsf{\mglTeX} to recompile the scripts from that point on (for more details, read subsection \ref{subsection: recompilation decision}). If the |\mglname| command is used, only the scripts of the current document block will be recompiled.
 %
-% \subsection{Advanced setup commands}
+% \subsection{Advanced settings commands}
 % \noindent Although \textsf{\mglTeX} is completely functional without any further set up, there are some parameters of its behavior that could be useful to modify. The following commands must be used in the preamble of the document only, since the first MGL script is created at the moment of the |\begin{document}| command, and otherwise they could create weird errors during compilation; trying to use them somewhere else will produce an error. 
 %
 % \DescribeMacro{\mgldir} This command can be used to specify the main working directory for \textsf{\mglTeX}. Inside it, the scripts, backup files and graphics will be created, or can be separated inside subdirectories. This is useful, for example, to avoid many scripts and graphics from polluting the directory where the \LaTeX{} document is.
 % \end{center}
 % This command can be used many times or can be used to specify many paths at once. In the case of using it many times, each call will add the new directory or directories to the list of searching paths.
 %
-% \DescribeMacro{mglsettings} This command has been added for the confort of the user, since it handles all of the basic and advanced settings of \textsf{\mglTeX}, as an alternative to some package options and commands. It takes one mandatory argument which should be a list of \meta{key}=\meta{value} pairs, according to the following table:
+% \DescribeMacro{\mglsettings} This command has been added for the confort of the user, since it handles all of the basic and advanced settings of \textsf{\mglTeX}, as an alternative to some package options and commands. It takes one mandatory argument which should be a list of \meta{key}=\meta{value} pairs, according to the following table:
 % \begin{center}
 %   \DeleteShortVerb{\|}
 %   \begin{tabular}{|l|l|l|}
 %     \hline
 %     paths & \meta{directory list} & Paths to external scripts\\
 %     \hline
-%     quality & \meta{0$\vert$1$\vert$\ldots$\vert$8} & Quality for creation of graphics\\
+%     switch & \meta{off\,$\vert$on\,$\vert$0\,$\vert$1} & Turn off/on \mglTeX\\
 %     \hline
-%     scale & \meta{1$\vert$2$\vert$\ldots$\vert$9} & Scale for creation of graphics\\
+%     comments & \meta{off\,$\vert$on\,$\vert$0\,$\vert$1} & Turn off/on comments\\
+%     \hline
+%     gray & \meta{off\,$\vert$on\,$\vert$0\,$\vert$1} & Turn off/on gray-scale mode\\
+%     \hline
+%     mglscale & \meta{$x:x>0$} & Scale for creation of graphics\\
+%     \hline
+%     quality & \meta{0\,$\vert$1\,$\vert$\ldots\,$\vert$9} & Quality for creation of graphics\\
+%     \hline
+%     variant & \meta{0\,$\vert$1\,$\vert$\ldots} & Variant of arguments for MGL commands\\
 %     \hline
 %     imgext & \meta{image extension} & Extension for creation of graphics\\
 %     \hline
 % \end{center}
 %
 % \subsection{User-definable macros}
-% \noindent There are macros that the user is allowed to modify in order to customize some aspects of the behavior of \textsf{\mglTeX}. For example, if writing in spanish, french or russian, the user would like to modify the name of the common script, the words typeset in the separator lines of MGL commentaries, the name of the list of MGL scripts, etc.
+% \noindent There are macros that the user is allowed to modify in order to customize some aspects of the behavior of \textsf{\mglTeX}. For example, if writing in spanish, french or russian, the user would like to modify the name of the common script, the words typeset in the separator lines of mglTeX comments, the name of the list of MGL scripts, etc.
 %
-% \DescribeMacro{\mglcommonscriptname} It is the name for the common script that takes the contents of the |mglcommon| environment. The default name is defined by
+% \DescribeMacro{\mglsetupscriptname} It is the name for the common setup script that takes the contents of the |mglseuptscipt| or |mglcommon| environments. The default name is defined by
 % \begin{quote}
-%   |\def\mglcommonscriptname{MGL_common_script}|
+%   |\def\mglsetupscriptname{MGL_setup_script}|
 % \end{quote}
 %
-% \DescribeMacro{\mglcommentname} This macro expands to the words typeset before and after a MGL commentary, in the middle of the separator lines. The default words are set by
+% \DescribeMacro{\mglcommentname} This macro expands to the words typeset before and after a \textsf{\mglTeX} comment, in the middle of the separator lines. The default words are set by
 % \begin{quote}
-%   |\def\mglcommentname{MGL commentary}|
+%   |\def\mglcommentname{\mglTeX{} comment}|
 % \end{quote}
 %
 % \DescribeMacro{\listofmglscriptsname} This is the name of the section/chapter created by the command |\listofmglscripts|. The default is set by
 % \StopEventually{\PrintChanges\PrintIndex}
 %
 % \section{Implementation}
-% \noindent This section documents the complete implementation of \textsf{\mglTeX}. It's main purpose is to facilitate the understanding and maintanance of the package's code. For the following, we use ``|@|'' in the name of macros the user should not modify; the prefix ``|MGL|'' is used to simulate a namespace, so the macros from \textsf{\mglTeX} won't interfere with the ones from other packages.
+% \noindent This section documents the complete code of \textsf{\mglTeX}. It's main purpose is to facilitate the understanding and maintanance of the package's code. For the following, we use ``|@|'' in the name of macros the user should not modify; the prefix ``|MGL|'' is used to simulate a namespace, so the macros from \textsf{\mglTeX} won't interfere with the ones from other packages.
 %
-% \subsection{Initialization}
+% \subsection{Initialization}\label{Init}
 % \noindent We first define some macros that will serve different purposes on different parts of the package.
+% \begin{macro}{\MGL@off}\begin{macro}{\MGL@on}\begin{macro}{\MGL@zero}\begin{macro}{\MGL@one}
+% These are used in the command |\MGL@test@switch| (explained later) to determine whether the user has passed one of the options |off|, |on|, |0| or |1| to a command.
+%    \begin{macrocode}
+\def\MGL@off{off}
+\def\MGL@on{on}
+\def\MGL@zero{0}
+\def\MGL@one{1}
+%    \end{macrocode}
+% \end{macro}\end{macro}\end{macro}\end{macro}
+% \begin{macro}{\MGL@test@switch}
+% \changes{\textbf{v4.2 ------------}}{2016/05/14}{New command to verify and validate switching arguments}
+% It is called by a command to test whether the user has passed the option |off|, |on|, |0| (equivalent to |off|) or |1| (equivalent to |on|); if the option is correct, it is replaced by its equivalent, otherwise, a warning is issued. It takes two arguments: the first one is the option to test, the second one is the name of the command calling this macro.
+%    \begin{macrocode}
+\def\MGL@test@switch#1#2{%
+  \def\MGL@temp@a{#1}%
+  \ifx\MGL@temp@a\MGL@on%
+  \else\ifx\MGL@temp@a\MGL@off%
+  \else\ifx\MGL@temp@a\MGL@one%
+    \def\MGL@temp@a{on}%
+  \else\ifx\MGL@temp@a\MGL@zero%
+    \def\MGL@temp@a{off}%
+  \else%
+    \PackageWarning{mgltex}{%
+      Unrecognizable option "#1" passed to command \protect#2%
+    }%
+  \fi\fi\fi\fi%
+}
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}{\MGL@TeX@ext}
-% Is used to determine whether the user has chosen to save graphics in \LaTeX/Tikz format.
+% Is used in the command |\MGL@includegraphics| (explained later) to determine whether the user has chosen to save graphics in \LaTeX/Tikz format.
 %    \begin{macrocode}
 \def\MGL@TeX@ext{.tex}
 %    \end{macrocode}
 % \end{macro}
 %
-% The macros |\MGL@switch@on| and |\MGL@switch@off| are called when the package options |on| and |off| are passed, respectively.
+% The macros |\MGL@switch@on| and |\MGL@switch@off| are called when the package options |on| and |off| are passed, respectively, or when the commands |\mglswitch{on}| and |\mglswitch{off}| are used, respectively.
 % \begin{macro}{\MGL@switch@on}
 % (Re)defines the commands to open, read, write and close scripts, and the command that includes MGL graphics.
 %    \begin{macrocode}
 %    \begin{macrocode}
   \def\MGL@includegraphics{%
 %    \end{macrocode}
-% First checks if the image exists. Note the |\MGL@dir| and |\MGL@graphics@dir| macros are set by the user with the |\mgldir| and |\mglgraphicsdir| commands, respectively, while |\MGL@script@name| stores the name of the script ---and thus the image--- executed, and |\MGL@graph@ext| is the extension chosen by the user to save the graphics.
+% First checks if the image exists. Note the |\MGL@dir| and |\MGL@graphics@dir| macros are set by the user with the |\mgldir| and |\mglgraphicsdir| commands, respectively, while |\MGL@script| stores the name of the script ---and thus the image--- executed, and |\MGL@imgext| is the extension chosen by the user to save the graphics.
 %    \begin{macrocode}
-    \IfFileExists{\MGL@dir\MGL@graphics@dir\MGL@script@name\MGL@graph@ext}{%
+    \IfFileExists{\MGL@dir\MGL@graphics@dir\MGL@script\MGL@imgext}{%
 %    \end{macrocode}
 % If the chosen extension is |.tex|, a \LaTeX/Tikz file has been created, which has to be simply included in the document; it will be automatically compiled by \LaTeX{}. (Observe we use the |\MGL@TeX@ext| macro defined above.)
 %    \begin{macrocode}
-      \ifx\MGL@graph@ext\MGL@TeX@ext%
-        \include{\MGL@dir\MGL@graphics@dir\MGL@script@name\MGL@graph@ext}%
+      \ifx\MGL@imgext\MGL@TeX@ext%
+        \include{\MGL@dir\MGL@graphics@dir\MGL@script\MGL@imgext}%
 %    \end{macrocode}
 % If the chosen extension is not |.tex|, a normal visual image has been created, so the |\includegraphics| command is invoked to deal with it. The options for this command (like |scale|, |angle|, etc.) are stored in the |\MGL@graph@keys| macro, which is defined by every environment or command that creates and compiles MGL scripts, according to the optional arguments the user has passed.
 %    \begin{macrocode}
       \else%
         \expandafter\includegraphics\expandafter[\MGL@graph@keys]{%
-          \MGL@dir\MGL@graphics@dir\MGL@script@name%
+          \MGL@dir\MGL@graphics@dir\MGL@script%
         }%
       \fi%
     }{%
 %    \end{macrocode}
 % If the requested image doesn't exist, the issue a warning message for the user, and print a warning framed box (``\textbf{MGL image not found}'') in the place the image should occupy.
 %    \begin{macrocode}
-      \PackageWarning{mgltex}{MGL image "\MGL@script@name" not found}%
+      \PackageWarning{mgltex}{MGL image "\MGL@script" not found}%
       \fbox{%
         \centering%
         \bfseries\Huge%
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@MGL@comments@on}\begin{macro}{\@MGL@comments@off}
-% We will need a boolean switch to activate/deactivate commentaries later.
+% \begin{macro}{\@MGL@comments@off}\begin{macro}{\@MGL@comments@on}
+% We will need a boolean switch to activate/deactivate comments later.
 %    \begin{macrocode}
 
+\def\@MGL@comments@off{\let\if@MGL@comments@\iffalse}
 \def\@MGL@comments@on{\let\if@MGL@comments@\iftrue}
-\def\@MGL@comments@off{\let\if@mglcomments@\iffalse}
 %    \end{macrocode}
 % \end{macro}\end{macro}
 %
+% \begin{macro}{\MGL@gray}\begin{macro}{\MGL@gray@off}\begin{macro}{\MGL@gray@on}
+% The commands |\MGL@gray@off| and |\MGL@gray@on| simply set the value of |\MGL@gray| to $0$ and $1$, respectively; this value will be used later through the |-g| command line option from |mglconv|.
+%    \begin{macrocode}
+
+\def\MGL@gray@off{\def\MGL@gray{0}}
+\def\MGL@gray@on{\def\MGL@gray{1}}
+%    \end{macrocode}
+% \end{macro}\end{macro}\end{macro}
+% \begin{macro}{\mglgray}
+% Depending on the option passed by the user, it calls |\@MGL@gray@on| or |\@MGL@gray@off|.
+%    \begin{macrocode}
+\def\mglgray#1{%
+  \MGL@test@switch{#1}{\mglgray}%
+  \csname @MGL@gray@\MGL@temp@a\endcsname%
+}
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}{\mglscale}\begin{macro}{\MGL@scale}
-% |\mglscale| sets the value of the |\MGL@scale| macro, which is used later to specify the default scaling for graphics. It only accepts integer values from $1$ to $9$, otherwise it issues a warning and restarts the scaling to $1$. In order to be able to check the validity of the value passed by the user, we first set the |\MGL@scale| macro to that value and test it with the |\ifcase| conditional; if the value is valid, we do nothing, but if it is invalid, we issue a warning and overwrite |\MGL@scale| to $1$.
+% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Now accepts any positive value}
+% |\mglscale| sets the value of the |\MGL@scale| macro, which is used later to specify the default scaling for graphics. It only accepts positive values, otherwise it issues a warning and restarts the scaling to $1$. In order to be able to check the validity of the value passed by the user, we first set the |\MGL@scale| macro to that value and test it with the |\ifdim| conditional.\footnote{We can't use \doccommand{ifnum} here because it only accepts integer values.} Since this conditional tests dimensions only, the value passed by the user is multiplied by |\p@| (value |1pt|), so it can be compared with |\z@| (value |0pt|).
 %    \begin{macrocode}
 
 \def\mglscale#1{
-  \def\MGL@scale{#1}%
-  \ifcase\MGL@scale\or\or\or\or\or\or\or\or\else%
+  \ifdim#1\p@>\z@%
+    \def\MGL@scale{#1}%
+  \else%
     \PackageWarning{mgltex}{%
-      Scaling value of \MGL@scale\space not allowed; using default (1)%
+      Scaling value of #1\space not allowed; using default (1)%
     }%
     \def\MGL@scale{1}%
   \fi%
 % \end{macro}\end{macro}
 %
 % \begin{macro}{\mglquality}\begin{macro}{\MGL@quality}
+% \changes{\textbf{v4.2 ------------}}{2016/05/14}{\texttt{9} is accepted as quality value now}
 % |\mglquality| sets the value of the |\MGL@quality| macro, which is used later to specify the default quality for graphics. It only accepts integer values from $0$ to $8$ (the only ones defined by |MathGL|), otherwise it issues a warning and restarts to $2$ (the default for |MathGL|). In order to be able to check the validity of the value passed by the user, we first set the |\MGL@quality| macro to that value and test it with the |\ifcase| conditional; if the value is valid, we print an info message to the |.log| file about the characteristics of the chosen quality, but if it is invalid, we issue a warning and overwrite |\MGL@scale| to $2$.
-% \end{macro}\end{macro}
 %    \begin{macrocode}
 
 \def\mglquality#1{%
     }%
   \or%
     \PackageInfo{mgltex}{%
-      Quality 4: No face drawing, direct bitmap drawing (low memory usage)%
+      Quality 4: No face drawing, direct bitmap drawing
+      (low memory usage)%
     }%
   \or%
     \PackageInfo{mgltex}{%
-      Quality 5: No color interpolation, direct bitmap drawing (low memory usage)%
+      Quality 5: No color interpolation, direct bitmap drawing
+      (low memory usage)%
     }%
   \or%
     \PackageInfo{mgltex}{%
     }%
   \or%
     \PackageInfo{mgltex}{%
-      Quality 7: High quality with 3d primitives, direct bitmap drawing (not implemented yet)%
+      Quality 7: High quality with 3d primitives, direct bitmap drawing %
+      (not implemented yet)%
     }%
   \or%
     \PackageInfo{mgltex}{%
       Quality 8: Draw dots instead of primitives (extremely fast)%
     }%
+  \or%
+    \PackageInfo{mgltex}{%
+      Quality 9: No drawing (for testing purposes)%
+    }%
   \else%
     \PackageWarning{mgltex}{%
       Quality #1 not available; using default (2)%
   \fi%
 }
 %    \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \begin{macro}{\mglvariant}\begin{macro}{\MGL@variant}
+% |\mglvariant| sets the value of the |\MGL@variant| macro, which is passed later to |mglconv| thorugh its |-v| command line option. It only accepts non-negative integer, otherwise it issues a warning and restarts to $0$ (the default for |MathGL|). In order to be able to check the validity of the value passed by the user, we use the |\ifnum| conditional; if the value is invalid we issue a warning and overwrite |\MGL@variant| to $0$.
+%    \begin{macrocode}
+
+\def\mglvariant#1{%
+  \def\MGL@variant{#1}%
+  \ifnum\MGL@variant<0%
+    \PackageWarning{mgltex}{%
+      Variant #1 not allowed; using default (0)%
+    }%
+    \def\MGL@variant{0}%
+  \fi%
+}
+%    \end{macrocode}
+% \end{macro}\end{macro}
 %
 % Now we declare the options |final| and |draft|, which are simply passed to the \textsf{graphicx} package.
 %    \begin{macrocode}
   \PassOptionsToPackage{\CurrentOption}{graphicx}%
 }
 %    \end{macrocode}
-% Now we can declare the package options |on| and |off| so that they execute |\MGL@switch@on| and |\MGL@switch@off|, respectively.
+%
+% The rest of the package options just call an adequate command or set an adequate value for a macro.
 %    \begin{macrocode}
+
 \DeclareOption{on}{\MGL@switch@on}
 \DeclareOption{off}{\MGL@switch@off}
-%    \end{macrocode}
-% Now, the options call the respective commands.
-%    \begin{macrocode}
+
 \DeclareOption{nocomments}{\@MGL@comments@off}
 \DeclareOption{comments}{\@MGL@comments@on}
-%    \end{macrocode}
-% The pacakage options |1x|, \ldots, |9x| just call |\mglscale| with the appropiate value.
-%    \begin{macrocode}
-\DeclareOption{1x}{\mglscale{1}}
-\DeclareOption{2x}{\mglscale{2}}
-\DeclareOption{3x}{\mglscale{3}}
-\DeclareOption{4x}{\mglscale{4}}
-\DeclareOption{5x}{\mglscale{5}}
-\DeclareOption{6x}{\mglscale{6}}
-\DeclareOption{7x}{\mglscale{7}}
-\DeclareOption{8x}{\mglscale{8}}
-\DeclareOption{9x}{\mglscale{9}}
-%    \end{macrocode}
-% The package options |0q|, \ldots, |8q| just call |\mglquality| with the appropiate value.
-%    \begin{macrocode}
-\DeclareOption{0q}{\mglquality{0}}
-\DeclareOption{1q}{\mglquality{1}}
-\DeclareOption{2q}{\mglquality{2}}
-\DeclareOption{3q}{\mglquality{3}}
-\DeclareOption{4q}{\mglquality{4}}
-\DeclareOption{5q}{\mglquality{5}}
-\DeclareOption{6q}{\mglquality{6}}
-\DeclareOption{7q}{\mglquality{7}}
-\DeclareOption{8q}{\mglquality{8}}
+
+\DeclareOption{gray}{\MGL@gray@on}
+\DeclareOption{color}{\MGL@gray@off}
+
+\DeclareOption{1x}{\def\MGL@scale{1}}
+\DeclareOption{2x}{\def\MGL@scale{2}}
+\DeclareOption{3x}{\def\MGL@scale{3}}
+\DeclareOption{4x}{\def\MGL@scale{4}}
+\DeclareOption{5x}{\def\MGL@scale{5}}
+\DeclareOption{6x}{\def\MGL@scale{6}}
+\DeclareOption{7x}{\def\MGL@scale{7}}
+\DeclareOption{8x}{\def\MGL@scale{8}}
+\DeclareOption{9x}{\def\MGL@scale{9}}
+
+\DeclareOption{0q}{\def\MGL@quality{0}}
+\DeclareOption{1q}{\def\MGL@quality{1}}
+\DeclareOption{2q}{\def\MGL@quality{2}}
+\DeclareOption{3q}{\def\MGL@quality{3}}
+\DeclareOption{4q}{\def\MGL@quality{4}}
+\DeclareOption{5q}{\def\MGL@quality{5}}
+\DeclareOption{6q}{\def\MGL@quality{6}}
+\DeclareOption{7q}{\def\MGL@quality{7}}
+\DeclareOption{8q}{\def\MGL@quality{8}}
+\DeclareOption{9q}{\def\MGL@quality{9}}
+
+\DeclareOption{0v}{\def\MGL@variant{0}}
+\DeclareOption{1v}{\def\MGL@variant{1}}
+\DeclareOption{2v}{\def\MGL@variant{2}}
 %    \end{macrocode}
 %
-% \begin{macro}{\MGL@graph@ext}
-% The following options set the default graphics extension, which is stored in the |\MGL@graph@ext| macro for later use.
+% \begin{macro}{\MGL@imgext}
+% The following options set the default graphics extension, which is stored in the |\MGL@imgext| macro for later use.
 %    \begin{macrocode}
 
-\DeclareOption{eps}{\def\MGL@graph@ext{.eps}}
-\DeclareOption{epsz}{\def\MGL@graph@ext{.epsz}}
-\DeclareOption{epsgz}{\def\MGL@graph@ext{.eps.gz}}
-\DeclareOption{bps}{\def\MGL@graph@ext{.bps}}
-\DeclareOption{bpsz}{\def\MGL@graph@ext{.bpsz}}
-\DeclareOption{bpsgz}{\def\MGL@graph@ext{.bps.gz}}
-\DeclareOption{pdf}{\def\MGL@graph@ext{.pdf}}
-\DeclareOption{png}{\def\MGL@graph@ext{.png}}
-\DeclareOption{jpg}{\def\MGL@graph@ext{.jpg}}
-\DeclareOption{jpeg}{\def\MGL@graph@ext{.jpeg}}
-\DeclareOption{gif}{\def\MGL@graph@ext{.gif}}
-\DeclareOption{tex}{\def\MGL@graph@ext{.tex}}
+\DeclareOption{eps}{\def\MGL@imgext{.eps}}
+\DeclareOption{epsz}{\def\MGL@imgext{.epsz}}
+\DeclareOption{epsgz}{\def\MGL@imgext{.eps.gz}}
+\DeclareOption{bps}{\def\MGL@imgext{.bps}}
+\DeclareOption{bpsz}{\def\MGL@imgext{.bpsz}}
+\DeclareOption{bpsgz}{\def\MGL@imgext{.bps.gz}}
+\DeclareOption{pdf}{\def\MGL@imgext{.pdf}}
+\DeclareOption{png}{\def\MGL@imgext{.png}}
+\DeclareOption{jpg}{\def\MGL@imgext{.jpg}}
+\DeclareOption{jpeg}{\def\MGL@imgext{.jpeg}}
+\DeclareOption{gif}{\def\MGL@imgext{.gif}}
+\DeclareOption{tex}{\def\MGL@imgext{.tex}}
 %    \end{macrocode}
 % \end{macro}
 %
 % We now declare the default package options, and, finally, process the options the user specifies in the order they are introduced.
 %    \begin{macrocode}
 
-\ExecuteOptions{final,on,nocomments,1x,2q,eps}
+\ExecuteOptions{final,on,nocomments,color,1x,2q,0v,eps}
 \ProcessOptions*
 %    \end{macrocode}
 %
-% \textsf{\mglTeX} requires the \textsf{keyval} package to define \meta{key}=\meta{value} options for the environments and commands; the \textsf{graphicx} package apports the facilities for inclusion of graphics, and the \textsf{verbatim} package is used as engine for the environments.
-%    \begin{macrocode}
-
-\RequirePackage{keyval}
-\RequirePackage{graphicx}
-\RequirePackage{verbatim}
-%    \end{macrocode}
-%
-% \begin{macro}{\MGL@graph@keys}
-% The main family of \meta{key}=\meta{value} pairs is defined. These pairs are common to every environment or command that produces graphics. Most of the \meta{key}'s are redefinitions of the optional arguments for the |\includegraphics| commands, so they are stored inside the |\MGL@graph@keys| macro, which is later passed to that command as optional argument by |\MGL@includegraphics|.
-%    \begin{macrocode}
-
-\define@key{MGL@keys}{bb}{\g@addto@macro\MGL@graph@keys{bb=#1,}}
-\define@key{MGL@keys}{bbllx}{\g@addto@macro\MGL@graph@keys{bbllx=#1,}}
-\define@key{MGL@keys}{bblly}{\g@addto@macro\MGL@graph@keys{bblly=#1,}}
-\define@key{MGL@keys}{bburx}{\g@addto@macro\MGL@graph@keys{bburx=#1,}}
-\define@key{MGL@keys}{bbury}{\g@addto@macro\MGL@graph@keys{bbury=#1,}}
-\define@key{MGL@keys}{natwidth}{\g@addto@macro\MGL@graph@keys{natwidth=#1,}}
-\define@key{MGL@keys}{natheight}{\g@addto@macro\MGL@graph@keys{natheight=#1,}}
-\define@key{MGL@keys}{hiresbb}{\g@addto@macro\MGL@graph@keys{hiresbb=#1,}}
-\define@key{MGL@keys}{viewport}{\g@addto@macro\MGL@graph@keys{viewport=#1,}}
-\define@key{MGL@keys}{trim}{\g@addto@macro\MGL@graph@keys{trim=#1,}}
-\define@key{MGL@keys}{angle}{\g@addto@macro\MGL@graph@keys{angle=#1,}}
-\define@key{MGL@keys}{origin}{\g@addto@macro\MGL@graph@keys{origin=#1,}}
-\define@key{MGL@keys}{width}{\g@addto@macro\MGL@graph@keys{width=#1,}}
-\define@key{MGL@keys}{height}{\g@addto@macro\MGL@graph@keys{height=#1,}}
-\define@key{MGL@keys}{totalheight}{\g@addto@macro\MGL@graph@keys{totalheight=#1,}}
-\define@key{MGL@keys}{keepaspectratio}[true]{%
-  \g@addto@macro\MGL@graph@keys{keepaspectratio=#1,}%
-}
-\define@key{MGL@keys}{scale}{\g@addto@macro\MGL@graph@keys{scale=#1,}}
-\define@key{MGL@keys}{clip}[true]{\g@addto@macro\MGL@graph@keys{clip=#1,}}
-\define@key{MGL@keys}{draft}[true]{\g@addto@macro\MGL@graph@keys{draft=#1,}}
-\define@key{MGL@keys}{type}{\g@addto@macro\MGL@graph@keys{type=#1,}}
-\define@key{MGL@keys}{ext}{\g@addto@macro\MGL@graph@keys{ext=#1,}}
-\define@key{MGL@keys}{read}{\g@addto@macro\MGL@graph@keys{read=#1,}}
-\define@key{MGL@keys}{command}{\g@addto@macro\MGL@graph@keys{command=#1,}}
-%    \end{macrocode}
-% \end{macro}
-% \begin{macro}{\MGL@graph@ext}
-% Stores the default extension for the creation of the graphics.
-%    \begin{macrocode}
-\define@key{MGL@keys}{imgext}{\def\MGL@graph@ext{.#1}}
-%    \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@MGL@lineno@}
-% The only \meta{key}=\meta{value} pair needed for verbatim-like environments and commands is the one for the |lineno| option, which sets the value of the |\@MGL@lineno@| boolean macro.
-%    \begin{macrocode}
-
-\newif\if@MGL@lineno@
-\define@key{MGL@verb@keys}{lineno}[true]{\csname @MGL@lineno@#1\endcsname}
-%    \end{macrocode}
-% \end{macro}
-%
 % \begin{macro}{\MGL@dir}
 % This is the \textsf{\mglTeX} main working directory. By default, it is defined to empty, so it points to the path of the \LaTeX{} document.
 %    \begin{macrocode}
 \def\MGL@paths{\MGL@dir\MGL@scripts@dir,\MGL@dir\MGL@backups@dir}
 %    \end{macrocode}
 % \end{macro}
-% \begin{macro}{\mglsettings}
-% First, we define a \meta{key}=\meta{value} family, |MGL@sett@keys|, for the |\mglsettings| command.
-%    \begin{macrocode}
-\define@key{MGL@sett@keys}{dir}{\def\MGL@dir{#1}}
-\define@key{MGL@sett@keys}{scriptsdir}{\def\MGL@scripts@dir{#1}}
-\define@key{MGL@sett@keys}{graphicsdir}{\def\MGL@graphics@dir{#1}}
-\define@key{MGL@sett@keys}{backupsdir}{\def\MGL@backups@dir{#1}}
-\define@key{MGL@sett@keys}{paths}{\g@addto@macro\MGL@paths{,#1}}
-\define@key{MGL@sett@keys}{quality}{\mglquality{#1}}
-\define@key{MGL@sett@keys}{scale}{\mglscale{#1}}
-\define@key{MGL@sett@keys}{imgext}{\def\MGL@graph@ext{.#1}}
-%    \end{macrocode}
-% The command receives and executes the \meta{key}=\meta{value} pairs for |MGL@sett@keys|. This is an only-preamble command.
-%    \begin{macrocode}
-\def\mglsettings#1{\setkeys{MGL@sett@keys}{#1}}
-\@onlypreamble\mglsettings
-%    \end{macrocode}
-% \end{macro}
 %
 % \begin{macro}{\MGL@main@script@name}
 % \noindent This macro stores the name of the of the document's main script. It is initialized to the name of the \LaTeX{} document.
 \newcounter{MGL@line@no}
 %    \end{macrocode}
 % \end{macro}
-% \begin{macro}{MGL@verb@script@no}
+% \begin{macro}{MGL@verb@no}
 % The counter used to numerate verbatim-written scripts with the |\listofmglscripts| command.
 %    \begin{macrocode}
-\newcounter{MGL@verb@script@no}
+\newcounter{MGL@verb@no}
 %    \end{macrocode}
 % \end{macro}
 % \begin{macro}{\@MGL@list@script@}
 \def\l@MGL@script{\@dottedtocline{1}{0em}{1.5em}}
 %    \end{macrocode}
 % \end{macro}
-% Finally, the supported graphic formats are declared, and the |\verbatim@finish| command from the \textsf{verbatim} package is disabled to avoid it from writing a blank line at the end of every script (see subsection~\ref{subsection: warning}).
+%
+% \textsf{\mglTeX} requires the \textsf{keyval} package to define \meta{key}=\meta{value} options for the environments and commands; the \textsf{graphicx} package apports the facilities for inclusion of graphics; the \textsf{ifpdf} package is used to determine whether the user is compiling to |pdf| or not when indicating the default graphics extensionsthe \textsf{verbatim} package is used as engine for the environments.
+%    \begin{macrocode}
+
+\RequirePackage{keyval}
+\RequirePackage{graphicx}
+\RequirePackage{ifpdf}
+\RequirePackage{verbatim}
+%    \end{macrocode}
+%
+% The supported graphic extensions are declared. These extensions depend on whether we are compiling to |pdf| or not, so the |\ifpdf| conditional from the homonym package is used.
+%    \begin{macrocode}
+\ifpdf%
+  \DeclareGraphicsExtensions{%
+    .pdf,.png,.jpg,.jpeg,.gif%
+  }%
+\else%
+  \DeclareGraphicsExtensions{%
+    .eps,.epsz,.eps.gz,.bps,.bpsz,.bps.gz%
+  }%
+\fi%
+%    \end{macrocode}
+% Finally, the |\verbatim@finish| command from the \textsf{verbatim} package is disabled to avoid it from writing a blank line at the end of every script (see subsection~\ref{subsection: warning}).
 %    \begin{macrocode}
-\DeclareGraphicsExtensions{%
-  .eps,.epsz,.eps.gz,.bps,.bpsz,.bps.gz,.pdf,.png,.jpg,.jpeg,.gif%
-}
 \let\verbatim@finish\relax
 %    \end{macrocode}
 %
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}{\MGL@graph@keys}
+% The main family of \meta{key}=\meta{value} pairs is defined. These pairs are common to every environment or command that produces graphics. Most of the \meta{key}'s are redefinitions of the optional arguments for the |\includegraphics| commands, so they are stored inside the |\MGL@graph@keys| macro, which is later passed to that command as optional argument by |\MGL@includegraphics|.
+%    \begin{macrocode}
+
+\define@key{MGL@gr@keys}{bb}{%
+  \g@addto@macro\MGL@graph@keys{bb=#1,}%
+}
+\define@key{MGL@gr@keys}{bbllx}{%
+  \g@addto@macro\MGL@graph@keys{bbllx=#1,}%
+}
+\define@key{MGL@gr@keys}{bblly}{%
+  \g@addto@macro\MGL@graph@keys{bblly=#1,}%
+}
+\define@key{MGL@gr@keys}{bburx}{%
+  \g@addto@macro\MGL@graph@keys{bburx=#1,}%
+}
+\define@key{MGL@gr@keys}{bbury}{%
+  \g@addto@macro\MGL@graph@keys{bbury=#1,}%
+}
+\define@key{MGL@gr@keys}{natwidth}{%
+  \g@addto@macro\MGL@graph@keys{natwidth=#1,}%
+}
+\define@key{MGL@gr@keys}{natheight}{%
+  \g@addto@macro\MGL@graph@keys{natheight=#1,}%
+}
+\define@key{MGL@gr@keys}{hiresbb}{%
+  \g@addto@macro\MGL@graph@keys{hiresbb=#1,}%
+}
+\define@key{MGL@gr@keys}{viewport}{%
+  \g@addto@macro\MGL@graph@keys{viewport=#1,}%
+}
+\define@key{MGL@gr@keys}{trim}{%
+  \g@addto@macro\MGL@graph@keys{trim=#1,}%
+}
+\define@key{MGL@gr@keys}{angle}{%
+  \g@addto@macro\MGL@graph@keys{angle=#1,}%
+}
+\define@key{MGL@gr@keys}{origin}{%
+  \g@addto@macro\MGL@graph@keys{origin=#1,}%
+}
+\define@key{MGL@gr@keys}{width}{%
+  \g@addto@macro\MGL@graph@keys{width=#1,}%
+}
+\define@key{MGL@gr@keys}{height}{%
+  \g@addto@macro\MGL@graph@keys{height=#1,}%
+}
+\define@key{MGL@gr@keys}{totalheight}{%
+  \g@addto@macro\MGL@graph@keys{totalheight=#1,}%
+}
+\define@key{MGL@gr@keys}{keepaspectratio}[true]{%
+  \g@addto@macro\MGL@graph@keys{keepaspectratio=#1,}%
+}
+\define@key{MGL@gr@keys}{scale}{%
+  \g@addto@macro\MGL@graph@keys{scale=#1,}%
+}
+\define@key{MGL@gr@keys}{clip}[true]{%
+  \g@addto@macro\MGL@graph@keys{clip=#1,}%
+}
+\define@key{MGL@gr@keys}{draft}[true]{%
+  \g@addto@macro\MGL@graph@keys{draft=#1,}%
+}
+\define@key{MGL@gr@keys}{type}{%
+  \g@addto@macro\MGL@graph@keys{type=#1,}%
+}
+\define@key{MGL@gr@keys}{ext}{%
+  \g@addto@macro\MGL@graph@keys{ext=#1,}%
+}
+\define@key{MGL@gr@keys}{read}{%
+  \g@addto@macro\MGL@graph@keys{read=#1,}%
+}
+\define@key{MGL@gr@keys}{command}{%
+  \g@addto@macro\MGL@graph@keys{command=#1,}%
+}
+%    \end{macrocode}
+% \end{macro}
+% The following four \meta{key}=\meta{value} pairs call the adequate \textsf{\mglTeX} command.
+%    \begin{macrocode}
+\define@key{MGL@gr@keys}{gray}[0]{\mglgray{#1}}
+\define@key{MGL@gr@keys}{mglscale}{\mglscale{#1}}
+\define@key{MGL@gr@keys}{quality}{\mglquality{#1}}
+\define@key{MGL@gr@keys}{variant}{\mglvariant{#1}}
+%    \end{macrocode}
+% \begin{macro}{\MGL@imgext}
+% |\MGL@imgext| stores the default extension for the creation of the graphics.
+%    \begin{macrocode}
+\define@key{MGL@gr@keys}{imgext}{\def\MGL@imgext{.#1}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@MGL@lineno@}
+% The only \meta{key}=\meta{value} pair needed for verbatim-like environments and commands is the one for the |lineno| option, which sets the value of the |\@MGL@lineno@| boolean macro.
+%    \begin{macrocode}
+
+\newif\if@MGL@lineno@
+\define@key{MGL@verb@keys}{lineno}[true]{\csname @MGL@lineno@#1\endcsname}
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}{\MGL@codes}
+% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Bugfix: category code for tabulators is changed too}
 % This macro changes the category codes of all special characters (like |\|, |$|, etc.) to $12$ (other), so they don't have any special meaning and can be processed as normal text. The exception is the new line character (|^^M|), which is kept active for compatibility with the \textsf{verbatim} package.
 %    \begin{macrocode}
 
 \def\MGL@codes{%
   \let\do\@makeother\dospecials%
+  \catcode`\^^I=12%
   \catcode`\^^M\active%
 }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\MGL@document@scripts}
+% \begin{macro}{\MGL@doc@scripts}
 % A macro to store the names of the scripts created or compiled in the document.
 %    \begin{macrocode}
 
-\def\MGL@document@scripts{}
+\def\MGL@doc@scripts{}
 %    \end{macrocode}
 % \end{macro}
-% \begin{macro}{\MGL@set@script@name}\begin{macro}{\MGL@script@name}
-% |\MGL@set@script@name| receives the name of a script without extension as argument, defines |\MGL@script@name| as that name, and checks if it has already been created or compiled, by comparing it with the names already stored in |\MGL@document@scripts|; if it's there already, warns the user. Finally, adds the name of the script to |\MGL@document@scripts|.
+% \begin{macro}{\MGL@set@script@name}\begin{macro}{\MGL@script}
+% |\MGL@set@script@name| receives the name of a script without extension as argument, defines |\MGL@script| as that name, and checks if it has already been created or compiled, by comparing it with the names already stored in |\MGL@doc@scripts|; if it's there already, warns the user. Finally, adds the name of the script to |\MGL@doc@scripts|.
 %    \begin{macrocode}
 \def\MGL@set@script@name#1{%
-  \edef\MGL@script@name{#1}%
-  \@for\MGL@temp@a:=\MGL@document@scripts\do{%
-    \ifx\MGL@temp@a\MGL@script@name%
-      \PackageWarning{mgltex}{Multiple MGL scripts named "\MGL@script@name.mgl"}%
+  \edef\MGL@script{#1}%
+  \@for\MGL@temp@a:=\MGL@doc@scripts\do{%
+    \ifx\MGL@temp@a\MGL@script%
+      \PackageWarning{mgltex}{Multiple MGL scripts named "\MGL@script.mgl"}%
     \fi%
   }%
-  \g@addto@macro\MGL@document@scripts{\MGL@script@name,}%
+  \g@addto@macro\MGL@doc@scripts{\MGL@script,}%
 }
 %    \end{macrocode}
 % \end{macro}\end{macro}
 % \end{macro}
 %
 % \begin{macro}{\MGL@process@script}
-% It checks whether the ``switch'' |\MGL@@@\MGL@script@name| is undefined, in which case executes its first argument. If the switch is defined, it checks if the corresponding image has been created; if so, it executes its second argument; otherwise, the first one.
+% It checks whether the ``switch'' |\MGL@@@\MGL@script| is undefined, in which case executes its first argument. If the switch is defined, it checks if the corresponding image has been created; if so, it executes its second argument; otherwise, the first one.
 %    \begin{macrocode}
 
 \def\MGL@process@script#1#2{%
-  \@ifundefined{MGL@@@\MGL@script@name}{%
+  \@ifundefined{MGL@@@\MGL@script}{%
     #1%
   }{%
-    \IfFileExists{\MGL@dir\MGL@graphics@dir\MGL@script@name\MGL@graph@ext}{%
+    \IfFileExists{\MGL@dir\MGL@graphics@dir\MGL@script\MGL@imgext}{%
       #2%
     }{%
       #1%
 \def\MGL@compare@code#1{%
 %    \end{macrocode}
 % \begin{macro}{\MGL@next}
-% This macro is called at the end of environments that use the |\MGL@compare@code| macro, and performs the ending actions of the comparision process, which are closing the |\MGL@in@stream| and writing the |\MGL@unchanged{\MGL@script@name}| to the |.aux| file. If during the comparison process a difference in the code is found, |\MGL@next| is redefined to only close the |\MGL@in@stream|.
+% This macro is called at the end of environments that use the |\MGL@compare@code| macro, and performs the ending actions of the comparision process, which are closing the |\MGL@in@stream| and writing the |\MGL@unchanged{\MGL@script}| to the |.aux| file. If during the comparison process a difference in the code is found, |\MGL@next| is redefined to only close the |\MGL@in@stream|.
 %    \begin{macrocode}
   \def\MGL@next{%
     \MGL@closein\MGL@in@stream%
-    \MGL@write\@auxout{\string\MGL@unchanged{\MGL@script@name}}%
+    \MGL@write\@auxout{\string\MGL@unchanged{\MGL@script}}%
   }%
 %    \end{macrocode}
 % \end{macro}
 % \noindent For the following, we agree that if a macro is required by an environment, and it hasn't been already defined, it will be defined between the commands that start and end such environment; also the command's name will have the environment's name as prefix.
 %
 % \begin{environment}{mgl}
+% \changes{\textbf{v4.2 ------------}}{2016/05/14}{New environment options: \texttt{gray}, \texttt{mglscale}, \texttt{quality}, \texttt{variant}}
 % This environment has to transcript its contents to the document's main script, and create a backup of the code simultaneously; the backup is used to detect changes in following compilations.
 % \begin{macro}{\mgl}
 % The command that starts the |mgl| environment. It is called by the |\begin{mgl}| command.
 %    \end{macrocode}
 % We define an additional \meta{key}=\meta{value} pair in the main family of pairs, corresponding to the |label| option for this environment. This definition is local because we don't want to be valid outside the environment.
 %    \begin{macrocode}
-  \define@key{MGL@keys}{label}{\def\MGL@script@name{##1}}%
+  \define@key{MGL@gr@keys}{label}{\def\MGL@script{##1}}%
 %    \end{macrocode}
 % The list of comma-separated options is processed.
 %    \begin{macrocode}
-  \MGL@setkeys{MGL@keys}{#1}%
+  \MGL@setkeys{MGL@gr@keys}{#1}%
 %    \end{macrocode}
 % If the user hasn't used the |label| option, the automatic naming mechanism is called. Note that |\MGL@main@script@name| is set using the |\mglname| command.
 %    \begin{macrocode}
-  \@ifundefined{MGL@script@name}{%
+  \@ifundefined{MGL@script}{%
     \stepcounter{MGL@script@no}%
-    \edef\MGL@script@name{\MGL@main@script@name-MGL-\arabic{MGL@script@no}}%
+    \edef\MGL@script{\MGL@main@script@name-MGL-\arabic{MGL@script@no}}%
   }{}%
 %    \end{macrocode}
 % We use the |\MGL@set@script@name| to test whether the given name has already been used.
 %    \begin{macrocode}
-  \MGL@set@script@name{\MGL@script@name}%
+  \MGL@set@script@name{\MGL@script}%
 %    \end{macrocode}
 % |\MGL@codes| is used to change the codes of special characters.
 %    \begin{macrocode}
   \MGL@process@script{%
     \MGL@write@script%
   }{%
-    \MGL@compare@code{\MGL@dir\MGL@backups@dir\MGL@script@name.mgl}%
+    \MGL@compare@code{\MGL@dir\MGL@backups@dir\MGL@script.mgl}%
   }%
 }
 %    \end{macrocode}
 \def\MGL@write@script{%
 %    \end{macrocode}
 % \begin{macro}{\MGL@next}
-% It contains the actions to perform immediately after the end of |\MGL@write@script|. They are close the output stream; write in the main script the commands to save the image, and to reset the initial values for all MGL parameters and clear the image; finally, write |\MGL@unchanged{\MGL@script@name}| in the |.aux| file.
+% It contains the actions to perform immediately after the end of |\MGL@write@script|. They are close the output stream; write in the main script the commands to save the image, and to reset the initial values for all MGL parameters and clear the image; finally, write |\MGL@unchanged{\MGL@script}| in the |.aux| file.
 %    \begin{macrocode}
   \def\MGL@next{%
     \MGL@closeout\MGL@out@stream%
     \MGL@write\MGL@main@stream{%
-      write '\MGL@dir\MGL@graphics@dir\MGL@script@name\MGL@graph@ext'^^J%
+      write '\MGL@dir\MGL@graphics@dir\MGL@script\MGL@imgext'^^J%
       ^^Jreset^^J%
     }%
-    \MGL@write\@auxout{\string\MGL@unchanged{\MGL@script@name}}%
+    \MGL@write\@auxout{\string\MGL@unchanged{\MGL@script}}%
   }%
 %    \end{macrocode}
 % \end{macro}
     \MGL@write\MGL@out@stream{\the\verbatim@line}%
   }%
 %    \end{macrocode}
-% Before writing the MGL code of the environment, we set the default quality.
+% Before writing the MGL code of the environment, we set the default gray/color mode, mglscale, quality and variant.
 %    \begin{macrocode}
-  \MGL@write\MGL@main@stream{quality \MGL@quality}%
+  \MGL@write\MGL@main@stream{%
+    gray \MGL@gray^^J%
+    setsizescl \MGL@scale^^J%
+    quality \MGL@quality^^J%
+    variant \MGL@variant%
+  }%
 %    \end{macrocode}
 % We open the backup file in the output stream.
 %    \begin{macrocode}
-  \MGL@openout\MGL@out@stream{\MGL@dir\MGL@backups@dir\MGL@script@name.mgl}%
+  \MGL@openout\MGL@out@stream{\MGL@dir\MGL@backups@dir\MGL@script.mgl}%
 %    \end{macrocode}
 % The transcription process starts by calling the |\verbatim@start| command.
 %    \begin{macrocode}
 %    \end{macrocode}
 % The backup file is opened for writing.
 %    \begin{macrocode}
-  \MGL@openout\MGL@out@stream{\MGL@dir\MGL@backups@dir\MGL@script@name.mgl}%
+  \MGL@openout\MGL@out@stream{\MGL@dir\MGL@backups@dir\MGL@script.mgl}%
 %    \end{macrocode}
 % The head of the function is written.
 %    \begin{macrocode}
-  \MGL@write\MGL@out@stream{func '\MGL@script@name' #1}%
+  \MGL@write\MGL@out@stream{func '\MGL@script' #1}%
 %    \end{macrocode}
 % The writing process is started.
 %    \begin{macrocode}
 % \end{environment}
 %
 % \begin{environment}{mglcode}
+% \changes{\textbf{v4.2 ------------}}{2016/05/14}{New environment options: \texttt{gray}, \texttt{mglscale}, \texttt{quality}, \texttt{variant}}
 % This environment also checks for changes on the code, but, since it writes to its own script, there is no need to create a backup file (the check is performed using the script itself).
 % \begin{macro}{\mglcode}
 % It starts the |mglcode| environment. Its anatomy is similar to that of the |\mgl| command.
 %    \begin{macrocode}
 
 \newcommand\mglcode[2][]{%
-  \MGL@setkeys{MGL@keys}{#1}%
+  \MGL@setkeys{MGL@gr@keys}{#1}%
   \MGL@set@script@name{#2}%
   \MGL@codes%
   \MGL@process@script{%
     \mglcode@write@script%
   }{%
-    \MGL@compare@code{\MGL@dir\MGL@scripts@dir\MGL@script@name.mgl}%
+    \MGL@compare@code{\MGL@dir\MGL@scripts@dir\MGL@script.mgl}%
   }%
 }
 %    \end{macrocode}
 %    \begin{macrocode}
     \MGL@closeout\MGL@out@stream%
 %    \end{macrocode}
-% The |\MGL@unchanged{\MGL@script@name}| command is written to the |.aux| file.
+% The |\MGL@unchanged{\MGL@script}| command is written to the |.aux| file.
 %    \begin{macrocode}
-    \MGL@write\@auxout{\string\MGL@unchanged{\MGL@script@name}}%
+    \MGL@write\@auxout{\string\MGL@unchanged{\MGL@script}}%
 %    \end{macrocode}
 % The script compilation instruction is written to the terminal.
 %    \begin{macrocode}
     \MGL@write{18}{%
-      mglconv -q \MGL@quality\space -S \MGL@scale\space%
-      -s "\MGL@dir\MGL@scripts@dir\mglcommonscriptname.mgl"\space%
-      -o "\MGL@dir\MGL@graphics@dir\MGL@script@name\MGL@graph@ext"\space%
-      "\MGL@dir\MGL@scripts@dir\MGL@script@name.mgl"%
+      mglconv -q \MGL@quality\space -g \MGL@gray\space%
+      -S \MGL@scale\space -v \MGL@variant\space%
+      -s "\MGL@dir\MGL@scripts@dir\mglsetupscriptname.mgl"\space%
+      -o "\MGL@dir\MGL@graphics@dir\MGL@script\MGL@imgext"\space%
+      "\MGL@dir\MGL@scripts@dir\MGL@script.mgl"%
     }%
   }%
 %    \end{macrocode}
 %    \end{macrocode}
 % The script is opened for writing in the output stream.
 %    \begin{macrocode}
-  \MGL@openout\MGL@out@stream{\MGL@dir\MGL@scripts@dir\MGL@script@name.mgl}%
+  \MGL@openout\MGL@out@stream{\MGL@dir\MGL@scripts@dir\MGL@script.mgl}%
 %    \end{macrocode}
 % The writing process is started by calling the |\verbatim@start| command.
 %    \begin{macrocode}
   \MGL@set@script@name{#1}%
   \MGL@codes%
   \def\verbatim@processline{\MGL@write\MGL@out@stream{\the\verbatim@line}}%
-  \MGL@openout\MGL@out@stream{\MGL@dir\MGL@scripts@dir\MGL@script@name.mgl}%
+  \MGL@openout\MGL@out@stream{\MGL@dir\MGL@scripts@dir\MGL@script.mgl}%
   \verbatim@start%
 }
 %    \end{macrocode}
 % \end{macro}
 % \end{environment}
 %
-% \begin{environment}{mglcommon}
-% This environment doesn't require any backup file nor any scanning for changes. Although the user sets the name of the script by redifining |\mglcommonscriptname|, it is necessary to perform a check of the name, just in case a name has been inadvertedly repeated.
-% \begin{macro}{\mglcommon}
-% Starts the |mglcommon| environment.
+% \begin{environment}{mglsetupscript}\begin{environment}{mglcommon}
+% This environment doesn't require any backup file nor any scanning for changes. Although the user sets the name of the script by redifining |\mglsetupscriptname|, it is necessary to perform a check of the name, just in case a name has been inadvertedly repeated.
+% \begin{macro}{\mglsetupscript}
+% Starts the |mglsetupscript| environment.
 %    \begin{macrocode}
 
-\def\mglcommon{%
+\def\mglsetupscript{%
   \@bsphack%
-  \MGL@set@script@name{\mglcommonscriptname}%
+  \MGL@set@script@name{\mglsetupscriptname}%
   \MGL@codes%
   \def\verbatim@processline{\MGL@write\MGL@out@stream{\the\verbatim@line}}%
-  \MGL@openout\MGL@out@stream{\MGL@dir\MGL@scripts@dir\MGL@script@name.mgl}%
+  \MGL@openout\MGL@out@stream{\MGL@dir\MGL@scripts@dir\MGL@script.mgl}%
   \verbatim@start%
 }
 %    \end{macrocode}
 % It is declared to be an only-preamble command, so it can't be used after the |\begin{document}| instruction.
 %    \begin{macrocode}
+\@onlypreamble\mglsetupscript
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\mglcommon}
+% This macro is defined to be a synonym for |\mglcommon| (to keep backwards compatibility).
+%    \begin{macrocode}
+\let\mglcommon\mglsetupscript
 \@onlypreamble\mglcommon
 %    \end{macrocode}
 % \end{macro}
-% \begin{macro}{\endmglcommon}
-% It ends the |mglcommon| environment.
+% \begin{macro}{\endmglsetupscript}
+% It ends the |mglsetupscript| environment.
 %    \begin{macrocode}
-\def\endmglcommon{%
+\def\endmglsetupscript{%
   \MGL@closeout\MGL@out@stream%
   \@esphack%
 }
 %    \end{macrocode}
 % \end{macro}
-% \end{environment}
+% \begin{macro}{\endmglcommon}
+% It is defined to be a synonym for |\endmglsetupscript|.
+%    \begin{macrocode}
+\let\endmglcommon\endmglsetupscript
+%    \end{macrocode}
+% \end{macro}
+% \end{environment}\end{environment}
 %
 % \subsection{Fast creation of graphics}
 % \begin{environment}{mglsetup}
 % This environment is meant to contain code that is executed just before the instruction of a |\mglplot| command, producing always the same ouput. Instead of writing a new chunk of code for that purpose, |mglsetup| is defined as a special case of the |mglfunc| environment, with the exception that the MGL function obtained this way doesn't accept any argument ---thus producing always the same output.
 % \begin{macro}{\mglsetup}
-% It is defined as an alias for |\mglfunc|, but only the name of the MGL function is passed to it, forcing the assumption that the number of arguments for the function is zero.
+% It is defined as an alias for |\mglfunc|, but only the name of the MGL function is passed to it, forcing the assumption that its number of arguments is zero.
 %    \begin{macrocode}
 
 \def\mglsetup#1{\mglfunc{#1}}%
 % \end{environment}
 %
 % \begin{macro}{\mglplot}
+% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Added \doccommand{bgroup} and \doccommand{egroup} in order to keep changes private}
+% \changes{\textbf{v4.2 ------------}}{2016/05/14}{New command options: \texttt{gray}, \texttt{mglscale}, \texttt{quality}, \texttt{variant}}
 % Although the function of this command is quite simple and straightforward, it requires many lines of code and some tricks in order to reach the desired functionality.
 %    \begin{macrocode}
 
 \newcommand\mglplot[2][]{%
 %    \end{macrocode}
+% Since this is a command, we need to explicitly create a local group so that all changes keep private to the command.\footnote{In contrast, environments keep changes private by default.}
+%    \begin{macrocode}
+  \bgroup%
+%    \end{macrocode}
 % We add some \meta{key}=\meta{value} pairs locally. The |label| key works exactly as the one of the |mgl| environment.
 %    \begin{macrocode}
-  \define@key{MGL@keys}{label}{\edef\MGL@script@name{##1}}%
+  \define@key{MGL@gr@keys}{label}{\edef\MGL@script{##1}}%
 %    \end{macrocode}
 % The |setup| key defines the variable |\MGL@mglplot@setup| which is later used to call a setup function for the corresponding image.
 %    \begin{macrocode}
-  \define@key{MGL@keys}{setup}{\def\MGL@mglplot@setup{##1}}%
+  \define@key{MGL@gr@keys}{setup}{\def\MGL@mglplot@setup{##1}}%
 %    \end{macrocode}
 % The |separator| key uses the |\MGL@def@for@loop| to define |\MGL@for| so that it iterates over lists separated by the indicated separator symbol.
 %    \begin{macrocode}
-  \define@key{MGL@keys}{separator}{%
-    \MGL@def@for@loop{##1}%
-  }%
+  \define@key{MGL@gr@keys}{separator}{\MGL@def@for@loop{##1}}%
 %    \end{macrocode}
 % Now, we process the keys passed by the user.
 %    \begin{macrocode}
-  \MGL@setkeys{MGL@keys}{#1}%
+  \MGL@setkeys{MGL@gr@keys}{#1}%
 %    \end{macrocode}
 % If the user hasn't specified a name using the |label| option, then a name is autogenerated following the same naming mechanism of the |mgl| environment.
 %    \begin{macrocode}
-  \@ifundefined{MGL@script@name}{%
+  \@ifundefined{MGL@script}{%
     \stepcounter{MGL@script@no}
-    \edef\MGL@script@name{\MGL@main@script@name-MGL-\arabic{MGL@script@no}}
+    \edef\MGL@script{\MGL@main@script@name-MGL-\arabic{MGL@script@no}}
   }{}%
 %    \end{macrocode}
 % The name of the script is checked.
 %    \begin{macrocode}
-  \MGL@set@script@name{\MGL@script@name}%
+  \MGL@set@script@name{\MGL@script}%
 %    \end{macrocode}
 % If the user hasn't specified a setup, then the only code that has to be written is the non-optional argument of |\mglplot|; it is stored in the temporary variable |\MGL@temp@a|.
 %    \begin{macrocode}
     \mglplot@compare@code%
   }%
 %    \end{macrocode}
-% Finally, the corresponding image is included in the document.
+% The corresponding image is included in the document.
 %    \begin{macrocode}
   \MGL@includegraphics%
+%    \end{macrocode}
+% Finally, the local group is closed.
+%    \begin{macrocode}
+  \egroup%
 }
 %    \end{macrocode}
 % \begin{macro}{\mglplot@write@script}
 %    \end{macrocode}
 % The default quality is written to the main script.
 %    \begin{macrocode}
-  \MGL@write\MGL@main@stream{quality \MGL@quality}%
+  \MGL@write\MGL@main@stream{%
+    gray \MGL@gray^^J%
+    setsizescl \MGL@scale^^J%
+    quality \MGL@quality^^J%
+    variant \MGL@variant%
+  }%
 %    \end{macrocode}
 % The backup file is opened to write in the output stream.
 %    \begin{macrocode}
-  \MGL@openout\MGL@out@stream{\MGL@dir\MGL@backups@dir\MGL@script@name.mgl}%
+  \MGL@openout\MGL@out@stream{\MGL@dir\MGL@backups@dir\MGL@script.mgl}%
 %    \end{macrocode}
 % Now we use the |\MGL@for| command to iterate over |\MGL@temp@a|. It takes a piece of code up to the separator symbol indicated by the user, and stores it in the temporary variable |\MGL@temp@b|, which is then written to the main script and backup file.
 %    \begin{macrocode}
 % The instructions to save the image and reset the MGL parameters are written to the main script.
 %    \begin{macrocode}
   \MGL@write\MGL@main@stream{%
-    write '\MGL@dir\MGL@graphics@dir\MGL@script@name\MGL@graph@ext'^^J%
+    write '\MGL@dir\MGL@graphics@dir\MGL@script\MGL@imgext'^^J%
     ^^Jreset^^J%
   }%
 %    \end{macrocode}
-% Finally, |\MGL@unchanged{\MGL@script@name}| is written to the |.aux| file.
+% Finally, |\MGL@unchanged{\MGL@script}| is written to the |.aux| file.
 %    \begin{macrocode}
-  \MGL@write\@auxout{\string\MGL@unchanged{\MGL@script@name}}%
+  \MGL@write\@auxout{\string\MGL@unchanged{\MGL@script}}%
 }
 %    \end{macrocode}
 % \end{macro}
 %    \begin{macrocode}
 \def\mglplot@compare@code{%
 %    \end{macrocode}
-% The action that will finish this command is, for now, to write |\MGL@unchanged{\MGL@script@name}| in the |.aux| file; it is stored in the |\MGL@next| variable. If no changes in the code are found, this will remain as the last action; otherwise, it will be overwritten to do nothing.
+% The action that will finish this command is, for now, to write |\MGL@unchanged{\MGL@script}| in the |.aux| file; it is stored in the |\MGL@next| variable. If no changes in the code are found, this will remain as the last action; otherwise, it will be overwritten to do nothing.
 %    \begin{macrocode}
-  \def\MGL@next{\MGL@write\@auxout{\string\MGL@unchanged{\MGL@script@name}}}%
+  \def\MGL@next{\MGL@write\@auxout{\string\MGL@unchanged{\MGL@script}}}%
 %    \end{macrocode}
 % The backup file is opened for reading in the input stream.
 %    \begin{macrocode}
-  \MGL@openin\MGL@in@stream{\MGL@dir\MGL@backups@dir\MGL@script@name.mgl}%
+  \MGL@openin\MGL@in@stream{\MGL@dir\MGL@backups@dir\MGL@script.mgl}%
 %    \end{macrocode}
 % Once again, the |\MGL@for| command is used to iterate over the |\MGL@temp@a| variable defined by |\mglplot|. Pieces of code are taken up to the appearance of the separator symbol indicated by the user. In every iteration, the corresponding piece of code is stored in the |\MGL@temp@b| variable, one line of code is read from the input stream to the variable |\MGL@temp@c|, and these two are compared; if they are different, we redefined |\MGL@next| to do nothing.
 %    \begin{macrocode}
 %    \begin{macrocode}
   \MGL@set@script@name{#2}%
 %    \end{macrocode}
-% If the switch |\@MGL@list@script@| is true, we increase the counter for verbatim code (|MGL@verb@script@no|), and add a contents line to the |.lms| file, using the style set by |\l@MGL@script|. In order to be able to use special characters in the name of the script, we use the |\detokenize| primitive.
+% If the switch |\@MGL@list@script@| is true, we increase the counter for verbatim code (|MGL@verb@no|), and add a contents line to the |.lms| file, using the style set by |\l@MGL@script|. In order to be able to use special characters in the name of the script, we use the |\detokenize| primitive.
 %    \begin{macrocode}
   \if@MGL@list@script@%
-    \refstepcounter{MGL@verb@script@no}%
+    \refstepcounter{MGL@verb@no}%
     \addcontentsline{lms}{MGL@script}{%
-      \protect\numberline{\theMGL@verb@script@no.}%
-      {\ttfamily\protect\detokenize{\MGL@script@name.mgl}}%
+      \protect\numberline{\theMGL@verb@no.}%
+      {\ttfamily\protect\detokenize{\MGL@script.mgl}}%
     }%
   \fi%
 %    \end{macrocode}
 % The separator to indicate the begining of the verbatim code is positioned; we use the |\MGL@line@sep| command to draw it.
 %    \begin{macrocode}
   \item[\MGL@line@sep]\fbox{%
-    \bfseries\ttfamily\expandafter\detokenize\expandafter{\MGL@script@name.mgl}%
+    \bfseries\ttfamily\expandafter\detokenize\expandafter{\MGL@script.mgl}%
   }\hskip\labelsep\MGL@line@sep\par\par%
 %    \end{macrocode}
 % The |\verbatim@processline| is redefined to put |\the\verbatim@line| in an item of the list, and to to also write it to the script file.
 %    \end{macrocode}
 % The script file is opened for writing.
 %    \begin{macrocode}
-  \MGL@openout\MGL@out@stream{\MGL@dir\MGL@scripts@dir\MGL@script@name.mgl}%
+  \MGL@openout\MGL@out@stream{\MGL@dir\MGL@scripts@dir\MGL@script.mgl}%
 %    \end{macrocode}
 % The writing process starts.
 %    \begin{macrocode}
 %    \end{macrocode}
 % \end{macro}
 % \begin{macro}{\endmglblock*}
-% It's defined as an alias for |\endmglblock|.
+% It is defined as an alias for |\endmglblock|.
 %    \begin{macrocode}
 \expandafter\let\csname endmglblock*\endcsname\endmglblock
 %    \end{macrocode}
 %    \begin{macrocode}
 \newcommand\mglverbatim@[1][]{%
   \@MGL@lineno@true%
-  \define@key{MGL@verb@keys}{label}{\edef\MGL@script@name{##1}}%
+  \define@key{MGL@verb@keys}{label}{\edef\MGL@script{##1}}%
   \setkeys{MGL@verb@keys}{#1}%
   \if@MGL@lineno@%
     \list{\mgllinenostyle\arabic{MGL@line@no}.}{\usecounter{MGL@line@no}}%
   \MGL@set@verbatim@code%
   \fboxrule=\mgllinethickness%
 %    \end{macrocode}
-% The separator that indicates the begining of the verbatim code is different depending on whether the user has specified a name associated to the code or not. If no name has been indicated, i.e., |\MGL@script@name| is undefined, the separator is just a line; otherwise, i.e., |\MGL@script@name| is defined, the separator is similar to the one of the |mglblock| environment.
+% The separator that indicates the begining of the verbatim code is different depending on whether the user has specified a name associated to the code or not. If no name has been indicated, i.e., |\MGL@script| is undefined, the separator is just a line; otherwise, i.e., |\MGL@script| is defined, the separator is similar to the one of the |mglblock| environment.
 %    \begin{macrocode}
-  \@ifundefined{MGL@script@name}{%
-    \edef\MGL@script@name{\mglverbatimname}%
+  \@ifundefined{MGL@script}{%
+    \edef\MGL@script{\mglverbatimname}%
     \item[\MGL@line@sep]\hskip-\labelsep\MGL@line@sep%
   }{%
     \item[\MGL@line@sep]\fbox{%
-      \bfseries\ttfamily\expandafter\detokenize\expandafter{\MGL@script@name.mgl}%
+      \bfseries\ttfamily\expandafter\detokenize\expandafter{\MGL@script.mgl}%
     }\hskip\labelsep\MGL@line@sep\par\par%
   }%
 %    \end{macrocode}
 % Note that, if the user requests an entry in the |\listofmglscripts|, the contents line is added to the same |.lms| file. So here start the similitudes again.
 %    \begin{macrocode}
   \if@MGL@list@script@%
-    \refstepcounter{MGL@verb@script@no}%
+    \refstepcounter{MGL@verb@no}%
     \addcontentsline{lms}{MGL@script}{%
-      \protect\numberline{\theMGL@verb@script@no.}%
-      {\ttfamily\protect\detokenize{\MGL@script@name}}%
+      \protect\numberline{\theMGL@verb@no.}%
+      {\ttfamily\protect\detokenize{\MGL@script}}%
     }%
   \fi%
   \def\verbatim@processline{%
 % \end{environment}
 %
 % \begin{environment}{mglcomment}
-% This environment has two different behaviors: When commentaries are allowed by the user, it behaves similarly to the |mglverbatim| environment; if commentaries are not allowed, it behaves as the |comment| environment from the \textsf{verbatim} package. So it is natural that we borrow code from them and adapt it to the corresponding situation.
+% This environment has two different behaviors: When comments are allowed by the user, it behaves similarly to the |mglverbatim| environment; if comments are not allowed, it behaves as the |comment| environment from the \textsf{verbatim} package. So it is natural that we borrow code from them and adapt it to the corresponding situation.
 % \begin{macro}{\mglcomment}
 % The switch |\@MGL@comments@| governs the behavior of this command.
 %    \begin{macrocode}
 
 \def\mglcomment{%
 %    \end{macrocode}
-% If the switch is true, i.e., the user requests displaying of commentaries, we start a list without labels, and set the parameters for verbatim text.
+% If the switch is true, i.e., the user requests displaying of comments, we start a list without labels, and set the parameters for verbatim text.
 %    \begin{macrocode}
   \if@MGL@comments@%
     \list{}{}%
     \MGL@set@verbatim@code%
 %    \end{macrocode}
-% The separator indicating the begining of the commentary is similar to the one used by the |mglblock| and |mglverbatim| environments; the differences are that, instead of using a solid line, we use a dashed line (|\MGL@dash@sep|), and instead of displaying the name of a script, we display |\mglcommentname|.
+% The separator indicating the begining of the comment is similar to the one used by the |mglblock| and |mglverbatim| environments; the differences are that, instead of using a solid line, we use a dashed line (|\MGL@dash@sep|), and instead of displaying the name of a script, we display |\mglcommentname|.
 %    \begin{macrocode}
     \item\hskip-\labelsep<\MGL@dash@sep\mglcommentname\MGL@dash@sep>%
 %    \end{macrocode}
-% The two following lines redefine the |\verbatim@processline| command to display the commentary text line by line as items of the list, and start the process of writing the text.
+% The two following lines redefine the |\verbatim@processline| command to display the comment text line by line as items of the list, and start the process of writing the text.
 %    \begin{macrocode}
     \def\verbatim@processline{\item\the\verbatim@line}%
     \verbatim@start%
 %    \end{macrocode}
-% If the switch is false, i.e., the user requests no to display commentaries, we start a \emph{space hack}, since no text output will be produced. Then, the category codes are changed with |\MGL@codes|, and the macros |\verbatim@startline|, |\verbatim@addtoline|, |\verbatim@processline| and |\verbatim@finish| are disabled, as done in the |comment| environment of the \textsf{verbatim} package. Finally, we call the |\verbatim@| command to start reading the text in the environment.
+% If the switch is false, i.e., the user requests no to display comments, we start a \emph{space hack}, since no text output will be produced. Then, the category codes are changed with |\MGL@codes|, and the macros |\verbatim@startline|, |\verbatim@addtoline|, |\verbatim@processline| and |\verbatim@finish| are disabled, as done in the |comment| environment of the \textsf{verbatim} package. Finally, we call the |\verbatim@| command to start reading the text in the environment.
 %    \begin{macrocode}
   \else%
     \@bsphack%
 %    \end{macrocode}
 % \end{macro}
 % \begin{macro}{\endmglcomment}
-% The |\@MGL@comments@| switch also governs the behavior of this command. If it's true, then the separator that ends the commentary ---which is the same as the one that starts it--- is displayed, and the list is ended; otherwise, simply the \emph{space hack} is ended.
+% The |\@MGL@comments@| switch also governs the behavior of this command. If it's true, then the separator that ends the comment ---which is the same as the one that starts it--- is displayed, and the list is ended; otherwise, simply the \emph{space hack} is ended.
 %    \begin{macrocode}
 \def\endmglcomment{%
   \if@MGL@comments@%
 % \noindent Since external scripts exist independently of the \LaTeX{} document, there is no need of environments to process them, just commands. Remember these commands work on the suposition that the scripts don't change.
 %
 % \begin{macro}{\mglgraphics}
+% \changes{\textbf{v4.2 ------------}}{2016/05/14}{New command options: \texttt{gray}, \texttt{mglscale}, \texttt{quality}, \texttt{variant}}
 % This command compiles the external script and includes it in the document. Although that process is simple, the code to execute it is relatively large due to the possibility of the user specifying an optional path, so many parameters have to be checked.
 %    \begin{macrocode}
 
 %    \end{macrocode}
 % We add the option |path| for the user to be able to specify the location of the script, which is stored in the variable |\MGL@force@path|.
 %    \begin{macrocode}
-  \define@key{MGL@keys}{path}{\def\MGL@forced@path{##1}}%
+  \define@key{MGL@gr@keys}{path}{\def\MGL@forced@path{##1}}%
 %    \end{macrocode}
 % The optional arguments are processed.
 %    \begin{macrocode}
-  \MGL@setkeys{MGL@keys}{#1}%
+  \MGL@setkeys{MGL@gr@keys}{#1}%
 %    \end{macrocode}
 % The name of the script is set, though it is not check for multiple naming. This is necessary, since |\MGL@includegraphics| uses this macro.
 %    \begin{macrocode}
-  \edef\MGL@script@name{#2}%
+  \edef\MGL@script{#2}%
 %    \end{macrocode}
 % If the corresponding image exists, then this script has been compiled in a previous \LaTeX{} run, so nothing is done, but the inclusion of the image.
 %    \begin{macrocode}
-  \IfFileExists{\MGL@dir\MGL@graphics@dir\MGL@script@name\MGL@graph@ext}{}{%
+  \IfFileExists{\MGL@dir\MGL@graphics@dir\MGL@script\MGL@imgext}{}{%
 %    \end{macrocode}
 % If the image doesn't exist, we check if the user has specified a custom location.
 %    \begin{macrocode}
 % If no custom location has been used, we iterate over the list of search paths (|\MGL@paths|): If we find the requested script, then we store its location in |\MGL@temp@b|.
 %    \begin{macrocode}
       \@for\MGL@temp@a:=\MGL@paths\do{%
-        \IfFileExists{\MGL@temp@a\MGL@script@name.mgl}{%
+        \IfFileExists{\MGL@temp@a\MGL@script.mgl}{%
           \edef\MGL@temp@b{\MGL@temp@a}%
         }{}%
       }%
 %    \end{macrocode}
 % If the user has specified a path for the script, we check if the script actually exists. If it does, we store its location inside |\MGL@temp@b|.
 %    \begin{macrocode}
-      \IfFileExists{\MGL@forced@path\MGL@script@name.mgl}{%
+      \IfFileExists{\MGL@forced@path\MGL@script.mgl}{%
         \edef\MGL@temp@b{\MGL@forced@path}%
       }{}%
     }%
 %    \begin{macrocode}
     \@ifundefined{MGL@temp@b}{%
       \PackageWarning{mgltex}{%
-        MGL script "\MGL@script@name.mgl" not found%
+        MGL script "\MGL@script.mgl" not found%
       }%
     }{%
 %    \end{macrocode}
 % If |\MGL@temp@b| is defined, the script has been found, so we compile it.
 %    \begin{macrocode}
       \MGL@write{18}{%
-        mglconv -q \MGL@quality\space -S \MGL@scale\space%
-        -s "\MGL@dir\MGL@scripts@dir\mglcommonscriptname.mgl"\space%
-        -o "\MGL@dir\MGL@graphics@dir\MGL@script@name\MGL@graph@ext"\space%
-        "\MGL@temp@b\MGL@script@name.mgl"%
+        mglconv -q \MGL@quality\space -g \MGL@gray\space%
+        -S \MGL@scale\space -v \MGL@variant\space%
+        -s "\MGL@dir\MGL@scripts@dir\mglsetupscriptname.mgl"\space%
+        -o "\MGL@dir\MGL@graphics@dir\MGL@script\MGL@imgext"\space%
+        "\MGL@temp@b\MGL@script.mgl"%
       }%
     }%
   }%
 %    \begin{macrocode}
   \setkeys{MGL@verb@keys}{#1}%
 %    \end{macrocode}
-% We don't need to check if there are multiple scripts with the same name, so we namually set |\MGL@script@name|, instead of using |\MGL@set@script@name|.
+% We don't need to check if there are multiple scripts with the same name, so we namually set |\MGL@script|, instead of using |\MGL@set@script@name|.
 %    \begin{macrocode}
-  \edef\MGL@script@name{#2}%
+  \edef\MGL@script{#2}%
 %    \end{macrocode}
 % We check if the user has specified a custom location for the script.
 %    \begin{macrocode}
 %    \end{macrocode}
 % If the script exists, we store its location in |\MGL@temp@a|%
 %    \begin{macrocode}
-      \IfFileExists{\MGL@temp@b\MGL@script@name.mgl}{%
+      \IfFileExists{\MGL@temp@b\MGL@script.mgl}{%
         \edef\MGL@temp@a{\MGL@temp@b}%
       }{}%
     }%
 %    \end{macrocode}
 % If the user specified the location of the script, we check if it exists, in which case we store its location in |\MGL@temp@a|.
 %    \begin{macrocode}
-    \IfFileExists{\MGL@script@name.mgl}{%
+    \IfFileExists{\MGL@script.mgl}{%
       \edef\MGL@temp@a{\MGL@forced@path}%
     }{}%
   }%
 %    \begin{macrocode}
   \@ifundefined{MGL@temp@a}{%
     \PackageWarning{mgltex}{%
-      MGL script "\MGL@forced@path\MGL@script@name.mgl" not found%
+      MGL script "\MGL@forced@path\MGL@script.mgl" not found%
     }%
     \center%
       \fbox{%
 %    \end{macrocode}
 % We first add the script to the \LaTeX{} list of included files.
 %    \begin{macrocode}
-  \@addtofilelist{\MGL@script@name.mgl}%
+  \@addtofilelist{\MGL@script.mgl}%
 %    \end{macrocode}
 % If the user has used the unstarred version of |\mglinclude|, we add a contents line to the |.lms| file.
 %    \begin{macrocode}
   \if@MGL@list@script@%
-    \refstepcounter{MGL@verb@script@no}%
+    \refstepcounter{MGL@verb@no}%
     \addcontentsline{lms}{MGL@script}{%
-      \protect\numberline{\theMGL@verb@script@no.}%
-      {\ttfamily\protect\detokenize{\MGL@script@name.mgl}}%
+      \protect\numberline{\theMGL@verb@no.}%
+      {\ttfamily\protect\detokenize{\MGL@script.mgl}}%
     }%
   \fi%
 %    \end{macrocode}
 %    \begin{macrocode}
   \fboxrule=\mgllinethickness%
   \item[\MGL@line@sep]\fbox{%
-    \bfseries\ttfamily\expandafter\detokenize\expandafter{\MGL@script@name.mgl}%
+    \bfseries\ttfamily\expandafter\detokenize\expandafter{\MGL@script.mgl}%
   }\hskip\labelsep\MGL@line@sep\par\par%
 %    \end{macrocode}
 % We redefine the |\verbatim@processline| macro from the \textsf{verbatim} package to put |\the\verbatim@line| on an item.
 %    \end{macrocode}
 % The script is opened for reading.
 %    \begin{macrocode}
-  \immediate\openin\MGL@in@stream="\MGL@temp@a\MGL@script@name.mgl"%
+  \immediate\openin\MGL@in@stream="\MGL@temp@a\MGL@script.mgl"%
 %    \end{macrocode}
 % We call |\mglinclude@@@| to start the transcription.
 %    \begin{macrocode}
 % \end{macro}\end{macro}
 %
 % \subsection{Additional commands}
-% \begin{macro}{\mglname}
-% \noindent The purpose of this command is to force the closure of the current main script, compile the corresponding figures, and open a new main script. At first, it is defined to only change the value of |\MGL@main@script@name| because the main script is not opened until the call of |\begin{document}|; but at that point, it is redefined to perform the described actions.
-%    \begin{macrocode}
-\def\mglname#1{\edef\MGL@main@script@name{#1}}
-%    \end{macrocode}
-% Here is the redefinition of |\mglname|.
-%    \begin{macrocode}
-\AtBeginDocument{%
-  \def\mglname#1{%
-%    \end{macrocode}
-% We start a space hack, ince this function has no real effect on the document.
-%    \begin{macrocode}
-    \@bsphack%
-%    \end{macrocode}
-% The MGL functions created throughout the document are written.
-%    \begin{macrocode}
-    \MGL@write@funcs%
-%    \end{macrocode}
-% We force the closure of the main script. We use |\immediate\closeout| instead of |\MGL@closeout| in case \textsf{\mglTeX} is off.
-%    \begin{macrocode}
-    \immediate\closeout{\MGL@main@stream}%
-%    \end{macrocode}
-% The closed script is compiled.
-%    \begin{macrocode}
-    \MGL@write{18}{%
-      mglconv -q \MGL@quality\space -S \MGL@scale\space%
-      -s "\MGL@dir\MGL@scripts@dir\mglcommonscriptname.mgl"\space%
-      -n "\MGL@dir\MGL@scripts@dir\MGL@main@script@name.mgl"%
-    }%
-%    \end{macrocode}
-% The name of the new main script is updated, and it is check for overwriting, using |\MGL@set@script@name| inside a local group, since this command defines |\MGL@script@name|, which we need undefined in some parts of the code of the package.
-%    \begin{macrocode}
-    \edef\MGL@main@script@name{#1}%
-    \bgroup\MGL@set@script@name{\MGL@main@script@name}\egroup%
-    \MGL@openout\MGL@main@stream{%
-      \MGL@dir\MGL@scripts@dir\MGL@main@script@name.mgl%
-    }%
-%    \end{macrocode}
-% The space hack is ended.
-%    \begin{macrocode}
-    \@esphack%
-  }%
-}
-%    \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\mglswitch}
-% This command turns |on| and |off| the package according to its argument; it is just a call to the commands |\MGL@switch@on| or |\MGL@switch@off|.
-%    \begin{macrocode}
-\def\mglswitch#1{\csname MGL@switch@#1\endcsname}
-%    \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\mglcomments} Depending on the option passed by the user, it calls |\@MGL@comments@on| or |\@MGL@comments@off|.
-%    \begin{macrocode}
-\def\mglcomments#1{\csname @MGL@comments@#1\endcsname}
-%    \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\mgldir}
-% This command is the interface for the user to change the value of |\MGL@dir|. It is an only-preamble macro, since using it elsewhere would cause faulty behavior.
-%    \begin{macrocode}
-
-\def\mgldir#1{\def\MGL@dir{#1}}\@onlypreamble\mgldir
-%    \end{macrocode}
-% \end{macro}
-% \begin{macro}{\mglscriptsdir}
-% This command modifies the value of |\MGL@scripts@dir|. It is also an only-preamble macro.
-%    \begin{macrocode}
-\def\mglscriptsdir#1{\def\MGL@scripts@dir{#1}}\@onlypreamble\mglscriptsdir
-%    \end{macrocode}
-% \end{macro}
-% \begin{macro}{\mglgraphicsdir}
-% Modifies the value of |\MGL@graphics@dir|. It is an only-preamble macro.
-%    \begin{macrocode}
-\def\mglgraphicsdir#1{\def\MGL@graphics@dir{#1}}\@onlypreamble\mglgraphicsdir
-%    \end{macrocode}
-% \end{macro}
-% \begin{macro}{\mglbackupsdir}
-% Modifies the value of |\MGL@backups@dir|. It is an only-preamble macro.
-%    \begin{macrocode}
-\def\mglbackupsdir#1{\def\MGL@backups@dir{#1}}\@onlypreamble\mglbackupsdir
-%    \end{macrocode}
-% \end{macro}
-% \begin{macro}{\mglpaths}
-% This command adds a list of search paths for scripts to the existing one (|\MGL@paths|).
-%    \begin{macrocode}
-\def\mglpaths#1{\g@addto@macro\MGL@paths{,#1}}
-%    \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\mglimgext}
-% This command changes the value of |\MGL@graph@ext|.
-%    \begin{macrocode}
-\def\mglimgext#1{\def\MGL@graph@ext{#1}}
-%    \end{macrocode}
-% \end{macro}
-%
 % \begin{macro}{\listofmglscripts}
-% This command creates the \emph{list of MGL scripts} section. It has to be defined differently depending on whether the used document class defines the |\l@chapter| command or it only the |\l@section| command, which set the style for making a table of contents entry for the |\chapter| command and the |\section| command, respectively. If none of them are defined, we define our own style based on the latter.
+% \noindent This command creates the \emph{list of MGL scripts} section. It has to be defined differently depending on whether the used document class defines the |\l@chapter| command or it only the |\l@section| command, which set the style for making a table of contents entry for the |\chapter| command and the |\section| command, respectively. If none of them are defined, we define our own style based on the latter.
 %    \begin{macrocode}
 
 \ifx\l@chapter\@undefined%
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\mglcommonscriptname}\begin{macro}{\mglcommentname}\begin{macro}{\listofmglscriptsname}\begin{macro}{\mglverbatimname}\begin{macro}{\mgllinenostyle}\begin{macro}{\mgldashwidth}\begin{macro}{\mgllinethickness}\begin{macro}{\mglbreakindent}
+% \begin{macro}{\mglTeX}
+% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Add a small negative space in the logo, between the ``mgl'' and ``\TeX''}
+% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Declared now as robust command}
+% This macro pretty-prints the name of the package. It has a starred version, which also prints the version.
 %    \begin{macrocode}
 
-\def\mglcommonscriptname{MGL_common_script}
-\def\mglcommentname{MGL commentary}
+\DeclareRobustCommand\mglTeX{%
+  mgl\TeX\@ifstar{~v4.2}{}%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{Local settings commands}
+% \begin{macro}{\mglswitch}
+% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Now accepts arguments \texttt{0} (equivalent to \texttt{off}) and \texttt{1} (equivalent to \texttt{on}), besides the usual  \texttt{off} and \texttt{on}}
+% \noindent This command turns |on| and |off| the package according to its argument; it is just a call to the commands |\MGL@switch@on| or |\MGL@switch@off|.
+%    \begin{macrocode}
+\def\mglswitch#1{%
+  \MGL@test@switch{#1}{\mglswitch}%
+  \csname MGL@switch@\MGL@temp@a\endcsname%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mglcomments}
+% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Now accepts arguments \texttt{0} (equivalent to \texttt{off}) and \texttt{1} (equivalent to \texttt{on}), besides the usual  \texttt{off} and \texttt{on}}
+% Depending on the option passed by the user, it calls |\@MGL@comments@on| or |\@MGL@comments@off|.
+%    \begin{macrocode}
+\def\mglcomments#1{%
+  \MGL@test@switch{#1}{\mglcomments}%
+  \csname @MGL@comments@\MGL@temp@a\endcsname%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mglquality}
+% See under the title \emph{Initialization}, subsection \ref{Init}.
+% \end{macro}
+%
+% \begin{macro}{\mglscale}
+% See under the title \emph{Initialization}, subsection \ref{Init}.
+% \end{macro}
+%
+% \begin{macro}{\mglvariant}
+% See under the title \emph{Initialization}, subsection \ref{Init}.
+% \end{macro}
+%
+% \begin{macro}{\mglimgext}
+% This command changes the value of |\MGL@imgext|.
+%    \begin{macrocode}
+\def\mglimgext#1{\def\MGL@imgext{#1}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mglname}
+% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Now writes the MGL code line \texttt{setsize~600~400} to the main script}
+% \changes{\textbf{v4.2 ------------}}{2016/05/14}{The MGL code line \texttt{setsize~600~400} is now written to the main script}
+% \noindent The purpose of this command is to force the closure of the current main script, compile the corresponding figures, and open a new main script. At first, it is defined to only change the value of |\MGL@main@script@name| because the main script is not opened until the call of |\begin{document}|; but at that point, it is redefined to perform the described actions.
+%    \begin{macrocode}
+\def\mglname#1{\edef\MGL@main@script@name{#1}}
+%    \end{macrocode}
+% Here is the redefinition of |\mglname| after the |\begin{document}| command.
+%    \begin{macrocode}
+\AtBeginDocument{%
+  \def\mglname#1{%
+%    \end{macrocode}
+% We start a space hack, ince this function has no real effect on the document.
+%    \begin{macrocode}
+    \@bsphack%
+%    \end{macrocode}
+% The MGL functions created throughout the document are written.
+%    \begin{macrocode}
+    \MGL@write@funcs%
+%    \end{macrocode}
+% We force the closure of the main script. We use |\immediate\closeout| instead of |\MGL@closeout| in case \textsf{\mglTeX} is off.
+%    \begin{macrocode}
+    \immediate\closeout{\MGL@main@stream}%
+%    \end{macrocode}
+% The closed script is compiled.
+%    \begin{macrocode}
+    \MGL@write{18}{%
+      mglconv -q \MGL@quality\space -g \MGL@gray\space%
+      -S \MGL@scale\space -v \MGL@variant\space%
+      -s "\MGL@dir\MGL@scripts@dir\mglsetupscriptname.mgl"\space%
+      -n "\MGL@dir\MGL@scripts@dir\MGL@main@script@name.mgl"%
+    }%
+%    \end{macrocode}
+% The name of the new main script is updated, and it is check for overwriting, using |\MGL@set@script@name| inside a local group, since this command defines |\MGL@script|, which we need undefined in some parts of the code of the package.
+%    \begin{macrocode}
+    \edef\MGL@main@script@name{#1}%
+    \bgroup\MGL@set@script@name{\MGL@main@script@name}\egroup%
+    \MGL@openout\MGL@main@stream{%
+      \MGL@dir\MGL@scripts@dir\MGL@main@script@name.mgl%
+    }%
+%    \end{macrocode}
+% We set the default size for the graphics that the main script will generate; without this line the |setsizescl| commands written automatically by \textsf{\mglTeX} wouldn't work.
+%    \begin{macrocode}
+    \MGL@write\MGL@main@script@name{setsize 600 400}
+%    \end{macrocode}
+% The space hack is ended.
+%    \begin{macrocode}
+    \@esphack%
+  }%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{Advanced settings commands}
+% \begin{macro}{\mgldir}
+% \noindent This command is the interface for the user to change the value of |\MGL@dir|. It is an only-preamble macro, since using it elsewhere would cause faulty behavior.
+%    \begin{macrocode}
+
+\def\mgldir#1{\def\MGL@dir{#1}}\@onlypreamble\mgldir
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\mglscriptsdir}
+% This command modifies the value of |\MGL@scripts@dir|. It is also an only-preamble macro.
+%    \begin{macrocode}
+\def\mglscriptsdir#1{\def\MGL@scripts@dir{#1}}\@onlypreamble\mglscriptsdir
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\mglgraphicsdir}
+% Modifies the value of |\MGL@graphics@dir|. It is an only-preamble macro.
+%    \begin{macrocode}
+\def\mglgraphicsdir#1{\def\MGL@graphics@dir{#1}}\@onlypreamble\mglgraphicsdir
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\mglbackupsdir}
+% Modifies the value of |\MGL@backups@dir|. It is an only-preamble macro.
+%    \begin{macrocode}
+\def\mglbackupsdir#1{\def\MGL@backups@dir{#1}}\@onlypreamble\mglbackupsdir
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\mglpaths}
+% This command adds a list of search paths for scripts to the existing one (|\MGL@paths|).
+%    \begin{macrocode}
+\def\mglpaths#1{\g@addto@macro\MGL@paths{,#1}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mglsettings}
+%  \changes{\textbf{v4.2 ------------}}{2016/05/14}{Now calls the \doccommand{mglswitch} and \doccommand{mglcomments} commands for the \texttt{switch} and \texttt{comments} options, respectively}
+% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Added options \texttt{gray} and \texttt{variant}}
+% First, we define a \meta{key}=\meta{value} family, |MGL@sett@keys|, for this command.
+%    \begin{macrocode}
+\define@key{MGL@sett@keys}{dir}{\def\MGL@dir{#1}}
+\define@key{MGL@sett@keys}{scriptsdir}{\def\MGL@scripts@dir{#1}}
+\define@key{MGL@sett@keys}{graphicsdir}{\def\MGL@graphics@dir{#1}}
+\define@key{MGL@sett@keys}{backupsdir}{\def\MGL@backups@dir{#1}}
+\define@key{MGL@sett@keys}{paths}{\g@addto@macro\MGL@paths{,#1}}
+\define@key{MGL@sett@keys}{switch}{\mglswitch{#1}}
+\define@key{MGL@sett@keys}{comments}{\mglcomments{#1}}
+\define@key{MGL@sett@keys}{gray}{\mglgray{#1}}
+\define@key{MGL@sett@keys}{mglscale}{\mglscale{#1}}
+\define@key{MGL@sett@keys}{quality}{\mglquality{#1}}
+\define@key{MGL@sett@keys}{variant}{\mglvariant{#1}}
+\define@key{MGL@sett@keys}{imgext}{\def\MGL@imgext{.#1}}
+%    \end{macrocode}
+% The command receives and executes the \meta{key}=\meta{value} pairs for |MGL@sett@keys|. This is an only-preamble command.
+%    \begin{macrocode}
+\def\mglsettings#1{\setkeys{MGL@sett@keys}{#1}}
+\@onlypreamble\mglsettings
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{User-definable macros}
+% \begin{macro}{\mglsetupscriptname}\begin{macro}{\mglcommentname}\begin{macro}{\listofmglscriptsname}\begin{macro}{\mglverbatimname}\begin{macro}{\mgllinenostyle}\begin{macro}{\mgldashwidth}\begin{macro}{\mgllinethickness}\begin{macro}{\mglbreakindent}
+% The user is allowed to modifu these commands, so no |@| symbol is used on them.
+%    \begin{macrocode}
+
+\def\mglsetupscriptname{MGL_setup_script}
+\def\mglcommentname{\mglTeX{} comment}
 \def\listofmglscriptsname{List of MGL scripts}
 \def\mglverbatimname{(Unnamed MGL verbatim script)}
 \def\mgllinenostyle{\footnotesize}
 %    \end{macrocode}
 % \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}\end{macro}\end{macro}\end{macro}
 %
-% \begin{macro}{\mglTeX}
-% This macro pretty-prints the name of the package. It has a starred version, which also prints the version.
-%    \begin{macrocode}
-
-\def\mglTeX{%
-  mgl\TeX\@ifstar{~v4.1}{}%
-}
-%    \end{macrocode}
-% \end{macro}
-%
 % \subsection{Final adjustments}
 % To finish the code of \textsf{\mglTeX}, we set the behavior of the package at the call of the |\begin{document}| and |\end{document}| commands.
 %
-% We tell \LaTeX{} to check the name of the document's main script for overwriting. We do this by calling |\MGL@set@script@name| inside a local group, because it defines |\MGL@script@name|, which we need undefined in certain parts of the code. Then the script is opened. We use |\immediate\openout| instead of |\MGL@openout| for this purpose, since, otherwise, we run the risk of the main script not being created when needed, if the user turns off \textsf{\mglTeX} before the |\begin{document}| command, and turns it on immediately after.
+% We tell \LaTeX{} to check the name of the document's main script for overwriting. We do this by calling |\MGL@set@script@name| inside a local group, because it defines |\MGL@script|, which we need undefined in certain parts of the code. Then the script is opened. We use |\immediate\openout| instead of |\MGL@openout| for this purpose, since, otherwise, we run the risk of the main script not being created when needed, if the user turns off \textsf{\mglTeX} before the |\begin{document}| command, and turns it on immediately after. Finally, we set the default size for the graphics the main script will generate; without this line the |setsizescl| commands written automatically by \textsf{\mglTeX} wouldn't work.
 %    \begin{macrocode}
 
 \AtBeginDocument{%
   \bgroup\MGL@set@script@name{\MGL@main@script@name}\egroup%
   \immediate\openout\MGL@main@stream=%
   \MGL@dir\MGL@scripts@dir\MGL@main@script@name.mgl%
+  \MGL@write\MGL@main@stream{setsize 600 400}%
 }
 %    \end{macrocode}
+%
 % We also set the actions for the call of |\end{document}|
 %    \begin{macrocode}
+
 \AtEndDocument{%
 %    \end{macrocode}
 % |\MGL@write@funcs| will simply write the MGL functions throughout the \LaTeX{} document.
 % The main script is compiled.
 %    \begin{macrocode}
   \MGL@write{18}{%
-    mglconv -q \MGL@quality\space -S \MGL@scale\space%
-    -s "\MGL@dir\MGL@scripts@dir\mglcommonscriptname.mgl"\space%
+    mglconv -q \MGL@quality\space -g \MGL@gray\space%
+    -S \MGL@scale\space -v \MGL@variant\space%
+    -s "\MGL@dir\MGL@scripts@dir\mglsetupscriptname.mgl"\space%
     -n "\MGL@dir\MGL@scripts@dir\MGL@main@script@name.mgl"%
   }%
 }
index f58fa7239f197de32dbd21aba902a6e8053e043b..49d18eeaacc359eff84170e7551762ff04bb4f6c 100644 (file)
@@ -1,6 +1,6 @@
 %%
-%% Copyright (C) 2014--2015 by Diego Sejas Viscarra <diego.mathematician@gmail.com>
-%% Copyright (C) 2014--2015 by Alexey Balakin <mathgl.abalakin@gmail.com>
+%% Copyright (C) 2014--2016 by Diego Sejas Viscarra <dsejas.mathematics@gmail.com>
+%% Copyright (C) 2014--2016 by Alexey Balakin <mathgl.abalakin@gmail.com>
 %%
 %% This program is free software: you can redistribute it and/or modify it
 %% under the terms of the GNU General Public License as published by the
@@ -60,4 +60,4 @@ with this program.  If not, see <http://www.gnu.org/licenses/>.
 \Msg{*                                                        *}
 \Msg{**********************************************************}
 
-\endbatchfile
\ No newline at end of file
+\endbatchfile
index 296f42ec5de0157e6e62565d358b91a37f441a6f..58c5dd6a3f8b768c158448f3fd5f711c06c0b929 100644 (file)
Binary files a/mgltex/mgltex.pdf and b/mgltex/mgltex.pdf differ
index d7d39eb7138e09201a7bdfcd319fa949c1b2cdb5..91447c8de17f9d7e7730dbfdf8799e39bad39b4e 100644 (file)
 \documentclass{article}
 
-\usepackage[jpg,comments]{mgltex}
+\usepackage[png,comments]{mgltex}
+\usepackage{hyperref}
 
-\title{\mglTeX{} package example}
-\author{Diego Sejas Viscarra, Alexey Balakin}
+\title{\mglTeX*{} usage sample}
+\author{Diego Sejas Viscarra \and Alexey Balakin}
 \date{\today}
 
-\mgldir{MGL/}
-\mglscriptsdir{scripts/}
-\mglgraphicsdir{graphics/}
-\mglbackupsdir{backups/}
-
-\begin{mglcommon}
-  define gravity 9.81
-\end{mglcommon}
-
-%\begin{mglsignature}
-%  This scripts was generated on date |today.
-%\end{mglsignature}
+\mglsettings{
+       dir=MGL/,
+       scriptsdir=scripts/,
+       graphicsdir=graphics/,
+       backupsdir=backups/
+}
 
+\begin{mglsetupscript}
+       define gravity 9.81 # [m/s^2]
+\end{mglsetupscript}
 
 \begin{document}
-  
-\maketitle
-
-\noindent The \LaTeX{} package \textsf{\mglTeX} (was made by Diego Sejas Viscarra) allows one to make figures directly from MGL scripts located in \LaTeX{} file. 
-
-For using this package you need to specify \texttt{--shell-escape} option for \emph{latex/pdflatex} or manually run \emph{mglconv} tool on produced MGL scripts for generation of images. Don't forget to run \emph{latex/pdflatex} a second time to insert the generated images into the output document.
-
-The package may have following options: \texttt{draft}, \texttt{final} --- the same as in the \emph{graphicx} package; \texttt{on}, \texttt{off} --- to activate/deactivate the creation of scripts and graphics; \texttt{comments}, \texttt{nocomments} --- to make visible/invisible commentaries contained inside \texttt{mglcomment} environments; \texttt{jpg}, \texttt{jpeg}, \texttt{png} --- to export graphics as JPEG/PNG images; \texttt{eps}, \texttt{epsz} --- to export to uncompressed/compressed EPS format as primitives; \texttt{bps}, \texttt{bpsz} --- to export to uncompressed/compressed EPS format as bitmap (doesn't work with \emph{pdflatex}); \texttt{pdf} --- to export to 3D PDF; \texttt{tex} --- to export to \LaTeX{}/\emph{tikz} document.
-
-The package defines the following environments:
-\begin{description}
-\item[mgl]
-       It writes its contents to a general script which has the same name as the LaTeX document, but its extension is \emph{.mgl}. The code in this environment is compiled and the image produced is included. It takes exactly the same optional arguments as the \texttt{\textbackslash{}includegraphics} command, plus an additional argument \emph{imgext}, which specifies the extension to save the image.
-\item[mgladdon]
-       It adds its contents to the general script, without producing any image. It useful to set some global properties (like size of the images) at beginning of the document.
-\item[mglcode]
-       Is exactly the same as \texttt{mgl}, but it writes its contents verbatim to its own file, whose name is specified as a mandatory argument.
-\item[mglscript]
-       Is exactly the same as \texttt{mglcode}, but it doesn't produce any image, nor accepts optional arguments. It is useful, for example, to create a MGL script, which can later be post processed by another package like "listings".
-\item[mglblock]
-       It writes its contents verbatim to a file, specified as a mandatory argument, and to the LaTeX document, and numerates each line of code.
-
-% This last three environments will test if the user is overwriting some file, and will issue a warning in that case.
-\item[mglverbatim]
-       Exactly the same as \texttt{mglblock}, but it doesn't write to a file. This environment doesn't have arguments.
-\item[mglfunc]
-       Is used to define MGL functions. It takes one mandatory argument, which is the name of the function, plus one additional argument, which specifies the number of arguments of the function. The environment needs to contain only the body of the function, since the first and last lines are appended automatically, and the resulting code is written at the end of the general script, which is also written automatically. The warning is produced if 2 or more function with the same name is defined.
-\item[mglsignature]
-Used to defined a commentary that will be added to every script. It is useful to include signature text or license text. Observe this is a verbatim-like environment, so no \LaTeX{} command will be executed inside it, but will be copied as is.
-
-As an alternative to this method of declaring signatures, the user can manually redefine the signature macro \texttt{\textbackslash{}mgltexsignature}, according to the following rules:
-  \begin{itemize}
-    \item The positions of the comment signs for the MGL language have to be manually specified in the signature using the \texttt{\textbackslash{}mglcomm} macro.
-    \item The new-line character is declared as ``\verb|^^J|''.
-    \item A percent sign (\texttt{\%}) has to be added at the end of every physical line of \texttt{\textbackslash{}mgltexsignature}, otherwise an inelegant space at the beginning of every line will appear.
-  \item Any \LaTeX{} command can be used in this case.
-\end{itemize}
-  For example, the default signature:
-  \begin{mglcomment}
-  \begin{quote}\small
-    \mglcomm\\
-    \mglcomm\ This script was generated from $<$document$>$.mgl on date $<$today$>$\\
-    \mglcomm
-  \end{quote}
-  \end{mglcomment}
-  can be achieved with
-  \begin{verbatim}
-    \def\mgltexsignature{%
-      \mglcomm^^J%
-      \mglcomm\ This script was generated from \jobname.mgl on date \today^^J%
-      \mglcomm%
-    }
-  \end{verbatim}
-\item[mglcomment]
-  Used to contain multiline commentaries. This commentaries will be visible/invisible in the output document, depending on the use of the package options \texttt{comments} and \texttt{nocomments} (see above), or the \texttt{\mglcomments{on}} and \texttt{\mglcomments{off}} commands (see bellow).
-  
-  When, visible, the comment will appear like this:
-  \begin{center}
-    \makeatletter
-    \verbatim@font
-    \makeatother
-    <------------------ MGL comment ------------------>\\
-    $<$Commentary$>$\\
-    <------------------ MGL comment ------------------>\\
-  \end{center}
-\item[mglsetup]
-       If many scripts with the same code are to be written, the repetitive code can be written inside this environment only once, then this code will be used automatically every time the \texttt{\textbackslash{}mglplot} command is used (see below). It takes one optional argument, which is a name to be associated to the corresponding contents of the environment; this name can be passed to the \texttt{\textbackslash{}mglplot} command to use the corresponding block of code automatically (see below).
-\end{description}
-
-The package also defines the following commands:
-\begin{description}
-\item[\textbackslash{}mglplot]
-       It takes one mandatory argument, which is MGL instructions separated by the symbol ':' this argument can be more than one line long. It takes the same optional arguments as the \texttt{mgl} environment, plus an additional argument \emph{settings}, which indicates the name associated to a block of code inside a \texttt{mglsetup} environment. The code inside the mandatory argument will be appended to the block of code specified, and the resulting code will be written to the general script.
-\item[\textbackslash{}mglgraphics]
-       This command takes the same optional arguments as the \texttt{mgl} environment, and one mandatory argument, which is the name of a MGL script. This command will compile the corresponding script and include the resulting image. It is useful when you have a script outside the LaTeX document, and you want to include the image, but you don't want to type the script again.
-\item[\textbackslash{}mglinclude]
-       This is like \texttt{\textbackslash{}mglgraphics} but, instead of creating/including the corresponding image, it writes the contents of the MGL script to the LaTeX document, and numerates the lines.
-\item[\textbackslash{}mgldir]
-       This command can be used in the preamble of the document to specify a directory where LaTeX will save the MGL scripts and generate the corresponding images. This directory is also where \texttt{\textbackslash{}mglgraphics} and \texttt{\textbackslash{}mglinclude} will look for scripts.
-\item[\textbackslash{}mglquality]
-  Can be used to adjust the quality of the MGL graphics produced. The following table shows the available qualities:
-  \begin{center}
-    \begin{tabular}{cl}
-      \hline
-      Quality & Description\\
-      \hline
-      \hline
-      $0$ & No face drawing (fastest)\\
-      \hline
-      $1$ & No color interpolation (fast)\\
-      \hline
-      $2$ & High quality (normal)\\
-      \hline
-      $3$ & High quality with 3d primitives (not implemented yet)\\
-      \hline
-      $4$ & No face drawing, direct bitmap drawing (low memory usage)\\
-      \hline
-      $5$ & No color interpolation, direct bitmap drawing (low memory usage)\\
-      \hline
-      $6$ & High quality, direct bitmap drawing (low memory usage)\\
-      \hline
-      $7$ & High quality with 3d primitives, direct bitmap drawing (not implemented yet)\\
-      \hline
-      $8$ & Draw dots instead of primitives (extremely fast)\\
-      \hline
-    \end{tabular}
-  \end{center}
-\item[\textbackslash{}mglswitch\{on\}, \textbackslash{}mglswitch\{off\}]
-  To activate/deactivate the creation of MGL scripts and images. Notice these commands have local behavior in the sense that their effect is from the point they are called on.
-\item[\textbackslash{}mglcomment\{on\}, \textbackslash{}mglnocomment\{off\}]
-  To make visible/invisible the contents of the \texttt{mglcomment} environments. These commands have local effect too.
-\item[\textbackslash{}mglTeX]
-       It just pretty prints the name of the package ``\mglTeX''.
-\end{description}
-
-
-An example of usage of \texttt{mgl} and \texttt{mglfunc} environments would be:
-\begin{verbatim}
-\begin{mglfunc}{prepare2d}
-  new a 50 40 '0.6*sin(pi*(x+1))*sin(1.5*pi*(y+1))+0.4*cos(0.75*pi*(x+1)*(y+1))'
-  new b 50 40 '0.6*cos(pi*(x+1))*cos(1.5*pi*(y+1))+0.4*cos(0.75*pi*(x+1)*(y+1))'
-\end{mglfunc}
-
-\begin{figure}[!ht]
-  \centering
-  \begin{mgl}[width=0.85\textwidth,height=7.5cm]
-    fog 0.5
-    call 'prepare2d'
-    subplot 2 2 0:title 'Surf plot (default)':rotate 50 60:light on:box:surf a
-
-    subplot 2 2 1:title '"\#" style; meshnum 10':rotate 50 60:box
-    surf a '#'; meshnum 10
-
-    subplot 2 2 2 : title 'Mesh plot' : rotate 50 60 : box
-    mesh a
-
-    new x 50 40 '0.8*sin(pi*x)*sin(pi*(y+1)/2)'
-    new y 50 40 '0.8*cos(pi*x)*sin(pi*(y+1)/2)'
-    new z 50 40 '0.8*cos(pi*(y+1)/2)'
-    subplot 2 2 3 : title 'parametric form' : rotate 50 60 : box
-    surf x y z 'BbwrR'
-  \end{mgl}
-\end{figure}
-\end{verbatim}
-Note, that \texttt{mglfunc} environment(s) can be located at any position (at the beginning, at the end, or somewhere else) of LaTeX document.
-\begin{mglfunc}{prepare2d}
-  new a 50 40 '0.6*sin(pi*(x+1))*sin(1.5*pi*(y+1))+0.4*cos(0.75*pi*(x+1)*(y+1))'
-  new b 50 40 '0.6*cos(pi*(x+1))*cos(1.5*pi*(y+1))+0.4*cos(0.75*pi*(x+1)*(y+1))'
-\end{mglfunc}
-
-\begin{figure}[!ht]
-  \centering
-  \begin{mgl}[width=0.85\textwidth,height=7.5cm]
-    fog 0.5
-    call 'prepare2d'
-    subplot 2 2 0 : title 'Surf plot (default)' : rotate 50 60 : light on : box : surf a
-
-    subplot 2 2 1 : title '"\#" style; meshnum 10' : rotate 50 60 : box
-    surf a '#'; meshnum 10
-
-    subplot 2 2 2 : title 'Mesh plot' : rotate 50 60 : box
-    mesh a
-
-    new x 50 40 '0.8*sin(pi*x)*sin(pi*(y+1)/2)'
-    new y 50 40 '0.8*cos(pi*x)*sin(pi*(y+1)/2)'
-    new z 50 40 '0.8*cos(pi*(y+1)/2)'
-    subplot 2 2 3 : title 'parametric form' : rotate 50 60 : box
-    surf x y z 'BbwrR'
-  \end{mgl}
-\end{figure}
-
-Following example show the usage of \texttt{mglscript} environment
-\begin{verbatim}
-\begin{mglscript}{Vectorial}
-call 'prepare2v'
-subplot 3 2 0 '' : title 'lolo' : box
-vect a b
-subplot 3 2 1 '' : title '"." style; "=" style' : box
-vect a b '.='
-subplot 3 2 2 '' : title '"f" style' : box
-vect a b 'f'
-subplot 3 2 3 '' : title '">" style' : box
-vect a b '>'
-subplot 3 2 4 '' : title '"<" style' : box
-vect a b '<'
-call 'prepare3v'
-subplot 3 2 5 : title '3d variant' : rotate 50 60 : box
-vect ex ey ez
-
-stop
-    
-func 'prepare2v'
-  new a 20 30 '0.6*sin(pi*(x+1))*sin(1.5*pi*(y+1))+0.4*cos(0.75*pi*(x+1)*(y+1))'
-  new b 20 30 '0.6*cos(pi*(x+1))*cos(1.5*pi*(y+1))+0.4*cos(0.75*pi*(x+1)*(y+1))'
-return
-    
-func 'prepare3v'
-  define $1 pow(x*x+y*y+(z-0.3)*(z-0.3)+0.03,1.5)
-  define $2 pow(x*x+y*y+(z+0.3)*(z+0.3)+0.03,1.5)
-  new ex 10 10 10 '0.2*x/$1-0.2*x/$2'
-  new ey 10 10 10 '0.2*y/$1-0.2*y/$2'
-  new ez 10 10 10 '0.2*(z-0.3)/$1-0.2*(z+0.3)/$2'
-return
-\end{mglscript}
-\end{verbatim}
-
-\begin{mglscript}{Vectorial}
-call 'prepare2v'
-subplot 3 2 0 '' : title 'lolo' : box
-vect a b
-subplot 3 2 1 '' : title '"." style; "=" style' : box
-vect a b '.='
-subplot 3 2 2 '' : title '"f" style' : box
-vect a b 'f'
-subplot 3 2 3 '' : title '">" style' : box
-vect a b '>'
-subplot 3 2 4 '' : title '"<" style' : box
-vect a b '<'
-call 'prepare3v'
-subplot 3 2 5 : title '3d variant' : rotate 50 60 : box
-vect ex ey ez
-
-stop
-    
-func 'prepare2v'
-  new a 20 30 '0.6*sin(pi*(x+1))*sin(1.5*pi*(y+1))+0.4*cos(0.75*pi*(x+1)*(y+1))'
-  new b 20 30 '0.6*cos(pi*(x+1))*cos(1.5*pi*(y+1))+0.4*cos(0.75*pi*(x+1)*(y+1))'
-return
-    
-func 'prepare3v'
-  define $1 pow(x*x+y*y+(z-0.3)*(z-0.3)+0.03,1.5)
-  define $2 pow(x*x+y*y+(z+0.3)*(z+0.3)+0.03,1.5)
-  new ex 10 10 10 '0.2*x/$1-0.2*x/$2'
-  new ey 10 10 10 '0.2*y/$1-0.2*y/$2'
-  new ez 10 10 10 '0.2*(z-0.3)/$1-0.2*(z+0.3)/$2'
-return
-\end{mglscript}
-
-You should use \texttt{\textbackslash{}mglgraphics} command to display its contents
-\begin{verbatim}
-\begin{figure}[!ht]
-  \centering
-  \mglgraphics[width=40em,height=20em]{Vectorial}
-  \caption{A beautiful example}
-\end{figure}
-\end{verbatim}
-
-\begin{figure}[!ht]
-  \centering
-  \mglgraphics[width=40em,height=20em]{Vectorial}
-  \caption{A beautiful example}
-\end{figure}
-
-Alternatively, you can display the contents of the script in parallel to saving to a file, if you are using \texttt{mglblock} environment
-\begin{verbatim}
-\begin{mglblock}{Axis_projection}
-  ranges 0 1 0 1 0 1
-  new x 50 '0.25*(1+cos(2*pi*x))'
-  new y 50 '0.25*(1+sin(2*pi*x))'
-  new z 50 'x'
-  new a 20 30 '30*x*y*(1-x-y)^2*(x+y<1)'
-  new rx 10 'rnd':new ry 10:fill ry '(1-v)*rnd' rx
-  light on
-  
-  title 'Projection sample':ternary 4:rotate 50 60
-  box:axis:grid
-  plot x y z 'r2':surf a '#'
-  xlabel 'X':ylabel 'Y':zlabel 'Z'
-\end{mglblock}
-\begin{figure}[!ht]
-  \centering
-  \mglgraphics[scale=0.5]{Axis_projection}
-  \caption{The image from Axis\_projection.mgl script}
-\end{figure}
-\end{verbatim}
-
-\begin{mglblock}{Axis_projection}
-  ranges 0 1 0 1 0 1
-  new x 50 '0.25*(1+cos(2*pi*x))'
-  new y 50 '0.25*(1+sin(2*pi*x))'
-  new z 50 'x'
-  new a 20 30 '30*x*y*(1-x-y)^2*(x+y<1)'
-  new rx 10 'rnd':new ry 10:fill ry '(1-v)*rnd' rx
-  light on
-  
-  title 'Projection sample':ternary 4:rotate 50 60
-  box:axis:grid
-  plot x y z 'r2':surf a '#'
-  xlabel 'X':ylabel 'Y':zlabel 'Z'
+       
+       \maketitle
+       
+       \begin{abstract}
+               \noindent \mglTeX{} is a \LaTeX{} package that allows the creation of graphics directly from MGL scripts of the MathGL library (by Alexey Balakin) inside documents. The MGL code is extracted, executed (if shell escape is activated), and the resulting graphics are automatically included.
+               
+               This document is intended as a sample of the capabilities of \mglTeX{}, as well as a brief introduction to the package, for those who want to start right away to use it, without diving into the a little bit more technical documentation.
+       \end{abstract}
+       
+       \section{Basics on environments}
+       \begin{description}
+               \item[mgl] The easiest way to embed MGL code is the \verb|mgl| environment. It extracts its contents to a main script associated to the document.\footnote{Generally, the main script has the same name as the document being compiled. In order to rename it or create a new one, the \texttt{\textbackslash mglname} command can be used.} If shell escape is activated, \LaTeX{} will take care of calling \verb|mglconv| (the MathGL compiler) with the appropriate settings, and the resulting image will be automatically included.
+               
+               For example, you could write:
+               \begin{verbatim}
+                       \begin{figure}[!ht]
+                         \centering
+                         \begin{mgl}[width=0.85\textwidth,height=6cm]
+                           call 'prepare1d'
+                           subplot 2 1 0 '<_' : title 'Standard data plot'
+                           box : axis : grid 'xy' ';k'
+                           plot y ’rGb’
+                           
+                           subplot 2 1 1 '<_' : title 'Region plot'
+                                 ranges -1 1 -1 1 : origin 0 0
+                                 new y1 200 'x^3-x' : new y2 200 'x'
+                                 axis : grid 'xy' 'W'
+                                 region y1 y2 'ry'
+                                 plot y1 '2k' : plot y2 '2k'
+                                 text -0.75 -0.35 '\i{A}_1' 'k' : text 0.75 0.25 '\i{A}_2' 'k'
+                         \end{mgl}
+                         \caption{A simple plot create by \mglTeX's \texttt{mgl} environment}
+                       \end{figure}
+               \end{verbatim}
+               This will produce the following image:
+               \begin{figure}[!ht]
+                       \centering
+                       \begin{mgl}[width=0.85\textwidth,height=5.5cm]
+                               call 'prepare1d'
+                               subplot 2 1 0 '<_' : title 'Standard data plot'
+                               box : axis : grid 'xy' ';k'
+                               plot y '2'
+                               
+                               subplot 2 1 1 '<_' : title 'Region plot'
+                               ranges -1 1 -1 1 : origin 0 0
+                               new y1 200 'x^3-x' : new y2 200 'x'
+                               axis 'AKDTVISO' : grid 'xy' ';W'
+                               region y1 y2 'ry'
+                               plot y1 '2k' : plot y2 '2k'
+                               text -0.75 -0.35 '\i{A}_1' 'k' -2 : text 0.75 0.25 '\i{A}_2' 'k' -2
+                       \end{mgl}
+                       \caption{A simple plot create by \mglTeX's \texttt{mgl} environment}
+               \end{figure}
+               
+               Two important aspects of \mglTeX{} can be noted from this example: First, the \verb|mgl| environment accepts the same optional argument as the \verb|\includegraphics| command from the \verb|graphicx| package. Actually, it also accepts other optional arguments, called \verb|gray| (to activate/deactivate gray-scale mode), \verb|mglscale| (to set the factor for scaling the image file), \verb|quality| (to set the quality of the image), \verb|variant| (to chose the variant of the arguments of MGL commands in the script), \verb|imgext| (to specify the extension of the resulting graphic file), and \verb|label| (to specify a name to save the image). Most of these options are available to every \mglTeX{} environment or command to create graphics.
+               
+               The second aspect to be noted about the example is that this script calls a MGL function, \verb|prepare1d|, which hasn't been defined yet. \mglTeX{} provides the \verb|mglfunc| environment for this purpose (see below).
+               
+               \item[mglfunc] This environment can be used in any part of the \LaTeX{} document; \mglTeX{} takes care of placing the corresponding code at the end of the main script, as has to be done in the MGL language.
+               
+               For example, the function \verb|prepare1d| that is called in the script above is defined like this
+               \begin{verbatim}
+                 \begin{mglfunc}{prepare1d}
+                   new y 50 3
+                   modify y '0.7*sin(2*pi*x)+0.5*cos(3*pi*x)+0.2*sin(pi*x)'
+                   modify y 'sin(2*pi*x)' 1
+                   modify y 'cos(2*pi*x)' 2
+                 \end{mglfunc}
+               \end{verbatim}
+               \begin{mglfunc}{prepare1d}
+                       new y 50 3
+                       modify y '0.7*sin(2*pi*x)+0.5*cos(3*pi*x)+0.2*sin(pi*x)'
+                       modify y 'sin(2*pi*x)' 1
+                       modify y 'cos(2*pi*x)' 2
+               \end{mglfunc}
+               As you can see, only the body of the function has to be written. The number of arguments of the function can be passed to \verb|mglfunc| as optional argument, like in the code \verb|\begin{mglfunc}[3]{func_with_three_args}|.
+               
+               \item[mgladdon] This environment just adds its contents to the main script, without producing any image. It is useful to load dynamic libraries, define constants, etc.
+               
+               \item[mglcode] The \verb|mglcode| environment is similar to \verb|mgl|, but it creates its own script, whose name is passed as mandatory argument. The same optional arguments are accepted, except \verb|label| (for obvious reasons).
+               \begin{verbatim}
+                       \begin{figure}[!ht]
+                         \begin{mglcode}[scale=0.5]{vectorial_flow}
+                           new a 20 30 'sin(pi*x)*sin(pi*y)+cos(2*pi*x*y)'
+                           new b 20 30 'cos(pi*x)*cos(pi*y)+cos(2*pi*x*y)'
+                           
+                           subplot 1 1 0 '' : title 'Flow of vector field' : box
+                           flow a b 'v'; value 20
+                         \end{mglcode}
+                       \end{figure}
+               \end{verbatim}
+               \begin{figure}[!ht]
+                       \centering
+                       \begin{mglcode}[scale=0.5]{vectorial_flow}
+                               new a 20 30 'sin(pi*x)*sin(pi*y)+cos(2*pi*x*y)'
+                               new b 20 30 'cos(pi*x)*cos(pi*y)+cos(2*pi*x*y)'
+                               
+                               subplot 1 1 0 '' : title 'Flow of a vector field' : box
+                               flow a b '2v'; value 10
+                       \end{mglcode}
+               \end{figure}
+               
+               \item[mglscript] This environment just creates a script, whose name is specified as mandatory argument. It is useful, for example, to create MGL scripts which can later be post-processed by another package, like \verb|listings| or \verb|pygments|.
+               
+               For example, the following won't produce any image, just a script:
+               \begin{verbatim}
+                       \begin{mglscript}{Gaston_surface}
+                         subplot 1 1 0 '' : title 'Gaston\'s surface'
+                         ranges -13 13 -40 40
+                         new a 200 200 '-x+(2*0.84*cosh(0.4*x)*sinh(0.4*x))/' \
+                           '(0.4*((sqrt(0.84)*cosh(0.4*x))^2+(0.4*sin(sqrt(0.84)*y))))+' \
+                           '0.5*sin(pi/2*x)'
+                         new b 200 200 '(2*sqrt(0.84)*cosh(0.45*x)*(-(sqrt(0.84)*sin(y)*' \
+                           'cos(sqrt(0.84)*y))+cos(y)*sin(sqrt(0.84)*y)))/' \
+                           '(0.4*((sqrt(0.84)*cosh(0.4*x))^2+2*(0.4*sin(sqrt(0.84)*x))^2))'
+                         new c 200 200 '(2*sqrt(0.84)*cosh(0.45*x)*(-(sqrt(0.84)*cos(y)*' \
+                           'cos(sqrt(0.84)*y))-sin(y)*sin(sqrt(0.84)*y)))/' \
+                           '(0.4*((sqrt(0.84)*cosh(0.4*x))^2+2*(0.4*sin(sqrt(0.84)*x))^2))'
+                         rotate 60 60
+                         light on
+                         xrange c : yrange b : zrange a : crange c
+                         surf c b a '#'; meshnum 100
+                       \end{mglscript}
+               \end{verbatim}
+               \begin{mglscript}{Gaston_surface}
+                       subplot 1 1 0 ''
+                       ranges -13 13 -40 40
+                       new a 200 200 '-x+(2*0.84*cosh(0.4*x)*sinh(0.4*x))/(0.4*((sqrt(0.84)*cosh(0.4*x))^2+(0.4*sin(sqrt(0.84)*y))))+0.5*sin(pi/2*x)'
+                       new b 200 200 '(2*sqrt(0.84)*cosh(0.45*x)*(-(sqrt(0.84)*sin(y)*cos(sqrt(0.84)*y))+cos(y)*sin(sqrt(0.84)*y)))/(0.4*((sqrt(0.84)*cosh(0.4*x))^2+2*(0.4*sin(sqrt(0.84)*x))^2))'
+                       new c 200 200 '(2*sqrt(0.84)*cosh(0.45*x)*(-(sqrt(0.84)*cos(y)*cos(sqrt(0.84)*y))-sin(y)*sin(sqrt(0.84)*y)))/(0.4*((sqrt(0.84)*cosh(0.4*x))^2+2*(0.4*sin(sqrt(0.84)*x))^2))'
+                       rotate 60 60
+                       light on
+                       xrange c : yrange b : zrange a : crange c
+                       surf c b a '#'; meshnum 100
+                       title 'Gaston surface'
+               \end{mglscript}
+               
+               \item[mglblock] It writes its contents verbatim to a file, specified as mandatory argument, and to the \LaTeX{} document.
+               
+               For example:
+               \begin{verbatim}
+                       \begin{mglblock}{fractal}
+                               list A [0,0,0,.16,0,0,.01] [.85,.04,-.04,.85,0,1.6,.85] [.2,-.26,.23,.22,0,1.6,.07] [-.15,.28,.26,.24,0,.44,.07]
+                               ifs2d f A 100000
+                               subplot 2 1 0 '<_' : title 'A fractal fern'
+                               ranges f(0) f(1) : axis
+                               plot f(0) f(1) 'G#o '; size 0.05
+                               
+                               subplot 2 1 1 '<_' : title 'Bifurcation plot'
+                               ranges 0 4 0 1 : axis
+                               bifurcation 0.005 'x*y*(1-y)' 'R'
+                       \end{mglblock}
+               \end{verbatim}
+\begin{mglblock}{fractal}
+list A [0,0,0,.16,0,0,.01] [.85,.04,-.04,.85,0,1.6,.85] [.2,-.26,.23,.22,0,1.6,.07] [-.15,.28,.26,.24,0,.44,.07]
+ifs2d f A 100000
+subplot 2 1 0 '<_' : title 'A fractal fern'
+ranges f(0) f(1) : axis
+plot f(0) f(1) 'G#o '; size 0.05
+
+subplot 2 1 1 '<_' : title 'Bifurcation plot'
+ranges 0 4 0 1 : axis
+bifurcation 0.005 'x*y*(1-y)' 'R'
 \end{mglblock}
-\begin{figure}[!ht]
-  \centering
-  \mglgraphics[scale=0.5]{Axis_projection}
-  \caption{The image from Axis\_projection.mgl script}
-\end{figure}
-
-Finally, you can just show MGL script itself
-\begin{verbatim}
-\begin{mglverbatim}
-  ranges 0 1 0 1 0 1
-  new x 50 '0.25*(1+cos(2*pi*x))'
-  new y 50 '0.25*(1+sin(2*pi*x))'
-  new z 50 'x'
-  new a 20 30 '30*x*y*(1-x-y)^2*(x+y<1)'
-  new rx 10 'rnd':new ry 10:fill ry '(1-v)*rnd' rx
-  light on
-  
-  title 'Projection sample':ternary 4:rotate 50 60
-  box:axis:grid
-  plot x y z 'r2':surf a '#'
-  xlabel 'X':ylabel 'Y':zlabel 'Z'
-\end{mglverbatim}
-\end{verbatim}
-
-\begin{mglverbatim}
-  ranges 0 1 0 1 0 1
-  new x 50 '0.25*(1+cos(2*pi*x))'
-  new y 50 '0.25*(1+sin(2*pi*x))'
-  new z 50 'x'
-  new a 20 30 '30*x*y*(1-x-y)^2*(x+y<1)'
-  new rx 10 'rnd':new ry 10:fill ry '(1-v)*rnd' rx
-  light on
-  
-  title 'Projection sample':ternary 4:rotate 50 60
-  box:axis:grid
-  plot x y z 'r2':surf a '#'
-  xlabel 'X':ylabel 'Y':zlabel 'Z'
-\end{mglverbatim}
-
-
-An example of usage of \texttt{\textbackslash{}mglplot} command would be:
-\begin{verbatim}
-\begin{mglsetup}
-  box '@{W9}' : axis
-\end{mglsetup}
-\begin{mglsetup}[2d]
-  box : axis
-  grid 'xy' ';k'
-\end{mglsetup}
-\begin{mglsetup}[3d]
-  rotate 50 60
-  box : axis : grid 'xyz' ';k'
-\end{mglsetup}
-\begin{figure}[!ht]
-  \centering
-  \mglplot[scale=0.5]{new a 200 'sin(pi*x)':plot a '2B'}
-\end{figure}
-\begin{figure}[!ht]
-  \centering
-  \mglplot[scale=0.5,settings=2d]{
-    fplot 'sin(pi*x)' '2B' :
-    fplot 'cos(pi*x^2)' '2R'
-  }
-\end{figure}
-\begin{figure}[!ht]
-  \centering
-  \mglplot[width=0.5 \textwidth, settings=3d]
-  {fsurf 'sin(pi*x)+cos(pi*y)'}
-\end{figure}
-\end{verbatim}
-
-\begin{mglsetup}{generic}
-  box '@{W9}' : axis
-\end{mglsetup}
-\begin{mglsetup}{2d}
-  box : axis
-  grid 'xy' ';k'
-\end{mglsetup}
-\begin{mglsetup}{3d}
-  rotate 50 60
-  box : axis : grid 'xyz' ';k'
-\end{mglsetup}
-\begin{figure}[!ht]
-  \centering
-  \mglplot[scale=0.5,setup=generic]{new a 200 'x' : fplot 'sin(pi*x)' '2R' : plot a '2B'}
-\end{figure}
-\begin{figure}[!ht]
-  \centering
-  \mglplot[scale=0.5,setup=2d]{%
-    fplot 'sin(pi*x)' '2B' :%
-    fplot 'cos(pi*x^2)' '2R'%
-  }
-\end{figure}
-\begin{figure}[!ht]
-  \centering
-  \mglplot[width=0.5\textwidth, setup=3d]{fsurf 'sin(pi*x)+cos(pi*y)'}
-\end{figure}
-
-As an additional feature, when an image is not found or cannot be included, instead of issuing an error, \texttt{mgltex} prints a box with the word \emph{'MGL image not found'} in the LaTeX document.
-\begin{figure}[!ht]
-  \centering
-  \mglgraphics{xyz}
-\end{figure}
-
-Let's display the content of the MGL file using \texttt{\textbackslash{}mglinclude} command:
-\mglinclude{Vectorial}
-
-The following commentary will be visible, since \mglTeX{} has been called with the \texttt{comments} option.
-\begin{verbatim}
-  \begin{mglcomment}
-    This is a visible commentary
-    that can have multiple lines
-  \end{mglcomment}
-\end{verbatim}
-The result is:
+               As you can see, although this is a verbatim-like environment, very long lines of code are split to fit the paragraph. Each line of code is numbered, this can be disabled with the \verb|lineno| option, like \verb|\begin{mglblock}[lineno=false]{fractal}|.
+               
+               \item[mglverbatim] This is like \verb|mglblock| environment, but it doesn't produce any script, just typesets the code to the \LaTeX{} document. It accepts the \verb|lineno| option, plus the \verb|label| option, in case you want to associate a name to the code.
+               
+               \item[mglcomment] This environment is used to embed comments in the document. You can control whether the contents of this environment are displayed or not, using the \verb|comments| and \verb|nocomments| package options, or the \verb|\mglcomments{on}| and \verb|mglcomments{off}| commands.
+               
+               An example of this would be:
+               \begin{verbatim}
+                       \begin{mglcomments}
+                               This comment will be shown because we used the "comments" package option for mglTeX
+                       \end{mglcomments}
+               \end{verbatim}
 \begin{mglcomment}
-  This is a visible commentary
-  that can have multiple lines
+This comment will be shown because we used the "comments" package option for mglTeX
 \end{mglcomment}
-
-The following commentary won't be visible, since it is wrapped by \texttt{\textbackslash{}mglnocomments\{off\}} and \texttt{\textbackslash{}mglcomments\{on\}}.
-\begin{verbatim}
-  \mglcomments{off}
-  \begin{mglcomment}
-    This is an invisible commentary
-    that can have multiple lines
-  \end{mglcomment}
-  \mglcomments{on}
-\end{verbatim}
-\mglcomments{off}
-\begin{mglcomment}
-  This is an invisible commentary
-  that can have multiple lines
-\end{mglcomment}
-\mglcomments{on}
-
-The last example is the use of the \texttt{\textbackslash{}mglswitch\{on\}} and \texttt{\textbackslash{}mglswitch\{off\}} commands. For example, the following image won't be generated:
-\begin{verbatim}
-  \mglswitch{off}
-  \begin{figure}[!ht]
-    \centering
-    \begin{mgl}
-      box : axis
-      fplot 'sin(pi*x)' '2B'
-    \end{mgl}
-  \end{figure}
-  \mglswitch{on}
-\end{verbatim}
-The result is:
-\mglswitch{off}
-\begin{figure}[!ht]
-  \centering
-  \begin{mgl}
-    box : axis
-    fplot 'sin(pi*x)' '2B'
-  \end{mgl}
-\end{figure}
-\mglswitch{on}
+               Once again, long lines are broke down to fit the paragraph.
+       \end{description}
+       
+       \section{Basics on commands}
+       \begin{description}
+               \item[\textbackslash mglgraphics] This command takes the name of an external MGL script, compiles it, and includes the resulting image. It accespt the same optional arguments as the \verb|mgl| environment, except for \verb|label|, plus a \verb|path| option, which can be used to specify the location of the script. This is useful when you have a script outside of the \LaTeX{} document (sent by a colleague for example), but you don't want to transcript it to your document.
+               
+               For example, in order to display the image of the script we created with \verb|mglscript| environment, we write:
+               \begin{verbatim}
+                       \begin{figure}[!ht]
+                         \centering
+                         \mglgraphics[height=9cm,width=9cm]{Gaston_surface}
+                         \caption{Gaston's surface}
+                       \end{figure}
+               \end{verbatim}
+               \begin{figure}[!ht]
+                       \centering
+                       \mglgraphics[height=9cm,width=9cm]{Gaston_surface}
+                       \caption{Gaston's surface: Three-dimensional parametric surface}
+               \end{figure}
+               
+               We could also could compile the script we created with the \verb|mglblock| environment:
+               \begin{verbatim}
+                       \begin{figure}[!ht]
+                         \centering
+                         \mglgraphics[height=7cm,width=10cm]{fractal}
+                         \caption{Examples of fractal behavior}
+                       \end{figure}
+               \end{verbatim}
+               \begin{figure}[!ht]
+                       \centering
+                       \mglgraphics[height=7cm,width=10cm]{fractal}
+                       \caption{Examples of fractal behavior}
+               \end{figure}
+               
+               \item[\textbackslash mglinclude] This is equivalent to the \verb|mglblock| environment, but works for external scripts.
+               
+               \item[\textbackslash mglplot] This command allows the fast creation of plots. It takes one mandatory argument, which is a block of MGL code to produce the plot. Accepts the same optional arguments as the \verb|mgl| environment, plus an additional one, \verb|setup|, that can be used to specify a block of code to append, defined inside a \verb|mglsetup| environment (see the example below).
+               
+               The \verb|mglsetup| environment can be used if many plots will have the same settings (background color, etc.). Instead of writing the same code over and over again, it can be introduced in that environment, and used with the \verb|\mglplot| command.
+               
+               An example of use of the \verb|mglsetup| environment and the \verb|\mglplot| command would be:
+               \begin{verbatim}
+                       \begin{mglsetup}{3d}
+                         clf 'W'
+                         rotate 50 60
+                         light on
+                         box : axis : grid 'xyz' ';k'
+                       \end{mglsetup}
+                       \begin{figure}[!ht]
+                         \centering
+                         \mglplot[setup=3d,scale=0.5]{fsurf 'cos(4*pi*hypot(x,y))*exp(-abs(x+y))'}
+                       \end{figure}
+                       \begin{figure}[!ht]
+                         \centering
+                         \mglplot[setup=3d,scale=0.5]{fsurf 'sin(pi*(x+y))'}
+                       \end{figure}
+               \end{verbatim}
+               \begin{mglsetup}{3d}
+                       clf 'W'
+                       rotate 50 60
+                       light on : light 0 0 1 0 'w' 0.25
+                       box : axis : grid 'xyz' ';k'
+               \end{mglsetup}
+               \begin{figure}[!ht]
+                       \centering
+                       \mglplot[setup=3d,scale=0.5]{fsurf 'cos(4*pi*hypot(x,y))*exp(-abs(x+y))'}
+               \end{figure}
+               \begin{figure}[!ht]
+                       \centering
+                       \mglplot[setup=3d,scale=0.5]{fsurf 'sin(pi*(x+y))'}
+               \end{figure}
+       \end{description}
+       
+       There are more environments and commands defined by \mglTeX{}. The ones presented here are the most basic. More on this topic can be found in the documentation.
 \end{document}
\ No newline at end of file
index 0470c22ae657c4759a22ecd652c463f555a1341d..00089c1234e76b5309db0460ea9c7d8259095988 100644 (file)
@@ -2,27 +2,28 @@ set(mgl_src
        addon.cpp axis.cpp base_cf.cpp base.cpp canvas_cf.cpp canvas.cpp cont.cpp crust.cpp
        complex.cpp complex_ex.cpp complex_io.cpp fft.cpp data_gr.cpp
        data.cpp data_io.cpp data_ex.cpp data_png.cpp
-       export_2d.cpp export_3d.cpp eval.cpp evalp.cpp exec.cpp export.cpp
-       fit.cpp font.cpp obj.cpp other.cpp parser.cpp pde.cpp pixel.cpp
-       plot.cpp prim.cpp surf.cpp tex_table.cc vect.cpp volume.cpp evalc.cpp
-       s_hull/s_hull_pro.cpp window.cpp
+       export_2d.cpp export_3d.cpp eval.cpp evalp.cpp export.cpp
+       fit.cpp font.cpp obj.cpp other.cpp parser.cpp pde.cpp pixel.cpp pixel_gen.cpp
+       plot.cpp prim.cpp surf.cpp vect.cpp volume.cpp evalc.cpp
+       s_hull/s_hull_pro.cpp window.cpp fractal.cpp
+       exec_dat.cpp exec_gr.cpp exec_set.cpp exec_prm.cpp
 )
 
 set(mgl_hdr
        ../include/mgl2/base_cf.h       ../include/mgl2/fit.h           ../include/mgl2/plot.h
        ../include/mgl2/base.h          ../include/mgl2/prim.h          ../include/mgl2/canvas_cf.h
        ../include/mgl2/font.h          ../include/mgl2/canvas.h        ../include/mgl2/surf.h
-       ../include/mgl2/mgl_cf.h        ../include/mgl2/type.h          ${MathGL_BINARY_DIR}/include/mgl2/config.h
-${MathGL_BINARY_DIR}/include/mgl2/dllexport.h  cont.hpp
+       ../include/mgl2/mgl_cf.h        ../include/mgl2/type.h          ${MathGL2_BINARY_DIR}/include/mgl2/config.h
+${MathGL2_BINARY_DIR}/include/mgl2/dllexport.h cont.hpp
        ../include/mgl2/cont.h          ../include/mgl2/mgl.h           ../include/mgl2/vect.h
        ../include/mgl2/data.h          ../include/mgl2/volume.h        ../include/mgl2/data_cf.h
        ../include/mgl2/define.h        ../include/mgl2/other.h         ../include/mgl2/eval.h
        ../include/mgl2/parser.h        ../include/mgl2/addon.h         ../include/mgl2/evalc.h
        s_hull/s_hull_pro.h                     ../include/mgl2/wnd.h           ../include/mgl2/canvas_wnd.h
        ../include/mgl2/thread.h        ../include/mgl2/abstract.h      ../include/mgl2/pde.h
+#      tex_table.cc     def_font.cc
 )
 
-add_definitions(-DMGL_SRC)
 if(MGL_HAVE_GSL2)
        add_definitions(-DMGL_HAVE_GSL2)
 endif(MGL_HAVE_GSL2)
@@ -42,77 +43,19 @@ if(MGL_HAVE_OPENGL)
 endif(MGL_HAVE_OPENGL)
 
 include(GenerateExportHeader)
-add_compiler_export_flags()
 mgl_add_lib(mgl ${mgl_src} ${mgl_hdr})
 generate_export_header(mgl EXPORT_FILE_NAME ../include/mgl2/dllexport.h)
 
-# if(MGL_HAVE_LTDL)
-#      target_link_libraries(mgl ${LTDL_LIB})
-#      include_directories(${LTDL_INCLUDE_DIR})
-# endif(MGL_HAVE_LTDL)
+target_link_libraries(mgl ${MGL_DEP_LIBS})
+target_link_libraries(mgl-static ${MGL_DEP_LIBS})
 
-if(MGL_HAVE_PDF)
-       include_directories(${HPDF_INCLUDE_DIR})
-       target_link_libraries(mgl ${HPDF_LIB})
-endif(MGL_HAVE_PDF)
-
-if(MGL_HAVE_PTHREAD)
-       target_link_libraries(mgl ${CMAKE_THREAD_LIBS_INIT})
-endif(MGL_HAVE_PTHREAD)
-
-if(MGL_HAVE_JPEG)
-       target_link_libraries(mgl ${JPEG_LIBRARIES})
-       include_directories(${JPEG_INCLUDE_DIR})
-endif(MGL_HAVE_JPEG)
-
-if(MGL_HAVE_GIF)
-       target_link_libraries(mgl ${GIF_LIBRARIES})
-       include_directories(${GIF_INCLUDE_DIR})
-endif(MGL_HAVE_GIF)
-
-if(MGL_HAVE_HDF5)
-       target_link_libraries(mgl ${HDF5_LIBRARIES} ${HDF5_C_SHARED_LIBRARY})
-       include_directories(${HDF5_INCLUDE_DIR})
-endif(MGL_HAVE_HDF5)
-
-if(MGL_HAVE_HDF4)
-       target_link_libraries(mgl ${HDF4MF_LIB} ${HDF4_LIB})
-       include_directories(${HDF4_INCLUDE_DIR})
-endif(MGL_HAVE_HDF4)
-
-if(MGL_HAVE_LTDL)
-       target_link_libraries(mgl ${LTDL_LIB} )
-       include_directories(${LTDL_INCLUDE_DIR})
-endif(MGL_HAVE_LTDL)
-
-if(MGL_HAVE_GSL)
-       target_link_libraries(mgl ${GSL_LIB} ${GSL_CBLAS_LIB} )
-       include_directories(${GSL_INCLUDE_DIR})
-endif(MGL_HAVE_GSL)
-
-if(MGL_HAVE_OPENGL)
-       target_link_libraries(mgl ${OPENGL_LIBRARIES} )
-       include_directories(${OPENGL_INCLUDE_DIR} )
-endif(MGL_HAVE_OPENGL)
-
-if(MGL_HAVE_PNG)
-       target_link_libraries(mgl ${PNG_LIBRARIES} )
-       include_directories(${PNG_INCLUDE_DIR})
-endif(MGL_HAVE_PNG)
-
-if(MGL_HAVE_ZLIB)
-       target_link_libraries(mgl ${ZLIB_LIBRARIES} )
-       include_directories(${ZLIB_INCLUDE_DIR})
-endif(MGL_HAVE_ZLIB)
-
-if(M_LIB)
-       target_link_libraries(mgl ${M_LIB})
-endif(M_LIB)
+mgl_po_src(${mgl_src} ${mgl_hdr})
 
 if(MGL_HAVE_MPI)
        mgl_add_lib(mpi mpi.cpp ../include/mgl2/mpi.h)
        target_link_libraries(mgl-mpi ${MPI_LIBRARIES} )
+       target_link_libraries(mgl-mpi-static ${MPI_LIBRARIES} )
        target_include_directories(mgl-mpi SYSTEM PUBLIC ${MPI_CXX_INCLUDE_PATH})
 endif(MGL_HAVE_MPI)
 
-install(FILES ${MathGL_BINARY_DIR}/include/mgl2/dllexport.h DESTINATION ${MGL_INCLUDE_PATH})
+install(FILES ${MathGL2_BINARY_DIR}/include/mgl2/dllexport.h DESTINATION ${MGL_INCLUDE_PATH})
index 9e9b8c950347d8ae6764236dc45dc6f19a8f7e9c..82d231cab4aeced1a346c8229f26ef54bc5b882f 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************
  * addon.cpp is part of Math Graphic Library
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   it under the terms of the GNU Library General Public License as       *
@@ -95,6 +95,7 @@ void MGL_EXPORT mgl_fgetpar(FILE *fp, const char *str, ...)
                }
                if(str[i]<=' ') t = mgl_fgetstr(fp);
        }
+       va_end(lst);
 }
 //-----------------------------------------------------------------------------
 int MGL_EXPORT_CONST mgl_istrue(char ch)
@@ -107,7 +108,7 @@ void MGL_EXPORT mgl_test(const char *str, ...)
        va_start(lst,str);
        vsnprintf(buf,256,str,lst);     buf[255]=0;
        va_end(lst);
-       printf("TEST: %s\n",buf);
+       printf(_("TEST: %s\n"),buf);
        fflush(stdout);
 }
 //-----------------------------------------------------------------------------
@@ -171,6 +172,7 @@ void MGL_EXPORT mgl_difr_grid_old(dual *a,int n,int step,dual q,int Border,dual
                memcpy(b,d,n*sizeof(dual));
                switch(Border)
                {
+                       default:
                        case 0:         // zero at border
                                b[0] = 0;       b[n-1] = 0;             break;
                        case 1:         // constant at border
@@ -204,7 +206,7 @@ void MGL_EXPORT mgl_difr_axial(dual *a,int n,int step,dual q,int Border,dual *tm
 void MGL_EXPORT mgl_difr_axial_old(dual *a,int n,int step,dual q,int Border,dual *b,dual *d,int kk, double di)
 {
        int ii = di<0 ? -int(floor(di)) : 0;
-       register mreal ff= di==floor(di) ? 4. : 2.;
+       mreal ff= di==floor(di) ? 4. : 2.;
        const dual adt = dual(0.,1.)*q;
        if(step==1)     memcpy(b,a,n*sizeof(dual));
        else    for(long i=0;i<n;i++)   b[i] = a[i*step];
@@ -213,9 +215,9 @@ void MGL_EXPORT mgl_difr_axial_old(dual *a,int n,int step,dual q,int Border,dual
                d[ii] = a[ii] + adt*(b[ii+1]-b[ii])*(ff/k);
                for(long i=ii+1;i<n-1;i++)
                {
-                       register mreal dd = i+di;
+                       mreal dd = i+di;
                        dd = 1./(sqrt(dd*dd+1.)+dd);    // corrections for "axiality"
-                       register mreal gg = 1+dd*dd;
+                       mreal gg = 1+dd*dd;
                        d[i] = a[i*step] + adt*( b[i-1]*((gg-dd)/k) - b[i]*(2*gg/k) + b[i+1]*((gg+dd)/k) );
                }
                memcpy(b,d,n*sizeof(dual));
index 36164ee3a182ccbb382ad46160cbf81f82b22d66..8b8a1107f2f9626bb2c0ee5ed552549f99dfbe34 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************
  * axis.cpp is part of Math Graphic Library
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   it under the terms of the GNU Library General Public License as       *
@@ -32,13 +32,14 @@ MGL_NO_EXPORT inline struct tm *mgl_localtime (const time_t *clock, tm *result,
 //-----------------------------------------------------------------------------
 long MGL_EXPORT mgl_have_color(const char *stl)
 {
-       long j=0;
-       if(stl) for(long i=0;stl[i];i++)
-       {
-               if(strchr(MGL_COLORS,stl[i]))   j++;
-               if(stl[i]=='{' && stl[i+1]=='x')        j++;
-       }
-       return j;
+       return mgl_get_num_color(stl,0);
+//     long j=0;
+//     if(stl) for(long i=0;stl[i];i++)
+//     {
+//             if(strchr(MGL_COLORS,stl[i]))   j++;
+//             if(stl[i]=='{' && stl[i+1]=='x')        j++;
+//     }
+//     return j;
 }
 //-----------------------------------------------------------------------------
 void MGL_EXPORT mgl_wcstrim(wchar_t *str)
@@ -47,27 +48,20 @@ void MGL_EXPORT mgl_wcstrim(wchar_t *str)
        size_t n=mgl_wcslen(str), k, i;
        for(k=0;k<n;k++)        if(str[k]>' ')  break;
        for(i=n;i>k;i--)        if(str[i-1]>' ')        break;
-       memmove(str, str+k, (i-k)*sizeof(wchar_t));
+       for(size_t j=0;j<i-k;j++)       str[j]=str[j+k];
        str[i-k]=0;
 }
 //-----------------------------------------------------------------------------
-size_t MGL_EXPORT mgl_wcslen(const wchar_t *str)
-{
-       long i=0;
-       if(str) while(str[i])   i++;
-       return i;
-}
-//-----------------------------------------------------------------------------
 //             Ticks setup
 //-----------------------------------------------------------------------------
 void mglCanvas::SetAxisStl(const char *stl, const char *tck, const char *sub)
 {
-       if(!stl || !(*stl))     strncpy(AxisStl,"k",32);
-       else                            strncpy(AxisStl,stl,32);
-       if(!tck || !(*tck))     strncpy(TickStl,AxisStl,32);
-       else                            strncpy(TickStl,tck,32);
-       if(!sub || !(*sub))     strncpy(SubTStl,TickStl,32);
-       else                            strncpy(SubTStl,sub,32);
+       if(!stl || !(*stl))     mgl_strncpy(AxisStl,"k",32);
+       else                            mgl_strncpy(AxisStl,stl,32);
+       if(!tck || !(*tck))     mgl_strncpy(TickStl,AxisStl,32);
+       else                            mgl_strncpy(TickStl,tck,32);
+       if(!sub || !(*sub))     mgl_strncpy(SubTStl,TickStl,32);
+       else                            mgl_strncpy(SubTStl,sub,32);
 }
 //-----------------------------------------------------------------------------
 void mglCanvas::SetTickLen(mreal tlen, mreal stt)
@@ -110,8 +104,8 @@ void mglCanvas::SetTicksVal(char dir, HCDT v, const wchar_t *lbl, bool add)
        else    aa.txt.clear();
        if(!v || !lbl || !lbl[0])       {       aa.f = 0;       return; }
        aa.f = 2;       aa.ns=0;        aa.ds=0;
-       register long i,j,l=0,n=v->GetNx();
-       for(i=j=l=0;i<n && lbl[j];j++)
+       long i=0,l=0,n=v->GetNx();
+       for(long j=0;i<n && lbl[j];j++)
        {
                if(lbl[j]=='\n')
                {
@@ -132,8 +126,8 @@ void mglCanvas::SetTicksVal(char dir, HCDT v, const char *lbl, bool add)
 //-----------------------------------------------------------------------------
 void mglCanvas::SetTicksVal(char dir, const wchar_t *lbl, bool add)
 {
-       register long i,j,len=mgl_wcslen(lbl);
-       for(i=0,j=1;j<len;j++)
+       long i=0,len=mgl_wcslen(lbl);
+       for(long j=1;j<len;j++)
                if(lbl[j]=='\n' || (lbl[j]=='n' && lbl[j-1]=='\\'))     i++;
        if(i>63)        i=63;
        mglData val(i+1);       val.Fill(Min.x,Max.x);
@@ -142,8 +136,8 @@ void mglCanvas::SetTicksVal(char dir, const wchar_t *lbl, bool add)
 //-----------------------------------------------------------------------------
 void mglCanvas::SetTicksVal(char dir, const char *lbl, bool add)
 {
-       register long i,j,len=strlen(lbl);
-       for(i=0,j=1;j<len;j++)
+       long i=0,len=strlen(lbl);
+       for(long j=1;j<len;j++)
                if(lbl[j]=='\n' || (lbl[j]=='n' && lbl[j-1]=='\\'))     i++;
        if(i>63)        i=63;
        mglData val(i+1);       val.Fill(Min.x,Max.x);
@@ -160,8 +154,8 @@ void mglCanvas::SetTicksVal(char dir, HCDT v, const wchar_t **lbl, bool add)
        else    aa.txt.clear();
        if(!v || !lbl)  {       aa.f = 0;       return; }
        aa.f = 2;       aa.ns=0;        aa.ds=0;
-       register long i,n=v->GetNx();
-       for(i=0;i<n;i++)        aa.AddLabel(lbl[i],v->v(i));
+       long n=v->GetNx();
+       for(long i=0;i<n;i++)   aa.AddLabel(lbl[i],v->v(i));
 }
 //-----------------------------------------------------------------------------
 void mglCanvas::SetTicksVal(char dir, HCDT v, const char **lbl, bool add)
@@ -216,8 +210,8 @@ void mglCanvas::SetTickTime(char dir, mreal d, const char *t)
        UpdateAxis();
 
        time_t tt;      tm t1,t2;
-       tt=aa.v1;       mgl_localtime(&tt, &t1, get(MGL_USE_GMTIME));
-       tt=aa.v2;       mgl_localtime(&tt, &t2, get(MGL_USE_GMTIME));
+       tt=(time_t)aa.v1;       mgl_localtime(&tt, &t1, get(MGL_USE_GMTIME));
+       tt=(time_t)aa.v2;       mgl_localtime(&tt, &t2, get(MGL_USE_GMTIME));
        if(aa.v1<aa.v2) // adjust periodic values
        {
                if(abs(t1.tm_year-t2.tm_year)==1)       t2.tm_yday += 365;
@@ -237,26 +231,32 @@ void mglCanvas::SetTickTime(char dir, mreal d, const char *t)
                t = abs(t1.tm_yday-t2.tm_yday)>1 ? "%x" : "%X";
                if(abs(t1.tm_year-t2.tm_year)>3)        t = "%Y";
        }
-       if(d==0)        // try to select opimal step
+       mreal ds=0;
+       if(d==0)        // try to select optimal step
        {
-               // TODO add subticks for drawing
-               if(abs(t1.tm_year-t2.tm_year)>1)
-                       d = 365.25*24*3600*mgl_adj_val(abs(t1.tm_year-t2.tm_year));     // number of second in year NOTE: improve it
+               if(abs(t1.tm_year-t2.tm_year)>1)        // number of second in year NOTE: improve it
+               {       d = 365.25*24*3600*mgl_adj_val(abs(t1.tm_year-t2.tm_year),&ds);
+                       ds *= 365.25*24*3600;   }
                // NOTE here should be months ... but it is too unregular ... so omit it now
 //             else if(t1.tm_mon!=t2.tm_mon)   d = 30*24*3600; // number of second in month
+               else if(abs(t1.tm_yday-t2.tm_yday)>=14) // number of second in week 
+               {       d = mgl_adj_val(abs(t1.tm_yday-t2.tm_yday)/7,&ds);
+                       ds = ((ds<1)?1./7:ds)*7*24*3600;        d = ((d>=1)?d:1)*7*24*3600;     }
                else if(abs(t1.tm_yday-t2.tm_yday)>1)   // localtime("%x") cannot print time < 1 day
-               {       d = 24*3600.*mgl_adj_val(abs(t1.tm_yday-t2.tm_yday));   d = d>24*3600?d:24*3600;        }
+               {       d = 24*3600.*mgl_adj_val(abs(t1.tm_yday-t2.tm_yday),&ds);
+                       ds *= 24*3600;  if(d<24*3600)   {       d=24*3600;      ds=d/2;}        }
                else if(abs(t1.tm_hour-t2.tm_hour)>1)
-                       d = 3600.*mgl_adj_val(abs(t1.tm_hour-t2.tm_hour));
+               {       d = 3600.*mgl_adj_val(abs(t1.tm_hour-t2.tm_hour),&ds);  ds *=3600;      }
                else if(abs(t1.tm_min-t2.tm_min)>1)
-                       d = 60*mgl_adj_val(abs(t1.tm_min-t2.tm_min));
+               {       d = 60*mgl_adj_val(abs(t1.tm_min-t2.tm_min),&ds);       ds *=60;        }
                else if(abs(t1.tm_sec-t2.tm_sec)>1)     // localtime("%X") cannot print time < 1 sec
-               {       d = mgl_adj_val(abs(t1.tm_sec-t2.tm_sec));      d = d>1?d:1;    }
+               {       d = mgl_adj_val(abs(t1.tm_sec-t2.tm_sec),&ds);
+                       if(d<1) {       d=1;    ds=0.5;}        }
                else    // adjust msec. NOTE: this is not supported by localtime() !!!
-                       d = mgl_adj_val(fabs(aa.v2-aa.v1));
+                       d = mgl_adj_val(fabs(aa.v2-aa.v1),&ds);
        }
 
-       aa.ds = 0;      aa.dv = d;      aa.f = 1;       aa.txt.clear();
+       aa.ds = ds;     aa.dv = d;      aa.f = 1;       aa.txt.clear();
        MGL_TO_WCS(t,aa.t=wcs);
 
        if(strchr("xyztuvw",aa.ch))
@@ -273,7 +273,7 @@ void mglCanvas::SetTickTime(char dir, mreal d, const char *t)
        if(v0+aa.dv!=v0 && v1+aa.dv!=v1)        for(v=v0;v<=v1;v+=aa.dv)
        {
                wchar_t buf[64];
-               tt = v; tm tp;          mgl_localtime(&tt, &tp, get(MGL_USE_GMTIME));
+               tt = (time_t)v; tm tp;          mgl_localtime(&tt, &tp, get(MGL_USE_GMTIME));
                wcsftime(buf,64,aa.t.c_str(),&tp);      aa.AddLabel(buf,v);
        }
 }
@@ -305,7 +305,7 @@ void mglCanvas::AdjustTicks(mglAxis &aa, bool ff)
        else
        {
                d /= -aa.d;
-               long n = floor(log10(d));
+               long n = lrint(floor(log10(d)));
                aa.dv = pow(10.,n)*mgl_int(d*pow(10.,-n));
                aa.o=0; aa.ds = pow(10.,n);
        }
@@ -463,7 +463,8 @@ void mglCanvas::LabelTicks(mglAxis &aa)
 //-----------------------------------------------------------------------------
 void mglCanvas::Axis(const char *dir, const char *stl, const char *opt)
 {
-       bool text = !(mglchr(dir,'_') || mglchr(dir,'~'));
+       int text = !(mglchr(dir,'_') || mglchr(dir,'~'))?1:0;
+       if(mglchr(dir,':'))     text = text|2;
        bool inv = mglchr(dir,'^');
        bool ret = get(MGL_ENABLE_RTEXT);
        if(mglchr(dir,'U'))     clr(MGL_ENABLE_RTEXT);
@@ -503,7 +504,7 @@ void mglCanvas::Axis(const char *dir, const char *stl, const char *opt)
        set(ret, MGL_ENABLE_RTEXT);
 }
 //-----------------------------------------------------------------------------
-void mglCanvas::DrawAxis(mglAxis &aa, bool text, char arr,const char *stl,mreal angl)
+void mglCanvas::DrawAxis(mglAxis &aa, int text, char arr,const char *stl,mreal angl)
 {
        aa.angl = angl;
        if(strchr("xyz",aa.ch))
@@ -518,11 +519,23 @@ void mglCanvas::DrawAxis(mglAxis &aa, bool text, char arr,const char *stl,mreal
        dv.Set(mgl_sign(av.x-o.x), mgl_sign(av.y-o.y), mgl_sign(av.z-o.z));
        da = aa.a*(dv*aa.a);    db = aa.b*(dv*aa.b);
 
+       static int cgid=1;      StartGroup("Axis",cgid++);
+
        long k1,k2;
        bool have_color=mgl_have_color(stl);
        bool dif_color = !have_color && aa.dv==0 && strcmp(TickStl,SubTStl);
+       if(text&2)      // line throw point (0,0,0)
+       {
+               SetPenPal("k:");
+               p = d*aa.v1;    k1 = AddPnt(&B, p,CDef,q,-1,3);
+               for(long i=1;i<31;i++)
+               {
+                       p = d*(aa.v1+(aa.v2-aa.v1)*i/30.);
+                       k2 = k1;        k1 = AddPnt(&B, p,CDef,q,-1,3);
+                       line_plot(k2,k1);
+               }
+       }
        SetPenPal(have_color ? stl:AxisStl);
-       static int cgid=1;      StartGroup("Axis",cgid++);
 
        p = o + d*aa.v1;        k1 = AddPnt(&B, p,CDef,q,-1,3);
        for(long i=1;i<31;i++)  // axis itself
@@ -564,7 +577,7 @@ void mglCanvas::DrawAxis(mglAxis &aa, bool text, char arr,const char *stl,mreal
                }
        }
        if(!have_color) SetPenPal(AxisStl);
-       if(text)        DrawLabels(aa);
+       if(text&1)      DrawLabels(aa);
        EndGroup();
 }
 //-----------------------------------------------------------------------------
@@ -584,7 +597,7 @@ void mglCanvas::DrawLabels(mglAxis &aa, bool inv, const mglMatrix *M)
        if(aa.ch=='c')  a = aa.a;
 
        long n = aa.txt.size();
-       mreal *w=new mreal[n];
+       mreal *w=new mreal[n], wsp = 2*TextWidth(" ",FontDef,-1);
        long *kk=new long[n];
        for(long i=0;i<n;i++)   // fill base label properties
        {
@@ -599,7 +612,7 @@ void mglCanvas::DrawLabels(mglAxis &aa, bool inv, const mglMatrix *M)
                        continue;
                if(kk[i]<0 || kk[i+1]<0)        continue;
                mreal v = (GetPntP(kk[i+1])-GetPntP(kk[i])).norm();     // distance between ticks
-               mreal vv = (w[i]+w[i+1])/2;     // length of labels
+               mreal vv = (w[i]+w[i+1])/2-wsp; // length of labels
                if(v>0 && l < vv/v)     l = vv/v;
                if(c>v) c = v;
        }
@@ -614,10 +627,10 @@ void mglCanvas::DrawLabels(mglAxis &aa, bool inv, const mglMatrix *M)
                mreal t2 = r2*1.21>1 ? asin((l*sqrt(r2-1/1.21)+h/1.1)/r2):M_PI/2;
                tet = t1<t2 ? t1:t2;
        }
-       mreal sn = sin(tet);
+       mreal sn = sin(tet), cs=cos(tet);
        if(sn)
        {
-               mreal l1=h/fabs(sn), l2=fabs(l*cos(tet)+h*sn);
+               mreal l1=h/fabs(sn), l2=fabs(l*cs+h*sn);
                l = l2>l1?l1:l2;
        }
        char *align=new char[n], *up=new char[n];
@@ -626,13 +639,16 @@ void mglCanvas::DrawLabels(mglAxis &aa, bool inv, const mglMatrix *M)
                mglPoint p(a),r(o+d*aa.txt[i].val);
                ScalePoint(M, r, p, false);
                mglPnt &pp = Pnt[kk[i]];
-               mreal ux=pp.u*cos(tet) + pp.v*sin(tet), uy=pp.v*cos(tet) - pp.u*sin(tet);
-               bool algn = tet!=0;
-               if(!get(MGL_ENABLE_RTEXT) || !get(MGL_TICKS_ROTATE))    {       ux=1;   uy=0;   algn=true;      }
+               mreal ux=pp.u*cs + pp.v*sn, uy=pp.v*cs - pp.u*sn;
+               bool Nrot = !get(MGL_ENABLE_RTEXT) || !get(MGL_TICKS_ROTATE);
+               bool Vcnt = ux==0 && uy!=0 && Nrot;
+               bool algn = tet!=0;             // TODO add proper align for arbitrary tet!
+               if(ux*ux+uy*uy!=0 && Nrot)      {       ux=1;   uy=0;   algn=true;      }
                if(ux<0 || (ux==0 && uy<0))     {       ux=-ux; uy=-uy; pp.w=-pp.w;     }
                pp.u = ux;      pp.v = uy;
                mreal pu = p.x*ux+p.y*uy, pv = p.y*ux-p.x*uy; /*, su = ps.x*ux+ps.y*uy;*/
-               if(aa.ch!='c')  up[i] = ((pv>0) ^ inv) ? 'T':'t';
+               if(Vcnt)        up[i]='V';
+               else if(aa.ch!='c')     up[i] = ((pv>0) ^ inv) ? 'T':'t';
                else            up[i]=(aa.ns==0 || aa.ns==3)?'t':'T';
                int t=0;
                if(algn)
@@ -848,8 +864,9 @@ void mglCanvas::Labelw(char dir, const wchar_t *text, mreal pos, const char *opt
        if(aa)
        {
                char font[64],ff[3]=":C";       memset(font,0,64);
-               if(pos<-0.2)    ff[1]='L';      if(pos>0.2)     ff[1]='R';
-               strncpy(font,FontDef,63);       strcat(font,ff);
+               if(pos<-0.2)    ff[1]='L';
+               if(pos>0.2)     ff[1]='R';
+               mgl_strncpy(font,FontDef,32);   strcat(font,ff);
                long kk = AddPnt(&B, p,-1,q,0,7);       ff[1]=0;
                if(kk>=0)
                {
@@ -857,7 +874,7 @@ void mglCanvas::Labelw(char dir, const wchar_t *text, mreal pos, const char *opt
                        if(pp.u<0 || (pp.u==0 && pp.v<0))
                        {       pp.u=-pp.u;     pp.v=-pp.v;     pp.w=-pp.w;     }
                        ff[0] = GetLabelPos(t, kk, *aa);        strcat(font,ff);
-                       text_plot(kk,text,font,-1.4,0.35+shift);
+                       text_plot(kk,text,font,-1.4,(ff[0]=='T'?0.3:0.35)+shift);
                }
        }
        LoadState();
@@ -874,25 +891,25 @@ void mglCanvas::Box(const char *col, bool ticks)
        if(TernAxis&1)
        {
                Org.x=Max.x;    Org.y=Min.y;    Org.z=Max.z;
-               DrawAxis(ax, false, 0,col);     DrawAxis(az, false, 0,col);
+               DrawAxis(ax, 0, 0,col); DrawAxis(az, 0, 0,col);
                Org.x=Min.x;    Org.y=Max.y;    Org.z=Max.z;
-               DrawAxis(az, false, 0,col);
+               DrawAxis(az, 0, 0,col);
 
                mglAxis ty(ay);                         ty.ch='T';
                ty.dir.Set(-1,1);       ty.org.Set(1,0,Max.z);
-               DrawAxis(ty, false, 0,col);     ty.ch='t';
+               DrawAxis(ty, 0, 0,col); ty.ch='t';
                ty.dir.Set(0,-1);       ty.org.Set(0,1,Max.z);
-               DrawAxis(ty, false, 0,col);
+               DrawAxis(ty, 0, 0,col);
        }
        else if(TernAxis&2)
        {
                mglAxis ty(az);
                ty.ch='T';      ty.a.Set(1,0);  ty.b.Set(-1,1);
                ty.dir.Set(-1,0,1);     ty.org.Set(1,0,0);
-               DrawAxis(ty, false, 0,col);
+               DrawAxis(ty, 0, 0,col);
                ty.ch='t';      ty.a.Set(0,1);  ty.b.Set(-1,1);
                ty.dir.Set(0,-1,1);     ty.org.Set(0,1,0);
-               DrawAxis(ty, false, 0,col);
+               DrawAxis(ty, 0, 0,col);
        }
        else
        {
@@ -931,14 +948,14 @@ void mglCanvas::Box(const char *col, bool ticks)
                        mreal dx = (Max.x-Min.x)/30, dy = (Max.y-Min.y)/30, dz = (Max.z-Min.z)/30;
                        for(long i=0;i<31;i++)  for(long j=0;j<31;j++)
                        {
-                               register long i0=3*(i+31*j);
+                               long i0=3*(i+31*j);
                                pos[i0]   = AddPnt(mglPoint(oo[im].x,Min.y+dy*i,Min.z+dz*j));
                                pos[i0+1] = AddPnt(mglPoint(Min.x+dx*i,oo[im].y,Min.z+dz*j));
                                pos[i0+2] = AddPnt(mglPoint(Min.x+dx*i,Min.y+dy*j,oo[im].z));
                        }
                        for(long i=0;i<30;i++)  for(long j=0;j<30;j++)
                        {
-                               register long i0=3*(i+31*j);
+                               long i0=3*(i+31*j);
                                quad_plot(pos[i0],pos[i0+3],pos[i0+93],pos[i0+96]);
                                quad_plot(pos[i0+1],pos[i0+4],pos[i0+94],pos[i0+97]);
                                quad_plot(pos[i0+2],pos[i0+5],pos[i0+95],pos[i0+98]);
@@ -1072,7 +1089,7 @@ void mglCanvas::colorbar(HCDT vv, const mreal *c, int where, mreal x, mreal y, m
                if(ac.t.empty())
                        for(long i=0;i<n;i++)
                        {
-                               register mreal d = vv->v(i);
+                               mreal d = vv->v(i);
                                ac.AddLabel(mgl_ftoa(d,ac.stl.c_str()),d);
                        }
                else
@@ -1080,7 +1097,7 @@ void mglCanvas::colorbar(HCDT vv, const mreal *c, int where, mreal x, mreal y, m
                        wchar_t buf[64];
                        for(long i=0;i<n;i++)
                        {
-                               register mreal d = vv->v(i);
+                               mreal d = vv->v(i);
                                mglprintf(buf,64,ac.t.c_str(),d);
                                ac.AddLabel(buf,d);
                        }
index a1821c756256832c95842424dceec0e4d23043c8..3107794564d84f1f16d69844870f48f8e472ae78 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * base.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
 #include "mgl2/font.h"\r
 #include "mgl2/base.h"\r
 #include "mgl2/eval.h"\r
+#if MGL_HAVE_OMP\r
+#include <omp.h>\r
+#endif\r
+\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_mutex_unlock(void *mutex)\r
+{\r
+#if MGL_HAVE_PTHREAD\r
+       pthread_mutex_unlock((pthread_mutex_t *)mutex);\r
+#elif MGL_HAVE_OMP\r
+       omp_unset_lock((omp_lock_t *)mutex);\r
+#endif\r
+}\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_mutex_lock(void *mutex)\r
+{\r
+#if MGL_HAVE_PTHREAD\r
+       pthread_mutex_lock((pthread_mutex_t *)mutex);\r
+#elif MGL_HAVE_OMP\r
+       omp_set_lock((omp_lock_t *)mutex);\r
+#endif\r
+}\r
 //-----------------------------------------------------------------------------\r
 char *mgl_strdup(const char *s)\r
 {\r
@@ -42,15 +64,15 @@ void MGL_EXPORT mgl_create_cpp_font(HMGL gr, const wchar_t *how)
        for(i=l=n=0;i<s.size();i++)\r
        {\r
                ch = f->Internal(s[i]);\r
-               l += 2*f->GetNl(0,ch);\r
-               n += 6*f->GetNt(0,ch);\r
+               if(ch>=0)       {       l += 2*f->GetNl(0,ch);  n += 6*f->GetNt(0,ch);  }\r
        }\r
-       printf("const long mgl_numg=%lu, mgl_cur=%lu;\n",(unsigned long)s.size(),l+n);\r
-       printf("float mgl_fact=%g;\n",f->GetFact(0)/mgl_fgen);\r
+       printf("const unsigned long mgl_numg=%lu, mgl_cur=%lu;\n",(unsigned long)s.size(),l+n);\r
+       printf("const float mgl_fact=%g;\n",f->GetFact(0)/mgl_fgen);\r
        printf("long mgl_gen_fnt[%lu][6] = {\n", (unsigned long)s.size());\r
        for(i=m=0;i<s.size();i++)       // first write symbols descriptions\r
        {\r
                ch = f->Internal(s[i]);\r
+               if(ch<0)        continue;\r
                int m1 = f->GetNl(0,ch), m2 = f->GetNt(0,ch);\r
                printf("\t{0x%x,%d,%d,%lu,%d,%lu},\n",unsigned(s[i]),f->GetWidth(0,ch),m1,m,m2,m+2*m1);\r
                m += 2*m1+6*m2;\r
@@ -60,6 +82,7 @@ void MGL_EXPORT mgl_create_cpp_font(HMGL gr, const wchar_t *how)
        for(i=0;i<s.size();i++)         // now write data itself\r
        {\r
                ch = f->Internal(s[i]);\r
+               if(ch<0)        continue;\r
                unsigned m1 = f->GetNl(0,ch), m2 = f->GetNt(0,ch);\r
                const short *ln = f->GetLn(0,ch), *tr = f->GetTr(0,ch);\r
                for(l=0;l<2*m1;l++)     printf("%d,",ln[l]);\r
@@ -82,8 +105,8 @@ void MGL_EXPORT mgl_strtrim(char *str)
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_strlwr(char *str)\r
 {\r
-       register size_t k,l=strlen(str);\r
-       for(k=0;k<l;k++)\r
+       size_t l=strlen(str);\r
+       for(size_t k=0;k<l;k++)\r
                str[k] = (str[k]>='A' && str[k]<='Z') ? str[k]+'a'-'A' : str[k];\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -105,13 +128,16 @@ mglBase::mglBase()
        pthread_mutex_init(&mutexClf,0);\r
        Pnt.set_mutex(&mutexClf);\r
        Prm.set_mutex(&mutexClf);\r
-       Txt.set_mutex(&mutexClf);\r
+//     Txt.set_mutex(&mutexClf);\r
 #endif\r
 #if MGL_HAVE_OMP\r
-       omp_init_lock(&lockClf);\r
-       Pnt.set_mutex(&lockClf);\r
-       Prm.set_mutex(&lockClf);\r
-       Txt.set_mutex(&lockClf);\r
+       lockClf = new omp_lock_t;\r
+       omp_init_lock((omp_lock_t*)lockClf);\r
+       Pnt.set_mutex(lockClf);\r
+       Prm.set_mutex(lockClf);\r
+//     Txt.set_mutex(&lockClf);\r
+#else\r
+       lockClf = NULL;\r
 #endif\r
        fnt=0;  *FontDef=0;     fx=fy=fz=fa=fc=0;\r
        AMin.Set(0,0,0,0);      AMax.Set(1,1,1,1);\r
@@ -125,14 +151,30 @@ mglBase::mglBase()
 \r
        strcpy(last_style,"__1 {dFFFF}k\0");\r
        MinS.Set(-1,-1,-1);     MaxS.Set(1,1,1);\r
-       fnt = new mglFont;      fnt->gr = this; PrevState=NAN;  size_opt=NAN;\r
+       fnt = new mglFont;      fnt->gr = this; PrevState=size_opt=NAN;\r
 }\r
+//-----------------------------------------------------------------------------\r
 mglBase::~mglBase()\r
 {\r
        ClearEq();      ClearPrmInd();  delete fnt;\r
-       Pnt.set_mutex(0);       Prm.set_mutex(0);       Txt.set_mutex(0);\r
+       Pnt.set_mutex(0);       Prm.set_mutex(0);       //Txt.set_mutex(0);\r
+#if MGL_HAVE_PTHREAD\r
+       pthread_mutex_destroy(&mutexPnt);\r
+       pthread_mutex_destroy(&mutexTxt);\r
+       pthread_mutex_destroy(&mutexSub);\r
+       pthread_mutex_destroy(&mutexLeg);\r
+       pthread_mutex_destroy(&mutexPrm);\r
+       pthread_mutex_destroy(&mutexPtx);\r
+       pthread_mutex_destroy(&mutexStk);\r
+       pthread_mutex_destroy(&mutexGrp);\r
+       pthread_mutex_destroy(&mutexGlf);\r
+       pthread_mutex_destroy(&mutexAct);\r
+       pthread_mutex_destroy(&mutexDrw);\r
+       pthread_mutex_destroy(&mutexClf);\r
+#endif\r
 #if MGL_HAVE_OMP\r
-       omp_destroy_lock(&lockClf);\r
+       omp_destroy_lock((omp_lock_t*)lockClf);\r
+       delete ((omp_lock_t*)lockClf);\r
 #endif\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -171,27 +213,27 @@ void mglBase::StartGroup(const char *name, int id)
        StartAutoGroup(buf);\r
 }\r
 //-----------------------------------------------------------------------------\r
-const char *mglWarn[mglWarnEnd] = {"data dimension(s) is incompatible",        //mglWarnDim\r
-                                                               "data dimension(s) is too small",               //mglWarnLow\r
-                                                               "minimal data value is negative",               //mglWarnNeg\r
-                                                               "no file or wrong data dimensions",             //mglWarnFile\r
-                                                               "not enough memory",                                    //mglWarnMem\r
-                                                               "data values are zero",                                 //mglWarnZero\r
-                                                               "no legend entries",                                    //mglWarnLeg\r
-                                                               "slice value is out of range",                  //mglWarnSlc\r
-                                                               "number of contours is zero or negative",//mglWarnCnt\r
-                                                               "couldn't open file",                                   //mglWarnOpen\r
-                                                               "light: ID is out of range",                    //mglWarnLId\r
-                                                               "size(s) is zero or negative",                  //mglWarnSize\r
-                                                               "format is not supported for that build",//mglWarnFmt\r
-                                                               "axis ranges are incompatible",                 //mglWarnTern\r
-                                                               "pointer is NULL",                                              //mglWarnNull\r
-                                                               "not enough space for plot",                    //mglWarnSpc\r
-                                                               "There is wrong argument(s) in script", //mglScrArg\r
-                                                               "There is wrong command(s) in script",  //mglScrCmd\r
-                                                               "There is too long string(s) in script",        //mglScrLong\r
-                                                               "There is unbalanced ' in script",              //mglScrStr\r
-                                                               "There is changing temporary data in script"};  //mglScrTemp\r
+const char *mglWarn[mglWarnEnd] = {_("data dimension(s) is incompatible"),     //mglWarnDim\r
+                                                               _("data dimension(s) is too small"),            //mglWarnLow\r
+                                                               _("minimal data value is negative"),            //mglWarnNeg\r
+                                                               _("no file or wrong data dimensions"),          //mglWarnFile\r
+                                                               _("not enough memory"),                                         //mglWarnMem\r
+                                                               _("data values are zero"),                                      //mglWarnZero\r
+                                                               _("no legend entries"),                                 //mglWarnLeg\r
+                                                               _("slice value is out of range"),                       //mglWarnSlc\r
+                                                               _("number of contours is zero or negative"),//mglWarnCnt\r
+                                                               _("couldn't open file"),                                        //mglWarnOpen\r
+                                                               _("light: ID is out of range"),                 //mglWarnLId\r
+                                                               _("size(s) is zero or negative"),                       //mglWarnSize\r
+                                                               _("format is not supported for that build"),//mglWarnFmt\r
+                                                               _("axis ranges are incompatible"),                      //mglWarnTern\r
+                                                               _("pointer is NULL"),                                           //mglWarnNull\r
+                                                               _("not enough space for plot"),                 //mglWarnSpc\r
+                                                               _("There is wrong argument(s) in script"),      //mglScrArg\r
+                                                               _("There is wrong command(s) in script"),       //mglScrCmd\r
+                                                               _("There is too long string(s) in script"),     //mglScrLong\r
+                                                               _("There is unbalanced ' in script"),           //mglScrStr\r
+                                                               _("There is changing temporary data in script")};       //mglScrTemp\r
 //-----------------------------------------------------------------------------\r
 extern bool mglPrintWarn;\r
 void mglBase::SetWarn(int code, const char *who)\r
@@ -205,7 +247,7 @@ void mglBase::SetWarn(int code, const char *who)
        }\r
        else if(!code)  Mess="";\r
        else if(who && *who)    warn = who;\r
-       if(mglPrintWarn && !warn.empty())       fprintf(stderr,"MathGL message - %s\n",warn.c_str());\r
+       if(mglPrintWarn && !warn.empty())       fprintf(stderr,_("MathGL message - %s\n"),warn.c_str());\r
        if(code && !warn.empty())       Mess = Mess+(code==-2?"":"\n")+warn;\r
        LoadState();\r
 }\r
@@ -214,7 +256,7 @@ void mglBase::SetWarn(int code, const char *who)
 //-----------------------------------------------------------------------------\r
 void mglGlyph::Create(long Nt, long Nl)\r
 {\r
-       if(Nt<0 || Nl<0)        return;\r
+//     if(Nt<0 || Nl<0)        return;\r
        nt=Nt;  nl=Nl;\r
 #pragma omp critical(glf_create)\r
        {\r
@@ -225,7 +267,7 @@ void mglGlyph::Create(long Nt, long Nl)
        }\r
 }\r
 //-----------------------------------------------------------------------------\r
-bool mglGlyph::operator==(const mglGlyph &g)\r
+bool mglGlyph::operator==(const mglGlyph &g) const\r
 {\r
        if(nl!=g.nl || nt!=g.nt)        return false;\r
        if(trig && memcmp(trig,g.trig,6*nt*sizeof(short)))      return false;\r
@@ -249,6 +291,45 @@ long mglBase::AddGlyph(int s, long j)
        {k=Glf.size();  MGL_PUSH(Glf,g,mutexGlf);}      return k;\r
 }\r
 //-----------------------------------------------------------------------------\r
+long mglBase::AddGlyph(unsigned char id)\r
+{\r
+       size_t j=0;\r
+       for(size_t i=0;i<UserGlf.size();i++)\r
+               if(UserGlf[i].nt==-id)  j=i+1;\r
+       if(j==0)        return -1;\r
+       const mglGlyph &g=UserGlf[j-1];\r
+       // let find the similar glyph\r
+       for(size_t i=0;i<Glf.size();i++)\r
+               if(g!=Glf[i])   continue;       else    return i;\r
+       // if no one then let add it\r
+       long k;\r
+#pragma omp critical(glf)\r
+       {k=Glf.size();  MGL_PUSH(Glf,g,mutexGlf);}      return k;\r
+}\r
+//-----------------------------------------------------------------------------\r
+void mglBase::DefineGlyph(HCDT x, HCDT y, unsigned char id)\r
+{\r
+       long n = x->GetNx();\r
+       if(y->GetNx()!=n || n<2)        return;\r
+       mglGlyph g(-id,n);\r
+       mreal x1=1e10,x2=-1e10,y1=1e10,y2=-1e10;\r
+       for(long i=0;i<n;i++)\r
+       {\r
+               mreal xx = x->v(i), yy = y->v(i);\r
+               x1=x1>xx?xx:x1; x2=x2<xx?xx:x2;\r
+               y1=y1>yy?yy:y1; y2=y2<yy?yy:y2;\r
+       }\r
+       mreal scale = 1;\r
+       if(fabs(x1)<10 && fabs(x2)<10 && fabs(y1)<10 && fabs(y2)<10)\r
+               scale=1000;\r
+       for(long i=0;i<n;i++)\r
+       {\r
+               short sx = short(x->v(i)*scale), sy = short(y->v(i)*scale);\r
+               g.line[2*i] = sx;       g.line[2*i+1] = sy;\r
+       }\r
+       UserGlf.push_back(g);\r
+}\r
+//-----------------------------------------------------------------------------\r
 //             Add points to the buffer\r
 //-----------------------------------------------------------------------------\r
 void inline mgl_put_inbox(mreal a1, mreal a2, mreal &a)\r
@@ -295,10 +376,15 @@ long mglBase::AddPnt(const mglMatrix *mat, mglPoint p, mreal c, mglPoint n, mrea
                q.x=q.xx=p.x;   q.y=q.yy=p.y;   q.z=q.zz=p.z;\r
                q.c=c;  q.t=q.ta=a;     q.u=n.x;        q.v=n.y;        q.w=n.z;\r
        }\r
-       register long ci=long(c);\r
+       long ci=long(c);\r
        if(ci<0 || ci>=(long)Txt.size())        ci=0;   // NOTE never should be here!!!\r
        const mglTexture &txt=Txt[ci];\r
        txt.GetC(c,a,q);        // RGBA color\r
+       if(get(MGL_GRAY_MODE))\r
+       {\r
+               float h = 0.3*q.r + 0.59*q.g + 0.11*q.b;\r
+               q.r = q.g = q.b = h;\r
+       }\r
 \r
        // add gap for texture coordinates for compatibility with OpenGL\r
        const mreal gap = 0./MGL_TEXTURE_COLOURS;\r
@@ -310,7 +396,7 @@ long mglBase::AddPnt(const mglMatrix *mat, mglPoint p, mreal c, mglPoint n, mrea
        if(!get(MGL_ENABLE_ALPHA))      {       q.a=1;  if(txt.Smooth!=2)       q.ta=1-gap;     }\r
        if(norefr)      q.v=0;\r
        if(!get(MGL_ENABLE_LIGHT) && !(scl&4))  q.u=q.v=NAN;\r
-       q.sub=mat->norot?-Sub.size():Sub.size()-1;\r
+       q.sub=mat->norot?-1*(short)Sub.size():Sub.size()-1;\r
        long k;\r
 #pragma omp critical(pnt)\r
        {k=Pnt.size();  MGL_PUSH(Pnt,q,mutexPnt);}      return k;\r
@@ -356,12 +442,10 @@ bool mglBase::RecalcCRange()
        else\r
        {\r
                FMin.c = INFINITY;      FMax.c = -INFINITY;\r
-               register int i;\r
-               mreal a;\r
                int n=30;\r
-               for(i=0;i<=n;i++)\r
+               for(int i=0;i<=n;i++)\r
                {\r
-                       a = fa->Calc(0,0,0,Min.c+i*(Max.c-Min.c)/n);\r
+                       mreal a = fa->Calc(0,0,0,Min.c+i*(Max.c-Min.c)/n);\r
                        if(mgl_isbad(a))        wrong=true;\r
                        if(a<FMin.c)    FMin.c=a;\r
                        if(a>FMax.c)    FMax.c=a;\r
@@ -380,30 +464,28 @@ void mglBase::RecalcBorder()
        {\r
                FMin.Set( INFINITY, INFINITY, INFINITY);\r
                FMax.Set(-INFINITY,-INFINITY,-INFINITY);\r
-               register int i,j;\r
                int n=30;\r
-               for(i=0;i<=n;i++)       for(j=0;j<=n;j++)       // x range\r
+               for(int i=0;i<=n;i++)   for(int j=0;j<=n;j++)   // x range\r
                {\r
                        if(SetFBord(Min.x, Min.y+i*(Max.y-Min.y)/n, Min.z+j*(Max.z-Min.z)/n))   wrong=true;\r
                        if(SetFBord(Max.x, Min.y+i*(Max.y-Min.y)/n, Min.z+j*(Max.z-Min.z)/n))   wrong=true;\r
                }\r
-               for(i=0;i<=n;i++)       for(j=0;j<=n;j++)       // y range\r
+               for(int i=0;i<=n;i++)   for(int j=0;j<=n;j++)   // y range\r
                {\r
                        if(SetFBord(Min.x+i*(Max.x-Min.x)/n, Min.y, Min.z+j*(Max.z-Min.z)/n))   wrong=true;\r
                        if(SetFBord(Min.x+i*(Max.x-Min.x)/n, Max.y, Min.z+j*(Max.z-Min.z)/n))   wrong=true;\r
                }\r
-               for(i=0;i<=n;i++)       for(j=0;j<=n;j++)       // x range\r
+               for(int i=0;i<=n;i++)   for(int j=0;j<=n;j++)   // x range\r
                {\r
                        if(SetFBord(Min.x+i*(Max.x-Min.x)/n, Min.y+j*(Max.y-Min.y)/n, Min.z))   wrong=true;\r
                        if(SetFBord(Min.x+i*(Max.x-Min.x)/n, Min.y+j*(Max.y-Min.y)/n, Max.z))   wrong=true;\r
                }\r
-               mreal d;\r
                if(!fx) {       FMin.x = Min.x; FMax.x = Max.x; }\r
-               else    {       d=0.01*(FMax.x-FMin.x); FMin.x-=d;      FMax.x+=d;      }\r
+               else    {       mreal d=0.01*(FMax.x-FMin.x);   FMin.x-=d;      FMax.x+=d;      }\r
                if(!fy) {       FMin.y = Min.y; FMax.y = Max.y; }\r
-               else    {       d=0.01*(FMax.y-FMin.y); FMin.y-=d;      FMax.y+=d;      }\r
+               else    {       mreal d=0.01*(FMax.y-FMin.y);   FMin.y-=d;      FMax.y+=d;      }\r
                if(!fz) {       FMin.z = Min.z; FMax.z = Max.z; }\r
-               else    {       d=0.01*(FMax.z-FMin.z); FMin.z-=d;      FMax.z+=d;      }\r
+               else    {       mreal d=0.01*(FMax.z-FMin.z);   FMin.z-=d;      FMax.z+=d;      }\r
        }\r
        if(RecalcCRange())      wrong=true;\r
        if(wrong)       SetWarn(mglWarnTern, "Curved coordinates");\r
@@ -491,17 +573,17 @@ bool mglBase::ScalePoint(const mglMatrix *, mglPoint &p, mglPoint &n, bool use_n
        }\r
 \r
        x1=x;   y1=y;   z1=z;\r
-       register mreal xx=1,xy=0,xz=0,yx=0,yy=1,yz=0,zx=0,zy=0,zz=1;\r
+       mreal xx=1,xy=0,xz=0,yx=0,yy=1,yz=0,zx=0,zy=0,zz=1;\r
        if(fx)  {       x1 = fx->Calc(x,y,z);   xx = fx->CalcD('x',x,y,z);      xy = fx->CalcD('y',x,y,z);      xz = fx->CalcD('z',x,y,z);      }\r
        if(fy)  {       y1 = fy->Calc(x,y,z);   yx = fy->CalcD('x',x,y,z);      yy = fy->CalcD('y',x,y,z);      yz = fy->CalcD('z',x,y,z);      }\r
        if(fz)  {       z1 = fz->Calc(x,y,z);   zx = fz->CalcD('x',x,y,z);      zy = fz->CalcD('y',x,y,z);      zz = fz->CalcD('z',x,y,z);      }\r
        if(mgl_isnan(x1) || mgl_isnan(y1) || mgl_isnan(z1))     {       x=NAN;  return false;   }\r
 \r
-       register mreal d;\r
+       mreal d;\r
        d = 1/(FMax.x - FMin.x);        x = (2*x1 - FMin.x - FMax.x)*d; xx /= d;        xy /= d;        xz /= d;\r
        d = 1/(FMax.y - FMin.y);        y = (2*y1 - FMin.y - FMax.y)*d; yx /= d;        yy /= d;        yz /= d;\r
        d = 1/(FMax.z - FMin.z);        z = (2*z1 - FMin.z - FMax.z)*d; zx /= d;        zy /= d;        zz /= d;\r
-       register mreal nx=n.x, ny=n.y, nz=n.z;\r
+       mreal nx=n.x, ny=n.y, nz=n.z;\r
        n.x = nx*xx+ny*xy+nz*xz;\r
        n.y = nx*yx+ny*yy+nz*yz;\r
        n.z = nx*zx+ny*zy+nz*zz;\r
@@ -756,8 +838,10 @@ void mglBase::Ternary(int t)
 //-----------------------------------------------------------------------------\r
 void mglBase::SetFunc(const char *EqX,const char *EqY,const char *EqZ,const char *EqA)\r
 {\r
-       if(fa)  delete fa;      if(fx)  delete fx;\r
-       if(fy)  delete fy;      if(fz)  delete fz;\r
+       if(fa)  delete fa;\r
+       if(fx)  delete fx;\r
+       if(fy)  delete fy;\r
+       if(fz)  delete fz;\r
        if(EqX && *EqX && (EqX[0]!='x' || EqX[1]!=0))\r
                fx = new mglFormula(EqX);\r
        else    fx = 0;\r
@@ -821,8 +905,11 @@ void mglBase::ClearEq()
 {\r
 #pragma omp critical(eq)\r
        {\r
-               if(fx)  delete fx;      if(fy)  delete fy;      if(fz)  delete fz;\r
-               if(fa)  delete fa;      if(fc)  delete fc;\r
+               if(fx)  delete fx;\r
+               if(fy)  delete fy;\r
+               if(fz)  delete fz;\r
+               if(fa)  delete fa;\r
+               if(fc)  delete fc;\r
                fx = fy = fz = fc = fa = 0;\r
        }\r
        RecalcBorder();\r
@@ -861,22 +948,31 @@ void MGL_EXPORT mgl_chrrgb(char p, float c[3])
                }\r
 }\r
 //-----------------------------------------------------------------------------\r
-void mglTexture::Set(const char *s, int smooth, mreal alpha)\r
+size_t MGL_EXPORT mgl_get_num_color(const char *s, int smooth)\r
 {\r
-       // NOTE: New syntax -- colors are CCCCC or {CNCNCCCN}; options inside []\r
-       if(!s || !s[0]) return;\r
-       strncpy(Sch,s,259);     Smooth=smooth;  Alpha=alpha;\r
-\r
-       register long i,j=0,m=0,l=strlen(s);\r
-       bool map = smooth==2 || mglchr(s,'%'), sm = smooth>=0 && !strchr(s,'|');        // Use mapping, smoothed colors\r
-       for(i=n=0;i<l;i++)              // find number of colors\r
+       if(!s || !s[0]) return 0;\r
+       size_t l=strlen(s), n=0;        long j=0;\r
+       for(size_t i=0;i<l;i++)         // find number of colors\r
        {\r
                if(smooth>=0 && s[i]==':' && j<1)       break;\r
                if(s[i]=='{' && strchr(MGL_COLORS"x",s[i+1]) && j<1)    n++;\r
-               if(s[i]=='[' || s[i]=='{')      j++;    if(s[i]==']' || s[i]=='}')      j--;\r
+               if(s[i]=='[' || s[i]=='{')      j++;\r
+               if(s[i]==']' || s[i]=='}')      j--;\r
                if(strchr(MGL_COLORS,s[i]) && j<1)      n++;\r
 //             if(smooth && s[i]==':') break;  // NOTE: should use []\r
        }\r
+       return n;\r
+}\r
+//-----------------------------------------------------------------------------\r
+void mglTexture::Set(const char *s, int smooth, mreal alpha)\r
+{\r
+       // NOTE: New syntax -- colors are CCCCC or {CNCNCCCN}; options inside []\r
+       if(!s || !s[0]) return;\r
+       mgl_strncpy(Sch,s,259); Smooth=smooth;  Alpha=alpha;\r
+\r
+       long l=strlen(s);\r
+       bool map = smooth==2 || mglchr(s,'%'), sm = smooth>=0 && !strchr(s,'|');        // Use mapping, smoothed colors\r
+       n = mgl_get_num_color(s,smooth);\r
        if(!n)\r
        {\r
                if(strchr(s,'|') && !smooth)    // sharp colors\r
@@ -888,11 +984,13 @@ void mglTexture::Set(const char *s, int smooth, mreal alpha)
        bool man=sm;\r
        mglColor *c = new mglColor[2*n];                // Colors itself\r
        mreal *val = new mreal[n];\r
-       for(i=j=n=0;i<l;i++)    // fill colors\r
+       for(long i=0, m=0, j=n=0;i<l;i++)       // fill colors\r
        {\r
                if(smooth>=0 && s[i]==':' && j<1)       break;\r
-               if(s[i]=='[')   j++;    if(s[i]==']')   j--;\r
-               if(s[i]=='{')   m++;    if(s[i]=='}')   m--;\r
+               if(s[i]=='[')   j++;\r
+               if(s[i]==']')   j--;\r
+               if(s[i]=='{')   m++;\r
+               if(s[i]=='}')   m--;\r
                if(strchr(MGL_COLORS,s[i]) && j<1 && (m==0 || s[i-1]=='{'))     // {CN,val} format, where val in [0,1]\r
                {\r
                        if(m>0 && s[i+1]>'0' && s[i+1]<='9')// ext color\r
@@ -942,10 +1040,10 @@ void mglTexture::Set(const char *s, int smooth, mreal alpha)
        val[0]=0;       val[n-1]=1;     // boundary have to be [0,1]\r
        for(long i=0;i<n;i++) if(val[i]>0 && val[i]<1)  def.push_back(i);\r
        def.push_back(n-1);\r
-       long i1=0,i2;\r
-       for(size_t j=0;j<def.size();j++)        for(i=i1+1;i<def[j];i++)\r
+       long i1=0;\r
+       for(size_t j=0;j<def.size();j++)        for(long i=i1+1;i<def[j];i++)\r
        {\r
-               i1 = j>0?def[j-1]:0;    i2 = def[j];\r
+               i1 = j>0?def[j-1]:0;    long i2 = def[j];\r
                v1 = val[i1];   v2 = val[i2];\r
                v2 = i2-i1>1?(v2-v1)/(i2-i1):0;\r
                val[i]=v1+v2*(i-i1);\r
@@ -954,12 +1052,12 @@ void mglTexture::Set(const char *s, int smooth, mreal alpha)
        mreal v=sm?(n-1)/255.:n/256.;\r
        if(!sm) for(long i=0;i<256;i++)\r
        {\r
-               register long j = 2*long(v*i);  //u-=j;\r
+               long j = 2*long(v*i);   //u-=j;\r
                col[2*i] = c[j];        col[2*i+1] = c[j+1];\r
        }\r
-       else    for(i=i1=0;i<256;i++)\r
+       else    for(long i=i1=0;i<256;i++)\r
        {\r
-               register mreal u = v*i; j = long(u);    //u-=j;\r
+               mreal u = v*i;  long j = long(u);       //u-=j;\r
                if(j<n-1)       // advanced scheme using val\r
                {\r
                        for(;i1<n-1 && i>=255*val[i1];i1++);\r
@@ -977,7 +1075,7 @@ void mglTexture::Set(const char *s, int smooth, mreal alpha)
 mglColor mglTexture::GetC(mreal u,mreal v) const\r
 {\r
        u -= long(u);\r
-       register long i=long(255*u);    u = u*255-i;\r
+       long i=long(255*u);     u = u*255-i;\r
        const mglColor *s=col+2*i;\r
        return (s[0]*(1-u)+s[2]*u)*(1-v) + (s[1]*(1-u)+s[3]*u)*v;\r
 }\r
@@ -985,7 +1083,7 @@ mglColor mglTexture::GetC(mreal u,mreal v) const
 void mglTexture::GetC(mreal u,mreal v,mglPnt &p) const\r
 {\r
        u -= long(u);\r
-       register long i=long(255*u);    u = u*255-i;\r
+       long i=long(255*u);     u = u*255-i;\r
        const mglColor &s0=col[2*i], &s1=col[2*i+1], &s2=col[2*i+2], &s3=col[2*i+3];\r
        p.r = (s0.r*(1-u)+s2.r*u)*(1-v) + (s1.r*(1-u)+s3.r*u)*v;\r
        p.g = (s0.g*(1-u)+s2.g*u)*(1-v) + (s1.g*(1-u)+s3.g*u)*v;\r
@@ -1064,7 +1162,7 @@ MGL_EXPORT const char *mglchr(const char *str, char ch)
        size_t l=strlen(str),k=0;\r
        for(size_t i=0;i<l;i++)\r
        {\r
-               register char c = str[i];\r
+               char c = str[i];\r
                if(c=='{')      k++;\r
                if(c=='}')      k--;\r
                if(c==ch && k==0)       return str+i;\r
@@ -1093,7 +1191,8 @@ char mglBase::SetPenPal(const char *p, long *Id, bool pal)
                size_t l=strlen(p);\r
                for(size_t i=0;i<l;i++)\r
                {\r
-                       if(p[i]=='{')   m++;    if(p[i]=='}')   m--;\r
+                       if(p[i]=='{')   m++;\r
+                       if(p[i]=='}')   m--;\r
                        if(m>0 && p[i]=='d')    PDef = strtol(p+i+1,0,16);\r
                        if(m>0) continue;\r
                        s = mglchr(stl,p[i]);\r
@@ -1109,7 +1208,8 @@ char mglBase::SetPenPal(const char *p, long *Id, bool pal)
                                else    Arrow1 = p[i];\r
                        }\r
                }\r
-               if(!Arrow1)     Arrow1='_';             if(!Arrow2)     Arrow2='_';\r
+               if(!Arrow1)     Arrow1='_';\r
+               if(!Arrow2)     Arrow2='_';\r
                if(mglchr(p,'#'))\r
                {\r
                        s = mglchr(mrk,mk);\r
@@ -1118,11 +1218,13 @@ char mglBase::SetPenPal(const char *p, long *Id, bool pal)
                }\r
                if((s=strstr(p,"{&"))!=0)\r
                {       mk = last_style[3] = p[3];      strcpy(last_style+11,s);        }\r
+               else if(mk && mglchr(p,'&'))\r
+               {       mk += 128;      last_style[3] = mk;     }\r
                last_style[0] = Arrow1; last_style[1] = Arrow2;\r
        }\r
        if(pal)\r
        {\r
-               if((s=strstr(p,"{&"))!=0)\r
+               if(p && (s=strstr(p,"{&"))!=0)\r
                {\r
                        CDef = atof(s+2);\r
 //                     if(Id)  *Id=long(tt)*256+(n+CurrPal-1)%n;\r
@@ -1130,22 +1232,23 @@ char mglBase::SetPenPal(const char *p, long *Id, bool pal)
                else\r
                {\r
                        long tt, n;\r
-                       tt = AddTexture(p,-1);  n=Txt[tt].n;\r
+                       tt = AddTexture(p?p:MGL_DEF_PAL,-1);    n=Txt[tt].n;\r
                        CDef = tt+((n+CurrPal-1)%n+0.5)/n;\r
                        if(Id)  *Id=long(tt)*256+(n+CurrPal-1)%n;\r
                        sprintf(last_style+11,"{&%g}",CDef);\r
                }\r
        }\r
-       if(Arrow1=='_') Arrow1=0;       if(Arrow2=='_') Arrow2=0;\r
+       if(Arrow1=='_') Arrow1=0;\r
+       if(Arrow2=='_') Arrow2=0;\r
        return mk;\r
 }\r
 //-----------------------------------------------------------------------------\r
 // keep this for restore default mask\r
-uint64_t mgl_mask_def[16]={0x000000FF00000000, 0x080808FF08080808,     0x0000FF00FF000000,     0x0000007700000000,\r
+MGL_EXPORT uint64_t mgl_mask_def[16]={0x000000FF00000000,      0x080808FF08080808,     0x0000FF00FF000000,     0x0000007700000000,\r
                                                        0x0000182424180000,     0x0000183C3C180000,     0x00003C24243C0000,     0x00003C3C3C3C0000,\r
                                                        0x0000060990600000,     0x0060584658600000,     0x00061A621A060000,     0x0000005F00000000,\r
                                                        0x0008142214080000,     0x00081C3E1C080000,     0x8142241818244281,     0x0000001824420000};\r
-uint64_t mgl_mask_val[16]={0x000000FF00000000, 0x080808FF08080808,     0x0000FF00FF000000,     0x0000007700000000,\r
+MGL_EXPORT uint64_t mgl_mask_val[16]={0x000000FF00000000,      0x080808FF08080808,     0x0000FF00FF000000,     0x0000007700000000,\r
                                                        0x0000182424180000,     0x0000183C3C180000,     0x00003C24243C0000,     0x00003C3C3C3C0000,\r
                                                        0x0000060990600000,     0x0060584658600000,     0x00061A621A060000,     0x0000005F00000000,\r
                                                        0x0008142214080000,     0x00081C3E1C080000,     0x8142241818244281,     0x0000001824420000};\r
@@ -1160,7 +1263,8 @@ void mglBase::SetMask(const char *p)
                long m=0, l=strlen(p);\r
                for(long i=0;i<l;i++)\r
                {\r
-                       if(p[i]=='{')   m++;    if(p[i]=='}')   m--;\r
+                       if(p[i]=='{')   m++;\r
+                       if(p[i]=='}')   m--;\r
                        if(m>0 && p[i]=='s')    mask = strtoull(p+i+1,0,16);\r
                        if(m>0) continue;\r
                        if(p[i]==':')   break;\r
@@ -1328,7 +1432,7 @@ void mglBase::AddLegend(const char *str,const char *style)
 bool MGL_EXPORT mgl_check_dim2(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *name, bool less)\r
 {\r
 //     if(!gr || !x || !y || !z)       return true;            // if data is absent then should be segfault!!!\r
-       register long n=z->GetNx(),m=z->GetNy();\r
+       long n=z->GetNx(),m=z->GetNy();\r
        if(n<2 || m<2)  {       gr->SetWarn(mglWarnLow,name);   return true;    }\r
        if(a && z->GetNN()!=a->GetNN())\r
        {       gr->SetWarn(mglWarnDim,name);   return true;    }\r
@@ -1352,7 +1456,7 @@ bool MGL_EXPORT mgl_check_dim2(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const ch
 bool MGL_EXPORT mgl_check_dim0(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT r, const char *name, bool less)\r
 {\r
 //     if(!gr || !x || !y)     return true;            // if data is absent then should be segfault!!!\r
-       register long n=y->GetNx();\r
+       long n=y->GetNx();\r
        if(less)\r
        {\r
                if(x->GetNx()<n)                {       gr->SetWarn(mglWarnDim,name);   return true;    }\r
@@ -1371,7 +1475,7 @@ bool MGL_EXPORT mgl_check_dim0(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT r, const ch
 bool MGL_EXPORT mgl_check_dim1(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT r, const char *name, bool less)\r
 {\r
 //     if(!gr || !x || !y)     return true;            // if data is absent then should be segfault!!!\r
-       register long n=y->GetNx();\r
+       long n=y->GetNx();\r
        if(n<2) {       gr->SetWarn(mglWarnLow,name);   return true;    }\r
        if(less)\r
        {\r
@@ -1391,7 +1495,7 @@ bool MGL_EXPORT mgl_check_dim1(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT r, const ch
 bool MGL_EXPORT mgl_check_dim3(HMGL gr, bool both, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, const char *name)\r
 {\r
 //     if(!gr || !x || !y || !z || !a) return true;            // if data is absent then should be segfault!!!\r
-       register long n=a->GetNx(),m=a->GetNy(),l=a->GetNz();\r
+       long n=a->GetNx(),m=a->GetNy(),l=a->GetNz();\r
        if(n<2 || m<2 || l<2)\r
        {       gr->SetWarn(mglWarnLow,name);   return true;    }\r
        if(!both && (x->GetNx()!=n || y->GetNx()!=m || z->GetNx()!=l))\r
@@ -1413,20 +1517,20 @@ bool MGL_EXPORT mgl_check_trig(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT
 //-----------------------------------------------------------------------------\r
 bool MGL_EXPORT mgl_isnboth(HCDT x, HCDT y, HCDT z, HCDT a)\r
 {\r
-       register long n=a->GetNN();\r
+       long n=a->GetNN();\r
        return x->GetNN()!=n || y->GetNN()!=n || z->GetNN()!=n;\r
 }\r
 //-----------------------------------------------------------------------------\r
 bool MGL_EXPORT mgl_isboth(HCDT x, HCDT y, HCDT z, HCDT a)\r
 {\r
-       register long n=a->GetNN();\r
+       long n=a->GetNN();\r
        return x->GetNN()==n && y->GetNN()==n && z->GetNN()==n;\r
 }\r
 //-----------------------------------------------------------------------------\r
 bool MGL_EXPORT mgl_check_vec3(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *name)\r
 {\r
 //     if(!gr || !x || !y || !z || !ax || !ay || !az)  return true;            // if data is absent then should be segfault!!!\r
-       register long n=ax->GetNx(),m=ax->GetNy(),l=ax->GetNz(), nn=n*m*l;\r
+       long n=ax->GetNx(),m=ax->GetNy(),l=ax->GetNz(), nn=n*m*l;\r
        if(nn!=ay->GetNN() || nn!=az->GetNN())\r
        {       gr->SetWarn(mglWarnDim,name);   return true;    }\r
        if(n<2 || m<2 || l<2)   {       gr->SetWarn(mglWarnLow,name);   return true;    }\r
@@ -1436,8 +1540,6 @@ bool MGL_EXPORT mgl_check_vec3(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay
        return false;\r
 }\r
 //-----------------------------------------------------------------------------\r
-void mglBase::SetFontDef(const char *font) {   strncpy(FontDef, font, 31);     }\r
-//-----------------------------------------------------------------------------\r
 void mglBase::ClearUnused()\r
 {\r
 #if MGL_HAVE_PTHREAD\r
@@ -1455,11 +1557,13 @@ void mglBase::ClearUnused()
                        used[p.n1] = 1;\r
                        switch(p.type)\r
                        {\r
-                       case 1: case 4: if(p.n2>=0)     used[p.n2] = 1; break;\r
-                       case 2: if(p.n2>=0 && p.n3>=0)\r
-                               used[p.n2] = used[p.n3] = 1;    break;\r
+                       case 1: case 4: if(p.n2>=0)     used[p.n2] = 1;\r
+                               break;\r
+                       case 2: if(p.n2>=0 && p.n3>=0)  used[p.n2] = used[p.n3] = 1;\r
+                               break;\r
                        case 3: if(p.n2>=0 && p.n3>=0 && p.n4>=0)\r
-                               used[p.n2] = used[p.n3] = used[p.n4] = 1;       break;\r
+                                       used[p.n2] = used[p.n3] = used[p.n4] = 1;\r
+                               break;\r
                        }\r
                }\r
                // now add proper indexes\r
index a8ec2730a6811f6dcc117a7d8dca562848022650..61d622897b9c8eb10a005694b5f24f54a39ce605 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * base.cpp is part of Math gric Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -62,7 +62,7 @@ MGL_EXPORT const char *mgl_get_plotid(HMGL gr)        {       return gr->PlotId.c_str();      }
 int MGL_EXPORT mgl_get_plotid_(uintptr_t *gr, char *out, int len)\r
 {\r
        const char *res = mgl_get_plotid(_GR_);\r
-       if(out) strncpy(out,res,len);\r
+       if(out) mgl_strncpy(out,res,len);\r
        return strlen(res);\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -70,7 +70,7 @@ MGL_EXPORT const char *mgl_get_mess(HMGL gr)  {       return gr->Mess.c_str();        }
 int MGL_EXPORT mgl_get_mess_(uintptr_t *gr, char *out, int len)\r
 {\r
        const char *res = mgl_get_mess(_GR_);\r
-       if(out) strncpy(out,res,len);\r
+       if(out) mgl_strncpy(out,res,len);\r
        return strlen(res);\r
 }\r
 int MGL_EXPORT mgl_get_warn(HMGL gr)   {       return gr->GetWarn();   }\r
@@ -82,7 +82,7 @@ void MGL_EXPORT mgl_set_global_warn(const char *txt)
        if(txt && *txt)\r
        {\r
                mglGlobalMess += txt;   mglGlobalMess += '\n';\r
-               if(mglPrintWarn)        fprintf(stderr,"Global message - %s\n",txt);\r
+               if(mglPrintWarn)        fprintf(stderr,_("Global message - %s\n"),txt);\r
        }\r
 }\r
 void MGL_EXPORT mgl_set_global_warn_(const char *txt, int l)\r
@@ -91,7 +91,7 @@ MGL_EXPORT const char *mgl_get_global_warn()  {       return mglGlobalMess.c_str();   }
 int MGL_EXPORT mgl_get_global_warn_(char *out, int len)\r
 {\r
        const char *res = mgl_get_global_warn();\r
-       if(out) strncpy(out,res,len);\r
+       if(out) mgl_strncpy(out,res,len);\r
        return strlen(res);\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -210,6 +210,7 @@ void MGL_EXPORT mgl_load_font(HMGL gr, const char *name, const char *path)
 {      gr->LoadFont(name,path);        }\r
 void MGL_EXPORT mgl_copy_font(HMGL gr, HMGL gr_from)   {       gr->CopyFont(gr_from);  }\r
 void MGL_EXPORT mgl_restore_font(HMGL gr)      {       gr->RestoreFont();      }\r
+void MGL_EXPORT mgl_define_symbol(HMGL gr, char id, HCDT x, HCDT y)    {       gr->DefineGlyph(x,y,id);        }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_set_bar_width_(uintptr_t *gr, mreal *width)        {       _GR_->SetBarWidth(*width);      }\r
 void MGL_EXPORT mgl_set_rotated_text_(uintptr_t *gr, int *rotated)     {       _GR_->SetRotatedText(*rotated); }\r
@@ -226,6 +227,8 @@ void MGL_EXPORT mgl_load_font_(uintptr_t *gr, char *name, char *path, int l,int
 void MGL_EXPORT mgl_copy_font_(uintptr_t *gr, uintptr_t *gr_from)\r
 {      _GR_->CopyFont((mglBase *)(*gr_from));  }\r
 void MGL_EXPORT mgl_restore_font_(uintptr_t *gr)       {       _GR_->RestoreFont();    }\r
+void MGL_EXPORT mgl_define_symbol_(uintptr_t *gr, char *id, uintptr_t *x, uintptr_t *y, int)\r
+{      _GR_->DefineGlyph(_DA_(x),_DA_(y),id?*id:0);    }\r
 //-----------------------------------------------------------------------------\r
 extern mglFont mglDefFont;\r
 void MGL_EXPORT mgl_def_font(const char *name, const char *path)\r
@@ -260,7 +263,7 @@ void MGL_EXPORT mgl_test_txt(const char *str, ...)
                va_start(lst,str);\r
                vsnprintf(buf,256,str,lst);     buf[255]=0;\r
                va_end(lst);\r
-               printf("TEST: %s\n",buf);\r
+               printf(_("TEST: %s\n"),buf);\r
                fflush(stdout);\r
        }\r
 }\r
index b4130992ee2673c9900d30d3badbce0da712fbc5..ba4ffededb9bdf539b7c748d6a35042c57a44d21 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * canvas.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -30,7 +30,7 @@ mglCanvas::mglCanvas(int w, int h) : mglBase()
        Z=0;    C=G=G4=GB=0;    OI=0;   gif=0;\r
        CurFrameId=0;   Delay=0.5;\r
        Width=Height=Depth=0;   ObjId=-1;\r
-       fscl=ftet=0;            PlotId = "frame";\r
+       fscl=ftet=0;            PlotId = _("frame");\r
        pnt_col = 0;\r
 \r
        ac.ch='c';\r
@@ -223,7 +223,7 @@ int Height;                 ///< Height of the image
 int Depth;                     ///< Depth of the image\r
 int CurFrameId;                ///< Number of automaticle created frames\r
 GifFileType *gif;*/\r
-       SetDrawReg(1,1,0);              Perspective(0); SetPenDelta(1);\r
+       SetDrawReg(1,1,0);              Perspective(0); SetPenDelta(1); SetBBox();\r
        memcpy(mgl_mask_val, mgl_mask_def, 16*sizeof(uint64_t));        // should be > 16*8\r
        ax.Clear();     ay.Clear();     az.Clear();     ac.Clear();\r
        mgl_clear_fft();                DefMaskAn=0;    ResetMask();\r
@@ -278,7 +278,7 @@ mreal mglCanvas::FindOptOrg(char dir, int ind) const
                pp[2].x=nn[j].x;        pp[2].y=1-nn[j].y;      pp[2].z=nn[j].z;        PostScale(&B,pp[2]);    pp[2]-=pp[0];\r
                pp[3].x=nn[j].x;        pp[3].y=nn[j].y;        pp[3].z=1-nn[j].z;      PostScale(&B,pp[3]);    pp[3]-=pp[0];\r
                // find cosine of axis projection\r
-               register mreal tx=fabs(pp[1].x/pp[1].y), ty=fabs(pp[2].x/pp[2].y), tz=fabs(pp[3].x/pp[3].y);\r
+               mreal tx=fabs(pp[1].x/pp[1].y), ty=fabs(pp[2].x/pp[2].y), tz=fabs(pp[3].x/pp[3].y);\r
                px=py=pz=nn[j];\r
                if(tz==0 && (ty==0 || tx==0))   // (x- & z-) or (y- & z-) axis are vertical\r
                {       if(pp[1].x>pp[2].x)     pz.y=1-pz.y;    else    pz.x=1-pz.x;    }\r
@@ -354,13 +354,15 @@ mreal mglCanvas::GetOrgZ(char dir, bool inv) const
 void mglCanvas::mark_plot(long p, char type, mreal size)\r
 {\r
        if(p<0 || mgl_isnan(Pnt[p].x) || mgl_isnan(size))       return;\r
+       if(type>128 || type<0)\r
+       {       smbl_plot(p,type-128,20*MarkSize*(size?fabs(size):1));  return; }\r
        long pp=p;\r
        mreal pw = 0.15/sqrt(font_factor);\r
        size = size?fabs(size):1;\r
        size *= MarkSize*0.35*font_factor;\r
        if(type=='.')   size = fabs(PenWidth)*sqrt(font_factor/400);\r
        if(TernAxis&12) for(int i=0;i<4;i++)\r
-       {       p = ProjScale(i, pp);   MGL_MARK_PLOT   }\r
+       {       p = ProjScale(i, pp);   if(p>=0)        {MGL_MARK_PLOT} }\r
        else    {       MGL_MARK_PLOT   }\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -372,16 +374,25 @@ void mglCanvas::mark_plot(long p, char type, mreal size)
 void mglCanvas::line_plot(long p1, long p2)\r
 {\r
        if(PDef==0)     return;\r
-       if(p1<0 || p2<0 || mgl_isnan(Pnt[p1].x) || mgl_isnan(Pnt[p2].x))        return;\r
+       if(p1<0 || p2<0 || mgl_isnan(Pnt[p1].x) || mgl_isnan(Pnt[p2].x) || SamePnt(p1,p2))      return;\r
        if(p1>p2)       {       long kk=p1;     p1=p2;  p2=kk;  }       // rearrange start/end for proper dashing\r
        long pp1=p1,pp2=p2;\r
-       mreal pw = fabs(PenWidth)*sqrt(font_factor/400);\r
+       mreal pw = fabs(PenWidth)*sqrt(font_factor/400), d=0;\r
        if(TernAxis&12) for(int i=0;i<4;i++)\r
        {       p1 = ProjScale(i, pp1); p2 = ProjScale(i, pp2);\r
-               MGL_LINE_PLOT   }\r
-       else    {       MGL_LINE_PLOT   }\r
-       register mreal d = hypot(Pnt[p1].x-Pnt[p2].x, Pnt[p1].y-Pnt[p2].y);\r
-       pPos = fmod(pPos+d/pw/1.5, 16);\r
+               if(p1>=0&&p2>=0)\r
+               {\r
+                       d += hypot(Pnt[p1].x-Pnt[p2].x, Pnt[p1].y-Pnt[p2].y);\r
+                       MGL_LINE_PLOT\r
+                       pPos = fmod(pPos+d/pw/1.5, 16);\r
+               }\r
+       }\r
+       else\r
+       {\r
+               d = hypot(Pnt[p1].x-Pnt[p2].x, Pnt[p1].y-Pnt[p2].y);\r
+               MGL_LINE_PLOT\r
+               pPos = fmod(pPos+d/pw/1.5, 16);\r
+       }\r
 }\r
 //-----------------------------------------------------------------------------\r
 #define MGL_TRIG_PLOT  if(Quality&MGL_DRAW_LMEM)       \\r
@@ -392,11 +403,12 @@ void mglCanvas::line_plot(long p1, long p2)
 void mglCanvas::trig_plot(long p1, long p2, long p3)\r
 {\r
        if(p1<0 || p2<0 || p3<0 || mgl_isnan(Pnt[p1].x) || mgl_isnan(Pnt[p2].x) || mgl_isnan(Pnt[p3].x))        return;\r
+       if(SamePnt(p1,p2) || SamePnt(p1,p3))    return;\r
        long pp1=p1,pp2=p2,pp3=p3;\r
        mreal pw = fabs(PenWidth)*sqrt(font_factor/400);\r
        if(TernAxis&12) for(int i=0;i<4;i++)\r
        {       p1 = ProjScale(i, pp1); p2 = ProjScale(i, pp2);\r
-               p3 = ProjScale(i, pp3); MGL_TRIG_PLOT   }\r
+               p3 = ProjScale(i, pp3); if(p1>=0&&p2>=0&&p3>=0) {MGL_TRIG_PLOT} }\r
        else    {       MGL_TRIG_PLOT   }\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -407,16 +419,16 @@ void mglCanvas::trig_plot(long p1, long p2, long p3)
                                                        a.m=mask;       a.angl=MaskAn;  a.w = pw;       add_prim(a);    }\r
 void mglCanvas::quad_plot(long p1, long p2, long p3, long p4)\r
 {\r
-       if(p1<0 || mgl_isnan(Pnt[p1].x))        {       trig_plot(p4,p2,p3);    return; }\r
-       if(p2<0 || mgl_isnan(Pnt[p2].x))        {       trig_plot(p1,p4,p3);    return; }\r
-       if(p3<0 || mgl_isnan(Pnt[p3].x))        {       trig_plot(p1,p2,p4);    return; }\r
-       if(p4<0 || mgl_isnan(Pnt[p4].x))        {       trig_plot(p1,p2,p3);    return; }\r
+       if(p1<0 || mgl_isnan(Pnt[p1].x) || SamePnt(p1,p2))      {       trig_plot(p4,p2,p3);    return; }\r
+       if(p2<0 || mgl_isnan(Pnt[p2].x) || SamePnt(p2,p4))      {       trig_plot(p1,p4,p3);    return; }\r
+       if(p3<0 || mgl_isnan(Pnt[p3].x) || SamePnt(p1,p3))      {       trig_plot(p1,p2,p4);    return; }\r
+       if(p4<0 || mgl_isnan(Pnt[p4].x) || SamePnt(p3,p4))      {       trig_plot(p1,p2,p3);    return; }\r
        long pp1=p1,pp2=p2,pp3=p3,pp4=p4;\r
        mreal pw = fabs(PenWidth)*sqrt(font_factor/400);\r
        if(TernAxis&12) for(int i=0;i<4;i++)\r
        {       p1 = ProjScale(i, pp1); p2 = ProjScale(i, pp2);\r
                p3 = ProjScale(i, pp3); p4 = ProjScale(i, pp4);\r
-               MGL_QUAD_PLOT   }\r
+               if(p1>=0&&p2>=0&&p3>=0&&p4>=0)  {MGL_QUAD_PLOT} }\r
        else    {       MGL_QUAD_PLOT   }\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -506,7 +518,7 @@ pthread_mutex_lock(&mutexPtx);
                q.u = q.v = NAN;        q.a=q.t=q.ta=1;\r
                memset(Bt.b,0,9*sizeof(mreal));\r
                Bt.b[0] = Bt.b[4] = Bt.b[8] = fscl;\r
-               register mreal opf = Bt.pf;\r
+               mreal opf = Bt.pf;\r
                Bt.RotateN(ftet,0,0,1); Bt.pf = Bt.norot?1.55:opf;\r
                if(strchr(font,'@'))    // draw box around text\r
                {\r
@@ -568,6 +580,32 @@ void mglCanvas::Glyph(mreal x, mreal y, mreal f, int s, long j, mreal col)
        else    add_prim(a);\r
 }\r
 //-----------------------------------------------------------------------------\r
+#define MGL_GLYPH_PLOT if(Quality&MGL_DRAW_LMEM)       glyph_draw(a,&d);\\r
+                                               else    add_prim(a);\r
+void mglCanvas::smbl_plot(long p1, char id, double size)\r
+{\r
+       if(p1<0)        return;\r
+       mglPnt q=Pnt[p1];\r
+       mreal ftet=NAN, ll = q.u*q.u+q.v*q.v;\r
+       if(mgl_isnan(ll) || !get(MGL_ENABLE_RTEXT))     ftet = 0;\r
+       else if(ll)     ftet = -180*atan2(q.v,q.u)/M_PI;\r
+       long pk;        q.u=q.v=0;      q.w=NAN;\r
+#pragma omp critical(pnt)\r
+       {pk=Pnt.size(); MGL_PUSH(Pnt,q,mutexPnt);}\r
+\r
+       mglPrim a(4);\r
+       a.s = fabs(size)/6.5*font_factor/B.pf;\r
+       a.w = get(MGL_ENABLE_RTEXT)?ftet:1e5;\r
+       a.p = 1./(mgl_fact*mgl_fgen);\r
+       a.n1 = pk;      a.n2 = p1;      a.n3 = size<0?4:0;      a.n4 = AddGlyph(id);\r
+       if(a.n4<0)      return; // no symbol is defined by user\r
+       mglDrawReg d;   d.set(this,dr_x,dr_y,dr_p);\r
+       d.PDef = size<0?4:0;    d.pPos = a.s;   d.PenWidth=a.w;\r
+       if(TernAxis&12) for(int i=0;i<4;i++)\r
+       {       a.n1 = ProjScale(i, pk);        MGL_GLYPH_PLOT  }\r
+       else    {       MGL_GLYPH_PLOT  }\r
+}\r
+//-----------------------------------------------------------------------------\r
 //     Plot positioning functions\r
 //-----------------------------------------------------------------------------\r
 void mglCanvas::InPlot(mreal x1,mreal x2,mreal y1,mreal y2, const char *st)\r
@@ -583,7 +621,7 @@ void mglCanvas::InPlot(mreal x1,mreal x2,mreal y1,mreal y2, const char *st)
        bool u = !(strchr(st,'u') || strchr(st,'U') || strchr(st,'_') || strchr(st,'g'));\r
        bool a = !(strchr(st,'a') || strchr(st,'A') || strchr(st,'^') || strchr(st,'g') || strchr(st,'t'));\r
        // let use simplified scheme -- i.e. no differences between axis, colorbar and/or title\r
-       register mreal xs=(x1+x2)/2, ys=(y1+y2)/2, f1 = 1.3, f2 = 1.1;\r
+       mreal xs=(x1+x2)/2, ys=(y1+y2)/2, f1 = 1.3, f2 = 1.1;\r
        if(strchr(st,'#'))      f1=f2=1.55;\r
        if(r && l)      {       x2=xs+(x2-xs)*f1;       x1=xs+(x1-xs)*f1;       }\r
        else if(r)      {       x2=xs+(x2-xs)*f1;       x1=xs+(x1-xs)*f2;       }\r
@@ -708,13 +746,13 @@ void mglCanvas::RotateN(mreal Tet,mreal x,mreal y,mreal z)
        size_t n = Sub.size();  if(n>0) Sub[n-1].B = B;\r
 }\r
 //-----------------------------------------------------------------------------\r
-void mglMatrix::RotateN(mreal Tet,mreal x,mreal y,mreal z)\r
+void mglMatrix::RotateN(mreal Tet,mreal vx,mreal vy,mreal vz)\r
 {\r
-       mreal R[9],T[9],c=cos(Tet*M_PI/180),s=-sin(Tet*M_PI/180),r=1-c,n=sqrt(x*x+y*y+z*z);\r
-       x/=n;   y/=n;   z/=n;\r
-       T[0] = x*x*r+c;         T[1] = x*y*r-z*s;       T[2] = x*z*r+y*s;\r
-       T[3] = x*y*r+z*s;       T[4] = y*y*r+c;         T[5] = y*z*r-x*s;\r
-       T[6] = x*z*r-y*s;       T[7] = y*z*r+x*s;       T[8] = z*z*r+c;\r
+       mreal R[9],T[9],c=cos(Tet*M_PI/180),s=-sin(Tet*M_PI/180),r=1-c,n=sqrt(vx*vx+vy*vy+vz*vz);\r
+       vx/=n;  vy/=n;  vz/=n;\r
+       T[0] = vx*vx*r+c;               T[1] = vx*vy*r-vz*s;    T[2] = vx*vz*r+vy*s;\r
+       T[3] = vx*vy*r+vz*s;    T[4] = vy*vy*r+c;               T[5] = vy*vz*r-vx*s;\r
+       T[6] = vx*vz*r-vy*s;    T[7] = vy*vz*r+vx*s;    T[8] = vz*vz*r+c;\r
        memcpy(R,b,9*sizeof(mreal));\r
        b[0] = T[0]*R[0] + T[3]*R[1] + T[6]*R[2];\r
        b[1] = T[1]*R[0] + T[4]*R[1] + T[7]*R[2];\r
@@ -759,11 +797,11 @@ void mglCanvas::Aspect(mreal Ax,mreal Ay,mreal Az)
                if(mgl_islog(Min.x,Max.x) && fx)        dx = log10(Max.x/Min.x);\r
                if(mgl_islog(Min.y,Max.y) && fy)        dy = log10(Max.y/Min.y);\r
                if(mgl_islog(Min.z,Max.z) && fz)        dz = log10(Max.z/Min.z);\r
-               mreal fy=exp(M_LN10*floor(0.5+log10(fabs(dy/dx))));\r
-               mreal fz=exp(M_LN10*floor(0.5+log10(fabs(dz/dx))));\r
-               if(Ay>0)        fy*=Ay;\r
-               if(Az>0)        fz*=Az;\r
-               Ax = Height*dx; Ay = Width*dy*fy;       Az = Depth*dz*fz;\r
+               mreal gy=exp(M_LN10*floor(0.5+log10(fabs(dy/dx))));\r
+               mreal gz=exp(M_LN10*floor(0.5+log10(fabs(dz/dx))));\r
+               if(Ay>0)        gy*=Ay;\r
+               if(Az>0)        gz*=Az;\r
+               Ax = inH*dx;    Ay = inW*dy*gy; Az = sqrt(inW*inH)*dz*gz;\r
        }\r
        mreal a = fabs(Ax) > fabs(Ay) ? fabs(Ax) : fabs(Ay);\r
        a = a > fabs(Az) ? a : fabs(Az);\r
@@ -775,6 +813,32 @@ void mglCanvas::Aspect(mreal Ax,mreal Ay,mreal Az)
        size_t n = Sub.size();  if(n>0) Sub[n-1].B = B;\r
 }\r
 //-----------------------------------------------------------------------------\r
+void mglCanvas::Shear(mreal Sx,mreal Sy)\r
+{\r
+       mreal R[6], Fx=1+fabs(Sx)*inH/inW, Fy=1+fabs(Sy)*inW/inH;\r
+       memcpy(R,B.b,6*sizeof(mreal));\r
+       B.b[0] = (R[0]+Sx*R[3])/Fx;     B.b[1] = (R[1]+Sx*R[4])/Fx;     B.b[2] = (R[2]+Sx*R[5])/Fx;\r
+       B.b[3] = (R[3]+Sy*R[0])/Fy;     B.b[4] = (R[4]+Sy*R[1])/Fy;     B.b[5] = (R[5]+Sy*R[2])/Fy;\r
+       size_t n = Sub.size();  if(n>0) Sub[n-1].B = B;\r
+}\r
+//-----------------------------------------------------------------------------\r
+void mglCanvas::ShearPlot(int num, int id, mreal sx, mreal sy, mreal xd, mreal yd)\r
+{\r
+       InPlot(0,1,0,1,true);\r
+       if(!(fabs(xd)<=1 && fabs(yd)<=1))       {       xd=1;   yd=0;   }\r
+       mreal wx,wy,dx,dy,wf,hf,x1,y1;\r
+       int ix=sy>=0?id:num-id-1, iy=sx>=0?id:num-id-1;\r
+       for(int i=0;i<3;i++)    // iterations to solve cubic equation\r
+       {\r
+               wx = fabs(sx)*inH/inW;  dx = xd + yd*wx;        wf = 1+wx+(num-1)*fabs(dx);\r
+               wy = fabs(sy)*inW/inH;  dy = yd + xd*wy;        hf = 1+wy+(num-1)*fabs(dy);\r
+               x1=(dx>=0?ix:(ix-num+1))*dx;\r
+               y1=(dy>=0?iy:(iy-num+1))*dy;\r
+               InPlot(x1/wf,(x1+1+wx)/wf,y1/hf,(y1+1+wy)/hf,true);\r
+       }\r
+       Shear(sx,sy);\r
+}\r
+//-----------------------------------------------------------------------------\r
 //     Lighting and transparency\r
 //-----------------------------------------------------------------------------\r
 void mglCanvas::Fog(mreal d, mreal dz) {       FogDist=d;      FogDz = dz;     }\r
@@ -810,7 +874,7 @@ void mglCanvas::arrow_plot(long n1, long n2, char st)
 //-----------------------------------------------------------------------------\r
 std::wstring MGL_EXPORT mgl_ftoa(double v, const char *fmt)\r
 {\r
-       char se[64], sf[64], ff[8]="%.3f", ee[8]="%.3e";\r
+       char se[70], sf[70], ff[8]="%.3f", ee[8]="%.3e";\r
        int dig=3;\r
        for(const char *s="0123456789";*s;s++)  if(mglchr(fmt,*s))      dig = *s-'0';\r
        if(mglchr(fmt,'E'))     ee[3] = 'E';\r
@@ -824,7 +888,8 @@ std::wstring MGL_EXPORT mgl_ftoa(double v, const char *fmt)
 \r
        // clear fix format\r
        for(i=lf-1;i>=lf-fdig && sf[i]=='0';i--)        sf[i]=0;\r
-       if(sf[i]=='.')  sf[i]=0;        lf = strlen(sf);\r
+       if(sf[i]=='.')  sf[i]=0;\r
+       lf = strlen(sf);\r
        // parse -nan numbers\r
        if(!strcmp(sf,"-nan"))  memcpy(sf,"nan",4);\r
 \r
@@ -846,9 +911,9 @@ std::wstring MGL_EXPORT mgl_ftoa(double v, const char *fmt)
        }\r
        le=strlen(se);\r
        // don't allow '+' at the end\r
-       if(se[le-1]=='+')       se[--le]=0;\r
+       if(le>0 && se[le-1]=='+')       se[--le]=0;\r
        // remove single 'e'\r
-       if(se[le-1]=='e' || se[le-1]=='E')      se[--le]=0;\r
+       if(le>0 && (se[le-1]=='e' || se[le-1]=='E'))    se[--le]=0;\r
        for(i=1+st+dig;i>st && se[i]=='0';i--); // remove final '0'\r
        if(se[i]=='.')  i--;\r
        memmove(se+i+1,se+2+st+dig,le-dig);     le=strlen(se);\r
@@ -856,7 +921,8 @@ std::wstring MGL_EXPORT mgl_ftoa(double v, const char *fmt)
        if(plus && !strchr("-0niNI",se[0]))\r
        {       memmove(se+1,se,le+1);  se[0]='+';\r
                memmove(sf+1,sf,lf+1);  sf[0]='+';      }\r
-       if((lf>le && !mglchr(fmt,'f')) || !strcmp(sf,"0") || !strcmp(sf,"-0"))  strcpy(sf,se);  lf = strlen(sf);\r
+       if((lf>le && !mglchr(fmt,'f')) || !strcmp(sf,"0") || !strcmp(sf,"-0"))  strcpy(sf,se);\r
+       lf = strlen(sf);\r
        std::wstring res;       res.reserve(lf+8);\r
 \r
        if(mglchr(fmt,'-') && !(plus||tex))             // replace '-' by "\minus"\r
@@ -904,15 +970,14 @@ void mglCanvas::Legend(const std::vector<mglText> &leg, mreal x, mreal y, const
        // find sizes\r
        mreal h=TextHeight(font,size);\r
        mreal dx = 0.03*iw, dy = 0.03*ih, w=0, t, sp=TextWidth(" ",font,size);\r
-       register long i,j;\r
-       for(i=0;i<n;i++)                // find text length\r
+       for(long i=0;i<n;i++)           // find text length\r
        {\r
                t = TextWidth(leg[i].text.c_str(),font,size)+sp;\r
                if(leg[i].stl.empty())  t -= ll;\r
                w = w>t ? w:t;\r
        }\r
        w += ll+0.01*iw;        // add space for lines\r
-       j = long((ih*0.95)/h);  if(j<1) j=1;\r
+       long j = long((ih*0.95)/h);     if(j<1) j=1;\r
        long ncol = 1+(n-1)/j, nrow = (n+ncol-1)/ncol;\r
        if(strchr(font,'-'))    // horizontal legend\r
        {\r
@@ -960,9 +1025,9 @@ void mglCanvas::Legend(const std::vector<mglText> &leg, mreal x, mreal y, const
                line_plot(k1,k2);       line_plot(k2,k4);\r
                line_plot(k4,k3);       line_plot(k3,k1);\r
        }\r
-       for(i=0;i<n;i++)        // draw lines and legend\r
+       for(long i=0;i<n;i++)   // draw lines and legend\r
        {\r
-               register long iy=nrow-(i%nrow)-1,ix=i/nrow;\r
+               long iy=nrow-(i%nrow)-1,ix=i/nrow;\r
                char m=SetPenPal(leg[i].stl.c_str());\r
                long k1=AddPnt(&M,mglPoint(x+ix*w+0.1*ll,y+iy*h+0.45*h,Depth),CDef,q,-1,0);\r
                long k2=AddPnt(&M,mglPoint(x+ix*w+0.9*ll,y+iy*h+0.45*h,Depth),CDef,q,-1,0);     pPos=0;\r
@@ -988,7 +1053,7 @@ void mglCanvas::Table(mreal x, mreal y, HCDT val, const wchar_t *text, const cha
        bool grid = mglchr(frm,'#'), eqd = mglchr(frm,'='), lim = mglchr(frm,'|');\r
        if(mgl_isnan(vw))       vw=1;   else    lim = true;\r
        if(!text)       text=L"";\r
-       if(x<0) x=0;    if(y<0) y=0;    if(y>1) y=1;\r
+       x=x<0?0:x;      y=y<0?0:y;      y=y>1?1:y;\r
 //     if(vw>1-x)      vw=1-x;\r
 \r
        char fmt[8]="3",ss[2]=" ";\r
@@ -1053,11 +1118,11 @@ void mglCanvas::Table(mreal x, mreal y, HCDT val, const wchar_t *text, const cha
        if(*text)\r
        {\r
                ww = TextWidth(text,frm,-1)+sp;\r
-               long k1=AddPnt(&B,mglPoint(x+ww*align/2.,y+h*(m-0.99),Depth),-1,q,-1,0);\r
+               long k1=AddPnt(&B,mglPoint(x+ww*align/2.,y+h*(m-0.9),Depth),-1,q,-1,0);\r
                text_plot(k1,text,frm);\r
        }\r
        else    ww = 0;\r
-       for(i=0,xx=x+ww,yy=y+h*(m-0.99);i<n;i++)        // draw lines and legend\r
+       for(i=0,xx=x+ww,yy=y+h*(m-0.9);i<n;i++) // draw lines and legend\r
        {\r
                ww = eqd ? w1:(TextWidth(str[i].c_str(),frm,-1)+sp);\r
                long k1=AddPnt(&B,mglPoint(xx+ww*align/2.,yy,Depth),-1,q,-1,0);\r
@@ -1112,8 +1177,8 @@ void mglCanvas::StartAutoGroup (const char *lbl)
        grp_counter++;\r
        if(grp_counter>1)       return; // do nothing in "subgroups"\r
        if(ObjId<0)     {       ObjId = -id;    id++;   }\r
-       register size_t len = Grp.size();\r
-       if(ObjId>=0 && len>0 && ObjId!=Grp[len-1].Id)\r
+       size_t len = Grp.size();\r
+       if(ObjId>=0 && (len==0 || (len>0 && ObjId!=Grp[len-1].Id)))\r
 #pragma omp critical(grp)\r
        {       MGL_PUSH(Grp,mglGroup(lbl,ObjId),mutexGrp);}\r
        else if(ObjId<0)\r
@@ -1150,3 +1215,15 @@ void mglCanvas::Push()
        {MGL_PUSH(stack,B,mutexStk);}\r
 }\r
 //-----------------------------------------------------------------------------\r
+void mglCanvas::Pop()\r
+{\r
+       B = stack.back(); \r
+#if MGL_HAVE_PTHREAD\r
+       pthread_mutex_lock(&m);\r
+       stack.pop_back();\r
+       pthread_mutex_unlock(&m);\r
+#else\r
+#pragma omp critical(stk)\r
+       stack.pop_back();\r
+#endif\r
+}\r
index 3eb207b56195d9b1e2231c217e378667e58d5c37..cc851c15582c05a375344b189a2188d2456573c2 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * canvas_cf.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -83,6 +83,7 @@ void MGL_EXPORT mgl_clear_frame(HMGL gr)
 void MGL_EXPORT mgl_set_transp_type(HMGL gr, int type)\r
 {      mglCanvas *g = dynamic_cast<mglCanvas *>(gr);   if(g)   g->SetTranspType(type); }\r
 void MGL_EXPORT mgl_set_alpha(HMGL gr, int enable)     {       gr->Alpha(enable);      }\r
+void MGL_EXPORT mgl_set_gray(HMGL gr, int enable)      {       gr->set(enable, MGL_GRAY_MODE); }\r
 void MGL_EXPORT mgl_set_fog(HMGL gr, double d, double dz)\r
 {      mglCanvas *g = dynamic_cast<mglCanvas *>(gr);   if(g)   g->Fog(d,dz);   }\r
 void MGL_EXPORT mgl_set_light(HMGL gr, int enable)     {       gr->Light(enable);      }\r
@@ -122,20 +123,24 @@ void MGL_EXPORT mgl_subplot_d(HMGL gr, int nx,int ny,int m,const char *style,dou
        mglCanvas *g = dynamic_cast<mglCanvas *>(gr);\r
        if(g)   g->InPlot(x1,x2,y1,y2,style);\r
 }\r
-//-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_subplot(HMGL gr, int nx,int ny,int m,const char *style)\r
 {      mgl_subplot_d(gr,nx,ny,m,style,0,0);    }\r
 //-----------------------------------------------------------------------------\r
-void MGL_EXPORT mgl_multiplot(HMGL gr, int nx,int ny,int m,int dx,int dy,const char *style)\r
+void MGL_EXPORT mgl_multiplot_d(HMGL gr, int nx,int ny,int m,int dx,int dy,const char *style,double sx,double sy)\r
 {\r
        double x1,x2,y1,y2;\r
        int mx = m%nx, my = m/nx;\r
+       if(gr->get(MGL_AUTO_FACTOR))    {       sx /= 1.55;     sy /= 1.55;     }\r
+       else    {       sx /= 2;        sy /= 2;        }\r
        dx = (dx<1 || dx+mx>nx) ? 1 : dx;\r
        dy = (dy<1 || dy+my>ny) ? 1 : dy;\r
-       x1 = double(mx)/nx;             x2 = double(mx+dx)/nx;\r
-       y2 = 1-double(my)/ny;   y1 = 1-double(my+dy)/ny;\r
+       x1 = double(mx+sx)/nx;          x2 = double(mx+dx+sx)/nx;\r
+       y2 = 1-double(my+sy)/ny;        y1 = 1-double(my+dy+sy)/ny;\r
        mglCanvas *g = dynamic_cast<mglCanvas *>(gr);   if(g)   g->InPlot(x1,x2,y1,y2,style);\r
 }\r
+void MGL_EXPORT mgl_multiplot(HMGL gr, int nx,int ny,int m,int dx,int dy,const char *style)\r
+{      mgl_multiplot_d(gr,nx,ny,m,dx,dy,style,0,0);    }\r
+//-----------------------------------------------------------------------------\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_inplot(HMGL gr, double x1,double x2,double y1,double y2)\r
 {      mglCanvas *g = dynamic_cast<mglCanvas *>(gr);   if(g)   g->InPlot(x1,x2,y1,y2,false);   }\r
@@ -144,24 +149,28 @@ void MGL_EXPORT mgl_relplot(HMGL gr, double x1,double x2,double y1,double y2)
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_columnplot(HMGL gr, int num, int i, double dd)\r
 {\r
-       register double w = 1./num;\r
+       double w = 1./num;\r
        mglCanvas *g = dynamic_cast<mglCanvas *>(gr);\r
        if(g)   g->InPlot(0,1,1-w*(i+1-dd/2),1-(i+dd/2)*w,true);\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_gridplot(HMGL gr, int nx, int ny, int i, double dd)\r
 {\r
-       register int ix=i%nx, iy=i/nx;\r
-       register double wx = 1./nx, wy = 1./ny;\r
+       int ix=i%nx, iy=i/nx;\r
+       double wx = 1./nx, wy = 1./ny;\r
        mglCanvas *g = dynamic_cast<mglCanvas *>(gr);\r
        if(g)   g->InPlot((ix+dd/2)*wx,wx*(ix+1-dd/2),1-wy*(iy+1-dd/2),1-(iy+dd/2)*wy,true);\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_stickplot(HMGL gr, int num, int i, double tet, double phi)\r
 {      mglCanvas *g = dynamic_cast<mglCanvas *>(gr);   if(g)   g->StickPlot(num, i, tet, phi); }\r
+void MGL_EXPORT mgl_shearplot(HMGL gr, int num, int i, double sx, double sy, double xd, double yd)\r
+{      mglCanvas *g = dynamic_cast<mglCanvas *>(gr);   if(g)   g->ShearPlot(num, i, sx, sy, xd, yd);   }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_aspect(HMGL gr, double Ax,double Ay,double Az)\r
 {      mglCanvas *g = dynamic_cast<mglCanvas *>(gr);   if(g)   g->Aspect(Ax,Ay,Az);    }\r
+void MGL_EXPORT mgl_shear(HMGL gr, double Sx,double Sy)\r
+{      mglCanvas *g = dynamic_cast<mglCanvas *>(gr);   if(g)   g->Shear(Sx,Sy);        }\r
 void MGL_EXPORT mgl_rotate(HMGL gr, double TetX,double TetZ,double TetY)\r
 {      mglCanvas *g = dynamic_cast<mglCanvas *>(gr);   if(g)   g->Rotate(TetX,TetZ,TetY);      }\r
 void MGL_EXPORT mgl_view(HMGL gr, double TetX,double TetZ,double TetY)\r
@@ -191,6 +200,7 @@ void MGL_EXPORT mgl_clear_frame_(uintptr_t *gr)                     {       _GR_->ClearFrame();     }
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_set_transp_type_(uintptr_t *gr, int *type)         {       _GR_->SetTranspType(*type);     }\r
 void MGL_EXPORT mgl_set_alpha_(uintptr_t *gr, int *enable)                     {       _GR_->Alpha(*enable);   }\r
+void MGL_EXPORT mgl_set_gray_(uintptr_t *gr, int *enable)                      {       _GR_->set(*enable, MGL_GRAY_MODE);      }\r
 void MGL_EXPORT mgl_set_fog_(uintptr_t *gr, mreal *d, mreal *dz)       {       _GR_->Fog(*d, *dz);             }\r
 void MGL_EXPORT mgl_set_light_(uintptr_t *gr, int *enable)                     {       _GR_->Light(*enable);   }\r
 void MGL_EXPORT mgl_set_attach_light_(uintptr_t *gr, int *enable)      {       _GR_->AttachLight(*enable);     }\r
@@ -226,6 +236,9 @@ void MGL_EXPORT mgl_subplot_(uintptr_t *gr, int *nx,int *ny,int *m,const char *s
 void MGL_EXPORT mgl_multiplot_(uintptr_t *gr, int *nx,int *ny,int *m,int *dx,int *dy,const char *st,int l)\r
 {      char *s=new char[l+1];  memcpy(s,st,l); s[l]=0;\r
        mgl_multiplot(_GR_,*nx,*ny,*m,*dx,*dy,s);       delete []s;     }\r
+void MGL_EXPORT mgl_multiplot_d_(uintptr_t *gr, int *nx,int *ny,int *m,int *dx,int *dy,const char *st, mreal *sx, mreal *sy,int l)\r
+{      char *s=new char[l+1];  memcpy(s,st,l); s[l]=0;\r
+       mgl_multiplot_d(_GR_,*nx,*ny,*m,*dx,*dy,s, *sx, *sy);   delete []s;     }\r
 void MGL_EXPORT mgl_inplot_(uintptr_t *gr, mreal *x1, mreal *x2, mreal *y1, mreal *y2)\r
 {      _GR_->InPlot(*x1,*x2,*y1,*y2,false);    }\r
 void MGL_EXPORT mgl_relplot_(uintptr_t *gr, mreal *x1, mreal *x2, mreal *y1, mreal *y2)\r
@@ -236,6 +249,8 @@ void MGL_EXPORT mgl_gridplot_(uintptr_t *gr, int *nx, int *ny, int *i, mreal *d)
 {      mgl_gridplot(_GR_,*nx,*ny,*i,*d);       }\r
 void MGL_EXPORT mgl_stickplot_(uintptr_t *gr, int *num, int *i, mreal *tet, mreal *phi)\r
 {      _GR_->StickPlot(*num, *i, *tet, *phi);  }\r
+void MGL_EXPORT mgl_shearplot_(uintptr_t *gr, int *num, int *i, mreal *sy, mreal *sx, mreal *xd, mreal *yd)\r
+{      _GR_->ShearPlot(*num,*i,*sx,*sy,*xd,*yd);       }\r
 \r
 void MGL_EXPORT mgl_title_(uintptr_t *gr, const char *title, const char *stl, mreal *size, int l,int m)\r
 {      char *t=new char[l+1];  memcpy(t,title,l);      t[l]=0;\r
@@ -243,6 +258,8 @@ void MGL_EXPORT mgl_title_(uintptr_t *gr, const char *title, const char *stl, mr
        _GR_->Title(t,s,*size); delete []s;     delete []t;     }\r
 void MGL_EXPORT mgl_aspect_(uintptr_t *gr, mreal *Ax, mreal *Ay, mreal *Az)\r
 {      _GR_->Aspect(*Ax,*Ay,*Az);      }\r
+void MGL_EXPORT mgl_shear_(uintptr_t *gr, mreal *Sx, mreal *Sy)\r
+{      _GR_->Shear(*Sx,*Sy);   }\r
 void MGL_EXPORT mgl_rotate_(uintptr_t *gr, mreal *TetX, mreal *TetZ, mreal *TetY)\r
 {      _GR_->Rotate(*TetX,*TetZ,*TetY);        }\r
 void MGL_EXPORT mgl_view_(uintptr_t *gr, mreal *TetX, mreal *TetZ, mreal *TetY)\r
@@ -291,6 +308,8 @@ void MGL_EXPORT mgl_set_def_param(HMGL gr)
 void MGL_EXPORT mgl_combine_gr(HMGL gr, HMGL in)\r
 {      const mglCanvas *gg = dynamic_cast<const mglCanvas *>(in);\r
        mglCanvas *g = dynamic_cast<mglCanvas *>(gr);   if(g && gg)     g->Combine(gg); }\r
+void MGL_EXPORT mgl_set_bbox(HMGL gr, int x1, int y1, int x2, int y2)\r
+{      mglCanvas *g = dynamic_cast<mglCanvas *>(gr);   if(g)   g->SetBBox(x1,y1,x2,y2);        }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_set_tick_len(HMGL gr, double len, double stt)\r
 {      mglCanvas *g = dynamic_cast<mglCanvas *>(gr);   if(g)   g->SetTickLen(len,stt); }\r
@@ -373,6 +392,8 @@ void MGL_EXPORT mgl_scale_size_(uintptr_t *gr, int *width, int *height)
 void MGL_EXPORT mgl_set_def_param_(uintptr_t *gr)      {       _GR_->DefaultPlotParam();       }\r
 void MGL_EXPORT mgl_combine_gr_(uintptr_t *gr, uintptr_t *in)\r
 {      _GR_->Combine((mglCanvas *)in); }\r
+void MGL_EXPORT mgl_set_bbox_(uintptr_t *gr, int *x1, int *y1, int *x2, int *y2)\r
+{      _GR_->SetBBox(*x1,*y1,*x2,*y2); }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_set_ticks_fact_(uintptr_t *gr, char *dir, double *d, int *ns, double *org, const char *fact,int,int l)\r
 {      char *s=new char[l+1];  memcpy(s,fact,l);       s[l]=0;\r
@@ -399,7 +420,7 @@ void MGL_EXPORT mgl_set_ticks_str_(uintptr_t *gr, const char *dir, const char *l
 void MGL_EXPORT mgl_set_ticks_val_(uintptr_t *gr, const char *dir, uintptr_t *val, const char *lbl, int *add,int,int l)\r
 {      char *s=new char[l+1];  memcpy(s,lbl,l);        s[l]=0;\r
        _GR_->SetTicksVal(*dir,_DA_(val),s,*add);       delete []s;     }\r
-void MGL_EXPORT mgl_add_tick_(uintptr_t *gr, const char *dir, mreal *val, const char *lbl, int *add,int,int l)\r
+void MGL_EXPORT mgl_add_tick_(uintptr_t *gr, const char *dir, mreal *val, const char *lbl, int,int l)\r
 {      char *s=new char[l+1];  memcpy(s,lbl,l);        s[l]=0;\r
        mgl_add_tick(_GR_,*dir,*val,s); delete []s;     }\r
 void MGL_EXPORT mgl_tune_ticks_(uintptr_t *gr, int *tune, mreal *fact_pos)\r
@@ -478,9 +499,9 @@ void MGL_EXPORT mgl_set_tick_shift_(uintptr_t *gr, mreal *sx, mreal *sy, mreal *
 //-----------------------------------------------------------------------------\r
 #if !MGL_HAVE_PNG\r
 void MGL_EXPORT mgl_write_prc(HMGL gr, const char *fname,const char *descr, int make_pdf)\r
-{      mgl_set_global_warn("PNG support was disabled. Please, enable it and rebuild MathGL."); }\r
+{      mgl_set_global_warn(_("PNG support was disabled. Please, enable it and rebuild MathGL."));      }\r
 void MGL_EXPORT mgl_write_prc_(uintptr_t *graph, const char *fname,const char *descr, int *make_pdf,int lf,int ld)\r
-{      mgl_set_global_warn("PNG support was disabled. Please, enable it and rebuild MathGL."); }\r
+{      mgl_set_global_warn(_("PNG support was disabled. Please, enable it and rebuild MathGL."));      }\r
 #endif\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_finish(HMGL gr)\r
index ccfbb206159c915bfd3e0fd7c03af9e6cba5deec..416a986fd02fc4d6b09ae0fe028fb59c1ff79439 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * complex.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -38,12 +38,11 @@ void MGL_EXPORT mglStartThreadC(void *(*func)(void *), void (*post)(mglThreadC *
        {\r
                pthread_t *tmp=new pthread_t[mglNumThr];\r
                mglThreadC *par=new mglThreadC[mglNumThr];\r
-               register long i;\r
-               for(i=0;i<mglNumThr;i++)        // put parameters into the structure\r
+               for(long i=0;i<mglNumThr;i++)   // put parameters into the structure\r
                {       par[i].n=n;     par[i].a=a;     par[i].b=b;     par[i].c=c;     par[i].d=d;\r
                        par[i].p=p;     par[i].v=v;     par[i].s=s;     par[i].e=e;     par[i].id=i;    }\r
-               for(i=0;i<mglNumThr;i++)        pthread_create(tmp+i, 0, func, par+i);\r
-               for(i=0;i<mglNumThr;i++)        pthread_join(tmp[i], 0);\r
+               for(long i=0;i<mglNumThr;i++)   pthread_create(tmp+i, 0, func, par+i);\r
+               for(long i=0;i<mglNumThr;i++)   pthread_join(tmp[i], 0);\r
                if(post)        post(par,a);\r
                delete []tmp;   delete []par;\r
        }\r
@@ -69,12 +68,11 @@ void MGL_EXPORT mglStartThreadV(void *(*func)(void *), long n, dual *a, const vo
        {\r
                pthread_t *tmp=new pthread_t[mglNumThr];\r
                mglThreadV *par=new mglThreadV[mglNumThr];\r
-               register long i;\r
-               for(i=0;i<mglNumThr;i++)        // put parameters into the structure\r
+               for(long i=0;i<mglNumThr;i++)   // put parameters into the structure\r
                {       par[i].n=n;     par[i].a=0;     par[i].b=b;     par[i].c=c;     par[i].d=d;\r
                        par[i].p=p;     par[i].v=v;     par[i].id=i;par[i].aa=a;        }\r
-               for(i=0;i<mglNumThr;i++)        pthread_create(tmp+i, 0, func, par+i);\r
-               for(i=0;i<mglNumThr;i++)        pthread_join(tmp[i], 0);\r
+               for(long i=0;i<mglNumThr;i++)   pthread_create(tmp+i, 0, func, par+i);\r
+               for(long i=0;i<mglNumThr;i++)   pthread_join(tmp[i], 0);\r
                delete []tmp;   delete []par;\r
        }\r
        else\r
@@ -106,7 +104,7 @@ MGL_NO_EXPORT void *mgl_csmth_x(void *par)
 #endif\r
                for(long i=t->id;i<t->n;i+=mglNumThr)\r
                {\r
-                       register long j = i%nx;\r
+                       long j = i%nx;\r
                        if(j-kind<0)    j = i+kind-j;\r
                        else if(j+kind>nx-1)    j = i+nx-1-j-kind;\r
                        else    j=i;\r
@@ -118,7 +116,7 @@ MGL_NO_EXPORT void *mgl_csmth_x(void *par)
 #endif\r
                for(long i=t->id;i<t->n;i+=mglNumThr)\r
                {\r
-                       register long j = i%nx;\r
+                       long j = i%nx;\r
                        if(j>1 && j<nx-2)       b[i] = (mreal(12)*a[i-2] - mreal(3)*a[i-1] + mreal(17)*a[i] - mreal(3)*a[i+1] + mreal(12)*a[i+2])/mreal(35);\r
                        else if(j==1 || j==nx-2)        b[i] = (a[i-1] + a[i] + a[i+1])/mreal(3);\r
                        else    b[i] = a[i];\r
@@ -137,7 +135,7 @@ MGL_NO_EXPORT void *mgl_csmth_y(void *par)
 #endif\r
                for(long i=t->id;i<t->n;i+=mglNumThr)\r
                {\r
-                       register long j = (i/nx)%ny;\r
+                       long j = (i/nx)%ny;\r
                        if(j-kind<0)    j = i+(kind-j)*nx;\r
                        else if(j+kind>ny-1)    j = i+(ny-1-j-kind)*nx;\r
                        else    j=i;\r
@@ -149,7 +147,7 @@ MGL_NO_EXPORT void *mgl_csmth_y(void *par)
 #endif\r
                for(long i=t->id;i<t->n;i+=mglNumThr)\r
                {\r
-                       register long j = (i/nx)%ny;\r
+                       long j = (i/nx)%ny;\r
                        if(j>1 && j<ny-2)       b[i] = (mreal(12)*a[i-2*nx] - mreal(3)*a[i-nx] + mreal(17)*a[i] - mreal(3)*a[i+nx] + mreal(12)*a[i+2*nx])/mreal(35);\r
                        else if(j==1 || j==ny-2)        b[i] = (a[i-nx] + a[i] + a[i+nx])/mreal(3);\r
                        else    b[i] = a[i];\r
@@ -159,7 +157,7 @@ MGL_NO_EXPORT void *mgl_csmth_y(void *par)
 MGL_NO_EXPORT void *mgl_csmth_z(void *par)\r
 {\r
        mglThreadC *t=(mglThreadC *)par;\r
-       register long nn=t->p[0]*t->p[1], nz=t->n/nn, kind=t->p[2];\r
+       long nn=t->p[0]*t->p[1], nz=t->n/nn, kind=t->p[2];\r
        dual *b=t->a;\r
        const dual *a=t->b;\r
        if(kind>0)\r
@@ -168,7 +166,7 @@ MGL_NO_EXPORT void *mgl_csmth_z(void *par)
 #endif\r
                for(long i=t->id;i<t->n;i+=mglNumThr)\r
                {\r
-                       register long j = i/nn;\r
+                       long j = i/nn;\r
                        if(j-kind<0)    j = i+(kind-j)*nn;\r
                        else if(j+kind>nz-1)    j = i+(nz-1-j-kind)*nn;\r
                        else    j=i;\r
@@ -180,7 +178,7 @@ MGL_NO_EXPORT void *mgl_csmth_z(void *par)
 #endif\r
                for(long i=t->id;i<t->n;i+=mglNumThr)\r
                {\r
-                       register long j = i/nn;\r
+                       long j = i/nn;\r
                        if(j>1 && j<nz-2)       b[i] = (mreal(12)*a[i-2*nn] - mreal(3)*a[i-nn] + mreal(17)*a[i] - mreal(3)*a[i+nn] + mreal(12)*a[i+2*nn])/mreal(35);\r
                        else if(j==1 || j==nz-2)        b[i] = (a[i-nn] + a[i] + a[i+nn])/mreal(3);\r
                        else    b[i] = a[i];\r
@@ -266,7 +264,7 @@ MGL_NO_EXPORT void *mgl_ccsum_y(void *par)
 #endif\r
        for(long i=t->id;i<nn;i+=mglNumThr)\r
        {\r
-               register long k = (i%nx)+nx*ny*(i/nx);          b[k] = a[k];\r
+               long k = (i%nx)+nx*ny*(i/nx);           b[k] = a[k];\r
                for(long j=1;j<ny;j++)  b[k+j*nx] = b[k+j*nx-nx] + a[k+nx*j];\r
        }\r
        return 0;\r
@@ -282,7 +280,7 @@ MGL_NO_EXPORT void *mgl_ccsum_x(void *par)
 #endif\r
        for(long i=t->id;i<nn;i+=mglNumThr)\r
        {\r
-               register long k = i*nx;                 b[k] = a[k];\r
+               long k = i*nx;                  b[k] = a[k];\r
                for(long j=1;j<nx;j++)  b[j+k] = b[j+k-1] + a[j+k];\r
        }\r
        return 0;\r
@@ -342,7 +340,7 @@ MGL_NO_EXPORT void *mgl_cint_y(void *par)
 #endif\r
        for(long i=t->id;i<nn;i+=mglNumThr)\r
        {\r
-               register long k = (i%nx)+nx*ny*(i/nx);  b[k] = 0;\r
+               long k = (i%nx)+nx*ny*(i/nx);   b[k] = 0;\r
                for(long j=1;j<ny;j++)  b[k+j*nx] = b[k+j*nx-nx] + (a[k+j*nx]+a[k+j*nx-nx])*dd;\r
        }\r
        return 0;\r
@@ -358,7 +356,7 @@ MGL_NO_EXPORT void *mgl_cint_x(void *par)
 #endif\r
        for(long i=t->id;i<nn;i+=mglNumThr)\r
        {\r
-               register long k = i*nx;                 b[k] = 0;\r
+               long k = i*nx;                  b[k] = 0;\r
                for(long j=1;j<nx;j++)  b[j+k] = b[j+k-1] + (a[j+k]+a[j+k-1])*dd;\r
        }\r
        return 0;\r
@@ -419,7 +417,7 @@ MGL_NO_EXPORT void *mgl_cdif_y(void *par)
 #endif\r
        for(long i=t->id;i<nn;i+=mglNumThr)\r
        {\r
-               register long k = (i%nx)+nx*ny*(i/nx);\r
+               long k = (i%nx)+nx*ny*(i/nx);\r
                b[k] = -(mgl3*a[k]-mgl4*a[k+nx]+a[k+2*nx])*dd;\r
                b[k+(ny-1)*nx] = (mgl3*a[k+(ny-1)*nx]-mgl4*a[k+(ny-2)*nx]+a[k+(ny-3)*nx])*dd;\r
                for(long j=1;j<ny-1;j++)        b[k+j*nx] = (a[k+j*nx+nx]-a[k+j*nx-nx])*dd;\r
@@ -437,7 +435,7 @@ MGL_NO_EXPORT void *mgl_cdif_x(void *par)
 #endif\r
        for(long i=t->id;i<nn;i+=mglNumThr)\r
        {\r
-               register long k = i*nx;\r
+               long k = i*nx;\r
                b[k] = -(mgl3*a[k]-mgl4*a[k+1]+a[k+2])*dd;\r
                b[k+nx-1] = (mgl3*a[k+nx-1]-mgl4*a[k+nx-2]+a[k+nx-3])*dd;\r
                for(long j=1;j<nx-1;j++)        b[j+k] = (a[j+k+1]-a[j+k-1])*dd;\r
@@ -498,7 +496,7 @@ MGL_NO_EXPORT void *mgl_cdif2_y(void *par)
 #endif\r
        for(long i=t->id;i<nn;i+=mglNumThr)\r
        {\r
-               register long k = (i%nx)+nx*ny*(i/nx);  b[k] = b[k+(ny-1)*nx] = 0;\r
+               long k = (i%nx)+nx*ny*(i/nx);   b[k] = b[k+(ny-1)*nx] = 0;\r
                for(long j=1;j<ny-1;j++)        b[k+j*nx] = (a[k+j*nx+nx]+a[k+j*nx-nx]-mgl2*a[k+j*nx])*dd;\r
        }\r
        return 0;\r
@@ -514,7 +512,7 @@ MGL_NO_EXPORT void *mgl_cdif2_x(void *par)
 #endif\r
        for(long i=t->id;i<nn;i+=mglNumThr)\r
        {\r
-               register long k = i*nx;                 b[k] = b[k+nx-1] = 0;\r
+               long k = i*nx;                  b[k] = b[k+nx-1] = 0;\r
                for(long j=1;j<nx-1;j++)        b[j+k] = (a[j+k+1]+a[j+k-1]-mgl2*a[j+k])*dd;\r
        }\r
        return 0;\r
@@ -604,18 +602,18 @@ void MGL_EXPORT mgl_datac_mirror(HADT d, const char *dir)
        if(strchr(dir,'z') && nz>1)\r
        {\r
 #pragma omp parallel for collapse(2)\r
-               for(long i=0;i<nx*ny;i++)       for(long j=0;j<nz/2;j++)\r
+               for(long j=0;j<nz/2;j++)        for(long i=0;i<nx*ny;i++)\r
                {\r
-                       register long i0 = i+j*nx*ny, j0 = i+(nz-1-j)*nx*ny;\r
+                       long i0 = i+j*nx*ny, j0 = i+(nz-1-j)*nx*ny;\r
                        dual b = a[i0]; a[i0] = a[j0];  a[j0] = b;\r
                }\r
        }\r
        if(strchr(dir,'y') && ny>1)\r
        {\r
 #pragma omp parallel for collapse(2)\r
-               for(long i=0;i<nx*nz;i++)       for(long j=0;j<ny/2;j++)\r
+               for(long j=0;j<ny/2;j++)        for(long i=0;i<nx*nz;i++)\r
                {\r
-                       register long j0 = (i%nx)+nx*(ny*(i/nx)+j), i0 = j0+(ny-1-2*j)*nx;\r
+                       long j0 = (i%nx)+nx*(ny*(i/nx)+j), i0 = j0+(ny-1-2*j)*nx;\r
                        dual b = a[j0]; a[j0] = a[i0];  a[i0] = b;\r
                }\r
        }\r
@@ -624,7 +622,7 @@ void MGL_EXPORT mgl_datac_mirror(HADT d, const char *dir)
 #pragma omp parallel for collapse(2)\r
                for(long j=0;j<ny*nz;j++)       for(long i=0;i<nx/2;i++)\r
                {\r
-                       register long i0 = nx-1-i+j*nx, j0 = i+j*nx;\r
+                       long i0 = nx-1-i+j*nx, j0 = i+j*nx;\r
                        dual b = a[j0]; a[j0] = a[i0];  a[i0] = b;\r
                }\r
        }\r
@@ -656,7 +654,9 @@ mdual MGL_EXPORT mgl_datac_spline_ext(HCDT d, mreal x,mreal y,mreal z, dual *dx,
        {\r
                mreal rx=0,ry=0,rz=0,res;\r
                res=d->valueD(x,y,z,&rx,&ry,&rz);\r
-               if(dx)  *dx=rx; if(dy)  *dy=ry; if(dz)  *dz=rz;\r
+               if(dx)  *dx=rx;\r
+               if(dy)  *dy=ry;\r
+               if(dz)  *dz=rz;\r
                return res;\r
        }\r
        dual r = mglSpline3t<dual>(dd->a,dd->nx,dd->ny,dd->nz,x,y,z,dx,dy,dz);\r
@@ -677,7 +677,9 @@ mdual MGL_EXPORT mgl_datac_linear_ext(HCDT d, mreal x,mreal y,mreal z, dual *dx,
        {\r
                mreal rx=0,ry=0,rz=0,res;\r
                res=mgl_data_linear_ext(d,x,y,z,&rx,&ry,&rz);\r
-               if(dx)  *dx=rx; if(dy)  *dy=ry; if(dz)  *dz=rz;\r
+               if(dx)  *dx=rx;\r
+               if(dy)  *dy=ry;\r
+               if(dz)  *dz=rz;\r
                return res;\r
        }\r
 \r
@@ -721,6 +723,19 @@ mdual MGL_EXPORT mgl_datac_linear_(uintptr_t *d, mreal *x,mreal *y,mreal *z)
 mdual MGL_EXPORT mgl_datac_linear_ext_(uintptr_t *d, mreal *x,mreal *y,mreal *z, dual *dx,dual *dy,dual *dz)\r
 {      return mgl_datac_linear_ext(_DA_(d),*x,*y,*z,dx,dy,dz); }\r
 //-----------------------------------------------------------------------------\r
+long MGL_NO_EXPORT mgl_powers(long N, const char *how);\r
+void MGL_EXPORT mgl_datac_crop_opt(HADT d, const char *how)\r
+{\r
+       const char *h = "235";\r
+       if(mglchr(how,'2') || mglchr(how,'3') || mglchr(how,'5'))       h = how;\r
+       if(mglchr(how,'x'))     mgl_datac_crop(d, 0, mgl_powers(d->nx, h), 'x');\r
+       if(mglchr(how,'y'))     mgl_datac_crop(d, 0, mgl_powers(d->ny, h), 'y');\r
+       if(mglchr(how,'z'))     mgl_datac_crop(d, 0, mgl_powers(d->nz, h), 'z');\r
+}\r
+void MGL_EXPORT mgl_datac_crop_opt_(uintptr_t *d, const char *how, int l)\r
+{      char *s=new char[l+1];  memcpy(s,how,l);        s[l]=0;\r
+       mgl_datac_crop_opt(_DC_,s);     delete []s;     }\r
+//-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_datac_crop(HADT d, long n1, long n2, char dir)\r
 {\r
        long nx=d->nx,ny=d->ny,nz=d->nz, nn;\r
@@ -745,7 +760,7 @@ void MGL_EXPORT mgl_datac_crop(HADT d, long n1, long n2, char dir)
                if(n2<0 || n2>=ny || n2<n1)     n2 = ny;\r
                nn = n2-n1;     b = new dual[nn*nx*nz];\r
 #pragma omp parallel for\r
-               for(long i=0;i<nn;i++)  for(long j=0;j<nz;j++)\r
+               for(long j=0;j<nz;j++)  for(long i=0;i<nn;i++)\r
                        memcpy(b+nx*(i+nn*j),d->a+nx*(n1+i+ny*j),nx*sizeof(dual));\r
                d->ny = nn;     if(!d->link)    delete []d->a;\r
                d->a = b;       d->link=false;\r
@@ -862,7 +877,7 @@ void MGL_EXPORT mgl_datac_set_value_(uintptr_t *d, dual *v, int *i, int *j, int
 //-----------------------------------------------------------------------------\r
 mdual MGL_EXPORT mgl_datac_get_value(HCDT dat, long i, long j, long k)\r
 {\r
-       register long nx=dat->GetNx(), ny=dat->GetNy(), i0=i+nx*(j+ny*k);\r
+       long nx=dat->GetNx(), ny=dat->GetNy(), i0=i+nx*(j+ny*k);\r
        if(i<0 || i>=nx || j<0 || j>=ny || k<0 || k>=dat->GetNz())\r
                return NAN;\r
        const mglDataC *d = dynamic_cast<const mglDataC*>(dat);\r
@@ -875,7 +890,7 @@ mdual MGL_EXPORT mgl_datac_get_value_(uintptr_t *d, int *i, int *j, int *k)
 MGL_EXPORT dual *mgl_datac_data(HADT dat)      {       return dat->a;  }\r
 //-----------------------------------------------------------------------------\r
 MGL_EXPORT dual *mgl_datac_value(HADT dat, long i,long j,long k)\r
-{      register long ii=i*dat->nx*(j+dat->ny*k);\r
+{      long ii=i*dat->nx*(j+dat->ny*k);\r
        return  ii>=0 && ii<dat->GetNN() ? dat->a+ii : 0;       }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_datac_join(HADT d, HCDT v)\r
@@ -912,7 +927,7 @@ void MGL_EXPORT mgl_datac_put_val(HADT d, dual val, long xx, long yy, long zz)
        if(xx>=nx || yy>=ny || zz>=nz)  return;\r
        dual *a=d->a;\r
        if(xx>=0 && yy>=0 && zz>=0)     a[xx+nx*(yy+zz*ny)] = val;\r
-       if(xx<0 && yy<0 && zz<0)\r
+       else if(xx<0 && yy<0 && zz<0)\r
 #pragma omp parallel for\r
                for(long i=0;i<nx*ny*nz;i++)    a[i] = val;\r
        else if(xx<0 && yy<0)\r
@@ -923,7 +938,7 @@ void MGL_EXPORT mgl_datac_put_val(HADT d, dual val, long xx, long yy, long zz)
                for(long i=0;i<nz*ny;i++)       a[xx+i*nx] = val;\r
        else if(xx<0 && zz<0)\r
 #pragma omp parallel for collapse(2)\r
-               for(long i=0;i<nx;i++)  for(long j=0;j<nz;j++)  a[i+nx*(yy+j*ny)] = val;\r
+               for(long j=0;j<nz;j++)  for(long i=0;i<nx;i++)  a[i+nx*(yy+j*ny)] = val;\r
        else if(xx<0)\r
 #pragma omp parallel for\r
                for(long i=0;i<nx;i++)  a[i+nx*(yy+zz*ny)] = val;\r
@@ -948,17 +963,17 @@ void MGL_EXPORT mgl_datac_put_dat(HADT d, HCDT v, long xx, long yy, long zz)
                if(vx>=nx && vy>=ny && vz>=nz)\r
 #pragma omp parallel for\r
                        for(long ii=0;ii<nx*ny*nz;ii++)\r
-                       {       register long i=ii%nx, j=(ii/nx)%ny, k=ii/(nx*ny);\r
+                       {       long i=ii%nx, j=(ii/nx)%ny, k=ii/(nx*ny);\r
                                a[ii] = b?b[i+vx*(j+k*vy)]:v->v(i,j,k); }\r
                else if(vx>=nx && vy>=ny)\r
 #pragma omp parallel for\r
                        for(long ii=0;ii<nx*ny*nz;ii++)\r
-                       {       register long i=ii%nx, j=(ii/nx)%ny;\r
+                       {       long i=ii%nx, j=(ii/nx)%ny;\r
                                a[ii] = b?b[i+vx*j]:v->v(i,j);  }\r
                else if(vx>=nx)\r
 #pragma omp parallel for\r
                        for(long ii=0;ii<nx*ny*nz;ii++)\r
-                       {       register long i=ii%nx;  a[ii] = b?b[i]:v->v(i); }\r
+                       {       long i=ii%nx;   a[ii] = b?b[i]:v->v(i); }\r
                else\r
 #pragma omp parallel for\r
                        for(long ii=0;ii<nx*ny*nz;ii++) a[ii] = vv;\r
@@ -969,12 +984,12 @@ void MGL_EXPORT mgl_datac_put_dat(HADT d, HCDT v, long xx, long yy, long zz)
                if(vx>=nx && vy>=ny)\r
 #pragma omp parallel for\r
                        for(long ii=0;ii<nx*ny;ii++)\r
-                       {       register long i=ii%nx, j=ii/nx;\r
+                       {       long i=ii%nx, j=ii/nx;\r
                                a[ii+zz] = b?b[i+vx*j]:v->v(i,j);       }\r
                else if(vx>=nx)\r
 #pragma omp parallel for\r
                        for(long ii=0;ii<nx*ny;ii++)\r
-                       {       register long i=ii%nx;  a[ii+zz] = b?b[i]:v->v(i);      }\r
+                       {       long i=ii%nx;   a[ii+zz] = b?b[i]:v->v(i);      }\r
                else\r
 #pragma omp parallel for\r
                        for(long ii=0;ii<nx*ny;ii++)    a[ii+zz] = vv;\r
@@ -984,12 +999,12 @@ void MGL_EXPORT mgl_datac_put_dat(HADT d, HCDT v, long xx, long yy, long zz)
                if(vx>=ny && vy>=nz)\r
 #pragma omp parallel for\r
                        for(long ii=0;ii<ny*nz;ii++)\r
-                       {       register long i=ii%ny, j=ii/ny;\r
+                       {       long i=ii%ny, j=ii/ny;\r
                                a[ii*nx+xx] = b?b[i+vx*j]:v->v(i,j);    }\r
                else if(vx>=ny)\r
 #pragma omp parallel for\r
                        for(long ii=0;ii<ny*nz;ii++)\r
-                       {       register long i=ii%ny;  a[ii*nx+xx] = b?b[i]:v->v(i);   }\r
+                       {       long i=ii%ny;   a[ii*nx+xx] = b?b[i]:v->v(i);   }\r
                else\r
 #pragma omp parallel for\r
                        for(long ii=0;ii<ny*nz;ii++)    a[ii*nx+xx] = vv;\r
@@ -1000,17 +1015,17 @@ void MGL_EXPORT mgl_datac_put_dat(HADT d, HCDT v, long xx, long yy, long zz)
                if(vx>=nx && vy>=nz)\r
 #pragma omp parallel for\r
                        for(long ii=0;ii<nx*nz;ii++)\r
-                       {       register long i=ii%nx, j=ii/nx;\r
+                       {       long i=ii%nx, j=ii/nx;\r
                                a[i+yy+j*zz] = b?b[i+vx*j]:v->v(i,j);   }\r
                else if(vx>=nx)\r
 #pragma omp parallel for\r
                        for(long ii=0;ii<nx*nz;ii++)\r
-                       {       register long i=ii%nx, j=ii/nx;\r
+                       {       long i=ii%nx, j=ii/nx;\r
                                a[i+yy+j*zz] = b?b[i]:v->v(i);  }\r
                else\r
 #pragma omp parallel for\r
                        for(long ii=0;ii<nx*nz;ii++)\r
-                       {       register long i=ii%nx, j=ii/nx;\r
+                       {       long i=ii%nx, j=ii/nx;\r
                                a[i+yy+j*zz] = vv;      }\r
        }\r
        else if(xx<0)\r
@@ -1085,23 +1100,33 @@ MGL_NO_EXPORT void *mgl_difr(void *par)
 void MGL_EXPORT mgl_datac_diffr(HADT d, const char *how, mreal q)\r
 {\r
        if(!how || *how==0)     return;\r
-       long nx=d->nx,ny=d->ny,nz=d->nz,ll=strlen(how);\r
-       long p[4]={0,0,(mglchr(how,'a')||mglchr(how,'r'))?1:0,0};\r
+       long nx=d->nx,ny=d->ny,nz=d->nz;\r
+       long p[4]={0,0,0,0};\r
        dual qq=q;\r
-       for(long i=0;i<ll;i++)  if(how[i]>='0' && how[i]<='9')  p[3] = how[i]-'0';\r
+       if(mglchr(how,'e'))     p[3]=-1;\r
+       if(mglchr(how,'g'))     p[3]=-2;\r
+       if(mglchr(how,'1'))     p[3]=1;\r
+       if(mglchr(how,'2'))     p[3]=2;\r
+       if(mglchr(how,'3'))     p[3]=3;\r
+       bool axial = mglchr(how,'r')||mglchr(how,'a');\r
        if(mglchr(how,'z') && nz>1)\r
        {\r
-               p[0]=nz;        p[1]=nx*ny;\r
-               mglStartThreadC(mgl_difr,0,nx*ny,0,&qq,0,p);\r
+               p[0]=nz;        p[1]=nx*ny;     p[2]=0;\r
+               mglStartThreadC(mgl_difr,0,nx*ny,d->a,&qq,0,p);\r
        }\r
-       if(mglchr(how,'y') && ny>1)\r
+       if(mglchr(how,'y') && ny>1 && !axial)\r
        {\r
-               p[0]=ny;        p[1]=nx;\r
-               mglStartThreadC(mgl_difr,0,nx*nz,0,&qq,0,p);\r
+               p[0]=ny;        p[1]=nx;        p[2]=0;\r
+               mglStartThreadC(mgl_difr,0,nx*nz,d->a,&qq,0,p);\r
        }\r
-       if((mglchr(how,'x')||mglchr(how,'r')) && nx>1)\r
+       if(mglchr(how,'x') && nx>1 && !axial)\r
        {\r
-               p[0]=nx;        p[1]=1;\r
+               p[0]=nx;        p[1]=1; p[2]=0;\r
+               mglStartThreadC(mgl_difr,0,ny*nz,d->a,&qq,0,p);\r
+       }\r
+       if(axial && nx>1)\r
+       {\r
+               p[0]=nx;        p[1]=1; p[2]=1;\r
                mglStartThreadC(mgl_difr,0,ny*nz,0,&qq,0,p);\r
        }\r
 }\r
@@ -1144,7 +1169,7 @@ mdual MGL_EXPORT mgl_gsplinec(HCDT c, mreal dx, dual *d1, dual *d2)
        while(dx>c->v(5*i) && i<n-1)    {       dx-=c->v(5*i);  i++;    }\r
        dual res;\r
        const mglDataC *d = dynamic_cast<const mglDataC *>(c);\r
-       if(c)\r
+       if(d)\r
        {\r
                const dual *a = d->a+5*i;\r
                if(d1)  *d1 = a[2]+dx*(mreal(2)*a[3]+(3*dx)*a[4]);\r
@@ -1171,7 +1196,7 @@ void MGL_EXPORT mgl_datac_refill_gs(HADT dat, HCDT xdat, HCDT vdat, mreal x1, mr
 #pragma omp parallel for\r
        for(long i=0;i<nx;i++)\r
        {\r
-               register dual d = mgl_gsplinec(coef,x0+dx*i,0,0);\r
+               dual d = mgl_gsplinec(coef,x0+dx*i,0,0);\r
                if(sl<0)        for(long j=0;j<nn;j++)  dat->a[i+j*nx] = d;\r
                else    dat->a[i+sl*nx] = d;\r
        }\r
@@ -1187,8 +1212,8 @@ void MGL_EXPORT mgl_datac_refill_x(HADT dat, HCDT xdat, HCDT vdat, mreal x1, mre
 #pragma omp parallel for\r
        for(long i=0;i<nx;i++)\r
        {\r
-               register mreal u = mgl_index_1(x1+dx*i,xdat);\r
-               register dual d = mgl_datac_spline(vdat,u,0,0);\r
+               mreal u = mgl_index_1(x1+dx*i,xdat);\r
+               dual d = mgl_datac_spline(vdat,u,0,0);\r
                if(sl<0)        for(long j=0;j<nn;j++)  dat->a[i+j*nx] = d;\r
                else    dat->a[i+sl*nx] = d;\r
        }\r
@@ -1263,8 +1288,8 @@ void MGL_EXPORT mgl_datac_refill_xy(HADT dat, HCDT xdat, HCDT ydat, HCDT vdat, m
 #pragma omp parallel for collapse(2)\r
                for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
                {\r
-                       register dual d = mgl_datac_spline(vdat,u.a[i],v.a[j],0);\r
-                       register long i0=i+nx*j;\r
+                       dual d = mgl_datac_spline(vdat,u.a[i],v.a[j],0);\r
+                       long i0=i+nx*j;\r
                        if(sl<0)        for(long k=0;k<nz;k++)  dat->a[i0+k*nn] = d;\r
                        else    dat->a[i0+sl*nn] = d;\r
                }\r
@@ -1273,6 +1298,7 @@ void MGL_EXPORT mgl_datac_refill_xy(HADT dat, HCDT xdat, HCDT ydat, HCDT vdat, m
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_datac_refill_xyz(HADT dat, HCDT xdat, HCDT ydat, HCDT zdat, HCDT vdat, mreal x1, mreal x2, mreal y1, mreal y2, mreal z1, mreal z2)\r
 {\r
+       if(!dat || !xdat || !ydat || !zdat || !vdat)    return;\r
        long nx=dat->nx,ny=dat->ny,nz=dat->nz,mx=vdat->GetNx(),my=vdat->GetNy(),mz=vdat->GetNz();\r
        bool both=(xdat->GetNN()==vdat->GetNN() && ydat->GetNN()==vdat->GetNN() && zdat->GetNN()==vdat->GetNN());\r
        if(!both && (xdat->GetNx()!=mx || ydat->GetNx()!=my || zdat->GetNx()!=mz))      return; // incompatible dimensions\r
@@ -1317,3 +1343,195 @@ void MGL_EXPORT mgl_datac_refill_xyz(HADT dat, HCDT xdat, HCDT ydat, HCDT zdat,
        }\r
 }\r
 //-----------------------------------------------------------------------------\r
+MGL_NO_EXPORT void *mgl_diffc_3(void *par)\r
+{\r
+       mglThreadC *t=(mglThreadC *)par;\r
+       long nx=t->p[0], ny=t->p[1], nz=t->p[2], nn=t->n, n2=nx*ny;\r
+       dual *b=t->a,au,av,aw;\r
+       HCDT x=(HCDT)(t->c),y=(HCDT)(t->d),z=(HCDT)(t->e);\r
+       const dual *a=t->b;\r
+#if !MGL_HAVE_PTHREAD\r
+#pragma omp parallel for private(au,av,aw)\r
+#endif\r
+       for(long i0=t->id;i0<nn;i0+=mglNumThr)\r
+       {\r
+               long i=i0%nx, j=((i0/nx)%ny), k=i0/(nx*ny);\r
+               mreal xu,xv,xw,yu,yv,yw,zu,zv,zw;\r
+               if(i==0)\r
+               {\r
+                       au = mreal(3)*a[i0]-mreal(4)*a[i0+1]+a[i0+2];\r
+                       xu = 3*x->vthr(i0)-4*x->vthr(i0+1)+x->vthr(i0+2);\r
+                       yu = 3*y->vthr(i0)-4*y->vthr(i0+1)+y->vthr(i0+2);\r
+                       zu = 3*z->vthr(i0)-4*z->vthr(i0+1)+z->vthr(i0+2);\r
+               }\r
+               else if(i==nx-1)\r
+               {\r
+                       au = mreal(3)*a[i0]-mreal(4)*a[i0-1]+a[i0-2];\r
+                       xu = 3*x->vthr(i0)-4*x->vthr(i0-1)+x->vthr(i0-2);\r
+                       yu = 3*y->vthr(i0)-4*y->vthr(i0-1)+y->vthr(i0-2);\r
+                       zu = 3*z->vthr(i0)-4*z->vthr(i0-1)+z->vthr(i0-2);\r
+               }\r
+               else\r
+               {\r
+                       au = a[i0+1]-a[i0-1];\r
+                       xu = x->vthr(i0+1)-x->vthr(i0-1);\r
+                       yu = y->vthr(i0+1)-y->vthr(i0-1);\r
+                       zu = z->vthr(i0+1)-z->vthr(i0-1);\r
+               }\r
+               if(j==0)\r
+               {\r
+                       av = mreal(3)*a[i0]-mreal(4)*a[i0+nx]+a[i0+2*nx];\r
+                       xv = 3*x->vthr(i0)-4*x->vthr(i0+nx)+x->vthr(i0+2*nx);\r
+                       yv = 3*y->vthr(i0)-4*y->vthr(i0+nx)+y->vthr(i0+2*nx);\r
+                       zv = 3*z->vthr(i0)-4*z->vthr(i0+nx)+z->vthr(i0+2*nx);\r
+               }\r
+               else if(j==ny-1)\r
+               {\r
+                       av = mreal(3)*a[i0]-mreal(4)*a[i0-nx]+a[i0+(ny-3)*nx];\r
+                       xv = 3*x->vthr(i0)-4*x->vthr(i0-nx)+x->vthr(i0-2*nx);\r
+                       yv = 3*y->vthr(i0)-4*y->vthr(i0-nx)+y->vthr(i0-2*nx);\r
+                       zv = 3*z->vthr(i0)-4*z->vthr(i0-nx)+z->vthr(i0-2*nx);\r
+               }\r
+               else\r
+               {\r
+                       av = a[i0+nx]-a[i0-nx];\r
+                       xv = x->vthr(i0+nx)-x->vthr(i0-nx);\r
+                       yv = y->vthr(i0+nx)-y->vthr(i0-nx);\r
+                       zv = z->vthr(i0+nx)-z->vthr(i0-nx);\r
+               }\r
+               if(k==0)\r
+               {\r
+                       aw = mreal(3)*a[i0]-mreal(4)*a[i0+n2]+a[i0+2*n2];\r
+                       xw = 3*x->vthr(i0)-4*x->vthr(i0+n2)+x->vthr(i0+2*n2);\r
+                       yw = 3*y->vthr(i0)-4*y->vthr(i0+n2)+y->vthr(i0+2*n2);\r
+                       zw = 3*z->vthr(i0)-4*z->vthr(i0+n2)+z->vthr(i0+2*n2);\r
+               }\r
+               else if(k==nz-1)\r
+               {\r
+                       aw = mreal(3)*a[i0]-mreal(4)*a[i0-n2]+a[i0-2*n2];\r
+                       xw = 3*x->vthr(i0)-4*x->vthr(i0-n2)+x->vthr(i0-2*n2);\r
+                       yw = 3*y->vthr(i0)-4*y->vthr(i0-n2)+y->vthr(i0-2*n2);\r
+                       zw = 3*z->vthr(i0)-4*z->vthr(i0-n2)+z->vthr(i0-2*n2);\r
+               }\r
+               else\r
+               {\r
+                       aw = a[i0+n2]-a[i0-n2];\r
+                       xw = x->vthr(i0+n2)-x->vthr(i0-n2);\r
+                       yw = y->vthr(i0+n2)-y->vthr(i0-n2);\r
+                       zw = z->vthr(i0+n2)-z->vthr(i0-n2);\r
+               }\r
+               b[i0] = (au*yv*zw-av*yu*zw-au*yw*zv+aw*yu*zv+av*yw*zu-aw*yv*zu) / (xu*yv*zw-xv*yu*zw-xu*yw*zv+xw*yu*zv+xv*yw*zu-xw*yv*zu);\r
+       }\r
+       return 0;\r
+}\r
+MGL_NO_EXPORT void *mgl_diffc_2(void *par)\r
+{\r
+       mglThreadC *t=(mglThreadC *)par;\r
+       long nx=t->p[0], ny=t->p[1], nn=t->n, same=t->p[2];\r
+       dual *b=t->a,au,av;\r
+       HCDT x=(HCDT)(t->c),y=(HCDT)(t->d);\r
+       const dual *a=t->b;\r
+#if !MGL_HAVE_PTHREAD\r
+#pragma omp parallel for private(au,av)\r
+#endif\r
+       for(long i0=t->id;i0<nn;i0+=mglNumThr)\r
+       {\r
+               long i=i0%nx, j=((i0/nx)%ny), i1 = same ? i0 : i0%(nx*ny);\r
+               mreal xu,xv,yu,yv;\r
+               if(i==0)\r
+               {\r
+                       au = mreal(3)*a[i0]-mreal(4)*a[i0+1]+a[i0+2];\r
+                       xu = 3*x->vthr(i1)-4*x->vthr(i1+1)+x->vthr(i1+2);\r
+                       yu = 3*y->vthr(i1)-4*y->vthr(i1+1)+y->vthr(i1+2);\r
+               }\r
+               else if(i==nx-1)\r
+               {\r
+                       au = mreal(3)*a[i0]-mreal(4)*a[i0-1]+a[i0-2];\r
+                       xu = 3*x->vthr(i1)-4*x->vthr(i1-1)+x->vthr(i1-2);\r
+                       yu = 3*y->vthr(i1)-4*y->vthr(i1-1)+y->vthr(i1-2);\r
+               }\r
+               else\r
+               {\r
+                       au = a[i0+1]-a[i0-1];\r
+                       xu = x->vthr(i1+1)-x->vthr(i1-1);\r
+                       yu = y->vthr(i1+1)-y->vthr(i1-1);\r
+               }\r
+               if(j==0)\r
+               {\r
+                       av = mreal(3)*a[i0]-mreal(4)*a[i0+nx]+a[i0+2*nx];\r
+                       xv = 3*x->vthr(i1)-4*x->vthr(i1+nx)+x->vthr(i1+2*nx);\r
+                       yv = 3*y->vthr(i1)-4*y->vthr(i1+nx)+y->vthr(i1+2*nx);\r
+               }\r
+               else if(j==ny-1)\r
+               {\r
+                       av = mreal(3)*a[i0]-mreal(4)*a[i0-nx]+a[i0-2*nx];\r
+                       xv = 3*x->vthr(i1)-4*x->vthr(i1-nx)+x->vthr(i1-2*nx);\r
+                       yv = 3*y->vthr(i1)-4*y->vthr(i1-nx)+y->vthr(i1-2*nx);\r
+               }\r
+               else\r
+               {\r
+                       av = a[i0+nx]-a[i0-nx];\r
+                       xv = x->vthr(i1+nx)-x->vthr(i1-nx);\r
+                       yv = y->vthr(i1+nx)-y->vthr(i1-nx);\r
+               }\r
+               b[i0] = (av*yu-au*yv)/(xv*yu-xu*yv);\r
+       }\r
+       return 0;\r
+}\r
+MGL_NO_EXPORT void *mgl_diffc_1(void *par)\r
+{\r
+       mglThreadC *t=(mglThreadC *)par;\r
+       long nx=t->p[0], nn=t->n, same=t->p[1];\r
+       dual *b=t->a,au;\r
+       HCDT x=(HCDT)(t->c);\r
+       const dual *a=t->b;\r
+#if !MGL_HAVE_PTHREAD\r
+#pragma omp parallel for private(au)\r
+#endif\r
+       for(long i0=t->id;i0<nn;i0+=mglNumThr)\r
+       {\r
+               long i=i0%nx, i1 = same ? i0 : i;\r
+               mreal xu;\r
+               if(i==0)\r
+               {\r
+                       au = mreal(3)*a[i0]-mreal(4)*a[i0+1]+a[i0+2];\r
+                       xu = 3*x->vthr(i1)-4*x->vthr(i1+1)+x->vthr(i1+2);\r
+               }\r
+               else if(i==nx-1)\r
+               {\r
+                       au = mreal(3)*a[i0]-mreal(4)*a[i0-1]+a[i0-2];\r
+                       xu = 3*x->vthr(i1)-4*x->vthr(i1-1)+x->vthr(i1-2);\r
+               }\r
+               else\r
+               {\r
+                       au = a[i0+1]-a[i0-1];\r
+                       xu = x->vthr(i1+1)-x->vthr(i1-1);\r
+               }\r
+               b[i0] = au/xu;\r
+       }\r
+       return 0;\r
+}\r
+void MGL_EXPORT mgl_datac_diff_par(HADT d, HCDT x, HCDT y, HCDT z)\r
+{\r
+       long nx=d->GetNx(),ny=d->GetNy(),nz=d->GetNz(), nn=nx*ny*nz;\r
+       if(nx<2 || ny<2)        return;\r
+       dual *b = new dual[nn]; memset(b,0,nn*sizeof(dual));\r
+       long p[3]={nx,ny,nz};\r
+\r
+       if(x&&y&&z && x->GetNN()==nn && y->GetNN()==nn && z->GetNN()==nn)\r
+               mglStartThreadC(mgl_diffc_3,0,nn,b,d->a,(const dual *)x,p,0,(const dual *)y,(const dual *)z);\r
+       else if(x&&y && x->GetNx()*x->GetNy()==nx*ny && y->GetNx()*y->GetNy()==nx*ny)\r
+       {\r
+               p[2]=(x->GetNz()==nz && y->GetNz()==nz);\r
+               mglStartThreadC(mgl_diffc_2,0,nn,b,d->a,(const dual *)x,p,0,(const dual *)y);\r
+       }\r
+       else if(x && x->GetNx()==nx)\r
+       {\r
+               p[1]=(x->GetNy()*x->GetNz()==ny*nz);\r
+               mglStartThreadC(mgl_diffc_1,0,nn,b,d->a,(const dual *)x,p,0,0);\r
+       }\r
+       memcpy(d->a,b,nn*sizeof(dual)); delete []b;\r
+}\r
+void MGL_EXPORT mgl_datac_diff_par_(uintptr_t *d, uintptr_t *v1, uintptr_t *v2, uintptr_t *v3)\r
+{      mgl_datac_diff_par(_DC_,_DA_(v1),_DA_(v2),_DA_(v3));    }\r
+//-----------------------------------------------------------------------------\r
index 5d5ab4ddea1c3468f03f2db793bb7dbf45529adf..7f889c1d1101b9f5b9862df19abeb964497a07d3 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * data_new.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -62,7 +62,7 @@ HADT MGL_EXPORT mgl_datac_subdata_ext(HCDT d, HCDT xx, HCDT yy, HCDT zz)
                mglData tmp;    tmp.a[0]=-1;\r
                return mgl_datac_subdata_ext(d,xx?xx:&tmp,yy?yy:&tmp,zz?zz:&tmp);\r
        }\r
-       \r
+\r
        long n=0,m=0,l=0,j,k;\r
        bool ix=false, iy=false, iz=false;\r
        if(xx->GetNz()>1)       // 3d data\r
@@ -110,51 +110,53 @@ HADT MGL_EXPORT mgl_datac_subdata_ext(HCDT d, HCDT xx, HCDT yy, HCDT zz)
        long nx=d->GetNx(),ny=d->GetNy(),nz=d->GetNz();\r
        long vx=long(xx->v(0)), vy=long(yy->v(0)), vz=long(zz->v(0));\r
        const mglDataC *dd = dynamic_cast<const mglDataC *>(d);\r
+       mglDataC *r;\r
        if(n*m*l>1)     // this is 2d or 3d data\r
        {\r
                mglDataV tx(n,m,l),ty(n,m,l),tz(n,m,l);\r
                if(!ix) {       xx = &tx;       if(vx>=0)       tx.Fill(vx);    else tx.All();  }\r
                if(!iy) {       yy = &ty;       if(vy>=0)       ty.Fill(vy);    else ty.All();  }\r
                if(!iz) {       zz = &tz;       if(vz>=0)       tz.Fill(vz);    else tz.All();  }\r
-               mglDataC *r=new mglDataC(n,m,l);\r
+               r=new mglDataC(n,m,l);\r
                if(dd)\r
 #pragma omp parallel for\r
                        for(long i0=0;i0<n*m*l;i0++)\r
                        {\r
-                               register long x=long(0.5+xx->vthr(i0)), y=long(0.5+yy->vthr(i0)), z=long(0.5+zz->vthr(i0));\r
+                               long x=long(0.5+xx->vthr(i0)), y=long(0.5+yy->vthr(i0)), z=long(0.5+zz->vthr(i0));\r
                                r->a[i0] = (x>=0 && x<nx && y>=0 && y<ny && z>=0 && z<nz)?dd->a[x+nx*(y+ny*z)]:NAN;\r
                        }\r
                else\r
 #pragma omp parallel for\r
                        for(long i0=0;i0<n*m*l;i0++)\r
                        {\r
-                               register long x=long(0.5+xx->vthr(i0)), y=long(0.5+yy->vthr(i0)), z=long(0.5+zz->vthr(i0));\r
+                               long x=long(0.5+xx->vthr(i0)), y=long(0.5+yy->vthr(i0)), z=long(0.5+zz->vthr(i0));\r
                                r->a[i0] = (x>=0 && x<nx && y>=0 && y<ny && z>=0 && z<nz)?d->v(x,y,z):NAN;\r
                        }\r
-               return r;\r
        }\r
-       // this is 1d data -> try as normal SubData()\r
-       mglDataV tx(nx),ty(ny),tz(nz);  tx.Fill(0,nx-1);        ty.Fill(0,ny-1);        tz.Fill(0,nz-1);\r
-       if(xx->GetNx()>1 || vx>=0)      n=xx->GetNx();  else    {       n=nx;   xx = &tx;       }\r
-       if(yy->GetNx()>1 || vy>=0)      m=yy->GetNx();  else    {       m=ny;   yy = &ty;       }\r
-       if(zz->GetNx()>1 || vz>=0)      l=zz->GetNx();  else    {       l=nz;   zz = &tz;       }\r
-       mglDataC *r=new mglDataC(n,m,l);\r
-       if(dd)\r
+       else    // this is 1d data -> try as normal SubData()\r
+       {\r
+               mglDataV tx(nx),ty(ny),tz(nz);  tx.Fill(0,nx-1);        ty.Fill(0,ny-1);        tz.Fill(0,nz-1);\r
+               if(xx->GetNx()>1 || vx>=0)      n=xx->GetNx();  else    {       n=nx;   xx = &tx;       }\r
+               if(yy->GetNx()>1 || vy>=0)      m=yy->GetNx();  else    {       m=ny;   yy = &ty;       }\r
+               if(zz->GetNx()>1 || vz>=0)      l=zz->GetNx();  else    {       l=nz;   zz = &tz;       }\r
+               r=new mglDataC(n,m,l);\r
+               if(dd)\r
 #pragma omp parallel for collapse(3)\r
-               for(long k=0;k<l;k++)   for(long j=0;j<m;j++)   for(long i=0;i<n;i++)\r
-               {\r
-                       register long x=long(0.5+xx->v(i)), y=long(0.5+yy->v(j)), z=long(0.5+zz->v(k));\r
-                       r->a[i+n*(j+m*k)] = (x>=0 && x<nx && y>=0 && y<ny && z>=0 && z<nz)?dd->a[x+nx*(y+ny*z)]:NAN;\r
-               }\r
-       else\r
+                       for(long k=0;k<l;k++)   for(long j=0;j<m;j++)   for(long i=0;i<n;i++)\r
+                       {\r
+                               long x=long(0.5+xx->v(i)), y=long(0.5+yy->v(j)), z=long(0.5+zz->v(k));\r
+                               r->a[i+n*(j+m*k)] = (x>=0 && x<nx && y>=0 && y<ny && z>=0 && z<nz)?dd->a[x+nx*(y+ny*z)]:NAN;\r
+                       }\r
+               else\r
 #pragma omp parallel for collapse(3)\r
-               for(long k=0;k<l;k++)   for(long j=0;j<m;j++)   for(long i=0;i<n;i++)\r
-               {\r
-                       register long x=long(0.5+xx->v(i)), y=long(0.5+yy->v(j)), z=long(0.5+zz->v(k));\r
-                       r->a[i+n*(j+m*k)] = (x>=0 && x<nx && y>=0 && y<ny && z>=0 && z<nz)?d->v(x,y,z):NAN;\r
-               }\r
-       if(m==1)        {       r->ny=r->nz;    r->nz=1;        }// "squeeze" dimensions\r
-       if(n==1)        {       r->nx=r->ny;    r->ny=r->nz;    r->nz=1;        r->NewId();}\r
+                       for(long k=0;k<l;k++)   for(long j=0;j<m;j++)   for(long i=0;i<n;i++)\r
+                       {\r
+                               long x=long(0.5+xx->v(i)), y=long(0.5+yy->v(j)), z=long(0.5+zz->v(k));\r
+                               r->a[i+n*(j+m*k)] = (x>=0 && x<nx && y>=0 && y<ny && z>=0 && z<nz)?d->v(x,y,z):NAN;\r
+                       }\r
+               if(m==1)        {       r->ny=r->nz;    r->nz=1;        }// "squeeze" dimensions\r
+               if(n==1)        {       r->nx=r->ny;    r->ny=r->nz;    r->nz=1;        r->NewId();}\r
+       }\r
        return r;\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -201,7 +203,7 @@ MGL_NO_EXPORT void *mgl_cresize(void *par)
 #endif\r
        for(long i0=t->id;i0<t->n;i0+=mglNumThr)\r
        {\r
-               register mreal i=i0%nx, j=((i0/nx)%ny), k=i0/(nx*ny);\r
+               mreal i=(i0%nx), j=((i0/nx)%ny), k=(i0/(nx*ny));\r
                b[i0] = mglSpline3Cs(a,n1,n2,n3, c[0]+i*c[1], c[2]+j*c[3], c[4]+k*c[5]);\r
        }\r
        return 0;\r
@@ -210,7 +212,7 @@ HADT MGL_EXPORT mgl_datac_resize_box(HCDT dat, long mx,long my,long mz, mreal x1
 {      // NOTE: only for mglDataC\r
        const mglDataC *d=dynamic_cast<const mglDataC *>(dat);\r
        if(!d)  return 0;\r
-       register long nx = d->nx-1, ny = d->ny-1, nz = d->nz-1;\r
+       long nx = d->nx-1, ny = d->ny-1, nz = d->nz-1;\r
        mx = mx<1 ? nx+1:mx;    my = my<1 ? ny+1:my;    mz = mz<1 ? nz+1:mz;\r
        mglDataC *r=new mglDataC(mx,my,mz);\r
 \r
@@ -290,7 +292,7 @@ MGL_NO_EXPORT void *mgl_sumc_y(void *par)
 #endif\r
        for(long i=t->id;i<nn;i+=mglNumThr)\r
        {\r
-               register long k = (i%nx)+nx*ny*(i/nx);  b[i]=0;\r
+               long k = (i%nx)+nx*ny*(i/nx);   b[i]=0;\r
                for(long j=0;j<ny;j++)  b[i] += a[k+nx*j];\r
                b[i] /= ny;\r
        }\r
@@ -307,7 +309,7 @@ MGL_NO_EXPORT void *mgl_sumc_x(void *par)
 #endif\r
        for(long i=t->id;i<nn;i+=mglNumThr)\r
        {\r
-               register long k = i*nx; b[i]=0;\r
+               long k = i*nx;  b[i]=0;\r
                for(long j=0;j<nx;j++)  b[i] += a[j+k];\r
                b[i] /= nx;\r
        }\r
@@ -330,20 +332,21 @@ HADT MGL_EXPORT mgl_datac_sum(HCDT dat, const char *dir)
        if(strchr(dir,'z') && nz>1)\r
        {\r
                mglStartThreadC(mgl_sumc_z,0,nx*ny,b,c,0,p);\r
-               memcpy(c,b,nx*ny*sizeof(mreal));        p[2] = 1;\r
+               memcpy(c,b,nx*ny*sizeof(dual)); p[2] = 1;\r
        }\r
        if(strchr(dir,'y') && ny>1)\r
        {\r
                mglStartThreadC(mgl_sumc_y,0,nx*p[2],b,c,0,p);\r
-               memcpy(c,b,nx*p[2]*sizeof(mreal));      p[1] = p[2];    p[2] = 1;\r
+               memcpy(c,b,nx*p[2]*sizeof(dual));       p[1] = p[2];    p[2] = 1;\r
        }\r
        if(strchr(dir,'x') && nx>1)\r
        {\r
                mglStartThreadC(mgl_sumc_x,0,p[1]*p[2],b,c,0,p);\r
                p[0] = p[1];    p[1] = p[2];    p[2] = 1;\r
+               memcpy(c,b,p[0]*p[1]*sizeof(dual));\r
        }\r
        mglDataC *r=new mglDataC(p[0],p[1],p[2]);\r
-       memcpy(r->a,b,p[0]*p[1]*p[2]*sizeof(dual));\r
+       memcpy(r->a,c,p[0]*p[1]*p[2]*sizeof(dual));\r
        delete []b;     delete []c;     return r;\r
 }\r
 uintptr_t MGL_EXPORT mgl_datac_sum_(uintptr_t *d, const char *dir,int l)\r
@@ -368,10 +371,10 @@ HADT MGL_EXPORT mgl_datac_momentum(HCDT dat, char dir, const char *how)
 #pragma omp parallel for\r
                for(long i=0;i<nx;i++)\r
                {\r
-                       register dual i1=0,i0=0;\r
+                       dual i1=0,i0=0;\r
                        for(long j=0;j<ny*nz;j++)\r
                        {\r
-                               register dual u=dat->vthr(i+nx*j);\r
+                               dual u=dat->vthr(i+nx*j);\r
                                i0 += u;        i1 += u*res->a[i+nx*j];\r
                        }\r
                        b->a[i] = i0!=mreal(0) ? i1/i0 : 0;\r
@@ -383,10 +386,10 @@ HADT MGL_EXPORT mgl_datac_momentum(HCDT dat, char dir, const char *how)
 #pragma omp parallel for\r
                for(long i=0;i<ny;i++)\r
                {\r
-                       register dual i1=0,i0=0;\r
+                       dual i1=0,i0=0;\r
                        for(long k=0;k<nz;k++)  for(long j=0;j<nx;j++)\r
                        {\r
-                               register dual u=dat->v(j,i,k);\r
+                               dual u=dat->v(j,i,k);\r
                                i0 += u;        i1 += u*res->a[j+nx*(i+ny*k)];\r
                        }\r
                        b->a[i] = i0!=mreal(0) ? i1/i0 : 0;\r
@@ -399,10 +402,10 @@ HADT MGL_EXPORT mgl_datac_momentum(HCDT dat, char dir, const char *how)
 #pragma omp parallel for\r
                for(long i=0;i<nz;i++)\r
                {\r
-                       register dual i1=0,i0=0;\r
+                       dual i1=0,i0=0;\r
                        for(long j=0;j<nn;j++)\r
                        {\r
-                               register dual u=dat->vthr(j+nn*i);\r
+                               dual u=dat->vthr(j+nn*i);\r
                                i0 += u;        i1 += u*res->a[j+nn*i];\r
                        }\r
                        b->a[i] = i0!=mreal(0) ? i1/i0 : 0;\r
@@ -421,25 +424,27 @@ HADT MGL_EXPORT mgl_datac_evaluate(HCDT dat, HCDT idat, HCDT jdat, HCDT kdat, in
        const mglDataC *dc=dynamic_cast<const mglDataC *>(dat);\r
        long nx=dat->GetNx(), ny=dat->GetNy(), nz=dat->GetNz();\r
        mglDataC *r=new mglDataC(idat->GetNx(),idat->GetNy(),idat->GetNz());\r
+       mreal dx = nx-1, dy = ny-1, dz = nz-1;\r
+       if(!norm)       dx=dy=dz=1;\r
        if(dd)\r
 #pragma omp parallel for\r
                for(long i=0;i<idat->GetNN();i++)\r
                {\r
-                       mreal x=idat->vthr(i), y=jdat?jdat->vthr(i):0, z=kdat?kdat->vthr(i):0;\r
+                       mreal x=dx*idat->vthr(i), y=jdat?dy*jdat->vthr(i):0, z=kdat?dz*kdat->vthr(i):0;\r
                        r->a[i] = mgl_isnum(x*y*z)?mglSpline3st<mreal>(dd->a,nx,ny,nz, x,y,z):NAN;\r
                }\r
        else if(dc)\r
 #pragma omp parallel for\r
                for(long i=0;i<idat->GetNN();i++)\r
                {\r
-                       mreal x=idat->vthr(i), y=jdat?jdat->vthr(i):0, z=kdat?kdat->vthr(i):0;\r
+                       mreal x=dx*idat->vthr(i), y=jdat?dy*jdat->vthr(i):0, z=kdat?dz*kdat->vthr(i):0;\r
                        r->a[i] = mgl_isnum(x*y*z)?mglSpline3st<dual>(dc->a,nx,ny,nz, x,y,z):NAN;\r
                }\r
        else\r
 #pragma omp parallel for\r
                for(long i=0;i<idat->GetNN();i++)\r
                {\r
-                       mreal x=idat->vthr(i), y=jdat?jdat->vthr(i):0, z=kdat?kdat->vthr(i):0;\r
+                       mreal x=dx*idat->vthr(i), y=jdat?dy*jdat->vthr(i):0, z=kdat?dz*kdat->vthr(i):0;\r
                        r->a[i] = mgl_isnum(x*y*z)?dat->linear(x,y,z):NAN;;\r
                }\r
        return r;\r
@@ -481,7 +486,7 @@ void MGL_EXPORT mgl_datac_mul_dat(HADT d, HCDT a)
        long nx=d->nx, ny=d->ny, nz=d->nz;\r
        long mx=a->GetNx(), my=a->GetNy(), mz=a->GetNz();\r
        const mglDataC *c = dynamic_cast<const mglDataC*>(a);\r
-       \r
+\r
        if(mz*my*mx==1)\r
        {\r
                dual v=c?c->a[0]:a->v(0);\r
@@ -515,7 +520,7 @@ void MGL_EXPORT mgl_datac_div_dat(HADT d, HCDT a)
        long nx=d->nx, ny=d->ny, nz=d->nz;\r
        long mx=a->GetNx(), my=a->GetNy(), mz=a->GetNz();\r
        const mglDataC *c = dynamic_cast<const mglDataC*>(a);\r
-       \r
+\r
        if(mz*my*mx==1)\r
        {\r
                dual v=c?c->a[0]:a->v(0);\r
@@ -549,7 +554,7 @@ void MGL_EXPORT mgl_datac_add_dat(HADT d, HCDT a)
        long nx=d->nx, ny=d->ny, nz=d->nz;\r
        long mx=a->GetNx(), my=a->GetNy(), mz=a->GetNz();\r
        const mglDataC *c = dynamic_cast<const mglDataC*>(a);\r
-       \r
+\r
        if(mz*my*mx==1)\r
        {\r
                dual v=c?c->a[0]:a->v(0);\r
@@ -583,7 +588,7 @@ void MGL_EXPORT mgl_datac_sub_dat(HADT d, HCDT a)
        long nx=d->nx, ny=d->ny, nz=d->nz;\r
        long mx=a->GetNx(), my=a->GetNy(), mz=a->GetNz();\r
        const mglDataC *c = dynamic_cast<const mglDataC*>(a);\r
-       \r
+\r
        if(mz*my*mx==1)\r
        {\r
                dual v=c?c->a[0]:a->v(0);\r
@@ -621,3 +626,81 @@ void MGL_EXPORT mgl_datac_div_num_(uintptr_t *d, dual *b)          {       mgl_datac_div_num(_
 void MGL_EXPORT mgl_datac_add_num_(uintptr_t *d, dual *b)              {       mgl_datac_add_num(_DC_, *b);    }\r
 void MGL_EXPORT mgl_datac_sub_num_(uintptr_t *d, dual *b)              {       mgl_datac_sub_num(_DC_, *b);    }\r
 //-----------------------------------------------------------------------------\r
+HADT MGL_EXPORT mgl_datac_section(HCDT dat, HCDT ids, char dir, mreal val)\r
+{\r
+       long di = 1, n = dat->GetNx();\r
+       if(dir=='y')    {       di = dat->GetNx();      n = dat->GetNy();       }\r
+       if(dir=='z')    {       di = dat->GetNx()*dat->GetNy(); n = dat->GetNz();       }\r
+       // first collect position of key values\r
+       std::vector<long> pos;  pos.push_back(0);\r
+       if(mgl_isnan(val))      for(long i=1;i<n;i++)\r
+       {\r
+               if(mgl_isnan(dat->vthr(i*di)))  pos.push_back(i);\r
+       }\r
+       else    for(long i=0;i<n;i++)\r
+       {\r
+               if(dat->vthr(i*di)==val)        pos.push_back(i);\r
+       }\r
+       pos.push_back(n);       // add last point (size of data)\r
+       // now collect required position from section and its lengths\r
+       std::vector<long> ls, ps;\r
+       long np = pos.size()-1, nl=0;\r
+       if(np<1)        return NULL;    // nothing to do\r
+       for(long i=0;i<ids->GetNN();i++)\r
+       {\r
+               long j = mgl_int(ids->vthr(i)+0.5);     j = j<0?np+j:j;\r
+               if(j>=0 && j<np)\r
+               {       long l = pos[j+1]-pos[j];       nl += l;\r
+                       ls.push_back(l);        ps.push_back(pos[j]);   }\r
+       }\r
+       if(nl==0)       return NULL;\r
+       mglDataC *r=0;\r
+       size_t ns = ps.size();\r
+       if(dir=='y')\r
+       {\r
+               long nx=dat->GetNx(), nz=dat->GetNz(), sh=0;\r
+               r = new mglDataC(nx,nl,nz);\r
+               for(size_t s=0;s<ns;s++)\r
+               {\r
+                       long pp = ps[s];\r
+#pragma omp parallel for collapse(3)\r
+                       for(long k=0;k<nz;k++)  for(long j=0;j<ls[s];j++)       for(long i=0;i<nx;i++)\r
+                               r->a[i+nx*(sh+j+nl*k)] = dat->vc(i,pp+j,k);\r
+                       sh += ls[s];\r
+               }\r
+       }\r
+       else if(dir=='x')\r
+       {\r
+               long ny=dat->GetNy(), nz=dat->GetNz(), sh=0;\r
+               r = new mglDataC(nl,ny,nz);\r
+               for(size_t s=0;s<ns;s++)\r
+               {\r
+                       long pp = ps[s];\r
+#pragma omp parallel for collapse(3)\r
+                       for(long k=0;k<nz;k++)  for(long j=0;j<ny;j++)  for(long i=0;i<ls[s];i++)\r
+                               r->a[sh+i+nl*(j+ny*k)] = dat->vc(pp+i,j,k);\r
+                       sh += ls[s];\r
+               }\r
+       }\r
+       else if(dir=='z')\r
+       {\r
+               long nx=dat->GetNx(), ny=dat->GetNy(), sh=0;\r
+               r = new mglDataC(nx,ny,nl);\r
+               for(size_t s=0;s<ns;s++)\r
+               {\r
+                       long pp = ps[s];\r
+#pragma omp parallel for collapse(3)\r
+                       for(long k=0;k<ls[s];k++)       for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
+                               r->a[i+nx*(j+ny*(sh+k))] = dat->vc(i,j,pp+k);\r
+                       sh += ls[s];\r
+               }\r
+       }\r
+       return r;\r
+}\r
+HADT MGL_EXPORT mgl_datac_section_val(HCDT dat, long id, char dir, mreal val)\r
+{      mglData v;      v.a[0]=id;      return mgl_datac_section(dat,&v,dir,val);       }\r
+uintptr_t MGL_EXPORT mgl_datac_section_(uintptr_t *d, uintptr_t *ids, const char *dir, mreal *val,int)\r
+{      return uintptr_t(mgl_datac_section(_DT_,_DA_(ids),dir[0],*val));        }\r
+uintptr_t MGL_EXPORT mgl_datac_section_val_(uintptr_t *d, int *id, const char *dir, mreal *val,int)\r
+{      return uintptr_t(mgl_datac_section_val(_DT_,*id,dir[0],*val));  }\r
+//-----------------------------------------------------------------------------\r
index a1dee5d99bd546ff467fb55ad2c34cda0a009160..792633e96a997ea42da3df6cc6d5404fd18e2990 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * data_io.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -51,11 +51,44 @@ uintptr_t MGL_EXPORT mgl_create_datac_file_(const char *fname,int l)
 void MGL_EXPORT mgl_delete_datac_(uintptr_t *d)\r
 {      if(_DC_)        delete _DC_;    }\r
 //-----------------------------------------------------------------------------\r
+mdual MGL_EXPORT mgl_atoc(const char *s, int adv)\r
+{\r
+       double re=0,im=0;       size_t ll=strlen(s);\r
+       while(s[ll]<=' ')       ll--;\r
+       if(adv && *s=='(')              sscanf(s,"(%lg,%lg)",&re,&im);\r
+       else if(*s=='i')                {       re=0;   im=atof(s+1);   }\r
+       else if(adv && *s=='[') sscanf(s,"[%lg,%lg]",&re,&im);\r
+       else if(adv && *s=='{') sscanf(s,"{%lg,%lg}",&re,&im);\r
+       else if(s[ll]=='i')\r
+       {\r
+               double a,b;     //s[ll] = 0;\r
+               int s1=sscanf(s,"%lg+%lg",&re,&im);\r
+               int s2=sscanf(s,"%lg-%lg",&a,&b);\r
+               if(s1<2)\r
+               {\r
+                       if(s2==2)       {       re=a;   im=-b;  }\r
+                       else    {       im=atof(s);     re=0;   }\r
+               }\r
+       }\r
+       else\r
+       {\r
+               double a,b;\r
+               int s1=sscanf(s,"%lg+i%lg",&re,&im);\r
+               int s2=sscanf(s,"%lg-i%lg",&a,&b);\r
+               if(s1<2)\r
+               {\r
+                       if(s2==2)       {       re=a;   im=-b;  }\r
+                       else    {       re=atof(s);     im=0;   }\r
+               }\r
+       }\r
+       return re+im*mgl_I;\r
+}\r
+//-----------------------------------------------------------------------------\r
 void mglFromStr(HADT d,char *buf,long NX,long NY,long NZ)      // TODO: add multithreading read\r
 {\r
        if(NX<1 || NY <1 || NZ<1)       return;\r
        mgl_datac_create(d, NX,NY,NZ);\r
-       const std::string loc = setlocale(LC_NUMERIC, NULL);    setlocale(LC_NUMERIC, "C");\r
+       const std::string loc = setlocale(LC_NUMERIC, "C");\r
        std::vector<char *> lines;\r
        std::vector<std::vector<dual> > numbs;\r
        lines.push_back(buf);\r
@@ -68,28 +101,18 @@ void mglFromStr(HADT d,char *buf,long NX,long NY,long NZ)  // TODO: add multithre
        {\r
                char *b = lines[k];\r
                long nb = strlen(b);\r
-               register long i=0, j=0;\r
-\r
-               while(j<nb)\r
+               for(long j=0;j<nb;j++)\r
                {\r
-                       while(j<nb && b[j]<=' ')        j++;\r
+                       while(j<nb && b[j]<=' ')        j++;    // skip first spaces\r
                        if(j>=nb)       break;\r
-                       while(b[j]=='#')                // skip comment\r
+                       if(b[j]=='#')\r
                        {\r
-                               if(i>0 || b[j+1]!='#')  // this is columns id\r
-                                       while(j<nb && !isn(b[j]))       j++;\r
-                               else    // NOTE I suppose that only single line contain column ids\r
-                               {\r
-                                       while(j<nb && !isn(b[j]))\r
-                                       {\r
-                                               if(b[j]>='a' && b[j]<='z')      d->id.push_back(b[j]);\r
-                                               j++;\r
-                                       }\r
-                               }\r
-                               while(j<nb && b[j]<=' ')        j++;\r
+                               if(j<nb-1 && b[j+1]=='#')       for(long i=j+2;i<nb;i++)\r
+                                       if(b[i]>='a' && b[i]<='z')      d->id.push_back(b[i]);\r
+                               break;\r
                        }\r
                        char *s=b+j;\r
-                       register long sk=0;\r
+                       long sk=0;\r
                        while(j<nb && b[j]>' ' && ((b[j]!=',' && b[j]!=' ') || sk!=0) && b[j]!=';')\r
                        {\r
                                if(strchr("[{(",b[j]))  sk++;\r
@@ -97,38 +120,10 @@ void mglFromStr(HADT d,char *buf,long NX,long NY,long NZ)  // TODO: add multithre
                                j++;\r
                        }\r
                        b[j]=0;\r
-                       double re=0,im=0;       size_t ll=strlen(s);\r
-                       while(s[ll]<=' ')       ll--;\r
-                       if(*s=='(')             sscanf(s,"(%lg,%lg)",&re,&im);\r
-                       else if(*s=='i')        {       re=0;   im=atof(s+1);   }\r
-                       else if(*s=='[')        sscanf(s,"[%lg,%lg]",&re,&im);\r
-                       else if(*s=='{')        sscanf(s,"{%lg,%lg}",&re,&im);\r
-                       else if(s[ll]=='i')\r
-                       {\r
-                               double a,b;     s[ll] = 0;\r
-                               int s1=sscanf(s,"%lg+%lg",&re,&im);\r
-                               int s2=sscanf(s,"%lg-%lg",&a,&b);\r
-                               if(s1<2)\r
-                               {\r
-                                 if(s2==2)     {       re=a;   im=-b;  }\r
-                                 else  {       im=atof(s);     re=0;   }\r
-                               }\r
-                       }\r
-                       else\r
-                       {\r
-                               double a,b;\r
-                               int s1=sscanf(s,"%lg+i%lg",&re,&im);\r
-                               int s2=sscanf(s,"%lg-i%lg",&a,&b);\r
-                               if(s1<2)\r
-                               {\r
-                                 if(s2==2)     {       re=a;   im=-b;  }\r
-                                 else  {       re=atof(s);     im=0;   }\r
-                               }\r
-                       }\r
-                       numbs[k].push_back(dual(re,im));\r
+                       numbs[k].push_back(mgl_atoc(s,true));\r
                }\r
        }\r
-       register long i=0, n=NX*NY*NZ;\r
+       long i=0, n=NX*NY*NZ;\r
        for(long k=0;k<nl && i<n;k++)\r
        {\r
                std::vector<dual> &vals = numbs[k];\r
@@ -149,8 +144,7 @@ void MGL_EXPORT mgl_datac_set(HADT d, HCDT a)
                memcpy(d->a, dd->a, d->nx*d->ny*d->nz*sizeof(dual));\r
        else    // very inefficient!!!\r
        {\r
-               register long i,j,k;\r
-               for(k=0;k<d->nz;k++)    for(j=0;j<d->ny;j++)    for(i=0;i<d->nx;i++)\r
+               for(long k=0;k<d->nz;k++)       for(long j=0;j<d->ny;j++)       for(long i=0;i<d->nx;i++)\r
                        d->a[i+d->nx*(j+d->ny*k)] = a->v(i,j,k);\r
        }\r
 }\r
@@ -159,7 +153,7 @@ void MGL_EXPORT mgl_datac_set_(uintptr_t *d, uintptr_t *a)  {       mgl_datac_set(_DC_,
 void MGL_EXPORT mgl_datac_set_values(HADT d, const char *v,long NX,long NY,long NZ)\r
 {\r
        if(NX<1 || NY <1 || NZ<1)       return;\r
-       register long n=strlen(v)+1;\r
+       long n=strlen(v)+1;\r
        char *buf = new char[n];\r
        memcpy(buf,v,n);\r
        mglFromStr(d,buf,NX,NY,NZ);\r
@@ -183,8 +177,7 @@ void MGL_EXPORT mgl_datac_set_matrix(HADT d, gsl_matrix *m)
 #if MGL_HAVE_GSL\r
        if(!m || m->size1<1 || m->size2<1)      return;\r
        mgl_datac_create(d, m->size1,m->size2,1);\r
-       register long i,j;\r
-       for(j=0;j<d->ny;j++)    for(i=0;i<d->nx;i++)\r
+       for(long j=0;j<d->ny;j++)       for(long i=0;i<d->nx;i++)\r
                d->a[i+j*d->nx] = m->data[i * m->tda + j];\r
 #endif\r
 }\r
@@ -236,28 +229,22 @@ void MGL_EXPORT mgl_datac_set_id_(uintptr_t *d, const char *eq,int l)
 {      char *s=new char[l+1];  memcpy(s,eq,l); s[l]=0;\r
        mgl_datac_set_id(_DC_, s);      delete []s;     }\r
 //-----------------------------------------------------------------------------\r
-std::string MGL_NO_EXPORT mgl_cprint(mreal re, mreal im, char ch)\r
-{\r
-       char buf[128];\r
-       if(im>0)        snprintf(buf,128,"%g+i%g%c",re,im,ch);\r
-       else if(im<0)   snprintf(buf,128,"%g-i%g%c",re,-im,ch);\r
-       else    snprintf(buf,128,"%g%c",re,ch);\r
-       return std::string(buf);\r
-}\r
 std::string MGL_EXPORT mgl_datac_to_string(HCDT d, long ns)\r
 {\r
        std::string out;\r
        const mglDataC *dd = dynamic_cast<const mglDataC*>(d);\r
        if(!dd) {       return  mgl_data_to_string(d,ns);       }\r
        long nx=dd->nx, ny=dd->ny, nz=dd->nz;\r
-       const std::string loc = setlocale(LC_NUMERIC, NULL);    setlocale(LC_NUMERIC, "C");\r
+       const std::string loc = setlocale(LC_NUMERIC, "C");\r
        if(ns<0 || (ns>=nz && nz>1))    for(long k=0;k<nz;k++)\r
        {       // save whole data\r
+               const mglDataC *dc = dynamic_cast<const mglDataC *>(d);\r
+               if(dc && !dc->id.empty())       out += "## "+dc->id+'\n';\r
                for(long i=0;i<ny;i++)\r
                {\r
                        for(long j=0;j<nx-1;j++)\r
-                               out+=mgl_cprint(real(dd->a[j+nx*(i+ny*k)]), imag(dd->a[j+nx*(i+ny*k)]),'\t');\r
-                       out+=mgl_cprint(real(dd->a[nx-1+nx*(i+ny*k)]), imag(dd->a[nx-1+nx*(i+ny*k)]),'\n');\r
+                               out+=mgl_str_num(dd->a[j+nx*(i+ny*k)])+'\t';\r
+                       out+=mgl_str_num(dd->a[nx-1+nx*(i+ny*k)])+'\n';\r
                }\r
                out += "\n";\r
        }\r
@@ -266,11 +253,11 @@ std::string MGL_EXPORT mgl_datac_to_string(HCDT d, long ns)
                if(nz>1)        for(long i=0;i<ny;i++)\r
                {\r
                        for(long j=0;j<nx-1;j++)\r
-                               out+=mgl_cprint(real(dd->a[j+nx*(i+ny*ns)]), imag(dd->a[j+nx*(i+ny*ns)]),'\t');\r
-                       out+=mgl_cprint(real(dd->a[nx-1+nx*(i+ny*ns)]), imag(dd->a[nx-1+nx*(i+ny*ns)]),'\n');\r
+                               out+=mgl_str_num(dd->a[j+nx*(i+ny*ns)])+'\t';\r
+                       out+=mgl_str_num(dd->a[nx-1+nx*(i+ny*ns)])+'\n';\r
                }\r
                else if(ns<ny)  for(long j=0;j<nx;j++)\r
-                       out+=mgl_cprint(real(dd->a[j+nx*ns]), imag(dd->a[j+nx*ns]),'\t');\r
+                       out+=mgl_str_num(dd->a[j+nx*ns])+'\t';\r
        }\r
        setlocale(LC_NUMERIC, loc.c_str());\r
        return out;\r
@@ -292,19 +279,18 @@ int MGL_EXPORT mgl_datac_read(HADT d, const char *fname)
        if(!fp)\r
        {\r
                if(!d->a)       mgl_datac_create(d, 1,1,1);\r
-               return  false;\r
+               return  0;\r
        }\r
        char *buf = mgl_read_gz(fp);\r
        nb = strlen(buf);       gzclose(fp);\r
 \r
        bool first=false;       // space is not allowed delimiter for file with complex numbers\r
-       register char ch;\r
        for(i=nb-1;i>=0;i--)    if(buf[i]>' ')  break;\r
        buf[i+1]=0;     nb = i+1;               // remove tailing spaces\r
        for(i=0;i<nb-1 && !isn(buf[i]);i++)     // determine nx\r
        {\r
                while(buf[i]=='#')      {       while(!isn(buf[i]) && i<nb)     i++;    }\r
-               ch = buf[i];\r
+               char ch = buf[i];\r
                if(ch>' ' && !first)    first=true;\r
                if(strchr("[{(",ch))    sk++;\r
                if(strchr("]})",ch))    sk--;\r
@@ -313,7 +299,7 @@ int MGL_EXPORT mgl_datac_read(HADT d, const char *fname)
        first = false;\r
        for(i=0;i<nb-1;i++)                                     // determine ny\r
        {\r
-               ch = buf[i];\r
+               char ch = buf[i];\r
                if(ch=='#')     while(!isn(buf[i]) && i<nb)     i++;\r
                if(isn(ch))\r
                {\r
@@ -325,7 +311,7 @@ int MGL_EXPORT mgl_datac_read(HADT d, const char *fname)
        }\r
        if(first)       for(i=0;i<nb-1;i++)             // determine nz\r
        {\r
-               ch = buf[i];\r
+               char ch = buf[i];\r
                if(ch=='#')     while(!isn(buf[i]) && i<nb)     i++;\r
 //             if(ch=='#')     com = true;     // comment\r
                if(isn(ch))\r
@@ -337,7 +323,7 @@ int MGL_EXPORT mgl_datac_read(HADT d, const char *fname)
        }\r
        else    for(i=0;i<nb-1;i++)     if(buf[i]=='\f')        l++;\r
        mglFromStr(d,buf,k,m,l);\r
-       free(buf);      return true;\r
+       free(buf);      return 1;\r
 }\r
 int MGL_EXPORT mgl_datac_read_(uintptr_t *d, const char *fname,int l)\r
 {      char *s=new char[l+1];          memcpy(s,fname,l);      s[l]=0;\r
@@ -366,13 +352,13 @@ void MGL_EXPORT mgl_datac_link_(uintptr_t *d, dual *A, int *nx,int *ny,int *nz)
 //-----------------------------------------------------------------------------\r
 int MGL_EXPORT mgl_datac_read_dim(HADT d, const char *fname,long mx,long my,long mz)\r
 {\r
-       if(mx<=0 || my<=0 || mz<=0)     return false;\r
+       if(mx<=0 || my<=0 || mz<=0)     return 0;\r
        gzFile fp = gzopen(fname,"r");\r
-       if(!fp) return false;\r
+       if(!fp) return 0;\r
        char *buf = mgl_read_gz(fp);\r
        gzclose(fp);\r
        mglFromStr(d,buf,mx,my,mz);\r
-       free(buf);      return true;\r
+       free(buf);      return 1;\r
 }\r
 int MGL_EXPORT mgl_datac_read_dim_(uintptr_t *d, const char *fname,int *mx,int *my,int *mz,int l)\r
 {      char *s=new char[l+1];  memcpy(s,fname,l);      s[l]=0;\r
@@ -380,42 +366,40 @@ int MGL_EXPORT mgl_datac_read_dim_(uintptr_t *d, const char *fname,int *mx,int *
 //-----------------------------------------------------------------------------\r
 int MGL_EXPORT mgl_datac_read_mat(HADT d, const char *fname, long dim)\r
 {\r
-       if(dim<=0 || dim>3)     return false;\r
+       if(dim<=0 || dim>3)     return 0;\r
        gzFile fp = gzopen(fname,"r");\r
-       if(!fp) return false;\r
+       if(!fp) return 0;\r
        long nx=1, ny=1, nz=1;\r
        char *buf = mgl_read_gz(fp);\r
        long nb = strlen(buf);  gzclose(fp);\r
 \r
        long j=0;\r
-       while(j<nb)\r
-       {\r
-               if(buf[j]=='#') while(!isn(buf[j]))     j++;    // skip comment\r
-               while(j<nb && buf[j]<=' ')      j++;\r
-               break;\r
-       }\r
+       if(buf[j]=='#') while(!isn(buf[j]))     j++;    // skip comment\r
+       while(j<nb && buf[j]<=' ')      j++;\r
        if(dim==1)\r
        {\r
                sscanf(buf+j,"%ld",&nx);\r
-               while(j<nb && buf[j]!='\n')     j++;    j++;\r
+               while(j<nb && buf[j]!='\n')     j++;\r
+               j++;\r
 //             while(buf[j]>' ')       j++;\r
        }\r
        else if(dim==2)\r
        {\r
                sscanf(buf+j,"%ld%ld",&nx,&ny);\r
-               while(j<nb && buf[j]!='\n')     j++;    j++;\r
+               while(j<nb && buf[j]!='\n')     j++;\r
+               j++;\r
                char *b=buf+j;\r
-               register long i,l;\r
-               for(i=l=0;b[i];i++)\r
+               long l=0;\r
+               for(long i=0;b[i];i++)\r
                {\r
                        while(b[i]=='#')        {       while(!isn(b[i]) && b[i])       i++;    }\r
                        if(b[i]=='\n')  l++;\r
                }\r
                if(l==nx*ny || l==nx*ny+1)      // try to read 3d data (i.e. columns of matrix nx*ny)\r
                {\r
-                       nz=ny;  ny=nx;  nx=1;\r
+                       nz=ny;  ny=nx;  nx=1;   l=0;\r
                        bool first = false;\r
-                       for(i=l=0;b[i] && !isn(b[i]);i++)       // determine nx\r
+                       for(long i=0;b[i] && !isn(b[i]);i++)    // determine nx\r
                        {\r
                                while(b[i]=='#')        {       while(!isn(b[i]) && b[i])       i++;    }\r
                                char ch = b[i];\r
@@ -427,10 +411,11 @@ int MGL_EXPORT mgl_datac_read_mat(HADT d, const char *fname, long dim)
        else if(dim==3)\r
        {\r
                sscanf(buf+j,"%ld%ld%ld",&nx,&ny,&nz);\r
-               while(j<nb && buf[j]!='\n')     j++;    j++;\r
+               while(j<nb && buf[j]!='\n')     j++;\r
+               j++;\r
        }\r
        mglFromStr(d,buf+j,nx,ny,nz);\r
-       free(buf);      return true;\r
+       free(buf);      return 1;\r
 }\r
 int MGL_EXPORT mgl_datac_read_mat_(uintptr_t *d, const char *fname,int *dim,int l)\r
 {      char *s=new char[l+1];          memcpy(s,fname,l);      s[l]=0;\r
@@ -473,9 +458,12 @@ void MGL_EXPORT mgl_datac_squeeze(HADT d, long rx,long ry,long rz,long smooth)
        dual *b;\r
 \r
        // simple checking\r
-       if(rx>=nx)      rx=nx-1;        if(rx<1)        rx=1;\r
-       if(ry>=ny)      ry=ny-1;        if(ry<1)        ry=1;\r
-       if(rz>=nz)      rz=nz-1;        if(rz<1)        rz=1;\r
+       if(rx>=nx)      rx=nx-1;\r
+       if(rx<1)        rx=1;\r
+       if(ry>=ny)      ry=ny-1;\r
+       if(ry<1)        ry=1;\r
+       if(rz>=nz)      rz=nz-1;\r
+       if(rz<1)        rz=1;\r
        // new sizes\r
        kx = 1+(nx-1)/rx;       ky = 1+(ny-1)/ry;       kz = 1+(nz-1)/rz;\r
        b = new dual[kx*ky*kz];\r
@@ -607,7 +595,7 @@ MGL_NO_EXPORT void *mgl_cmodify(void *par)
 #endif\r
        for(long i0=t->id;i0<t->n;i0+=mglNumThr)\r
        {\r
-               register long i=i0%nx, j=((i0/nx)%ny), k=i0/(nx*ny);\r
+               long i=i0%nx, j=((i0/nx)%ny), k=i0/(nx*ny);\r
                b[i0] = f->Calc(i*dx, j*dy, k*dz, b[i0], v?v[i0]:dual(0,0), w?w[i0]:dual(0,0));\r
        }\r
        return 0;\r
@@ -702,7 +690,7 @@ int MGL_EXPORT mgl_datac_read_range(HADT dat, const char *templ, double from, do
        //read first file\r
        do{     snprintf(fname,n,templ,t);      fname[n-1]=0;   t+= step;       } while(!mgl_datac_read(&d,fname) && t<=to);\r
 \r
-       if(t>to)        {       delete []fname; return false;   }\r
+       if(t>to)        {       delete []fname; return 0;       }\r
        kx = d.nx;      ky = d.ny;      kz = d.nz;\r
        b = (dual *)malloc(kx*ky*kz*sizeof(dual));\r
        memcpy(b,d.a,kx*ky*kz*sizeof(dual));\r
@@ -713,11 +701,11 @@ int MGL_EXPORT mgl_datac_read_range(HADT dat, const char *templ, double from, do
                snprintf(fname,n,templ,t);      fname[n-1]=0;\r
                if(mgl_datac_read(&d,fname))\r
                        if(!mgl_add_file(kx,ky,kz,b,&d,as_slice))\r
-                       {       delete []fname; free(b);        return false;   }\r
+                       {       delete []fname; free(b);        return 0;       }\r
        }\r
        dat->Set(b,kx,ky,kz);\r
        delete []fname; free(b);\r
-       return true;\r
+       return 1;\r
 }\r
 int MGL_EXPORT mgl_datac_read_range_(uintptr_t *d, const char *fname, mreal *from, mreal *to, mreal *step, int *as_slice,int l)\r
 {      char *s=new char[l+1];          memcpy(s,fname,l);      s[l]=0;\r
@@ -737,7 +725,7 @@ int MGL_EXPORT mgl_datac_read_all(HADT dat, const char *templ, int as_slice)
        for(i=0;i<res.gl_pathc;i++)\r
                if(mgl_datac_read(&d,res.gl_pathv[i]))  break;\r
 \r
-       if(i>=res.gl_pathc)     {       globfree (&res);        return false;   }\r
+       if(i>=res.gl_pathc)     {       globfree (&res);        return 0;       }\r
        kx = d.nx;      ky = d.ny;      kz = d.nz;\r
        b = (dual *)malloc(kx*ky*kz*sizeof(dual));\r
        memcpy(b,d.a,kx*ky*kz*sizeof(dual));\r
@@ -746,14 +734,14 @@ int MGL_EXPORT mgl_datac_read_all(HADT dat, const char *templ, int as_slice)
        {\r
                if(mgl_datac_read(&d,res.gl_pathv[i]))\r
                        if(!mgl_add_file(kx,ky,kz,b,&d,as_slice))\r
-                       {       globfree (&res);        free(b);        return false;   }\r
+                       {       globfree (&res);        free(b);        return 0;       }\r
        }\r
        dat->Set(b,kx,ky,kz);\r
 \r
        globfree (&res);        free(b);\r
-       return true;\r
+       return 1;\r
 #else\r
-       return false;\r
+       return 0;\r
 #endif\r
 }\r
 int MGL_EXPORT mgl_datac_read_all_(uintptr_t *d, const char *fname, int *as_slice,int l)\r
@@ -849,7 +837,7 @@ void MGL_EXPORT mgl_datac_set_ap(HADT d, HCDT a, HCDT p)
 #pragma omp parallel for\r
        for(long i=0;i<nx*ny*nz;i++)\r
        {\r
-               register mreal aa=a->vthr(i), pp=p->vthr(i);\r
+               mreal aa=a->vthr(i), pp=p->vthr(i);\r
                d->a[i] = dual(aa*cos(pp), aa*sin(pp));\r
        }\r
 }\r
@@ -888,11 +876,11 @@ int MGL_EXPORT mgl_datac_read_hdf(HADT d,const char *fname,const char *data)
        hid_t hf,hd,hs;\r
        hsize_t dims[4];\r
        long rank, res = H5Fis_hdf5(fname);\r
-       if(res<=0)      {       return false;   }\r
+       if(res<=0)      return 0;\r
        hf = H5Fopen(fname, H5F_ACC_RDONLY, H5P_DEFAULT);\r
-       if(hf<0)        return false;\r
+       if(hf<0)        return 0;\r
        hd = H5Dopen(hf,data);\r
-       if(hd<0)        return false;\r
+       if(hd<0)        return 0;\r
        hs = H5Dget_space(hd);\r
        rank = H5Sget_simple_extent_ndims(hs);\r
        if(rank>0 && rank<=4)\r
@@ -926,14 +914,14 @@ int MGL_EXPORT mgl_datac_read_hdf(HADT d,const char *fname,const char *data)
                        delete []a;\r
                }\r
        }\r
-       H5Sclose(hs);   H5Dclose(hd);   H5Fclose(hf);   return true;\r
+       H5Sclose(hs);   H5Dclose(hd);   H5Fclose(hf);   return 1;\r
 }\r
 //-----------------------------------------------------------------------------\r
 #else\r
 void MGL_EXPORT mgl_datac_save_hdf(HCDT ,const char *,const char *,int )\r
-{      mgl_set_global_warn("HDF5 support was disabled. Please, enable it and rebuild MathGL.");        }\r
+{      mgl_set_global_warn(_("HDF5 support was disabled. Please, enable it and rebuild MathGL."));     }\r
 int MGL_EXPORT mgl_datac_read_hdf(HADT ,const char *,const char *)\r
-{      mgl_set_global_warn("HDF5 support was disabled. Please, enable it and rebuild MathGL.");        return false;}\r
+{      mgl_set_global_warn(_("HDF5 support was disabled. Please, enable it and rebuild MathGL."));     return 0;}\r
 #endif\r
 //-----------------------------------------------------------------------------\r
 int MGL_EXPORT mgl_datac_read_hdf_(uintptr_t *d, const char *fname, const char *data,int l,int n)\r
@@ -945,3 +933,14 @@ void MGL_EXPORT mgl_datac_save_hdf_(uintptr_t *d, const char *fname, const char
        char *t=new char[n+1];          memcpy(t,data,n);       t[n]=0;\r
        mgl_datac_save_hdf(_DC_,s,t,*rewrite);  delete []s;     delete []t;     }\r
 //-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_datac_limit(HADT d, mreal v)\r
+{\r
+       long n = d->GetNN();\r
+       dual *a = d->a;\r
+       #pragma omp parallel for\r
+       for(long i=0;i<n;i++)\r
+       {       mreal b = abs(a[i]);    if(b>v) a[i] *= v/b;    }\r
+}\r
+void MGL_EXPORT mgl_datac_limit_(uintptr_t *d, mreal *v)\r
+{      mgl_datac_limit(_DC_, *v);      }\r
+//-----------------------------------------------------------------------------\r
index b39a034152ad47c628b463c9b8f3129bb1645366..49e8122b701420ce861245d5397c9aa395c9c12a 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * cont.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -44,26 +44,28 @@ void MGL_NO_EXPORT mgl_string_curve(mglBase *gr,long f,long ,const long *ff,cons
        if(!font)       font="";\r
        int pos = strchr(font,'T') ? 1:-1, align;\r
        bool cc=mglGetStyle(font,0,&align);             align = align&3;\r
-       mreal h=gr->TextHeight(font,size)/2, tet, tt;\r
+       mreal h=gr->TextHeight(font,size)/2;\r
        wchar_t L[2]=L"a";\r
-       register long i,j,k,m;\r
+\r
+       if(align==1)    // TODO divide curve by 2\r
+       {}\r
 \r
        std::vector<mglPoint> qa, qb;   // curves above and below original\r
-       if(ff[f]<0)     for(i=nn[f];i>=0 && i!=f;i=nn[i])       // find first real point\r
+       if(ff[f]<0)     for(long i=nn[f];i>=0 && i!=f;i=nn[i])  // find first real point\r
                if(ff[i]>=0)    {       f=i;    break;  }\r
        if(ff[f]<0)     return;\r
        mreal c=cc?gr->AddTexture(font) : gr->GetClrC(ff[f]);\r
        mglPoint p=gr->GetPntP(ff[f]), q=p, s;\r
-       for(i=nn[f];i>=0 && i!=f;i=nn[i])       // find second real point\r
+       for(long i=nn[f];i>=0 && i!=f;i=nn[i])  // find second real point\r
                if(ff[i]>=0)    {       s=gr->GetPntP(ff[i]);   break;  }\r
        mglPoint l=!(s-q), t=l;\r
        qa.push_back(q+l*h);    qb.push_back(q-l*h);\r
-       for(i=nn[f];i>=0 && i!=f;i=nn[i])       // construct curves\r
+       for(long i=nn[f];i>=0 && i!=f;i=nn[i])  // construct curves\r
        {\r
                p=q;    q=s;    l=t;\r
                if(nn[i]>=0 && ff[nn[i]]>=0)    {       s=gr->GetPntP(ff[nn[i]]);       t=!(s-q);       }\r
-               tet = t.x*l.y-t.y*l.x;\r
-               tt = 1+fabs(t.x*l.x+t.y*l.y);\r
+               mreal tet = t.x*l.y-t.y*l.x;\r
+               mreal tt = 1+fabs(t.x*l.x+t.y*l.y);\r
                if(tet>0)\r
                {       qa.push_back(q+l*h);    qa.push_back(q+t*h);    qb.push_back(q-(l+t)*(h/tt));   }\r
                else if(tet<0)\r
@@ -87,22 +89,22 @@ void MGL_NO_EXPORT mgl_string_curve(mglBase *gr,long f,long ,const long *ff,cons
        if(rev) reverse(qa.begin(),qa.end());\r
        long len = mgl_wcslen(text);\r
        mreal *wdt=new mreal[len+1];\r
-       for(j=0;j<len;j++)      {       L[0]=text[j];   wdt[j]=1.2*gr->TextWidth(L,font,size);  }\r
+       for(long j=0;j<len;j++) {       L[0]=text[j];   wdt[j]=1.2*gr->TextWidth(L,font,size);  }\r
        wdt[len]=0;\r
 \r
        // place glyphs points\r
        mglPoint *pt=new mglPoint[len+1];\r
-       pt[0] = qa[0];  m = qa.size();\r
-\r
-       mreal a,b,d,w,t1,t2;\r
-       for(i=j=0,tt=0;j<len;j++)\r
+       pt[0] = qa[0];\r
+       long i=0, k, m = qa.size();\r
+       mreal t1,t2, tt=0;\r
+       for(long j=0;j<len;j++)\r
        {\r
-               w = align==1 ? wdt[j] : (wdt[j]+wdt[j+1])/2;    p = pt[j];\r
+               mreal w = align==1 ? wdt[j] : (wdt[j]+wdt[j+1])/2;      p = pt[j];\r
                for(k=i+1;k<m;k++)      if((p-qa[k]).norm()>w)  break;\r
                if(k>i+1 && k<m)        tt=-1;\r
                i = k<m ? k-1 : m-2;            // check if end of curve\r
                q = qa[i];      s = qa[i+1];    // points of line segment\r
-               a = (q-s)*(q-s);        b = (q-p)*(q-s);        d = (q-p)*(q-p)-w*w;\r
+               mreal a = (q-s)*(q-s), b = (q-p)*(q-s), d = (q-p)*(q-p)-w*w;\r
                w = sqrt(b*b-a*d);              // NOTE: b*b>a*d should be here!\r
                if(b*b>1e3*a*d) {       t1 = d/(b+w);   t2 = d/(b-w);   }       // keep precision\r
                else                    {       t1 = (b-w)/a;   t2 = (b+w)/a;   }\r
@@ -111,7 +113,7 @@ void MGL_NO_EXPORT mgl_string_curve(mglBase *gr,long f,long ,const long *ff,cons
        }\r
        if(rev) pos=-pos;\r
        mreal dc = (cc && len>1)?1/MGL_FEPSILON/(len-1):0;\r
-       for(j=0;j<len;j++)      // draw text\r
+       for(long j=0;j<len;j++) // draw text\r
        {\r
                L[0] = text[align!=2?j:len-1-j];        s = pt[j+1]-pt[j];      l = !s;\r
                gr->text_plot(gr->AddPnt(pt[j]+(pos*h)*l,c+dc*i,align!=2?s:-s,-1,-1),L,fnt,size,0.05,c+dc*j);\r
@@ -203,8 +205,8 @@ std::vector<mglSegment> MGL_EXPORT mgl_get_lines(mreal val, HCDT a, HCDT x, HCDT
        // first add all possible lines\r
        for(long j=0;j<m-1;j++) for(long i=0;i<n-1;i++)\r
        {\r
-               register mreal v1=a->v(i,j,ak),v2=a->v(i+1,j,ak),v3=a->v(i,j+1,ak),v4=a->v(i+1,j+1,ak);\r
-               register mreal dl=mgl_d(val,v1,v3),dr=mgl_d(val,v2,v4),dp=mgl_d(val,v1,v2),dn=mgl_d(val,v3,v4);\r
+               mreal v1=a->v(i,j,ak),v2=a->v(i+1,j,ak),v3=a->v(i,j+1,ak),v4=a->v(i+1,j+1,ak);\r
+               mreal dl=mgl_d(val,v1,v3),dr=mgl_d(val,v2,v4),dp=mgl_d(val,v1,v2),dn=mgl_d(val,v3,v4);\r
                bool added=false;\r
                if(v1>val || v4>val)\r
                {\r
@@ -243,9 +245,11 @@ std::vector<mglSegment> MGL_EXPORT mgl_get_curvs(HMGL gr, std::vector<mglSegment
        ysl = new std::vector<long>[nsl+1];\r
        for(long i=0;i<n;i++)   // group lines by position of its x-coor\r
        {\r
-               register long i1 = (lines[i].p1.x-x0)*dxsl, i2 = (lines[i].p2.x-x0)*dxsl;\r
-               if(i1<0)        i1=0;   if(i1>nsl)      i1=nsl;\r
-               if(i2<0)        i2=0;   if(i2>nsl)      i2=nsl;\r
+               long i1 = (lines[i].p1.x-x0)*dxsl, i2 = (lines[i].p2.x-x0)*dxsl;\r
+               if(i1<0)        i1=0;\r
+               if(i1>nsl)      i1=nsl;\r
+               if(i2<0)        i2=0;\r
+               if(i2>nsl)      i2=nsl;\r
                if(i1==i2 && i1*(i1-nsl)<=0)    xsl[i1].push_back(i);\r
                else\r
                {\r
@@ -254,8 +258,10 @@ std::vector<mglSegment> MGL_EXPORT mgl_get_curvs(HMGL gr, std::vector<mglSegment
                }\r
                i1 = (lines[i].p1.y-y0)*dysl;\r
                i2 = (lines[i].p2.y-y0)*dysl;\r
-               if(i1<0)        i1=0;   if(i1>nsl)      i1=nsl;\r
-               if(i2<0)        i2=0;   if(i2>nsl)      i2=nsl;\r
+               if(i1<0)        i1=0;\r
+               if(i1>nsl)      i1=nsl;\r
+               if(i2<0)        i2=0;\r
+               if(i2>nsl)      i2=nsl;\r
                if(i1==i2 && i1*(i1-nsl)<=0)    ysl[i1].push_back(i);\r
                else\r
                {\r
@@ -286,17 +292,19 @@ std::vector<mglSegment> MGL_EXPORT mgl_get_curvs(HMGL gr, std::vector<mglSegment
                while(added && m>0)\r
                {\r
                        added = false;\r
-                       register long i1, i2;\r
+                       long i1, i2;\r
                        if(xm<=ym)\r
                        {       i1 = (curv.p1.x-x0)*dxsl;       i2 = (curv.p2.x-x0)*dxsl;       }\r
                        else\r
                        {       i1 = (curv.p1.y-y0)*dysl;       i2 = (curv.p2.y-y0)*dysl;       }\r
-                       if(i1<0)        i1=0;   if(i1>nsl)      i1=nsl;\r
-                       if(i2<0)        i2=0;   if(i2>nsl)      i2=nsl;\r
+                       if(i1<0)        i1=0;\r
+                       if(i1>nsl)      i1=nsl;\r
+                       if(i2<0)        i2=0;\r
+                       if(i2>nsl)      i2=nsl;\r
                        const std::vector<long> &isl1=(xm<=ym)?xsl[i1]:ysl[i1];\r
                        for(size_t i=0;i<isl1.size();i++)       // first find continuation of first point\r
                        {\r
-                               register long ii = isl1[i];\r
+                               long ii = isl1[i];\r
                                const mglSegment &l=lines[ii];\r
                                if(used[ii])    continue;\r
                                if(l.p1==curv.p1)               {       curv.before(l.p2);      used[ii]=1;     m--;    added=true;     break;  }\r
@@ -305,7 +313,7 @@ std::vector<mglSegment> MGL_EXPORT mgl_get_curvs(HMGL gr, std::vector<mglSegment
                        const std::vector<long> &isl2=(xm<=ym)?xsl[i2]:ysl[i2];\r
                        if(m>0) for(size_t i=0;i<isl2.size();i++)       // now the same for second point\r
                        {\r
-                               register long ii = isl2[i];\r
+                               long ii = isl2[i];\r
                                const mglSegment &l=lines[ii];\r
                                if(used[ii])    continue;\r
                                if(l.p1==curv.p2)               {       curv.after(l.p2);       used[ii]=1;     m--;    added=true;     break;  }\r
@@ -411,14 +419,14 @@ void MGL_EXPORT mgl_cont_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const c
                x = &xx;        y = &yy;\r
        }\r
        // x, y -- have the same size z\r
-       mglDataV zz(n, m);\r
+#pragma omp parallel for collapse(2)\r
        for(long i=0;i<v->GetNx();i++)  for(long j=0;j<z->GetNz();j++)\r
        {\r
-               if(gr->NeedStop())      {       i = v->GetNx(); j = z->GetNz(); continue;       }\r
+               if(gr->NeedStop())      continue;\r
                mreal v0 = v->v(i), z0 = fixed ? gr->Min.z : v0;\r
                if(z->GetNz()>1)\r
                        z0 = gr->Min.z+(gr->Max.z-gr->Min.z)*mreal(j)/(z->GetNz()-1);\r
-               zz.Fill(z0,z0);\r
+               mglDataV zz(n, m);      zz.Fill(z0,z0);\r
                mgl_cont_gen(gr,v0,z,x,y,&zz,gr->GetC(s,v0),text,j);\r
        }\r
        gr->EndGroup();\r
@@ -426,7 +434,7 @@ void MGL_EXPORT mgl_cont_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const c
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_cont_val(HMGL gr, HCDT v, HCDT z, const char *sch, const char *opt)\r
 {\r
-       register long n = z->GetNx(), m = z->GetNy();\r
+       long n = z->GetNx(), m = z->GetNy();\r
        if(m<2 || n<2)  {       gr->SetWarn(mglWarnLow,"Cont"); return; }\r
        gr->SaveState(opt);\r
        mglDataV x(n, m), y(n, m);\r
@@ -526,21 +534,20 @@ void MGL_EXPORT mgl_contf_gen(HMGL gr, mreal v1, mreal v2, HCDT a, HCDT x, HCDT
        if(n<2 || m<2 || x->GetNx()*x->GetNy()!=n*m || y->GetNx()*y->GetNy()!=n*m || z->GetNx()*z->GetNy()!=n*m)\r
        {       gr->SetWarn(mglWarnDim,"ContFGen");     return; }\r
 \r
-       register long i,j;\r
        gr->Reserve(8*n*m);\r
        long *kk = new long[4*n], l1,l2, r1,r2, t1,t2, u1,u2, b1,b2, d1,d2, p[8],num;\r
        memset(kk,-1,2*n*sizeof(long));\r
-       for(i=0;i<n-1;i++)      // add intersection points for first line\r
+       for(long i=0;i<n-1;i++) // add intersection points for first line\r
        {\r
                mgl_add_range(gr,a,x,y,z, i,0,1,0, c,u1,u2, ak,v1,v2);\r
                kk[4*i]=u1;             kk[4*i+1]=u2;\r
                mgl_add_edges(gr,a,x,y,z, i,0,1,0, c,d1,d2, ak,v1,v2);\r
                kk[4*i+2]=d1;           kk[4*i+3]=d2;\r
        }\r
-       for(j=1;j<m;j++)        // add intersection points\r
+       for(long j=1;j<m;j++)   // add intersection points\r
        {\r
                mgl_add_range(gr,a,x,y,z, 0,j-1,0,1, c,r1,r2, ak,v1,v2);\r
-               for(i=0;i<n-1;i++)\r
+               for(long i=0;i<n-1;i++)\r
                {\r
                        l1 = r1;                l2 = r2;        num=0;\r
                        t1 = kk[4*i];   t2 = kk[4*i+1];\r
@@ -553,12 +560,18 @@ void MGL_EXPORT mgl_contf_gen(HMGL gr, mreal v1, mreal v2, HCDT a, HCDT x, HCDT
                        mgl_add_edges(gr,a,x,y,z, i,j,1,0, c,d1,d2, ak,v1,v2);\r
                        kk[4*i+2]=d1;   kk[4*i+3]=d2;\r
                        // collect points\r
-                       if(b1>=0)       p[num++] = b1;  if(t1>=0)       p[num++] = t1;\r
-                       if(t2>=0)       p[num++] = t2;  if(b2>=0)       p[num++] = b2;\r
-                       if(r1>=0)       p[num++] = r1;  if(r2>=0)       p[num++] = r2;\r
-                       if(d2>=0)       p[num++] = d2;  if(u2>=0)       p[num++] = u2;\r
-                       if(u1>=0)       p[num++] = u1;  if(d1>=0)       p[num++] = d1;\r
-                       if(l2>=0)       p[num++] = l2;  if(l1>=0)       p[num++] = l1;\r
+                       if(b1>=0)       p[num++] = b1;\r
+                       if(t1>=0)       p[num++] = t1;\r
+                       if(t2>=0)       p[num++] = t2;\r
+                       if(b2>=0)       p[num++] = b2;\r
+                       if(r1>=0)       p[num++] = r1;\r
+                       if(r2>=0)       p[num++] = r2;\r
+                       if(d2>=0)       p[num++] = d2;\r
+                       if(u2>=0)       p[num++] = u2;\r
+                       if(u1>=0)       p[num++] = u1;\r
+                       if(d1>=0)       p[num++] = d1;\r
+                       if(l2>=0)       p[num++] = l2;\r
+                       if(l1>=0)       p[num++] = l1;\r
 \r
                        //      d1      u1      u2      d2\r
                        //      l2                      r2\r
@@ -641,12 +654,16 @@ void MGL_EXPORT mgl_contf_gen(HMGL gr, mreal v1, mreal v2, HCDT a, HCDT x, HCDT
                        else if(num==8)\r
                        {\r
                                if(b2d1)\r
-                               {       if(l2<0)        {       l2=l1;  l1=b1;  }       if(r2<0)        r2=d2;\r
-                                       if(t2<0)        {       t2=t1;  t1=b1;  }       if(u2<0)        u2=d2;\r
+                               {       if(l2<0)        {       l2=l1;  l1=b1;  }\r
+                                       if(r2<0)        r2=d2;\r
+                                       if(t2<0)        {       t2=t1;  t1=b1;  }\r
+                                       if(u2<0)        u2=d2;\r
                                        gr->quad_plot(r1,r2,u1,u2);     gr->quad_plot(l1,l2,t1,t2);     }\r
                                else\r
-                               {       if(l2<0)        l2=d1;  if(r2<0)        {       r2=r1;  r1=b2;  }\r
-                                       if(t2<0)        t2=b2;  if(u2<0)        {       u2=u1;  u1=d1;  }\r
+                               {       if(l2<0)        l2=d1;\r
+                                       if(r2<0)        {       r2=r1;  r1=b2;  }\r
+                                       if(t2<0)        t2=b2;\r
+                                       if(u2<0)        {       u2=u1;  u1=d1;  }\r
                                        gr->quad_plot(r1,r2,t2,t1);     gr->quad_plot(l1,l2,u2,u1);     }\r
                        }\r
                }\r
@@ -681,14 +698,14 @@ void MGL_EXPORT mgl_contf_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const
                x = &xx;        y = &yy;\r
        }\r
        // x, y -- have the same size z\r
-       mglDataV zz(n, m);\r
+#pragma omp parallel for collapse(2)\r
        for(long i=0;i<v->GetNx()-1;i++)        for(long j=0;j<z->GetNz();j++)\r
        {\r
-               if(gr->NeedStop())      {       i = v->GetNx(); j = z->GetNz(); continue;       }\r
+               if(gr->NeedStop())      continue;\r
                mreal v0 = v->v(i), z0 = fixed ? gr->Min.z : v0;\r
                if(z->GetNz()>1)\r
                        z0 = gr->Min.z+(gr->Max.z-gr->Min.z)*mreal(j)/(z->GetNz()-1);\r
-               zz.Fill(z0,z0);\r
+               mglDataV zz(n, m);      zz.Fill(z0,z0);\r
                mgl_contf_gen(gr,v0,v->v(i+1),z,x,y,&zz,gr->GetC(s,v0),j);\r
        }\r
        gr->EndGroup();\r
@@ -696,7 +713,7 @@ void MGL_EXPORT mgl_contf_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_contf_val(HMGL gr, HCDT v, HCDT z, const char *sch, const char *opt)\r
 {\r
-       register long n = z->GetNx(), m = z->GetNy();\r
+       long n = z->GetNx(), m = z->GetNy();\r
        if(n<2 || m<2)  {       gr->SetWarn(mglWarnLow,"Cont"); return; }\r
        gr->SaveState(opt);\r
        mglDataV x(n, m), y(n, m);\r
@@ -746,6 +763,70 @@ void MGL_EXPORT mgl_contf_(uintptr_t *gr, uintptr_t *a, const char *sch, const c
        mgl_contf(_GR_, _DA_(a), s, o); delete []o;     delete []s;     }\r
 //-----------------------------------------------------------------------------\r
 //\r
+//     ContP series\r
+//\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_contp_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, const char *opt)\r
+{\r
+       long n=z->GetNx(),m=z->GetNy();\r
+       if(mgl_check_dim2(gr,x,y,z,a,"Cont"))   return;\r
+\r
+       gr->SaveState(opt);\r
+       static int cgid=1;      gr->StartGroup("Cont",cgid++);\r
+\r
+       int text=0;\r
+       if(mglchr(sch,'t'))     text=1;\r
+       if(mglchr(sch,'T'))     text=2;\r
+       bool fill = mglchr(sch,'f');\r
+       long s=gr->AddTexture(sch);\r
+       gr->SetPenPal(sch);\r
+\r
+       mglData xx, yy;\r
+       if(x->GetNx()*x->GetNy()!=m*n || y->GetNx()*y->GetNy()!=m*n)    // make\r
+       {\r
+               xx.Create(n, m);                yy.Create(n, m);\r
+               for(long i=0;i<n;i++)   xx.a[i]=x->v(i);\r
+               for(long j=1;j<m;j++)   memcpy(xx.a+n*j,xx.a,n*sizeof(mreal));\r
+               for(long j=0;j<m;j++)\r
+               {       mreal t=y->v(j);        for(long i=0;i<n;i++)   yy.a[i+n*j]=t;  }\r
+               x = &xx;        y = &yy;\r
+       }\r
+       // x, y -- have the same size z\r
+#pragma omp parallel for collapse(2)\r
+       for(long i=0;i<v->GetNx();i++)  for(long j=0;j<a->GetNz();j++)\r
+       {\r
+               if(gr->NeedStop())      continue;\r
+               if(fill)\r
+                       mgl_contf_gen(gr,v->v(i),v->v(i+1),a,x,y,z,gr->GetC(s,v->v(i)),j);\r
+               else\r
+                       mgl_cont_gen(gr,v->v(i),a,x,y,z,gr->GetC(s,v->v(i)),text,j);\r
+       }\r
+       gr->EndGroup();\r
+}\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_contp(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, const char *opt)\r
+{\r
+       mreal r = gr->SaveState(opt);\r
+       long Num = mgl_isnan(r)?7:long(r+0.5);\r
+       if(Num<1)       {       gr->SetWarn(mglWarnCnt,"Cont"); return; }\r
+       mglData v(Num);\r
+       for(long i=0;i<Num;i++) v.a[i] = gr->Min.c + (gr->Max.c-gr->Min.c)*mreal(i+1)/(Num+1);\r
+       mgl_contp_val(gr,&v,x,y,z,a,sch,0);\r
+}\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_contp_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, const char *opt,int l,int lo)\r
+{      char *s=new char[l+1];  memcpy(s,sch,l);        s[l]=0;\r
+       char *o=new char[lo+1]; memcpy(o,opt,lo);       o[lo]=0;\r
+       mgl_contp_val(_GR_, _DA_(v), _DA_(x), _DA_(y), _DA_(z), _DA_(a), s, o);\r
+       delete []o;     delete []s;     }\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_contp_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, const char *opt,int l,int lo)\r
+{      char *s=new char[l+1];  memcpy(s,sch,l);        s[l]=0;\r
+       char *o=new char[lo+1]; memcpy(o,opt,lo);       o[lo]=0;\r
+       mgl_contp(_GR_, _DA_(x), _DA_(y), _DA_(z), _DA_(a), s, o);\r
+       delete []o;     delete []s;     }\r
+//-----------------------------------------------------------------------------\r
+//\r
 //     ContD series\r
 //\r
 //-----------------------------------------------------------------------------\r
@@ -782,22 +863,22 @@ void MGL_EXPORT mgl_contd_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const
        }\r
        // x, y -- have the same size z\r
        mreal dc = nc>1 ? 1/(MGL_FEPSILON*(nc-1)) : 0;\r
-       mglDataV zz(n, m);\r
+#pragma omp parallel for collapse(2)\r
        for(long i=0;i<v->GetNx()-1;i++)        for(long j=0;j<z->GetNz();j++)\r
        {\r
-               if(gr->NeedStop())      {       i = v->GetNx(); j = z->GetNz(); continue;       }\r
+               if(gr->NeedStop())      continue;\r
                mreal v0 = v->v(i), z0 = fixed ? gr->Min.z : v0;\r
                if(z->GetNz()>1)\r
                        z0 = gr->Min.z+(gr->Max.z-gr->Min.z)*mreal(j)/(z->GetNz()-1);\r
-               zz.Fill(z0,z0);\r
-               mgl_contf_gen(gr,v0,v->v(i+1),z,x,y,&zz,s+i*dc,j);\r
+               mglDataV zz(n, m);      zz.Fill(z0,z0);\r
+               mgl_contf_gen(gr,v0,v->v(i+1),z,x,y,&zz,s+(i%nc)*dc,j);\r
        }\r
        gr->EndGroup();\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_contd_val(HMGL gr, HCDT v, HCDT z, const char *sch, const char *opt)\r
 {\r
-       register long n = z->GetNx(), m = z->GetNy();\r
+       long n = z->GetNx(), m = z->GetNy();\r
        if(n<2 || m<2)  {       gr->SetWarn(mglWarnLow,"ContD");        return; }\r
        gr->SaveState(opt);\r
        mglDataV x(n, m), y(n, m);\r
@@ -891,13 +972,13 @@ void MGL_EXPORT mgl_contv_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const
                x = &xx;        y = &yy;\r
        }\r
        // x, y -- have the same size z\r
-       mglDataV zz(n, m);\r
+#pragma omp parallel for collapse(2)\r
        for(long i=0;i<v->GetNx();i++)  for(long j=0;j<z->GetNz();j++)\r
        {\r
-               if(gr->NeedStop())      {       i = v->GetNx(); j = z->GetNz(); continue;       }\r
+               if(gr->NeedStop())      continue;\r
                mreal v0 = v->v(i), z0 = fixed ? gr->Min.z : v0;\r
                if(z->GetNz()>1)        z0 = gr->Min.z+(gr->Max.z-gr->Min.z)*mreal(j)/(z->GetNz()-1);\r
-               zz.Fill(z0,z0);\r
+               mglDataV zz(n, m);      zz.Fill(z0,z0);\r
                mreal dv = (gr->Max.c-gr->Min.c)/8;\r
                if(i>0) dv = v->v(i-1)-v->v(i);\r
                else if(i<v->GetNx()-1) dv = v->v(i)-v->v(i+1);\r
@@ -909,7 +990,7 @@ void MGL_EXPORT mgl_contv_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_contv_val(HMGL gr, HCDT v, HCDT z, const char *sch, const char *opt)\r
 {\r
-       register long n = z->GetNx(), m = z->GetNy();\r
+       long n = z->GetNx(), m = z->GetNy();\r
        if(n<2 || m<2)  {       gr->SetWarn(mglWarnLow,"Cont"); return; }\r
        gr->SaveState(opt);\r
        mglDataV x(n, m), y(n, m);\r
@@ -967,7 +1048,7 @@ struct _mgl_slice  {       mglData x,y,z,a;        };
 //-----------------------------------------------------------------------------\r
 void MGL_NO_EXPORT mgl_get_slice(_mgl_slice &s, HCDT x, HCDT y, HCDT z, HCDT a, char dir, mreal d, bool both)\r
 {\r
-       register long n=a->GetNx(),m=a->GetNy(),l=a->GetNz(), nx=1,ny=1,p;\r
+       long n=a->GetNx(),m=a->GetNy(),l=a->GetNz(), nx=1,ny=1,p;\r
 \r
        if(dir=='x')    {       nx = m; ny = l; if(d<0) d = n/2.;       }\r
        if(dir=='y')    {       nx = n; ny = l; if(d<0) d = m/2.;       }\r
@@ -986,7 +1067,7 @@ void MGL_NO_EXPORT mgl_get_slice(_mgl_slice &s, HCDT x, HCDT y, HCDT z, HCDT a,
 #pragma omp parallel for collapse(2)\r
                        for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
                        {\r
-                               register long i0 = i+nx*j;\r
+                               long i0 = i+nx*j;\r
                                s.x.a[i0] = x->v(p,i,j)*(1-d) + x->v(p+1,i,j)*d;\r
                                s.y.a[i0] = y->v(p,i,j)*(1-d) + y->v(p+1,i,j)*d;\r
                                s.z.a[i0] = z->v(p,i,j)*(1-d) + z->v(p+1,i,j)*d;\r
@@ -996,7 +1077,7 @@ void MGL_NO_EXPORT mgl_get_slice(_mgl_slice &s, HCDT x, HCDT y, HCDT z, HCDT a,
 #pragma omp parallel for collapse(2)\r
                        for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
                        {\r
-                               register long i0 = i+nx*j;\r
+                               long i0 = i+nx*j;\r
                                s.x.a[i0] = x->v(i,p,j)*(1-d) + x->v(i,p+1,j)*d;\r
                                s.y.a[i0] = y->v(i,p,j)*(1-d) + y->v(i,p+1,j)*d;\r
                                s.z.a[i0] = z->v(i,p,j)*(1-d) + z->v(i,p+1,j)*d;\r
@@ -1006,7 +1087,7 @@ void MGL_NO_EXPORT mgl_get_slice(_mgl_slice &s, HCDT x, HCDT y, HCDT z, HCDT a,
 #pragma omp parallel for collapse(2)\r
                        for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
                        {\r
-                               register long i0 = i+nx*j;\r
+                               long i0 = i+nx*j;\r
                                s.x.a[i0] = x->v(i,j,p)*(1-d) + x->v(i,j,p+1)*d;\r
                                s.y.a[i0] = y->v(i,j,p)*(1-d) + y->v(i,j,p+1)*d;\r
                                s.z.a[i0] = z->v(i,j,p)*(1-d) + z->v(i,j,p+1)*d;\r
@@ -1021,7 +1102,7 @@ void MGL_NO_EXPORT mgl_get_slice(_mgl_slice &s, HCDT x, HCDT y, HCDT z, HCDT a,
 #pragma omp parallel for collapse(2)\r
                        for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
                        {\r
-                               register long i0 = i+nx*j;      s.x.a[i0] = v;\r
+                               long i0 = i+nx*j;       s.x.a[i0] = v;\r
                                s.y.a[i0] = y->v(i);    s.z.a[i0] = z->v(j);\r
                                s.a.a[i0] = a->v(p,i,j)*(1-d) + a->v(p+1,i,j)*d;\r
                        }\r
@@ -1032,7 +1113,7 @@ void MGL_NO_EXPORT mgl_get_slice(_mgl_slice &s, HCDT x, HCDT y, HCDT z, HCDT a,
 #pragma omp parallel for collapse(2)\r
                        for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
                        {\r
-                               register long i0 = i+nx*j;      s.y.a[i0] = v;\r
+                               long i0 = i+nx*j;       s.y.a[i0] = v;\r
                                s.x.a[i0] = x->v(i);    s.z.a[i0] = z->v(j);\r
                                s.a.a[i0] = a->v(i,p,j)*(1-d) + a->v(i,p+1,j)*d;\r
                        }\r
@@ -1043,7 +1124,7 @@ void MGL_NO_EXPORT mgl_get_slice(_mgl_slice &s, HCDT x, HCDT y, HCDT z, HCDT a,
 #pragma omp parallel for collapse(2)\r
                        for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
                        {\r
-                               register long i0 = i+nx*j;      s.z.a[i0] = v;\r
+                               long i0 = i+nx*j;       s.z.a[i0] = v;\r
                                s.x.a[i0] = x->v(i);    s.y.a[i0] = y->v(j);\r
                                s.a.a[i0] = a->v(i,j,p)*(1-d) + a->v(i,j,p+1)*d;\r
                        }\r
@@ -1070,9 +1151,10 @@ void MGL_EXPORT mgl_cont3_xyz_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, HCDT
 \r
        _mgl_slice s;\r
        mgl_get_slice(s,x,y,z,a,dir,sVal,both);\r
+#pragma omp parallel for\r
        for(long i=0;i<v->GetNx();i++)\r
        {\r
-               register mreal v0 = v->v(i);\r
+               mreal v0 = v->v(i);\r
                mgl_cont_gen(gr,v0,&s.a,&s.x,&s.y,&s.z,gr->GetC(ss,v0),text,0);\r
        }\r
        gr->EndGroup();\r
@@ -1234,9 +1316,10 @@ void MGL_EXPORT mgl_contf3_xyz_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, HCDT
        long ss=gr->AddTexture(sch);\r
        _mgl_slice s;\r
        mgl_get_slice(s,x,y,z,a,dir,sVal,both);\r
+#pragma omp parallel for\r
        for(long i=0;i<v->GetNx()-1;i++)\r
        {\r
-               register mreal v0 = v->v(i);\r
+               mreal v0 = v->v(i);\r
                mgl_contf_gen(gr,v0,v->v(i+1),&s.a,&s.x,&s.y,&s.z,gr->GetC(ss,v0),0);\r
        }\r
        gr->EndGroup();\r
@@ -1315,7 +1398,7 @@ void MGL_NO_EXPORT mgl_axial_plot(mglBase *gr,long pc, mglPoint *ff, long *nn,ch
        for(long i=0;i<pc;i++)\r
        {\r
                if(nn[i]<0)     continue;\r
-               register long k = mgl_find_prev(i,pc,nn);\r
+               long k = mgl_find_prev(i,pc,nn);\r
                q1 = k<0 ? ff[nn[i]]-ff[i]  : (ff[nn[i]]-ff[k])*0.5;\r
                q2 = nn[nn[i]]<0 ? ff[nn[i]]-ff[i]  : (ff[nn[nn[i]]]-ff[i])*0.5;\r
 \r
@@ -1329,7 +1412,7 @@ void MGL_NO_EXPORT mgl_axial_plot(mglBase *gr,long pc, mglPoint *ff, long *nn,ch
                for(long j=1;j<41;j++)\r
                {\r
                        p3 = p1;        p4 = p2;\r
-                       register float co = mgl_cos[(j*18)%360], si = mgl_cos[(270+j*18)%360];\r
+                       float co = mgl_cos[(j*18)%360], si = mgl_cos[(270+j*18)%360];\r
 //                     fi = j*M_PI/20;         si = sin(fi);   co = cos(fi);\r
                        p = a*ff[i].y + b*(si*ff[i].x) +  c*(co*ff[i].x);\r
                        p1 = wire ?     gr->AddPnt(p,cc) : gr->AddPnt(p,cc,(a*q1.y + b*(si*q1.x) +  c*(co*q1.x))^(b*co-c*si));\r
@@ -1362,7 +1445,7 @@ void MGL_EXPORT mgl_axial_gen(HMGL gr, mreal val, HCDT a, HCDT x, HCDT y, mreal
        const mglData *ma = dynamic_cast<const mglData *>(a);\r
        if(mx&&my&&ma)  for(long j=0;j<m;j++)   for(long i=0;i<n;i++)\r
        {\r
-               register long i0 = i+n*j;\r
+               long i0 = i+n*j;\r
                mreal d = (i<n-1)?mgl_d(val,ma->a[i0+n*m*ak],ma->a[i0+1+n*m*ak]):-1;\r
                if(d>=0 && d<1)\r
                {\r
@@ -1378,7 +1461,7 @@ void MGL_EXPORT mgl_axial_gen(HMGL gr, mreal val, HCDT a, HCDT x, HCDT y, mreal
        }\r
        else    for(long j=0;j<m;j++)   for(long i=0;i<n;i++)\r
        {\r
-               register mreal va=a->v(i,j,ak),vx=x->v(i,j),vy=y->v(i,j);\r
+               mreal va=a->v(i,j,ak),vx=x->v(i,j),vy=y->v(i,j);\r
                mreal d = (i<n-1)?mgl_d(val,va,a->v(i+1,j,ak)):-1;\r
                if(d>=0 && d<1)\r
                {\r
@@ -1411,7 +1494,7 @@ void MGL_EXPORT mgl_axial_gen(HMGL gr, mreal val, HCDT a, HCDT x, HCDT y, mreal
                                long i21 = long(kk[k].x+1e-5), i22 = long(kk[k].x-1e-5);\r
                                long j21 = long(kk[k].y+1e-5), j22 = long(kk[k].y-1e-5);\r
                                // check if in the same cell\r
-                               register bool cond = (i11==i21 || i11==i22 || i12==i21 || i12==i22) &&\r
+                               bool cond = (i11==i21 || i11==i22 || i12==i21 || i12==i22) &&\r
                                (j11==j21 || j11==j22 || j12==j21 || j12==j22);\r
                                if(cond){       i=k;    break;  }\r
                        }\r
@@ -1458,10 +1541,11 @@ void MGL_EXPORT mgl_axial_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const
        // x, y -- have the same size z\r
        int wire = mglchr(sch,'#')?1:0;\r
        if(mglchr(sch,'.'))     wire = 2;\r
+#pragma omp parallel for collapse(2)\r
        for(long i=0;i<v->GetNx();i++)  for(long j=0;j<z->GetNz();j++)\r
        {\r
-               if(gr->NeedStop())      {       i = v->GetNx(); j = z->GetNz(); continue;       }\r
-               register mreal v0 = v->v(i);\r
+               if(gr->NeedStop())      continue;\r
+               mreal v0 = v->v(i);\r
                mgl_axial_gen(gr,v0,z,x,y,gr->GetC(s,v0),dir,j,wire);\r
        }\r
        gr->EndGroup();\r
@@ -1469,7 +1553,7 @@ void MGL_EXPORT mgl_axial_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_axial_val(HMGL gr, HCDT v, HCDT a, const char *sch, const char *opt)\r
 {\r
-       register long n=a->GetNx(), m=a->GetNy();\r
+       long n=a->GetNx(), m=a->GetNy();\r
        if(n<2 || m<2)  {       gr->SetWarn(mglWarnLow,"Axial");        return; }\r
        gr->SaveState(opt);\r
        mglDataV x(n, m), y(n, m);\r
index 6c97cf2859f40b13b6ce6f6712bc0241c4d3b25a..c3377fcc80c234db808b00e808326be99bf2fb09 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * crust.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -47,11 +47,11 @@ void MGL_EXPORT mgl_triplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCD
                gr->Reserve(m*3);\r
                for(long i=0;i<m;i++)   if(nums->v(0,i)>=0 && nums->v(1,i)>=0 && nums->v(2,i)>=0)\r
                {\r
-                       register long k1 = long(nums->v(0,i)+0.5);\r
+                       long k1 = long(nums->v(0,i)+0.5);\r
                        p1.Set(x->v(k1), y->v(k1), z->v(k1));\r
-                       register long k2 = long(nums->v(1,i)+0.5);\r
+                       long k2 = long(nums->v(1,i)+0.5);\r
                        p2.Set(x->v(k2), y->v(k2), z->v(k2));\r
-                       register long k3 = long(nums->v(2,i)+0.5);\r
+                       long k3 = long(nums->v(2,i)+0.5);\r
                        p3.Set(x->v(k3), y->v(k3), z->v(k3));\r
                        q = wire ? mglPoint(NAN,NAN) : (p2-p1) ^ (p3-p1);\r
                        k1 = gr->AddPnt(p1,gr->GetC(ss,a->v(k1)),q);\r
@@ -67,9 +67,9 @@ void MGL_EXPORT mgl_triplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCD
                mglPoint *pp = new mglPoint[n];\r
                for(long i=0;i<m;i++)   if(nums->v(0,i)>=0 && nums->v(1,i)>=0 && nums->v(2,i)>=0)       // add averaged normales\r
                {\r
-                       register long k1 = long(nums->v(0,i)+0.5);\r
-                       register long k2 = long(nums->v(1,i)+0.5);\r
-                       register long k3 = long(nums->v(2,i)+0.5);\r
+                       long k1 = long(nums->v(0,i)+0.5);\r
+                       long k2 = long(nums->v(1,i)+0.5);\r
+                       long k3 = long(nums->v(2,i)+0.5);\r
                        if(!wire)\r
                        {\r
                                mglPoint q(mglPoint(x->v(k2)-x->v(k1), y->v(k2)-y->v(k1), z->v(k2)-z->v(k1)) ^\r
@@ -85,9 +85,9 @@ void MGL_EXPORT mgl_triplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCD
                        kk[i] = gr->AddPnt(mglPoint(x->v(i), y->v(i), z->v(i)), gr->GetC(ss,a->v(i)), pp[i]);\r
                for(long i=0;i<m;i++)   if(nums->v(0,i)>=0 && nums->v(1,i)>=0 && nums->v(2,i)>=0)       // draw triangles\r
                {\r
-                       register long k1 = long(nums->v(0,i)+0.5);\r
-                       register long k2 = long(nums->v(1,i)+0.5);\r
-                       register long k3 = long(nums->v(2,i)+0.5);\r
+                       long k1 = long(nums->v(0,i)+0.5);\r
+                       long k2 = long(nums->v(1,i)+0.5);\r
+                       long k3 = long(nums->v(2,i)+0.5);\r
                        if(wire)\r
                        {\r
                                gr->line_plot(kk[k1],kk[k2]);   gr->line_plot(kk[k1],kk[k3]);\r
@@ -149,13 +149,13 @@ void MGL_EXPORT mgl_quadplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HC
                gr->Reserve(m*4);\r
                for(long i=0;i<m;i++)   if(nums->v(0,i)>=0 && nums->v(1,i)>=0 && nums->v(2,i)>=0 && nums->v(3,i)>=0)\r
                {\r
-                       register long k1 = long(nums->v(0,i)+0.5);\r
+                       long k1 = long(nums->v(0,i)+0.5);\r
                        p1.Set(x->v(k1), y->v(k1), z->v(k1));\r
-                       register long k2 = long(nums->v(1,i)+0.5);\r
+                       long k2 = long(nums->v(1,i)+0.5);\r
                        p2.Set(x->v(k2), y->v(k2), z->v(k2));\r
-                       register long k3 = long(nums->v(2,i)+0.5);\r
+                       long k3 = long(nums->v(2,i)+0.5);\r
                        p3.Set(x->v(k3), y->v(k3), z->v(k3));\r
-                       register long k4 = long(nums->v(3,i)+0.5);\r
+                       long k4 = long(nums->v(3,i)+0.5);\r
                        p4.Set(x->v(k4), y->v(k4), z->v(k4));\r
                        mglPoint q = wire ? mglPoint(NAN,NAN):(p2-p1) ^ (p3-p1);\r
                        k1 = gr->AddPnt(p1,gr->GetC(ss,a->v(k1)),q);\r
@@ -172,13 +172,13 @@ void MGL_EXPORT mgl_quadplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HC
                mglPoint *pp = new mglPoint[n];\r
                for(long i=0;i<m;i++)   if(nums->v(0,i)>=0 && nums->v(1,i)>=0 && nums->v(2,i)>=0 && nums->v(3,i)>=0)\r
                {       // add averaged normales\r
-                       register long k1 = long(nums->v(0,i)+0.5);\r
+                       long k1 = long(nums->v(0,i)+0.5);\r
                        p1.Set(x->v(k1), y->v(k1), z->v(k1));\r
-                       register long k2 = long(nums->v(1,i)+0.5);\r
+                       long k2 = long(nums->v(1,i)+0.5);\r
                        p2.Set(x->v(k2), y->v(k2), z->v(k2));\r
-                       register long k3 = long(nums->v(2,i)+0.5);\r
+                       long k3 = long(nums->v(2,i)+0.5);\r
                        p3.Set(x->v(k3), y->v(k3), z->v(k3));\r
-                       register long k4 = long(nums->v(3,i)+0.5);\r
+                       long k4 = long(nums->v(3,i)+0.5);\r
                        p4.Set(x->v(k4), y->v(k4), z->v(k4));\r
 \r
                        if(wire)        pp[k1]=pp[k2]=pp[k3]=pp[k4]=mglPoint(NAN,NAN);\r
@@ -195,10 +195,10 @@ void MGL_EXPORT mgl_quadplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HC
                        kk[i] = gr->AddPnt(mglPoint(x->v(i), y->v(i), z->v(i)),gr->GetC(ss,a->v(i)), pp[i]);\r
                for(long i=0;i<m;i++)   if(nums->v(0,i)>=0 && nums->v(1,i)>=0 && nums->v(2,i)>=0 && nums->v(3,i)>=0)\r
                {       // draw quads\r
-                       register long k1 = long(nums->v(0,i)+0.5);\r
-                       register long k2 = long(nums->v(1,i)+0.5);\r
-                       register long k3 = long(nums->v(2,i)+0.5);\r
-                       register long k4 = long(nums->v(3,i)+0.5);\r
+                       long k1 = long(nums->v(0,i)+0.5);\r
+                       long k2 = long(nums->v(1,i)+0.5);\r
+                       long k3 = long(nums->v(2,i)+0.5);\r
+                       long k4 = long(nums->v(3,i)+0.5);\r
                        if(wire)\r
                        {\r
                                gr->line_plot(kk[k1],kk[k2]);   gr->line_plot(kk[k1],kk[k3]);\r
@@ -252,8 +252,8 @@ std::vector<mglSegment> MGL_NO_EXPORT mgl_tri_lines(mreal val, HCDT nums, HCDT a
        {\r
                long k1 = long(nums->v(0,i)+0.5), k2 = long(nums->v(1,i)+0.5), k3 = long(nums->v(2,i)+0.5);\r
                if(k1<0 || k1>=n || k2<0 || k2>=n || k3<0 || k3>=n)     continue;\r
-               register mreal v1 = a->v(k1), v2 = a->v(k2), v3 = a->v(k3);\r
-               register mreal d1 = mgl_d(val,v1,v2), d2 = mgl_d(val,v1,v3), d3 = mgl_d(val,v2,v3);\r
+               mreal v1 = a->v(k1), v2 = a->v(k2), v3 = a->v(k3);\r
+               mreal d1 = mgl_d(val,v1,v2), d2 = mgl_d(val,v1,v3), d3 = mgl_d(val,v2,v3);\r
                mglSegment line;\r
                if(d1>=0 && d1<=1 && d2>=0 && d2<=1)\r
                {\r
@@ -503,9 +503,11 @@ HMDT MGL_EXPORT mgl_triangulation_2d(HCDT x, HCDT y)
        double x1=mglInf, x2=-mglInf, y1=mglInf, y2=-mglInf;\r
        for(long i=0;i<n;i++)\r
        {\r
-               register mreal xx=x->vthr(i), yy = y->vthr(i);\r
-               if(xx<x1)       x1=xx;  if(xx>x2)       x2=xx;\r
-               if(yy<y1)       y1=yy;  if(yy>y2)       y2=yy;\r
+               mreal xx=x->vthr(i), yy = y->vthr(i);\r
+               if(xx<x1)       x1=xx;\r
+               if(xx>x2)       x2=xx;\r
+               if(yy<y1)       y1=yy;\r
+               if(yy>y2)       y2=yy;\r
        }\r
        const double dx=x2-x1, dy=y2-y1;\r
        if(dx==0 || dy==0)      return nums;\r
@@ -552,9 +554,9 @@ HMDT MGL_EXPORT mgl_triangulation_2d(HCDT x, HCDT y)
        }\r
 \r
        if (triads.empty()) {\r
-               mgl_set_global_warn("Cannot triangulate this set!");\r
+               mgl_set_global_warn(_("Cannot triangulate this set!"));\r
        } else if(original_size > pts.size()) {\r
-               mgl_set_global_warn("There are duplicated or indistinguishably adjacent points for triangulation.");\r
+               mgl_set_global_warn(_("There are duplicated or indistinguishably adjacent points for triangulation."));\r
        }\r
 \r
        long m = triads.size();\r
@@ -589,7 +591,7 @@ MGL_NO_EXPORT void *mgl_grid_t(void *par)
 #endif\r
        for(long i0=t->id;i0<t->n;i0+=mglNumThr)        if(d[3*i0]>=0 && d[3*i0+1]>=0 && d[3*i0+2]>=0)\r
        {\r
-               register long k1 = long(d[3*i0]+0.5), k2 = long(d[3*i0+1]+0.5), k3 = long(d[3*i0+2]+0.5);\r
+               long k1 = long(d[3*i0]+0.5), k2 = long(d[3*i0+1]+0.5), k3 = long(d[3*i0+2]+0.5);\r
                mreal dxu,dxv,dyu,dyv;\r
                mreal z1=zdat->vthr(k1), z2=zdat->vthr(k2), z3=zdat->vthr(k3);\r
                mglPoint d1(x[k2]-x[k1],y[k2]-y[k1],z2-z1), d2(x[k3]-x[k1],y[k3]-y[k1],z3-z1), p;\r
@@ -608,12 +610,11 @@ MGL_NO_EXPORT void *mgl_grid_t(void *par)
                y1 = y1>0 ? y1:0; y2 = y2<ny ? y2:ny-1;\r
                if((x1>x2) | (y1>y2)) continue;\r
 \r
-               register mreal u,v,xx,yy, x0 = x[k1], y0 = y[k1];\r
-               register long i,j;\r
-               for(i=x1;i<=x2;i++) for(j=y1;j<=y2;j++)\r
+               mreal x0 = x[k1], y0 = y[k1];\r
+               for(long i=x1;i<=x2;i++) for(long j=y1;j<=y2;j++)\r
                {\r
-                       xx = (i-x0); yy = (j-y0);\r
-                       u = dxu*xx+dyu*yy; v = dxv*xx+dyv*yy;\r
+                       mreal xx = (i-x0), yy = (j-y0);\r
+                       mreal u = dxu*xx+dyu*yy, v = dxv*xx+dyv*yy;\r
                        if((u<0) | (v<0) | (u+v>1)) continue;\r
                        b[i+nx*j] = z1 + d1.z*u + d2.z*v;\r
                }\r
@@ -631,7 +632,7 @@ void MGL_EXPORT mgl_data_grid_xy(HMDT d, HCDT xdat, HCDT ydat, HCDT zdat, mreal
        mglData *nums = mgl_triangulation_2d(xdat,ydat);\r
        if(nums->nx<3)  {       delete nums;    return; }\r
        long nn = nums->ny, par[3]={d->nx,d->ny,d->nz};\r
-       mreal xx[4]={x1,(d->nx-1.)/(x2-x1), y1,(d->ny-1.)/(y2-y1)};\r
+       mreal xx[4]={x1,(d->nx-1)/(x2-x1), y1,(d->ny-1)/(y2-y1)};\r
 \r
        mreal *xc=new mreal[n], *yc=new mreal[n];\r
        if(x && y)\r
@@ -697,11 +698,10 @@ long MGL_NO_EXPORT mgl_insert_trig(long i1,long i2,long i3,long **n)
                memset(*n+3*(Max-1024),0,3*1024*sizeof(long));\r
        }\r
        long *nn;\r
-       register long i,k1;\r
-       if(i1>i3)       {       k1=i1;  i1=i3;  i3=k1;  }       // simple sorting\r
-       if(i1>i2)       {       k1=i1;  i1=i2;  i2=k1;  }\r
-       if(i2>i3)       {       k1=i2;  i2=i3;  i3=k1;  }\r
-       for(i=0;i<Cur;i++)      // check if it is unique\r
+       if(i1>i3)       {       long k1=i1;     i1=i3;  i3=k1;  }       // simple sorting\r
+       if(i1>i2)       {       long k1=i1;     i1=i2;  i2=k1;  }\r
+       if(i2>i3)       {       long k1=i2;     i2=i3;  i3=k1;  }\r
+       for(long i=0;i<Cur;i++) // check if it is unique\r
        {\r
                nn = *n + 3*i;\r
                if(nn[0]==i1 && nn[1]==i2 && nn[2]==i3) return Cur;\r
@@ -726,37 +726,40 @@ long MGL_NO_EXPORT mgl_get_next(long k1,long n,long *,long *set,mglPoint *qq)
 //-----------------------------------------------------------------------------\r
 long MGL_NO_EXPORT mgl_crust(long n,mglPoint *pp,long **nn,mreal ff)\r
 {      // TODO: update to normal algorithm\r
-       register long i,j;\r
-       register mreal r,rm,rs;\r
+       mreal rs=0;\r
        if(ff<=0)       ff=2;\r
-       for(rs=0,i=0;i<n;i++)\r
+       for(long i=0;i<n;i++)\r
        {\r
-               for(rm = FLT_MAX,j=0;j<n;j++)\r
+               mreal rm = FLT_MAX;\r
+               for(long j=0;j<n;j++)\r
                {\r
                        if(i==j)        continue;\r
-                       r = mgl_anorm(pp[i]-pp[j]);\r
+                       mreal r = mgl_anorm(pp[i]-pp[j]);\r
                        if(rm>r)        rm = r;\r
                }\r
                rs += sqrt(rm);\r
        }\r
        rs *= ff/n;     rs = rs*rs;             // "average" distance\r
-       long ind[100], set[100], ii;    // indexes of "close" points, flag that it was added and its number\r
-       mglPoint qq[100];       // normalized point coordinates\r
+       const int nnum=100;\r
+       long *ind, *set;        // indexes of "close" points, flag that it was added and its number\r
+       mglPoint *qq;   // normalized point coordinates\r
+       ind = new long[nnum];   set = new long[nnum];   qq = new mglPoint[nnum];\r
        long k1,k2,k3,m=0;\r
-       for(i=0;i<n;i++)        // now the triangles will be found\r
+       for(long i=0;i<n;i++)   // now the triangles will be found\r
        {\r
-               memset(set,0,100*sizeof(long));\r
-               for(ii=0,j=0;j<n;j++)   // find close vertexes\r
+               memset(set,0,nnum*sizeof(long));\r
+               long ii=0;\r
+               for(long j=0;j<n;j++)   // find close vertexes\r
                {\r
-                       r = mgl_anorm(pp[i]-pp[j]);\r
+                       mreal r = mgl_anorm(pp[i]-pp[j]);\r
                        if(r<=rs && j!=i)       {       ind[ii] = j;    ii++;   if(ii==99)      break;}\r
                }\r
                if(ii<3)        continue;       // nothing to do\r
-               for(j=0;j<ii;j++)\r
+               for(long j=0;j<ii;j++)\r
                {\r
                        k1 = j; k2 = ind[j];    k3 = i;\r
-                       qq[k1] = pp[k2] - pp[k3];       r = qq[k1].norm();\r
-                       qq[k1] /= r;\r
+                       qq[k1] = pp[k2] - pp[k3];\r
+                       qq[k1] /= qq[k1].norm();\r
                }\r
                k1 = 0;\r
                while((k2=mgl_get_next(k1,ii,ind,set,qq))>0)\r
@@ -767,72 +770,6 @@ long MGL_NO_EXPORT mgl_crust(long n,mglPoint *pp,long **nn,mreal ff)
                }\r
                m = mgl_insert_trig(i,ind[k1],ind[0],nn);\r
        }\r
-       return m;\r
-}\r
-//-----------------------------------------------------------------------------\r
-void MGL_NO_EXPORT mgl_ifs_2d_point(HCDT A, mreal& x, mreal& y, mreal amax)\r
-{\r
-       long i, n=A->GetNy();\r
-       mreal r = amax*mgl_rnd(), sum_prob = 0, x1;\r
-       for(i=0;i<n;i++)\r
-       {\r
-               sum_prob += A->v(6,i);\r
-               if(r<sum_prob)  break;\r
-       }\r
-       x1= A->v(0,i)*x + A->v(1,i)*y + A->v(4,i);\r
-       y = A->v(2,i)*x + A->v(3,i)*y + A->v(5,i);      x = x1;\r
-}\r
-HMDT MGL_EXPORT mgl_data_ifs_2d(HCDT A, long n, long skip)\r
-{\r
-       if(!A || A->GetNx()<7 || n<1)   return 0;       // incompatible dimensions\r
-       mreal amax=0;\r
-       for(long i=0; i<A->GetNy(); i++)        amax += A->v(6,i);\r
-       if(amax<=0)     return 0;\r
-\r
-       mglData *f = new mglData(2,n);\r
-       mreal x = 0, y = 0;\r
-       for(long i=0; i<skip; i++)      mgl_ifs_2d_point(A, x, y,amax);\r
-       for(long i=0; i<n; i++)\r
-       {\r
-               mgl_ifs_2d_point(A, x, y, amax);\r
-               f->a[2*i] = x;  f->a[2*i+1] = y;\r
-       }\r
-       return f;\r
-}\r
-uintptr_t MGL_EXPORT mgl_data_ifs_2d_(uintptr_t *d, long *n, long *skip)\r
-{      return uintptr_t(mgl_data_ifs_2d(_DT_,*n,*skip));       }\r
-//-----------------------------------------------------------------------------\r
-void MGL_NO_EXPORT mgl_ifs_3d_point(HCDT A, mreal& x, mreal& y, mreal& z, mreal amax)\r
-{\r
-       int i, n=A->GetNy();\r
-       mreal r = amax*mgl_rnd(), sum_prob = 0, x1, y1;\r
-       for (i=0; i<n; i++)\r
-       {\r
-               sum_prob += A->v(12,i);\r
-               if(r < sum_prob)  break;\r
-       }\r
-       x1= A->v(0,i)*x + A->v(1,i)*y + A->v(2,i)*z + A->v(9,i);\r
-       y1= A->v(3,i)*x + A->v(4,i)*y + A->v(5,i)*z + A->v(10,i);\r
-       z = A->v(6,i)*x + A->v(7,i)*y + A->v(8,i)*z + A->v(11,i);\r
-       x = x1; y = y1;\r
-}\r
-HMDT MGL_EXPORT mgl_data_ifs_3d(HCDT A, long n, long skip)\r
-{\r
-       if(!A || A->GetNx()<13 || n<1)  return 0;   // incompatible dimensions\r
-       mreal amax = 0;\r
-       for(int i=0; i<A->GetNy(); i++) amax += A->v(12,i);\r
-       if(amax <= 0) return 0;\r
-\r
-       mglData *f = new mglData(3,n);\r
-       mreal x = 0, y = 0, z = 0;\r
-       for(long i=0; i<skip; i++)      mgl_ifs_3d_point(A, x, y, z, amax);\r
-       for(long i=0; i<n; i++)\r
-       {\r
-               mgl_ifs_3d_point(A, x, y, z, amax);\r
-               f->a[3*i] = x;  f->a[3*i+1] = y;        f->a[3*i+2] = z;\r
-       }\r
-       return f;\r
+       delete []set;   delete []ind;   delete []qq;    return m;\r
 }\r
-uintptr_t MGL_EXPORT mgl_data_ifs_3d_(uintptr_t *d, long *n, long *skip)\r
-{   return uintptr_t(mgl_data_ifs_3d(_DT_,*n,*skip));   }\r
 //-----------------------------------------------------------------------------\r
index c6927af102719c02cfed9c06ecee90c280d7d010..2e43bd989158bfffb55d4d1bc7506b6ef6980091 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * data.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -66,12 +66,11 @@ void MGL_EXPORT mglStartThread(void *(*func)(void *), void (*post)(mglThreadD *,
        {\r
                pthread_t *tmp=new pthread_t[mglNumThr];\r
                mglThreadD *par=new mglThreadD[mglNumThr];\r
-               register long i;\r
-               for(i=0;i<mglNumThr;i++)        // put parameters into the structure\r
+               for(long i=0;i<mglNumThr;i++)   // put parameters into the structure\r
                {       par[i].n=n;     par[i].a=a;     par[i].b=b;     par[i].c=c;     par[i].d=d;\r
                        par[i].p=p;     par[i].v=v;     par[i].s=s;     par[i].e=e;     par[i].id=i;    }\r
-               for(i=0;i<mglNumThr;i++)        pthread_create(tmp+i, 0, func, par+i);\r
-               for(i=0;i<mglNumThr;i++)        pthread_join(tmp[i], 0);\r
+               for(long i=0;i<mglNumThr;i++)   pthread_create(tmp+i, 0, func, par+i);\r
+               for(long i=0;i<mglNumThr;i++)   pthread_join(tmp[i], 0);\r
                if(post)        post(par,a);\r
                delete []tmp;   delete []par;\r
        }\r
@@ -97,12 +96,11 @@ void MGL_EXPORT mglStartThreadV(void *(*func)(void *), long n, mreal *a, const v
        {\r
                pthread_t *tmp=new pthread_t[mglNumThr];\r
                mglThreadV *par=new mglThreadV[mglNumThr];\r
-               register long i;\r
-               for(i=0;i<mglNumThr;i++)        // put parameters into the structure\r
+               for(long i=0;i<mglNumThr;i++)   // put parameters into the structure\r
                {       par[i].n=n;     par[i].a=a;     par[i].b=b;     par[i].c=c;     par[i].d=d;\r
                        par[i].p=p;     par[i].v=v;     par[i].id=i;par[i].aa=0;        }\r
-               for(i=0;i<mglNumThr;i++)        pthread_create(tmp+i, 0, func, par+i);\r
-               for(i=0;i<mglNumThr;i++)        pthread_join(tmp[i], 0);\r
+               for(long i=0;i<mglNumThr;i++)   pthread_create(tmp+i, 0, func, par+i);\r
+               for(long i=0;i<mglNumThr;i++)   pthread_join(tmp[i], 0);\r
                delete []tmp;   delete []par;\r
        }\r
        else\r
@@ -165,7 +163,7 @@ MGL_NO_EXPORT void *mgl_smth_x(void *par)
 #endif\r
                for(long i=t->id;i<t->n;i+=mglNumThr)\r
                {\r
-                       register long j = i%nx;\r
+                       long j = i%nx;\r
                        if(j-kind<0)    j = i+kind-j;\r
                        else if(j+kind>nx-1)    j = i+nx-1-j-kind;\r
                        else    j=i;\r
@@ -177,7 +175,7 @@ MGL_NO_EXPORT void *mgl_smth_x(void *par)
 #endif\r
                for(long i=t->id;i<t->n;i+=mglNumThr)\r
                {\r
-                       register long j = i%nx;\r
+                       long j = i%nx;\r
                        if(j>1 && j<nx-2)       b[i] = (12*a[i-2] - 3*a[i-1] + 17*a[i] - 3*a[i+1] + 12*a[i+2])/35.;\r
                        else if(j==1 || j==nx-2)        b[i] = (a[i-1] + a[i] + a[i+1])/3.;\r
                        else    b[i] = a[i];\r
@@ -205,7 +203,7 @@ MGL_NO_EXPORT void *mgl_smth_y(void *par)
 #endif\r
                for(long i=t->id;i<t->n;i+=mglNumThr)\r
                {\r
-                       register long j = (i/nx)%ny;\r
+                       long j = (i/nx)%ny;\r
                        if(j-kind<0)    j = i+(kind-j)*nx;\r
                        else if(j+kind>ny-1)    j = i+(ny-1-j-kind)*nx;\r
                        else    j=i;\r
@@ -217,7 +215,7 @@ MGL_NO_EXPORT void *mgl_smth_y(void *par)
 #endif\r
                for(long i=t->id;i<t->n;i+=mglNumThr)\r
                {\r
-                       register long j = (i/nx)%ny;\r
+                       long j = (i/nx)%ny;\r
                        if(j>1 && j<ny-2)       b[i] = (12*a[i-2*nx] - 3*a[i-nx] + 17*a[i] - 3*a[i+nx] + 12*a[i+2*nx])/35.;\r
                        else if(j==1 || j==ny-2)        b[i] = (a[i-nx] + a[i] + a[i+nx])/3.;\r
                        else    b[i] = a[i];\r
@@ -236,7 +234,7 @@ MGL_NO_EXPORT void *mgl_smth_y(void *par)
 MGL_NO_EXPORT void *mgl_smth_z(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
-       register long nn=t->p[0]*t->p[1], nz=t->n/nn, kind=t->p[2];\r
+       long nn=t->p[0]*t->p[1], nz=t->n/nn, kind=t->p[2];\r
        mreal *b=t->a, delta=t->c[0];\r
        const mreal *a=t->b;\r
        if(kind>1)\r
@@ -245,7 +243,7 @@ MGL_NO_EXPORT void *mgl_smth_z(void *par)
 #endif\r
                for(long i=t->id;i<t->n;i+=mglNumThr)\r
                {\r
-                       register long j = i/nn;\r
+                       long j = i/nn;\r
                        if(j-kind<0)    j = i+(kind-j)*nn;\r
                        else if(j+kind>nz-1)    j = i+(nz-1-j-kind)*nn;\r
                        else    j=i;\r
@@ -257,7 +255,7 @@ MGL_NO_EXPORT void *mgl_smth_z(void *par)
 #endif\r
                for(long i=t->id;i<t->n;i+=mglNumThr)\r
                {\r
-                       register long j = i/nn;\r
+                       long j = i/nn;\r
                        if(j>1 && j<nz-2)       b[i] = (12*a[i-2*nn] - 3*a[i-nn] + 17*a[i] - 3*a[i+nn] + 12*a[i+2*nn])/35.;\r
                        else if(j==1 || j==nz-2)        b[i] = (a[i-nn] + a[i] + a[i+nn])/3.;\r
                        else    b[i] = a[i];\r
@@ -352,7 +350,7 @@ MGL_NO_EXPORT void *mgl_csum_y(void *par)
 #endif\r
        for(long i=t->id;i<nn;i+=mglNumThr)\r
        {\r
-               register long k = (i%nx)+nx*ny*(i/nx);          b[k] = a[k];\r
+               long k = (i%nx)+nx*ny*(i/nx);           b[k] = a[k];\r
                for(long j=1;j<ny;j++)  b[k+j*nx] = b[k+j*nx-nx] + a[k+nx*j];\r
        }\r
        return 0;\r
@@ -368,7 +366,7 @@ MGL_NO_EXPORT void *mgl_csum_x(void *par)
 #endif\r
        for(long i=t->id;i<nn;i+=mglNumThr)\r
        {\r
-               register long k = i*nx;                 b[k] = a[k];\r
+               long k = i*nx;                  b[k] = a[k];\r
                for(long j=1;j<nx;j++)  b[j+k] = b[j+k-1] + a[j+k];\r
        }\r
        return 0;\r
@@ -428,7 +426,7 @@ MGL_NO_EXPORT void *mgl_int_y(void *par)
 #endif\r
        for(long i=t->id;i<nn;i+=mglNumThr)\r
        {\r
-               register long k = (i%nx)+nx*ny*(i/nx);  b[k] = 0;\r
+               long k = (i%nx)+nx*ny*(i/nx);   b[k] = 0;\r
                for(long j=1;j<ny;j++)  b[k+j*nx] = b[k+j*nx-nx] + (a[k+j*nx]+a[k+j*nx-nx])*dd;\r
        }\r
        return 0;\r
@@ -444,7 +442,7 @@ MGL_NO_EXPORT void *mgl_int_x(void *par)
 #endif\r
        for(long i=t->id;i<nn;i+=mglNumThr)\r
        {\r
-               register long k = i*nx;                 b[k] = 0;\r
+               long k = i*nx;                  b[k] = 0;\r
                for(long j=1;j<nx;j++)  b[j+k] = b[j+k-1] + (a[j+k]+a[j+k-1])*dd;\r
        }\r
        return 0;\r
@@ -505,7 +503,7 @@ MGL_NO_EXPORT void *mgl_dif_y(void *par)
 #endif\r
        for(long i=t->id;i<nn;i+=mglNumThr)\r
        {\r
-               register long k = (i%nx)+nx*ny*(i/nx);\r
+               long k = (i%nx)+nx*ny*(i/nx);\r
                b[k] = -(3*a[k]-4*a[k+nx]+a[k+2*nx])*dd;\r
                b[k+(ny-1)*nx] = (3*a[k+(ny-1)*nx]-4*a[k+(ny-2)*nx]+a[k+(ny-3)*nx])*dd;\r
                for(long j=1;j<ny-1;j++)        b[k+j*nx] = (a[k+j*nx+nx]-a[k+j*nx-nx])*dd;\r
@@ -523,7 +521,7 @@ MGL_NO_EXPORT void *mgl_dif_x(void *par)
 #endif\r
        for(long i=t->id;i<nn;i+=mglNumThr)\r
        {\r
-               register long k = i*nx;\r
+               long k = i*nx;\r
                b[k] = -(3*a[k]-4*a[k+1]+a[k+2])*dd;\r
                b[k+nx-1] = (3*a[k+nx-1]-4*a[k+nx-2]+a[k+nx-3])*dd;\r
                for(long j=1;j<nx-1;j++)        b[j+k] = (a[j+k+1]-a[j+k-1])*dd;\r
@@ -584,7 +582,7 @@ MGL_NO_EXPORT void *mgl_dif2_y(void *par)
 #endif\r
        for(long i=t->id;i<nn;i+=mglNumThr)\r
        {\r
-               register long k = (i%nx)+nx*ny*(i/nx);  b[k] = b[k+(ny-1)*nx] = 0;\r
+               long k = (i%nx)+nx*ny*(i/nx);   b[k] = b[k+(ny-1)*nx] = 0;\r
                for(long j=1;j<ny-1;j++)        b[k+j*nx] = (a[k+j*nx+nx]+a[k+j*nx-nx]-2*a[k+j*nx])*dd;\r
        }\r
        return 0;\r
@@ -600,7 +598,7 @@ MGL_NO_EXPORT void *mgl_dif2_x(void *par)
 #endif\r
        for(long i=t->id;i<nn;i+=mglNumThr)\r
        {\r
-               register long k = i*nx;                 b[k] = b[k+nx-1] = 0;\r
+               long k = i*nx;                  b[k] = b[k+nx-1] = 0;\r
                for(long j=1;j<nx-1;j++)        b[j+k] = (a[j+k+1]+a[j+k-1]-2*a[j+k])*dd;\r
        }\r
        return 0;\r
@@ -692,8 +690,8 @@ void MGL_EXPORT mgl_data_mirror(HMDT d, const char *dir)
 #pragma omp parallel for collapse(2)\r
                for(long j=0;j<nz/2;j++)        for(long i=0;i<nx*ny;i++)\r
                {\r
-                       register long i0 = i+j*nx*ny, j0 = i+(nz-1-j)*nx*ny;\r
-                       register mreal b = a[i0];       a[i0] = a[j0];  a[j0] = b;\r
+                       long i0 = i+j*nx*ny, j0 = i+(nz-1-j)*nx*ny;\r
+                       mreal b = a[i0];        a[i0] = a[j0];  a[j0] = b;\r
                }\r
        }\r
        if(strchr(dir,'y') && ny>1)\r
@@ -701,11 +699,11 @@ void MGL_EXPORT mgl_data_mirror(HMDT d, const char *dir)
 #pragma omp parallel for\r
                for(long i=0;i<nx*nz;i++)\r
                {\r
-                       register long j0 = (i%nx)+nx*ny*(i/nx);\r
+                       long j0 = (i%nx)+nx*ny*(i/nx);\r
                        for(long j=0;j<ny/2;j++)\r
                        {\r
-                               register long i0 = j0+(ny-1-j)*nx;\r
-                               register mreal b = a[j0+j*nx];  a[j0+j*nx] = a[i0];     a[i0] = b;\r
+                               long i0 = j0+(ny-1-j)*nx;\r
+                               mreal b = a[j0+j*nx];   a[j0+j*nx] = a[i0];     a[i0] = b;\r
                        }\r
                }\r
        }\r
@@ -714,11 +712,11 @@ void MGL_EXPORT mgl_data_mirror(HMDT d, const char *dir)
 #pragma omp parallel for\r
                for(long j=0;j<ny*nz;j++)\r
                {\r
-                       register long j0 = j*nx;\r
+                       long j0 = j*nx;\r
                        for(long i=0;i<nx/2;i++)\r
                        {\r
-                               register long i0 = nx-1-i+j0;\r
-                               register mreal b = a[i+j0];     a[i+j0] = a[i0];        a[i0] = b;\r
+                               long i0 = nx-1-i+j0;\r
+                               mreal b = a[i+j0];      a[i+j0] = a[i0];        a[i0] = b;\r
                        }\r
                }\r
        }\r
@@ -730,7 +728,7 @@ void MGL_EXPORT mgl_data_mirror_(uintptr_t *d, const char *dir,int l)
 void MGL_EXPORT mgl_data_clean(HMDT d, long id)\r
 {\r
        if(id<0 || id+1>d->nx)  return;\r
-       register long i,j,n=d->nx,m=d->ny;\r
+       long i,j,n=d->nx,m=d->ny;\r
        mreal *b = new mreal[m*n], *a=d->a;\r
        for(i=j=0;i+1<m;i++)\r
        {\r
@@ -763,9 +761,9 @@ MGL_NO_EXPORT void *mgl_solve_x(void *par)
 #endif\r
        for(long l=t->id;l<nn;l+=mglNumThr)\r
        {\r
-               register long j=l%ny, k=l/ny;   b[l] = NAN;\r
+               long j=l%ny, k=l/ny;    b[l] = NAN;\r
                if(ii && ii[l]!=ii[l])  continue;\r
-               register long i0 = ii?(ii[l]*n1+1):0;\r
+               long i0 = ii?(ii[l]*n1+1):0;\r
                if(i0>nx-2)     continue;\r
                if(a)   for(long i=i0+1;i<nx;i++)\r
                {\r
@@ -790,7 +788,7 @@ MGL_NO_EXPORT void *mgl_solve_x(void *par)
                }\r
                else    for(long i=i0+1;i<nx;i++)\r
                {\r
-                       register mreal y1=d->v(i-1,j,k), y2=d->v(i,j,k);\r
+                       mreal y1=d->v(i-1,j,k), y2=d->v(i,j,k);\r
                        if((y1-val)*(y2-val)<=0)\r
                        {       b[l] = i-1 + (val-y1)/(y2-y1);  break;  }\r
                }\r
@@ -810,9 +808,9 @@ MGL_NO_EXPORT void *mgl_solve_y(void *par)
 #endif\r
        for(long l=t->id;l<nn;l+=mglNumThr)\r
        {\r
-               register long j=l%nx, k=l/nx;   b[l] = NAN;\r
+               long j=l%nx, k=l/nx;    b[l] = NAN;\r
                if(ii && ii[l]!=ii[l])  continue;\r
-               register long i0 = ii?(ii[l]*n1+1):0;\r
+               long i0 = ii?(ii[l]*n1+1):0;\r
                if(i0>ny-2)     continue;\r
                if(a)   for(long i=i0+1;i<ny;i++)\r
                {\r
@@ -837,7 +835,7 @@ MGL_NO_EXPORT void *mgl_solve_y(void *par)
                }\r
                else    for(long i=i0+1;i<ny;i++)\r
                {\r
-                       register mreal y1=d->v(j,i-1,k), y2=d->v(j,i,k);\r
+                       mreal y1=d->v(j,i-1,k), y2=d->v(j,i,k);\r
                        if((y1-val)*(y2-val)<=0)\r
                        {       b[l] = i-1 + (val-y1)/(y2-y1);  break;  }\r
                }\r
@@ -857,9 +855,9 @@ MGL_NO_EXPORT void *mgl_solve_z(void *par)
 #endif\r
        for(long l=t->id;l<nn;l+=mglNumThr)\r
        {\r
-               register long j=l%nx, k=l/nx;   b[l] = NAN;\r
+               long j=l%nx, k=l/nx;    b[l] = NAN;\r
                if(ii && ii[l]!=ii[l])  continue;\r
-               register long i0 = ii?(ii[l]*n1+1):0;\r
+               long i0 = ii?(ii[l]*n1+1):0;\r
                if(i0>nz-2)     continue;\r
                if(a)   for(long i=i0+1;i<nz;i++)\r
                {\r
@@ -884,7 +882,7 @@ MGL_NO_EXPORT void *mgl_solve_z(void *par)
                }\r
                else    for(long i=i0+1;i<nz;i++)\r
                {\r
-                       register mreal y1=d->v(j,k,i-1), y2=d->v(j,k,i);\r
+                       mreal y1=d->v(j,k,i-1), y2=d->v(j,k,i);\r
                        if((y1-val)*(y2-val)<=0)\r
                        {       b[l] = i-1 + (val-y1)/(y2-y1);  break;  }\r
                }\r
@@ -1038,7 +1036,7 @@ mreal MGL_EXPORT mgl_data_linear_ext(HCDT d, mreal x,mreal y,mreal z, mreal *dx,
                        {\r
                                a2=a0 = d->v(kx);       a1 = d->v(kx+1);        b0 = b1 = a0*(1-x) + x*a1;\r
                        }\r
-                       else    b0 = b1 = dd->a[0];\r
+                       else    b0 = b1 = d->v(0);\r
                }\r
                if(dx)  *dx = a1-a0;\r
                if(dy)  *dy = a2-a0;\r
@@ -1075,6 +1073,78 @@ mreal MGL_EXPORT mgl_data_solve_1d_(uintptr_t *d, mreal *val, int *spl, int *i0)
 uintptr_t MGL_EXPORT mgl_data_solve_(uintptr_t *d, mreal *val, const char *dir, uintptr_t *i0, int *norm,int)\r
 {      return uintptr_t(mgl_data_solve(_DA_(d),*val, *dir, _DA_(i0), *norm));  }\r
 //-----------------------------------------------------------------------------\r
+long MGL_NO_EXPORT int_pow(long x, long n)\r
+{\r
+       if(n==2)        return x*x;\r
+       if(n==1)        return x;\r
+       if(n==0)        return 1;\r
+       if(n<0)         return 0;\r
+       long t = int_pow(x,n/2);        t = t*t;\r
+       if(n%2==1)      t *= x;\r
+       return t;\r
+}\r
+long MGL_NO_EXPORT mgl_powers(long N, const char *how)\r
+{\r
+       bool k2 = mglchr(how,'2'), k3 = mglchr(how,'3'), k5 = mglchr(how,'5');\r
+       const double lN=log(N), l2=log(2), l3=log(3), l5=log(5);\r
+       if(k2 && k3 && k5)\r
+       {\r
+               double dm=lN;   long im=0, jm=0, km=0;\r
+               for(long i=0;i<=lN/l2;i++)      for(long j=0;j<=(lN-i*l2)/l3;j++)       for(long k=0;k<=(lN-i*l2-j*l3)/l5;k++)\r
+               {\r
+                       double d = lN-i*l2-j*l3-k*l5;\r
+                       if(d>0 && d<dm) {       im=i;   jm=j;   km=k;   dm=d;   }\r
+               }\r
+               return int_pow(2,im)*int_pow(3,jm)*int_pow(5,km);\r
+       }\r
+       else if(k2 && !k3 && !k5)       return int_pow(2,lN/l2);\r
+       else if(k3 && !k2 && !k5)       return int_pow(3,lN/l3);\r
+       else if(k5 && !k3 && !k2)       return int_pow(5,lN/l5);\r
+       else if(k2 && k3 && !k5)\r
+       {\r
+               double dm=lN;   long im=0, jm=0;\r
+               for(long i=0;i<=lN/l2;i++)      for(long j=0;j<=(lN-i*l2)/l3;j++)\r
+               {\r
+                       double d = lN-i*l2-j*l3;\r
+                       if(d>0 && d<dm) {       im=i;   jm=j;   dm=d;   }\r
+               }\r
+               return int_pow(2,im)*int_pow(3,jm);\r
+       }\r
+       else if(k2 && k5 && !k3)\r
+       {\r
+               double dm=lN;   long im=0, jm=0;\r
+               for(long i=0;i<=lN/l2;i++)      for(long j=0;j<=(lN-i*l2)/l5;j++)\r
+               {\r
+                       double d = lN-i*l2-j*l5;\r
+                       if(d>0 && d<dm) {       im=i;   jm=j;   dm=d;   }\r
+               }\r
+               return int_pow(2,im)*int_pow(5,jm);\r
+       }\r
+       else if(k5 && k3 && !k2)\r
+       {\r
+               double dm=lN;   long im=0, jm=0;\r
+               for(long i=0;i<=lN/l5;i++)      for(long j=0;j<=(lN-i*l5)/l3;j++)\r
+               {\r
+                       double d = lN-i*l5-j*l3;\r
+                       if(d>0 && d<dm) {       im=i;   jm=j;   dm=d;   }\r
+               }\r
+               return int_pow(5,im)*int_pow(3,jm);\r
+       }\r
+       return 0;\r
+}\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_data_crop_opt(HMDT d, const char *how)\r
+{\r
+       const char *h = "235";\r
+       if(mglchr(how,'2') || mglchr(how,'3') || mglchr(how,'5'))       h = how;\r
+       if(mglchr(how,'x'))     mgl_data_crop(d, 0, mgl_powers(d->nx, h), 'x');\r
+       if(mglchr(how,'y'))     mgl_data_crop(d, 0, mgl_powers(d->ny, h), 'y');\r
+       if(mglchr(how,'z'))     mgl_data_crop(d, 0, mgl_powers(d->nz, h), 'z');\r
+}\r
+void MGL_EXPORT mgl_data_crop_opt_(uintptr_t *d, const char *how, int l)\r
+{      char *s=new char[l+1];  memcpy(s,how,l);        s[l]=0;\r
+       mgl_data_crop_opt(_DT_,s);      delete []s;     }\r
+//-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_data_crop(HMDT d, long n1, long n2, char dir)\r
 {\r
        long nx=d->nx,ny=d->ny,nz=d->nz, nn;\r
@@ -1098,8 +1168,8 @@ void MGL_EXPORT mgl_data_crop(HMDT d, long n1, long n2, char dir)
                n2 = n2>0 ? n2 : ny+n2;\r
                if(n2<0 || n2>=ny || n2<n1)     n2 = ny;\r
                nn = n2-n1;     b = new mreal[nn*nx*nz];\r
-#pragma omp parallel for\r
-               for(long i=0;i<nn;i++)  for(long j=0;j<nz;j++)\r
+#pragma omp parallel for collapse(2)\r
+               for(long j=0;j<nz;j++)  for(long i=0;i<nn;i++)\r
                        memcpy(b+nx*(i+nn*j),d->a+nx*(n1+i+ny*j),nx*sizeof(mreal));\r
                d->ny = nn;     if(!d->link)    delete []d->a;\r
                d->a = b;       d->link=false;\r
@@ -1126,7 +1196,7 @@ mreal MGL_EXPORT mgl_data_last(HCDT d, const char *cond, long *i, long *j, long
        if(*i<0 || *i>=nx)      *i=nx;\r
        if(*j<0 || *j>=ny)      *j=ny-1;\r
        if(*k<0 || *k>=nz)      *k=nz-1;\r
-       register long i0 = *i+nx*(*j+ny*(*k))-1;\r
+       long i0 = *i+nx*(*j+ny*(*k))-1;\r
        mreal x,y,z,dx=nx>1?1/(nx-1.):0,dy=ny>1?1/(ny-1.):0,dz=nz>1?1/(nz-1.):0;\r
        for(;i0>=0;i0--)\r
        {\r
@@ -1149,7 +1219,7 @@ mreal MGL_EXPORT mgl_data_first(HCDT d, const char *cond, long *i, long *j, long
        if(*i<0 || *i>=nx)      *i=nx;\r
        if(*j<0 || *j>=ny)      *j=ny-1;\r
        if(*k<0 || *k>=nz)      *k=nz-1;\r
-       register long i0 = *i+nx*(*j+ny*(*k))-1;\r
+       long i0 = *i+nx*(*j+ny*(*k))-1;\r
        mreal x,y,z,dx=nx>1?1/(nx-1.):0,dy=ny>1?1/(ny-1.):0,dz=nz>1?1/(nz-1.):0;\r
        for(;i0<nx*ny*nz;i0--)\r
        {\r
@@ -1167,7 +1237,7 @@ mreal MGL_EXPORT mgl_data_first_(uintptr_t *d, const char *cond, int *i, int *j,
 long MGL_EXPORT mgl_data_find(HCDT d, const char *cond, char dir, long i, long j, long k)\r
 {\r
        long nx=d->GetNx(),ny=d->GetNy(),nz=d->GetNz();\r
-       register long m=-1;\r
+       long m=-1;\r
        if(!cond)       cond = "u";\r
        mglFormula eq(cond);\r
        mreal x=i/(nx-1.),y=j/(ny-1.),z=k/(nz-1.);\r
@@ -1211,7 +1281,7 @@ mreal MGL_EXPORT mgl_data_momentum_val(HCDT dd, char dir, mreal *x, mreal *w, mr
 #pragma omp parallel for reduction(+:i0,i1,i2,i3,i4)\r
                for(long i=0;i<nx*ny*nz;i++)\r
                {\r
-                       register mreal d = i%nx, t = d*d, v = dd->vthr(i);\r
+                       mreal d = mreal(i%nx), t = d*d, v = dd->vthr(i);\r
                        i0+= v; i1+= v*d;       i2+= v*t;\r
                        i3+= v*d*t;             i4+= v*t*t;\r
                }\r
@@ -1220,7 +1290,7 @@ mreal MGL_EXPORT mgl_data_momentum_val(HCDT dd, char dir, mreal *x, mreal *w, mr
 #pragma omp parallel for reduction(+:i0,i1,i2,i3,i4)\r
                for(long i=0;i<nx*ny*nz;i++)\r
                {\r
-                       register mreal d = (i/nx)%ny, t = d*d, v = dd->vthr(i);\r
+                       mreal d = mreal((i/nx)%ny), t = d*d, v = dd->vthr(i);\r
                        i0+= v; i1+= v*d;       i2+= v*t;\r
                        i3+= v*d*t;             i4+= v*t*t;\r
                }\r
@@ -1229,7 +1299,7 @@ mreal MGL_EXPORT mgl_data_momentum_val(HCDT dd, char dir, mreal *x, mreal *w, mr
 #pragma omp parallel for reduction(+:i0,i1,i2,i3,i4)\r
                for(long i=0;i<nx*ny*nz;i++)\r
                {\r
-                       register mreal d = i/(nx*ny), t = d*d, v = dd->vthr(i);\r
+                       mreal d = mreal(i/(nx*ny)), t = d*d, v = dd->vthr(i);\r
                        i0+= v; i1+= v*d;       i2+= v*t;\r
                        i3+= v*d*t;             i4+= v*t*t;\r
                }\r
@@ -1239,13 +1309,13 @@ mreal MGL_EXPORT mgl_data_momentum_val(HCDT dd, char dir, mreal *x, mreal *w, mr
 #pragma omp parallel for reduction(+:i1,i2,i3,i4)\r
                for(long i=0;i<nx*ny*nz;i++)\r
                {\r
-                       register mreal v = dd->vthr(i), t = v*v;\r
+                       mreal v = dd->vthr(i), t = v*v;\r
                        i1+= v;                 i2+= t;\r
                        i3+= v*t;               i4+= t*t;\r
                }\r
        }\r
        if(i0==0)       return 0;\r
-       register mreal d=i1/i0;\r
+       mreal d=i1/i0;\r
        if(x)   *x=d;\r
        if(w)   *w=i2>d*d*i0 ? sqrt(i2/i0-d*d) : 0;\r
        if(s)   *s=i3/i0;\r
@@ -1262,7 +1332,7 @@ void MGL_EXPORT mgl_data_norm_slice(HMDT d, mreal v1,mreal v2,char dir,long keep
        long nx=d->nx, ny=d->ny, nz=d->nz;\r
        mreal *a=d->a;\r
        mglData b(*d);\r
-       register mreal e0=1, e, m1, m2, aa;\r
+       mreal e0=1, e, m1, m2, aa;\r
        if(sym) {       v2 = -v1>v2 ? -v1:v2;   v1 = -v2;       }\r
        if(dir=='z' && nz>1)\r
        {\r
@@ -1344,24 +1414,24 @@ MGL_EXPORT const char *mgl_data_info(HCDT d)    // NOTE: Not thread safe function!
        long i=0,j=0,k=0;\r
        mreal A=0,Wa=0,X=0,Y=0,Z=0,Wx=0,Wy=0,Wz=0, b;\r
        b = mgl_data_max_int(d,&i,&j,&k);\r
-       snprintf(s,128,"Maximum is %g\t at x = %ld\ty = %ld\tz = %ld\n", b,i,j,k);\r
+       snprintf(s,128,_("Maximum is %g\t at x = %ld\ty = %ld\tz = %ld\n"), b,i,j,k);\r
        s[127]=0;       strcat(buf,s);\r
        b = mgl_data_min_int(d,&i,&j,&k);\r
-       snprintf(s,128,"Minimum is %g\t at x = %ld\ty = %ld\tz = %ld\n", b,i,j,k);\r
+       snprintf(s,128,_("Minimum is %g\t at x = %ld\ty = %ld\tz = %ld\n"), b,i,j,k);\r
        s[127]=0;       strcat(buf,s);\r
 \r
        mgl_data_momentum_val(d,'a',&A,&Wa,0,0);        mgl_data_momentum_val(d,'x',&X,&Wx,0,0);\r
        mgl_data_momentum_val(d,'y',&Y,&Wy,0,0);        mgl_data_momentum_val(d,'z',&Z,&Wz,0,0);\r
-       snprintf(s,128,"Averages are:\n<a> = %g\t<x> = %g\t<y> = %g\t<z> = %g\n", A,X,Y,Z);\r
+       snprintf(s,128,_("Averages are:\n<a> = %g\t<x> = %g\t<y> = %g\t<z> = %g\n"), A,X,Y,Z);\r
        s[127]=0;       strcat(buf,s);\r
-       snprintf(s,128,"Widths are:\nWa = %g\tWx = %g\tWy = %g\tWz = %g\n", Wa,Wx,Wy,Wz);\r
+       snprintf(s,128,_("Widths are:\nWa = %g\tWx = %g\tWy = %g\tWz = %g\n"), Wa,Wx,Wy,Wz);\r
        s[127]=0;       strcat(buf,s);\r
        return buf;\r
 }\r
 int MGL_EXPORT mgl_data_info_(uintptr_t *d, char *out, int len)\r
 {\r
        const char *res = mgl_data_info(_DA_(d));\r
-       if(out) strncpy(out,res,len);\r
+       if(out) mgl_strncpy(out,res,len);\r
        return strlen(res);\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -1465,10 +1535,9 @@ void MGL_EXPORT mgl_data_delete_(uintptr_t *d, const char *dir, int *at, int *nu
 void MGL_NO_EXPORT mgl_omod(mreal *a, mreal da, int nx, int n)\r
 {\r
        bool qq=true;\r
-       register mreal q;\r
        for(long i=1;i<nx;i++)\r
        {\r
-               register long ii = i*n;\r
+               long ii = i*n;\r
                if(mgl_isnan(a[ii-n]))  {       qq=true;        continue;       }\r
                if(qq)\r
                {\r
@@ -1477,7 +1546,7 @@ void MGL_NO_EXPORT mgl_omod(mreal *a, mreal da, int nx, int n)
                }\r
                else\r
                {\r
-                       q = 2*a[ii-n]-a[ii-2*n];\r
+                       mreal q = 2*a[ii-n]-a[ii-2*n];\r
                        a[ii] += omod(q-a[ii], da);\r
                }\r
        }\r
@@ -1529,11 +1598,11 @@ void MGL_EXPORT mgl_data_sew_(uintptr_t *d, const char *dirs, mreal *da, int l)
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_data_put_val(HMDT d, mreal val, long xx, long yy, long zz)\r
 {\r
-       register long nx=d->nx, ny=d->ny, nz=d->nz;\r
+       long nx=d->nx, ny=d->ny, nz=d->nz;\r
        if(xx>=nx || yy>=ny || zz>=nz)  return;\r
        mreal *a=d->a;\r
        if(xx>=0 && yy>=0 && zz>=0)     a[xx+nx*(yy+zz*ny)] = val;\r
-       if(xx<0 && yy<0 && zz<0)\r
+       else if(xx<0 && yy<0 && zz<0)\r
 #pragma omp parallel for\r
                for(long i=0;i<nx*ny*nz;i++)    a[i] = val;\r
        else if(xx<0 && yy<0)\r
@@ -1544,7 +1613,7 @@ void MGL_EXPORT mgl_data_put_val(HMDT d, mreal val, long xx, long yy, long zz)
                for(long i=0;i<nz*ny;i++)       a[xx+i*nx] = val;\r
        else if(xx<0 && zz<0)\r
 #pragma omp parallel for collapse(2)\r
-               for(long i=0;i<nx;i++)  for(long j=0;j<nz;j++)  a[i+nx*(yy+j*ny)] = val;\r
+               for(long j=0;j<nz;j++)  for(long i=0;i<nx;i++)  a[i+nx*(yy+j*ny)] = val;\r
        else if(xx<0)\r
 #pragma omp parallel for\r
                for(long i=0;i<nx;i++)  a[i+nx*(yy+zz*ny)] = val;\r
@@ -1558,7 +1627,7 @@ void MGL_EXPORT mgl_data_put_val(HMDT d, mreal val, long xx, long yy, long zz)
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_data_put_dat(HMDT d, HCDT v, long xx, long yy, long zz)\r
 {\r
-       register long nx=d->nx, ny=d->ny, nz=d->nz;\r
+       long nx=d->nx, ny=d->ny, nz=d->nz;\r
        if(xx>=nx || yy>=ny || zz>=nz)  return;\r
        const mglData *mv = dynamic_cast<const mglData *>(v);\r
        mreal *a=d->a, vv=v->v(0);\r
@@ -1569,17 +1638,17 @@ void MGL_EXPORT mgl_data_put_dat(HMDT d, HCDT v, long xx, long yy, long zz)
                if(vx>=nx && vy>=ny && vz>=nz)\r
 #pragma omp parallel for\r
                        for(long ii=0;ii<nx*ny*nz;ii++)\r
-                       {       register long i=ii%nx, j=(ii/nx)%ny, k=ii/(nx*ny);\r
+                       {       long i=ii%nx, j=(ii/nx)%ny, k=ii/(nx*ny);\r
                                a[ii] = b?b[i+vx*(j+k*vy)]:v->v(i,j,k); }\r
                else if(vx>=nx && vy>=ny)\r
 #pragma omp parallel for\r
                        for(long ii=0;ii<nx*ny*nz;ii++)\r
-                       {       register long i=ii%nx, j=(ii/nx)%ny;\r
+                       {       long i=ii%nx, j=(ii/nx)%ny;\r
                                a[ii] = b?b[i+vx*j]:v->v(i,j);  }\r
                else if(vx>=nx)\r
 #pragma omp parallel for\r
                        for(long ii=0;ii<nx*ny*nz;ii++)\r
-                       {       register long i=ii%nx;  a[ii] = b?b[i]:v->v(i); }\r
+                       {       long i=ii%nx;   a[ii] = b?b[i]:v->v(i); }\r
                else\r
 #pragma omp parallel for\r
                        for(long ii=0;ii<nx*ny*nz;ii++) a[ii] = vv;\r
@@ -1590,12 +1659,12 @@ void MGL_EXPORT mgl_data_put_dat(HMDT d, HCDT v, long xx, long yy, long zz)
                if(vx>=nx && vy>=ny)\r
 #pragma omp parallel for\r
                        for(long ii=0;ii<nx*ny;ii++)\r
-                       {       register long i=ii%nx, j=ii/nx;\r
+                       {       long i=ii%nx, j=ii/nx;\r
                                a[ii+zz] = b?b[i+vx*j]:v->v(i,j);       }\r
                else if(vx>=nx)\r
 #pragma omp parallel for\r
                        for(long ii=0;ii<nx*ny;ii++)\r
-                       {       register long i=ii%nx;  a[ii+zz] = b?b[i]:v->v(i);      }\r
+                       {       long i=ii%nx;   a[ii+zz] = b?b[i]:v->v(i);      }\r
                else\r
 #pragma omp parallel for\r
                        for(long ii=0;ii<nx*ny;ii++)    a[ii+zz] = vv;\r
@@ -1605,12 +1674,12 @@ void MGL_EXPORT mgl_data_put_dat(HMDT d, HCDT v, long xx, long yy, long zz)
                if(vx>=ny && vy>=nz)\r
 #pragma omp parallel for\r
                        for(long ii=0;ii<ny*nz;ii++)\r
-                       {       register long i=ii%ny, j=ii/ny;\r
+                       {       long i=ii%ny, j=ii/ny;\r
                                a[ii*nx+xx] = b?b[i+vx*j]:v->v(i,j);    }\r
                else if(vx>=ny)\r
 #pragma omp parallel for\r
                        for(long ii=0;ii<ny*nz;ii++)\r
-                       {       register long i=ii%ny;  a[ii*nx+xx] = b?b[i]:v->v(i);   }\r
+                       {       long i=ii%ny;   a[ii*nx+xx] = b?b[i]:v->v(i);   }\r
                else\r
 #pragma omp parallel for\r
                        for(long ii=0;ii<ny*nz;ii++)    a[ii*nx+xx] = vv;\r
@@ -1621,17 +1690,17 @@ void MGL_EXPORT mgl_data_put_dat(HMDT d, HCDT v, long xx, long yy, long zz)
                if(vx>=nx && vy>=nz)\r
 #pragma omp parallel for\r
                        for(long ii=0;ii<nx*nz;ii++)\r
-                       {       register long i=ii%nx, j=ii/nx;\r
+                       {       long i=ii%nx, j=ii/nx;\r
                                a[i+yy+j*zz] = b?b[i+vx*j]:v->v(i,j);   }\r
                else if(vx>=nx)\r
 #pragma omp parallel for\r
                        for(long ii=0;ii<nx*nz;ii++)\r
-                       {       register long i=ii%nx, j=ii/nx;\r
+                       {       long i=ii%nx, j=ii/nx;\r
                                a[i+yy+j*zz] = b?b[i]:v->v(i);  }\r
                else\r
 #pragma omp parallel for\r
                        for(long ii=0;ii<nx*nz;ii++)\r
-                       {       register long i=ii%nx, j=ii/nx;\r
+                       {       long i=ii%nx, j=ii/nx;\r
                                a[i+yy+j*zz] = vv;      }\r
        }\r
        else if(xx<0)\r
@@ -1684,7 +1753,7 @@ MGL_NO_EXPORT void *mgl_diff_3(void *par)
 #endif\r
        for(long i0=t->id;i0<nn;i0+=mglNumThr)\r
        {\r
-               register long i=i0%nx, j=((i0/nx)%ny), k=i0/(nx*ny);\r
+               long i=i0%nx, j=((i0/nx)%ny), k=i0/(nx*ny);\r
                if(i==0)\r
                {\r
                        au = 3*a[i0]-4*a[i0+1]+a[i0+2];\r
@@ -1755,7 +1824,7 @@ MGL_NO_EXPORT void *mgl_diff_3(void *par)
 MGL_NO_EXPORT void *mgl_diff_2(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
-       register long nx=t->p[0], ny=t->p[1], nn=t->n, same=t->p[2];\r
+       long nx=t->p[0], ny=t->p[1], nn=t->n, same=t->p[2];\r
        mreal *b=t->a,au,av,xu,xv,yu,yv;\r
        HCDT x=(HCDT)(t->c),y=(HCDT)(t->d);\r
        const mreal *a=t->b;\r
@@ -1764,7 +1833,7 @@ MGL_NO_EXPORT void *mgl_diff_2(void *par)
 #endif\r
        for(long i0=t->id;i0<nn;i0+=mglNumThr)\r
        {\r
-               register long i=i0%nx, j=((i0/nx)%ny), i1 = same ? i0 : i0%(nx*ny);\r
+               long i=i0%nx, j=((i0/nx)%ny), i1 = same ? i0 : i0%(nx*ny);\r
                if(i==0)\r
                {\r
                        au = 3*a[i0]-4*a[i0+1]+a[i0+2];\r
@@ -1817,7 +1886,7 @@ MGL_NO_EXPORT void *mgl_diff_1(void *par)
 #endif\r
        for(long i0=t->id;i0<nn;i0+=mglNumThr)\r
        {\r
-               register long i=i0%nx, i1 = same ? i0 : i;\r
+               long i=i0%nx, i1 = same ? i0 : i;\r
                if(i==0)\r
                {\r
                        au = 3*a[i0]-4*a[i0+1]+a[i0+2];\r
@@ -1867,7 +1936,7 @@ void MGL_EXPORT mgl_data_set_value_(uintptr_t *d, mreal *v, int *i, int *j, int
 {      mgl_data_set_value(_DT_,*v,*i,*j,*k);   }\r
 //-----------------------------------------------------------------------------\r
 mreal MGL_EXPORT mgl_data_get_value(HCDT dat, long i, long j, long k)\r
-{      register long nx = dat->GetNx(), ny = dat->GetNy();\r
+{      long nx = dat->GetNx(), ny = dat->GetNy();\r
        return (i>=0 && i<nx && j>=0 && j<ny && k>=0 && k<dat->GetNz()) ? dat->vthr(i+nx*(j+ny*k)):NAN; }\r
 mreal MGL_EXPORT mgl_data_get_value_(uintptr_t *d, int *i, int *j, int *k)\r
 {      return mgl_data_get_value(_DA_(d),*i,*j,*k);    }\r
@@ -1875,7 +1944,7 @@ mreal MGL_EXPORT mgl_data_get_value_(uintptr_t *d, int *i, int *j, int *k)
 MGL_EXPORT mreal *mgl_data_data(HMDT dat)      {       return dat->a;  }\r
 //-----------------------------------------------------------------------------\r
 MGL_EXPORT mreal *mgl_data_value(HMDT dat, long i,long j,long k)\r
-{      register long ii=i*dat->nx*(j+dat->ny*k);\r
+{      long ii=i*dat->nx*(j+dat->ny*k);\r
        return  ii>=0 && ii<dat->GetNN() ? dat->a+ii : 0;       }\r
 //-----------------------------------------------------------------------------\r
 long MGL_EXPORT mgl_data_get_nx(HCDT dat)      {       return dat->GetNx();    }\r
@@ -1923,7 +1992,7 @@ void MGL_EXPORT mgl_data_refill_gs(HMDT dat, HCDT xdat, HCDT vdat, mreal x1, mre
 #pragma omp parallel for\r
        for(long i=0;i<nx;i++)\r
        {\r
-               register mreal d = mgl_gspline(coef,x0+dx*i,0,0);\r
+               mreal d = mgl_gspline(coef,x0+dx*i,0,0);\r
                if(sl<0)        for(long j=0;j<nn;j++)  dat->a[i+j*nx] = d;\r
                else    dat->a[i+sl*nx] = d;\r
        }\r
@@ -1945,7 +2014,7 @@ mreal MGL_NO_EXPORT mgl_index_1(mreal v, HCDT dat)
        do\r
        {\r
                d = count<10?(d2-d1)*(v-v1)/(v2-v1)+d1:(d1+d2)/2;       count++;\r
-               register mreal val = dat->value(d,0,0);\r
+               mreal val = dat->value(d,0,0);\r
 //             if(fabs(val-v)<acx)     break;\r
                if(val==v || d2-d<eps)  break;\r
                if((v1-v)*(val-v)<0)    {       v2=val; d2=d;   }       else    {       v1=val; d1=d;   }\r
@@ -1961,8 +2030,8 @@ void MGL_EXPORT mgl_data_refill_x(HMDT dat, HCDT xdat, HCDT vdat, mreal x1, mrea
 #pragma omp parallel for\r
        for(long i=0;i<nx;i++)\r
        {\r
-               register mreal u = mgl_index_1(x1+dx*i,xdat);\r
-               register mreal d = vdat->value(u,0,0);\r
+               mreal u = mgl_index_1(x1+dx*i,xdat);\r
+               mreal d = vdat->value(u,0,0);\r
                if(sl<0)        for(long j=0;j<nn;j++)  dat->a[i+j*nx] = d;\r
                else    dat->a[i+sl*nx] = d;\r
        }\r
@@ -2037,8 +2106,8 @@ void MGL_EXPORT mgl_data_refill_xy(HMDT dat, HCDT xdat, HCDT ydat, HCDT vdat, mr
 #pragma omp parallel for collapse(2)\r
                for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
                {\r
-                       register mreal d = vdat->value(u.a[i],v.a[j],0);\r
-                       register long i0=i+nx*j;\r
+                       mreal d = vdat->value(u.a[i],v.a[j],0);\r
+                       long i0=i+nx*j;\r
                        if(sl<0)        for(long k=0;k<nz;k++)  dat->a[i0+k*nn] = d;\r
                        else    dat->a[i0+sl*nn] = d;\r
                }\r
@@ -2047,6 +2116,7 @@ void MGL_EXPORT mgl_data_refill_xy(HMDT dat, HCDT xdat, HCDT ydat, HCDT vdat, mr
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_data_refill_xyz(HMDT dat, HCDT xdat, HCDT ydat, HCDT zdat, HCDT vdat, mreal x1, mreal x2, mreal y1, mreal y2, mreal z1, mreal z2)\r
 {\r
+       if(!dat || !xdat || !ydat || !zdat || !vdat)    return;\r
        long nx=dat->nx,ny=dat->ny,nz=dat->nz,mx=vdat->GetNx(),my=vdat->GetNy(),mz=vdat->GetNz();\r
        bool both=(xdat->GetNN()==vdat->GetNN() && ydat->GetNN()==vdat->GetNN() && zdat->GetNN()==vdat->GetNN());\r
        if(!both && (xdat->GetNx()!=mx || ydat->GetNx()!=my || zdat->GetNx()!=mz))      return; // incompatible dimensions\r
@@ -2097,18 +2167,20 @@ HMDT MGL_EXPORT mgl_data_evaluate(HCDT dat, HCDT idat, HCDT jdat, HCDT kdat, int
        const mglData *dd=dynamic_cast<const mglData *>(dat);\r
        long nx=dat->GetNx(), ny=dat->GetNy(), nz=dat->GetNz();\r
        mglData *r=new mglData(idat->GetNx(),idat->GetNy(),idat->GetNz());\r
+       mreal dx = nx-1, dy = ny-1, dz = nz-1;\r
+       if(!norm)       dx=dy=dz=1;\r
        if(dd)\r
 #pragma omp parallel for\r
                for(long i=0;i<idat->GetNN();i++)\r
                {\r
-                       mreal x=idat->vthr(i), y=jdat?jdat->vthr(i):0, z=kdat?kdat->vthr(i):0;\r
+                       mreal x=dx*idat->vthr(i), y=jdat?dy*jdat->vthr(i):0, z=kdat?dz*kdat->vthr(i):0;\r
                        r->a[i] = mgl_isnum(x*y*z)?mglSpline3st<mreal>(dd->a,nx,ny,nz, x,y,z):NAN;\r
                }\r
        else\r
 #pragma omp parallel for\r
                for(long i=0;i<idat->GetNN();i++)\r
                {\r
-                       mreal x=idat->vthr(i), y=jdat?jdat->vthr(i):0, z=kdat?kdat->vthr(i):0;\r
+                       mreal x=dx*idat->vthr(i), y=jdat?dy*jdat->vthr(i):0, z=kdat?dz*kdat->vthr(i):0;\r
                        r->a[i] = mgl_isnum(x*y*z)?dat->linear(x,y,z):NAN;;\r
                }\r
        return r;\r
@@ -2158,3 +2230,229 @@ mreal MGL_EXPORT mgl_gspline(HCDT c, mreal dx, mreal *d1, mreal *d2)
 mreal MGL_EXPORT mgl_gspline_(uintptr_t *c, mreal *dx, mreal *d1, mreal *d2)\r
 {      return mgl_gspline(_DA_(c),*dx,d1,d2);  }\r
 //-----------------------------------------------------------------------------\r
+struct pnt     {       mreal x,y;      pnt(mreal X, mreal Y):x(X),y(Y){}       };\r
+mreal MGL_NO_EXPORT mgl_find_pnt(std::vector<mreal> &mpos, mreal est, mreal dj)\r
+{\r
+       mreal mv = dj, val=NAN;\r
+       size_t n = mpos.size(), kk=0;\r
+       for(size_t k=0;k<n;k++)\r
+       {\r
+               mreal de = mpos[k]-est;\r
+               if(fabs(de)<fabs(mv))   {       mv=de;  val=de+est;     kk=k;   }\r
+       }\r
+       if(mgl_isnum(val))      mpos.erase(mpos.begin()+kk);\r
+       return val;\r
+}\r
+HMDT MGL_EXPORT mgl_data_detect(HCDT d, mreal lvl, mreal dj, mreal di, mreal min_len)\r
+{\r
+       long nx=d->GetNx(), ny=d->GetNy();\r
+       std::vector<mreal> *max_pos = new std::vector<mreal>[nx];\r
+       if(di<=0)       di=dj;\r
+       for(long i=0;i<nx;i++)  // first collect maximums for each i\r
+       {\r
+               for(long j=1;j<ny-1;j++)\r
+               {\r
+                       mreal v = d->v(i,j), v1 = d->v(i,j-1), v2 = d->v(i,j+1);\r
+                       if(v>lvl && v1<v && v>=v2)      // NOTE only one edge is required\r
+//                     if(v>lvl && ((v1<=v && v>v2) || (v1<v && v>=v2)))       // NOTE only edges are required\r
+                       {\r
+                               bool c1=false, c2=false;\r
+                               for(long j1=j-1;j1>=0;j1--)\r
+                               {\r
+                                       mreal vv = d->v(i,j1);\r
+                                       if(vv>v)        break;\r
+                                       if(vv<v/2)      {       c1=true;        break;  }\r
+                               }\r
+                               for(long j2=j+1;j2<ny;j2++)\r
+                               {\r
+                                       mreal vv = d->v(i,j2);\r
+                                       if(vv>v)        break;\r
+                                       if(vv<v/2)      {       c2=true;        break;  }\r
+                               }\r
+                               if(c1 && c2)    max_pos[i].push_back(j + (v2-v1)/(2*v-v2-v1)/2);\r
+                       }\r
+               }\r
+       }\r
+       std::vector<pnt> curv;\r
+       for(long ii=0;ii<nx-1;ii++)     // now join points into curves\r
+       {\r
+               while(max_pos[ii].size())       // try to start curve\r
+               {\r
+                       mreal vv = max_pos[ii].back();\r
+                       max_pos[ii].pop_back();\r
+                       pnt p1(ii,vv), p2(ii-1,vv);\r
+                       size_t ini = curv.size();\r
+                       curv.push_back(p1);\r
+                       for(long i=ii+1;i<nx;i++)       // join points to selected curve\r
+                       {\r
+                               bool none=true;\r
+                               for(long k=0;k<di && i+k<nx;k++)        // try next points\r
+                               {\r
+                                       mreal val = mgl_find_pnt(max_pos[i+k],p1.y,dj);\r
+                                       if(mgl_isnum(val))      // first try closest point (for noise data)\r
+                                       {       p2=p1;  p1=pnt(i+k,val);        curv.push_back(p1);\r
+                                               none=false;     i+=k;   break;  }\r
+                                       else    // next try linear approximation\r
+                                       {\r
+                                               mreal est = p1.y + (k+1)*(p1.y-p2.y)/(p1.x-p2.x);\r
+                                               val = mgl_find_pnt(max_pos[i+k],est,dj);\r
+                                               if(mgl_isnum(val))\r
+                                               {       p2=p1;  p1=pnt(i+k,val);        curv.push_back(p1);\r
+                                                       none=false;     i+=k;   break;  }\r
+                                       }\r
+                               }\r
+                               if(none)        // break curve\r
+                               {       curv.push_back(pnt(NAN,NAN));   break;  }\r
+                       }\r
+                       if(mgl_isnum(curv.back().x))    curv.push_back(pnt(NAN,NAN));\r
+                       if(curv[curv.size()-2].x-curv[ini].x<min_len)\r
+                               curv.erase(curv.begin()+ini,curv.end());\r
+               }\r
+       }\r
+       size_t nn = curv.size();\r
+       HMDT res = new mglData(2,nn);\r
+       for(size_t k=0;k<nn;k++)\r
+       {       res->a[2*k] = curv[k].x;        res->a[2*k+1] = curv[k].y;      }\r
+       delete []max_pos;       return res;\r
+}\r
+uintptr_t MGL_EXPORT mgl_data_detect_(uintptr_t *d, mreal *lvl, mreal *dj, mreal *di, mreal *min_len)\r
+{      return uintptr_t(mgl_data_detect(_DT_,*lvl,*dj, *di, *min_len));        }\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_data_dilate(HMDT d, mreal val, long step)\r
+{\r
+       long nx = d->GetNx(), ny=d->GetNy(), nz=d->GetNz();\r
+       if(step<1 || nx<2) return;\r
+       long *dist = new long[nx*ny*nz], nn = nx*ny;\r
+       bool done=false;\r
+       if(nz>1 && ny>1)\r
+       {\r
+               done = true;\r
+               for(long k=0;k<nz;k++)  for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
+               {\r
+                       long i0 = i+nx*(j+ny*k);\r
+                       if(d->vthr(i0)>=val)    dist[i0]=0;\r
+                       else\r
+                       {\r
+                               dist[i0] = nx+ny;\r
+                               if(i>0 && dist[i0-1]+1<dist[i0])        dist[i0]=dist[i0-1]+1;\r
+                               if(j>0 && dist[i0-nx]+1<dist[i0])       dist[i0]=dist[i0-nx]+1;\r
+                               if(k>0 && dist[i0-nn]+1<dist[i0])       dist[i0]=dist[i0-nn]+1;\r
+                       }\r
+               }\r
+               for(long k=nz-1;k>=0;k--)       for(long j=ny-1;j>=0;j--)       for(long i=nx-1;i>=0;i--)\r
+               {\r
+                       long i0 = i+nx*(j+ny*k);\r
+                       if(i<nx-1 && dist[i0+1]+1<dist[i0])             dist[i0]=dist[i0+1]+1;\r
+                       if(j<ny-1 && dist[i0+nx]+1<dist[i0])    dist[i0]=dist[i0+nx]+1;\r
+                       if(k<nz-1 && dist[i0+nn]+1<dist[i0])    dist[i0]=dist[i0+nn]+1;\r
+               }\r
+       }\r
+       else if(ny>1)\r
+       {\r
+               done = true;\r
+               for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
+               {\r
+                       long i0 = i+nx*j;\r
+                       if(d->vthr(i0)>=val)    dist[i0]=0;\r
+                       else\r
+                       {\r
+                               dist[i0] = nx+ny;\r
+                               if(i>0 && dist[i0-1]+1<dist[i0])        dist[i0]=dist[i0-1]+1;\r
+                               if(j>0 && dist[i0-nx]+1<dist[i0])       dist[i0]=dist[i0-nx]+1;\r
+                       }\r
+               }\r
+               for(long j=ny-1;j>=0;j--)       for(long i=nx-1;i>=0;i--)\r
+               {\r
+                       long i0 = i+nx*j;\r
+                       if(i<nx-1 && dist[i0+1]+1<dist[i0])             dist[i0]=dist[i0+1]+1;\r
+                       if(j<ny-1 && dist[i0+nx]+1<dist[i0])    dist[i0]=dist[i0+nx]+1;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               done = true;\r
+               for(long i=0;i<nx;i++)\r
+                       if(d->v(i)>=val)        dist[i]=0;\r
+                       else\r
+                       {\r
+                               dist[i] = nx;\r
+                               if(i>0 && dist[i-1]+1<dist[i])  dist[i]=dist[i-1]+1;\r
+                       }\r
+               for(long i=nx-2;i>=0;i--)\r
+                       if(dist[i+1]+1<dist[i]) dist[i]=dist[i+1]+1;\r
+       }\r
+       if(done)        for(long i=0;i<nx*ny*nz;i++)    d->a[i] = dist[i]<=step?1:0;\r
+       delete []dist;\r
+}\r
+void MGL_EXPORT mgl_data_dilate_(uintptr_t *d, mreal *val, int *step)\r
+{      mgl_data_dilate(_DT_,*val,*step);       }\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_data_erode(HMDT d, mreal val, long step)\r
+{\r
+       long nx = d->GetNx(), ny=d->GetNy(), nz=d->GetNz();\r
+       if(step<1 || nx<2) return;\r
+       long *dist = new long[nx*ny*nz], nn = nx*ny;\r
+       bool done=false;\r
+       if(nz>1 && ny>1)\r
+       {\r
+               done = true;\r
+               for(long k=0;k<nz;k++)  for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
+               {\r
+                       long i0 = i+nx*(j+ny*k);\r
+                       if(d->vthr(i0)<val)     dist[i0]=0;\r
+                       else\r
+                       {\r
+                               dist[i0] = nx+ny;\r
+                               if(i>0 && dist[i0-1]+1<dist[i0])        dist[i0]=dist[i0-1]+1;\r
+                               if(j>0 && dist[i0-nx]+1<dist[i0])       dist[i0]=dist[i0-nx]+1;\r
+                               if(k>0 && dist[i0-nn]+1<dist[i0])       dist[i0]=dist[i0-nn]+1;\r
+                       }\r
+               }\r
+               for(long k=nz-1;k>=0;k--)       for(long j=ny-1;j>=0;j--)       for(long i=nx-1;i>=0;i--)\r
+               {\r
+                       long i0 = i+nx*(j+ny*k);\r
+                       if(i<nx-1 && dist[i0+1]+1<dist[i0])             dist[i0]=dist[i0+1]+1;\r
+                       if(j<ny-1 && dist[i0+nx]+1<dist[i0])    dist[i0]=dist[i0+nx]+1;\r
+                       if(k<nz-1 && dist[i0+nn]+1<dist[i0])    dist[i0]=dist[i0+nn]+1;\r
+               }\r
+       }\r
+       else if(ny>1)\r
+       {\r
+               done = true;\r
+               for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
+               {\r
+                       long i0 = i+nx*j;\r
+                       if(d->vthr(i0)<val)     dist[i0]=0;\r
+                       else\r
+                       {\r
+                               dist[i0] = nx+ny;\r
+                               if(i>0 && dist[i0-1]+1<dist[i0])        dist[i0]=dist[i0-1]+1;\r
+                               if(j>0 && dist[i0-nx]+1<dist[i0])       dist[i0]=dist[i0-nx]+1;\r
+                       }\r
+               }\r
+               for(long j=ny-1;j>=0;j--)       for(long i=nx-1;i>=0;i--)\r
+               {\r
+                       long i0 = i+nx*j;\r
+                       if(i<nx-1 && dist[i0+1]+1<dist[i0])             dist[i0]=dist[i0+1]+1;\r
+                       if(j<ny-1 && dist[i0+nx]+1<dist[i0])    dist[i0]=dist[i0+nx]+1;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               done = true;\r
+               for(long i=0;i<nx;i++)\r
+                       if(d->v(i)<val) dist[i]=0;\r
+                       else\r
+                       {\r
+                               dist[i] = nx;\r
+                               if(i>0 && dist[i-1]+1<dist[i])  dist[i]=dist[i-1]+1;\r
+                       }\r
+               for(long i=nx-2;i>=0;i--)\r
+                       if(dist[i+1]+1<dist[i]) dist[i]=dist[i+1]+1;\r
+       }\r
+       if(done)        for(long i=0;i<nx*ny*nz;i++)    d->a[i] = dist[i]>step?1:0;\r
+       delete []dist;\r
+}\r
+void MGL_EXPORT mgl_data_erode_(uintptr_t *d, mreal *val, int *step)\r
+{      mgl_data_erode(_DT_,*val,*step);        }\r
+//-----------------------------------------------------------------------------\r
index a719d851186beeee6d6d9410438a9979171e16a5..9bdf09b17a0cad5115e552d463070c2261e22077 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * data_new.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -48,7 +48,7 @@ HMDT MGL_EXPORT mgl_data_subdata_ext(HCDT d, HCDT xx, HCDT yy, HCDT zz)
                mglData tmp;    tmp.a[0]=-1;\r
                return mgl_data_subdata_ext(d,xx?xx:&tmp,yy?yy:&tmp,zz?zz:&tmp);\r
        }\r
-       \r
+\r
        long n=0,m=0,l=0,j,k;\r
        bool ix=false, iy=false, iz=false;\r
        if(xx->GetNz()>1)       // 3d data\r
@@ -95,35 +95,37 @@ HMDT MGL_EXPORT mgl_data_subdata_ext(HCDT d, HCDT xx, HCDT yy, HCDT zz)
        }\r
        long nx=d->GetNx(),ny=d->GetNy(),nz=d->GetNz();\r
        long vx=long(xx->v(0)), vy=long(yy->v(0)), vz=long(zz->v(0));\r
+       mglData *r;\r
        if(n*m*l>1)     // this is 2d or 3d data\r
        {\r
                mglDataV tx(n,m,l),ty(n,m,l),tz(n,m,l);\r
                if(!ix) {       xx = &tx;       if(vx>=0)       tx.Fill(vx);    else tx.All();  }\r
                if(!iy) {       yy = &ty;       if(vy>=0)       ty.Fill(vy);    else ty.All();  }\r
                if(!iz) {       zz = &tz;       if(vz>=0)       tz.Fill(vz);    else tz.All();  }\r
-               mglData *r=new mglData(n,m,l);\r
+               r=new mglData(n,m,l);\r
 #pragma omp parallel for\r
                for(long i0=0;i0<n*m*l;i0++)\r
                {\r
-                       register long x=long(0.5+xx->vthr(i0)), y=long(0.5+yy->vthr(i0)), z=long(0.5+zz->vthr(i0));\r
+                       long x=long(0.5+xx->vthr(i0)), y=long(0.5+yy->vthr(i0)), z=long(0.5+zz->vthr(i0));\r
                        r->a[i0] = (x>=0 && x<nx && y>=0 && y<ny && z>=0 && z<nz)?d->v(x,y,z):NAN;\r
                }\r
-               return r;\r
        }\r
-       // this is 1d data -> try as normal SubData()\r
-       mglDataV tx(nx),ty(ny),tz(nz);  tx.All();       ty.All();       tz.All();\r
-       if(xx->GetNx()>1 || vx>=0)      n=xx->GetNx();  else    {       n=nx;   xx = &tx;       }\r
-       if(yy->GetNx()>1 || vy>=0)      m=yy->GetNx();  else    {       m=ny;   yy = &ty;       }\r
-       if(zz->GetNx()>1 || vz>=0)      l=zz->GetNx();  else    {       l=nz;   zz = &tz;       }\r
-       mglData *r=new mglData(n,m,l);\r
-#pragma omp parallel for collapse(3)\r
-       for(long k=0;k<l;k++)   for(long j=0;j<m;j++)   for(long i=0;i<n;i++)\r
+       else    // this is 1d data -> try as normal SubData()\r
        {\r
-               register long x=long(0.5+xx->v(i)), y=long(0.5+yy->v(j)), z=long(0.5+zz->v(k));\r
-               r->a[i+n*(j+m*k)] = (x>=0 && x<nx && y>=0 && y<ny && z>=0 && z<nz)?d->v(x,y,z):NAN;\r
+               mglDataV tx(nx),ty(ny),tz(nz);  tx.All();       ty.All();       tz.All();\r
+               if(xx->GetNx()>1 || vx>=0)      n=xx->GetNx();  else    {       n=nx;   xx = &tx;       }\r
+               if(yy->GetNx()>1 || vy>=0)      m=yy->GetNx();  else    {       m=ny;   yy = &ty;       }\r
+               if(zz->GetNx()>1 || vz>=0)      l=zz->GetNx();  else    {       l=nz;   zz = &tz;       }\r
+               r=new mglData(n,m,l);\r
+#pragma omp parallel for collapse(3)\r
+               for(long k=0;k<l;k++)   for(long j=0;j<m;j++)   for(long i=0;i<n;i++)\r
+               {\r
+                       long x=long(0.5+xx->v(i)), y=long(0.5+yy->v(j)), z=long(0.5+zz->v(k));\r
+                       r->a[i+n*(j+m*k)] = (x>=0 && x<nx && y>=0 && y<ny && z>=0 && z<nz)?d->v(x,y,z):NAN;\r
+               }\r
+               if(m==1)        {       r->ny=r->nz;    r->nz=1;        }// "squeeze" dimensions\r
+               if(n==1)        {       r->nx=r->ny;    r->ny=r->nz;    r->nz=1;        r->NewId();}\r
        }\r
-       if(m==1)        {       r->ny=r->nz;    r->nz=1;        }// "squeeze" dimensions\r
-       if(n==1)        {       r->nx=r->ny;    r->ny=r->nz;    r->nz=1;        r->NewId();}\r
        return r;\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -164,14 +166,14 @@ MGL_NO_EXPORT void *mgl_resize(void *par)
 #endif\r
        for(long i0=t->id;i0<t->n;i0+=mglNumThr)\r
        {\r
-               register long i=i0%nx, j=((i0/nx)%ny), k=i0/(nx*ny);\r
+               long i=i0%nx, j=((i0/nx)%ny), k=i0/(nx*ny);\r
                b[i0] = dat->value(c[0]+i*c[1], c[2]+j*c[3], c[4]+k*c[5]);\r
        }\r
        return 0;\r
 }\r
 HMDT MGL_EXPORT mgl_data_resize_box(HCDT dat, long mx,long my,long mz, mreal x1,mreal x2, mreal y1,mreal y2, mreal z1,mreal z2)\r
 {\r
-       register long nx = dat->GetNx(), ny = dat->GetNy(), nz = dat->GetNz();\r
+       long nx = dat->GetNx(), ny = dat->GetNy(), nz = dat->GetNz();\r
        mx = mx<1 ? nx:mx;      my = my<1 ? ny:my;      mz = mz<1 ? nz:mz;\r
        mglData *r=new mglData(mx,my,mz);\r
 \r
@@ -235,7 +237,7 @@ MGL_NO_EXPORT void *mgl_sum_y(void *par)
 #endif\r
        for(long i=t->id;i<nn;i+=mglNumThr)\r
        {\r
-               register long k = (i%nx)+nx*ny*(i/nx);  b[i]=0;\r
+               long k = (i%nx)+nx*ny*(i/nx);   b[i]=0;\r
                for(long j=0;j<ny;j++)  b[i] += a[k+nx*j];\r
                b[i] /= ny;\r
        }\r
@@ -252,7 +254,7 @@ MGL_NO_EXPORT void *mgl_sum_x(void *par)
 #endif\r
        for(long i=t->id;i<nn;i+=mglNumThr)\r
        {\r
-               register long k = i*nx; b[i]=0;\r
+               long k = i*nx;  b[i]=0;\r
                for(long j=0;j<nx;j++)  b[i] += a[j+k];\r
                b[i] /= nx;\r
        }\r
@@ -286,9 +288,10 @@ HMDT MGL_EXPORT mgl_data_sum(HCDT dat, const char *dir)
        {\r
                mglStartThread(mgl_sum_x,0,p[1]*p[2],b,c,0,p);\r
                p[0] = p[1];    p[1] = p[2];    p[2] = 1;\r
+               memcpy(c,b,p[0]*p[1]*sizeof(mreal));\r
        }\r
        mglData *r=new mglData(p[0],p[1],p[2]);\r
-       memcpy(r->a,b,p[0]*p[1]*p[2]*sizeof(mreal));\r
+       memcpy(r->a,c,p[0]*p[1]*p[2]*sizeof(mreal));\r
        delete []b;     delete []c;     return r;\r
 }\r
 uintptr_t MGL_EXPORT mgl_data_sum_(uintptr_t *d, const char *dir,int l)\r
@@ -322,7 +325,7 @@ MGL_NO_EXPORT void *mgl_max_y(void *par)
 #endif\r
        for(long i=t->id;i<nn;i+=mglNumThr)\r
        {\r
-               register long k = (i%nx)+nx*ny*(i/nx);  b[i]=a[k];\r
+               long k = (i%nx)+nx*ny*(i/nx);   b[i]=a[k];\r
                for(long j=1;j<ny;j++)  if(b[i]<a[k+nx*j])      b[i]=a[k+nx*j];\r
        }\r
        return 0;\r
@@ -338,7 +341,7 @@ MGL_NO_EXPORT void *mgl_max_x(void *par)
 #endif\r
        for(long i=t->id;i<nn;i+=mglNumThr)\r
        {\r
-               register long k = i*nx; b[i]=a[k];\r
+               long k = i*nx;  b[i]=a[k];\r
                for(long j=1;j<nx;j++)  if(b[i]<a[j+k]) b[i]=a[j+k];\r
        }\r
        return 0;\r
@@ -371,9 +374,10 @@ HMDT MGL_EXPORT mgl_data_max_dir(HCDT dat, const char *dir)
        {\r
                mglStartThread(mgl_max_x,0,p[1]*p[2],b,c,0,p);\r
                p[0] = p[1];    p[1] = p[2];    p[2] = 1;\r
+               memcpy(c,b,p[0]*p[1]*sizeof(mreal));\r
        }\r
        mglData *r=new mglData(p[0],p[1],p[2]);\r
-       memcpy(r->a,b,p[0]*p[1]*p[2]*sizeof(mreal));\r
+       memcpy(r->a,c,p[0]*p[1]*p[2]*sizeof(mreal));\r
        delete []b;     delete []c;     return r;\r
 }\r
 uintptr_t MGL_EXPORT mgl_data_max_dir_(uintptr_t *d, const char *dir,int l)\r
@@ -407,7 +411,7 @@ MGL_NO_EXPORT void *mgl_min_y(void *par)
 #endif\r
        for(long i=t->id;i<nn;i+=mglNumThr)\r
        {\r
-               register long k = (i%nx)+nx*ny*(i/nx);  b[i]=a[k];\r
+               long k = (i%nx)+nx*ny*(i/nx);   b[i]=a[k];\r
                for(long j=1;j<ny;j++)  if(b[i]>a[k+nx*j])      b[i]=a[k+nx*j];\r
        }\r
        return 0;\r
@@ -423,7 +427,7 @@ MGL_NO_EXPORT void *mgl_min_x(void *par)
 #endif\r
        for(long i=t->id;i<nn;i+=mglNumThr)\r
        {\r
-               register long k = i*nx; b[i]=a[k];\r
+               long k = i*nx;  b[i]=a[k];\r
                for(long j=1;j<nx;j++)  if(b[i]>a[j+k]) b[i]=a[j+k];\r
        }\r
        return 0;\r
@@ -456,9 +460,10 @@ HMDT MGL_EXPORT mgl_data_min_dir(HCDT dat, const char *dir)
        {\r
                mglStartThread(mgl_min_x,0,p[1]*p[2],b,c,0,p);\r
                p[0] = p[1];    p[1] = p[2];    p[2] = 1;\r
+               memcpy(c,b,p[0]*p[1]*sizeof(mreal));\r
        }\r
        mglData *r=new mglData(p[0],p[1],p[2]);\r
-       memcpy(r->a,b,p[0]*p[1]*p[2]*sizeof(mreal));\r
+       memcpy(r->a,c,p[0]*p[1]*p[2]*sizeof(mreal));\r
        delete []b;     delete []c;     return r;\r
 }\r
 uintptr_t MGL_EXPORT mgl_data_min_dir_(uintptr_t *d, const char *dir,int l)\r
@@ -483,10 +488,10 @@ HMDT MGL_EXPORT mgl_data_momentum(HCDT dat, char dir, const char *how)
 #pragma omp parallel for\r
                for(long i=0;i<nx;i++)\r
                {\r
-                       register mreal i1=0,i0=0;\r
+                       mreal i1=0,i0=0;\r
                        for(long j=0;j<ny*nz;j++)\r
                        {\r
-                               register mreal u=dat->vthr(i+nx*j);\r
+                               mreal u=dat->vthr(i+nx*j);\r
                                i0 += u;        i1 += u*res->a[i+nx*j];\r
                        }\r
                        b->a[i] = i0>0 ? i1/i0 : 0;\r
@@ -498,10 +503,10 @@ HMDT MGL_EXPORT mgl_data_momentum(HCDT dat, char dir, const char *how)
 #pragma omp parallel for\r
                for(long i=0;i<ny;i++)\r
                {\r
-                       register mreal i1=0,i0=0;\r
+                       mreal i1=0,i0=0;\r
                        for(long k=0;k<nz;k++)  for(long j=0;j<nx;j++)\r
                        {\r
-                               register mreal u=dat->v(j,i,k);\r
+                               mreal u=dat->v(j,i,k);\r
                                i0 += u;        i1 += u*res->a[j+nx*(i+ny*k)];\r
                        }\r
                        b->a[i] = i0>0 ? i1/i0 : 0;\r
@@ -514,10 +519,10 @@ HMDT MGL_EXPORT mgl_data_momentum(HCDT dat, char dir, const char *how)
 #pragma omp parallel for\r
                for(long i=0;i<nz;i++)\r
                {\r
-                       register mreal i1=0,i0=0;\r
+                       mreal i1=0,i0=0;\r
                        for(long j=0;j<nn;j++)\r
                        {\r
-                               register mreal u=dat->vthr(j+nn*i);\r
+                               mreal u=dat->vthr(j+nn*i);\r
                                i0 += u;        i1 += u*res->a[j+nn*i];\r
                        }\r
                        b->a[i] = i0>0 ? i1/i0 : 0;\r
@@ -681,7 +686,7 @@ MGL_NO_EXPORT void *mgl_hist_1(void *par)
 #endif\r
        for(long i=t->id;i<nn;i+=mglNumThr)\r
        {\r
-               register long k = long(n*(a->vthr(i)-v[0])/(v[1]-v[0]));\r
+               long k = long(n*(a->vthr(i)-v[0])/(v[1]-v[0]));\r
                if(k>=0 && k<n)\r
 #if !MGL_HAVE_PTHREAD\r
 #pragma omp critical(hist)\r
@@ -705,11 +710,11 @@ MGL_NO_EXPORT void *mgl_hist_2(void *par)
 #endif\r
        for(long i=t->id;i<nn;i+=mglNumThr)\r
        {\r
-               register mreal x = d*(i%(nx*ns)), y = d*((i/(nx*ns))%(ny*ns)), z = d*(i/(nx*ny*ns*ns));\r
-               register mreal f = sp ? a->value(x,y,z) : a->linear(x,y,z), w=1;\r
+               mreal x = d*(i%(nx*ns)), y = d*((i/(nx*ns))%(ny*ns)), z = d*(i/(nx*ny*ns*ns));\r
+               mreal f = sp ? a->value(x,y,z) : a->linear(x,y,z), w=1;\r
                if(c)   w = sp ? c->value(x,y,z) : c->linear(x,y,z);\r
                if(mgl_isnan(f) || mgl_isnan(w))        continue;\r
-               register long k = long(n*(f-v[0])/(v[1]-v[0]));\r
+               long k = long(n*(f-v[0])/(v[1]-v[0]));\r
                if(k>=0 && k<n)\r
 #if !MGL_HAVE_PTHREAD\r
 #pragma omp critical(hist)\r
@@ -792,7 +797,7 @@ struct MGL_NO_EXPORT mglFuncV       {       mglFormula *eq; char var;       };
 mreal MGL_NO_EXPORT mgl_funcv(mreal v, void *par)\r
 {\r
        mglFuncV *f = (mglFuncV *)par;\r
-       mreal var[MGL_VS];      memset(var,0,('z'-'a')*sizeof(mreal));\r
+       mreal var[MGL_VS];      memset(var,0,MGL_VS*sizeof(mreal));\r
        var[f->var-'a'] = v;\r
        return f->eq->Calc(var);\r
 }\r
@@ -839,23 +844,23 @@ MGL_NO_EXPORT void *mgl_pulse_z(void *par)
        {\r
                long j0=0;      mreal m=a[i];\r
                for(long j=1;j<nz;j++)  // get maximum\r
-               {       register long i0=i+nn*j;\r
+               {       long i0=i+nn*j;\r
                        if(m<a[i0])     {       m=a[i0];        j0=j;   }\r
                }\r
                if(j0>0 && j0<nz-1)\r
                {\r
-                       register long i0=i+nn*j0;\r
+                       long i0=i+nn*j0;\r
                        mreal A = (a[i0-nn]-2*a[i0]+a[i0+nn])/2;\r
                        mreal B = (a[i0+nn]-a[i0-nn])/2;\r
                        mreal C = a[i0] - B*B/(4*A);\r
                        b[i]=C; b[i+nn]=j0-B/(2*A);     b[i+2*nn]=sqrt(fabs(C/A));      C /= 2;\r
                        mreal j1=NAN,j2=NAN;\r
                        for(long j=j0;j<nz-1;j++)\r
-                       {       register long i0 = i+nn*j;\r
+                       {       long i0 = i+nn*j;\r
                                if((a[i0]-C)*(a[i0+nn]-C)<0)    j2 = j + (a[i0]-C)/(a[i0]-a[i0+nn]);\r
                        }\r
                        for(long j=j0;j>0;j--)\r
-                       {       register long i0=i+nn*j;\r
+                       {       long i0=i+nn*j;\r
                                if((a[i0]-C)*(a[i0-nn]-C)<0)    j1 = j - (a[i0]-C)/(a[i0]-a[i0-nn]);\r
                        }\r
                        b[i+3*nn]=j2-j1;        b[i+4*nn]=0;\r
@@ -880,23 +885,23 @@ MGL_NO_EXPORT void *mgl_pulse_y(void *par)
                long k = (i%nx)+nx*ny*(i/nx), j0=0;     mreal m=a[k];\r
                long ki = (i%nx)+5*nx*(i/nx);\r
                for(long j=1;j<ny;j++)  // get maximum\r
-               {       register long i0=k+nx*j;\r
+               {       long i0=k+nx*j;\r
                        if(m<a[i0])     {       m=a[i0];        j0=j;   }\r
                }\r
                if(j0>0 && j0<ny-1)\r
                {\r
-                       register long i0=k+nx*j0;\r
+                       long i0=k+nx*j0;\r
                        mreal A = (a[i0-nx]-2*a[i0]+a[i0+nx])/2;\r
                        mreal B = (a[i0+nx]-a[i0-nx])/2;\r
                        mreal C = a[i0] - B*B/(4*A);\r
                        b[ki]=C;        b[ki+nx]=j0-B/(2*A);    b[ki+2*nx]=sqrt(fabs(C/A));     C /= 2;\r
                        mreal j1=NAN,j2=NAN;\r
                        for(long j=j0;j<ny-1;j++)\r
-                       {       register long i0 = k+nx*j;\r
+                       {       long i0 = k+nx*j;\r
                                if((a[i0]-C)*(a[i0+nx]-C)<0)    j2 = j + (a[i0]-C)/(a[i0]-a[i0+nx]);\r
                        }\r
                        for(long j=j0;j>0;j--)\r
-                       {       register long i0=k+nx*j;\r
+                       {       long i0=k+nx*j;\r
                                if((a[i0]-C)*(a[i0-nx]-C)<0)    j1 = j - (a[i0]-C)/(a[i0]-a[i0-nx]);\r
                        }\r
                        b[ki+3*nx]=j2-j1;       b[ki+4*nx]=0;\r
@@ -920,23 +925,23 @@ MGL_NO_EXPORT void *mgl_pulse_x(void *par)
        {\r
                long k = i*nx, j0=0;    mreal m=a[k];\r
                for(long j=1;j<nx;j++)  // get maximum\r
-               {       register long i0=j+k;\r
+               {       long i0=j+k;\r
                        if(m<a[i0])     {       m=a[i0];        j0=j;   }\r
                }\r
                if(j0>0 && j0<nx-1)\r
                {\r
-                       register long i0=j0+k;\r
+                       long i0=j0+k;\r
                        mreal A = (a[i0-1]-2*a[i0]+a[i0+1])/2;\r
                        mreal B = (a[i0+1]-a[i0-1])/2;\r
                        mreal C = a[i0] - B*B/(4*A);\r
                        b[5*i]=C;       b[5*i+1]=j0-B/(2*A);    b[5*i+2]=sqrt(fabs(C/A));       C /= 2;\r
                        mreal j1=NAN,j2=NAN;\r
                        for(long j=j0;j<nx-1;j++)\r
-                       {       register long i0 = j+k;\r
+                       {       long i0 = j+k;\r
                                if((a[i0]-C)*(a[i0+1]-C)<0)     j2 = j + (a[i0]-C)/(a[i0]-a[i0+1]);\r
                        }\r
                        for(long j=j0;j>0;j--)\r
-                       {       register long i0=j+k;\r
+                       {       long i0=j+k;\r
                                if((a[i0]-C)*(a[i0-1]-C)<0)     j1 = j - (a[i0]-C)/(a[i0]-a[i0-1]);\r
                        }\r
                        b[5*i+3]=j2-j1; b[5*i+4]=0;\r
@@ -984,6 +989,84 @@ HMDT MGL_EXPORT mgl_data_pulse(HCDT dat, char dir)
        }\r
        delete []c;     return r;\r
 }\r
-uintptr_t MGL_EXPORT mgl_data_pulse_(uintptr_t *d, const char *dir,int l)\r
+uintptr_t MGL_EXPORT mgl_data_pulse_(uintptr_t *d, const char *dir,int)\r
 {      return uintptr_t(mgl_data_pulse(_DT_,dir[0]));  }\r
 //-----------------------------------------------------------------------------\r
+HMDT MGL_EXPORT mgl_data_section(HCDT dat, HCDT ids, char dir, mreal val)\r
+{\r
+       long di = 1, n = dat->GetNx();\r
+       if(dir=='y')    {       di = dat->GetNx();      n = dat->GetNy();       }\r
+       if(dir=='z')    {       di = dat->GetNx()*dat->GetNy(); n = dat->GetNz();       }\r
+       // first collect position of key values\r
+       std::vector<long> pos;  pos.push_back(0);\r
+       if(mgl_isnan(val))      for(long i=1;i<n;i++)\r
+       {\r
+               if(mgl_isnan(dat->vthr(i*di)))  pos.push_back(i);\r
+       }\r
+       else    for(long i=0;i<n;i++)\r
+       {\r
+               if(dat->vthr(i*di)==val)        pos.push_back(i);\r
+       }\r
+       pos.push_back(n);       // add last point (size of data)\r
+       // now collect required position from section and its lengths\r
+       std::vector<long> ls, ps;\r
+       long np = pos.size()-1, nl=0;\r
+       if(np<1)        return NULL;    // nothing to do\r
+       for(long i=0;i<ids->GetNN();i++)\r
+       {\r
+               long j = mgl_int(ids->vthr(i)+0.5);     j = j<0?np+j:j;\r
+               if(j>=0 && j<np)\r
+               {       long l = pos[j+1]-pos[j];       nl += l;\r
+                       ls.push_back(l);        ps.push_back(pos[j]);   }\r
+       }\r
+       if(nl==0)       return NULL;\r
+       mglData *r=0;\r
+       size_t ns = ps.size();\r
+       if(dir=='y')\r
+       {\r
+               long nx=dat->GetNx(), nz=dat->GetNz(), sh=0;\r
+               r = new mglData(nx,nl,nz);\r
+               for(size_t s=0;s<ns;s++)\r
+               {\r
+                       long pp = ps[s];\r
+#pragma omp parallel for collapse(3)\r
+                       for(long k=0;k<nz;k++)  for(long j=0;j<ls[s];j++)       for(long i=0;i<nx;i++)\r
+                               r->a[i+nx*(sh+j+nl*k)] = dat->v(i,pp+j,k);\r
+                       sh += ls[s];\r
+               }\r
+       }\r
+       else if(dir=='x')\r
+       {\r
+               long ny=dat->GetNy(), nz=dat->GetNz(), sh=0;\r
+               r = new mglData(nl,ny,nz);\r
+               for(size_t s=0;s<ns;s++)\r
+               {\r
+                       long pp = ps[s];\r
+#pragma omp parallel for collapse(3)\r
+                       for(long k=0;k<nz;k++)  for(long j=0;j<ny;j++)  for(long i=0;i<ls[s];i++)\r
+                               r->a[sh+i+nl*(j+ny*k)] = dat->v(pp+i,j,k);\r
+                       sh += ls[s];\r
+               }\r
+       }\r
+       else if(dir=='z')\r
+       {\r
+               long nx=dat->GetNx(), ny=dat->GetNy(), sh=0;\r
+               r = new mglData(nx,ny,nl);\r
+               for(size_t s=0;s<ns;s++)\r
+               {\r
+                       long pp = ps[s];\r
+#pragma omp parallel for collapse(3)\r
+                       for(long k=0;k<ls[s];k++)       for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
+                               r->a[i+nx*(j+ny*(sh+k))] = dat->v(i,j,pp+k);\r
+                       sh += ls[s];\r
+               }\r
+       }\r
+       return r;\r
+}\r
+HMDT MGL_EXPORT mgl_data_section_val(HCDT dat, long id, char dir, mreal val)\r
+{      mglData v;      v.a[0]=id;      return mgl_data_section(dat,&v,dir,val);        }\r
+uintptr_t MGL_EXPORT mgl_data_section_(uintptr_t *d, uintptr_t *ids, const char *dir, mreal *val,int)\r
+{      return uintptr_t(mgl_data_section(_DT_,_DA_(ids),dir[0],*val)); }\r
+uintptr_t MGL_EXPORT mgl_data_section_val_(uintptr_t *d, int *id, const char *dir, mreal *val,int)\r
+{      return uintptr_t(mgl_data_section_val(_DT_,*id,dir[0],*val));   }\r
+//-----------------------------------------------------------------------------\r
index d8fbda8d4aacd445b50b515116b56bfe6b020ce5..4fbc2f422d82240f87ea6ffb8790108ee35a3392 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************
  * data_gr.cpp is part of Math Graphic Library
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   it under the terms of the GNU Library General Public License as       *
index 5834e72660286e73df1397e754da5d2371a004de..3d4df5f7680f98e510765e41140268f3d6b45e62 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * data_io.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -61,7 +61,7 @@ void mglFromStr(HMDT d,char *buf,long NX,long NY,long NZ)
 {\r
        if(NX<1 || NY <1 || NZ<1)       return;\r
        mgl_data_create(d, NX,NY,NZ);\r
-       const std::string loc = setlocale(LC_NUMERIC, NULL);    setlocale(LC_NUMERIC, "C");\r
+       const std::string loc = setlocale(LC_NUMERIC, "C");\r
        std::vector<char *> lines;\r
        std::vector<std::vector<mreal> > numbs;\r
        lines.push_back(buf);\r
@@ -74,36 +74,26 @@ void mglFromStr(HMDT d,char *buf,long NX,long NY,long NZ)
        {\r
                char *b = lines[k];\r
                long nb = strlen(b);\r
-               register long i=0, j=0;\r
-               while(j<nb)\r
+               for(long j=0;j<nb;j++)\r
                {\r
-                       while(j<nb && b[j]<=' ')        j++;\r
+                       while(j<nb && b[j]<=' ')        j++;    // skip first spaces\r
                        if(j>=nb)       break;\r
-                       while(b[j]=='#')                // skip comment\r
+                       if(b[j]=='#')\r
                        {\r
-                               if(i>0 || b[j+1]!='#')  // this is columns id\r
-                                       while(j<nb && !isn(b[j]))       j++;\r
-                               else    // NOTE I suppose that only single line contain column ids\r
-                               {\r
-                                       while(j<nb && !isn(b[j]))\r
-                                       {\r
-                                               if(b[j]>='a' && b[j]<='z')\r
-                                                       d->id.push_back(b[j]);\r
-                                               j++;\r
-                                       }\r
-                               }\r
-                               while(j<nb && b[j]<=' ')        j++;\r
+                               if(j<nb-1 && b[j+1]=='#')       for(long i=j+2;i<nb;i++)\r
+                                       if(b[i]>='a' && b[i]<='z')      d->id.push_back(b[i]);\r
+                               break;\r
                        }\r
-                       char *s=b+j;\r
+                       const char *s=b+j;\r
                        while(j<nb && b[j]>' ' && b[j]!=',' && b[j]!=';')       j++;\r
                        b[j]=0;\r
                        numbs[k].push_back(strstr(s,"NAN")?NAN:atof(s));\r
                }\r
        }\r
-       register long i=0, n=NX*NY*NZ;\r
+       long i=0, n=NX*NY*NZ;\r
        for(long k=0;k<nl && i<n;k++)\r
        {\r
-               std::vector<mreal> &vals = numbs[k];\r
+               const std::vector<mreal> &vals = numbs[k];\r
                long c = vals.size();\r
                if(c>n-i)       c = n-i;\r
                memcpy(d->a+i,&(vals[0]),c*sizeof(mreal));\r
@@ -131,7 +121,7 @@ void MGL_EXPORT mgl_data_set_(uintptr_t *d, uintptr_t *a)   {       mgl_data_set(_DT_,_D
 void MGL_EXPORT mgl_data_set_values(HMDT d, const char *v,long NX,long NY,long NZ)\r
 {\r
        if(NX<1 || NY <1 || NZ<1)       return;\r
-       register long n=strlen(v)+1;\r
+       long n=strlen(v)+1;\r
        char *buf = new char[n];\r
        memcpy(buf,v,n);\r
        mglFromStr(d,buf,NX,NY,NZ);\r
@@ -286,24 +276,61 @@ void MGL_EXPORT mgl_data_set_name_(uintptr_t *d, const char *name,int l)
 void MGL_EXPORT mgl_data_set_func(mglDataA *dat, void (*func)(void *), void *par)\r
 {      dat->func = func;       dat->o = par;   }\r
 //-----------------------------------------------------------------------------\r
+/// Get section separated by symbol ch. This is analog of QString::section().\r
+std::vector<std::string> MGL_EXPORT mgl_str_args(const std::string &str, char ch)\r
+{\r
+       std::vector<size_t> pos;        pos.push_back(0);\r
+       for(size_t p=0; p != std::string::npos;)\r
+       {       p=str.find(ch,p+1);     pos.push_back(p?p+1:0); }\r
+       std::vector<std::string> res;\r
+       for(size_t i=0;i<pos.size()-1;i++)\r
+               res.push_back(str.substr(pos[i],pos[i+1]-pos[i]-1));\r
+       return res;\r
+}\r
+//-----------------------------------------------------------------------------\r
+/// Get section separated by symbol ch. This is analog of QString::section().\r
+std::string MGL_EXPORT mgl_str_arg(const std::string &str, char ch, int n1, int n2)\r
+{\r
+       std::vector<size_t> pos;        pos.push_back(0);\r
+       for(size_t p=0; p != std::string::npos;)\r
+       {       p=str.find(ch,p+1);     pos.push_back(p?p+1:0); }\r
+       std::string res;\r
+       if(n2<0)        n2=n1;\r
+       if(n1<0 || n1>=pos.size()-1 || n2<n1)   return res;\r
+       if(n2>=pos.size())      n2=pos.size()-1;\r
+       res = str.substr(pos[n1],pos[n2+1]-pos[n1]-1);\r
+       if(res.size()==1 && res[0]==ch) res.clear();\r
+       return res;\r
+}\r
+//-----------------------------------------------------------------------------\r
+/// Get string from number.\r
+std::string MGL_EXPORT mgl_str_num(double val)\r
+{      char buf[32];   snprintf(buf,32,"%g",val);      return std::string(buf);        }\r
+std::string MGL_EXPORT mgl_str_num(dual val)\r
+{\r
+       char buf[64];\r
+       double re = real(val), im = imag(val);\r
+       if(re==0 && im>0)       snprintf(buf,64,"i%g",im);\r
+       else if(re && im<0)     snprintf(buf,64,"-i%g",-im);\r
+       else if(im>0)   snprintf(buf,64,"%g+i%g",re,im);\r
+       else if(im<0)   snprintf(buf,64,"%g-i%g",re,-im);\r
+       else    snprintf(buf,64,"%g",re);\r
+       return std::string(buf);\r
+}\r
+//-----------------------------------------------------------------------------\r
 std::string MGL_EXPORT mgl_data_to_string(HCDT d, long ns)\r
 {\r
        long nx=d->GetNx(), ny=d->GetNy(), nz=d->GetNz();\r
-       const std::string loc = setlocale(LC_NUMERIC, NULL);    setlocale(LC_NUMERIC, "C");\r
-       std::string out;        char buf[512];\r
+       const std::string loc = setlocale(LC_NUMERIC, "C");\r
+       std::string out;\r
        if(ns<0 || (ns>=nz && nz>1))    for(long k=0;k<nz;k++)\r
        {       // save whole data\r
                const mglData *dr = dynamic_cast<const mglData *>(d);\r
-               if(dr && !dr->id.empty())\r
-               {       snprintf(buf,512,"## %s\n",dr->id.c_str());     out += buf;     }\r
-               const mglDataC *dc = dynamic_cast<const mglDataC *>(d);\r
-               if(dc && !dc->id.empty())\r
-               {       snprintf(buf,512,"## %s\n",dc->id.c_str());     out += buf;     }\r
+               if(dr && !dr->id.empty())       out += "## "+dr->id+'\n';\r
                for(long i=0;i<ny;i++)\r
                {\r
-                       for(long j=0;j<nx-1;j++)\r
-                       {       snprintf(buf,512,"%g\t",d->v(j,i,k));   out += buf;     }\r
-                       snprintf(buf,512,"%g\n",d->v(nx-1,i,k));        out += buf;\r
+                       for(long j=0;j<nx-1;j++)        out += mgl_str_num(d->v(j,i,k))+'\t';\r
+                       out += mgl_str_num(d->v(nx-1,i,k))+'\n';\r
                }\r
                out += "\n";\r
        }\r
@@ -311,12 +338,10 @@ std::string MGL_EXPORT mgl_data_to_string(HCDT d, long ns)
        {       // save selected slice\r
                if(nz>1)        for(long i=0;i<ny;i++)\r
                {\r
-                       for(long j=0;j<nx-1;j++)\r
-                       {       snprintf(buf,512,"%g\t",d->v(j,i,ns));  out += buf;     }\r
-                       snprintf(buf,512,"%g\n",d->v(nx-1,i,ns));       out += buf;\r
+                       for(long j=0;j<nx-1;j++)        out += mgl_str_num(d->v(j,i,ns))+'\t';\r
+                       out += mgl_str_num(d->v(nx-1,i,ns))+'\n';\r
                }\r
-               else if(ns<ny)  for(long j=0;j<nx;j++)\r
-               {       snprintf(buf,512,"%g\t",d->v(j,ns));    out += buf;     }\r
+               else if(ns<ny)  for(long j=0;j<nx;j++)  out += mgl_str_num(d->v(j,ns))+'\t';\r
        }\r
        setlocale(LC_NUMERIC, loc.c_str());\r
        return out;\r
@@ -338,6 +363,7 @@ MGL_NO_EXPORT char *mgl_read_gz(gzFile fp)
        {\r
                if(m<size)      {       buf[size*n+m]=0;        break;  }\r
                n++;            buf=(char*)realloc(buf,size*(n+1));\r
+               memset(buf+size*n,0,size);\r
        }\r
        return buf;\r
 }\r
@@ -349,26 +375,25 @@ int MGL_EXPORT mgl_data_read(HMDT d, const char *fname)
        if(!fp)\r
        {\r
                if(!d->a)       mgl_data_create(d, 1,1,1);\r
-               return  false;\r
+               return  0;\r
        }\r
        char *buf = mgl_read_gz(fp);\r
        long nb = strlen(buf);  gzclose(fp);\r
 \r
        bool first=false;\r
-       register char ch;\r
        for(i=nb-1;i>=0;i--)    if(buf[i]>' ')  break;\r
        buf[i+1]=0;     nb = i+1;               // remove tailing spaces\r
        for(i=0;i<nb-1 && !isn(buf[i]);i++)     // determine nx\r
        {\r
                while(buf[i]=='#')      {       while(!isn(buf[i]) && i<nb)     i++;    }\r
-               ch = buf[i];\r
+               char ch = buf[i];\r
                if(ch>' ' && !first)    first=true;\r
                if(first && (ch==' ' || ch=='\t' || ch==',' || ch==';') && buf[i+1]>' ') k++;\r
        }\r
        first = false;\r
        for(i=0;i<nb-1;i++)                                     // determine ny\r
        {\r
-               ch = buf[i];\r
+               char ch = buf[i];\r
                if(ch=='#')     while(!isn(buf[i]) && i<nb)     i++;\r
                if(isn(ch))\r
                {\r
@@ -380,19 +405,17 @@ int MGL_EXPORT mgl_data_read(HMDT d, const char *fname)
        }\r
        if(first)       for(i=0;i<nb-1;i++)             // determine nz\r
        {\r
-               ch = buf[i];\r
+               char ch = buf[i];\r
                if(ch=='#')     while(!isn(buf[i]) && i<nb)     i++;\r
-//             if(ch=='#')     com = true;     // comment\r
                if(isn(ch))\r
                {\r
-//                     if(com) {       com=false;      continue;       }\r
                        while(buf[i+1]==' ' || buf[i+1]=='\t') i++;\r
                        if(isn(buf[i+1]))       l++;\r
                }\r
        }\r
        else    for(i=0;i<nb-1;i++)     if(buf[i]=='\f')        l++;\r
        mglFromStr(d,buf,k,m,l);\r
-       free(buf);      return true;\r
+       free(buf);      return 1;\r
 }\r
 int MGL_EXPORT mgl_data_read_(uintptr_t *d, const char *fname,int l)\r
 {      char *s=new char[l+1];          memcpy(s,fname,l);      s[l]=0;\r
@@ -418,23 +441,25 @@ int MGL_EXPORT mgl_data_scan_file(HMDT d,const char *fname, const char *templ)
        if(!fp)\r
        {\r
                if(!d->a)       mgl_data_create(d, 1,1,1);\r
-               return  false;\r
+               return  0;\r
        }\r
        s = mgl_read_gz(fp);    gzclose(fp);\r
-       if(*s)  bufs.push_back(s);\r
+       size_t len = strs[0].length();\r
+       const char *s0 = strs[0].c_str();\r
+       if(!strncmp(s, s0, len))        bufs.push_back(s);\r
        for(long i=0;s[i];i++)  if(s[i]=='\n')\r
        {\r
                while(s[i+1]=='\n')     i++;\r
                s[i]=0; i++;\r
-               if(s[i])        bufs.push_back(s+i);\r
-               else    break;\r
+               if(!strncmp(s+i, s0, len))      bufs.push_back(s+i);\r
+               if(!s[i])       break;\r
        }\r
        // parse lines and collect data\r
        size_t nx=strs.size(), ny=bufs.size();\r
        if(ny<1)\r
        {\r
                if(!d->a)       mgl_data_create(d, 1,1,1);\r
-               return  false;\r
+               return  0;\r
        }\r
        d->Create(nx,ny);\r
        for(size_t j=0;j<ny;j++)\r
@@ -448,7 +473,7 @@ int MGL_EXPORT mgl_data_scan_file(HMDT d,const char *fname, const char *templ)
                        d->a[i+nx*j] = atof(p);\r
                }\r
        }\r
-       free(s);        return true;\r
+       free(s);        return 1;\r
 }\r
 int MGL_EXPORT mgl_data_scan_file_(uintptr_t *d,const char *fname, const char *templ,int l,int m)\r
 {      char *s=new char[l+1];          memcpy(s,fname,l);      s[l]=0;\r
@@ -478,13 +503,13 @@ void MGL_EXPORT mgl_data_link_(uintptr_t *d, mreal *A, int *nx,int *ny,int *nz)
 //-----------------------------------------------------------------------------\r
 int MGL_EXPORT mgl_data_read_dim(HMDT d, const char *fname,long mx,long my,long mz)\r
 {\r
-       if(mx<=0 || my<=0 || mz<=0)     return false;\r
+       if(mx<=0 || my<=0 || mz<=0)     return 0;\r
        gzFile fp = gzopen(fname,"r");\r
-       if(!fp) return false;\r
+       if(!fp) return 0;\r
        char *buf = mgl_read_gz(fp);\r
        gzclose(fp);\r
        mglFromStr(d,buf,mx,my,mz);\r
-       free(buf);      return true;\r
+       free(buf);      return 1;\r
 }\r
 int MGL_EXPORT mgl_data_read_dim_(uintptr_t *d, const char *fname,int *mx,int *my,int *mz,int l)\r
 {      char *s=new char[l+1];  memcpy(s,fname,l);      s[l]=0;\r
@@ -492,9 +517,9 @@ int MGL_EXPORT mgl_data_read_dim_(uintptr_t *d, const char *fname,int *mx,int *m
 //-----------------------------------------------------------------------------\r
 int MGL_EXPORT mgl_data_read_mat(HMDT d, const char *fname, long dim)\r
 {\r
-       if(dim<=0 || dim>3)     return false;\r
+       if(dim<=0 || dim>3)     return 0;\r
        gzFile fp = gzopen(fname,"r");\r
-       if(!fp) return false;\r
+       if(!fp) return 0;\r
        long nx=1, ny=1, nz=1;\r
        char *buf = mgl_read_gz(fp);\r
        long nb = strlen(buf);  gzclose(fp);\r
@@ -505,25 +530,27 @@ int MGL_EXPORT mgl_data_read_mat(HMDT d, const char *fname, long dim)
        if(dim==1)\r
        {\r
                sscanf(buf+j,"%ld",&nx);\r
-               while(j<nb && buf[j]!='\n')     j++;    j++;\r
+               while(j<nb && buf[j]!='\n')     j++;\r
+               j++;\r
 //             while(buf[j]>' ')       j++;\r
        }\r
        else if(dim==2)\r
        {\r
                sscanf(buf+j,"%ld%ld",&nx,&ny);\r
-               while(j<nb && buf[j]!='\n')     j++;    j++;\r
+               while(j<nb && buf[j]!='\n')     j++;\r
+               j++;\r
                char *b=buf+j;\r
-               register long i,l;\r
-               for(i=l=0;b[i];i++)\r
+               long l=0;\r
+               for(long i=0;b[i];i++)\r
                {\r
                        while(b[i]=='#')        {       while(!isn(b[i]) && b[i])       i++;    }\r
                        if(b[i]=='\n')  l++;\r
                }\r
                if(l==nx*ny || l==nx*ny+1)      // try to read 3d data (i.e. columns of matrix nx*ny)\r
                {\r
-                       nz=ny;  ny=nx;  nx=1;\r
+                       nz=ny;  ny=nx;  nx=1;   l=0;\r
                        bool first = false;\r
-                       for(i=l=0;b[i] && !isn(b[i]);i++)       // determine nx\r
+                       for(long i=0;b[i] && !isn(b[i]);i++)    // determine nx\r
                        {\r
                                while(b[i]=='#')        {       while(!isn(b[i]) && b[i])       i++;    }\r
                                char ch = b[i];\r
@@ -535,7 +562,8 @@ int MGL_EXPORT mgl_data_read_mat(HMDT d, const char *fname, long dim)
        else if(dim==3)\r
        {\r
                sscanf(buf+j,"%ld%ld%ld",&nx,&ny,&nz);\r
-               while(j<nb && buf[j]!='\n')     j++;    j++;\r
+               while(j<nb && buf[j]!='\n')     j++;\r
+               j++;\r
 /*             while(buf[j]>' ' && j<nb)       j++;\r
                while(buf[j]<=' ' && j<nb)      j++;\r
                while(buf[j]>' ' && j<nb)       j++;\r
@@ -543,7 +571,7 @@ int MGL_EXPORT mgl_data_read_mat(HMDT d, const char *fname, long dim)
                while(buf[j]>' ' && j<nb)       j++;*/\r
        }\r
        mglFromStr(d,buf+j,nx,ny,nz);\r
-       free(buf);      return true;\r
+       free(buf);      return 1;\r
 }\r
 int MGL_EXPORT mgl_data_read_mat_(uintptr_t *d, const char *fname,int *dim,int l)\r
 {      char *s=new char[l+1];          memcpy(s,fname,l);      s[l]=0;\r
@@ -555,10 +583,10 @@ mreal MGL_EXPORT mgl_data_max(HCDT d)
        long nn=d->GetNN();\r
 #pragma omp parallel\r
        {\r
-               register mreal m=-INFINITY, v;\r
+               mreal m=-INFINITY;\r
 #pragma omp for nowait\r
                for(long i=0;i<nn;i++)\r
-               {       v = d->vthr(i); m = m<v ? v:m;  }\r
+               {       mreal v = d->vthr(i);   m = m<v ? v:m;  }\r
 #pragma omp critical(max_dat)\r
                {       m1 = m1>m ? m1:m;       }\r
        }\r
@@ -572,10 +600,10 @@ mreal MGL_EXPORT mgl_data_min(HCDT d)
        long nn=d->GetNN();\r
 #pragma omp parallel\r
        {\r
-               register mreal m=INFINITY, v;\r
+               mreal m=INFINITY;\r
 #pragma omp for nowait\r
                for(long i=0;i<nn;i++)\r
-               {       v = d->vthr(i); m = m>v ? v:m;  }\r
+               {       mreal v = d->vthr(i);   m = m>v ? v:m;  }\r
 #pragma omp critical(min_dat)\r
                {       m1 = m1<m ? m1:m;       }\r
        }\r
@@ -589,10 +617,10 @@ mreal MGL_EXPORT mgl_data_neg_max(HCDT d)
        long nn=d->GetNN();\r
 #pragma omp parallel\r
        {\r
-               register mreal m=0, v;\r
+               mreal m=0;\r
 #pragma omp for nowait\r
                for(long i=0;i<nn;i++)\r
-               {       v = d->vthr(i); m = m<v && v<0 ? v:m;   }\r
+               {       mreal v = d->vthr(i);   m = m<v && v<0 ? v:m;   }\r
 #pragma omp critical(nmax_dat)\r
                {       m1 = m1>m ? m1:m;       }\r
        }\r
@@ -606,10 +634,10 @@ mreal MGL_EXPORT mgl_data_pos_min(HCDT d)
        long nn=d->GetNN();\r
 #pragma omp parallel\r
        {\r
-               register mreal m=INFINITY, v;\r
+               mreal m=INFINITY;\r
 #pragma omp for nowait\r
                for(long i=0;i<nn;i++)\r
-               {       v = d->vthr(i); m = m>v && v>0 ? v:m;   }\r
+               {       mreal v = d->vthr(i);   m = m>v && v>0 ? v:m;   }\r
 #pragma omp critical(pmin_dat)\r
                {       m1 = m1<m ? m1:m;       }\r
        }\r
@@ -623,12 +651,12 @@ mreal MGL_EXPORT mgl_data_max_int(HCDT d, long *i, long *j, long *k)
        long nx=d->GetNx(), ny=d->GetNy(), nn=d->GetNN();\r
 #pragma omp parallel\r
        {\r
-               register mreal m=-INFINITY, v;\r
+               mreal m=-INFINITY;\r
                long im=-1,jm=-1,km=-1;\r
 #pragma omp for nowait\r
                for(long ii=0;ii<nn;ii++)\r
                {\r
-                       v = d->vthr(ii);\r
+                       mreal v = d->vthr(ii);\r
                        if(m < v)\r
                        {       m=v;    im=ii%nx;       jm=(ii/nx)%ny;  km=ii/(nx*ny);   }\r
                }\r
@@ -647,12 +675,12 @@ mreal MGL_EXPORT mgl_data_min_int(HCDT d, long *i, long *j, long *k)
        long nx=d->GetNx(), ny=d->GetNy(), nn=d->GetNN();\r
 #pragma omp parallel\r
        {\r
-               register mreal m=INFINITY, v;\r
+               mreal m=INFINITY;\r
                long im=-1,jm=-1,km=-1;\r
 #pragma omp for nowait\r
                for(long ii=0;ii<nn;ii++)\r
                {\r
-                       v = d->vthr(ii);\r
+                       mreal v = d->vthr(ii);\r
                        if(m > v)\r
                        {       m=v;    im=ii%nx;       jm=(ii/nx)%ny;  km=ii/(nx*ny);   }\r
                }\r
@@ -665,6 +693,44 @@ mreal MGL_EXPORT mgl_data_min_int_(uintptr_t *d, int *i, int *j, int *k)
 {      long ii,jj,kk;  mreal res=mgl_data_min_int(_DT_,&ii,&jj,&kk);\r
        *i=ii;  *j=jj;  *k=kk;  return res;     }\r
 //-----------------------------------------------------------------------------\r
+long MGL_EXPORT mgl_data_max_first(HCDT d, char dir, long from, long *p1, long *p2)\r
+{\r
+       long n=d->GetNx(), n1=d->GetNy(), n2=d->GetNz(), d1=n, d2=n*n1, dd=1;\r
+       if(dir=='y')    {       n=n1;   n1=dd=d1;       d1=1;   }\r
+       if(dir=='z')    {       n=n2;   n2=n1;  n1=d1;  d1=1;   dd=d2;  d2=n2;  }\r
+       bool find=false;\r
+       if(from>=0)\r
+       {\r
+               for(long i=from+1;i<n-1;i++)\r
+               {\r
+#pragma omp parallel for collapse(2)\r
+                       for(long i1=0;i1<n1;i1++)       for(long i2=0;i2<n2;i2++)\r
+                       {\r
+                               long ii=i*dd+i1*d1+i2*d2;\r
+                               if(d->vthr(ii)>=d->vthr(ii+dd) && d->vthr(ii)>=d->vthr(ii-dd))\r
+                               {       find=true;      if(p1)  *p1=i1; if(p2)  *p2=i2; }\r
+                       }\r
+                       if(find)        return i;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               for(long i=n+from-1;i>0;i--)\r
+               {\r
+                       for(long i1=0;i1<n1;i1++)       for(long i2=0;i2<n2;i2++)\r
+                       {\r
+                               long ii=i*dd+i1*d1+i2*d2;\r
+                               if(d->vthr(ii)>=d->vthr(ii+dd) && d->vthr(ii)>=d->vthr(ii-dd))\r
+                               {       find=true;      if(p1)  *p1=i1; if(p2)  *p2=i2; }\r
+                       }\r
+                       if(find)        return i;\r
+               }\r
+       }\r
+       return -1;\r
+}\r
+long MGL_EXPORT mgl_data_max_first_(uintptr_t *d, const char *dir, long *from, long *p1, long *p2,int)\r
+{      return mgl_data_max_first(_DT_,*dir,*from,p1,p2);       }\r
+//-----------------------------------------------------------------------------\r
 mreal MGL_EXPORT mgl_data_max_real(HCDT d, mreal *x, mreal *y, mreal *z)\r
 {\r
        long im=-1,jm=-1,km=-1;\r
@@ -766,7 +832,7 @@ void MGL_EXPORT mgl_data_fill(HMDT d, mreal x1,mreal x2,char dir)
 void MGL_EXPORT mgl_data_fill_(uintptr_t *d, mreal *x1,mreal *x2,const char *dir,int)\r
 {      mgl_data_fill(_DT_,*x1,*x2,*dir);       }\r
 //-----------------------------------------------------------------------------\r
-void MGL_EXPORT mgl_data_norm(HMDT d, mreal v1,mreal v2,long sym,long dim)\r
+void MGL_EXPORT mgl_data_norm(HMDT d, mreal v1,mreal v2,int sym,long dim)\r
 {\r
        long s,nn=d->nx*d->ny*d->nz;\r
        mreal a1=INFINITY,a2=-INFINITY,v,*a=d->a;\r
@@ -793,9 +859,12 @@ void MGL_EXPORT mgl_data_squeeze(HMDT d, long rx,long ry,long rz,long smooth)
        mreal *b;\r
 \r
        // simple checking\r
-       if(rx>=nx)      rx=nx-1;        if(rx<1)        rx=1;\r
-       if(ry>=ny)      ry=ny-1;        if(ry<1)        ry=1;\r
-       if(rz>=nz)      rz=nz-1;        if(rz<1)        rz=1;\r
+       if(rx>=nx)      rx=nx-1;\r
+       if(rx<1)        rx=1;\r
+       if(ry>=ny)      ry=ny-1;\r
+       if(ry<1)        ry=1;\r
+       if(rz>=nz)      rz=nz-1;\r
+       if(rz<1)        rz=1;\r
        // new sizes\r
        kx = 1+(nx-1)/rx;       ky = 1+(ny-1)/ry;       kz = 1+(nz-1)/rz;\r
        b = new mreal[kx*ky*kz];\r
@@ -869,8 +938,7 @@ void MGL_EXPORT mgl_data_transpose(HMDT d, const char *dim)
 {\r
        long nx=d->nx, ny=d->ny, nz=d->nz, n;\r
        mreal *b=new mreal[nx*ny*nz], *a=d->a;\r
-       if(!strcmp(dim,"xyz"))  memcpy(b,a,nx*ny*nz*sizeof(mreal));\r
-       else if(!strcmp(dim,"xzy") || !strcmp(dim,"zy"))\r
+       if(!strcmp(dim,"xzy") || !strcmp(dim,"zy"))\r
        {\r
 #pragma omp parallel for collapse(3)\r
                for(long j=0;j<ny;j++)  for(long k=0;k<nz;k++)  for(long i=0;i<nx;i++)\r
@@ -905,6 +973,7 @@ void MGL_EXPORT mgl_data_transpose(HMDT d, const char *dim)
                        b[k+nz*(j+ny*i)] = a[i+nx*(j+ny*k)];\r
                n=nz;   nz=nx;  nx=n;\r
        }\r
+       else    memcpy(b,a,nx*ny*nz*sizeof(mreal));\r
        memcpy(a,b,nx*ny*nz*sizeof(mreal));     delete []b;\r
        n=d->nx;        d->nx=nx;       d->ny=ny;       d->nz=nz;\r
        if(nx!=n)       d->NewId();\r
@@ -926,7 +995,7 @@ MGL_NO_EXPORT void *mgl_modify(void *par)
 #endif\r
        for(long i0=t->id;i0<t->n;i0+=mglNumThr)\r
        {\r
-               register long i=i0%nx, j=((i0/nx)%ny), k=i0/(nx*ny);\r
+               long i=i0%nx, j=((i0/nx)%ny), k=i0/(nx*ny);\r
                b[i0] = f->Calc(i*dx, j*dy, k*dz, b[i0], v?v[i0]:0, w?w[i0]:0);\r
        }\r
        return 0;\r
@@ -977,7 +1046,7 @@ void MGL_EXPORT mgl_data_modify_vw_(uintptr_t *d, const char *eq, uintptr_t *v,
 int MGL_EXPORT mgl_data_read_hdf4(HMDT d,const char *fname,const char *data)\r
 {\r
        int32 sd = SDstart(fname,DFACC_READ), nn, i;\r
-       if(sd==-1)      return false;   // is not a HDF4 file\r
+       if(sd==-1)      return 0;       // is not a HDF4 file\r
        char name[64];\r
        SDfileinfo(sd,&nn,&i);\r
        for(i=0;i<nn;i++)\r
@@ -1009,11 +1078,11 @@ int MGL_EXPORT mgl_data_read_hdf4(HMDT d,const char *fname,const char *data)
                SDendaccess(sds);\r
        }\r
        SDend(sd);\r
-       return true;\r
+       return 1;\r
 }\r
 #else\r
 int MGL_EXPORT mgl_data_read_hdf4(HMDT ,const char *,const char *)\r
-{      mgl_set_global_warn("HDF4 support was disabled. Please, enable it and rebuild MathGL.");        return false;   }\r
+{      mgl_set_global_warn(_("HDF4 support was disabled. Please, enable it and rebuild MathGL."));     return 0;       }\r
 #endif\r
 //-----------------------------------------------------------------------------\r
 #if MGL_HAVE_HDF5\r
@@ -1046,17 +1115,17 @@ void MGL_EXPORT mgl_data_save_hdf(HCDT dat,const char *fname,const char *data,in
 int MGL_EXPORT mgl_data_read_hdf(HMDT d,const char *fname,const char *data)\r
 {\r
        hid_t hf,hd,hs;\r
-       hsize_t dims[3];\r
        long rank, res = H5Fis_hdf5(fname);\r
        if(res<=0)      return mgl_data_read_hdf4(d,fname,data);\r
        hf = H5Fopen(fname, H5F_ACC_RDONLY, H5P_DEFAULT);\r
-       if(hf<0)        return false;\r
+       if(hf<0)        return 0;\r
        hd = H5Dopen(hf,data);\r
-       if(hd<0)        return false;\r
+       if(hd<0)        return 0;\r
        hs = H5Dget_space(hd);\r
        rank = H5Sget_simple_extent_ndims(hs);\r
        if(rank>0 && rank<=3)\r
        {\r
+               hsize_t dims[3];\r
                H5Sget_simple_extent_dims(hs,dims,0);\r
                if(rank==1)                     {       dims[2]=dims[0];        dims[0]=dims[1]=1;      }\r
                else if(rank==2)        {       dims[2]=dims[1];        dims[1]=dims[0];        dims[0]=1;      }\r
@@ -1068,42 +1137,57 @@ int MGL_EXPORT mgl_data_read_hdf(HMDT d,const char *fname,const char *data)
                H5Dread(hd, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, d->a);\r
 #endif\r
        }\r
-       H5Sclose(hs);   H5Dclose(hd);   H5Fclose(hf);   return true;\r
+       H5Sclose(hs);   H5Dclose(hd);   H5Fclose(hf);   return 1;\r
 }\r
 //-----------------------------------------------------------------------------\r
-int MGL_EXPORT mgl_datas_hdf(const char *fname, char *buf, long size)\r
+MGL_EXPORT const char * const * mgl_datas_hdf_str(const char *fname)\r
 {\r
+       static std::vector<std::string> names;\r
+       static const char **res=0;\r
        hid_t hf,hg,hd,ht;\r
-       if(!buf || size<1)      return 0;\r
-       buf[0]=0;\r
-       hf = H5Fopen(fname, H5F_ACC_RDONLY, H5P_DEFAULT);\r
+       hf = H5Fopen(fname, H5F_ACC_RDONLY, H5P_DEFAULT);       names.clear();\r
        if(!hf) return 0;\r
        hg = H5Gopen(hf,"/");\r
-       hsize_t num, i;\r
+       hsize_t num;\r
        char name[256];\r
-       long pos=0,len;\r
        H5Gget_num_objs(hg, &num);      // replace by H5G_info_t t; H5Gget_info(hg,&t); num=t.nlinks;\r
-       for(i=0;i<num;i++)\r
+       for(hsize_t i=0;i<num;i++)\r
        {\r
                if(H5Gget_objtype_by_idx(hg, i)!=H5G_DATASET)   continue;\r
                H5Gget_objname_by_idx(hg, i, name, 256);        // replace by H5Lget_name_by_idx(hg,".",i,0,0,name,256,0) ?!\r
                hd = H5Dopen(hf,name);\r
                ht = H5Dget_type(hd);\r
-               len = strlen(name);             if(pos+len+2>size)      break;\r
-               if(H5Tget_class(ht)==H5T_FLOAT || H5Tget_class(ht)==H5T_INTEGER)\r
-               {       strcat(buf,name);       strcat(buf,"\t");       pos += len+1;   }\r
+               if(H5Tget_class(ht)==H5T_FLOAT || H5Tget_class(ht)==H5T_INTEGER)        names.push_back(name);\r
                H5Dclose(hd);   H5Tclose(ht);\r
        }\r
-       H5Gclose(hg);   H5Fclose(hf);\r
-       return i;\r
+       H5Gclose(hg);   H5Fclose(hf);   names.push_back("");\r
+       if(res) delete []res;\r
+       size_t nn = names.size();\r
+       res = new const char*[nn+1];\r
+       for(size_t i=0;i<nn;i++)        res[i]=names[i].c_str();\r
+       res[nn]=NULL;   return res;\r
+}\r
+\r
+long MGL_EXPORT mgl_datas_hdf(const char *fname, char *buf, long size)\r
+{\r
+       const char * const *res = mgl_datas_hdf_str(fname);\r
+       if(!res)        return 0;\r
+       long n=0, len=1;\r
+       while(res[n][0])        {       len += strlen(res[n])+1;        n++;    }\r
+       if(len>size)    return -long(len);\r
+       strcpy(buf,res[0]);\r
+       for(long i=1;i<n;i++)   {       strcat(buf,"\t");       strcat(buf,res[i]);     }\r
+       return n;\r
 }\r
 #else\r
 void MGL_EXPORT mgl_data_save_hdf(HCDT ,const char *,const char *,int )\r
-{      mgl_set_global_warn("HDF5 support was disabled. Please, enable it and rebuild MathGL.");        }\r
-int MGL_EXPORT mgl_datas_hdf(const char *, char *, long )\r
-{      mgl_set_global_warn("HDF5 support was disabled. Please, enable it and rebuild MathGL.");        return 0;}\r
+{      mgl_set_global_warn(_("HDF5 support was disabled. Please, enable it and rebuild MathGL."));     }\r
+MGL_EXPORT const char * const * mgl_datas_hdf_str(const char *fname)\r
+{      mgl_set_global_warn(_("HDF5 support was disabled. Please, enable it and rebuild MathGL."));     return 0;}\r
+long MGL_EXPORT mgl_datas_hdf(const char *, char *, long )\r
+{      mgl_set_global_warn(_("HDF5 support was disabled. Please, enable it and rebuild MathGL."));     return 0;}\r
 int MGL_EXPORT mgl_data_read_hdf(HMDT ,const char *,const char *)\r
-{      mgl_set_global_warn("HDF5 support was disabled. Please, enable it and rebuild MathGL.");        return false;}\r
+{      mgl_set_global_warn(_("HDF5 support was disabled. Please, enable it and rebuild MathGL."));     return 0;}\r
 #endif\r
 //-----------------------------------------------------------------------------\r
 int MGL_EXPORT mgl_data_read_hdf_(uintptr_t *d, const char *fname, const char *data,int l,int n)\r
@@ -1114,7 +1198,7 @@ void MGL_EXPORT mgl_data_save_hdf_(uintptr_t *d, const char *fname, const char *
 {      char *s=new char[l+1];          memcpy(s,fname,l);      s[l]=0;\r
        char *t=new char[n+1];          memcpy(t,data,n);       t[n]=0;\r
        mgl_data_save_hdf(_DT_,s,t,*rewrite);   delete []s;     delete []t;     }\r
-int MGL_EXPORT mgl_datas_hdf_(const char *fname, char *buf, int l, int size)\r
+long MGL_EXPORT mgl_datas_hdf_(const char *fname, char *buf, int l, int size)\r
 {      char *s=new char[l+1];          memcpy(s,fname,l);      s[l]=0;\r
        int r = mgl_datas_hdf(s,buf,size);      delete []s;     return r;       }\r
 //-----------------------------------------------------------------------------\r
@@ -1166,7 +1250,7 @@ int MGL_EXPORT mgl_data_read_range(HMDT dat, const char *templ, double from, dou
        //read first file\r
        do{     snprintf(fname,n,templ,t);      fname[n-1]=0;   t+= step;       } while(!mgl_data_read(&d,fname) && t<=to);\r
 \r
-       if(t>to)        {       delete []fname; return false;   }\r
+       if(t>to)        {       delete []fname; return 0;       }\r
        kx = d.nx;      ky = d.ny;      kz = d.nz;\r
        b = (mreal *)malloc(kx*ky*kz*sizeof(mreal));\r
        memcpy(b,d.a,kx*ky*kz*sizeof(mreal));\r
@@ -1177,11 +1261,11 @@ int MGL_EXPORT mgl_data_read_range(HMDT dat, const char *templ, double from, dou
                snprintf(fname,n,templ,t);      fname[n-1]=0;\r
                if(mgl_data_read(&d,fname))\r
                        if(!mgl_add_file(kx,ky,kz,b,&d,as_slice))\r
-                       {       delete []fname; free(b);        return false;   }\r
+                       {       delete []fname; free(b);        return 0;       }\r
        }\r
        dat->Set(b,kx,ky,kz);\r
        delete []fname; free(b);\r
-       return true;\r
+       return 1;\r
 }\r
 int MGL_EXPORT mgl_data_read_range_(uintptr_t *d, const char *fname, mreal *from, mreal *to, mreal *step, int *as_slice,int l)\r
 {      char *s=new char[l+1];          memcpy(s,fname,l);      s[l]=0;\r
@@ -1202,7 +1286,7 @@ int MGL_EXPORT mgl_data_read_all(HMDT dat, const char *templ, int as_slice)
                if(mgl_data_read(&d,res.gl_pathv[i]))   break;\r
 \r
        if(i>=res.gl_pathc)\r
-       {       globfree (&res);        return false;   }\r
+       {       globfree (&res);        return 0;       }\r
        kx = d.nx;      ky = d.ny;      kz = d.nz;\r
        b = (mreal *)malloc(kx*ky*kz*sizeof(mreal));\r
        memcpy(b,d.a,kx*ky*kz*sizeof(mreal));\r
@@ -1211,14 +1295,14 @@ int MGL_EXPORT mgl_data_read_all(HMDT dat, const char *templ, int as_slice)
        {\r
                if(mgl_data_read(&d,res.gl_pathv[i]))\r
                        if(!mgl_add_file(kx,ky,kz,b,&d,as_slice))\r
-                       {       globfree (&res);        free(b);        return false;   }\r
+                       {       globfree (&res);        free(b);        return 0;       }\r
        }\r
        dat->Set(b,kx,ky,kz);\r
 \r
        globfree (&res);        free(b);\r
-       return true;\r
+       return 1;\r
 #else\r
-       return false;\r
+       return 0;\r
 #endif\r
 }\r
 int MGL_EXPORT mgl_data_read_all_(uintptr_t *d, const char *fname, int *as_slice,int l)\r
@@ -1254,3 +1338,73 @@ uintptr_t MGL_EXPORT mgl_data_column_(uintptr_t *d, const char *eq,int l)
        uintptr_t r = uintptr_t(mgl_data_column(_DT_,s));\r
        delete []s;     return r;       }\r
 //-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_data_limit(HMDT d, mreal v)\r
+{\r
+       long n = d->GetNN();\r
+       mreal *a = d->a;\r
+       #pragma omp parallel for\r
+       for(long i=0;i<n;i++)\r
+       {       mreal b = fabs(a[i]);   if(b>v) a[i] *= v/b;    }\r
+}\r
+void MGL_EXPORT mgl_data_limit_(uintptr_t *d, mreal *v)\r
+{      mgl_data_limit(_DT_, *v);       }\r
+//-----------------------------------------------------------------------------\r
+/// Read binary data and swap big-endian to little-endian if swap=true\r
+size_t MGL_EXPORT mgl_fread(FILE *fp, void *vals, size_t size, size_t num, int swap)\r
+{\r
+       char *ptr = (char*)vals;\r
+       size_t r = fread(ptr,size,num,fp);\r
+       if(r && swap)\r
+       {\r
+               char buf[8], ch;\r
+               if(size==4)     for(size_t i=0;i<r;i++)\r
+               {\r
+                       memcpy(buf,ptr+i*size,size);\r
+                       ch=buf[0];      buf[0]=buf[3];  buf[3]=ch;\r
+                       ch=buf[1];      buf[1]=buf[2];  buf[2]=ch;\r
+               }\r
+               else if(size==2)        for(size_t i=0;i<r;i++)\r
+               {\r
+                       memcpy(buf,ptr+i*size,size);\r
+                       ch=buf[0];      buf[0]=buf[1];  buf[1]=ch;\r
+               }\r
+               else if(size==8)        for(size_t i=0;i<r;i++)\r
+               {\r
+                       memcpy(buf,ptr+i*size,size);\r
+                       ch=buf[0];      buf[0]=buf[7];  buf[7]=ch;\r
+                       ch=buf[1];      buf[1]=buf[6];  buf[6]=ch;\r
+                       ch=buf[2];      buf[2]=buf[5];  buf[5]=ch;\r
+                       ch=buf[3];      buf[3]=buf[4];  buf[4]=ch;\r
+               }\r
+       }\r
+       return r;\r
+}\r
+//-----------------------------------------------------------------------------\r
+/// Read data array from Tektronix WFM file\r
+/** Parse Tektronix TDS5000/B, TDS6000/B/C, TDS/CSA7000/B, MSO70000/C, DSA70000/B/C DPO70000/B/C DPO7000/ MSO/DPO5000. */\r
+int MGL_EXPORT mgl_data_read_wfm(HMDT d,const char *fname, long num, long step/*=1*/, long start/*=0*/)\r
+{\r
+/*     if(step<1)      step=1;\r
+       if(start<0)     start=0;\r
+       FILE *fp = fopen(fname,"rb");\r
+       if(!fp) return 0;       // couldn't open file\r
+       unsigned short byte_order;\r
+       fread(&byte_order,2,1,fp);\r
+       bool byteorder; // TODO\r
+*/     return 0;       \r
+}\r
+int MGL_EXPORT mgl_data_read_wfm_(uintptr_t *d, const char *fname, long *num, long *step, long *start,int l)\r
+{      char *s=new char[l+1];  memcpy(s,fname,l);      s[l]=0;\r
+       int r = mgl_data_read_wfm(_DT_,s,*num,*step,*start);\r
+       delete []s;     return r;       }\r
+/// Read data array from Matlab MAT file (parse versions 4 and 5)\r
+int MGL_EXPORT mgl_data_read_matlab(HMDT d,const char *fname,const char *data)\r
+{\r
+       // TODO\r
+/**/return 0;\r
+}\r
+int MGL_EXPORT mgl_data_read_matlab_(uintptr_t *d, const char *fname, const char *data,int l,int n)\r
+{      char *s=new char[l+1];  memcpy(s,fname,l);      s[l]=0;\r
+       char *t=new char[n+1];  memcpy(t,data,n);       t[n]=0;\r
+       int r = mgl_data_read_matlab(_DT_,s,t); delete []s;     delete []t;     return r;       }\r
+//-----------------------------------------------------------------------------\r
index d6a15be64cc24085f0404d88b4eeec9eaebb1b3d..8ab03f1c315f795b30882576e31c7691c090099b 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * data_png.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -45,7 +45,7 @@ MGL_NO_EXPORT unsigned char *mgl_create_scheme(const char *scheme,long &num)
                if(col.Valid())\r
                {       cc[3*np]=255*col.r;     cc[3*np+1]=255*col.g;   cc[3*np+2]=255*col.b;   np++;   }\r
        }\r
-       if(np<2)        {       delete []cc;    return 0;       }\r
+       if(np<2)        {       num=0;  delete []cc;    return 0;       }\r
        for(size_t i=0;i<np-1;i++)      nc+=mgl_col_dif(cc+3*i,cc+3*i+3,false);\r
        c = new unsigned char[3*nc+3];\r
        size_t pos=0;\r
@@ -119,7 +119,7 @@ bool MGL_NO_EXPORT mgl_read_image(unsigned char **g, int &w, int &h, const char
                png_destroy_read_struct(&png_ptr, &info_ptr,&end_info);\r
                fclose(fp);\r
 #else\r
-               mgl_set_global_warn("PNG support was disabled. Please, enable it and rebuild MathGL.");\r
+               mgl_set_global_warn(_("PNG support was disabled. Please, enable it and rebuild MathGL."));\r
 #endif\r
        }\r
        else if(!strcmp(ext,".jpg") || !strcmp(ext,".jpeg"))\r
@@ -159,7 +159,7 @@ bool MGL_NO_EXPORT mgl_read_image(unsigned char **g, int &w, int &h, const char
                }\r
                delete []buf;\r
 #else\r
-               mgl_set_global_warn("JPEG support was disabled. Please, enable it and rebuild MathGL.");\r
+               mgl_set_global_warn(_("JPEG support was disabled. Please, enable it and rebuild MathGL."));\r
 #endif\r
        }\r
        return true;\r
@@ -207,7 +207,7 @@ void MGL_EXPORT mgl_data_export(HCDT dd, const char *fname, const char *scheme,m
        {\r
                v1 = INFINITY;  v2=-INFINITY;\r
                for(long i=0;i<nx*ny*nz;i++)\r
-               {       register mreal vv = dd->vthr(i);        if(vv<v1)       v1=vv;  if(vv>v2)       v2=vv;  }\r
+               {       mreal vv = dd->vthr(i); if(vv<v1)       v1=vv;  if(vv>v2)       v2=vv;  }\r
        }\r
        if(v1==v2)      return;\r
        long num=0;\r
@@ -221,8 +221,9 @@ void MGL_EXPORT mgl_data_export(HCDT dd, const char *fname, const char *scheme,m
        #pragma omp parallel for collapse(2)\r
        for(long i=0;i<ny;i++)  for(long j=0;j<nx;j++)\r
        {\r
-               register long k = long(num*(dd->v(j,i,ns)-v1)/(v2-v1));\r
-               if(k<0) k=0;    if(k>=num) k=num-1;\r
+               long k = long(num*(dd->v(j,i,ns)-v1)/(v2-v1));\r
+               if(k<0)         k=0;\r
+               if(k>=num) k=num-1;\r
                memcpy(d+3*(j+i*nx),c+3*k,3);\r
        }\r
        delete []c;\r
index ef161da486c04519f34cecf2a8f6ed19602e2c32..b13632c746629551df2f0ba9655848217aa44b38 100644 (file)
-const unsigned long mgl_numg=411, mgl_cur=243136;
+const unsigned long mgl_numg=411, mgl_cur=194872;
 const float mgl_fact=35.7143;
 long mgl_gen_fnt[411][6] = {
-       {0x21,166,41,0,39,164},
-       {0x22,204,43,398,38,570},
-       {0x23,250,33,798,32,930},
-       {0x24,250,81,1122,80,1446},
-       {0x25,373,130,1926,129,2446},
-       {0x26,388,128,3220,127,3732},
-       {0x27,89,20,4494,19,4574},
-       {0x28,166,22,4688,20,4776},
-       {0x29,166,22,4896,21,4984},
-       {0x2a,250,154,5110,169,5726},
-       {0x2b,342,12,6740,8,6788},
-       {0x2c,125,34,6836,34,6972},
-       {0x2d,166,4,7176,2,7192},
-       {0x2e,125,21,7204,18,7288},
-       {0x2f,138,4,7396,2,7412},
-       {0x30,250,43,7424,41,7596},
-       {0x31,250,28,7842,27,7954},
-       {0x32,250,43,8116,41,8288},
-       {0x33,250,91,8534,90,8898},
-       {0x34,250,15,9438,12,9498},
-       {0x35,250,72,9570,77,9858},
-       {0x36,250,68,10320,66,10592},
-       {0x37,250,13,10988,11,11040},
-       {0x38,250,85,11106,83,11446},
-       {0x39,250,68,11944,67,12216},
-       {0x3a,138,43,12618,36,12790},
-       {0x3b,138,57,13006,52,13234},
-       {0x3c,342,7,13546,5,13574},
-       {0x3d,342,9,13604,4,13640},
-       {0x3e,342,7,13664,5,13692},
-       {0x3f,222,77,13722,73,14030},
-       {0x40,460,136,14468,136,15012},
-       {0x41,361,47,15828,50,16016},
-       {0x42,333,90,16316,90,16676},
-       {0x43,333,72,17216,72,17504},
-       {0x44,361,67,17936,68,18204},
-       {0x45,305,57,18612,54,18840},
-       {0x46,277,51,19164,47,19368},
-       {0x47,361,88,19650,86,20002},
-       {0x48,361,60,20518,56,20758},
-       {0x49,166,27,21094,26,21202},
-       {0x4a,186,45,21358,43,21538},
-       {0x4b,361,70,21796,69,22076},
-       {0x4c,305,37,22490,39,22638},
-       {0x4d,444,49,22872,47,23068},
-       {0x4e,361,47,23350,50,23538},
-       {0x4f,361,63,23838,60,24090},
-       {0x50,278,66,24450,69,24714},
-       {0x51,361,85,25128,83,25468},
-       {0x52,333,69,25966,69,26242},
-       {0x53,277,91,26656,94,27020},
-       {0x54,305,32,27584,30,27712},
-       {0x55,361,68,27892,68,28164},
-       {0x56,361,42,28572,41,28740},
-       {0x57,472,72,28986,75,29274},
-       {0x58,361,82,29724,80,30052},
-       {0x59,361,55,30532,54,30752},
-       {0x5a,305,32,31076,30,31204},
-       {0x5b,166,18,31384,16,31456},
-       {0x5c,138,4,31552,2,31568},
-       {0x5d,166,17,31580,16,31648},
-       {0x5e,234,7,31744,5,31772},
-       {0x5f,250,4,31802,2,31818},
-       {0x60,166,17,31830,16,31898},
-       {0x61,222,112,31994,115,32442},
-       {0x62,250,70,33132,71,33412},
-       {0x63,222,62,33838,60,34086},
-       {0x64,250,72,34446,79,34734},
-       {0x65,222,53,35208,53,35420},
-       {0x66,166,57,35738,53,35966},
-       {0x67,250,139,36284,149,36840},
-       {0x68,250,60,37734,67,37974},
-       {0x69,138,45,38376,44,38556},
-       {0x6a,138,71,38820,71,39104},
-       {0x6b,250,69,39530,72,39806},
-       {0x6c,138,30,40238,30,40358},
-       {0x6d,388,102,40538,108,40946},
-       {0x6e,250,66,41594,67,41858},
-       {0x6f,250,53,42260,50,42472},
-       {0x70,250,68,42772,72,43044},
-       {0x71,250,64,43476,68,43732},
-       {0x72,166,61,44140,61,44384},
-       {0x73,194,79,44750,86,45066},
-       {0x74,138,47,45582,49,45770},
-       {0x75,250,54,46064,56,46280},
-       {0x76,250,54,46616,53,46832},
-       {0x77,361,72,47150,81,47438},
-       {0x78,250,83,47924,89,48256},
-       {0x79,250,74,48790,79,49086},
-       {0x7a,222,27,49560,25,49668},
-       {0x7b,239,55,49818,54,50038},
-       {0x7c,99,4,50362,2,50378},
-       {0x7d,239,55,50390,55,50610},
-       {0x7e,270,41,50940,40,51104},
-       {0xa1,165,41,51344,39,51508},
-       {0xa2,250,81,51742,84,52066},
-       {0xa3,250,135,52570,148,53110},
-       {0xa4,250,73,53998,72,54290},
-       {0xa5,250,71,54722,69,55006},
-       {0xa6,99,9,55420,4,55456},
-       {0xa7,250,152,55480,156,56088},
-       {0xa8,166,43,57024,36,57196},
-       {0xa9,380,92,57412,87,57780},
-       {0xaa,137,95,58302,103,58682},
-       {0xab,250,69,59300,73,59576},
-       {0xac,300,6,60014,4,60038},
-       {0xad,166,4,60062,2,60078},
-       {0xae,380,106,60090,106,60514},
-       {0xaf,166,4,61150,2,61166},
-       {0xb0,199,43,61178,41,61350},
-       {0xb1,342,17,61596,10,61664},
-       {0xb2,150,41,61724,41,61888},
-       {0xb3,150,74,62134,75,62430},
-       {0xb4,166,16,62880,16,62944},
-       {0xb5,250,68,63040,67,63312},
-       {0xb6,295,48,63714,47,63906},
-       {0xb7,125,21,64188,18,64272},
-       {0xb8,166,40,64380,43,64540},
-       {0xb9,150,23,64798,26,64890},
-       {0xba,155,46,65046,45,65230},
-       {0xbb,250,73,65500,72,65792},
-       {0xbc,375,43,66224,40,66396},
-       {0xbd,375,74,66636,69,66932},
-       {0xbe,375,95,67346,89,67726},
-       {0xbf,222,86,68260,82,68604},
-       {0xc0,361,65,69096,66,69356},
-       {0xc1,361,65,69752,66,70012},
-       {0xc2,361,55,70408,55,70628},
-       {0xc3,361,89,70958,92,71314},
-       {0xc4,361,91,71866,86,72230},
-       {0xc5,361,91,72746,90,73110},
-       {0xc6,444,86,73650,85,73994},
-       {0xc7,333,108,74504,116,74936},
-       {0xc8,305,74,75632,70,75928},
-       {0xc9,305,74,76348,70,76644},
-       {0xca,305,65,77064,59,77324},
-       {0xcb,305,101,77678,90,78082},
-       {0xcc,166,45,78622,42,78802},
-       {0xcd,166,45,79054,42,79234},
-       {0xce,166,36,79486,31,79630},
-       {0xcf,166,72,79816,62,80104},
-       {0xd0,361,70,80476,69,80756},
-       {0xd1,361,88,81170,92,81522},
-       {0xd2,361,80,82074,76,82394},
-       {0xd3,361,81,82850,76,83174},
-       {0xd4,361,71,83630,65,83914},
-       {0xd5,361,104,84304,102,84720},
-       {0xd6,361,107,85332,96,85760},
-       {0xd7,319,12,86336,10,86384},
-       {0xd8,361,78,86444,80,86756},
-       {0xd9,361,87,87236,84,87584},
-       {0xda,361,87,88088,84,88436},
-       {0xdb,361,76,88940,73,89244},
-       {0xdc,361,112,89682,104,90130},
-       {0xdd,361,73,90754,70,91046},
-       {0xde,277,70,91466,75,91746},
-       {0xdf,250,98,92196,98,92588},
-       {0xe0,222,130,93176,131,93696},
-       {0xe1,222,129,94482,131,94998},
-       {0xe2,222,120,95784,120,96264},
-       {0xe3,222,155,96984,157,97604},
-       {0xe4,222,156,98546,151,99170},
-       {0xe5,222,156,100076,155,100700},
-       {0xe6,333,127,101630,132,102138},
-       {0xe7,222,97,102930,99,103318},
-       {0xe8,222,71,103912,69,104196},
-       {0xe9,222,72,104610,69,104898},
-       {0xea,222,61,105312,58,105556},
-       {0xeb,222,97,105904,89,106292},
-       {0xec,138,40,106826,42,106986},
-       {0xed,138,41,107238,42,107402},
-       {0xee,138,33,107654,31,107786},
-       {0xef,138,70,107972,62,108252},
-       {0xf0,250,74,108624,72,108920},
-       {0xf1,250,109,109352,109,109788},
-       {0xf2,250,71,110442,66,110726},
-       {0xf3,250,71,111122,66,111406},
-       {0xf4,250,61,111802,55,112046},
-       {0xf5,250,94,112376,92,112752},
-       {0xf6,250,97,113304,86,113692},
-       {0xf7,281,48,114208,38,114400},
-       {0xf8,250,73,114628,76,114920},
-       {0xf9,250,73,115376,72,115668},
-       {0xfa,250,73,116100,72,116392},
-       {0xfb,250,62,116824,61,117072},
-       {0xfc,250,98,117438,92,117830},
-       {0xfd,250,92,118382,95,118750},
-       {0xfe,250,71,119320,72,119604},
-       {0xff,250,118,120036,115,120508},
-       {0x300,0,15,121198,16,121258},
-       {0x301,0,16,121354,16,121418},
-       {0x302,0,7,121514,5,121542},
-       {0x303,0,40,121572,40,121732},
-       {0x304,0,4,121972,2,121988},
-       {0x305,0,4,122000,2,122016},
-       {0x306,0,22,122028,20,122116},
-       {0x307,0,21,122236,18,122320},
-       {0x308,0,43,122428,36,122600},
-       {0x309,0,44,122816,43,122992},
-       {0x30a,0,43,123250,40,123422},
-       {0x30b,0,36,123662,32,123806},
-       {0x30c,0,7,123998,5,124026},
-       {0x30d,0,4,124056,2,124072},
-       {0x30e,0,9,124084,4,124120},
-       {0x30f,0,36,124144,32,124288},
-       {0x391,361,45,124480,46,124660},
-       {0x392,333,71,124936,70,125220},
-       {0x393,293,35,125640,33,125780},
-       {0x394,361,8,125978,7,126010},
-       {0x395,305,56,126052,52,126276},
-       {0x396,305,32,126588,30,126716},
-       {0x397,361,60,126896,56,127136},
-       {0x398,361,105,127472,104,127892},
-       {0x399,166,27,128516,26,128624},
-       {0x39a,365,70,128780,69,129060},
-       {0x39b,351,41,129474,40,129638},
-       {0x39c,444,49,129878,47,130074},
-       {0x39d,361,47,130356,50,130544},
-       {0x39e,321,62,130844,54,131092},
-       {0x39f,361,63,131416,60,131668},
-       {0x3a0,361,52,132028,52,132236},
-       {0x3a1,278,66,132548,69,132812},
-       {0x3a2,0,0,133226,0,133226},
-       {0x3a3,311,24,133226,22,133322},
-       {0x3a4,305,32,133454,30,133582},
-       {0x3a5,361,55,133762,56,133982},
-       {0x3a6,381,76,134318,77,134622},
-       {0x3a7,361,82,135084,80,135412},
-       {0x3a8,372,81,135892,81,136216},
-       {0x3a9,372,62,136702,60,136950},
-       {0x3aa,166,71,137310,62,137594},
-       {0x3ab,361,99,137966,92,138362},
-       {0x3ac,271,84,138914,80,139250},
-       {0x3ad,219,111,139730,110,140174},
-       {0x3ae,256,71,140834,72,141118},
-       {0x3af,137,52,141550,54,141758},
-       {0x3b0,262,119,142082,110,142558},
-       {0x3b1,271,66,143218,64,143482},
-       {0x3b2,247,96,143866,99,144250},
-       {0x3b3,237,47,144844,48,145032},
-       {0x3b4,250,83,145320,80,145652},
-       {0x3b5,219,94,146132,94,146508},
-       {0x3b6,220,100,147072,101,147472},
-       {0x3b7,256,55,148078,56,148298},
-       {0x3b8,247,57,148634,56,148862},
-       {0x3b9,137,34,149198,38,149334},
-       {0x3ba,250,64,149562,66,149818},
-       {0x3bb,248,48,150214,47,150406},
-       {0x3bc,263,64,150688,63,150944},
-       {0x3bd,227,33,151322,35,151454},
-       {0x3be,220,137,151664,139,152212},
-       {0x3bf,252,43,153046,41,153218},
-       {0x3c0,250,67,153464,69,153732},
-       {0x3c1,247,55,154146,53,154366},
-       {0x3c2,220,79,154684,79,155000},
-       {0x3c3,273,45,155474,43,155654},
-       {0x3c4,238,46,155912,44,156096},
-       {0x3c5,262,58,156360,58,156592},
-       {0x3c6,311,73,156940,72,157232},
-       {0x3c7,250,52,157664,51,157872},
-       {0x3c8,347,54,158178,55,158394},
-       {0x3c9,312,91,158724,90,159088},
-       {0x3d1,276,96,159628,99,160012},
-       {0x3d5,311,63,160606,64,160858},
-       {0x3d6,381,95,161242,96,161622},
-       {0x3f0,275,77,162198,76,162506},
-       {0x3f1,250,63,162962,62,163214},
-       {0x3f5,219,51,163586,50,163790},
-       {0x410,356,47,164090,50,164278},
-       {0x411,305,63,164578,60,164830},
-       {0x412,325,92,165190,90,165558},
-       {0x413,285,38,166098,38,166250},
-       {0x414,332,71,166478,73,166762},
-       {0x415,314,56,167200,54,167424},
-       {0x416,510,145,167748,143,168328},
-       {0x417,287,90,169186,89,169546},
-       {0x418,361,58,170080,55,170312},
-       {0x419,361,107,170642,104,171070},
-       {0x41a,344,100,171694,99,172094},
-       {0x41b,341,64,172688,64,172944},
-       {0x41c,446,48,173328,47,173520},
-       {0x41d,362,60,173802,56,174042},
-       {0x41e,364,63,174378,60,174630},
-       {0x41f,362,52,174990,52,175198},
-       {0x420,285,65,175510,69,175770},
-       {0x421,338,71,176184,72,176468},
-       {0x422,309,32,176900,30,177028},
-       {0x423,355,75,177208,78,177508},
-       {0x424,384,76,177976,77,178280},
-       {0x425,358,82,178742,80,179070},
-       {0x426,357,59,179550,63,179786},
-       {0x427,328,64,180164,63,180420},
-       {0x428,497,71,180798,78,181082},
-       {0x429,497,81,181550,89,181874},
-       {0x42a,368,53,182408,50,182620},
-       {0x42b,441,80,182920,75,183240},
-       {0x42c,305,51,183690,48,183894},
-       {0x42d,325,76,184182,76,184486},
-       {0x42e,450,93,184942,89,185314},
-       {0x42f,318,64,185848,64,186104},
-       {0x430,224,113,186488,114,186940},
-       {0x431,253,79,187624,78,187940},
-       {0x432,237,84,188408,84,188744},
-       {0x433,196,34,189248,32,189384},
-       {0x434,231,59,189576,64,189812},
-       {0x435,233,49,190196,48,190392},
-       {0x436,360,144,190680,148,191256},
-       {0x437,194,85,192144,88,192484},
-       {0x438,262,56,193012,55,193236},
-       {0x439,262,106,193566,103,193990},
-       {0x43a,251,85,194608,87,194948},
-       {0x43b,249,63,195470,64,195722},
-       {0x43c,308,48,196106,48,196298},
-       {0x43d,262,58,196586,56,196818},
-       {0x43e,256,53,197154,50,197366},
-       {0x43f,262,52,197666,52,197874},
-       {0x440,249,71,198186,72,198470},
-       {0x441,228,63,198902,60,199154},
-       {0x442,217,40,199514,38,199674},
-       {0x443,245,69,199902,73,200178},
-       {0x444,338,134,200616,136,201152},
-       {0x445,244,77,201968,81,202276},
-       {0x446,262,57,202762,59,202990},
-       {0x447,256,62,203344,63,203592},
-       {0x448,383,76,203970,78,204274},
-       {0x449,383,82,204742,85,205070},
-       {0x44a,269,56,205580,54,205804},
-       {0x44b,334,77,206128,75,206436},
-       {0x44c,228,49,206886,48,207082},
-       {0x44d,222,54,207370,55,207586},
-       {0x44e,368,81,207916,79,208240},
-       {0x44f,235,59,208714,59,208950},
-       {0x210f,289,94,209304,101,209680},
-       {0x2111,381,130,210286,125,210806},
-       {0x2113,0,0,211556,0,211556},
-       {0x211c,436,132,211556,135,212084},
-       {0x2190,463,40,212894,44,213054},
-       {0x2191,255,39,213318,44,213474},
-       {0x2192,463,41,213738,44,213902},
-       {0x2193,255,38,214166,44,214318},
-       {0x2194,463,75,214582,86,214882},
-       {0x2195,255,74,215398,86,215694},
-       {0x2196,463,50,216210,66,216410},
-       {0x2197,463,50,216806,65,217006},
-       {0x2198,463,45,217396,63,217576},
-       {0x2199,463,49,217954,64,218150},
-       {0x2200,280,12,218534,11,218582},
-       {0x2201,231,48,218648,47,218840},
-       {0x2202,235,70,219122,72,219402},
-       {0x2203,280,12,219834,10,219882},
-       {0x2204,280,30,219942,30,220062},
-       {0x2205,381,70,220242,70,220522},
-       {0x2206,365,8,220942,7,220974},
-       {0x2207,365,8,221016,7,221048},
-       {0x2208,342,29,221090,27,221206},
-       {0x2209,342,52,221368,56,221576},
-       {0x220a,242,29,221912,27,222028},
-       {0x220b,342,30,222190,27,222310},
-       {0x220c,342,56,222472,55,222696},
-       {0x220d,242,29,223026,28,223142},
-       {0x220e,272,4,223310,2,223326},
-       {0x220f,500,49,223338,47,223534},
-       {0x2210,500,49,223816,47,224012},
-       {0x2211,457,22,224294,20,224382},
-       {0x2212,342,4,224502,2,224518},
-       {0x2213,342,17,224530,10,224598},
-       {0x2214,342,34,224658,26,224794},
-       {0x2215,261,4,224950,2,224966},
-       {0x2216,213,4,224978,2,224994},
-       {0x2217,261,135,225006,133,225546},
-       {0x2218,175,43,226344,40,226516},
-       {0x2219,175,21,226756,18,226840},
-       {0x221a,463,19,226948,18,227024},
-       {0x221b,463,93,227132,93,227504},
-       {0x221c,463,35,228062,30,228202},
-       {0x221d,342,65,228382,65,228642},
-       {0x221e,463,85,229032,85,229372},
-       {0x221f,342,6,229882,4,229906},
-       {0x2220,342,6,229930,4,229954},
-       {0x2221,342,33,229978,42,230110},
-       {0x2222,342,48,230362,52,230554},
-       {0x2223,132,4,230866,2,230882},
-       {0x2224,202,12,230894,8,230942},
-       {0x2225,261,9,230990,4,231026},
-       {0x2226,304,20,231050,14,231130},
-       {0x2227,310,7,231214,5,231242},
-       {0x2228,310,7,231272,5,231300},
-       {0x2229,310,26,231330,25,231434},
-       {0x222a,310,26,231584,24,231688},
-       {0x222b,229,67,231832,70,232100},
-       {0x222c,350,137,232520,140,233068},
-       {0x222d,471,205,233908,210,234728},
-       {0x222e,249,117,235988,126,236456},
-       {0x222f,370,209,237212,232,238048},
-       {0x2260,342,20,239440,18,239520},
-       {0x2261,342,14,239628,6,239684},
-       {0x2262,342,28,239720,26,239832},
-       {0x2263,342,19,239988,8,240064},
-       {0x2264,342,12,240112,7,240160},
-       {0x2265,342,12,240202,7,240250},
-       {0x2266,342,17,240292,9,240360},
-       {0x2267,342,17,240414,9,240482},
-       {0x2268,342,28,240536,23,240648},
-       {0x2269,342,28,240786,23,240898},
-       {0x226a,466,15,241036,10,241096},
-       {0x226b,466,15,241156,10,241216},
-       {0x226c,233,80,241276,84,241596},
-       {0x226d,342,55,242100,60,242320},
-       {0x226e,342,20,242680,19,242760},
-       {0x226f,342,20,242874,19,242954},
-       {0x27c2,346,8,243068,6,243100}
+       {0x21,166,41,0,39,82},
+       {0x22,204,43,316,38,402},
+       {0x23,250,33,630,32,696},
+       {0x24,250,81,888,80,1050},
+       {0x25,373,130,1530,129,1790},
+       {0x26,388,128,2564,127,2820},
+       {0x27,89,20,3582,19,3622},
+       {0x28,166,22,3736,20,3780},
+       {0x29,166,22,3900,21,3944},
+       {0x2a,250,154,4070,169,4378},
+       {0x2b,342,12,5392,8,5416},
+       {0x2c,125,34,5464,34,5532},
+       {0x2d,166,4,5736,2,5744},
+       {0x2e,125,21,5756,18,5798},
+       {0x2f,138,4,5906,2,5914},
+       {0x30,250,43,5926,41,6012},
+       {0x31,250,28,6258,27,6314},
+       {0x32,250,43,6476,41,6562},
+       {0x33,250,91,6808,90,6990},
+       {0x34,250,15,7530,12,7560},
+       {0x35,250,72,7632,77,7776},
+       {0x36,250,68,8238,66,8374},
+       {0x37,250,13,8770,11,8796},
+       {0x38,250,85,8862,83,9032},
+       {0x39,250,68,9530,67,9666},
+       {0x3a,138,43,10068,36,10154},
+       {0x3b,138,57,10370,52,10484},
+       {0x3c,342,7,10796,5,10810},
+       {0x3d,342,9,10840,4,10858},
+       {0x3e,342,7,10882,5,10896},
+       {0x3f,222,77,10926,73,11080},
+       {0x40,460,136,11518,136,11790},
+       {0x41,361,47,12606,50,12700},
+       {0x42,333,90,13000,90,13180},
+       {0x43,333,72,13720,72,13864},
+       {0x44,361,67,14296,68,14430},
+       {0x45,305,57,14838,54,14952},
+       {0x46,277,51,15276,47,15378},
+       {0x47,361,88,15660,86,15836},
+       {0x48,361,60,16352,56,16472},
+       {0x49,166,27,16808,26,16862},
+       {0x4a,186,45,17018,43,17108},
+       {0x4b,361,70,17366,69,17506},
+       {0x4c,305,37,17920,39,17994},
+       {0x4d,444,49,18228,47,18326},
+       {0x4e,361,47,18608,50,18702},
+       {0x4f,361,63,19002,60,19128},
+       {0x50,278,66,19488,69,19620},
+       {0x51,361,85,20034,83,20204},
+       {0x52,333,69,20702,69,20840},
+       {0x53,277,91,21254,94,21436},
+       {0x54,305,32,22000,30,22064},
+       {0x55,361,68,22244,68,22380},
+       {0x56,361,42,22788,41,22872},
+       {0x57,472,72,23118,75,23262},
+       {0x58,361,82,23712,80,23876},
+       {0x59,361,55,24356,54,24466},
+       {0x5a,305,32,24790,30,24854},
+       {0x5b,166,18,25034,16,25070},
+       {0x5c,138,4,25166,2,25174},
+       {0x5d,166,17,25186,16,25220},
+       {0x5e,234,7,25316,5,25330},
+       {0x5f,250,4,25360,2,25368},
+       {0x60,166,17,25380,16,25414},
+       {0x61,222,112,25510,115,25734},
+       {0x62,250,70,26424,71,26564},
+       {0x63,222,62,26990,60,27114},
+       {0x64,250,72,27474,79,27618},
+       {0x65,222,53,28092,53,28198},
+       {0x66,166,57,28516,53,28630},
+       {0x67,250,139,28948,149,29226},
+       {0x68,250,60,30120,67,30240},
+       {0x69,138,45,30642,44,30732},
+       {0x6a,138,71,30996,71,31138},
+       {0x6b,250,69,31564,72,31702},
+       {0x6c,138,30,32134,30,32194},
+       {0x6d,388,102,32374,108,32578},
+       {0x6e,250,66,33226,67,33358},
+       {0x6f,250,53,33760,50,33866},
+       {0x70,250,68,34166,72,34302},
+       {0x71,250,64,34734,68,34862},
+       {0x72,166,61,35270,61,35392},
+       {0x73,194,79,35758,86,35916},
+       {0x74,138,47,36432,49,36526},
+       {0x75,250,54,36820,56,36928},
+       {0x76,250,54,37264,53,37372},
+       {0x77,361,72,37690,81,37834},
+       {0x78,250,83,38320,89,38486},
+       {0x79,250,74,39020,79,39168},
+       {0x7a,222,27,39642,25,39696},
+       {0x7b,239,55,39846,54,39956},
+       {0x7c,99,4,40280,2,40288},
+       {0x7d,239,55,40300,55,40410},
+       {0x7e,270,41,40740,40,40822},
+       {0xa1,165,41,41062,39,41144},
+       {0xa2,250,81,41378,84,41540},
+       {0xa3,250,135,42044,148,42314},
+       {0xa4,250,73,43202,72,43348},
+       {0xa5,250,71,43780,69,43922},
+       {0xa6,99,9,44336,4,44354},
+       {0xa7,250,152,44378,156,44682},
+       {0xa8,166,43,45618,36,45704},
+       {0xa9,380,92,45920,87,46104},
+       {0xaa,137,95,46626,103,46816},
+       {0xab,250,69,47434,73,47572},
+       {0xac,300,6,48010,4,48022},
+       {0xad,166,4,48046,2,48054},
+       {0xae,380,106,48066,106,48278},
+       {0xaf,166,4,48914,2,48922},
+       {0xb0,199,43,48934,41,49020},
+       {0xb1,342,17,49266,10,49300},
+       {0xb2,150,41,49360,41,49442},
+       {0xb3,150,74,49688,75,49836},
+       {0xb4,166,16,50286,16,50318},
+       {0xb5,250,68,50414,67,50550},
+       {0xb6,295,48,50952,47,51048},
+       {0xb7,125,21,51330,18,51372},
+       {0xb8,166,40,51480,43,51560},
+       {0xb9,150,23,51818,26,51864},
+       {0xba,155,46,52020,45,52112},
+       {0xbb,250,73,52382,72,52528},
+       {0xbc,375,43,52960,40,53046},
+       {0xbd,375,74,53286,69,53434},
+       {0xbe,375,95,53848,89,54038},
+       {0xbf,222,86,54572,82,54744},
+       {0xc0,361,65,55236,66,55366},
+       {0xc1,361,65,55762,66,55892},
+       {0xc2,361,55,56288,55,56398},
+       {0xc3,361,89,56728,92,56906},
+       {0xc4,361,91,57458,86,57640},
+       {0xc5,361,91,58156,90,58338},
+       {0xc6,444,86,58878,85,59050},
+       {0xc7,333,108,59560,116,59776},
+       {0xc8,305,74,60472,70,60620},
+       {0xc9,305,74,61040,70,61188},
+       {0xca,305,65,61608,59,61738},
+       {0xcb,305,101,62092,90,62294},
+       {0xcc,166,45,62834,42,62924},
+       {0xcd,166,45,63176,42,63266},
+       {0xce,166,36,63518,31,63590},
+       {0xcf,166,72,63776,62,63920},
+       {0xd0,361,70,64292,69,64432},
+       {0xd1,361,88,64846,92,65022},
+       {0xd2,361,80,65574,76,65734},
+       {0xd3,361,81,66190,76,66352},
+       {0xd4,361,71,66808,65,66950},
+       {0xd5,361,104,67340,102,67548},
+       {0xd6,361,107,68160,96,68374},
+       {0xd7,319,12,68950,10,68974},
+       {0xd8,361,78,69034,80,69190},
+       {0xd9,361,87,69670,84,69844},
+       {0xda,361,87,70348,84,70522},
+       {0xdb,361,76,71026,73,71178},
+       {0xdc,361,112,71616,104,71840},
+       {0xdd,361,73,72464,70,72610},
+       {0xde,277,70,73030,75,73170},
+       {0xdf,250,98,73620,98,73816},
+       {0xe0,222,130,74404,131,74664},
+       {0xe1,222,129,75450,131,75708},
+       {0xe2,222,120,76494,120,76734},
+       {0xe3,222,155,77454,157,77764},
+       {0xe4,222,156,78706,151,79018},
+       {0xe5,222,156,79924,155,80236},
+       {0xe6,333,127,81166,132,81420},
+       {0xe7,222,97,82212,99,82406},
+       {0xe8,222,71,83000,69,83142},
+       {0xe9,222,72,83556,69,83700},
+       {0xea,222,61,84114,58,84236},
+       {0xeb,222,97,84584,89,84778},
+       {0xec,138,40,85312,42,85392},
+       {0xed,138,41,85644,42,85726},
+       {0xee,138,33,85978,31,86044},
+       {0xef,138,70,86230,62,86370},
+       {0xf0,250,74,86742,72,86890},
+       {0xf1,250,109,87322,109,87540},
+       {0xf2,250,71,88194,66,88336},
+       {0xf3,250,71,88732,66,88874},
+       {0xf4,250,61,89270,55,89392},
+       {0xf5,250,94,89722,92,89910},
+       {0xf6,250,97,90462,86,90656},
+       {0xf7,281,48,91172,38,91268},
+       {0xf8,250,73,91496,76,91642},
+       {0xf9,250,73,92098,72,92244},
+       {0xfa,250,73,92676,72,92822},
+       {0xfb,250,62,93254,61,93378},
+       {0xfc,250,98,93744,92,93940},
+       {0xfd,250,92,94492,95,94676},
+       {0xfe,250,71,95246,72,95388},
+       {0xff,250,118,95820,115,96056},
+       {0x300,0,15,96746,16,96776},
+       {0x301,0,16,96872,16,96904},
+       {0x302,0,7,97000,5,97014},
+       {0x303,0,40,97044,40,97124},
+       {0x304,0,4,97364,2,97372},
+       {0x305,0,4,97384,2,97392},
+       {0x306,0,22,97404,20,97448},
+       {0x307,0,21,97568,18,97610},
+       {0x308,0,43,97718,36,97804},
+       {0x309,0,44,98020,43,98108},
+       {0x30a,0,43,98366,40,98452},
+       {0x30b,0,36,98692,32,98764},
+       {0x30c,0,7,98956,5,98970},
+       {0x30d,0,4,99000,2,99008},
+       {0x30e,0,9,99020,4,99038},
+       {0x30f,0,36,99062,32,99134},
+       {0x391,361,45,99326,46,99416},
+       {0x392,333,71,99692,70,99834},
+       {0x393,293,35,100254,33,100324},
+       {0x394,361,8,100522,7,100538},
+       {0x395,305,56,100580,52,100692},
+       {0x396,305,32,101004,30,101068},
+       {0x397,361,60,101248,56,101368},
+       {0x398,361,105,101704,104,101914},
+       {0x399,166,27,102538,26,102592},
+       {0x39a,365,70,102748,69,102888},
+       {0x39b,351,41,103302,40,103384},
+       {0x39c,444,49,103624,47,103722},
+       {0x39d,361,47,104004,50,104098},
+       {0x39e,321,62,104398,54,104522},
+       {0x39f,361,63,104846,60,104972},
+       {0x3a0,361,52,105332,52,105436},
+       {0x3a1,278,66,105748,69,105880},
+       {0x3a3,311,24,106294,22,106342},
+       {0x3a4,305,32,106474,30,106538},
+       {0x3a5,361,55,106718,56,106828},
+       {0x3a6,381,76,107164,77,107316},
+       {0x3a7,361,82,107778,80,107942},
+       {0x3a8,372,81,108422,81,108584},
+       {0x3a9,372,62,109070,60,109194},
+       {0x3aa,166,71,109554,62,109696},
+       {0x3ab,361,99,110068,92,110266},
+       {0x3ac,271,84,110818,80,110986},
+       {0x3ad,219,111,111466,110,111688},
+       {0x3ae,256,71,112348,72,112490},
+       {0x3af,137,52,112922,54,113026},
+       {0x3b0,262,119,113350,110,113588},
+       {0x3b1,271,66,114248,64,114380},
+       {0x3b2,247,96,114764,99,114956},
+       {0x3b3,237,47,115550,48,115644},
+       {0x3b4,250,83,115932,80,116098},
+       {0x3b5,219,94,116578,94,116766},
+       {0x3b6,220,100,117330,101,117530},
+       {0x3b7,256,55,118136,56,118246},
+       {0x3b8,247,57,118582,56,118696},
+       {0x3b9,137,34,119032,38,119100},
+       {0x3ba,250,64,119328,66,119456},
+       {0x3bb,248,48,119852,47,119948},
+       {0x3bc,263,64,120230,63,120358},
+       {0x3bd,227,33,120736,35,120802},
+       {0x3be,220,137,121012,139,121286},
+       {0x3bf,252,43,122120,41,122206},
+       {0x3c0,250,67,122452,69,122586},
+       {0x3c1,247,55,123000,53,123110},
+       {0x3c2,220,79,123428,79,123586},
+       {0x3c3,273,45,124060,43,124150},
+       {0x3c4,238,46,124408,44,124500},
+       {0x3c5,262,58,124764,58,124880},
+       {0x3c6,311,73,125228,72,125374},
+       {0x3c7,250,52,125806,51,125910},
+       {0x3c8,347,54,126216,55,126324},
+       {0x3c9,312,91,126654,90,126836},
+       {0x3d1,276,96,127376,99,127568},
+       {0x3d5,311,63,128162,64,128288},
+       {0x3d6,381,95,128672,96,128862},
+       {0x3f0,275,77,129438,76,129592},
+       {0x3f1,250,63,130048,62,130174},
+       {0x3f5,219,51,130546,50,130648},
+       {0x410,356,47,130948,50,131042},
+       {0x411,305,63,131342,60,131468},
+       {0x412,325,92,131828,90,132012},
+       {0x413,285,38,132552,38,132628},
+       {0x414,332,71,132856,73,132998},
+       {0x415,314,56,133436,54,133548},
+       {0x416,510,145,133872,143,134162},
+       {0x417,287,90,135020,89,135200},
+       {0x418,361,58,135734,55,135850},
+       {0x419,361,107,136180,104,136394},
+       {0x41a,344,100,137018,99,137218},
+       {0x41b,341,64,137812,64,137940},
+       {0x41c,446,48,138324,47,138420},
+       {0x41d,362,60,138702,56,138822},
+       {0x41e,364,63,139158,60,139284},
+       {0x41f,362,52,139644,52,139748},
+       {0x420,285,65,140060,69,140190},
+       {0x421,338,71,140604,72,140746},
+       {0x422,309,32,141178,30,141242},
+       {0x423,355,75,141422,78,141572},
+       {0x424,384,76,142040,77,142192},
+       {0x425,358,82,142654,80,142818},
+       {0x426,357,59,143298,63,143416},
+       {0x427,328,64,143794,63,143922},
+       {0x428,497,71,144300,78,144442},
+       {0x429,497,81,144910,89,145072},
+       {0x42a,368,53,145606,50,145712},
+       {0x42b,441,80,146012,75,146172},
+       {0x42c,305,51,146622,48,146724},
+       {0x42d,325,76,147012,76,147164},
+       {0x42e,450,93,147620,89,147806},
+       {0x42f,318,64,148340,64,148468},
+       {0x430,224,113,148852,114,149078},
+       {0x431,253,79,149762,78,149920},
+       {0x432,237,84,150388,84,150556},
+       {0x433,196,34,151060,32,151128},
+       {0x434,231,59,151320,64,151438},
+       {0x435,233,49,151822,48,151920},
+       {0x436,360,144,152208,148,152496},
+       {0x437,194,85,153384,88,153554},
+       {0x438,262,56,154082,55,154194},
+       {0x439,262,106,154524,103,154736},
+       {0x43a,251,85,155354,87,155524},
+       {0x43b,249,63,156046,64,156172},
+       {0x43c,308,48,156556,48,156652},
+       {0x43d,262,58,156940,56,157056},
+       {0x43e,256,53,157392,50,157498},
+       {0x43f,262,52,157798,52,157902},
+       {0x440,249,71,158214,72,158356},
+       {0x441,228,63,158788,60,158914},
+       {0x442,217,40,159274,38,159354},
+       {0x443,245,69,159582,73,159720},
+       {0x444,338,134,160158,136,160426},
+       {0x445,244,77,161242,81,161396},
+       {0x446,262,57,161882,59,161996},
+       {0x447,256,62,162350,63,162474},
+       {0x448,383,76,162852,78,163004},
+       {0x449,383,82,163472,85,163636},
+       {0x44a,269,56,164146,54,164258},
+       {0x44b,334,77,164582,75,164736},
+       {0x44c,228,49,165186,48,165284},
+       {0x44d,222,54,165572,55,165680},
+       {0x44e,368,81,166010,79,166172},
+       {0x44f,235,59,166646,59,166764},
+       {0x210f,289,94,167118,101,167306},
+       {0x2111,381,130,167912,125,168172},
+       {0x2113,383,82,168922,83,169086},
+       {0x211c,436,132,169584,135,169848},
+       {0x2190,463,40,170658,44,170738},
+       {0x2191,255,39,171002,44,171080},
+       {0x2192,463,41,171344,44,171426},
+       {0x2193,255,38,171690,44,171766},
+       {0x2194,463,75,172030,86,172180},
+       {0x2195,255,74,172696,86,172844},
+       {0x2196,463,50,173360,66,173460},
+       {0x2197,463,50,173856,65,173956},
+       {0x2198,463,45,174346,63,174436},
+       {0x2199,463,49,174814,64,174912},
+       {0x2200,280,12,175296,11,175320},
+       {0x2201,231,48,175386,47,175482},
+       {0x2202,235,70,175764,72,175904},
+       {0x2203,280,12,176336,10,176360},
+       {0x2204,280,30,176420,30,176480},
+       {0x2205,381,70,176660,70,176800},
+       {0x2206,365,8,177220,7,177236},
+       {0x2207,365,8,177278,7,177294},
+       {0x2208,342,29,177336,27,177394},
+       {0x2209,342,52,177556,56,177660},
+       {0x220a,242,29,177996,27,178054},
+       {0x220b,342,30,178216,27,178276},
+       {0x220c,342,56,178438,55,178550},
+       {0x220d,242,29,178880,28,178938},
+       {0x220e,272,4,179106,2,179114},
+       {0x220f,500,49,179126,47,179224},
+       {0x2210,500,49,179506,47,179604},
+       {0x2211,457,22,179886,20,179930},
+       {0x2212,342,4,180050,2,180058},
+       {0x2213,342,17,180070,10,180104},
+       {0x2214,342,34,180164,26,180232},
+       {0x2215,261,4,180388,2,180396},
+       {0x2216,213,4,180408,2,180416},
+       {0x2217,261,135,180428,133,180698},
+       {0x2218,175,43,181496,40,181582},
+       {0x2219,175,21,181822,18,181864},
+       {0x221a,463,19,181972,18,182010},
+       {0x221b,463,93,182118,93,182304},
+       {0x221c,463,35,182862,30,182932},
+       {0x221d,342,65,183112,65,183242},
+       {0x221e,463,85,183632,85,183802},
+       {0x221f,342,6,184312,4,184324},
+       {0x2220,342,6,184348,4,184360},
+       {0x2221,342,33,184384,42,184450},
+       {0x2222,342,48,184702,52,184798},
+       {0x2223,132,4,185110,2,185118},
+       {0x2224,202,12,185130,8,185154},
+       {0x2225,261,9,185202,4,185220},
+       {0x2226,304,20,185244,14,185284},
+       {0x2227,310,7,185368,5,185382},
+       {0x2228,310,7,185412,5,185426},
+       {0x2229,310,26,185456,25,185508},
+       {0x222a,310,26,185658,24,185710},
+       {0x222b,229,67,185854,70,185988},
+       {0x222c,350,137,186408,140,186682},
+       {0x222d,471,205,187522,210,187932},
+       {0x222e,249,117,189192,126,189426},
+       {0x222f,370,209,190182,232,190600},
+       {0x2260,342,20,191992,18,192032},
+       {0x2261,342,14,192140,6,192168},
+       {0x2262,342,28,192204,26,192260},
+       {0x2263,342,19,192416,8,192454},
+       {0x2264,342,12,192502,7,192526},
+       {0x2265,342,12,192568,7,192592},
+       {0x2266,342,17,192634,9,192668},
+       {0x2267,342,17,192722,9,192756},
+       {0x2268,342,28,192810,23,192866},
+       {0x2269,342,28,193004,23,193060},
+       {0x226a,466,15,193198,10,193228},
+       {0x226b,466,15,193288,10,193318},
+       {0x226c,233,80,193378,84,193538},
+       {0x226d,342,55,194042,60,194152},
+       {0x226e,342,20,194512,19,194552},
+       {0x226f,342,20,194666,19,194706},
+       {0x27c2,346,8,194820,6,194836},
 };
-short mgl_buf_fnt[243136] = {
-88,88,94,88,117,278,117,282,118,286,118,297,117,311,113,322,108,331,101,336,92,338,81,336,74,331,69,323,66,312,65,300,65,289,66,284,66,278,16383,16383,118,21,116,30,113,37,107,43,100,47,92,49,83,47,76,43,70,37,66,30,65,22,66,13,70,6,75,0,82,-2,91,-3,100,-2,107,0,113,6,116,13,118,21,150,215,154,243,158,268,162,289,165,306,166,318,165,324,162,330,157,334,151,337,145,338,138,337,132,334,127,330,124,324,123,316,124,307,126,291,129,270,134,244,139,215,16383,16383,65,215,70,243,75,268,78,289,80,306,81,318,80,324,77,330,73,334,67,337,60,338,53,337,47,334,42,330,40,324,39,316,39,307,42,291,45,270,
+short mgl_buf_fnt[194872] = {
+88,88,94,88,117,278,117,282,118,286,118,297,117,311,113,322,108,331,101,336,92,338,81,336,74,331,69,323,66,312,65,300,65,289,66,284,66,278,16383,16383,118,21,116,30,113,37,107,43,100,47,92,49,83,47,76,43,70,37,66,30,65,22,66,13,70,6,75,0,82,-2,91,-3,100,-2,107,0,113,6,116,13,118,21,
 107,43,107,0,113,37,113,37,107,0,113,6,113,37,113,6,116,30,116,30,113,6,116,13,116,30,116,13,118,21,65,22,66,13,66,30,66,30,66,13,70,6,66,30,70,6,70,37,70,37,70,6,75,0,70,37,75,0,76,43,76,43,75,0,82,-2,76,43,82,-2,83,47,83,47,82,-2,91,-3,83,47,91,-3,92,49,92,49,91,-3,100,-2,92,49,100,-2,100,47,100,47,100,-2,107,0,100,47,107,0,107,43,118,297,117,311,117,278,118,297,117,278,117,282,118,297,117,282,118,286,118,297,118,286,118,290,118,297,118,290,118,294,117,278,117,311,113,322,117,278,113,322,108,331,117,278,108,331,101,336,117,278,101,336,94,88,92,338,81,336,88,88,92,338,88,88,94,88,92,338,94,88,101,336,66,284,66,278,69,323,69,323,66,278,88,88,69,323,88,88,74,331,74,331,88,88,81,336,66,312,65,300,65,297,66,312,65,297,65,293,66,312,65,293,65,289,66,312,65,289,66,284,66,312,66,284,69,323,
-150,215,154,243,158,268,162,289,165,306,166,318,165,324,162,330,157,334,151,337,145,338,138,337,132,334,127,330,124,324,123,316,124,307,126,291,129,270,134,244,139,215,16383,16383,65,215,70,243,75,268,78,289,80,306,81,318,80,324,77,330,73,334,67,337,60,338,53,337,47,334,42,330,40,324,39,316,39,307,42,291,45,270,50,244,55,215,248,203,248,230,200,230,214,331,185,331,171,230,104,230,119,331,90,331,75,230,17,230,17,203,71,203,60,136,3,136,3,108,56,108,40,0,69,0,85,108,152,108,137,0,166,0,181,108,235,108,235,136,185,136,195,203,16383,16383,166,203,156,136,89,136,100,203,132,319,154,314,172,304,186,291,197,273,205,250,213,250,213,305,202,314,189,321,
+150,215,154,243,158,268,162,289,165,306,166,318,165,324,162,330,157,334,151,337,145,338,138,337,132,334,127,330,124,324,123,316,124,307,126,291,129,270,134,244,139,215,16383,16383,65,215,70,243,75,268,78,289,80,306,81,318,80,324,77,330,73,334,67,337,60,338,53,337,47,334,42,330,40,324,39,316,39,307,42,291,45,270,50,244,55,215,
 123,316,124,307,124,324,124,324,124,307,126,291,124,324,126,291,127,330,127,330,126,291,129,270,127,330,129,270,132,334,132,334,129,270,134,244,132,334,134,244,138,337,138,337,134,244,139,215,138,337,139,215,145,338,145,338,139,215,150,215,145,338,150,215,151,337,151,337,150,215,154,243,151,337,154,243,157,334,157,334,154,243,158,268,157,334,158,268,162,330,162,330,158,268,162,289,162,330,162,289,165,324,165,324,162,289,165,306,165,324,165,306,166,318,39,316,39,307,40,324,40,324,39,307,42,291,40,324,42,291,42,330,42,330,42,291,45,270,42,330,45,270,47,334,47,334,45,270,50,244,47,334,50,244,53,337,53,337,50,244,55,215,53,337,55,215,60,338,60,338,55,215,65,215,60,338,65,215,67,337,67,337,65,215,70,243,67,337,70,243,73,334,73,334,70,243,75,268,73,334,75,268,77,330,77,330,75,268,78,289,77,330,78,289,80,324,80,324,78,289,80,306,80,324,80,306,81,318,
-248,203,248,230,200,230,214,331,185,331,171,230,104,230,119,331,90,331,75,230,17,230,17,203,71,203,60,136,3,136,3,108,56,108,40,0,69,0,85,108,152,108,137,0,166,0,181,108,235,108,235,136,185,136,195,203,16383,16383,166,203,156,136,89,136,100,203,132,319,154,314,172,304,186,291,197,273,205,250,213,250,213,305,202,314,189,321,173,326,155,330,132,332,132,363,115,363,115,332,88,328,64,319,44,304,31,283,26,257,29,234,38,214,54,196,79,177,115,155,115,14,90,17,69,27,52,42,38,63,30,90,22,90,
+248,203,248,230,200,230,214,331,185,331,171,230,104,230,119,331,90,331,75,230,17,230,17,203,71,203,60,136,3,136,3,108,56,108,40,0,69,0,85,108,152,108,137,0,166,0,181,108,235,108,235,136,185,136,195,203,16383,16383,166,203,156,136,89,136,100,203,
 90,331,75,230,85,108,85,108,75,230,71,203,85,108,71,203,69,0,69,0,71,203,60,136,69,0,60,136,56,108,56,108,60,136,3,136,56,108,3,136,3,108,17,230,17,203,71,203,17,230,71,203,75,230,90,331,85,108,89,136,90,331,89,136,100,203,90,331,100,203,104,230,90,331,104,230,119,331,185,331,171,230,181,108,181,108,171,230,166,203,181,108,166,203,166,0,166,0,166,203,156,136,166,0,156,136,152,108,152,108,156,136,89,136,152,108,89,136,85,108,104,230,100,203,166,203,104,230,166,203,171,230,200,230,214,331,195,203,195,203,214,331,185,331,195,203,185,331,185,136,185,136,185,331,181,108,185,136,181,108,235,108,200,230,195,203,248,203,200,230,248,203,248,230,185,136,235,108,235,136,166,0,152,108,137,0,69,0,56,108,40,0,
-132,319,154,314,172,304,186,291,197,273,205,250,213,250,213,305,202,314,189,321,173,326,155,330,132,332,132,363,115,363,115,332,88,328,64,319,44,304,31,283,26,257,29,234,38,214,54,196,79,177,115,155,115,14,90,17,69,27,52,42,38,63,30,90,22,90,22,26,38,16,54,9,71,4,91,1,115,0,115,-43,132,-43,132,0,164,6,191,17,211,32,224,54,229,85,228,96,227,105,225,115,222,123,219,130,210,141,199,152,185,164,163,178,132,195,16383,16383,115,204,93,219,79,232,69,243,64,254,63,266,65,281,71,293,81,304,96,313,115,319,16383,16383,132,147,156,132,172,118,182,105,188,90,189,74,187,55,181,40,170,28,154,20,132,14,343,107,341,127,335,143,325,155,312,163,295,165,267,159,241,143,220,120,206,91,200,60,203,38,212,18,225,4,242,-5,261,-8,286,-2,309,14,327,39,339,71,343,107,16383,16383,331,108,328,77,318,48,303,25,285,10,265,4,255,6,248,10,242,18,238,27,237,38,239,59,244,82,252,103,263,123,276,140,280,144,284,147,290,149,295,151,300,151,311,149,319,143,326,134,330,122,331,108,16383,16383,310,353,289,353,265,331,248,317,235,309,221,305,194,305,185,307,176,311,167,317,157,324,150,330,144,334,138,336,133,338,127,338,97,332,71,317,50,293,36,264,31,232,34,209,42,191,54,176,70,166,89,163,99,164,108,166,116,169,132,181,146,197,157,215,
+132,319,154,314,172,304,186,291,197,273,205,250,213,250,213,305,202,314,189,321,173,326,155,330,132,332,132,363,115,363,115,332,88,328,64,319,44,304,31,283,26,257,29,234,38,214,54,196,79,177,115,155,115,14,90,17,69,27,52,42,38,63,30,90,22,90,22,26,38,16,54,9,71,4,91,1,115,0,115,-43,132,-43,132,0,164,6,191,17,211,32,224,54,229,85,228,96,227,105,225,115,222,123,219,130,210,141,199,152,185,164,163,178,132,195,16383,16383,115,204,93,219,79,232,69,243,64,254,63,266,65,281,71,293,81,304,96,313,115,319,16383,16383,132,147,156,132,172,118,182,105,188,90,189,74,187,55,181,40,170,28,154,20,132,14,
 132,319,154,314,155,330,155,330,154,314,172,304,155,330,172,304,173,326,173,326,172,304,186,291,173,326,186,291,189,321,189,321,186,291,197,273,189,321,197,273,202,314,202,314,197,273,205,250,202,314,205,250,213,305,213,305,205,250,213,250,228,96,227,105,229,85,229,85,227,105,225,115,229,85,225,115,224,54,224,54,225,115,222,123,224,54,222,123,219,130,211,32,224,54,219,130,211,32,219,130,210,141,211,32,210,141,199,152,211,32,199,152,191,17,191,17,199,152,189,74,191,17,189,74,187,55,191,17,187,55,181,40,191,17,181,40,170,28,191,17,170,28,164,6,188,90,189,74,199,152,188,90,199,152,185,164,188,90,185,164,182,105,132,147,156,132,163,178,163,178,156,132,172,118,163,178,172,118,185,164,185,164,172,118,182,105,132,14,132,147,132,195,132,14,132,195,115,155,132,14,115,155,132,-43,132,332,132,363,115,155,132,332,115,155,132,195,132,332,132,195,132,319,132,332,132,319,155,330,115,0,115,155,115,14,115,0,115,14,91,1,91,1,115,14,90,17,91,1,90,17,71,4,71,4,90,17,69,27,71,4,69,27,54,9,54,9,69,27,52,42,54,9,52,42,38,63,38,16,54,9,38,63,38,16,38,63,30,90,38,16,30,90,22,90,38,16,22,90,22,26,132,363,115,363,115,319,115,319,115,363,115,332,115,319,115,155,132,363,71,293,81,304,88,328,88,328,81,304,96,313,88,328,96,313,115,332,115,332,96,313,115,319,64,319,44,304,54,196,64,319,54,196,63,266,64,319,63,266,65,281,64,319,65,281,71,293,64,319,71,293,88,328,63,266,54,196,64,254,64,254,54,196,79,177,64,254,79,177,69,243,69,243,79,177,79,232,26,257,29,234,31,283,31,283,29,234,38,214,31,283,38,214,44,304,44,304,38,214,54,196,79,232,79,177,93,219,93,219,79,177,115,155,93,219,115,155,115,204,115,204,115,155,115,319,164,6,170,28,154,20,164,6,154,20,132,14,164,6,132,14,132,0,132,-43,115,155,115,0,132,-43,115,0,115,-43,132,195,132,147,163,178,
-343,107,341,127,335,143,325,155,312,163,295,165,267,159,241,143,220,120,206,91,200,60,203,38,212,18,225,4,242,-5,261,-8,286,-2,309,14,327,39,339,71,343,107,16383,16383,331,108,328,77,318,48,303,25,285,10,265,4,255,6,248,10,242,18,238,27,237,38,239,59,244,82,252,103,263,123,276,140,280,144,284,147,290,149,295,151,300,151,311,149,319,143,326,134,330,122,331,108,16383,16383,310,353,289,353,265,331,248,317,235,309,221,305,194,305,185,307,176,311,167,317,157,324,150,330,144,334,138,336,133,338,127,338,97,332,71,317,50,293,36,264,31,232,34,209,42,191,54,176,70,166,89,163,99,164,108,166,116,169,132,181,146,197,157,215,165,234,171,255,172,276,172,289,171,294,171,299,179,296,187,294,194,292,201,292,209,291,223,292,236,295,247,301,258,309,269,320,72,-8,95,-8,16383,16383,161,285,157,251,148,222,133,198,115,182,94,176,85,178,77,183,71,190,67,200,66,211,67,228,70,245,75,262,82,278,90,293,95,302,101,309,107,314,115,319,126,325,135,316,140,312,144,310,148,307,153,305,157,301,159,297,160,292,161,285,368,55,359,45,350,38,342,33,332,30,321,29,304,31,288,36,274,46,259,58,246,75,260,96,273,115,284,134,296,152,309,173,316,184,323,192,332,198,342,201,355,203,355,213,248,213,248,203,261,201,270,197,276,193,279,187,280,179,278,165,273,150,264,133,251,113,234,89,218,107,205,126,192,146,180,167,168,192,199,207,221,222,235,238,243,256,246,276,242,298,233,315,218,328,199,335,177,338,153,335,132,325,116,309,105,288,101,263,101,250,103,237,106,223,111,207,118,189,99,177,72,158,50,138,34,116,24,92,21,69,25,42,36,20,53,5,77,-3,107,-6,130,-4,151,0,172,9,193,22,214,39,233,22,250,9,266,0,283,-4,300,-6,319,-3,336,3,352,14,365,30,375,50,16383,16383,219,278,217,261,211,246,200,233,183,220,161,208,152,225,146,239,143,253,141,266,141,281,142,294,148,306,156,315,167,320,180,322,193,320,204,314,212,304,217,292,219,278,16383,16383,202,52,185,40,170,31,155,25,142,21,129,20,109,23,92,31,79,45,70,64,67,87,69,106,75,124,86,140,103,155,126,171,142,141,156,115,170,92,202,52,50,215,56,244,
+343,107,341,127,335,143,325,155,312,163,295,165,267,159,241,143,220,120,206,91,200,60,203,38,212,18,225,4,242,-5,261,-8,286,-2,309,14,327,39,339,71,343,107,16383,16383,331,108,328,77,318,48,303,25,285,10,265,4,255,6,248,10,242,18,238,27,237,38,239,59,244,82,252,103,263,123,276,140,280,144,284,147,290,149,295,151,300,151,311,149,319,143,326,134,330,122,331,108,16383,16383,310,353,289,353,265,331,248,317,235,309,221,305,194,305,185,307,176,311,167,317,157,324,150,330,144,334,138,336,133,338,127,338,97,332,71,317,50,293,36,264,31,232,34,209,42,191,54,176,70,166,89,163,99,164,108,166,116,169,132,181,146,197,157,215,165,234,171,255,172,276,172,289,171,294,171,299,179,296,187,294,194,292,201,292,209,291,223,292,236,295,247,301,258,309,269,320,72,-8,95,-8,16383,16383,161,285,157,251,148,222,133,198,115,182,94,176,85,178,77,183,71,190,67,200,66,211,67,228,70,245,75,262,82,278,90,293,95,302,101,309,107,314,115,319,126,325,135,316,140,312,144,310,148,307,153,305,157,301,159,297,160,292,161,285,
 326,134,330,122,335,143,335,143,330,122,331,108,339,71,331,108,328,77,339,71,328,77,327,39,327,39,328,77,318,48,327,39,318,48,309,14,309,14,318,48,303,25,309,14,303,25,286,-2,286,-2,303,25,285,10,286,-2,285,10,265,4,265,4,255,6,261,-8,261,-8,255,6,248,10,261,-8,248,10,242,18,242,-5,261,-8,242,18,242,-5,242,18,238,27,242,-5,238,27,237,38,242,-5,237,38,225,4,244,82,252,103,267,159,267,159,252,103,263,123,267,159,263,123,276,140,276,140,280,144,295,165,295,165,280,144,284,147,295,165,284,147,290,149,241,143,220,120,225,4,241,143,225,4,237,38,241,143,237,38,239,59,241,143,239,59,244,82,241,143,244,82,267,159,200,60,203,38,206,91,206,91,203,38,212,18,206,91,212,18,220,120,220,120,212,18,225,4,326,134,325,155,319,143,319,143,325,155,312,163,319,143,312,163,311,149,311,149,312,163,300,151,295,151,300,151,295,165,295,151,295,165,290,149,295,165,267,159,276,140,312,163,295,165,300,151,339,71,343,107,341,127,339,71,341,127,335,143,339,71,335,143,331,108,265,4,261,-8,286,-2,67,228,70,245,71,317,71,317,70,245,75,262,71,317,75,262,97,332,97,332,75,262,82,278,97,332,82,278,90,293,90,293,95,302,97,332,97,332,95,302,101,309,97,332,101,309,127,338,127,338,101,309,107,314,127,338,107,314,115,319,77,183,89,163,85,178,85,178,89,163,94,176,115,182,94,176,99,164,115,182,99,164,108,166,71,190,67,200,70,166,71,190,70,166,89,163,71,190,89,163,77,183,67,200,66,211,70,166,70,166,66,211,54,176,54,176,66,211,71,317,71,317,66,211,67,228,148,307,153,305,150,330,148,307,150,330,144,310,144,310,150,330,144,334,144,310,144,334,140,312,140,312,144,334,138,336,140,312,138,336,135,316,135,316,138,336,133,338,135,316,133,338,131,320,131,320,133,338,127,338,131,320,127,338,126,325,247,301,248,317,236,295,236,295,248,317,235,309,236,295,235,309,223,292,223,292,235,309,221,305,223,292,221,305,209,291,209,291,221,305,205,305,194,305,185,307,187,294,194,305,187,294,194,292,194,305,194,292,201,292,194,305,201,292,205,305,176,311,171,299,179,296,176,311,179,296,185,307,185,307,179,296,187,294,167,317,157,324,157,301,167,317,157,301,159,297,167,317,159,297,160,292,167,317,160,292,161,285,167,317,161,285,165,234,167,317,165,234,171,255,167,317,171,255,171,299,167,317,171,299,176,311,124,175,132,181,133,198,133,198,132,181,146,197,133,198,146,197,148,222,148,222,146,197,157,215,148,222,157,215,157,251,157,251,157,215,165,234,157,251,165,234,161,285,310,353,289,353,269,320,269,320,289,353,265,331,269,320,265,331,258,309,258,309,265,331,248,317,258,309,248,317,247,301,269,320,72,-8,95,-8,269,320,95,-8,310,353,172,276,172,281,172,285,172,276,172,285,172,289,172,276,172,289,171,294,172,276,171,294,171,299,172,276,171,299,171,255,116,169,124,175,133,198,116,169,133,198,115,182,116,169,115,182,108,166,157,324,150,330,153,305,157,324,153,305,157,301,31,232,34,209,36,264,36,264,34,209,42,191,36,264,42,191,50,293,50,293,42,191,54,176,50,293,54,176,71,317,94,176,89,163,99,164,127,338,115,319,126,325,209,291,205,305,201,292,325,155,326,134,335,143,
-368,55,359,45,350,38,342,33,332,30,321,29,304,31,288,36,274,46,259,58,246,75,260,96,273,115,284,134,296,152,309,173,316,184,323,192,332,198,342,201,355,203,355,213,248,213,248,203,261,201,270,197,276,193,279,187,280,179,278,165,273,150,264,133,251,113,234,89,218,107,205,126,192,146,180,167,168,192,199,207,221,222,235,238,243,256,246,276,242,298,233,315,218,328,199,335,177,338,153,335,132,325,116,309,105,288,101,263,101,250,103,237,106,223,111,207,118,189,99,177,72,158,50,138,34,116,24,92,21,69,25,42,36,20,53,5,77,-3,107,-6,130,-4,151,0,172,9,193,22,214,39,233,22,250,9,266,0,283,-4,300,-6,319,-3,336,3,352,14,365,30,375,50,16383,16383,219,278,217,261,211,246,200,233,183,220,161,208,152,225,146,239,143,253,141,266,141,281,142,294,148,306,156,315,167,320,180,322,193,320,204,314,212,304,217,292,219,278,16383,16383,202,52,185,40,170,31,155,25,142,21,129,20,109,23,92,31,79,45,70,64,67,87,69,106,75,124,86,140,103,155,126,171,142,141,156,115,170,92,202,52,50,215,56,244,60,269,64,290,66,306,66,324,63,330,59,334,53,337,46,338,39,337,33,334,28,330,25,324,24,317,25,306,27,289,31,268,35,243,40,215,152,-79,116,-44,92,-8,77,31,69,76,67,127,69,180,77,223,92,261,116,295,152,330,147,338,104,307,69,270,44,227,29,179,24,126,29,75,44,27,69,-17,103,-56,146,-88,15,330,51,295,76,259,90,219,97,174,99,122,97,69,90,26,75,-11,51,-45,15,-79,19,-88,62,-56,97,-19,122,23,137,71,142,123,137,174,121,222,96,267,63,306,21,338,134,235,147,243,158,248,178,254,190,256,200,258,207,261,212,265,215,270,216,277,215,284,213,289,209,293,204,295,198,296,190,294,183,288,174,281,166,272,159,264,154,259,144,251,130,243,130,262,131,270,133,278,135,287,140,302,142,307,143,312,144,316,144,320,143,326,140,331,136,335,131,337,126,338,120,337,115,335,111,331,109,326,108,321,108,317,110,307,111,301,113,295,115,285,118,276,121,249,121,243,110,249,101,255,93,262,85,270,76,280,70,286,65,290,60,293,56,295,51,296,46,295,41,292,38,288,36,283,
+368,55,359,45,350,38,342,33,332,30,321,29,304,31,288,36,274,46,259,58,246,75,260,96,273,115,284,134,296,152,309,173,316,184,323,192,332,198,342,201,355,203,355,213,248,213,248,203,261,201,270,197,276,193,279,187,280,179,278,165,273,150,264,133,251,113,234,89,218,107,205,126,192,146,180,167,168,192,199,207,221,222,235,238,243,256,246,276,242,298,233,315,218,328,199,335,177,338,153,335,132,325,116,309,105,288,101,263,101,250,103,237,106,223,111,207,118,189,99,177,72,158,50,138,34,116,24,92,21,69,25,42,36,20,53,5,77,-3,107,-6,130,-4,151,0,172,9,193,22,214,39,233,22,250,9,266,0,283,-4,300,-6,319,-3,336,3,352,14,365,30,375,50,16383,16383,219,278,217,261,211,246,200,233,183,220,161,208,152,225,146,239,143,253,141,266,141,281,142,294,148,306,156,315,167,320,180,322,193,320,204,314,212,304,217,292,219,278,16383,16383,202,52,185,40,170,31,155,25,142,21,129,20,109,23,92,31,79,45,70,64,67,87,69,106,75,124,86,140,103,155,126,171,142,141,156,115,170,92,202,52,
 153,335,132,325,142,294,142,294,132,325,141,281,142,141,141,281,132,325,142,141,132,325,126,171,118,189,103,155,126,171,118,189,126,171,132,325,118,189,132,325,116,309,118,189,116,309,111,207,99,177,72,158,75,124,99,177,75,124,86,140,99,177,86,140,103,155,99,177,103,155,118,189,72,158,50,138,53,5,72,158,53,5,67,87,72,158,67,87,69,106,72,158,69,106,75,124,79,45,70,64,77,-3,77,-3,70,64,67,87,53,5,50,138,36,20,36,20,50,138,34,116,36,20,34,116,25,42,25,42,34,116,24,92,25,42,24,92,21,69,101,250,103,237,105,288,105,288,103,237,106,223,105,288,106,223,116,309,116,309,106,223,111,207,185,40,170,31,172,9,172,9,170,31,155,25,172,9,155,25,151,0,151,0,155,25,142,21,151,0,142,21,130,-4,130,-4,142,21,129,20,109,23,92,31,107,-6,109,23,107,-6,130,-4,109,23,130,-4,129,20,79,45,77,-3,107,-6,79,45,107,-6,92,31,246,75,251,113,234,89,246,75,234,89,250,9,250,9,234,89,233,22,233,22,234,89,218,107,233,22,218,107,214,39,214,39,218,107,205,126,214,39,205,126,202,52,202,52,205,126,192,146,202,52,192,146,186,72,186,72,192,146,180,167,186,72,180,167,170,92,170,92,180,167,168,192,170,92,168,192,161,208,156,115,170,92,161,208,156,115,161,208,152,225,156,115,152,225,146,239,156,115,146,239,143,253,156,115,143,253,142,141,141,266,141,281,142,141,141,266,142,141,143,253,142,294,148,306,153,335,153,335,148,306,156,315,153,335,156,315,177,338,177,338,156,315,167,320,177,338,167,320,180,322,180,322,193,320,199,335,199,335,193,320,204,314,199,335,204,314,218,328,218,328,204,314,212,304,218,328,212,304,217,292,217,261,221,222,219,278,219,278,221,222,233,315,233,315,221,222,235,238,233,315,235,238,242,298,242,298,235,238,243,256,242,298,243,256,246,276,218,328,217,292,219,278,218,328,219,278,233,315,199,335,177,338,180,322,183,220,168,192,199,207,183,220,199,207,200,233,200,233,199,207,221,222,200,233,221,222,211,246,211,246,221,222,217,261,183,220,161,208,168,192,193,22,214,39,202,52,193,22,202,52,185,40,193,22,185,40,172,9,246,75,250,9,259,58,259,58,250,9,266,0,259,58,266,0,274,46,274,46,266,0,283,-4,274,46,283,-4,288,36,288,36,283,-4,300,-6,288,36,300,-6,304,31,304,31,300,-6,319,-3,304,31,319,-3,321,29,321,29,319,-3,336,3,321,29,336,3,332,30,270,197,276,193,355,213,355,213,276,193,279,187,355,213,279,187,280,179,280,179,284,134,296,152,280,179,296,152,309,173,309,173,316,184,280,179,280,179,316,184,323,192,280,179,323,192,332,198,342,201,355,203,355,213,342,201,355,213,332,198,332,198,355,213,280,179,261,201,270,197,355,213,261,201,355,213,248,213,261,201,248,213,248,203,280,179,278,165,284,134,284,134,278,165,273,150,284,134,273,150,273,115,273,115,273,150,264,133,273,115,264,133,260,96,260,96,264,133,251,113,260,96,251,113,246,75,375,50,368,55,365,30,365,30,368,55,359,45,365,30,359,45,352,14,352,14,359,45,350,38,352,14,350,38,342,33,342,33,332,30,336,3,342,33,336,3,352,14,77,-3,67,87,53,5,101,250,105,288,101,263,
-50,215,56,244,60,269,64,290,66,306,66,324,63,330,59,334,53,337,46,338,39,337,33,334,28,330,25,324,24,317,25,306,27,289,31,268,35,243,40,215,152,-79,116,-44,92,-8,77,31,69,76,67,127,69,180,77,223,92,261,116,295,152,330,147,338,104,307,69,270,44,227,29,179,24,126,29,75,44,27,69,-17,
+50,215,56,244,60,269,64,290,66,306,66,324,63,330,59,334,53,337,46,338,39,337,33,334,28,330,25,324,24,317,25,306,27,289,31,268,35,243,40,215,
 24,317,25,306,25,324,25,324,25,306,27,289,25,324,27,289,28,330,28,330,27,289,31,268,28,330,31,268,33,334,33,334,31,268,35,243,33,334,35,243,39,337,39,337,35,243,40,215,39,337,40,215,46,338,46,338,40,215,50,215,46,338,50,215,53,337,53,337,50,215,56,244,53,337,56,244,59,334,59,334,56,244,60,269,59,334,60,269,63,330,63,330,60,269,64,290,63,330,64,290,66,324,66,324,64,290,66,306,66,324,66,306,66,318,
-152,-79,116,-44,92,-8,77,31,69,76,67,127,69,180,77,223,92,261,116,295,152,330,147,338,104,307,69,270,44,227,29,179,24,126,29,75,44,27,69,-17,103,-56,146,-88,15,330,51,295,76,259,90,219,97,174,99,122,97,69,90,26,75,-11,51,-45,15,-79,19,-88,62,-56,97,-19,122,23,137,71,142,123,137,174,121,222,96,267,63,306,21,338,
+152,-79,116,-44,92,-8,77,31,69,76,67,127,69,180,77,223,92,261,116,295,152,330,147,338,104,307,69,270,44,227,29,179,24,126,29,75,44,27,69,-17,103,-56,146,-88,
 24,126,29,75,29,179,29,179,29,75,44,27,29,179,44,27,44,227,44,227,44,27,69,-17,44,227,69,-17,67,127,67,127,69,270,44,227,116,295,152,330,147,338,116,295,147,338,104,307,116,295,104,307,92,261,67,127,69,180,69,270,69,270,69,180,77,223,69,270,77,223,104,307,104,307,77,223,92,261,116,-44,92,-8,103,-56,116,-44,103,-56,146,-88,116,-44,146,-88,152,-79,77,31,69,76,69,-17,77,31,69,-17,103,-56,77,31,103,-56,92,-8,67,127,69,-17,69,76,
-15,330,51,295,76,259,90,219,97,174,99,122,97,69,90,26,75,-11,51,-45,15,-79,19,-88,62,-56,97,-19,122,23,137,71,142,123,137,174,121,222,96,267,63,306,21,338,134,235,147,243,158,248,178,254,190,256,200,258,207,261,212,265,215,270,216,277,215,284,213,289,209,293,204,295,198,296,190,294,183,288,174,281,166,272,159,264,154,259,144,251,
+15,330,51,295,76,259,90,219,97,174,99,122,97,69,90,26,75,-11,51,-45,15,-79,19,-88,62,-56,97,-19,122,23,137,71,142,123,137,174,121,222,96,267,63,306,21,338,
 97,174,99,122,99,122,122,23,99,122,97,69,122,23,97,69,97,-19,97,-19,97,69,90,26,97,-19,90,26,75,-11,97,174,99,122,121,222,121,222,99,122,122,23,121,222,122,23,137,174,137,174,122,23,137,71,137,174,137,71,142,123,96,267,63,306,76,259,96,267,76,259,90,219,96,267,90,219,97,174,96,267,97,174,121,222,51,295,76,259,63,306,51,295,63,306,21,338,51,295,21,338,15,330,15,-79,19,-88,51,-45,51,-45,19,-88,62,-56,51,-45,62,-56,75,-11,75,-11,62,-56,97,-19,
-134,235,147,243,158,248,178,254,190,256,200,258,207,261,212,265,215,270,216,277,215,284,213,289,209,293,204,295,198,296,190,294,183,288,174,281,166,272,159,264,154,259,144,251,130,243,130,262,131,270,133,278,135,287,140,302,142,307,143,312,144,316,144,320,143,326,140,331,136,335,131,337,126,338,120,337,115,335,111,331,109,326,108,321,108,317,110,307,111,301,113,295,115,285,118,276,121,249,121,243,110,249,101,255,93,262,85,270,76,280,70,286,65,290,60,293,56,295,51,296,46,295,41,292,38,288,36,283,35,277,36,270,40,265,46,261,56,257,69,254,78,252,87,249,97,246,106,242,117,235,106,229,97,224,88,221,78,218,65,215,53,213,45,210,39,205,35,200,34,193,35,187,37,182,41,178,46,176,52,175,57,176,61,177,65,179,74,188,81,196,92,207,94,210,97,212,105,218,112,222,121,228,121,224,120,212,119,201,118,192,115,183,113,174,111,169,109,163,108,159,107,154,107,151,108,145,110,140,114,136,119,133,124,132,130,133,136,136,140,141,143,146,145,152,144,154,144,157,143,161,141,164,140,169,136,179,130,212,130,228,134,225,140,221,147,217,153,212,161,205,169,196,175,188,182,182,187,178,193,175,199,175,205,176,210,178,216,188,217,194,215,201,212,206,206,210,198,213,186,215,176,218,165,220,147,228,138,233,318,110,318,143,188,143,188,273,155,273,155,143,24,143,24,110,155,110,155,-20,188,-20,188,110,41,-69,60,-58,76,-44,88,-27,95,-10,98,7,96,22,90,34,81,43,70,49,57,51,47,49,39,46,33,40,29,32,27,22,29,13,32,6,38,1,46,-1,56,-2,60,-2,63,-1,66,-1,68,0,73,0,75,-1,78,-4,78,-6,76,-16,71,-27,63,-38,51,-49,36,-60,142,97,142,128,20,128,20,97,90,22,89,30,85,38,79,44,71,49,63,50,54,49,46,45,40,39,37,31,35,22,37,13,40,6,46,0,54,-3,63,-5,71,-3,79,0,85,6,89,13,90,22,143,338,110,338,-3,-6,30,-6,238,165,232,222,218,270,194,307,164,330,127,338,84,329,52,304,29,266,16,220,12,168,16,118,27,71,48,31,80,3,125,-6,168,2,200,29,222,67,234,114,238,165,16383,16383,190,162,187,108,179,65,166,33,148,13,125,6,102,13,84,33,71,65,63,109,60,165,63,220,71,265,84,298,101,318,124,325,148,318,166,298,179,265,187,219,190,162,197,0,197,7,178,8,164,12,155,18,151,27,150,38,150,336,145,338,55,292,55,286,69,291,74,293,84,295,88,296,92,296,97,295,101,293,104,288,106,281,107,272,107,47,105,33,100,22,92,14,78,10,59,7,59,0,237,69,230,71,221,57,212,48,203,42,193,39,182,38,65,38,
+134,235,147,243,158,248,178,254,190,256,200,258,207,261,212,265,215,270,216,277,215,284,213,289,209,293,204,295,198,296,190,294,183,288,174,281,166,272,159,264,154,259,144,251,130,243,130,262,131,270,133,278,135,287,140,302,142,307,143,312,144,316,144,320,143,326,140,331,136,335,131,337,126,338,120,337,115,335,111,331,109,326,108,321,108,317,110,307,111,301,113,295,115,285,118,276,121,249,121,243,110,249,101,255,93,262,85,270,76,280,70,286,65,290,60,293,56,295,51,296,46,295,41,292,38,288,36,283,35,277,36,270,40,265,46,261,56,257,69,254,78,252,87,249,97,246,106,242,117,235,106,229,97,224,88,221,78,218,65,215,53,213,45,210,39,205,35,200,34,193,35,187,37,182,41,178,46,176,52,175,57,176,61,177,65,179,74,188,81,196,92,207,94,210,97,212,105,218,112,222,121,228,121,224,120,212,119,201,118,192,115,183,113,174,111,169,109,163,108,159,107,154,107,151,108,145,110,140,114,136,119,133,124,132,130,133,136,136,140,141,143,146,145,152,144,154,144,157,143,161,141,164,140,169,136,179,130,212,130,228,134,225,140,221,147,217,153,212,161,205,169,196,175,188,182,182,187,178,193,175,199,175,205,176,210,178,216,188,217,194,215,201,212,206,206,210,198,213,186,215,176,218,165,220,147,228,138,233,
 69,254,69,254,78,252,69,254,78,252,70,286,69,254,70,286,65,290,69,254,65,290,60,293,69,254,60,293,56,295,69,254,56,295,56,257,51,296,46,295,46,261,51,296,46,261,56,257,51,296,56,257,56,295,36,283,36,270,38,288,38,288,36,270,40,265,38,288,40,265,41,292,41,292,40,265,46,261,41,292,46,261,46,295,81,196,86,201,88,221,88,221,86,201,89,204,88,221,89,204,97,224,97,224,89,204,92,207,97,224,92,207,94,210,94,210,97,212,97,224,97,224,97,212,106,229,78,218,65,215,69,183,78,218,69,183,74,188,78,218,74,188,81,196,78,218,81,196,88,221,110,140,114,136,111,169,111,169,114,136,113,174,115,183,113,174,114,136,115,183,114,136,119,133,144,157,143,161,143,146,144,157,143,146,145,152,144,157,145,152,144,154,141,164,140,169,140,141,141,164,140,141,143,146,141,164,143,146,143,161,136,179,134,190,136,136,136,179,136,136,140,141,136,179,140,141,140,169,134,190,132,201,136,136,136,136,132,201,130,212,136,136,130,212,130,133,130,133,130,212,130,224,126,338,120,337,120,258,126,338,120,258,121,249,126,338,121,249,121,228,126,338,121,228,124,132,126,338,124,132,130,133,126,338,130,133,130,224,126,338,130,224,130,243,126,338,130,243,130,255,126,338,130,255,131,337,121,243,121,228,121,249,120,337,115,335,115,285,120,337,115,285,118,276,120,337,118,276,119,267,120,337,119,267,120,258,113,295,115,285,115,335,113,295,115,335,111,331,113,295,111,331,111,301,204,295,198,296,200,258,200,258,198,296,190,294,200,258,190,294,190,256,190,256,190,294,183,288,190,256,183,288,178,254,178,254,183,288,174,281,178,254,174,281,168,251,168,251,174,281,166,272,168,251,166,272,159,264,159,264,154,259,158,248,158,248,154,259,149,255,158,248,149,255,147,243,147,243,149,255,144,251,147,243,144,251,137,247,130,243,130,228,134,225,130,243,134,225,134,235,130,243,134,235,137,247,137,247,134,235,147,243,176,218,165,220,169,196,176,218,169,196,175,188,176,218,175,188,182,182,176,218,182,182,186,215,199,175,205,176,206,210,206,210,205,176,210,178,206,210,210,178,212,206,212,206,210,178,213,183,212,206,213,183,215,201,215,201,213,183,216,188,215,201,216,188,217,194,198,213,186,215,187,178,198,213,187,178,193,175,198,213,193,175,199,175,198,213,199,175,206,210,216,277,215,284,215,270,215,270,215,284,213,289,215,270,213,289,212,265,212,265,213,289,209,293,212,265,209,293,207,261,207,261,209,293,204,295,207,261,204,295,200,258,159,264,158,248,168,251,161,205,169,196,165,220,161,205,165,220,156,224,161,205,156,224,153,212,147,228,138,233,140,221,147,228,140,221,147,217,147,228,147,217,153,212,147,228,153,212,156,224,143,326,140,331,142,307,143,326,142,307,143,312,143,326,143,312,144,316,143,326,144,316,144,320,133,278,135,287,136,335,136,335,135,287,138,296,136,335,138,296,140,331,140,331,138,296,140,302,140,331,140,302,142,307,131,337,130,255,130,262,131,337,130,262,131,270,131,337,131,270,133,278,131,337,133,278,136,335,134,235,134,225,140,221,134,235,140,221,138,233,124,132,121,228,121,224,124,132,121,224,120,212,124,132,120,212,119,201,124,132,119,201,119,133,118,192,115,183,119,133,118,192,119,133,119,201,101,215,105,218,106,229,106,229,105,218,112,222,106,229,112,222,117,235,117,235,112,222,121,228,117,235,121,228,121,243,76,280,78,252,85,270,85,270,78,252,87,249,85,270,87,249,93,262,93,262,87,249,97,246,93,262,97,246,101,255,101,255,97,246,106,242,101,255,106,242,110,249,110,249,106,242,117,235,110,249,117,235,121,243,108,317,109,312,109,326,109,326,109,312,110,307,109,326,110,307,111,331,111,331,110,307,111,301,111,169,109,163,110,140,110,140,109,163,108,159,110,140,108,159,108,145,108,145,108,159,107,154,108,145,107,154,107,151,65,215,53,213,57,176,65,215,57,176,61,177,65,215,61,177,65,179,65,215,65,179,69,183,34,193,35,187,35,200,35,200,35,187,37,182,35,200,37,182,39,205,39,205,37,182,41,178,39,205,41,178,45,210,45,210,41,178,46,176,45,210,46,176,53,213,53,213,46,176,52,175,53,213,52,175,57,176,70,286,78,252,76,280,106,229,97,212,101,215,108,317,109,326,108,321,187,178,186,215,182,182,36,270,36,283,35,277,
-318,110,318,143,188,143,188,273,155,273,155,143,24,143,24,110,155,110,155,-20,188,-20,188,110,41,-69,60,-58,76,-44,88,-27,95,-10,98,7,96,22,90,34,81,43,70,49,57,51,47,49,
+318,110,318,143,188,143,188,273,155,273,155,143,24,143,24,110,155,110,155,-20,188,-20,188,110,
 188,273,155,273,188,-20,188,-20,155,273,155,143,188,-20,155,143,155,110,155,110,155,143,24,143,155,110,24,143,24,110,188,110,318,110,188,143,188,143,318,110,318,143,188,-20,155,110,155,-20,
-41,-69,60,-58,76,-44,88,-27,95,-10,98,7,96,22,90,34,81,43,70,49,57,51,47,49,39,46,33,40,29,32,27,22,29,13,32,6,38,1,46,-1,56,-2,60,-2,63,-1,66,-1,68,0,73,0,75,-1,78,-4,78,-6,76,-16,71,-27,63,-38,51,-49,36,-60,142,97,142,128,20,128,20,97,90,22,89,30,85,38,79,44,71,49,63,50,54,49,46,45,40,39,37,31,35,22,37,13,40,6,46,0,54,-3,63,-5,71,-3,79,0,85,6,89,13,90,22,143,338,110,338,-3,-6,30,-6,238,165,232,222,218,270,194,307,164,330,
+41,-69,60,-58,76,-44,88,-27,95,-10,98,7,96,22,90,34,81,43,70,49,57,51,47,49,39,46,33,40,29,32,27,22,29,13,32,6,38,1,46,-1,56,-2,60,-2,63,-1,66,-1,68,0,73,0,75,-1,78,-4,78,-6,76,-16,71,-27,63,-38,51,-49,36,-60,
 63,-1,66,-1,70,49,70,49,66,-1,68,0,70,49,68,0,71,0,71,0,73,0,81,43,81,43,73,0,75,-1,81,43,75,-1,77,-3,27,22,29,13,29,32,29,32,29,13,32,6,29,32,32,6,33,40,33,40,32,6,38,1,33,40,38,1,39,46,39,46,38,1,46,-1,39,46,46,-1,47,49,47,49,46,-1,56,-2,47,49,56,-2,57,51,57,51,56,-2,60,-2,57,51,60,-2,70,49,70,49,60,-2,63,-1,98,7,96,22,95,-10,95,-10,96,22,90,34,95,-10,90,34,88,-27,88,-27,90,34,81,43,88,-27,81,43,78,-6,78,-6,76,-16,88,-27,88,-27,76,-16,76,-44,81,43,77,-3,78,-4,81,43,78,-4,78,-6,81,43,70,49,71,0,36,-60,41,-69,51,-49,51,-49,41,-69,60,-58,51,-49,60,-58,63,-38,63,-38,60,-58,76,-44,63,-38,76,-44,71,-27,71,-27,76,-44,76,-16,
-142,97,142,128,20,128,20,97,90,22,89,30,85,38,79,44,
+142,97,142,128,20,128,20,97,
 142,97,142,128,20,128,142,97,20,128,20,97,
-90,22,89,30,85,38,79,44,71,49,63,50,54,49,46,45,40,39,37,31,35,22,37,13,40,6,46,0,54,-3,63,-5,71,-3,79,0,85,6,89,13,90,22,143,338,110,338,-3,-6,30,-6,238,165,232,222,218,270,194,307,164,330,127,338,84,329,52,304,29,266,16,220,12,168,16,118,27,71,48,31,80,3,125,-6,168,2,
+90,22,89,30,85,38,79,44,71,49,63,50,54,49,46,45,40,39,37,31,35,22,37,13,40,6,46,0,54,-3,63,-5,71,-3,79,0,85,6,89,13,90,22,
 35,22,37,13,37,31,37,31,37,13,40,6,37,31,40,6,40,39,40,39,40,6,46,0,40,39,46,0,46,45,46,45,46,0,54,-3,46,45,54,-3,54,49,54,49,54,-3,62,-5,54,49,62,-5,63,50,63,50,62,-5,71,-3,63,50,71,-3,71,49,71,49,71,-3,79,0,71,49,79,0,79,44,79,44,79,0,85,6,79,44,85,6,85,38,85,38,85,6,89,13,85,38,89,13,89,30,89,30,89,13,90,22,
-143,338,110,338,-3,-6,30,-6,238,165,232,222,218,270,194,307,
+143,338,110,338,-3,-6,30,-6,
 143,338,110,338,-3,-6,143,338,-3,-6,30,-6,
-238,165,232,222,218,270,194,307,164,330,127,338,84,329,52,304,29,266,16,220,12,168,16,118,27,71,48,31,80,3,125,-6,168,2,200,29,222,67,234,114,238,165,16383,16383,190,162,187,108,179,65,166,33,148,13,125,6,102,13,84,33,71,65,63,109,60,165,63,220,71,265,84,298,101,318,124,325,148,318,166,298,179,265,187,219,190,162,197,0,197,7,178,8,164,12,155,18,151,27,150,38,150,336,145,338,55,292,55,286,69,291,74,293,84,295,88,296,92,296,97,295,101,293,104,288,106,281,107,272,107,47,105,33,100,22,92,14,78,10,59,7,59,0,237,69,230,71,221,57,212,48,203,42,193,39,182,38,65,38,147,126,171,153,189,179,202,203,209,226,211,250,207,278,
+238,165,232,222,218,270,194,307,164,330,127,338,84,329,52,304,29,266,16,220,12,168,16,118,27,71,48,31,80,3,125,-6,168,2,200,29,222,67,234,114,238,165,16383,16383,190,162,187,108,179,65,166,33,148,13,125,6,102,13,84,33,71,65,63,109,60,165,63,220,71,265,84,298,101,318,124,325,148,318,166,298,179,265,187,219,190,162,
 101,318,124,325,124,325,127,338,124,325,148,318,127,338,148,318,164,330,164,330,148,318,166,298,164,330,166,298,194,307,194,307,166,298,179,265,194,307,179,265,187,219,166,33,168,2,179,65,179,65,168,2,200,29,179,65,200,29,187,108,187,108,200,29,190,162,194,307,190,162,200,29,194,307,200,29,218,270,218,270,200,29,222,67,218,270,222,67,232,222,232,222,222,67,234,114,232,222,234,114,238,165,125,6,125,-6,148,13,148,13,125,-6,168,2,148,13,168,2,166,33,71,265,84,298,84,329,84,329,84,298,101,318,84,329,101,318,127,338,127,338,101,318,124,325,12,168,16,118,16,220,16,220,16,118,27,71,16,220,27,71,29,266,29,266,27,71,48,31,29,266,48,31,52,304,52,304,48,31,63,109,52,304,63,109,60,165,60,165,63,220,52,304,52,304,63,220,71,265,52,304,71,265,84,329,102,13,84,33,80,3,102,13,80,3,125,-6,102,13,125,-6,125,6,80,3,84,33,71,65,80,3,71,65,63,109,80,3,63,109,48,31,194,307,187,219,190,162,
-197,0,197,7,178,8,164,12,155,18,151,27,150,38,150,336,145,338,55,292,55,286,69,291,74,293,84,295,88,296,92,296,97,295,101,293,104,288,106,281,107,272,107,47,105,33,100,22,92,14,78,10,59,7,59,0,237,69,230,71,221,57,212,48,203,42,193,39,182,38,65,38,147,126,171,153,189,179,202,203,209,226,211,250,207,278,195,302,176,321,150,334,119,338,86,333,59,320,39,299,24,271,15,238,26,236,38,262,50,280,63,292,
+197,0,197,7,178,8,164,12,155,18,151,27,150,38,150,336,145,338,55,292,55,286,69,291,74,293,84,295,88,296,92,296,97,295,101,293,104,288,106,281,107,272,107,47,105,33,100,22,92,14,78,10,59,7,59,0,
 100,22,92,14,197,0,197,0,92,14,78,10,197,0,78,10,59,7,79,294,84,295,145,338,145,338,84,295,88,296,145,338,88,296,92,296,92,296,97,295,145,338,145,338,97,295,101,293,145,338,101,293,104,288,164,12,155,18,107,47,107,47,155,18,151,27,107,47,151,27,107,272,106,281,107,272,145,338,106,281,145,338,104,288,145,338,55,292,69,291,145,338,69,291,74,293,145,338,74,293,79,294,150,38,150,336,145,338,150,38,145,338,107,272,150,38,107,272,151,27,197,0,197,7,178,8,197,0,178,8,164,12,197,0,164,12,105,33,197,0,105,33,100,22,197,0,59,7,59,0,105,33,164,12,107,47,69,291,55,292,55,286,
-237,69,230,71,221,57,212,48,203,42,193,39,182,38,65,38,147,126,171,153,189,179,202,203,209,226,211,250,207,278,195,302,176,321,150,334,119,338,86,333,59,320,39,299,24,271,15,238,26,236,38,262,50,280,63,292,79,299,99,301,123,298,142,289,156,275,165,255,169,230,166,205,159,181,146,155,128,129,103,100,15,6,15,0,210,0,31,255,43,275,57,290,71,300,87,306,105,308,123,306,138,300,149,290,157,275,159,257,157,240,152,224,143,211,132,199,118,190,112,186,105,183,96,179,87,176,76,172,76,165,92,165,104,164,113,163,121,162,127,160,146,152,161,141,171,127,178,109,180,88,176,63,167,42,153,26,135,15,114,11,106,11,99,13,90,15,82,20,71,26,64,31,
+237,69,230,71,221,57,212,48,203,42,193,39,182,38,65,38,147,126,171,153,189,179,202,203,209,226,211,250,207,278,195,302,176,321,150,334,119,338,86,333,59,320,39,299,24,271,15,238,26,236,38,262,50,280,63,292,79,299,99,301,123,298,142,289,156,275,165,255,169,230,166,205,159,181,146,155,128,129,103,100,15,6,15,0,210,0,
 26,236,38,262,39,299,39,299,38,262,50,280,39,299,50,280,59,320,59,320,50,280,63,292,59,320,63,292,86,333,86,333,63,292,79,299,86,333,79,299,99,301,99,301,123,298,119,338,119,338,123,298,150,334,24,271,15,238,26,236,24,271,26,236,39,299,166,205,171,153,169,230,169,230,171,153,176,321,176,321,171,153,189,179,176,321,189,179,195,302,195,302,189,179,202,203,195,302,202,203,207,278,207,278,202,203,209,226,207,278,209,226,211,250,176,321,150,334,156,275,176,321,156,275,165,255,176,321,165,255,169,230,150,334,123,298,142,289,150,334,142,289,156,275,159,181,146,155,147,126,159,181,147,126,171,153,159,181,171,153,166,205,15,0,210,0,15,6,15,6,210,0,65,38,15,6,65,38,103,100,103,100,65,38,147,126,103,100,147,126,128,129,128,129,147,126,146,155,119,338,86,333,99,301,212,48,203,42,210,0,210,0,203,42,193,39,210,0,193,39,182,38,210,0,182,38,65,38,237,69,230,71,221,57,237,69,221,57,212,48,237,69,212,48,210,0,
-31,255,43,275,57,290,71,300,87,306,105,308,123,306,138,300,149,290,157,275,159,257,157,240,152,224,143,211,132,199,118,190,112,186,105,183,96,179,87,176,76,172,76,165,92,165,104,164,113,163,121,162,127,160,146,152,161,141,171,127,178,109,180,88,176,63,167,42,153,26,135,15,114,11,106,11,99,13,90,15,82,20,71,26,64,31,57,35,51,38,41,40,34,39,29,36,25,32,22,27,21,22,23,12,30,4,41,-1,57,-5,76,-6,103,-4,130,0,154,9,175,22,193,40,200,52,207,65,211,79,214,94,215,109,214,125,212,139,207,152,201,164,194,174,187,180,181,185,173,190,164,195,152,200,170,213,183,226,192,241,197,255,199,270,195,292,184,311,168,326,146,335,121,338,92,334,68,323,48,306,33,284,22,257,237,84,237,116,185,116,185,338,163,338,6,116,6,84,146,84,146,0,185,0,185,84,16383,16383,146,116,26,116,146,287,219,340,214,344,210,339,206,335,202,333,197,331,87,331,32,213,32,208,34,206,38,206,65,204,89,199,110,191,129,182,145,171,156,159,166,146,172,131,177,114,178,96,174,71,164,48,149,29,131,16,110,12,104,12,98,14,90,17,83,21,75,27,66,34,58,39,51,41,45,43,38,43,30,42,24,40,19,36,17,31,16,24,19,13,27,5,40,-1,58,-5,79,-6,99,-5,117,-2,134,1,149,8,164,17,182,33,196,51,206,71,211,95,213,122,213,137,211,150,207,162,202,174,195,185,178,205,159,220,137,232,108,241,70,249,90,291,188,291,192,292,198,294,200,296,201,298,223,342,185,337,152,329,123,317,
+31,255,43,275,57,290,71,300,87,306,105,308,123,306,138,300,149,290,157,275,159,257,157,240,152,224,143,211,132,199,118,190,112,186,105,183,96,179,87,176,76,172,76,165,92,165,104,164,113,163,121,162,127,160,146,152,161,141,171,127,178,109,180,88,176,63,167,42,153,26,135,15,114,11,106,11,99,13,90,15,82,20,71,26,64,31,57,35,51,38,41,40,34,39,29,36,25,32,22,27,21,22,23,12,30,4,41,-1,57,-5,76,-6,103,-4,130,0,154,9,175,22,193,40,200,52,207,65,211,79,214,94,215,109,214,125,212,139,207,152,201,164,194,174,187,180,181,185,173,190,164,195,152,200,170,213,183,226,192,241,197,255,199,270,195,292,184,311,168,326,146,335,121,338,92,334,68,323,48,306,33,284,22,257,
 22,257,31,255,33,284,33,284,31,255,43,275,33,284,43,275,48,306,48,306,43,275,57,290,48,306,57,290,68,323,68,323,57,290,71,300,68,323,71,300,92,334,92,334,71,300,87,306,92,334,87,306,105,308,105,308,123,306,121,338,121,338,123,306,146,335,123,306,138,300,146,335,146,335,138,300,149,290,146,335,149,290,168,326,168,326,149,290,157,275,168,326,157,275,159,257,159,257,157,240,170,213,170,213,157,240,152,200,170,213,183,226,184,311,184,311,183,226,192,241,184,311,192,241,195,292,195,292,192,241,197,255,195,292,197,255,199,270,170,213,184,311,168,326,170,213,168,326,159,257,152,200,157,240,152,224,152,200,152,224,146,152,152,200,146,152,161,141,152,200,161,141,164,195,164,195,171,127,173,190,173,190,171,127,178,109,173,190,178,109,181,185,181,185,178,109,180,88,193,40,180,88,176,63,193,40,176,63,175,22,175,22,176,63,167,42,175,22,167,42,154,9,154,9,167,42,153,26,154,9,153,26,135,15,132,199,127,160,146,152,132,199,146,152,143,211,143,211,146,152,152,224,215,109,214,125,214,94,214,94,214,125,212,139,214,94,212,139,211,79,211,79,212,139,207,152,211,79,207,152,207,65,207,65,207,152,201,164,207,65,201,164,200,52,200,52,201,164,194,174,200,52,194,174,193,40,193,40,194,174,187,180,193,40,187,180,181,185,103,-4,130,0,106,11,106,11,130,0,114,11,135,15,114,11,130,0,135,15,130,0,154,9,87,176,76,172,92,165,87,176,92,165,96,179,96,179,92,165,104,164,96,179,104,164,105,183,105,183,104,164,113,163,105,183,113,163,112,186,112,186,113,163,118,190,132,199,118,190,121,162,132,199,121,162,127,160,121,338,92,334,105,308,118,190,113,163,121,162,103,-4,106,11,99,13,103,-4,99,13,90,15,103,-4,90,15,82,20,103,-4,82,20,76,-6,76,-6,82,20,71,26,76,-6,71,26,64,31,76,-6,64,31,57,35,76,-6,57,35,57,-5,57,35,51,38,57,-5,57,-5,51,38,46,39,57,-5,46,39,41,-1,41,-1,46,39,41,40,41,-1,41,40,34,39,30,4,41,-1,34,39,30,4,34,39,29,36,30,4,29,36,25,32,30,4,25,32,23,12,22,27,21,22,23,12,22,27,23,12,25,32,92,165,76,172,76,165,180,88,193,40,181,185,164,195,161,141,171,127,
-237,84,237,116,185,116,185,338,163,338,6,116,6,84,146,84,146,0,185,0,185,84,16383,16383,146,116,26,116,146,287,219,340,214,344,210,339,206,335,202,333,197,331,87,331,32,213,32,208,34,206,38,206,65,204,89,199,110,191,129,182,
+237,84,237,116,185,116,185,338,163,338,6,116,6,84,146,84,146,0,185,0,185,84,16383,16383,146,116,26,116,146,287,
 6,84,146,84,6,116,6,116,146,84,26,116,6,116,26,116,163,338,163,338,26,116,146,287,163,338,146,287,185,0,185,0,146,287,146,116,185,0,146,116,146,84,146,84,146,116,26,116,163,338,185,0,185,338,185,116,185,84,237,84,185,116,237,84,237,116,185,0,146,84,146,0,
-219,340,214,344,210,339,206,335,202,333,197,331,87,331,32,213,32,208,34,206,38,206,65,204,89,199,110,191,129,182,145,171,156,159,166,146,172,131,177,114,178,96,174,71,164,48,149,29,131,16,110,12,104,12,98,14,90,17,83,21,75,27,66,34,58,39,51,41,45,43,38,43,30,42,24,40,19,36,17,31,16,24,19,13,27,5,40,-1,58,-5,79,-6,99,-5,117,-2,134,1,149,8,164,17,182,33,196,51,206,71,211,95,213,122,213,137,211,150,207,162,202,174,195,185,178,205,159,220,137,232,108,241,70,249,90,291,188,291,192,292,198,294,200,296,201,298,223,342,185,337,152,329,123,317,97,300,71,277,52,254,37,229,26,201,19,171,17,140,18,118,21,98,26,78,33,60,41,44,53,26,68,12,86,1,106,-4,129,-6,148,-5,166,0,182,7,196,17,209,30,218,43,225,57,230,73,233,91,234,109,230,145,217,174,198,196,172,209,140,214,127,213,115,211,103,207,90,201,76,191,89,234,111,270,142,300,180,321,224,334,16383,16383,189,94,187,65,180,41,169,23,154,11,134,7,109,13,89,30,75,56,66,91,64,133,67,157,76,173,89,184,105,189,122,191,146,187,165,175,179,156,187,128,189,94,224,323,224,331,40,331,10,257,
+219,340,214,344,210,339,206,335,202,333,197,331,87,331,32,213,32,208,34,206,38,206,65,204,89,199,110,191,129,182,145,171,156,159,166,146,172,131,177,114,178,96,174,71,164,48,149,29,131,16,110,12,104,12,98,14,90,17,83,21,75,27,66,34,58,39,51,41,45,43,38,43,30,42,24,40,19,36,17,31,16,24,19,13,27,5,40,-1,58,-5,79,-6,99,-5,117,-2,134,1,149,8,164,17,182,33,196,51,206,71,211,95,213,122,213,137,211,150,207,162,202,174,195,185,178,205,159,220,137,232,108,241,70,249,90,291,188,291,192,292,198,294,200,296,201,298,
 211,95,213,122,213,137,211,95,213,137,211,150,211,95,211,150,207,162,211,95,207,162,206,71,178,205,178,96,182,33,178,205,182,33,195,185,195,185,182,33,196,51,195,185,196,51,202,174,202,174,196,51,206,71,202,174,206,71,207,162,149,8,164,17,164,48,164,48,164,17,182,33,164,48,182,33,174,71,174,71,182,33,178,96,110,12,117,-2,131,16,131,16,117,-2,134,1,131,16,134,1,149,29,149,29,134,1,149,8,149,29,149,8,164,48,202,333,197,331,198,294,202,333,198,294,200,296,202,333,200,296,201,298,202,333,201,298,219,340,202,333,219,340,206,335,190,331,192,292,197,331,197,331,192,292,195,293,197,331,195,293,198,294,210,339,206,335,219,340,210,339,219,340,214,344,87,331,70,249,90,291,87,331,90,291,190,331,190,331,90,291,188,291,190,331,188,291,192,292,38,206,65,204,70,249,70,249,65,204,89,199,70,249,89,199,108,241,108,241,89,199,110,191,108,241,110,191,137,232,137,232,110,191,129,182,137,232,129,182,145,171,145,171,156,159,159,220,159,220,156,159,166,146,159,220,166,146,178,205,178,205,166,146,172,131,178,205,172,131,177,114,87,331,32,213,33,207,87,331,33,207,34,206,87,331,34,206,36,206,87,331,36,206,38,206,87,331,38,206,70,249,32,213,32,212,33,207,33,207,32,212,32,208,32,208,32,212,32,211,79,-6,99,-5,83,21,79,-6,83,21,75,27,79,-6,75,27,66,34,79,-6,66,34,58,39,79,-6,58,39,58,-5,58,39,51,41,58,-5,58,-5,51,41,45,43,58,-5,45,43,40,-1,40,-1,45,43,38,43,40,-1,38,43,30,42,27,5,40,-1,30,42,27,5,30,42,24,40,27,5,24,40,19,36,27,5,19,36,19,13,17,31,16,24,19,13,17,31,19,13,19,36,104,12,98,14,99,-5,104,12,99,-5,117,-2,104,12,117,-2,110,12,159,220,137,232,145,171,90,17,83,21,99,-5,90,17,99,-5,98,14,178,205,177,114,178,96,32,208,32,211,32,210,
-223,342,185,337,152,329,123,317,97,300,71,277,52,254,37,229,26,201,19,171,17,140,18,118,21,98,26,78,33,60,41,44,53,26,68,12,86,1,106,-4,129,-6,148,-5,166,0,182,7,196,17,209,30,218,43,225,57,230,73,233,91,234,109,230,145,217,174,198,196,172,209,140,214,127,213,115,211,103,207,90,201,76,191,89,234,111,270,142,300,180,321,224,334,16383,16383,189,94,187,65,180,41,169,23,154,11,134,7,109,13,89,30,75,56,66,91,64,133,67,157,76,173,89,184,105,189,122,191,146,187,165,175,179,156,187,128,189,94,224,323,224,331,40,331,10,257,19,253,30,270,40,282,51,289,62,293,78,294,185,294,86,-3,118,-3,223,78,220,100,213,121,199,141,177,162,145,185,171,200,190,215,203,229,210,246,212,267,208,289,197,309,179,324,156,334,128,338,97,335,70,324,49,308,36,287,31,260,33,242,38,225,49,208,67,189,93,166,66,145,47,127,35,111,30,94,28,75,32,48,45,25,66,8,92,-2,124,-6,157,-2,185,8,205,26,218,49,223,78,16383,16383,177,267,176,249,171,234,162,220,149,207,131,195,107,210,90,225,77,240,70,257,68,275,71,292,78,305,
+223,342,185,337,152,329,123,317,97,300,71,277,52,254,37,229,26,201,19,171,17,140,18,118,21,98,26,78,33,60,41,44,53,26,68,12,86,1,106,-4,129,-6,148,-5,166,0,182,7,196,17,209,30,218,43,225,57,230,73,233,91,234,109,230,145,217,174,198,196,172,209,140,214,127,213,115,211,103,207,90,201,76,191,89,234,111,270,142,300,180,321,224,334,16383,16383,189,94,187,65,180,41,169,23,154,11,134,7,109,13,89,30,75,56,66,91,64,133,67,157,76,173,89,184,105,189,122,191,146,187,165,175,179,156,187,128,189,94,
 140,214,127,213,146,187,146,187,127,213,122,191,105,189,122,191,115,211,105,189,115,211,103,207,64,133,67,157,71,277,71,277,67,157,76,173,71,277,76,173,76,191,76,191,76,173,89,184,76,191,89,184,90,201,90,201,89,184,105,189,90,201,105,189,103,207,127,213,115,211,122,191,187,65,180,41,182,7,182,7,180,41,169,23,182,7,169,23,166,0,166,0,169,23,154,11,166,0,154,11,148,-5,148,-5,154,11,134,7,148,-5,134,7,129,-6,129,-6,134,7,109,13,129,-6,109,13,106,-4,106,-4,109,13,89,30,106,-4,89,30,86,1,86,1,89,30,75,56,86,1,75,56,68,12,68,12,75,56,66,91,68,12,66,91,64,133,53,26,68,12,64,133,64,133,71,277,53,26,53,26,71,277,52,254,53,26,52,254,41,44,41,44,52,254,37,229,41,44,37,229,33,60,33,60,37,229,26,78,218,43,225,57,230,145,230,145,225,57,230,73,230,145,230,73,234,109,234,109,230,73,233,91,189,94,196,17,198,196,198,196,196,17,209,30,198,196,209,30,217,174,217,174,209,30,218,43,217,174,218,43,230,145,146,187,165,175,172,209,172,209,165,175,179,156,172,209,179,156,198,196,198,196,179,156,187,128,198,196,187,128,189,94,187,65,182,7,196,17,187,65,196,17,189,94,76,191,89,234,97,300,97,300,89,234,111,270,97,300,111,270,123,317,123,317,111,270,142,300,123,317,142,300,152,329,152,329,142,300,180,321,152,329,180,321,185,337,185,337,180,321,224,334,185,337,224,334,223,342,97,300,71,277,76,191,17,140,18,118,19,171,19,171,18,118,21,98,19,171,21,98,26,201,26,201,21,98,26,78,26,201,26,78,37,229,140,214,146,187,172,209,
-224,323,224,331,40,331,10,257,19,253,30,270,40,282,51,289,62,293,78,294,185,294,86,-3,118,-3,223,78,220,100,213,121,199,141,177,162,145,185,171,200,190,215,203,229,210,246,212,267,208,289,197,309,
+224,323,224,331,40,331,10,257,19,253,30,270,40,282,51,289,62,293,78,294,185,294,86,-3,118,-3,
 118,-3,224,323,185,294,185,294,224,323,224,331,185,294,224,331,78,294,62,293,78,294,224,331,62,293,224,331,40,331,40,331,10,257,19,253,40,331,19,253,30,270,40,331,30,270,40,282,40,331,40,282,51,289,40,331,51,289,62,293,118,-3,185,294,86,-3,
-223,78,220,100,213,121,199,141,177,162,145,185,171,200,190,215,203,229,210,246,212,267,208,289,197,309,179,324,156,334,128,338,97,335,70,324,49,308,36,287,31,260,33,242,38,225,49,208,67,189,93,166,66,145,47,127,35,111,30,94,28,75,32,48,45,25,66,8,92,-2,124,-6,157,-2,185,8,205,26,218,49,223,78,16383,16383,177,267,176,249,171,234,162,220,149,207,131,195,107,210,90,225,77,240,70,257,68,275,71,292,78,305,89,316,104,322,123,324,142,322,157,314,168,302,175,286,177,267,16383,16383,136,136,154,122,167,109,177,95,183,79,185,62,182,44,175,29,163,17,148,10,129,7,108,10,91,19,77,34,69,54,66,79,67,97,71,113,79,128,90,142,106,156,30,-10,65,-4,95,3,121,13,145,28,170,49,191,72,208,100,220,130,227,163,229,197,228,221,224,244,217,265,209,284,198,300,185,313,171,324,155,332,138,337,119,338,85,332,57,316,35,291,20,258,15,220,19,186,31,158,50,137,75,123,105,118,122,119,138,122,153,128,167,136,180,147,164,101,140,63,109,33,71,12,28,0,16383,16383,181,177,177,163,167,153,153,146,137,141,123,140,102,144,85,157,72,177,64,204,61,237,62,253,64,269,68,284,73,297,79,307,84,313,91,318,98,321,106,323,115,324,139,319,157,304,170,278,178,243,181,197,96,201,95,210,91,218,85,224,77,228,69,229,60,228,52,224,46,218,42,211,41,201,42,193,46,185,52,179,60,176,69,174,77,176,
+223,78,220,100,213,121,199,141,177,162,145,185,171,200,190,215,203,229,210,246,212,267,208,289,197,309,179,324,156,334,128,338,97,335,70,324,49,308,36,287,31,260,33,242,38,225,49,208,67,189,93,166,66,145,47,127,35,111,30,94,28,75,32,48,45,25,66,8,92,-2,124,-6,157,-2,185,8,205,26,218,49,223,78,16383,16383,177,267,176,249,171,234,162,220,149,207,131,195,107,210,90,225,77,240,70,257,68,275,71,292,78,305,89,316,104,322,123,324,142,322,157,314,168,302,175,286,177,267,16383,16383,136,136,154,122,167,109,177,95,183,79,185,62,182,44,175,29,163,17,148,10,129,7,108,10,91,19,77,34,69,54,66,79,67,97,71,113,79,128,90,142,106,156,
 167,109,177,162,154,122,154,122,177,162,145,185,154,122,145,185,136,136,136,136,145,185,149,207,136,136,149,207,131,195,131,195,107,210,136,136,136,136,107,210,106,156,90,142,106,156,93,166,66,8,69,54,66,79,66,79,67,97,66,145,66,145,67,97,71,113,66,145,71,113,93,166,93,166,71,113,79,128,93,166,79,128,90,142,30,94,32,48,35,111,35,111,32,48,45,25,35,111,45,25,47,127,47,127,45,25,66,8,47,127,66,8,66,145,66,145,66,8,66,79,107,210,90,225,93,166,107,210,93,166,106,156,90,225,77,240,93,166,93,166,77,240,70,257,93,166,70,257,67,189,67,189,70,257,68,275,70,324,68,275,71,292,70,324,71,292,78,305,128,338,123,324,142,322,128,338,142,322,156,334,156,334,142,322,157,314,156,334,157,314,179,324,179,324,157,314,168,302,179,324,168,302,175,286,182,44,175,29,185,8,185,8,175,29,163,17,185,8,163,17,157,-2,157,-2,163,17,148,10,157,-2,148,10,129,7,129,7,108,10,124,-6,124,-6,108,10,92,-2,92,-2,108,10,91,19,92,-2,91,19,77,34,92,-2,77,34,69,54,92,-2,69,54,66,8,78,305,89,316,97,335,97,335,89,316,104,322,97,335,104,322,128,338,128,338,104,322,123,324,49,308,36,287,38,225,49,308,38,225,49,208,49,308,49,208,67,189,49,308,67,189,68,275,49,308,68,275,70,324,36,287,31,260,33,242,36,287,33,242,38,225,171,200,190,215,176,249,176,249,190,215,177,267,179,324,177,267,190,215,179,324,190,215,197,309,197,309,190,215,203,229,197,309,203,229,208,289,208,289,203,229,210,246,208,289,210,246,212,267,171,200,176,249,171,234,171,200,171,234,162,220,171,200,162,220,149,207,171,200,149,207,145,185,223,78,220,100,218,49,218,49,220,100,213,121,218,49,213,121,205,26,205,26,213,121,199,141,205,26,199,141,185,62,185,62,199,141,183,79,177,95,183,79,199,141,177,95,199,141,177,162,177,95,177,162,167,109,185,62,185,8,205,26,129,7,124,-6,157,-2,182,44,185,8,185,62,179,324,175,286,177,267,70,324,78,305,97,335,32,48,30,94,28,75,
-30,-10,65,-4,95,3,121,13,145,28,170,49,191,72,208,100,220,130,227,163,229,197,228,221,224,244,217,265,209,284,198,300,185,313,171,324,155,332,138,337,119,338,85,332,57,316,35,291,20,258,15,220,19,186,31,158,50,137,75,123,105,118,122,119,138,122,153,128,167,136,180,147,164,101,140,63,109,33,71,12,28,0,16383,16383,181,177,177,163,167,153,153,146,137,141,123,140,102,144,85,157,72,177,64,204,61,237,62,253,64,269,68,284,73,297,79,307,84,313,91,318,98,321,106,323,115,324,139,319,157,304,170,278,178,243,181,197,96,201,95,210,91,218,85,224,77,228,69,229,60,228,52,224,46,218,42,211,41,201,42,193,46,185,52,179,60,176,69,174,77,176,85,179,91,185,95,193,96,201,16383,16383,96,22,95,31,91,38,85,45,77,49,69,50,60,49,52,45,46,39,42,31,41,22,42,13,46,6,52,0,60,-3,69,-5,77,-3,85,0,91,6,95,13,96,22,95,201,94,210,90,218,84,224,77,228,68,229,59,228,51,224,45,218,42,211,40,201,42,193,46,185,52,179,59,176,68,174,77,176,84,179,90,185,94,193,95,201,16383,16383,54,-69,73,-58,88,-44,
+30,-10,65,-4,95,3,121,13,145,28,170,49,191,72,208,100,220,130,227,163,229,197,228,221,224,244,217,265,209,284,198,300,185,313,171,324,155,332,138,337,119,338,85,332,57,316,35,291,20,258,15,220,19,186,31,158,50,137,75,123,105,118,122,119,138,122,153,128,167,136,180,147,164,101,140,63,109,33,71,12,28,0,16383,16383,181,177,177,163,167,153,153,146,137,141,123,140,102,144,85,157,72,177,64,204,61,237,62,253,64,269,68,284,73,297,79,307,84,313,91,318,98,321,106,323,115,324,139,319,157,304,170,278,178,243,181,197,
 62,253,64,269,57,316,57,316,64,269,68,284,57,316,68,284,85,332,85,332,68,284,73,297,85,332,73,297,79,307,79,307,84,313,85,332,85,332,84,313,91,318,85,332,91,318,119,338,119,338,91,318,98,321,119,338,98,321,106,323,119,338,106,323,115,324,115,324,139,319,119,338,119,338,139,319,138,337,123,140,105,118,122,119,123,140,122,119,138,122,123,140,102,144,105,118,85,157,72,177,75,123,85,157,75,123,105,118,85,157,105,118,102,144,61,237,62,253,57,316,61,237,57,316,50,137,61,237,50,137,64,204,64,204,50,137,75,123,64,204,75,123,72,177,15,220,19,186,20,258,20,258,19,186,31,158,20,258,31,158,35,291,35,291,31,158,50,137,35,291,50,137,57,316,137,141,123,140,138,122,137,141,138,122,153,146,153,146,138,122,153,128,153,146,153,128,167,153,167,153,153,128,167,136,167,153,167,136,177,163,177,163,167,136,180,147,177,163,180,147,181,177,181,177,180,147,191,72,181,177,191,72,181,197,178,243,181,197,185,313,178,243,185,313,171,324,138,337,139,319,155,332,155,332,139,319,157,304,155,332,157,304,171,324,171,324,157,304,170,278,171,324,170,278,178,243,229,197,228,221,227,163,227,163,228,221,224,244,227,163,224,244,220,130,220,130,224,244,217,265,220,130,217,265,209,284,220,130,209,284,208,100,208,100,209,284,198,300,208,100,198,300,191,72,191,72,198,300,185,313,191,72,185,313,181,197,30,-10,65,-4,71,12,71,12,65,-4,95,3,71,12,95,3,109,33,109,33,95,3,121,13,109,33,121,13,140,63,140,63,121,13,145,28,140,63,145,28,164,101,164,101,145,28,170,49,164,101,170,49,180,147,180,147,170,49,191,72,71,12,28,0,30,-10,
-96,201,95,210,91,218,85,224,77,228,69,229,60,228,52,224,46,218,42,211,41,201,42,193,46,185,52,179,60,176,69,174,77,176,85,179,91,185,95,193,96,201,16383,16383,96,22,95,31,91,38,85,45,77,49,69,50,60,49,52,45,46,39,42,31,41,22,42,13,46,6,52,0,60,-3,69,-5,77,-3,85,0,91,6,95,13,96,22,95,201,94,210,90,218,84,224,77,228,68,229,59,228,51,224,45,218,42,211,40,201,42,193,46,185,52,179,59,176,68,174,77,176,84,179,90,185,94,193,95,201,16383,16383,54,-69,73,-58,88,-44,100,-28,107,-11,109,7,107,22,102,34,93,43,82,49,70,51,60,49,52,46,46,40,42,32,40,23,41,14,45,7,51,2,59,-1,69,-2,
+96,201,95,210,91,218,85,224,77,228,69,229,60,228,52,224,46,218,42,211,41,201,42,193,46,185,52,179,60,176,69,174,77,176,85,179,91,185,95,193,96,201,16383,16383,96,22,95,31,91,38,85,45,77,49,69,50,60,49,52,45,46,39,42,31,41,22,42,13,46,6,52,0,60,-3,69,-5,77,-3,85,0,91,6,95,13,96,22,
 42,211,42,193,46,218,46,218,42,193,46,185,46,218,46,185,52,224,52,224,46,185,52,179,52,224,52,179,60,228,60,228,52,179,60,176,60,228,60,176,69,229,69,229,60,176,69,174,69,229,69,174,77,228,77,228,69,174,77,176,77,228,77,176,85,224,85,224,77,176,85,179,85,224,85,179,91,218,91,218,85,179,91,185,91,218,91,185,95,210,95,210,91,185,95,193,95,210,95,193,96,201,42,31,42,13,46,39,46,39,42,13,46,6,46,39,46,6,52,45,52,45,46,6,52,0,52,45,52,0,60,49,60,49,52,0,60,-3,60,49,60,-3,69,50,69,50,60,-3,69,-5,69,50,69,-5,77,49,77,49,69,-5,77,-3,77,49,77,-3,85,45,85,45,77,-3,85,0,85,45,85,0,91,38,91,38,85,0,91,6,91,38,91,6,95,31,95,31,91,6,95,13,95,31,95,13,96,22,42,13,42,31,41,22,42,193,42,211,41,201,
-95,201,94,210,90,218,84,224,77,228,68,229,59,228,51,224,45,218,42,211,40,201,42,193,46,185,52,179,59,176,68,174,77,176,84,179,90,185,94,193,95,201,16383,16383,54,-69,73,-58,88,-44,100,-28,107,-11,109,7,107,22,102,34,93,43,82,49,70,51,60,49,52,46,46,40,42,32,40,23,41,14,45,7,51,2,59,-1,69,-2,72,-2,75,-1,78,-1,81,0,85,0,87,-2,89,-3,90,-5,90,-7,88,-17,83,-28,75,-38,63,-49,49,-60,310,-11,310,20,94,127,310,234,310,267,28,129,28,124,319,160,319,193,24,193,24,160,16383,16383,319,60,319,93,24,93,24,60,310,124,310,129,28,267,28,234,244,127,28,20,28,-11,122,82,126,101,131,118,137,133,145,147,155,161,176,187,191,208,201,226,206,242,207,259,202,286,189,308,169,324,144,335,116,338,89,335,66,325,49,310,38,290,34,267,35,255,38,246,44,239,50,235,58,233,65,234,71,237,75,242,78,248,79,255,77,264,72,270,66,276,
+95,201,94,210,90,218,84,224,77,228,68,229,59,228,51,224,45,218,42,211,40,201,42,193,46,185,52,179,59,176,68,174,77,176,84,179,90,185,94,193,95,201,16383,16383,54,-69,73,-58,88,-44,100,-28,107,-11,109,7,107,22,102,34,93,43,82,49,70,51,60,49,52,46,46,40,42,32,40,23,41,14,45,7,51,2,59,-1,69,-2,72,-2,75,-1,78,-1,81,0,85,0,87,-2,89,-3,90,-5,90,-7,88,-17,83,-28,75,-38,63,-49,49,-60,
 42,211,42,193,45,218,45,218,42,193,46,185,45,218,46,185,51,224,51,224,46,185,52,179,51,224,52,179,59,228,59,228,52,179,59,176,59,228,59,176,68,229,68,229,59,176,68,174,68,229,68,174,77,228,77,228,68,174,77,176,77,228,77,176,84,224,84,224,77,176,84,179,84,224,84,179,90,218,90,218,84,179,90,185,90,218,90,185,94,210,94,210,90,185,94,193,94,210,94,193,95,201,75,-1,78,-1,82,49,82,49,78,-1,81,0,82,49,81,0,83,0,83,0,85,0,93,43,93,43,85,0,87,-2,93,43,87,-2,89,-3,40,23,41,14,42,32,42,32,41,14,45,7,42,32,45,7,46,40,46,40,45,7,51,2,46,40,51,2,52,46,52,46,51,2,59,-1,52,46,59,-1,60,49,60,49,59,-1,69,-2,60,49,69,-2,70,51,70,51,69,-2,72,-2,70,51,72,-2,82,49,82,49,72,-2,75,-1,109,7,107,22,107,-11,107,-11,107,22,102,34,107,-11,102,34,100,-28,100,-28,102,34,93,43,100,-28,93,43,90,-7,90,-7,88,-44,100,-28,93,43,89,-3,90,-5,93,43,90,-5,90,-7,93,43,82,49,83,0,88,-44,90,-7,88,-17,88,-44,88,-17,83,-28,88,-44,83,-28,75,-38,88,-44,75,-38,73,-58,63,-49,49,-60,54,-69,63,-49,54,-69,73,-58,63,-49,73,-58,75,-38,42,193,42,211,40,201,
-310,-11,310,20,94,127,310,234,310,267,28,129,28,124,319,160,319,193,24,193,24,160,16383,16383,319,60,319,93,
+310,-11,310,20,94,127,310,234,310,267,28,129,28,124,
 94,127,310,234,310,267,94,127,310,267,28,129,94,127,28,129,310,-11,94,127,310,-11,310,20,310,-11,28,129,28,124,
-319,160,319,193,24,193,24,160,16383,16383,319,60,319,93,24,93,24,60,310,124,310,129,28,267,28,234,244,127,28,20,28,-11,122,82,126,101,
+319,160,319,193,24,193,24,160,16383,16383,319,60,319,93,24,93,24,60,
 24,193,24,160,319,160,24,193,319,160,319,193,24,93,24,60,319,60,24,93,319,60,319,93,
-310,124,310,129,28,267,28,234,244,127,28,20,28,-11,122,82,126,101,131,118,137,133,145,147,155,161,176,187,
+310,124,310,129,28,267,28,234,244,127,28,20,28,-11,
 310,124,310,129,28,267,310,124,28,267,28,234,310,124,28,234,244,127,310,124,244,127,28,20,310,124,28,20,28,-11,
-122,82,126,101,131,118,137,133,145,147,155,161,176,187,191,208,201,226,206,242,207,259,202,286,189,308,169,324,144,335,116,338,89,335,66,325,49,310,38,290,34,267,35,255,38,246,44,239,50,235,58,233,65,234,71,237,75,242,78,248,79,255,77,264,72,270,66,276,62,283,60,292,62,301,69,310,80,317,92,321,107,323,124,320,139,312,151,300,159,283,161,264,160,246,156,227,150,209,136,171,126,147,120,127,116,109,114,95,113,82,16383,16383,145,22,144,30,140,38,134,44,127,48,119,49,110,48,103,44,97,38,93,31,92,22,93,14,97,7,102,1,110,-2,119,-3,127,-2,135,1,140,7,144,14,145,22,344,36,323,27,303,20,283,16,263,13,243,12,196,19,156,40,126,71,107,112,100,161,101,184,105,206,112,227,120,247,131,265,148,285,167,301,189,313,214,320,241,323,286,316,326,296,357,267,377,229,384,186,381,157,372,130,358,108,341,94,321,88,314,89,308,92,304,96,301,103,300,112,300,115,301,117,301,120,334,247,300,247,295,228,294,228,289,238,284,245,276,250,268,253,257,254,242,252,229,248,216,241,204,231,194,219,183,203,174,185,167,167,162,147,161,128,163,109,169,93,179,82,191,75,204,72,219,74,232,78,245,86,257,96,267,108,268,108,271,96,279,86,288,78,300,73,313,71,341,78,366,95,386,121,
+122,82,126,101,131,118,137,133,145,147,155,161,176,187,191,208,201,226,206,242,207,259,202,286,189,308,169,324,144,335,116,338,89,335,66,325,49,310,38,290,34,267,35,255,38,246,44,239,50,235,58,233,65,234,71,237,75,242,78,248,79,255,77,264,72,270,66,276,62,283,60,292,62,301,69,310,80,317,92,321,107,323,124,320,139,312,151,300,159,283,161,264,160,246,156,227,150,209,136,171,126,147,120,127,116,109,114,95,113,82,16383,16383,145,22,144,30,140,38,134,44,127,48,119,49,110,48,103,44,97,38,93,31,92,22,93,14,97,7,102,1,110,-2,119,-3,127,-2,135,1,140,7,144,14,145,22,
 60,292,60,292,60,292,60,292,66,325,49,310,60,292,49,310,50,235,60,292,50,235,58,233,144,335,116,338,124,320,124,320,116,338,107,323,92,321,107,323,116,338,92,321,116,338,89,335,60,292,62,301,66,325,66,325,62,301,69,310,66,325,69,310,89,335,89,335,69,310,80,317,89,335,80,317,92,321,34,267,35,255,38,290,38,290,35,255,38,246,38,290,38,246,49,310,49,310,38,246,44,239,49,310,44,239,50,235,62,283,65,234,66,276,66,276,65,234,71,237,66,276,71,237,72,270,72,270,71,237,75,242,72,270,75,242,77,264,77,264,75,242,78,248,77,264,78,248,79,255,65,234,62,283,60,292,65,234,60,292,58,233,119,49,119,-3,127,48,127,48,119,-3,127,-2,127,48,127,-2,134,44,134,44,127,-2,135,1,134,44,135,1,140,38,140,38,135,1,140,7,140,38,140,7,144,30,144,30,140,7,144,14,144,30,144,14,145,22,92,22,93,14,93,31,93,31,93,14,97,7,93,31,97,7,97,38,97,38,97,7,102,1,97,38,102,1,103,44,103,44,102,1,110,-2,103,44,110,-2,110,48,110,48,110,-2,119,-3,110,48,119,-3,119,49,124,320,139,312,144,335,144,335,139,312,151,300,144,335,151,300,169,324,169,324,151,300,159,283,169,324,159,283,161,264,161,264,160,246,176,187,176,187,160,246,156,227,176,187,156,227,155,161,155,161,156,227,150,209,155,161,150,209,145,147,145,147,150,209,143,190,145,147,143,190,137,133,137,133,143,190,136,171,137,133,136,171,131,118,131,118,136,171,126,147,131,118,126,147,126,101,126,101,126,147,122,82,202,286,189,308,191,208,202,286,191,208,201,226,202,286,201,226,206,242,202,286,206,242,207,259,176,187,191,208,189,308,176,187,189,308,169,324,176,187,169,324,161,264,122,82,126,147,120,127,122,82,120,127,116,109,122,82,116,109,114,95,122,82,114,95,113,82,
-344,36,323,27,303,20,283,16,263,13,243,12,196,19,156,40,126,71,107,112,100,161,101,184,105,206,112,227,120,247,131,265,148,285,167,301,189,313,214,320,241,323,286,316,326,296,357,267,377,229,384,186,381,157,372,130,358,108,341,94,321,88,314,89,308,92,304,96,301,103,300,112,300,115,301,117,301,120,334,247,300,247,295,228,294,228,289,238,284,245,276,250,268,253,257,254,242,252,229,248,216,241,204,231,194,219,183,203,174,185,167,167,162,147,161,128,163,109,169,93,179,82,191,75,204,72,219,74,232,78,245,86,257,96,267,108,268,108,271,96,279,86,288,78,300,73,313,71,341,78,366,95,386,121,400,154,405,191,396,238,374,279,338,310,293,331,241,338,215,337,191,333,169,326,148,316,128,304,105,282,86,257,71,228,61,197,58,164,67,108,93,61,132,24,182,1,241,-6,261,-5,281,-2,302,2,324,10,350,22,16383,16383,286,202,285,187,282,171,277,155,271,138,264,123,257,113,250,105,242,99,234,95,226,94,216,96,207,101,201,110,197,122,196,137,197,150,199,163,203,175,208,186,214,197,223,209,234,219,244,226,254,231,263,232,271,231,277,227,282,221,285,213,286,202,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,211,175,225,178,236,182,245,185,259,195,266,203,272,213,276,224,279,235,280,248,274,277,258,300,232,317,195,327,148,331,8,331,8,321,29,320,43,316,51,308,55,295,56,275,56,56,55,37,51,24,42,16,29,11,8,9,8,0,177,0,217,4,250,15,275,34,291,58,296,89,295,102,292,115,287,126,281,137,272,147,263,154,254,160,242,166,229,170,211,174,16383,16383,108,183,108,303,109,307,112,310,115,312,119,313,140,313,172,309,197,301,214,287,225,268,228,245,225,223,217,205,202,193,181,186,153,183,16383,16383,108,163,139,162,162,161,181,158,198,152,215,143,224,136,231,126,235,115,238,103,239,89,238,77,236,66,232,56,227,47,220,40,207,30,194,24,179,20,161,19,138,18,126,19,118,21,112,26,109,32,
+344,36,323,27,303,20,283,16,263,13,243,12,196,19,156,40,126,71,107,112,100,161,101,184,105,206,112,227,120,247,131,265,148,285,167,301,189,313,214,320,241,323,286,316,326,296,357,267,377,229,384,186,381,157,372,130,358,108,341,94,321,88,314,89,308,92,304,96,301,103,300,112,300,115,301,117,301,120,334,247,300,247,295,228,294,228,289,238,284,245,276,250,268,253,257,254,242,252,229,248,216,241,204,231,194,219,183,203,174,185,167,167,162,147,161,128,163,109,169,93,179,82,191,75,204,72,219,74,232,78,245,86,257,96,267,108,268,108,271,96,279,86,288,78,300,73,313,71,341,78,366,95,386,121,400,154,405,191,396,238,374,279,338,310,293,331,241,338,215,337,191,333,169,326,148,316,128,304,105,282,86,257,71,228,61,197,58,164,67,108,93,61,132,24,182,1,241,-6,261,-5,281,-2,302,2,324,10,350,22,16383,16383,286,202,285,187,282,171,277,155,271,138,264,123,257,113,250,105,242,99,234,95,226,94,216,96,207,101,201,110,197,122,196,137,197,150,199,163,203,175,208,186,214,197,223,209,234,219,244,226,254,231,263,232,271,231,277,227,282,221,285,213,286,202,
 156,40,126,71,132,24,132,24,126,71,107,112,132,24,107,112,93,61,93,61,107,112,100,161,105,282,100,161,101,184,105,282,101,184,105,206,105,206,112,227,128,304,128,304,112,227,120,247,128,304,120,247,131,265,131,265,148,285,148,316,148,316,148,285,167,301,148,316,167,301,169,326,169,326,167,301,189,313,169,326,189,313,191,333,191,333,189,313,214,320,191,333,214,320,215,337,215,337,214,320,241,323,215,337,241,323,241,338,241,338,241,323,293,331,93,61,100,161,105,282,93,61,105,282,86,257,93,61,86,257,71,228,93,61,71,228,67,108,61,197,58,164,67,108,61,197,67,108,71,228,384,186,386,121,396,238,384,186,396,238,377,229,377,229,396,238,374,279,377,229,374,279,357,267,357,267,374,279,338,310,357,267,338,310,326,296,326,296,338,310,293,331,326,296,293,331,286,316,286,316,293,331,241,323,148,316,128,304,131,265,344,36,323,27,324,10,324,10,323,27,303,20,324,10,303,20,302,2,302,2,303,20,283,16,302,2,283,16,281,-2,281,-2,283,16,263,13,281,-2,263,13,261,-5,261,-5,263,13,243,12,261,-5,243,12,241,-6,241,-6,243,12,196,19,241,-6,196,19,182,1,182,1,196,19,156,40,182,1,156,40,132,24,276,250,268,253,271,231,271,231,268,253,263,232,254,231,263,232,257,254,254,231,257,254,244,226,244,226,257,254,242,252,244,226,242,252,234,219,234,219,242,252,229,248,234,219,229,248,223,209,223,209,229,248,216,241,223,209,216,241,214,197,199,163,203,175,204,231,204,231,203,175,208,186,204,231,208,186,216,241,216,241,208,186,214,197,194,219,196,137,197,150,194,219,197,150,204,231,204,231,197,150,199,163,201,110,204,72,207,101,207,101,204,72,219,74,207,101,219,74,216,96,216,96,219,74,226,94,234,95,226,94,232,78,234,95,232,78,245,86,197,122,196,137,191,75,197,122,191,75,204,72,197,122,204,72,201,110,196,137,194,219,191,75,191,75,194,219,183,203,191,75,183,203,179,82,179,82,183,203,174,185,179,82,174,185,169,93,169,93,174,185,167,167,169,93,167,167,163,109,163,109,167,167,162,147,163,109,162,147,161,128,268,253,257,254,263,232,267,108,268,108,271,138,267,108,271,138,264,123,264,123,257,113,267,108,267,108,257,113,257,96,308,92,304,96,312,71,312,71,304,96,301,103,312,71,301,103,300,73,300,73,301,103,300,112,300,115,301,117,300,247,300,247,301,117,301,119,300,247,301,119,301,120,301,120,334,247,300,247,300,247,295,228,300,73,300,247,300,73,300,112,300,247,300,112,300,114,300,247,300,114,300,115,295,228,294,228,300,73,300,73,294,228,289,238,300,73,289,238,288,78,288,78,289,238,286,202,288,78,286,202,285,187,288,78,285,187,282,171,285,213,286,202,289,238,285,213,289,238,284,245,285,213,284,245,282,221,277,227,282,221,284,245,277,227,284,245,276,250,277,227,276,250,271,231,384,186,381,157,386,121,386,121,381,157,372,130,386,121,372,130,366,95,366,95,372,130,358,108,366,95,358,108,341,78,341,78,358,108,341,94,341,78,341,94,321,88,321,88,314,89,341,78,341,78,314,89,312,71,396,238,386,121,400,154,396,238,400,154,405,191,288,78,282,171,279,86,279,86,282,171,277,155,279,86,277,155,271,96,271,96,277,155,271,138,271,96,271,138,268,108,250,105,242,99,245,86,250,105,245,86,257,96,250,105,257,96,257,113,226,94,219,74,232,78,234,95,245,86,242,99,308,92,312,71,314,89,344,36,324,10,350,22,105,282,105,206,128,304,
-353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,211,175,225,178,236,182,245,185,259,195,266,203,272,213,276,224,279,235,280,248,274,277,258,300,232,317,195,327,148,331,8,331,8,321,29,320,43,316,51,308,55,295,56,275,56,56,55,37,51,24,42,16,29,11,8,9,8,0,177,0,217,4,250,15,275,34,291,58,296,89,295,102,292,115,287,126,281,137,272,147,263,154,254,160,242,166,229,170,211,174,16383,16383,108,183,
+353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,
 55,58,73,22,72,30,72,30,72,34,70,93,70,93,72,34,73,38,70,93,73,38,74,43,174,337,76,51,99,108,174,337,99,108,108,128,108,128,99,108,230,108,108,128,230,108,224,128,224,128,230,108,306,55,224,128,306,55,184,337,246,11,242,10,353,0,353,0,242,10,235,10,353,0,235,10,226,9,259,21,258,18,353,0,353,0,258,18,256,16,353,0,256,16,253,14,253,14,250,12,353,0,353,0,250,12,246,11,261,26,353,0,330,17,261,26,330,17,321,26,261,26,321,26,314,38,261,26,314,38,306,55,261,26,306,55,260,31,306,55,230,108,251,61,306,55,251,61,254,53,306,55,254,53,257,45,306,55,257,45,259,38,306,55,259,38,260,31,174,337,108,128,166,266,174,337,166,266,224,128,174,337,224,128,184,337,70,93,55,58,72,30,70,93,74,43,75,47,70,93,75,47,76,51,70,93,76,51,174,337,340,12,330,17,353,0,340,12,353,0,353,9,260,23,259,21,353,0,260,23,353,0,261,26,107,0,107,9,94,10,107,0,94,10,84,12,107,0,84,12,44,34,107,0,44,34,33,20,107,0,33,20,22,13,107,0,22,13,7,9,107,0,7,9,7,0,44,34,84,12,77,16,44,34,77,16,73,22,44,34,73,22,55,58,353,0,226,9,226,0,
-211,175,225,178,236,182,245,185,259,195,266,203,272,213,276,224,279,235,280,248,274,277,258,300,232,317,195,327,148,331,8,331,8,321,29,320,43,316,51,308,55,295,56,275,56,56,55,37,51,24,42,16,29,11,8,9,8,0,177,0,217,4,250,15,275,34,291,58,296,89,295,102,292,115,287,126,281,137,272,147,263,154,254,160,242,166,229,170,211,174,16383,16383,108,183,108,303,109,307,112,310,115,312,119,313,140,313,172,309,197,301,214,287,225,268,228,245,225,223,217,205,202,193,181,186,153,183,16383,16383,108,163,139,162,162,161,181,158,198,152,215,143,224,136,231,126,235,115,238,103,239,89,238,77,236,66,232,56,227,47,220,40,207,30,194,24,179,20,161,19,138,18,126,19,118,21,112,26,109,32,108,41,307,65,285,47,265,32,244,23,222,17,197,15,177,17,157,21,139,28,123,38,108,51,95,68,85,88,78,112,73,140,72,171,77,219,93,260,117,291,151,311,192,318,211,316,228,311,244,304,259,293,272,280,279,272,285,263,290,252,295,240,299,224,310,224,305,338,296,338,293,332,290,328,285,324,280,322,275,321,269,322,262,324,254,326,240,330,228,333,204,337,192,338,180,338,153,336,127,330,102,320,80,305,59,286,44,266,31,243,22,218,16,191,14,162,16,133,22,106,32,80,45,57,62,37,81,22,103,9,127,0,153,-4,180,-6,214,-4,245,3,273,16,297,34,316,56,8,331,8,321,27,320,40,316,47,308,51,295,52,275,52,57,51,38,48,25,40,16,27,12,8,9,8,0,148,0,178,1,206,6,231,12,
+211,175,225,178,236,182,245,185,259,195,266,203,272,213,276,224,279,235,280,248,274,277,258,300,232,317,195,327,148,331,8,331,8,321,29,320,43,316,51,308,55,295,56,275,56,56,55,37,51,24,42,16,29,11,8,9,8,0,177,0,217,4,250,15,275,34,291,58,296,89,295,102,292,115,287,126,281,137,272,147,263,154,254,160,242,166,229,170,211,174,16383,16383,108,183,108,303,109,307,112,310,115,312,119,313,140,313,172,309,197,301,214,287,225,268,228,245,225,223,217,205,202,193,181,186,153,183,16383,16383,108,163,139,162,162,161,181,158,198,152,215,143,224,136,231,126,235,115,238,103,239,89,238,77,236,66,232,56,227,47,220,40,207,30,194,24,179,20,161,19,138,18,126,19,118,21,112,26,109,32,108,41,
 51,24,42,16,177,0,177,0,42,16,29,11,177,0,29,11,8,9,55,295,56,275,112,310,55,295,112,310,148,331,148,331,112,310,115,312,148,331,115,312,119,313,148,331,119,313,140,313,148,331,140,313,172,309,207,30,194,24,217,4,217,4,194,24,179,20,217,4,179,20,177,0,177,0,179,20,161,19,177,0,161,19,138,18,138,18,126,19,177,0,177,0,126,19,118,21,177,0,118,21,55,37,55,37,118,21,56,56,258,300,232,317,236,182,236,182,232,317,228,245,236,182,228,245,225,223,236,182,225,223,225,178,225,178,225,223,217,205,225,178,217,205,211,175,211,175,217,205,202,193,211,175,202,193,211,174,211,174,202,193,215,143,211,174,215,143,229,170,229,170,215,143,224,136,153,183,162,161,181,186,181,186,162,161,181,158,181,186,181,158,202,193,202,193,181,158,198,152,202,193,198,152,215,143,236,66,232,56,250,15,250,15,232,56,227,47,250,15,227,47,220,40,220,40,207,30,217,4,162,161,153,183,139,162,139,162,153,183,108,183,139,162,108,183,108,163,109,32,108,41,56,275,109,32,56,275,56,56,56,56,118,21,112,26,56,56,112,26,109,32,272,147,263,154,275,34,275,34,263,154,254,160,275,34,254,160,250,15,250,15,254,160,242,166,250,15,242,166,239,89,239,89,238,77,250,15,250,15,238,77,236,66,242,166,229,170,231,126,242,166,231,126,235,115,242,166,235,115,238,103,242,166,238,103,239,89,232,317,195,327,197,301,232,317,197,301,214,287,232,317,214,287,225,268,232,317,225,268,228,245,195,327,148,331,172,309,195,327,172,309,197,301,56,275,108,41,108,296,56,275,108,296,108,303,56,275,108,303,109,307,56,275,109,307,112,310,148,331,8,331,29,320,148,331,29,320,43,316,148,331,43,316,51,308,148,331,51,308,55,295,266,203,272,213,274,277,274,277,272,213,276,224,274,277,276,224,280,248,280,248,276,224,279,235,245,185,252,190,258,300,258,300,252,190,259,195,258,300,259,195,274,277,274,277,259,195,266,203,292,115,287,126,291,58,292,115,291,58,296,89,292,115,296,89,295,102,281,137,272,147,275,34,281,137,275,34,291,58,281,137,291,58,287,126,220,40,217,4,250,15,258,300,236,182,245,185,29,320,8,331,8,321,229,170,224,136,231,126,177,0,8,9,8,0,51,24,177,0,55,37,
-307,65,285,47,265,32,244,23,222,17,197,15,177,17,157,21,139,28,123,38,108,51,95,68,85,88,78,112,73,140,72,171,77,219,93,260,117,291,151,311,192,318,211,316,228,311,244,304,259,293,272,280,279,272,285,263,290,252,295,240,299,224,310,224,305,338,296,338,293,332,290,328,285,324,280,322,275,321,269,322,262,324,254,326,240,330,228,333,204,337,192,338,180,338,153,336,127,330,102,320,80,305,59,286,44,266,31,243,22,218,16,191,14,162,16,133,22,106,32,80,45,57,62,37,81,22,103,9,127,0,153,-4,180,-6,214,-4,245,3,273,16,297,34,316,56,8,331,8,321,27,320,40,316,47,308,51,295,52,275,52,57,51,38,48,25,40,16,27,12,8,9,8,0,148,0,178,1,206,6,231,12,254,21,275,32,299,51,318,75,331,102,340,133,343,167,341,196,334,223,324,247,310,267,293,286,270,302,244,314,214,323,180,329,143,331,16383,16383,103,291,104,300,107,306,112,310,119,312,129,313,157,311,182,308,203,301,222,291,241,278,257,260,271,241,280,219,286,193,288,164,286,132,280,104,270,81,255,61,236,45,218,34,200,27,179,22,155,19,127,18,117,19,110,22,106,26,104,33,103,42,299,84,285,84,271,57,255,38,234,26,
+307,65,285,47,265,32,244,23,222,17,197,15,177,17,157,21,139,28,123,38,108,51,95,68,85,88,78,112,73,140,72,171,77,219,93,260,117,291,151,311,192,318,211,316,228,311,244,304,259,293,272,280,279,272,285,263,290,252,295,240,299,224,310,224,305,338,296,338,293,332,290,328,285,324,280,322,275,321,269,322,262,324,254,326,240,330,228,333,204,337,192,338,180,338,153,336,127,330,102,320,80,305,59,286,44,266,31,243,22,218,16,191,14,162,16,133,22,106,32,80,45,57,62,37,81,22,103,9,127,0,153,-4,180,-6,214,-4,245,3,273,16,297,34,316,56,
 62,37,73,140,72,171,72,171,80,305,62,37,62,37,80,305,59,286,62,37,59,286,45,57,45,57,59,286,44,266,45,57,44,266,32,80,32,80,44,266,31,243,32,80,31,243,22,106,22,106,31,243,22,218,22,106,22,218,16,133,16,133,22,218,16,191,16,133,16,191,14,162,78,112,81,22,85,88,85,88,81,22,103,9,85,88,103,9,95,68,95,68,103,9,108,51,123,38,108,51,127,0,123,38,127,0,139,28,139,28,127,0,153,-4,139,28,153,-4,157,21,157,21,153,-4,180,-6,157,21,180,-6,177,17,177,17,180,-6,197,15,222,17,197,15,214,-4,222,17,214,-4,245,3,73,140,62,37,81,22,73,140,81,22,78,112,108,51,103,9,127,0,254,326,259,293,262,324,262,324,259,293,272,280,262,324,272,280,269,322,269,322,272,280,275,321,280,322,275,321,279,272,280,322,279,272,285,263,275,321,272,280,279,272,228,333,228,311,240,330,240,330,228,311,244,304,240,330,244,304,247,328,247,328,244,304,259,293,247,328,259,293,254,326,216,335,204,337,211,316,216,335,211,316,228,311,216,335,228,311,228,333,204,337,192,338,211,316,211,316,192,338,192,318,151,311,192,318,153,336,151,311,153,336,127,330,310,224,305,338,299,224,299,224,305,338,296,338,299,224,296,338,295,240,295,240,296,338,293,332,295,240,293,332,290,252,290,252,293,332,290,328,290,252,290,328,285,263,285,263,290,328,285,324,285,263,285,324,280,322,316,56,307,65,297,34,297,34,307,65,285,47,297,34,285,47,273,16,273,16,285,47,265,32,273,16,265,32,245,3,245,3,265,32,244,23,245,3,244,23,222,17,197,15,180,-6,214,-4,192,318,192,338,180,338,192,318,180,338,153,336,72,171,77,219,80,305,80,305,77,219,93,260,80,305,93,260,102,320,102,320,93,260,117,291,102,320,117,291,127,330,127,330,117,291,151,311,
-8,331,8,321,27,320,40,316,47,308,51,295,52,275,52,57,51,38,48,25,40,16,27,12,8,9,8,0,148,0,178,1,206,6,231,12,254,21,275,32,299,51,318,75,331,102,340,133,343,167,341,196,334,223,324,247,310,267,293,286,270,302,244,314,214,323,180,329,143,331,16383,16383,103,291,104,300,107,306,112,310,119,312,129,313,157,311,182,308,203,301,222,291,241,278,257,260,271,241,280,219,286,193,288,164,286,132,280,104,270,81,255,61,236,45,218,34,200,27,179,22,155,19,127,18,117,19,110,22,106,26,104,33,103,42,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,273,259,271,331,6,331,6,321,25,319,38,315,45,307,49,294,50,276,50,61,
+8,331,8,321,27,320,40,316,47,308,51,295,52,275,52,57,51,38,48,25,40,16,27,12,8,9,8,0,148,0,178,1,206,6,231,12,254,21,275,32,299,51,318,75,331,102,340,133,343,167,341,196,334,223,324,247,310,267,293,286,270,302,244,314,214,323,180,329,143,331,16383,16383,103,291,104,300,107,306,112,310,119,312,129,313,157,311,182,308,203,301,222,291,241,278,257,260,271,241,280,219,286,193,288,164,286,132,280,104,270,81,255,61,236,45,218,34,200,27,179,22,155,19,127,18,117,19,110,22,106,26,104,33,103,42,
 48,25,40,16,148,0,148,0,40,16,27,12,148,0,27,12,8,9,52,57,51,38,110,22,110,22,51,38,148,0,110,22,148,0,117,19,117,19,148,0,127,18,155,19,127,18,148,0,155,19,148,0,178,1,104,300,107,306,52,275,52,275,107,306,112,310,52,275,112,310,143,331,143,331,112,310,119,312,143,331,119,312,129,313,129,313,119,312,129,312,129,313,129,312,157,311,129,313,157,311,143,331,143,331,157,311,180,329,206,6,231,12,218,34,218,34,231,12,236,45,255,61,236,45,254,21,255,61,254,21,275,32,155,19,178,1,179,22,179,22,178,1,206,6,179,22,206,6,200,27,200,27,206,6,218,34,244,314,241,278,257,260,244,314,257,260,270,302,270,302,257,260,271,241,270,302,271,241,293,286,293,286,271,241,280,219,293,286,280,219,286,193,182,308,203,301,214,323,214,323,203,301,222,291,214,323,222,291,244,314,244,314,222,291,241,278,180,329,157,311,182,308,180,329,182,308,214,323,343,167,341,196,340,133,340,133,341,196,334,223,340,133,334,223,331,102,331,102,334,223,324,247,331,102,324,247,318,75,318,75,324,247,310,267,318,75,310,267,299,51,299,51,310,267,293,286,299,51,293,286,288,164,288,164,286,132,299,51,299,51,286,132,280,104,299,51,280,104,275,32,275,32,280,104,270,81,275,32,270,81,255,61,236,45,231,12,254,21,110,22,106,26,52,57,52,57,106,26,104,33,52,57,104,33,52,275,52,275,104,33,103,42,52,275,103,42,103,291,40,316,47,308,143,331,143,331,47,308,51,295,143,331,51,295,52,275,27,320,40,316,143,331,27,320,143,331,8,331,27,320,8,331,8,321,148,0,8,9,8,0,48,25,148,0,51,38,104,300,52,275,103,291,293,286,286,193,288,164,
-299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,273,259,271,331,6,331,6,321,25,319,38,315,45,307,49,294,50,276,50,61,49,40,45,25,37,16,25,12,6,9,6,0,146,0,146,9,127,12,113,16,105,24,102,37,100,56,100,164,171,164,193,162,209,158,219,150,225,136,228,115,239,115,239,232,228,232,225,212,218,198,208,190,193,185,171,184,100,184,100,292,101,300,102,306,105,310,110,311,118,312,184,312,214,311,234,306,247,297,255,282,261,259,354,177,227,177,227,168,246,166,259,162,267,154,
+299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,
 45,24,38,16,276,0,276,0,38,16,25,12,276,0,25,12,6,9,49,294,50,275,106,310,49,294,106,310,45,307,45,307,106,310,111,312,45,307,111,312,271,331,271,331,111,312,118,312,45,24,117,21,49,37,49,37,117,21,108,25,49,37,108,25,50,57,50,57,108,25,102,31,50,57,102,31,50,275,50,275,102,31,100,42,50,275,100,42,100,294,100,184,100,164,176,164,100,184,176,164,176,184,198,185,176,184,198,162,198,185,198,162,213,190,213,190,198,162,213,158,213,190,213,158,222,198,222,198,213,158,222,150,222,198,222,150,229,212,229,212,222,150,229,136,229,212,229,136,233,232,233,232,229,136,233,115,233,232,233,115,244,115,271,331,118,312,184,312,271,331,184,312,213,311,271,331,213,311,234,306,271,331,234,306,247,297,271,331,247,297,255,282,271,331,255,282,261,259,271,331,261,259,273,259,50,275,100,294,101,302,50,275,101,302,103,307,50,275,103,307,106,310,271,331,6,331,25,320,271,331,25,320,38,315,271,331,38,315,45,307,255,38,234,26,276,0,276,0,234,26,206,20,276,0,206,20,169,18,276,0,299,84,285,84,276,0,285,84,271,57,276,0,271,57,255,38,276,0,169,18,151,18,276,0,151,18,132,19,276,0,132,19,117,21,276,0,117,21,45,24,276,0,6,9,6,0,25,320,6,331,6,321,176,184,176,164,198,162,233,232,244,115,244,232,
-273,259,271,331,6,331,6,321,25,319,38,315,45,307,49,294,50,276,50,61,49,40,45,25,37,16,25,12,6,9,6,0,146,0,146,9,127,12,113,16,105,24,102,37,100,56,100,164,171,164,193,162,209,158,219,150,225,136,228,115,239,115,239,232,228,232,225,212,218,198,208,190,193,185,171,184,100,184,100,292,101,300,102,306,105,310,110,311,118,312,184,312,214,311,234,306,247,297,255,282,261,259,354,177,227,177,227,168,246,166,259,162,267,154,270,142,271,122,271,44,268,34,259,25,244,19,226,14,204,13,161,19,124,39,97,69,79,111,73,162,75,191,79,219,86,244,97,266,112,283,125,295,140,305,157,312,175,317,195,318,211,317,227,314,242,308,256,300,268,291,276,282,283,273,290,262,296,249,304,233,315,233,311,338,300,338,298,333,294,328,289,325,283,322,277,321,274,322,270,322,266,323,261,325,
+273,259,271,331,6,331,6,321,25,319,38,315,45,307,49,294,50,276,50,61,49,40,45,25,37,16,25,12,6,9,6,0,146,0,146,9,127,12,113,16,105,24,102,37,100,56,100,164,171,164,193,162,209,158,219,150,225,136,228,115,239,115,239,232,228,232,225,212,218,198,208,190,193,185,171,184,100,184,100,292,101,300,102,306,105,310,110,311,118,312,184,312,214,311,234,306,247,297,255,282,261,259,
 38,315,45,307,271,331,271,331,45,307,110,311,271,331,110,311,118,312,271,331,118,312,184,312,271,331,184,312,214,311,50,276,102,37,100,56,100,184,100,164,171,164,100,184,171,164,171,184,193,185,171,184,193,162,193,185,193,162,208,190,208,190,193,162,209,158,208,190,209,158,218,198,218,198,209,158,219,150,218,198,219,150,225,212,225,212,219,150,225,136,225,212,225,136,228,232,228,232,225,136,228,115,228,232,228,115,239,115,271,331,214,311,234,306,271,331,234,306,247,297,271,331,247,297,255,282,271,331,255,282,261,259,271,331,261,259,273,259,50,276,100,56,100,292,50,276,100,292,101,300,50,276,101,300,102,306,50,276,102,306,105,310,50,276,105,310,49,294,110,311,45,307,49,294,110,311,49,294,105,310,25,319,38,315,271,331,25,319,271,331,6,331,25,319,6,331,6,321,146,0,146,9,127,12,146,0,127,12,113,16,146,0,113,16,49,40,146,0,49,40,45,25,146,0,45,25,37,16,146,0,37,16,25,12,146,0,25,12,6,9,146,0,6,9,6,0,50,61,49,40,113,16,50,61,113,16,105,24,50,61,105,24,102,37,50,61,102,37,50,276,171,184,171,164,193,162,228,232,239,115,239,232,
-354,177,227,177,227,168,246,166,259,162,267,154,270,142,271,122,271,44,268,34,259,25,244,19,226,14,204,13,161,19,124,39,97,69,79,111,73,162,75,191,79,219,86,244,97,266,112,283,125,295,140,305,157,312,175,317,195,318,211,317,227,314,242,308,256,300,268,291,276,282,283,273,290,262,296,249,304,233,315,233,311,338,300,338,298,333,294,328,289,325,283,322,277,321,274,322,270,322,266,323,261,325,256,326,243,331,230,334,218,336,204,338,189,338,161,336,135,331,111,322,89,310,70,295,51,275,36,251,25,225,19,195,16,164,18,135,23,110,31,86,42,65,57,46,79,28,105,13,133,2,162,-4,193,-6,223,-5,251,0,278,6,301,16,320,28,320,128,321,144,324,156,330,162,340,166,354,168,352,0,352,9,333,12,320,17,312,25,308,37,307,55,307,274,308,293,312,307,320,315,333,319,352,321,352,331,211,331,211,321,231,319,244,315,251,307,255,294,256,274,256,180,104,180,104,274,106,294,110,307,118,315,130,319,149,321,149,331,9,331,9,321,28,319,41,315,49,307,53,294,54,274,54,61,53,39,49,25,42,16,29,12,9,9,9,0,148,0,148,9,129,12,117,17,109,25,105,38,104,56,104,157,256,157,256,62,255,41,252,26,244,17,232,12,212,9,212,0,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,177,331,
+354,177,227,177,227,168,246,166,259,162,267,154,270,142,271,122,271,44,268,34,259,25,244,19,226,14,204,13,161,19,124,39,97,69,79,111,73,162,75,191,79,219,86,244,97,266,112,283,125,295,140,305,157,312,175,317,195,318,211,317,227,314,242,308,256,300,268,291,276,282,283,273,290,262,296,249,304,233,315,233,311,338,300,338,298,333,294,328,289,325,283,322,277,321,274,322,270,322,266,323,261,325,256,326,243,331,230,334,218,336,204,338,189,338,161,336,135,331,111,322,89,310,70,295,51,275,36,251,25,225,19,195,16,164,18,135,23,110,31,86,42,65,57,46,79,28,105,13,133,2,162,-4,193,-6,223,-5,251,0,278,6,301,16,320,28,320,128,321,144,324,156,330,162,340,166,354,168,
 16,164,18,135,19,195,19,195,18,135,23,110,19,195,23,110,25,225,25,225,23,110,31,86,25,225,31,86,36,251,36,251,31,86,42,65,36,251,42,65,51,275,51,275,42,65,57,46,51,275,57,46,70,295,70,295,57,46,73,162,157,312,161,336,140,305,140,305,161,336,135,331,140,305,135,331,125,295,125,295,135,331,112,283,97,266,112,283,111,322,97,266,111,322,89,310,89,310,70,295,75,191,89,310,75,191,79,219,89,310,79,219,86,244,89,310,86,244,97,266,193,-6,204,13,162,-4,162,-4,204,13,161,19,162,-4,161,19,133,2,133,2,161,19,124,39,133,2,124,39,105,13,105,13,124,39,97,69,105,13,97,69,79,28,79,28,97,69,79,111,79,28,79,111,73,162,259,25,244,19,251,0,251,0,244,19,226,14,251,0,226,14,223,-5,223,-5,226,14,204,13,73,162,57,46,79,28,268,291,266,323,261,325,268,291,261,325,256,300,268,291,270,322,266,323,204,338,195,318,211,317,204,338,211,317,218,336,218,336,211,317,227,314,218,336,227,314,230,334,230,334,227,314,242,308,230,334,242,308,243,331,243,331,242,308,256,300,243,331,256,300,256,326,256,326,256,300,261,325,270,322,276,282,274,322,274,322,276,282,277,321,283,322,277,321,283,273,283,322,283,273,290,262,268,291,276,282,270,322,304,233,315,233,311,338,304,233,311,338,300,338,304,233,300,338,298,333,304,233,298,333,296,249,294,328,289,325,290,262,294,328,290,262,296,249,294,328,296,249,298,333,277,321,276,282,283,273,340,166,354,168,354,177,340,166,354,177,330,162,330,162,354,177,270,142,330,162,270,142,271,122,278,6,271,122,271,44,278,6,271,44,268,34,330,162,271,122,324,156,324,156,271,122,278,6,324,156,278,6,321,144,321,144,278,6,301,16,321,144,301,16,320,128,320,128,301,16,320,28,354,177,227,177,246,166,354,177,246,166,259,162,354,177,259,162,267,154,354,177,267,154,270,142,259,25,251,0,278,6,259,25,278,6,268,34,189,338,161,336,175,317,189,338,175,317,195,318,189,338,195,318,204,338,135,331,111,322,112,283,161,336,157,312,175,317,223,-5,204,13,193,-6,246,166,227,177,227,168,283,322,290,262,289,325,75,191,70,295,73,162,
-352,0,352,9,333,12,320,17,312,25,308,37,307,55,307,274,308,293,312,307,320,315,333,319,352,321,352,331,211,331,211,321,231,319,244,315,251,307,255,294,256,274,256,180,104,180,104,274,106,294,110,307,118,315,130,319,149,321,149,331,9,331,9,321,28,319,41,315,49,307,53,294,54,274,54,61,53,39,49,25,42,16,29,12,9,9,9,0,148,0,148,9,129,12,117,17,109,25,105,38,104,56,104,157,256,157,256,62,255,41,252,26,244,17,232,12,212,9,212,0,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,177,331,33,331,33,321,54,319,67,315,75,308,79,295,80,275,80,47,79,34,78,24,75,17,69,13,61,12,56,13,53,16,51,21,48,27,46,34,42,41,38,47,33,52,28,54,22,55,14,54,7,50,2,44,-1,37,-2,29,0,16,6,6,17,0,31,-5,
+352,0,352,9,333,12,320,17,312,25,308,37,307,55,307,274,308,293,312,307,320,315,333,319,352,321,352,331,211,331,211,321,231,319,244,315,251,307,255,294,256,274,256,180,104,180,104,274,106,294,110,307,118,315,130,319,149,321,149,331,9,331,9,321,28,319,41,315,49,307,53,294,54,274,54,61,53,39,49,25,42,16,29,12,9,9,9,0,148,0,148,9,129,12,117,17,109,25,105,38,104,56,104,157,256,157,256,62,255,41,252,26,244,17,232,12,212,9,212,0,
 49,25,42,16,148,0,148,0,42,16,29,12,148,0,29,12,9,9,149,331,9,331,28,319,149,331,28,319,41,315,149,331,41,315,49,307,149,331,49,307,53,294,149,331,53,294,118,315,149,331,118,315,130,319,149,331,130,319,149,321,54,274,105,38,104,56,104,180,104,157,256,157,104,180,256,157,256,180,256,180,256,157,312,25,256,180,312,25,308,37,54,274,104,56,104,274,54,274,104,274,106,294,54,274,106,294,110,307,54,274,110,307,118,315,54,274,118,315,53,294,252,26,244,17,352,0,352,0,244,17,232,12,352,0,232,12,212,9,333,319,352,321,352,331,333,319,352,331,320,315,320,315,352,331,255,294,320,315,255,294,256,274,308,37,256,274,256,180,307,55,307,274,256,274,256,274,307,274,308,293,256,274,308,293,312,307,352,331,211,331,231,319,352,331,231,319,244,315,352,331,244,315,251,307,352,331,251,307,255,294,352,0,352,9,333,12,352,0,333,12,320,17,352,0,320,17,255,41,352,0,255,41,252,26,256,62,255,41,320,17,256,62,320,17,312,25,256,62,312,25,256,157,148,0,148,9,129,12,148,0,129,12,117,17,148,0,117,17,53,39,148,0,53,39,49,25,54,61,53,39,117,17,54,61,117,17,109,25,54,61,109,25,105,38,54,61,105,38,54,274,148,0,9,9,9,0,352,0,212,9,212,0,256,274,308,37,307,55,231,319,211,331,211,321,320,315,256,274,312,307,28,319,9,331,9,321,
-157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,177,331,33,331,33,321,54,319,67,315,75,308,79,295,80,275,80,47,79,34,78,24,75,17,69,13,61,12,56,13,53,16,51,21,48,27,46,34,42,41,38,47,33,52,28,54,22,55,14,54,7,50,2,44,
+157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,
 52,23,44,15,157,0,157,0,44,15,30,11,157,0,30,11,9,9,157,331,9,331,30,320,157,331,30,320,44,316,157,331,44,316,53,308,157,331,53,308,57,295,157,331,57,295,122,316,157,331,122,316,136,320,157,331,136,320,157,321,122,16,114,24,57,56,57,56,114,24,109,37,57,56,109,37,57,276,57,276,109,37,108,56,57,276,108,56,108,276,57,276,108,276,109,295,57,276,109,295,113,308,57,276,113,308,122,316,57,276,122,316,57,295,157,0,157,9,137,11,157,0,137,11,122,16,157,0,122,16,56,36,157,0,56,36,52,23,157,0,9,9,9,0,56,36,122,16,57,56,30,320,9,331,9,321,
-177,331,33,331,33,321,54,319,67,315,75,308,79,295,80,275,80,47,79,34,78,24,75,17,69,13,61,12,56,13,53,16,51,21,48,27,46,34,42,41,38,47,33,52,28,54,22,55,14,54,7,50,2,44,-1,37,-2,29,0,16,6,6,17,0,31,-5,47,-6,76,-2,100,8,117,28,128,56,131,93,131,275,132,294,136,307,143,315,157,319,177,321,362,0,362,9,349,11,336,16,322,25,305,41,283,64,166,192,259,281,278,298,292,309,305,316,320,320,338,321,338,331,208,331,208,321,220,321,229,320,235,318,238,315,240,311,241,305,239,298,234,289,226,280,202,256,113,174,113,293,117,307,124,315,137,319,158,321,158,331,17,331,17,321,37,319,50,315,57,306,61,293,62,275,62,63,61,40,57,26,50,17,
+177,331,33,331,33,321,54,319,67,315,75,308,79,295,80,275,80,47,79,34,78,24,75,17,69,13,61,12,56,13,53,16,51,21,48,27,46,34,42,41,38,47,33,52,28,54,22,55,14,54,7,50,2,44,-1,37,-2,29,0,16,6,6,17,0,31,-5,47,-6,76,-2,100,8,117,28,128,56,131,93,131,275,132,294,136,307,143,315,157,319,177,321,
 78,24,75,17,76,-2,76,-2,75,17,69,13,76,-2,69,13,61,12,61,12,56,13,76,-2,76,-2,56,13,47,-6,157,319,177,321,177,331,157,319,177,331,143,315,143,315,177,331,79,295,143,315,79,295,80,275,100,8,80,275,80,47,100,8,80,47,79,34,131,275,132,294,117,28,131,275,117,28,128,56,131,275,128,56,131,93,132,294,136,307,80,275,132,294,80,275,100,8,132,294,100,8,117,28,177,331,33,331,54,319,177,331,54,319,67,315,177,331,67,315,75,308,177,331,75,308,79,295,78,24,76,-2,100,8,78,24,100,8,79,34,47,-6,56,13,53,16,47,-6,53,16,51,21,47,-6,51,21,48,27,47,-6,48,27,46,34,47,-6,46,34,42,41,47,-6,42,41,38,47,47,-6,38,47,33,52,47,-6,33,52,31,-5,33,52,28,54,31,-5,31,-5,28,54,22,55,31,-5,22,55,17,0,17,0,22,55,14,54,17,0,14,54,7,50,17,0,7,50,6,6,6,6,7,50,2,44,6,6,2,44,0,16,0,16,2,44,-1,37,0,16,-1,37,-2,29,54,319,33,331,33,321,143,315,80,275,136,307,
-362,0,362,9,349,11,336,16,322,25,305,41,283,64,166,192,259,281,278,298,292,309,305,316,320,320,338,321,338,331,208,331,208,321,220,321,229,320,235,318,238,315,240,311,241,305,239,298,234,289,226,280,202,256,113,174,113,293,117,307,124,315,137,319,158,321,158,331,17,331,17,321,37,319,50,315,57,306,61,293,62,275,62,63,61,40,57,26,50,17,36,12,17,9,17,0,157,0,157,9,139,12,126,16,118,23,114,36,113,55,113,148,126,158,176,107,198,84,217,63,232,46,241,32,244,22,244,18,241,15,237,12,231,11,224,10,210,9,210,0,299,87,286,87,277,69,273,62,265,50,254,39,239,30,223,24,203,21,180,20,127,20,114,22,106,26,102,32,100,42,100,274,101,294,105,307,113,315,127,319,147,321,147,331,6,331,6,321,26,319,38,314,46,306,49,292,50,273,50,57,49,38,45,25,37,16,25,12,6,9,6,0,275,0,432,0,432,9,413,12,401,17,393,25,389,38,388,56,388,275,389,294,393,307,401,316,413,320,431,321,431,331,332,331,222,80,106,331,7,331,7,321,28,319,42,315,50,307,54,294,55,275,55,75,54,47,49,29,41,18,27,12,6,9,6,0,123,0,123,9,
+362,0,362,9,349,11,336,16,322,25,305,41,283,64,166,192,259,281,278,298,292,309,305,316,320,320,338,321,338,331,208,331,208,321,220,321,229,320,235,318,238,315,240,311,241,305,239,298,234,289,226,280,202,256,113,174,113,293,117,307,124,315,137,319,158,321,158,331,17,331,17,321,37,319,50,315,57,306,61,293,62,275,62,63,61,40,57,26,50,17,36,12,17,9,17,0,157,0,157,9,139,12,126,16,118,23,114,36,113,55,113,148,126,158,176,107,198,84,217,63,232,46,241,32,244,22,244,18,241,15,237,12,231,11,224,10,210,9,210,0,
 158,321,158,321,137,319,137,319,158,321,158,331,137,319,158,331,124,315,124,315,158,331,61,293,124,315,61,293,62,275,114,36,62,275,62,63,114,36,62,63,118,23,118,23,62,63,126,16,62,275,114,36,113,55,113,174,113,148,126,158,113,174,126,158,202,256,202,256,126,158,166,192,202,256,166,192,259,281,62,275,113,55,113,274,62,275,113,274,113,293,62,275,113,293,117,307,62,275,117,307,124,315,158,331,17,331,37,319,158,331,37,319,50,315,158,331,50,315,57,306,158,331,57,306,61,293,234,289,226,280,259,281,259,281,226,280,215,269,259,281,215,269,202,256,338,331,208,331,220,321,338,331,220,321,229,320,338,331,229,320,235,318,338,331,235,318,238,315,338,331,238,315,240,311,338,331,240,311,241,305,338,331,241,305,305,316,338,331,305,316,320,320,338,331,320,320,338,321,241,305,259,281,278,298,241,305,278,298,292,309,241,305,292,309,305,316,239,298,234,289,259,281,239,298,259,281,241,305,241,15,237,12,362,0,362,0,237,12,231,11,362,0,231,11,224,10,244,22,362,0,336,16,244,22,336,16,322,25,244,22,322,25,305,41,244,22,305,41,283,64,244,22,283,64,241,32,283,64,166,192,176,107,283,64,176,107,198,84,283,64,198,84,217,63,283,64,217,63,232,46,283,64,232,46,241,32,349,11,336,16,362,0,349,11,362,0,362,9,244,18,241,15,362,0,244,18,362,0,244,22,210,9,210,0,362,0,210,9,362,0,224,10,157,0,157,9,139,12,157,0,139,12,126,16,157,0,126,16,61,40,157,0,61,40,57,26,157,0,57,26,50,17,157,0,50,17,36,12,157,0,36,12,17,9,157,0,17,9,17,0,61,40,126,16,62,63,176,107,166,192,126,158,220,321,208,331,208,321,37,319,17,331,17,321,
-299,87,286,87,277,69,273,62,265,50,254,39,239,30,223,24,203,21,180,20,127,20,114,22,106,26,102,32,100,42,100,274,101,294,105,307,113,315,127,319,147,321,147,331,6,331,6,321,26,319,38,314,46,306,49,292,50,273,50,57,49,38,45,25,37,16,25,12,6,9,6,0,275,0,432,0,432,9,413,12,401,17,393,25,389,38,388,56,388,275,389,294,393,307,401,316,413,320,431,321,431,331,332,331,222,80,106,331,7,331,7,321,28,319,42,315,50,307,54,294,55,275,55,75,54,47,49,29,41,18,27,12,6,9,6,0,123,0,123,9,103,12,90,18,82,29,78,48,
+299,87,286,87,277,69,273,62,265,50,254,39,239,30,223,24,203,21,180,20,127,20,114,22,106,26,102,32,100,42,100,274,101,294,105,307,113,315,127,319,147,321,147,331,6,331,6,321,26,319,38,314,46,306,49,292,50,273,50,57,49,38,45,25,37,16,25,12,6,9,6,0,275,0,
 147,321,147,321,127,319,127,319,147,321,147,331,127,319,147,331,113,315,113,315,147,331,49,292,113,315,49,292,50,273,102,32,50,273,50,57,102,32,50,57,106,26,106,26,50,57,49,38,106,26,49,38,114,22,114,22,49,38,45,25,114,22,45,25,127,20,127,20,45,25,275,0,127,20,275,0,146,20,146,20,275,0,180,20,100,42,100,274,50,273,50,273,100,274,101,294,50,273,101,294,105,307,147,331,6,331,26,319,147,331,26,319,38,314,147,331,38,314,46,306,147,331,46,306,49,292,277,69,273,62,275,0,275,0,273,62,269,56,275,0,269,56,265,50,265,50,254,39,275,0,275,0,254,39,239,30,275,0,239,30,223,24,299,87,286,87,281,77,299,87,281,77,277,69,299,87,277,69,275,0,203,21,180,20,275,0,203,21,275,0,223,24,275,0,45,25,37,16,275,0,37,16,25,12,275,0,25,12,6,9,275,0,6,9,6,0,50,273,102,32,100,42,26,319,6,331,6,321,113,315,50,273,105,307,
-432,0,432,9,413,12,401,17,393,25,389,38,388,56,388,275,389,294,393,307,401,316,413,320,431,321,431,331,332,331,222,80,106,331,7,331,7,321,28,319,42,315,50,307,54,294,55,275,55,75,54,47,49,29,41,18,27,12,6,9,6,0,123,0,123,9,103,12,90,18,82,29,78,48,76,75,76,275,203,0,209,0,337,286,337,61,336,40,333,26,325,17,312,12,292,9,292,0,353,331,235,331,235,321,247,320,256,319,263,317,275,309,278,303,281,295,283,285,284,274,284,89,91,331,6,331,6,321,19,321,29,318,37,313,46,306,55,295,55,75,54,48,49,30,41,19,27,13,6,9,6,0,123,0,123,9,103,13,90,20,82,31,78,49,76,75,76,269,297,-5,306,-5,306,274,308,289,311,299,315,307,320,313,324,315,329,318,335,319,343,320,353,321,344,166,336,222,
+432,0,432,9,413,12,401,17,393,25,389,38,388,56,388,275,389,294,393,307,401,316,413,320,431,321,431,331,332,331,222,80,106,331,7,331,7,321,28,319,42,315,50,307,54,294,55,275,55,75,54,47,49,29,41,18,27,12,6,9,6,0,123,0,123,9,103,12,90,18,82,29,78,48,76,75,76,275,203,0,209,0,337,286,337,61,336,40,333,26,325,17,312,12,292,9,292,0,
 49,29,41,18,123,0,123,0,41,18,27,12,123,0,27,12,6,9,333,26,325,17,432,0,432,0,325,17,312,12,432,0,312,12,292,9,413,320,431,321,431,331,413,320,431,331,401,316,401,316,431,331,337,286,401,316,337,286,393,307,393,307,337,286,389,294,401,17,393,25,337,61,337,61,393,25,389,38,337,61,389,38,337,286,337,286,389,38,388,56,337,286,388,56,388,275,203,0,209,0,222,80,222,80,209,0,337,286,222,80,337,286,332,331,332,331,337,286,431,331,106,331,7,331,28,319,106,331,28,319,42,315,106,331,42,315,50,307,106,331,50,307,54,294,106,331,54,294,55,275,106,331,55,275,76,275,106,331,76,275,203,0,106,331,203,0,222,80,76,75,76,275,55,275,76,75,55,275,78,48,78,48,55,275,55,75,78,48,55,75,82,29,82,29,55,75,54,47,82,29,54,47,90,18,90,18,54,47,49,29,90,18,49,29,123,0,432,0,432,9,413,12,432,0,413,12,401,17,432,0,401,17,336,40,432,0,336,40,333,26,103,12,90,18,123,0,103,12,123,0,123,9,123,0,6,9,6,0,432,0,292,9,292,0,336,40,401,17,337,61,28,319,7,331,7,321,389,294,337,286,388,275,
-353,331,235,331,235,321,247,320,256,319,263,317,275,309,278,303,281,295,283,285,284,274,284,89,91,331,6,331,6,321,19,321,29,318,37,313,46,306,55,295,55,75,54,48,49,30,41,19,27,13,6,9,6,0,123,0,123,9,103,13,90,20,82,31,78,49,76,75,76,269,297,-5,306,-5,306,274,308,289,311,299,315,307,320,313,324,315,329,318,335,319,343,320,353,321,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,
+353,331,235,331,235,321,247,320,256,319,263,317,275,309,278,303,281,295,283,285,284,274,284,89,91,331,6,331,6,321,19,321,29,318,37,313,46,306,55,295,55,75,54,48,49,30,41,19,27,13,6,9,6,0,123,0,123,9,103,13,90,20,82,31,78,49,76,75,76,269,297,-5,306,-5,306,274,308,289,311,299,315,307,320,313,324,315,329,318,335,319,343,320,353,321,
 49,30,41,19,123,0,123,0,41,19,27,13,123,0,27,13,6,9,256,319,263,317,353,331,353,331,263,317,269,313,353,331,269,313,275,309,275,309,278,303,353,331,353,331,278,303,281,295,353,331,281,295,324,315,324,315,281,295,320,313,324,315,320,313,320,312,320,312,320,313,315,307,315,307,320,313,284,274,315,307,284,274,284,259,297,-5,284,259,284,89,297,-5,284,89,91,331,353,331,324,315,329,318,353,331,329,318,335,319,353,331,335,319,343,320,353,331,343,320,353,321,306,-5,306,253,297,-5,297,-5,306,253,306,274,297,-5,306,274,284,259,284,259,306,274,308,289,284,259,308,289,311,299,283,285,284,274,320,313,283,285,320,313,281,295,247,320,256,319,353,331,247,320,353,331,235,331,247,320,235,331,235,321,91,331,6,331,19,321,91,331,19,321,29,318,91,331,29,318,37,313,91,331,37,313,46,306,91,331,46,306,55,295,91,331,55,295,76,269,91,331,76,269,297,-5,55,295,78,49,76,75,54,48,49,30,90,20,90,20,49,30,123,0,90,20,123,0,103,13,103,13,123,0,123,9,55,75,54,48,82,31,55,75,82,31,78,49,55,75,78,49,55,295,123,0,6,9,6,0,54,48,90,20,82,31,19,321,6,331,6,321,76,269,55,295,76,75,315,307,284,259,311,299,
-344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,8,331,8,321,27,319,39,315,46,307,49,294,50,276,50,39,47,25,40,16,27,12,8,9,8,0,148,0,148,9,128,12,114,16,106,24,102,37,101,56,101,146,109,145,115,145,122,144,136,144,164,145,188,147,208,153,225,161,243,175,253,185,260,197,266,210,270,225,271,240,270,254,267,268,262,280,255,291,246,300,231,310,213,319,191,325,166,329,137,331,16383,16383,101,295,101,302,103,307,106,310,111,312,118,313,155,310,182,302,202,288,213,266,217,238,213,213,202,192,185,177,162,167,132,164,120,164,
+344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,
 149,314,180,338,134,308,134,308,180,338,126,330,134,308,126,330,121,298,121,298,126,330,108,286,97,269,108,286,126,330,97,269,126,330,81,307,81,102,81,24,90,75,90,75,81,24,126,1,90,75,126,1,103,52,103,52,126,1,119,33,130,25,119,33,126,1,130,25,126,1,180,-6,207,316,235,330,194,319,194,319,235,330,180,320,164,318,180,320,180,338,164,318,180,338,149,314,81,307,46,271,46,61,81,307,46,61,74,166,81,307,74,166,76,194,81,307,76,194,80,222,81,307,80,222,87,247,81,307,87,247,97,269,81,102,76,132,81,24,81,24,76,132,74,166,24,109,46,61,46,271,24,109,46,271,24,224,24,109,24,224,17,167,223,19,209,15,234,1,234,1,209,15,196,12,234,1,196,12,181,11,181,11,167,12,180,-6,180,-6,167,12,154,15,180,-6,154,15,142,19,207,316,219,311,235,330,235,330,219,311,231,305,235,330,231,305,242,296,242,296,257,279,280,306,280,306,257,279,270,257,280,306,270,257,279,231,235,330,180,338,180,320,280,103,272,76,279,24,279,24,272,76,260,53,279,24,260,53,246,35,246,35,235,26,279,24,279,24,235,26,234,1,344,166,336,222,336,108,336,108,336,222,314,269,336,108,314,269,314,60,314,60,314,269,287,169,285,201,287,169,314,269,285,201,314,269,280,306,285,201,280,306,279,231,280,306,235,330,242,296,314,60,287,169,285,134,314,60,285,134,280,103,314,60,280,103,279,24,181,11,180,-6,234,1,81,24,74,166,46,61,223,19,234,1,235,26,130,25,180,-6,142,19,
-8,331,8,321,27,319,39,315,46,307,49,294,50,276,50,39,47,25,40,16,27,12,8,9,8,0,148,0,148,9,128,12,114,16,106,24,102,37,101,56,101,146,109,145,115,145,122,144,136,144,164,145,188,147,208,153,225,161,243,175,253,185,260,197,266,210,270,225,271,240,270,254,267,268,262,280,255,291,246,300,231,310,213,319,191,325,166,329,137,331,16383,16383,101,295,101,302,103,307,106,310,111,312,118,313,155,310,182,302,202,288,213,266,217,238,213,213,202,192,185,177,162,167,132,164,120,164,114,165,108,165,101,166,350,-88,350,-78,318,-74,288,-65,261,-51,236,-30,213,-2,232,1,248,6,263,12,277,21,290,32,309,54,324,77,335,104,342,133,344,166,336,224,314,272,279,308,234,330,180,338,127,330,82,308,47,272,25,224,17,166,18,140,23,115,31,92,42,70,55,50,67,36,79,25,94,16,111,7,132,0,153,-25,177,-48,206,-66,241,-78,282,-85,326,-88,16383,16383,287,169,285,139,281,111,275,85,266,64,255,47,243,35,230,25,215,18,198,13,180,11,163,13,146,18,129,26,115,37,103,50,93,68,85,89,79,113,75,139,74,167,76,196,
+8,331,8,321,27,319,39,315,46,307,49,294,50,276,50,39,47,25,40,16,27,12,8,9,8,0,148,0,148,9,128,12,114,16,106,24,102,37,101,56,101,146,109,145,115,145,122,144,136,144,164,145,188,147,208,153,225,161,243,175,253,185,260,197,266,210,270,225,271,240,270,254,267,268,262,280,255,291,246,300,231,310,213,319,191,325,166,329,137,331,16383,16383,101,295,101,302,103,307,106,310,111,312,118,313,155,310,182,302,202,288,213,266,217,238,213,213,202,192,185,177,162,167,132,164,120,164,114,165,108,165,101,166,
 111,312,118,312,118,313,137,331,118,313,155,310,137,331,155,310,166,329,166,329,155,310,182,302,166,329,182,302,191,325,191,325,182,302,202,288,191,325,202,288,213,319,213,319,202,288,213,266,213,319,213,266,231,310,231,310,213,266,217,238,231,310,217,238,225,161,225,161,213,213,208,153,208,153,213,213,202,192,208,153,202,192,188,147,188,147,202,192,185,177,188,147,185,177,164,145,164,145,185,177,162,167,164,145,162,167,136,144,136,144,162,167,132,164,136,144,132,164,128,144,128,144,132,164,126,164,128,144,126,164,122,144,122,144,126,164,120,164,122,144,120,164,115,145,115,145,120,164,114,165,115,145,114,165,109,145,109,145,114,165,108,165,109,145,108,165,101,166,101,56,101,166,50,276,101,56,50,276,102,37,102,37,50,276,50,61,101,166,101,146,109,145,271,240,270,254,270,225,270,225,270,254,267,268,270,225,267,268,266,210,266,210,267,268,262,280,266,210,262,280,260,197,260,197,262,280,255,291,260,197,255,291,253,185,253,185,255,291,246,300,253,185,246,300,243,175,243,175,246,300,231,310,243,175,231,310,225,161,137,331,8,331,27,319,137,331,27,319,39,315,137,331,39,315,46,307,137,331,46,307,49,294,137,331,49,294,50,276,137,331,50,276,106,310,137,331,106,310,111,312,137,331,111,312,118,313,101,295,101,302,50,276,101,295,50,276,101,166,103,307,106,310,50,276,103,307,50,276,101,302,148,0,148,9,128,12,148,0,128,12,114,16,148,0,114,16,50,39,148,0,50,39,47,25,148,0,47,25,40,16,148,0,40,16,27,12,148,0,27,12,8,9,148,0,8,9,8,0,50,61,50,39,114,16,50,61,114,16,106,24,50,61,106,24,102,37,27,319,8,331,8,321,213,213,225,161,217,238,155,310,118,313,118,312,
-350,-88,350,-78,318,-74,288,-65,261,-51,236,-30,213,-2,232,1,248,6,263,12,277,21,290,32,309,54,324,77,335,104,342,133,344,166,336,224,314,272,279,308,234,330,180,338,127,330,82,308,47,272,25,224,17,166,18,140,23,115,31,92,42,70,55,50,67,36,79,25,94,16,111,7,132,0,153,-25,177,-48,206,-66,241,-78,282,-85,326,-88,16383,16383,287,169,285,139,281,111,275,85,266,64,255,47,243,35,230,25,215,18,198,13,180,11,163,13,146,18,129,26,115,37,103,50,93,68,85,89,79,113,75,139,74,167,76,196,80,222,87,247,96,268,107,285,119,297,133,307,147,314,163,318,179,320,193,319,206,316,219,312,231,306,242,297,257,280,270,258,279,232,285,202,287,169,330,0,330,9,318,11,308,13,299,17,291,24,283,33,183,160,216,168,242,180,260,197,270,217,273,242,272,255,270,268,265,281,258,292,249,301,234,311,217,319,196,326,172,330,145,331,8,331,8,321,28,319,40,315,47,307,50,294,51,276,51,62,50,40,47,25,39,16,27,12,8,9,8,0,147,0,147,9,127,12,114,16,107,24,103,37,102,56,102,153,130,154,249,0,16383,16383,102,291,103,300,106,306,111,310,118,312,127,313,161,310,186,302,205,289,215,270,219,246,218,231,214,218,208,206,200,196,190,189,177,182,163,177,147,174,128,172,102,171,234,232,224,338,213,338,211,332,209,327,206,324,202,322,197,321,194,321,190,322,185,323,175,327,164,331,154,334,134,338,123,338,
+350,-88,350,-78,318,-74,288,-65,261,-51,236,-30,213,-2,232,1,248,6,263,12,277,21,290,32,309,54,324,77,335,104,342,133,344,166,336,224,314,272,279,308,234,330,180,338,127,330,82,308,47,272,25,224,17,166,18,140,23,115,31,92,42,70,55,50,67,36,79,25,94,16,111,7,132,0,153,-25,177,-48,206,-66,241,-78,282,-85,326,-88,16383,16383,287,169,285,139,281,111,275,85,266,64,255,47,243,35,230,25,215,18,198,13,180,11,163,13,146,18,129,26,115,37,103,50,93,68,85,89,79,113,75,139,74,167,76,196,80,222,87,247,96,268,107,285,119,297,133,307,147,314,163,318,179,320,193,319,206,316,219,312,231,306,242,297,257,280,270,258,279,232,285,202,287,169,
 79,113,79,25,85,89,85,89,79,25,94,16,85,89,94,16,93,68,93,68,94,16,103,50,115,37,103,50,111,7,115,37,111,7,132,0,79,113,75,139,79,25,79,25,75,139,74,167,67,36,74,167,76,196,67,36,76,196,55,50,55,50,76,196,82,308,55,50,82,308,47,272,147,314,180,338,133,307,133,307,180,338,127,330,133,307,127,330,119,297,119,297,127,330,107,285,96,268,107,285,127,330,96,268,127,330,82,308,129,26,132,0,146,18,146,18,132,0,153,-25,146,18,153,-25,163,13,163,13,153,-25,177,-48,163,13,177,-48,180,11,180,11,177,-48,206,-66,180,11,206,-66,198,13,234,330,180,338,193,319,193,319,180,338,179,320,163,318,179,320,180,338,163,318,180,338,147,314,206,316,219,312,234,330,234,330,219,312,231,306,234,330,231,306,242,297,242,297,257,280,279,308,279,308,257,280,270,258,279,308,270,258,279,232,232,1,248,6,243,35,243,35,248,6,255,47,266,64,255,47,263,12,266,64,263,12,277,21,236,-30,213,-2,241,-78,215,18,213,-2,232,1,215,18,232,1,230,25,230,25,232,1,243,35,206,-66,241,-78,213,-2,206,-66,213,-2,215,18,206,-66,215,18,198,13,336,224,314,272,324,77,336,224,324,77,335,104,336,224,335,104,342,133,336,224,342,133,344,166,285,139,290,32,287,169,287,169,290,32,314,272,314,272,290,32,309,54,314,272,309,54,324,77,285,202,287,169,314,272,285,202,314,272,279,308,285,202,279,308,279,232,279,308,234,330,242,297,281,111,275,85,277,21,281,111,277,21,290,32,281,111,290,32,285,139,255,47,248,6,263,12,326,-88,350,-88,350,-78,326,-88,350,-78,318,-74,326,-88,318,-74,288,-65,326,-88,288,-65,282,-85,261,-51,236,-30,241,-78,261,-51,241,-78,282,-85,261,-51,282,-85,288,-65,82,308,76,196,80,222,82,308,80,222,87,247,82,308,87,247,96,268,18,140,23,115,25,224,25,224,23,115,31,92,25,224,31,92,47,272,47,272,31,92,42,70,47,272,42,70,55,50,103,50,94,16,111,7,18,140,25,224,17,166,266,64,277,21,275,85,234,330,193,319,206,316,115,37,132,0,129,26,79,25,74,167,67,36,
-330,0,330,9,318,11,308,13,299,17,291,24,283,33,183,160,216,168,242,180,260,197,270,217,273,242,272,255,270,268,265,281,258,292,249,301,234,311,217,319,196,326,172,330,145,331,8,331,8,321,28,319,40,315,47,307,50,294,51,276,51,62,50,40,47,25,39,16,27,12,8,9,8,0,147,0,147,9,127,12,114,16,107,24,103,37,102,56,102,153,130,154,249,0,16383,16383,102,291,103,300,106,306,111,310,118,312,127,313,161,310,186,302,205,289,215,270,219,246,218,231,214,218,208,206,200,196,190,189,177,182,163,177,147,174,128,172,102,171,234,232,224,338,213,338,211,332,209,327,206,324,202,322,197,321,194,321,190,322,185,323,175,327,164,331,154,334,134,338,123,338,95,334,71,323,52,305,40,281,36,251,38,232,44,214,56,196,73,180,97,165,116,154,135,142,152,130,168,118,180,107,185,100,189,93,192,85,194,77,195,67,192,49,184,33,172,21,155,14,136,11,109,15,85,25,65,42,47,67,32,99,22,99,36,-6,47,-6,48,0,50,4,53,7,57,9,61,10,64,10,79,7,84,4,96,0,107,-2,131,-6,143,-6,176,-2,204,10,226,29,240,55,246,86,243,108,233,128,218,148,
+330,0,330,9,318,11,308,13,299,17,291,24,283,33,183,160,216,168,242,180,260,197,270,217,273,242,272,255,270,268,265,281,258,292,249,301,234,311,217,319,196,326,172,330,145,331,8,331,8,321,28,319,40,315,47,307,50,294,51,276,51,62,50,40,47,25,39,16,27,12,8,9,8,0,147,0,147,9,127,12,114,16,107,24,103,37,102,56,102,153,130,154,249,0,16383,16383,102,291,103,300,106,306,111,310,118,312,127,313,161,310,186,302,205,289,215,270,219,246,218,231,214,218,208,206,200,196,190,189,177,182,163,177,147,174,128,172,102,171,
 118,312,127,312,127,313,145,331,127,313,161,310,145,331,161,310,172,330,172,330,161,310,186,302,172,330,186,302,196,326,196,326,186,302,205,289,196,326,205,289,217,319,217,319,205,289,215,270,217,319,215,270,219,246,214,218,208,206,216,168,216,168,208,206,200,196,216,168,200,196,190,189,190,189,177,182,183,160,183,160,177,182,163,177,183,160,163,177,249,0,249,0,163,177,147,174,249,0,147,174,130,154,130,154,147,174,128,172,130,154,128,172,102,171,265,281,258,292,260,197,260,197,258,292,249,301,260,197,249,301,242,180,242,180,249,301,234,311,242,180,234,311,219,246,219,246,234,311,217,319,214,218,216,168,218,231,218,231,216,168,242,180,218,231,242,180,219,246,270,217,273,242,272,255,270,217,272,255,270,268,270,217,270,268,265,281,270,217,265,281,260,197,190,189,183,160,216,168,318,11,308,13,330,0,330,0,308,13,299,17,330,0,299,17,249,0,249,0,299,17,291,24,249,0,291,24,283,33,102,56,102,171,51,276,102,56,51,276,103,37,103,37,51,276,51,62,102,171,102,153,130,154,145,331,8,331,28,319,145,331,28,319,40,315,145,331,40,315,47,307,145,331,47,307,50,294,145,331,50,294,51,276,145,331,51,276,111,310,145,331,111,310,118,312,145,331,118,312,127,313,102,291,103,300,51,276,102,291,51,276,102,171,106,306,111,310,51,276,106,306,51,276,103,300,147,0,147,9,127,12,147,0,127,12,114,16,147,0,114,16,50,40,147,0,50,40,47,25,147,0,47,25,39,16,147,0,39,16,27,12,147,0,27,12,8,9,147,0,8,9,8,0,51,62,50,40,114,16,51,62,114,16,107,24,51,62,107,24,103,37,28,319,8,331,8,321,183,160,249,0,283,33,318,11,330,0,330,9,161,310,127,313,127,312,
-234,232,224,338,213,338,211,332,209,327,206,324,202,322,197,321,194,321,190,322,185,323,175,327,164,331,154,334,134,338,123,338,95,334,71,323,52,305,40,281,36,251,38,232,44,214,56,196,73,180,97,165,116,154,135,142,152,130,168,118,180,107,185,100,189,93,192,85,194,77,195,67,192,49,184,33,172,21,155,14,136,11,109,15,85,25,65,42,47,67,32,99,22,99,36,-6,47,-6,48,0,50,4,53,7,57,9,61,10,64,10,79,7,84,4,96,0,107,-2,131,-6,143,-6,176,-2,204,10,226,29,240,55,246,86,243,108,233,128,218,148,196,166,168,185,139,202,114,218,95,234,83,251,79,270,81,286,88,299,98,309,112,315,129,318,146,316,162,310,177,302,190,291,201,278,206,271,211,263,215,254,218,244,222,232,296,246,293,331,12,331,8,246,21,246,27,274,37,292,50,303,70,309,97,310,127,310,127,61,126,39,123,25,115,16,101,12,80,9,80,0,226,0,226,9,205,11,192,16,183,23,179,36,178,55,178,310,208,310,235,309,254,303,268,292,277,274,285,246,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,
+234,232,224,338,213,338,211,332,209,327,206,324,202,322,197,321,194,321,190,322,185,323,175,327,164,331,154,334,134,338,123,338,95,334,71,323,52,305,40,281,36,251,38,232,44,214,56,196,73,180,97,165,116,154,135,142,152,130,168,118,180,107,185,100,189,93,192,85,194,77,195,67,192,49,184,33,172,21,155,14,136,11,109,15,85,25,65,42,47,67,32,99,22,99,36,-6,47,-6,48,0,50,4,53,7,57,9,61,10,64,10,79,7,84,4,96,0,107,-2,131,-6,143,-6,176,-2,204,10,226,29,240,55,246,86,243,108,233,128,218,148,196,166,168,185,139,202,114,218,95,234,83,251,79,270,81,286,88,299,98,309,112,315,129,318,146,316,162,310,177,302,190,291,201,278,206,271,211,263,215,254,218,244,222,232,
 50,4,53,7,65,42,65,42,53,7,57,9,65,42,57,9,61,10,61,10,64,10,65,42,65,42,64,10,69,9,65,42,69,9,85,25,85,25,69,9,74,8,85,25,74,8,79,7,95,234,83,251,97,165,97,165,83,251,79,270,73,180,79,270,71,323,73,180,71,323,56,196,56,196,71,323,52,305,56,196,52,305,44,214,44,214,52,305,40,281,44,214,40,281,38,232,38,232,40,281,36,251,81,286,88,299,95,334,95,334,88,299,98,309,95,334,98,309,123,338,123,338,98,309,112,315,123,338,112,315,129,318,129,318,146,316,134,338,134,338,146,316,144,336,81,286,95,334,71,323,81,286,71,323,79,270,134,338,123,338,129,318,144,336,146,316,154,334,154,334,146,316,162,310,154,334,162,310,164,331,164,331,162,310,177,302,164,331,177,302,175,327,175,327,177,302,180,325,95,234,97,165,114,218,114,218,97,165,116,154,114,218,116,154,139,202,139,202,116,154,135,142,139,202,135,142,152,130,136,11,119,-4,131,-6,136,11,131,-6,143,-6,136,11,109,15,119,-4,79,7,84,4,85,25,85,25,84,4,96,0,85,25,96,0,109,15,109,15,96,0,107,-2,109,15,107,-2,119,-4,36,-6,47,-6,47,67,47,67,47,-6,48,0,47,67,48,0,65,42,65,42,48,0,50,4,32,99,22,99,36,-6,32,99,36,-6,47,67,139,202,152,130,168,185,168,185,152,130,168,118,168,185,168,118,180,107,180,107,185,100,196,166,196,166,185,100,189,93,196,166,189,93,192,85,246,86,243,108,240,55,240,55,243,108,233,128,240,55,233,128,226,29,226,29,233,128,218,148,226,29,218,148,204,10,204,10,218,148,196,166,204,10,196,166,195,67,195,67,192,49,204,10,204,10,192,49,184,33,204,10,184,33,176,-2,176,-2,184,33,172,21,176,-2,172,21,155,14,196,166,192,85,194,77,196,166,194,77,195,67,196,166,168,185,180,107,155,14,136,11,143,-6,155,14,143,-6,176,-2,190,291,201,278,194,321,194,321,201,278,197,321,202,322,197,321,201,278,190,291,194,321,190,322,190,291,190,322,185,323,190,291,185,323,180,325,190,291,180,325,177,302,224,338,213,338,215,254,224,338,215,254,218,244,224,338,218,244,222,232,224,338,222,232,234,232,206,324,206,271,209,327,209,327,206,271,211,263,209,327,211,263,211,332,211,332,211,263,215,254,211,332,215,254,213,338,202,322,201,278,206,271,202,322,206,271,206,324,97,165,79,270,73,180,
-296,246,293,331,12,331,8,246,21,246,27,274,37,292,50,303,70,309,97,310,127,310,127,61,126,39,123,25,115,16,101,12,80,9,80,0,226,0,226,9,205,11,192,16,183,23,179,36,178,55,178,310,208,310,235,309,254,303,268,292,277,274,285,246,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,
+296,246,293,331,12,331,8,246,21,246,27,274,37,292,50,303,70,309,97,310,127,310,127,61,126,39,123,25,115,16,101,12,80,9,80,0,226,0,226,9,205,11,192,16,183,23,179,36,178,55,178,310,208,310,235,309,254,303,268,292,277,274,285,246,
 293,331,12,331,70,309,293,331,70,309,97,310,293,331,97,310,127,310,293,331,127,310,178,310,293,331,178,310,208,310,293,331,208,310,235,309,293,331,235,309,254,303,293,331,254,303,268,292,293,331,268,292,277,274,293,331,277,274,285,246,293,331,285,246,296,246,192,16,183,23,127,61,127,61,183,23,179,36,127,61,179,36,127,310,127,310,179,36,178,55,127,310,178,55,178,310,12,331,8,246,21,246,12,331,21,246,27,274,12,331,27,274,37,292,12,331,37,292,50,303,12,331,50,303,70,309,226,0,226,9,205,11,226,0,205,11,192,16,226,0,192,16,126,39,226,0,126,39,123,25,226,0,123,25,115,16,226,0,115,16,101,12,226,0,101,12,80,9,226,0,80,9,80,0,126,39,192,16,127,61,
-353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,297,62,302,81,305,104,305,258,306,282,310,300,318,311,331,318,353,321,349,331,247,331,247,321,258,321,268,319,276,316,281,310,282,301,282,295,281,289,279,282,276,274,273,265,200,80,123,252,116,269,110,283,106,292,104,300,104,305,105,310,107,314,112,317,118,319,127,320,141,321,141,331,8,331,8,321,21,320,31,316,41,307,50,291,62,267,184,-5,191,-5,302,276,311,295,319,308,328,316,338,320,349,321,466,331,368,331,368,321,381,320,391,318,397,314,401,308,402,301,402,294,401,287,399,280,397,271,394,262,331,93,259,275,255,289,253,295,252,300,251,304,253,310,257,315,265,318,276,320,290,321,290,331,157,331,
+353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,297,62,302,81,305,104,305,258,306,282,310,300,318,311,331,318,353,321,
 105,79,106,8,109,63,109,63,106,8,121,1,109,63,121,1,115,50,115,50,121,1,125,37,135,30,125,37,138,-3,135,30,138,-3,146,24,146,24,138,-3,157,-5,146,24,157,-5,158,19,158,19,157,-5,177,-6,158,19,177,-6,173,16,173,16,177,-6,189,15,208,16,189,15,204,-5,208,16,204,-5,227,0,103,118,103,275,93,16,103,118,93,16,104,97,104,97,93,16,106,8,104,97,106,8,105,79,125,37,121,1,138,-3,283,103,282,85,290,45,290,45,282,85,279,70,290,45,279,70,278,30,278,30,279,70,273,57,278,30,273,57,265,45,265,45,254,34,264,17,264,17,254,34,247,6,241,26,225,20,227,0,241,26,227,0,247,6,241,26,247,6,254,34,353,331,237,331,257,319,353,331,257,319,270,312,353,331,270,312,279,301,353,331,279,301,318,311,353,331,318,311,331,318,353,331,331,318,353,321,305,258,306,282,297,62,305,258,297,62,302,81,305,258,302,81,305,104,305,258,305,104,305,131,290,45,297,62,306,282,290,45,306,282,283,257,290,45,283,257,283,125,290,45,283,125,283,103,310,300,318,311,282,283,310,300,282,283,283,257,310,300,283,257,306,282,265,45,264,17,278,30,189,15,177,-6,204,-5,128,319,148,321,148,331,128,319,148,331,115,314,115,314,148,331,51,297,115,314,51,297,52,280,53,95,52,280,52,124,58,69,66,48,104,293,104,293,66,48,78,30,104,293,78,30,103,275,103,275,78,30,93,16,104,293,108,306,52,280,104,293,52,280,53,95,104,293,53,95,58,69,148,331,7,331,27,319,148,331,27,319,40,315,148,331,40,315,47,308,148,331,47,308,51,297,27,319,7,331,7,321,115,314,52,280,108,306,257,319,237,331,237,321,318,311,279,301,282,283,208,16,227,0,225,20,
-349,331,247,331,247,321,258,321,268,319,276,316,281,310,282,301,282,295,281,289,279,282,276,274,273,265,200,80,123,252,116,269,110,283,106,292,104,300,104,305,105,310,107,314,112,317,118,319,127,320,141,321,141,331,8,331,8,321,21,320,31,316,41,307,50,291,62,267,184,-5,191,-5,302,276,311,295,319,308,328,316,338,320,349,321,466,331,368,331,368,321,381,320,391,318,397,314,401,308,402,301,402,294,401,287,399,280,397,271,394,262,331,93,259,275,255,289,253,295,252,300,251,304,253,310,257,315,265,318,276,320,290,321,290,331,157,331,157,321,171,320,182,317,191,309,199,295,208,273,222,236,170,94,98,282,96,288,95,293,93,298,93,311,96,316,102,319,111,321,
+349,331,247,331,247,321,258,321,268,319,276,316,281,310,282,301,282,295,281,289,279,282,276,274,273,265,200,80,123,252,116,269,110,283,106,292,104,300,104,305,105,310,107,314,112,317,118,319,127,320,141,321,141,331,8,331,8,321,21,320,31,316,41,307,50,291,62,267,184,-5,191,-5,302,276,311,295,319,308,328,316,338,320,349,321,
 62,267,184,-5,62,267,62,267,184,-5,104,300,62,267,104,300,104,305,104,305,105,310,62,267,62,267,105,310,107,314,62,267,107,314,50,291,141,331,8,331,21,320,141,331,21,320,31,316,141,331,31,316,41,307,141,331,41,307,50,291,141,331,50,291,112,317,141,331,112,317,118,319,141,331,118,319,127,320,141,331,127,320,141,321,281,289,279,282,302,276,302,276,279,282,276,274,302,276,276,274,273,265,273,265,200,80,302,276,302,276,200,80,191,-5,349,331,247,331,258,321,349,331,258,321,268,319,349,331,268,319,276,316,349,331,276,316,281,310,349,331,281,310,282,301,349,331,282,301,328,316,349,331,328,316,338,320,349,331,338,320,349,321,282,301,302,276,311,295,282,301,311,295,319,308,282,301,319,308,328,316,282,295,281,289,302,276,282,295,302,276,282,301,184,-5,191,-5,200,80,184,-5,200,80,123,252,184,-5,123,252,116,269,184,-5,116,269,110,283,184,-5,110,283,106,292,184,-5,106,292,104,300,258,321,247,331,247,321,21,320,8,331,8,321,112,317,50,291,107,314,
-466,331,368,331,368,321,381,320,391,318,397,314,401,308,402,301,402,294,401,287,399,280,397,271,394,262,331,93,259,275,255,289,253,295,252,300,251,304,253,310,257,315,265,318,276,320,290,321,290,331,157,331,157,321,171,320,182,317,191,309,199,295,208,273,222,236,170,94,98,282,96,288,95,293,93,298,93,311,96,316,102,319,111,321,124,321,124,331,2,331,2,321,16,320,27,314,36,303,45,286,55,262,73,210,92,157,132,49,151,-5,158,-5,235,206,251,165,267,123,299,37,315,-5,323,-5,344,61,361,111,377,158,397,212,425,286,430,299,436,308,443,314,453,318,466,321,352,0,352,9,338,12,327,16,317,22,307,32,296,46,200,184,272,272,289,292,303,305,316,314,331,319,348,321,348,331,229,331,229,321,243,320,253,319,259,316,262,311,263,305,263,301,260,296,257,290,251,282,243,272,188,202,166,234,151,255,139,272,131,286,126,297,124,306,125,312,128,316,133,319,139,320,147,321,161,321,161,331,11,331,11,321,29,319,44,312,59,299,78,276,103,242,156,164,78,66,58,42,43,26,31,17,19,12,5,9,5,0,121,0,121,9,106,11,95,13,88,17,84,21,83,26,84,31,87,38,92,46,100,57,109,70,169,145,217,74,226,60,233,48,
+466,331,368,331,368,321,381,320,391,318,397,314,401,308,402,301,402,294,401,287,399,280,397,271,394,262,331,93,259,275,255,289,253,295,252,300,251,304,253,310,257,315,265,318,276,320,290,321,290,331,157,331,157,321,171,320,182,317,191,309,199,295,208,273,222,236,170,94,98,282,96,288,95,293,93,298,93,311,96,316,102,319,111,321,124,321,124,331,2,331,2,321,16,320,27,314,36,303,45,286,55,262,73,210,92,157,132,49,151,-5,158,-5,235,206,251,165,267,123,299,37,315,-5,323,-5,344,61,361,111,377,158,397,212,425,286,430,299,436,308,443,314,453,318,466,321,
 16,320,27,314,124,331,124,331,27,314,36,303,124,331,36,303,96,316,96,316,36,303,45,286,96,316,45,286,55,262,55,262,73,210,93,311,93,311,73,210,93,306,93,302,93,306,92,157,93,302,92,157,112,103,111,321,124,321,124,331,111,321,124,331,102,319,102,319,124,331,96,316,93,306,73,210,92,157,96,316,55,262,93,311,2,331,2,321,16,320,2,331,16,320,124,331,251,165,267,123,251,304,251,304,253,310,222,236,222,236,253,310,208,273,199,295,208,273,257,315,199,295,257,315,290,331,290,331,257,315,265,318,290,331,265,318,276,320,276,320,290,321,290,331,251,304,222,236,235,206,251,304,235,206,251,165,257,315,208,273,253,310,290,331,157,331,171,320,290,331,171,320,182,317,290,331,182,317,191,309,290,331,191,309,199,295,394,262,361,111,377,158,394,262,377,158,397,212,394,262,331,93,344,61,394,262,344,61,361,111,331,93,259,275,267,123,331,93,267,123,283,80,331,93,283,80,299,37,331,93,299,37,315,-5,331,93,315,-5,323,-5,331,93,323,-5,344,61,267,123,259,275,257,282,267,123,257,282,255,289,267,123,255,289,253,295,267,123,253,295,252,300,267,123,252,300,251,304,402,294,401,287,425,286,425,286,401,287,399,280,425,286,399,280,397,212,397,212,399,280,397,271,397,212,397,271,394,262,402,301,425,286,430,299,402,301,430,299,436,308,402,301,436,308,443,314,402,301,443,314,466,331,402,301,466,331,401,308,402,294,425,286,402,301,453,318,466,321,466,331,453,318,466,331,443,314,466,331,368,331,381,320,466,331,381,320,391,318,466,331,391,318,397,314,466,331,397,314,401,308,170,94,98,282,112,103,170,94,112,103,132,49,170,94,132,49,151,-5,170,94,151,-5,158,-5,170,94,158,-5,235,206,170,94,235,206,222,236,112,103,98,282,96,288,112,103,96,288,95,293,112,103,95,293,93,298,112,103,93,298,93,302,381,320,368,331,368,321,171,320,157,331,157,321,
-352,0,352,9,338,12,327,16,317,22,307,32,296,46,200,184,272,272,289,292,303,305,316,314,331,319,348,321,348,331,229,331,229,321,243,320,253,319,259,316,262,311,263,305,263,301,260,296,257,290,251,282,243,272,188,202,166,234,151,255,139,272,131,286,126,297,124,306,125,312,128,316,133,319,139,320,147,321,161,321,161,331,11,331,11,321,29,319,44,312,59,299,78,276,103,242,156,164,78,66,58,42,43,26,31,17,19,12,5,9,5,0,121,0,121,9,106,11,95,13,88,17,84,21,83,26,84,31,87,38,92,46,100,57,109,70,169,145,217,74,226,60,233,48,238,38,241,31,242,25,241,20,238,16,233,14,226,12,217,11,204,9,204,0,352,331,243,331,243,321,256,321,266,319,272,316,275,312,276,306,276,302,274,294,272,290,270,285,197,174,124,285,121,289,118,294,116,299,115,304,115,308,116,312,119,316,123,318,130,320,138,321,151,321,151,331,11,331,11,321,24,319,37,313,50,299,68,277,92,243,157,147,157,61,156,39,152,25,144,16,129,12,107,9,107,0,260,0,260,9,239,11,224,15,215,23,210,36,209,55,209,151,282,266,297,288,310,303,322,313,336,319,352,321,299,88,287,88,282,72,278,59,273,49,266,40,257,33,249,28,240,24,228,21,215,20,199,19,73,19,289,324,289,331,26,331,16,246,29,246,32,260,35,271,38,279,43,287,50,295,58,301,68,306,81,309,97,311,
+352,0,352,9,338,12,327,16,317,22,307,32,296,46,200,184,272,272,289,292,303,305,316,314,331,319,348,321,348,331,229,331,229,321,243,320,253,319,259,316,262,311,263,305,263,301,260,296,257,290,251,282,243,272,188,202,166,234,151,255,139,272,131,286,126,297,124,306,125,312,128,316,133,319,139,320,147,321,161,321,161,331,11,331,11,321,29,319,44,312,59,299,78,276,103,242,156,164,78,66,58,42,43,26,31,17,19,12,5,9,5,0,121,0,121,9,106,11,95,13,88,17,84,21,83,26,84,31,87,38,92,46,100,57,109,70,169,145,217,74,226,60,233,48,238,38,241,31,242,25,241,20,238,16,233,14,226,12,217,11,204,9,204,0,
 31,17,121,0,43,26,43,26,121,0,88,17,43,26,88,17,58,42,58,42,88,17,84,21,58,42,84,21,83,26,83,26,84,31,78,66,78,66,84,31,87,38,78,66,87,38,156,164,156,164,87,38,92,46,156,164,92,46,100,57,103,242,156,164,126,297,103,242,126,297,124,306,124,306,125,312,103,242,156,164,100,57,109,70,109,70,169,145,156,164,156,164,169,145,166,234,156,164,166,234,151,255,78,66,58,42,83,26,103,242,125,312,78,276,78,276,125,312,128,316,78,276,128,316,59,299,59,299,128,316,133,319,59,299,133,319,161,331,161,331,133,319,139,320,161,331,139,320,147,321,147,321,161,321,161,331,161,331,11,331,29,319,161,331,29,319,44,312,161,331,44,312,59,299,260,296,257,290,272,272,272,272,257,290,251,282,272,272,251,282,243,272,243,272,188,202,200,184,200,184,188,202,217,74,200,184,217,74,296,46,296,46,217,74,226,60,296,46,226,60,233,48,348,331,229,331,243,320,348,331,243,320,253,319,348,331,253,319,259,316,348,331,259,316,262,311,348,331,262,311,263,305,348,331,263,305,316,314,348,331,316,314,331,319,348,331,331,319,348,321,263,305,272,272,289,292,263,305,289,292,303,305,263,305,303,305,316,314,263,301,260,296,272,272,263,301,272,272,263,305,243,272,200,184,272,272,238,16,233,14,352,0,352,0,233,14,226,12,352,0,226,12,217,11,242,25,352,0,327,16,242,25,327,16,317,22,242,25,317,22,307,32,242,25,307,32,296,46,242,25,296,46,241,31,296,46,233,48,238,38,296,46,238,38,241,31,188,202,166,234,169,145,188,202,169,145,217,74,338,12,327,16,352,0,338,12,352,0,352,9,241,20,238,16,352,0,241,20,352,0,242,25,204,9,204,0,352,0,204,9,352,0,217,11,156,164,151,255,139,272,156,164,139,272,131,286,156,164,131,286,126,297,121,0,121,9,106,11,121,0,106,11,95,13,121,0,95,13,88,17,19,12,5,9,121,0,19,12,121,0,31,17,121,0,5,9,5,0,243,320,229,331,229,321,29,319,11,331,11,321,
-352,331,243,331,243,321,256,321,266,319,272,316,275,312,276,306,276,302,274,294,272,290,270,285,197,174,124,285,121,289,118,294,116,299,115,304,115,308,116,312,119,316,123,318,130,320,138,321,151,321,151,331,11,331,11,321,24,319,37,313,50,299,68,277,92,243,157,147,157,61,156,39,152,25,144,16,129,12,107,9,107,0,260,0,260,9,239,11,224,15,215,23,210,36,209,55,209,151,282,266,297,288,310,303,322,313,336,319,352,321,299,88,287,88,282,72,278,59,273,49,266,40,257,33,249,28,240,24,228,21,215,20,199,19,73,19,289,324,289,331,26,331,16,246,29,246,32,260,35,271,38,279,43,287,50,295,58,301,68,306,81,309,97,311,117,312,224,312,5,7,5,0,286,0,150,-77,150,-64,108,-64,99,-63,92,-61,86,-56,83,-48,82,-38,82,295,83,304,86,311,92,315,99,318,108,319,150,319,150,331,44,331,44,-77,143,-6,29,338,-3,338,109,-6,123,-77,
+352,331,243,331,243,321,256,321,266,319,272,316,275,312,276,306,276,302,274,294,272,290,270,285,197,174,124,285,121,289,118,294,116,299,115,304,115,308,116,312,119,316,123,318,130,320,138,321,151,321,151,331,11,331,11,321,24,319,37,313,50,299,68,277,92,243,157,147,157,61,156,39,152,25,144,16,129,12,107,9,107,0,260,0,260,9,239,11,224,15,215,23,210,36,209,55,209,151,282,266,297,288,310,303,322,313,336,319,352,321,
 121,289,118,294,157,147,157,147,118,294,116,299,157,147,116,299,92,243,92,243,116,299,115,304,92,243,115,304,115,308,115,308,116,312,92,243,151,331,11,331,24,319,151,331,24,319,37,313,151,331,37,313,50,299,151,331,50,299,123,318,151,331,123,318,130,320,151,331,130,320,138,321,151,331,138,321,151,321,123,318,50,299,119,316,119,316,50,299,68,277,119,316,68,277,116,312,116,312,68,277,92,243,209,55,209,151,197,174,209,55,197,174,210,36,210,36,197,174,157,147,210,36,157,147,215,23,215,23,157,147,157,61,215,23,157,61,224,15,224,15,157,61,156,39,224,15,156,39,260,0,260,0,156,39,152,25,260,0,152,25,144,16,275,298,274,294,282,266,282,266,274,294,272,290,282,266,272,290,270,285,270,285,197,174,209,151,352,331,243,331,256,321,352,331,256,321,266,319,352,331,266,319,272,316,352,331,272,316,275,312,352,331,275,312,276,306,352,331,276,306,322,313,352,331,322,313,336,319,352,331,336,319,352,321,276,306,282,266,297,288,276,306,297,288,310,303,276,306,310,303,322,313,282,266,276,306,276,302,282,266,276,302,275,298,270,285,209,151,282,266,239,11,224,15,260,0,239,11,260,0,260,9,129,12,107,9,260,0,129,12,260,0,144,16,124,285,121,289,157,147,124,285,157,147,197,174,260,0,107,9,107,0,256,321,243,331,243,321,24,319,11,331,11,321,
-299,88,287,88,282,72,278,59,273,49,266,40,257,33,249,28,240,24,228,21,215,20,199,19,73,19,289,324,289,331,26,331,16,246,29,246,32,260,35,271,38,279,43,287,50,295,58,301,68,306,81,309,97,311,117,312,224,312,5,7,5,0,286,0,150,-77,150,-64,108,-64,99,-63,92,-61,86,-56,83,-48,82,-38,82,295,83,304,86,311,92,315,99,318,108,319,150,319,150,331,44,331,44,-77,143,-6,29,338,-3,338,109,-6,123,-77,123,331,17,331,17,319,59,319,69,318,76,314,81,309,83,301,84,291,
+299,88,287,88,282,72,278,59,273,49,266,40,257,33,249,28,240,24,228,21,215,20,199,19,73,19,289,324,289,331,26,331,16,246,29,246,32,260,35,271,38,279,43,287,50,295,58,301,68,306,81,309,97,311,117,312,224,312,5,7,5,0,286,0,
 35,271,38,279,26,331,26,331,38,279,43,287,26,331,43,287,50,295,50,295,58,301,26,331,26,331,58,301,68,306,26,331,68,306,81,309,73,19,289,324,224,312,224,312,289,324,289,331,224,312,289,331,117,312,97,311,117,312,289,331,97,311,289,331,26,331,26,331,16,246,29,246,26,331,29,246,32,260,26,331,32,260,35,271,224,312,5,7,73,19,73,19,5,7,286,0,73,19,286,0,199,19,199,19,286,0,215,20,278,59,273,49,286,0,286,0,273,49,266,40,286,0,266,40,257,33,257,33,249,28,286,0,286,0,249,28,240,24,286,0,240,24,228,21,286,0,299,88,287,88,286,0,287,88,282,72,286,0,282,72,278,59,286,0,5,7,5,0,215,20,286,0,228,21,26,331,81,309,97,311,
-150,-77,150,-64,108,-64,99,-63,92,-61,86,-56,83,-48,82,-38,82,295,83,304,86,311,92,315,99,318,108,319,150,319,150,331,44,331,44,-77,143,-6,29,338,-3,338,109,-6,123,-77,123,331,17,331,17,319,59,319,69,318,76,314,81,309,83,301,84,291,84,-50,81,-56,77,-61,70,-63,
+150,-77,150,-64,108,-64,99,-63,92,-61,86,-56,83,-48,82,-38,82,295,83,304,86,311,92,315,99,318,108,319,150,319,150,331,44,331,44,-77,
 86,311,92,315,44,331,44,331,92,315,99,318,44,331,99,318,150,331,150,331,99,318,108,319,82,-38,82,295,44,331,82,-38,44,331,44,-77,82,-38,44,-77,83,-48,83,304,86,311,44,331,83,304,44,331,82,295,150,-64,108,-64,150,-77,150,-77,108,-64,99,-63,150,-77,99,-63,44,-77,44,-77,99,-63,92,-61,44,-77,92,-61,86,-56,83,-48,44,-77,86,-56,150,331,108,319,150,319,
-143,-6,29,338,-3,338,109,-6,123,-77,123,331,17,331,17,319,
+143,-6,29,338,-3,338,109,-6,
 143,-6,29,338,-3,338,143,-6,-3,338,109,-6,
-123,-77,123,331,17,331,17,319,59,319,69,318,76,314,81,309,83,301,84,291,84,-50,81,-56,77,-61,70,-63,61,-64,17,-64,17,-77,223,148,132,331,103,331,12,148,46,148,118,293,189,148,250,-62,250,-36,0,-36,0,-62,121,253,49,328,44,332,40,335,35,337,27,339,
+123,-77,123,331,17,331,17,319,59,319,69,318,76,314,81,309,83,301,84,291,84,-50,81,-56,77,-61,70,-63,61,-64,17,-64,17,-77,
 123,-77,123,331,84,291,123,-77,84,291,84,-41,123,-77,84,-41,84,-50,123,-77,84,-50,81,-56,123,-77,81,-56,77,-61,123,-77,77,-61,70,-63,123,-77,70,-63,61,-64,123,-77,61,-64,17,-64,123,-77,17,-64,17,-77,76,314,81,309,123,331,123,331,81,309,83,301,123,331,83,301,84,291,123,331,17,331,59,319,123,331,59,319,69,318,123,331,69,318,76,314,59,319,17,331,17,319,
-223,148,132,331,103,331,12,148,46,148,118,293,189,148,250,-62,250,-36,0,-36,0,-62,121,253,49,328,44,332,
+223,148,132,331,103,331,12,148,46,148,118,293,189,148,
 12,148,46,148,103,331,103,331,46,148,118,293,103,331,118,293,132,331,132,331,118,293,189,148,132,331,189,148,223,148,
-250,-62,250,-36,0,-36,0,-62,121,253,49,328,44,332,40,335,
+250,-62,250,-36,0,-36,0,-62,
 250,-62,250,-36,0,-36,250,-62,0,-36,0,-62,
-121,253,49,328,44,332,40,335,35,337,27,339,21,338,16,336,12,333,10,329,9,323,10,318,12,314,15,309,19,305,24,301,101,253,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,
+121,253,49,328,44,332,40,335,35,337,27,339,21,338,16,336,12,333,10,329,9,323,10,318,12,314,15,309,19,305,24,301,101,253,
 101,253,121,253,49,328,101,253,49,328,44,332,101,253,44,332,40,335,101,253,40,335,35,337,101,253,35,337,31,338,101,253,31,338,27,339,101,253,27,339,24,301,9,323,10,318,10,329,10,329,10,318,12,314,10,329,12,314,12,333,12,333,12,314,15,309,12,333,15,309,16,336,16,336,15,309,19,305,16,336,19,305,21,338,21,338,19,305,24,301,21,338,24,301,27,339,
-221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,76,340,74,342,62,338,51,334,41,331,29,328,17,324,2,320,2,311,5,311,6,312,10,312,21,311,28,309,32,304,34,296,35,283,35,28,39,18,52,9,71,2,93,-2,117,-4,155,1,187,18,212,44,228,78,234,120,230,155,218,185,199,209,174,224,144,230,126,228,110,223,96,214,85,202,76,188,16383,16383,76,159,79,171,86,182,97,191,111,197,126,199,137,198,146,195,155,190,164,183,171,175,177,163,183,149,186,133,189,116,190,99,189,82,187,67,183,54,178,42,171,32,164,25,156,19,147,15,136,12,125,11,110,12,97,16,86,21,79,28,76,37,199,78,185,60,172,46,159,38,144,33,128,31,103,36,81,49,65,69,54,96,51,128,54,157,63,181,78,200,96,211,119,215,128,215,136,212,141,208,145,201,148,191,151,180,154,172,159,166,163,161,169,158,175,157,183,158,189,161,195,166,198,172,199,179,195,195,184,209,167,220,146,227,122,230,108,229,94,226,80,221,67,213,55,204,
+221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,
 37,156,43,153,44,208,44,208,43,153,50,152,44,208,50,152,54,215,54,215,50,152,57,153,54,215,57,153,63,220,63,220,57,153,63,156,63,220,63,156,73,224,73,224,63,156,70,194,71,167,70,194,68,161,111,230,104,218,117,216,111,230,117,216,127,229,127,229,117,216,128,211,127,229,128,211,140,226,140,226,128,211,136,202,140,226,136,202,142,190,76,208,83,213,85,227,85,227,83,213,93,217,85,227,93,217,98,229,98,229,93,217,104,218,98,229,104,218,111,230,73,224,70,194,71,201,73,224,71,201,76,208,73,224,76,208,85,227,70,194,63,156,68,161,29,183,29,167,32,192,32,192,29,167,33,161,32,192,33,161,37,200,37,200,33,161,37,156,37,200,37,156,44,208,184,56,184,152,184,168,184,56,184,168,183,181,184,56,183,181,180,191,184,56,180,191,186,-3,190,28,195,-1,195,25,195,25,195,-1,200,23,204,24,200,23,204,2,204,24,204,2,212,9,187,35,185,44,186,-3,187,35,186,-3,195,-1,187,35,195,-1,190,28,147,17,151,7,152,222,152,222,151,7,157,0,152,222,157,0,162,215,162,215,157,0,166,-3,162,215,166,-3,170,208,170,208,166,-3,176,-4,170,208,176,-4,176,199,176,199,176,-4,186,-3,176,199,186,-3,180,191,152,222,140,226,142,190,152,222,142,190,143,173,152,222,143,173,143,134,152,222,143,134,144,31,152,222,144,31,147,17,143,31,144,31,143,134,143,146,143,134,143,173,216,29,212,27,212,9,216,29,212,9,221,19,216,29,221,19,221,33,208,25,204,24,212,9,208,25,212,9,212,27,200,23,195,-1,204,2,143,31,143,134,143,64,143,31,143,64,143,56,143,31,143,56,142,49,143,31,142,49,138,43,143,31,138,43,133,38,143,31,133,38,128,16,128,16,133,38,126,32,126,32,121,29,128,16,128,16,121,29,115,27,128,16,115,27,113,6,113,6,115,27,109,25,113,6,109,25,103,24,99,114,111,121,114,135,114,135,111,121,126,127,114,135,126,127,143,146,143,146,126,127,143,134,65,79,68,87,75,118,75,118,68,87,73,94,75,118,73,94,79,101,79,101,88,108,92,126,92,126,88,108,99,114,92,126,99,114,114,135,92,126,75,118,79,101,72,182,71,185,71,167,72,182,71,167,73,172,72,182,73,172,72,178,70,189,70,194,71,167,70,189,71,167,71,185,63,112,54,105,54,-2,63,112,54,-2,63,63,63,112,63,63,63,71,63,112,63,71,65,79,63,112,65,79,75,118,63,63,54,-2,64,48,64,48,54,-2,71,-4,64,48,71,-4,69,38,69,38,71,-4,76,30,20,62,21,29,25,75,25,75,21,29,28,14,25,75,28,14,33,87,33,87,28,14,39,4,33,87,39,4,42,97,42,97,39,4,54,-2,42,97,54,-2,54,105,84,-3,98,0,86,25,86,25,98,0,97,24,103,24,97,24,98,0,103,24,98,0,113,6,76,30,71,-4,84,-3,76,30,84,-3,86,25,21,29,20,62,18,47,184,56,186,-3,185,44,29,167,29,183,28,175,
-76,340,74,342,62,338,51,334,41,331,29,328,17,324,2,320,2,311,5,311,6,312,10,312,21,311,28,309,32,304,34,296,35,283,35,28,39,18,52,9,71,2,93,-2,117,-4,155,1,187,18,212,44,228,78,234,120,230,155,218,185,199,209,174,224,144,230,126,228,110,223,96,214,85,202,76,188,16383,16383,76,159,79,171,86,182,97,191,111,197,126,199,137,198,146,195,155,190,164,183,171,175,177,163,183,149,186,133,189,116,190,99,189,82,187,67,183,54,178,42,171,32,164,25,156,19,147,15,136,12,125,11,110,12,97,16,86,21,79,28,76,37,199,78,185,60,172,46,159,38,144,33,128,31,103,36,81,49,65,69,54,96,51,128,54,157,63,181,78,200,96,211,119,215,128,215,136,212,141,208,145,201,148,191,151,180,154,172,159,166,163,161,169,158,175,157,183,158,189,161,195,166,198,172,199,179,195,195,184,209,167,220,146,227,122,230,108,229,94,226,80,221,67,213,55,204,40,189,28,172,19,152,14,130,12,106,17,70,30,39,50,15,76,0,108,-4,120,-3,132,-1,144,3,155,9,165,16,174,24,181,32,189,43,197,57,206,74,246,21,246,29,239,29,237,28,234,28,225,29,218,32,215,37,
+76,340,74,342,62,338,51,334,41,331,29,328,17,324,2,320,2,311,5,311,6,312,10,312,21,311,28,309,32,304,34,296,35,283,35,28,39,18,52,9,71,2,93,-2,117,-4,155,1,187,18,212,44,228,78,234,120,230,155,218,185,199,209,174,224,144,230,126,228,110,223,96,214,85,202,76,188,16383,16383,76,159,79,171,86,182,97,191,111,197,126,199,137,198,146,195,155,190,164,183,171,175,177,163,183,149,186,133,189,116,190,99,189,82,187,67,183,54,178,42,171,32,164,25,156,19,147,15,136,12,125,11,110,12,97,16,86,21,79,28,76,37,
 5,311,6,312,17,324,17,324,6,312,8,312,17,324,8,312,10,312,10,312,21,311,17,324,17,324,21,311,29,328,97,16,86,21,93,-2,93,-2,86,21,79,28,93,-2,79,28,71,2,71,2,79,28,76,37,71,2,76,37,74,342,74,342,76,37,76,188,74,342,76,188,76,340,62,338,51,334,52,9,52,9,51,334,41,331,52,9,41,331,39,18,39,18,41,331,35,283,39,18,35,283,35,28,3,311,5,311,17,324,3,311,17,324,2,320,3,311,2,320,2,311,156,19,147,15,155,1,155,1,147,15,136,12,155,1,136,12,125,11,125,11,110,12,117,-4,117,-4,110,12,97,16,117,-4,97,16,93,-2,62,338,52,9,71,2,62,338,71,2,74,342,21,311,28,309,29,328,29,328,28,309,32,304,29,328,32,304,41,331,41,331,32,304,34,296,41,331,34,296,35,283,126,228,126,199,137,198,126,228,137,198,144,230,144,230,137,198,146,195,144,230,146,195,174,224,174,224,146,195,155,190,174,224,155,190,164,183,76,159,79,171,85,202,85,202,79,171,86,182,85,202,86,182,96,214,96,214,86,182,97,191,96,214,97,191,110,223,110,223,97,191,111,197,110,223,111,197,126,228,126,228,111,197,126,199,76,159,85,202,76,188,76,159,76,188,76,37,174,224,171,175,177,163,174,224,177,163,199,209,199,209,177,163,183,149,199,209,183,149,186,133,187,67,183,54,187,18,187,18,183,54,178,42,187,18,178,42,171,32,171,32,164,25,187,18,187,18,164,25,156,19,187,18,156,19,155,1,234,120,230,155,228,78,228,78,230,155,218,185,228,78,218,185,212,44,212,44,218,185,199,209,212,44,199,209,190,99,190,99,199,209,189,116,187,67,187,18,189,82,189,82,187,18,212,44,189,82,212,44,190,99,125,11,117,-4,155,1,199,209,186,133,189,116,174,224,164,183,171,175,
-199,78,185,60,172,46,159,38,144,33,128,31,103,36,81,49,65,69,54,96,51,128,54,157,63,181,78,200,96,211,119,215,128,215,136,212,141,208,145,201,148,191,151,180,154,172,159,166,163,161,169,158,175,157,183,158,189,161,195,166,198,172,199,179,195,195,184,209,167,220,146,227,122,230,108,229,94,226,80,221,67,213,55,204,40,189,28,172,19,152,14,130,12,106,17,70,30,39,50,15,76,0,108,-4,120,-3,132,-1,144,3,155,9,165,16,174,24,181,32,189,43,197,57,206,74,246,21,246,29,239,29,237,28,234,28,225,29,218,32,215,37,213,45,212,57,212,340,209,342,195,337,169,329,154,324,136,320,136,311,138,312,147,312,156,311,163,309,167,304,170,297,170,209,159,217,149,223,139,227,129,229,118,230,85,223,56,206,34,178,19,143,13,103,18,67,30,37,49,14,75,0,106,-4,122,-3,136,0,148,7,160,16,170,28,170,-2,172,-4,16383,16383,170,51,170,49,169,46,165,40,162,37,157,31,150,27,143,24,135,22,126,21,102,26,83,39,69,60,60,88,56,123,
+199,78,185,60,172,46,159,38,144,33,128,31,103,36,81,49,65,69,54,96,51,128,54,157,63,181,78,200,96,211,119,215,128,215,136,212,141,208,145,201,148,191,151,180,154,172,159,166,163,161,169,158,175,157,183,158,189,161,195,166,198,172,199,179,195,195,184,209,167,220,146,227,122,230,108,229,94,226,80,221,67,213,55,204,40,189,28,172,19,152,14,130,12,106,17,70,30,39,50,15,76,0,108,-4,120,-3,132,-1,144,3,155,9,165,16,174,24,181,32,189,43,197,57,206,74,
 81,49,65,69,76,0,76,0,65,69,54,96,76,0,54,96,50,15,50,15,54,96,51,128,55,204,51,128,54,157,55,204,54,157,63,181,128,31,108,-4,120,-3,128,31,120,-3,132,-1,128,31,103,36,108,-4,81,49,76,0,108,-4,81,49,108,-4,103,36,136,212,141,208,146,227,146,227,141,208,145,201,146,227,145,201,148,191,148,191,151,180,167,220,167,220,151,180,154,172,167,220,154,172,159,166,122,230,119,215,128,215,122,230,128,215,146,227,146,227,128,215,136,212,195,195,184,209,189,161,195,195,189,161,195,166,195,195,195,166,198,172,195,195,198,172,199,179,184,209,167,220,169,158,184,209,169,158,175,157,184,209,175,157,183,158,184,209,183,158,189,161,167,220,159,166,163,161,167,220,163,161,169,158,167,220,146,227,148,191,174,24,181,32,185,60,185,60,181,32,189,43,185,60,189,43,199,78,199,78,189,43,197,57,199,78,197,57,206,74,132,-1,144,3,144,33,144,33,144,3,155,9,144,33,155,9,159,38,159,38,155,9,165,16,159,38,165,16,172,46,172,46,165,16,174,24,172,46,174,24,185,60,144,33,128,31,132,-1,96,211,119,215,108,229,96,211,108,229,94,226,96,211,94,226,80,221,96,211,80,221,78,200,67,213,55,204,63,181,67,213,63,181,78,200,67,213,78,200,80,221,40,189,28,172,30,39,40,189,30,39,50,15,40,189,50,15,51,128,40,189,51,128,55,204,19,152,14,130,17,70,19,152,17,70,30,39,19,152,30,39,28,172,119,215,122,230,108,229,17,70,14,130,12,106,
-246,21,246,29,239,29,237,28,234,28,225,29,218,32,215,37,213,45,212,57,212,340,209,342,195,337,169,329,154,324,136,320,136,311,138,312,147,312,156,311,163,309,167,304,170,297,170,209,159,217,149,223,139,227,129,229,118,230,85,223,56,206,34,178,19,143,13,103,18,67,30,37,49,14,75,0,106,-4,122,-3,136,0,148,7,160,16,170,28,170,-2,172,-4,16383,16383,170,51,170,49,169,46,165,40,162,37,157,31,150,27,143,24,135,22,126,21,102,26,83,39,69,60,60,88,56,123,59,154,67,180,80,199,98,212,119,216,135,213,149,206,160,195,167,181,170,166,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,151,155,11,225,11,209,51,209,51,52,50,34,47,21,40,13,28,9,10,7,10,0,140,0,140,7,119,9,106,13,98,21,95,33,94,52,94,209,155,209,
+246,21,246,29,239,29,237,28,234,28,225,29,218,32,215,37,213,45,212,57,212,340,209,342,195,337,169,329,154,324,136,320,136,311,138,312,147,312,156,311,163,309,167,304,170,297,170,209,159,217,149,223,139,227,129,229,118,230,85,223,56,206,34,178,19,143,13,103,18,67,30,37,49,14,75,0,106,-4,122,-3,136,0,148,7,160,16,170,28,170,-2,172,-4,16383,16383,170,51,170,49,169,46,165,40,162,37,157,31,150,27,143,24,135,22,126,21,102,26,83,39,69,60,60,88,56,123,59,154,67,180,80,199,98,212,119,216,135,213,149,206,160,195,167,181,170,166,
 170,209,159,217,160,195,160,195,159,217,149,223,160,195,149,223,149,206,149,206,149,223,139,227,149,206,139,227,135,213,135,213,139,227,129,229,135,213,129,229,119,216,67,180,80,199,85,223,85,223,80,199,98,212,85,223,98,212,118,230,118,230,98,212,119,216,118,230,119,216,129,229,13,103,18,67,19,143,19,143,18,67,30,37,19,143,30,37,34,178,34,178,30,37,49,14,34,178,49,14,56,206,56,206,49,14,56,123,56,206,56,123,59,154,56,206,59,154,67,180,56,206,67,180,85,223,126,21,106,-4,122,-3,126,21,122,-3,136,0,126,21,102,26,106,-4,83,39,69,60,75,0,83,39,75,0,106,-4,83,39,106,-4,102,26,60,88,56,123,49,14,60,88,49,14,75,0,60,88,75,0,69,60,169,46,167,43,170,28,170,28,167,43,165,40,170,28,165,40,162,37,162,37,157,31,160,16,160,16,157,31,150,27,160,16,150,27,148,7,148,7,150,27,143,24,148,7,143,24,136,0,136,0,143,24,135,22,136,0,135,22,126,21,140,312,142,312,154,324,154,324,142,312,145,312,154,324,145,312,147,312,147,312,156,311,154,324,154,324,156,311,169,329,154,324,136,320,138,312,154,324,138,312,140,312,170,209,170,166,170,28,170,209,170,28,170,286,170,297,170,286,182,333,170,297,182,333,169,329,170,209,160,195,167,181,170,209,167,181,170,166,172,-4,246,21,225,29,172,-4,225,29,218,32,172,-4,218,32,215,37,172,-4,215,37,213,45,172,-4,213,45,182,333,172,-4,182,333,170,28,172,-4,170,28,170,-2,170,28,170,166,170,51,170,28,170,51,170,49,170,28,170,49,169,46,162,37,160,16,170,28,212,57,212,340,209,342,212,57,209,342,195,337,212,57,195,337,213,45,239,29,237,28,246,21,246,21,237,28,235,28,246,21,235,28,234,28,234,28,225,29,246,21,241,29,239,29,246,21,241,29,246,21,246,29,169,329,156,311,163,309,169,329,163,309,167,304,169,329,167,304,170,297,138,312,136,320,136,311,182,333,170,286,170,28,182,333,213,45,195,337,
-204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,151,155,11,225,11,209,51,209,51,52,50,34,47,21,40,13,28,9,10,7,10,0,140,0,140,7,119,9,106,13,98,21,95,33,94,52,94,209,155,209,155,225,94,225,94,283,95,299,98,311,104,320,111,326,122,328,128,327,133,325,138,321,143,316,148,308,153,301,157,296,161,293,166,291,171,290,177,291,183,294,188,298,190,304,191,310,189,321,182,329,171,336,156,340,140,342,121,340,105,335,90,328,78,318,69,305,62,292,
+204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,151,155,
 52,100,50,118,49,15,49,15,50,118,49,138,49,15,49,138,31,182,49,15,31,182,29,39,29,39,31,182,17,148,29,39,17,148,17,70,17,70,17,148,12,108,133,228,116,230,120,210,120,210,116,230,103,212,87,210,103,212,116,230,87,210,116,230,81,224,190,62,176,48,181,26,181,26,176,48,162,37,181,26,162,37,160,9,160,9,162,37,146,31,160,9,146,31,136,-1,136,-1,146,31,127,30,203,138,201,153,198,166,203,138,198,166,195,177,203,138,195,177,190,186,203,138,190,186,185,195,203,138,185,195,175,207,203,138,175,207,163,217,203,138,163,217,151,155,203,138,151,155,50,155,203,138,50,155,49,138,141,192,147,176,149,224,149,224,147,176,151,155,149,224,151,155,163,217,198,49,212,79,204,82,198,49,204,82,190,62,198,49,190,62,181,26,114,31,101,34,108,-4,114,31,108,-4,136,-1,114,31,136,-1,127,30,101,34,90,39,108,-4,108,-4,90,39,80,47,108,-4,80,47,75,0,75,0,80,47,71,57,133,228,120,210,133,203,133,228,133,203,141,192,133,228,141,192,149,224,50,155,55,175,52,207,52,207,55,175,63,191,52,207,63,191,81,224,81,224,63,191,74,203,81,224,74,203,87,210,52,207,31,182,49,138,52,207,49,138,50,155,75,0,71,57,62,71,75,0,62,71,56,85,75,0,56,85,52,100,75,0,52,100,49,15,
-11,225,11,209,51,209,51,52,50,34,47,21,40,13,28,9,10,7,10,0,140,0,140,7,119,9,106,13,98,21,95,33,94,52,94,209,155,209,155,225,94,225,94,283,95,299,98,311,104,320,111,326,122,328,128,327,133,325,138,321,143,316,148,308,153,301,157,296,161,293,166,291,171,290,177,291,183,294,188,298,190,304,191,310,189,321,182,329,171,336,156,340,140,342,121,340,105,335,90,328,78,318,69,305,62,292,57,279,54,264,52,247,51,225,235,194,235,214,185,214,180,215,175,217,169,219,158,223,134,229,126,230,118,230,91,226,68,214,51,197,39,174,35,148,36,131,41,116,50,103,63,92,81,81,77,77,72,73,60,61,51,53,44,46,40,39,37,33,36,27,37,21,40,16,44,11,52,6,63,1,44,-13,30,-26,21,-37,16,-48,14,-59,18,-75,31,-88,49,-98,73,-105,100,-108,122,-106,144,-102,165,-96,184,-87,200,-76,211,-66,220,-56,226,-46,229,-35,230,-24,228,-6,220,7,207,18,190,26,
+11,225,11,209,51,209,51,52,50,34,47,21,40,13,28,9,10,7,10,0,140,0,140,7,119,9,106,13,98,21,95,33,94,52,94,209,155,209,155,225,94,225,94,283,95,299,98,311,104,320,111,326,122,328,128,327,133,325,138,321,143,316,148,308,153,301,157,296,161,293,166,291,171,290,177,291,183,294,188,298,190,304,191,310,189,321,182,329,171,336,156,340,140,342,121,340,105,335,90,328,78,318,69,305,62,292,57,279,54,264,52,247,51,225,
 57,279,54,264,95,33,95,33,54,264,52,247,95,33,52,247,51,209,51,209,52,247,51,225,51,209,51,225,11,225,78,318,95,33,94,52,94,225,94,209,155,209,94,225,155,209,155,225,133,325,140,342,128,327,128,327,140,342,122,328,111,326,122,328,121,340,111,326,121,340,105,335,94,283,95,299,90,328,90,328,95,299,98,311,90,328,98,311,105,335,105,335,98,311,104,320,105,335,104,320,111,326,90,328,78,318,94,52,90,328,94,52,94,283,189,321,182,329,183,294,189,321,183,294,188,298,189,321,188,298,190,304,189,321,190,304,191,310,166,291,171,290,171,336,171,336,171,290,177,291,171,336,177,291,182,329,182,329,177,291,183,294,148,308,153,301,156,340,156,340,153,301,157,296,156,340,157,296,171,336,171,336,157,296,161,293,171,336,161,293,166,291,143,316,148,308,156,340,143,316,156,340,140,342,143,316,140,342,138,321,140,342,121,340,122,328,140,0,140,7,119,9,140,0,119,9,106,13,140,0,106,13,50,34,140,0,50,34,47,21,140,0,47,21,40,13,140,0,40,13,28,9,140,0,28,9,10,7,140,0,10,7,10,0,95,33,78,318,69,305,95,33,69,305,62,292,95,33,62,292,57,279,51,52,50,34,106,13,51,52,106,13,98,21,51,52,98,21,95,33,51,52,95,33,51,209,51,209,11,225,11,209,140,342,133,325,138,321,
-235,194,235,214,185,214,180,215,175,217,169,219,158,223,134,229,126,230,118,230,91,226,68,214,51,197,39,174,35,148,36,131,41,116,50,103,63,92,81,81,77,77,72,73,60,61,51,53,44,46,40,39,37,33,36,27,37,21,40,16,44,11,52,6,63,1,44,-13,30,-26,21,-37,16,-48,14,-59,18,-75,31,-88,49,-98,73,-105,100,-108,122,-106,144,-102,165,-96,184,-87,200,-76,211,-66,220,-56,226,-46,229,-35,230,-24,228,-6,220,7,207,18,190,26,170,29,105,32,91,33,80,35,72,38,68,41,66,46,68,52,73,60,80,67,88,73,97,77,106,76,111,75,125,75,136,76,146,78,157,82,167,87,177,94,186,103,194,113,199,124,202,137,203,152,203,160,202,168,200,176,194,194,16383,16383,76,169,78,185,82,198,90,208,100,214,113,216,122,215,130,212,137,207,144,201,150,193,155,181,159,169,162,157,164,145,165,132,163,117,158,104,150,95,140,89,127,87,110,91,96,102,85,118,78,141,76,167,16383,16383,217,-31,212,-47,200,-60,180,-71,153,-77,122,-79,97,-78,77,-73,62,-65,52,-55,49,-43,50,-36,52,-30,56,-22,63,-13,74,0,86,-2,102,-4,138,-6,155,-6,178,-7,196,-10,208,-14,214,-21,217,-31,243,0,243,7,230,10,221,15,216,22,214,34,214,151,211,179,204,201,191,217,174,227,152,230,135,228,120,224,106,216,92,204,79,188,79,340,76,342,66,338,46,332,34,328,18,324,5,320,5,311,6,312,11,312,22,311,29,309,34,305,36,297,36,33,33,22,28,15,19,10,4,7,4,0,113,0,113,7,98,10,88,14,82,22,79,34,79,171,90,184,101,193,112,199,123,202,134,203,148,201,158,195,165,184,170,169,171,150,171,34,168,22,162,14,152,10,137,7,137,0,90,316,89,324,85,331,80,337,73,340,65,342,56,340,49,336,44,331,40,324,39,316,40,308,44,301,49,295,56,292,64,291,73,292,80,295,85,301,89,308,90,316,16383,16383,127,0,127,7,110,9,99,14,93,21,90,34,89,52,89,228,88,230,10,203,10,195,20,197,31,197,38,196,42,193,45,187,47,178,47,33,43,20,37,13,25,9,8,7,8,0,97,316,96,324,92,331,86,337,79,340,71,342,63,340,56,336,51,331,47,324,46,316,47,308,51,301,56,295,63,292,71,291,79,292,87,295,92,301,96,308,97,316,16383,16383,97,228,94,230,77,224,62,218,48,213,33,208,16,203,16,195,18,195,23,196,27,197,39,197,
+235,194,235,214,185,214,180,215,175,217,169,219,158,223,134,229,126,230,118,230,91,226,68,214,51,197,39,174,35,148,36,131,41,116,50,103,63,92,81,81,77,77,72,73,60,61,51,53,44,46,40,39,37,33,36,27,37,21,40,16,44,11,52,6,63,1,44,-13,30,-26,21,-37,16,-48,14,-59,18,-75,31,-88,49,-98,73,-105,100,-108,122,-106,144,-102,165,-96,184,-87,200,-76,211,-66,220,-56,226,-46,229,-35,230,-24,228,-6,220,7,207,18,190,26,170,29,105,32,91,33,80,35,72,38,68,41,66,46,68,52,73,60,80,67,88,73,97,77,106,76,111,75,125,75,136,76,146,78,157,82,167,87,177,94,186,103,194,113,199,124,202,137,203,152,203,160,202,168,200,176,194,194,16383,16383,76,169,78,185,82,198,90,208,100,214,113,216,122,215,130,212,137,207,144,201,150,193,155,181,159,169,162,157,164,145,165,132,163,117,158,104,150,95,140,89,127,87,110,91,96,102,85,118,78,141,76,167,16383,16383,217,-31,212,-47,200,-60,180,-71,153,-77,122,-79,97,-78,77,-73,62,-65,52,-55,49,-43,50,-36,52,-30,56,-22,63,-13,74,0,86,-2,102,-4,138,-6,155,-6,178,-7,196,-10,208,-14,214,-21,217,-31,
 85,118,81,81,88,73,88,73,81,81,80,67,80,67,81,81,77,77,80,67,77,77,73,60,73,60,77,77,72,73,73,60,72,73,68,52,68,52,72,73,68,69,68,52,68,69,66,46,66,46,64,65,63,-13,63,-13,64,65,63,1,116,75,127,87,111,75,111,75,127,87,110,91,111,75,110,91,106,76,106,76,110,91,97,77,88,73,97,77,96,102,88,73,96,102,85,118,118,230,113,216,122,215,118,230,122,215,126,230,126,230,122,215,130,212,126,230,130,212,134,229,134,229,130,212,137,207,134,229,137,207,142,227,142,227,137,207,144,201,142,227,144,201,150,225,150,225,144,201,150,193,127,87,116,75,120,75,127,87,120,75,123,75,127,87,123,75,125,75,127,87,125,75,136,76,110,91,96,102,97,77,169,219,158,223,159,169,169,219,159,169,162,157,169,219,162,157,164,145,169,219,164,145,165,132,169,219,165,132,167,87,169,219,167,87,177,94,169,219,177,94,175,217,167,87,165,132,163,117,167,87,163,117,158,104,167,87,158,104,157,82,127,87,136,76,140,89,140,89,136,76,146,78,140,89,146,78,150,95,150,95,146,78,157,82,150,95,157,82,158,104,82,198,90,208,91,226,91,226,90,208,100,214,91,226,100,214,118,230,118,230,100,214,113,216,76,167,76,169,68,214,68,214,76,169,78,185,68,214,78,185,91,226,91,226,78,185,82,198,81,81,85,118,78,141,81,81,78,141,76,167,81,81,76,167,68,214,81,81,68,214,63,92,51,197,39,174,41,116,51,197,41,116,50,103,51,197,50,103,63,92,51,197,63,92,68,214,39,174,35,148,36,131,39,174,36,131,41,116,51,53,44,46,44,11,51,53,44,11,52,6,51,53,52,6,60,61,36,27,37,21,37,33,37,33,37,21,40,16,37,33,40,16,40,39,40,39,40,16,44,11,40,39,44,11,44,46,30,-26,31,-88,44,-13,44,-13,31,-88,49,-98,44,-13,49,-98,49,-43,49,-43,50,-36,44,-13,44,-13,50,-36,52,-30,44,-13,52,-30,63,1,63,1,52,-30,56,-22,63,1,56,-22,63,-13,74,0,72,38,68,41,74,0,68,41,66,46,74,0,66,46,63,-13,74,0,80,35,72,38,60,61,52,6,63,1,60,61,63,1,64,65,62,-65,73,-105,77,-73,77,-73,73,-105,100,-108,77,-73,100,-108,97,-78,97,-78,100,-108,122,-79,153,-77,122,-79,122,-106,153,-77,122,-106,144,-102,52,-55,49,-43,49,-98,52,-55,49,-98,73,-105,52,-55,73,-105,62,-65,21,-37,16,-48,18,-75,21,-37,18,-75,31,-88,21,-37,31,-88,30,-26,196,214,191,214,194,194,196,214,194,194,235,194,196,214,235,194,235,214,202,137,203,152,203,160,202,137,203,160,202,168,202,137,202,168,200,176,202,137,200,176,199,124,197,185,194,194,194,113,197,185,194,113,199,124,197,185,199,124,200,176,191,214,185,214,186,103,191,214,186,103,194,113,191,214,194,113,194,194,180,215,175,217,177,94,180,215,177,94,186,103,180,215,186,103,185,214,155,181,159,169,158,223,155,181,158,223,150,225,155,181,150,225,150,193,208,-14,214,-21,220,7,220,7,214,-21,217,-31,220,-56,217,-31,212,-47,138,-6,155,-6,170,29,170,29,155,-6,178,-7,170,29,178,-7,190,26,190,26,178,-7,196,-10,190,26,196,-10,207,18,207,18,196,-10,208,-14,207,18,208,-14,220,7,228,-6,220,7,220,-56,228,-6,220,-56,226,-46,228,-6,226,-46,229,-35,228,-6,229,-35,230,-24,153,-77,165,-96,180,-71,180,-71,165,-96,184,-87,180,-71,184,-87,200,-60,200,-60,184,-87,200,-76,200,-60,200,-76,212,-47,212,-47,200,-76,211,-66,212,-47,211,-66,220,-56,138,-6,170,29,120,-5,120,-5,170,29,105,32,120,-5,105,32,102,-4,102,-4,105,32,91,33,102,-4,91,33,86,-2,86,-2,91,33,80,35,86,-2,80,35,74,0,122,-79,100,-108,122,-106,153,-77,144,-102,165,-96,217,-31,220,-56,220,7,18,-75,16,-48,14,-59,64,65,66,46,68,69,
-243,0,243,7,230,10,221,15,216,22,214,34,214,151,211,179,204,201,191,217,174,227,152,230,135,228,120,224,106,216,92,204,79,188,79,340,76,342,66,338,46,332,34,328,18,324,5,320,5,311,6,312,11,312,22,311,29,309,34,305,36,297,36,33,33,22,28,15,19,10,4,7,4,0,113,0,113,7,98,10,88,14,82,22,79,34,79,171,90,184,101,193,112,199,123,202,134,203,148,201,158,195,165,184,170,169,171,150,171,34,168,22,162,14,152,10,137,7,137,0,90,316,89,324,85,331,80,337,73,340,65,342,56,340,49,336,44,331,40,324,39,316,40,308,44,301,49,295,56,292,64,291,73,292,80,295,85,301,89,308,90,316,16383,16383,127,0,127,7,110,9,99,14,93,21,90,34,89,52,89,228,88,230,10,203,10,195,20,197,31,197,38,196,42,193,45,187,47,178,47,33,43,20,37,13,25,9,8,7,8,0,97,316,96,324,92,331,86,337,79,340,71,342,63,340,56,336,51,331,47,324,46,316,47,308,51,301,56,295,63,292,
+243,0,243,7,230,10,221,15,216,22,214,34,214,151,211,179,204,201,191,217,174,227,152,230,135,228,120,224,106,216,92,204,79,188,79,340,76,342,66,338,46,332,34,328,18,324,5,320,5,311,6,312,11,312,22,311,29,309,34,305,36,297,36,33,33,22,28,15,19,10,4,7,4,0,113,0,113,7,98,10,88,14,82,22,79,34,79,171,90,184,101,193,112,199,123,202,134,203,148,201,158,195,165,184,170,169,171,150,171,34,168,22,162,14,152,10,137,7,137,0,
 33,22,28,15,113,0,113,0,28,15,19,10,113,0,19,10,4,7,7,312,9,312,18,324,18,324,9,312,10,312,18,324,10,312,11,312,11,312,22,311,18,324,18,324,22,311,34,328,18,324,5,320,6,312,18,324,6,312,7,312,88,14,82,22,36,51,36,51,82,22,79,34,36,51,79,34,36,286,36,297,36,286,46,332,36,297,46,332,34,328,34,328,22,311,29,309,34,328,29,309,34,305,34,328,34,305,36,297,79,188,79,340,76,342,79,188,76,342,79,51,79,51,76,342,66,338,79,51,66,338,79,34,79,34,66,338,56,335,79,34,56,335,46,332,135,228,134,203,148,201,135,228,148,201,152,230,152,230,148,201,158,195,152,230,158,195,174,227,174,227,158,195,165,184,174,227,165,184,170,169,79,171,90,184,92,204,92,204,90,184,101,193,92,204,101,193,106,216,106,216,101,193,112,199,106,216,112,199,120,224,120,224,112,199,123,202,120,224,123,202,135,228,135,228,123,202,134,203,79,51,79,171,79,188,79,188,79,171,92,204,168,22,162,14,243,0,243,0,162,14,152,10,243,0,152,10,137,7,174,227,170,169,171,150,216,22,171,150,171,51,216,22,171,51,221,15,221,15,171,51,171,34,221,15,171,34,243,0,243,0,171,34,168,22,214,51,214,151,211,179,214,51,211,179,204,201,214,51,204,201,214,34,230,10,221,15,243,0,230,10,243,0,243,7,171,150,216,22,174,227,174,227,216,22,214,34,174,227,214,34,191,217,191,217,214,34,204,201,113,0,113,7,98,10,113,0,98,10,88,14,113,0,88,14,36,33,113,0,36,33,33,22,113,0,4,7,4,0,36,33,88,14,36,51,36,286,79,34,46,332,243,0,137,7,137,0,6,312,5,320,5,311,
-90,316,89,324,85,331,80,337,73,340,65,342,56,340,49,336,44,331,40,324,39,316,40,308,44,301,49,295,56,292,64,291,73,292,80,295,85,301,89,308,90,316,16383,16383,127,0,127,7,110,9,99,14,93,21,90,34,89,52,89,228,88,230,10,203,10,195,20,197,31,197,38,196,42,193,45,187,47,178,47,33,43,20,37,13,25,9,8,7,8,0,97,316,96,324,92,331,86,337,79,340,71,342,63,340,56,336,51,331,47,324,46,316,47,308,51,301,56,295,63,292,71,291,79,292,87,295,92,301,96,308,97,316,16383,16383,97,228,94,230,77,224,62,218,48,213,33,208,16,203,16,195,18,195,23,196,27,197,39,197,45,196,49,193,52,187,54,178,55,167,55,-21,54,-41,54,-56,52,-67,50,-76,47,-82,
+90,316,89,324,85,331,80,337,73,340,65,342,56,340,49,336,44,331,40,324,39,316,40,308,44,301,49,295,56,292,64,291,73,292,80,295,85,301,89,308,90,316,16383,16383,127,0,127,7,110,9,99,14,93,21,90,34,89,52,89,228,88,230,10,203,10,195,20,197,31,197,38,196,42,193,45,187,47,178,47,33,43,20,37,13,25,9,8,7,8,0,
 39,316,40,308,40,324,40,324,40,308,44,301,40,324,44,301,44,331,44,331,44,301,49,295,44,331,49,295,49,336,49,336,49,295,56,292,49,336,56,292,56,340,56,340,56,292,64,291,56,340,64,291,65,342,65,342,64,291,73,292,65,342,73,292,73,340,73,340,73,292,80,295,73,340,80,295,80,337,80,337,80,295,85,301,80,337,85,301,85,331,85,331,85,301,89,308,85,331,89,308,89,324,89,324,89,308,90,316,43,20,37,13,127,0,127,0,37,13,25,9,127,0,25,9,8,7,20,197,24,197,88,230,88,230,24,197,28,197,88,230,28,197,31,197,31,197,38,196,88,230,88,230,38,196,42,193,88,230,42,193,45,187,43,20,127,0,47,33,47,33,127,0,99,14,47,33,99,14,47,52,47,52,99,14,93,21,47,52,93,21,47,166,47,178,47,166,88,230,47,178,88,230,45,187,15,196,20,197,88,230,15,196,88,230,10,203,15,196,10,203,10,195,89,52,89,228,88,230,89,52,88,230,47,166,89,52,47,166,90,34,110,9,99,14,127,0,110,9,127,0,127,7,127,0,8,7,8,0,47,166,93,21,90,34,
-97,316,96,324,92,331,86,337,79,340,71,342,63,340,56,336,51,331,47,324,46,316,47,308,51,301,56,295,63,292,71,291,79,292,87,295,92,301,96,308,97,316,16383,16383,97,228,94,230,77,224,62,218,48,213,33,208,16,203,16,195,18,195,23,196,27,197,39,197,45,196,49,193,52,187,54,178,55,167,55,-21,54,-41,54,-56,52,-67,50,-76,47,-82,45,-85,39,-89,35,-91,26,-91,18,-87,14,-83,4,-71,0,-66,-4,-63,-9,-61,-14,-61,-20,-62,-26,-65,-30,-69,-33,-74,-34,-80,-32,-90,-26,-97,-16,-103,-3,-107,12,-108,42,-103,65,-90,83,-68,93,-38,97,0,252,0,252,7,240,9,228,13,217,20,206,30,194,44,118,141,132,155,164,183,188,201,206,212,222,217,240,218,240,225,138,225,138,218,148,218,155,217,160,215,162,212,163,209,161,203,155,195,151,191,83,131,83,340,81,342,70,338,48,332,35,328,18,324,3,320,3,311,7,312,17,312,20,313,28,312,34,309,38,303,40,294,41,282,41,41,40,28,38,20,32,14,21,11,3,7,3,0,121,0,121,7,110,8,100,9,92,12,87,17,84,24,83,33,83,126,158,26,160,24,162,21,163,19,163,17,164,15,163,13,162,10,153,7,143,7,143,0,128,0,128,7,
+97,316,96,324,92,331,86,337,79,340,71,342,63,340,56,336,51,331,47,324,46,316,47,308,51,301,56,295,63,292,71,291,79,292,87,295,92,301,96,308,97,316,16383,16383,97,228,94,230,77,224,62,218,48,213,33,208,16,203,16,195,18,195,23,196,27,197,39,197,45,196,49,193,52,187,54,178,55,167,55,-21,54,-41,54,-56,52,-67,50,-76,47,-82,45,-85,39,-89,35,-91,26,-91,18,-87,14,-83,4,-71,0,-66,-4,-63,-9,-61,-14,-61,-20,-62,-26,-65,-30,-69,-33,-74,-34,-80,-32,-90,-26,-97,-16,-103,-3,-107,12,-108,42,-103,65,-90,83,-68,93,-38,97,0,
 86,337,87,295,92,331,92,331,87,295,92,301,92,331,92,301,96,324,96,324,92,301,96,308,96,324,96,308,97,316,46,316,47,308,47,324,47,324,47,308,51,301,47,324,51,301,51,331,51,331,51,301,56,295,51,331,56,295,56,336,56,336,56,295,63,292,56,336,63,292,63,340,63,340,63,292,71,291,63,340,71,291,71,342,71,342,71,291,79,292,71,342,79,292,79,340,79,340,79,292,87,295,79,340,87,295,86,337,18,195,23,196,33,208,18,195,33,208,16,203,18,195,16,203,16,195,42,-87,39,-89,42,-103,42,-103,39,-89,35,-91,42,-103,35,-91,31,-91,31,-91,26,-91,42,-103,42,-103,26,-91,22,-89,42,-103,22,-89,18,-87,52,187,62,218,49,193,49,193,62,218,48,213,49,193,48,213,45,196,45,196,48,213,39,197,35,197,39,197,48,213,35,197,48,213,33,208,54,-56,52,-67,65,-90,65,-90,52,-67,50,-76,65,-90,50,-76,47,-82,47,-82,45,-85,65,-90,65,-90,45,-85,42,-87,65,-90,42,-87,42,-103,93,-38,94,230,83,-68,83,-68,94,230,77,224,83,-68,77,224,65,-90,65,-90,77,224,62,218,65,-90,62,218,55,167,55,167,62,218,54,178,33,208,23,196,27,197,33,208,27,197,32,197,33,208,32,197,35,197,97,0,97,228,94,230,97,0,94,230,93,-38,65,-90,55,167,55,-21,65,-90,55,-21,54,-41,65,-90,54,-41,54,-56,12,-108,42,-103,18,-87,12,-108,18,-87,14,-83,12,-108,14,-83,9,-77,12,-108,9,-77,4,-71,12,-108,4,-71,0,-66,12,-108,0,-66,-3,-107,-3,-107,0,-66,-4,-63,-3,-107,-4,-63,-9,-61,-3,-107,-9,-61,-14,-61,-3,-107,-14,-61,-16,-103,-20,-62,-26,-65,-26,-97,-20,-62,-26,-97,-16,-103,-20,-62,-16,-103,-14,-61,-30,-69,-33,-74,-32,-90,-30,-69,-32,-90,-26,-97,-30,-69,-26,-97,-26,-65,-32,-90,-33,-74,-34,-80,62,218,52,187,54,178,
-252,0,252,7,240,9,228,13,217,20,206,30,194,44,118,141,132,155,164,183,188,201,206,212,222,217,240,218,240,225,138,225,138,218,148,218,155,217,160,215,162,212,163,209,161,203,155,195,151,191,83,131,83,340,81,342,70,338,48,332,35,328,18,324,3,320,3,311,7,312,17,312,20,313,28,312,34,309,38,303,40,294,41,282,41,41,40,28,38,20,32,14,21,11,3,7,3,0,121,0,121,7,110,8,100,9,92,12,87,17,84,24,83,33,83,126,158,26,160,24,162,21,163,19,163,17,164,15,163,13,162,10,153,7,143,7,143,0,128,0,128,7,112,9,101,13,95,20,92,29,91,44,91,339,89,342,74,337,59,333,45,329,28,324,9,320,9,311,14,312,25,312,28,313,36,311,42,308,46,302,48,293,49,281,49,46,48,32,45,21,38,14,27,10,11,7,11,0,387,0,387,7,374,8,366,10,360,13,356,19,354,27,353,39,353,140,351,172,344,197,333,215,317,226,295,230,278,228,262,224,246,215,230,204,214,188,207,203,199,215,188,223,176,228,161,230,147,229,133,226,119,220,103,208,84,191,83,191,83,228,79,230,51,220,25,212,9,208,9,199,13,200,16,200,19,201,
+252,0,252,7,240,9,228,13,217,20,206,30,194,44,118,141,132,155,164,183,188,201,206,212,222,217,240,218,240,225,138,225,138,218,148,218,155,217,160,215,162,212,163,209,161,203,155,195,151,191,83,131,83,340,81,342,70,338,48,332,35,328,18,324,3,320,3,311,7,312,17,312,20,313,28,312,34,309,38,303,40,294,41,282,41,41,40,28,38,20,32,14,21,11,3,7,3,0,121,0,121,7,110,8,100,9,92,12,87,17,84,24,83,33,83,126,158,26,160,24,162,21,163,19,163,17,164,15,163,13,162,10,153,7,143,7,143,0,
 38,20,32,14,121,0,121,0,32,14,21,11,121,0,21,11,3,7,10,312,14,312,18,324,18,324,14,312,17,312,18,324,17,312,20,313,20,313,28,312,35,328,35,328,28,312,34,309,35,328,34,309,38,303,7,312,10,312,18,324,7,312,18,324,3,320,7,312,3,320,3,311,194,44,118,141,158,26,158,26,118,141,83,131,158,26,83,131,83,126,84,24,83,33,48,332,84,24,48,332,41,282,41,282,48,332,40,294,48,332,35,328,38,303,48,332,38,303,40,294,35,328,18,324,20,313,83,33,83,340,81,342,83,33,81,342,70,338,83,33,70,338,59,335,83,33,59,335,48,332,151,191,118,141,132,155,151,191,132,155,164,183,151,191,83,131,118,141,161,203,158,199,164,183,164,183,158,199,155,195,164,183,155,195,151,191,240,225,138,225,148,218,240,225,148,218,155,217,240,225,155,217,160,215,240,225,160,215,162,212,240,225,162,212,163,209,240,225,163,209,206,212,240,225,206,212,222,217,240,225,222,217,240,218,163,209,164,183,188,201,163,209,188,201,206,212,164,183,163,209,162,206,164,183,162,206,161,203,162,10,159,9,252,0,252,0,159,9,156,8,252,0,156,8,153,7,164,15,252,0,228,13,164,15,228,13,217,20,164,15,217,20,206,30,164,15,206,30,194,44,164,15,194,44,163,17,194,44,158,26,160,24,194,44,160,24,162,21,194,44,162,21,163,19,194,44,163,19,163,17,240,9,228,13,252,0,240,9,252,0,252,7,163,13,162,10,252,0,163,13,252,0,164,15,143,7,143,0,252,0,143,7,252,0,153,7,121,0,121,7,110,8,121,0,110,8,100,9,121,0,100,9,92,12,121,0,92,12,40,28,121,0,40,28,38,20,92,12,87,17,41,41,41,41,87,17,84,24,41,41,84,24,41,282,121,0,3,7,3,0,40,28,92,12,41,41,148,218,138,225,138,218,
-128,0,128,7,112,9,101,13,95,20,92,29,91,44,91,339,89,342,74,337,59,333,45,329,28,324,9,320,9,311,14,312,25,312,28,313,36,311,42,308,46,302,48,293,49,281,49,46,48,32,45,21,38,14,27,10,11,7,11,0,387,0,387,7,374,8,366,10,360,13,356,19,354,27,353,39,353,140,351,172,344,197,333,215,317,226,295,230,278,228,262,224,246,215,230,204,214,188,207,203,199,215,188,223,176,228,161,230,147,229,133,226,119,220,103,208,84,191,83,191,
+128,0,128,7,112,9,101,13,95,20,92,29,91,44,91,339,89,342,74,337,59,333,45,329,28,324,9,320,9,311,14,312,25,312,28,313,36,311,42,308,46,302,48,293,49,281,49,46,48,32,45,21,38,14,27,10,11,7,11,0,
 45,21,38,14,128,0,128,0,38,14,27,10,128,0,27,10,11,7,18,312,22,312,28,324,28,324,22,312,25,312,28,324,25,312,28,313,28,313,36,311,28,324,28,324,36,311,45,329,28,324,9,320,14,312,28,324,14,312,18,312,36,311,42,308,45,329,45,329,42,308,46,302,45,329,46,302,59,333,59,333,46,302,48,293,59,333,48,293,49,281,92,29,49,281,49,46,92,29,49,46,95,20,95,20,49,46,101,13,91,44,91,339,89,342,91,44,89,342,74,337,91,44,74,337,59,333,91,44,59,333,92,29,128,0,128,7,112,9,128,0,112,9,101,13,128,0,101,13,48,32,128,0,48,32,45,21,14,312,9,320,9,311,128,0,11,7,11,0,48,32,101,13,49,46,49,281,92,29,59,333,
-387,0,387,7,374,8,366,10,360,13,356,19,354,27,353,39,353,140,351,172,344,197,333,215,317,226,295,230,278,228,262,224,246,215,230,204,214,188,207,203,199,215,188,223,176,228,161,230,147,229,133,226,119,220,103,208,84,191,83,191,83,228,79,230,51,220,25,212,9,208,9,199,13,200,16,200,19,201,26,201,32,200,37,196,41,190,42,181,43,168,43,44,42,29,39,19,32,12,22,9,8,7,8,0,119,0,119,7,105,8,96,11,89,16,86,24,85,35,85,175,99,189,109,195,121,200,133,203,145,204,156,202,165,195,172,183,176,168,177,148,177,43,176,28,173,18,167,12,157,9,143,7,143,0,255,0,255,7,240,9,230,12,223,19,220,31,219,47,219,174,228,185,237,194,248,200,259,203,272,204,287,202,298,196,305,185,310,169,311,148,311,45,310,30,307,20,302,14,293,10,278,7,278,0,243,0,243,7,230,9,221,13,216,19,213,29,212,42,212,153,210,180,202,201,190,217,174,227,153,230,139,229,125,224,111,216,96,205,81,190,80,190,80,228,76,230,50,220,37,216,23,212,8,208,8,199,10,200,13,200,16,201,22,201,30,200,35,197,38,191,40,181,40,47,39,32,37,21,31,14,22,9,9,7,9,0,114,0,114,7,101,9,92,13,86,18,83,26,82,36,82,174,95,186,105,194,115,199,124,202,133,203,147,201,157,195,164,185,169,171,170,152,170,52,169,35,166,23,161,15,152,10,139,7,138,0,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,
+387,0,387,7,374,8,366,10,360,13,356,19,354,27,353,39,353,140,351,172,344,197,333,215,317,226,295,230,278,228,262,224,246,215,230,204,214,188,207,203,199,215,188,223,176,228,161,230,147,229,133,226,119,220,103,208,84,191,83,191,83,228,79,230,51,220,25,212,9,208,9,199,13,200,16,200,19,201,26,201,32,200,37,196,41,190,42,181,43,168,43,44,42,29,39,19,32,12,22,9,8,7,8,0,119,0,119,7,105,8,96,11,89,16,86,24,85,35,85,175,99,189,109,195,121,200,133,203,145,204,156,202,165,195,172,183,176,168,177,148,177,43,176,28,173,18,167,12,157,9,143,7,143,0,255,0,255,7,240,9,230,12,223,19,220,31,219,47,219,174,228,185,237,194,248,200,259,203,272,204,287,202,298,196,305,185,310,169,311,148,311,45,310,30,307,20,302,14,293,10,278,7,278,0,
 16,200,19,201,25,212,25,212,19,201,22,201,25,212,22,201,26,201,26,201,32,200,38,216,38,216,32,200,37,196,38,216,37,196,41,190,25,212,9,208,13,200,25,212,13,200,16,200,38,216,41,190,51,220,51,220,41,190,42,181,51,220,42,181,43,168,86,24,43,168,43,44,86,24,43,44,89,16,89,16,43,44,96,11,38,216,25,212,26,201,83,228,79,230,83,191,83,191,79,230,85,35,83,191,85,35,84,191,84,191,85,35,85,174,84,191,85,174,85,175,173,18,167,12,255,0,255,0,167,12,157,9,255,0,157,9,143,7,161,230,147,229,156,202,156,202,147,229,145,204,133,203,145,204,133,226,133,203,133,226,121,200,121,200,133,226,119,220,121,200,119,220,109,195,109,195,119,220,103,208,109,195,103,208,99,189,99,189,103,208,92,182,103,208,84,191,85,175,103,208,85,175,86,176,103,208,86,176,88,178,103,208,88,178,90,180,103,208,90,180,92,182,85,35,79,230,65,225,85,35,65,225,86,24,147,229,133,226,145,204,173,18,255,0,176,28,176,28,255,0,230,12,176,28,230,12,177,43,177,43,230,12,223,19,177,43,223,19,177,148,176,228,177,148,188,223,176,228,161,230,165,195,176,228,165,195,172,183,176,228,172,183,176,168,176,228,176,168,177,148,207,203,199,215,220,31,207,203,220,31,219,47,207,203,219,47,214,188,219,174,228,185,230,204,230,204,228,185,237,194,230,204,237,194,246,215,246,215,237,194,248,200,246,215,248,200,262,224,262,224,248,200,259,203,262,224,259,203,272,204,272,204,287,202,278,228,278,228,287,202,295,230,219,47,219,174,214,188,214,188,219,174,230,204,278,228,262,224,272,204,307,20,302,14,387,0,387,0,302,14,293,10,387,0,293,10,278,7,298,196,305,185,317,226,317,226,305,185,310,169,317,226,310,169,311,148,356,19,311,148,311,45,356,19,311,45,360,13,360,13,311,45,310,30,360,13,310,30,366,10,366,10,310,30,387,0,366,10,387,0,374,8,374,8,387,0,387,7,295,230,287,202,298,196,295,230,298,196,317,226,353,39,353,140,351,172,353,39,351,172,344,197,353,39,344,197,333,215,353,39,333,215,354,27,354,27,333,215,317,226,354,27,317,226,311,148,354,27,311,148,356,19,240,9,230,12,255,0,240,9,255,0,255,7,220,31,199,215,188,223,220,31,188,223,177,148,220,31,177,148,223,19,119,0,119,7,105,8,119,0,105,8,96,11,119,0,96,11,42,29,119,0,42,29,39,19,119,0,39,19,32,12,119,0,32,12,22,9,119,0,22,9,8,7,119,0,8,7,8,0,51,220,43,168,86,24,51,220,86,24,65,225,13,200,9,208,9,199,42,29,96,11,43,44,255,0,143,7,143,0,387,0,278,7,278,0,307,20,387,0,310,30,161,230,156,202,165,195,
-243,0,243,7,230,9,221,13,216,19,213,29,212,42,212,153,210,180,202,201,190,217,174,227,153,230,139,229,125,224,111,216,96,205,81,190,80,190,80,228,76,230,50,220,37,216,23,212,8,208,8,199,10,200,13,200,16,201,22,201,30,200,35,197,38,191,40,181,40,47,39,32,37,21,31,14,22,9,9,7,9,0,114,0,114,7,101,9,92,13,86,18,83,26,82,36,82,174,95,186,105,194,115,199,124,202,133,203,147,201,157,195,164,185,169,171,170,152,170,52,169,35,166,23,161,15,152,10,139,7,138,0,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,79,229,76,230,62,224,20,209,4,204,4,196,7,197,17,197,26,196,31,194,35,189,37,180,37,-78,
+243,0,243,7,230,9,221,13,216,19,213,29,212,42,212,153,210,180,202,201,190,217,174,227,153,230,139,229,125,224,111,216,96,205,81,190,80,190,80,228,76,230,50,220,37,216,23,212,8,208,8,199,10,200,13,200,16,201,22,201,30,200,35,197,38,191,40,181,40,47,39,32,37,21,31,14,22,9,9,7,9,0,114,0,114,7,101,9,92,13,86,18,83,26,82,36,82,174,95,186,105,194,115,199,124,202,133,203,147,201,157,195,164,185,169,171,170,152,170,52,169,35,166,23,161,15,152,10,139,7,138,0,
 37,21,31,14,114,0,114,0,31,14,22,9,114,0,22,9,9,7,13,200,16,201,23,212,23,212,16,201,19,201,23,212,19,201,22,201,22,201,30,200,23,212,23,212,30,200,37,216,23,212,8,208,10,200,23,212,10,200,13,200,30,200,35,197,37,216,37,216,35,197,38,191,37,216,38,191,50,220,50,220,38,191,40,181,50,220,40,181,40,169,83,26,40,169,40,47,83,26,40,47,86,18,86,18,40,47,92,13,80,228,76,230,80,190,80,190,76,230,82,36,80,190,82,36,81,190,81,190,82,36,82,174,81,190,82,174,96,205,96,205,82,174,95,186,96,205,95,186,105,194,96,205,105,194,111,216,111,216,105,194,115,199,111,216,115,199,125,224,125,224,115,199,124,202,125,224,124,202,133,203,133,203,147,201,139,229,139,229,147,201,153,230,82,36,76,230,63,225,82,36,63,225,83,26,139,229,125,224,133,203,166,23,161,15,243,0,243,0,161,15,152,10,243,0,152,10,139,7,157,195,164,185,174,227,174,227,164,185,169,171,174,227,169,171,170,152,216,19,170,152,170,52,216,19,170,52,221,13,221,13,170,52,169,35,221,13,169,35,243,0,243,0,169,35,166,23,153,230,147,201,157,195,153,230,157,195,174,227,212,42,212,153,210,180,212,42,210,180,202,201,212,42,202,201,213,29,230,9,221,13,243,0,230,9,243,0,243,7,213,29,202,201,190,217,213,29,190,217,174,227,213,29,174,227,170,152,213,29,170,152,216,19,114,0,114,7,101,9,114,0,101,9,92,13,114,0,92,13,39,32,114,0,39,32,37,21,50,220,40,169,83,26,50,220,83,26,63,225,10,200,8,208,8,199,114,0,9,7,9,0,39,32,92,13,40,47,243,0,139,7,138,0,
-235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,79,229,76,230,62,224,20,209,4,204,4,196,7,197,17,197,26,196,31,194,35,189,37,180,37,-78,34,-87,27,-93,17,-97,2,-99,2,-107,123,-107,123,-98,104,-97,92,-94,84,-88,80,-77,79,-61,79,17,90,8,99,2,108,-1,118,-3,130,-4,164,1,193,19,215,47,230,82,235,123,231,158,219,188,202,210,179,225,151,230,135,228,120,224,106,216,93,205,79,190,16383,16383,79,167,82,176,91,185,103,193,116,198,131,200,
+235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,
 64,91,58,17,69,70,69,70,58,17,88,1,69,70,88,1,76,51,76,51,88,1,86,34,93,25,86,34,88,1,93,25,88,1,123,-4,162,225,127,230,130,215,130,215,127,230,118,216,98,212,118,216,127,230,98,212,127,230,90,225,187,70,180,44,191,17,191,17,180,44,168,25,191,17,168,25,160,1,160,1,168,25,151,13,160,1,151,13,131,9,131,9,120,10,123,-4,123,-4,120,10,110,13,123,-4,110,13,101,18,140,211,149,206,162,225,162,225,149,206,158,199,162,225,158,199,165,191,165,191,174,177,191,210,191,210,174,177,181,161,191,210,181,161,186,142,230,154,215,186,215,43,230,154,215,43,230,76,230,154,230,76,235,116,187,70,191,17,190,102,190,102,191,17,191,210,191,210,191,17,215,43,191,210,215,43,215,186,191,210,186,142,189,122,191,210,189,122,190,102,191,210,162,225,165,191,131,9,123,-4,160,1,58,17,61,113,60,137,60,137,62,164,58,209,58,209,62,164,70,186,58,209,70,186,90,225,90,225,70,186,82,202,90,225,82,202,98,212,58,17,60,137,58,209,58,17,58,209,35,42,35,42,58,209,35,185,35,42,35,185,20,75,20,75,35,185,20,153,20,75,20,153,15,114,61,113,58,17,64,91,162,225,130,215,140,211,93,25,123,-4,101,18,
-79,229,76,230,62,224,20,209,4,204,4,196,7,197,17,197,26,196,31,194,35,189,37,180,37,-78,34,-87,27,-93,17,-97,2,-99,2,-107,123,-107,123,-98,104,-97,92,-94,84,-88,80,-77,79,-61,79,17,90,8,99,2,108,-1,118,-3,130,-4,164,1,193,19,215,47,230,82,235,123,231,158,219,188,202,210,179,225,151,230,135,228,120,224,106,216,93,205,79,190,16383,16383,79,167,82,176,91,185,103,193,116,198,131,200,151,195,168,183,181,163,189,136,192,103,189,73,181,47,168,28,152,15,132,11,117,13,103,18,91,26,82,35,79,44,244,-107,244,-99,231,-97,222,-93,216,-88,213,-80,213,228,207,228,180,213,167,220,155,224,144,228,122,230,87,224,57,206,33,179,18,144,12,103,16,67,27,38,44,15,66,0,92,-4,109,-2,126,1,142,8,157,19,171,32,171,-61,169,-75,165,-86,157,-93,144,-97,126,-99,126,-107,16383,16383,171,64,170,57,170,52,168,47,167,44,165,41,149,31,140,28,130,26,112,26,96,30,89,34,83,39,74,50,66,64,60,81,56,100,55,121,58,153,67,179,81,199,100,211,124,215,141,214,154,208,163,198,169,184,171,166,80,229,78,230,62,224,48,219,
+79,229,76,230,62,224,20,209,4,204,4,196,7,197,17,197,26,196,31,194,35,189,37,180,37,-78,34,-87,27,-93,17,-97,2,-99,2,-107,123,-107,123,-98,104,-97,92,-94,84,-88,80,-77,79,-61,79,17,90,8,99,2,108,-1,118,-3,130,-4,164,1,193,19,215,47,230,82,235,123,231,158,219,188,202,210,179,225,151,230,135,228,120,224,106,216,93,205,79,190,16383,16383,79,167,82,176,91,185,103,193,116,198,131,200,151,195,168,183,181,163,189,136,192,103,189,73,181,47,168,28,152,15,132,11,117,13,103,18,91,26,82,35,79,44,
 34,-87,27,-93,123,-107,123,-107,27,-93,17,-97,123,-107,17,-97,2,-99,9,197,12,197,20,209,20,209,12,197,14,197,20,209,14,197,17,197,17,197,26,196,20,209,20,209,26,196,34,214,20,209,4,204,7,197,20,209,7,197,9,197,82,35,79,44,90,8,90,8,79,44,79,17,80,-77,79,-61,48,219,80,-77,48,219,37,169,37,169,48,219,37,180,26,196,31,194,34,214,34,214,31,194,35,189,34,214,35,189,48,219,48,219,35,189,37,180,79,190,79,229,76,230,79,190,76,230,79,-61,79,190,79,-61,79,167,79,190,79,167,82,176,79,190,82,176,93,205,235,123,231,158,230,82,230,82,231,158,219,188,230,82,219,188,215,47,215,47,219,188,202,210,215,47,202,210,193,19,193,19,202,210,192,103,193,19,192,103,189,73,193,19,189,73,181,47,202,210,179,225,181,163,202,210,181,163,189,136,202,210,189,136,192,103,135,228,131,200,151,195,135,228,151,195,151,230,151,230,151,195,168,183,151,230,168,183,179,225,179,225,168,183,181,163,108,-1,118,-3,117,13,117,13,118,-3,132,11,152,15,132,11,164,1,152,15,164,1,168,28,168,28,164,1,193,19,168,28,193,19,181,47,132,11,118,-3,130,-4,132,11,130,-4,164,1,123,-107,123,-98,104,-97,123,-107,104,-97,92,-94,123,-107,92,-94,37,-78,123,-107,37,-78,34,-87,62,224,48,219,79,-61,62,224,79,-61,76,230,92,-94,84,-88,37,-64,37,-64,84,-88,80,-77,37,-64,80,-77,37,169,82,176,91,185,93,205,93,205,91,185,103,193,93,205,103,193,106,216,106,216,103,193,116,198,106,216,116,198,120,224,120,224,116,198,131,200,120,224,131,200,135,228,82,35,90,8,91,26,91,26,90,8,99,2,91,26,99,2,103,18,103,18,99,2,108,-1,103,18,108,-1,117,13,7,197,4,204,4,196,123,-107,2,-99,2,-107,37,-78,92,-94,37,-64,
-244,-107,244,-99,231,-97,222,-93,216,-88,213,-80,213,228,207,228,180,213,167,220,155,224,144,228,122,230,87,224,57,206,33,179,18,144,12,103,16,67,27,38,44,15,66,0,92,-4,109,-2,126,1,142,8,157,19,171,32,171,-61,169,-75,165,-86,157,-93,144,-97,126,-99,126,-107,16383,16383,171,64,170,57,170,52,168,47,167,44,165,41,149,31,140,28,130,26,112,26,96,30,89,34,83,39,74,50,66,64,60,81,56,100,55,121,58,153,67,179,81,199,100,211,124,215,141,214,154,208,163,198,169,184,171,166,80,229,78,230,62,224,48,219,35,214,20,209,3,203,3,195,7,196,11,196,14,197,21,197,28,196,32,193,36,187,37,179,38,167,38,42,37,29,35,21,29,15,18,11,2,7,2,0,123,0,123,7,105,9,93,13,85,20,81,30,80,45,80,157,82,168,88,179,97,189,106,196,115,199,119,197,122,196,125,194,128,191,133,187,137,184,141,182,144,181,148,181,155,182,160,185,164,190,167,196,167,204,166,213,163,220,157,225,149,229,140,230,128,228,117,224,106,215,94,202,80,183,78,151,71,156,64,163,
+244,-107,244,-99,231,-97,222,-93,216,-88,213,-80,213,228,207,228,180,213,167,220,155,224,144,228,122,230,87,224,57,206,33,179,18,144,12,103,16,67,27,38,44,15,66,0,92,-4,109,-2,126,1,142,8,157,19,171,32,171,-61,169,-75,165,-86,157,-93,144,-97,126,-99,126,-107,16383,16383,171,64,170,57,170,52,168,47,167,44,165,41,149,31,140,28,130,26,112,26,96,30,89,34,83,39,74,50,66,64,60,81,56,100,55,121,58,153,67,179,81,199,100,211,124,215,141,214,154,208,163,198,169,184,171,166,
 112,26,104,28,109,-2,109,-2,104,28,96,30,109,-2,96,30,92,-4,92,-4,96,30,89,34,92,-4,89,34,83,39,83,39,74,50,92,-4,92,-4,74,50,66,64,92,-4,66,64,66,0,66,0,66,64,60,81,66,0,60,81,56,100,109,-2,126,1,112,26,112,26,126,1,121,26,130,26,121,26,126,1,130,26,126,1,142,8,133,229,124,215,141,214,133,229,141,214,144,228,144,228,141,214,154,208,144,228,154,208,155,224,155,224,154,208,163,198,155,224,163,198,167,220,167,220,163,198,169,184,167,220,169,184,180,213,180,213,169,184,171,166,180,213,171,166,171,32,171,32,171,166,171,64,67,179,81,199,87,224,87,224,81,199,100,211,87,224,100,211,122,230,122,230,100,211,124,215,122,230,124,215,133,229,57,206,33,179,44,15,57,206,44,15,55,121,57,206,55,121,58,153,57,206,58,153,67,179,57,206,67,179,87,224,55,121,44,15,56,100,12,103,16,67,18,144,18,144,16,67,27,38,18,144,27,38,33,179,33,179,27,38,44,15,165,-86,157,-93,244,-107,244,-107,157,-93,144,-97,244,-107,144,-97,126,-99,170,52,168,47,171,32,171,32,168,47,167,44,171,32,167,44,165,41,165,41,157,36,171,32,171,32,157,36,157,19,170,57,170,52,171,32,170,57,171,32,171,64,149,31,140,28,142,8,149,31,142,8,157,19,149,31,157,19,157,36,213,-69,213,228,207,228,213,-69,207,228,180,213,213,-69,180,213,213,-80,244,-107,244,-99,231,-97,244,-107,231,-97,222,-93,244,-107,222,-93,169,-75,244,-107,169,-75,165,-86,171,32,216,-88,213,-80,171,32,213,-80,180,213,171,-61,169,-75,222,-93,171,-61,222,-93,216,-88,171,-61,216,-88,171,32,244,-107,126,-99,126,-107,56,100,44,15,66,0,130,26,142,8,140,28,
-80,229,78,230,62,224,48,219,35,214,20,209,3,203,3,195,7,196,11,196,14,197,21,197,28,196,32,193,36,187,37,179,38,167,38,42,37,29,35,21,29,15,18,11,2,7,2,0,123,0,123,7,105,9,93,13,85,20,81,30,80,45,80,157,82,168,88,179,97,189,106,196,115,199,119,197,122,196,125,194,128,191,133,187,137,184,141,182,144,181,148,181,155,182,160,185,164,190,167,196,167,204,166,213,163,220,157,225,149,229,140,230,128,228,117,224,106,215,94,202,80,183,78,151,71,156,64,163,60,170,57,178,56,185,58,197,63,207,71,214,82,217,94,219,110,217,123,210,134,198,143,181,151,157,158,157,156,225,150,225,145,220,140,220,137,221,134,221,131,223,122,226,115,228,109,229,94,229,72,227,53,219,38,207,29,190,26,168,28,153,35,138,47,123,63,109,85,95,113,80,129,68,134,60,138,52,139,43,137,31,132,21,123,13,112,8,98,6,79,9,63,17,51,31,41,50,34,76,26,76,26,-1,32,-1,34,0,36,2,39,3,41,4,48,4,
+80,229,78,230,62,224,48,219,35,214,20,209,3,203,3,195,7,196,11,196,14,197,21,197,28,196,32,193,36,187,37,179,38,167,38,42,37,29,35,21,29,15,18,11,2,7,2,0,123,0,123,7,105,9,93,13,85,20,81,30,80,45,80,157,82,168,88,179,97,189,106,196,115,199,119,197,122,196,125,194,128,191,133,187,137,184,141,182,144,181,148,181,155,182,160,185,164,190,167,196,167,204,166,213,163,220,157,225,149,229,140,230,128,228,117,224,106,215,94,202,80,183,
 11,196,14,197,20,209,20,209,14,197,18,197,20,209,18,197,21,197,21,197,28,196,35,214,35,214,28,196,32,193,35,214,32,193,36,187,20,209,3,203,7,196,20,209,7,196,11,196,80,183,80,229,78,230,80,183,78,230,80,45,80,45,78,230,62,224,80,45,62,224,81,30,81,30,62,224,48,219,81,30,48,219,38,167,38,167,48,219,37,179,48,219,35,214,36,187,48,219,36,187,37,179,35,214,20,209,21,197,122,196,128,228,119,197,119,197,128,228,117,224,119,197,117,224,117,198,117,198,117,224,115,199,106,196,115,199,117,224,106,196,117,224,106,215,137,184,140,230,133,187,133,187,140,230,128,228,133,187,128,228,128,191,128,191,128,228,125,194,144,181,148,181,149,229,149,229,148,181,155,182,149,229,155,182,157,225,157,225,155,182,160,185,157,225,160,185,163,220,163,220,160,185,164,190,163,220,164,190,166,213,166,213,164,190,167,196,166,213,167,196,167,204,141,182,144,181,149,229,141,182,149,229,140,230,141,182,140,230,137,184,82,168,88,179,94,202,94,202,88,179,97,189,94,202,97,189,106,215,106,215,97,189,106,196,80,45,80,157,80,183,80,183,80,157,82,168,80,183,82,168,94,202,123,0,123,7,105,9,123,0,105,9,93,13,123,0,93,13,37,29,123,0,37,29,35,21,123,0,35,21,29,15,123,0,29,15,18,11,123,0,18,11,2,7,123,0,2,7,2,0,93,13,85,20,38,42,38,42,85,20,81,30,38,42,81,30,38,167,7,196,3,203,3,195,37,29,93,13,38,42,128,228,122,196,125,194,
-78,151,71,156,64,163,60,170,57,178,56,185,58,197,63,207,71,214,82,217,94,219,110,217,123,210,134,198,143,181,151,157,158,157,156,225,150,225,145,220,140,220,137,221,134,221,131,223,122,226,115,228,109,229,94,229,72,227,53,219,38,207,29,190,26,168,28,153,35,138,47,123,63,109,85,95,113,80,129,68,134,60,138,52,139,43,137,31,132,21,123,13,112,8,98,6,79,9,63,17,51,31,41,50,34,76,26,76,26,-1,32,-1,34,0,36,2,39,3,41,4,48,4,52,3,56,3,61,1,68,0,75,-2,82,-3,90,-4,104,-4,126,-1,145,7,160,21,170,38,174,57,173,73,168,86,159,97,147,108,130,119,133,39,127,32,121,27,115,24,109,22,103,21,93,23,86,28,81,36,78,49,77,66,77,209,127,209,127,225,77,225,77,286,76,287,76,289,75,289,74,290,72,287,69,284,65,278,64,276,53,260,42,247,32,236,23,228,15,222,12,220,8,216,7,214,7,210,8,210,8,209,35,209,35,59,37,36,42,18,51,5,64,-1,79,-4,93,-3,106,1,118,8,129,19,140,33,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,
+78,151,71,156,64,163,60,170,57,178,56,185,58,197,63,207,71,214,82,217,94,219,110,217,123,210,134,198,143,181,151,157,158,157,156,225,150,225,145,220,140,220,137,221,134,221,131,223,122,226,115,228,109,229,94,229,72,227,53,219,38,207,29,190,26,168,28,153,35,138,47,123,63,109,85,95,113,80,129,68,134,60,138,52,139,43,137,31,132,21,123,13,112,8,98,6,79,9,63,17,51,31,41,50,34,76,26,76,26,-1,32,-1,34,0,36,2,39,3,41,4,48,4,52,3,56,3,61,1,68,0,75,-2,82,-3,90,-4,104,-4,126,-1,145,7,160,21,170,38,174,57,173,73,168,86,159,97,147,108,130,119,
 36,2,39,3,41,50,41,50,39,3,41,4,41,50,41,4,45,4,45,4,48,4,51,31,51,31,48,4,52,3,51,31,52,3,63,17,63,17,52,3,56,3,63,17,56,3,61,1,36,2,41,50,34,0,34,0,41,50,34,76,34,0,34,76,32,-1,32,-1,34,76,26,76,32,-1,26,76,26,-1,72,227,53,219,58,197,58,197,53,219,56,185,63,109,56,185,53,219,63,109,53,219,47,123,47,123,53,219,38,207,47,123,38,207,35,138,35,138,38,207,29,190,35,138,29,190,28,153,28,153,29,190,26,168,102,229,94,229,110,217,110,217,94,229,94,219,82,217,94,219,94,229,82,217,94,229,72,227,137,221,134,221,134,198,134,198,134,221,131,223,134,198,131,223,128,224,128,224,122,226,123,210,123,210,122,226,115,228,123,210,115,228,110,217,110,217,115,228,109,229,110,217,109,229,102,229,148,223,146,221,151,157,151,157,146,221,145,220,151,157,145,220,143,181,143,181,145,220,143,220,143,181,143,220,142,220,142,220,140,220,143,181,143,181,140,220,137,221,143,181,137,221,134,198,151,157,158,157,156,225,151,157,156,225,150,225,151,157,150,225,148,223,128,224,123,210,134,198,174,57,173,73,170,38,170,38,173,73,168,86,170,38,168,86,160,21,160,21,168,86,159,97,160,21,159,97,147,108,123,13,126,-1,132,21,132,21,126,-1,145,7,132,21,145,7,137,31,137,31,145,7,139,43,147,108,139,43,145,7,147,108,145,7,160,21,121,74,129,68,130,119,130,119,129,68,134,60,130,119,134,60,147,108,147,108,134,60,138,52,147,108,138,52,139,43,130,119,78,151,85,95,130,119,85,95,113,80,130,119,113,80,121,74,78,151,71,156,85,95,85,95,71,156,64,163,85,95,64,163,63,109,63,109,64,163,60,170,63,109,60,170,57,178,98,6,104,-4,112,8,112,8,104,-4,126,-1,112,8,126,-1,123,13,72,227,58,197,63,207,72,227,63,207,71,214,72,227,71,214,82,217,98,6,79,9,82,-3,98,6,82,-3,90,-4,98,6,90,-4,97,-4,98,6,97,-4,104,-4,79,9,63,17,68,0,79,9,68,0,75,-2,79,9,75,-2,82,-3,68,0,63,17,61,1,51,31,41,50,45,4,56,185,63,109,57,178,
-133,39,127,32,121,27,115,24,109,22,103,21,93,23,86,28,81,36,78,49,77,66,77,209,127,209,127,225,77,225,77,286,76,287,76,289,75,289,74,290,72,287,69,284,65,278,64,276,53,260,42,247,32,236,23,228,15,222,12,220,8,216,7,214,7,210,8,210,8,209,35,209,35,59,37,36,42,18,51,5,64,-1,79,-4,93,-3,106,1,118,8,129,19,140,33,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,
+133,39,127,32,121,27,115,24,109,22,103,21,93,23,86,28,81,36,78,49,77,66,77,209,127,209,127,225,77,225,77,286,76,287,76,289,75,289,74,290,72,287,69,284,65,278,64,276,53,260,42,247,32,236,23,228,15,222,12,220,8,216,7,214,7,210,8,210,8,209,35,209,35,59,37,36,42,18,51,5,64,-1,79,-4,93,-3,106,1,118,8,129,19,140,33,
 42,247,32,236,35,209,35,209,32,236,23,228,35,209,23,228,15,222,53,260,42,247,42,18,53,260,42,18,51,5,53,260,51,5,64,-1,53,260,64,-1,64,276,37,36,42,18,42,247,37,36,42,247,35,209,37,36,35,209,35,59,7,210,8,210,8,216,8,216,8,210,8,209,8,216,8,209,10,218,10,218,8,209,35,209,10,218,35,209,12,220,12,220,35,209,15,222,7,214,7,213,7,212,7,214,7,212,7,211,7,214,7,211,7,210,7,214,7,210,8,216,69,284,79,-4,77,66,77,225,77,209,127,209,77,225,127,209,127,225,77,66,77,283,77,286,77,66,77,286,76,287,77,66,76,287,76,289,77,66,76,289,75,289,77,66,75,289,74,290,77,66,74,290,72,287,77,66,72,287,69,284,86,28,93,-3,93,23,93,23,93,-3,103,21,109,22,103,21,106,1,109,22,106,1,118,8,81,36,78,49,79,-4,81,36,79,-4,93,-3,81,36,93,-3,86,28,79,-4,69,284,67,281,79,-4,67,281,65,278,79,-4,65,278,64,276,79,-4,64,276,64,-1,129,19,140,33,133,39,129,19,133,39,127,32,129,19,127,32,121,27,129,19,121,27,118,8,115,24,109,22,118,8,115,24,118,8,121,27,103,21,93,-3,106,1,77,66,79,-4,78,49,
-240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,169,38,169,-2,171,-3,186,1,199,6,225,14,240,18,238,225,169,225,169,218,178,216,184,214,189,211,192,207,193,201,192,198,192,195,191,192,191,189,190,186,140,57,89,185,87,190,86,194,85,197,84,201,84,204,85,209,88,212,92,215,99,216,108,218,108,225,9,225,9,218,19,216,27,212,35,202,44,186,55,160,115,17,116,14,118,10,118,8,119,6,121,1,123,-1,125,-4,126,-6,128,-6,130,-5,132,-3,135,1,138,8,142,18,206,179,213,195,219,206,224,213,231,216,238,218,
+240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,169,38,169,-2,171,-3,186,1,199,6,225,14,240,18,
 78,225,4,225,17,216,78,225,17,216,26,213,78,225,26,213,32,207,78,225,32,207,35,197,78,225,35,197,36,185,78,225,36,185,38,38,78,225,38,38,46,20,78,225,46,20,58,6,78,225,58,6,75,-1,78,225,75,-1,78,64,164,53,162,48,168,38,168,38,162,48,159,43,168,38,159,43,155,40,155,40,147,34,153,21,153,21,147,34,139,29,153,21,139,29,138,8,138,8,139,29,130,26,138,8,130,26,123,0,123,0,130,26,121,25,123,0,121,25,113,24,113,24,102,26,109,-3,109,-3,102,26,97,-4,97,-4,102,26,92,31,97,-4,92,31,84,40,97,-4,84,40,79,51,97,-4,79,51,75,-1,78,64,75,-1,79,51,113,24,109,-3,123,0,166,184,168,38,209,225,209,225,168,38,169,38,209,225,169,38,171,-3,171,-3,169,38,169,-2,168,38,166,184,166,69,168,38,166,69,166,59,168,38,166,59,164,53,155,40,153,21,168,38,225,26,217,29,225,14,225,14,217,29,212,34,225,14,212,34,212,10,212,10,212,34,209,42,212,10,209,42,199,6,199,6,209,42,209,54,199,6,209,54,209,225,209,225,171,-3,186,1,209,225,186,1,199,6,209,225,129,225,145,215,209,225,145,215,155,212,209,225,155,212,162,206,209,225,162,206,165,197,209,225,165,197,166,184,237,25,225,26,225,14,237,25,225,14,240,18,237,25,240,18,240,25,38,38,36,185,36,59,145,215,129,225,129,217,17,216,4,225,4,218,
-238,225,169,225,169,218,178,216,184,214,189,211,192,207,193,201,192,198,192,195,191,192,191,189,190,186,140,57,89,185,87,190,86,194,85,197,84,201,84,204,85,209,88,212,92,215,99,216,108,218,108,225,9,225,9,218,19,216,27,212,35,202,44,186,55,160,115,17,116,14,118,10,118,8,119,6,121,1,123,-1,125,-4,126,-6,128,-6,130,-5,132,-3,135,1,138,8,142,18,206,179,213,195,219,206,224,213,231,216,238,218,347,225,286,225,286,218,294,215,301,213,305,210,307,207,307,197,306,191,302,177,299,169,254,58,209,178,206,185,204,195,204,205,207,210,212,213,221,215,233,218,233,225,131,225,131,218,141,216,148,212,155,206,160,196,166,183,175,155,130,55,80,186,79,189,79,192,78,195,78,206,81,211,85,214,91,216,100,218,100,225,11,225,11,218,17,216,22,214,26,208,31,199,37,186,104,15,108,7,111,0,113,-3,116,-5,118,-6,121,-3,
+238,225,169,225,169,218,178,216,184,214,189,211,192,207,193,201,192,198,192,195,191,192,191,189,190,186,140,57,89,185,87,190,86,194,85,197,84,201,84,204,85,209,88,212,92,215,99,216,108,218,108,225,9,225,9,218,19,216,27,212,35,202,44,186,55,160,115,17,116,14,118,10,118,8,119,6,121,1,123,-1,125,-4,126,-6,128,-6,130,-5,132,-3,135,1,138,8,142,18,206,179,213,195,219,206,224,213,231,216,238,218,
 87,190,86,194,115,17,115,17,86,194,85,197,115,17,85,197,55,160,55,160,85,197,84,201,55,160,84,201,84,204,84,204,85,209,55,160,108,225,9,225,19,216,108,225,19,216,27,212,108,225,27,212,35,202,108,225,35,202,44,186,108,225,44,186,88,212,108,225,88,212,92,215,108,225,92,215,99,216,108,225,99,216,108,218,85,209,88,212,44,186,85,209,44,186,55,160,140,57,89,185,115,17,140,57,115,17,116,14,140,57,116,14,117,12,140,57,117,12,118,10,140,57,118,10,118,8,140,57,118,8,119,6,140,57,119,6,121,1,140,57,121,1,123,-1,140,57,123,-1,125,-4,140,57,125,-4,126,-6,140,57,126,-6,128,-6,140,57,128,-6,130,-5,140,57,130,-5,132,-3,140,57,132,-3,135,1,140,57,135,1,138,8,140,57,138,8,142,18,140,57,142,18,190,186,206,179,190,186,142,18,238,225,169,225,178,216,238,225,178,216,184,214,238,225,184,214,189,211,238,225,189,211,192,207,238,225,192,207,193,201,238,225,193,201,224,213,238,225,224,213,231,216,238,225,231,216,238,218,206,179,213,195,193,201,206,179,193,201,192,198,206,179,192,198,192,195,206,179,192,195,191,192,206,179,191,192,191,189,206,179,191,189,190,186,219,206,224,213,193,201,219,206,193,201,213,195,178,216,169,225,169,218,87,190,115,17,89,185,19,216,9,225,9,218,
-347,225,286,225,286,218,294,215,301,213,305,210,307,207,307,197,306,191,302,177,299,169,254,58,209,178,206,185,204,195,204,205,207,210,212,213,221,215,233,218,233,225,131,225,131,218,141,216,148,212,155,206,160,196,166,183,175,155,130,55,80,186,79,189,79,192,78,195,78,206,81,211,85,214,91,216,100,218,100,225,11,225,11,218,17,216,22,214,26,208,31,199,37,186,104,15,108,7,111,0,113,-3,116,-5,118,-6,121,-3,123,0,126,5,130,12,186,132,232,15,235,5,238,0,241,-6,246,-6,250,0,253,7,257,17,326,190,331,200,334,207,338,212,342,215,347,218,239,0,239,7,230,8,222,12,215,18,207,26,199,37,134,136,176,195,182,203,190,209,198,214,207,216,217,218,217,225,137,225,137,218,145,217,151,215,155,213,157,210,157,202,154,197,150,191,145,184,136,169,133,165,130,160,124,152,123,154,121,156,119,160,117,162,109,174,103,185,98,194,95,201,94,206,95,210,97,213,101,216,107,217,116,218,116,225,12,225,12,218,17,218,25,217,32,214,39,208,47,200,55,187,55,188,102,116,45,33,37,22,31,15,24,11,17,9,8,7,8,0,81,0,81,7,73,8,68,9,64,11,62,13,61,17,61,19,62,22,64,26,67,31,
+347,225,286,225,286,218,294,215,301,213,305,210,307,207,307,197,306,191,302,177,299,169,254,58,209,178,206,185,204,195,204,205,207,210,212,213,221,215,233,218,233,225,131,225,131,218,141,216,148,212,155,206,160,196,166,183,175,155,130,55,80,186,79,189,79,192,78,195,78,206,81,211,85,214,91,216,100,218,100,225,11,225,11,218,17,216,22,214,26,208,31,199,37,186,104,15,108,7,111,0,113,-3,116,-5,118,-6,121,-3,123,0,126,5,130,12,186,132,232,15,235,5,238,0,241,-6,246,-6,250,0,253,7,257,17,326,190,331,200,334,207,338,212,342,215,347,218,
 22,214,26,208,100,225,100,225,26,208,31,199,100,225,31,199,37,186,37,186,104,15,78,195,78,195,104,15,79,192,37,186,78,198,78,201,78,201,78,206,37,186,37,186,78,206,81,211,37,186,81,211,85,214,100,225,37,186,85,214,100,225,85,214,91,216,100,225,91,216,100,218,17,216,22,214,100,225,17,216,100,225,11,225,17,216,11,225,11,218,186,132,204,200,204,205,186,132,204,205,175,155,175,155,204,205,166,183,160,196,166,183,207,210,160,196,207,210,212,213,233,225,131,225,141,216,233,225,141,216,148,212,233,225,148,212,155,206,233,225,155,206,160,196,233,225,160,196,212,213,233,225,212,213,221,215,233,225,221,215,233,218,207,210,166,183,204,205,254,58,212,170,232,15,254,58,232,15,235,5,254,58,235,5,238,0,254,58,238,0,240,-4,254,58,240,-4,241,-6,254,58,241,-6,243,-6,254,58,243,-6,246,-6,254,58,246,-6,248,-3,254,58,248,-3,250,0,254,58,250,0,253,7,254,58,253,7,257,17,254,58,257,17,299,169,232,15,212,170,209,178,232,15,209,178,206,185,232,15,206,185,205,190,232,15,205,190,204,195,232,15,204,195,186,132,326,190,299,169,257,17,347,225,286,225,294,215,347,225,294,215,301,213,347,225,301,213,305,210,347,225,305,210,307,207,347,225,307,207,307,203,347,225,307,203,334,207,347,225,334,207,338,212,347,225,338,212,342,215,347,225,342,215,347,218,326,190,331,200,307,203,326,190,307,203,307,197,326,190,307,197,306,191,326,190,306,191,304,184,326,190,304,184,302,177,326,190,302,177,299,169,123,0,126,5,130,55,130,55,126,5,130,12,130,55,130,12,175,155,175,155,130,12,186,132,130,55,80,186,104,15,130,55,104,15,108,7,130,55,108,7,111,0,130,55,111,0,113,-3,130,55,113,-3,116,-5,130,55,116,-5,118,-6,130,55,118,-6,119,-5,130,55,119,-5,121,-3,130,55,121,-3,123,0,79,189,79,192,104,15,79,189,104,15,80,186,37,186,78,195,78,198,294,215,286,225,286,218,334,207,307,203,331,200,186,132,204,195,204,200,141,216,131,225,131,218,
-239,0,239,7,230,8,222,12,215,18,207,26,199,37,134,136,176,195,182,203,190,209,198,214,207,216,217,218,217,225,137,225,137,218,145,217,151,215,155,213,157,210,157,202,154,197,150,191,145,184,136,169,133,165,130,160,124,152,123,154,121,156,119,160,117,162,109,174,103,185,98,194,95,201,94,206,95,210,97,213,101,216,107,217,116,218,116,225,12,225,12,218,17,218,25,217,32,214,39,208,47,200,55,187,55,188,102,116,45,33,37,22,31,15,24,11,17,9,8,7,8,0,81,0,81,7,73,8,68,9,64,11,62,13,61,17,61,19,62,22,64,26,67,31,71,37,110,99,156,28,157,27,159,23,159,15,157,12,153,9,147,8,139,7,139,0,238,225,171,225,171,218,179,217,186,216,190,213,193,210,194,205,194,202,193,201,193,198,192,196,143,59,88,184,82,196,81,201,81,204,82,209,85,212,90,215,98,217,109,218,109,225,7,225,7,218,14,217,21,214,26,211,30,206,33,200,99,60,105,47,111,35,116,24,121,9,119,2,116,-8,112,-21,106,-34,100,-44,96,-51,85,-62,80,-65,75,-66,71,-66,69,-65,66,-64,62,-63,63,-63,57,-60,52,-58,42,-56,36,-56,30,-57,24,-60,19,-65,16,-72,15,-79,17,-88,21,-96,28,-102,38,-106,50,-108,71,-105,90,-94,106,-76,122,-49,137,-11,213,192,217,202,221,208,226,213,231,216,238,218,209,68,200,70,197,57,195,47,193,40,190,34,186,28,181,24,173,20,
+239,0,239,7,230,8,222,12,215,18,207,26,199,37,134,136,176,195,182,203,190,209,198,214,207,216,217,218,217,225,137,225,137,218,145,217,151,215,155,213,157,210,157,202,154,197,150,191,145,184,136,169,133,165,130,160,124,152,123,154,121,156,119,160,117,162,109,174,103,185,98,194,95,201,94,206,95,210,97,213,101,216,107,217,116,218,116,225,12,225,12,218,17,218,25,217,32,214,39,208,47,200,55,187,55,188,102,116,45,33,37,22,31,15,24,11,17,9,8,7,8,0,81,0,81,7,73,8,68,9,64,11,62,13,61,17,61,19,62,22,64,26,67,31,71,37,110,99,156,28,157,27,159,23,159,15,157,12,153,9,147,8,139,7,139,0,
 31,15,24,11,81,0,81,0,24,11,17,9,81,0,17,9,8,7,32,214,39,208,116,225,116,225,39,208,47,200,116,225,47,200,55,188,55,187,55,188,102,116,55,187,102,116,94,206,94,206,95,210,55,187,55,187,95,210,97,213,55,187,97,213,116,225,116,225,97,213,101,216,116,225,101,216,107,217,31,15,81,0,37,22,37,22,81,0,64,11,37,22,64,11,45,33,45,33,64,11,62,13,45,33,62,13,61,17,61,17,61,19,45,33,45,33,61,19,62,22,45,33,62,22,102,116,102,116,62,22,64,26,102,116,64,26,67,31,102,116,67,31,71,37,71,37,110,99,102,116,102,116,110,99,103,185,102,116,103,185,98,194,107,217,116,218,116,225,116,225,12,225,17,218,116,225,17,218,25,217,116,225,25,217,32,214,95,201,94,206,102,116,95,201,102,116,98,194,121,156,120,158,156,28,156,28,120,158,119,160,156,28,119,160,117,162,117,162,109,174,110,99,110,99,109,174,103,185,222,12,215,18,159,20,159,20,215,18,207,26,159,20,207,26,199,37,199,37,134,136,156,28,156,28,134,136,127,156,156,28,127,156,124,152,124,152,123,154,156,28,156,28,123,154,121,156,217,225,137,225,145,217,217,225,145,217,151,215,217,225,151,215,155,213,217,225,155,213,157,210,217,225,157,210,157,206,217,225,157,206,190,209,217,225,190,209,198,214,217,225,198,214,207,216,217,225,207,216,217,218,176,195,182,203,157,206,176,195,157,206,157,202,176,195,157,202,154,197,176,195,154,197,150,191,176,195,150,191,145,184,176,195,145,184,139,174,176,195,139,174,136,169,176,195,136,169,134,136,134,136,136,169,133,165,134,136,133,165,130,160,134,136,130,160,127,156,157,12,153,9,239,0,239,0,153,9,147,8,239,0,147,8,139,7,158,25,159,23,199,37,199,37,159,23,159,21,199,37,159,21,159,20,159,20,159,15,239,0,239,0,159,15,157,12,199,37,156,28,157,27,199,37,157,27,158,25,117,162,110,99,156,28,239,0,239,7,230,8,239,0,230,8,222,12,239,0,222,12,159,20,81,0,81,7,73,8,81,0,73,8,68,9,81,0,68,9,64,11,81,0,8,7,8,0,239,0,139,7,139,0,145,217,137,225,137,218,190,209,157,206,182,203,17,218,12,225,12,218,116,225,55,188,55,187,
-238,225,171,225,171,218,179,217,186,216,190,213,193,210,194,205,194,202,193,201,193,198,192,196,143,59,88,184,82,196,81,201,81,204,82,209,85,212,90,215,98,217,109,218,109,225,7,225,7,218,14,217,21,214,26,211,30,206,33,200,99,60,105,47,111,35,116,24,121,9,119,2,116,-8,112,-21,106,-34,100,-44,96,-51,85,-62,80,-65,75,-66,71,-66,69,-65,66,-64,62,-63,63,-63,57,-60,52,-58,42,-56,36,-56,30,-57,24,-60,19,-65,16,-72,15,-79,17,-88,21,-96,28,-102,38,-106,50,-108,71,-105,90,-94,106,-76,122,-49,137,-11,213,192,217,202,221,208,226,213,231,216,238,218,209,68,200,70,197,57,195,47,193,40,190,34,186,28,181,24,173,20,163,17,149,16,133,15,67,15,201,218,201,225,28,225,26,166,36,166,39,184,44,197,51,205,63,209,79,210,147,210,13,7,13,0,201,0,175,-84,157,-78,144,-69,136,-58,131,-42,129,-22,129,60,128,82,124,98,115,110,102,118,83,124,102,131,115,140,124,151,128,167,129,189,129,273,131,293,136,308,144,320,157,328,175,334,175,340,157,339,144,338,132,336,114,328,107,321,100,312,96,300,94,287,93,271,93,181,91,163,87,149,80,139,67,131,50,125,67,118,80,110,87,100,91,86,93,68,93,-20,94,-35,96,-49,
+238,225,171,225,171,218,179,217,186,216,190,213,193,210,194,205,194,202,193,201,193,198,192,196,143,59,88,184,82,196,81,201,81,204,82,209,85,212,90,215,98,217,109,218,109,225,7,225,7,218,14,217,21,214,26,211,30,206,33,200,99,60,105,47,111,35,116,24,121,9,119,2,116,-8,112,-21,106,-34,100,-44,96,-51,85,-62,80,-65,75,-66,71,-66,69,-65,66,-64,62,-63,63,-63,57,-60,52,-58,42,-56,36,-56,30,-57,24,-60,19,-65,16,-72,15,-79,17,-88,21,-96,28,-102,38,-106,50,-108,71,-105,90,-94,106,-76,122,-49,137,-11,213,192,217,202,221,208,226,213,231,216,238,218,
 90,-57,85,-62,90,-94,90,-94,85,-62,80,-65,90,-94,80,-65,75,-66,75,-66,73,-66,90,-94,90,-94,73,-66,71,-105,90,-57,106,-76,96,-51,96,-51,106,-76,100,-44,106,-34,100,-44,106,-76,106,-34,106,-76,122,-49,143,59,88,184,99,60,143,59,99,60,105,47,143,59,105,47,111,35,143,59,111,35,116,24,143,59,116,24,119,15,143,59,119,15,121,9,143,59,121,9,122,-49,143,59,122,-49,137,-11,143,59,137,-11,213,192,143,59,213,192,192,196,122,-49,121,9,119,2,99,60,88,184,86,188,99,60,86,188,84,192,99,60,84,192,82,196,99,60,82,196,81,201,99,60,81,201,33,200,33,200,81,201,81,204,81,204,82,209,33,200,33,200,82,209,85,212,33,200,85,212,109,225,109,225,85,212,90,215,109,225,90,215,98,217,194,202,193,201,213,192,213,192,193,201,193,198,213,192,193,198,192,196,238,225,171,225,179,217,238,225,179,217,186,216,238,225,186,216,190,213,238,225,190,213,193,210,238,225,193,210,194,205,238,225,194,205,226,213,238,225,226,213,231,216,238,225,231,216,238,218,194,205,213,192,217,202,194,205,217,202,221,208,194,205,221,208,226,213,194,204,194,202,213,192,194,204,213,192,194,205,122,-49,119,2,116,-8,122,-49,116,-8,112,-21,122,-49,112,-21,106,-34,71,-105,73,-66,71,-66,71,-105,71,-66,69,-65,71,-105,69,-65,66,-64,71,-105,66,-64,63,-63,71,-105,63,-63,57,-60,71,-105,57,-60,52,-58,71,-105,52,-58,50,-108,52,-58,47,-57,50,-108,50,-108,47,-57,42,-56,50,-108,42,-56,38,-106,38,-106,42,-56,36,-56,38,-106,36,-56,30,-57,38,-106,30,-57,28,-102,28,-102,30,-57,24,-60,28,-102,24,-60,21,-96,21,-96,24,-60,19,-65,21,-96,19,-65,17,-88,17,-88,19,-65,16,-72,17,-88,16,-72,15,-79,98,217,109,218,109,225,109,225,7,225,14,217,109,225,14,217,21,214,109,225,21,214,26,211,109,225,26,211,30,206,109,225,30,206,33,200,66,-64,62,-63,63,-63,14,217,7,225,7,218,90,-57,90,-94,106,-76,179,217,171,225,171,218,
-209,68,200,70,197,57,195,47,193,40,190,34,186,28,181,24,173,20,163,17,149,16,133,15,67,15,201,218,201,225,28,225,26,166,36,166,39,184,44,197,51,205,63,209,79,210,147,210,13,7,13,0,201,0,175,-84,157,-78,144,-69,136,-58,131,-42,129,-22,129,60,128,82,124,98,115,110,102,118,83,124,102,131,115,140,124,151,128,167,129,189,129,273,131,293,136,308,144,320,157,328,175,334,175,340,157,339,144,338,132,336,
+209,68,200,70,197,57,195,47,193,40,190,34,186,28,181,24,173,20,163,17,149,16,133,15,67,15,201,218,201,225,28,225,26,166,36,166,39,184,44,197,51,205,63,209,79,210,147,210,13,7,13,0,201,0,
 67,15,201,218,147,210,147,210,201,218,201,225,147,210,201,225,79,210,63,209,79,210,201,225,63,209,201,225,28,225,28,225,26,166,36,166,28,225,36,166,39,184,28,225,39,184,44,197,28,225,44,197,51,205,28,225,51,205,63,209,147,210,13,7,67,15,67,15,13,7,201,0,67,15,201,0,133,15,133,15,201,0,149,16,195,47,193,40,201,0,201,0,193,40,190,34,201,0,190,34,186,28,186,28,181,24,201,0,201,0,181,24,173,20,201,0,173,20,163,17,201,0,209,68,200,70,201,0,200,70,197,57,201,0,197,57,195,47,201,0,13,7,13,0,149,16,201,0,163,17,
-175,-84,157,-78,144,-69,136,-58,131,-42,129,-22,129,60,128,82,124,98,115,110,102,118,83,124,102,131,115,140,124,151,128,167,129,189,129,273,131,293,136,308,144,320,157,328,175,334,175,340,157,339,144,338,132,336,114,328,107,321,100,312,96,300,94,287,93,271,93,181,91,163,87,149,80,139,67,131,50,125,67,118,80,110,87,100,91,86,93,68,93,-20,94,-35,96,-49,101,-61,107,-70,114,-77,123,-82,132,-85,143,-87,157,-89,175,-89,66,-6,66,338,33,338,33,-6,147,270,146,286,144,300,139,312,133,321,126,328,108,336,97,338,83,339,65,340,65,334,83,328,96,320,104,308,109,293,110,273,110,189,112,167,116,151,125,139,138,131,157,125,138,118,125,110,116,98,112,82,110,60,110,-22,109,-42,104,-58,96,-69,83,-78,65,-84,65,-89,83,-89,96,-87,108,-85,117,-82,126,-77,133,-71,139,-61,144,-50,146,-36,147,-20,147,68,149,86,153,100,160,111,172,118,190,125,172,131,
+175,-84,157,-78,144,-69,136,-58,131,-42,129,-22,129,60,128,82,124,98,115,110,102,118,83,124,102,131,115,140,124,151,128,167,129,189,129,273,131,293,136,308,144,320,157,328,175,334,175,340,157,339,144,338,132,336,114,328,107,321,100,312,96,300,94,287,93,271,93,181,91,163,87,149,80,139,67,131,50,125,67,118,80,110,87,100,91,86,93,68,93,-20,94,-35,96,-49,101,-61,107,-70,114,-77,123,-82,132,-85,143,-87,157,-89,175,-89,
 107,-70,114,-77,115,110,115,110,114,-77,123,-82,115,110,123,-82,124,98,124,98,123,-82,132,-85,124,98,132,-85,129,-22,129,-22,129,60,128,82,129,-22,128,82,124,98,157,-89,175,-89,175,-84,157,-89,175,-84,157,-78,157,-89,157,-78,144,-69,157,-89,144,-69,143,-87,136,-58,131,-42,132,-85,136,-58,132,-85,143,-87,136,-58,143,-87,144,-69,102,118,83,124,87,100,102,118,87,100,91,86,102,118,91,86,93,68,102,118,93,68,94,-35,102,118,94,-35,96,-49,102,118,96,-49,101,-61,102,118,101,-61,107,-70,102,118,107,-70,115,110,93,68,93,-20,94,-35,80,110,87,100,83,124,80,110,83,124,87,149,80,110,87,149,80,139,80,110,80,139,67,118,157,339,144,338,144,320,157,339,144,320,157,328,157,339,157,328,175,334,157,339,175,334,175,340,129,273,131,293,132,336,132,336,131,293,136,308,132,336,136,308,144,338,144,338,136,308,144,320,114,328,115,140,123,332,123,332,115,140,124,151,123,332,124,151,129,273,129,273,124,151,128,167,129,273,128,167,129,189,107,321,100,312,102,131,107,321,102,131,115,140,107,321,115,140,114,328,102,131,100,312,96,300,102,131,96,300,94,287,102,131,94,287,93,271,102,131,93,271,93,181,102,131,93,181,91,163,102,131,91,163,87,149,102,131,87,149,83,124,67,131,50,125,67,118,67,131,67,118,80,139,123,332,129,273,132,336,129,-22,132,-85,131,-42,
-66,-6,66,338,33,338,33,-6,147,270,146,286,144,300,139,312,
+66,-6,66,338,33,338,33,-6,
 66,-6,66,338,33,338,66,-6,33,338,33,-6,
-147,270,146,286,144,300,139,312,133,321,126,328,108,336,97,338,83,339,65,340,65,334,83,328,96,320,104,308,109,293,110,273,110,189,112,167,116,151,125,139,138,131,157,125,138,118,125,110,116,98,112,82,110,60,110,-22,109,-42,104,-58,96,-69,83,-78,65,-84,65,-89,83,-89,96,-87,108,-85,117,-82,126,-77,133,-71,139,-61,144,-50,146,-36,147,-20,147,68,149,86,153,100,160,111,172,118,190,125,172,131,160,139,153,149,149,163,147,181,233,162,227,151,219,141,211,133,201,128,189,126,179,127,157,135,148,140,141,143,124,150,111,155,100,158,92,160,83,160,69,159,56,154,43,146,31,134,20,117,38,92,44,104,51,114,60,122,70,126,80,128,92,127,103,125,114,122,122,119,128,116,143,107,155,101,166,97,176,95,189,94,202,95,214,100,226,108,238,120,251,137,101,209,100,217,96,224,90,229,83,233,75,234,66,233,59,229,53,224,49,217,48,209,49,200,53,192,58,186,
+147,270,146,286,144,300,139,312,133,321,126,328,108,336,97,338,83,339,65,340,65,334,83,328,96,320,104,308,109,293,110,273,110,189,112,167,116,151,125,139,138,131,157,125,138,118,125,110,116,98,112,82,110,60,110,-22,109,-42,104,-58,96,-69,83,-78,65,-84,65,-89,83,-89,96,-87,108,-85,117,-82,126,-77,133,-71,139,-61,144,-50,146,-36,147,-20,147,68,149,86,153,100,160,111,172,118,190,125,172,131,160,139,153,149,149,163,147,181,
 110,273,112,167,110,273,110,273,112,167,117,332,110,273,117,332,109,293,109,293,117,332,108,336,109,293,108,336,104,308,104,308,108,336,97,338,104,308,97,338,96,320,96,320,97,338,83,339,96,320,83,339,83,328,83,328,83,339,65,340,83,328,65,340,65,334,147,181,147,270,146,286,147,181,146,286,144,300,147,181,144,300,139,312,147,181,139,312,138,131,147,181,138,131,149,163,172,118,190,125,172,131,172,118,172,131,160,111,160,111,172,131,160,139,160,111,160,139,157,125,157,125,160,139,153,149,157,125,153,149,149,163,112,167,116,151,117,332,117,332,116,151,125,139,117,332,125,139,126,328,126,328,125,139,138,131,126,328,138,131,133,321,133,321,138,131,139,312,157,125,138,118,149,86,157,125,149,86,153,100,157,125,153,100,160,111,147,68,149,86,138,118,147,68,138,118,139,-61,147,68,139,-61,144,-50,147,68,144,-50,146,-36,147,68,146,-36,147,-20,116,98,117,-82,125,110,125,110,117,-82,126,-77,125,110,126,-77,138,118,138,118,126,-77,133,-71,138,118,133,-71,139,-61,117,-82,116,98,112,82,117,-82,112,82,110,60,117,-82,110,60,110,-22,117,-82,110,-22,109,-42,117,-82,109,-42,108,-85,104,-58,96,-69,96,-87,104,-58,96,-87,108,-85,104,-58,108,-85,109,-42,83,-78,65,-84,83,-89,83,-78,83,-89,96,-87,83,-78,96,-87,96,-69,83,-89,65,-84,65,-89,149,163,138,131,157,125,112,167,110,273,110,189,
-233,162,227,151,219,141,211,133,201,128,189,126,179,127,157,135,148,140,141,143,124,150,111,155,100,158,92,160,83,160,69,159,56,154,43,146,31,134,20,117,38,92,44,104,51,114,60,122,70,126,80,128,92,127,103,125,114,122,122,119,128,116,143,107,155,101,166,97,176,95,189,94,202,95,214,100,226,108,238,120,251,137,101,209,100,217,96,224,90,229,83,233,75,234,66,233,59,229,53,224,49,217,48,209,49,200,53,192,58,186,66,182,74,181,83,182,90,186,96,192,100,200,101,209,16383,16383,78,141,71,141,49,-49,49,-53,48,-57,48,-69,49,-82,52,-93,58,-101,65,-106,75,-108,84,-106,91,-100,96,-92,100,-81,101,-68,101,-57,100,-53,100,-49,
+233,162,227,151,219,141,211,133,201,128,189,126,179,127,157,135,148,140,141,143,124,150,111,155,100,158,92,160,83,160,69,159,56,154,43,146,31,134,20,117,38,92,44,104,51,114,60,122,70,126,80,128,92,127,103,125,114,122,122,119,128,116,143,107,155,101,166,97,176,95,189,94,202,95,214,100,226,108,238,120,251,137,
 92,160,83,160,92,127,92,127,83,160,80,128,70,126,80,128,83,160,70,126,83,160,69,159,141,143,128,116,143,107,141,143,143,107,148,140,148,140,143,107,155,101,148,140,155,101,157,135,157,135,155,101,166,97,157,135,166,97,168,131,168,131,166,97,176,95,168,131,176,95,179,127,179,127,176,95,189,94,179,127,189,94,189,126,189,126,189,94,202,95,189,126,202,95,201,128,92,160,92,127,100,158,100,158,92,127,103,125,100,158,103,125,111,155,111,155,103,125,114,122,111,155,114,122,124,150,124,150,114,122,122,119,124,150,122,119,128,116,201,128,202,95,211,133,211,133,202,95,214,100,211,133,214,100,219,141,219,141,214,100,226,108,219,141,226,108,227,151,227,151,226,108,238,120,227,151,238,120,233,162,233,162,238,120,251,137,44,104,51,114,56,154,56,154,51,114,60,122,56,154,60,122,69,159,69,159,60,122,70,126,43,146,31,134,38,92,43,146,38,92,44,104,43,146,44,104,56,154,38,92,31,134,20,117,128,116,141,143,124,150,
-101,209,100,217,96,224,90,229,83,233,75,234,66,233,59,229,53,224,49,217,48,209,49,200,53,192,58,186,66,182,74,181,83,182,90,186,96,192,100,200,101,209,16383,16383,78,141,71,141,49,-49,49,-53,48,-57,48,-69,49,-82,52,-93,58,-101,65,-106,75,-108,84,-106,91,-100,96,-92,100,-81,101,-68,101,-57,100,-53,100,-49,218,82,203,62,189,48,175,39,160,33,144,32,138,32,133,33,127,34,121,36,114,38,165,184,170,173,176,166,181,161,187,158,194,157,201,158,207,161,211,166,214,173,215,180,214,190,209,200,202,208,191,216,178,222,201,290,184,290,162,228,155,229,150,229,145,230,137,230,101,224,71,207,47,181,32,148,26,109,27,94,30,79,
+101,209,100,217,96,224,90,229,83,233,75,234,66,233,59,229,53,224,49,217,48,209,49,200,53,192,58,186,66,182,74,181,83,182,90,186,96,192,100,200,101,209,16383,16383,78,141,71,141,49,-49,49,-53,48,-57,48,-69,49,-82,52,-93,58,-101,65,-106,75,-108,84,-106,91,-100,96,-92,100,-81,101,-68,101,-57,100,-53,100,-49,
 48,209,49,200,49,217,49,217,49,200,53,192,49,217,53,192,53,224,53,224,53,192,58,186,53,224,58,186,59,229,59,229,58,186,66,182,59,229,66,182,66,233,66,233,66,182,74,181,66,233,74,181,75,234,75,234,74,181,83,182,75,234,83,182,83,233,83,233,83,182,90,186,83,233,90,186,90,229,90,229,90,186,96,192,90,229,96,192,96,224,96,224,96,192,100,200,96,224,100,200,100,217,100,217,100,200,101,209,100,-49,78,141,84,-106,100,-49,84,-106,91,-100,100,-49,91,-100,96,-92,100,-49,96,-92,100,-81,100,-49,100,-81,101,-68,100,-49,101,-68,100,-53,58,-101,65,-106,71,141,71,141,65,-106,75,-108,71,141,75,-108,78,141,78,141,75,-108,84,-106,71,141,49,-49,49,-82,71,141,49,-82,52,-93,71,141,52,-93,58,-101,49,-82,49,-49,49,-53,49,-82,49,-53,48,-57,49,-82,48,-57,48,-61,49,-82,48,-61,48,-65,49,-82,48,-65,48,-69,101,-68,101,-64,101,-61,101,-68,101,-61,101,-57,101,-68,101,-57,100,-53,
-218,82,203,62,189,48,175,39,160,33,144,32,138,32,133,33,127,34,121,36,114,38,165,184,170,173,176,166,181,161,187,158,194,157,201,158,207,161,211,166,214,173,215,180,214,190,209,200,202,208,191,216,178,222,201,290,184,290,162,228,155,229,150,229,145,230,137,230,101,224,71,207,47,181,32,148,26,109,27,94,30,79,34,64,40,50,47,38,53,30,59,24,66,18,74,12,84,6,59,-68,76,-68,100,0,107,-1,119,-3,140,-3,151,0,161,3,171,8,180,15,190,24,198,33,206,45,214,59,224,78,16383,16383,99,49,86,63,76,77,70,92,66,110,65,130,68,158,77,182,91,200,110,211,133,215,138,215,142,214,147,213,151,212,156,210,172,164,172,186,109,186,107,205,106,220,105,233,104,245,104,256,106,280,112,299,122,313,135,322,151,325,161,324,169,321,175,315,178,308,180,299,180,285,182,275,186,269,191,266,199,265,207,266,214,270,219,276,223,283,224,291,221,306,212,319,198,329,180,336,159,338,126,333,99,317,79,293,66,261,61,221,62,214,62,208,64,194,65,186,12,186,12,164,65,164,68,147,71,127,73,109,75,93,76,81,76,69,75,67,75,63,69,64,64,64,60,65,51,65,36,63,24,58,14,50,8,40,6,27,8,16,12,8,19,1,28,-2,40,-3,50,-2,59,0,68,6,78,14,89,27,107,15,123,6,136,1,149,-1,161,-2,175,-1,188,1,201,7,212,15,
+218,82,203,62,189,48,175,39,160,33,144,32,138,32,133,33,127,34,121,36,114,38,165,184,170,173,176,166,181,161,187,158,194,157,201,158,207,161,211,166,214,173,215,180,214,190,209,200,202,208,191,216,178,222,201,290,184,290,162,228,155,229,150,229,145,230,137,230,101,224,71,207,47,181,32,148,26,109,27,94,30,79,34,64,40,50,47,38,53,30,59,24,66,18,74,12,84,6,59,-68,76,-68,100,0,107,-1,119,-3,140,-3,151,0,161,3,171,8,180,15,190,24,198,33,206,45,214,59,224,78,16383,16383,99,49,86,63,76,77,70,92,66,110,65,130,68,158,77,182,91,200,110,211,133,215,138,215,142,214,147,213,151,212,156,210,
 156,210,99,49,100,0,100,0,99,49,86,63,100,0,86,63,84,6,84,6,86,63,76,77,84,6,76,77,74,12,74,12,76,77,70,92,74,12,70,92,66,110,53,30,59,24,65,130,65,130,66,18,66,110,66,110,66,18,74,12,113,-2,119,-3,114,38,114,38,119,-3,121,36,121,36,119,-3,124,-3,121,36,124,-3,127,34,127,34,124,-3,129,-3,127,34,129,-3,133,33,133,33,129,-3,140,-3,133,33,140,-3,138,32,138,32,140,-3,144,32,160,33,144,32,151,0,160,33,151,0,161,3,114,38,165,184,156,210,156,210,162,228,155,229,156,210,155,229,151,212,151,212,155,229,150,229,151,212,150,229,147,213,147,213,150,229,145,230,147,213,145,230,142,214,142,214,145,230,141,230,142,214,141,230,138,215,138,215,141,230,137,230,138,215,137,230,133,215,184,290,162,228,165,184,184,290,165,184,170,173,184,290,170,173,178,222,184,290,178,222,201,290,170,173,176,166,178,222,178,222,176,166,181,161,178,222,181,161,191,216,191,216,181,161,187,158,191,216,187,158,194,157,114,38,156,210,100,0,114,38,100,0,107,-1,114,38,107,-1,113,-2,76,-68,100,0,84,6,76,-68,84,6,59,-68,194,157,201,158,202,208,202,208,201,158,207,161,202,208,207,161,209,200,209,200,207,161,211,166,209,200,211,166,214,190,214,190,211,166,214,173,214,190,214,173,215,180,77,182,91,200,101,224,101,224,91,200,110,211,101,224,110,211,137,230,137,230,110,211,133,215,71,207,47,181,47,38,71,207,47,38,53,30,71,207,53,30,65,130,71,207,65,130,68,158,71,207,68,158,77,182,71,207,77,182,101,224,27,94,30,79,32,148,32,148,30,79,34,64,32,148,34,64,47,181,47,181,34,64,40,50,47,181,40,50,47,38,190,24,198,33,203,62,203,62,198,33,206,45,203,62,206,45,218,82,218,82,206,45,214,59,218,82,214,59,224,78,161,3,171,8,175,39,175,39,171,8,180,15,175,39,180,15,189,48,189,48,180,15,190,24,189,48,190,24,203,62,144,32,140,-3,151,0,160,33,161,3,175,39,27,94,32,148,26,109,191,216,194,157,202,208,156,210,165,184,162,228,66,18,65,130,59,24,
-172,164,172,186,109,186,107,205,106,220,105,233,104,245,104,256,106,280,112,299,122,313,135,322,151,325,161,324,169,321,175,315,178,308,180,299,180,285,182,275,186,269,191,266,199,265,207,266,214,270,219,276,223,283,224,291,221,306,212,319,198,329,180,336,159,338,126,333,99,317,79,293,66,261,61,221,62,214,62,208,64,194,65,186,12,186,12,164,65,164,68,147,71,127,73,109,75,93,76,81,76,69,75,67,75,63,69,64,64,64,60,65,51,65,36,63,24,58,14,50,8,40,6,27,8,16,12,8,19,1,28,-2,40,-3,50,-2,59,0,68,6,78,14,89,27,107,15,123,6,136,1,149,-1,161,-2,175,-1,188,1,201,7,212,15,223,24,229,32,235,42,240,52,244,61,245,68,245,69,244,70,240,70,238,69,236,67,233,65,230,62,230,63,221,54,210,47,199,42,187,39,174,38,160,38,147,40,133,43,117,48,99,55,109,105,111,117,112,125,112,164,16383,16383,71,38,71,35,68,29,66,26,64,22,59,18,55,14,50,12,46,10,40,10,33,11,27,13,23,17,20,22,19,28,20,35,23,40,28,44,35,46,44,47,52,46,59,45,65,43,69,41,71,38,261,20,213,68,221,81,226,93,230,105,232,118,233,132,232,146,230,158,226,170,221,182,213,194,261,243,237,267,188,219,176,226,165,232,153,235,140,238,112,238,99,236,87,232,75,226,62,219,14,267,-10,243,38,194,30,182,24,170,20,158,18,145,17,131,18,117,20,105,24,92,30,80,38,68,-10,20,14,-4,62,44,74,36,87,31,99,27,112,24,126,23,139,24,152,27,164,31,176,37,188,44,237,-4,16383,16383,199,132,195,108,185,86,169,70,149,59,126,55,102,59,82,70,66,86,55,107,51,132,55,155,66,176,81,192,101,203,124,206,148,203,168,192,184,176,195,156,199,132,256,331,158,331,158,321,174,321,181,319,186,315,190,311,191,306,191,303,190,299,188,294,187,289,184,284,128,174,69,285,67,289,65,294,64,299,63,303,63,307,64,313,67,317,73,319,83,321,95,321,95,331,-25,331,-25,321,-13,319,-3,314,7,304,18,287,32,262,80,176,8,176,8,156,92,156,95,149,95,111,8,111,8,91,95,91,95,60,94,39,91,25,84,16,72,11,55,9,55,0,177,0,177,9,161,11,150,16,142,24,138,37,137,55,137,91,224,91,224,111,137,111,137,149,141,156,
+172,164,172,186,109,186,107,205,106,220,105,233,104,245,104,256,106,280,112,299,122,313,135,322,151,325,161,324,169,321,175,315,178,308,180,299,180,285,182,275,186,269,191,266,199,265,207,266,214,270,219,276,223,283,224,291,221,306,212,319,198,329,180,336,159,338,126,333,99,317,79,293,66,261,61,221,62,214,62,208,64,194,65,186,12,186,12,164,65,164,68,147,71,127,73,109,75,93,76,81,76,69,75,67,75,63,69,64,64,64,60,65,51,65,36,63,24,58,14,50,8,40,6,27,8,16,12,8,19,1,28,-2,40,-3,50,-2,59,0,68,6,78,14,89,27,107,15,123,6,136,1,149,-1,161,-2,175,-1,188,1,201,7,212,15,223,24,229,32,235,42,240,52,244,61,245,68,245,69,244,70,240,70,238,69,236,67,233,65,230,62,230,63,221,54,210,47,199,42,187,39,174,38,160,38,147,40,133,43,117,48,99,55,109,105,111,117,112,125,112,164,16383,16383,71,38,71,35,68,29,66,26,64,22,59,18,55,14,50,12,46,10,40,10,33,11,27,13,23,17,20,22,19,28,20,35,23,40,28,44,35,46,44,47,52,46,59,45,65,43,69,41,71,38,
 59,18,55,14,59,0,59,0,55,14,50,12,59,0,50,12,50,-2,50,-2,50,12,46,10,50,-2,46,10,40,-3,40,-3,46,10,40,10,69,64,64,64,65,43,65,43,64,64,60,65,65,43,60,65,59,45,59,45,60,65,56,65,59,45,56,65,52,46,52,46,56,65,51,65,52,46,51,65,44,47,20,35,23,40,24,58,24,58,23,40,28,44,24,58,28,44,36,63,36,63,28,44,35,46,36,63,35,46,44,47,20,22,19,28,19,1,19,1,19,28,14,50,14,50,19,28,24,58,24,58,19,28,20,35,71,35,70,33,78,14,78,14,70,33,68,29,78,14,68,29,68,6,68,6,68,29,66,26,68,6,66,26,64,22,64,22,59,18,68,6,68,6,59,18,59,0,75,67,75,65,78,14,78,14,75,65,75,62,78,14,75,62,71,38,71,38,75,62,75,63,71,38,75,63,69,41,69,41,75,63,69,64,69,41,69,64,65,43,78,14,71,38,71,35,89,27,107,15,99,55,99,55,107,15,117,48,117,48,107,15,123,6,117,48,123,6,133,43,133,43,123,6,136,1,133,43,136,1,147,40,147,40,136,1,149,-1,147,40,149,-1,160,38,160,38,149,-1,161,-2,160,38,161,-2,174,38,174,38,161,-2,175,-1,174,38,175,-1,187,39,99,55,105,85,104,256,104,256,106,280,99,317,99,317,106,280,112,299,99,317,112,299,126,333,126,333,112,299,122,313,126,333,122,313,135,322,180,336,159,338,161,324,161,324,159,338,151,325,135,322,151,325,159,338,135,322,159,338,126,333,221,306,212,319,214,270,221,306,214,270,219,276,221,306,219,276,223,283,221,306,223,283,224,291,186,269,191,266,198,329,198,329,191,266,199,265,198,329,199,265,212,319,212,319,199,265,207,266,212,319,207,266,214,270,178,308,180,299,180,336,180,336,180,299,180,285,180,336,180,285,198,329,198,329,180,285,182,275,198,329,182,275,186,269,180,336,161,324,169,321,180,336,169,321,175,315,180,336,175,315,178,308,76,71,78,14,76,73,76,73,78,14,79,293,79,293,78,14,89,27,79,293,89,27,99,317,99,317,89,27,99,55,99,317,99,55,104,256,109,105,111,117,109,186,109,186,111,117,112,164,109,186,112,164,172,186,172,186,112,164,172,164,109,186,107,205,109,105,109,105,107,205,106,220,109,105,106,220,105,85,105,85,106,220,105,233,105,85,105,233,104,245,112,139,112,146,112,133,112,133,112,146,112,152,112,133,112,152,112,125,112,125,112,152,112,158,112,125,112,158,112,164,229,32,230,62,223,24,223,24,230,62,221,54,223,24,221,54,212,15,212,15,221,54,210,47,212,15,210,47,201,7,201,7,210,47,199,42,201,7,199,42,188,1,188,1,199,42,187,39,188,1,187,39,175,-1,245,69,244,70,245,68,245,68,244,70,244,61,244,61,244,70,243,70,244,61,243,70,242,70,240,52,244,61,242,70,240,52,242,70,240,70,240,52,240,70,238,69,240,52,238,69,236,67,240,52,236,67,235,42,235,42,236,67,233,65,235,42,233,65,230,62,235,42,230,62,229,32,79,293,66,261,68,147,79,293,68,147,71,127,79,293,71,127,73,109,79,293,73,109,75,93,79,293,75,93,76,81,79,293,76,81,76,73,66,261,61,221,62,214,66,261,62,214,62,208,66,261,62,208,63,201,66,261,63,201,64,194,66,261,64,194,65,186,66,261,65,186,65,164,66,261,65,164,68,147,76,69,75,67,78,14,76,69,78,14,76,71,65,164,65,186,12,186,65,164,12,186,12,164,33,11,27,13,28,-2,33,11,28,-2,40,-3,33,11,40,-3,40,10,28,-2,27,13,23,17,28,-2,23,17,20,22,28,-2,20,22,19,1,6,27,8,16,8,40,8,40,8,16,12,8,8,40,12,8,14,50,14,50,12,8,19,1,221,54,230,62,230,63,112,125,112,164,111,117,104,256,105,85,104,245,44,47,51,65,36,63,
-261,20,213,68,221,81,226,93,230,105,232,118,233,132,232,146,230,158,226,170,221,182,213,194,261,243,237,267,188,219,176,226,165,232,153,235,140,238,112,238,99,236,87,232,75,226,62,219,14,267,-10,243,38,194,30,182,24,170,20,158,18,145,17,131,18,117,20,105,24,92,30,80,38,68,-10,20,14,-4,62,44,74,36,87,31,99,27,112,24,126,23,139,24,152,27,164,31,176,37,188,44,237,-4,16383,16383,199,132,195,108,185,86,169,70,149,59,126,55,102,59,82,70,66,86,55,107,51,132,55,155,66,176,81,192,101,203,124,206,148,203,168,192,184,176,195,156,199,132,256,331,158,331,158,321,174,321,181,319,186,315,190,311,191,306,191,303,190,299,188,294,187,289,184,284,128,174,69,285,67,289,65,294,64,299,63,303,63,307,64,313,67,317,73,319,83,321,95,321,95,331,-25,331,-25,321,-13,319,-3,314,7,304,18,287,32,262,80,176,8,176,8,156,92,156,95,149,95,111,8,111,8,91,95,91,95,60,94,39,91,25,84,16,72,11,55,9,55,0,177,0,177,9,161,11,150,16,142,24,138,37,137,55,137,91,224,91,224,111,137,111,137,149,141,156,224,156,224,176,151,176,197,268,207,286,218,300,229,310,242,317,256,321,66,200,66,338,
+261,20,213,68,221,81,226,93,230,105,232,118,233,132,232,146,230,158,226,170,221,182,213,194,261,243,237,267,188,219,176,226,165,232,153,235,140,238,112,238,99,236,87,232,75,226,62,219,14,267,-10,243,38,194,30,182,24,170,20,158,18,145,17,131,18,117,20,105,24,92,30,80,38,68,-10,20,14,-4,62,44,74,36,87,31,99,27,112,24,126,23,139,24,152,27,164,31,176,37,188,44,237,-4,16383,16383,199,132,195,108,185,86,169,70,149,59,126,55,102,59,82,70,66,86,55,107,51,132,55,155,66,176,81,192,101,203,124,206,148,203,168,192,184,176,195,156,199,132,
 99,27,112,24,102,59,102,59,112,24,126,55,149,59,126,55,126,23,149,59,126,23,139,24,62,219,14,267,38,194,62,219,38,194,38,68,62,219,38,68,51,132,62,219,51,132,55,155,62,219,55,155,66,176,62,219,66,176,75,226,66,86,55,107,62,44,62,44,55,107,51,132,140,238,126,238,148,203,148,203,126,238,124,206,101,203,124,206,112,238,101,203,112,238,99,236,87,232,75,226,81,192,87,232,81,192,101,203,87,232,101,203,99,236,261,20,213,68,237,-4,237,-4,213,68,195,108,237,-4,195,108,188,44,188,44,195,108,185,86,188,44,185,86,176,37,176,37,185,86,169,70,176,37,169,70,164,31,164,31,169,70,152,27,149,59,139,24,152,27,149,59,152,27,169,70,195,156,199,132,213,194,195,156,213,194,237,267,237,267,213,194,261,243,165,232,168,192,176,226,176,226,168,192,184,176,176,226,184,176,188,219,188,219,184,176,195,156,188,219,195,156,237,267,153,235,140,238,148,203,153,235,148,203,168,192,153,235,168,192,165,232,213,194,213,68,221,182,221,182,213,68,221,81,221,182,221,81,226,170,226,170,221,81,226,93,226,170,226,93,230,158,230,158,226,93,230,105,230,158,230,105,232,146,232,146,230,105,232,118,232,146,232,118,233,132,213,68,213,194,199,132,213,68,199,132,195,108,126,55,112,24,126,23,126,238,112,238,124,206,99,27,102,59,87,31,87,31,102,59,82,70,87,31,82,70,74,36,74,36,82,70,66,86,74,36,66,86,62,44,38,68,14,-4,62,44,38,68,62,44,51,132,38,68,38,194,30,80,30,80,38,194,30,182,30,80,30,182,24,92,24,92,30,182,24,170,24,92,24,170,20,105,20,105,24,170,20,158,20,105,20,158,18,117,18,117,20,158,18,145,18,117,18,145,17,131,14,-4,38,68,-10,20,75,226,66,176,81,192,38,194,14,267,-10,243,
-256,331,158,331,158,321,174,321,181,319,186,315,190,311,191,306,191,303,190,299,188,294,187,289,184,284,128,174,69,285,67,289,65,294,64,299,63,303,63,307,64,313,67,317,73,319,83,321,95,321,95,331,-25,331,-25,321,-13,319,-3,314,7,304,18,287,32,262,80,176,8,176,8,156,92,156,95,149,95,111,8,111,8,91,95,91,95,60,94,39,91,25,84,16,72,11,55,9,55,0,177,0,177,9,161,11,150,16,142,24,138,37,137,55,137,91,224,91,224,111,137,111,137,149,141,156,224,156,224,176,151,176,197,268,207,286,218,300,229,310,242,317,256,321,66,200,66,338,33,338,33,200,16383,16383,66,-6,66,131,33,131,33,-6,100,257,94,262,86,276,84,284,83,292,85,304,91,314,100,321,111,326,126,328,135,327,144,324,150,321,155,316,156,311,156,310,155,309,154,307,152,306,144,298,142,293,140,289,140,284,141,277,144,271,149,266,155,263,163,262,172,263,179,267,184,272,188,280,189,289,185,305,177,318,163,329,145,336,124,338,101,335,82,327,68,314,58,297,55,277,57,262,61,248,70,235,84,220,105,202,99,202,97,203,92,203,74,200,58,191,46,179,38,162,35,143,38,121,48,100,64,79,88,57,121,32,137,20,
+256,331,158,331,158,321,174,321,181,319,186,315,190,311,191,306,191,303,190,299,188,294,187,289,184,284,128,174,69,285,67,289,65,294,64,299,63,303,63,307,64,313,67,317,73,319,83,321,95,321,95,331,-25,331,-25,321,-13,319,-3,314,7,304,18,287,32,262,80,176,8,176,8,156,92,156,95,149,95,111,8,111,8,91,95,91,95,60,94,39,91,25,84,16,72,11,55,9,55,0,177,0,177,9,161,11,150,16,142,24,138,37,137,55,137,91,224,91,224,111,137,111,137,149,141,156,224,156,224,176,151,176,197,268,207,286,218,300,229,310,242,317,256,321,
 32,262,80,176,32,262,32,262,80,176,63,303,32,262,63,303,63,307,63,307,64,313,32,262,91,25,84,16,177,0,177,0,84,16,72,11,177,0,72,11,55,9,95,331,-25,331,-13,319,95,331,-13,319,-3,314,95,331,-3,314,7,304,95,331,7,304,67,317,95,331,67,317,73,319,95,331,73,319,83,321,95,331,83,321,95,321,18,287,32,262,64,313,18,287,64,313,67,317,18,287,67,317,7,304,184,284,128,174,137,149,184,284,137,149,141,156,184,284,141,156,151,176,184,284,151,176,197,268,184,284,197,268,187,289,256,331,158,331,166,321,256,331,166,321,174,321,256,331,174,321,181,319,256,331,181,319,186,315,256,331,186,315,190,311,256,331,190,311,191,306,256,331,191,306,229,310,256,331,229,310,242,317,256,331,242,317,256,321,197,268,207,286,191,306,197,268,191,306,191,303,197,268,191,303,190,299,197,268,190,299,188,294,197,268,188,294,187,289,218,300,229,310,191,306,218,300,191,306,207,286,92,156,95,149,128,174,128,174,95,149,138,37,128,174,138,37,137,55,137,111,137,91,224,91,137,111,224,91,224,111,151,176,141,156,224,156,151,176,224,156,224,176,177,0,177,9,161,11,177,0,161,11,150,16,177,0,150,16,94,39,177,0,94,39,91,25,142,24,138,37,95,149,142,24,95,149,95,111,142,24,95,111,95,91,142,24,95,91,95,60,142,24,95,60,150,16,8,111,8,91,95,91,8,111,95,91,95,111,80,176,8,176,92,156,80,176,92,156,128,174,80,176,128,174,69,285,80,176,69,285,67,289,80,176,67,289,65,294,80,176,65,294,64,299,80,176,64,299,63,303,92,156,8,176,8,156,177,0,55,9,55,0,94,39,150,16,95,60,137,149,128,174,137,55,166,321,158,331,158,321,-13,319,-25,331,-25,321,
-66,200,66,338,33,338,33,200,16383,16383,66,-6,66,131,33,131,33,-6,100,257,94,262,86,276,84,284,83,292,85,304,91,314,100,321,111,326,
+66,200,66,338,33,338,33,200,16383,16383,66,-6,66,131,33,131,33,-6,
 33,338,33,200,66,200,33,338,66,200,66,338,33,131,33,-6,66,-6,33,131,66,-6,66,131,
-100,257,94,262,86,276,84,284,83,292,85,304,91,314,100,321,111,326,126,328,135,327,144,324,150,321,155,316,156,311,156,310,155,309,154,307,152,306,144,298,142,293,140,289,140,284,141,277,144,271,149,266,155,263,163,262,172,263,179,267,184,272,188,280,189,289,185,305,177,318,163,329,145,336,124,338,101,335,82,327,68,314,58,297,55,277,57,262,61,248,70,235,84,220,105,202,99,202,97,203,92,203,74,200,58,191,46,179,38,162,35,143,38,121,48,100,64,79,88,57,121,32,137,20,150,8,159,-2,164,-13,165,-24,163,-37,157,-48,148,-56,136,-61,122,-63,111,-62,101,-59,93,-55,88,-50,86,-45,86,-44,87,-42,90,-39,92,-38,96,-33,99,-29,103,-21,103,-17,102,-10,99,-5,93,0,87,2,79,3,70,2,63,-1,57,-7,53,-14,52,-23,55,-39,65,-53,80,-64,99,-71,121,-73,145,-70,165,-62,180,-48,190,-31,193,-10,192,4,187,17,179,30,165,45,146,63,152,63,173,65,190,73,202,86,210,102,213,123,211,139,206,154,197,170,184,185,169,200,16383,16383,187,105,185,96,180,87,172,80,163,75,152,73,141,75,129,79,116,87,101,99,84,114,75,124,69,133,65,141,62,149,61,158,63,169,68,178,75,185,84,190,95,191,106,190,118,184,132,176,146,165,161,152,170,142,177,132,183,123,186,114,187,105,158,286,157,294,153,301,148,306,141,310,133,311,125,310,118,306,113,301,110,294,108,286,109,278,113,272,118,266,125,263,132,262,140,263,148,266,153,272,157,278,158,286,16383,16383,59,286,57,294,54,301,48,306,41,310,33,311,26,310,19,306,14,301,10,294,9,286,10,278,14,272,19,266,25,263,33,262,41,263,48,266,54,272,57,278,59,286,273,124,266,124,257,108,247,95,236,87,223,82,208,80,183,84,162,95,147,113,137,138,133,169,137,197,146,221,161,240,180,252,205,256,221,254,234,249,245,240,253,227,257,211,266,211,266,247,265,249,264,250,263,252,261,254,259,255,249,259,238,262,216,266,205,266,169,262,138,248,115,227,100,199,95,165,99,133,112,107,132,87,158,75,191,70,210,71,230,74,247,78,260,82,265,86,16383,16383,361,165,352,220,329,267,292,305,246,329,193,338,137,329,89,305,52,268,28,220,19,165,28,110,52,63,89,26,136,1,190,-6,245,1,292,26,329,63,353,110,361,165,16383,16383,334,167,326,119,306,77,275,44,235,22,190,14,145,22,106,43,74,76,54,118,46,166,54,213,74,254,106,287,144,309,189,317,234,309,274,288,305,255,326,214,334,167,135,221,129,217,127,216,124,215,118,215,116,217,115,220,115,225,114,233,114,290,112,307,106,321,96,330,81,336,62,338,44,337,29,332,
+100,257,94,262,86,276,84,284,83,292,85,304,91,314,100,321,111,326,126,328,135,327,144,324,150,321,155,316,156,311,156,310,155,309,154,307,152,306,144,298,142,293,140,289,140,284,141,277,144,271,149,266,155,263,163,262,172,263,179,267,184,272,188,280,189,289,185,305,177,318,163,329,145,336,124,338,101,335,82,327,68,314,58,297,55,277,57,262,61,248,70,235,84,220,105,202,99,202,97,203,92,203,74,200,58,191,46,179,38,162,35,143,38,121,48,100,64,79,88,57,121,32,137,20,150,8,159,-2,164,-13,165,-24,163,-37,157,-48,148,-56,136,-61,122,-63,111,-62,101,-59,93,-55,88,-50,86,-45,86,-44,87,-42,90,-39,92,-38,96,-33,99,-29,103,-21,103,-17,102,-10,99,-5,93,0,87,2,79,3,70,2,63,-1,57,-7,53,-14,52,-23,55,-39,65,-53,80,-64,99,-71,121,-73,145,-70,165,-62,180,-48,190,-31,193,-10,192,4,187,17,179,30,165,45,146,63,152,63,173,65,190,73,202,86,210,102,213,123,211,139,206,154,197,170,184,185,169,200,16383,16383,187,105,185,96,180,87,172,80,163,75,152,73,141,75,129,79,116,87,101,99,84,114,75,124,69,133,65,141,62,149,61,158,63,169,68,178,75,185,84,190,95,191,106,190,118,184,132,176,146,165,161,152,170,142,177,132,183,123,186,114,187,105,
 101,335,82,327,85,304,85,304,82,327,83,292,84,220,83,292,82,327,84,220,82,327,70,235,70,235,82,327,68,314,70,235,68,314,61,248,61,248,68,314,58,297,61,248,58,297,57,262,57,262,58,297,55,277,69,133,88,57,75,124,75,124,88,57,84,114,101,99,84,114,88,57,101,99,88,57,121,32,95,191,94,203,92,203,95,191,92,203,84,190,95,191,97,203,94,203,63,169,68,178,74,200,74,200,68,178,75,185,74,200,75,185,92,203,92,203,75,185,84,190,74,200,58,191,63,169,63,169,58,191,61,158,64,79,61,158,58,191,64,79,58,191,48,100,48,100,58,191,46,179,48,100,46,179,38,121,38,121,46,179,38,162,38,121,38,162,35,143,165,45,146,63,150,8,150,8,146,63,141,75,150,8,141,75,137,20,137,20,141,75,129,79,137,20,129,79,121,32,121,32,129,79,116,87,121,32,116,87,101,99,163,-37,157,-48,165,-62,165,-62,157,-48,148,-56,165,-62,148,-56,145,-70,145,-70,148,-56,136,-61,145,-70,136,-61,122,-63,122,-63,111,-62,121,-73,121,-73,111,-62,101,-59,121,-73,101,-59,99,-71,99,-71,101,-59,93,-55,99,-71,93,-55,88,-50,79,3,80,-64,87,2,87,2,80,-64,86,-45,88,-50,86,-45,80,-64,88,-50,80,-64,99,-71,144,324,145,336,135,327,135,327,145,336,126,328,111,326,126,328,124,338,111,326,124,338,101,335,101,335,85,304,91,314,101,335,91,314,100,321,101,335,100,321,111,326,152,73,146,63,152,63,152,73,152,63,173,65,152,73,141,75,146,63,180,87,172,80,173,65,173,65,172,80,163,75,173,65,163,75,152,73,118,184,132,176,169,200,169,200,132,176,146,165,169,200,146,165,161,152,161,152,170,142,169,200,169,200,170,142,184,185,213,123,211,139,210,102,210,102,211,139,206,154,210,102,206,154,202,86,202,86,206,154,197,170,202,86,197,170,190,73,190,73,197,170,187,105,190,73,187,105,185,96,190,73,185,96,180,87,177,132,183,123,184,185,184,185,183,123,186,114,184,185,186,114,197,170,197,170,186,114,187,105,106,190,118,184,169,200,106,190,169,200,105,202,106,190,105,202,102,202,106,190,102,202,99,202,106,190,99,202,97,203,106,190,97,203,95,191,100,257,94,262,105,202,100,257,105,202,169,200,94,262,90,269,105,202,105,202,90,269,86,276,105,202,86,276,84,220,84,220,86,276,84,284,84,220,84,284,83,292,193,-10,192,4,190,-31,190,-31,192,4,187,17,190,-31,187,17,180,-48,180,-48,187,17,179,30,180,-48,179,30,165,45,165,45,150,8,159,-2,165,45,159,-2,164,-13,165,45,164,-13,165,-24,165,45,165,-24,165,-62,165,45,165,-62,180,-48,163,-37,165,-62,165,-24,122,-63,121,-73,145,-70,156,311,156,310,163,262,163,262,156,310,155,309,163,262,155,309,155,263,155,263,155,309,154,307,155,263,154,307,152,306,163,329,156,311,163,262,155,316,156,311,163,329,155,316,163,329,150,321,150,321,163,329,145,336,150,321,145,336,144,324,145,336,124,338,126,328,185,305,177,318,179,267,185,305,179,267,184,272,185,305,184,272,188,280,185,305,188,280,189,289,177,318,163,329,163,262,177,318,163,262,172,263,177,318,172,263,179,267,149,266,155,263,152,306,149,266,152,306,148,302,149,266,148,302,144,298,149,266,144,298,144,271,142,293,140,289,141,277,142,293,141,277,144,271,142,293,144,271,144,298,102,-10,99,-5,99,-29,102,-10,99,-29,101,-25,102,-10,101,-25,103,-21,102,-10,103,-21,103,-17,99,-29,99,-5,96,-33,96,-33,99,-5,93,0,96,-33,93,0,92,-38,92,-38,93,0,90,-39,86,-45,86,-44,87,2,87,2,86,-44,87,-42,87,2,87,-42,93,0,93,0,87,-42,88,-41,93,0,88,-41,90,-39,70,2,63,-1,65,-53,70,2,65,-53,80,-64,70,2,80,-64,79,3,57,-7,53,-14,55,-39,57,-7,55,-39,65,-53,57,-7,65,-53,63,-1,65,141,62,149,64,79,65,141,64,79,88,57,65,141,88,57,69,133,61,158,64,79,62,149,55,-39,53,-14,52,-23,141,277,140,289,140,284,180,87,173,65,190,73,184,185,170,142,177,132,
-158,286,157,294,153,301,148,306,141,310,133,311,125,310,118,306,113,301,110,294,108,286,109,278,113,272,118,266,125,263,132,262,140,263,148,266,153,272,157,278,158,286,16383,16383,59,286,57,294,54,301,48,306,41,310,33,311,26,310,19,306,14,301,10,294,9,286,10,278,14,272,19,266,25,263,33,262,41,263,48,266,54,272,57,278,59,286,273,124,266,124,257,108,247,95,236,87,223,82,208,80,183,84,162,95,147,113,137,138,133,169,137,197,146,221,161,240,180,252,205,256,221,254,234,249,245,240,253,227,257,211,266,211,266,247,265,249,264,250,263,252,261,254,259,255,249,259,238,262,216,266,205,266,169,262,138,248,115,227,100,199,95,165,99,133,112,107,132,87,158,75,191,70,
+158,286,157,294,153,301,148,306,141,310,133,311,125,310,118,306,113,301,110,294,108,286,109,278,113,272,118,266,125,263,132,262,140,263,148,266,153,272,157,278,158,286,16383,16383,59,286,57,294,54,301,48,306,41,310,33,311,26,310,19,306,14,301,10,294,9,286,10,278,14,272,19,266,25,263,33,262,41,263,48,266,54,272,57,278,59,286,
 108,286,109,278,110,294,110,294,109,278,113,272,110,294,113,272,113,301,113,301,113,272,118,266,113,301,118,266,118,306,118,306,118,266,125,263,118,306,125,263,125,310,125,310,125,263,132,262,125,310,132,262,133,311,133,311,132,262,140,263,133,311,140,263,141,310,141,310,140,263,148,266,141,310,148,266,148,306,148,306,148,266,153,272,148,306,153,272,153,301,153,301,153,272,157,278,153,301,157,278,157,294,157,294,157,278,158,286,9,286,10,278,10,294,10,294,10,278,14,272,10,294,14,272,14,301,14,301,14,272,19,266,14,301,19,266,19,306,19,306,19,266,25,263,19,306,25,263,26,310,26,310,25,263,33,262,26,310,33,262,33,311,33,311,33,262,41,263,33,311,41,263,41,310,41,310,41,263,48,266,41,310,48,266,48,306,48,306,48,266,54,272,48,306,54,272,54,301,54,301,54,272,57,278,54,301,57,278,57,294,57,294,57,278,59,286,
-273,124,266,124,257,108,247,95,236,87,223,82,208,80,183,84,162,95,147,113,137,138,133,169,137,197,146,221,161,240,180,252,205,256,221,254,234,249,245,240,253,227,257,211,266,211,266,247,265,249,264,250,263,252,261,254,259,255,249,259,238,262,216,266,205,266,169,262,138,248,115,227,100,199,95,165,99,133,112,107,132,87,158,75,191,70,210,71,230,74,247,78,260,82,265,86,16383,16383,361,165,352,220,329,267,292,305,246,329,193,338,137,329,89,305,52,268,28,220,19,165,28,110,52,63,89,26,136,1,190,-6,245,1,292,26,329,63,353,110,361,165,16383,16383,334,167,326,119,306,77,275,44,235,22,190,14,145,22,106,43,74,76,54,118,46,166,54,213,74,254,106,287,144,309,189,317,234,309,274,288,305,255,326,214,334,167,135,221,129,217,127,216,124,215,118,215,116,217,115,220,115,225,114,233,114,290,112,307,106,321,96,330,81,336,62,338,44,337,29,332,18,325,10,316,8,305,9,300,11,295,14,292,19,290,24,289,29,290,37,294,39,298,40,301,40,303,39,304,39,307,38,309,38,313,39,316,43,319,48,322,54,324,60,324,67,323,72,321,76,316,78,310,79,303,79,288,56,279,40,273,29,268,20,263,13,257,9,253,6,248,4,243,2,231,4,220,9,210,16,203,26,199,37,197,46,198,55,200,64,205,73,211,83,219,85,210,88,204,93,200,98,198,105,197,112,197,117,199,123,202,128,206,135,212,16383,16383,79,237,79,235,78,233,77,230,76,228,74,226,64,222,60,221,56,221,52,220,46,222,41,225,37,230,34,236,33,243,35,250,39,256,
+273,124,266,124,257,108,247,95,236,87,223,82,208,80,183,84,162,95,147,113,137,138,133,169,137,197,146,221,161,240,180,252,205,256,221,254,234,249,245,240,253,227,257,211,266,211,266,247,265,249,264,250,263,252,261,254,259,255,249,259,238,262,216,266,205,266,169,262,138,248,115,227,100,199,95,165,99,133,112,107,132,87,158,75,191,70,210,71,230,74,247,78,260,82,265,86,16383,16383,361,165,352,220,329,267,292,305,246,329,193,338,137,329,89,305,52,268,28,220,19,165,28,110,52,63,89,26,136,1,190,-6,245,1,292,26,329,63,353,110,361,165,16383,16383,334,167,326,119,306,77,275,44,235,22,190,14,145,22,106,43,74,76,54,118,46,166,54,213,74,254,106,287,144,309,189,317,234,309,274,288,305,255,326,214,334,167,
 162,95,147,113,158,75,158,75,147,113,137,138,158,75,137,138,132,87,132,87,137,138,133,169,138,248,133,169,137,197,138,248,137,197,146,221,216,266,205,266,221,254,221,254,205,266,205,256,180,252,205,256,205,266,180,252,205,266,169,262,263,252,261,254,266,211,266,211,261,254,259,255,266,211,259,255,257,211,257,211,259,255,253,227,169,262,138,248,146,221,169,262,146,221,161,240,169,262,161,240,180,252,115,227,100,199,112,107,115,227,112,107,132,87,115,227,132,87,133,169,115,227,133,169,138,248,100,199,95,165,99,133,100,199,99,133,112,107,266,124,257,108,260,82,260,82,257,108,247,95,260,82,247,95,247,78,247,78,247,95,236,87,247,78,236,87,230,74,230,74,236,87,223,82,230,74,223,82,210,71,210,71,223,82,208,80,191,70,210,71,208,80,191,70,208,80,183,84,191,70,183,84,162,95,191,70,162,95,158,75,266,211,266,247,265,249,266,211,265,249,264,250,266,211,264,250,263,252,216,266,221,254,227,264,227,264,221,254,234,249,227,264,234,249,238,262,238,262,234,249,245,240,238,262,245,240,249,259,249,259,245,240,253,227,249,259,253,227,259,255,266,124,260,82,265,86,266,124,265,86,273,124,193,338,189,317,234,309,193,338,234,309,246,329,246,329,234,309,274,288,246,329,274,288,292,305,292,305,274,288,305,255,292,305,305,255,329,267,329,267,305,255,326,214,329,267,326,214,334,167,334,167,352,220,329,267,334,167,353,110,352,220,329,63,353,110,334,167,329,63,334,167,326,119,329,63,326,119,306,77,329,63,306,77,292,26,190,14,190,-6,235,22,235,22,190,-6,245,1,235,22,245,1,275,44,275,44,245,1,292,26,275,44,292,26,306,77,54,213,74,254,89,305,89,305,74,254,106,287,89,305,106,287,137,329,137,329,106,287,144,309,137,329,144,309,193,338,193,338,144,309,189,317,28,110,52,63,28,220,28,220,52,63,46,166,52,268,46,166,54,213,52,268,54,213,89,305,145,22,106,43,136,1,145,22,136,1,190,-6,145,22,190,-6,190,14,89,26,136,1,106,43,89,26,106,43,74,76,89,26,74,76,54,118,89,26,54,118,52,63,46,166,52,63,54,118,28,110,28,220,19,165,28,220,46,166,52,268,352,220,353,110,361,165,
-135,221,129,217,127,216,124,215,118,215,116,217,115,220,115,225,114,233,114,290,112,307,106,321,96,330,81,336,62,338,44,337,29,332,18,325,10,316,8,305,9,300,11,295,14,292,19,290,24,289,29,290,37,294,39,298,40,301,40,303,39,304,39,307,38,309,38,313,39,316,43,319,48,322,54,324,60,324,67,323,72,321,76,316,78,310,79,303,79,288,56,279,40,273,29,268,20,263,13,257,9,253,6,248,4,243,2,231,4,220,9,210,16,203,26,199,37,197,46,198,55,200,64,205,73,211,83,219,85,210,88,204,93,200,98,198,105,197,112,197,117,199,123,202,128,206,135,212,16383,16383,79,237,79,235,78,233,77,230,76,228,74,226,64,222,60,221,56,221,52,220,46,222,41,225,37,230,34,236,33,243,35,250,39,256,48,262,61,269,79,276,117,113,157,77,172,64,203,33,216,21,222,17,224,17,225,18,227,19,228,20,228,22,227,26,224,31,219,39,212,49,203,60,196,70,188,80,180,91,171,102,161,113,203,166,212,178,219,187,224,194,227,199,228,203,228,205,227,207,225,208,223,208,216,204,204,193,172,163,157,150,16383,16383,21,113,61,77,76,64,107,33,120,21,126,17,128,17,129,18,131,19,132,20,132,22,131,26,128,31,123,39,116,49,107,60,100,70,92,80,65,113,107,166,116,178,123,187,128,194,131,199,132,203,132,205,131,207,129,208,127,208,120,204,108,193,76,163,61,150,276,57,276,196,24,196,24,164,243,164,243,57,142,97,142,128,20,128,20,97,283,76,283,80,276,86,268,94,252,112,244,123,216,162,230,168,241,177,249,188,254,199,256,211,253,228,246,241,233,251,217,258,
+135,221,129,217,127,216,124,215,118,215,116,217,115,220,115,225,114,233,114,290,112,307,106,321,96,330,81,336,62,338,44,337,29,332,18,325,10,316,8,305,9,300,11,295,14,292,19,290,24,289,29,290,37,294,39,298,40,301,40,303,39,304,39,307,38,309,38,313,39,316,43,319,48,322,54,324,60,324,67,323,72,321,76,316,78,310,79,303,79,288,56,279,40,273,29,268,20,263,13,257,9,253,6,248,4,243,2,231,4,220,9,210,16,203,26,199,37,197,46,198,55,200,64,205,73,211,83,219,85,210,88,204,93,200,98,198,105,197,112,197,117,199,123,202,128,206,135,212,16383,16383,79,237,79,235,78,233,77,230,76,228,74,226,64,222,60,221,56,221,52,220,46,222,41,225,37,230,34,236,33,243,35,250,39,256,48,262,61,269,79,276,
 38,309,38,310,39,298,39,298,38,310,38,311,39,298,38,311,37,294,37,294,38,311,38,313,44,337,38,313,39,316,44,337,39,316,43,319,39,305,39,307,39,298,39,305,39,298,40,301,40,301,40,302,40,303,40,301,40,303,39,304,40,301,39,304,39,305,46,198,55,200,46,222,46,222,55,200,52,220,56,221,52,220,55,200,56,221,55,200,64,205,81,336,62,338,67,323,67,323,62,338,60,324,54,324,60,324,62,338,54,324,62,338,48,322,48,322,62,338,44,337,48,322,44,337,43,319,78,233,77,230,83,219,83,219,77,230,76,228,83,219,76,228,74,226,74,226,69,224,73,211,73,211,69,224,64,222,73,211,64,222,64,205,64,205,64,222,60,221,64,205,60,221,56,221,24,289,29,290,29,332,29,332,29,290,33,292,29,332,33,292,38,313,38,313,33,292,37,294,11,295,14,292,18,325,18,325,14,292,19,290,18,325,19,290,29,332,29,332,19,290,24,289,10,316,8,305,9,300,10,316,9,300,11,295,10,316,11,295,18,325,81,336,79,276,83,219,81,336,83,219,96,330,96,330,83,219,85,210,96,330,85,210,88,204,81,336,67,323,72,321,81,336,72,321,76,316,81,336,76,316,78,310,81,336,78,310,79,303,81,336,79,303,79,276,98,198,105,197,106,321,106,321,105,197,112,197,106,321,112,197,112,307,112,307,112,197,115,225,112,307,115,225,114,233,117,199,123,202,118,215,118,215,123,202,121,215,124,215,121,215,123,202,124,215,123,202,128,206,135,221,132,219,135,212,135,212,132,219,129,217,135,212,129,217,128,206,128,206,129,217,127,216,128,206,127,216,124,215,117,199,118,215,116,217,117,199,116,217,115,220,117,199,115,220,115,225,117,199,115,225,112,197,96,330,88,204,93,200,96,330,93,200,98,198,96,330,98,198,106,321,83,219,79,276,79,237,83,219,79,237,79,235,83,219,79,235,78,233,74,226,73,211,83,219,35,250,39,256,40,273,40,273,39,256,48,262,40,273,48,262,56,279,56,279,48,262,61,269,56,279,61,269,79,288,79,288,61,269,79,276,79,288,79,276,79,303,40,273,29,268,35,250,35,250,29,268,33,243,37,197,33,243,29,268,37,197,29,268,26,199,26,199,29,268,20,263,26,199,20,263,16,203,16,203,20,263,13,257,16,203,13,257,9,253,41,225,37,230,37,197,41,225,37,197,46,198,41,225,46,198,46,222,34,236,33,243,37,197,34,236,37,197,37,230,9,210,16,203,9,253,9,210,9,253,6,248,9,210,6,248,4,243,9,210,4,243,4,220,3,237,2,231,4,220,3,237,4,220,4,243,114,233,114,290,112,307,29,332,38,313,44,337,38,309,39,298,39,307,
-117,113,157,77,172,64,203,33,216,21,222,17,224,17,225,18,227,19,228,20,228,22,227,26,224,31,219,39,212,49,203,60,196,70,188,80,180,91,171,102,161,113,203,166,212,178,219,187,224,194,227,199,228,203,228,205,227,207,225,208,223,208,216,204,204,193,172,163,157,150,16383,16383,21,113,61,77,76,64,107,33,120,21,126,17,128,17,129,18,131,19,132,20,132,22,131,26,128,31,123,39,116,49,107,60,100,70,92,80,65,113,107,166,116,178,123,187,128,194,131,199,132,203,132,205,131,207,129,208,127,208,120,204,108,193,76,163,61,150,276,57,276,196,24,196,24,164,243,164,243,57,142,97,142,128,20,128,20,97,283,76,283,80,276,86,268,94,252,112,244,123,216,162,230,168,241,177,249,188,254,199,256,211,253,228,246,241,233,251,217,258,196,260,110,260,110,252,122,251,128,248,132,244,134,237,134,98,132,91,129,87,121,85,110,84,109,76,190,76,190,84,178,85,171,87,168,92,166,100,166,157,190,157,199,143,206,133,210,127,213,121,216,116,224,101,232,90,239,82,246,77,252,76,16383,16383,166,166,166,251,185,251,199,248,210,243,217,234,221,222,222,209,221,196,216,184,209,175,
+117,113,157,77,172,64,203,33,216,21,222,17,224,17,225,18,227,19,228,20,228,22,227,26,224,31,219,39,212,49,203,60,196,70,188,80,180,91,171,102,161,113,203,166,212,178,219,187,224,194,227,199,228,203,228,205,227,207,225,208,223,208,216,204,204,193,172,163,157,150,16383,16383,21,113,61,77,76,64,107,33,120,21,126,17,128,17,129,18,131,19,132,20,132,22,131,26,128,31,123,39,116,49,107,60,100,70,92,80,65,113,107,166,116,178,123,187,128,194,131,199,132,203,132,205,131,207,129,208,127,208,120,204,108,193,76,163,61,150,
 203,60,196,70,203,60,203,60,196,70,203,33,203,60,203,33,212,49,212,49,203,33,216,21,212,49,216,21,219,39,219,39,216,21,222,17,219,39,222,17,224,31,224,31,222,17,224,17,224,31,224,17,225,18,227,26,224,31,225,18,227,26,225,18,227,19,227,26,227,19,228,20,227,26,228,20,228,22,171,102,172,64,180,91,180,91,172,64,188,48,180,91,188,48,188,80,188,80,188,48,203,33,188,80,203,33,196,70,161,113,172,163,157,150,161,113,157,150,157,77,161,113,157,77,172,64,161,113,172,64,171,102,228,205,227,207,227,199,228,205,227,199,228,203,228,205,228,203,228,204,188,178,203,166,204,193,204,193,203,166,212,178,204,193,212,178,216,204,216,204,212,178,219,187,216,204,219,187,223,208,223,208,219,187,224,194,223,208,224,194,225,208,225,208,224,194,227,199,225,208,227,199,227,207,172,163,161,113,203,166,172,163,203,166,188,178,107,60,100,70,107,33,107,60,107,33,116,49,116,49,107,33,120,21,116,49,120,21,123,39,123,39,120,21,126,17,123,39,126,17,128,31,128,31,126,17,128,17,128,31,128,17,129,18,131,26,128,31,129,18,131,26,129,18,131,19,131,26,131,19,132,20,131,26,132,20,132,22,74,102,76,64,83,91,83,91,76,64,92,48,83,91,92,48,92,80,92,80,92,48,107,33,92,80,107,33,100,70,65,113,76,163,61,150,65,113,61,150,61,77,65,113,61,77,76,64,65,113,76,64,74,102,132,205,131,207,131,199,132,205,131,199,132,203,132,205,132,203,132,204,92,178,107,166,108,193,108,193,107,166,116,178,108,193,116,178,120,204,120,204,116,178,123,187,120,204,123,187,127,208,127,208,123,187,128,194,127,208,128,194,129,208,129,208,128,194,131,199,129,208,131,199,131,207,76,163,65,113,107,166,76,163,107,166,92,178,61,77,61,150,21,113,157,77,157,150,117,113,
-276,57,276,196,24,196,24,164,243,164,243,57,142,97,142,128,20,128,20,97,283,76,283,80,
+276,57,276,196,24,196,24,164,243,164,243,57,
 243,164,243,57,276,57,243,164,276,57,276,196,243,164,276,196,24,196,243,164,24,196,24,164,
-142,97,142,128,20,128,20,97,283,76,283,80,276,86,268,94,
+142,97,142,128,20,128,20,97,
 142,97,142,128,20,128,142,97,20,128,20,97,
-283,76,283,80,276,86,268,94,252,112,244,123,216,162,230,168,241,177,249,188,254,199,256,211,253,228,246,241,233,251,217,258,196,260,110,260,110,252,122,251,128,248,132,244,134,237,134,98,132,91,129,87,121,85,110,84,109,76,190,76,190,84,178,85,171,87,168,92,166,100,166,157,190,157,199,143,206,133,210,127,213,121,216,116,224,101,232,90,239,82,246,77,252,76,16383,16383,166,166,166,251,185,251,199,248,210,243,217,234,221,222,222,209,221,196,216,184,209,175,199,168,187,166,188,166,16383,16383,361,165,352,220,329,267,292,305,246,329,193,338,137,330,89,305,52,268,28,221,19,166,28,111,51,63,88,26,135,1,190,-6,245,1,292,26,329,63,353,110,361,165,16383,16383,334,165,326,118,306,77,275,44,235,22,190,14,145,22,106,43,74,76,54,118,46,166,54,213,74,254,106,287,145,309,189,317,235,309,275,288,306,255,326,213,334,165,161,273,161,300,6,300,6,273,171,267,168,289,158,309,143,324,123,334,101,338,78,335,58,325,42,309,32,290,28,267,32,244,42,224,57,209,77,198,100,195,123,198,142,209,158,224,168,244,171,267,16383,16383,152,267,149,250,142,235,130,223,116,215,100,212,84,215,69,223,58,234,51,249,48,267,51,284,58,298,69,310,83,318,99,321,115,318,130,310,141,299,149,284,152,267,319,121,319,154,188,154,188,251,155,251,155,154,24,154,24,121,155,121,155,17,188,17,188,121,16383,16383,319,-43,319,-10,24,-10,24,-43,148,177,139,181,134,175,124,169,110,167,54,167,95,208,112,226,125,241,133,255,137,269,138,283,136,301,127,316,114,328,97,335,75,338,53,336,35,329,21,317,10,301,1,278,13,271,20,284,28,295,37,302,46,307,57,308,68,306,78,301,86,292,91,282,93,270,91,260,86,247,78,233,67,217,54,201,3,147,3,135,128,135,102,256,
+283,76,283,80,276,86,268,94,252,112,244,123,216,162,230,168,241,177,249,188,254,199,256,211,253,228,246,241,233,251,217,258,196,260,110,260,110,252,122,251,128,248,132,244,134,237,134,98,132,91,129,87,121,85,110,84,109,76,190,76,190,84,178,85,171,87,168,92,166,100,166,157,190,157,199,143,206,133,210,127,213,121,216,116,224,101,232,90,239,82,246,77,252,76,16383,16383,166,166,166,251,185,251,199,248,210,243,217,234,221,222,222,209,221,196,216,184,209,175,199,168,187,166,188,166,16383,16383,361,165,352,220,329,267,292,305,246,329,193,338,137,330,89,305,52,268,28,221,19,166,28,111,51,63,88,26,135,1,190,-6,245,1,292,26,329,63,353,110,361,165,16383,16383,334,165,326,118,306,77,275,44,235,22,190,14,145,22,106,43,74,76,54,118,46,166,54,213,74,254,106,287,145,309,189,317,235,309,275,288,306,255,326,213,334,165,
 222,209,222,209,222,209,222,209,230,168,233,251,233,251,230,168,241,177,233,251,241,177,246,241,246,241,241,177,249,188,246,241,249,188,253,228,253,228,249,188,254,199,253,228,254,199,256,211,221,222,222,209,233,251,221,222,233,251,217,258,221,222,217,258,217,234,166,251,185,251,196,260,196,260,185,251,199,248,196,260,199,248,217,258,217,258,199,248,210,243,217,258,210,243,217,234,134,226,168,92,166,100,134,226,166,100,166,111,166,166,166,157,190,157,166,166,190,157,187,166,187,166,190,157,188,166,187,166,188,166,199,168,199,168,188,166,190,157,199,168,190,157,199,143,166,251,196,260,132,244,166,251,132,244,134,237,166,251,134,237,134,226,166,251,134,226,166,111,196,260,110,260,122,251,196,260,122,251,128,248,196,260,128,248,132,244,213,121,216,162,216,184,216,184,216,162,230,168,216,184,230,168,221,196,221,196,230,168,222,209,213,121,216,184,210,127,210,127,216,184,209,175,210,127,209,175,206,133,206,133,209,175,199,168,206,133,199,168,199,143,232,90,239,82,244,123,244,123,239,82,246,77,244,123,246,77,252,112,252,112,246,77,252,76,252,112,252,76,260,103,260,103,252,76,283,76,260,103,283,76,268,94,268,94,283,76,276,86,244,123,216,162,216,116,244,123,216,116,224,101,244,123,224,101,232,90,190,76,190,84,178,85,190,76,178,85,171,87,190,76,171,87,134,108,190,76,134,108,134,98,190,76,134,98,132,91,190,76,132,91,129,87,190,76,129,87,121,85,190,76,121,85,110,84,190,76,110,84,109,76,134,111,134,108,171,87,134,111,171,87,168,92,134,111,168,92,134,226,193,338,189,317,235,309,193,338,235,309,246,329,246,329,235,309,275,288,246,329,275,288,292,305,292,305,275,288,306,255,292,305,306,255,329,267,329,267,306,255,326,213,329,267,326,213,334,165,334,165,352,220,329,267,334,165,353,110,352,220,329,63,353,110,334,165,329,63,334,165,326,118,329,63,326,118,306,77,329,63,306,77,292,26,190,14,190,-6,235,22,235,22,190,-6,245,1,235,22,245,1,275,44,275,44,245,1,292,26,275,44,292,26,306,77,54,213,74,254,89,305,89,305,74,254,106,287,89,305,106,287,137,330,137,330,106,287,145,309,137,330,145,309,193,338,193,338,145,309,189,317,28,111,51,63,28,221,28,221,51,63,46,166,52,268,46,166,54,213,52,268,54,213,89,305,145,22,106,43,135,1,145,22,135,1,190,-6,145,22,190,-6,190,14,88,26,135,1,106,43,88,26,106,43,74,76,88,26,74,76,54,118,88,26,54,118,51,63,46,166,51,63,54,118,28,111,28,221,19,166,28,221,46,166,52,268,352,220,353,110,361,165,216,116,216,162,213,121,276,86,283,76,283,80,122,251,110,260,110,252,
-161,273,161,300,6,300,6,273,171,267,168,289,158,309,143,324,
+161,273,161,300,6,300,6,273,
 161,273,161,300,6,300,161,273,6,300,6,273,
-171,267,168,289,158,309,143,324,123,334,101,338,78,335,58,325,42,309,32,290,28,267,32,244,42,224,57,209,77,198,100,195,123,198,142,209,158,224,168,244,171,267,16383,16383,152,267,149,250,142,235,130,223,116,215,100,212,84,215,69,223,58,234,51,249,48,267,51,284,58,298,69,310,83,318,99,321,115,318,130,310,141,299,149,284,152,267,319,121,319,154,188,154,188,251,155,251,155,154,24,154,24,121,155,121,155,17,188,17,188,121,16383,16383,319,-43,319,-10,24,-10,24,-43,148,177,139,181,134,175,124,169,110,167,54,167,95,208,112,226,125,241,133,255,137,269,138,283,136,301,127,316,114,328,97,335,75,338,53,336,35,329,21,317,10,301,1,278,13,271,20,284,28,295,37,302,
+171,267,168,289,158,309,143,324,123,334,101,338,78,335,58,325,42,309,32,290,28,267,32,244,42,224,57,209,77,198,100,195,123,198,142,209,158,224,168,244,171,267,16383,16383,152,267,149,250,142,235,130,223,116,215,100,212,84,215,69,223,58,234,51,249,48,267,51,284,58,298,69,310,83,318,99,321,115,318,130,310,141,299,149,284,152,267,
 83,318,99,321,99,321,101,338,99,321,115,318,101,338,115,318,123,334,123,334,115,318,130,310,123,334,130,310,143,324,143,324,130,310,141,299,143,324,141,299,149,284,171,267,168,289,168,244,168,244,168,289,158,309,168,244,158,309,158,224,158,224,158,309,152,267,158,224,152,267,149,250,158,224,149,250,142,209,142,209,149,250,142,235,142,209,142,235,130,223,158,309,143,324,149,284,158,309,149,284,152,267,142,209,130,223,123,198,123,198,130,223,116,215,123,198,116,215,100,195,100,195,116,215,100,212,58,298,69,310,78,335,78,335,69,310,83,318,78,335,83,318,101,338,101,338,83,318,99,321,42,309,48,267,51,284,42,309,51,284,58,325,58,325,51,284,58,298,58,325,58,298,78,335,84,215,69,223,77,198,84,215,77,198,100,195,84,215,100,195,100,212,48,267,42,224,51,249,51,249,42,224,57,209,51,249,57,209,58,234,58,234,57,209,77,198,58,234,77,198,69,223,28,267,32,244,32,290,32,290,32,244,42,224,32,290,42,224,42,309,42,309,42,224,48,267,
-319,121,319,154,188,154,188,251,155,251,155,154,24,154,24,121,155,121,155,17,188,17,188,121,16383,16383,319,-43,319,-10,24,-10,24,-43,148,177,139,181,134,175,124,169,110,167,54,167,95,208,112,226,125,241,133,255,137,269,138,283,136,301,127,316,114,328,97,335,75,338,
+319,121,319,154,188,154,188,251,155,251,155,154,24,154,24,121,155,121,155,17,188,17,188,121,16383,16383,319,-43,319,-10,24,-10,24,-43,
 188,251,155,251,188,17,188,17,155,251,155,154,188,17,155,154,155,121,155,121,155,154,24,154,155,121,24,154,24,121,188,121,319,121,188,154,24,-10,24,-43,319,-43,24,-10,319,-43,319,-10,188,154,319,121,319,154,188,17,155,121,155,17,
-148,177,139,181,134,175,124,169,110,167,54,167,95,208,112,226,125,241,133,255,137,269,138,283,136,301,127,316,114,328,97,335,75,338,53,336,35,329,21,317,10,301,1,278,13,271,20,284,28,295,37,302,46,307,57,308,68,306,78,301,86,292,91,282,93,270,91,260,86,247,78,233,67,217,54,201,3,147,3,135,128,135,102,256,114,263,123,271,129,279,131,288,132,296,130,310,122,321,110,330,95,336,78,338,61,336,46,331,33,322,22,309,11,291,23,281,31,293,39,301,47,306,56,309,66,310,76,309,83,306,89,301,93,295,94,286,92,276,87,267,78,259,65,252,46,244,46,230,52,231,59,231,60,232,76,230,88,225,97,216,103,205,105,190,
+148,177,139,181,134,175,124,169,110,167,54,167,95,208,112,226,125,241,133,255,137,269,138,283,136,301,127,316,114,328,97,335,75,338,53,336,35,329,21,317,10,301,1,278,13,271,20,284,28,295,37,302,46,307,57,308,68,306,78,301,86,292,91,282,93,270,91,260,86,247,78,233,67,217,54,201,3,147,3,135,128,135,
 54,201,3,147,54,167,54,201,54,167,95,208,54,201,95,208,67,217,13,271,20,284,21,317,21,317,20,284,28,295,21,317,28,295,35,329,35,329,28,295,37,302,35,329,37,302,53,336,53,336,37,302,46,307,53,336,46,307,57,308,57,308,68,306,75,338,75,338,68,306,78,301,75,338,78,301,97,335,97,335,78,301,86,292,97,335,86,292,91,282,10,301,1,278,13,271,10,301,13,271,21,317,91,260,95,208,93,270,93,270,95,208,97,335,97,335,95,208,112,226,97,335,112,226,114,328,114,328,112,226,125,241,114,328,125,241,127,316,127,316,125,241,133,255,127,316,133,255,136,301,136,301,133,255,137,269,136,301,137,269,138,283,97,335,91,282,93,270,75,338,53,336,57,308,95,208,91,260,86,247,95,208,86,247,78,233,95,208,78,233,67,217,129,172,124,169,128,135,128,135,124,169,117,168,128,135,117,168,110,167,128,135,110,167,54,167,128,135,54,167,3,147,148,177,139,181,134,175,148,177,134,175,129,172,148,177,129,172,128,135,128,135,3,147,3,135,
-102,256,114,263,123,271,129,279,131,288,132,296,130,310,122,321,110,330,95,336,78,338,61,336,46,331,33,322,22,309,11,291,23,281,31,293,39,301,47,306,56,309,66,310,76,309,83,306,89,301,93,295,94,286,92,276,87,267,78,259,65,252,46,244,46,230,52,231,59,231,60,232,76,230,88,225,97,216,103,205,105,190,103,179,99,169,92,162,82,157,71,155,66,155,61,156,57,158,52,161,40,169,32,173,28,174,25,175,19,174,14,172,10,169,8,165,7,159,9,150,15,142,25,136,37,132,52,131,83,134,109,144,129,159,141,177,146,200,144,214,139,227,130,239,118,248,102,254,46,253,66,253,143,302,149,306,153,310,156,314,158,318,158,329,155,333,152,336,147,338,141,339,133,337,129,335,125,332,120,328,215,225,171,225,171,57,164,46,155,38,144,31,131,27,116,26,102,28,90,34,81,45,76,59,74,78,74,225,30,225,30,27,29,14,26,-5,22,-28,19,-51,18,-69,19,-82,22,-93,26,-101,32,-106,40,-108,48,-106,55,-102,60,-94,63,-83,64,-69,62,-51,58,-29,52,-6,48,14,46,32,55,18,66,8,77,1,91,-3,107,-4,123,-2,137,2,150,11,162,24,172,40,174,40,176,24,182,11,191,2,201,-2,211,-4,222,-3,231,0,239,4,247,12,256,23,256,28,
+102,256,114,263,123,271,129,279,131,288,132,296,130,310,122,321,110,330,95,336,78,338,61,336,46,331,33,322,22,309,11,291,23,281,31,293,39,301,47,306,56,309,66,310,76,309,83,306,89,301,93,295,94,286,92,276,87,267,78,259,65,252,46,244,46,230,52,231,59,231,60,232,76,230,88,225,97,216,103,205,105,190,103,179,99,169,92,162,82,157,71,155,66,155,61,156,57,158,52,161,40,169,32,173,28,174,25,175,19,174,14,172,10,169,8,165,7,159,9,150,15,142,25,136,37,132,52,131,83,134,109,144,129,159,141,177,146,200,144,214,139,227,130,239,118,248,102,254,
 66,155,61,156,83,134,83,134,61,156,57,158,83,134,57,158,52,131,52,131,57,158,52,161,52,131,52,161,46,165,56,231,59,231,65,252,65,252,59,231,60,232,60,232,76,230,65,252,65,252,76,230,78,259,65,252,46,244,52,231,65,252,52,231,56,231,23,281,31,293,33,322,33,322,31,293,39,301,33,322,39,301,46,331,46,331,39,301,47,306,46,331,47,306,61,336,61,336,47,306,56,309,61,336,56,309,66,310,66,310,76,309,78,338,78,338,76,309,83,306,78,338,83,306,95,336,95,336,83,306,89,301,95,336,89,301,93,295,22,309,11,291,23,281,22,309,23,281,33,322,103,179,99,169,109,144,109,144,99,169,92,162,109,144,92,162,83,134,83,134,92,162,82,157,83,134,82,157,71,155,71,155,66,155,83,134,95,336,94,286,97,216,95,336,97,216,110,330,110,330,97,216,102,256,110,330,102,256,114,263,78,338,61,336,66,310,130,310,122,321,123,271,130,310,123,271,129,279,130,310,129,279,131,288,130,310,131,288,132,296,122,321,110,330,114,263,122,321,114,263,123,271,102,254,102,256,97,216,102,254,97,216,103,205,102,254,103,205,118,248,92,276,87,267,88,225,92,276,88,225,97,216,92,276,97,216,94,286,78,259,76,230,88,225,78,259,88,225,87,267,141,177,146,200,144,214,141,177,144,214,139,227,141,177,139,227,130,239,141,177,130,239,129,159,103,179,109,144,105,190,105,190,109,144,118,248,118,248,109,144,129,159,118,248,129,159,130,239,105,190,118,248,103,205,40,169,36,171,37,132,40,169,37,132,52,131,40,169,52,131,46,165,37,132,36,171,32,173,37,132,32,173,28,174,37,132,28,174,25,175,37,132,25,175,25,136,19,174,14,172,15,142,19,174,15,142,25,136,19,174,25,136,25,175,10,169,8,165,9,150,10,169,9,150,15,142,10,169,15,142,14,172,52,231,46,244,46,230,9,150,8,165,7,159,95,336,93,295,94,286,
-46,253,66,253,143,302,149,306,153,310,156,314,158,318,158,329,155,333,152,336,147,338,141,339,133,337,129,335,125,332,120,328,215,225,171,225,171,57,164,46,155,38,144,31,131,27,116,26,102,28,90,34,81,45,76,59,74,78,74,225,30,225,30,27,
+46,253,66,253,143,302,149,306,153,310,156,314,158,318,158,329,155,333,152,336,147,338,141,339,133,337,129,335,125,332,120,328,
 141,339,143,302,147,338,147,338,143,302,149,306,147,338,149,306,152,336,152,336,149,306,153,310,152,336,153,310,155,333,155,333,153,310,156,314,155,333,156,314,158,329,158,329,156,314,158,318,158,329,158,318,158,323,143,302,141,339,137,338,143,302,137,338,133,337,143,302,133,337,129,335,143,302,129,335,125,332,143,302,125,332,120,328,143,302,120,328,66,253,66,253,120,328,46,253,
-215,225,171,225,171,57,164,46,155,38,144,31,131,27,116,26,102,28,90,34,81,45,76,59,74,78,74,225,30,225,30,27,29,14,26,-5,22,-28,19,-51,18,-69,19,-82,22,-93,26,-101,32,-106,40,-108,48,-106,55,-102,60,-94,63,-83,64,-69,62,-51,58,-29,52,-6,48,14,46,32,55,18,66,8,77,1,91,-3,107,-4,123,-2,137,2,150,11,162,24,172,40,174,40,176,24,182,11,191,2,201,-2,211,-4,222,-3,231,0,239,4,247,12,256,23,256,28,249,22,244,18,239,15,235,14,230,13,224,15,220,19,217,26,215,36,215,48,266,-76,266,-65,247,-62,234,-58,227,-50,223,-38,222,-20,222,271,223,290,227,304,234,313,247,318,266,321,266,331,134,331,95,327,66,316,46,297,34,270,30,235,34,199,46,172,66,154,93,142,127,137,127,-14,126,-35,123,-49,115,-58,102,-63,83,-65,83,-76,160,-76,160,320,189,320,189,-76,16383,16383,127,147,105,153,88,164,77,182,70,206,68,237,70,266,75,289,86,305,103,315,127,320,90,127,89,135,85,143,79,149,71,154,63,155,54,154,46,150,40,144,37,136,35,127,37,118,40,111,46,105,54,101,63,99,71,101,79,105,85,111,89,118,
+215,225,171,225,171,57,164,46,155,38,144,31,131,27,116,26,102,28,90,34,81,45,76,59,74,78,74,225,30,225,30,27,29,14,26,-5,22,-28,19,-51,18,-69,19,-82,22,-93,26,-101,32,-106,40,-108,48,-106,55,-102,60,-94,63,-83,64,-69,62,-51,58,-29,52,-6,48,14,46,32,55,18,66,8,77,1,91,-3,107,-4,123,-2,137,2,150,11,162,24,172,40,174,40,176,24,182,11,191,2,201,-2,211,-4,222,-3,231,0,239,4,247,12,256,23,256,28,249,22,244,18,239,15,235,14,230,13,224,15,220,19,217,26,215,36,215,48,
 46,32,46,32,46,32,46,32,74,225,30,225,46,32,30,225,32,-106,46,32,32,-106,40,-108,46,32,40,-108,48,-106,76,59,74,78,77,1,77,1,74,78,66,8,66,8,74,78,74,225,66,8,74,225,55,18,55,18,74,225,46,32,30,225,30,27,32,-106,32,-106,30,27,29,14,32,-106,29,14,26,-101,26,-101,29,14,26,-5,26,-101,26,-5,22,-28,18,-69,19,-82,19,-51,19,-51,19,-82,22,-93,19,-51,22,-93,22,-28,22,-28,22,-93,26,-101,171,225,171,57,172,40,172,40,171,57,164,46,172,40,164,46,162,24,162,24,164,46,155,38,162,24,155,38,150,11,150,11,155,38,144,31,150,11,144,31,137,2,137,2,144,31,131,27,137,2,131,27,123,-2,123,-2,131,27,116,26,123,-2,116,26,107,-4,107,-4,116,26,102,28,107,-4,102,28,91,-3,91,-3,102,28,90,34,91,-3,90,34,81,45,81,45,76,59,77,1,81,45,77,1,91,-3,215,225,171,225,172,40,215,225,172,40,174,40,215,225,174,40,176,24,215,225,176,24,182,11,215,225,182,11,191,2,215,225,191,2,201,-2,215,225,201,-2,211,-4,215,225,211,-4,215,48,249,22,244,18,247,12,247,12,244,18,239,15,247,12,239,15,239,4,239,4,239,15,235,14,239,4,235,14,231,0,231,0,235,14,230,13,249,22,247,12,256,23,249,22,256,23,256,28,224,15,220,19,222,-3,224,15,222,-3,231,0,224,15,231,0,230,13,215,48,211,-4,215,36,215,36,211,-4,222,-3,215,36,222,-3,217,26,217,26,222,-3,220,19,48,14,48,-106,52,-6,52,-6,48,-106,55,-102,52,-6,55,-102,58,-29,58,-29,55,-102,60,-94,58,-29,60,-94,62,-51,62,-51,60,-94,63,-83,62,-51,63,-83,64,-69,46,32,48,-106,48,14,
-266,-76,266,-65,247,-62,234,-58,227,-50,223,-38,222,-20,222,271,223,290,227,304,234,313,247,318,266,321,266,331,134,331,95,327,66,316,46,297,34,270,30,235,34,199,46,172,66,154,93,142,127,137,127,-14,126,-35,123,-49,115,-58,102,-63,83,-65,83,-76,160,-76,160,320,189,320,189,-76,16383,16383,127,147,105,153,88,164,77,182,70,206,68,237,70,266,75,289,86,305,103,315,127,320,90,127,89,135,85,143,79,149,71,154,63,155,54,154,46,150,40,144,37,136,35,127,37,118,40,111,46,105,54,101,63,99,71,101,79,105,85,111,89,118,90,127,87,0,70,0,49,-49,52,-51,55,-50,57,-50,60,-49,66,-49,76,-50,84,-52,89,-55,92,-60,93,-67,92,-74,88,-81,83,-85,75,-88,65,-89,59,-89,47,-87,40,-86,33,-83,26,-98,35,-102,51,-106,59,-106,68,-107,
+266,-76,266,-65,247,-62,234,-58,227,-50,223,-38,222,-20,222,271,223,290,227,304,234,313,247,318,266,321,266,331,134,331,95,327,66,316,46,297,34,270,30,235,34,199,46,172,66,154,93,142,127,137,127,-14,126,-35,123,-49,115,-58,102,-63,83,-65,83,-76,160,-76,160,320,189,320,189,-76,16383,16383,127,147,105,153,88,164,77,182,70,206,68,237,70,266,75,289,86,305,103,315,127,320,
 123,-49,115,-58,160,-76,160,-76,115,-58,102,-63,160,-76,102,-63,83,-65,134,331,95,327,103,315,134,331,103,315,127,320,134,331,127,320,127,137,134,331,127,137,160,-76,134,331,160,-76,160,320,134,331,160,320,266,331,127,320,127,147,127,137,105,153,88,164,93,142,93,142,88,164,77,182,93,142,77,182,66,154,66,154,77,182,70,206,66,154,70,206,68,237,68,237,70,266,66,316,66,316,70,266,75,289,66,316,75,289,95,327,95,327,75,289,86,305,95,327,86,305,103,315,66,316,46,297,46,172,66,316,46,172,66,154,66,316,66,154,68,237,247,318,266,321,266,331,247,318,266,331,234,313,234,313,266,331,189,320,234,313,189,320,227,304,227,304,189,320,223,290,234,-58,227,-50,189,-76,189,-76,227,-50,223,-38,189,-76,223,-38,189,320,189,320,223,-38,222,-20,189,320,222,-20,222,271,160,-76,127,137,127,-14,160,-76,127,-14,126,-35,160,-76,126,-35,123,-49,266,-76,266,-65,247,-62,266,-76,247,-62,234,-58,266,-76,234,-58,189,-76,105,153,93,142,127,137,105,153,127,137,127,147,34,199,46,172,46,297,34,199,46,297,34,270,34,199,34,270,30,235,160,-76,83,-65,83,-76,266,331,160,320,189,320,223,290,189,320,222,271,
-90,127,89,135,85,143,79,149,71,154,63,155,54,154,46,150,40,144,37,136,35,127,37,118,40,111,46,105,54,101,63,99,71,101,79,105,85,111,89,118,90,127,87,0,70,0,49,-49,52,-51,55,-50,57,-50,60,-49,66,-49,76,-50,84,-52,89,-55,92,-60,93,-67,92,-74,88,-81,83,-85,75,-88,65,-89,59,-89,47,-87,40,-86,
+90,127,89,135,85,143,79,149,71,154,63,155,54,154,46,150,40,144,37,136,35,127,37,118,40,111,46,105,54,101,63,99,71,101,79,105,85,111,89,118,90,127,
 35,127,37,118,37,136,37,136,37,118,40,111,37,136,40,111,40,144,40,144,40,111,46,105,40,144,46,105,46,150,46,150,46,105,54,101,46,150,54,101,54,154,54,154,54,101,62,99,54,154,62,99,63,155,63,155,62,99,71,101,63,155,71,101,71,154,71,154,71,101,79,105,71,154,79,105,79,149,79,149,79,105,85,111,79,149,85,111,85,143,85,143,85,111,89,118,85,143,89,118,89,135,89,135,89,118,90,127,
-87,0,70,0,49,-49,52,-51,55,-50,57,-50,60,-49,66,-49,76,-50,84,-52,89,-55,92,-60,93,-67,92,-74,88,-81,83,-85,75,-88,65,-89,59,-89,47,-87,40,-86,33,-83,26,-98,35,-102,51,-106,59,-106,68,-107,89,-105,107,-99,120,-91,128,-79,131,-64,129,-52,123,-43,114,-36,102,-32,88,-30,80,-30,77,-31,75,-31,124,135,124,147,113,148,105,150,99,154,96,159,95,166,95,336,89,338,30,310,30,299,36,302,41,304,45,305,52,305,54,301,55,297,55,157,52,153,47,150,40,148,28,147,28,135,152,271,148,293,139,312,123,326,103,335,79,338,54,335,33,325,17,310,6,291,3,267,6,244,16,225,32,210,52,200,75,197,100,201,
+87,0,70,0,49,-49,52,-51,55,-50,57,-50,60,-49,66,-49,76,-50,84,-52,89,-55,92,-60,93,-67,92,-74,88,-81,83,-85,75,-88,65,-89,59,-89,47,-87,40,-86,33,-83,26,-98,35,-102,51,-106,59,-106,68,-107,89,-105,107,-99,120,-91,128,-79,131,-64,129,-52,123,-43,114,-36,102,-32,88,-30,80,-30,77,-31,75,-31,
 59,-106,68,-107,59,-89,59,-89,68,-107,65,-89,75,-88,65,-89,68,-107,75,-88,68,-107,89,-105,57,-50,60,-49,70,0,70,0,60,-49,63,-49,70,0,63,-49,66,-49,66,-49,76,-50,70,0,70,0,76,-50,75,-31,70,0,75,-31,87,0,70,0,49,-49,52,-51,70,0,52,-51,55,-50,70,0,55,-50,57,-50,131,-64,129,-52,128,-79,128,-79,129,-52,123,-43,128,-79,123,-43,120,-91,120,-91,123,-43,114,-36,120,-91,114,-36,107,-99,107,-99,114,-36,102,-32,107,-99,102,-32,93,-67,93,-67,102,-32,92,-60,89,-55,92,-60,102,-32,89,-55,102,-32,88,-30,89,-55,88,-30,85,-30,89,-55,85,-30,84,-52,84,-52,85,-30,82,-30,84,-52,82,-30,80,-30,84,-52,80,-30,77,-31,84,-52,77,-31,76,-50,107,-99,93,-67,92,-74,107,-99,92,-74,89,-105,89,-105,92,-74,88,-81,89,-105,88,-81,83,-85,33,-83,35,-102,40,-86,40,-86,35,-102,43,-104,40,-86,43,-104,47,-87,47,-87,43,-104,51,-106,47,-87,51,-106,53,-88,53,-88,51,-106,59,-106,53,-88,59,-106,59,-89,35,-102,33,-83,26,-98,75,-88,89,-105,83,-85,75,-31,76,-50,77,-31,
-124,135,124,147,113,148,105,150,99,154,96,159,95,166,95,336,89,338,30,310,30,299,36,302,41,304,45,305,52,305,54,301,55,297,55,157,52,153,47,150,40,148,28,147,28,135,152,271,148,293,139,312,123,326,103,335,79,338,54,335,33,325,17,310,6,291,3,267,6,244,16,225,32,210,52,200,75,197,100,201,121,211,138,227,148,247,152,271,16383,16383,116,258,
+124,135,124,147,113,148,105,150,99,154,96,159,95,166,95,336,89,338,30,310,30,299,36,302,41,304,45,305,52,305,54,301,55,297,55,157,52,153,47,150,40,148,28,147,28,135,
 52,153,47,150,124,135,124,135,47,150,40,148,124,135,40,148,28,147,41,304,45,305,89,338,89,338,45,305,48,305,89,338,48,305,50,305,50,305,52,305,89,338,89,338,52,305,53,303,89,338,53,303,54,301,113,148,105,150,124,135,124,135,105,150,99,154,124,135,99,154,55,164,55,164,99,154,96,159,55,164,96,159,55,291,55,297,55,291,89,338,55,297,89,338,54,301,36,302,41,304,89,338,36,302,89,338,30,310,36,302,30,310,30,299,95,166,95,336,89,338,95,166,89,338,55,291,95,166,55,291,96,159,55,157,52,153,124,135,55,157,124,135,55,164,124,135,28,147,28,135,113,148,124,135,124,147,
-152,271,148,293,139,312,123,326,103,335,79,338,54,335,33,325,17,310,6,291,3,267,6,244,16,225,32,210,52,200,75,197,100,201,121,211,138,227,148,247,152,271,16383,16383,116,258,114,242,110,230,102,221,93,216,80,214,73,214,66,216,56,224,52,230,44,250,42,261,40,273,40,285,41,297,46,307,53,315,63,320,74,321,88,318,99,310,108,297,114,279,116,258,229,111,189,147,174,161,143,192,130,204,124,208,122,208,121,207,119,206,118,204,118,203,119,199,122,193,127,185,134,176,143,165,150,155,158,145,167,134,176,122,185,111,143,58,134,47,127,38,122,31,119,25,118,22,118,19,119,18,121,17,123,17,130,21,142,32,158,46,174,61,189,75,16383,16383,132,111,92,147,62,177,46,192,34,204,27,208,26,208,24,207,23,206,
+152,271,148,293,139,312,123,326,103,335,79,338,54,335,33,325,17,310,6,291,3,267,6,244,16,225,32,210,52,200,75,197,100,201,121,211,138,227,148,247,152,271,16383,16383,116,258,114,242,110,230,102,221,93,216,80,214,73,214,66,216,56,224,52,230,44,250,42,261,40,273,40,285,41,297,46,307,53,315,63,320,74,321,88,318,99,310,108,297,114,279,116,258,
 44,250,52,200,48,240,48,240,52,200,52,230,56,224,52,230,52,200,56,224,52,200,75,197,42,261,40,273,33,325,42,261,33,325,32,210,42,261,32,210,52,200,42,261,52,200,44,250,33,325,40,285,41,297,33,325,41,297,54,335,54,335,41,297,46,307,54,335,46,307,53,315,3,267,6,244,6,291,6,291,6,244,16,225,6,291,16,225,17,310,17,310,16,225,32,210,17,310,32,210,33,325,103,335,79,338,88,318,88,318,79,338,74,321,63,320,74,321,79,338,63,320,79,338,54,335,114,242,110,230,121,211,121,211,110,230,102,221,121,211,102,221,100,201,100,201,102,221,93,216,100,201,93,216,80,214,80,214,73,214,75,197,75,197,73,214,66,216,75,197,66,216,61,220,152,271,148,293,148,247,148,247,148,293,139,312,148,247,139,312,138,227,138,227,139,312,123,326,138,227,123,326,121,211,121,211,123,326,116,258,88,318,99,310,103,335,103,335,99,310,108,297,103,335,108,297,123,326,123,326,108,297,114,279,123,326,114,279,116,258,80,214,75,197,100,201,54,335,53,315,63,320,114,242,121,211,116,258,56,224,75,197,61,220,33,325,40,273,40,285,
-229,111,189,147,174,161,143,192,130,204,124,208,122,208,121,207,119,206,118,204,118,203,119,199,122,193,127,185,134,176,143,165,150,155,158,145,167,134,176,122,185,111,143,58,134,47,127,38,122,31,119,25,118,22,118,19,119,18,121,17,123,17,130,21,142,32,158,46,174,61,189,75,16383,16383,132,111,92,147,62,177,46,192,34,204,27,208,26,208,24,207,23,206,22,204,22,203,23,199,26,193,31,185,38,176,46,165,53,155,61,145,70,134,79,122,89,111,46,58,38,47,31,38,26,31,23,25,22,22,22,19,23,18,25,17,27,17,33,21,45,32,61,46,77,61,92,75,357,45,357,74,329,74,329,203,305,203,204,70,204,45,294,45,294,0,329,0,329,45,16383,16383,294,74,227,74,294,163,16383,16383,316,338,293,338,66,-6,91,-6,16383,16383,112,135,112,147,100,148,92,150,87,154,84,159,83,166,83,336,76,338,22,310,22,299,29,302,34,304,38,305,45,305,47,301,47,157,44,153,40,150,32,148,21,147,21,135,371,42,362,46,357,40,352,36,346,34,340,33,333,32,276,32,318,73,335,91,347,106,355,120,360,134,361,148,358,166,350,181,337,193,320,200,298,203,275,201,257,194,243,182,232,165,223,143,235,136,243,149,251,159,259,167,269,171,280,173,
+229,111,189,147,174,161,143,192,130,204,124,208,122,208,121,207,119,206,118,204,118,203,119,199,122,193,127,185,134,176,143,165,150,155,158,145,167,134,176,122,185,111,143,58,134,47,127,38,122,31,119,25,118,22,118,19,119,18,121,17,123,17,130,21,142,32,158,46,174,61,189,75,16383,16383,132,111,92,147,62,177,46,192,34,204,27,208,26,208,24,207,23,206,22,204,22,203,23,199,26,193,31,185,38,176,46,165,53,155,61,145,70,134,79,122,89,111,46,58,38,47,31,38,26,31,23,25,22,22,22,19,23,18,25,17,27,17,33,21,45,32,61,46,77,61,92,75,
 92,75,132,111,92,147,92,75,92,147,89,111,92,75,89,111,77,61,53,155,61,145,62,177,62,177,61,145,70,134,62,177,70,134,78,161,78,161,70,134,79,122,78,161,79,122,92,147,92,147,79,122,89,111,53,155,62,177,46,165,46,165,62,177,46,192,46,165,46,192,38,176,38,176,46,192,34,204,38,176,34,204,31,185,31,185,34,204,27,208,31,185,27,208,26,193,26,193,27,208,26,208,26,193,26,208,24,207,23,206,22,204,23,199,23,206,23,199,26,193,23,206,26,193,24,207,189,75,229,111,189,147,189,75,189,147,185,111,189,75,185,111,174,61,150,155,158,145,158,177,158,177,158,145,167,134,158,177,167,134,174,161,174,161,167,134,176,122,174,161,176,122,189,147,189,147,176,122,185,111,150,155,158,177,143,165,143,165,158,177,143,192,143,165,143,192,134,176,134,176,143,192,130,204,134,176,130,204,127,185,127,185,130,204,124,208,127,185,124,208,122,208,122,193,127,185,122,208,122,193,122,208,121,207,122,193,121,207,119,206,122,193,119,206,119,199,118,204,118,203,119,199,118,204,119,199,119,206,119,18,121,17,122,31,122,31,121,17,123,17,122,31,123,17,127,38,127,38,123,17,130,21,127,38,130,21,134,47,134,47,130,21,142,32,134,47,142,32,143,58,143,58,142,32,158,46,143,58,158,46,185,111,185,111,158,46,174,61,119,25,118,22,118,20,119,25,118,20,118,19,119,25,118,19,119,18,119,25,119,18,122,31,23,18,25,17,26,31,26,31,25,17,27,17,26,31,27,17,31,38,31,38,27,17,33,21,31,38,33,21,38,47,38,47,33,21,45,32,38,47,45,32,46,58,46,58,45,32,61,46,46,58,61,46,89,111,89,111,61,46,77,61,23,25,22,22,22,20,23,25,22,20,22,19,23,25,22,19,23,18,23,25,23,18,26,31,23,199,22,204,22,203,
-357,45,357,74,329,74,329,203,305,203,204,70,204,45,294,45,294,0,329,0,329,45,16383,16383,294,74,227,74,294,163,16383,16383,316,338,293,338,66,-6,91,-6,16383,16383,112,135,112,147,100,148,92,150,87,154,84,159,83,166,83,336,76,338,22,310,22,299,29,302,34,304,38,305,45,305,47,301,47,157,44,153,40,150,32,148,21,147,21,135,371,42,362,46,357,40,352,36,346,34,340,33,333,32,276,32,318,73,335,91,347,106,355,120,360,134,361,148,358,166,350,181,337,193,320,200,298,203,275,201,257,194,243,182,232,165,223,143,235,136,243,149,251,159,259,167,269,171,280,173,291,171,301,166,308,158,313,147,315,135,313,125,308,112,301,98,290,82,276,66,225,12,225,0,351,0,
+357,45,357,74,329,74,329,203,305,203,204,70,204,45,294,45,294,0,329,0,329,45,16383,16383,294,74,227,74,294,163,16383,16383,316,338,293,338,66,-6,91,-6,16383,16383,112,135,112,147,100,148,92,150,87,154,84,159,83,166,83,336,76,338,22,310,22,299,29,302,34,304,38,305,45,305,47,301,47,157,44,153,40,150,32,148,21,147,21,135,
 204,45,294,45,204,70,204,70,294,45,227,74,204,70,227,74,305,203,305,203,227,74,294,163,305,203,294,163,329,0,329,0,294,163,294,74,329,0,294,74,294,45,294,45,294,74,227,74,305,203,329,0,329,203,329,74,329,45,357,45,329,74,357,45,357,74,293,338,66,-6,91,-6,293,338,91,-6,316,338,44,153,40,150,112,135,112,135,40,150,32,148,112,135,32,148,21,147,34,304,38,305,76,338,76,338,38,305,41,305,76,338,41,305,43,305,43,305,45,305,76,338,76,338,45,305,46,303,76,338,46,303,47,301,100,148,92,150,112,135,112,135,92,150,87,154,112,135,87,154,47,164,47,164,87,154,84,159,47,164,84,159,47,291,47,297,47,291,76,338,47,297,76,338,47,301,29,302,34,304,76,338,29,302,76,338,22,310,29,302,22,310,22,299,83,166,83,336,76,338,83,166,76,338,47,291,83,166,47,291,84,159,47,157,44,153,112,135,47,157,112,135,47,164,112,135,21,147,21,135,100,148,112,135,112,147,329,0,294,45,294,0,
-371,42,362,46,357,40,352,36,346,34,340,33,333,32,276,32,318,73,335,91,347,106,355,120,360,134,361,148,358,166,350,181,337,193,320,200,298,203,275,201,257,194,243,182,232,165,223,143,235,136,243,149,251,159,259,167,269,171,280,173,291,171,301,166,308,158,313,147,315,135,313,125,308,112,301,98,290,82,276,66,225,12,225,0,351,0,16383,16383,297,338,275,338,48,-6,73,-6,16383,16383,108,135,108,147,97,148,89,150,84,154,81,159,80,166,80,336,73,338,19,310,19,299,26,302,31,304,35,305,42,305,44,301,44,297,45,291,45,164,44,157,41,153,37,150,29,148,18,147,18,135,359,45,359,74,331,74,331,203,308,203,206,70,206,45,296,45,296,0,331,0,331,45,16383,16383,296,74,229,74,296,163,16383,16383,319,338,296,338,69,-6,94,-6,16383,16383,102,256,114,263,123,271,129,279,131,288,132,296,130,310,122,321,110,330,95,336,78,338,61,336,46,331,33,322,22,309,11,291,23,281,31,293,39,301,47,306,56,309,66,310,76,309,83,306,89,301,93,295,94,286,92,276,87,267,78,259,65,252,46,244,46,230,52,231,59,231,60,232,76,230,88,225,97,216,103,205,105,190,103,179,99,169,92,162,82,157,71,155,66,155,61,156,57,158,52,161,40,169,32,173,28,174,
+371,42,362,46,357,40,352,36,346,34,340,33,333,32,276,32,318,73,335,91,347,106,355,120,360,134,361,148,358,166,350,181,337,193,320,200,298,203,275,201,257,194,243,182,232,165,223,143,235,136,243,149,251,159,259,167,269,171,280,173,291,171,301,166,308,158,313,147,315,135,313,125,308,112,301,98,290,82,276,66,225,12,225,0,351,0,16383,16383,297,338,275,338,48,-6,73,-6,16383,16383,108,135,108,147,97,148,89,150,84,154,81,159,80,166,80,336,73,338,19,310,19,299,26,302,31,304,35,305,42,305,44,301,44,297,45,291,45,164,44,157,41,153,37,150,29,148,18,147,18,135,
 308,112,301,98,318,73,318,73,301,98,290,82,318,73,290,82,276,66,276,66,225,12,276,32,276,32,225,12,351,0,276,32,351,0,333,32,340,33,333,32,351,0,340,33,351,0,346,34,346,34,351,0,352,36,235,136,243,149,243,182,243,182,243,149,251,159,243,182,251,159,257,194,257,194,251,159,259,167,257,194,259,167,275,201,275,201,259,167,269,171,275,201,269,171,280,173,280,173,291,171,298,203,298,203,291,171,301,166,298,203,301,166,320,200,320,200,301,166,308,158,320,200,308,158,313,147,232,165,223,143,235,136,232,165,235,136,243,182,371,42,362,46,357,40,371,42,357,40,352,36,371,42,352,36,351,0,275,338,48,-6,73,-6,275,338,73,-6,297,338,41,153,37,150,108,135,108,135,37,150,29,148,108,135,29,148,18,147,31,304,35,305,73,338,73,338,35,305,38,305,73,338,38,305,40,305,40,305,42,305,73,338,73,338,42,305,43,303,73,338,43,303,44,301,97,148,89,150,108,135,108,135,89,150,84,154,108,135,84,154,45,164,45,164,84,154,81,159,45,164,81,159,45,291,44,297,45,291,73,338,44,297,73,338,44,301,26,302,31,304,73,338,26,302,73,338,19,310,26,302,19,310,19,299,80,166,80,336,73,338,80,166,73,338,45,291,80,166,45,291,81,159,313,125,318,73,315,135,315,135,318,73,320,200,320,200,318,73,335,91,320,200,335,91,337,193,337,193,335,91,347,106,337,193,347,106,350,181,350,181,347,106,355,120,350,181,355,120,358,166,358,166,355,120,360,134,358,166,360,134,361,148,320,200,313,147,315,135,298,203,275,201,280,173,276,66,276,32,318,73,44,157,41,153,108,135,44,157,108,135,45,164,108,135,18,147,18,135,97,148,108,135,108,147,308,112,318,73,313,125,351,0,225,12,225,0,
-359,45,359,74,331,74,331,203,308,203,206,70,206,45,296,45,296,0,331,0,331,45,16383,16383,296,74,229,74,296,163,16383,16383,319,338,296,338,69,-6,94,-6,16383,16383,102,256,114,263,123,271,129,279,131,288,132,296,130,310,122,321,110,330,95,336,78,338,61,336,46,331,33,322,22,309,11,291,23,281,31,293,39,301,47,306,56,309,66,310,76,309,83,306,89,301,93,295,94,286,92,276,87,267,78,259,65,252,46,244,46,230,52,231,59,231,60,232,76,230,88,225,97,216,103,205,105,190,103,179,99,169,92,162,82,157,71,155,66,155,61,156,57,158,52,161,40,169,32,173,28,174,25,175,19,174,14,172,10,169,8,165,7,159,9,150,15,142,25,136,37,132,52,131,83,134,109,144,129,159,141,177,146,200,144,214,139,227,130,239,118,248,102,254,130,208,129,216,125,223,119,229,112,232,103,233,95,232,87,229,82,223,78,217,77,208,78,199,82,192,87,186,95,182,103,180,112,182,119,186,125,192,129,199,130,208,16383,16383,100,147,96,128,91,112,85,97,77,84,68,70,46,42,31,20,22,2,17,-13,15,-30,16,-42,18,-52,22,-62,27,-71,33,-79,45,-89,58,-97,74,-103,90,-107,107,-108,133,-104,155,-94,173,-79,184,-59,188,-35,187,-24,184,-16,179,-10,173,-6,164,-5,157,-5,151,-8,147,-12,144,-18,143,-25,145,-33,147,-37,150,-42,154,-46,160,-54,161,-57,162,-59,162,-62,160,-71,153,-80,142,-87,130,-91,116,-93,98,-90,83,-81,71,-69,64,-52,61,-34,62,-19,64,-4,67,11,72,27,79,44,93,75,101,99,106,118,108,133,108,147,225,378,153,453,148,457,144,460,140,462,132,464,125,463,120,461,117,458,
+359,45,359,74,331,74,331,203,308,203,206,70,206,45,296,45,296,0,331,0,331,45,16383,16383,296,74,229,74,296,163,16383,16383,319,338,296,338,69,-6,94,-6,16383,16383,102,256,114,263,123,271,129,279,131,288,132,296,130,310,122,321,110,330,95,336,78,338,61,336,46,331,33,322,22,309,11,291,23,281,31,293,39,301,47,306,56,309,66,310,76,309,83,306,89,301,93,295,94,286,92,276,87,267,78,259,65,252,46,244,46,230,52,231,59,231,60,232,76,230,88,225,97,216,103,205,105,190,103,179,99,169,92,162,82,157,71,155,66,155,61,156,57,158,52,161,40,169,32,173,28,174,25,175,19,174,14,172,10,169,8,165,7,159,9,150,15,142,25,136,37,132,52,131,83,134,109,144,129,159,141,177,146,200,144,214,139,227,130,239,118,248,102,254,
 206,45,296,45,206,70,206,70,296,45,229,74,206,70,229,74,308,203,308,203,229,74,296,163,308,203,296,163,331,0,331,0,296,163,296,74,331,0,296,74,296,45,296,45,296,74,229,74,308,203,331,0,331,203,331,74,331,45,359,45,331,74,359,45,359,74,296,338,69,-6,94,-6,296,338,94,-6,319,338,66,155,61,156,83,134,83,134,61,156,57,158,83,134,57,158,52,131,52,131,57,158,52,161,52,131,52,161,46,165,56,231,59,231,65,252,65,252,59,231,60,232,60,232,76,230,65,252,65,252,76,230,78,259,65,252,46,244,52,231,65,252,52,231,56,231,23,281,31,293,33,322,33,322,31,293,39,301,33,322,39,301,46,331,46,331,39,301,47,306,46,331,47,306,61,336,61,336,47,306,56,309,61,336,56,309,66,310,66,310,76,309,78,338,78,338,76,309,83,306,78,338,83,306,95,336,95,336,83,306,89,301,95,336,89,301,93,295,22,309,11,291,23,281,22,309,23,281,33,322,103,179,99,169,109,144,109,144,99,169,92,162,109,144,92,162,83,134,83,134,92,162,82,157,83,134,82,157,71,155,71,155,66,155,83,134,95,336,94,286,97,216,95,336,97,216,110,330,110,330,97,216,102,256,110,330,102,256,114,263,78,338,61,336,66,310,130,310,122,321,123,271,130,310,123,271,129,279,130,310,129,279,131,288,130,310,131,288,132,296,122,321,110,330,114,263,122,321,114,263,123,271,102,254,102,256,97,216,102,254,97,216,103,205,102,254,103,205,118,248,92,276,87,267,88,225,92,276,88,225,97,216,92,276,97,216,94,286,78,259,76,230,88,225,78,259,88,225,87,267,141,177,146,200,144,214,141,177,144,214,139,227,141,177,139,227,130,239,141,177,130,239,129,159,103,179,109,144,105,190,105,190,109,144,118,248,118,248,109,144,129,159,118,248,129,159,130,239,105,190,118,248,103,205,40,169,36,171,37,132,40,169,37,132,52,131,40,169,52,131,46,165,37,132,36,171,32,173,37,132,32,173,28,174,37,132,28,174,25,175,37,132,25,175,25,136,19,174,14,172,15,142,19,174,15,142,25,136,19,174,25,136,25,175,10,169,8,165,9,150,10,169,9,150,15,142,10,169,15,142,14,172,52,231,46,244,46,230,9,150,8,165,7,159,95,336,93,295,94,286,331,0,296,45,296,0,
-130,208,129,216,125,223,119,229,112,232,103,233,95,232,87,229,82,223,78,217,77,208,78,199,82,192,87,186,95,182,103,180,112,182,119,186,125,192,129,199,130,208,16383,16383,100,147,96,128,91,112,85,97,77,84,68,70,46,42,31,20,22,2,17,-13,15,-30,16,-42,18,-52,22,-62,27,-71,33,-79,45,-89,58,-97,74,-103,90,-107,107,-108,133,-104,155,-94,173,-79,184,-59,188,-35,187,-24,184,-16,179,-10,173,-6,164,-5,157,-5,151,-8,147,-12,144,-18,143,-25,145,-33,147,-37,150,-42,154,-46,160,-54,161,-57,162,-59,162,-62,160,-71,153,-80,142,-87,130,-91,116,-93,98,-90,83,-81,71,-69,64,-52,61,-34,62,-19,64,-4,67,11,72,27,79,44,93,75,101,99,106,118,108,133,108,147,225,378,153,453,148,457,144,460,140,462,132,464,125,463,120,461,117,458,114,454,113,448,114,443,116,439,119,434,123,430,128,426,205,378,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,138,378,158,378,235,427,245,435,248,439,249,443,250,448,249,454,247,458,243,461,239,463,233,464,228,463,224,462,221,460,216,457,211,453,16383,16383,353,0,353,9,340,12,
+130,208,129,216,125,223,119,229,112,232,103,233,95,232,87,229,82,223,78,217,77,208,78,199,82,192,87,186,95,182,103,180,112,182,119,186,125,192,129,199,130,208,16383,16383,100,147,96,128,91,112,85,97,77,84,68,70,46,42,31,20,22,2,17,-13,15,-30,16,-42,18,-52,22,-62,27,-71,33,-79,45,-89,58,-97,74,-103,90,-107,107,-108,133,-104,155,-94,173,-79,184,-59,188,-35,187,-24,184,-16,179,-10,173,-6,164,-5,157,-5,151,-8,147,-12,144,-18,143,-25,145,-33,147,-37,150,-42,154,-46,160,-54,161,-57,162,-59,162,-62,160,-71,153,-80,142,-87,130,-91,116,-93,98,-90,83,-81,71,-69,64,-52,61,-34,62,-19,64,-4,67,11,72,27,79,44,93,75,101,99,106,118,108,133,108,147,
 103,180,112,182,112,232,112,232,112,182,119,186,112,232,119,186,119,229,119,229,119,186,125,192,119,229,125,192,125,223,125,223,125,192,129,199,125,223,129,199,129,216,129,216,129,199,130,208,78,217,78,199,82,223,82,223,78,199,82,192,82,223,82,192,87,229,87,229,82,192,87,186,87,229,87,186,95,232,95,232,87,186,95,182,95,232,95,182,103,233,103,233,95,182,103,180,103,233,103,180,112,232,72,27,79,44,77,84,72,27,77,84,68,70,68,70,46,42,62,-19,62,-19,46,42,61,-34,64,-52,61,-34,58,-97,64,-52,58,-97,74,-103,68,70,62,-19,64,-4,68,70,64,-4,67,11,68,70,67,11,72,27,33,-79,45,-89,46,42,46,42,45,-89,58,-97,46,42,58,-97,61,-34,31,20,22,2,22,-62,31,20,22,-62,27,-71,31,20,27,-71,33,-79,31,20,33,-79,46,42,15,-30,16,-42,17,-13,17,-13,16,-42,18,-52,17,-13,18,-52,22,2,22,2,18,-52,22,-62,108,147,100,147,101,99,108,147,101,99,106,118,108,147,106,118,108,133,96,128,91,112,93,75,96,128,93,75,101,99,96,128,101,99,100,147,85,97,77,84,79,44,85,97,79,44,93,75,85,97,93,75,91,112,160,-71,153,-80,155,-94,155,-94,153,-80,142,-87,155,-94,142,-87,133,-104,133,-104,142,-87,130,-91,133,-104,130,-91,116,-93,116,-93,98,-90,107,-108,107,-108,98,-90,90,-107,83,-81,71,-69,74,-103,83,-81,74,-103,90,-107,83,-81,90,-107,98,-90,147,-37,150,-42,151,-8,151,-8,150,-42,154,-46,151,-8,154,-46,157,-5,157,-5,154,-46,157,-50,157,-5,157,-50,164,-5,164,-5,157,-50,160,-54,164,-5,160,-54,161,-57,143,-25,144,-29,144,-18,144,-18,144,-29,145,-33,144,-18,145,-33,147,-12,147,-12,145,-33,147,-37,147,-12,147,-37,151,-8,173,-6,173,-79,179,-10,179,-10,173,-79,184,-59,179,-10,184,-59,184,-16,184,-16,184,-59,188,-35,184,-16,188,-35,187,-24,155,-94,173,-79,160,-71,160,-71,173,-79,162,-62,164,-5,162,-62,173,-79,164,-5,173,-79,173,-6,116,-93,107,-108,133,-104,164,-5,161,-57,162,-59,164,-5,162,-59,162,-62,64,-52,74,-103,71,-69,78,199,78,217,77,208,
-225,378,153,453,148,457,144,460,140,462,132,464,125,463,120,461,117,458,114,454,113,448,114,443,116,439,119,434,123,430,128,426,205,378,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,138,378,158,378,235,427,245,435,248,439,249,443,250,448,249,454,247,458,243,461,239,463,233,464,228,463,224,462,221,460,216,457,211,453,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,
+225,378,153,453,148,457,144,460,140,462,132,464,125,463,120,461,117,458,114,454,113,448,114,443,116,439,119,434,123,430,128,426,205,378,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,
 205,378,225,378,153,453,205,378,153,453,148,457,205,378,148,457,144,460,205,378,144,460,140,462,205,378,140,462,136,463,205,378,136,463,132,464,205,378,132,464,128,426,113,448,114,443,114,454,114,454,114,443,116,439,114,454,116,439,117,458,117,458,116,439,119,434,117,458,119,434,120,461,120,461,119,434,123,430,120,461,123,430,125,463,125,463,123,430,128,426,125,463,128,426,132,464,55,58,73,22,72,30,72,30,72,34,70,93,70,93,72,34,73,38,70,93,73,38,74,43,174,337,76,51,99,108,174,337,99,108,108,128,108,128,99,108,230,108,108,128,230,108,224,128,224,128,230,108,306,55,224,128,306,55,184,337,246,11,242,10,353,0,353,0,242,10,235,10,353,0,235,10,226,9,259,21,258,18,353,0,353,0,258,18,256,16,353,0,256,16,253,14,253,14,250,12,353,0,353,0,250,12,246,11,261,26,353,0,330,17,261,26,330,17,321,26,261,26,321,26,314,38,261,26,314,38,306,55,261,26,306,55,260,31,306,55,230,108,251,61,306,55,251,61,254,53,306,55,254,53,257,45,306,55,257,45,259,38,306,55,259,38,260,31,174,337,108,128,166,266,174,337,166,266,224,128,174,337,224,128,184,337,70,93,55,58,72,30,70,93,74,43,75,47,70,93,75,47,76,51,70,93,76,51,174,337,340,12,330,17,353,0,340,12,353,0,353,9,260,23,259,21,353,0,260,23,353,0,261,26,107,0,107,9,94,10,107,0,94,10,84,12,107,0,84,12,44,34,107,0,44,34,33,20,107,0,33,20,22,13,107,0,22,13,7,9,107,0,7,9,7,0,44,34,84,12,77,16,44,34,77,16,73,22,44,34,73,22,55,58,353,0,226,9,226,0,
-138,378,158,378,235,427,245,435,248,439,249,443,250,448,249,454,247,458,243,461,239,463,233,464,228,463,224,462,221,460,216,457,211,453,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,257,378,194,462,163,462,101,378,118,378,179,430,239,378,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,248,444,243,434,238,427,233,422,227,420,221,419,216,419,211,420,206,422,200,424,
+138,378,158,378,235,427,245,435,248,439,249,443,250,448,249,454,247,458,243,461,239,463,233,464,228,463,224,462,221,460,216,457,211,453,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,
 233,464,235,427,239,463,239,463,235,427,240,431,239,463,240,431,243,461,243,461,240,431,245,435,243,461,245,435,247,458,247,458,245,435,248,439,247,458,248,439,249,454,249,454,248,439,249,443,249,454,249,443,250,448,235,427,233,464,228,463,235,427,228,463,224,462,235,427,224,462,221,460,235,427,221,460,216,457,235,427,216,457,211,453,235,427,211,453,158,378,55,58,73,22,72,30,72,30,72,34,70,93,70,93,72,34,73,38,70,93,73,38,74,43,174,337,76,51,99,108,174,337,99,108,108,128,108,128,99,108,230,108,108,128,230,108,224,128,224,128,230,108,306,55,224,128,306,55,184,337,246,11,242,10,353,0,353,0,242,10,235,10,353,0,235,10,226,9,259,21,258,18,353,0,353,0,258,18,256,16,353,0,256,16,253,14,253,14,250,12,353,0,353,0,250,12,246,11,261,26,353,0,330,17,261,26,330,17,321,26,261,26,321,26,314,38,261,26,314,38,306,55,261,26,306,55,260,31,306,55,230,108,251,61,306,55,251,61,254,53,306,55,254,53,257,45,306,55,257,45,259,38,306,55,259,38,260,31,174,337,108,128,166,266,174,337,166,266,224,128,174,337,224,128,184,337,70,93,55,58,72,30,70,93,74,43,75,47,70,93,75,47,76,51,70,93,76,51,174,337,340,12,330,17,353,0,340,12,353,0,353,9,260,23,259,21,353,0,260,23,353,0,261,26,107,0,107,9,94,10,107,0,94,10,84,12,107,0,84,12,44,34,107,0,44,34,33,20,107,0,33,20,22,13,107,0,22,13,7,9,107,0,7,9,7,0,44,34,84,12,77,16,44,34,77,16,73,22,44,34,73,22,55,58,353,0,226,9,226,0,158,378,211,453,138,378,
-257,378,194,462,163,462,101,378,118,378,179,430,239,378,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,248,444,243,434,238,427,233,422,227,420,221,419,216,419,211,420,206,422,200,424,195,426,182,432,175,436,161,440,154,441,147,441,133,439,121,433,111,423,103,409,97,391,112,391,115,399,120,406,125,410,131,413,137,414,141,414,149,412,157,408,169,403,180,398,189,394,196,392,202,391,209,391,224,393,237,399,247,409,255,424,262,444,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,
+257,378,194,462,163,462,101,378,118,378,179,430,239,378,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,
 101,378,118,378,163,462,163,462,118,378,179,430,163,462,179,430,194,462,194,462,179,430,239,378,194,462,239,378,257,378,55,58,73,22,72,30,72,30,72,34,70,93,70,93,72,34,73,38,70,93,73,38,74,43,174,337,76,51,99,108,174,337,99,108,108,128,108,128,99,108,230,108,108,128,230,108,224,128,224,128,230,108,306,55,224,128,306,55,184,337,246,11,242,10,353,0,353,0,242,10,235,10,353,0,235,10,226,9,259,21,258,18,353,0,353,0,258,18,256,16,353,0,256,16,253,14,253,14,250,12,353,0,353,0,250,12,246,11,261,26,353,0,330,17,261,26,330,17,321,26,261,26,321,26,314,38,261,26,314,38,306,55,261,26,306,55,260,31,306,55,230,108,251,61,306,55,251,61,254,53,306,55,254,53,257,45,306,55,257,45,259,38,306,55,259,38,260,31,174,337,108,128,166,266,174,337,166,266,224,128,174,337,224,128,184,337,70,93,55,58,72,30,70,93,74,43,75,47,70,93,75,47,76,51,70,93,76,51,174,337,340,12,330,17,353,0,340,12,353,0,353,9,260,23,259,21,353,0,260,23,353,0,261,26,107,0,107,9,94,10,107,0,94,10,84,12,107,0,84,12,44,34,107,0,44,34,33,20,107,0,33,20,22,13,107,0,22,13,7,9,107,0,7,9,7,0,44,34,84,12,77,16,44,34,77,16,73,22,44,34,73,22,55,58,353,0,226,9,226,0,
-248,444,243,434,238,427,233,422,227,420,221,419,216,419,211,420,206,422,200,424,195,426,182,432,175,436,161,440,154,441,147,441,133,439,121,433,111,423,103,409,97,391,112,391,115,399,120,406,125,410,131,413,137,414,141,414,149,412,157,408,169,403,180,398,189,394,196,392,202,391,209,391,224,393,237,399,247,409,255,424,262,444,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,254,411,253,419,249,426,244,431,237,435,229,436,221,435,214,431,209,426,206,419,204,411,205,403,209,397,214,391,221,388,228,387,236,388,244,391,249,397,253,403,254,411,16383,16383,155,411,153,419,150,426,144,431,137,435,129,436,122,435,115,431,110,426,106,419,105,411,106,403,110,397,115,391,121,388,129,387,137,388,144,391,150,397,153,403,155,411,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,
+248,444,243,434,238,427,233,422,227,420,221,419,216,419,211,420,206,422,200,424,195,426,182,432,175,436,161,440,154,441,147,441,133,439,121,433,111,423,103,409,97,391,112,391,115,399,120,406,125,410,131,413,137,414,141,414,149,412,157,408,169,403,180,398,189,394,196,392,202,391,209,391,224,393,237,399,247,409,255,424,262,444,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,
 115,399,120,406,121,433,121,433,120,406,125,410,121,433,125,410,133,439,133,439,125,410,131,413,133,439,131,413,137,414,137,414,141,414,147,441,147,441,141,414,145,413,147,441,145,413,149,412,112,391,115,399,121,433,112,391,121,433,111,423,112,391,111,423,103,409,112,391,103,409,97,391,147,441,149,412,154,441,154,441,149,412,153,410,154,441,153,410,157,408,157,408,169,403,161,440,161,440,169,403,168,438,147,441,133,439,137,414,161,440,154,441,157,408,168,438,169,403,175,436,175,436,169,403,180,398,175,436,180,398,182,432,182,432,180,398,189,394,182,432,189,394,195,426,195,426,189,394,196,392,195,426,196,392,200,424,200,424,196,392,202,391,200,424,202,391,206,422,206,422,202,391,209,391,206,422,209,391,211,420,211,420,209,391,224,393,211,420,224,393,216,419,216,419,224,393,221,419,227,420,221,419,224,393,227,420,224,393,237,399,248,444,243,434,247,409,248,444,247,409,255,424,248,444,255,424,262,444,238,427,233,422,237,399,238,427,237,399,247,409,238,427,247,409,243,434,55,58,73,22,72,30,72,30,72,34,70,93,70,93,72,34,73,38,70,93,73,38,74,43,174,337,76,51,99,108,174,337,99,108,108,128,108,128,99,108,230,108,108,128,230,108,224,128,224,128,230,108,306,55,224,128,306,55,184,337,246,11,242,10,353,0,353,0,242,10,235,10,353,0,235,10,226,9,259,21,258,18,353,0,353,0,258,18,256,16,353,0,256,16,253,14,253,14,250,12,353,0,353,0,250,12,246,11,261,26,353,0,330,17,261,26,330,17,321,26,261,26,321,26,314,38,261,26,314,38,306,55,261,26,306,55,260,31,306,55,230,108,251,61,306,55,251,61,254,53,306,55,254,53,257,45,306,55,257,45,259,38,306,55,259,38,260,31,174,337,108,128,166,266,174,337,166,266,224,128,174,337,224,128,184,337,70,93,55,58,72,30,70,93,74,43,75,47,70,93,75,47,76,51,70,93,76,51,174,337,340,12,330,17,353,0,340,12,353,0,353,9,260,23,259,21,353,0,260,23,353,0,261,26,107,0,107,9,94,10,107,0,94,10,84,12,107,0,84,12,44,34,107,0,44,34,33,20,107,0,33,20,22,13,107,0,22,13,7,9,107,0,7,9,7,0,44,34,84,12,77,16,44,34,77,16,73,22,44,34,73,22,55,58,353,0,226,9,226,0,227,420,237,399,233,422,
-254,411,253,419,249,426,244,431,237,435,229,436,221,435,214,431,209,426,206,419,204,411,205,403,209,397,214,391,221,388,228,387,236,388,244,391,249,397,253,403,254,411,16383,16383,155,411,153,419,150,426,144,431,137,435,129,436,122,435,115,431,110,426,106,419,105,411,106,403,110,397,115,391,121,388,129,387,137,388,144,391,150,397,153,403,155,411,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,229,430,227,446,220,460,209,471,196,478,180,480,164,478,151,471,140,460,133,447,130,431,132,415,139,401,150,391,163,384,179,381,195,384,209,391,220,401,227,415,229,430,16383,16383,213,431,211,420,206,411,199,404,190,400,179,398,169,400,160,404,153,411,148,420,147,431,148,441,153,450,160,457,169,462,179,464,190,462,199,457,206,450,211,441,213,431,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,
+254,411,253,419,249,426,244,431,237,435,229,436,221,435,214,431,209,426,206,419,204,411,205,403,209,397,214,391,221,388,228,387,236,388,244,391,249,397,253,403,254,411,16383,16383,155,411,153,419,150,426,144,431,137,435,129,436,122,435,115,431,110,426,106,419,105,411,106,403,110,397,115,391,121,388,129,387,137,388,144,391,150,397,153,403,155,411,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,
 204,411,205,403,206,419,206,419,205,403,209,397,206,419,209,397,209,426,209,426,209,397,214,391,209,426,214,391,214,431,214,431,214,391,221,388,214,431,221,388,221,435,221,435,221,388,228,387,221,435,228,387,229,436,229,436,228,387,236,388,229,436,236,388,237,435,237,435,236,388,244,391,237,435,244,391,244,431,244,431,244,391,249,397,244,431,249,397,249,426,249,426,249,397,253,403,249,426,253,403,253,419,253,419,253,403,254,411,105,411,106,403,106,419,106,419,106,403,110,397,106,419,110,397,110,426,110,426,110,397,115,391,110,426,115,391,115,431,115,431,115,391,121,388,115,431,121,388,122,435,122,435,121,388,129,387,122,435,129,387,129,436,129,436,129,387,137,388,129,436,137,388,137,435,137,435,137,388,144,391,137,435,144,391,144,431,144,431,144,391,150,397,144,431,150,397,150,426,150,426,150,397,153,403,150,426,153,403,153,419,153,419,153,403,155,411,55,58,73,22,72,30,72,30,72,34,70,93,70,93,72,34,73,38,70,93,73,38,74,43,174,337,76,51,99,108,174,337,99,108,108,128,108,128,99,108,230,108,108,128,230,108,224,128,224,128,230,108,306,55,224,128,306,55,184,337,246,11,242,10,353,0,353,0,242,10,235,10,353,0,235,10,226,9,259,21,258,18,353,0,353,0,258,18,256,16,353,0,256,16,253,14,253,14,250,12,353,0,353,0,250,12,246,11,261,26,353,0,330,17,261,26,330,17,321,26,261,26,321,26,314,38,261,26,314,38,306,55,261,26,306,55,260,31,306,55,230,108,251,61,306,55,251,61,254,53,306,55,254,53,257,45,306,55,257,45,259,38,306,55,259,38,260,31,174,337,108,128,166,266,174,337,166,266,224,128,174,337,224,128,184,337,70,93,55,58,72,30,70,93,74,43,75,47,70,93,75,47,76,51,70,93,76,51,174,337,340,12,330,17,353,0,340,12,353,0,353,9,260,23,259,21,353,0,260,23,353,0,261,26,107,0,107,9,94,10,107,0,94,10,84,12,107,0,84,12,44,34,107,0,44,34,33,20,107,0,33,20,22,13,107,0,22,13,7,9,107,0,7,9,7,0,44,34,84,12,77,16,44,34,77,16,73,22,44,34,73,22,55,58,353,0,226,9,226,0,
-229,430,227,446,220,460,209,471,196,478,180,480,164,478,151,471,140,460,133,447,130,431,132,415,139,401,150,391,163,384,179,381,195,384,209,391,220,401,227,415,229,430,16383,16383,213,431,211,420,206,411,199,404,190,400,179,398,169,400,160,404,153,411,148,420,147,431,148,441,153,450,160,457,169,462,179,464,190,462,199,457,206,450,211,441,213,431,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,431,84,420,84,404,56,389,37,372,26,349,20,320,19,268,19,257,22,252,26,249,34,248,47,248,165,319,165,337,163,350,158,360,149,366,135,370,114,381,114,381,232,370,232,367,211,359,197,346,189,326,184,300,183,248,183,248,295,249,301,251,306,253,310,257,312,262,313,305,313,341,312,367,308,382,299,392,283,397,261,408,261,408,331,126,331,126,321,143,320,155,318,164,315,169,310,171,305,171,302,170,300,168,294,166,291,44,49,36,33,28,23,21,16,11,12,0,9,0,0,99,0,99,9,87,11,77,13,70,16,66,20,65,24,66,33,71,48,80,68,93,95,111,130,199,130,199,56,198,39,195,27,189,18,179,13,164,11,155,9,155,0,410,0,16383,16383,199,150,120,150,199,309,307,65,285,47,264,32,242,23,220,17,
+229,430,227,446,220,460,209,471,196,478,180,480,164,478,151,471,140,460,133,447,130,431,132,415,139,401,150,391,163,384,179,381,195,384,209,391,220,401,227,415,229,430,16383,16383,213,431,211,420,206,411,199,404,190,400,179,398,169,400,160,404,153,411,148,420,147,431,148,441,153,450,160,457,169,462,179,464,190,462,199,457,206,450,211,441,213,431,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,
 211,420,206,411,209,391,209,391,206,411,199,404,209,391,199,404,195,384,195,384,199,404,190,400,195,384,190,400,179,381,179,381,190,400,179,398,180,480,179,464,190,462,180,480,190,462,196,478,196,478,190,462,199,457,196,478,199,457,209,471,209,471,199,457,206,450,209,471,206,450,211,441,229,430,227,446,227,415,227,415,227,446,220,460,227,415,220,460,220,401,220,401,220,460,213,431,211,441,213,431,220,460,211,441,220,460,209,471,211,420,209,391,220,401,211,420,220,401,213,431,153,450,160,457,164,478,164,478,160,457,169,462,164,478,169,462,180,480,180,480,169,462,179,464,151,471,140,460,147,431,151,471,147,431,148,441,151,471,148,441,153,450,151,471,153,450,164,478,153,411,148,420,150,391,150,391,148,420,147,431,169,400,160,404,163,384,169,400,163,384,179,381,169,400,179,381,179,398,153,411,150,391,163,384,153,411,163,384,160,404,130,431,132,415,133,447,133,447,132,415,139,401,133,447,139,401,140,460,140,460,139,401,150,391,140,460,150,391,147,431,55,58,73,22,72,30,72,30,72,34,70,93,70,93,72,34,73,38,70,93,73,38,74,43,174,337,76,51,99,108,174,337,99,108,108,128,108,128,99,108,230,108,108,128,230,108,224,128,224,128,230,108,306,55,224,128,306,55,184,337,246,11,242,10,353,0,353,0,242,10,235,10,353,0,235,10,226,9,259,21,258,18,353,0,353,0,258,18,256,16,353,0,256,16,253,14,253,14,250,12,353,0,353,0,250,12,246,11,261,26,353,0,330,17,261,26,330,17,321,26,261,26,321,26,314,38,261,26,314,38,306,55,261,26,306,55,260,31,306,55,230,108,251,61,306,55,251,61,254,53,306,55,254,53,257,45,306,55,257,45,259,38,306,55,259,38,260,31,174,337,108,128,166,266,174,337,166,266,224,128,174,337,224,128,184,337,70,93,55,58,72,30,70,93,74,43,75,47,70,93,75,47,76,51,70,93,76,51,174,337,340,12,330,17,353,0,340,12,353,0,353,9,260,23,259,21,353,0,260,23,353,0,261,26,107,0,107,9,94,10,107,0,94,10,84,12,107,0,84,12,44,34,107,0,44,34,33,20,107,0,33,20,22,13,107,0,22,13,7,9,107,0,7,9,7,0,44,34,84,12,77,16,44,34,77,16,73,22,44,34,73,22,55,58,353,0,226,9,226,0,
-431,84,420,84,404,56,389,37,372,26,349,20,320,19,268,19,257,22,252,26,249,34,248,47,248,165,319,165,337,163,350,158,360,149,366,135,370,114,381,114,381,232,370,232,367,211,359,197,346,189,326,184,300,183,248,183,248,295,249,301,251,306,253,310,257,312,262,313,305,313,341,312,367,308,382,299,392,283,397,261,408,261,408,331,126,331,126,321,143,320,155,318,164,315,169,310,171,305,171,302,170,300,168,294,166,291,44,49,36,33,28,23,21,16,11,12,0,9,0,0,99,0,99,9,87,11,77,13,70,16,66,20,65,24,66,33,71,48,80,68,93,95,111,130,199,130,199,56,198,39,195,27,189,18,179,13,164,11,155,9,155,0,410,0,16383,16383,199,150,120,150,199,309,307,65,285,47,264,32,242,23,220,17,196,15,175,17,155,21,137,29,120,40,105,54,93,72,84,94,77,118,73,145,72,173,77,222,93,262,118,292,151,311,191,318,221,313,249,300,272,280,289,255,299,225,310,225,305,338,295,338,293,332,285,324,280,322,275,321,271,322,268,322,263,323,259,325,254,326,240,330,225,334,210,336,196,338,181,338,160,337,140,333,120,327,101,319,84,308,59,287,40,262,25,233,17,200,14,165,16,135,21,107,30,82,43,60,58,41,73,27,90,15,109,6,129,0,151,-4,132,-49,136,-51,139,-50,141,-50,144,-49,150,-49,160,-50,168,-52,173,-55,175,-60,176,-67,175,-74,172,-81,166,-85,158,-88,149,-89,143,-89,131,-87,124,-86,117,-83,109,-98,118,-102,134,-106,
+431,84,420,84,404,56,389,37,372,26,349,20,320,19,268,19,257,22,252,26,249,34,248,47,248,165,319,165,337,163,350,158,360,149,366,135,370,114,381,114,381,232,370,232,367,211,359,197,346,189,326,184,300,183,248,183,248,295,249,301,251,306,253,310,257,312,262,313,305,313,341,312,367,308,382,299,392,283,397,261,408,261,408,331,126,331,126,321,143,320,155,318,164,315,169,310,171,305,171,302,170,300,168,294,166,291,44,49,36,33,28,23,21,16,11,12,0,9,0,0,99,0,99,9,87,11,77,13,70,16,66,20,65,24,66,33,71,48,80,68,93,95,111,130,199,130,199,56,198,39,195,27,189,18,179,13,164,11,155,9,155,0,410,0,16383,16383,199,150,120,150,199,309,
 87,11,77,13,99,0,99,0,77,13,70,16,99,0,70,16,36,33,36,33,70,16,66,20,36,33,66,20,44,49,44,49,66,20,65,24,71,48,80,68,166,291,166,291,80,68,93,95,166,291,93,95,111,130,111,130,199,130,120,150,120,150,199,130,199,150,195,27,189,18,410,0,410,0,189,18,179,13,410,0,179,13,164,11,166,291,111,130,120,150,166,291,120,150,199,309,166,291,199,309,168,294,262,313,408,331,199,309,199,309,408,331,169,310,199,309,169,310,171,305,171,305,171,302,199,309,199,309,171,302,170,300,199,309,170,300,169,297,360,149,366,135,367,211,367,211,366,135,370,114,367,211,370,114,370,232,370,232,370,114,381,114,370,232,381,114,381,232,300,183,319,165,326,184,326,184,319,165,337,163,326,184,337,163,346,189,346,189,337,163,350,158,346,189,350,158,359,197,359,197,350,158,360,149,359,197,360,149,367,211,199,309,249,34,248,47,248,183,248,165,319,165,248,183,319,165,300,183,408,331,262,313,305,313,408,331,305,313,341,312,408,331,341,312,367,308,408,331,367,308,382,299,408,331,382,299,392,283,408,331,392,283,397,261,408,331,397,261,408,261,199,309,248,47,248,295,199,309,248,295,249,301,199,309,249,301,251,306,199,309,251,306,253,310,199,309,253,310,257,312,199,309,257,312,262,313,408,331,126,331,143,320,408,331,143,320,155,318,408,331,155,318,164,315,408,331,164,315,169,310,389,37,372,26,410,0,410,0,372,26,349,20,410,0,349,20,320,19,410,0,431,84,420,84,410,0,420,84,404,56,410,0,404,56,389,37,199,56,198,39,257,22,257,22,198,39,195,27,257,22,195,27,268,19,268,19,195,27,410,0,268,19,410,0,283,19,283,19,410,0,320,19,199,150,199,130,252,26,199,150,252,26,249,34,199,150,249,34,199,309,199,56,257,22,252,26,199,56,252,26,199,130,155,9,155,0,410,0,155,9,410,0,164,11,44,49,65,24,66,33,44,49,66,33,71,48,44,49,71,48,166,291,99,0,36,33,28,23,99,0,28,23,21,16,99,0,21,16,11,12,99,0,11,12,0,9,99,0,0,9,0,0,87,11,99,0,99,9,168,294,199,309,169,297,143,320,126,331,126,321,
-307,65,285,47,264,32,242,23,220,17,196,15,175,17,155,21,137,29,120,40,105,54,93,72,84,94,77,118,73,145,72,173,77,222,93,262,118,292,151,311,191,318,221,313,249,300,272,280,289,255,299,225,310,225,305,338,295,338,293,332,285,324,280,322,275,321,271,322,268,322,263,323,259,325,254,326,240,330,225,334,210,336,196,338,181,338,160,337,140,333,120,327,101,319,84,308,59,287,40,262,25,233,17,200,14,165,16,135,21,107,30,82,43,60,58,41,73,27,90,15,109,6,129,0,151,-4,132,-49,136,-51,139,-50,141,-50,144,-49,150,-49,160,-50,168,-52,173,-55,175,-60,176,-67,175,-74,172,-81,166,-85,158,-88,149,-89,143,-89,131,-87,124,-86,117,-83,109,-98,118,-102,134,-106,142,-106,151,-107,173,-105,190,-99,203,-91,211,-79,214,-64,212,-52,206,-43,198,-36,186,-32,171,-30,163,-30,161,-31,158,-31,168,-6,180,-6,213,-4,244,3,272,16,297,34,316,56,201,378,128,453,124,457,119,460,115,462,107,464,101,463,96,461,92,458,90,454,89,448,89,443,91,439,94,434,104,426,181,378,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,123,378,142,378,219,427,225,431,229,435,232,439,234,443,234,454,231,458,228,461,223,463,217,464,209,462,205,460,201,457,196,453,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,
+307,65,285,47,264,32,242,23,220,17,196,15,175,17,155,21,137,29,120,40,105,54,93,72,84,94,77,118,73,145,72,173,77,222,93,262,118,292,151,311,191,318,221,313,249,300,272,280,289,255,299,225,310,225,305,338,295,338,293,332,285,324,280,322,275,321,271,322,268,322,263,323,259,325,254,326,240,330,225,334,210,336,196,338,181,338,160,337,140,333,120,327,101,319,84,308,59,287,40,262,25,233,17,200,14,165,16,135,21,107,30,82,43,60,58,41,73,27,90,15,109,6,129,0,151,-4,132,-49,136,-51,139,-50,141,-50,144,-49,150,-49,160,-50,168,-52,173,-55,175,-60,176,-67,175,-74,172,-81,166,-85,158,-88,149,-89,143,-89,131,-87,124,-86,117,-83,109,-98,118,-102,134,-106,142,-106,151,-107,173,-105,190,-99,203,-91,211,-79,214,-64,212,-52,206,-43,198,-36,186,-32,171,-30,163,-30,161,-31,158,-31,168,-6,180,-6,213,-4,244,3,272,16,297,34,316,56,
 84,94,77,118,90,15,90,15,77,118,73,145,90,15,73,145,73,27,73,27,73,145,72,173,59,287,72,173,84,308,158,-31,175,17,155,21,158,-31,155,21,151,-4,151,-4,155,21,137,29,151,-4,137,29,129,0,129,0,137,29,120,40,129,0,120,40,109,6,109,6,120,40,105,54,142,-106,151,-107,143,-89,143,-89,151,-107,149,-89,158,-88,149,-89,151,-107,158,-88,151,-107,173,-105,141,-50,144,-49,151,-4,151,-4,144,-49,147,-49,151,-4,147,-49,150,-49,150,-49,160,-50,151,-4,151,-4,132,-49,136,-51,151,-4,136,-51,139,-50,151,-4,139,-50,141,-50,196,15,178,-6,180,-6,196,15,180,-6,213,-4,196,15,175,17,175,-6,196,15,175,-6,178,-6,175,17,158,-31,168,-6,175,17,168,-6,171,-6,175,17,171,-6,173,-6,175,17,173,-6,175,-6,316,56,307,65,297,34,297,34,307,65,285,47,297,34,285,47,272,16,272,16,285,47,264,32,272,16,264,32,244,3,244,3,264,32,242,23,244,3,242,23,220,17,220,17,196,15,213,-4,220,17,213,-4,244,3,191,318,181,338,160,337,191,318,160,337,151,311,191,318,196,338,181,338,72,173,77,222,84,308,84,308,77,222,93,262,84,308,93,262,101,319,101,319,93,262,118,292,101,319,118,292,120,327,120,327,118,292,151,311,120,327,151,311,140,333,140,333,151,311,160,337,210,336,221,313,225,334,225,334,221,313,249,300,225,334,249,300,240,330,240,330,249,300,254,326,221,313,210,336,196,338,221,313,196,338,191,318,289,328,285,324,289,255,289,255,285,324,280,322,289,255,280,322,275,321,275,321,271,322,272,280,272,280,271,322,268,322,272,280,268,322,263,323,272,280,263,323,259,325,272,280,259,325,254,326,272,280,254,326,249,300,299,225,310,225,305,338,299,225,305,338,295,338,299,225,295,338,293,332,299,225,293,332,289,255,275,321,272,280,289,255,214,-64,212,-52,211,-79,211,-79,212,-52,206,-43,211,-79,206,-43,203,-91,203,-91,206,-43,198,-36,203,-91,198,-36,190,-99,190,-99,198,-36,186,-32,190,-99,186,-32,176,-67,176,-67,186,-32,175,-60,173,-55,175,-60,186,-32,173,-55,186,-32,171,-30,173,-55,171,-30,168,-30,173,-55,168,-30,168,-52,168,-52,168,-30,166,-30,168,-52,166,-30,163,-30,168,-52,163,-30,161,-31,168,-52,161,-31,160,-50,158,-31,151,-4,160,-50,158,-31,160,-50,161,-31,190,-99,176,-67,175,-74,190,-99,175,-74,173,-105,173,-105,175,-74,172,-81,173,-105,172,-81,166,-85,117,-83,118,-102,124,-86,124,-86,118,-102,126,-104,124,-86,126,-104,131,-87,131,-87,126,-104,134,-106,131,-87,134,-106,137,-88,137,-88,134,-106,142,-106,137,-88,142,-106,143,-89,93,72,84,94,90,15,93,72,90,15,109,6,93,72,109,6,105,54,59,287,40,262,43,60,59,287,43,60,58,41,59,287,58,41,73,27,59,287,73,27,72,173,14,165,16,135,17,200,17,200,16,135,21,107,17,200,21,107,25,233,25,233,21,107,30,82,25,233,30,82,40,262,40,262,30,82,43,60,118,-102,117,-83,109,-98,158,-88,173,-105,166,-85,289,328,289,255,293,332,
-201,378,128,453,124,457,119,460,115,462,107,464,101,463,96,461,92,458,90,454,89,448,89,443,91,439,94,434,104,426,181,378,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,123,378,142,378,219,427,225,431,229,435,232,439,234,443,234,454,231,458,228,461,223,463,217,464,209,462,205,460,201,457,196,453,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,
+201,378,128,453,124,457,119,460,115,462,107,464,101,463,96,461,92,458,90,454,89,448,89,443,91,439,94,434,104,426,181,378,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,
 181,378,201,378,128,453,181,378,128,453,124,457,181,378,124,457,119,460,181,378,119,460,115,462,181,378,115,462,111,463,181,378,111,463,107,464,181,378,107,464,104,426,89,448,89,443,90,454,90,454,89,443,91,439,90,454,91,439,92,458,92,458,91,439,94,434,92,458,94,434,96,461,96,461,94,434,99,430,96,461,99,430,101,463,101,463,99,430,104,426,101,463,104,426,107,464,45,24,38,16,276,0,276,0,38,16,25,12,276,0,25,12,6,9,49,294,50,275,106,310,49,294,106,310,45,307,45,307,106,310,111,312,45,307,111,312,271,331,271,331,111,312,118,312,45,24,117,21,49,37,49,37,117,21,108,25,49,37,108,25,50,57,50,57,108,25,102,31,50,57,102,31,50,275,50,275,102,31,100,42,50,275,100,42,100,294,100,184,100,164,176,164,100,184,176,164,176,184,198,185,176,184,198,162,198,185,198,162,213,190,213,190,198,162,213,158,213,190,213,158,222,198,222,198,213,158,222,150,222,198,222,150,229,212,229,212,222,150,229,136,229,212,229,136,233,232,233,232,229,136,233,115,233,232,233,115,244,115,271,331,118,312,184,312,271,331,184,312,213,311,271,331,213,311,234,306,271,331,234,306,247,297,271,331,247,297,255,282,271,331,255,282,261,259,271,331,261,259,273,259,50,275,100,294,101,302,50,275,101,302,103,307,50,275,103,307,106,310,271,331,6,331,25,320,271,331,25,320,38,315,271,331,38,315,45,307,255,38,234,26,276,0,276,0,234,26,206,20,276,0,206,20,169,18,276,0,299,84,285,84,276,0,285,84,271,57,276,0,271,57,255,38,276,0,169,18,151,18,276,0,151,18,132,19,276,0,132,19,117,21,276,0,117,21,45,24,276,0,6,9,6,0,25,320,6,331,6,321,176,184,176,164,198,162,233,232,244,115,244,232,
-123,378,142,378,219,427,225,431,229,435,232,439,234,443,234,454,231,458,228,461,223,463,217,464,209,462,205,460,201,457,196,453,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,242,378,179,462,148,462,86,378,103,378,164,430,224,378,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,238,411,236,419,233,426,227,431,220,435,213,436,205,435,198,431,193,426,
+123,378,142,378,219,427,225,431,229,435,232,439,234,443,234,454,231,458,228,461,223,463,217,464,209,462,205,460,201,457,196,453,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,
 217,464,219,427,223,463,223,463,219,427,225,431,223,463,225,431,228,461,228,461,225,431,229,435,228,461,229,435,231,458,231,458,229,435,232,439,231,458,232,439,234,454,234,454,232,439,234,443,234,454,234,443,234,448,219,427,217,464,213,463,219,427,213,463,209,462,219,427,209,462,205,460,219,427,205,460,201,457,219,427,201,457,196,453,219,427,196,453,142,378,45,24,38,16,276,0,276,0,38,16,25,12,276,0,25,12,6,9,49,294,50,275,106,310,49,294,106,310,45,307,45,307,106,310,111,312,45,307,111,312,271,331,271,331,111,312,118,312,45,24,117,21,49,37,49,37,117,21,108,25,49,37,108,25,50,57,50,57,108,25,102,31,50,57,102,31,50,275,50,275,102,31,100,42,50,275,100,42,100,294,100,184,100,164,176,164,100,184,176,164,176,184,198,185,176,184,198,162,198,185,198,162,213,190,213,190,198,162,213,158,213,190,213,158,222,198,222,198,213,158,222,150,222,198,222,150,229,212,229,212,222,150,229,136,229,212,229,136,233,232,233,232,229,136,233,115,233,232,233,115,244,115,271,331,118,312,184,312,271,331,184,312,213,311,271,331,213,311,234,306,271,331,234,306,247,297,271,331,247,297,255,282,271,331,255,282,261,259,271,331,261,259,273,259,50,275,100,294,101,302,50,275,101,302,103,307,50,275,103,307,106,310,271,331,6,331,25,320,271,331,25,320,38,315,271,331,38,315,45,307,255,38,234,26,276,0,276,0,234,26,206,20,276,0,206,20,169,18,276,0,299,84,285,84,276,0,285,84,271,57,276,0,271,57,255,38,276,0,169,18,151,18,276,0,151,18,132,19,276,0,132,19,117,21,276,0,117,21,45,24,276,0,6,9,6,0,25,320,6,331,6,321,176,184,176,164,198,162,233,232,244,115,244,232,142,378,196,453,123,378,
-242,378,179,462,148,462,86,378,103,378,164,430,224,378,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,238,411,236,419,233,426,227,431,220,435,213,436,205,435,198,431,193,426,189,419,188,411,189,403,193,397,198,391,204,388,212,387,220,388,227,391,233,397,236,403,238,411,16383,16383,138,411,137,419,133,426,128,431,121,435,113,436,105,435,98,431,93,426,90,419,89,411,90,403,93,397,98,391,105,388,113,387,121,388,128,391,133,397,137,403,138,411,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,
+242,378,179,462,148,462,86,378,103,378,164,430,224,378,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,
 86,378,103,378,148,462,148,462,103,378,164,430,148,462,164,430,179,462,179,462,164,430,224,378,179,462,224,378,242,378,45,24,38,16,276,0,276,0,38,16,25,12,276,0,25,12,6,9,49,294,50,275,106,310,49,294,106,310,45,307,45,307,106,310,111,312,45,307,111,312,271,331,271,331,111,312,118,312,45,24,117,21,49,37,49,37,117,21,108,25,49,37,108,25,50,57,50,57,108,25,102,31,50,57,102,31,50,275,50,275,102,31,100,42,50,275,100,42,100,294,100,184,100,164,176,164,100,184,176,164,176,184,198,185,176,184,198,162,198,185,198,162,213,190,213,190,198,162,213,158,213,190,213,158,222,198,222,198,213,158,222,150,222,198,222,150,229,212,229,212,222,150,229,136,229,212,229,136,233,232,233,232,229,136,233,115,233,232,233,115,244,115,271,331,118,312,184,312,271,331,184,312,213,311,271,331,213,311,234,306,271,331,234,306,247,297,271,331,247,297,255,282,271,331,255,282,261,259,271,331,261,259,273,259,50,275,100,294,101,302,50,275,101,302,103,307,50,275,103,307,106,310,271,331,6,331,25,320,271,331,25,320,38,315,271,331,38,315,45,307,255,38,234,26,276,0,276,0,234,26,206,20,276,0,206,20,169,18,276,0,299,84,285,84,276,0,285,84,271,57,276,0,271,57,255,38,276,0,169,18,151,18,276,0,151,18,132,19,276,0,132,19,117,21,276,0,117,21,45,24,276,0,6,9,6,0,25,320,6,331,6,321,176,184,176,164,198,162,233,232,244,115,244,232,
-238,411,236,419,233,426,227,431,220,435,213,436,205,435,198,431,193,426,189,419,188,411,189,403,193,397,198,391,204,388,212,387,220,388,227,391,233,397,236,403,238,411,16383,16383,138,411,137,419,133,426,128,431,121,435,113,436,105,435,98,431,93,426,90,419,89,411,90,403,93,397,98,391,105,388,113,387,121,388,128,391,133,397,137,403,138,411,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,134,378,62,453,57,457,53,460,49,462,41,464,35,463,29,461,26,458,23,454,22,448,23,443,25,439,28,434,32,430,37,426,114,378,16383,16383,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,32,378,52,378,129,427,139,435,142,439,143,443,144,448,143,454,141,458,137,461,133,463,127,464,122,463,118,462,115,460,110,457,105,453,16383,16383,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,161,378,98,462,67,462,5,378,22,378,83,430,143,378,16383,16383,153,0,153,9,133,11,
+238,411,236,419,233,426,227,431,220,435,213,436,205,435,198,431,193,426,189,419,188,411,189,403,193,397,198,391,204,388,212,387,220,388,227,391,233,397,236,403,238,411,16383,16383,138,411,137,419,133,426,128,431,121,435,113,436,105,435,98,431,93,426,90,419,89,411,90,403,93,397,98,391,105,388,113,387,121,388,128,391,133,397,137,403,138,411,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,
 113,436,113,387,121,435,121,435,113,387,121,388,121,435,121,388,128,431,128,431,121,388,128,391,128,431,128,391,133,426,133,426,128,391,133,397,133,426,133,397,137,419,137,419,133,397,137,403,137,419,137,403,138,411,89,411,90,403,90,419,90,419,90,403,93,397,90,419,93,397,93,426,93,426,93,397,98,391,93,426,98,391,98,431,98,431,98,391,105,388,98,431,105,388,105,435,105,435,105,388,113,387,105,435,113,387,113,436,45,24,38,16,276,0,276,0,38,16,25,12,276,0,25,12,6,9,49,294,50,275,106,310,49,294,106,310,45,307,45,307,106,310,111,312,45,307,111,312,271,331,271,331,111,312,118,312,188,411,189,403,189,419,189,419,189,403,193,397,189,419,193,397,193,426,193,426,193,397,198,391,193,426,198,391,198,431,198,431,198,391,204,388,198,431,204,388,205,435,205,435,204,388,212,387,205,435,212,387,213,436,213,436,212,387,220,388,213,436,220,388,220,435,220,435,220,388,227,391,220,435,227,391,227,431,227,431,227,391,233,397,227,431,233,397,233,426,233,426,233,397,236,403,233,426,236,403,236,419,236,419,236,403,238,411,45,24,117,21,49,37,49,37,117,21,108,25,49,37,108,25,50,57,50,57,108,25,102,31,50,57,102,31,50,275,50,275,102,31,100,42,50,275,100,42,100,294,100,184,100,164,176,164,100,184,176,164,176,184,198,185,176,184,198,162,198,185,198,162,213,190,213,190,198,162,213,158,213,190,213,158,222,198,222,198,213,158,222,150,222,198,222,150,229,212,229,212,222,150,229,136,229,212,229,136,233,232,233,232,229,136,233,115,233,232,233,115,244,115,271,331,118,312,184,312,271,331,184,312,213,311,271,331,213,311,234,306,271,331,234,306,247,297,271,331,247,297,255,282,271,331,255,282,261,259,271,331,261,259,273,259,50,275,100,294,101,302,50,275,101,302,103,307,50,275,103,307,106,310,271,331,6,331,25,320,271,331,25,320,38,315,271,331,38,315,45,307,255,38,234,26,276,0,276,0,234,26,206,20,276,0,206,20,169,18,276,0,299,84,285,84,276,0,285,84,271,57,276,0,271,57,255,38,276,0,169,18,151,18,276,0,151,18,132,19,276,0,132,19,117,21,276,0,117,21,45,24,276,0,6,9,6,0,25,320,6,331,6,321,176,184,176,164,198,162,233,232,244,115,244,232,
-134,378,62,453,57,457,53,460,49,462,41,464,35,463,29,461,26,458,23,454,22,448,23,443,25,439,28,434,32,430,37,426,114,378,16383,16383,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,32,378,52,378,129,427,139,435,142,439,143,443,144,448,143,454,141,458,137,461,133,463,127,464,122,463,118,462,115,460,110,457,105,453,16383,16383,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,
+134,378,62,453,57,457,53,460,49,462,41,464,35,463,29,461,26,458,23,454,22,448,23,443,25,439,28,434,32,430,37,426,114,378,16383,16383,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,
 114,378,134,378,62,453,114,378,62,453,57,457,114,378,57,457,53,460,114,378,53,460,49,462,114,378,49,462,45,463,114,378,45,463,41,464,114,378,41,464,37,426,22,448,23,443,23,454,23,454,23,443,25,439,23,454,25,439,26,458,26,458,25,439,28,434,26,458,28,434,29,461,29,461,28,434,32,430,29,461,32,430,35,463,35,463,32,430,37,426,35,463,37,426,41,464,52,23,44,15,157,0,157,0,44,15,30,11,157,0,30,11,9,9,157,331,9,331,30,320,157,331,30,320,44,316,157,331,44,316,53,308,157,331,53,308,57,295,157,331,57,295,122,316,157,331,122,316,136,320,157,331,136,320,157,321,122,16,114,24,57,56,57,56,114,24,109,37,57,56,109,37,57,276,57,276,109,37,108,56,57,276,108,56,108,276,57,276,108,276,109,295,57,276,109,295,113,308,57,276,113,308,122,316,57,276,122,316,57,295,157,0,157,9,137,11,157,0,137,11,122,16,157,0,122,16,56,36,157,0,56,36,52,23,157,0,9,9,9,0,56,36,122,16,57,56,30,320,9,331,9,321,
-32,378,52,378,129,427,139,435,142,439,143,443,144,448,143,454,141,458,137,461,133,463,127,464,122,463,118,462,115,460,110,457,105,453,16383,16383,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,161,378,98,462,67,462,5,378,22,378,83,430,143,378,16383,16383,153,0,153,9,133,11,119,16,110,24,106,37,104,56,104,276,105,295,110,308,118,316,132,320,153,321,153,331,5,331,5,321,26,320,40,316,49,308,53,295,54,276,54,56,53,36,49,23,40,15,26,11,5,9,5,0,157,411,156,419,153,426,147,431,140,435,132,436,125,435,118,431,113,426,
+32,378,52,378,129,427,139,435,142,439,143,443,144,448,143,454,141,458,137,461,133,463,127,464,122,463,118,462,115,460,110,457,105,453,16383,16383,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,
 127,464,129,427,133,463,133,463,129,427,134,431,133,463,134,431,137,461,137,461,134,431,139,435,137,461,139,435,141,458,141,458,139,435,142,439,141,458,142,439,143,454,143,454,142,439,143,443,143,454,143,443,144,448,129,427,127,464,122,463,129,427,122,463,118,462,129,427,118,462,115,460,129,427,115,460,110,457,129,427,110,457,105,453,129,427,105,453,52,378,52,23,44,15,157,0,157,0,44,15,30,11,157,0,30,11,9,9,157,331,9,331,30,320,157,331,30,320,44,316,157,331,44,316,53,308,157,331,53,308,57,295,157,331,57,295,122,316,157,331,122,316,136,320,157,331,136,320,157,321,122,16,114,24,57,56,57,56,114,24,109,37,57,56,109,37,57,276,57,276,109,37,108,56,57,276,108,56,108,276,57,276,108,276,109,295,57,276,109,295,113,308,57,276,113,308,122,316,57,276,122,316,57,295,157,0,157,9,137,11,157,0,137,11,122,16,157,0,122,16,56,36,157,0,56,36,52,23,157,0,9,9,9,0,56,36,122,16,57,56,30,320,9,331,9,321,52,378,105,453,32,378,
-161,378,98,462,67,462,5,378,22,378,83,430,143,378,16383,16383,153,0,153,9,133,11,119,16,110,24,106,37,104,56,104,276,105,295,110,308,118,316,132,320,153,321,153,331,5,331,5,321,26,320,40,316,49,308,53,295,54,276,54,56,53,36,49,23,40,15,26,11,5,9,5,0,157,411,156,419,153,426,147,431,140,435,132,436,125,435,118,431,113,426,109,419,108,411,109,403,113,397,118,391,124,388,132,387,140,388,147,391,153,397,156,403,157,411,16383,16383,58,411,57,419,53,426,48,431,41,435,33,436,25,435,18,431,13,426,10,419,8,411,10,403,13,397,18,391,
+161,378,98,462,67,462,5,378,22,378,83,430,143,378,16383,16383,153,0,153,9,133,11,119,16,110,24,106,37,104,56,104,276,105,295,110,308,118,316,132,320,153,321,153,331,5,331,5,321,26,320,40,316,49,308,53,295,54,276,54,56,53,36,49,23,40,15,26,11,5,9,5,0,
 5,378,22,378,67,462,67,462,22,378,83,430,67,462,83,430,98,462,98,462,83,430,143,378,98,462,143,378,161,378,49,23,40,15,153,0,153,0,40,15,26,11,153,0,26,11,5,9,153,331,5,331,26,320,153,331,26,320,40,316,153,331,40,316,49,308,153,331,49,308,53,295,153,331,53,295,118,316,153,331,118,316,132,320,153,331,132,320,153,321,119,16,110,24,54,56,54,56,110,24,106,37,54,56,106,37,54,276,54,276,106,37,104,56,54,276,104,56,104,276,54,276,104,276,105,295,54,276,105,295,110,308,54,276,110,308,118,316,54,276,118,316,53,295,153,0,153,9,133,11,153,0,133,11,119,16,153,0,119,16,53,36,153,0,53,36,49,23,153,0,5,9,5,0,53,36,119,16,54,56,26,320,5,331,5,321,
-157,411,156,419,153,426,147,431,140,435,132,436,125,435,118,431,113,426,109,419,108,411,109,403,113,397,118,391,124,388,132,387,140,388,147,391,153,397,156,403,157,411,16383,16383,58,411,57,419,53,426,48,431,41,435,33,436,25,435,18,431,13,426,10,419,8,411,10,403,13,397,18,391,25,388,32,387,40,388,47,391,53,397,57,403,58,411,16383,16383,157,0,157,9,136,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,8,331,8,321,30,320,44,316,52,308,56,295,57,276,57,56,56,36,52,23,44,15,29,11,8,9,8,0,8,331,8,321,28,319,40,315,48,307,51,295,52,276,52,180,11,180,11,157,52,157,52,55,51,36,47,24,40,16,27,12,8,9,8,0,150,0,183,2,213,7,242,16,267,27,287,41,307,60,322,83,333,109,340,137,343,167,334,224,308,269,267,303,212,324,143,331,16383,16383,103,157,176,157,176,180,103,180,103,293,104,301,106,307,111,310,117,312,127,313,152,312,175,309,194,304,212,297,227,289,249,271,266,249,278,224,285,195,288,164,285,130,278,101,266,76,249,55,227,39,211,31,194,26,175,22,153,19,128,18,118,19,111,21,106,25,104,31,103,39,244,444,240,434,
+157,411,156,419,153,426,147,431,140,435,132,436,125,435,118,431,113,426,109,419,108,411,109,403,113,397,118,391,124,388,132,387,140,388,147,391,153,397,156,403,157,411,16383,16383,58,411,57,419,53,426,48,431,41,435,33,436,25,435,18,431,13,426,10,419,8,411,10,403,13,397,18,391,25,388,32,387,40,388,47,391,53,397,57,403,58,411,16383,16383,157,0,157,9,136,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,8,331,8,321,30,320,44,316,52,308,56,295,57,276,57,56,56,36,52,23,44,15,29,11,8,9,8,0,
 8,411,10,403,10,419,10,419,10,403,13,397,10,419,13,397,13,426,13,426,13,397,18,391,13,426,18,391,18,431,18,431,18,391,25,388,18,431,25,388,25,435,25,435,25,388,32,387,25,435,32,387,33,436,33,436,32,387,40,388,33,436,40,388,41,435,41,435,40,388,47,391,41,435,47,391,48,431,48,431,47,391,53,397,48,431,53,397,53,426,53,426,53,397,57,403,53,426,57,403,57,419,57,419,57,403,58,411,52,23,44,15,157,0,157,0,44,15,29,11,157,0,29,11,8,9,157,331,8,331,30,320,157,331,30,320,44,316,157,331,44,316,52,308,157,331,52,308,56,295,157,331,56,295,122,316,157,331,122,316,136,320,157,331,136,320,157,321,122,16,114,24,57,56,57,56,114,24,109,37,57,56,109,37,57,276,57,276,109,37,108,56,57,276,108,56,108,276,57,276,108,276,109,295,57,276,109,295,113,308,57,276,113,308,122,316,57,276,122,316,56,295,132,436,132,387,140,435,140,435,132,387,140,388,140,435,140,388,147,431,147,431,140,388,147,391,147,431,147,391,153,426,153,426,147,391,153,397,153,426,153,397,156,419,156,419,153,397,156,403,156,419,156,403,157,411,108,411,109,403,109,419,109,419,109,403,113,397,109,419,113,397,113,426,113,426,113,397,118,391,113,426,118,391,118,431,118,431,118,391,124,388,118,431,124,388,125,435,125,435,124,388,132,387,125,435,132,387,132,436,157,0,157,9,136,11,157,0,136,11,122,16,157,0,122,16,56,36,157,0,56,36,52,23,157,0,8,9,8,0,56,36,122,16,57,56,30,320,8,331,8,321,
-8,331,8,321,28,319,40,315,48,307,51,295,52,276,52,180,11,180,11,157,52,157,52,55,51,36,47,24,40,16,27,12,8,9,8,0,150,0,183,2,213,7,242,16,267,27,287,41,307,60,322,83,333,109,340,137,343,167,334,224,308,269,267,303,212,324,143,331,16383,16383,103,157,176,157,176,180,103,180,103,293,104,301,106,307,111,310,117,312,127,313,152,312,175,309,194,304,212,297,227,289,249,271,266,249,278,224,285,195,288,164,285,130,278,101,266,76,249,55,227,39,211,31,194,26,175,22,153,19,128,18,118,19,111,21,106,25,104,31,103,39,244,444,240,434,235,427,230,422,224,420,218,419,213,419,208,420,203,422,191,426,180,432,172,436,158,440,151,441,145,441,130,439,118,433,108,423,100,409,94,391,108,391,112,399,116,406,122,410,128,413,134,414,138,414,146,412,150,410,155,408,177,398,185,394,193,392,200,391,206,391,221,393,234,399,244,409,252,424,259,444,16383,16383,353,331,235,331,235,321,247,320,256,319,263,317,275,309,278,303,281,295,283,285,284,274,284,89,91,331,6,331,6,321,19,321,29,318,37,313,46,306,55,295,55,75,54,48,49,30,41,19,27,13,6,9,6,0,123,0,123,9,
+8,331,8,321,28,319,40,315,48,307,51,295,52,276,52,180,11,180,11,157,52,157,52,55,51,36,47,24,40,16,27,12,8,9,8,0,150,0,183,2,213,7,242,16,267,27,287,41,307,60,322,83,333,109,340,137,343,167,334,224,308,269,267,303,212,324,143,331,16383,16383,103,157,176,157,176,180,103,180,103,293,104,301,106,307,111,310,117,312,127,313,152,312,175,309,194,304,212,297,227,289,249,271,266,249,278,224,285,195,288,164,285,130,278,101,266,76,249,55,227,39,211,31,194,26,175,22,153,19,128,18,118,19,111,21,106,25,104,31,103,39,
 47,24,40,16,150,0,150,0,40,16,27,12,150,0,27,12,8,9,40,315,48,307,143,331,143,331,48,307,51,295,143,331,51,295,52,276,104,31,52,276,52,180,104,31,52,180,52,157,52,157,52,180,11,180,52,157,11,180,11,157,104,301,106,307,52,276,52,276,106,307,111,310,52,276,111,310,143,331,143,331,111,310,117,312,143,331,117,312,127,313,127,313,117,312,127,312,127,313,127,312,152,312,127,313,152,312,143,331,143,331,152,312,212,324,175,22,183,2,194,26,194,26,183,2,213,7,194,26,213,7,211,31,211,31,213,7,227,39,249,55,227,39,242,16,249,55,242,16,267,27,128,18,150,0,153,19,153,19,150,0,183,2,153,19,183,2,175,22,175,309,194,304,212,324,212,324,194,304,212,297,212,324,212,297,227,289,227,289,249,271,267,303,267,303,249,271,266,249,267,303,266,249,278,224,334,224,308,269,322,83,334,224,322,83,333,109,334,224,333,109,340,137,334,224,340,137,343,167,322,83,308,269,307,60,307,60,308,269,288,164,287,41,288,164,285,130,287,41,285,130,278,101,267,303,278,224,308,269,308,269,278,224,285,195,308,269,285,195,288,164,267,303,212,324,227,289,267,27,287,41,278,101,267,27,278,101,266,76,267,27,266,76,249,55,227,39,213,7,242,16,52,276,104,31,103,39,103,180,103,157,176,157,103,180,176,157,176,180,103,293,104,301,52,276,103,293,52,276,103,39,143,331,8,331,28,319,143,331,28,319,40,315,52,55,51,36,111,21,111,21,51,36,150,0,111,21,150,0,118,19,118,19,150,0,128,18,52,55,111,21,106,25,52,55,106,25,104,31,52,55,104,31,52,157,150,0,8,9,8,0,47,24,150,0,51,36,28,319,8,331,8,321,288,164,287,41,307,60,212,324,152,312,175,309,
-244,444,240,434,235,427,230,422,224,420,218,419,213,419,208,420,203,422,191,426,180,432,172,436,158,440,151,441,145,441,130,439,118,433,108,423,100,409,94,391,108,391,112,399,116,406,122,410,128,413,134,414,138,414,146,412,150,410,155,408,177,398,185,394,193,392,200,391,206,391,221,393,234,399,244,409,252,424,259,444,16383,16383,353,331,235,331,235,321,247,320,256,319,263,317,275,309,278,303,281,295,283,285,284,274,284,89,91,331,6,331,6,321,19,321,29,318,37,313,46,306,55,295,55,75,54,48,49,30,41,19,27,13,6,9,6,0,123,0,123,9,103,13,90,20,82,31,78,49,76,75,76,269,297,-5,306,-5,306,274,308,289,311,299,315,307,320,313,324,315,329,318,335,319,343,320,353,321,225,378,152,453,148,457,143,460,139,462,131,464,125,463,120,461,116,458,114,454,113,448,113,443,115,439,118,434,128,426,205,378,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,129,378,150,378,227,427,232,431,236,435,239,439,241,443,242,448,
+244,444,240,434,235,427,230,422,224,420,218,419,213,419,208,420,203,422,191,426,180,432,172,436,158,440,151,441,145,441,130,439,118,433,108,423,100,409,94,391,108,391,112,399,116,406,122,410,128,413,134,414,138,414,146,412,150,410,155,408,177,398,185,394,193,392,200,391,206,391,221,393,234,399,244,409,252,424,259,444,16383,16383,353,331,235,331,235,321,247,320,256,319,263,317,275,309,278,303,281,295,283,285,284,274,284,89,91,331,6,331,6,321,19,321,29,318,37,313,46,306,55,295,55,75,54,48,49,30,41,19,27,13,6,9,6,0,123,0,123,9,103,13,90,20,82,31,78,49,76,75,76,269,297,-5,306,-5,306,274,308,289,311,299,315,307,320,313,324,315,329,318,335,319,343,320,353,321,
 112,399,116,406,118,433,118,433,116,406,122,410,118,433,122,410,130,439,130,439,122,410,128,413,130,439,128,413,134,414,134,414,138,414,145,441,145,441,138,414,142,413,145,441,142,413,146,412,108,391,112,399,118,433,108,391,118,433,108,423,108,391,108,423,100,409,108,391,100,409,94,391,145,441,146,412,151,441,151,441,146,412,150,410,151,441,150,410,155,408,155,408,166,403,158,440,158,440,166,403,165,438,145,441,130,439,134,414,158,440,151,441,155,408,165,438,166,403,172,436,172,436,166,403,177,398,172,436,177,398,180,432,180,432,177,398,185,394,180,432,185,394,191,426,191,426,185,394,193,392,191,426,193,392,197,424,197,424,193,392,200,391,197,424,200,391,203,422,203,422,200,391,206,391,203,422,206,391,208,420,208,420,206,391,221,393,208,420,221,393,213,419,213,419,221,393,218,419,224,420,218,419,221,393,224,420,221,393,234,399,244,444,240,434,244,409,244,444,244,409,252,424,244,444,252,424,259,444,235,427,230,422,234,399,235,427,234,399,244,409,235,427,244,409,240,434,49,30,41,19,123,0,123,0,41,19,27,13,123,0,27,13,6,9,256,319,263,317,353,331,353,331,263,317,269,313,353,331,269,313,275,309,275,309,278,303,353,331,353,331,278,303,281,295,353,331,281,295,324,315,324,315,281,295,320,313,324,315,320,313,320,312,320,312,320,313,315,307,315,307,320,313,284,274,315,307,284,274,284,259,297,-5,284,259,284,89,297,-5,284,89,91,331,353,331,324,315,329,318,353,331,329,318,335,319,353,331,335,319,343,320,353,331,343,320,353,321,306,-5,306,253,297,-5,297,-5,306,253,306,274,297,-5,306,274,284,259,284,259,306,274,308,289,284,259,308,289,311,299,283,285,284,274,320,313,283,285,320,313,281,295,247,320,256,319,353,331,247,320,353,331,235,331,247,320,235,331,235,321,91,331,6,331,19,321,91,331,19,321,29,318,91,331,29,318,37,313,91,331,37,313,46,306,91,331,46,306,55,295,91,331,55,295,76,269,91,331,76,269,297,-5,55,295,78,49,76,75,54,48,49,30,90,20,90,20,49,30,123,0,90,20,123,0,103,13,103,13,123,0,123,9,55,75,54,48,82,31,55,75,82,31,78,49,55,75,78,49,55,295,123,0,6,9,6,0,54,48,90,20,82,31,19,321,6,331,6,321,76,269,55,295,76,75,315,307,284,259,311,299,224,420,234,399,230,422,
-225,378,152,453,148,457,143,460,139,462,131,464,125,463,120,461,116,458,114,454,113,448,113,443,115,439,118,434,128,426,205,378,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,129,378,150,378,227,427,232,431,236,435,239,439,241,443,242,448,241,454,239,458,235,461,230,463,224,464,216,462,212,460,208,457,203,453,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,
+225,378,152,453,148,457,143,460,139,462,131,464,125,463,120,461,116,458,114,454,113,448,113,443,115,439,118,434,128,426,205,378,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,
 205,378,225,378,152,453,205,378,152,453,148,457,205,378,148,457,143,460,205,378,143,460,139,462,205,378,139,462,135,463,205,378,135,463,131,464,205,378,131,464,128,426,113,448,113,443,114,454,114,454,113,443,115,439,114,454,115,439,116,458,116,458,115,439,118,434,116,458,118,434,120,461,120,461,118,434,123,430,120,461,123,430,125,463,125,463,123,430,128,426,125,463,128,426,131,464,149,314,180,338,134,308,134,308,180,338,126,330,134,308,126,330,121,298,121,298,126,330,108,286,97,269,108,286,126,330,97,269,126,330,81,307,81,102,81,24,90,75,90,75,81,24,126,1,90,75,126,1,103,52,103,52,126,1,119,33,130,25,119,33,126,1,130,25,126,1,180,-6,207,316,235,330,194,319,194,319,235,330,180,320,164,318,180,320,180,338,164,318,180,338,149,314,81,307,46,271,46,61,81,307,46,61,74,166,81,307,74,166,76,194,81,307,76,194,80,222,81,307,80,222,87,247,81,307,87,247,97,269,81,102,76,132,81,24,81,24,76,132,74,166,24,109,46,61,46,271,24,109,46,271,24,224,24,109,24,224,17,167,223,19,209,15,234,1,234,1,209,15,196,12,234,1,196,12,181,11,181,11,167,12,180,-6,180,-6,167,12,154,15,180,-6,154,15,142,19,207,316,219,311,235,330,235,330,219,311,231,305,235,330,231,305,242,296,242,296,257,279,280,306,280,306,257,279,270,257,280,306,270,257,279,231,235,330,180,338,180,320,280,103,272,76,279,24,279,24,272,76,260,53,279,24,260,53,246,35,246,35,235,26,279,24,279,24,235,26,234,1,344,166,336,222,336,108,336,108,336,222,314,269,336,108,314,269,314,60,314,60,314,269,287,169,285,201,287,169,314,269,285,201,314,269,280,306,285,201,280,306,279,231,280,306,235,330,242,296,314,60,287,169,285,134,314,60,285,134,280,103,314,60,280,103,279,24,181,11,180,-6,234,1,81,24,74,166,46,61,223,19,234,1,235,26,130,25,180,-6,142,19,
-129,378,150,378,227,427,232,431,236,435,239,439,241,443,242,448,241,454,239,458,235,461,230,463,224,464,216,462,212,460,208,457,203,453,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,255,378,193,462,161,462,99,378,117,378,177,430,238,378,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,244,444,240,434,235,427,230,422,224,420,218,419,213,419,208,420,203,422,191,426,
+129,378,150,378,227,427,232,431,236,435,239,439,241,443,242,448,241,454,239,458,235,461,230,463,224,464,216,462,212,460,208,457,203,453,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,
 149,314,180,338,134,308,134,308,180,338,126,330,134,308,126,330,121,298,121,298,126,330,108,286,97,269,108,286,126,330,97,269,126,330,81,307,81,102,81,24,90,75,90,75,81,24,126,1,90,75,126,1,103,52,103,52,126,1,119,33,130,25,119,33,126,1,130,25,126,1,180,-6,207,316,235,330,194,319,194,319,235,330,180,320,164,318,180,320,180,338,164,318,180,338,149,314,81,307,46,271,46,61,81,307,46,61,74,166,81,307,74,166,76,194,81,307,76,194,80,222,81,307,80,222,87,247,81,307,87,247,97,269,81,102,76,132,81,24,81,24,76,132,74,166,24,109,46,61,46,271,24,109,46,271,24,224,24,109,24,224,17,167,223,19,209,15,234,1,234,1,209,15,196,12,234,1,196,12,181,11,181,11,167,12,180,-6,180,-6,167,12,154,15,180,-6,154,15,142,19,207,316,219,311,235,330,235,330,219,311,231,305,235,330,231,305,242,296,242,296,257,279,280,306,280,306,257,279,270,257,280,306,270,257,279,231,235,330,180,338,180,320,280,103,272,76,279,24,279,24,272,76,260,53,279,24,260,53,246,35,246,35,235,26,279,24,279,24,235,26,234,1,344,166,336,222,336,108,336,108,336,222,314,269,336,108,314,269,314,60,314,60,314,269,287,169,285,201,287,169,314,269,285,201,314,269,280,306,285,201,280,306,279,231,280,306,235,330,242,296,314,60,287,169,285,134,314,60,285,134,280,103,314,60,280,103,279,24,181,11,180,-6,234,1,224,464,227,427,230,463,230,463,227,427,232,431,230,463,232,431,235,461,235,461,232,431,236,435,235,461,236,435,239,458,239,458,236,435,239,439,239,458,239,439,241,454,241,454,239,439,241,443,241,454,241,443,242,448,227,427,224,464,220,463,227,427,220,463,216,462,227,427,216,462,212,460,227,427,212,460,208,457,227,427,208,457,203,453,227,427,203,453,150,378,81,24,74,166,46,61,150,378,203,453,129,378,223,19,234,1,235,26,130,25,180,-6,142,19,
-255,378,193,462,161,462,99,378,117,378,177,430,238,378,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,244,444,240,434,235,427,230,422,224,420,218,419,213,419,208,420,203,422,191,426,180,432,172,436,158,440,151,441,145,441,130,439,118,433,108,423,100,409,94,391,108,391,112,399,116,406,122,410,128,413,134,414,138,414,146,412,150,410,155,408,177,398,185,394,193,392,200,391,206,391,221,393,234,399,244,409,252,424,259,444,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,
+255,378,193,462,161,462,99,378,117,378,177,430,238,378,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,
 99,378,117,378,161,462,161,462,117,378,177,430,161,462,177,430,193,462,193,462,177,430,238,378,193,462,238,378,255,378,149,314,180,338,134,308,134,308,180,338,126,330,134,308,126,330,121,298,121,298,126,330,108,286,97,269,108,286,126,330,97,269,126,330,81,307,81,102,81,24,90,75,90,75,81,24,126,1,90,75,126,1,103,52,103,52,126,1,119,33,130,25,119,33,126,1,130,25,126,1,180,-6,207,316,235,330,194,319,194,319,235,330,180,320,164,318,180,320,180,338,164,318,180,338,149,314,81,307,46,271,46,61,81,307,46,61,74,166,81,307,74,166,76,194,81,307,76,194,80,222,81,307,80,222,87,247,81,307,87,247,97,269,81,102,76,132,81,24,81,24,76,132,74,166,24,109,46,61,46,271,24,109,46,271,24,224,24,109,24,224,17,167,223,19,209,15,234,1,234,1,209,15,196,12,234,1,196,12,181,11,181,11,167,12,180,-6,180,-6,167,12,154,15,180,-6,154,15,142,19,207,316,219,311,235,330,235,330,219,311,231,305,235,330,231,305,242,296,242,296,257,279,280,306,280,306,257,279,270,257,280,306,270,257,279,231,235,330,180,338,180,320,280,103,272,76,279,24,279,24,272,76,260,53,279,24,260,53,246,35,246,35,235,26,279,24,279,24,235,26,234,1,344,166,336,222,336,108,336,108,336,222,314,269,336,108,314,269,314,60,314,60,314,269,287,169,285,201,287,169,314,269,285,201,314,269,280,306,285,201,280,306,279,231,280,306,235,330,242,296,314,60,287,169,285,134,314,60,285,134,280,103,314,60,280,103,279,24,181,11,180,-6,234,1,81,24,74,166,46,61,223,19,234,1,235,26,130,25,180,-6,142,19,
-244,444,240,434,235,427,230,422,224,420,218,419,213,419,208,420,203,422,191,426,180,432,172,436,158,440,151,441,145,441,130,439,118,433,108,423,100,409,94,391,108,391,112,399,116,406,122,410,128,413,134,414,138,414,146,412,150,410,155,408,177,398,185,394,193,392,200,391,206,391,221,393,234,399,244,409,252,424,259,444,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,252,411,250,419,247,426,241,431,234,435,227,436,219,435,212,431,207,426,203,419,202,411,203,403,207,397,212,391,218,388,226,387,234,388,241,391,247,397,250,403,252,411,16383,16383,152,411,151,419,147,426,142,431,135,435,127,436,119,435,113,431,107,426,104,419,103,411,104,403,107,397,112,391,119,388,127,387,135,388,142,391,147,397,151,403,152,411,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,
+244,444,240,434,235,427,230,422,224,420,218,419,213,419,208,420,203,422,191,426,180,432,172,436,158,440,151,441,145,441,130,439,118,433,108,423,100,409,94,391,108,391,112,399,116,406,122,410,128,413,134,414,138,414,146,412,150,410,155,408,177,398,185,394,193,392,200,391,206,391,221,393,234,399,244,409,252,424,259,444,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,
 112,399,116,406,118,433,118,433,116,406,122,410,118,433,122,410,130,439,130,439,122,410,128,413,130,439,128,413,134,414,134,414,138,414,145,441,145,441,138,414,142,413,145,441,142,413,146,412,108,391,112,399,118,433,108,391,118,433,108,423,108,391,108,423,100,409,108,391,100,409,94,391,145,441,146,412,151,441,151,441,146,412,150,410,151,441,150,410,155,408,155,408,166,403,158,440,158,440,166,403,165,438,145,441,130,439,134,414,158,440,151,441,155,408,165,438,166,403,172,436,172,436,166,403,177,398,172,436,177,398,180,432,180,432,177,398,185,394,180,432,185,394,191,426,191,426,185,394,193,392,191,426,193,392,197,424,197,424,193,392,200,391,197,424,200,391,203,422,203,422,200,391,206,391,203,422,206,391,208,420,208,420,206,391,221,393,208,420,221,393,213,419,213,419,221,393,218,419,224,420,218,419,221,393,224,420,221,393,234,399,244,444,240,434,244,409,244,444,244,409,252,424,244,444,252,424,259,444,235,427,230,422,234,399,235,427,234,399,244,409,235,427,244,409,240,434,149,314,180,338,134,308,134,308,180,338,126,330,134,308,126,330,121,298,121,298,126,330,108,286,97,269,108,286,126,330,97,269,126,330,81,307,81,102,81,24,90,75,90,75,81,24,126,1,90,75,126,1,103,52,103,52,126,1,119,33,130,25,119,33,126,1,130,25,126,1,180,-6,207,316,235,330,194,319,194,319,235,330,180,320,164,318,180,320,180,338,164,318,180,338,149,314,81,307,46,271,46,61,81,307,46,61,74,166,81,307,74,166,76,194,81,307,76,194,80,222,81,307,80,222,87,247,81,307,87,247,97,269,81,102,76,132,81,24,81,24,76,132,74,166,24,109,46,61,46,271,24,109,46,271,24,224,24,109,24,224,17,167,223,19,209,15,234,1,234,1,209,15,196,12,234,1,196,12,181,11,181,11,167,12,180,-6,180,-6,167,12,154,15,180,-6,154,15,142,19,207,316,219,311,235,330,235,330,219,311,231,305,235,330,231,305,242,296,242,296,257,279,280,306,280,306,257,279,270,257,280,306,270,257,279,231,235,330,180,338,180,320,280,103,272,76,279,24,279,24,272,76,260,53,279,24,260,53,246,35,246,35,235,26,279,24,279,24,235,26,234,1,344,166,336,222,336,108,336,108,336,222,314,269,336,108,314,269,314,60,314,60,314,269,287,169,285,201,287,169,314,269,285,201,314,269,280,306,285,201,280,306,279,231,280,306,235,330,242,296,314,60,287,169,285,134,314,60,285,134,280,103,314,60,280,103,279,24,181,11,180,-6,234,1,81,24,74,166,46,61,223,19,234,1,235,26,130,25,180,-6,142,19,224,420,234,399,230,422,
-252,411,250,419,247,426,241,431,234,435,227,436,219,435,212,431,207,426,203,419,202,411,203,403,207,397,212,391,218,388,226,387,234,388,241,391,247,397,250,403,252,411,16383,16383,152,411,151,419,147,426,142,431,135,435,127,436,119,435,113,431,107,426,104,419,103,411,104,403,107,397,112,391,119,388,127,387,135,388,142,391,147,397,151,403,152,411,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,299,11,184,126,299,242,276,265,160,150,45,265,22,242,137,126,22,11,45,-11,160,103,276,-11,329,367,305,367,268,314,250,323,233,330,217,335,200,337,181,338,127,330,81,307,47,270,25,222,17,165,18,147,20,129,24,111,30,94,36,79,48,59,55,50,75,30,28,-39,52,-39,92,18,110,8,127,1,143,-3,161,-5,180,-6,234,1,279,24,314,61,336,109,344,166,343,184,340,203,336,220,331,237,325,252,319,263,313,272,305,281,296,291,285,302,16383,16383,97,61,88,80,82,99,77,119,75,141,74,165,79,218,93,261,115,293,144,313,180,320,196,319,211,315,225,309,238,300,251,287,16383,16383,263,270,272,251,279,232,284,212,286,190,287,165,282,113,268,70,246,38,217,18,180,11,164,12,149,16,135,22,122,32,109,44,227,378,154,453,149,457,145,460,141,462,137,463,132,464,126,463,121,461,118,458,115,454,114,448,115,443,117,439,120,434,124,430,129,426,
+252,411,250,419,247,426,241,431,234,435,227,436,219,435,212,431,207,426,203,419,202,411,203,403,207,397,212,391,218,388,226,387,234,388,241,391,247,397,250,403,252,411,16383,16383,152,411,151,419,147,426,142,431,135,435,127,436,119,435,113,431,107,426,104,419,103,411,104,403,107,397,112,391,119,388,127,387,135,388,142,391,147,397,151,403,152,411,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,
 103,411,104,403,104,419,104,419,104,403,107,397,104,419,107,397,107,426,107,426,107,397,112,391,107,426,112,391,113,431,113,431,112,391,119,388,113,431,119,388,119,435,119,435,119,388,127,387,119,435,127,387,127,436,127,436,127,387,135,388,127,436,135,388,135,435,135,435,135,388,142,391,135,435,142,391,142,431,142,431,142,391,147,397,142,431,147,397,147,426,147,426,147,397,151,403,147,426,151,403,151,419,151,419,151,403,152,411,149,314,180,338,134,308,134,308,180,338,126,330,134,308,126,330,121,298,121,298,126,330,108,286,97,269,108,286,126,330,97,269,126,330,81,307,81,102,81,24,90,75,90,75,81,24,126,1,90,75,126,1,103,52,103,52,126,1,119,33,130,25,119,33,126,1,130,25,126,1,180,-6,207,316,235,330,194,319,194,319,235,330,180,320,164,318,180,320,180,338,164,318,180,338,149,314,81,307,46,271,46,61,81,307,46,61,74,166,81,307,74,166,76,194,81,307,76,194,80,222,81,307,80,222,87,247,81,307,87,247,97,269,81,102,76,132,81,24,81,24,76,132,74,166,24,109,46,61,46,271,24,109,46,271,24,224,24,109,24,224,17,167,223,19,209,15,234,1,234,1,209,15,196,12,234,1,196,12,181,11,181,11,167,12,180,-6,180,-6,167,12,154,15,180,-6,154,15,142,19,207,316,219,311,235,330,235,330,219,311,231,305,235,330,231,305,242,296,242,296,257,279,280,306,280,306,257,279,270,257,280,306,270,257,279,231,235,330,180,338,180,320,280,103,272,76,279,24,279,24,272,76,260,53,279,24,260,53,246,35,246,35,235,26,279,24,279,24,235,26,234,1,344,166,336,222,336,108,336,108,336,222,314,269,336,108,314,269,314,60,314,60,314,269,287,169,285,201,287,169,314,269,285,201,314,269,280,306,285,201,280,306,279,231,280,306,235,330,242,296,314,60,287,169,285,134,314,60,285,134,280,103,314,60,280,103,279,24,181,11,180,-6,234,1,202,411,203,403,203,419,203,419,203,403,207,397,203,419,207,397,207,426,207,426,207,397,212,391,207,426,212,391,212,431,212,431,212,391,218,388,212,431,218,388,219,435,219,435,218,388,226,387,219,435,226,387,227,436,227,436,226,387,234,388,227,436,234,388,234,435,234,435,234,388,241,391,234,435,241,391,241,431,241,431,241,391,247,397,241,431,247,397,247,426,247,426,247,397,250,403,247,426,250,403,250,419,250,419,250,403,252,411,81,24,74,166,46,61,223,19,234,1,235,26,130,25,180,-6,142,19,
-299,11,184,126,299,242,276,265,160,150,45,265,22,242,137,126,22,11,45,-11,160,103,276,-11,329,367,305,367,268,314,250,323,233,330,217,335,200,337,181,338,127,330,81,307,47,270,25,222,
+299,11,184,126,299,242,276,265,160,150,45,265,22,242,137,126,22,11,45,-11,160,103,276,-11,
 184,126,299,242,276,265,184,126,276,265,160,150,184,126,160,150,276,-11,184,126,276,-11,299,11,22,11,45,-11,137,126,137,126,45,-11,160,103,137,126,160,103,160,150,160,150,160,103,276,-11,45,265,22,242,137,126,45,265,137,126,160,150,
-329,367,305,367,268,314,250,323,233,330,217,335,200,337,181,338,127,330,81,307,47,270,25,222,17,165,18,147,20,129,24,111,30,94,36,79,48,59,55,50,75,30,28,-39,52,-39,92,18,110,8,127,1,143,-3,161,-5,180,-6,234,1,279,24,314,61,336,109,344,166,343,184,340,203,336,220,331,237,325,252,319,263,313,272,305,281,296,291,285,302,16383,16383,97,61,88,80,82,99,77,119,75,141,74,165,79,218,93,261,115,293,144,313,180,320,196,319,211,315,225,309,238,300,251,287,16383,16383,263,270,272,251,279,232,284,212,286,190,287,165,282,113,268,70,246,38,217,18,180,11,164,12,149,16,135,22,122,32,109,44,227,378,154,453,149,457,145,460,141,462,137,463,132,464,126,463,121,461,118,458,115,454,114,448,115,443,117,439,120,434,124,430,129,426,206,378,16383,16383,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,
+329,367,305,367,268,314,250,323,233,330,217,335,200,337,181,338,127,330,81,307,47,270,25,222,17,165,18,147,20,129,24,111,30,94,36,79,48,59,55,50,75,30,28,-39,52,-39,92,18,110,8,127,1,143,-3,161,-5,180,-6,234,1,279,24,314,61,336,109,344,166,343,184,340,203,336,220,331,237,325,252,319,263,313,272,305,281,296,291,285,302,16383,16383,97,61,88,80,82,99,77,119,75,141,74,165,79,218,93,261,115,293,144,313,180,320,196,319,211,315,225,309,238,300,251,287,16383,16383,263,270,272,251,279,232,284,212,286,190,287,165,282,113,268,70,246,38,217,18,180,11,164,12,149,16,135,22,122,32,109,44,
 48,59,55,50,81,307,81,307,55,50,64,41,81,307,64,41,74,165,74,165,75,30,75,141,75,141,75,30,77,119,282,113,268,70,279,24,279,24,268,70,246,38,279,24,246,38,234,1,234,1,246,38,217,18,234,1,217,18,180,11,180,11,164,12,180,-6,180,-6,164,12,161,-5,88,80,92,18,97,61,97,61,92,18,110,8,97,61,110,8,109,44,109,44,110,8,122,32,122,32,110,8,127,1,122,32,127,1,135,22,135,22,127,1,143,-3,135,22,143,-3,149,16,149,16,143,-3,161,-5,149,16,161,-5,164,12,92,18,88,80,82,99,92,18,82,99,77,119,92,18,77,119,75,30,92,18,75,30,52,-39,75,30,28,-39,52,-39,109,44,263,270,251,287,251,287,268,314,250,323,251,287,250,323,238,300,238,300,250,323,233,330,238,300,233,330,225,309,225,309,233,330,217,335,225,309,217,335,211,315,211,315,217,335,200,337,211,315,200,337,196,319,196,319,200,337,181,338,196,319,181,338,180,320,343,184,340,203,344,166,344,166,340,203,336,220,344,166,336,220,336,109,336,109,336,220,331,237,336,109,331,237,325,252,319,263,313,272,314,61,319,263,314,61,336,109,319,263,336,109,325,252,279,24,314,61,282,113,282,113,314,61,287,165,296,291,287,165,314,61,296,291,314,61,305,281,305,281,314,61,313,272,180,11,180,-6,234,1,263,270,272,251,268,314,268,314,272,251,285,302,268,314,285,302,305,367,305,367,285,302,329,367,285,302,272,251,279,232,285,302,279,232,284,212,285,302,284,212,286,190,285,302,286,190,296,291,251,287,97,61,109,44,93,261,115,293,127,330,127,330,115,293,144,313,127,330,144,313,181,338,181,338,144,313,180,320,81,307,74,165,79,218,81,307,79,218,93,261,81,307,93,261,127,330,47,270,25,222,30,94,47,270,30,94,36,79,47,270,36,79,42,69,47,270,42,69,48,59,47,270,48,59,81,307,25,222,17,165,18,147,25,222,18,147,20,129,25,222,20,129,24,111,25,222,24,111,30,94,296,291,286,190,287,165,268,314,251,287,263,270,75,30,74,165,64,41,
-227,378,154,453,149,457,145,460,141,462,137,463,132,464,126,463,121,461,118,458,115,454,114,448,115,443,117,439,120,434,124,430,129,426,206,378,16383,16383,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,297,62,302,81,305,104,305,258,306,282,310,300,318,311,331,318,353,321,132,378,152,378,229,427,234,431,238,435,241,439,243,443,244,448,243,454,241,458,237,461,233,463,227,464,222,463,218,462,214,460,210,457,205,453,16383,16383,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,297,62,302,81,305,104,305,258,306,282,310,300,318,311,331,318,353,321,
+227,378,154,453,149,457,145,460,141,462,137,463,132,464,126,463,121,461,118,458,115,454,114,448,115,443,117,439,120,434,124,430,129,426,206,378,16383,16383,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,297,62,302,81,305,104,305,258,306,282,310,300,318,311,331,318,353,321,
 206,378,227,378,154,453,206,378,154,453,149,457,206,378,149,457,145,460,206,378,145,460,141,462,206,378,141,462,137,463,206,378,137,463,132,464,206,378,132,464,129,426,114,448,115,443,115,454,115,454,115,443,117,439,115,454,117,439,118,458,118,458,117,439,120,434,118,458,120,434,121,461,121,461,120,434,124,430,121,461,124,430,126,463,126,463,124,430,129,426,126,463,129,426,132,464,105,79,106,8,109,63,109,63,106,8,121,1,109,63,121,1,115,50,115,50,121,1,125,37,135,30,125,37,138,-3,135,30,138,-3,146,24,146,24,138,-3,157,-5,146,24,157,-5,158,19,158,19,157,-5,177,-6,158,19,177,-6,173,16,173,16,177,-6,189,15,208,16,189,15,204,-5,208,16,204,-5,227,0,103,118,103,275,93,16,103,118,93,16,104,97,104,97,93,16,106,8,104,97,106,8,105,79,125,37,121,1,138,-3,283,103,282,85,290,45,290,45,282,85,279,70,290,45,279,70,278,30,278,30,279,70,273,57,278,30,273,57,265,45,265,45,254,34,264,17,264,17,254,34,247,6,241,26,225,20,227,0,241,26,227,0,247,6,241,26,247,6,254,34,353,331,237,331,257,319,353,331,257,319,270,312,353,331,270,312,279,301,353,331,279,301,318,311,353,331,318,311,331,318,353,331,331,318,353,321,305,258,306,282,297,62,305,258,297,62,302,81,305,258,302,81,305,104,305,258,305,104,305,131,290,45,297,62,306,282,290,45,306,282,283,257,290,45,283,257,283,125,290,45,283,125,283,103,310,300,318,311,282,283,310,300,282,283,283,257,310,300,283,257,306,282,265,45,264,17,278,30,189,15,177,-6,204,-5,128,319,148,321,148,331,128,319,148,331,115,314,115,314,148,331,51,297,115,314,51,297,52,280,53,95,52,280,52,124,58,69,66,48,104,293,104,293,66,48,78,30,104,293,78,30,103,275,103,275,78,30,93,16,104,293,108,306,52,280,104,293,52,280,53,95,104,293,53,95,58,69,148,331,7,331,27,319,148,331,27,319,40,315,148,331,40,315,47,308,148,331,47,308,51,297,27,319,7,331,7,321,115,314,52,280,108,306,257,319,237,331,237,321,318,311,279,301,282,283,208,16,227,0,225,20,
-132,378,152,378,229,427,234,431,238,435,241,439,243,443,244,448,243,454,241,458,237,461,233,463,227,464,222,463,218,462,214,460,210,457,205,453,16383,16383,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,297,62,302,81,305,104,305,258,306,282,310,300,318,311,331,318,353,321,256,378,193,462,162,462,100,378,117,378,177,430,238,378,16383,16383,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,297,62,302,81,305,104,305,258,306,282,310,300,318,311,331,318,353,321,252,411,250,419,247,426,241,431,234,435,227,436,219,435,212,431,207,426,203,419,202,411,
+132,378,152,378,229,427,234,431,238,435,241,439,243,443,244,448,243,454,241,458,237,461,233,463,227,464,222,463,218,462,214,460,210,457,205,453,16383,16383,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,297,62,302,81,305,104,305,258,306,282,310,300,318,311,331,318,353,321,
 105,79,106,8,109,63,109,63,106,8,121,1,109,63,121,1,115,50,115,50,121,1,125,37,135,30,125,37,138,-3,135,30,138,-3,146,24,146,24,138,-3,157,-5,146,24,157,-5,158,19,158,19,157,-5,177,-6,158,19,177,-6,173,16,173,16,177,-6,189,15,208,16,189,15,204,-5,208,16,204,-5,227,0,103,118,103,275,93,16,103,118,93,16,104,97,104,97,93,16,106,8,104,97,106,8,105,79,125,37,121,1,138,-3,227,464,229,427,233,463,233,463,229,427,234,431,233,463,234,431,237,461,237,461,234,431,238,435,237,461,238,435,241,458,241,458,238,435,241,439,241,458,241,439,243,454,243,454,241,439,243,443,243,454,243,443,244,448,229,427,227,464,222,463,229,427,222,463,218,462,229,427,218,462,214,460,229,427,214,460,210,457,229,427,210,457,205,453,229,427,205,453,152,378,283,103,282,85,290,45,290,45,282,85,279,70,290,45,279,70,278,30,278,30,279,70,273,57,278,30,273,57,265,45,265,45,254,34,264,17,264,17,254,34,247,6,241,26,225,20,227,0,241,26,227,0,247,6,241,26,247,6,254,34,353,331,237,331,257,319,353,331,257,319,270,312,353,331,270,312,279,301,353,331,279,301,318,311,353,331,318,311,331,318,353,331,331,318,353,321,305,258,306,282,297,62,305,258,297,62,302,81,305,258,302,81,305,104,305,258,305,104,305,131,290,45,297,62,306,282,290,45,306,282,283,257,290,45,283,257,283,125,290,45,283,125,283,103,310,300,318,311,282,283,310,300,282,283,283,257,310,300,283,257,306,282,265,45,264,17,278,30,189,15,177,-6,204,-5,128,319,148,321,148,331,128,319,148,331,115,314,115,314,148,331,51,297,115,314,51,297,52,280,53,95,52,280,52,124,58,69,66,48,104,293,104,293,66,48,78,30,104,293,78,30,103,275,103,275,78,30,93,16,104,293,108,306,52,280,104,293,52,280,53,95,104,293,53,95,58,69,148,331,7,331,27,319,148,331,27,319,40,315,148,331,40,315,47,308,148,331,47,308,51,297,27,319,7,331,7,321,115,314,52,280,108,306,257,319,237,331,237,321,318,311,279,301,282,283,208,16,227,0,225,20,152,378,205,453,132,378,
-256,378,193,462,162,462,100,378,117,378,177,430,238,378,16383,16383,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,297,62,302,81,305,104,305,258,306,282,310,300,318,311,331,318,353,321,252,411,250,419,247,426,241,431,234,435,227,436,219,435,212,431,207,426,203,419,202,411,203,403,207,397,212,391,218,388,226,387,234,388,241,391,247,397,250,403,252,411,16383,16383,152,411,151,419,147,426,142,431,135,435,127,436,119,435,113,431,107,426,104,419,103,411,104,403,107,397,112,391,119,388,127,387,135,388,142,391,147,397,151,403,152,411,16383,16383,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,
+256,378,193,462,162,462,100,378,117,378,177,430,238,378,16383,16383,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,297,62,302,81,305,104,305,258,306,282,310,300,318,311,331,318,353,321,
 100,378,117,378,162,462,162,462,117,378,177,430,162,462,177,430,193,462,193,462,177,430,238,378,193,462,238,378,256,378,105,79,106,8,109,63,109,63,106,8,121,1,109,63,121,1,115,50,115,50,121,1,125,37,135,30,125,37,138,-3,135,30,138,-3,146,24,146,24,138,-3,157,-5,146,24,157,-5,158,19,158,19,157,-5,177,-6,158,19,177,-6,173,16,173,16,177,-6,189,15,208,16,189,15,204,-5,208,16,204,-5,227,0,103,118,103,275,93,16,103,118,93,16,104,97,104,97,93,16,106,8,104,97,106,8,105,79,125,37,121,1,138,-3,283,103,282,85,290,45,290,45,282,85,279,70,290,45,279,70,278,30,278,30,279,70,273,57,278,30,273,57,265,45,265,45,254,34,264,17,264,17,254,34,247,6,241,26,225,20,227,0,241,26,227,0,247,6,241,26,247,6,254,34,353,331,237,331,257,319,353,331,257,319,270,312,353,331,270,312,279,301,353,331,279,301,318,311,353,331,318,311,331,318,353,331,331,318,353,321,305,258,306,282,297,62,305,258,297,62,302,81,305,258,302,81,305,104,305,258,305,104,305,131,290,45,297,62,306,282,290,45,306,282,283,257,290,45,283,257,283,125,290,45,283,125,283,103,310,300,318,311,282,283,310,300,282,283,283,257,310,300,283,257,306,282,265,45,264,17,278,30,189,15,177,-6,204,-5,128,319,148,321,148,331,128,319,148,331,115,314,115,314,148,331,51,297,115,314,51,297,52,280,53,95,52,280,52,124,58,69,66,48,104,293,104,293,66,48,78,30,104,293,78,30,103,275,103,275,78,30,93,16,104,293,108,306,52,280,104,293,52,280,53,95,104,293,53,95,58,69,148,331,7,331,27,319,148,331,27,319,40,315,148,331,40,315,47,308,148,331,47,308,51,297,27,319,7,331,7,321,115,314,52,280,108,306,257,319,237,331,237,321,318,311,279,301,282,283,208,16,227,0,225,20,
-252,411,250,419,247,426,241,431,234,435,227,436,219,435,212,431,207,426,203,419,202,411,203,403,207,397,212,391,218,388,226,387,234,388,241,391,247,397,250,403,252,411,16383,16383,152,411,151,419,147,426,142,431,135,435,127,436,119,435,113,431,107,426,104,419,103,411,104,403,107,397,112,391,119,388,127,387,135,388,142,391,147,397,151,403,152,411,16383,16383,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,297,62,302,81,305,104,305,258,306,282,310,300,318,311,331,318,353,321,133,378,153,378,230,427,240,435,243,439,244,443,245,448,244,454,242,458,238,461,234,463,228,464,223,463,219,462,216,460,211,457,206,453,16383,16383,352,331,243,331,243,321,256,321,266,319,272,316,275,312,276,306,276,302,274,294,272,290,270,285,197,174,124,285,121,289,118,294,116,299,115,304,115,308,116,312,119,316,123,318,130,320,138,321,151,321,151,331,11,331,11,321,24,319,37,313,50,299,68,277,92,243,157,147,157,61,156,39,152,25,144,16,129,12,107,9,107,0,260,0,260,9,239,11,224,15,215,23,210,36,209,55,209,151,282,266,297,288,310,303,322,313,336,319,352,321,101,266,101,268,100,269,100,271,101,292,105,306,113,314,127,319,147,321,147,331,8,331,8,321,27,319,39,314,46,307,49,294,50,276,50,60,49,39,46,25,39,17,27,12,8,9,8,0,148,0,148,9,128,11,114,16,106,23,102,36,101,55,101,80,109,80,115,79,136,79,158,80,177,82,194,85,210,90,
+252,411,250,419,247,426,241,431,234,435,227,436,219,435,212,431,207,426,203,419,202,411,203,403,207,397,212,391,218,388,226,387,234,388,241,391,247,397,250,403,252,411,16383,16383,152,411,151,419,147,426,142,431,135,435,127,436,119,435,113,431,107,426,104,419,103,411,104,403,107,397,112,391,119,388,127,387,135,388,142,391,147,397,151,403,152,411,16383,16383,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,297,62,302,81,305,104,305,258,306,282,310,300,318,311,331,318,353,321,
 202,411,203,403,203,419,203,419,203,403,207,397,203,419,207,397,207,426,207,426,207,397,212,391,207,426,212,391,212,431,212,431,212,391,218,388,212,431,218,388,219,435,219,435,218,388,226,387,219,435,226,387,227,436,227,436,226,387,234,388,227,436,234,388,234,435,234,435,234,388,241,391,234,435,241,391,241,431,241,431,241,391,247,397,241,431,247,397,247,426,247,426,247,397,250,403,247,426,250,403,250,419,250,419,250,403,252,411,103,411,104,403,104,419,104,419,104,403,107,397,104,419,107,397,107,426,107,426,107,397,112,391,107,426,112,391,113,431,113,431,112,391,119,388,113,431,119,388,119,435,119,435,119,388,127,387,119,435,127,387,127,436,127,436,127,387,135,388,127,436,135,388,135,435,135,435,135,388,142,391,135,435,142,391,142,431,142,431,142,391,147,397,142,431,147,397,147,426,147,426,147,397,151,403,147,426,151,403,151,419,151,419,151,403,152,411,105,79,106,8,109,63,109,63,106,8,121,1,109,63,121,1,115,50,115,50,121,1,125,37,135,30,125,37,138,-3,135,30,138,-3,146,24,146,24,138,-3,157,-5,146,24,157,-5,158,19,158,19,157,-5,177,-6,158,19,177,-6,173,16,173,16,177,-6,189,15,208,16,189,15,204,-5,208,16,204,-5,227,0,103,118,103,275,93,16,103,118,93,16,104,97,104,97,93,16,106,8,104,97,106,8,105,79,125,37,121,1,138,-3,283,103,282,85,290,45,290,45,282,85,279,70,290,45,279,70,278,30,278,30,279,70,273,57,278,30,273,57,265,45,265,45,254,34,264,17,264,17,254,34,247,6,241,26,225,20,227,0,241,26,227,0,247,6,241,26,247,6,254,34,353,331,237,331,257,319,353,331,257,319,270,312,353,331,270,312,279,301,353,331,279,301,318,311,353,331,318,311,331,318,353,331,331,318,353,321,305,258,306,282,297,62,305,258,297,62,302,81,305,258,302,81,305,104,305,258,305,104,305,131,290,45,297,62,306,282,290,45,306,282,283,257,290,45,283,257,283,125,290,45,283,125,283,103,310,300,318,311,282,283,310,300,282,283,283,257,310,300,283,257,306,282,265,45,264,17,278,30,189,15,177,-6,204,-5,128,319,148,321,148,331,128,319,148,331,115,314,115,314,148,331,51,297,115,314,51,297,52,280,53,95,52,280,52,124,58,69,66,48,104,293,104,293,66,48,78,30,104,293,78,30,103,275,103,275,78,30,93,16,104,293,108,306,52,280,104,293,52,280,53,95,104,293,53,95,58,69,148,331,7,331,27,319,148,331,27,319,40,315,148,331,40,315,47,308,148,331,47,308,51,297,27,319,7,331,7,321,115,314,52,280,108,306,257,319,237,331,237,321,318,311,279,301,282,283,208,16,227,0,225,20,
-133,378,153,378,230,427,240,435,243,439,244,443,245,448,244,454,242,458,238,461,234,463,228,464,223,463,219,462,216,460,211,457,206,453,16383,16383,352,331,243,331,243,321,256,321,266,319,272,316,275,312,276,306,276,302,274,294,272,290,270,285,197,174,124,285,121,289,118,294,116,299,115,304,115,308,116,312,119,316,123,318,130,320,138,321,151,321,151,331,11,331,11,321,24,319,37,313,50,299,68,277,92,243,157,147,157,61,156,39,152,25,144,16,129,12,107,9,107,0,260,0,260,9,239,11,224,15,215,23,210,36,209,55,209,151,282,266,297,288,310,303,322,313,336,319,352,321,101,266,101,268,100,269,100,271,101,292,105,306,113,314,127,319,147,321,147,331,8,331,8,321,27,319,39,314,46,307,49,294,50,276,50,60,49,39,46,25,39,17,27,12,8,9,8,0,148,0,148,9,128,11,114,16,106,23,102,36,101,55,101,80,109,80,115,79,136,79,158,80,177,82,194,85,210,90,223,96,239,107,253,121,263,138,269,156,271,175,265,206,248,231,221,250,185,262,141,266,16383,16383,101,230,101,237,103,242,106,245,110,247,117,247,154,244,182,236,201,221,213,200,217,172,213,146,202,126,185,111,161,102,129,99,113,99,107,100,101,100,36,42,36,28,33,19,
+133,378,153,378,230,427,240,435,243,439,244,443,245,448,244,454,242,458,238,461,234,463,228,464,223,463,219,462,216,460,211,457,206,453,16383,16383,352,331,243,331,243,321,256,321,266,319,272,316,275,312,276,306,276,302,274,294,272,290,270,285,197,174,124,285,121,289,118,294,116,299,115,304,115,308,116,312,119,316,123,318,130,320,138,321,151,321,151,331,11,331,11,321,24,319,37,313,50,299,68,277,92,243,157,147,157,61,156,39,152,25,144,16,129,12,107,9,107,0,260,0,260,9,239,11,224,15,215,23,210,36,209,55,209,151,282,266,297,288,310,303,322,313,336,319,352,321,
 121,289,118,294,157,147,157,147,118,294,116,299,157,147,116,299,92,243,92,243,116,299,115,304,92,243,115,304,115,308,115,308,116,312,92,243,151,331,11,331,24,319,151,331,24,319,37,313,151,331,37,313,50,299,151,331,50,299,123,318,151,331,123,318,130,320,151,331,130,320,138,321,151,331,138,321,151,321,123,318,50,299,119,316,119,316,50,299,68,277,119,316,68,277,116,312,116,312,68,277,92,243,209,55,209,151,197,174,209,55,197,174,210,36,210,36,197,174,157,147,210,36,157,147,215,23,215,23,157,147,157,61,215,23,157,61,224,15,224,15,157,61,156,39,224,15,156,39,260,0,260,0,156,39,152,25,260,0,152,25,144,16,275,298,274,294,282,266,282,266,274,294,272,290,282,266,272,290,270,285,270,285,197,174,209,151,352,331,243,331,256,321,352,331,256,321,266,319,352,331,266,319,272,316,352,331,272,316,275,312,352,331,275,312,276,306,352,331,276,306,322,313,352,331,322,313,336,319,352,331,336,319,352,321,276,306,282,266,297,288,276,306,297,288,310,303,276,306,310,303,322,313,282,266,276,306,276,302,282,266,276,302,275,298,270,285,209,151,282,266,228,464,230,427,234,463,234,463,230,427,235,431,234,463,235,431,238,461,238,461,235,431,240,435,238,461,240,435,242,458,242,458,240,435,243,439,242,458,243,439,244,454,244,454,243,439,244,443,244,454,244,443,245,448,230,427,228,464,223,463,230,427,223,463,219,462,230,427,219,462,216,460,230,427,216,460,211,457,230,427,211,457,206,453,230,427,206,453,153,378,239,11,224,15,260,0,239,11,260,0,260,9,129,12,107,9,260,0,129,12,260,0,144,16,124,285,121,289,157,147,124,285,157,147,197,174,260,0,107,9,107,0,153,378,206,453,133,378,256,321,243,331,243,321,24,319,11,331,11,321,
-101,266,101,268,100,269,100,271,101,292,105,306,113,314,127,319,147,321,147,331,8,331,8,321,27,319,39,314,46,307,49,294,50,276,50,60,49,39,46,25,39,17,27,12,8,9,8,0,148,0,148,9,128,11,114,16,106,23,102,36,101,55,101,80,109,80,115,79,136,79,158,80,177,82,194,85,210,90,223,96,239,107,253,121,263,138,269,156,271,175,265,206,248,231,221,250,185,262,141,266,16383,16383,101,230,101,237,103,242,106,245,110,247,117,247,154,244,182,236,201,221,213,200,217,172,213,146,202,126,185,111,161,102,129,99,113,99,107,100,101,100,36,42,36,28,33,19,28,13,19,9,6,7,6,0,79,0,79,275,81,293,86,308,95,319,107,326,122,328,137,325,150,316,159,302,165,282,167,258,165,237,159,220,150,207,137,199,119,195,114,194,110,193,107,191,105,189,105,184,107,182,110,180,115,179,121,179,145,173,163,161,176,140,184,111,187,75,186,61,185,48,182,36,179,26,175,19,172,15,164,11,160,10,155,10,150,11,146,12,143,15,142,19,141,25,140,36,138,42,135,48,130,52,125,55,118,56,111,55,105,51,100,46,97,40,96,32,98,20,105,10,115,2,129,-2,145,-3,173,0,198,14,
+101,266,101,268,100,269,100,271,101,292,105,306,113,314,127,319,147,321,147,331,8,331,8,321,27,319,39,314,46,307,49,294,50,276,50,60,49,39,46,25,39,17,27,12,8,9,8,0,148,0,148,9,128,11,114,16,106,23,102,36,101,55,101,80,109,80,115,79,136,79,158,80,177,82,194,85,210,90,223,96,239,107,253,121,263,138,269,156,271,175,265,206,248,231,221,250,185,262,141,266,16383,16383,101,230,101,237,103,242,106,245,110,247,117,247,154,244,182,236,201,221,213,200,217,172,213,146,202,126,185,111,161,102,129,99,113,99,107,100,101,100,
 50,276,102,36,50,276,50,276,102,36,101,55,50,276,101,55,100,271,100,271,101,292,50,276,50,276,101,292,105,306,50,276,105,306,113,314,147,331,8,331,27,319,147,331,27,319,39,314,147,331,39,314,46,307,147,331,46,307,49,294,147,331,49,294,113,314,147,331,113,314,127,319,147,331,127,319,147,321,50,276,113,314,49,294,101,237,103,242,101,266,101,266,103,242,106,245,101,266,106,245,141,266,141,266,106,245,110,247,141,266,110,247,117,247,117,247,154,244,141,266,141,266,154,244,185,262,201,221,213,200,221,250,221,250,213,200,217,172,223,96,217,172,213,146,185,262,154,244,182,236,185,262,182,236,201,221,185,262,201,221,221,250,265,206,248,231,253,121,265,206,253,121,263,138,265,206,263,138,269,156,265,206,269,156,271,175,248,231,221,250,223,96,248,231,223,96,239,107,248,231,239,107,253,121,136,79,158,80,161,102,161,102,158,80,177,82,161,102,177,82,185,111,185,111,177,82,194,85,185,111,194,85,202,126,202,126,194,85,210,90,202,126,210,90,213,146,213,146,210,90,223,96,161,102,129,99,136,79,136,79,129,99,128,79,128,79,129,99,124,99,128,79,124,99,122,79,122,79,124,99,118,99,122,79,118,99,115,79,115,79,118,99,113,99,115,79,113,99,109,80,109,80,113,99,107,100,109,80,107,100,101,100,101,266,101,100,101,230,101,266,101,230,101,237,101,267,101,268,101,55,101,267,101,55,101,100,101,267,101,100,101,266,101,100,101,80,109,80,148,0,148,9,128,11,148,0,128,11,114,16,148,0,114,16,49,39,148,0,49,39,46,25,148,0,46,25,39,17,148,0,39,17,27,12,148,0,27,12,8,9,148,0,8,9,8,0,101,55,101,268,100,269,101,55,100,269,100,270,101,55,100,270,100,271,50,60,49,39,114,16,50,60,114,16,106,23,50,60,106,23,102,36,50,60,102,36,50,276,217,172,223,96,221,250,27,319,8,331,8,321,
-36,42,36,28,33,19,28,13,19,9,6,7,6,0,79,0,79,275,81,293,86,308,95,319,107,326,122,328,137,325,150,316,159,302,165,282,167,258,165,237,159,220,150,207,137,199,119,195,114,194,110,193,107,191,105,189,105,184,107,182,110,180,115,179,121,179,145,173,163,161,176,140,184,111,187,75,186,61,185,48,182,36,179,26,175,19,172,15,164,11,160,10,155,10,150,11,146,12,143,15,142,19,141,25,140,36,138,42,135,48,130,52,125,55,118,56,111,55,105,51,100,46,97,40,96,32,98,20,105,10,115,2,129,-2,145,-3,173,0,198,14,217,35,229,62,234,93,233,110,229,125,223,139,214,152,203,163,193,170,183,176,172,181,158,185,142,189,169,203,189,216,202,230,208,246,210,266,207,291,195,312,178,328,154,338,126,342,93,337,68,324,50,301,40,269,36,227,158,253,86,328,81,332,77,335,73,337,65,339,59,338,53,336,50,333,47,329,46,323,47,318,49,314,52,309,56,305,61,301,138,253,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,
+36,42,36,28,33,19,28,13,19,9,6,7,6,0,79,0,79,275,81,293,86,308,95,319,107,326,122,328,137,325,150,316,159,302,165,282,167,258,165,237,159,220,150,207,137,199,119,195,114,194,110,193,107,191,105,189,105,184,107,182,110,180,115,179,121,179,145,173,163,161,176,140,184,111,187,75,186,61,185,48,182,36,179,26,175,19,172,15,164,11,160,10,155,10,150,11,146,12,143,15,142,19,141,25,140,36,138,42,135,48,130,52,125,55,118,56,111,55,105,51,100,46,97,40,96,32,98,20,105,10,115,2,129,-2,145,-3,173,0,198,14,217,35,229,62,234,93,233,110,229,125,223,139,214,152,203,163,193,170,183,176,172,181,158,185,142,189,169,203,189,216,202,230,208,246,210,266,207,291,195,312,178,328,154,338,126,342,93,337,68,324,50,301,40,269,36,227,
 33,19,28,13,79,0,79,0,28,13,19,9,79,0,19,9,6,7,158,185,142,189,145,173,145,173,142,189,137,199,145,173,137,199,121,179,121,179,137,199,119,195,121,179,119,195,115,179,115,179,119,195,114,194,115,179,114,194,110,180,110,180,114,194,110,193,110,180,110,193,107,182,107,182,110,193,107,191,107,182,107,191,105,184,105,184,107,191,105,189,105,184,105,189,105,187,81,293,86,308,93,337,93,337,86,308,95,319,93,337,95,319,126,342,126,342,95,319,107,326,126,342,107,326,122,328,122,328,137,325,126,342,126,342,137,325,154,338,165,237,169,203,167,258,167,258,169,203,178,328,178,328,169,203,189,216,178,328,189,216,195,312,195,312,189,216,202,230,195,312,202,230,207,291,207,291,202,230,208,246,207,291,208,246,210,266,137,325,150,316,154,338,154,338,150,316,159,302,154,338,159,302,178,328,178,328,159,302,165,282,178,328,165,282,167,258,150,207,142,189,169,203,150,207,169,203,159,220,159,220,169,203,165,237,229,62,234,93,233,110,229,62,233,110,229,125,229,62,229,125,223,139,229,62,223,139,217,35,223,139,214,152,217,35,217,35,214,152,203,163,217,35,203,163,198,14,198,14,203,163,193,170,198,14,193,170,187,75,187,75,193,170,184,111,198,14,187,75,186,61,198,14,186,61,185,48,198,14,185,48,182,36,198,14,182,36,179,26,198,14,179,26,175,19,198,14,175,19,173,0,141,25,140,36,138,42,141,25,138,42,145,-3,141,25,145,-3,142,19,68,324,50,301,79,0,68,324,79,0,79,275,68,324,79,275,81,293,68,324,81,293,93,337,79,0,50,301,40,269,79,0,40,269,36,227,79,0,36,227,36,42,79,0,36,42,36,28,79,0,36,28,33,19,168,13,164,11,173,0,173,0,164,11,160,10,173,0,160,10,155,10,155,10,150,11,173,0,173,0,150,11,146,12,173,0,146,12,145,-3,145,-3,146,12,143,15,145,-3,143,15,142,19,168,13,173,0,172,15,172,15,173,0,175,19,138,42,135,48,145,-3,145,-3,135,48,130,52,145,-3,130,52,129,-2,129,-2,130,52,125,55,129,-2,125,55,118,56,115,2,129,-2,118,56,115,2,118,56,111,55,115,2,111,55,105,51,115,2,105,51,105,10,100,46,97,40,98,20,100,46,98,20,105,10,100,46,105,10,105,51,158,185,163,161,172,181,172,181,163,161,176,140,172,181,176,140,183,176,183,176,176,140,184,111,183,176,184,111,193,170,158,185,145,173,163,161,98,20,97,40,96,32,79,0,6,7,6,0,142,189,150,207,137,199,
-158,253,86,328,81,332,77,335,73,337,65,339,59,338,53,336,50,333,47,329,46,323,47,318,49,314,52,309,56,305,61,301,138,253,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,60,253,79,253,156,302,162,306,166,310,169,314,171,318,171,329,168,333,165,336,160,338,154,339,146,337,142,335,138,332,133,328,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,190,253,
+158,253,86,328,81,332,77,335,73,337,65,339,59,338,53,336,50,333,47,329,46,323,47,318,49,314,52,309,56,305,61,301,138,253,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,
 138,253,158,253,86,328,138,253,86,328,81,332,138,253,81,332,77,335,138,253,77,335,73,337,138,253,73,337,69,338,138,253,69,338,65,339,138,253,65,339,61,301,46,323,47,318,47,329,47,329,47,318,49,314,47,329,49,314,50,333,50,333,49,314,52,309,50,333,52,309,53,336,53,336,52,309,56,305,53,336,56,305,59,338,59,338,56,305,61,301,59,338,61,301,65,339,37,156,43,153,44,208,44,208,43,153,50,152,44,208,50,152,54,215,54,215,50,152,57,153,54,215,57,153,63,220,63,220,57,153,63,156,63,220,63,156,73,224,73,224,63,156,70,194,71,167,70,194,68,161,111,230,104,218,117,216,111,230,117,216,127,229,127,229,117,216,128,211,127,229,128,211,140,226,140,226,128,211,136,202,140,226,136,202,142,190,76,208,83,213,85,227,85,227,83,213,93,217,85,227,93,217,98,229,98,229,93,217,104,218,98,229,104,218,111,230,73,224,70,194,71,201,73,224,71,201,76,208,73,224,76,208,85,227,70,194,63,156,68,161,29,183,29,167,32,192,32,192,29,167,33,161,32,192,33,161,37,200,37,200,33,161,37,156,37,200,37,156,44,208,184,56,184,152,184,168,184,56,184,168,183,181,184,56,183,181,180,191,184,56,180,191,186,-3,190,28,195,-1,195,25,195,25,195,-1,200,23,204,24,200,23,204,2,204,24,204,2,212,9,187,35,185,44,186,-3,187,35,186,-3,195,-1,187,35,195,-1,190,28,147,17,151,7,152,222,152,222,151,7,157,0,152,222,157,0,162,215,162,215,157,0,166,-3,162,215,166,-3,170,208,170,208,166,-3,176,-4,170,208,176,-4,176,199,176,199,176,-4,186,-3,176,199,186,-3,180,191,152,222,140,226,142,190,152,222,142,190,143,173,152,222,143,173,143,134,152,222,143,134,144,31,152,222,144,31,147,17,143,31,144,31,143,134,143,146,143,134,143,173,216,29,212,27,212,9,216,29,212,9,221,19,216,29,221,19,221,33,208,25,204,24,212,9,208,25,212,9,212,27,200,23,195,-1,204,2,143,31,143,134,143,64,143,31,143,64,143,56,143,31,143,56,142,49,143,31,142,49,138,43,143,31,138,43,133,38,143,31,133,38,128,16,128,16,133,38,126,32,126,32,121,29,128,16,128,16,121,29,115,27,128,16,115,27,113,6,113,6,115,27,109,25,113,6,109,25,103,24,99,114,111,121,114,135,114,135,111,121,126,127,114,135,126,127,143,146,143,146,126,127,143,134,65,79,68,87,75,118,75,118,68,87,73,94,75,118,73,94,79,101,79,101,88,108,92,126,92,126,88,108,99,114,92,126,99,114,114,135,92,126,75,118,79,101,72,182,71,185,71,167,72,182,71,167,73,172,72,182,73,172,72,178,70,189,70,194,71,167,70,189,71,167,71,185,63,112,54,105,54,-2,63,112,54,-2,63,63,63,112,63,63,63,71,63,112,63,71,65,79,63,112,65,79,75,118,63,63,54,-2,64,48,64,48,54,-2,71,-4,64,48,71,-4,69,38,69,38,71,-4,76,30,20,62,21,29,25,75,25,75,21,29,28,14,25,75,28,14,33,87,33,87,28,14,39,4,33,87,39,4,42,97,42,97,39,4,54,-2,42,97,54,-2,54,105,84,-3,98,0,86,25,86,25,98,0,97,24,103,24,97,24,98,0,103,24,98,0,113,6,76,30,71,-4,84,-3,76,30,84,-3,86,25,21,29,20,62,18,47,184,56,186,-3,185,44,29,167,29,183,28,175,
-60,253,79,253,156,302,162,306,166,310,169,314,171,318,171,329,168,333,165,336,160,338,154,339,146,337,142,335,138,332,133,328,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,190,253,128,337,97,337,35,253,52,253,113,305,174,253,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,180,319,175,309,170,302,165,297,160,295,153,294,149,294,144,295,138,297,
+60,253,79,253,156,302,162,306,166,310,169,314,171,318,171,329,168,333,165,336,160,338,154,339,146,337,142,335,138,332,133,328,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,
 37,156,43,153,44,208,44,208,43,153,50,152,44,208,50,152,54,215,54,215,50,152,57,153,54,215,57,153,63,220,63,220,57,153,63,156,63,220,63,156,73,224,73,224,63,156,70,194,71,167,70,194,68,161,111,230,104,218,117,216,111,230,117,216,127,229,127,229,117,216,128,211,127,229,128,211,140,226,140,226,128,211,136,202,140,226,136,202,142,190,76,208,83,213,85,227,85,227,83,213,93,217,85,227,93,217,98,229,98,229,93,217,104,218,98,229,104,218,111,230,73,224,70,194,71,201,73,224,71,201,76,208,73,224,76,208,85,227,70,194,63,156,68,161,29,183,29,167,32,192,32,192,29,167,33,161,32,192,33,161,37,200,37,200,33,161,37,156,37,200,37,156,44,208,184,56,184,152,184,168,184,56,184,168,183,181,184,56,183,181,180,191,184,56,180,191,186,-3,190,28,195,-1,195,25,195,25,195,-1,200,23,204,24,200,23,204,2,204,24,204,2,212,9,187,35,185,44,186,-3,187,35,186,-3,195,-1,187,35,195,-1,190,28,147,17,151,7,152,222,152,222,151,7,157,0,152,222,157,0,162,215,162,215,157,0,166,-3,162,215,166,-3,170,208,170,208,166,-3,176,-4,170,208,176,-4,176,199,176,199,176,-4,186,-3,176,199,186,-3,180,191,152,222,140,226,142,190,152,222,142,190,143,173,152,222,143,173,143,134,152,222,143,134,144,31,152,222,144,31,147,17,143,31,144,31,143,134,143,146,143,134,143,173,216,29,212,27,212,9,216,29,212,9,221,19,216,29,221,19,221,33,208,25,204,24,212,9,208,25,212,9,212,27,200,23,195,-1,204,2,154,339,156,302,160,338,160,338,156,302,162,306,160,338,162,306,165,336,165,336,162,306,166,310,165,336,166,310,168,333,168,333,166,310,169,314,168,333,169,314,171,329,171,329,169,314,171,318,171,329,171,318,171,323,156,302,154,339,150,338,156,302,150,338,146,337,156,302,146,337,142,335,156,302,142,335,138,332,156,302,138,332,133,328,156,302,133,328,79,253,143,31,143,134,143,64,143,31,143,64,143,56,143,31,143,56,142,49,143,31,142,49,138,43,143,31,138,43,133,38,143,31,133,38,128,16,128,16,133,38,126,32,126,32,121,29,128,16,128,16,121,29,115,27,128,16,115,27,113,6,113,6,115,27,109,25,113,6,109,25,103,24,99,114,111,121,114,135,114,135,111,121,126,127,114,135,126,127,143,146,143,146,126,127,143,134,65,79,68,87,75,118,75,118,68,87,73,94,75,118,73,94,79,101,79,101,88,108,92,126,92,126,88,108,99,114,92,126,99,114,114,135,92,126,75,118,79,101,72,182,71,185,71,167,72,182,71,167,73,172,72,182,73,172,72,178,70,189,70,194,71,167,70,189,71,167,71,185,63,112,54,105,54,-2,63,112,54,-2,63,63,63,112,63,63,63,71,63,112,63,71,65,79,63,112,65,79,75,118,63,63,54,-2,64,48,64,48,54,-2,71,-4,64,48,71,-4,69,38,69,38,71,-4,76,30,20,62,21,29,25,75,25,75,21,29,28,14,25,75,28,14,33,87,33,87,28,14,39,4,33,87,39,4,42,97,42,97,39,4,54,-2,42,97,54,-2,54,105,84,-3,98,0,86,25,86,25,98,0,97,24,103,24,97,24,98,0,103,24,98,0,113,6,76,30,71,-4,84,-3,76,30,84,-3,86,25,21,29,20,62,18,47,79,253,133,328,60,253,184,56,186,-3,185,44,29,167,29,183,28,175,
-190,253,128,337,97,337,35,253,52,253,113,305,174,253,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,180,319,175,309,170,302,165,297,160,295,153,294,149,294,144,295,138,297,133,299,127,301,115,307,108,311,94,315,87,316,80,316,66,314,54,308,43,298,35,284,30,266,44,266,48,274,52,281,57,285,63,288,70,289,73,289,81,287,86,285,90,283,102,278,112,273,121,269,128,267,135,266,142,266,157,268,169,274,180,284,188,299,195,319,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,
+190,253,128,337,97,337,35,253,52,253,113,305,174,253,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,
 35,253,52,253,97,337,97,337,52,253,113,305,97,337,113,305,128,337,128,337,113,305,174,253,128,337,174,253,190,253,37,156,43,153,44,208,44,208,43,153,50,152,44,208,50,152,54,215,54,215,50,152,57,153,54,215,57,153,63,220,63,220,57,153,63,156,63,220,63,156,73,224,73,224,63,156,70,194,71,167,70,194,68,161,111,230,104,218,117,216,111,230,117,216,127,229,127,229,117,216,128,211,127,229,128,211,140,226,140,226,128,211,136,202,140,226,136,202,142,190,76,208,83,213,85,227,85,227,83,213,93,217,85,227,93,217,98,229,98,229,93,217,104,218,98,229,104,218,111,230,73,224,70,194,71,201,73,224,71,201,76,208,73,224,76,208,85,227,70,194,63,156,68,161,29,183,29,167,32,192,32,192,29,167,33,161,32,192,33,161,37,200,37,200,33,161,37,156,37,200,37,156,44,208,184,56,184,152,184,168,184,56,184,168,183,181,184,56,183,181,180,191,184,56,180,191,186,-3,190,28,195,-1,195,25,195,25,195,-1,200,23,204,24,200,23,204,2,204,24,204,2,212,9,187,35,185,44,186,-3,187,35,186,-3,195,-1,187,35,195,-1,190,28,147,17,151,7,152,222,152,222,151,7,157,0,152,222,157,0,162,215,162,215,157,0,166,-3,162,215,166,-3,170,208,170,208,166,-3,176,-4,170,208,176,-4,176,199,176,199,176,-4,186,-3,176,199,186,-3,180,191,152,222,140,226,142,190,152,222,142,190,143,173,152,222,143,173,143,134,152,222,143,134,144,31,152,222,144,31,147,17,143,31,144,31,143,134,143,146,143,134,143,173,216,29,212,27,212,9,216,29,212,9,221,19,216,29,221,19,221,33,208,25,204,24,212,9,208,25,212,9,212,27,200,23,195,-1,204,2,143,31,143,134,143,64,143,31,143,64,143,56,143,31,143,56,142,49,143,31,142,49,138,43,143,31,138,43,133,38,143,31,133,38,128,16,128,16,133,38,126,32,126,32,121,29,128,16,128,16,121,29,115,27,128,16,115,27,113,6,113,6,115,27,109,25,113,6,109,25,103,24,99,114,111,121,114,135,114,135,111,121,126,127,114,135,126,127,143,146,143,146,126,127,143,134,65,79,68,87,75,118,75,118,68,87,73,94,75,118,73,94,79,101,79,101,88,108,92,126,92,126,88,108,99,114,92,126,99,114,114,135,92,126,75,118,79,101,72,182,71,185,71,167,72,182,71,167,73,172,72,182,73,172,72,178,70,189,70,194,71,167,70,189,71,167,71,185,63,112,54,105,54,-2,63,112,54,-2,63,63,63,112,63,63,63,71,63,112,63,71,65,79,63,112,65,79,75,118,63,63,54,-2,64,48,64,48,54,-2,71,-4,64,48,71,-4,69,38,69,38,71,-4,76,30,20,62,21,29,25,75,25,75,21,29,28,14,25,75,28,14,33,87,33,87,28,14,39,4,33,87,39,4,42,97,42,97,39,4,54,-2,42,97,54,-2,54,105,84,-3,98,0,86,25,86,25,98,0,97,24,103,24,97,24,98,0,103,24,98,0,113,6,76,30,71,-4,84,-3,76,30,84,-3,86,25,21,29,20,62,18,47,184,56,186,-3,185,44,29,167,29,183,28,175,
-180,319,175,309,170,302,165,297,160,295,153,294,149,294,144,295,138,297,133,299,127,301,115,307,108,311,94,315,87,316,80,316,66,314,54,308,43,298,35,284,30,266,44,266,48,274,52,281,57,285,63,288,70,289,73,289,81,287,86,285,90,283,102,278,112,273,121,269,128,267,135,266,142,266,157,268,169,274,180,284,188,299,195,319,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,186,286,185,294,182,301,176,306,169,310,161,311,154,310,147,306,142,301,138,294,137,286,138,278,142,272,147,266,153,263,161,262,169,263,176,266,182,272,185,278,186,286,16383,16383,87,286,86,294,82,301,77,306,70,310,62,311,54,310,48,306,42,301,39,294,37,286,39,278,42,272,47,266,54,263,61,262,69,263,76,266,82,272,86,278,87,286,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,
+180,319,175,309,170,302,165,297,160,295,153,294,149,294,144,295,138,297,133,299,127,301,115,307,108,311,94,315,87,316,80,316,66,314,54,308,43,298,35,284,30,266,44,266,48,274,52,281,57,285,63,288,70,289,73,289,81,287,86,285,90,283,102,278,112,273,121,269,128,267,135,266,142,266,157,268,169,274,180,284,188,299,195,319,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,
 48,274,52,281,54,308,54,308,52,281,57,285,54,308,57,285,66,314,66,314,57,285,63,288,66,314,63,288,70,289,70,289,73,289,80,316,80,316,73,289,77,288,80,316,77,288,81,287,44,266,48,274,54,308,44,266,54,308,43,298,44,266,43,298,35,284,44,266,35,284,30,266,37,156,43,153,44,208,44,208,43,153,50,152,44,208,50,152,54,215,54,215,50,152,57,153,54,215,57,153,63,220,63,220,57,153,63,156,63,220,63,156,73,224,73,224,63,156,70,194,71,167,70,194,68,161,80,316,81,287,87,316,87,316,81,287,86,285,87,316,86,285,90,283,90,283,102,278,94,315,94,315,102,278,101,313,80,316,66,314,70,289,94,315,87,316,90,283,101,313,102,278,108,311,108,311,102,278,112,273,108,311,112,273,115,307,115,307,112,273,121,269,115,307,121,269,127,301,127,301,121,269,128,267,127,301,128,267,133,299,133,299,128,267,135,266,133,299,135,266,138,297,138,297,135,266,142,266,138,297,142,266,144,295,144,295,142,266,157,268,144,295,157,268,149,294,149,294,157,268,153,294,160,295,153,294,157,268,160,295,157,268,169,274,184,56,184,152,184,168,184,56,184,168,183,181,184,56,183,181,180,191,184,56,180,191,186,-3,190,28,195,-1,195,25,195,25,195,-1,200,23,204,24,200,23,204,2,204,24,204,2,212,9,187,35,185,44,186,-3,187,35,186,-3,195,-1,187,35,195,-1,190,28,147,17,151,7,152,222,152,222,151,7,157,0,152,222,157,0,162,215,162,215,157,0,166,-3,162,215,166,-3,170,208,170,208,166,-3,176,-4,170,208,176,-4,176,199,176,199,176,-4,186,-3,176,199,186,-3,180,191,152,222,140,226,142,190,152,222,142,190,143,173,152,222,143,173,143,134,152,222,143,134,144,31,152,222,144,31,147,17,143,31,144,31,143,134,143,146,143,134,143,173,111,230,104,218,117,216,111,230,117,216,127,229,127,229,117,216,128,211,127,229,128,211,140,226,140,226,128,211,136,202,140,226,136,202,142,190,216,29,212,27,212,9,216,29,212,9,221,19,216,29,221,19,221,33,208,25,204,24,212,9,208,25,212,9,212,27,200,23,195,-1,204,2,180,319,175,309,180,284,180,319,180,284,188,299,180,319,188,299,195,319,170,302,165,297,169,274,170,302,169,274,180,284,170,302,180,284,175,309,76,208,83,213,85,227,85,227,83,213,93,217,85,227,93,217,98,229,98,229,93,217,104,218,98,229,104,218,111,230,73,224,70,194,71,201,73,224,71,201,76,208,73,224,76,208,85,227,70,194,63,156,68,161,29,183,29,167,32,192,32,192,29,167,33,161,32,192,33,161,37,200,37,200,33,161,37,156,37,200,37,156,44,208,143,31,143,134,143,64,143,31,143,64,143,56,143,31,143,56,142,49,143,31,142,49,138,43,143,31,138,43,133,38,143,31,133,38,128,16,128,16,133,38,126,32,126,32,121,29,128,16,128,16,121,29,115,27,128,16,115,27,113,6,113,6,115,27,109,25,113,6,109,25,103,24,99,114,111,121,114,135,114,135,111,121,126,127,114,135,126,127,143,146,143,146,126,127,143,134,65,79,68,87,75,118,75,118,68,87,73,94,75,118,73,94,79,101,79,101,88,108,92,126,92,126,88,108,99,114,92,126,99,114,114,135,92,126,75,118,79,101,72,182,71,185,71,167,72,182,71,167,73,172,72,182,73,172,72,178,70,189,70,194,71,167,70,189,71,167,71,185,63,112,54,105,54,-2,63,112,54,-2,63,63,63,112,63,63,63,71,63,112,63,71,65,79,63,112,65,79,75,118,63,63,54,-2,64,48,64,48,54,-2,71,-4,64,48,71,-4,69,38,69,38,71,-4,76,30,20,62,21,29,25,75,25,75,21,29,28,14,25,75,28,14,33,87,33,87,28,14,39,4,33,87,39,4,42,97,42,97,39,4,54,-2,42,97,54,-2,54,105,84,-3,98,0,86,25,86,25,98,0,97,24,103,24,97,24,98,0,103,24,98,0,113,6,76,30,71,-4,84,-3,76,30,84,-3,86,25,21,29,20,62,18,47,29,167,29,183,28,175,160,295,169,274,165,297,184,56,186,-3,185,44,
-186,286,185,294,182,301,176,306,169,310,161,311,154,310,147,306,142,301,138,294,137,286,138,278,142,272,147,266,153,263,161,262,169,263,176,266,182,272,185,278,186,286,16383,16383,87,286,86,294,82,301,77,306,70,310,62,311,54,310,48,306,42,301,39,294,37,286,39,278,42,272,47,266,54,263,61,262,69,263,76,266,82,272,86,278,87,286,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,162,306,159,322,152,336,142,347,128,354,113,357,97,354,83,347,72,336,65,323,63,307,65,291,72,277,83,267,96,260,112,257,128,260,141,267,152,277,159,291,162,306,16383,16383,145,307,143,296,139,287,132,280,122,276,112,274,101,276,92,280,85,287,81,296,79,307,81,317,86,326,93,333,102,338,112,339,122,338,131,333,139,326,143,317,145,307,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,
+186,286,185,294,182,301,176,306,169,310,161,311,154,310,147,306,142,301,138,294,137,286,138,278,142,272,147,266,153,263,161,262,169,263,176,266,182,272,185,278,186,286,16383,16383,87,286,86,294,82,301,77,306,70,310,62,311,54,310,48,306,42,301,39,294,37,286,39,278,42,272,47,266,54,263,61,262,69,263,76,266,82,272,86,278,87,286,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,
 161,311,161,262,169,310,169,310,161,262,169,263,169,310,169,263,176,306,176,306,169,263,176,266,176,306,176,266,182,301,182,301,176,266,182,272,182,301,182,272,185,294,185,294,182,272,185,278,185,294,185,278,186,286,137,286,138,278,138,294,138,294,138,278,142,272,138,294,142,272,142,301,142,301,142,272,147,266,142,301,147,266,147,306,147,306,147,266,153,263,147,306,153,263,154,310,154,310,153,263,161,262,154,310,161,262,161,311,184,56,184,152,184,168,184,56,184,168,183,181,184,56,183,181,180,191,184,56,180,191,186,-3,190,28,195,-1,195,25,195,25,195,-1,200,23,204,24,200,23,204,2,204,24,204,2,212,9,187,35,185,44,186,-3,187,35,186,-3,195,-1,187,35,195,-1,190,28,147,17,151,7,152,222,152,222,151,7,157,0,152,222,157,0,162,215,162,215,157,0,166,-3,162,215,166,-3,170,208,170,208,166,-3,176,-4,170,208,176,-4,176,199,176,199,176,-4,186,-3,176,199,186,-3,180,191,152,222,140,226,142,190,152,222,142,190,143,173,152,222,143,173,143,134,152,222,143,134,144,31,152,222,144,31,147,17,143,31,144,31,143,134,143,146,143,134,143,173,111,230,104,218,117,216,111,230,117,216,127,229,127,229,117,216,128,211,127,229,128,211,140,226,140,226,128,211,136,202,140,226,136,202,142,190,216,29,212,27,212,9,216,29,212,9,221,19,216,29,221,19,221,33,208,25,204,24,212,9,208,25,212,9,212,27,200,23,195,-1,204,2,37,286,39,278,39,294,39,294,39,278,42,272,39,294,42,272,42,301,42,301,42,272,47,266,42,301,47,266,48,306,48,306,47,266,54,263,48,306,54,263,54,310,54,310,54,263,61,262,54,310,61,262,62,311,62,311,61,262,69,263,62,311,69,263,70,310,70,310,69,263,76,266,70,310,76,266,77,306,77,306,76,266,82,272,77,306,82,272,82,301,82,301,82,272,86,278,82,301,86,278,86,294,86,294,86,278,87,286,37,156,43,153,44,208,44,208,43,153,50,152,44,208,50,152,54,215,54,215,50,152,57,153,54,215,57,153,63,220,63,220,57,153,63,156,63,220,63,156,73,224,73,224,63,156,70,194,71,167,70,194,68,161,76,208,83,213,85,227,85,227,83,213,93,217,85,227,93,217,98,229,98,229,93,217,104,218,98,229,104,218,111,230,73,224,70,194,71,201,73,224,71,201,76,208,73,224,76,208,85,227,70,194,63,156,68,161,29,183,29,167,32,192,32,192,29,167,33,161,32,192,33,161,37,200,37,200,33,161,37,156,37,200,37,156,44,208,143,31,143,134,143,64,143,31,143,64,143,56,143,31,143,56,142,49,143,31,142,49,138,43,143,31,138,43,133,38,143,31,133,38,128,16,128,16,133,38,126,32,126,32,121,29,128,16,128,16,121,29,115,27,128,16,115,27,113,6,113,6,115,27,109,25,113,6,109,25,103,24,99,114,111,121,114,135,114,135,111,121,126,127,114,135,126,127,143,146,143,146,126,127,143,134,65,79,68,87,75,118,75,118,68,87,73,94,75,118,73,94,79,101,79,101,88,108,92,126,92,126,88,108,99,114,92,126,99,114,114,135,92,126,75,118,79,101,72,182,71,185,71,167,72,182,71,167,73,172,72,182,73,172,72,178,70,189,70,194,71,167,70,189,71,167,71,185,63,112,54,105,54,-2,63,112,54,-2,63,63,63,112,63,63,63,71,63,112,63,71,65,79,63,112,65,79,75,118,63,63,54,-2,64,48,64,48,54,-2,71,-4,64,48,71,-4,69,38,69,38,71,-4,76,30,20,62,21,29,25,75,25,75,21,29,28,14,25,75,28,14,33,87,33,87,28,14,39,4,33,87,39,4,42,97,42,97,39,4,54,-2,42,97,54,-2,54,105,84,-3,98,0,86,25,86,25,98,0,97,24,103,24,97,24,98,0,103,24,98,0,113,6,76,30,71,-4,84,-3,76,30,84,-3,86,25,21,29,20,62,18,47,29,167,29,183,28,175,184,56,186,-3,185,44,
-162,306,159,322,152,336,142,347,128,354,113,357,97,354,83,347,72,336,65,323,63,307,65,291,72,277,83,267,96,260,112,257,128,260,141,267,152,277,159,291,162,306,16383,16383,145,307,143,296,139,287,132,280,122,276,112,274,101,276,92,280,85,287,81,296,79,307,81,317,86,326,93,333,102,338,112,339,122,338,131,333,139,326,143,317,145,307,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,310,77,296,58,283,44,269,35,254,30,238,28,226,30,215,33,205,38,197,45,190,54,185,65,181,78,179,93,178,112,177,138,308,138,302,173,292,199,277,216,255,227,228,230,215,229,203,227,192,222,181,216,169,206,157,216,147,222,136,227,123,229,109,230,84,227,62,220,45,208,34,193,30,176,31,168,34,161,38,156,44,153,52,152,59,153,66,156,70,161,73,167,74,175,74,185,73,188,73,196,74,203,79,208,86,213,96,216,107,217,119,215,127,210,133,202,136,189,137,172,137,141,73,123,48,112,32,99,24,84,20,68,19,50,22,32,30,17,42,6,58,0,77,-2,91,-1,105,1,119,7,134,17,153,31,164,18,175,8,188,1,202,-1,218,-2,230,-2,243,0,254,3,266,9,276,17,285,24,293,33,300,44,308,58,316,75,16383,16383,177,153,180,177,186,194,194,206,206,212,221,214,235,212,246,206,254,194,259,177,261,153,16383,16383,137,100,138,90,140,68,146,46,146,45,147,45,147,44,143,38,134,31,121,25,108,21,95,19,83,21,74,28,67,37,64,49,63,63,64,79,71,92,85,103,106,114,137,127,199,78,185,60,172,46,159,38,144,33,128,31,103,36,81,49,65,69,54,96,51,128,54,157,63,181,78,200,96,211,119,215,128,215,136,212,141,208,145,201,148,191,151,180,154,172,159,166,163,161,169,158,175,157,183,158,189,161,
+162,306,159,322,152,336,142,347,128,354,113,357,97,354,83,347,72,336,65,323,63,307,65,291,72,277,83,267,96,260,112,257,128,260,141,267,152,277,159,291,162,306,16383,16383,145,307,143,296,139,287,132,280,122,276,112,274,101,276,92,280,85,287,81,296,79,307,81,317,86,326,93,333,102,338,112,339,122,338,131,333,139,326,143,317,145,307,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,
 143,296,139,287,141,267,141,267,139,287,132,280,141,267,132,280,128,260,128,260,132,280,122,276,128,260,122,276,112,257,112,257,122,276,112,274,63,307,65,291,65,323,65,323,65,291,72,277,65,323,72,277,72,336,72,336,72,277,83,267,72,336,83,267,79,307,79,307,83,347,72,336,37,156,43,153,44,208,44,208,43,153,50,152,44,208,50,152,54,215,54,215,50,152,57,153,54,215,57,153,63,220,63,220,57,153,63,156,63,220,63,156,73,224,73,224,63,156,70,194,71,167,70,194,68,161,111,230,104,218,117,216,111,230,117,216,127,229,127,229,117,216,128,211,127,229,128,211,140,226,140,226,128,211,136,202,140,226,136,202,142,190,76,208,83,213,85,227,85,227,83,213,93,217,85,227,93,217,98,229,98,229,93,217,104,218,98,229,104,218,111,230,73,224,70,194,71,201,73,224,71,201,76,208,73,224,76,208,85,227,70,194,63,156,68,161,29,183,29,167,32,192,32,192,29,167,33,161,32,192,33,161,37,200,37,200,33,161,37,156,37,200,37,156,44,208,113,357,112,339,122,338,113,357,122,338,128,354,128,354,122,338,131,333,128,354,131,333,142,347,142,347,131,333,139,326,142,347,139,326,143,317,184,56,184,152,184,168,184,56,184,168,183,181,184,56,183,181,180,191,184,56,180,191,186,-3,190,28,195,-1,195,25,195,25,195,-1,200,23,204,24,200,23,204,2,204,24,204,2,212,9,187,35,185,44,186,-3,187,35,186,-3,195,-1,187,35,195,-1,190,28,147,17,151,7,152,222,152,222,151,7,157,0,152,222,157,0,162,215,162,215,157,0,166,-3,162,215,166,-3,170,208,170,208,166,-3,176,-4,170,208,176,-4,176,199,176,199,176,-4,186,-3,176,199,186,-3,180,191,152,222,140,226,142,190,152,222,142,190,143,173,152,222,143,173,143,134,152,222,143,134,144,31,152,222,144,31,147,17,143,31,144,31,143,134,143,146,143,134,143,173,216,29,212,27,212,9,216,29,212,9,221,19,216,29,221,19,221,33,208,25,204,24,212,9,208,25,212,9,212,27,200,23,195,-1,204,2,162,306,159,322,159,291,159,291,159,322,152,336,159,291,152,336,152,277,152,277,152,336,145,307,143,317,145,307,152,336,143,317,152,336,142,347,143,296,141,267,152,277,143,296,152,277,145,307,86,326,93,333,97,354,97,354,93,333,102,338,97,354,102,338,113,357,113,357,102,338,112,339,83,347,79,307,81,317,83,347,81,317,86,326,83,347,86,326,97,354,101,276,92,280,96,260,101,276,96,260,112,257,101,276,112,257,112,274,85,287,81,296,83,267,85,287,83,267,96,260,85,287,96,260,92,280,143,31,143,134,143,64,143,31,143,64,143,56,143,31,143,56,142,49,143,31,142,49,138,43,143,31,138,43,133,38,143,31,133,38,128,16,128,16,133,38,126,32,126,32,121,29,128,16,128,16,121,29,115,27,128,16,115,27,113,6,113,6,115,27,109,25,113,6,109,25,103,24,99,114,111,121,114,135,114,135,111,121,126,127,114,135,126,127,143,146,143,146,126,127,143,134,65,79,68,87,75,118,75,118,68,87,73,94,75,118,73,94,79,101,79,101,88,108,92,126,92,126,88,108,99,114,92,126,99,114,114,135,92,126,75,118,79,101,72,182,71,185,71,167,72,182,71,167,73,172,72,182,73,172,72,178,70,189,70,194,71,167,70,189,71,167,71,185,63,112,54,105,54,-2,63,112,54,-2,63,63,63,112,63,63,63,71,63,112,63,71,65,79,63,112,65,79,75,118,63,63,54,-2,64,48,64,48,54,-2,71,-4,64,48,71,-4,69,38,69,38,71,-4,76,30,20,62,21,29,25,75,25,75,21,29,28,14,25,75,28,14,33,87,33,87,28,14,39,4,33,87,39,4,42,97,42,97,39,4,54,-2,42,97,54,-2,54,105,84,-3,98,0,86,25,86,25,98,0,97,24,103,24,97,24,98,0,103,24,98,0,113,6,76,30,71,-4,84,-3,76,30,84,-3,86,25,21,29,20,62,18,47,79,307,83,267,81,296,184,56,186,-3,185,44,29,167,29,183,28,175,
-310,77,296,58,283,44,269,35,254,30,238,28,226,30,215,33,205,38,197,45,190,54,185,65,181,78,179,93,178,112,177,138,308,138,302,173,292,199,277,216,255,227,228,230,215,229,203,227,192,222,181,216,169,206,157,216,147,222,136,227,123,229,109,230,84,227,62,220,45,208,34,193,30,176,31,168,34,161,38,156,44,153,52,152,59,153,66,156,70,161,73,167,74,175,74,185,73,188,73,196,74,203,79,208,86,213,96,216,107,217,119,215,127,210,133,202,136,189,137,172,137,141,73,123,48,112,32,99,24,84,20,68,19,50,22,32,30,17,42,6,58,0,77,-2,91,-1,105,1,119,7,134,17,153,31,164,18,175,8,188,1,202,-1,218,-2,230,-2,243,0,254,3,266,9,276,17,285,24,293,33,300,44,308,58,316,75,16383,16383,177,153,180,177,186,194,194,206,206,212,221,214,235,212,246,206,254,194,259,177,261,153,16383,16383,137,100,138,90,140,68,146,46,146,45,147,45,147,44,143,38,134,31,121,25,108,21,95,19,83,21,74,28,67,37,64,49,63,63,64,79,71,92,85,103,106,114,137,127,199,78,185,60,172,46,159,38,144,33,128,31,103,36,81,49,65,69,54,96,51,128,54,157,63,181,78,200,96,211,119,215,128,215,136,212,141,208,145,201,148,191,151,180,154,172,159,166,163,161,169,158,175,157,183,158,189,161,195,166,198,172,199,179,195,195,184,209,167,220,146,227,122,230,108,229,94,226,80,220,67,213,55,204,40,189,28,172,19,152,14,130,12,106,16,72,27,43,45,20,68,4,96,-3,77,-49,80,-51,83,-50,85,-50,88,-49,94,-49,104,-50,112,-52,117,-55,120,-60,121,-67,120,-74,116,-81,111,-85,103,-88,94,-89,88,-89,82,-88,75,-87,69,-86,61,-83,54,-98,63,-102,79,-106,87,-106,96,-107,117,-105,135,-99,148,-91,156,-79,158,-64,157,-52,151,-43,142,-36,130,-32,116,-30,108,-30,105,-31,103,-31,113,-4,136,0,156,9,174,24,190,46,206,74,155,253,83,328,78,332,74,335,69,337,61,339,55,338,50,336,46,333,44,329,43,323,44,318,46,314,49,309,53,305,58,301,135,253,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,
+310,77,296,58,283,44,269,35,254,30,238,28,226,30,215,33,205,38,197,45,190,54,185,65,181,78,179,93,178,112,177,138,308,138,302,173,292,199,277,216,255,227,228,230,215,229,203,227,192,222,181,216,169,206,157,216,147,222,136,227,123,229,109,230,84,227,62,220,45,208,34,193,30,176,31,168,34,161,38,156,44,153,52,152,59,153,66,156,70,161,73,167,74,175,74,185,73,188,73,196,74,203,79,208,86,213,96,216,107,217,119,215,127,210,133,202,136,189,137,172,137,141,73,123,48,112,32,99,24,84,20,68,19,50,22,32,30,17,42,6,58,0,77,-2,91,-1,105,1,119,7,134,17,153,31,164,18,175,8,188,1,202,-1,218,-2,230,-2,243,0,254,3,266,9,276,17,285,24,293,33,300,44,308,58,316,75,16383,16383,177,153,180,177,186,194,194,206,206,212,221,214,235,212,246,206,254,194,259,177,261,153,16383,16383,137,100,138,90,140,68,146,46,146,45,147,45,147,44,143,38,134,31,121,25,108,21,95,19,83,21,74,28,67,37,64,49,63,63,64,79,71,92,85,103,106,114,137,127,
 73,196,73,196,73,196,73,196,74,203,62,220,73,196,62,220,66,156,73,196,66,156,70,161,143,38,134,31,134,17,134,17,134,31,121,25,134,17,121,25,119,7,119,7,121,25,108,21,119,7,108,21,105,1,105,1,108,21,95,19,105,1,95,19,91,-1,91,-1,95,19,83,21,91,-1,83,21,77,-2,77,-2,83,21,74,28,77,-2,74,28,67,37,63,63,58,0,64,49,64,49,58,0,77,-2,64,49,77,-2,67,37,74,203,79,208,84,227,84,227,79,208,86,213,84,227,86,213,109,230,109,230,86,213,96,216,109,230,96,216,107,217,107,217,119,215,109,230,109,230,119,215,123,229,175,8,177,138,169,206,175,8,169,206,164,18,164,18,169,206,157,216,164,18,157,216,153,31,153,31,157,216,147,44,147,45,147,44,147,222,147,222,147,44,157,216,147,222,136,227,136,189,147,222,136,189,137,172,147,222,137,172,137,127,147,222,137,127,138,90,147,222,138,90,139,79,147,222,139,79,140,68,147,222,140,68,143,57,147,222,143,57,146,46,147,222,146,46,146,45,147,222,146,45,147,45,137,141,137,127,137,172,136,227,123,229,127,210,136,227,127,210,133,202,136,227,133,202,136,189,228,230,221,214,235,212,228,230,235,212,255,227,255,227,235,212,246,206,255,227,246,206,254,194,177,153,180,177,181,216,181,216,180,177,186,194,181,216,186,194,192,222,192,222,186,194,194,206,192,222,194,206,203,227,203,227,194,206,206,212,203,227,206,212,215,229,215,229,206,212,221,214,215,229,221,214,228,230,277,216,261,153,308,138,308,138,261,153,177,153,308,138,177,153,177,138,169,206,177,138,177,153,169,206,177,153,181,216,259,177,261,153,277,216,259,177,277,216,255,227,259,177,255,227,254,194,292,199,277,216,308,138,292,199,308,138,302,173,226,30,215,33,218,-2,218,-2,215,33,205,38,218,-2,205,38,202,-1,202,-1,205,38,197,45,202,-1,197,45,190,54,190,54,185,65,188,1,188,1,185,65,181,78,188,1,181,78,179,93,175,8,188,1,179,93,175,8,179,93,178,112,175,8,178,112,177,138,218,-2,230,-2,226,30,226,30,230,-2,238,28,254,30,238,28,243,0,254,30,243,0,254,3,190,54,188,1,202,-1,285,24,293,33,296,58,296,58,293,33,300,44,296,58,300,44,310,77,310,77,300,44,308,58,310,77,308,58,316,75,254,3,266,9,269,35,269,35,266,9,276,17,269,35,276,17,283,44,283,44,276,17,285,24,283,44,285,24,296,58,238,28,230,-2,243,0,143,38,134,17,153,31,143,38,153,31,147,44,64,79,71,92,73,123,73,123,71,92,85,103,73,123,85,103,137,141,137,141,85,103,106,114,137,141,106,114,137,127,42,6,58,0,48,112,48,112,58,0,63,63,48,112,63,63,64,79,20,68,22,32,24,84,24,84,22,32,30,17,24,84,30,17,32,99,32,99,30,17,42,6,32,99,42,6,48,112,38,156,44,153,45,208,45,208,44,153,52,152,45,208,52,152,62,220,62,220,52,152,59,153,62,220,59,153,66,156,34,193,30,176,31,168,34,193,31,168,34,161,34,193,34,161,38,156,34,193,38,156,45,208,74,185,73,188,73,167,74,185,73,167,74,175,74,185,74,175,74,180,73,167,73,188,73,192,73,167,73,192,73,196,73,167,73,196,70,161,62,220,74,203,84,227,22,32,20,68,19,50,48,112,64,79,73,123,138,90,137,127,137,100,254,30,254,3,269,35,123,229,119,215,127,210,
-199,78,185,60,172,46,159,38,144,33,128,31,103,36,81,49,65,69,54,96,51,128,54,157,63,181,78,200,96,211,119,215,128,215,136,212,141,208,145,201,148,191,151,180,154,172,159,166,163,161,169,158,175,157,183,158,189,161,195,166,198,172,199,179,195,195,184,209,167,220,146,227,122,230,108,229,94,226,80,220,67,213,55,204,40,189,28,172,19,152,14,130,12,106,16,72,27,43,45,20,68,4,96,-3,77,-49,80,-51,83,-50,85,-50,88,-49,94,-49,104,-50,112,-52,117,-55,120,-60,121,-67,120,-74,116,-81,111,-85,103,-88,94,-89,88,-89,82,-88,75,-87,69,-86,61,-83,54,-98,63,-102,79,-106,87,-106,96,-107,117,-105,135,-99,148,-91,156,-79,158,-64,157,-52,151,-43,142,-36,130,-32,116,-30,108,-30,105,-31,103,-31,113,-4,136,0,156,9,174,24,190,46,206,74,155,253,83,328,78,332,74,335,69,337,61,339,55,338,50,336,46,333,44,329,43,323,44,318,46,314,49,309,53,305,58,301,135,253,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,151,155,58,253,78,253,155,302,161,306,165,310,168,314,170,318,170,323,169,329,167,333,163,336,158,338,152,339,148,338,145,337,141,335,137,332,132,328,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,
+199,78,185,60,172,46,159,38,144,33,128,31,103,36,81,49,65,69,54,96,51,128,54,157,63,181,78,200,96,211,119,215,128,215,136,212,141,208,145,201,148,191,151,180,154,172,159,166,163,161,169,158,175,157,183,158,189,161,195,166,198,172,199,179,195,195,184,209,167,220,146,227,122,230,108,229,94,226,80,220,67,213,55,204,40,189,28,172,19,152,14,130,12,106,16,72,27,43,45,20,68,4,96,-3,77,-49,80,-51,83,-50,85,-50,88,-49,94,-49,104,-50,112,-52,117,-55,120,-60,121,-67,120,-74,116,-81,111,-85,103,-88,94,-89,88,-89,82,-88,75,-87,69,-86,61,-83,54,-98,63,-102,79,-106,87,-106,96,-107,117,-105,135,-99,148,-91,156,-79,158,-64,157,-52,151,-43,142,-36,130,-32,116,-30,108,-30,105,-31,103,-31,113,-4,136,0,156,9,174,24,190,46,206,74,
 81,49,65,69,68,4,68,4,65,69,54,96,68,4,54,96,45,20,45,20,54,96,51,128,55,204,51,128,54,157,55,204,54,157,63,181,87,-106,96,-107,88,-89,88,-89,96,-107,94,-89,103,-88,94,-89,96,-107,103,-88,96,-107,117,-105,96,-3,94,-49,104,-50,96,-3,104,-50,103,-31,96,-3,103,-31,103,36,103,36,103,-31,113,-4,96,-3,77,-49,80,-51,96,-3,80,-51,83,-50,96,-3,83,-50,85,-50,96,-3,85,-50,88,-49,96,-3,88,-49,91,-49,96,-3,91,-49,94,-49,185,60,172,46,174,24,174,24,172,46,159,38,174,24,159,38,156,9,156,9,159,38,144,33,156,9,144,33,136,0,136,0,144,33,128,31,113,-4,136,0,128,31,113,-4,128,31,103,36,81,49,68,4,96,-3,81,49,96,-3,103,36,136,212,141,208,146,227,146,227,141,208,145,201,146,227,145,201,148,191,148,191,151,180,167,220,167,220,151,180,154,172,167,220,154,172,159,166,122,230,119,215,128,215,122,230,128,215,146,227,146,227,128,215,136,212,195,195,184,209,189,161,195,195,189,161,195,166,195,195,195,166,198,172,195,195,198,172,199,179,184,209,167,220,169,158,184,209,169,158,175,157,184,209,175,157,183,158,184,209,183,158,189,161,167,220,159,166,163,161,167,220,163,161,169,158,167,220,146,227,148,191,190,46,206,74,199,78,190,46,199,78,185,60,190,46,185,60,174,24,96,211,119,215,108,229,96,211,108,229,94,226,96,211,94,226,80,220,96,211,80,220,78,200,67,213,55,204,63,181,67,213,63,181,78,200,67,213,78,200,80,220,45,20,51,128,55,204,45,20,55,204,40,189,45,20,40,189,28,172,45,20,28,172,27,43,19,152,14,130,16,72,19,152,16,72,27,43,19,152,27,43,28,172,158,-64,157,-52,156,-79,156,-79,157,-52,151,-43,156,-79,151,-43,148,-91,148,-91,151,-43,142,-36,148,-91,142,-36,135,-99,135,-99,142,-36,130,-32,135,-99,130,-32,121,-67,121,-67,130,-32,120,-60,117,-55,120,-60,130,-32,117,-55,130,-32,116,-30,117,-55,116,-30,113,-30,117,-55,113,-30,112,-52,112,-52,113,-30,110,-30,112,-52,110,-30,108,-30,112,-52,108,-30,105,-31,112,-52,105,-31,104,-50,135,-99,121,-67,120,-74,135,-99,120,-74,117,-105,117,-105,120,-74,116,-81,117,-105,116,-81,111,-85,61,-83,63,-102,69,-86,69,-86,63,-102,71,-104,69,-86,71,-104,75,-87,75,-87,71,-104,79,-106,75,-87,79,-106,82,-88,82,-88,79,-106,87,-106,82,-88,87,-106,88,-89,63,-102,61,-83,54,-98,103,-88,117,-105,111,-85,103,-31,104,-50,105,-31,119,215,122,230,108,229,16,72,14,130,12,106,
-155,253,83,328,78,332,74,335,69,337,61,339,55,338,50,336,46,333,44,329,43,323,44,318,46,314,49,309,53,305,58,301,135,253,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,151,155,58,253,78,253,155,302,161,306,165,310,168,314,170,318,170,323,169,329,167,333,163,336,158,338,152,339,148,338,145,337,141,335,137,332,132,328,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,
+155,253,83,328,78,332,74,335,69,337,61,339,55,338,50,336,46,333,44,329,43,323,44,318,46,314,49,309,53,305,58,301,135,253,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,151,155,
 56,85,75,0,62,71,62,71,75,0,71,57,80,47,71,57,75,0,80,47,75,0,108,-4,52,100,50,118,49,15,52,100,49,15,75,0,52,100,75,0,56,85,12,108,17,70,17,148,17,148,17,70,29,39,17,148,29,39,31,182,31,182,29,39,49,15,31,182,49,15,49,138,49,138,49,15,50,118,135,253,155,253,83,328,135,253,83,328,78,332,135,253,78,332,74,335,135,253,74,335,69,337,135,253,69,337,65,338,135,253,65,338,61,339,135,253,61,339,58,301,43,323,44,318,44,329,44,329,44,318,46,314,44,329,46,314,46,333,46,333,46,314,49,309,46,333,49,309,50,336,50,336,49,309,53,305,50,336,53,305,55,338,55,338,53,305,58,301,55,338,58,301,61,339,133,228,116,230,120,210,120,210,116,230,103,212,87,210,103,212,116,230,87,210,116,230,81,224,190,62,176,48,181,26,181,26,176,48,162,37,181,26,162,37,160,9,160,9,162,37,146,31,160,9,146,31,136,-1,136,-1,146,31,127,30,203,138,201,153,198,166,203,138,198,166,195,177,203,138,195,177,190,186,203,138,190,186,185,195,203,138,185,195,175,207,203,138,175,207,163,217,203,138,163,217,151,155,203,138,151,155,50,155,203,138,50,155,49,138,141,192,147,176,149,224,149,224,147,176,151,155,149,224,151,155,163,217,198,49,212,79,204,82,198,49,204,82,190,62,198,49,190,62,181,26,114,31,101,34,108,-4,114,31,108,-4,136,-1,114,31,136,-1,127,30,90,39,80,47,108,-4,90,39,108,-4,101,34,133,228,120,210,133,203,133,228,133,203,141,192,133,228,141,192,149,224,50,155,55,175,52,207,52,207,55,175,63,191,52,207,63,191,81,224,81,224,63,191,74,203,81,224,74,203,87,210,52,207,31,182,49,138,52,207,49,138,50,155,
-58,253,78,253,155,302,161,306,165,310,168,314,170,318,170,323,169,329,167,333,163,336,158,338,152,339,148,338,145,337,141,335,137,332,132,328,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,151,155,190,253,127,337,97,337,35,253,51,253,112,305,173,253,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,151,155,186,286,185,294,181,301,176,306,169,310,161,311,153,310,147,306,141,301,138,294,137,286,
+58,253,78,253,155,302,161,306,165,310,168,314,170,318,170,323,169,329,167,333,163,336,158,338,152,339,148,338,145,337,141,335,137,332,132,328,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,151,155,
 203,138,201,153,198,166,203,138,198,166,195,177,203,138,195,177,190,186,203,138,190,186,185,195,203,138,185,195,175,207,203,138,175,207,163,217,203,138,163,217,151,155,203,138,151,155,50,155,203,138,50,155,49,138,141,192,147,176,149,224,149,224,147,176,151,155,149,224,151,155,163,217,152,339,155,302,158,338,158,338,155,302,161,306,158,338,161,306,163,336,163,336,161,306,165,310,163,336,165,310,167,333,167,333,165,310,168,314,167,333,168,314,169,329,169,329,168,314,170,318,169,329,170,318,170,323,155,302,152,339,148,338,155,302,148,338,145,337,155,302,145,337,141,335,155,302,141,335,137,332,155,302,137,332,132,328,155,302,132,328,78,253,52,100,50,118,49,15,49,15,50,118,49,138,49,15,49,138,31,182,49,15,31,182,29,39,29,39,31,182,17,148,29,39,17,148,17,70,17,70,17,148,12,108,133,228,116,230,120,210,120,210,116,230,103,212,87,210,103,212,116,230,87,210,116,230,81,224,190,62,176,48,181,26,181,26,176,48,162,37,181,26,162,37,160,9,160,9,162,37,146,31,160,9,146,31,136,-1,136,-1,146,31,127,30,198,49,212,79,204,82,198,49,204,82,190,62,198,49,190,62,181,26,114,31,101,34,108,-4,114,31,108,-4,136,-1,114,31,136,-1,127,30,101,34,90,39,108,-4,108,-4,90,39,80,47,108,-4,80,47,75,0,75,0,80,47,71,57,133,228,120,210,133,203,133,228,133,203,141,192,133,228,141,192,149,224,50,155,55,175,52,207,52,207,55,175,63,191,52,207,63,191,81,224,81,224,63,191,74,203,81,224,74,203,87,210,52,207,31,182,49,138,52,207,49,138,50,155,75,0,71,57,62,71,75,0,62,71,56,85,75,0,56,85,52,100,75,0,52,100,49,15,78,253,132,328,58,253,
-190,253,127,337,97,337,35,253,51,253,112,305,173,253,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,151,155,186,286,185,294,181,301,176,306,169,310,161,311,153,310,147,306,141,301,138,294,137,286,138,278,141,272,146,266,153,263,161,262,169,263,176,266,181,272,185,278,186,286,16383,16383,86,286,85,294,82,301,76,306,69,310,61,311,54,310,47,306,42,301,38,294,37,286,38,278,41,272,47,266,53,263,61,262,69,263,76,266,81,272,85,278,86,286,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,
+190,253,127,337,97,337,35,253,51,253,112,305,173,253,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,151,155,
 35,253,51,253,97,337,97,337,51,253,112,305,97,337,112,305,127,337,127,337,112,305,173,253,127,337,173,253,190,253,52,100,50,118,49,15,49,15,50,118,49,138,49,15,49,138,31,182,49,15,31,182,29,39,29,39,31,182,17,148,29,39,17,148,17,70,17,70,17,148,12,108,133,228,116,230,120,210,120,210,116,230,103,212,87,210,103,212,116,230,87,210,116,230,81,224,190,62,176,48,181,26,181,26,176,48,162,37,181,26,162,37,160,9,160,9,162,37,146,31,160,9,146,31,136,-1,136,-1,146,31,127,30,203,138,201,153,198,166,203,138,198,166,195,177,203,138,195,177,190,186,203,138,190,186,185,195,203,138,185,195,175,207,203,138,175,207,163,217,203,138,163,217,151,155,203,138,151,155,50,155,203,138,50,155,49,138,141,192,147,176,149,224,149,224,147,176,151,155,149,224,151,155,163,217,198,49,212,79,204,82,198,49,204,82,190,62,198,49,190,62,181,26,114,31,101,34,108,-4,114,31,108,-4,136,-1,114,31,136,-1,127,30,101,34,90,39,108,-4,108,-4,90,39,80,47,108,-4,80,47,75,0,75,0,80,47,71,57,133,228,120,210,133,203,133,228,133,203,141,192,133,228,141,192,149,224,50,155,55,175,52,207,52,207,55,175,63,191,52,207,63,191,81,224,81,224,63,191,74,203,81,224,74,203,87,210,52,207,31,182,49,138,52,207,49,138,50,155,75,0,71,57,62,71,75,0,62,71,56,85,75,0,56,85,52,100,75,0,52,100,49,15,
-186,286,185,294,181,301,176,306,169,310,161,311,153,310,147,306,141,301,138,294,137,286,138,278,141,272,146,266,153,263,161,262,169,263,176,266,181,272,185,278,186,286,16383,16383,86,286,85,294,82,301,76,306,69,310,61,311,54,310,47,306,42,301,38,294,37,286,38,278,41,272,47,266,53,263,61,262,69,263,76,266,81,272,85,278,86,286,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,151,155,115,253,42,328,38,332,33,335,29,337,21,339,15,338,10,336,6,333,4,329,3,323,3,318,5,314,8,309,18,301,95,253,16383,16383,122,0,122,7,105,9,94,14,88,21,85,34,84,52,84,228,82,230,5,203,5,195,15,197,26,197,33,196,37,193,40,187,42,178,42,33,38,20,32,13,20,9,3,7,3,0,25,253,45,253,122,302,127,306,131,310,134,314,136,318,137,323,136,329,134,333,130,336,125,338,119,339,111,337,107,335,103,332,98,328,16383,16383,127,0,127,7,110,9,99,14,93,21,90,34,89,52,89,228,87,230,10,203,10,195,20,197,31,197,38,196,42,193,45,187,47,178,47,33,43,20,37,13,25,9,8,7,8,0,147,253,84,337,54,337,-7,253,8,253,69,305,130,253,16383,16383,110,0,110,7,93,9,83,14,77,21,74,34,73,52,73,228,
+186,286,185,294,181,301,176,306,169,310,161,311,153,310,147,306,141,301,138,294,137,286,138,278,141,272,146,266,153,263,161,262,169,263,176,266,181,272,185,278,186,286,16383,16383,86,286,85,294,82,301,76,306,69,310,61,311,54,310,47,306,42,301,38,294,37,286,38,278,41,272,47,266,53,263,61,262,69,263,76,266,81,272,85,278,86,286,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,151,155,
 203,138,201,153,198,166,203,138,198,166,195,177,203,138,195,177,190,186,203,138,190,186,185,195,203,138,185,195,175,207,203,138,175,207,163,217,203,138,163,217,151,155,203,138,151,155,50,155,203,138,50,155,49,138,141,192,147,176,149,224,149,224,147,176,151,155,149,224,151,155,163,217,137,286,138,278,138,294,138,294,138,278,141,272,138,294,141,272,141,301,141,301,141,272,146,266,141,301,146,266,147,306,147,306,146,266,153,263,147,306,153,263,153,310,153,310,153,263,161,262,153,310,161,262,161,311,161,311,161,262,169,263,161,311,169,263,169,310,169,310,169,263,176,266,169,310,176,266,176,306,176,306,176,266,181,272,176,306,181,272,181,301,181,301,181,272,185,278,181,301,185,278,185,294,185,294,185,278,186,286,37,286,38,278,38,294,38,294,38,278,41,272,38,294,41,272,42,301,42,301,41,272,47,266,42,301,47,266,47,306,47,306,47,266,53,263,47,306,53,263,54,310,54,310,53,263,61,262,54,310,61,262,61,311,61,311,61,262,69,263,61,311,69,263,69,310,69,310,69,263,76,266,69,310,76,266,76,306,76,306,76,266,81,272,76,306,81,272,82,301,82,301,81,272,85,278,82,301,85,278,85,294,85,294,85,278,86,286,52,100,50,118,49,15,49,15,50,118,49,138,49,15,49,138,31,182,49,15,31,182,29,39,29,39,31,182,17,148,29,39,17,148,17,70,17,70,17,148,12,108,133,228,116,230,120,210,120,210,116,230,103,212,87,210,103,212,116,230,87,210,116,230,81,224,190,62,176,48,181,26,181,26,176,48,162,37,181,26,162,37,160,9,160,9,162,37,146,31,160,9,146,31,136,-1,136,-1,146,31,127,30,198,49,212,79,204,82,198,49,204,82,190,62,198,49,190,62,181,26,114,31,101,34,108,-4,114,31,108,-4,136,-1,114,31,136,-1,127,30,101,34,90,39,108,-4,108,-4,90,39,80,47,108,-4,80,47,75,0,75,0,80,47,71,57,133,228,120,210,133,203,133,228,133,203,141,192,133,228,141,192,149,224,50,155,55,175,52,207,52,207,55,175,63,191,52,207,63,191,81,224,81,224,63,191,74,203,81,224,74,203,87,210,52,207,31,182,49,138,52,207,49,138,50,155,75,0,71,57,62,71,75,0,62,71,56,85,75,0,56,85,52,100,75,0,52,100,49,15,
-115,253,42,328,38,332,33,335,29,337,21,339,15,338,10,336,6,333,4,329,3,323,3,318,5,314,8,309,18,301,95,253,16383,16383,122,0,122,7,105,9,94,14,88,21,85,34,84,52,84,228,82,230,5,203,5,195,15,197,26,197,33,196,37,193,40,187,42,178,42,33,38,20,32,13,20,9,3,7,3,0,25,253,45,253,122,302,127,306,131,310,134,314,136,318,137,323,136,329,134,333,130,336,125,338,119,339,111,337,107,335,103,332,98,328,16383,16383,127,0,127,7,110,9,99,14,93,21,90,34,89,52,89,228,87,230,10,203,10,195,20,197,31,197,38,196,42,193,45,187,47,178,47,33,43,20,37,13,25,9,8,7,
+115,253,42,328,38,332,33,335,29,337,21,339,15,338,10,336,6,333,4,329,3,323,3,318,5,314,8,309,18,301,95,253,16383,16383,122,0,122,7,105,9,94,14,88,21,85,34,84,52,84,228,82,230,5,203,5,195,15,197,26,197,33,196,37,193,40,187,42,178,42,33,38,20,32,13,20,9,3,7,3,0,
 95,253,115,253,42,328,95,253,42,328,38,332,95,253,38,332,33,335,95,253,33,335,29,337,95,253,29,337,25,338,95,253,25,338,21,339,95,253,21,339,18,301,3,323,3,318,4,329,4,329,3,318,5,314,4,329,5,314,6,333,6,333,5,314,8,309,6,333,8,309,10,336,10,336,8,309,13,305,10,336,13,305,15,338,15,338,13,305,18,301,15,338,18,301,21,339,38,20,32,13,122,0,122,0,32,13,20,9,122,0,20,9,3,7,15,197,19,197,82,230,82,230,19,197,23,197,82,230,23,197,26,197,26,197,33,196,82,230,82,230,33,196,37,193,82,230,37,193,40,187,38,20,122,0,42,33,42,33,122,0,94,14,42,33,94,14,42,52,42,52,94,14,88,21,42,52,88,21,42,166,42,178,42,166,82,230,42,178,82,230,40,187,10,196,15,197,82,230,10,196,82,230,5,203,10,196,5,203,5,195,84,52,84,228,82,230,84,52,82,230,42,166,84,52,42,166,85,34,105,9,94,14,122,0,105,9,122,0,122,7,122,0,3,7,3,0,42,166,88,21,85,34,
-25,253,45,253,122,302,127,306,131,310,134,314,136,318,137,323,136,329,134,333,130,336,125,338,119,339,111,337,107,335,103,332,98,328,16383,16383,127,0,127,7,110,9,99,14,93,21,90,34,89,52,89,228,87,230,10,203,10,195,20,197,31,197,38,196,42,193,45,187,47,178,47,33,43,20,37,13,25,9,8,7,8,0,147,253,84,337,54,337,-7,253,8,253,69,305,130,253,16383,16383,110,0,110,7,93,9,83,14,77,21,74,34,73,52,73,228,70,230,-6,203,-6,195,0,196,3,197,15,197,21,196,26,193,29,187,31,178,31,52,30,33,27,20,21,13,9,9,-7,7,-7,0,144,286,143,294,139,301,133,306,127,310,119,311,111,310,104,306,
+25,253,45,253,122,302,127,306,131,310,134,314,136,318,137,323,136,329,134,333,130,336,125,338,119,339,111,337,107,335,103,332,98,328,16383,16383,127,0,127,7,110,9,99,14,93,21,90,34,89,52,89,228,87,230,10,203,10,195,20,197,31,197,38,196,42,193,45,187,47,178,47,33,43,20,37,13,25,9,8,7,8,0,
 119,339,122,302,125,338,125,338,122,302,127,306,125,338,127,306,130,336,130,336,127,306,131,310,130,336,131,310,134,333,134,333,131,310,134,314,134,333,134,314,136,329,136,329,134,314,136,318,136,329,136,318,137,323,122,302,119,339,115,338,122,302,115,338,111,337,122,302,111,337,107,335,122,302,107,335,103,332,122,302,103,332,98,328,122,302,98,328,45,253,43,20,37,13,127,0,127,0,37,13,25,9,127,0,25,9,8,7,20,197,24,197,87,230,87,230,24,197,28,197,87,230,28,197,31,197,31,197,38,196,87,230,87,230,38,196,42,193,87,230,42,193,45,187,43,20,127,0,47,33,47,33,127,0,99,14,47,33,99,14,47,52,47,52,99,14,93,21,47,52,93,21,47,166,47,178,47,166,87,230,47,178,87,230,45,187,15,196,20,197,87,230,15,196,87,230,10,203,15,196,10,203,10,195,89,52,89,228,87,230,89,52,87,230,47,166,89,52,47,166,90,34,110,9,99,14,127,0,110,9,127,0,127,7,127,0,8,7,8,0,47,166,93,21,90,34,45,253,98,328,25,253,
-147,253,84,337,54,337,-7,253,8,253,69,305,130,253,16383,16383,110,0,110,7,93,9,83,14,77,21,74,34,73,52,73,228,70,230,-6,203,-6,195,0,196,3,197,15,197,21,196,26,193,29,187,31,178,31,52,30,33,27,20,21,13,9,9,-7,7,-7,0,144,286,143,294,139,301,133,306,127,310,119,311,111,310,104,306,99,301,96,294,94,286,96,278,99,272,104,266,111,263,118,262,126,263,133,266,139,272,143,278,144,286,16383,16383,45,286,43,294,40,301,34,306,27,310,20,311,12,310,5,306,0,301,-3,294,-4,286,
+147,253,84,337,54,337,-7,253,8,253,69,305,130,253,16383,16383,110,0,110,7,93,9,83,14,77,21,74,34,73,52,73,228,70,230,-6,203,-6,195,0,196,3,197,15,197,21,196,26,193,29,187,31,178,31,52,30,33,27,20,21,13,9,9,-7,7,-7,0,
 -7,253,8,253,54,337,54,337,8,253,69,305,54,337,69,305,84,337,84,337,69,305,130,253,84,337,130,253,147,253,27,20,21,13,110,0,110,0,21,13,9,9,110,0,9,9,-7,7,3,197,8,197,70,230,70,230,8,197,11,197,70,230,11,197,15,197,15,197,21,196,70,230,70,230,21,196,26,193,70,230,26,193,29,187,31,166,31,52,77,21,31,166,77,21,74,34,31,166,74,34,73,52,31,166,73,52,70,230,31,166,70,230,31,178,0,196,3,197,70,230,0,196,70,230,-6,203,0,196,-6,203,-6,195,73,52,73,228,70,230,110,0,110,7,93,9,110,0,93,9,83,14,110,0,83,14,30,33,110,0,30,33,27,20,31,52,30,33,83,14,31,52,83,14,77,21,110,0,-7,7,-7,0,70,230,29,187,31,178,
-144,286,143,294,139,301,133,306,127,310,119,311,111,310,104,306,99,301,96,294,94,286,96,278,99,272,104,266,111,263,118,262,126,263,133,266,139,272,143,278,144,286,16383,16383,45,286,43,294,40,301,34,306,27,310,20,311,12,310,5,306,0,301,-3,294,-4,286,-3,278,0,272,5,266,11,263,19,262,27,263,34,266,40,272,43,278,45,286,16383,16383,113,0,113,7,97,9,86,14,80,21,77,34,76,52,76,228,74,230,-2,203,-2,195,2,196,7,197,18,197,25,196,29,193,32,187,34,178,35,166,35,52,34,33,31,20,24,13,12,9,-4,7,-4,0,212,328,195,343,148,318,135,326,122,332,107,337,90,340,71,342,50,329,66,326,80,323,93,318,105,311,118,302,57,270,74,255,135,287,151,272,163,256,172,239,179,220,184,200,170,212,159,221,148,226,136,229,123,230,89,224,59,208,35,182,20,148,15,108,20,70,35,38,58,15,88,0,123,-4,145,-2,165,3,182,13,196,26,209,44,218,60,225,79,231,99,234,120,235,142,233,179,225,215,211,248,192,278,166,304,16383,16383,190,101,187,69,179,44,167,25,151,13,132,9,104,18,83,41,70,73,62,108,60,141,62,165,70,185,83,201,99,212,118,216,142,211,
+144,286,143,294,139,301,133,306,127,310,119,311,111,310,104,306,99,301,96,294,94,286,96,278,99,272,104,266,111,263,118,262,126,263,133,266,139,272,143,278,144,286,16383,16383,45,286,43,294,40,301,34,306,27,310,20,311,12,310,5,306,0,301,-3,294,-4,286,-3,278,0,272,5,266,11,263,19,262,27,263,34,266,40,272,43,278,45,286,16383,16383,113,0,113,7,97,9,86,14,80,21,77,34,76,52,76,228,74,230,-2,203,-2,195,2,196,7,197,18,197,25,196,29,193,32,187,34,178,35,166,35,52,34,33,31,20,24,13,12,9,-4,7,-4,0,
 31,20,113,0,34,33,34,33,113,0,86,14,34,33,86,14,35,52,35,52,86,14,80,21,35,52,80,21,35,166,35,166,80,21,77,34,35,166,77,34,76,52,74,230,-2,203,2,196,74,230,2,196,7,197,74,230,7,197,11,197,74,230,11,197,15,197,74,230,15,197,18,197,74,230,18,197,25,196,74,230,25,196,29,193,74,230,29,193,32,187,74,230,32,187,34,178,74,230,34,178,35,166,74,230,35,166,76,52,74,230,76,52,76,228,94,286,96,278,96,294,96,294,96,278,99,272,96,294,99,272,99,301,99,301,99,272,104,266,99,301,104,266,104,306,104,306,104,266,111,263,104,306,111,263,111,310,111,310,111,263,118,262,111,310,118,262,119,311,119,311,118,262,126,263,119,311,126,263,127,310,127,310,126,263,133,266,127,310,133,266,133,306,133,306,133,266,139,272,133,306,139,272,139,301,139,301,139,272,143,278,139,301,143,278,143,294,143,294,143,278,144,286,97,9,86,14,113,0,97,9,113,0,113,7,113,0,31,20,24,13,113,0,24,13,12,9,113,0,12,9,-4,7,113,0,-4,7,-4,0,-4,286,-3,278,-3,294,-3,294,-3,278,0,272,-3,294,0,272,0,301,0,301,0,272,5,266,0,301,5,266,5,306,5,306,5,266,11,263,5,306,11,263,12,310,12,310,11,263,19,262,12,310,19,262,20,311,20,311,19,262,27,263,20,311,27,263,27,310,27,310,27,263,34,266,27,310,34,266,34,306,34,306,34,266,40,272,34,306,40,272,40,301,40,301,40,272,43,278,40,301,43,278,43,294,43,294,43,278,45,286,2,196,-2,203,-2,195,
-212,328,195,343,148,318,135,326,122,332,107,337,90,340,71,342,50,329,66,326,80,323,93,318,105,311,118,302,57,270,74,255,135,287,151,272,163,256,172,239,179,220,184,200,170,212,159,221,148,226,136,229,123,230,89,224,59,208,35,182,20,148,15,108,20,70,35,38,58,15,88,0,123,-4,145,-2,165,3,182,13,196,26,209,44,218,60,225,79,231,99,234,120,235,142,233,179,225,215,211,248,192,278,166,304,16383,16383,190,101,187,69,179,44,167,25,151,13,132,9,104,18,83,41,70,73,62,108,60,141,62,165,70,185,83,201,99,212,118,216,142,211,162,195,177,171,187,139,190,101,196,319,191,309,186,302,181,297,176,295,170,294,165,294,160,295,154,297,149,299,143,301,131,307,124,311,110,315,103,316,96,316,82,314,70,308,59,298,51,284,46,266,60,266,64,274,68,281,73,285,79,288,85,289,89,289,97,287,102,285,106,283,118,278,128,273,137,269,144,267,151,266,158,266,173,268,185,274,195,284,203,299,210,319,16383,16383,243,0,243,7,230,9,221,13,216,19,213,29,212,42,212,153,210,180,202,201,190,217,174,227,153,230,139,229,125,224,111,216,96,205,81,190,80,190,80,228,76,230,50,220,37,216,23,212,8,208,8,199,10,200,13,200,16,201,22,201,30,200,
+212,328,195,343,148,318,135,326,122,332,107,337,90,340,71,342,50,329,66,326,80,323,93,318,105,311,118,302,57,270,74,255,135,287,151,272,163,256,172,239,179,220,184,200,170,212,159,221,148,226,136,229,123,230,89,224,59,208,35,182,20,148,15,108,20,70,35,38,58,15,88,0,123,-4,145,-2,165,3,182,13,196,26,209,44,218,60,225,79,231,99,234,120,235,142,233,179,225,215,211,248,192,278,166,304,16383,16383,190,101,187,69,179,44,167,25,151,13,132,9,104,18,83,41,70,73,62,108,60,141,62,165,70,185,83,201,99,212,118,216,142,211,162,195,177,171,187,139,190,101,
 136,229,123,230,142,211,142,211,123,230,118,216,99,212,118,216,123,230,99,212,123,230,89,224,122,332,118,302,135,287,122,332,135,287,135,326,135,326,135,287,151,272,135,326,151,272,148,318,148,318,151,272,166,304,148,318,166,304,195,343,195,343,166,304,212,328,107,337,90,340,93,318,107,337,93,318,105,311,107,337,105,311,118,302,107,337,118,302,122,332,50,329,66,326,71,342,71,342,66,326,80,323,71,342,80,323,90,340,90,340,80,323,93,318,187,69,179,44,182,13,182,13,179,44,167,25,182,13,167,25,165,3,165,3,167,25,151,13,165,3,151,13,145,-2,145,-2,151,13,132,9,145,-2,132,9,123,-4,123,-4,132,9,104,18,123,-4,104,18,88,0,88,0,104,18,83,41,88,0,83,41,70,73,88,0,70,73,58,15,58,15,70,73,62,108,58,15,62,108,60,141,60,141,62,165,59,208,59,208,62,165,70,185,59,208,70,185,89,224,89,224,70,185,83,201,89,224,83,201,99,212,15,108,20,70,20,148,20,148,20,70,35,38,20,148,35,38,35,182,35,182,35,38,58,15,35,182,58,15,59,208,59,208,58,15,60,141,151,272,163,256,166,304,166,304,163,256,172,239,166,304,172,239,192,278,192,278,172,239,179,220,192,278,179,220,184,200,118,302,57,270,74,255,118,302,74,255,135,287,184,200,187,139,192,278,192,278,187,139,190,101,196,26,190,101,187,69,233,179,225,215,225,79,233,179,225,79,231,99,233,179,231,99,234,120,233,179,234,120,235,142,196,26,209,44,211,248,211,248,209,44,218,60,211,248,218,60,225,215,225,215,218,60,225,79,192,278,190,101,196,26,192,278,196,26,211,248,187,139,184,200,177,171,177,171,184,200,170,212,177,171,170,212,162,195,162,195,170,212,159,221,162,195,159,221,148,226,148,226,136,229,142,211,148,226,142,211,162,195,187,69,182,13,196,26,
-196,319,191,309,186,302,181,297,176,295,170,294,165,294,160,295,154,297,149,299,143,301,131,307,124,311,110,315,103,316,96,316,82,314,70,308,59,298,51,284,46,266,60,266,64,274,68,281,73,285,79,288,85,289,89,289,97,287,102,285,106,283,118,278,128,273,137,269,144,267,151,266,158,266,173,268,185,274,195,284,203,299,210,319,16383,16383,243,0,243,7,230,9,221,13,216,19,213,29,212,42,212,153,210,180,202,201,190,217,174,227,153,230,139,229,125,224,111,216,96,205,81,190,80,190,80,228,76,230,50,220,37,216,23,212,8,208,8,199,10,200,13,200,16,201,22,201,30,200,35,197,38,191,40,181,40,47,39,32,37,21,31,14,22,9,9,7,9,0,114,0,114,7,101,9,92,13,86,18,83,26,82,36,82,174,95,186,105,194,115,199,124,202,133,203,147,201,157,195,164,185,169,171,170,152,170,52,169,35,166,23,161,15,152,10,139,7,138,0,166,253,94,328,89,332,84,335,80,337,72,339,66,338,61,336,57,333,55,329,54,323,55,318,57,314,60,309,64,305,69,301,146,253,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,77,253,97,253,174,302,180,306,184,310,187,314,189,318,189,323,188,329,186,333,182,336,177,338,171,339,163,337,160,335,156,332,151,328,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,
+196,319,191,309,186,302,181,297,176,295,170,294,165,294,160,295,154,297,149,299,143,301,131,307,124,311,110,315,103,316,96,316,82,314,70,308,59,298,51,284,46,266,60,266,64,274,68,281,73,285,79,288,85,289,89,289,97,287,102,285,106,283,118,278,128,273,137,269,144,267,151,266,158,266,173,268,185,274,195,284,203,299,210,319,16383,16383,243,0,243,7,230,9,221,13,216,19,213,29,212,42,212,153,210,180,202,201,190,217,174,227,153,230,139,229,125,224,111,216,96,205,81,190,80,190,80,228,76,230,50,220,37,216,23,212,8,208,8,199,10,200,13,200,16,201,22,201,30,200,35,197,38,191,40,181,40,47,39,32,37,21,31,14,22,9,9,7,9,0,114,0,114,7,101,9,92,13,86,18,83,26,82,36,82,174,95,186,105,194,115,199,124,202,133,203,147,201,157,195,164,185,169,171,170,152,170,52,169,35,166,23,161,15,152,10,139,7,138,0,
 37,21,31,14,114,0,114,0,31,14,22,9,114,0,22,9,9,7,13,200,16,201,23,212,23,212,16,201,19,201,23,212,19,201,22,201,22,201,30,200,23,212,23,212,30,200,37,216,23,212,8,208,10,200,23,212,10,200,13,200,30,200,35,197,37,216,37,216,35,197,38,191,37,216,38,191,50,220,50,220,38,191,40,181,50,220,40,181,40,169,83,26,40,169,40,47,83,26,40,47,86,18,86,18,40,47,92,13,80,228,76,230,80,190,80,190,76,230,82,36,80,190,82,36,81,190,81,190,82,36,82,174,81,190,82,174,96,205,96,205,82,174,95,186,96,205,95,186,105,194,64,274,68,281,70,308,70,308,68,281,73,285,70,308,73,285,82,314,82,314,73,285,79,288,82,314,79,288,85,289,85,289,89,289,96,316,96,316,89,289,93,288,96,316,93,288,97,287,60,266,64,274,70,308,60,266,70,308,59,298,60,266,59,298,51,284,60,266,51,284,46,266,96,316,97,287,103,316,103,316,97,287,102,285,103,316,102,285,106,283,106,283,118,278,110,315,110,315,118,278,117,313,96,316,82,314,85,289,110,315,103,316,106,283,117,313,118,278,124,311,124,311,118,278,128,273,124,311,128,273,131,307,131,307,128,273,137,269,131,307,137,269,143,301,143,301,137,269,144,267,143,301,144,267,149,299,149,299,144,267,151,266,149,299,151,266,154,297,154,297,151,266,158,266,154,297,158,266,160,295,160,295,158,266,173,268,160,295,173,268,165,294,165,294,173,268,170,294,176,295,170,294,173,268,176,295,173,268,185,274,96,205,105,194,111,216,111,216,105,194,115,199,111,216,115,199,125,224,125,224,115,199,124,202,125,224,124,202,133,203,133,203,147,201,139,229,139,229,147,201,153,230,82,36,76,230,63,225,82,36,63,225,83,26,139,229,125,224,133,203,166,23,161,15,243,0,243,0,161,15,152,10,243,0,152,10,139,7,157,195,164,185,174,227,174,227,164,185,169,171,174,227,169,171,170,152,216,19,170,152,170,52,216,19,170,52,221,13,221,13,170,52,169,35,221,13,169,35,243,0,243,0,169,35,166,23,153,230,147,201,157,195,153,230,157,195,174,227,212,42,212,153,210,180,212,42,210,180,202,201,212,42,202,201,213,29,230,9,221,13,243,0,230,9,243,0,243,7,213,29,202,201,190,217,213,29,190,217,174,227,213,29,174,227,170,152,213,29,170,152,216,19,196,319,191,309,195,284,196,319,195,284,203,299,196,319,203,299,210,319,186,302,181,297,185,274,186,302,185,274,195,284,186,302,195,284,191,309,114,0,114,7,101,9,114,0,101,9,92,13,114,0,92,13,39,32,114,0,39,32,37,21,50,220,40,169,83,26,50,220,83,26,63,225,10,200,8,208,8,199,114,0,9,7,9,0,39,32,92,13,40,47,176,295,185,274,181,297,243,0,139,7,138,0,
-166,253,94,328,89,332,84,335,80,337,72,339,66,338,61,336,57,333,55,329,54,323,55,318,57,314,60,309,64,305,69,301,146,253,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,77,253,97,253,174,302,180,306,184,310,187,314,189,318,189,323,188,329,186,333,182,336,177,338,171,339,163,337,160,335,156,332,151,328,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,
+166,253,94,328,89,332,84,335,80,337,72,339,66,338,61,336,57,333,55,329,54,323,55,318,57,314,60,309,64,305,69,301,146,253,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,
 146,253,166,253,94,328,146,253,94,328,89,332,146,253,89,332,84,335,146,253,84,335,80,337,146,253,80,337,76,338,146,253,76,338,72,339,146,253,72,339,69,301,54,323,55,318,55,329,55,329,55,318,57,314,55,329,57,314,57,333,57,333,57,314,60,309,57,333,60,309,61,336,61,336,60,309,64,305,61,336,64,305,66,338,66,338,64,305,69,301,66,338,69,301,72,339,64,91,58,17,69,70,69,70,58,17,88,1,69,70,88,1,76,51,76,51,88,1,86,34,93,25,86,34,88,1,93,25,88,1,123,-4,162,225,127,230,130,215,130,215,127,230,118,216,98,212,118,216,127,230,98,212,127,230,90,225,187,70,180,44,191,17,191,17,180,44,168,25,191,17,168,25,160,1,160,1,168,25,151,13,160,1,151,13,131,9,131,9,120,10,123,-4,123,-4,120,10,110,13,123,-4,110,13,101,18,140,211,149,206,162,225,162,225,149,206,158,199,162,225,158,199,165,191,165,191,174,177,191,210,191,210,174,177,181,161,191,210,181,161,186,142,230,154,215,186,215,43,230,154,215,43,230,76,230,154,230,76,235,116,187,70,191,17,190,102,190,102,191,17,191,210,191,210,191,17,215,43,191,210,215,43,215,186,191,210,186,142,189,122,191,210,189,122,190,102,191,210,162,225,165,191,131,9,123,-4,160,1,58,17,61,113,60,137,60,137,62,164,58,209,58,209,62,164,70,186,58,209,70,186,90,225,90,225,70,186,82,202,90,225,82,202,98,212,58,17,60,137,58,209,58,17,58,209,35,42,35,42,58,209,35,185,35,42,35,185,20,75,20,75,35,185,20,153,20,75,20,153,15,114,61,113,58,17,64,91,162,225,130,215,140,211,93,25,123,-4,101,18,
-77,253,97,253,174,302,180,306,184,310,187,314,189,318,189,323,188,329,186,333,182,336,177,338,171,339,163,337,160,335,156,332,151,328,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,200,253,138,337,107,337,45,253,62,253,123,305,184,253,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,190,319,185,309,181,302,176,297,170,295,164,294,159,294,154,295,149,297,137,301,
+77,253,97,253,174,302,180,306,184,310,187,314,189,318,189,323,188,329,186,333,182,336,177,338,171,339,163,337,160,335,156,332,151,328,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,
 171,339,174,302,177,338,177,338,174,302,180,306,177,338,180,306,182,336,182,336,180,306,184,310,182,336,184,310,186,333,186,333,184,310,187,314,186,333,187,314,188,329,188,329,187,314,189,318,188,329,189,318,189,323,174,302,171,339,167,338,174,302,167,338,163,337,174,302,163,337,160,335,174,302,160,335,156,332,174,302,156,332,151,328,174,302,151,328,97,253,64,91,58,17,69,70,69,70,58,17,88,1,69,70,88,1,76,51,76,51,88,1,86,34,93,25,86,34,88,1,93,25,88,1,123,-4,162,225,127,230,130,215,130,215,127,230,118,216,98,212,118,216,127,230,98,212,127,230,90,225,187,70,180,44,191,17,191,17,180,44,168,25,191,17,168,25,160,1,160,1,168,25,151,13,160,1,151,13,131,9,131,9,120,10,123,-4,123,-4,120,10,110,13,123,-4,110,13,101,18,140,211,149,206,162,225,162,225,149,206,158,199,162,225,158,199,165,191,165,191,174,177,191,210,191,210,174,177,181,161,191,210,181,161,186,142,230,154,215,186,215,43,230,154,215,43,230,76,230,154,230,76,235,116,187,70,191,17,190,102,190,102,191,17,191,210,191,210,191,17,215,43,191,210,215,43,215,186,191,210,186,142,189,122,191,210,189,122,190,102,191,210,162,225,165,191,131,9,123,-4,160,1,58,17,61,113,60,137,60,137,62,164,58,209,58,209,62,164,70,186,58,209,70,186,90,225,90,225,70,186,82,202,90,225,82,202,98,212,58,17,60,137,58,209,58,17,58,209,35,42,35,42,58,209,35,185,35,42,35,185,20,75,20,75,35,185,20,153,20,75,20,153,15,114,61,113,58,17,64,91,162,225,130,215,140,211,93,25,123,-4,101,18,97,253,151,328,77,253,
-200,253,138,337,107,337,45,253,62,253,123,305,184,253,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,190,319,185,309,181,302,176,297,170,295,164,294,159,294,154,295,149,297,137,301,126,307,118,311,104,315,97,316,90,316,76,314,64,308,54,298,46,284,40,266,55,266,58,274,63,281,68,285,73,288,80,289,84,289,92,287,100,283,112,278,123,273,131,269,139,267,145,266,152,266,168,268,180,274,190,284,198,299,205,319,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,
+200,253,138,337,107,337,45,253,62,253,123,305,184,253,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,
 45,253,62,253,107,337,107,337,62,253,123,305,107,337,123,305,138,337,138,337,123,305,184,253,138,337,184,253,200,253,64,91,58,17,69,70,69,70,58,17,88,1,69,70,88,1,76,51,76,51,88,1,86,34,93,25,86,34,88,1,93,25,88,1,123,-4,162,225,127,230,130,215,130,215,127,230,118,216,98,212,118,216,127,230,98,212,127,230,90,225,187,70,180,44,191,17,191,17,180,44,168,25,191,17,168,25,160,1,160,1,168,25,151,13,160,1,151,13,131,9,131,9,120,10,123,-4,123,-4,120,10,110,13,123,-4,110,13,101,18,140,211,149,206,162,225,162,225,149,206,158,199,162,225,158,199,165,191,165,191,174,177,191,210,191,210,174,177,181,161,191,210,181,161,186,142,230,154,215,186,215,43,230,154,215,43,230,76,230,154,230,76,235,116,187,70,191,17,190,102,190,102,191,17,191,210,191,210,191,17,215,43,191,210,215,43,215,186,191,210,186,142,189,122,191,210,189,122,190,102,191,210,162,225,165,191,131,9,123,-4,160,1,58,17,61,113,60,137,60,137,62,164,58,209,58,209,62,164,70,186,58,209,70,186,90,225,90,225,70,186,82,202,90,225,82,202,98,212,58,17,60,137,58,209,58,17,58,209,35,42,35,42,58,209,35,185,35,42,35,185,20,75,20,75,35,185,20,153,20,75,20,153,15,114,61,113,58,17,64,91,162,225,130,215,140,211,93,25,123,-4,101,18,
-190,319,185,309,181,302,176,297,170,295,164,294,159,294,154,295,149,297,137,301,126,307,118,311,104,315,97,316,90,316,76,314,64,308,54,298,46,284,40,266,55,266,58,274,63,281,68,285,73,288,80,289,84,289,92,287,100,283,112,278,123,273,131,269,139,267,145,266,152,266,168,268,180,274,190,284,198,299,205,319,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,197,286,196,294,192,301,186,306,180,310,172,311,164,310,157,306,152,301,149,294,147,286,149,278,152,272,157,266,164,263,171,262,179,263,186,266,192,272,196,278,197,286,16383,16383,98,286,96,294,93,301,87,306,80,310,73,311,65,310,58,306,53,301,49,294,48,286,49,278,53,272,58,266,64,263,72,262,80,263,87,266,93,272,96,278,98,286,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,
+190,319,185,309,181,302,176,297,170,295,164,294,159,294,154,295,149,297,137,301,126,307,118,311,104,315,97,316,90,316,76,314,64,308,54,298,46,284,40,266,55,266,58,274,63,281,68,285,73,288,80,289,84,289,92,287,100,283,112,278,123,273,131,269,139,267,145,266,152,266,168,268,180,274,190,284,198,299,205,319,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,
 58,274,63,281,64,308,64,308,63,281,68,285,64,308,68,285,76,314,76,314,68,285,73,288,76,314,73,288,80,289,80,289,84,289,90,316,90,316,84,289,88,288,90,316,88,288,92,287,55,266,58,274,64,308,55,266,64,308,54,298,55,266,54,298,46,284,55,266,46,284,40,266,90,316,92,287,97,316,97,316,92,287,96,285,97,316,96,285,100,283,100,283,112,278,104,315,104,315,112,278,111,313,90,316,76,314,80,289,104,315,97,316,100,283,111,313,112,278,118,311,118,311,112,278,123,273,118,311,123,273,126,307,126,307,123,273,131,269,126,307,131,269,137,301,137,301,131,269,139,267,137,301,139,267,143,299,143,299,139,267,145,266,143,299,145,266,149,297,149,297,145,266,152,266,149,297,152,266,154,295,154,295,152,266,168,268,154,295,168,268,159,294,159,294,168,268,164,294,170,295,164,294,168,268,170,295,168,268,180,274,190,319,185,309,190,284,190,319,190,284,198,299,190,319,198,299,205,319,181,302,176,297,180,274,181,302,180,274,190,284,181,302,190,284,185,309,64,91,58,17,69,70,69,70,58,17,88,1,69,70,88,1,76,51,76,51,88,1,86,34,93,25,86,34,88,1,93,25,88,1,123,-4,162,225,127,230,130,215,130,215,127,230,118,216,98,212,118,216,127,230,98,212,127,230,90,225,187,70,180,44,191,17,191,17,180,44,168,25,191,17,168,25,160,1,160,1,168,25,151,13,160,1,151,13,131,9,131,9,120,10,123,-4,123,-4,120,10,110,13,123,-4,110,13,101,18,140,211,149,206,162,225,162,225,149,206,158,199,162,225,158,199,165,191,165,191,174,177,191,210,191,210,174,177,181,161,191,210,181,161,186,142,230,154,215,186,215,43,230,154,215,43,230,76,230,154,230,76,235,116,187,70,191,17,190,102,190,102,191,17,191,210,191,210,191,17,215,43,191,210,215,43,215,186,191,210,186,142,189,122,191,210,189,122,190,102,191,210,162,225,165,191,131,9,123,-4,160,1,58,17,61,113,60,137,60,137,62,164,58,209,58,209,62,164,70,186,58,209,70,186,90,225,90,225,70,186,82,202,90,225,82,202,98,212,58,17,60,137,58,209,58,17,58,209,35,42,35,42,58,209,35,185,35,42,35,185,20,75,20,75,35,185,20,153,20,75,20,153,15,114,61,113,58,17,64,91,162,225,130,215,140,211,93,25,123,-4,101,18,170,295,180,274,176,297,
-197,286,196,294,192,301,186,306,180,310,172,311,164,310,157,306,152,301,149,294,147,286,149,278,152,272,157,266,164,263,171,262,179,263,186,266,192,272,196,278,197,286,16383,16383,98,286,96,294,93,301,87,306,80,310,73,311,65,310,58,306,53,301,49,294,48,286,49,278,53,272,58,266,64,263,72,262,80,263,87,266,93,272,96,278,98,286,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,169,229,168,238,164,246,158,252,150,256,142,258,133,256,125,252,119,246,115,239,113,230,115,221,119,214,125,208,132,204,141,203,150,204,158,208,164,214,168,221,169,229,16383,16383,267,110,267,143,15,143,15,110,16383,16383,169,22,168,31,164,38,158,45,150,49,142,50,133,49,125,45,119,39,115,31,113,22,115,14,119,6,125,0,132,-3,141,-4,150,-3,158,0,164,6,168,13,169,22,219,276,199,276,171,221,161,224,152,227,143,229,134,230,124,230,88,224,58,208,35,184,20,152,15,113,15,100,17,87,20,74,30,50,35,42,40,36,46,29,53,22,63,14,26,-55,45,-55,77,6,87,1,105,-3,114,-4,123,-4,159,1,190,18,214,44,229,78,235,117,233,141,227,162,218,181,204,198,186,213,16383,16383,79,46,72,63,66,81,63,99,60,118,60,138,62,164,70,186,82,202,
+197,286,196,294,192,301,186,306,180,310,172,311,164,310,157,306,152,301,149,294,147,286,149,278,152,272,157,266,164,263,171,262,179,263,186,266,192,272,196,278,197,286,16383,16383,98,286,96,294,93,301,87,306,80,310,73,311,65,310,58,306,53,301,49,294,48,286,49,278,53,272,58,266,64,263,72,262,80,263,87,266,93,272,96,278,98,286,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,
 48,286,49,278,49,294,49,294,49,278,53,272,49,294,53,272,53,301,53,301,53,272,58,266,53,301,58,266,58,306,58,306,58,266,64,263,58,306,64,263,65,310,65,310,64,263,72,262,65,310,72,262,73,311,73,311,72,262,80,263,73,311,80,263,80,310,80,310,80,263,87,266,80,310,87,266,87,306,87,306,87,266,93,272,87,306,93,272,93,301,93,301,93,272,96,278,93,301,96,278,96,294,96,294,96,278,98,286,64,91,58,17,69,70,69,70,58,17,88,1,69,70,88,1,76,51,76,51,88,1,86,34,93,25,86,34,88,1,93,25,88,1,123,-4,162,225,127,230,130,215,130,215,127,230,118,216,98,212,118,216,127,230,98,212,127,230,90,225,147,286,149,278,149,294,149,294,149,278,152,272,149,294,152,272,152,301,152,301,152,272,157,266,152,301,157,266,157,306,157,306,157,266,164,263,157,306,164,263,164,310,164,310,164,263,171,262,164,310,171,262,172,311,172,311,171,262,179,263,172,311,179,263,180,310,180,310,179,263,186,266,180,310,186,266,186,306,186,306,186,266,192,272,186,306,192,272,192,301,192,301,192,272,196,278,192,301,196,278,196,294,196,294,196,278,197,286,187,70,180,44,191,17,191,17,180,44,168,25,191,17,168,25,160,1,160,1,168,25,151,13,160,1,151,13,131,9,131,9,120,10,123,-4,123,-4,120,10,110,13,123,-4,110,13,101,18,140,211,149,206,162,225,162,225,149,206,158,199,162,225,158,199,165,191,165,191,174,177,191,210,191,210,174,177,181,161,191,210,181,161,186,142,230,154,215,186,215,43,230,154,215,43,230,76,230,154,230,76,235,116,187,70,191,17,190,102,190,102,191,17,191,210,191,210,191,17,215,43,191,210,215,43,215,186,191,210,186,142,189,122,191,210,189,122,190,102,191,210,162,225,165,191,131,9,123,-4,160,1,58,17,61,113,60,137,60,137,62,164,58,209,58,209,62,164,70,186,58,209,70,186,90,225,90,225,70,186,82,202,90,225,82,202,98,212,58,17,60,137,58,209,58,17,58,209,35,42,35,42,58,209,35,185,35,42,35,185,20,75,20,75,35,185,20,153,20,75,20,153,15,114,61,113,58,17,64,91,162,225,130,215,140,211,93,25,123,-4,101,18,
-169,229,168,238,164,246,158,252,150,256,142,258,133,256,125,252,119,246,115,239,113,230,115,221,119,214,125,208,132,204,141,203,150,204,158,208,164,214,168,221,169,229,16383,16383,267,110,267,143,15,143,15,110,16383,16383,169,22,168,31,164,38,158,45,150,49,142,50,133,49,125,45,119,39,115,31,113,22,115,14,119,6,125,0,132,-3,141,-4,150,-3,158,0,164,6,168,13,169,22,219,276,199,276,171,221,161,224,152,227,143,229,134,230,124,230,88,224,58,208,35,184,20,152,15,113,15,100,17,87,20,74,30,50,35,42,40,36,46,29,53,22,63,14,26,-55,45,-55,77,6,87,1,105,-3,114,-4,123,-4,159,1,190,18,214,44,229,78,235,117,233,141,227,162,218,181,204,198,186,213,16383,16383,79,46,72,63,66,81,63,99,60,118,60,138,62,164,70,186,
+169,229,168,238,164,246,158,252,150,256,142,258,133,256,125,252,119,246,115,239,113,230,115,221,119,214,125,208,132,204,141,203,150,204,158,208,164,214,168,221,169,229,16383,16383,267,110,267,143,15,143,15,110,16383,16383,169,22,168,31,164,38,158,45,150,49,142,50,133,49,125,45,119,39,115,31,113,22,115,14,119,6,125,0,132,-3,141,-4,150,-3,158,0,164,6,168,13,169,22,
 113,230,115,221,115,239,115,239,115,221,119,214,115,239,119,214,119,246,119,246,119,214,125,208,119,246,125,208,125,252,125,252,125,208,132,204,125,252,132,204,133,256,133,256,132,204,141,203,133,256,141,203,142,258,142,258,141,203,150,204,142,258,150,204,150,256,150,256,150,204,158,208,150,256,158,208,158,252,158,252,158,208,164,214,158,252,164,214,164,246,164,246,164,214,168,221,164,246,168,221,168,238,168,238,168,221,169,229,15,143,15,110,267,110,15,143,267,110,267,143,113,22,115,14,115,31,115,31,115,14,119,6,115,31,119,6,119,39,119,39,119,6,125,0,119,39,125,0,125,45,125,45,125,0,132,-3,125,45,132,-3,133,49,133,49,132,-3,141,-4,133,49,141,-4,142,50,142,50,141,-4,150,-3,142,50,150,-3,150,49,150,49,150,-3,158,0,150,49,158,0,158,45,158,45,158,0,164,6,158,45,164,6,164,38,164,38,164,6,168,13,164,38,168,13,168,31,168,31,168,13,169,22,
-219,276,199,276,171,221,161,224,152,227,143,229,134,230,124,230,88,224,58,208,35,184,20,152,15,113,15,100,17,87,20,74,30,50,35,42,40,36,46,29,53,22,63,14,26,-55,45,-55,77,6,87,1,105,-3,114,-4,123,-4,159,1,190,18,214,44,229,78,235,117,233,141,227,162,218,181,204,198,186,213,16383,16383,79,46,72,63,66,81,63,99,60,118,60,138,62,164,70,186,82,202,99,212,118,216,127,215,135,213,143,210,151,205,158,198,16383,16383,170,183,178,167,183,152,187,136,189,120,190,102,187,69,180,44,168,25,151,13,131,9,121,10,112,12,104,16,97,22,89,30,170,253,97,328,92,332,88,335,84,337,80,338,75,339,69,338,64,336,61,333,58,329,57,323,58,318,60,314,63,309,67,305,73,301,150,253,16383,16383,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,169,38,169,-2,171,-3,186,1,199,6,225,14,240,18,
+219,276,199,276,171,221,161,224,152,227,143,229,134,230,124,230,88,224,58,208,35,184,20,152,15,113,15,100,17,87,20,74,30,50,35,42,40,36,46,29,53,22,63,14,26,-55,45,-55,77,6,87,1,105,-3,114,-4,123,-4,159,1,190,18,214,44,229,78,235,117,233,141,227,162,218,181,204,198,186,213,16383,16383,79,46,72,63,66,81,63,99,60,118,60,138,62,164,70,186,82,202,99,212,118,216,127,215,135,213,143,210,151,205,158,198,16383,16383,170,183,178,167,183,152,187,136,189,120,190,102,187,69,180,44,168,25,151,13,131,9,121,10,112,12,104,16,97,22,89,30,
 63,14,63,14,45,-55,63,14,45,-55,77,6,63,14,77,6,63,99,63,14,63,99,60,118,63,14,60,118,60,138,63,14,60,138,58,208,63,14,58,208,53,22,58,208,35,184,35,42,58,208,35,42,40,36,58,208,40,36,46,29,58,208,46,29,53,22,35,184,20,152,20,74,35,184,20,74,25,62,35,184,25,62,30,50,35,184,30,50,35,42,20,152,15,113,15,100,20,152,15,100,17,87,20,152,17,87,20,74,124,230,118,216,127,215,124,230,127,215,134,230,134,230,127,215,135,213,134,230,135,213,143,229,143,229,135,213,143,210,143,229,143,210,152,227,152,227,143,210,151,205,152,227,151,205,158,198,187,69,180,44,190,18,190,18,180,44,168,25,190,18,168,25,159,1,159,1,168,25,151,13,159,1,151,13,131,9,131,9,121,10,123,-4,123,-4,121,10,114,-4,112,12,104,16,105,-3,112,12,105,-3,114,-4,112,12,114,-4,121,10,87,1,96,-1,89,30,89,30,96,-1,97,22,97,22,96,-1,105,-3,97,22,105,-3,104,16,161,224,158,198,170,183,161,224,170,183,171,221,171,221,170,183,178,167,171,221,178,167,186,213,186,213,178,167,183,152,186,213,183,152,187,136,199,276,171,221,186,213,199,276,186,213,219,276,158,198,79,46,89,30,158,198,89,30,170,183,79,46,72,63,77,6,79,46,77,6,87,1,79,46,87,1,89,30,66,81,63,99,77,6,66,81,77,6,72,63,229,78,235,117,233,141,229,78,233,141,227,162,229,78,227,162,218,181,229,78,218,181,214,44,187,69,190,18,190,102,190,102,190,18,204,198,204,198,190,18,214,44,204,198,214,44,218,181,186,213,187,136,204,198,204,198,187,136,189,120,204,198,189,120,190,102,131,9,123,-4,159,1,70,186,82,202,88,224,88,224,82,202,99,212,88,224,99,212,124,230,124,230,99,212,118,216,60,138,62,164,58,208,58,208,62,164,70,186,58,208,70,186,88,224,45,-55,63,14,26,-55,152,227,158,198,161,224,
-170,253,97,328,92,332,88,335,84,337,80,338,75,339,69,338,64,336,61,333,58,329,57,323,58,318,60,314,63,309,67,305,73,301,150,253,16383,16383,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,169,38,169,-2,171,-3,186,1,199,6,225,14,240,18,78,253,98,253,175,302,181,306,185,310,188,314,189,318,190,323,189,329,187,333,183,336,179,338,172,339,168,338,165,337,161,335,156,332,151,328,16383,16383,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,169,38,169,-2,171,-3,186,1,199,6,225,14,240,18,
+170,253,97,328,92,332,88,335,84,337,80,338,75,339,69,338,64,336,61,333,58,329,57,323,58,318,60,314,63,309,67,305,73,301,150,253,16383,16383,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,169,38,169,-2,171,-3,186,1,199,6,225,14,240,18,
 150,253,170,253,97,328,150,253,97,328,92,332,150,253,92,332,88,335,150,253,88,335,84,337,150,253,84,337,80,338,150,253,80,338,75,339,150,253,75,339,73,301,57,323,58,318,58,329,58,329,58,318,60,314,58,329,60,314,61,333,61,333,60,314,63,309,61,333,63,309,64,336,64,336,63,309,67,305,64,336,67,305,69,338,69,338,67,305,73,301,69,338,73,301,75,339,78,225,4,225,17,216,78,225,17,216,26,213,78,225,26,213,32,207,78,225,32,207,35,197,78,225,35,197,36,185,78,225,36,185,38,38,78,225,38,38,46,20,78,225,46,20,58,6,78,225,58,6,75,-1,78,225,75,-1,78,64,164,53,162,48,168,38,168,38,162,48,159,43,168,38,159,43,155,40,155,40,147,34,153,21,153,21,147,34,139,29,153,21,139,29,138,8,138,8,139,29,130,26,138,8,130,26,123,0,123,0,130,26,121,25,123,0,121,25,113,24,113,24,102,26,109,-3,109,-3,102,26,97,-4,97,-4,102,26,92,31,97,-4,92,31,84,40,97,-4,84,40,79,51,97,-4,79,51,75,-1,78,64,75,-1,79,51,113,24,109,-3,123,0,166,184,168,38,209,225,209,225,168,38,169,38,209,225,169,38,171,-3,171,-3,169,38,169,-2,168,38,166,184,166,69,168,38,166,69,166,59,168,38,166,59,164,53,155,40,153,21,168,38,225,26,217,29,225,14,225,14,217,29,212,34,225,14,212,34,212,10,212,10,212,34,209,42,212,10,209,42,199,6,199,6,209,42,209,54,199,6,209,54,209,225,209,225,171,-3,186,1,209,225,186,1,199,6,209,225,129,225,145,215,209,225,145,215,155,212,209,225,155,212,162,206,209,225,162,206,165,197,209,225,165,197,166,184,237,25,225,26,225,14,237,25,225,14,240,18,237,25,240,18,240,25,38,38,36,185,36,59,145,215,129,225,129,217,17,216,4,225,4,218,
-78,253,98,253,175,302,181,306,185,310,188,314,189,318,190,323,189,329,187,333,183,336,179,338,172,339,168,338,165,337,161,335,156,332,151,328,16383,16383,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,169,38,169,-2,171,-3,186,1,199,6,225,14,240,18,200,253,138,337,107,337,45,253,62,253,123,305,184,253,16383,16383,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,169,38,169,-2,171,-3,186,1,199,6,225,14,240,18,196,286,195,294,192,301,186,306,179,310,171,311,164,310,157,306,152,301,148,294,147,286,
+78,253,98,253,175,302,181,306,185,310,188,314,189,318,190,323,189,329,187,333,183,336,179,338,172,339,168,338,165,337,161,335,156,332,151,328,16383,16383,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,169,38,169,-2,171,-3,186,1,199,6,225,14,240,18,
 209,225,129,225,145,215,209,225,145,215,155,212,209,225,155,212,162,206,209,225,162,206,165,197,209,225,165,197,166,184,209,225,166,184,168,38,209,225,168,38,169,38,209,225,169,38,171,-3,209,225,171,-3,186,1,209,225,186,1,199,6,209,225,199,6,209,54,166,184,166,69,168,38,237,25,225,26,225,14,237,25,225,14,240,18,237,25,240,18,240,25,209,54,199,6,209,42,209,42,199,6,212,10,209,42,212,10,212,34,212,34,212,10,225,14,212,34,225,14,217,29,217,29,225,14,225,26,172,339,175,302,179,338,179,338,175,302,181,306,179,338,181,306,183,336,183,336,181,306,185,310,183,336,185,310,187,333,187,333,185,310,188,314,187,333,188,314,189,329,189,329,188,314,189,318,189,329,189,318,190,323,175,302,172,339,168,338,175,302,168,338,165,337,175,302,165,337,161,335,175,302,161,335,156,332,175,302,156,332,151,328,175,302,151,328,98,253,78,225,4,225,17,216,78,225,17,216,26,213,78,225,26,213,32,207,78,225,32,207,35,197,78,225,35,197,36,185,78,225,36,185,38,38,78,225,38,38,46,20,78,225,46,20,58,6,78,225,58,6,75,-1,78,225,75,-1,78,64,164,53,162,48,168,38,168,38,162,48,159,43,168,38,159,43,155,40,155,40,147,34,153,21,153,21,147,34,139,29,153,21,139,29,138,8,138,8,139,29,130,26,138,8,130,26,123,0,123,0,130,26,121,25,123,0,121,25,113,24,113,24,102,26,109,-3,109,-3,102,26,97,-4,97,-4,102,26,92,31,97,-4,92,31,84,40,97,-4,84,40,79,51,97,-4,79,51,75,-1,78,64,75,-1,79,51,113,24,109,-3,123,0,166,59,164,53,168,38,166,59,168,38,166,69,155,40,153,21,168,38,38,38,36,185,36,59,171,-3,169,38,169,-2,17,216,4,225,4,218,98,253,151,328,78,253,145,215,129,225,129,217,
-200,253,138,337,107,337,45,253,62,253,123,305,184,253,16383,16383,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,169,38,169,-2,171,-3,186,1,199,6,225,14,240,18,196,286,195,294,192,301,186,306,179,310,171,311,164,310,157,306,152,301,148,294,147,286,148,278,151,272,157,266,163,263,171,262,179,263,186,266,192,272,195,278,196,286,16383,16383,97,286,96,294,92,301,87,306,80,310,72,311,64,310,58,306,52,301,49,294,47,286,49,278,52,272,57,266,64,263,71,262,79,263,86,266,92,272,96,278,97,286,16383,16383,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,
+200,253,138,337,107,337,45,253,62,253,123,305,184,253,16383,16383,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,169,38,169,-2,171,-3,186,1,199,6,225,14,240,18,
 209,225,129,225,145,215,209,225,145,215,155,212,209,225,155,212,162,206,209,225,162,206,165,197,209,225,165,197,166,184,209,225,166,184,168,38,209,225,168,38,169,38,209,225,169,38,171,-3,209,225,171,-3,186,1,209,225,186,1,199,6,209,225,199,6,209,54,166,184,166,69,168,38,237,25,225,26,225,14,237,25,225,14,240,18,237,25,240,18,240,25,209,54,199,6,209,42,209,42,199,6,212,10,209,42,212,10,212,34,212,34,212,10,225,14,212,34,225,14,217,29,217,29,225,14,225,26,45,253,62,253,107,337,107,337,62,253,123,305,107,337,123,305,138,337,138,337,123,305,184,253,138,337,184,253,200,253,78,225,4,225,17,216,78,225,17,216,26,213,78,225,26,213,32,207,78,225,32,207,35,197,78,225,35,197,36,185,78,225,36,185,38,38,78,225,38,38,46,20,78,225,46,20,58,6,78,225,58,6,75,-1,78,225,75,-1,78,64,164,53,162,48,168,38,168,38,162,48,159,43,168,38,159,43,155,40,155,40,147,34,153,21,153,21,147,34,139,29,153,21,139,29,138,8,138,8,139,29,130,26,138,8,130,26,123,0,123,0,130,26,121,25,123,0,121,25,113,24,113,24,102,26,109,-3,109,-3,102,26,97,-4,97,-4,102,26,92,31,97,-4,92,31,84,40,97,-4,84,40,79,51,97,-4,79,51,75,-1,78,64,75,-1,79,51,113,24,109,-3,123,0,166,59,164,53,168,38,166,59,168,38,166,69,155,40,153,21,168,38,38,38,36,185,36,59,171,-3,169,38,169,-2,17,216,4,225,4,218,145,215,129,225,129,217,
-196,286,195,294,192,301,186,306,179,310,171,311,164,310,157,306,152,301,148,294,147,286,148,278,151,272,157,266,163,263,171,262,179,263,186,266,192,272,195,278,196,286,16383,16383,97,286,96,294,92,301,87,306,80,310,72,311,64,310,58,306,52,301,49,294,47,286,49,278,52,272,57,266,64,263,71,262,79,263,86,266,92,272,96,278,97,286,16383,16383,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,169,38,169,-2,171,-3,186,1,199,6,225,14,240,18,71,253,92,253,169,302,174,306,178,310,181,314,183,318,184,323,183,329,181,333,177,336,172,338,166,339,158,337,154,335,150,332,145,328,16383,16383,238,225,171,225,171,218,179,217,186,216,190,213,193,210,194,205,194,202,193,201,193,198,192,196,143,59,88,184,82,196,81,201,81,204,82,209,85,212,90,215,98,217,109,218,109,225,7,225,7,218,14,217,21,214,26,211,30,206,33,200,99,60,105,47,111,35,116,24,121,9,119,2,116,-8,112,-21,106,-34,100,-44,96,-51,85,-62,80,-65,75,-66,71,-66,69,-65,66,-64,62,-63,63,-63,57,-60,52,-58,42,-56,36,-56,30,-57,24,-60,19,-65,16,-72,15,-79,17,-88,21,-96,28,-102,38,-106,50,-108,71,-105,90,-94,106,-76,122,-49,137,-11,213,192,217,202,221,208,226,213,231,216,238,218,79,339,76,342,63,337,51,333,38,329,23,325,
+196,286,195,294,192,301,186,306,179,310,171,311,164,310,157,306,152,301,148,294,147,286,148,278,151,272,157,266,163,263,171,262,179,263,186,266,192,272,195,278,196,286,16383,16383,97,286,96,294,92,301,87,306,80,310,72,311,64,310,58,306,52,301,49,294,47,286,49,278,52,272,57,266,64,263,71,262,79,263,86,266,92,272,96,278,97,286,16383,16383,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,169,38,169,-2,171,-3,186,1,199,6,225,14,240,18,
 209,225,129,225,145,215,209,225,145,215,155,212,209,225,155,212,162,206,209,225,162,206,165,197,209,225,165,197,166,184,209,225,166,184,168,38,209,225,168,38,169,38,209,225,169,38,171,-3,209,225,171,-3,186,1,209,225,186,1,199,6,209,225,199,6,209,54,166,184,166,69,168,38,237,25,225,26,225,14,237,25,225,14,240,18,237,25,240,18,240,25,209,54,199,6,209,42,209,42,199,6,212,10,209,42,212,10,212,34,212,34,212,10,225,14,212,34,225,14,217,29,217,29,225,14,225,26,147,286,148,278,148,294,148,294,148,278,151,272,148,294,151,272,152,301,152,301,151,272,157,266,152,301,157,266,157,306,157,306,157,266,163,263,157,306,163,263,164,310,164,310,163,263,171,262,164,310,171,262,171,311,171,311,171,262,179,263,171,311,179,263,179,310,179,310,179,263,186,266,179,310,186,266,186,306,186,306,186,266,192,272,186,306,192,272,192,301,192,301,192,272,195,278,192,301,195,278,195,294,195,294,195,278,196,286,47,286,49,278,49,294,49,294,49,278,52,272,49,294,52,272,52,301,52,301,52,272,57,266,52,301,57,266,58,306,58,306,57,266,64,263,58,306,64,263,64,310,64,310,64,263,71,262,64,310,71,262,72,311,72,311,71,262,79,263,72,311,79,263,80,310,80,310,79,263,86,266,80,310,86,266,87,306,87,306,86,266,92,272,87,306,92,272,92,301,92,301,92,272,96,278,92,301,96,278,96,294,96,294,96,278,97,286,78,225,4,225,17,216,78,225,17,216,26,213,78,225,26,213,32,207,78,225,32,207,35,197,78,225,35,197,36,185,78,225,36,185,38,38,78,225,38,38,46,20,78,225,46,20,58,6,78,225,58,6,75,-1,78,225,75,-1,78,64,164,53,162,48,168,38,168,38,162,48,159,43,168,38,159,43,155,40,155,40,147,34,153,21,153,21,147,34,139,29,153,21,139,29,138,8,138,8,139,29,130,26,138,8,130,26,123,0,123,0,130,26,121,25,123,0,121,25,113,24,113,24,102,26,109,-3,109,-3,102,26,97,-4,97,-4,102,26,92,31,97,-4,92,31,84,40,97,-4,84,40,79,51,97,-4,79,51,75,-1,78,64,75,-1,79,51,113,24,109,-3,123,0,166,59,164,53,168,38,166,59,168,38,166,69,155,40,153,21,168,38,38,38,36,185,36,59,171,-3,169,38,169,-2,17,216,4,225,4,218,145,215,129,225,129,217,
-71,253,92,253,169,302,174,306,178,310,181,314,183,318,184,323,183,329,181,333,177,336,172,338,166,339,158,337,154,335,150,332,145,328,16383,16383,238,225,171,225,171,218,179,217,186,216,190,213,193,210,194,205,194,202,193,201,193,198,192,196,143,59,88,184,82,196,81,201,81,204,82,209,85,212,90,215,98,217,109,218,109,225,7,225,7,218,14,217,21,214,26,211,30,206,33,200,99,60,105,47,111,35,116,24,121,9,119,2,116,-8,112,-21,106,-34,100,-44,96,-51,85,-62,80,-65,75,-66,71,-66,69,-65,66,-64,62,-63,63,-63,57,-60,52,-58,42,-56,36,-56,30,-57,24,-60,19,-65,16,-72,15,-79,17,-88,21,-96,28,-102,38,-106,50,-108,71,-105,90,-94,106,-76,122,-49,137,-11,213,192,217,202,221,208,226,213,231,216,238,218,79,339,76,342,63,337,51,333,38,329,23,325,4,320,4,311,8,311,9,312,13,312,23,311,30,308,35,303,37,295,37,-76,34,-86,27,-92,17,-96,2,-98,2,-107,123,-107,123,-98,104,-97,91,-93,84,-87,80,-75,79,-59,79,17,90,8,99,2,108,-1,118,-3,130,-4,164,1,193,19,215,47,230,82,235,123,231,160,221,190,204,212,180,225,151,230,135,229,120,224,106,216,92,205,79,190,16383,16383,79,166,83,175,91,184,103,192,117,198,131,200,152,196,170,185,182,166,189,140,192,107,189,75,181,49,169,29,152,16,131,11,117,13,103,19,91,27,82,36,79,45,198,286,197,294,193,301,188,306,181,310,173,311,165,310,159,306,153,301,150,294,148,286,150,278,153,272,158,266,165,263,172,262,180,263,187,266,193,272,197,278,198,286,
+71,253,92,253,169,302,174,306,178,310,181,314,183,318,184,323,183,329,181,333,177,336,172,338,166,339,158,337,154,335,150,332,145,328,16383,16383,238,225,171,225,171,218,179,217,186,216,190,213,193,210,194,205,194,202,193,201,193,198,192,196,143,59,88,184,82,196,81,201,81,204,82,209,85,212,90,215,98,217,109,218,109,225,7,225,7,218,14,217,21,214,26,211,30,206,33,200,99,60,105,47,111,35,116,24,121,9,119,2,116,-8,112,-21,106,-34,100,-44,96,-51,85,-62,80,-65,75,-66,71,-66,69,-65,66,-64,62,-63,63,-63,57,-60,52,-58,42,-56,36,-56,30,-57,24,-60,19,-65,16,-72,15,-79,17,-88,21,-96,28,-102,38,-106,50,-108,71,-105,90,-94,106,-76,122,-49,137,-11,213,192,217,202,221,208,226,213,231,216,238,218,
 166,339,169,302,172,338,172,338,169,302,174,306,172,338,174,306,177,336,177,336,174,306,178,310,177,336,178,310,181,333,181,333,178,310,181,314,181,333,181,314,183,329,183,329,181,314,183,318,183,329,183,318,184,323,169,302,166,339,162,338,169,302,162,338,158,337,169,302,158,337,154,335,169,302,154,335,150,332,169,302,150,332,145,328,169,302,145,328,92,253,90,-57,85,-62,90,-94,90,-94,85,-62,80,-65,90,-94,80,-65,75,-66,75,-66,73,-66,90,-94,90,-94,73,-66,71,-105,90,-57,106,-76,96,-51,96,-51,106,-76,100,-44,106,-34,100,-44,106,-76,106,-34,106,-76,122,-49,143,59,88,184,99,60,143,59,99,60,105,47,143,59,105,47,111,35,143,59,111,35,116,24,143,59,116,24,119,15,143,59,119,15,121,9,143,59,121,9,122,-49,143,59,122,-49,137,-11,143,59,137,-11,213,192,143,59,213,192,192,196,122,-49,121,9,119,2,99,60,88,184,86,188,99,60,86,188,84,192,99,60,84,192,82,196,99,60,82,196,81,201,99,60,81,201,33,200,33,200,81,201,81,204,81,204,82,209,33,200,33,200,82,209,85,212,33,200,85,212,109,225,109,225,85,212,90,215,109,225,90,215,98,217,194,202,193,201,213,192,213,192,193,201,193,198,213,192,193,198,192,196,238,225,171,225,179,217,238,225,179,217,186,216,238,225,186,216,190,213,238,225,190,213,193,210,238,225,193,210,194,205,238,225,194,205,226,213,238,225,226,213,231,216,238,225,231,216,238,218,194,205,213,192,217,202,194,205,217,202,221,208,194,205,221,208,226,213,194,204,194,202,213,192,194,204,213,192,194,205,122,-49,119,2,116,-8,122,-49,116,-8,112,-21,122,-49,112,-21,106,-34,71,-105,73,-66,71,-66,71,-105,71,-66,69,-65,71,-105,69,-65,66,-64,71,-105,66,-64,63,-63,71,-105,63,-63,57,-60,71,-105,57,-60,52,-58,71,-105,52,-58,50,-108,52,-58,47,-57,50,-108,50,-108,47,-57,42,-56,50,-108,42,-56,38,-106,38,-106,42,-56,36,-56,38,-106,36,-56,30,-57,38,-106,30,-57,28,-102,28,-102,30,-57,24,-60,28,-102,24,-60,21,-96,21,-96,24,-60,19,-65,21,-96,19,-65,17,-88,17,-88,19,-65,16,-72,17,-88,16,-72,15,-79,98,217,109,218,109,225,109,225,7,225,14,217,109,225,14,217,21,214,109,225,21,214,26,211,109,225,26,211,30,206,109,225,30,206,33,200,66,-64,62,-63,63,-63,14,217,7,225,7,218,90,-57,90,-94,106,-76,179,217,171,225,171,218,92,253,145,328,71,253,
-79,339,76,342,63,337,51,333,38,329,23,325,4,320,4,311,8,311,9,312,13,312,23,311,30,308,35,303,37,295,37,-76,34,-86,27,-92,17,-96,2,-98,2,-107,123,-107,123,-98,104,-97,91,-93,84,-87,80,-75,79,-59,79,17,90,8,99,2,108,-1,118,-3,130,-4,164,1,193,19,215,47,230,82,235,123,231,160,221,190,204,212,180,225,151,230,135,229,120,224,106,216,92,205,79,190,16383,16383,79,166,83,175,91,184,103,192,117,198,131,200,152,196,170,185,182,166,189,140,192,107,189,75,181,49,169,29,152,16,131,11,117,13,103,19,91,27,82,36,79,45,198,286,197,294,193,301,188,306,181,310,173,311,165,310,159,306,153,301,150,294,148,286,150,278,153,272,158,266,165,263,172,262,180,263,187,266,193,272,197,278,198,286,16383,16383,99,286,97,294,94,301,88,306,81,310,74,311,66,310,59,306,54,301,50,294,49,286,50,278,54,272,59,266,65,263,73,262,81,263,88,266,94,272,97,278,99,286,16383,16383,238,225,171,225,171,218,179,217,186,216,190,213,193,210,194,205,194,202,193,201,193,198,192,196,143,59,88,184,82,196,81,201,81,204,82,209,85,212,90,215,98,217,109,218,109,225,7,225,7,218,14,217,21,214,
+79,339,76,342,63,337,51,333,38,329,23,325,4,320,4,311,8,311,9,312,13,312,23,311,30,308,35,303,37,295,37,-76,34,-86,27,-92,17,-96,2,-98,2,-107,123,-107,123,-98,104,-97,91,-93,84,-87,80,-75,79,-59,79,17,90,8,99,2,108,-1,118,-3,130,-4,164,1,193,19,215,47,230,82,235,123,231,160,221,190,204,212,180,225,151,230,135,229,120,224,106,216,92,205,79,190,16383,16383,79,166,83,175,91,184,103,192,117,198,131,200,152,196,170,185,182,166,189,140,192,107,189,75,181,49,169,29,152,16,131,11,117,13,103,19,91,27,82,36,79,45,
 34,-86,27,-92,123,-107,123,-107,27,-92,17,-96,123,-107,17,-96,2,-98,8,311,9,312,23,325,23,325,9,312,11,312,23,325,11,312,13,312,13,312,23,311,23,325,23,325,23,311,38,329,23,325,4,320,6,311,23,325,6,311,8,311,30,308,35,303,38,329,38,329,35,303,37,295,38,329,37,295,37,284,80,-75,37,284,37,-63,80,-75,37,-63,84,-87,84,-87,37,-63,91,-93,79,190,79,339,76,342,79,190,76,342,79,-59,79,190,79,-59,79,166,79,190,79,166,92,205,235,123,231,160,230,82,230,82,231,160,221,190,230,82,221,190,215,47,215,47,221,190,204,212,215,47,204,212,193,19,193,19,204,212,192,107,193,19,192,107,189,75,193,19,189,75,181,49,152,196,170,185,180,225,180,225,170,185,182,166,180,225,182,166,204,212,204,212,182,166,189,140,204,212,189,140,192,107,135,229,131,200,152,196,135,229,152,196,151,230,151,230,152,196,180,225,108,-1,118,-3,117,13,117,13,118,-3,131,11,152,16,131,11,164,1,152,16,164,1,169,29,169,29,164,1,193,19,169,29,193,19,181,49,131,11,118,-3,130,-4,131,11,130,-4,164,1,123,-107,123,-98,104,-97,123,-107,104,-97,91,-93,123,-107,91,-93,37,-76,123,-107,37,-76,34,-86,82,36,79,45,90,8,90,8,79,45,79,17,80,-75,79,-59,51,333,80,-75,51,333,38,329,63,337,51,333,79,-59,63,337,79,-59,76,342,83,175,91,184,92,205,92,205,91,184,103,192,92,205,103,192,106,216,106,216,103,192,117,198,106,216,117,198,120,224,120,224,117,198,131,200,120,224,131,200,135,229,82,36,90,8,91,27,91,27,90,8,99,2,91,27,99,2,103,19,103,19,99,2,108,-1,103,19,108,-1,117,13,92,205,79,166,83,175,6,311,4,320,4,311,123,-107,2,-98,2,-107,37,-76,91,-93,37,-63,37,284,80,-75,38,329,38,329,23,311,30,308,
-198,286,197,294,193,301,188,306,181,310,173,311,165,310,159,306,153,301,150,294,148,286,150,278,153,272,158,266,165,263,172,262,180,263,187,266,193,272,197,278,198,286,16383,16383,99,286,97,294,94,301,88,306,81,310,74,311,66,310,59,306,54,301,50,294,49,286,50,278,54,272,59,266,65,263,73,262,81,263,88,266,94,272,97,278,99,286,16383,16383,238,225,171,225,171,218,179,217,186,216,190,213,193,210,194,205,194,202,193,201,193,198,192,196,143,59,88,184,82,196,81,201,81,204,82,209,85,212,90,215,98,217,109,218,109,225,7,225,7,218,14,217,21,214,26,211,30,206,33,200,99,60,105,47,111,35,116,24,121,9,119,2,116,-8,112,-21,106,-34,100,-44,96,-51,85,-62,80,-65,75,-66,71,-66,69,-65,66,-64,62,-63,63,-63,57,-60,52,-58,42,-56,36,-56,30,-57,24,-60,19,-65,16,-72,15,-79,17,-88,21,-96,28,-102,38,-106,50,-108,71,-105,90,-94,106,-76,122,-49,137,-11,213,192,217,202,221,208,226,213,231,216,238,218,256,359,256,387,100,387,100,359,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,190,253,190,281,35,281,35,253,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,
+198,286,197,294,193,301,188,306,181,310,173,311,165,310,159,306,153,301,150,294,148,286,150,278,153,272,158,266,165,263,172,262,180,263,187,266,193,272,197,278,198,286,16383,16383,99,286,97,294,94,301,88,306,81,310,74,311,66,310,59,306,54,301,50,294,49,286,50,278,54,272,59,266,65,263,73,262,81,263,88,266,94,272,97,278,99,286,16383,16383,238,225,171,225,171,218,179,217,186,216,190,213,193,210,194,205,194,202,193,201,193,198,192,196,143,59,88,184,82,196,81,201,81,204,82,209,85,212,90,215,98,217,109,218,109,225,7,225,7,218,14,217,21,214,26,211,30,206,33,200,99,60,105,47,111,35,116,24,121,9,119,2,116,-8,112,-21,106,-34,100,-44,96,-51,85,-62,80,-65,75,-66,71,-66,69,-65,66,-64,62,-63,63,-63,57,-60,52,-58,42,-56,36,-56,30,-57,24,-60,19,-65,16,-72,15,-79,17,-88,21,-96,28,-102,38,-106,50,-108,71,-105,90,-94,106,-76,122,-49,137,-11,213,192,217,202,221,208,226,213,231,216,238,218,
 148,286,150,278,150,294,150,294,150,278,153,272,150,294,153,272,153,301,153,301,153,272,158,266,153,301,158,266,159,306,159,306,158,266,165,263,159,306,165,263,165,310,165,310,165,263,172,262,165,310,172,262,173,311,173,311,172,262,180,263,173,311,180,263,181,310,181,310,180,263,187,266,181,310,187,266,188,306,188,306,187,266,193,272,188,306,193,272,193,301,193,301,193,272,197,278,193,301,197,278,197,294,197,294,197,278,198,286,49,286,50,278,50,294,50,294,50,278,54,272,50,294,54,272,54,301,54,301,54,272,59,266,54,301,59,266,59,306,59,306,59,266,65,263,59,306,65,263,66,310,66,310,65,263,73,262,66,310,73,262,74,311,74,311,73,262,81,263,74,311,81,263,81,310,81,310,81,263,88,266,81,310,88,266,88,306,88,306,88,266,94,272,88,306,94,272,94,301,94,301,94,272,97,278,94,301,97,278,97,294,97,294,97,278,99,286,90,-57,85,-62,90,-94,90,-94,85,-62,80,-65,90,-94,80,-65,75,-66,75,-66,73,-66,90,-94,90,-94,73,-66,71,-105,90,-57,106,-76,96,-51,96,-51,106,-76,100,-44,106,-34,100,-44,106,-76,106,-34,106,-76,122,-49,143,59,88,184,99,60,143,59,99,60,105,47,143,59,105,47,111,35,143,59,111,35,116,24,143,59,116,24,119,15,143,59,119,15,121,9,143,59,121,9,122,-49,143,59,122,-49,137,-11,143,59,137,-11,213,192,143,59,213,192,192,196,122,-49,121,9,119,2,99,60,88,184,86,188,99,60,86,188,84,192,99,60,84,192,82,196,99,60,82,196,81,201,99,60,81,201,33,200,33,200,81,201,81,204,81,204,82,209,33,200,33,200,82,209,85,212,33,200,85,212,109,225,109,225,85,212,90,215,109,225,90,215,98,217,194,202,193,201,213,192,213,192,193,201,193,198,213,192,193,198,192,196,238,225,171,225,179,217,238,225,179,217,186,216,238,225,186,216,190,213,238,225,190,213,193,210,238,225,193,210,194,205,238,225,194,205,226,213,238,225,226,213,231,216,238,225,231,216,238,218,194,205,213,192,217,202,194,205,217,202,221,208,194,205,221,208,226,213,194,204,194,202,213,192,194,204,213,192,194,205,122,-49,119,2,116,-8,122,-49,116,-8,112,-21,122,-49,112,-21,106,-34,71,-105,73,-66,71,-66,71,-105,71,-66,69,-65,71,-105,69,-65,66,-64,71,-105,66,-64,63,-63,71,-105,63,-63,57,-60,71,-105,57,-60,52,-58,71,-105,52,-58,50,-108,52,-58,47,-57,50,-108,50,-108,47,-57,42,-56,50,-108,42,-56,38,-106,38,-106,42,-56,36,-56,38,-106,36,-56,30,-57,38,-106,30,-57,28,-102,28,-102,30,-57,24,-60,28,-102,24,-60,21,-96,21,-96,24,-60,19,-65,21,-96,19,-65,17,-88,17,-88,19,-65,16,-72,17,-88,16,-72,15,-79,98,217,109,218,109,225,109,225,7,225,14,217,109,225,14,217,21,214,109,225,21,214,26,211,109,225,26,211,30,206,109,225,30,206,33,200,66,-64,62,-63,63,-63,14,217,7,225,7,218,90,-57,90,-94,106,-76,179,217,171,225,171,218,
-166,253,94,328,89,332,85,335,81,337,73,339,66,338,61,336,58,333,55,329,55,318,57,314,60,309,70,301,147,253,55,253,75,253,151,301,157,305,161,309,164,314,166,318,166,329,163,333,160,336,155,338,148,339,140,337,136,335,132,332,
+166,253,94,328,89,332,85,335,81,337,73,339,66,338,61,336,58,333,55,329,55,318,57,314,60,309,70,301,147,253,
 147,253,166,253,94,328,147,253,94,328,89,332,147,253,89,332,85,335,147,253,85,335,81,337,147,253,81,337,77,338,147,253,77,338,73,339,147,253,73,339,70,301,55,323,55,318,55,329,55,329,55,318,57,314,55,329,57,314,58,333,58,333,57,314,60,309,58,333,60,309,61,336,61,336,60,309,65,305,61,336,65,305,66,338,66,338,65,305,70,301,66,338,70,301,73,339,
-55,253,75,253,151,301,157,305,161,309,164,314,166,318,166,329,163,333,160,336,155,338,148,339,140,337,136,335,132,332,127,328,203,253,140,337,109,337,47,253,64,253,124,305,185,253,193,319,188,309,183,302,178,297,173,294,161,294,155,295,148,298,139,302,
+55,253,75,253,151,301,157,305,161,309,164,314,166,318,166,329,163,333,160,336,155,338,148,339,140,337,136,335,132,332,127,328,
 148,339,151,301,155,338,155,338,151,301,157,305,155,338,157,305,160,336,160,336,157,305,161,309,160,336,161,309,163,333,163,333,161,309,164,314,163,333,164,314,166,329,166,329,164,314,166,318,166,329,166,318,166,323,151,301,148,339,144,338,151,301,144,338,140,337,151,301,140,337,136,335,151,301,136,335,132,332,151,301,132,332,127,328,151,301,127,328,75,253,127,328,55,253,75,253,
-203,253,140,337,109,337,47,253,64,253,124,305,185,253,193,319,188,309,183,302,178,297,173,294,161,294,155,295,
+203,253,140,337,109,337,47,253,64,253,124,305,185,253,
 47,253,64,253,109,337,109,337,64,253,124,305,109,337,124,305,140,337,140,337,124,305,185,253,140,337,185,253,203,253,
-193,319,188,309,183,302,178,297,173,294,161,294,155,295,148,298,139,302,128,307,121,311,107,315,100,316,93,316,79,314,67,308,56,298,48,284,42,266,57,266,61,274,65,281,70,285,76,288,83,289,88,289,92,288,98,286,105,282,114,278,125,273,134,269,141,267,148,266,155,266,170,268,182,274,192,284,201,299,208,319,203,273,203,300,47,300,47,273,250,385,250,410,0,410,0,385,180,332,171,313,162,300,151,290,139,285,124,283,107,285,93,291,82,301,73,315,68,332,54,332,56,305,64,283,78,267,98,257,123,253,145,256,164,266,178,281,188,303,194,332,150,286,148,294,145,301,140,306,133,310,124,311,116,310,109,306,104,301,101,294,
+193,319,188,309,183,302,178,297,173,294,161,294,155,295,148,298,139,302,128,307,121,311,107,315,100,316,93,316,79,314,67,308,56,298,48,284,42,266,57,266,61,274,65,281,70,285,76,288,83,289,88,289,92,288,98,286,105,282,114,278,125,273,134,269,141,267,148,266,155,266,170,268,182,274,192,284,201,299,208,319,
 61,274,65,281,67,308,67,308,65,281,70,285,67,308,70,285,79,314,79,314,70,285,76,288,79,314,76,288,83,289,83,289,88,289,93,316,93,316,88,289,92,288,93,316,92,288,98,286,57,266,61,274,67,308,57,266,67,308,56,298,57,266,56,298,48,284,57,266,48,284,42,266,155,266,170,268,161,294,161,294,170,268,166,294,173,294,166,294,170,268,173,294,170,268,182,274,193,319,188,309,192,284,193,319,192,284,201,299,193,319,201,299,208,319,183,302,178,297,182,274,183,302,182,274,192,284,183,302,192,284,188,309,114,313,114,278,121,311,121,311,114,278,125,273,121,311,125,273,128,307,128,307,125,273,134,269,128,307,134,269,139,302,139,302,134,269,141,267,139,302,141,267,148,298,148,298,141,267,148,266,148,298,148,266,155,295,155,295,148,266,155,266,155,295,155,266,161,294,93,316,98,286,100,316,100,316,98,286,105,282,100,316,105,282,107,315,107,315,105,282,114,278,107,315,114,278,114,313,93,316,79,314,83,289,173,294,182,274,178,297,
-203,273,203,300,47,300,47,273,250,385,250,410,0,410,0,385,
+203,273,203,300,47,300,47,273,
 203,273,203,300,47,300,203,273,47,300,47,273,
-250,385,250,410,0,410,0,385,180,332,171,313,162,300,151,290,
+250,385,250,410,0,410,0,385,
 250,385,250,410,0,410,250,385,0,410,0,385,
-180,332,171,313,162,300,151,290,139,285,124,283,107,285,93,291,82,301,73,315,68,332,54,332,56,305,64,283,78,267,98,257,123,253,145,256,164,266,178,281,188,303,194,332,150,286,148,294,145,301,140,306,133,310,124,311,116,310,109,306,104,301,101,294,100,286,101,278,105,272,110,266,117,263,124,262,132,263,139,266,145,271,148,278,150,286,200,286,
+180,332,171,313,162,300,151,290,139,285,124,283,107,285,93,291,82,301,73,315,68,332,54,332,56,305,64,283,78,267,98,257,123,253,145,256,164,266,178,281,188,303,194,332,
 107,285,93,291,98,257,98,257,93,291,82,301,98,257,82,301,78,267,78,267,82,301,73,315,78,267,73,315,68,332,171,313,162,300,164,266,164,266,162,300,151,290,164,266,151,290,145,256,145,256,151,290,139,285,145,256,139,285,124,283,124,283,107,285,123,253,123,253,107,285,98,257,68,332,54,332,56,305,68,332,56,305,64,283,68,332,64,283,78,267,180,332,171,313,178,281,180,332,178,281,188,303,180,332,188,303,194,332,124,283,123,253,145,256,171,313,164,266,178,281,
-150,286,148,294,145,301,140,306,133,310,124,311,116,310,109,306,104,301,101,294,100,286,101,278,105,272,110,266,117,263,124,262,132,263,139,266,145,271,148,278,150,286,200,286,198,294,195,301,189,306,182,310,175,311,167,310,160,306,155,301,151,294,150,286,151,278,155,272,160,266,166,263,174,262,182,263,189,266,195,272,198,278,200,286,
+150,286,148,294,145,301,140,306,133,310,124,311,116,310,109,306,104,301,101,294,100,286,101,278,105,272,110,266,117,263,124,262,132,263,139,266,145,271,148,278,150,286,
 124,262,132,263,133,310,133,310,132,263,139,266,133,310,139,266,140,306,140,306,139,266,145,271,140,306,145,271,145,301,145,301,145,271,148,278,145,301,148,278,148,294,148,294,148,278,150,286,101,294,101,278,104,301,104,301,101,278,105,272,104,301,105,272,109,306,109,306,105,272,110,266,109,306,110,266,116,310,116,310,110,266,117,263,116,310,117,263,124,311,124,311,117,263,124,262,124,311,124,262,133,310,101,278,101,294,100,286,
-200,286,198,294,195,301,189,306,182,310,175,311,167,310,160,306,155,301,151,294,150,286,151,278,155,272,160,266,166,263,174,262,182,263,189,266,195,272,198,278,200,286,16383,16383,100,286,99,294,95,301,90,306,83,310,75,311,67,310,60,306,55,301,51,294,50,286,51,278,55,272,60,266,67,263,75,262,83,263,90,266,95,272,99,278,100,286,109,291,109,246,126,246,127,263,131,263,147,266,160,274,171,287,178,303,181,321,179,337,175,352,165,364,150,373,129,376,122,375,116,374,109,372,104,370,99,367,94,363,91,359,88,354,86,346,87,342,89,338,92,335,96,333,100,332,109,335,113,343,116,353,121,361,131,364,139,362,146,356,150,347,153,336,153,325,152,314,146,304,138,297,128,292,
+200,286,198,294,195,301,189,306,182,310,175,311,167,310,160,306,155,301,151,294,150,286,151,278,155,272,160,266,166,263,174,262,182,263,189,266,195,272,198,278,200,286,16383,16383,100,286,99,294,95,301,90,306,83,310,75,311,67,310,60,306,55,301,51,294,50,286,51,278,55,272,60,266,67,263,75,262,83,263,90,266,95,272,99,278,100,286,
 75,311,75,262,83,310,83,310,75,262,83,263,83,310,83,263,90,306,90,306,83,263,90,266,90,306,90,266,95,301,95,301,90,266,95,272,95,301,95,272,99,294,99,294,95,272,99,278,99,294,99,278,100,286,50,286,51,278,51,294,51,294,51,278,55,272,51,294,55,272,55,301,55,301,55,272,60,266,55,301,60,266,60,306,60,306,60,266,67,263,60,306,67,263,67,310,67,310,67,263,75,262,67,310,75,262,75,311,150,286,151,278,151,294,151,294,151,278,155,272,151,294,155,272,155,301,155,301,155,272,160,266,155,301,160,266,160,306,160,306,160,266,166,263,160,306,166,263,167,310,167,310,166,263,174,262,167,310,174,262,175,311,175,311,174,262,182,263,175,311,182,263,182,310,182,310,182,263,189,266,182,310,189,266,189,306,189,306,189,266,195,272,189,306,195,272,195,301,195,301,195,272,198,278,195,301,198,278,198,294,198,294,198,278,200,286,
-109,291,109,246,126,246,127,263,131,263,147,266,160,274,171,287,178,303,181,321,179,337,175,352,165,364,150,373,129,376,122,375,116,374,109,372,104,370,99,367,94,363,91,359,88,354,86,346,87,342,89,338,92,335,96,333,100,332,109,335,113,343,116,353,121,361,131,364,139,362,146,356,150,347,153,336,153,325,152,314,146,304,138,297,128,292,116,291,175,305,173,321,165,335,155,346,141,353,126,355,110,353,96,346,85,335,78,322,75,306,78,290,85,276,95,266,109,259,124,256,140,259,154,266,165,276,173,290,175,305,16383,16383,158,306,156,295,152,286,144,279,135,275,124,273,114,275,106,279,99,286,94,295,93,306,94,316,99,325,106,332,115,337,124,339,135,337,144,332,151,325,156,316,158,306,118,253,
+109,291,109,246,126,246,127,263,131,263,147,266,160,274,171,287,178,303,181,321,179,337,175,352,165,364,150,373,129,376,122,375,116,374,109,372,104,370,99,367,94,363,91,359,88,354,86,346,87,342,89,338,92,335,96,333,100,332,109,335,113,343,116,353,121,361,131,364,139,362,146,356,150,347,153,336,153,325,152,314,146,304,138,297,128,292,116,291,
 131,364,129,376,122,375,131,364,122,375,121,361,131,364,150,373,129,376,121,361,122,375,116,353,116,353,122,375,116,374,116,353,116,374,113,343,113,343,116,374,109,372,113,343,109,372,109,335,109,335,109,372,104,370,109,335,104,370,100,332,100,332,104,370,99,367,100,332,99,367,96,333,96,333,99,367,94,363,96,333,94,363,92,335,92,335,94,363,91,359,92,335,91,359,89,338,89,338,91,359,88,354,89,338,88,354,87,342,87,342,88,354,87,350,87,342,87,350,86,346,181,321,179,337,178,303,178,303,179,337,175,352,178,303,175,352,171,287,171,287,175,352,165,364,171,287,165,364,160,274,160,274,165,364,153,325,153,336,153,325,165,364,153,336,165,364,150,373,153,336,150,373,150,347,150,373,131,364,139,362,150,373,139,362,146,356,150,373,146,356,150,347,152,314,146,304,147,266,152,314,147,266,160,274,152,314,160,274,153,325,126,246,127,263,128,292,128,292,127,263,131,263,128,292,131,263,138,297,138,297,131,263,147,266,138,297,147,266,146,304,126,246,128,292,116,291,126,246,116,291,109,291,126,246,109,291,109,246,
-175,305,173,321,165,335,155,346,141,353,126,355,110,353,96,346,85,335,78,322,75,306,78,290,85,276,95,266,109,259,124,256,140,259,154,266,165,276,173,290,175,305,16383,16383,158,306,156,295,152,286,144,279,135,275,124,273,114,275,106,279,99,286,94,295,93,306,94,316,99,325,106,332,115,337,124,339,135,337,144,332,151,325,156,316,158,306,118,253,137,253,214,301,220,305,224,310,227,314,229,324,228,329,226,333,222,336,218,338,212,339,208,339,204,338,200,336,196,333,190,328,16383,16383,40,253,60,253,137,301,142,305,146,310,149,314,151,319,151,324,150,329,148,333,144,336,140,338,134,339,130,339,126,338,123,336,118,333,113,328,203,337,185,337,125,286,65,337,47,337,109,253,141,253,
+175,305,173,321,165,335,155,346,141,353,126,355,110,353,96,346,85,335,78,322,75,306,78,290,85,276,95,266,109,259,124,256,140,259,154,266,165,276,173,290,175,305,16383,16383,158,306,156,295,152,286,144,279,135,275,124,273,114,275,106,279,99,286,94,295,93,306,94,316,99,325,106,332,115,337,124,339,135,337,144,332,151,325,156,316,158,306,
 156,295,152,286,154,266,154,266,152,286,144,279,154,266,144,279,140,259,140,259,144,279,135,275,140,259,135,275,124,256,124,256,135,275,124,273,126,355,124,339,135,337,126,355,135,337,141,353,141,353,135,337,144,332,141,353,144,332,155,346,155,346,144,332,151,325,155,346,151,325,156,316,175,305,173,321,173,290,173,290,173,321,165,335,173,290,165,335,165,276,165,276,165,335,158,306,156,316,158,306,165,335,156,316,165,335,155,346,156,295,154,266,165,276,156,295,165,276,158,306,99,325,106,332,110,353,110,353,106,332,115,337,110,353,115,337,126,355,126,355,115,337,124,339,96,346,85,335,93,306,96,346,93,306,94,316,96,346,94,316,99,325,96,346,99,325,110,353,99,286,94,295,95,266,95,266,94,295,93,306,114,275,106,279,109,259,114,275,109,259,124,256,114,275,124,256,124,273,99,286,95,266,109,259,99,286,109,259,106,279,75,306,78,290,78,322,78,322,78,290,85,276,78,322,85,276,85,335,85,335,85,276,95,266,85,335,95,266,93,306,
-118,253,137,253,214,301,220,305,224,310,227,314,229,324,228,329,226,333,222,336,218,338,212,339,208,339,204,338,200,336,196,333,190,328,16383,16383,40,253,60,253,137,301,142,305,146,310,149,314,151,319,151,324,150,329,148,333,144,336,140,338,134,339,130,339,126,338,123,336,118,333,113,328,203,337,185,337,125,286,65,337,47,337,109,253,141,253,142,250,142,350,115,350,115,250,174,250,174,350,146,350,146,250,16383,16383,104,250,104,350,77,350,77,250,229,253,156,328,151,333,146,336,142,338,138,339,134,339,129,338,124,336,121,333,119,329,118,324,118,319,120,314,123,310,127,305,
+118,253,137,253,214,301,220,305,224,310,227,314,229,324,228,329,226,333,222,336,218,338,212,339,208,339,204,338,200,336,196,333,190,328,16383,16383,40,253,60,253,137,301,142,305,146,310,149,314,151,319,151,324,150,329,148,333,144,336,140,338,134,339,130,339,126,338,123,336,118,333,113,328,
 212,339,214,301,218,338,218,338,214,301,220,305,218,338,220,305,222,336,222,336,220,305,224,310,222,336,224,310,226,333,226,333,224,310,227,314,226,333,227,314,228,329,228,329,227,314,228,319,228,329,228,319,229,324,214,301,212,339,208,339,214,301,208,339,204,338,214,301,204,338,200,336,214,301,200,336,196,333,214,301,196,333,190,328,214,301,190,328,137,253,134,339,137,301,140,338,140,338,137,301,142,305,140,338,142,305,144,336,144,336,142,305,146,310,144,336,146,310,148,333,148,333,146,310,149,314,148,333,149,314,150,329,150,329,149,314,151,319,150,329,151,319,151,324,137,301,134,339,130,339,137,301,130,339,126,338,137,301,126,338,123,336,137,301,123,336,118,333,137,301,118,333,113,328,137,301,113,328,60,253,60,253,113,328,40,253,137,253,190,328,118,253,
-203,337,185,337,125,286,65,337,47,337,109,253,141,253,142,250,142,350,115,350,115,250,174,250,174,350,146,350,
+203,337,185,337,125,286,65,337,47,337,109,253,141,253,
 203,337,185,337,141,253,141,253,185,337,125,286,141,253,125,286,109,253,109,253,125,286,65,337,109,253,65,337,47,337,
-142,250,142,350,115,350,115,250,174,250,174,350,146,350,146,250,
+142,250,142,350,115,350,115,250,
 142,250,142,350,115,350,142,250,115,350,115,250,
-174,250,174,350,146,350,146,250,16383,16383,104,250,104,350,77,350,77,250,229,253,156,328,151,333,146,336,142,338,138,339,134,339,129,338,124,336,
+174,250,174,350,146,350,146,250,16383,16383,104,250,104,350,77,350,77,250,
 146,350,146,250,174,250,146,350,174,250,174,350,77,350,77,250,104,250,77,350,104,250,104,350,
-229,253,156,328,151,333,146,336,142,338,138,339,134,339,129,338,124,336,121,333,119,329,118,324,118,319,120,314,123,310,127,305,132,301,209,253,16383,16383,151,253,78,328,73,333,68,336,64,338,60,339,56,339,51,338,46,336,43,333,40,329,40,319,42,314,44,310,49,305,54,301,131,253,150,358,148,366,145,373,140,379,133,382,124,383,116,382,109,379,104,373,101,366,100,358,101,351,105,344,110,339,117,335,124,334,132,335,139,339,145,344,148,350,150,358,16383,16383,180,332,171,313,162,300,151,290,139,285,124,283,107,285,93,291,82,301,73,315,68,332,54,332,56,305,64,283,
+229,253,156,328,151,333,146,336,142,338,138,339,134,339,129,338,124,336,121,333,119,329,118,324,118,319,120,314,123,310,127,305,132,301,209,253,16383,16383,151,253,78,328,73,333,68,336,64,338,60,339,56,339,51,338,46,336,43,333,40,329,40,319,42,314,44,310,49,305,54,301,131,253,
 209,253,229,253,156,328,209,253,156,328,151,333,209,253,151,333,146,336,209,253,146,336,142,338,209,253,142,338,138,339,209,253,138,339,134,339,209,253,134,339,132,301,118,324,118,319,119,329,119,329,118,319,120,314,119,329,120,314,121,333,121,333,120,314,123,310,121,333,123,310,124,336,124,336,123,310,127,305,124,336,127,305,129,338,129,338,127,305,132,301,129,338,132,301,134,339,131,253,151,253,78,328,131,253,78,328,73,333,131,253,73,333,68,336,131,253,68,336,64,338,131,253,64,338,60,339,131,253,60,339,56,339,131,253,56,339,54,301,40,324,40,319,40,329,40,329,40,319,42,314,40,329,42,314,43,333,43,333,42,314,44,310,43,333,44,310,46,336,46,336,44,310,49,305,46,336,49,305,51,338,51,338,49,305,54,301,51,338,54,301,56,339,
-353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,22,258,18,256,15,252,13,248,12,226,9,226,0,16383,16383,224,128,108,128,166,266,211,175,235,181,254,191,268,205,277,224,280,248,274,277,258,300,232,317,195,327,148,331,8,331,8,321,29,320,43,316,51,308,55,295,56,275,56,56,55,37,51,24,42,16,29,11,8,9,8,0,177,0,217,4,250,15,275,34,291,58,296,89,292,116,281,138,263,155,239,167,211,174,16383,16383,108,183,108,303,109,307,112,310,115,312,119,313,162,310,192,302,
+353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,22,258,18,256,15,252,13,248,12,226,9,226,0,16383,16383,224,128,108,128,166,266,
 55,58,73,22,72,30,72,30,72,34,70,93,70,93,72,34,73,38,70,93,73,38,74,43,174,337,76,51,99,108,174,337,99,108,108,128,108,128,99,108,230,108,108,128,230,108,224,128,224,128,230,108,306,55,224,128,306,55,184,337,258,18,256,15,353,0,353,0,256,15,252,13,353,0,252,13,248,12,261,26,353,0,330,17,261,26,330,17,321,26,261,26,321,26,314,38,261,26,314,38,306,55,261,26,306,55,260,31,306,55,230,108,251,61,306,55,251,61,254,53,306,55,254,53,257,45,306,55,257,45,259,38,306,55,259,38,260,31,174,337,108,128,166,266,174,337,166,266,224,128,174,337,224,128,184,337,70,93,55,58,72,30,70,93,74,43,75,47,70,93,75,47,76,51,70,93,76,51,174,337,340,12,330,17,353,0,340,12,353,0,353,9,260,22,258,18,353,0,260,22,353,0,261,26,226,9,226,0,353,0,226,9,353,0,248,12,107,0,107,9,94,10,107,0,94,10,84,12,107,0,84,12,44,34,107,0,44,34,33,20,107,0,33,20,22,13,107,0,22,13,7,9,107,0,7,9,7,0,44,34,84,12,77,16,44,34,77,16,73,22,44,34,73,22,55,58,
-211,175,235,181,254,191,268,205,277,224,280,248,274,277,258,300,232,317,195,327,148,331,8,331,8,321,29,320,43,316,51,308,55,295,56,275,56,56,55,37,51,24,42,16,29,11,8,9,8,0,177,0,217,4,250,15,275,34,291,58,296,89,292,116,281,138,263,155,239,167,211,174,16383,16383,108,183,108,303,109,307,112,310,115,312,119,313,162,310,192,302,213,289,225,270,228,245,225,223,214,205,197,193,172,186,139,183,16383,16383,108,163,140,163,171,161,198,155,220,142,234,121,239,89,234,59,220,39,198,26,170,20,138,18,126,19,118,21,112,26,109,32,108,41,289,247,286,331,6,331,6,321,25,319,38,315,45,307,49,294,50,276,50,62,49,40,45,25,37,16,25,12,6,9,6,0,146,0,146,9,126,11,113,16,105,24,101,37,100,56,100,292,101,300,103,306,106,310,111,311,118,312,206,312,232,310,251,303,264,291,272,273,276,247,338,0,184,337,174,337,24,0,16383,16383,262,46,68,46,166,266,299,84,285,84,271,57,254,38,230,26,197,20,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,
+211,175,235,181,254,191,268,205,277,224,280,248,274,277,258,300,232,317,195,327,148,331,8,331,8,321,29,320,43,316,51,308,55,295,56,275,56,56,55,37,51,24,42,16,29,11,8,9,8,0,177,0,217,4,250,15,275,34,291,58,296,89,292,116,281,138,263,155,239,167,211,174,16383,16383,108,183,108,303,109,307,112,310,115,312,119,313,162,310,192,302,213,289,225,270,228,245,225,223,214,205,197,193,172,186,139,183,16383,16383,108,163,140,163,171,161,198,155,220,142,234,121,239,89,234,59,220,39,198,26,170,20,138,18,126,19,118,21,112,26,109,32,108,41,
 51,24,42,16,177,0,177,0,42,16,29,11,177,0,29,11,8,9,55,295,56,275,112,310,55,295,112,310,148,331,148,331,112,310,115,312,148,331,115,312,119,313,119,313,162,310,148,331,148,331,162,310,195,327,239,89,234,59,250,15,250,15,234,59,220,39,250,15,220,39,217,4,217,4,220,39,198,26,217,4,198,26,177,0,177,0,198,26,170,20,177,0,170,20,138,18,138,18,126,19,177,0,177,0,126,19,118,21,177,0,118,21,55,37,55,37,118,21,56,56,213,289,225,270,232,317,232,317,225,270,228,245,235,181,228,245,225,223,195,327,162,310,192,302,195,327,192,302,213,289,195,327,213,289,232,317,235,181,254,191,258,300,258,300,254,191,268,205,258,300,268,205,274,277,274,277,268,205,277,224,274,277,277,224,280,248,232,317,228,245,235,181,232,317,235,181,258,300,234,121,239,167,220,142,220,142,239,167,211,174,220,142,211,174,198,155,198,155,211,174,211,175,198,155,211,175,214,205,214,205,211,175,235,181,214,205,235,181,225,223,140,163,171,161,172,186,172,186,171,161,198,155,172,186,198,155,197,193,197,193,198,155,214,205,140,163,172,186,139,183,140,163,139,183,108,183,140,163,108,183,108,163,109,32,108,41,56,275,109,32,56,275,56,56,296,89,292,116,291,58,291,58,292,116,281,138,291,58,281,138,275,34,275,34,281,138,263,155,275,34,263,155,250,15,250,15,263,155,239,167,250,15,239,167,239,89,56,56,118,21,112,26,56,56,112,26,109,32,56,275,108,41,108,296,56,275,108,296,108,303,56,275,108,303,109,307,56,275,109,307,112,310,148,331,8,331,29,320,148,331,29,320,43,316,148,331,43,316,51,308,148,331,51,308,55,295,29,320,8,331,8,321,177,0,8,9,8,0,51,24,177,0,55,37,239,167,234,121,239,89,
-289,247,286,331,6,331,6,321,25,319,38,315,45,307,49,294,50,276,50,62,49,40,45,25,37,16,25,12,6,9,6,0,146,0,146,9,126,11,113,16,105,24,101,37,100,56,100,292,101,300,103,306,106,310,111,311,118,312,206,312,232,310,251,303,264,291,272,273,276,247,338,0,184,337,174,337,24,0,16383,16383,262,46,68,46,166,266,299,84,285,84,271,57,254,38,230,26,197,20,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,
+289,247,286,331,6,331,6,321,25,319,38,315,45,307,49,294,50,276,50,62,49,40,45,25,37,16,25,12,6,9,6,0,146,0,146,9,126,11,113,16,105,24,101,37,100,56,100,292,101,300,103,306,106,310,111,311,118,312,206,312,232,310,251,303,264,291,272,273,276,247,
 38,315,45,307,286,331,286,331,45,307,111,311,286,331,111,311,118,312,286,331,118,312,206,312,286,331,206,312,232,310,286,331,232,310,251,303,286,331,251,303,264,291,286,331,264,291,272,273,286,331,272,273,276,247,286,331,276,247,289,247,100,56,100,292,50,276,50,276,100,292,101,300,50,276,101,300,103,306,50,276,103,306,106,310,50,276,106,310,49,294,50,276,101,37,100,56,111,311,45,307,49,294,111,311,49,294,106,310,25,319,38,315,286,331,25,319,286,331,6,331,25,319,6,331,6,321,146,0,146,9,126,11,146,0,126,11,113,16,146,0,113,16,49,40,146,0,49,40,45,25,146,0,45,25,37,16,146,0,37,16,25,12,146,0,25,12,6,9,146,0,6,9,6,0,50,62,49,40,113,16,50,62,113,16,105,24,50,62,105,24,101,37,50,62,101,37,50,276,
-338,0,184,337,174,337,24,0,16383,16383,262,46,68,46,166,266,299,84,285,84,271,57,254,38,230,26,197,20,151,18,132,19,
+338,0,184,337,174,337,24,0,16383,16383,262,46,68,46,166,266,
 174,337,24,0,68,46,68,46,24,0,338,0,68,46,338,0,262,46,262,46,338,0,184,337,262,46,184,337,174,337,174,337,68,46,166,266,174,337,166,266,262,46,
-299,84,285,84,271,57,254,38,230,26,197,20,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,118,312,179,311,219,306,243,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,299,88,287,88,282,72,278,59,273,49,266,40,257,33,249,28,240,24,228,21,215,20,199,19,73,19,289,324,289,331,26,331,16,246,29,246,32,260,35,271,38,279,43,287,50,295,58,301,68,306,81,309,97,311,117,312,224,312,5,7,5,0,286,0,352,0,352,9,333,12,320,17,312,25,308,37,307,55,307,274,308,293,312,307,320,315,333,319,352,321,352,331,211,331,211,321,231,319,244,315,251,307,255,294,256,274,256,180,104,180,104,274,
+299,84,285,84,271,57,254,38,230,26,197,20,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,118,312,179,311,219,306,243,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,
 45,24,38,16,276,0,276,0,38,16,25,12,276,0,25,12,6,9,38,315,45,307,271,331,271,331,45,307,111,312,271,331,111,312,118,312,118,312,179,311,271,331,271,331,179,311,219,306,271,331,219,306,243,297,271,331,243,297,255,282,271,331,255,282,261,259,271,331,261,259,273,259,45,24,117,21,49,37,49,37,117,21,108,25,49,37,108,25,50,57,50,57,108,25,102,31,50,57,102,31,50,275,50,275,102,31,100,42,50,275,100,42,100,294,100,184,100,164,176,164,100,184,176,164,176,184,198,185,176,184,198,162,198,185,198,162,213,190,213,190,198,162,213,158,213,190,213,158,222,198,222,198,213,158,222,150,222,198,222,150,229,212,229,212,222,150,229,136,229,212,229,136,233,232,233,232,229,136,233,115,233,232,233,115,244,115,50,275,100,294,101,302,50,275,101,302,103,307,50,275,103,307,106,310,50,275,106,310,49,294,106,310,111,312,45,307,106,310,45,307,49,294,25,320,38,315,271,331,25,320,271,331,6,331,25,320,6,331,6,321,254,38,230,26,276,0,276,0,230,26,197,20,276,0,197,20,151,18,151,18,132,19,276,0,276,0,132,19,117,21,276,0,117,21,45,24,276,0,299,84,285,84,276,0,285,84,271,57,276,0,271,57,254,38,176,184,176,164,198,162,233,232,244,115,244,232,276,0,6,9,6,0,
-299,88,287,88,282,72,278,59,273,49,266,40,257,33,249,28,240,24,228,21,215,20,199,19,73,19,289,324,289,331,26,331,16,246,29,246,32,260,35,271,38,279,43,287,50,295,58,301,68,306,81,309,97,311,117,312,224,312,5,7,5,0,286,0,352,0,352,9,333,12,320,17,312,25,308,37,307,55,307,274,308,293,312,307,320,315,333,319,352,321,352,331,211,331,211,321,231,319,244,315,251,307,255,294,256,274,256,180,104,180,104,274,106,294,110,307,118,315,130,319,149,321,149,331,9,331,9,321,
+299,88,287,88,282,72,278,59,273,49,266,40,257,33,249,28,240,24,228,21,215,20,199,19,73,19,289,324,289,331,26,331,16,246,29,246,32,260,35,271,38,279,43,287,50,295,58,301,68,306,81,309,97,311,117,312,224,312,5,7,5,0,286,0,
 35,271,38,279,26,331,26,331,38,279,43,287,26,331,43,287,50,295,50,295,58,301,26,331,26,331,58,301,68,306,26,331,68,306,81,309,73,19,289,324,224,312,224,312,289,324,289,331,224,312,289,331,117,312,97,311,117,312,289,331,97,311,289,331,26,331,26,331,16,246,29,246,26,331,29,246,32,260,26,331,32,260,35,271,224,312,5,7,73,19,73,19,5,7,286,0,73,19,286,0,199,19,199,19,286,0,215,20,278,59,273,49,286,0,286,0,273,49,266,40,286,0,266,40,257,33,257,33,249,28,286,0,286,0,249,28,240,24,286,0,240,24,228,21,286,0,299,88,287,88,286,0,287,88,282,72,286,0,282,72,278,59,286,0,5,7,5,0,215,20,286,0,228,21,26,331,81,309,97,311,
-352,0,352,9,333,12,320,17,312,25,308,37,307,55,307,274,308,293,312,307,320,315,333,319,352,321,352,331,211,331,211,321,231,319,244,315,251,307,255,294,256,274,256,180,104,180,104,274,106,294,110,307,118,315,130,319,149,321,149,331,9,331,9,321,28,319,41,315,49,307,53,294,54,274,54,61,53,39,49,25,42,16,29,12,9,9,9,0,148,0,148,9,129,12,117,17,109,25,105,38,104,56,104,157,256,157,256,62,255,41,252,26,244,17,232,12,212,9,212,0,251,118,249,129,247,142,245,170,245,189,246,197,247,204,251,220,238,220,235,211,231,203,226,197,218,193,209,191,156,191,146,192,139,196,133,201,129,209,124,220,112,220,114,210,116,197,117,184,117,172,118,161,118,153,115,126,113,118,125,118,129,129,134,138,139,144,146,148,156,149,209,149,219,148,226,144,231,137,235,128,238,118,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,
+352,0,352,9,333,12,320,17,312,25,308,37,307,55,307,274,308,293,312,307,320,315,333,319,352,321,352,331,211,331,211,321,231,319,244,315,251,307,255,294,256,274,256,180,104,180,104,274,106,294,110,307,118,315,130,319,149,321,149,331,9,331,9,321,28,319,41,315,49,307,53,294,54,274,54,61,53,39,49,25,42,16,29,12,9,9,9,0,148,0,148,9,129,12,117,17,109,25,105,38,104,56,104,157,256,157,256,62,255,41,252,26,244,17,232,12,212,9,212,0,
 49,25,42,16,148,0,148,0,42,16,29,12,148,0,29,12,9,9,149,331,9,331,28,319,149,331,28,319,41,315,149,331,41,315,49,307,149,331,49,307,53,294,149,331,53,294,118,315,149,331,118,315,130,319,149,331,130,319,149,321,54,274,105,38,104,56,104,180,104,157,256,157,104,180,256,157,256,180,256,180,256,157,312,25,256,180,312,25,308,37,54,274,104,56,104,274,54,274,104,274,106,294,54,274,106,294,110,307,54,274,110,307,118,315,54,274,118,315,53,294,252,26,244,17,352,0,352,0,244,17,232,12,352,0,232,12,212,9,333,319,352,321,352,331,333,319,352,331,320,315,320,315,352,331,255,294,320,315,255,294,256,274,308,37,256,274,256,180,307,55,307,274,256,274,256,274,307,274,308,293,256,274,308,293,312,307,352,331,211,331,231,319,352,331,231,319,244,315,352,331,244,315,251,307,352,331,251,307,255,294,352,0,352,9,333,12,352,0,333,12,320,17,352,0,320,17,255,41,352,0,255,41,252,26,256,62,255,41,320,17,256,62,320,17,312,25,256,62,312,25,256,157,148,0,148,9,129,12,148,0,129,12,117,17,148,0,117,17,53,39,148,0,53,39,49,25,54,61,53,39,117,17,54,61,117,17,109,25,54,61,109,25,105,38,54,61,105,38,54,274,148,0,9,9,9,0,352,0,212,9,212,0,256,274,308,37,307,55,231,319,211,331,211,321,320,315,256,274,312,307,28,319,9,331,9,321,
-251,118,249,129,247,142,245,170,245,189,246,197,247,204,251,220,238,220,235,211,231,203,226,197,218,193,209,191,156,191,146,192,139,196,133,201,129,209,124,220,112,220,114,210,116,197,117,184,117,172,118,161,118,153,115,126,113,118,125,118,129,129,134,138,139,144,146,148,156,149,209,149,219,148,226,144,231,137,235,128,238,118,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,362,0,362,9,349,11,336,16,322,25,305,41,283,64,166,192,259,281,278,298,292,309,305,316,320,320,338,321,338,331,208,331,208,321,220,321,229,320,235,318,238,315,240,311,241,305,239,298,234,289,226,280,202,256,113,174,113,293,117,307,124,315,137,319,158,321,158,331,17,331,17,321,37,319,50,315,57,306,61,293,62,275,62,63,61,40,57,26,50,17,36,12,17,9,17,0,157,0,157,9,139,12,126,16,118,23,114,36,113,55,113,148,126,158,176,107,198,84,217,63,232,46,241,32,244,22,244,18,241,15,237,12,231,11,224,10,210,9,210,0,344,0,344,9,330,12,320,17,311,26,304,38,296,55,179,337,
+251,118,249,129,247,142,245,170,245,189,246,197,247,204,251,220,238,220,235,211,231,203,226,197,218,193,209,191,156,191,146,192,139,196,133,201,129,209,124,220,112,220,114,210,116,197,117,184,117,172,118,161,118,153,115,126,113,118,125,118,129,129,134,138,139,144,146,148,156,149,209,149,219,148,226,144,231,137,235,128,238,118,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,
 207,316,219,311,235,330,235,330,219,311,231,305,235,330,231,305,242,296,242,296,257,279,280,306,280,306,257,279,270,257,280,306,270,257,279,231,134,308,149,314,180,338,180,338,149,314,164,318,180,338,164,318,180,320,180,320,194,319,235,330,235,330,194,319,207,316,235,330,180,338,180,320,247,142,246,156,238,220,238,220,246,156,245,170,238,220,245,170,245,180,245,180,245,189,238,220,238,220,245,189,246,197,238,220,246,197,247,204,249,212,251,220,238,220,249,212,238,220,247,204,280,103,272,76,279,24,279,24,272,76,260,53,279,24,260,53,246,35,246,35,235,26,279,24,279,24,235,26,234,1,344,166,336,222,336,108,336,108,336,222,314,269,336,108,314,269,314,60,314,60,314,269,287,169,285,201,287,169,314,269,285,201,314,269,280,306,285,201,280,306,279,231,280,306,235,330,242,296,314,60,287,169,285,134,314,60,285,134,280,103,314,60,280,103,279,24,234,1,235,26,223,19,234,1,223,19,209,15,234,1,209,15,196,12,234,1,196,12,181,11,234,1,181,11,180,-6,226,144,231,137,231,203,231,203,231,137,235,128,231,203,235,128,235,211,235,211,235,128,238,118,235,211,238,118,238,220,238,220,238,118,249,129,238,220,249,129,247,142,156,149,209,149,209,191,218,193,209,191,219,148,218,193,219,148,226,197,226,197,219,148,226,144,226,197,226,144,231,203,209,191,156,191,156,149,146,148,156,149,156,191,146,148,156,191,146,192,146,148,146,192,139,144,139,144,146,192,139,196,139,144,139,196,134,138,134,138,139,196,133,201,134,138,133,201,129,129,129,129,133,201,129,209,129,129,129,209,125,118,125,118,129,209,124,220,125,118,124,220,118,161,118,161,124,220,117,172,124,220,112,220,114,210,124,220,114,210,116,197,124,220,116,197,117,184,124,220,117,184,117,172,125,118,118,161,118,153,125,118,118,153,117,144,125,118,117,144,116,135,125,118,116,135,115,126,125,118,115,126,113,118,134,308,126,330,121,298,121,298,126,330,108,286,97,269,108,286,126,330,97,269,126,330,81,307,81,102,81,24,90,75,90,75,81,24,126,1,90,75,126,1,103,52,103,52,126,1,119,33,130,25,119,33,126,1,130,25,126,1,180,-6,81,307,46,271,46,61,81,307,46,61,74,166,81,307,74,166,76,194,81,307,76,194,80,222,81,307,80,222,87,247,81,307,87,247,97,269,81,102,76,132,81,24,81,24,76,132,74,166,24,109,46,61,46,271,24,109,46,271,24,224,24,109,24,224,17,167,154,15,180,-6,167,12,167,12,180,-6,181,11,142,19,130,25,180,-6,142,19,180,-6,154,15,81,24,74,166,46,61,126,330,134,308,180,338,209,191,209,149,219,148,249,129,238,118,251,118,
-157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,362,0,362,9,349,11,336,16,322,25,305,41,283,64,166,192,259,281,278,298,292,309,305,316,320,320,338,321,338,331,208,331,208,321,220,321,229,320,235,318,238,315,240,311,241,305,239,298,234,289,226,280,202,256,
+157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,
 52,23,44,15,157,0,157,0,44,15,30,11,157,0,30,11,9,9,157,331,9,331,30,320,157,331,30,320,44,316,157,331,44,316,53,308,157,331,53,308,57,295,157,331,57,295,122,316,157,331,122,316,136,320,157,331,136,320,157,321,122,16,114,24,57,56,57,56,114,24,109,37,57,56,109,37,57,276,57,276,109,37,108,56,57,276,108,56,108,276,57,276,108,276,109,295,57,276,109,295,113,308,57,276,113,308,122,316,57,276,122,316,57,295,157,0,157,9,137,11,157,0,137,11,122,16,157,0,122,16,56,36,157,0,56,36,52,23,157,0,9,9,9,0,56,36,122,16,57,56,30,320,9,331,9,321,
-362,0,362,9,349,11,336,16,322,25,305,41,283,64,166,192,259,281,278,298,292,309,305,316,320,320,338,321,338,331,208,331,208,321,220,321,229,320,235,318,238,315,240,311,241,305,239,298,234,289,226,280,202,256,113,174,113,293,117,307,124,315,137,319,158,321,158,331,17,331,17,321,37,319,50,315,57,306,61,293,62,275,62,63,61,40,57,26,50,17,36,12,17,9,17,0,157,0,157,9,139,12,126,16,118,23,114,36,113,55,113,148,126,158,176,107,198,84,217,63,232,46,241,32,244,22,244,18,241,15,237,12,231,11,224,10,210,9,210,0,344,0,344,9,330,12,320,17,311,26,304,38,296,55,179,337,169,337,70,93,56,58,44,34,34,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,160,267,161,267,241,61,244,51,247,44,249,37,250,31,251,26,249,18,244,13,236,11,227,10,216,9,216,0,432,0,432,9,413,12,401,17,393,25,389,38,388,56,388,275,389,294,393,307,401,316,413,320,431,321,431,331,332,331,222,80,106,331,7,331,7,321,28,319,42,315,50,307,54,294,55,275,55,75,54,47,49,29,41,18,27,12,
+362,0,362,9,349,11,336,16,322,25,305,41,283,64,166,192,259,281,278,298,292,309,305,316,320,320,338,321,338,331,208,331,208,321,220,321,229,320,235,318,238,315,240,311,241,305,239,298,234,289,226,280,202,256,113,174,113,293,117,307,124,315,137,319,158,321,158,331,17,331,17,321,37,319,50,315,57,306,61,293,62,275,62,63,61,40,57,26,50,17,36,12,17,9,17,0,157,0,157,9,139,12,126,16,118,23,114,36,113,55,113,148,126,158,176,107,198,84,217,63,232,46,241,32,244,22,244,18,241,15,237,12,231,11,224,10,210,9,210,0,
 158,321,158,321,137,319,137,319,158,321,158,331,137,319,158,331,124,315,124,315,158,331,61,293,124,315,61,293,62,275,114,36,62,275,62,63,114,36,62,63,118,23,118,23,62,63,126,16,62,275,114,36,113,55,113,174,113,148,126,158,113,174,126,158,202,256,202,256,126,158,166,192,202,256,166,192,259,281,62,275,113,55,113,274,62,275,113,274,113,293,62,275,113,293,117,307,62,275,117,307,124,315,158,331,17,331,37,319,158,331,37,319,50,315,158,331,50,315,57,306,158,331,57,306,61,293,234,289,226,280,259,281,259,281,226,280,215,269,259,281,215,269,202,256,338,331,208,331,220,321,338,331,220,321,229,320,338,331,229,320,235,318,338,331,235,318,238,315,338,331,238,315,240,311,338,331,240,311,241,305,338,331,241,305,305,316,338,331,305,316,320,320,338,331,320,320,338,321,241,305,259,281,278,298,241,305,278,298,292,309,241,305,292,309,305,316,239,298,234,289,259,281,239,298,259,281,241,305,241,15,237,12,362,0,362,0,237,12,231,11,362,0,231,11,224,10,244,22,362,0,336,16,244,22,336,16,322,25,244,22,322,25,305,41,244,22,305,41,283,64,244,22,283,64,241,32,283,64,166,192,176,107,283,64,176,107,198,84,283,64,198,84,217,63,283,64,217,63,232,46,283,64,232,46,241,32,349,11,336,16,362,0,349,11,362,0,362,9,244,18,241,15,362,0,244,18,362,0,244,22,210,9,210,0,362,0,210,9,362,0,224,10,157,0,157,9,139,12,157,0,139,12,126,16,157,0,126,16,61,40,157,0,61,40,57,26,157,0,57,26,50,17,157,0,50,17,36,12,157,0,36,12,17,9,157,0,17,9,17,0,61,40,126,16,62,63,176,107,166,192,126,158,220,321,208,331,208,321,37,319,17,331,17,321,
-344,0,344,9,330,12,320,17,311,26,304,38,296,55,179,337,169,337,70,93,56,58,44,34,34,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,160,267,161,267,241,61,244,51,247,44,249,37,250,31,251,26,249,18,244,13,236,11,227,10,216,9,216,0,432,0,432,9,413,12,401,17,393,25,389,38,388,56,388,275,389,294,393,307,401,316,413,320,431,321,431,331,332,331,222,80,106,331,7,331,7,321,28,319,42,315,50,307,54,294,55,275,55,75,54,47,49,29,41,18,27,12,6,9,6,0,123,0,123,9,103,12,90,18,82,29,78,48,76,75,76,275,203,0,209,0,
+344,0,344,9,330,12,320,17,311,26,304,38,296,55,179,337,169,337,70,93,56,58,44,34,34,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,160,267,161,267,241,61,244,51,247,44,249,37,250,31,251,26,249,18,244,13,236,11,227,10,216,9,216,0,
 56,58,73,22,72,30,72,30,72,34,70,93,70,93,72,34,73,38,70,93,73,38,74,43,161,267,169,337,160,267,160,267,169,337,76,51,75,47,76,51,169,337,75,47,169,337,70,93,251,26,344,0,320,17,251,26,320,17,311,26,251,26,311,26,304,38,251,26,304,38,296,55,251,26,296,55,250,31,296,55,179,337,241,61,296,55,241,61,244,51,296,55,244,51,247,44,296,55,247,44,249,37,296,55,249,37,250,31,169,337,161,267,241,61,169,337,241,61,179,337,70,93,56,58,72,30,330,12,320,17,344,0,330,12,344,0,344,9,249,18,244,13,344,0,249,18,344,0,251,26,344,0,244,13,236,11,344,0,236,11,227,10,344,0,227,10,216,9,344,0,216,9,216,0,107,0,107,9,94,10,107,0,94,10,84,12,107,0,84,12,34,20,107,0,34,20,22,13,107,0,22,13,7,9,107,0,7,9,7,0,44,34,34,20,84,12,44,34,84,12,77,16,44,34,77,16,73,22,44,34,73,22,56,58,75,47,70,93,74,43,
-432,0,432,9,413,12,401,17,393,25,389,38,388,56,388,275,389,294,393,307,401,316,413,320,431,321,431,331,332,331,222,80,106,331,7,331,7,321,28,319,42,315,50,307,54,294,55,275,55,75,54,47,49,29,41,18,27,12,6,9,6,0,123,0,123,9,103,12,90,18,82,29,78,48,76,75,76,275,203,0,209,0,337,286,337,61,336,40,333,26,325,17,312,12,292,9,292,0,353,331,235,331,235,321,247,320,256,319,263,317,275,309,278,303,281,295,283,285,284,274,284,89,91,331,6,331,6,321,19,321,29,318,37,313,46,306,55,295,55,75,54,48,49,30,41,19,27,13,6,9,6,0,123,0,123,9,103,13,90,20,82,31,78,49,76,75,76,269,297,-5,306,-5,306,274,308,289,311,299,315,307,320,313,324,315,329,318,335,319,343,320,353,321,295,247,295,331,
+432,0,432,9,413,12,401,17,393,25,389,38,388,56,388,275,389,294,393,307,401,316,413,320,431,321,431,331,332,331,222,80,106,331,7,331,7,321,28,319,42,315,50,307,54,294,55,275,55,75,54,47,49,29,41,18,27,12,6,9,6,0,123,0,123,9,103,12,90,18,82,29,78,48,76,75,76,275,203,0,209,0,337,286,337,61,336,40,333,26,325,17,312,12,292,9,292,0,
 49,29,41,18,123,0,123,0,41,18,27,12,123,0,27,12,6,9,333,26,325,17,432,0,432,0,325,17,312,12,432,0,312,12,292,9,413,320,431,321,431,331,413,320,431,331,401,316,401,316,431,331,337,286,401,316,337,286,393,307,393,307,337,286,389,294,401,17,393,25,337,61,337,61,393,25,389,38,337,61,389,38,337,286,337,286,389,38,388,56,337,286,388,56,388,275,203,0,209,0,222,80,222,80,209,0,337,286,222,80,337,286,332,331,332,331,337,286,431,331,106,331,7,331,28,319,106,331,28,319,42,315,106,331,42,315,50,307,106,331,50,307,54,294,106,331,54,294,55,275,106,331,55,275,76,275,106,331,76,275,203,0,106,331,203,0,222,80,76,75,76,275,55,275,76,75,55,275,78,48,78,48,55,275,55,75,78,48,55,75,82,29,82,29,55,75,54,47,82,29,54,47,90,18,90,18,54,47,49,29,90,18,49,29,123,0,432,0,432,9,413,12,432,0,413,12,401,17,432,0,401,17,336,40,432,0,336,40,333,26,103,12,90,18,123,0,103,12,123,0,123,9,123,0,6,9,6,0,432,0,292,9,292,0,336,40,401,17,337,61,28,319,7,331,7,321,389,294,337,286,388,275,
-353,331,235,331,235,321,247,320,256,319,263,317,275,309,278,303,281,295,283,285,284,274,284,89,91,331,6,331,6,321,19,321,29,318,37,313,46,306,55,295,55,75,54,48,49,30,41,19,27,13,6,9,6,0,123,0,123,9,103,13,90,20,82,31,78,49,76,75,76,269,297,-5,306,-5,306,274,308,289,311,299,315,307,320,313,324,315,329,318,335,319,343,320,353,321,295,247,295,331,26,331,26,246,39,246,43,263,48,276,55,284,66,289,79,290,242,290,256,289,266,284,274,276,279,263,282,247,16383,16383,252,109,252,225,240,225,239,211,235,200,229,193,219,189,207,188,114,188,102,189,93,193,87,200,83,211,81,225,70,225,70,109,81,109,84,122,87,132,93,140,101,146,113,147,205,147,218,146,227,141,234,133,239,123,240,109,16383,16383,307,0,
+353,331,235,331,235,321,247,320,256,319,263,317,275,309,278,303,281,295,283,285,284,274,284,89,91,331,6,331,6,321,19,321,29,318,37,313,46,306,55,295,55,75,54,48,49,30,41,19,27,13,6,9,6,0,123,0,123,9,103,13,90,20,82,31,78,49,76,75,76,269,297,-5,306,-5,306,274,308,289,311,299,315,307,320,313,324,315,329,318,335,319,343,320,353,321,
 49,30,41,19,123,0,123,0,41,19,27,13,123,0,27,13,6,9,256,319,263,317,353,331,353,331,263,317,269,313,353,331,269,313,275,309,275,309,278,303,353,331,353,331,278,303,281,295,353,331,281,295,324,315,324,315,281,295,320,313,324,315,320,313,320,312,320,312,320,313,315,307,315,307,320,313,284,274,315,307,284,274,284,259,297,-5,284,259,284,89,297,-5,284,89,91,331,353,331,324,315,329,318,353,331,329,318,335,319,353,331,335,319,343,320,353,331,343,320,353,321,306,-5,306,253,297,-5,297,-5,306,253,306,274,297,-5,306,274,284,259,284,259,306,274,308,289,284,259,308,289,311,299,283,285,284,274,320,313,283,285,320,313,281,295,247,320,256,319,353,331,247,320,353,331,235,331,247,320,235,331,235,321,91,331,6,331,19,321,91,331,19,321,29,318,91,331,29,318,37,313,91,331,37,313,46,306,91,331,46,306,55,295,91,331,55,295,76,269,91,331,76,269,297,-5,55,295,78,49,76,75,54,48,49,30,90,20,90,20,49,30,123,0,90,20,123,0,103,13,103,13,123,0,123,9,55,75,54,48,82,31,55,75,82,31,78,49,55,75,78,49,55,295,123,0,6,9,6,0,54,48,90,20,82,31,19,321,6,331,6,321,76,269,55,295,76,75,315,307,284,259,311,299,
-295,247,295,331,26,331,26,246,39,246,43,263,48,276,55,284,66,289,79,290,242,290,256,289,266,284,274,276,279,263,282,247,16383,16383,252,109,252,225,240,225,239,211,235,200,229,193,219,189,207,188,114,188,102,189,93,193,87,200,83,211,81,225,70,225,70,109,81,109,84,122,87,132,93,140,101,146,113,147,205,147,218,146,227,141,234,133,239,123,240,109,16383,16383,307,0,307,85,295,85,293,70,287,57,278,49,265,44,248,42,70,42,56,44,44,49,35,57,29,69,27,85,15,85,15,0,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,
+295,247,295,331,26,331,26,246,39,246,43,263,48,276,55,284,66,289,79,290,242,290,256,289,266,284,274,276,279,263,282,247,16383,16383,252,109,252,225,240,225,239,211,235,200,229,193,219,189,207,188,114,188,102,189,93,193,87,200,83,211,81,225,70,225,70,109,81,109,84,122,87,132,93,140,101,146,113,147,205,147,218,146,227,141,234,133,239,123,240,109,16383,16383,307,0,307,85,295,85,293,70,287,57,278,49,265,44,248,42,70,42,56,44,44,49,35,57,29,69,27,85,15,85,15,0,
 295,331,26,331,66,289,295,331,66,289,79,290,295,331,79,290,242,290,295,331,242,290,256,289,295,331,256,289,266,284,295,331,266,284,274,276,295,331,274,276,279,263,295,331,279,263,282,247,295,331,282,247,295,247,26,331,26,246,39,246,26,331,39,246,43,263,26,331,43,263,48,276,26,331,48,276,55,284,26,331,55,284,66,289,219,189,207,188,218,146,218,146,207,188,205,147,205,147,207,188,114,188,205,147,114,188,113,147,101,146,113,147,102,189,101,146,102,189,93,193,83,211,84,122,87,200,87,200,84,122,87,132,87,200,87,132,93,193,93,193,87,132,93,140,93,193,93,140,101,146,83,211,81,225,84,122,84,122,81,225,81,109,81,109,81,225,70,225,81,109,70,225,70,109,240,225,239,211,240,109,240,225,240,109,252,109,240,225,252,109,252,225,240,109,239,211,239,123,239,123,239,211,235,200,239,123,235,200,234,133,234,133,235,200,229,193,234,133,229,193,227,141,227,141,229,193,219,189,227,141,219,189,218,146,287,57,278,49,307,0,307,0,278,49,265,44,307,0,265,44,248,42,307,0,307,85,295,85,307,0,295,85,293,70,307,0,293,70,287,57,248,42,70,42,307,0,307,0,70,42,56,44,307,0,56,44,15,0,15,0,56,44,44,49,15,0,44,49,35,57,15,0,35,57,15,85,15,85,35,57,29,69,15,85,29,69,27,85,113,147,114,188,102,189,
-344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,352,0,352,9,333,12,320,17,312,25,308,37,307,55,307,274,308,293,312,307,320,315,333,319,352,321,352,331,9,331,9,321,28,319,41,315,49,307,53,294,54,274,54,61,53,39,49,25,42,16,29,12,9,9,9,0,148,0,148,9,129,12,117,17,109,25,105,38,104,56,104,296,105,303,107,307,111,310,116,312,238,312,245,311,251,310,254,306,256,301,256,62,255,41,252,26,244,17,232,12,212,9,212,0,8,331,8,321,27,319,39,315,46,307,49,294,50,276,50,39,47,25,40,16,27,12,
+344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,
 149,314,180,338,134,308,134,308,180,338,126,330,134,308,126,330,121,298,121,298,126,330,108,286,97,269,108,286,126,330,97,269,126,330,81,307,81,102,81,24,90,75,90,75,81,24,126,1,90,75,126,1,103,52,103,52,126,1,119,33,130,25,119,33,126,1,130,25,126,1,180,-6,207,316,235,330,194,319,194,319,235,330,180,320,164,318,180,320,180,338,164,318,180,338,149,314,81,307,46,271,46,61,81,307,46,61,74,166,81,307,74,166,76,194,81,307,76,194,80,222,81,307,80,222,87,247,81,307,87,247,97,269,81,102,76,132,81,24,81,24,76,132,74,166,24,109,46,61,46,271,24,109,46,271,24,224,24,109,24,224,17,167,223,19,209,15,234,1,234,1,209,15,196,12,234,1,196,12,181,11,181,11,167,12,180,-6,180,-6,167,12,154,15,180,-6,154,15,142,19,207,316,219,311,235,330,235,330,219,311,231,305,235,330,231,305,242,296,242,296,257,279,280,306,280,306,257,279,270,257,280,306,270,257,279,231,235,330,180,338,180,320,280,103,272,76,279,24,279,24,272,76,260,53,279,24,260,53,246,35,246,35,235,26,279,24,279,24,235,26,234,1,344,166,336,222,336,108,336,108,336,222,314,269,336,108,314,269,314,60,314,60,314,269,287,169,285,201,287,169,314,269,285,201,314,269,280,306,285,201,280,306,279,231,280,306,235,330,242,296,314,60,287,169,285,134,314,60,285,134,280,103,314,60,280,103,279,24,181,11,180,-6,234,1,81,24,74,166,46,61,223,19,234,1,235,26,130,25,180,-6,142,19,
-352,0,352,9,333,12,320,17,312,25,308,37,307,55,307,274,308,293,312,307,320,315,333,319,352,321,352,331,9,331,9,321,28,319,41,315,49,307,53,294,54,274,54,61,53,39,49,25,42,16,29,12,9,9,9,0,148,0,148,9,129,12,117,17,109,25,105,38,104,56,104,296,105,303,107,307,111,310,116,312,238,312,245,311,251,310,254,306,256,301,256,62,255,41,252,26,244,17,232,12,212,9,212,0,8,331,8,321,27,319,39,315,46,307,49,294,50,276,50,39,47,25,40,16,27,12,8,9,8,0,148,0,148,9,128,12,114,16,106,24,102,37,101,56,101,146,109,145,115,145,122,144,136,144,164,145,188,147,208,153,225,161,243,175,253,185,260,197,266,210,270,225,271,240,270,254,267,268,262,280,255,291,246,300,231,310,213,319,191,325,166,329,137,331,16383,16383,101,295,101,302,103,307,106,310,111,312,118,313,
+352,0,352,9,333,12,320,17,312,25,308,37,307,55,307,274,308,293,312,307,320,315,333,319,352,321,352,331,9,331,9,321,28,319,41,315,49,307,53,294,54,274,54,61,53,39,49,25,42,16,29,12,9,9,9,0,148,0,148,9,129,12,117,17,109,25,105,38,104,56,104,296,105,303,107,307,111,310,116,312,238,312,245,311,251,310,254,306,256,301,256,62,255,41,252,26,244,17,232,12,212,9,212,0,
 49,25,42,16,148,0,148,0,42,16,29,12,148,0,29,12,9,9,53,294,54,274,111,310,53,294,111,310,49,307,49,307,111,310,116,312,49,307,116,312,352,331,352,331,116,312,123,312,252,26,244,17,352,0,352,0,244,17,232,12,352,0,232,12,212,9,352,331,123,312,238,312,352,331,238,312,245,311,352,331,245,311,251,310,352,331,251,310,254,306,352,331,254,306,256,301,352,331,256,301,256,294,352,331,256,294,320,315,352,331,320,315,333,319,352,331,333,319,352,321,307,55,307,274,256,294,256,294,307,274,308,293,256,294,308,293,312,307,320,17,312,25,256,62,256,62,312,25,308,37,256,62,308,37,256,294,117,17,109,25,54,61,54,61,109,25,105,38,54,61,105,38,54,274,54,274,105,38,104,56,54,274,104,56,104,296,54,274,104,296,105,303,54,274,105,303,107,307,54,274,107,307,111,310,352,331,9,331,28,319,352,331,28,319,41,315,352,331,41,315,49,307,352,0,352,9,333,12,352,0,333,12,320,17,352,0,320,17,255,41,352,0,255,41,252,26,148,0,148,9,129,12,148,0,129,12,117,17,148,0,117,17,53,39,148,0,53,39,49,25,148,0,9,9,9,0,53,39,117,17,54,61,352,0,212,9,212,0,255,41,320,17,256,62,256,294,308,37,307,55,28,319,9,331,9,321,320,315,256,294,312,307,
-8,331,8,321,27,319,39,315,46,307,49,294,50,276,50,39,47,25,40,16,27,12,8,9,8,0,148,0,148,9,128,12,114,16,106,24,102,37,101,56,101,146,109,145,115,145,122,144,136,144,164,145,188,147,208,153,225,161,243,175,253,185,260,197,266,210,270,225,271,240,270,254,267,268,262,280,255,291,246,300,231,310,213,319,191,325,166,329,137,331,16383,16383,101,295,101,302,103,307,106,310,111,312,118,313,155,310,182,302,202,288,213,266,217,238,213,213,202,192,185,177,162,167,132,164,120,164,114,165,108,165,101,166,300,102,289,102,283,82,275,66,264,56,249,49,229,47,74,47,193,184,86,312,190,312,214,310,234,305,248,294,259,276,266,251,278,251,278,331,15,331,15,324,148,162,15,7,15,0,286,0,296,246,293,331,12,331,8,246,21,246,28,274,37,292,50,303,70,309,97,310,127,310,127,61,126,39,123,25,115,16,101,12,80,9,80,0,226,0,226,9,205,11,192,16,183,23,179,36,178,55,178,310,208,310,235,309,254,303,268,292,277,274,284,246,352,329,345,332,338,334,332,335,320,335,289,330,259,315,232,290,211,258,198,218,
+8,331,8,321,27,319,39,315,46,307,49,294,50,276,50,39,47,25,40,16,27,12,8,9,8,0,148,0,148,9,128,12,114,16,106,24,102,37,101,56,101,146,109,145,115,145,122,144,136,144,164,145,188,147,208,153,225,161,243,175,253,185,260,197,266,210,270,225,271,240,270,254,267,268,262,280,255,291,246,300,231,310,213,319,191,325,166,329,137,331,16383,16383,101,295,101,302,103,307,106,310,111,312,118,313,155,310,182,302,202,288,213,266,217,238,213,213,202,192,185,177,162,167,132,164,120,164,114,165,108,165,101,166,
 111,312,118,312,118,313,137,331,118,313,155,310,137,331,155,310,166,329,166,329,155,310,182,302,166,329,182,302,191,325,191,325,182,302,202,288,191,325,202,288,213,319,213,319,202,288,213,266,213,319,213,266,231,310,231,310,213,266,217,238,231,310,217,238,225,161,225,161,213,213,208,153,208,153,213,213,202,192,208,153,202,192,188,147,188,147,202,192,185,177,188,147,185,177,164,145,164,145,185,177,162,167,164,145,162,167,136,144,136,144,162,167,132,164,136,144,132,164,128,144,128,144,132,164,126,164,128,144,126,164,122,144,122,144,126,164,120,164,122,144,120,164,115,145,115,145,120,164,114,165,115,145,114,165,109,145,109,145,114,165,108,165,109,145,108,165,101,166,101,56,101,166,50,276,101,56,50,276,102,37,102,37,50,276,50,61,101,166,101,146,109,145,271,240,270,254,270,225,270,225,270,254,267,268,270,225,267,268,266,210,266,210,267,268,262,280,266,210,262,280,260,197,260,197,262,280,255,291,260,197,255,291,253,185,253,185,255,291,246,300,253,185,246,300,243,175,243,175,246,300,231,310,243,175,231,310,225,161,137,331,8,331,27,319,137,331,27,319,39,315,137,331,39,315,46,307,137,331,46,307,49,294,137,331,49,294,50,276,137,331,50,276,106,310,137,331,106,310,111,312,137,331,111,312,118,313,101,295,101,302,50,276,101,295,50,276,101,166,103,307,106,310,50,276,103,307,50,276,101,302,148,0,148,9,128,12,148,0,128,12,114,16,148,0,114,16,50,39,148,0,50,39,47,25,148,0,47,25,40,16,148,0,40,16,27,12,148,0,27,12,8,9,148,0,8,9,8,0,50,61,50,39,114,16,50,61,114,16,106,24,50,61,106,24,102,37,27,319,8,331,8,321,213,213,225,161,217,238,155,310,118,313,118,312,
-
-
-300,102,289,102,283,82,275,66,264,56,249,49,229,47,74,47,193,184,86,312,190,312,214,310,234,305,248,294,259,276,266,251,278,251,278,331,15,331,15,324,148,162,15,7,15,0,286,0,296,246,293,331,12,331,8,246,21,246,28,274,37,292,50,303,70,309,97,310,127,310,127,61,126,39,123,25,115,16,101,12,80,9,80,0,226,0,226,9,205,11,192,16,183,23,179,36,
+300,102,289,102,283,82,275,66,264,56,249,49,229,47,74,47,193,184,86,312,190,312,214,310,234,305,248,294,259,276,266,251,278,251,278,331,15,331,15,324,148,162,15,7,15,0,286,0,
 278,331,15,331,86,312,278,331,86,312,190,312,278,331,190,312,214,310,278,331,214,310,234,305,278,331,234,305,248,294,278,331,248,294,259,276,278,331,259,276,266,251,278,331,266,251,278,251,148,162,15,7,74,47,148,162,74,47,193,184,148,162,193,184,86,312,148,162,86,312,15,331,148,162,15,331,15,324,275,66,264,56,286,0,286,0,264,56,249,49,286,0,249,49,229,47,286,0,300,102,289,102,286,0,289,102,283,82,286,0,283,82,275,66,286,0,229,47,74,47,286,0,74,47,15,7,286,0,15,7,15,0,
-296,246,293,331,12,331,8,246,21,246,28,274,37,292,50,303,70,309,97,310,127,310,127,61,126,39,123,25,115,16,101,12,80,9,80,0,226,0,226,9,205,11,192,16,183,23,179,36,178,55,178,310,208,310,235,309,254,303,268,292,277,274,284,246,352,329,345,332,338,334,332,335,320,335,289,330,259,315,232,290,211,258,198,218,196,218,186,260,169,293,146,318,117,332,81,337,67,336,53,332,39,327,26,319,15,311,18,303,25,305,33,308,41,310,49,311,55,312,84,306,109,289,130,257,146,211,157,147,
+296,246,293,331,12,331,8,246,21,246,28,274,37,292,50,303,70,309,97,310,127,310,127,61,126,39,123,25,115,16,101,12,80,9,80,0,226,0,226,9,205,11,192,16,183,23,179,36,178,55,178,310,208,310,235,309,254,303,268,292,277,274,284,246,
 293,331,12,331,70,309,293,331,70,309,97,310,293,331,97,310,127,310,293,331,127,310,178,310,293,331,178,310,208,310,293,331,208,310,235,309,293,331,235,309,254,303,293,331,254,303,268,292,293,331,268,292,277,274,293,331,277,274,284,246,293,331,284,246,296,246,192,16,183,23,127,61,127,61,183,23,179,36,127,61,179,36,127,310,127,310,179,36,178,55,127,310,178,55,178,310,12,331,8,246,21,246,12,331,21,246,28,274,12,331,28,274,37,292,12,331,37,292,50,303,12,331,50,303,70,309,226,0,226,9,205,11,226,0,205,11,192,16,226,0,192,16,126,39,226,0,126,39,123,25,226,0,123,25,115,16,226,0,115,16,101,12,226,0,101,12,80,9,226,0,80,9,80,0,126,39,192,16,127,61,
-352,329,345,332,338,334,332,335,320,335,289,330,259,315,232,290,211,258,198,218,196,218,186,260,169,293,146,318,117,332,81,337,67,336,53,332,39,327,26,319,15,311,18,303,25,305,33,308,41,310,49,311,55,312,84,306,109,289,130,257,146,211,157,147,157,61,156,39,153,25,144,16,130,12,107,9,107,0,260,0,260,9,239,11,224,15,215,23,210,36,209,55,209,152,215,204,233,251,261,288,296,313,335,322,342,322,348,320,352,320,216,290,217,301,221,310,230,316,245,320,267,321,267,331,114,331,114,321,136,320,151,317,160,311,164,302,165,290,165,280,122,276,82,263,49,241,26,209,17,165,23,128,39,97,67,72,106,57,156,51,165,51,165,42,163,29,157,20,146,14,132,10,114,9,114,0,267,0,267,9,248,11,234,15,224,20,218,29,216,43,216,51,228,51,264,56,300,69,332,91,355,123,364,165,355,209,332,241,298,263,258,276,216,280,16383,16383,215,262,250,256,
+352,329,345,332,338,334,332,335,320,335,289,330,259,315,232,290,211,258,198,218,196,218,186,260,169,293,146,318,117,332,81,337,67,336,53,332,39,327,26,319,15,311,18,303,25,305,33,308,41,310,49,311,55,312,84,306,109,289,130,257,146,211,157,147,157,61,156,39,153,25,144,16,130,12,107,9,107,0,260,0,260,9,239,11,224,15,215,23,210,36,209,55,209,152,215,204,233,251,261,288,296,313,335,322,342,322,348,320,352,320,
 18,303,25,305,26,319,26,319,25,305,33,308,26,319,33,308,39,327,39,327,33,308,41,310,39,327,41,310,53,332,53,332,41,310,49,311,53,332,49,311,55,312,55,312,84,306,67,336,67,336,84,306,81,337,67,336,53,332,55,312,198,218,196,218,210,36,198,218,210,36,209,55,198,218,209,55,209,152,198,218,209,152,211,258,332,335,326,335,335,322,335,322,326,335,320,335,335,322,320,335,296,313,296,313,320,335,289,330,296,313,289,330,261,288,261,288,289,330,259,315,261,288,259,315,233,251,233,251,259,315,232,290,233,251,232,290,215,204,215,204,232,290,211,258,215,204,211,258,209,152,338,334,335,322,339,322,338,334,339,322,345,332,345,332,339,322,342,322,345,332,342,322,345,321,348,320,352,320,352,329,348,320,352,329,345,321,345,321,352,329,345,332,260,0,260,9,239,11,260,0,239,11,224,15,260,0,224,15,156,39,260,0,156,39,153,25,260,0,153,25,144,16,260,0,144,16,130,12,260,0,130,12,107,9,260,0,107,9,107,0,169,293,157,147,210,36,169,293,210,36,186,260,186,260,210,36,196,218,156,39,224,15,157,61,157,61,224,15,215,23,157,61,215,23,157,147,157,147,215,23,210,36,84,306,109,289,117,332,117,332,109,289,130,257,117,332,130,257,146,318,146,318,130,257,146,211,146,318,146,211,169,293,169,293,146,211,157,147,81,337,84,306,117,332,335,322,338,334,332,335,18,303,26,319,15,311,
-216,290,217,301,221,310,230,316,245,320,267,321,267,331,114,331,114,321,136,320,151,317,160,311,164,302,165,290,165,280,122,276,82,263,49,241,26,209,17,165,23,128,39,97,67,72,106,57,156,51,165,51,165,42,163,29,157,20,146,14,132,10,114,9,114,0,267,0,267,9,248,11,234,15,224,20,218,29,216,43,216,51,228,51,264,56,300,69,332,91,355,123,364,165,355,209,332,241,298,263,258,276,216,280,16383,16383,215,262,250,256,276,240,295,216,306,188,310,159,304,128,290,103,268,85,243,74,215,70,16383,16383,166,70,133,75,107,88,88,107,76,132,72,159,76,189,89,216,109,240,135,256,166,262,352,0,352,9,338,12,327,16,317,22,307,32,296,46,200,184,272,272,289,292,303,305,316,314,331,319,348,321,348,331,229,331,229,321,243,320,253,319,259,316,262,311,263,305,263,301,260,296,257,290,251,282,243,272,188,202,166,234,151,255,139,272,131,286,126,297,124,306,125,312,128,316,133,319,139,320,147,321,161,321,161,331,11,331,11,321,29,319,44,312,59,299,78,276,103,242,156,164,78,66,58,42,43,26,31,17,19,12,5,9,5,0,121,0,121,9,106,11,95,13,88,17,84,21,83,26,84,31,87,38,92,46,100,57,109,70,169,145,217,74,226,60,233,48,238,38,241,31,242,25,241,20,
+216,290,217,301,221,310,230,316,245,320,267,321,267,331,114,331,114,321,136,320,151,317,160,311,164,302,165,290,165,280,122,276,82,263,49,241,26,209,17,165,23,128,39,97,67,72,106,57,156,51,165,51,165,42,163,29,157,20,146,14,132,10,114,9,114,0,267,0,267,9,248,11,234,15,224,20,218,29,216,43,216,51,228,51,264,56,300,69,332,91,355,123,364,165,355,209,332,241,298,263,258,276,216,280,16383,16383,215,262,250,256,276,240,295,216,306,188,310,159,304,128,290,103,268,85,243,74,215,70,16383,16383,166,70,133,75,107,88,88,107,76,132,72,159,76,189,89,216,109,240,135,256,166,262,
 267,321,267,321,245,320,245,320,267,321,267,331,245,320,267,331,230,316,230,316,267,331,164,302,230,316,164,302,165,290,166,262,165,290,165,280,166,262,165,280,135,256,135,256,165,280,122,276,135,256,122,276,109,240,109,240,122,276,89,216,216,43,215,70,166,262,166,262,215,70,215,262,166,262,215,262,216,290,216,290,215,262,216,280,166,262,216,290,217,301,166,262,217,301,221,310,166,262,218,29,216,43,165,290,166,262,221,310,165,290,221,310,230,316,267,331,114,331,136,320,267,331,136,320,151,317,267,331,151,317,160,311,267,331,160,311,164,302,82,263,49,241,72,159,82,263,72,159,76,189,82,263,76,189,89,216,82,263,89,216,122,276,17,165,23,128,26,209,26,209,23,128,39,97,26,209,39,97,49,241,49,241,39,97,67,72,49,241,67,72,72,159,332,91,310,159,304,128,332,91,304,128,300,69,300,69,304,128,290,103,300,69,290,103,268,85,306,188,310,159,332,241,332,241,310,159,332,91,332,241,332,91,355,209,355,209,332,91,355,123,355,209,355,123,364,165,298,263,258,276,276,240,298,263,276,240,295,216,298,263,295,216,306,188,298,263,306,188,332,241,250,256,276,240,258,276,250,256,258,276,216,280,250,256,216,280,215,262,216,51,228,51,243,74,243,74,228,51,264,56,243,74,264,56,268,85,268,85,264,56,300,69,216,43,216,51,215,70,215,70,216,51,243,74,267,0,267,9,248,11,267,0,248,11,234,15,267,0,234,15,165,42,267,0,165,42,163,29,267,0,163,29,157,20,267,0,157,20,146,14,267,0,146,14,132,10,267,0,132,10,114,9,267,0,114,9,114,0,166,70,133,75,156,51,166,70,156,51,165,51,166,70,165,51,224,20,166,70,224,20,218,29,166,70,218,29,166,262,165,51,165,42,234,15,165,51,234,15,224,20,107,88,88,107,106,57,107,88,106,57,156,51,107,88,156,51,133,75,76,132,72,159,67,72,76,132,67,72,106,57,76,132,106,57,88,107,136,320,114,331,114,321,
-352,0,352,9,338,12,327,16,317,22,307,32,296,46,200,184,272,272,289,292,303,305,316,314,331,319,348,321,348,331,229,331,229,321,243,320,253,319,259,316,262,311,263,305,263,301,260,296,257,290,251,282,243,272,188,202,166,234,151,255,139,272,131,286,126,297,124,306,125,312,128,316,133,319,139,320,147,321,161,321,161,331,11,331,11,321,29,319,44,312,59,299,78,276,103,242,156,164,78,66,58,42,43,26,31,17,19,12,5,9,5,0,121,0,121,9,106,11,95,13,88,17,84,21,83,26,84,31,87,38,92,46,100,57,109,70,169,145,217,74,226,60,233,48,238,38,241,31,242,25,241,20,238,16,233,14,226,12,217,11,204,9,204,0,362,345,332,341,310,328,295,309,287,284,285,254,283,226,278,198,267,175,248,159,218,153,212,153,212,281,214,299,221,311,232,318,246,321,263,321,263,331,110,331,110,321,128,321,142,317,152,310,159,299,161,281,161,153,156,153,125,159,106,175,95,198,90,226,89,254,86,284,78,309,64,328,42,341,11,345,11,335,21,330,28,320,32,308,34,295,35,283,34,274,34,265,33,256,33,247,32,238,39,199,59,170,87,150,122,139,161,135,161,62,160,40,156,25,147,16,132,12,110,9,110,0,263,0,263,9,244,11,229,14,220,22,214,35,212,55,212,135,251,139,286,150,314,170,333,199,340,238,340,256,339,265,339,295,341,308,345,320,352,330,362,335,358,0,
+352,0,352,9,338,12,327,16,317,22,307,32,296,46,200,184,272,272,289,292,303,305,316,314,331,319,348,321,348,331,229,331,229,321,243,320,253,319,259,316,262,311,263,305,263,301,260,296,257,290,251,282,243,272,188,202,166,234,151,255,139,272,131,286,126,297,124,306,125,312,128,316,133,319,139,320,147,321,161,321,161,331,11,331,11,321,29,319,44,312,59,299,78,276,103,242,156,164,78,66,58,42,43,26,31,17,19,12,5,9,5,0,121,0,121,9,106,11,95,13,88,17,84,21,83,26,84,31,87,38,92,46,100,57,109,70,169,145,217,74,226,60,233,48,238,38,241,31,242,25,241,20,238,16,233,14,226,12,217,11,204,9,204,0,
 31,17,121,0,43,26,43,26,121,0,88,17,43,26,88,17,58,42,58,42,88,17,84,21,58,42,84,21,83,26,83,26,84,31,78,66,78,66,84,31,87,38,78,66,87,38,156,164,156,164,87,38,92,46,156,164,92,46,100,57,103,242,156,164,126,297,103,242,126,297,124,306,124,306,125,312,103,242,156,164,100,57,109,70,109,70,169,145,156,164,156,164,169,145,166,234,156,164,166,234,151,255,78,66,58,42,83,26,103,242,125,312,78,276,78,276,125,312,128,316,78,276,128,316,59,299,59,299,128,316,133,319,59,299,133,319,161,331,161,331,133,319,139,320,161,331,139,320,147,321,147,321,161,321,161,331,161,331,11,331,29,319,161,331,29,319,44,312,161,331,44,312,59,299,260,296,257,290,272,272,272,272,257,290,251,282,272,272,251,282,243,272,243,272,188,202,200,184,200,184,188,202,217,74,200,184,217,74,296,46,296,46,217,74,226,60,296,46,226,60,233,48,348,331,229,331,243,320,348,331,243,320,253,319,348,331,253,319,259,316,348,331,259,316,262,311,348,331,262,311,263,305,348,331,263,305,316,314,348,331,316,314,331,319,348,331,331,319,348,321,263,305,272,272,289,292,263,305,289,292,303,305,263,305,303,305,316,314,263,301,260,296,272,272,263,301,272,272,263,305,243,272,200,184,272,272,238,16,233,14,352,0,352,0,233,14,226,12,352,0,226,12,217,11,242,25,352,0,327,16,242,25,327,16,317,22,242,25,317,22,307,32,242,25,307,32,296,46,242,25,296,46,241,31,296,46,233,48,238,38,296,46,238,38,241,31,188,202,166,234,169,145,188,202,169,145,217,74,338,12,327,16,352,0,338,12,352,0,352,9,241,20,238,16,352,0,241,20,352,0,242,25,204,9,204,0,352,0,204,9,352,0,217,11,156,164,151,255,139,272,156,164,139,272,131,286,156,164,131,286,126,297,121,0,121,9,106,11,121,0,106,11,95,13,121,0,95,13,88,17,19,12,5,9,121,0,19,12,121,0,31,17,121,0,5,9,5,0,243,320,229,331,229,321,29,319,11,331,11,321,
-362,345,332,341,310,328,295,309,287,284,285,254,283,226,278,198,267,175,248,159,218,153,212,153,212,281,214,299,221,311,232,318,246,321,263,321,263,331,110,331,110,321,128,321,142,317,152,310,159,299,161,281,161,153,156,153,125,159,106,175,95,198,90,226,89,254,86,284,78,309,64,328,42,341,11,345,11,335,21,330,28,320,32,308,34,295,35,283,34,274,34,265,33,256,33,247,32,238,39,199,59,170,87,150,122,139,161,135,161,62,160,40,156,25,147,16,132,12,110,9,110,0,263,0,263,9,244,11,229,14,220,22,214,35,212,55,212,135,251,139,286,150,314,170,333,199,340,238,340,256,339,265,339,295,341,308,345,320,352,330,362,335,358,0,358,84,345,84,343,71,339,61,333,53,325,49,314,47,237,47,238,66,275,80,305,100,327,126,341,159,345,199,338,242,318,280,285,310,241,331,186,338,130,330,86,309,53,277,33,239,26,199,31,159,44,126,65,100,95,80,132,66,133,47,58,47,46,48,38,52,32,59,28,70,27,85,15,85,15,0,158,0,153,80,129,93,110,114,96,140,87,170,84,200,88,235,100,268,120,295,149,313,186,320,222,314,250,298,271,273,284,239,289,200,285,168,276,138,261,112,242,92,218,80,214,0,158,411,157,419,153,426,148,432,141,435,133,436,125,435,118,432,113,426,110,420,108,412,109,404,113,397,118,392,125,388,132,387,140,388,148,392,153,397,
+362,345,332,341,310,328,295,309,287,284,285,254,283,226,278,198,267,175,248,159,218,153,212,153,212,281,214,299,221,311,232,318,246,321,263,321,263,331,110,331,110,321,128,321,142,317,152,310,159,299,161,281,161,153,156,153,125,159,106,175,95,198,90,226,89,254,86,284,78,309,64,328,42,341,11,345,11,335,21,330,28,320,32,308,34,295,35,283,34,274,34,265,33,256,33,247,32,238,39,199,59,170,87,150,122,139,161,135,161,62,160,40,156,25,147,16,132,12,110,9,110,0,263,0,263,9,244,11,229,14,220,22,214,35,212,55,212,135,251,139,286,150,314,170,333,199,340,238,340,256,339,265,339,295,341,308,345,320,352,330,362,335,
 263,321,263,321,246,321,246,321,263,321,263,331,246,321,263,331,232,318,232,318,263,331,159,299,232,318,159,299,161,281,161,135,161,281,161,153,161,135,161,153,156,153,161,135,220,22,214,35,161,135,214,35,212,55,212,153,212,135,251,139,212,153,251,139,218,153,218,153,251,139,248,159,212,55,212,281,161,135,161,135,212,281,214,299,161,135,214,299,161,281,161,281,214,299,221,311,161,281,221,311,232,318,263,331,110,331,128,321,263,331,128,321,142,317,263,331,142,317,152,310,263,331,152,310,159,299,310,328,295,309,314,170,314,170,295,309,287,284,314,170,287,284,286,150,286,150,287,284,285,254,286,150,285,254,283,226,310,328,314,170,332,341,332,341,314,170,333,199,332,341,333,199,339,295,339,295,333,199,339,283,339,274,339,283,333,199,339,274,333,199,340,238,352,330,362,335,362,345,352,330,362,345,345,320,345,320,362,345,332,341,345,320,332,341,341,308,341,308,332,341,339,295,248,159,251,139,267,175,267,175,251,139,286,150,267,175,286,150,278,198,278,198,286,150,283,226,340,238,340,247,340,256,340,238,340,256,339,265,340,238,339,265,339,274,263,0,263,9,244,11,263,0,244,11,229,14,263,0,229,14,160,40,263,0,160,40,156,25,263,0,156,25,147,16,263,0,147,16,132,12,263,0,132,12,110,9,263,0,110,9,110,0,161,62,160,40,229,14,161,62,229,14,220,22,161,62,220,22,161,135,125,159,106,175,122,139,125,159,122,139,161,135,125,159,161,135,156,153,90,226,89,254,87,150,90,226,87,150,95,198,95,198,87,150,122,139,95,198,122,139,106,175,87,150,89,254,86,284,87,150,86,284,78,309,87,150,78,309,64,328,87,150,64,328,59,170,42,341,11,345,21,330,42,341,21,330,28,320,42,341,28,320,32,308,42,341,32,308,34,295,42,341,34,295,35,283,42,341,35,283,39,199,42,341,39,199,59,170,42,341,59,170,64,328,39,199,35,283,34,274,39,199,34,274,34,265,39,199,34,265,33,256,39,199,33,256,33,247,39,199,33,247,32,238,21,330,11,345,11,335,128,321,110,331,110,321,
-358,0,358,84,345,84,343,71,339,61,333,53,325,49,314,47,237,47,238,66,275,80,305,100,327,126,341,159,345,199,338,242,318,280,285,310,241,331,186,338,130,330,86,309,53,277,33,239,26,199,31,159,44,126,65,100,95,80,132,66,133,47,58,47,46,48,38,52,32,59,28,70,27,85,15,85,15,0,158,0,153,80,129,93,110,114,96,140,87,170,84,200,88,235,100,268,120,295,149,313,186,320,222,314,250,298,271,273,284,239,289,200,285,168,276,138,261,112,242,92,218,80,214,0,158,411,157,419,153,426,148,432,141,435,133,436,125,435,118,432,113,426,110,420,108,412,109,404,113,397,118,392,125,388,132,387,140,388,148,392,153,397,157,404,158,411,16383,16383,59,411,57,419,54,426,48,432,41,435,33,436,26,435,19,432,14,426,10,420,9,412,10,404,14,397,19,392,25,388,33,387,41,388,48,392,54,397,57,404,59,411,16383,16383,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,
+358,0,358,84,345,84,343,71,339,61,333,53,325,49,314,47,237,47,238,66,275,80,305,100,327,126,341,159,345,199,338,242,318,280,285,310,241,331,186,338,130,330,86,309,53,277,33,239,26,199,31,159,44,126,65,100,95,80,132,66,133,47,58,47,46,48,38,52,32,59,28,70,27,85,15,85,15,0,158,0,153,80,129,93,110,114,96,140,87,170,84,200,88,235,100,268,120,295,149,313,186,320,222,314,250,298,271,273,284,239,289,200,285,168,276,138,261,112,242,92,218,80,214,0,
 58,47,46,48,158,0,158,0,46,48,38,52,158,0,38,52,15,0,15,0,38,52,32,59,15,0,32,59,15,85,15,85,32,59,28,70,15,85,28,70,27,85,26,199,31,159,33,239,33,239,31,159,44,126,33,239,44,126,53,277,53,277,44,126,65,100,53,277,65,100,86,309,86,309,65,100,84,200,95,80,84,200,65,100,186,338,149,313,186,320,186,320,222,314,241,331,241,331,222,314,250,298,241,331,250,298,285,310,285,310,250,298,271,273,285,310,271,273,284,239,289,200,305,100,318,280,318,280,305,100,327,126,318,280,327,126,338,242,338,242,327,126,341,159,338,242,341,159,345,199,285,310,284,239,289,200,285,310,289,200,318,280,241,331,186,338,186,320,261,112,275,80,276,138,276,138,275,80,305,100,276,138,305,100,285,168,285,168,305,100,289,200,214,0,237,47,218,80,218,80,237,47,238,66,218,80,238,66,242,92,242,92,238,66,275,80,242,92,275,80,261,112,339,61,333,53,358,0,358,0,333,53,325,49,358,0,325,49,314,47,358,0,358,84,345,84,358,0,345,84,343,71,358,0,343,71,339,61,237,47,214,0,358,0,237,47,358,0,314,47,130,330,86,309,100,268,130,330,100,268,120,295,130,330,120,295,149,313,130,330,149,313,186,338,86,309,84,200,88,235,86,309,88,235,100,268,132,66,133,47,153,80,132,66,153,80,129,93,132,66,129,93,110,114,132,66,110,114,96,140,132,66,96,140,95,80,87,170,84,200,95,80,87,170,95,80,96,140,133,47,58,47,158,0,133,47,158,0,153,80,
-158,411,157,419,153,426,148,432,141,435,133,436,125,435,118,432,113,426,110,420,108,412,109,404,113,397,118,392,125,388,132,387,140,388,148,392,153,397,157,404,158,411,16383,16383,59,411,57,419,54,426,48,432,41,435,33,436,26,435,19,432,14,426,10,420,9,412,10,404,14,397,19,392,25,388,33,387,41,388,48,392,54,397,57,404,59,411,16383,16383,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,257,411,256,419,252,426,247,432,240,435,233,436,225,435,218,432,213,426,209,420,208,412,209,404,213,397,218,392,225,388,232,387,240,388,247,392,252,397,256,404,257,411,16383,16383,158,411,157,419,153,426,148,432,141,435,133,436,125,435,118,432,113,426,110,420,108,412,109,404,113,397,118,392,125,388,132,387,140,388,148,392,153,397,157,404,158,411,16383,16383,352,329,345,332,338,334,332,335,320,335,289,330,259,315,232,290,211,258,198,218,196,218,186,260,169,293,146,318,117,332,81,337,67,336,53,332,39,327,26,319,15,311,18,303,25,305,33,308,41,310,49,311,55,312,
+158,411,157,419,153,426,148,432,141,435,133,436,125,435,118,432,113,426,110,420,108,412,109,404,113,397,118,392,125,388,132,387,140,388,148,392,153,397,157,404,158,411,16383,16383,59,411,57,419,54,426,48,432,41,435,33,436,26,435,19,432,14,426,10,420,9,412,10,404,14,397,19,392,25,388,33,387,41,388,48,392,54,397,57,404,59,411,16383,16383,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,
 9,412,10,404,10,420,10,420,10,404,14,397,10,420,14,397,14,426,14,426,14,397,19,392,14,426,19,392,19,432,19,432,19,392,25,388,19,432,25,388,26,435,26,435,25,388,33,387,26,435,33,387,33,436,33,436,33,387,41,388,33,436,41,388,41,435,41,435,41,388,48,392,41,435,48,392,48,432,48,432,48,392,54,397,48,432,54,397,54,426,54,426,54,397,57,404,54,426,57,404,57,419,57,419,57,404,59,411,52,23,44,15,157,0,157,0,44,15,30,11,157,0,30,11,9,9,157,331,9,331,30,320,157,331,30,320,44,316,157,331,44,316,53,308,157,331,53,308,57,295,157,331,57,295,122,316,157,331,122,316,136,320,157,331,136,320,157,321,122,16,114,24,57,56,57,56,114,24,109,37,57,56,109,37,57,276,57,276,109,37,108,56,57,276,108,56,108,276,57,276,108,276,109,295,57,276,109,295,113,308,57,276,113,308,122,316,57,276,122,316,57,295,108,412,109,404,110,420,110,420,109,404,113,397,110,420,113,397,113,426,113,426,113,397,118,392,113,426,118,392,118,432,118,432,118,392,125,388,118,432,125,388,125,435,125,435,125,388,132,387,125,435,132,387,133,436,133,436,132,387,140,388,133,436,140,388,141,435,141,435,140,388,148,392,141,435,148,392,148,432,148,432,148,392,153,397,148,432,153,397,153,426,153,426,153,397,157,404,153,426,157,404,157,419,157,419,157,404,158,411,157,0,157,9,137,11,157,0,137,11,122,16,157,0,122,16,56,36,157,0,56,36,52,23,157,0,9,9,9,0,56,36,122,16,57,56,30,320,9,331,9,321,
-257,411,256,419,252,426,247,432,240,435,233,436,225,435,218,432,213,426,209,420,208,412,209,404,213,397,218,392,225,388,232,387,240,388,247,392,252,397,256,404,257,411,16383,16383,158,411,157,419,153,426,148,432,141,435,133,436,125,435,118,432,113,426,110,420,108,412,109,404,113,397,118,392,125,388,132,387,140,388,148,392,153,397,157,404,158,411,16383,16383,352,329,345,332,338,334,332,335,320,335,289,330,259,315,232,290,211,258,198,218,196,218,186,260,169,293,146,318,117,332,81,337,67,336,53,332,39,327,26,319,15,311,18,303,25,305,33,308,41,310,49,311,55,312,84,306,109,289,130,257,146,211,157,147,157,61,156,39,153,25,144,16,130,12,107,9,107,0,260,0,260,9,239,11,224,15,215,23,210,36,209,55,209,152,215,204,233,251,261,288,296,313,335,322,342,322,348,320,352,320,108,253,126,253,158,294,163,299,167,304,169,309,171,313,172,316,171,322,168,326,165,329,157,331,151,330,147,329,143,327,140,324,138,320,16383,16383,257,65,255,50,252,39,248,32,245,27,241,26,232,31,223,43,216,60,210,78,206,94,261,225,212,225,190,157,182,178,171,198,156,215,137,226,113,230,79,224,52,207,31,181,19,148,15,112,19,73,32,41,52,16,78,1,108,-4,129,-1,147,5,162,17,174,32,185,50,190,32,196,17,204,5,213,-1,225,-4,239,0,250,8,258,24,263,43,265,65,16383,16383,166,104,162,84,155,59,145,35,131,16,113,9,90,19,75,43,66,76,61,109,60,137,63,167,70,189,81,204,95,213,110,216,129,208,144,187,154,159,161,130,166,104,76,253,94,253,127,294,135,304,138,309,139,313,140,316,139,322,137,326,133,329,125,331,119,330,115,329,111,327,108,324,
+257,411,256,419,252,426,247,432,240,435,233,436,225,435,218,432,213,426,209,420,208,412,209,404,213,397,218,392,225,388,232,387,240,388,247,392,252,397,256,404,257,411,16383,16383,158,411,157,419,153,426,148,432,141,435,133,436,125,435,118,432,113,426,110,420,108,412,109,404,113,397,118,392,125,388,132,387,140,388,148,392,153,397,157,404,158,411,16383,16383,352,329,345,332,338,334,332,335,320,335,289,330,259,315,232,290,211,258,198,218,196,218,186,260,169,293,146,318,117,332,81,337,67,336,53,332,39,327,26,319,15,311,18,303,25,305,33,308,41,310,49,311,55,312,84,306,109,289,130,257,146,211,157,147,157,61,156,39,153,25,144,16,130,12,107,9,107,0,260,0,260,9,239,11,224,15,215,23,210,36,209,55,209,152,215,204,233,251,261,288,296,313,335,322,342,322,348,320,352,320,
 18,303,25,305,26,319,26,319,25,305,33,308,26,319,33,308,39,327,39,327,33,308,41,310,39,327,41,310,53,332,53,332,41,310,49,311,53,332,49,311,55,312,55,312,84,306,67,336,67,336,84,306,81,337,67,336,53,332,55,312,198,218,196,218,210,36,198,218,210,36,209,55,198,218,209,55,209,152,198,218,209,152,211,258,260,0,260,9,239,11,260,0,239,11,224,15,260,0,224,15,156,39,260,0,156,39,153,25,260,0,153,25,144,16,260,0,144,16,130,12,260,0,130,12,107,9,260,0,107,9,107,0,169,293,157,147,210,36,169,293,210,36,186,260,186,260,210,36,196,218,156,39,224,15,157,61,157,61,224,15,215,23,157,61,215,23,157,147,157,147,215,23,210,36,332,335,326,335,335,322,335,322,326,335,320,335,335,322,320,335,296,313,296,313,320,335,289,330,296,313,289,330,261,288,261,288,289,330,259,315,261,288,259,315,233,251,233,251,259,315,232,290,233,251,232,290,215,204,215,204,232,290,211,258,215,204,211,258,209,152,338,334,335,322,339,322,338,334,339,322,345,332,345,332,339,322,342,322,345,332,342,322,345,321,348,320,352,320,352,329,348,320,352,329,345,321,345,321,352,329,345,332,208,412,209,404,209,420,209,420,209,404,213,397,209,420,213,397,213,426,213,426,213,397,218,392,213,426,218,392,218,432,218,432,218,392,225,388,218,432,225,388,225,435,225,435,225,388,232,387,225,435,232,387,233,436,233,436,232,387,240,388,233,436,240,388,240,435,240,435,240,388,247,392,240,435,247,392,247,432,247,432,247,392,252,397,247,432,252,397,252,426,252,426,252,397,256,404,252,426,256,404,256,419,256,419,256,404,257,411,108,412,109,404,110,420,110,420,109,404,113,397,110,420,113,397,113,426,113,426,113,397,118,392,113,426,118,392,118,432,118,432,118,392,125,388,118,432,125,388,125,435,125,435,125,388,132,387,125,435,132,387,133,436,133,436,132,387,140,388,133,436,140,388,141,435,141,435,140,388,148,392,141,435,148,392,148,432,148,432,148,392,153,397,148,432,153,397,153,426,153,426,153,397,157,404,153,426,157,404,157,419,157,419,157,404,158,411,84,306,109,289,117,332,117,332,109,289,130,257,117,332,130,257,146,318,146,318,130,257,146,211,146,318,146,211,169,293,169,293,146,211,157,147,81,337,84,306,117,332,335,322,338,334,332,335,18,303,26,319,15,311,
-108,253,126,253,158,294,163,299,167,304,169,309,171,313,172,316,171,322,168,326,165,329,157,331,151,330,147,329,143,327,140,324,138,320,16383,16383,257,65,255,50,252,39,248,32,245,27,241,26,232,31,223,43,216,60,210,78,206,94,261,225,212,225,190,157,182,178,171,198,156,215,137,226,113,230,79,224,52,207,31,181,19,148,15,112,19,73,32,41,52,16,78,1,108,-4,129,-1,147,5,162,17,174,32,185,50,190,32,196,17,204,5,213,-1,225,-4,239,0,250,8,258,24,263,43,265,65,16383,16383,166,104,162,84,155,59,145,35,131,16,113,9,90,19,75,43,66,76,61,109,60,137,63,167,70,189,81,204,95,213,110,216,129,208,144,187,154,159,161,130,166,104,76,253,94,253,127,294,135,304,138,309,139,313,140,316,139,322,137,326,133,329,125,331,119,330,115,329,111,327,108,324,106,320,16383,16383,196,73,182,54,166,39,149,29,131,22,110,20,95,22,80,27,69,36,60,49,57,65,61,81,70,94,83,102,97,107,111,108,117,108,125,106,128,106,133,105,142,106,148,108,153,111,156,115,157,118,156,122,154,124,150,127,145,128,138,129,131,128,121,126,115,125,108,124,92,127,80,133,72,142,67,154,65,167,67,182,74,195,83,206,96,213,112,215,127,215,140,212,148,208,154,203,156,195,155,193,155,190,154,187,154,183,153,179,155,171,158,166,163,161,168,158,175,157,182,158,188,161,194,165,198,171,199,179,194,199,181,214,163,223,
+108,253,126,253,158,294,163,299,167,304,169,309,171,313,172,316,171,322,168,326,165,329,157,331,151,330,147,329,143,327,140,324,138,320,16383,16383,257,65,255,50,252,39,248,32,245,27,241,26,232,31,223,43,216,60,210,78,206,94,261,225,212,225,190,157,182,178,171,198,156,215,137,226,113,230,79,224,52,207,31,181,19,148,15,112,19,73,32,41,52,16,78,1,108,-4,129,-1,147,5,162,17,174,32,185,50,190,32,196,17,204,5,213,-1,225,-4,239,0,250,8,258,24,263,43,265,65,16383,16383,166,104,162,84,155,59,145,35,131,16,113,9,90,19,75,43,66,76,61,109,60,137,63,167,70,189,81,204,95,213,110,216,129,208,144,187,154,159,161,130,166,104,
 63,167,70,189,79,224,79,224,70,189,81,204,79,224,81,204,113,230,113,230,81,204,95,213,113,230,95,213,110,216,110,216,129,208,113,230,113,230,129,208,137,226,157,331,158,294,161,330,161,330,158,294,163,299,161,330,163,299,165,329,165,329,163,299,167,304,165,329,167,304,168,326,168,326,167,304,169,309,168,326,169,309,171,322,171,322,169,309,171,313,171,322,171,313,172,316,158,294,157,331,151,330,158,294,151,330,147,329,158,294,147,329,143,327,158,294,143,327,140,324,158,294,140,324,138,320,158,294,138,320,126,253,144,187,154,159,156,215,156,215,154,159,161,130,156,215,161,130,171,198,171,198,161,130,166,104,171,198,166,104,174,32,171,198,174,32,182,178,182,178,174,32,185,50,182,178,185,50,190,157,190,157,185,50,190,32,190,157,190,32,212,225,212,225,190,32,196,17,212,225,196,17,206,94,206,94,196,17,204,5,206,94,204,5,213,-1,137,226,129,208,144,187,137,226,144,187,156,215,174,32,166,104,162,84,174,32,162,84,162,17,162,17,162,84,155,59,162,17,155,59,147,5,147,5,155,59,145,35,147,5,145,35,131,16,78,1,108,-4,90,19,90,19,108,-4,113,9,131,16,113,9,129,-1,131,16,129,-1,147,5,210,78,206,94,213,-1,212,225,206,94,261,225,252,39,248,32,250,8,250,8,248,32,245,27,250,8,245,27,241,26,241,26,232,31,239,0,239,0,232,31,225,-4,210,78,213,-1,216,60,216,60,213,-1,225,-4,216,60,225,-4,223,43,223,43,225,-4,232,31,258,24,263,43,265,65,258,24,265,65,257,65,258,24,257,65,255,50,258,24,255,50,252,39,258,24,252,39,250,8,241,26,239,0,250,8,113,9,108,-4,129,-1,90,19,75,43,78,1,78,1,75,43,66,76,78,1,66,76,52,16,52,16,66,76,61,109,52,16,61,109,60,137,60,137,63,167,52,207,52,207,63,167,79,224,52,16,60,137,52,207,52,16,52,207,32,41,32,41,52,207,31,181,32,41,31,181,19,73,19,73,31,181,19,148,19,73,19,148,15,112,126,253,138,320,108,253,
-76,253,94,253,127,294,135,304,138,309,139,313,140,316,139,322,137,326,133,329,125,331,119,330,115,329,111,327,108,324,106,320,16383,16383,196,73,182,54,166,39,149,29,131,22,110,20,95,22,80,27,69,36,60,49,57,65,61,81,70,94,83,102,97,107,111,108,117,108,125,106,128,106,133,105,142,106,148,108,153,111,156,115,157,118,156,122,154,124,150,127,145,128,138,129,131,128,121,126,115,125,108,124,92,127,80,133,72,142,67,154,65,167,67,182,74,195,83,206,96,213,112,215,127,215,140,212,148,208,154,203,156,195,155,193,155,190,154,187,154,183,153,179,155,171,158,166,163,161,168,158,175,157,182,158,188,161,194,165,198,171,199,179,194,199,181,214,163,223,142,228,121,230,87,226,60,217,40,202,28,184,24,165,26,152,31,141,39,131,49,123,63,118,47,113,33,103,22,91,15,77,12,61,14,46,21,29,37,13,65,0,108,-4,130,-1,151,6,171,20,189,40,204,68,84,253,101,253,134,294,142,304,145,309,147,313,147,316,146,322,144,326,140,329,132,331,122,329,119,327,116,324,113,320,16383,16383,226,-107,223,-101,221,-94,219,-86,218,-76,218,160,216,182,208,202,196,217,180,226,159,230,145,229,131,224,117,216,102,205,87,190,86,190,84,205,81,215,76,223,68,226,56,228,44,225,33,216,22,203,13,188,5,172,12,170,15,176,25,188,30,193,36,194,39,193,41,190,44,184,45,173,46,156,46,0,88,0,88,174,100,185,111,194,120,199,130,202,140,203,153,201,163,195,170,185,174,172,176,154,176,-79,177,-89,179,-97,181,-103,184,-107,40,253,57,253,90,294,98,304,101,309,103,313,103,316,102,322,100,326,96,329,93,330,89,331,83,330,78,329,75,327,72,324,70,320,16383,16383,126,54,120,43,115,36,110,31,105,29,99,28,95,29,91,33,90,36,89,40,89,228,88,230,72,224,57,219,41,214,26,208,10,204,10,195,15,196,37,196,42,193,45,188,
+76,253,94,253,127,294,135,304,138,309,139,313,140,316,139,322,137,326,133,329,125,331,119,330,115,329,111,327,108,324,106,320,16383,16383,196,73,182,54,166,39,149,29,131,22,110,20,95,22,80,27,69,36,60,49,57,65,61,81,70,94,83,102,97,107,111,108,117,108,125,106,128,106,133,105,142,106,148,108,153,111,156,115,157,118,156,122,154,124,150,127,145,128,138,129,131,128,121,126,115,125,108,124,92,127,80,133,72,142,67,154,65,167,67,182,74,195,83,206,96,213,112,215,127,215,140,212,148,208,154,203,156,195,155,193,155,190,154,187,154,183,153,179,155,171,158,166,163,161,168,158,175,157,182,158,188,161,194,165,198,171,199,179,194,199,181,214,163,223,142,228,121,230,87,226,60,217,40,202,28,184,24,165,26,152,31,141,39,131,49,123,63,118,47,113,33,103,22,91,15,77,12,61,14,46,21,29,37,13,65,0,108,-4,130,-1,151,6,171,20,189,40,204,68,
 37,13,65,0,47,113,47,113,65,0,57,65,63,118,57,65,61,81,63,118,61,81,70,94,72,142,67,154,70,94,70,94,67,154,65,167,63,118,65,167,60,217,63,118,60,217,49,123,49,123,60,217,40,202,49,123,40,202,39,131,39,131,40,202,31,141,142,228,121,230,127,215,127,215,121,230,112,215,96,213,112,215,121,230,96,213,121,230,87,226,125,331,127,294,129,330,129,330,127,294,131,299,129,330,131,299,133,329,133,329,131,299,135,304,133,329,135,304,137,326,137,326,135,304,138,309,137,326,138,309,139,322,139,322,138,309,139,313,139,322,139,313,140,316,127,294,125,331,119,330,127,294,119,330,115,329,127,294,115,329,111,327,127,294,111,327,108,324,127,294,108,324,106,320,127,294,106,320,94,253,194,199,181,214,182,158,194,199,182,158,188,161,194,199,188,161,194,165,194,199,194,165,198,171,194,199,198,171,199,179,158,166,163,161,163,223,163,223,163,161,168,158,163,223,168,158,181,214,181,214,168,158,175,157,181,214,175,157,182,158,127,215,140,212,142,228,142,228,140,212,148,208,142,228,148,208,163,223,163,223,148,208,154,203,163,223,154,203,156,195,156,195,158,166,163,223,156,195,155,193,158,166,158,166,155,193,155,190,158,166,155,190,155,171,155,171,155,190,154,187,155,171,154,187,154,183,87,226,60,217,67,182,87,226,67,182,74,195,87,226,74,195,83,206,87,226,83,206,96,213,67,182,60,217,65,167,28,184,24,165,26,152,28,184,26,152,31,141,28,184,31,141,40,202,83,102,97,107,92,127,92,127,97,107,108,124,115,125,108,124,111,108,83,102,92,127,80,133,83,102,80,133,72,142,83,102,72,142,70,94,63,118,70,94,65,167,111,108,108,124,97,107,117,108,121,107,121,126,121,126,121,107,125,106,121,126,125,106,126,127,126,127,125,106,128,106,126,127,128,106,131,128,131,128,128,106,133,105,131,128,133,105,138,129,138,129,133,105,142,106,138,129,142,106,145,128,145,128,142,106,148,108,145,128,148,108,150,127,150,127,148,108,153,111,150,127,153,111,154,124,154,124,153,111,156,115,154,124,156,115,156,122,156,122,156,115,157,118,115,125,111,108,117,108,115,125,117,108,121,126,80,27,108,-4,95,22,95,22,108,-4,110,20,131,22,110,20,130,-1,131,22,130,-1,151,6,69,36,60,49,65,0,69,36,65,0,108,-4,69,36,108,-4,80,27,57,65,65,0,60,49,12,61,14,46,15,77,15,77,14,46,21,29,15,77,21,29,22,91,22,91,21,29,37,13,22,91,37,13,33,103,33,103,37,13,47,113,204,68,196,73,189,40,189,40,196,73,182,54,189,40,182,54,171,20,171,20,182,54,166,39,171,20,166,39,151,6,151,6,166,39,149,29,151,6,149,29,131,22,110,20,108,-4,130,-1,47,113,57,65,63,118,155,171,154,183,153,179,94,253,106,320,76,253,
-84,253,101,253,134,294,142,304,145,309,147,313,147,316,146,322,144,326,140,329,132,331,122,329,119,327,116,324,113,320,16383,16383,226,-107,223,-101,221,-94,219,-86,218,-76,218,160,216,182,208,202,196,217,180,226,159,230,145,229,131,224,117,216,102,205,87,190,86,190,84,205,81,215,76,223,68,226,56,228,44,225,33,216,22,203,13,188,5,172,12,170,15,176,25,188,30,193,36,194,39,193,41,190,44,184,45,173,46,156,46,0,88,0,88,174,100,185,111,194,120,199,130,202,140,203,153,201,163,195,170,185,174,172,176,154,176,-79,177,-89,179,-97,181,-103,184,-107,40,253,57,253,90,294,98,304,101,309,103,313,103,316,102,322,100,326,96,329,93,330,89,331,83,330,78,329,75,327,72,324,70,320,16383,16383,126,54,120,43,115,36,110,31,105,29,99,28,95,29,91,33,90,36,89,40,89,228,88,230,72,224,57,219,41,214,26,208,10,204,10,195,15,196,37,196,42,193,45,188,47,181,47,39,48,26,51,14,57,4,65,-2,77,-4,92,-1,105,7,116,20,126,35,133,50,202,278,201,286,197,293,192,298,185,302,177,303,169,302,163,298,157,293,154,286,152,278,154,271,157,264,163,258,169,255,177,253,185,255,192,258,197,264,
+84,253,101,253,134,294,142,304,145,309,147,313,147,316,146,322,144,326,140,329,132,331,122,329,119,327,116,324,113,320,16383,16383,226,-107,223,-101,221,-94,219,-86,218,-76,218,160,216,182,208,202,196,217,180,226,159,230,145,229,131,224,117,216,102,205,87,190,86,190,84,205,81,215,76,223,68,226,56,228,44,225,33,216,22,203,13,188,5,172,12,170,15,176,25,188,30,193,36,194,39,193,41,190,44,184,45,173,46,156,46,0,88,0,88,174,100,185,111,194,120,199,130,202,140,203,153,201,163,195,170,185,174,172,176,154,176,-79,177,-89,179,-97,181,-103,184,-107,
 15,176,20,182,22,203,22,203,20,182,25,188,22,203,25,188,33,216,33,216,25,188,30,193,33,216,30,193,36,194,36,194,39,193,44,225,44,225,39,193,41,190,44,225,41,190,44,184,13,188,5,172,12,170,13,188,12,170,15,176,13,188,15,176,22,203,87,190,86,190,88,0,87,190,88,0,88,174,87,190,88,174,102,205,88,174,100,185,102,205,102,205,100,185,111,194,102,205,111,194,117,216,117,216,111,194,120,199,117,216,120,199,131,224,131,224,120,199,130,202,131,224,130,202,140,203,140,203,153,201,145,229,145,229,153,201,159,230,88,0,86,190,84,205,88,0,84,205,81,215,88,0,81,215,76,223,88,0,76,223,68,226,88,0,68,226,56,228,88,0,56,228,46,156,88,0,46,156,46,0,145,229,131,224,140,203,218,-65,218,160,216,182,218,-65,216,182,208,202,218,-65,208,202,218,-76,196,217,180,226,181,-103,196,217,181,-103,184,-107,196,217,184,-107,218,-76,196,217,218,-76,208,202,184,-107,226,-107,223,-101,184,-107,223,-101,221,-94,184,-107,221,-94,219,-86,184,-107,219,-86,218,-76,180,226,159,230,163,195,180,226,163,195,170,185,180,226,170,185,174,172,180,226,174,172,176,154,180,226,176,154,176,-79,180,226,176,-79,177,-89,180,226,177,-89,179,-97,180,226,179,-97,181,-103,176,154,176,-64,176,-79,132,331,134,294,136,330,136,330,134,294,138,299,136,330,138,299,140,329,140,329,138,299,142,304,140,329,142,304,144,326,144,326,142,304,145,309,144,326,145,309,146,322,146,322,145,309,147,313,146,322,147,313,147,316,134,294,132,331,127,330,134,294,127,330,122,329,134,294,122,329,119,327,134,294,119,327,116,324,134,294,116,324,113,320,134,294,113,320,101,253,45,173,46,156,56,228,45,173,56,228,44,225,45,173,44,225,44,184,44,225,33,216,36,194,101,253,113,320,84,253,159,230,153,201,163,195,
-40,253,57,253,90,294,98,304,101,309,103,313,103,316,102,322,100,326,96,329,93,330,89,331,83,330,78,329,75,327,72,324,70,320,16383,16383,126,54,120,43,115,36,110,31,105,29,99,28,95,29,91,33,90,36,89,40,89,228,88,230,72,224,57,219,41,214,26,208,10,204,10,195,15,196,37,196,42,193,45,188,47,181,47,39,48,26,51,14,57,4,65,-2,77,-4,92,-1,105,7,116,20,126,35,133,50,202,278,201,286,197,293,192,298,185,302,177,303,169,302,163,298,157,293,154,286,152,278,154,271,157,264,163,258,169,255,177,253,185,255,192,258,197,264,201,271,202,278,16383,16383,100,253,118,253,151,294,159,304,162,309,163,313,164,316,163,322,161,326,157,329,149,331,143,330,139,329,135,327,132,324,130,320,16383,16383,103,278,101,286,98,293,92,298,85,302,78,303,70,302,63,298,58,293,54,286,53,278,54,271,58,264,
+40,253,57,253,90,294,98,304,101,309,103,313,103,316,102,322,100,326,96,329,93,330,89,331,83,330,78,329,75,327,72,324,70,320,16383,16383,126,54,120,43,115,36,110,31,105,29,99,28,95,29,91,33,90,36,89,40,89,228,88,230,72,224,57,219,41,214,26,208,10,204,10,195,15,196,37,196,42,193,45,188,47,181,47,39,48,26,51,14,57,4,65,-2,77,-4,92,-1,105,7,116,20,126,35,133,50,
 89,331,90,294,93,330,93,330,90,294,94,299,93,330,94,299,96,329,96,329,94,299,98,304,96,329,98,304,100,326,100,326,98,304,101,309,100,326,101,309,102,322,102,322,101,309,103,313,102,322,103,313,103,316,90,294,89,331,83,330,90,294,83,330,78,329,90,294,78,329,75,327,90,294,75,327,72,324,90,294,72,324,70,320,90,294,70,320,57,253,45,188,57,219,42,193,42,193,57,219,41,214,42,193,41,214,37,196,37,196,41,214,31,196,28,196,31,196,41,214,28,196,41,214,26,208,57,4,65,-2,72,224,72,224,65,-2,77,-4,72,224,77,-4,88,230,88,230,77,-4,89,40,88,230,89,40,89,228,91,33,92,-1,93,31,93,31,92,-1,105,7,93,31,105,7,95,29,95,29,105,7,99,28,105,29,99,28,105,7,105,29,105,7,116,20,133,50,126,54,126,35,126,35,126,54,120,43,126,35,120,43,116,20,116,20,120,43,115,36,116,20,115,36,110,31,92,-1,91,33,90,36,92,-1,90,36,89,40,92,-1,89,40,77,-4,57,219,45,188,47,181,57,219,47,181,47,172,57,219,47,172,48,26,57,219,48,26,51,14,57,219,51,14,57,4,57,219,57,4,72,224,47,172,47,39,48,26,26,208,10,204,15,196,26,208,15,196,20,196,26,208,20,196,24,196,26,208,24,196,28,196,15,196,10,204,10,195,105,29,116,20,110,31,57,253,70,320,40,253,
-202,278,201,286,197,293,192,298,185,302,177,303,169,302,163,298,157,293,154,286,152,278,154,271,157,264,163,258,169,255,177,253,185,255,192,258,197,264,201,271,202,278,16383,16383,100,253,118,253,151,294,159,304,162,309,163,313,164,316,163,322,161,326,157,329,149,331,143,330,139,329,135,327,132,324,130,320,16383,16383,103,278,101,286,98,293,92,298,85,302,78,303,70,302,63,298,58,293,54,286,53,278,54,271,58,264,63,258,70,255,78,253,85,255,92,258,98,264,101,271,103,278,16383,16383,127,230,127,220,139,218,149,214,159,209,168,201,177,191,186,176,193,159,198,141,201,122,202,104,200,75,193,49,182,28,165,14,142,9,121,14,106,28,97,47,92,68,91,87,91,193,90,205,86,215,80,222,71,226,60,228,47,225,36,216,26,203,16,188,8,172,15,170,18,176,28,188,33,193,39,194,43,192,46,187,48,180,49,170,49,99,51,66,60,38,76,15,102,0,139,-4,174,1,204,18,227,43,242,75,247,113,241,155,226,188,202,211,173,225,141,230,257,65,255,50,252,39,248,32,245,27,241,26,232,31,223,43,216,60,210,78,206,94,261,225,212,225,190,157,182,178,171,198,156,215,137,226,113,230,79,224,52,207,31,181,19,148,15,112,19,73,32,41,52,16,78,1,108,-4,129,-1,147,5,162,17,174,32,185,50,190,32,196,17,204,5,213,-1,225,-4,239,0,250,8,258,24,263,43,265,65,16383,16383,166,104,162,84,155,59,145,35,131,16,113,9,90,19,75,43,66,76,61,109,60,137,63,167,70,189,81,204,95,213,110,216,129,208,144,187,154,159,161,130,166,104,172,200,181,204,190,209,196,215,202,222,206,229,209,236,211,244,213,251,213,257,214,264,209,289,197,311,179,327,157,338,133,342,102,337,76,322,54,293,41,249,36,186,36,-67,34,-85,30,-101,27,-107,70,-107,72,-102,74,-95,76,-87,78,-67,78,16,88,7,98,1,108,-2,119,-3,131,-4,164,2,192,19,214,46,228,78,233,114,231,137,223,158,211,176,194,190,173,199,16383,16383,78,243,78,250,79,276,85,297,95,314,108,324,
+202,278,201,286,197,293,192,298,185,302,177,303,169,302,163,298,157,293,154,286,152,278,154,271,157,264,163,258,169,255,177,253,185,255,192,258,197,264,201,271,202,278,16383,16383,100,253,118,253,151,294,159,304,162,309,163,313,164,316,163,322,161,326,157,329,149,331,143,330,139,329,135,327,132,324,130,320,16383,16383,103,278,101,286,98,293,92,298,85,302,78,303,70,302,63,298,58,293,54,286,53,278,54,271,58,264,63,258,70,255,78,253,85,255,92,258,98,264,101,271,103,278,16383,16383,127,230,127,220,139,218,149,214,159,209,168,201,177,191,186,176,193,159,198,141,201,122,202,104,200,75,193,49,182,28,165,14,142,9,121,14,106,28,97,47,92,68,91,87,91,193,90,205,86,215,80,222,71,226,60,228,47,225,36,216,26,203,16,188,8,172,15,170,18,176,28,188,33,193,39,194,43,192,46,187,48,180,49,170,49,99,51,66,60,38,76,15,102,0,139,-4,174,1,204,18,227,43,242,75,247,113,241,155,226,188,202,211,173,225,141,230,
 18,176,23,182,26,203,26,203,23,182,28,188,26,203,28,188,36,216,36,216,28,188,33,193,36,216,33,193,39,194,39,194,43,192,47,225,47,225,43,192,46,187,47,225,46,187,48,180,16,188,8,172,15,170,16,188,15,170,18,176,16,188,18,176,26,203,49,99,51,66,49,159,49,170,49,159,60,228,49,170,60,228,48,180,48,180,60,228,47,225,54,286,54,271,58,293,58,293,54,271,58,264,58,293,58,264,63,298,63,298,58,264,63,258,63,298,63,258,70,302,70,302,63,258,70,255,70,302,70,255,78,303,78,303,70,255,78,253,78,303,78,253,85,302,85,302,78,253,85,255,85,302,85,255,92,298,92,298,85,255,92,258,92,298,92,258,98,293,98,293,92,258,98,264,98,293,98,264,101,286,101,286,98,264,101,271,101,286,101,271,103,278,91,87,91,193,90,205,91,87,90,205,86,215,91,87,86,215,80,222,91,87,80,222,92,68,141,230,127,230,139,218,141,230,139,218,149,214,141,230,149,214,173,225,200,75,193,49,204,18,204,18,193,49,182,28,204,18,182,28,174,1,174,1,182,28,165,14,174,1,165,14,142,9,142,9,121,14,139,-4,139,-4,121,14,106,28,139,-4,106,28,102,0,102,0,106,28,97,47,102,0,97,47,92,68,76,15,102,0,92,68,76,15,92,68,80,222,76,15,80,222,71,226,76,15,71,226,60,228,76,15,60,228,60,38,60,228,49,159,51,66,60,228,51,66,60,38,47,225,36,216,39,194,149,214,159,209,173,225,173,225,159,209,168,201,173,225,168,201,177,191,177,191,186,176,202,211,202,211,186,176,193,159,202,211,193,159,198,141,202,211,202,104,204,18,202,211,204,18,226,188,226,188,204,18,227,43,226,188,227,43,241,155,241,155,227,43,242,75,241,155,242,75,247,113,202,211,198,141,201,122,202,211,201,122,202,104,202,211,173,225,177,191,142,9,139,-4,174,1,154,286,154,271,157,293,157,293,154,271,157,264,157,293,157,264,163,298,163,298,157,264,163,258,163,298,163,258,169,302,169,302,163,258,169,255,169,302,169,255,177,303,177,303,169,255,177,253,177,303,177,253,185,302,185,302,177,253,185,255,185,302,185,255,192,298,192,298,185,255,192,258,192,298,192,258,197,293,197,293,192,258,197,264,197,293,197,264,201,286,201,286,197,264,201,271,201,286,201,271,202,278,149,331,151,294,153,330,153,330,151,294,155,299,153,330,155,299,157,329,157,329,155,299,159,304,157,329,159,304,161,326,161,326,159,304,162,309,161,326,162,309,163,322,163,322,162,309,163,313,163,322,163,313,164,316,151,294,149,331,143,330,151,294,143,330,139,329,151,294,139,329,135,327,151,294,135,327,132,324,151,294,132,324,130,320,151,294,130,320,118,253,118,253,130,320,100,253,154,271,154,286,152,278,200,75,204,18,202,104,139,218,127,230,127,220,54,271,54,286,53,278,
-257,65,255,50,252,39,248,32,245,27,241,26,232,31,223,43,216,60,210,78,206,94,261,225,212,225,190,157,182,178,171,198,156,215,137,226,113,230,79,224,52,207,31,181,19,148,15,112,19,73,32,41,52,16,78,1,108,-4,129,-1,147,5,162,17,174,32,185,50,190,32,196,17,204,5,213,-1,225,-4,239,0,250,8,258,24,263,43,265,65,16383,16383,166,104,162,84,155,59,145,35,131,16,113,9,90,19,75,43,66,76,61,109,60,137,63,167,70,189,81,204,95,213,110,216,129,208,144,187,154,159,161,130,166,104,172,200,181,204,190,209,196,215,202,222,206,229,209,236,211,244,213,251,213,257,214,264,209,289,197,311,179,327,157,338,133,342,102,337,76,322,54,293,41,249,36,186,36,-67,34,-85,30,-101,27,-107,70,-107,72,-102,74,-95,76,-87,78,-67,78,16,88,7,98,1,108,-2,119,-3,131,-4,164,2,192,19,214,46,228,78,233,114,231,137,223,158,211,176,194,190,173,199,16383,16383,78,243,78,250,79,276,85,297,95,314,108,324,124,328,144,322,158,309,167,290,172,268,173,247,172,235,170,225,166,215,160,209,152,206,147,207,141,208,
+257,65,255,50,252,39,248,32,245,27,241,26,232,31,223,43,216,60,210,78,206,94,261,225,212,225,190,157,182,178,171,198,156,215,137,226,113,230,79,224,52,207,31,181,19,148,15,112,19,73,32,41,52,16,78,1,108,-4,129,-1,147,5,162,17,174,32,185,50,190,32,196,17,204,5,213,-1,225,-4,239,0,250,8,258,24,263,43,265,65,16383,16383,166,104,162,84,155,59,145,35,131,16,113,9,90,19,75,43,66,76,61,109,60,137,63,167,70,189,81,204,95,213,110,216,129,208,144,187,154,159,161,130,166,104,
 63,167,70,189,79,224,79,224,70,189,81,204,79,224,81,204,113,230,113,230,81,204,95,213,113,230,95,213,110,216,110,216,129,208,113,230,113,230,129,208,137,226,144,187,154,159,156,215,156,215,154,159,161,130,156,215,161,130,171,198,171,198,161,130,166,104,171,198,166,104,174,32,171,198,174,32,182,178,182,178,174,32,185,50,182,178,185,50,190,157,190,157,185,50,190,32,190,157,190,32,212,225,212,225,190,32,196,17,212,225,196,17,206,94,206,94,196,17,204,5,206,94,204,5,213,-1,137,226,129,208,144,187,137,226,144,187,156,215,174,32,166,104,162,84,174,32,162,84,162,17,162,17,162,84,155,59,162,17,155,59,147,5,147,5,155,59,145,35,147,5,145,35,131,16,78,1,108,-4,90,19,90,19,108,-4,113,9,131,16,113,9,129,-1,131,16,129,-1,147,5,210,78,206,94,213,-1,212,225,206,94,261,225,252,39,248,32,250,8,250,8,248,32,245,27,250,8,245,27,241,26,241,26,232,31,239,0,239,0,232,31,225,-4,210,78,213,-1,216,60,216,60,213,-1,225,-4,216,60,225,-4,223,43,223,43,225,-4,232,31,258,24,263,43,265,65,258,24,265,65,257,65,258,24,257,65,255,50,258,24,255,50,252,39,258,24,252,39,250,8,241,26,239,0,250,8,113,9,108,-4,129,-1,90,19,75,43,78,1,78,1,75,43,66,76,78,1,66,76,52,16,52,16,66,76,61,109,52,16,61,109,60,137,60,137,63,167,52,207,52,207,63,167,79,224,52,16,60,137,52,207,52,16,52,207,32,41,32,41,52,207,31,181,32,41,31,181,19,73,19,73,31,181,19,148,19,73,19,148,15,112,
-172,200,181,204,190,209,196,215,202,222,206,229,209,236,211,244,213,251,213,257,214,264,209,289,197,311,179,327,157,338,133,342,102,337,76,322,54,293,41,249,36,186,36,-67,34,-85,30,-101,27,-107,70,-107,72,-102,74,-95,76,-87,78,-67,78,16,88,7,98,1,108,-2,119,-3,131,-4,164,2,192,19,214,46,228,78,233,114,231,137,223,158,211,176,194,190,173,199,16383,16383,78,243,78,250,79,276,85,297,95,314,108,324,124,328,144,322,158,309,167,290,172,268,173,247,172,235,170,225,166,215,160,209,152,206,147,207,141,208,136,209,130,210,118,210,112,208,108,206,106,203,105,200,106,195,109,192,113,189,118,188,125,187,130,187,142,190,148,190,158,187,169,178,179,162,187,136,190,101,187,72,179,47,167,28,150,16,129,11,114,13,100,19,88,26,80,35,78,45,222,225,172,225,120,49,115,84,108,130,97,177,78,214,49,228,32,224,20,212,12,195,7,173,5,150,12,150,16,166,21,178,28,187,35,192,41,194,66,179,84,143,96,96,103,50,107,18,103,9,100,0,96,-7,90,-25,84,-47,82,-57,81,-66,81,-74,82,-85,85,-94,90,-101,96,-106,105,-108,118,-105,127,-98,133,-87,135,-73,136,-58,136,-45,135,-32,133,-19,131,-8,129,0,110,213,77,203,50,187,31,164,19,137,15,108,20,74,34,44,56,18,86,1,123,-4,161,1,192,17,215,43,230,76,235,116,232,141,225,164,213,184,197,202,176,217,145,233,114,248,87,261,68,274,61,290,64,302,72,310,83,316,95,319,106,320,137,316,154,307,165,296,176,286,191,282,198,284,203,288,206,293,208,299,209,304,203,318,188,328,168,336,145,340,124,342,102,340,81,334,61,324,
+172,200,181,204,190,209,196,215,202,222,206,229,209,236,211,244,213,251,213,257,214,264,209,289,197,311,179,327,157,338,133,342,102,337,76,322,54,293,41,249,36,186,36,-67,34,-85,30,-101,27,-107,70,-107,72,-102,74,-95,76,-87,78,-67,78,16,88,7,98,1,108,-2,119,-3,131,-4,164,2,192,19,214,46,228,78,233,114,231,137,223,158,211,176,194,190,173,199,16383,16383,78,243,78,250,79,276,85,297,95,314,108,324,124,328,144,322,158,309,167,290,172,268,173,247,172,235,170,225,166,215,160,209,152,206,147,207,141,208,136,209,130,210,118,210,112,208,108,206,106,203,105,200,106,195,109,192,113,189,118,188,125,187,130,187,142,190,148,190,158,187,169,178,179,162,187,136,190,101,187,72,179,47,167,28,150,16,129,11,114,13,100,19,88,26,80,35,78,45,
 108,324,124,328,124,328,133,342,124,328,144,322,133,342,144,322,157,338,157,338,144,322,158,309,157,338,158,309,179,327,179,327,158,309,167,290,179,327,167,290,172,268,172,200,181,204,172,235,172,200,172,235,170,225,172,200,170,225,169,178,172,200,169,178,179,162,172,200,179,162,173,199,233,114,231,137,228,78,228,78,231,137,223,158,228,78,223,158,214,46,214,46,223,158,211,176,214,46,211,176,194,190,192,19,214,46,194,190,192,19,194,190,190,101,192,19,190,101,187,72,192,19,187,72,179,47,192,19,179,47,167,28,192,19,167,28,164,2,194,190,173,199,179,162,194,190,179,162,187,136,194,190,187,136,190,101,170,225,166,215,169,178,169,178,166,215,160,209,169,178,160,209,158,187,158,187,160,209,152,206,129,11,131,-4,150,16,150,16,131,-4,164,2,150,16,164,2,167,28,85,297,95,314,102,337,102,337,95,314,108,324,102,337,108,324,133,342,133,342,108,324,124,328,78,250,79,276,76,322,78,250,76,322,76,-87,78,250,76,-87,77,-77,78,250,77,-77,78,-67,76,322,79,276,85,297,76,322,85,297,102,337,76,322,54,293,70,-107,76,322,70,-107,72,-102,76,322,72,-102,74,-95,76,322,74,-95,76,-87,70,-107,54,293,41,249,70,-107,41,249,36,186,70,-107,36,186,36,-67,70,-107,36,-67,35,-76,70,-107,35,-76,34,-85,70,-107,34,-85,32,-93,70,-107,32,-93,30,-101,70,-107,30,-101,27,-107,114,13,100,19,108,-2,114,13,108,-2,119,-3,114,13,119,-3,129,11,108,-2,100,19,98,1,98,1,100,19,88,26,98,1,88,26,88,7,88,7,88,26,80,35,88,7,80,35,78,45,78,45,78,16,88,7,148,190,152,206,147,207,148,190,147,207,142,190,118,188,125,187,127,210,127,210,125,187,130,187,127,210,130,187,130,210,130,210,130,187,134,188,130,210,134,188,136,209,136,209,134,188,138,189,136,209,138,189,141,208,141,208,138,189,142,190,141,208,142,190,147,207,106,203,106,195,108,206,108,206,106,195,109,192,108,206,109,192,112,208,112,208,109,192,113,189,112,208,113,189,118,210,118,210,113,189,118,188,118,210,118,188,127,210,173,247,181,204,179,327,173,247,179,327,172,268,206,229,209,236,209,289,209,289,209,236,211,244,209,289,211,244,214,264,214,264,211,244,213,251,214,264,213,251,213,257,190,209,196,215,197,311,197,311,196,215,202,222,197,311,202,222,209,289,209,289,202,222,206,229,197,311,179,327,181,204,197,311,181,204,190,209,172,235,181,204,173,247,148,190,158,187,152,206,131,-4,129,11,119,-3,106,195,106,203,105,200,
-222,225,172,225,120,49,115,84,108,130,97,177,78,214,49,228,32,224,20,212,12,195,7,173,5,150,12,150,16,166,21,178,28,187,35,192,41,194,66,179,84,143,96,96,103,50,107,18,103,9,100,0,96,-7,90,-25,84,-47,82,-57,81,-66,81,-74,82,-85,85,-94,90,-101,96,-106,105,-108,118,-105,127,-98,133,-87,135,-73,136,-58,136,-45,135,-32,133,-19,131,-8,129,0,110,213,77,203,50,187,31,164,19,137,15,108,20,74,34,44,56,18,86,1,123,-4,161,1,192,17,215,43,230,76,235,116,232,141,225,164,213,184,197,202,176,217,145,233,114,248,87,261,68,274,61,290,64,302,72,310,83,316,95,319,106,320,137,316,154,307,165,296,176,286,191,282,198,284,203,288,206,293,208,299,209,304,203,318,188,328,168,336,145,340,124,342,102,340,
+222,225,172,225,120,49,115,84,108,130,97,177,78,214,49,228,32,224,20,212,12,195,7,173,5,150,12,150,16,166,21,178,28,187,35,192,41,194,66,179,84,143,96,96,103,50,107,18,103,9,100,0,96,-7,90,-25,84,-47,82,-57,81,-66,81,-74,82,-85,85,-94,90,-101,96,-106,105,-108,118,-105,127,-98,133,-87,135,-73,136,-58,136,-45,135,-32,133,-19,131,-8,129,0,
 35,192,41,194,41,194,49,228,41,194,66,179,49,228,66,179,78,214,78,214,66,179,84,143,78,214,84,143,97,177,97,177,84,143,96,96,97,177,96,96,103,50,120,49,115,84,118,-105,118,-105,115,84,108,130,118,-105,108,130,107,18,107,18,108,130,103,50,103,50,108,130,97,177,118,-105,127,-98,120,49,120,49,127,-98,129,0,120,49,129,0,172,225,172,225,129,0,222,225,107,18,103,9,105,-108,107,18,105,-108,118,-105,100,0,96,-7,96,-106,100,0,96,-106,105,-108,100,0,105,-108,103,9,96,-7,93,-16,96,-106,96,-106,93,-16,90,-25,96,-106,90,-25,90,-101,90,-101,90,-25,87,-36,90,-101,87,-36,85,-94,85,-94,87,-36,84,-47,85,-94,84,-47,82,-57,82,-85,85,-94,82,-57,82,-85,82,-57,81,-66,82,-85,81,-66,81,-74,135,-73,136,-58,136,-45,135,-73,136,-45,135,-32,135,-73,135,-32,133,-19,135,-73,133,-19,133,-87,133,-87,133,-19,131,-8,133,-87,131,-8,129,0,133,-87,129,0,127,-98,21,178,28,187,32,224,32,224,28,187,35,192,32,224,35,192,49,228,49,228,35,192,41,194,20,212,12,195,12,150,20,212,12,150,16,166,20,212,16,166,21,178,20,212,21,178,32,224,7,173,5,150,12,150,7,173,12,150,12,195,
-110,213,77,203,50,187,31,164,19,137,15,108,20,74,34,44,56,18,86,1,123,-4,161,1,192,17,215,43,230,76,235,116,232,141,225,164,213,184,197,202,176,217,145,233,114,248,87,261,68,274,61,290,64,302,72,310,83,316,95,319,106,320,137,316,154,307,165,296,176,286,191,282,198,284,203,288,206,293,208,299,209,304,203,318,188,328,168,336,145,340,124,342,102,340,81,334,61,324,47,309,42,289,45,269,54,251,68,237,87,224,110,213,16383,16383,190,104,187,71,180,45,168,25,151,13,130,9,121,10,111,13,101,19,93,26,85,35,76,52,69,70,64,88,61,106,60,121,62,144,70,165,84,183,103,195,127,200,149,190,167,172,179,149,187,126,190,104,196,73,182,54,166,39,149,29,131,22,110,20,95,22,80,27,69,36,60,49,57,65,61,81,70,94,83,102,97,107,111,108,117,108,125,106,128,106,133,105,142,106,148,108,153,111,156,115,157,118,156,122,154,124,150,127,145,128,138,129,131,128,121,126,115,125,108,124,92,127,80,133,72,142,67,154,65,167,67,182,74,195,83,206,96,213,112,215,127,215,140,212,148,208,154,203,156,195,155,193,155,190,154,187,154,183,153,179,155,171,158,166,163,161,168,158,175,157,182,158,188,161,194,165,198,171,199,179,194,199,181,214,163,223,142,228,121,230,87,226,60,217,40,202,28,184,24,165,26,152,31,141,39,131,49,123,63,118,47,113,33,103,22,91,15,77,
+110,213,77,203,50,187,31,164,19,137,15,108,20,74,34,44,56,18,86,1,123,-4,161,1,192,17,215,43,230,76,235,116,232,141,225,164,213,184,197,202,176,217,145,233,114,248,87,261,68,274,61,290,64,302,72,310,83,316,95,319,106,320,137,316,154,307,165,296,176,286,191,282,198,284,203,288,206,293,208,299,209,304,203,318,188,328,168,336,145,340,124,342,102,340,81,334,61,324,47,309,42,289,45,269,54,251,68,237,87,224,110,213,16383,16383,190,104,187,71,180,45,168,25,151,13,130,9,121,10,111,13,101,19,93,26,85,35,76,52,69,70,64,88,61,106,60,121,62,144,70,165,84,183,103,195,127,200,149,190,167,172,179,149,187,126,190,104,
 42,289,45,269,47,309,47,309,45,269,54,251,47,309,54,251,61,324,61,324,54,251,61,290,68,237,61,290,54,251,64,302,72,310,81,334,81,334,72,310,83,316,81,334,83,316,102,340,102,340,83,316,95,319,102,340,95,319,106,320,106,320,137,316,124,342,124,342,137,316,145,340,61,324,61,290,64,302,61,324,64,302,81,334,198,284,203,288,203,318,203,318,203,288,206,293,203,318,206,293,209,304,209,304,206,293,208,299,154,307,165,296,168,336,168,336,165,296,176,286,168,336,176,286,188,328,188,328,176,286,191,282,188,328,191,282,203,318,203,318,191,282,198,284,145,340,137,316,154,307,145,340,154,307,168,336,235,116,232,141,230,76,230,76,232,141,225,164,230,76,225,164,215,43,215,43,225,164,213,184,215,43,213,184,197,202,192,17,215,43,197,202,192,17,197,202,190,104,192,17,190,104,187,71,192,17,187,71,180,45,192,17,180,45,168,25,192,17,168,25,161,1,197,202,176,217,179,149,197,202,179,149,187,126,197,202,187,126,190,104,145,233,127,200,149,190,145,233,149,190,176,217,176,217,149,190,167,172,176,217,167,172,179,149,111,13,123,-4,121,10,121,10,123,-4,130,9,151,13,130,9,161,1,151,13,161,1,168,25,130,9,123,-4,161,1,124,342,102,340,106,320,69,70,86,1,76,52,76,52,86,1,85,35,93,26,85,35,86,1,93,26,86,1,123,-4,68,274,68,237,87,261,87,261,68,237,87,224,87,261,87,224,114,248,114,248,87,224,110,213,114,248,110,213,127,200,62,144,70,165,77,203,77,203,70,165,84,183,77,203,84,183,110,213,110,213,84,183,103,195,110,213,103,195,127,200,77,203,50,187,62,144,62,144,50,187,60,121,61,106,60,121,56,18,61,106,56,18,64,88,64,88,56,18,86,1,64,88,86,1,69,70,56,18,60,121,50,187,56,18,50,187,34,44,34,44,50,187,31,164,34,44,31,164,20,74,20,74,31,164,19,137,20,74,19,137,15,108,101,19,93,26,123,-4,101,19,123,-4,111,13,61,290,68,237,68,274,127,200,145,233,114,248,
-196,73,182,54,166,39,149,29,131,22,110,20,95,22,80,27,69,36,60,49,57,65,61,81,70,94,83,102,97,107,111,108,117,108,125,106,128,106,133,105,142,106,148,108,153,111,156,115,157,118,156,122,154,124,150,127,145,128,138,129,131,128,121,126,115,125,108,124,92,127,80,133,72,142,67,154,65,167,67,182,74,195,83,206,96,213,112,215,127,215,140,212,148,208,154,203,156,195,155,193,155,190,154,187,154,183,153,179,155,171,158,166,163,161,168,158,175,157,182,158,188,161,194,165,198,171,199,179,194,199,181,214,163,223,142,228,121,230,87,226,60,217,40,202,28,184,24,165,26,152,31,141,39,131,49,123,63,118,47,113,33,103,22,91,15,77,12,61,14,46,21,29,37,13,65,0,108,-4,130,-1,151,6,171,20,189,40,204,68,76,342,59,335,45,327,35,318,29,308,27,296,30,283,38,272,48,265,60,260,71,259,72,257,52,225,36,196,25,166,19,135,17,100,21,58,33,28,49,9,71,-1,95,-4,105,-4,117,-2,128,-1,137,0,143,0,158,-1,170,-5,180,-12,186,-22,188,-34,186,-47,180,-58,170,-67,159,-72,147,-74,140,-72,134,-69,128,-64,123,-61,117,-59,110,-60,104,-63,99,-68,97,-73,96,-80,98,-90,103,-98,111,-103,121,-107,132,-108,151,-104,170,-93,187,-76,199,-55,204,-29,201,-3,192,16,177,30,156,38,128,41,117,41,113,40,103,40,78,44,61,55,49,72,43,93,41,117,44,151,53,184,65,213,80,238,94,257,119,262,142,271,161,283,174,297,179,311,178,316,175,321,171,325,166,327,159,328,142,325,125,315,108,302,94,287,84,273,74,274,65,277,57,281,52,288,
+196,73,182,54,166,39,149,29,131,22,110,20,95,22,80,27,69,36,60,49,57,65,61,81,70,94,83,102,97,107,111,108,117,108,125,106,128,106,133,105,142,106,148,108,153,111,156,115,157,118,156,122,154,124,150,127,145,128,138,129,131,128,121,126,115,125,108,124,92,127,80,133,72,142,67,154,65,167,67,182,74,195,83,206,96,213,112,215,127,215,140,212,148,208,154,203,156,195,155,193,155,190,154,187,154,183,153,179,155,171,158,166,163,161,168,158,175,157,182,158,188,161,194,165,198,171,199,179,194,199,181,214,163,223,142,228,121,230,87,226,60,217,40,202,28,184,24,165,26,152,31,141,39,131,49,123,63,118,47,113,33,103,22,91,15,77,12,61,14,46,21,29,37,13,65,0,108,-4,130,-1,151,6,171,20,189,40,204,68,
 37,13,65,0,47,113,47,113,65,0,57,65,63,118,57,65,61,81,63,118,61,81,70,94,72,142,67,154,70,94,70,94,67,154,65,167,63,118,65,167,60,217,63,118,60,217,49,123,49,123,60,217,40,202,49,123,40,202,39,131,39,131,40,202,31,141,142,228,121,230,127,215,127,215,121,230,112,215,96,213,112,215,121,230,96,213,121,230,87,226,194,199,181,214,182,158,194,199,182,158,188,161,194,199,188,161,194,165,194,199,194,165,198,171,194,199,198,171,199,179,158,166,163,161,163,223,163,223,163,161,168,158,163,223,168,158,181,214,181,214,168,158,175,157,181,214,175,157,182,158,127,215,140,212,142,228,142,228,140,212,148,208,142,228,148,208,163,223,163,223,148,208,154,203,163,223,154,203,156,195,156,195,158,166,163,223,156,195,155,193,158,166,158,166,155,193,155,190,158,166,155,190,155,171,155,171,155,190,154,187,155,171,154,187,154,183,87,226,60,217,67,182,87,226,67,182,74,195,87,226,74,195,83,206,87,226,83,206,96,213,67,182,60,217,65,167,28,184,24,165,26,152,28,184,26,152,31,141,28,184,31,141,40,202,83,102,97,107,92,127,92,127,97,107,108,124,115,125,108,124,111,108,83,102,92,127,80,133,83,102,80,133,72,142,83,102,72,142,70,94,63,118,70,94,65,167,111,108,108,124,97,107,117,108,121,107,121,126,121,126,121,107,125,106,121,126,125,106,126,127,126,127,125,106,128,106,126,127,128,106,131,128,131,128,128,106,133,105,131,128,133,105,138,129,138,129,133,105,142,106,138,129,142,106,145,128,145,128,142,106,148,108,145,128,148,108,150,127,150,127,148,108,153,111,150,127,153,111,154,124,154,124,153,111,156,115,154,124,156,115,156,122,156,122,156,115,157,118,115,125,111,108,117,108,115,125,117,108,121,126,80,27,108,-4,95,22,95,22,108,-4,110,20,131,22,110,20,130,-1,131,22,130,-1,151,6,69,36,60,49,65,0,69,36,65,0,108,-4,69,36,108,-4,80,27,57,65,65,0,60,49,12,61,14,46,15,77,15,77,14,46,21,29,15,77,21,29,22,91,22,91,21,29,37,13,22,91,37,13,33,103,33,103,37,13,47,113,204,68,196,73,189,40,189,40,196,73,182,54,189,40,182,54,171,20,171,20,182,54,166,39,171,20,166,39,151,6,151,6,166,39,149,29,151,6,149,29,131,22,110,20,108,-4,130,-1,47,113,57,65,63,118,155,171,154,183,153,179,
-76,342,59,335,45,327,35,318,29,308,27,296,30,283,38,272,48,265,60,260,71,259,72,257,52,225,36,196,25,166,19,135,17,100,21,58,33,28,49,9,71,-1,95,-4,105,-4,117,-2,128,-1,137,0,143,0,158,-1,170,-5,180,-12,186,-22,188,-34,186,-47,180,-58,170,-67,159,-72,147,-74,140,-72,134,-69,128,-64,123,-61,117,-59,110,-60,104,-63,99,-68,97,-73,96,-80,98,-90,103,-98,111,-103,121,-107,132,-108,151,-104,170,-93,187,-76,199,-55,204,-29,201,-3,192,16,177,30,156,38,128,41,117,41,113,40,103,40,78,44,61,55,49,72,43,93,41,117,44,151,53,184,65,213,80,238,94,257,119,262,142,271,161,283,174,297,179,311,178,316,175,321,171,325,166,327,159,328,142,325,125,315,108,302,94,287,84,273,74,274,65,277,57,281,52,288,50,298,51,305,55,312,61,320,70,328,81,334,226,-107,223,-101,221,-94,219,-86,218,-76,218,160,216,182,208,202,196,217,180,226,159,230,145,229,131,224,117,216,102,205,87,190,86,190,84,205,81,215,76,223,68,226,56,228,44,225,33,216,22,203,13,188,5,172,12,170,15,176,25,188,30,193,36,194,39,193,41,190,44,184,45,173,46,156,46,0,88,0,88,174,100,185,111,194,120,199,130,202,140,203,153,201,163,195,170,185,174,172,176,154,176,-79,177,-89,179,-97,181,-103,184,-107,234,166,233,198,230,228,226,254,220,277,211,296,199,313,185,325,169,334,150,340,126,342,87,333,55,310,32,273,18,226,13,170,14,144,15,120,18,100,23,81,28,64,40,41,55,21,74,7,96,-1,122,-4,161,3,192,27,215,63,229,110,234,166,16383,16383,59,177,59,193,62,247,70,285,83,310,99,324,119,328,150,318,171,292,182,256,188,216,189,177,16383,16383,
+76,342,59,335,45,327,35,318,29,308,27,296,30,283,38,272,48,265,60,260,71,259,72,257,52,225,36,196,25,166,19,135,17,100,21,58,33,28,49,9,71,-1,95,-4,105,-4,117,-2,128,-1,137,0,143,0,158,-1,170,-5,180,-12,186,-22,188,-34,186,-47,180,-58,170,-67,159,-72,147,-74,140,-72,134,-69,128,-64,123,-61,117,-59,110,-60,104,-63,99,-68,97,-73,96,-80,98,-90,103,-98,111,-103,121,-107,132,-108,151,-104,170,-93,187,-76,199,-55,204,-29,201,-3,192,16,177,30,156,38,128,41,117,41,113,40,103,40,78,44,61,55,49,72,43,93,41,117,44,151,53,184,65,213,80,238,94,257,119,262,142,271,161,283,174,297,179,311,178,316,175,321,171,325,166,327,159,328,142,325,125,315,108,302,94,287,84,273,74,274,65,277,57,281,52,288,50,298,51,305,55,312,61,320,70,328,81,334,
 43,93,41,117,41,117,36,196,41,117,44,151,36,196,44,151,52,225,52,225,44,151,53,184,52,225,53,184,72,257,72,257,53,184,65,213,72,257,65,213,80,238,48,265,50,298,45,327,48,265,45,327,38,272,38,272,45,327,35,318,38,272,35,318,30,283,30,283,35,318,29,308,30,283,29,308,27,296,51,305,55,312,59,335,59,335,55,312,61,320,59,335,61,320,76,342,76,342,61,320,70,328,76,342,70,328,81,334,51,305,59,335,45,327,51,305,45,327,50,298,108,302,94,287,94,257,94,257,94,287,84,273,94,257,84,273,80,238,80,238,84,273,74,274,80,238,74,274,72,257,72,257,74,274,71,259,166,327,159,328,161,283,161,283,159,328,142,325,161,283,142,325,142,271,142,271,142,325,125,315,142,271,125,315,119,262,119,262,125,315,108,302,119,262,108,302,94,257,65,277,57,281,60,260,65,277,60,260,71,259,65,277,71,259,74,274,52,288,50,298,48,265,52,288,48,265,60,260,52,288,60,260,57,281,71,-1,95,-4,78,44,78,44,95,-4,103,40,108,40,103,40,105,-4,108,40,105,-4,117,-2,61,55,49,72,49,9,61,55,49,9,71,-1,61,55,71,-1,78,44,43,93,41,117,33,28,43,93,33,28,49,9,43,93,49,9,49,72,41,117,36,196,33,28,33,28,36,196,25,166,33,28,25,166,21,58,21,58,25,166,19,135,21,58,19,135,17,100,177,30,156,38,158,-1,158,-1,156,38,143,0,137,0,143,0,156,38,137,0,156,38,128,41,128,-1,137,0,128,41,128,-1,128,41,123,41,128,-1,123,41,117,41,128,-1,117,41,117,-2,113,40,108,40,117,-2,113,40,117,-2,117,41,128,-64,132,-108,134,-69,134,-69,132,-108,151,-104,134,-69,151,-104,140,-72,140,-72,151,-104,147,-74,159,-72,147,-74,151,-104,159,-72,151,-104,170,-93,204,-29,201,-3,199,-55,199,-55,201,-3,192,16,199,-55,192,16,188,-34,188,-34,187,-76,199,-55,158,-1,170,-5,177,30,177,30,170,-5,180,-12,177,30,180,-12,192,16,192,16,180,-12,186,-22,192,16,186,-22,188,-34,187,-76,188,-34,186,-47,187,-76,186,-47,180,-58,187,-76,180,-58,170,-67,187,-76,170,-67,170,-93,110,-60,111,-103,117,-59,117,-59,111,-103,121,-107,117,-59,121,-107,123,-61,123,-61,121,-107,132,-108,123,-61,132,-108,128,-64,97,-73,98,-90,99,-68,99,-68,98,-90,103,-98,99,-68,103,-98,104,-63,104,-63,103,-98,111,-103,104,-63,111,-103,110,-60,175,321,171,325,174,297,175,321,174,297,179,311,175,321,179,311,178,316,166,327,161,283,174,297,166,327,174,297,171,325,103,40,95,-4,105,-4,98,-90,97,-73,96,-80,159,-72,170,-93,170,-67,
-226,-107,223,-101,221,-94,219,-86,218,-76,218,160,216,182,208,202,196,217,180,226,159,230,145,229,131,224,117,216,102,205,87,190,86,190,84,205,81,215,76,223,68,226,56,228,44,225,33,216,22,203,13,188,5,172,12,170,15,176,25,188,30,193,36,194,39,193,41,190,44,184,45,173,46,156,46,0,88,0,88,174,100,185,111,194,120,199,130,202,140,203,153,201,163,195,170,185,174,172,176,154,176,-79,177,-89,179,-97,181,-103,184,-107,234,166,233,198,230,228,226,254,220,277,211,296,199,313,185,325,169,334,150,340,126,342,87,333,55,310,32,273,18,226,13,170,14,144,15,120,18,100,23,81,28,64,40,41,55,21,74,7,96,-1,122,-4,161,3,192,27,215,63,229,110,234,166,16383,16383,59,177,59,193,62,247,70,285,83,310,99,324,119,328,150,318,171,292,182,256,188,216,189,177,16383,16383,189,158,187,109,180,67,168,36,151,16,128,9,98,18,78,42,67,77,61,118,
+226,-107,223,-101,221,-94,219,-86,218,-76,218,160,216,182,208,202,196,217,180,226,159,230,145,229,131,224,117,216,102,205,87,190,86,190,84,205,81,215,76,223,68,226,56,228,44,225,33,216,22,203,13,188,5,172,12,170,15,176,25,188,30,193,36,194,39,193,41,190,44,184,45,173,46,156,46,0,88,0,88,174,100,185,111,194,120,199,130,202,140,203,153,201,163,195,170,185,174,172,176,154,176,-79,177,-89,179,-97,181,-103,184,-107,
 15,176,20,182,22,203,22,203,20,182,25,188,22,203,25,188,33,216,33,216,25,188,30,193,33,216,30,193,36,194,36,194,39,193,44,225,44,225,39,193,41,190,44,225,41,190,44,184,13,188,5,172,12,170,13,188,12,170,15,176,13,188,15,176,22,203,87,190,86,190,88,0,87,190,88,0,88,174,87,190,88,174,102,205,88,174,100,185,102,205,102,205,100,185,111,194,102,205,111,194,117,216,117,216,111,194,120,199,117,216,120,199,131,224,131,224,120,199,130,202,131,224,130,202,140,203,140,203,153,201,145,229,145,229,153,201,159,230,88,0,86,190,84,205,88,0,84,205,81,215,88,0,81,215,76,223,88,0,76,223,68,226,88,0,68,226,56,228,88,0,56,228,46,156,88,0,46,156,46,0,145,229,131,224,140,203,218,-65,218,160,216,182,218,-65,216,182,208,202,218,-65,208,202,218,-76,196,217,180,226,181,-103,196,217,181,-103,184,-107,196,217,184,-107,218,-76,196,217,218,-76,208,202,184,-107,226,-107,223,-101,184,-107,223,-101,221,-94,184,-107,221,-94,219,-86,184,-107,219,-86,218,-76,180,226,159,230,163,195,180,226,163,195,170,185,180,226,170,185,174,172,180,226,174,172,176,154,180,226,176,154,176,-79,180,226,176,-79,177,-89,180,226,177,-89,179,-97,180,226,179,-97,181,-103,176,154,176,-64,176,-79,45,173,46,156,56,228,45,173,56,228,44,225,45,173,44,225,44,184,44,225,33,216,36,194,159,230,153,201,163,195,
-234,166,233,198,230,228,226,254,220,277,211,296,199,313,185,325,169,334,150,340,126,342,87,333,55,310,32,273,18,226,13,170,14,144,15,120,18,100,23,81,28,64,40,41,55,21,74,7,96,-1,122,-4,161,3,192,27,215,63,229,110,234,166,16383,16383,59,177,59,193,62,247,70,285,83,310,99,324,119,328,150,318,171,292,182,256,188,216,189,177,16383,16383,189,158,187,109,180,67,168,36,151,16,128,9,98,18,78,42,67,77,61,118,59,161,189,161,126,54,120,43,115,36,110,31,105,29,99,28,95,29,91,33,90,36,89,40,89,228,88,230,72,224,57,219,41,214,26,208,10,204,10,195,15,196,37,196,42,193,45,188,47,181,47,39,48,26,51,14,57,4,65,-2,77,-4,92,-1,105,7,116,20,126,35,133,50,252,0,252,7,239,10,228,13,219,19,209,27,199,39,113,140,131,158,147,172,161,181,174,185,188,187,194,186,201,185,207,183,213,182,220,181,227,182,233,185,239,189,243,196,245,206,
+234,166,233,198,230,228,226,254,220,277,211,296,199,313,185,325,169,334,150,340,126,342,87,333,55,310,32,273,18,226,13,170,14,144,15,120,18,100,23,81,28,64,40,41,55,21,74,7,96,-1,122,-4,161,3,192,27,215,63,229,110,234,166,16383,16383,59,177,59,193,62,247,70,285,83,310,99,324,119,328,150,318,171,292,182,256,188,216,189,177,16383,16383,189,158,187,109,180,67,168,36,151,16,128,9,98,18,78,42,67,77,61,118,59,161,189,161,
 150,340,126,342,150,318,150,318,126,342,119,328,99,324,119,328,126,342,99,324,126,342,87,333,230,228,226,254,229,110,230,228,229,110,234,166,230,228,234,166,233,198,220,277,211,296,215,63,220,277,215,63,229,110,220,277,229,110,226,254,23,81,28,64,32,273,32,273,28,64,40,41,32,273,40,41,55,310,55,310,40,41,55,21,55,310,55,21,59,193,59,193,55,21,59,161,59,193,59,161,59,177,59,177,59,161,189,177,189,177,59,161,189,161,189,177,189,161,192,27,189,177,192,27,199,313,199,313,192,27,215,63,199,313,215,63,211,296,171,292,182,256,185,325,185,325,182,256,188,216,185,325,188,216,199,313,199,313,188,216,189,177,169,334,150,340,150,318,169,334,150,318,171,292,169,334,171,292,185,325,187,109,180,67,192,27,192,27,180,67,168,36,192,27,168,36,161,3,161,3,168,36,151,16,161,3,151,16,128,9,128,9,98,18,122,-4,122,-4,98,18,96,-1,78,42,67,77,74,7,78,42,74,7,96,-1,78,42,96,-1,98,18,59,161,55,21,61,118,61,118,55,21,74,7,61,118,74,7,67,77,189,158,187,109,192,27,189,158,192,27,189,161,128,9,122,-4,161,3,59,193,62,247,55,310,55,310,62,247,70,285,55,310,70,285,87,333,87,333,70,285,83,310,87,333,83,310,99,324,14,144,15,120,18,226,18,226,15,120,18,100,18,226,18,100,32,273,32,273,18,100,23,81,14,144,18,226,13,170,
-126,54,120,43,115,36,110,31,105,29,99,28,95,29,91,33,90,36,89,40,89,228,88,230,72,224,57,219,41,214,26,208,10,204,10,195,15,196,37,196,42,193,45,188,47,181,47,39,48,26,51,14,57,4,65,-2,77,-4,92,-1,105,7,116,20,126,35,133,50,252,0,252,7,239,10,228,13,219,19,209,27,199,39,113,140,131,158,147,172,161,181,174,185,188,187,194,186,201,185,207,183,213,182,220,181,227,182,233,185,239,189,243,196,245,206,244,214,240,220,234,225,226,229,215,230,202,228,184,222,160,205,127,176,83,129,83,229,
+126,54,120,43,115,36,110,31,105,29,99,28,95,29,91,33,90,36,89,40,89,228,88,230,72,224,57,219,41,214,26,208,10,204,10,195,15,196,37,196,42,193,45,188,47,181,47,39,48,26,51,14,57,4,65,-2,77,-4,92,-1,105,7,116,20,126,35,133,50,
 45,188,57,219,42,193,42,193,57,219,41,214,42,193,41,214,37,196,37,196,41,214,31,196,28,196,31,196,41,214,28,196,41,214,26,208,57,4,65,-2,72,224,72,224,65,-2,77,-4,72,224,77,-4,88,230,88,230,77,-4,89,40,88,230,89,40,89,228,91,33,92,-1,93,31,93,31,92,-1,105,7,93,31,105,7,95,29,95,29,105,7,99,28,105,29,99,28,105,7,105,29,105,7,116,20,133,50,126,54,126,35,126,35,126,54,120,43,126,35,120,43,116,20,116,20,120,43,115,36,116,20,115,36,110,31,92,-1,91,33,90,36,92,-1,90,36,89,40,92,-1,89,40,77,-4,57,219,45,188,47,181,57,219,47,181,47,172,57,219,47,172,48,26,57,219,48,26,51,14,57,219,51,14,57,4,57,219,57,4,72,224,47,172,47,39,48,26,26,208,10,204,15,196,26,208,15,196,20,196,26,208,20,196,24,196,26,208,24,196,28,196,15,196,10,204,10,195,105,29,116,20,110,31,
-252,0,252,7,239,10,228,13,219,19,209,27,199,39,113,140,131,158,147,172,161,181,174,185,188,187,194,186,201,185,207,183,213,182,220,181,227,182,233,185,239,189,243,196,245,206,244,214,240,220,234,225,226,229,215,230,202,228,184,222,160,205,127,176,83,129,83,229,81,230,70,226,48,220,35,216,18,212,3,208,3,200,10,200,14,201,20,201,28,200,34,197,38,192,40,183,41,171,41,0,83,0,83,113,148,34,151,30,155,24,156,22,156,20,155,15,153,12,149,9,144,8,137,7,133,7,133,0,238,69,235,53,229,42,222,35,215,31,209,30,200,32,193,38,186,47,181,58,176,71,121,266,113,292,104,313,95,329,83,338,68,342,51,337,39,325,32,308,28,288,26,268,34,268,38,284,43,295,49,302,56,305,64,306,74,304,83,296,92,283,100,267,107,248,113,225,6,0,56,0,128,177,164,45,169,29,176,15,184,4,193,-2,204,-5,219,-1,230,8,239,24,244,45,246,69,251,53,244,42,239,35,234,31,230,29,224,28,221,29,218,31,216,36,215,45,214,56,214,225,172,225,172,59,171,53,169,48,
+252,0,252,7,239,10,228,13,219,19,209,27,199,39,113,140,131,158,147,172,161,181,174,185,188,187,194,186,201,185,207,183,213,182,220,181,227,182,233,185,239,189,243,196,245,206,244,214,240,220,234,225,226,229,215,230,202,228,184,222,160,205,127,176,83,129,83,229,81,230,70,226,48,220,35,216,18,212,3,208,3,200,10,200,14,201,20,201,28,200,34,197,38,192,40,183,41,171,41,0,83,0,83,113,148,34,151,30,155,24,156,22,156,20,155,15,153,12,149,9,144,8,137,7,133,7,133,0,
 10,200,14,201,18,212,18,212,14,201,17,201,18,212,17,201,20,201,20,201,28,200,35,216,35,216,28,200,34,197,35,216,34,197,38,192,7,200,10,200,18,212,7,200,18,212,3,208,7,200,3,208,3,200,35,216,38,192,48,220,48,220,38,192,40,183,48,220,40,183,41,171,83,0,41,171,41,0,35,216,18,212,20,201,83,129,83,229,81,230,83,129,81,230,83,0,83,129,83,0,83,113,83,129,83,113,127,176,131,158,147,172,160,205,160,205,147,172,161,181,160,205,161,181,184,222,184,222,161,181,174,185,184,222,174,185,188,187,188,187,194,186,202,228,202,228,194,186,201,185,202,228,201,185,207,183,127,176,83,113,113,140,127,176,113,140,131,158,127,176,131,158,160,205,83,0,81,230,70,226,83,0,70,226,59,223,83,0,59,223,48,220,83,0,48,220,41,171,227,182,233,185,234,225,234,225,233,185,239,189,234,225,239,189,240,220,240,220,239,189,243,196,240,220,243,196,244,214,244,214,243,196,245,206,207,183,213,182,215,230,215,230,213,182,220,181,215,230,220,181,226,229,226,229,220,181,227,182,226,229,227,182,234,225,202,228,184,222,188,187,153,12,149,9,252,0,252,0,149,9,144,8,252,0,144,8,137,7,156,20,252,0,228,13,156,20,228,13,219,19,156,20,219,19,209,27,156,20,209,27,199,39,156,20,199,39,156,22,199,39,113,140,148,34,199,39,148,34,151,30,199,39,151,30,153,27,199,39,153,27,155,24,199,39,155,24,156,22,239,10,228,13,252,0,239,10,252,0,252,7,155,15,153,12,252,0,155,15,252,0,156,20,133,7,133,0,252,0,133,7,252,0,137,7,148,34,113,140,83,113,202,228,207,183,215,230,
-238,69,235,53,229,42,222,35,215,31,209,30,200,32,193,38,186,47,181,58,176,71,121,266,113,292,104,313,95,329,83,338,68,342,51,337,39,325,32,308,28,288,26,268,34,268,38,284,43,295,49,302,56,305,64,306,74,304,83,296,92,283,100,267,107,248,113,225,6,0,56,0,128,177,164,45,169,29,176,15,184,4,193,-2,204,-5,219,-1,230,8,239,24,244,45,246,69,251,53,244,42,239,35,234,31,230,29,224,28,221,29,218,31,216,36,215,45,214,56,214,225,172,225,172,59,171,53,169,48,166,44,161,40,153,33,144,29,136,26,128,24,121,24,108,26,96,32,87,41,80,53,78,69,78,225,36,225,36,-65,35,-75,34,-84,32,-93,30,-101,27,-107,69,-107,71,-102,73,-94,75,-85,76,-75,76,9,78,9,81,4,87,0,93,-2,101,-4,109,-4,
+238,69,235,53,229,42,222,35,215,31,209,30,200,32,193,38,186,47,181,58,176,71,121,266,113,292,104,313,95,329,83,338,68,342,51,337,39,325,32,308,28,288,26,268,34,268,38,284,43,295,49,302,56,305,64,306,74,304,83,296,92,283,100,267,107,248,113,225,6,0,56,0,128,177,164,45,169,29,176,15,184,4,193,-2,204,-5,219,-1,230,8,239,24,244,45,246,69,
 56,305,64,306,64,306,68,342,64,306,74,304,68,342,74,304,83,338,83,338,74,304,83,296,83,338,83,296,95,329,95,329,83,296,92,283,95,329,92,283,100,267,113,292,107,248,113,225,113,292,113,225,121,266,121,266,113,225,128,177,121,266,128,177,176,71,176,71,128,177,164,45,176,71,164,45,169,29,104,313,95,329,100,267,104,313,100,267,107,248,104,313,107,248,113,292,176,71,169,29,176,15,176,71,176,15,184,4,113,225,6,0,56,0,113,225,56,0,128,177,200,32,193,38,193,-2,193,-2,193,38,186,47,193,-2,186,47,184,4,184,4,186,47,181,58,184,4,181,58,176,71,235,53,229,42,230,8,230,8,229,42,222,35,230,8,222,35,219,-1,219,-1,222,35,215,31,219,-1,215,31,209,30,209,30,200,32,204,-5,204,-5,200,32,193,-2,239,24,244,45,246,69,239,24,246,69,238,69,239,24,238,69,235,53,239,24,235,53,230,8,209,30,204,-5,219,-1,43,295,49,302,51,337,51,337,49,302,56,305,51,337,56,305,68,342,68,342,56,305,64,306,39,325,32,308,34,268,39,325,34,268,38,284,39,325,38,284,43,295,39,325,43,295,51,337,28,288,26,268,34,268,28,288,34,268,32,308,
-251,53,244,42,239,35,234,31,230,29,224,28,221,29,218,31,216,36,215,45,214,56,214,225,172,225,172,59,171,53,169,48,166,44,161,40,153,33,144,29,136,26,128,24,121,24,108,26,96,32,87,41,80,53,78,69,78,225,36,225,36,-65,35,-75,34,-84,32,-93,30,-101,27,-107,69,-107,71,-102,73,-94,75,-85,76,-75,76,9,78,9,81,4,87,0,93,-2,101,-4,109,-4,119,-3,131,0,144,7,158,19,171,36,172,36,173,23,177,12,182,3,191,-2,203,-4,217,-1,230,7,241,20,250,35,258,50,212,230,206,188,189,141,163,97,129,63,90,45,89,45,89,228,88,230,72,224,57,219,41,214,26,208,10,204,10,195,15,196,31,196,37,195,42,192,45,188,47,181,47,-6,59,-6,100,7,134,28,163,55,186,84,203,116,212,141,217,166,220,189,221,211,222,230,89,342,71,335,57,328,48,319,43,309,41,297,42,286,47,278,53,272,61,268,69,266,63,259,58,251,54,242,52,233,51,224,52,215,55,206,59,198,65,190,73,184,54,168,39,150,27,129,20,106,17,81,20,53,29,29,44,11,67,0,98,-4,
+251,53,244,42,239,35,234,31,230,29,224,28,221,29,218,31,216,36,215,45,214,56,214,225,172,225,172,59,171,53,169,48,166,44,161,40,153,33,144,29,136,26,128,24,121,24,108,26,96,32,87,41,80,53,78,69,78,225,36,225,36,-65,35,-75,34,-84,32,-93,30,-101,27,-107,69,-107,71,-102,73,-94,75,-85,76,-75,76,9,78,9,81,4,87,0,93,-2,101,-4,109,-4,119,-3,131,0,144,7,158,19,171,36,172,36,173,23,177,12,182,3,191,-2,203,-4,217,-1,230,7,241,20,250,35,258,50,
 78,225,36,225,69,-107,78,225,69,-107,71,-102,78,225,71,-102,73,-94,78,225,73,-94,75,-85,78,225,75,-85,76,-75,78,225,76,-75,76,9,78,225,76,9,78,9,69,-107,36,225,36,-65,69,-107,36,-65,35,-75,69,-107,35,-75,34,-84,69,-107,34,-84,32,-93,69,-107,32,-93,30,-101,69,-107,30,-101,27,-107,87,0,93,-2,96,32,96,32,93,-2,101,-4,96,32,101,-4,108,26,108,26,101,-4,109,-4,108,26,109,-4,121,24,121,24,109,-4,119,-3,121,24,119,-3,131,0,171,53,169,48,171,36,171,36,169,48,166,44,171,36,166,44,161,40,161,40,153,33,158,19,158,19,153,33,144,29,158,19,144,29,144,7,144,7,144,29,136,26,144,7,136,26,131,0,131,0,136,26,128,24,131,0,128,24,121,24,87,41,80,53,81,4,87,41,81,4,87,0,87,41,87,0,96,32,81,4,80,53,78,69,81,4,78,69,78,9,214,225,172,225,173,23,173,23,172,225,172,68,173,23,172,68,172,36,172,36,172,68,172,59,172,36,172,59,171,36,171,36,172,59,171,53,161,40,158,19,171,36,214,225,173,23,177,12,214,225,177,12,182,3,214,225,182,3,191,-2,214,225,191,-2,203,-4,214,225,203,-4,214,56,244,42,239,35,241,20,241,20,239,35,234,31,241,20,234,31,230,7,230,7,234,31,230,29,230,7,230,29,224,28,224,28,221,29,230,7,230,7,221,29,218,31,230,7,218,31,217,-1,217,-1,218,31,216,36,217,-1,216,36,215,45,250,35,258,50,251,53,250,35,251,53,244,42,250,35,244,42,241,20,215,45,214,56,203,-4,215,45,203,-4,217,-1,76,9,76,-75,76,-64,
-212,230,206,188,189,141,163,97,129,63,90,45,89,45,89,228,88,230,72,224,57,219,41,214,26,208,10,204,10,195,15,196,31,196,37,195,42,192,45,188,47,181,47,-6,59,-6,100,7,134,28,163,55,186,84,203,116,212,141,217,166,220,189,221,211,222,230,89,342,71,335,57,328,48,319,43,309,41,297,42,286,47,278,53,272,61,268,69,266,63,259,58,251,54,242,52,233,51,224,52,215,55,206,59,198,65,190,73,184,54,168,39,150,27,129,20,106,17,81,20,53,29,29,44,11,67,0,98,-4,107,-4,117,-2,
+212,230,206,188,189,141,163,97,129,63,90,45,89,45,89,228,88,230,72,224,57,219,41,214,26,208,10,204,10,195,15,196,31,196,37,195,42,192,45,188,47,181,47,-6,59,-6,100,7,134,28,163,55,186,84,203,116,212,141,217,166,220,189,221,211,222,230,
 45,188,57,219,42,192,42,192,57,219,41,214,42,192,41,214,37,195,37,195,41,214,31,196,28,196,31,196,41,214,28,196,41,214,26,208,89,228,88,230,89,45,89,45,88,230,72,224,89,45,72,224,59,-6,59,-6,72,224,57,219,59,-6,57,219,47,172,47,172,57,219,47,181,26,208,10,204,15,196,26,208,15,196,20,196,26,208,20,196,25,196,26,208,25,196,28,196,186,84,189,141,163,55,163,55,189,141,163,97,163,55,163,97,134,28,134,28,163,97,129,63,134,28,129,63,100,7,100,7,129,63,90,45,189,141,203,116,206,188,206,188,203,116,212,141,206,188,212,141,212,230,212,230,212,141,217,166,212,230,217,166,222,230,222,230,217,166,220,189,222,230,220,189,221,211,89,45,59,-6,100,7,89,45,100,7,90,45,47,172,47,-6,59,-6,15,196,10,204,10,195,189,141,186,84,203,116,57,219,45,188,47,181,
-89,342,71,335,57,328,48,319,43,309,41,297,42,286,47,278,53,272,61,268,69,266,63,259,58,251,54,242,52,233,51,224,52,215,55,206,59,198,65,190,73,184,54,168,39,150,27,129,20,106,17,81,20,53,29,29,44,11,67,0,98,-4,107,-4,117,-2,128,-1,137,0,143,0,158,-1,170,-5,180,-12,186,-22,188,-34,186,-47,180,-59,170,-67,159,-72,147,-74,140,-72,134,-69,128,-64,123,-61,117,-59,110,-60,104,-63,99,-68,97,-73,96,-80,98,-90,103,-98,111,-103,121,-107,132,-108,151,-104,170,-93,187,-76,199,-53,204,-26,201,-3,192,15,177,29,156,38,128,41,118,41,111,40,98,40,79,42,63,48,51,59,43,75,40,98,43,118,50,136,62,152,77,164,94,174,102,172,110,171,117,170,142,170,157,173,171,178,181,186,185,197,184,204,179,210,172,214,164,216,153,217,140,216,127,213,113,208,101,202,89,194,83,199,78,204,74,211,72,218,71,225,73,235,77,243,83,251,93,256,106,258,126,260,144,264,160,271,171,280,175,291,174,297,171,301,166,305,160,307,151,307,139,306,125,303,111,297,96,290,83,281,76,283,70,286,66,291,64,297,63,305,64,310,66,316,72,322,80,328,93,334,237,114,232,151,218,183,197,208,167,224,129,230,91,223,60,203,37,174,22,139,17,101,23,67,38,38,62,15,92,0,126,-4,161,2,191,20,215,47,231,79,237,114,16383,16383,192,95,190,74,183,52,172,31,156,17,134,11,107,19,87,38,73,65,65,95,62,122,64,145,70,169,80,191,97,207,119,214,148,205,168,184,182,155,190,124,192,95,233,69,229,55,223,45,216,40,209,37,203,36,194,38,188,41,184,47,180,54,178,61,177,69,176,78,175,88,175,109,176,127,176,144,178,160,179,173,180,183,239,183,239,225,97,225,68,222,46,214,29,200,16,180,4,155,12,155,23,167,35,176,47,180,62,183,78,183,72,119,64,77,54,54,42,42,30,36,26,35,20,31,18,25,20,15,23,6,30,0,39,-5,52,-6,77,9,91,48,98,99,100,148,100,183,147,183,145,160,143,136,139,82,139,56,141,37,147,20,156,7,169,-1,185,-4,205,0,220,12,232,29,239,49,241,69,36,-65,35,-75,34,-84,32,-93,30,-101,27,-107,70,-107,72,-102,74,-95,76,-85,77,-75,78,-64,78,15,88,7,98,1,108,-2,118,-4,130,-4,164,1,192,19,214,47,228,82,233,123,228,158,214,188,191,210,163,225,
+89,342,71,335,57,328,48,319,43,309,41,297,42,286,47,278,53,272,61,268,69,266,63,259,58,251,54,242,52,233,51,224,52,215,55,206,59,198,65,190,73,184,54,168,39,150,27,129,20,106,17,81,20,53,29,29,44,11,67,0,98,-4,107,-4,117,-2,128,-1,137,0,143,0,158,-1,170,-5,180,-12,186,-22,188,-34,186,-47,180,-59,170,-67,159,-72,147,-74,140,-72,134,-69,128,-64,123,-61,117,-59,110,-60,104,-63,99,-68,97,-73,96,-80,98,-90,103,-98,111,-103,121,-107,132,-108,151,-104,170,-93,187,-76,199,-53,204,-26,201,-3,192,15,177,29,156,38,128,41,118,41,111,40,98,40,79,42,63,48,51,59,43,75,40,98,43,118,50,136,62,152,77,164,94,174,102,172,110,171,117,170,142,170,157,173,171,178,181,186,185,197,184,204,179,210,172,214,164,216,153,217,140,216,127,213,113,208,101,202,89,194,83,199,78,204,74,211,72,218,71,225,73,235,77,243,83,251,93,256,106,258,126,260,144,264,160,271,171,280,175,291,174,297,171,301,166,305,160,307,151,307,139,306,125,303,111,297,96,290,83,281,76,283,70,286,66,291,64,297,63,305,64,310,66,316,72,322,80,328,93,334,
 51,59,43,75,44,11,44,11,43,75,40,98,39,150,40,98,43,118,39,150,43,118,54,168,54,168,43,118,50,136,54,168,50,136,62,152,61,268,63,305,57,328,61,268,57,328,53,272,53,272,57,328,48,319,53,272,48,319,47,278,47,278,48,319,43,309,47,278,43,309,42,286,42,286,43,309,41,297,64,310,66,316,71,335,71,335,66,316,72,322,71,335,72,322,89,342,89,342,72,322,80,328,89,342,80,328,93,334,64,310,71,335,57,328,64,310,57,328,63,305,73,235,76,283,71,225,71,225,70,286,69,266,69,266,70,286,66,291,69,266,66,291,64,297,83,281,76,283,77,243,83,281,77,243,83,251,83,281,83,251,96,290,72,218,73,184,74,211,74,211,73,184,77,164,74,211,77,164,78,204,78,204,77,164,94,174,78,204,94,174,83,199,83,199,94,174,89,194,101,202,94,174,102,172,101,202,102,172,113,208,113,208,102,172,110,171,113,208,110,171,117,170,73,184,54,168,62,152,73,184,62,152,77,164,73,184,72,218,71,225,73,184,71,225,69,266,73,184,69,266,65,190,52,233,52,215,54,242,54,242,52,215,55,206,54,242,55,206,58,251,58,251,55,206,59,198,58,251,59,198,63,259,63,259,59,198,65,190,63,259,65,190,69,266,64,297,63,305,61,268,64,297,61,268,69,266,128,41,124,41,128,-1,128,-1,124,41,118,41,128,-1,118,41,117,-2,117,-2,118,41,111,40,117,-2,111,40,107,-4,107,-4,111,40,104,40,107,-4,104,40,98,-4,98,-4,104,40,98,40,177,29,156,38,158,-1,158,-1,156,38,143,0,137,0,143,0,156,38,137,0,156,38,128,41,128,-64,132,-108,134,-69,134,-69,132,-108,151,-104,134,-69,151,-104,140,-72,140,-72,151,-104,147,-74,159,-72,147,-74,151,-104,159,-72,151,-104,170,-93,204,-26,201,-3,199,-53,199,-53,201,-3,192,15,199,-53,192,15,188,-34,188,-34,187,-76,199,-53,158,-1,170,-5,177,29,177,29,170,-5,180,-12,177,29,180,-12,192,15,192,15,180,-12,186,-22,192,15,186,-22,188,-34,188,-34,186,-47,187,-76,187,-76,186,-47,180,-59,187,-76,180,-59,170,-93,170,-93,180,-59,170,-67,170,-93,170,-67,159,-72,110,-60,111,-103,117,-59,117,-59,111,-103,121,-107,117,-59,121,-107,123,-61,123,-61,121,-107,132,-108,123,-61,132,-108,128,-64,97,-73,98,-90,99,-68,99,-68,98,-90,103,-98,99,-68,103,-98,104,-63,104,-63,103,-98,111,-103,104,-63,111,-103,110,-60,181,186,185,197,184,204,181,186,184,204,179,210,181,186,179,210,172,214,181,186,172,214,171,178,117,170,124,170,127,213,127,213,124,170,131,170,127,213,131,170,140,216,140,216,131,170,142,170,140,216,142,170,153,217,153,217,142,170,157,173,153,217,157,173,164,216,164,216,157,173,171,178,164,216,171,178,172,214,160,307,160,271,166,305,166,305,160,271,171,280,166,305,171,280,171,301,171,301,171,280,175,291,171,301,175,291,174,297,125,303,126,260,139,306,139,306,126,260,144,264,139,306,144,264,151,307,151,307,144,264,160,271,151,307,160,271,160,307,83,251,93,256,96,290,96,290,93,256,106,258,96,290,106,258,111,297,111,297,106,258,126,260,111,297,126,260,125,303,79,42,63,48,67,0,79,42,67,0,98,-4,79,42,98,-4,98,40,51,59,44,11,67,0,51,59,67,0,63,48,29,29,44,11,40,98,29,29,40,98,39,150,29,29,39,150,27,129,29,29,27,129,20,53,20,106,17,81,20,53,20,106,20,53,27,129,113,208,117,170,127,213,98,-90,97,-73,96,-80,128,41,128,-1,137,0,52,215,52,233,51,224,94,174,101,202,89,194,70,286,71,225,76,283,76,283,73,235,77,243,
-237,114,232,151,218,183,197,208,167,224,129,230,91,223,60,203,37,174,22,139,17,101,23,67,38,38,62,15,92,0,126,-4,161,2,191,20,215,47,231,79,237,114,16383,16383,192,95,190,74,183,52,172,31,156,17,134,11,107,19,87,38,73,65,65,95,62,122,64,145,70,169,80,191,97,207,119,214,148,205,168,184,182,155,190,124,192,95,233,69,229,55,223,45,216,40,209,37,203,36,194,38,188,41,184,47,180,54,178,61,177,69,176,78,175,88,175,109,176,127,176,144,178,160,179,173,180,183,239,183,239,225,97,225,68,222,46,214,29,200,16,180,4,155,12,155,23,167,35,176,47,180,62,183,78,183,72,119,64,77,54,54,42,42,30,36,26,35,20,31,18,25,20,15,
+237,114,232,151,218,183,197,208,167,224,129,230,91,223,60,203,37,174,22,139,17,101,23,67,38,38,62,15,92,0,126,-4,161,2,191,20,215,47,231,79,237,114,16383,16383,192,95,190,74,183,52,172,31,156,17,134,11,107,19,87,38,73,65,65,95,62,122,64,145,70,169,80,191,97,207,119,214,148,205,168,184,182,155,190,124,192,95,
 97,207,119,214,119,214,129,230,119,214,148,205,129,230,148,205,167,224,167,224,148,205,168,184,167,224,168,184,197,208,197,208,168,184,182,155,197,208,182,155,190,124,190,74,183,52,191,20,191,20,183,52,172,31,191,20,172,31,161,2,161,2,172,31,156,17,161,2,156,17,134,11,134,11,107,19,126,-4,126,-4,107,19,92,0,107,19,87,38,92,0,92,0,87,38,73,65,92,0,73,65,62,15,62,15,73,65,65,95,62,15,65,95,62,122,80,191,91,223,70,169,70,169,91,223,60,203,70,169,60,203,64,145,64,145,60,203,62,122,62,15,62,122,60,203,62,15,60,203,38,38,38,38,60,203,37,174,38,38,37,174,23,67,23,67,37,174,22,139,23,67,22,139,17,101,237,114,232,151,231,79,231,79,232,151,218,183,231,79,218,183,215,47,215,47,218,183,197,208,215,47,197,208,192,95,192,95,191,20,215,47,134,11,126,-4,161,2,97,207,119,214,129,230,97,207,129,230,91,223,97,207,91,223,80,191,190,74,191,20,192,95,197,208,190,124,192,95,
-233,69,229,55,223,45,216,40,209,37,203,36,194,38,188,41,184,47,180,54,178,61,177,69,176,78,175,88,175,109,176,127,176,144,178,160,179,173,180,183,239,183,239,225,97,225,68,222,46,214,29,200,16,180,4,155,12,155,23,167,35,176,47,180,62,183,78,183,72,119,64,77,54,54,42,42,30,36,26,35,20,31,18,25,20,15,23,6,30,0,39,-5,52,-6,77,9,91,48,98,99,100,148,100,183,147,183,145,160,143,136,139,82,139,56,141,37,147,20,156,7,169,-1,185,-4,205,0,220,12,232,29,239,49,241,69,36,-65,35,-75,34,-84,32,-93,30,-101,27,-107,70,-107,72,-102,74,-95,76,-85,77,-75,78,-64,78,15,88,7,98,1,108,-2,118,-4,130,-4,164,1,192,19,214,47,228,82,233,123,228,158,214,188,191,210,163,225,129,230,101,225,75,210,54,182,41,138,36,76,16383,16383,78,137,79,163,85,185,94,202,107,212,123,216,145,211,163,197,177,175,186,144,190,106,187,75,179,49,166,29,150,16,129,11,115,13,101,18,89,26,81,35,78,44,216,176,213,191,205,206,190,218,169,227,142,230,107,223,73,202,45,171,25,130,17,83,21,45,
+233,69,229,55,223,45,216,40,209,37,203,36,194,38,188,41,184,47,180,54,178,61,177,69,176,78,175,88,175,109,176,127,176,144,178,160,179,173,180,183,239,183,239,225,97,225,68,222,46,214,29,200,16,180,4,155,12,155,23,167,35,176,47,180,62,183,78,183,72,119,64,77,54,54,42,42,30,36,26,35,20,31,18,25,20,15,23,6,30,0,39,-5,52,-6,77,9,91,48,98,99,100,148,100,183,147,183,145,160,143,136,139,82,139,56,141,37,147,20,156,7,169,-1,185,-4,205,0,220,12,232,29,239,49,241,69,
 72,119,64,77,77,9,77,9,64,77,54,54,77,9,54,54,52,-6,52,-6,54,54,42,42,52,-6,42,42,39,-5,39,-5,42,42,30,36,39,-5,30,36,30,0,30,0,30,36,26,35,30,0,26,35,23,6,23,6,26,35,23,33,23,6,23,33,20,31,20,15,23,6,20,31,20,15,20,31,19,28,20,15,19,28,18,25,97,225,68,222,78,183,78,183,91,48,97,225,97,225,91,48,98,99,97,225,98,99,100,183,100,183,98,99,100,148,180,183,239,183,239,225,180,183,239,225,147,183,147,183,239,225,100,183,176,78,175,88,169,-1,169,-1,175,88,175,99,169,-1,175,99,175,109,175,109,176,127,169,-1,169,-1,176,127,176,144,169,-1,176,144,156,7,156,7,176,144,178,160,156,7,178,160,179,173,147,20,180,183,147,183,147,20,147,183,145,160,179,173,180,183,147,20,179,173,147,20,156,7,97,225,100,183,239,225,4,155,12,155,16,180,16,180,12,155,23,167,16,180,23,167,29,200,29,200,23,167,35,176,29,200,35,176,46,214,46,214,35,176,47,180,46,214,47,180,68,222,68,222,47,180,62,183,68,222,62,183,78,183,188,41,184,47,185,-4,185,-4,184,47,180,54,185,-4,180,54,178,61,178,61,177,69,185,-4,185,-4,177,69,169,-1,188,41,205,0,194,38,194,38,205,0,203,36,209,37,203,36,205,0,209,37,205,0,220,12,233,69,229,55,232,29,233,69,232,29,239,49,233,69,239,49,241,69,223,45,216,40,220,12,223,45,220,12,232,29,223,45,232,29,229,55,143,136,141,109,141,37,143,136,141,37,147,20,143,136,147,20,145,160,139,82,139,56,141,37,139,82,141,37,141,109,78,183,72,119,77,9,78,183,77,9,91,48,176,78,169,-1,177,69,188,41,185,-4,205,0,209,37,220,12,216,40,
-36,-65,35,-75,34,-84,32,-93,30,-101,27,-107,70,-107,72,-102,74,-95,76,-85,77,-75,78,-64,78,15,88,7,98,1,108,-2,118,-4,130,-4,164,1,192,19,214,47,228,82,233,123,228,158,214,188,191,210,163,225,129,230,101,225,75,210,54,182,41,138,36,76,16383,16383,78,137,79,163,85,185,94,202,107,212,123,216,145,211,163,197,177,175,186,144,190,106,187,75,179,49,166,29,150,16,129,11,115,13,101,18,89,26,81,35,78,44,216,176,213,191,205,206,190,218,169,227,142,230,107,223,73,202,45,171,25,130,17,83,21,45,33,20,50,5,71,-2,95,-4,105,-4,117,-2,128,-1,137,0,143,0,158,-1,170,-5,180,-12,186,-22,188,-34,186,-47,180,-58,170,-67,159,-72,147,-74,140,-72,134,-69,128,-64,123,-61,117,-59,110,-60,104,-63,99,-68,97,-73,96,-80,98,-90,103,-98,111,-103,121,-107,132,-108,151,-104,170,-93,187,-76,199,-55,204,-29,201,-3,192,16,177,30,156,38,
+36,-65,35,-75,34,-84,32,-93,30,-101,27,-107,70,-107,72,-102,74,-95,76,-85,77,-75,78,-64,78,15,88,7,98,1,108,-2,118,-4,130,-4,164,1,192,19,214,47,228,82,233,123,228,158,214,188,191,210,163,225,129,230,101,225,75,210,54,182,41,138,36,76,16383,16383,78,137,79,163,85,185,94,202,107,212,123,216,145,211,163,197,177,175,186,144,190,106,187,75,179,49,166,29,150,16,129,11,115,13,101,18,89,26,81,35,78,44,
 107,212,123,216,123,216,129,230,123,216,145,211,129,230,145,211,163,225,163,225,145,211,163,197,163,225,163,197,191,210,191,210,163,197,177,175,191,210,177,175,186,144,191,210,190,106,192,19,191,210,192,19,214,188,214,188,192,19,214,47,214,188,214,47,228,158,228,158,214,47,228,82,228,158,228,82,233,123,192,19,190,106,187,75,192,19,187,75,179,49,192,19,179,49,166,29,192,19,166,29,164,1,129,11,130,-4,150,16,150,16,130,-4,164,1,150,16,164,1,166,29,130,-4,129,11,118,-4,118,-4,129,11,115,13,118,-4,115,13,108,-2,108,-2,115,13,101,18,108,-2,101,18,98,1,98,1,101,18,89,26,98,1,89,26,88,7,88,7,89,26,81,35,88,7,81,35,78,44,85,185,94,202,101,225,101,225,94,202,107,212,101,225,107,212,129,230,129,230,107,212,123,216,78,137,79,163,75,210,78,137,75,210,76,-85,78,137,76,-85,77,-75,78,137,77,-75,78,-64,75,210,79,163,85,185,75,210,85,185,101,225,75,210,54,182,70,-107,75,210,70,-107,72,-102,75,210,72,-102,74,-95,75,210,74,-95,76,-85,70,-107,54,182,41,138,70,-107,41,138,36,76,70,-107,36,76,36,-65,70,-107,36,-65,35,-75,70,-107,35,-75,34,-84,70,-107,34,-84,32,-93,70,-107,32,-93,30,-101,70,-107,30,-101,27,-107,78,44,78,15,88,7,191,210,186,144,190,106,
-216,176,213,191,205,206,190,218,169,227,142,230,107,223,73,202,45,171,25,130,17,83,21,45,33,20,50,5,71,-2,95,-4,105,-4,117,-2,128,-1,137,0,143,0,158,-1,170,-5,180,-12,186,-22,188,-34,186,-47,180,-58,170,-67,159,-72,147,-74,140,-72,134,-69,128,-64,123,-61,117,-59,110,-60,104,-63,99,-68,97,-73,96,-80,98,-90,103,-98,111,-103,121,-107,132,-108,151,-104,170,-93,187,-76,199,-55,204,-29,201,-3,192,16,177,30,156,38,128,41,119,41,115,40,103,40,78,45,60,54,48,68,42,85,41,105,45,135,58,158,76,174,97,183,118,186,141,182,158,174,170,163,181,155,192,151,201,153,208,157,212,163,215,169,216,176,259,183,259,225,119,225,87,220,58,207,35,184,20,151,15,108,20,73,35,42,58,18,87,1,119,-4,156,1,187,16,212,38,228,65,233,94,229,121,218,138,203,152,186,165,171,183,16383,16383,189,85,186,63,180,42,168,25,152,13,131,9,110,15,90,30,75,54,64,84,60,117,65,145,78,164,97,176,118,182,137,183,153,172,167,155,178,134,186,110,189,85,221,183,221,225,81,225,55,219,34,204,18,183,7,160,2,138,9,138,16,153,25,166,37,175,50,181,66,183,107,183,102,164,96,142,92,119,88,95,87,71,89,49,94,28,103,11,118,0,138,-4,157,0,172,10,183,27,191,48,193,71,185,71,182,59,176,49,169,42,
+216,176,213,191,205,206,190,218,169,227,142,230,107,223,73,202,45,171,25,130,17,83,21,45,33,20,50,5,71,-2,95,-4,105,-4,117,-2,128,-1,137,0,143,0,158,-1,170,-5,180,-12,186,-22,188,-34,186,-47,180,-58,170,-67,159,-72,147,-74,140,-72,134,-69,128,-64,123,-61,117,-59,110,-60,104,-63,99,-68,97,-73,96,-80,98,-90,103,-98,111,-103,121,-107,132,-108,151,-104,170,-93,187,-76,199,-55,204,-29,201,-3,192,16,177,30,156,38,128,41,119,41,115,40,103,40,78,45,60,54,48,68,42,85,41,105,45,135,58,158,76,174,97,183,118,186,141,182,158,174,170,163,181,155,192,151,201,153,208,157,212,163,215,169,216,176,
 60,54,48,68,50,5,50,5,48,68,42,85,50,5,42,85,33,20,33,20,42,85,41,105,45,171,41,105,45,135,45,171,45,135,73,202,73,202,45,135,58,158,73,202,58,158,76,174,73,202,76,174,107,223,107,223,76,174,97,183,107,223,97,183,118,186,118,186,141,182,142,230,142,230,141,182,158,174,142,230,158,174,169,227,169,227,158,174,170,163,169,227,170,163,190,218,190,218,170,163,181,155,190,218,181,155,192,151,17,83,21,45,25,130,25,130,21,45,33,20,25,130,33,20,45,171,45,171,33,20,41,105,177,30,156,38,158,-1,158,-1,156,38,143,0,137,0,143,0,156,38,137,0,156,38,128,41,128,-1,137,0,128,41,128,-1,128,41,123,41,128,-1,123,41,119,41,128,-1,119,41,117,-2,105,-4,117,-2,107,40,111,40,107,40,117,-2,111,40,117,-2,115,40,115,40,117,-2,119,41,60,54,71,-2,78,45,78,45,71,-2,95,-4,78,45,95,-4,103,40,103,40,95,-4,105,-4,103,40,105,-4,107,40,128,-64,132,-108,134,-69,134,-69,132,-108,151,-104,134,-69,151,-104,140,-72,140,-72,151,-104,147,-74,159,-72,147,-74,151,-104,159,-72,151,-104,170,-93,204,-29,201,-3,199,-55,199,-55,201,-3,192,16,199,-55,192,16,188,-34,188,-34,187,-76,199,-55,158,-1,170,-5,177,30,177,30,170,-5,180,-12,177,30,180,-12,192,16,192,16,180,-12,186,-22,192,16,186,-22,188,-34,187,-76,188,-34,186,-47,187,-76,186,-47,180,-58,187,-76,180,-58,170,-67,187,-76,170,-67,170,-93,110,-60,111,-103,117,-59,117,-59,111,-103,121,-107,117,-59,121,-107,123,-61,123,-61,121,-107,132,-108,123,-61,132,-108,128,-64,97,-73,98,-90,99,-68,99,-68,98,-90,103,-98,99,-68,103,-98,104,-63,104,-63,103,-98,111,-103,104,-63,111,-103,110,-60,213,191,205,206,208,157,213,191,208,157,212,163,213,191,212,163,215,169,213,191,215,169,216,176,205,206,190,218,192,151,205,206,192,151,201,153,205,206,201,153,208,157,142,230,107,223,118,186,98,-90,97,-73,96,-80,159,-72,170,-93,170,-67,60,54,50,5,71,-2,
-259,183,259,225,119,225,87,220,58,207,35,184,20,151,15,108,20,73,35,42,58,18,87,1,119,-4,156,1,187,16,212,38,228,65,233,94,229,121,218,138,203,152,186,165,171,183,16383,16383,189,85,186,63,180,42,168,25,152,13,131,9,110,15,90,30,75,54,64,84,60,117,65,145,78,164,97,176,118,182,137,183,153,172,167,155,178,134,186,110,189,85,221,183,221,225,81,225,55,219,34,204,18,183,7,160,2,138,9,138,16,153,25,166,37,175,50,181,66,183,107,183,102,164,96,142,92,119,88,95,87,71,89,49,94,28,103,11,118,0,138,-4,157,0,172,10,183,27,191,48,193,71,185,71,182,59,176,49,169,42,161,38,151,36,141,39,133,47,128,59,125,74,124,91,125,113,128,135,131,155,134,172,
+259,183,259,225,119,225,87,220,58,207,35,184,20,151,15,108,20,73,35,42,58,18,87,1,119,-4,156,1,187,16,212,38,228,65,233,94,229,121,218,138,203,152,186,165,171,183,16383,16383,189,85,186,63,180,42,168,25,152,13,131,9,110,15,90,30,75,54,64,84,60,117,65,145,78,164,97,176,118,182,137,183,153,172,167,155,178,134,186,110,189,85,
 186,63,180,42,187,16,187,16,180,42,168,25,187,16,168,25,156,1,156,1,168,25,152,13,156,1,152,13,131,9,131,9,110,15,119,-4,119,-4,110,15,90,30,119,-4,90,30,87,1,87,1,90,30,75,54,87,1,75,54,64,84,58,207,60,117,65,145,58,207,65,145,87,220,87,220,65,145,78,164,87,220,78,164,97,176,58,18,87,1,64,84,58,18,64,84,60,117,58,18,60,117,58,207,58,18,58,207,35,184,58,18,35,184,35,42,20,151,15,108,20,73,20,151,20,73,35,42,20,151,35,42,35,184,153,172,167,155,171,183,171,183,167,155,178,134,171,183,259,225,137,183,119,225,87,220,97,176,119,225,97,176,118,182,119,225,118,182,137,183,119,225,137,183,259,225,137,183,153,172,171,183,233,94,229,121,228,65,228,65,229,121,218,138,228,65,218,138,212,38,212,38,218,138,203,152,212,38,203,152,189,85,189,85,203,152,186,165,189,85,186,165,186,110,186,165,171,183,178,134,186,165,178,134,186,110,189,85,187,16,212,38,131,9,119,-4,156,1,186,63,187,16,189,85,259,225,171,183,259,183,
-221,183,221,225,81,225,55,219,34,204,18,183,7,160,2,138,9,138,16,153,25,166,37,175,50,181,66,183,107,183,102,164,96,142,92,119,88,95,87,71,89,49,94,28,103,11,118,0,138,-4,157,0,172,10,183,27,191,48,193,71,185,71,182,59,176,49,169,42,161,38,151,36,141,39,133,47,128,59,125,74,124,91,125,113,128,135,131,155,134,172,136,183,127,230,127,220,139,218,149,214,159,209,168,201,177,191,186,176,193,159,198,141,201,122,202,104,200,75,193,49,182,28,165,14,142,9,121,14,106,28,97,47,92,68,91,87,91,193,90,205,86,215,80,222,71,226,60,228,47,225,36,216,26,203,16,188,8,172,15,170,18,176,28,188,33,193,39,194,43,192,46,187,48,180,49,170,49,99,51,66,60,38,76,15,
+221,183,221,225,81,225,55,219,34,204,18,183,7,160,2,138,9,138,16,153,25,166,37,175,50,181,66,183,107,183,102,164,96,142,92,119,88,95,87,71,89,49,94,28,103,11,118,0,138,-4,157,0,172,10,183,27,191,48,193,71,185,71,182,59,176,49,169,42,161,38,151,36,141,39,133,47,128,59,125,74,124,91,125,113,128,135,131,155,134,172,136,183,
 9,138,16,153,18,183,18,183,16,153,25,166,18,183,25,166,34,204,34,204,25,166,37,175,34,204,37,175,55,219,55,219,37,175,50,181,55,219,50,181,66,183,81,225,66,183,107,183,81,225,107,183,221,225,221,225,107,183,136,183,221,225,136,183,221,183,7,160,2,138,9,138,7,160,9,138,18,183,118,0,125,74,124,91,124,91,125,113,118,0,118,0,125,113,107,183,118,0,107,183,103,11,103,11,107,183,102,164,103,11,102,164,96,142,128,135,131,155,107,183,107,183,131,155,134,172,107,183,134,172,136,183,138,-4,157,0,141,39,141,39,157,0,151,36,161,38,151,36,157,0,161,38,157,0,172,10,185,71,182,59,183,27,185,71,183,27,191,48,185,71,191,48,193,71,176,49,169,42,172,10,176,49,172,10,183,27,176,49,183,27,182,59,138,-4,141,39,133,47,138,-4,133,47,128,59,138,-4,128,59,125,74,138,-4,125,74,118,0,103,11,96,142,94,28,94,28,96,142,92,119,94,28,92,119,89,49,89,49,92,119,88,95,89,49,88,95,87,71,161,38,172,10,169,42,66,183,81,225,55,219,128,135,107,183,125,113,
-127,230,127,220,139,218,149,214,159,209,168,201,177,191,186,176,193,159,198,141,201,122,202,104,200,75,193,49,182,28,165,14,142,9,121,14,106,28,97,47,92,68,91,87,91,193,90,205,86,215,80,222,71,226,60,228,47,225,36,216,26,203,16,188,8,172,15,170,18,176,28,188,33,193,39,194,43,192,46,187,48,180,49,170,49,99,51,66,60,38,76,15,102,0,139,-4,174,1,204,18,227,43,242,75,247,113,241,155,226,188,202,211,173,225,141,230,134,9,124,10,114,13,104,18,94,25,86,34,76,52,68,72,63,94,61,116,60,137,63,166,73,189,88,206,109,216,134,221,134,228,132,229,129,229,126,230,121,230,84,224,54,207,33,181,19,150,15,114,19,78,33,46,55,20,85,3,123,-3,134,-4,134,-107,176,-107,176,-4,220,1,254,18,277,43,292,75,296,111,291,151,278,184,258,209,233,224,207,230,195,229,184,226,175,221,167,215,160,208,148,187,141,162,137,134,135,105,134,76,16383,16383,176,9,176,129,
+127,230,127,220,139,218,149,214,159,209,168,201,177,191,186,176,193,159,198,141,201,122,202,104,200,75,193,49,182,28,165,14,142,9,121,14,106,28,97,47,92,68,91,87,91,193,90,205,86,215,80,222,71,226,60,228,47,225,36,216,26,203,16,188,8,172,15,170,18,176,28,188,33,193,39,194,43,192,46,187,48,180,49,170,49,99,51,66,60,38,76,15,102,0,139,-4,174,1,204,18,227,43,242,75,247,113,241,155,226,188,202,211,173,225,141,230,
 18,176,23,182,26,203,26,203,23,182,28,188,26,203,28,188,36,216,36,216,28,188,33,193,36,216,33,193,39,194,39,194,43,192,47,225,47,225,43,192,46,187,47,225,46,187,48,180,16,188,8,172,15,170,16,188,15,170,18,176,16,188,18,176,26,203,49,99,51,66,49,159,49,170,49,159,60,228,49,170,60,228,48,180,48,180,60,228,47,225,91,87,91,193,90,205,91,87,90,205,86,215,91,87,86,215,80,222,91,87,80,222,92,68,141,230,127,230,139,218,141,230,139,218,149,214,141,230,149,214,173,225,200,75,193,49,204,18,204,18,193,49,182,28,204,18,182,28,174,1,174,1,182,28,165,14,174,1,165,14,142,9,142,9,121,14,139,-4,139,-4,121,14,106,28,139,-4,106,28,102,0,102,0,106,28,97,47,102,0,97,47,92,68,76,15,102,0,92,68,76,15,92,68,80,222,76,15,80,222,71,226,76,15,71,226,60,228,76,15,60,228,60,38,60,228,49,159,51,66,60,228,51,66,60,38,47,225,36,216,39,194,149,214,159,209,173,225,173,225,159,209,168,201,173,225,168,201,177,191,177,191,186,176,202,211,202,211,186,176,193,159,202,211,193,159,198,141,202,211,202,104,204,18,202,211,204,18,226,188,226,188,204,18,227,43,226,188,227,43,241,155,241,155,227,43,242,75,241,155,242,75,247,113,202,211,198,141,201,122,202,211,201,122,202,104,202,211,173,225,177,191,142,9,139,-4,174,1,200,75,204,18,202,104,139,218,127,230,127,220,
-134,9,124,10,114,13,104,18,94,25,86,34,76,52,68,72,63,94,61,116,60,137,63,166,73,189,88,206,109,216,134,221,134,228,132,229,129,229,126,230,121,230,84,224,54,207,33,181,19,150,15,114,19,78,33,46,55,20,85,3,123,-3,134,-4,134,-107,176,-107,176,-4,220,1,254,18,277,43,292,75,296,111,291,151,278,184,258,209,233,224,207,230,195,229,184,226,175,221,167,215,160,208,148,187,141,162,137,134,135,105,134,76,16383,16383,176,9,176,129,177,155,178,179,182,198,189,211,201,216,218,209,232,190,243,164,249,134,252,103,250,74,243,49,231,28,214,14,191,9,243,225,194,225,123,93,113,139,103,177,92,206,79,224,63,230,49,227,38,217,31,202,27,182,26,156,34,156,37,171,41,182,46,190,51,194,56,195,67,192,77,183,85,168,93,147,101,119,110,78,6,-104,55,-104,126,26,136,-34,141,-57,148,-78,157,-94,168,-105,182,-109,198,-104,209,-90,216,-71,219,-52,220,-34,213,-34,210,-49,206,-61,201,-68,195,-72,187,-74,188,-74,177,-71,168,-63,160,-48,153,-27,147,1,138,41,342,228,332,230,316,230,290,224,273,209,262,187,256,162,254,136,253,103,249,69,239,39,223,17,197,9,197,225,155,225,155,9,129,17,112,39,103,69,99,104,98,137,
+134,9,124,10,114,13,104,18,94,25,86,34,76,52,68,72,63,94,61,116,60,137,63,166,73,189,88,206,109,216,134,221,134,228,132,229,129,229,126,230,121,230,84,224,54,207,33,181,19,150,15,114,19,78,33,46,55,20,85,3,123,-3,134,-4,134,-107,176,-107,176,-4,220,1,254,18,277,43,292,75,296,111,291,151,278,184,258,209,233,224,207,230,195,229,184,226,175,221,167,215,160,208,148,187,141,162,137,134,135,105,134,76,16383,16383,176,9,176,129,177,155,178,179,182,198,189,211,201,216,218,209,232,190,243,164,249,134,252,103,250,74,243,49,231,28,214,14,191,9,
 61,116,60,137,60,137,55,20,60,137,54,207,55,20,54,207,33,46,33,46,54,207,33,181,33,46,33,181,19,78,19,78,33,181,19,150,19,78,19,150,15,114,63,94,55,20,68,72,68,72,55,20,85,3,68,72,85,3,76,52,76,52,85,3,86,34,94,25,86,34,85,3,94,25,85,3,123,-3,61,116,60,137,55,20,61,116,55,20,63,94,135,105,134,76,176,-107,176,-107,134,76,134,9,176,-107,134,9,134,-4,134,-4,134,9,124,10,134,-4,124,10,123,-3,123,-3,124,10,114,13,123,-3,114,13,104,18,134,221,134,228,132,229,134,221,132,229,129,229,134,221,129,229,126,230,134,221,126,230,124,230,134,221,124,230,121,230,134,221,121,230,109,216,175,221,176,-107,176,129,176,9,176,-4,220,1,176,9,220,1,191,9,191,9,220,1,214,14,207,230,201,216,218,209,207,230,218,209,233,224,233,224,218,209,232,190,233,224,232,190,243,164,178,179,182,198,184,226,184,226,182,198,189,211,184,226,189,211,195,229,195,229,189,211,201,216,195,229,201,216,207,230,175,221,176,129,177,155,175,221,177,155,178,179,175,221,178,179,184,226,176,-107,175,221,167,215,176,-107,167,215,160,208,176,-107,160,208,148,187,176,-107,148,187,141,162,176,-107,141,162,137,134,176,-107,137,134,135,105,296,111,291,151,292,75,292,75,291,151,278,184,292,75,278,184,277,43,277,43,278,184,258,209,277,43,258,209,254,18,254,18,258,209,252,103,254,18,252,103,250,74,254,18,250,74,243,49,258,209,233,224,243,164,258,209,243,164,249,134,258,209,249,134,252,103,231,28,214,14,220,1,231,28,220,1,254,18,231,28,254,18,243,49,63,166,73,189,84,224,84,224,73,189,88,206,84,224,88,206,121,230,121,230,88,206,109,216,63,166,84,224,54,207,63,166,54,207,60,137,176,-107,134,-4,134,-107,94,25,123,-3,104,18,
-243,225,194,225,123,93,113,139,103,177,92,206,79,224,63,230,49,227,38,217,31,202,27,182,26,156,34,156,37,171,41,182,46,190,51,194,56,195,67,192,77,183,85,168,93,147,101,119,110,78,6,-104,55,-104,126,26,136,-34,141,-57,148,-78,157,-94,168,-105,182,-109,198,-104,209,-90,216,-71,219,-52,220,-34,213,-34,210,-49,206,-61,201,-68,195,-72,187,-74,188,-74,177,-71,168,-63,160,-48,153,-27,147,1,138,41,342,228,332,230,316,230,290,224,273,209,262,187,256,162,254,136,253,103,249,69,239,39,223,17,197,9,197,225,155,225,155,9,129,17,112,39,103,69,99,104,98,137,96,163,90,188,78,210,61,224,36,230,31,230,25,229,14,229,10,228,10,220,30,210,42,190,49,164,52,137,52,114,55,72,65,39,84,15,114,0,155,-4,155,-107,197,-107,197,-4,236,0,265,16,285,41,296,74,300,114,300,137,303,164,310,190,
+243,225,194,225,123,93,113,139,103,177,92,206,79,224,63,230,49,227,38,217,31,202,27,182,26,156,34,156,37,171,41,182,46,190,51,194,56,195,67,192,77,183,85,168,93,147,101,119,110,78,6,-104,55,-104,126,26,136,-34,141,-57,148,-78,157,-94,168,-105,182,-109,198,-104,209,-90,216,-71,219,-52,220,-34,213,-34,210,-49,206,-61,201,-68,195,-72,187,-74,188,-74,177,-71,168,-63,160,-48,153,-27,147,1,138,41,
 79,224,63,230,67,192,67,192,63,230,56,195,51,194,56,195,63,230,51,194,63,230,49,227,194,225,123,93,126,26,126,26,123,93,113,139,126,26,113,139,110,78,110,78,113,139,103,177,110,78,103,177,101,119,67,192,77,183,79,224,79,224,77,183,85,168,79,224,85,168,92,206,92,206,85,168,93,147,92,206,93,147,103,177,103,177,93,147,101,119,138,41,243,225,194,225,138,41,194,225,126,26,138,41,126,26,136,-34,138,41,136,-34,141,-57,138,41,141,-57,147,1,110,78,6,-104,55,-104,110,78,55,-104,126,26,210,-49,206,-61,209,-90,209,-90,206,-61,201,-68,209,-90,201,-68,198,-104,198,-104,201,-68,195,-72,198,-104,195,-72,188,-74,187,-74,188,-74,177,-71,187,-74,177,-71,182,-109,182,-109,177,-71,168,-105,177,-71,168,-63,168,-105,168,-105,168,-63,160,-48,168,-105,160,-48,157,-94,157,-94,160,-48,153,-27,157,-94,153,-27,148,-78,148,-78,153,-27,147,1,148,-78,147,1,141,-57,216,-71,219,-52,220,-34,216,-71,220,-34,213,-34,216,-71,213,-34,210,-49,216,-71,210,-49,209,-90,187,-74,182,-109,198,-104,187,-74,198,-104,188,-74,34,156,37,171,38,217,38,217,37,171,41,182,38,217,41,182,49,227,49,227,41,182,46,190,49,227,46,190,51,194,34,156,38,217,31,202,34,156,31,202,27,182,34,156,27,182,26,156,
-342,228,332,230,316,230,290,224,273,209,262,187,256,162,254,136,253,103,249,69,239,39,223,17,197,9,197,225,155,225,155,9,129,17,112,39,103,69,99,104,98,137,96,163,90,188,78,210,61,224,36,230,31,230,25,229,14,229,10,228,10,220,30,210,42,190,49,164,52,137,52,114,55,72,65,39,84,15,114,0,155,-4,155,-107,197,-107,197,-4,236,0,265,16,285,41,296,74,300,114,300,137,303,164,310,190,322,211,342,221,180,223,206,218,226,203,240,179,249,146,252,104,252,76,248,51,242,29,229,14,210,9,200,12,190,20,181,33,174,51,170,73,173,85,177,105,178,115,179,127,177,145,174,158,169,168,163,173,156,175,149,173,143,168,138,159,135,145,133,126,134,114,135,103,137,94,139,84,142,73,138,51,132,33,123,20,113,12,100,9,82,15,71,31,64,54,61,81,60,109,63,149,73,180,88,204,108,218,132,223,132,230,94,225,62,211,37,186,
+342,228,332,230,316,230,290,224,273,209,262,187,256,162,254,136,253,103,249,69,239,39,223,17,197,9,197,225,155,225,155,9,129,17,112,39,103,69,99,104,98,137,96,163,90,188,78,210,61,224,36,230,31,230,25,229,14,229,10,228,10,220,30,210,42,190,49,164,52,137,52,114,55,72,65,39,84,15,114,0,155,-4,155,-107,197,-107,197,-4,236,0,265,16,285,41,296,74,300,114,300,137,303,164,310,190,322,211,342,221,
 239,39,223,17,236,0,236,0,223,17,197,9,197,-107,197,9,155,-4,197,225,155,225,155,-4,197,225,155,-4,197,9,155,225,155,9,155,-4,155,-4,155,9,129,17,155,-4,129,17,114,0,114,0,129,17,112,39,114,0,112,39,103,69,99,104,98,137,96,163,99,104,96,163,90,188,99,104,90,188,84,15,99,104,84,15,103,69,52,114,55,72,61,224,61,224,55,72,65,39,61,224,65,39,78,210,78,210,65,39,84,15,78,210,84,15,90,188,42,190,49,164,61,224,61,224,49,164,52,137,61,224,52,137,52,114,61,224,36,230,42,190,42,190,36,230,31,230,42,190,31,230,30,210,30,210,31,230,25,229,30,210,25,229,19,229,14,229,10,228,30,210,14,229,30,210,19,229,262,187,256,162,265,16,265,16,256,162,254,136,265,16,254,136,253,103,342,221,342,228,337,229,342,221,337,229,332,230,342,221,332,230,327,230,342,221,327,230,322,211,303,164,310,190,316,230,316,230,310,190,322,211,316,230,322,211,321,230,321,230,322,211,327,230,262,187,265,16,273,209,273,209,265,16,285,41,273,209,285,41,290,224,290,224,285,41,296,74,290,224,296,74,300,137,300,137,296,74,300,114,290,224,300,137,303,164,290,224,303,164,316,230,265,16,253,103,249,69,265,16,249,69,239,39,265,16,239,39,236,0,197,9,197,-4,236,0,197,-107,155,-4,155,-107,30,210,10,228,10,220,103,69,84,15,114,0,
-180,223,206,218,226,203,240,179,249,146,252,104,252,76,248,51,242,29,229,14,210,9,200,12,190,20,181,33,174,51,170,73,173,85,177,105,178,115,179,127,177,145,174,158,169,168,163,173,156,175,149,173,143,168,138,159,135,145,133,126,134,114,135,103,137,94,139,84,142,73,138,51,132,33,123,20,113,12,100,9,82,15,71,31,64,54,61,81,60,109,63,149,73,180,88,204,108,218,132,223,132,230,94,225,62,211,37,186,20,151,15,104,15,84,18,66,23,50,30,35,39,23,49,13,59,5,70,0,81,-3,93,-4,109,-2,123,3,136,12,147,26,156,43,164,26,175,12,187,3,202,-2,218,-4,230,-3,242,0,253,5,263,13,273,23,282,35,289,49,294,66,296,85,297,105,292,152,275,187,250,211,218,225,180,230,158,286,157,294,153,301,148,306,141,310,133,311,125,310,118,306,113,301,110,294,108,286,109,278,113,272,118,266,125,263,132,262,140,263,148,266,153,272,157,278,158,286,16383,16383,59,286,57,294,54,301,48,306,41,310,33,311,26,310,19,306,14,301,10,294,9,286,10,278,14,272,19,266,25,263,33,262,41,263,48,266,54,272,57,278,59,286,16383,16383,138,54,132,43,127,36,122,31,118,29,112,28,108,29,105,31,103,33,102,36,102,228,99,230,84,224,68,219,53,214,37,208,22,204,22,195,27,196,49,196,54,193,57,188,59,181,60,172,60,39,61,26,63,14,69,4,77,-2,89,-4,104,-1,117,7,128,20,138,35,146,50,202,286,201,294,197,301,192,306,185,310,177,311,169,310,162,306,157,301,154,294,152,286,154,278,
+180,223,206,218,226,203,240,179,249,146,252,104,252,76,248,51,242,29,229,14,210,9,200,12,190,20,181,33,174,51,170,73,173,85,177,105,178,115,179,127,177,145,174,158,169,168,163,173,156,175,149,173,143,168,138,159,135,145,133,126,134,114,135,103,137,94,139,84,142,73,138,51,132,33,123,20,113,12,100,9,82,15,71,31,64,54,61,81,60,109,63,149,73,180,88,204,108,218,132,223,132,230,94,225,62,211,37,186,20,151,15,104,15,84,18,66,23,50,30,35,39,23,49,13,59,5,70,0,81,-3,93,-4,109,-2,123,3,136,12,147,26,156,43,164,26,175,12,187,3,202,-2,218,-4,230,-3,242,0,253,5,263,13,273,23,282,35,289,49,294,66,296,85,297,105,292,152,275,187,250,211,218,225,180,230,
 71,31,64,54,70,0,70,0,64,54,61,81,70,0,61,81,59,5,59,5,61,81,60,109,62,211,60,109,63,149,62,211,63,149,73,180,108,218,132,223,132,230,108,218,132,230,94,225,108,218,94,225,88,204,94,225,62,211,73,180,94,225,73,180,88,204,23,50,30,35,37,186,37,186,30,35,39,23,37,186,39,23,62,211,62,211,39,23,49,13,62,211,49,13,60,109,60,109,49,13,59,5,20,151,15,104,15,84,20,151,15,84,18,66,20,151,18,66,23,50,20,151,23,50,37,186,81,-3,93,-4,82,15,82,15,93,-4,100,9,113,12,100,9,109,-2,113,12,109,-2,123,3,71,31,70,0,81,-3,71,31,81,-3,82,15,174,51,170,73,175,12,174,158,170,73,173,85,174,158,173,85,175,95,177,145,174,158,175,95,177,145,175,95,177,105,177,145,177,105,178,115,177,145,178,115,179,127,156,175,156,43,163,173,163,173,156,43,164,26,163,173,164,26,169,168,169,168,164,26,170,73,169,168,170,73,174,158,174,51,175,12,181,33,181,33,175,12,187,3,181,33,187,3,190,20,190,20,187,3,202,-2,190,20,202,-2,200,12,200,12,202,-2,210,9,229,14,210,9,218,-4,229,14,218,-4,230,-3,282,35,289,49,292,152,292,152,289,49,294,66,292,152,294,66,297,105,297,105,294,66,296,85,275,187,250,211,252,104,275,187,252,104,253,5,275,187,253,5,263,13,275,187,263,13,273,23,275,187,273,23,282,35,275,187,282,35,292,152,240,179,249,146,250,211,250,211,249,146,252,104,253,5,252,104,252,76,240,179,250,211,226,203,226,203,250,211,218,225,226,203,218,225,206,218,206,218,218,225,180,230,206,218,180,230,180,223,229,14,230,-3,242,29,242,29,230,-3,242,0,242,29,242,0,248,51,248,51,242,0,253,5,248,51,253,5,252,76,210,9,202,-2,218,-4,139,84,142,73,143,168,143,168,142,73,147,26,143,168,147,26,149,173,149,173,147,26,156,43,149,173,156,43,156,175,147,26,142,73,138,51,147,26,138,51,136,12,136,12,138,51,132,33,136,12,132,33,123,3,123,3,132,33,123,20,123,3,123,20,113,12,138,159,135,145,135,103,138,159,135,103,137,94,138,159,137,94,139,84,138,159,139,84,143,168,135,145,133,126,134,114,135,145,134,114,135,103,100,9,93,-4,109,-2,170,73,164,26,175,12,
-272,145,263,146,255,146,246,147,238,148,230,150,229,176,225,203,220,230,212,257,201,281,191,300,179,316,163,329,144,338,121,342,100,339,80,331,63,316,50,294,46,264,53,226,74,194,104,168,142,149,185,137,186,133,186,116,185,85,180,56,171,32,157,15,137,9,115,14,101,28,91,46,87,66,85,84,85,110,84,131,81,145,76,154,67,159,55,160,43,158,31,151,20,140,9,125,0,105,7,100,15,114,20,123,25,128,29,131,33,132,37,131,39,128,42,123,43,115,44,104,44,93,46,61,55,34,72,13,97,0,133,-4,172,3,200,26,217,58,227,95,230,134,247,134,256,135,272,137,16383,16383,185,161,141,182,112,208,95,235,86,260,84,280,86,295,91,307,99,316,109,321,119,323,135,320,149,310,162,289,173,253,181,200,181,198,182,193,183,184,184,174,185,161,198,208,186,255,169,291,146,317,117,332,81,337,67,336,53,332,39,327,26,319,15,311,18,303,25,305,33,308,41,310,49,311,55,312,84,306,109,289,130,257,146,211,157,147,157,61,156,39,153,25,144,16,130,12,107,9,107,0,260,0,260,9,239,11,224,15,215,23,210,36,209,55,209,126,211,167,220,219,236,270,261,309,296,325,299,325,305,323,308,321,309,319,307,315,296,304,291,295,289,285,290,276,294,268,301,262,308,259,318,257,329,259,338,265,344,273,348,284,349,295,346,309,339,320,329,330,317,336,303,338,268,330,241,308,221,277,207,242,199,208,176,342,134,342,134,230,126,230,86,224,55,206,32,180,19,149,15,114,19,79,33,47,55,20,85,2,123,-4,134,-4,134,-107,176,-107,176,-4,223,2,257,21,280,48,292,81,296,116,294,143,286,168,272,190,
+272,145,263,146,255,146,246,147,238,148,230,150,229,176,225,203,220,230,212,257,201,281,191,300,179,316,163,329,144,338,121,342,100,339,80,331,63,316,50,294,46,264,53,226,74,194,104,168,142,149,185,137,186,133,186,116,185,85,180,56,171,32,157,15,137,9,115,14,101,28,91,46,87,66,85,84,85,110,84,131,81,145,76,154,67,159,55,160,43,158,31,151,20,140,9,125,0,105,7,100,15,114,20,123,25,128,29,131,33,132,37,131,39,128,42,123,43,115,44,104,44,93,46,61,55,34,72,13,97,0,133,-4,172,3,200,26,217,58,227,95,230,134,247,134,256,135,272,137,16383,16383,185,161,141,182,112,208,95,235,86,260,84,280,86,295,91,307,99,316,109,321,119,323,135,320,149,310,162,289,173,253,181,200,181,198,182,193,183,184,184,174,185,161,
 20,123,25,128,31,151,31,151,25,128,29,131,31,151,29,131,33,132,33,132,37,131,43,158,43,158,37,131,39,128,43,158,39,128,42,123,0,105,7,100,9,125,9,125,7,100,15,114,9,125,15,114,20,140,20,140,15,114,20,123,20,140,20,123,31,151,44,104,46,61,55,160,55,160,46,61,55,34,55,160,55,34,67,159,67,159,55,34,72,13,67,159,72,13,76,154,76,154,72,13,87,66,76,154,87,66,85,84,85,84,85,110,84,131,85,84,84,131,81,145,85,84,81,145,76,154,121,342,119,323,135,320,121,342,135,320,144,338,144,338,135,320,149,310,144,338,149,310,163,329,163,329,149,310,162,289,163,329,162,289,173,253,180,56,171,32,172,3,172,3,171,32,157,15,172,3,157,15,137,9,137,9,115,14,133,-4,133,-4,115,14,101,28,133,-4,101,28,97,0,97,0,101,28,91,46,97,0,91,46,87,66,43,115,44,104,55,160,43,115,55,160,43,158,43,115,43,158,42,123,43,158,31,151,33,132,272,137,272,145,264,136,264,136,272,145,263,146,264,136,263,146,256,135,256,135,263,146,255,146,256,135,255,146,247,134,247,134,255,146,246,147,247,134,246,147,238,134,238,134,246,147,238,148,238,134,238,148,230,150,230,150,229,176,230,134,230,134,229,176,227,95,229,176,225,203,227,95,227,95,225,203,220,230,227,95,220,230,217,58,217,58,220,230,212,257,217,58,212,257,201,281,217,58,201,281,200,26,200,26,201,281,191,300,200,26,191,300,186,116,186,116,185,85,200,26,200,26,185,85,180,56,200,26,180,56,172,3,137,9,133,-4,172,3,238,134,230,150,230,134,91,307,99,316,100,339,100,339,99,316,109,321,100,339,109,321,121,342,121,342,109,321,119,323,80,331,84,280,86,295,80,331,86,295,100,339,100,339,86,295,91,307,191,300,179,316,181,200,191,300,181,200,181,198,191,300,181,198,182,193,191,300,182,193,183,184,191,300,183,184,184,174,191,300,184,174,185,161,191,300,185,161,185,137,191,300,185,137,186,133,191,300,186,133,186,129,191,300,186,129,186,124,191,300,186,124,186,120,191,300,186,120,186,116,185,161,141,182,142,149,185,161,142,149,185,137,112,208,95,235,104,168,112,208,104,168,142,149,112,208,142,149,141,182,86,260,84,280,74,194,86,260,74,194,104,168,86,260,104,168,95,235,84,280,80,331,74,194,74,194,80,331,63,316,74,194,63,316,53,226,53,226,63,316,50,294,53,226,50,294,46,264,173,253,181,200,179,316,173,253,179,316,163,329,46,61,44,104,44,93,87,66,72,13,97,0,
-176,342,134,342,134,230,126,230,86,224,55,206,32,180,19,149,15,114,19,79,33,47,55,20,85,2,123,-4,134,-4,134,-107,176,-107,176,-4,223,2,257,21,280,48,292,81,296,116,294,143,286,168,272,190,254,208,230,222,221,225,211,228,189,230,176,230,16383,16383,176,9,176,216,203,210,225,193,240,168,249,137,252,102,249,73,243,48,231,27,214,14,191,9,16383,16383,135,9,125,10,114,13,104,18,95,25,86,34,77,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,99,212,120,216,135,216,363,183,363,225,77,225,53,219,33,204,18,183,8,160,3,137,11,137,18,152,27,164,36,174,48,181,61,183,84,183,76,169,69,153,64,137,61,120,60,103,64,64,76,34,92,12,112,0,134,-4,153,-2,169,3,182,12,193,26,201,43,210,25,221,12,233,2,247,-2,261,-4,286,0,309,12,327,33,339,63,343,102,342,119,340,136,336,153,329,169,320,183,16383,16383,279,183,285,171,291,155,295,138,297,120,298,103,297,76,293,51,286,29,275,15,258,9,246,12,236,20,226,33,219,51,215,74,218,82,
+176,342,134,342,134,230,126,230,86,224,55,206,32,180,19,149,15,114,19,79,33,47,55,20,85,2,123,-4,134,-4,134,-107,176,-107,176,-4,223,2,257,21,280,48,292,81,296,116,294,143,286,168,272,190,254,208,230,222,221,225,211,228,189,230,176,230,16383,16383,176,9,176,216,203,210,225,193,240,168,249,137,252,102,249,73,243,48,231,27,214,14,191,9,16383,16383,135,9,125,10,114,13,104,18,95,25,86,34,77,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,99,212,120,216,135,216,
 296,116,294,143,292,81,292,81,294,143,286,168,292,81,286,168,280,48,280,48,286,168,272,190,280,48,272,190,257,21,257,21,272,190,254,208,257,21,254,208,252,102,221,225,225,193,230,222,230,222,225,193,240,168,230,222,240,168,254,208,254,208,240,168,249,137,254,208,249,137,252,102,211,228,200,229,203,210,211,228,203,210,225,193,211,228,225,193,221,225,200,229,189,230,203,210,203,210,189,230,176,230,203,210,176,230,176,216,176,216,176,230,176,342,176,216,176,342,135,216,135,216,176,342,134,342,135,216,134,342,134,230,257,21,252,102,249,73,257,21,249,73,243,48,257,21,243,48,231,27,257,21,231,27,223,2,231,27,214,14,223,2,223,2,214,14,191,9,223,2,191,9,176,-4,176,-4,191,9,176,9,176,-4,176,9,176,-107,176,-107,176,9,135,216,176,-107,135,216,135,9,134,-4,134,-107,176,-107,134,-4,176,-107,135,9,134,-4,135,9,125,10,134,-4,125,10,123,-4,69,70,85,2,77,51,77,51,85,2,86,34,95,25,86,34,85,2,95,25,85,2,123,-4,82,202,86,224,70,186,70,186,86,224,55,206,70,186,55,206,62,164,62,164,55,206,60,137,61,113,60,137,55,20,61,113,55,20,64,91,64,91,55,20,85,2,64,91,85,2,69,70,123,-4,125,10,114,13,123,-4,114,13,104,18,123,-4,104,18,95,25,126,230,86,224,99,212,126,230,99,212,120,216,126,230,120,216,135,216,126,230,135,216,134,230,55,20,60,137,55,206,55,20,55,206,33,47,33,47,55,206,32,180,33,47,32,180,19,79,19,79,32,180,19,149,19,79,19,149,15,114,86,224,82,202,99,212,176,216,135,216,176,9,
-363,183,363,225,77,225,53,219,33,204,18,183,8,160,3,137,11,137,18,152,27,164,36,174,48,181,61,183,84,183,76,169,69,153,64,137,61,120,60,103,64,64,76,34,92,12,112,0,134,-4,153,-2,169,3,182,12,193,26,201,43,210,25,221,12,233,2,247,-2,261,-4,286,0,309,12,327,33,339,63,343,102,342,119,340,136,336,153,329,169,320,183,16383,16383,279,183,285,171,291,155,295,138,297,120,298,103,297,76,293,51,286,29,275,15,258,9,246,12,236,20,226,33,219,51,215,74,218,82,220,90,222,99,224,115,223,126,221,138,217,149,211,156,202,159,193,156,186,149,182,139,180,127,179,116,180,107,181,99,185,81,188,74,183,51,176,33,167,19,156,12,143,9,126,15,115,30,108,52,106,76,105,99,106,118,108,137,112,153,118,169,125,183,155,-46,154,-68,151,-83,143,-91,129,-96,108,-98,108,-107,254,-107,254,-98,233,-96,219,-92,211,-84,207,-71,206,-52,206,-4,252,8,290,33,319,68,337,113,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,23,114,42,69,71,33,109,8,155,-4,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,103,-107,146,-107,146,-2,176,7,200,26,219,50,231,81,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,
+363,183,363,225,77,225,53,219,33,204,18,183,8,160,3,137,11,137,18,152,27,164,36,174,48,181,61,183,84,183,76,169,69,153,64,137,61,120,60,103,64,64,76,34,92,12,112,0,134,-4,153,-2,169,3,182,12,193,26,201,43,210,25,221,12,233,2,247,-2,261,-4,286,0,309,12,327,33,339,63,343,102,342,119,340,136,336,153,329,169,320,183,16383,16383,279,183,285,171,291,155,295,138,297,120,298,103,297,76,293,51,286,29,275,15,258,9,246,12,236,20,226,33,219,51,215,74,218,82,220,90,222,99,224,115,223,126,221,138,217,149,211,156,202,159,193,156,186,149,182,139,180,127,179,116,180,107,181,99,185,81,188,74,183,51,176,33,167,19,156,12,143,9,126,15,115,30,108,52,106,76,105,99,106,118,108,137,112,153,118,169,125,183,
 11,137,18,152,18,183,18,183,18,152,27,164,18,183,27,164,33,204,33,204,27,164,36,174,33,204,36,174,53,219,53,219,36,174,48,181,53,219,48,181,61,183,77,225,61,183,84,183,77,225,84,183,363,225,363,225,84,183,125,183,363,225,125,183,279,183,8,160,3,137,11,137,8,160,11,137,18,183,108,137,112,153,84,183,84,183,112,153,118,169,84,183,118,169,125,183,108,52,112,0,115,30,115,30,112,0,134,-4,115,30,134,-4,126,15,126,15,134,-4,143,9,156,12,143,9,153,-2,156,12,153,-2,169,3,105,99,92,12,106,76,106,76,92,12,112,0,106,76,112,0,108,52,219,51,215,74,221,12,217,149,215,74,218,82,217,149,218,82,221,138,221,138,218,82,220,90,221,138,220,90,222,99,223,126,221,138,222,99,223,126,222,99,223,107,223,126,223,107,224,115,188,74,193,26,193,156,193,156,193,26,201,43,193,156,201,43,202,159,202,159,201,43,210,25,202,159,210,25,211,156,211,156,210,25,215,74,211,156,215,74,217,149,219,51,221,12,226,33,226,33,221,12,233,2,226,33,233,2,236,20,236,20,233,2,247,-2,236,20,247,-2,246,12,246,12,247,-2,258,9,275,15,258,9,261,-4,275,15,261,-4,286,0,363,225,279,183,285,171,363,225,285,171,291,155,363,225,291,155,320,183,363,225,320,183,363,183,340,136,336,153,339,63,339,63,336,153,329,169,339,63,329,169,327,33,327,33,329,169,320,183,327,33,320,183,309,12,309,12,320,183,298,103,291,155,295,138,320,183,320,183,295,138,297,120,320,183,297,120,298,103,106,118,108,137,84,183,106,118,84,183,92,12,106,118,92,12,105,99,340,136,339,63,343,102,340,136,343,102,342,119,309,12,298,103,297,76,309,12,297,76,293,51,309,12,293,51,286,29,309,12,286,29,286,0,258,9,247,-2,261,-4,186,149,182,139,183,90,186,149,183,90,185,81,186,149,185,81,188,74,186,149,188,74,193,156,179,116,180,107,180,127,180,127,180,107,181,99,180,127,181,99,182,139,182,139,181,99,183,90,193,26,188,74,183,51,193,26,183,51,182,12,182,12,183,51,176,33,182,12,176,33,169,3,169,3,176,33,167,19,169,3,167,19,156,12,143,9,134,-4,153,-2,76,169,69,153,76,34,76,169,76,34,92,12,76,169,92,12,84,183,64,137,61,120,64,64,64,137,64,64,76,34,64,137,76,34,69,153,64,64,61,120,60,103,275,15,286,0,286,29,61,183,77,225,53,219,215,74,210,25,221,12,
-257,225,206,225,111,104,110,104,112,114,114,125,115,138,117,150,117,160,115,183,108,202,97,217,82,226,64,230,53,229,43,225,35,219,29,210,27,198,28,193,31,188,35,184,40,181,46,180,54,181,60,184,63,188,67,191,71,192,81,190,89,184,95,174,99,162,100,148,99,136,98,121,96,107,94,94,91,85,21,0,73,0,170,121,171,121,168,111,166,100,164,88,163,76,162,65,164,46,170,27,180,11,194,0,214,-4,225,-3,236,0,244,5,250,14,252,26,251,32,248,37,244,41,239,43,233,44,225,43,219,40,213,34,209,33,199,35,191,40,185,50,181,64,180,85,180,98,181,111,183,122,186,132,189,141,213,-107,214,-103,216,-93,217,-89,217,-86,202,-54,166,-40,119,-30,75,-8,44,40,45,40,55,24,69,11,86,2,106,-2,131,-4,166,1,195,18,217,44,230,75,235,110,230,150,217,183,195,208,166,224,129,230,83,221,50,197,29,163,18,126,15,89,15,69,16,49,18,29,22,10,28,-6,65,-50,110,-71,154,-79,189,-88,205,-107,16383,16383,190,108,188,82,183,55,173,32,157,15,133,9,105,17,85,37,70,66,62,101,60,137,63,166,71,188,83,203,100,213,120,216,141,210,160,195,175,171,186,142,190,108,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,
+257,225,206,225,111,104,110,104,112,114,114,125,115,138,117,150,117,160,115,183,108,202,97,217,82,226,64,230,53,229,43,225,35,219,29,210,27,198,28,193,31,188,35,184,40,181,46,180,54,181,60,184,63,188,67,191,71,192,81,190,89,184,95,174,99,162,100,148,99,136,98,121,96,107,94,94,91,85,21,0,73,0,170,121,171,121,168,111,166,100,164,88,163,76,162,65,164,46,170,27,180,11,194,0,214,-4,225,-3,236,0,244,5,250,14,252,26,251,32,248,37,244,41,239,43,233,44,225,43,219,40,213,34,209,33,199,35,191,40,185,50,181,64,180,85,180,98,181,111,183,122,186,132,189,141,
 95,174,97,217,89,184,89,184,97,217,82,226,89,184,82,226,81,190,81,190,82,226,71,192,67,191,71,192,82,226,67,191,82,226,64,230,206,225,111,104,170,121,170,121,111,104,94,94,170,121,94,94,91,85,91,85,21,0,73,0,112,114,114,125,115,183,115,183,114,125,115,138,115,183,115,138,117,160,117,160,115,138,117,150,110,104,112,114,115,183,110,104,115,183,108,202,110,104,108,202,100,148,110,104,100,148,99,136,110,104,99,136,98,121,110,104,98,121,96,107,110,104,96,107,94,94,110,104,94,94,111,104,191,40,185,50,194,0,194,0,185,50,181,64,194,0,181,64,180,11,180,11,181,64,180,85,171,121,180,85,180,98,171,121,180,98,181,111,186,132,189,141,206,225,186,132,206,225,183,122,183,122,206,225,171,121,183,122,171,121,181,111,206,225,189,141,257,225,99,162,100,148,108,202,99,162,108,202,97,217,91,85,73,0,170,121,225,43,219,40,225,-3,225,-3,219,40,216,37,225,-3,216,37,214,-4,214,-4,216,37,213,34,214,-4,213,34,209,33,209,33,199,35,214,-4,214,-4,199,35,194,0,252,26,251,32,250,14,250,14,251,32,248,37,250,14,248,37,244,5,244,5,248,37,244,41,244,5,244,41,239,43,225,43,225,-3,233,44,233,44,225,-3,236,0,233,44,236,0,239,43,239,43,236,0,244,5,171,121,168,111,170,27,171,121,170,27,180,11,171,121,180,11,180,85,166,100,164,88,164,46,166,100,164,46,170,27,166,100,170,27,168,111,163,76,162,65,164,46,163,76,164,46,164,88,64,230,53,229,54,181,64,230,54,181,60,184,64,230,60,184,63,188,64,230,63,188,67,191,35,184,40,181,43,225,43,225,40,181,46,180,43,225,46,180,53,229,53,229,46,180,54,181,27,198,28,193,29,210,29,210,28,193,31,188,29,210,31,188,35,219,35,219,31,188,35,184,35,219,35,184,43,225,97,217,95,174,99,162,191,40,194,0,199,35,206,225,170,121,171,121,
-213,-107,214,-103,216,-93,217,-89,217,-86,202,-54,166,-40,119,-30,75,-8,44,40,45,40,55,24,69,11,86,2,106,-2,131,-4,166,1,195,18,217,44,230,75,235,110,230,150,217,183,195,208,166,224,129,230,83,221,50,197,29,163,18,126,15,89,15,69,16,49,18,29,22,10,28,-6,65,-50,110,-71,154,-79,189,-88,205,-107,16383,16383,190,108,188,82,183,55,173,32,157,15,133,9,105,17,85,37,70,66,62,101,60,137,63,166,71,188,83,203,100,213,120,216,141,210,160,195,175,171,186,142,190,108,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,74,180,77,205,82,229,88,251,97,271,108,286,121,299,134,308,149,315,164,318,180,320,194,319,207,316,219,311,231,305,242,296,256,281,268,261,277,237,284,210,286,180,16383,16383,287,157,285,126,279,98,271,73,260,52,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,51,91,73,82,98,
+213,-107,214,-103,216,-93,217,-89,217,-86,202,-54,166,-40,119,-30,75,-8,44,40,45,40,55,24,69,11,86,2,106,-2,131,-4,166,1,195,18,217,44,230,75,235,110,230,150,217,183,195,208,166,224,129,230,83,221,50,197,29,163,18,126,15,89,15,69,16,49,18,29,22,10,28,-6,65,-50,110,-71,154,-79,189,-88,205,-107,16383,16383,190,108,188,82,183,55,173,32,157,15,133,9,105,17,85,37,70,66,62,101,60,137,63,166,71,188,83,203,100,213,120,216,141,210,160,195,175,171,186,142,190,108,
 28,-6,65,-50,44,40,44,40,65,-50,75,-8,75,-8,65,-50,110,-71,75,-8,110,-71,119,-30,119,-30,110,-71,154,-79,119,-30,154,-79,166,-40,166,-40,154,-79,189,-88,166,-40,189,-88,202,-54,202,-54,189,-88,205,-107,202,-54,205,-107,217,-86,217,-86,205,-107,213,-107,217,-86,213,-107,214,-103,55,24,69,11,60,137,60,137,63,166,50,197,50,197,63,166,71,188,50,197,71,188,83,221,83,221,71,188,83,203,83,221,83,203,129,230,129,230,83,203,100,213,129,230,100,213,120,216,120,216,141,210,129,230,129,230,141,210,166,224,133,9,106,-2,131,-4,133,9,131,-4,166,1,133,9,105,17,106,-2,86,2,106,-2,105,17,86,2,105,17,85,37,86,2,85,37,70,66,86,2,70,66,69,11,62,101,60,137,69,11,62,101,69,11,70,66,188,82,183,55,195,18,195,18,183,55,173,32,195,18,173,32,166,1,166,1,173,32,157,15,166,1,157,15,133,9,175,171,186,142,195,208,195,208,186,142,190,108,195,18,190,108,188,82,166,224,141,210,160,195,166,224,160,195,175,171,166,224,175,171,195,208,195,18,217,44,217,183,217,183,217,44,230,75,217,183,230,75,230,150,230,150,230,75,235,110,195,208,190,108,195,18,195,208,195,18,217,183,217,-86,214,-103,215,-98,217,-86,215,-98,216,-93,217,-86,216,-93,217,-89,16,49,18,29,18,126,18,126,18,29,22,10,18,126,22,10,29,163,29,163,22,10,28,-6,29,163,28,-6,44,40,18,126,15,89,15,69,18,126,15,69,16,49,44,40,45,40,50,197,50,197,45,40,55,24,50,197,55,24,60,137,50,197,29,163,44,40,
-196,56,183,41,169,29,155,22,139,17,123,16,100,21,82,35,68,56,60,82,57,112,155,112,155,127,57,127,61,151,69,175,82,196,99,210,119,215,142,212,158,203,169,191,177,177,183,162,191,162,184,230,176,230,174,224,173,222,171,220,167,220,160,221,152,223,144,226,133,229,118,230,82,223,53,205,31,178,17,145,12,108,17,74,30,44,50,18,78,1,112,-4,136,-1,157,5,176,17,191,33,204,52,23,169,37,184,50,195,65,203,80,208,97,209,119,204,138,190,151,169,159,143,162,113,65,113,65,98,162,98,159,73,150,50,137,29,120,15,100,9,77,13,61,21,50,34,42,48,36,63,28,63,36,-4,44,-4,44,-1,46,3,52,5,60,4,67,1,76,0,87,-3,101,-4,137,2,167,20,189,47,202,80,207,117,203,150,190,181,169,207,142,224,108,230,84,227,62,220,44,208,28,192,16,172,243,411,
+196,56,183,41,169,29,155,22,139,17,123,16,100,21,82,35,68,56,60,82,57,112,155,112,155,127,57,127,61,151,69,175,82,196,99,210,119,215,142,212,158,203,169,191,177,177,183,162,191,162,184,230,176,230,174,224,173,222,171,220,167,220,160,221,152,223,144,226,133,229,118,230,82,223,53,205,31,178,17,145,12,108,17,74,30,44,50,18,78,1,112,-4,136,-1,157,5,176,17,191,33,204,52,
 155,112,155,127,57,112,57,112,57,127,53,205,53,205,57,127,61,151,53,205,61,151,82,223,82,223,61,151,69,175,82,223,69,175,82,196,68,56,78,1,82,35,82,35,78,1,112,-4,82,35,112,-4,100,21,100,21,112,-4,123,16,139,17,123,16,136,-1,139,17,136,-1,157,5,60,82,57,112,50,18,60,82,50,18,78,1,60,82,78,1,68,56,12,108,17,74,17,145,17,145,17,74,30,44,17,145,30,44,31,178,31,178,30,44,50,18,31,178,50,18,53,205,53,205,50,18,57,112,158,203,169,191,160,221,160,221,169,191,167,220,171,220,167,220,169,191,171,220,169,191,177,177,184,230,176,230,177,177,184,230,177,177,183,162,184,230,183,162,191,162,177,177,176,230,175,227,177,177,175,227,174,224,177,177,174,224,173,222,177,177,173,222,171,220,133,229,119,215,142,212,133,229,142,212,144,226,144,226,142,212,158,203,144,226,158,203,152,223,152,223,158,203,160,221,204,52,196,56,191,33,191,33,196,56,183,41,191,33,183,41,176,17,176,17,183,41,169,29,176,17,169,29,157,5,157,5,169,29,155,22,157,5,155,22,139,17,123,16,112,-4,136,-1,118,230,82,223,82,196,118,230,82,196,99,210,118,230,99,210,119,215,118,230,119,215,133,229,57,127,57,112,155,127,
-350,0,350,9,337,12,327,17,319,26,311,38,304,55,180,337,171,337,68,93,52,58,41,34,31,20,19,13,4,9,4,0,104,0,104,9,91,10,81,12,74,16,70,22,69,30,69,34,70,38,71,43,72,47,74,51,97,108,228,108,248,61,254,45,256,38,257,31,257,23,256,21,255,18,251,14,247,12,239,10,232,10,223,9,223,0,16383,16383,220,128,105,128,162,266,108,183,108,294,109,301,111,306,114,310,119,311,126,312,188,312,202,311,217,307,230,300,242,287,251,267,252,263,253,258,255,254,256,250,256,247,268,247,266,331,9,331,9,321,30,320,44,315,52,308,56,295,57,275,57,56,56,37,52,24,43,16,29,11,9,9,9,0,169,0,209,4,242,16,267,35,283,60,289,91,280,132,256,159,223,174,185,181,146,183,16383,16383,108,163,
+350,0,350,9,337,12,327,17,319,26,311,38,304,55,180,337,171,337,68,93,52,58,41,34,31,20,19,13,4,9,4,0,104,0,104,9,91,10,81,12,74,16,70,22,69,30,69,34,70,38,71,43,72,47,74,51,97,108,228,108,248,61,254,45,256,38,257,31,257,23,256,21,255,18,251,14,247,12,239,10,232,10,223,9,223,0,16383,16383,220,128,105,128,162,266,
 52,58,70,22,69,30,69,30,69,34,68,93,68,93,69,34,70,38,68,93,70,38,71,43,243,11,239,10,350,0,350,0,239,10,232,10,350,0,232,10,223,9,72,47,74,51,171,337,171,337,74,51,97,108,171,337,97,108,105,128,105,128,97,108,228,108,105,128,228,108,220,128,220,128,228,108,304,55,220,128,304,55,180,337,256,21,255,18,350,0,350,0,255,18,253,16,350,0,253,16,251,14,251,14,247,12,350,0,350,0,247,12,243,11,257,26,350,0,327,17,257,26,327,17,319,26,257,26,319,26,311,38,257,26,311,38,304,55,257,26,304,55,257,31,304,55,228,108,248,61,304,55,248,61,251,53,304,55,251,53,254,45,304,55,254,45,256,38,304,55,256,38,257,31,171,337,105,128,162,266,171,337,162,266,220,128,171,337,220,128,180,337,68,93,52,58,69,30,72,47,171,337,68,93,72,47,68,93,71,43,337,12,327,17,350,0,337,12,350,0,350,9,257,23,256,21,350,0,257,23,350,0,257,26,104,0,104,9,91,10,104,0,91,10,81,12,104,0,81,12,41,34,104,0,41,34,31,20,104,0,31,20,19,13,104,0,19,13,4,9,104,0,4,9,4,0,41,34,81,12,74,16,41,34,74,16,70,22,41,34,70,22,52,58,350,0,223,9,223,0,
-108,183,108,294,109,301,111,306,114,310,119,311,126,312,188,312,202,311,217,307,230,300,242,287,251,267,252,263,253,258,255,254,256,250,256,247,268,247,266,331,9,331,9,321,30,320,44,315,52,308,56,295,57,275,57,56,56,37,52,24,43,16,29,11,9,9,9,0,169,0,209,4,242,16,267,35,283,60,289,91,280,132,256,159,223,174,185,181,146,183,16383,16383,108,163,138,163,166,161,191,154,212,141,226,120,231,89,226,59,212,39,190,27,162,21,131,19,120,20,113,22,110,26,108,33,108,41,212,180,226,183,237,187,245,190,253,195,260,200,267,208,273,218,277,229,280,240,281,252,275,281,259,303,233,318,196,328,150,331,9,331,9,321,30,320,44,316,52,308,56,295,57,275,57,56,56,37,52,24,43,16,30,11,9,9,9,0,178,0,218,4,251,17,276,37,292,63,297,94,296,107,293,120,289,131,282,142,273,151,264,159,255,165,244,171,230,175,212,179,16383,16383,108,188,108,296,109,302,110,307,113,310,116,311,121,312,141,312,173,310,198,302,215,290,226,273,229,250,226,228,217,210,203,198,
+108,183,108,294,109,301,111,306,114,310,119,311,126,312,188,312,202,311,217,307,230,300,242,287,251,267,252,263,253,258,255,254,256,250,256,247,268,247,266,331,9,331,9,321,30,320,44,315,52,308,56,295,57,275,57,56,56,37,52,24,43,16,29,11,9,9,9,0,169,0,209,4,242,16,267,35,283,60,289,91,280,132,256,159,223,174,185,181,146,183,16383,16383,108,163,138,163,166,161,191,154,212,141,226,120,231,89,226,59,212,39,190,27,162,21,131,19,120,20,113,22,110,26,108,33,108,41,
 52,24,43,16,169,0,169,0,43,16,29,11,169,0,29,11,9,9,44,315,52,308,266,331,266,331,52,308,119,311,266,331,119,311,126,312,266,331,126,312,188,312,266,331,188,312,202,311,217,307,230,300,266,331,266,331,230,300,242,287,266,331,242,287,251,267,251,267,252,263,266,331,266,331,252,263,253,258,266,331,253,258,255,254,266,331,255,254,256,250,266,331,256,250,256,247,266,331,256,247,268,247,57,275,108,33,108,41,108,183,108,163,138,163,108,183,138,163,146,183,146,183,138,163,166,161,146,183,166,161,185,181,185,181,166,161,191,154,185,181,191,154,223,174,223,174,191,154,212,141,223,174,212,141,226,120,57,275,108,41,108,294,57,275,108,294,109,301,57,275,109,301,111,306,57,275,111,306,114,310,57,275,114,310,56,295,119,311,52,308,56,295,119,311,56,295,114,310,30,320,44,315,266,331,30,320,266,331,9,331,30,320,9,331,9,321,231,89,226,59,242,16,242,16,226,59,212,39,242,16,212,39,209,4,209,4,212,39,190,27,209,4,190,27,169,0,169,0,190,27,162,21,169,0,162,21,131,19,131,19,120,20,169,0,169,0,120,20,113,22,169,0,113,22,56,37,56,37,113,22,57,56,231,89,242,16,256,159,256,159,242,16,267,35,256,159,267,35,280,132,280,132,267,35,283,60,280,132,283,60,289,91,226,120,231,89,256,159,226,120,256,159,223,174,57,56,113,22,110,26,57,56,110,26,108,33,57,56,108,33,57,275,169,0,9,9,9,0,52,24,169,0,56,37,266,331,202,311,217,307,
-212,180,226,183,237,187,245,190,253,195,260,200,267,208,273,218,277,229,280,240,281,252,275,281,259,303,233,318,196,328,150,331,9,331,9,321,30,320,44,316,52,308,56,295,57,275,57,56,56,37,52,24,43,16,30,11,9,9,9,0,178,0,218,4,251,17,276,37,292,63,297,94,296,107,293,120,289,131,282,142,273,151,264,159,255,165,244,171,230,175,212,179,16383,16383,108,188,108,296,109,302,110,307,113,310,116,311,121,312,141,312,173,310,198,302,215,290,226,273,229,250,226,228,217,210,203,198,182,191,155,188,16383,16383,108,168,139,168,163,167,182,164,199,158,217,148,225,141,232,131,237,120,239,108,240,94,239,82,237,69,233,58,228,48,221,41,208,31,195,25,180,21,162,19,140,19,127,20,119,22,113,26,109,33,108,41,272,242,270,331,9,331,9,321,28,320,41,315,48,307,52,294,53,275,53,57,52,37,48,24,41,16,28,12,9,9,9,0,150,0,150,9,130,12,117,16,109,24,105,37,104,56,104,302,106,307,109,310,114,312,192,312,206,311,221,307,234,300,246,286,255,267,256,262,258,256,259,250,260,245,260,242,323,-75,323,9,303,11,291,17,283,27,279,40,278,57,278,274,280,293,283,307,291,315,304,319,323,321,323,331,47,331,47,321,62,320,75,316,83,308,88,295,90,275,87,172,79,97,65,46,45,18,17,9,7,9,7,-75,19,-75,19,-72,20,-67,21,-60,23,-54,24,-49,32,-29,43,-15,56,-5,71,0,259,0,274,-5,287,-15,298,-29,306,-49,307,-54,308,-60,309,-67,310,-72,311,-75,16383,16383,228,41,227,33,225,27,222,22,217,20,
+212,180,226,183,237,187,245,190,253,195,260,200,267,208,273,218,277,229,280,240,281,252,275,281,259,303,233,318,196,328,150,331,9,331,9,321,30,320,44,316,52,308,56,295,57,275,57,56,56,37,52,24,43,16,30,11,9,9,9,0,178,0,218,4,251,17,276,37,292,63,297,94,296,107,293,120,289,131,282,142,273,151,264,159,255,165,244,171,230,175,212,179,16383,16383,108,188,108,296,109,302,110,307,113,310,116,311,121,312,141,312,173,310,198,302,215,290,226,273,229,250,226,228,217,210,203,198,182,191,155,188,16383,16383,108,168,139,168,163,167,182,164,199,158,217,148,225,141,232,131,237,120,239,108,240,94,239,82,237,69,233,58,228,48,221,41,208,31,195,25,180,21,162,19,140,19,127,20,119,22,113,26,109,33,108,41,
 52,24,43,16,178,0,178,0,43,16,30,11,178,0,30,11,9,9,56,295,57,275,113,310,56,295,113,310,150,331,150,331,113,310,116,311,150,331,116,311,121,312,150,331,121,312,141,312,150,331,141,312,173,310,208,31,195,25,218,4,218,4,195,25,180,21,218,4,180,21,178,0,178,0,180,21,162,19,178,0,162,19,140,19,140,19,127,20,178,0,178,0,127,20,119,22,178,0,119,22,56,37,56,37,119,22,57,56,259,303,233,318,237,187,237,187,233,318,229,250,237,187,229,250,226,228,237,187,226,228,226,183,226,183,226,228,217,210,226,183,217,210,212,180,212,180,217,210,203,198,212,180,203,198,212,179,212,179,203,198,217,148,212,179,217,148,230,175,230,175,217,148,225,141,155,188,163,167,182,191,182,191,163,167,182,164,182,191,182,164,203,198,203,198,182,164,199,158,203,198,199,158,217,148,237,69,233,58,251,17,251,17,233,58,228,48,251,17,228,48,221,41,221,41,208,31,218,4,163,167,155,188,139,168,139,168,155,188,108,188,139,168,108,188,108,168,109,33,108,41,57,275,109,33,57,275,57,56,57,56,119,22,113,26,57,56,113,26,109,33,273,151,264,159,276,37,276,37,264,159,255,165,276,37,255,165,251,17,251,17,255,165,244,171,251,17,244,171,240,94,240,94,239,82,251,17,251,17,239,82,237,69,244,171,230,175,232,131,244,171,232,131,237,120,244,171,237,120,239,108,244,171,239,108,240,94,233,318,196,328,198,302,233,318,198,302,215,290,233,318,215,290,226,273,233,318,226,273,229,250,196,328,150,331,173,310,196,328,173,310,198,302,57,275,108,41,108,296,57,275,108,296,109,302,57,275,109,302,110,307,57,275,110,307,113,310,150,331,9,331,30,320,150,331,30,320,44,316,150,331,44,316,52,308,150,331,52,308,56,295,267,208,273,218,275,281,275,281,273,218,277,229,275,281,277,229,281,252,281,252,277,229,280,240,245,190,253,195,259,303,259,303,253,195,260,200,259,303,260,200,275,281,275,281,260,200,267,208,293,120,289,131,292,63,293,120,292,63,297,94,293,120,297,94,296,107,282,142,273,151,276,37,282,142,276,37,292,63,282,142,292,63,289,131,221,41,218,4,251,17,259,303,237,187,245,190,30,320,9,331,9,321,230,175,225,141,232,131,178,0,9,9,9,0,52,24,178,0,56,37,
-272,242,270,331,9,331,9,321,28,320,41,315,48,307,52,294,53,275,53,57,52,37,48,24,41,16,28,12,9,9,9,0,150,0,150,9,130,12,117,16,109,24,105,37,104,56,104,302,106,307,109,310,114,312,192,312,206,311,221,307,234,300,246,286,255,267,256,262,258,256,259,250,260,245,260,242,323,-75,323,9,303,11,291,17,283,27,279,40,278,57,278,274,280,293,283,307,291,315,304,319,323,321,323,331,47,331,47,321,62,320,75,316,83,308,88,295,90,275,87,172,79,97,65,46,45,18,17,9,7,9,7,-75,19,-75,19,-72,20,-67,21,-60,23,-54,24,-49,32,-29,43,-15,56,-5,71,0,
+272,242,270,331,9,331,9,321,28,320,41,315,48,307,52,294,53,275,53,57,52,37,48,24,41,16,28,12,9,9,9,0,150,0,150,9,130,12,117,16,109,24,105,37,104,56,104,302,106,307,109,310,114,312,192,312,206,311,221,307,234,300,246,286,255,267,256,262,258,256,259,250,260,245,260,242,
 48,24,41,16,150,0,150,0,41,16,28,12,150,0,28,12,9,9,52,294,53,275,109,310,52,294,109,310,48,307,48,307,109,310,114,312,48,307,114,312,270,331,270,331,114,312,122,312,221,307,234,300,270,331,270,331,234,300,246,286,270,331,246,286,255,267,255,267,256,262,270,331,270,331,256,262,258,256,270,331,258,256,259,250,270,331,259,250,260,245,270,331,260,245,260,242,270,331,260,242,272,242,270,331,122,312,192,312,270,331,192,312,206,311,270,331,206,311,221,307,117,16,109,24,53,57,53,57,109,24,105,37,53,57,105,37,53,275,53,275,105,37,104,56,53,275,104,56,104,294,53,275,104,294,104,302,53,275,104,302,106,307,53,275,106,307,109,310,270,331,9,331,28,320,270,331,28,320,41,315,270,331,41,315,48,307,150,0,150,9,130,12,150,0,130,12,117,16,150,0,117,16,52,37,150,0,52,37,48,24,150,0,9,9,9,0,52,37,117,16,53,57,28,320,9,331,9,321,
-323,-75,323,9,303,11,291,17,283,27,279,40,278,57,278,274,280,293,283,307,291,315,304,319,323,321,323,331,47,331,47,321,62,320,75,316,83,308,88,295,90,275,87,172,79,97,65,46,45,18,17,9,7,9,7,-75,19,-75,19,-72,20,-67,21,-60,23,-54,24,-49,32,-29,43,-15,56,-5,71,0,259,0,274,-5,287,-15,298,-29,306,-49,307,-54,308,-60,309,-67,310,-72,311,-75,16383,16383,228,41,227,33,225,27,222,22,217,20,209,19,76,19,91,48,101,88,108,141,112,209,113,294,113,303,115,308,119,311,124,312,210,312,217,311,222,310,225,306,227,301,228,294,304,84,290,84,276,57,260,38,239,27,211,21,174,19,137,19,122,21,113,25,107,32,105,42,105,164,181,164,203,162,218,158,227,150,234,136,238,115,249,115,249,232,238,232,234,211,227,198,218,189,203,185,181,184,105,184,105,294,106,302,108,307,111,310,116,312,189,312,218,311,239,306,252,297,261,282,266,259,278,259,276,331,11,331,11,321,30,320,43,315,50,307,54,294,55,275,55,57,54,37,50,24,43,16,30,12,11,9,11,0,281,0,507,0,507,9,476,18,453,32,435,52,417,79,394,113,382,130,370,144,359,155,345,164,330,172,329,173,342,181,354,193,
+323,-75,323,9,303,11,291,17,283,27,279,40,278,57,278,274,280,293,283,307,291,315,304,319,323,321,323,331,47,331,47,321,62,320,75,316,83,308,88,295,90,275,87,172,79,97,65,46,45,18,17,9,7,9,7,-75,19,-75,19,-72,20,-67,21,-60,23,-54,24,-49,32,-29,43,-15,56,-5,71,0,259,0,274,-5,287,-15,298,-29,306,-49,307,-54,308,-60,309,-67,310,-72,311,-75,16383,16383,228,41,227,33,225,27,222,22,217,20,209,19,76,19,91,48,101,88,108,141,112,209,113,294,113,303,115,308,119,311,124,312,210,312,217,311,222,310,225,306,227,301,228,294,
 20,-67,21,-60,17,9,17,9,21,-60,23,-54,17,9,23,-54,24,-49,24,-49,32,-29,45,18,45,18,32,-29,43,-15,45,18,43,-15,56,-5,62,320,75,316,323,331,323,331,75,316,124,312,323,331,124,312,131,312,323,331,131,312,210,312,323,331,210,312,217,311,87,172,91,48,90,275,90,275,91,48,113,303,113,303,91,48,113,294,71,0,87,0,76,19,71,0,76,19,79,97,79,97,76,19,91,48,79,97,91,48,87,172,65,46,45,18,56,-5,65,46,56,-5,71,0,65,46,71,0,79,97,45,18,17,9,24,-49,17,9,7,9,19,-75,17,9,19,-75,19,-72,17,9,19,-72,20,-67,323,331,217,311,222,310,323,331,222,310,225,306,323,331,225,306,227,301,323,331,227,301,228,294,323,331,228,294,291,315,323,331,291,315,304,319,323,331,304,319,323,321,291,17,283,27,287,-15,287,-15,283,27,279,40,287,-15,279,40,274,-5,274,-5,279,40,278,57,274,-5,278,57,278,274,228,294,243,0,280,293,280,293,243,0,259,0,280,293,259,0,278,274,278,274,259,0,274,-5,283,307,291,315,228,294,283,307,228,294,280,293,113,294,91,48,101,88,113,294,101,88,108,141,113,294,108,141,112,209,124,312,83,308,119,311,119,311,83,308,88,295,119,311,88,295,115,308,115,308,88,295,90,275,115,308,90,275,113,303,47,331,47,321,62,320,47,331,62,320,323,331,308,-60,323,9,307,-54,307,-54,323,9,306,-49,298,-29,306,-49,303,11,298,-29,303,11,291,17,323,9,308,-60,309,-67,323,9,309,-67,310,-72,323,9,310,-72,311,-75,323,9,311,-75,323,-75,323,9,303,11,306,-49,209,19,76,19,87,0,209,19,87,0,243,0,209,19,243,0,217,20,243,0,228,294,228,41,243,0,228,41,227,33,243,0,227,33,225,27,243,0,225,27,222,22,243,0,222,22,217,20,19,-75,7,9,7,-75,291,17,287,-15,298,-29,124,312,75,316,83,308,
-304,84,290,84,276,57,260,38,239,27,211,21,174,19,137,19,122,21,113,25,107,32,105,42,105,164,181,164,203,162,218,158,227,150,234,136,238,115,249,115,249,232,238,232,234,211,227,198,218,189,203,185,181,184,105,184,105,294,106,302,108,307,111,310,116,312,189,312,218,311,239,306,252,297,261,282,266,259,278,259,276,331,11,331,11,321,30,320,43,315,50,307,54,294,55,275,55,57,54,37,50,24,43,16,30,12,11,9,11,0,281,0,507,0,507,9,476,18,453,32,435,52,417,79,394,113,382,130,370,144,359,155,345,164,330,172,329,173,342,181,354,193,364,209,373,228,382,251,388,266,394,280,401,293,410,301,419,305,425,302,430,295,435,286,443,279,457,276,466,278,473,283,478,289,481,297,482,305,480,315,475,324,467,331,456,336,442,338,419,335,401,325,388,309,376,290,367,267,356,239,345,216,331,197,310,185,280,181,280,293,283,307,291,315,304,319,325,321,325,331,186,331,186,321,
+304,84,290,84,276,57,260,38,239,27,211,21,174,19,137,19,122,21,113,25,107,32,105,42,105,164,181,164,203,162,218,158,227,150,234,136,238,115,249,115,249,232,238,232,234,211,227,198,218,189,203,185,181,184,105,184,105,294,106,302,108,307,111,310,116,312,189,312,218,311,239,306,252,297,261,282,266,259,278,259,276,331,11,331,11,321,30,320,43,315,50,307,54,294,55,275,55,57,54,37,50,24,43,16,30,12,11,9,11,0,281,0,
 50,24,43,16,281,0,281,0,43,16,30,12,281,0,30,12,11,9,54,294,55,275,111,310,54,294,111,310,50,307,50,307,111,310,116,312,50,307,116,312,276,331,276,331,116,312,123,312,50,24,122,21,54,37,54,37,122,21,113,25,54,37,113,25,55,57,55,57,113,25,107,32,55,57,107,32,55,275,55,275,107,32,105,42,55,275,105,42,105,294,105,184,105,164,181,164,105,184,181,164,181,184,203,185,181,184,203,162,203,185,203,162,218,189,218,189,203,162,218,158,218,189,218,158,227,198,227,198,218,158,227,150,227,198,227,150,234,211,234,211,227,150,234,136,234,211,234,136,238,232,238,232,234,136,238,115,238,232,238,115,249,115,276,331,123,312,189,312,276,331,189,312,218,311,276,331,218,311,239,306,276,331,239,306,252,297,276,331,252,297,261,282,276,331,261,282,266,259,276,331,266,259,278,259,55,275,105,294,106,302,55,275,106,302,108,307,55,275,108,307,111,310,276,331,11,331,30,320,276,331,30,320,43,315,276,331,43,315,50,307,260,38,239,27,281,0,281,0,239,27,211,21,281,0,211,21,174,19,281,0,304,84,290,84,281,0,290,84,276,57,281,0,276,57,260,38,281,0,174,19,156,19,281,0,156,19,137,19,281,0,137,19,122,21,281,0,122,21,50,24,281,0,11,9,11,0,30,320,11,331,11,321,181,184,181,164,203,162,238,232,249,115,249,232,
-507,0,507,9,476,18,453,32,435,52,417,79,394,113,382,130,370,144,359,155,345,164,330,172,329,173,342,181,354,193,364,209,373,228,382,251,388,266,394,280,401,293,410,301,419,305,425,302,430,295,435,286,443,279,457,276,466,278,473,283,478,289,481,297,482,305,480,315,475,324,467,331,456,336,442,338,419,335,401,325,388,309,376,290,367,267,356,239,345,216,331,197,310,185,280,181,280,293,283,307,291,315,304,319,325,321,325,331,186,331,186,321,206,320,220,315,227,307,230,294,231,275,231,181,203,185,182,197,167,216,154,239,143,267,134,290,123,309,109,325,91,335,68,338,54,336,43,331,35,324,30,315,28,305,29,297,32,289,37,283,44,278,53,276,67,279,75,286,80,295,85,302,91,305,100,301,109,293,115,280,122,266,128,251,137,228,146,209,156,193,168,181,181,173,180,172,165,164,152,155,140,144,129,130,117,113,94,79,75,52,57,32,35,18,4,9,4,0,99,0,109,10,120,23,131,40,144,60,158,84,177,116,190,138,201,152,213,159,231,161,231,55,230,36,228,23,222,16,210,11,193,9,193,0,323,0,323,9,305,12,292,16,284,23,281,36,280,55,280,161,297,159,309,152,320,138,333,116,352,84,367,60,380,40,391,23,401,10,411,0,177,175,201,180,222,192,240,208,251,229,256,253,252,281,239,304,217,322,185,334,142,338,131,338,121,337,111,335,100,333,89,330,83,328,67,324,60,322,54,321,49,322,44,324,40,328,37,332,35,338,25,338,23,220,35,220,43,253,56,280,76,301,101,314,131,319,156,316,176,308,191,294,201,277,204,257,204,245,201,232,196,219,188,207,175,196,165,191,155,187,143,185,127,183,104,183,104,163,128,163,146,161,160,158,172,153,184,146,194,138,202,129,209,118,213,105,215,91,211,64,201,43,183,28,159,18,128,15,105,17,85,23,65,33,44,47,23,65,14,57,32,35,54,17,80,4,109,-3,141,-6,160,-6,177,-3,193,0,208,5,223,13,239,25,253,39,264,55,270,74,272,95,267,121,252,142,230,158,204,169,177,174,352,0,352,9,333,12,320,17,312,25,309,37,307,55,307,274,309,293,312,307,320,315,333,319,352,321,352,331,212,331,212,321,230,319,242,315,251,309,255,299,257,285,105,82,105,274,106,294,110,307,118,315,131,319,150,321,150,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,148,9,131,11,118,16,110,23,106,33,105,48,257,252,257,62,256,41,252,26,245,17,
+507,0,507,9,476,18,453,32,435,52,417,79,394,113,382,130,370,144,359,155,345,164,330,172,329,173,342,181,354,193,364,209,373,228,382,251,388,266,394,280,401,293,410,301,419,305,425,302,430,295,435,286,443,279,457,276,466,278,473,283,478,289,481,297,482,305,480,315,475,324,467,331,456,336,442,338,419,335,401,325,388,309,376,290,367,267,356,239,345,216,331,197,310,185,280,181,280,293,283,307,291,315,304,319,325,321,325,331,186,331,186,321,206,320,220,315,227,307,230,294,231,275,231,181,203,185,182,197,167,216,154,239,143,267,134,290,123,309,109,325,91,335,68,338,54,336,43,331,35,324,30,315,28,305,29,297,32,289,37,283,44,278,53,276,67,279,75,286,80,295,85,302,91,305,100,301,109,293,115,280,122,266,128,251,137,228,146,209,156,193,168,181,181,173,180,172,165,164,152,155,140,144,129,130,117,113,94,79,75,52,57,32,35,18,4,9,4,0,99,0,109,10,120,23,131,40,144,60,158,84,177,116,190,138,201,152,213,159,231,161,231,55,230,36,228,23,222,16,210,11,193,9,193,0,323,0,323,9,305,12,292,16,284,23,281,36,280,55,280,161,297,159,309,152,320,138,333,116,352,84,367,60,380,40,391,23,401,10,411,0,
 75,52,57,32,99,0,99,0,57,32,35,18,99,0,35,18,4,9,75,286,80,295,91,335,91,335,80,295,85,302,91,335,85,302,91,305,91,305,100,301,109,325,109,325,100,301,109,293,109,325,109,293,115,280,44,278,53,276,54,336,54,336,53,276,67,279,54,336,67,279,68,338,68,338,67,279,75,286,68,338,75,286,91,335,28,305,29,297,30,315,30,315,29,297,32,289,30,315,32,289,35,324,35,324,32,289,37,283,35,324,37,283,43,331,43,331,37,283,44,278,43,331,44,278,54,336,115,280,122,266,123,309,123,309,122,266,128,251,123,309,128,251,134,290,134,290,128,251,137,228,134,290,137,228,143,267,143,267,137,228,146,209,143,267,146,209,154,239,154,239,146,209,156,193,154,239,156,193,167,216,167,216,156,193,168,181,167,216,168,181,182,197,182,197,168,181,181,173,182,197,181,173,190,138,190,138,181,173,180,172,228,23,222,16,323,0,323,0,222,16,210,11,323,0,210,11,193,9,304,319,325,321,325,331,304,319,325,331,291,315,291,315,325,331,230,294,291,315,230,294,231,275,231,161,231,275,231,181,231,161,284,23,281,36,323,0,323,9,305,12,323,0,305,12,292,16,323,0,292,16,230,36,323,0,230,36,228,23,280,55,280,181,231,161,280,55,231,161,281,36,231,55,230,36,292,16,231,55,292,16,284,23,231,55,284,23,231,161,280,161,297,159,280,181,280,181,280,274,231,161,231,161,280,274,280,293,231,161,280,293,283,307,283,307,291,315,231,275,283,307,231,275,231,161,325,331,186,331,206,320,325,331,206,320,220,315,325,331,220,315,227,307,325,331,227,307,230,294,453,32,435,52,411,0,411,0,435,52,417,79,411,0,417,79,401,10,401,10,417,79,394,113,401,10,394,113,391,23,391,23,394,113,382,130,391,23,382,130,380,40,380,40,382,130,370,144,380,40,370,144,367,60,367,60,370,144,359,155,367,60,359,155,352,84,352,84,359,155,345,164,352,84,345,164,333,116,333,116,345,164,330,172,333,116,330,172,329,173,476,18,453,32,411,0,476,18,411,0,507,0,476,18,507,0,507,9,320,138,329,173,331,197,331,197,329,173,342,181,331,197,342,181,345,216,345,216,342,181,354,193,345,216,354,193,356,239,356,239,354,193,364,209,356,239,364,209,367,267,367,267,364,209,373,228,367,267,373,228,376,290,376,290,373,228,382,251,376,290,382,251,388,309,388,309,382,251,388,266,388,309,388,266,401,325,401,325,388,266,394,280,401,325,394,280,401,293,310,185,280,181,297,159,310,185,297,159,309,152,310,185,309,152,320,138,310,185,320,138,331,197,442,338,419,335,425,302,425,302,419,335,419,305,410,301,419,305,419,335,410,301,419,335,401,325,457,276,466,278,467,331,467,331,466,278,473,283,467,331,473,283,475,324,475,324,473,283,478,289,475,324,478,289,480,315,480,315,478,289,481,297,480,315,481,297,482,305,430,295,435,286,442,338,442,338,435,286,443,279,442,338,443,279,456,336,456,336,443,279,457,276,456,336,457,276,467,331,190,138,201,152,203,185,203,185,201,152,213,159,203,185,213,159,231,181,231,181,213,159,231,161,99,0,109,10,117,113,117,113,109,10,120,23,117,113,120,23,129,130,129,130,120,23,131,40,129,130,131,40,140,144,140,144,131,40,144,60,140,144,144,60,152,155,152,155,144,60,158,84,152,155,158,84,165,164,165,164,158,84,177,116,165,164,177,116,180,172,180,172,177,116,190,138,94,79,75,52,99,0,94,79,99,0,117,113,109,325,91,335,91,305,109,325,115,280,123,309,99,0,4,9,4,0,182,197,190,138,203,185,333,116,329,173,320,138,442,338,425,302,430,295,401,325,401,293,410,301,206,320,186,331,186,321,323,0,193,9,193,0,
-177,175,201,180,222,192,240,208,251,229,256,253,252,281,239,304,217,322,185,334,142,338,131,338,121,337,111,335,100,333,89,330,83,328,67,324,60,322,54,321,49,322,44,324,40,328,37,332,35,338,25,338,23,220,35,220,43,253,56,280,76,301,101,314,131,319,156,316,176,308,191,294,201,277,204,257,204,245,201,232,196,219,188,207,175,196,165,191,155,187,143,185,127,183,104,183,104,163,128,163,146,161,160,158,172,153,184,146,194,138,202,129,209,118,213,105,215,91,211,64,201,43,183,28,159,18,128,15,105,17,85,23,65,33,44,47,23,65,14,57,32,35,54,17,80,4,109,-3,141,-6,160,-6,177,-3,193,0,208,5,223,13,239,25,253,39,264,55,270,74,272,95,267,121,252,142,230,158,204,169,177,174,352,0,352,9,333,12,320,17,312,25,309,37,307,55,307,274,309,293,312,307,320,315,333,319,352,321,352,331,212,331,212,321,230,319,242,315,251,309,255,299,257,285,105,82,105,274,106,294,110,307,118,315,131,319,150,321,150,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,148,9,131,11,118,16,110,23,106,33,105,48,257,252,257,62,256,41,252,26,245,17,232,12,213,9,213,0,248,424,246,436,242,445,235,452,227,456,219,458,211,456,208,453,206,450,205,445,207,438,213,434,225,430,227,425,226,418,221,413,212,408,199,406,180,405,162,406,149,408,140,413,135,418,134,425,136,430,148,434,154,438,156,445,156,450,154,453,151,456,148,457,
+177,175,201,180,222,192,240,208,251,229,256,253,252,281,239,304,217,322,185,334,142,338,131,338,121,337,111,335,100,333,89,330,83,328,67,324,60,322,54,321,49,322,44,324,40,328,37,332,35,338,25,338,23,220,35,220,43,253,56,280,76,301,101,314,131,319,156,316,176,308,191,294,201,277,204,257,204,245,201,232,196,219,188,207,175,196,165,191,155,187,143,185,127,183,104,183,104,163,128,163,146,161,160,158,172,153,184,146,194,138,202,129,209,118,213,105,215,91,211,64,201,43,183,28,159,18,128,15,105,17,85,23,65,33,44,47,23,65,14,57,32,35,54,17,80,4,109,-3,141,-6,160,-6,177,-3,193,0,208,5,223,13,239,25,253,39,264,55,270,74,272,95,267,121,252,142,230,158,204,169,177,174,
 40,328,43,253,44,324,44,324,43,253,56,280,44,324,56,280,49,322,49,322,56,280,54,321,60,322,54,321,56,280,60,322,56,280,76,301,201,232,196,219,201,180,201,180,196,219,188,207,201,180,188,207,177,175,177,175,188,207,175,196,177,175,175,196,177,174,177,174,175,196,172,153,172,153,175,196,165,191,172,153,165,191,160,158,160,158,165,191,155,187,160,158,155,187,146,161,146,161,155,187,143,185,146,161,143,185,128,163,128,163,143,185,127,183,128,163,127,183,104,183,23,65,32,35,44,47,44,47,32,35,54,17,44,47,54,17,65,33,65,33,54,17,80,4,65,33,80,4,85,23,85,23,80,4,109,-3,85,23,109,-3,105,17,105,17,109,-3,128,15,159,18,128,15,141,-6,159,18,141,-6,160,-6,131,319,121,337,111,335,131,319,111,335,101,314,131,319,131,338,121,337,101,314,111,335,100,333,101,314,100,333,89,330,101,314,89,330,83,328,101,314,83,328,76,301,76,301,83,328,75,326,76,301,75,326,67,324,76,301,67,324,60,322,156,316,176,308,185,334,185,334,176,308,191,294,185,334,191,294,217,322,217,322,191,294,201,277,217,322,201,277,204,257,204,257,204,245,222,192,222,192,204,245,201,232,222,192,201,232,201,180,156,316,185,334,142,338,156,316,142,338,131,338,156,316,131,338,131,319,217,322,222,192,239,304,239,304,222,192,240,208,239,304,240,208,252,281,252,281,240,208,251,229,252,281,251,229,256,253,204,257,222,192,217,322,177,174,172,153,184,146,184,146,194,138,204,169,204,169,194,138,202,129,204,169,202,129,209,118,267,121,252,142,253,39,267,121,253,39,264,55,267,121,264,55,270,74,267,121,270,74,272,95,160,-6,177,-3,183,28,183,28,177,-3,193,0,183,28,193,0,201,43,201,43,193,0,208,5,201,43,208,5,211,64,211,64,208,5,223,13,211,64,223,13,215,91,215,91,223,13,230,158,230,158,223,13,239,25,230,158,239,25,252,142,252,142,239,25,253,39,204,169,209,118,230,158,230,158,209,118,213,105,230,158,213,105,215,91,204,169,177,174,184,146,128,15,109,-3,141,-6,40,328,37,332,43,253,43,253,37,332,35,338,43,253,35,338,35,220,35,220,35,338,25,338,35,220,25,338,23,220,32,35,23,65,14,57,159,18,160,-6,183,28,128,163,104,183,104,163,
-352,0,352,9,333,12,320,17,312,25,309,37,307,55,307,274,309,293,312,307,320,315,333,319,352,321,352,331,212,331,212,321,230,319,242,315,251,309,255,299,257,285,105,82,105,274,106,294,110,307,118,315,131,319,150,321,150,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,148,9,131,11,118,16,110,23,106,33,105,48,257,252,257,62,256,41,252,26,245,17,232,12,213,9,213,0,248,424,246,436,242,445,235,452,227,456,219,458,211,456,208,453,206,450,205,445,207,438,213,434,225,430,227,425,226,418,221,413,212,408,199,406,180,405,162,406,149,408,140,413,135,418,134,425,136,430,148,434,154,438,156,445,156,450,154,453,151,456,148,457,144,458,135,456,127,452,120,445,115,436,113,424,117,408,129,395,145,386,163,380,180,378,198,380,216,385,232,395,243,407,248,424,16383,16383,352,0,352,9,333,12,320,17,312,25,309,37,307,55,307,274,309,293,
+352,0,352,9,333,12,320,17,312,25,309,37,307,55,307,274,309,293,312,307,320,315,333,319,352,321,352,331,212,331,212,321,230,319,242,315,251,309,255,299,257,285,105,82,105,274,106,294,110,307,118,315,131,319,150,321,150,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,148,9,131,11,118,16,110,23,106,33,105,48,257,252,257,62,256,41,252,26,245,17,232,12,213,9,213,0,
 50,25,42,16,149,0,149,0,42,16,29,12,149,0,29,12,9,9,257,285,105,82,105,48,105,48,105,274,54,274,54,274,105,274,106,294,54,274,106,294,110,307,150,331,9,331,29,319,150,331,29,319,42,315,150,331,42,315,50,307,150,331,50,307,53,294,150,331,53,294,118,315,150,331,118,315,131,319,150,331,131,319,150,321,54,274,110,307,118,315,54,274,118,315,53,294,252,26,245,17,352,0,352,0,245,17,232,12,352,0,232,12,213,9,242,315,251,309,352,331,352,331,251,309,255,299,352,331,255,299,257,285,257,285,257,252,309,37,309,37,257,252,257,62,309,37,257,62,312,25,312,25,257,62,320,17,333,319,352,321,352,331,333,319,352,331,320,315,320,315,352,331,257,285,320,315,257,285,312,307,312,307,257,285,309,293,307,55,307,274,257,285,307,55,257,285,309,37,230,319,242,315,352,331,230,319,352,331,212,331,230,319,212,331,212,321,352,0,352,9,333,12,352,0,333,12,320,17,352,0,320,17,256,41,352,0,256,41,252,26,149,0,148,9,131,11,149,0,131,11,118,16,149,0,118,16,53,39,149,0,53,39,50,25,106,33,105,48,54,274,106,33,54,274,54,61,106,33,54,61,110,23,54,61,53,39,118,16,54,61,118,16,110,23,149,0,9,9,9,0,352,0,213,9,213,0,256,41,320,17,257,62,309,293,257,285,307,274,257,285,105,48,257,252,29,319,9,331,9,321,
-248,424,246,436,242,445,235,452,227,456,219,458,211,456,208,453,206,450,205,445,207,438,213,434,225,430,227,425,226,418,221,413,212,408,199,406,180,405,162,406,149,408,140,413,135,418,134,425,136,430,148,434,154,438,156,445,156,450,154,453,151,456,148,457,144,458,135,456,127,452,120,445,115,436,113,424,117,408,129,395,145,386,163,380,180,378,198,380,216,385,232,395,243,407,248,424,16383,16383,352,0,352,9,333,12,320,17,312,25,309,37,307,55,307,274,309,293,312,307,320,315,333,319,352,321,352,331,212,331,212,321,230,319,242,316,250,310,254,300,256,285,105,82,105,274,106,294,110,307,118,315,131,319,150,321,150,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,148,9,131,11,119,15,111,22,107,33,105,48,257,252,257,62,256,41,252,26,245,17,232,12,213,9,213,0,343,0,343,9,321,13,312,17,302,23,292,30,282,40,271,54,259,71,246,92,230,114,218,131,206,145,193,155,180,164,164,171,164,172,178,181,190,193,201,208,211,227,220,251,225,266,232,281,239,294,247,303,257,306,263,303,267,296,272,287,281,280,294,277,303,279,310,284,315,291,318,299,319,306,317,317,313,325,305,332,295,337,281,338,257,335,239,325,224,309,213,290,204,267,196,245,187,226,176,209,162,195,142,185,137,183,131,182,124,181,106,181,106,274,107,293,110,307,117,315,130,319,151,321,151,331,10,331,10,321,30,319,43,315,51,306,54,293,55,275,55,65,54,42,51,27,43,17,29,12,9,9,9,0,151,0,151,9,132,12,119,16,111,23,107,36,106,55,106,161,113,161,119,160,125,158,130,156,134,154,140,149,149,140,160,126,174,108,189,85,203,61,216,40,227,24,238,10,248,0,332,0,332,9,313,12,300,17,292,25,288,37,287,55,
+248,424,246,436,242,445,235,452,227,456,219,458,211,456,208,453,206,450,205,445,207,438,213,434,225,430,227,425,226,418,221,413,212,408,199,406,180,405,162,406,149,408,140,413,135,418,134,425,136,430,148,434,154,438,156,445,156,450,154,453,151,456,148,457,144,458,135,456,127,452,120,445,115,436,113,424,117,408,129,395,145,386,163,380,180,378,198,380,216,385,232,395,243,407,248,424,16383,16383,352,0,352,9,333,12,320,17,312,25,309,37,307,55,307,274,309,293,312,307,320,315,333,319,352,321,352,331,212,331,212,321,230,319,242,316,250,310,254,300,256,285,105,82,105,274,106,294,110,307,118,315,131,319,150,321,150,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,148,9,131,11,119,15,111,22,107,33,105,48,257,252,257,62,256,41,252,26,245,17,232,12,213,9,213,0,
 149,408,140,413,145,386,145,386,140,413,135,418,145,386,135,418,129,395,129,395,135,418,134,425,135,456,134,425,136,430,135,456,136,430,144,458,144,458,136,430,142,432,144,458,142,432,148,434,148,457,148,434,151,456,151,456,148,434,154,438,151,456,154,438,154,453,154,453,154,438,156,445,154,453,156,445,156,450,129,395,134,425,135,456,129,395,135,456,127,452,129,395,127,452,120,445,129,395,120,445,117,408,115,436,113,424,117,408,115,436,117,408,120,445,149,408,163,380,162,406,162,406,163,380,180,405,199,406,180,405,180,378,199,406,180,378,198,380,246,436,242,445,243,407,243,407,242,445,235,452,243,407,235,452,232,395,232,395,235,452,227,456,232,395,227,456,227,425,227,456,219,458,219,432,227,456,219,432,225,430,227,456,225,430,227,425,215,457,211,456,213,434,215,457,213,434,219,432,215,457,219,432,219,458,208,453,206,450,207,438,208,453,207,438,213,434,208,453,213,434,211,456,227,425,226,418,232,395,232,395,226,418,221,413,232,395,221,413,216,385,216,385,221,413,212,408,216,385,212,408,199,406,180,405,163,380,180,378,50,25,42,16,149,0,149,0,42,16,29,12,149,0,29,12,9,9,119,15,111,22,54,61,54,61,111,22,107,33,54,61,107,33,54,274,54,274,107,33,105,48,105,82,105,48,256,285,150,331,9,331,29,319,150,331,29,319,42,315,150,331,42,315,50,307,150,331,50,307,53,294,150,331,53,294,118,315,150,331,118,315,131,319,150,331,131,319,150,321,105,274,106,294,54,274,105,274,54,274,105,48,105,274,105,48,105,82,54,274,106,294,110,307,54,274,110,307,118,315,54,274,118,315,53,294,252,26,245,17,352,0,352,0,245,17,232,12,352,0,232,12,213,9,352,331,212,331,230,319,352,331,230,319,242,316,352,331,242,316,250,310,352,331,250,310,254,300,352,331,254,300,256,285,352,331,256,285,320,315,352,331,320,315,333,319,352,331,333,319,352,321,320,17,312,25,257,62,257,62,312,25,309,37,257,62,309,37,257,252,257,252,309,37,307,55,257,252,307,55,307,274,257,252,307,274,309,293,257,252,309,293,312,307,257,252,312,307,320,315,257,252,320,315,256,285,257,252,256,285,105,48,352,0,352,9,333,12,352,0,333,12,320,17,352,0,320,17,256,41,352,0,256,41,252,26,149,0,148,9,131,11,149,0,131,11,119,15,149,0,119,15,53,39,149,0,53,39,50,25,149,0,9,9,9,0,53,39,119,15,54,61,352,0,213,9,213,0,256,41,320,17,257,62,230,319,212,331,212,321,29,319,9,331,9,321,199,406,198,380,216,385,246,436,243,407,248,424,207,438,206,450,205,445,149,408,145,386,163,380,144,458,148,434,148,457,
-343,0,343,9,321,13,312,17,302,23,292,30,282,40,271,54,259,71,246,92,230,114,218,131,206,145,193,155,180,164,164,171,164,172,178,181,190,193,201,208,211,227,220,251,225,266,232,281,239,294,247,303,257,306,263,303,267,296,272,287,281,280,294,277,303,279,310,284,315,291,318,299,319,306,317,317,313,325,305,332,295,337,281,338,257,335,239,325,224,309,213,290,204,267,196,245,187,226,176,209,162,195,142,185,137,183,131,182,124,181,106,181,106,274,107,293,110,307,117,315,130,319,151,321,151,331,10,331,10,321,30,319,43,315,51,306,54,293,55,275,55,65,54,42,51,27,43,17,29,12,9,9,9,0,151,0,151,9,132,12,119,16,111,23,107,36,106,55,106,161,113,161,119,160,125,158,130,156,134,154,140,149,149,140,160,126,174,108,189,85,203,61,216,40,227,24,238,10,248,0,332,0,332,9,313,12,300,17,292,25,288,37,287,55,287,274,288,293,292,307,300,315,313,319,332,321,332,331,65,331,65,321,80,320,93,316,101,308,107,295,108,275,108,112,105,78,100,47,89,26,73,17,65,21,54,43,46,53,32,57,25,56,18,53,11,48,6,40,4,30,7,14,14,4,25,-2,39,-5,55,-6,92,2,114,27,126,60,130,97,131,131,131,292,132,300,133,305,136,309,141,311,148,312,219,312,226,311,231,309,234,305,236,300,237,292,237,63,236,41,232,26,225,17,212,12,193,9,193,0,435,0,435,9,417,12,404,17,397,25,393,38,392,56,392,275,393,294,397,307,404,316,417,320,435,321,435,331,335,331,225,80,109,331,11,331,11,321,31,319,45,315,53,307,57,294,58,275,58,75,57,47,53,29,44,18,30,12,9,9,9,0,127,0,127,9,107,12,94,18,85,29,
+343,0,343,9,321,13,312,17,302,23,292,30,282,40,271,54,259,71,246,92,230,114,218,131,206,145,193,155,180,164,164,171,164,172,178,181,190,193,201,208,211,227,220,251,225,266,232,281,239,294,247,303,257,306,263,303,267,296,272,287,281,280,294,277,303,279,310,284,315,291,318,299,319,306,317,317,313,325,305,332,295,337,281,338,257,335,239,325,224,309,213,290,204,267,196,245,187,226,176,209,162,195,142,185,137,183,131,182,124,181,106,181,106,274,107,293,110,307,117,315,130,319,151,321,151,331,10,331,10,321,30,319,43,315,51,306,54,293,55,275,55,65,54,42,51,27,43,17,29,12,9,9,9,0,151,0,151,9,132,12,119,16,111,23,107,36,106,55,106,161,113,161,119,160,125,158,130,156,134,154,140,149,149,140,160,126,174,108,189,85,203,61,216,40,227,24,238,10,248,0,
 151,0,151,9,132,12,151,0,132,12,119,16,151,0,119,16,54,42,151,0,54,42,51,27,151,0,51,27,43,17,151,0,43,17,29,12,151,0,29,12,9,9,151,0,9,9,9,0,55,275,107,36,106,55,106,181,106,161,113,161,55,275,106,55,106,181,106,181,113,161,116,181,116,181,113,161,119,160,116,181,119,160,124,181,124,181,119,160,125,158,124,181,125,158,131,182,131,182,125,158,130,156,131,182,130,156,134,154,134,154,140,149,137,183,137,183,140,149,142,185,162,195,142,185,149,140,162,195,149,140,160,126,55,65,54,42,119,16,55,65,119,16,111,23,55,65,111,23,107,36,55,65,107,36,55,275,151,331,10,331,30,319,151,331,30,319,43,315,151,331,43,315,51,306,151,331,51,306,54,293,151,331,54,293,117,315,151,331,117,315,130,319,151,331,130,319,151,321,106,274,107,293,55,275,106,274,55,275,106,181,55,275,107,293,110,307,55,275,110,307,117,315,55,275,117,315,54,293,137,183,131,182,134,154,196,245,187,226,190,193,196,245,190,193,201,208,196,245,201,208,204,267,190,193,187,226,178,181,178,181,187,226,176,209,178,181,176,209,164,172,164,172,176,209,162,195,164,172,162,195,164,171,164,171,162,195,160,126,164,171,160,126,174,108,225,266,232,281,239,325,239,325,232,281,239,294,239,325,239,294,257,335,257,335,239,294,247,303,257,335,247,303,257,306,257,306,263,303,257,335,257,335,263,303,281,338,204,267,211,227,213,290,213,290,211,227,220,251,213,290,220,251,224,309,224,309,220,251,225,266,224,309,225,266,239,325,332,11,321,13,343,0,343,0,321,13,312,17,343,0,312,17,248,0,248,0,312,17,302,23,248,0,302,23,292,30,292,30,282,40,248,0,248,0,282,40,271,54,248,0,271,54,259,71,193,155,189,85,203,61,193,155,203,61,206,145,206,145,203,61,216,40,206,145,216,40,218,131,218,131,216,40,227,24,218,131,227,24,230,114,230,114,227,24,238,10,230,114,238,10,246,92,246,92,238,10,248,0,246,92,248,0,259,71,272,287,281,280,281,338,281,338,281,280,294,277,281,338,294,277,295,337,295,337,294,277,303,279,295,337,303,279,305,332,305,332,303,279,310,284,305,332,310,284,313,325,313,325,310,284,315,291,313,325,315,291,317,317,317,317,315,291,318,299,317,317,318,299,319,306,281,338,263,303,267,296,281,338,267,296,272,287,180,164,164,171,174,108,180,164,174,108,189,85,180,164,189,85,193,155,142,185,140,149,149,140,332,11,343,0,343,9,211,227,204,267,201,208,30,319,10,331,10,321,
-332,0,332,9,313,12,300,17,292,25,288,37,287,55,287,274,288,293,292,307,300,315,313,319,332,321,332,331,65,331,65,321,80,320,93,316,101,308,107,295,108,275,108,112,105,78,100,47,89,26,73,17,65,21,54,43,46,53,32,57,25,56,18,53,11,48,6,40,4,30,7,14,14,4,25,-2,39,-5,55,-6,92,2,114,27,126,60,130,97,131,131,131,292,132,300,133,305,136,309,141,311,148,312,219,312,226,311,231,309,234,305,236,300,237,292,237,63,236,41,232,26,225,17,212,12,193,9,193,0,435,0,435,9,417,12,404,17,397,25,393,38,392,56,392,275,393,294,397,307,404,316,417,320,435,321,435,331,335,331,225,80,109,331,11,331,11,321,31,319,45,315,53,307,57,294,58,275,58,75,57,47,53,29,44,18,30,12,9,9,9,0,127,0,127,9,107,12,94,18,85,29,81,48,80,75,80,275,206,0,213,0,340,286,340,40,336,26,328,17,315,12,296,9,296,0,352,0,352,9,333,12,320,17,312,25,309,37,307,55,307,274,309,293,312,307,320,315,333,319,352,321,352,331,213,331,213,321,
+332,0,332,9,313,12,300,17,292,25,288,37,287,55,287,274,288,293,292,307,300,315,313,319,332,321,332,331,65,331,65,321,80,320,93,316,101,308,107,295,108,275,108,112,105,78,100,47,89,26,73,17,65,21,54,43,46,53,32,57,25,56,18,53,11,48,6,40,4,30,7,14,14,4,25,-2,39,-5,55,-6,92,2,114,27,126,60,130,97,131,131,131,292,132,300,133,305,136,309,141,311,148,312,219,312,226,311,231,309,234,305,236,300,237,292,237,63,236,41,232,26,225,17,212,12,193,9,193,0,
 108,112,105,78,114,27,114,27,105,78,100,47,114,27,100,47,92,2,92,2,100,47,89,26,92,2,89,26,73,17,73,17,65,21,92,2,92,2,65,21,55,-6,107,295,108,275,136,309,107,295,136,309,101,308,101,308,136,309,141,311,101,308,141,311,332,331,332,331,141,311,148,312,232,26,225,17,332,0,332,0,225,17,212,12,332,0,212,12,193,9,332,331,148,312,219,312,332,331,219,312,226,311,332,331,226,311,231,309,332,331,231,309,234,305,332,331,234,305,236,300,332,331,236,300,237,292,332,331,237,292,300,315,332,331,300,315,313,319,332,331,313,319,332,321,287,55,287,274,237,292,237,292,287,274,288,293,237,292,288,293,292,307,300,17,292,25,237,63,237,63,292,25,288,37,237,63,288,37,237,292,131,292,132,300,114,27,131,292,114,27,126,60,131,292,126,60,130,97,131,292,130,97,131,131,108,275,108,145,114,27,108,275,114,27,132,300,108,275,132,300,133,305,108,275,133,305,136,309,332,331,65,331,80,320,332,331,80,320,93,316,332,331,93,316,101,308,332,0,332,9,313,12,332,0,313,12,300,17,332,0,300,17,236,41,332,0,236,41,232,26,55,-6,65,21,60,31,55,-6,60,31,54,43,55,-6,54,43,46,53,55,-6,46,53,39,-5,46,53,32,57,39,-5,39,-5,32,57,25,56,39,-5,25,56,25,-2,25,-2,25,56,18,53,25,-2,18,53,14,4,14,4,18,53,11,48,14,4,11,48,7,14,7,14,11,48,6,40,7,14,6,40,4,30,108,112,114,27,108,145,332,0,193,9,193,0,236,41,300,17,237,63,237,292,288,37,287,55,80,320,65,331,65,321,300,315,237,292,292,307,
-435,0,435,9,417,12,404,17,397,25,393,38,392,56,392,275,393,294,397,307,404,316,417,320,435,321,435,331,335,331,225,80,109,331,11,331,11,321,31,319,45,315,53,307,57,294,58,275,58,75,57,47,53,29,44,18,30,12,9,9,9,0,127,0,127,9,107,12,94,18,85,29,81,48,80,75,80,275,206,0,213,0,340,286,340,40,336,26,328,17,315,12,296,9,296,0,352,0,352,9,333,12,320,17,312,25,309,37,307,55,307,274,309,293,312,307,320,315,333,319,352,321,352,331,213,331,213,321,232,319,245,315,252,307,256,294,257,274,257,180,105,180,105,274,106,294,110,307,118,315,130,319,149,321,149,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,149,9,130,12,118,17,
+435,0,435,9,417,12,404,17,397,25,393,38,392,56,392,275,393,294,397,307,404,316,417,320,435,321,435,331,335,331,225,80,109,331,11,331,11,321,31,319,45,315,53,307,57,294,58,275,58,75,57,47,53,29,44,18,30,12,9,9,9,0,127,0,127,9,107,12,94,18,85,29,81,48,80,75,80,275,206,0,213,0,340,286,340,40,336,26,328,17,315,12,296,9,296,0,
 53,29,44,18,127,0,127,0,44,18,30,12,127,0,30,12,9,9,336,26,328,17,435,0,435,0,328,17,315,12,435,0,315,12,296,9,417,320,435,321,435,331,417,320,435,331,404,316,404,316,435,331,340,286,404,316,340,286,397,307,397,307,340,286,393,294,404,17,397,25,340,61,340,61,397,25,393,38,340,61,393,38,340,286,340,286,393,38,392,56,340,286,392,56,392,275,206,0,213,0,225,80,225,80,213,0,340,286,225,80,340,286,335,331,335,331,340,286,435,331,109,331,11,331,31,319,109,331,31,319,45,315,109,331,45,315,53,307,109,331,53,307,57,294,109,331,57,294,58,275,109,331,58,275,80,275,109,331,80,275,206,0,109,331,206,0,225,80,80,75,80,275,58,275,80,75,58,275,81,48,81,48,58,275,58,75,81,48,58,75,85,29,85,29,58,75,57,47,85,29,57,47,94,18,94,18,57,47,53,29,94,18,53,29,127,0,435,0,435,9,417,12,435,0,417,12,404,17,435,0,404,17,340,40,435,0,340,40,336,26,107,12,94,18,127,0,107,12,127,0,127,9,127,0,9,9,9,0,435,0,296,9,296,0,340,40,404,17,340,61,31,319,11,331,11,321,393,294,340,286,392,275,
-352,0,352,9,333,12,320,17,312,25,309,37,307,55,307,274,309,293,312,307,320,315,333,319,352,321,352,331,213,331,213,321,232,319,245,315,252,307,256,294,257,274,257,180,105,180,105,274,106,294,110,307,118,315,130,319,149,321,149,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,149,9,130,12,118,17,110,25,106,38,105,56,105,157,257,157,257,62,256,41,252,26,245,17,232,12,213,9,213,0,345,166,337,222,316,269,281,306,236,330,181,338,127,330,82,307,47,271,26,224,18,167,26,109,47,61,82,24,127,1,181,-6,235,1,280,24,315,60,337,108,345,166,16383,16383,288,169,286,134,281,103,273,76,261,53,247,35,235,26,223,19,210,15,197,12,182,11,168,12,155,15,143,19,131,25,120,33,103,52,91,75,82,102,77,132,75,166,76,194,81,222,88,247,98,269,109,286,122,298,135,308,150,314,165,318,181,320,194,319,207,316,220,311,231,305,243,296,258,279,271,257,
+352,0,352,9,333,12,320,17,312,25,309,37,307,55,307,274,309,293,312,307,320,315,333,319,352,321,352,331,213,331,213,321,232,319,245,315,252,307,256,294,257,274,257,180,105,180,105,274,106,294,110,307,118,315,130,319,149,321,149,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,149,9,130,12,118,17,110,25,106,38,105,56,105,157,257,157,257,62,256,41,252,26,245,17,232,12,213,9,213,0,
 50,25,42,16,149,0,149,0,42,16,29,12,149,0,29,12,9,9,149,331,9,331,29,319,149,331,29,319,42,315,149,331,42,315,50,307,149,331,50,307,53,294,149,331,53,294,118,315,149,331,118,315,130,319,149,331,130,319,149,321,54,274,106,38,105,56,105,180,105,157,257,157,105,180,257,157,257,180,257,180,257,157,312,25,257,180,312,25,309,37,54,274,105,56,105,274,54,274,105,274,106,294,54,274,106,294,110,307,54,274,110,307,118,315,54,274,118,315,53,294,252,26,245,17,352,0,352,0,245,17,232,12,352,0,232,12,213,9,333,319,352,321,352,331,333,319,352,331,320,315,320,315,352,331,256,294,320,315,256,294,257,274,309,37,257,274,257,180,307,55,307,274,257,274,257,274,307,274,309,293,257,274,309,293,312,307,352,331,213,331,232,319,352,331,232,319,245,315,352,331,245,315,252,307,352,331,252,307,256,294,352,0,352,9,333,12,352,0,333,12,320,17,352,0,320,17,256,41,352,0,256,41,252,26,257,62,256,41,320,17,257,62,320,17,312,25,257,62,312,25,257,157,149,0,149,9,130,12,149,0,130,12,118,17,149,0,118,17,53,39,149,0,53,39,50,25,54,61,53,39,118,17,54,61,118,17,110,25,54,61,110,25,106,38,54,61,106,38,54,274,149,0,9,9,9,0,352,0,213,9,213,0,257,274,309,37,307,55,232,319,213,331,213,321,320,315,257,274,312,307,29,319,9,331,9,321,
-345,166,337,222,316,269,281,306,236,330,181,338,127,330,82,307,47,271,26,224,18,167,26,109,47,61,82,24,127,1,181,-6,235,1,280,24,315,60,337,108,345,166,16383,16383,288,169,286,134,281,103,273,76,261,53,247,35,235,26,223,19,210,15,197,12,182,11,168,12,155,15,143,19,131,25,120,33,103,52,91,75,82,102,77,132,75,166,76,194,81,222,88,247,98,269,109,286,122,298,135,308,150,314,165,318,181,320,194,319,207,316,220,311,231,305,243,296,258,279,271,257,280,231,286,201,288,169,353,0,353,9,333,12,321,17,313,25,309,37,308,55,308,274,309,293,313,307,321,315,334,319,353,321,353,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,149,9,130,12,118,17,110,25,106,38,105,56,105,300,107,306,111,309,116,311,124,312,238,312,246,311,251,309,255,306,257,300,257,62,256,41,253,26,246,17,233,12,213,9,213,0,9,331,9,321,28,319,40,315,47,307,51,294,51,39,48,25,41,16,29,12,9,9,
+345,166,337,222,316,269,281,306,236,330,181,338,127,330,82,307,47,271,26,224,18,167,26,109,47,61,82,24,127,1,181,-6,235,1,280,24,315,60,337,108,345,166,16383,16383,288,169,286,134,281,103,273,76,261,53,247,35,235,26,223,19,210,15,197,12,182,11,168,12,155,15,143,19,131,25,120,33,103,52,91,75,82,102,77,132,75,166,76,194,81,222,88,247,98,269,109,286,122,298,135,308,150,314,165,318,181,320,194,319,207,316,220,311,231,305,243,296,258,279,271,257,280,231,286,201,288,169,
 150,314,181,338,135,308,135,308,181,338,127,330,135,308,127,330,122,298,122,298,127,330,109,286,98,269,109,286,127,330,98,269,127,330,82,307,82,102,82,24,91,75,91,75,82,24,127,1,91,75,127,1,103,52,103,52,127,1,120,33,131,25,120,33,127,1,131,25,127,1,181,-6,236,330,181,338,194,319,194,319,181,338,181,320,165,318,181,320,181,338,165,318,181,338,150,314,223,19,210,15,235,1,235,1,210,15,197,12,235,1,197,12,182,11,182,11,168,12,181,-6,181,-6,168,12,155,15,181,-6,155,15,143,19,207,316,220,311,236,330,236,330,220,311,231,305,236,330,231,305,243,296,243,296,258,279,281,306,281,306,258,279,271,257,281,306,271,257,280,231,281,103,273,76,280,24,280,24,273,76,261,53,280,24,261,53,247,35,247,35,235,26,280,24,280,24,235,26,235,1,345,166,337,222,337,108,337,108,337,222,316,269,337,108,316,269,315,60,315,60,316,269,288,169,286,201,288,169,316,269,286,201,316,269,281,306,286,201,281,306,280,231,281,306,236,330,243,296,315,60,288,169,286,134,315,60,286,134,281,103,315,60,281,103,280,24,182,11,181,-6,235,1,82,307,47,271,47,61,82,307,47,61,75,166,82,307,75,166,76,194,82,307,76,194,81,222,82,307,81,222,88,247,82,307,88,247,98,269,82,102,77,132,82,24,82,24,77,132,75,166,26,109,47,61,47,271,26,109,47,271,26,224,26,109,26,224,18,167,82,24,75,166,47,61,223,19,235,1,235,26,236,330,194,319,207,316,131,25,181,-6,143,19,
-353,0,353,9,333,12,321,17,313,25,309,37,308,55,308,274,309,293,313,307,321,315,334,319,353,321,353,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,149,9,130,12,118,17,110,25,106,38,105,56,105,300,107,306,111,309,116,311,124,312,238,312,246,311,251,309,255,306,257,300,257,62,256,41,253,26,246,17,233,12,213,9,213,0,9,331,9,321,28,319,40,315,47,307,51,294,51,39,48,25,41,16,29,12,9,9,9,0,150,0,150,9,129,12,115,16,107,24,104,37,103,56,103,146,110,145,115,145,120,144,132,144,161,145,184,147,204,153,221,161,239,175,249,185,257,197,263,210,266,225,267,240,266,254,263,268,258,280,252,291,243,300,227,310,209,319,187,325,162,329,134,331,16383,16383,103,294,103,301,105,306,108,310,113,311,120,312,156,309,
+353,0,353,9,333,12,321,17,313,25,309,37,308,55,308,274,309,293,313,307,321,315,334,319,353,321,353,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,149,9,130,12,118,17,110,25,106,38,105,56,105,300,107,306,111,309,116,311,124,312,238,312,246,311,251,309,255,306,257,300,257,62,256,41,253,26,246,17,233,12,213,9,213,0,
 50,25,42,16,149,0,149,0,42,16,29,12,149,0,29,12,9,9,42,315,50,307,353,331,353,331,50,307,116,311,353,331,116,311,124,312,353,331,124,312,238,312,353,331,238,312,246,311,253,26,246,17,353,0,353,0,246,17,233,12,353,0,233,12,213,9,353,331,246,311,251,309,353,331,251,309,255,306,353,331,255,306,257,300,353,331,257,300,257,292,353,331,257,292,321,315,353,331,321,315,334,319,353,331,334,319,353,321,308,55,308,274,257,292,257,292,308,274,309,293,257,292,309,293,313,307,321,17,313,25,257,62,257,62,313,25,309,37,257,62,309,37,257,292,118,17,110,25,54,61,54,61,110,25,106,38,54,61,106,38,54,274,54,274,106,38,105,56,54,274,105,56,105,291,54,274,105,291,105,300,54,274,105,300,107,306,54,274,107,306,111,309,54,274,111,309,53,294,116,311,50,307,53,294,116,311,53,294,111,309,29,319,42,315,353,331,29,319,353,331,9,331,29,319,9,331,9,321,353,0,353,9,333,12,353,0,333,12,321,17,353,0,321,17,256,41,353,0,256,41,253,26,149,0,149,9,130,12,149,0,130,12,118,17,149,0,118,17,53,39,149,0,53,39,50,25,149,0,9,9,9,0,53,39,118,17,54,61,353,0,213,9,213,0,256,41,321,17,257,62,257,292,309,37,308,55,321,315,257,292,313,307,
-9,331,9,321,28,319,40,315,47,307,51,294,51,39,48,25,41,16,29,12,9,9,9,0,150,0,150,9,129,12,115,16,107,24,104,37,103,56,103,146,110,145,115,145,120,144,132,144,161,145,184,147,204,153,221,161,239,175,249,185,257,197,263,210,266,225,267,240,266,254,263,268,258,280,252,291,243,300,227,310,209,319,187,325,162,329,134,331,16383,16383,103,294,103,301,105,306,108,310,113,311,120,312,156,309,182,302,200,287,210,266,213,238,210,213,199,192,182,177,158,167,128,164,118,164,113,165,109,165,103,166,311,65,289,47,269,32,248,23,226,17,201,15,180,17,161,21,143,28,126,38,112,51,99,68,89,88,82,112,77,140,76,171,81,219,96,260,121,291,154,311,196,318,215,316,232,311,248,304,263,293,276,280,283,272,289,263,294,252,299,240,302,224,314,224,310,338,300,338,297,332,289,324,284,322,278,321,273,322,266,324,258,326,244,330,232,333,208,337,196,338,185,338,157,336,131,330,106,320,83,305,63,286,47,266,35,243,26,218,20,191,18,162,20,133,26,106,36,80,49,57,66,37,85,22,107,9,131,0,157,-4,
+9,331,9,321,28,319,40,315,47,307,51,294,51,39,48,25,41,16,29,12,9,9,9,0,150,0,150,9,129,12,115,16,107,24,104,37,103,56,103,146,110,145,115,145,120,144,132,144,161,145,184,147,204,153,221,161,239,175,249,185,257,197,263,210,266,225,267,240,266,254,263,268,258,280,252,291,243,300,227,310,209,319,187,325,162,329,134,331,16383,16383,103,294,103,301,105,306,108,310,113,311,120,312,156,309,182,302,200,287,210,266,213,238,210,213,199,192,182,177,158,167,128,164,118,164,113,165,109,165,103,166,
 113,311,120,312,120,312,134,331,120,312,156,309,134,331,156,309,162,329,162,329,156,309,182,302,162,329,182,302,187,325,187,325,182,302,200,287,187,325,200,287,209,319,209,319,200,287,210,266,209,319,210,266,227,310,227,310,210,266,213,238,227,310,213,238,221,161,221,161,210,213,204,153,204,153,210,213,199,192,204,153,199,192,184,147,184,147,199,192,182,177,184,147,182,177,161,145,161,145,182,177,158,167,161,145,158,167,132,144,132,144,158,167,128,164,132,144,128,164,125,144,125,144,128,164,122,164,125,144,122,164,120,144,120,144,122,164,118,164,120,144,118,164,115,145,115,145,118,164,113,165,115,145,113,165,110,145,110,145,113,165,109,165,110,145,109,165,103,146,103,146,109,165,103,166,103,146,103,166,103,56,103,56,103,166,51,276,103,56,51,276,104,37,104,37,51,276,51,61,267,240,266,254,266,225,266,225,266,254,263,268,266,225,263,268,263,210,263,210,263,268,258,280,263,210,258,280,257,197,257,197,258,280,252,291,257,197,252,291,249,185,249,185,252,291,243,300,249,185,243,300,239,175,239,175,243,300,227,310,239,175,227,310,221,161,134,331,9,331,28,319,134,331,28,319,40,315,134,331,40,315,47,307,134,331,47,307,51,294,134,331,51,294,51,276,134,331,51,276,108,310,134,331,108,310,113,311,134,331,113,311,120,312,103,294,103,301,51,276,103,294,51,276,103,166,105,306,108,310,51,276,105,306,51,276,103,301,150,0,150,9,129,12,150,0,129,12,115,16,150,0,115,16,51,39,150,0,51,39,48,25,150,0,48,25,41,16,150,0,41,16,29,12,150,0,29,12,9,9,150,0,9,9,9,0,51,61,51,39,115,16,51,61,115,16,107,24,51,61,107,24,104,37,28,319,9,331,9,321,210,213,221,161,213,238,
-311,65,289,47,269,32,248,23,226,17,201,15,180,17,161,21,143,28,126,38,112,51,99,68,89,88,82,112,77,140,76,171,81,219,96,260,121,291,154,311,196,318,215,316,232,311,248,304,263,293,276,280,283,272,289,263,294,252,299,240,302,224,314,224,310,338,300,338,297,332,289,324,284,322,278,321,273,322,266,324,258,326,244,330,232,333,208,337,196,338,185,338,157,336,131,330,106,320,83,305,63,286,47,266,35,243,26,218,20,191,18,162,20,133,26,106,36,80,49,57,66,37,85,22,107,9,131,0,157,-4,184,-6,218,-4,249,3,277,16,301,34,320,56,296,246,292,331,18,331,15,246,27,246,33,274,42,292,54,303,73,309,100,310,130,310,130,61,129,39,125,25,117,16,104,12,83,9,83,0,229,0,229,9,208,11,194,16,186,23,182,36,181,55,181,310,210,310,237,309,256,303,269,292,277,274,284,246,347,331,243,331,243,322,254,320,263,316,269,312,273,306,274,299,273,292,271,284,268,273,263,260,257,245,204,118,132,245,123,262,110,288,107,297,106,303,107,309,112,314,119,318,129,321,142,322,142,331,7,331,7,322,15,320,27,316,37,310,42,305,46,300,51,294,61,278,181,67,172,53,163,41,154,33,146,28,
+311,65,289,47,269,32,248,23,226,17,201,15,180,17,161,21,143,28,126,38,112,51,99,68,89,88,82,112,77,140,76,171,81,219,96,260,121,291,154,311,196,318,215,316,232,311,248,304,263,293,276,280,283,272,289,263,294,252,299,240,302,224,314,224,310,338,300,338,297,332,289,324,284,322,278,321,273,322,266,324,258,326,244,330,232,333,208,337,196,338,185,338,157,336,131,330,106,320,83,305,63,286,47,266,35,243,26,218,20,191,18,162,20,133,26,106,36,80,49,57,66,37,85,22,107,9,131,0,157,-4,184,-6,218,-4,249,3,277,16,301,34,320,56,
 66,37,77,140,76,171,76,171,83,305,66,37,66,37,83,305,63,286,66,37,63,286,49,57,49,57,63,286,47,266,49,57,47,266,36,80,36,80,47,266,35,243,36,80,35,243,26,106,26,106,35,243,26,218,26,106,26,218,20,133,20,133,26,218,20,191,20,133,20,191,18,162,82,112,85,22,89,88,89,88,85,22,107,9,89,88,107,9,99,68,99,68,107,9,112,51,126,38,112,51,131,0,126,38,131,0,143,28,143,28,131,0,157,-4,143,28,157,-4,161,21,161,21,157,-4,184,-6,161,21,184,-6,180,17,180,17,184,-6,201,15,226,17,201,15,218,-4,226,17,218,-4,249,3,77,140,66,37,85,22,77,140,85,22,82,112,112,51,107,9,131,0,258,326,263,293,266,324,266,324,263,293,276,280,266,324,276,280,273,322,273,322,276,280,278,321,284,322,278,321,283,272,284,322,283,272,289,263,278,321,276,280,283,272,232,333,232,311,244,330,244,330,232,311,248,304,244,330,248,304,251,328,251,328,248,304,263,293,251,328,263,293,258,326,220,335,208,337,215,316,220,335,215,316,232,311,220,335,232,311,232,333,208,337,196,338,215,316,215,316,196,338,196,318,154,311,196,318,157,336,154,311,157,336,131,330,314,224,310,338,302,224,302,224,310,338,300,338,302,224,300,338,299,240,299,240,300,338,297,332,299,240,297,332,294,252,294,252,297,332,293,328,294,252,293,328,289,263,289,263,293,328,289,324,289,263,289,324,284,322,320,56,311,65,301,34,301,34,311,65,289,47,301,34,289,47,277,16,277,16,289,47,269,32,277,16,269,32,249,3,249,3,269,32,248,23,249,3,248,23,226,17,201,15,184,-6,218,-4,196,318,196,338,185,338,196,318,185,338,157,336,76,171,81,219,83,305,83,305,81,219,96,260,83,305,96,260,106,320,106,320,96,260,121,291,106,320,121,291,131,330,131,330,121,291,154,311,
-296,246,292,331,18,331,15,246,27,246,33,274,42,292,54,303,73,309,100,310,130,310,130,61,129,39,125,25,117,16,104,12,83,9,83,0,229,0,229,9,208,11,194,16,186,23,182,36,181,55,181,310,210,310,237,309,256,303,269,292,277,274,284,246,347,331,243,331,243,322,254,320,263,316,269,312,273,306,274,299,273,292,271,284,268,273,263,260,257,245,204,118,132,245,123,262,110,288,107,297,106,303,107,309,112,314,119,318,129,321,142,322,142,331,7,331,7,322,15,320,27,316,37,310,42,305,46,300,
+296,246,292,331,18,331,15,246,27,246,33,274,42,292,54,303,73,309,100,310,130,310,130,61,129,39,125,25,117,16,104,12,83,9,83,0,229,0,229,9,208,11,194,16,186,23,182,36,181,55,181,310,210,310,237,309,256,303,269,292,277,274,284,246,
 292,331,18,331,73,309,292,331,73,309,100,310,292,331,100,310,130,310,292,331,130,310,181,310,292,331,181,310,210,310,292,331,210,310,237,309,292,331,237,309,256,303,292,331,256,303,269,292,292,331,269,292,277,274,292,331,277,274,284,246,292,331,284,246,296,246,194,16,186,23,130,61,130,61,186,23,182,36,130,61,182,36,130,310,130,310,182,36,181,55,130,310,181,55,181,310,18,331,15,246,27,246,18,331,27,246,33,274,18,331,33,274,42,292,18,331,42,292,54,303,18,331,54,303,73,309,229,0,229,9,208,11,229,0,208,11,194,16,229,0,194,16,129,39,229,0,129,39,125,25,229,0,125,25,117,16,229,0,117,16,104,12,229,0,104,12,83,9,229,0,83,9,83,0,129,39,194,16,130,61,
-347,331,243,331,243,322,254,320,263,316,269,312,273,306,274,299,273,292,271,284,268,273,263,260,257,245,204,118,132,245,123,262,110,288,107,297,106,303,107,309,112,314,119,318,129,321,142,322,142,331,7,331,7,322,15,320,27,316,37,310,42,305,46,300,51,294,61,278,181,67,172,53,163,41,154,33,146,28,138,27,136,27,133,28,131,29,127,30,124,32,118,35,108,39,104,40,99,41,92,40,85,37,80,32,77,26,76,20,78,10,84,3,93,-2,104,-5,117,-6,132,-4,147,0,161,9,175,22,188,40,194,51,202,65,210,81,219,100,228,122,291,272,300,289,310,302,321,312,333,319,347,322,218,290,219,301,223,310,232,316,247,320,269,321,269,331,116,331,116,321,138,320,152,317,161,311,165,302,166,290,166,280,124,276,84,263,50,241,27,209,19,165,24,128,41,97,69,72,107,57,158,51,166,51,166,37,164,27,158,19,148,14,134,10,116,9,116,0,269,0,269,9,248,11,233,14,224,19,219,27,218,38,218,51,230,51,265,56,302,69,334,91,357,123,366,165,357,209,333,241,300,263,260,276,218,280,16383,16383,217,262,251,256,278,240,296,216,307,188,311,159,305,128,291,103,270,85,244,74,217,70,16383,16383,167,70,135,75,108,88,89,107,78,132,74,159,78,189,91,216,111,240,136,256,
+347,331,243,331,243,322,254,320,263,316,269,312,273,306,274,299,273,292,271,284,268,273,263,260,257,245,204,118,132,245,123,262,110,288,107,297,106,303,107,309,112,314,119,318,129,321,142,322,142,331,7,331,7,322,15,320,27,316,37,310,42,305,46,300,51,294,61,278,181,67,172,53,163,41,154,33,146,28,138,27,136,27,133,28,131,29,127,30,124,32,118,35,108,39,104,40,99,41,92,40,85,37,80,32,77,26,76,20,78,10,84,3,93,-2,104,-5,117,-6,132,-4,147,0,161,9,175,22,188,40,194,51,202,65,210,81,219,100,228,122,291,272,300,289,310,302,321,312,333,319,347,322,
 21,318,27,316,142,331,142,331,27,316,32,313,142,331,32,313,37,310,37,310,42,305,142,331,142,331,42,305,46,300,142,331,46,300,51,294,61,278,181,67,107,297,61,278,107,297,106,303,106,303,107,309,61,278,61,278,107,309,112,314,61,278,112,314,56,286,142,331,51,294,56,286,142,331,56,286,112,314,142,331,112,314,119,318,142,331,119,318,129,321,142,331,129,321,142,322,15,320,21,318,142,331,15,320,142,331,7,331,15,320,7,331,7,322,133,28,131,29,132,-4,132,-4,131,29,127,30,132,-4,127,30,124,32,124,32,118,35,132,-4,132,-4,118,35,117,-6,181,67,172,53,175,22,175,22,172,53,163,41,175,22,163,41,161,9,161,9,163,41,154,33,161,9,154,33,147,0,147,0,154,33,146,28,147,0,146,28,138,27,138,27,136,27,147,0,147,0,136,27,133,28,147,0,133,28,132,-4,257,245,204,118,210,81,257,245,210,81,219,100,257,245,219,100,228,122,257,245,228,122,291,272,347,331,243,331,254,320,347,331,254,320,263,316,347,331,263,316,269,312,347,331,269,312,273,306,347,331,273,306,274,299,347,331,274,299,321,312,347,331,321,312,333,319,347,331,333,319,347,322,291,272,300,289,274,299,291,272,274,299,273,292,291,272,273,292,271,284,291,272,271,284,268,273,291,272,268,273,263,260,291,272,263,260,257,245,310,302,321,312,274,299,310,302,274,299,300,289,204,118,132,245,181,67,204,118,181,67,188,40,204,118,188,40,194,51,204,118,194,51,202,65,204,118,202,65,210,81,181,67,132,245,123,262,181,67,123,262,116,276,181,67,116,276,110,288,181,67,110,288,107,297,118,35,113,37,117,-6,117,-6,113,37,108,39,117,-6,108,39,104,-5,104,-5,108,39,104,40,104,-5,104,40,99,41,93,-2,104,-5,99,41,93,-2,99,41,92,40,93,-2,92,40,85,37,93,-2,85,37,84,3,80,32,77,26,78,10,80,32,78,10,84,3,80,32,84,3,85,37,78,10,77,26,76,20,181,67,175,22,188,40,254,320,243,331,243,322,
-218,290,219,301,223,310,232,316,247,320,269,321,269,331,116,331,116,321,138,320,152,317,161,311,165,302,166,290,166,280,124,276,84,263,50,241,27,209,19,165,24,128,41,97,69,72,107,57,158,51,166,51,166,37,164,27,158,19,148,14,134,10,116,9,116,0,269,0,269,9,248,11,233,14,224,19,219,27,218,38,218,51,230,51,265,56,302,69,334,91,357,123,366,165,357,209,333,241,300,263,260,276,218,280,16383,16383,217,262,251,256,278,240,296,216,307,188,311,159,305,128,291,103,270,85,244,74,217,70,16383,16383,167,70,135,75,108,88,89,107,78,132,74,159,78,189,91,216,111,240,136,256,167,262,352,0,352,9,337,12,326,16,316,22,306,32,296,46,200,184,272,272,289,292,303,305,316,314,330,319,348,321,348,331,229,331,229,321,243,320,253,319,259,316,262,311,263,305,262,301,260,296,256,290,250,282,243,272,187,202,165,234,151,255,139,272,130,286,125,297,123,306,124,312,127,316,132,319,139,320,147,320,161,321,161,331,11,331,11,321,28,319,43,312,58,299,77,276,102,242,155,164,77,66,57,42,42,26,30,17,18,12,4,9,4,0,121,0,121,9,105,11,95,13,88,17,84,21,83,26,84,31,87,38,92,46,99,57,109,70,169,145,216,74,225,60,232,48,238,38,241,31,242,25,241,20,
+218,290,219,301,223,310,232,316,247,320,269,321,269,331,116,331,116,321,138,320,152,317,161,311,165,302,166,290,166,280,124,276,84,263,50,241,27,209,19,165,24,128,41,97,69,72,107,57,158,51,166,51,166,37,164,27,158,19,148,14,134,10,116,9,116,0,269,0,269,9,248,11,233,14,224,19,219,27,218,38,218,51,230,51,265,56,302,69,334,91,357,123,366,165,357,209,333,241,300,263,260,276,218,280,16383,16383,217,262,251,256,278,240,296,216,307,188,311,159,305,128,291,103,270,85,244,74,217,70,16383,16383,167,70,135,75,108,88,89,107,78,132,74,159,78,189,91,216,111,240,136,256,167,262,
 269,321,269,321,247,320,247,320,269,321,269,331,247,320,269,331,232,316,232,316,269,331,166,290,232,316,166,290,223,310,223,310,166,290,167,262,219,27,167,262,167,70,219,27,167,70,224,19,224,19,167,70,166,51,224,19,166,51,166,37,218,38,217,70,167,262,167,262,217,70,217,262,167,262,217,262,218,290,218,290,217,262,218,280,219,301,223,310,167,262,219,301,167,262,218,290,166,290,269,331,165,302,269,331,116,331,138,320,269,331,138,320,152,317,269,331,152,317,161,311,269,331,161,311,165,302,91,216,111,240,124,276,124,276,111,240,136,256,124,276,136,256,166,280,166,280,136,256,167,262,166,280,167,262,166,290,84,263,50,241,74,159,84,263,74,159,78,189,84,263,78,189,91,216,84,263,91,216,124,276,19,165,24,128,27,209,27,209,24,128,41,97,27,209,41,97,50,241,50,241,41,97,69,72,50,241,69,72,74,159,334,91,311,159,305,128,334,91,305,128,302,69,302,69,305,128,291,103,302,69,291,103,270,85,307,188,311,159,333,241,333,241,311,159,334,91,333,241,334,91,357,209,357,209,334,91,357,123,357,209,357,123,366,165,300,263,260,276,278,240,300,263,278,240,296,216,300,263,296,216,307,188,300,263,307,188,333,241,251,256,278,240,260,276,251,256,260,276,218,280,251,256,218,280,217,262,218,51,230,51,244,74,244,74,230,51,265,56,244,74,265,56,270,85,270,85,265,56,302,69,218,38,167,262,219,27,218,38,218,51,217,70,269,0,269,9,248,11,269,0,248,11,233,14,269,0,233,14,166,37,269,0,166,37,164,27,269,0,164,27,158,19,269,0,158,19,148,14,269,0,148,14,134,10,269,0,134,10,116,9,269,0,116,9,116,0,158,51,166,51,167,70,158,51,167,70,135,75,158,51,135,75,108,88,158,51,108,88,107,57,74,159,69,72,78,132,78,132,69,72,107,57,78,132,107,57,89,107,89,107,107,57,108,88,166,37,233,14,224,19,217,70,218,51,244,74,138,320,116,331,116,321,
-352,0,352,9,337,12,326,16,316,22,306,32,296,46,200,184,272,272,289,292,303,305,316,314,330,319,348,321,348,331,229,331,229,321,243,320,253,319,259,316,262,311,263,305,262,301,260,296,256,290,250,282,243,272,187,202,165,234,151,255,139,272,130,286,125,297,123,306,124,312,127,316,132,319,139,320,147,320,161,321,161,331,11,331,11,321,28,319,43,312,58,299,77,276,102,242,155,164,77,66,57,42,42,26,30,17,18,12,4,9,4,0,121,0,121,9,105,11,95,13,88,17,84,21,83,26,84,31,87,38,92,46,99,57,109,70,169,145,216,74,225,60,232,48,238,38,241,31,242,25,241,20,237,16,232,14,225,12,217,11,204,9,204,0,348,-75,348,9,329,12,316,16,308,24,305,37,304,57,304,292,308,306,316,315,329,319,348,321,348,331,209,331,209,321,228,319,240,315,248,306,251,293,252,275,252,28,250,23,247,21,242,19,115,19,110,21,107,23,105,28,105,269,106,290,109,305,117,314,129,319,149,321,149,331,9,331,9,321,28,319,41,314,49,306,53,294,54,276,54,57,53,37,49,24,41,16,28,12,9,9,9,0,284,0,299,-5,312,-15,323,-29,331,-49,332,-54,333,-60,335,-67,335,-72,336,-75,320,0,320,9,301,12,288,16,280,24,276,37,275,57,275,269,276,291,280,306,288,315,301,319,320,321,320,331,186,331,186,321,204,319,214,316,221,309,223,299,224,283,224,174,216,170,
+352,0,352,9,337,12,326,16,316,22,306,32,296,46,200,184,272,272,289,292,303,305,316,314,330,319,348,321,348,331,229,331,229,321,243,320,253,319,259,316,262,311,263,305,262,301,260,296,256,290,250,282,243,272,187,202,165,234,151,255,139,272,130,286,125,297,123,306,124,312,127,316,132,319,139,320,147,320,161,321,161,331,11,331,11,321,28,319,43,312,58,299,77,276,102,242,155,164,77,66,57,42,42,26,30,17,18,12,4,9,4,0,121,0,121,9,105,11,95,13,88,17,84,21,83,26,84,31,87,38,92,46,99,57,109,70,169,145,216,74,225,60,232,48,238,38,241,31,242,25,241,20,237,16,232,14,225,12,217,11,204,9,204,0,
 30,17,121,0,42,26,42,26,121,0,88,17,42,26,88,17,57,42,57,42,88,17,84,21,57,42,84,21,83,26,83,26,84,31,77,66,77,66,84,31,87,38,77,66,87,38,155,164,155,164,87,38,92,46,155,164,92,46,99,57,102,242,155,164,125,297,102,242,125,297,123,306,123,306,124,312,102,242,155,164,99,57,109,70,109,70,169,145,155,164,155,164,169,145,165,234,155,164,165,234,151,255,77,66,57,42,83,26,161,331,11,331,28,319,161,331,28,319,43,312,161,331,43,312,58,299,161,331,58,299,132,319,161,331,132,319,139,320,161,331,139,320,147,320,161,331,147,320,161,321,132,319,58,299,127,316,127,316,58,299,77,276,127,316,77,276,124,312,124,312,77,276,102,242,260,296,256,290,272,272,272,272,256,290,250,282,272,272,250,282,243,272,243,272,187,202,200,184,200,184,187,202,216,74,200,184,216,74,296,46,296,46,216,74,225,60,296,46,225,60,232,48,348,331,229,331,243,320,348,331,243,320,253,319,348,331,253,319,259,316,348,331,259,316,262,311,348,331,262,311,263,305,348,331,263,305,316,314,348,331,316,314,330,319,348,331,330,319,348,321,263,305,272,272,289,292,263,305,289,292,303,305,263,305,303,305,316,314,262,301,260,296,272,272,262,301,272,272,263,305,243,272,200,184,272,272,237,16,232,14,352,0,352,0,232,14,225,12,352,0,225,12,217,11,242,25,352,0,326,16,242,25,326,16,316,22,242,25,316,22,306,32,242,25,306,32,296,46,242,25,296,46,241,31,296,46,232,48,238,38,296,46,238,38,241,31,187,202,165,234,169,145,187,202,169,145,216,74,337,12,326,16,352,0,337,12,352,0,352,9,241,20,237,16,352,0,241,20,352,0,242,25,204,9,204,0,352,0,204,9,352,0,217,11,155,164,151,255,139,272,155,164,139,272,130,286,155,164,130,286,125,297,121,0,121,9,105,11,121,0,105,11,95,13,121,0,95,13,88,17,18,12,4,9,121,0,18,12,121,0,30,17,121,0,4,9,4,0,243,320,229,331,229,321,28,319,11,331,11,321,
-348,-75,348,9,329,12,316,16,308,24,305,37,304,57,304,292,308,306,316,315,329,319,348,321,348,331,209,331,209,321,228,319,240,315,248,306,251,293,252,275,252,28,250,23,247,21,242,19,115,19,110,21,107,23,105,28,105,269,106,290,109,305,117,314,129,319,149,321,149,331,9,331,9,321,28,319,41,314,49,306,53,294,54,276,54,57,53,37,49,24,41,16,28,12,9,9,9,0,284,0,299,-5,312,-15,323,-29,331,-49,332,-54,333,-60,335,-67,335,-72,336,-75,320,0,320,9,301,12,288,16,280,24,276,37,275,57,275,269,276,291,280,306,288,315,301,319,320,321,320,331,186,331,186,321,204,319,214,316,221,309,223,299,224,283,224,174,216,170,204,166,190,161,173,158,155,156,132,158,116,165,105,176,99,193,97,216,97,273,98,294,101,307,109,315,121,319,139,321,139,331,2,331,2,321,21,319,34,315,41,307,45,293,46,273,46,211,50,178,62,155,80,142,104,136,133,134,157,136,178,140,197,145,212,152,224,157,224,57,223,37,
+348,-75,348,9,329,12,316,16,308,24,305,37,304,57,304,292,308,306,316,315,329,319,348,321,348,331,209,331,209,321,228,319,240,315,248,306,251,293,252,275,252,28,250,23,247,21,242,19,115,19,110,21,107,23,105,28,105,269,106,290,109,305,117,314,129,319,149,321,149,331,9,331,9,321,28,319,41,314,49,306,53,294,54,276,54,57,53,37,49,24,41,16,28,12,9,9,9,0,284,0,299,-5,312,-15,323,-29,331,-49,332,-54,333,-60,335,-67,335,-72,336,-75,
 49,24,41,16,268,0,268,0,41,16,28,12,268,0,28,12,9,9,149,331,9,331,28,319,149,331,28,319,41,314,149,331,41,314,49,306,149,331,49,306,53,294,149,331,53,294,117,314,149,331,117,314,129,319,149,331,129,319,149,321,110,21,107,23,54,57,54,57,107,23,105,28,54,57,105,28,54,276,54,276,105,28,105,34,54,276,105,34,105,269,54,276,105,269,106,290,54,276,106,290,109,305,54,276,109,305,117,314,54,276,117,314,53,294,329,319,348,321,348,331,329,319,348,331,316,315,316,315,348,331,251,293,316,315,251,293,252,275,268,0,252,275,252,35,268,0,252,35,252,28,316,16,308,24,312,-15,312,-15,308,24,305,37,312,-15,305,37,299,-5,299,-5,305,37,304,57,299,-5,304,57,304,270,252,275,268,0,304,292,304,292,268,0,284,0,304,292,284,0,304,270,304,270,284,0,299,-5,308,306,316,315,252,275,308,306,252,275,304,292,348,331,209,331,228,319,348,331,228,319,240,315,348,331,240,315,248,306,348,331,248,306,251,293,333,-60,348,9,332,-54,332,-54,348,9,331,-49,323,-29,331,-49,329,12,323,-29,329,12,316,16,348,9,333,-60,335,-67,348,9,335,-67,335,-72,348,9,335,-72,336,-75,348,9,336,-75,348,-75,348,9,329,12,331,-49,268,0,252,28,250,23,268,0,250,23,247,21,268,0,247,21,242,19,268,0,242,19,235,19,268,0,235,19,123,19,268,0,123,19,115,19,268,0,115,19,49,24,110,21,54,57,53,37,110,21,53,37,49,24,110,21,49,24,115,19,268,0,9,9,9,0,316,16,312,-15,323,-29,228,319,209,331,209,321,28,319,9,331,9,321,
-320,0,320,9,301,12,288,16,280,24,276,37,275,57,275,269,276,291,280,306,288,315,301,319,320,321,320,331,186,331,186,321,204,319,214,316,221,309,223,299,224,283,224,174,216,170,204,166,190,161,173,158,155,156,132,158,116,165,105,176,99,193,97,216,97,273,98,294,101,307,109,315,121,319,139,321,139,331,2,331,2,321,21,319,34,315,41,307,45,293,46,273,46,211,50,178,62,155,80,142,104,136,133,134,157,136,178,140,197,145,212,152,224,157,224,57,223,37,219,24,211,16,199,12,180,9,180,0,483,0,483,9,463,12,450,16,443,24,439,37,438,57,438,270,439,292,443,306,450,315,463,319,483,321,483,331,343,331,344,321,362,319,375,315,383,306,386,293,387,275,387,28,385,23,382,21,377,19,282,19,277,21,274,23,272,27,272,269,273,290,276,305,283,314,296,319,315,321,315,331,183,331,183,321,200,319,210,314,217,306,220,294,220,28,218,23,215,21,210,19,120,19,115,21,112,23,110,28,110,269,111,291,114,306,120,315,131,320,147,321,147,331,15,331,15,321,34,319,46,314,54,306,58,294,59,276,
+320,0,320,9,301,12,288,16,280,24,276,37,275,57,275,269,276,291,280,306,288,315,301,319,320,321,320,331,186,331,186,321,204,319,214,316,221,309,223,299,224,283,224,174,216,170,204,166,190,161,173,158,155,156,132,158,116,165,105,176,99,193,97,216,97,273,98,294,101,307,109,315,121,319,139,321,139,331,2,331,2,321,21,319,34,315,41,307,45,293,46,273,46,211,50,178,62,155,80,142,104,136,133,134,157,136,178,140,197,145,212,152,224,157,224,57,223,37,219,24,211,16,199,12,180,9,180,0,
 139,321,139,321,121,319,121,319,139,321,139,331,121,319,139,331,109,315,109,315,139,331,45,293,109,315,45,293,46,273,50,178,46,273,46,211,132,158,116,165,133,134,133,134,116,165,105,176,133,134,105,176,104,136,104,136,105,176,99,193,104,136,99,193,80,142,80,142,99,193,97,216,80,142,97,216,97,273,46,273,50,178,101,307,101,307,50,178,62,155,101,307,62,155,98,294,98,294,62,155,80,142,98,294,80,142,97,273,139,331,2,331,21,319,139,331,21,319,34,315,139,331,34,315,41,307,139,331,41,307,45,293,224,283,224,174,224,157,224,157,224,174,216,170,224,157,216,170,212,152,212,152,216,170,204,166,212,152,204,166,197,145,197,145,204,166,190,161,197,145,190,161,178,140,178,140,190,161,173,158,178,140,173,158,157,136,157,136,173,158,155,156,133,134,157,136,155,156,133,134,155,156,132,158,320,331,186,331,204,319,320,331,204,319,214,316,320,331,214,316,221,309,320,331,221,309,223,299,320,331,223,299,224,283,320,331,224,283,288,315,320,331,288,315,301,319,320,331,301,319,320,321,275,57,275,269,224,157,224,157,275,269,276,291,224,157,276,291,280,306,224,283,224,157,280,306,224,283,280,306,288,315,320,0,320,9,301,12,320,0,301,12,288,16,320,0,288,16,223,37,320,0,223,37,219,24,320,0,219,24,211,16,320,0,211,16,199,12,320,0,199,12,180,9,320,0,180,9,180,0,224,157,280,24,276,37,224,157,276,37,275,57,224,57,223,37,288,16,224,57,288,16,280,24,224,57,280,24,224,157,204,319,186,331,186,321,21,319,2,331,2,321,109,315,46,273,101,307,
-483,0,483,9,463,12,450,16,443,24,439,37,438,57,438,270,439,292,443,306,450,315,463,319,483,321,483,331,343,331,344,321,362,319,375,315,383,306,386,293,387,275,387,28,385,23,382,21,377,19,282,19,277,21,274,23,272,27,272,269,273,290,276,305,283,314,296,319,315,321,315,331,183,331,183,321,200,319,210,314,217,306,220,294,220,28,218,23,215,21,210,19,120,19,115,21,112,23,110,28,110,269,111,291,114,306,120,315,131,320,147,321,147,331,15,331,15,321,34,319,46,314,54,306,58,294,59,276,59,57,58,37,54,24,46,16,33,12,15,9,15,0,483,-75,483,9,463,12,450,16,443,24,439,37,438,57,438,270,439,292,443,306,450,315,463,319,483,321,483,331,343,331,344,321,362,319,375,315,383,306,386,293,387,275,387,28,385,23,382,21,377,19,282,19,277,21,274,23,272,27,272,269,273,290,276,305,283,314,296,319,315,321,315,331,183,331,183,321,200,319,210,314,217,306,220,294,220,28,218,23,215,21,210,19,120,19,115,21,112,23,110,28,110,269,111,291,114,306,120,315,131,320,147,321,147,331,15,331,15,321,34,319,46,314,54,306,58,294,59,276,59,57,58,37,54,24,46,16,33,12,15,9,15,0,
+483,0,483,9,463,12,450,16,443,24,439,37,438,57,438,270,439,292,443,306,450,315,463,319,483,321,483,331,343,331,344,321,362,319,375,315,383,306,386,293,387,275,387,28,385,23,382,21,377,19,282,19,277,21,274,23,272,27,272,269,273,290,276,305,283,314,296,319,315,321,315,331,183,331,183,321,200,319,210,314,217,306,220,294,220,28,218,23,215,21,210,19,120,19,115,21,112,23,110,28,110,269,111,291,114,306,120,315,131,320,147,321,147,331,15,331,15,321,34,319,46,314,54,306,58,294,59,276,59,57,58,37,54,24,46,16,33,12,15,9,15,0,
 59,57,58,37,115,21,115,21,58,37,54,24,115,21,54,24,120,19,120,19,54,24,46,16,120,19,46,16,483,0,483,0,46,16,33,12,483,0,33,12,15,9,147,331,15,331,34,319,147,331,34,319,46,314,147,331,46,314,54,306,147,331,54,306,58,294,147,331,58,294,120,315,147,331,120,315,131,320,147,331,131,320,147,321,115,21,112,23,59,57,59,57,112,23,110,28,59,57,110,28,59,276,59,276,110,28,110,34,59,276,110,34,110,269,59,276,110,269,111,291,59,276,111,291,114,306,59,276,114,306,120,315,59,276,120,315,58,294,296,319,315,321,315,331,296,319,315,331,283,314,283,314,315,331,220,294,283,314,220,294,220,276,272,27,220,276,220,35,272,27,220,35,274,23,274,23,220,35,277,21,272,33,272,269,220,276,220,276,272,269,273,290,220,276,273,290,276,305,315,331,183,331,200,319,315,331,200,319,210,314,315,331,210,314,217,306,315,331,217,306,220,294,463,319,483,321,483,331,463,319,483,331,450,315,450,315,483,331,386,293,450,315,386,293,387,275,439,37,387,275,387,35,439,37,387,35,443,24,443,24,387,35,450,16,438,57,438,270,387,275,387,275,438,270,439,292,387,275,439,292,443,306,483,331,343,331,344,321,483,331,344,321,362,319,483,331,362,319,375,315,483,331,375,315,383,306,483,331,383,306,386,293,483,0,483,9,463,12,483,0,463,12,450,16,483,0,450,16,387,35,483,0,387,35,387,28,483,0,387,28,385,23,483,0,385,23,382,21,483,0,382,21,377,19,483,0,377,19,371,19,483,0,371,19,289,19,483,0,289,19,282,19,483,0,282,19,218,23,483,0,218,23,215,21,483,0,215,21,210,19,483,0,210,19,203,19,483,0,203,19,127,19,483,0,127,19,120,19,282,19,277,21,220,35,282,19,220,35,220,28,282,19,220,28,218,23,483,0,15,9,15,0,220,276,272,27,272,33,387,275,439,37,438,57,450,315,387,275,443,306,200,319,183,331,183,321,283,314,220,276,276,305,34,319,15,331,15,321,
-483,-75,483,9,463,12,450,16,443,24,439,37,438,57,438,270,439,292,443,306,450,315,463,319,483,321,483,331,343,331,344,321,362,319,375,315,383,306,386,293,387,275,387,28,385,23,382,21,377,19,282,19,277,21,274,23,272,27,272,269,273,290,276,305,283,314,296,319,315,321,315,331,183,331,183,321,200,319,210,314,217,306,220,294,220,28,218,23,215,21,210,19,120,19,115,21,112,23,110,28,110,269,111,291,114,306,120,315,131,320,147,321,147,331,15,331,15,321,34,319,46,314,54,306,58,294,59,276,59,57,58,37,54,24,46,16,33,12,15,9,15,0,419,0,433,-5,446,-15,457,-29,465,-49,467,-55,468,-61,469,-68,470,-73,470,-75,171,183,171,274,172,293,177,307,186,315,200,319,219,321,219,331,10,331,7,246,18,246,25,274,33,293,45,304,63,309,90,310,120,310,120,56,119,37,114,24,106,16,92,11,72,9,72,0,231,0,271,4,305,15,330,34,346,59,352,91,345,126,327,153,299,170,262,180,219,183,16383,16383,171,163,204,163,231,161,256,154,276,141,289,120,294,89,289,59,275,39,253,27,226,21,195,19,185,20,178,22,174,26,171,33,171,41,432,0,432,9,414,12,401,17,393,25,389,38,388,57,388,274,389,294,393,307,401,315,414,319,432,321,432,331,292,331,292,321,312,319,325,315,332,307,336,294,337,274,337,61,336,39,333,25,325,16,312,12,292,9,292,0,
+483,-75,483,9,463,12,450,16,443,24,439,37,438,57,438,270,439,292,443,306,450,315,463,319,483,321,483,331,343,331,344,321,362,319,375,315,383,306,386,293,387,275,387,28,385,23,382,21,377,19,282,19,277,21,274,23,272,27,272,269,273,290,276,305,283,314,296,319,315,321,315,331,183,331,183,321,200,319,210,314,217,306,220,294,220,28,218,23,215,21,210,19,120,19,115,21,112,23,110,28,110,269,111,291,114,306,120,315,131,320,147,321,147,331,15,331,15,321,34,319,46,314,54,306,58,294,59,276,59,57,58,37,54,24,46,16,33,12,15,9,15,0,419,0,433,-5,446,-15,457,-29,465,-49,467,-55,468,-61,469,-68,470,-73,470,-75,
 59,57,58,37,115,21,115,21,58,37,54,24,115,21,54,24,120,19,120,19,54,24,46,16,120,19,46,16,402,0,402,0,46,16,33,12,402,0,33,12,15,9,147,331,15,331,34,319,147,331,34,319,46,314,147,331,46,314,54,306,147,331,54,306,58,294,147,331,58,294,120,315,147,331,120,315,131,320,147,331,131,320,147,321,115,21,112,23,59,57,59,57,112,23,110,28,59,57,110,28,59,276,59,276,110,28,110,34,59,276,110,34,110,269,59,276,110,269,111,291,59,276,111,291,114,306,59,276,114,306,120,315,59,276,120,315,58,294,296,319,315,321,315,331,296,319,315,331,283,314,283,314,315,331,220,294,283,314,220,294,220,276,272,27,220,276,220,35,272,27,220,35,274,23,274,23,220,35,277,21,272,33,272,269,220,276,220,276,272,269,273,290,220,276,273,290,276,305,315,331,183,331,200,319,315,331,200,319,210,314,315,331,210,314,217,306,315,331,217,306,220,294,463,319,483,321,483,331,463,319,483,331,450,315,450,315,483,331,386,293,450,315,386,293,387,275,402,0,387,275,387,35,402,0,387,35,387,28,450,16,443,24,446,-15,446,-15,443,24,439,37,446,-15,439,37,433,-5,433,-5,439,37,438,57,433,-5,438,57,438,270,387,275,402,0,439,292,439,292,402,0,419,0,439,292,419,0,438,270,438,270,419,0,433,-5,443,306,450,315,387,275,443,306,387,275,439,292,483,331,343,331,344,321,483,331,344,321,362,319,483,331,362,319,375,315,483,331,375,315,383,306,483,331,383,306,386,293,468,-61,483,9,467,-55,467,-55,483,9,465,-49,457,-29,465,-49,463,12,457,-29,463,12,450,16,483,9,468,-61,469,-68,483,9,469,-68,470,-73,483,9,470,-73,470,-75,483,9,470,-75,483,-75,483,9,463,12,465,-49,402,0,387,28,385,23,402,0,385,23,382,21,402,0,382,21,377,19,402,0,377,19,371,19,402,0,371,19,289,19,402,0,289,19,282,19,402,0,282,19,220,28,402,0,220,28,218,23,402,0,218,23,215,21,402,0,215,21,210,19,402,0,210,19,203,19,402,0,203,19,127,19,402,0,127,19,120,19,220,35,220,28,282,19,220,35,282,19,277,21,402,0,15,9,15,0,220,276,272,27,272,33,450,16,446,-15,457,-29,200,319,183,331,183,321,283,314,220,276,276,305,34,319,15,331,15,321,
-171,183,171,274,172,293,177,307,186,315,200,319,219,321,219,331,10,331,7,246,18,246,25,274,33,293,45,304,63,309,90,310,120,310,120,56,119,37,114,24,106,16,92,11,72,9,72,0,231,0,271,4,305,15,330,34,346,59,352,91,345,126,327,153,299,170,262,180,219,183,16383,16383,171,163,204,163,231,161,256,154,276,141,289,120,294,89,289,59,275,39,253,27,226,21,195,19,185,20,178,22,174,26,171,33,171,41,432,0,432,9,414,12,401,17,393,25,389,38,388,57,388,274,389,294,393,307,401,315,414,319,432,321,432,331,292,331,292,321,312,319,325,315,332,307,336,294,337,274,337,61,336,39,333,25,325,16,312,12,292,9,292,0,16383,16383,108,183,108,274,110,293,115,307,123,315,137,319,156,321,156,331,9,331,9,321,30,320,44,316,52,308,56,295,57,275,57,56,56,37,52,24,43,16,30,11,9,9,9,0,170,0,210,4,
+171,183,171,274,172,293,177,307,186,315,200,319,219,321,219,331,10,331,7,246,18,246,25,274,33,293,45,304,63,309,90,310,120,310,120,56,119,37,114,24,106,16,92,11,72,9,72,0,231,0,271,4,305,15,330,34,346,59,352,91,345,126,327,153,299,170,262,180,219,183,16383,16383,171,163,204,163,231,161,256,154,276,141,289,120,294,89,289,59,275,39,253,27,226,21,195,19,185,20,178,22,174,26,171,33,171,41,
 114,24,106,16,231,0,231,0,106,16,92,11,231,0,92,11,72,9,177,307,186,315,120,310,120,310,186,315,219,331,120,310,219,331,90,310,63,309,90,310,219,331,63,309,219,331,10,331,200,319,219,321,219,331,200,319,219,331,186,315,120,310,171,33,171,41,171,183,171,163,204,163,171,183,204,163,219,183,219,183,204,163,231,161,219,183,231,161,262,180,262,180,231,161,256,154,262,180,256,154,276,141,120,310,171,41,171,274,120,310,171,274,172,293,120,310,172,293,177,307,10,331,7,246,18,246,10,331,18,246,25,274,10,331,25,274,33,293,10,331,33,293,45,304,10,331,45,304,63,309,294,89,289,59,305,15,305,15,289,59,275,39,305,15,275,39,271,4,271,4,275,39,253,27,271,4,253,27,231,0,231,0,253,27,226,21,231,0,226,21,195,19,195,19,185,20,231,0,231,0,185,20,178,22,231,0,178,22,119,37,119,37,178,22,120,56,299,170,294,89,305,15,299,170,305,15,327,153,327,153,305,15,330,34,327,153,330,34,345,126,345,126,330,34,346,59,345,126,346,59,352,91,299,170,262,180,276,141,299,170,276,141,289,120,299,170,289,120,294,89,120,56,178,22,174,26,120,56,174,26,171,33,120,56,171,33,120,310,231,0,72,9,72,0,114,24,231,0,119,37,
-432,0,432,9,414,12,401,17,393,25,389,38,388,57,388,274,389,294,393,307,401,315,414,319,432,321,432,331,292,331,292,321,312,319,325,315,332,307,336,294,337,274,337,61,336,39,333,25,325,16,312,12,292,9,292,0,16383,16383,108,183,108,274,110,293,115,307,123,315,137,319,156,321,156,331,9,331,9,321,30,320,44,316,52,308,56,295,57,275,57,56,56,37,52,24,43,16,30,11,9,9,9,0,170,0,210,4,244,15,268,34,284,59,290,91,283,126,265,153,238,170,201,180,158,183,16383,16383,108,163,142,163,170,161,194,154,214,141,227,120,232,89,227,59,214,39,193,27,166,21,134,19,123,20,115,22,111,26,109,33,108,41,108,183,108,274,110,293,115,307,123,315,137,319,156,321,156,331,9,331,9,321,30,320,44,316,52,308,56,295,57,275,57,56,56,37,52,24,43,16,30,11,9,9,9,0,170,0,210,4,243,15,268,34,284,59,289,91,283,126,265,153,237,170,201,180,158,183,16383,16383,108,163,142,163,170,161,194,154,214,141,227,120,232,89,227,59,213,39,193,27,166,21,134,19,123,20,115,22,111,26,109,33,108,41,26,338,23,224,36,224,39,239,42,252,46,263,51,272,57,280,71,293,85,304,101,311,118,316,136,318,173,312,203,293,226,265,241,228,248,184,103,184,103,161,248,161,248,142,246,124,242,108,237,92,231,78,218,57,201,39,181,26,
+432,0,432,9,414,12,401,17,393,25,389,38,388,57,388,274,389,294,393,307,401,315,414,319,432,321,432,331,292,331,292,321,312,319,325,315,332,307,336,294,337,274,337,61,336,39,333,25,325,16,312,12,292,9,292,0,16383,16383,108,183,108,274,110,293,115,307,123,315,137,319,156,321,156,331,9,331,9,321,30,320,44,316,52,308,56,295,57,275,57,56,56,37,52,24,43,16,30,11,9,9,9,0,170,0,210,4,244,15,268,34,284,59,290,91,283,126,265,153,238,170,201,180,158,183,16383,16383,108,163,142,163,170,161,194,154,214,141,227,120,232,89,227,59,214,39,193,27,166,21,134,19,123,20,115,22,111,26,109,33,108,41,
 432,321,432,321,414,319,414,319,432,321,432,331,414,319,432,331,401,315,401,315,432,331,336,294,401,315,336,294,337,274,389,38,337,274,337,61,389,38,337,61,393,25,393,25,337,61,401,17,388,57,388,274,337,274,337,274,388,274,389,294,337,274,389,294,393,307,432,331,292,331,312,319,432,331,312,319,325,315,432,331,325,315,332,307,432,331,332,307,336,294,432,0,432,9,414,12,432,0,414,12,401,17,432,0,401,17,336,39,432,0,336,39,333,25,432,0,333,25,325,16,432,0,325,16,312,12,432,0,312,12,292,9,432,0,292,9,292,0,52,24,43,16,170,0,170,0,43,16,30,11,170,0,30,11,9,9,156,331,9,331,30,320,156,331,30,320,44,316,156,331,44,316,52,308,156,331,52,308,56,295,156,331,56,295,123,315,156,331,123,315,137,319,156,331,137,319,156,321,57,275,109,33,108,41,108,183,108,163,142,163,108,183,142,163,158,183,158,183,142,163,170,161,158,183,170,161,201,180,201,180,170,161,194,154,201,180,194,154,214,141,57,275,108,41,108,274,57,275,108,274,110,293,57,275,110,293,115,307,57,275,115,307,123,315,57,275,123,315,56,295,232,89,227,59,244,15,244,15,227,59,214,39,244,15,214,39,210,4,210,4,214,39,193,27,210,4,193,27,170,0,170,0,193,27,166,21,170,0,166,21,134,19,134,19,123,20,170,0,170,0,123,20,115,22,170,0,115,22,56,37,56,37,115,22,57,56,238,170,232,89,244,15,238,170,244,15,265,153,265,153,244,15,268,34,265,153,268,34,283,126,283,126,268,34,284,59,283,126,284,59,290,91,238,170,201,180,214,141,238,170,214,141,227,120,238,170,227,120,232,89,57,56,115,22,111,26,57,56,111,26,109,33,57,56,109,33,57,275,170,0,9,9,9,0,52,24,170,0,56,37,30,320,9,331,9,321,336,39,401,17,337,61,337,274,389,38,388,57,312,319,292,331,292,321,401,315,337,274,393,307,
-108,183,108,274,110,293,115,307,123,315,137,319,156,321,156,331,9,331,9,321,30,320,44,316,52,308,56,295,57,275,57,56,56,37,52,24,43,16,30,11,9,9,9,0,170,0,210,4,243,15,268,34,284,59,289,91,283,126,265,153,237,170,201,180,158,183,16383,16383,108,163,142,163,170,161,194,154,214,141,227,120,232,89,227,59,213,39,193,27,166,21,134,19,123,20,115,22,111,26,109,33,108,41,26,338,23,224,36,224,39,239,42,252,46,263,51,272,57,280,71,293,85,304,101,311,118,316,136,318,173,312,203,293,226,265,241,228,248,184,103,184,103,161,248,161,248,142,246,124,242,108,237,92,231,78,218,57,201,39,181,26,158,18,131,15,107,17,86,23,65,32,45,46,25,65,15,55,33,33,55,16,80,3,109,-4,141,-6,168,-4,194,0,218,9,240,22,258,37,275,57,288,79,298,104,304,131,
+108,183,108,274,110,293,115,307,123,315,137,319,156,321,156,331,9,331,9,321,30,320,44,316,52,308,56,295,57,275,57,56,56,37,52,24,43,16,30,11,9,9,9,0,170,0,210,4,243,15,268,34,284,59,289,91,283,126,265,153,237,170,201,180,158,183,16383,16383,108,163,142,163,170,161,194,154,214,141,227,120,232,89,227,59,213,39,193,27,166,21,134,19,123,20,115,22,111,26,109,33,108,41,
 52,24,43,16,170,0,170,0,43,16,30,11,170,0,30,11,9,9,156,331,9,331,30,320,156,331,30,320,44,316,156,331,44,316,52,308,156,331,52,308,56,295,156,331,56,295,123,315,156,331,123,315,137,319,156,331,137,319,156,321,57,275,109,33,108,41,108,183,108,163,142,163,108,183,142,163,158,183,158,183,142,163,170,161,158,183,170,161,201,180,201,180,170,161,194,154,201,180,194,154,214,141,57,275,108,41,108,274,57,275,108,274,110,293,57,275,110,293,115,307,57,275,115,307,123,315,57,275,123,315,56,295,57,56,56,37,115,22,115,22,56,37,170,0,115,22,170,0,123,20,123,20,170,0,134,19,166,21,134,19,170,0,166,21,170,0,193,27,193,27,170,0,210,4,193,27,210,4,213,39,213,39,210,4,243,15,213,39,243,15,227,59,227,59,243,15,232,89,237,170,232,89,243,15,237,170,243,15,265,153,265,153,243,15,268,34,265,153,268,34,283,126,283,126,268,34,284,59,283,126,284,59,289,91,237,170,201,180,214,141,237,170,214,141,227,120,237,170,227,120,232,89,57,56,115,22,111,26,57,56,111,26,109,33,57,56,109,33,57,275,170,0,9,9,9,0,52,24,170,0,56,37,30,320,9,331,9,321,
-26,338,23,224,36,224,39,239,42,252,46,263,51,272,57,280,71,293,85,304,101,311,118,316,136,318,173,312,203,293,226,265,241,228,248,184,103,184,103,161,248,161,248,142,246,124,242,108,237,92,231,78,218,57,201,39,181,26,158,18,131,15,107,17,86,23,65,32,45,46,25,65,15,55,33,33,55,16,80,3,109,-4,141,-6,168,-4,194,0,218,9,240,22,258,37,275,57,288,79,298,104,304,131,306,160,305,188,299,215,290,240,278,263,263,284,244,304,222,319,198,330,173,336,147,338,136,338,124,337,113,336,101,333,90,330,83,328,75,326,61,322,55,321,50,322,45,324,41,328,38,332,36,338,105,180,105,274,106,294,110,307,118,315,130,319,149,321,149,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,149,9,130,12,118,17,110,25,106,38,105,56,105,157,149,157,157,102,177,57,207,22,245,0,291,-6,337,1,376,24,405,60,425,108,431,166,425,222,406,269,377,306,338,330,291,338,245,331,207,310,178,276,158,232,149,180,16383,16383,377,169,376,134,373,103,367,76,359,53,347,35,337,26,327,19,315,15,303,12,291,11,279,12,268,15,257,19,247,25,237,33,224,52,214,75,208,102,204,132,203,166,204,194,207,222,211,247,
+26,338,23,224,36,224,39,239,42,252,46,263,51,272,57,280,71,293,85,304,101,311,118,316,136,318,173,312,203,293,226,265,241,228,248,184,103,184,103,161,248,161,248,142,246,124,242,108,237,92,231,78,218,57,201,39,181,26,158,18,131,15,107,17,86,23,65,32,45,46,25,65,15,55,33,33,55,16,80,3,109,-4,141,-6,168,-4,194,0,218,9,240,22,258,37,275,57,288,79,298,104,304,131,306,160,305,188,299,215,290,240,278,263,263,284,244,304,222,319,198,330,173,336,147,338,136,338,124,337,113,336,101,333,90,330,83,328,75,326,61,322,55,321,50,322,45,324,41,328,38,332,36,338,
 36,338,36,338,38,332,38,332,36,338,39,239,38,332,39,239,41,328,41,328,39,239,42,252,41,328,42,252,45,324,45,324,42,252,46,263,45,324,46,263,50,322,50,322,46,263,51,272,50,322,51,272,55,321,55,321,51,272,57,280,55,321,57,280,61,322,36,224,39,239,36,338,36,224,36,338,26,338,36,224,26,338,23,224,75,326,68,324,71,293,71,293,68,324,61,322,71,293,61,322,57,280,90,330,83,328,85,304,90,330,85,304,101,311,90,330,101,311,101,333,75,326,71,293,85,304,75,326,85,304,83,328,248,142,246,124,258,37,258,37,246,124,242,108,258,37,242,108,240,22,240,22,242,108,237,92,240,22,237,92,231,78,231,78,218,57,218,9,218,9,218,57,201,39,218,9,201,39,194,0,194,0,201,39,181,26,194,0,181,26,168,-4,168,-4,181,26,158,18,168,-4,158,18,141,-6,141,-6,158,18,131,15,131,15,107,17,109,-4,109,-4,107,17,86,23,109,-4,86,23,80,3,80,3,86,23,65,32,80,3,65,32,55,16,55,16,65,32,45,46,55,16,45,46,33,33,33,33,45,46,25,65,33,33,25,65,15,55,136,318,136,338,124,337,136,318,124,337,118,316,136,318,147,338,136,338,118,316,124,337,113,336,118,316,113,336,101,333,118,316,101,333,101,311,306,160,305,188,304,131,304,131,305,188,299,215,304,131,299,215,298,104,298,104,299,215,290,240,298,104,290,240,288,79,288,79,290,240,278,263,288,79,278,263,275,57,275,57,278,263,263,284,275,57,263,284,258,37,258,37,263,284,248,161,258,37,248,161,248,142,263,284,248,184,248,161,248,161,248,184,103,184,244,304,222,319,226,265,244,304,226,265,241,228,244,304,241,228,248,184,244,304,248,184,263,284,203,293,226,265,222,319,203,293,222,319,198,330,203,293,198,330,173,336,203,293,173,336,173,312,173,312,173,336,147,338,173,312,147,338,136,318,231,78,218,9,240,22,141,-6,131,15,109,-4,248,161,103,184,103,161,
-105,180,105,274,106,294,110,307,118,315,130,319,149,321,149,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,149,9,130,12,118,17,110,25,106,38,105,56,105,157,149,157,157,102,177,57,207,22,245,0,291,-6,337,1,376,24,405,60,425,108,431,166,425,222,406,269,377,306,338,330,291,338,245,331,207,310,178,276,158,232,149,180,16383,16383,377,169,376,134,373,103,367,76,359,53,347,35,337,26,327,19,315,15,303,12,291,11,279,12,268,15,257,19,247,25,237,33,224,52,214,75,208,102,204,132,203,166,204,194,207,222,211,247,219,269,228,286,239,299,251,308,263,315,276,318,290,320,302,319,313,316,324,311,334,305,343,296,356,279,366,257,372,231,376,201,377,169,309,0,309,9,290,12,277,16,270,25,267,39,267,276,268,294,271,307,278,315,290,319,309,321,309,331,180,331,136,329,98,321,69,306,49,282,42,246,47,216,60,193,81,176,108,164,141,157,49,35,41,26,31,19,22,14,12,11,2,9,2,0,83,0,198,155,216,155,216,56,215,37,211,24,203,16,189,12,169,9,169,0,16383,16383,216,174,186,174,156,177,131,186,113,200,101,219,97,244,99,261,103,276,111,288,121,298,133,305,143,308,153,310,164,311,177,312,190,312,200,311,207,309,212,304,215,296,216,286,223,33,218,29,210,25,206,24,201,23,196,25,192,28,189,35,187,44,186,56,186,152,185,168,184,181,181,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,
+105,180,105,274,106,294,110,307,118,315,130,319,149,321,149,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,149,9,130,12,118,17,110,25,106,38,105,56,105,157,149,157,157,102,177,57,207,22,245,0,291,-6,337,1,376,24,405,60,425,108,431,166,425,222,406,269,377,306,338,330,291,338,245,331,207,310,178,276,158,232,149,180,16383,16383,377,169,376,134,373,103,367,76,359,53,347,35,337,26,327,19,315,15,303,12,291,11,279,12,268,15,257,19,247,25,237,33,224,52,214,75,208,102,204,132,203,166,204,194,207,222,211,247,219,269,228,286,239,299,251,308,263,315,276,318,290,320,302,319,313,316,324,311,334,305,343,296,356,279,366,257,372,231,376,201,377,169,
 50,25,42,16,149,0,149,0,42,16,29,12,149,0,29,12,9,9,149,331,9,331,29,319,149,331,29,319,42,315,149,331,42,315,50,307,149,331,50,307,53,294,149,331,53,294,118,315,149,331,118,315,130,319,149,331,130,319,149,321,158,232,149,180,149,157,149,157,149,180,105,180,149,157,105,180,105,157,106,38,105,56,54,274,106,38,54,274,54,61,54,274,105,56,105,274,54,274,105,274,106,294,54,274,106,294,110,307,54,274,110,307,118,315,54,274,118,315,53,294,149,0,149,9,130,12,149,0,130,12,118,17,149,0,118,17,53,39,149,0,53,39,50,25,54,61,53,39,118,17,54,61,118,17,110,25,54,61,110,25,106,38,263,315,291,338,251,308,251,308,291,338,245,331,251,308,245,331,239,299,239,299,245,331,228,286,219,269,228,286,245,331,219,269,245,331,207,310,208,102,207,22,214,75,214,75,207,22,245,0,214,75,245,0,224,52,224,52,245,0,237,33,247,25,237,33,245,0,247,25,245,0,291,-6,338,330,291,338,302,319,302,319,291,338,290,320,276,318,290,320,291,338,276,318,291,338,263,315,207,310,178,276,203,166,207,310,203,166,204,194,207,310,204,194,207,222,207,310,207,222,211,247,207,310,211,247,219,269,208,102,204,132,207,22,207,22,204,132,203,166,268,15,291,-6,279,12,279,12,291,-6,291,11,303,12,291,11,291,-6,303,12,291,-6,337,1,313,316,324,311,338,330,338,330,324,311,334,305,338,330,334,305,343,296,343,296,356,279,377,306,377,306,356,279,366,257,377,306,366,257,372,231,373,103,367,76,376,24,376,24,367,76,359,53,376,24,359,53,347,35,347,35,337,26,376,24,376,24,337,26,337,1,431,166,425,222,425,108,425,108,425,222,406,269,425,108,406,269,405,60,405,60,406,269,377,169,377,306,372,231,376,201,377,306,376,201,377,169,377,306,377,169,406,269,377,306,338,330,343,296,376,134,373,103,376,24,376,134,376,24,405,60,376,134,405,60,377,169,337,1,337,26,327,19,337,1,327,19,315,15,337,1,315,15,303,12,257,19,247,25,291,-6,257,19,291,-6,268,15,149,157,157,102,158,232,158,232,157,102,177,57,158,232,177,57,178,276,178,276,177,57,207,22,178,276,207,22,203,166,338,330,302,319,313,316,149,0,9,9,9,0,29,319,9,331,9,321,
-309,0,309,9,290,12,277,16,270,25,267,39,267,276,268,294,271,307,278,315,290,319,309,321,309,331,180,331,136,329,98,321,69,306,49,282,42,246,47,216,60,193,81,176,108,164,141,157,49,35,41,26,31,19,22,14,12,11,2,9,2,0,83,0,198,155,216,155,216,56,215,37,211,24,203,16,189,12,169,9,169,0,16383,16383,216,174,186,174,156,177,131,186,113,200,101,219,97,244,99,261,103,276,111,288,121,298,133,305,143,308,153,310,164,311,177,312,190,312,200,311,207,309,212,304,215,296,216,286,223,33,218,29,210,25,206,24,201,23,196,25,192,28,189,35,187,44,186,56,186,152,185,168,184,181,181,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,207,83,212,93,215,104,217,117,215,129,210,138,202,144,190,146,173,146,146,116,135,93,126,76,118,63,112,54,105,42,97,33,87,
+309,0,309,9,290,12,277,16,270,25,267,39,267,276,268,294,271,307,278,315,290,319,309,321,309,331,180,331,136,329,98,321,69,306,49,282,42,246,47,216,60,193,81,176,108,164,141,157,49,35,41,26,31,19,22,14,12,11,2,9,2,0,83,0,198,155,216,155,216,56,215,37,211,24,203,16,189,12,169,9,169,0,16383,16383,216,174,186,174,156,177,131,186,113,200,101,219,97,244,99,261,103,276,111,288,121,298,133,305,143,308,153,310,164,311,177,312,190,312,200,311,207,309,212,304,215,296,216,286,
 31,19,22,14,83,0,83,0,22,14,12,11,83,0,12,11,2,9,99,261,103,276,98,321,98,321,103,276,111,288,98,321,111,288,136,329,136,329,111,288,121,298,136,329,121,298,133,305,133,305,143,308,136,329,136,329,143,308,180,331,101,219,97,244,108,164,108,164,97,244,81,176,81,176,97,244,98,321,98,321,97,244,99,261,42,246,47,216,49,282,49,282,47,216,60,193,49,282,60,193,69,306,69,306,60,193,81,176,69,306,81,176,98,321,141,157,83,0,198,155,141,157,198,155,156,177,141,157,156,177,131,186,141,157,131,186,113,200,141,157,113,200,108,164,211,24,203,16,309,0,309,0,203,16,189,12,309,0,189,12,169,9,153,310,164,311,180,331,180,331,164,311,177,312,180,331,177,312,190,312,190,312,200,311,309,331,309,331,200,311,207,309,309,331,207,309,212,304,211,24,309,0,215,37,215,37,309,0,277,16,215,37,277,16,216,56,216,56,277,16,270,25,216,56,270,25,216,155,216,155,270,25,216,174,216,155,216,174,198,155,198,155,216,174,186,174,198,155,186,174,156,177,83,0,141,157,49,35,83,0,49,35,41,26,83,0,41,26,31,19,290,319,309,321,309,331,290,319,309,331,278,315,278,315,309,331,216,286,278,315,216,286,271,307,271,307,216,286,268,294,216,286,267,39,267,61,267,276,268,294,216,286,267,276,216,286,267,61,309,331,212,304,215,296,309,331,215,296,216,286,309,331,180,331,190,312,290,12,277,16,309,0,290,12,309,0,309,9,216,174,270,25,267,39,216,174,267,39,216,286,309,0,169,9,169,0,83,0,2,9,2,0,180,331,143,308,153,310,101,219,108,164,113,200,
-223,33,218,29,210,25,206,24,201,23,196,25,192,28,189,35,187,44,186,56,186,152,185,168,184,181,181,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,207,83,212,93,215,104,217,117,215,129,210,138,202,144,190,146,173,146,146,116,135,93,126,76,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,99,0,114,6,130,16,146,31,149,17,153,7,160,0,168,-3,178,-4,188,-3,197,-1,206,2,214,9,223,19,16383,16383,146,65,145,57,144,50,140,44,135,38,128,32,122,29,110,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,78,68,84,73,91,79,97,88,104,99,111,112,118,128,125,146,132,42,174,47,203,59,230,77,253,100,270,129,278,142,279,169,279,182,280,194,283,210,293,220,306,226,320,229,333,230,343,220,343,217,332,212,325,205,320,195,318,183,317,150,317,94,304,57,269,34,223,23,172,20,127,24,87,36,52,57,22,87,2,127,-4,164,1,195,17,219,43,234,76,239,116,233,154,218,186,195,210,166,225,131,230,111,228,92,223,74,213,57,196,43,173,16383,16383,194,102,192,70,184,44,172,25,155,13,135,9,125,10,115,13,106,18,98,25,91,34,81,51,74,70,69,91,66,113,65,137,67,164,75,186,87,202,102,212,122,216,134,215,144,211,153,206,161,199,169,191,178,177,185,161,190,142,193,122,194,102,153,118,169,121,183,128,194,137,202,151,205,168,201,188,191,204,174,215,149,222,118,225,12,225,12,218,26,216,35,214,40,209,42,200,43,187,43,39,42,25,40,16,35,11,26,8,12,7,12,0,149,0,161,2,171,4,181,8,190,12,200,19,208,28,214,39,218,51,
+223,33,218,29,210,25,206,24,201,23,196,25,192,28,189,35,187,44,186,56,186,152,185,168,184,181,181,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,207,83,212,93,215,104,217,117,215,129,210,138,202,144,190,146,173,146,146,116,135,93,126,76,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,99,0,114,6,130,16,146,31,149,17,153,7,160,0,168,-3,178,-4,188,-3,197,-1,206,2,214,9,223,19,16383,16383,146,65,145,57,144,50,140,44,135,38,128,32,122,29,110,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,78,68,84,73,91,79,97,88,104,99,111,112,118,128,125,146,132,
 37,156,43,153,44,208,44,208,43,153,50,152,44,208,50,152,54,215,54,215,50,152,57,153,54,215,57,153,63,220,63,220,57,153,63,156,63,220,63,156,73,224,73,224,63,156,70,194,71,167,70,194,68,161,111,230,104,217,117,215,111,230,117,215,127,229,127,229,117,215,129,210,127,229,129,210,140,226,140,226,129,210,138,202,140,226,138,202,144,190,76,207,83,212,85,227,85,227,83,212,93,215,85,227,93,215,98,229,98,229,93,215,104,217,98,229,104,217,111,230,73,224,70,194,71,201,73,224,71,201,76,207,73,224,76,207,85,227,70,194,63,156,68,161,29,183,29,167,32,192,32,192,29,167,33,161,32,192,33,161,37,200,37,200,33,161,37,156,37,200,37,156,44,208,186,56,186,152,185,168,186,56,185,168,184,181,186,56,184,181,181,191,186,56,181,191,188,-3,192,28,197,-1,196,25,196,25,197,-1,201,23,206,24,201,23,206,2,206,24,206,2,214,9,189,35,187,44,188,-3,189,35,188,-3,197,-1,189,35,197,-1,192,28,178,-4,188,-3,181,191,178,-4,181,191,176,199,178,-4,176,199,170,208,178,-4,170,208,168,-3,162,215,152,222,153,7,162,215,153,7,160,0,162,215,160,0,168,-3,162,215,168,-3,170,208,152,222,140,226,144,190,152,222,144,190,146,173,152,222,146,173,146,132,152,222,146,132,146,31,152,222,146,31,149,17,152,222,149,17,153,7,146,146,146,132,146,173,218,29,214,27,214,9,218,29,214,9,223,19,218,29,223,19,223,33,210,25,206,24,214,9,210,25,214,9,214,27,201,23,197,-1,206,2,146,31,146,132,146,65,146,31,146,65,145,57,146,31,145,57,144,50,146,31,144,50,140,44,146,31,140,44,135,38,146,31,135,38,130,16,130,16,135,38,128,32,128,32,122,29,130,16,130,16,122,29,116,27,130,16,116,27,114,6,114,6,116,27,110,25,114,6,110,25,103,24,99,111,112,118,116,135,116,135,112,118,128,125,116,135,128,125,146,146,146,146,128,125,146,132,65,78,68,84,76,118,76,118,68,84,73,91,76,118,73,91,79,97,79,97,88,104,93,126,93,126,88,104,99,111,93,126,99,111,116,135,93,126,76,118,79,97,72,182,71,185,71,167,72,182,71,167,73,172,72,182,73,172,72,178,70,189,70,194,71,167,70,189,71,167,71,185,63,112,54,105,54,-2,63,112,54,-2,63,63,63,112,63,63,63,71,63,112,63,71,65,78,63,112,65,78,76,118,63,63,54,-2,64,48,64,48,54,-2,71,-4,64,48,71,-4,69,38,69,38,71,-4,76,30,20,62,21,29,25,75,25,75,21,29,28,14,25,75,28,14,33,87,33,87,28,14,39,4,33,87,39,4,42,97,42,97,39,4,54,-2,42,97,54,-2,54,105,84,-3,99,0,86,25,86,25,99,0,97,24,103,24,97,24,99,0,103,24,99,0,114,6,76,30,71,-4,84,-3,76,30,84,-3,86,25,21,29,20,62,18,47,186,56,188,-3,187,44,29,167,29,183,28,175,
-42,174,47,203,59,230,77,253,100,270,129,278,142,279,169,279,182,280,194,283,210,293,220,306,226,320,229,333,230,343,220,343,217,332,212,325,205,320,195,318,183,317,150,317,94,304,57,269,34,223,23,172,20,127,24,87,36,52,57,22,87,2,127,-4,164,1,195,17,219,43,234,76,239,116,233,154,218,186,195,210,166,225,131,230,111,228,92,223,74,213,57,196,43,173,16383,16383,194,102,192,70,184,44,172,25,155,13,135,9,125,10,115,13,106,18,98,25,91,34,81,51,74,70,69,91,66,113,65,137,67,164,75,186,87,202,102,212,122,216,134,215,144,211,153,206,161,199,169,191,178,177,185,161,190,142,193,122,194,102,153,118,169,121,183,128,194,137,202,151,205,168,201,188,191,204,174,215,149,222,118,225,12,225,12,218,26,216,35,214,40,209,42,200,43,187,43,39,42,25,40,16,35,11,26,8,12,7,12,0,149,0,161,2,171,4,181,8,190,12,200,19,208,28,214,39,218,51,219,63,215,82,206,96,191,107,174,114,153,118,16383,16383,85,195,86,202,88,207,92,209,97,211,103,211,127,209,145,203,156,194,162,182,164,166,161,151,154,139,143,130,128,125,110,123,99,124,92,125,87,128,85,132,85,139,16383,16383,85,97,85,102,87,105,91,108,98,109,127,109,144,105,159,98,170,84,174,62,174,63,170,42,160,28,146,19,127,15,106,14,
+42,174,47,203,59,230,77,253,100,270,129,278,142,279,169,279,182,280,194,283,210,293,220,306,226,320,229,333,230,343,220,343,217,332,212,325,205,320,195,318,183,317,150,317,94,304,57,269,34,223,23,172,20,127,24,87,36,52,57,22,87,2,127,-4,164,1,195,17,219,43,234,76,239,116,233,154,218,186,195,210,166,225,131,230,111,228,92,223,74,213,57,196,43,173,16383,16383,194,102,192,70,184,44,172,25,155,13,135,9,125,10,115,13,106,18,98,25,91,34,81,51,74,70,69,91,66,113,65,137,67,164,75,186,87,202,102,212,122,216,134,215,144,211,153,206,161,199,169,191,178,177,185,161,190,142,193,122,194,102,
 169,279,183,317,156,279,156,279,183,317,150,317,156,279,150,317,142,279,142,279,150,317,129,278,100,270,129,278,150,317,100,270,150,317,94,304,229,333,230,343,226,320,226,320,230,343,220,343,226,320,220,343,220,306,220,306,220,343,217,332,220,306,217,332,212,325,210,293,220,306,212,325,210,293,212,325,205,320,210,293,205,320,195,318,210,293,195,318,194,283,169,279,182,280,183,317,183,317,182,280,194,283,183,317,194,283,195,318,42,174,47,203,57,269,57,269,47,203,59,230,57,269,59,230,94,304,94,304,59,230,77,253,94,304,77,253,100,270,42,174,57,269,34,223,42,174,34,223,36,52,42,174,36,52,57,22,42,174,57,22,43,173,24,87,36,52,34,223,24,87,34,223,23,172,24,87,23,172,20,127,74,70,87,2,81,51,81,51,87,2,91,34,98,25,91,34,87,2,98,25,87,2,127,-4,65,137,57,196,66,113,66,113,57,196,57,22,66,113,57,22,69,91,69,91,57,22,87,2,69,91,87,2,74,70,131,230,122,216,134,215,131,230,134,215,166,225,166,225,134,215,144,211,166,225,144,211,153,206,75,186,87,202,92,223,92,223,87,202,102,212,92,223,102,212,111,228,111,228,102,212,122,216,111,228,122,216,131,230,74,213,57,196,67,164,74,213,67,164,75,186,74,213,75,186,92,223,67,164,57,196,65,137,192,70,184,44,195,17,195,17,184,44,172,25,195,17,172,25,164,1,164,1,172,25,155,13,164,1,155,13,135,9,135,9,125,10,127,-4,127,-4,125,10,115,13,127,-4,115,13,106,18,185,161,195,210,178,177,178,177,195,210,169,191,161,199,169,191,166,225,161,199,166,225,153,206,195,210,194,102,195,17,195,210,195,17,218,186,218,186,195,17,219,43,218,186,219,43,233,154,233,154,219,43,234,76,233,154,234,76,239,116,195,210,185,161,190,142,195,210,190,142,193,122,195,210,193,122,194,102,195,210,166,225,169,191,135,9,127,-4,164,1,192,70,195,17,194,102,98,25,127,-4,106,18,43,173,57,22,57,196,
-153,118,169,121,183,128,194,137,202,151,205,168,201,188,191,204,174,215,149,222,118,225,12,225,12,218,26,216,35,214,40,209,42,200,43,187,43,39,42,25,40,16,35,11,26,8,12,7,12,0,149,0,161,2,171,4,181,8,190,12,200,19,208,28,214,39,218,51,219,63,215,82,206,96,191,107,174,114,153,118,16383,16383,85,195,86,202,88,207,92,209,97,211,103,211,127,209,145,203,156,194,162,182,164,166,161,151,154,139,143,130,128,125,110,123,99,124,92,125,87,128,85,132,85,139,16383,16383,85,97,85,102,87,105,91,108,98,109,127,109,144,105,159,98,170,84,174,62,174,63,170,42,160,28,146,19,127,15,106,14,98,15,92,17,88,20,85,26,85,34,194,155,191,225,8,225,8,218,22,217,31,215,36,211,39,204,40,194,40,40,39,25,36,16,30,11,21,9,8,7,8,0,113,0,113,7,100,9,91,13,85,18,82,26,81,36,81,194,82,200,83,205,86,208,91,209,98,210,130,208,154,201,170,190,180,175,185,155,219,225,21,225,21,218,34,216,44,212,51,206,55,197,56,183,56,99,55,66,51,40,42,22,28,11,7,7,7,-68,16,-68,26,-37,37,-17,47,-5,58,0,172,0,182,-5,191,-17,200,-37,210,-68,219,-68,219,7,206,9,197,11,192,16,189,25,189,198,192,207,198,213,206,216,219,218,16383,16383,147,41,146,30,143,23,139,18,133,15,126,14,58,14,64,28,68,43,71,59,73,75,73,190,74,199,
+153,118,169,121,183,128,194,137,202,151,205,168,201,188,191,204,174,215,149,222,118,225,12,225,12,218,26,216,35,214,40,209,42,200,43,187,43,39,42,25,40,16,35,11,26,8,12,7,12,0,149,0,161,2,171,4,181,8,190,12,200,19,208,28,214,39,218,51,219,63,215,82,206,96,191,107,174,114,153,118,16383,16383,85,195,86,202,88,207,92,209,97,211,103,211,127,209,145,203,156,194,162,182,164,166,161,151,154,139,143,130,128,125,110,123,99,124,92,125,87,128,85,132,85,139,16383,16383,85,97,85,102,87,105,91,108,98,109,127,109,144,105,159,98,170,84,174,62,174,63,170,42,160,28,146,19,127,15,106,14,98,15,92,17,88,20,85,26,85,34,
 40,16,35,11,137,0,137,0,35,11,26,8,137,0,26,8,12,7,86,202,88,207,43,187,43,187,88,207,92,209,43,187,92,209,118,225,118,225,92,209,97,211,118,225,97,211,103,211,103,211,127,209,118,225,118,225,127,209,149,222,159,98,170,84,174,114,174,114,170,84,174,62,174,114,174,62,174,63,174,63,174,62,181,8,181,8,174,62,171,4,171,4,174,62,170,42,171,4,170,42,161,2,161,2,170,42,160,28,161,2,160,28,149,0,149,0,160,28,146,19,149,0,146,19,137,0,137,0,146,19,127,15,137,0,127,15,106,14,106,14,98,15,137,0,137,0,98,15,92,17,137,0,92,17,42,25,42,25,92,17,43,39,127,109,110,123,109,109,98,109,109,109,99,124,98,109,99,124,92,125,85,139,85,102,85,132,85,132,85,102,87,105,85,132,87,105,87,128,87,128,87,105,91,108,87,128,91,108,92,125,92,125,91,108,98,109,110,123,99,124,109,109,161,151,169,121,164,166,164,166,169,121,174,215,174,215,169,121,183,128,174,215,183,128,191,204,191,204,183,128,194,137,191,204,194,137,201,188,201,188,194,137,202,151,201,188,202,151,205,168,127,209,145,203,149,222,149,222,145,203,156,194,149,222,156,194,174,215,174,215,156,194,162,182,174,215,162,182,164,166,159,98,153,118,144,105,144,105,153,118,154,139,154,139,153,118,169,121,154,139,169,121,161,151,110,123,127,109,128,125,128,125,127,109,144,105,128,125,144,105,143,130,143,130,144,105,154,139,215,82,206,96,208,28,215,82,208,28,214,39,215,82,214,39,218,51,215,82,218,51,219,63,181,8,190,12,191,107,191,107,190,12,200,19,191,107,200,19,206,96,206,96,200,19,208,28,191,107,174,114,174,63,191,107,174,63,181,8,85,26,85,34,43,187,85,26,43,187,43,39,85,26,43,39,88,20,85,195,86,202,43,187,85,195,43,187,85,34,35,214,40,209,118,225,118,225,40,209,42,200,118,225,42,200,43,187,26,216,35,214,118,225,26,216,118,225,12,225,26,216,12,225,12,218,137,0,12,7,12,0,40,16,137,0,42,25,43,39,92,17,88,20,153,118,159,98,174,114,85,102,85,139,85,97,
-194,155,191,225,8,225,8,218,22,217,31,215,36,211,39,204,40,194,40,40,39,25,36,16,30,11,21,9,8,7,8,0,113,0,113,7,100,9,91,13,85,18,82,26,81,36,81,194,82,200,83,205,86,208,91,209,98,210,130,208,154,201,170,190,180,175,185,155,219,225,21,225,21,218,34,216,44,212,51,206,55,197,56,183,56,99,55,66,51,40,42,22,28,11,7,7,7,-68,16,-68,26,-37,37,-17,47,-5,58,0,172,0,182,-5,191,-17,200,-37,210,-68,219,-68,219,7,206,9,197,11,192,16,189,25,189,198,192,207,198,213,
+194,155,191,225,8,225,8,218,22,217,31,215,36,211,39,204,40,194,40,40,39,25,36,16,30,11,21,9,8,7,8,0,113,0,113,7,100,9,91,13,85,18,82,26,81,36,81,194,82,200,83,205,86,208,91,209,98,210,130,208,154,201,170,190,180,175,185,155,
 36,211,39,204,191,225,191,225,39,204,91,209,191,225,91,209,98,210,98,210,130,208,191,225,191,225,130,208,154,201,191,225,154,201,170,190,191,225,170,190,180,175,191,225,180,175,185,155,191,225,185,155,194,155,81,36,81,194,40,194,40,194,81,194,82,200,40,194,82,200,83,205,40,194,83,205,86,208,40,194,86,208,91,209,40,194,91,209,39,204,40,194,82,26,81,36,191,225,8,225,22,217,191,225,22,217,31,215,191,225,31,215,36,211,113,0,113,7,100,9,113,0,100,9,91,13,113,0,91,13,40,40,113,0,40,40,39,25,113,0,39,25,36,16,113,0,36,16,30,11,113,0,30,11,21,9,113,0,21,9,8,7,113,0,8,7,8,0,40,40,91,13,85,18,40,40,85,18,82,26,40,40,82,26,40,194,22,217,8,225,8,218,
-219,225,21,225,21,218,34,216,44,212,51,206,55,197,56,183,56,99,55,66,51,40,42,22,28,11,7,7,7,-68,16,-68,26,-37,37,-17,47,-5,58,0,172,0,182,-5,191,-17,200,-37,210,-68,219,-68,219,7,206,9,197,11,192,16,189,25,189,198,192,207,198,213,206,216,219,218,16383,16383,147,41,146,30,143,23,139,18,133,15,126,14,58,14,64,28,68,43,71,59,73,75,73,190,74,199,76,205,80,209,85,210,92,211,135,211,141,209,145,205,146,199,147,190,210,82,196,63,182,48,167,39,150,33,132,31,102,37,80,53,66,77,58,106,55,137,209,137,208,152,205,165,202,176,197,186,192,195,181,207,169,217,156,224,140,228,123,230,88,224,59,207,37,182,24,148,19,108,23,70,35,39,55,15,81,0,114,-4,142,-1,167,9,188,26,205,49,219,79,16383,16383,56,151,61,172,69,190,80,203,93,211,109,214,126,211,139,203,148,191,154,173,158,151,353,0,353,7,347,8,341,10,331,14,327,17,323,21,317,28,311,37,304,47,
+219,225,21,225,21,218,34,216,44,212,51,206,55,197,56,183,56,99,55,66,51,40,42,22,28,11,7,7,7,-68,16,-68,26,-37,37,-17,47,-5,58,0,172,0,182,-5,191,-17,200,-37,210,-68,219,-68,219,7,206,9,197,11,192,16,189,25,189,198,192,207,198,213,206,216,219,218,16383,16383,147,41,146,30,143,23,139,18,133,15,126,14,58,14,64,28,68,43,71,59,73,75,73,190,74,199,76,205,80,209,85,210,92,211,135,211,141,209,145,205,146,199,147,190,
 34,216,44,212,219,225,219,225,44,212,85,210,219,225,85,210,92,211,219,225,92,211,127,211,219,225,127,211,135,211,126,14,58,14,68,0,126,14,68,0,161,0,126,14,161,0,133,15,147,190,161,0,189,198,189,198,161,0,172,0,189,198,172,0,189,183,189,183,172,0,182,-5,189,183,182,-5,189,41,189,41,182,-5,191,-17,189,41,191,-17,189,25,161,0,147,190,147,41,161,0,147,41,146,30,161,0,146,30,143,23,161,0,143,23,139,18,161,0,139,18,133,15,219,225,135,211,141,209,219,225,141,209,145,205,219,225,145,205,146,199,219,225,146,199,147,190,219,225,147,190,198,213,219,225,198,213,206,216,219,225,206,216,219,218,192,207,198,213,147,190,192,207,147,190,189,198,73,190,74,199,58,14,73,190,58,14,64,28,73,190,64,28,68,43,73,190,68,43,71,59,73,190,71,59,73,75,73,190,73,75,73,89,58,0,68,0,58,14,58,0,58,14,56,183,58,0,56,183,56,99,58,0,56,99,55,66,58,0,55,66,51,40,58,0,51,40,47,-5,58,14,74,199,56,183,56,183,74,199,76,205,56,183,76,205,55,197,55,197,76,205,80,209,55,197,80,209,51,206,51,206,80,209,85,210,51,206,85,210,44,212,21,225,21,218,34,216,21,225,34,216,219,225,219,-68,219,7,210,-68,210,-68,219,7,206,9,210,-68,206,9,200,-37,200,-37,206,9,197,11,200,-37,197,11,192,16,192,16,189,25,191,-17,192,16,191,-17,200,-37,16,-68,26,-37,28,11,28,11,26,-37,37,-17,28,11,37,-17,42,22,42,22,37,-17,47,-5,42,22,47,-5,51,40,7,7,7,-68,16,-68,7,7,16,-68,28,11,
-210,82,196,63,182,48,167,39,150,33,132,31,102,37,80,53,66,77,58,106,55,137,209,137,208,152,205,165,202,176,197,186,192,195,181,207,169,217,156,224,140,228,123,230,88,224,59,207,37,182,24,148,19,108,23,70,35,39,55,15,81,0,114,-4,142,-1,167,9,188,26,205,49,219,79,16383,16383,56,151,61,172,69,190,80,203,93,211,109,214,126,211,139,203,148,191,154,173,158,151,353,0,353,7,347,8,341,10,331,14,327,17,323,21,317,28,311,37,304,47,298,58,286,79,275,94,264,105,253,113,240,120,240,121,258,137,269,156,278,172,286,185,297,190,301,189,306,187,318,183,324,182,332,183,338,186,343,191,346,197,347,204,346,211,342,218,336,223,327,227,316,228,306,227,297,224,289,218,282,211,275,201,267,187,259,171,251,156,242,143,233,135,228,132,222,130,215,128,
+210,82,196,63,182,48,167,39,150,33,132,31,102,37,80,53,66,77,58,106,55,137,209,137,208,152,205,165,202,176,197,186,192,195,181,207,169,217,156,224,140,228,123,230,88,224,59,207,37,182,24,148,19,108,23,70,35,39,55,15,81,0,114,-4,142,-1,167,9,188,26,205,49,219,79,16383,16383,56,151,61,172,69,190,80,203,93,211,109,214,126,211,139,203,148,191,154,173,158,151,
 80,53,66,77,81,0,81,0,66,77,58,106,81,0,58,106,55,15,55,15,58,106,55,137,56,151,55,137,209,137,56,151,209,137,158,151,158,151,209,137,169,217,140,228,123,230,126,211,126,211,123,230,109,214,93,211,109,214,123,230,93,211,123,230,88,224,156,224,140,228,148,191,156,224,148,191,154,173,156,224,154,173,158,151,156,224,158,151,169,217,140,228,126,211,139,203,140,228,139,203,148,191,56,151,61,172,59,207,59,207,61,172,69,190,59,207,69,190,88,224,88,224,69,190,80,203,88,224,80,203,93,211,37,182,24,148,35,39,37,182,35,39,55,15,37,182,55,15,55,137,37,182,55,137,56,151,37,182,56,151,59,207,24,148,19,108,23,70,24,148,23,70,35,39,81,0,114,-4,102,37,102,37,114,-4,132,31,150,33,132,31,142,-1,150,33,142,-1,167,9,209,137,208,152,205,165,209,137,205,165,202,176,209,137,202,176,197,186,209,137,197,186,192,195,209,137,192,195,181,207,209,137,181,207,169,217,219,79,210,82,205,49,205,49,210,82,196,63,205,49,196,63,188,26,188,26,196,63,182,48,188,26,182,48,167,9,167,9,182,48,167,39,167,9,167,39,150,33,132,31,114,-4,142,-1,80,53,81,0,102,37,
-353,0,353,7,347,8,341,10,331,14,327,17,323,21,317,28,311,37,304,47,298,58,286,79,275,94,264,105,253,113,240,120,240,121,258,137,269,156,278,172,286,185,297,190,301,189,306,187,318,183,324,182,332,183,338,186,343,191,346,197,347,204,346,211,342,218,336,223,327,227,316,228,306,227,297,224,289,218,282,211,275,201,267,187,259,171,251,156,242,143,233,135,228,132,222,130,215,128,208,127,200,127,200,190,201,199,204,207,210,212,219,216,232,218,232,225,128,225,128,218,140,216,149,214,154,209,158,201,158,127,151,127,144,128,138,129,132,132,127,135,117,145,108,157,101,170,88,196,82,207,75,216,67,223,56,227,44,228,34,227,26,224,20,219,15,212,14,204,15,197,18,191,23,186,29,183,36,182,43,183,50,185,60,189,65,190,74,185,80,172,87,155,100,137,121,121,121,120,107,114,95,107,85,95,74,79,62,57,63,57,56,46,50,36,44,28,38,21,33,17,29,14,25,12,19,10,14,8,7,7,7,0,73,0,124,83,133,96,139,104,145,109,151,112,158,113,158,25,155,18,151,13,145,10,137,8,126,7,126,0,234,0,234,7,214,9,207,12,203,17,201,24,200,33,200,113,209,111,216,108,222,104,228,95,237,82,287,0,114,121,130,126,146,134,158,146,167,160,170,177,168,188,164,198,158,207,149,215,139,221,121,227,111,229,99,230,80,230,75,229,69,228,64,226,57,224,49,222,46,220,42,219,35,219,29,223,27,226,26,230,20,230,16,150,25,150,30,172,38,190,50,204,65,213,85,216,98,214,110,209,119,200,125,188,127,172,126,163,123,155,118,147,112,140,104,135,97,132,89,129,81,128,72,127,60,127,60,113,86,111,106,106,120,96,129,82,132,62,130,47,124,34,114,23,99,15,79,13,65,14,52,18,40,24,28,33,14,46,7,39,19,23,32,11,46,2,64,-2,85,-4,113,-2,125,1,137,5,147,12,157,20,166,29,173,40,177,52,179,65,175,84,165,99,151,110,133,117,114,121,251,225,147,225,147,218,160,216,169,213,174,207,177,200,178,189,84,60,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,178,165,178,37,177,26,174,18,169,12,160,9,147,7,147,0,251,0,251,7,238,9,229,12,224,17,221,26,220,40,220,183,221,198,223,207,229,213,238,216,251,218,201,319,199,330,195,340,
+353,0,353,7,347,8,341,10,331,14,327,17,323,21,317,28,311,37,304,47,298,58,286,79,275,94,264,105,253,113,240,120,240,121,258,137,269,156,278,172,286,185,297,190,301,189,306,187,318,183,324,182,332,183,338,186,343,191,346,197,347,204,346,211,342,218,336,223,327,227,316,228,306,227,297,224,289,218,282,211,275,201,267,187,259,171,251,156,242,143,233,135,228,132,222,130,215,128,208,127,200,127,200,190,201,199,204,207,210,212,219,216,232,218,232,225,128,225,128,218,140,216,149,214,154,209,158,201,158,127,151,127,144,128,138,129,132,132,127,135,117,145,108,157,101,170,88,196,82,207,75,216,67,223,56,227,44,228,34,227,26,224,20,219,15,212,14,204,15,197,18,191,23,186,29,183,36,182,43,183,50,185,60,189,65,190,74,185,80,172,87,155,100,137,121,121,121,120,107,114,95,107,85,95,74,79,62,57,63,57,56,46,50,36,44,28,38,21,33,17,29,14,25,12,19,10,14,8,7,7,7,0,73,0,124,83,133,96,139,104,145,109,151,112,158,113,158,25,155,18,151,13,145,10,137,8,126,7,126,0,234,0,234,7,214,9,207,12,203,17,201,24,200,33,200,113,209,111,216,108,222,104,228,95,237,82,287,0,
 25,12,19,10,73,0,73,0,19,10,14,8,73,0,14,8,7,7,50,36,44,28,73,0,73,0,44,28,38,21,73,0,38,21,33,17,33,17,29,14,73,0,73,0,29,14,25,12,95,107,85,95,124,83,124,83,85,95,74,79,124,83,74,79,73,0,73,0,74,79,62,57,73,0,62,57,56,46,56,46,62,57,63,57,67,223,65,190,74,185,67,223,74,185,75,216,75,216,74,185,80,172,75,216,80,172,82,207,82,207,80,172,87,155,82,207,87,155,88,196,88,196,87,155,100,137,88,196,100,137,94,184,94,184,100,137,101,170,50,185,55,187,56,227,56,227,55,187,60,189,56,227,60,189,67,223,67,223,60,189,65,190,44,228,34,227,36,182,44,228,36,182,43,183,44,228,43,183,50,185,44,228,50,185,56,227,14,204,15,197,15,212,15,212,15,197,18,191,15,212,18,191,20,219,20,219,18,191,23,186,20,219,23,186,26,224,26,224,23,186,29,183,26,224,29,183,34,227,34,227,29,183,36,182,127,135,121,121,124,83,127,135,124,83,133,96,127,135,117,145,121,121,121,121,117,145,108,157,121,121,108,157,101,170,121,121,101,170,100,137,155,18,151,13,234,0,234,0,151,13,145,10,234,0,145,10,137,8,137,8,126,7,234,0,234,0,126,7,126,0,234,0,234,7,224,8,234,0,224,8,214,9,234,0,214,9,207,12,234,0,207,12,158,33,234,0,158,33,158,25,234,0,158,25,155,18,201,24,200,33,158,113,201,24,158,113,203,17,203,17,158,113,158,33,158,113,200,33,200,127,158,113,200,127,200,190,158,113,200,190,201,199,158,113,201,199,204,207,158,113,204,207,158,189,158,113,158,189,158,127,215,128,208,127,209,111,209,111,208,127,200,127,232,225,128,225,140,216,232,225,140,216,149,214,232,225,149,214,154,209,232,225,154,209,158,201,232,225,158,201,158,189,232,225,158,189,210,212,232,225,210,212,219,216,232,225,219,216,232,218,264,105,253,113,287,0,287,0,253,113,240,120,287,0,240,120,237,82,237,82,240,120,240,121,237,82,240,121,233,135,237,82,233,135,228,95,228,95,233,135,228,132,228,95,228,132,222,104,222,104,228,132,222,130,222,104,222,130,216,108,216,108,222,130,215,128,216,108,215,128,209,111,317,28,311,37,287,0,287,0,311,37,304,47,287,0,304,47,298,58,297,224,297,190,301,189,297,224,301,189,306,227,306,227,301,189,306,187,306,227,306,187,316,228,316,228,306,187,312,185,316,228,312,185,318,183,297,190,289,218,286,185,286,185,289,218,282,211,286,185,282,211,278,172,278,172,282,211,275,201,278,172,275,201,269,156,269,156,275,201,267,187,269,156,267,187,259,171,258,137,269,156,259,171,258,137,259,171,251,156,258,137,251,156,242,143,258,137,242,143,240,121,242,143,233,135,240,121,318,183,324,182,327,227,327,227,324,182,332,183,327,227,332,183,336,223,336,223,332,183,338,186,336,223,338,186,342,218,342,218,338,186,343,191,342,218,343,191,346,211,346,211,343,191,346,197,346,211,346,197,347,204,317,28,287,0,323,21,323,21,287,0,327,17,331,14,327,17,287,0,331,14,287,0,353,0,353,0,353,7,347,8,353,0,347,8,341,10,353,0,341,10,336,12,353,0,336,12,331,14,287,0,298,58,286,79,287,0,286,79,275,94,287,0,275,94,264,105,145,109,151,112,151,127,151,127,151,112,158,113,151,127,158,113,158,127,132,132,127,135,133,96,132,132,133,96,138,129,138,129,133,96,139,104,138,129,139,104,144,128,144,128,139,104,145,109,144,128,145,109,151,127,124,83,121,121,121,120,124,83,121,120,107,114,124,83,107,114,95,107,73,0,7,7,7,0,50,36,73,0,56,46,316,228,318,183,327,227,297,190,297,224,289,218,200,127,200,113,209,111,140,216,128,225,128,218,210,212,158,189,204,207,158,33,207,12,203,17,
-114,121,130,126,146,134,158,146,167,160,170,177,168,188,164,198,158,207,149,215,139,221,121,227,111,229,99,230,80,230,75,229,69,228,64,226,57,224,49,222,46,220,42,219,35,219,29,223,27,226,26,230,20,230,16,150,25,150,30,172,38,190,50,204,65,213,85,216,98,214,110,209,119,200,125,188,127,172,126,163,123,155,118,147,112,140,104,135,97,132,89,129,81,128,72,127,60,127,60,113,86,111,106,106,120,96,129,82,132,62,130,47,124,34,114,23,99,15,79,13,65,14,52,18,40,24,28,33,14,46,7,39,19,23,32,11,46,2,64,-2,85,-4,113,-2,125,1,137,5,147,12,157,20,166,29,173,40,177,52,179,65,175,84,165,99,151,110,133,117,114,121,251,225,147,225,147,218,160,216,169,213,174,207,177,200,178,189,84,60,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,178,165,178,37,177,26,174,18,169,12,160,9,147,7,147,0,251,0,251,7,238,9,229,12,224,17,221,26,220,40,220,183,221,198,223,207,229,213,238,216,251,218,201,319,199,330,195,340,188,347,180,351,171,352,167,352,161,348,159,344,158,339,160,332,166,329,172,327,178,324,180,319,179,313,174,307,166,303,152,300,133,299,115,300,102,303,93,307,88,313,87,319,89,324,95,327,101,329,107,332,
+114,121,130,126,146,134,158,146,167,160,170,177,168,188,164,198,158,207,149,215,139,221,121,227,111,229,99,230,80,230,75,229,69,228,64,226,57,224,49,222,46,220,42,219,35,219,29,223,27,226,26,230,20,230,16,150,25,150,30,172,38,190,50,204,65,213,85,216,98,214,110,209,119,200,125,188,127,172,126,163,123,155,118,147,112,140,104,135,97,132,89,129,81,128,72,127,60,127,60,113,86,111,106,106,120,96,129,82,132,62,130,47,124,34,114,23,99,15,79,13,65,14,52,18,40,24,28,33,14,46,7,39,19,23,32,11,46,2,64,-2,85,-4,113,-2,125,1,137,5,147,12,157,20,166,29,173,40,177,52,179,65,175,84,165,99,151,110,133,117,114,121,
 26,230,20,230,25,150,26,230,25,150,30,172,26,230,30,172,27,226,49,222,46,220,50,204,50,204,46,220,42,219,50,204,42,219,39,219,39,219,35,219,38,190,38,190,35,219,32,221,38,190,32,221,30,172,30,172,32,221,29,223,30,172,29,223,27,226,64,-2,85,-4,65,14,65,14,85,-4,79,13,99,15,79,13,85,-4,99,15,85,-4,99,-3,85,216,80,230,75,229,85,216,75,229,69,228,85,216,69,228,65,213,85,216,86,230,80,230,65,213,69,228,64,226,65,213,64,226,57,224,65,213,57,224,53,223,65,213,53,223,50,204,39,219,38,190,50,204,81,128,86,111,89,129,89,129,86,111,106,106,89,129,106,106,97,132,97,132,106,106,104,135,112,140,104,135,106,106,112,140,106,106,114,121,114,121,106,106,120,96,114,121,120,96,133,117,133,117,120,96,129,82,133,117,129,82,132,62,86,230,98,214,99,230,99,230,98,214,110,209,99,230,110,209,111,229,111,229,110,209,119,200,111,229,119,200,121,227,121,227,119,200,125,188,121,227,125,188,130,224,130,224,125,188,127,172,130,126,127,172,126,163,126,163,123,155,130,126,130,126,123,155,118,147,130,126,118,147,114,121,114,121,118,147,112,140,170,177,168,188,167,160,167,160,168,188,164,198,167,160,164,198,158,146,158,146,164,198,158,207,158,146,158,207,149,215,146,134,158,146,149,215,146,134,149,215,139,221,146,134,139,221,130,224,146,134,130,224,130,126,85,216,98,214,86,230,133,117,132,62,137,5,133,117,137,5,151,110,151,110,137,5,147,12,151,110,147,12,157,20,175,84,165,99,166,29,175,84,166,29,173,40,175,84,173,40,177,52,175,84,177,52,179,65,165,99,151,110,157,20,165,99,157,20,166,29,130,47,124,34,125,1,130,47,125,1,137,5,130,47,137,5,132,62,114,23,99,15,99,-3,114,23,99,-3,113,-2,114,23,113,-2,125,1,114,23,125,1,124,34,72,127,60,127,86,111,72,127,86,111,81,128,14,46,19,23,28,33,28,33,19,23,32,11,28,33,32,11,40,24,40,24,32,11,46,2,40,24,46,2,52,18,52,18,46,2,64,-2,52,18,64,-2,65,14,19,23,14,46,7,39,86,111,60,127,60,113,130,224,127,172,130,126,49,222,50,204,53,223,25,150,20,230,16,150,
-251,225,147,225,147,218,160,216,169,213,174,207,177,200,178,189,84,60,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,178,165,178,37,177,26,174,18,169,12,160,9,147,7,147,0,251,0,251,7,238,9,229,12,224,17,221,26,220,40,220,183,221,198,223,207,229,213,238,216,251,218,201,319,199,330,195,340,188,347,180,351,171,352,167,352,161,348,159,344,158,339,160,332,166,329,172,327,178,324,180,319,179,313,174,307,166,303,152,300,133,299,115,300,102,303,93,307,88,313,87,319,89,324,95,327,101,329,107,332,109,339,108,344,107,348,101,352,97,352,88,351,80,347,73,340,68,330,66,319,70,302,82,289,98,280,116,275,133,273,151,275,169,280,185,289,196,302,201,319,16383,16383,251,225,147,225,147,218,160,216,169,213,174,207,
+251,225,147,225,147,218,160,216,169,213,174,207,177,200,178,189,84,60,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,178,165,178,37,177,26,174,18,169,12,160,9,147,7,147,0,251,0,251,7,238,9,229,12,224,17,221,26,220,40,220,183,221,198,223,207,229,213,238,216,251,218,
 39,16,33,11,116,0,116,0,33,11,25,9,116,0,25,9,12,7,178,189,84,60,84,36,84,36,84,189,42,183,42,183,84,189,85,199,42,183,85,199,88,207,116,225,12,225,25,216,116,225,25,216,33,212,116,225,33,212,39,206,116,225,39,206,42,197,116,225,42,197,93,212,116,225,93,212,102,216,116,225,102,216,116,218,42,183,88,207,93,212,42,183,93,212,42,197,174,18,169,12,251,0,251,0,169,12,160,9,251,0,160,9,147,7,169,213,174,207,251,225,251,225,174,207,177,200,251,225,177,200,178,189,178,189,178,165,221,26,221,26,178,165,178,37,221,26,178,37,224,17,224,17,178,37,229,12,238,216,251,218,251,225,238,216,251,225,229,213,229,213,251,225,178,189,229,213,178,189,223,207,223,207,178,189,221,198,220,40,220,183,178,189,220,40,178,189,221,26,160,216,169,213,251,225,160,216,251,225,147,225,160,216,147,225,147,218,251,0,251,7,238,9,251,0,238,9,229,12,251,0,229,12,178,37,251,0,178,37,177,26,251,0,177,26,174,18,116,0,116,7,102,9,116,0,102,9,93,13,116,0,93,13,42,40,116,0,42,40,42,25,116,0,42,25,39,16,85,26,84,36,42,183,85,26,42,183,42,40,85,26,42,40,88,18,116,0,12,7,12,0,42,40,93,13,88,18,251,0,147,7,147,0,221,198,178,189,220,183,178,189,84,36,178,165,25,216,12,225,12,218,
-201,319,199,330,195,340,188,347,180,351,171,352,167,352,161,348,159,344,158,339,160,332,166,329,172,327,178,324,180,319,179,313,174,307,166,303,152,300,133,299,115,300,102,303,93,307,88,313,87,319,89,324,95,327,101,329,107,332,109,339,108,344,107,348,101,352,97,352,88,351,80,347,73,340,68,330,66,319,70,302,82,289,98,280,116,275,133,273,151,275,169,280,185,289,196,302,201,319,16383,16383,251,225,147,225,147,218,160,216,169,213,174,207,177,200,178,189,84,60,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,178,165,178,37,177,26,174,18,169,12,160,9,147,7,147,0,251,0,251,7,238,9,229,12,224,17,221,26,220,40,220,183,221,198,223,207,229,213,238,216,251,218,248,0,248,7,241,8,235,10,225,14,221,17,217,21,211,28,205,37,198,47,192,58,180,79,168,94,156,105,144,113,131,120,131,121,148,137,160,156,168,172,176,185,188,190,192,189,202,185,208,183,214,182,222,183,228,186,233,191,237,197,238,204,236,211,233,218,226,223,218,227,207,228,196,227,185,223,176,216,168,207,161,196,140,154,132,143,124,135,118,132,112,130,105,128,98,127,91,127,91,190,92,199,95,207,100,212,109,216,122,218,122,225,18,225,18,218,31,216,39,214,45,209,48,201,49,189,49,25,46,18,42,13,36,10,26,8,12,7,12,0,128,0,128,7,117,8,107,9,99,12,94,17,92,24,91,33,91,113,99,111,106,108,112,103,118,95,127,82,181,0,238,225,45,225,45,218,57,216,66,212,71,206,74,197,75,183,75,99,74,77,73,53,69,33,62,18,50,12,46,15,42,22,38,30,32,36,23,39,18,38,13,36,
+201,319,199,330,195,340,188,347,180,351,171,352,167,352,161,348,159,344,158,339,160,332,166,329,172,327,178,324,180,319,179,313,174,307,166,303,152,300,133,299,115,300,102,303,93,307,88,313,87,319,89,324,95,327,101,329,107,332,109,339,108,344,107,348,101,352,97,352,88,351,80,347,73,340,68,330,66,319,70,302,82,289,98,280,116,275,133,273,151,275,169,280,185,289,196,302,201,319,16383,16383,251,225,147,225,147,218,160,216,169,213,174,207,177,200,178,189,84,60,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,178,165,178,37,177,26,174,18,169,12,160,9,147,7,147,0,251,0,251,7,238,9,229,12,224,17,221,26,220,40,220,183,221,198,223,207,229,213,238,216,251,218,
 102,303,93,307,98,280,98,280,93,307,88,313,98,280,88,313,82,289,82,289,88,313,87,319,88,351,87,319,89,324,88,351,89,324,97,352,97,352,89,324,95,327,97,352,95,327,101,329,101,352,101,329,104,350,104,350,101,329,107,332,104,350,107,332,107,348,107,348,107,332,109,339,107,348,109,339,108,344,82,289,87,319,88,351,82,289,88,351,80,347,82,289,80,347,73,340,82,289,73,340,70,302,68,330,66,319,70,302,68,330,70,302,73,340,102,303,116,275,115,300,115,300,116,275,133,299,152,300,133,299,133,273,152,300,133,273,151,275,196,302,201,319,199,330,196,302,199,330,195,340,196,302,195,340,188,347,196,302,188,347,185,289,185,289,188,347,180,319,185,289,180,319,179,313,185,289,179,313,174,307,185,289,174,307,169,280,180,351,171,352,172,327,180,351,172,327,178,324,180,351,178,324,180,319,180,351,180,319,188,347,167,352,164,350,166,329,167,352,166,329,172,327,167,352,172,327,171,352,161,348,159,344,160,332,161,348,160,332,166,329,161,348,166,329,164,350,169,280,174,307,166,303,169,280,166,303,152,300,169,280,152,300,151,275,133,299,116,275,133,273,39,16,33,11,116,0,116,0,33,11,25,9,116,0,25,9,12,7,178,189,84,60,84,36,84,36,84,189,42,183,42,183,84,189,85,199,42,183,85,199,88,207,116,225,12,225,25,216,116,225,25,216,33,212,116,225,33,212,39,206,116,225,39,206,42,197,116,225,42,197,93,212,116,225,93,212,102,216,116,225,102,216,116,218,42,183,88,207,93,212,42,183,93,212,42,197,174,18,169,12,251,0,251,0,169,12,160,9,251,0,160,9,147,7,169,213,174,207,251,225,251,225,174,207,177,200,251,225,177,200,178,189,178,189,178,165,221,26,221,26,178,165,178,37,221,26,178,37,224,17,224,17,178,37,229,12,238,216,251,218,251,225,238,216,251,225,229,213,229,213,251,225,178,189,229,213,178,189,223,207,223,207,178,189,221,198,220,40,220,183,178,189,220,40,178,189,221,26,160,216,169,213,251,225,160,216,251,225,147,225,160,216,147,225,147,218,251,0,251,7,238,9,251,0,238,9,229,12,251,0,229,12,178,37,251,0,178,37,177,26,251,0,177,26,174,18,116,0,116,7,102,9,116,0,102,9,93,13,116,0,93,13,42,40,116,0,42,40,42,25,116,0,42,25,39,16,85,26,84,36,42,183,85,26,42,183,42,40,85,26,42,40,88,18,116,0,12,7,12,0,42,40,93,13,88,18,251,0,147,7,147,0,221,198,178,189,220,183,178,189,84,36,178,165,25,216,12,225,12,218,160,332,159,344,158,339,102,303,98,280,116,275,97,352,101,329,101,352,
-248,0,248,7,241,8,235,10,225,14,221,17,217,21,211,28,205,37,198,47,192,58,180,79,168,94,156,105,144,113,131,120,131,121,148,137,160,156,168,172,176,185,188,190,192,189,202,185,208,183,214,182,222,183,228,186,233,191,237,197,238,204,236,211,233,218,226,223,218,227,207,228,196,227,185,223,176,216,168,207,161,196,140,154,132,143,124,135,118,132,112,130,105,128,98,127,91,127,91,190,92,199,95,207,100,212,109,216,122,218,122,225,18,225,18,218,31,216,39,214,45,209,48,201,49,189,49,25,46,18,42,13,36,10,26,8,12,7,12,0,128,0,128,7,117,8,107,9,99,12,94,17,92,24,91,33,91,113,99,111,106,108,112,103,118,95,127,82,181,0,238,225,45,225,45,218,57,216,66,212,71,206,74,197,75,183,75,99,74,77,73,53,69,33,62,18,50,12,46,15,42,22,38,30,32,36,23,39,18,38,13,36,8,33,5,27,4,20,6,10,10,3,18,-1,28,-3,39,-4,64,2,79,18,88,41,91,66,92,89,92,198,94,204,98,208,103,210,110,211,154,211,159,209,163,205,165,199,165,37,164,26,161,18,156,12,147,9,134,7,134,0,238,0,238,7,225,9,216,12,211,17,208,26,207,40,207,183,208,198,211,207,216,213,225,216,238,218,297,225,229,225,157,62,79,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,92,0,92,7,78,9,69,12,63,18,60,26,
+248,0,248,7,241,8,235,10,225,14,221,17,217,21,211,28,205,37,198,47,192,58,180,79,168,94,156,105,144,113,131,120,131,121,148,137,160,156,168,172,176,185,188,190,192,189,202,185,208,183,214,182,222,183,228,186,233,191,237,197,238,204,236,211,233,218,226,223,218,227,207,228,196,227,185,223,176,216,168,207,161,196,140,154,132,143,124,135,118,132,112,130,105,128,98,127,91,127,91,190,92,199,95,207,100,212,109,216,122,218,122,225,18,225,18,218,31,216,39,214,45,209,48,201,49,189,49,25,46,18,42,13,36,10,26,8,12,7,12,0,128,0,128,7,117,8,107,9,99,12,94,17,92,24,91,33,91,113,99,111,106,108,112,103,118,95,127,82,181,0,
 46,18,42,13,128,0,128,0,42,13,36,10,128,0,36,10,26,8,26,8,12,7,128,0,128,0,12,7,12,0,128,0,128,7,117,8,128,0,117,8,107,9,128,0,107,9,99,12,128,0,99,12,49,33,128,0,49,33,49,25,128,0,49,25,46,18,91,33,91,127,49,189,91,33,49,189,92,24,49,33,99,12,94,17,49,33,94,17,92,24,49,33,92,24,49,189,91,113,99,111,91,127,91,127,91,190,49,189,49,189,91,190,92,199,49,189,92,199,95,207,122,225,18,225,31,216,122,225,31,216,39,214,122,225,39,214,45,209,122,225,45,209,48,201,122,225,48,201,49,189,122,225,49,189,100,212,122,225,100,212,109,216,122,225,109,216,122,218,106,108,112,103,112,130,112,130,112,103,118,95,112,130,118,95,118,132,118,132,118,95,124,135,132,143,124,135,127,82,105,128,98,127,99,111,105,128,99,111,106,108,105,128,106,108,112,130,127,82,124,135,118,95,202,185,207,228,197,187,197,187,207,228,196,227,197,187,196,227,192,189,192,189,196,227,188,190,176,185,188,190,185,223,176,185,185,223,176,216,147,168,148,137,154,182,154,182,148,137,160,156,154,182,160,156,161,196,161,196,160,156,168,172,161,196,168,172,168,207,168,207,168,172,176,185,168,207,176,185,176,216,156,105,144,113,181,0,181,0,144,113,131,120,181,0,131,120,127,82,127,82,131,120,131,121,127,82,131,121,132,143,132,143,131,121,148,137,132,143,148,137,140,154,140,154,148,137,147,168,208,183,214,182,218,227,218,227,214,182,222,183,218,227,222,183,226,223,226,223,222,183,228,186,226,223,228,186,233,218,233,218,228,186,233,191,233,218,233,191,236,211,236,211,233,191,237,197,236,211,237,197,238,204,207,228,202,185,208,183,207,228,208,183,218,227,196,227,185,223,188,190,211,28,181,0,217,21,217,21,181,0,221,17,225,14,221,17,181,0,225,14,181,0,248,0,248,0,248,7,241,8,248,0,241,8,235,10,248,0,235,10,230,12,248,0,230,12,225,14,181,0,211,28,205,37,181,0,205,37,198,47,181,0,198,47,192,58,181,0,192,58,180,79,181,0,180,79,168,94,181,0,168,94,156,105,91,127,99,111,98,127,31,216,18,225,18,218,100,212,49,189,95,207,
-238,225,45,225,45,218,57,216,66,212,71,206,74,197,75,183,75,99,74,77,73,53,69,33,62,18,50,12,46,15,42,22,38,30,32,36,23,39,18,38,13,36,8,33,5,27,4,20,6,10,10,3,18,-1,28,-3,39,-4,64,2,79,18,88,41,91,66,92,89,92,198,94,204,98,208,103,210,110,211,154,211,159,209,163,205,165,199,165,37,164,26,161,18,156,12,147,9,134,7,134,0,238,0,238,7,225,9,216,12,211,17,208,26,207,40,207,183,208,198,211,207,216,213,225,216,238,218,297,225,229,225,157,62,79,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,92,0,92,7,78,9,69,12,63,18,60,26,59,36,59,172,60,172,143,0,147,0,224,174,224,37,223,26,220,18,214,12,204,9,190,7,190,0,296,0,296,7,284,9,275,12,270,17,267,26,266,40,266,183,267,198,270,207,275,213,284,216,297,218,251,225,147,225,147,218,160,216,169,213,174,207,177,200,178,189,178,124,84,124,84,189,85,199,88,207,93,212,102,216,
+238,225,45,225,45,218,57,216,66,212,71,206,74,197,75,183,75,99,74,77,73,53,69,33,62,18,50,12,46,15,42,22,38,30,32,36,23,39,18,38,13,36,8,33,5,27,4,20,6,10,10,3,18,-1,28,-3,39,-4,64,2,79,18,88,41,91,66,92,89,92,198,94,204,98,208,103,210,110,211,154,211,159,209,163,205,165,199,165,37,164,26,161,18,156,12,147,9,134,7,134,0,238,0,238,7,225,9,216,12,211,17,208,26,207,40,207,183,208,198,211,207,216,213,225,216,238,218,
 74,77,73,53,79,18,79,18,73,53,69,33,79,18,69,33,64,2,64,2,69,33,62,18,64,2,62,18,50,12,50,12,46,15,64,2,64,2,46,15,39,-4,57,216,66,212,238,225,238,225,66,212,103,210,238,225,103,210,110,211,238,225,110,211,145,211,238,225,145,211,154,211,161,18,156,12,238,0,238,0,156,12,147,9,238,0,147,9,134,7,238,225,154,211,159,209,238,225,159,209,163,205,238,225,163,205,165,199,238,225,165,199,165,190,238,225,165,190,216,213,238,225,216,213,225,216,238,225,225,216,238,218,207,40,207,183,165,190,165,190,207,183,208,198,165,190,208,198,211,207,216,12,211,17,165,37,165,37,211,17,208,26,165,37,208,26,165,190,92,189,92,198,75,183,92,189,75,183,79,18,92,189,79,18,88,41,92,189,88,41,91,66,92,189,91,66,92,89,75,183,92,198,94,204,75,183,94,204,98,208,75,183,98,208,74,197,71,206,74,197,98,208,71,206,98,208,103,210,71,206,103,210,66,212,45,225,45,218,57,216,45,225,57,216,238,225,238,0,238,7,225,9,238,0,225,9,216,12,238,0,216,12,165,37,238,0,165,37,164,26,238,0,164,26,161,18,75,99,74,77,79,18,75,99,79,18,75,183,39,-4,46,15,42,22,39,-4,42,22,38,30,39,-4,38,30,32,36,39,-4,32,36,28,-3,32,36,23,39,28,-3,28,-3,23,39,18,38,28,-3,18,38,18,-1,18,-1,18,38,13,36,18,-1,13,36,10,3,10,3,13,36,8,33,10,3,8,33,6,10,6,10,8,33,5,27,6,10,5,27,4,20,238,0,134,7,134,0,165,190,208,26,207,40,216,213,165,190,211,207,
-297,225,229,225,157,62,79,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,92,0,92,7,78,9,69,12,63,18,60,26,59,36,59,172,60,172,143,0,147,0,224,174,224,37,223,26,220,18,214,12,204,9,190,7,190,0,296,0,296,7,284,9,275,12,270,17,267,26,266,40,266,183,267,198,270,207,275,213,284,216,297,218,251,225,147,225,147,218,160,216,169,213,174,207,177,200,178,189,178,124,84,124,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,84,108,178,108,178,37,177,26,174,18,169,12,160,9,147,7,147,0,251,0,251,7,238,9,
+297,225,229,225,157,62,79,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,92,0,92,7,78,9,69,12,63,18,60,26,59,36,59,172,60,172,143,0,147,0,224,174,224,37,223,26,220,18,214,12,204,9,190,7,190,0,296,0,296,7,284,9,275,12,270,17,267,26,266,40,266,183,267,198,270,207,275,213,284,216,297,218,
 39,16,33,11,92,0,92,0,33,11,25,9,92,0,25,9,12,7,220,18,214,12,296,0,296,0,214,12,204,9,296,0,204,9,190,7,229,225,157,62,224,174,229,225,224,174,267,26,229,225,267,26,266,40,229,225,266,40,266,183,229,225,266,183,267,198,229,225,267,198,270,207,229,225,270,207,275,213,229,225,275,213,297,225,59,172,60,172,79,225,79,225,60,172,143,0,79,225,143,0,157,62,157,62,143,0,147,0,157,62,147,0,224,174,92,7,78,9,92,0,92,0,78,9,69,12,92,0,69,12,42,25,42,25,69,12,63,18,42,25,63,18,42,40,42,40,63,18,60,26,42,40,60,26,42,183,42,183,60,26,59,36,42,183,59,36,59,172,79,225,12,225,25,216,79,225,25,216,33,212,79,225,33,212,39,206,79,225,39,206,42,197,79,225,42,197,42,183,79,225,42,183,59,172,284,216,297,218,297,225,284,216,297,225,275,213,296,0,296,7,284,9,296,0,284,9,275,12,296,0,275,12,224,37,296,0,224,37,223,26,296,0,223,26,220,18,224,37,275,12,270,17,224,37,270,17,267,26,224,37,267,26,224,174,92,0,12,7,12,0,39,16,92,0,42,25,296,0,190,7,190,0,25,216,12,225,12,218,
-251,225,147,225,147,218,160,216,169,213,174,207,177,200,178,189,178,124,84,124,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,84,108,178,108,178,37,177,26,174,18,169,12,160,9,147,7,147,0,251,0,251,7,238,9,229,12,224,17,221,26,220,40,220,183,221,198,223,207,229,213,238,216,251,218,238,116,232,154,217,186,194,210,165,225,130,230,92,225,61,209,38,185,23,153,17,114,23,75,38,42,61,17,91,1,126,-4,163,1,194,17,218,43,233,76,238,116,16383,16383,193,102,190,70,183,44,171,25,154,13,134,9,123,10,114,13,104,18,96,25,89,34,79,51,72,70,66,91,63,113,63,137,65,164,73,186,85,202,101,212,121,216,132,215,143,211,152,206,161,199,168,191,177,177,184,161,189,142,192,122,193,102,251,225,12,225,12,218,25,217,33,214,
+251,225,147,225,147,218,160,216,169,213,174,207,177,200,178,189,178,124,84,124,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,84,108,178,108,178,37,177,26,174,18,169,12,160,9,147,7,147,0,251,0,251,7,238,9,229,12,224,17,221,26,220,40,220,183,221,198,223,207,229,213,238,216,251,218,
 39,16,33,11,116,0,116,0,33,11,25,9,116,0,25,9,12,7,116,225,12,225,25,216,116,225,25,216,33,212,116,225,33,212,39,206,116,225,39,206,42,197,116,225,42,197,93,212,116,225,93,212,102,216,116,225,102,216,116,218,42,183,85,26,84,36,84,124,84,108,178,108,84,124,178,108,178,124,178,124,178,108,224,17,178,124,224,17,221,26,42,183,84,36,84,189,42,183,84,189,85,199,42,183,85,199,88,207,42,183,88,207,93,212,42,183,93,212,42,197,174,18,169,12,251,0,251,0,169,12,160,9,251,0,160,9,147,7,251,225,147,225,160,216,251,225,160,216,169,213,251,225,169,213,174,207,251,225,174,207,177,200,251,225,177,200,178,189,251,225,178,189,229,213,251,225,229,213,238,216,251,225,238,216,251,218,220,40,220,183,178,189,178,189,220,183,221,198,178,189,221,198,223,207,178,189,221,26,220,40,251,0,251,7,238,9,251,0,238,9,229,12,251,0,229,12,178,37,251,0,178,37,177,26,251,0,177,26,174,18,178,37,229,12,224,17,178,37,224,17,178,108,116,0,116,7,102,9,116,0,102,9,93,13,116,0,93,13,42,40,116,0,42,40,42,25,116,0,42,25,39,16,42,40,93,13,88,18,42,40,88,18,85,26,42,40,85,26,42,183,116,0,12,7,12,0,251,0,147,7,147,0,178,124,221,26,178,189,160,216,147,225,147,218,229,213,178,189,223,207,25,216,12,225,12,218,
-238,116,232,154,217,186,194,210,165,225,130,230,92,225,61,209,38,185,23,153,17,114,23,75,38,42,61,17,91,1,126,-4,163,1,194,17,218,43,233,76,238,116,16383,16383,193,102,190,70,183,44,171,25,154,13,134,9,123,10,114,13,104,18,96,25,89,34,79,51,72,70,66,91,63,113,63,137,65,164,73,186,85,202,101,212,121,216,132,215,143,211,152,206,161,199,168,191,177,177,184,161,189,142,192,122,193,102,251,225,12,225,12,218,25,217,33,214,39,209,42,200,42,26,39,17,33,12,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,84,186,85,196,88,203,92,208,98,210,105,211,156,211,163,210,169,208,174,203,177,196,178,186,178,37,177,26,175,18,170,12,161,9,148,7,148,0,251,0,251,7,238,9,229,11,224,16,221,24,220,37,220,184,221,199,224,209,230,214,238,217,251,218,76,229,
+238,116,232,154,217,186,194,210,165,225,130,230,92,225,61,209,38,185,23,153,17,114,23,75,38,42,61,17,91,1,126,-4,163,1,194,17,218,43,233,76,238,116,16383,16383,193,102,190,70,183,44,171,25,154,13,134,9,123,10,114,13,104,18,96,25,89,34,79,51,72,70,66,91,63,113,63,137,65,164,73,186,85,202,101,212,121,216,132,215,143,211,152,206,161,199,168,191,177,177,184,161,189,142,192,122,193,102,
 66,91,61,17,72,70,72,70,61,17,91,1,72,70,91,1,79,51,79,51,91,1,89,34,96,25,89,34,91,1,96,25,91,1,126,-4,165,225,130,230,132,215,132,215,130,230,121,216,101,212,121,216,130,230,101,212,130,230,92,225,190,70,183,44,194,17,194,17,183,44,171,25,194,17,171,25,163,1,163,1,171,25,154,13,163,1,154,13,134,9,134,9,123,10,126,-4,126,-4,123,10,114,13,126,-4,114,13,104,18,143,211,152,206,165,225,165,225,152,206,161,199,165,225,161,199,168,191,168,191,177,177,194,210,194,210,177,177,184,161,194,210,184,161,189,142,194,210,193,102,194,17,194,210,194,17,217,186,217,186,194,17,218,43,217,186,218,43,232,154,232,154,218,43,233,76,232,154,233,76,238,116,194,210,189,142,192,122,194,210,192,122,193,102,194,210,165,225,168,191,134,9,126,-4,163,1,61,17,63,113,63,137,63,137,65,164,61,209,61,209,65,164,73,186,61,209,73,186,92,225,92,225,73,186,85,202,92,225,85,202,101,212,61,17,63,137,61,209,61,17,61,209,38,42,38,42,61,209,38,185,38,42,38,185,23,75,23,75,38,185,23,153,23,75,23,153,17,114,63,113,61,17,66,91,190,70,194,17,193,102,165,225,132,215,143,211,96,25,126,-4,104,18,
-251,225,12,225,12,218,25,217,33,214,39,209,42,200,42,26,39,17,33,12,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,84,186,85,196,88,203,92,208,98,210,105,211,156,211,163,210,169,208,174,203,177,196,178,186,178,37,177,26,175,18,170,12,161,9,148,7,148,0,251,0,251,7,238,9,229,11,224,16,221,24,220,37,220,184,221,199,224,209,230,214,238,217,251,218,76,229,73,230,58,224,44,219,31,214,17,209,1,204,1,196,4,197,13,197,22,196,28,194,32,189,34,180,34,-65,33,-79,30,-88,24,-94,14,-98,0,-100,0,-107,120,-107,120,-100,101,-99,88,-95,81,-89,77,-78,76,-62,76,17,86,8,96,2,107,-1,117,-3,129,-4,163,1,191,19,213,47,227,82,232,123,228,158,216,188,198,210,175,225,148,230,132,228,117,224,103,216,89,205,76,190,16383,16383,76,167,79,176,
+251,225,12,225,12,218,25,217,33,214,39,209,42,200,42,26,39,17,33,12,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,84,186,85,196,88,203,92,208,98,210,105,211,156,211,163,210,169,208,174,203,177,196,178,186,178,37,177,26,175,18,170,12,161,9,148,7,148,0,251,0,251,7,238,9,229,11,224,16,221,24,220,37,220,184,221,199,224,209,230,214,238,217,251,218,
 39,17,33,12,116,0,116,0,33,12,25,9,116,0,25,9,12,7,156,211,251,225,105,211,98,210,105,211,39,209,98,210,39,209,42,200,175,18,170,12,251,0,251,0,170,12,161,9,251,0,161,9,148,7,238,217,251,218,251,225,238,217,251,225,230,214,230,214,251,225,177,196,230,214,177,196,178,186,221,24,178,186,178,37,221,24,178,37,224,16,224,16,178,37,229,11,220,37,220,184,178,186,178,186,220,184,221,199,178,186,221,199,224,209,251,225,156,211,163,210,251,225,163,210,169,208,251,225,169,208,174,203,251,225,174,203,177,196,93,13,88,18,42,39,42,39,88,18,85,26,42,39,85,26,42,185,42,185,85,26,84,36,42,185,84,36,84,186,42,185,84,186,85,196,42,185,85,196,88,203,42,185,88,203,92,208,42,185,92,208,42,200,251,225,12,225,25,217,251,225,25,217,33,214,251,225,33,214,39,209,251,225,39,209,105,211,251,0,251,7,238,9,251,0,238,9,229,11,251,0,229,11,178,37,251,0,178,37,177,26,251,0,177,26,175,18,116,0,116,7,102,9,116,0,102,9,93,13,116,0,93,13,42,39,116,0,42,39,42,26,116,0,42,26,39,17,116,0,12,7,12,0,251,0,148,7,148,0,178,186,221,24,220,37,25,217,12,225,12,218,98,210,42,200,92,208,230,214,178,186,224,209,
-76,229,73,230,58,224,44,219,31,214,17,209,1,204,1,196,4,197,13,197,22,196,28,194,32,189,34,180,34,-65,33,-79,30,-88,24,-94,14,-98,0,-100,0,-107,120,-107,120,-100,101,-99,88,-95,81,-89,77,-78,76,-62,76,17,86,8,96,2,107,-1,117,-3,129,-4,163,1,191,19,213,47,227,82,232,123,228,158,216,188,198,210,175,225,148,230,132,228,117,224,103,216,89,205,76,190,16383,16383,76,167,79,176,87,185,99,193,113,198,127,200,148,195,165,183,178,163,186,136,189,103,186,73,178,47,165,27,148,14,128,10,113,12,99,18,87,26,79,35,76,44,207,78,193,60,180,46,167,38,153,33,137,31,111,36,89,49,73,69,63,96,59,128,62,157,71,182,86,200,105,212,127,216,137,215,144,212,149,208,153,201,156,191,160,180,163,172,167,166,171,161,177,158,184,157,191,158,197,161,202,166,206,172,207,179,203,195,192,209,175,220,154,227,130,230,116,229,102,226,88,221,75,213,62,204,63,204,48,189,36,172,28,152,22,130,21,106,25,70,38,39,58,15,84,0,116,-4,128,-3,140,-1,152,3,163,9,173,16,182,24,189,32,197,43,205,57,214,74,213,155,210,225,7,225,4,155,12,155,17,175,24,191,35,202,
+76,229,73,230,58,224,44,219,31,214,17,209,1,204,1,196,4,197,13,197,22,196,28,194,32,189,34,180,34,-65,33,-79,30,-88,24,-94,14,-98,0,-100,0,-107,120,-107,120,-100,101,-99,88,-95,81,-89,77,-78,76,-62,76,17,86,8,96,2,107,-1,117,-3,129,-4,163,1,191,19,213,47,227,82,232,123,228,158,216,188,198,210,175,225,148,230,132,228,117,224,103,216,89,205,76,190,16383,16383,76,167,79,176,87,185,99,193,113,198,127,200,148,195,165,183,178,163,186,136,189,103,186,73,178,47,165,27,148,14,128,10,113,12,99,18,87,26,79,35,76,44,
 30,-88,24,-94,120,-107,120,-107,24,-94,14,-98,120,-107,14,-98,0,-100,6,197,8,197,17,209,17,209,8,197,11,197,17,209,11,197,13,197,13,197,22,196,17,209,17,209,22,196,31,214,17,209,1,204,4,197,17,209,4,197,6,197,79,35,76,44,86,8,86,8,76,44,76,17,77,-78,76,-62,44,219,77,-78,44,219,34,169,34,169,44,219,34,180,22,196,28,194,31,214,31,214,28,194,32,189,31,214,32,189,44,219,44,219,32,189,34,180,76,190,76,229,73,230,76,190,73,230,76,-62,76,190,76,-62,76,167,76,190,76,167,79,176,76,190,79,176,89,205,232,123,228,158,227,82,227,82,228,158,216,188,227,82,216,188,213,47,213,47,216,188,198,210,213,47,198,210,191,19,191,19,198,210,189,103,191,19,189,103,186,73,191,19,186,73,178,47,198,210,175,225,178,163,198,210,178,163,186,136,198,210,186,136,189,103,132,228,127,200,148,195,132,228,148,195,148,230,148,230,148,195,165,183,148,230,165,183,175,225,175,225,165,183,178,163,128,10,129,-4,148,14,148,14,129,-4,163,1,148,14,163,1,165,27,165,27,163,1,191,19,165,27,191,19,178,47,120,-107,120,-100,101,-99,120,-107,101,-99,88,-95,120,-107,88,-95,33,-79,120,-107,33,-79,30,-88,58,224,44,219,76,-62,58,224,76,-62,73,230,34,-65,33,-79,88,-95,34,-65,88,-95,81,-89,34,-65,81,-89,77,-78,34,-65,77,-78,34,169,79,176,87,185,89,205,89,205,87,185,99,193,89,205,99,193,103,216,103,216,99,193,113,198,103,216,113,198,117,224,117,224,113,198,127,200,117,224,127,200,132,228,113,12,99,18,107,-1,113,12,107,-1,117,-3,113,12,117,-3,128,10,79,35,86,8,87,26,87,26,86,8,96,2,87,26,96,2,99,18,99,18,96,2,107,-1,129,-4,128,10,117,-3,4,197,1,204,1,196,120,-107,0,-100,0,-107,
-207,78,193,60,180,46,167,38,153,33,137,31,111,36,89,49,73,69,63,96,59,128,62,157,71,182,86,200,105,212,127,216,137,215,144,212,149,208,153,201,156,191,160,180,163,172,167,166,171,161,177,158,184,157,191,158,197,161,202,166,206,172,207,179,203,195,192,209,175,220,154,227,130,230,116,229,102,226,88,221,75,213,62,204,63,204,48,189,36,172,28,152,22,130,21,106,25,70,38,39,58,15,84,0,116,-4,128,-3,140,-1,152,3,163,9,173,16,182,24,189,32,197,43,205,57,214,74,213,155,210,225,7,225,4,155,12,155,17,175,24,191,35,202,50,209,70,211,77,211,82,209,85,207,87,202,88,195,88,40,87,25,84,16,78,11,69,9,56,7,56,0,161,0,161,7,148,9,139,13,133,18,130,26,129,36,129,195,130,201,131,206,134,209,139,210,146,211,166,209,182,202,192,191,200,175,204,155,242,225,175,225,175,218,184,217,190,216,195,213,198,210,199,205,199,201,198,198,198,195,197,193,145,55,84,184,83,188,79,196,78,201,78,204,79,209,82,212,87,215,95,217,107,218,
+207,78,193,60,180,46,167,38,153,33,137,31,111,36,89,49,73,69,63,96,59,128,62,157,71,182,86,200,105,212,127,216,137,215,144,212,149,208,153,201,156,191,160,180,163,172,167,166,171,161,177,158,184,157,191,158,197,161,202,166,206,172,207,179,203,195,192,209,175,220,154,227,130,230,116,229,102,226,88,221,75,213,62,204,63,204,48,189,36,172,28,152,22,130,21,106,25,70,38,39,58,15,84,0,116,-4,128,-3,140,-1,152,3,163,9,173,16,182,24,189,32,197,43,205,57,214,74,
 89,49,73,69,84,0,84,0,73,69,63,96,84,0,63,96,58,15,58,15,63,96,59,128,63,204,59,128,62,157,63,204,62,157,71,182,137,31,116,-4,128,-3,137,31,128,-3,140,-1,137,31,111,36,116,-4,89,49,84,0,116,-4,89,49,116,-4,111,36,203,195,192,209,197,161,203,195,197,161,202,166,203,195,202,166,206,172,203,195,206,172,207,179,192,209,175,220,177,158,192,209,177,158,184,157,192,209,184,157,191,158,192,209,191,158,197,161,175,220,154,227,156,191,175,220,156,191,160,180,175,220,160,180,163,172,175,220,163,172,167,166,175,220,167,166,171,161,175,220,171,161,177,158,144,212,149,208,154,227,154,227,149,208,153,201,154,227,153,201,156,191,130,230,127,216,137,215,130,230,137,215,154,227,154,227,137,215,144,212,182,24,189,32,193,60,193,60,189,32,197,43,193,60,197,43,207,78,207,78,197,43,205,57,207,78,205,57,214,74,140,-1,152,3,153,33,153,33,152,3,163,9,153,33,163,9,167,38,167,38,163,9,173,16,167,38,173,16,180,46,180,46,173,16,182,24,180,46,182,24,193,60,153,33,137,31,140,-1,105,212,127,216,116,229,105,212,116,229,102,226,105,212,102,226,88,221,105,212,88,221,86,200,75,213,63,204,71,182,75,213,71,182,86,200,75,213,86,200,88,221,48,189,36,172,38,39,48,189,38,39,58,15,48,189,58,15,59,128,48,189,59,128,63,204,28,152,22,130,25,70,28,152,25,70,38,39,28,152,38,39,36,172,127,216,130,230,116,229,25,70,22,130,21,106,
-213,155,210,225,7,225,4,155,12,155,17,175,24,191,35,202,50,209,70,211,77,211,82,209,85,207,87,202,88,195,88,40,87,25,84,16,78,11,69,9,56,7,56,0,161,0,161,7,148,9,139,13,133,18,130,26,129,36,129,195,130,201,131,206,134,209,139,210,146,211,166,209,182,202,192,191,200,175,204,155,242,225,175,225,175,218,184,217,190,216,195,213,198,210,199,205,199,201,198,198,198,195,197,193,145,55,84,184,83,188,79,196,78,201,78,204,79,209,82,212,87,215,95,217,107,218,107,225,4,225,4,218,11,217,23,211,27,206,31,200,99,59,105,47,111,34,116,22,120,13,122,6,119,-5,111,-24,100,-44,88,-60,
+213,155,210,225,7,225,4,155,12,155,17,175,24,191,35,202,50,209,70,211,77,211,82,209,85,207,87,202,88,195,88,40,87,25,84,16,78,11,69,9,56,7,56,0,161,0,161,7,148,9,139,13,133,18,130,26,129,36,129,195,130,201,131,206,134,209,139,210,146,211,166,209,182,202,192,191,200,175,204,155,
 84,16,78,11,161,0,161,0,78,11,69,9,161,0,69,9,56,7,24,191,35,202,7,225,7,225,35,202,50,209,7,225,50,209,70,211,70,211,77,211,210,225,210,225,77,211,82,209,210,225,82,209,85,207,85,207,87,202,210,225,210,225,87,202,139,210,210,225,139,210,146,211,146,211,166,209,210,225,210,225,166,209,182,202,210,225,182,202,192,191,210,225,192,191,200,175,210,225,200,175,204,155,210,225,204,155,213,155,129,36,129,195,88,195,88,195,129,195,130,201,88,195,130,201,131,206,88,195,131,206,134,209,88,195,134,209,139,210,88,195,139,210,87,202,88,195,130,26,129,36,210,225,7,225,70,211,7,225,4,155,12,155,7,225,12,155,17,175,7,225,17,175,24,191,161,0,161,7,148,9,161,0,148,9,139,13,161,0,139,13,88,40,161,0,88,40,87,25,161,0,87,25,84,16,88,40,139,13,133,18,88,40,133,18,130,26,88,40,130,26,88,195,161,0,56,7,56,0,
-242,225,175,225,175,218,184,217,190,216,195,213,198,210,199,205,199,201,198,198,198,195,197,193,145,55,84,184,83,188,79,196,78,201,78,204,79,209,82,212,87,215,95,217,107,218,107,225,4,225,4,218,11,217,23,211,27,206,31,200,99,59,105,47,111,34,116,22,120,13,122,6,119,-5,111,-24,100,-44,88,-60,75,-66,70,-66,64,-64,60,-63,55,-60,49,-58,39,-56,33,-56,27,-57,21,-60,16,-65,13,-72,12,-79,14,-88,18,-96,26,-102,35,-106,47,-108,68,-105,86,-94,102,-76,118,-48,134,-11,217,192,221,202,225,208,230,213,235,216,242,218,190,330,186,331,172,325,146,315,132,310,117,305,117,297,119,298,129,298,138,297,144,295,147,290,149,281,150,270,150,204,144,212,136,219,127,225,116,229,104,230,76,225,53,209,36,185,25,153,22,113,23,89,27,66,32,46,41,29,51,15,60,8,69,2,79,-1,91,-3,103,-4,115,-3,126,0,136,6,144,13,150,22,150,-65,149,-79,146,-88,140,-94,129,-98,114,-100,114,-107,233,-107,233,-100,214,-99,202,-95,194,-89,191,-78,190,-62,190,22,195,13,203,6,213,0,224,-3,236,-4,249,-3,260,-1,270,2,279,8,287,15,298,29,306,46,313,66,316,89,
+242,225,175,225,175,218,184,217,190,216,195,213,198,210,199,205,199,201,198,198,198,195,197,193,145,55,84,184,83,188,79,196,78,201,78,204,79,209,82,212,87,215,95,217,107,218,107,225,4,225,4,218,11,217,23,211,27,206,31,200,99,59,105,47,111,34,116,22,120,13,122,6,119,-5,111,-24,100,-44,88,-60,75,-66,70,-66,64,-64,60,-63,55,-60,49,-58,39,-56,33,-56,27,-57,21,-60,16,-65,13,-72,12,-79,14,-88,18,-96,26,-102,35,-106,47,-108,68,-105,86,-94,102,-76,118,-48,134,-11,217,192,221,202,225,208,230,213,235,216,242,218,
 67,-65,68,-105,70,-66,70,-66,68,-105,86,-94,70,-66,86,-94,73,-66,73,-66,86,-94,75,-66,88,-60,75,-66,86,-94,88,-60,86,-94,102,-76,31,200,78,201,78,204,78,204,79,209,31,200,31,200,79,209,82,212,31,200,82,212,107,225,107,225,82,212,87,215,107,225,87,215,95,217,95,217,107,218,107,225,107,225,4,225,11,217,107,225,11,217,17,214,107,225,17,214,23,211,107,225,23,211,27,206,107,225,27,206,31,200,122,6,134,-11,145,55,145,55,134,-11,217,192,145,55,217,192,197,193,197,193,217,192,198,195,242,225,175,225,184,217,242,225,184,217,190,216,242,225,190,216,195,213,242,225,195,213,198,210,242,225,198,210,199,205,242,225,199,205,230,213,242,225,230,213,235,216,242,225,235,216,242,218,199,205,217,192,221,202,199,205,221,202,225,208,199,205,225,208,230,213,199,204,199,201,217,192,199,204,217,192,199,205,198,198,198,195,217,192,198,198,217,192,199,201,111,34,116,22,145,55,145,55,116,22,120,13,145,55,120,13,122,6,145,55,84,184,99,59,145,55,99,59,105,47,145,55,105,47,111,34,99,59,84,184,83,188,99,59,83,188,81,192,99,59,81,192,79,196,99,59,79,196,78,201,99,59,78,201,31,200,119,-5,111,-24,118,-48,119,-5,118,-48,134,-11,119,-5,134,-11,122,6,102,-76,118,-48,111,-24,102,-76,111,-24,100,-44,102,-76,100,-44,88,-60,68,-105,67,-65,64,-64,68,-105,64,-64,60,-63,68,-105,60,-63,55,-60,68,-105,55,-60,49,-58,68,-105,49,-58,47,-108,49,-58,44,-57,47,-108,47,-108,44,-57,39,-56,47,-108,39,-56,35,-106,35,-106,39,-56,33,-56,35,-106,33,-56,27,-57,35,-106,27,-57,26,-102,26,-102,27,-57,21,-60,26,-102,21,-60,18,-96,18,-96,21,-60,16,-65,18,-96,16,-65,14,-88,14,-88,16,-65,13,-72,14,-88,13,-72,12,-79,184,217,175,225,175,218,11,217,4,225,4,218,
-190,330,186,331,172,325,146,315,132,310,117,305,117,297,119,298,129,298,138,297,144,295,147,290,149,281,150,270,150,204,144,212,136,219,127,225,116,229,104,230,76,225,53,209,36,185,25,153,22,113,23,89,27,66,32,46,41,29,51,15,60,8,69,2,79,-1,91,-3,103,-4,115,-3,126,0,136,6,144,13,150,22,150,-65,149,-79,146,-88,140,-94,129,-98,114,-100,114,-107,233,-107,233,-100,214,-99,202,-95,194,-89,191,-78,190,-62,190,22,195,13,203,6,213,0,224,-3,236,-4,249,-3,260,-1,270,2,279,8,287,15,298,29,306,46,313,66,316,89,318,113,314,153,303,185,286,209,263,225,235,230,223,229,212,225,203,219,195,212,190,204,16383,16383,190,179,192,188,198,197,207,206,219,212,233,215,248,209,260,194,268,172,273,146,275,117,274,99,273,82,271,66,267,51,263,38,258,29,253,21,247,15,240,11,233,10,219,13,207,19,198,28,192,38,190,47,16383,16383,150,47,147,38,141,28,132,19,120,13,105,10,99,11,92,15,86,21,81,29,76,38,72,51,68,66,66,82,65,99,65,117,66,146,71,172,80,194,91,209,105,215,120,212,132,206,141,197,147,187,150,177,238,0,238,7,229,8,221,12,213,18,205,26,197,37,133,136,175,195,181,203,188,209,197,214,215,218,215,225,136,225,136,218,144,217,150,215,154,213,156,210,156,201,154,195,150,187,145,178,138,169,124,149,116,162,108,174,101,185,97,194,94,201,93,206,93,210,96,213,100,216,106,217,114,218,114,225,11,225,11,218,15,218,23,217,31,214,38,208,45,200,54,187,54,188,100,115,45,32,37,22,30,15,23,11,16,9,7,7,7,0,79,0,79,7,72,8,66,9,62,11,60,13,60,19,61,23,63,27,65,33,69,39,108,100,155,28,156,27,156,25,157,23,157,15,155,12,152,9,146,8,137,7,137,0,251,225,146,225,146,218,159,216,168,212,174,207,177,199,178,189,178,39,177,29,174,22,170,17,164,15,157,14,104,14,97,15,92,17,88,22,85,29,84,39,84,188,85,199,88,207,94,213,103,216,116,218,116,225,12,225,12,218,25,216,33,214,39,209,42,201,42,26,39,16,33,11,24,8,12,7,12,0,199,0,210,-3,221,-14,232,-34,243,-68,251,-68,251,7,238,8,229,11,224,16,221,25,220,40,220,186,221,199,223,208,229,213,238,216,251,218,
+190,330,186,331,172,325,146,315,132,310,117,305,117,297,119,298,129,298,138,297,144,295,147,290,149,281,150,270,150,204,144,212,136,219,127,225,116,229,104,230,76,225,53,209,36,185,25,153,22,113,23,89,27,66,32,46,41,29,51,15,60,8,69,2,79,-1,91,-3,103,-4,115,-3,126,0,136,6,144,13,150,22,150,-65,149,-79,146,-88,140,-94,129,-98,114,-100,114,-107,233,-107,233,-100,214,-99,202,-95,194,-89,191,-78,190,-62,190,22,195,13,203,6,213,0,224,-3,236,-4,249,-3,260,-1,270,2,279,8,287,15,298,29,306,46,313,66,316,89,318,113,314,153,303,185,286,209,263,225,235,230,223,229,212,225,203,219,195,212,190,204,16383,16383,190,179,192,188,198,197,207,206,219,212,233,215,248,209,260,194,268,172,273,146,275,117,274,99,273,82,271,66,267,51,263,38,258,29,253,21,247,15,240,11,233,10,219,13,207,19,198,28,192,38,190,47,16383,16383,150,47,147,38,141,28,132,19,120,13,105,10,99,11,92,15,86,21,81,29,76,38,72,51,68,66,66,82,65,99,65,117,66,146,71,172,80,194,91,209,105,215,120,212,132,206,141,197,147,187,150,177,
 69,2,79,-1,72,51,72,51,79,-1,76,38,81,29,76,38,79,-1,81,29,79,-1,91,-3,150,177,150,47,150,22,150,22,150,47,147,38,150,22,147,38,144,13,144,13,147,38,141,28,144,13,141,28,136,6,136,6,141,28,132,19,136,6,132,19,126,0,126,0,132,19,120,13,126,0,120,13,115,-3,115,-3,120,13,105,10,105,10,99,11,103,-4,103,-4,99,11,92,15,103,-4,92,15,91,-3,91,-3,92,15,86,21,91,-3,86,21,81,29,150,270,150,204,150,22,150,22,150,204,150,177,150,177,150,204,147,187,147,187,150,204,144,212,147,187,144,212,141,197,141,197,144,212,136,219,141,197,136,219,132,206,132,206,136,219,127,225,132,206,127,225,120,212,120,212,127,225,116,229,120,212,116,229,105,215,66,146,71,172,76,225,76,225,71,172,80,194,76,225,80,194,104,230,104,230,80,194,91,209,104,230,91,209,105,215,76,225,53,209,66,146,66,146,53,209,65,117,65,99,65,117,60,8,65,99,60,8,69,2,41,29,51,15,53,209,53,209,51,15,60,8,53,209,60,8,65,117,36,185,25,153,27,66,36,185,27,66,32,46,36,185,32,46,41,29,36,185,41,29,53,209,25,153,22,113,23,89,25,153,23,89,27,66,146,-88,140,-94,233,-107,233,-107,140,-94,129,-98,233,-107,129,-98,114,-100,122,298,124,298,132,310,132,310,124,298,126,298,132,310,126,298,129,298,129,298,138,297,132,310,132,310,138,297,146,315,132,310,117,305,119,298,132,310,119,298,122,298,192,38,190,47,195,13,195,13,190,47,190,22,191,-78,190,-62,159,320,191,-78,159,320,150,22,150,22,159,320,150,270,138,297,144,295,146,315,146,315,144,295,147,290,146,315,147,290,159,320,159,320,147,290,149,281,159,320,149,281,150,270,190,204,190,330,186,331,190,204,186,331,190,-62,190,204,190,-62,190,179,190,204,190,179,195,212,274,99,273,82,279,8,279,8,273,82,271,66,279,8,271,66,270,2,270,2,271,66,267,51,270,2,267,51,263,38,263,38,258,29,260,-1,260,-1,258,29,253,21,260,-1,253,21,249,-3,249,-3,253,21,247,15,249,-3,247,15,240,11,213,0,224,-3,219,13,219,13,224,-3,233,10,240,11,233,10,236,-4,240,11,236,-4,249,-3,314,153,303,185,306,46,314,153,306,46,313,66,314,153,313,66,316,89,314,153,316,89,318,113,274,99,279,8,275,117,275,117,279,8,286,209,286,209,279,8,287,15,286,209,287,15,303,185,303,185,287,15,298,29,303,185,298,29,306,46,248,209,260,194,263,225,263,225,260,194,268,172,263,225,268,172,286,209,286,209,268,172,273,146,286,209,273,146,275,117,263,225,235,230,248,209,248,209,235,230,233,215,219,212,233,215,223,229,219,212,223,229,212,225,263,38,260,-1,270,2,233,-107,233,-100,214,-99,233,-107,214,-99,202,-95,233,-107,202,-95,149,-79,233,-107,149,-79,146,-88,172,325,159,320,190,-62,172,325,190,-62,186,331,194,-89,191,-78,150,22,194,-89,150,22,150,-65,194,-89,150,-65,202,-95,69,2,72,51,68,66,69,2,68,66,66,82,69,2,66,82,65,99,192,38,195,13,198,28,198,28,195,13,203,6,198,28,203,6,207,19,207,19,203,6,213,0,207,19,213,0,219,13,190,179,192,188,195,212,195,212,192,188,198,197,195,212,198,197,203,219,203,219,198,197,207,206,203,219,207,206,212,225,212,225,207,206,219,212,235,230,223,229,233,215,233,10,224,-3,236,-4,115,-3,105,10,103,-4,119,298,117,305,117,297,233,-107,114,-100,114,-107,149,-79,202,-95,150,-65,105,215,116,229,104,230,
-238,0,238,7,229,8,221,12,213,18,205,26,197,37,133,136,175,195,181,203,188,209,197,214,215,218,215,225,136,225,136,218,144,217,150,215,154,213,156,210,156,201,154,195,150,187,145,178,138,169,124,149,116,162,108,174,101,185,97,194,94,201,93,206,93,210,96,213,100,216,106,217,114,218,114,225,11,225,11,218,15,218,23,217,31,214,38,208,45,200,54,187,54,188,100,115,45,32,37,22,30,15,23,11,16,9,7,7,7,0,79,0,79,7,72,8,66,9,62,11,60,13,60,19,61,23,63,27,65,33,69,39,108,100,155,28,156,27,156,25,157,23,157,15,155,12,152,9,146,8,137,7,137,0,251,225,146,225,146,218,159,216,168,212,174,207,177,199,178,189,178,39,177,29,174,22,170,17,164,15,157,14,104,14,97,15,92,17,88,22,85,29,84,39,84,188,85,199,88,207,94,213,103,216,116,218,116,225,12,225,12,218,25,216,33,214,39,209,42,201,42,26,39,16,33,11,24,8,12,7,12,0,199,0,210,-3,221,-14,232,-34,243,-68,251,-68,251,7,238,8,229,11,224,16,221,25,220,40,220,186,221,199,223,208,229,213,238,216,251,218,244,225,139,225,139,218,152,216,161,212,167,207,170,200,171,190,171,118,166,116,158,113,148,110,136,108,123,107,106,108,94,112,87,120,83,131,81,147,81,186,
+238,0,238,7,229,8,221,12,213,18,205,26,197,37,133,136,175,195,181,203,188,209,197,214,215,218,215,225,136,225,136,218,144,217,150,215,154,213,156,210,156,201,154,195,150,187,145,178,138,169,124,149,116,162,108,174,101,185,97,194,94,201,93,206,93,210,96,213,100,216,106,217,114,218,114,225,11,225,11,218,15,218,23,217,31,214,38,208,45,200,54,187,54,188,100,115,45,32,37,22,30,15,23,11,16,9,7,7,7,0,79,0,79,7,72,8,66,9,62,11,60,13,60,19,61,23,63,27,65,33,69,39,108,100,155,28,156,27,156,25,157,23,157,15,155,12,152,9,146,8,137,7,137,0,
 30,15,23,11,79,0,79,0,23,11,16,9,79,0,16,9,7,7,31,214,38,208,114,225,114,225,38,208,45,200,114,225,45,200,54,188,54,188,45,200,54,187,54,187,100,115,93,206,93,206,93,210,54,187,54,187,93,210,96,213,54,187,96,213,114,225,114,225,96,213,100,216,114,225,100,216,106,217,30,15,79,0,37,22,37,22,79,0,62,11,37,22,62,11,45,32,45,32,62,11,60,13,45,32,60,13,60,17,60,17,60,19,45,32,45,32,60,19,61,23,45,32,61,23,63,27,106,217,114,218,114,225,114,225,11,225,15,218,114,225,15,218,23,217,114,225,23,217,31,214,138,169,124,149,133,136,138,169,133,136,175,195,138,169,175,195,145,178,215,225,136,225,144,217,215,225,144,217,150,215,215,225,150,215,154,213,215,225,154,213,156,210,215,225,156,210,156,206,215,225,156,206,188,209,215,225,188,209,197,214,215,225,197,214,206,216,215,225,206,216,215,218,175,195,181,203,156,206,175,195,156,206,156,201,175,195,156,201,154,195,175,195,154,195,150,187,175,195,150,187,145,178,155,12,152,9,238,0,238,0,152,9,146,8,238,0,146,8,137,7,157,20,238,0,221,12,157,20,221,12,213,18,157,20,213,18,205,26,157,20,205,26,197,37,157,20,197,37,157,21,197,37,133,136,155,28,197,37,155,28,156,27,197,37,156,27,156,25,197,37,156,25,157,23,197,37,157,23,157,21,133,136,124,149,155,28,155,28,124,149,116,162,155,28,116,162,108,100,108,100,116,162,108,174,108,100,108,174,101,185,100,115,45,32,63,27,100,115,63,27,65,33,100,115,65,33,69,39,100,115,69,39,108,100,100,115,108,100,101,185,100,115,101,185,97,194,100,115,97,194,94,201,100,115,94,201,93,206,229,8,221,12,238,0,229,8,238,0,238,7,157,15,155,12,238,0,157,15,238,0,157,20,79,0,79,7,72,8,79,0,72,8,66,9,79,0,66,9,62,11,79,0,7,7,7,0,238,0,137,7,137,0,144,217,136,225,136,218,188,209,156,206,181,203,15,218,11,225,11,218,114,225,54,188,54,187,
-251,225,146,225,146,218,159,216,168,212,174,207,177,199,178,189,178,39,177,29,174,22,170,17,164,15,157,14,104,14,97,15,92,17,88,22,85,29,84,39,84,188,85,199,88,207,94,213,103,216,116,218,116,225,12,225,12,218,25,216,33,214,39,209,42,201,42,26,39,16,33,11,24,8,12,7,12,0,199,0,210,-3,221,-14,232,-34,243,-68,251,-68,251,7,238,8,229,11,224,16,221,25,220,40,220,186,221,199,223,208,229,213,238,216,251,218,244,225,139,225,139,218,152,216,161,212,167,207,170,200,171,190,171,118,166,116,158,113,148,110,136,108,123,107,106,108,94,112,87,120,83,131,81,147,81,186,82,199,86,208,91,213,100,216,113,218,113,225,9,225,9,218,22,216,30,213,36,209,39,200,40,186,40,144,43,121,52,105,66,97,85,93,107,92,124,93,139,96,152,100,162,104,171,108,171,27,168,18,162,13,153,9,141,7,141,0,244,0,244,7,231,9,223,12,217,17,215,25,214,39,
+251,225,146,225,146,218,159,216,168,212,174,207,177,199,178,189,178,39,177,29,174,22,170,17,164,15,157,14,104,14,97,15,92,17,88,22,85,29,84,39,84,188,85,199,88,207,94,213,103,216,116,218,116,225,12,225,12,218,25,216,33,214,39,209,42,201,42,26,39,16,33,11,24,8,12,7,12,0,199,0,210,-3,221,-14,232,-34,243,-68,251,-68,251,7,238,8,229,11,224,16,221,25,220,40,220,186,221,199,223,208,229,213,238,216,251,218,
 39,16,33,11,187,0,187,0,33,11,24,8,187,0,24,8,12,7,116,225,12,225,25,216,116,225,25,216,33,214,116,225,33,214,39,209,116,225,39,209,42,201,116,225,42,201,42,188,116,225,42,188,94,213,116,225,94,213,103,216,116,225,103,216,116,218,92,17,88,22,42,41,42,41,88,22,85,29,42,41,85,29,42,188,42,188,85,29,84,39,42,188,84,39,84,188,42,188,84,188,85,199,42,188,85,199,88,207,42,188,88,207,94,213,251,225,146,225,159,216,251,225,159,216,168,212,251,225,168,212,174,207,251,225,174,207,177,199,251,225,177,199,178,189,251,225,178,189,229,213,251,225,229,213,238,216,251,225,238,216,251,218,224,16,221,25,221,-14,221,-14,221,25,220,40,220,40,220,186,210,-3,210,-3,220,186,199,0,178,189,187,0,221,199,221,199,187,0,199,0,221,199,199,0,220,186,223,208,229,213,178,189,223,208,178,189,221,199,251,-68,251,7,243,-68,243,-68,251,7,238,8,243,-68,238,8,232,-34,232,-34,238,8,229,11,232,-34,229,11,224,16,174,22,170,17,187,0,187,0,170,17,164,15,187,0,164,15,157,14,187,0,178,189,178,39,187,0,178,39,177,29,187,0,177,29,174,22,42,26,39,16,97,15,97,15,39,16,187,0,97,15,187,0,104,14,104,14,187,0,157,14,42,26,97,15,92,17,42,26,92,17,42,41,187,0,12,7,12,0,221,-14,220,40,210,-3,224,16,221,-14,232,-34,159,216,146,225,146,218,25,216,12,225,12,218,42,188,42,201,42,187,
-244,225,139,225,139,218,152,216,161,212,167,207,170,200,171,190,171,118,166,116,158,113,148,110,136,108,123,107,106,108,94,112,87,120,83,131,81,147,81,186,82,199,86,208,91,213,100,216,113,218,113,225,9,225,9,218,22,216,30,213,36,209,39,200,40,186,40,144,43,121,52,105,66,97,85,93,107,92,124,93,139,96,152,100,162,104,171,108,171,27,168,18,162,13,153,9,141,7,141,0,244,0,244,7,231,9,223,12,217,17,215,25,214,39,214,199,217,208,223,213,231,216,244,218,373,225,270,225,270,218,282,216,291,213,296,207,299,200,300,189,300,39,299,29,297,22,293,17,287,15,278,14,235,14,228,15,221,17,217,22,214,29,213,39,213,189,214,199,218,207,224,213,232,216,243,218,243,225,141,225,141,218,152,216,160,213,166,207,170,199,171,189,171,39,170,29,168,22,164,17,158,15,150,14,107,14,99,15,93,17,88,22,85,29,84,39,84,189,85,199,88,207,93,212,102,216,114,218,114,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,
+244,225,139,225,139,218,152,216,161,212,167,207,170,200,171,190,171,118,166,116,158,113,148,110,136,108,123,107,106,108,94,112,87,120,83,131,81,147,81,186,82,199,86,208,91,213,100,216,113,218,113,225,9,225,9,218,22,216,30,213,36,209,39,200,40,186,40,144,43,121,52,105,66,97,85,93,107,92,124,93,139,96,152,100,162,104,171,108,171,27,168,18,162,13,153,9,141,7,141,0,244,0,244,7,231,9,223,12,217,17,215,25,214,39,214,199,217,208,223,213,231,216,244,218,
 113,218,113,218,100,216,100,216,113,218,113,225,100,216,113,225,91,213,91,213,113,225,40,186,91,213,40,186,86,208,86,208,40,186,43,121,86,208,43,121,82,199,82,199,43,121,52,105,82,199,52,105,66,97,87,120,83,131,85,93,85,93,83,131,81,147,81,147,81,186,66,97,66,97,81,186,82,199,30,213,36,209,113,225,113,225,36,209,39,200,113,225,39,200,40,186,22,216,30,213,113,225,22,216,113,225,9,225,22,216,9,225,9,218,244,7,231,9,244,0,244,0,231,9,223,12,244,0,223,12,171,39,171,39,223,12,217,17,171,39,217,17,171,108,171,108,171,118,166,116,171,108,166,116,162,104,162,104,166,116,158,113,162,104,158,113,152,100,152,100,158,113,148,110,152,100,148,110,139,96,139,96,148,110,136,108,139,96,136,108,124,93,124,93,136,108,123,107,107,92,124,93,123,107,107,92,123,107,106,108,107,92,106,108,94,112,107,92,94,112,87,120,107,92,87,120,85,93,244,225,139,225,152,216,244,225,152,216,161,212,244,225,161,212,167,207,244,225,167,207,170,200,244,225,170,200,171,190,244,225,171,190,223,213,244,225,223,213,231,216,244,225,231,216,244,218,214,39,214,186,171,108,171,108,214,186,214,199,171,108,214,199,217,208,171,190,171,108,217,208,171,190,217,208,223,213,171,108,217,17,215,25,171,108,215,25,214,39,244,0,171,39,171,27,244,0,171,27,168,18,244,0,168,18,162,13,244,0,162,13,153,9,244,0,153,9,141,7,244,0,141,7,141,0,43,121,40,186,40,144,171,118,171,108,171,190,152,216,139,225,139,218,85,93,81,147,66,97,
-373,225,270,225,270,218,282,216,291,213,296,207,299,200,300,189,300,39,299,29,297,22,293,17,287,15,278,14,235,14,228,15,221,17,217,22,214,29,213,39,213,189,214,199,218,207,224,213,232,216,243,218,243,225,141,225,141,218,152,216,160,213,166,207,170,199,171,189,171,39,170,29,168,22,164,17,158,15,150,14,107,14,99,15,93,17,88,22,85,29,84,39,84,189,85,199,88,207,93,212,102,216,114,218,114,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,372,0,372,7,360,8,351,11,345,16,342,25,342,198,345,207,351,213,360,216,373,218,373,225,270,225,270,218,282,216,291,213,296,207,299,200,300,189,300,39,299,29,297,22,293,17,287,15,278,14,235,14,228,15,221,17,217,22,214,29,213,39,213,189,214,199,218,207,224,212,232,216,243,218,243,225,141,225,141,218,142,218,152,216,160,212,166,207,170,199,171,189,171,39,170,29,168,22,164,17,158,15,150,14,107,14,99,15,93,17,88,22,85,29,84,39,84,189,85,199,87,207,93,212,101,216,114,218,114,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,325,0,335,-5,345,-17,354,-37,364,-68,372,-68,372,7,360,8,351,11,345,15,
+373,225,270,225,270,218,282,216,291,213,296,207,299,200,300,189,300,39,299,29,297,22,293,17,287,15,278,14,235,14,228,15,221,17,217,22,214,29,213,39,213,189,214,199,218,207,224,213,232,216,243,218,243,225,141,225,141,218,152,216,160,213,166,207,170,199,171,189,171,39,170,29,168,22,164,17,158,15,150,14,107,14,99,15,93,17,88,22,85,29,84,39,84,189,85,199,88,207,93,212,102,216,114,218,114,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,372,0,372,7,360,8,351,11,345,16,342,25,342,198,345,207,351,213,360,216,373,218,
 39,16,33,11,372,0,372,0,33,11,25,9,372,0,25,9,12,7,114,225,12,225,25,216,114,225,25,216,33,212,114,225,33,212,39,206,114,225,39,206,42,197,114,225,42,197,42,183,114,225,42,183,93,212,114,225,93,212,102,216,114,225,102,216,114,218,93,17,88,22,42,40,42,40,88,22,85,29,42,40,85,29,42,183,42,183,85,29,84,39,42,183,84,39,84,189,42,183,84,189,85,199,42,183,85,199,88,207,42,183,88,207,93,212,93,17,42,25,99,15,99,15,42,25,39,16,99,15,39,16,107,14,107,14,39,16,372,0,107,14,372,0,150,14,150,14,372,0,158,15,243,225,141,225,152,216,243,225,152,216,160,213,243,225,160,213,166,207,243,225,166,207,170,199,243,225,170,199,171,189,243,225,171,189,224,213,243,225,224,213,232,216,243,225,232,216,243,218,213,39,213,189,171,189,171,189,213,189,214,199,171,189,214,199,218,207,221,17,217,22,171,39,171,39,217,22,214,29,171,39,214,29,171,189,297,22,293,17,372,0,372,0,293,17,287,15,372,0,287,15,278,14,373,225,270,225,282,216,373,225,282,216,291,213,373,225,291,213,296,207,373,225,296,207,299,200,373,225,299,200,300,189,373,225,300,189,351,213,373,225,351,213,360,216,373,225,360,216,373,218,342,40,342,183,300,189,300,189,342,183,342,198,300,189,342,198,345,207,351,11,345,16,300,39,300,39,345,16,342,25,300,39,342,25,300,189,372,0,372,7,360,8,372,0,360,8,351,11,372,0,351,11,299,29,372,0,299,29,297,22,372,0,278,14,235,14,372,0,235,14,228,15,372,0,228,15,164,17,372,0,164,17,158,15,170,29,168,22,228,15,170,29,228,15,221,17,170,29,221,17,171,39,372,0,12,7,12,0,42,25,93,17,42,40,164,17,228,15,168,22,171,189,214,29,213,39,299,29,351,11,300,39,300,189,342,25,342,40,282,216,270,225,270,218,351,213,300,189,345,207,152,216,141,225,141,218,224,213,171,189,218,207,25,216,12,225,12,218,
-373,225,270,225,270,218,282,216,291,213,296,207,299,200,300,189,300,39,299,29,297,22,293,17,287,15,278,14,235,14,228,15,221,17,217,22,214,29,213,39,213,189,214,199,218,207,224,212,232,216,243,218,243,225,141,225,141,218,142,218,152,216,160,212,166,207,170,199,171,189,171,39,170,29,168,22,164,17,158,15,150,14,107,14,99,15,93,17,88,22,85,29,84,39,84,189,85,199,87,207,93,212,101,216,114,218,114,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,325,0,335,-5,345,-17,354,-37,364,-68,372,-68,372,7,360,8,351,11,345,15,342,25,342,198,345,207,351,213,360,216,373,218,126,126,126,199,129,207,134,212,143,216,156,218,156,225,8,225,4,161,12,161,18,181,25,195,35,205,46,209,61,211,68,211,74,209,79,207,83,202,84,195,84,40,83,25,80,16,75,11,66,9,52,7,52,0,169,0,196,3,220,10,238,23,249,40,253,62,249,86,235,105,215,117,188,124,158,126,16383,16383,126,112,148,112,167,111,183,107,196,98,205,84,208,64,205,43,196,29,182,20,164,15,142,14,135,14,130,16,127,19,126,23,126,30,323,0,323,8,310,10,301,13,295,18,293,26,292,36,292,199,295,207,300,212,309,216,323,218,323,225,219,225,219,218,232,216,241,212,246,206,249,197,250,183,250,40,249,25,246,16,241,11,232,9,219,7,
+373,225,270,225,270,218,282,216,291,213,296,207,299,200,300,189,300,39,299,29,297,22,293,17,287,15,278,14,235,14,228,15,221,17,217,22,214,29,213,39,213,189,214,199,218,207,224,212,232,216,243,218,243,225,141,225,141,218,142,218,152,216,160,212,166,207,170,199,171,189,171,39,170,29,168,22,164,17,158,15,150,14,107,14,99,15,93,17,88,22,85,29,84,39,84,189,85,199,87,207,93,212,101,216,114,218,114,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,325,0,335,-5,345,-17,354,-37,364,-68,372,-68,372,7,360,8,351,11,345,15,342,25,342,198,345,207,351,213,360,216,373,218,
 39,16,33,11,315,0,315,0,33,11,25,9,315,0,25,9,12,7,114,225,12,225,25,216,114,225,25,216,33,212,114,225,33,212,39,206,114,225,39,206,42,197,114,225,42,197,42,183,114,225,42,183,93,212,114,225,93,212,101,216,114,225,101,216,114,218,93,17,88,22,42,40,42,40,88,22,85,29,42,40,85,29,42,183,42,183,85,29,84,39,42,183,84,39,84,189,42,183,84,189,85,199,42,183,85,199,87,207,42,183,87,207,93,212,93,17,42,25,99,15,99,15,42,25,39,16,99,15,39,16,107,14,107,14,39,16,315,0,107,14,315,0,150,14,150,14,315,0,158,15,243,225,141,225,142,218,243,225,142,218,152,216,243,225,152,216,160,212,243,225,160,212,166,207,243,225,166,207,170,199,243,225,170,199,171,189,243,225,171,189,224,212,243,225,224,212,232,216,243,225,232,216,243,218,213,39,213,189,171,189,171,189,213,189,214,199,171,189,214,199,218,207,221,17,217,22,171,39,171,39,217,22,214,29,171,39,214,29,171,189,373,225,270,225,282,216,373,225,282,216,291,213,373,225,291,213,296,207,373,225,296,207,299,200,373,225,299,200,300,189,373,225,300,189,351,213,373,225,351,213,360,216,373,225,360,216,373,218,345,15,342,25,345,-17,345,-17,342,25,342,40,342,40,342,183,335,-5,335,-5,342,183,325,0,300,189,315,0,342,198,342,198,315,0,325,0,342,198,325,0,342,183,345,207,351,213,300,189,345,207,300,189,342,198,372,-68,372,7,364,-68,364,-68,372,7,360,8,364,-68,360,8,354,-37,354,-37,360,8,351,11,354,-37,351,11,345,15,297,22,293,17,315,0,315,0,293,17,287,15,315,0,287,15,278,14,315,0,300,189,300,39,315,0,300,39,299,29,315,0,299,29,297,22,315,0,278,14,235,14,315,0,235,14,228,15,315,0,228,15,168,22,315,0,168,22,164,17,315,0,164,17,158,15,170,29,168,22,228,15,170,29,228,15,221,17,170,29,221,17,171,39,315,0,12,7,12,0,42,25,93,17,42,40,171,189,214,29,213,39,345,-17,342,40,335,-5,345,15,345,-17,354,-37,282,216,270,225,270,218,142,218,141,225,141,218,224,212,171,189,218,207,25,216,12,225,12,218,
-126,126,126,199,129,207,134,212,143,216,156,218,156,225,8,225,4,161,12,161,18,181,25,195,35,205,46,209,61,211,68,211,74,209,79,207,83,202,84,195,84,40,83,25,80,16,75,11,66,9,52,7,52,0,169,0,196,3,220,10,238,23,249,40,253,62,249,86,235,105,215,117,188,124,158,126,16383,16383,126,112,148,112,167,111,183,107,196,98,205,84,208,64,205,43,196,29,182,20,164,15,142,14,135,14,130,16,127,19,126,23,126,30,323,0,323,8,310,10,301,13,295,18,293,26,292,36,292,199,295,207,300,212,309,216,323,218,323,225,219,225,219,218,232,216,241,212,246,206,249,197,250,183,250,40,249,25,246,16,241,11,232,9,219,7,219,0,16383,16383,84,126,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,127,0,155,3,179,10,197,23,209,40,213,62,208,86,194,105,
+126,126,126,199,129,207,134,212,143,216,156,218,156,225,8,225,4,161,12,161,18,181,25,195,35,205,46,209,61,211,68,211,74,209,79,207,83,202,84,195,84,40,83,25,80,16,75,11,66,9,52,7,52,0,169,0,196,3,220,10,238,23,249,40,253,62,249,86,235,105,215,117,188,124,158,126,16383,16383,126,112,148,112,167,111,183,107,196,98,205,84,208,64,205,43,196,29,182,20,164,15,142,14,135,14,130,16,127,19,126,23,126,30,
 80,16,75,11,169,0,169,0,75,11,66,9,169,0,66,9,52,7,74,209,156,225,68,211,68,211,156,225,61,211,46,209,61,211,156,225,46,209,156,225,8,225,156,225,74,209,79,207,156,225,79,207,83,202,156,225,83,202,84,195,156,225,84,195,134,212,156,225,134,212,143,216,156,225,143,216,156,218,84,195,126,23,126,30,126,126,126,112,148,112,126,126,148,112,158,126,158,126,148,112,167,111,158,126,167,111,188,124,188,124,167,111,183,107,188,124,183,107,196,98,84,195,126,30,126,189,84,195,126,189,126,199,84,195,126,199,129,207,84,195,129,207,134,212,8,225,4,161,12,161,8,225,12,161,18,181,8,225,18,181,25,195,8,225,25,195,35,205,8,225,35,205,46,209,205,43,196,29,196,3,196,3,196,29,182,20,196,3,182,20,169,0,169,0,182,20,164,15,169,0,164,15,142,14,142,14,135,14,169,0,169,0,135,14,130,16,169,0,130,16,83,25,83,25,130,16,84,40,196,3,220,10,205,43,205,43,220,10,208,64,215,117,208,64,220,10,215,117,220,10,235,105,235,105,220,10,238,23,235,105,238,23,249,86,249,86,238,23,249,40,249,86,249,40,253,62,215,117,188,124,196,98,215,117,196,98,205,84,215,117,205,84,208,64,84,40,130,16,127,19,84,40,127,19,126,23,84,40,126,23,84,195,169,0,52,7,52,0,80,16,169,0,83,25,
-323,0,323,8,310,10,301,13,295,18,293,26,292,36,292,199,295,207,300,212,309,216,323,218,323,225,219,225,219,218,232,216,241,212,246,206,249,197,250,183,250,40,249,25,246,16,241,11,232,9,219,7,219,0,16383,16383,84,126,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,127,0,155,3,179,10,197,23,209,40,213,62,208,86,194,105,174,117,148,124,118,126,16383,16383,84,112,107,112,126,111,142,107,155,98,164,84,167,64,164,43,155,29,141,20,123,15,102,14,94,14,89,16,86,19,85,23,84,30,84,126,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,127,0,155,3,179,10,197,23,209,40,213,62,208,86,194,105,174,117,148,124,118,126,16383,16383,84,112,107,112,126,111,142,107,155,98,164,84,167,64,164,43,155,29,141,20,123,15,102,14,94,14,89,16,86,19,85,23,84,30,30,228,23,157,32,157,38,173,46,189,58,203,75,212,99,216,122,212,140,200,154,182,162,157,165,128,75,128,75,112,165,112,160,87,150,64,135,47,114,35,88,31,71,33,56,37,42,46,28,59,15,78,7,74,18,53,
+323,0,323,8,310,10,301,13,295,18,293,26,292,36,292,199,295,207,300,212,309,216,323,218,323,225,219,225,219,218,232,216,241,212,246,206,249,197,250,183,250,40,249,25,246,16,241,11,232,9,219,7,219,0,16383,16383,84,126,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,127,0,155,3,179,10,197,23,209,40,213,62,208,86,194,105,174,117,148,124,118,126,16383,16383,84,112,107,112,126,111,142,107,155,98,164,84,167,64,164,43,155,29,141,20,123,15,102,14,94,14,89,16,86,19,85,23,84,30,
 323,218,323,218,309,216,309,216,323,218,323,225,309,216,323,225,300,212,300,212,323,225,249,197,300,212,249,197,250,183,293,26,250,183,250,40,293,26,250,40,295,18,295,18,250,40,301,13,292,36,292,189,250,183,250,183,292,189,292,199,250,183,292,199,295,207,323,225,219,225,232,216,323,225,232,216,241,212,323,225,241,212,246,206,323,225,246,206,249,197,323,0,323,8,310,10,323,0,310,10,301,13,323,0,301,13,250,40,323,0,250,40,249,25,323,0,249,25,246,16,323,0,246,16,241,11,323,0,241,11,232,9,323,0,232,9,219,7,323,0,219,7,219,0,39,16,33,11,127,0,127,0,33,11,25,9,127,0,25,9,12,7,116,225,12,225,25,216,116,225,25,216,33,212,116,225,33,212,39,206,116,225,39,206,42,197,116,225,42,197,93,212,116,225,93,212,102,216,116,225,102,216,116,218,42,183,85,23,84,30,84,126,84,112,107,112,84,126,107,112,118,126,118,126,107,112,126,111,118,126,126,111,148,124,148,124,126,111,142,107,148,124,142,107,155,98,42,183,84,30,84,189,42,183,84,189,85,199,42,183,85,199,88,207,42,183,88,207,93,212,42,183,93,212,42,197,164,43,155,29,155,3,155,3,155,29,141,20,155,3,141,20,127,0,127,0,141,20,123,15,127,0,123,15,102,14,102,14,94,14,127,0,127,0,94,14,89,16,127,0,89,16,42,25,42,25,89,16,42,40,155,3,179,10,164,43,164,43,179,10,167,64,174,117,167,64,179,10,174,117,179,10,194,105,194,105,179,10,197,23,194,105,197,23,208,86,208,86,197,23,209,40,208,86,209,40,213,62,174,117,148,124,155,98,174,117,155,98,164,84,174,117,164,84,167,64,42,40,89,16,86,19,42,40,86,19,85,23,42,40,85,23,42,183,127,0,12,7,12,0,39,16,127,0,42,25,25,216,12,225,12,218,250,183,293,26,292,36,232,216,219,225,219,218,300,212,250,183,295,207,
-84,126,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,127,0,155,3,179,10,197,23,209,40,213,62,208,86,194,105,174,117,148,124,118,126,16383,16383,84,112,107,112,126,111,142,107,155,98,164,84,167,64,164,43,155,29,141,20,123,15,102,14,94,14,89,16,86,19,85,23,84,30,30,228,23,157,32,157,38,173,46,189,58,203,75,212,99,216,122,212,140,200,154,182,162,157,165,128,75,128,75,112,165,112,160,87,150,64,135,47,114,35,88,31,71,33,56,37,42,46,28,59,15,78,7,74,18,53,32,32,49,14,72,0,101,-4,136,1,165,16,187,41,200,73,205,110,201,147,189,179,169,206,140,223,102,230,92,230,84,229,63,222,59,220,56,218,52,217,48,217,
+84,126,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,127,0,155,3,179,10,197,23,209,40,213,62,208,86,194,105,174,117,148,124,118,126,16383,16383,84,112,107,112,126,111,142,107,155,98,164,84,167,64,164,43,155,29,141,20,123,15,102,14,94,14,89,16,86,19,85,23,84,30,
 39,16,33,11,127,0,127,0,33,11,25,9,127,0,25,9,12,7,116,225,12,225,25,216,116,225,25,216,33,212,116,225,33,212,39,206,116,225,39,206,42,197,116,225,42,197,93,212,116,225,93,212,102,216,116,225,102,216,116,218,42,183,85,23,84,30,84,126,84,112,107,112,84,126,107,112,118,126,118,126,107,112,126,111,118,126,126,111,148,124,148,124,126,111,142,107,148,124,142,107,155,98,42,183,84,30,84,189,42,183,84,189,85,199,42,183,85,199,88,207,42,183,88,207,93,212,42,183,93,212,42,197,164,43,155,29,155,3,155,3,155,29,141,20,155,3,141,20,127,0,127,0,141,20,123,15,127,0,123,15,102,14,102,14,94,14,127,0,127,0,94,14,89,16,127,0,89,16,42,25,42,25,89,16,42,40,155,3,179,10,164,43,164,43,179,10,167,64,174,117,167,64,179,10,174,117,179,10,194,105,194,105,179,10,197,23,194,105,197,23,208,86,208,86,197,23,209,40,208,86,209,40,213,62,174,117,148,124,155,98,174,117,155,98,164,84,174,117,164,84,167,64,42,40,89,16,86,19,42,40,86,19,85,23,42,40,85,23,42,183,127,0,12,7,12,0,39,16,127,0,42,25,25,216,12,225,12,218,
-30,228,23,157,32,157,38,173,46,189,58,203,75,212,99,216,122,212,140,200,154,182,162,157,165,128,75,128,75,112,165,112,160,87,150,64,135,47,114,35,88,31,71,33,56,37,42,46,28,59,15,78,7,74,18,53,32,32,49,14,72,0,101,-4,136,1,165,16,187,41,200,73,205,110,201,147,189,179,169,206,140,223,102,230,92,230,84,229,63,222,59,220,56,218,52,217,48,217,44,218,42,219,40,221,38,224,37,228,84,124,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,84,108,131,108,138,70,153,39,176,16,205,0,239,-4,276,1,308,17,331,43,346,76,352,116,346,154,331,186,308,210,278,225,243,230,207,225,177,211,154,189,138,160,131,124,16383,16383,306,102,304,70,296,44,284,25,
+30,228,23,157,32,157,38,173,46,189,58,203,75,212,99,216,122,212,140,200,154,182,162,157,165,128,75,128,75,112,165,112,160,87,150,64,135,47,114,35,88,31,71,33,56,37,42,46,28,59,15,78,7,74,18,53,32,32,49,14,72,0,101,-4,136,1,165,16,187,41,200,73,205,110,201,147,189,179,169,206,140,223,102,230,92,230,84,229,63,222,59,220,56,218,52,217,48,217,44,218,42,219,40,221,38,224,37,228,
 59,220,56,218,58,203,58,203,56,218,52,217,58,203,52,217,48,217,48,217,44,218,46,189,46,189,44,218,42,219,46,189,42,219,40,221,30,228,32,157,37,228,37,228,32,157,38,173,37,228,38,173,38,224,38,224,38,173,46,189,38,224,46,189,40,221,15,78,18,53,28,59,28,59,18,53,32,32,28,59,32,32,42,46,42,46,32,32,49,14,42,46,49,14,56,37,56,37,49,14,72,0,56,37,72,0,71,33,71,33,72,0,88,31,114,35,88,31,101,-4,114,35,101,-4,136,1,99,216,92,230,84,229,99,216,84,229,78,227,99,216,78,227,75,212,99,216,102,230,92,230,75,212,78,227,72,225,75,212,72,225,66,223,75,212,66,223,63,222,75,212,63,222,59,220,75,212,59,220,58,203,48,217,46,189,58,203,75,128,165,112,165,128,165,128,165,112,165,16,165,128,165,16,169,206,205,110,201,147,200,73,200,73,201,147,189,179,200,73,189,179,187,41,187,41,189,179,169,206,187,41,169,206,165,16,169,206,140,223,140,200,169,206,140,200,154,182,169,206,154,182,162,157,169,206,162,157,165,128,122,212,140,200,140,223,122,212,140,223,102,230,122,212,102,230,99,216,165,112,160,87,165,16,165,16,160,87,150,64,165,16,150,64,136,1,136,1,150,64,135,47,136,1,135,47,114,35,88,31,72,0,101,-4,18,53,15,78,7,74,32,157,30,228,23,157,165,112,75,128,75,112,
-84,124,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,84,108,131,108,138,70,153,39,176,16,205,0,239,-4,276,1,308,17,331,43,346,76,352,116,346,154,331,186,308,210,278,225,243,230,207,225,177,211,154,189,138,160,131,124,16383,16383,306,102,304,70,296,44,284,25,268,13,248,9,237,10,227,13,218,18,210,25,203,34,193,51,185,70,180,91,177,113,176,137,179,164,186,186,199,202,215,212,234,216,246,215,257,211,266,206,274,199,281,191,290,177,297,161,302,142,305,122,306,102,224,225,121,225,91,224,65,219,45,210,31,193,26,167,30,148,40,131,55,118,74,109,97,104,37,31,32,25,26,19,19,14,11,9,2,7,2,0,64,0,142,103,151,103,151,25,148,16,143,11,135,8,123,7,123,0,224,0,224,8,211,10,202,13,197,18,194,26,193,40,193,183,194,198,197,207,202,213,211,216,224,218,16383,16383,151,117,131,117,111,119,94,125,82,135,74,148,71,165,75,185,85,198,99,206,117,210,136,211,142,211,147,209,149,206,151,202,151,195,193,286,191,294,188,301,182,306,175,310,167,311,160,310,153,306,148,301,144,294,143,286,144,278,147,272,153,266,159,263,167,262,175,263,182,266,188,272,191,278,193,286,16383,16383,
+84,124,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,84,108,131,108,138,70,153,39,176,16,205,0,239,-4,276,1,308,17,331,43,346,76,352,116,346,154,331,186,308,210,278,225,243,230,207,225,177,211,154,189,138,160,131,124,16383,16383,306,102,304,70,296,44,284,25,268,13,248,9,237,10,227,13,218,18,210,25,203,34,193,51,185,70,180,91,177,113,176,137,179,164,186,186,199,202,215,212,234,216,246,215,257,211,266,206,274,199,281,191,290,177,297,161,302,142,305,122,306,102,
 39,16,33,11,116,0,116,0,33,11,25,9,116,0,25,9,12,7,116,225,12,225,25,216,116,225,25,216,33,212,116,225,33,212,39,206,116,225,39,206,42,197,116,225,42,197,93,212,116,225,93,212,102,216,116,225,102,216,116,218,138,160,131,124,131,108,131,108,131,124,84,124,131,108,84,124,84,108,85,26,84,36,42,183,85,26,42,183,42,40,42,183,84,36,84,189,42,183,84,189,85,199,42,183,85,199,88,207,42,183,88,207,93,212,42,183,93,212,42,197,116,0,116,7,102,9,116,0,102,9,93,13,116,0,93,13,42,40,116,0,42,40,42,25,116,0,42,25,39,16,42,40,93,13,88,18,42,40,88,18,85,26,180,91,176,16,185,70,185,70,176,16,205,0,185,70,205,0,193,51,193,51,205,0,203,34,210,25,203,34,205,0,210,25,205,0,239,-4,278,225,243,230,246,215,246,215,243,230,234,216,215,212,234,216,243,230,215,212,243,230,207,225,304,70,296,44,308,17,308,17,296,44,284,25,308,17,284,25,276,1,276,1,284,25,268,13,276,1,268,13,248,9,248,9,237,10,239,-4,239,-4,237,10,227,13,239,-4,227,13,218,18,257,211,266,206,278,225,278,225,266,206,274,199,278,225,274,199,281,191,281,191,290,177,308,210,308,210,290,177,297,161,308,210,297,161,302,142,346,154,331,186,331,43,346,154,331,43,346,76,346,154,346,76,352,116,304,70,308,17,306,102,306,102,308,17,308,210,308,210,308,17,331,43,308,210,331,43,331,186,308,210,302,142,305,122,308,210,305,122,306,102,308,210,278,225,281,191,248,9,239,-4,276,1,176,137,179,164,177,211,177,211,179,164,186,186,177,211,186,186,207,225,207,225,186,186,199,202,207,225,199,202,215,212,131,108,138,70,138,160,138,160,138,70,153,39,138,160,153,39,154,189,154,189,153,39,176,16,154,189,176,16,176,137,176,137,177,211,154,189,177,113,176,137,176,16,177,113,176,16,180,91,278,225,246,215,257,211,210,25,239,-4,218,18,116,0,12,7,12,0,25,216,12,225,12,218,
-224,225,121,225,91,224,65,219,45,210,31,193,26,167,30,148,40,131,55,118,74,109,97,104,37,31,32,25,26,19,19,14,11,9,2,7,2,0,64,0,142,103,151,103,151,25,148,16,143,11,135,8,123,7,123,0,224,0,224,8,211,10,202,13,197,18,194,26,193,40,193,183,194,198,197,207,202,213,211,216,224,218,16383,16383,151,117,131,117,111,119,94,125,82,135,74,148,71,165,75,185,85,198,99,206,117,210,136,211,142,211,147,209,149,206,151,202,151,195,193,286,191,294,188,301,182,306,175,310,167,311,160,310,153,306,148,301,144,294,143,286,144,278,147,272,153,266,159,263,167,262,175,263,182,266,188,272,191,278,193,286,16383,16383,93,286,92,294,88,301,83,306,76,310,68,311,60,310,54,306,48,301,45,294,44,286,45,278,48,272,53,266,60,263,68,262,76,263,83,266,88,272,92,278,93,286,16383,16383,210,82,196,63,182,48,167,39,150,33,132,31,102,37,80,53,66,77,58,106,55,137,209,137,208,152,205,165,202,176,
+224,225,121,225,91,224,65,219,45,210,31,193,26,167,30,148,40,131,55,118,74,109,97,104,37,31,32,25,26,19,19,14,11,9,2,7,2,0,64,0,142,103,151,103,151,25,148,16,143,11,135,8,123,7,123,0,224,0,224,8,211,10,202,13,197,18,194,26,193,40,193,183,194,198,197,207,202,213,211,216,224,218,16383,16383,151,117,131,117,111,119,94,125,82,135,74,148,71,165,75,185,85,198,99,206,117,210,136,211,142,211,147,209,149,206,151,202,151,195,
 26,19,19,14,64,0,64,0,19,14,11,9,64,0,11,9,2,7,97,104,64,0,142,103,97,104,142,103,111,119,97,104,111,119,94,125,97,104,94,125,82,135,97,104,82,135,74,148,97,104,74,148,74,109,85,198,91,224,75,185,75,185,91,224,65,219,75,185,65,219,71,165,71,165,74,109,74,148,26,167,30,148,31,193,31,193,30,148,40,131,31,193,40,131,45,210,45,210,40,131,55,118,45,210,55,118,65,219,65,219,55,118,74,109,65,219,74,109,71,165,148,16,143,11,224,0,224,0,143,11,135,8,224,0,135,8,123,7,147,209,224,225,142,211,142,211,224,225,136,211,117,210,136,211,121,225,117,210,121,225,99,206,99,206,121,225,91,224,99,206,91,224,85,198,224,8,211,10,224,0,224,0,211,10,202,13,224,0,202,13,151,38,151,38,202,13,197,18,151,38,197,18,151,103,151,103,197,18,151,117,151,103,151,117,142,103,142,103,151,117,131,117,142,103,131,117,111,119,64,0,97,104,37,31,64,0,37,31,32,25,64,0,32,25,26,19,224,225,147,209,149,206,224,225,149,206,151,202,224,225,151,202,151,195,224,225,151,195,202,213,224,225,202,213,211,216,224,225,211,216,224,218,193,40,193,183,151,195,151,195,193,183,194,198,151,195,194,198,197,207,151,195,194,26,193,40,224,225,121,225,136,211,151,117,197,18,194,26,151,117,194,26,151,195,151,25,148,16,224,0,151,25,224,0,151,38,224,0,123,7,123,0,202,213,151,195,197,207,64,0,2,7,2,0,
-266,59,253,44,242,34,234,29,228,26,222,25,216,28,216,31,215,33,216,38,217,44,218,49,220,55,221,61,247,151,249,159,252,180,252,186,250,202,245,214,236,223,224,228,208,230,189,227,169,216,147,196,123,165,99,123,98,123,133,252,205,278,211,300,139,273,146,296,148,306,151,315,153,324,156,332,158,340,155,342,143,337,131,333,116,329,98,325,76,320,76,312,85,312,92,311,99,309,103,306,104,301,104,293,103,290,103,286,93,257,45,239,40,218,87,234,23,0,65,0,78,41,88,72,98,97,109,117,121,137,137,159,152,177,167,191,180,200,190,203,198,202,203,199,207,194,209,188,209,175,207,161,206,155,204,150,185,78,182,66,178,54,175,41,173,31,172,23,174,13,177,5,183,0,190,-3,199,-4,211,-2,225,3,240,14,256,30,273,54,344,337,341,331,335,324,327,316,316,310,302,308,271,312,246,322,222,334,193,344,154,348,118,342,88,327,65,305,51,278,46,248,49,224,60,204,77,189,100,179,128,176,136,176,144,177,151,179,159,182,167,186,163,197,157,195,150,193,144,191,137,190,131,190,116,192,102,198,90,208,82,222,79,241,83,262,93,278,106,289,122,295,138,297,168,293,193,283,216,272,242,262,273,258,303,263,325,276,340,294,349,314,355,334,16383,16383,352,209,344,217,335,225,325,231,312,235,295,237,275,234,257,225,241,212,231,195,227,174,232,145,243,121,257,99,269,76,273,49,271,34,264,22,253,11,238,5,219,2,204,4,191,8,181,16,172,28,165,44,158,63,149,82,136,98,118,110,94,114,72,109,53,97,38,82,28,65,22,51,34,49,39,57,45,64,53,69,61,73,
+266,59,253,44,242,34,234,29,228,26,222,25,216,28,216,31,215,33,216,38,217,44,218,49,220,55,221,61,247,151,249,159,252,180,252,186,250,202,245,214,236,223,224,228,208,230,189,227,169,216,147,196,123,165,99,123,98,123,133,252,205,278,211,300,139,273,146,296,148,306,151,315,153,324,156,332,158,340,155,342,143,337,131,333,116,329,98,325,76,320,76,312,85,312,92,311,99,309,103,306,104,301,104,293,103,290,103,286,93,257,45,239,40,218,87,234,23,0,65,0,78,41,88,72,98,97,109,117,121,137,137,159,152,177,167,191,180,200,190,203,198,202,203,199,207,194,209,188,209,175,207,161,206,155,204,150,185,78,182,66,178,54,175,41,173,31,172,23,174,13,177,5,183,0,190,-3,199,-4,211,-2,225,3,240,14,256,30,273,54,
 99,123,98,123,99,123,99,123,98,123,109,117,99,123,109,117,123,165,123,165,109,117,121,137,104,296,104,293,133,252,133,252,104,293,103,290,133,252,103,290,103,286,103,286,93,257,98,123,98,123,93,257,98,97,98,123,98,97,109,117,203,199,208,230,198,202,198,202,208,230,190,203,180,200,190,203,189,227,180,200,189,227,169,216,123,165,137,159,147,196,147,196,137,159,152,177,147,196,152,177,169,216,169,216,152,177,167,191,169,216,167,191,180,200,204,150,185,78,190,-3,204,150,190,-3,199,-4,204,150,199,-4,211,-2,204,150,211,-2,206,155,211,-2,216,31,215,33,215,33,224,228,211,-2,211,-2,224,228,209,181,211,-2,209,181,209,175,211,-2,209,175,208,168,224,228,215,33,216,38,224,228,216,38,217,44,224,228,217,44,218,49,224,228,218,49,220,55,224,228,220,55,221,61,224,228,221,61,247,151,224,228,247,151,236,223,209,188,209,181,224,228,209,188,224,228,208,230,209,188,208,230,207,194,208,230,189,227,190,203,249,159,250,166,250,202,250,202,250,166,251,173,250,202,251,173,252,186,252,186,251,173,252,180,247,151,249,159,250,202,247,151,250,202,245,214,247,151,245,214,236,223,218,27,225,3,220,26,220,26,225,3,222,25,228,26,222,25,225,3,228,26,225,3,240,14,256,30,273,54,266,59,256,30,266,59,253,44,256,30,253,44,242,34,256,30,242,34,240,14,234,29,228,26,240,14,234,29,240,14,242,34,225,3,218,27,216,28,225,3,216,28,216,31,225,3,216,31,211,-2,207,161,206,155,211,-2,207,161,211,-2,208,168,183,0,190,-3,185,78,183,0,185,78,182,66,183,0,182,66,178,54,183,0,178,54,177,5,175,41,173,31,174,13,175,41,174,13,177,5,175,41,177,5,178,54,65,0,78,41,87,234,87,234,78,41,88,72,87,234,88,72,93,257,93,257,88,72,98,97,45,239,40,218,87,234,45,239,87,234,93,257,85,312,92,311,98,325,98,325,92,311,99,309,98,325,99,309,116,329,116,329,99,309,103,306,116,329,103,306,104,301,104,301,104,299,133,252,133,252,104,299,104,296,76,320,76,312,85,312,76,320,85,312,98,325,151,315,153,324,155,342,155,342,153,324,156,332,155,342,156,332,158,340,133,252,139,273,143,337,143,337,139,273,146,296,143,337,146,296,155,342,155,342,146,296,148,306,155,342,148,306,151,315,133,252,143,337,131,333,133,252,131,333,116,329,133,252,116,329,104,301,103,286,98,123,133,252,139,273,133,252,205,278,139,273,205,278,211,300,65,0,87,234,23,0,174,13,173,31,172,23,208,230,203,199,207,194,121,137,137,159,123,165,
-344,337,341,331,335,324,327,316,316,310,302,308,271,312,246,322,222,334,193,344,154,348,118,342,88,327,65,305,51,278,46,248,49,224,60,204,77,189,100,179,128,176,136,176,144,177,151,179,159,182,167,186,163,197,157,195,150,193,144,191,137,190,131,190,116,192,102,198,90,208,82,222,79,241,83,262,93,278,106,289,122,295,138,297,168,293,193,283,216,272,242,262,273,258,303,263,325,276,340,294,349,314,355,334,16383,16383,352,209,344,217,335,225,325,231,312,235,295,237,275,234,257,225,241,212,231,195,227,174,232,145,243,121,257,99,269,76,273,49,271,34,264,22,253,11,238,5,219,2,204,4,191,8,181,16,172,28,165,44,158,63,149,82,136,98,118,110,94,114,72,109,53,97,38,82,28,65,22,51,34,49,39,57,45,64,53,69,61,73,69,74,75,73,81,70,87,65,92,58,97,49,102,39,108,29,114,20,122,11,132,3,144,-3,157,-9,172,-13,192,-15,215,-16,253,-11,285,1,311,22,329,47,335,76,329,103,316,127,300,149,287,169,281,186,283,197,287,205,294,211,302,214,310,215,316,215,322,214,328,211,335,207,343,200,314,0,314,331,292,331,292,78,291,78,118,309,103,331,35,331,35,0,57,0,57,252,58,252,247,0,16383,16383,292,22,257,22,57,289,57,309,91,309,292,41,483,153,480,178,471,200,456,217,437,229,414,233,389,229,370,217,356,199,347,177,344,152,347,128,355,107,370,89,389,78,414,74,437,78,457,89,471,106,480,128,483,153,16383,16383,444,152,443,127,439,108,433,95,424,87,413,84,402,87,393,95,387,108,384,127,383,152,384,178,388,197,394,211,402,219,412,222,424,219,433,211,439,197,443,178,444,152,16383,16383,481,0,481,44,346,44,346,0,16383,16383,278,107,135,331,45,331,45,321,53,321,71,318,75,316,80,313,86,308,92,301,99,291,107,280,107,112,104,78,98,47,88,26,71,17,64,21,53,43,45,53,31,57,24,56,17,53,10,48,5,40,3,30,6,14,13,4,24,-2,38,-5,55,-6,91,2,113,27,124,60,128,97,129,131,129,246,291,-5,300,-5,300,186,301,219,303,253,309,284,319,305,335,314,343,309,348,300,354,288,362,278,376,274,383,275,390,278,397,283,402,291,403,301,401,317,394,327,383,334,369,337,353,338,316,329,
+344,337,341,331,335,324,327,316,316,310,302,308,271,312,246,322,222,334,193,344,154,348,118,342,88,327,65,305,51,278,46,248,49,224,60,204,77,189,100,179,128,176,136,176,144,177,151,179,159,182,167,186,163,197,157,195,150,193,144,191,137,190,131,190,116,192,102,198,90,208,82,222,79,241,83,262,93,278,106,289,122,295,138,297,168,293,193,283,216,272,242,262,273,258,303,263,325,276,340,294,349,314,355,334,16383,16383,352,209,344,217,335,225,325,231,312,235,295,237,275,234,257,225,241,212,231,195,227,174,232,145,243,121,257,99,269,76,273,49,271,34,264,22,253,11,238,5,219,2,204,4,191,8,181,16,172,28,165,44,158,63,149,82,136,98,118,110,94,114,72,109,53,97,38,82,28,65,22,51,34,49,39,57,45,64,53,69,61,73,69,74,75,73,81,70,87,65,92,58,97,49,102,39,108,29,114,20,122,11,132,3,144,-3,157,-9,172,-13,192,-15,215,-16,253,-11,285,1,311,22,329,47,335,76,329,103,316,127,300,149,287,169,281,186,283,197,287,205,294,211,302,214,310,215,316,215,322,214,328,211,335,207,343,200,
 102,198,90,208,100,179,100,179,90,208,82,222,100,179,82,222,77,189,77,189,82,222,79,241,88,327,79,241,83,262,88,327,83,262,93,278,154,348,138,297,168,293,154,348,168,293,193,344,193,344,168,293,193,283,193,344,193,283,222,334,222,334,193,283,216,272,222,334,216,272,242,262,222,334,242,262,246,322,246,322,242,262,273,258,246,322,273,258,271,312,271,312,273,258,302,308,316,310,302,308,303,263,316,310,303,263,325,276,355,334,344,337,349,314,349,314,344,337,341,331,349,314,341,331,340,294,340,294,341,331,335,324,340,294,335,324,327,316,327,316,316,310,325,276,327,316,325,276,340,294,302,308,273,258,303,263,295,237,275,234,283,197,283,197,275,234,281,186,285,1,281,186,275,234,285,1,275,234,273,49,273,49,271,34,285,1,285,1,271,34,264,22,285,1,264,22,253,-11,253,-11,264,22,253,11,253,-11,253,11,238,5,325,231,312,235,316,215,316,215,312,235,310,215,302,214,310,215,312,235,302,214,312,235,295,237,295,237,283,197,287,205,295,237,287,205,294,211,295,237,294,211,302,214,343,200,352,209,344,217,343,200,344,217,335,225,343,200,335,225,335,207,316,215,322,214,325,231,325,231,322,214,328,211,325,231,328,211,335,225,335,225,328,211,335,207,335,76,329,103,329,47,329,47,329,103,316,127,329,47,316,127,311,22,311,22,316,127,300,149,311,22,300,149,287,169,287,169,281,186,285,1,287,169,285,1,311,22,238,5,219,2,253,-11,253,-11,219,2,215,-16,215,-16,219,2,204,4,215,-16,204,4,192,-15,192,-15,204,4,191,8,192,-15,191,8,181,16,93,278,106,289,118,342,118,342,106,289,122,295,118,342,122,295,154,348,154,348,122,295,138,297,65,305,51,278,60,204,65,305,60,204,77,189,65,305,77,189,79,241,65,305,79,241,88,327,51,278,46,248,49,224,51,278,49,224,60,204,157,195,150,193,151,179,151,179,150,193,144,191,151,179,144,191,144,177,144,177,144,191,137,190,144,177,137,190,136,176,136,176,137,190,131,190,128,176,136,176,131,190,128,176,131,190,116,192,128,176,116,192,102,198,128,176,102,198,100,179,159,182,167,186,163,197,159,182,163,197,157,195,159,182,157,195,151,179,94,114,72,109,75,73,75,73,72,109,69,74,61,73,69,74,72,109,61,73,72,109,53,97,53,97,38,82,39,57,53,97,39,57,45,64,53,97,45,64,53,69,53,97,53,69,61,73,34,49,39,57,38,82,34,49,38,82,28,65,34,49,28,65,22,51,81,70,87,65,94,114,94,114,87,65,92,58,94,114,92,58,97,49,97,49,102,39,118,110,118,110,102,39,108,29,118,110,108,29,114,20,122,11,132,3,136,98,136,98,132,3,144,-3,136,98,144,-3,149,82,149,82,144,-3,157,-9,149,82,157,-9,158,63,158,63,157,-9,172,-13,158,63,172,-13,165,44,165,44,172,-13,172,28,181,16,172,28,172,-13,181,16,172,-13,192,-15,118,110,114,20,122,11,118,110,122,11,136,98,118,110,94,114,97,49,231,195,232,145,241,212,241,212,232,145,243,121,241,212,243,121,257,225,257,225,243,121,257,99,257,225,257,99,275,234,275,234,257,99,269,76,275,234,269,76,273,49,232,145,231,195,227,174,94,114,75,73,81,70,88,327,93,278,118,342,
-
-
-406,57,402,52,396,46,384,36,379,35,361,47,353,78,347,119,335,159,309,190,309,191,331,203,348,218,361,236,368,256,371,277,367,300,355,321,335,337,308,348,272,352,206,304,193,317,178,329,160,339,140,345,118,348,89,344,63,335,43,319,30,297,25,270,31,247,45,229,62,214,76,197,82,175,79,163,73,153,64,144,54,138,45,134,49,123,74,132,97,145,115,161,128,180,132,200,126,227,112,245,95,259,81,275,75,299,76,308,80,318,87,325,97,330,108,332,133,322,149,297,157,265,161,231,162,203,162,165,160,123,156,84,149,56,137,45,129,47,116,54,100,62,86,70,76,75,30,2,41,-3,51,9,56,14,60,17,63,20,70,17,83,11,97,3,111,-4,122,-10,149,19,173,53,193,88,209,125,220,161,257,170,269,162,276,149,280,132,282,113,283,94,284,70,289,44,298,21,313,1,333,-10,339,-10,355,0,372,11,388,24,403,36,415,47,16383,16383,222,179,223,189,223,200,224,212,224,233,223,242,222,253,220,265,217,276,214,286,225,297,235,304,245,310,255,313,266,314,283,310,296,302,305,291,310,278,312,266,310,246,303,226,289,208,268,192,238,182,356,0,248,142,271,153,290,167,303,186,311,208,314,233,308,271,291,298,265,317,232,328,195,331,35,331,35,0,118,0,118,136,155,136,252,0,16383,16383,246,302,262,293,275,281,284,268,290,251,292,232,290,214,284,197,274,182,261,170,246,161,16383,16383,224,160,218,159,212,159,207,158,201,158,196,157,118,157,118,309,203,309,208,308,214,307,224,305,16383,16383,313,22,264,22,181,136,184,136,186,135,206,135,213,136,219,136,225,137,16383,16383,96,22,57,22,57,309,96,309,382,0,382,11,365,13,350,18,337,26,326,36,314,47,382,113,368,127,300,61,284,80,254,120,224,158,250,166,274,178,295,196,309,217,315,244,306,281,282,306,250,323,213,331,177,334,35,334,35,321,57,320,73,315,85,307,92,292,94,269,94,65,92,42,85,27,73,18,57,14,35,12,35,0,197,0,197,12,175,14,158,18,147,27,140,42,138,65,138,152,145,152,149,151,162,151,165,152,172,152,270,31,200,-35,213,-49,282,17,295,0,16383,16383,138,283,140,298,146,308,156,314,168,317,182,318,212,315,235,307,251,293,261,271,264,240,259,207,244,186,222,174,194,168,163,166,158,166,153,167,
+177,262,198,294,219,325,240,354,261,380,281,403,291,412,302,421,313,428,324,432,335,434,343,433,350,430,355,426,357,420,358,413,350,375,325,339,287,307,237,280,178,262,16383,16383,51,258,62,251,73,246,85,242,97,240,109,239,104,230,98,221,83,194,66,162,51,131,41,101,34,74,32,50,35,30,43,13,56,2,72,-4,89,-6,114,-2,140,11,169,35,201,68,239,112,226,123,191,83,161,52,135,30,113,17,94,13,85,14,78,18,73,24,71,32,70,41,77,74,94,114,117,158,142,201,165,239,232,256,290,286,337,325,367,368,378,411,377,427,371,440,363,448,351,454,336,455,299,445,257,415,212,372,166,318,123,258,111,258,98,259,86,262,73,267,61,275,
+142,201,165,239,166,318,166,318,165,239,177,262,177,262,165,239,178,262,237,280,178,262,232,256,237,280,232,256,290,286,313,428,336,455,302,421,302,421,336,455,299,445,302,421,299,445,291,412,291,412,299,445,281,403,261,380,281,403,299,445,261,380,299,445,257,415,351,454,336,455,343,433,343,433,336,455,335,434,324,432,335,434,336,455,324,432,336,455,313,428,355,426,357,420,363,448,363,448,357,420,358,413,367,368,358,413,350,375,367,368,350,375,337,325,337,325,350,375,325,339,337,325,325,339,290,286,290,286,325,339,287,307,290,286,287,307,237,280,351,454,343,433,350,430,351,454,350,430,355,426,351,454,355,426,363,448,371,440,363,448,367,368,371,440,367,368,378,411,371,440,378,411,377,427,177,262,198,294,212,372,212,372,198,294,219,325,212,372,219,325,257,415,257,415,219,325,240,354,257,415,240,354,261,380,232,256,178,262,165,239,34,74,35,30,41,101,41,101,35,30,43,13,41,101,43,13,51,131,51,131,43,13,56,2,51,131,56,2,66,162,66,162,56,2,72,-4,66,162,72,-4,70,41,70,41,83,194,66,162,73,246,85,242,86,262,86,262,85,242,97,240,86,262,97,240,98,259,98,259,97,240,109,239,98,259,109,239,111,258,111,258,109,239,117,158,111,258,117,158,123,258,123,258,117,158,142,201,123,258,142,201,166,318,73,267,61,275,62,251,73,267,62,251,73,246,73,267,73,246,86,262,117,158,109,239,104,230,117,158,104,230,98,221,117,158,98,221,94,114,94,114,98,221,93,212,94,114,93,212,88,203,94,114,88,203,83,194,94,114,83,194,77,74,239,112,226,123,201,68,201,68,226,123,191,83,201,68,191,83,169,35,169,35,191,83,161,52,169,35,161,52,140,11,140,11,161,52,135,30,140,11,135,30,114,-2,114,-2,135,30,113,17,114,-2,113,17,94,13,94,13,85,14,89,-6,89,-6,85,14,78,18,89,-6,78,18,73,24,72,-4,89,-6,73,24,72,-4,73,24,71,32,72,-4,71,32,70,41,94,13,89,-6,114,-2,62,251,61,275,51,258,35,30,34,74,32,50,83,194,70,41,77,74,177,262,212,372,166,318,358,413,367,368,363,448,
+406,57,402,52,396,46,384,36,379,35,361,47,353,78,347,119,335,159,309,190,309,191,331,203,348,218,361,236,368,256,371,277,367,300,355,321,335,337,308,348,272,352,206,304,193,317,178,329,160,339,140,345,118,348,89,344,63,335,43,319,30,297,25,270,31,247,45,229,62,214,76,197,82,175,79,163,73,153,64,144,54,138,45,134,49,123,74,132,97,145,115,161,128,180,132,200,126,227,112,245,95,259,81,275,75,299,76,308,80,318,87,325,97,330,108,332,133,322,149,297,157,265,161,231,162,203,162,165,160,123,156,84,149,56,137,45,129,47,116,54,100,62,86,70,76,75,30,2,41,-3,51,9,56,14,60,17,63,20,70,17,83,11,97,3,111,-4,122,-10,149,19,173,53,193,88,209,125,220,161,257,170,269,162,276,149,280,132,282,113,283,94,284,70,289,44,298,21,313,1,333,-10,339,-10,355,0,372,11,388,24,403,36,415,47,16383,16383,222,179,223,189,223,200,224,212,224,233,223,242,222,253,220,265,217,276,214,286,225,297,235,304,245,310,255,313,266,314,283,310,296,302,305,291,310,278,312,266,310,246,303,226,289,208,268,192,238,182,
 82,175,79,163,82,175,82,175,79,163,97,145,82,175,97,145,95,259,82,175,95,259,81,275,82,175,81,275,76,197,76,197,81,275,75,299,63,335,75,299,76,308,63,335,76,308,89,344,89,344,76,308,80,318,89,344,80,318,87,325,118,348,108,332,133,322,118,348,133,322,140,345,140,345,133,322,149,297,140,345,149,297,160,339,160,339,149,297,157,265,160,339,157,265,161,231,162,165,160,123,173,53,173,53,160,123,156,84,173,53,156,84,149,19,149,19,156,84,149,56,149,19,149,56,137,45,137,45,129,47,149,19,149,19,129,47,122,-10,220,161,257,170,222,179,220,161,222,179,222,253,220,161,222,253,220,265,220,161,220,265,217,276,220,161,217,276,214,286,220,161,214,286,209,125,222,179,223,189,223,242,223,242,223,189,223,200,223,242,223,200,224,233,224,233,223,200,224,212,224,233,224,212,224,223,206,304,193,317,193,88,193,88,193,317,178,329,193,88,178,329,173,53,173,53,178,329,162,203,63,20,70,17,76,75,76,75,70,17,83,11,76,75,83,11,86,70,86,70,83,11,97,3,86,70,97,3,100,62,100,62,97,3,111,-4,100,62,111,-4,116,54,116,54,111,-4,122,-10,116,54,122,-10,129,47,76,75,30,2,41,-3,76,75,41,-3,46,3,76,75,46,3,51,9,76,75,51,9,56,14,76,75,56,14,60,17,76,75,60,17,63,20,97,330,108,332,118,348,97,330,118,348,89,344,97,330,89,344,87,325,63,335,43,319,45,229,63,335,45,229,62,214,63,335,62,214,76,197,63,335,76,197,75,299,31,247,45,229,43,319,31,247,43,319,30,297,31,247,30,297,25,270,95,259,97,145,112,245,112,245,97,145,115,161,112,245,115,161,126,227,126,227,115,161,128,180,126,227,128,180,132,200,74,132,97,145,79,163,74,132,79,163,73,153,74,132,73,153,64,144,74,132,64,144,54,138,74,132,54,138,49,123,54,138,45,134,49,123,276,149,289,208,269,162,269,162,289,208,268,192,269,162,268,192,257,170,257,170,268,192,238,182,235,304,245,310,272,352,272,352,245,310,255,313,272,352,255,313,266,314,266,314,283,310,272,352,272,352,283,310,308,348,312,266,331,203,335,337,335,337,331,203,348,218,335,337,348,218,355,321,355,321,348,218,361,236,355,321,361,236,367,300,367,300,361,236,368,256,367,300,368,256,371,277,310,278,312,266,335,337,310,278,335,337,308,348,310,278,308,348,305,291,308,348,283,310,296,302,308,348,296,302,305,291,310,246,303,226,309,191,310,246,309,191,331,203,310,246,331,203,312,266,309,190,309,191,303,226,309,190,303,226,313,1,309,190,313,1,335,159,402,52,396,46,403,36,403,36,396,46,390,41,403,36,390,41,388,24,388,24,390,41,384,36,388,24,384,36,379,35,379,35,361,47,372,11,372,11,361,47,355,0,313,1,333,-10,335,159,335,159,333,-10,339,-10,335,159,339,-10,347,119,347,119,339,-10,355,0,347,119,355,0,353,78,353,78,355,0,361,47,283,94,284,70,289,208,289,208,284,70,289,44,289,208,289,44,303,226,303,226,289,44,298,21,303,226,298,21,313,1,276,149,280,132,289,208,289,208,280,132,282,113,289,208,282,113,283,94,406,57,402,52,403,36,406,57,403,36,415,47,379,35,372,11,388,24,272,352,206,304,214,286,272,352,214,286,225,297,272,352,225,297,235,304,206,304,193,88,209,125,206,304,209,125,214,286,161,231,162,203,178,329,161,231,178,329,160,339,222,179,257,170,238,182,162,165,173,53,162,203,222,179,223,242,222,253,
-429,110,429,143,125,143,121,145,119,147,117,150,117,155,119,161,123,167,132,176,141,186,149,195,165,215,155,224,134,202,112,180,89,160,63,143,36,129,36,124,63,110,89,93,112,73,134,51,154,29,164,39,157,49,149,59,140,68,132,78,123,86,120,89,118,92,116,96,116,99,117,102,119,105,122,107,126,109,129,110,225,212,203,232,181,254,162,278,144,303,130,331,125,331,111,303,94,278,74,254,52,233,30,213,40,203,49,210,69,226,79,235,88,243,90,246,93,248,97,250,100,251,103,250,109,244,111,238,111,-77,144,-77,144,237,145,242,146,246,148,248,151,250,157,250,159,249,168,243,177,234,187,226,197,217,206,209,216,202,428,129,
+429,110,429,143,125,143,121,145,119,147,117,150,117,155,119,161,123,167,132,176,141,186,149,195,165,215,155,224,134,202,112,180,89,160,63,143,36,129,36,124,63,110,89,93,112,73,134,51,154,29,164,39,157,49,149,59,140,68,132,78,123,86,120,89,118,92,116,96,116,99,117,102,119,105,122,107,126,109,129,110,
 121,145,119,147,119,105,119,105,119,147,117,150,119,105,117,150,117,102,117,102,117,150,117,153,116,99,112,180,112,73,112,73,112,180,89,160,112,73,89,160,89,93,89,93,89,160,63,143,89,93,63,143,63,110,63,110,63,143,36,129,63,110,36,129,36,124,155,224,134,202,141,186,155,224,141,186,149,195,155,224,149,195,157,205,155,224,157,205,165,215,134,202,112,180,118,158,134,202,118,158,119,161,134,202,119,161,121,164,134,202,121,164,123,167,134,202,123,167,132,176,134,202,132,176,141,186,117,155,118,158,112,180,117,155,112,180,117,153,140,68,132,78,134,51,134,51,132,78,123,86,134,51,123,86,120,89,129,143,125,143,126,109,129,143,126,109,129,110,129,143,129,110,429,110,129,143,429,110,429,143,122,107,126,109,125,143,122,107,125,143,121,145,122,107,121,145,119,105,154,29,164,39,157,49,154,29,157,49,149,59,154,29,149,59,140,68,154,29,140,68,134,51,116,96,116,99,112,73,116,96,112,73,117,94,117,94,112,73,134,51,117,94,134,51,118,92,118,92,134,51,120,89,117,102,117,153,116,99,117,153,112,180,116,99,
-225,212,203,232,181,254,162,278,144,303,130,331,125,331,111,303,94,278,74,254,52,233,30,213,40,203,49,210,69,226,79,235,88,243,90,246,93,248,97,250,100,251,103,250,109,244,111,238,111,-77,144,-77,144,237,145,242,146,246,148,248,151,250,157,250,159,249,168,243,177,234,187,226,197,217,206,209,216,202,428,129,400,143,375,160,352,180,330,201,310,224,300,214,314,194,323,185,332,175,340,166,343,164,345,161,347,159,347,157,348,154,347,151,341,145,338,144,334,143,35,143,35,110,334,110,339,109,343,108,345,106,347,103,347,97,346,95,340,86,331,77,322,67,314,58,306,48,299,38,309,28,330,51,351,72,375,92,
+225,212,203,232,181,254,162,278,144,303,130,331,125,331,111,303,94,278,74,254,52,233,30,213,40,203,49,210,69,226,79,235,88,243,90,246,93,248,97,250,100,251,103,250,109,244,111,238,111,-77,144,-77,144,237,145,242,146,246,148,248,151,250,157,250,159,249,168,243,177,234,187,226,197,217,206,209,216,202,
 90,246,93,248,94,278,94,278,93,248,95,249,94,278,95,249,111,303,111,303,95,249,97,250,111,303,97,250,100,251,100,251,103,250,111,303,111,303,103,250,106,247,111,303,106,247,109,244,110,241,111,238,111,303,111,303,111,238,125,331,125,331,111,238,144,-77,125,331,144,-77,130,331,130,331,144,-77,144,237,130,331,144,237,144,303,144,303,144,237,145,242,144,303,145,242,146,246,88,243,90,246,94,278,88,243,94,278,79,235,79,235,94,278,74,254,79,235,74,254,69,226,69,226,74,254,59,218,52,233,30,213,40,203,52,233,40,203,49,210,52,233,49,210,59,218,52,233,59,218,74,254,146,246,148,248,162,278,162,278,148,248,151,250,162,278,151,250,154,250,154,250,157,250,162,278,162,278,157,250,159,249,162,278,159,249,162,247,187,226,197,217,203,232,203,232,197,217,206,209,203,232,206,209,225,212,225,212,206,209,216,202,181,254,162,278,162,247,181,254,162,247,165,245,181,254,165,245,168,243,181,254,168,243,177,234,181,254,177,234,187,226,181,254,187,226,203,232,111,238,111,-77,144,-77,144,303,146,246,162,278,111,303,109,244,110,241,
-428,129,400,143,375,160,352,180,330,201,310,224,300,214,314,194,323,185,332,175,340,166,343,164,345,161,347,159,347,157,348,154,347,151,341,145,338,144,334,143,35,143,35,110,334,110,339,109,343,108,345,106,347,103,347,97,346,95,340,86,331,77,322,67,314,58,306,48,299,38,309,28,330,51,351,72,375,92,400,110,428,124,216,50,206,43,186,27,168,9,165,7,163,5,160,3,158,3,156,2,153,3,147,9,145,12,145,331,112,331,112,16,111,11,110,8,105,3,99,3,96,4,90,8,88,10,78,19,69,28,49,44,40,51,30,41,53,20,74,-1,94,-24,111,-49,126,-77,131,-77,145,-49,162,-24,182,-1,203,20,225,41,444,129,417,143,391,160,
+428,129,400,143,375,160,352,180,330,201,310,224,300,214,314,194,323,185,332,175,340,166,343,164,345,161,347,159,347,157,348,154,347,151,341,145,338,144,334,143,35,143,35,110,334,110,339,109,343,108,345,106,347,103,347,97,346,95,340,86,331,77,322,67,314,58,306,48,299,38,309,28,330,51,351,72,375,92,400,110,428,124,
 347,97,351,72,347,100,347,100,351,72,348,154,348,154,351,72,352,180,352,180,351,72,375,92,352,180,375,92,375,160,375,160,375,92,400,110,375,160,400,110,400,143,400,143,400,110,428,124,400,143,428,124,428,129,352,180,330,201,332,175,352,180,332,175,340,166,352,180,340,166,343,164,352,180,343,164,345,161,352,180,345,161,347,159,352,180,347,159,347,157,352,180,347,157,348,154,300,214,307,204,310,224,310,224,307,204,314,194,310,224,314,194,330,201,330,201,314,194,323,185,330,201,323,185,332,175,35,143,334,110,334,143,338,144,334,143,339,109,338,144,339,109,341,145,341,145,339,109,343,108,341,145,343,108,344,148,344,148,343,108,345,106,344,148,345,106,347,151,347,151,345,106,347,103,347,151,347,103,347,100,322,67,330,51,331,77,331,77,330,51,351,72,331,77,351,72,340,86,340,86,351,72,342,89,351,72,347,97,346,95,351,72,346,95,344,92,351,72,344,92,342,89,314,58,306,48,309,28,314,58,309,28,330,51,314,58,330,51,322,67,348,154,347,151,347,100,334,110,35,143,35,110,334,143,334,110,339,109,309,28,306,48,299,38,
-216,50,206,43,186,27,168,9,165,7,163,5,160,3,158,3,156,2,153,3,147,9,145,12,145,331,112,331,112,16,111,11,110,8,105,3,99,3,96,4,90,8,88,10,78,19,69,28,49,44,40,51,30,41,53,20,74,-1,94,-24,111,-49,126,-77,131,-77,145,-49,162,-24,182,-1,203,20,225,41,444,129,417,143,391,160,368,180,346,201,325,224,315,214,322,204,330,194,339,185,348,175,359,164,361,161,363,157,363,154,362,151,360,148,357,145,354,144,350,143,108,143,104,145,102,147,100,150,100,155,101,158,107,167,116,176,125,186,133,195,141,205,148,215,138,224,96,180,72,160,47,143,19,129,19,124,
+216,50,206,43,186,27,168,9,165,7,163,5,160,3,158,3,156,2,153,3,147,9,145,12,145,331,112,331,112,16,111,11,110,8,105,3,99,3,96,4,90,8,88,10,78,19,69,28,49,44,40,51,30,41,53,20,74,-1,94,-24,111,-49,126,-77,131,-77,145,-49,162,-24,182,-1,203,20,225,41,
 110,8,107,5,111,-49,111,-49,107,5,105,3,111,-49,105,3,102,3,102,3,99,3,111,-49,111,-49,99,3,96,4,111,-49,96,4,94,-24,94,-24,96,4,93,6,94,-24,93,6,90,8,150,6,147,9,162,-24,162,-24,147,9,145,12,162,-24,145,12,145,-49,145,-49,145,12,145,16,145,16,145,331,131,-77,131,-77,145,331,126,-77,145,331,112,331,126,-77,126,-77,112,331,112,16,126,-77,112,16,111,-49,111,-49,112,16,111,11,111,-49,111,11,110,8,163,5,160,3,162,-24,162,-24,160,3,158,3,162,-24,158,3,156,2,156,2,153,3,162,-24,162,-24,153,3,150,6,186,27,177,18,182,-1,182,-1,177,18,168,9,182,-1,168,9,165,7,206,43,196,35,203,20,206,43,203,20,225,41,206,43,225,41,216,50,186,27,182,-1,203,20,186,27,203,20,196,35,163,5,162,-24,182,-1,163,5,182,-1,165,7,90,8,88,10,94,-24,94,-24,88,10,78,19,94,-24,78,19,74,-1,74,-1,78,19,69,28,74,-1,69,28,59,36,53,20,74,-1,59,36,53,20,59,36,49,44,53,20,49,44,40,51,53,20,40,51,30,41,145,-49,145,16,131,-77,
-444,129,417,143,391,160,368,180,346,201,325,224,315,214,322,204,330,194,339,185,348,175,359,164,361,161,363,157,363,154,362,151,360,148,357,145,354,144,350,143,108,143,104,145,102,147,100,150,100,155,101,158,107,167,116,176,125,186,133,195,141,205,148,215,138,224,96,180,72,160,47,143,19,129,19,124,47,110,72,93,95,73,117,51,137,29,147,39,133,59,124,68,115,78,104,89,102,92,100,94,100,96,99,99,100,102,103,105,109,109,113,110,350,110,355,109,358,108,361,106,363,100,362,97,362,95,356,86,347,77,338,67,330,58,322,48,315,38,325,28,345,51,367,72,391,92,417,110,444,124,225,246,203,266,182,288,162,312,145,337,131,365,126,365,112,337,94,312,74,288,53,267,31,247,40,237,50,244,70,260,79,269,88,277,93,282,96,283,100,285,104,284,107,281,111,275,112,272,112,-16,111,-21,110,-25,107,-28,105,-29,102,-30,93,-27,90,-25,88,-22,78,-13,69,-5,59,2,49,10,40,17,30,7,53,-12,74,-34,94,-58,111,-83,126,-111,131,-111,145,-83,162,-58,181,-34,203,-12,225,7,215,17,206,10,196,2,186,-5,163,-28,160,-29,158,-30,156,-30,153,-29,150,-27,147,-24,145,-20,145,276,147,280,149,282,152,284,157,284,160,283,169,277,178,268,187,260,197,251,206,243,216,236,428,-54,
+444,129,417,143,391,160,368,180,346,201,325,224,315,214,322,204,330,194,339,185,348,175,359,164,361,161,363,157,363,154,362,151,360,148,357,145,354,144,350,143,108,143,104,145,102,147,100,150,100,155,101,158,107,167,116,176,125,186,133,195,141,205,148,215,138,224,96,180,72,160,47,143,19,129,19,124,47,110,72,93,95,73,117,51,137,29,147,39,133,59,124,68,115,78,104,89,102,92,100,94,100,96,99,99,100,102,103,105,109,109,113,110,350,110,355,109,358,108,361,106,363,100,362,97,362,95,356,86,347,77,338,67,330,58,322,48,315,38,325,28,345,51,367,72,391,92,417,110,444,124,
 104,145,102,147,103,105,103,105,102,147,100,150,103,105,100,150,100,102,100,102,100,150,100,153,99,99,96,180,95,73,95,73,96,180,72,160,95,73,72,160,72,93,72,93,72,160,47,143,72,93,47,143,47,110,47,110,47,143,19,129,47,110,19,129,19,124,138,224,117,202,125,186,138,224,125,186,133,195,138,224,133,195,141,205,138,224,141,205,148,215,117,202,96,180,101,158,117,202,101,158,103,161,117,202,103,161,105,164,117,202,105,164,107,167,117,202,107,167,116,176,117,202,116,176,125,186,100,155,101,158,96,180,100,155,96,180,100,153,124,68,115,78,117,51,117,51,115,78,107,86,117,51,107,86,104,89,137,29,147,39,140,49,137,29,140,49,133,59,137,29,133,59,124,68,137,29,124,68,117,51,363,100,367,72,363,154,363,154,367,72,368,180,368,180,367,72,391,92,368,180,391,92,391,160,391,160,391,92,417,110,391,160,417,110,417,143,417,143,417,110,444,124,417,143,444,124,444,129,368,180,346,201,348,175,368,180,348,175,357,166,368,180,357,166,359,164,368,180,359,164,361,161,368,180,361,161,362,159,368,180,362,159,363,157,368,180,363,157,363,154,315,214,322,204,325,224,325,224,322,204,330,194,325,224,330,194,346,201,346,201,330,194,339,185,346,201,339,185,348,175,350,110,355,109,350,143,354,144,350,143,355,109,354,144,355,109,357,145,357,145,355,109,358,108,357,145,358,108,360,148,360,148,358,108,361,106,360,148,361,106,362,151,362,151,361,106,362,103,362,151,362,103,363,100,338,67,345,51,347,77,347,77,345,51,367,72,347,77,367,72,356,86,356,86,367,72,358,89,362,97,362,95,367,72,362,97,367,72,363,100,360,92,358,89,367,72,360,92,367,72,362,95,330,58,322,48,325,28,330,58,325,28,345,51,330,58,345,51,338,67,363,154,362,151,363,100,350,110,350,143,113,110,113,110,350,143,113,143,113,110,113,143,109,109,108,143,104,145,106,107,108,143,106,107,109,109,108,143,109,109,113,143,100,96,99,99,95,73,100,96,95,73,100,94,100,94,95,73,117,51,100,94,117,51,102,92,102,92,117,51,104,89,100,102,100,153,99,99,104,145,103,105,106,107,325,28,322,48,315,38,100,153,96,180,99,99,
-225,246,203,266,182,288,162,312,145,337,131,365,126,365,112,337,94,312,74,288,53,267,31,247,40,237,50,244,70,260,79,269,88,277,93,282,96,283,100,285,104,284,107,281,111,275,112,272,112,-16,111,-21,110,-25,107,-28,105,-29,102,-30,93,-27,90,-25,88,-22,78,-13,69,-5,59,2,49,10,40,17,30,7,53,-12,74,-34,94,-58,111,-83,126,-111,131,-111,145,-83,162,-58,181,-34,203,-12,225,7,215,17,206,10,196,2,186,-5,163,-28,160,-29,158,-30,156,-30,153,-29,150,-27,147,-24,145,-20,145,276,147,280,149,282,152,284,157,284,160,283,169,277,178,268,187,260,197,251,206,243,216,236,428,-54,118,271,115,274,111,280,110,282,110,285,111,287,111,288,112,290,113,291,115,292,117,294,121,295,124,296,153,296,166,297,178,298,190,300,190,315,182,314,173,313,125,313,103,315,81,318,60,324,39,331,35,328,43,306,48,285,51,263,53,241,54,219,53,210,53,193,52,184,51,176,65,176,68,188,70,214,70,243,72,249,73,251,76,254,77,254,78,255,83,255,85,254,88,254,92,252,404,-77,425,331,403,324,382,318,360,315,338,313,289,313,281,314,272,315,272,300,284,298,297,297,309,296,339,296,342,295,346,294,348,292,350,291,351,290,352,288,353,287,353,282,352,280,348,274,345,271,
+225,246,203,266,182,288,162,312,145,337,131,365,126,365,112,337,94,312,74,288,53,267,31,247,40,237,50,244,70,260,79,269,88,277,93,282,96,283,100,285,104,284,107,281,111,275,112,272,112,-16,111,-21,110,-25,107,-28,105,-29,102,-30,93,-27,90,-25,88,-22,78,-13,69,-5,59,2,49,10,40,17,30,7,53,-12,74,-34,94,-58,111,-83,126,-111,131,-111,145,-83,162,-58,181,-34,203,-12,225,7,215,17,206,10,196,2,186,-5,163,-28,160,-29,158,-30,156,-30,153,-29,150,-27,147,-24,145,-20,145,276,147,280,149,282,152,284,157,284,160,283,169,277,178,268,187,260,197,251,206,243,216,236,
 69,-5,74,-34,78,-13,78,-13,74,-34,94,-58,78,-13,94,-58,88,-22,88,-22,94,-58,90,-25,91,280,93,282,94,312,94,312,93,282,96,283,94,312,96,283,112,337,112,337,96,283,98,284,112,337,98,284,100,285,100,285,104,284,112,337,112,337,104,284,107,281,112,337,107,281,109,278,110,-25,107,-28,111,-83,111,-83,107,-28,105,-29,111,-83,105,-29,102,-30,102,-30,99,-29,111,-83,111,-83,99,-29,96,-28,111,-83,96,-28,94,-58,94,-58,96,-28,93,-27,94,-58,93,-27,90,-25,109,278,111,275,112,337,112,337,111,275,112,272,112,272,126,-111,126,365,126,365,126,-111,131,-111,126,365,131,-111,131,365,131,365,131,-111,145,-83,131,365,145,-83,145,271,145,271,145,-83,145,-17,88,277,91,280,94,312,88,277,94,312,79,269,79,269,94,312,74,288,79,269,74,288,70,260,70,260,74,288,60,252,53,267,31,247,40,237,53,267,40,237,50,244,53,267,50,244,60,252,53,267,60,252,74,288,147,280,149,282,162,312,162,312,149,282,152,284,162,312,152,284,155,284,155,284,157,284,162,312,162,312,157,284,160,283,162,312,160,283,163,281,187,260,197,251,203,266,203,266,197,251,206,243,203,266,206,243,225,246,225,246,206,243,216,236,182,288,162,312,163,281,182,288,163,281,166,279,182,288,166,279,169,277,182,288,169,277,178,268,182,288,178,268,187,260,182,288,187,260,203,266,145,337,131,365,145,271,145,337,145,271,145,276,145,337,145,276,147,280,145,337,147,280,162,312,163,-28,160,-29,162,-58,162,-58,160,-29,158,-30,162,-58,158,-30,156,-30,156,-30,153,-29,162,-58,162,-58,153,-29,150,-27,162,-58,150,-27,147,-24,186,-5,177,-14,181,-34,181,-34,177,-14,168,-23,181,-34,168,-23,165,-26,206,10,196,2,203,-12,206,10,203,-12,225,7,206,10,225,7,215,17,186,-5,181,-34,203,-12,186,-5,203,-12,196,2,163,-28,162,-58,181,-34,163,-28,181,-34,165,-26,145,-20,145,-17,145,-83,145,-20,145,-83,162,-58,145,-20,162,-58,147,-24,112,-16,111,-21,111,-83,112,-16,111,-83,126,-111,112,-16,126,-111,112,272,59,2,49,10,53,-12,59,2,53,-12,74,-34,59,2,74,-34,69,-5,40,17,30,7,53,-12,40,17,53,-12,49,10,110,-25,111,-83,111,-21,112,337,112,272,126,365,
-428,-54,118,271,115,274,111,280,110,282,110,285,111,287,111,288,112,290,113,291,115,292,117,294,121,295,124,296,153,296,166,297,178,298,190,300,190,315,182,314,173,313,125,313,103,315,81,318,60,324,39,331,35,328,43,306,48,285,51,263,53,241,54,219,53,210,53,193,52,184,51,176,65,176,68,188,70,214,70,243,72,249,73,251,76,254,77,254,78,255,83,255,85,254,88,254,92,252,404,-77,425,331,403,324,382,318,360,315,338,313,289,313,281,314,272,315,272,300,284,298,297,297,309,296,339,296,342,295,346,294,348,292,350,291,351,290,352,288,353,287,353,282,352,280,348,274,345,271,35,-54,59,-77,372,252,373,253,375,254,377,254,380,255,385,255,387,254,388,254,388,253,390,251,391,249,392,246,392,226,393,214,395,188,397,176,411,176,411,185,410,193,410,241,412,263,415,285,421,307,428,328,
+428,-54,118,271,115,274,111,280,110,282,110,285,111,287,111,288,112,290,113,291,115,292,117,294,121,295,124,296,153,296,166,297,178,298,190,300,190,315,182,314,173,313,125,313,103,315,81,318,60,324,39,331,35,328,43,306,48,285,51,263,53,241,54,219,53,210,53,193,52,184,51,176,65,176,68,188,70,214,70,243,72,249,73,251,76,254,77,254,78,255,83,255,85,254,88,254,92,252,404,-77,
 48,285,51,263,60,324,60,324,51,263,53,241,60,324,53,241,54,219,54,219,53,210,65,176,65,176,53,210,53,201,65,176,53,201,53,193,60,324,39,331,43,306,60,324,43,306,48,285,77,254,78,255,81,318,81,318,78,255,79,255,81,318,79,255,80,255,80,255,83,255,81,318,81,318,83,255,103,315,81,318,60,324,71,246,81,318,71,246,72,249,81,318,72,249,73,251,81,318,73,251,75,253,81,318,75,253,76,254,81,318,76,254,77,254,65,176,68,188,70,243,70,243,68,188,69,201,70,243,69,201,70,239,70,239,69,201,70,214,70,239,70,214,70,226,60,324,54,219,65,176,60,324,65,176,70,243,60,324,70,243,71,246,52,184,51,176,65,176,52,184,65,176,53,193,103,315,92,252,110,282,103,315,110,282,110,284,110,284,110,285,103,315,103,315,110,285,111,287,103,315,111,287,111,288,103,315,83,255,85,254,103,315,85,254,88,254,103,315,88,254,90,253,103,315,90,253,92,252,103,315,111,288,125,313,125,313,111,288,112,290,125,313,112,290,113,291,113,291,115,292,125,313,125,313,115,292,117,294,125,313,117,294,121,295,147,313,127,296,140,296,147,313,140,296,153,296,147,313,147,312,125,313,147,313,125,313,127,296,165,313,166,297,173,313,173,313,166,297,178,298,173,313,178,298,182,314,182,314,178,298,190,300,182,314,190,300,190,315,156,313,147,312,147,313,156,313,147,313,153,296,156,313,153,296,166,297,156,313,166,297,165,313,124,296,127,296,125,313,124,296,125,313,121,295,428,-54,118,271,404,-77,404,-77,118,271,115,274,404,-77,115,274,92,252,92,252,115,274,113,277,92,252,113,277,111,280,43,306,39,331,35,328,92,252,111,280,110,282,
-425,331,403,324,382,318,360,315,338,313,289,313,281,314,272,315,272,300,284,298,297,297,309,296,339,296,342,295,346,294,348,292,350,291,351,290,352,288,353,287,353,282,352,280,348,274,345,271,35,-54,59,-77,372,252,373,253,375,254,377,254,380,255,385,255,387,254,388,254,388,253,390,251,391,249,392,246,392,226,393,214,395,188,397,176,411,176,411,185,410,193,410,241,412,263,415,285,421,307,428,328,428,-74,421,-53,415,-31,412,-9,410,12,410,60,411,68,411,76,397,77,395,65,392,26,392,7,391,4,390,2,387,-1,380,-1,377,0,373,0,372,2,59,331,35,307,345,-17,348,-20,352,-26,353,-28,353,-33,352,-34,351,-36,350,-36,346,-40,342,-41,335,-41,322,-42,309,-42,297,-43,284,-45,272,-46,272,-60,281,-60,289,-59,338,-59,360,-61,382,-65,403,-70,425,-77,428,307,404,331,92,2,90,0,88,0,
+425,331,403,324,382,318,360,315,338,313,289,313,281,314,272,315,272,300,284,298,297,297,309,296,339,296,342,295,346,294,348,292,350,291,351,290,352,288,353,287,353,282,352,280,348,274,345,271,35,-54,59,-77,372,252,373,253,375,254,377,254,380,255,385,255,387,254,388,254,388,253,390,251,391,249,392,246,392,226,393,214,395,188,397,176,411,176,411,185,410,193,410,241,412,263,415,285,421,307,428,328,
 272,315,272,315,281,314,281,314,272,315,284,298,281,314,284,298,289,313,289,313,284,298,297,297,289,313,297,297,298,313,298,313,297,297,309,296,298,313,309,296,307,313,307,313,309,296,315,313,338,313,315,313,322,296,338,313,322,296,335,296,375,254,377,254,382,318,382,318,377,254,380,255,382,318,380,255,382,255,382,255,384,255,403,324,403,324,384,255,385,255,403,324,385,255,387,254,353,285,353,284,360,315,360,315,353,284,372,252,360,315,372,252,382,318,382,318,372,252,373,253,382,318,373,253,375,254,372,252,353,284,353,282,372,252,353,282,352,280,372,252,352,280,350,277,372,252,350,277,348,274,372,252,348,274,345,271,372,252,345,271,59,-77,410,193,410,201,403,324,403,324,410,201,410,210,403,324,410,210,410,219,410,219,410,241,403,324,403,324,410,241,412,263,403,324,412,263,415,285,403,324,415,285,425,331,425,331,415,285,421,307,425,331,421,307,428,328,395,188,397,176,403,324,403,324,397,176,411,176,403,324,411,176,410,193,410,193,411,176,411,185,403,324,387,254,388,254,403,324,388,254,388,253,403,324,388,253,390,251,403,324,390,251,391,249,403,324,391,249,392,246,403,324,392,246,392,243,403,324,392,243,392,239,403,324,392,239,392,226,403,324,392,226,393,214,403,324,393,214,394,201,403,324,394,201,395,188,403,324,382,318,382,255,360,315,338,313,339,296,360,315,339,296,342,295,360,315,342,295,346,294,360,315,346,294,348,292,360,315,348,292,350,291,360,315,350,291,351,290,360,315,351,290,352,288,360,315,352,288,353,287,360,315,353,287,353,285,335,296,339,296,338,313,315,313,309,296,322,296,59,-77,345,271,35,-54,284,298,272,315,272,300,
-428,-74,421,-53,415,-31,412,-9,410,12,410,60,411,68,411,76,397,77,395,65,392,26,392,7,391,4,390,2,387,-1,380,-1,377,0,373,0,372,2,59,331,35,307,345,-17,348,-20,352,-26,353,-28,353,-33,352,-34,351,-36,350,-36,346,-40,342,-41,335,-41,322,-42,309,-42,297,-43,284,-45,272,-46,272,-60,281,-60,289,-59,338,-59,360,-61,382,-65,403,-70,425,-77,428,307,404,331,92,2,90,0,88,0,85,-1,77,-1,76,0,75,0,73,2,72,4,70,10,70,39,68,65,65,77,51,76,53,60,53,43,54,35,53,12,51,-9,48,-31,43,-53,35,-74,39,-77,60,-70,81,-65,103,-61,125,-59,173,-59,182,-60,190,-60,190,-46,178,-45,166,-43,153,-42,140,-42,127,-41,121,-41,117,-40,113,-36,112,-36,111,-34,111,-33,110,-32,
+428,-74,421,-53,415,-31,412,-9,410,12,410,60,411,68,411,76,397,77,395,65,392,26,392,7,391,4,390,2,387,-1,380,-1,377,0,373,0,372,2,59,331,35,307,345,-17,348,-20,352,-26,353,-28,353,-33,352,-34,351,-36,350,-36,346,-40,342,-41,335,-41,322,-42,309,-42,297,-43,284,-45,272,-46,272,-60,281,-60,289,-59,338,-59,360,-61,382,-65,403,-70,425,-77,
 335,-41,322,-42,338,-59,338,-59,322,-42,315,-59,307,-59,315,-59,309,-42,307,-59,309,-42,298,-59,298,-59,309,-42,297,-43,298,-59,297,-43,289,-59,289,-59,297,-43,284,-45,289,-59,284,-45,281,-60,281,-60,284,-45,272,-46,281,-60,272,-46,272,-60,322,-42,309,-42,315,-59,353,-33,352,-34,360,-61,360,-61,352,-34,351,-36,360,-61,351,-36,350,-36,372,2,59,331,345,-17,372,2,345,-17,348,-20,372,2,348,-20,350,-23,372,2,350,-23,352,-26,372,2,352,-26,353,-28,372,2,353,-28,353,-30,372,2,353,-30,360,-61,372,2,360,-61,382,-65,372,2,382,-65,373,0,387,-1,385,-1,403,-70,403,-70,385,-1,384,-1,403,-70,384,-1,382,-1,382,-1,380,-1,382,-65,382,-65,380,-1,377,0,382,-65,377,0,375,0,360,-61,353,-30,353,-32,360,-61,353,-32,353,-33,393,39,392,26,403,-70,403,-70,392,26,392,14,403,-70,392,14,392,10,415,-31,412,-9,403,-70,403,-70,412,-9,410,12,403,-70,410,12,410,35,410,35,410,43,403,-70,403,-70,410,43,410,52,403,-70,410,52,410,60,411,76,397,77,403,-70,411,76,403,-70,410,60,411,76,410,60,411,68,403,-70,397,77,395,65,403,-70,395,65,394,52,403,-70,394,52,393,39,403,-70,392,10,392,7,403,-70,392,7,391,4,403,-70,391,4,390,2,403,-70,390,2,388,0,403,-70,388,0,387,-1,382,-1,382,-65,403,-70,425,-77,428,-74,421,-53,425,-77,421,-53,415,-31,425,-77,415,-31,403,-70,360,-61,350,-36,348,-38,360,-61,348,-38,346,-40,360,-61,346,-40,342,-41,360,-61,342,-41,339,-41,360,-61,339,-41,338,-59,339,-41,335,-41,338,-59,345,-17,59,331,35,307,373,0,382,-65,375,0,
-428,307,404,331,92,2,90,0,88,0,85,-1,77,-1,76,0,75,0,73,2,72,4,70,10,70,39,68,65,65,77,51,76,53,60,53,43,54,35,53,12,51,-9,48,-31,43,-53,35,-74,39,-77,60,-70,81,-65,103,-61,125,-59,173,-59,182,-60,190,-60,190,-46,178,-45,166,-43,153,-42,140,-42,127,-41,121,-41,117,-40,113,-36,112,-36,111,-34,111,-33,110,-32,110,-28,111,-26,115,-20,118,-17,433,110,433,143,300,143,349,225,320,225,272,143,119,143,113,147,111,153,111,155,113,161,115,164,127,176,135,186,144,196,152,206,159,215,149,225,129,202,107,181,83,161,58,143,30,129,30,124,58,110,83,93,107,73,128,51,148,29,158,39,151,49,143,59,135,68,126,78,115,89,113,92,111,96,110,99,111,102,114,105,120,109,123,110,252,110,204,29,233,29,281,110,433,129,405,143,380,161,
+428,307,404,331,92,2,90,0,88,0,85,-1,77,-1,76,0,75,0,73,2,72,4,70,10,70,39,68,65,65,77,51,76,53,60,53,43,54,35,53,12,51,-9,48,-31,43,-53,35,-74,39,-77,60,-70,81,-65,103,-61,125,-59,173,-59,182,-60,190,-60,190,-46,178,-45,166,-43,153,-42,140,-42,127,-41,121,-41,117,-40,113,-36,112,-36,111,-34,111,-33,110,-32,110,-28,111,-26,115,-20,118,-17,
 78,-1,81,-65,79,-1,79,-1,81,-65,80,-1,83,-1,80,-1,81,-65,83,-1,81,-65,103,-61,111,-34,111,-33,103,-61,103,-61,111,-33,110,-32,103,-61,110,-32,110,-30,110,-30,110,-28,103,-61,103,-61,110,-28,92,2,103,-61,92,2,90,0,115,-20,118,-17,404,331,115,-20,404,331,92,2,404,331,118,-17,428,307,92,2,110,-28,111,-26,92,2,111,-26,113,-23,92,2,113,-23,115,-20,103,-61,90,0,88,0,103,-61,88,0,85,-1,103,-61,85,-1,83,-1,147,-59,140,-42,127,-41,147,-59,127,-41,125,-59,147,-59,153,-42,140,-42,156,-59,165,-59,166,-43,166,-43,165,-59,173,-59,166,-43,173,-59,178,-45,178,-45,173,-59,182,-60,178,-45,182,-60,190,-46,190,-46,182,-60,190,-60,156,-59,166,-43,153,-42,156,-59,153,-42,147,-59,121,-41,117,-40,125,-59,125,-59,117,-40,115,-38,125,-59,115,-38,113,-36,124,-41,121,-41,125,-59,124,-41,125,-59,127,-41,125,-59,113,-36,112,-36,125,-59,112,-36,111,-34,125,-59,111,-34,103,-61,81,-65,78,-1,77,-1,81,-65,77,-1,76,0,81,-65,76,0,75,0,81,-65,75,0,73,2,81,-65,73,2,72,4,81,-65,72,4,71,7,81,-65,71,7,60,-70,70,10,70,14,69,52,70,10,69,52,68,65,70,10,68,65,65,77,70,10,65,77,60,-70,70,10,60,-70,71,7,70,39,69,52,70,14,70,39,70,14,70,26,60,-70,65,77,54,35,60,-70,54,35,53,12,60,-70,53,12,51,-9,60,-70,51,-9,48,-31,60,-70,48,-31,43,-53,60,-70,43,-53,39,-77,53,60,53,51,65,77,65,77,53,51,53,43,65,77,53,43,54,35,65,77,51,76,52,68,65,77,52,68,53,60,43,-53,35,-74,39,-77,
-279,331,243,331,206,232,74,232,36,331,1,331,123,0,156,0,16383,16383,195,201,140,51,84,201,202,110,169,110,169,65,165,48,155,37,141,30,128,27,117,26,107,26,92,29,78,36,67,47,
+279,331,243,331,206,232,74,232,36,331,1,331,123,0,156,0,16383,16383,195,201,140,51,84,201,
 156,0,279,331,195,201,195,201,279,331,206,232,195,201,206,232,84,201,84,201,206,232,74,232,84,201,74,232,123,0,123,0,74,232,36,331,123,0,36,331,1,331,140,51,84,201,123,0,140,51,123,0,156,0,140,51,156,0,195,201,206,232,279,331,243,331,
-202,110,169,110,169,65,165,48,155,37,141,30,128,27,117,26,107,26,92,29,78,36,67,47,63,65,63,308,67,326,78,337,92,344,105,346,116,347,126,347,140,344,154,338,165,326,169,307,169,262,202,262,202,305,196,339,180,360,158,373,136,379,117,380,97,379,74,373,52,361,36,339,30,306,30,65,36,32,51,11,72,0,94,-5,114,-6,134,-5,157,0,179,10,196,30,202,61,98,313,112,317,119,318,127,319,134,319,161,314,179,300,191,279,198,255,200,228,200,221,199,214,199,207,198,200,196,194,189,203,180,210,169,214,159,217,148,218,107,210,72,188,44,156,26,117,20,75,22,51,30,29,43,11,62,0,88,-5,148,9,190,47,217,98,231,154,235,204,232,250,220,287,202,313,175,329,142,334,131,334,121,333,101,327,93,323,16383,16383,184,160,182,140,180,131,
+202,110,169,110,169,65,165,48,155,37,141,30,128,27,117,26,107,26,92,29,78,36,67,47,63,65,63,308,67,326,78,337,92,344,105,346,116,347,126,347,140,344,154,338,165,326,169,307,169,262,202,262,202,305,196,339,180,360,158,373,136,379,117,380,97,379,74,373,52,361,36,339,30,306,30,65,36,32,51,11,72,0,94,-5,114,-6,134,-5,157,0,179,10,196,30,202,61,
 105,346,116,347,116,347,117,380,116,347,126,347,117,380,126,347,136,379,136,379,126,347,140,344,136,379,140,344,158,373,158,373,140,344,154,338,158,373,154,338,165,326,202,305,196,339,202,262,202,262,196,339,180,360,202,262,180,360,169,307,169,307,180,360,165,326,78,337,92,344,97,379,97,379,92,344,105,346,97,379,105,346,117,380,117,380,105,346,116,347,74,373,52,361,63,308,74,373,63,308,67,326,74,373,67,326,78,337,74,373,78,337,97,379,30,306,30,65,36,32,30,306,36,32,36,339,36,339,36,32,51,11,36,339,51,11,52,361,52,361,51,11,63,65,52,361,63,65,63,308,165,48,155,37,157,0,157,0,155,37,141,30,157,0,141,30,134,-5,134,-5,141,30,128,27,134,-5,128,27,117,26,117,26,107,26,114,-6,114,-6,107,26,94,-5,107,26,92,29,94,-5,94,-5,92,29,78,36,94,-5,78,36,72,0,72,0,78,36,67,47,72,0,67,47,63,65,63,65,51,11,72,0,202,110,169,110,179,10,202,110,179,10,196,30,202,110,196,30,202,61,179,10,169,110,169,65,179,10,169,65,165,48,179,10,165,48,157,0,117,26,114,-6,134,-5,202,262,169,307,169,262,158,373,165,326,180,360,
-98,313,112,317,119,318,127,319,134,319,161,314,179,300,191,279,198,255,200,228,200,221,199,214,199,207,198,200,196,194,189,203,180,210,169,214,159,217,148,218,107,210,72,188,44,156,26,117,20,75,22,51,30,29,43,11,62,0,88,-5,148,9,190,47,217,98,231,154,235,204,232,250,220,287,202,313,175,329,142,334,131,334,121,333,101,327,93,323,16383,16383,184,160,182,140,180,131,178,121,176,110,166,80,152,53,135,30,116,15,94,9,78,13,68,21,63,33,61,46,60,59,65,100,79,139,99,172,124,194,153,203,161,201,169,197,177,189,182,176,184,160,243,0,243,331,36,331,36,298,210,298,210,182,42,182,42,149,210,149,210,33,36,33,36,0,243,0,243,331,199,331,219,387,190,387,170,331,36,331,36,298,159,298,119,182,42,182,42,149,108,149,68,33,36,33,36,0,56,0,36,-60,65,-60,85,0,16383,16383,210,182,148,182,188,298,210,298,16383,16383,210,33,97,33,137,149,210,149,353,291,318,291,289,258,272,270,253,279,233,285,212,290,190,291,138,283,93,259,57,223,34,178,25,126,27,100,33,75,43,51,56,30,72,11,28,-39,63,-39,92,-6,110,-17,129,-26,148,-33,169,-37,190,-39,242,-30,288,-6,
+98,313,112,317,119,318,127,319,134,319,161,314,179,300,191,279,198,255,200,228,200,221,199,214,199,207,198,200,196,194,189,203,180,210,169,214,159,217,148,218,107,210,72,188,44,156,26,117,20,75,22,51,30,29,43,11,62,0,88,-5,148,9,190,47,217,98,231,154,235,204,232,250,220,287,202,313,175,329,142,334,131,334,121,333,101,327,93,323,16383,16383,184,160,182,140,180,131,178,121,176,110,166,80,152,53,135,30,116,15,94,9,78,13,68,21,63,33,61,46,60,59,65,100,79,139,99,172,124,194,153,203,161,201,169,197,177,189,182,176,184,160,
 127,319,134,319,134,319,142,334,134,319,161,314,142,334,161,314,175,329,175,329,161,314,179,300,175,329,179,300,202,313,202,313,179,300,191,279,202,313,191,279,198,255,112,317,119,318,121,333,121,333,119,318,127,319,121,333,127,319,131,334,131,334,127,319,134,319,131,334,134,319,142,334,93,323,98,313,101,327,101,327,98,313,105,315,101,327,105,315,111,330,111,330,105,315,112,317,111,330,112,317,121,333,152,53,135,30,148,9,148,9,135,30,116,15,148,9,116,15,94,9,94,9,78,13,88,-5,88,-5,78,13,68,21,88,-5,68,21,62,0,62,0,68,21,63,33,62,0,63,33,61,46,61,46,60,59,62,0,62,0,60,59,44,156,44,156,60,59,72,188,72,188,60,59,65,100,20,75,22,51,26,117,26,117,22,51,30,29,26,117,30,29,44,156,44,156,30,29,43,11,44,156,43,11,62,0,159,217,153,203,161,201,159,217,161,201,169,214,169,214,161,201,169,197,169,214,169,197,180,210,180,210,169,197,177,189,180,210,177,189,182,176,79,139,99,172,107,210,107,210,99,172,124,194,107,210,124,194,148,218,148,218,124,194,153,203,148,218,153,203,159,217,72,188,65,100,79,139,72,188,79,139,107,210,182,140,180,131,190,47,190,47,180,131,178,121,190,47,178,121,176,110,176,110,166,80,190,47,190,47,166,80,152,53,190,47,152,53,148,9,198,200,196,194,217,98,217,98,196,194,190,47,190,47,196,194,189,203,190,47,189,203,184,160,184,160,189,203,182,176,190,47,184,160,183,150,190,47,183,150,182,140,94,9,88,-5,148,9,235,204,232,250,231,154,231,154,232,250,220,287,231,154,220,287,217,98,217,98,220,287,202,313,217,98,202,313,200,228,200,228,202,313,198,255,217,98,200,228,200,221,217,98,200,221,199,214,217,98,199,214,199,207,217,98,199,207,198,200,180,210,182,176,189,203,
-243,0,243,331,36,331,36,298,210,298,210,182,42,182,42,149,210,149,210,33,36,33,36,0,243,0,243,331,199,331,219,387,190,387,170,331,36,331,36,298,159,298,119,182,42,182,42,149,
+243,0,243,331,36,331,36,298,210,298,210,182,42,182,42,149,210,149,210,33,36,33,36,0,
 42,182,210,149,210,182,210,182,210,149,243,0,210,182,243,0,210,298,210,298,243,0,243,331,210,298,243,331,36,331,243,0,210,149,210,33,243,0,210,33,36,33,243,0,36,33,36,0,210,298,36,331,36,298,210,149,42,182,42,149,
-243,0,243,331,199,331,219,387,190,387,170,331,36,331,36,298,159,298,119,182,42,182,42,149,108,149,68,33,36,33,36,0,56,0,36,-60,65,-60,85,0,16383,16383,210,182,148,182,188,298,210,298,16383,16383,210,33,97,33,137,149,210,149,353,291,318,291,289,258,272,270,253,279,233,285,212,290,190,291,138,283,93,259,57,223,34,178,25,126,27,100,33,75,43,51,56,30,72,11,28,-39,63,-39,92,-6,110,-17,129,-26,148,-33,169,-37,190,-39,242,-30,288,-6,324,28,348,74,
+243,0,243,331,199,331,219,387,190,387,170,331,36,331,36,298,159,298,119,182,42,182,42,149,108,149,68,33,36,33,36,0,56,0,36,-60,65,-60,85,0,16383,16383,210,182,148,182,188,298,210,298,16383,16383,210,33,97,33,137,149,210,149,
 36,331,159,298,170,331,170,331,159,298,188,298,170,331,188,298,190,387,190,387,188,298,199,331,190,387,199,331,219,387,159,298,137,149,148,182,148,182,137,149,210,149,148,182,210,149,210,182,210,182,210,149,243,0,210,182,243,0,210,298,210,298,243,0,243,331,210,298,243,331,199,331,159,298,119,182,137,149,137,149,119,182,108,149,137,149,108,149,97,33,97,33,108,149,85,0,97,33,85,0,243,0,68,33,36,33,56,0,68,33,56,0,65,-60,68,33,65,-60,85,0,68,33,85,0,108,149,210,33,97,33,243,0,210,33,243,0,210,149,42,182,42,149,108,149,42,182,108,149,119,182,65,-60,56,0,36,-60,159,298,36,331,36,298,56,0,36,33,36,0,159,298,148,182,188,298,199,331,188,298,210,298,
-353,291,318,291,289,258,272,270,253,279,233,285,212,290,190,291,138,283,93,259,57,223,34,178,25,126,27,100,33,75,43,51,56,30,72,11,28,-39,63,-39,92,-6,110,-17,129,-26,148,-33,169,-37,190,-39,242,-30,288,-6,324,28,348,74,356,126,354,152,348,176,338,200,325,221,309,241,16383,16383,287,217,300,201,310,184,317,166,322,147,323,127,316,85,297,48,269,19,232,0,190,-6,174,-5,158,-2,142,2,127,9,113,18,16383,16383,94,36,81,51,71,68,64,86,60,106,58,127,65,168,84,205,112,233,148,252,190,258,208,257,225,254,241,248,256,241,267,233,333,0,185,337,175,337,31,0,16383,16383,272,21,63,21,167,267,334,331,31,331,180,-5,190,-5,16383,16383,302,310,197,64,93,310,313,-12,313,20,167,20,137,24,111,37,89,57,73,82,64,109,313,109,313,142,65,142,74,170,90,195,112,215,138,228,167,233,313,233,313,266,166,266,121,258,84,238,55,207,37,169,30,126,37,83,55,45,84,14,122,-5,167,-12,313,-12,313,20,154,20,148,22,142,23,136,25,179,109,313,109,313,142,195,142,239,233,313,233,313,266,256,266,289,331,257,331,225,266,166,266,121,258,84,238,55,207,37,169,30,126,33,97,42,70,
+353,291,318,291,289,258,272,270,253,279,233,285,212,290,190,291,138,283,93,259,57,223,34,178,25,126,27,100,33,75,43,51,56,30,72,11,28,-39,63,-39,92,-6,110,-17,129,-26,148,-33,169,-37,190,-39,242,-30,288,-6,324,28,348,74,356,126,354,152,348,176,338,200,325,221,309,241,16383,16383,287,217,300,201,310,184,317,166,322,147,323,127,316,85,297,48,269,19,232,0,190,-6,174,-5,158,-2,142,2,127,9,113,18,16383,16383,94,36,81,51,71,68,64,86,60,106,58,127,65,168,84,205,112,233,148,252,190,258,208,257,225,254,241,248,256,241,267,233,
 323,127,316,85,324,28,324,28,316,85,297,48,324,28,297,48,288,-6,288,-6,297,48,269,19,288,-6,269,19,242,-30,242,-30,269,19,232,0,242,-30,232,0,190,-39,190,-39,232,0,190,-6,127,9,129,-26,142,2,142,2,129,-26,148,-33,142,2,148,-33,158,-2,158,-2,148,-33,169,-37,158,-2,169,-37,174,-5,174,-5,169,-37,190,-39,174,-5,190,-39,190,-6,127,9,113,18,129,-26,267,233,113,18,287,217,267,233,287,217,272,270,129,-26,113,18,110,-17,110,-17,113,18,94,36,110,-17,94,36,92,-6,92,-6,94,36,81,51,92,-6,81,51,72,11,72,11,81,51,71,68,72,11,71,68,64,86,58,127,65,168,57,223,58,127,57,223,56,30,58,127,56,30,60,106,60,106,56,30,72,11,60,106,72,11,64,86,27,100,33,75,34,178,34,178,33,75,43,51,34,178,43,51,57,223,57,223,43,51,56,30,267,233,272,270,256,241,256,241,272,270,253,279,256,241,253,279,241,248,241,248,253,279,233,285,241,248,233,285,225,254,225,254,233,285,212,290,225,254,212,290,208,257,208,257,212,290,190,258,148,252,190,258,190,291,148,252,190,291,138,283,65,168,84,205,93,259,93,259,84,205,112,233,93,259,112,233,138,283,138,283,112,233,148,252,212,290,190,291,190,258,318,291,289,258,300,201,318,291,300,201,309,241,318,291,309,241,353,291,289,258,272,270,287,217,289,258,287,217,300,201,63,-39,92,-6,72,11,63,-39,72,11,28,-39,348,176,338,200,348,74,348,176,348,74,356,126,348,176,356,126,354,152,325,221,309,241,310,184,325,221,310,184,317,166,325,221,317,166,322,147,325,221,322,147,323,127,325,221,323,127,324,28,325,221,324,28,348,74,325,221,348,74,338,200,310,184,309,241,300,201,94,36,113,18,267,233,57,223,65,168,93,259,27,100,34,178,25,126,
-333,0,185,337,175,337,31,0,16383,16383,272,21,63,21,167,267,334,331,31,331,180,-5,190,-5,16383,16383,302,310,197,64,93,310,
+333,0,185,337,175,337,31,0,16383,16383,272,21,63,21,167,267,
 175,337,31,0,63,21,63,21,31,0,333,0,63,21,333,0,272,21,272,21,333,0,185,337,272,21,185,337,175,337,175,337,63,21,167,267,175,337,167,267,272,21,
-334,331,31,331,180,-5,190,-5,16383,16383,302,310,197,64,93,310,313,-12,313,20,167,20,137,24,111,37,89,57,73,82,64,109,
+334,331,31,331,180,-5,190,-5,16383,16383,302,310,197,64,93,310,
 334,331,31,331,93,310,334,331,93,310,302,310,334,331,302,310,197,64,334,331,197,64,190,-5,180,-5,190,-5,197,64,180,-5,197,64,93,310,180,-5,93,310,31,331,
-313,-12,313,20,167,20,137,24,111,37,89,57,73,82,64,109,313,109,313,142,65,142,74,170,90,195,112,215,138,228,167,233,313,233,313,266,166,266,121,258,84,238,55,207,37,169,30,126,37,83,55,45,84,14,122,-5,167,-12,313,-12,313,20,154,20,148,22,142,23,136,25,179,109,313,109,313,142,195,142,239,233,313,233,313,266,256,266,289,331,257,331,225,266,166,266,121,258,84,238,55,207,37,169,30,126,33,97,42,70,55,45,73,24,96,7,54,-78,
+313,-12,313,20,167,20,137,24,111,37,89,57,73,82,64,109,313,109,313,142,65,142,74,170,90,195,112,215,138,228,167,233,313,233,313,266,166,266,121,258,84,238,55,207,37,169,30,126,37,83,55,45,84,14,122,-5,167,-12,
 55,45,84,14,64,109,64,109,65,142,55,45,55,45,65,142,55,207,55,45,55,207,37,83,37,83,55,207,37,169,37,83,37,169,30,126,65,142,64,109,313,109,65,142,313,109,313,142,90,195,112,215,121,258,121,258,112,215,138,228,121,258,138,228,166,266,166,266,138,228,167,233,166,266,167,233,313,266,313,266,167,233,313,233,84,238,55,207,65,142,84,238,65,142,74,170,84,238,74,170,90,195,84,238,90,195,121,258,167,-12,313,-12,313,20,167,-12,313,20,167,20,167,-12,167,20,137,24,167,-12,137,24,122,-5,137,24,111,37,122,-5,122,-5,111,37,89,57,122,-5,89,57,84,14,84,14,89,57,73,82,84,14,73,82,64,109,
-313,-12,313,20,154,20,148,22,142,23,136,25,179,109,313,109,313,142,195,142,239,233,313,233,313,266,256,266,289,331,257,331,225,266,166,266,121,258,84,238,55,207,37,169,30,126,33,97,42,70,55,45,73,24,96,7,54,-78,84,-78,121,-5,130,-7,139,-10,157,-12,167,-12,16383,16383,209,233,164,142,65,142,74,170,90,195,112,215,138,228,167,233,16383,16383,147,109,112,37,98,49,86,62,76,77,69,93,64,109,211,22,211,55,138,55,116,57,97,64,83,75,72,90,65,109,211,109,211,142,65,142,72,162,82,177,97,188,115,194,137,196,211,196,211,229,137,229,102,224,73,210,51,188,37,159,32,126,37,93,51,65,73,42,102,28,137,22,30,266,30,233,175,233,205,228,231,215,253,195,269,170,278,142,30,142,30,109,278,109,269,82,253,57,232,37,205,24,175,20,30,20,30,-12,175,-12,220,-5,258,14,287,45,306,83,
+313,-12,313,20,154,20,148,22,142,23,136,25,179,109,313,109,313,142,195,142,239,233,313,233,313,266,256,266,289,331,257,331,225,266,166,266,121,258,84,238,55,207,37,169,30,126,33,97,42,70,55,45,73,24,96,7,54,-78,84,-78,121,-5,130,-7,139,-10,157,-12,167,-12,16383,16383,209,233,164,142,65,142,74,170,90,195,112,215,138,228,167,233,16383,16383,147,109,112,37,98,49,86,62,76,77,69,93,64,109,
 96,7,96,7,84,-78,96,7,84,-78,121,-5,96,7,121,-5,98,49,96,7,98,49,86,62,96,7,86,62,76,77,96,7,76,77,73,24,55,45,73,24,64,109,64,109,73,24,69,93,69,93,73,24,76,77,161,20,154,20,157,-12,157,-12,154,20,148,22,157,-12,148,22,148,-11,148,-11,148,22,142,23,148,-11,142,23,139,-10,139,-10,142,23,136,25,139,-10,136,25,130,-7,147,109,112,37,121,-5,147,109,121,-5,130,-7,147,109,130,-7,136,25,147,109,136,25,179,109,147,109,179,109,164,142,147,109,164,142,65,142,147,109,65,142,64,109,167,-12,313,-12,313,20,167,-12,313,20,167,20,167,-12,167,20,161,20,167,-12,161,20,157,-12,90,195,112,215,121,258,121,258,112,215,138,228,121,258,138,228,166,266,166,266,138,228,167,233,166,266,167,233,225,266,225,266,167,233,209,233,225,266,209,233,239,233,239,233,209,233,195,142,256,266,289,331,257,331,256,266,257,331,239,233,256,266,239,233,313,233,256,266,313,233,313,266,179,109,313,109,195,142,179,109,195,142,209,233,179,109,209,233,164,142,84,238,55,207,65,142,84,238,65,142,74,170,84,238,74,170,90,195,84,238,90,195,121,258,30,126,33,97,37,169,37,169,33,97,42,70,37,169,42,70,55,207,55,207,42,70,55,45,55,207,55,45,65,142,65,142,55,45,64,109,195,142,313,109,313,142,84,-78,96,7,54,-78,98,49,121,-5,112,37,225,266,239,233,257,331,
-211,22,211,55,138,55,116,57,97,64,83,75,72,90,65,109,211,109,211,142,65,142,72,162,82,177,97,188,115,194,137,196,211,196,211,229,137,229,102,224,73,210,51,188,37,159,32,126,37,93,51,65,73,42,102,28,137,22,30,266,30,233,175,233,205,228,231,215,253,195,269,170,278,142,30,142,30,109,278,109,269,82,253,57,232,37,205,24,175,20,30,20,30,-12,175,-12,220,-5,258,14,287,45,306,83,312,126,313,126,306,169,288,207,259,238,222,258,
+211,22,211,55,138,55,116,57,97,64,83,75,72,90,65,109,211,109,211,142,65,142,72,162,82,177,97,188,115,194,137,196,211,196,211,229,137,229,102,224,73,210,51,188,37,159,32,126,37,93,51,65,73,42,102,28,137,22,
 83,75,72,90,73,42,73,42,72,90,65,109,73,42,65,109,51,188,73,42,51,188,51,65,51,65,51,188,37,159,51,65,37,159,37,93,37,93,37,159,32,126,82,177,97,188,102,224,102,224,97,188,115,194,102,224,115,194,137,229,137,229,115,194,137,196,51,188,65,109,65,142,65,142,65,109,211,142,211,142,65,109,211,109,211,229,137,229,137,196,211,229,137,196,211,196,73,210,51,188,65,142,73,210,65,142,72,162,73,210,72,162,82,177,73,210,82,177,102,224,97,64,102,28,116,57,116,57,102,28,137,22,116,57,137,22,138,55,138,55,137,22,211,22,138,55,211,22,211,55,83,75,73,42,102,28,83,75,102,28,97,64,
-30,266,30,233,175,233,205,228,231,215,253,195,269,170,278,142,30,142,30,109,278,109,269,82,253,57,232,37,205,24,175,20,30,20,30,-12,175,-12,220,-5,258,14,287,45,306,83,312,126,313,126,306,169,288,207,259,238,222,258,177,266,289,331,257,331,222,258,213,261,204,263,196,264,186,265,177,266,30,266,30,233,175,233,182,232,188,232,194,231,200,229,206,228,164,142,30,142,30,109,147,109,103,20,30,20,30,-12,86,-12,54,-78,84,-78,117,-12,175,-12,220,-5,258,14,
+30,266,30,233,175,233,205,228,231,215,253,195,269,170,278,142,30,142,30,109,278,109,269,82,253,57,232,37,205,24,175,20,30,20,30,-12,175,-12,220,-5,258,14,287,45,306,83,312,126,313,126,306,169,288,207,259,238,222,258,177,266,
 269,82,253,57,258,14,258,14,253,57,232,37,258,14,232,37,220,-5,220,-5,232,37,205,24,220,-5,205,24,175,20,177,266,30,266,175,233,177,266,175,233,205,228,177,266,205,228,222,258,312,126,306,169,306,83,306,83,306,169,288,207,306,83,288,207,287,45,287,45,288,207,278,109,287,45,278,109,269,82,231,215,253,195,259,238,259,238,253,195,269,170,259,238,269,170,288,207,288,207,269,170,278,142,288,207,278,142,278,109,222,258,205,228,231,215,222,258,231,215,259,238,175,-12,220,-5,175,20,175,-12,175,20,30,20,175,-12,30,20,30,-12,278,109,278,142,30,142,278,109,30,142,30,109,269,82,258,14,287,45,175,233,30,266,30,233,
-289,331,257,331,222,258,213,261,204,263,196,264,186,265,177,266,30,266,30,233,175,233,182,232,188,232,194,231,200,229,206,228,164,142,30,142,30,109,147,109,103,20,30,20,30,-12,86,-12,54,-78,84,-78,117,-12,175,-12,220,-5,258,14,287,45,306,83,312,126,313,126,310,155,301,183,287,208,269,229,247,247,16383,16383,195,142,230,214,244,203,256,190,266,175,273,159,278,142,16383,16383,278,109,269,82,253,57,232,37,205,24,175,20,133,20,179,109,32,229,32,196,105,196,128,194,146,188,161,177,171,162,177,142,32,142,32,109,177,109,171,90,161,75,146,64,127,57,105,55,32,55,32,22,107,22,141,28,170,42,192,65,206,93,211,126,206,159,192,188,170,210,140,224,105,229,243,0,243,320,30,320,30,0,474,-128,474,-115,465,-115,447,-112,433,-104,424,-92,418,-74,416,-51,416,307,418,330,423,347,434,359,451,366,474,368,474,382,26,382,26,368,35,368,52,366,66,360,76,349,83,331,85,305,
+289,331,257,331,222,258,213,261,204,263,196,264,186,265,177,266,30,266,30,233,175,233,182,232,188,232,194,231,200,229,206,228,164,142,30,142,30,109,147,109,103,20,30,20,30,-12,86,-12,54,-78,84,-78,117,-12,175,-12,220,-5,258,14,287,45,306,83,312,126,313,126,310,155,301,183,287,208,269,229,247,247,16383,16383,195,142,230,214,244,203,256,190,266,175,273,159,278,142,16383,16383,278,109,269,82,253,57,232,37,205,24,175,20,133,20,179,109,
 86,-12,54,-78,84,-78,86,-12,84,-78,117,-12,86,-12,117,-12,103,20,86,-12,103,20,30,20,86,-12,30,20,30,-12,147,109,103,20,117,-12,147,109,117,-12,133,20,147,109,133,20,179,109,147,109,179,109,164,142,147,109,164,142,30,142,147,109,30,142,30,109,269,82,253,57,258,14,258,14,253,57,232,37,258,14,232,37,220,-5,220,-5,232,37,205,24,220,-5,205,24,175,20,195,142,230,214,206,228,206,228,213,261,204,263,206,228,204,263,200,229,200,229,204,263,196,264,200,229,196,264,194,231,194,231,196,264,188,232,30,266,175,233,177,266,177,266,175,233,182,232,177,266,182,232,186,265,186,265,182,232,188,232,186,265,188,232,196,264,257,331,222,258,230,214,257,331,230,214,247,247,257,331,247,247,289,331,230,214,244,203,247,247,247,247,244,203,256,190,247,247,256,190,269,229,269,229,256,190,266,175,269,229,266,175,273,159,213,261,206,228,230,214,213,261,230,214,222,258,273,159,278,142,287,208,278,109,278,142,195,142,278,109,195,142,179,109,179,109,195,142,206,228,179,109,206,228,164,142,312,126,310,155,306,83,306,83,310,155,301,183,306,83,301,183,287,45,287,45,301,183,287,208,287,45,287,208,278,109,278,109,287,208,278,142,269,82,258,14,287,45,269,82,287,45,278,109,175,-12,220,-5,175,20,175,-12,175,20,133,20,175,-12,133,20,117,-12,269,229,273,159,287,208,175,233,30,266,30,233,
-32,229,32,196,105,196,128,194,146,188,161,177,171,162,177,142,32,142,32,109,177,109,171,90,161,75,146,64,127,57,105,55,32,55,32,22,107,22,141,28,170,42,192,65,206,93,211,126,206,159,192,188,170,210,140,224,105,229,243,0,243,320,30,320,30,0,474,-128,474,-115,465,-115,447,-112,433,-104,424,-92,418,-74,416,-51,416,307,418,330,423,347,434,359,451,366,474,368,474,382,26,382,26,368,35,368,52,366,66,360,76,349,83,331,85,305,85,-60,83,-80,
+32,229,32,196,105,196,128,194,146,188,161,177,171,162,177,142,32,142,32,109,177,109,171,90,161,75,146,64,127,57,105,55,32,55,32,22,107,22,141,28,170,42,192,65,206,93,211,126,206,159,192,188,170,210,140,224,105,229,
 105,229,32,229,105,229,105,229,32,229,105,196,105,229,105,196,140,224,140,224,105,196,128,194,140,224,128,194,146,188,192,188,177,142,192,65,192,65,177,142,177,109,192,65,177,109,171,90,32,142,32,109,177,109,32,142,177,109,177,142,146,188,161,177,170,210,170,210,161,177,171,162,170,210,171,162,192,188,192,188,171,162,177,142,206,159,192,188,192,65,206,159,192,65,206,93,206,159,206,93,211,126,170,42,192,65,171,90,170,42,171,90,161,75,170,42,161,75,146,64,170,42,146,64,141,28,127,57,105,55,107,22,127,57,107,22,141,28,127,57,141,28,146,64,32,55,32,22,107,22,32,55,107,22,105,55,105,196,32,229,32,196,140,224,146,188,170,210,
-243,0,243,320,30,320,30,0,474,-128,474,-115,465,-115,447,-112,
+243,0,243,320,30,320,30,0,
 243,0,243,320,30,320,243,0,30,320,30,0,
-474,-128,474,-115,465,-115,447,-112,433,-104,424,-92,418,-74,416,-51,416,307,418,330,423,347,434,359,451,366,474,368,474,382,26,382,26,368,35,368,52,366,66,360,76,349,83,331,85,305,85,-60,83,-80,77,-95,67,-106,54,-112,36,-115,26,-115,26,-128,210,-128,210,-115,195,-115,177,-112,165,-104,157,-91,152,-72,151,-48,151,349,350,349,350,-48,349,-69,344,-88,337,-102,324,-111,306,-115,290,-115,290,-128,474,-128,474,-115,451,-112,434,-106,423,-94,418,-77,416,-54,416,304,418,327,424,345,433,358,447,365,465,368,474,368,474,382,290,382,290,368,306,368,324,364,337,355,344,341,349,322,350,300,350,-96,151,-96,151,300,152,325,157,344,165,357,177,365,195,368,210,368,210,382,26,382,26,368,36,368,54,366,67,359,77,348,83,333,85,313,85,-53,83,-78,76,-96,66,-107,52,-113,35,-115,26,-115,26,-128,
+474,-128,474,-115,465,-115,447,-112,433,-104,424,-92,418,-74,416,-51,416,307,418,330,423,347,434,359,451,366,474,368,474,382,26,382,26,368,35,368,52,366,66,360,76,349,83,331,85,305,85,-60,83,-80,77,-95,67,-106,54,-112,36,-115,26,-115,26,-128,210,-128,210,-115,195,-115,177,-112,165,-104,157,-91,152,-72,151,-48,151,349,350,349,350,-48,349,-69,344,-88,337,-102,324,-111,306,-115,290,-115,290,-128,
 77,-95,67,-106,210,-128,210,-128,67,-106,54,-112,210,-128,54,-112,36,-115,344,-88,337,-102,474,-128,474,-128,337,-102,324,-111,474,-128,324,-111,306,-115,474,382,26,382,35,368,474,382,35,368,52,366,474,382,52,366,66,360,474,382,66,360,76,349,474,382,76,349,151,349,474,382,151,349,350,349,474,382,350,349,434,359,474,382,434,359,451,366,474,382,451,366,474,368,433,-104,424,-92,350,-48,350,-48,424,-92,418,-74,350,-48,418,-74,350,349,350,349,418,-74,416,-51,350,349,416,-51,416,307,350,349,416,307,418,330,350,349,418,330,423,347,350,349,423,347,434,359,165,-104,157,-91,85,-60,85,-60,157,-91,152,-72,85,-60,152,-72,85,305,85,305,152,-72,151,-48,85,305,151,-48,151,349,83,331,85,305,151,349,83,331,151,349,76,349,474,-128,474,-115,465,-115,474,-128,465,-115,447,-112,474,-128,447,-112,433,-104,474,-128,433,-104,349,-69,474,-128,349,-69,344,-88,290,-115,290,-128,474,-128,290,-115,474,-128,306,-115,210,-128,210,-115,195,-115,210,-128,195,-115,177,-112,210,-128,177,-112,83,-80,210,-128,83,-80,77,-95,85,-60,83,-80,177,-112,85,-60,177,-112,165,-104,26,-115,26,-128,210,-128,26,-115,210,-128,36,-115,349,-69,433,-104,350,-48,35,368,26,382,26,368,
-474,-128,474,-115,451,-112,434,-106,423,-94,418,-77,416,-54,416,304,418,327,424,345,433,358,447,365,465,368,474,368,474,382,290,382,290,368,306,368,324,364,337,355,344,341,349,322,350,300,350,-96,151,-96,151,300,152,325,157,344,165,357,177,365,195,368,210,368,210,382,26,382,26,368,36,368,54,366,67,359,77,348,83,333,85,313,85,-53,83,-78,76,-96,66,-107,52,-113,35,-115,26,-115,26,-128,428,20,413,20,405,-7,394,-30,379,-48,357,-59,328,-63,121,-63,289,153,144,349,304,349,339,346,364,336,381,318,392,292,400,256,415,256,415,382,41,382,225,126,29,-128,401,-128,310,110,310,143,32,143,32,110,319,218,319,251,24,251,24,218,16383,16383,319,54,319,86,188,86,188,191,155,191,155,86,24,86,24,54,155,54,155,-43,188,-43,188,54,203,339,201,349,196,358,189,365,180,369,171,371,
+474,-128,474,-115,451,-112,434,-106,423,-94,418,-77,416,-54,416,304,418,327,424,345,433,358,447,365,465,368,474,368,474,382,290,382,290,368,306,368,324,364,337,355,344,341,349,322,350,300,350,-96,151,-96,151,300,152,325,157,344,165,357,177,365,195,368,210,368,210,382,26,382,26,368,36,368,54,366,67,359,77,348,83,333,85,313,85,-53,83,-78,76,-96,66,-107,52,-113,35,-115,26,-115,26,-128,
 76,-96,66,-107,474,-128,474,-128,66,-107,52,-113,474,-128,52,-113,35,-115,77,348,83,333,210,382,210,382,83,333,177,365,210,382,177,365,195,368,210,382,195,368,210,368,85,313,85,-53,151,-96,85,313,151,-96,151,300,85,313,151,300,152,325,85,313,152,325,157,344,85,313,157,344,165,357,85,313,165,357,177,365,85,313,177,365,83,333,210,382,26,382,36,368,210,382,36,368,54,366,210,382,54,366,67,359,210,382,67,359,77,348,434,-106,423,-94,350,-96,350,-96,423,-94,418,-77,350,-96,418,-77,350,300,349,322,350,300,433,358,349,322,433,358,474,382,474,382,433,358,447,365,474,382,447,365,465,368,474,382,465,368,474,368,416,-54,416,304,350,300,350,300,416,304,418,327,350,300,418,327,424,345,474,382,290,382,306,368,474,382,306,368,324,364,474,382,324,364,337,355,474,382,337,355,344,341,474,382,344,341,349,322,474,-128,474,-115,451,-112,474,-128,451,-112,434,-106,474,-128,434,-106,350,-96,474,-128,350,-96,151,-96,474,-128,151,-96,76,-96,83,-78,76,-96,151,-96,83,-78,151,-96,85,-53,26,-115,26,-128,474,-128,26,-115,474,-128,35,-115,350,300,418,-77,416,-54,306,368,290,382,290,368,433,358,350,300,424,345,36,368,26,382,26,368,
-428,20,413,20,405,-7,394,-30,379,-48,357,-59,328,-63,121,-63,289,153,144,349,304,349,339,346,364,336,381,318,392,292,400,256,415,256,415,382,41,382,225,126,29,-128,401,-128,310,110,310,143,32,143,32,110,319,218,319,251,24,251,24,218,16383,16383,319,54,319,86,188,86,188,191,155,191,155,86,24,86,24,54,155,54,155,-43,188,-43,188,54,203,339,
+428,20,413,20,405,-7,394,-30,379,-48,357,-59,328,-63,121,-63,289,153,144,349,304,349,339,346,364,336,381,318,392,292,400,256,415,256,415,382,41,382,225,126,29,-128,401,-128,
 415,382,41,382,144,349,415,382,144,349,304,349,415,382,304,349,339,346,415,382,339,346,364,336,415,382,364,336,381,318,415,382,381,318,392,292,415,382,392,292,400,256,415,382,400,256,415,256,225,126,29,-128,121,-63,225,126,121,-63,289,153,225,126,289,153,144,349,225,126,144,349,41,382,394,-30,379,-48,401,-128,401,-128,379,-48,357,-59,401,-128,357,-59,328,-63,405,-7,394,-30,401,-128,405,-7,401,-128,428,20,405,-7,428,20,413,20,121,-63,29,-128,401,-128,121,-63,401,-128,328,-63,
-310,110,310,143,32,143,32,110,319,218,319,251,24,251,24,218,
+310,110,310,143,32,143,32,110,
 310,110,310,143,32,143,310,110,32,143,32,110,
-319,218,319,251,24,251,24,218,16383,16383,319,54,319,86,188,86,188,191,155,191,155,86,24,86,24,54,155,54,155,-43,188,-43,188,54,203,339,201,349,196,358,189,365,180,369,171,371,161,369,153,365,146,358,141,350,139,339,140,328,145,319,151,313,160,308,171,307,181,309,
+319,218,319,251,24,251,24,218,16383,16383,319,54,319,86,188,86,188,191,155,191,155,86,24,86,24,54,155,54,155,-43,188,-43,188,54,
 24,251,24,218,319,218,24,251,319,218,319,251,188,191,155,191,188,-43,188,-43,155,191,155,86,188,-43,155,86,155,54,155,54,155,86,24,86,155,54,24,86,24,54,188,54,319,54,188,86,188,86,319,54,319,86,188,-43,155,54,155,-43,
-203,339,201,349,196,358,189,365,180,369,171,371,161,369,153,365,146,358,141,350,139,339,140,328,145,319,151,313,160,308,171,307,181,309,190,313,197,320,201,329,203,339,16383,16383,318,110,318,143,188,143,188,273,155,273,155,143,24,143,24,110,155,110,155,-20,188,-20,188,110,239,355,203,355,23,-110,59,-110,201,46,44,205,12,205,171,46,228,169,227,175,225,181,221,185,216,189,210,190,208,190,206,189,204,189,202,188,200,186,191,180,182,170,170,158,156,145,137,133,138,153,142,172,146,190,150,204,151,215,150,222,147,227,143,231,138,234,132,235,
+203,339,201,349,196,358,189,365,180,369,171,371,161,369,153,365,146,358,141,350,139,339,140,328,145,319,151,313,160,308,171,307,181,309,190,313,197,320,201,329,203,339,16383,16383,318,110,318,143,188,143,188,273,155,273,155,143,24,143,24,110,155,110,155,-20,188,-20,188,110,
 171,371,171,307,180,369,180,369,171,307,181,309,180,369,181,309,189,365,189,365,181,309,190,313,189,365,190,313,196,358,196,358,190,313,197,320,196,358,197,320,201,349,201,349,197,320,201,329,201,349,201,329,203,339,139,339,140,328,141,350,141,350,140,328,145,319,141,350,145,319,146,358,146,358,145,319,151,313,146,358,151,313,153,365,153,365,151,313,160,308,153,365,160,308,161,369,161,369,160,308,171,307,161,369,171,307,171,371,188,273,155,273,188,-20,188,-20,155,273,155,143,188,-20,155,143,155,110,155,110,155,143,24,143,155,110,24,143,24,110,188,110,318,110,188,143,188,143,318,110,318,143,188,-20,155,110,155,-20,
-239,355,203,355,23,-110,59,-110,201,46,44,205,12,205,171,46,
+239,355,203,355,23,-110,59,-110,
 239,355,203,355,23,-110,239,355,23,-110,59,-110,
-201,46,44,205,12,205,171,46,228,169,227,175,225,181,221,185,
+201,46,44,205,12,205,171,46,
 201,46,44,205,12,205,201,46,12,205,171,46,
-228,169,227,175,225,181,221,185,216,189,210,190,208,190,206,189,204,189,202,188,200,186,191,180,182,170,170,158,156,145,137,133,138,153,142,172,146,190,150,204,151,215,150,222,147,227,143,231,138,234,132,235,127,234,121,231,117,227,114,222,113,215,114,204,118,189,122,172,126,153,127,132,111,143,96,155,72,179,62,186,63,186,60,188,58,189,56,189,54,190,51,190,45,189,40,185,37,181,34,175,33,169,34,165,35,162,37,159,40,156,44,153,55,149,70,144,87,139,105,133,122,125,105,117,88,111,71,106,56,102,46,98,42,95,39,91,37,87,36,82,35,78,36,73,38,69,42,65,47,63,54,62,56,62,59,63,61,64,67,66,75,72,85,83,98,95,112,108,127,118,126,98,122,80,118,63,114,49,113,37,114,31,117,26,121,21,127,18,132,17,138,18,143,21,147,26,150,31,151,37,150,49,146,63,142,80,138,98,137,118,157,104,173,89,185,75,196,65,208,61,215,62,220,65,224,70,227,75,228,81,227,85,226,88,224,91,221,95,217,97,207,101,193,105,177,109,159,116,140,125,161,135,179,142,195,146,208,149,218,153,221,155,224,158,226,162,228,165,228,169,155,126,152,147,142,166,128,180,110,190,89,194,67,190,48,181,33,167,24,148,20,127,23,105,33,86,47,72,66,62,88,59,109,62,128,72,142,86,152,105,155,126,16383,16383,122,126,120,115,116,105,108,98,99,93,88,92,77,93,67,98,60,106,55,115,53,127,55,138,59,147,67,154,77,159,89,161,99,159,108,154,116,147,120,137,122,126,155,126,152,147,142,166,128,180,110,190,89,194,67,190,48,181,33,167,24,148,20,127,23,105,33,86,47,72,66,62,88,59,109,62,128,72,142,86,152,105,155,126,482,487,454,487,248,-45,246,-45,143,222,134,222,56,160,62,150,69,155,83,163,89,165,94,165,102,164,108,161,114,155,120,147,126,136,227,-128,243,-128,149,381,156,391,162,399,169,404,177,407,185,408,195,407,202,404,208,399,212,392,213,382,211,369,204,359,195,351,183,345,171,340,171,335,184,335,189,334,193,333,196,333,206,328,213,323,219,315,222,306,223,296,222,284,217,274,210,266,201,261,190,259,186,260,182,260,178,262,173,264,168,267,164,270,161,272,152,275,146,273,144,271,142,268,142,265,143,260,146,255,152,251,160,249,171,248,193,250,214,257,231,269,242,286,
+228,169,227,175,225,181,221,185,216,189,210,190,208,190,206,189,204,189,202,188,200,186,191,180,182,170,170,158,156,145,137,133,138,153,142,172,146,190,150,204,151,215,150,222,147,227,143,231,138,234,132,235,127,234,121,231,117,227,114,222,113,215,114,204,118,189,122,172,126,153,127,132,111,143,96,155,72,179,62,186,63,186,60,188,58,189,56,189,54,190,51,190,45,189,40,185,37,181,34,175,33,169,34,165,35,162,37,159,40,156,44,153,55,149,70,144,87,139,105,133,122,125,105,117,88,111,71,106,56,102,46,98,42,95,39,91,37,87,36,82,35,78,36,73,38,69,42,65,47,63,54,62,56,62,59,63,61,64,67,66,75,72,85,83,98,95,112,108,127,118,126,98,122,80,118,63,114,49,113,37,114,31,117,26,121,21,127,18,132,17,138,18,143,21,147,26,150,31,151,37,150,49,146,63,142,80,138,98,137,118,157,104,173,89,185,75,196,65,208,61,215,62,220,65,224,70,227,75,228,81,227,85,226,88,224,91,221,95,217,97,207,101,193,105,177,109,159,116,140,125,161,135,179,142,195,146,208,149,218,153,221,155,224,158,226,162,228,165,228,169,
 146,63,142,80,143,21,143,21,142,80,138,98,143,21,138,98,138,18,138,18,138,98,137,118,137,133,138,234,132,17,132,17,138,234,132,235,132,17,132,235,127,118,127,118,132,235,127,132,127,118,127,132,122,125,122,125,127,132,111,143,138,153,142,172,143,231,143,231,142,172,146,190,143,231,146,190,147,227,147,227,146,190,150,204,147,227,150,204,150,222,150,222,150,204,151,215,138,234,137,133,138,153,138,234,138,153,143,231,127,118,126,98,127,18,127,118,127,18,132,17,113,37,114,31,114,49,114,49,114,31,117,26,114,49,117,26,118,63,118,63,117,26,121,21,118,63,121,21,122,80,122,80,121,21,127,18,122,80,127,18,126,98,137,118,157,104,140,125,140,125,157,104,159,116,159,116,157,104,173,89,159,116,173,89,177,109,177,109,173,89,185,75,177,109,185,75,193,105,193,105,185,75,196,65,193,105,196,65,207,101,207,101,196,65,208,61,207,101,208,61,217,97,217,97,208,61,215,62,217,97,215,62,220,65,221,155,224,158,225,181,225,181,224,158,226,162,225,181,226,162,227,175,227,175,226,162,228,165,227,175,228,165,228,169,221,185,216,189,218,153,221,185,218,153,221,155,221,185,221,155,225,181,216,189,210,190,218,153,218,153,210,190,208,190,218,153,208,190,208,149,208,149,208,190,206,189,208,149,206,189,204,189,204,189,202,188,208,149,208,149,202,188,200,186,208,149,200,186,195,146,195,146,200,186,191,180,195,146,191,180,182,170,156,145,140,125,161,135,156,145,161,135,170,158,170,158,161,135,179,142,170,158,179,142,182,170,182,170,179,142,195,146,137,133,137,118,140,125,137,133,140,125,156,145,137,118,137,133,132,17,137,118,132,17,138,18,228,81,227,85,227,75,227,75,227,85,226,88,227,75,226,88,224,70,224,70,226,88,224,91,224,70,224,91,221,95,221,95,217,97,220,65,221,95,220,65,224,70,150,49,146,63,147,26,150,49,147,26,150,31,150,49,150,31,151,37,127,132,132,235,127,234,127,132,127,234,126,153,126,153,127,234,122,172,122,172,127,234,121,231,122,172,121,231,118,189,118,189,121,231,117,227,118,189,117,227,114,204,114,204,117,227,114,222,114,204,114,222,113,215,75,72,85,83,88,111,88,111,85,83,98,95,88,111,98,95,105,117,105,117,98,95,112,108,105,117,112,108,122,125,122,125,112,108,127,118,71,106,56,102,59,63,71,106,59,63,61,64,71,106,61,64,64,65,71,106,64,65,67,66,71,106,67,66,75,72,71,106,75,72,88,111,56,102,46,98,47,63,56,102,47,63,54,62,56,102,54,62,56,62,56,102,56,62,59,63,42,65,47,63,46,98,42,65,46,98,42,95,42,65,42,95,39,91,42,65,39,91,38,69,37,87,36,82,36,73,37,87,36,73,38,69,37,87,38,69,39,91,122,125,111,143,105,133,105,133,111,143,96,155,105,133,96,155,87,139,87,139,96,155,83,168,87,139,83,168,72,179,70,144,87,139,72,179,70,144,72,179,62,186,70,144,62,186,60,188,70,144,60,188,58,189,70,144,58,189,56,189,70,144,56,189,55,149,55,149,56,189,54,190,55,149,54,190,51,190,55,149,51,190,45,189,55,149,45,189,44,153,40,185,37,181,37,159,40,185,37,159,40,156,40,185,40,156,44,153,40,185,44,153,45,189,33,169,34,165,34,175,34,175,34,165,35,162,34,175,35,162,37,181,37,181,35,162,37,159,36,73,36,82,35,78,146,63,143,21,147,26,
-155,126,152,147,142,166,128,180,110,190,89,194,67,190,48,181,33,167,24,148,20,127,23,105,33,86,47,72,66,62,88,59,109,62,128,72,142,86,152,105,155,126,16383,16383,122,126,120,115,116,105,108,98,99,93,88,92,77,93,67,98,60,106,55,115,53,127,55,138,59,147,67,154,77,159,89,161,99,159,108,154,116,147,120,137,122,126,155,126,152,147,142,166,128,180,110,190,89,194,67,190,48,181,33,167,24,148,20,127,23,105,33,86,47,72,66,62,88,59,109,62,128,72,142,86,152,105,155,126,482,487,454,487,248,-45,246,-45,143,222,134,222,56,160,62,150,69,155,83,163,89,165,94,165,102,164,108,161,114,155,120,147,126,136,227,-128,243,-128,149,381,156,391,162,399,
+155,126,152,147,142,166,128,180,110,190,89,194,67,190,48,181,33,167,24,148,20,127,23,105,33,86,47,72,66,62,88,59,109,62,128,72,142,86,152,105,155,126,16383,16383,122,126,120,115,116,105,108,98,99,93,88,92,77,93,67,98,60,106,55,115,53,127,55,138,59,147,67,154,77,159,89,161,99,159,108,154,116,147,120,137,122,126,
 60,106,66,62,67,98,67,98,66,62,88,59,67,98,88,59,77,93,77,93,88,59,88,92,99,93,88,92,88,59,99,93,88,59,109,62,55,138,59,147,67,190,67,190,59,147,67,154,67,190,67,154,89,194,89,194,67,154,77,159,89,194,77,159,89,161,89,161,99,159,110,190,110,190,99,159,108,154,110,190,108,154,116,147,20,127,23,105,24,148,24,148,23,105,33,86,24,148,33,86,33,167,33,167,33,86,47,72,33,167,47,72,48,181,48,181,47,72,53,127,55,138,67,190,48,181,55,138,48,181,53,127,155,126,152,147,152,105,152,105,152,147,142,166,152,105,142,166,142,86,142,86,142,166,128,180,142,86,128,180,128,72,128,72,128,180,122,126,128,72,122,126,120,115,128,72,120,115,116,105,128,180,110,190,116,147,128,180,116,147,120,137,128,180,120,137,122,126,110,190,89,194,89,161,109,62,128,72,116,105,109,62,116,105,108,98,109,62,108,98,99,93,55,115,53,127,47,72,55,115,47,72,66,62,55,115,66,62,60,106,
-155,126,152,147,142,166,128,180,110,190,89,194,67,190,48,181,33,167,24,148,20,127,23,105,33,86,47,72,66,62,88,59,109,62,128,72,142,86,152,105,155,126,482,487,454,487,248,-45,246,-45,143,222,134,222,56,160,62,150,69,155,83,163,89,165,94,165,102,164,108,161,114,155,120,147,126,136,227,-128,243,-128,149,381,156,391,
+155,126,152,147,142,166,128,180,110,190,89,194,67,190,48,181,33,167,24,148,20,127,23,105,33,86,47,72,66,62,88,59,109,62,128,72,142,86,152,105,155,126,
 20,127,23,105,24,148,24,148,23,105,33,86,24,148,33,86,33,167,33,167,33,86,47,72,33,167,47,72,48,181,48,181,47,72,66,62,48,181,66,62,67,190,67,190,66,62,88,59,67,190,88,59,89,194,89,194,88,59,109,62,89,194,109,62,110,190,110,190,109,62,128,72,110,190,128,72,128,180,128,180,128,72,142,86,128,180,142,86,142,166,142,166,142,86,152,105,142,166,152,105,152,147,152,147,152,105,155,126,
-482,487,454,487,248,-45,246,-45,143,222,134,222,56,160,62,150,69,155,83,163,89,165,94,165,102,164,108,161,114,155,120,147,126,136,227,-128,243,-128,149,381,156,391,162,399,169,404,177,407,185,408,195,407,202,404,208,399,212,392,213,382,211,369,204,359,195,351,183,345,171,340,171,335,184,335,189,334,
+482,487,454,487,248,-45,246,-45,143,222,134,222,56,160,62,150,69,155,83,163,89,165,94,165,102,164,108,161,114,155,120,147,126,136,227,-128,243,-128,
 76,159,83,163,134,222,134,222,83,163,89,165,134,222,89,165,94,165,94,165,102,164,134,222,134,222,102,164,108,161,134,222,108,161,114,155,143,222,134,222,227,-128,227,-128,134,222,126,136,120,147,126,136,134,222,120,147,134,222,114,155,134,222,56,160,62,150,134,222,62,150,69,155,134,222,69,155,76,159,143,222,227,-128,246,-45,246,-45,227,-128,243,-128,246,-45,243,-128,248,-45,248,-45,243,-128,482,487,248,-45,482,487,454,487,
-149,381,156,391,162,399,169,404,177,407,185,408,195,407,202,404,208,399,212,392,213,382,211,369,204,359,195,351,183,345,171,340,171,335,184,335,189,334,193,333,196,333,206,328,213,323,219,315,222,306,223,296,222,284,217,274,210,266,201,261,190,259,186,260,182,260,178,262,173,264,168,267,164,270,161,272,152,275,146,273,144,271,142,268,142,265,143,260,146,255,152,251,160,249,171,248,193,250,214,257,231,269,242,286,247,307,245,320,240,331,233,340,223,347,210,352,218,358,224,365,229,373,232,381,233,388,231,400,226,410,218,417,206,421,193,423,178,421,166,416,156,407,149,396,143,382,16383,16383,482,487,454,487,248,-45,246,-45,143,222,134,222,56,160,62,150,69,155,83,163,89,165,94,165,102,164,108,161,114,155,120,147,126,136,227,-128,243,-128,252,291,252,312,225,312,225,421,210,421,131,312,131,291,201,291,201,249,225,249,225,291,16383,16383,201,312,142,312,201,395,16383,16383,482,487,454,487,248,-45,246,-45,143,222,134,222,56,160,62,150,69,155,83,163,89,165,94,165,102,164,108,161,114,155,120,147,126,136,227,-128,243,-128,321,42,304,45,287,54,270,70,253,92,235,121,235,123,245,137,258,150,275,162,296,170,321,173,321,215,294,211,272,201,254,185,239,165,225,142,199,174,177,195,156,207,137,213,116,215,95,212,70,201,46,180,28,147,21,100,26,63,39,35,59,15,83,4,108,0,135,3,159,12,180,27,198,47,213,73,232,47,250,27,271,12,294,3,321,0,16383,16383,202,90,193,78,180,66,164,54,144,45,120,42,96,47,76,59,62,78,53,101,50,126,53,144,60,161,71,174,
+149,381,156,391,162,399,169,404,177,407,185,408,195,407,202,404,208,399,212,392,213,382,211,369,204,359,195,351,183,345,171,340,171,335,184,335,189,334,193,333,196,333,206,328,213,323,219,315,222,306,223,296,222,284,217,274,210,266,201,261,190,259,186,260,182,260,178,262,173,264,168,267,164,270,161,272,152,275,146,273,144,271,142,268,142,265,143,260,146,255,152,251,160,249,171,248,193,250,214,257,231,269,242,286,247,307,245,320,240,331,233,340,223,347,210,352,218,358,224,365,229,373,232,381,233,388,231,400,226,410,218,417,206,421,193,423,178,421,166,416,156,407,149,396,143,382,16383,16383,482,487,454,487,248,-45,246,-45,143,222,134,222,56,160,62,150,69,155,83,163,89,165,94,165,102,164,108,161,114,155,120,147,126,136,227,-128,243,-128,
 158,273,160,249,161,272,161,272,160,249,171,248,161,272,171,248,164,270,164,270,171,248,168,267,173,264,168,267,171,248,173,264,171,248,193,250,149,381,156,391,156,407,156,407,156,391,162,399,156,407,162,399,166,416,166,416,162,399,169,404,166,416,169,404,178,421,178,421,169,404,177,407,178,421,177,407,185,408,185,408,195,407,193,423,193,423,195,407,206,421,149,396,143,382,149,381,149,396,149,381,156,407,184,335,189,334,195,351,195,351,189,334,193,333,195,351,193,333,196,333,196,333,206,328,204,359,204,359,206,328,211,369,183,345,171,340,178,335,183,345,178,335,184,335,183,345,184,335,195,351,204,359,195,351,196,333,210,352,218,358,211,369,211,369,218,358,213,382,218,417,213,382,218,358,218,417,218,358,226,410,226,410,218,358,224,365,226,410,224,365,229,373,195,407,202,404,206,421,206,421,202,404,208,399,206,421,208,399,218,417,218,417,208,399,212,392,218,417,212,392,213,382,231,400,226,410,229,373,231,400,229,373,232,381,231,400,232,381,233,388,210,352,211,369,206,328,210,352,206,328,213,323,210,352,213,323,223,347,242,286,247,307,245,320,242,286,245,320,240,331,242,286,240,331,233,340,242,286,233,340,231,269,223,296,231,269,233,340,223,296,233,340,223,347,223,347,213,323,219,315,223,347,219,315,222,306,223,347,222,306,223,296,210,266,214,257,217,274,217,274,214,257,231,269,217,274,231,269,222,284,222,284,231,269,223,296,190,259,193,250,201,261,201,261,193,250,214,257,201,261,214,257,210,266,193,423,178,421,185,408,186,260,182,260,193,250,186,260,193,250,190,259,178,262,173,264,193,250,178,262,193,250,182,260,155,274,152,275,152,251,155,274,152,251,160,249,155,274,160,249,158,273,149,274,146,273,146,255,149,274,146,255,152,251,149,274,152,251,152,275,144,271,142,268,143,260,144,271,143,260,146,255,144,271,146,255,146,273,76,159,83,163,134,222,134,222,83,163,89,165,134,222,89,165,94,165,94,165,102,164,134,222,134,222,102,164,108,161,134,222,108,161,114,155,143,222,134,222,227,-128,227,-128,134,222,126,136,120,147,126,136,134,222,120,147,134,222,114,155,134,222,56,160,62,150,134,222,62,150,69,155,134,222,69,155,76,159,143,222,227,-128,246,-45,246,-45,227,-128,243,-128,246,-45,243,-128,248,-45,248,-45,243,-128,482,487,248,-45,482,487,454,487,143,260,142,268,142,265,178,335,171,340,171,335,
-252,291,252,312,225,312,225,421,210,421,131,312,131,291,201,291,201,249,225,249,225,291,16383,16383,201,312,142,312,201,395,16383,16383,482,487,454,487,248,-45,246,-45,143,222,134,222,56,160,62,150,69,155,83,163,89,165,94,165,102,164,108,161,114,155,120,147,126,136,227,-128,243,-128,321,42,304,45,287,54,270,70,253,92,235,121,235,123,245,137,258,150,275,162,296,170,321,173,321,215,294,211,272,201,254,185,239,165,225,142,199,174,177,195,156,207,137,213,116,215,95,212,70,201,46,180,28,147,21,100,26,63,39,35,59,15,83,4,108,0,135,3,159,12,
+252,291,252,312,225,312,225,421,210,421,131,312,131,291,201,291,201,249,225,249,225,291,16383,16383,201,312,142,312,201,395,16383,16383,482,487,454,487,248,-45,246,-45,143,222,134,222,56,160,62,150,69,155,83,163,89,165,94,165,102,164,108,161,114,155,120,147,126,136,227,-128,243,-128,
 131,291,201,291,131,312,131,312,201,291,142,312,131,312,142,312,210,421,210,421,142,312,201,395,210,421,201,395,225,249,225,249,201,395,201,312,225,249,201,312,201,291,201,291,201,312,142,312,210,421,225,249,225,421,225,312,225,291,252,291,225,312,252,291,252,312,76,159,83,163,134,222,134,222,83,163,89,165,134,222,89,165,94,165,94,165,102,164,134,222,134,222,102,164,108,161,134,222,108,161,114,155,143,222,134,222,227,-128,227,-128,134,222,126,136,120,147,126,136,134,222,120,147,134,222,114,155,134,222,56,160,62,150,134,222,62,150,69,155,134,222,69,155,76,159,143,222,227,-128,246,-45,246,-45,227,-128,243,-128,246,-45,243,-128,248,-45,248,-45,243,-128,482,487,248,-45,482,487,454,487,225,249,201,291,201,249,
-321,42,304,45,287,54,270,70,253,92,235,121,235,123,245,137,258,150,275,162,296,170,321,173,321,215,294,211,272,201,254,185,239,165,225,142,199,174,177,195,156,207,137,213,116,215,95,212,70,201,46,180,28,147,21,100,26,63,39,35,59,15,83,4,108,0,135,3,159,12,180,27,198,47,213,73,232,47,250,27,271,12,294,3,321,0,16383,16383,202,90,193,78,180,66,164,54,144,45,120,42,96,47,76,59,62,78,53,101,50,126,53,144,60,161,71,174,85,182,100,185,121,181,140,169,160,150,181,124,202,92,427,111,422,148,408,177,387,198,363,210,336,215,309,211,287,201,269,185,253,165,239,142,213,174,191,195,171,207,151,213,131,215,110,212,84,201,60,180,42,147,35,100,40,63,54,35,73,15,97,4,123,0,150,3,174,12,195,27,213,47,228,73,246,47,264,27,284,12,305,3,328,0,363,7,390,25,410,51,423,81,427,111,16383,16383,249,123,259,136,270,149,285,161,304,170,328,173,352,169,371,157,385,138,394,115,397,89,394,70,387,54,377,41,363,33,347,30,327,33,308,45,290,63,270,89,249,121,16383,16383,217,90,
+321,42,304,45,287,54,270,70,253,92,235,121,235,123,245,137,258,150,275,162,296,170,321,173,321,215,294,211,272,201,254,185,239,165,225,142,199,174,177,195,156,207,137,213,116,215,95,212,70,201,46,180,28,147,21,100,26,63,39,35,59,15,83,4,108,0,135,3,159,12,180,27,198,47,213,73,232,47,250,27,271,12,294,3,321,0,16383,16383,202,90,193,78,180,66,164,54,144,45,120,42,96,47,76,59,62,78,53,101,50,126,53,144,60,161,71,174,85,182,100,185,121,181,140,169,160,150,181,124,202,92,
 213,73,232,47,213,73,213,73,232,47,225,142,213,73,225,142,202,92,202,92,199,174,181,124,181,124,199,174,177,195,181,124,177,195,160,150,160,150,177,195,156,207,160,150,156,207,140,169,140,169,156,207,137,213,140,169,137,213,121,181,121,181,137,213,116,215,121,181,116,215,100,185,53,144,60,161,70,201,70,201,60,161,71,174,70,201,71,174,95,212,95,212,71,174,85,182,95,212,85,182,100,185,21,100,26,63,28,147,28,147,26,63,39,35,28,147,39,35,46,180,46,180,39,35,59,15,46,180,59,15,50,126,50,126,53,144,46,180,46,180,53,144,70,201,202,90,193,78,198,47,198,47,193,78,180,66,198,47,180,66,180,27,180,27,180,66,164,54,180,27,164,54,159,12,159,12,164,54,144,45,159,12,144,45,135,3,135,3,144,45,120,42,135,3,120,42,108,0,108,0,120,42,96,47,108,0,96,47,83,4,83,4,96,47,76,59,83,4,76,59,62,78,59,15,83,4,62,78,59,15,62,78,53,101,59,15,53,101,50,126,287,54,270,70,271,12,271,12,270,70,253,92,271,12,253,92,250,27,250,27,253,92,235,121,250,27,235,121,232,47,321,173,321,215,296,170,296,170,321,215,294,211,296,170,294,211,275,162,275,162,294,211,272,201,275,162,272,201,258,150,258,150,272,201,254,185,258,150,254,185,245,137,245,137,254,185,239,165,245,137,239,165,235,123,235,123,239,165,225,142,235,123,225,142,232,47,235,123,232,47,235,121,304,45,287,54,294,3,304,45,294,3,321,0,304,45,321,0,321,42,199,174,202,92,225,142,213,73,202,92,202,90,213,73,202,90,198,47,100,185,116,215,95,212,287,54,271,12,294,3,
-427,111,422,148,408,177,387,198,363,210,336,215,309,211,287,201,269,185,253,165,239,142,213,174,191,195,171,207,151,213,131,215,110,212,84,201,60,180,42,147,35,100,40,63,54,35,73,15,97,4,123,0,150,3,174,12,195,27,213,47,228,73,246,47,264,27,284,12,305,3,328,0,363,7,390,25,410,51,423,81,427,111,16383,16383,249,123,259,136,270,149,285,161,304,170,328,173,352,169,371,157,385,138,394,115,397,89,394,70,387,54,377,41,363,33,347,30,327,33,308,45,290,63,270,89,249,121,16383,16383,217,90,207,78,195,66,179,54,159,45,134,42,110,47,91,59,77,78,68,101,65,126,67,144,74,161,85,174,99,182,115,185,135,181,155,169,175,150,195,124,217,92,317,0,317,33,58,33,58,292,25,292,25,0,321,0,321,33,91,33,310,252,285,273,12,0,321,0,321,33,271,33,265,61,257,88,247,113,233,138,218,160,310,252,284,273,196,185,186,195,174,205,169,209,148,182,168,166,172,161,11,0,239,0,239,-18,238,-24,238,-30,270,-35,272,-21,272,0,16383,16383,90,33,194,137,207,118,217,98,226,77,233,56,237,33,326,40,281,59,284,72,286,86,288,99,290,127,289,140,288,154,286,168,280,196,326,216,314,246,269,228,266,234,263,241,257,253,253,259,225,243,228,237,231,232,233,226,236,220,238,215,28,127,239,40,237,34,234,29,232,23,229,17,225,12,254,-5,258,1,261,8,265,14,268,21,270,27,314,9,16383,16383,114,127,249,184,
+427,111,422,148,408,177,387,198,363,210,336,215,309,211,287,201,269,185,253,165,239,142,213,174,191,195,171,207,151,213,131,215,110,212,84,201,60,180,42,147,35,100,40,63,54,35,73,15,97,4,123,0,150,3,174,12,195,27,213,47,228,73,246,47,264,27,284,12,305,3,328,0,363,7,390,25,410,51,423,81,427,111,16383,16383,249,123,259,136,270,149,285,161,304,170,328,173,352,169,371,157,385,138,394,115,397,89,394,70,387,54,377,41,363,33,347,30,327,33,308,45,290,63,270,89,249,121,16383,16383,217,90,207,78,195,66,179,54,159,45,134,42,110,47,91,59,77,78,68,101,65,126,67,144,74,161,85,174,99,182,115,185,135,181,155,169,175,150,195,124,217,92,
 228,73,246,47,228,73,228,73,246,47,239,142,228,73,239,142,217,92,217,92,213,174,195,124,195,124,213,174,191,195,195,124,191,195,175,150,175,150,191,195,171,207,175,150,171,207,155,169,155,169,171,207,151,213,155,169,151,213,135,181,135,181,151,213,131,215,135,181,131,215,115,185,67,144,74,161,84,201,84,201,74,161,85,174,84,201,85,174,110,212,110,212,85,174,99,182,110,212,99,182,115,185,35,100,40,63,42,147,42,147,40,63,54,35,42,147,54,35,60,180,60,180,54,35,73,15,60,180,73,15,65,126,65,126,67,144,60,180,60,180,67,144,84,201,217,90,207,78,213,47,213,47,207,78,195,66,213,47,195,66,195,27,195,27,195,66,179,54,195,27,179,54,174,12,174,12,179,54,159,45,174,12,159,45,150,3,150,3,159,45,134,42,150,3,134,42,123,0,123,0,134,42,110,47,123,0,110,47,97,4,97,4,110,47,91,59,97,4,91,59,77,78,73,15,97,4,77,78,73,15,77,78,68,101,73,15,68,101,65,126,336,215,328,173,352,169,336,215,352,169,363,210,363,210,352,169,371,157,363,210,371,157,387,198,387,198,371,157,385,138,387,198,385,138,394,115,270,149,285,161,287,201,287,201,285,161,304,170,287,201,304,170,309,211,309,211,304,170,328,173,309,211,328,173,336,215,239,142,249,123,253,165,253,165,249,123,259,136,253,165,259,136,269,185,269,185,259,136,270,149,269,185,270,149,287,201,264,27,249,121,246,47,246,47,249,121,249,123,246,47,249,123,239,142,249,121,264,27,270,89,270,89,264,27,284,12,270,89,284,12,290,63,290,63,284,12,305,3,290,63,305,3,308,45,308,45,305,3,328,0,308,45,328,0,327,33,327,33,328,0,347,30,363,33,347,30,363,7,363,33,363,7,390,25,387,198,394,115,408,177,408,177,394,115,397,89,410,51,397,89,394,70,410,51,394,70,390,25,390,25,394,70,387,54,390,25,387,54,377,41,422,148,408,177,410,51,422,148,410,51,423,81,422,148,423,81,427,111,347,30,328,0,363,7,213,174,217,92,239,142,228,73,217,92,217,90,228,73,217,90,213,47,115,185,131,215,110,212,363,33,390,25,377,41,397,89,410,51,408,177,
-317,0,317,33,58,33,58,292,25,292,25,0,321,0,321,33,91,33,310,252,285,273,12,0,
+317,0,317,33,58,33,58,292,25,292,25,0,
 58,33,58,292,25,292,58,33,25,292,25,0,58,33,25,0,317,0,58,33,317,0,317,33,
-321,0,321,33,91,33,310,252,285,273,12,0,321,0,321,33,271,33,265,61,257,88,247,113,
+321,0,321,33,91,33,310,252,285,273,12,0,
 91,33,310,252,285,273,91,33,285,273,12,0,91,33,12,0,321,0,91,33,321,0,321,33,
-321,0,321,33,271,33,265,61,257,88,247,113,233,138,218,160,310,252,284,273,196,185,186,195,174,205,169,209,148,182,168,166,172,161,11,0,239,0,239,-18,238,-24,238,-30,270,-35,272,-21,272,0,16383,16383,90,33,194,137,207,118,217,98,226,77,233,56,237,33,326,40,281,59,284,72,286,86,288,99,290,127,289,140,288,154,286,168,280,196,326,216,314,246,269,228,266,234,263,241,257,253,253,259,225,243,228,237,231,232,233,226,236,220,238,215,28,127,239,40,237,34,234,29,232,23,229,17,225,12,254,-5,258,1,261,8,
+321,0,321,33,271,33,265,61,257,88,247,113,233,138,218,160,310,252,284,273,196,185,186,195,174,205,169,209,148,182,168,166,172,161,11,0,239,0,239,-18,238,-24,238,-30,270,-35,272,-21,272,0,16383,16383,90,33,194,137,207,118,217,98,226,77,233,56,237,33,
 90,33,194,137,172,161,172,161,174,205,169,209,172,161,169,209,168,166,168,166,169,209,163,170,169,209,148,182,153,178,169,209,153,178,158,174,169,209,158,174,163,170,194,137,207,118,196,185,196,185,207,118,218,160,196,185,218,160,284,273,284,273,218,160,310,252,207,118,217,98,218,160,218,160,217,98,226,77,218,160,226,77,233,138,233,138,226,77,233,56,233,138,233,56,237,33,194,137,196,185,191,190,194,137,191,190,186,195,194,137,186,195,180,200,194,137,180,200,174,205,194,137,174,205,172,161,233,138,237,33,247,113,239,0,237,33,90,33,239,0,90,33,11,0,11,0,90,33,172,161,265,61,257,88,270,-35,270,-35,257,88,247,113,270,-35,247,113,239,0,239,0,247,113,237,33,272,0,321,0,321,33,272,0,321,33,271,33,272,0,271,33,271,-28,272,0,271,-28,272,-21,272,0,272,-21,272,-14,272,0,272,-14,272,-6,271,33,265,61,270,-35,271,33,270,-35,271,-28,270,-35,239,0,239,-5,270,-35,239,-5,239,-12,270,-35,239,-12,239,-18,270,-35,239,-18,238,-24,270,-35,238,-24,238,-30,
-326,40,281,59,284,72,286,86,288,99,290,127,289,140,288,154,286,168,280,196,326,216,314,246,269,228,266,234,263,241,257,253,253,259,225,243,228,237,231,232,233,226,236,220,238,215,28,127,239,40,237,34,234,29,232,23,229,17,225,12,254,-5,258,1,261,8,265,14,268,21,270,27,314,9,16383,16383,114,127,249,184,252,172,254,161,255,149,257,127,256,115,254,93,252,82,249,71,83,-93,83,345,50,345,50,-93,190,152,179,178,118,147,118,345,84,345,84,130,12,93,23,66,84,98,84,-93,118,-93,118,114,197,-93,197,345,164,345,164,-93,16383,16383,98,-93,98,345,65,345,65,-93,293,181,281,207,219,175,219,345,185,345,185,158,119,125,119,345,86,345,86,108,12,70,23,44,86,75,86,-93,119,-93,119,93,185,126,185,-93,219,-93,219,143,295,-14,157,268,152,268,
+326,40,281,59,284,72,286,86,288,99,290,127,289,140,288,154,286,168,280,196,326,216,314,246,269,228,266,234,263,241,257,253,253,259,225,243,228,237,231,232,233,226,236,220,238,215,28,127,239,40,237,34,234,29,232,23,229,17,225,12,254,-5,258,1,261,8,265,14,268,21,270,27,314,9,16383,16383,114,127,249,184,252,172,254,161,255,149,257,127,256,115,254,93,252,82,249,71,
 256,115,258,1,257,127,257,127,258,1,260,247,260,247,258,1,261,8,260,247,261,8,263,241,263,241,261,8,265,14,263,241,265,14,266,234,266,234,265,14,268,21,266,234,268,21,269,228,269,228,268,21,270,27,269,228,270,27,280,196,280,196,270,27,281,59,280,196,281,59,283,182,283,182,281,59,284,72,283,182,284,72,286,168,286,168,284,72,286,86,286,168,286,86,288,154,288,154,286,86,288,99,288,154,288,99,289,140,289,140,288,99,289,113,289,140,289,113,290,127,314,9,326,40,281,59,314,9,281,59,270,27,314,246,269,228,280,196,314,246,280,196,326,216,255,149,256,138,257,253,257,253,256,138,257,127,257,253,257,127,260,247,249,184,252,172,253,259,253,259,252,172,254,161,253,259,254,161,257,253,257,253,254,161,255,149,253,259,225,243,228,237,253,259,228,237,231,232,253,259,231,232,233,226,253,259,233,226,236,220,253,259,236,220,238,215,253,259,238,215,249,184,255,104,254,93,254,-5,255,104,254,-5,258,1,255,104,258,1,256,115,254,-5,254,93,252,82,254,-5,252,82,249,71,254,-5,249,71,239,40,254,-5,239,40,237,34,254,-5,237,34,234,29,254,-5,234,29,232,23,254,-5,232,23,229,17,254,-5,229,17,225,12,238,215,28,127,114,127,114,127,28,127,239,40,114,127,239,40,249,71,238,215,114,127,249,184,
-83,-93,83,345,50,345,50,-93,190,152,179,178,118,147,118,345,
+83,-93,83,345,50,345,50,-93,
 83,-93,83,345,50,345,83,-93,50,345,50,-93,
-190,152,179,178,118,147,118,345,84,345,84,130,12,93,23,66,84,98,84,-93,118,-93,118,114,197,-93,197,345,164,345,164,-93,16383,16383,98,-93,98,345,65,345,65,-93,293,181,281,207,219,175,
+190,152,179,178,118,147,118,345,84,345,84,130,12,93,23,66,84,98,84,-93,118,-93,118,114,
 84,130,12,93,23,66,84,130,23,66,84,98,84,130,84,98,118,-93,84,130,118,-93,84,345,84,345,118,-93,118,345,118,147,118,114,190,152,118,147,190,152,179,178,118,-93,84,98,84,-93,
-197,-93,197,345,164,345,164,-93,16383,16383,98,-93,98,345,65,345,65,-93,293,181,281,207,219,175,219,345,185,345,185,158,119,125,119,345,86,345,
+197,-93,197,345,164,345,164,-93,16383,16383,98,-93,98,345,65,345,65,-93,
 164,345,164,-93,197,-93,164,345,197,-93,197,345,65,345,65,-93,98,-93,65,345,98,-93,98,345,
-293,181,281,207,219,175,219,345,185,345,185,158,119,125,119,345,86,345,86,108,12,70,23,44,86,75,86,-93,119,-93,119,93,185,126,185,-93,219,-93,219,143,295,-14,157,268,152,268,16,-14,47,-14,155,201,262,-14,295,268,263,268,156,52,48,268,16,268,153,-14,158,-14,286,-15,286,132,280,177,261,215,233,243,197,261,
+293,181,281,207,219,175,219,345,185,345,185,158,119,125,119,345,86,345,86,108,12,70,23,44,86,75,86,-93,119,-93,119,93,185,126,185,-93,219,-93,219,143,
 86,108,12,70,23,44,86,108,23,44,86,75,86,108,86,75,119,-93,86,108,119,-93,86,345,219,345,185,345,219,-93,219,-93,185,345,185,158,219,-93,185,158,185,126,185,126,185,158,119,125,185,126,119,125,119,93,119,-93,119,345,86,345,219,143,293,181,219,175,219,175,293,181,281,207,219,-93,185,126,185,-93,119,-93,86,75,86,-93,
-295,-14,157,268,152,268,16,-14,47,-14,155,201,262,-14,295,268,263,268,156,52,48,268,16,268,153,-14,158,-14,
+295,-14,157,268,152,268,16,-14,47,-14,155,201,262,-14,
 16,-14,47,-14,152,268,152,268,47,-14,155,201,152,268,155,201,157,268,157,268,155,201,262,-14,157,268,262,-14,295,-14,
-295,268,263,268,156,52,48,268,16,268,153,-14,158,-14,286,-15,286,132,280,177,261,215,233,243,197,261,155,268,
+295,268,263,268,156,52,48,268,16,268,153,-14,158,-14,
 295,268,263,268,158,-14,158,-14,263,268,156,52,158,-14,156,52,153,-14,153,-14,156,52,48,268,153,-14,48,268,16,268,
-286,-15,286,132,280,177,261,215,233,243,197,261,155,268,113,262,77,244,49,216,30,178,24,134,24,-15,57,-15,57,132,62,165,76,193,97,215,124,230,155,235,186,230,212,215,234,193,248,165,253,132,253,-15,286,268,253,268,253,120,248,87,234,59,212,37,186,23,155,17,124,23,97,37,76,60,62,88,57,121,57,268,24,268,24,118,30,74,49,37,77,9,113,-8,155,-15,197,-8,233,9,261,38,280,75,286,120,
+286,-15,286,132,280,177,261,215,233,243,197,261,155,268,113,262,77,244,49,216,30,178,24,134,24,-15,57,-15,57,132,62,165,76,193,97,215,124,230,155,235,186,230,212,215,234,193,248,165,253,132,253,-15,
 253,132,253,132,248,165,248,165,253,132,261,215,248,165,261,215,234,193,234,193,261,215,233,243,234,193,233,243,212,215,212,215,233,243,197,261,212,215,197,261,186,230,186,230,197,261,155,235,124,230,155,235,155,268,124,230,155,268,113,262,62,165,76,193,77,244,77,244,76,193,97,215,77,244,97,215,113,262,113,262,97,215,124,230,49,216,30,178,57,-15,49,216,57,-15,57,132,49,216,57,132,62,165,49,216,62,165,77,244,24,134,24,-15,57,-15,24,134,57,-15,30,178,197,261,155,268,155,235,286,-15,286,132,280,177,286,-15,280,177,261,215,286,-15,261,215,253,132,286,-15,253,132,253,-15,
-286,268,253,268,253,120,248,87,234,59,212,37,186,23,155,17,124,23,97,37,76,60,62,88,57,121,57,268,24,268,24,118,30,74,49,37,77,9,113,-8,155,-15,197,-8,233,9,261,38,280,75,286,120,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,18,-143,22,-150,28,-155,
+286,268,253,268,253,120,248,87,234,59,212,37,186,23,155,17,124,23,97,37,76,60,62,88,57,121,57,268,24,268,24,118,30,74,49,37,77,9,113,-8,155,-15,197,-8,233,9,261,38,280,75,286,120,
 253,120,248,87,261,38,261,38,248,87,234,59,261,38,234,59,233,9,233,9,234,59,212,37,233,9,212,37,197,-8,197,-8,212,37,186,23,197,-8,186,23,155,-15,155,-15,186,23,155,17,286,268,253,268,261,38,286,268,261,38,280,75,286,268,280,75,286,120,76,60,77,9,97,37,97,37,77,9,113,-8,97,37,113,-8,124,23,124,23,113,-8,155,-15,124,23,155,-15,155,17,62,88,57,121,49,37,62,88,49,37,77,9,62,88,77,9,76,60,57,268,24,268,30,74,57,268,30,74,49,37,57,268,49,37,57,121,30,74,24,268,24,118,253,120,261,38,253,268,
-102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,18,-143,22,-150,28,-155,37,-158,49,-159,78,-153,102,-135,119,-111,131,-84,140,-58,231,308,239,337,247,362,257,380,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,318,396,314,402,307,407,298,411,287,412,255,404,231,385,213,359,201,330,193,303,223,-61,215,-89,207,-112,198,-129,188,-140,175,-144,173,-143,172,-143,170,-142,170,-140,171,-137,173,-135,175,-132,178,-127,179,-120,178,-116,175,-112,172,-109,168,-108,163,-107,155,-109,148,-113,142,-119,139,-127,137,-136,138,-143,141,-150,146,-155,154,-158,165,-159,195,-153,219,-135,238,-111,252,-84,261,-58,352,308,360,337,368,362,378,380,389,393,402,397,404,397,406,396,408,394,408,392,407,390,405,387,402,384,400,379,399,372,400,368,402,364,410,360,415,360,423,361,430,366,435,372,439,380,440,390,439,396,436,402,431,407,424,411,413,412,381,404,355,385,336,359,
+102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,18,-143,22,-150,28,-155,37,-158,49,-159,78,-153,102,-135,119,-111,131,-84,140,-58,231,308,239,337,247,362,257,380,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,318,396,314,402,307,407,298,411,287,412,255,404,231,385,213,359,201,330,193,303,
 49,-140,49,-137,51,-109,51,-109,49,-137,52,-135,51,-109,52,-135,54,-112,54,-112,52,-135,54,-132,54,-112,54,-132,57,-116,57,-116,54,-132,57,-127,57,-116,57,-127,57,-120,18,-127,18,-143,21,-119,21,-119,18,-143,22,-150,21,-119,22,-150,27,-113,27,-113,22,-150,28,-155,27,-113,28,-155,34,-109,34,-109,28,-155,37,-158,34,-109,37,-158,42,-107,42,-107,37,-158,49,-159,42,-107,49,-159,46,-108,46,-108,49,-159,49,-140,86,-112,77,-129,78,-153,78,-153,77,-129,67,-140,78,-153,67,-140,54,-144,54,-144,52,-143,78,-153,78,-153,52,-143,50,-143,78,-153,50,-143,49,-159,49,-159,50,-143,49,-142,49,-159,49,-142,49,-141,285,396,287,412,283,397,283,397,287,412,281,397,268,393,281,397,287,412,268,393,287,412,255,404,289,360,294,360,298,411,298,411,294,360,302,361,298,411,302,361,307,407,307,407,302,361,309,366,307,407,309,366,314,402,314,402,309,366,315,372,314,402,315,372,318,396,318,396,315,372,318,380,318,396,318,380,320,390,279,379,279,368,281,384,281,384,279,368,281,364,281,384,281,364,284,387,284,387,281,364,285,362,284,387,285,362,286,390,286,390,285,362,289,360,286,390,289,360,287,392,287,392,289,360,298,411,287,412,285,396,286,395,287,412,286,395,287,394,287,412,287,394,287,392,287,412,287,392,298,411,255,404,231,385,231,308,255,404,231,308,239,337,255,404,239,337,247,362,255,404,247,362,257,380,255,404,257,380,268,393,231,308,231,385,213,359,231,308,213,359,201,330,231,308,201,330,193,303,231,308,193,303,140,-58,94,-89,102,-135,102,-61,102,-61,102,-135,119,-111,102,-61,119,-111,193,303,193,303,119,-111,131,-84,193,303,131,-84,140,-58,86,-112,78,-153,102,-135,86,-112,102,-135,94,-89,49,-140,49,-159,49,-141,279,368,279,379,278,372,18,-143,18,-127,16,-136,46,-108,49,-140,51,-109,
-223,-61,215,-89,207,-112,198,-129,188,-140,175,-144,173,-143,172,-143,170,-142,170,-140,171,-137,173,-135,175,-132,178,-127,179,-120,178,-116,175,-112,172,-109,168,-108,163,-107,155,-109,148,-113,142,-119,139,-127,137,-136,138,-143,141,-150,146,-155,154,-158,165,-159,195,-153,219,-135,238,-111,252,-84,261,-58,352,308,360,337,368,362,378,380,389,393,402,397,404,397,406,396,408,394,408,392,407,390,405,387,402,384,400,379,399,372,400,368,402,364,410,360,415,360,423,361,430,366,435,372,439,380,440,390,439,396,436,402,431,407,424,411,413,412,381,404,355,385,336,359,323,330,314,303,16383,16383,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,17,-143,20,-150,25,-155,33,-158,44,-159,74,-153,98,-135,117,-111,131,-84,140,-58,231,308,239,337,247,362,257,380,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,319,396,316,402,310,407,302,411,292,412,260,404,234,385,215,359,201,330,193,303,344,-61,336,-89,328,-112,319,-129,309,-140,296,-144,294,-143,293,-143,291,-141,291,-140,292,-137,297,-132,299,-127,300,-120,299,-116,296,-112,293,-109,288,-108,284,-107,276,-109,269,-113,263,-119,259,-127,258,-136,259,-143,262,-150,267,-155,275,-158,286,-159,316,-153,341,-135,359,-111,373,-84,382,-58,473,308,481,337,489,362,499,380,510,393,523,397,525,397,527,396,529,394,529,392,528,390,526,387,523,384,521,379,520,372,521,368,523,364,531,360,536,360,544,361,551,366,556,372,560,380,561,390,560,396,558,402,552,407,545,411,534,412,502,404,476,385,457,359,443,330,435,303,16383,16383,223,-61,215,-89,207,-112,198,-129,187,-140,175,-144,173,-143,171,-143,169,-141,169,-140,170,-137,175,-132,177,-127,178,-120,177,-116,175,-112,171,-109,167,-108,162,-107,154,-109,147,-113,142,-119,138,-127,137,-136,138,-143,141,-150,146,-155,154,-158,164,-159,194,-153,219,-135,238,-111,251,-84,260,-58,352,308,359,337,368,362,377,380,388,393,402,397,404,397,405,396,407,395,407,392,406,390,402,384,399,379,398,372,399,368,402,364,405,362,409,360,414,360,422,361,429,366,435,372,438,380,440,390,439,396,436,402,431,407,423,411,412,412,380,404,355,385,336,359,322,330,314,303,
+223,-61,215,-89,207,-112,198,-129,188,-140,175,-144,173,-143,172,-143,170,-142,170,-140,171,-137,173,-135,175,-132,178,-127,179,-120,178,-116,175,-112,172,-109,168,-108,163,-107,155,-109,148,-113,142,-119,139,-127,137,-136,138,-143,141,-150,146,-155,154,-158,165,-159,195,-153,219,-135,238,-111,252,-84,261,-58,352,308,360,337,368,362,378,380,389,393,402,397,404,397,406,396,408,394,408,392,407,390,405,387,402,384,400,379,399,372,400,368,402,364,410,360,415,360,423,361,430,366,435,372,439,380,440,390,439,396,436,402,431,407,424,411,413,412,381,404,355,385,336,359,323,330,314,303,16383,16383,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,17,-143,20,-150,25,-155,33,-158,44,-159,74,-153,98,-135,117,-111,131,-84,140,-58,231,308,239,337,247,362,257,380,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,319,396,316,402,310,407,302,411,292,412,260,404,234,385,215,359,201,330,193,303,
 49,-137,51,-109,49,-140,49,-140,46,-108,44,-159,44,-159,46,-108,42,-107,44,-159,42,-107,34,-109,51,-109,52,-135,54,-112,54,-112,52,-135,54,-132,54,-112,54,-132,57,-116,57,-116,54,-132,57,-127,57,-116,57,-127,57,-120,94,-89,86,-112,98,-135,98,-135,86,-112,77,-129,98,-135,77,-129,74,-153,74,-153,77,-129,67,-140,74,-153,67,-140,54,-144,54,-144,52,-143,74,-153,74,-153,52,-143,50,-143,74,-153,50,-143,44,-159,44,-159,50,-143,49,-142,44,-159,49,-142,49,-141,171,-137,172,-109,170,-140,170,-140,168,-108,165,-159,165,-159,168,-108,163,-107,165,-159,163,-107,155,-109,172,-109,173,-135,175,-112,175,-112,173,-135,175,-132,175,-112,175,-132,178,-116,178,-116,175,-132,178,-127,178,-116,178,-127,179,-120,215,-89,207,-112,219,-135,219,-135,207,-112,198,-129,219,-135,198,-129,195,-153,195,-153,198,-129,188,-140,195,-153,188,-140,175,-144,175,-144,173,-143,195,-153,195,-153,173,-143,172,-143,195,-153,172,-143,165,-159,165,-159,172,-143,170,-142,165,-159,170,-142,170,-141,285,396,292,412,283,397,283,397,292,412,281,397,268,393,281,397,292,412,268,393,292,412,260,404,302,361,302,411,294,360,294,360,302,411,292,412,294,360,292,412,289,360,289,360,292,412,287,392,289,360,287,392,286,390,289,360,286,390,285,362,285,362,286,390,284,387,285,362,284,387,281,364,281,364,284,387,281,384,281,364,281,384,279,368,279,368,281,384,279,379,279,368,279,379,278,372,320,390,319,396,318,380,318,380,319,396,316,402,318,380,316,402,315,372,315,372,316,402,310,407,315,372,310,407,309,366,309,366,310,407,302,411,309,366,302,411,302,361,292,412,285,396,286,395,292,412,286,395,287,394,292,412,287,394,287,392,260,404,234,385,239,337,260,404,239,337,247,362,260,404,247,362,257,380,260,404,257,380,268,393,231,308,239,337,234,385,231,308,234,385,215,359,231,308,215,359,201,330,231,308,201,330,193,303,231,308,193,303,140,-58,94,-89,98,-135,102,-61,102,-61,98,-135,117,-111,102,-61,117,-111,193,303,193,303,117,-111,131,-84,193,303,131,-84,140,-58,49,-140,44,-159,49,-141,16,-136,17,-143,18,-127,18,-127,17,-143,20,-150,18,-127,20,-150,21,-119,21,-119,20,-150,25,-155,21,-119,25,-155,27,-113,27,-113,25,-155,33,-158,27,-113,33,-158,34,-109,34,-109,33,-158,44,-159,406,396,413,412,404,397,404,397,413,412,402,397,389,393,402,397,413,412,389,393,413,412,381,404,423,361,424,411,415,360,415,360,424,411,413,412,415,360,413,412,410,360,410,360,413,412,408,392,410,360,408,392,407,390,410,360,407,390,406,362,406,362,407,390,405,387,406,362,405,387,402,364,402,364,405,387,402,384,402,364,402,384,400,379,400,379,399,372,400,368,400,379,400,368,402,364,440,390,439,396,439,380,439,380,439,396,436,402,439,380,436,402,435,372,435,372,436,402,431,407,435,372,431,407,430,366,430,366,431,407,424,411,430,366,424,411,423,361,413,412,406,396,407,395,413,412,407,395,408,394,413,412,408,394,408,392,381,404,355,385,360,337,381,404,360,337,368,362,381,404,368,362,378,380,381,404,378,380,389,393,352,308,360,337,355,385,352,308,355,385,336,359,352,308,336,359,323,330,352,308,323,330,314,303,352,308,314,303,261,-58,215,-89,219,-135,223,-61,223,-61,219,-135,238,-111,223,-61,238,-111,314,303,314,303,238,-111,252,-84,314,303,252,-84,261,-58,170,-140,165,-159,170,-141,137,-136,138,-143,139,-127,139,-127,138,-143,141,-150,139,-127,141,-150,142,-119,142,-119,141,-150,146,-155,142,-119,146,-155,148,-113,148,-113,146,-155,154,-158,148,-113,154,-158,155,-109,155,-109,154,-158,165,-159,168,-108,170,-140,172,-109,172,-109,171,-137,173,-135,46,-108,49,-140,51,-109,51,-109,49,-137,52,-135,
-344,-61,336,-89,328,-112,319,-129,309,-140,296,-144,294,-143,293,-143,291,-141,291,-140,292,-137,297,-132,299,-127,300,-120,299,-116,296,-112,293,-109,288,-108,284,-107,276,-109,269,-113,263,-119,259,-127,258,-136,259,-143,262,-150,267,-155,275,-158,286,-159,316,-153,341,-135,359,-111,373,-84,382,-58,473,308,481,337,489,362,499,380,510,393,523,397,525,397,527,396,529,394,529,392,528,390,526,387,523,384,521,379,520,372,521,368,523,364,531,360,536,360,544,361,551,366,556,372,560,380,561,390,560,396,558,402,552,407,545,411,534,412,502,404,476,385,457,359,443,330,435,303,16383,16383,223,-61,215,-89,207,-112,198,-129,187,-140,175,-144,173,-143,171,-143,169,-141,169,-140,170,-137,175,-132,177,-127,178,-120,177,-116,175,-112,171,-109,167,-108,162,-107,154,-109,147,-113,142,-119,138,-127,137,-136,138,-143,141,-150,146,-155,154,-158,164,-159,194,-153,219,-135,238,-111,251,-84,260,-58,352,308,359,337,368,362,377,380,388,393,402,397,404,397,405,396,407,395,407,392,406,390,402,384,399,379,398,372,399,368,402,364,405,362,409,360,414,360,422,361,429,366,435,372,438,380,440,390,439,396,436,402,431,407,423,411,412,412,380,404,355,385,336,359,322,330,314,303,16383,16383,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,17,-143,20,-150,25,-155,33,-158,44,-159,74,-153,98,-135,117,-111,131,-84,140,-58,231,308,239,337,247,362,257,380,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,319,396,316,402,310,407,302,411,292,412,260,404,234,385,215,359,201,330,193,303,176,238,167,238,131,232,101,216,76,192,60,161,55,126,58,99,67,74,81,53,100,35,123,22,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,18,-143,22,-150,28,-155,37,-158,49,-159,78,-153,102,-135,119,-111,131,-84,140,-58,157,13,167,13,202,19,233,35,258,59,274,90,280,126,276,152,267,177,253,199,234,216,211,229,231,308,239,337,247,362,257,381,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,318,396,314,402,307,407,298,411,287,412,255,404,231,385,213,358,201,330,193,303,16383,16383,162,32,206,210,224,199,239,185,251,167,258,147,261,126,256,96,243,70,222,50,197,37,167,32,16383,16383,172,219,127,41,109,52,95,66,83,84,76,104,74,126,78,155,92,181,112,201,137,214,167,219,296,231,284,234,271,236,258,237,244,238,214,238,231,308,239,337,247,362,257,380,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,319,396,316,402,310,407,302,411,292,412,260,404,234,385,215,358,201,330,193,303,175,233,135,222,101,204,76,182,61,155,55,126,58,104,67,84,82,65,102,48,126,35,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,17,-143,20,-150,25,-155,33,-158,44,-159,74,-153,99,-135,117,-111,131,-84,140,-58,160,22,172,19,200,15,230,13,
+344,-61,336,-89,328,-112,319,-129,309,-140,296,-144,294,-143,293,-143,291,-141,291,-140,292,-137,297,-132,299,-127,300,-120,299,-116,296,-112,293,-109,288,-108,284,-107,276,-109,269,-113,263,-119,259,-127,258,-136,259,-143,262,-150,267,-155,275,-158,286,-159,316,-153,341,-135,359,-111,373,-84,382,-58,473,308,481,337,489,362,499,380,510,393,523,397,525,397,527,396,529,394,529,392,528,390,526,387,523,384,521,379,520,372,521,368,523,364,531,360,536,360,544,361,551,366,556,372,560,380,561,390,560,396,558,402,552,407,545,411,534,412,502,404,476,385,457,359,443,330,435,303,16383,16383,223,-61,215,-89,207,-112,198,-129,187,-140,175,-144,173,-143,171,-143,169,-141,169,-140,170,-137,175,-132,177,-127,178,-120,177,-116,175,-112,171,-109,167,-108,162,-107,154,-109,147,-113,142,-119,138,-127,137,-136,138,-143,141,-150,146,-155,154,-158,164,-159,194,-153,219,-135,238,-111,251,-84,260,-58,352,308,359,337,368,362,377,380,388,393,402,397,404,397,405,396,407,395,407,392,406,390,402,384,399,379,398,372,399,368,402,364,405,362,409,360,414,360,422,361,429,366,435,372,438,380,440,390,439,396,436,402,431,407,423,411,412,412,380,404,355,385,336,359,322,330,314,303,16383,16383,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,17,-143,20,-150,25,-155,33,-158,44,-159,74,-153,98,-135,117,-111,131,-84,140,-58,231,308,239,337,247,362,257,380,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,319,396,316,402,310,407,302,411,292,412,260,404,234,385,215,359,201,330,193,303,
 49,-137,51,-109,49,-140,49,-140,46,-108,44,-159,44,-159,46,-108,42,-107,44,-159,42,-107,34,-109,51,-109,52,-135,54,-112,54,-112,52,-135,54,-132,54,-112,54,-132,57,-116,57,-116,54,-132,57,-127,57,-116,57,-127,57,-120,94,-89,86,-112,98,-135,98,-135,86,-112,77,-129,98,-135,77,-129,74,-153,74,-153,77,-129,67,-140,74,-153,67,-140,54,-144,54,-144,52,-143,74,-153,74,-153,52,-143,50,-143,74,-153,50,-143,44,-159,44,-159,50,-143,49,-142,44,-159,49,-142,49,-141,170,-137,171,-109,169,-140,169,-140,167,-108,164,-159,164,-159,167,-108,162,-107,164,-159,162,-107,154,-109,171,-109,172,-135,175,-112,175,-112,172,-135,175,-132,175,-112,175,-132,177,-116,177,-116,175,-132,177,-127,177,-116,177,-127,178,-120,215,-89,207,-112,219,-135,219,-135,207,-112,198,-129,219,-135,198,-129,194,-153,194,-153,198,-129,187,-140,194,-153,187,-140,175,-144,175,-144,173,-143,194,-153,194,-153,173,-143,171,-143,194,-153,171,-143,164,-159,164,-159,171,-143,170,-142,164,-159,170,-142,169,-141,285,396,292,412,283,397,283,397,292,412,281,397,268,393,281,397,292,412,268,393,292,412,260,404,302,361,302,411,294,360,294,360,302,411,292,412,294,360,292,412,289,360,289,360,292,412,287,392,289,360,287,392,286,390,289,360,286,390,285,362,285,362,286,390,284,387,285,362,284,387,281,364,281,364,284,387,281,384,281,364,281,384,279,368,279,368,281,384,279,379,279,368,279,379,278,372,292,-137,293,-109,291,-140,291,-140,288,-108,286,-159,286,-159,288,-108,284,-107,286,-159,284,-107,276,-109,293,-109,294,-135,296,-112,296,-112,294,-135,297,-132,296,-112,297,-132,299,-116,299,-116,297,-132,299,-127,299,-116,299,-127,300,-120,320,390,319,396,318,380,318,380,319,396,316,402,318,380,316,402,315,372,315,372,316,402,310,407,315,372,310,407,309,366,309,366,310,407,302,411,309,366,302,411,302,361,292,412,285,396,286,395,292,412,286,395,287,394,292,412,287,394,287,392,260,404,234,385,239,337,260,404,239,337,247,362,260,404,247,362,257,380,260,404,257,380,268,393,231,308,239,337,234,385,231,308,234,385,215,359,231,308,215,359,201,330,231,308,201,330,193,303,231,308,193,303,140,-58,94,-89,98,-135,102,-61,102,-61,98,-135,117,-111,102,-61,117,-111,193,303,193,303,117,-111,131,-84,193,303,131,-84,140,-58,49,-140,44,-159,49,-141,16,-136,17,-143,18,-127,18,-127,17,-143,20,-150,18,-127,20,-150,21,-119,21,-119,20,-150,25,-155,21,-119,25,-155,27,-113,27,-113,25,-155,33,-158,27,-113,33,-158,34,-109,34,-109,33,-158,44,-159,336,-89,328,-112,341,-135,341,-135,328,-112,319,-129,341,-135,319,-129,316,-153,316,-153,319,-129,309,-140,316,-153,309,-140,296,-144,296,-144,294,-143,316,-153,316,-153,294,-143,293,-143,316,-153,293,-143,286,-159,286,-159,293,-143,292,-142,286,-159,292,-142,291,-141,405,396,412,412,404,397,404,397,412,412,402,397,388,393,402,397,412,412,388,393,412,412,380,404,422,361,423,411,414,360,414,360,423,411,412,412,414,360,412,412,409,360,409,360,412,412,407,392,409,360,407,392,406,390,409,360,406,390,405,362,405,362,406,390,404,387,405,362,404,387,402,364,402,364,404,387,402,384,402,364,402,384,399,379,399,379,398,372,399,368,399,379,399,368,402,364,440,390,439,396,438,380,438,380,439,396,436,402,438,380,436,402,435,372,435,372,436,402,431,407,435,372,431,407,429,366,429,366,431,407,423,411,429,366,423,411,422,361,412,412,405,396,407,395,412,412,407,395,407,394,412,412,407,394,407,392,380,404,355,385,359,337,380,404,359,337,368,362,380,404,368,362,377,380,380,404,377,380,388,393,352,308,359,337,355,385,352,308,355,385,336,359,352,308,336,359,322,330,352,308,322,330,314,303,352,308,314,303,260,-58,215,-89,219,-135,223,-61,223,-61,219,-135,238,-111,223,-61,238,-111,314,303,314,303,238,-111,251,-84,314,303,251,-84,260,-58,169,-140,164,-159,169,-141,137,-136,138,-143,138,-127,138,-127,138,-143,141,-150,138,-127,141,-150,142,-119,142,-119,141,-150,146,-155,142,-119,146,-155,147,-113,147,-113,146,-155,154,-158,147,-113,154,-158,154,-109,154,-109,154,-158,164,-159,435,303,344,-61,359,-111,435,303,359,-111,373,-84,435,303,373,-84,382,-58,435,303,382,-58,473,308,435,303,473,308,443,330,344,-61,336,-89,341,-135,344,-61,341,-135,359,-111,291,-140,286,-159,291,-141,258,-136,259,-143,259,-127,259,-127,259,-143,262,-150,259,-127,262,-150,263,-119,263,-119,262,-150,267,-155,263,-119,267,-155,269,-113,269,-113,267,-155,275,-158,269,-113,275,-158,276,-109,276,-109,275,-158,286,-159,527,396,534,412,525,397,525,397,534,412,523,397,510,393,523,397,534,412,510,393,534,412,502,404,544,361,545,411,536,360,536,360,545,411,534,412,536,360,534,412,531,360,531,360,534,412,529,392,531,360,529,392,528,390,531,360,528,390,527,362,527,362,528,390,526,387,527,362,526,387,523,364,523,364,526,387,523,384,523,364,523,384,521,379,521,379,520,372,521,368,521,379,521,368,523,364,561,390,560,396,560,380,560,380,560,396,558,402,560,380,558,402,556,372,556,372,558,402,552,407,556,372,552,407,551,366,551,366,552,407,545,411,551,366,545,411,544,361,534,412,527,396,528,395,534,412,528,395,529,394,534,412,529,394,529,392,502,404,476,385,481,337,502,404,481,337,489,362,502,404,489,362,499,380,502,404,499,380,510,393,473,308,481,337,476,385,473,308,476,385,457,359,473,308,457,359,443,330,288,-108,291,-140,293,-109,293,-109,292,-137,294,-135,167,-108,169,-140,171,-109,171,-109,170,-137,172,-135,46,-108,49,-140,51,-109,51,-109,49,-137,52,-135,
-176,238,167,238,131,232,101,216,76,192,60,161,55,126,58,99,67,74,81,53,100,35,123,22,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,18,-143,22,-150,28,-155,37,-158,49,-159,78,-153,102,-135,119,-111,131,-84,140,-58,157,13,167,13,202,19,233,35,258,59,274,90,280,126,276,152,267,177,253,199,234,216,211,229,231,308,239,337,247,362,257,381,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,318,396,314,402,307,407,298,411,287,412,255,404,231,385,213,358,201,330,193,303,16383,16383,162,32,206,210,224,199,239,185,251,167,258,147,261,126,256,96,243,70,222,50,197,37,167,32,16383,16383,172,219,127,41,109,52,95,66,83,84,76,104,74,126,78,155,92,181,112,201,137,214,167,219,296,231,284,234,271,236,258,237,244,238,214,238,231,308,239,337,247,362,257,380,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,319,396,316,402,310,407,302,411,292,412,260,404,234,385,215,358,201,330,193,303,175,233,135,222,101,204,76,182,61,155,55,126,58,104,67,84,82,65,102,48,126,35,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,17,-143,20,-150,25,-155,33,-158,44,-159,74,-153,99,-135,117,-111,131,-84,140,-58,160,22,172,19,200,15,230,13,235,13,237,14,242,14,223,-61,216,-89,208,-112,199,-129,188,-140,175,-144,173,-143,172,-143,170,-142,170,-140,171,-137,173,-135,175,-132,178,-127,179,-120,178,-116,175,-112,172,-109,168,-108,163,-107,155,-109,148,-113,142,-119,139,-127,137,-136,138,-143,
+176,238,167,238,131,232,101,216,76,192,60,161,55,126,58,99,67,74,81,53,100,35,123,22,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,18,-143,22,-150,28,-155,37,-158,49,-159,78,-153,102,-135,119,-111,131,-84,140,-58,157,13,167,13,202,19,233,35,258,59,274,90,280,126,276,152,267,177,253,199,234,216,211,229,231,308,239,337,247,362,257,381,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,318,396,314,402,307,407,298,411,287,412,255,404,231,385,213,358,201,330,193,303,16383,16383,162,32,206,210,224,199,239,185,251,167,258,147,261,126,256,96,243,70,222,50,197,37,167,32,16383,16383,172,219,127,41,109,52,95,66,83,84,76,104,74,126,78,155,92,181,112,201,137,214,167,219,
 49,-140,49,-137,51,-109,51,-109,49,-137,52,-135,51,-109,52,-135,54,-112,54,-112,52,-135,54,-132,54,-112,54,-132,57,-116,57,-116,54,-132,57,-127,57,-116,57,-127,57,-120,18,-127,18,-143,21,-119,21,-119,18,-143,22,-150,21,-119,22,-150,27,-113,27,-113,22,-150,28,-155,27,-113,28,-155,34,-109,34,-109,28,-155,37,-158,34,-109,37,-158,42,-107,42,-107,37,-158,49,-159,42,-107,49,-159,46,-108,46,-108,49,-159,49,-140,86,-112,77,-129,78,-153,78,-153,77,-129,67,-140,78,-153,67,-140,54,-144,54,-144,52,-143,78,-153,78,-153,52,-143,50,-143,78,-153,50,-143,49,-159,49,-159,50,-143,49,-142,49,-159,49,-142,49,-141,95,66,100,35,109,52,109,52,100,35,123,22,109,52,123,22,127,41,127,41,123,22,131,-84,127,41,131,-84,172,219,172,219,131,-84,140,-58,172,219,140,-58,157,13,83,84,76,104,81,53,83,84,81,53,100,35,83,84,100,35,95,66,76,104,74,126,81,53,81,53,74,126,67,74,67,74,74,126,76,192,76,192,74,126,78,155,201,330,193,303,206,210,206,210,193,303,176,238,206,210,176,238,172,219,172,219,176,238,167,238,172,219,167,238,167,219,167,219,167,238,137,214,78,155,92,181,101,216,101,216,92,181,112,201,101,216,112,201,131,232,131,232,112,201,137,214,131,232,137,214,167,238,60,161,55,126,58,99,60,161,58,99,67,74,60,161,67,74,76,192,289,360,294,360,298,411,298,411,294,360,302,361,298,411,302,361,307,407,307,407,302,361,309,366,307,407,309,366,314,402,314,402,309,366,315,372,314,402,315,372,318,396,318,396,315,372,318,380,318,396,318,380,320,390,279,379,279,368,281,384,281,384,279,368,281,364,281,384,281,364,284,387,284,387,281,364,285,362,284,387,285,362,286,390,286,390,285,362,289,360,286,390,289,360,287,392,287,392,289,360,298,411,287,412,255,404,268,393,287,412,268,393,281,397,287,412,281,397,283,397,287,412,283,397,285,396,287,412,285,396,286,395,287,412,286,395,287,394,287,412,287,394,287,392,287,412,287,392,298,411,255,404,231,385,231,308,255,404,231,308,239,337,255,404,239,337,247,362,255,404,247,362,257,381,255,404,257,381,268,393,213,358,201,330,206,210,213,358,206,210,211,229,213,358,211,229,231,308,213,358,231,308,231,385,162,32,206,210,172,219,162,32,172,219,159,13,162,32,159,13,161,13,162,32,161,13,163,13,162,32,163,13,167,32,94,-89,102,-135,102,-61,102,-61,102,-135,119,-111,102,-61,119,-111,123,22,123,22,119,-111,131,-84,86,-112,78,-153,102,-135,86,-112,102,-135,94,-89,49,-140,49,-159,49,-141,258,59,274,90,261,126,261,126,267,177,258,147,258,147,267,177,253,199,258,147,253,199,251,167,251,167,253,199,239,185,234,216,211,229,224,199,234,216,224,199,239,185,234,216,239,185,253,199,274,90,280,126,276,152,274,90,276,152,267,177,274,90,267,177,261,126,258,59,261,126,256,96,258,59,256,96,243,70,258,59,243,70,233,35,163,13,165,13,167,32,167,32,165,13,167,13,167,32,167,13,197,37,197,37,167,13,202,19,197,37,202,19,222,50,222,50,202,19,233,35,222,50,233,35,243,70,224,199,211,229,206,210,279,368,279,379,278,372,18,-143,18,-127,16,-136,172,219,157,13,159,13,76,192,78,155,101,216,46,-108,49,-140,51,-109,
-296,231,284,234,271,236,258,237,244,238,214,238,231,308,239,337,247,362,257,380,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,319,396,316,402,310,407,302,411,292,412,260,404,234,385,215,358,201,330,193,303,175,233,135,222,101,204,76,182,61,155,55,126,58,104,67,84,82,65,102,48,126,35,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,17,-143,20,-150,25,-155,33,-158,44,-159,74,-153,99,-135,117,-111,131,-84,140,-58,160,22,172,19,200,15,230,13,235,13,237,14,242,14,223,-61,216,-89,208,-112,199,-129,188,-140,175,-144,173,-143,172,-143,170,-142,170,-140,171,-137,173,-135,175,-132,178,-127,179,-120,178,-116,175,-112,172,-109,168,-108,163,-107,155,-109,148,-113,142,-119,139,-127,137,-136,138,-143,141,-150,146,-155,154,-158,165,-159,195,-153,220,-135,239,-111,252,-84,261,-58,280,18,321,29,356,47,382,70,398,96,404,126,401,149,391,170,376,189,355,206,330,219,352,308,360,337,368,362,378,380,389,393,402,397,404,397,406,396,408,394,408,392,407,390,405,387,402,384,400,379,399,372,400,368,402,364,410,360,415,360,423,361,430,366,435,372,439,380,440,390,439,396,436,402,431,407,424,411,413,412,381,404,355,385,336,359,323,330,314,303,16383,16383,325,200,345,188,362,175,374,160,382,143,385,126,380,103,367,82,345,64,318,50,285,39,16383,16383,247,33,235,33,232,32,228,32,214,33,201,34,188,36,176,38,165,41,209,219,241,219,267,217,291,211,16383,16383,131,54,111,65,96,78,84,93,77,109,74,126,79,149,91,170,112,188,138,203,171,213,415,225,385,231,368,234,351,236,334,237,352,308,360,337,368,362,377,381,388,393,402,397,404,397,405,396,407,395,407,392,406,390,402,384,399,379,398,372,399,368,402,364,405,362,409,360,414,360,422,361,429,366,435,372,438,380,440,390,439,396,436,402,431,407,423,411,412,412,380,404,355,385,336,359,322,330,314,303,297,238,257,238,227,236,213,234,231,308,239,337,247,362,257,380,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,319,396,316,402,310,407,302,411,292,412,260,404,234,385,215,359,201,330,193,303,174,227,132,214,99,197,74,177,59,153,54,126,57,103,66,82,80,64,101,49,127,37,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,17,-143,20,-150,25,-155,33,-158,44,-159,74,-153,99,-135,117,-111,131,-84,140,-58,161,26,175,23,191,20,207,18,224,16,242,15,223,-61,215,-89,207,-112,198,-129,187,-140,175,-144,173,-143,171,-143,169,-141,169,-140,170,-137,175,-132,177,-127,178,-120,177,-116,175,-112,171,-109,167,-108,162,-107,154,-109,147,-113,142,-119,138,-127,137,-136,138,-143,141,-150,146,-155,154,-158,164,-159,194,-153,219,-135,238,-111,251,-84,260,-58,278,13,289,13,305,14,320,14,335,15,349,16,363,18,344,-61,336,-89,328,-112,319,-129,309,-140,296,-144,294,-143,292,-143,290,-141,290,-140,291,-137,296,-132,298,-127,299,-120,298,-116,296,-112,292,-109,288,-108,283,-107,275,-109,268,-113,262,-119,259,-127,257,-136,258,-143,261,-150,267,-155,275,-158,285,-159,316,-153,340,-135,359,-111,372,-84,381,-58,401,24,444,36,478,53,503,73,519,98,524,126,521,148,
+296,231,284,234,271,236,258,237,244,238,214,238,231,308,239,337,247,362,257,380,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,319,396,316,402,310,407,302,411,292,412,260,404,234,385,215,358,201,330,193,303,175,233,135,222,101,204,76,182,61,155,55,126,58,104,67,84,82,65,102,48,126,35,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,17,-143,20,-150,25,-155,33,-158,44,-159,74,-153,99,-135,117,-111,131,-84,140,-58,160,22,172,19,200,15,230,13,235,13,237,14,242,14,223,-61,216,-89,208,-112,199,-129,188,-140,175,-144,173,-143,172,-143,170,-142,170,-140,171,-137,173,-135,175,-132,178,-127,179,-120,178,-116,175,-112,172,-109,168,-108,163,-107,155,-109,148,-113,142,-119,139,-127,137,-136,138,-143,141,-150,146,-155,154,-158,165,-159,195,-153,220,-135,239,-111,252,-84,261,-58,280,18,321,29,356,47,382,70,398,96,404,126,401,149,391,170,376,189,355,206,330,219,352,308,360,337,368,362,378,380,389,393,402,397,404,397,406,396,408,394,408,392,407,390,405,387,402,384,400,379,399,372,400,368,402,364,410,360,415,360,423,361,430,366,435,372,439,380,440,390,439,396,436,402,431,407,424,411,413,412,381,404,355,385,336,359,323,330,314,303,16383,16383,325,200,345,188,362,175,374,160,382,143,385,126,380,103,367,82,345,64,318,50,285,39,16383,16383,247,33,235,33,232,32,228,32,214,33,201,34,188,36,176,38,165,41,209,219,241,219,267,217,291,211,16383,16383,131,54,111,65,96,78,84,93,77,109,74,126,79,149,91,170,112,188,138,203,171,213,
 49,-137,51,-109,49,-140,49,-140,46,-108,44,-159,44,-159,46,-108,42,-107,44,-159,42,-107,34,-109,51,-109,52,-135,54,-112,54,-112,52,-135,54,-132,54,-112,54,-132,57,-116,57,-116,54,-132,57,-127,57,-116,57,-127,57,-120,94,-89,86,-112,99,-135,99,-135,86,-112,77,-129,99,-135,77,-129,74,-153,74,-153,77,-129,67,-140,74,-153,67,-140,54,-144,54,-144,52,-143,74,-153,74,-153,52,-143,50,-143,74,-153,50,-143,44,-159,44,-159,50,-143,49,-142,44,-159,49,-142,49,-141,96,78,102,48,111,65,111,65,102,48,126,35,111,65,126,35,131,54,131,54,126,35,131,-84,131,54,131,-84,171,213,171,213,131,-84,140,-58,171,213,140,-58,160,22,84,93,77,109,82,65,84,93,82,65,102,48,84,93,102,48,96,78,77,109,74,126,82,65,82,65,74,126,67,84,67,84,74,126,76,182,76,182,74,126,79,149,171,-137,172,-109,170,-140,170,-140,168,-108,165,-159,165,-159,168,-108,163,-107,165,-159,163,-107,155,-109,172,-109,173,-135,175,-112,175,-112,173,-135,175,-132,175,-112,175,-132,178,-116,178,-116,175,-132,178,-127,178,-116,178,-127,179,-120,216,-89,208,-112,220,-135,220,-135,208,-112,199,-129,220,-135,199,-129,195,-153,195,-153,199,-129,188,-140,195,-153,188,-140,175,-144,175,-144,173,-143,195,-153,195,-153,173,-143,172,-143,195,-153,172,-143,165,-159,165,-159,172,-143,170,-142,165,-159,170,-142,170,-141,201,330,193,303,209,219,209,219,193,303,175,233,209,219,175,233,171,213,171,213,175,233,138,203,138,203,175,233,135,222,138,203,135,222,112,188,112,188,135,222,101,204,112,188,101,204,91,170,91,170,101,204,79,149,61,155,55,126,58,104,61,155,58,104,67,84,61,155,67,84,76,182,285,396,292,412,283,397,283,397,292,412,281,397,268,393,281,397,292,412,268,393,292,412,260,404,302,361,302,411,294,360,294,360,302,411,292,412,294,360,292,412,289,360,289,360,292,412,287,392,289,360,287,392,286,390,289,360,286,390,285,362,285,362,286,390,284,387,285,362,284,387,281,364,281,364,284,387,281,384,281,364,281,384,279,368,279,368,281,384,279,379,279,368,279,379,278,372,320,390,319,396,318,380,318,380,319,396,316,402,318,380,316,402,315,372,315,372,316,402,310,407,315,372,310,407,309,366,309,366,310,407,302,411,309,366,302,411,302,361,292,412,285,396,286,395,292,412,286,395,287,394,292,412,287,394,287,392,260,404,234,385,239,337,260,404,239,337,247,362,260,404,247,362,257,380,260,404,257,380,268,393,239,337,234,385,231,308,231,308,234,385,215,358,231,308,215,358,214,238,214,238,215,358,212,219,214,238,212,219,216,219,215,358,201,330,209,219,215,358,209,219,212,219,176,38,165,41,172,19,171,213,165,41,209,219,160,22,172,19,165,41,160,22,165,41,171,213,94,-89,99,-135,102,-61,102,-61,99,-135,117,-111,102,-61,117,-111,126,35,126,35,117,-111,131,-84,49,-140,44,-159,49,-141,16,-136,17,-143,18,-127,18,-127,17,-143,20,-150,18,-127,20,-150,21,-119,21,-119,20,-150,25,-155,21,-119,25,-155,27,-113,27,-113,25,-155,33,-158,27,-113,33,-158,34,-109,34,-109,33,-158,44,-159,296,231,284,234,291,211,291,211,325,200,296,231,296,231,325,200,314,303,406,396,413,412,404,397,404,397,413,412,402,397,389,393,402,397,413,412,389,393,413,412,381,404,423,361,424,411,415,360,415,360,424,411,413,412,415,360,413,412,410,360,410,360,413,412,408,392,410,360,408,392,407,390,410,360,407,390,406,362,406,362,407,390,405,387,406,362,405,387,402,364,402,364,405,387,402,384,402,364,402,384,400,379,400,379,399,372,400,368,400,379,400,368,402,364,440,390,439,396,439,380,439,380,439,396,436,402,439,380,436,402,435,372,435,372,436,402,431,407,435,372,431,407,430,366,430,366,431,407,424,411,430,366,424,411,423,361,413,412,406,396,407,395,413,412,407,395,408,394,413,412,408,394,408,392,381,404,355,385,360,337,381,404,360,337,368,362,381,404,368,362,378,380,381,404,378,380,389,393,336,359,330,219,352,308,336,359,352,308,355,385,355,385,352,308,360,337,336,359,325,200,330,219,330,219,325,200,345,188,330,219,345,188,355,206,355,206,345,188,362,175,355,206,362,175,376,189,376,189,362,175,374,160,376,189,374,160,382,143,323,330,314,303,325,200,323,330,325,200,336,359,291,211,247,33,252,-84,291,211,252,-84,261,-58,291,211,261,-58,280,18,291,211,280,18,285,39,291,211,285,39,325,200,243,33,239,33,239,14,243,33,239,14,242,14,243,33,242,14,252,-84,243,33,252,-84,247,33,216,-89,220,-135,223,-61,223,-61,220,-135,239,-111,223,-61,239,-111,242,14,242,14,239,-111,252,-84,170,-140,165,-159,170,-141,137,-136,138,-143,139,-127,139,-127,138,-143,141,-150,139,-127,141,-150,142,-119,142,-119,141,-150,146,-155,142,-119,146,-155,148,-113,148,-113,146,-155,154,-158,148,-113,154,-158,155,-109,155,-109,154,-158,165,-159,404,126,401,149,398,96,398,96,401,149,391,170,398,96,391,170,385,126,385,126,382,70,398,96,391,170,376,189,382,143,391,170,382,143,385,126,385,126,380,103,382,70,382,70,380,103,367,82,382,70,367,82,356,47,356,47,367,82,345,64,356,47,345,64,321,29,321,29,345,64,318,50,321,29,318,50,285,39,280,18,321,29,285,39,176,38,186,17,188,36,188,36,186,17,200,15,188,36,200,15,201,34,201,34,200,15,215,14,201,34,215,14,214,33,214,33,215,14,228,32,232,32,228,32,230,13,232,32,230,13,232,13,291,211,284,234,279,214,279,214,284,234,271,236,279,214,271,236,267,217,267,217,271,236,258,237,267,217,258,237,254,218,254,218,258,237,244,238,254,218,244,238,241,219,241,219,244,238,230,238,241,219,230,238,228,219,232,13,235,13,235,33,235,33,235,13,237,14,235,33,237,14,239,33,239,33,237,14,239,14,230,238,214,238,216,219,230,238,216,219,220,219,230,238,220,219,224,219,230,238,224,219,228,219,228,32,215,14,230,13,232,32,232,13,235,33,176,38,172,19,186,17,76,182,79,149,101,204,168,-108,170,-140,172,-109,172,-109,171,-137,173,-135,46,-108,49,-140,51,-109,51,-109,49,-137,52,-135,
-319,60,319,93,170,93,200,160,319,160,319,193,214,193,274,331,247,331,187,193,24,193,24,160,172,160,143,93,24,93,24,60,128,60,69,-77,95,-77,156,60,319,206,319,239,24,239,24,206,16383,16383,319,110,319,143,24,143,24,110,16383,16383,319,14,319,47,24,47,24,14,319,14,319,47,150,47,177,110,319,110,319,143,
+319,60,319,93,170,93,200,160,319,160,319,193,214,193,274,331,247,331,187,193,24,193,24,160,172,160,143,93,24,93,24,60,128,60,69,-77,95,-77,156,60,
 128,60,69,-77,95,-77,128,60,95,-77,156,60,128,60,156,60,143,93,128,60,143,93,24,93,128,60,24,93,24,60,172,160,143,93,156,60,172,160,156,60,170,93,172,160,170,93,200,160,172,160,200,160,187,193,172,160,187,193,24,193,172,160,24,193,24,160,214,193,274,331,247,331,214,193,247,331,200,160,214,193,200,160,319,160,214,193,319,160,319,193,170,93,156,60,319,60,170,93,319,60,319,93,187,193,200,160,247,331,
-319,206,319,239,24,239,24,206,16383,16383,319,110,319,143,24,143,24,110,16383,16383,319,14,319,47,24,47,24,14,319,14,319,47,150,47,177,110,319,110,319,143,192,143,219,206,319,206,319,239,233,239,274,331,247,331,207,239,
+319,206,319,239,24,239,24,206,16383,16383,319,110,319,143,24,143,24,110,16383,16383,319,14,319,47,24,47,24,14,
 24,239,24,206,319,206,24,239,319,206,319,239,24,143,24,110,319,110,24,143,319,110,319,143,24,47,24,14,319,14,24,47,319,14,319,47,
-319,14,319,47,150,47,177,110,319,110,319,143,192,143,219,206,319,206,319,239,233,239,274,331,247,331,207,239,24,239,24,206,193,206,165,143,24,143,24,110,151,110,123,47,24,47,24,14,108,14,69,-77,95,-77,136,14,319,239,319,272,24,272,24,239,16383,16383,319,153,319,186,24,186,24,153,16383,16383,319,67,319,100,24,100,24,67,16383,16383,319,-18,319,14,24,14,24,-18,315,26,315,57,99,165,315,272,315,305,32,167,32,162,16383,16383,315,-50,
+319,14,319,47,150,47,177,110,319,110,319,143,192,143,219,206,319,206,319,239,233,239,274,331,247,331,207,239,24,239,24,206,193,206,165,143,24,143,24,110,151,110,123,47,24,47,24,14,108,14,69,-77,95,-77,136,14,
 108,14,69,-77,95,-77,108,14,95,-77,136,14,108,14,136,14,123,47,108,14,123,47,24,47,108,14,24,47,24,14,151,110,123,47,136,14,151,110,136,14,150,47,151,110,150,47,177,110,151,110,177,110,165,143,151,110,165,143,24,143,151,110,24,143,24,110,193,206,165,143,177,110,193,206,177,110,192,143,193,206,192,143,219,206,193,206,219,206,207,239,193,206,207,239,24,239,193,206,24,239,24,206,233,239,274,331,247,331,233,239,247,331,219,206,233,239,219,206,319,206,233,239,319,206,319,239,192,143,177,110,319,110,192,143,319,110,319,143,150,47,136,14,319,14,150,47,319,14,319,47,207,239,219,206,247,331,
-319,239,319,272,24,272,24,239,16383,16383,319,153,319,186,24,186,24,153,16383,16383,319,67,319,100,24,100,24,67,16383,16383,319,-18,319,14,24,14,24,-18,315,26,315,57,99,165,315,272,315,305,32,167,32,162,16383,16383,315,-50,315,-17,32,-17,32,-50,315,162,315,167,32,305,32,272,248,165,32,57,32,26,
+319,239,319,272,24,272,24,239,16383,16383,319,153,319,186,24,186,24,153,16383,16383,319,67,319,100,24,100,24,67,16383,16383,319,-18,319,14,24,14,24,-18,
 24,272,24,239,319,239,24,272,319,239,319,272,24,186,24,153,319,153,24,186,319,153,319,186,24,100,24,67,319,67,24,100,319,67,319,100,24,14,24,-18,319,-18,24,14,319,-18,319,14,
-315,26,315,57,99,165,315,272,315,305,32,167,32,162,16383,16383,315,-50,315,-17,32,-17,32,-50,315,162,315,167,32,305,32,272,248,165,32,57,32,26,16383,16383,315,-50,315,-17,32,-17,32,-50,
+315,26,315,57,99,165,315,272,315,305,32,167,32,162,16383,16383,315,-50,315,-17,32,-17,32,-50,
 99,165,315,272,315,305,99,165,315,305,32,167,99,165,32,167,315,26,99,165,315,26,315,57,32,-17,32,-50,315,-50,32,-17,315,-50,315,-17,315,26,32,167,32,162,
-315,162,315,167,32,305,32,272,248,165,32,57,32,26,16383,16383,315,-50,315,-17,32,-17,32,-50,311,80,311,112,95,219,311,326,311,359,28,222,28,217,16383,16383,311,-5,311,27,28,27,28,-5,
+315,162,315,167,32,305,32,272,248,165,32,57,32,26,16383,16383,315,-50,315,-17,32,-17,32,-50,
 248,165,32,57,315,162,248,165,315,162,315,167,248,165,315,167,32,305,248,165,32,305,32,272,32,-17,32,-50,315,-50,32,-17,315,-50,315,-17,315,162,32,57,32,26,
-311,80,311,112,95,219,311,326,311,359,28,222,28,217,16383,16383,311,-5,311,27,28,27,28,-5,16383,16383,311,-104,311,-72,28,-72,28,-104,311,217,311,222,28,359,28,326,244,219,28,112,28,80,16383,16383,311,-5,311,27,28,27,28,-5,16383,16383,311,-104,311,-72,28,-72,28,-104,
+311,80,311,112,95,219,311,326,311,359,28,222,28,217,16383,16383,311,-5,311,27,28,27,28,-5,16383,16383,311,-104,311,-72,28,-72,28,-104,
 95,219,311,326,311,359,95,219,311,359,28,222,95,219,28,222,311,80,95,219,311,80,311,112,28,27,28,-5,311,-5,28,27,311,-5,311,27,28,-72,28,-104,311,-104,28,-72,311,-104,311,-72,311,80,28,222,28,217,
-311,217,311,222,28,359,28,326,244,219,28,112,28,80,16383,16383,311,-5,311,27,28,27,28,-5,16383,16383,311,-104,311,-72,28,-72,28,-104,310,94,310,126,94,233,310,340,310,373,28,235,28,230,16383,16383,310,-91,310,-58,158,-58,200,8,310,8,310,41,221,41,245,79,215,79,
+311,217,311,222,28,359,28,326,244,219,28,112,28,80,16383,16383,311,-5,311,27,28,27,28,-5,16383,16383,311,-104,311,-72,28,-72,28,-104,
 244,219,28,112,311,217,244,219,311,217,311,222,244,219,311,222,28,359,244,219,28,359,28,326,28,27,28,-5,311,-5,28,27,311,-5,311,27,28,-72,28,-104,311,-104,28,-72,311,-104,311,-72,311,217,28,112,28,80,
-310,94,310,126,94,233,310,340,310,373,28,235,28,230,16383,16383,310,-91,310,-58,158,-58,200,8,310,8,310,41,221,41,245,79,215,79,191,41,28,41,28,8,171,8,128,-58,28,-58,28,-91,108,-91,84,-129,114,-129,138,-91,310,230,310,235,28,373,28,340,244,233,28,126,28,94,16383,16383,310,-91,310,-58,165,-58,207,8,310,8,310,41,228,41,252,79,222,79,198,41,28,41,28,8,177,8,135,-58,28,-58,28,-91,114,-91,91,-129,121,-129,145,-91,
+310,94,310,126,94,233,310,340,310,373,28,235,28,230,16383,16383,310,-91,310,-58,158,-58,200,8,310,8,310,41,221,41,245,79,215,79,191,41,28,41,28,8,171,8,128,-58,28,-58,28,-91,108,-91,84,-129,114,-129,138,-91,
 94,233,310,340,310,373,94,233,310,373,28,235,94,233,28,235,310,94,94,233,310,94,310,126,28,41,171,8,191,41,191,41,171,8,200,8,191,41,200,8,215,79,215,79,200,8,221,41,215,79,221,41,245,79,221,41,200,8,310,8,221,41,310,8,310,41,108,-91,114,-129,128,-58,128,-58,114,-129,138,-91,128,-58,138,-91,171,8,171,8,138,-91,158,-58,171,8,158,-58,200,8,28,-58,28,-91,108,-91,28,-58,108,-91,128,-58,158,-58,138,-91,310,-91,158,-58,310,-91,310,-58,114,-129,108,-91,84,-129,171,8,28,41,28,8,310,94,28,235,28,230,
-310,230,310,235,28,373,28,340,244,233,28,126,28,94,16383,16383,310,-91,310,-58,165,-58,207,8,310,8,310,41,228,41,252,79,222,79,198,41,28,41,28,8,177,8,135,-58,28,-58,28,-91,114,-91,91,-129,121,-129,145,-91,454,-12,454,18,238,127,454,233,454,266,171,129,171,124,16383,16383,295,-12,295,18,79,127,295,233,295,266,12,129,12,124,454,124,454,129,171,266,171,233,387,127,171,18,171,-12,16383,16383,295,124,295,129,12,266,12,233,228,127,
+310,230,310,235,28,373,28,340,244,233,28,126,28,94,16383,16383,310,-91,310,-58,165,-58,207,8,310,8,310,41,228,41,252,79,222,79,198,41,28,41,28,8,177,8,135,-58,28,-58,28,-91,114,-91,91,-129,121,-129,145,-91,
 244,233,28,126,310,230,244,233,310,230,310,235,244,233,310,235,28,373,244,233,28,373,28,340,28,41,177,8,198,41,198,41,177,8,207,8,198,41,207,8,222,79,222,79,207,8,228,41,222,79,228,41,252,79,228,41,207,8,310,8,228,41,310,8,310,41,114,-91,121,-129,135,-58,135,-58,121,-129,145,-91,135,-58,145,-91,177,8,177,8,145,-91,165,-58,177,8,165,-58,207,8,28,-58,28,-91,114,-91,28,-58,114,-91,135,-58,165,-58,145,-91,310,-91,165,-58,310,-91,310,-58,121,-129,114,-91,91,-129,177,8,28,41,28,8,310,230,28,126,28,94,
-454,-12,454,18,238,127,454,233,454,266,171,129,171,124,16383,16383,295,-12,295,18,79,127,295,233,295,266,12,129,12,124,454,124,454,129,171,266,171,233,387,127,171,18,171,-12,16383,16383,295,124,295,129,12,266,12,233,228,127,12,18,12,-12,
+454,-12,454,18,238,127,454,233,454,266,171,129,171,124,16383,16383,295,-12,295,18,79,127,295,233,295,266,12,129,12,124,
 238,127,454,233,454,266,238,127,454,266,171,129,238,127,171,129,454,-12,238,127,454,-12,454,18,79,127,295,233,295,266,79,127,295,266,12,129,79,127,12,129,295,-12,79,127,295,-12,295,18,295,-12,12,129,12,124,454,-12,171,129,171,124,
-454,124,454,129,171,266,171,233,387,127,171,18,171,-12,16383,16383,295,124,295,129,12,266,12,233,228,127,12,18,12,-12,190,-102,179,-89,167,-74,154,-59,130,-25,149,4,165,35,176,66,183,97,185,127,183,156,176,187,164,218,149,248,130,278,
+454,124,454,129,171,266,171,233,387,127,171,18,171,-12,16383,16383,295,124,295,129,12,266,12,233,228,127,12,18,12,-12,
 387,127,171,18,454,124,387,127,454,124,454,129,387,127,454,129,171,266,387,127,171,266,171,233,228,127,12,18,295,124,228,127,295,124,295,129,228,127,295,129,12,266,228,127,12,266,12,233,295,124,12,18,12,-12,454,124,171,18,171,-12,
-190,-102,179,-89,167,-74,154,-59,130,-25,149,4,165,35,176,66,183,97,185,127,183,156,176,187,164,218,149,248,130,278,142,296,154,312,167,328,179,342,190,355,190,365,174,353,158,340,143,326,130,312,117,296,103,312,89,326,74,340,59,353,42,365,42,357,66,329,78,313,91,296,103,278,84,249,68,218,57,187,50,156,47,127,50,97,57,66,68,35,84,4,103,-25,91,-42,78,-58,66,-74,42,-102,42,-111,59,-99,89,-73,117,-43,143,-73,158,-86,174,-99,190,-111,16383,16383,152,127,151,98,146,70,138,45,128,20,116,-2,104,20,95,45,87,71,82,98,80,127,82,155,87,182,95,208,105,233,117,256,128,233,138,208,146,182,151,155,152,127,319,22,300,49,273,71,242,87,207,96,174,100,198,155,227,162,255,173,281,188,303,208,319,232,319,249,302,230,283,215,261,204,237,195,213,190,254,286,228,286,184,186,171,186,138,188,105,195,75,206,47,224,24,249,24,232,43,204,69,182,101,166,135,156,170,153,146,98,116,92,88,81,61,65,40,46,24,22,24,4,40,22,60,38,82,49,106,58,131,64,89,-32,116,-32,159,66,161,67,171,67,204,65,237,58,268,46,295,28,319,4,310,-12,310,18,171,88,214,185,310,233,310,266,232,228,277,331,250,331,198,211,28,128,28,123,137,71,71,-77,99,-77,158,60,16383,16383,179,168,148,99,94,126,310,123,310,128,203,181,268,331,241,331,
+190,-102,179,-89,167,-74,154,-59,130,-25,149,4,165,35,176,66,183,97,185,127,183,156,176,187,164,218,149,248,130,278,142,296,154,312,167,328,179,342,190,355,190,365,174,353,158,340,143,326,130,312,117,296,103,312,89,326,74,340,59,353,42,365,42,357,66,329,78,313,91,296,103,278,84,249,68,218,57,187,50,156,47,127,50,97,57,66,68,35,84,4,103,-25,91,-42,78,-58,66,-74,42,-102,42,-111,59,-99,89,-73,117,-43,143,-73,158,-86,174,-99,190,-111,16383,16383,152,127,151,98,146,70,138,45,128,20,116,-2,104,20,95,45,87,71,82,98,80,127,82,155,87,182,95,208,105,233,117,256,128,233,138,208,146,182,151,155,152,127,
 130,278,142,296,143,326,143,326,142,296,154,312,143,326,154,312,158,340,158,340,154,312,167,328,158,340,167,328,174,353,174,353,167,328,179,342,174,353,179,342,190,365,190,365,179,342,190,355,117,296,103,312,105,233,117,296,105,233,117,256,117,256,128,233,130,312,130,312,128,233,130,278,130,312,130,278,143,326,116,-2,117,-43,128,20,128,20,117,-43,130,-58,128,20,130,-58,130,-25,130,-25,130,-58,143,-73,130,-25,138,45,128,20,183,97,183,156,176,66,176,66,183,156,176,187,176,66,176,187,165,35,165,35,176,187,164,218,165,35,164,218,152,127,152,127,164,218,151,155,149,248,130,278,138,208,149,248,138,208,146,182,149,248,146,182,151,155,149,248,151,155,164,218,130,312,117,296,117,256,165,35,152,127,151,98,165,35,151,98,149,4,149,4,151,98,146,70,149,4,146,70,138,45,142,-42,143,-73,154,-59,154,-59,143,-73,158,-86,154,-59,158,-86,167,-74,167,-74,158,-86,174,-99,167,-74,174,-99,179,-89,179,-89,174,-99,190,-111,179,-89,190,-111,190,-102,105,233,103,312,103,278,103,278,103,312,91,296,91,296,103,312,89,326,91,296,89,326,78,313,78,313,89,326,74,340,78,313,74,340,66,329,66,329,74,340,59,353,66,329,59,353,54,343,54,343,59,353,42,365,54,343,42,365,42,357,103,-58,103,-25,91,-42,103,-58,91,-42,89,-73,89,-73,91,-42,78,-58,89,-73,78,-58,74,-86,74,-86,78,-58,66,-74,74,-86,66,-74,59,-99,59,-99,66,-74,54,-88,59,-99,54,-88,42,-102,104,20,95,45,103,-25,104,20,103,-25,103,-58,104,20,103,-58,117,-43,104,20,117,-43,116,-2,103,278,84,249,87,182,103,278,87,182,95,208,103,278,95,208,105,233,84,249,68,218,68,35,84,249,68,35,80,127,84,249,80,127,82,155,84,249,82,155,87,182,87,71,82,98,84,4,84,4,82,98,80,127,68,35,68,218,57,66,57,66,68,218,57,187,57,66,57,187,50,97,50,97,57,187,50,156,50,97,50,156,47,127,87,71,84,4,103,-25,87,71,103,-25,95,45,84,4,80,127,68,35,59,-99,42,-102,42,-111,130,-25,143,-73,142,-42,138,45,130,-25,149,4,183,156,183,97,185,127,130,278,128,233,138,208,
-319,22,300,49,273,71,242,87,207,96,174,100,198,155,227,162,255,173,281,188,303,208,319,232,319,249,302,230,283,215,261,204,237,195,213,190,254,286,228,286,184,186,171,186,138,188,105,195,75,206,47,224,24,249,24,232,43,204,69,182,101,166,135,156,170,153,146,98,116,92,88,81,61,65,40,46,24,22,24,4,40,22,60,38,82,49,106,58,131,64,89,-32,116,-32,159,66,161,67,171,67,204,65,237,58,268,46,295,28,319,4,310,-12,310,18,171,88,214,185,310,233,310,266,232,228,277,331,250,331,198,211,28,128,28,123,137,71,71,-77,99,-77,158,60,16383,16383,179,168,148,99,94,126,310,123,310,128,203,181,268,331,241,331,180,192,28,266,28,233,168,164,126,68,28,18,28,-12,108,26,63,-77,89,-77,142,42,16383,16383,244,126,161,84,190,153,310,-50,310,-17,129,-17,171,92,310,25,310,56,181,120,220,226,310,271,310,304,236,267,272,365,246,365,203,251,28,166,
+319,22,300,49,273,71,242,87,207,96,174,100,198,155,227,162,255,173,281,188,303,208,319,232,319,249,302,230,283,215,261,204,237,195,213,190,254,286,228,286,184,186,171,186,138,188,105,195,75,206,47,224,24,249,24,232,43,204,69,182,101,166,135,156,170,153,146,98,116,92,88,81,61,65,40,46,24,22,24,4,40,22,60,38,82,49,106,58,131,64,89,-32,116,-32,159,66,161,67,171,67,204,65,237,58,268,46,295,28,319,4,
 40,22,60,38,61,65,61,65,60,38,82,49,61,65,82,49,88,81,88,81,82,49,106,58,88,81,106,58,116,92,116,92,106,58,131,64,146,98,131,64,159,66,146,98,159,66,170,153,170,153,159,66,161,67,170,153,161,67,164,67,40,22,61,65,40,46,40,22,40,46,24,22,40,22,24,22,24,4,135,156,170,153,138,188,138,188,170,153,171,186,173,186,171,186,171,67,173,186,171,67,174,100,174,100,171,67,204,65,174,100,204,65,207,96,207,96,204,65,237,58,207,96,237,58,242,87,242,87,237,58,268,46,242,87,268,46,273,71,273,71,268,46,295,28,273,71,295,28,300,49,300,49,295,28,319,4,300,49,319,4,319,22,24,249,43,204,47,224,47,224,43,204,69,182,47,224,69,182,75,206,75,206,69,182,101,166,75,206,101,166,105,195,105,195,101,166,135,156,105,195,135,156,138,188,171,67,171,186,170,153,171,67,170,153,168,67,170,153,164,67,166,67,170,153,166,67,168,67,131,64,89,-32,116,-32,131,64,116,-32,159,66,319,249,302,230,303,208,303,208,302,230,283,215,303,208,283,215,281,188,281,188,283,215,261,204,281,188,261,204,255,173,255,173,261,204,237,195,255,173,237,195,227,162,227,162,237,195,213,190,227,162,213,190,198,155,228,286,184,186,198,155,228,286,198,155,213,190,228,286,213,190,254,286,198,155,184,186,181,186,198,155,181,186,179,186,198,155,179,186,176,186,198,155,176,186,174,100,176,186,173,186,174,100,43,204,24,249,24,232,319,249,303,208,319,232,116,92,131,64,146,98,
-310,-12,310,18,171,88,214,185,310,233,310,266,232,228,277,331,250,331,198,211,28,128,28,123,137,71,71,-77,99,-77,158,60,16383,16383,179,168,148,99,94,126,310,123,310,128,203,181,268,331,241,331,180,192,28,266,28,233,168,164,126,68,28,18,28,-12,108,26,63,-77,89,-77,142,42,16383,16383,244,126,161,84,190,153,
+310,-12,310,18,171,88,214,185,310,233,310,266,232,228,277,331,250,331,198,211,28,128,28,123,137,71,71,-77,99,-77,158,60,16383,16383,179,168,148,99,94,126,
 198,211,28,128,94,126,94,126,28,128,137,71,94,126,137,71,148,99,148,99,137,71,158,60,148,99,158,60,179,168,179,168,158,60,171,88,179,168,171,88,214,185,94,126,179,168,198,211,198,211,179,168,214,185,198,211,214,185,250,331,250,331,214,185,232,228,250,331,232,228,277,331,137,71,71,-77,99,-77,137,71,99,-77,158,60,232,228,214,185,310,233,232,228,310,233,310,266,171,88,158,60,310,-12,171,88,310,-12,310,18,137,71,28,128,28,123,
-310,123,310,128,203,181,268,331,241,331,180,192,28,266,28,233,168,164,126,68,28,18,28,-12,108,26,63,-77,89,-77,142,42,16383,16383,244,126,161,84,190,153,310,-50,310,-17,129,-17,171,92,310,25,310,56,181,120,220,226,310,271,310,304,236,267,272,365,246,365,203,251,28,166,28,161,147,103,103,-17,28,-17,28,-50,
+310,123,310,128,203,181,268,331,241,331,180,192,28,266,28,233,168,164,126,68,28,18,28,-12,108,26,63,-77,89,-77,142,42,16383,16383,244,126,161,84,190,153,
 108,26,63,-77,89,-77,108,26,89,-77,142,42,108,26,142,42,126,68,108,26,126,68,28,18,108,26,28,18,28,-12,168,164,126,68,142,42,168,164,142,42,161,84,168,164,161,84,190,153,168,164,190,153,180,192,168,164,180,192,28,266,168,164,28,266,28,233,203,181,268,331,241,331,203,181,241,331,190,153,203,181,190,153,244,126,203,181,244,126,310,128,310,123,310,128,244,126,310,123,244,126,161,84,310,123,161,84,142,42,180,192,190,153,241,331,
-320,0,320,33,190,33,190,331,157,331,157,33,26,33,26,0,313,126,309,150,298,171,281,188,260,199,235,203,211,199,189,188,
-190,331,157,331,190,33,190,33,157,331,157,33,190,33,157,33,320,0,320,0,157,33,26,33,320,0,26,33,26,0,190,33,320,0,320,33
+320,0,320,33,190,33,190,331,157,331,157,33,26,33,26,0,
+190,331,157,331,190,33,190,33,157,331,157,33,190,33,157,33,320,0,320,0,157,33,26,33,320,0,26,33,26,0,190,33,320,0,320,33,
 };
index e0d611c4eeefae60399b46250bdd5bbb79108d14..603858244c0d441fd40f5ba4a82de9d58e6bbb95 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * eval.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -132,7 +132,7 @@ EQ_CL               // Clausen function
 //-----------------------------------------------------------------------------\r
 int mglFormula::Error=0;\r
 bool MGL_LOCAL_PURE mglCheck(char *str,int n);\r
-int MGL_LOCAL_PURE mglFindInText(char *str,const char *lst);\r
+int MGL_LOCAL_PURE mglFindInText(const char *str, const char *lst);\r
 //-----------------------------------------------------------------------------\r
 #if MGL_HAVE_GSL\r
 MGL_NO_EXPORT gsl_rng *mgl_rng=0;      // NOTE: should be deleted by gsl_rng_free() but I don't know where :(\r
@@ -155,7 +155,7 @@ void MGL_EXPORT mgl_srnd_(int *seed)        {       mgl_srnd(*seed);        }
 double MGL_EXPORT_CONST mgl_hypot(double x, double y)  {       return hypot(x,y);      }\r
 //-----------------------------------------------------------------------------\r
 #if MGL_HAVE_PTHREAD\r
-pthread_mutex_t mutexRnd;\r
+extern pthread_mutex_t mutexRnd;\r
 #endif\r
 double MGL_EXPORT mgl_rnd()\r
 {\r
@@ -276,7 +276,7 @@ mglFormula::mglFormula(const char *string)
        else\r
        {\r
                char name[128];\r
-               strncpy(name,str,128);  name[127]=name[n]=0;\r
+               mgl_strncpy(name,str,128);      name[127]=name[n]=0;\r
                memmove(str,str+n+1,len-n);\r
                len=strlen(str);                str[--len]=0;\r
                if(!strncmp(name,"jacobi_",7))\r
@@ -707,8 +707,8 @@ mreal mglFormula::CalcDIn(int id, const mreal *a1) const
 // Check braces correctness\r
 bool MGL_LOCAL_PURE mglCheck(char *str,int n)\r
 {\r
-       register long s = 0,i;\r
-       for(i=0;i<n;i++)\r
+       long s = 0;\r
+       for(long i=0;i<n;i++)\r
        {\r
                if(str[i]=='(') s++;\r
                if(str[i]==')') s--;\r
@@ -718,10 +718,10 @@ bool MGL_LOCAL_PURE mglCheck(char *str,int n)
 }\r
 //-----------------------------------------------------------------------------\r
 // Try to find one of symbols lst in the string str\r
-int MGL_LOCAL_PURE mglFindInText(char *str,const char *lst)\r
+int MGL_LOCAL_PURE mglFindInText(const char *str, const char *lst)\r
 {\r
-       register long l=0,r=0,i;//,j,len=strlen(lst);\r
-       for(i=strlen(str)-1;i>=0;i--)\r
+       long l=0,r=0,len=strlen(str);\r
+       for(long i=len-1;i>=0;i--)\r
        {\r
                if(str[i]=='(') l++;\r
                if(str[i]==')') r++;\r
index 6be9232c500f570d89c9f66c905ea15aad7d1bd7..2a0e7190ee94b5a73c00b0709245c93bbbf4a663 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * evalc.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -37,36 +37,41 @@ EQ_ADD,             // addition x+y
 EQ_SUB,                // substraction x-y\r
 EQ_MUL,                // multiplication x*y\r
 EQ_DIV,                // division x/y\r
-EQ_IPOW,               // power x^n for integer n\r
+EQ_IPOW,       // power x^n for integer n\r
 EQ_POW,                // power x^y\r
 EQ_LOG,                // logarithm of x on base a, log_a(x) = ln(x)/ln(a)\r
+EQ_CMPLX,      // return a+i*b\r
+EQ_HYPOT,      // return sqrt(a*a+b*b)\r
 // normal functions of 1 argument\r
 EQ_SIN,                // sine function \sin(x).                       !!! MUST BE FIRST 1-PLACE FUNCTION\r
 EQ_COS,                // cosine function \cos(x).\r
 EQ_TAN,                // tangent function \tan(x).\r
-EQ_ASIN,               // inverse sine function \asin(x).\r
-EQ_ACOS,               // inverse cosine function \acos(x).\r
-EQ_ATAN,               // inverse tangent function \atan(x).\r
-EQ_SINH,               // hyperbolic sine function \sinh(x).\r
-EQ_COSH,               // hyperbolic cosine function \cosh(x).\r
-EQ_TANH,               // hyperbolic tangent function \tanh(x).\r
+EQ_ASIN,       // inverse sine function \asin(x).\r
+EQ_ACOS,       // inverse cosine function \acos(x).\r
+EQ_ATAN,       // inverse tangent function \atan(x).\r
+EQ_SINH,       // hyperbolic sine function \sinh(x).\r
+EQ_COSH,       // hyperbolic cosine function \cosh(x).\r
+EQ_TANH,       // hyperbolic tangent function \tanh(x).\r
 EQ_ASINH,      // inverse hyperbolic sine function \asinh(x).\r
 EQ_ACOSH,      // inverse hyperbolic cosine function \acosh(x).\r
 EQ_ATANH,      // inverse hyperbolic tangent function \atanh(x).\r
-EQ_SQRT,               // square root function \sqrt(x)\r
+EQ_SQRT,       // square root function \sqrt(x)\r
 EQ_EXP,                // exponential function \exp(x)\r
-EQ_EXPI,               // exponential function \exp(i*x)\r
+EQ_EXPI,       // exponential function \exp(i*x)\r
 EQ_LN,         // logarithm of x, ln(x)\r
 EQ_LG,         // decimal logarithm of x, lg(x) = ln(x)/ln(10)\r
 EQ_ABS,                // absolute value\r
 EQ_ARG,                // argument (or phase) of complex number\r
 EQ_CONJ,       // complex conjugate\r
+EQ_REAL,       // real part\r
+EQ_IMAG,       // imaginary part\r
+EQ_NORM,       // square of absolute value |u|^2\r
 EQ_LAST                // id of last entry\r
 };\r
 //-----------------------------------------------------------------------------\r
 int mglFormulaC::Error=0;\r
 bool MGL_LOCAL_PURE mglCheck(char *str,int n);\r
-int MGL_LOCAL_PURE mglFindInText(char *str,const char *lst);\r
+int MGL_LOCAL_PURE mglFindInText(const char *str, const char *lst);\r
 //-----------------------------------------------------------------------------\r
 mglFormulaC::~mglFormulaC()\r
 {\r
@@ -148,7 +153,7 @@ mglFormulaC::mglFormulaC(const char *string)
        else\r
        {\r
                char name[128];\r
-               strncpy(name,str,128);  name[127]=name[n]=0;\r
+               mgl_strncpy(name,str,128);      name[127]=name[n]=0;\r
                memmove(str,str+n+1,len-n);\r
                len=strlen(str);                str[--len]=0;\r
                if(!strcmp(name,"sin")) Kod=EQ_SIN;\r
@@ -173,6 +178,11 @@ mglFormulaC::mglFormulaC(const char *string)
                else if(!strcmp(name,"abs")) Kod=EQ_ABS;\r
                else if(!strcmp(name,"arg")) Kod=EQ_ARG;\r
                else if(!strcmp(name,"conj")) Kod=EQ_CONJ;\r
+               else if(!strcmp(name,"real")) Kod=EQ_REAL;\r
+               else if(!strcmp(name,"imag")) Kod=EQ_IMAG;\r
+               else if(!strcmp(name,"norm")) Kod=EQ_NORM;\r
+               else if(!strcmp(name,"cmplx")) Kod=EQ_CMPLX;\r
+               else if(!strcmp(name,"hypot")) Kod=EQ_HYPOT;\r
                else {  delete []str;   return; }       // unknown function\r
                n=mglFindInText(str,",");\r
                if(n>=0)\r
@@ -232,10 +242,12 @@ dual MGL_LOCAL_CONST divc(dual a,dual b)  {return a/b;}
 dual MGL_LOCAL_CONST ipwc(dual a,dual b)       {return mgl_ipowc(a,int(b.real()));}\r
 dual MGL_LOCAL_CONST powc(dual a,dual b)       {return exp(b*log(a));  }\r
 dual MGL_LOCAL_CONST llgc(dual a,dual b)       {return log(a)/log(b);  }\r
+dual MGL_LOCAL_CONST cmplxc(dual a,dual b)     {return a+dual(0,1)*b;  }\r
 dual MGL_LOCAL_CONST expi(dual a)      {       return exp(dual(0,1)*a);        }\r
 dual MGL_LOCAL_CONST expi(double a)    {       return dual(cos(a),sin(a));     }\r
 //-----------------------------------------------------------------------------\r
 dual MGL_NO_EXPORT ic = dual(0,1);\r
+dual MGL_LOCAL_CONST hypotc(dual x, dual y)    {       return sqrt(x*x+y*y);   }\r
 dual MGL_LOCAL_CONST asinhc(dual x)    {       return log(x+sqrt(x*x+mreal(1)));       }\r
 dual MGL_LOCAL_CONST acoshc(dual x)    {       return log(x+sqrt(x*x-mreal(1)));       }\r
 dual MGL_LOCAL_CONST atanhc(dual x)    {       return log((mreal(1)+x)/(mreal(1)-x))/mreal(2); }\r
@@ -255,12 +267,15 @@ dual MGL_LOCAL_CONST logc(dual x) {       return log(x);  }
 dual MGL_LOCAL_CONST absc(dual x)      {       return abs(x);  }\r
 dual MGL_LOCAL_CONST argc(dual x)      {       return arg(x);  }\r
 dual MGL_LOCAL_CONST lgc(dual x)       {       return log10(x);}\r
+dual MGL_LOCAL_CONST realc(dual x)     {       return real(x); }\r
+dual MGL_LOCAL_CONST imagc(dual x)     {       return imag(x); }\r
+dual MGL_LOCAL_CONST normc(dual x)     {       return norm(x); }\r
 //-----------------------------------------------------------------------------\r
 typedef dual (*func_1)(dual);\r
 typedef dual (*func_2)(dual, dual);\r
-static const func_2 f2[EQ_SIN-EQ_LT] = {cltc,cgtc,ceqc,addc,subc,mulc,divc,ipwc,powc,llgc};\r
+static const func_2 f2[EQ_SIN-EQ_LT] = {cltc,cgtc,ceqc,addc,subc,mulc,divc,ipwc,powc,llgc,cmplxc,hypotc};\r
 static const func_1 f1[EQ_LAST-EQ_SIN] = {sinc,cosc,tanc,asinc,acosc,atanc,sinhc,coshc,tanhc,\r
-                                       asinhc,acoshc,atanhc,sqrtc,expc,expi,logc,lgc,absc,argc,conjc};\r
+                                       asinhc,acoshc,atanhc,sqrtc,expc,expi,logc,lgc,absc,argc,conjc,realc,imagc,normc};\r
 // evaluation of embedded (included) expressions\r
 dual mglFormulaC::CalcIn(const dual *a1) const\r
 {\r
index bfaed555f200bf34eba90dab9ca20826b1f9fbc6..b828ab3505c0a5068bf27f9fc009b18cbe7adf64 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************
  * evalp.cpp is part of Math Graphic Library
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   it under the terms of the GNU Library General Public License as       *
@@ -19,6 +19,7 @@
  ***************************************************************************/
 #include <time.h>
 #include <ctype.h>
+#include <wchar.h>
 #include "mgl2/base.h"
 #include "mgl2/parser.h"
 #if MGL_HAVE_GSL
@@ -143,13 +144,16 @@ HMDT mglApplyOperDiv(std::wstring a1, std::wstring a2, mglParser *arg, const std
        mreal va=a->a[0], vb=b->a[0], *aa=a->a, *bb=b->a, *cc=r->a;
        if(na==nb)
 #pragma omp parallel for
-               for(long i=0;i<nn;i++)  cc[i] = aa[i]/bb[i];
+               for(long i=0;i<nn;i++)  cc[i] = bb[i]!=0?aa[i]/bb[i]:NAN;
        else if(na==1)
 #pragma omp parallel for
-               for(long i=0;i<nn;i++)  cc[i] = va/bb[i];
-       else
+               for(long i=0;i<nn;i++)  cc[i] = bb[i]!=0?va/bb[i]:NAN;
+       else if(vb!=0)
 #pragma omp parallel for
                for(long i=0;i<nn;i++)  cc[i] = aa[i]/vb;
+       else
+#pragma omp parallel for
+               for(long i=0;i<nn;i++)  cc[i] = NAN;
        mgl_delete_data(d);     return r;
 }
 //-----------------------------------------------------------------------------
@@ -241,19 +245,22 @@ HADT mglApplyOperDivC(std::wstring a1, std::wstring a2, mglParser *arg, const st
        dual va=a->a[0], vb=b->a[0], *aa=a->a, *bb=b->a, *cc=r->a;
        if(na==nb)
 #pragma omp parallel for
-               for(long i=0;i<nn;i++)  cc[i] = aa[i]/bb[i];
+               for(long i=0;i<nn;i++)  cc[i] = bb[i]!=mreal(0)?aa[i]/bb[i]:NAN;
        else if(na==1)
 #pragma omp parallel for
-               for(long i=0;i<nn;i++)  cc[i] = va/bb[i];
-       else
+               for(long i=0;i<nn;i++)  cc[i] = bb[i]!=mreal(0)?va/bb[i]:NAN;
+       else if(vb!=mreal(0))
 #pragma omp parallel for
                for(long i=0;i<nn;i++)  cc[i] = aa[i]/vb;
+       else
+#pragma omp parallel for
+               for(long i=0;i<nn;i++)  cc[i] = NAN;
        mgl_delete_datac(d);    return r;
 }
 //-----------------------------------------------------------------------------
 bool mglCheck(std::wstring str)
 {
-       register long s = 0,i,n=str.length();
+       long s = 0,i,n=str.length();
        for(i=0;i<n;i++)
        {
                if(str[i]=='(') s++;
@@ -263,10 +270,10 @@ bool mglCheck(std::wstring str)
        return (s==0) ? true : false;
 }
 //-----------------------------------------------------------------------------
-int mglFindInText(std::wstring str,const char *lst)
+long mglFindInText(const std::wstring &str,const char *lst)
 {
-       register long l=0,r=0,i;//,j,len=strlen(lst);
-       for(i=str.length()-1;i>=0;i--)
+       long l=0,r=0;
+       for(long i=str.length()-1;i>=0;i--)
        {
                if(str[i]=='(') l++;
                if(str[i]==')') r++;
@@ -299,7 +306,7 @@ double MGL_LOCAL_CONST mgl_fmax(double a,double b);
 // It seems that standard wcstombs() have a bug. So, I replace by my own.
 void MGL_EXPORT mgl_wcstombs(char *dst, const wchar_t *src, int size)
 {
-       register int j;
+       int j;
        for(j=0;j<size-1 && src[j]!=0;j++)
                dst[j] = src[j]<0x7f ? src[j] : ' ';
        dst[j] = 0;
@@ -314,11 +321,33 @@ MGL_LOCAL_PURE const mglDataA *FindVar(const std::vector<mglDataA*> &head, const
 //-----------------------------------------------------------------------------
 void MGL_EXPORT mgl_wcslwr(wchar_t *str)
 {
-       register size_t l=mgl_wcslen(str);
+       size_t l=mgl_wcslen(str);
        for(size_t k=0;k<l;k++)
                str[k] = (str[k]>='A' && str[k]<='Z') ? str[k]+'a'-'A' : str[k];
 }
 //-----------------------------------------------------------------------------
+mreal mgl_gettime(const std::wstring &s)
+{
+       mreal t=NAN;
+       tm a;   memset(&a,0,sizeof(tm));
+       if(swscanf(s.c_str(),L"%u-%u-%u_%u.%u.%d", &a.tm_hour,&a.tm_min,&a.tm_sec, &a.tm_mday,&a.tm_mon,&a.tm_year)==6)
+       {       a.tm_year-=1900;        a.tm_mon -= 1;
+               if(a.tm_hour<24 && a.tm_min<60 && a.tm_sec<60 && a.tm_mday>0 && a.tm_mday<32 && a.tm_mon<12)
+                       t = mktime(&a);
+       }
+       else if(swscanf(s.c_str(),L"%d.%d.%d", &a.tm_mday,&a.tm_mon,&a.tm_year)==3)
+       {       a.tm_year-=1900;        a.tm_mon -= 1;
+               if(a.tm_mday>0 && a.tm_mday<32 && a.tm_mon<12)
+                       t = mktime(&a);
+       }
+       else if(swscanf(s.c_str(),L"%d-%d-%d", &a.tm_hour,&a.tm_min,&a.tm_sec)==3)
+       {       a.tm_mday=1;    a.tm_mon=0;     a.tm_year=70;
+               if(a.tm_hour<24 && a.tm_min<60 && a.tm_sec<60)
+                       t = mktime(&a);
+       }
+       return t;
+}
+//-----------------------------------------------------------------------------
 /// Parse string and substitute the script argument
 // All numbers are presented as mglData(1). Do boundary checking.
 // NOTE: In any case where number is required the mglData::a[0] is used.
@@ -330,6 +359,10 @@ HMDT MGL_NO_EXPORT mglFormulaCalc(std::wstring str, mglParser *arg, const std::v
 #endif
        if(str.empty()) return new mglData;     // nothing to parse
        str = mgl_trim_ws(str);
+       mreal tval = mgl_gettime(str);
+       if(mgl_isnum(tval))
+       {       mglData *r=new mglData; r->a[0] = tval; return r;       }
+
        long n,len=str.length();
        if(str[0]=='(' && mglCheck(str.substr(1,len-2)))        // remove braces
        {       str = str.substr(1,len-2);      len-=2; }
@@ -450,9 +483,15 @@ HMDT MGL_NO_EXPORT mglFormulaCalc(std::wstring str, mglParser *arg, const std::v
                {
                        if(ch=='a' && p[2]=='x')        v = d->Maximal();
                        else if(ch=='i' && p[2]=='n')   v = d->Minimal();
-                       else if(ch=='x')        {       v = d->Maximal(x,y,z);  v = x/ns[0];    }
-                       else if(ch=='y')        {       v = d->Maximal(x,y,z);  v = y/ns[1];    }
-                       else if(ch=='z')        {       v = d->Maximal(x,y,z);  v = z/ns[2];    }
+                       else if(ch=='x' && p[2]=='f')   v = d->Maximal('x',0)/mreal(ns[0]);
+                       else if(ch=='x' && p[2]=='l')   v = d->Maximal('x',-1)/mreal(ns[0]);
+                       else if(ch=='x')        {       d->Maximal(x,y,z);      v = x/ns[0];    }
+                       else if(ch=='y' && p[2]=='f')   v = d->Maximal('y',0)/mreal(ns[1]);
+                       else if(ch=='y' && p[2]=='l')   v = d->Maximal('y',-1)/mreal(ns[1]);
+                       else if(ch=='y')        {       d->Maximal(x,y,z);      v = y/ns[1];    }
+                       else if(ch=='z' && p[2]=='f')   v = d->Maximal('z',0)/mreal(ns[2]);
+                       else if(ch=='z' && p[2]=='l')   v = d->Maximal('z',-1)/mreal(ns[2]);
+                       else if(ch=='z')        {       d->Maximal(x,y,z);      v = z/ns[2];    }
                }
                else if(c0=='s')
                {
@@ -488,7 +527,7 @@ HMDT MGL_NO_EXPORT mglFormulaCalc(std::wstring str, mglParser *arg, const std::v
                else
                {
                        HMDT res = new mglData;
-                       char ch = str[0];
+                       wchar_t ch = str[0];
                        if(ch<':') res->a[0] = wcstod(str.c_str(),0);   // this is number
                        else if(!str.compare(L"pi"))    res->a[0] = M_PI;
                        else if(ch==':')        res->a[0] = -1;
@@ -673,7 +712,8 @@ HMDT MGL_NO_EXPORT mglFormulaCalc(std::wstring str, mglParser *arg, const std::v
                else if(!nm.compare(L"int"))    return mglApplyFunc(str, arg, head, floor);
                else if(!nm.compare(L"random"))
                {       HMDT res=mglFormulaCalc(str, arg, head);        mreal *a = res->a;
-                       for(long i=0;i<res->GetNN();i++)        a[i] = mgl_rnd();       return res;     }
+                       for(long i=0;i<res->GetNN();i++)        a[i] = mgl_rnd();
+                       return res;     }
                else if(!nm.compare(L"real"))
                {
                        HADT a1 = mglFormulaCalcC(str, arg, head);
@@ -686,6 +726,12 @@ HMDT MGL_NO_EXPORT mglFormulaCalc(std::wstring str, mglParser *arg, const std::v
                        HMDT res = mgl_datac_imag(a1);
                        mgl_delete_datac(a1);   return res;
                }
+               else if(!nm.compare(L"norm"))
+               {
+                       HADT a1 = mglFormulaCalcC(str, arg, head);
+                       HMDT res = mgl_datac_norm(a1);
+                       mgl_delete_datac(a1);   return res;
+               }
 #if MGL_HAVE_GSL
                else if(!nm.compare(L"i") && n>0)
                        return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gsl_sf_bessel_Inu);
@@ -718,9 +764,11 @@ dual MGL_LOCAL_CONST cgtc(dual a,dual b);  //{return real(a-b)>0?1:0;}
 dual MGL_LOCAL_CONST ipwc(dual a,dual b);      //{return mgl_ipowc(a,int(b.real()));}
 dual MGL_LOCAL_CONST powc(dual a,dual b);      //{return exp(b*log(a));        }
 dual MGL_LOCAL_CONST llgc(dual a,dual b);      //{return log(a)/log(b);        }
+dual MGL_LOCAL_CONST cmplxc(dual a,dual b);    //{return a+dual(0,1)*b;        }
 dual MGL_LOCAL_CONST expi(dual a);     //{     return exp(dual(0,1)*a);        }
 dual MGL_LOCAL_CONST expi(double a);   //{     return dual(cos(a),sin(a));     }
 //-----------------------------------------------------------------------------
+dual MGL_LOCAL_CONST hypotc(dual x, dual y);   //{     return sqrt(x*x+y*y);   }
 dual MGL_LOCAL_CONST asinhc(dual x);   //{     return log(x+sqrt(x*x+mreal(1)));       }
 dual MGL_LOCAL_CONST acoshc(dual x);   //{     return log(x+sqrt(x*x-mreal(1)));       }
 dual MGL_LOCAL_CONST atanhc(dual x);   //{     return log((mreal(1)+x)/(mreal(1)-x))/mreal(2); }
@@ -739,9 +787,10 @@ dual MGL_LOCAL_CONST sqrtc(dual x);        //{     return sqrt(x); }
 dual MGL_LOCAL_CONST logc(dual x);     //{     return log(x);  }
 dual MGL_LOCAL_CONST absc(dual x);     //{     return abs(x);  }
 dual MGL_LOCAL_CONST argc(dual x);     //{     return arg(x);  }
-dual MGL_LOCAL_CONST lgc(dual x);              //{     return log10(x);}
-dual MGL_LOCAL_CONST realc(dual x)     {       return real(x); }
-dual MGL_LOCAL_CONST imagc(dual x)     {       return dual(0,imag(x)); }
+dual MGL_LOCAL_CONST lgc(dual x);      //{     return log10(x);}
+dual MGL_LOCAL_CONST realc(dual x);    //{     return real(x); }
+dual MGL_LOCAL_CONST imagc(dual x);    //{     return imag(x); }
+dual MGL_LOCAL_CONST normc(dual x);    //{     return norm(x); }
 //-----------------------------------------------------------------------------
 /// Parse string and substitute the script argument
 // All numbers are presented as mglData(1). Do boundary checking.
@@ -754,6 +803,10 @@ HADT MGL_NO_EXPORT mglFormulaCalcC(std::wstring str, mglParser *arg, const std::
 #endif
        if(str.empty()) return new mglDataC;    // nothing to parse
        str = mgl_trim_ws(str);
+       mreal tval = mgl_gettime(str);
+       if(mgl_isnum(tval))
+       {       mglDataC *r=new mglDataC;       r->a[0] = tval; return r;       }
+       
        long n,len=str.length();
        if(str[0]=='(' && mglCheck(str.substr(1,len-2)))        // remove braces
        {       str = str.substr(1,len-2);      len-=2; }
@@ -779,8 +832,9 @@ HADT MGL_NO_EXPORT mglFormulaCalcC(std::wstring str, mglParser *arg, const std::
                                        {       k = res->ny;    res->Insert('y',k);     mgl_datac_put_dat(res,a1,-1,k,-1);      }
                                        else            // res 3d array
                                        {       k = res->nz;    res->Insert('z',k);     mgl_datac_put_dat(res,a1,-1,-1,k);      }
+                                       mgl_delete_datac(a1);
                                }
-                               mgl_delete_datac(a1);   j=i+1;
+                               j=i+1;
                        }
                }
                HADT a1=mglFormulaCalcC(str.substr(j,i-j), arg, head);
@@ -794,8 +848,9 @@ HADT MGL_NO_EXPORT mglFormulaCalcC(std::wstring str, mglParser *arg, const std::
                        {       k = res->ny;    res->Insert('y',k);     mgl_datac_put_dat(res,a1,-1,k,-1);      }
                        else            // res 3d array
                        {       k = res->nz;    res->Insert('z',k);     mgl_datac_put_dat(res,a1,-1,-1,k);      }
+                       mgl_delete_datac(a1);
                }
-               mgl_delete_datac(a1);   return res;
+               return res;
        }
 
        n=mglFindInText(str,"<>=");     // low priority -- conditions
@@ -869,9 +924,9 @@ HADT MGL_NO_EXPORT mglFormulaCalcC(std::wstring str, mglParser *arg, const std::
                        mreal x,y,z;
                        if(ch=='a' && p[2]=='x')        v = d->Maximal();
                        else if(ch=='i' && p[2]=='n')   v = d->Minimal();
-                       else if(ch=='x')        {       v = d->Maximal(x,y,z);  v = x/ns[0];    }
-                       else if(ch=='y')        {       v = d->Maximal(x,y,z);  v = y/ns[1];    }
-                       else if(ch=='z')        {       v = d->Maximal(x,y,z);  v = z/ns[2];    }
+                       else if(ch=='x')        {       d->Maximal(x,y,z);      v = x/ns[0];    }
+                       else if(ch=='y')        {       d->Maximal(x,y,z);      v = y/ns[1];    }
+                       else if(ch=='z')        {       d->Maximal(x,y,z);      v = z/ns[2];    }
                }
                else if(c0=='s')
                {
@@ -907,7 +962,7 @@ HADT MGL_NO_EXPORT mglFormulaCalcC(std::wstring str, mglParser *arg, const std::
                else
                {
                        HADT res = new mglDataC;
-                       char ch = str[0];
+                       wchar_t ch = str[0];
                        if(ch<':')      // this is real number
                                res->a[0] = (str[str.length()-1]=='i') ? dual(0,wcstod(str.c_str(),0)) :  mreal(wcstod(str.c_str(),0));
                        else if(ch=='i')        // this is imaginary number
@@ -970,13 +1025,15 @@ HADT MGL_NO_EXPORT mglFormulaCalcC(std::wstring str, mglParser *arg, const std::
                        else if(!nm.compare(L"acosh"))  return mglApplyFuncC(str, arg, head, acoshc);
                        else if(!nm.compare(L"atanh"))  return mglApplyFuncC(str, arg, head, atanhc);
                        else if(!nm.compare(L"arg"))    return mglApplyFuncC(str, arg, head, argc);
-                       else if(!nm.compare(L"abs"))            return mglApplyFuncC(str, arg, head, absc);
+                       else if(!nm.compare(L"abs"))    return mglApplyFuncC(str, arg, head, absc);
                }
                else if(nm[0]=='c')
                {
                        if(!nm.compare(L"cos")) return mglApplyFuncC(str, arg, head, cosc);
                        else if(!nm.compare(L"cosh") || !nm.compare(L"ch"))     return mglApplyFuncC(str, arg, head, coshc);
                        else if(!nm.compare(L"conj"))   return mglApplyFuncC(str, arg, head, conjc);
+                       else if(!nm.compare(L"cmplx") && n>0)
+                               return mglApplyOperC(str.substr(0,n),str.substr(n+1),arg, head, cmplxc);
                }
                else if(!nm.compare(L"exp"))    return mglApplyFuncC(str, arg, head, expc);
                else if(nm[0]=='l')
@@ -999,9 +1056,13 @@ HADT MGL_NO_EXPORT mglFormulaCalcC(std::wstring str, mglParser *arg, const std::
                        return mglApplyOperC(str.substr(0,n),str.substr(n+1),arg, head, powc);
                else if(!nm.compare(L"random"))
                {       HADT res=mglFormulaCalcC(str, arg, head);       dual *a = res->a;
-                       for(long i=0;i<res->GetNN();i++)        a[i] = dual(mgl_rnd(), mgl_rnd());      return res;     }
+                       for(long i=0;i<res->GetNN();i++)        a[i] = dual(mgl_rnd(), mgl_rnd());
+                       return res;     }
+               else if(!nm.compare(L"hypot"))
+                       return mglApplyOperC(str.substr(0,n),str.substr(n+1),arg, head, hypotc);
                else if(!nm.compare(L"real"))   return mglApplyFuncC(str, arg, head, realc);
                else if(!nm.compare(L"imag"))   return mglApplyFuncC(str, arg, head, imagc);
+               else if(!nm.compare(L"norm"))   return mglApplyFuncC(str, arg, head, normc);
        }
        HADT res = new mglDataC;        res->a[0]=NAN;  return res;
 }
diff --git a/src/exec.cpp b/src/exec.cpp
deleted file mode 100644 (file)
index daa56a1..0000000
+++ /dev/null
@@ -1,3696 +0,0 @@
-/***************************************************************************
- * exec.cpp is part of Math Graphic Library
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU Library General Public License as       *
- *   published by the Free Software Foundation; either version 3 of the    *
- *   License, or (at your option) any later version.                       *
- *                                                                         *
- *   This program is distributed in the hope that it will be useful,       *
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
- *   GNU General Public License for more details.                          *
- *                                                                         *
- *   You should have received a copy of the GNU Library General Public     *
- *   License along with this program; if not, write to the                 *
- *   Free Software Foundation, Inc.,                                       *
- *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
- ***************************************************************************/
-#ifdef WIN32
-#include <io.h>
-#include <direct.h>
-#else
-#include <unistd.h>
-#endif
-
-#include "mgl2/base.h"
-#include "mgl2/parser.h"
-wchar_t *mgl_str_copy(const char *s);
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_addlegend(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"ss"))     gr->AddLegend(a[0].w.c_str(),a[1].s.c_str());
-       else    res = 1;        return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_addto(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && !strcmp(k,"dd"))                *d += *(a[1].d);
-       else if(d && !strcmp(k,"dn"))   *d += a[1].v;
-       else if(c && !strcmp(k,"dd"))   *c += *(a[1].d);
-       else if(c && !strcmp(k,"dn"))   *c += a[1].c;
-       else    res = 1;        return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_sort(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(d && !strcmp(k,"dn"))        d->Sort(a[1].v, -1);
-       else if(d && !strcmp(k,"dnn"))  d->Sort(a[1].v, a[2].v);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_alpha(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]==0)     gr->Alpha(true);
-       else if(!strcmp(k,"n")) gr->Alpha(a[0].v!=0);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_pendelta(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"n"))      gr->SetPenDelta(a[0].v);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_plotid(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"s"))      gr->SetPlotId(a[1].s.c_str());
-       else  res = 1;  return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_mask(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"sn"))     gr->SetMask(a[0].s[0],a[1].v);
-       else if(!strcmp(k,"ss"))        gr->SetMask(a[0].s[0],a[1].s.c_str());
-       else if(!strcmp(k,"n"))         gr->SetMaskAngle(mgl_int(a[0].v));
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_alphadef(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"n"))      gr->SetAlphaDef(a[0].v);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_ambient(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"n"))      gr->SetAmbient(a[0].v);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_diffuse(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"n"))      gr->SetDiffuse(a[0].v);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_area(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->Area(*(a[0].d),"",opt);
-       else if(!strcmp(k,"ds"))        gr->Area(*(a[0].d),a[1].s.c_str(),opt);
-       else if(!strcmp(k,"dd"))        gr->Area(*(a[0].d),*(a[1].d),"",opt);
-       else if(!strcmp(k,"dds"))       gr->Area(*(a[0].d),*(a[1].d),a[2].s.c_str(),opt);
-       else if(!strcmp(k,"ddd"))       gr->Area(*(a[0].d),*(a[1].d),*(a[2].d),"",opt);
-       else if(!strcmp(k,"ddds"))      gr->Area(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_aspect(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"nn"))     gr->Aspect(a[0].v, a[1].v, 1);
-       else if(!strcmp(k,"nnn"))       gr->Aspect(a[0].v, a[1].v, a[2].v);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_axial(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->Axial(*(a[0].d),"",opt);
-       else if(!strcmp(k,"ds"))        gr->Axial(*(a[0].d),a[1].s.c_str(),opt);
-       else if(!strcmp(k,"ddd"))       gr->Axial(*(a[0].d),*(a[1].d),*(a[2].d),"",opt);
-       else if(!strcmp(k,"ddds"))      gr->Axial(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_axis(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(k[0]==0)     gr->Axis("xyz","",opt);
-       else if(!strcmp(k,"s"))         gr->Axis(a[0].s.c_str(), "",opt);
-       else if(!strcmp(k,"ss"))        gr->Axis(a[0].s.c_str(), a[1].s.c_str(),opt);
-       else if(!strcmp(k,"sss"))       gr->SetFunc(a[0].s.c_str(),a[1].s.c_str(),a[2].s.c_str(),"");
-       else if(!strcmp(k,"ssss"))      gr->SetFunc(a[0].s.c_str(),a[1].s.c_str(),a[2].s.c_str(),a[3].s.c_str());
-       else if(!strcmp(k,"n"))         gr->SetCoor(mgl_int(a[0].v));
-       else if(!strcmp(k,"nnnn"))      gr->SetRanges(a[0].v,a[2].v, a[1].v,a[3].v);
-       else if(!strcmp(k,"nnnnnn"))gr->SetRanges(a[0].v,a[3].v, a[1].v,a[4].v, a[2].v,a[5].v);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_ball(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;      gr->Self()->SaveState(opt);
-       if(!strcmp(k,"nn"))     gr->Mark(mglPoint(a[0].v,a[1].v,NAN),"r.");
-       else if(!strcmp(k,"nns"))       gr->Mark(mglPoint(a[0].v,a[1].v,NAN),a[2].s.c_str());
-       else if(!strcmp(k,"nnn"))       gr->Mark(mglPoint(a[0].v,a[1].v,a[2].v),"r.");
-       else if(!strcmp(k,"nnns"))      gr->Mark(mglPoint(a[0].v,a[1].v,a[2].v),a[3].s.c_str());
-       else res = 1;   gr->Self()->LoadState();        return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_box(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;      gr->Self()->SaveState(opt);
-       if(k[0]==0)     gr->Box();
-       else if(!strcmp(k,"s"))         gr->Box(a[0].s.c_str());
-       else if(!strcmp(k,"sn"))        gr->Box(a[0].s.c_str(), a[1].v);
-       else res = 1;   gr->Self()->LoadState();        return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_ohlc(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"dddd"))   gr->OHLC(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d), "",opt);
-       else if(!strcmp(k,"dddds"))     gr->OHLC(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d), a[4].s.c_str(),opt);
-       else if(!strcmp(k,"ddddd"))     gr->OHLC(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d), "",opt);
-       else if(!strcmp(k,"ddddds"))    gr->OHLC(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d), a[5].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_bars(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->Bars(*(a[0].d), "",opt);
-       else if(!strcmp(k,"ds"))        gr->Bars(*(a[0].d), a[1].s.c_str(),opt);
-       else if(!strcmp(k,"dd"))        gr->Bars(*(a[0].d), *(a[1].d), "",opt);
-       else if(!strcmp(k,"dds"))       gr->Bars(*(a[0].d), *(a[1].d), a[2].s.c_str(),opt);
-       else if(!strcmp(k,"ddd"))       gr->Bars(*(a[0].d), *(a[1].d), *(a[2].d), "",opt);
-       else if(!strcmp(k,"ddds"))      gr->Bars(*(a[0].d), *(a[1].d), *(a[2].d), a[3].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_barh(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->Barh(*(a[0].d), "",opt);
-       else if(!strcmp(k,"ds"))        gr->Barh(*(a[0].d), a[1].s.c_str(),opt);
-       else if(!strcmp(k,"dd"))        gr->Barh(*(a[0].d), *(a[1].d), "",opt);
-       else if(!strcmp(k,"dds"))       gr->Barh(*(a[0].d), *(a[1].d), a[2].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_cones(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->Cones(*(a[0].d), "",opt);
-       else if(!strcmp(k,"ds"))        gr->Cones(*(a[0].d), a[1].s.c_str(),opt);
-       else if(!strcmp(k,"dd"))        gr->Cones(*(a[0].d), *(a[1].d), "",opt);
-       else if(!strcmp(k,"dds"))       gr->Cones(*(a[0].d), *(a[1].d), a[2].s.c_str(),opt);
-       else if(!strcmp(k,"ddd"))       gr->Cones(*(a[0].d), *(a[1].d), *(a[2].d), "",opt);
-       else if(!strcmp(k,"ddds"))      gr->Cones(*(a[0].d), *(a[1].d), *(a[2].d), a[3].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_belt(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->Belt(*(a[0].d),"",opt);
-       else if(!strcmp(k,"ds"))        gr->Belt(*(a[0].d),a[1].s.c_str(),opt);
-       else if(!strcmp(k,"ddd"))       gr->Belt(*(a[0].d),*(a[1].d),*(a[2].d),"",opt);
-       else if(!strcmp(k,"ddds"))      gr->Belt(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_boxs(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->Boxs(*(a[0].d),"",opt);
-       else if(!strcmp(k,"ds"))        gr->Boxs(*(a[0].d),a[1].s.c_str(),opt);
-       else if(!strcmp(k,"ddd"))       gr->Boxs(*(a[0].d),*(a[1].d),*(a[2].d),"",opt);
-       else if(!strcmp(k,"ddds"))      gr->Boxs(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_beam(mglGraph *gr, long , mglArg *a, const char *k, const char *)               // NOTE beam can be made obsolete ???
-{
-       int res=0;
-       if(!strcmp(k,"ddddn"))
-               gr->Beam(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].v,"",0, 3);
-       else if(!strcmp(k,"ddddns"))
-               gr->Beam(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].v,a[5].s.c_str(),0, 3);
-       else if(!strcmp(k,"ddddnsn"))
-               gr->Beam(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].v,a[5].s.c_str(),mgl_int(a[6].v), 3);
-       else if(!strcmp(k,"ddddnsnn"))
-               gr->Beam(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].v,a[5].s.c_str(),mgl_int(a[6].v), mgl_int(a[7].v));
-       else if(!strcmp(k,"nddddn"))
-               gr->Beam(a[0].v,*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),a[5].v,"",0);
-       else if(!strcmp(k,"nddddns"))
-               gr->Beam(a[0].v,*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),a[5].v,a[6].s.c_str(),0);
-       else if(!strcmp(k,"nddddnsn"))
-               gr->Beam(a[0].v,*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),a[5].v,a[6].s.c_str(),mgl_int(a[7].v));
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_clearlegend(mglGraph *gr, long , mglArg *, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]==0)     gr->ClearLegend();
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_rasterize(mglGraph *gr, long , mglArg *, const char *, const char *)
-{
-       gr->Rasterize();        return 0;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_background(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"s"))      gr->LoadBackground(a[0].s.c_str());
-       else if(!strcmp(k,"sn"))        gr->LoadBackground(a[0].s.c_str(),a[1].v);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_clf(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]==0)     gr->Clf();
-       else if(!strcmp(k,"s")) gr->Clf(a[0].s.c_str());
-       else if(!strcmp(k,"nnn"))       gr->Clf(a[0].v,a[1].v,a[2].v);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_reset(mglGraph *gr, long , mglArg *, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]==0)     gr->DefaultPlotParam();
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_chart(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->Chart(*(a[0].d), "",opt);
-       else if(!strcmp(k,"ds"))        gr->Chart(*(a[0].d), a[1].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_cloud(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->Cloud(*(a[0].d),"",opt);
-       else if(!strcmp(k,"ds"))        gr->Cloud(*(a[0].d),a[1].s.c_str(),opt);
-       else if(!strcmp(k,"dddd"))      gr->Cloud(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),"",opt);
-       else if(!strcmp(k,"dddds"))     gr->Cloud(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_crange(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->SetRange('c',*(a[0].d));
-       else if(!strcmp(k,"dn"))        gr->SetRange('c',*(a[0].d),a[1].v);
-       else if(!strcmp(k,"nn"))        gr->SetRange('c', a[0].v, a[1].v);
-       else if(!strcmp(k,"nnn"))
-       {
-               if(a[2].v)      gr->AddRange('c', a[0].v, a[1].v);
-               else    gr->SetRange('c', a[0].v, a[1].v);
-       }
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_crop(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && !strcmp(k,"dnns"))      d->Crop(mgl_int(a[1].v),mgl_int(a[2].v),a[3].s.c_str()[0]);
-       else if(c && !strcmp(k,"dnns")) c->Crop(mgl_int(a[1].v),mgl_int(a[2].v),a[3].s.c_str()[0]);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_clean(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(d && !strcmp(k,"dn"))        d->Clean(mgl_int(a[1].v));
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_cumsum(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && !strcmp(k,"ds"))        d->CumSum(a[1].s.c_str());
-       else if(c && !strcmp(k,"ds"))   c->CumSum(a[1].s.c_str());
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_curve(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"nnnnnnnn"))
-               gr->Curve(mglPoint(a[0].v,a[1].v,NAN),
-                       mglPoint(a[2].v,a[3].v),
-                       mglPoint(a[4].v,a[5].v,NAN),
-                       mglPoint(a[6].v,a[7].v));
-       else if(!strcmp(k,"nnnnnnnns"))
-               gr->Curve(mglPoint(a[0].v,a[1].v,NAN),
-                       mglPoint(a[2].v,a[3].v),
-                       mglPoint(a[4].v,a[5].v,NAN),
-                       mglPoint(a[6].v,a[7].v), a[8].s.c_str());
-       else if(!strcmp(k,"nnnnnnnnnnnn"))
-               gr->Curve(mglPoint(a[0].v,a[1].v,a[2].v),
-                       mglPoint(a[3].v,a[4].v,a[5].v),
-                       mglPoint(a[6].v,a[7].v,a[8].v),
-                       mglPoint(a[9].v,a[10].v,a[11].v));
-       else if(!strcmp(k,"nnnnnnnnnnnns"))
-               gr->Curve(mglPoint(a[0].v,a[1].v,a[2].v),
-                       mglPoint(a[3].v,a[4].v,a[5].v),
-                       mglPoint(a[6].v,a[7].v,a[8].v),
-                       mglPoint(a[9].v,a[10].v,a[11].v), a[12].s.c_str());
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_cut(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"n"))      gr->SetCut(a[0].v != 0);
-       else if(!strcmp(k,"nnnnnn"))
-               gr->SetCutBox(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v));
-       else if(!strcmp(k,"s")) gr->CutOff(a[0].s.c_str());
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_crust(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"ddd"))    gr->Crust(*(a[0].d),*(a[1].d),*(a[2].d),"",opt);
-       else if(!strcmp(k,"ddds"))      gr->Crust(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_colorbar(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;      gr->Self()->SaveState(opt);
-       if(k[0]==0)     gr->Colorbar();
-       else if(!strcmp(k,"s"))         gr->Colorbar(a[0].s.c_str());
-       else if(!strcmp(k,"d"))         gr->Colorbar(*(a[0].d));
-       else if(!strcmp(k,"ds"))        gr->Colorbar(*(a[0].d), a[1].s.c_str());
-       else if(!strcmp(k,"snn"))       gr->Colorbar(a[0].s.c_str(), a[1].v, a[2].v);
-       else if(!strcmp(k,"snnn"))      gr->Colorbar(a[0].s.c_str(), a[1].v, a[2].v, a[3].v,1);
-       else if(!strcmp(k,"snnnn"))     gr->Colorbar(a[0].s.c_str(), a[1].v, a[2].v, a[3].v,a[4].v);
-       else if(!strcmp(k,"dsnn"))      gr->Colorbar(*(a[0].d), a[1].s.c_str(), a[2].v, a[3].v);
-       else if(!strcmp(k,"dsnnn"))     gr->Colorbar(*(a[0].d), a[1].s.c_str(), a[2].v, a[3].v, a[4].v,1);
-       else if(!strcmp(k,"dsnnnn"))
-               gr->Colorbar(*(a[0].d), a[1].s.c_str(), a[2].v, a[3].v, a[4].v,a[5].v);
-       else res = 1;   gr->Self()->LoadState();        return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_copy(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(c && !strcmp(k,"dd"))        c->Set(a[1].d);
-       else if(!d)     return 1;
-       else if(!strcmp(k,"dd"))        d->Set(a[1].d);
-       else if(!strcmp(k,"dds"))
-       {       d->Set(a[1].d); gr->Fill(*d, a[2].s.c_str());   }
-       else if(!strcmp(k,"ddd"))
-       {
-               mglData *D = dynamic_cast<mglData *>(a[1].d);
-               mglDataC *C = dynamic_cast<mglDataC *>(a[2].d);
-               if(D && C)      {       d->Set(C->Real());      D->Set(C->Imag());      }
-               else    res = 1;
-       }
-       else if(!strcmp(k,"dn"))        *d = a[1].v;
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_cont(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->Cont(*(a[0].d),"",opt);
-       else if(!strcmp(k,"ds"))        gr->Cont(*(a[0].d),a[1].s.c_str(),opt);
-       else if(!strcmp(k,"dd"))        gr->Cont(*(a[0].d), *(a[1].d), "",opt);
-       else if(!strcmp(k,"dds"))       gr->Cont(*(a[0].d), *(a[1].d), a[2].s.c_str(),opt);
-       else if(!strcmp(k,"ddd"))       gr->Cont(*(a[0].d), *(a[1].d), *(a[2].d), "",opt);
-       else if(!strcmp(k,"ddds"))      gr->Cont(*(a[0].d), *(a[1].d), *(a[2].d), a[3].s.c_str(),opt);
-       else if(!strcmp(k,"dddd"))      gr->Cont(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), "",opt);
-       else if(!strcmp(k,"dddds"))     gr->Cont(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), a[4].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_contv(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->ContV(*(a[0].d),"",opt);
-       else if(!strcmp(k,"ds"))        gr->ContV(*(a[0].d),a[1].s.c_str(),opt);
-       else if(!strcmp(k,"dd"))        gr->ContV(*(a[0].d), *(a[1].d), "",opt);
-       else if(!strcmp(k,"dds"))       gr->ContV(*(a[0].d), *(a[1].d), a[2].s.c_str(),opt);
-       else if(!strcmp(k,"ddd"))       gr->ContV(*(a[0].d), *(a[1].d), *(a[2].d), "",opt);
-       else if(!strcmp(k,"ddds"))      gr->ContV(*(a[0].d), *(a[1].d), *(a[2].d), a[3].s.c_str(),opt);
-       else if(!strcmp(k,"dddd"))      gr->ContV(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), "",opt);
-       else if(!strcmp(k,"dddds"))     gr->ContV(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), a[4].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_contf(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->ContF(*(a[0].d),"",opt);
-       else if(!strcmp(k,"ds"))        gr->ContF(*(a[0].d),a[1].s.c_str(),opt);
-       else if(!strcmp(k,"dd"))        gr->ContF(*(a[0].d), *(a[1].d), "",opt);
-       else if(!strcmp(k,"dds"))       gr->ContF(*(a[0].d), *(a[1].d), a[2].s.c_str(),opt);
-       else if(!strcmp(k,"ddd"))       gr->ContF(*(a[0].d), *(a[1].d), *(a[2].d), "",opt);
-       else if(!strcmp(k,"ddds"))      gr->ContF(*(a[0].d), *(a[1].d), *(a[2].d), a[3].s.c_str(),opt);
-       else if(!strcmp(k,"dddd"))      gr->ContF(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), "",opt);
-       else if(!strcmp(k,"dddds"))     gr->ContF(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), a[4].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_contd(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->ContD(*(a[0].d),"",opt);
-       else if(!strcmp(k,"ds"))        gr->ContD(*(a[0].d),a[1].s.c_str(),opt);
-       else if(!strcmp(k,"dd"))        gr->ContD(*(a[0].d), *(a[1].d), "",opt);
-       else if(!strcmp(k,"dds"))       gr->ContD(*(a[0].d), *(a[1].d), a[2].s.c_str(),opt);
-       else if(!strcmp(k,"ddd"))       gr->ContD(*(a[0].d), *(a[1].d), *(a[2].d), "",opt);
-       else if(!strcmp(k,"ddds"))      gr->ContD(*(a[0].d), *(a[1].d), *(a[2].d), a[3].s.c_str(),opt);
-       else if(!strcmp(k,"dddd"))      gr->ContD(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), "",opt);
-       else if(!strcmp(k,"dddds"))     gr->ContD(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), a[4].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_cont3(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->Cont3(*(a[0].d), "", -1,opt);
-       else if(!strcmp(k,"ds"))        gr->Cont3(*(a[0].d), a[1].s.c_str(), -1,opt);
-       else if(!strcmp(k,"dsn"))       gr->Cont3(*(a[0].d), a[1].s.c_str(), mgl_int(a[2].v),opt);
-       else if(!strcmp(k,"dd"))        gr->Cont3(*(a[0].d), *(a[1].d), "", -1,opt);
-       else if(!strcmp(k,"dds"))       gr->Cont3(*(a[0].d), *(a[1].d), a[2].s.c_str(),-1,opt);
-       else if(!strcmp(k,"ddsn"))      gr->Cont3(*(a[0].d), *(a[1].d), a[2].s.c_str(),mgl_int(a[3].v),opt);
-       else if(!strcmp(k,"dddd"))      gr->Cont3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), "", -1,opt);
-       else if(!strcmp(k,"dddds"))     gr->Cont3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), a[4].s.c_str(),-1,opt);
-       else if(!strcmp(k,"ddddsn"))    gr->Cont3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), a[4].s.c_str(),mgl_int(a[5].v),opt);
-       else if(!strcmp(k,"ddddd"))     gr->Cont3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), "", -1,opt);
-       else if(!strcmp(k,"ddddds"))    gr->Cont3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), a[5].s.c_str(),-1,opt);
-       else if(!strcmp(k,"dddddsn"))gr->Cont3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), a[5].s.c_str(),mgl_int(a[6].v),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_contf3(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->ContF3(*(a[0].d), "", -1,opt);
-       else if(!strcmp(k,"ds"))        gr->ContF3(*(a[0].d), a[1].s.c_str(), -1,opt);
-       else if(!strcmp(k,"dsn"))       gr->ContF3(*(a[0].d), a[1].s.c_str(), mgl_int(a[2].v),opt);
-       else if(!strcmp(k,"dd"))        gr->ContF3(*(a[0].d), *(a[1].d), "", -1,opt);
-       else if(!strcmp(k,"dds"))       gr->ContF3(*(a[0].d), *(a[1].d), a[2].s.c_str(),-1,opt);
-       else if(!strcmp(k,"ddsn"))      gr->ContF3(*(a[0].d), *(a[1].d), a[2].s.c_str(),mgl_int(a[3].v),opt);
-       else if(!strcmp(k,"dddd"))      gr->ContF3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), "", -1,opt);
-       else if(!strcmp(k,"dddds"))     gr->ContF3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), a[4].s.c_str(),-1,opt);
-       else if(!strcmp(k,"ddddsn"))    gr->ContF3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), a[4].s.c_str(),mgl_int(a[5].v),opt);
-       else if(!strcmp(k,"ddddd"))     gr->ContF3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), "", -1,opt);
-       else if(!strcmp(k,"ddddds"))    gr->ContF3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), a[5].s.c_str(),-1,opt);
-       else if(!strcmp(k,"dddddsn"))gr->ContF3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), a[5].s.c_str(),mgl_int(a[6].v),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_contx(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->ContX(*(a[0].d),"",NAN,opt);
-       else if(!strcmp(k,"ds"))        gr->ContX(*(a[0].d),a[1].s.c_str(),NAN,opt);
-       else if(!strcmp(k,"dsn"))       gr->ContX(*(a[0].d),a[1].s.c_str(),a[2].v,opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_contfx(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->ContFX(*(a[0].d),"",NAN,opt);
-       else if(!strcmp(k,"ds"))        gr->ContFX(*(a[0].d),a[1].s.c_str(),NAN,opt);
-       else if(!strcmp(k,"dsn"))       gr->ContFX(*(a[0].d),a[1].s.c_str(),a[2].v,opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_conty(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->ContY(*(a[0].d),"",NAN,opt);
-       else if(!strcmp(k,"ds"))        gr->ContY(*(a[0].d),a[1].s.c_str(),NAN,opt);
-       else if(!strcmp(k,"dsn"))       gr->ContY(*(a[0].d),a[1].s.c_str(),a[2].v,opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_contfy(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->ContFY(*(a[0].d),"",NAN,opt);
-       else if(!strcmp(k,"ds"))        gr->ContFY(*(a[0].d),a[1].s.c_str(),NAN,opt);
-       else if(!strcmp(k,"dsn"))       gr->ContFY(*(a[0].d),a[1].s.c_str(),a[2].v,opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_contz(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->ContZ(*(a[0].d),"",NAN,opt);
-       else if(!strcmp(k,"ds"))        gr->ContZ(*(a[0].d),a[1].s.c_str(),NAN,opt);
-       else if(!strcmp(k,"dsn"))       gr->ContZ(*(a[0].d),a[1].s.c_str(),a[2].v,opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_contfz(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->ContFZ(*(a[0].d),"",NAN,opt);
-       else if(!strcmp(k,"ds"))        gr->ContFZ(*(a[0].d),a[1].s.c_str(),NAN,opt);
-       else if(!strcmp(k,"dsn"))       gr->ContFZ(*(a[0].d),a[1].s.c_str(),a[2].v,opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_cone(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;      gr->Self()->SaveState(opt);
-       if(!strcmp(k,"nnnnnnn"))        gr->Cone(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v), a[6].v);
-       else if(!strcmp(k,"nnnnnnns"))  gr->Cone(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v), a[6].v,-1, a[7].s.c_str());
-       else if(!strcmp(k,"nnnnnnnn"))  gr->Cone(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v), a[6].v, a[7].v);
-       else if(!strcmp(k,"nnnnnnnns")) gr->Cone(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v), a[6].v, a[7].v, a[8].s.c_str());
-       else res = 1;   gr->Self()->LoadState();        return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_ellipse(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;      gr->Self()->SaveState(opt);
-       if(!strcmp(k,"nnnnn"))
-               gr->Ellipse(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v,NAN), a[4].v);
-       else if(!strcmp(k,"nnnnns"))
-               gr->Ellipse(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v,NAN), a[4].v, a[5].s.c_str());
-       else if(!strcmp(k,"nnnnnnn"))
-               gr->Ellipse(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v), a[6].v);
-       else if(!strcmp(k,"nnnnnnns"))
-               gr->Ellipse(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v), a[6].v, a[7].s.c_str());
-       else res = 1;   gr->Self()->LoadState();        return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_circle(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;      gr->Self()->SaveState(opt);
-       if(!strcmp(k,"nnn"))    gr->Circle(mglPoint(a[0].v,a[1].v, NAN), a[2].v);
-       else if(!strcmp(k,"nnns"))      gr->Circle(mglPoint(a[0].v,a[1].v, NAN), a[2].v, a[3].s.c_str());
-       else if(!strcmp(k,"nnnn"))      gr->Circle(mglPoint(a[0].v,a[1].v,a[2].v), a[3].v);
-       else if(!strcmp(k,"nnnns"))     gr->Circle(mglPoint(a[0].v,a[1].v,a[2].v), a[3].v, a[4].s.c_str());
-       else res = 1;   gr->Self()->LoadState();        return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_rhomb(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;      gr->Self()->SaveState(opt);
-       if(!strcmp(k,"nnnnn"))
-               gr->Rhomb(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v,NAN), a[4].v);
-       else if(!strcmp(k,"nnnnns"))
-               gr->Rhomb(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v,NAN), a[4].v, a[5].s.c_str());
-       else if(!strcmp(k,"nnnnnnn"))
-               gr->Rhomb(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v), a[6].v);
-       else if(!strcmp(k,"nnnnnnns"))
-               gr->Rhomb(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v), a[6].v, a[7].s.c_str());
-       else res = 1;   gr->Self()->LoadState();        return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_polygon(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;      gr->Self()->SaveState(opt);
-       if(!strcmp(k,"nnnnn"))
-               gr->Polygon(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v,NAN), mgl_int(a[4].v));
-       else if(!strcmp(k,"nnnnns"))
-               gr->Polygon(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v,NAN), mgl_int(a[4].v), a[5].s.c_str());
-       else if(!strcmp(k,"nnnnnnn"))
-               gr->Polygon(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v), mgl_int(a[6].v));
-       else if(!strcmp(k,"nnnnnnns"))
-               gr->Polygon(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v), mgl_int(a[6].v), a[7].s.c_str());
-       else res = 1;   gr->Self()->LoadState();        return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_arc(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;      gr->Self()->SaveState(opt);
-       if(!strcmp(k,"nnnnn"))
-               gr->Arc(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v,NAN), a[4].v);
-       else if(!strcmp(k,"nnnnns"))
-               gr->Arc(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v,NAN), a[4].v, a[5].s.c_str());
-       else if(!strcmp(k,"nnnnnn"))
-               gr->Arc(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v), a[5].v);
-       else if(!strcmp(k,"nnnnnns"))
-               gr->Arc(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v), a[5].v, a[6].s.c_str());
-       else if(!strcmp(k,"nnnnnnnnnn"))
-               gr->Arc(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v, a[5].v), mglPoint(a[6].v,a[7].v, a[8].v), a[9].v);
-       else if(!strcmp(k,"nnnnnnnnnns"))
-               gr->Arc(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v, a[5].v), mglPoint(a[6].v,a[7].v, a[8].v), a[9].v, a[10].s.c_str());
-       else res = 1;   gr->Self()->LoadState();        return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_dens(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->Dens(*(a[0].d),"",opt);
-       else if(!strcmp(k,"ds"))        gr->Dens(*(a[0].d),a[1].s.c_str(),opt);
-       else if(!strcmp(k,"ddd"))       gr->Dens(*(a[0].d), *(a[1].d), *(a[2].d), "",opt);
-       else if(!strcmp(k,"ddds"))      gr->Dens(*(a[0].d), *(a[1].d), *(a[2].d), a[3].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_dens3(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->Dens3(*(a[0].d),"",-1,opt);
-       else if(!strcmp(k,"ds"))        gr->Dens3(*(a[0].d),a[1].s.c_str(),-1,opt);
-       else if(!strcmp(k,"dsn"))       gr->Dens3(*(a[0].d),a[1].s.c_str(),mgl_int(a[2].v),opt);
-       else if(!strcmp(k,"dddd"))      gr->Dens3(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),"", -1,opt);
-       else if(!strcmp(k,"dddds"))     gr->Dens3(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.c_str(),-1,opt);
-       else if(!strcmp(k,"ddddsn"))    gr->Dens3(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.c_str(),mgl_int(a[5].v),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_densx(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->DensX(*(a[0].d),"",NAN,opt);
-       else if(!strcmp(k,"ds"))        gr->DensX(*(a[0].d),a[1].s.c_str(),NAN,opt);
-       else if(!strcmp(k,"dsn"))       gr->DensX(*(a[0].d),a[1].s.c_str(),a[2].v,opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_densy(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->DensY(*(a[0].d),"",NAN,opt);
-       else if(!strcmp(k,"ds"))        gr->DensY(*(a[0].d),a[1].s.c_str(),NAN,opt);
-       else if(!strcmp(k,"dsn"))       gr->DensY(*(a[0].d),a[1].s.c_str(),a[2].v,opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_densz(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->DensZ(*(a[0].d),"",NAN,opt);
-       else if(!strcmp(k,"ds"))        gr->DensZ(*(a[0].d),a[1].s.c_str(),NAN,opt);
-       else if(!strcmp(k,"dsn"))       gr->DensZ(*(a[0].d),a[1].s.c_str(),a[2].v,opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_divto(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && !strcmp(k,"dd"))                *d /= *(a[1].d);
-       else if(d && !strcmp(k,"dn"))   *d /= a[1].v;
-       else if(c && !strcmp(k,"dd"))   *c /= *(a[1].d);
-       else if(c && !strcmp(k,"dn"))   *c /= a[1].c;
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_multo(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && !strcmp(k,"dd"))                *d *= *(a[1].d);
-       else if(d && !strcmp(k,"dn"))   *d *= a[1].v;
-       else if(c && !strcmp(k,"dd"))   *c *= *(a[1].d);
-       else if(c && !strcmp(k,"dn"))   *c *= a[1].c;
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_subto(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && !strcmp(k,"dd"))                *d -= *(a[1].d);
-       else if(d && !strcmp(k,"dn"))   *d -= a[1].v;
-       else if(c && !strcmp(k,"dd"))   *c -= *(a[1].d);
-       else if(c && !strcmp(k,"dn"))   *c -= a[1].c;
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_dots(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"ddd"))    gr->Dots(*(a[0].d),*(a[1].d),*(a[2].d),"",opt);
-       else if(!strcmp(k,"ddds"))      gr->Dots(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.c_str(),opt);
-       else if(!strcmp(k,"dddd"))      gr->Dots(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),"",opt);
-       else if(!strcmp(k,"dddds"))     gr->Dots(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.c_str(),opt);
-       else if(!strcmp(k,"ddddd"))     gr->Dots(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),"",opt);
-       else if(!strcmp(k,"ddddds"))gr->Dots(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),a[5].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_diff(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && !strcmp(k,"ds"))        d->Diff(a[1].s.c_str());
-       else if(d && !strcmp(k,"ddd"))  d->Diff(*(a[1].d), *(a[2].d));
-       else if(d && !strcmp(k,"dddd")) d->Diff(*(a[1].d), *(a[2].d), *(a[3].d));
-       else if(c && !strcmp(k,"ds"))   c->Diff(a[1].s.c_str());
-//     else if(c && !strcmp(k,"ddd"))  c->Diff(*(a[1].d), *(a[2].d));  // TODO Add later
-//     else if(c && !strcmp(k,"dddd")) c->Diff(*(a[1].d), *(a[2].d), *(a[3].d));
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_diff2(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && !strcmp(k,"ds"))        d->Diff2(a[1].s.c_str());
-       else if(c && !strcmp(k,"ds"))   c->Diff2(a[1].s.c_str());
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_drop(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;      gr->Self()->SaveState(opt);
-       if(!strcmp(k,"nnnnn"))
-               gr->Drop(mglPoint(a[0].v,a[1].v), mglPoint(a[2].v,a[3].v), a[4].v);
-       else if(!strcmp(k,"nnnnns"))
-               gr->Drop(mglPoint(a[0].v,a[1].v), mglPoint(a[2].v,a[3].v), a[4].v, a[5].s.c_str());
-       else if(!strcmp(k,"nnnnnsn"))
-               gr->Drop(mglPoint(a[0].v,a[1].v), mglPoint(a[2].v,a[3].v), a[4].v, a[5].s.c_str(), a[6].v);
-       else if(!strcmp(k,"nnnnnsnn"))
-               gr->Drop(mglPoint(a[0].v,a[1].v), mglPoint(a[2].v,a[3].v), a[4].v, a[5].s.c_str(), a[6].v, a[7].v);
-       else if(!strcmp(k,"nnnnnnn"))
-               gr->Drop(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v), a[6].v);
-       else if(!strcmp(k,"nnnnnnns"))
-               gr->Drop(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v), a[6].v, a[7].s.c_str());
-       else if(!strcmp(k,"nnnnnnnsn"))
-               gr->Drop(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v), a[6].v, a[7].s.c_str(), a[8].v);
-       else if(!strcmp(k,"nnnnnnnsnn"))
-               gr->Drop(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v), a[6].v, a[7].s.c_str(), a[8].v, a[9].v);
-       else res = 1;   gr->Self()->LoadState();        return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_dew(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"dd"))     gr->Dew(*(a[0].d),*(a[1].d),"",opt);
-       else if(!strcmp(k,"dds"))       gr->Dew(*(a[0].d),*(a[1].d),a[2].s.c_str(),opt);
-       else if(!strcmp(k,"dddd"))      gr->Dew(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),"",opt);
-       else if(!strcmp(k,"dddds"))     gr->Dew(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_fall(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->Fall(*(a[0].d),"",opt);
-       else if(!strcmp(k,"ds"))        gr->Fall(*(a[0].d),a[1].s.c_str(),opt);
-       else if(!strcmp(k,"ddd"))       gr->Fall(*(a[0].d),*(a[1].d),*(a[2].d),"",opt);
-       else if(!strcmp(k,"ddds"))      gr->Fall(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_mesh(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->Mesh(*(a[0].d),"",opt);
-       else if(!strcmp(k,"ds"))        gr->Mesh(*(a[0].d),a[1].s.c_str(),opt);
-       else if(!strcmp(k,"ddd"))       gr->Mesh(*(a[0].d),*(a[1].d),*(a[2].d),"",opt);
-       else if(!strcmp(k,"ddds"))      gr->Mesh(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_surf(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->Surf(*(a[0].d),"",opt);
-       else if(!strcmp(k,"ds"))        gr->Surf(*(a[0].d),a[1].s.c_str(),opt);
-       else if(!strcmp(k,"ddd"))       gr->Surf(*(a[0].d),*(a[1].d),*(a[2].d),"",opt);
-       else if(!strcmp(k,"ddds"))      gr->Surf(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_surfc(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"dd"))     gr->SurfC(*(a[0].d),*(a[1].d),"",opt);
-       else if(!strcmp(k,"dds"))       gr->SurfC(*(a[0].d),*(a[1].d),a[2].s.c_str(),opt);
-       else if(!strcmp(k,"dddd"))      gr->SurfC(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),"",opt);
-       else if(!strcmp(k,"dddds"))     gr->SurfC(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_surfa(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"dd"))     gr->SurfA(*(a[0].d),*(a[1].d),"",opt);
-       else if(!strcmp(k,"dds"))       gr->SurfA(*(a[0].d),*(a[1].d),a[2].s.c_str(),opt);
-       else if(!strcmp(k,"dddd"))      gr->SurfA(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),"",opt);
-       else if(!strcmp(k,"dddds"))     gr->SurfA(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_surfca(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"ddd"))    gr->SurfCA(*(a[0].d),*(a[1].d),*(a[2].d),"",opt);
-       else if(!strcmp(k,"ddds"))      gr->SurfCA(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.c_str(),opt);
-       else if(!strcmp(k,"ddddd"))     gr->SurfCA(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),"",opt);
-       else if(!strcmp(k,"ddddds"))gr->SurfCA(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),a[5].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_flow(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"dd"))     gr->Flow(*(a[0].d),*(a[1].d),"",opt);
-       else if(!strcmp(k,"dds"))       gr->Flow(*(a[0].d),*(a[1].d),a[2].s.c_str(),opt);
-       else if(!strcmp(k,"ddd"))       gr->Flow(*(a[0].d),*(a[1].d),*(a[2].d),"",opt);
-       else if(!strcmp(k,"ddds"))      gr->Flow(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.c_str(),opt);
-       else if(!strcmp(k,"dddd"))      gr->Flow(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),"",opt);
-       else if(!strcmp(k,"dddds"))     gr->Flow(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.c_str(),opt);
-       else if(!strcmp(k,"dddddd"))
-               gr->Flow(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d),"",opt);
-       else if(!strcmp(k,"dddddds"))
-               gr->Flow(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d),a[6].s.c_str(),opt);
-       else if(!strcmp(k,"nndd"))
-               gr->FlowP(mglPoint(a[0].v,a[1].v,NAN), *(a[2].d),*(a[3].d),"",opt);
-       else if(!strcmp(k,"nndds"))
-               gr->FlowP(mglPoint(a[0].v,a[1].v,NAN), *(a[2].d),*(a[3].d),a[4].s.c_str(),opt);
-       else if(!strcmp(k,"nndddd"))
-               gr->FlowP(mglPoint(a[0].v,a[1].v,NAN), *(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d),"",opt);
-       else if(!strcmp(k,"nndddds"))
-               gr->FlowP(mglPoint(a[0].v,a[1].v,NAN), *(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d),a[6].s.c_str(),opt);
-       else if(!strcmp(k,"nnnddd"))
-               gr->FlowP(mglPoint(a[0].v,a[1].v,a[2].v), *(a[3].d),*(a[4].d),*(a[5].d),"",opt);
-       else if(!strcmp(k,"nnnddds"))
-               gr->FlowP(mglPoint(a[0].v,a[1].v,a[2].v), *(a[3].d),*(a[4].d),*(a[5].d),a[6].s.c_str(),opt);
-       else if(!strcmp(k,"nnndddddd"))
-               gr->FlowP(mglPoint(a[0].v,a[1].v,a[2].v), *(a[3].d),*(a[4].d),*(a[5].d),*(a[6].d),*(a[7].d),*(a[8].d),"",opt);
-       else if(!strcmp(k,"nnndddddds"))
-               gr->FlowP(mglPoint(a[0].v,a[1].v,a[2].v), *(a[3].d),*(a[4].d),*(a[5].d),*(a[6].d),*(a[7].d),*(a[8].d),a[9].s.c_str(),opt);
-       else res = 1;
-       return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_grad(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->Grad(*(a[0].d), "",opt);
-       else if(!strcmp(k,"ds"))        gr->Grad(*(a[0].d), a[1].s.c_str(),opt);
-       else if(!strcmp(k,"ddd"))       gr->Grad(*(a[0].d),*(a[1].d),*(a[2].d), "",opt);
-       else if(!strcmp(k,"ddds"))      gr->Grad(*(a[0].d),*(a[1].d),*(a[2].d), a[3].s.c_str(),opt);
-       else if(!strcmp(k,"dddd"))      gr->Grad(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d), "",opt);
-       else if(!strcmp(k,"dddds"))     gr->Grad(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d), a[4].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_fill(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && k[0]=='d')
-       {
-               if(!strcmp(k,"dnn"))    d->Fill(a[1].v,a[2].v);
-               else if(!strcmp(k,"dnns"))      d->Fill(a[1].v,a[2].v,a[3].s.c_str()[0]);
-               else if(!strcmp(k,"ds"))        gr->Fill(*d,a[1].s.c_str(),opt);
-               else if(!strcmp(k,"dsd"))       gr->Fill(*d,a[1].s.c_str(), *(a[2].d),opt);
-               else if(!strcmp(k,"dsdd"))      gr->Fill(*d,a[1].s.c_str(), *(a[2].d), *(a[3].d),opt);
-               else res = 1;
-       }
-       else if(c && k[0]=='d')
-       {
-               if(!strcmp(k,"dnn"))    c->Fill(a[1].v,a[2].v);
-               else if(!strcmp(k,"dnns"))      c->Fill(a[1].v,a[2].v,a[3].s.c_str()[0]);
-               else if(!strcmp(k,"ds"))        gr->Fill(*c,a[1].s.c_str(),opt);
-               else if(!strcmp(k,"dsd"))       gr->Fill(*c,a[1].s.c_str(), *(a[2].d),opt);
-               else if(!strcmp(k,"dsdd"))      gr->Fill(*c,a[1].s.c_str(), *(a[2].d), *(a[3].d),opt);
-               else res = 1;
-       }
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_refill(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && k[0]=='d' && k[1]=='d' && k[2]=='d')
-       {
-               if(k[3]==0)     gr->Refill(*d,*(a[1].d),*(a[2].d),-1,opt);
-               else if(!strcmp(k+3,"n"))       gr->Refill(*d,*(a[1].d),*(a[2].d),mgl_int(a[3].v),opt);
-               else if(!strcmp(k+3,"d"))       gr->Refill(*d,*(a[1].d),*(a[2].d),*(a[3].d),-1,opt);
-               else if(!strcmp(k+3,"dn"))      gr->Refill(*d,*(a[1].d),*(a[2].d),*(a[3].d),mgl_int(a[4].v),opt);
-               else if(!strcmp(k+3,"dd"))      gr->Refill(*d,*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),opt);
-               else res = 1;
-       }
-       else if(c && k[0]=='d' && k[1]=='d' && k[2]=='d')
-       {
-               if(k[3]==0)     gr->Refill(*c,*(a[1].d),*(a[2].d),-1,opt);
-               else if(!strcmp(k+3,"n"))       gr->Refill(*c,*(a[1].d),*(a[2].d),mgl_int(a[3].v),opt);
-               else if(!strcmp(k+3,"d"))       gr->Refill(*c,*(a[1].d),*(a[2].d),*(a[3].d),-1,opt);
-               else if(!strcmp(k+3,"dn"))      gr->Refill(*c,*(a[1].d),*(a[2].d),*(a[3].d),mgl_int(a[4].v),opt);
-               else if(!strcmp(k+3,"dd"))      gr->Refill(*c,*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),opt);
-               else res = 1;
-       }
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_gspline(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && !strcmp(k,"ddd"))       d->RefillGS(*(a[1].d),*(a[2].d),gr->Self()->Min.x,gr->Self()->Max.x,-1);
-       else if(d && !strcmp(k,"dddn")) d->RefillGS(*(a[1].d),*(a[2].d),gr->Self()->Min.x,gr->Self()->Max.x,mgl_int(a[3].v));
-       else if(c && !strcmp(k,"ddd"))  c->RefillGS(*(a[1].d),*(a[2].d),gr->Self()->Min.x,gr->Self()->Max.x,-1);
-       else if(c && !strcmp(k,"dddn")) c->RefillGS(*(a[1].d),*(a[2].d),gr->Self()->Min.x,gr->Self()->Max.x,mgl_int(a[3].v));
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_fillsample(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(d && !strcmp(k,"ds"))        d->FillSample(a[1].s.c_str());
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_fog(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"n"))      gr->Fog(a[0].v);
-       else if(!strcmp(k,"nn"))        gr->Fog(a[0].v,a[1].v);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_font(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"s"))      gr->SetFontDef(a[0].s.c_str());
-       else if(!strcmp(k,"sn"))
-       {       gr->SetFontDef(a[0].s.c_str()); gr->SetFontSize(a[1].v);        }
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_loadfont(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]==0 || (!strcmp(k,"s") && a[0].s[0]==0)) gr->RestoreFont();
-       else if(!strcmp(k,"s")) gr->LoadFont(a[0].s.c_str());
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_grid(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(k[0]==0)     gr->Grid("xyzt", "B",opt);
-       else if(!strcmp(k,"s")) gr->Grid(a[0].s.c_str(), "B",opt);
-       else if(!strcmp(k,"ss"))gr->Grid(a[0].s.c_str(), a[1].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_grid2(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->Grid(*(a[0].d),"",opt);
-       else if(!strcmp(k,"ds"))        gr->Grid(*(a[0].d),a[1].s.c_str(),opt);
-       else if(!strcmp(k,"ddd"))       gr->Grid(*(a[0].d), *(a[1].d), *(a[2].d), "",opt);
-       else if(!strcmp(k,"ddds"))      gr->Grid(*(a[0].d), *(a[1].d), *(a[2].d), a[3].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_grid3(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->Grid3(*(a[0].d),"",-1,opt);
-       else if(!strcmp(k,"ds"))        gr->Grid3(*(a[0].d),a[1].s.c_str(),-1,opt);
-       else if(!strcmp(k,"dsn"))       gr->Grid3(*(a[0].d),a[1].s.c_str(),mgl_int(a[2].v),opt);
-       else if(!strcmp(k,"dddd"))      gr->Grid3(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),"",-1,opt);
-       else if(!strcmp(k,"dddds"))     gr->Grid3(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.c_str(),-1,opt);
-       else if(!strcmp(k,"ddddsn"))gr->Grid3(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.c_str(),mgl_int(a[5].v),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_light(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]==0)     gr->Light(true);
-       else if(!strcmp(k,"n")) gr->Light(a[0].v!=0);
-       else if(!strcmp(k,"nn"))        gr->Light(mgl_int(a[0].v),a[1].v!=0);
-       else if(!strcmp(k,"nnnn"))      gr->AddLight(mgl_int(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v));
-       else if(!strcmp(k,"nnnns"))     gr->AddLight(mgl_int(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v), a[4].s.c_str()[0]);
-       else if(!strcmp(k,"nnnnsn"))gr->AddLight(mgl_int(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v), a[4].s.c_str()[0],a[5].v);
-       else if(!strcmp(k,"nnnnsnn"))
-               gr->AddLight(mgl_int(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v), a[4].s.c_str()[0],a[5].v,a[6].v);
-       else if(!strcmp(k,"nnnnnnn"))
-               gr->AddLight(mgl_int(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v),mglPoint(a[4].v,a[5].v,a[6].v));
-       else if(!strcmp(k,"nnnnnnns"))
-               gr->AddLight(mgl_int(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v),mglPoint(a[4].v,a[5].v,a[6].v), a[7].s.c_str()[0]);
-       else if(!strcmp(k,"nnnnnnnsn"))
-               gr->AddLight(mgl_int(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v),mglPoint(a[4].v,a[5].v,a[6].v), a[7].s.c_str()[0],a[8].v);
-       else if(!strcmp(k,"nnnnnnnsnn"))
-               gr->AddLight(mgl_int(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v),mglPoint(a[4].v,a[5].v,a[6].v), a[7].s.c_str()[0],a[8].v,a[9].v);
-       return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_attachlight(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"n"))      gr->AttachLight(a[0].v!=0);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_line(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;      gr->Self()->SaveState(opt);
-       if(!strcmp(k,"nnnn"))
-               gr->Line(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v,NAN));
-       else if(!strcmp(k,"nnnns"))
-               gr->Line(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v,NAN), a[4].s.c_str());
-       else if(!strcmp(k,"nnnnnn"))
-               gr->Line(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v));
-       else if(!strcmp(k,"nnnnnns"))
-               gr->Line(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v), a[6].s.c_str());
-       else res = 1;   gr->Self()->LoadState();        return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_lamerey(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"nd"))     gr->Lamerey(a[0].v,*(a[1].d),"",opt);
-       else if(!strcmp(k,"nds"))       gr->Lamerey(a[0].v,*(a[1].d),a[2].s.c_str(),opt);
-       else if(!strcmp(k,"ns"))        gr->Lamerey(a[0].v,a[1].s.c_str(),"",opt);
-       else if(!strcmp(k,"nss"))       gr->Lamerey(a[0].v,a[1].s.c_str(),a[2].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_bifurcation(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"nd"))     gr->Bifurcation(a[0].v,*(a[1].d),"",opt);
-       else if(!strcmp(k,"nds"))       gr->Bifurcation(a[0].v,*(a[1].d),a[2].s.c_str(),opt);
-       else if(!strcmp(k,"ns"))        gr->Bifurcation(a[0].v,a[1].s.c_str(),"",opt);
-       else if(!strcmp(k,"nss"))       gr->Bifurcation(a[0].v,a[1].s.c_str(),a[2].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_errbox(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;      gr->Self()->SaveState(opt);
-       if(!strcmp(k,"nnnn"))
-               gr->Error(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v,NAN));
-       else if(!strcmp(k,"nnnns"))
-               gr->Error(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v,NAN), a[4].s.c_str());
-       else if(!strcmp(k,"nnnnnn"))
-               gr->Error(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v));
-       else if(!strcmp(k,"nnnnnns"))
-               gr->Error(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v), a[6].s.c_str());
-       else res = 1;   gr->Self()->LoadState();        return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_legend(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(k[0]==0)     gr->Legend(3, "#", opt);
-       else if(!strcmp(k,"n")) gr->Legend(mgl_int(a[0].v), "#", opt);
-       else if(!strcmp(k,"ns"))        gr->Legend(mgl_int(a[0].v), a[1].s.c_str(), opt);
-       else if(!strcmp(k,"nn"))        gr->Legend(a[0].v, a[1].v, "#", opt);
-       else if(!strcmp(k,"nns"))       gr->Legend(a[0].v, a[1].v, a[2].s.c_str(), opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_barwidth(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"n"))      gr->SetBarWidth(a[0].v);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_legendmarks(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"n"))      gr->SetLegendMarks(mgl_int(a[0].v));
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_modify(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && !strcmp(k,"ds"))        d->Modify(a[1].s.c_str());
-       else if(d && !strcmp(k,"dsn"))  d->Modify(a[1].s.c_str(), mgl_int(a[2].v));
-       else if(d && !strcmp(k,"dsd"))  d->Modify(a[1].s.c_str(),*(a[2].d));
-       else if(d && !strcmp(k,"dsdd")) d->Modify(a[1].s.c_str(),*(a[2].d),*(a[3].d));
-       else if(c && !strcmp(k,"ds"))   c->Modify(a[1].s.c_str());
-       else if(c && !strcmp(k,"dsn"))  c->Modify(a[1].s.c_str(), mgl_int(a[2].v));
-       else if(c && !strcmp(k,"dsd"))  c->Modify(a[1].s.c_str(),*(a[2].d));
-       else if(c && !strcmp(k,"dsdd")) c->Modify(a[1].s.c_str(),*(a[2].d),*(a[3].d));
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_max(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(d && !strcmp(k,"dds"))       *d = mglData(true,mgl_data_max_dir(a[1].d,a[2].s.c_str()));
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_min(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(d && !strcmp(k,"dds"))       *d = mglData(true,mgl_data_min_dir(a[1].d,a[2].s.c_str()));
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_sum(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && !strcmp(k,"dds"))       *d = mglData(true,mgl_data_sum(a[1].d,a[2].s.c_str()));
-       else if(c && !strcmp(k,"dds"))  *c = mglDataC(true,mgl_datac_sum(a[1].d,a[2].s.c_str()));
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_meshnum(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"n"))      gr->SetMeshNum(a[0].v);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_facenum(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"n"))      gr->SetFaceNum(a[0].v);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_quality(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]==0)     gr->SetQuality();
-       else if(!strcmp(k,"n")) gr->SetQuality(mgl_int(a[0].v));
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_marksize(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"n"))      gr->SetMarkSize(a[0].v);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_mark(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"dd"))     gr->Mark(*(a[0].d), *(a[1].d), "",opt);
-       else if(!strcmp(k,"dds"))       gr->Mark(*(a[0].d), *(a[1].d), a[2].s.c_str(),opt);
-       else if(!strcmp(k,"ddd"))       gr->Mark(*(a[0].d), *(a[1].d), *(a[2].d), "",opt);
-       else if(!strcmp(k,"ddds"))      gr->Mark(*(a[0].d), *(a[1].d), *(a[2].d), a[3].s.c_str(),opt);
-       else if(!strcmp(k,"dddd"))      gr->Mark(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d), "",opt);
-       else if(!strcmp(k,"dddds"))     gr->Mark(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d), a[4].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_pmap(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"dd"))     gr->Pmap(*(a[0].d), *(a[1].d), "",opt);
-       else if(!strcmp(k,"dds"))       gr->Pmap(*(a[0].d), *(a[1].d), a[2].s.c_str(),opt);
-       else if(!strcmp(k,"ddd"))       gr->Pmap(*(a[0].d), *(a[1].d), *(a[2].d), "",opt);
-       else if(!strcmp(k,"ddds"))      gr->Pmap(*(a[0].d), *(a[1].d), *(a[2].d), a[3].s.c_str(),opt);
-       else if(!strcmp(k,"dddd"))      gr->Pmap(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d), "",opt);
-       else if(!strcmp(k,"dddds"))     gr->Pmap(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d), a[4].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_map(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"dd"))     gr->Map(*(a[0].d),*(a[1].d),"",opt);
-       else if(!strcmp(k,"dds"))       gr->Map(*(a[0].d),*(a[1].d),a[2].s.c_str(),opt);
-       else if(!strcmp(k,"dddd"))      gr->Map(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),"",opt);
-       else if(!strcmp(k,"dddds"))     gr->Map(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_read(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       bool rr=true;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       if(k[1]=='d' && a[1].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglData *f = dynamic_cast<mglData *>(a[1].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(c)
-       {
-               if(!strcmp(k,"ds"))                     rr=c->Read(a[1].s.c_str());
-               else if(!strcmp(k,"dsn"))       rr=c->Read(a[1].s.c_str(), mgl_int(a[2].v));
-               else if(!strcmp(k,"dsnn"))      rr=c->Read(a[1].s.c_str(), mgl_int(a[2].v),mgl_int(a[3].v));
-               else if(!strcmp(k,"dsnnn"))     rr=c->Read(a[1].s.c_str(), mgl_int(a[2].v),mgl_int(a[3].v),mgl_int(a[4].v));
-               else res = 1;
-       }
-       else if(d && f && k[0]=='d' && k[1]=='d' && k[2]=='s')
-       {
-               mglDataC r;
-               if(k[3]==0)     rr=r.Read(a[2].s.c_str());
-               else if(!strcmp(k+3,"n"))       rr=r.Read(a[2].s.c_str(), mgl_int(a[3].v));
-               else if(!strcmp(k+3,"nn"))      rr=r.Read(a[2].s.c_str(), mgl_int(a[3].v),mgl_int(a[4].v));
-               else if(!strcmp(k+3,"nnn"))     rr=r.Read(a[2].s.c_str(), mgl_int(a[3].v),mgl_int(a[4].v),mgl_int(a[5].v));
-               else res = 1;
-               if(res==0)      {       *d = r.Real();  *f = r.Imag();  }
-       }
-       else if(d)
-       {
-               if(!strcmp(k,"ds"))     rr=d->Read(a[1].s.c_str());
-               else if(!strcmp(k,"dsn"))       rr=d->Read(a[1].s.c_str(), mgl_int(a[2].v));
-               else if(!strcmp(k,"dsnn"))      rr=d->Read(a[1].s.c_str(), mgl_int(a[2].v),mgl_int(a[3].v));
-               else if(!strcmp(k,"dsnnn"))     rr=d->Read(a[1].s.c_str(), mgl_int(a[2].v),mgl_int(a[3].v),mgl_int(a[4].v));
-               else res = 1;
-       }
-       else res = 1;
-       if(!rr) gr->SetWarn(mglWarnFile,"Read");
-       return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_readmat(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       bool rr=true;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && !strcmp(k,"ds"))                rr=d->ReadMat(a[1].s.c_str());
-       else if(d && !strcmp(k,"dsn"))  rr=d->ReadMat(a[1].s.c_str(), mgl_int(a[2].v));
-       else if(c && !strcmp(k,"ds"))   rr=c->ReadMat(a[1].s.c_str());
-       else if(c && !strcmp(k,"dsn"))  rr=c->ReadMat(a[1].s.c_str(), mgl_int(a[2].v));
-       else res = 1;
-       if(!rr) gr->SetWarn(mglWarnFile,"ReadMat");
-       return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_readall(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       bool rr=true;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && !strcmp(k,"ds"))        rr=d->ReadAll(a[1].s.c_str());
-       else if(d && !strcmp(k,"dsn"))          rr=d->ReadAll(a[1].s.c_str(), a[2].v);
-       else if(d && !strcmp(k,"dsnn"))         rr=d->ReadRange(a[1].s.c_str(), a[2].v, a[3].v);
-       else if(d && !strcmp(k,"dsnnn"))        rr=d->ReadRange(a[1].s.c_str(), a[2].v, a[3].v, a[4].v);
-       else if(d && !strcmp(k,"dsnnnn"))       rr=d->ReadRange(a[1].s.c_str(), a[2].v, a[3].v, a[4].v, a[5].v);
-       else if(c && !strcmp(k,"ds"))           rr=c->ReadAll(a[1].s.c_str());
-       else if(c && !strcmp(k,"dsn"))          rr=c->ReadAll(a[1].s.c_str(), a[2].v);
-       else if(c && !strcmp(k,"dsnn"))         rr=c->ReadRange(a[1].s.c_str(), a[2].v, a[3].v);
-       else if(c && !strcmp(k,"dsnnn"))        rr=c->ReadRange(a[1].s.c_str(), a[2].v, a[3].v, a[4].v);
-       else if(c && !strcmp(k,"dsnnnn"))       rr=c->ReadRange(a[1].s.c_str(), a[2].v, a[3].v, a[4].v, a[5].v);
-       else res = 1;
-       if(!rr) gr->SetWarn(mglWarnFile,"ReadAll");
-       return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_readhdf(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && !strcmp(k,"dss"))       d->ReadHDF(a[1].s.c_str(), a[2].s.c_str());
-       else if(c && !strcmp(k,"dss"))  c->ReadHDF(a[1].s.c_str(), a[2].s.c_str());
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_savehdf(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"dss"))    a[0].d->SaveHDF(a[1].s.c_str(), a[2].s.c_str());
-       else if(!strcmp(k,"dssn"))      a[0].d->SaveHDF(a[1].s.c_str(), a[2].s.c_str(),mgl_int(a[3].v));
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_rect(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;      gr->Self()->SaveState(opt);
-       if(!strcmp(k,"nnnn"))
-               gr->Face(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[0].v,a[3].v,NAN),
-                                mglPoint(a[2].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v,NAN));
-       else if(!strcmp(k,"nnnns"))
-               gr->Face(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[0].v,a[3].v,NAN),
-                                       mglPoint(a[2].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v,NAN),a[4].s.c_str());
-       else if(!strncmp(k,"nnnnnn",6))
-       {
-               if(a[0].v==a[3].v)      gr->Face(mglPoint(a[0].v,a[1].v,a[2].v),
-                       mglPoint(a[0].v,a[4].v,a[2].v),
-                       mglPoint(a[3].v,a[1].v,a[5].v),
-                       mglPoint(a[3].v,a[4].v,a[5].v),
-                       k[6]=='s' ? a[6].s.c_str() : 0);
-               else    gr->Face(mglPoint(a[0].v,a[1].v,a[2].v),
-                       mglPoint(a[0].v,a[4].v,a[5].v),
-                       mglPoint(a[3].v,a[1].v,a[2].v),
-                       mglPoint(a[3].v,a[4].v,a[5].v),
-                       k[6]=='s' ? a[6].s.c_str() : 0);
-       }
-       else res = 1;   gr->Self()->LoadState();        return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_face(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;      gr->Self()->SaveState(opt);
-       if(!strcmp(k,"nnnnnnnn"))
-               gr->Face(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v,NAN),
-                               mglPoint(a[4].v,a[5].v,NAN), mglPoint(a[6].v,a[7].v,NAN));
-       else if(!strcmp(k,"nnnnnnnns"))
-               gr->Face(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v,NAN),
-                               mglPoint(a[4].v,a[5].v,NAN), mglPoint(a[6].v,a[7].v,NAN), a[8].s.c_str());
-       else if(!strcmp(k,"nnnnnnnnnnnn"))
-               gr->Face(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v),
-                               mglPoint(a[6].v,a[7].v,a[8].v), mglPoint(a[9].v,a[10].v,a[11].v));
-       else if(!strcmp(k,"nnnnnnnnnnnns"))
-               gr->Face(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v),
-                               mglPoint(a[6].v,a[7].v,a[8].v), mglPoint(a[9].v,a[10].v,a[11].v), a[12].s.c_str());
-       else res = 1;   gr->Self()->LoadState();        return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_logo(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"s"))      gr->Logo(a[0].s.c_str(),false,opt);
-       else if(!strcmp(k,"sn"))        gr->Logo(a[0].s.c_str(),mgl_int(a[1].v),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_resize(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && !strcmp(k,"ddn"))       *d = mglData(true,mgl_data_resize_box(a[1].d, mgl_int(a[2].v),0,0, 0,1, 0,1, 0,1));
-       else if(d && !strcmp(k,"ddnn")) *d = mglData(true,mgl_data_resize_box(a[1].d, mgl_int(a[2].v),mgl_int(a[3].v),0, 0,1, 0,1, 0,1));
-       else if(d && !strcmp(k,"ddnnn"))*d = mglData(true,mgl_data_resize_box(a[1].d, mgl_int(a[2].v),mgl_int(a[3].v),mgl_int(a[4].v), 0,1, 0,1, 0,1));
-       else if(c && !strcmp(k,"ddn"))  *c = mglDataC(true,mgl_datac_resize_box(a[1].d, mgl_int(a[2].v),0,0, 0,1, 0,1, 0,1));
-       else if(c && !strcmp(k,"ddnn")) *c = mglDataC(true,mgl_datac_resize_box(a[1].d, mgl_int(a[2].v),mgl_int(a[3].v),0, 0,1, 0,1, 0,1));
-       else if(c && !strcmp(k,"ddnnn"))*c = mglDataC(true,mgl_datac_resize_box(a[1].d, mgl_int(a[2].v),mgl_int(a[3].v),mgl_int(a[4].v), 0,1, 0,1, 0,1));
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_rotate(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"nn"))     gr->Rotate(a[0].v, a[1].v, 0);
-       else if(!strcmp(k,"nnn"))       gr->Rotate(a[0].v, a[1].v, a[2].v);
-       else if(!strcmp(k,"nnnn"))      gr->RotateN(a[0].v, a[1].v, a[2].v, a[3].v);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_rotatetext(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"n"))      gr->SetRotatedText(a[0].v!=0);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_tuneticks(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"n"))      gr->SetTuneTicks(mgl_int(a[0].v));
-       else if(!strcmp(k,"nn"))        gr->SetTuneTicks(mgl_int(a[0].v),a[1].v);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_ticktime(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"s"))      gr->SetTicksTime(a[0].s[0]);
-       else if(!strcmp(k,"sn"))        gr->SetTicksTime(a[0].s[0],a[1].v);
-       else if(!strcmp(k,"sns"))       gr->SetTicksTime(a[0].s[0],a[1].v,a[2].s.c_str());
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_save(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"ds"))     a[0].d->Save(a[1].s.c_str());
-       else if(!strcmp(k,"ss"))
-       {
-               FILE *fp = fopen(a[1].s.c_str(),"a");
-               size_t pos;     std::string s=a[0].s;
-               while((pos=s.find("\\n"))!=std::string::npos)
-               {       s[pos]=' ';     s[pos+1]='\n';  }
-               while((pos=s.find("\b\b"))!=std::string::npos)  s.erase(pos,2);
-               fprintf(fp,"%s\n",s.c_str());   fclose(fp);
-       }
-       else if(!strcmp(k,"sss"))
-       {
-               FILE *fp = fopen(a[1].s.c_str(),a[2].s.c_str());
-               size_t pos;     std::string s=a[0].s;
-               while((pos=s.find("\\n"))!=std::string::npos)
-               {       s[pos]=' ';     s[pos+1]='\n';  }
-               while((pos=s.find("\b\b"))!=std::string::npos)  s.erase(pos,2);
-               fprintf(fp,"%s\n",s.c_str());   fclose(fp);
-       }
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_smooth(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && !strcmp(k,"d")) d->Smooth();
-       else if(d && !strcmp(k,"ds"))   d->Smooth(a[1].s.c_str());
-       else if(c && !strcmp(k,"d"))    c->Smooth();
-       else if(c && !strcmp(k,"ds"))   c->Smooth(a[1].s.c_str());
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_swap(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && !strcmp(k,"ds"))        d->Swap(a[1].s.c_str());
-       else if(c && !strcmp(k,"ds"))   c->Swap(a[1].s.c_str());
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_idset(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && !strcmp(k,"ds"))        d->SetColumnId(a[1].s.c_str());
-       else if(c && !strcmp(k,"ds"))   c->SetColumnId(a[1].s.c_str());
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_stem(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->Stem(*(a[0].d),"",opt);
-       else if(!strcmp(k,"ds"))        gr->Stem(*(a[0].d),a[1].s.c_str(),opt);
-       else if(!strcmp(k,"dd"))        gr->Stem(*(a[0].d),*(a[1].d),"",opt);
-       else if(!strcmp(k,"dds"))       gr->Stem(*(a[0].d),*(a[1].d),a[2].s.c_str(),opt);
-       else if(!strcmp(k,"ddd"))       gr->Stem(*(a[0].d),*(a[1].d),*(a[2].d),"",opt);
-       else if(!strcmp(k,"ddds"))      gr->Stem(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_step(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->Step(*(a[0].d),"",opt);
-       else if(!strcmp(k,"ds"))        gr->Step(*(a[0].d),a[1].s.c_str(),opt);
-       else if(!strcmp(k,"dd"))        gr->Step(*(a[0].d),*(a[1].d),"",opt);
-       else if(!strcmp(k,"dds"))       gr->Step(*(a[0].d),*(a[1].d),a[2].s.c_str(),opt);
-       else if(!strcmp(k,"ddd"))       gr->Step(*(a[0].d),*(a[1].d),*(a[2].d),"",opt);
-       else if(!strcmp(k,"ddds"))      gr->Step(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_plot(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->Plot(*(a[0].d),"",opt);
-       else if(!strcmp(k,"ds"))        gr->Plot(*(a[0].d),a[1].s.c_str(),opt);
-       else if(!strcmp(k,"dd"))        gr->Plot(*(a[0].d),*(a[1].d),"",opt);
-       else if(!strcmp(k,"dds"))       gr->Plot(*(a[0].d),*(a[1].d),a[2].s.c_str(),opt);
-       else if(!strcmp(k,"ddd"))       gr->Plot(*(a[0].d),*(a[1].d),*(a[2].d),"",opt);
-       else if(!strcmp(k,"ddds"))      gr->Plot(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_tape(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->Tape(*(a[0].d),"",opt);
-       else if(!strcmp(k,"ds"))        gr->Tape(*(a[0].d),a[1].s.c_str(),opt);
-       else if(!strcmp(k,"dd"))        gr->Tape(*(a[0].d),*(a[1].d),"",opt);
-       else if(!strcmp(k,"dds"))       gr->Tape(*(a[0].d),*(a[1].d),a[2].s.c_str(),opt);
-       else if(!strcmp(k,"ddd"))       gr->Tape(*(a[0].d),*(a[1].d),*(a[2].d),"",opt);
-       else if(!strcmp(k,"ddds"))      gr->Tape(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_boxplot(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->BoxPlot(*(a[0].d),"",opt);
-       else if(!strcmp(k,"ds"))        gr->BoxPlot(*(a[0].d),a[1].s.c_str(),opt);
-       else if(!strcmp(k,"dd"))        gr->BoxPlot(*(a[0].d),*(a[1].d),"",opt);
-       else if(!strcmp(k,"dds"))       gr->BoxPlot(*(a[0].d),*(a[1].d),a[2].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_candle(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->Candle(*(a[0].d),"",opt);
-       else if(!strcmp(k,"ds"))        gr->Candle(*(a[0].d),a[1].s.c_str(),opt);
-       else if(!strcmp(k,"dd"))        gr->Candle(*(a[0].d),*(a[1].d),"",opt);
-       else if(!strcmp(k,"dds"))       gr->Candle(*(a[0].d),*(a[1].d),a[2].s.c_str(),opt);
-       else if(!strcmp(k,"ddd"))       gr->Candle(*(a[0].d),*(a[1].d),*(a[2].d),"",opt);
-       else if(!strcmp(k,"ddds"))      gr->Candle(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.c_str(),opt);
-       else if(!strcmp(k,"dddd"))      gr->Candle(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),"",opt);
-       else if(!strcmp(k,"dddds"))     gr->Candle(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.c_str(),opt);
-       else if(!strcmp(k,"ddddd"))     gr->Candle(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),"",opt);
-       else if(!strcmp(k,"ddddds"))gr->Candle(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),a[5].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_radar(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->Radar(*(a[0].d),"",opt);
-       else if(!strcmp(k,"ds"))        gr->Radar(*(a[0].d),a[1].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_squeeze(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && !strcmp(k,"dn"))        d->Squeeze(mgl_int(a[1].v));
-       else if(d && !strcmp(k,"dnn"))  d->Squeeze(mgl_int(a[1].v), mgl_int(a[2].v));
-       else if(d && !strcmp(k,"dnnn")) d->Squeeze(mgl_int(a[1].v), mgl_int(a[2].v),mgl_int(a[3].v));
-       else if(d && !strcmp(k,"dnnnn"))d->Squeeze(mgl_int(a[1].v), mgl_int(a[2].v),mgl_int(a[3].v), a[4].v);
-       else if(c && !strcmp(k,"dn"))   c->Squeeze(mgl_int(a[1].v));
-       else if(c && !strcmp(k,"dnn"))  c->Squeeze(mgl_int(a[1].v), mgl_int(a[2].v));
-       else if(c && !strcmp(k,"dnnn")) c->Squeeze(mgl_int(a[1].v), mgl_int(a[2].v),mgl_int(a[3].v));
-       else if(c && !strcmp(k,"dnnnn"))c->Squeeze(mgl_int(a[1].v), mgl_int(a[2].v),mgl_int(a[3].v), a[4].v);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_stfad(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"dddn"))           *d = mglSTFA(*(a[1].d),*(a[2].d), mgl_int(a[3].v));
-       else if(!strcmp(k,"dddns"))     *d = mglSTFA(*(a[1].d),*(a[2].d), mgl_int(a[3].v), a[4].s.c_str()[0]);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_setsize(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"nn") && a[1].v>1 && a[0].v>1)
-               gr->SetSize(mgl_int(a[0].v), mgl_int(a[1].v));
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_sphere(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;      gr->Self()->SaveState(opt);
-       if(!strcmp(k,"nnn"))    gr->Sphere(mglPoint(a[0].v,a[1].v), a[2].v);
-       else if(!strcmp(k,"nnns"))      gr->Sphere(mglPoint(a[0].v,a[1].v), a[2].v, a[3].s.c_str());
-       else if(!strcmp(k,"nnnn"))      gr->Sphere(mglPoint(a[0].v,a[1].v,a[2].v), a[3].v);
-       else if(!strcmp(k,"nnnns"))     gr->Sphere(mglPoint(a[0].v,a[1].v,a[2].v), a[3].v, a[4].s.c_str());
-       else res = 1;   gr->Self()->LoadState();        return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_stfa(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"ddn"))
-               gr->STFA(*(a[0].d),*(a[1].d), mgl_int(a[2].v), "",opt);
-       else if(!strcmp(k,"ddns"))
-               gr->STFA(*(a[0].d),*(a[1].d), mgl_int(a[2].v), a[3].s.c_str(),opt);
-       else if(!strcmp(k,"ddddn"))
-               gr->STFA(*(a[0].d),*(a[1].d), *(a[2].d),*(a[3].d), mgl_int(a[4].v), "",opt);
-       else if(!strcmp(k,"ddddns"))
-               gr->STFA(*(a[0].d),*(a[1].d), *(a[2].d),*(a[3].d), mgl_int(a[4].v), a[5].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_surf3(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->Surf3(*(a[0].d),"",opt);
-       else if(!strcmp(k,"ds"))        gr->Surf3(*(a[0].d),a[1].s.c_str(),opt);
-       else if(!strcmp(k,"dn"))        gr->Surf3(a[1].v,*(a[0].d),"",opt);
-       else if(!strcmp(k,"dns"))       gr->Surf3(a[1].v,*(a[0].d),a[2].s.c_str(),opt);
-       else if(!strcmp(k,"dddd"))      gr->Surf3(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d), "",opt);
-       else if(!strcmp(k,"dddds"))     gr->Surf3(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d), a[4].s.c_str(),opt);
-       else if(!strcmp(k,"ddddn"))     gr->Surf3(a[4].v,*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),"",opt);
-       else if(!strcmp(k,"ddddns"))gr->Surf3(a[4].v,*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[5].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_surf3c(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"dd"))     gr->Surf3C(*(a[0].d),*(a[1].d),"",opt);
-       else if(!strcmp(k,"dds"))       gr->Surf3C(*(a[0].d),*(a[1].d),a[2].s.c_str(),opt);
-       else if(!strcmp(k,"ddn"))       gr->Surf3C(a[2].v,*(a[0].d),*(a[1].d),"",opt);
-       else if(!strcmp(k,"ddns"))      gr->Surf3C(a[2].v,*(a[0].d),*(a[1].d),a[3].s.c_str(),opt);
-       else if(!strcmp(k,"ddddd"))
-               gr->Surf3C(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d), "",opt);
-       else if(!strcmp(k,"ddddds"))
-               gr->Surf3C(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d), a[5].s.c_str(),opt);
-       else if(!strcmp(k,"dddddn"))
-               gr->Surf3C(a[5].v,*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),"",opt);
-       else if(!strcmp(k,"dddddns"))
-               gr->Surf3C(a[5].v,*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),a[6].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_surf3a(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"dd"))     gr->Surf3A(*(a[0].d),*(a[1].d),"",opt);
-       else if(!strcmp(k,"dds"))       gr->Surf3A(*(a[0].d),*(a[1].d),a[2].s.c_str(),opt);
-       else if(!strcmp(k,"ddn"))       gr->Surf3A(a[2].v,*(a[0].d),*(a[1].d),"",opt);
-       else if(!strcmp(k,"ddns"))      gr->Surf3A(a[2].v,*(a[0].d),*(a[1].d),a[3].s.c_str(),opt);
-       else if(!strcmp(k,"ddddd"))
-               gr->Surf3A(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d), "",opt);
-       else if(!strcmp(k,"ddddds"))
-               gr->Surf3A(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d), a[5].s.c_str(),opt);
-       else if(!strcmp(k,"dddddn"))
-               gr->Surf3A(a[5].v,*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),"",opt);
-       else if(!strcmp(k,"dddddns"))
-               gr->Surf3A(a[5].v,*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),a[6].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_surf3ca(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"ddd"))    gr->Surf3CA(*(a[0].d),*(a[1].d),*(a[2].d),"",opt);
-       else if(!strcmp(k,"ddds"))      gr->Surf3CA(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.c_str(),opt);
-       else if(!strcmp(k,"dddn"))      gr->Surf3CA(a[4].v,*(a[0].d),*(a[1].d),*(a[2].d),"",opt);
-       else if(!strcmp(k,"dddns"))     gr->Surf3CA(a[4].v,*(a[0].d),*(a[1].d),*(a[2].d),a[4].s.c_str(),opt);
-       else if(!strcmp(k,"dddddd"))
-               gr->Surf3CA(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d), "",opt);
-       else if(!strcmp(k,"dddddds"))
-               gr->Surf3CA(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d), a[6].s.c_str(),opt);
-       else if(!strcmp(k,"ddddddn"))
-               gr->Surf3CA(a[6].v,*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d),"",opt);
-       else if(!strcmp(k,"ddddddns"))
-               gr->Surf3CA(a[6].v,*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d),a[7].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_subplot(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"nnn"))    gr->SubPlot(mgl_int(a[0].v), mgl_int(a[1].v), mgl_int(a[2].v));
-       else if(!strcmp(k,"nnns"))      gr->SubPlot(mgl_int(a[0].v), mgl_int(a[1].v), mgl_int(a[2].v), a[3].s.c_str());
-       else if(!strcmp(k,"nnnsnn"))    gr->SubPlot(mgl_int(a[0].v), mgl_int(a[1].v), mgl_int(a[2].v), a[3].s.c_str(), a[4].v,a[5].v);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_multiplot(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"nnnnn"))
-               gr->MultiPlot(mgl_int(a[0].v), mgl_int(a[1].v), mgl_int(a[2].v), mgl_int(a[3].v), mgl_int(a[4].v));
-       else if(!strcmp(k,"nnnnns"))
-               gr->MultiPlot(mgl_int(a[0].v), mgl_int(a[1].v), mgl_int(a[2].v), mgl_int(a[3].v), mgl_int(a[4].v), a[5].s.c_str());
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_title(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;      gr->Self()->SaveState(opt);
-       if(!strcmp(k,"s"))      gr->Title(a[0].w.c_str());
-       else if(!strcmp(k,"ss"))        gr->Title(a[0].w.c_str(), a[1].s.c_str());
-       else if(!strcmp(k,"ssn"))       gr->Title(a[0].w.c_str(), a[1].s.c_str(),a[2].v);
-       else res = 1;   gr->Self()->LoadState();        return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_column(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && !strcmp(k,"dds"))       *d = mglData(true,mgl_data_column(a[1].d,a[2].s.c_str()));
-       else if(c && !strcmp(k,"dds"))  *c = mglDataC(true,mgl_datac_column(a[1].d,a[2].s.c_str()));
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_subdata(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d)
-       {
-               if(!strcmp(k,"ddn"))            *d = mglData(true,mgl_data_subdata(a[1].d, mgl_int(a[2].v), -1, -1));
-               else if(!strcmp(k,"ddnn"))      *d = mglData(true,mgl_data_subdata(a[1].d, mgl_int(a[2].v), mgl_int(a[3].v), -1));
-               else if(!strcmp(k,"ddnnn"))     *d = mglData(true,mgl_data_subdata(a[1].d, mgl_int(a[2].v), mgl_int(a[3].v), mgl_int(a[4].v)));
-               else if(!strcmp(k,"ddd"))       *d = mglData(true,mgl_data_subdata_ext(a[1].d, a[2].d, 0, 0));
-               else if(!strcmp(k,"dddd"))      *d = mglData(true,mgl_data_subdata_ext(a[1].d, a[2].d, a[3].d, 0));
-               else if(!strcmp(k,"ddddd"))     *d = mglData(true,mgl_data_subdata_ext(a[1].d, a[2].d, a[3].d, a[4].d));
-               else res = 1;
-       }
-       else if(c)
-       {
-               if(!strcmp(k,"ddn"))            *c = mglDataC(true,mgl_datac_subdata(a[1].d, mgl_int(a[2].v), -1, -1));
-               else if(!strcmp(k,"ddnn"))      *c = mglDataC(true,mgl_datac_subdata(a[1].d, mgl_int(a[2].v), mgl_int(a[3].v), -1));
-               else if(!strcmp(k,"ddnnn"))     *c = mglDataC(true,mgl_datac_subdata(a[1].d, mgl_int(a[2].v), mgl_int(a[3].v), mgl_int(a[4].v)));
-               else if(!strcmp(k,"ddd"))       *c = mglDataC(true,mgl_datac_subdata_ext(a[1].d, a[2].d, 0, 0));
-               else if(!strcmp(k,"dddd"))      *c = mglDataC(true,mgl_datac_subdata_ext(a[1].d, a[2].d, a[3].d, 0));
-               else if(!strcmp(k,"ddddd"))     *c = mglDataC(true,mgl_datac_subdata_ext(a[1].d, a[2].d, a[3].d, a[4].d));
-               else res = 1;
-       }
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_trace(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && !strcmp(k,"dd"))        *d = mglData(true,mgl_data_trace(a[1].d));
-       else if(c && !strcmp(k,"dd"))   *c = mglDataC(true,mgl_datac_trace(a[1].d));
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_tile(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->Tile(*(a[0].d),"",opt);
-       else if(!strcmp(k,"ds"))        gr->Tile(*(a[0].d),a[1].s.c_str(),opt);
-       else if(!strcmp(k,"ddd"))       gr->Tile(*(a[0].d), *(a[1].d), *(a[2].d), "",opt);
-       else if(!strcmp(k,"ddds"))      gr->Tile(*(a[0].d), *(a[1].d), *(a[2].d), a[3].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_tiles(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"dd"))     gr->TileS(*(a[0].d),*(a[1].d),"",opt);
-       else if(!strcmp(k,"dds"))       gr->TileS(*(a[0].d),*(a[1].d),a[2].s.c_str(),opt);
-       else if(!strcmp(k,"dddd"))      gr->TileS(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),"",opt);
-       else if(!strcmp(k,"dddds"))     gr->TileS(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_text(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)            // NOTE don't use options -- Puts can be part of group
-{
-       int res=0;
-       if(k[0]=='n')
-       {
-               gr->Self()->SaveState(opt);
-               if(!strcmp(k,"nns"))    gr->Putsw(mglPoint(a[0].v,a[1].v,NAN),a[2].w.c_str());
-               else if(!strcmp(k,"nnss"))      gr->Putsw(mglPoint(a[0].v,a[1].v,NAN),a[2].w.c_str(), a[3].s.c_str());
-               else if(!strcmp(k,"nnssn"))     gr->Putsw(mglPoint(a[0].v,a[1].v,NAN),a[2].w.c_str(), a[3].s.c_str(),a[4].v);
-               else if(!strcmp(k,"nnns"))              gr->Putsw(mglPoint(a[0].v,a[1].v,a[2].v),a[3].w.c_str());
-               else if(!strcmp(k,"nnnss"))             gr->Putsw(mglPoint(a[0].v,a[1].v,a[2].v),a[3].w.c_str(), a[4].s.c_str());
-               else if(!strcmp(k,"nnnssn"))    gr->Putsw(mglPoint(a[0].v,a[1].v,a[2].v),a[3].w.c_str(), a[4].s.c_str(),a[5].v);
-               else if(!strcmp(k,"nnnns"))             gr->Putsw(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v), a[4].w.c_str());
-               else if(!strcmp(k,"nnnnss"))    gr->Putsw(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v), a[4].w.c_str(), a[5].s.c_str());
-               else if(!strcmp(k,"nnnnssn"))   gr->Putsw(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v), a[4].w.c_str(), a[5].s.c_str(),a[6].v);
-               else if(!strcmp(k,"nnnnnns"))   gr->Putsw(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v), a[6].w.c_str());
-               else if(!strcmp(k,"nnnnnnss"))  gr->Putsw(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v), a[6].w.c_str(), a[7].s.c_str());
-               else if(!strcmp(k,"nnnnnnssn")) gr->Putsw(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v), a[6].w.c_str(), a[7].s.c_str(),a[8].v);
-               else    res=1;
-               gr->Self()->LoadState();
-       }
-       else if(!strcmp(k,"ds"))        gr->Text(*(a[0].d),a[1].w.c_str(),"",opt);
-       else if(!strcmp(k,"dss"))       gr->Text(*(a[0].d),a[1].w.c_str(),a[2].s.c_str(),opt);
-       else if(!strcmp(k,"dds"))       gr->Text(*(a[0].d),*(a[1].d),a[2].w.c_str(),"",opt);
-       else if(!strcmp(k,"ddss"))      gr->Text(*(a[0].d),*(a[1].d),a[2].w.c_str(),a[3].s.c_str(),opt);
-       else if(!strcmp(k,"ddds"))      gr->Text(*(a[0].d),*(a[1].d),*(a[2].d),a[3].w.c_str(),"",opt);
-       else if(!strcmp(k,"dddss"))     gr->Text(*(a[0].d),*(a[1].d),*(a[2].d),a[3].w.c_str(),a[4].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_torus(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"dd"))     gr->Torus(*(a[0].d),*(a[1].d),"",opt);
-       else if(!strcmp(k,"dds"))       gr->Torus(*(a[0].d),*(a[1].d),a[2].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_transptype(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"n"))      gr->SetTranspType(a[0].v);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_fourier(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *re = dynamic_cast<mglData *>(a[0].d), *im = dynamic_cast<mglData *>(a[1].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(!strcmp(k,"dds") && re && im)        mglFourier(*re,*im,a[2].s.c_str());
-       else if(!strcmp(k,"ds") && c)           c->FFT(a[1].s.c_str());
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_transform(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!strcmp(k,"dsdd") && d)      *d = mglTransform(*(a[2].d),*(a[3].d),a[1].s.c_str());
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_transforma(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!strcmp(k,"dsdd") && d)      *d = mglTransformA(*(a[2].d),*(a[3].d),a[1].s.c_str());
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_tube(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"dn"))
-               gr->Tube(*(a[0].d),a[1].v,"",opt);
-       else if(!strcmp(k,"dns"))
-               gr->Tube(*(a[0].d),a[1].v,a[2].s.c_str(),opt);
-       else if(!strcmp(k,"dd"))
-               gr->Tube(*(a[0].d),*(a[1].d),"",opt);
-       else if(!strcmp(k,"dds"))
-               gr->Tube(*(a[0].d),*(a[1].d),a[2].s.c_str(),opt);
-       else if(!strcmp(k,"ddn"))
-               gr->Tube(*(a[0].d),*(a[1].d),a[2].v,"",opt);
-       else if(!strcmp(k,"ddns"))
-               gr->Tube(*(a[0].d),*(a[1].d),a[2].v,a[3].s.c_str(),opt);
-       else if(!strcmp(k,"ddd"))
-               gr->Tube(*(a[0].d),*(a[1].d),*(a[2].d),"",opt);
-       else if(!strcmp(k,"ddds"))
-               gr->Tube(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.c_str(),opt);
-       else if(!strcmp(k,"dddn"))
-               gr->Tube(*(a[0].d),*(a[1].d),*(a[2].d),a[3].v,"",opt);
-       else if(!strcmp(k,"dddns"))
-               gr->Tube(*(a[0].d),*(a[1].d),*(a[2].d),a[3].v,a[4].s.c_str(),opt);
-       else if(!strcmp(k,"dddd"))
-               gr->Tube(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),"",opt);
-       else if(!strcmp(k,"dddds"))
-               gr->Tube(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_textmark(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"ds"))     gr->TextMark(*(a[0].d),a[1].w.c_str(),"",opt);
-       else if(!strcmp(k,"dss"))       gr->TextMark(*(a[0].d),a[1].w.c_str(),a[2].s.c_str(),opt);
-       else if(!strcmp(k,"dds"))       gr->TextMark(*(a[0].d),*(a[1].d),a[2].w.c_str(),"",opt);
-       else if(!strcmp(k,"ddss"))      gr->TextMark(*(a[0].d),*(a[1].d),a[2].w.c_str(),a[3].s.c_str(),opt);
-       else if(!strcmp(k,"ddds"))      gr->TextMark(*(a[0].d),*(a[1].d),*(a[2].d),a[3].w.c_str(),"",opt);
-       else if(!strcmp(k,"dddss"))     gr->TextMark(*(a[0].d),*(a[1].d),*(a[2].d),a[3].w.c_str(),a[4].s.c_str(),opt);
-       else if(!strcmp(k,"dddds"))     gr->TextMark(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].w.c_str(),"",opt);
-       else if(!strcmp(k,"ddddss"))gr->TextMark(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].w.c_str(),a[5].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_triplot(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"ddd"))    gr->TriPlot(*(a[0].d),*(a[1].d),*(a[2].d),"",opt);
-       else if(!strcmp(k,"ddds"))      gr->TriPlot(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.c_str(),opt);
-       else if(!strcmp(k,"dddd"))      gr->TriPlot(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),"",opt);
-       else if(!strcmp(k,"dddds"))     gr->TriPlot(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.c_str(),opt);
-       else if(!strcmp(k,"ddddd"))     gr->TriPlot(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),"",opt);
-       else if(!strcmp(k,"ddddds"))gr->TriPlot(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),a[5].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_quadplot(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"ddd"))    gr->QuadPlot(*(a[0].d),*(a[1].d),*(a[2].d),"",opt);
-       else if(!strcmp(k,"ddds"))      gr->QuadPlot(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.c_str(),opt);
-       else if(!strcmp(k,"dddd"))      gr->QuadPlot(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),"",opt);
-       else if(!strcmp(k,"dddds"))     gr->QuadPlot(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.c_str(),opt);
-       else if(!strcmp(k,"ddddd"))     gr->QuadPlot(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),"",opt);
-       else if(!strcmp(k,"ddddds"))gr->QuadPlot(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),a[5].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_tricont(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"dddd"))
-               gr->TriCont(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),"",opt);
-       else if(!strcmp(k,"dddds"))
-               gr->TriCont(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.c_str(),opt);
-       else if(!strcmp(k,"ddddd"))
-               gr->TriContV(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),"",opt);
-       else if(!strcmp(k,"ddddds"))
-               gr->TriContV(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),a[5].s.c_str(),opt);
-       else if(!strcmp(k,"dddddd"))
-               gr->TriCont(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d),"",opt);
-       else if(!strcmp(k,"dddddds"))
-               gr->TriCont(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d),a[6].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_tricontv(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"dddd"))
-               gr->TriContVt(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),"",opt);
-       else if(!strcmp(k,"dddds"))
-               gr->TriContVt(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.c_str(),opt);
-       else if(!strcmp(k,"ddddd"))
-               gr->TriContVt(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),"",opt);
-       else if(!strcmp(k,"ddddds"))
-               gr->TriContVt(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),a[5].s.c_str(),opt);
-       else if(!strcmp(k,"dddddd"))
-               gr->TriContVt(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d),"",opt);
-       else if(!strcmp(k,"dddddds"))
-               gr->TriContVt(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d),a[6].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_ternary(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"n"))      gr->Ternary(int(a[0].v));
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_transpose(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && !strcmp(k,"d")) d->Transpose();
-       else if(d && !strcmp(k,"ds"))   d->Transpose(a[1].s.c_str());
-       else if(c && !strcmp(k,"d"))    c->Transpose();
-       else if(c && !strcmp(k,"ds"))   c->Transpose(a[1].s.c_str());
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_vect(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"dd"))     gr->Vect(*(a[0].d),*(a[1].d),"",opt);
-       else if(!strcmp(k,"dds"))       gr->Vect(*(a[0].d),*(a[1].d),a[2].s.c_str(),opt);
-       else if(!strcmp(k,"ddd"))       gr->Vect(*(a[0].d),*(a[1].d),*(a[2].d),"",opt);
-       else if(!strcmp(k,"ddds"))      gr->Vect(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.c_str(),opt);
-       else if(!strcmp(k,"dddd"))      gr->Vect(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),"",opt);
-       else if(!strcmp(k,"dddds"))     gr->Vect(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.c_str(),opt);
-       else if(!strcmp(k,"dddddd"))    gr->Vect(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d),"",opt);
-       else if(!strcmp(k,"dddddds"))   gr->Vect(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d),a[6].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_vect3(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"ddd"))
-               gr->Vect3(*(a[0].d),*(a[1].d),*(a[2].d),"",-1,opt);
-       else if(!strcmp(k,"ddds"))
-               gr->Vect3(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.c_str(),-1,opt);
-       else if(!strcmp(k,"dddsn"))
-               gr->Vect3(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.c_str(),a[4].v,opt);
-       else if(!strcmp(k,"dddddd"))
-               gr->Vect3(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d),"",-1,opt);
-       else if(!strcmp(k,"dddddds"))
-               gr->Vect3(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d),a[6].s.c_str(),-1,opt);
-       else if(!strcmp(k,"ddddddsn"))
-               gr->Vect3(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d),a[6].s.c_str(),a[7].v,opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_traj(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"dddd"))
-               gr->Traj(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),"",opt);
-       else if(!strcmp(k,"dddds"))
-               gr->Traj(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.c_str(),opt);
-       else if(!strcmp(k,"dddddd"))
-               gr->Traj(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d),"",opt);
-       else if(!strcmp(k,"dddddds"))
-               gr->Traj(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d),a[6].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_xlabel(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"s"))      gr->Label('x', a[0].w.c_str(), 1, opt);
-       else if(!strcmp(k,"sn"))        gr->Label('x', a[0].w.c_str(), a[1].v, opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_ylabel(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"s"))      gr->Label('y', a[0].w.c_str(), 1, opt);
-       else if(!strcmp(k,"sn"))        gr->Label('y', a[0].w.c_str(), a[1].v, opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_zlabel(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"s"))      gr->Label('z', a[0].w.c_str(), 1, opt);
-       else if(!strcmp(k,"sn"))        gr->Label('z', a[0].w.c_str(), a[1].v, opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_tlabel(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"s"))      gr->Label('t', a[0].w.c_str(), 1, opt);
-       else if(!strcmp(k,"sn"))        gr->Label('t', a[0].w.c_str(), a[1].v, opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_label(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"ds"))     gr->Label(*(a[0].d), a[1].w.c_str(), "",opt);
-       else if(!strcmp(k,"dss"))       gr->Label(*(a[0].d), a[1].w.c_str(), a[2].s.c_str(),opt);
-       else if(!strcmp(k,"dds"))       gr->Label(*(a[0].d), *(a[1].d), a[2].w.c_str(), "",opt);
-       else if(!strcmp(k,"ddss"))      gr->Label(*(a[0].d), *(a[1].d), a[2].w.c_str(), a[3].s.c_str(),opt);
-       else if(!strcmp(k,"ddds"))      gr->Label(*(a[0].d), *(a[1].d), *(a[2].d), a[3].w.c_str(), "",opt);
-       else if(!strcmp(k,"dddss"))     gr->Label(*(a[0].d), *(a[1].d), *(a[2].d), a[3].w.c_str(), a[4].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_table(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->Table(*(a[0].d), L"", "#|",opt);
-       else if(!strcmp(k,"ds"))        gr->Table(*(a[0].d), a[1].w.c_str(), "#|",opt);
-       else if(!strcmp(k,"dss"))       gr->Table(*(a[0].d), a[1].w.c_str(), a[2].s.c_str(),opt);
-       else if(!strcmp(k,"nnd"))       gr->Table(a[0].v, a[1].v, *(a[2].d), L"", "#|",opt);
-       else if(!strcmp(k,"nnds"))      gr->Table(a[0].v, a[1].v, *(a[2].d), a[3].w.c_str(), "#|",opt);
-       else if(!strcmp(k,"nndss"))     gr->Table(a[0].v, a[1].v, *(a[2].d), a[3].w.c_str(), a[4].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_xrange(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->SetRange('x',*(a[0].d));
-       else if(!strcmp(k,"dn"))        gr->SetRange('x',*(a[0].d),a[1].v);
-       else if(!strcmp(k,"nn"))        gr->SetRange('x', a[0].v, a[1].v);
-       else if(!strcmp(k,"nnn"))
-       {
-               if(a[2].v)      gr->AddRange('x', a[0].v, a[1].v);
-               else    gr->SetRange('x', a[0].v, a[1].v);
-       }
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_yrange(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->SetRange('y',*(a[0].d));
-       else if(!strcmp(k,"dn"))        gr->SetRange('y',*(a[0].d),a[1].v);
-       else if(!strcmp(k,"nn"))        gr->SetRange('y', a[0].v, a[1].v);
-       else if(!strcmp(k,"nnn"))
-       {
-               if(a[2].v)      gr->AddRange('y', a[0].v, a[1].v);
-               else    gr->SetRange('y', a[0].v, a[1].v);
-       }
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_zrange(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->SetRange('z',*(a[0].d));
-       else if(!strcmp(k,"dn"))        gr->SetRange('z',*(a[0].d),a[1].v);
-       else if(!strcmp(k,"nn"))        gr->SetRange('z', a[0].v, a[1].v);
-       else if(!strcmp(k,"nnn"))
-       {
-               if(a[2].v)      gr->AddRange('z', a[0].v, a[1].v);
-               else    gr->SetRange('z', a[0].v, a[1].v);
-       }
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_ctick(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"s"))      gr->SetTickTempl('c',a[0].w.c_str());
-       else if(!strcmp(k,"n")) gr->SetTicks('c',a[0].v,0,0);
-       else if(!strcmp(k,"ns"))        gr->SetTicks('c',a[0].v,0,0,a[1].w.c_str());
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_xtick(mglGraph *gr, long n, mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"n"))      gr->SetTicks('x', a[0].v);
-       else if(!strcmp(k,"ns"))        gr->SetTicks('x', a[0].v, 0, NAN, a[1].w.c_str());
-       else if(!strcmp(k,"nn"))        gr->SetTicks('x', a[0].v, mgl_int(a[1].v));
-       else if(!strcmp(k,"nns"))       gr->SetTicks('x', a[0].v, mgl_int(a[1].v), NAN, a[2].w.c_str());
-       else if(!strcmp(k,"nnn"))       gr->SetTicks('x', a[0].v, mgl_int(a[1].v), a[2].v);
-       else if(!strcmp(k,"nnns"))      gr->SetTicks('x', a[0].v, mgl_int(a[1].v), a[2].v, a[3].w.c_str());
-       else if(!strcmp(k,"s"))         gr->SetTickTempl('x',a[0].w.c_str());
-       else if(!strcmp(k,"ds"))        gr->SetTicksVal('x', *(a[0].d), a[1].w.c_str());
-       else if(!strcmp(k,"dsn"))       gr->SetTicksVal('x', *(a[0].d), a[1].w.c_str(), a[2].v);
-       else if(!strncmp(k,"ns",2))
-       {
-               mreal v[50];    std::wstring s; int i;
-               for(i=0;i<50 && i<n/2;i++)
-               {
-                       if(a[2*i].type==2 && a[2*i+1].type==1)
-                       {       v[i] = a[2*i].v;        s += a[2*i+1].w+L"\n";  }
-                       else    break;
-               }
-               gr->SetTicksVal('x',mglData(i,v),s.c_str(),a[2*i].type==2?a[2*i].v:0);
-       }
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_ytick(mglGraph *gr, long n, mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"n"))      gr->SetTicks('y', a[0].v);
-       else if(!strcmp(k,"ns"))        gr->SetTicks('y', a[0].v, 0, NAN, a[1].w.c_str());
-       else if(!strcmp(k,"nn"))        gr->SetTicks('y', a[0].v, mgl_int(a[1].v));
-       else if(!strcmp(k,"nns"))       gr->SetTicks('y', a[0].v, mgl_int(a[1].v), NAN, a[2].w.c_str());
-       else if(!strcmp(k,"nnn"))       gr->SetTicks('y', a[0].v, mgl_int(a[1].v), a[2].v);
-       else if(!strcmp(k,"nnns"))      gr->SetTicks('y', a[0].v, mgl_int(a[1].v), a[2].v, a[3].w.c_str());
-       else if(!strcmp(k,"s"))         gr->SetTickTempl('y',a[0].w.c_str());
-       else if(!strcmp(k,"ds"))        gr->SetTicksVal('y', *(a[0].d), a[1].w.c_str());
-       else if(!strcmp(k,"dsn"))       gr->SetTicksVal('y', *(a[0].d), a[1].w.c_str(), a[2].v);
-       else if(!strncmp(k,"ns",2))
-       {
-               mreal v[50];    std::wstring s; int i;
-               for(i=0;i<50 && i<n/2;i++)
-               {
-                       if(a[2*i].type==2 && a[2*i+1].type==1)
-                       {       v[i] = a[2*i].v;        s += a[2*i+1].w+L"\n";  }
-                       else    break;
-               }
-               gr->SetTicksVal('y',mglData(i,v),s.c_str());
-       }
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_ztick(mglGraph *gr, long n, mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"n"))      gr->SetTicks('z', a[0].v);
-       else if(!strcmp(k,"ns"))        gr->SetTicks('z', a[0].v, 0, NAN, a[1].w.c_str());
-       else if(!strcmp(k,"nn"))        gr->SetTicks('z', a[0].v, mgl_int(a[1].v));
-       else if(!strcmp(k,"nns"))       gr->SetTicks('z', a[0].v, mgl_int(a[1].v), NAN, a[2].w.c_str());
-       else if(!strcmp(k,"nnn"))       gr->SetTicks('z', a[0].v, mgl_int(a[1].v), a[2].v);
-       else if(!strcmp(k,"nnns"))      gr->SetTicks('z', a[0].v, mgl_int(a[1].v), a[2].v, a[3].w.c_str());
-       else if(!strcmp(k,"s"))         gr->SetTickTempl('z',a[0].w.c_str());
-       else if(!strcmp(k,"ds"))        gr->SetTicksVal('z', *(a[0].d), a[1].w.c_str());
-       else if(!strcmp(k,"dsn"))       gr->SetTicksVal('z', *(a[0].d), a[1].w.c_str(), a[2].v);
-       else if(!strncmp(k,"ns",2))
-       {
-               mreal v[50];    std::wstring s; int i;
-               for(i=0;i<50 && i<n/2;i++)
-               {
-                       if(a[2*i].type==2 && a[2*i+1].type==1)
-                       {       v[i] = a[2*i].v;        s += a[2*i+1].w+L"\n";  }
-                       else    break;
-               }
-               gr->SetTicksVal('z',mglData(i,v),s.c_str());
-       }
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_error(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"dd"))     gr->Error(*(a[0].d),*(a[1].d), "",opt);
-       else if(!strcmp(k,"dds"))       gr->Error(*(a[0].d),*(a[1].d), a[2].s.c_str(),opt);
-       else if(!strcmp(k,"ddd"))       gr->Error(*(a[0].d),*(a[1].d),*(a[2].d), "",opt);
-       else if(!strcmp(k,"ddds"))      gr->Error(*(a[0].d),*(a[1].d),*(a[2].d), a[3].s.c_str(),opt);
-       else if(!strcmp(k,"dddd"))      gr->Error(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d), "",opt);
-       else if(!strcmp(k,"dddds"))     gr->Error(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d), a[4].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_extend(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && !strcmp(k,"dn"))        d->Extend(mgl_int(a[1].v));
-       else if(d && !strcmp(k,"dnn"))  d->Extend(mgl_int(a[1].v),mgl_int(a[2].v));
-       else if(c && !strcmp(k,"dn"))   c->Extend(mgl_int(a[1].v));
-       else if(c && !strcmp(k,"dnn"))  c->Extend(mgl_int(a[1].v),mgl_int(a[2].v));
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_join(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if((!d && !c) || k[1]!='d')     res = 1;
-       else if(d)      for(long i=1;k[i]=='d';i++)     d->Join(*(a[i].d));
-       else if(c)      for(long i=1;k[i]=='d';i++)     c->Join(*(a[i].d));
-       return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_datas(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"s"))
-       {
-               char *buf=new char[1024];
-               mgl_datas_hdf(a[0].s.c_str(),buf,1024);
-               gr->SetWarn(-1,buf);
-               delete []buf;
-       }
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_info(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->SetWarn(-1,a[0].d->PrintInfo());
-       else if(!strcmp(k,"s")) gr->SetWarn(-1,a[0].s.c_str());
-       else if(!strcmp(k,"n"))
-       {       char buf[128];  snprintf(buf,128,"value = %g",a[0].v);  buf[127]=0;     gr->SetWarn(-1,buf);    }
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_print(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      printf("%s\n",a[0].d->PrintInfo());
-       else if(!strcmp(k,"s")) printf("%s\n",a[0].s.c_str());
-       else if(!strcmp(k,"n")) printf("value = %g\n",a[0].v);
-       else res = 1;   fflush(stdout); return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_echo(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"d"))      gr->SetWarn(-1,a[0].d->Get().c_str());
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_integrate(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && !strcmp(k,"ds"))        d->Integral(a[1].s.c_str());
-       else if(c && !strcmp(k,"ds"))   c->Integral(a[1].s.c_str());
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_inplot(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"nnnn"))   gr->InPlot(a[0].v, a[1].v, a[2].v, a[3].v);
-       else if(!strcmp(k,"nnnnn"))     gr->InPlot(a[0].v, a[1].v, a[2].v, a[3].v, a[4].v!=0);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_columnplot(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"nn"))     gr->ColumnPlot(mgl_int(a[0].v), mgl_int(a[1].v));
-       else if(!strcmp(k,"nnn"))       gr->ColumnPlot(mgl_int(a[0].v), mgl_int(a[1].v), a[2].v);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_gridplot(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"nnn"))    gr->GridPlot(mgl_int(a[0].v), mgl_int(a[1].v), mgl_int(a[2].v));
-       else if(!strcmp(k,"nnnn"))      gr->GridPlot(mgl_int(a[0].v), mgl_int(a[1].v), mgl_int(a[2].v), a[3].v);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_stickplot(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"nnnn"))   gr->StickPlot(mgl_int(a[0].v), mgl_int(a[1].v), a[2].v, a[3].v);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_pipe(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"dd"))     gr->Pipe(*(a[0].d),*(a[1].d),"",0.05,opt);
-       else if(!strcmp(k,"dds"))       gr->Pipe(*(a[0].d),*(a[1].d),a[2].s.c_str(),0.05,opt);
-       else if(!strcmp(k,"ddsn"))      gr->Pipe(*(a[0].d),*(a[1].d),a[2].s.c_str(),a[3].v,opt);
-       else if(!strcmp(k,"dddd"))
-               gr->Pipe(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),"",0.05,opt);
-       else if(!strcmp(k,"dddds"))
-               gr->Pipe(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.c_str(),0.05,opt);
-       else if(!strcmp(k,"ddddsn"))
-               gr->Pipe(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.c_str(),a[5].v,opt);
-       else if(!strcmp(k,"ddd"))
-               gr->Pipe(*(a[0].d),*(a[1].d),*(a[2].d),"",0.05,opt);
-       else if(!strcmp(k,"ddds"))
-               gr->Pipe(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.c_str(),0.05,opt);
-       else if(!strcmp(k,"dddsn"))
-               gr->Pipe(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.c_str(),a[4].v,opt);
-       else if(!strcmp(k,"dddddd"))
-               gr->Pipe(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d),"",0.05,opt);
-       else if(!strcmp(k,"dddddds"))
-               gr->Pipe(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d),a[6].s.c_str(),0.05,opt);
-       else if(!strcmp(k,"ddddddsn"))
-               gr->Pipe(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d),a[6].s.c_str(),a[7].v,opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_origin(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"nn"))     gr->SetOrigin(a[0].v,a[1].v,NAN);
-       else if(!strcmp(k,"nnn"))       gr->SetOrigin(a[0].v,a[1].v,a[2].v);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_norm(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"dnn"))    d->Norm(a[1].v,a[2].v);
-       else if(!strcmp(k,"dnnn"))      d->Norm(a[1].v,a[2].v,a[3].v!=0);
-       else if(!strcmp(k,"dnnnn"))     d->Norm(a[1].v,a[2].v,a[3].v!=0,mgl_int(a[4].v));
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_hist(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"ddd"))            *d = gr->Hist(*(a[1].d), *(a[2].d),opt);
-       else if(!strcmp(k,"dddd"))      *d = gr->Hist(*(a[1].d), *(a[2].d), *(a[3].d),opt);
-       else if(!strcmp(k,"ddddd"))     *d = gr->Hist(*(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d),opt);
-       else if(!strcmp(k,"ddnnn"))     *d = mglData(true,mgl_data_hist(a[1].d,int(a[2].v+0.5), a[3].v, a[4].v, 0));
-       else if(!strcmp(k,"ddnnnn"))    *d = mglData(true,mgl_data_hist(a[1].d,mgl_int(a[2].v), a[3].v, a[4].v, mgl_int(a[5].v)));
-       else if(!strcmp(k,"dddnnn"))    *d = mglData(true,mgl_data_hist_w(a[1].d,a[2].d, mgl_int(a[3].v), a[4].v, a[5].v, 0));
-       else if(!strcmp(k,"dddnnnn"))   *d = mglData(true,mgl_data_hist_w(a[1].d,a[2].d, mgl_int(a[3].v), a[4].v, a[5].v, mgl_int(a[6].v)));
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_mirror(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && !strcmp(k,"ds"))                d->Mirror(a[1].s.c_str());
-       else if(c && !strcmp(k,"ds"))   c->Mirror(a[1].s.c_str());
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_hankel(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && !strcmp(k,"ds"))                d->Hankel(a[1].s.c_str());
-       else if(c && !strcmp(k,"ds"))   c->Hankel(a[1].s.c_str());
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_sinfft(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!strcmp(k,"ds") && d)        d->SinFFT(a[1].s.c_str());
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_cosfft(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!strcmp(k,"ds") && d)        d->CosFFT(a[1].s.c_str());
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_wavelet(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!strcmp(k,"dsn") && d)       d->Wavelet(a[1].s.c_str(), mgl_int(a[2].v));
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_new(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && !strcmp(k,"dn"))        d->Create(mgl_int(a[1].v));
-       else if(d && !strcmp(k,"dns"))
-       {       d->Create(mgl_int(a[1].v));     d->Fill(gr->Self(),a[2].s.c_str(),opt); }
-       else if(d && !strcmp(k,"dnn"))  d->Create(mgl_int(a[1].v),mgl_int(a[2].v));
-       else if(d && !strcmp(k,"dnns"))
-       {       d->Create(mgl_int(a[1].v),mgl_int(a[2].v));     d->Fill(gr->Self(),a[3].s.c_str(),opt); }
-       else if(d && !strcmp(k,"dnnn")) d->Create(mgl_int(a[1].v),mgl_int(a[2].v),mgl_int(a[3].v));
-       else if(d && !strcmp(k,"dnnns"))
-       {       d->Create(mgl_int(a[1].v),mgl_int(a[2].v),mgl_int(a[3].v));     d->Fill(gr->Self(),a[4].s.c_str(),opt); }
-       else if(c && !strcmp(k,"dn"))   c->Create(mgl_int(a[1].v));
-       else if(c && !strcmp(k,"dns"))
-       {       c->Create(mgl_int(a[1].v));     c->Fill(gr->Self(),a[2].s.c_str(),opt); }
-       else if(c && !strcmp(k,"dnn"))  c->Create(mgl_int(a[1].v),mgl_int(a[2].v));
-       else if(c && !strcmp(k,"dnns"))
-       {       c->Create(mgl_int(a[1].v),mgl_int(a[2].v));     c->Fill(gr->Self(),a[3].s.c_str(),opt); }
-       else if(c && !strcmp(k,"dnnn")) c->Create(mgl_int(a[1].v),mgl_int(a[2].v),mgl_int(a[3].v));
-       else if(c && !strcmp(k,"dnnns"))
-       {       c->Create(mgl_int(a[1].v),mgl_int(a[2].v),mgl_int(a[3].v));     c->Fill(gr->Self(),a[4].s.c_str(),opt); }
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_var(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);   // TODO use mglDataV here?!
-       if(!d)  return 1;
-       if(!strcmp(k,"dnn"))
-       {       d->Create(mgl_int(a[1].v));     d->Fill(a[2].v, NAN);   }
-       else if(!strcmp(k,"dnnn"))
-       {       d->Create(mgl_int(a[1].v));     d->Fill(a[2].v, a[3].v);        }
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_chdir(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"s"))
-       {       if(chdir(a[0].s.c_str()))       gr->SetWarn(mglWarnFile,"chdir");       }
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_perspective(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"n"))      gr->Perspective(a[0].v);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_facex(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;      gr->Self()->SaveState(opt);
-       if(!strcmp(k,"nnnnn"))  gr->FaceX(mglPoint(a[0].v, a[1].v, a[2].v), a[3].v, a[4].v);
-       else if(!strcmp(k,"nnnnns"))    gr->FaceX(mglPoint(a[0].v, a[1].v, a[2].v), a[3].v, a[4].v, a[5].s.c_str());
-       else if(!strcmp(k,"nnnnnsnn"))  gr->FaceX(mglPoint(a[0].v, a[1].v, a[2].v), a[3].v, a[4].v, a[5].s.c_str(),a[6].v,a[7].v);
-       else res = 1;   gr->Self()->LoadState();        return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_facey(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;      gr->Self()->SaveState(opt);
-       if(!strcmp(k,"nnnnn"))  gr->FaceY(mglPoint(a[0].v, a[1].v, a[2].v), a[3].v, a[4].v);
-       else if(!strcmp(k,"nnnnns"))    gr->FaceY(mglPoint(a[0].v, a[1].v, a[2].v), a[3].v, a[4].v, a[5].s.c_str());
-       else if(!strcmp(k,"nnnnnsnn"))  gr->FaceY(mglPoint(a[0].v, a[1].v, a[2].v), a[3].v, a[4].v, a[5].s.c_str(),a[6].v,a[7].v);
-       else res = 1;   gr->Self()->LoadState();        return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_facez(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;      gr->Self()->SaveState(opt);
-       if(!strcmp(k,"nnnnn"))  gr->FaceZ(mglPoint(a[0].v, a[1].v, a[2].v), a[3].v, a[4].v);
-       else if(!strcmp(k,"nnnnns"))    gr->FaceZ(mglPoint(a[0].v, a[1].v, a[2].v), a[3].v, a[4].v, a[5].s.c_str());
-       else if(!strcmp(k,"nnnnnsnn"))  gr->FaceZ(mglPoint(a[0].v, a[1].v, a[2].v), a[3].v, a[4].v, a[5].s.c_str(),a[6].v,a[7].v);
-       else res = 1;   gr->Self()->LoadState();        return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_normsl(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"dnn"))    d->NormSl(a[1].v, a[2].v);
-       else if(!strcmp(k,"dnns"))      d->NormSl(a[1].v, a[2].v, a[3].s.c_str()[0]);
-       else if(!strcmp(k,"dnnsn"))     d->NormSl(a[1].v, a[2].v, a[3].s.c_str()[0],a[4].v);
-       else if(!strcmp(k,"dnnsnn"))d->NormSl(a[1].v, a[2].v, a[3].s.c_str()[0],a[4].v,a[5].v);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_momentum(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && !strcmp(k,"dds"))       *d = mglData(true,mgl_data_momentum(a[1].d,'z', a[2].s.c_str()));
-       else if(d && !strcmp(k,"ddss")) *d = mglData(true,mgl_data_momentum(a[1].d,a[3].s.c_str()[0], a[2].s.c_str()));
-       else if(c && !strcmp(k,"dds"))  *c = mglDataC(true,mgl_datac_momentum(a[1].d,'z', a[2].s.c_str()));
-       else if(c && !strcmp(k,"ddss")) *c = mglDataC(true,mgl_datac_momentum(a[1].d,a[3].s.c_str()[0], a[2].s.c_str()));
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_pulse(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(d && !strcmp(k,"dds"))       *d = mglData(true,mgl_data_pulse(a[1].d,a[2].s[0]));
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_fit(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"dddddssd"))
-       {
-               mglData *i = dynamic_cast<mglData *>(a[7].d);
-               if(i)   *d = gr->Fit(*(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), a[5].s.c_str(), a[6].s.c_str(), *i,opt);
-               else    res = 1;
-       }
-       else if(!strcmp(k,"dddddss"))
-               *d = gr->Fit(*(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), a[5].s.c_str(), a[6].s.c_str(),opt);
-       else if(!strcmp(k,"ddddssd"))
-       {
-               mglData *i = dynamic_cast<mglData *>(a[6].d);
-               if(i)   *d = gr->Fit(*(a[1].d), *(a[2].d), *(a[3].d), a[4].s.c_str(), a[5].s.c_str(), *i,opt);
-               else    res = 1;
-       }
-       else if(!strcmp(k,"ddddss"))
-               *d = gr->Fit(*(a[1].d), *(a[2].d), *(a[3].d), a[4].s.c_str(), a[5].s.c_str(),opt);
-       else if(!strcmp(k,"dddssd"))
-       {
-               mglData *i = dynamic_cast<mglData *>(a[5].d);
-               if(i)   *d = gr->Fit(*(a[1].d), *(a[2].d), a[3].s.c_str(), a[4].s.c_str(), *i,opt);
-               else    res = 1;
-       }
-       else if(!strcmp(k,"dddss"))
-               *d = gr->Fit(*(a[1].d), *(a[2].d), a[3].s.c_str(), a[4].s.c_str(),opt);
-       else if(!strcmp(k,"ddssd"))
-       {
-               mglData *i = dynamic_cast<mglData *>(a[4].d);
-               if(i)   *d = gr->Fit(*(a[1].d), a[2].s.c_str(), a[3].s.c_str(), *i,opt);
-               else    res = 1;
-       }
-       else if(!strcmp(k,"ddss"))
-               *d = gr->Fit(*(a[1].d), a[2].s.c_str(), a[3].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_fits(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"ddddddssd"))
-       {
-               mglData *i = dynamic_cast<mglData *>(a[8].d);
-               if(i)   *d = gr->FitS(*(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), *(a[5].d), a[6].s.c_str(), a[7].s.c_str(), *i,opt);
-               else    res = 1;
-       }
-       else if(!strcmp(k,"ddddddss"))
-               *d = gr->FitS(*(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), *(a[5].d), a[6].s.c_str(), a[7].s.c_str(),opt);
-       else if(!strcmp(k,"dddddssd"))
-       {
-               mglData *i = dynamic_cast<mglData *>(a[7].d);
-               if(i)   *d = gr->FitS(*(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), a[5].s.c_str(), a[6].s.c_str(), *i,opt);
-               else    res = 1;
-       }
-       else if(!strcmp(k,"dddddss"))
-               *d = gr->FitS(*(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), a[5].s.c_str(), a[6].s.c_str(),opt);
-       else if(!strcmp(k,"ddddssd"))
-       {
-               mglData *i = dynamic_cast<mglData *>(a[6].d);
-               if(i)   *d = gr->FitS(*(a[1].d), *(a[2].d), *(a[3].d), a[4].s.c_str(), a[5].s.c_str(), *i,opt);
-               else    res = 1;
-       }
-       else if(!strcmp(k,"ddddss"))
-               *d = gr->FitS(*(a[1].d), *(a[2].d), *(a[3].d), a[4].s.c_str(), a[5].s.c_str(),opt);
-       else if(!strcmp(k,"dddssd"))
-       {
-               mglData *i = dynamic_cast<mglData *>(a[5].d);
-               if(i)   *d = gr->FitS(*(a[1].d), *(a[2].d), a[3].s.c_str(), a[4].s.c_str(), *i,opt);
-               else    res = 1;
-       }
-       else if(!strcmp(k,"dddss"))
-               *d = gr->FitS(*(a[1].d), *(a[2].d), a[3].s.c_str(), a[4].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_putsfit(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;      gr->Self()->SaveState(opt);
-       if(!strcmp(k,"nn"))             gr->PutsFit(mglPoint(a[0].v,a[1].v));
-       else if(!strcmp(k,"nns"))       gr->PutsFit(mglPoint(a[0].v,a[1].v), a[2].s.c_str());
-       else if(!strcmp(k,"nnss"))      gr->PutsFit(mglPoint(a[0].v,a[1].v), a[2].s.c_str(),a[3].s.c_str());
-       else if(!strcmp(k,"nnssn"))     gr->PutsFit(mglPoint(a[0].v,a[1].v), a[2].s.c_str(),a[3].s.c_str(),a[4].v);
-       else if(!strcmp(k,"nnn"))       gr->PutsFit(mglPoint(a[0].v,a[1].v,a[2].v));
-       else if(!strcmp(k,"nnns"))      gr->PutsFit(mglPoint(a[0].v,a[1].v,a[2].v), a[3].s.c_str());
-       else if(!strcmp(k,"nnnss"))     gr->PutsFit(mglPoint(a[0].v,a[1].v,a[2].v), a[3].s.c_str(),a[4].s.c_str());
-       else if(!strcmp(k,"nnnssn"))gr->PutsFit(mglPoint(a[0].v,a[1].v,a[2].v), a[3].s.c_str(),a[4].s.c_str(),a[5].v);
-       else res = 1;   gr->Self()->LoadState();        return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_arrowsize(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"n"))      gr->SetArrowSize(a[0].v);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_rearrange(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && !strcmp(k,"dn"))        d->Rearrange(mgl_int(a[1].v));
-       else if(d && !strcmp(k,"dnn"))  d->Rearrange(mgl_int(a[1].v), mgl_int(a[2].v));
-       else if(d && !strcmp(k,"dnnn")) d->Rearrange(mgl_int(a[1].v), mgl_int(a[2].v), mgl_int(a[3].v));
-       else if(c && !strcmp(k,"dn"))   c->Rearrange(mgl_int(a[1].v));
-       else if(c && !strcmp(k,"dnn"))  c->Rearrange(mgl_int(a[1].v), mgl_int(a[2].v));
-       else if(c && !strcmp(k,"dnnn")) c->Rearrange(mgl_int(a[1].v), mgl_int(a[2].v), mgl_int(a[3].v));
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_fplot(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"s"))      gr->FPlot(a[0].s.c_str(), "",opt);
-       else if(!strcmp(k,"ss"))        gr->FPlot(a[0].s.c_str(), a[1].s.c_str(),opt);
-       else if(!strcmp(k,"sss"))       gr->FPlot(a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str(), "",opt);
-       else if(!strcmp(k,"ssss"))      gr->FPlot(a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str(), a[3].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_fsurf(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"s"))      gr->FSurf(a[0].s.c_str(), "",opt);
-       else if(!strcmp(k,"ss"))        gr->FSurf(a[0].s.c_str(), a[1].s.c_str(),opt);
-       else if(!strcmp(k,"sss"))       gr->FSurf(a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str(), "",opt);
-       else if(!strcmp(k,"ssss"))      gr->FSurf(a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str(), a[3].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_fgets(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;      gr->Self()->SaveState(opt);
-       char buf[4096];
-       FILE *fp;
-       if(!strncmp(k,"nns",3))
-       {
-               int i, n = (k[3]=='n'?mgl_int(a[3].v):0);
-               fp = fopen(a[2].s.c_str(),"rt");
-               if(!fp)
-               {
-                       gr->SetWarn(mglWarnOpen,a[2].s.c_str());
-                       return res;
-}
-               for(i=0;i<n;i++)        if(!fgets(buf,4096,fp)) continue;
-               memset(buf,0,4096);
-               if(!fgets(buf,4096,fp))
-               {
-                       char b[32];     snprintf(b,32,"%d",n);  b[31]=0;
-                       gr->SetWarn(mglWarnOpen,(a[2].s+" - line "+b).c_str());
-                       fclose(fp);     return res;
-               }
-               fclose(fp);
-               gr->Puts(mglPoint(a[0].v,a[1].v,NAN),buf, (k[4]=='s')?a[4].s.c_str():"", k[5]=='n'?a[5].v:-1);
-       }
-       else if(!strncmp(k,"nnns",4))
-       {
-               int i, n = (k[4]=='n'?mgl_int(a[4].v):0);
-               fp = fopen(a[3].s.c_str(),"rt");
-               if(!fp)
-               {
-                       gr->SetWarn(mglWarnOpen,a[3].s.c_str());
-                       return res;
-               }
-               for(i=0;i<n;i++)        if(!fgets(buf,4096,fp)) continue;
-               memset(buf,0,4096);
-               if(!fgets(buf,4096,fp))
-               {
-                       char b[32];     snprintf(b,32,"%d",n);  b[31]=0;
-                       gr->SetWarn(mglWarnOpen,(a[3].s+" - line "+b).c_str());
-                       fclose(fp);     return res;
-               }
-               fclose(fp);
-               gr->Puts(mglPoint(a[0].v,a[1].v,a[2].v),buf, (k[5]=='s')?a[5].s.c_str():"", k[6]=='n'?a[6].v:-1);
-       }
-       else res = 1;   gr->Self()->LoadState();        return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_scanfile(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"dss"))
-       {
-               mglData *d = dynamic_cast<mglData *>(a[0].d);
-               if(!d)  return 1;
-               d->ScanFile(a[1].s.c_str(), a[2].s.c_str());
-       }
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_import(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"dss"))    d->Import(a[1].s.c_str(), a[2].s.c_str());
-       else if(!strcmp(k,"dssnn"))     d->Import(a[1].s.c_str(), a[2].s.c_str(), a[3].v,a[4].v);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_export(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"dss"))    a[0].d->Export(a[1].s.c_str(), a[2].s.c_str());
-       else if(!strcmp(k,"dssnn"))     a[0].d->Export(a[1].s.c_str(), a[2].s.c_str(), a[3].v,a[4].v);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_write(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]==0)     gr->WriteFrame("", "MathGL");
-       else if(!strcmp(k,"s")) gr->WriteFrame(a[0].s.c_str(), "MathGL");
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_region(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"dd"))             gr->Region(*(a[0].d),*(a[1].d),"",opt);
-       else if(!strcmp(k,"dds"))       gr->Region(*(a[0].d),*(a[1].d),a[2].s.c_str(),opt);
-       else if(!strcmp(k,"ddd"))       gr->Region(*(a[0].d),*(a[1].d),*(a[2].d),"",opt);
-       else if(!strcmp(k,"ddds"))      gr->Region(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.c_str(),opt);
-       else if(!strcmp(k,"dddd"))      gr->Region(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),"",opt);
-       else if(!strcmp(k,"dddds"))     gr->Region(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.c_str(),opt);
-       else if(!strcmp(k,"dddddd"))    gr->Region(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d),"",opt);
-       else if(!strcmp(k,"dddddds"))   gr->Region(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d),a[6].s.c_str(),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_envelop(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"d"))      d->Envelop();
-       else if(!strcmp(k,"ds"))        d->Envelop(a[1].s.c_str()[0]);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_sew(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"d"))      d->Sew();
-       else if(!strcmp(k,"ds"))        d->Sew(a[1].s.c_str());
-       else if(!strcmp(k,"dsn"))       d->Sew(a[1].s.c_str(), a[2].v);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_evaluate(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && k[0]=='d' && k[1]=='d' && k[2]=='d')
-       {
-               if(k[3]==0)     *d = mglData(true,mgl_data_evaluate(a[1].d,a[2].d,0,0,true));
-               else if(!strcmp(k+3,"n"))       *d = mglData(true,mgl_data_evaluate(a[1].d,a[2].d,0,0, a[3].v!=0));
-               else if(!strcmp(k+3,"d"))       *d = mglData(true,mgl_data_evaluate(a[1].d,a[2].d,a[3].d,0,true));
-               else if(!strcmp(k+3,"dn"))      *d = mglData(true,mgl_data_evaluate(a[1].d,a[2].d,a[3].d,0, a[4].v!=0));
-               else if(!strcmp(k+3,"dd"))      *d = mglData(true,mgl_data_evaluate(a[1].d,a[2].d,a[3].d,a[4].d,true));
-               else if(!strcmp(k+3,"ddn"))     *d = mglData(true,mgl_data_evaluate(a[1].d,a[2].d,a[3].d,a[4].d, a[5].v!=0));
-               else res = 1;
-       }
-       else if(c && k[0]=='d' && k[1]=='d' && k[2]=='d')
-       {
-               if(k[3]==0)     *c = mglDataC(true,mgl_datac_evaluate(a[1].d,a[2].d,0,0,true));
-               else if(!strcmp(k+3,"n"))       *c = mglDataC(true,mgl_datac_evaluate(a[1].d,a[2].d,0,0, a[3].v!=0));
-               else if(!strcmp(k+3,"d"))       *c = mglDataC(true,mgl_datac_evaluate(a[1].d,a[2].d,a[3].d,0,true));
-               else if(!strcmp(k+3,"dn"))      *c = mglDataC(true,mgl_datac_evaluate(a[1].d,a[2].d,a[3].d,0, a[4].v!=0));
-               else if(!strcmp(k+3,"dd"))      *c = mglDataC(true,mgl_datac_evaluate(a[1].d,a[2].d,a[3].d,a[4].d,true));
-               else if(!strcmp(k+3,"ddn"))     *c = mglDataC(true,mgl_datac_evaluate(a[1].d,a[2].d,a[3].d,a[4].d, a[5].v!=0));
-               else res = 1;
-       }
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_solve(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"ddns"))   *d = mglData(true,mgl_data_solve(a[1].d, a[2].v, a[3].s[0], 0, true));
-       else if(!strcmp(k,"ddnsn"))     *d = mglData(true,mgl_data_solve(a[1].d, a[2].v, a[3].s[0], 0, a[4].v!=0));
-       else if(!strcmp(k,"ddnsd"))     *d = mglData(true,mgl_data_solve(a[1].d, a[2].v, a[3].s[0], a[4].d, true));
-       else if(!strcmp(k,"ddnsdn"))*d = mglData(true,mgl_data_solve(a[1].d, a[2].v, a[3].s[0], a[4].d, a[5].v!=0));
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_put(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d)
-       {
-               if(!strcmp(k,"dn"))     d->Put(a[1].v);
-               else if(!strcmp(k,"dnn"))       d->Put(a[1].v, mgl_int(a[2].v));
-               else if(!strcmp(k,"dnnn"))      d->Put(a[1].v, mgl_int(a[2].v),mgl_int(a[3].v));
-               else if(!strcmp(k,"dnnnn"))     d->Put(a[1].v, mgl_int(a[2].v),mgl_int(a[3].v),mgl_int(a[4].v));
-               else if(!strcmp(k,"dd"))        d->Put(*(a[1].d));
-               else if(!strcmp(k,"ddn"))       d->Put(*(a[1].d), mgl_int(a[2].v));
-               else if(!strcmp(k,"ddnn"))      d->Put(*(a[1].d), mgl_int(a[2].v),mgl_int(a[3].v));
-               else if(!strcmp(k,"ddnnn"))     d->Put(*(a[1].d), mgl_int(a[2].v),mgl_int(a[3].v),mgl_int(a[4].v));
-               else res = 1;
-       }
-       else if(c)
-       {
-               if(!strcmp(k,"dn"))     c->Put(a[1].c);
-               else if(!strcmp(k,"dnn"))       c->Put(a[1].c, mgl_int(a[2].v));
-               else if(!strcmp(k,"dnnn"))      c->Put(a[1].c, mgl_int(a[2].v),mgl_int(a[3].v));
-               else if(!strcmp(k,"dnnnn"))     c->Put(a[1].c, mgl_int(a[2].v),mgl_int(a[3].v),mgl_int(a[4].v));
-               else if(!strcmp(k,"dd"))        c->Put(*(a[1].d));
-               else if(!strcmp(k,"ddn"))       c->Put(*(a[1].d), mgl_int(a[2].v));
-               else if(!strcmp(k,"ddnn"))      c->Put(*(a[1].d), mgl_int(a[2].v),mgl_int(a[3].v));
-               else if(!strcmp(k,"ddnnn"))     c->Put(*(a[1].d), mgl_int(a[2].v),mgl_int(a[3].v),mgl_int(a[4].v));
-               else res = 1;
-       }
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_palette(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"s"))      gr->SetPalette(a[0].s.c_str());
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_combine(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && !strcmp(k,"ddd"))       *d = mglData(true,mgl_data_combine(a[1].d, a[2].d));
-       else if(c && !strcmp(k,"ddd"))  *c = mglDataC(true,mgl_datac_combine(a[1].d, a[2].d));
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_correl(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && !strcmp(k,"ddds"))      *d = mglData(true,mgl_data_correl(a[1].d, a[2].d, a[3].s.c_str()));
-       else if(c && !strcmp(k,"ddds")) *c = mglDataC(true,mgl_datac_correl(a[1].d, a[2].d, a[3].s.c_str()));
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_roots(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"dsds"))   *d = mglData(true,mgl_data_roots(a[1].s.c_str(), a[2].d, a[3].s[0]));
-       else if(!strcmp(k,"dsns"))      d->a[0] = mgl_find_root_txt(a[1].s.c_str(), a[2].v, a[3].s[0]);
-       else if(!strcmp(k,"dsd"))       *d = mglData(true,mgl_data_roots(a[1].s.c_str(), a[2].d, 'x'));
-       else if(!strcmp(k,"dsn"))       d->a[0] = mgl_find_root_txt(a[1].s.c_str(), a[2].v, 'x');
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_ode(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"dssd"))
-               *d = mglODE(a[1].s.c_str(), a[2].s.c_str(), *(a[3].d));
-       else if(!strcmp(k,"dssdnn"))
-               *d = mglODE(a[1].s.c_str(), a[2].s.c_str(), *(a[3].d), a[4].v, a[5].v);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_pde(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       if(k[1]=='d' && a[1].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d), *f = dynamic_cast<mglData *>(a[1].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && f)
-       {
-               mglDataC r;
-               if(!strcmp(k,"ddsdd"))
-                       r = gr->PDEc(a[2].s.c_str(), *(a[3].d), *(a[4].d), 0.1,100,opt);
-               else if(!strcmp(k,"ddsddn"))
-                       r = gr->PDEc(a[2].s.c_str(), *(a[3].d), *(a[4].d), a[5].v,100,opt);
-               else if(!strcmp(k,"ddsddnn"))
-                       r = gr->PDEc(a[2].s.c_str(), *(a[3].d), *(a[4].d), a[5].v,a[6].v,opt);
-               else res = 1;
-               if(res==0)      {       *d = r.Abs();   *f = r.Arg();   }
-       }
-       else if(d)
-       {
-               if(!strcmp(k,"dsdd"))
-                       *d = gr->PDE(a[1].s.c_str(), *(a[2].d), *(a[3].d), 0.1,100,opt);
-               else if(!strcmp(k,"dsddn"))
-                       *d = gr->PDE(a[1].s.c_str(), *(a[2].d), *(a[3].d), a[4].v,100,opt);
-               else if(!strcmp(k,"dsddnn"))
-                       *d = gr->PDE(a[1].s.c_str(), *(a[2].d), *(a[3].d), a[4].v,a[5].v,opt);
-               else res = 1;
-       }
-       else if(c)
-       {
-               if(!strcmp(k,"dsdd"))
-                       *c = gr->PDEc(a[1].s.c_str(), *(a[2].d), *(a[3].d), 0.1,100,opt);
-               else if(!strcmp(k,"dsddn"))
-                       *c = gr->PDEc(a[1].s.c_str(), *(a[2].d), *(a[3].d), a[4].v,100,opt);
-               else if(!strcmp(k,"dsddnn"))
-                       *c = gr->PDEc(a[1].s.c_str(), *(a[2].d), *(a[3].d), a[4].v,a[5].v,opt);
-               else res = 1;
-       }
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_pde_adv(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       if(k[1]=='d' && a[1].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d), *f = dynamic_cast<mglData *>(a[1].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && f)
-       {
-               mglDataC r;
-               if(!strcmp(k,"ddsdd"))
-                       r = gr->APDEc(a[2].s.c_str(), *(a[3].d), *(a[4].d), 0.1,100,opt);
-               else if(!strcmp(k,"ddsddn"))
-                       r = gr->APDEc(a[2].s.c_str(), *(a[3].d), *(a[4].d), a[5].v,100,opt);
-               else if(!strcmp(k,"ddsddnn"))
-                       r = gr->APDEc(a[2].s.c_str(), *(a[3].d), *(a[4].d), a[5].v,a[6].v,opt);
-               else res = 1;
-               if(res==0)      {       *d = r.Abs();   *f = r.Arg();   }
-       }
-       else if(d)
-       {
-               if(!strcmp(k,"dsdd"))
-                       *d = gr->APDE(a[1].s.c_str(), *(a[2].d), *(a[3].d), 0.1,100,opt);
-               else if(!strcmp(k,"dsddn"))
-                       *d = gr->APDE(a[1].s.c_str(), *(a[2].d), *(a[3].d), a[4].v,100,opt);
-               else if(!strcmp(k,"dsddnn"))
-                       *d = gr->APDE(a[1].s.c_str(), *(a[2].d), *(a[3].d), a[4].v,a[5].v,opt);
-               else res = 1;
-       }
-       else if(c)
-       {
-               if(!strcmp(k,"dsdd"))
-                       *c = gr->APDEc(a[1].s.c_str(), *(a[2].d), *(a[3].d), 0.1,100,opt);
-               else if(!strcmp(k,"dsddn"))
-                       *c = gr->APDEc(a[1].s.c_str(), *(a[2].d), *(a[3].d), a[4].v,100,opt);
-               else if(!strcmp(k,"dsddnn"))
-                       *c = gr->APDEc(a[1].s.c_str(), *(a[2].d), *(a[3].d), a[4].v,a[5].v,opt);
-               else res = 1;
-       }
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_qo2d(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       if(k[1]=='d' && a[1].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d), *f = dynamic_cast<mglData *>(a[1].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && f)
-       {
-               mglDataC r;
-               if(!strcmp(k,"ddsddd"))
-                       r = mglDataC(true, mgl_qo2d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, 1,100, 0,0));
-               else if(!strcmp(k,"ddsdddn"))
-                       r = mglDataC(true, mgl_qo2d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, a[6].v,100, 0,0));
-               else if(!strcmp(k,"ddsdddnn"))
-                       r = mglDataC(true, mgl_qo2d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, a[6].v,a[7].v, 0,0));
-               else if(!strcmp(k,"ddsdddnndd"))
-                       r = mglDataC(true, mgl_qo2d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, a[6].v,a[7].v, dynamic_cast<mglData *>(a[8].d),dynamic_cast<mglData *>(a[9].d)));
-               else res = 1;
-               if(res==0)      {       *d = r.Abs();   *f = r.Arg();   }
-       }
-       else if(d)
-       {
-               if(!strcmp(k,"dsddd"))
-                       *d = mglData(true, mgl_qo2d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, 1,100, 0,0));
-               else if(!strcmp(k,"dsdddn"))
-                       *d = mglData(true, mgl_qo2d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,100, 0,0));
-               else if(!strcmp(k,"dsdddnn"))
-                       *d = mglData(true, mgl_qo2d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,a[6].v, 0,0));
-               else if(!strcmp(k,"dsdddnndd"))
-                       *d = mglData(true, mgl_qo2d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,a[6].v, dynamic_cast<mglData *>(a[7].d),dynamic_cast<mglData *>(a[8].d)));
-               else res = 1;
-       }
-       else if(c)
-       {
-               if(!strcmp(k,"dsddd"))
-                       *c = mglDataC(true, mgl_qo2d_solve_c(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, 1,100, 0,0));
-               else if(!strcmp(k,"dsdddn"))
-                       *c = mglDataC(true, mgl_qo2d_solve_c(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,100, 0,0));
-               else if(!strcmp(k,"dsdddnn"))
-                       *c = mglDataC(true, mgl_qo2d_solve_c(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,a[6].v, 0,0));
-               else if(!strcmp(k,"dsdddnndd"))
-                       *c = mglDataC(true, mgl_qo2d_solve_c(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,a[6].v, dynamic_cast<mglData *>(a[7].d),dynamic_cast<mglData *>(a[8].d)));
-               else res = 1;
-       }
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_qo3d(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       if(k[1]=='d' && a[1].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d), *f = dynamic_cast<mglData *>(a[1].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && f)
-       {
-               mglDataC r;
-               if(!strcmp(k,"ddsddd"))
-                       r = mglDataC(true, mgl_qo3d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, 1,100, 0,0,0));
-               else if(!strcmp(k,"ddsdddn"))
-                       r = mglDataC(true, mgl_qo3d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, a[6].v,100, 0,0,0));
-               else if(!strcmp(k,"ddsdddnn"))
-                       r = mglDataC(true, mgl_qo3d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, a[6].v,a[7].v, 0,0,0));
-               else if(!strcmp(k,"ddsdddnnddd"))
-                       r = mglDataC(true, mgl_qo3d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, a[6].v,a[7].v, dynamic_cast<mglData *>(a[8].d),dynamic_cast<mglData *>(a[9].d),dynamic_cast<mglData *>(a[10].d)));
-               else res = 1;
-               if(res==0)      {       *d = r.Abs();   *f = r.Arg();   }
-       }
-       else if(d)
-       {
-               if(!strcmp(k,"dsddd"))
-                       *d = mglData(true, mgl_qo3d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, 1,100, 0,0,0));
-               else if(!strcmp(k,"dsdddn"))
-                       *d = mglData(true, mgl_qo3d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,100, 0,0,0));
-               else if(!strcmp(k,"dsdddnn"))
-                       *d = mglData(true, mgl_qo3d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,a[6].v, 0,0,0));
-               else if(!strcmp(k,"dsdddnnddd"))
-                       *d = mglData(true, mgl_qo3d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,a[6].v, dynamic_cast<mglData *>(a[7].d),dynamic_cast<mglData *>(a[8].d),dynamic_cast<mglData *>(a[9].d)));
-               else res = 1;
-       }
-       else if(c)
-       {
-               if(!strcmp(k,"dsddd"))
-                       *c = mglDataC(true, mgl_qo3d_solve_c(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, 1,100, 0,0,0));
-               else if(!strcmp(k,"dsdddn"))
-                       *c = mglDataC(true, mgl_qo3d_solve_c(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,100, 0,0,0));
-               else if(!strcmp(k,"dsdddnn"))
-                       *c = mglDataC(true, mgl_qo3d_solve_c(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,a[6].v, 0,0,0));
-               else if(!strcmp(k,"dsdddnnddd"))
-                       *c = mglDataC(true, mgl_qo3d_solve_c(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,a[6].v, dynamic_cast<mglData *>(a[7].d),dynamic_cast<mglData *>(a[8].d),dynamic_cast<mglData *>(a[9].d)));
-               else res = 1;
-       }
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_ray(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"dsnnnn"))
-               *d = mglRay(a[1].s.c_str(), mglPoint(a[2].v, a[3].v), mglPoint(a[4].v, a[5].v));
-       else if(!strcmp(k,"dsnnnnnn"))
-               *d = mglRay(a[1].s.c_str(), mglPoint(a[2].v, a[3].v, a[4].v), mglPoint(a[5].v, a[6].v, a[7].v));
-       else if(!strcmp(k,"dsnnnnnnn"))
-               *d = mglRay(a[1].s.c_str(), mglPoint(a[2].v, a[3].v, a[4].v), mglPoint(a[5].v, a[6].v, a[7].v), a[8].v);
-       else if(!strcmp(k,"dsnnnnnnnn"))
-               *d = mglRay(a[1].s.c_str(), mglPoint(a[2].v, a[3].v, a[4].v), mglPoint(a[5].v, a[6].v, a[7].v), a[8].v,a[9].v);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_jacobian(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"ddd"))    *d = mglJacobian(*(a[1].d), *(a[2].d));
-       else if(!strcmp(k,"dddd"))      *d = mglJacobian(*(a[1].d), *(a[2].d), *(a[3].d));
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_tens(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(!strcmp(k,"dd"))     gr->Tens(*(a[0].d),*(a[1].d), "",opt);
-       else if(!strcmp(k,"dds"))       gr->Tens(*(a[0].d),*(a[1].d), a[2].s.c_str(),opt);
-       else if(!strcmp(k,"ddd"))       gr->Tens(*(a[0].d),*(a[1].d),*(a[2].d), "",opt);
-       else if(!strcmp(k,"ddds"))      gr->Tens(*(a[0].d),*(a[1].d),*(a[2].d), a[3].s.c_str(),opt);
-       else if(!strcmp(k,"dddd"))      gr->Tens(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d), "",opt);
-       else if(!strcmp(k,"dddds"))     gr->Tens(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d), a[4].s.c_str(),opt);
-       return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_ticklen(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"n"))      gr->SetTickLen(a[0].v);
-       else if(!strcmp(k,"nn"))        gr->SetTickLen(a[0].v, a[1].v);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_tickshift(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"n"))      gr->SetTickShift(mglPoint(a[0].v));
-       else if(!strcmp(k,"nn"))        gr->SetTickShift(mglPoint(a[0].v, a[1].v));
-       else if(!strcmp(k,"nnn"))       gr->SetTickShift(mglPoint(a[0].v, a[1].v, a[2].v));
-       else if(!strcmp(k,"nnnn"))      gr->SetTickShift(mglPoint(a[0].v, a[1].v, a[2].v, a[3].v));
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_origintick(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"n"))      gr->SetOriginTick(a[0].v);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_axisstl(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]==0)     gr->SetAxisStl();
-       else if(!strcmp(k,"s")) gr->SetAxisStl(a[0].s.c_str());
-       else if(!strcmp(k,"ss"))        gr->SetAxisStl(a[0].s.c_str(), a[1].s.c_str());
-       else if(!strcmp(k,"sss"))       gr->SetAxisStl(a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str());
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_ranges(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"nnnn"))   gr->SetRanges(a[0].v,a[1].v, a[2].v,a[3].v);
-       else if(!strcmp(k,"nnnnnn"))gr->SetRanges(a[0].v,a[1].v,a[2].v, a[3].v,a[4].v,a[5].v);
-       else if(!strcmp(k,"dd"))        gr->SetRanges(*(a[0].d),*(a[1].d));
-       else if(!strcmp(k,"ddd"))       gr->SetRanges(*(a[0].d),*(a[1].d), *(a[2].d));
-       else if(!strcmp(k,"dddd"))      gr->SetRanges(*(a[0].d),*(a[1].d), *(a[2].d),*(a[3].d));
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_adjust(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]==0)     gr->Adjust();
-       else if(!strcmp(k,"s")) gr->Adjust(a[0].s.c_str());
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_insert(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && !strcmp(k,"ds"))        d->Insert(a[1].s.c_str()[0]);
-       else if(d && !strcmp(k,"dsn"))  d->Insert(a[1].s.c_str()[0], mgl_int(a[2].v));
-       else if(d && !strcmp(k,"dsnn")) d->Insert(a[1].s.c_str()[0], mgl_int(a[2].v), mgl_int(a[3].v));
-       else if(c && !strcmp(k,"ds"))   c->Insert(a[1].s.c_str()[0]);
-       else if(c && !strcmp(k,"dsn"))  c->Insert(a[1].s.c_str()[0], mgl_int(a[2].v));
-       else if(c && !strcmp(k,"dsnn")) c->Insert(a[1].s.c_str()[0], mgl_int(a[2].v), mgl_int(a[3].v));
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_delete(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && !strcmp(k,"ds"))        d->Delete(a[1].s.c_str()[0]);
-       else if(d && !strcmp(k,"dsn"))  d->Delete(a[1].s.c_str()[0], mgl_int(a[2].v));
-       else if(d && !strcmp(k,"dsnn")) d->Delete(a[1].s.c_str()[0], mgl_int(a[2].v), mgl_int(a[3].v));
-       else if(c && !strcmp(k,"ds"))   c->Delete(a[1].s.c_str()[0]);
-       else if(c && !strcmp(k,"dsn"))  c->Delete(a[1].s.c_str()[0], mgl_int(a[2].v));
-       else if(c && !strcmp(k,"dsnn")) c->Delete(a[1].s.c_str()[0], mgl_int(a[2].v), mgl_int(a[3].v));
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_roll(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(d && !strcmp(k,"dsn"))       d->Roll(a[1].s.c_str()[0], mgl_int(a[2].v));
-       else if(c && !strcmp(k,"dsn"))  c->Roll(a[1].s.c_str()[0], mgl_int(a[2].v));
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_datagrid(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!strcmp(k,"dddd") && d)      gr->DataGrid(*d, *(a[1].d), *(a[2].d), *(a[3].d),opt);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_triangulate(mglGraph *, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]=='d' && a[0].d->temp)   return 5;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       if(!d)  return 1;
-       if(!strcmp(k,"ddd"))            *d = mglTriangulation(*(a[1].d), *(a[2].d));
-       else if(!strcmp(k,"dddd"))      *d = mglTriangulation(*(a[1].d), *(a[2].d), *(a[3].d));
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_view(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"nn"))             gr->View(a[0].v, a[1].v);
-       else if(!strcmp(k,"nnn"))       gr->View(a[0].v, a[1].v, a[2].v);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_zoom(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"nnnn"))   gr->Zoom(a[0].v, a[1].v, a[2].v, a[3].v);
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_zoomaxis(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"nn"))     gr->ZoomAxis(mglPoint(a[0].v), mglPoint(a[1].v));
-       else if(!strcmp(k,"nnnn"))      gr->ZoomAxis(mglPoint(a[0].v, a[1].v), mglPoint(a[2].v, a[3].v));
-       else if(!strcmp(k,"nnnnnn"))    gr->ZoomAxis(mglPoint(a[0].v, a[1].v, a[2].v), mglPoint(a[3].v, a[4].v, a[5].v));
-       else if(!strcmp(k,"nnnnnnnn"))  gr->ZoomAxis(mglPoint(a[0].v, a[1].v, a[2].v, a[3].v), mglPoint(a[4].v, a[5].v, a[6].v, a[7].v));
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_drawreg(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]==0)     gr->SetDrawReg();
-       else if(!strcmp(k,"nnn"))       gr->SetDrawReg(mgl_int(a[0].v), mgl_int(a[1].v), mgl_int(a[2].v));
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_version(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       char buf[32];   sprintf(buf,"MathGL version is 2.%g",MGL_VER2);
-       if(k[0]==0)     gr->SetWarn(-1,buf);
-       else if(!strcmp(k,"s")) res = mgl_check_version(a[0].s.c_str())?1:0;
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int mgls_ifs2d(mglGraph *, long, mglArg *a, const char *k, const char *)
-{
-       mglData *fx = dynamic_cast<mglData*>(a[0].d);
-       mglData *fy = dynamic_cast<mglData*>(a[1].d);
-       if(!fx) return 1;
-       int res = 0;
-       if (!strcmp(k, "ddn"))  fx->Set(mglIFS2d(*(a[1].d), mgl_int(a[2].v)));
-       else if (!strcmp(k, "dddn") && fy)
-       {
-               mglData f(mglIFS2d(*(a[2].d), mgl_int(a[3].v)));
-               fx->Set(f.SubData(0));  fy->Set(f.SubData(1));
-       }
-       else if (!strcmp(k, "ddnn"))    fx->Set(mglIFS2d(*(a[1].d), mgl_int(a[2].v), mgl_int(a[3].v)));
-       else if (!strcmp(k, "dddnn") && fy)
-       {
-               mglData f(mglIFS2d(*(a[2].d), mgl_int(a[3].v), mgl_int(a[4].v)));
-               fx->Set(f.SubData(0));  fy->Set(f.SubData(1));
-       }
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int mgls_ifs3d(mglGraph *, long, mglArg *a, const char *k, const char *)
-{
-       mglData *f = dynamic_cast<mglData*>(a[0].d);
-       if(!f)  return 1;
-       int res = 0;
-       if (!strcmp(k, "ddn"))  f->Set(mglIFS3d(*(a[1].d), mgl_int(a[2].v)));
-       else if (!strcmp(k, "ddnn"))    f->Set(mglIFS3d(*(a[1].d), mgl_int(a[2].v), mgl_int(a[3].v)));
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-mglCommand mgls_base_cmd[] = {
-       {"addlegend","Add legend entry","addlegend 'txt' 'fmt'", mgls_addlegend,15},
-       {"addto","Add data or number","addto Var Dat|Var num", mgls_addto ,3},
-       {"adjust","Adjust ticks for best view","adjust ['dir']", mgls_adjust ,14},
-       {"alpha","Switch on/off transparency","alpha [val]", mgls_alpha ,2},
-       {"alphadef","Set default transparency","alphadef val", mgls_alphadef ,2},
-       {"ambient","Set ambient light brightness","ambient val", mgls_ambient ,2},
-       {"apde","Solve PDE using advanced method (X-Y only)","apde Res 'ham' IniRe IniIm [dz k0]", mgls_pde_adv ,4},
-       {"arc","Draw angle arc","arc x0 y0 x1 y1 a ['fmt']|x0 y0 z0 x1 y1 a ['fmt']|x0 y0 z0 xr yr zr x1 y1 z1 a ['fmt']", mgls_arc ,13},
-       {"area","Draw area plot for 1D data","area Ydat ['fmt']|Xdat Ydat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_area ,7},
-       {"arrowsize","Set size of arrows","arrowsize val", mgls_arrowsize ,2},
-       {"ask","Define parameter from user input","ask $N 'question'", 0, 6},
-       {"aspect","Set aspect ration","aspect valx valy [valz]", mgls_aspect ,5},
-       {"attachlight","Attach light settings to inplot","attachlight val", mgls_attachlight ,2},
-       {"axial","Draw surfaces of contour lines rotation","axial Zdat ['fmt' num]|Xdat Ydat Zdat ['fmt' num]", mgls_axial ,8},
-       {"axis","Setup or draw axis","axis ['dir' 'fmt']|'fx' 'fy' 'fz' ['fc']|how", mgls_axis ,12},
-       {"axisstl","Set axis and tick style","axisstl 'stl' ['sub']", mgls_axisstl ,14},
-       {"background","Load image for background","background 'fname'", mgls_background ,12},
-       {"ball","Draw point (ball)","ball posx posy ['fmt']|posx posy posz ['fmt']", mgls_ball ,13},
-       {"barh","Draw horizontal bars for 1D data", "barh Ydat ['fmt' above]|Xdat Ydat ['fmt' above]", mgls_barh ,7},
-       {"bars","Draw bars for 1D data","bars Ydat ['fmt' above]|Xdat Ydat ['fmt' above]|Xdat Ydat Zdat ['fmt' above]", mgls_bars ,7},
-       {"barwidth","Set default bars width","barwidth val", mgls_barwidth ,2},
-       {"beam","Draw quasioptical beam","beam Tr G1 G2 Adat r ['sch' flag num] ", mgls_beam ,9},
-       {"belt","Draw belts","belt Zdat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_belt ,8},
-       {"bifurcation","Draw Bifurcation diagram","bifurcation dx Func ['fmt']|dx 'func' ['fmt']", mgls_bifurcation,13},
-       {"box","Draw bounding box","box ['fmt' ticks]", mgls_box ,12},
-       {"boxplot","Draw boxplot for 2D data","boxplot Ydat ['fmt']|Xdat Ydat ['fmt']", mgls_boxplot ,7},
-       {"boxs","Draw boxes","boxs Zdat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_boxs ,8},
-       {"break","Break for-cycle","break", 0, 6},
-       {"call","Execute script in external file","call 'name' [args]", 0, 6},
-       {"candle","Draw candlestick chart","candle candle Vdat1 ['fmt']|Vdat1 Vdat2 ['fmt']|Vdat1 Ydat1 Ydat2 ['fmt']||Vdat1 Vdat2 Ydat1 Ydat2 ['fmt']|Xdat Vdat1 Vdat2 Ydat1 Ydat2 ['fmt']", mgls_candle ,7},
-       {"chart","Draw chart","chart Dat ['fmt']", mgls_chart ,7},
-       {"chdir","Change current directory","chdir 'path'", mgls_chdir ,2},
-       {"circle","Draw circle","circle x y r ['fmt']|x y z r ['fmt']", mgls_circle ,13},
-       {"clean","Remove duplicate rows","clean Dat id", mgls_clean ,3},
-       {"clearlegend","Clear legend antries","clearlegend", mgls_clearlegend ,15},
-       {"clf","Clear picture","clf|'col'|r g b", mgls_clf ,12},
-       {"cloud","Draw cloud","cloud Adat ['fmt']|Xdat Ydat Zdat Adat ['fmt']", mgls_cloud ,9},
-       {"colorbar","Draw colorbar","colorbar ['fmt' pos]|Vdat ['fmt' pos]|'sch' pos x y [w h]|Vdat 'sch' pos x y [w h]", mgls_colorbar ,12},
-       {"column","Get data column filled by formula on column ids","column Res Dat 'eq'", mgls_column ,4},
-       {"columnplot","Set position of plot inside cell of column", "columnplot num ind [d]", mgls_columnplot ,5},
-       {"combine", "Direct multiplication of arrays", "combine Res Adat Bdat", mgls_combine ,4},
-       {"cone","Draw cone","cone x1 y1 z1 x2 y2 z2 r1 [r2 'fmt' edge]", mgls_cone ,13},
-       {"cones","Draw cones for 1D data","cones Ydat ['fmt' above]|Xdat Ydat ['fmt' above]|Xdat Ydat Zdat ['fmt' above]", mgls_cones ,7},
-       {"cont","Draw contour lines","cont Zdat ['fmt' num zpos]|Vdat Zdat ['fmt' zpos]|Xdat Ydat Zdat ['fmt' num zpos]|Vdat Xdat Ydat Zdat ['fmt' zpos]", mgls_cont ,8},
-       {"cont3","Draw contour lines for 3D data","cont3 Adat 'dir' [val 'fmt' num]|Vdat Adat 'dir' [val 'fmt']|Xdat Ydat Zdat Adat 'dir' [val 'fmt' num]|Vdat Xdat Ydat Zdar Adat 'dir' [val 'fmt']", mgls_cont3 ,9},
-       {"contd","Draw solid contours with manual colors","contd Zdat ['fmt' num zpos]|Vdat Zdat ['fmt' zpos]|Xdat Ydat Zdat ['fmt' num zpos]|Vdat Xdat Ydat Zdat ['fmt' zpos]", mgls_contd ,8},
-       {"contf","Draw solid contours","contf Zdat ['fmt' num zpos]|Vdat Zdat ['fmt' zpos]|Xdat Ydat Zdat ['fmt' num zpos]|Vdat Xdat Ydat Zdat ['fmt' zpos]", mgls_contf ,8},
-       {"contf3","Draw solid contour lines for 3D data","contf3 Adat 'dir' [val 'fmt' num]|Vdat Adat 'dir' [val 'fmt']|Xdat Ydat Zdat Adat 'dir' [val 'fmt' num]|Vdat Xdat Ydat Zdar Adat 'dir' [val 'fmt']", mgls_contf3 ,9},
-       {"contfx","Draw solid contour lines at x-slice (or x-plane)","contfx Dat ['fmt' pos num]", mgls_contfx ,0},
-       {"contfy","Draw solid contour lines at y-slice (or y-plane)","contfy Dat ['fmt' pos num]", mgls_contfy ,0},
-       {"contfz","Draw solid contour lines at z-slice (or z-plane)","contfz Dat ['fmt' pos num]", mgls_contfz ,0},
-       {"continue","Skip commands and iterate for-cycle again","continue", 0, 6},
-       {"contv","Draw contour tubes","contv Zdat ['fmt' num zpos]|Vdat Zdat ['fmt' zpos]|Xdat Ydat Zdat ['fmt' num zpos]|Vdat Xdat Ydat Zdat ['fmt' zpos]", mgls_contv ,0},
-       {"contx","Draw contour lines at x-slice (or x-plane)","contx Dat ['fmt' pos num]", mgls_contx ,0},
-       {"conty","Draw contour lines at y-slice (or y-plane)","conty Dat ['fmt' pos num]", mgls_conty ,0},
-       {"contz","Draw contour lines at z-slice (or z-plane)","contz Dat ['fmt' pos num]", mgls_contz ,0},
-       {"copy","Copy data from another variable","copy Dat1 Dat2 ['eq' onaxis]", mgls_copy ,4},
-       {"correl", "Find correlation between data arrays", "correl Res Adat Bdat 'dir'", mgls_correl ,4},
-       {"cosfft","Cos-Fourier transform at some direction","cosfft Dat 'dir'", mgls_cosfft ,16},
-       {"crange","Set color range","crange Dat [add] | c1 c2 [add]", mgls_crange ,14},
-       {"crop","Crop edge of data","crop Dat n1 n2 'dir'", mgls_crop ,16},
-       {"crust","Draw reconstructed surface for arbitrary data points","crust Xdat Ydat Zdat ['fmt']", mgls_crust ,0},
-       {"ctick","Set ticks for colorbar","ctick 'tmpl' | dc ['factor']", mgls_ctick ,14},
-       {"cumsum","Cumulative summation","cumsum Dat 'dir'", mgls_cumsum ,16},
-       {"curve","Draw curve","curve x1 y1 dx1 dy1 x2 y2 dx2 dy2 ['fmt']|x1 y1 z1 dx1 dy1 dz1 x2 y2 z2 dx2 dy2 dz2 ['fmt']", mgls_curve ,13},
-       {"cut","Setup plot points cutting","cut val|x1 y1 z1 x2 y2 z2|'cond'", mgls_cut ,2},
-       {"datagrid","Fill data by triangulated values","datagrid Var Xdat Ydat Zdat", mgls_datagrid ,3},
-       {"datas","Print list of data names in HDF file","datas 'fname'", mgls_datas ,3},
-       {"defchr","Define parameter as character","defchr $N val", 0, 6},
-       {"define","Define constant or parameter","define $N sth | Var val", 0, 6},
-       {"defnum","Define parameter as numerical value","defnum $N val", 0, 6},
-//     {"defpal","Define parameter as palette color","defpal $N val", 0, 6},
-       {"delete","Delete slice of data","delete Dat 'dir' [pos=0 num=1]", mgls_delete ,3},
-       {"dens","Draw density plot","dens Zdat ['fmt' zpos]|Xdat Ydat Zdat ['fmt' zpos]", mgls_dens ,8},
-       {"dens3","Draw density plot at slices of 3D data","dens3 Adat 'dir' [pos 'fmt']|Xdat Ydat Zdat Adat 'dir' [pos 'fmt']", mgls_dens3 ,9},
-       {"densx","Draw density plot at x-slice (or x-plane)","densx Dat ['fmt' pos]", mgls_densx ,0},
-       {"densy","Draw density plot at y-slice (or y-plane)","densy Dat ['fmt' pos]", mgls_densy ,0},
-       {"densz","Draw density plot at z-slice (or z-plane)","densz Dat ['fmt' pos]", mgls_densz ,0},
-       {"dew","Draw dew plot","dew Udat Vdat ['fmt']|Xdat Ydat Udat Vdat ['fmt']", mgls_dew ,11},
-       {"diff","Numerically differentiate data","diff Var 'dir'", mgls_diff ,16},
-       {"diff2","Numerically double differentiate data","diff2 Var 'dir'", mgls_diff2 ,16},
-       {"diffuse","Set diffusive light brightness","diffuse val", mgls_diffuse ,2},
-       {"divto","Divide by data or number","divto Var Dat|Var num", mgls_divto ,3},
-       {"dots","Draw dots for arbitrary data points","dots Xdat Ydat Zdat ['fmt']|Xdat Ydat Zdat Adat ['fmt']|Xdat Ydat Zdat Cdat Adat ['fmt']", mgls_dots ,9},
-       {"drawreg","Set draw region for quality&4","drawreg|nx ny m", mgls_drawreg ,2},
-       {"drop","Draw drop","drop x0 y0 dx dy r ['col' sh asp]|x0 y0 z0 dx dy dz r ['col' sh asp]", mgls_drop ,13},
-       {"echo","Print content of the data","echo Dat", mgls_echo ,3},
-       {"ellipse","Draw ellipse","ellipse x1 y1 x2 y2 r ['fmt']|x1 y1 z1 x2 y2 z2 r ['fmt']", mgls_ellipse ,13},
-       {"else","Execute if condition is false","else", 0, 6},
-       {"elseif","Conditional operator","elseif val|Dat ['cond']", 0, 6},
-       {"endif","Finish if/else block","endif", 0, 6},
-       {"envelop","Find envelop for the data","envelop Dat ['dir']", mgls_envelop ,16},
-       {"errbox","Draw error box","errbox x y ex ey ['fmt']|x y z ex ey ez ['fmt']", mgls_errbox ,13},
-       {"error","Draw error boxes","error Ydat Yerr ['fmt']|Xdat Ydat Yerr ['fmt']|Xdat Ydat Xerr Yerr ['fmt']", mgls_error ,7},
-       {"evaluate","Evaluate (interpolate) values of array Dat at points i=idat,j=jdat,k=kdat","evaluate Res Dat Idat [norm]|Res Dat Idat Jdat [norm]|Res Dat Idat Jdat Kdat [norm]", mgls_evaluate ,4},
-       {"export","Export data to PNG picture","export Dat 'fname' 'sch' [v1 v2]", mgls_export ,3},
-       {"extend","Extend data array","extend Dat dim1 [dim2]", mgls_extend ,3},
-       {"face","Draw face (quadrangle)","face x1 y1 x2 y2 x3 y3 x4 y4 ['fmt']|x1 y1 z1 x2 y2 z2 x3 y3 z3 x4 y4 z4 ['fmt']", mgls_face ,13},
-       {"facenum","Set number of visible faces","facenum val", mgls_facenum ,2},
-       {"facex","Draw face perpendicular to x-axis","facex x0 y0 z0 wy wz ['fmt' d1 d2]", mgls_facex ,13},
-       {"facey","Draw face perpendicular to y-axis","facex x0 y0 z0 wx wz ['fmt' d1 d2]", mgls_facey ,13},
-       {"facez","Draw face perpendicular to z-axis","facex x0 y0 z0 wy wz ['fmt' d1 d2]", mgls_facez ,13},
-       {"fall","Draw waterfalls","fall Zdat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_fall ,8},
-       {"fgets","Print string from file","fgets x y z 'fname' [pos=0 'fmt' size]|x y z 'fname' [pos=0 'fmt' size]", mgls_fgets ,15},
-       {"fill","Fill data linearly in range [v1, v2]","fill Var v1 v2 ['dir'] | Var 'eq' [Vdat Wdat]", mgls_fill ,3},
-       {"fillsample","Fill x-,k-samples for transforms","fillsample Var 'how'", mgls_fillsample ,3},
-       {"fit","Fit data to formula","fit Res A 'eq' 'var' [Ini]|Res X A 'eq' 'var' [Ini]|Res X Y A 'eq' 'var' [Ini]|Res X Y Z A 'eq' 'var' [Ini]", mgls_fit ,4},
-       {"fits","Fit data to formula","fits Res A S 'eq' 'var' [Ini]|Res X A S 'eq' 'var' [Ini]|Res X Y A S 'eq' 'var' [Ini]|Res X Y Z A S 'eq' 'var' [Ini]", mgls_fits ,4},
-       {"flow","Draw flow threads for vector field","flow Udat Vdat ['fmt' num]|Xdat Ydat Udat Vdat ['fmt' num]|Udat Vdat Wdat ['fmt' num]|Xdat Ydat Zdat Udat Vdat ['fmt' num]|\
-       x0 y0 Udat Vdat ['fmt']|x0 y0 Xdat Ydat Udat Vdat ['fmt']|x0 y0 z0 Udat Vdat Wdat ['fmt']|x0 y0 z0 Xdat Ydat Zdat Udat Vdat Wdat ['fmt']", mgls_flow ,11},
-       {"fog","Switch on/off fog","fog val [pos]", mgls_fog ,2},
-       {"font","Setup font","font 'fmt' [size]", mgls_font ,15},
-       {"for","For cycle","for $N v1 v2 [dv] | $N Dat", 0, 6},
-       {"fourier","In-place Fourier transform","fourier ReDat ImDat 'dir'|Cmplx 'dir'", mgls_fourier , 16},
-       {"fplot","Plot curve by formula","fplot 'y(x)' ['fmt']|'x(t)' 'y(t)' 'z(t)' ['fmt']", mgls_fplot ,1},
-       {"fsurf","Plot surface by formula","fsurf 'z(x,y)' ['fmt']|'x(u,v)' 'y(u,v)' 'z(u,v)' ['fmt']", mgls_fsurf ,1},
-       {"func","Start function definition and stop execution of main script","func 'name' [narg]", 0, 6},
-       {"grad","Draw gradient lines for scalar field","grad Phi ['fmt' num]|Xdat Ydat Phi ['fmt' num]|Xdat Ydat Zdat Phi ['fmt' num]", mgls_grad ,8},
-       {"grid","Draw grid","grid ['dir' 'fmt']", mgls_grid ,12},
-       {"grid2","Draw grid for data array(s)","grid Zdat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_grid2 ,8},
-       {"grid3","Draw grid at slices of 3D data","grid3 Adat 'dir' [pos 'fmt']|Xdat Ydat Zdat Adat 'dir' [pos 'fmt']", mgls_grid3 ,9},
-       {"gridplot","Set position of plot inside cell of matrix", "gridplot nx ny ind [d]", mgls_gridplot ,5},
-       {"gspline","Fill data by global spline of Vdat","gspline Dat Xdat Vdat [sl]", mgls_gspline ,3},
-       {"hankel","Hankel transform at some direction","hankel Dat 'dir'", mgls_hankel ,16},
-       {"hist","Create histogram (distribution) of data values","hist Res Dat num v1 v2 [nsub]|Res Dat Wdat num v1 v2 [nsub]", mgls_hist ,4},
-       {"idset","Set column id for data","idset Dat 'ids'", mgls_idset ,3},
-       {"if","Conditional operator","if val|Dat ['cond']", 0, 6},
-       {"ifs2d", "Computes the attractor of an IFS", "ifs2d F A n [skip]|Fx Fy A n [skip]", mgls_ifs2d, 4},
-       {"ifs3d", "Computes the attractor of an IFS for 3d case", "ifs3d F A n [skip]", mgls_ifs3d, 4},
-       {"import","Import data from PNG picture","import Dat 'fname' 'scheme' [v1 v2]", mgls_import ,4},
-       {"info","Print message or information about the data","info Dat [detail]|'message'|const", mgls_info ,3},
-       {"inplot","Set position of plot in picture","x1 x2 y1 y2 [rel]", mgls_inplot ,5},
-       {"insert","Insert slice of data","insert Dat 'dir' [pos=0 num=1]", mgls_insert ,3},
-       {"integrate","Integrate data","integrate Dat 'dir'", mgls_integrate ,16},
-       {"jacobian","Get Jacobian","jacobian Res Xdat Ydat [Zdat]", mgls_jacobian ,4},
-       {"join","Join data arrays","join Dat Add", mgls_join ,3},
-       {"label","Draw label at arbitrary position","label Ydat 'txt' ['fmt'='']|Xdat Ydat 'txt' ['fmt'='']|Xdat Ydat Zdat 'txt' ['fmt'='']", mgls_label ,7},
-       {"lamerey","Draw Lamerey diagram","lamerey x0 Func ['fmt']|x0 'func' ['fmt']", mgls_lamerey ,13},
-       {"legend","Draw legend","legend [pos 'fmt']|x y ['fmt']", mgls_legend ,15},
-       {"legendmarks","Set number of marks in the legend","legendmarks val", mgls_legendmarks ,15},
-       {"light","Setup light","light [val] | val num | num xpos ypos zpos ['fmt' br]", mgls_light ,2},
-       {"line","Draw line","line x1 y1 x2 y2 ['fmt']|x1 y1 z1 x2 y2 z2 ['fmt']", mgls_line ,13},
-       {"list","Creates new variable from list of numbers or data","list Var v1 ...|Var D1 ...", 0, 4},
-       {"load","Load commands from external DLL","load 'fname'", 0, 6},
-       {"loadfont","Load fontfaces","loadfont ['face']", mgls_loadfont ,15},
-       {"logo","Draw bitmap (logo) along axis range","logo 'fname' [smooth]", mgls_logo ,13},
-       {"map","Draw mapping plot","map Udat Vdat ['fmt']|Xdat Ydat Udat Vdat ['fmt']", mgls_map ,10},
-       {"mark","Draw mark plot for 1D data","mark Ydat Rdat ['fmt']|Xdat Ydat Rdat ['fmt']|Xdat Ydat Zdat Rdat ['fmt']", mgls_mark ,7},
-       {"marksize","Set size of markers","marksize val", mgls_marksize ,2},
-       {"mask","Set brush for given mask","mask 'id' 'val'|'id' val|angle", mgls_mask ,2},
-       {"max","Find maximal value over direction","max Res Dat 'dir'", mgls_max ,4},
-       {"mesh","Draw mesh surface","mesh Zdat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_mesh ,8},
-       {"meshnum","Set number of lines in mesh/fall/vect and so on","meshnum val", mgls_meshnum ,2},
-       {"min","Find minimal value over direction","min Res Dat 'dir'", mgls_min ,4},
-       {"mirror","Mirror data at some direction","mirror Dat 'dir'", mgls_mirror ,16},
-       {"modify","Modify data values by formula","modify Dat 'eq' [num] | Dat 'eq' Vdat [Wdat]", mgls_modify ,3},
-       {"momentum","Get momentum along direction","momentum Res Dat 'how' ['dir']", mgls_momentum ,4},
-       {"multiplot","Set position of plot","multiplot m n pos dx dy 'style'", mgls_multiplot ,5},
-       {"multo","Multiply by data or number","multo Var Dat|Var num", mgls_multo ,3},
-       {"new","Create new data","new Dat nx ny nz ['eq']|new Dat nx ny ['eq']|new Dat nx ['eq']", mgls_new ,4},
-       {"next","Start next for-cycle iteration","next", 0, 6},
-       {"norm","Normalize data","norm Dat v1 v2 [sym dim]", mgls_norm ,16},
-       {"normsl","Normalize data slice by slice","normsl Dat v1 v2 ['dir' keep sym] ", mgls_normsl ,16},
-       {"ode","Solve ODE","ode Res 'df' 'var' Ini [dt tmax]", mgls_ode ,4},
-       {"ohlc","Draw Open-High-Low-Close (OHLC) diagram","ohlc Odat Hdat Ldat Cdat ['fmt']|Xdat Odat Hdat Ldat Cdat ['fmt']", mgls_ohlc ,7},
-       {"once","Start/close commands which should executed only once","once val", 0, 6},
-       {"origin","Set axis origin","origin x0 y0 [z0]", mgls_origin ,14},
-       {"origintick","Set tick labels drawing at origin","origintick val", mgls_origintick ,14},
-       {"palette","Set palette for 1D plots","palette 'colors'", mgls_palette ,2},
-       {"pde","Solve PDE","pde Res 'ham' IniRe IniIm [dz k0]", mgls_pde ,4},
-       {"pendelta","Set size of semi-transparent area","pen_delta val", mgls_pendelta ,2},
-       {"perspective","Set perspective","perspective val", mgls_perspective ,2},
-       {"pipe","Draw flow pipes for vector field","pipe Udat Vdat ['fmt' rad num]|Xdat Ydat Udat Vdat ['fmt' rad num]|Udat Vdat Wdat ['fmt' rad num]|Xdat Ydat Zdat Udat Vdat Wdat ['fmt' rad num]", mgls_pipe ,11},
-       {"plot","Draw usual plot for 1D data","plot Ydat ['fmt']|Xdat Ydat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_plot ,7},
-       {"plotid","Set default filename","plotid 'name'", mgls_plotid ,2},
-       {"pmap","Draw Poincare map","pmap Ydat Rdat ['fmt']|Xdat Ydat Rdat ['fmt']|Xdat Ydat Zdat Rdat ['fmt']", mgls_pmap ,7},
-       {"polygon","Draw polygon","polygon x1 y1 x2 y2 num ['fmt']|x1 y1 z1 x2 y2 z2 num ['fmt']", mgls_polygon ,13},
-       {"print","Immediately print the message","info 'message'|Dat [detail]|const", mgls_print ,3},
-       {"pulse","Get pulse properties","pulse Res Dat 'dir'", mgls_pulse ,4},
-       {"put","Put value (numeric or array) to given data element","put Dat val [i j k] | Dat Val [i j k]", mgls_put ,3},
-       {"putsfit","Print fitted formula","putsfit x y ['pre' 'font' size]|x y z ['pre' 'font' size]", mgls_putsfit ,15},
-       {"qo2d","Solve PDE in accompanied coordinates for 2d case","qo2d Res 'ham' IniRe IniIm Ray [r k0 Xout Yout]", mgls_qo2d ,4},
-       {"qo3d","Solve PDE in accompanied coordinates for 3d case","qo3d Res 'ham' IniRe IniIm Ray [r k0 Xout Yout Zout]", mgls_qo3d ,4},
-       {"quadplot","Draw surface of quadrangles","quadplot Idat Xdat Ydat ['fmt']|Idat Xdat Ydat Zdat ['fmt']|Idat Xdat Ydat Zdat Cdat ['fmt'] ", mgls_quadplot ,0},
-       {"quality","Set plot quality","quality [val]", mgls_quality ,2},
-       {"radar","Draw radar chart","radar Rdat ['fmt']", mgls_radar ,7},
-       {"ranges","Set axis ranges","ranges x1 x2 y1 y2 [z1 z2]", mgls_ranges ,14},
-       {"rasterize","Rasterize and save to background","rasterize", mgls_rasterize ,12},
-       {"ray","Solve Hamiltonian ODE (find GO ray or trajectory)","ray Res 'ham' x0 y0 z0 px0 py0 pz0 [dz=0.1 tmax=10]", mgls_ray ,4},
-       {"read","Read data from file","read Dat 'file' [nx ny nz] | ReDat ImDat 'file' [nx ny nz]", mgls_read ,4},
-       {"readall","Read and join data from several files","readall Dat 'templ' [slice]", mgls_readall ,4},
-       {"readhdf","Read data from HDF5 file","readhdf Dat 'file' 'id'", mgls_readhdf ,4},
-       {"readmat","Read data from file with sizes specified in first row","readmat Dat 'file' [dim]", mgls_readmat ,4},
-       {"rearrange","Rearrange data dimensions","rearrange Dat mx [my mz]", mgls_rearrange ,3},
-       {"rect","Draw rectangle","rect x1 y1 x2 y2 ['fmt']|x1 y1 z1 x2 y2 z2 ['fmt']", mgls_rect ,13},
-       {"refill","Fill data by interpolation of Vdat","refill Dat Xdat Vdat [sl] | Dat Xdat Ydat Vdat [sl] | Dat Xdat Ydat Zdat Vdat", mgls_refill ,3},
-       {"region","Draw filled region (ribbon) between 2 curves","region Ydat1 Ydat2 ['fmt']|Xdat Ydat1 Ydat2 ['fmt']||Xdat1 Ydat1 Xdat2 Ydat2 ['fmt']|Xdat1 Ydat1 Zdat1 Xdat2 Ydat2 Zdat2 ['fmt']", mgls_region ,7},
-       {"reset","Reset settings and clear picture","reset", mgls_reset ,12},
-       {"resize","Resize data","resize Res Dat mx [my mz]", mgls_resize ,4},
-       {"return","Return from function","return", 0, 6},
-       {"rhomb","Draw rhombus","rhomb x1 y1 x2 y2 r ['fmt']|x1 y1 z1 x2 y2 z2 r ['fmt']", mgls_rhomb ,13},
-       {"rkstep","Apply Runge-Kutta","rkstep 'Diff1;Diff2;...' 'Var1;Var2;...' [dt]", 0, 6},
-       {"roll","Roll data along direction","roll Dat 'dir' num", mgls_roll ,16},
-       {"roots", "Find roots using data as initial values", "roots Res 'func' Ini ['var']|Res 'func' ini ['var']", mgls_roots ,4},
-       {"rotate","Rotate plot","rotate tetz tetx [tety] | tet x y z", mgls_rotate ,5},
-       {"rotatetext","Set to auto rotate text or not","rotatetext val", mgls_rotatetext ,15},
-       {"save","Save data to file","save Dat 'file'|'str' 'file'|'str' 'file' 'how'", mgls_save ,3},
-       {"savehdf","Save data to HDF5 file","savehdf Dat 'file' 'id'", mgls_savehdf ,3},
-       {"scanfile","Get fromated data from file","scanfile Dat 'fname 'templ'", mgls_scanfile ,4},
-       {"setsize","Set picture size","setsize width height", mgls_setsize ,2},
-       {"sew","Remove jump into the data, like phase jumps","sew Dat ['dir' da]", mgls_sew ,16},
-       {"sinfft","Sin-Fourier transform at some direction","sinfft Dat 'dir'", mgls_sinfft ,16},
-       {"smooth","Smooth data","smooth Dat [kind 'dir']", mgls_smooth ,16},
-       {"solve","Find root Dat_{i,j,k}=val (inverse evaluate)","solve Res Dat val 'dir' [Idat norm]", mgls_solve ,4},
-       {"sort","Sort data by values in column","sort Dat idx [idy]", mgls_sort ,3},
-       {"sphere","Draw sphere","sphere x0 y0 r ['fmt']|x0 y0 z0 r ['fmt']", mgls_sphere ,13},
-       {"squeeze","Squeeze data","squeeze Dat kx [ky kz]", mgls_squeeze ,3},
-       {"stem","Draw stem plot for 1D data","stem Ydat ['fmt']|Xdat Ydat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_stem ,7},
-       {"step","Draw step plot for 1D data","step Ydat ['fmt']|Xdat Ydat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_step ,7},
-       {"stfa","Draw STFA diagram","stfa Udat Vdat dn ['fmt']|Xdat Ydat Udat Vdat dn ['fmt']", mgls_stfa ,10},
-       {"stfad","Do STFA transform","stfad Res Real Imag dn ['dir']", mgls_stfad ,4},
-       {"stickplot","Set position of plot inside cell of stick", "stickplot num ind tet phi", mgls_stickplot ,5},
-       {"stop","Stop execution","stop", 0, 6},
-       {"subdata","Extract sub-array","subdata Res Dat nx [ny nz]", mgls_subdata ,4},
-       {"subplot","Set position of plot","subplot m n pos ['style' dx dy]", mgls_subplot ,5},
-       {"subto","Subtract data or number","subto Var Dat|Var num", mgls_subto ,3},
-       {"sum","Find summation over direction","sum Res Dat 'dir'", mgls_sum ,4},
-       {"surf","Draw solid surface","surf Zdat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_surf ,8},
-       {"surf3","Draw isosurface for 3D data","surf3 Adat ['fmt' num]|Xdat Ydat Zdat Adat ['fmt' num]|Adat val ['fmt']|Xdat Ydat Zdat Adat val ['fmt']", mgls_surf3 ,9},
-       {"surf3a","Draw isosurface for 3D data transpared by other data","surf3a Adat Cdat ['fmt' num]|Xdat Ydat Zdat Adat Cdat ['fmt' num]|Adat Cdat val ['fmt']|Xdat Ydat Zdat Adat Cdat val ['fmt']", mgls_surf3a ,10},
-       {"surf3c","Draw isosurface for 3D data colored by other data","surf3c Adat Cdat ['fmt' num]|Xdat Ydat Zdat Adat Cdat ['fmt' num]|Adat Cdat val ['fmt']|Xdat Ydat Zdat Adat Cdat val ['fmt']", mgls_surf3c ,10},
-       {"surf3ca","Draw isosurface for 3D data colored and transpared by other data","surf3c Adat Cdat Bdat ['fmt' num]|Xdat Ydat Zdat Adat Cdat Bdat ['fmt' num]|Adat Cdat Bdat val ['fmt']|Xdat Ydat Zdat Adat Cdat Bdat val ['fmt']", mgls_surf3ca ,10},
-       {"surfa","Draw solid surface transpared by other data","surfa Zdat Cdat ['fmt']|Xdat Ydat Zdat Cdat ['fmt']", mgls_surfa ,10},
-       {"surfc","Draw solid surface colored by other data","surfc Zdat Cdat ['fmt']|Xdat Ydat Zdat Cdat ['fmt']", mgls_surfc ,10},
-       {"surfca","Draw solid surface colored and transpared by other data","surfca Zdat Cdat Adat ['fmt']|Xdat Ydat Zdat Cdat Adat ['fmt']", mgls_surfca ,10},
-       {"swap","Swap data (usefull after Fourier transform)","swap Dat 'dir'", mgls_swap ,16},
-       {"table","Draw table with data values","table Dat ['txt' 'fmt']|x y Dat ['txt' 'fmt']", mgls_table ,7},
-       {"tape","Draw binormales for 1D data","tape Ydat ['fmt']|Xdat Ydat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_tape ,7},
-       {"tens","Draw tension plot for 1D data","tens Ydat Cdat ['fmt']|Xdat Ydat Cdat ['fmt']|Xdat Ydat Zdat Cdat ['fmt']", mgls_tens ,7},
-       {"ternary","Switch on/off to use ternary axis","ternary val", mgls_ternary ,14},
-       {"text","Draw text at some position or along curve","text x y 'txt' ['fmt' size]|x y z 'txt' ['fmt' size]|x y dx dy 'txt' ['fmt' size]|x y z dx dy dz 'txt' ['fmt' size]|Ydat 'txt' ['font' sise]|Xdat Ydat 'txt' ['font' sise]", mgls_text ,15},
-       {"textmark","Draw TeX mark at point position","textmark Ydat Rdat 'text' ['fmt']|Xdat Ydat Rdat 'text' ['fmt']|Xdat Ydat Zdat Rdat 'text' ['fmt']", mgls_textmark ,7},
-       {"ticklen","Set tick length","ticklen val [stt]", mgls_ticklen ,14},
-       {"tickshift","Set additional tick and axis labels shift","tickshift dx [dy dz dc]", mgls_tickshift ,14},
-       {"ticktime","Set ticks in time format","ticktime 'dir' [dv 'tmpl']", mgls_ticktime ,14},
-       {"tile","Draw horizontal tiles","tile Zdat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_tile ,8},
-       {"tiles","Draw horizontal tiles with variable size","tiles Zdat Rdat ['fmt']|Xdat Ydat Zdat Rdat ['fmt']", mgls_tiles ,10},
-       {"title","Add title for current subplot/inplot","title 'txt' ['fmt' size]", mgls_title ,5},
-       {"tlabel","Draw label for t-axis","tlabel 'txt' [pos]", mgls_tlabel ,12},
-       {"torus","Draw surface of curve rotation","torus Rdat ['fmt']|Zdat Rdat ['fmt']", mgls_torus ,7},
-       {"trace","Get trace of array","trace Res Dat", mgls_trace ,4},
-       {"traj","Draw vectors along a curve","traj Xdat Ydat Udat Vdat ['fmt' len]|Xdat Ydat Zdat Udat Vdat Wdat ['fmt' len]", mgls_traj ,11},
-       {"transform","Do integral transform of data","transform Res 'how' Rdat Idat", mgls_transform ,4},
-       {"transforma","Do integral transform of data","transforma Res 'how' Adat Pdat", mgls_transforma ,4},
-       {"transpose","Transpose data array","transpose Dat ['dir']", mgls_transpose ,16},
-       {"transptype","Set type transparency","transptype val", mgls_transptype ,2},
-       {"triangulate","Find triangles of randomly placed points","triangulate Res Xdat Ydat [er]|Res Xdat Ydat Zdat [er]", mgls_triangulate ,4},
-       {"tricont","Draw contour lines for surface of triangles","tricont Idat Xdat Ydat Cdat ['fmt']|Idat Xdat Ydat Zdat Cdat ['fmt']|Vdat Idat Xdat Ydat Cdat ['fmt']|Vdat Idat Xdat Ydat Zdat Cdat ['fmt']", mgls_tricont ,0},
-       {"tricontv","Draw contour tubes for surface of triangles","tricontv Idat Xdat Ydat Cdat ['fmt']|Idat Xdat Ydat Zdat Cdat ['fmt']|Vdat Idat Xdat Ydat Cdat ['fmt']|Vdat Idat Xdat Ydat Zdat Cdat ['fmt']", mgls_tricontv ,0},
-       {"triplot","Draw surface of triangles","triplot Idat Xdat Ydat ['fmt']|Idat Xdat Ydat Zdat ['fmt']|Idat Xdat Ydat Zdat Cdat ['fmt'] ", mgls_triplot ,0},
-       {"tube","Draw curve by tube","tube Ydat Rdat ['fmt']|Ydat rval ['fmt']|Xdat Ydat Rdat ['fmt']|Xdat Ydat rval ['fmt']|Xdat Ydat Zdat Rdat ['fmt']|Xdat Ydat Zdat rval ['fmt']", mgls_tube ,7},
-       {"tuneticks","Set ticks tuning","tuneticks val [fctr]", mgls_tuneticks ,14},
-       {"var","Create new 1D data and fill it in range","var Dat nx x1 [x2]", mgls_var ,4},
-       {"vect","Draw vector field","vect Udat Vdat ['fmt']|Xdat Ydat Udat Vdat ['fmt']|Udat Vdat Wdat ['fmt']|Xdat Ydat Zdat Udat Vdat Wdat ['fmt']", mgls_vect ,11},
-       {"vect3","Draw vector field at slices of 3D data","vect Udat Vdat Wdat ['fmt' sval]|Xdat Ydat Zdat Udat Vdat Wdat ['fmt' sval]", mgls_vect3 ,11},
-       {"version","Print MathGL version or check if it is valid","version |'ver'", mgls_version, 2},
-       {"view","Change view angles - use 'rotate' for plot rotation","view tetz tetx [tety]", mgls_view ,5},
-       {"wavelet","Wavelet transform at some direction","wavelet Dat 'dir' k", mgls_wavelet ,16},
-       {"write","Write current image to graphical file","write ['fname']", mgls_write ,2},
-       {"xlabel","Draw label for x-axis","xlabel 'txt' [pos]", mgls_xlabel ,12},
-       {"xrange","Set range for x-axis","xrange Dat [add] | x1 x2 [add]", mgls_xrange ,14},
-       {"xtick","Set ticks for x-axis","xtick dx ['factor'] | dx sx ['factor'] | dx sx tx ['factor'] | 'tmpl' | Xdat 'lbl' [add] | v1 'lbl1' ...", mgls_xtick,14},
-       {"ylabel","Draw label for y-axis","ylabel 'txt' [pos]", mgls_ylabel,12},
-       {"yrange","Set range for y-axis","yrange Dat [add] | y1 y2 [add]", mgls_yrange,14},
-       {"ytick","Set ticks for y-axis","ytick dy ['factor'] | dy sy ['factor'] | dy sy ty ['factor'] | 'tmpl' | Ydat 'lbl' [add] | v1 'lbl1' ...", mgls_ytick,14},
-       {"zlabel","Draw label for z-axis","zlabel 'txt' [pos]", mgls_zlabel,12},
-       {"zoom","Zoom plot region","zoom x1 x2 y1 y2", mgls_zoom,5},
-       {"zoomaxis","Zoom axis range","zoomaxis x1 x2|x1 x2 y1 y2|x1 x2 y1 y2 z1 z2|x1 x2 y1 y2 z1 z2 c1 c2", mgls_zoomaxis,14},
-       {"zrange","Set range for z-axis","yrange Dat [add] | z1 z2 [add]", mgls_zrange ,14},
-       {"ztick","Set ticks for z-axis","ztick dz ['factor'] | dz sz ['factor'] | dz sz tz ['factor'] | 'tmpl' | Zdat 'lbl' [add] | v1 'lbl1' ...", mgls_ztick,14},
-{"","","",NULL,0}};
-//-----------------------------------------------------------------------------
index eac9c49e4f83cedbfc3b35d9ddd20a46a1afdd71..1e0dcc9cb30089ce438663bc73ffd3ded7433c8f 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************
  * export.cpp is part of Math Graphic Library
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   it under the terms of the GNU Library General Public License as       *
@@ -72,7 +72,7 @@ int MGL_NO_EXPORT mgl_pnga_save(const char *fname, int w, int h, unsigned char *
        if(fl)  fclose(fp);
        return 0;
 #else
-       mgl_set_global_warn("PNG support was disabled. Please, enable it and rebuild MathGL.");
+       mgl_set_global_warn(_("PNG support was disabled. Please, enable it and rebuild MathGL."));
        return 1;
 #endif
 }
@@ -106,7 +106,7 @@ int MGL_NO_EXPORT mgl_png_save(const char *fname, int w, int h, unsigned char **
        if(fl)  fclose(fp);
        return 0;
 #else
-       mgl_set_global_warn("PNG support was disabled. Please, enable it and rebuild MathGL.");
+       mgl_set_global_warn(_("PNG support was disabled. Please, enable it and rebuild MathGL."));
        return 1;
 #endif
 }
@@ -130,11 +130,9 @@ int MGL_NO_EXPORT mgl_bmp_save(const char *fname, int w, int h, unsigned char **
        fwrite(z,4,1,fp);       fwrite(z,4,1,fp);
        fwrite(z,4,1,fp);       fwrite(z,4,1,fp);
        // image
-       const unsigned char *q;
-       register int i,j;
-       for(i=h-1;i>=0;i--)     for(j=0;j<w;j++)
+       for(long i=h-1;i>=0;i--)        for(long j=0;j<w;j++)
        {
-               q = p[i]+3*j;
+               const unsigned char *q = p[i]+3*j;
                fwrite(q+2,1,1,fp);
                fwrite(q+1,1,1,fp);
                fwrite(q+0,1,1,fp);
@@ -154,11 +152,9 @@ int MGL_NO_EXPORT mgl_tga_save(const char *fname, int w, int h, unsigned char **
        fwrite(&w,2,1,fp);      fwrite(&h,2,1,fp);
        fwrite(head+12,2,1,fp);
        // image
-       register int i,j;
-       const unsigned char *q;
-       for(i=h-1;i>=0;i--)     for(j=0;j<w;j++)
+       for(long i=h-1;i>=0;i--)        for(long j=0;j<w;j++)
        {
-               q = p[i]+4*j;
+               const unsigned char *q = p[i]+4*j;
                fwrite(q+2,1,1,fp);
                fwrite(q+1,1,1,fp);
                fwrite(q+0,1,1,fp);
@@ -193,7 +189,7 @@ int MGL_NO_EXPORT mgl_jpeg_save(const char *fname, int w, int h, unsigned char *
        if(fl)  fclose(fp);
        return 0;
 #else
-       mgl_set_global_warn("JPEG support was disabled. Please, enable it and rebuild MathGL.");
+       mgl_set_global_warn(_("JPEG support was disabled. Please, enable it and rebuild MathGL."));
        return 1;
 #endif
 }
@@ -252,7 +248,7 @@ int MGL_NO_EXPORT mgl_bps_save(const char *fname, int w, int h, unsigned char **
        for(long j=0;j<h;j++)   for(long i=0;i<w;i++)
        {
                if((i+w*j)%40==0 && i+j>0)      mgl_printf(fp, gz, "\n");
-               register long jj=h-1-j;
+               long jj=h-1-j;
                mgl_printf(fp, gz, "%02x%02x%02x",p[jj][3*i],p[jj][3*i+1],p[jj][3*i+2]);
        }
        mgl_printf(fp, gz, "\n\nshowpage\n%%%%EOF\n");
@@ -307,7 +303,7 @@ int MGL_NO_EXPORT mgl_gif_save(const char *fname, int w, int h, unsigned char **
 #endif
        delete []line;  return 0;
 #else
-       mgl_set_global_warn("GIF support was disabled. Please, enable it and rebuild MathGL.");
+       mgl_set_global_warn(_("GIF support was disabled. Please, enable it and rebuild MathGL."));
        return 1;
 #endif
 }
@@ -342,10 +338,9 @@ void mglCanvas::StartGIF(const char *fname, int ms)
        // define colormap
        GifColorType col[256];
        memset(col,0,256*sizeof(GifColorType));
-       register int i,j,k,m;
-       for(i=0;i<6;i++)        for(j=0;j<6;j++)        for(k=0;k<6;k++)
+       for(int i=0;i<6;i++)    for(int j=0;j<6;j++)    for(int k=0;k<6;k++)
        {
-               m = i+6*(j+6*k);                // part 1
+               long m = i+6*(j+6*k);           // part 1
                col[m].Red = 51*i;
                col[m].Green=51*j;
                col[m].Blue =51*k;
@@ -377,7 +372,7 @@ void mglCanvas::StartGIF(const char *fname, int ms)
        EGifPutExtension(gif,0xf9,4,ext2);
 #endif
 #else
-       mgl_set_global_warn("GIF support was disabled. Please, enable it and rebuild MathGL.");
+       mgl_set_global_warn(_("GIF support was disabled. Please, enable it and rebuild MathGL."));
 #endif
 }
 //-----------------------------------------------------------------------------
@@ -390,7 +385,7 @@ void mglCanvas::CloseGIF()
        if(gif) EGifCloseFile(gif);
 #endif
 #else
-       mgl_set_global_warn("GIF support was disabled. Please, enable it and rebuild MathGL.");
+       mgl_set_global_warn(_("GIF support was disabled. Please, enable it and rebuild MathGL."));
 #endif
        gif = 0;
 }
@@ -579,31 +574,31 @@ void MGL_EXPORT mgl_write_frame(HMGL gr, const char *fname,const char *descr)
        {       snprintf(buf,64,"%s%04d.jpg",_Gr_->PlotId.c_str(),_Gr_->GetNumFrame()); buf[63]=0;      fname = buf;    }
        int len=strlen(fname);
        if(!strcmp(fname+len-4,".jpg"))         mgl_write_jpg(gr,fname,descr);
-       if(!strcmp(fname+len-5,".jpeg"))        mgl_write_jpg(gr,fname,descr);
-       if(!strcmp(fname+len-4,".prc"))         mgl_write_prc(gr,fname,descr,1);
-       if(!strcmp(fname+len-4,".pdf"))         mgl_write_prc(gr,fname,descr,1);
-       if(!strcmp(fname+len-4,".png"))         mgl_write_png(gr,fname,descr);
-       if(!strcmp(fname+len-4,".eps"))         mgl_write_eps(gr,fname,descr);
-       if(!strcmp(fname+len-5,".epsz"))        mgl_write_eps(gr,fname,descr);
-       if(!strcmp(fname+len-7,".eps.gz"))      mgl_write_eps(gr,fname,descr);
-       if(!strcmp(fname+len-4,".bps"))         mgl_write_bps(gr,fname,descr);
-       if(!strcmp(fname+len-5,".bpsz"))        mgl_write_bps(gr,fname,descr);
-       if(!strcmp(fname+len-7,".bps.gz"))      mgl_write_bps(gr,fname,descr);
-       if(!strcmp(fname+len-4,".svg"))         mgl_write_svg(gr,fname,descr);
-       if(!strcmp(fname+len-5,".svgz"))        mgl_write_svg(gr,fname,descr);
-       if(!strcmp(fname+len-7,".svg.gz"))      mgl_write_svg(gr,fname,descr);
-       if(!strcmp(fname+len-4,".gif"))         mgl_write_gif(gr,fname,descr);
-       if(!strcmp(fname+len-4,".bmp"))         mgl_write_bmp(gr,fname,descr);
-       if(!strcmp(fname+len-4,".tga"))         mgl_write_tga(gr,fname,descr);
-       if(!strcmp(fname+len-5,".mgld"))        mgl_export_mgld(gr,fname,descr);
-       if(!strcmp(fname+len-5,".json"))        mgl_write_json(gr,fname,descr);
-       if(!strcmp(fname+len-6,".jsonz"))       mgl_write_json(gr,fname,descr);
-       if(!strcmp(fname+len-4,".obj"))         mgl_write_obj(gr,fname,descr,1);
-       if(!strcmp(fname+len-4,".tex"))         mgl_write_tex(gr,fname,descr);
-       if(!strcmp(fname+len-4,".xyz"))         mgl_write_xyz(gr,fname,descr);
-       if(!strcmp(fname+len-4,".stl"))         mgl_write_stl(gr,fname,descr);
-       if(!strcmp(fname+len-4,".off"))         mgl_write_off(gr,fname,descr,0);
-//     if(!strcmp(fname+len-4,".x3d"))         mgl_write_x3d(gr,fname,descr,1);
+       else if(!strcmp(fname+len-5,".jpeg"))   mgl_write_jpg(gr,fname,descr);
+       else if(!strcmp(fname+len-4,".prc"))    mgl_write_prc(gr,fname,descr,1);
+       else if(!strcmp(fname+len-4,".pdf"))    mgl_write_prc(gr,fname,descr,1);
+       else if(!strcmp(fname+len-4,".png"))    mgl_write_png(gr,fname,descr);
+       else if(!strcmp(fname+len-4,".eps"))    mgl_write_eps(gr,fname,descr);
+       else if(!strcmp(fname+len-5,".epsz"))   mgl_write_eps(gr,fname,descr);
+       else if(!strcmp(fname+len-7,".eps.gz")) mgl_write_eps(gr,fname,descr);
+       else if(!strcmp(fname+len-4,".bps"))    mgl_write_bps(gr,fname,descr);
+       else if(!strcmp(fname+len-5,".bpsz"))   mgl_write_bps(gr,fname,descr);
+       else if(!strcmp(fname+len-7,".bps.gz")) mgl_write_bps(gr,fname,descr);
+       else if(!strcmp(fname+len-4,".svg"))    mgl_write_svg(gr,fname,descr);
+       else if(!strcmp(fname+len-5,".svgz"))   mgl_write_svg(gr,fname,descr);
+       else if(!strcmp(fname+len-7,".svg.gz")) mgl_write_svg(gr,fname,descr);
+       else if(!strcmp(fname+len-4,".gif"))    mgl_write_gif(gr,fname,descr);
+       else if(!strcmp(fname+len-4,".bmp"))    mgl_write_bmp(gr,fname,descr);
+       else if(!strcmp(fname+len-4,".tga"))    mgl_write_tga(gr,fname,descr);
+       else if(!strcmp(fname+len-5,".mgld"))   mgl_export_mgld(gr,fname,descr);
+       else if(!strcmp(fname+len-5,".json"))   mgl_write_json(gr,fname,descr);
+       else if(!strcmp(fname+len-6,".jsonz"))  mgl_write_json(gr,fname,descr);
+       else if(!strcmp(fname+len-4,".obj"))    mgl_write_obj(gr,fname,descr,1);
+       else if(!strcmp(fname+len-4,".tex"))    mgl_write_tex(gr,fname,descr);
+       else if(!strcmp(fname+len-4,".xyz"))    mgl_write_xyz(gr,fname,descr);
+       else if(!strcmp(fname+len-4,".stl"))    mgl_write_stl(gr,fname,descr);
+       else if(!strcmp(fname+len-4,".off"))    mgl_write_off(gr,fname,descr,0);
+//     else if(!strcmp(fname+len-4,".x3d"))    mgl_write_x3d(gr,fname,descr,1);
 }
 void MGL_EXPORT mgl_write_frame_(uintptr_t *gr, const char *fname,const char *descr,int l,int n)
 {      char *s=new char[l+1];  memcpy(s,fname,l);      s[l]=0;
@@ -625,7 +620,7 @@ void MGL_EXPORT mgl_show_image(HMGL gr, const char *viewer, int keep)
                if(keep)
                {
                        snprintf(cmd,128,"%s %s &", viewer,fname);      cmd[127]=0;
-                       if(system(cmd)==-1)     printf("Error to call external viewer\n");
+                       if(system(cmd)==-1)     printf(_("Error to call external viewer\n"));
                        Sleep(2000);
                        snprintf(cmd,128,"del %s", fname);
                }
@@ -634,14 +629,14 @@ void MGL_EXPORT mgl_show_image(HMGL gr, const char *viewer, int keep)
                if(keep)
                {
                        snprintf(cmd,128,"%s %s &", viewer,fname);      cmd[127]=0;
-                       if(system(cmd)==-1)     printf("Error to call external viewer\n");
+                       if(system(cmd)==-1)     printf(_("Error to call external viewer\n"));
                        sleep(2);
                        snprintf(cmd,128,"rm %s", fname);
                }
                else    snprintf(cmd,128,"%s %s; rm %s", viewer,fname,fname);
 #endif
                cmd[127] = 0;
-               if(system(cmd)==-1)     printf("Error to call external viewer\n");
+               if(system(cmd)==-1)     printf(_("Error to call external viewer\n"));
                delete []cmd;
 }
 void MGL_EXPORT mgl_show_image_(uintptr_t *gr, const char *viewer, int *keep, int l)
index b8013f4c9373fbf52c70476a4f065cbadf5f400d..318e49c36b661b1f19549bb72137a7c6ea9badc6 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************
  * export_2d.cpp is part of Math Graphic Library
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   it under the terms of the GNU Library General Public License as       *
@@ -22,8 +22,6 @@
 #include "mgl2/font.h"
 #include <time.h>
 #include <algorithm>
-#include <vector>
-#include <string>
 #include <sys/stat.h>
 #undef _GR_
 #define _GR_   ((mglCanvas *)(*gr))
@@ -32,7 +30,6 @@ void mgl_printf(void *fp, bool gz, const char *str, ...);
 //-----------------------------------------------------------------------------
 MGL_NO_EXPORT const char *mgl_get_dash(unsigned short d, mreal w,char dlm)
 {
-       static char b[32];
        static std::string s;
        if(d==0xffff)   return "";
        int f=0, p=d&1, n=p?0:1;
@@ -43,12 +40,11 @@ MGL_NO_EXPORT const char *mgl_get_dash(unsigned short d, mreal w,char dlm)
                if(((d>>j)&1) == p)     f++;
                else
                {
-                       snprintf(b,32," %g%c",f*w,dlm); b[31]=0;        s += b;
+                       s += mgl_str_num(f*w)+dlm;
                        p = (d>>j)&1;   f = 1;  n++;
                }
        }
-       snprintf(b,32,"%g",f*w);        b[31]=0;        s += b;
-       s += (n%2) ? "" : " 0";
+       s += mgl_str_num(f*w) + ((n%2) ? "" : " 0");
        return s.c_str();
 }
 //-----------------------------------------------------------------------------
@@ -128,18 +124,17 @@ std::vector<long> MGL_NO_EXPORT put_line(HMGL gr, long i, mreal wp, uint32_t cp,
 //"np %d %d mt ", "%d %d ll ", "cp dr\n", "} def")
 void MGL_NO_EXPORT put_desc(HMGL gr, void *fp, bool gz, const char *pre, const char *ln1, const char *ln2, const char *ln3, const char *suf)
 {
-       register long i,j,n;
-       wchar_t *g;
-       int *s;
-       for(n=i=0;i<gr->GetPrmNum();i++)        if(gr->GetPrm(i).type==4)       n++;
+       long n=0;
+       for(long i=0;i<gr->GetPrmNum();i++)     if(gr->GetPrm(i).type==4)       n++;
        if(n==0)        return;         // no glyphs
-       g = new wchar_t[n];     s = new int[n];
-       for(n=i=0;i<gr->GetPrmNum();i++)
+       wchar_t *g = new wchar_t[n];
+       int *s = new int[n];    n=0;
+       for(long i=0;i<gr->GetPrmNum();i++)
        {
                const mglPrim q = gr->GetPrm(i);
                if(q.type!=4 || (q.n3&8))       continue;       // not a glyph
                bool is=false;
-               for(j=0;j<n;j++)        if(g[j]==q.n4 && s[j]==(q.n3&7))        is = true;
+               for(long j=0;j<n;j++)   if(g[j]==q.n4 && s[j]==(q.n3&7))        is = true;
                if(is)  continue;               // glyph is described
                // have to describe
                g[n]=q.n4;      s[n]=q.n3&7;    n++;    // add to list of described
@@ -177,6 +172,9 @@ void MGL_EXPORT mgl_write_eps(HMGL gr, const char *fname,const char *descr)
        if(!fp)         {       gr->SetWarn(mglWarnOpen,fname); return; }
        int w = _Gr_->GetWidth(), h = _Gr_->GetHeight();
 
+       int x1=gr->BBoxX1, x2=gr->BBoxX2<0?w:gr->BBoxX2, y1=gr->BBoxY1, y2=gr->BBoxY2<0?h:gr->BBoxY2;
+       if(x1<0 || x1>=x2 || y1<0 || y1>=y2)    {       x1=y1=0;        x2=w;   y2=h;   }
+
        if(gz)
        {
                unsigned len = strlen(fname), pos=0;
@@ -187,12 +185,12 @@ void MGL_EXPORT mgl_write_eps(HMGL gr, const char *fname,const char *descr)
                else    {       buf[len-1]='.'; pos = len;      }
                if(pos) {       buf[pos]=buf[pos+1]='b';        buf[pos+2]=0;   }
                FILE *fb = fopen(buf,"w");
-               fprintf(fb, "%%%%BoundingBox: 0 0 %d %d\n", w, h);
+               fprintf(fb, "%%%%BoundingBox: %d %d %d %d\n", x1, h-y2, x2, h-y1);
                fclose(fb);     delete []buf;
        }
 
-       const std::string loc = setlocale(LC_NUMERIC, NULL);    setlocale(LC_NUMERIC, "C");
-       mgl_printf(fp, gz, "%%!PS-Adobe-3.0 EPSF-3.0\n%%%%BoundingBox: 0 0 %d %d\n", w, h);
+       const std::string loc = setlocale(LC_NUMERIC, "C");
+       mgl_printf(fp, gz, "%%!PS-Adobe-3.0 EPSF-3.0\n%%%%BoundingBox: %d %d %d %d\n", x1, h-y2, x2, h-y1);
        mgl_printf(fp, gz, "%%%%Created by MathGL library\n%%%%Title: %s\n",descr ? descr : fname);
        mgl_printf(fp, gz, "%%%%CreationDate: %s\n",ctime(&now));
        mgl_printf(fp, gz, "/lw {setlinewidth} def\n/rgb {setrgbcolor} def\n");
@@ -209,22 +207,30 @@ void MGL_EXPORT mgl_write_eps(HMGL gr, const char *fname,const char *descr)
        m_s=false,m_a=false,m_o=false,m_T=false,
        m_V=false,m_S=false,m_D=false,m_Y=false,m_l=false,
        m_L=false,m_r=false,m_R=false,m_X=false,m_P=false;
-       register long i;
        // add mark definition if present
-       for(i=0;i<gr->GetPrmNum();i++)
+       for(long i=0;i<gr->GetPrmNum();i++)
        {
                const mglPrim q = gr->GetPrm(i);
-               if(q.type>0)    continue;               if(q.n4=='+')   m_p = true;
-               if(q.n4=='x')   m_x = true;             if(q.n4=='s')   m_s = true;
-               if(q.n4=='d')   m_d = true;             if(q.n4=='v')   m_v = true;
-               if(q.n4=='^')   m_t = true;             if(q.n4=='*')   m_a = true;
+               if(q.type>0)    continue;
+               if(q.n4=='+')   m_p = true;
+               if(q.n4=='x')   m_x = true;
+               if(q.n4=='s')   m_s = true;
+               if(q.n4=='d')   m_d = true;
+               if(q.n4=='v')   m_v = true;
+               if(q.n4=='^')   m_t = true;
+               if(q.n4=='*')   m_a = true;
                if(q.n4=='o' || q.n4=='O' || q.n4=='C') m_o = true;
-               if(q.n4=='S')   m_S = true;             if(q.n4=='D')   m_D = true;
-               if(q.n4=='V')   m_V = true;             if(q.n4=='T')   m_T = true;
-               if(q.n4=='<')   m_l = true;             if(q.n4=='L')   m_L = true;
-               if(q.n4=='>')   m_r = true;             if(q.n4=='R')   m_R = true;
+               if(q.n4=='S')   m_S = true;
+               if(q.n4=='D')   m_D = true;
+               if(q.n4=='V')   m_V = true;
+               if(q.n4=='T')   m_T = true;
+               if(q.n4=='<')   m_l = true;
+               if(q.n4=='L')   m_L = true;
+               if(q.n4=='>')   m_r = true;
+               if(q.n4=='R')   m_R = true;
                if(q.n4=='Y')   m_Y = true;
-               if(q.n4=='P')   m_P = true;             if(q.n4=='X')   m_X = true;
+               if(q.n4=='P')   m_P = true;
+               if(q.n4=='X')   m_X = true;
        }
        if(m_P) {       m_p=true;       m_s=true;       }
        if(m_X) {       m_x=true;       m_s=true;       }
@@ -258,16 +264,17 @@ void MGL_EXPORT mgl_write_eps(HMGL gr, const char *fname,const char *descr)
        for(long i=0;i<w*h;i++) if(memcmp(img,img+4*i,3))       same=false;
        if(!same)
        {
-               mgl_printf(fp, gz, "%d %d 8 [1 0 0 1 0 0] {<", w,h,1+w*h/40);
-               for(long j=h-1;j>=0;j--)        for(long i=0;i<w;i++)
+               mgl_printf(fp, gz, "gsave\t%d %d translate\n",x1,h-y2);
+               mgl_printf(fp, gz, "%d %d 8 [1 0 0 1 0 0] {<", x2-x1,y2-y1);
+               for(long j=y2-1;j>=y1;j--)      for(long i=x1;i<x2;i++)
                {
                        if((i+w*(h-j-1))%40==0 && i+j>0)        mgl_printf(fp, gz, "\n");
                        mgl_printf(fp, gz, "%02x%02x%02x",img[4*(i+w*j)],img[4*(i+w*j)+1],img[4*(i+w*j)+2]);
                }
-               mgl_printf(fp, gz, "\n>} false 3 colorimage\n\n");
+               mgl_printf(fp, gz, "\n>} false 3 colorimage\ngrestore\n\n");
        }
        else if(memcmp(img,white,3))
-               mgl_printf(fp, gz, "np 0 0 mt 0 %d ll %d %d ll %d 0 ll cp %g %g %g rgb fill\n", h, w, h, w, img[0]/255., img[1]/255., img[2]/255.);
+               mgl_printf(fp, gz, "np 0 0 mt 0 %d ll %d %d ll %d 0 ll cp %g %g %g rgb fill\n", y2-y1, x2-x1, y2-y1, x2-x1, img[0]/255., img[1]/255., img[2]/255.);
 
        // write definition for all glyphs
        put_desc(gr,fp,gz,"/%c%c_%04x { np\n", "\t%d %d mt ", "%d %d ll ", "cp\n", "} def\n");
@@ -277,7 +284,7 @@ void MGL_EXPORT mgl_write_eps(HMGL gr, const char *fname,const char *descr)
        mglRGBA cp;
        int st=0;
        char str[256]="";
-       for(i=0;i<gr->GetPrmNum();i++)
+       for(long i=0;i<gr->GetPrmNum();i++)
        {
                const mglPrim &q = gr->GetPrm(i);
                if(q.type<0)    continue;       // q.n1>=0 always
@@ -321,18 +328,20 @@ void MGL_EXPORT mgl_write_eps(HMGL gr, const char *fname,const char *descr)
                                case 'P':       mgl_printf(fp, gz, "np %g %g mt m_P %sdr\n",x0,y0,str); break;
                                case 'X':       mgl_printf(fp, gz, "np %g %g mt m_X %sdr\n",x0,y0,str); break;
                                case 'C':       mgl_printf(fp, gz, "%g %g m_o %g %g m_c %sdr\n",x0,y0,x0,y0,str);       break;
-                               default:        mgl_printf(fp, gz, "%g %g m_c %sfill\n",x0,y0,str);
+                               case '.':       mgl_printf(fp, gz, "%g %g m_c %sfill\n",x0,y0,str);
                        }
                }
                else if(q.type==3)      // quad
                {
                        const mglPnt &p2=gr->GetPnt(q.n2), &p3=gr->GetPnt(q.n3), &p4=gr->GetPnt(q.n4);
-                       if(cp.r[3])     mgl_printf(fp, gz, "np %g %g mt %g %g ll %g %g ll %g %g ll cp %sfill\n", p1.x, p1.y, p2.x, p2.y, p4.x, p4.y, p3.x, p3.y, str);
+                       if(cp.r[3])     // TODO && gr->quad_vis(p1,p2,p3,p4))
+                               mgl_printf(fp, gz, "np %g %g mt %g %g ll %g %g ll %g %g ll cp %sfill\n", p1.x, p1.y, p2.x, p2.y, p4.x, p4.y, p3.x, p3.y, str);
                }
                else if(q.type==2)      // trig
                {
                        const mglPnt &p2=gr->GetPnt(q.n2), &p3=gr->GetPnt(q.n3);
-                       if(cp.r[3])     mgl_printf(fp, gz, "np %g %g mt %g %g ll %g %g ll cp %sfill\n", p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, str);
+                       if(cp.r[3])     // TODO && gr->trig_vis(p1,p2,p3))
+                               mgl_printf(fp, gz, "np %g %g mt %g %g ll %g %g ll cp %sfill\n", p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, str);
                }
                else if(q.type==1)      // line
                {
@@ -342,7 +351,7 @@ void MGL_EXPORT mgl_write_eps(HMGL gr, const char *fname,const char *descr)
                        for(size_t j=0;j<ids.size();j++)
                        {
                                const mglPnt &p = gr->GetPnt(ids[j]);
-                               register float x0 = p.x, y0 = p.y;
+                               float x0 = p.x, y0 = p.y;
                                mgl_printf(fp, gz, j==0?"np %g %g mt ":"%g %g ll ",x0,y0);
                        }
                        const char *sd = mgl_get_dash(q.n3,q.w,' ');
@@ -370,7 +379,7 @@ void MGL_EXPORT mgl_write_eps(HMGL gr, const char *fname,const char *descr)
                        mgl_printf(fp, gz, " grestore\n");
                }
        }
-       for(i=0;i<gr->GetPrmNum();i++)
+       for(long i=0;i<gr->GetPrmNum();i++)
        {
                mglPrim &q = gr->GetPrm(i);
                if(q.type==-1)  q.type = 1;
@@ -393,11 +402,15 @@ void MGL_EXPORT mgl_write_svg(HMGL gr, const char *fname,const char *descr)
 
        bool gz = fname[strlen(fname)-1]=='z';
        long hh = _Gr_->GetHeight(), ww = _Gr_->GetWidth();
-       void *fp;
-       if(!strcmp(fname,"-"))  fp = stdout;            // allow to write in stdout
-       else            fp = gz ? (void*)gzopen(fname,"wt") : (void*)fopen(fname,"wt");
+       void *fp = stdout;              // allow to write in stdout
+       if(strcmp(fname,"-"))   fp = gz ? (void*)gzopen(fname,"wt") : (void*)fopen(fname,"wt");
        if(!fp)         {       gr->SetWarn(mglWarnOpen,fname); return; }
-       const std::string loc = setlocale(LC_NUMERIC, NULL);    setlocale(LC_NUMERIC, "C");
+
+       int x1=gr->BBoxX1, x2=gr->BBoxX2<0?ww:gr->BBoxX2, y1=gr->BBoxY1, y2=gr->BBoxY2<0?hh:gr->BBoxY2;
+       if(x1<0 || x1>=x2 || y1<0 || y1>=y2)    {       x1=y1=0;        x2=ww;  y2=hh;  }
+       ww = x2-x1;     hh = y2-y1;
+
+       const std::string loc = setlocale(LC_NUMERIC, "C");
        mgl_printf(fp, gz, "<?xml version=\"1.0\" standalone=\"no\"?>\n");
        mgl_printf(fp, gz, "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 20000303 Stylable//EN\" \"http://www.w3.org/TR/2000/03/WD-SVG-20000303/DTD/svg-20000303-stylable.dtd\">\n");
        mgl_printf(fp, gz, "<svg width=\"%d\" height=\"%d\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", ww, hh);
@@ -437,11 +450,11 @@ void MGL_EXPORT mgl_write_svg(HMGL gr, const char *fname,const char *descr)
        mgl_printf(fp, gz, "<g fill=\"none\" stroke=\"none\" stroke-width=\"0.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n");
        // write primitives
        mreal wp=-1;
-       register long i;
        int st=0;
        mglRGBA cp;
 
-       for(i=0;i<gr->GetPrmNum();i++)
+       hh += (y2+y1)/2;
+       for(long i=0;i<gr->GetPrmNum();i++)
        {
                const mglPrim &q = gr->GetPrm(i);
                if(q.type<0)    continue;       // q.n1>=0 always
@@ -449,7 +462,7 @@ void MGL_EXPORT mgl_write_svg(HMGL gr, const char *fname,const char *descr)
                const mglPnt p1=gr->GetPnt(q.n1);
                if(q.type==0)
                {
-                       mreal x=p1.x,y=hh-p1.y,s=q.s;
+                       mreal x=p1.x-x1,y=hh-p1.y,s=q.s;
                        if(!strchr("xsSoO",q.n4))       s *= 1.1;
                        wp = 1;
                        if(strchr("SDVTLR",q.n4))
@@ -499,7 +512,7 @@ void MGL_EXPORT mgl_write_svg(HMGL gr, const char *fname,const char *descr)
                        case '*':
                                mgl_printf(fp, gz, "<path d=\"M %g %g L %g %g M %g %g L %g %g M %g %g L %g %g\"/>\n",
                                                        x-s,y,x+s,y,x-0.6*s,y-0.8*s,x+0.6*s,y+0.8*s,x+0.6*s,y-0.8*s,x-0.6*s,y+0.8*s);   break;
-                       default:
+                       case '.':
                                mgl_printf(fp, gz, "<circle style=\"fill:#%02x%02x%02x\" cx=\"%g\" cy=\"%g\" r=\"0.15\"/>\n",
                                                        int(cp.r[0]),int(cp.r[1]),int(cp.r[2]),x,y);    break;
                        }
@@ -519,8 +532,7 @@ void MGL_EXPORT mgl_write_svg(HMGL gr, const char *fname,const char *descr)
                        for(size_t j=0;j<ids.size();j++)
                        {
                                const mglPnt &p = gr->GetPnt(ids[j]);
-                               register float x0 = p.x, y0 = p.y;
-                               mgl_printf(fp, gz, j==0?"><path d=\" M %g %g":" L %g %g",x0,_Gr_->GetHeight()-y0);
+                               mgl_printf(fp, gz, j==0?"><path d=\" M %g %g":" L %g %g",p.x-x1,hh-p.y);
                        }
                        mgl_printf(fp, gz, "\"/> </g>\n");
                }
@@ -528,13 +540,13 @@ void MGL_EXPORT mgl_write_svg(HMGL gr, const char *fname,const char *descr)
                {
                        const mglPnt &p2=gr->GetPnt(q.n2), &p3=gr->GetPnt(q.n3);
                        mgl_printf(fp, gz, "<g fill=\"#%02x%02x%02x\" opacity=\"%g\">\n", int(cp.r[0]),int(cp.r[1]),int(cp.r[2]),cp.r[3]/255.);
-                       mgl_printf(fp, gz, "<path d=\"M %g %g L %g %g L %g %g Z\"/> </g>\n", p1.x, hh-p1.y, p2.x, hh-p2.y, p3.x, hh-p3.y);
+                       mgl_printf(fp, gz, "<path d=\"M %g %g L %g %g L %g %g Z\"/> </g>\n", p1.x-x1, hh-p1.y, p2.x-x1, hh-p2.y, p3.x-x1, hh-p3.y);
                }
                else if(q.type==3 && cp.r[3])
                {
                        const mglPnt &p2=gr->GetPnt(q.n2), &p3=gr->GetPnt(q.n3), &p4=gr->GetPnt(q.n4);
                        mgl_printf(fp, gz, "<g fill=\"#%02x%02x%02x\" opacity=\"%g\">\n", int(cp.r[0]),int(cp.r[1]),int(cp.r[2]),cp.r[3]/255.);
-                       mgl_printf(fp, gz, "<path d=\"M %g %g L %g %g L %g %g L %g %g Z\"/> </g>\n", p1.x, hh-p1.y, p2.x, hh-p2.y, p4.x, hh-p4.y, p3.x, hh-p3.y);
+                       mgl_printf(fp, gz, "<path d=\"M %g %g L %g %g L %g %g L %g %g Z\"/> </g>\n", p1.x-x1, hh-p1.y, p2.x-x1, hh-p2.y, p4.x-x1, hh-p4.y, p3.x-x1, hh-p3.y);
                }
                else if(q.type==4)
                {
@@ -543,7 +555,7 @@ void MGL_EXPORT mgl_write_svg(HMGL gr, const char *fname,const char *descr)
                        mreal ss = q.s/2, xx = p1.u, yy = p1.v, zz = q.p;
                        if(q.n3&8)      // this is "line"
                        {
-                               mgl_printf(fp, gz, "<g transform=\"translate(%g,%g) scale(%.3g,%.3g) rotate(%g)\"", p1.x, hh-p1.y, ss, -ss, -phi);
+                               mgl_printf(fp, gz, "<g transform=\"translate(%g,%g) scale(%.3g,%.3g) rotate(%g)\"", p1.x-x1, hh-p1.y, ss, -ss, -phi);
                                if(q.n3&4)
                                        mgl_printf(fp, gz, " stroke=\"#%02x%02x%02x\">", int(cp.r[0]),int(cp.r[1]),int(cp.r[2]));
                                else
@@ -554,7 +566,7 @@ void MGL_EXPORT mgl_write_svg(HMGL gr, const char *fname,const char *descr)
                        else
                        {
                                ss *= zz;
-                               mgl_printf(fp, gz, "<g transform=\"translate(%g,%g) scale(%.3g,%.3g) rotate(%g)\"", p1.x, hh-p1.y, ss, -ss, -q.w);
+                               mgl_printf(fp, gz, "<g transform=\"translate(%g,%g) scale(%.3g,%.3g) rotate(%g)\"", p1.x-x1, hh-p1.y, ss, -ss, -q.w);
                                if(q.n3&4)
                                        mgl_printf(fp, gz, " stroke=\"#%02x%02x%02x\">", int(cp.r[0]),int(cp.r[1]),int(cp.r[2]));
                                else
@@ -564,7 +576,7 @@ void MGL_EXPORT mgl_write_svg(HMGL gr, const char *fname,const char *descr)
                }
        }
 
-       for(i=0;i<gr->GetPrmNum();i++)
+       for(long i=0;i<gr->GetPrmNum();i++)
        {       mglPrim &q=gr->GetPrm(i);       if(q.type==-1)  q.type = 1;     }
        mgl_printf(fp, gz, "</g></svg>");
        if(strcmp(fname,"-"))   {       if(gz)  gzclose((gzFile)fp);    else    fclose((FILE *)fp);     }
@@ -580,9 +592,9 @@ void MGL_EXPORT mgl_write_tex(HMGL gr, const char *fname,const char *descr)
        if(gr->GetPrmNum()<1)   return;
        _Gr_->clr(MGL_FINISHED);        _Gr_->PreparePrim(1);
 
-       FILE *fp = fopen(fname,"w");    fwide(fp,1);
+       FILE *fp = fopen(fname,"w");
        if(!fp)         {       gr->SetWarn(mglWarnOpen,fname); return; }
-       const std::string loc = setlocale(LC_NUMERIC, NULL);    setlocale(LC_NUMERIC, "C");
+       const std::string loc = setlocale(LC_NUMERIC, "C");     fwide(fp,1);
        fwprintf(fp, L"%% Created by MathGL library\n%% Title: %s\n\n",descr?descr:fname);
        // provide marks
        fwprintf(fp, L"\\providecommand{\\mglp}[4]{\\draw[#3] (#1-#4, #2) -- (#1+#4,#2) (#1,#2-#4) -- (#1,#2+#4);}\n");
@@ -676,7 +688,7 @@ void MGL_EXPORT mgl_write_tex(HMGL gr, const char *fname,const char *descr)
                {
                        //const char *dash[]={"", "8 8","4 4","1 3","7 4 1 4","3 2 1 2"};
                        const char *w[]={"semithick","thick","very thick","ultra thick"};
-                       register int iw=int(q.w-0.5);   if(iw>3)        iw=3;
+                       int iw=int(q.w-0.5);    if(iw>3)        iw=3;
                        if(iw<0)        fwprintf(fp,L"\\draw[%s] ",cname);
                        else            fwprintf(fp,L"\\draw[%s,%s] ",cname,w[iw]);
                        // TODO: add line dashing
@@ -685,7 +697,7 @@ void MGL_EXPORT mgl_write_tex(HMGL gr, const char *fname,const char *descr)
                        for(size_t j=0;j<ids.size();j++)
                        {
                                const mglPnt &p = gr->GetPnt(ids[j]);
-                               register float x0 = p.x, y0 = p.y;
+                               float x0 = p.x, y0 = p.y;
                                fwprintf(fp, j==0?L"(%.4g,%.4g)":L" -- (%.4g,%.4g)",0.01*x0,y0*0.01);
                        }
                        fwprintf(fp, L";\n");
index 9ba30f2e40a2eaa303b27696f484095e6674c085..55a219134d54aaab5fda0fab725cfc2e58572f0c 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * export_3d.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -36,7 +36,7 @@ void mglTexture::GetRGBA(unsigned char *f) const
                mglColor c1 = col[2*i], c2 = col[2*i+1];\r
                for(long j=0;j<256;j++)\r
                {\r
-                       register long i0 = 4*(j+256*i);\r
+                       long i0 = 4*(j+256*i);\r
                        mglColor c = c1 + (c2-c1)*(j/255.);\r
                        f[i0]   = int(255*c.r);\r
                        f[i0+1] = int(255*c.g);\r
@@ -287,13 +287,13 @@ void MGL_EXPORT mgl_write_obj_old(HMGL gr, const char *fname,const char *descr,
        if(gr->GetPrmNum()==0)  return; // nothing to do\r
        long m1=0,m2=0;\r
        for(size_t i=0;i<gr->Grp.size();i++)    // prepare array of indirect indexing\r
-       {       register long m = gr->Grp[i].Id;        if(m<m1) m1=m;  if(m>m2) m2=m;  }\r
+       {       long m = gr->Grp[i].Id; if(m<m1) m1=m;  if(m>m2) m2=m;  }\r
        long *ng = new long[m2-m1+1];\r
        for(size_t i=0;i<gr->Grp.size();i++)    ng[gr->Grp[i].Id-m1] = i;\r
        for(long i=0;i<gr->GetPrmNum();i++)     // collect data for groups\r
        // it is rather expensive (extra 4b per primitive) but need for export to 3D\r
        {\r
-               register long m = gr->GetPrm(i,false).id-m1;\r
+               long m = gr->GetPrm(i,false).id-m1;\r
                if(m>=0 && m<m2-m1+1)   gr->Grp[ng[m]].p.push_back(i);\r
        }\r
        delete []ng;\r
@@ -302,18 +302,18 @@ void MGL_EXPORT mgl_write_obj_old(HMGL gr, const char *fname,const char *descr,
        FILE *fp=fopen(fname,"wt");\r
        if(!fp)         {       gr->SetWarn(mglWarnOpen,fname); return; }\r
        // vertices definition\r
-       const std::string loc = setlocale(LC_NUMERIC, NULL);    setlocale(LC_NUMERIC, "C");\r
+       const std::string loc = setlocale(LC_NUMERIC, "C");\r
        fprintf(fp,"# Created by MathGL library\n# Title: %s\n",(descr && *descr) ? descr : fname);\r
        for(long i=0;i<gr->GetPntNum();i++)\r
        {\r
                const mglPnt &pp = gr->GetPnt(i);\r
                fprintf(fp,"v %g %g %g\n",pp.x,pp.y,pp.z);\r
-               fprintf(fp,"vt %g %g\n",1-pp.ta,pp.c/ntxt);\r
+               fprintf(fp,"vt %g %g\n",1-pp.ta,1-pp.c/ntxt);\r
 //             if(mgl_isnan(pp.u))     fprintf(fp,"vn 0 0 0\n");\r
 //             else fprintf(fp,"vn %g %g %g\n",pp.u,pp.v,pp.w);\r
        }\r
        // primitive definition in groups\r
-       char *tname = new char[len+5];  strcpy(tname,fname);\r
+       char *tname = new char[len+15]; strcpy(tname,fname);\r
        tname[len-4]=0; fprintf(fp,"# Primitives Definitions\nmtllib %s.mtl\nusemtl %s\n",tname,tname);\r
        for(size_t i=0;i<gr->Grp.size();i++)\r
        {\r
@@ -335,10 +335,10 @@ void MGL_EXPORT mgl_write_obj_old(HMGL gr, const char *fname,const char *descr,
        fprintf(fp,"Ka 1.000 1.000 1.000\n");\r
        fprintf(fp,"Kd 1.000 1.000 1.000\n");\r
        fprintf(fp,"Ks 0.000 0.000 0.000\n");\r
-       fprintf(fp,"d 1.0\nillum 2\n");\r
-       if(use_png)     strcat(tname,"_txt.png");\r
+       fprintf(fp,"d 1.0\nTr 0.0\nillum 2\n");\r
+       if(use_png)     strcat(tname,"_texture.png");\r
 //     {       tname[len-4]='.';       tname[len-3]='p';       tname[len-2]='n';       tname[len-1]='g';       }\r
-       else            strcat(tname,"_txt.tga");\r
+       else            strcat(tname,"_texture.tga");\r
 //     {       tname[len-4]='.';       tname[len-3]='t';       tname[len-2]='g';       tname[len-1]='a';       }\r
        fprintf(fp,"map_Ka %s\nmap_Kd %s\nmap_Ks %s\n",tname,tname,tname);\r
        fclose(fp);\r
@@ -363,7 +363,7 @@ void MGL_EXPORT mgl_write_stl(HMGL gr, const char *fname,const char *descr)
        if(gr->GetPrmNum()==0)  return; // nothing to do\r
        FILE *fp = fopen(fname,"wt");\r
        if(!fp)         {       gr->SetWarn(mglWarnOpen,fname); return; }\r
-       const std::string loc = setlocale(LC_NUMERIC, NULL);    setlocale(LC_NUMERIC, "C");\r
+       const std::string loc = setlocale(LC_NUMERIC, "C");\r
        fprintf(fp,"solid %s\n",(descr && *descr)?descr:"mathgl");\r
        mglPnt pp;\r
        for(long i=0;i<gr->GetPrmNum();i++)\r
@@ -416,7 +416,7 @@ void MGL_EXPORT mgl_write_xyz(HMGL gr, const char *fname,const char *descr)
 \r
        FILE *fp=fopen(fname,"wt"), *ff;        // vertices definition\r
        if(!fp)         {       gr->SetWarn(mglWarnOpen,fname); return; }\r
-       const std::string loc = setlocale(LC_NUMERIC, NULL);    setlocale(LC_NUMERIC, "C");\r
+       const std::string loc = setlocale(LC_NUMERIC, "C");\r
        fprintf(fp,"# Created by MathGL library\n# Title: %s\n",(descr && *descr) ? descr : fname);\r
        fprintf(fp,"# List of Vertices, with (x,y,z) coordinates.\n");\r
        for(long i=0;i<gr->GetPntNum();i++)\r
@@ -462,7 +462,7 @@ void MGL_EXPORT mgl_write_off(HMGL gr, const char *fname,const char *descr, int
 \r
        FILE *fp=fopen(fname,"wt");\r
        if(!fp)         {       gr->SetWarn(mglWarnOpen,fname); return; }\r
-       const std::string loc = setlocale(LC_NUMERIC, NULL);    setlocale(LC_NUMERIC, "C");\r
+       const std::string loc = setlocale(LC_NUMERIC, "C");\r
        // vertices definition\r
        if(colored)\r
                fprintf(fp,"COFF\n# Created by MathGL library\n# Title: %s\n",(descr && *descr) ? descr : fname);\r
@@ -485,7 +485,7 @@ void MGL_EXPORT mgl_write_off(HMGL gr, const char *fname,const char *descr, int
                {\r
                        if(q.type==2)\r
                                fprintf(fp,"3 %ld %ld %ld\n",q.n1,q.n2,q.n3);\r
-                       if(q.type==3)\r
+                       else if(q.type==3)\r
                                fprintf(fp,"4 %ld %ld %ld %ld\n",q.n1,q.n2,q.n4,q.n3);\r
                }\r
                else\r
@@ -497,7 +497,7 @@ void MGL_EXPORT mgl_write_off(HMGL gr, const char *fname,const char *descr, int
                                        fprintf(fp,"3 %ld %ld %ld %.2g %.2g %.2g %.2g\n",q.n1,q.n2,q.n3,\r
                                                        (p1.r+p2.r+p3.r)/3, (p1.g+p2.g+p3.g)/3, (p1.b+p2.b+p3.b)/3, (p1.a+p2.a+p3.a)/3);\r
                        }\r
-                       if(q.type==3)\r
+                       else if(q.type==3)\r
                        {\r
                                const mglPnt &p2=gr->GetPnt(q.n2), &p3=gr->GetPnt(q.n3), &p4=gr->GetPnt(q.n4);\r
                                if(p1.a>mgl_min_a || p2.a>mgl_min_a || p3.a>mgl_min_a || p4.a>mgl_min_a)\r
@@ -542,7 +542,7 @@ std::string mglCanvas::GetJSON()
        std::string res, buf;\r
        long ll=0,l=(long)Pnt.size();\r
        long factor = Width>1?10:10000;\r
-       const std::string loc = setlocale(LC_NUMERIC, NULL);    setlocale(LC_NUMERIC, "C");\r
+       const std::string loc = setlocale(LC_NUMERIC, "C");\r
        res = res + mgl_sprintf("{\n\"width\":%d,\t\"height\":%d,\t\"depth\":%d,\t\"plotid\":\"%s\",\t\"npnts\":%ld,\t\"pnts\":[\n",\r
                        factor*Width, factor*Height, factor*Depth, PlotId.c_str(), l);\r
        for(long i=0;i<l;i++)\r
@@ -575,7 +575,7 @@ std::string mglCanvas::GetJSON()
                        n3 = p.n3;      n4 = p.n4;\r
                }\r
                if(p.type==1 && n1>n2)  {       n1=p.n2;        n2=p.n1;        }\r
-               register long ps=p.s==p.s?long(100*factor*p.s):0, pw=p.w==p.w?long(100*p.w):0, pp=p.p==p.p?mgl_int(1e5*p.p):0;\r
+               long ps=p.s==p.s?long(100*factor*p.s):0, pw=p.w==p.w?long(100*p.w):0, pp=p.p==p.p?mgl_int(1e5*p.p):0;\r
                if(cp.r[3]==255 || p.type==0 || p.type==1 || p.type==4 || p.type==6)\r
                        buf = mgl_sprintf("[%d,%ld,%ld,%ld,%ld,%d,%ld,%ld,%ld,0,\"#%02x%02x%02x\"],\n",\r
                                p.type, n1, n2, n3, n4, p.id, ps,pw,pp, int(cp.r[0]),int(cp.r[1]),int(cp.r[2]));\r
@@ -594,7 +594,7 @@ std::string mglCanvas::GetJSON()
        {\r
                const mglPoint &p=xy[i];\r
                const mglPnt &q=Pnt[int(0.5+p.z)];\r
-               register long px=long(100*p.x), py=long(100*p.y);\r
+               long px=long(100*p.x), py=long(100*p.y);\r
                if(q.u==q.u && q.v==q.v && q.w==q.w)\r
                        res = res + mgl_sprintf("[%ld,%ld,%ld,%ld,%ld]%c\n", px, py, long(100*q.u), long(100*q.v), long(100*q.w), i+1<l?',':' ');\r
                else\r
@@ -634,7 +634,7 @@ bool mglCanvas::ExportMGLD(const char *fname, const char *descr)
        if(Pnt.size()<1 || Prm.size()<1)        return true;\r
        FILE *fp=fopen(fname,"wt");\r
        if(!fp) return true;\r
-       const std::string loc = setlocale(LC_NUMERIC, NULL);    setlocale(LC_NUMERIC, "C");\r
+       const std::string loc = setlocale(LC_NUMERIC, "C");\r
        // NOTE: I'll save Ptx. So prim type=6 is useless,and no LaTeX\r
        fprintf(fp,"MGLD %lu %lu %lu %lu %d %d\n# %s\n", (unsigned long)Pnt.size(), (unsigned long)Prm.size(), (unsigned long)Txt.size(), (unsigned long)Glf.size(), Width, Height, (descr && *descr) ? descr : fname);\r
        fprintf(fp,"# Vertexes: x y z c t ta u v w r g b a\n");\r
@@ -697,7 +697,7 @@ bool mglCanvas::ImportMGLD(const char *fname, bool add)
        if(w<=0 || h<=0)        {       w=Width;        h=Height;       }\r
        d = long(sqrt(double(w*h)));\r
        if(n==0 || m==0 || l==0)        {       delete []buf;   fclose(fp);     return true;    }\r
-       const std::string loc = setlocale(LC_NUMERIC, NULL);    setlocale(LC_NUMERIC, "C");\r
+       const std::string loc = setlocale(LC_NUMERIC, "C");\r
        if(!add)        {       Clf();  Txt.clear();    }\r
        else    {       ClfZB();        npnt=Pnt.size();        nglf=Glf.size();        }\r
        LightScale(&B);\r
@@ -781,7 +781,7 @@ void MGL_EXPORT mgl_import_mgld_(uintptr_t *gr, const char *fname, int *add, int
 /*void MGL_EXPORT mgl_xgl_prim(const mglPrim &q, const mglPnt &p, FILE *fp, mreal size)\r
 {\r
        char type = q.n4;       mreal ss=size*0.35;\r
-       register long i=q.n1,j;\r
+       long i=q.n1;\r
        switch(q.type)\r
        {\r
        case 0:\r
@@ -950,8 +950,7 @@ void mglCanvas::WriteXGL(const char *fname,const char *descr)
        fprintf(fp,"<WORLD>\n<NAME>%s</NAME>\n", (descr && *descr)?descr:fname);\r
        fprintf(fp,"<BACKGROUND><BACKCOLOR>%g, %g, %g</BACKCOLOR></BACKGROUND>\n", BDef[0]/255., BDef[1]/255., BDef[2]/255.);\r
        fprintf(fp,"<LIGHTING>\n<AMBIENT>%g, %g, %g</AMBIENT>\n",AmbBr, AmbBr, AmbBr);\r
-       register size_t i,j;\r
-       if(get(MGL_ENABLE_LIGHT))       for(i=0;i<10;i++)\r
+       if(get(MGL_ENABLE_LIGHT))       for(size_t i=0;i<10;i++)\r
                if(light[i].n && mgl_isnan(light[i].r.x))\r
                {\r
                        fprintf(fp, "<DIRECTIONALLIGHT>\n<DIRECTION>%g, %g, %g</DIRECTION>\n", light[i].d.x, light[i].d.y, light[i].d.z);\r
@@ -962,11 +961,11 @@ void mglCanvas::WriteXGL(const char *fname,const char *descr)
        // TODO: add textures\r
 \r
        long m1=0,m2=0,m;\r
-       for(i=0;i<Grp.size();i++)       // prepare array of indirect indexing\r
+       for(size_t i=0;i<Grp.size();i++)        // prepare array of indirect indexing\r
        {       m = Grp[i].Id;  if(m<m1) m1=m;  if(m>m2) m2=m;  }\r
        long *ng = new long[m2-m1+1];\r
-       for(i=0;i<Grp.size();i++)       ng[gr->Grp[i].Id-m1] = i;\r
-       for(i=0;i<GetPrmNum();i++)      // collect data for groups\r
+       for(size_t i=0;i<Grp.size();i++)        ng[gr->Grp[i].Id-m1] = i;\r
+       for(size_t i=0;i<GetPrmNum();i++)       // collect data for groups\r
        // it is rather expensive (extra 4b per primitive) but need for export to 3D\r
        {\r
                m = GetPrm(i,false).id-m1;\r
@@ -977,25 +976,25 @@ void mglCanvas::WriteXGL(const char *fname,const char *descr)
        std::vector<long> p;\r
        mglPrim q;\r
        char *pg=new char[GetPntNum()];\r
-       for(i=0;i<Grp.size();i++)       // first write objects\r
+       for(size_t i=0;i<Grp.size();i++)        // first write objects\r
        {\r
                p = Grp[i].p;   memset(pg,0,GetPntNum());\r
                fprintf(fp,"<OBJECT>\n<NAME>%s</NAME>\n<MESH>\n",Grp[i].Lbl.c_str());\r
-               for(j=0;j<p.size();j++)         // collect Pnt for this object\r
+               for(size_t j=0;j<p.size();j++)          // collect Pnt for this object\r
                {\r
                        const mglPrim q=GetPrm(p[j],false);     pg[q.n1]=1;\r
                        if(q.type==3)   {       pg[q.n2]=1;     pg[q.n3]=1;     pg[q.n4]=1;     }\r
                        else if(q.type==1)      pg[q.n2]=1;\r
                        else if(q.type==2)      {       pg[q.n2]=1;     pg[q.n3]=1;     }\r
                }\r
-               for(j=0;j<GetPntNum();j++)      if(pg[j])       // write Pnt for this object\r
+               for(size_t j=0;j<GetPntNum();j++)       if(pg[j])       // write Pnt for this object\r
                {\r
                        const mglPnt s=Pnt[j];\r
                        fprintf(fp,"<P ID=\"%u\">%g, %g, %g</P>\n",j, s.x, s.y, s.z);\r
                        fprintf(fp,"<N ID=\"%u\">%g, %g, %g</N>\n",j, s.x, s.y, s.z);\r
                }\r
                // TODO: add line styles\r
-               for(j=0;j<p.size();j++) // now write primitives itself\r
+               for(size_t j=0;j<p.size();j++)  // now write primitives itself\r
                {\r
                        const mglPrim q=GetPrm(p[j],false);\r
                        mgl_xgl_prim(q, GetPnt(q.n1), fp, q.s*FontFactor());\r
@@ -1024,17 +1023,26 @@ void MGL_EXPORT mgl_x3d_mdef(HMGL gr, void *fp, bool gz)
        for(long i=0;i<gr->GetPrmNum();i++)\r
        {\r
                const mglPrim q = gr->GetPrm(i,false);\r
-               if(q.type>0)    continue;               if(q.n4=='+')   m_p = true;\r
-               if(q.n4=='x')   m_x = true;             if(q.n4=='s')   m_s = true;\r
-               if(q.n4=='d')   m_d = true;             if(q.n4=='v')   m_v = true;\r
-               if(q.n4=='^')   m_t = true;             if(q.n4=='*')   m_a = true;\r
+               if(q.type>0)    continue;\r
+               if(q.n4=='+')   m_p = true;\r
+               if(q.n4=='x')   m_x = true;\r
+               if(q.n4=='s')   m_s = true;\r
+               if(q.n4=='d')   m_d = true;\r
+               if(q.n4=='v')   m_v = true;\r
+               if(q.n4=='^')   m_t = true;\r
+               if(q.n4=='*')   m_a = true;\r
                if(q.n4=='o' || q.n4=='O' || q.n4=='C') m_o = true;\r
-               if(q.n4=='S')   m_S = true;             if(q.n4=='D')   m_D = true;\r
-               if(q.n4=='V')   m_V = true;             if(q.n4=='T')   m_T = true;\r
-               if(q.n4=='<')   m_l = true;             if(q.n4=='L')   m_L = true;\r
-               if(q.n4=='>')   m_r = true;             if(q.n4=='R')   m_R = true;\r
+               if(q.n4=='S')   m_S = true;\r
+               if(q.n4=='D')   m_D = true;\r
+               if(q.n4=='V')   m_V = true;\r
+               if(q.n4=='T')   m_T = true;\r
+               if(q.n4=='<')   m_l = true;\r
+               if(q.n4=='L')   m_L = true;\r
+               if(q.n4=='>')   m_r = true;\r
+               if(q.n4=='R')   m_R = true;\r
                if(q.n4=='Y')   m_Y = true;\r
-               if(q.n4=='P')   m_P = true;             if(q.n4=='X')   m_X = true;\r
+               if(q.n4=='P')   m_P = true;\r
+               if(q.n4=='X')   m_X = true;\r
        }\r
        if(m_P) {       m_p=true;       m_s=true;       }\r
        if(m_X) {       m_x=true;       m_s=true;       }\r
@@ -1158,7 +1166,7 @@ void MGL_EXPORT mgl_write_x3d(HMGL gr, const char *fname,const char *descr)
        bool gz = fname[strlen(fname)-1]=='z';\r
        void *fp = gz ? (void*)gzopen(fname,"wt") : (void*)fopen(fname,"wt");\r
        if(!fp)         {       gr->SetWarn(mglWarnOpen,fname); return; }\r
-       const std::string loc = setlocale(LC_NUMERIC, NULL);    setlocale(LC_NUMERIC, "C");\r
+       const std::string loc = setlocale(LC_NUMERIC, "C");\r
        mgl_printf(fp, gz, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");\r
        mgl_printf(fp, gz, "<!DOCTYPE X3D PUBLIC \"ISO//Web3D//DTD X3D 3.0//EN\" \"http://www.web3d.org/specifications/x3d-3.0.dtd\">\n");\r
        mgl_printf(fp, gz, "<X3D profile='Immersive'>\n<head>\n<meta name='filename' content='%s'/>\n",fname);\r
index f100f573f30e81fc05055513fc6511282dc675e9..6fe02b1a165c6a196f1f085ac99f4097cf091350 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************
  * fft.cpp is part of Math Graphic Library
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   it under the terms of the GNU Library General Public License as       *
@@ -36,12 +36,11 @@ void MGL_EXPORT mglStartThreadT(void *(*func)(void *), long n, void *a, double *
        {
                pthread_t *tmp=new pthread_t[mglNumThr];
                mglThreadT *par=new mglThreadT[mglNumThr];
-               register long i;
-               for(i=0;i<mglNumThr;i++)        // put parameters into the structure
+               for(long i=0;i<mglNumThr;i++)   // put parameters into the structure
                {       par[i].n=n;     par[i].a=a;     par[i].v=v;     par[i].w=w;     par[i].b=b;
                        par[i].p=p;     par[i].re=re;   par[i].im=im;   par[i].id=i;    }
-               for(i=0;i<mglNumThr;i++)        pthread_create(tmp+i, 0, func, par+i);
-               for(i=0;i<mglNumThr;i++)        pthread_join(tmp[i], 0);
+               for(long i=0;i<mglNumThr;i++)   pthread_create(tmp+i, 0, func, par+i);
+               for(long i=0;i<mglNumThr;i++)   pthread_join(tmp[i], 0);
                delete []tmp;   delete []par;
        }
        else
@@ -130,18 +129,18 @@ void MGL_EXPORT mgl_fft(double *x, long s, long n, const void *wt, void *ws, int
        memset(d,0,2*n*sizeof(double));
        if(inv) for(long i=0;i<n;i++)   for(long j=0;j<n;j++)
        {
-               register long ii = 2*(i+n*j), jj = 2*j*s;
+               long ii = 2*(i+n*j), jj = 2*j*s;
                d[2*i]  += x[jj]*c[ii]+x[jj+1]*c[ii+1];
                d[2*i+1]+= x[jj+1]*c[ii]-x[jj]*c[ii+1];
        }
        else    for(long i=0;i<n;i++)   for(long j=0;j<n;j++)
        {
-               register long ii = 2*(i+n*j), jj = 2*j*s;
+               long ii = 2*(i+n*j), jj = 2*j*s;
                d[2*i]  += x[jj]*c[ii]-x[jj+1]*c[ii+1];
                d[2*i+1]+= x[jj+1]*c[ii]+x[jj]*c[ii+1];
        }
        for(long j=0;j<n;j++)
-       {       register long jj = 2*j*s;       x[jj] = d[2*j]*f;       x[jj+1] = d[2*j+1]*f;   }
+       {       long jj = 2*j*s;        x[jj] = d[2*j]*f;       x[jj+1] = d[2*j+1]*f;   }
 #endif
 }
 //-----------------------------------------------------------------------------
@@ -215,6 +214,7 @@ void MGL_EXPORT mgl_datac_fft(HADT d, const char *dir)
                mglStartThreadT(mgl_fftx,ny*nz,0,a,wt,0,par);
                if(mgl_fft_data.wnx==0)
                {       clear = false;  mgl_fft_data.wtx = wt;  mgl_fft_data.wnx=nx;    }
+               if(clear)       {       mgl_fft_free(wt,0,0);   clear = false;  }
        }
        if(strchr(dir,'y') && ny>1)
        {
@@ -223,6 +223,7 @@ void MGL_EXPORT mgl_datac_fft(HADT d, const char *dir)
                mglStartThreadT(mgl_ffty,nx*nz,0,a,wt,0,par);
                if(mgl_fft_data.wny==0)
                {       clear = false;  mgl_fft_data.wty = wt;  mgl_fft_data.wny=ny;    }
+               if(clear)       {       mgl_fft_free(wt,0,0);   clear = false;  }
        }
        if(strchr(dir,'z') && nz>1)
        {
@@ -231,8 +232,8 @@ void MGL_EXPORT mgl_datac_fft(HADT d, const char *dir)
                mglStartThreadT(mgl_fftz,nx*ny,0,a,wt,0,par);
                if(mgl_fft_data.wnz==0)
                {       clear = false;  mgl_fft_data.wtz = wt;  mgl_fft_data.wnz=nz;    }
+               if(clear)       {       mgl_fft_free(wt,0,0);   clear = false;  }
        }
-       if(clear)       mgl_fft_free(wt,0,0);
 #if !MGL_USE_DOUBLE
 #pragma omp parallel for
        for(long i=0;i<nx*ny*nz;i++)    d->a[i] = dual(a[2*i], a[2*i+1]);
@@ -244,7 +245,7 @@ void MGL_EXPORT mgl_data_fourier(HMDT re, HMDT im, const char *dir)
 {
        if(!dir || *dir==0)     return;
        long nx = re->nx, ny = re->ny, nz = re->nz;
-       if(nx*ny*nz != im->nx*im->ny*im->nz || !dir || dir[0]==0)       return;
+       if(nx*ny*nz != im->nx*im->ny*im->nz || dir[0]==0)       return;
        bool clear=false;
        void *wt=0;
        long par[4]={nx,ny,nz,strchr(dir,'i')!=0};
@@ -259,6 +260,7 @@ void MGL_EXPORT mgl_data_fourier(HMDT re, HMDT im, const char *dir)
                mglStartThreadT(mgl_fftx,ny*nz,0,a,wt,0,par);
                if(mgl_fft_data.wnx==0)
                {       mgl_fft_data.wtx = wt;  clear = false;  mgl_fft_data.wnx=nx;    }
+               if(clear)       {       mgl_fft_free(wt,0,0);   clear = false;  }
        }
        if(strchr(dir,'y') && ny>1)
        {
@@ -267,6 +269,7 @@ void MGL_EXPORT mgl_data_fourier(HMDT re, HMDT im, const char *dir)
                mglStartThreadT(mgl_ffty,nx*nz,0,a,wt,0,par);
                if(mgl_fft_data.wny==0)
                {       mgl_fft_data.wty = wt;  clear = false;  mgl_fft_data.wny=ny;    }
+               if(clear)       {       mgl_fft_free(wt,0,0);   clear = false;  }
        }
        if(strchr(dir,'z') && nz>1)
        {
@@ -275,8 +278,8 @@ void MGL_EXPORT mgl_data_fourier(HMDT re, HMDT im, const char *dir)
                mglStartThreadT(mgl_fftz,nx*ny,0,a,wt,0,par);
                if(mgl_fft_data.wnz==0)
                {       mgl_fft_data.wtz = wt;  clear = false;  mgl_fft_data.wnz=nz;    }
+               if(clear)       {       mgl_fft_free(wt,0,0);   clear = false;  }
        }
-       if(clear)       {       mgl_fft_free(wt,0,0);   }
 #pragma omp parallel for
        for(long i=0;i<nx*ny*nz;i++)
        {       re->a[i] = a[2*i];      im->a[i] = a[2*i+1];    }
@@ -367,6 +370,7 @@ void MGL_EXPORT mgl_data_envelop(HMDT d, char dir)
                mglStartThreadT(mgl_envx,ny*nz,d->a,0,wt,0,par);
                if(mgl_fft_data.wnx==0)
                {       mgl_fft_data.wtx = wt;  clear = false;  mgl_fft_data.wnx=nx;    }
+               if(clear)       {       mgl_fft_free(wt,0,0);   clear = false;  }
        }
        if(dir=='y' && ny>1)
        {
@@ -375,6 +379,7 @@ void MGL_EXPORT mgl_data_envelop(HMDT d, char dir)
                mglStartThreadT(mgl_envy,nx*nz,d->a,0,wt,0,par);
                if(mgl_fft_data.wny==0)
                {       mgl_fft_data.wty = wt;  clear = false;  mgl_fft_data.wny=ny;    }
+               if(clear)       {       mgl_fft_free(wt,0,0);   clear = false;  }
        }
        if(dir=='z' && nz>1)
        {
@@ -383,8 +388,20 @@ void MGL_EXPORT mgl_data_envelop(HMDT d, char dir)
                mglStartThreadT(mgl_envz,nx*ny,d->a,0,wt,0,par);
                if(mgl_fft_data.wnz==0)
                {       mgl_fft_data.wtz = wt;  clear = false;  mgl_fft_data.wnz=nz;    }
+               if(clear)       {       mgl_fft_free(wt,0,0);   clear = false;  }
        }
-       if(clear)       mgl_fft_free(wt,0,0);
+}
+//-----------------------------------------------------------------------------
+void MGL_EXPORT mgl_datac_envelop(HADT c, char dir)
+{
+       mglData re(c->nx, c->ny, c->nz), im(c->nx, c->ny, c->nz);
+       long n = c->GetNN();
+#pragma omp parallel for
+       for(long i=0;i<n;i++)   {       re.a[i]=real(c->a[i]);  im.a[i]=imag(c->a[i]);  }
+       mgl_data_envelop(&re, dir);
+       mgl_data_envelop(&im, dir);
+#pragma omp parallel for
+       for(long i=0;i<n;i++)   c->a[i] = dual(re.a[i], im.a[i]);
 }
 //-----------------------------------------------------------------------------
 MGL_NO_EXPORT void* mgl_stfa1(void *par)
@@ -402,7 +419,7 @@ MGL_NO_EXPORT void* mgl_stfa1(void *par)
 #pragma omp for nowait
                for(long ii=t->id;ii<t->n;ii+=mglNumThr)
                {
-                       register long i = ii%mx, j = ii/mx, i0;
+                       long i = ii%mx, j = ii/mx, i0;
                        for(long k=0;k<2*dn;k++)
                        {
                                i0 = k-dd+j*dn;         ff = 1;
@@ -440,7 +457,7 @@ MGL_NO_EXPORT void* mgl_stfa2(void *par)
 #pragma omp for nowait
                for(long ii=t->id;ii<t->n;ii+=mglNumThr)
                {
-                       register long i = ii%my, j = ii/my, i0;
+                       long i = ii%my, j = ii/my, i0;
                        for(long k=0;k<2*dn;k++)
                        {
                                i0 = k-dd+i*dn;         ff = 1;
@@ -504,7 +521,7 @@ MGL_NO_EXPORT void* mgl_sinx(void *par)
 #pragma omp for nowait
                for(long i=t->id;i<t->n;i+=mglNumThr)
                {
-                       register long k = i*nx; memset(b,0,2*nx*sizeof(double));
+                       long k = i*nx;  memset(b,0,2*nx*sizeof(double));
                        for(long j=1;j<nx;j++)  b[2*j]=sin(M_PI*j/nx)*(a[j+k]+a[nx-j+k])+(a[j+k]-a[nx-j+k])*0.5;
                        mgl_fft(b,1,nx,t->v,w,false);
                        a[k]=0; a[k+1]=b[0]*f/2;        // fill sinfft
@@ -533,7 +550,7 @@ MGL_NO_EXPORT void* mgl_siny(void *par)
 #pragma omp for nowait
                for(long ii=t->id;ii<t->n;ii+=mglNumThr)
                {
-                       register long i = ii%nx, k = ii/nx;     memset(b,0,2*ny*sizeof(double));
+                       long i = ii%nx, k = ii/nx;      memset(b,0,2*ny*sizeof(double));
                        for(long j=1;j<ny;j++)  b[2*j]=sin(M_PI*j/ny)*(a[i+nx*(ny*k+j)]+a[i+nx*(ny*k+ny-j)])+(a[i+nx*(ny*k+j)]-a[i+nx*(ny*k+ny-j)])*0.5;
                        mgl_fft(b,1,ny,t->v,w,false);
                        a[i+nx*ny*k]=0; a[i+nx*(ny*k+1)]=b[0]*f/2;      // fill sinfft
@@ -590,6 +607,7 @@ void MGL_EXPORT mgl_data_sinfft(HMDT d, const char *dir)    // use DST-1
                mglStartThreadT(mgl_sinx,ny*nz,d->a,0,wt,0,par);
                if(mgl_fft_data.wnx==0)
                {       mgl_fft_data.wtx = wt;  clear = false;  mgl_fft_data.wnx=nx;    }
+               if(clear)       {       mgl_fft_free(wt,0,0);   clear = false;  }
        }
        if(strchr(dir,'y') && ny>1)
        {
@@ -598,6 +616,7 @@ void MGL_EXPORT mgl_data_sinfft(HMDT d, const char *dir)    // use DST-1
                mglStartThreadT(mgl_siny,nx*nz,d->a,0,wt,0,par);
                if(mgl_fft_data.wny==0)
                {       mgl_fft_data.wty = wt;  clear = false;  mgl_fft_data.wny=ny;    }
+               if(clear)       {       mgl_fft_free(wt,0,0);   clear = false;  }
        }
        if(strchr(dir,'z') && nz>1)
        {
@@ -606,8 +625,21 @@ void MGL_EXPORT mgl_data_sinfft(HMDT d, const char *dir)   // use DST-1
                mglStartThreadT(mgl_sinz,nx*ny,d->a,0,wt,0,par);
                if(mgl_fft_data.wnz==0)
                {       mgl_fft_data.wtz = wt;  clear = false;  mgl_fft_data.wnz=nz;    }
+               if(clear)       {       mgl_fft_free(wt,0,0);   clear = false;  }
        }
-       if(clear)       mgl_fft_free(wt,0,0);
+}
+//-----------------------------------------------------------------------------
+void MGL_EXPORT mgl_datac_sinfft(HADT c, const char *dir)
+{
+       if(!dir || *dir==0)     return;
+       mglData re(c->nx, c->ny, c->nz), im(c->nx, c->ny, c->nz);
+       long n = c->GetNN();
+#pragma omp parallel for
+       for(long i=0;i<n;i++)   {       re.a[i]=real(c->a[i]);  im.a[i]=imag(c->a[i]);  }
+       mgl_data_sinfft(&re, dir);
+       mgl_data_sinfft(&im, dir);
+#pragma omp parallel for
+       for(long i=0;i<n;i++)   c->a[i] = dual(re.a[i], im.a[i]);
 }
 //-----------------------------------------------------------------------------
 MGL_NO_EXPORT void* mgl_cosx(void *par)
@@ -624,7 +656,7 @@ MGL_NO_EXPORT void* mgl_cosx(void *par)
 #pragma omp for nowait
                for(long i=t->id;i<t->n;i+=mglNumThr)
                {
-                       register long k = i*nx; memset(b,0,2*nx*sizeof(double));
+                       long k = i*nx;  memset(b,0,2*nx*sizeof(double));
                        for(long j=0;j<nn;j++)  b[2*j]=(a[j+k]+a[nn-j+k])*0.5-sin(M_PI*j/nn)*(a[j+k]-a[nn-j+k]);
                        mgl_fft(b,1,nn,t->v,w,false);
                        double f1=0.5*(a[k]-a[nn+k]), s=-1;
@@ -661,7 +693,7 @@ MGL_NO_EXPORT void* mgl_cosy(void *par)
 #pragma omp for nowait
                for(long ii=t->id;ii<t->n;ii+=mglNumThr)
                {
-                       register long i = ii%nx, k = ii/nx;     memset(b,0,2*ny*sizeof(double));
+                       long i = ii%nx, k = ii/nx;      memset(b,0,2*ny*sizeof(double));
                        for(long j=0;j<nn;j++)  b[2*j]=(a[i+nx*(ny*k+j)]+a[i+nx*(ny*k+nn-j)])*0.5-sin(M_PI*j/nn)*(a[i+nx*(ny*k+j)]-a[i+nx*(ny*k+nn-j)]);
                        mgl_fft(b,1,nn,t->v,w,false);
                        double f1=0.5*(a[i+nx*ny*k]-a[i+nx*(ny*k+nn)]), s=-1;
@@ -734,6 +766,7 @@ void MGL_EXPORT mgl_data_cosfft(HMDT d, const char *dir)
                mglStartThreadT(mgl_cosx,ny*nz,d->a,0,wt,0,par);
                if(mgl_fft_data.wnx==0)
                {       mgl_fft_data.wtx = wt;  clear = false;  mgl_fft_data.wnx=nx-1;  }
+               if(clear)       {       mgl_fft_free(wt,0,0);   clear = false;  }
        }
        if(strchr(dir,'y') && ny>1)
        {
@@ -742,6 +775,7 @@ void MGL_EXPORT mgl_data_cosfft(HMDT d, const char *dir)
                mglStartThreadT(mgl_cosy,nx*nz,d->a,0,wt,0,par);
                if(mgl_fft_data.wny==0)
                {       mgl_fft_data.wty = wt;  clear = false;  mgl_fft_data.wny=ny-1;  }
+               if(clear)       {       mgl_fft_free(wt,0,0);   clear = false;  }
        }
        if(strchr(dir,'z') && nz>1)
        {
@@ -750,8 +784,21 @@ void MGL_EXPORT mgl_data_cosfft(HMDT d, const char *dir)
                mglStartThreadT(mgl_cosz,nx*ny,d->a,0,wt,0,par);
                if(mgl_fft_data.wnz==0)
                {       mgl_fft_data.wtz = wt;  clear = false;  mgl_fft_data.wnz=nz-1;  }
+               if(clear)       {       mgl_fft_free(wt,0,0);   clear = false;  }
        }
-       if(clear)       mgl_fft_free(wt,0,0);
+}
+//-----------------------------------------------------------------------------
+void MGL_EXPORT mgl_datac_cosfft(HADT c, const char *dir)
+{
+       if(!dir || *dir==0)     return;
+       mglData re(c->nx, c->ny, c->nz), im(c->nx, c->ny, c->nz);
+       long n = c->GetNN();
+#pragma omp parallel for
+       for(long i=0;i<n;i++)   {       re.a[i]=real(c->a[i]);  im.a[i]=imag(c->a[i]);  }
+       mgl_data_cosfft(&re, dir);
+       mgl_data_cosfft(&im, dir);
+#pragma omp parallel for
+       for(long i=0;i<n;i++)   c->a[i] = dual(re.a[i], im.a[i]);
 }
 //-----------------------------------------------------------------------------
 HMDT MGL_EXPORT mgl_transform_a(HCDT am, HCDT ph, const char *tr)
@@ -762,7 +809,7 @@ HMDT MGL_EXPORT mgl_transform_a(HCDT am, HCDT ph, const char *tr)
 #pragma omp parallel for
        for(long i=0;i<nx*ny*nz;i++)
        {
-               register mreal a=am->vthr(i), p=ph->vthr(i);
+               mreal a=am->vthr(i), p=ph->vthr(i);
                re.a[i] = a*cos(p);     im.a[i] = a*sin(p);
        }
        return mgl_transform(&re, &im, tr);
@@ -772,7 +819,7 @@ HMDT MGL_EXPORT mgl_transform(HCDT re, HCDT im, const char *tr)
 {
        if(!tr || *tr==0)       return 0;
        long nx = re->GetNx(), ny = re->GetNy(), nz = re->GetNz();
-       if(nx*ny*nz != im->GetNN() || !tr || tr[0]==0)  return 0;
+       if(nx*ny*nz != im->GetNN() || tr[0]==0) return 0;
        mglData rr(re),ii(im);
        if(strchr(tr,'i') && strchr(tr,'f'))    // general case
        {
@@ -834,6 +881,8 @@ uintptr_t MGL_EXPORT mgl_transform_(uintptr_t *re, uintptr_t *im, const char *tr
 //-----------------------------------------------------------------------------
 void MGL_EXPORT mgl_data_envelop_(uintptr_t *d, const char *dir, int)
 {      mgl_data_envelop(_DT_,*dir);    }
+void MGL_EXPORT mgl_datac_envelop_(uintptr_t *d, const char *dir, int)
+{      mgl_datac_envelop(_DC_,*dir);   }
 //-----------------------------------------------------------------------------
 #if MGL_HAVE_GSL
 MGL_NO_EXPORT void* mgl_chnkx(void *par)
@@ -878,7 +927,7 @@ MGL_NO_EXPORT void* mgl_chnky(void *par)
 #pragma omp for nowait
                for(long ii=t->id;ii<t->n;ii+=mglNumThr)
                {
-                       register long i = ii%nx, k = ii/nx;
+                       long i = ii%nx, k = ii/nx;
                        for(long j=0;j<ny;j++)  b[j] = real(a[i+nx*(j+ny*k)]);
                        gsl_dht_apply(dht,b,b+ny);
                        for(long j=0;j<ny;j++)  b[j] = imag(a[i+nx*(j+ny*k)]);
@@ -996,7 +1045,7 @@ MGL_NO_EXPORT void* mgl_hnky(void *par)
 #pragma omp for nowait
                for(long ii=t->id;ii<t->n;ii+=mglNumThr)
                {
-                       register long i = ii%nx, k = ii/nx;
+                       long i = ii%nx, k = ii/nx;
                        for(long j=0;j<ny;j++)  b[j] = a[i+nx*(j+ny*k)];
                        gsl_dht_apply(dht,b,b+ny);
                        for(long j=0;j<ny;j++)a[i+nx*(j+ny*k)] = b[j+ny]*mm;
@@ -1113,165 +1162,44 @@ void MGL_EXPORT mgl_data_cosfft_(uintptr_t *d, const char *dir,int l)
 void MGL_EXPORT mgl_data_sinfft_(uintptr_t *d, const char *dir,int l)
 {      char *s=new char[l+1];  memcpy(s,dir,l);        s[l]=0;
        mgl_data_sinfft(_DT_,s);        delete []s;     }
+void MGL_EXPORT mgl_datac_cosfft_(uintptr_t *d, const char *dir,int l)
+{      char *s=new char[l+1];  memcpy(s,dir,l);        s[l]=0;
+       mgl_datac_cosfft(_DC_,s);       delete []s;     }
+void MGL_EXPORT mgl_datac_sinfft_(uintptr_t *d, const char *dir,int l)
+{      char *s=new char[l+1];  memcpy(s,dir,l);        s[l]=0;
+       mgl_datac_sinfft(_DC_,s);       delete []s;     }
 //-----------------------------------------------------------------------------
-MGL_NO_EXPORT void* mgl_corx(void *par)
-{
-       mglThreadT *t=(mglThreadT *)par;
-       long nx=t->p[0];
-       double *a = (double *)t->a;
-#if !MGL_HAVE_PTHREAD
-#pragma omp parallel
-#endif
-       {
-               void *w = mgl_fft_alloc_thr(nx);
-#pragma omp for nowait
-               for(long i=t->id;i<t->n;i+=mglNumThr)
-               {
-                       mgl_fft(t->b+2*nx*i, 1, nx, t->v, w, false);
-                       mgl_fft(a+2*nx*i, 1, nx, t->v, w, false);
-                       for(long j=0;j<nx;j++)
-                       {
-                               register long ii = 2*j+2*nx*i;
-                               register double re = t->b[ii], im = t->b[ii+1];
-                               t->b[ii]   = re*a[ii] + im*a[ii+1];
-                               t->b[ii+1] = im*a[ii] - re*a[ii+1];
-                       }
-                       mgl_fft(t->b+2*nx*i, 1, nx, t->v, w, true);
-               }
-               mgl_fft_free_thr(w);
-       }
-       return 0;
-}
-MGL_NO_EXPORT void* mgl_cory(void *par)
+MGL_NO_EXPORT void* mgl_cor(void *par)
 {
-       mglThreadT *t=(mglThreadT *)par;
-       long nx=t->p[0],ny=t->p[1];
-       double *a = (double *)t->a;
+       mglThreadC *t=(mglThreadC *)par;
+       dual *a = t->a;
+       const dual *b = t->b;
 #if !MGL_HAVE_PTHREAD
 #pragma omp parallel
 #endif
-       {
-               void *w = mgl_fft_alloc_thr(ny);
-#pragma omp for nowait
-               for(long i=t->id;i<t->n;i+=mglNumThr)
-               {
-                       register long k = 2*(i%nx)+2*nx*ny*(i/nx);
-                       mgl_fft(t->b+k, nx, ny, t->v, w, false);
-                       mgl_fft(a+k, nx, ny, t->v, w, false);
-                       for(long j=0;j<ny;j++)
-                       {
-                               register long ii = 2*nx*j+k;
-                               register double re = t->b[ii], im = t->b[ii+1];
-                               t->b[ii]   = re*a[ii] + im*a[ii+1];
-                               t->b[ii+1] = im*a[ii] - re*a[ii+1];
-                       }
-                       mgl_fft(t->b+k, nx, ny, t->v, w, true);
-               }
-               mgl_fft_free_thr(w);
-       }
+       for(long i=t->id;i<t->n;i+=mglNumThr)   a[i] *= conj(b[i]);
        return 0;
 }
-MGL_NO_EXPORT void* mgl_corz(void *par)
-{
-       mglThreadT *t=(mglThreadT *)par;
-       long nx=t->p[0],ny=t->p[1],nz=t->p[2];
-       double *a = (double *)t->a;
-#if !MGL_HAVE_PTHREAD
-#pragma omp parallel
-#endif
-       {
-               void *w = mgl_fft_alloc_thr(nz);
-#pragma omp for nowait
-               for(long i=t->id;i<t->n;i+=mglNumThr)
-               {
-                       mgl_fft(t->b+2*i, nx*ny, nz, t->v, w, false);
-                       mgl_fft(a+2*i, nx*ny, nz, t->v, w, false);
-                       for(long j=0;j<nz;j++)
-                       {
-                               register long ii = 2*nx*ny*j+2*i;
-                               register double re = t->b[ii], im = t->b[ii+1];
-                               t->b[ii]   = re*a[ii] + im*a[ii+1];
-                               t->b[ii+1] = im*a[ii] - re*a[ii+1];
-                       }
-                       mgl_fft(t->b+2*i, nx*ny, nz, t->v, w, true);
-               }
-               mgl_fft_free_thr(w);
-       }
-       return 0;
-}
-MGL_NO_EXPORT double *mgl_d_correl(HCDT d1, HCDT d2, const char *dir)
+HADT MGL_EXPORT mgl_datac_correl(HCDT d1, HCDT d2, const char *dir)
 {
        if(!dir || *dir==0)     return 0;
-       long nx = d1->GetNx(), ny = d1->GetNy(), nz = d1->GetNz(), nn=nx*ny*nz;
+       if(d2==NULL)    d2=d1;
+       long nx = d1->GetNx(), ny = d1->GetNy(), nz = d1->GetNz();
        if(nx*ny*nz!=d2->GetNN())       return 0;
-       void *wt=0;
-       bool clear=false;
-       long par[3]={nx,ny,nz};
-
-       double *a = new double[2*nn];   memset(a,0,2*nn*sizeof(double));
-       double *b = new double[2*nn];   memset(b,0,2*nn*sizeof(double));
-       const mglDataC *dd1 = dynamic_cast<const mglDataC *>(d1);
-       const mglDataC *dd2 = dynamic_cast<const mglDataC *>(d2);
-       const mglData *rd1 = dynamic_cast<const mglData *>(d1);
-       const mglData *rd2 = dynamic_cast<const mglData *>(d2);
-       if(dd1)
-#pragma omp parallel for
-               for(long i=0;i<nn;i++)
-               {       a[2*i] = real(dd1->a[i]);       a[2*i+1] = imag(dd1->a[i]);     }
-       else if(rd1)
+       std::string dirs;
+       if(strchr(dir,'x') && nx>1)     dirs += 'x';
+       if(strchr(dir,'y') && ny>1)     dirs += 'y';
+       if(strchr(dir,'z') && nz>1)     dirs += 'z';
+       if(dirs.empty())        return 0;
+       mglDataC *a = new mglDataC(d1), *b=a;   a->FFT(dirs.c_str());
+       if(d1!=d2)
+       {       b = new mglDataC(d2);   b->FFT(dirs.c_str());   }
+//     mglStartThreadC(mgl_cor,0,nx*ny*nz,a->a,b->a);  // TODO: sth strange
 #pragma omp parallel for
-               for(long i=0;i<nn;i++)  a[2*i] = rd1->a[i];
-       else
-#pragma omp parallel for
-               for(long i=0;i<nn;i++)  a[2*i] = d1->vthr(i);
-       if(dd2)
-#pragma omp parallel for
-               for(long i=0;i<nn;i++)
-               {       b[2*i] = real(dd2->a[i]);       b[2*i+1] = imag(dd2->a[i]);     }
-       else if(rd2)
-#pragma omp parallel for
-               for(long i=0;i<nn;i++)  b[2*i] = rd2->a[i];
-       else
-#pragma omp parallel for
-               for(long i=0;i<nn;i++)  b[2*i] = d2->vthr(i);
-
-       if(strchr(dir,'x') && nx>1)
-       {
-               if(mgl_fft_data.wnx==nx)        wt = mgl_fft_data.wtx;
-               else    {       clear = true;   wt = mgl_fft_alloc(nx,0,0);     }
-               mglStartThreadT(mgl_corx,ny*nz,b,a,wt,0,par);
-               if(mgl_fft_data.wnx==0)
-               {       mgl_fft_data.wtx = wt;  clear = false;  mgl_fft_data.wnx=nx;    }
-       }
-       if(strchr(dir,'y') && ny>1)
-       {
-               if(mgl_fft_data.wny==ny)        wt = mgl_fft_data.wty;
-               else    {       clear = true;   wt = mgl_fft_alloc(ny,0,0);     }
-               mglStartThreadT(mgl_cory,nx*nz,b,a,wt,0,par);
-               if(mgl_fft_data.wny==0)
-               {       mgl_fft_data.wty = wt;  clear = false;  mgl_fft_data.wny=ny;    }
-       }
-       if(strchr(dir,'z') && nz>1)
-       {
-               if(mgl_fft_data.wnz==nz)        wt = mgl_fft_data.wtz;
-               else    {       clear = true;   wt = mgl_fft_alloc(nz,0,0);     }
-               mglStartThreadT(mgl_corz,nx*ny,b,a,wt,0,par);
-               if(mgl_fft_data.wnz==0)
-               {       mgl_fft_data.wtz = wt;  clear = false;  mgl_fft_data.wnz=nz;    }
-       }
-       if(clear)       mgl_fft_free(wt,0,0);
-       delete []b;     return a;
-}
-//-----------------------------------------------------------------------------
-HADT MGL_EXPORT mgl_datac_correl(HCDT d1, HCDT d2, const char *dir)
-{
-       double *a = mgl_d_correl(d1,d2,dir);
-       if(!a)  return 0;
-       const long nx = d1->GetNx(), ny = d1->GetNy(), nz = d1->GetNz();
-       mglDataC *res = new mglDataC(nx,ny,nz);
-#pragma omp parallel for
-       for(long i=0;i<nx*ny*nz;i++)    res->a[i] = dual(a[2*i], a[2*i+1]);
-       delete []a;     return res;
+       for(long i=0;i<nx*ny*nz;i++)    a->a[i] *= conj(b->a[i]);
+       dirs += 'i';    a->FFT(dirs.c_str());
+       if(d1!=d2)      delete b;
+       return a;
 }
 uintptr_t MGL_EXPORT mgl_datac_correl_(uintptr_t *d1, uintptr_t *d2, const char *dir,int l)
 {      char *s=new char[l+1];  memcpy(s,dir,l);        s[l]=0;
@@ -1280,17 +1208,17 @@ uintptr_t MGL_EXPORT mgl_datac_correl_(uintptr_t *d1, uintptr_t *d2, const char
 //-----------------------------------------------------------------------------
 HMDT MGL_EXPORT mgl_data_correl(HCDT d1, HCDT d2, const char *dir)
 {
-       double *a = mgl_d_correl(d1,d2,dir);    // NOTE: this is not so effective but straightforward way
+       HADT a = mgl_datac_correl(d1,d2,dir);   // NOTE: this is not so effective but straightforward way
        if(!a)  return 0;
        const long nx = d1->GetNx(), ny = d1->GetNy(), nz = d1->GetNz();
        mglData *res = new mglData(nx,ny,nz);
 #pragma omp parallel for
-       for(long i=0;i<nx*ny*nz;i++)    res->a[i] = a[2*i];
-       delete []a;     return res;
+       for(long i=0;i<nx*ny*nz;i++)    res->a[i] = real(a->a[i]);
+       delete a;       return res;
 }
 uintptr_t MGL_EXPORT mgl_data_correl_(uintptr_t *d1, uintptr_t *d2, const char *dir,int l)
 {      char *s=new char[l+1];  memcpy(s,dir,l);        s[l]=0;
-       uintptr_t res = uintptr_t(mgl_datac_correl(_DA_(d1),_DA_(d2),s));
+       uintptr_t res = uintptr_t(mgl_data_correl(_DA_(d1),_DA_(d2),s));
        delete []s;             return res;     }
 //-----------------------------------------------------------------------------
 void MGL_EXPORT mgl_data_wavelet(HMDT dat, const char *how, int k)
@@ -1336,11 +1264,11 @@ void MGL_EXPORT mgl_data_wavelet(HMDT dat, const char *how, int k)
                gsl_wavelet_workspace *work = gsl_wavelet_workspace_alloc(n);
                if(mglchr(how,'i'))
 #pragma omp for collapse(2)
-                       for(long i=0;i<dat->nx;i++)     for(long j=0;j<dat->nz;j++)
+                       for(long j=0;j<dat->nz;j++)     for(long i=0;i<dat->nx;i++)
                                gsl_wavelet_transform_inverse(w, a+i+n*s*j, s, n, work);
                else
 #pragma omp for collapse(2)
-                       for(long i=0;i<dat->nx;i++)     for(long j=0;j<dat->nz;j++)
+                       for(long j=0;j<dat->nz;j++)     for(long i=0;i<dat->nx;i++)
                                gsl_wavelet_transform_forward(w, a+i+n*s*j, s, n, work);
                gsl_wavelet_workspace_free(work);
        }
@@ -1371,3 +1299,18 @@ void MGL_EXPORT mgl_data_wavelet_(uintptr_t *d, const char *dir, int *k,int l)
 {      char *s=new char[l+1];  memcpy(s,dir,l);        s[l]=0;
        mgl_data_wavelet(_DT_,s,*k);    delete []s;     }
 //-----------------------------------------------------------------------------
+void MGL_EXPORT mgl_datac_wavelet(HADT c, const char *how, int k)
+{
+       mglData re(c->nx, c->ny, c->nz), im(c->nx, c->ny, c->nz);
+       long n = c->GetNN();
+#pragma omp parallel for
+       for(long i=0;i<n;i++)   {       re.a[i]=real(c->a[i]);  im.a[i]=imag(c->a[i]);  }
+       mgl_data_wavelet(&re, how, k);
+       mgl_data_wavelet(&im, how, k);
+#pragma omp parallel for
+       for(long i=0;i<n;i++)   c->a[i] = dual(re.a[i], im.a[i]);
+}
+void MGL_EXPORT mgl_datac_wavelet_(uintptr_t *d, const char *dir, int *k,int l)
+{      char *s=new char[l+1];  memcpy(s,dir,l);        s[l]=0;
+       mgl_datac_wavelet(_DC_,s,*k);   delete []s;     }
+//-----------------------------------------------------------------------------
index 56cf1d6bbc5c261e53dc6649eb4889dd724cbc1c..970b58381ac06c671348e185aafc9d25d216d89e 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * fit.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -46,7 +46,7 @@ void MGL_EXPORT mgl_puts_fit(HMGL gr, double x, double y, double z, const char *
        long n = strlen(mglFitRes)+(pre?strlen(pre):0)+1;\r
        char *buf = new char[n];\r
        if(pre) snprintf(buf,n,"%s%s",pre,mglFitRes);\r
-       else    strncpy(buf,mglFitRes,n);\r
+       else    mgl_strncpy(buf,mglFitRes,n);\r
        buf[n-1]=0;     mgl_puts(gr,x,y,z,buf,font,size);\r
        delete []buf;\r
 }\r
@@ -169,11 +169,11 @@ int MGL_NO_EXPORT mgl_fit__fdf (const gsl_vector * x, void *data, gsl_vector * f
 mreal MGL_NO_EXPORT mgl_fit_base(mglFitData &fd, mreal *ini)\r
 {\r
 #if MGL_HAVE_GSL\r
-       register long i,m=fd.m,n=fd.n,iter=0;\r
+       long m=fd.m,n=fd.n,iter=0;\r
        if(n<1 || ini==0)       return -1;\r
        // setup data\r
        double *x_init = new double[fd.m];\r
-       for(i=0;i<m;i++)        x_init[i] = ini[i];\r
+       for(long i=0;i<m;i++)   x_init[i] = ini[i];\r
        // setup fitting\r
        gsl_vector_view vx = gsl_vector_view_array(x_init, m);\r
        const gsl_multifit_fdfsolver_type *T = gsl_multifit_fdfsolver_lmsder;\r
@@ -206,7 +206,7 @@ mreal MGL_NO_EXPORT mgl_fit_base(mglFitData &fd, mreal *ini)
        gsl_matrix_free(covar);\r
 \r
        mreal res = gsl_blas_dnrm2(s->f);\r
-       for(i=0;i<m;i++)        ini[i] = gsl_vector_get(s->x, i);\r
+       for(long i=0;i<m;i++)   ini[i] = gsl_vector_get(s->x, i);\r
        // free memory\r
        gsl_multifit_fdfsolver_free(s);\r
        delete []x_init;\r
@@ -336,11 +336,12 @@ HMDT MGL_EXPORT mgl_fit_xys(HMGL gr, HCDT xx, HCDT yy, HCDT ss, const char *eq,
        fd.eq = eq;     fd.var = var;   fd.m = strlen(var);\r
        mglData in(fd.m), *fit=new mglData(nn, yy->GetNy(), yy->GetNz());\r
        mreal res=-1;\r
+       mglDataR xc(x);\r
        for(long i=0;i<yy->GetNy()*yy->GetNz();i++)\r
        {\r
                if(ini && ini->nx>=fd.m)        in.Set(ini->a,fd.m);\r
                else in.Fill(0.,0);\r
-               mglDataR xc(x); xc.SetInd(i%x.ny, L"x");\r
+               xc.SetInd(i%x.ny, L"x");\r
                fd.a = y.a+i*m;         fd.x = &xc;     //x.a+(i%x.ny)*m;\r
                fd.s = s.a+i*m;\r
                res = mgl_fit_base(fd,in.a);\r
@@ -370,9 +371,9 @@ HMDT MGL_EXPORT mgl_fit_xyzs(HMGL gr, HCDT xx, HCDT yy, HCDT zz, HCDT ss, const
        mglData x(m, n), y(m, n), z(zz), s(ss); x.s=L"x";       y.s=L"y";\r
        long nz = zz->GetNz(), mm = n*m;\r
 #pragma omp parallel for collapse(2)\r
-       for(long i=0;i<m;i++)   for(long j=0;j<n;j++)\r
+       for(long j=0;j<n;j++)   for(long i=0;i<m;i++)\r
        {\r
-               register long i0 = i+m*j;\r
+               long i0 = i+m*j;\r
                x.a[i0] = GetX(xx,i,j,0).x;\r
                y.a[i0] = GetY(yy,i,j,0).x;\r
                if(mgl_isnan(x.a[i0]) || mgl_isnan(y.a[i0]))\r
@@ -416,9 +417,9 @@ HMDT MGL_EXPORT mgl_fit_xyzas(HMGL gr, HCDT xx, HCDT yy, HCDT zz, HCDT aa, HCDT
        mglData x(m,n,l), y(m,n,l), z(m,n,l), a(aa), s(ss);\r
        x.s=L"x";       y.s=L"y";       z.s=L"z";\r
 #pragma omp parallel for collapse(3)\r
-       for(long i=0;i<m;i++)   for(long j=0;j<n;j++)   for(long k=0;k<l;k++)\r
+       for(long k=0;k<l;k++)   for(long j=0;j<n;j++)   for(long i=0;i<m;i++)\r
        {\r
-               register long i0 = i+m*(j+n*k);\r
+               long i0 = i+m*(j+n*k);\r
                x.a[i0] = GetX(xx,i,j,k).x;\r
                y.a[i0] = GetY(yy,i,j,k).x;\r
                z.a[i0] = GetZ(zz,i,j,k).x;\r
@@ -453,7 +454,7 @@ HMDT MGL_EXPORT mgl_hist_x(HMGL gr, HCDT x, HCDT a, const char *opt)
        mreal vx = n/(gr->Max.x-gr->Min.x);\r
        for(long i=0;i<nn;i++)\r
        {\r
-               register long j1 = long((x->vthr(i)-gr->Min.x)*vx);\r
+               long j1 = long((x->vthr(i)-gr->Min.x)*vx);\r
                if(j1>=0 && j1<n)       res->a[j1] += a->vthr(i);\r
        }\r
        gr->LoadState();        return res;\r
@@ -471,8 +472,8 @@ HMDT MGL_EXPORT mgl_hist_xy(HMGL gr, HCDT x, HCDT y, HCDT a, const char *opt)
        mreal vy = n/(gr->Max.y-gr->Min.y);\r
        for(long i=0;i<nn;i++)\r
        {\r
-               register long j1 = long((x->vthr(i)-gr->Min.x)*vx);\r
-               register long j2 = long((y->vthr(i)-gr->Min.y)*vy);\r
+               long j1 = long((x->vthr(i)-gr->Min.x)*vx);\r
+               long j2 = long((y->vthr(i)-gr->Min.y)*vy);\r
                if(j1>=0 && j1<n && j2>=0 && j2<n)      res->a[j1+n*j2] += a->vthr(i);\r
        }\r
        gr->LoadState();        return res;\r
@@ -489,9 +490,9 @@ HMDT MGL_EXPORT mgl_hist_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char
        mreal vx = n/(gr->Max.x-gr->Min.x), vy = n/(gr->Max.y-gr->Min.y), vz = n/(gr->Max.z-gr->Min.z);\r
        for(long i=0;i<nn;i++)\r
        {\r
-               register long j1 = long((x->vthr(i)-gr->Min.x)*vx);\r
-               register long j2 = long((y->vthr(i)-gr->Min.y)*vy);\r
-               register long j3 = long((z->vthr(i)-gr->Min.z)*vz);\r
+               long j1 = long((x->vthr(i)-gr->Min.x)*vx);\r
+               long j2 = long((y->vthr(i)-gr->Min.y)*vy);\r
+               long j3 = long((z->vthr(i)-gr->Min.z)*vz);\r
                if(j1>=0 && j1<n && j2>=0 && j2<n && j3>=0 && j3<n)\r
                        res->a[j1+n*(j2+n*j3)] += a->vthr(i);\r
        }\r
@@ -515,7 +516,7 @@ MGL_EXPORT const char *mgl_get_fit(HMGL )   {       return mglFitRes;       }
 int MGL_EXPORT mgl_get_fit_(uintptr_t *gr, char *out, int len)\r
 {\r
        const char *res = mgl_get_fit(_GR_);\r
-       if(out) strncpy(out,res,len);\r
+       if(out) mgl_strncpy(out,res,len);\r
        return strlen(res);\r
 }\r
 //-----------------------------------------------------------------------------\r
index 1fd685c3af7b37696d7cd751c9062c4b99f0aa70..3896e7d8386206913c4ca28bd0df366cdce0e399 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * font.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -20,6 +20,7 @@
 #include <locale.h>\r
 #include <ctype.h>\r
 #include <wctype.h>\r
+#include <unistd.h>\r
 \r
 #if !defined(__BORLANDC__) || (__CODEGEARC__ >=  0x0630)\r
 #include <algorithm>\r
 #include "mgl2/base.h"\r
 #include "mgl2/font.h"\r
 #include "def_font.cc"\r
+#include "tex_table.cc"\r
 //-----------------------------------------------------------------------------\r
-extern mglTeXsymb mgl_tex_symb[];\r
-extern long mgl_tex_num;\r
 //mglFont mglDefFont("nofont");\r
 mglFont mglDefFont;\r
 //-----------------------------------------------------------------------------\r
+size_t MGL_EXPORT mgl_wcslen(const wchar_t *str)\r
+{\r
+       long i=0;\r
+       if(str) while(str[i])   i++;\r
+       return i;\r
+}\r
+//-----------------------------------------------------------------------------\r
 long MGL_EXPORT_PURE mgl_internal_code(unsigned s, const std::vector<mglGlyphDescr> &glyphs)\r
 {\r
-       register long i1=0,i2=glyphs.size()-1;\r
-       register wchar_t j = wchar_t(s & MGL_FONT_MASK);\r
+       long i1=0,i2=glyphs.size()-1;\r
+       wchar_t j = wchar_t(s & MGL_FONT_MASK);\r
        // let suppose that id[i]<id[i+1]\r
        while(i1<i2)\r
        {\r
-               register long i = (i1+i2)/2;\r
+               long i = (i1+i2)/2;\r
                if(j<glyphs[i].id)              i2 = i;\r
                else if(j>glyphs[i].id) i1=i+1;\r
                else return i;\r
@@ -66,7 +73,7 @@ bool MGL_EXPORT mglGetStyle(const char *how, int *font, int *align)
        {\r
                *align = 1;\r
                if(strchr(how,'R'))     *align = 2;\r
-               if(strchr(how,'C'))     *align = 1;\r
+//             if(strchr(how,'C'))     *align = 1;\r
                if(strchr(how,'L'))     *align = 0;\r
                if(strchr(how,'D'))     *align+= 4;\r
        }\r
@@ -127,19 +134,19 @@ float mglFont::Puts(const wchar_t *str,int font,int align, float c1,float c2) co
                        if(wcs[i]=='\n')        // parse '\n' symbol\r
                        {\r
                                wcs[i]=0;       w = Puts(buf,0,0,1.f,0x10|font,c1,c2);  // find width\r
-                               Puts(buf,-w*(align&3)/2.f,-h - 500.*num/fact[0],1.f,font,c1,c2);        // draw it really\r
+                               Puts(buf,-w*(align&3)/2.f,-h - 660*num/fact[0],1.f,font,c1,c2); // draw it really\r
                                buf=wcs+i+1;    num++;  if(w>ww)        ww=w;\r
                        }\r
-                       if(wcs[i]=='\\' && wcs[i+1]=='n' && (wcs[i+2]>' ' || wcschr(L"{}[]()!@#$%^&*/-?.,_=+\\\"", wcs[i+2])))  // parse '\n' symbol\r
-                       {\r
-                               wcs[i]=0;       w = Puts(buf,0,0,1.f,0x10|font,c1,c2);  // find width\r
-                               Puts(buf,-w*(align&3)/2.f,-h - 500.*num/fact[0],1.f,font,c1,c2);        // draw it really\r
-                               buf=wcs+i+2;    num++;  if(w>ww)        ww=w;\r
-                       }\r
+//                     if(wcs[i]=='\\' && wcs[i+1]=='n' && (wcs[i+2]>' ' || wcschr(L"{}[]()!@#$%^&*/-?.,_=+\\\"", wcs[i+2])))  // parse '\n' symbol\r
+//                     {\r
+//                             wcs[i]=0;       w = Puts(buf,0,0,1.f,0x10|font,c1,c2);  // find width\r
+//                             Puts(buf,-w*(align&3)/2.f,-h - 720.*num/fact[0],1.f,font,c1,c2);        // draw it really\r
+//                             buf=wcs+i+2;    num++;  if(w>ww)        ww=w;\r
+//                     }\r
                }\r
                // draw string itself\r
                w = Puts(buf,0,0,1.f,0x10|font,c1,c2);  // find width\r
-               Puts(buf,-w*(align&3)/2.f,-h - 500.*num/fact[0],1.f,font,c1,c2);        // draw it really\r
+               Puts(buf,-w*(align&3)/2.f,-h - 660*num/fact[0],1.f,font,c1,c2); // draw it really\r
                if(w>ww)        ww=w;\r
                delete []wcs;\r
        }\r
@@ -205,7 +212,7 @@ float mglFont::Height(int font) const
 {\r
        if(GetNumGlyph()==0)    return 0;\r
        int s = (font/MGL_FONT_BOLD)&3;\r
-       return (500.f)/fact[s];\r
+       return 660/fact[s];\r
 }\r
 //-----------------------------------------------------------------------------\r
 float mglFont::Height(const char *how) const\r
@@ -217,7 +224,7 @@ float mglFont::Height(const char *how) const
                if(strchr(how,'b'))     s = s|1;\r
                if(strchr(how,'i'))     s = s|2;\r
        }\r
-       return (500.f)/fact[s];\r
+       return 660/fact[s];\r
 }\r
 //-----------------------------------------------------------------------------\r
 /// Table of acents and its UTF8 codes\r
@@ -235,25 +242,19 @@ int MGL_LOCAL_PURE mgl_tex_symb_cmp(const void *a, const void *b)
 // parse LaTeX commands (mostly symbols and acents, and some font-style commands)\r
 unsigned mglFont::Parse(const wchar_t *s) const\r
 {\r
-       register long k;\r
        unsigned res = unsigned(-2);            // Default is no symbol\r
        if(!s || !s[0]) return res;\r
-//     for(k=0;mgl_tex_symb[k].kod;k++);       // determine the number of symbols\r
        mglTeXsymb tst, *rts;\r
        tst.tex = s;\r
        rts = (mglTeXsymb *) bsearch(&tst, mgl_tex_symb, mgl_tex_num, sizeof(mglTeXsymb), mgl_tex_symb_cmp);\r
        if(rts) return rts->kod;\r
 \r
-//     for(k=0;mgl_tex_symb[k].kod;k++)        // special symbols\r
-//             if(!wcscmp(s,mgl_tex_symb[k].tex))\r
-//                     return mgl_tex_symb[k].kod;\r
-       for(k=0;mgl_act_symb[k].kod;k++)        // acents\r
+       for(long k=0;mgl_act_symb[k].kod;k++)   // acents\r
                if(!wcscmp(s,mgl_act_symb[k].tex))\r
                        return mgl_act_symb[k].kod | MGL_FONT_ZEROW;\r
        // arbitrary UTF symbol\r
        if(s[0]=='u' && s[1]=='t' && s[2]=='f')\r
-//     {       wscanf(s+3,"%lx",&k);   return wchar_t(k);      }\r
-       {       k = wcstoul(s+3,NULL,16);       return wchar_t(k);      }\r
+       {       long k = wcstoul(s+3,NULL,16);  return wchar_t(k);      }\r
        // font/style changes for next symbol\r
        if(!wcscmp(s,L"big"))                   res = unsigned(-5);\r
        else if(!wcscmp(s,L"frac"))             res = unsigned(-6);\r
@@ -265,6 +266,7 @@ unsigned mglFont::Parse(const wchar_t *s) const
        else if(!wcscmp(s,L"sub"))              res = unsigned(-12);\r
        else if(!wcscmp(s,L"sup"))              res = unsigned(-13);\r
        else if(!wcscmp(s,L"textsc"))   res = unsigned(-14);    // new\r
+       else if(!wcscmp(s,L"dfrac"))    res = unsigned(-15);\r
        else if(!wcscmp(s,L"b"))                res = MGL_FONT_BOLD;\r
        else if(!wcscmp(s,L"i"))                res = MGL_FONT_ITAL;\r
        else if(!wcscmp(s,L"bi"))               res = MGL_FONT_BOLD|MGL_FONT_ITAL;\r
@@ -286,9 +288,9 @@ unsigned mglFont::Parse(const wchar_t *s) const
 //-----------------------------------------------------------------------------\r
 void mglFont::Convert(const wchar_t *str, unsigned *res) const\r
 {\r
-       register size_t r,i,j,k,i0;\r
+       size_t j=0;\r
        wchar_t s[128]=L"";             // TeX command and current char\r
-       for(i=j=0;str[i];i++)\r
+       for(size_t i=0;str[i];i++)\r
        {\r
                wchar_t ch = str[i];\r
                if(ch=='\\')    // It can be TeX command\r
@@ -297,10 +299,10 @@ void mglFont::Convert(const wchar_t *str, unsigned *res) const
                                res[j++] = str[++i];\r
                        else            // Yes, it is TeX command\r
                        {\r
-                               i0=i+1;\r
+                               size_t i0=i+1, k;\r
                                for(k=0;isalnum(str[++i]) && k<127;k++) s[k] = str[i];\r
                                s[k] = 0;\r
-                               r = Parse(s);\r
+                               size_t r = Parse(s);\r
                                if(r==unsigned(-2))                     // command not found, so use next symbol itself\r
                                {       res[j++] = str[i0];     i = i0; }\r
                                else if(r)\r
@@ -329,12 +331,11 @@ void mglFont::Convert(const wchar_t *str, unsigned *res) const
 float mglFont::get_ptr(long &i,unsigned *str, unsigned **b1, unsigned **b2,float &w1,float &w2, float f1, float f2, int st) const\r
 {\r
        static unsigned s1[2]={0,0}, s2[2]={0,0};\r
-       register long k;\r
        i++;\r
        if(str[i]==unsigned(-3))\r
        {\r
                i++;    *b1 = str+i;\r
-               for(k=1;k>0 && str[i];i++)\r
+               for(long k=1;k>0 && str[i];i++)\r
                {\r
                        if(str[i]==unsigned(-4))        k--;\r
                        if(str[i]==unsigned(-3))        k++;\r
@@ -345,7 +346,7 @@ float mglFont::get_ptr(long &i,unsigned *str, unsigned **b1, unsigned **b2,float
        if(str[i]==unsigned(-3))\r
        {\r
                i++;    *b2 = str+i;\r
-               for(k=1;k>0 && str[i];i++)\r
+               for(long k=1;k>0 && str[i];i++)\r
                {\r
                        if(str[i]==unsigned(-4))        k--;\r
                        if(str[i]==unsigned(-3))        k++;\r
@@ -406,7 +407,7 @@ float mglFont::Puts(const unsigned *text, float x,float y,float f,int style,floa
                {\r
                        ww = get_ptr(i, str, &b1, &b2, w1, w2, ff, ff, st);\r
                        Puts(b1, x+(ww-w1)/2, yy, ff, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol,ccol);\r
-                       Puts(b2, x+(ww-w2)/2, yy-600*ff/fact[a], ff, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol,ccol);\r
+                       Puts(b2, x+(ww-w2)/2, yy-660*ff/fact[a], ff, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol,ccol);\r
                        MGL_CLEAR_STYLE\r
                }\r
                else if(s==unsigned(-9))        // underset\r
@@ -476,7 +477,19 @@ float mglFont::Puts(const unsigned *text, float x,float y,float f,int style,floa
                {\r
                        ww = get_ptr(i, str, &b1, &b2, w1, w2, ff*0.45, ff*0.45, st);\r
                        Puts(b1, x+(ww-w1)/2, yy+250*ff/fact[a], ff*0.45, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol,ccol);\r
-                       Puts(b2, x+(ww-w2)/2, yy-110*ff/fact[a], ff*0.45, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol,ccol);\r
+                       Puts(b2, x+(ww-w2)/2, yy-60*ff/fact[a], ff*0.45, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol,ccol);\r
+                       if(gr && !(style&0x10)) // add under-/over- line now\r
+                       {\r
+                               draw_ouline(st,x,y,f,fact[a],ww,ccol);\r
+                               gr->Glyph(x,y+150*f/fact[a], ww*fact[a], (st&MGL_FONT_WIRE)?12:8, 0, ccol);\r
+                       }\r
+                       MGL_CLEAR_STYLE\r
+               }\r
+               else if(s==unsigned(-15))       // dfrac\r
+               {\r
+                       ww = get_ptr(i, str, &b1, &b2, w1, w2, ff, ff, st);\r
+                       Puts(b1, x+(ww-w1)/2, yy+315*ff/fact[a], ff, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol,ccol);\r
+                       Puts(b2, x+(ww-w2)/2, yy-405*ff/fact[a], ff, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol,ccol);\r
                        if(gr && !(style&0x10)) // add under-/over- line now\r
                        {\r
                                draw_ouline(st,x,y,f,fact[a],ww,ccol);\r
@@ -521,7 +534,8 @@ float mglFont::Puts(const unsigned *text, float x,float y,float f,int style,floa
                                                unsigned sn = str[i+j];\r
                                                if(sn<unsigned(-15) && (sn&MGL_FONT_MASK)>' ')  // specially center\r
                                                {\r
-                                                       dx = 0.75*ff*(GetWidth(a,Internal(sn&MGL_FONT_MASK))-GetWidth(a,j))/fact[a];\r
+                                                       long jj = Internal(sn&MGL_FONT_MASK);\r
+                                                       dx = jj<0?0:0.75*ff*(GetWidth(a,jj)-GetWidth(a,j))/fact[a];\r
                                                        if(dx<0)        dx=0;\r
                                                }\r
                                        }\r
@@ -531,7 +545,7 @@ float mglFont::Puts(const unsigned *text, float x,float y,float f,int style,floa
                                                else                                    gr->Glyph(x+dx,yy,ff,a,j,ccol);\r
                                        }\r
                                }\r
-                               ww = ff*GetWidth(a,j)/fact[a];\r
+                               ww = j>=0?ff*GetWidth(a,j)/fact[a]:0;\r
                                if(gr && !(style&0x10)) // add under-/over- line now\r
                                        draw_ouline(st,x,y,f,fact[a],ww,ccol);\r
                                if(s & MGL_FONT_ZEROW)  ww = 0;\r
@@ -751,7 +765,8 @@ bool mglFont::Load(const char *base, const char *path)
        if(!(base && *base) || !read_main(str,norm))\r
        {\r
                read_def();     setlocale(LC_NUMERIC,loc.c_str());\r
-               if(buf) delete []buf;   return true;\r
+               if(buf) delete []buf;\r
+               return true;\r
        }\r
        fact[1] = fact[2] = fact[3] = fact[0];\r
 \r
@@ -868,12 +883,13 @@ bool mglFont::Load(const char *base, const char *path)
 }\r
 //-----------------------------------------------------------------------------\r
 #if MGL_HAVE_PTHREAD\r
-extern pthread_mutex_t mutexRnd;\r
+pthread_mutex_t mutexRnd;\r
 #endif\r
 //-----------------------------------------------------------------------------\r
 float mgl_cos[360];\r
 void MGL_NO_EXPORT mgl_init()\r
 {\r
+       mgl_textdomain(NULL,"");\r
 #if MGL_HAVE_PTHREAD\r
        pthread_mutex_init(&mutexRnd,0);\r
 #endif\r
@@ -918,3 +934,63 @@ void mglFont::Copy(mglFont *f)
        memcpy(&glyphs[0],&(f->glyphs)[0],glyphs.size()*sizeof(mglGlyphDescr));\r
 }\r
 //-----------------------------------------------------------------------------\r
+long MGL_EXPORT mgl_check_tex_table()\r
+{\r
+       size_t i=0;     while(mgl_tex_symb[i].tex[0])   i++;\r
+       long res = 0;\r
+       if(mgl_tex_num!=i)\r
+       {       printf("real=%zu, set=%zu\n",i,mgl_tex_num);    res = -1;       }\r
+       for(i=0;mgl_tex_symb[i].tex[0];i++)\r
+       {\r
+               mglTeXsymb tst, *rts;   tst.tex = mgl_tex_symb[i].tex;\r
+               rts = (mglTeXsymb *) bsearch(&tst, mgl_tex_symb, mgl_tex_num, sizeof(mglTeXsymb), mgl_tex_symb_cmp);\r
+               if(!rts)\r
+               {       printf(_("Bad '%ls' at %zu\n"),mgl_tex_symb[i].tex,i);  res = 1+i;      }\r
+       }\r
+       return res;\r
+}\r
+//---------------------------------------------------------------------------\r
+bool MGL_NO_EXPORT test_transl(const char *p)\r
+{\r
+       if(!p)  return false;\r
+#if MGL_USE_GETTEXT\r
+       std::string f = std::string(p) + "/ru/LC_MESSAGES/mathgl.mo";\r
+       FILE *fp = fopen(f.c_str(),"r");\r
+       if(fp)\r
+       {\r
+               bindtextdomain("mathgl", p);\r
+               textdomain("mathgl");\r
+               fclose(fp);     return true;\r
+       }\r
+#endif\r
+       return false;\r
+}\r
+void MGL_EXPORT mgl_textdomain(const char *argv0, const char *loc)\r
+{\r
+       static const char *argv=NULL;\r
+       if(!argv0)      argv0=argv;     else    argv=argv0;\r
+       setlocale(LC_ALL, loc); setlocale(LC_NUMERIC, "C");\r
+#if MGL_USE_GETTEXT\r
+       if(!test_transl(MGL_INSTALL_DIR"/share/locale/"))\r
+               if(!test_transl("/usr/share/locale/"))\r
+                       if(!test_transl("/usr/local/share/locale/"))\r
+                               if(!test_transl(getcwd(NULL,0)))\r
+                               {\r
+                                       const char *f = argv0?strrchr(argv0,'/'):NULL;\r
+#ifdef WIN32\r
+                                       if(!f)  f = argv0?strrchr(argv0,'\\'):NULL;\r
+#endif\r
+                                       if(f)\r
+                                       {\r
+                                               std::string p(argv0,f-argv0);\r
+                                               if(!test_transl(p.c_str()))\r
+                                                       return;\r
+                                       }\r
+                                       else    return;\r
+                               }\r
+#endif\r
+}\r
+void MGL_EXPORT mgl_textdomain_(const char *locale, int l)\r
+{      char *s=new char[l+1];  memcpy(s,locale,l);     s[l]=0;\r
+       mgl_textdomain(NULL,s); delete []s;     }\r
+//---------------------------------------------------------------------------\r
index 61b2a33162f2d96f684333629773c54db3006dbb..d3ac267c35bdbe1c29d9e700e1c305d6441d235b 100644 (file)
@@ -2,7 +2,6 @@
 template <class Treal> Treal mglLineart(const Treal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z)
 {
        if(!a || nx<1 || ny<1 || nz<1)  return 0;
-       register long i0;
        Treal b=0,dx,dy,dz,b1,b0;
        if(x<0 || y<0 || z<0 || x>nx-1 || y>ny-1 || z>nz-1)
                return 0;
@@ -11,7 +10,7 @@ template <class Treal> Treal mglLineart(const Treal *a, long nx, long ny, long n
                long kx=long(x), ky=long(y), kz=long(z);
                dx = x-mreal(kx);       dy = y-mreal(ky);       dz = z-mreal(kz);
 
-               i0 = kx+nx*(ky+ny*kz);
+               long i0 = kx+nx*(ky+ny*kz);
                b0 = a[i0]*(mreal(1)-dx-dy+dx*dy) + dx*(mreal(1)-dy)*a[i0+1] +
                        dy*(mreal(1)-dx)*a[i0+nx] + dx*dy*a[i0+nx+1];
                i0 = kx+nx*(ky+ny*(kz+1));
@@ -23,7 +22,7 @@ template <class Treal> Treal mglLineart(const Treal *a, long nx, long ny, long n
        {
                long kx=long(x), ky=long(y);
                dx = x-kx;      dy=y-ky;
-               i0 = kx+nx*ky;
+               long i0 = kx+nx*ky;
                b = a[i0]*(mreal(1)-dx-dy+dx*dy) + dx*(mreal(1)-dy)*a[i0+1] +
                        dy*(mreal(1)-dx)*a[i0+nx] + dx*dy*a[i0+nx+1];
        }
@@ -91,7 +90,7 @@ template <class Treal> Treal mglSpline1t(const Treal *a, long nx, mreal x, Treal
        Treal r,d;
        if(nx>3)
        {
-               register long k = long(x);
+               long k = long(x);
                if(k>0 && k<nx-2)       r = mgl_spline3t<Treal>(a+k-1, 1, x-k, d);
                else if(k<1)            r = mgl_spline3t<Treal>(a, 0, x, d);
                else    r = mgl_spline3t<Treal>(a+nx-4, 2, x+2-nx, d);
@@ -112,7 +111,7 @@ template <class Treal> Treal mglSpline1st(const Treal *a, long nx, mreal x)
        Treal r;
        if(nx>3)
        {
-               register long k = long(x);
+               long k = long(x);
                if(k>0 && k<nx-2)       r = mgl_spline3st<Treal>(a+k-1, 1, x-k);
                else if(k<1)            r = mgl_spline3st<Treal>(a, 0, x);
                else    r = mgl_spline3st<Treal>(a+nx-4, 2, x+2-nx);
@@ -173,7 +172,9 @@ template <class Treal> Treal mglSpline3t(const Treal *a, long nx, long ny, long
        }
        else    // 1d interpolation
                b = mglSpline1t<Treal>(a,nx,x,&gx);
-       if(dx)  *dx=gx; if(dy)  *dy=gy; if(dz)  *dz=gz;
+       if(dx)  *dx=gx;
+       if(dy)  *dy=gy;
+       if(dz)  *dz=gz;
        return b;
 }
 //-----------------------------------------------------------------------------
index 47ff410535fb56cea540a587e32ef8aa021d1b01..c6dfb8a3872a1dbe91070b89c89c4513d4eea541 100644 (file)
@@ -33,7 +33,7 @@ void MGL_EXPORT mgl_mpi_recv(HMGL gr, int id)
 #pragma omp parallel for
        for(long k=0;k<n;k++)
        {       // i0=x+Width*(Height-1-y)
-               register long i = k%w, j = h-1-(k/w);
+               long i = k%w, j = h-1-(k/w);
                if(g->GetQuality()&MGL_DRAW_NORM)
                {
                        g->pnt_plot(i,j,zz[3*k+2],cc+12*k+8,oi[k]);
index febde6c6b5c9a10dec70049d53c0e5f1e393f498..93a0231e146fed0113d50a2579271fbdc1d0d686 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * obj.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -32,8 +32,6 @@ void MGL_NO_EXPORT mgl_printf(void *fp, bool gz, const char *str, ...);
 #include <float.h>\r
 #include <math.h>\r
 \r
-#include <string>\r
-#include <vector>\r
 #include <deque>\r
 #include <map>\r
 #include <iostream>\r
@@ -51,14 +49,12 @@ void MGL_NO_EXPORT mgl_printf(void *fp, bool gz, const char *str, ...);
 void mglTexture::GetRGBAOBJ(unsigned char *f) const\r
 {\r
        const size_t bw = 128; //border width\r
-       register size_t i,j,i0;\r
-       mglColor c1,c2,c;\r
-       for(i=0;i<256;i++)\r
+       for(size_t i=0;i<256;i++)\r
        {\r
-               c1 = col[2*i];  c2 = col[2*i+1];\r
-               for(j=0;j<512;j++)\r
+               mglColor c1 = col[2*i], c2 = col[2*i+1], c;\r
+               for(size_t j=0;j<512;j++)\r
                {\r
-                       i0 = 4*(j+512*(255-i));\r
+                       size_t i0 = 4*(j+512*(255-i));\r
                        if (j<bw)\r
                                c = c1;\r
                        else if (j>511-bw)\r
@@ -70,8 +66,7 @@ void mglTexture::GetRGBAOBJ(unsigned char *f) const
                        f[i0+2] = int(255*c.b);\r
                        f[i0+3] = int(255*c.a);\r
                }\r
-  }\r
-       \r
+       }\r
 }\r
 \r
 //-----------------------------------------------------------------------------\r
@@ -84,7 +79,7 @@ struct ObjUV
   u(U), v(V) {}\r
   mreal u;\r
   mreal v;\r
-  \r
+\r
   void Set(mreal U, mreal V)\r
   { u = U; v = V; }\r
 \r
@@ -115,11 +110,11 @@ struct ObjUVs {
   ObjUVs(FILE *f) : fp(f) {}\r
 \r
   size_t addTextureCoords(mreal ta, mreal c, size_t ntxt)\r
-       {    \r
+       {\r
     const mreal gap = 1./512;\r
     const mreal u = 0.25+0.5*(ta*(1-2*gap)+gap);\r
     const mreal v = ((c-floor(c))*(1-2*gap) + gap + floor(c))/ntxt;\r
-               \r
+\r
     const ObjUV point(u, v);\r
     std::map<ObjUV,size_t>::iterator pPoint = texturecoords.find(point);\r
     if(pPoint!=texturecoords.end())\r
@@ -147,14 +142,14 @@ class ObjXYZ
   x(0), y(0), z(0) {}\r
   ObjXYZ(mreal fx, mreal fy, mreal fz) :\r
   x(fx), y(fy), z(fz) {}\r
-  \r
+\r
   void Set(mreal fx, mreal fy, mreal fz)\r
   { x = fx; y = fy; z = fz; }\r
   mreal Dot(const ObjXYZ & sPt) const\r
   { return(x*sPt.x)+(y*sPt.y)+(z*sPt.z); }\r
   mreal LengthSquared()\r
   { return(x*x+y*y+z*z); }\r
-  \r
+\r
   friend ObjXYZ operator + (const ObjXYZ& a, const ObjXYZ& b)\r
   { return ObjXYZ(a.x+b.x,a.y+b.y,a.z+b.z); }\r
   friend ObjXYZ operator - (const ObjXYZ& a)\r
@@ -169,12 +164,12 @@ class ObjXYZ
   { return ObjXYZ(a.x/d,a.y/d,a.z/d); }\r
   friend ObjXYZ operator * (const ObjXYZ& a, const ObjXYZ& b)\r
   { return ObjXYZ((a.y*b.z)-(a.z*b.y), (a.z*b.x)-(a.x*b.z), (a.x*b.y)-(a.y*b.x)); }\r
-    \r
+\r
   mreal Length()\r
   {\r
     return sqrt(x*x+y*y+z*z);\r
   }\r
-  \r
+\r
   bool Normalize()\r
   {\r
     mreal fLength=Length();\r
@@ -185,7 +180,7 @@ class ObjXYZ
     z *= factor;\r
     return true;\r
   }\r
-  \r
+\r
   bool operator==(const ObjXYZ &v) const\r
   {\r
     return x==v.x && y==v.y && z==v.z;\r
@@ -213,11 +208,11 @@ struct ObjXYZs {
        std::map<ObjXYZ,size_t> vertexcoords;\r
   FILE* const fp;\r
   ObjXYZs(FILE *f) : fp(f) {}\r
-  \r
+\r
        size_t addVertexCoords(mreal x, mreal y, mreal z)\r
        {\r
                const ObjXYZ point(x,y,z);\r
-    \r
+\r
                std::map<ObjXYZ,size_t>::iterator pPoint = vertexcoords.find(point);\r
                if(pPoint!=vertexcoords.end())\r
                        return pPoint->second;\r
@@ -230,7 +225,7 @@ struct ObjXYZs {
                        return point_index;\r
                }\r
        }\r
-  \r
+\r
 };\r
 \r
 struct ObjTriangle {\r
@@ -259,11 +254,11 @@ struct ObjGroup {
   FILE* const fp;\r
   ObjXYZs &vertexcoords;\r
   ObjGroup(FILE *f,ObjXYZs& v) : commoncolor(NC), samecolor(true), fp(f), vertexcoords(v) {}\r
-  \r
+\r
 //  const HMGL gr;\r
-  \r
+\r
 //  ObjGroup(const HMGL g) : samecolor(true),  gr(g) {}\r
-  \r
+\r
   void addSegment(size_t m, size_t p1, size_t p2)\r
   {\r
     lines[m].push_back(ObjLine(p1,p2));\r
@@ -286,7 +281,7 @@ struct ObjGroup {
     }\r
     delete []p;\r
   }\r
-  \r
+\r
   void addPoint(size_t m, size_t p)\r
   {\r
     points[m].push_back(p);\r
@@ -302,7 +297,7 @@ struct ObjGroup {
   void addColourInfo(const mglPnt& p)\r
        {\r
                const mglColor color(p.r,p.g,p.b,p.a);\r
-    \r
+\r
     if (samecolor) {\r
       if (commoncolor == NC) {\r
         commoncolor = color;\r
@@ -361,7 +356,7 @@ struct ObjMaterials {
        colormap materialmap;\r
   FILE* const fp;\r
   ObjMaterials(FILE *f) : fp(f) {}\r
-  \r
+\r
        size_t addColor(const mglColor& color)\r
        {\r
                colormap::iterator pc = materialmap.find(color);\r
@@ -400,16 +395,16 @@ size_t MGL_LOCAL_CONST power_of_two(size_t input)
 \r
 void MGL_EXPORT mgl_write_obj(HMGL gr, const char *fname,const char *descr, int use_png)\r
 {\r
-       if(gr->GetPrmNum()==0)  return; // nothing to do\r
-  \r
-       register size_t i,j;\r
+       mglCanvas *gg = dynamic_cast<mglCanvas *>(gr);\r
+       if(!gg || gr->GetPrmNum()==0)   return; // nothing to do\r
+\r
        {\r
                long mmin=0,mmax=0,m;\r
-               for(i=0;i<gr->Grp.size();i++)   // prepare array of indirect indexing\r
+               for(size_t i=0;i<gr->Grp.size();i++)    // prepare array of indirect indexing\r
                {       m = gr->Grp[i].Id;      if(m<mmin) mmin=m;      if(m>mmax) mmax=m;      }\r
                long *ng = new long[mmax-mmin+1];\r
-               for(i=0;i<gr->Grp.size();i++)   ng[gr->Grp[i].Id-mmin] = i;\r
-               for(i=0;i<size_t(gr->GetPrmNum());i++)  // collect data for groups\r
+               for(size_t i=0;i<gr->Grp.size();i++)    ng[gr->Grp[i].Id-mmin] = i;\r
+               for(size_t i=0;i<size_t(gr->GetPrmNum());i++)   // collect data for groups\r
                // it is rather expensive (extra 4b per primitive) but need for export to 3D\r
                {\r
                        m = gr->GetPrm(i,false).id-mmin;\r
@@ -417,7 +412,7 @@ void MGL_EXPORT mgl_write_obj(HMGL gr, const char *fname,const char *descr, int
                }\r
                delete []ng;\r
        }\r
-  \r
+\r
        const size_t len=strlen(fname);\r
        const size_t ntxt=gr->GetTxtNum();\r
        const size_t Ntxt=power_of_two(ntxt);\r
@@ -429,533 +424,533 @@ void MGL_EXPORT mgl_write_obj(HMGL gr, const char *fname,const char *descr, int
        ObjUVs texturecoords(fp);\r
        std::vector<size_t> tcs(pntnum); // texture coord ids\r
 \r
-  // center point\r
-  mglPnt p0;\r
-       const mreal width  = dynamic_cast<mglCanvas *>(gr)->GetWidth();\r
-       const mreal height = dynamic_cast<mglCanvas *>(gr)->GetHeight();\r
+       // center point\r
+       mglPnt p0;\r
+       const mreal width  = gg->GetWidth();\r
+       const mreal height = gg->GetHeight();\r
        const mreal depth  = sqrt(width*height);\r
-  \r
+\r
        p0.x = width/2.;\r
        p0.y = height/2.;\r
        p0.z = (1.f-sqrt(width*height)/(2*depth))*depth;\r
 \r
        // vertices definition\r
        fprintf(fp,"# Created by MathGL library\n# Title: %s\n",(descr && *descr) ? descr : fname);\r
-       for(i=0;i<pntnum;i++)\r
+       for(size_t i=0;i<pntnum;i++)\r
        {\r
                const mglPnt &pp = gr->GetPnt(i);\r
-    vcs[i] = vertexcoords.addVertexCoords(pp.x-p0.x, pp.y-p0.y, pp.z-p0.z);\r
-    tcs[i] = texturecoords.addTextureCoords(pp.ta, pp.c, Ntxt);\r
+               vcs[i] = vertexcoords.addVertexCoords(pp.x-p0.x, pp.y-p0.y, pp.z-p0.z);\r
+               tcs[i] = texturecoords.addTextureCoords(pp.ta, pp.c, Ntxt);\r
        }\r
-  \r
+\r
   // prepare MTL file\r
        tname[len-4]='.';       tname[len-3]='m';       tname[len-2]='t';       tname[len-1]='l';\r
        FILE *fpmat=fopen(tname,"wt");\r
        tname[len-4]='\0';\r
-  fprintf(fpmat,"newmtl Material\n");\r
+       fprintf(fpmat,"newmtl Material\n");\r
        fprintf(fpmat,"Ka 0.0 0.0 0.0\n");\r
        fprintf(fpmat,"Kd 1.0 1.0 1.0\n");\r
        fprintf(fpmat,"Ks 0.0 0.0 0.0\n");\r
        fprintf(fpmat,"d 1.0\nillum 2\n");\r
        if(use_png)\r
-    fprintf(fpmat,"map_Kd %s_txt.png\n",tname);\r
+               fprintf(fpmat,"map_Kd %s_txt.png\n",tname);\r
        else\r
-    fprintf(fpmat,"map_Kd %s_txt.tga\n",tname);\r
+               fprintf(fpmat,"map_Kd %s_txt.tga\n",tname);\r
        if(use_png)\r
-    strcat(tname,"_txt.png");\r
+               strcat(tname,"_txt.png");\r
        else\r
                strcat(tname,"_txt.tga");\r
        // prepare texture file (TGA or PNG)\r
        const size_t txtwidth = 512;\r
        unsigned char *buf = new unsigned char[4*256*txtwidth*Ntxt];\r
        unsigned char **pbuf= (unsigned char **)malloc(256*Ntxt*sizeof(unsigned char *));\r
-       for(i=0;i<256*Ntxt;i++) pbuf[i] = buf+4*txtwidth*i;\r
-       for(i=0;i<ntxt;i++)     gr->GetTxt(i).GetRGBAOBJ(buf+(Ntxt-1-i)*256*txtwidth*4);\r
-       for(i=ntxt;i<Ntxt;i++)\r
-  {\r
-    unsigned char *f=buf+(Ntxt-1-i)*256*txtwidth*4;\r
-    const mglColor& c=BC;\r
-    for(size_t k=0;k<256;k++)\r
-    {\r
-      for(size_t l=0;l<txtwidth;l++)\r
-      {\r
-        *f++ = int(255*c.r);\r
-        *f++ = int(255*c.g);\r
-        *f++ = int(255*c.b);\r
-        *f++ = int(255*c.a);\r
-      }\r
-    }\r
-  }\r
+       for(size_t i=0;i<256*Ntxt;i++)  pbuf[i] = buf+4*txtwidth*i;\r
+       for(size_t i=0;i<ntxt;i++)      gr->GetTxt(i).GetRGBAOBJ(buf+(Ntxt-1-i)*256*txtwidth*4);\r
+       for(size_t i=ntxt;i<Ntxt;i++)\r
+       {\r
+               unsigned char *f=buf+(Ntxt-1-i)*256*txtwidth*4;\r
+               const mglColor& c=BC;\r
+               for(size_t k=0;k<256;k++)\r
+               {\r
+               for(size_t l=0;l<txtwidth;l++)\r
+               {\r
+                       *f++ = int(255*c.r);\r
+                       *f++ = int(255*c.g);\r
+                       *f++ = int(255*c.b);\r
+                       *f++ = int(255*c.a);\r
+               }\r
+               }\r
+       }\r
        if(use_png)\r
-    mgl_pnga_save(tname,txtwidth,256*Ntxt,pbuf);\r
+               mgl_pnga_save(tname,txtwidth,256*Ntxt,pbuf);\r
        else\r
                mgl_tga_save(tname,txtwidth,256*Ntxt,pbuf);\r
        free(pbuf);\r
        delete []buf;\r
-  \r
-  ObjMaterials materials(fpmat);\r
-  \r
+\r
+       ObjMaterials materials(fpmat);\r
+\r
        // primitive definition in groups\r
-  \r
+\r
        tname[len-4]='\0';\r
        fprintf(fp,"# Primitives Definitions\nmtllib %s.mtl\n",tname);\r
-       for(i=0;i<gr->Grp.size();i++)\r
+       for(size_t i=0;i<gr->Grp.size();i++)\r
        {\r
                std::vector<long> &p = gr->Grp[i].p;\r
-    ObjGroup grp(fp, vertexcoords);\r
-               for(j=0;j<p.size();j++)\r
+               ObjGroup grp(fp, vertexcoords);\r
+               for(size_t j=0;j<p.size();j++)\r
                {\r
                        const mglPrim &q = gr->GetPrm(p[j],false);\r
 \r
-      register long n1=q.n1,n2=q.n2,n3=q.n3,n4=q.n4;\r
-      switch(q.type)\r
-      {\r
-        case 0:\r
-        if (gr->GetPnt(q.n1).a > mgl_min_a) {\r
-          const mglPnt p = gr->GetPnt(q.n1) - p0;\r
-          const mreal size = q.s;\r
-          const char type = q.n4;\r
-          mreal ss=size;\r
-          const mglColor c(p.r, p.g, p.b, p.a);\r
-          \r
-          if(!strchr("xsSoO",type))    ss *= 1.1;\r
-          if(type=='.' || ss==0)\r
-          {\r
-            const size_t m = materials.addColor(c);\r
-            grp.addPoint(m, vcs[n1]);\r
-          }\r
-          else\r
-           switch(type)\r
-           {\r
-              case 'P':\r
-              {\r
-                const size_t m = materials.addColor(c);\r
-                const mreal P[5][3] =\r
-                {\r
-                  { p.x-ss,p.y-ss,p.z },\r
-                  { p.x+ss,p.y-ss,p.z },\r
-                  { p.x+ss,p.y+ss,p.z },\r
-                  { p.x-ss,p.y+ss,p.z },\r
-                  { p.x-ss,p.y-ss,p.z }\r
-                };\r
-                grp.addLines(m, 5, P);\r
-              }\r
-              case '+':\r
-              {\r
-                const size_t m = materials.addColor(c);\r
-                const mreal P1[2][3] =\r
-                {\r
-                  { p.x-ss,p.y,p.z },\r
-                  { p.x+ss,p.y,p.z }\r
-                };\r
-                grp.addLines(m, 2, P1);\r
-                const mreal P2[2][3] =\r
-                {\r
-                  { p.x,p.y-ss,p.z },\r
-                  { p.x,p.y+ss,p.z }\r
-                };\r
-                grp.addLines(m, 2, P2);\r
-              }\r
-                break;\r
-              case 'X':\r
-              {\r
-                const size_t m = materials.addColor(c);\r
-                const mreal P[5][3] =\r
-                {\r
-                  { p.x-ss,p.y-ss,p.z },\r
-                  { p.x+ss,p.y-ss,p.z },\r
-                  { p.x+ss,p.y+ss,p.z },\r
-                  { p.x-ss,p.y+ss,p.z },\r
-                  { p.x-ss,p.y-ss,p.z }\r
-                };\r
-                grp.addLines(m, 5, P);\r
-                const mreal P1[2][3] =\r
-                {\r
-                  { p.x-ss,p.y-ss,p.z },\r
-                  { p.x+ss,p.y+ss,p.z }\r
-                };\r
-                grp.addLines(m, 2, P1);\r
-                const mreal P2[2][3] =\r
-                {\r
-                  { p.x+ss,p.y-ss,p.z },\r
-                  { p.x-ss,p.y+ss,p.z }\r
-                };\r
-                grp.addLines(m, 2, P2);\r
-              }\r
-                break;\r
-              case 'x':\r
-              {\r
-                const size_t m = materials.addColor(c);\r
-                const mreal P1[2][3] =\r
-                {\r
-                  { p.x-ss,p.y-ss,p.z },\r
-                  { p.x+ss,p.y+ss,p.z }\r
-                };\r
-                grp.addLines(m, 2, P1);\r
-                const mreal P2[2][3] =\r
-                {\r
-                  { p.x+ss,p.y-ss,p.z },\r
-                  { p.x-ss,p.y+ss,p.z }\r
-                };\r
-                grp.addLines(m, 2, P2);\r
-              }\r
-                break;\r
-              case 'S':\r
-              {\r
-                const size_t ti = tcs[n1]; grp.addColourInfo(p);\r
-                \r
-                const size_t pi1 = vertexcoords.addVertexCoords(p.x-ss,p.y-ss,p.z);\r
-                const size_t pi2 = vertexcoords.addVertexCoords(p.x+ss,p.y-ss,p.z);\r
-                const size_t pi3 = vertexcoords.addVertexCoords(p.x-ss,p.y+ss,p.z);\r
-                const size_t pi4 = vertexcoords.addVertexCoords(p.x+ss,p.y+ss,p.z);\r
-                \r
-                grp.addTriangle(pi1, ti, pi2, ti, pi3, ti);\r
-                grp.addTriangle(pi4, ti, pi3, ti, pi2, ti);\r
-              }\r
-                break;\r
-              case 's':\r
-              {\r
-                const size_t m = materials.addColor(c);\r
-                const mreal P[5][3] =\r
-                {\r
-                  { p.x-ss,p.y-ss,p.z },\r
-                  { p.x+ss,p.y-ss,p.z },\r
-                  { p.x+ss,p.y+ss,p.z },\r
-                  { p.x-ss,p.y+ss,p.z },\r
-                  { p.x-ss,p.y-ss,p.z }\r
-                };\r
-                grp.addLines(m, 5, P);\r
-              }\r
-                break;\r
-              case 'D':\r
-              {\r
-                const size_t ti = tcs[n1]; grp.addColourInfo(p);\r
-                \r
-                const size_t pi1 = vertexcoords.addVertexCoords(p.x,p.y-ss,p.z);\r
-                const size_t pi2 = vertexcoords.addVertexCoords(p.x+ss,p.y,p.z);\r
-                const size_t pi3 = vertexcoords.addVertexCoords(p.x-ss,p.y,p.z);\r
-                const size_t pi4 = vertexcoords.addVertexCoords(p.x,p.y+ss,p.z);\r
-                \r
-                grp.addTriangle(pi1, ti, pi2, ti, pi3, ti);\r
-                grp.addTriangle(pi4, ti, pi3, ti, pi2, ti);\r
-              }\r
-                break;\r
-              case 'd':\r
-              {\r
-                const size_t m = materials.addColor(c);\r
-                const mreal P[5][3] =\r
-                {\r
-                  { p.x,p.y-ss,p.z },\r
-                  { p.x+ss,p.y,p.z },\r
-                  { p.x,p.y+ss,p.z },\r
-                  { p.x-ss,p.y,p.z },\r
-                  { p.x,p.y-ss,p.z }\r
-                };\r
-                grp.addLines(m, 5, P);\r
-              }\r
-                break;\r
-              case 'Y':\r
-              {\r
-                const size_t m = materials.addColor(c);\r
-                const mreal P1[3][3] =\r
-                {\r
-                  { p.x,                        p.y-ss,                p.z },\r
-                  { p.x,                        p.y,                    p.z },\r
-                  { p.x+0.8*ss,p.y+0.6*ss,p.z }\r
-                };\r
-                grp.addLines(m, 3, P1);\r
-                const mreal P2[2][3] =\r
-                {\r
-                  { p.x,                        p.y,                    p.z },\r
-                  { p.x-0.8*ss,p.y+0.6*ss,p.z }\r
-                };\r
-                grp.addLines(m, 2, P2);\r
-              }\r
-                break;\r
-              case '*':\r
-              {\r
-                const size_t m = materials.addColor(c);\r
-                const mreal P1[2][3] =\r
-                {\r
-                  { p.x-ss,p.y,p.z },\r
-                  { p.x+ss,p.y,p.z }\r
-                };\r
-                grp.addLines(m, 2, P1);\r
-                const mreal P2[2][3] =\r
-                {\r
-                  { p.x-0.6*ss,p.y-0.8*ss,p.z },\r
-                  { p.x+0.6*ss,p.y+0.8*ss,p.z }\r
-                };\r
-                grp.addLines(m, 2, P2);\r
-                const mreal P3[2][3] =\r
-                {\r
-                  { p.x-0.6*ss,p.y+0.8*ss,p.z },\r
-                  { p.x+0.6*ss,p.y-0.8*ss,p.z }\r
-                };\r
-                grp.addLines(m, 2, P3);\r
-                \r
-              }\r
-                break;\r
-              case 'T':\r
-              {\r
-                const size_t ti = tcs[n1]; grp.addColourInfo(p);\r
-                \r
-                const size_t pi1 = vertexcoords.addVertexCoords(p.x-ss,p.y-ss/2,p.z);\r
-                const size_t pi2 = vertexcoords.addVertexCoords(p.x+ss,p.y-ss/2,p.z);\r
-                const size_t pi3 = vertexcoords.addVertexCoords(p.x,p.y+ss,p.z);\r
-                \r
-                grp.addTriangle(pi1, ti, pi2, ti, pi3, ti);\r
-              }\r
-                break;\r
-              case '^':\r
-              {\r
-                const size_t m = materials.addColor(c);\r
-                const mreal P[4][3] =\r
-                {\r
-                  { p.x-ss,p.y-ss/2,p.z },\r
-                  { p.x+ss,p.y-ss/2,p.z },\r
-                  { p.x,        p.y+ss,        p.z },\r
-                  { p.x-ss,p.y-ss/2,p.z }\r
-                };\r
-                grp.addLines(m, 4, P);\r
-              }\r
-                break;\r
-              case 'V':\r
-              {\r
-                const size_t ti = tcs[n1]; grp.addColourInfo(p);\r
-                \r
-                const size_t pi1 = vertexcoords.addVertexCoords(p.x-ss,p.y+ss/2,p.z);\r
-                const size_t pi2 = vertexcoords.addVertexCoords(p.x,p.y-ss,p.z);\r
-                const size_t pi3 = vertexcoords.addVertexCoords(p.x+ss,p.y+ss/2,p.z);\r
-                \r
-                grp.addTriangle(pi1, ti, pi2, ti, pi3, ti);\r
-              }\r
-                break;\r
-              case 'v':\r
-              {\r
-                const size_t m = materials.addColor(c);\r
-                const mreal P[4][3] =\r
-                {\r
-                  { p.x-ss,p.y+ss/2,p.z },\r
-                  { p.x+ss,p.y+ss/2,p.z },\r
-                  { p.x,        p.y-ss,        p.z },\r
-                  { p.x-ss,p.y+ss/2,p.z }\r
-                };\r
-                grp.addLines(m, 4, P);\r
-              }\r
-                break;\r
-              case 'L':\r
-              {\r
-                const size_t ti = tcs[n1]; grp.addColourInfo(p);\r
-                \r
-                const size_t pi1 = vertexcoords.addVertexCoords(p.x+ss/2,p.y+ss,p.z);\r
-                const size_t pi2 = vertexcoords.addVertexCoords(p.x-ss,        p.y,     p.z);\r
-                const size_t pi3 = vertexcoords.addVertexCoords(p.x+ss/2,p.y-ss,p.z);\r
-                \r
-                grp.addTriangle(pi1, ti, pi2, ti, pi3, ti);\r
-              }\r
-                break;\r
-              case '<':\r
-              {\r
-                const size_t m = materials.addColor(c);\r
-                const mreal P[4][3] =\r
-                {\r
-                  { p.x+ss/2,p.y+ss,p.z },\r
-                  { p.x+ss/2,p.y-ss,p.z },\r
-                  { p.x-ss,    p.y,     p.z },\r
-                  { p.x+ss/2,p.y+ss,p.z }\r
-                };\r
-                grp.addLines(m, 4, P);\r
-              }\r
-                break;\r
-              case 'R':\r
-              {\r
-                const size_t ti = tcs[n1]; grp.addColourInfo(p);\r
-                \r
-                const size_t pi1 = vertexcoords.addVertexCoords(p.x-ss/2,p.y+ss,p.z);\r
-                const size_t pi2 = vertexcoords.addVertexCoords(p.x-ss/2,p.y-ss,p.z);\r
-                const size_t pi3 = vertexcoords.addVertexCoords(p.x+ss,        p.y,     p.z);\r
-                \r
-                grp.addTriangle(pi1, ti, pi2, ti, pi3, ti);\r
-              }\r
-                break;\r
-              case '>':\r
-              {\r
-                const size_t m = materials.addColor(c);\r
-                const mreal P[4][3] =\r
-                {\r
-                  { p.x-ss/2,p.y+ss,p.z },\r
-                  { p.x-ss/2,p.y-ss,p.z },\r
-                  { p.x+ss,    p.y,     p.z },\r
-                  { p.x-ss/2,p.y+ss,p.z }\r
-                };\r
-                grp.addLines(m, 4, P);\r
-              }\r
-                break;\r
-              case 'O':\r
-              {\r
-                const size_t ti = tcs[n1]; grp.addColourInfo(p);\r
-                \r
-                const size_t cpi=vertexcoords.addVertexCoords(p.x, p.y, p.z);\r
-                size_t pnti[21];\r
-                for(size_t k=0;k<=20;k++)\r
-                  pnti[k]=vertexcoords.addVertexCoords(p.x+ss*cos(k*M_PI/10),p.y+ss*sin(k*M_PI/10),p.z);\r
-                for(size_t k=0;k<20;k++) {\r
-                  grp.addTriangle(pnti[k], ti, pnti[k+1], ti, cpi, ti);\r
-                }\r
-              }\r
-                break;\r
-              case 'C':\r
-              {\r
-                const size_t m = materials.addColor(c);\r
-                grp.addPoint(m, vcs[n1]);\r
-              }\r
-              case 'o':\r
-              {\r
-                const size_t m = materials.addColor(c);\r
-                mreal P[21][3];\r
-                for(size_t k=0;k<=20;k++) {\r
-                  P[k][0] = p.x+ss*cos(k*M_PI/10);\r
-                  P[k][1] = p.y+ss*sin(k*M_PI/10);\r
-                  P[k][2] = p.z;\r
-                }\r
-                grp.addLines(m, 21, P);\r
-              }\r
-                break;\r
-            } \r
-        }\r
-          break;\r
-        case 1:\r
-        if (gr->GetPnt(q.n1).a > mgl_min_a || gr->GetPnt(q.n2).a > mgl_min_a) {\r
-          const mglPnt& p1 = gr->GetPnt(q.n1);\r
-          const mglPnt& p2 = gr->GetPnt(q.n2);\r
-          const size_t m = materials.addColor((p1.r+p2.r)/2, (p1.g+p2.g)/2, (p1.b+p2.b)/2, (p1.a+p2.a)/2);\r
-          grp.addSegment(m, vcs[n1], vcs[n2]);\r
-        }\r
-          break;\r
-        case 2:\r
-        if (gr->GetPnt(q.n1).a > mgl_min_a || gr->GetPnt(q.n2).a > mgl_min_a || gr->GetPnt(q.n3).a > mgl_min_a) {\r
-          grp.addTriangle(vcs[n1],tcs[n1], vcs[n2],tcs[n2], vcs[n3],tcs[n3]);\r
-          grp.addColourInfo(gr->GetPnt(n1));\r
-          grp.addColourInfo(gr->GetPnt(n2));\r
-          grp.addColourInfo(gr->GetPnt(n3));\r
-        }\r
-          break;\r
-        case 3:\r
-        if (gr->GetPnt(q.n1).a > mgl_min_a || gr->GetPnt(q.n2).a > mgl_min_a || gr->GetPnt(q.n3).a > mgl_min_a || gr->GetPnt(q.n4).a > mgl_min_a) {\r
-          grp.addTriangle(vcs[n1],tcs[n1], vcs[n2],tcs[n2], vcs[n3],tcs[n3]);\r
-          grp.addTriangle(vcs[n2],tcs[n2], vcs[n4],tcs[n4], vcs[n3],tcs[n3]);\r
-          grp.addColourInfo(gr->GetPnt(n1));\r
-          grp.addColourInfo(gr->GetPnt(n2));\r
-          grp.addColourInfo(gr->GetPnt(n3));\r
-          grp.addColourInfo(gr->GetPnt(n4));\r
-        }\r
-          break;\r
-        case 4:\r
-        {\r
-          const mglPnt p = gr->GetPnt(q.n1) - p0;\r
-\r
-          const mreal f = q.p/2, dx=p.u/2, dy=p.v/2;\r
-          const mreal c=q.s*cos(q.w*M_PI/180), s=-q.s*sin(q.w*M_PI/180);\r
-          const double b[4] = {c,-s, s,c};\r
-          long ik,il=0;\r
-          \r
-          const mglGlyph &g = gr->GetGlf(q.n4);\r
-          const mreal dd = 0.004;\r
-          if(q.n3&8)\r
-          {\r
-            const size_t p_4 = vertexcoords.addVertexCoords(p.x+b[0]*dx+b[1]*(dy-dd),p.y+b[2]*dx+b[3]*(dy-dd),p.z);\r
-            const size_t p_3 = vertexcoords.addVertexCoords(p.x+b[0]*dx+b[1]*(dy+dd),p.y+b[2]*dx+b[3]*(dy+dd),p.z);\r
-            const size_t p_2 = vertexcoords.addVertexCoords(p.x+b[0]*(dx+f)+b[1]*(dy-dd),p.y+b[2]*dx+b[3]*(dy-dd),p.z);\r
-            const size_t p_1 = vertexcoords.addVertexCoords(p.x+b[0]*(dx+f)+b[1]*(dy+dd),p.y+b[2]*dx+b[3]*(dy+dd),p.z);\r
-            \r
-            if(!(q.n3&4))      // glyph_line(p,f,true, d);\r
-            {\r
-              const size_t ti = tcs[n1]; grp.addColourInfo(p);\r
-              grp.addMonoTriangle(ti, p_1, p_3, p_2);\r
-              grp.addMonoTriangle(ti, p_4, p_2, p_3);\r
-            }\r
-            else       // glyph_line(p,f,false, d);\r
-            {\r
-              const size_t m = materials.addColor(p.r, p.g, p.b, p.a);\r
-              grp.addSegment(m, p_1, p_2);\r
-              grp.addSegment(m, p_3, p_4);\r
-              grp.addSegment(m, p_1, p_3);\r
-              grp.addSegment(m, p_2, p_4);\r
-            }\r
-          }\r
-          else\r
-          {\r
-            if(!(q.n3&4))      // glyph_fill(p,f,g, d);\r
-            {\r
-              for(ik=0;ik<g.nt;ik++)\r
-              {\r
-                mreal x,y;\r
-                x = dx+f*g.trig[6*ik];         y = dy+f*g.trig[6*ik+1];\r
-                const size_t p_3 = vertexcoords.addVertexCoords(p.x+b[0]*x+b[1]*y,p.y+b[2]*x+b[3]*y,p.z);\r
-                x = dx+f*g.trig[6*ik+2];       y = dy+f*g.trig[6*ik+3];\r
-                const size_t p_2 = vertexcoords.addVertexCoords(p.x+b[0]*x+b[1]*y,p.y+b[2]*x+b[3]*y,p.z);\r
-                x = dx+f*g.trig[6*ik+4];       y = dy+f*g.trig[6*ik+5];\r
-                const size_t p_1 = vertexcoords.addVertexCoords(p.x+b[0]*x+b[1]*y,p.y+b[2]*x+b[3]*y,p.z);\r
-\r
-                const size_t ti = tcs[n1]; grp.addColourInfo(p);\r
-                grp.addMonoTriangle(ti, p_1, p_3, p_2);\r
-              }\r
-            }\r
-            else       // glyph_wire(p,f,g, d);\r
-            {\r
-              const size_t m = materials.addColor(p.r, p.g, p.b, p.a);\r
-              for(ik=0;ik<g.nl;ik++)\r
-              {\r
-                mreal x,y;\r
-                x = g.line[2*ik];      y = g.line[2*ik+1];\r
-                if(x==0x3fff && y==0x3fff)     // line breakthrough\r
-                {      il = ik+1;      continue;       }\r
-                else if(ik==g.nl-1 || (g.line[2*ik+2]==0x3fff && g.line[2*ik+3]==0x3fff))\r
-                {      // enclose the circle. May be in future this block should be commented\r
-                  x = dx+f*g.line[2*ik];               y = dy+f*g.line[2*ik+1];\r
-                  const size_t p_2 = vertexcoords.addVertexCoords(p.x+b[0]*x+b[1]*y,p.y+b[2]*x+b[3]*y,p.z);\r
-                  x = dx+f*g.line[2*il];               y = dy+f*g.line[2*il+1];\r
-                  const size_t p_1 = vertexcoords.addVertexCoords(p.x+b[0]*x+b[1]*y,p.y+b[2]*x+b[3]*y,p.z);\r
-                  grp.addSegment(m, p_1, p_2);\r
-                }\r
-                else\r
-                {      // normal line\r
-                  x = dx+f*g.line[2*ik];               y = dy+f*g.line[2*ik+1];\r
-                  const size_t p_2 = vertexcoords.addVertexCoords(p.x+b[0]*x+b[1]*y,p.y+b[2]*x+b[3]*y,p.z);\r
-                  x = dx+f*g.line[2*ik+2];     y = dy+f*g.line[2*ik+3];\r
-                  const size_t p_1 = vertexcoords.addVertexCoords(p.x+b[0]*x+b[1]*y,p.y+b[2]*x+b[3]*y,p.z);\r
-                  grp.addSegment(m, p_1, p_2);\r
-                }\r
-\r
-              }\r
-            }\r
-          }\r
-\r
-        }\r
-          break;\r
-      }\r
+                       long n1=q.n1,n2=q.n2,n3=q.n3,n4=q.n4;\r
+                       switch(q.type)\r
+                       {\r
+                               case 0:\r
+                               if (gr->GetPnt(q.n1).a > mgl_min_a) {\r
+                               const mglPnt p = gr->GetPnt(q.n1) - p0;\r
+                               const mreal size = q.s;\r
+                               const char type = q.n4;\r
+                               mreal ss=size;\r
+                               const mglColor c(p.r, p.g, p.b, p.a);\r
+\r
+                               if(!strchr("xsSoO",type))       ss *= 1.1;\r
+                               if(type=='.' || ss==0)\r
+                               {\r
+                                       const size_t m = materials.addColor(c);\r
+                                       grp.addPoint(m, vcs[n1]);\r
+                               }\r
+                               else\r
+                               switch(type)\r
+                               {\r
+                                       case 'P':\r
+                                       {\r
+                                               const size_t m = materials.addColor(c);\r
+                                               const mreal P[5][3] =\r
+                                               {\r
+                                               { p.x-ss,p.y-ss,p.z },\r
+                                               { p.x+ss,p.y-ss,p.z },\r
+                                               { p.x+ss,p.y+ss,p.z },\r
+                                               { p.x-ss,p.y+ss,p.z },\r
+                                               { p.x-ss,p.y-ss,p.z }\r
+                                               };\r
+                                               grp.addLines(m, 5, P);\r
+                                       }\r
+                                       case '+':\r
+                                       {\r
+                                               const size_t m = materials.addColor(c);\r
+                                               const mreal P1[2][3] =\r
+                                               {\r
+                                               { p.x-ss,p.y,p.z },\r
+                                               { p.x+ss,p.y,p.z }\r
+                                               };\r
+                                               grp.addLines(m, 2, P1);\r
+                                               const mreal P2[2][3] =\r
+                                               {\r
+                                               { p.x,p.y-ss,p.z },\r
+                                               { p.x,p.y+ss,p.z }\r
+                                               };\r
+                                               grp.addLines(m, 2, P2);\r
+                                       }\r
+                                               break;\r
+                                       case 'X':\r
+                                       {\r
+                                               const size_t m = materials.addColor(c);\r
+                                               const mreal P[5][3] =\r
+                                               {\r
+                                               { p.x-ss,p.y-ss,p.z },\r
+                                               { p.x+ss,p.y-ss,p.z },\r
+                                               { p.x+ss,p.y+ss,p.z },\r
+                                               { p.x-ss,p.y+ss,p.z },\r
+                                               { p.x-ss,p.y-ss,p.z }\r
+                                               };\r
+                                               grp.addLines(m, 5, P);\r
+                                               const mreal P1[2][3] =\r
+                                               {\r
+                                               { p.x-ss,p.y-ss,p.z },\r
+                                               { p.x+ss,p.y+ss,p.z }\r
+                                               };\r
+                                               grp.addLines(m, 2, P1);\r
+                                               const mreal P2[2][3] =\r
+                                               {\r
+                                               { p.x+ss,p.y-ss,p.z },\r
+                                               { p.x-ss,p.y+ss,p.z }\r
+                                               };\r
+                                               grp.addLines(m, 2, P2);\r
+                                       }\r
+                                               break;\r
+                                       case 'x':\r
+                                       {\r
+                                               const size_t m = materials.addColor(c);\r
+                                               const mreal P1[2][3] =\r
+                                               {\r
+                                               { p.x-ss,p.y-ss,p.z },\r
+                                               { p.x+ss,p.y+ss,p.z }\r
+                                               };\r
+                                               grp.addLines(m, 2, P1);\r
+                                               const mreal P2[2][3] =\r
+                                               {\r
+                                               { p.x+ss,p.y-ss,p.z },\r
+                                               { p.x-ss,p.y+ss,p.z }\r
+                                               };\r
+                                               grp.addLines(m, 2, P2);\r
+                                       }\r
+                                               break;\r
+                                       case 'S':\r
+                                       {\r
+                                               const size_t ti = tcs[n1]; grp.addColourInfo(p);\r
+\r
+                                               const size_t pi1 = vertexcoords.addVertexCoords(p.x-ss,p.y-ss,p.z);\r
+                                               const size_t pi2 = vertexcoords.addVertexCoords(p.x+ss,p.y-ss,p.z);\r
+                                               const size_t pi3 = vertexcoords.addVertexCoords(p.x-ss,p.y+ss,p.z);\r
+                                               const size_t pi4 = vertexcoords.addVertexCoords(p.x+ss,p.y+ss,p.z);\r
+\r
+                                               grp.addTriangle(pi1, ti, pi2, ti, pi3, ti);\r
+                                               grp.addTriangle(pi4, ti, pi3, ti, pi2, ti);\r
+                                       }\r
+                                               break;\r
+                                       case 's':\r
+                                       {\r
+                                               const size_t m = materials.addColor(c);\r
+                                               const mreal P[5][3] =\r
+                                               {\r
+                                               { p.x-ss,p.y-ss,p.z },\r
+                                               { p.x+ss,p.y-ss,p.z },\r
+                                               { p.x+ss,p.y+ss,p.z },\r
+                                               { p.x-ss,p.y+ss,p.z },\r
+                                               { p.x-ss,p.y-ss,p.z }\r
+                                               };\r
+                                               grp.addLines(m, 5, P);\r
+                                       }\r
+                                               break;\r
+                                       case 'D':\r
+                                       {\r
+                                               const size_t ti = tcs[n1]; grp.addColourInfo(p);\r
+\r
+                                               const size_t pi1 = vertexcoords.addVertexCoords(p.x,p.y-ss,p.z);\r
+                                               const size_t pi2 = vertexcoords.addVertexCoords(p.x+ss,p.y,p.z);\r
+                                               const size_t pi3 = vertexcoords.addVertexCoords(p.x-ss,p.y,p.z);\r
+                                               const size_t pi4 = vertexcoords.addVertexCoords(p.x,p.y+ss,p.z);\r
+\r
+                                               grp.addTriangle(pi1, ti, pi2, ti, pi3, ti);\r
+                                               grp.addTriangle(pi4, ti, pi3, ti, pi2, ti);\r
+                                       }\r
+                                               break;\r
+                                       case 'd':\r
+                                       {\r
+                                               const size_t m = materials.addColor(c);\r
+                                               const mreal P[5][3] =\r
+                                               {\r
+                                               { p.x,p.y-ss,p.z },\r
+                                               { p.x+ss,p.y,p.z },\r
+                                               { p.x,p.y+ss,p.z },\r
+                                               { p.x-ss,p.y,p.z },\r
+                                               { p.x,p.y-ss,p.z }\r
+                                               };\r
+                                               grp.addLines(m, 5, P);\r
+                                       }\r
+                                               break;\r
+                                       case 'Y':\r
+                                       {\r
+                                               const size_t m = materials.addColor(c);\r
+                                               const mreal P1[3][3] =\r
+                                               {\r
+                                               { p.x,                   p.y-ss,                p.z },\r
+                                               { p.x,                   p.y,                    p.z },\r
+                                               { p.x+0.8*ss,p.y+0.6*ss,p.z }\r
+                                               };\r
+                                               grp.addLines(m, 3, P1);\r
+                                               const mreal P2[2][3] =\r
+                                               {\r
+                                               { p.x,                   p.y,                    p.z },\r
+                                               { p.x-0.8*ss,p.y+0.6*ss,p.z }\r
+                                               };\r
+                                               grp.addLines(m, 2, P2);\r
+                                       }\r
+                                               break;\r
+                                       case '*':\r
+                                       {\r
+                                               const size_t m = materials.addColor(c);\r
+                                               const mreal P1[2][3] =\r
+                                               {\r
+                                               { p.x-ss,p.y,p.z },\r
+                                               { p.x+ss,p.y,p.z }\r
+                                               };\r
+                                               grp.addLines(m, 2, P1);\r
+                                               const mreal P2[2][3] =\r
+                                               {\r
+                                               { p.x-0.6*ss,p.y-0.8*ss,p.z },\r
+                                               { p.x+0.6*ss,p.y+0.8*ss,p.z }\r
+                                               };\r
+                                               grp.addLines(m, 2, P2);\r
+                                               const mreal P3[2][3] =\r
+                                               {\r
+                                               { p.x-0.6*ss,p.y+0.8*ss,p.z },\r
+                                               { p.x+0.6*ss,p.y-0.8*ss,p.z }\r
+                                               };\r
+                                               grp.addLines(m, 2, P3);\r
+\r
+                                       }\r
+                                               break;\r
+                                       case 'T':\r
+                                       {\r
+                                               const size_t ti = tcs[n1]; grp.addColourInfo(p);\r
+\r
+                                               const size_t pi1 = vertexcoords.addVertexCoords(p.x-ss,p.y-ss/2,p.z);\r
+                                               const size_t pi2 = vertexcoords.addVertexCoords(p.x+ss,p.y-ss/2,p.z);\r
+                                               const size_t pi3 = vertexcoords.addVertexCoords(p.x,p.y+ss,p.z);\r
+\r
+                                               grp.addTriangle(pi1, ti, pi2, ti, pi3, ti);\r
+                                       }\r
+                                               break;\r
+                                       case '^':\r
+                                       {\r
+                                               const size_t m = materials.addColor(c);\r
+                                               const mreal P[4][3] =\r
+                                               {\r
+                                               { p.x-ss,p.y-ss/2,p.z },\r
+                                               { p.x+ss,p.y-ss/2,p.z },\r
+                                               { p.x,   p.y+ss,        p.z },\r
+                                               { p.x-ss,p.y-ss/2,p.z }\r
+                                               };\r
+                                               grp.addLines(m, 4, P);\r
+                                       }\r
+                                               break;\r
+                                       case 'V':\r
+                                       {\r
+                                               const size_t ti = tcs[n1]; grp.addColourInfo(p);\r
+\r
+                                               const size_t pi1 = vertexcoords.addVertexCoords(p.x-ss,p.y+ss/2,p.z);\r
+                                               const size_t pi2 = vertexcoords.addVertexCoords(p.x,p.y-ss,p.z);\r
+                                               const size_t pi3 = vertexcoords.addVertexCoords(p.x+ss,p.y+ss/2,p.z);\r
+\r
+                                               grp.addTriangle(pi1, ti, pi2, ti, pi3, ti);\r
+                                       }\r
+                                               break;\r
+                                       case 'v':\r
+                                       {\r
+                                               const size_t m = materials.addColor(c);\r
+                                               const mreal P[4][3] =\r
+                                               {\r
+                                               { p.x-ss,p.y+ss/2,p.z },\r
+                                               { p.x+ss,p.y+ss/2,p.z },\r
+                                               { p.x,   p.y-ss,        p.z },\r
+                                               { p.x-ss,p.y+ss/2,p.z }\r
+                                               };\r
+                                               grp.addLines(m, 4, P);\r
+                                       }\r
+                                               break;\r
+                                       case 'L':\r
+                                       {\r
+                                               const size_t ti = tcs[n1]; grp.addColourInfo(p);\r
+\r
+                                               const size_t pi1 = vertexcoords.addVertexCoords(p.x+ss/2,p.y+ss,p.z);\r
+                                               const size_t pi2 = vertexcoords.addVertexCoords(p.x-ss, p.y,     p.z);\r
+                                               const size_t pi3 = vertexcoords.addVertexCoords(p.x+ss/2,p.y-ss,p.z);\r
+\r
+                                               grp.addTriangle(pi1, ti, pi2, ti, pi3, ti);\r
+                                       }\r
+                                               break;\r
+                                       case '<':\r
+                                       {\r
+                                               const size_t m = materials.addColor(c);\r
+                                               const mreal P[4][3] =\r
+                                               {\r
+                                               { p.x+ss/2,p.y+ss,p.z },\r
+                                               { p.x+ss/2,p.y-ss,p.z },\r
+                                               { p.x-ss,       p.y,     p.z },\r
+                                               { p.x+ss/2,p.y+ss,p.z }\r
+                                               };\r
+                                               grp.addLines(m, 4, P);\r
+                                       }\r
+                                               break;\r
+                                       case 'R':\r
+                                       {\r
+                                               const size_t ti = tcs[n1]; grp.addColourInfo(p);\r
+\r
+                                               const size_t pi1 = vertexcoords.addVertexCoords(p.x-ss/2,p.y+ss,p.z);\r
+                                               const size_t pi2 = vertexcoords.addVertexCoords(p.x-ss/2,p.y-ss,p.z);\r
+                                               const size_t pi3 = vertexcoords.addVertexCoords(p.x+ss, p.y,     p.z);\r
+\r
+                                               grp.addTriangle(pi1, ti, pi2, ti, pi3, ti);\r
+                                       }\r
+                                               break;\r
+                                       case '>':\r
+                                       {\r
+                                               const size_t m = materials.addColor(c);\r
+                                               const mreal P[4][3] =\r
+                                               {\r
+                                               { p.x-ss/2,p.y+ss,p.z },\r
+                                               { p.x-ss/2,p.y-ss,p.z },\r
+                                               { p.x+ss,       p.y,     p.z },\r
+                                               { p.x-ss/2,p.y+ss,p.z }\r
+                                               };\r
+                                               grp.addLines(m, 4, P);\r
+                                       }\r
+                                               break;\r
+                                       case 'O':\r
+                                       {\r
+                                               const size_t ti = tcs[n1]; grp.addColourInfo(p);\r
+\r
+                                               const size_t cpi=vertexcoords.addVertexCoords(p.x, p.y, p.z);\r
+                                               size_t pnti[21];\r
+                                               for(size_t k=0;k<=20;k++)\r
+                                               pnti[k]=vertexcoords.addVertexCoords(p.x+ss*cos(k*M_PI/10),p.y+ss*sin(k*M_PI/10),p.z);\r
+                                               for(size_t k=0;k<20;k++) {\r
+                                               grp.addTriangle(pnti[k], ti, pnti[k+1], ti, cpi, ti);\r
+                                               }\r
+                                       }\r
+                                               break;\r
+                                       case 'C':\r
+                                       {\r
+                                               const size_t m = materials.addColor(c);\r
+                                               grp.addPoint(m, vcs[n1]);\r
+                                       }\r
+                                       case 'o':\r
+                                       {\r
+                                               const size_t m = materials.addColor(c);\r
+                                               mreal P[21][3];\r
+                                               for(size_t k=0;k<=20;k++) {\r
+                                               P[k][0] = p.x+ss*cos(k*M_PI/10);\r
+                                               P[k][1] = p.y+ss*sin(k*M_PI/10);\r
+                                               P[k][2] = p.z;\r
+                                               }\r
+                                               grp.addLines(m, 21, P);\r
+                                       }\r
+                                               break;\r
+                                       }\r
+                               }\r
+                               break;\r
+                               case 1:\r
+                               if (gr->GetPnt(q.n1).a > mgl_min_a || gr->GetPnt(q.n2).a > mgl_min_a) {\r
+                               const mglPnt& p1 = gr->GetPnt(q.n1);\r
+                               const mglPnt& p2 = gr->GetPnt(q.n2);\r
+                               const size_t m = materials.addColor((p1.r+p2.r)/2, (p1.g+p2.g)/2, (p1.b+p2.b)/2, (p1.a+p2.a)/2);\r
+                               grp.addSegment(m, vcs[n1], vcs[n2]);\r
+                               }\r
+                               break;\r
+                               case 2:\r
+                               if (gr->GetPnt(q.n1).a > mgl_min_a || gr->GetPnt(q.n2).a > mgl_min_a || gr->GetPnt(q.n3).a > mgl_min_a) {\r
+                               grp.addTriangle(vcs[n1],tcs[n1], vcs[n2],tcs[n2], vcs[n3],tcs[n3]);\r
+                               grp.addColourInfo(gr->GetPnt(n1));\r
+                               grp.addColourInfo(gr->GetPnt(n2));\r
+                               grp.addColourInfo(gr->GetPnt(n3));\r
+                               }\r
+                               break;\r
+                               case 3:\r
+                               if (gr->GetPnt(q.n1).a > mgl_min_a || gr->GetPnt(q.n2).a > mgl_min_a || gr->GetPnt(q.n3).a > mgl_min_a || gr->GetPnt(q.n4).a > mgl_min_a) {\r
+                               grp.addTriangle(vcs[n1],tcs[n1], vcs[n2],tcs[n2], vcs[n3],tcs[n3]);\r
+                               grp.addTriangle(vcs[n2],tcs[n2], vcs[n4],tcs[n4], vcs[n3],tcs[n3]);\r
+                               grp.addColourInfo(gr->GetPnt(n1));\r
+                               grp.addColourInfo(gr->GetPnt(n2));\r
+                               grp.addColourInfo(gr->GetPnt(n3));\r
+                               grp.addColourInfo(gr->GetPnt(n4));\r
+                               }\r
+                               break;\r
+                               case 4:\r
+                               {\r
+                               const mglPnt p = gr->GetPnt(q.n1) - p0;\r
+\r
+                               const mreal f = q.p/2, dx=p.u/2, dy=p.v/2;\r
+                               const mreal c=q.s*cos(q.w*M_PI/180), s=-q.s*sin(q.w*M_PI/180);\r
+                               const double b[4] = {c,-s, s,c};\r
+                               long ik,il=0;\r
+\r
+                               const mglGlyph &g = gr->GetGlf(q.n4);\r
+                               const mreal dd = 0.004;\r
+                               if(q.n3&8)\r
+                               {\r
+                                       const size_t p_4 = vertexcoords.addVertexCoords(p.x+b[0]*dx+b[1]*(dy-dd),p.y+b[2]*dx+b[3]*(dy-dd),p.z);\r
+                                       const size_t p_3 = vertexcoords.addVertexCoords(p.x+b[0]*dx+b[1]*(dy+dd),p.y+b[2]*dx+b[3]*(dy+dd),p.z);\r
+                                       const size_t p_2 = vertexcoords.addVertexCoords(p.x+b[0]*(dx+f)+b[1]*(dy-dd),p.y+b[2]*dx+b[3]*(dy-dd),p.z);\r
+                                       const size_t p_1 = vertexcoords.addVertexCoords(p.x+b[0]*(dx+f)+b[1]*(dy+dd),p.y+b[2]*dx+b[3]*(dy+dd),p.z);\r
+\r
+                                       if(!(q.n3&4))   // glyph_line(p,f,true, d);\r
+                                       {\r
+                                       const size_t ti = tcs[n1]; grp.addColourInfo(p);\r
+                                       grp.addMonoTriangle(ti, p_1, p_3, p_2);\r
+                                       grp.addMonoTriangle(ti, p_4, p_2, p_3);\r
+                                       }\r
+                                       else    // glyph_line(p,f,false, d);\r
+                                       {\r
+                                       const size_t m = materials.addColor(p.r, p.g, p.b, p.a);\r
+                                       grp.addSegment(m, p_1, p_2);\r
+                                       grp.addSegment(m, p_3, p_4);\r
+                                       grp.addSegment(m, p_1, p_3);\r
+                                       grp.addSegment(m, p_2, p_4);\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       if(!(q.n3&4))   // glyph_fill(p,f,g, d);\r
+                                       {\r
+                                       for(ik=0;ik<g.nt;ik++)\r
+                                       {\r
+                                               mreal x,y;\r
+                                               x = dx+f*g.trig[6*ik];          y = dy+f*g.trig[6*ik+1];\r
+                                               const size_t p_3 = vertexcoords.addVertexCoords(p.x+b[0]*x+b[1]*y,p.y+b[2]*x+b[3]*y,p.z);\r
+                                               x = dx+f*g.trig[6*ik+2];        y = dy+f*g.trig[6*ik+3];\r
+                                               const size_t p_2 = vertexcoords.addVertexCoords(p.x+b[0]*x+b[1]*y,p.y+b[2]*x+b[3]*y,p.z);\r
+                                               x = dx+f*g.trig[6*ik+4];        y = dy+f*g.trig[6*ik+5];\r
+                                               const size_t p_1 = vertexcoords.addVertexCoords(p.x+b[0]*x+b[1]*y,p.y+b[2]*x+b[3]*y,p.z);\r
+\r
+                                               const size_t ti = tcs[n1]; grp.addColourInfo(p);\r
+                                               grp.addMonoTriangle(ti, p_1, p_3, p_2);\r
+                                       }\r
+                                       }\r
+                                       else    // glyph_wire(p,f,g, d);\r
+                                       {\r
+                                       const size_t m = materials.addColor(p.r, p.g, p.b, p.a);\r
+                                       for(ik=0;ik<g.nl;ik++)\r
+                                       {\r
+                                               mreal x,y;\r
+                                               x = g.line[2*ik];       y = g.line[2*ik+1];\r
+                                               if(x==0x3fff && y==0x3fff)      // line breakthrough\r
+                                               {       il = ik+1;      continue;       }\r
+                                               else if(ik==g.nl-1 || (g.line[2*ik+2]==0x3fff && g.line[2*ik+3]==0x3fff))\r
+                                               {       // enclose the circle. May be in future this block should be commented\r
+                                               x = dx+f*g.line[2*ik];          y = dy+f*g.line[2*ik+1];\r
+                                               const size_t p_2 = vertexcoords.addVertexCoords(p.x+b[0]*x+b[1]*y,p.y+b[2]*x+b[3]*y,p.z);\r
+                                               x = dx+f*g.line[2*il];          y = dy+f*g.line[2*il+1];\r
+                                               const size_t p_1 = vertexcoords.addVertexCoords(p.x+b[0]*x+b[1]*y,p.y+b[2]*x+b[3]*y,p.z);\r
+                                               grp.addSegment(m, p_1, p_2);\r
+                                               }\r
+                                               else\r
+                                               {       // normal line\r
+                                               x = dx+f*g.line[2*ik];          y = dy+f*g.line[2*ik+1];\r
+                                               const size_t p_2 = vertexcoords.addVertexCoords(p.x+b[0]*x+b[1]*y,p.y+b[2]*x+b[3]*y,p.z);\r
+                                               x = dx+f*g.line[2*ik+2];        y = dy+f*g.line[2*ik+3];\r
+                                               const size_t p_1 = vertexcoords.addVertexCoords(p.x+b[0]*x+b[1]*y,p.y+b[2]*x+b[3]*y,p.z);\r
+                                               grp.addSegment(m, p_1, p_2);\r
+                                               }\r
+\r
+                                       }\r
+                                       }\r
+                               }\r
+\r
+                               }\r
+                               break;\r
+                       }\r
                }\r
-    if (!grp.triangles.empty() || !grp.lines.empty() || !grp.points.empty())\r
-      fprintf(fp,"g %s\n",gr->Grp[i].Lbl.c_str());\r
+               if (!grp.triangles.empty() || !grp.lines.empty() || !grp.points.empty())\r
+               fprintf(fp,"g %s\n",gr->Grp[i].Lbl.c_str());\r
+\r
+               if (!grp.triangles.empty()) {\r
+               if (grp.samecolor) {\r
+                       fprintf(fp,"usemtl Material%" PRIuS "\n", materials.addColor(grp.commoncolor));\r
+                       grp.writeTriangles();\r
+               } else {\r
+                       fprintf(fp,"usemtl Material\n");\r
+                       grp.writeTexturedTriangles();\r
+               }\r
+               }\r
+               grp.writeLines();\r
+               grp.writePoints();\r
 \r
-    if (!grp.triangles.empty()) {\r
-      if (grp.samecolor) {\r
-        fprintf(fp,"usemtl Material%" PRIuS "\n", materials.addColor(grp.commoncolor));\r
-        grp.writeTriangles();\r
-      } else {\r
-        fprintf(fp,"usemtl Material\n");\r
-        grp.writeTexturedTriangles();\r
-      }\r
-    }\r
-    grp.writeLines();\r
-    grp.writePoints();\r
-    \r
                gr->Grp[i].p.clear();   // we don't need indexes anymore\r
        }\r
        fclose(fp);\r
        fclose(fpmat);\r
-  delete []tname;\r
+       delete []tname;\r
 }\r
 \r
 void MGL_EXPORT mgl_write_obj_(uintptr_t *gr, const char *fname,const char *descr, int *use_png,int l,int n)\r
index f0bc69989e60003c1fbed6818a0abbd38a267d62..9c862a71c9cd0b47dfd361e9cbe16d9093f63bce 100644 (file)
@@ -62,18 +62,19 @@ void mglCanvasGL::Finish()
                for(size_t i=0;i<Prm.size();i++)\r
                {\r
                        p=GetPrm(i);    PDef=p.n3;      pPos=p.s;       PenWidth=p.w;\r
-                       register long n1=p.n1, n2=p.n2, n3=p.n3, n4=p.n4;\r
+                       long n1=p.n1, n2=p.n2, n3=p.n3, n4=p.n4;\r
+                       mglDrawReg d;   d.set(this,1,1,0);\r
                        switch(p.type)\r
                        {\r
 /*                     case 0: mark_draw(Pnt[n1],n4,p.s,0);    break;\r
                        case 1: line_draw(n1,n2);       break;\r
                        case 2: trig_draw(n1,n2,n3);    break;\r
                        case 3: quad_draw(n1,n2,n3,n4); break;*/\r
-                       case 0: mark_draw(Pnt[n1],n4,p.s,0);    break;\r
-                       case 1: line_draw(Pnt[n1],Pnt[n2],0);   break;\r
-                       case 2: trig_draw(Pnt[n1],Pnt[n2],Pnt[n3],true,0);      break;\r
-                       case 3: quad_draw(Pnt[n1],Pnt[n2],Pnt[n3],Pnt[n4],0);   break;\r
-                       case 4: glyph_draw(p,0);        break;\r
+                       case 0: mark_draw(Pnt[n1],n4,p.s,&d);   break;\r
+                       case 1: line_draw(Pnt[n1],Pnt[n2],&d);  break;\r
+                       case 2: trig_draw(Pnt[n1],Pnt[n2],Pnt[n3],true,&d);     break;\r
+                       case 3: quad_draw(Pnt[n1],Pnt[n2],Pnt[n3],Pnt[n4],&d);  break;\r
+                       case 4: glyph_draw(p,&d);       break;\r
                        }\r
                }\r
                PDef=pdef;      pPos=ss;        PenWidth=ww;\r
@@ -106,7 +107,7 @@ bool mglCanvasGL::Alpha(bool enable)
 void mglCanvasGL::AddLight(int n,mglPoint r,mglPoint d,char cc, mreal br,mreal ap)\r
 {\r
        mglColor c(cc);\r
-       float amb[4],dif[4],spc[4], pos[4],dir[4];\r
+       float amb[4],dif[4],spc[4], pos[4];\r
        bool inf = mgl_isnan(r.x);\r
        if(n<0 || n>7)  {       SetWarn(mglWarnLId,"AddLight"); return; }\r
        if(c.Valid())\r
@@ -126,7 +127,6 @@ void mglCanvasGL::AddLight(int n,mglPoint r,mglPoint d,char cc, mreal br,mreal a
        {       pos[0] = d.x;   pos[1] = d.y;   pos[2] = d.z;   pos[3] = 0;     }\r
        else\r
        {       pos[0] = r.x;   pos[1] = r.y;   pos[2] = r.z;   pos[3] = 1;     }\r
-       dir[0] = d.x;   dir[1] = d.y;   dir[2] = d.z;   dir[3] = 0;\r
 \r
        glShadeModel(GL_SMOOTH);\r
        glLightfv(GL_LIGHT0+n, GL_AMBIENT, amb);\r
@@ -135,8 +135,9 @@ void mglCanvasGL::AddLight(int n,mglPoint r,mglPoint d,char cc, mreal br,mreal a
        glLightfv(GL_LIGHT0+n, GL_POSITION, pos);\r
        if(!inf)\r
        {\r
-               glLightfv(GL_LIGHT0+n, GL_SPOT_DIRECTION, dir);\r
-               glLightf(GL_LIGHT0+n, GL_SPOT_CUTOFF, ap);\r
+//             float dir[4]={d.x, d.y, d.z, 0};\r
+//             glLightfv(GL_LIGHT0+n, GL_SPOT_DIRECTION, dir);\r
+//             glLightf(GL_LIGHT0+n, GL_SPOT_CUTOFF, ap);\r
        }\r
        glEnable(GL_LIGHT0+n);\r
 }\r
@@ -216,7 +217,6 @@ void mglCanvasGL::gl_clf(mglColor Back)
        if(Back==NC)    Back = WC;\r
 //     glDepthFunc(GL_LESS);\r
        glDepthFunc(GL_GREATER);\r
-//     back[0]=Back.r; back[1]=Back.g; back[2]=Back.b;\r
        glClearColor(Back.r,Back.g,Back.b,1.);\r
        glClearDepth(-10.);\r
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\r
@@ -224,14 +224,14 @@ void mglCanvasGL::gl_clf(mglColor Back)
 \r
        glMatrixMode(GL_MODELVIEW);//GL_MODELVIEW GL_VIEWPORT GL_PROJECTION\r
        glLoadIdentity();\r
-//     glScaled(1.5,1.5,1.5);\r
-//     glTranslated(-0.5,-0.5,-0.5);\r
        glScaled(2,2,2);\r
        glTranslated(-0.5,-0.5,-0.5);\r
-       \r
-//     float dif[4]={DifBr,DifBr,DifBr,1}, spc[4]={1,1,1,1};\r
-//     glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, dif);\r
-//     glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, spc);\r
+\r
+//     float dif[4]={DifBr,DifBr,DifBr,1};\r
+//     glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, dif);\r
+       float spc[4]={1,1,1,1};\r
+       glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, spc);\r
+       glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, DifBr);\r
 }\r
 //-----------------------------------------------------------------------------\r
 /*void mglCanvasGL::EndFrame()\r
@@ -444,7 +444,7 @@ void mglCanvasGL::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *
                case 'O':\r
 /*                     for(long j=long(-ss);j<=long(ss);j++)   for(long i=long(-ss);i<=long(ss);i++)\r
                        {\r
-                               register long x=long(q.x)+i, y=long(q.y)+j;\r
+                               long x=long(q.x)+i, y=long(q.y)+j;\r
                                if(i*i+j*j>=ss*ss || !d || x<d->x1 || x>d->x2 || y<d->y1 || y>d->y2)    continue;\r
                                pnt_plot(x,y,q.z+1,cs,d->ObjId);\r
                        }*/\r
@@ -467,3 +467,22 @@ void mglCanvasGL::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *
        }\r
 }\r
 //-----------------------------------------------------------------------------\r
+void mglCanvasGL::glyph_fill(mreal phi, const mglPnt &pp, mreal f, const mglGlyph &g, const mglDrawReg *d)\r
+{\r
+       if(!g.trig || g.nt<=0)  return;\r
+       const mreal co=cos(phi*M_PI/180), si=sin(phi*M_PI/180);\r
+       mglPnt q0=pp, q1=pp, q2=pp;\r
+       q0.u=q0.v=q1.u=q1.v=q2.u=q2.v=NAN;\r
+       for(long ik=0;ik<g.nt;ik++)\r
+       {\r
+               long ii = 6*ik; mreal x, y;\r
+               x = pp.u+g.trig[ii]*f;  y = pp.v+g.trig[ii+1]*f;\r
+               q0.x = pp.x+(x*co+y*si)/2;      q0.y = pp.y+(y*co-x*si)/2;      ii+=2;\r
+               x = pp.u+g.trig[ii]*f;  y = pp.v+g.trig[ii+1]*f;\r
+               q1.x = pp.x+(x*co+y*si)/2;      q1.y = pp.y+(y*co-x*si)/2;      ii+=2;\r
+               x = pp.u+g.trig[ii]*f;  y = pp.v+g.trig[ii+1]*f;\r
+               q2.x = pp.x+(x*co+y*si)/2;      q2.y = pp.y+(y*co-x*si)/2;\r
+               trig_draw(q0,q1,q2,false,d);\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
index 06549af8de32cd43a6211e7f5c4c024cb0e2420f..b0c9bb465216effea74e67c490b4054f848a3481 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * other.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -24,7 +24,9 @@
 #include "mgl2/data.h"\r
 #include "mgl2/base.h"\r
 //-----------------------------------------------------------------------------\r
-HCDT MGL_NO_EXPORT fill_slice_x(HMGL gr, double sv, HCDT a, mglData &xx, mglData &yy, mglData &zz, mglData &aa)\r
+void MGL_NO_EXPORT mgl_surf_gen(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, HCDT a, const char *sch);\r
+//-----------------------------------------------------------------------------\r
+HCDT MGL_NO_EXPORT fill_slice_x(HMGL gr, double sv, HCDT a, mglDataV &xx, mglDataV &yy, mglDataV &zz, mglData &aa)\r
 {\r
        long n=a->GetNx(),m=a->GetNy(),l=a->GetNz();\r
        if(l>1)\r
@@ -47,7 +49,7 @@ HCDT MGL_NO_EXPORT fill_slice_x(HMGL gr, double sv, HCDT a, mglData &xx, mglData
        return a;\r
 }\r
 //-----------------------------------------------------------------------------\r
-HCDT MGL_NO_EXPORT fill_slice_y(HMGL gr, double sv, HCDT a, mglData &xx, mglData &yy, mglData &zz, mglData &aa)\r
+HCDT MGL_NO_EXPORT fill_slice_y(HMGL gr, double sv, HCDT a, mglDataV &xx, mglDataV &yy, mglDataV &zz, mglData &aa)\r
 {\r
        long n=a->GetNx(),m=a->GetNy(),l=a->GetNz();\r
        if(l>1)\r
@@ -70,7 +72,7 @@ HCDT MGL_NO_EXPORT fill_slice_y(HMGL gr, double sv, HCDT a, mglData &xx, mglData
        return a;\r
 }\r
 //-----------------------------------------------------------------------------\r
-HCDT MGL_NO_EXPORT fill_slice_z(HMGL gr, double sv, HCDT a, mglData &xx, mglData &yy, mglData &zz, mglData &aa)\r
+HCDT MGL_NO_EXPORT fill_slice_z(HMGL gr, double sv, HCDT a, mglDataV &xx, mglDataV &yy, mglDataV &zz, mglData &aa)\r
 {\r
        long n=a->GetNx(),m=a->GetNy(),l=a->GetNz();\r
        xx.Create(n,m); yy.Create(n,m); zz.Create(n,m);\r
@@ -99,37 +101,37 @@ HCDT MGL_NO_EXPORT fill_slice_z(HMGL gr, double sv, HCDT a, mglData &xx, mglData
 void MGL_EXPORT mgl_dens_x(HMGL gr, HCDT a, const char *sch, double sv, const char *opt)\r
 {\r
        long n=a->GetNx(),m=a->GetNy();\r
-       if(mgl_isnan(sv))       sv = gr->GetOrgX('x');\r
        if(n<2 || m<2)  {       gr->SetWarn(mglWarnLow,"DensX");        return; }\r
-       if(sv<gr->Min.x || sv>gr->Max.x)        {       gr->SetWarn(mglWarnSlc,"DensX");        return; }\r
-       mglData xx,yy,zz,aa;\r
        gr->SaveState(opt);\r
+       if(mgl_isnan(sv))       sv = gr->GetOrgX('x');\r
+       if(sv<gr->Min.x || sv>gr->Max.x)        {       gr->SetWarn(mglWarnSlc,"DensX");        gr->LoadState();        return; }\r
+       mglDataV xx,yy,zz;      mglData aa;\r
        a = fill_slice_x(gr,sv,a,xx,yy,zz,aa);\r
-       mgl_surfc_xy(gr,&xx,&yy,&zz,a,sch,0);\r
+       mgl_surf_gen(gr, &xx,&yy,&zz,a, 0, sch);\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_dens_y(HMGL gr, HCDT a, const char *sch, double sv, const char *opt)\r
 {\r
        long n=a->GetNx(),m=a->GetNy();\r
-       if(mgl_isnan(sv))       sv = gr->GetOrgX('x');\r
        if(n<2 || m<2)  {       gr->SetWarn(mglWarnLow,"DensY");        return; }\r
-       if(sv<gr->Min.x || sv>gr->Max.x)        {       gr->SetWarn(mglWarnSlc,"DensY");        return; }\r
-       mglData xx,yy,zz,aa;\r
        gr->SaveState(opt);\r
+       if(mgl_isnan(sv))       sv = gr->GetOrgY('y');\r
+       if(sv<gr->Min.y || sv>gr->Max.y)        {       gr->SetWarn(mglWarnSlc,"DensY");        gr->LoadState();        return; }\r
+       mglDataV xx,yy,zz;      mglData aa;\r
        a = fill_slice_y(gr,sv,a,xx,yy,zz,aa);\r
-       mgl_surfc_xy(gr,&xx,&yy,&zz,a,sch,0);\r
+       mgl_surf_gen(gr, &xx,&yy,&zz,a, 0, sch);\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_dens_z(HMGL gr, HCDT a, const char *sch, double sv, const char *opt)\r
 {\r
        long n=a->GetNx(),m=a->GetNy();\r
-       if(mgl_isnan(sv))       sv = gr->GetOrgX('x');\r
        if(n<2 || m<2)  {       gr->SetWarn(mglWarnLow,"DensZ");        return; }\r
-       if(sv<gr->Min.x || sv>gr->Max.x)        {       gr->SetWarn(mglWarnSlc,"DensZ");        return; }\r
-       mglData xx,yy,zz,aa;\r
        gr->SaveState(opt);\r
+       if(mgl_isnan(sv))       sv = gr->GetOrgZ('z');\r
+       if(sv<gr->Min.z || sv>gr->Max.z)        {       gr->SetWarn(mglWarnSlc,"DensZ");        gr->LoadState();        return; }\r
+       mglDataV xx,yy,zz;      mglData aa;\r
        a = fill_slice_z(gr,sv,a,xx,yy,zz,aa);\r
-       mgl_surfc_xy(gr,&xx,&yy,&zz,a,sch,0);\r
+       mgl_surf_gen(gr, &xx,&yy,&zz,a, 0, sch);\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_dens_x_(uintptr_t *gr, uintptr_t *a, const char *sch, mreal *sv, const char *opt,int l,int lo)\r
@@ -157,12 +159,12 @@ void MGL_EXPORT mgl_cont_gen(HMGL gr, mreal val, HCDT a, HCDT x, HCDT y, HCDT z,
 void MGL_EXPORT mgl_cont_x_val(HMGL gr, HCDT v, HCDT a, const char *sch, double sv, const char *opt)\r
 {\r
        long n=a->GetNx(),m=a->GetNy();\r
-       if(mgl_isnan(sv))       sv = gr->GetOrgX('x');\r
        if(n<2 || m<2)  {       gr->SetWarn(mglWarnLow,"ContX");        return; }\r
-       if(sv<gr->Min.x || sv>gr->Max.x)        {       gr->SetWarn(mglWarnSlc,"ContX");        return; }\r
        gr->SaveState(opt);\r
+       if(mgl_isnan(sv))       sv = gr->GetOrgX('x');\r
+       if(sv<gr->Min.x || sv>gr->Max.x)        {       gr->SetWarn(mglWarnSlc,"ContX");        gr->LoadState();        return; }\r
        static int cgid=1;      gr->StartGroup("ContX",cgid++);\r
-       mglData xx,yy,zz,aa;\r
+       mglDataV xx,yy,zz;      mglData aa;\r
 \r
        int text=0;\r
        if(mglchr(sch,'t'))     text=1;\r
@@ -171,9 +173,10 @@ void MGL_EXPORT mgl_cont_x_val(HMGL gr, HCDT v, HCDT a, const char *sch, double
        gr->SetPenPal(sch);\r
 \r
        a = fill_slice_x(gr,sv,a,xx,yy,zz,aa);\r
+#pragma omp parallel for\r
        for(long i=0;i<v->GetNx();i++)\r
        {\r
-               register mreal v0 = v->v(i);\r
+               mreal v0 = v->v(i);\r
                mgl_cont_gen(gr,v0,a,&xx,&yy,&zz,gr->GetC(ss,v0),text,0);\r
        }\r
        gr->EndGroup();\r
@@ -182,12 +185,12 @@ void MGL_EXPORT mgl_cont_x_val(HMGL gr, HCDT v, HCDT a, const char *sch, double
 void MGL_EXPORT mgl_cont_y_val(HMGL gr, HCDT v, HCDT a, const char *sch, double sv, const char *opt)\r
 {\r
        long n=a->GetNx(),m=a->GetNy();\r
-       if(mgl_isnan(sv))       sv = gr->GetOrgX('x');\r
        if(n<2 || m<2)  {       gr->SetWarn(mglWarnLow,"ContY");        return; }\r
-       if(sv<gr->Min.x || sv>gr->Max.x)        {       gr->SetWarn(mglWarnSlc,"ContY");        return; }\r
        gr->SaveState(opt);\r
+       if(mgl_isnan(sv))       sv = gr->GetOrgY('y');\r
+       if(sv<gr->Min.y || sv>gr->Max.y)        {       gr->SetWarn(mglWarnSlc,"ContY");        gr->LoadState();        return; }\r
        static int cgid=1;      gr->StartGroup("ContY",cgid++);\r
-       mglData xx,yy,zz,aa;\r
+       mglDataV xx,yy,zz;      mglData aa;\r
 \r
        int text=0;\r
        if(mglchr(sch,'t'))     text=1;\r
@@ -196,9 +199,10 @@ void MGL_EXPORT mgl_cont_y_val(HMGL gr, HCDT v, HCDT a, const char *sch, double
        gr->SetPenPal(sch);\r
 \r
        a = fill_slice_y(gr,sv,a,xx,yy,zz,aa);\r
+#pragma omp parallel for\r
        for(long i=0;i<v->GetNx();i++)\r
        {\r
-               register mreal v0 = v->v(i);\r
+               mreal v0 = v->v(i);\r
                mgl_cont_gen(gr,v0,a,&xx,&yy,&zz,gr->GetC(ss,v0),text,0);\r
        }\r
        gr->EndGroup();\r
@@ -207,12 +211,12 @@ void MGL_EXPORT mgl_cont_y_val(HMGL gr, HCDT v, HCDT a, const char *sch, double
 void MGL_EXPORT mgl_cont_z_val(HMGL gr, HCDT v, HCDT a, const char *sch, double sv, const char *opt)\r
 {\r
        long n=a->GetNx(),m=a->GetNy();\r
-       if(mgl_isnan(sv))       sv = gr->GetOrgX('x');\r
        if(n<2 || m<2)  {       gr->SetWarn(mglWarnLow,"ContZ");        return; }\r
-       if(sv<gr->Min.x || sv>gr->Max.x)        {       gr->SetWarn(mglWarnSlc,"ContZ");        return; }\r
        gr->SaveState(opt);\r
+       if(mgl_isnan(sv))       sv = gr->GetOrgZ('z');\r
+       if(sv<gr->Min.z || sv>gr->Max.z)        {       gr->SetWarn(mglWarnSlc,"ContZ");        gr->LoadState();        return; }\r
        static int cgid=1;      gr->StartGroup("ContZ",cgid++);\r
-       mglData xx,yy,zz,aa;\r
+       mglDataV xx,yy,zz;      mglData aa;\r
 \r
        int text=0;\r
        if(mglchr(sch,'t'))     text=1;\r
@@ -221,9 +225,10 @@ void MGL_EXPORT mgl_cont_z_val(HMGL gr, HCDT v, HCDT a, const char *sch, double
        gr->SetPenPal(sch);\r
 \r
        a = fill_slice_z(gr,sv,a,xx,yy,zz,aa);\r
+#pragma omp parallel for\r
        for(long i=0;i<v->GetNx();i++)\r
        {\r
-               register mreal v0 = v->v(i);\r
+               mreal v0 = v->v(i);\r
                mgl_cont_gen(gr,v0,a,&xx,&yy,&zz,gr->GetC(ss,v0),text,0);\r
        }\r
        gr->EndGroup();\r
@@ -294,18 +299,19 @@ void MGL_EXPORT mgl_contf_gen(HMGL gr, mreal v1, mreal v2, HCDT a, HCDT x, HCDT
 void MGL_EXPORT mgl_contf_x_val(HMGL gr, HCDT v, HCDT a, const char *sch, double sv, const char *opt)\r
 {\r
        long n=a->GetNx(),m=a->GetNy();\r
-       if(mgl_isnan(sv))       sv = gr->GetOrgX('x');\r
        if(n<2 || m<2)  {       gr->SetWarn(mglWarnLow,"ContFX");       return; }\r
-       if(sv<gr->Min.x || sv>gr->Max.x)        {       gr->SetWarn(mglWarnSlc,"ContFX");       return; }\r
        gr->SaveState(opt);\r
+       if(mgl_isnan(sv))       sv = gr->GetOrgX('x');\r
+       if(sv<gr->Min.x || sv>gr->Max.x)        {       gr->SetWarn(mglWarnSlc,"ContFX");       gr->LoadState();        return; }\r
        static int cgid=1;      gr->StartGroup("ContFX",cgid++);\r
-       mglData xx,yy,zz,aa;\r
+       mglDataV xx,yy,zz;      mglData aa;\r
        long ss=gr->AddTexture(sch);\r
 \r
        a = fill_slice_x(gr,sv,a,xx,yy,zz,aa);\r
+#pragma omp parallel for\r
        for(long i=0;i<v->GetNx()-1;i++)\r
        {\r
-               register mreal v0 = v->v(i);\r
+               mreal v0 = v->v(i);\r
                mgl_contf_gen(gr,v0,v->v(i+1),a,&xx,&yy,&zz,gr->GetC(ss,v0),0);\r
        }\r
        gr->EndGroup();\r
@@ -314,18 +320,19 @@ void MGL_EXPORT mgl_contf_x_val(HMGL gr, HCDT v, HCDT a, const char *sch, double
 void MGL_EXPORT mgl_contf_y_val(HMGL gr, HCDT v, HCDT a, const char *sch, double sv, const char *opt)\r
 {\r
        long n=a->GetNx(),m=a->GetNy();\r
-       if(mgl_isnan(sv))       sv = gr->GetOrgX('x');\r
        if(n<2 || m<2)  {       gr->SetWarn(mglWarnLow,"ContFY");       return; }\r
-       if(sv<gr->Min.x || sv>gr->Max.x)        {       gr->SetWarn(mglWarnSlc,"ContFY");       return; }\r
        gr->SaveState(opt);\r
+       if(mgl_isnan(sv))       sv = gr->GetOrgY('y');\r
+       if(sv<gr->Min.y || sv>gr->Max.y)        {       gr->SetWarn(mglWarnSlc,"ContFY");       gr->LoadState();        return; }\r
        static int cgid=1;      gr->StartGroup("ContFY",cgid++);\r
-       mglData xx,yy,zz,aa;\r
+       mglDataV xx,yy,zz;      mglData aa;\r
        long ss=gr->AddTexture(sch);\r
 \r
        a = fill_slice_y(gr,sv,a,xx,yy,zz,aa);\r
+#pragma omp parallel for\r
        for(long i=0;i<v->GetNx()-1;i++)\r
        {\r
-               register mreal v0 = v->v(i);\r
+               mreal v0 = v->v(i);\r
                mgl_contf_gen(gr,v0,v->v(i+1),a,&xx,&yy,&zz,gr->GetC(ss,v0),0);\r
        }\r
        gr->EndGroup();\r
@@ -334,18 +341,19 @@ void MGL_EXPORT mgl_contf_y_val(HMGL gr, HCDT v, HCDT a, const char *sch, double
 void MGL_EXPORT mgl_contf_z_val(HMGL gr, HCDT v, HCDT a, const char *sch, double sv, const char *opt)\r
 {\r
        long n=a->GetNx(),m=a->GetNy();\r
-       if(mgl_isnan(sv))       sv = gr->GetOrgX('x');\r
        if(n<2 || m<2)  {       gr->SetWarn(mglWarnLow,"ContFZ");       return; }\r
-       if(sv<gr->Min.x || sv>gr->Max.x)        {       gr->SetWarn(mglWarnSlc,"ContFZ");       return; }\r
        gr->SaveState(opt);\r
+       if(mgl_isnan(sv))       sv = gr->GetOrgZ('z');\r
+       if(sv<gr->Min.z || sv>gr->Max.z)        {       gr->SetWarn(mglWarnSlc,"ContFZ");       gr->LoadState();        return; }\r
        static int cgid=1;      gr->StartGroup("ContFZ",cgid++);\r
-       mglData xx,yy,zz,aa;\r
+       mglDataV xx,yy,zz;      mglData aa;\r
        long ss=gr->AddTexture(sch);\r
 \r
        a = fill_slice_z(gr,sv,a,xx,yy,zz,aa);\r
+#pragma omp parallel for\r
        for(long i=0;i<v->GetNx()-1;i++)\r
        {\r
-               register mreal v0 = v->v(i);\r
+               mreal v0 = v->v(i);\r
                mgl_contf_gen(gr,v0,v->v(i+1),a,&xx,&yy,&zz,gr->GetC(ss,v0),0);\r
        }\r
        gr->EndGroup();\r
index 49aa1b725c9f5c18388bffd84d0a110064f99b2a..558137fb32e4b43d393a1bd9f5b98553370e0235 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************
  * parse.cpp is part of Math Graphic Library
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   it under the terms of the GNU Library General Public License as       *
 #include "mgl2/canvas_cf.h"
 #include "mgl2/base.h"
 //-----------------------------------------------------------------------------
+int MGL_LOCAL_PURE mgl_cmd_cmp(const void *a, const void *b)
+{
+       const mglCommand *aa = (const mglCommand *)a;
+       const mglCommand *bb = (const mglCommand *)b;
+       return strcmp(aa->name, bb->name);
+}
+//-----------------------------------------------------------------------------
+mglCommand *mglParser::BaseCmd=NULL;   ///< Base table of MGL commands. It MUST be sorted by 'name'!!!
+void mglParser::FillBaseCmd()
+{
+       if(BaseCmd)     return;
+       size_t na=0, nd=0, ng=0, np=0, ns=0, nsum=0;
+       while(mgls_prg_cmd[na].name[0]) na++;
+       while(mgls_dat_cmd[nd].name[0]) nd++;
+       while(mgls_grf_cmd[ng].name[0]) ng++;
+       while(mgls_prm_cmd[np].name[0]) np++;
+       while(mgls_set_cmd[ns].name[0]) ns++;
+       BaseCmd = new mglCommand[na+nd+ng+np+ns+1];
+       memcpy(BaseCmd,         mgls_prg_cmd, na*sizeof(mglCommand));   nsum+=na;
+       memcpy(BaseCmd+nsum,mgls_dat_cmd, nd*sizeof(mglCommand));       nsum+=nd;
+       memcpy(BaseCmd+nsum,mgls_grf_cmd, ng*sizeof(mglCommand));       nsum+=ng;
+       memcpy(BaseCmd+nsum,mgls_prm_cmd, np*sizeof(mglCommand));       nsum+=np;
+       memcpy(BaseCmd+nsum,mgls_set_cmd, (ns+1)*sizeof(mglCommand));   nsum+=ns;
+       qsort(BaseCmd, nsum, sizeof(mglCommand), mgl_cmd_cmp);
+#if DEBUG
+       long stat[17];  memset(stat,0,17*sizeof(long));
+       const char *name[17] = { _("0 - special plot"), _("1 - other plot"), _("2 - setup"), _("3 - data handle"), _("4 - data create"), _("5 - subplot"), _("6 - program flow"), _("7 - 1d plot"), _("8 - 2d plot"), _("9 - 3d plot"), _("10 - dd plot"), _("11 - vector plot"), _("12 - axis"), _("13 - primitives"), _("14 - axis setup"), _("15 - text/legend"), _("16 - data transform") };
+       for(size_t i=0;BaseCmd[i].name[0];i++)  stat[BaseCmd[i].type]+=1;
+       for(size_t i=0;i<17;i++)        printf("%s: %ld\n",name[i],stat[i]);
+       printf("\n");   fflush(stdout);
+#endif
+}
+//-----------------------------------------------------------------------------
+HMDT MGL_NO_EXPORT mglFormulaCalc(std::wstring string, mglParser *arg, const std::vector<mglDataA*> &head);
+HADT MGL_NO_EXPORT mglFormulaCalcC(std::wstring string, mglParser *arg, const std::vector<mglDataA*> &head);
+//-----------------------------------------------------------------------------
 MGL_EXPORT void (*mgl_ask_func)(const wchar_t *, wchar_t *)=0;
 void MGL_EXPORT mgl_ask_gets(const wchar_t *quest, wchar_t *res)
 {      printf("%ls\n",quest);  if(!fgetws(res,1024,stdin))     *res=0; }
@@ -54,26 +90,19 @@ void mglParser::ScanFunc(const wchar_t *line)
        num++;
        while(*line<=' ' && *line!=0)   line++;
        if(wcsncmp(line,L"func",4) || line[4]>' ')      return;
-       register long i;
+       long i;
        for(i=4;line[i]<=' ' || line[i]=='\'';i++);
        func.push_back(mglFunc(num-1, line+i));
 }
 //-----------------------------------------------------------------------------
 MGL_NO_EXPORT wchar_t *mgl_str_copy(const char *s)
 {
-       register size_t i,l=strlen(s);
+       size_t i,l=strlen(s);
        wchar_t *str = new wchar_t[l+1];
        for(i=0;i<l;i++)        str[i] = s[i];
        str[i] = 0;     return str;
 }
 //-----------------------------------------------------------------------------
-int MGL_LOCAL_PURE mgl_cmd_cmp(const void *a, const void *b)
-{
-       const mglCommand *aa = (const mglCommand *)a;
-       const mglCommand *bb = (const mglCommand *)b;
-       return strcmp(aa->name, bb->name);
-}
-//-----------------------------------------------------------------------------
 bool mglParser::CheckForName(const std::wstring &s)
 {
        return !isalpha(s[0]) || s.find_first_of(L"!@#$%%^&*()-+|,.<>:")!=std::wstring::npos || s==L"rnd" || FindNum(s.c_str());
@@ -100,12 +129,11 @@ const mglCommand *mglParser::FindCommand(const wchar_t *com) const
 }
 //-----------------------------------------------------------------------------
 // return values : 0 -- OK, 1 -- wrong arguments, 2 -- wrong command, 3 -- unclosed string
-int mglParser::Exec(mglGraph *gr, const wchar_t *com, long n, mglArg *a, const std::wstring &var, const wchar_t *opt)
+int mglParser::Exec(mglGraph *gr, const wchar_t *com, long n, mglArg *a, const std::wstring &/*var*/, const wchar_t *opt)
 {
-       int i;
        const char *id="dsn";
        std::string k;
-       for(i=0;i<n;i++)
+       for(long i=0;i<n;i++)
        {
                k += id[a[i].type];
                size_t len = wcstombs(NULL,a[i].w.c_str(),0)+1;
@@ -114,42 +142,84 @@ int mglParser::Exec(mglGraph *gr, const wchar_t *com, long n, mglArg *a, const s
                a[i].s = buf;   delete []buf;
        }
        const mglCommand *rts=FindCommand(com);
-       if(!rts || rts->type==6)        return 2;
+       if(!rts || !rts->exec)  return 2;
 /*     if(rts->type == 4)
        {
                if(n<1 || CheckForName(var))    return 2;
                a[0].type = 0;  a[0].d = AddVar(var.c_str());
                a[0].w = var;   k[0] = 'd';
        }*/
-       char *o=0;
+       std::string vopt;
        if(opt && *opt) // TODO: parse arguments of options
        {
-               long len = mgl_wcslen(opt);
-               o = new char[len+1];
-               for(i=0;i<len+1;i++)    o[i]=opt[i];
+               size_t len = mgl_wcslen(opt);
+               std::vector<std::wstring> ss;
+               std::wstring s, o;
+               bool st = true, name = true;
+               for(size_t i=0;i<len+1;i++)
+               {
+                       if(st && opt[i]<=' ')   continue;       // skip spaces at beginning
+                       st = false;
+                       if(i<len && opt[i]!=';')
+                       {
+                               if(name && opt[i]<=' ') {       name = false;   o = s;  }
+                               s.push_back(opt[i]);
+                       }
+                       else
+                       {
+                               size_t j = o.size(),k;
+                               wchar_t buf[64];
+                               if(o==L"xrange" || o==L"yrange" || o==L"zrange" || o==L"crange")        // 2 arguments
+                               {
+                                       bool alph=false;
+                                       for(k=j;k<s.length();k++)
+                                       {
+                                               if(s[k]>' ')    alph=true;
+                                               if(alph && s[k]<=' ')   break;
+                                       }
+                                       HMDT d1 = mglFormulaCalc(s.substr(j+1,k-j),this, DataList);
+                                       HMDT d2 = mglFormulaCalc(s.substr(k+1),this, DataList);
+                                       mglprintf(buf,64,L" %g %g",d1->a[0],d2->a[0]);
+                                       s = o+buf;      delete d1;      delete d2;
+                               }
+                               else if(o!=L"legend")   // 1 argument
+                               {
+                                       HMDT dd = mglFormulaCalc(s.substr(j+1),this, DataList);
+                                       mglprintf(buf,64,L" %g",dd->a[0]);
+                                       s = o+buf;      delete dd;
+                               }
+                               st = name = true;       ss.push_back(s);
+                               o.clear();      s.clear();
+                       }
+               }
+               for(size_t i=0;i<ss.size();i++)
+               {
+                       for(size_t j=0;j<ss[i].length();j++)    vopt += ss[i][j];
+                       vopt += ';';
+               }
        }
-       int res=rts->exec(gr, n, a, k.c_str(), o);
-       if(o)   delete []o;
+       int res=rts->exec(gr, n, a, k.c_str(), vopt.c_str());
        return res;
 }
 //-----------------------------------------------------------------------------
 mglParser::mglParser(bool setsize)
 {
-       InUse = 1;      curGr = 0;
-       Skip=Stop=for_br=false;
+       InUse = 1;      curGr = 0;      Variant = 0;
+       Skip=Stop=for_br=false; StarObhID = 0;
        memset(for_stack,0,40*sizeof(int));
        memset(if_stack,0,40*sizeof(int));
        memset(if_for,0,40*sizeof(int));
        if_pos=for_addr=0;
        for(long i=0;i<40;i++)  par[i]=L"";
 
-       Cmd = mgls_base_cmd;
+       FillBaseCmd();  Cmd = BaseCmd;
        AllowSetSize=setsize;   AllowFileIO=true;       AllowDllCall=true;
        Once = true;
        fval = new mglData[40];
        mglNum *v;
        v = new mglNum(0);      v->s = L"off";  NumList.push_back(v);
        v = new mglNum(1);      v->s = L"on";   NumList.push_back(v);
+       v = new mglNum(-1);     v->s = L"all";  NumList.push_back(v);
        v = new mglNum(NAN);    v->s = L"nan";  NumList.push_back(v);
        v = new mglNum(M_PI);   v->s = L"pi";   NumList.push_back(v);
        v = new mglNum(INFINITY);       v->s = L"inf";  NumList.push_back(v);
@@ -180,11 +250,11 @@ void mglParser::DeleteAll()
        mglNum *v;
        v = new mglNum(0);      v->s = L"off";  NumList.push_back(v);
        v = new mglNum(1);      v->s = L"on";   NumList.push_back(v);
+       v = new mglNum(-1);     v->s = L"all";  NumList.push_back(v);
        v = new mglNum(NAN);    v->s = L"nan";  NumList.push_back(v);
        v = new mglNum(M_PI);   v->s = L"pi";   NumList.push_back(v);
        v = new mglNum(INFINITY);       v->s = L"inf";  NumList.push_back(v);
-       if(Cmd && Cmd!=mgls_base_cmd)
-       {       delete []Cmd;   Cmd = mgls_base_cmd;    }
+       if(Cmd && Cmd!=BaseCmd) {       delete []Cmd;   Cmd = BaseCmd;  }
 #if MGL_HAVE_LTDL
        for(size_t i=0;i<DllOpened.size();i++)
                lt_dlclose(DllOpened[i]);
@@ -272,114 +342,168 @@ mglNum *mglParser::AddNum(const wchar_t *name)
 //-----------------------------------------------------------------------------
 int MGL_LOCAL_PURE mglFindArg(const std::wstring &str)
 {
-       register long l=0,k=0,i;
-       for(i=0;i<long(str.length());i++)
+       long l=0,k=0;
+       const size_t s=str.length();
+       for(size_t i=0;i<s;i++)
        {
                if(str[i]=='\'') l++;
                if(str[i]=='{') k++;
                if(str[i]=='}') k--;
                if(l%2==0 && k==0)
                {
-                       if(str[i]=='#' || str[i]==';')  return -i;
-                       if(str[i]<=' ') return i;
+                       if(str[i]=='#' || str[i]==';')  return -long(i);
+                       if(str[i]<=' ') return long(i);
                }
        }
        return 0;
 }
 //-----------------------------------------------------------------------------
-HMDT MGL_NO_EXPORT mglFormulaCalc(std::wstring string, mglParser *arg, const std::vector<mglDataA*> &head);
-HADT MGL_NO_EXPORT mglFormulaCalcC(std::wstring string, mglParser *arg, const std::vector<mglDataA*> &head);
-//-----------------------------------------------------------------------------
 // convert substrings to arguments
 void mglParser::FillArg(mglGraph *gr, int k, std::wstring *arg, mglArg *a)
 {
-       register long n;
-       for(n=1;n<k;n++)
+       for(long n=1;n<k;n++)
        {
                mglDataA *v;    mglNum *f;
                a[n-1].type = -1;
-               if(arg[n][0]=='|')      a[n-1].type = -1;
-               else if(arg[n][0]=='\'')        // this is string (simplest case)
+               std::wstring str = arg[n];
+               size_t i1=0, i2=str.length(), j=0;
+               bool s=true;
+               for(size_t i=0;i<i2;i++)
+               {
+                       if(str[i]=='\'')        s = !s;
+                       if(s && str[i]=='?')
+                       {
+                               if(j<Variant)   i1=i+1;
+                               else    i2=i;
+                               j++;
+                       }
+               }
+               str = str.substr(i1,i2-i1);
+
+               if(str.empty()) a[n-1].type = -2;
+               else if(str[0]=='|')    a[n-1].type = -1;
+               else if(str[0]=='\'')   // this is string (simplest case)
                {
                        a[n-1].type = 1;
-                       std::wstring &w=arg[n],f;
-                       wchar_t buf[32];
-                       long i,i1,ll=w.length();
-                       for(i=1;i<ll;i++)
+                       long na=1, ns=0, np=0, ll=str.length(), ii=1, op=0;
+                       std::vector<std::wstring> s;
+                       std::vector<int> id;    // 0 - string, 1 - cval, 2 - rval, 3 - plus, 4 - index
+                       for(long i=1;i<ll;i++)
                        {
-                               if(w[i]=='\'')
+                               if(str[i]=='\'')
                                {
-                                       if(i==ll-1)     continue;
-                                       i++;    i1 = i;
-                                       if(w[i1]==',')  i1++;
-                                       if(w[i1]==0)    continue;
-                                       for(;i<ll && w[i]!='\'';i++);
-                                       if(i>i1)
+                                       if(na%2==1)
+                                       {       id.push_back(0);        s.push_back(str.substr(ii,i-ii));       }
+                                       else if(op && i>ii)
+                                       {       id.push_back(op);       s.push_back(str.substr(ii,i-ii));       }
+                                       na++;   ii=i+1; op=0;
+                               }
+                               else if(na%2==0 && ns==0 && np==0)
+                               {
+                                       if(str[i]=='+' && str[i-1]=='\'')
+                                       {       op=3;   ii=i+1; }
+                                       else if(str[i]==',' && str[i+1]=='!')
                                        {
-                                               if(w[i1]=='!')
-                                               {
-                                                       HADT d = mglFormulaCalcC(w.substr(i1+1,i-i1-(w[i]=='\''?1:0)), this, DataList);
-                                                       mreal di = imag(d->a[0]), dr = real(d->a[0]);
-                                                       if(di>0)        mglprintf(buf,32,L"%g+%gi",dr,di);
-                                                       else if(di<0)   mglprintf(buf,32,L"%g-%gi",dr,-di);     // TODO use \u2212 ???
-                                                       else    mglprintf(buf,32,L"%g",dr);
-                                                       a[n-1].w += buf;        delete d;
-                                               }
-                                               else
-                                               {
-                                                       HMDT d = mglFormulaCalc(w.substr(i1,i-i1-(w[i]=='\''?1:0)), this, DataList);
-                                                       mglprintf(buf,32,L"%g",d->a[0]);        a[n-1].w += buf;        delete d;
-                                               }
+                                               if(op && i>ii)
+                                               {       id.push_back(op);       s.push_back(str.substr(ii,i-ii));       }
+                                               op=1;   ii=i+2;
                                        }
+                                       else if(str[i]==',')
+                                       {
+                                               if(op && i>ii)
+                                               {       id.push_back(op);       s.push_back(str.substr(ii,i-ii));       }
+                                               op=2;   ii=i+1;
+                                       }
+                                       else if(str[i]=='[' && str[i-1]=='\'')
+                                       {       ii=i+1; ns++;   }
+                                       else if(str[i]=='(')    np++;
+                               }
+                               else if(na%2==0 && np==0 && str[i]==']' && ns==1)
+                               {
+                                       id.push_back(4);        s.push_back(str.substr(ii,i-ii));
+                                       op=0;   ii=i+1; ns--;
+                               }
+                               else if(na%2==0 && np==1 && str[i]==')' && ns==0)       np--;
+                       }
+                       if(op && ll>ii)
+                       {       id.push_back(op);       s.push_back(str.substr(ii,ll-ii));      }
+                       wchar_t buf[32];
+                       for(size_t i=0;i<id.size();i++)
+                       {
+                               if(id[i]==0)    a[n-1].w += s[i];
+                               else if(id[i]==1)
+                               {
+                                       HADT d = mglFormulaCalcC(s[i], this, DataList);
+                                       mreal di = imag(d->a[0]), dr = real(d->a[0]);
+                                       if(di>0)        mglprintf(buf,32,L"%g+%gi",dr,di);
+                                       else if(di<0)   mglprintf(buf,32,L"%g-%gi",dr,-di);     // TODO use \u2212 ???
+                                       else    mglprintf(buf,32,L"%g",dr);
+                                       a[n-1].w += buf;        delete d;
+                               }
+                               else if(id[i]==2)
+                               {
+                                       HMDT d = mglFormulaCalc(s[i], this, DataList);
+                                       mglprintf(buf,32,L"%g",d->a[0]);        a[n-1].w += buf;        delete d;
+                               }
+                               else if(id[i]==3)
+                               {
+                                       HMDT d = mglFormulaCalc(s[i], this, DataList);
+                                       a[n-1].w[a[n-1].w.size()-1] += d->a[0]; delete d;
+                               }
+                               else if(id[i]==4)
+                               {
+                                       HMDT d = mglFormulaCalc(s[i], this, DataList);
+                                       long v = long(d->a[0]+0.5);     delete d;
+                                       if(v>=0 && v<long(a[n-1].w.size()))     a[n-1].w = a[n-1].w[v];
+                                       else    a[n-1].w = L"";
                                }
-                               else    a[n-1].w += w[i];
                        }
                }
-               else if(arg[n][0]=='{')
+               else if(str[0]=='{')
                {       // this is temp data
                        mglData *u=new mglData;
-                       std::wstring s = arg[n].substr(1,arg[n].length()-2);
+                       std::wstring s = str.substr(1,str.length()-2);
                        a[n-1].w = u->s = L"/*"+s+L"*/";
                        a[n-1].type = 0;
                        ParseDat(gr, s, *u);    a[n-1].d = u;
                        u->temp=true;   DataList.push_back(u);
                }
-               else if((v = FindVar(arg[n].c_str()))!=0)       // try to find normal variables (for data creation)
+               else if((v = FindVar(str.c_str()))!=0)  // try to find normal variables (for data creation)
                {       a[n-1].type=0;  a[n-1].d=v;     a[n-1].w=v->s;  }
-               else if((f = FindNum(arg[n].c_str()))!=0)       // try to find normal number (for data creation)
+               else if((f = FindNum(str.c_str()))!=0)  // try to find normal number (for data creation)
                {       a[n-1].type=2;  a[n-1].d=0;     a[n-1].v=f->d;  a[n-1].c=f->c;  a[n-1].w = f->s;        }
-               else if(arg[n][0]=='!') // complex array is asked
+               else if(str[0]=='!')    // complex array is asked
                {       // parse all numbers and formulas by unified way
-                       HADT d = mglFormulaCalcC(arg[n].substr(1), this, DataList);
+                       HADT d = mglFormulaCalcC(str.substr(1), this, DataList);
                        if(d->GetNN()==1)
                        {
-                               if(CheckForName(arg[n].substr(1)))
+                               if(CheckForName(str.substr(1)))
                                {       a[n-1].type = 2;        a[n-1].v = d->v(0);     a[n-1].c = d->a[0];     }
                                else
-                               {       a[n-1].type = 0;        a[n-1].d = AddVar(arg[n].c_str());      }
+                               {       a[n-1].type = 0;        a[n-1].d = AddVar(str.c_str()); }
                                delete d;
                        }
                        else
                        {
-                               a[n-1].w = L"/*"+arg[n]+L"*/";
+                               a[n-1].w = L"/*"+str+L"*/";
                                d->temp=true;   DataList.push_back(d);
                                a[n-1].type = 0;        a[n-1].d = d;
                        }
                }
                else
                {       // parse all numbers and formulas by unified way
-                       HMDT d = mglFormulaCalc(arg[n], this, DataList);
+                       HMDT d = mglFormulaCalc(str, this, DataList);
                        if(d->GetNN()==1)
                        {
-                               if(CheckForName(arg[n]))
+                               if(CheckForName(str))
                                {       a[n-1].type = 2;        a[n-1].c = a[n-1].v = d->v(0);  }
                                else
-                               {       a[n-1].type = 0;        a[n-1].d = AddVar(arg[n].c_str());      }
+                               {       a[n-1].type = 0;        a[n-1].d = AddVar(str.c_str()); }
                                delete d;
                        }
                        else
                        {
-                               a[n-1].w = L"/*"+arg[n]+L"*/";
+                               a[n-1].w = L"/*"+str+L"*/";
                                d->temp=true;   DataList.push_back(d);
                                a[n-1].type = 0;        a[n-1].d = d;
                        }
@@ -391,9 +515,7 @@ void mglParser::FillArg(mglGraph *gr, int k, std::wstring *arg, mglArg *a)
 int mglParser::PreExec(mglGraph *, long k, std::wstring *arg, mglArg *a)
 {
        long n=0;
-       if(!arg[0].compare(L"delete") && k==2)  // parse command "delete"
-       {       DeleteVar(arg[1].c_str());      n=1;    }
-       else if(!arg[0].compare(L"list"))       // parse command "list"
+       if(!arg[0].compare(L"list"))    // parse command "list"
        {
                if(k<3 || CheckForName(arg[1])) return 2;
                long nx=0, ny=1,j=0,i,t=0;
@@ -491,7 +613,10 @@ int mglParser::ParseDef(std::wstring &str)
        {
                int res = 1;    mreal d;
                PutArg(str,true);
-               const std::wstring s = mgl_trim_ws(str.substr(7));
+               size_t end;     bool ss=false;
+               for(end=7;str[end] && (str[end]!='#' || ss);end++)
+               {       if(str[end]=='\'')      ss=!ss; }
+               const std::wstring s = mgl_trim_ws(str.substr(7,end-7));
                if(!str.compare(3,3,L"ine"))
                {
                        int nn = s[1]<='9' ? s[1]-'0' : (s[1]>='a' ? s[1]-'a'+10:-1);
@@ -508,8 +633,7 @@ int mglParser::ParseDef(std::wstring &str)
                                res = 0;
                                HMDT dd = mglFormulaCalc(mgl_trim_ws(s.substr(2)), this, DataList);
                                d = dd->a[0];   delete dd;
-                               char buf[32];   snprintf(buf,32,"%g",d);
-                               buf[31] = 0;    AddParam(nn, buf);
+                               AddParam(nn, mgl_str_num(d).c_str());
                        }
                        return res+1;
                }
@@ -547,8 +671,7 @@ int mglParser::ParseDef(std::wstring &str)
        }
        if(!skip() && !str.compare(0,3,L"for") && (str[3]==' ' || str[3]=='\t'))
        {
-               size_t i;
-               for(i=4;str[i]<=' ';i++);
+               size_t i;       for(i=4;str[i]<=' ';i++);
                // if command have format 'for $N ...' then change it to 'for N ...'
                if(str[i]=='$' && str[i+1]>='0' && str[i+1]<='9')       str[i] = ' ';
                if(str[i]=='$' && str[i+1]>='a' && str[i+1]<='z')       str[i] = ' ';
@@ -556,24 +679,11 @@ int mglParser::ParseDef(std::wstring &str)
        return 0;
 }
 //-----------------------------------------------------------------------------
-/*void MGL_NO_EXPORT print_data(const char *s, std::vector<mglDataA*> h)
-{
-       printf("%s\ts=%lu:\n",s,h.size());
-       for(size_t i=0;i<h.size();i++)
-       {
-               printf("%lu - %p",i,h[i]);
-               if(h[i])        printf(",t%d,'%ls'",h[i]->temp, h[i]->s.c_str());
-               printf("\n");
-       }
-       fflush(stdout);
-}*/
-//-----------------------------------------------------------------------------
 // return values: 0 - OK, 1 - wrong arguments, 2 - wrong command, 3 - string too long, 4 -- unclosed string
 int mglParser::Parse(mglGraph *gr, std::wstring str, long pos)
 {
        if(Stop || gr->NeedStop())      return 0;
-       curGr = gr->Self();
-       std::wstring arg[1024];
+       curGr = gr->Self();     gr->pr = this;
        str=mgl_trim_ws(str);
        long n,k=0,m=0,mm=0,res;
        // try parse ':' -- several commands in line
@@ -581,8 +691,10 @@ int mglParser::Parse(mglGraph *gr, std::wstring str, long pos)
        {
                if(str[n]=='\'' && (n==0 || str[n-1]!='\\'))    k++;
                if(k%2) continue;
-               if(str[n]=='(') m++;    if(str[n]==')') m--;
-               if(str[n]=='{') mm++;   if(str[n]=='}') mm--;
+               if(str[n]=='(') m++;
+               if(str[n]==')') m--;
+               if(str[n]=='{') mm++;
+               if(str[n]=='}') mm--;
                if(str[n]=='#') break;
                if((str[n]==':' || str[n]=='\n') && k%2==0 && m==0 && mm==0)
                {
@@ -598,7 +710,8 @@ int mglParser::Parse(mglGraph *gr, std::wstring str, long pos)
        PutArg(str,false);      str=mgl_trim_ws(str);
 
        std::wstring opt;
-       for(k=0;k<1024;k++)     // parse string to substrings (by spaces)
+       std::vector<std::wstring> arg;
+       while(!str.empty())     // parse string to substrings (by spaces)
        {
                n = mglFindArg(str);
                if(n<1) // this is option
@@ -607,17 +720,18 @@ int mglParser::Parse(mglGraph *gr, std::wstring str, long pos)
                        if(n<0) str = str.substr(0,-n);
                        break;
                }
-               arg[k] = str.substr(0,n);
+               arg.push_back(str.substr(0,n));
                str = mgl_trim_ws(str.substr(n+1));
        }
        // try to find last argument
-       if(str[0]!=0 && str[0]!='#' && str[0]!=';')     {       arg[k] = str;   k++;    }
-       if(k<1) n =0;
+       if(str[0]!=0 && str[0]!='#' && str[0]!=';')     arg.push_back(str);
+       k = arg.size();
+       if(k<1) n = 0;
        else
        {
                // fill arguments by its values
                mglArg *a = new mglArg[k];
-               FillArg(gr, k, arg, a);
+               FillArg(gr, k, &(arg[0]), a);
                // execute first special (program-flow-control) commands
                if(!skip() && !arg[0].compare(L"stop"))
                {       Stop = true;    delete []a;     return 0;       }
@@ -626,13 +740,6 @@ int mglParser::Parse(mglGraph *gr, std::wstring str, long pos)
                n = FlowExec(gr, arg[0].c_str(),k-1,a);
                if(n)           {       delete []a;     return n-1;     }
                if(skip())      {       delete []a;     return 0;       }
-               if(!arg[0].compare(L"load"))
-               {
-                       int n = a[0].type==1?0:1;
-                       a[0].s.assign(a[0].w.begin(),a[0].w.end());
-                       if(!n)  mgl_parser_load(this,a[0].s.c_str());
-                       delete []a;     return n;
-               }
                if(!arg[0].compare(L"define"))
                {
                        if(k==3)
@@ -648,18 +755,6 @@ int mglParser::Parse(mglGraph *gr, std::wstring str, long pos)
                        }
                        delete []a;     return k==3?0:1;
                }
-               if(!arg[0].compare(L"rkstep"))
-               {
-                       int res=1;
-                       if(k>2 && a[0].type==1 && a[1].type==1)
-                       {
-                               std::wstring a1 = arg[1], a2=arg[2];    res = 0;
-                               if(a1[0]=='\'') a1 = a1.substr(1,a1.length()-2);
-                               if(a2[0]=='\'') a2 = a2.substr(1,a2.length()-2);
-                               mgl_rk_step_w(this, a1.c_str(), a2.c_str(), (k>=3 && a[2].type==2)?a[2].v:1);
-                       }
-                       delete []a;     return res;
-               }
                if(!arg[0].compare(L"call"))
                {
                        n = 1;
@@ -671,7 +766,7 @@ int mglParser::Parse(mglGraph *gr, std::wstring str, long pos)
                                if(n && k!=na+2)
                                {
                                        char buf[64];
-                                       snprintf(buf,64,"Bad arguments for %ls: %ld instead of %d\n", a[0].w.c_str(),k-2,na);
+                                       snprintf(buf,64,_("Bad arguments for %ls: %ld instead of %d\n"), a[0].w.c_str(),k-2,na);
                                        buf[63]=0;      gr->SetWarn(-1,buf);    n = 1;
                                }
                                else if(n)
@@ -686,12 +781,11 @@ int mglParser::Parse(mglGraph *gr, std::wstring str, long pos)
                                        FILE *fp = fopen(a[0].s.c_str(),"rt");
                                        if(fp)
                                        {
-                                               register int i;
                                                mglParser *prs = new mglParser(AllowSetSize);
                                                prs->DataList.swap(DataList);   prs->NumList.swap(NumList);     prs->Cmd=Cmd;
-                                               for(i=10;i<30;i++)      prs->AddParam(i,par[i].c_str());
+                                               for(int i=10;i<30;i++)  prs->AddParam(i,par[i].c_str());
                                                prs->Execute(gr,fp);
-                                               for(i=10;i<30;i++)      AddParam(i,prs->par[i].c_str());
+                                               for(int i=10;i<30;i++)  AddParam(i,prs->par[i].c_str());
                                                DataList.swap(prs->DataList);   NumList.swap(prs->NumList);
                                                prs->Cmd=0;     delete prs;     fclose(fp);
                                        }
@@ -702,6 +796,7 @@ int mglParser::Parse(mglGraph *gr, std::wstring str, long pos)
                }
                if(!arg[0].compare(L"for"))
                {
+                       if(k<2) {       delete []a;     return 1;       }
                        n = 1;
                        char ch = arg[1][0];
                        int r = ch-'0';
@@ -737,10 +832,10 @@ int mglParser::Parse(mglGraph *gr, std::wstring str, long pos)
                        delete []a;     return n;
                }
                // alocate new arrays and execute the command itself
-               n = PreExec(gr, k, arg, a);
+               n = PreExec(gr, k, &(arg[0]), a);
                if(n>0) n--;
                else if(!arg[0].compare(L"setsize") && !AllowSetSize)   n = 2;
-               else    n = Exec(gr, arg[0].c_str(),k-1,a, arg[1].c_str(), opt.c_str());
+               else    n = Exec(gr, arg[0].c_str(),k-1,a, k>1?arg[1]:L"", opt.c_str());
                delete []a;
        }
        // delete temporary data arrays
@@ -763,7 +858,7 @@ int mglParser::ParseDat(mglGraph *gr, std::wstring str, mglData &res)
                str = str.substr(n+1);  str = mgl_trim_ws(str);
        }
        // try to find last argument
-       if(!str.empty())        {       arg[k] = str;   k++;    }
+       if(!str.empty() && k<32)        {       arg[k] = str;   k++;    }
        if(k<1) n = 0;
        else
        {       // fill arguments by its values
@@ -839,6 +934,7 @@ int mglParser::FlowExec(mglGraph *, const std::wstring &com, long m, mglArg *a)
        else if(!ifskip() && !Skip && !com.compare(L"break"))
        {
                if(if_pos==if_for[0])   if_pos = if_pos>0 ? if_pos-1 : 0;
+               n = for_stack[0] ? 0:1; for_br = true;
        }
        else if(!skip() && !com.compare(L"return"))
        {
@@ -887,7 +983,6 @@ int mglParser::FlowExec(mglGraph *, const std::wstring &com, long m, mglArg *a)
        return n+1;
 }
 //-----------------------------------------------------------------------------
-#include <string>
 void mglParser::Execute(mglGraph *gr, FILE *fp, bool print)
 {
        if(gr==0 || fp==0)      return;
@@ -908,22 +1003,22 @@ void mglParser::Execute(mglGraph *gr, int n, const wchar_t **text)
        for(long i=0;i<n;i++)
        {
                gr->SetWarn(-1, "");
-               gr->SetObjId(i+1);
+               gr->SetObjId(i+1+StarObhID);
                long r = Parse(gr,text[i],i+1);
                if(r<0) {       i = -r-2;       continue;       }
-               if(r==1)                snprintf(buf,64,"\nWrong argument(s) in line %ld\n", i+1);
-               else if(r==2)   snprintf(buf,64,"\nWrong command in line %ld\n", i+1);
-               else if(r==3)   snprintf(buf,64,"\nString too long in line %ld\n", i+1);
-               else if(r==4)   snprintf(buf,64,"\nUnbalanced ' in line %ld\n", i+1);
-               else if(r==5)   snprintf(buf,64,"\nChange temporary data in line %ld\n", i+1);
-               else if(gr->GetWarn()>0)        snprintf(buf,64," in line %ld\n", i+1);
+               if(r==1)                snprintf(buf,64,_("\nWrong argument(s) in line %ld"), i+1);
+               else if(r==2)   snprintf(buf,64,_("\nWrong command in line %ld"), i+1);
+               else if(r==3)   snprintf(buf,64,_("\nString too long in line %ld"), i+1);
+               else if(r==4)   snprintf(buf,64,_("\nUnbalanced ' in line %ld"), i+1);
+               else if(r==5)   snprintf(buf,64,_("\nChange temporary data in line %ld"), i+1);
+               else if(gr->GetWarn()>0)        snprintf(buf,64,_("in line %ld"), i+1);
                else *buf=0;
                buf[63] = 0;
                if(*buf)        gr->SetWarn(-2,buf);
                if(r>0 && r<5)  res=r;
        }
        int code[]={mglScrArg,  mglScrCmd,      mglScrLong,     mglScrStr, mglScrTemp};
-       if(res>0)       gr->SetWarn(code[res-1],"MGL Parser");
+       if(res>0)       gr->SetWarn(code[res-1],_("MGL Parser"));
 }
 //-----------------------------------------------------------------------------
 void mglParser::Execute(mglGraph *gr, const wchar_t *text)
@@ -971,19 +1066,18 @@ void mglParser::DeleteVar(const wchar_t *name)
        {       mglDataA *u=DataList[i];        DataList[i]=0;  delete u;       }
 }
 //-----------------------------------------------------------------------------
-void mglParser::AddCommand(mglCommand *cmd, int mc)
+void mglParser::AddCommand(const mglCommand *cmd)
 {
-       int i, mp;
-       if(mc<1)
-       {       for(i=0;cmd[i].name[0];i++){};  mc = i; }
        // determine the number of symbols
-       for(i=0;Cmd[i].name[0];i++){};  mp = i;
+       size_t mp=0;    while(Cmd[mp].name[0])  mp++;
+       size_t mc=0;    while(cmd[mc].name[0])  mc++;
+       // copy all together
        mglCommand *buf = new mglCommand[mp+mc+1];
        memcpy(buf, cmd, mc*sizeof(mglCommand));
        memcpy(buf+mc, Cmd, (mp+1)*sizeof(mglCommand));
-       qsort(buf, mp+mc, sizeof(mglCommand), mgl_cmd_cmp);
+       qsort(buf, mp+mc, sizeof(mglCommand), mgl_cmd_cmp);     // sort it
 #pragma omp critical(cmd_parser)
-       {       if(Cmd!=mgls_base_cmd)   delete []Cmd;  Cmd = buf;      }
+       {       if(Cmd!=BaseCmd)   delete []Cmd;        Cmd = buf;      }
 }
 //-----------------------------------------------------------------------------
 HMPR MGL_EXPORT mgl_create_parser()            {       return new mglParser;   }
@@ -1054,6 +1148,14 @@ long MGL_EXPORT mgl_parser_num_var(HMPR p)
 {      return p->DataList.size();      }
 long MGL_EXPORT mgl_parser_num_var_(uintptr_t* p)
 {      return mgl_parser_num_var(_PR_);        }
+long MGL_EXPORT mgl_parser_num_const(HMPR p)
+{      return p->NumList.size();       }
+long MGL_EXPORT mgl_parser_num_const_(uintptr_t* p)
+{      return mgl_parser_num_const(_PR_);      }
+MGL_EXPORT mglNum *mgl_parser_get_const(HMPR p, unsigned long id)
+{      return id<p->NumList.size()?p->NumList[id]:0;   }
+uintptr_t MGL_EXPORT mgl_parser_get_const_(uintptr_t* p, unsigned long *id)
+{      return uintptr_t(mgl_parser_get_const(_PR_,*id));       }
 //---------------------------------------------------------------------------
 int MGL_EXPORT mgl_parser_cmd_type(HMPR pr, const char *name)
 {
@@ -1078,7 +1180,7 @@ MGL_EXPORT const char *mgl_parser_cmd_frmt(HMPR pr, const char *name)
 MGL_EXPORT const char *mgl_parser_cmd_name(HMPR pr, long id)
 {      return (id<mgl_parser_cmd_num(pr) && id>=0) ? pr->Cmd[id].name:"";      }
 long MGL_EXPORT mgl_parser_cmd_num(HMPR pr)
-{      register long i=0;      while(pr->Cmd[i].name[0])       i++;    return i;       }
+{      long i=0;       while(pr->Cmd[i].name[0])       i++;    return i;       }
 //---------------------------------------------------------------------------
 HMDT MGL_EXPORT mgl_parser_calc(HMPR pr, const char *formula)
 {      HMDT d=0;       MGL_TO_WCS(formula,d = mgl_parser_calcw(pr,wcs));       return d;       }
@@ -1106,22 +1208,12 @@ void MGL_EXPORT mgl_parser_load(HMPR pr, const char *so_name)
        lt_dlhandle so = lt_dlopen(so_name);
        if(!so) return;
        const mglCommand *cmd = (const mglCommand *)lt_dlsym(so,"mgl_cmd_extra");
-       if(!cmd)        return;
-
-       int i, mp, mc, exist=true;
-       // determine the number of symbols
-       for(i=0;pr->Cmd[i].name[0];i++){};      mp = i;
-       for(i=0;cmd[i].name[0];i++)
+       bool exist = true;
+       if(cmd) for(size_t i=0;cmd[i].name[0];i++)
                if(!pr->FindCommand(cmd[i].name))       exist=false;
        if(exist)       {       lt_dlclose(so); return; }       // all commands already presents
        else    pr->DllOpened.push_back(so);
-       mc = i;
-       mglCommand *buf = new mglCommand[mp+mc+1];
-       memcpy(buf, pr->Cmd, mp*sizeof(mglCommand));
-       memcpy(buf+mp, cmd, (mc+1)*sizeof(mglCommand));
-       qsort(buf, mp+mc, sizeof(mglCommand), mgl_cmd_cmp);
-       if(pr->Cmd!=mgls_base_cmd)      delete []pr->Cmd;
-       pr->Cmd = buf;
+       pr->AddCommand(cmd);
 #endif
 }
 void MGL_EXPORT mgl_parser_load_(uintptr_t *p, const char *dll_name,int l)
@@ -1303,3 +1395,51 @@ void MGL_EXPORT mgl_rk_step_(uintptr_t *p, const char *eqs, const char *vars, do
        char *s=new char[m+1];  memcpy(s,vars,m);       s[m]=0;
        mgl_rk_step(_PR_,e,s,*dt);      delete []e;     delete []s;     }
 //---------------------------------------------------------------------------
+void MGL_EXPORT mgl_parser_variant(HMPR p, int var)    {       p->SetVariant(var);     }
+void MGL_EXPORT mgl_parser_variant_(uintptr_t *p, int *var)    {       mgl_parser_variant(_PR_,*var);  }
+//---------------------------------------------------------------------------
+void MGL_EXPORT mgl_parser_openhdf(HMPR p, const char *fname)
+{
+       const char * const *res = mgl_datas_hdf_str(fname);
+       if(!res)        return;
+       for(size_t n=0;res[n][0];n++)
+       {
+               mglDataA *d = p->AddVar(res[n]);
+               mglData *dr = dynamic_cast<mglData*>(d);
+               mglDataC *dc = dynamic_cast<mglDataC*>(d);
+               if(dr)  dr->ReadHDF(fname,res[n]);
+               if(dc)  dc->ReadHDF(fname,res[n]);
+       }
+}
+void MGL_EXPORT mgl_parser_openhdf_(uintptr_t *p, const char *fname,int l)
+{      char *s=new char[l+1];  memcpy(s,fname,l);      s[l]=0;
+       mgl_parser_openhdf(_PR_,s);     delete []s;     }
+//---------------------------------------------------------------------------
+void MGL_EXPORT mgl_parser_start_id(HMPR pr, int id)
+{      pr->StarObhID = id;     }
+void MGL_EXPORT mgl_parser_start_id_(uintptr_t* p, int *id)
+{      mgl_parser_start_id(_PR_, *id); }
+
+//---------------------------------------------------------------------------
+mglCommand mgls_prg_cmd[] = {
+       {"ask",_("Define parameter from user input"),"ask $N 'question'", 0, 6},
+       {"break",_("Break for-loop"),"break", 0, 6},
+       {"call",_("Execute script in external file"),"call 'name' [args]", 0, 6},
+       {"continue",_("Skip commands and iterate for-loop again"),"continue", 0, 6},
+       {"defchr",_("Define parameter as character"),"defchr $N val", 0, 6},
+       {"define",_("Define constant or parameter"),"define $N sth | Var val", 0, 6},
+       {"defnum",_("Define parameter as numerical value"),"defnum $N val", 0, 6},
+//     {"defpal",_("Define parameter as palette color"),"defpal $N val", 0, 6},
+       {"else",_("Execute if condition is false"),"else", 0, 6},
+       {"elseif",_("Conditional operator"),"elseif val|Dat ['cond']", 0, 6},
+       {"endif",_("Finish if/else block"),"endif", 0, 6},
+       {"for",_("For loop"),"for $N v1 v2 [dv] | $N Dat", 0, 6},
+       {"func",_("Start function definition and stop execution of main script"),"func 'name' [narg]", 0, 6},
+       {"if",_("Conditional operator"),"if val|Dat ['cond']", 0, 6},
+       {"list",_("Creates new variable from list of numbers or data"),"list Var v1 ...|Var D1 ...", 0, 4},
+       {"next",_("Start next for-loop iteration"),"next", 0, 6},
+       {"once",_("Start/close commands which should executed only once"),"once val", 0, 6},
+       {"return",_("Return from function"),"return", 0, 6},
+       {"stop",_("Stop execution"),"stop", 0, 6},
+{"","","",NULL,0}};
+//-----------------------------------------------------------------------------
index b99338c06cf092dc76538531a00364ab669e3537..111e4d31cc09de26981fae56bdcd91d31821df65 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * pde.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -29,19 +29,159 @@ HADT MGL_NO_EXPORT mglFormulaCalcC(const char *str, const std::vector<mglDataA*>
 //             Advanced PDE series in 2D case\r
 //\r
 //-----------------------------------------------------------------------------\r
+void MGL_NO_EXPORT mgl_operator_exp(long n, dual *h, dual *a, dual *f)\r
+{\r
+       memset(f,0,2*n*sizeof(dual));\r
+       const long i1=n/2, i2=3*n/2-1;\r
+#pragma omp parallel for\r
+       for(long j=0;j<n;j++)\r
+       {\r
+               long jp = (j+1)%n;\r
+               dual h1=h[n*j]*dual(0,1),               g1=(h1+h[n*jp]*dual(0,1))/mreal(2);\r
+               dual h2=h[n-1+n*j]*dual(0,1),   g2=(h2+h[n-1+n*jp]*dual(0,1))/mreal(2);\r
+               mreal k1=M_PI*2*j/n, k2 = M_PI*(2*j+1)/n;\r
+               for(long i=0;i<i1;i++)\r
+               {\r
+                       f[2*j] += a[i]*exp(h1+dual(0,i*k1));\r
+                       f[2*j+1] += a[i]*exp(g1+dual(0,i*k2));\r
+               }\r
+               for(long i=i1;i<i2;i++)\r
+               {\r
+                       dual hh = h[i-i1+n*j];\r
+                       f[2*j] += a[i]*exp(hh*dual(0,1)+dual(0,i*k1));\r
+                       f[2*j+1] += a[i]*exp((hh+h[i-i1+n*jp])*dual(0,0.5)+dual(0,i*k2));\r
+               }\r
+               for(long i=i2;i<2*n;i++)\r
+               {\r
+                       f[2*j] += a[i]*exp(h2+dual(0,i*k1));\r
+                       f[2*j+1] += a[i]*exp(g2+dual(0,i*k2));\r
+               }\r
+       }\r
+       memset(a,0,2*n*sizeof(dual));\r
+#pragma omp parallel for\r
+       for(long i=0;i<2*n;i++)\r
+       {\r
+               long ii=i-i1;\r
+               if(ii<0)        ii=0;\r
+               if(ii>n-1)      ii=n-1;\r
+               double kk=M_PI*2*i/n;\r
+               for(long j=0;j<n;j++)\r
+               {\r
+                       dual h1 = h[ii+n*j], g1 = (h1+h[ii+n*((j+1)%n)])*dual(0,0.5);\r
+                       a[i] += f[2*j]*exp(h1*dual(0,1)-dual(0,kk*j));\r
+                       a[i] += f[2*j+1]*exp(g1-dual(0,kk*(j+0.5)));\r
+               }\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
+void MGL_NO_EXPORT mgl_operator_lin(long n, mreal *h, dual *a, dual *f, dual *g, dual *o)\r
+{\r
+       memset(f,0,2*n*sizeof(dual));\r
+       memset(g,0,2*n*sizeof(dual));\r
+       const long i1=n/2, i2=3*n/2-1;\r
+#pragma omp parallel for\r
+       for(long j=0;j<n;j++)\r
+       {\r
+               long jp = (j+1)%n;\r
+               mreal h1=tanh(h[n*j]), g1=(h1+tanh(h[n*jp]))/2;\r
+               mreal h2=tanh(h[n-1+n*j]), g2=(h2+tanh(h[n-1+n*jp]))/2;\r
+               mreal k1=M_PI*2*j/n, k2 = M_PI*(2*j+1)/n;\r
+               for(long i=0;i<i1;i++)\r
+               {\r
+                       dual e1=exp(dual(0,i*k1)), e2=exp(dual(0,i*k2));\r
+                       f[2*j] += a[i]*h1*e1;   f[2*j+1] += a[i]*g1*e2;\r
+                       g[2*j] += a[i]*e1;              g[2*j+1] += a[i]*e2;\r
+               }\r
+               for(long i=i1;i<i2;i++)\r
+               {\r
+                       mreal hh = tanh(h[i-i1+n*j]);\r
+                       mreal gg = (hh+tanh(h[i-i1+n*jp]))/2;\r
+                       dual e1=exp(dual(0,i*k1)), e2=exp(dual(0,i*k2));\r
+                       f[2*j] += a[i]*hh*e1;   f[2*j+1] += a[i]*gg*e2;\r
+                       g[2*j] += a[i]*e1;              g[2*j+1] += a[i]*e2;\r
+               }\r
+               for(long i=i2;i<2*n;i++)\r
+               {\r
+                       dual e1=exp(dual(0,i*k1)), e2=exp(dual(0,i*k2));\r
+                       f[2*j] += a[i]*h2*e1;   f[2*j+1] += a[i]*g2*e2;\r
+                       g[2*j] += a[i]*e1;              g[2*j+1] += a[i]*e2;\r
+               }\r
+       }\r
+       memset(o,0,2*n*sizeof(dual));\r
+#pragma omp parallel for\r
+       for(long i=0;i<2*n;i++)\r
+       {\r
+               long ii=i-i1;\r
+               if(ii<0)        ii=0;\r
+               if(ii>n-1)      ii=n-1;\r
+               double kk=M_PI*2*i/n;\r
+               for(long j=0;j<n;j++)\r
+               {\r
+                       mreal h1 = tanh(h[ii+n*j]);\r
+                       mreal g1 = (h1+tanh(h[ii+n*((j+1)%n)]))/2;\r
+                       dual e1=exp(dual(0,-j*kk)), e2=exp(dual(0,-kk*(j+0.5)));\r
+                       o[i] += f[2*j]*e1 + f[2*j+1]*e2;\r
+                       o[i] += g[2*j]*h1*e1 + g[2*j+1]*g1*e2;\r
+               }\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
+HADT MGL_NO_EXPORT mgl_apde_calc_ham(HMDT hs, bool old, const char *func, std::vector<mglDataA*> list, const mreal dd)\r
+{\r
+       HADT ham = mglFormulaCalcC(func, list); mgl_datac_mul_num(ham,dd);\r
+       const long nx = ham->nx;\r
+       if(old)\r
+       {\r
+               mreal hh = ham->Imag().Minimal();\r
+               if(hh>0)        hh=0;\r
+#pragma omp parallel for\r
+               for(long i=0;i<nx*nx;i++)\r
+               {\r
+                       hs->a[i] = sqrt(imag(ham->a[i])-hh);    // non-additive term\r
+                       ham->a[i] = dual(real(ham->a[i]),hh);   // additive terms\r
+               }\r
+       }\r
+       else\r
+       {\r
+               mglData xIm(nx), pIm(nx);\r
+#pragma omp parallel for\r
+               for(long i=0;i<nx;i++)  // first find minimal values along x and p\r
+               {\r
+                       dual *ax=ham->a+i, *ay=ham->a+i*nx;\r
+                       mreal mx=imag(ax[0]), my=imag(ay[0]);\r
+                       for(long j=1;j<nx;j++)  my = (my<imag(ay[j]))?my:imag(ay[j]);\r
+                       for(long j=1;j<nx;j++)  mx = (mx<imag(ax[j*nx]))?mx:imag(ax[j*nx]);\r
+                       xIm.a[i] = mx;  pIm.a[i]=my;\r
+               }\r
+               mreal mIm=xIm.a[0];     mreal *aa=xIm.a;        // global minimum\r
+               for(long j=1;j<nx;j++)  mIm = (mIm<aa[j])?mIm:aa[j];\r
+#pragma omp parallel for collapse(2)\r
+               for(long j=0;j<nx;j++)  for(long i=0;i<nx;i++)\r
+               {\r
+                       mreal hh = xIm.a[i]+pIm.a[j]-mIm;\r
+                       long i0=i+nx*j;\r
+                       hs->a[i0] = sqrt(fabs(imag(ham->a[i0])-hh));    // non-additive term. NOTE: fabs() guarantee absence of negative values due to rounding error\r
+                       ham->a[i0] = dual(real(ham->a[i0]),hh); // additive terms\r
+               }\r
+       }\r
+       return ham;\r
+}\r
+//-----------------------------------------------------------------------------\r
 // Solve equation dx/dy = func(p,x,y,|u|)[u] where p=d/dx. There are no assumptions about form of func().\r
 HADT MGL_EXPORT mgl_pde_adv_c(HMGL gr, const char *func, HCDT ini_re, HCDT ini_im, mreal dt, mreal k0, const char *opt)\r
 {\r
        mreal gamma = gr->SaveState(opt);       if(mgl_isnan(gamma))    gamma = 20;\r
-       mglPoint Min=gr->Min, Max=gr->Max;\r
-       long nx=ini_re->GetNx(), nt = long((Max.y-Min.y)/dt)+1;\r
+       const mglPoint &Min=gr->Min, &Max=gr->Max;\r
+       const long nx=ini_re->GetNx(), nt = long((Max.y-Min.y)/dt)+1;\r
        if(nx<2 || nt<2 || Max.x==Min.x){       gr->SetWarn(mglWarnLow,"PDE");  return 0;       }       // Too small data\r
        if(ini_im->GetNx() != nx)               {       gr->SetWarn(mglWarnDim,"PDE");  return 0;       }       // Wrong dimensions\r
 \r
        mglDataC *res=new mglDataC(nx, nt);\r
+       mglData hIm(nx,nx);     // for advanced damping calculation\r
        mglDataC u(nx); u.s = L"u";\r
        mglDataV x(nx,nx), y(nx,nx), r(nx,nx);\r
        mglDataW p(nx,nx);      p.s = L"p";\r
+       bool old = func[0]==';';        if(old) func=func+1;\r
        x.s = L"x";     y.s = L"y";     r.s=L"#$mgl";\r
        const mreal dp = 2*M_PI/(Max.x-Min.x), dd = k0*dt/2;\r
        x.Fill(Min.x,Max.x,'x');        p.Freq(dp/k0,'y');\r
@@ -49,7 +189,7 @@ HADT MGL_EXPORT mgl_pde_adv_c(HMGL gr, const char *func, HCDT ini_re, HCDT ini_i
        list.push_back(&x);     list.push_back(&y);     list.push_back(&p);     list.push_back(&r);     list.push_back(&u);\r
 \r
        dual *a = new dual[2*nx];       memset(a,0,2*nx*sizeof(dual));  // Add "damping" area\r
-       dual *f = new dual[2*nx];       memset(f,0,2*nx*sizeof(dual));  // Effective "spectrum"\r
+       dual *f = new dual[6*nx], *g=f+2*nx, *s=f+4*nx;\r
 #pragma omp parallel for\r
        for(long i=0;i<nx;i++)  // Initial conditions\r
                a[i+nx/2] = dual(ini_re->v(i), ini_im->v(i));\r
@@ -60,57 +200,25 @@ HADT MGL_EXPORT mgl_pde_adv_c(HMGL gr, const char *func, HCDT ini_re, HCDT ini_i
                if(i<nx/2)              dmp[i] += gamma*mgl_ipow((nx/2-i)/mreal(nx/2),2);\r
                if(i>3*nx/2)    dmp[i] += gamma*mgl_ipow((i-3*nx/2-1)/mreal(nx/2),2);\r
        }\r
+       bool have_y = mglchr(func,'y');\r
        HADT ham;\r
+       if(!have_y)             ham = mgl_apde_calc_ham(&hIm, old, func, list, dd);\r
        for(long k=0;k<nt;k++)\r
        {\r
-               y.Fill(k*dt);\r
                memcpy(u.a,a+nx/2,nx*sizeof(dual));\r
                memcpy(res->a+k*nx,a+nx/2,nx*sizeof(dual));\r
-               ham = mglFormulaCalcC(func, list);\r
-               memset(f,0,2*nx*sizeof(dual));\r
-               const long i1=nx/2, i2=3*nx/2-1;\r
-#pragma omp parallel for\r
-               for(long j=0;j<nx;j++)\r
-               {\r
-                       long jp = j<nx-1?j+1:0;\r
-                       dual h1=dual(0,dd)*ham->a[nx*j], h2=dual(0,dd)*ham->a[nx-1+nx*j];\r
-                       dual g1=(h1+dual(0,dd)*ham->a[nx*jp])/mreal(2), g2=(h2+dual(0,dd)*ham->a[nx-1+nx*jp])/mreal(2);\r
-                       mreal k1=M_PI*2*j/nx, k2 = M_PI*(2*j+1)/nx;\r
-                       for(long i=0;i<i1;i++)\r
-                       {\r
-                               f[2*j] += a[i]*exp(h1+dual(0,i*k1));\r
-                               f[2*j+1] += a[i]*exp(g1+dual(0,i*k2));\r
-                       }\r
-                       for(long i=i1;i<i2;i++)\r
-                       {\r
-                               dual hh = ham->a[i-i1+nx*j];\r
-                               f[2*j] += a[i]*exp(dual(0,dd)*hh+dual(0,i*k1));\r
-                               f[2*j+1] += a[i]*exp(dual(0,dd)*(hh+ham->a[i-i1+nx*jp])/mreal(2)+dual(0,i*k2));\r
-                       }\r
-                       for(long i=i2;i<2*nx;i++)\r
-                       {\r
-                               f[2*j] += a[i]*exp(h2+dual(0,i*k1));\r
-                               f[2*j+1] += a[i]*exp(g2+dual(0,i*k2));\r
-                       }\r
-               }\r
-               memset(a,0,2*nx*sizeof(dual));\r
+               if(have_y)\r
+               {       y.Fill(k*dt);   ham = mgl_apde_calc_ham(&hIm, old, func, list, dd);     }\r
+               mgl_operator_exp(nx,ham->a,a,f);\r
+               mgl_operator_lin(nx,hIm.a,a,f,g,s);\r
+               mgl_operator_lin(nx,hIm.a,s,f,g,s);\r
 #pragma omp parallel for\r
                for(long i=0;i<2*nx;i++)\r
-               {\r
-                       register long ii=i-i1;\r
-                       if(ii<0)        ii=0;   if(ii>nx-1)     ii=nx-1;\r
-                       double kk=M_PI*2*i/nx;\r
-                       for(long j=0;j<nx;j++)\r
-                       {\r
-                               dual h1 = ham->a[ii+nx*j], g1 = (h1+ham->a[ii+nx*(j<nx-1?j+1:0)])/mreal(2);\r
-                               a[i] += f[2*j]*exp(dual(0,dd)*h1-dual(0,kk*j));\r
-                               a[i] += f[2*j+1]*exp(dual(0,dd)*g1-dual(0,kk*(j+0.5)));\r
-                       }\r
-                       a[i] *= exp(-dmp[i]*dt)/mreal(2*nx);\r
-               }\r
-               delete ham;\r
+                       a[i] = (a[i]-s[i]/mreal(8*nx*nx))*mreal(exp(-dmp[i]*dt)/2/nx);\r
+               if(have_y)      delete ham;\r
        }\r
        delete []a;     delete []f;     delete []dmp;\r
+       if(!have_y)     delete ham;\r
        gr->LoadState();        return res;\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -160,7 +268,7 @@ uintptr_t MGL_EXPORT mgl_pde_adv_(uintptr_t* gr, const char *ham, uintptr_t* ini
 #pragma omp parallel for collapse(2)\r
        for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)  // Initial conditions\r
        {\r
-               register long i0 = i+nx/2+2*nx*(j+ny/2);\r
+               long i0 = i+nx/2+2*nx*(j+ny/2);\r
                a[i0] = dual(ini_re->v(i,j), ini_im->v(i,j));\r
                res->a[nz*(i+nx*j)] = a[i0];\r
        }\r
@@ -169,7 +277,7 @@ uintptr_t MGL_EXPORT mgl_pde_adv_(uintptr_t* gr, const char *ham, uintptr_t* ini
 #pragma omp parallel for collapse(2)\r
        for(long j=0;j<2*ny;j++)        for(long i=0;i<2*nx;i++)        // step 1\r
        {\r
-               register long i0 = i+2*nx*j;\r
+               long i0 = i+2*nx*j;\r
                if(i<nx/2)              dmp[i0] += gamma*mgl_ipow((nx/2-i)/(nx/2.),2);\r
                if(i>3*nx/2)    dmp[i0] += gamma*mgl_ipow((i-3*nx/2-1)/(nx/2.),2);\r
                if(j<ny/2)              dmp[i0] += gamma*mgl_ipow((ny/2-j)/(ny/2.),2);\r
@@ -195,7 +303,7 @@ struct mgl_pde_ham
 };\r
 void MGL_NO_EXPORT mgl_pde_hprep(const mgl_pde_ham *f)\r
 {\r
-       long nx = f->nx, ny = f->ny;\r
+       const long nx = f->nx, ny = f->ny;\r
        mglDataV x(nx,ny), y(nx,ny), z, r(nx,ny);\r
        mglDataW p(nx,ny), q(nx,ny);\r
        x.s = L"x";     y.s = L"y";     p.s = L"p";     q.s = L"q";     r.s=L"#$mgl";\r
@@ -238,7 +346,7 @@ void MGL_NO_EXPORT mgl_pde_hprep(const mgl_pde_ham *f)
        }\r
 }\r
 //-----------------------------------------------------------------------------\r
-// Solve equation dx/dz = func(p,q,x,y,z,|u|)[u] where p=d/dx, q=d/dy. At this moment simplified form of ham is supported: ham = f(p,q,z) + g(x,y,z,'u'), where variable 'u'=|u| (for allowing solve nonlinear problems). You may specify imaginary part like ham = p^2 + i*x*(x>0) but only if dependence on variable 'i' is linear (i.e. ham = hre+i*him).\r
+// Solve equation dx/dz = func(p,q,x,y,z,|u|)[u] where p=d/dx, q=d/dy. At this moment simplified form of ham is supported: ham = f(p,q,z) + g(x,y,z,'u'), where variable 'u'=|u| (for allowing solve nonlinear problems). You may specify imaginary part like ham = p^2 + 1i*x*(x>0).\r
 HADT MGL_EXPORT mgl_pde_solve_c(HMGL gr, const char *ham, HCDT ini_re, HCDT ini_im, mreal dz, mreal k0, const char *opt)\r
 {\r
        mreal gamma = gr->SaveState(opt);       if(mgl_isnan(gamma))    gamma = GAMMA;\r
@@ -261,14 +369,14 @@ HADT MGL_EXPORT mgl_pde_solve_c(HMGL gr, const char *ham, HCDT ini_re, HCDT ini_
 #pragma omp parallel for collapse(2)\r
        for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)  // Initial conditions\r
        {\r
-               register long i0 = i+nx/2+2*nx*(j+ny/2);\r
+               long i0 = i+nx/2+2*nx*(j+ny/2);\r
                a[i0] = dual(ini_re->v(i,j), ini_im->v(i,j));\r
                res->a[nz*(i+nx*j)] = a[i0];\r
        }\r
 #pragma omp parallel for collapse(2)\r
        for(long j=0;j<2*ny;j++)        for(long i=0;i<2*nx;i++)        // step 1\r
        {\r
-               register long i0 = i+2*nx*j;\r
+               long i0 = i+2*nx*j;\r
                if(i<nx/2)              dmp[i0] += gamma*mgl_ipow((nx/2-i)/(nx/2.),2);\r
                if(i>3*nx/2)    dmp[i0] += gamma*mgl_ipow((i-3*nx/2-1)/(nx/2.),2);\r
                if(j<ny/2)              dmp[i0] += gamma*mgl_ipow((ny/2-j)/(ny/2.),2);\r
@@ -301,9 +409,9 @@ HADT MGL_EXPORT mgl_pde_solve_c(HMGL gr, const char *ham, HCDT ini_re, HCDT ini_
                hh0=hu[0];\r
                if(ny>1)\r
 #pragma omp parallel for collapse(2)\r
-                       for(long i=0;i<2*nx;i++) for(long j=0;j<2*ny;j++)\r
+                for(long j=0;j<2*ny;j++)       for(long i=0;i<2*nx;i++)\r
                        {\r
-                               register long i0 = i+2*nx*j;    huv[i0] -= hh0;\r
+                               long i0 = i+2*nx*j;     huv[i0] -= hh0;\r
                                hxv[i0] -= hx[i]+hv[j]-hh0;\r
                                huy[i0] -= hu[i]+hy[j]-hh0;\r
                        }\r
@@ -348,7 +456,7 @@ HADT MGL_EXPORT mgl_pde_solve_c(HMGL gr, const char *ham, HCDT ini_re, HCDT ini_
                        mgl_fft_free_thr(wsx);\r
                }\r
 #pragma omp parallel for collapse(2)\r
-               for(long i=0;i<nx;i++)  for(long j=0;j<ny;j++)  // save result\r
+               for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)  // save result\r
                        res->a[k+nz*(i+nx*j)] = a[i+nx/2+2*nx*(j+ny/2)];\r
        }\r
        mgl_fft_free(wtx,0,0);  mgl_fft_free(wty,0,0);\r
@@ -385,7 +493,7 @@ struct mglOdeTxt    {       long n; HMEX *eq;       const char *var;        };
 void MGL_NO_EXPORT mgl_txt_func(const mreal *x, mreal *dx, void *par)\r
 {\r
        mglOdeTxt *p=(mglOdeTxt *)par;\r
-       mreal vars['z'-'a'+1];\r
+       mreal vars[MGL_VS];\r
        for(long i=0;i<p->n;i++)\r
        {       char ch = p->var[i];    if(ch>='a' && ch<='z')  vars[ch-'a']=x[i];      }\r
 #pragma omp parallel for\r
@@ -415,30 +523,74 @@ HMDT MGL_EXPORT mgl_ode_solve_str(const char *func, const char *var, HCDT x0, mr
        delete []par.eq;        delete []buf;   delete []xx;\r
        return res;\r
 }\r
+//-----------------------------------------------------------------------------\r
+struct mglOdeTxtC      {       long n; HAEX *eq;       const char *var;        };\r
+void MGL_NO_EXPORT mgl_txt_funcC(const mreal *x, mreal *dx, void *par)\r
+{\r
+       mglOdeTxtC *p=(mglOdeTxtC *)par;\r
+       dual vars[MGL_VS];\r
+       for(long i=0;i<p->n;i++)\r
+       {       char ch = p->var[i];    if(ch>='a' && ch<='z')  vars[ch-'a']=dual(x[2*i],x[2*i+1]);     }\r
+#pragma omp parallel for\r
+       for(long i=0;i<p->n;i++)\r
+       {\r
+               dual r = mgl_cexpr_eval_v(p->eq[i], vars);\r
+               dx[2*i] = real(r);      dx[2*i+1] = imag(r);\r
+       }\r
+}\r
+HADT MGL_EXPORT mgl_ode_solve_str_c(const char *func, const char *var, HCDT x0, mreal dt, mreal tmax)\r
+{\r
+       if(!var || !(*var) || !func)    return 0;\r
+       long len = strlen(func);\r
+       mglOdeTxtC par; par.var=var;\r
+       par.n = strlen(var);\r
+       par.eq = new HAEX[par.n];\r
+       char *buf = new char[len+1], *f=buf, *g=f;      memcpy(buf,func,len+1);\r
+       mreal *xx = new mreal[2*par.n];\r
+       const mglDataC *c = dynamic_cast<const mglDataC *>(x0);\r
+       for(long i=0;i<par.n;i++)\r
+       {\r
+               if(c)   {       xx[2*i]=real(c->a[i]);  xx[2*i+1]=imag(c->a[i]);        }\r
+               else    {       xx[2*i] = x0?x0->vthr(i):0;     xx[2*i+1]=0;    }\r
+               for(long k=0;f[k];k++)  if(f[k]==';')\r
+               { g = f+k+1;    f[k]=0; break;  }\r
+               if(f==g)        g = f+strlen(f);\r
+               par.eq[i] = mgl_create_cexpr(f);\r
+               f = g;\r
+       }\r
+       HMDT res = mgl_ode_solve_ex(mgl_txt_funcC,2*par.n,xx,dt,tmax,&par,NULL);\r
+       for(long i=0;i<par.n;i++)       mgl_delete_cexpr(par.eq[i]);\r
+       delete []par.eq;        delete []buf;   delete []xx;\r
+       const long nn=par.n,nt=res->ny;\r
+       mglDataC *out = new mglDataC(nn, nt);\r
+#pragma omp parallel for\r
+       for(long i=0;i<nt*nn;i++)       out->a[i] = dual(res->a[2*i],res->a[2*i+1]);\r
+       delete res;     return out;\r
+}\r
+//-----------------------------------------------------------------------------\r
 HMDT MGL_EXPORT mgl_ode_solve(void (*func)(const mreal *x, mreal *dx, void *par), int n, const mreal *x0, mreal dt, mreal tmax, void *par)\r
 {      return mgl_ode_solve_ex(func,n,x0,dt,tmax,par,0);       }\r
 HMDT MGL_EXPORT mgl_ode_solve_ex(void (*func)(const mreal *x, mreal *dx, void *par), int n, const mreal *x0, mreal dt, mreal tmax, void *par, void (*bord)(mreal *x, const mreal *xp, void *par))\r
 {\r
        if(tmax<dt)     return 0;       // nothing to do\r
-       int nt = int(tmax/dt+0.5)+1;\r
+       const long nt = int(tmax/dt+0.5)+1;\r
        mglData *res=new mglData(n,nt);\r
        mreal *x=new mreal[n], *k1=new mreal[n], *k2=new mreal[n], *k3=new mreal[n], *v=new mreal[n], hh=dt/2;\r
-       register long i,k;\r
        // initial conditions\r
-       for(i=0;i<n;i++)        x[i] = res->a[i] = x0[i];\r
+       for(long i=0;i<n;i++)   x[i] = res->a[i] = x0[i];\r
        // Runge Kutta scheme of 4th order\r
-       for(k=1;k<nt;k++)\r
+       for(long k=1;k<nt;k++)\r
        {\r
                func(x,k1,par);\r
-               for(i=0;i<n;i++)        v[i] = x[i]+k1[i]*hh;\r
+               for(long i=0;i<n;i++)   v[i] = x[i]+k1[i]*hh;\r
                func(v,k2,par);\r
-               for(i=0;i<n;i++)        v[i] = x[i]+k2[i]*hh;\r
+               for(long i=0;i<n;i++)   v[i] = x[i]+k2[i]*hh;\r
                func(v,k3,par);\r
-               for(i=0;i<n;i++)        {       v[i] = x[i]+k3[i]*dt;   k3[i] += k2[i]; }\r
+               for(long i=0;i<n;i++)   {       v[i] = x[i]+k3[i]*dt;   k3[i] += k2[i]; }\r
                func(v,k2,par);\r
-               for(i=0;i<n;i++)        x[i] += (k1[i]+k2[i]+2*k3[i])*dt/6;\r
+               for(long i=0;i<n;i++)   x[i] += (k1[i]+k2[i]+2*k3[i])*dt/6;\r
                if(bord)        bord(x,res->a+n*(k-1),par);\r
-               for(i=0;i<n;i++)        res->a[i+n*k] = x[i];\r
+               for(long i=0;i<n;i++)   res->a[i+n*k] = x[i];\r
        }\r
        delete []x;     delete []k1;    delete []k2;    delete []k3;    delete []v;\r
        return res;\r
@@ -481,10 +633,9 @@ struct mgl_ap
        mgl_ap()        {       memset(this,0,sizeof(mgl_ap));  }\r
 };\r
 //-----------------------------------------------------------------------------\r
-void MGL_NO_EXPORT mgl_init_ra(int n, int n7, const mreal *r, mgl_ap *ra)      // prepare some intermediate data for QO (3d case)\r
+void MGL_NO_EXPORT mgl_init_ra(long n, int n7, const mreal *r, mgl_ap *ra)     // prepare some intermediate data for QO (3d case)\r
 {\r
-       register double tt;\r
-       tt = hypot(r[n7]-r[0], r[n7+1]-r[1]);\r
+       double tt = hypot(r[n7]-r[0], r[n7+1]-r[1]);\r
        if(tt)\r
        {\r
                ra[0].x1 = (r[n7+1]-r[1])/tt;\r
@@ -498,34 +649,35 @@ void MGL_NO_EXPORT mgl_init_ra(int n, int n7, const mreal *r, mgl_ap *ra) // pre
        ra[0].x2 = ra[0].y1*ra[0].z0 - ra[0].y0*ra[0].z1;       // vector g_2\r
        ra[0].y2 = ra[0].z1*ra[0].x0 - ra[0].z0*ra[0].x1;\r
        ra[0].z2 = ra[0].x1*ra[0].y0 - ra[0].x0*ra[0].y1;\r
-       register long i;\r
-       for(i=1;i<n;i++)        // NOTE: no parallel due to dependence on prev point!\r
+       for(long i=1;i<n;i++)   // NOTE: no parallel due to dependence on prev point!\r
        {\r
-               ra[i].dt = r[6+n7*i] - r[6+n7*(i-1)];\r
-               ra[i].x0 = r[n7*i]   - r[n7*(i-1)];             // NOTE: very rough formulas\r
-               ra[i].y0 = r[n7*i+1] - r[n7*(i-1)+1];   // for corresponding with dt one\r
-               ra[i].z0 = r[n7*i+2] - r[n7*(i-1)+2];   // for corresponding with dt one\r
-               tt = sqrt(ra[i].x0*ra[i].x0 + ra[i].y0*ra[i].y0 + ra[i].z0*ra[i].z0);\r
-               ra[i].x0 /= tt; ra[i].y0 /= tt; ra[i].z0 /= tt;\r
-               ra[i].ch = tt/ra[i].dt;\r
-               tt = ra[i].x0*ra[i-1].x1 + ra[i].y0*ra[i-1].y1 + ra[i].z0*ra[i-1].z1;\r
-               ra[i].x1 = ra[i-1].x1 - tt*ra[i].x0;    // vector g_1\r
-               ra[i].y1 = ra[i-1].y1 - tt*ra[i].y0;\r
-               ra[i].z1 = ra[i-1].z1 - tt*ra[i].z0;\r
-               ra[i].t1 = tt/(ra[i].dt*ra[i].ch);\r
-               tt = sqrt(ra[i].x1*ra[i].x1 + ra[i].y1*ra[i].y1 + ra[i].z1*ra[i].z1);\r
-               ra[i].x1 /= tt; ra[i].y1 /= tt; ra[i].z1 /= tt; // norm for reducing numeric error\r
-               ra[i].x2 = ra[i].y1*ra[i].z0 - ra[i].y0*ra[i].z1;       // vector g_2\r
-               ra[i].y2 = ra[i].z1*ra[i].x0 - ra[i].z0*ra[i].x1;\r
-               ra[i].z2 = ra[i].x1*ra[i].y0 - ra[i].x0*ra[i].y1;\r
-               tt = ra[i].x0*ra[i-1].x2 + ra[i].y0*ra[i-1].y2 + ra[i].z0*ra[i-1].z2;\r
-               ra[i].t2 = tt/(ra[i].dt*ra[i].ch);\r
-               // other parameters\r
-               ra[i].pt = r[n7*i+3]*ra[i].x0 + r[n7*i+4]*ra[i].y0 + r[n7*i+5]*ra[i].z0;\r
-               ra[i].q1 = r[n7*i+3]*ra[i].x1 + r[n7*i+4]*ra[i].y1 + r[n7*i+5]*ra[i].z1;\r
-               ra[i].q2 = r[n7*i+3]*ra[i].x2 + r[n7*i+4]*ra[i].y2 + r[n7*i+5]*ra[i].z2;\r
-               ra[i].d1 = (ra[i].q1-ra[i-1].q1)/(ra[i].dt*ra[i].ch);\r
-               ra[i].d2 = (ra[i].q2-ra[i-1].q2)/(ra[i].dt*ra[i].ch);\r
+               mgl_ap *ri=ra+i, *rp=ra+i-1;\r
+               const mreal *rr = r+n7*i;\r
+               ri->dt = rr[6] - rr[6-n7];\r
+               ri->x0 = rr[0] - rr[-n7];       // NOTE: very rough formulas\r
+               ri->y0 = rr[1] - rr[1-n7];      // for corresponding with dt one\r
+               ri->z0 = rr[2] - rr[2-n7];      // for corresponding with dt one\r
+               double ch = sqrt(ri->x0*ri->x0 + ri->y0*ri->y0 + ri->z0*ri->z0);\r
+               ri->x0 /= ch;   ri->y0 /= ch;   ri->z0 /= ch;\r
+               ri->ch = ch/ri->dt;\r
+               ri->pt = rr[3]*ri->x0 + rr[4]*ri->y0 + rr[5]*ri->z0;\r
+               ri->q1 = rr[3]*ri->x1 + rr[4]*ri->y1 + rr[5]*ri->z1;\r
+               ri->q2 = rr[3]*ri->x2 + rr[4]*ri->y2 + rr[5]*ri->z2;\r
+               // NOTE previous point is used here!\r
+               tt = ri->x0*rp->x1 + ri->y0*rp->y1 + ri->z0*rp->z1;\r
+               ri->x1 = rp->x1 - tt*ri->x0;    // vector g_1\r
+               ri->y1 = rp->y1 - tt*ri->y0;\r
+               ri->z1 = rp->z1 - tt*ri->z0;\r
+               ri->t1 = tt/ch;\r
+               tt = sqrt(ri->x1*ri->x1 + ri->y1*ri->y1 + ri->z1*ri->z1);\r
+               ri->x1 /= tt;   ri->y1 /= tt;   ri->z1 /= tt;   // norm for reducing numeric error\r
+               ri->x2 = ri->y1*ri->z0 - ri->y0*ri->z1; // vector g_2\r
+               ri->y2 = ri->z1*ri->x0 - ri->z0*ri->x1;\r
+               ri->z2 = ri->x1*ri->y0 - ri->x0*ri->y1;\r
+               tt = ri->x0*rp->x2 + ri->y0*rp->y2 + ri->z0*rp->z2;\r
+               ri->t2 = tt/ch;\r
+               ri->d1 = (ri->q1-rp->q1)/ch;\r
+               ri->d2 = (ri->q2-rp->q2)/ch;\r
        }\r
        memcpy(ra,ra+1,sizeof(mgl_ap)); // setup zero point\r
        ra[0].pt = r[3]*ra[0].x0 + r[4]*ra[0].y0 + r[5]*ra[0].z0;\r
@@ -554,16 +706,16 @@ MGL_NO_EXPORT void *mgl_qo2d_hprep(void *par)
        mgl_ap *ra = f->ra;\r
 \r
        const mreal *r = f->r;\r
-       long nx=t->n;\r
+       const long nx=t->n;\r
 #if !MGL_HAVE_PTHREAD\r
 #pragma omp parallel for\r
 #endif\r
        for(long i=t->id;i<nx;i+=mglNumThr)\r
        {\r
                // x terms\r
-               register mreal x1 = (2*i-nx+1)*f->dr, hh = 1 - ra->t1*x1;\r
+               mreal x1 = (2*i-nx+1)*f->dr, hh = 1 - ra->t1*x1;\r
                hh = sqrt(sqrt(0.041+hh*hh*hh*hh));\r
-               register mreal tt = (ra->pt + ra->d1*x1)/hh - ra->pt;\r
+               mreal tt = (ra->pt + ra->d1*x1)/hh - ra->pt;\r
                f->hx[i] = f->ham(abs(f->a[i]), r[0]+ra->x1*x1, r[1]+ra->y1*x1, r[3]+ra->x0*tt, r[4]+ra->y0*tt, f->par) - f->h0/2.;\r
                // u-y terms\r
                x1 = f->dk/2*(i<nx/2 ? i:i-nx);\r
@@ -581,7 +733,7 @@ HADT MGL_EXPORT mgl_qo2d_func_c(ddual (*ham)(mreal u, mreal x, mreal y, mreal px
 {\r
        const mglData *ray=dynamic_cast<const mglData *>(ray_dat);      // NOTE: Ray must be mglData!\r
        if(!ray)        return 0;\r
-       long nx=ini_re->GetNx(), nt=ray->ny, n7=ray->nx;\r
+       const long nx=ini_re->GetNx(), nt=ray->ny, n7=ray->nx;\r
        if(nx<2 || ini_im->GetNx()!=nx || nt<2) return 0;\r
        mglDataC *res=new mglDataC(nx,nt,1);\r
 \r
@@ -593,7 +745,7 @@ HADT MGL_EXPORT mgl_qo2d_func_c(ddual (*ham)(mreal u, mreal x, mreal y, mreal px
        memset(dmp,0,2*nx*sizeof(double));\r
        for(long i=0;i<nx/2;i++)        // prepare damping\r
        {\r
-               register mreal x1 = (nx/2-i)/(nx/2.);\r
+               mreal x1 = (nx/2-i)/(nx/2.);\r
                dmp[2*nx-1-i] = dmp[i] = 30*GAMMA*x1*x1/k0;\r
        }\r
        for(long i=0;i<nx;i++)  a[i+nx/2] = dual(ini_re->v(i),ini_im->v(i));    // init\r
@@ -610,7 +762,7 @@ HADT MGL_EXPORT mgl_qo2d_func_c(ddual (*ham)(mreal u, mreal x, mreal y, mreal px
                        res->a[i+k*nx]=a[i+nx/2]*sqrt(ra[0].ch/ra[k].ch);\r
                if(xx && yy)    for(long i=0;i<nx;i++)  // prepare xx, yy\r
                {\r
-                       register mreal x1 = (2*i-nx+1)*dr;\r
+                       mreal x1 = (2*i-nx+1)*dr;\r
                        xx->a[i+k*nx] = ray->a[n7*k] + ra[k].x1*x1;     // new coordinates\r
                        yy->a[i+k*nx] = ray->a[n7*k+1] + ra[k].y1*x1;\r
                }\r
@@ -706,17 +858,17 @@ MGL_NO_EXPORT void *mgl_qo3d_hprep(void *par)
        mgl_qo3d_ham *f = (mgl_qo3d_ham *)t->v;\r
        mgl_ap *ra = f->ra;\r
        const mreal *r = f->r;\r
-       long nx=t->n;\r
+       const long nx=t->n;\r
 #if !MGL_HAVE_PTHREAD\r
 #pragma omp parallel for\r
 #endif\r
        for(long ii=t->id;ii<nx*nx;ii+=mglNumThr)\r
        {\r
-               register long i = ii%nx, j = ii/nx;\r
+               long i = ii%nx, j = ii/nx;\r
                // x-y terms\r
-               register mreal x1 = (2*i-nx+1)*f->dr, x2 = (2*j-nx+1)*f->dr, hh = 1-ra->t1*x1-ra->t2*x2;\r
+               mreal x1 = (2*i-nx+1)*f->dr, x2 = (2*j-nx+1)*f->dr, hh = 1-ra->t1*x1-ra->t2*x2;\r
                hh = sqrt(sqrt(0.041+hh*hh*hh*hh));\r
-               register mreal tt = (ra->pt + ra->d1*x1 + ra->d2*x2)/hh - ra->pt;\r
+               mreal tt = (ra->pt + ra->d1*x1 + ra->d2*x2)/hh - ra->pt;\r
                f->hxy[ii] = f->ham(abs(f->a[i]), r[0]+ra->x1*x1+ra->x2*x2, r[1]+ra->y1*x1+ra->y2*x2, r[2]+ra->z1*x1+ra->z2*x2, r[3]+ra->x0*tt, r[4]+ra->y0*tt, r[5]+ra->z0*tt, f->par);\r
                // x-v terms\r
                x1 = (2*i-nx+1)*f->dr;  x2 = f->dk/2*(j<nx/2 ? j:j-nx); hh = 1-ra->t1*x1;\r
@@ -739,13 +891,13 @@ MGL_NO_EXPORT void *mgl_qo3d_post(void *par)
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        mgl_qo3d_ham *f = (mgl_qo3d_ham *)t->v;\r
-       long nx=t->n;\r
+       const long nx=t->n;\r
 #if !MGL_HAVE_PTHREAD\r
 #pragma omp parallel for\r
 #endif\r
        for(long ii=t->id;ii<nx*nx;ii+=mglNumThr)\r
        {\r
-               register long i = ii%nx, j = ii/nx;\r
+               long i = ii%nx, j = ii/nx;\r
                f->hxy[ii] -= (f->hx[i]+f->hy[j]-f->h0/2.)/2.;\r
                if(imag(f->hxy[ii])>0)  f->hxy[ii] = f->hxy[ii].real();\r
                f->hxv[ii] -= (f->hx[i]+f->hv[j]-f->h0/2.)/2.;\r
@@ -764,7 +916,7 @@ HADT MGL_EXPORT mgl_qo3d_func_c(ddual (*ham)(mreal u, mreal x, mreal y, mreal z,
 {\r
        const mglData *ray=dynamic_cast<const mglData *>(ray_dat);      // NOTE: Ray must be mglData!\r
        if(!ray)        return 0;\r
-       long nx=ini_re->GetNx(), nt=ray->ny, n7=ray->nx;        // NOTE: only square grids are supported now (for simplicity)\r
+       const long nx=ini_re->GetNx(), nt=ray->ny, n7=ray->nx;  // NOTE: only square grids are supported now (for simplicity)\r
        if(nx<2 || ini_re->GetNx()!=nx || ini_im->GetNx()*ini_im->GetNy()!=nx*nx || nt<2)       return 0;\r
        mglDataC *res=new mglDataC(nx,nx,nt);\r
 \r
@@ -779,7 +931,7 @@ HADT MGL_EXPORT mgl_qo3d_func_c(ddual (*ham)(mreal u, mreal x, mreal y, mreal z,
 #pragma omp parallel for collapse(2)\r
        for(long i=0;i<nx/2;i++)        for(long j=0;j<nx/2;j++)        // prepare damping\r
        {\r
-               register double x1 = (nx/2-i)/(nx/2.), x2 = (nx/2-j)/(nx/2.);\r
+               double x1 = (nx/2-i)/(nx/2.), x2 = (nx/2-j)/(nx/2.);\r
                dmp[2*nx-1-i] = dmp[i] = 30*GAMMA*x1*x1/k0;\r
                dmp[(2*nx-1-j)*2*nx] += 30*GAMMA*x2*x2/k0;\r
                dmp[j*2*nx] += 30*GAMMA*x2*x2/k0;\r
@@ -805,7 +957,7 @@ HADT MGL_EXPORT mgl_qo3d_func_c(ddual (*ham)(mreal u, mreal x, mreal y, mreal z,
 #pragma omp parallel for collapse(2)\r
                        for(long i=0;i<nx;i++)  for(long j=0;j<nx;j++)  // prepare xx, yy, zz\r
                        {\r
-                               register mreal x1 = (2*i-nx+1)*dr, x2 = (2*j-nx+1)*dr;\r
+                               mreal x1 = (2*i-nx+1)*dr, x2 = (2*j-nx+1)*dr;\r
                                xx->a[i+nx*(j+k*nx)] = ray->a[n7*k] + ra[k].x1*x1 + ra[k].x2*x2;        // new coordinates\r
                                yy->a[i+nx*(j+k*nx)] = ray->a[n7*k+1] + ra[k].y1*x1 + ra[k].y2*x2;\r
                                zz->a[i+nx*(j+k*nx)] = ray->a[n7*k+2] + ra[k].z1*x1 + ra[k].z2*x2;\r
@@ -915,7 +1067,7 @@ uintptr_t MGL_EXPORT mgl_qo3d_solve_(const char *ham, uintptr_t* ini_re, uintptr
 MGL_NO_EXPORT void *mgl_jacob2(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
-       long nx=t->p[0], ny=t->p[1];\r
+       const long nx=t->p[0], ny=t->p[1];\r
        mreal *r=t->a;\r
        const mreal *x=t->b, *y=t->c;\r
 #if !MGL_HAVE_PTHREAD\r
@@ -923,18 +1075,18 @@ MGL_NO_EXPORT void *mgl_jacob2(void *par)
 #endif\r
        for(long i0=t->id;i0<t->n;i0+=mglNumThr)\r
        {\r
-               register long i=i0%nx, j=i0/nx;\r
-               register long ip = i<nx-1 ? 1:0, jp = j<ny-1 ? nx:0;\r
-               register long im = i>0 ? -1:0, jm = j>0 ? -nx:0;\r
+               long i=i0%nx, j=i0/nx;\r
+               long ip = i<nx-1 ? 1:0, jp = j<ny-1 ? nx:0;\r
+               long im = i>0 ? -1:0, jm = j>0 ? -nx:0;\r
                r[i0] = (x[i0+ip]-x[i0+im])*(y[i0+jp]-y[i0+jm]) -\r
                                (y[i0+ip]-y[i0+im])*(x[i0+jp]-x[i0+jm]);\r
-               r[i0] *= mreal((nx-1)*(ny-1)) / ((ip-im)*(jp-jm));\r
+               r[i0] *= mreal((nx-1)*(ny-1)) / mreal((ip-im)*(jp-jm));\r
        }\r
        return 0;\r
 }\r
 HMDT MGL_EXPORT mgl_jacobian_2d(HCDT x, HCDT y)\r
 {\r
-       int nx = x->GetNx(), ny=x->GetNy();\r
+       const long nx = x->GetNx(), ny=x->GetNy();\r
        if(nx!=y->GetNx() || ny!=y->GetNy() || nx<2 || ny<2)    return  0;\r
        mglData *r=new mglData(nx,ny,1);\r
        const mglData *xx=dynamic_cast<const mglData *>(x);\r
@@ -949,11 +1101,11 @@ HMDT MGL_EXPORT mgl_jacobian_2d(HCDT x, HCDT y)
 #pragma omp parallel for collapse(2)\r
                for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
                {\r
-                       register long im = i>0 ? i-1:i, ip = i<nx-1 ? i+1:i;\r
-                       register long jm = j>0 ? j-1:j, jp = j<ny-1 ? j+1:j;\r
+                       long im = i>0 ? i-1:i, ip = i<nx-1 ? i+1:i;\r
+                       long jm = j>0 ? j-1:j, jp = j<ny-1 ? j+1:j;\r
                        r->a[i+nx*j] = (x->v(ip,j)-x->v(im,j))*(y->v(i,jp)-y->v(i,jm)) -\r
                                                (y->v(ip,j)-y->v(im,j))*(x->v(i,jp)-x->v(i,jm));\r
-                       r->a[i+nx*j] *= mreal((nx-1)*(ny-1)) / ((ip-im)*(jp-jm));\r
+                       r->a[i+nx*j] *= mreal((nx-1)*(ny-1)) / mreal((ip-im)*(jp-jm));\r
                }\r
        }\r
        return r;\r
@@ -962,7 +1114,7 @@ HMDT MGL_EXPORT mgl_jacobian_2d(HCDT x, HCDT y)
 MGL_NO_EXPORT void *mgl_jacob3(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
-       long nx=t->p[0], ny=t->p[1], nz=t->p[2];\r
+       const long nx=t->p[0], ny=t->p[1], nz=t->p[2];\r
        mreal *r=t->a;\r
        const mreal *x=t->b, *y=t->c, *z=t->d;\r
 #if !MGL_HAVE_PTHREAD\r
@@ -970,22 +1122,22 @@ MGL_NO_EXPORT void *mgl_jacob3(void *par)
 #endif\r
        for(long i0=t->id;i0<t->n;i0+=mglNumThr)\r
        {\r
-               register long i=i0%nx, j=(i0/nx)%ny, k=i0/(nx*ny);\r
-               register long ip = i<nx-1 ? 1:0, jp = j<ny-1 ? nx:0, kp = k<nz-1 ? nx*ny:0;\r
-               register long im = i>0 ? -1:0, jm = j>0 ? -nx:0, km = k>0 ? -nx*ny:0;\r
+               long i=i0%nx, j=(i0/nx)%ny, k=i0/(nx*ny);\r
+               long ip = i<nx-1 ? 1:0, jp = j<ny-1 ? nx:0, kp = k<nz-1 ? nx*ny:0;\r
+               long im = i>0 ? -1:0, jm = j>0 ? -nx:0, km = k>0 ? -nx*ny:0;\r
                r[i0] = (x[i0+ip]-x[i0+im])*(y[i0+jp]-y[i0+jm])*(z[i0+kp]-z[i0+km]) -\r
                                (x[i0+ip]-x[i0+im])*(y[i0+kp]-y[i0+km])*(z[i0+jp]-z[i0+jm]) -\r
                                (x[i0+jp]-x[i0+jm])*(y[i0+ip]-y[i0+im])*(z[i0+kp]-z[i0+km]) +\r
                                (x[i0+jp]-x[i0+jm])*(y[i0+kp]-y[i0+km])*(z[i0+ip]-z[i0+im]) +\r
                                (x[i0+kp]-x[i0+km])*(y[i0+ip]-y[i0+im])*(z[i0+jp]-z[i0+jm]) -\r
                                (x[i0+kp]-x[i0+km])*(y[i0+jp]-y[i0+jm])*(z[i0+ip]-z[i0+im]);\r
-               r[i0] *= mreal((nx-1)*(ny-1)*(nz-1)) / ((ip-im)*(jp-jm)*(kp-km));\r
+               r[i0] *= mreal((nx-1)*(ny-1)*(nz-1)) / mreal((ip-im)*(jp-jm)*(kp-km));\r
        }\r
        return 0;\r
 }\r
 HMDT MGL_EXPORT mgl_jacobian_3d(HCDT x, HCDT y, HCDT z)\r
 {\r
-       int nx = x->GetNx(), ny=x->GetNy(), nz=x->GetNz(), nn = nx*ny*nz;\r
+       const long nx = x->GetNx(), ny=x->GetNy(), nz=x->GetNz(), nn = nx*ny*nz;\r
        if(nx<2 || ny<2 || nz<2)        return 0;\r
        if(nn!=y->GetNN() || nn!=z->GetNN())    return 0;\r
        mglData *r=new mglData(nx,ny,nz);\r
@@ -1002,17 +1154,17 @@ HMDT MGL_EXPORT mgl_jacobian_3d(HCDT x, HCDT y, HCDT z)
 #pragma omp parallel for collapse(3)\r
                for(long k=0;k<nz;k++)  for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
                {\r
-                       register long im = i>0 ? i-1:i, ip = i<nx-1 ? i+1:i;\r
-                       register long jm = j>0 ? j-1:j, jp = j<ny-1 ? j+1:j;\r
-                       register long km = k>0 ? k-1:k, kp = k<nz-1 ? k+1:k;\r
-                       register long i0 = i+nx*(j+ny*k);\r
+                       long im = i>0 ? i-1:i, ip = i<nx-1 ? i+1:i;\r
+                       long jm = j>0 ? j-1:j, jp = j<ny-1 ? j+1:j;\r
+                       long km = k>0 ? k-1:k, kp = k<nz-1 ? k+1:k;\r
+                       long i0 = i+nx*(j+ny*k);\r
                        r->a[i0] = (x->v(ip,j,k)-x->v(im,j,k))*(y->v(i,jp,k)-y->v(i,jm,k))*(z->v(i,j,kp)-z->v(i,j,km)) -\r
                                        (x->v(ip,j,k)-x->v(im,j,k))*(y->v(i,j,kp)-y->v(i,j,km))*(z->v(i,jp,k)-z->v(i,jm,k)) -\r
                                        (x->v(i,jp,k)-x->v(i,jm,k))*(y->v(ip,j,k)-y->v(im,j,k))*(z->v(i,j,kp)-z->v(i,j,km)) +\r
                                        (x->v(i,jp,k)-x->v(i,jm,k))*(y->v(i,j,kp)-y->v(i,j,km))*(z->v(ip,j,k)-z->v(im,j,k)) +\r
                                        (x->v(i,j,kp)-x->v(i,j,km))*(y->v(ip,j,k)-y->v(im,j,k))*(z->v(i,jp,k)-z->v(i,jm,k)) -\r
                                        (x->v(i,j,kp)-x->v(i,j,km))*(y->v(i,jp,k)-y->v(i,jm,k))*(z->v(ip,j,k)-z->v(im,j,k));\r
-                       r->a[i0] *= mreal((nx-1)*(ny-1)*(nz-1)) / ((ip-im)*(jp-jm)*(kp-km));\r
+                       r->a[i0] *= mreal((nx-1)*(ny-1)*(nz-1)) / mreal((ip-im)*(jp-jm)*(kp-km));\r
                }\r
 \r
        }\r
@@ -1024,3 +1176,325 @@ uintptr_t MGL_EXPORT mgl_jacobian_2d_(uintptr_t* x, uintptr_t* y)
 uintptr_t MGL_EXPORT mgl_jacobian_3d_(uintptr_t* x, uintptr_t* y, uintptr_t* z)\r
 {      return uintptr_t(mgl_jacobian_3d(_DA_(x), _DA_(y), _DA_(z)));   }\r
 //-----------------------------------------------------------------------------\r
+//\r
+//     Progonka\r
+//\r
+//-----------------------------------------------------------------------------\r
+void MGL_NO_EXPORT mgl_progonka_sr(HCDT A, HCDT B, HCDT C, HCDT D, mreal *dat, long n, long id, long i0, long di, bool difr)\r
+{\r
+       mreal *aa=dat, *bb=dat+n, *uu=dat+2*n;\r
+       mreal b0=B->vthr(i0), c0=C->vthr(i0), d0=D->vthr(id);\r
+       if(difr)        d0 = (2.-b0)*d0-c0*D->vthr(id+di);\r
+       aa[0] = -c0/b0; bb[0] = d0/b0;\r
+       for(long i=1;i<n;i++)\r
+       {\r
+               long ii=i0+di*i, dd=id+di*i, tt = id+di*((i+1)%n);\r
+               mreal a=A->vthr(ii), b=B->vthr(ii), c=C->vthr(ii);\r
+               mreal d=difr?-a*D->vthr(dd-di)+(2.-b)*D->vthr(dd)-c*D->vthr(tt):D->vthr(dd);\r
+               aa[i] = -c/(b+a*aa[i-1]);\r
+               bb[i] = (d-a*bb[i-1])/(b+a*aa[i-1]);\r
+       }\r
+       uu[n-1] = bb[n-1];\r
+       for(long i=n-2;i>=0;i--)        uu[i] = bb[i]+aa[i]*uu[i+1];\r
+}\r
+void MGL_NO_EXPORT mgl_progonka_pr(HCDT A, HCDT B, HCDT C, HCDT D, mreal *dat, long n, long id, long i0, long di, bool difr)\r
+{\r
+       mreal *aa=dat, *bb=dat+n, *gg=dat+2*n, *uu=dat+3*n;\r
+       mreal a0=A->vthr(i0), b0=B->vthr(i0), c0=C->vthr(i0), d0=D->vthr(id);\r
+       if(difr)        d0 = -a0*D->vthr(id+di*(n-1))+(2.-b0)*d0-c0*D->vthr(id+di);\r
+       aa[0] =-c0/b0;  bb[0] = d0/b0;  gg[0] =-a0/b0;\r
+       for(long i=1;i<n;i++)\r
+       {\r
+               long ii=i0+di*i, il=id+di*((i+1)%n), dd=id+di*i;\r
+               mreal a=A->vthr(ii), b=B->vthr(ii), c=C->vthr(ii);\r
+               mreal d=difr?-a*D->vthr(dd-di)+(2.-b)*D->vthr(dd)-c*D->vthr(il):D->vthr(dd);\r
+               aa[i] = -c/(b+a*aa[i-1]);\r
+               bb[i] = (d-a*bb[i-1])/(b+a*aa[i-1]);\r
+               gg[i] = -a*gg[i-1]/(b+a*aa[i-1]);\r
+       }\r
+       mreal P=bb[n-1]/(1.-gg[n-1]), Q=aa[n-1]/(1.-gg[n-1]);\r
+       aa[n-1] = Q;    bb[n-1] = P;\r
+       for(long i=n-2;i>=0;i--)\r
+       {\r
+               bb[i] += aa[i]*bb[i+1]+gg[i]*P;\r
+               aa[i] = aa[i]*aa[i+1]+gg[i]*Q;\r
+       }\r
+       mreal u0 = bb[0]/(1.-aa[0]);\r
+       for(long i=0;i<n;i++)   uu[i]=bb[i]+aa[i]*u0;\r
+}\r
+void MGL_NO_EXPORT mgl_progonka_hr(HCDT A, HCDT B, HCDT C, HCDT D, mreal *dat, long n, long id, long i0, bool difr)\r
+{\r
+       mreal *aa=dat, *bb=dat+n, *uu=dat+n*n;\r
+       mreal b0=B->vthr(i0), c0=C->vthr(i0), d0=D->vthr(id);\r
+       uu[0] = d0/b0*(difr?(2.-b0):1.);\r
+       b0=B->vthr(i0+n*n-1);   d0=D->vthr(id+n*n-1);\r
+       uu[n*n-1] = d0/b0*(difr?(2.-b0):1.);\r
+       long di = n-1, i1 = i0+n*(n-1), d1 = id+n*(n-1);\r
+       // suppose the square grid!\r
+       for(long j=1;j<n;j++)\r
+       {\r
+               // first bottom-left triangle\r
+               b0=B->vthr(i0+j);       c0=C->vthr(i0+j);       d0=D->vthr(id+j);\r
+               if(difr)        d0 = (2.-b0)*d0-c0*D->vthr(id+j+di);\r
+               aa[0] = -c0/b0; bb[0] = d0/b0;\r
+               for(long i=1;i<=j;i++)\r
+               {\r
+                       long ii=i0+j+di*i, dd=id+j+di*i;\r
+                       mreal a=A->vthr(ii),b=B->vthr(ii),c=C->vthr(ii);\r
+                       mreal d=difr?-a*D->vthr(dd-di)+(2.-b)*D->vthr(dd)-c*D->vthr(dd+di):D->vthr(dd);\r
+                       aa[i] = -c/(b+a*aa[i-1]);\r
+                       bb[i] = (d-a*bb[i-1])/(b+a*aa[i-1]);\r
+               }\r
+               uu[j+di*(j-1)] = bb[j];\r
+               for(long i=j-1;i>=0;i--)\r
+                       uu[j+di*i] = bb[i]+aa[i]*uu[j+di*i+di];\r
+               // next top-right triangle\r
+               long j1=n-1-j;\r
+               b0=B->vthr(i1+j1);      c0=C->vthr(i1+j1);      d0=D->vthr(d1+j1);\r
+               if(difr)        d0 = (2.-b0)*d0-c0*D->vthr(d1+j1-di);\r
+               aa[0] = -c0/b0; bb[0] = d0/b0;\r
+               for(long i=1;i<=j;i++)\r
+               {\r
+                       long ii=i1+j1-di*i, dd=d1+j1-di*i;\r
+                       mreal a=A->vthr(ii),b=B->vthr(ii),c=C->vthr(ii);\r
+                       mreal d=difr?-a*D->vthr(dd+di)+(2.-b)*D->vthr(dd)-c*D->vthr(dd-di):D->vthr(dd);\r
+                       aa[i] = -c/(b+a*aa[i-1]);\r
+                       bb[i] = (d-a*bb[i-1])/(b+a*aa[i-1]);\r
+               }\r
+               uu[j1+n*(n-1)-di*(j-1)] = bb[j];\r
+               for(long i=j-1;i>=0;i--)\r
+                       uu[j1+n*(n-1)-di*i] = bb[i]+aa[i]*uu[j1+n*(n-1)-di*i-di];\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
+HMDT MGL_EXPORT mgl_data_tridmat(HCDT A, HCDT B, HCDT C, HCDT D, const char *how)\r
+{\r
+       const long nx=D->GetNx(),ny=D->GetNy(),nz=D->GetNz();\r
+       const long nn=nx*ny*nz, np=nx*ny, na=A->GetNN();\r
+       if(B->GetNN()!=na || C->GetNN()!=na)    return 0;\r
+       mglData *r = new mglData(nx,ny,nz);\r
+       bool per = mglchr(how,'c');\r
+       bool difr = mglchr(how,'d');\r
+       if(mglchr(how,'x') && (na==nn || na==np || na==nx))\r
+#pragma omp parallel\r
+       {\r
+               mglData T(nx,4);        mreal *uu=T.a+(per?3:2)*nx;\r
+#pragma omp for collapse(2)\r
+               for(long k=0;k<nz;k++)  for(long j=0;j<ny;j++)\r
+               {\r
+                       long i0=0, i1=nx*(j+ny*k);\r
+                       if(na==nn)      i0=nx*(j+ny*k); else if(na==np) i0=nx*j;\r
+                       if(per) mgl_progonka_pr(A,B,C,D,T.a,nx,i1,i0,1,difr);\r
+                       else    mgl_progonka_sr(A,B,C,D,T.a,nx,i1,i0,1,difr);\r
+                       i0 = nx*(j+ny*k);\r
+                       for(long i=0;i<nx;i++)  r->a[i+i0] = uu[i];\r
+               }\r
+       }\r
+       else if(mglchr(how,'y') && (na==nn || na==np || na==ny))\r
+#pragma omp parallel\r
+       {\r
+               mglData T(ny,4);        mreal *uu=T.a+(per?3:2)*ny;\r
+#pragma omp for collapse(2)\r
+               for(long k=0;k<nz;k++)  for(long i=0;i<nx;i++)\r
+               {\r
+                       long i0=0, i1 = i+np*k;\r
+                       if(na==nn)      i0=i+np*k;      else if(na==np) i0=i;\r
+                       if(per) mgl_progonka_pr(A,B,C,D,T.a,ny,i1,i0,nx,difr);\r
+                       else    mgl_progonka_sr(A,B,C,D,T.a,ny,i1,i0,nx,difr);\r
+                       i0 = i+np*k;\r
+                       for(long j=0;j<ny;j++)  r->a[j*nx+i0] = uu[j];\r
+               }\r
+       }\r
+       else if(mglchr(how,'z') && (na==nn || na==nz))\r
+#pragma omp parallel\r
+       {\r
+               mglData T(nz,4);        mreal *uu=T.a+(per?3:2)*nz;\r
+#pragma omp for collapse(2)\r
+               for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
+               {\r
+                       long i0 = na==nn?i+nx*j:0, i1 = i+nx*j;\r
+                       if(per) mgl_progonka_pr(A,B,C,D,T.a,nz,i1,i0,np,difr);\r
+                       else    mgl_progonka_sr(A,B,C,D,T.a,nz,i1,i0,np,difr);\r
+                       i0 = i+nx*j;\r
+                       for(long k=0;k<nz;k++)  r->a[k*np+i0] = uu[k];\r
+               }\r
+       }\r
+       else if(mglchr(how,'h') && ny==nx && (na==nn || na==np) && nx>1)\r
+#pragma omp parallel\r
+       {\r
+               mglData T(np,2);\r
+#pragma omp for\r
+               for(long k=0;k<nz;k++)\r
+               {\r
+                       mgl_progonka_hr(A,B,C,D,T.a,nx,k*np,na==nn ? k*np:0,difr);\r
+                       memcpy(r->a+k*np, T.a+np, np*sizeof(mreal));\r
+               }\r
+       }\r
+       else    {       delete r;       r=0;    }\r
+       return r;\r
+}\r
+//-----------------------------------------------------------------------------\r
+uintptr_t MGL_EXPORT mgl_data_tridmat_(uintptr_t *A, uintptr_t *B, uintptr_t *C, uintptr_t *D, const char *how, int l)\r
+{      char *s=new char[l+1];  memcpy(s,how,l);        s[l]=0;\r
+       uintptr_t r = uintptr_t(mgl_data_tridmat(_DA_(A),_DA_(B),_DA_(C),_DA_(D),s));\r
+       delete []s;     return r;\r
+}\r
+//-----------------------------------------------------------------------------\r
+void MGL_NO_EXPORT mgl_progonka_sc(HCDT A, HCDT B, HCDT C, HCDT D, dual *dat, long n, long id, long i0, long di, bool difr)\r
+{\r
+       dual *aa=dat, *bb=dat+n, *uu=dat+2*n;\r
+       dual b0=B->vcthr(i0), c0=C->vcthr(i0), d0=D->vcthr(id);\r
+       if(difr)        d0 = (mreal(2)-b0)*d0-c0*D->vcthr(id+di);\r
+       aa[0] = -c0/b0; bb[0] = d0/b0;\r
+       for(long i=1;i<n;i++)\r
+       {\r
+               long ii=i0+di*i, dd=id+di*i, tt = id+di*((i+1)%n);\r
+               dual a=A->vcthr(ii), b=B->vcthr(ii), c=C->vcthr(ii);\r
+               dual d=difr?-a*D->vcthr(dd-di)+(mreal(2)-b)*D->vcthr(dd)-c*D->vcthr(tt):D->vcthr(dd);\r
+               aa[i] = -c/(b+a*aa[i-1]);\r
+               bb[i] = (d-a*bb[i-1])/(b+a*aa[i-1]);\r
+       }\r
+       uu[n-1] = bb[n-1];\r
+       for(long i=n-2;i>=0;i--)        uu[i] = bb[i]+aa[i]*uu[i+1];\r
+}\r
+void MGL_NO_EXPORT mgl_progonka_pc(HCDT A, HCDT B, HCDT C, HCDT D, dual *dat, long n, long id, long i0, long di, bool difr)\r
+{\r
+       dual *aa=dat, *bb=dat+n, *gg=dat+2*n, *uu=dat+3*n;\r
+       dual a0=A->vcthr(i0), b0=B->vcthr(i0), c0=C->vcthr(i0), d0=D->vcthr(id);\r
+       if(difr)        d0 = -a0*D->vcthr(id+di*(n-1))+(mreal(2)-b0)*d0-c0*D->vcthr(id+di);\r
+       aa[0] =-c0/b0;  bb[0] = d0/b0;  gg[0] =-a0/b0;\r
+       for(long i=1;i<n;i++)\r
+       {\r
+               long ii=i0+di*i, il=id+di*((i+1)%n), dd=id+di*i;\r
+               dual a=A->vcthr(ii), b=B->vcthr(ii), c=C->vcthr(ii);\r
+               dual d=difr?-a*D->vcthr(dd-di)+(mreal(2)-b)*D->vcthr(dd)-c*D->vcthr(il):D->vcthr(dd);\r
+               aa[i] = -c/(b+a*aa[i-1]);\r
+               bb[i] = (d-a*bb[i-1])/(b+a*aa[i-1]);\r
+               gg[i] = -a*gg[i-1]/(b+a*aa[i-1]);\r
+       }\r
+       dual P=bb[n-1]/(mreal(1)-gg[n-1]), Q=aa[n-1]/(mreal(1)-gg[n-1]);\r
+       aa[n-1] = Q;    bb[n-1] = P;\r
+       for(long i=n-2;i>=0;i--)\r
+       {\r
+               bb[i] += aa[i]*bb[i+1]+gg[i]*P;\r
+               aa[i] = aa[i]*aa[i+1]+gg[i]*Q;\r
+       }\r
+       dual u0 = bb[0]/(mreal(1)-aa[0]);\r
+       for(long i=0;i<n;i++)   uu[i]=bb[i]+aa[i]*u0;\r
+}\r
+void MGL_NO_EXPORT mgl_progonka_hc(HCDT A, HCDT B, HCDT C, HCDT D, dual *dat, long n, long id, long i0, bool difr)\r
+{\r
+       dual *aa=dat, *bb=dat+n, *uu=dat+n*n;\r
+       dual b0=B->vcthr(i0), c0=C->vcthr(i0), d0=D->vcthr(id);\r
+       uu[0] = d0/b0*(difr?(mreal(2)-b0):mreal(1));\r
+       b0=B->vcthr(i0+n*n-1);  d0=D->vcthr(id+n*n-1);\r
+       uu[n*n-1] = d0/b0*(difr?(mreal(2)-b0):mreal(1));\r
+       long di = n-1, i1 = i0+n*(n-1), d1 = id+n*(n-1);\r
+       // suppose the square grid!\r
+       for(long j=1;j<n;j++)\r
+       {\r
+               // first bottom-left triangle\r
+               b0=B->vcthr(i0+j);      c0=C->vcthr(i0+j);      d0=D->vcthr(id+j);\r
+               if(difr)        d0 = (mreal(2)-b0)*d0-c0*D->vcthr(id+j+di);\r
+               aa[0] = -c0/b0; bb[0] = d0/b0;\r
+               for(long i=1;i<=j;i++)\r
+               {\r
+                       long ii=i0+j+di*i, dd=id+j+di*i;\r
+                       dual a=A->vcthr(ii),b=B->vcthr(ii),c=C->vcthr(ii);\r
+                       dual d=difr?-a*D->vcthr(dd-di)+(mreal(2)-b)*D->vcthr(dd)-c*D->vcthr(dd+di):D->vcthr(dd);\r
+                       aa[i] = -c/(b+a*aa[i-1]);\r
+                       bb[i] = (d-a*bb[i-1])/(b+a*aa[i-1]);\r
+               }\r
+               uu[j+di*(j-1)] = bb[j];\r
+               for(long i=j-1;i>=0;i--)\r
+                       uu[j+di*i] = bb[i]+aa[i]*uu[j+di*i+di];\r
+               // next top-right triangle\r
+               long j1=n-1-j;\r
+               b0=B->vcthr(i1+j1);     c0=C->vcthr(i1+j1);     d0=D->vcthr(d1+j1);\r
+               if(difr)        d0 = (mreal(2)-b0)*d0-c0*D->vcthr(d1+j1-di);\r
+               aa[0] = -c0/b0; bb[0] = d0/b0;\r
+               for(long i=1;i<=j;i++)\r
+               {\r
+                       long ii=i1+j1-di*i, dd=d1+j1-di*i;\r
+                       dual a=A->vcthr(ii),b=B->vcthr(ii),c=C->vcthr(ii);\r
+                       dual d=difr?-a*D->vcthr(dd+di)+(mreal(2)-b)*D->vcthr(dd)-c*D->vcthr(dd-di):D->vcthr(dd);\r
+                       aa[i] = -c/(b+a*aa[i-1]);\r
+                       bb[i] = (d-a*bb[i-1])/(b+a*aa[i-1]);\r
+               }\r
+               uu[j1+n*(n-1)-di*(j-1)] = bb[j];\r
+               for(long i=j-1;i>=0;i--)\r
+                       uu[j1+n*(n-1)-di*i] = bb[i]+aa[i]*uu[j1+n*(n-1)-di*i-di];\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
+HADT MGL_EXPORT mgl_datac_tridmat(HCDT A, HCDT B, HCDT C, HCDT D, const char *how)\r
+{\r
+       const long nx=D->GetNx(),ny=D->GetNy(),nz=D->GetNz();\r
+       const long nn=nx*ny*nz, np=nx*ny, na=A->GetNN();\r
+       if(B->GetNN()!=na || C->GetNN()!=na)    return 0;\r
+       mglDataC *r = new mglDataC(nx,ny,nz);\r
+       bool per = mglchr(how,'c');\r
+       bool difr = mglchr(how,'d');\r
+       if(mglchr(how,'x') && (na==nn || na==np || na==nx))\r
+#pragma omp parallel\r
+       {\r
+               mglDataC T(nx,4);       dual *uu=T.a+(per?3:2)*nx;\r
+#pragma omp for collapse(2)\r
+               for(long k=0;k<nz;k++)  for(long j=0;j<ny;j++)\r
+               {\r
+                       long i0=0, i1=nx*(j+ny*k);\r
+                       if(na==nn)      i0=i1;  else if(na==np) i0=nx*j;\r
+                       if(per) mgl_progonka_pc(A,B,C,D,T.a,nx,i1,i0,1,difr);\r
+                       else    mgl_progonka_sc(A,B,C,D,T.a,nx,i1,i0,1,difr);\r
+                       for(long i=0;i<nx;i++)  r->a[i+i1] = uu[i];\r
+               }\r
+       }\r
+       else if(mglchr(how,'y') && (na==nn || na==np || na==ny))\r
+#pragma omp parallel\r
+       {\r
+               mglDataC T(ny,4);       dual *uu=T.a+(per?3:2)*ny;\r
+#pragma omp for collapse(2)\r
+               for(long k=0;k<nz;k++)  for(long i=0;i<nx;i++)\r
+               {\r
+                       long i0=0, i1 = i+np*k;\r
+                       if(na==nn)      i0=i1;  else if(na==np) i0=i;\r
+                       if(per) mgl_progonka_pc(A,B,C,D,T.a,ny,i1,i0,nx,difr);\r
+                       else    mgl_progonka_sc(A,B,C,D,T.a,ny,i1,i0,nx,difr);\r
+                       i0 = i+np*k;\r
+                       for(long j=0;j<ny;j++)  r->a[j*nx+i0] = uu[j];\r
+               }\r
+       }\r
+       else if(mglchr(how,'z') && (na==nn || na==nz))\r
+#pragma omp parallel\r
+       {\r
+               mglDataC T(nz,4);       dual *uu=T.a+(per?3:2)*nz;\r
+#pragma omp for collapse(2)\r
+               for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
+               {\r
+                       long i0 = na==nn?i+nx*j:0, i1 = i+nx*j;\r
+                       if(per) mgl_progonka_pc(A,B,C,D,T.a,nz,i1,i0,np,difr);\r
+                       else    mgl_progonka_sc(A,B,C,D,T.a,nz,i1,i0,np,difr);\r
+                       for(long k=0;k<nz;k++)  r->a[k*np+i1] = uu[k];\r
+               }\r
+       }\r
+       else if(mglchr(how,'h') && ny==nx && (na==nn || na==np) && nx>1)\r
+#pragma omp parallel\r
+       {\r
+               mglDataC T(np,2);\r
+#pragma omp for\r
+               for(long k=0;k<nz;k++)\r
+               {\r
+                       mgl_progonka_hc(A,B,C,D,T.a,nx,k*np, na==nn ? k*np:0,difr);\r
+                       memcpy(r->a+k*np, T.a+np, np*sizeof(dual));\r
+               }\r
+       }\r
+       else    {       delete r;       r=0;    }\r
+       return r;\r
+}\r
+//-----------------------------------------------------------------------------\r
+uintptr_t MGL_EXPORT mgl_datac_tridmat_(uintptr_t *A, uintptr_t *B, uintptr_t *C, uintptr_t *D, const char *how, int l)\r
+{      char *s=new char[l+1];  memcpy(s,how,l);        s[l]=0;\r
+       uintptr_t r = uintptr_t(mgl_datac_tridmat(_DA_(A),_DA_(B),_DA_(C),_DA_(D),s));\r
+       delete []s;     return r;\r
+}\r
+//-----------------------------------------------------------------------------\r
index 82ef44ccdbfd1178e40d2190743900a5fba76a44..7174850b2ac84b28e9fdd206961bb086fdbaa062 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * pixel.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
 #include <algorithm>\r
 #include "mgl2/canvas.h"\r
 #include "mgl2/thread.h"\r
-\r
-inline mreal get_persp(float pf, float z, float Depth)\r
-//{    return (1-pf)/(1-pf*z/Depth);   }\r
-{      return (1-pf/1.37)/(1-pf*z/Depth);      }\r
-inline mreal get_pfact(float pf, float Depth)\r
-//{    return pf/(1-pf)/Depth; }\r
-{      return pf/(1-pf/1.37)/Depth;    }\r
-//-----------------------------------------------------------------------------\r
-void mglCanvas::SetSize(int w,int h,bool clf)\r
-{\r
-       if(w<=0 || h<=0)        {       SetWarn(mglWarnSize,"SetSize"); return; }\r
-       if(Width==w && Height==h)\r
-       {\r
-               InPlot(0,1,0,1,false);\r
-               if(clf || (Quality&4))  Clf();\r
-               return;\r
-       }\r
-\r
-       const double dx = double(w)/Width;\r
-       const double dy = double(h)/Height;\r
-       const double dz = sqrt(double(w*h))/Depth;\r
-       Width = w;      Height = h;     Depth = long(sqrt(double(w*h)));\r
-       const long s = long(w)*long(h);\r
-#if MGL_HAVE_PTHREAD\r
-       pthread_mutex_lock(&mutexClf);\r
-#elif MGL_HAVE_OMP\r
-       omp_set_lock(&lockClf);\r
-#endif\r
-       if(G)   {       delete []G;     delete []C;     delete []Z;     delete []G4;delete []GB;delete []OI;    G=0;    }\r
-       G = new unsigned char[s*3];\r
-       G4= new unsigned char[s*4];\r
-       GB= new unsigned char[s*4];\r
-       C = new unsigned char[s*12];\r
-       Z = new float[s*3];     // only 3 planes\r
-       OI= new int[s];\r
-#pragma omp parallel for\r
-       for(long i=0;i<s;i++)   memcpy(GB+4*i,BDef,4);\r
-#if MGL_HAVE_PTHREAD\r
-       pthread_mutex_unlock(&mutexClf);\r
-#elif MGL_HAVE_OMP\r
-       omp_unset_lock(&lockClf);\r
-#endif\r
-\r
-       InPlot(0,1,0,1,false);\r
-       if(clf || (Quality&4))  Clf();\r
-       else    // No clearing. So, need to scale\r
-       {\r
-#if MGL_HAVE_PTHREAD\r
-               pthread_mutex_lock(&mutexPnt);\r
-               pthread_mutex_lock(&mutexClf);\r
-#elif MGL_HAVE_OMP\r
-               omp_set_lock(&lockClf);\r
-#endif\r
-               const long m = long(Prm.size());\r
-               double dd = dx>dy?dy:dx;\r
-#pragma omp parallel for       // Scale text\r
-               for(long i=0;i<m;i++)   if(Prm[i].type==4)\r
-               {\r
-                       mglPnt &q = Pnt[Prm[i].n1];\r
-                       Prm[i].p *=dd;\r
-                       q.u *= dd;      q.v *= dd;\r
-               }\r
-               const long n = long(Pnt.size());\r
-#pragma omp parallel for       // Scale coordinates\r
-               for(long i=0;i<n;i++)\r
-               {\r
-                       mglPnt &q = Pnt[i];\r
-                       q.x*=dx;        q.y*=dy;        q.z*=dz;\r
-                       q.xx*=dx;       q.yy*=dy;       q.zz*=dz;\r
-                       if(mgl_isnum(q.w))\r
-                       {       q.u*=dx;        q.v*=dy;        q.w*=dz;        }\r
-               }\r
-               for(size_t i=0;i<Sub.size();i++)\r
-               {       mglBlock &q = Sub[i];   q.n1*=dx;       q.n2*=dx;       q.n3*=dy;       q.n4*=dy;       }\r
-               for(size_t k=0;k<DrwDat.size();k++)     // scale frames too\r
-               {\r
-                       mglStack<mglPnt>  &pnt = DrwDat[k].Pnt;\r
-                       const long n = long(pnt.size());\r
-#pragma omp parallel for\r
-                       for(long i=0;i<n;i++)\r
-                       {\r
-                               mglPnt &q = pnt[i];\r
-                               q.x*=dx;        q.y*=dy;        q.z*=dz;\r
-                               q.xx*=dx;       q.yy*=dy;       q.zz*=dz;\r
-                               if(mgl_isnum(q.w))\r
-                               {       q.u*=dx;        q.v*=dy;        q.w*=dz;        }\r
-                       }\r
-                       std::vector<mglBlock>  &sub = DrwDat[k].Sub;\r
-                       for(size_t i=0;i<sub.size();i++)\r
-                       {       mglBlock &q = sub[i];   q.n1*=dx;       q.n2*=dx;       q.n3*=dy;       q.n4*=dy;       }\r
-               }\r
-#if MGL_HAVE_PTHREAD\r
-               pthread_mutex_unlock(&mutexClf);\r
-               pthread_mutex_unlock(&mutexPnt);\r
-#elif MGL_HAVE_OMP\r
-               omp_unset_lock(&lockClf);\r
+#if MGL_HAVE_OMP\r
+#include <omp.h>\r
 #endif\r
-               ClfZB();        Finish();\r
-       }\r
-}\r
-//-----------------------------------------------------------------------------\r
-void mglDrawReg::set(mglCanvas *gr, int nx, int ny, int m)\r
-{\r
-       int mx = m%nx, my = m/nx;       ObjId = gr->ObjId;\r
-       PDef = gr->mask;        angle = gr->MaskAn;\r
-       x1 = gr->GetWidth()*mx/nx;              y1 = gr->GetHeight()-gr->GetHeight()*(my+1)/ny;\r
-       x2 = gr->GetWidth()*(mx+1)/nx-1;        y2 = gr->GetHeight()-gr->GetHeight()*my/ny-1;\r
-}\r
-//-----------------------------------------------------------------------------\r
-void mglCanvas::PutDrawReg(mglDrawReg *d, const mglCanvas *gr)\r
-{\r
-       if(gr)\r
-       {\r
-               const int dd = d->x2 - d->x1;\r
-               for(long j=d->y1;j<d->y2;j++)\r
-               {\r
-                       register long i = d->x1+Width*(Height-1-j);\r
-                       memcpy(OI+i,gr->OI+i,dd*sizeof(int));\r
-                       memcpy(Z+3*i,gr->Z+3*i,3*dd*sizeof(float));\r
-                       memcpy(C+12*i,gr->C+12*i,12*dd);\r
-               }\r
-       }\r
-}\r
-//-----------------------------------------------------------------------------\r
-void mglCanvas::PostScale(const mglMatrix *M, mglPoint &p) const\r
-{\r
-       register mreal f = 1./(2*M->pf),x=p.x,y=p.y,z=p.z;\r
-       const mreal *b=M->b;\r
-       p.x = M->x + f*(x*b[0] + y*b[1] + z*b[2]);\r
-       p.y = M->y + f*(x*b[3] + y*b[4] + z*b[5]);\r
-       p.z = M->z + f*(x*b[6] + y*b[7] + z*b[8]);\r
-}\r
-//-----------------------------------------------------------------------------\r
-bool mglCanvas::ScalePoint(const mglMatrix *M, mglPoint &p, mglPoint &n, bool use_nan) const\r
-{\r
-       bool res = get(MGL_DISABLE_SCALE) || mglBase::ScalePoint(M,p,n,use_nan);\r
-       PostScale(M,p);\r
-\r
-       register mreal nx=n.x, ny=n.y, nz=n.z;\r
-       const mreal *b=M->b;\r
-       n.x = nx*b[0] + ny*b[1] + nz*b[2];      // simpler for rotation only\r
-       n.y = nx*b[3] + ny*b[4] + nz*b[5];\r
-       n.z = nx*b[6] + ny*b[7] + nz*b[8];\r
-       n.Normalize();\r
-       return res;\r
-}\r
-//-----------------------------------------------------------------------------\r
-long mglCanvas::ProjScale(int nf, long id, bool text)\r
-{\r
-       const mglPnt &pi = Pnt[id];\r
-       mglPoint pp(pi.x,pi.y,pi.z), nn(pi.u,pi.v,pi.w), p, n;\r
-       if(mgl_isnan(pp.x))     return -1;\r
-       const mreal w=B1.b[0]/2, h=B1.b[4]/2, d=B1.b[8]/2, xx=B1.x-w/2, yy=B1.y-h/2;\r
-       if(pi.sub>=0)\r
-       {\r
-               mglPoint q(RestorePnt(pp)/(2*B.pf));\r
-               mglPoint u(RestorePnt(nn,true));        u.Normalize();\r
-               if(nf==0)\r
-               {       p.x = xx + q.x*w;       p.y = yy + q.y*h;       p.z = B1.z + q.z*d;     n = u;  }\r
-               else if(nf==1)\r
-               {       p.x = xx + q.x*w;       p.y = yy+h + q.z*h;     p.z = B1.z - q.y*d;     n.Set(u.x,u.z,-u.y);    }\r
-               else if(nf==2)\r
-               {       p.x = xx+w + q.z*w;     p.y = yy + q.y*h;       p.z = B1.z - q.x*d;     n.Set(u.z,u.y,-u.x);    }\r
-               else\r
-               {\r
-                       const mreal *b=B.b;     n = nn;\r
-                       p.x = xx+w + q.x*b[0]/2 + q.y*b[1]/2 + q.z*b[2]/2;\r
-                       p.y = yy+h + q.x*b[3]/2 + q.y*b[4]/2 + q.z*b[5]/2;\r
-                       p.z = B.z + q.x*b[6]/2 + q.y*b[7]/2 + q.z*b[8]/2;\r
-               }\r
-       }\r
-       else\r
-       {\r
-               p.x = pi.x/2 + w*(nf/2);\r
-               p.y = pi.y/2 + h*(nf%2);\r
-               p.z = pi.z;     n=nn;\r
-       }\r
-       return CopyProj(id,p,text?n:nn,pi.sub);\r
-}\r
-//-----------------------------------------------------------------------------\r
-void mglCanvas::LightScale(const mglMatrix *M, mglLight &ls)\r
-{\r
-       ls.p=ls.d;      ls.q=ls.r;\r
-       ScalePoint(M,ls.q,ls.p,false);\r
-       ls.p /= ls.p.norm();\r
-}\r
-//-----------------------------------------------------------------------------\r
-void mglCanvas::LightScale(const mglMatrix *M)\r
-{\r
-       for(long i=0;i<10;i++)  if(light[i].n)  LightScale(M,light[i]);\r
-       for(size_t j=0;j<Sub.size();j++)\r
-               for(long i=0;i<10;i++)  if(light[i].n)  LightScale(&(Sub[j].B),Sub[j].light[i]);\r
-}\r
-//-----------------------------------------------------------------------------\r
-// NOTE: Perspective is not fully supported now !!! Also it use LAST InPlot parameters!!!\r
-mglPoint mglCanvas::RestorePnt(mglPoint ps, bool norm) const\r
-{\r
-       const mreal s3 = 2*B.pf;\r
-       mglPoint p;\r
-\r
-       const mreal W=Width/2, H=Height/2, D=Depth/2;\r
-       const mreal *b=B.b,*d=Bp.b;\r
-       mreal cx = B.z*d[2]+B.y*d[1]+B.x*d[0]-Bp.x*W-d[0]*W+W-d[1]*H-d[2]*D;\r
-       const mreal c0 = b[6]*d[2]+b[3]*d[1]+b[0]*d[0];\r
-       const mreal c1 = b[7]*d[2]+b[4]*d[1]+b[1]*d[0];\r
-       const mreal c2 = b[8]*d[2]+b[5]*d[1]+b[2]*d[0];\r
-       mreal cy = B.z*d[5]+B.y*d[4]+B.x*d[3]-d[3]*W-Bp.y*H-d[4]*H+H-d[5]*D;\r
-       const mreal c3 = b[6]*d[5]+b[3]*d[4]+b[0]*d[3];\r
-       const mreal c4 = b[7]*d[5]+b[4]*d[4]+b[1]*d[3];\r
-       const mreal c5 = b[8]*d[5]+b[5]*d[4]+b[2]*d[3];\r
-       mreal cz = B.z*d[8]+B.y*d[7]+B.x*d[6]-d[6]*W-d[7]*H-Bp.z*D-d[8]*D+D;\r
-       const mreal c6 = b[6]*d[8]+b[3]*d[7]+b[0]*d[6];\r
-       const mreal c7 = b[7]*d[8]+b[4]*d[7]+b[1]*d[6];\r
-       const mreal c8 = b[8]*d[8]+b[5]*d[7]+b[2]*d[6];\r
-       if(norm)        cx=cy=cz=0;\r
-\r
-       if(mgl_isnum(ps.z))     // try to take into account perspective if z-value is provided\r
-       {\r
-               register float dd = get_persp(Bp.pf,ps.z,Depth);\r
-               ps.x = Width/2 + (ps.x-Width/2)/dd;\r
-               ps.y = Height/2+ (ps.y-Height/2)/dd;\r
-       }\r
-       const mreal xx = ps.x-cx, yy = ps.y-cy, zz = ps.z-cz;\r
-       const mreal d1=c0*c4-c1*c3, d2=c1*c5-c2*c4, d3=c0*c5-c2*c3;\r
 \r
-       if(mgl_isnum(zz))       // try to use z-values\r
-       {\r
-               // put inverse matrix here: [x,y,z]=B^(-1)[xx,yy,zz]\r
-               mreal det = (-c0*c4*c8+c1*c3*c8+c0*c5*c7-c2*c3*c7-c1*c5*c6+c2*c4*c6)/s3;\r
-               p.x = (c2*c4-c1*c5)*zz+(c1*c8-c2*c7)*yy+(c5*c7-c4*c8)*xx;       p.x /= det;\r
-               p.y = (c0*c5-c2*c3)*zz+(c2*c6-c0*c8)*yy+(c3*c8-c5*c6)*xx;       p.y /= det;\r
-               p.z = (c1*c3-c0*c4)*zz+(c0*c7-c1*c6)*yy+(c4*c6-c3*c7)*xx;       p.z /= det;\r
-       }\r
-       else if(fabs(d1) > fabs(d2) && fabs(d1) > fabs(d3))     // x-y plane\r
-       {\r
-               p.z = 0;\r
-               p.x = s3*(c4*xx-c1*yy)/d1;\r
-               p.y = s3*(c0*yy-c3*xx)/d1;\r
-       }\r
-       else if(fabs(d2) > fabs(d3))    // y-z\r
-       {\r
-               p.x = 0;\r
-               p.y = s3*(c5*xx-c2*yy)/d2;\r
-               p.z = s3*(c1*yy-c4*xx)/d2;\r
-       }\r
-       else    // x-z\r
-       {\r
-               p.y = 0;\r
-               p.x = s3*(c5*xx-c2*yy)/d3;\r
-               p.z = s3*(c0*yy-c3*xx)/d3;\r
-       }\r
-       return p;\r
-}\r
-//-----------------------------------------------------------------------------\r
-mglPoint mglCanvas::CalcXYZ(int xs, int ys, bool real) const\r
-{\r
-       if(xs<0 || ys<0 || xs>=Width || ys>=Height)     return mglPoint(NAN,NAN,NAN);\r
-       mglPoint p, ps(xs,Height-ys,NAN);\r
-       float zz = Z[3*(xs+Width*(Height-1-ys))];\r
-       if(zz>-1e20f)   {       ps.z = zz;      real=false;     }\r
-       p = RestorePnt(ps);\r
-       return real ? mglPoint(NAN,NAN,NAN) : mglPoint(Min.x + (Max.x-Min.x)*(p.x+1)/2,\r
-                               Min.y + (Max.y-Min.y)*(p.y+1)/2, Min.z + (Max.z-Min.z)*(p.z+1)/2);\r
-}\r
-//-----------------------------------------------------------------------------\r
-void mglCanvas::CalcScr(mglPoint p, int *xs, int *ys) const\r
-{\r
-       mglPoint n;\r
-       ScalePoint(GetB(),p,n);\r
-       if(xs)  *xs=int(p.x);\r
-       if(ys)  *ys=int(p.y);\r
-}\r
-//-----------------------------------------------------------------------------\r
-mglPoint mglCanvas::CalcScr(mglPoint p) const\r
-{      int x,y;        CalcScr(p,&x,&y);       return mglPoint(x,y);   }\r
-//-----------------------------------------------------------------------------\r
-void MGL_NO_EXPORT mgl_prm_swap(mglPrim &s1,mglPrim &s2,mglPrim *buf)\r
-{\r
-       memcpy(buf, &s1, sizeof(mglPrim));\r
-       memcpy(&s1, &s2, sizeof(mglPrim));\r
-       memcpy(&s2, buf, sizeof(mglPrim));\r
-}\r
-void MGL_NO_EXPORT sort_prm_c(const size_t l0, const size_t r0, mglStack<mglPrim> &s, mglPrim *buf)\r
-{\r
-       if(l0==r0)      return;\r
-       if(l0+1==r0)\r
-       {\r
-               if(s[r0].n1<s[l0].n1)   mgl_prm_swap(s[r0],s[l0],buf);\r
-               return;\r
-       }\r
-       bool del= (buf==0);\r
-       if(del) buf = (mglPrim*)malloc(sizeof(mglPrim));\r
-\r
-       size_t l=l0, r=r0;\r
-       const long v = s[(l+r)/2].n1;\r
-\r
-       for(size_t i=l0;i<=r0;i++)      // first collect <0\r
-               if(s[i].n1<v)\r
-               {\r
-                       if(i>l) mgl_prm_swap(s[i],s[l],buf);\r
-                       l++;\r
-               }\r
-       r=l;\r
-       for(size_t i=l;i<=r0;i++)       // now collect =0\r
-               if(s[i].n1==v)\r
-               {\r
-                       if(i>r) mgl_prm_swap(s[i],s[r],buf);\r
-                       r++;\r
-               }\r
-\r
-       if(l>l0+1)      sort_prm_c(l0,l-1,s,buf);\r
-       if(r<r0)        sort_prm_c(r,r0,s,buf);\r
-       if(del) free(buf);\r
-}\r
-//-----------------------------------------------------------------------------\r
-MGL_NO_EXPORT int mgl_type_prior[8]={1,2,4,5, 0,3,0, 7};\r
-MGL_NO_EXPORT void *mgl_canvas_thr(void *par)\r
-{      mglThreadG *t=(mglThreadG *)par;        (t->gr->*(t->f))(t->id, t->n, t->p);    return NULL;    }\r
-void mglStartThread(void (mglCanvas::*func)(long i, long n, const void *p), mglCanvas *gr, long n, const void *p=NULL)\r
-{\r
-       if(!func || !gr)        return;\r
-#if MGL_HAVE_PTHREAD\r
-       if(mglNumThr<1) mgl_set_num_thr(0);\r
-       if(mglNumThr>1)\r
-       {\r
-               pthread_t *tmp=new pthread_t[mglNumThr];\r
-               mglThreadG *par=new mglThreadG[mglNumThr];\r
-               for(long i=0;i<mglNumThr;i++)   // put parameters into the structure\r
-               {       par[i].gr=gr;   par[i].f=func;  par[i].n=n;     par[i].p=p;     par[i].id=i;    }\r
-               for(long i=0;i<mglNumThr;i++)   pthread_create(tmp+i, 0, mgl_canvas_thr, par+i);\r
-               for(long i=0;i<mglNumThr;i++)   pthread_join(tmp[i], 0);\r
-               delete []tmp;   delete []par;\r
-       }\r
-       else\r
-#endif\r
-       {       mglNumThr = 1;  (gr->*func)(0,n,p);     }\r
-}\r
 //-----------------------------------------------------------------------------\r
 void mglCanvas::pxl_combine(long id, long n, const void *)\r
 {\r
@@ -401,11 +68,11 @@ void mglCanvas::pxl_transform(long id, long n, const void *)
                mglPnt &p=Pnt[i];\r
                if(p.sub>=0)\r
                {\r
-                       register float x = p.xx-Width/2., y = p.yy-Height/2., z = p.zz-Depth/2.;\r
+                       float x = p.xx-Width/2., y = p.yy-Height/2., z = p.zz-Depth/2.;\r
                        p.x = b[0]*x + b[1]*y + b[2]*z + dx;\r
                        p.y = b[3]*x + b[4]*y + b[5]*z + dy;\r
                        p.z = b[6]*x + b[7]*y + b[8]*z + dz;\r
-                       register float d = get_persp(Bp.pf,p.z,Depth);\r
+                       float d = get_persp(Bp.pf,p.z,Depth);\r
                        p.x = Width/2. + d*p.x; p.y = Height/2. + d*p.y;\r
                }\r
        }\r
@@ -425,49 +92,13 @@ void mglCanvas::pxl_setz_adv(long id, long n, const void *)
        }\r
 }\r
 //-----------------------------------------------------------------------------\r
-uint32_t mglCanvas::GetColor(const mglPrim &p) const\r
-{\r
-       mglRGBA res, c1,c2,c3,c4;\r
-       c1.c=pnt_col[p.type==1?p.n2:p.n1];\r
-       unsigned r=c1.r[0], g=c1.r[1], b=c1.r[2], a=c1.r[3];\r
-       switch(p.type)\r
-       {\r
-       case 3:\r
-               c2.c=pnt_col[p.n2];     c3.c=pnt_col[p.n3];     c4.c=pnt_col[p.n4];\r
-               res.r[0]=(r+c2.r[0]+c3.r[0]+c4.r[0])/4;\r
-               res.r[1]=(g+c2.r[1]+c3.r[1]+c4.r[1])/4;\r
-               res.r[2]=(b+c2.r[2]+c3.r[2]+c4.r[2])/4;\r
-               res.r[3]=(a+c2.r[3]+c3.r[3]+c4.r[3])/4; break;\r
-       case 2:\r
-               c2.c=pnt_col[p.n2];     c3.c=pnt_col[p.n3];\r
-               res.r[0]=(r+c2.r[0]+c3.r[0])/3;\r
-               res.r[1]=(g+c2.r[1]+c3.r[1])/3;\r
-               res.r[2]=(b+c2.r[2]+c3.r[2])/3;\r
-               res.r[3]=(a+c2.r[3]+c3.r[3])/3; break;\r
-       case 6:\r
-               res.r[0]=p.n2&0xff;     res.r[1]=(p.n2/256)&0xff;       res.r[2]=(p.n2/65536)&0xff;     res.r[3]=255;   break;\r
-//             res.c=p.n2;     break;\r
-       default:\r
-               res.c = c1.c;   break;\r
-       }\r
-       // add fog into resulting color\r
-       float zf = FogDist*(p.z/Depth-0.5-FogDz);\r
-       if(zf<0)        // add fog\r
-       {\r
-               unsigned char d = (unsigned char)(255*(1.-exp(5*zf)));\r
-               unsigned char cb[4] = {BDef[0], BDef[1], BDef[2], d};\r
-               if(d<255)       combine(res.r,cb);\r
-       }\r
-       return res.c;\r
-}\r
-//-----------------------------------------------------------------------------\r
 void mglCanvas::pxl_pntcol(long id, long n, const void *)\r
 {\r
 #if !MGL_HAVE_PTHREAD\r
 #pragma omp parallel for\r
 #endif\r
        for(long i=id;i<n;i+=mglNumThr)\r
-       {       mglRGBA c;      col2int(Pnt[i],c.r,-1); pnt_col[i]=c.c; }\r
+       {       mglRGBA c;      col2int(Pnt[i],c.r,HighId-1);   pnt_col[i]=c.c; }\r
 }\r
 //-----------------------------------------------------------------------------\r
 void mglCanvas::pxl_setz(long id, long n, const void *)\r
@@ -479,157 +110,58 @@ void mglCanvas::pxl_setz(long id, long n, const void *)
        {       mglPrim &q=Prm[i];      q.z = Pnt[q.n1].z;      }\r
 }\r
 //-----------------------------------------------------------------------------\r
-HMGL mgl_qsort_gr=0;\r
-int mglBase::PrmCmp(long i, long j) const\r
-{\r
-       const mglPrim &a = Prm[i];\r
-       const mglPrim &b = Prm[j];\r
-       if(a.z!=b.z)    return int(100*(a.z - b.z));\r
-       register int t1 = mgl_type_prior[a.type], t2 = mgl_type_prior[b.type];\r
-       if(t1!=t2)              return t2 - t1;\r
-       if(a.w!=b.w)    return int(100*(b.w - a.w));\r
-       return a.n3 - b.n3;\r
-}\r
-int MGL_LOCAL_PURE mgl_prm_cmp(const void *i,const void *j)\r
-{\r
-       return mgl_qsort_gr->PrmCmp(*(const long *)i, *(const long *)j);\r
-}\r
-//-----------------------------------------------------------------------------\r
-void mglCanvas::PreparePrim(int fast)\r
-{\r
-       if(fast!=2)\r
-       {\r
-               mglStartThread(&mglCanvas::pxl_transform,this,Pnt.size());\r
-               if(fast==0)     mglStartThread(&mglCanvas::pxl_setz,this,Prm.size());\r
-               else    mglStartThread(&mglCanvas::pxl_setz_adv,this,Prm.size());\r
-#pragma omp critical\r
-               {\r
-                       ClearPrmInd();  mgl_qsort_gr = this;\r
-                       register size_t n = Prm.size();\r
-                       PrmInd = new long[n];\r
-                       for(size_t i=0;i<n;i++) PrmInd[i]=i;\r
-                       qsort(PrmInd,n,sizeof(long),mgl_prm_cmp);\r
-                       clr(MGL_FINISHED);\r
-               }\r
-       }\r
-       if(fast>0)\r
-       {\r
-#pragma omp critical\r
-               {       if(pnt_col)     delete []pnt_col;       pnt_col = new uint32_t[Pnt.size()];     }\r
-               mglStartThread(&mglCanvas::pxl_pntcol,this,Pnt.size());\r
-       }\r
-}\r
-//-----------------------------------------------------------------------------\r
 void mglCanvas::pxl_primdr(long id, long , const void *)\r
 {\r
 #define Q      4       // should be >= sqrt(2*num_thr) ???\r
        const int nx=Q,ny=Q;    // TODO find dependence on Q for 1, 2, 4, 8 threads. Try to select optimal\r
-       if(!(Quality&3))\r
 #if !MGL_HAVE_PTHREAD\r
 #pragma omp parallel for\r
 #endif\r
-               for(long i=id;i<nx*ny;i+=mglNumThr)\r
-               {\r
-                       mglDrawReg d;   d.set(this,nx,ny,i);\r
-                       for(size_t k=0;k<Prm.size();k++)\r
-                       {\r
-                               if(Stop)        break;\r
-                               const mglPrim &p=GetPrm(k);\r
-                               d.PDef = p.n3;  d.pPos = p.s;\r
-                               d.ObjId = p.id; d.PenWidth=p.w;\r
-                               d.angle = p.angl;\r
-                               if(p.type==2 || p.type==3) d.PDef = p.m;\r
-                               register long n1=p.n1, n2=p.n2, n3=p.n3, n4=p.n4;\r
-                               switch(p.type)\r
-                               {\r
-                               case 3: fast_draw(Pnt[n1],Pnt[n4],&d);  fast_draw(Pnt[n2],Pnt[n3],&d);  break;\r
-                               case 1: fast_draw(Pnt[n1],Pnt[n2],&d);  break;\r
-                               case 4: glyph_draw(p,&d);       break;\r
-                               case 0: mark_draw(Pnt[n1],n4,p.s,&d);   break;\r
-                               case 2: fast_draw(Pnt[n1],Pnt[n2],&d);  fast_draw(Pnt[n1],Pnt[n3],&d);\r
-                                               fast_draw(Pnt[n2],Pnt[n3],&d);  break;\r
-                               }\r
-                       }\r
-               }\r
-       else if(!(Quality&MGL_DRAW_NORM))\r
-#if !MGL_HAVE_PTHREAD\r
-#pragma omp parallel for\r
-#endif\r
-               for(long i=id;i<nx*ny;i+=mglNumThr)\r
+       for(long i=id;i<nx*ny;i+=mglNumThr)\r
+       {\r
+               mglDrawReg d;   d.set(this,nx,ny,i);\r
+               if(Quality&MGL_DRAW_NORM)       for(size_t k=0;k<Prm.size();k++)\r
                {\r
-                       mglDrawReg d;   d.set(this,nx,ny,i);\r
-                       for(size_t k=0;k<Prm.size();k++)\r
+                       if(Stop)        break;\r
+                       const mglPrim &p=GetPrm(k);     d.copy(p);\r
+                       long n1=p.n1, n2=p.n2, n3=p.n3, n4=p.n4;\r
+                       switch(p.type)\r
                        {\r
-                               if(Stop)        break;\r
-                               const mglPrim &p=GetPrm(k);\r
-                               d.PDef = p.n3;  d.pPos = p.s;\r
-                               d.ObjId = p.id; d.PenWidth=p.w;\r
-                               d.angle = p.angl;\r
-                               if(p.type==2 || p.type==3) d.PDef = p.m;\r
-                               register long n1=p.n1, n2=p.n2, n3=p.n3, n4=p.n4;\r
-                               switch(p.type)\r
-                               {\r
-                               case 3: trig_draw(Pnt[n1],Pnt[n2],Pnt[n4],true,&d);\r
-                                               trig_draw(Pnt[n1],Pnt[n3],Pnt[n4],true,&d);     break;\r
+                               case 3: quad_draw(Pnt[n1],Pnt[n2],Pnt[n3],Pnt[n4],&d);  break;\r
                                case 1: line_draw(Pnt[n1],Pnt[n2],&d);  break;\r
                                case 4: glyph_draw(p,&d);       break;\r
                                case 0: mark_draw(Pnt[n1],n4,p.s,&d);   break;\r
                                case 2: trig_draw(Pnt[n1],Pnt[n2],Pnt[n3],true,&d);     break;\r
-                               }\r
                        }\r
                }\r
-       else\r
-#if !MGL_HAVE_PTHREAD\r
-#pragma omp parallel for\r
-#endif\r
-               for(long i=id;i<nx*ny;i+=mglNumThr)\r
+               else if(Quality&MGL_DRAW_FAST)  for(size_t k=0;k<Prm.size();k++)\r
                {\r
-                       mglDrawReg d;   d.set(this,nx,ny,i);\r
-                       for(size_t k=0;k<Prm.size();k++)\r
+                       if(Stop)        break;\r
+                       const mglPrim &p=GetPrm(k);     d.copy(p);\r
+                       long n1=p.n1, n2=p.n2, n3=p.n3, n4=p.n4;\r
+                       switch(p.type)\r
                        {\r
-                               if(Stop)        break;\r
-                               const mglPrim &p=GetPrm(k);\r
-                               d.PDef = p.n3;  d.pPos = p.s;\r
-                               d.ObjId = p.id; d.PenWidth=p.w;\r
-                               d.angle = p.angl;\r
-                               if(p.type==2 || p.type==3) d.PDef = p.m;\r
-                               register long n1=p.n1, n2=p.n2, n3=p.n3, n4=p.n4;\r
-                               switch(p.type)\r
-                               {\r
-                               case 3: quad_draw(Pnt[n1],Pnt[n2],Pnt[n3],Pnt[n4],&d);  break;\r
+                               case 3: trig_draw(Pnt[n1],Pnt[n2],Pnt[n4],true,&d);\r
+                                               trig_draw(Pnt[n1],Pnt[n3],Pnt[n4],true,&d);     break;\r
                                case 1: line_draw(Pnt[n1],Pnt[n2],&d);  break;\r
                                case 4: glyph_draw(p,&d);       break;\r
                                case 0: mark_draw(Pnt[n1],n4,p.s,&d);   break;\r
                                case 2: trig_draw(Pnt[n1],Pnt[n2],Pnt[n3],true,&d);     break;\r
-                               }\r
                        }\r
                }\r
-}\r
-//-----------------------------------------------------------------------------\r
-void mglCanvas::pxl_primpx(long id, long n, const void *)      // NOTE this variant is too slow ... may be later in CUDA???\r
-{\r
-       mglDrawReg d;   d.set(this,1,1,id);\r
-#if !MGL_HAVE_PTHREAD\r
-#pragma omp parallel for firstprivate(d)\r
-#endif\r
-       for(long ii=0;ii<n;ii+=mglNumThr)\r
-       {\r
-               register long i=ii%Width, j=ii/Width;\r
-               for(size_t k=0;k<Prm.size();k++)\r
+               else    for(size_t k=0;k<Prm.size();k++)\r
                {\r
                        if(Stop)        break;\r
-                       const mglPrim &p=GetPrm(k);\r
-                       d.PDef = p.n3;  d.pPos = p.s;\r
-                       d.ObjId = p.id; d.PenWidth=p.w;\r
-                       d.angle = p.angl;\r
-                       if(p.type==2 || p.type==3) d.PDef = p.m;\r
+                       const mglPrim &p=GetPrm(k);     d.copy(p);\r
+                       long n1=p.n1, n2=p.n2, n3=p.n3, n4=p.n4;\r
                        switch(p.type)\r
                        {\r
-                       case 0: mark_pix(i,j,Pnt[p.n1],p.n4,p.s,&d);    break;\r
-                       case 1: line_pix(i,j,Pnt[p.n1],Pnt[p.n2],&d);   break;\r
-                       case 2: trig_pix(i,j,Pnt[p.n1],Pnt[p.n2],Pnt[p.n3],true,&d);    break;\r
-                       case 3: quad_pix(i,j,Pnt[p.n1],Pnt[p.n2],Pnt[p.n3],Pnt[p.n4],&d);       break;\r
-                       case 4: glyph_pix(i,j,p,&d);    break;\r
+                               case 3: fast_draw(Pnt[n1],Pnt[n4],&d);  fast_draw(Pnt[n2],Pnt[n3],&d);  break;\r
+                               case 1: fast_draw(Pnt[n1],Pnt[n2],&d);  break;\r
+                               case 4: glyph_draw(p,&d);       break;\r
+                               case 0: mark_draw(Pnt[n1],n4,p.s,&d);   break;\r
+                               case 2: fast_draw(Pnt[n1],Pnt[n2],&d);  fast_draw(Pnt[n1],Pnt[n3],&d);\r
+                               fast_draw(Pnt[n2],Pnt[n3],&d);  break;\r
                        }\r
                }\r
        }\r
@@ -647,118 +179,22 @@ void mglCanvas::pxl_dotsdr(long id, long n, const void *)
                unsigned char r[4]={0,0,0,255};\r
                const mglPnt &p=Pnt[i];\r
                if(p.sub<0)     continue;\r
-               register float x = p.xx-Width/2., y = p.yy-Height/2., z = p.zz-Depth/2.,xx,yy,zz;\r
+               float x = p.xx-Width/2., y = p.yy-Height/2., z = p.zz-Depth/2.,xx,yy,zz;\r
                xx = b[0]*x + b[1]*y + b[2]*z + dx;\r
                yy = b[3]*x + b[4]*y + b[5]*z + dy;\r
                zz = b[6]*x + b[7]*y + b[8]*z + dz;\r
-               register float d = get_persp(Bp.pf,zz,Depth);\r
+               float d = get_persp(Bp.pf,zz,Depth);\r
                xx = Width/2. + d*xx;   yy = Height/2. + d*yy;\r
 \r
                r[0] = (unsigned char)(255*p.r);\r
                r[1] = (unsigned char)(255*p.g);\r
                r[2] = (unsigned char)(255*p.b);\r
-               register long i0=long(xx)+Width*(Height-1-long(yy));\r
+               long i0=long(xx)+Width*(Height-1-long(yy));\r
                if(i0>=0 && i0<Width*Height && zz>Z[3*i0])\r
                {       Z[3*i0]=z;      memcpy(C+12*i0,r,4);    OI[i0]=-1;      }\r
        }\r
 }\r
 //-----------------------------------------------------------------------------\r
-void mglCanvas::Finish()\r
-{\r
-       static mglMatrix bp;\r
-       if(Quality==MGL_DRAW_NONE)      return;\r
-#if MGL_HAVE_PTHREAD\r
-       pthread_mutex_lock(&mutexPrm);\r
-       pthread_mutex_lock(&mutexPnt);\r
-       pthread_mutex_lock(&mutexClf);\r
-#elif MGL_HAVE_OMP\r
-       omp_set_lock(&lockClf);\r
-#endif\r
-       if(Quality==MGL_DRAW_DOTS)\r
-       {\r
-               mglStartThread(&mglCanvas::pxl_dotsdr,this,Pnt.size());\r
-               mglStartThread(&mglCanvas::pxl_memcpy,this,Width*Height);\r
-               mglStartThread(&mglCanvas::pxl_backgr,this,Width*Height);\r
-       }\r
-       else\r
-       {\r
-               if((Quality&MGL_DRAW_LMEM) || (memcmp(&Bp,&bp,sizeof(mglMatrix)) && !(Quality&MGL_DRAW_LMEM) && Prm.size()>0))\r
-                       clr(MGL_FINISHED);\r
-               if(!get(MGL_FINISHED))\r
-               {\r
-                       if(!(Quality&MGL_DRAW_LMEM) && Prm.size()>0)\r
-                       {\r
-                               PreparePrim(0); bp=Bp;\r
-                               clr(MGL_FINISHED);\r
-                               mglStartThread(&mglCanvas::pxl_primdr,this,Prm.size());\r
-                       }\r
-                       size_t n=Width*Height;\r
-                       BDef[3] = (Flag&3)!=2 ? 0:255;\r
-                       if(Quality&MGL_DRAW_NORM)       mglStartThread(&mglCanvas::pxl_combine,this,n);\r
-                       else                    mglStartThread(&mglCanvas::pxl_memcpy,this,n);\r
-                       BDef[3] = 255;\r
-                       mglStartThread(&mglCanvas::pxl_backgr,this,n);\r
-                       set(MGL_FINISHED);\r
-               }\r
-       }\r
-#if MGL_HAVE_PTHREAD\r
-       pthread_mutex_unlock(&mutexClf);\r
-       pthread_mutex_unlock(&mutexPnt);\r
-       pthread_mutex_unlock(&mutexPrm);\r
-#elif MGL_HAVE_OMP\r
-       omp_unset_lock(&lockClf);\r
-#endif\r
-}\r
-//-----------------------------------------------------------------------------\r
-void mglCanvas::ClfZB(bool force)\r
-{\r
-       if(!force && (Quality&MGL_DRAW_LMEM))   return;\r
-       register long n=Width*Height;\r
-       memset(C,0,12*n);       memset(OI,0,n*sizeof(int));\r
-#pragma omp parallel for\r
-       for(long i=0;i<3*n;i++) Z[i] = -1e20f;\r
-       clr(MGL_FINISHED);\r
-}\r
-//-----------------------------------------------------------------------------\r
-void mglCanvas::Clf(mglColor Back)\r
-{\r
-       Fog(0); PDef = 0xffff;  pPos = 0;\r
-       ClearFrame();\r
-       if((Flag&3)==2) Back.Set(0,0,0,0);\r
-       if(Back!=NC)    FillBackground(Back);\r
-}\r
-//-----------------------------------------------------------------------------\r
-void mglCanvas::Clf(const char *col)\r
-{\r
-       Fog(0); PDef = 0xffff;  pPos = 0;\r
-       ClearFrame();\r
-       mglTexture txt(col,0,0);\r
-       FillBackground(txt.col[1]);\r
-}\r
-//-----------------------------------------------------------------------------\r
-void mglCanvas::Rasterize()\r
-{\r
-       Finish();\r
-       memcpy(GB,G4,4*Width*Height);\r
-}\r
-//-----------------------------------------------------------------------------\r
-bool MGL_NO_EXPORT mgl_read_image(unsigned char **g, int &w, int &h, const char *fname);\r
-void mglCanvas::LoadBackground(const char *fname, double alpha)\r
-{\r
-       mgl_read_image(&GB,Width,Height,fname);\r
-       if(alpha<1 && alpha>0)\r
-#pragma omp parallel for\r
-               for(long i=0;i<Width*Height;i++)        GB[4*i+3] = (unsigned char)(GB[4*i+3]*alpha);\r
-}\r
-//-----------------------------------------------------------------------------\r
-void mglCanvas::FillBackground(const mglColor &cc)\r
-{\r
-       BDef[0] = (unsigned char)(255*cc.r);    BDef[1] = (unsigned char)(255*cc.g);\r
-       BDef[2] = (unsigned char)(255*cc.b);    BDef[3] = (unsigned char)(255*cc.a);\r
-#pragma omp parallel for\r
-       for(long i=0;i<Width*Height;i++)        memcpy(GB+4*i,BDef,4);\r
-}\r
-//-----------------------------------------------------------------------------\r
 void mglCanvas::pxl_other(long id, long n, const void *p)\r
 {\r
        const mglCanvas *gr = (const mglCanvas *)p;\r
@@ -768,7 +204,7 @@ void mglCanvas::pxl_other(long id, long n, const void *p)
 #endif\r
                for(long k=id;k<n;k+=mglNumThr)\r
                {\r
-                       register long i = k%Width, j = Height-1-(k/Width);\r
+                       long i = k%Width, j = Height-1-(k/Width);\r
                        pnt_plot(i,j,gr->Z[3*k+2],gr->C+12*k+8,gr->OI[k]);\r
                        pnt_plot(i,j,gr->Z[3*k+1],gr->C+12*k+4,gr->OI[k]);\r
                        pnt_plot(i,j,gr->Z[3*k],gr->C+12*k,gr->OI[k]);\r
@@ -779,17 +215,11 @@ void mglCanvas::pxl_other(long id, long n, const void *p)
 #endif\r
                for(long k=id;k<n;k+=mglNumThr)\r
                {\r
-                       register long i = k%Width, j = Height-1-(k/Width);\r
+                       long i = k%Width, j = Height-1-(k/Width);\r
                        pnt_plot(i,j,gr->Z[3*k],gr->C+12*k,gr->OI[k]);\r
                }\r
 }\r
 //-----------------------------------------------------------------------------\r
-void mglCanvas::Combine(const mglCanvas *gr)\r
-{\r
-       if(Width!=gr->Width || Height!=gr->Height || !gr)       return; // wrong sizes\r
-       mglStartThread(&mglCanvas::pxl_other,this,Width*Height,gr);\r
-}\r
-//-----------------------------------------------------------------------------\r
 void mglCanvas::pnt_plot(long x,long y,mreal z,const unsigned char ci[4], int obj_id)\r
 {\r
        if(ci[3])\r
@@ -798,6 +228,9 @@ void mglCanvas::pnt_plot(long x,long y,mreal z,const unsigned char ci[4], int ob
                unsigned char *cc = C+12*i0, c[4];\r
                memcpy(c,ci,4);\r
                float *zz = Z+3*i0, zf = FogDist*(z/Depth-0.5-FogDz);\r
+               // try to remove double transparency near vertexes\r
+               if(fabs(z-zz[0])<1 && OI[i0]==obj_id && abs(cc[0]-ci[0])+abs(cc[1]-ci[1])+abs(cc[2]-ci[2])<5)\r
+               {       if(cc[3]<ci[3]) memcpy(cc,c,4); return; }\r
                if(zf<0)        // add fog\r
                {\r
                        int d = int(255.f-255.f*exp(5.f*zf));\r
@@ -840,7 +273,7 @@ unsigned char* mglCanvas::col2int(const mglPnt &p,unsigned char *r, int obj_id)
 {\r
 //     if(!r)  return r;       // NOTE r must be provided!\r
        if(p.a<=0)      {       memset(r,0,4);  return r;       }\r
-       register float b0=0,b1=0,b2=0, ar,ag,ab,dif;\r
+       float b0=0,b1=0,b2=0, ar,ag,ab,dif;\r
        const size_t nl = p.sub>=0?p.sub:1-p.sub;\r
        const bool glob = !get(MGL_LOCAL_LIGHT);\r
        ar = ag = ab = glob?AmbBr:Sub[nl].AmbBr;\r
@@ -911,11 +344,10 @@ void mglCanvas::combine(unsigned char *c1, const unsigned char *c2) const
 {\r
        if(c2[3])\r
        {\r
-               const register unsigned a1=c1[3], a2=c2[3];\r
-               if(a2==255 || a1==0)    {       memcpy(c1,c2,4);        return; }\r
+               const unsigned a1=c1[3], a2=c2[3];\r
                if((Flag&3)==0)\r
                {\r
-                       register unsigned b1=255-a2;\r
+                       unsigned b1=255-a2;\r
                        c1[0] = (c1[0]*b1 + c2[0]*a2)/256;\r
                        c1[1] = (c1[1]*b1 + c2[1]*a2)/256;\r
                        c1[2] = (c1[2]*b1 + c2[2]*a2)/256;\r
@@ -930,33 +362,21 @@ void mglCanvas::combine(unsigned char *c1, const unsigned char *c2) const
                }\r
                else if((Flag&3)==2)\r
                {\r
-                       register unsigned b1,b2,b3;\r
-                       b1 = (c1[0]*a1 + c2[0]*a2)/256;         c1[0] = b1<255 ? b1 : 255;\r
-                       b2 = (c1[1]*a1 + c2[1]*a2)/256;         c1[1] = b2<255 ? b2 : 255;\r
-                       b3 = (c1[2]*a1 + c2[2]*a2)/256;         c1[2] = b3<255 ? b3 : 255;\r
-                       c1[3] = a1+a2>255? 255 : a1+a2;\r
+                       unsigned b1,b2,b3;\r
+                       b1 = (c1[0]*a1 + c2[0]*a2)/255; c1[0] = b1<255 ? b1 : 255;\r
+                       b2 = (c1[1]*a1 + c2[1]*a2)/255; c1[1] = b2<255 ? b2 : 255;\r
+                       b3 = (c1[2]*a1 + c2[2]*a2)/255; c1[2] = b3<255 ? b3 : 255;\r
+                       c1[3] = 255;\r
                }\r
        }\r
 }\r
 //-----------------------------------------------------------------------------\r
-unsigned char **mglCanvas::GetRGBLines(long &w, long &h, unsigned char *&f, bool alpha)\r
-{\r
-       unsigned char **p;\r
-       Finish();\r
-       p = (unsigned char **)malloc(Height * sizeof(unsigned char *));\r
-       long d = (alpha ? 4:3)*Width;\r
-       unsigned char *gg = (alpha?G4:G);\r
-       for(long i=0;i<Height;i++)      p[i] = gg + d*i;\r
-       w = Width;      h = Height;             f = 0;\r
-       return p;\r
-}\r
-//-----------------------------------------------------------------------------\r
 bool inline visible(long i, long j, const unsigned char m[8], mreal pw, int a) // Check if pixel visible\r
 {\r
-       register float c = mgl_cos[(a+360)%360], s = mgl_cos[(a+450)%360];\r
-//     register int ii = int(0.5+(i*c+j*s)/pw)%8, jj = int(0.5+(j*c-i*s)/pw)%8;\r
+       float c = mgl_cos[(a+360)%360], s = mgl_cos[(a+450)%360];\r
+//     int ii = int(0.5+(i*c+j*s)/pw)%8, jj = int(0.5+(j*c-i*s)/pw)%8;\r
 //     if(ii<0)        ii+=8;  if(jj<0)        jj+=8;\r
-       register int ii = int(0.5+(i*c+j*s)/pw)&7, jj = int(0.5+(j*c-i*s)/pw)&7;\r
+       int ii = int(0.5+(i*c+j*s)/pw)&7, jj = int(0.5+(j*c-i*s)/pw)&7;\r
        return m[jj] & (1L<<ii);\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -1003,15 +423,15 @@ void mglCanvas::quad_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3,
        {\r
                if(pd==MGL_SOLID_MASK || visible(i,j,d->m, pw,ang))\r
                {\r
-                       register float xx = (i-x0), yy = (j-y0), s;\r
+                       float xx = (i-x0), yy = (j-y0), s;\r
                        s = dsx*xx + dsy*yy + (dd+d3.y*xx-d3.x*yy)*(dd+d3.y*xx-d3.x*yy);\r
                        if(s>=0)\r
                        {\r
                                s = sqrt(s);\r
-                               register float qu = d3.x*yy - d3.y*xx + dd + s;\r
-                               register float qv = d3.y*xx - d3.x*yy + dd + s;\r
-                               register float u = 2.f*(d2.y*xx - d2.x*yy)/qu;\r
-                               register float v = 2.f*(d1.x*yy - d1.y*xx)/qv;\r
+                               float qu = d3.x*yy - d3.y*xx + dd + s;\r
+                               float qv = d3.y*xx - d3.x*yy + dd + s;\r
+                               float u = 2.f*(d2.y*xx - d2.x*yy)/qu;\r
+                               float v = 2.f*(d1.x*yy - d1.y*xx)/qv;\r
                                if(u*(1.f-u)<0.f || v*(1.f-v)<0.f)      // first root bad\r
                                {\r
                                        qu = d3.x*yy - d3.y*xx + dd - s;\r
@@ -1029,49 +449,6 @@ void mglCanvas::quad_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3,
        }\r
 }\r
 //-----------------------------------------------------------------------------\r
-void mglCanvas::quad_pix(long i, long j, const mglPnt &p1, const mglPnt &p2, const mglPnt &p3, const mglPnt &p4, const mglDrawReg *d)\r
-{\r
-       if(!visible(i,j,d->m, d->PenWidth,d->angle))    return;\r
-       mglPnt d1(p2-p1), d2(p3-p1), d3(p4+p1-p2-p3);\r
-       register float dd = d1.x*d2.y-d1.y*d2.x;\r
-       register float dsx =-4*(d2.y*d3.x - d2.x*d3.y)*d1.y;\r
-       register float dsy = 4*(d2.y*d3.x - d2.x*d3.y)*d1.x;\r
-       register float xx = (i-p1.x), yy = (j-p1.y), s;\r
-       s = dsx*xx + dsy*yy + (dd+d3.y*xx-d3.x*yy)*(dd+d3.y*xx-d3.x*yy);\r
-       if(s<0) return; // no solution\r
-       s = sqrt(s);\r
-       register float qu = d3.x*yy - d3.y*xx + dd + s, u=-1;\r
-       register float qv = d3.y*xx - d3.x*yy + dd + s, v=-1;\r
-       if(qu && qv)\r
-       {\r
-               u = 2.f*(d2.y*xx - d2.x*yy)/qu;\r
-               v = 2.f*(d1.x*yy - d1.y*xx)/qv;\r
-       }\r
-       if(u*(1.f-u)<0.f || v*(1.f-v)<0.f)      // first root bad\r
-       {\r
-               qu = d3.x*yy - d3.y*xx + dd - s;\r
-               qv = d3.y*xx - d3.x*yy + dd - s;\r
-               u = v = -1.f;\r
-               if(qu && qv)\r
-               {\r
-                       u = 2.f*(d2.y*xx - d2.x*yy)/qu;\r
-                       v = 2.f*(d1.x*yy - d1.y*xx)/qv;\r
-               }\r
-               if(u*(1.f-u)<0.f || v*(1.f-v)<0.f)      return; // second root bad\r
-       }\r
-       mglPnt p(p1+d1*u+d2*v+d3*(u*v));\r
-       if(mgl_isnan(p.u) && mgl_isnum(p.v))\r
-       {\r
-               mglPoint n1(mglPoint(p2.x-p1.x,p2.y-p1.y,p2.z-p1.z)^mglPoint(p3.x-p1.x,p3.y-p1.y,p3.z-p1.z));\r
-               mglPoint n2(mglPoint(p2.x-p4.x,p2.y-p4.y,p2.z-p4.z)^mglPoint(p3.x-p4.x,p3.y-p4.y,p3.z-p4.z));\r
-               p.u = (n1.x+n2.x)*0.5;\r
-               p.v = (n1.y+n2.y)*0.5;\r
-               p.w = (n1.z+n2.z)*0.5;\r
-       }\r
-       unsigned char r[4];\r
-       pnt_plot(i,j,p.z,col2int(p,r,d->ObjId),d->ObjId);\r
-}\r
-//-----------------------------------------------------------------------------\r
 /* Linear interpolation r(u,v) = r0 + (r1-r0)*u + (r2-r0)*v is used, where r is\r
        one of {x,y,z,R,G,B,A}. Variables u,v are determined for each point (x,y).\r
        Point plotted is u>0 and v>0 and u+v<1.*/\r
@@ -1107,8 +484,8 @@ void mglCanvas::trig_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3,
        {\r
                if(pd==MGL_SOLID_MASK || visible(i,j,d->m, pw,ang))\r
                {\r
-                       register float xx = (i-x0), yy = (j-y0);\r
-                       register float u = dxu*xx+dyu*yy, v = dxv*xx+dyv*yy;\r
+                       float xx = (i-x0), yy = (j-y0);\r
+                       float u = dxu*xx+dyu*yy, v = dxv*xx+dyv*yy;\r
                        if(u<0 || v<0 || u+v>1) continue;\r
                        mglPnt p(p1+d1*u+d2*v);\r
                        if(mgl_isnan(p.u) && mgl_isnum(p.v) && anorm)\r
@@ -1124,8 +501,8 @@ void mglCanvas::trig_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3,
                {\r
                        if(pd==MGL_SOLID_MASK || visible(i,j,d->m, pw,ang))\r
                        {\r
-                               register float xx = (i-x0), yy = (j-y0);\r
-                               register float u = dxu*xx+dyu*yy, v = dxv*xx+dyv*yy;\r
+                               float xx = (i-x0), yy = (j-y0);\r
+                               float u = dxu*xx+dyu*yy, v = dxv*xx+dyv*yy;\r
                                if(u<0 || v<0 || u+v>1) continue;\r
                                pnt_plot(i,j,zz,r,oi);\r
                        }\r
@@ -1133,26 +510,8 @@ void mglCanvas::trig_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3,
        }\r
 }\r
 //-----------------------------------------------------------------------------\r
-void mglCanvas::trig_pix(long i, long j, const mglPnt &p1, const mglPnt &p2, const mglPnt &p3, bool anorm, const mglDrawReg *d)\r
-{\r
-       if(!visible(i,j,d->m, d->PenWidth,d->angle))    return;\r
-       mglPnt d1(p2-p1), d2(p3-p1);\r
-       register float dd = d2.x*d1.y - d1.x*d2.y;\r
-       if(fabs(dd)<1e-5)       return;         // points lies on the same line\r
-       register float dyv =-d1.x/dd, dxv = d1.y/dd, dyu = d2.x/dd, dxu =-d2.y/dd;\r
-       register float xx = (i-p1.x), yy = (j-p1.y);\r
-       register float u = dxu*xx+dyu*yy, v = dxv*xx+dyv*yy;\r
-       if(u<0 || v<0 || u+v>1) return;\r
-       mglPnt p(p1+d1*u+d2*v);\r
-       if(mgl_isnan(p.u) && mgl_isnum(p.v) && anorm)\r
-       {       mglPoint nr(mglPoint(p2.x-p1.x,p2.y-p1.y,p2.z-p1.z)^mglPoint(p3.x-p1.x,p3.y-p1.y,p3.z-p1.z));\r
-               p.u = nr.x;     p.v = nr.y;     p.w = nr.z;     }\r
-       unsigned char r[4];\r
-       pnt_plot(i,j,p.z,col2int(p,r,d->ObjId),d->ObjId);\r
-}\r
-//-----------------------------------------------------------------------------\r
 inline unsigned char mgl_sline(unsigned char c,float x)\r
-{      x*=x/2; return (unsigned char)((c)/(1+x+x*x/5));        }\r
+{      x*=x/2; return (unsigned char)(c/(1+x+x*x/5));  }\r
 void mglCanvas::line_draw(const mglPnt &p1, const mglPnt &p2, const mglDrawReg *dr)\r
 {\r
        if((Quality&3)==MGL_DRAW_WIRE)  {       fast_draw(p1,p2,dr);    return; }       // previously was <2. This may slightly slow down for Quality=1\r
@@ -1188,12 +547,12 @@ void mglCanvas::line_draw(const mglPnt &p1, const mglPnt &p2, const mglDrawReg *
                if(y1>y2)       continue;\r
                for(long j=y1;j<=y2;j++)\r
                {\r
-                       register float xx = (i-p1.x), yy = (j-p1.y);\r
-                       register float u = dxu*xx+dyu*yy, v = dxv*xx+dyv*yy;    v = v*v;\r
+                       float xx = (i-p1.x), yy = (j-p1.y);\r
+                       float u = dxu*xx+dyu*yy, v = dxv*xx+dyv*yy;     v = v*v;\r
                        if(u<0)                 v += u*u;\r
                        else if(u>dd)   v += (u-dd)*(u-dd);\r
 //                     if(v>pw*pw)             continue;\r
-                       if(!(pd & ( 1L<<long(fmod(pp+u/pw/1.5, 16)) ) ))        continue;\r
+                       if(!(pd & ((uint64_t)1<<long(fmod(pp+u/pw, 16)) ) ))    continue;\r
                        mglPnt p(p1+d*(u/dd));  col2int(p,r,oi);\r
                        r[3] = v<(pw-1)*(pw-1)/4 ? 255 : mgl_sline(255,dpw*(sqrt(v)+(1-pw)/2));\r
                        pnt_plot(i,j,p.z+dz,r,oi);\r
@@ -1208,12 +567,12 @@ void mglCanvas::line_draw(const mglPnt &p1, const mglPnt &p2, const mglDrawReg *
 \r
                for(long i=x1;i<=x2;i++)\r
                {\r
-                       register float xx = (i-p1.x), yy = (j-p1.y);\r
-                       register float u = dxu*xx+dyu*yy, v = dxv*xx+dyv*yy;    v = v*v;\r
+                       float xx = (i-p1.x), yy = (j-p1.y);\r
+                       float u = dxu*xx+dyu*yy, v = dxv*xx+dyv*yy;     v = v*v;\r
                        if(u<0)                 v += u*u;\r
                        else if(u>dd)   v += (u-dd)*(u-dd);\r
 //                     if(v>pw*pw)             continue;\r
-                       if(!(pd & (1L<<long(fmod(pp+u/pw/1.5, 16)))))           continue;\r
+                       if(!(pd & ((uint64_t)1<<long(fmod(pp+u/pw, 16)))))              continue;\r
                        mglPnt p(p1+d*(u/dd));  col2int(p,r,oi);\r
                        r[3] = v<(pw-1)*(pw-1)/4 ? 255 : mgl_sline(255,dpw*(sqrt(v)+(1-pw)/2));\r
                        pnt_plot(i,j,p.z+dz,r,oi);\r
@@ -1223,7 +582,7 @@ void mglCanvas::line_draw(const mglPnt &p1, const mglPnt &p2, const mglDrawReg *
 //-----------------------------------------------------------------------------\r
 void mglCanvas::pnt_fast(long x,long y,mreal z,const unsigned char ci[4], int obj_id)\r
 {\r
-       register long i0=x+Width*(Height-1-y);\r
+       long i0=x+Width*(Height-1-y);\r
        if(ci[3]!=0 && z>Z[3*i0])       // point upper the background\r
        {       Z[3*i0]=z;      memcpy(C+12*i0,ci,4);   OI[i0]=obj_id;  }\r
 }\r
@@ -1247,38 +606,18 @@ void mglCanvas::fast_draw(const mglPnt &p1, const mglPnt &p2, const mglDrawReg *
 \r
        if(hor) for(long i=x1;i<=x2;i++)\r
        {\r
-               register long c = long(p1.y+d.y*(i-p1.x)/d.x);\r
+               long c = long(p1.y+d.y*(i-p1.x)/d.x);\r
                if(c>=y1 && c<=y2)\r
                        pnt_fast(i, c, p1.z+d.z*(i-p1.x)/d.x+dz, r,oi);\r
        }\r
        else    for(long i=y1;i<=y2;i++)\r
        {\r
-               register long c = long(p1.x+d.x*(i-p1.y)/d.y);\r
+               long c = long(p1.x+d.x*(i-p1.y)/d.y);\r
                if(c>=x1 && c<=x2)\r
                        pnt_fast(c, i, p1.z+d.z*(i-p1.y)/d.y+dz, r,oi);\r
        }\r
 }\r
 //-----------------------------------------------------------------------------\r
-void mglCanvas::line_pix(long i, long j, const mglPnt &p1, const mglPnt &p2, const mglDrawReg *dr)\r
-{\r
-       register float xx = (i-p1.x), yy = (j-p1.y);\r
-       mglPnt d(p2-p1);\r
-       register float dd = hypot(d.x, d.y);\r
-       register float dxv = d.y/dd, dyv =-d.x/dd, dxu = d.x/dd, dyu = d.y/dd;\r
-       register float u = dxu*xx+dyu*yy, v = dxv*xx+dyv*yy;    v = v*v;\r
-       if(u<0)                 v += u*u;\r
-       else if(u>dd)   v += (u-dd)*(u-dd);\r
-       register float pw=dr->PenWidth, dpw=3*pen_delta;\r
-       if(dr->ObjId==HighId)   {       pw *= 2;        dpw=2*pen_delta;        }\r
-       if(v>pw*pw || !(dr->PDef & ( 1L<<long(fmod(dr->pPos+u/pw/1.5, 16)) ) )) return;\r
-       mglPnt p(p1+d*(u/dd));\r
-       unsigned char r[4];\r
-       col2int(p,r,dr->ObjId);\r
-       r[3] = v<(pw-1)*(pw-1)/4 ? 255 : mgl_sline(255,dpw*(sqrt(v)+(1-pw)/2));\r
-       register float dz = Width>2 ? 1 : 1e-5*Width;           // provide additional height to be well visible on the surfaces\r
-       pnt_plot(i,j,p.z+dz,r,dr->ObjId);\r
-}\r
-//-----------------------------------------------------------------------------\r
 void mglCanvas::pnt_draw(const mglPnt &p, const mglDrawReg *dr)\r
 {\r
 //     if(k<0 || !dr)  return;\r
@@ -1292,33 +631,21 @@ void mglCanvas::pnt_draw(const mglPnt &p, const mglDrawReg *dr)
        const long j1=mgl_max(-s,dr->y1-p.y),j2=mgl_min(s,dr->y2-p.y);\r
        if(!(Quality&3))        for(long j=j1;j<=j2;j++)        for(long i=i1;i<=i2;i++)        // fast draw\r
        {\r
-               register float v = i*i+j*j;\r
+               float v = i*i+j*j;\r
                if(v>1+(pw-1)*(pw-1)/4) continue;\r
                pnt_plot(p.x+i,p.y+j,p.z,cs,oi);\r
        }\r
        else    for(long j=j1;j<=j2;j++)        for(long i=i1;i<=i2;i++)\r
        {\r
-               register float v = i*i+j*j;\r
+               float v = i*i+j*j;\r
                cs[3] = v<(pw-1)*(pw-1)/4 ? cc : mgl_sline(cc,dpw*(sqrt(v)+(1-pw)/2));\r
                pnt_plot(p.x+i,p.y+j,p.z,cs,oi);\r
        }\r
 }\r
 //-----------------------------------------------------------------------------\r
-void mglCanvas::pnt_pix(long i, long j, const mglPnt &p, const mglDrawReg *dr)\r
-{\r
-       register float pw=3*dr->PenWidth,dpw=3*pen_delta;\r
-       if(dr->ObjId==HighId)   {       pw *= 2;        dpw=2*pen_delta;        }\r
-       unsigned char cs[4];\r
-       col2int(p,cs,dr->ObjId);\r
-       register float xx = (i-p.x), yy = (j-p.y), v = xx*xx+yy*yy;\r
-       if(cs[3]==0 || v>(10/dpw+pw)*(10/dpw+pw))       return;\r
-       if(v<(pw-1)*(pw-1)/4)   cs[3] = mgl_sline(cs[3],dpw*(sqrt(v)+(1-pw)/2));\r
-       pnt_plot(i,j,p.z,cs,dr->ObjId);\r
-}\r
-//-----------------------------------------------------------------------------\r
-void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)\r
+void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *dr)\r
 {\r
-       const int oi = d->ObjId;\r
+       const int oi = dr->ObjId;\r
        unsigned char cs[4];    col2int(q,cs,oi);\r
        const unsigned char ca = cs[3];// = size>0 ? 255 : 255*q.t;\r
        const mreal ss=(strchr("xsSoO",type)?1:1.1)*fabs(size), dpw=(oi==HighId?2:3)*pen_delta;\r
@@ -1326,41 +653,38 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
 \r
        if(type=='.' || ss==0)\r
        {\r
-               if(d)   PW = 3*(ss?ss:sqrt(font_factor/400));\r
+               PW = 3*(ss?ss:sqrt(font_factor/400));\r
                if(oi==HighId)  PW *= 2;\r
                const mreal pw = PW;\r
-               register mreal dd = pw+10/dpw;\r
+               mreal dd = pw+10/dpw;\r
                long x1 = long(q.x-dd), y1 = long(q.y-dd);      // bounding box\r
                long x2 = long(q.x+dd), y2 = long(q.y+dd);\r
-               x1=x1>d->x1?x1:d->x1;   x2=x2<d->x2?x2:d->x2;\r
-               y1=y1>d->y1?y1:d->y1;   y2=y2<d->y2?y2:d->y2;\r
+               x1=x1>dr->x1?x1:dr->x1; x2=x2<dr->x2?x2:dr->x2;\r
+               y1=y1>dr->y1?y1:dr->y1; y2=y2<dr->y2?y2:dr->y2;\r
                if(x1>x2 || y1>y2)      return;\r
                const float V=(pw-1)*(pw-1)/4,S=(1-pw)/2;\r
-               \r
+\r
                for(long j=y1;j<=y2;j++)        for(long i=x1;i<=x2;i++)\r
                {\r
-                       register float dx=i-q.x, dy=j-q.y, v=dx*dx+dy*dy;\r
-                       register int sum = v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
+                       float dx=i-q.x, dy=j-q.y, v=dx*dx+dy*dy;\r
+                       int sum = v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
                        cs[3] = ca*sum/255;\r
                        pnt_plot(i,j,q.z+1,cs,oi);\r
                }\r
        }\r
        else\r
        {\r
-               if(d)\r
-               {\r
-                       d->PDef = MGL_SOLID_MASK;       d->angle = 0;\r
-                       PW = d->PenWidth*sqrt(fabs(50*size));\r
-                       if(PW<1)        PW=1;\r
-               }\r
+               dr->PDef = MGL_SOLID_MASK;      dr->angle = 0;\r
+               PW = dr->PenWidth*sqrt(fabs(50*size));\r
+               if(PW<1)        PW=1;\r
                if(oi==HighId)  PW *= 2;\r
                const mreal pw = PW;\r
 \r
-               register mreal dd = ss+pw+10/dpw;\r
+               mreal dd = ss+pw+10/dpw;\r
                long x1 = long(q.x-dd), y1 = long(q.y-dd);      // bounding box\r
                long x2 = long(q.x+dd), y2 = long(q.y+dd);\r
-               x1=x1>d->x1?x1:d->x1;   x2=x2<d->x2?x2:d->x2;\r
-               y1=y1>d->y1?y1:d->y1;   y2=y2<d->y2?y2:d->y2;\r
+               x1=x1>dr->x1?x1:dr->x1; x2=x2<dr->x2?x2:dr->x2;\r
+               y1=y1>dr->y1?y1:dr->y1; y2=y2<dr->y2?y2:dr->y2;\r
                if(x1>x2 || y1>y2)      return;\r
                const float V=(pw-1)*(pw-1)/4,S=(1-pw)/2;\r
 \r
@@ -1369,8 +693,8 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
                case 'P':\r
                        for(long j=y1;j<=y2;j++)        for(long i=x1;i<=x2;i++)\r
                        {\r
-                               register float dx=i-q.x, dy=j-q.y, v,u;\r
-                               register int sum=0;\r
+                               float dx=i-q.x, dy=j-q.y, v,u;\r
+                               int sum=0;\r
                                u = fabs(dy)-ss;        v = (dx-ss)*(dx-ss)+(u<0?0:u*u);\r
                                sum += v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
                                u = fabs(dy)-ss;        v = (dx+ss)*(dx+ss)+(u<0?0:u*u);\r
@@ -1390,8 +714,8 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
                case '+':\r
                        for(long j=y1;j<=y2;j++)        for(long i=x1;i<=x2;i++)\r
                        {\r
-                               register float dx=i-q.x, dy=j-q.y, v,u;\r
-                               register int sum=0;\r
+                               float dx=i-q.x, dy=j-q.y, v,u;\r
+                               int sum=0;\r
                                u = fabs(dy)-ss;        v = dx*dx+(u<0?0:u*u);\r
                                sum += v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
                                u = fabs(dx)-ss;        v = dy*dy+(u<0?0:u*u);\r
@@ -1403,8 +727,8 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
                case 'X':\r
                        for(long j=y1;j<=y2;j++)        for(long i=x1;i<=x2;i++)\r
                        {\r
-                               register float dx=i-q.x, dy=j-q.y, v,u;\r
-                               register int sum=0;\r
+                               float dx=i-q.x, dy=j-q.y, v,u;\r
+                               int sum=0;\r
                                u = fabs(dy)-ss;        v = (dx-ss)*(dx-ss)+(u<0?0:u*u);\r
                                sum += v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
                                u = fabs(dy)-ss;        v = (dx+ss)*(dx+ss)+(u<0?0:u*u);\r
@@ -1426,8 +750,8 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
                case 'x':\r
                        for(long j=y1;j<=y2;j++)        for(long i=x1;i<=x2;i++)\r
                        {\r
-                               register float dx=i-q.x, dy=j-q.y, v,u;\r
-                               register int sum=0;\r
+                               float dx=i-q.x, dy=j-q.y, v,u;\r
+                               int sum=0;\r
                                u = fabs(dx+dy)-2*ss;   v = dx-dy;      v = v*v+(u<0?0:u*u);\r
                                sum += v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
                                u = fabs(dx-dy)-2*ss;   v = dx+dy;      v = v*v+(u<0?0:u*u);\r
@@ -1439,10 +763,10 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
                case 'S':\r
                        for(long j=y1;j<=y2;j++)        for(long i=x1;i<=x2;i++)\r
                        {\r
-                               register float dx=i-q.x, dy=j-q.y, v,u;\r
+                               float dx=i-q.x, dy=j-q.y, v,u;\r
                                u = fabs(dy)-ss;        if(u<0) u=0;\r
                                v = fabs(dx)-ss;        if(v<0) v=0;    v = u*u+v*v;\r
-                               register int sum = v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
+                               int sum = v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
                                cs[3] = ca*sum/255;\r
                                pnt_plot(i,j,q.z+1,cs,oi);\r
                        }\r
@@ -1450,8 +774,8 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
                case 's':\r
                        for(long j=y1;j<=y2;j++)        for(long i=x1;i<=x2;i++)\r
                        {\r
-                               register float dx=i-q.x, dy=j-q.y, v,u;\r
-                               register int sum=0;\r
+                               float dx=i-q.x, dy=j-q.y, v,u;\r
+                               int sum=0;\r
                                u = fabs(dy)-ss;        v = (dx-ss)*(dx-ss)+(u<0?0:u*u);\r
                                sum += v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
                                u = fabs(dy)-ss;        v = (dx+ss)*(dx+ss)+(u<0?0:u*u);\r
@@ -1467,10 +791,10 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
                case 'D':\r
                        for(long j=y1;j<=y2;j++)        for(long i=x1;i<=x2;i++)\r
                        {\r
-                               register float dx=i-q.x, dy=j-q.y, v,u;\r
+                               float dx=i-q.x, dy=j-q.y, v,u;\r
                                u = fabs(dx-dy)-ss;     if(u<0) u=0;\r
                                v = fabs(dx+dy)-ss;     if(v<0) v=0;    v = u*u+v*v;\r
-                               register int sum = v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
+                               int sum = v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
                                cs[3] = ca*sum/255;\r
                                pnt_plot(i,j,q.z+1,cs,oi);\r
                        }\r
@@ -1478,8 +802,8 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
                case 'd':\r
                        for(long j=y1;j<=y2;j++)        for(long i=x1;i<=x2;i++)\r
                        {\r
-                               register float dx=i-q.x, dy=j-q.y, v,u;\r
-                               register int sum=0;\r
+                               float dx=i-q.x, dy=j-q.y, v,u;\r
+                               int sum=0;\r
                                u = fabs(dx+dy)-ss;     v = (dx-dy-ss)*(dx-dy-ss)+(u<0?0:u*u);\r
                                sum += v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
                                u = fabs(dx+dy)-ss;     v = (dx-dy+ss)*(dx-dy+ss)+(u<0?0:u*u);\r
@@ -1495,8 +819,8 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
                case 'Y':\r
                        for(long j=y1;j<=y2;j++)        for(long i=x1;i<=x2;i++)\r
                        {\r
-                               register float dx=i-q.x, dy=j-q.y, v,u;\r
-                               register int sum=0;\r
+                               float dx=i-q.x, dy=j-q.y, v,u;\r
+                               int sum=0;\r
                                u = fabs(dy+ss/2)-ss/2; v = dx*dx+(u<0?0:u*u);\r
                                sum += v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
                                u = fabs(0.87*dx+0.5*dy-ss/2)-ss/2;     v = (0.5*dx-0.87*dy)*(0.5*dx-0.87*dy)+(u<0?0:u*u);\r
@@ -1510,8 +834,8 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
                case '*':\r
                        for(long j=y1;j<=y2;j++)        for(long i=x1;i<=x2;i++)\r
                        {\r
-                               register float dx=i-q.x, dy=j-q.y, v,u;\r
-                               register int sum=0;\r
+                               float dx=i-q.x, dy=j-q.y, v,u;\r
+                               int sum=0;\r
                                u = fabs(dy)-ss;        v = dx*dx+(u<0?0:u*u);\r
                                sum += v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
                                u = fabs(0.87*dx+0.5*dy)-ss;    v = (0.5*dx-0.87*dy)*(0.5*dx-0.87*dy)+(u<0?0:u*u);\r
@@ -1525,12 +849,12 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
                case 'T':\r
                        for(long j=y1;j<=y2;j++)        for(long i=x1;i<=x2;i++)\r
                        {\r
-                               register float dx=i-q.x, dy=j-q.y, v,u;\r
+                               float dx=i-q.x, dy=j-q.y, v,u;\r
                                u=dy/1.5+ss/3;  v=(dx+ss-u)/2;\r
                                if(u>0 && v>0 && u+v<ss)        cs[3]=ca;\r
                                else\r
                                {\r
-                                       register int sum=0;\r
+                                       int sum=0;\r
                                        u = fabs(dx)-ss;        v = dy+ss/2;    v = v*v+(u<0?0:u*u);\r
                                        sum += v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
                                        u = fabs(0.55*dx+0.83*dy)-0.9*ss;       v = 0.83*dx-0.55*dy+0.55*ss;    v = v*v+(u<0?0:u*u);\r
@@ -1545,8 +869,8 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
                case '^':\r
                        for(long j=y1;j<=y2;j++)        for(long i=x1;i<=x2;i++)\r
                        {\r
-                               register float dx=i-q.x, dy=j-q.y, v,u;\r
-                               register int sum=0;\r
+                               float dx=i-q.x, dy=j-q.y, v,u;\r
+                               int sum=0;\r
                                u = fabs(dx)-ss;        v = dy+ss/2;    v = v*v+(u<0?0:u*u);\r
                                sum += v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
                                u = fabs(0.55*dx+0.83*dy)-0.9*ss;       v = 0.83*dx-0.55*dy+0.55*ss;    v = v*v+(u<0?0:u*u);\r
@@ -1560,12 +884,12 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
                case 'V':\r
                        for(long j=y1;j<=y2;j++)        for(long i=x1;i<=x2;i++)\r
                        {\r
-                               register float dx=i-q.x, dy=j-q.y, v,u;\r
+                               float dx=i-q.x, dy=j-q.y, v,u;\r
                                u=-dy/1.5+ss/3; v=(dx+ss-u)/2;\r
                                if(u>0 && v>0 && u+v<ss)        cs[3]=ca;\r
                                else\r
                                {\r
-                                       register int sum=0;\r
+                                       int sum=0;\r
                                        u = fabs(dx)-ss;        v = dy-ss/2;    v = v*v+(u<0?0:u*u);\r
                                        sum += v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
                                        u = fabs(0.55*dx+0.83*dy)-0.9*ss;       v = 0.83*dx-0.55*dy-0.55*ss;    v = v*v+(u<0?0:u*u);\r
@@ -1580,8 +904,8 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
                case 'v':\r
                        for(long j=y1;j<=y2;j++)        for(long i=x1;i<=x2;i++)\r
                        {\r
-                               register float dx=i-q.x, dy=j-q.y, v,u;\r
-                               register int sum=0;\r
+                               float dx=i-q.x, dy=j-q.y, v,u;\r
+                               int sum=0;\r
                                u = fabs(dx)-ss;        v = dy-ss/2;    v = v*v+(u<0?0:u*u);\r
                                sum += v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
                                u = fabs(0.55*dx+0.83*dy)-0.9*ss;       v = 0.83*dx-0.55*dy-0.55*ss;    v = v*v+(u<0?0:u*u);\r
@@ -1595,12 +919,12 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
                case 'L':\r
                        for(long j=y1;j<=y2;j++)        for(long i=x1;i<=x2;i++)\r
                        {\r
-                               register float dx=i-q.x, dy=j-q.y, v,u;\r
+                               float dx=i-q.x, dy=j-q.y, v,u;\r
                                u=-dx/1.5+ss/3; v=(dy+ss-u)/2;\r
                                if(u>0 && v>0 && u+v<ss)        cs[3]=ca;\r
                                else\r
                                {\r
-                                       register int sum=0;\r
+                                       int sum=0;\r
                                        u = fabs(dy)-ss;        v = dx-ss/2;    v = v*v+(u<0?0:u*u);\r
                                        sum += v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
                                        u = fabs(0.55*dy+0.83*dx)-0.9*ss;       v = 0.83*dy-0.55*dx-0.55*ss;    v = v*v+(u<0?0:u*u);\r
@@ -1615,8 +939,8 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
                case '<':\r
                        for(long j=y1;j<=y2;j++)        for(long i=x1;i<=x2;i++)\r
                        {\r
-                               register float dx=i-q.x, dy=j-q.y, v,u;\r
-                               register int sum=0;\r
+                               float dx=i-q.x, dy=j-q.y, v,u;\r
+                               int sum=0;\r
                                u = fabs(dy)-ss;        v = dx-ss/2;    v = v*v+(u<0?0:u*u);\r
                                sum += v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
                                u = fabs(0.55*dy+0.83*dx)-0.9*ss;       v = 0.83*dy-0.55*dx-0.55*ss;    v = v*v+(u<0?0:u*u);\r
@@ -1630,12 +954,12 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
                case 'R':\r
                        for(long j=y1;j<=y2;j++)        for(long i=x1;i<=x2;i++)\r
                        {\r
-                               register float dx=i-q.x, dy=j-q.y, v,u;\r
+                               float dx=i-q.x, dy=j-q.y, v,u;\r
                                u=dx/1.5+ss/3;  v=(dy+ss-u)/2;\r
                                if(u>0 && v>0 && u+v<ss)        cs[3]=ca;\r
                                else\r
                                {\r
-                                       register int sum=0;\r
+                                       int sum=0;\r
                                        u = fabs(dy)-ss;        v = dx+ss/2;    v = v*v+(u<0?0:u*u);\r
                                        sum += v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
                                        u = fabs(0.55*dy+0.83*dx)-0.9*ss;       v = 0.83*dy-0.55*dx+0.55*ss;    v = v*v+(u<0?0:u*u);\r
@@ -1650,8 +974,8 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
                case '>':\r
                        for(long j=y1;j<=y2;j++)        for(long i=x1;i<=x2;i++)\r
                        {\r
-                               register float dx=i-q.x, dy=j-q.y, v,u;\r
-                               register int sum=0;\r
+                               float dx=i-q.x, dy=j-q.y, v,u;\r
+                               int sum=0;\r
                                u = fabs(dy)-ss;        v = dx+ss/2;    v = v*v+(u<0?0:u*u);\r
                                sum += v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
                                u = fabs(0.55*dy+0.83*dx)-0.9*ss;       v = 0.83*dy-0.55*dx+0.55*ss;    v = v*v+(u<0?0:u*u);\r
@@ -1665,9 +989,9 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
                case 'O':\r
                        for(long j=y1;j<=y2;j++)        for(long i=x1;i<=x2;i++)\r
                        {\r
-                               register float dx=i-q.x, dy=j-q.y, v;\r
+                               float dx=i-q.x, dy=j-q.y, v;\r
                                v = hypot(dx,dy)-ss;    v=v<0?0:v*v;\r
-                               register int sum = v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
+                               int sum = v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
                                cs[3] = ca*sum/255;\r
                                pnt_plot(i,j,q.z+1,cs,oi);\r
                        }\r
@@ -1675,9 +999,9 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
                case 'o':\r
                        for(long j=y1;j<=y2;j++)        for(long i=x1;i<=x2;i++)\r
                        {\r
-                               register float dx=i-q.x, dy=j-q.y, v;\r
+                               float dx=i-q.x, dy=j-q.y, v;\r
                                v = hypot(dx,dy)-ss;    v=v*v;\r
-                               register int sum = v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
+                               int sum = v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
                                cs[3] = ca*sum/255;\r
                                pnt_plot(i,j,q.z+1,cs,oi);\r
                        }\r
@@ -1685,9 +1009,9 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
                case 'C':\r
                        for(long j=y1;j<=y2;j++)        for(long i=x1;i<=x2;i++)\r
                        {\r
-                               register float dx=i-q.x, dy=j-q.y, v;\r
+                               float dx=i-q.x, dy=j-q.y, v;\r
                                v = hypot(dx,dy)-ss;    v=v*v;\r
-                               register int sum = v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
+                               int sum = v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
                                v = dx*dx+dy*dy;\r
                                sum += v<(2*pw-1)*(2*pw-1)/4 ? 255 : mgl_sline(255,dpw*(sqrt(v)+(1-2*pw)/2));\r
                                sum = sum>255?255:sum;  cs[3] = ca*sum/255;\r
@@ -1698,156 +1022,6 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
        }\r
 }\r
 //-----------------------------------------------------------------------------\r
-void mglCanvas::mark_pix(long i, long j, const mglPnt &q, char type, mreal size, mglDrawReg *d)\r
-{\r
-       unsigned char cs[4];    col2int(q,cs,d->ObjId); cs[3] = size>0 ? 255 : 255*q.t;\r
-       mglPnt p0=q,p1=q,p2=q,p3=q;\r
-       mreal ss=fabs(size);\r
-\r
-       if(type=='.' || ss==0)\r
-       {\r
-               if(d)   d->PenWidth = ss?ss:sqrt(font_factor/400);\r
-               pnt_pix(i,j,q,d);\r
-       }\r
-       else\r
-       {\r
-               if(d)\r
-               {\r
-                       d->PDef = MGL_SOLID_MASK;       d->angle = 0;\r
-                       d->PenWidth*=fabs(50*size);\r
-                       if(d->PenWidth<1)       d->PenWidth=1;\r
-               }\r
-               if(!strchr("xsSoO",type))       ss *= 1.1;\r
-               switch(type)\r
-               {\r
-               case 'P':\r
-                       p0.x = q.x-ss;  p0.y = q.y-ss;  p1.x = q.x+ss;  p1.y = q.y-ss;\r
-                       p2.x = q.x+ss;  p2.y = q.y+ss;  p3.x = q.x-ss;  p3.y = q.y+ss;\r
-                       line_pix(i,j,p0,p1,d);  line_pix(i,j,p1,p2,d);\r
-                       line_pix(i,j,p2,p3,d);  line_pix(i,j,p3,p0,d);\r
-               case '+':\r
-                       p0.x = q.x-ss;  p0.y = q.y;     p1.x = q.x+ss;  p1.y = q.y;     line_pix(i,j,p0,p1,d);\r
-                       p2.x = q.x;     p2.y = q.y-ss;  p3.x = q.x;     p3.y = q.y+ss;  line_pix(i,j,p2,p3,d);\r
-                       break;\r
-               case 'X':\r
-                       p0.x = q.x-ss;  p0.y = q.y-ss;  p1.x = q.x+ss;  p1.y = q.y-ss;\r
-                       p2.x = q.x+ss;  p2.y = q.y+ss;  p3.x = q.x-ss;  p3.y = q.y+ss;\r
-                       line_pix(i,j,p0,p1,d);  line_pix(i,j,p1,p2,d);\r
-                       line_pix(i,j,p2,p3,d);  line_pix(i,j,p3,p0,d);\r
-               case 'x':\r
-                       p0.x = q.x-ss;  p0.y = q.y-ss;  p1.x = q.x+ss;  p1.y = q.y+ss;  line_pix(i,j,p0,p1,d);\r
-                       p2.x = q.x+ss;  p2.y = q.y-ss;  p3.x = q.x-ss;  p3.y = q.y+ss;  line_pix(i,j,p2,p3,d);\r
-                       break;\r
-               case 'S':\r
-                       p0.x = q.x-ss;  p0.y = q.y-ss;  p1.x = q.x-ss;  p1.y = q.y+ss;\r
-                       p2.x= q.x+ss;   p2.y= q.y+ss;   p3.x = q.x+ss;  p3.y = q.y-ss;\r
-                       quad_pix(i,j,p0,p1,p3,p2,d);\r
-               case 's':\r
-                       p0.x = q.x-ss;  p0.y = q.y-ss;  p1.x = q.x+ss;  p1.y = q.y-ss;\r
-                       p2.x = q.x+ss;  p2.y = q.y+ss;  p3.x = q.x-ss;  p3.y = q.y+ss;\r
-                       line_pix(i,j,p0,p1,d);  line_pix(i,j,p1,p2,d);\r
-                       line_pix(i,j,p2,p3,d);  line_pix(i,j,p3,p0,d);\r
-                       break;\r
-               case 'D':\r
-                       p0.x = q.x;     p0.y = q.y-ss;  p1.x = q.x+ss;  p1.y = q.y;\r
-                       p2.x= q.x;      p2.y= q.y+ss;   p3.x = q.x-ss;  p3.y = q.y;\r
-                       quad_pix(i,j,p0,p1,p3,p2,d);\r
-               case 'd':\r
-                       p0.x = q.x;     p0.y = q.y-ss;  p1.x = q.x+ss;  p1.y = q.y;\r
-                       p2.x = q.x;     p2.y = q.y+ss;  p3.x = q.x-ss;  p3.y = q.y;\r
-                       line_pix(i,j,p0,p1,d);  line_pix(i,j,p1,p2,d);\r
-                       line_pix(i,j,p2,p3,d);  line_pix(i,j,p3,p0,d);\r
-                       break;\r
-               case 'Y':\r
-                       p1.x = q.x;     p1.y = q.y-ss;  line_pix(i,j,q,p1,d);\r
-                       p2.x = q.x-0.8*ss;      p2.y = q.y+0.6*ss;      line_pix(i,j,q,p2,d);\r
-                       p3.x = q.x+0.8*ss;      p3.y = q.y+0.6*ss;      line_pix(i,j,q,p3,d);\r
-                       break;\r
-               case '*':\r
-                       p0.x = q.x-ss;          p0.y = q.y;\r
-                       p1.x = q.x+ss;          p1.y = q.y;     line_pix(i,j,p0,p1,d);\r
-                       p0.x = q.x-0.6*ss;      p0.y = q.y-0.8*ss;\r
-                       p1.x = q.x+0.6*ss;      p1.y = q.y+0.8*ss;      line_pix(i,j,p0,p1,d);\r
-                       p0.x = q.x-0.6*ss;      p0.y = q.y+0.8*ss;\r
-                       p1.x = q.x+0.6*ss;      p1.y = q.y-0.8*ss;      line_pix(i,j,p0,p1,d);\r
-                       break;\r
-               case 'T':\r
-                       p0.x = q.x-ss;  p0.y = q.y-ss/2;\r
-                       p1.x = q.x+ss;  p1.y = q.y-ss/2;\r
-                       p2.x= q.x;              p2.y= q.y+ss;\r
-                       trig_pix(i,j,p0,p1,p2,false,d);\r
-               case '^':\r
-                       p0.x = q.x-ss;  p0.y = q.y-ss/2;\r
-                       p1.x = q.x+ss;  p1.y = q.y-ss/2;\r
-                       p2.x= q.x;              p2.y= q.y+ss;\r
-                       line_pix(i,j,p0,p1,d);  line_pix(i,j,p1,p2,d);\r
-                       line_pix(i,j,p2,p0,d);  break;\r
-               case 'V':\r
-                       p0.x = q.x-ss;  p0.y = q.y+ss/2;\r
-                       p1.x = q.x+ss;  p1.y = q.y+ss/2;\r
-                       p2.x= q.x;              p2.y= q.y-ss;\r
-                       trig_pix(i,j,p0,p1,p2,false,d);\r
-               case 'v':\r
-                       p0.x = q.x-ss;  p0.y = q.y+ss/2;\r
-                       p1.x = q.x+ss;  p1.y = q.y+ss/2;\r
-                       p2.x= q.x;              p2.y= q.y-ss;\r
-                       line_pix(i,j,p0,p1,d);  line_pix(i,j,p1,p2,d);\r
-                       line_pix(i,j,p2,p0,d);  break;\r
-               case 'L':\r
-                       p0.x = q.x+ss/2;        p0.y = q.y+ss;\r
-                       p1.x = q.x+ss/2;        p1.y = q.y-ss;\r
-                       p2.x= q.x-ss;           p2.y= q.y;\r
-                       trig_pix(i,j,p0,p1,p2,false,d);\r
-               case '<':\r
-                       p0.x = q.x+ss/2;        p0.y = q.y+ss;\r
-                       p1.x = q.x+ss/2;        p1.y = q.y-ss;\r
-                       p2.x= q.x-ss;           p2.y= q.y;\r
-                       line_pix(i,j,p0,p1,d);  line_pix(i,j,p1,p2,d);\r
-                       line_pix(i,j,p2,p0,d);  break;\r
-               case 'R':\r
-                       p0.x = q.x-ss/2;        p0.y = q.y+ss;\r
-                       p1.x = q.x-ss/2;        p1.y = q.y-ss;\r
-                       p2.x= q.x+ss;           p2.y= q.y;\r
-                       trig_pix(i,j,p0,p1,p2,false,d);\r
-               case '>':\r
-                       p0.x = q.x-ss/2;        p0.y = q.y+ss;\r
-                       p1.x = q.x-ss/2;        p1.y = q.y-ss;\r
-                       p2.x= q.x+ss;           p2.y= q.y;\r
-                       line_pix(i,j,p0,p1,d);  line_pix(i,j,p1,p2,d);\r
-                       line_pix(i,j,p2,p0,d);  break;\r
-               case 'O':\r
-                       {\r
-                               register float xx = (i-q.x), yy = (j-q.y);\r
-                               register float dz = Width>2 ? 1 : 1e-5*Width;           // provide additional height to be well visible on the surfaces\r
-                               if(xx*xx+yy*yy<ss*ss)   pnt_plot(i,j,q.z+dz,cs,d->ObjId);\r
-                       }\r
-               case 'o':\r
-                       {\r
-                               register float pw=d->PenWidth;\r
-                               register float xx = (i-q.x), yy = (j-q.y), v = hypot(xx,yy);\r
-                               v = (v-ss)*(v-ss);\r
-//                             if(v>pw*pw)     return;\r
-                               if(v>(pw-1)*(pw-1)/4)   cs[3] = mgl_sline(cs[3],2*(sqrt(v)+(1-pw)/2));\r
-                               register float dz = Width>2 ? 1 : 1e-5*Width;           // provide additional height to be well visible on the surfaces\r
-                               pnt_plot(i,j,q.z+dz,cs,d->ObjId);\r
-                       }\r
-                       break;\r
-               case 'C':\r
-                       pnt_pix(i,j,q,d);\r
-                       {\r
-                               register float pw=d->PenWidth;\r
-                               register float xx = (i-q.x), yy = (j-q.y), v = hypot(xx,yy);\r
-                               v = (v-ss)*(v-ss);\r
-//                             if(v>pw*pw)     return;\r
-                               if(v>(pw-1)*(pw-1)/4)   cs[3] = mgl_sline(cs[3],2*(sqrt(v)+(1-pw)/2));\r
-                               register float dz = Width>2 ? 1 : 1e-5*Width;           // provide additional height to be well visible on the surfaces\r
-                               pnt_plot(i,j,q.z+dz,cs,d->ObjId);\r
-                       }\r
-                       break;\r
-               }\r
-       }\r
-}\r
-//-----------------------------------------------------------------------------\r
 // scale direction for new view/zoom\r
 float mglCanvas::GetGlyphPhi(const mglPnt &q, float phi)\r
 {\r
@@ -1860,8 +1034,8 @@ float mglCanvas::GetGlyphPhi(const mglPnt &q, float phi)
                y = Bp.b[3]*q.u + Bp.b[4]*q.v + Bp.b[5]*q.w;\r
                z = Bp.b[6]*q.u + Bp.b[7]*q.v + Bp.b[8]*q.w;\r
 \r
-               register float dv= get_persp(Bp.pf,q.z,Depth);\r
-               register float c = get_pfact(Bp.pf,Depth);\r
+               float dv= get_persp(Bp.pf,q.z,Depth);\r
+               float c = get_pfact(Bp.pf,Depth);\r
                x += (q.x-Width/2)*z*c*dv;\r
                y += (q.y-Height/2)*z*c*dv;\r
        }\r
@@ -1880,199 +1054,216 @@ void mglCanvas::glyph_draw(const mglPrim &P, mglDrawReg *d)
 {\r
        float phi = GetGlyphPhi(Pnt[P.n2],P.w);\r
        if(mgl_isnan(phi))      return;\r
+       if(d)   {       d->PDef = MGL_SOLID_MASK;       d->angle = 0;   d->PenWidth=(P.n3&4)?1.2:0.8;   }\r
 \r
-       if(d)   {       d->PDef = MGL_SOLID_MASK;       d->angle = 0;   d->PenWidth=0.6;        }\r
-       mglPnt p=Pnt[P.n1];\r
-       // NOTE check this later for mglInPlot\r
+       mglPnt p=Pnt[P.n1];     p.a=1;\r
        mreal fact = get_persp(Bp.pf,p.z,Depth);\r
-       mreal pf=p.sub<0?1:sqrt((Bp.b[0]*Bp.b[0]+Bp.b[1]*Bp.b[1]+Bp.b[3]*Bp.b[3]+Bp.b[4]*Bp.b[4])/2)*fact, f = P.p*pf;\r
-\r
-       mglMatrix M;\r
-       M.b[0] = M.b[4] = M.b[8] = P.s;\r
-       M.RotateN(phi,0,0,1);\r
-       M.x=p.x;        M.y=p.y;        M.z=p.z;        M.pf = 1;\r
-       p.u *= pf;      p.v *= pf;\r
+       mreal pf=p.sub<0?1:sqrt((Bp.b[0]*Bp.b[0]+Bp.b[1]*Bp.b[1]+Bp.b[3]*Bp.b[3]+Bp.b[4]*Bp.b[4])/2)*fact;\r
+       mreal size=P.s, f = P.p*pf*P.s;\r
+       p.u *= pf*size; p.v *= pf*size;\r
 \r
        const mglGlyph &g = Glf[P.n4];\r
        if(P.n3&8)\r
        {\r
-               if(!(P.n3&4))   glyph_line(&M,p,f,true, d);\r
-               glyph_line(&M,p,f,false, d);\r
+               if(!(P.n3&4))   glyph_line(phi,p,f,true, d);\r
+               glyph_line(phi,p,f,false, d);\r
        }\r
        else\r
        {\r
-               if(!(P.n3&4))   glyph_fill(&M,p,f,g, d);\r
-               glyph_wire(&M,p,f,g, d);\r
+               if(!(P.n3&4))   glyph_fill(phi,p,f,g, d);\r
+               glyph_wire(phi,p,f,g, d);\r
        }\r
 }\r
 //-----------------------------------------------------------------------------\r
-void mglCanvas::glyph_fill(const mglMatrix *M, const mglPnt &pp, mreal f, const mglGlyph &g, const mglDrawReg *d)\r
+void MGL_NO_EXPORT mgl_addpnts(mreal x1,mreal y1,mreal x2,mreal y2, std::vector<mreal> *b)\r
 {\r
-       if(!g.trig || g.nt<=0)  return;\r
-       mglPnt q0=pp, q1=pp, q2=pp;\r
-       q0.u=q0.v=q1.u=q1.v=q2.u=q2.v=NAN;\r
-       for(long ik=0;ik<g.nt;ik++)\r
+//     if(x1>x2)       {       mreal t=x1;     x1=x2;  x2=t;   t=y1;   y1=y2;  y2=t;   }\r
+       if(y1<y2)       for(int i=long(y1);i<=long(y2)+1;i++)\r
        {\r
-               register long ii = 6*ik;        mglPoint p;\r
-               p.Set(f*g.trig[ii]+pp.u,f*g.trig[ii+1]+pp.v,0);\r
-               PostScale(M,p); q0.x = p.x;     q0.y = p.y;     q0.z = p.z;\r
-               ii+=2;  p.Set(f*g.trig[ii]+pp.u,f*g.trig[ii+1]+pp.v,0);\r
-               PostScale(M,p); q1.x = p.x;     q1.y = p.y;     q1.z = p.z;\r
-               ii+=2;  p.Set(f*g.trig[ii]+pp.u,f*g.trig[ii+1]+pp.v,0);\r
-               PostScale(M,p); q2.x = p.x;     q2.y = p.y;     q2.z = p.z;\r
-               trig_draw(q0,q1,q2,false,d);\r
+               mreal d = (i-y1)/(y2-y1);\r
+               if(d>=0 && d<=1)        b[i].push_back(x1+d*(x2-x1));\r
+       }\r
+       else    for(int i=long(y2);i<=long(y1)+1;i++)\r
+       {\r
+//             mreal xx1 = x1+(x2-x1)*(i-y1)/(y2-y1);\r
+//             mreal xx2 = x1+(x2-x1)*(i+1-y1)/(y2-y1);\r
+//             if(xx1>xx2)     {       mreal t=xx1;    xx1=xx2;        xx2=t;  }\r
+//             if(xx1<x1)      xx1=x1;\r
+//             if(xx2>x2)      xx2=x2;\r
+//             if(i>y1 && i<y2)\r
+//             {\r
+//                     b[i].push_back(xx1);\r
+//                     if(xx2>=xx1+1)  {       b[i].push_back(xx2);    b[i].push_back(xx2);    }\r
+//             }\r
+               mreal d = (i-y1)/(y2-y1);\r
+               if(d>=0 && d<=1)        b[i].push_back(x1+d*(x2-x1));\r
        }\r
 }\r
-//-----------------------------------------------------------------------------\r
-void mglCanvas::glyph_wire(const mglMatrix *M, const mglPnt &pp, mreal f, const mglGlyph &g, const mglDrawReg *d)\r
+void mglCanvas::glyph_fill(mreal phi, const mglPnt &pp, mreal f, const mglGlyph &g, const mglDrawReg *d)\r
 {\r
-       if(!g.line || g.nl<=0)  return;\r
-       long il=0;\r
-       mglPnt q0=pp, q1=pp;    q0.u=q0.v=q1.u=q1.v=NAN;\r
-       mglPoint p1,p2;\r
-       for(long ik=0;ik<g.nl;ik++)\r
+       if(g.trig && g.nt>0)    // slow but look very nice :(\r
        {\r
-               register long ii = 2*ik;\r
-               if(g.line[ii]==0x3fff && g.line[ii+1]==0x3fff)  // line breakthrough\r
-               {       il = ik+1;      continue;       }\r
-               else if(ik==g.nl-1 || (g.line[ii+2]==0x3fff && g.line[ii+3]==0x3fff))\r
-               {       // enclose the circle. May be in future this block should be commented\r
-                       p1.Set(f*g.line[ii]+pp.u,f*g.line[ii+1]+pp.v,0);        ii=2*il;\r
-                       p2.Set(f*g.line[ii]+pp.u,f*g.line[ii+1]+pp.v,0);\r
-               }\r
-               else\r
-               {       // normal line\r
-                       p1.Set(f*g.line[ii]+pp.u,f*g.line[ii+1]+pp.v,0);        ii+=2;\r
-                       p2.Set(f*g.line[ii]+pp.u,f*g.line[ii+1]+pp.v,0);\r
+               const mreal co=cos(phi*M_PI/180), si=sin(phi*M_PI/180);\r
+               mglPnt q0=pp, q1=pp, q2=pp;\r
+               q0.u=q0.v=q1.u=q1.v=q2.u=q2.v=NAN;\r
+               for(long ik=0;ik<g.nt;ik++)\r
+               {\r
+                       long ii = 6*ik; mreal x, y;\r
+                       x = pp.u+g.trig[ii]*f;  y = pp.v+g.trig[ii+1]*f;\r
+                       q0.x = pp.x+(x*co+y*si)/2;      q0.y = pp.y+(y*co-x*si)/2;      ii+=2;\r
+                       x = pp.u+g.trig[ii]*f;  y = pp.v+g.trig[ii+1]*f;\r
+                       q1.x = pp.x+(x*co+y*si)/2;      q1.y = pp.y+(y*co-x*si)/2;      ii+=2;\r
+                       x = pp.u+g.trig[ii]*f;  y = pp.v+g.trig[ii+1]*f;\r
+                       q2.x = pp.x+(x*co+y*si)/2;      q2.y = pp.y+(y*co-x*si)/2;\r
+                       trig_draw(q0,q1,q2,false,d);\r
                }\r
-               PostScale(M,p1);        PostScale(M,p2);\r
-               q0.x = p1.x;    q0.y = p1.y;    q0.z = p1.z;\r
-               q1.x = p2.x;    q1.y = p2.y;    q1.z = p2.z;\r
-               line_draw(q0,q1,d);\r
+               return;\r
        }\r
-}\r
-//-----------------------------------------------------------------------------\r
-void mglCanvas::glyph_line(const mglMatrix *M, const mglPnt &pp, mreal f, bool solid, const mglDrawReg *d)\r
-{\r
-       mglPnt q0=pp,q1=pp,q2=pp,q3=pp;\r
-       q0.u=q0.v=q1.u=q1.v=q2.u=q2.v=q3.u=q3.v=NAN;\r
-       mglPoint p1,p2,p3,p4;\r
-\r
-       mreal dy = 0.004;\r
-       p1.Set(pp.u,pp.v-dy,0); PostScale(M,p1);\r
-       p2.Set(pp.u,pp.v+dy,0); PostScale(M,p2);\r
-       p3.Set(fabs(f)+pp.u,pp.v+dy,0); PostScale(M,p3);\r
-       p4.Set(fabs(f)+pp.u,pp.v-dy,0); PostScale(M,p4);\r
-\r
-       q0.x = p1.x;    q0.y = p1.y;    q0.z = p1.z;\r
-       q1.x = p2.x;    q1.y = p2.y;    q1.z = p2.z;\r
-       q2.x = p3.x;    q2.y = p3.y;    q2.z = p3.z;\r
-       q3.x = p4.x;    q3.y = p4.y;    q3.z = p4.z;\r
+       if(!g.line || g.nl<=0)  return;\r
+       const mreal co=cos(phi*M_PI/180), si=sin(phi*M_PI/180);\r
 \r
-       if(solid)       quad_draw(q0,q1,q3,q2,d);\r
-       else\r
+       mreal x1 = 1e10, x2=-1e10, y1=1e10, y2=-1e10;\r
+       for(long i=0;i<g.nl;i++)        // find sizes of glyph\r
        {\r
-               line_draw(q0,q1,d);     line_draw(q2,q1,d);\r
-               line_draw(q0,q3,d);     line_draw(q2,q3,d);\r
+               long ii=2*i;\r
+               if(g.line[ii]==0x3fff && g.line[ii+1]==0x3fff)  continue;\r
+               mreal x = pp.u + g.line[ii]*f, y = pp.v + g.line[ii+1]*f;\r
+               mreal xx = pp.x+(x*co+y*si)/2, yy = pp.y+(y*co-x*si)/2;\r
+               if(xx<x1)       x1=xx;\r
+               if(xx>x2)       x2=xx;\r
+               if(yy<y1)       y1=yy;\r
+               if(yy>y2)       y2=yy;\r
        }\r
-}\r
-//-----------------------------------------------------------------------------\r
-void mglCanvas::glyph_pix(long i, long j, const mglPrim &P, mglDrawReg *d)\r
-{\r
-       float phi = GetGlyphPhi(Pnt[P.n2],P.w);\r
-       if(mgl_isnan(phi))      return;\r
-\r
-       if(d)   {       d->PDef = MGL_SOLID_MASK;       d->angle = 0;   d->PenWidth=1;  }\r
-       mglPnt p=Pnt[P.n1];\r
-       mreal pf=sqrt((Bp.b[0]*Bp.b[0]+Bp.b[1]*Bp.b[1]+Bp.b[3]*Bp.b[3]+Bp.b[4]*Bp.b[4])/2), f = P.p*pf;\r
-\r
-       mglMatrix M;\r
-       M.b[0] = M.b[4] = M.b[8] = P.s;\r
-       M.RotateN(phi,0,0,1);\r
-       M.x=p.x;        M.y=p.y;        M.z=p.z;        M.pf = 1;\r
-       p.u *= pf;      p.v *= pf;\r
-\r
-       const mglGlyph &g = Glf[P.n4];\r
-       if(P.n3&8)\r
+       x1-=2;  x2+=2;  y1-=2;  y2+=2;\r
+       long w = long(x2-x1+1), h = long(y2-y1+1), il=0;\r
+       long x0=long(x1), y0=long(y1),i1=1,i2=w-2,j1=1,j2=h-2;\r
+       if(d)   // apply mglDrawReg\r
        {\r
-               if(!(P.n3&4))   glyph_lpix(i,j,&M,p,f,true, d);\r
-               glyph_lpix(i,j,&M,p,f,false, d);\r
+               if(x0+i1<d->x1) i1 = d->x1-x0;\r
+               if(x0+i2>d->x2) i2 = d->x2-x0;\r
+               if(y0+j1<d->y1) j1 = d->y1-y0;\r
+               if(y0+j2>d->y2) j2 = d->y2-y0;\r
        }\r
        else\r
        {\r
-               if(!(P.n3&4))   glyph_fpix(i,j,&M,p,f,g, d);\r
-               glyph_wpix(i,j,&M,p,f,g, d);\r
+               if(x0+i1<0)             i1 = -x0;\r
+               if(x0+i2>Width) i2 = Width-x0;\r
+               if(y0+j1<0)             j1 = -y0;\r
+               if(y0+j2>Height)j2 = Height-y0;\r
        }\r
-}\r
-//-----------------------------------------------------------------------------\r
-void mglCanvas::glyph_fpix(long i, long j, const mglMatrix *M, const mglPnt &pp, mreal f, const mglGlyph &g, const mglDrawReg *d)\r
-{\r
-       if(!g.trig || g.nt<=0)  return;\r
-       mglPnt q0=pp, q1=pp, q2=pp;\r
-       q0.u=q0.v=q1.u=q1.v=q2.u=q2.v=NAN;\r
-       for(long ik=0;ik<g.nt;ik++)\r
+       if(i1>=i2 || j1>=j2)    return;\r
+\r
+       std::vector<mreal> *b = new std::vector<mreal>[h];\r
+       const float dz = Width>2 ? 1 : 1e-5*Width;              // provide additional height to be well visible on the surfaces\r
+       const int oi = d?d->ObjId:-1;\r
+       unsigned char r[4];     col2int(pp,r,oi);\r
+       for(long i=0;i<g.nl;i++)        // add bounding points\r
        {\r
-               register long ii = 6*ik;        mglPoint p;\r
-               p.Set(f*g.trig[ii]+pp.u,f*g.trig[ii+1]+pp.v,0);\r
-               PostScale(M,p); q0.x = p.x;     q0.y = p.y;     q0.z = p.z;\r
-               ii+=2;  p.Set(f*g.trig[ii]+pp.u,f*g.trig[ii+1]+pp.v,0);\r
-               PostScale(M,p); q1.x = p.x;     q1.y = p.y;     q1.z = p.z;\r
-               ii+=2;  p.Set(f*g.trig[ii]+pp.u,f*g.trig[ii+1]+pp.v,0);\r
-               PostScale(M,p); q2.x = p.x;     q2.y = p.y;     q2.z = p.z;\r
-               trig_pix(i,j,q0,q1,q2,false,d);\r
+               long ii=2*i;\r
+               mreal x = pp.u + g.line[ii]*f, y = pp.v + g.line[ii+1]*f;\r
+               mreal xx1 = pp.x+(x*co+y*si)/2-x1, yy1 = pp.y+(y*co-x*si)/2-y1, xx2, yy2;\r
+               if(g.line[ii]==0x3fff && g.line[ii+1]==0x3fff)  // line breakthrough\r
+               {       il = i+1;       continue;       }\r
+               else if(i==g.nl-1 || (g.line[ii+2]==0x3fff && g.line[ii+3]==0x3fff))    // enclose the circle\r
+               {\r
+                       ii=2*il;        x = pp.u + g.line[ii]*f;        y = pp.v + g.line[ii+1]*f;\r
+                       xx2 = pp.x+(x*co+y*si)/2-x1;    yy2 = pp.y+(y*co-x*si)/2-y1;\r
+               }\r
+               else    // ordinary line\r
+               {\r
+                       ii+=2;  x = pp.u + g.line[ii]*f;        y = pp.v + g.line[ii+1]*f;\r
+                       xx2 = pp.x+(x*co+y*si)/2-x1;    yy2 = pp.y+(y*co-x*si)/2-y1;\r
+               }\r
+               mgl_addpnts(xx1,yy1,xx2,yy2,b);\r
+               // draw boundary lines in any case ???\r
+               if(fabs(xx2-xx1)>fabs(yy2-yy1)) // horizontal line\r
+               {\r
+                       mreal d = (yy2-yy1)/(xx2-xx1), a = yy1-d*xx1+0.5;\r
+                       if(xx1>xx2)     {       mreal t=xx1;    xx1=xx2;        xx2=t;  }\r
+                       for(long k=xx1;k<=xx2;k++)\r
+                       {\r
+                               long ii = long(k), jj = long(a+d*k);\r
+                               if(ii>=i1 && ii<=i2 && jj>=j1 && jj<=j2)        pnt_plot(x0+ii,y0+jj,pp.z+dz,r,oi);\r
+                       }\r
+               }\r
+               else    // vertical line\r
+               {\r
+                       mreal d = (xx2-xx1)/(yy2-yy1), a = xx1-d*yy1+0.5;\r
+                       if(yy1>yy2)     {       mreal t=yy1;    yy1=yy2;        yy2=t;  }\r
+                       for(long k=yy1;k<=yy2;k++)\r
+                       {\r
+                               long jj = long(k), ii = long(a+d*k);\r
+                               if(ii>=i1 && ii<=i2 && jj>=j1 && jj<=j2)        pnt_plot(x0+ii,y0+jj,pp.z+dz,r,oi);\r
+                       }\r
+               }\r
+       }\r
+       // TODO add smoothing -- if 3 neighbors >0 => set 1; if 3 neighbors=0 => set 0 ???\r
+       for(long j=j1;j<=j2;j++)        // draw glyph\r
+       {\r
+               if(b[j].size()<2)       continue;\r
+               std::sort(b[j].begin(),b[j].end());\r
+               for(size_t k=0;k<b[j].size();k+=2)\r
+               {\r
+                       long ii1 = long(b[j][k]+0.5), ii2=long(b[j][k+1]+0.5);\r
+//                     if(ii1==ii2 && b[j].size()%2==1)        {       k++;    ii2=long(b[j][k+1]+0.5);        }\r
+                       if(ii1<i1)      ii1=i1;\r
+                       if(ii2>i2)      ii2=i2;\r
+                       for(long i=ii1;i<=ii2;i++)      pnt_plot(x0+i,y0+j,pp.z+dz,r,oi);\r
+               }\r
        }\r
+       delete []b;\r
 }\r
 //-----------------------------------------------------------------------------\r
-void mglCanvas::glyph_wpix(long i, long j, const mglMatrix *M, const mglPnt &pp, mreal f, const mglGlyph &g, const mglDrawReg *d)\r
+void mglCanvas::glyph_wire(mreal phi, const mglPnt &pp, mreal f, const mglGlyph &g, const mglDrawReg *d)\r
 {\r
        if(!g.line || g.nl<=0)  return;\r
        long il=0;\r
+       const mreal co=cos(phi*M_PI/180), si=sin(phi*M_PI/180);\r
        mglPnt q0=pp, q1=pp;    q0.u=q0.v=q1.u=q1.v=NAN;\r
        mglPoint p1,p2;\r
        for(long ik=0;ik<g.nl;ik++)\r
        {\r
-               register long ii = 2*ik;\r
+               long ii = 2*ik;\r
                if(g.line[ii]==0x3fff && g.line[ii+1]==0x3fff)  // line breakthrough\r
                {       il = ik+1;      continue;       }\r
                else if(ik==g.nl-1 || (g.line[ii+2]==0x3fff && g.line[ii+3]==0x3fff))\r
-               {       // enclose the circle. May be in future this block should be commented\r
-                       p1.Set(f*g.line[ii]+pp.u,f*g.line[ii+1]+pp.v,0);        ii=2*il;\r
-                       p2.Set(f*g.line[ii]+pp.u,f*g.line[ii+1]+pp.v,0);\r
+               {       // enclose the circle\r
+                       mreal x,y;\r
+                       x = pp.u+g.line[ii]*f;  y = pp.v+g.line[ii+1]*f;\r
+                       q0.x = pp.x+(x*co+y*si)/2;      q0.y = pp.y+(y*co-x*si)/2;      ii=2*il;\r
+                       x = pp.u+g.line[ii]*f;  y = pp.v+g.line[ii+1]*f;\r
+                       q1.x = pp.x+(x*co+y*si)/2;      q1.y = pp.y+(y*co-x*si)/2;\r
+                       line_draw(q0,q1,d);\r
                }\r
                else\r
                {       // normal line\r
-                       p1.Set(f*g.line[ii]+pp.u,f*g.line[ii+1]+pp.v,0);        ii+=2;\r
-                       p2.Set(f*g.line[ii]+pp.u,f*g.line[ii+1]+pp.v,0);\r
+                       mreal x,y;\r
+                       x = pp.u+g.line[ii]*f;  y = pp.v+g.line[ii+1]*f;\r
+                       q0.x = pp.x+(x*co+y*si)/2;      q0.y = pp.y+(y*co-x*si)/2;      ii+=2;\r
+                       x = pp.u+g.line[ii]*f;  y = pp.v+g.line[ii+1]*f;\r
+                       q1.x = pp.x+(x*co+y*si)/2;      q1.y = pp.y+(y*co-x*si)/2;\r
+                       line_draw(q0,q1,d);\r
                }\r
-               PostScale(M,p1);        PostScale(M,p2);\r
-               q0.x = p1.x;    q0.y = p1.y;    q0.z = p1.z;\r
-               q1.x = p2.x;    q1.y = p2.y;    q1.z = p2.z;\r
-               line_pix(i,j,q0,q1,d);\r
        }\r
 }\r
 //-----------------------------------------------------------------------------\r
-void mglCanvas::glyph_lpix(long i, long j, const mglMatrix *M, const mglPnt &pp, mreal f, bool solid, const mglDrawReg *d)\r
+void mglCanvas::glyph_line(mreal phi, const mglPnt &pp, mreal f, bool solid, const mglDrawReg *d)\r
 {\r
+       const mreal co=cos(phi*M_PI/180), si=sin(phi*M_PI/180);\r
        mglPnt q0=pp,q1=pp,q2=pp,q3=pp;\r
        q0.u=q0.v=q1.u=q1.v=q2.u=q2.v=q3.u=q3.v=NAN;\r
-       mglPoint p1,p2,p3,p4;\r
 \r
-       mreal dy = 0.004;\r
-       p1.Set(pp.u,pp.v-dy,0); PostScale(M,p1);\r
-       p2.Set(pp.u,pp.v+dy,0); PostScale(M,p2);\r
-       p3.Set(fabs(f)+pp.u,pp.v+dy,0); PostScale(M,p3);\r
-       p4.Set(fabs(f)+pp.u,pp.v-dy,0); PostScale(M,p4);\r
+       mreal dy = 0.004,x,y;\r
+       x=pp.u;         y=pp.v-dy;      q0.x=pp.x+(x*co+y*si)/2;        q0.y=pp.y+(y*co-x*si)/2;\r
+       x=pp.u+f;       y=pp.v-dy;      q1.x=pp.x+(x*co+y*si)/2;        q1.y=pp.y+(y*co-x*si)/2;\r
+       x=pp.u;         y=pp.v+dy;      q2.x=pp.x+(x*co+y*si)/2;        q2.y=pp.y+(y*co-x*si)/2;\r
+       x=pp.u+f;       y=pp.v+dy;      q3.x=pp.x+(x*co+y*si)/2;        q3.y=pp.y+(y*co-x*si)/2;\r
 \r
-       q0.x = p1.x;    q0.y = p1.y;    q0.z = p1.z;\r
-       q1.x = p2.x;    q1.y = p2.y;    q1.z = p2.z;\r
-       q2.x = p3.x;    q2.y = p3.y;    q2.z = p3.z;\r
-       q3.x = p4.x;    q3.y = p4.y;    q3.z = p4.z;\r
-\r
-       if(solid)       quad_pix(i,j,q0,q1,q3,q2,d);\r
+       if(solid)       quad_draw(q0,q1,q3,q2,d);\r
        else\r
        {\r
-               line_pix(i,j,q0,q1,d);  line_pix(i,j,q2,q1,d);\r
-               line_pix(i,j,q0,q3,d);  line_pix(i,j,q2,q3,d);\r
+               line_draw(q0,q1,d);     line_draw(q2,q1,d);\r
+               line_draw(q0,q3,d);     line_draw(q2,q3,d);\r
        }\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -2194,10 +1385,9 @@ void mglCanvas::arrow_plot_3d(long n1, long n2, char st, float ll)
                case 'O':       // let draw icosahedron\r
                {\r
                        const int n = 12, m = n/2;      Reserve(n*m);\r
-                       register long i,j;\r
                        long *nn=new long[2*n], n1=setPp(q,p0+kl), n2=setPp(q,p0-kl);\r
                        mreal u,v,rr;\r
-                       for(i=0;i<m;i++)        for(j=0;j<n;j++)\r
+                       for(long i=0;i<m;i++)   for(long j=0;j<n;j++)\r
                        {\r
                                if(i>0 && i<m-1)\r
                                {\r
@@ -2213,3 +1403,85 @@ void mglCanvas::arrow_plot_3d(long n1, long n2, char st, float ll)
        }\r
 }\r
 //-----------------------------------------------------------------------------\r
+bool mglCanvas::quad_vis(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3, const mglPnt &p4) const\r
+{\r
+       unsigned char r[4];\r
+       long y1,x1,y2,x2;\r
+       mglPnt d1(p2-p1), d2(p3-p1), d3(p4+p1-p2-p3);\r
+\r
+       if(d1.x==0 && d1.y==0)  return trig_vis(p1,p3,p4);\r
+       if(d2.x==0 && d2.y==0)  return trig_vis(p1,p2,p4);\r
+\r
+       x1 = long(mgl_min(mgl_min(p1.x,p2.x), mgl_min(p3.x,p4.x)));     // bounding box\r
+       y1 = long(mgl_min(mgl_min(p1.y,p2.y), mgl_min(p3.y,p4.y)));\r
+       x2 = long(mgl_max(mgl_max(p1.x,p2.x), mgl_max(p3.x,p4.x)));\r
+       y2 = long(mgl_max(mgl_max(p1.y,p2.y), mgl_max(p3.y,p4.y)));\r
+       x1=mgl_max(x1,0);       x2=mgl_min(x2,Width);\r
+       y1=mgl_max(y1,0);       y2=mgl_min(y2,Height);\r
+//     if(x1>x2 || y1>y2)      return;\r
+\r
+       const float dd = d1.x*d2.y-d1.y*d2.x;\r
+       const float dsx =-4*(d2.y*d3.x - d2.x*d3.y)*d1.y;\r
+       const float dsy = 4*(d2.y*d3.x - d2.x*d3.y)*d1.x;\r
+\r
+       const float x0 = p1.x, y0 = p1.y;\r
+       bool vis = false;\r
+       for(long j=y1;j<=y2;j++)        for(long i=x1;i<=x2;i++)\r
+       {\r
+               float xx = (i-x0), yy = (j-y0), s;\r
+               s = dsx*xx + dsy*yy + (dd+d3.y*xx-d3.x*yy)*(dd+d3.y*xx-d3.x*yy);\r
+               if(s>=0)\r
+               {\r
+                       s = sqrt(s);\r
+                       float qu = d3.x*yy - d3.y*xx + dd + s;\r
+                       float qv = d3.y*xx - d3.x*yy + dd + s;\r
+                       float u = 2.f*(d2.y*xx - d2.x*yy)/qu;\r
+                       float v = 2.f*(d1.x*yy - d1.y*xx)/qv;\r
+                       if(u*(1.f-u)<0.f || v*(1.f-v)<0.f)      // first root bad\r
+                       {\r
+                               qu = d3.x*yy - d3.y*xx + dd - s;\r
+                               qv = d3.y*xx - d3.x*yy + dd - s;\r
+//                                     u = v = -1.f;\r
+                               u = 2.f*(d2.y*xx - d2.x*yy)/qu; v = 2.f*(d1.x*yy - d1.y*xx)/qv;\r
+                               if(u*(1.f-u)<0.f || v*(1.f-v)<0.f)      continue;       // second root bad\r
+                       }\r
+                       float zz = p1.z+d1.z*u+d2.z*v+d3.z*(u*v);\r
+                       if(zz>=Z[3*(i+Width*(Height-1-j))]-2)   vis=true;\r
+               }\r
+       }\r
+       return vis;\r
+}\r
+//-----------------------------------------------------------------------------\r
+bool mglCanvas::trig_vis(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3) const\r
+{\r
+       unsigned char r[4];\r
+       long y1,x1,y2,x2;\r
+       const mglPnt d1(p2-p1), d2(p3-p1);\r
+\r
+       const float tmp = d2.x*d1.y - d1.x*d2.y;\r
+       if(fabs(tmp)<1e-5)      return false;           // points lies on the same line\r
+       const float dyv =-d1.x/tmp,     dxv = d1.y/tmp;\r
+       const float dyu = d2.x/tmp,     dxu =-d2.y/tmp;\r
+\r
+       x1 = long(mgl_min(p1.x<p2.x?p1.x:p2.x, p3.x));  // bounding box\r
+       y1 = long(mgl_min(p1.y<p2.y?p1.y:p2.y, p3.y));\r
+       x2 = long(mgl_max(p1.x>p2.x?p1.x:p2.x, p3.x));\r
+       y2 = long(mgl_max(p1.y>p2.y?p1.y:p2.y, p3.y));\r
+       x1=x1>0?x1:0;   x2=x2<Width?x2:Width;\r
+       y1=y1>0?y1:0;   y2=y2<Height?y2:Height;\r
+//     if(x1>x2 || y1>y2)      return;\r
+       // default normale\r
+       const float x0 = p1.x, y0 = p1.y;\r
+       bool vis=false;\r
+       // provide additional height to be well visible on the surfaces\r
+       for(long j=y1;j<=y2;j++)        for(long i=x1;i<=x2;i++)\r
+       {\r
+               float xx = (i-x0), yy = (j-y0);\r
+               float u = dxu*xx+dyu*yy, v = dxv*xx+dyv*yy;\r
+               if(u<0 || v<0 || u+v>1) continue;\r
+               float zz = p1.z+d1.z*u+d2.z*v;\r
+               if(zz>=Z[3*(i+Width*(Height-1-j))]-2)   vis=true;\r
+       }\r
+       return vis;\r
+}\r
+//-----------------------------------------------------------------------------\r
index 4226c3133bd5f44eaa0ed1fb38bf581d70e1f4aa..d3489c2bbbfe6897f852bf83e337fcf6f72af5f9 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * plot.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -17,6 +17,7 @@
  *   Free Software Foundation, Inc.,                                       *\r
  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *\r
  ***************************************************************************/\r
+#include <algorithm>\r
 #include "mgl2/plot.h"\r
 #include "mgl2/eval.h"\r
 #include "mgl2/data.h"\r
@@ -33,105 +34,101 @@ void MGL_EXPORT mgl_fplot(HMGL gr, const char *eqY, const char *pen, const char
        long n = (mgl_isnan(r) || r<=0) ? 100:long(r+0.5);\r
        long nm = gr->FaceNum?gr->FaceNum*n:10000, nd = gr->FaceNum?gr->FaceNum*10:1000;\r
 \r
-       mreal *x = (mreal *)malloc(n*sizeof(mreal));\r
-       mreal *y = (mreal *)malloc(n*sizeof(mreal));\r
+       mglDataS x, y;\r
+       x.dat.reserve(nm);      y.dat.reserve(nm);\r
+\r
        mglFormula *eq = new mglFormula(eqY);\r
-       mreal xs, ys, yr, ym=fabs(gr->Max.y - gr->Min.y)/nd;\r
        // initial data filling\r
+       x.clear();      y.clear();\r
        if(gr->Min.x>0 && gr->Max.x>100*gr->Min.x)\r
        {\r
                mreal d = log(2*gr->Max.x/gr->Min.x)/(n-1);\r
                for(long i=0;i<n;i++)\r
-               {       x[i]=2*gr->Max.x*exp(d*i)/(2*gr->Max.x/gr->Min.x+exp(d*i));     y[i]=eq->Calc(x[i]);    }\r
+               {       mreal xx = 2*gr->Max.x*exp(d*i)/(2*gr->Max.x/gr->Min.x+exp(d*i));\r
+                       x.dat.push_back(xx);    y.dat.push_back(eq->Calc(xx));  }\r
        }\r
        else if(gr->Max.x<0 && gr->Min.x<100*gr->Max.x)\r
        {\r
                mreal d = log(2*gr->Min.x/gr->Max.x)/(n-1);\r
                for(long i=0;i<n;i++)\r
-               {       x[i]=2*gr->Min.x*exp(d*i)/(2*gr->Min.x/gr->Max.x+exp(d*i));     y[i]=eq->Calc(x[i]);    }\r
+               {       mreal xx = 2*gr->Min.x*exp(d*i)/(2*gr->Min.x/gr->Max.x+exp(d*i));\r
+                       x.dat.push_back(xx);    y.dat.push_back(eq->Calc(xx));  }\r
        }\r
        else\r
        {\r
                mreal d = (gr->Max.x - gr->Min.x)/(n-1.);\r
                for(long i=0;i<n;i++)\r
-               {       x[i]=gr->Min.x + i*d;   y[i]=eq->Calc(x[i]);    }\r
+               {       mreal xx = gr->Min.x + i*d;\r
+                       x.dat.push_back(xx);    y.dat.push_back(eq->Calc(xx));  }\r
        }\r
 \r
-       for(long i=0;i<n-1 && n<nm;)\r
+       bool check=true;\r
+       mreal ym=fabs(gr->Max.y - gr->Min.y)/nd;\r
+       while(check && long(x.dat.size())<nm)\r
        {\r
-               if((i&0xfff)==0 && gr->NeedStop())\r
-               {       free(x);        free(y);        delete eq;      return; }\r
-               xs=(x[i]+x[i+1])/2;\r
-               ys=(y[i]+y[i+1])/2;     yr=eq->Calc(xs);\r
-               if(fabs(yr-ys)>ym)      // bad approximation here\r
+               if(gr->NeedStop())      {       delete eq;      return; }\r
+               check = false;\r
+               for(long i=1;i<long(x.size());i++)\r
                {\r
-                       x = (mreal *)realloc(x,(n+1)*sizeof(mreal));\r
-                       y = (mreal *)realloc(y,(n+1)*sizeof(mreal));\r
-                       memmove(x+i+2,x+i+1,(n-i-1)*sizeof(mreal));\r
-                       memmove(y+i+2,y+i+1,(n-i-1)*sizeof(mreal));\r
-                       x[i+1] = xs;    y[i+1] = yr;    n++;\r
+                       mreal xs=(x[i]+x[i-1])/2;\r
+                       mreal ys=(y[i]+y[i-1])/2, yr=eq->Calc(xs);\r
+                       if(fabs(yr-ys)>ym)      // bad approximation here\r
+                       {\r
+                               x.dat.insert(x.dat.begin()+i,xs);\r
+                               y.dat.insert(y.dat.begin()+i,yr);\r
+                               check = true;   i++;\r
+                       }\r
                }\r
-               else i++;\r
        }\r
-\r
-       delete eq;\r
-       mglData yy(y,n),xx(x,n);\r
-       free(x);        free(y);\r
-       mgl_plot_xy(gr,&xx,&yy,pen,0);\r
+       delete eq;      mgl_plot_xy(gr,&x,&y,pen,0);\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_fplot_xyz(HMGL gr, const char *eqX, const char *eqY, const char *eqZ, const char *pen, const char *opt)\r
 {\r
        mreal r = gr->SaveState(opt);\r
        long n = (mgl_isnan(r) || r<=0) ? 100:long(r+0.5);\r
+       long nm = gr->FaceNum?gr->FaceNum*n:10000, nd = gr->FaceNum?gr->FaceNum*10:1000;\r
 \r
-       mreal *x = (mreal *)malloc(n*sizeof(mreal));\r
-       mreal *y = (mreal *)malloc(n*sizeof(mreal));\r
-       mreal *z = (mreal *)malloc(n*sizeof(mreal));\r
-       mreal *t = (mreal *)malloc(n*sizeof(mreal));\r
+       mglDataS x, y, z, t;\r
+       x.dat.reserve(nm);      y.dat.reserve(nm);\r
+       z.dat.reserve(nm);      t.dat.reserve(nm);\r
        mglFormula *ex, *ey, *ez;\r
        ex = new mglFormula(eqX ? eqX : "0");\r
        ey = new mglFormula(eqY ? eqY : "0");\r
        ez = new mglFormula(eqZ ? eqZ : "0");\r
-       mreal ts, xs, ys, zs, xr, yr, zr, xm=fabs(gr->Max.x - gr->Min.x)/1000, ym=fabs(gr->Max.y - gr->Min.y)/1000, zm=fabs(gr->Max.z - gr->Min.z)/1000;\r
+       t.clear();      x.clear();      y.clear();      z.clear();\r
        for(long i=0;i<n;i++)   // initial data filling\r
        {\r
-               t[i] = i/(n-1.);\r
-               x[i] = ex->Calc(0,0,t[i]);\r
-               y[i] = ey->Calc(0,0,t[i]);\r
-               z[i] = ez->Calc(0,0,t[i]);\r
+               mreal tt = i/(n-1.);    t.push_back(tt);\r
+               x.push_back(ex->Calc(0,0,t[i]));\r
+               y.push_back(ey->Calc(0,0,t[i]));\r
+               z.push_back(ez->Calc(0,0,t[i]));\r
        }\r
 \r
-       for(long i=0;i<n-1 && n<10000;)\r
+       bool check=true;\r
+       mreal xm=fabs(gr->Max.x-gr->Min.x)/nd, ym=fabs(gr->Max.y-gr->Min.y)/nd, zm=fabs(gr->Max.z-gr->Min.z)/nd;\r
+       while(check && long(x.dat.size())<nm)\r
        {\r
-               if((i&0xfff)==0 && gr->NeedStop())\r
-               {\r
-                       free(x);        free(y);        free(z);        free(t);\r
-                       delete ex;      delete ey;      delete ez;      return;\r
-               }\r
-               ts=(t[i]+t[i+1])/2;\r
-               xs=(x[i]+x[i+1])/2;     xr=ex->Calc(0,0,ts);\r
-               ys=(y[i]+y[i+1])/2;     yr=ey->Calc(0,0,ts);\r
-               zs=(z[i]+z[i+1])/2;     zr=ez->Calc(0,0,ts);\r
-               if(fabs(xr-xs)>xm || fabs(yr-ys)>ym || fabs(zr-zs)>zm)  // bad approximation here\r
+               if(gr->NeedStop())      {       delete ex;      delete ey;      delete ez;      return; }\r
+               check = false;\r
+               for(long i=1;i<long(t.size());i++)\r
                {\r
-                       z = (mreal *)realloc(z,(n+1)*sizeof(mreal));\r
-                       t = (mreal *)realloc(t,(n+1)*sizeof(mreal));\r
-                       x = (mreal *)realloc(x,(n+1)*sizeof(mreal));\r
-                       y = (mreal *)realloc(y,(n+1)*sizeof(mreal));\r
-                       memmove(x+i+2,x+i+1,(n-i-1)*sizeof(mreal));\r
-                       memmove(y+i+2,y+i+1,(n-i-1)*sizeof(mreal));\r
-                       memmove(z+i+2,z+i+1,(n-i-1)*sizeof(mreal));\r
-                       memmove(t+i+2,t+i+1,(n-i-1)*sizeof(mreal));\r
-                       t[i+1]=ts;      x[i+1]=xr;      y[i+1]=yr;      z[i+1]=zr;      n++;\r
+                       mreal ts=(t[i]+t[i-1])/2;\r
+                       mreal xs=(x[i]+x[i-1])/2, xr=ex->Calc(0,0,ts);\r
+                       mreal ys=(y[i]+y[i-1])/2, yr=ey->Calc(0,0,ts);\r
+                       mreal zs=(z[i]+z[i-1])/2, zr=ez->Calc(0,0,ts);\r
+                       if(fabs(xr-xs)>xm || fabs(yr-ys)>ym || fabs(zr-zs)>zm)  // bad approximation here\r
+                       {\r
+                               t.dat.insert(t.dat.begin()+i,ts);\r
+                               x.dat.insert(x.dat.begin()+i,xr);\r
+                               y.dat.insert(y.dat.begin()+i,yr);\r
+                               z.dat.insert(z.dat.begin()+i,zr);\r
+                               check = true;   i++;\r
+                       }\r
                }\r
-               else i++;\r
        }\r
        delete ex;      delete ey;      delete ez;\r
-\r
-       mglData xx(x,n),yy(y,n),zz(z,n);\r
-       free(x);        free(y);        free(z);        free(t);\r
-       mgl_plot_xyz(gr,&xx,&yy,&zz,pen,0);\r
+       mgl_plot_xyz(gr,&x,&y,&z,pen,0);\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_fplot_(uintptr_t *gr, const char *fy, const char *stl, const char *opt, int ly, int ls, int lo)\r
@@ -167,7 +164,7 @@ void MGL_EXPORT mgl_radar(HMGL gr, HCDT a, const char *pen, const char *opt)
        {\r
                for(long i=0;i<n;i++)\r
                {\r
-                       register mreal v = a->v(i,j);\r
+                       mreal v = a->v(i,j);\r
                        x.a[i+(n+1)*j] = (r+v)*co[i];\r
                        y.a[i+(n+1)*j] = (r+v)*co[i+n];\r
                }\r
@@ -212,7 +209,8 @@ void MGL_EXPORT mgl_candle_xyv(HMGL gr, HCDT x, HCDT v1, HCDT v2, HCDT y1, HCDT
        if(!y1) {       y1 = new mglData(n);    d1=true;        ((mglData *)y1)->Fill(NAN,NAN); }\r
        if(!y2) {       y2 = new mglData(n);    d2=true;        ((mglData *)y2)->Fill(NAN,NAN); }\r
        if(y1->GetNx()!=n || y2->GetNx()!=n)\r
-       {       gr->SetWarn(mglWarnDim,"Candle");       return; }\r
+       {       if(d1)  delete y1;      if(d2)  delete y2;\r
+               gr->SetWarn(mglWarnDim,"Candle");       return; }\r
        static int cgid=1;      gr->StartGroup("Candle",cgid++);\r
        gr->SaveState(opt);     gr->SetPenPal(pen,&pal);        gr->Reserve(8*n);\r
        bool sh = mglchr(pen,'!');\r
@@ -221,7 +219,7 @@ void MGL_EXPORT mgl_candle_xyv(HMGL gr, HCDT x, HCDT v1, HCDT v2, HCDT y1, HCDT
        mreal dv=nx>n?1:0;\r
        if(mglchr(pen,'<'))     dv = 1;\r
        if(mglchr(pen,'^'))     dv = 0;\r
-       if(mglchr(pen,'>'))     dv = -1;\r
+       if(mglchr(pen,'>'))     dv =-1;\r
        mreal zm = gr->AdjustZMin();\r
        mreal c1,c2;    c2=c1=gr->NextColor(pal);\r
        bool col2 = (gr->GetNumPal(pal)==2 && !sh);\r
@@ -250,7 +248,8 @@ void MGL_EXPORT mgl_candle_xyv(HMGL gr, HCDT x, HCDT v1, HCDT v2, HCDT y1, HCDT
                gr->line_plot(n4,n2);   gr->line_plot(n4,n3);\r
                if(m1>m2 || (col2 && !wire))    gr->quad_plot(n1,n2,n3,n4);\r
        }\r
-       if(d1)  delete y1;      if(d2)  delete y2;\r
+       if(d1)  delete y1;\r
+       if(d2)  delete y2;\r
        gr->EndGroup();\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -289,6 +288,43 @@ void MGL_EXPORT mgl_candle_(uintptr_t *gr, uintptr_t *y, uintptr_t *y1, uintptr_
 //     Plot series\r
 //\r
 //-----------------------------------------------------------------------------\r
+struct mglPointA {     mglPoint p;     bool orig;      mglPointA(const mglPoint &pp, bool o) : p(pp), orig(o) {}       };\r
+std::vector<mglPointA> MGL_NO_EXPORT mgl_pnt_prepare(const mglPoint &p1, const mglPoint &p2, HCDT xx, HCDT yy, HCDT zz, HCDT cc)\r
+{\r
+       std::vector<mglPointA> out;\r
+       long n = xx->GetNx();\r
+       mglPoint p(xx->v(0),yy->v(0),zz->v(0),cc?cc->v(0):0);\r
+       if(p>p1 && p<p2)        out.push_back(mglPointA(p,true));\r
+       else    out.push_back(mglPointA(mglPoint(NAN),true));\r
+       for(long i=1;i<n;i++)\r
+       {\r
+               mglPoint q(xx->v(i),yy->v(i),zz->v(i),cc?cc->v(i):0);\r
+               mreal x1,x2,y1,y2,z1,z2,t;\r
+               x1=mgl_d(p1.x, p.x, q.x);       x2=mgl_d(p2.x, p.x, q.x);       if(x2<x1)       {       t=x1;   x1=x2;  x2=t;   }\r
+               y1=mgl_d(p1.y, p.y, q.y);       y2=mgl_d(p2.y, p.y, q.y);       if(y2<y1)       {       t=y1;   y1=y2;  y2=t;   }\r
+               z1=mgl_d(p1.z, p.z, q.z);       z2=mgl_d(p2.z, p.z, q.z);       if(z2<z1)       {       t=z1;   z1=z2;  z2=t;   }\r
+               mreal d1 = mgl_isnum(x1)?x1:0, d2 = mgl_isnum(x2)?x2:1;\r
+               if(y1>d1)       d1=y1;\r
+               if(y2<d2)       d2=y2;\r
+               if(z1>d1)       d1=z1;\r
+               if(z2<d2)       d2=z2;\r
+               if(d1>0 && d1<1)        out.push_back(mglPointA(p+d1*(q-p),false));\r
+               if(d2>0 && d2<1)        out.push_back(mglPointA(p+d2*(q-p),false));\r
+               if(d1<1 && d2>=1)       out.push_back(mglPointA(q,true));\r
+               else if(i==n-1) out.push_back(mglPointA(mglPoint(NAN),true));\r
+               p = q;\r
+       }\r
+       return out;\r
+}\r
+std::vector<mglPointA> MGL_NO_EXPORT mgl_pnt_copy(HCDT xx, HCDT yy, HCDT zz, HCDT cc)\r
+{\r
+       std::vector<mglPointA> out;\r
+       long n = xx->GetNx();\r
+       for(long i=0;i<n;i++)\r
+               out.push_back(mglPointA(mglPoint(xx->v(i),yy->v(i),zz->v(i),cc?cc->v(i):0),true));\r
+       return out;\r
+}\r
+//-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_mark(HMGL gr, double x, double y, double z,const char *mark);\r
 void MGL_EXPORT mgl_plot_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, const char *opt)\r
 {\r
@@ -313,48 +349,56 @@ void MGL_EXPORT mgl_plot_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c
        gr->SaveState(opt);\r
        long m = x->GetNy() > y->GetNy() ? x->GetNy() : y->GetNy();     m = z->GetNy() > m ? z->GetNy() : m;\r
        char mk=gr->SetPenPal(pen,&pal);        gr->Reserve(2*n*m);\r
-       mglPoint p1,nn,p2,pt;\r
-       long n1=-1,n2=-1,n3=-1;\r
-       bool sh = mglchr(pen,'!');\r
+       bool sh = mglchr(pen,'!'), orig = !mglchr(pen,'a'), appr = mglchr(pen,'~');\r
 \r
+       int d = gr->MeshNum>0 ? gr->MeshNum+1 : n, dx = n>d?n/d:1;\r
        for(long j=0;j<m;j++)\r
        {\r
                if(gr->NeedStop())      break;\r
                long mx = j<x->GetNy() ? j:0, my = j<y->GetNy() ? j:0, mz = j<z->GetNy() ? j:0;\r
                gr->NextColor(pal);\r
-               bool t1 = false, t2 = false;\r
-               for(long i=0;i<n;i++)\r
+               mglDataR xx(x,mx), yy(y,my), zz(z,mz);\r
+               const std::vector<mglPointA> &pp = orig ? mgl_pnt_copy(&xx, &yy, &zz, 0) :\r
+                       mgl_pnt_prepare(gr->Min, gr->Max, &xx, &yy, &zz, 0);\r
+               size_t num = pp.size();\r
+               long *nn = new long[num];\r
+               for(size_t i=0;i<num;i++)\r
+               {       mreal c = sh ? gr->NextColor(pal,i):gr->CDef;   nn[i] = gr->AddPnt(pp[i].p, c); }\r
+               \r
+               if(mk)  for(size_t i=0;i<num;i+=dx)\r
+                       if(nn[i]>=0 && pp[i].orig)      gr->mark_plot(nn[i], mk);\r
+               if(num>1)\r
                {\r
-                       if(i>0) {       n2=n1;  p2 = p1;        t2=t1;  }\r
-                       p1.Set(x->v(i,mx), y->v(i,my), z->v(i,mz));\r
-                       mreal c = sh ? gr->NextColor(pal,i):gr->CDef;\r
-                       n1 = gr->AddPnt(p1,c);  t1 = n1>=0;\r
-                       if(mk && t1)    gr->mark_plot(n1,mk);\r
-                       if(t1 && t2)\r
-                       {\r
-                               gr->line_plot(n1,n2);\r
-                               if(i==1)        gr->arrow_plot(n2,n1,gr->Arrow1);\r
-                               if(i==n-1)      gr->arrow_plot(n1,n2,gr->Arrow2);\r
-                       }\r
-\r
-                       if(i>0 && ((t1 && !t2) || (t2 && !t1))) // do smoothing\r
+                       if(nn[0]>=0 && nn[1]>=0)\r
+                               gr->arrow_plot(nn[0],nn[1],gr->Arrow1);\r
+                       if(nn[num-1]>=0 && nn[num-2]>=0)\r
+                               gr->arrow_plot(nn[num-1],nn[num-2],gr->Arrow2);\r
+               }\r
+               for(size_t i=0;i+1<num;i++)\r
+               {\r
+                       if(nn[i]<0 || nn[i+1]<0)        continue;\r
+                       if(!appr)       gr->line_plot(nn[i+1],nn[i]);\r
+                       else\r
                        {\r
-                               mreal i1=0, i2=1, ii;\r
-                               mglPoint q(NAN),p;\r
-                               do {\r
-                                       ii = (i1+i2)/2;\r
-                                       pt.x = p1.x*ii+p2.x*(1-ii);\r
-                                       pt.y = p1.y*ii+p2.y*(1-ii);\r
-                                       pt.z = p1.z*ii+p2.z*(1-ii);     p=pt;\r
-                                       bool t3 = gr->ScalePoint(gr->GetB(),p,q,false);\r
-                                       if((t1 && t3) || (t2 && !t3))   i2 = ii;\r
-                                       else    i1 = ii;\r
-                               } while(fabs(i2-i1)>1e-3);\r
-                               n3 = gr->AddPnt(pt,c,q,-1,2);\r
-                               if(t2)  gr->line_plot(n3,n2);\r
-                               else    gr->line_plot(n1,n3);\r
+                               size_t k=i+2;\r
+                               while(k<num)\r
+                               {\r
+                                       const mglPoint p1(gr->GetPntP(i)), p2(gr->GetPntP(k));\r
+                                       mreal dy=p2.x-p1.x, dx=p1.y-p2.y, dd=2*(dx*dx+dy*dy);\r
+                                       bool ops=false;\r
+                                       for(size_t ii=i+1;ii<k;ii++)\r
+                                       {\r
+                                               const mglPoint p(gr->GetPntP(ii));\r
+                                               mreal d = dx*p.x+dy*p.y;\r
+                                               if(d*d>dd)      ops = true;\r
+                                       }\r
+                                       if(ops) break;\r
+                                       k++;\r
+                               }\r
+                               k--;    gr->line_plot(nn[k],nn[i]);     i = k-1;\r
                        }\r
                }\r
+               delete []nn;\r
        }\r
        gr->EndGroup();\r
 }\r
@@ -368,7 +412,7 @@ void MGL_EXPORT mgl_plot_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_plot(HMGL gr, HCDT y, const char *pen, const char *opt)\r
 {\r
-       register long n=y->GetNx();\r
+       long n=y->GetNx();\r
        if(n<2) {       gr->SetWarn(mglWarnLow,"Plot"); return; }\r
        gr->SaveState(opt);\r
        mglDataV x(n), z(n);\r
@@ -405,48 +449,56 @@ void MGL_EXPORT mgl_tens_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, const char
        m = x->GetNy() > y->GetNy() ? x->GetNy() : y->GetNy();  m = z->GetNy() > m ? z->GetNy() : m;\r
        char mk=gr->SetPenPal(pen, &pal);       gr->Reserve(2*n*m);\r
        long ss=gr->AddTexture(pen);\r
-       mglPoint p1,p2,pt,nn;\r
-       long n1=-1,n2=-1,n3=-1;\r
+       bool orig = !mglchr(pen,'a'), appr = mglchr(pen,'~');\r
 \r
+       int d = gr->MeshNum>0 ? gr->MeshNum+1 : n, dx = n>d?n/d:1;\r
        for(long j=0;j<m;j++)\r
        {\r
                if(gr->NeedStop())      break;\r
                long mx = j<x->GetNy() ? j:0, my = j<y->GetNy() ? j:0;\r
                long mz = j<z->GetNy() ? j:0, mc = j<c->GetNy() ? j:0;\r
-               register long i;\r
-               bool t1 = false, t2 = false;\r
-               for(i=0;i<n;i++)\r
+               mglDataR xx(x,mx), yy(y,my), zz(z,mz), cc(c,mc);\r
+               const std::vector<mglPointA> &pp = orig ? mgl_pnt_copy(&xx, &yy, &zz, &cc) :\r
+                       mgl_pnt_prepare(gr->Min, gr->Max, &xx, &yy, &zz, &cc);\r
+\r
+               size_t num = pp.size();\r
+               long *nn = new long[num];\r
+               for(size_t i=0;i<num;i++)       nn[i] = gr->AddPnt(pp[i].p, gr->GetC(ss,pp[i].p.c));\r
+               \r
+               if(mk)  for(size_t i=0;i<num;i+=dx)\r
+                       if(nn[i]>=0 && pp[i].orig)      gr->mark_plot(nn[i], mk);\r
+               if(num>1)\r
                {\r
-                       if(i>0) {       n2=n1;  p2=p1;  t2=t1;  }\r
-                       p1.Set(x->v(i,mx), y->v(i,my), z->v(i,mz), c->v(i,mc));\r
-                       n1 = gr->AddPnt(p1,gr->GetC(ss,p1.c));  t1 = n1>=0;\r
-                       if(mk && t1)    gr->mark_plot(n1,mk);\r
-                       if(t1 && t2)\r
-                       {\r
-                               gr->line_plot(n1,n2);\r
-                               if(i==1)        gr->arrow_plot(n2,n1,gr->Arrow1);\r
-                               if(i==n-1)      gr->arrow_plot(n1,n2,gr->Arrow2);\r
-                       }\r
-\r
-                       if(i>0 && ((t1 && !t2) || (t2 && !t1))) // do smoothing\r
+                       if(nn[0]>=0 && nn[1]>=0)\r
+                               gr->arrow_plot(nn[0],nn[1],gr->Arrow1);\r
+                       if(nn[num-1]>=0 && nn[num-2]>=0)\r
+                               gr->arrow_plot(nn[num-1],nn[num-2],gr->Arrow2);\r
+               }\r
+               for(size_t i=0;i+1<num;i++)\r
+               {\r
+                       if(nn[i]<0 || nn[i+1]<0)        continue;\r
+                       if(!appr)       gr->line_plot(nn[i+1],nn[i]);\r
+                       else\r
                        {\r
-                               mreal i1=0, i2=1, ii;\r
-                               mglPoint q(NAN),p;\r
-                               do {\r
-                                       ii = (i1+i2)/2;\r
-                                       pt.x = p1.x*ii+p2.x*(1-ii);\r
-                                       pt.y = p1.y*ii+p2.y*(1-ii);\r
-                                       pt.z = p1.z*ii+p2.z*(1-ii);     p=pt;\r
-                                       pt.c = p1.c*ii+p2.c*(1-ii);\r
-                                       bool t3 = gr->ScalePoint(gr->GetB(),p,q,false);\r
-                                       if((t1 && t3) || (t2 && !t3))   i2 = ii;\r
-                                       else    i1 = ii;\r
-                               } while(fabs(i2-i1)>1e-3);\r
-                               n3 = gr->AddPnt(pt,gr->GetC(ss,pt.c),q,-1,2);\r
-                               if(t2)  gr->line_plot(n3,n2);\r
-                               else    gr->line_plot(n1,n3);\r
+                               size_t k=i+2;\r
+                               while(k<num)\r
+                               {\r
+                                       const mglPoint p1(gr->GetPntP(i)), p2(gr->GetPntP(k));\r
+                                       mreal dy=p2.x-p1.x, dx=p1.y-p2.y, dd=2*(dx*dx+dy*dy);\r
+                                       bool ops=false;\r
+                                       for(size_t ii=i+1;ii<k;ii++)\r
+                                       {\r
+                                               const mglPoint p(gr->GetPntP(ii));\r
+                                               mreal d = dx*p.x+dy*p.y;\r
+                                               if(d*d>dd)      ops = true;\r
+                                       }\r
+                                       if(ops) break;\r
+                                       k++;\r
+                               }\r
+                               k--;    gr->line_plot(nn[k],nn[i]);     i = k-1;\r
                        }\r
                }\r
+               delete []nn;\r
        }\r
        gr->EndGroup();\r
 }\r
@@ -460,7 +512,7 @@ void MGL_EXPORT mgl_tens_xy(HMGL gr, HCDT x, HCDT y, HCDT c, const char *pen, co
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_tens(HMGL gr, HCDT y, HCDT c, const char *pen, const char *opt)\r
 {\r
-       register long n=y->GetNx();\r
+       long n=y->GetNx();\r
        if(n<2) {       gr->SetWarn(mglWarnLow,"Tens"); return; }\r
        gr->SaveState(opt);\r
        mglDataV x(n), z(n);\r
@@ -495,31 +547,32 @@ void MGL_EXPORT mgl_area_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c
        gr->SaveState(opt);\r
        static int cgid=1;      gr->StartGroup("Area3",cgid++);\r
        m = x->GetNy() > y->GetNy() ? x->GetNy() : y->GetNy();  m = z->GetNy() > m ? z->GetNy() : m;\r
-       bool sh = mglchr(pen,'!');\r
-       bool wire = mglchr(pen,'#');\r
+       bool sh = mglchr(pen,'!'), wire = mglchr(pen,'#'), orig = !mglchr(pen,'a');\r
 \r
        mreal z0=gr->GetOrgZ('x');\r
-       mreal c1,c2;\r
-       mglPoint p1,p2,p3,p4,nn;\r
        gr->SetPenPal(pen,&pal);        gr->Reserve(2*n*m);\r
        for(long j=0;j<m;j++)\r
        {\r
                if(gr->NeedStop())      break;\r
-               c2=c1=gr->NextColor(pal);\r
+               mreal c1=gr->NextColor(pal), c2=c1;\r
                if(gr->GetNumPal(pal)==2*m && !sh)      c2 = gr->NextColor(pal);\r
                long mx = j<x->GetNy() ? j:0, my = j<y->GetNy() ? j:0, mz = j<z->GetNy() ? j:0;\r
 \r
-               nn.Set(-y->dvx(0,my),x->dvx(0,mx));\r
-               mglPoint p(x->v(0,mx),y->v(0,my),z->v(0,mz));\r
-               long n1 = gr->AddPnt(p,c1,nn,-1,27);    p.z = z0;\r
-               long n2 = gr->AddPnt(p,c2,nn,-1,27);\r
-               for(long i=1;i<n;i++)\r
+               mglDataR xx(x,mx), yy(y,my), zz(z,mz);\r
+               std::vector<mglPointA> pp = orig ? mgl_pnt_copy(&xx, &yy, &zz, 0) :\r
+                       mgl_pnt_prepare(gr->Min, gr->Max, &xx, &yy, &zz, 0);\r
+               size_t np = pp.size();\r
+               long n1=-1, n2=-1;\r
+               mglPoint nn(pp[0].p.y-pp[1].p.y, pp[1].p.x-pp[0].p.x);\r
+               for(size_t i=0;i<np;i++)\r
                {\r
                        long n3=n1, n4=n2;\r
-                       nn.Set(-y->dvx(i,my),x->dvx(i,mx));\r
-                       p.Set(x->v(i,mx),y->v(i,my),z->v(i,mz));\r
                        if(sh)  c2=c1=gr->NextColor(pal,i);\r
-                       n1 = gr->AddPnt(p,c1,nn,-1,27); p.z = z0;       n2 = gr->AddPnt(p,c2,nn,-1,27);\r
+                       if(i>0 && i<np-1)       {       nn.x=(pp[i-1].p.y-pp[i+1].p.y)/2;       nn.y=(pp[i+1].p.x-pp[i-1].p.x)/2;       }\r
+                       else if(i==np-1)        {       nn.x=pp[np-2].p.y-pp[np-1].p.y; nn.y=pp[np-1].p.x-pp[np-2].p.x; }\r
+                       n1 = gr->AddPnt(pp[i].p, c1,nn,-1,27);  pp[i].p.z = z0;\r
+                       n2 = gr->AddPnt(pp[i].p, c2,nn,-1,27);\r
+                       if(gr->SamePnt(n1,n3) || gr->SamePnt(n2,n4))    continue;\r
                        if(wire)\r
                        {\r
                                gr->line_plot(n1,n2);   gr->line_plot(n3,n4);\r
@@ -540,30 +593,31 @@ void MGL_EXPORT mgl_area_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char
        static int cgid=1;      gr->StartGroup("Curve",cgid++);\r
        mreal zm = gr->AdjustZMin();\r
        mreal y0=gr->GetOrgY('x');\r
-       mreal c1,c2;\r
        mglPoint nn(0,0,1);\r
-       bool sh = mglchr(pen,'!');\r
-       bool wire = mglchr(pen,'#');\r
+       bool sh = mglchr(pen,'!'), wire = mglchr(pen,'#'), orig = !mglchr(pen,'a');\r
 \r
        gr->SetPenPal(pen,&pal);        gr->Reserve(2*n*m);\r
-//     long s=gr->AddTexture(pen,1);\r
        for(long j=0;j<m;j++)\r
        {\r
                if(gr->NeedStop())      break;\r
-               c2=c1=gr->NextColor(pal);\r
+               mreal c1=gr->NextColor(pal), c2=c1;\r
                if(gr->GetNumPal(pal)==2*m && !sh)      c2=gr->NextColor(pal);\r
                long mx = j<x->GetNy() ? j:0, my = j<y->GetNy() ? j:0;\r
                mreal z0 = zm + (m-1-j)*(gr->Max.z-zm)/m;\r
 \r
-               mglPoint p(x->v(0,mx),y->v(0,my),z0);\r
-               long n1 = gr->AddPnt(p,c1,nn,-1,27);    p.y = y0;\r
-               long n2 = gr->AddPnt(p,c2,nn,-1,27);\r
-               for(long i=1;i<n;i++)\r
+               mglDataR xx(x,mx), yy(y,my);    mglDataV zz(n,1,1,z0);\r
+               std::vector<mglPointA> pp = orig ? mgl_pnt_copy(&xx, &yy, &zz, 0) :\r
+                       mgl_pnt_prepare(gr->Min, gr->Max, &xx, &yy, &zz, 0);\r
+               size_t np = pp.size();\r
+               long n1=-1, n2=-1;\r
+               for(size_t i=0;i<np;i++)\r
                {\r
                        long n3=n1, n4=n2;\r
-                       p.Set(x->v(i,mx),y->v(i,my),z0);\r
                        if(sh)  c2=c1=gr->NextColor(pal,i);\r
-                       n1 = gr->AddPnt(p,c1,nn,-1,27); p.y = y0;       n2 = gr->AddPnt(p,c2,nn,-1,27);\r
+                       n1 = gr->AddPnt(pp[i].p, c1,nn,-1,27);  pp[i].p.y = y0;\r
+                       n2 = gr->AddPnt(pp[i].p, c2,nn,-1,27);\r
+                       if(n1<0 || n2<0)        {       n1=n2=-1;       continue;       }\r
+                       if(gr->SamePnt(n1,n3) || gr->SamePnt(n2,n4))    continue;\r
                        if(wire)\r
                        {\r
                                gr->line_plot(n1,n2);   gr->line_plot(n3,n4);\r
@@ -601,12 +655,70 @@ void MGL_EXPORT mgl_area_(uintptr_t *gr, uintptr_t *y, const char *pen, const ch
 //     Region series\r
 //\r
 //-----------------------------------------------------------------------------\r
+struct mglPointB {     mglPoint p1, p2;        bool orig;\r
+       mglPointB(const mglPoint &pp1, const mglPoint &pp2, bool o) : p1(pp1), p2(pp2), orig(o) {}      };\r
+std::vector<mglPointB> MGL_NO_EXPORT mgl_pnt_prepare(const mglPoint &a1, const mglPoint &a2, HCDT xx1, HCDT yy1, HCDT zz1, HCDT xx2, HCDT yy2, HCDT zz2)\r
+{\r
+       std::vector<mglPointB> out;\r
+       long n = xx1->GetNx();\r
+       mglPoint p1(xx1->v(0),yy1->v(0),zz1->v(0)), p2(xx2->v(0),yy2->v(0),zz2->v(0));\r
+       if(p1>a1 && p1<a2 && p2>a1 && p2<a2)    out.push_back(mglPointB(p1,p2,true));\r
+       else    out.push_back(mglPointB(mglPoint(NAN),mglPoint(NAN),true));\r
+       for(long i=1;i<n;i++)\r
+       {\r
+               mglPoint q1(xx1->v(i),yy1->v(i),zz1->v(i)), q2(xx2->v(i),yy2->v(i),zz2->v(i));\r
+               mreal x1,x2,y1,y2,z1,z2,t;\r
+               x1=mgl_d(a1.x, p1.x, q1.x);     x2=mgl_d(a2.x, p1.x, q1.x);     if(x2<x1)       {       t=x1;   x1=x2;  x2=t;   }\r
+               y1=mgl_d(a1.y, p1.y, q1.y);     y2=mgl_d(a2.y, p1.y, q1.y);     if(y2<y1)       {       t=y1;   y1=y2;  y2=t;   }\r
+               z1=mgl_d(a1.z, p1.z, q1.z);     z2=mgl_d(a2.z, p1.z, q1.z);     if(z2<z1)       {       t=z1;   z1=z2;  z2=t;   }\r
+               mreal d11 = mgl_isnum(x1)?x1:0, d12 = mgl_isnum(x2)?x2:1;\r
+               if(y1>d11)      d11=y1;\r
+               if(y2<d12)      d12=y2;\r
+               if(z1>d11)      d11=z1;\r
+               if(z2<d12)      d12=z2;\r
+               x1=mgl_d(a1.x, p2.x, q2.x);     x2=mgl_d(a2.x, p2.x, q2.x);     if(x2<x1)       {       t=x1;   x1=x2;  x2=t;   }\r
+               y1=mgl_d(a1.y, p2.y, q2.y);     y2=mgl_d(a2.y, p2.y, q2.y);     if(y2<y1)       {       t=y1;   y1=y2;  y2=t;   }\r
+               z1=mgl_d(a1.z, p2.z, q2.z);     z2=mgl_d(a2.z, p2.z, q2.z);     if(z2<z1)       {       t=z1;   z1=z2;  z2=t;   }\r
+               mreal d21 = mgl_isnum(x1)?x1:0, d22 = mgl_isnum(x2)?x2:1;\r
+               if(y1>d21)      d21=y1;\r
+               if(y2<d22)      d22=y2;\r
+               if(z1>d21)      d21=z1;\r
+               if(z2<d22)      d22=z2;\r
+               \r
+               std::vector<mreal> dd;\r
+               if(d11>0 && d11<1)      dd.push_back(d11);\r
+               if(d21>0 && d21<1)      dd.push_back(d21);\r
+               if(d12>0 && d12<1)      dd.push_back(d12);\r
+               if(d22>0 && d22<1)      dd.push_back(d22);\r
+               // now add all intersections to be sure\r
+               x1=mgl_d(0, p2.x-p1.x, q2.x-q1.x);      if(x1>0 && x1<1)        dd.push_back(x1);\r
+               y1=mgl_d(0, p2.y-p1.y, q2.y-q1.y);      if(y1>0 && y1<1)        dd.push_back(y1);\r
+               z1=mgl_d(0, p2.z-p1.z, q2.z-q1.z);      if(z1>0 && z1<1)        dd.push_back(z1);\r
+               std::sort(dd.begin(),dd.end());\r
+               for(size_t j=0;j<dd.size();j++)\r
+                       out.push_back(mglPointB(p1+dd[j]*(q1-p1), p2+dd[j]*(q2-p2), false));\r
+               if((d11<1 && d12>=1) || (d21<1 && d22>=1))      out.push_back(mglPointB(q1,q2,true));\r
+               else if(i==n-1) out.push_back(mglPointB(mglPoint(NAN),mglPoint(NAN),true));\r
+               p1 = q1;        p2 = q2;\r
+       }\r
+       return out;\r
+}\r
+std::vector<mglPointB> MGL_NO_EXPORT mgl_pnt_copy(HCDT xx1, HCDT yy1, HCDT zz1, HCDT xx2, HCDT yy2, HCDT zz2)\r
+{\r
+       std::vector<mglPointB> out;\r
+       long n = xx1->GetNx();\r
+       for(long i=0;i<n;i++)\r
+               out.push_back(mglPointB(mglPoint(xx1->v(i),yy1->v(i),zz1->v(i)), mglPoint(xx2->v(i),yy2->v(i),zz2->v(i)), true));\r
+       return out;\r
+}\r
+//-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_region_3d(HMGL gr, HCDT x1, HCDT y1, HCDT z1, HCDT x2, HCDT y2, HCDT z2, const char *pen, const char *opt)\r
 {\r
        long n=y1->GetNx(), m, pal;\r
        if(mgl_check_dim1(gr,x1,y1,z1,0,"Region"))      return;\r
        if(mgl_check_dim1(gr,x1,x2,y2,z2,"Region"))     return;\r
-       m = x1->GetNy() > y1->GetNy() ? x1->GetNy() : y1->GetNy();      m = z1->GetNy() > m ? z1->GetNy() : m;\r
+       m = x1->GetNy() > y1->GetNy() ? x1->GetNy() : y1->GetNy();\r
+       m = (z1 && z1->GetNy() > m) ? z1->GetNy() : m;\r
        bool zhave = z1 && z2;\r
        if(x1->GetNy()!=x2->GetNy() || y1->GetNy()!=y2->GetNy())\r
        {       gr->SetWarn(mglWarnDim,"Region");       return; }\r
@@ -619,7 +731,7 @@ void MGL_EXPORT mgl_region_3d(HMGL gr, HCDT x1, HCDT y1, HCDT z1, HCDT x2, HCDT
        mglPoint nn(0,0,1);\r
        mreal zm = gr->AdjustZMin();\r
 //     bool inside = (mglchr(pen,'i'));        // NOTE: check if 'i' is free (used here for inside flag)\r
-       bool sh = mglchr(pen,'!');\r
+       bool sh = mglchr(pen,'!'), wire = mglchr(pen,'#'), orig = !mglchr(pen,'a');\r
 \r
        gr->SetPenPal(pen,&pal);        gr->Reserve(2*n*m);\r
        for(long j=0;j<m;j++)\r
@@ -631,15 +743,37 @@ void MGL_EXPORT mgl_region_3d(HMGL gr, HCDT x1, HCDT y1, HCDT z1, HCDT x2, HCDT
                long mz = (zhave && j<z1->GetNy()) ? j:0;\r
                mreal z0 = zm + (m-1-j)*(gr->Max.z-zm)/m;\r
 \r
-               long n1 = gr->AddPnt(mglPoint(x1->v(0,mx),y1->v(0,my),zhave?z1->v(0,mz):z0),c1,nn,-1,27);\r
-               long n2 = gr->AddPnt(mglPoint(x2->v(0,mx),y2->v(0,my),zhave?z2->v(0,mz):z0),c2,nn,-1,27);\r
-               for(long i=1;i<n;i++)\r
+               mglDataR xx1(x1,mx), yy1(y1,my), xx2(x2,mx), yy2(y2,my);\r
+               mglDataV zz0(n,1,1,z0);\r
+               std::vector<mglPointB> pp;\r
+               if(zhave)\r
+               {\r
+                       mglDataR zz1(z1,mz), zz2(z2,mz);\r
+                       pp = orig ? mgl_pnt_copy(&xx1, &yy1, &zz1, &xx2, &yy2, &zz2) :\r
+                               mgl_pnt_prepare(gr->Min, gr->Max, &xx1, &yy1, &zz1, &xx2, &yy2, &zz2);\r
+               }\r
+               else\r
+               {\r
+                       pp = orig ? mgl_pnt_copy(&xx1, &yy1, &zz0, &xx2, &yy2, &zz0) :\r
+                               mgl_pnt_prepare(gr->Min, gr->Max, &xx1, &yy1, &zz0, &xx2, &yy2, &zz0);\r
+               }\r
+\r
+               long n1=-1, n2=-1;\r
+               size_t np = pp.size();\r
+               for(size_t i=0;i<np;i++)\r
                {\r
                        long n3=n1, n4=n2;\r
                        if(sh)  c2=c1=gr->NextColor(pal,i);\r
-                       n1 = gr->AddPnt(mglPoint(x1->v(i,mx),y1->v(i,my),zhave?z1->v(i,mz):z0),c1,nn,-1,27);\r
-                       n2 = gr->AddPnt(mglPoint(x2->v(i,mx),y2->v(i,my),zhave?z2->v(i,mz):z0),c2,nn,-1,27);\r
-                       gr->quad_plot(n1,n2,n3,n4);\r
+                       n1 = gr->AddPnt(pp[i].p1, c1,nn,-1,27);\r
+                       n2 = gr->AddPnt(pp[i].p2, c2,nn,-1,27);\r
+                       if(n1<0 || n2<0)        {       n1=n2=-1;       continue;       }\r
+                       if(gr->SamePnt(n1,n3) || gr->SamePnt(n2,n4))    continue;\r
+                       if(wire)\r
+                       {\r
+                               gr->line_plot(n1,n2);   gr->line_plot(n3,n4);\r
+                               gr->line_plot(n1,n3);   gr->line_plot(n4,n2);\r
+                       }\r
+                       else    gr->quad_plot(n1,n2,n3,n4);\r
                }\r
        }\r
        gr->EndGroup();\r
@@ -656,11 +790,10 @@ void MGL_EXPORT mgl_region_xy(HMGL gr, HCDT x, HCDT y1, HCDT y2, const char *pen
        mreal c1,c2;\r
        mglPoint nn(0,0,1);\r
        mreal zm = gr->AdjustZMin();\r
-       bool inside = (mglchr(pen,'i'));        // NOTE: check if 'i' is free (used here for inside flag)\r
-       bool sh = mglchr(pen,'!');\r
+       bool inside = mglchr(pen,'i');  // NOTE: check if 'i' is free (used here for inside flag)\r
+       bool sh = mglchr(pen,'!'), wire = mglchr(pen,'#'), orig = !mglchr(pen,'a');\r
 \r
        gr->SetPenPal(pen,&pal);        gr->Reserve(2*n*m);\r
-//     long s=gr->AddTexture(pen,1);\r
        for(long j=0;j<m;j++)\r
        {\r
                if(gr->NeedStop())      break;\r
@@ -669,18 +802,31 @@ void MGL_EXPORT mgl_region_xy(HMGL gr, HCDT x, HCDT y1, HCDT y2, const char *pen
                long mx = j<x->GetNy() ? j:0;\r
                mreal z0 = zm + (m-1-j)*(gr->Max.z-zm)/m;\r
 \r
-               mreal f1 = y1->v(0,j), f2 = y2->v(0,j), xx = x->v(0,mx);\r
-               long n1 = gr->AddPnt(mglPoint(xx,f1,z0),c1,nn,-1,27);\r
-               long n2 = gr->AddPnt(mglPoint(xx,f2,z0),c2,nn,-1,27);\r
-               for(long i=1;i<n;i++)\r
+               mglDataR xx(x,mx), yy1(y1,j), yy2(y2,j);\r
+               mglDataV zz0(n,1,1,z0);\r
+               std::vector<mglPointB> pp = orig ? mgl_pnt_copy(&xx, &yy1, &zz0, &xx, &yy2, &zz0) :\r
+                       mgl_pnt_prepare(gr->Min, gr->Max, &xx, &yy1, &zz0, &xx, &yy2, &zz0);\r
+\r
+               mreal f1=0, f2=0;\r
+               long n1=-1, n2=-1;\r
+               size_t np = pp.size();\r
+               for(size_t i=0;i<np;i++)\r
                {\r
                        long n3=n1, n4=n2;\r
                        mreal f3=f1, f4=f2;\r
-                       f1 = y1->v(i,j);        f2 = y2->v(i,j);        xx = x->v(i,mx);\r
+                       f1 = pp[i].p1.y;        f2 = pp[i].p2.y;\r
                        if(sh)  c2=c1=gr->NextColor(pal,i);\r
-                       n1 = gr->AddPnt(mglPoint(xx,f1,z0),c1,nn,-1,27);\r
-                       n2 = gr->AddPnt(mglPoint(xx,f2,z0),c2,nn,-1,27);\r
-                       if(!inside || (f2>f1 && f4>f3)) gr->quad_plot(n1,n2,n3,n4);\r
+                       n1 = gr->AddPnt(pp[i].p1, c1,nn,-1,27);\r
+                       n2 = gr->AddPnt(pp[i].p2, c2,nn,-1,27);\r
+                       if(n1<0 || n2<0)        {       n1=n2=-1;       continue;       }\r
+                       if(inside && (f2<f1 || f4<f3))  continue;\r
+                       if(gr->SamePnt(n1,n3) || gr->SamePnt(n2,n4))    continue;\r
+                       if(wire)\r
+                       {\r
+                               gr->line_plot(n1,n2);   gr->line_plot(n3,n4);\r
+                               gr->line_plot(n1,n3);   gr->line_plot(n4,n2);\r
+                       }\r
+                       else    gr->quad_plot(n1,n2,n3,n4);\r
                }\r
        }\r
        gr->EndGroup();\r
@@ -723,7 +869,7 @@ void MGL_EXPORT mgl_step_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c
        bool sh = mglchr(pen,'!');\r
 \r
        char mk=gr->SetPenPal(pen,&pal);        gr->Reserve(2*n*m);\r
-       mglPoint p;\r
+       int d = gr->MeshNum>0 ? gr->MeshNum+1 : n, dx = n>d?n/d:1;\r
        for(long j=0;j<m;j++)\r
        {\r
                if(gr->NeedStop())      break;\r
@@ -734,14 +880,14 @@ void MGL_EXPORT mgl_step_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c
                for(long i=1;i<n;i++)\r
                {\r
                        long n2 = n1;   // horizontal\r
-                       p.Set(x->v(i,mx), y->v(i,my), z->v(i-1,mz));\r
+                       mglPoint p(x->v(i,mx), y->v(i,my), z->v(i-1,mz));\r
                        mreal c = sh ? gr->NextColor(pal,i):gr->CDef;\r
                        n1 = gr->AddPnt(p,c);   gr->line_plot(n1,n2);\r
                        if(i==1)        gr->arrow_plot(n2,n1,gr->Arrow1);\r
 \r
                        n2 = n1;        // vertical\r
                        p.z = z->v(i,mz);       n1 = gr->AddPnt(p,c);\r
-                       if(mk)  gr->mark_plot(n1,mk);\r
+                       if(mk && i%dx==0)       gr->mark_plot(n1,mk);\r
                        gr->line_plot(n1,n2);\r
                        if(i==n-1)      gr->arrow_plot(n1,n2,gr->Arrow2);\r
                }\r
@@ -752,36 +898,49 @@ void MGL_EXPORT mgl_step_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c
 void MGL_EXPORT mgl_step_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char *opt)\r
 {\r
        long m,n=y->GetNx(), pal;\r
-       if(mgl_check_dim1(gr,x,y,0,0,"Step"))   return;\r
+       if(mgl_check_dim1(gr,x,y,0,0,"Step",true))      return;\r
 \r
        gr->SaveState(opt);\r
        static int cgid=1;      gr->StartGroup("Step",cgid++);\r
        m = x->GetNy() > y->GetNy() ? x->GetNy() : y->GetNy();\r
        bool sh = mglchr(pen,'!');\r
+       bool same = x->GetNx()==n;\r
 \r
        mreal zVal =gr->AdjustZMin();\r
        char mk=gr->SetPenPal(pen,&pal);        gr->Reserve(2*n*m);\r
-       mglPoint p;\r
+       int d = gr->MeshNum>0 ? gr->MeshNum+1 : n, dx = n>d?n/d:1;\r
        for(long j=0;j<m;j++)\r
        {\r
                if(gr->NeedStop())      break;\r
                long mx = j<x->GetNy() ? j:0, my = j<y->GetNy() ? j:0;\r
                gr->NextColor(pal);\r
-               long n1 = gr->AddPnt(mglPoint(x->v(0,mx), y->v(0,my), zVal));\r
+               mreal xx = x->v(0,mx);\r
+               long n1 = gr->AddPnt(mglPoint(same?xx:(xx+x->v(1,mx))/2, y->v(0,my), zVal));\r
                if(mk)  gr->mark_plot(n1,mk);\r
+               if(!same)       n1 = gr->AddPnt(mglPoint(xx, y->v(0,my), zVal));\r
                for(long i=1;i<n;i++)\r
                {\r
                        long n2 = n1;   // horizontal\r
-                       p.Set(x->v(i,mx), y->v(i-1,my), zVal);\r
+                       xx = x->v(i,mx);\r
+                       mglPoint p(xx, y->v(i-1,my), zVal);\r
                        mreal c = sh ? gr->NextColor(pal,i):gr->CDef;\r
                        n1 = gr->AddPnt(p,c);   gr->line_plot(n1,n2);\r
                        if(i==1)        gr->arrow_plot(n2,n1,gr->Arrow1);\r
 \r
                        n2 = n1;        // vertical\r
                        p.y = y->v(i,my);               n1 = gr->AddPnt(p,c);\r
-                       if(mk)  gr->mark_plot(n1,mk);\r
                        gr->line_plot(n1,n2);\r
-                       if(i==n-1)      gr->arrow_plot(n1,n2,gr->Arrow2);\r
+                       if(same && i==n-1)      gr->arrow_plot(n1,n2,gr->Arrow2);\r
+                       long nn = n1;\r
+                       if(!same)       nn = gr->AddPnt(mglPoint((xx+x->v(i+1,mx))/2, y->v(i,my), zVal));\r
+                       if(mk && i%dx==0)       gr->mark_plot(nn,mk);\r
+               }\r
+               if(!same)\r
+               {\r
+                       mglPoint p(x->v(n,mx), y->v(n-1,my), zVal);\r
+                       mreal c = sh ? gr->NextColor(pal,n-1):gr->CDef;\r
+                       long n2 = gr->AddPnt(p,c);      gr->line_plot(n1,n2);\r
+                       gr->arrow_plot(n2,n1,gr->Arrow2);\r
                }\r
        }\r
        gr->EndGroup();\r
@@ -909,7 +1068,7 @@ void MGL_EXPORT mgl_bars_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c
        m = z->GetNy() > m ? z->GetNy() : m;\r
        bool sh = mglchr(pen,'!');\r
 \r
-       bool wire = mglchr(pen,'#');\r
+       bool wire = mglchr(pen,'#'), fixed = mglchr(pen,'F');\r
        bool above = mglchr(pen,'a'), fall = mglchr(pen,'f');\r
        if(above)       fall = false;\r
        mreal c1,c2;\r
@@ -919,6 +1078,18 @@ void MGL_EXPORT mgl_bars_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c
        if(mglchr(pen,'>'))     dv = -1;\r
        memset(dd,0,n*sizeof(mreal));\r
 \r
+       mreal dc=INFINITY;\r
+       if(fixed)       for(long j=0;j<m;j++)\r
+       {\r
+               long mx = j<x->GetNy() ? j:0, my = j<y->GetNy() ? j:0;\r
+               for(long i=0;i<n-1;i++)\r
+               {\r
+                       mreal cx = hypot(x->v(i+1,mx)-x->v(i,mx), y->v(i+1,my)-y->v(i,my));\r
+                       if(cx<dc)       dc=cx;\r
+               }\r
+       }\r
+       if(dc==0)       fixed=false;    // NOTE: disable fixed width if it is zero\r
+\r
        gr->SetPenPal(pen,&pal);\r
        gr->Reserve(4*n*m);\r
        for(long j=0;j<m;j++)\r
@@ -931,10 +1102,12 @@ void MGL_EXPORT mgl_bars_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c
                for(long i=0;i<n;i++)\r
                {\r
                        if(sh)  c2=c1=gr->NextColor(pal,i);\r
-                       mreal vv = x->v(i,mx), d = i<nx-1 ? x->v(i+1,mx)-vv : vv-x->v(i-1,mx), zz;\r
-                       mreal x1 = vv + d/2*(dv-gr->BarWidth), x2 = x1 + gr->BarWidth*d;\r
-                       vv = y->v(i,my);        d = i<ny-1 ? y->v(i+1,my)-vv : vv-y->v(i-1,my);\r
-                       mreal y1 = vv + d/2*(dv-gr->BarWidth), y2 = y1 + gr->BarWidth*d;\r
+                       mreal vv = x->v(i,mx), dx = i<nx-1 ? x->v(i+1,mx)-vv : vv-x->v(i-1,mx), dy, zz;\r
+                       vv = y->v(i,my);        dy = i<ny-1 ? y->v(i+1,my)-vv : vv-y->v(i-1,my);\r
+                       if(fixed)\r
+                       {       mreal ff = dc/hypot(dx,dy);     dx *= ff;       dy *= ff;       }\r
+                       mreal x1 = vv + dx/2*(dv-gr->BarWidth), x2 = x1 + gr->BarWidth*dx;\r
+                       mreal y1 = vv + dy/2*(dv-gr->BarWidth), y2 = y1 + gr->BarWidth*dy;\r
                        vv = zz = z->v(i,mz);\r
                        if(!above)\r
                        {\r
@@ -972,7 +1145,7 @@ void MGL_EXPORT mgl_bars_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char
        m = x->GetNy() > y->GetNy() ? x->GetNy() : y->GetNy();\r
        bool sh = mglchr(pen,'!');\r
 \r
-       bool wire = mglchr(pen,'#');\r
+       bool wire = mglchr(pen,'#'), fixed = mglchr(pen,'F');\r
        bool above = mglchr(pen,'a'), fall = mglchr(pen,'f');\r
        if(above)       fall = false;\r
        mreal c1,c2;\r
@@ -983,6 +1156,18 @@ void MGL_EXPORT mgl_bars_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char
        mreal zm = gr->AdjustZMin();\r
        memset(dd,0,n*sizeof(mreal));\r
 \r
+       mreal dx=INFINITY;\r
+       if(fixed)\r
+       {\r
+               long nn=x->GetNy();\r
+               for(long j=0;j<nn;j++)  for(long i=0;i<n-1;i++)\r
+               {\r
+                       mreal cx = fabs(x->v(i+1,j)-x->v(i,j));\r
+                       if(cx<dx)       dx=cx;\r
+               }\r
+       }\r
+       if(dx==0)       fixed=false;    // NOTE: disable fixed width if it is zero\r
+\r
        gr->SetPenPal(pen,&pal);\r
        gr->Reserve(4*n*m);\r
        for(long j=0;j<m;j++)\r
@@ -996,6 +1181,7 @@ void MGL_EXPORT mgl_bars_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char
                {\r
                        if(sh)  c2=c1=gr->NextColor(pal,i);\r
                        mreal vv = x->v(i,mx), d = i<nx-1 ? x->v(i+1,mx)-vv : vv-x->v(i-1,mx), yy;\r
+                       if(fixed)       d = dx;\r
                        mreal x1 = vv + d/2*(dv-gr->BarWidth), x2 = x1 + gr->BarWidth*d;\r
                        vv = yy = y->v(i,my);\r
                        if(!above)\r
@@ -1056,7 +1242,7 @@ void MGL_EXPORT mgl_barh_yx(HMGL gr, HCDT y, HCDT v, const char *pen, const char
        m = y->GetNy() > v->GetNy() ? y->GetNy() : v->GetNy();\r
        bool sh = mglchr(pen,'!');\r
 \r
-       bool wire = mglchr(pen,'#');\r
+       bool wire = mglchr(pen,'#'), fixed = mglchr(pen,'F');\r
        bool above = mglchr(pen,'a'), fall = mglchr(pen,'f');\r
        if(above)       fall = false;\r
        mreal *dd=new mreal[n], x0,xp,dv=ny>n?1:0;\r
@@ -1066,6 +1252,18 @@ void MGL_EXPORT mgl_barh_yx(HMGL gr, HCDT y, HCDT v, const char *pen, const char
        mreal zm = gr->AdjustZMin();\r
        memset(dd,0,n*sizeof(mreal));\r
 \r
+       mreal dy=INFINITY;\r
+       if(fixed)\r
+       {\r
+               long nn=y->GetNy();\r
+               for(long j=0;j<nn;j++)  for(long i=0;i<n-1;i++)\r
+               {\r
+                       mreal cx = fabs(y->v(i+1,j)-y->v(i,j));\r
+                       if(cx<dy)       dy=cx;\r
+               }\r
+       }\r
+       if(dy==0)       fixed=false;    // NOTE: disable fixed width if it is zero\r
+\r
        gr->SetPenPal(pen,&pal);\r
        gr->Reserve(4*n*m);\r
        for(long j=0;j<m;j++)\r
@@ -1079,6 +1277,7 @@ void MGL_EXPORT mgl_barh_yx(HMGL gr, HCDT y, HCDT v, const char *pen, const char
                {\r
                        if(sh)  c2=c1=gr->NextColor(pal,i);\r
                        mreal vv = y->v(i,my), d = i<ny-1 ? y->v(i+1,my)-vv : vv-y->v(i-1,my), xx;\r
+                       if(fixed)       d = dy;\r
                        mreal y1 = vv + d/2*(dv-gr->BarWidth), y2 = y1 + gr->BarWidth*d;\r
                        vv = xx = v->v(i,mx);\r
                        if(!above)\r
@@ -1153,7 +1352,7 @@ void MGL_EXPORT mgl_ohlc_x(HMGL gr, HCDT x, HCDT open, HCDT high, HCDT low, HCDT
                        x1 = vv + dd/2*(dv-gr->BarWidth);       x2 = x1 + gr->BarWidth*dd;\r
                        x2 = (x2-x1)/m;         x1 += j*x2;             x2 += x1;       vv = (x2+x1)/2;\r
                        if(sh)  c1=c2=gr->NextColor(pal,i);\r
-                       register long n1,n2;\r
+                       long n1,n2;\r
 \r
                        dd = close->v(i,j);\r
                        mreal c = (i==0 || dd>=close->v(i-1,j)) ? c1:c2;\r
@@ -1216,8 +1415,8 @@ void MGL_EXPORT mgl_boxplot_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const c
        mreal *d = new mreal[m];\r
        for(long i=0;i<n;i++)   // find quartiles by itself\r
        {\r
-               register long mm,k,j;\r
-               for(mm=j=0;j<m;j++)\r
+               long mm=0,k;\r
+               for(long j=0;j<m;j++)\r
                {\r
                        mreal vv = y->v(i,j);\r
                        if(mgl_isnum(vv))       {       d[mm]=vv;       mm++;   }\r
@@ -1240,7 +1439,7 @@ void MGL_EXPORT mgl_boxplot_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const c
                x1 = vv + dd/2*(dv-gr->BarWidth);\r
                x2 = x1 + gr->BarWidth*dd;\r
                mreal c = sh ? gr->NextColor(pal,i):gr->CDef;\r
-               register long n1,n2;\r
+               long n1,n2;\r
 \r
                n1=gr->AddPnt(mglPoint(x1,b[i],zVal),c);        // horizontal lines\r
                n2=gr->AddPnt(mglPoint(x2,b[i],zVal),c);\r
@@ -1521,7 +1720,7 @@ void MGL_EXPORT mgl_chart(HMGL gr, HCDT a, const char *cols, const char *opt)
        gr->SaveState(opt);\r
        static int cgid=1;      gr->StartGroup("Chart",cgid++);\r
        bool wire = mglchr(cols,'#');   // draw edges\r
-       register long n=a->GetNx(),i,j=0,len=cols?long(strlen(cols)):0;\r
+       long n=a->GetNx(),i,j=0,len=cols?long(strlen(cols)):0;\r
        if(cols)        for(i=0;i<len;i++)\r
                if(strchr(MGL_COLORS,cols[i]) || cols[i]==' ')  j++;\r
        if(j==0)        {       cols = MGL_DEF_PAL;     len=long(strlen(cols)); }\r
@@ -1584,13 +1783,14 @@ void MGL_EXPORT mgl_mark_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT r, const char
        if(mk==0)       mk='.';\r
        bool sh = mglchr(pen,'!');\r
 \r
+       int d = gr->MeshNum>0 ? gr->MeshNum+1 : n, dx = n>d?n/d:1;\r
        for(long j=0;j<m;j++)\r
        {\r
                if(gr->NeedStop())      break;\r
                gr->NextColor(pal);\r
                long mx = j<x->GetNy() ? j:0, my = j<y->GetNy() ? j:0;\r
                long mz = j<z->GetNy() ? j:0, mr = j<r->GetNy() ? j:0;\r
-               for(long i=0;i<n;i++)\r
+               for(long i=0;i<n;i+=dx)\r
                {\r
                        mreal c = sh ? gr->NextColor(pal,i):gr->CDef;\r
                        gr->mark_plot(gr->AddPnt(mglPoint(x->v(i,mx),y->v(i,my),z->v(i,mz)),c), mk, fabs(r->v(i,mr)));\r
@@ -1608,7 +1808,7 @@ void MGL_EXPORT mgl_mark_xy(HMGL gr, HCDT x, HCDT y, HCDT r, const char *pen, co
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_mark_y(HMGL gr, HCDT y, HCDT r, const char *pen, const char *opt)\r
 {\r
-       register long n=y->GetNx();\r
+       long n=y->GetNx();\r
        gr->SaveState(opt);\r
        mglDataV x(n), z(n);\r
        x.Fill(gr->Min.x,gr->Max.x);    z.Fill(gr->AdjustZMin());\r
@@ -1669,8 +1869,8 @@ void MGL_EXPORT mgl_tube_xyzr(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT r, const cha
                        mreal c = sh ? gr->NextColor(pal,i):gr->CDef;\r
                        for(long k=0;k<num;k++)\r
                        {\r
-                               register int kk = k*360/(num-1);\r
-                               register float  co = mgl_cos[(kk)%360], si = mgl_cos[(270+kk)%360];\r
+                               int kk = k*360/(num-1);\r
+                               float  co = mgl_cos[(kk)%360], si = mgl_cos[(270+kk)%360];\r
                                p = q + t*(rr*co) + u*(rr*si);\r
                                d = (t*si - u*co)^(l + t*(dr*co) + u*(dr*si));\r
                                nn[k+num]=nn[k];        nn[k] = gr->AddPnt(p,c,wire?mglPoint(NAN,NAN):d,-1,3);\r
@@ -1692,7 +1892,7 @@ void MGL_EXPORT mgl_tube_xyr(HMGL gr, HCDT x, HCDT y, HCDT r, const char *pen, c
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_tube_r(HMGL gr, HCDT y, HCDT r, const char *pen, const char *opt)\r
 {\r
-       register long n=y->GetNx();\r
+       long n=y->GetNx();\r
        if(n<2) {       gr->SetWarn(mglWarnLow,"Tube"); return; }\r
        gr->SaveState(opt);\r
        mglDataV x(n), z(n);\r
@@ -1702,7 +1902,7 @@ void MGL_EXPORT mgl_tube_r(HMGL gr, HCDT y, HCDT r, const char *pen, const char
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_tube(HMGL gr, HCDT y, double rr, const char *pen, const char *opt)\r
 {\r
-       register long n=y->GetNx();\r
+       long n=y->GetNx();\r
        if(n<2) {       gr->SetWarn(mglWarnLow,"Tube"); return; }\r
        gr->SaveState(opt);\r
        mglDataV x(n), r(n), z(n);\r
@@ -1713,7 +1913,7 @@ void MGL_EXPORT mgl_tube(HMGL gr, HCDT y, double rr, const char *pen, const char
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_tube_xy(HMGL gr, HCDT x, HCDT y, double rr, const char *pen, const char *opt)\r
 {\r
-       register long n=y->GetNx();\r
+       long n=y->GetNx();\r
        if(n<2) {       gr->SetWarn(mglWarnLow,"Tube"); return; }\r
        gr->SaveState(opt);\r
        mglDataV r(n), z(n);\r
@@ -1798,8 +1998,7 @@ void MGL_EXPORT mgl_tape_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c
                        if(zo)  {       n3 = gr->AddPnt(p2,c2,q1,-1,3); n4 = gr->AddPnt(p2+rr*q2,c2,q1,-1,3);   }\r
                }\r
                else            {       n1=n2=n3=n4=-1; }\r
-               register long i;\r
-               for(i=1;i<n;i++)\r
+               for(long i=1;i<n;i++)\r
                {\r
                        p1 = p2;        p2.Set(x->v(i,mx), y->v(i,my), z->v(i,mz));\r
                        l = p2-p1;              l /= mgl_norm(l);\r
@@ -1837,7 +2036,7 @@ void MGL_EXPORT mgl_tape_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_tape(HMGL gr, HCDT y, const char *pen, const char *opt)\r
 {\r
-       register long n=y->GetNx();\r
+       long n=y->GetNx();\r
        if(n<2) {       gr->SetWarn(mglWarnLow,"Plot"); return; }\r
        gr->SaveState(opt);\r
        mglDataV x(n), z(n);\r
@@ -1906,7 +2105,7 @@ void MGL_EXPORT mgl_pmap_xy(HMGL gr, HCDT x, HCDT y, HCDT r, const char *pen, co
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_pmap(HMGL gr, HCDT y, HCDT r, const char *pen, const char *opt)\r
 {\r
-       register long n=y->GetNx();\r
+       long n=y->GetNx();\r
        gr->SaveState(opt);\r
        mglDataV x(n), z(n);\r
        x.Fill(gr->Min.x,gr->Max.x);    z.Fill(gr->AdjustZMin());\r
index 05496fbbdabced30974fef210721d1cefb99f118..49f742cdddc08b93aebea09b8aed47c78ad7637b 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * prc.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
 //-----------------------------------------------------------------------------\r
 void mglTexture::GetRGBAPRC(unsigned char *f) const\r
 {\r
-       register size_t i,j,i0;\r
-       mglColor c1,c2,c;\r
-       for(i=0;i<256;i++)\r
+       for(size_t i=0;i<256;i++)\r
        {\r
-               c1 = col[2*i];  c2 = col[2*i+1];\r
-               for(j=0;j<256;j++)\r
+               mglColor c1 = col[2*i], c2 = col[2*i+1], c;\r
+               for(size_t j=0;j<256;j++)\r
                {\r
-                       i0 = 4*(j+256*(255-i));\r
+                       size_t i0 = 4*(j+256*(255-i));\r
                        c = c1 + (c2-c1)*(j/255.);\r
                        f[i0]   = int(255*c.r);\r
                        f[i0+1] = int(255*c.g);\r
@@ -246,7 +244,8 @@ void my_png_flush(png_structp /*png_ptr*/)
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_write_prc(HMGL gr, const char *fname,const char* /*descr*/, int make_pdf)\r
 {\r
-       if(gr->GetPrmNum()==0)  return; // nothing to do\r
+       mglCanvas *gg = dynamic_cast<mglCanvas *>(gr);\r
+       if(!gg || gr->GetPrmNum()==0)   return; // nothing to do\r
        {\r
                long mmin=0,mmax=0,m;\r
                for(size_t i=0;i<gr->Grp.size();i++)    // prepare array of indirect indexing\r
@@ -318,7 +317,7 @@ void MGL_EXPORT mgl_write_prc(HMGL gr, const char *fname,const char* /*descr*/,
 \r
                png_destroy_write_struct(&png_ptr, &info_ptr);\r
                delete []pbuf;  delete []buf;\r
-    \r
+\r
                PRCtexture* t = new PRCtexture();\r
                t->mapping = PRC_TEXTURE_MAPPING_DIFFUSE;\r
                t->components = PRC_TEXTURE_MAPPING_COMPONENTS_RGBA;\r
@@ -357,8 +356,8 @@ void MGL_EXPORT mgl_write_prc(HMGL gr, const char *fname,const char* /*descr*/,
        // primitive definition in groups\r
 \r
        mglPnt p0;\r
-       const double width  = dynamic_cast<mglCanvas *>(gr)->GetWidth();\r
-       const double height = dynamic_cast<mglCanvas *>(gr)->GetHeight();\r
+       const double width  = gg->GetWidth();\r
+       const double height = gg->GetHeight();\r
        const double depth  = sqrt(width*height);\r
 \r
        p0.x = width/2.;\r
@@ -751,12 +750,12 @@ void MGL_EXPORT mgl_write_prc(HMGL gr, const char *fname,const char* /*descr*/,
                                        case 4:\r
                                        if (gr->GetPnt(q.n1).a > mgl_min_a) {\r
                                                const mglPnt p = gr->GetPnt(q.n1) - p0;\r
-                                               \r
+\r
                                                const mreal f = q.p/2, dx=p.u/2, dy=p.v/2;\r
                                                const mreal c=q.s*cos(q.w*M_PI/180), s=-q.s*sin(q.w*M_PI/180);\r
                                                const double b[4] = {c,-s, s,c};\r
                                                long ik,il=0;\r
-                                               \r
+\r
                                                const mglGlyph &g = gr->GetGlf(q.n4);\r
                                                const mreal dd = 0.004;\r
                                                if(q.n3&8)\r
@@ -768,7 +767,7 @@ void MGL_EXPORT mgl_write_prc(HMGL gr, const char *fname,const char* /*descr*/,
                                                                const uint32_t p_3 = group.addPoint(p.x+b[0]*dx+b[1]*(dy+dd),p.y+b[2]*dx+b[3]*(dy+dd),p.z);\r
                                                                const uint32_t p_2 = group.addPoint(p.x+b[0]*(dx+f)+b[1]*(dy-dd),p.y+b[2]*dx+b[3]*(dy-dd),p.z);\r
                                                                const uint32_t p_1 = group.addPoint(p.x+b[0]*(dx+f)+b[1]*(dy+dd),p.y+b[2]*dx+b[3]*(dy+dd),p.z);\r
-                                                               \r
+\r
                                                                group.addTriangle(ti, p_1, p_3, p_2);\r
                                                                group.addTriangle(ti, p_4, p_2, p_3);\r
                                                        }\r
@@ -779,7 +778,7 @@ void MGL_EXPORT mgl_write_prc(HMGL gr, const char *fname,const char* /*descr*/,
                                                                const double p_3[3] = {p.x+b[0]*dx+b[1]*(dy+dd),p.y+b[2]*dx+b[3]*(dy+dd),p.z};\r
                                                                const double p_2[3] = {p.x+b[0]*(dx+f)+b[1]*(dy-dd),p.y+b[2]*dx+b[3]*(dy-dd),p.z};\r
                                                                const double p_1[3] = {p.x+b[0]*(dx+f)+b[1]*(dy+dd),p.y+b[2]*dx+b[3]*(dy+dd),p.z};\r
-                                                               \r
+\r
                                                                file.addSegment(p_1, p_2, c, w);\r
                                                                file.addSegment(p_3, p_4, c, w);\r
                                                                file.addSegment(p_1, p_3, c, w);\r
@@ -800,7 +799,7 @@ void MGL_EXPORT mgl_write_prc(HMGL gr, const char *fname,const char* /*descr*/,
                                                                        const uint32_t p_2 = group.addPoint(p.x+b[0]*x+b[1]*y,p.y+b[2]*x+b[3]*y,p.z);\r
                                                                        x = dx+f*g.trig[6*ik+4];        y = dy+f*g.trig[6*ik+5];\r
                                                                        const uint32_t p_1 = group.addPoint(p.x+b[0]*x+b[1]*y,p.y+b[2]*x+b[3]*y,p.z);\r
-                                                                       \r
+\r
                                                                        group.addTriangle(ti, p_1, p_3, p_2);\r
                                                                }\r
                                                        }\r
@@ -829,11 +828,11 @@ void MGL_EXPORT mgl_write_prc(HMGL gr, const char *fname,const char* /*descr*/,
                                                                                const double p_1[3] = {p.x+b[0]*x+b[1]*y,p.y+b[2]*x+b[3]*y,p.z};\r
                                                                                file.addSegment(p_1, p_2, c, w);\r
                                                                        }\r
-                                                                       \r
+\r
                                                                }\r
                                                        }\r
                                                }\r
-                                               \r
+\r
                                        }\r
                                                break;\r
 \r
@@ -968,7 +967,7 @@ void MGL_EXPORT mgl_write_prc(HMGL gr, const char *fname,const char* /*descr*/,
 \r
                /* save the document to a file */\r
                const size_t tlen = strlen(tname);\r
-               tname[tlen-2]='p';      tname[tlen-2]='d';      tname[tlen-1]='f';\r
+               tname[tlen-3]='p';      tname[tlen-2]='d';      tname[tlen-1]='f';\r
                HPDF_SaveToFile (pdf, tname);\r
 \r
                /* clean up */\r
@@ -980,7 +979,7 @@ void MGL_EXPORT mgl_write_prc(HMGL gr, const char *fname,const char* /*descr*/,
                FILE *fp=fopen(tname,"wt");\r
                fputs("Can not produce PDF file, MathGL compiled without PDF output support\n", fp);\r
                fclose(fp);\r
-               mgl_set_global_warn("PDF support was disabled. Please, enable it and rebuild MathGL.");\r
+               mgl_set_global_warn(_("PDF support was disabled. Please, enable it and rebuild MathGL."));\r
 #endif // MGL_HAVE_PDF\r
        }\r
        delete []tname;\r
index 78ee1bdcd0aa4b19c51af3185b76e8c9c4e59fc3..2cfb92f0b1e8c53ab11a6812eb8e4a28f0460123 100644 (file)
@@ -18,6 +18,8 @@ typedef unsigned long uint32_t;
 #include <inttypes.h>
 #endif // _MSC_VER
 
+#include<mgl2/define.h>
+
 //const uint32_t PRCVersion=7094;   // For Adobe Reader 8 or later
 const uint32_t PRCVersion=8137; // For Adobe Reader 9 or later
 
index b090f8aef91b24fb0398163c974da5bb70d800fd..6e1155704edc39bdde34fed154b0642d5264ccbf 100644 (file)
@@ -1259,7 +1259,7 @@ uint32_t oPRCFile::addTransform(const double origin[3], const double x_axis[3],
 {
   PRCCartesianTransformation3d* transform = new PRCCartesianTransformation3d(origin, x_axis, y_axis, scale);
   if(transform->behaviour==PRC_TRANSFORMATION_Identity)
-    return m1;
+  { delete transform;  return m1; }
   PRCCoordinateSystem *coordinateSystem = new PRCCoordinateSystem();
   coordinateSystem->axis_set = transform;
   const uint32_t coordinate_system_index = fileStructures[0]->addCoordinateSystem(coordinateSystem);
index ec80c87885c3c743de9ef9050bb43ff8aca3a319..484e13147b6bbadba726319ad29cb9acd62612ff 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * prim.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -19,6 +19,8 @@
  ***************************************************************************/\r
 #include "mgl2/canvas.h"\r
 #include "mgl2/prim.h"\r
+#include "mgl2/font.h"\r
+#include "mgl2/plot.h"\r
 #include "mgl2/data.h"\r
 std::wstring MGL_EXPORT mgl_ftoa(double v, const char *fmt);\r
 //-----------------------------------------------------------------------------\r
@@ -148,8 +150,10 @@ void MGL_EXPORT mgl_face(HMGL gr, double x0, double y0, double z0, double x1, do
 //     mreal c1,c2,c3,c4,zz=(gr->Min.z+gr->Max.z)/2;\r
        mreal c1,c2,c3,c4,zz=2*gr->Max.z-gr->Min.z;\r
        c1=c2=c3=c4=gr->CDef;\r
-       if(mgl_isnan(z0))       z0 = zz;        if(mgl_isnan(z1))       z1 = zz;\r
-       if(mgl_isnan(z2))       z2 = zz;        if(mgl_isnan(z3))       z3 = zz;\r
+       if(mgl_isnan(z0))       z0 = zz;\r
+       if(mgl_isnan(z1))       z1 = zz;\r
+       if(mgl_isnan(z2))       z2 = zz;\r
+       if(mgl_isnan(z3))       z3 = zz;\r
        mglPoint p1(x0,y0,z0), p2(x1,y1,z1), p3(x2,y2,z2), p4(x3,y3,z3);\r
        if(gr->GetNumPal(pal)>=4)\r
        {       c2=gr->NextColor(pal,1);        c3=gr->NextColor(pal,2);        c4=gr->NextColor(pal,3);        }\r
@@ -219,7 +223,7 @@ void MGL_EXPORT mgl_cone(HMGL gr, double x1, double y1, double z1, double x2, do
        if((s=strstr(stl,"{&"))!=0)     c1 = c2 = atof(s+2);\r
        else\r
        {\r
-               register long ss=gr->AddTexture(stl);\r
+               long ss=gr->AddTexture(stl);\r
                c1=gr->GetC(ss,p1.z);\r
                c2=gr->GetC(ss,p2.z);\r
        }\r
@@ -241,8 +245,8 @@ void MGL_EXPORT mgl_cone(HMGL gr, double x1, double y1, double z1, double x2, do
 \r
        for(long i=0;i<2*n+1;i++)\r
        {\r
-               register int f = n!=4?(2*i+1)*90/n:45*i;\r
-               register mreal co = mgl_cos[f%360], si = mgl_cos[(f+270)%360];\r
+               int f = n!=4?(2*i+1)*90/n:45*i;\r
+               mreal co = mgl_cos[f%360], si = mgl_cos[(f+270)%360];\r
                p = p1+(r1*co)*a+(r1*si)*b;\r
                if(refr)        q = (si*a-co*b)^(d + (dr*co)*a + (dr*si)*b);\r
                kk[i] = gr->AddPnt(p,c1,q,-1,3);\r
@@ -275,7 +279,7 @@ void MGL_EXPORT mgl_cone_(uintptr_t* gr, mreal *x1, mreal *y1, mreal *z1, mreal
        mgl_cone(_GR_, *x1,*y1,*z1, *x2,*y2,*z2,*r1,*r2,s);     delete []s;     }\r
 //-----------------------------------------------------------------------------\r
 //\r
-//     Bars series\r
+//     Cones series\r
 //\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_cones_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, const char *opt)\r
@@ -367,7 +371,7 @@ void MGL_EXPORT mgl_cones_(uintptr_t *gr, uintptr_t *y,     const char *pen, const c
        mgl_cones(_GR_,_DA_(y),s,o);    delete []o;     delete []s;     }\r
 //-----------------------------------------------------------------------------\r
 //\r
-//     Ellipse & Rhomb\r
+//     Polygon & Arc\r
 //\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_polygon(HMGL gr, double x1, double y1, double z1, double x2, double y2, double z2, int n, const char *stl)\r
@@ -471,7 +475,7 @@ void MGL_EXPORT mgl_ellipse(HMGL gr, double x1, double y1, double z1, double x2,
        gr->AddActive(gr->AddPnt(p2,c,q,-1,11),1);\r
        for(long i=0;i<n;i++)\r
        {\r
-               register int t=i*360/(n-1);\r
+               int t=i*360/(n-1);\r
                p = s+v*mgl_cos[t%360]+u*mgl_cos[(270+t)%360];\r
                long n2 = n1;   n1 = gr->AddPnt(p,c,q,-1,11);\r
                if(i==n/4)      gr->AddActive(n1,2);\r
@@ -551,9 +555,9 @@ void MGL_EXPORT mgl_drop(HMGL gr, mglPoint p, mglPoint q, double r, double c, do
        {\r
                if(i>0 && i<m)\r
                {\r
-                       register int u=i*180/m, v=180*j/m+202;\r
-                       register float co=mgl_cos[u%360], si=mgl_cos[(u+270)%360];\r
-                       register float cv=mgl_cos[v%360], sv=mgl_cos[(v+270)%360];\r
+                       int u=i*180/m, v=180*j/m+202;\r
+                       float co=mgl_cos[u%360], si=mgl_cos[(u+270)%360];\r
+                       float cv=mgl_cos[v%360], sv=mgl_cos[(v+270)%360];\r
                        rr = r*a*si*(1.+sh*co)/(1+sh);\r
                        dr = r*a/(1+sh)*(co*(1.+sh*co) - sh*si*si);\r
                        x = rr*cv;      y = rr*sv;\r
@@ -596,11 +600,12 @@ void MGL_EXPORT mgl_dew_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char
        mreal zVal = gr->Min.z, xm=0;\r
        long tx=1,ty=1;\r
        if(gr->MeshNum>1)       {       tx=(n-1)/(gr->MeshNum-1);       ty=(m-1)/(gr->MeshNum-1);       }\r
-       if(tx<1)        tx=1;   if(ty<1)        ty=1;\r
+       if(tx<1)        tx=1;\r
+       if(ty<1)        ty=1;\r
 \r
        for(long k=0;k<ax->GetNz();k++) for(long j=0;j<m;j++)   for(long i=0;i<n;i++)\r
        {\r
-               register mreal ym = sqrt(ax->v(i,j,k)*ax->v(i,j,k)+ay->v(i,j,k)*ay->v(i,j,k));\r
+               mreal ym = sqrt(ax->v(i,j,k)*ax->v(i,j,k)+ay->v(i,j,k)*ay->v(i,j,k));\r
                xm = xm>ym ? xm : ym;\r
        }\r
        xm = 1./MGL_FEPSILON/(xm==0 ? 1:xm);\r
@@ -611,9 +616,9 @@ void MGL_EXPORT mgl_dew_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char
                for(long i=0;i<n;i+=tx) for(long j=0;j<m;j+=ty)\r
                {\r
                        if(gr->NeedStop())      {       gr->EndGroup(); return; }\r
-                       register mreal xx=GetX(x,i,j,k).x, yy=GetY(y,i,j,k).x, dd;\r
-                       register mreal dx = i<n-1 ? (GetX(x,i+1,j,k).x-xx) : (xx-GetX(x,i-1,j,k).x);\r
-                       register mreal dy = j<m-1 ? (GetY(y,i,j+1,k).x-yy) : (yy-GetY(y,i,j-1,k).x);\r
+                       mreal xx=GetX(x,i,j,k).x, yy=GetY(y,i,j,k).x, dd;\r
+                       mreal dx = i<n-1 ? (GetX(x,i+1,j,k).x-xx) : (xx-GetX(x,i-1,j,k).x);\r
+                       mreal dy = j<m-1 ? (GetY(y,i,j+1,k).x-yy) : (yy-GetY(y,i,j-1,k).x);\r
                        dx *= tx;       dy *= ty;\r
 \r
                        mglPoint q(ax->v(i,j,k),ay->v(i,j,k));  dd = q.norm();\r
@@ -644,6 +649,46 @@ void MGL_EXPORT mgl_dew_2d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, const c
        mgl_dew_2d(_GR_, _DA_(ax), _DA_(ay), s, o);     delete []o;     delete []s;     }\r
 //-----------------------------------------------------------------------------\r
 //\r
+//     Symbol series\r
+//\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_symbol(HMGL gr, double x, double y, double z, char id, const char *how, double size)\r
+{      mgl_symbol_dir(gr, x, y, z, NAN, NAN, 0, id, how, size);        }\r
+void MGL_EXPORT mgl_symbol_dir(HMGL gr, double x, double y, double z, double dx, double dy, double dz, char id, const char *how, double size)\r
+{\r
+       bool a=mglchr(how,'a'), A=mglchr(how,'A');\r
+//     static int cgid=1;      gr->StartGroup("Puts",cgid++);\r
+       mglCanvas *g = dynamic_cast<mglCanvas *>(gr);\r
+       if(g && (a||A))\r
+       {\r
+               g->Push();      g->Identity(a);\r
+               gr->set(MGL_DISABLE_SCALE);\r
+               mreal s=a?1:g->GetPlotFactor();\r
+               x = (2*x-1)*s;  y = (2*y-1)*s;\r
+               dx= (2*dx-1)*s; dy= (2*dy-1)*s;\r
+       }\r
+       if(mgl_isnan(z))        z=2*gr->Max.z-gr->Min.z;\r
+       mglPoint p(x,y,z), d(dx-x,dy-y,dz-z);\r
+       long cc = mgl_get_num_color(how,0)?gr->AddTexture(how):gr->AddTexture('k');\r
+       long k = gr->AddPnt(p,cc,d,-1,7);\r
+       gr->AddActive(k,0);\r
+       gr->AddActive(gr->AddPnt(mglPoint(dx,dy,dz),cc,d,-1,7),1);\r
+       if(g && (a||A)) {       g->Pop();       gr->clr(MGL_DISABLE_SCALE);     }\r
+       if(size<0)      size *= -gr->GetFontSize();\r
+       \r
+       int font=0;     mglGetStyle(how, &font, NULL);\r
+       if(font&MGL_FONT_WIRE)  size = -size;\r
+       gr->smbl_plot(k,id,size);\r
+//     gr->EndGroup();\r
+}\r
+void MGL_EXPORT mgl_symbol_(uintptr_t *gr, double *x, double *y, double *z, char *id, const char *how, double *size,int,int n)\r
+{      char *f=new char[n+1];  memcpy(f,how,n);        f[n]=0;\r
+       mgl_symbol(_GR_, *x, *y, *z, *id, f, *size);    delete []f;     }\r
+void MGL_EXPORT mgl_symbol_dir_(uintptr_t *gr, double *x, double *y, double *z, double *dx, double *dy, double *dz, char *id, const char *how, double *size,int,int n)\r
+{      char *f=new char[n+1];  memcpy(f,how,n);        f[n]=0;\r
+       mgl_symbol_dir(_GR_, *x, *y, *z, *dx, *dy, *dz, *id, f, *size); delete []f;     }\r
+//-----------------------------------------------------------------------------\r
+//\r
 //     Puts series\r
 //\r
 //-----------------------------------------------------------------------------\r
@@ -661,12 +706,13 @@ void MGL_EXPORT mgl_putsw_dir(HMGL gr, double x, double y, double z, double dx,
 {\r
        bool a=mglchr(font,'a'), A=mglchr(font,'A');\r
        static int cgid=1;      gr->StartGroup("Puts",cgid++);\r
+\r
        mglCanvas *g = dynamic_cast<mglCanvas *>(gr);\r
        if(g && (a||A))\r
        {\r
-               g->Push();      g->Identity(a);\r
+               g->SaveInPlot();        g->Identity(a);\r
                gr->set(MGL_DISABLE_SCALE);\r
-               register mreal s=a?1:g->GetPlotFactor();\r
+               mreal s=a?1:g->GetPlotFactor();\r
                x = (2*x-1)*s;  y = (2*y-1)*s;\r
                dx= (2*dx-1)*s; dy= (2*dy-1)*s;\r
        }\r
@@ -675,8 +721,8 @@ void MGL_EXPORT mgl_putsw_dir(HMGL gr, double x, double y, double z, double dx,
        long k = gr->AddPnt(p,-1,d,-1,7);\r
        gr->AddActive(k,0);\r
        gr->AddActive(gr->AddPnt(mglPoint(dx,dy,dz),-1,d,-1,7),1);\r
-       if(g && (a||A)) {       g->Pop();       gr->clr(MGL_DISABLE_SCALE);     }\r
        gr->text_plot(k,text,font,size);\r
+       if(g && (a||A)) {       g->LoadInPlot();        gr->clr(MGL_DISABLE_SCALE);     }\r
        gr->EndGroup();\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -708,16 +754,16 @@ void MGL_EXPORT mgl_textmarkw_xyzr(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT r, cons
        m = r->GetNy() > m ? r->GetNy() : m;\r
        gr->Reserve(n*m);\r
 \r
-       mglPoint p,q(NAN);\r
+       mglPoint q(NAN);\r
+       int d = gr->MeshNum>0 ? gr->MeshNum+1 : n, dx = n>d?n/d:1;\r
        for(long j=0;j<m;j++)\r
        {\r
                if(gr->NeedStop())      break;\r
                long mx = j<x->GetNy() ? j:0, my = j<y->GetNy() ? j:0;\r
                long mz = j<z->GetNy() ? j:0, mr = j<r->GetNy() ? j:0;\r
-               for(long i=0;i<n;i++)\r
+               for(long i=0;i<n;i+=dx)\r
                {\r
-                       p.Set(x->v(i,mx), y->v(i,my), z->v(i,mz));\r
-                       register long k = gr->AddPnt(p,-1,q);\r
+                       long k = gr->AddPnt(mglPoint(x->v(i,mx), y->v(i,my), z->v(i,mz)),-1,q);\r
                        gr->text_plot(k, text, fnt, -0.5*fabs(r->v(i,mr)));\r
                }\r
        }\r
@@ -733,7 +779,7 @@ void MGL_EXPORT mgl_textmarkw_xyr(HMGL gr, HCDT x, HCDT y, HCDT r, const wchar_t
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_textmarkw_yr(HMGL gr, HCDT y, HCDT r, const wchar_t *text, const char *fnt, const char *opt)\r
 {\r
-       register long n=y->GetNx();\r
+       long n=y->GetNx();\r
        gr->SaveState(opt);\r
        mglData x(n);   x.Fill(gr->Min.x,gr->Max.x);\r
        mglData z(n);   z.Fill(gr->Min.z,gr->Min.z);\r
@@ -742,7 +788,7 @@ void MGL_EXPORT mgl_textmarkw_yr(HMGL gr, HCDT y, HCDT r, const wchar_t *text, c
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_textmarkw(HMGL gr, HCDT y, const wchar_t *text, const char *fnt, const char *opt)\r
 {\r
-       register long n=y->GetNx();\r
+       long n=y->GetNx();\r
        gr->SaveState(opt);\r
        mglData r(n);   r.Fill(1,1);\r
        mglData x(n);   x.Fill(gr->Min.x,gr->Max.x);\r
@@ -815,7 +861,7 @@ void MGL_EXPORT mgl_labelw_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const wchar_t *t
                for(long i=0;i<n;i++)\r
                {\r
                        mreal xx=x->v(i,mx), yy=y->v(i,my), zz=z->v(i,mz);\r
-                       register long kk = gr->AddPnt(mglPoint(xx,yy,zz),-1,q),k,l;\r
+                       long kk = gr->AddPnt(mglPoint(xx,yy,zz),-1,q),k,l;\r
                        std::wstring buf;\r
                        for(k=l=0;text[k];k++)\r
                        {\r
@@ -844,7 +890,7 @@ void MGL_EXPORT mgl_labelw_xy(HMGL gr, HCDT x, HCDT y, const wchar_t *text, cons
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_labelw_y(HMGL gr, HCDT y, const wchar_t *text, const char *fnt, const char *opt)\r
 {\r
-       register long n=y->GetNx();\r
+       long n=y->GetNx();\r
        if(n<2) {       gr->SetWarn(mglWarnLow,"TextMark");     return; }\r
        gr->SaveState(opt);\r
        mglData x(n);   x.Fill(gr->Min.x,gr->Max.x);\r
@@ -1047,7 +1093,7 @@ void MGL_EXPORT mgl_bifurcation(HMGL gr, double dx, double (*f)(double,double,vo
                r = f(gr->Min.x,r,par);\r
                for(long j=0;j<m1;j++)  if(fabs(v1[j]-r)<dd)\r
                {       fin=true;       break;  }\r
-               if(fin) break;  v1[m1]=r;\r
+               if(fin) break;  else    v1[m1]=r;\r
        }\r
        for(mreal xx = gr->Min.x+dx;xx<=gr->Max.x;xx+=dx)\r
        {\r
@@ -1058,7 +1104,7 @@ void MGL_EXPORT mgl_bifurcation(HMGL gr, double dx, double (*f)(double,double,vo
                        r = f(xx,r,par);\r
                        for(long j=0;j<m1;j++)  if(fabs(v1[j]-r)<dd)\r
                        {       fin=true;       break;  }\r
-                       if(fin) break;  v1[m1]=r;\r
+                       if(fin) break;  else    v1[m1]=r;\r
                }\r
                if(m1>=m2)      for(long i=0;i<m1;i++)\r
                {\r
@@ -1106,3 +1152,114 @@ void MGL_EXPORT mgl_bifurcation_str_(uintptr_t *gr, double *dx, const char *func
        char *f=new char[m+1];  memcpy(f,func,m);       f[m]=0;\r
        mgl_bifurcation_str(_GR_,*dx,f,s,o);    delete []f;     delete []s;     delete []o;     }\r
 //-----------------------------------------------------------------------------\r
+//\r
+// Iris series\r
+//\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_irisw(HMGL gr, HCDT dats, HCDT ranges, const wchar_t *ids, const char *stl, const char *opt)\r
+{\r
+       long m=dats->GetNx(), nx=dats->GetNy(), ny=dats->GetNz();       // TODO parse several slices?\r
+       if(m<2 || nx<2) {       gr->SetWarn(mglWarnLow,"Iris"); return; }\r
+       if(m!=ranges->GetNy())  {       gr->SetWarn(mglWarnDim,"Iris"); return; }\r
+       mglCanvas *g = dynamic_cast<mglCanvas *>(gr);   if(!g)  return;\r
+       mreal ofsize = gr->GetFontSize();\r
+       mreal res=gr->SaveState(opt), fsize = gr->GetFontSize();\r
+       if(mgl_isnan(res))      res=-1;\r
+       res /= m;\r
+       static int cgid=1;      gr->StartGroup("Iris",cgid++);\r
+       std::wstring *strs = new std::wstring[m];\r
+       bool label = ids && ids[0];     // disable axis drawing\r
+       if(label)\r
+       {\r
+               const wchar_t *s, *p=ids;\r
+               if(wcschr(ids,';'))     for(long i=0;i<m;i++)\r
+               {\r
+                       s = wcschr(p,';');\r
+                       if(s)   {       strs[i] = std::wstring(p,s-p);  p = s+1;        }\r
+                       else    {       strs[i] = p;    break;  }\r
+               }\r
+//             else    for(long i=0;i<m;i++)\r
+//             {\r
+//                     s = wcsstr(p,L"\\t ");\r
+//                     if(s)   {       strs[i] = std::wstring(p,s-p);  p = s+3;        }\r
+//                     else    {       strs[i] = p;    break;  }\r
+//             }\r
+       }\r
+       HMDT dat[m];\r
+       mreal dx = 1./m;\r
+       for(long i=0;i<m;i++)   dat[i]=mgl_data_subdata(dats,i,-1,-1);\r
+       for(long i=0;i<m;i++)   for(long j=0;j<m;j++)\r
+       {\r
+               g->InPlot(dx*i,dx*(i+1),dx*(m-j-1),dx*(m-j),true);\r
+               if(label)       g->Box();\r
+               gr->SetRanges(ranges->v(0,i),ranges->v(1,i),ranges->v(0,j),ranges->v(1,j));\r
+               gr->ResetPal();\r
+               gr->SetFontSize(fsize);\r
+               if(i==j)\r
+               {\r
+                       const char *tstl = wcschr(strs[i].c_str(),'\n') || wcsstr(strs[i].c_str(),L"\\n ") ? "a":"aV";\r
+                       mgl_putsw(gr, dx*(i+0.5), dx*(m-j-0.5),0, strs[i].c_str(), tstl, res);\r
+               }\r
+               else    mgl_plot_xy(gr,dat[i],dat[j],stl,NULL);\r
+       }\r
+       if(label)\r
+       {\r
+               for(long i=0;i<m;i+=2)\r
+               {\r
+                       gr->SetRanges(ranges->v(0,i),ranges->v(1,i),ranges->v(0,m-i-1),ranges->v(1,m-i-1));\r
+                       gr->SetFontSize(fsize); g->InPlot(dx*i,dx*(i+1),0,dx,true);     g->Axis("x");\r
+                       gr->SetFontSize(fsize); g->InPlot(0,dx,dx*i,dx*(i+1),true);     g->Axis("y");\r
+               }\r
+               for(long i=1;i<m;i+=2)\r
+               {\r
+                       gr->SetRanges(ranges->v(0,i),ranges->v(1,i),ranges->v(0,m-i-1),ranges->v(1,m-i-1));\r
+                       gr->SetFontSize(fsize); g->InPlot(dx*i,dx*(i+1),1-dx,1,true);   g->Axis("x^");\r
+                       gr->SetFontSize(fsize); g->InPlot(1-dx,1,dx*i,dx*(i+1),true);   g->Axis("y^");\r
+               }\r
+       }\r
+       delete []strs;  for(long i=0;i<m;i++)   delete dat[i];\r
+       g->InPlot(0,1,0,1,true);        gr->EndGroup(); gr->SetFontSize(ofsize);\r
+}\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_irisw_1(HMGL gr, HCDT dats, const wchar_t *ids, const char *stl, const char *opt)\r
+{\r
+       long n=dats->GetNy()*dats->GetNz(), m=dats->GetNx();\r
+       mglData ranges(2,m);\r
+       for(long i=0;i<m;i++)\r
+       {\r
+               mreal &v1=ranges.a[2*i], &v2=ranges.a[1+2*i];\r
+               v1=INFINITY;    v2=-INFINITY;\r
+               for(long j=0;j<n;j++)\r
+               {\r
+                       mreal v = dats->vthr(i+m*j);\r
+                       if(v<v1)        v1=v;\r
+                       if(v>v2)        v2=v;\r
+               }\r
+               if(!mgl_isnum(v1))      {       v1=-1;  v2=1;   }\r
+               if(v1==v2)      {       v1-=1;  v2+=1;  }\r
+       }\r
+       mgl_irisw(gr,dats,&ranges,ids,stl,opt);\r
+}\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_iris(HMGL gr, HCDT dats, HCDT ranges, const char *ids, const char *stl, const char *opt)\r
+{\r
+       MGL_TO_WCS(ids,mgl_irisw(gr, dats, ranges, wcs, stl, opt));\r
+}\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_iris_1(HMGL gr, HCDT dats, const char *ids, const char *stl, const char *opt)\r
+{\r
+       MGL_TO_WCS(ids,mgl_irisw_1(gr, dats, wcs, stl, opt));\r
+}\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_iris_(uintptr_t *gr, uintptr_t *dats, uintptr_t *ranges, const char *ids, const char *stl, const char *opt,int l,int m,int n)\r
+{      char *i=new char[l+1];  memcpy(i,ids,l);        i[l]=0;\r
+       char *s=new char[m+1];  memcpy(s,stl,m);        s[m]=0;\r
+       char *o=new char[n+1];  memcpy(o,opt,n);        o[n]=0;\r
+       mgl_iris(_GR_,_DA_(dats),_DA_(ranges),i,s,o);   delete []i;     delete []s;     delete []o;     }\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_iris_1_(uintptr_t *gr, uintptr_t *dats, const char *ids, const char *stl, const char *opt,int l,int m,int n)\r
+{      char *i=new char[l+1];  memcpy(i,ids,l);        i[l]=0;\r
+       char *s=new char[m+1];  memcpy(s,stl,m);        s[m]=0;\r
+       char *o=new char[n+1];  memcpy(o,opt,n);        o[n]=0;\r
+       mgl_iris_1(_GR_,_DA_(dats),i,s,o);      delete []i;     delete []s;     delete []o;     }\r
+//-----------------------------------------------------------------------------\r
index f9bb4180968b0823104573c50a2907c371314b68..2e632ec50a31a210da61708fc3b6d54d6ff82f89 100644 (file)
@@ -7,6 +7,7 @@
 #include <vector>
 #include <set>
 #include <limits>
+#include <mgl2/define.h>
 
 /*
        for use in s_hull_pro.cpp
index 288569d5549163ffbd30104dc16a05fd22481488..51c1efa82d447eed330ae16e5f4839703c720988 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * surf.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -29,19 +29,19 @@ void MGL_NO_EXPORT mgl_mesh_plot(mglBase *gr, long *pos, long n, long m, int how
        // NOTE: number of lines in each direction can be reduced too\r
        if(how&1)       for(long j=0;j<m;j+=dy)\r
        {\r
-               register long s,i;\r
-               for(s=i=0;i<n-1;i++)    if(pos[n*j+i]>=0 && pos[n*j+i+1]>=0)    s++;\r
+               long s=0;\r
+               for(long i=0;i<n-1;i++) if(pos[n*j+i]>=0 && pos[n*j+i+1]>=0)    s++;\r
                d = gr->FaceNum>0 ? gr->FaceNum+1 : n;  s = s>d?s/d:1;\r
-               for(i=0;i<n-s;i+=s)\r
+               for(long i=0;i<n-s;i+=s)\r
                        gr->line_plot(pos[n*j+i],pos[n*j+i+s]);\r
 \r
        }\r
        if(how&2)       for(long i=0;i<n;i+=dx)\r
        {\r
-               register long s,j;\r
-               for(s=j=0;j<m-1;j++)    if(pos[n*j+i]>=0 && pos[n*j+i+n]>=0)    s++;\r
+               long s=0;\r
+               for(long j=0;j<m-1;j++) if(pos[n*j+i]>=0 && pos[n*j+i+n]>=0)    s++;\r
                d = gr->FaceNum>0 ? gr->FaceNum+1 : n;  s = s>d?s/d:1;\r
-               for(j=0;j<m-s;j+=s)\r
+               for(long j=0;j<m-s;j+=s)\r
                        gr->line_plot(pos[n*j+i],pos[n*j+i+s*n]);\r
        }\r
 }\r
@@ -138,7 +138,7 @@ void MGL_EXPORT mgl_mesh_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co
                if(gr->NeedStop())      break;\r
                for(long j=0;j<m;j++)   for(long i=0;i<n;i++)\r
                {\r
-                       register mreal zz = z->v(i,j,k);\r
+                       mreal zz = z->v(i,j,k);\r
                        pos[i+n*j] = gr->AddPnt(mglPoint(GetX(x,i,j,k).x, GetY(y,i,j,k).x, zz),gr->GetC(ss,zz));\r
                }\r
                mgl_mesh_plot(gr,pos,n,m,3);\r
@@ -186,7 +186,7 @@ void MGL_EXPORT mgl_fall_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co
                if(gr->NeedStop())      break;\r
                for(long j=0;j<m;j++)   for(long i=0;i<n;i++)\r
                {\r
-                       register mreal zz = z->v(i,j,k);\r
+                       mreal zz = z->v(i,j,k);\r
                        pos[i+n*j] = gr->AddPnt(mglPoint(GetX(x,i,j,k).x, GetY(y,i,j,k).x, zz),gr->GetC(ss,zz));\r
                }\r
                mgl_mesh_plot(gr,pos,n,m, (mglchr(sch,'x')) ? 2:1);\r
@@ -428,9 +428,11 @@ void MGL_EXPORT mgl_surfa_(uintptr_t *gr, uintptr_t *z, uintptr_t *a, const char
 //\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_belt_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt)\r
+{      mgl_beltc_xy(gr,x,y,z,z,sch,opt);       }\r
+void MGL_EXPORT mgl_beltc_xy(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt)\r
 {\r
        long n=z->GetNx(),m=z->GetNy();\r
-       if(mgl_check_dim2(gr,x,y,z,0,"Belt"))   return;\r
+       if(mgl_check_dim2(gr,x,y,z,c,"Belt"))   return;\r
 \r
        gr->SaveState(opt);\r
        static int cgid=1;      gr->StartGroup("Belt",cgid++);\r
@@ -441,6 +443,7 @@ void MGL_EXPORT mgl_belt_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co
        bool how = !mglchr(sch,'x');\r
 \r
        mglPoint p1,p2,q,s,xx,yy;\r
+       int dk = c->GetNz()>=z->GetNz() ? 1:0;\r
        for(long k=0;k<z->GetNz();k++)\r
        {\r
                if(gr->NeedStop())      break;\r
@@ -452,10 +455,10 @@ void MGL_EXPORT mgl_belt_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co
                                p1.Set(xx.x, yy.x, z->v(i,j,k));\r
                                s.Set(xx.z, yy.z, z->dvy(i,j,k));\r
                                q.Set(xx.y, yy.y, 0);   s = q^s;\r
-                               register mreal c = gr->GetC(ss,p1.z);\r
+                               mreal cc = gr->GetC(ss,c->v(i,j,dk*k));\r
                                p2.Set(GetX(x,i+dx,j,k).x,GetY(y,i+dx,j,k).x,p1.z);\r
-                               pos[2*j] = gr->AddPnt(p1,c,s);\r
-                               pos[2*j+1]=gr->AddPnt(p2,c,s);\r
+                               pos[2*j] = gr->AddPnt(p1,cc,s);\r
+                               pos[2*j+1]=gr->AddPnt(p2,cc,s);\r
                        }\r
                        mgl_surf_plot(gr,pos,2,m);\r
                }\r
@@ -467,10 +470,10 @@ void MGL_EXPORT mgl_belt_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co
                                p1.Set(xx.x, yy.x, z->v(i,j,k));\r
                                q.Set(xx.y, yy.y, z->dvx(i,j,k));\r
                                s.Set(xx.z, yy.z, 0);   s = q^s;\r
-                               register mreal c = gr->GetC(ss,p1.z);\r
+                               mreal cc = gr->GetC(ss,c->v(i,j,dk*k));\r
                                p2.Set(GetX(x,i,j+dy,k).x,GetY(y,i,j+dy,k).x,p1.z);\r
-                               pos[2*i] = gr->AddPnt(p1,c,s);\r
-                               pos[2*i+1]=gr->AddPnt(p2,c,s);\r
+                               pos[2*i] = gr->AddPnt(p1,cc,s);\r
+                               pos[2*i+1]=gr->AddPnt(p2,cc,s);\r
                        }\r
                        mgl_surf_plot(gr,pos,2,n);\r
                }\r
@@ -479,12 +482,14 @@ void MGL_EXPORT mgl_belt_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_belt(HMGL gr, HCDT z, const char *sch, const char *opt)\r
+{      mgl_beltc(gr,z,z,sch,opt);      }\r
+void MGL_EXPORT mgl_beltc(HMGL gr, HCDT z, HCDT c, const char *sch, const char *opt)\r
 {\r
        gr->SaveState(opt);\r
        mglDataV x(z->GetNx()), y(z->GetNy());\r
        x.Fill(gr->Min.x,gr->Max.x);\r
        y.Fill(gr->Min.y,gr->Max.y);\r
-       mgl_belt_xy(gr,&x,&y,z,sch,0);\r
+       mgl_beltc_xy(gr,&x,&y,z,c,sch,0);\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_belt_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *a, const char *sch, const char *opt,int l,int lo)\r
@@ -497,6 +502,16 @@ void MGL_EXPORT mgl_belt_(uintptr_t *gr, uintptr_t *a, const char *sch, const ch
        char *o=new char[lo+1]; memcpy(o,opt,lo);       o[lo]=0;\r
        mgl_belt(_GR_, _DA_(a), s, o);  delete []o;     delete []s;     }\r
 //-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_beltc_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *a, uintptr_t *c, const char *sch, const char *opt,int l,int lo)\r
+{      char *s=new char[l+1];  memcpy(s,sch,l);        s[l]=0;\r
+       char *o=new char[lo+1];         memcpy(o,opt,lo);       o[lo]=0;\r
+       mgl_beltc_xy(_GR_, _DA_(x), _DA_(y), _DA_(a), _DA_(c), s, o);   delete []o;     delete []s;     }\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_beltc_(uintptr_t *gr, uintptr_t *a, uintptr_t *c, const char *sch, const char *opt,int l,int lo)\r
+{      char *s=new char[l+1];  memcpy(s,sch,l);        s[l]=0;\r
+       char *o=new char[lo+1]; memcpy(o,opt,lo);       o[lo]=0;\r
+       mgl_beltc(_GR_, _DA_(a), _DA_(c), s, o);        delete []o;     delete []s;     }\r
+//-----------------------------------------------------------------------------\r
 //\r
 //     Dens series\r
 //\r
@@ -559,7 +574,7 @@ void MGL_EXPORT mgl_stfa_(uintptr_t *gr, uintptr_t *re, uintptr_t *im, int *dn,
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_boxs_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt)\r
 {\r
-       register long i,j,k,n=z->GetNx(),m=z->GetNy();\r
+       long n=z->GetNx(),m=z->GetNy();\r
        if(mgl_check_dim2(gr,x,y,z,0,"Boxs",true))      return;\r
 \r
        gr->SaveState(opt);\r
@@ -575,10 +590,10 @@ void MGL_EXPORT mgl_boxs_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co
        mglPoint p1,p2,p3,p4,q,s,t(wire||full?NAN:0,0,1),xx,yy;\r
        mreal zz,z1,z2,x1,y1,x2,y2,x3,y3,c,z0=gr->GetOrgZ('x');\r
        long k1,k2,k3,k4,k5,k6,k7,k8;\r
-       for(k=0;k<z->GetNz();k++)\r
+       for(long k=0;k<z->GetNz();k++)\r
        {\r
                if(gr->NeedStop())      break;\r
-               for(i=0;i<n;i+=dx)      for(j=0;j<m;j+=dy)\r
+               for(long i=0;i<n;i+=dx) for(long j=0;j<m;j+=dy)\r
                {\r
                        zz = z->v(i,j,k);               c  = gr->GetC(ss,zz);\r
                        xx = GetX(x,i,j,k);             yy = GetY(y,i,j,k);\r
@@ -664,10 +679,10 @@ void MGL_EXPORT mgl_boxs_(uintptr_t *gr, uintptr_t *a, const char *sch, const ch
 //     Tile series\r
 //\r
 //-----------------------------------------------------------------------------\r
-void MGL_EXPORT mgl_tile_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt)\r
+void MGL_EXPORT mgl_tile_xyc(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt)\r
 {\r
        long n=z->GetNx(),m=z->GetNy();\r
-       if(mgl_check_dim2(gr,x,y,z,0,"Tile",true))      return;\r
+       if(mgl_check_dim2(gr,x,y,z,c,"Tile",true))      return;\r
 \r
        gr->SaveState(opt);\r
        static int cgid=1;      gr->StartGroup("Tile",cgid++);\r
@@ -676,46 +691,88 @@ void MGL_EXPORT mgl_tile_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co
 \r
        long ss = gr->AddTexture(sch);\r
        gr->Reserve(4*n*m*z->GetNz());\r
+       bool alongX = mglchr(sch,'x');\r
+       bool alongY = mglchr(mglchr(sch,':'),'y');\r
 \r
        mglPoint s(0,0,1);\r
        for(long k=0;k<z->GetNz();k++)\r
        {\r
                if(gr->NeedStop())      break;\r
-               for(long j=0;j<m;j+=dx) for(long i=0;i<n;i+=dy)\r
+               if(alongX)      for(long j=0;j<m;j+=dx) for(long i=0;i<n;i+=dy)\r
+               {\r
+                       mreal zz = z->v(i,j,k), cc = gr->GetC(ss,c->v(i,j,k));\r
+                       mreal xx = GetX(x,i,j,k).x, yy = GetY(y,i,j,k).x;\r
+                       long k1 = gr->AddPnt(mglPoint(xx,yy,zz),cc,s);\r
+                       zz = i<lx-dx ? z->v(i+dx,j,k):NAN;\r
+                       yy = i<lx-dx ? GetY(y,i+dx,j,k).x:NAN;\r
+                       long k2 = gr->AddPnt(mglPoint(xx,yy,zz),cc,s);\r
+                       zz = j<ly-dy ? z->v(i,j+dy,k):NAN;\r
+                       yy = j<ly-dy ? GetY(y,i,j+dy,k).x:NAN;\r
+                       long k3 = gr->AddPnt(mglPoint(xx,yy,zz),cc,s);\r
+                       zz = i<lx-dx && j<ly-dy ? z->v(i+dx,j+dy,k):NAN;\r
+                       yy = i<lx-dx && j<ly-dy ? GetY(y,i+dx,j+dy,k).x:NAN;\r
+                       long k4 = gr->AddPnt(mglPoint(xx,yy,zz),cc,s);\r
+                       gr->quad_plot(k1,k2,k3,k4);\r
+               }\r
+               else if(alongY) for(long j=0;j<m;j+=dx) for(long i=0;i<n;i+=dy)\r
+               {\r
+                       mreal zz = z->v(i,j,k), cc = gr->GetC(ss,c->v(i,j,k));\r
+                       mreal xx = GetX(x,i,j,k).x, yy = GetY(y,i,j,k).x;\r
+                       long k1 = gr->AddPnt(mglPoint(xx,yy,zz),cc,s);\r
+                       xx = i<lx-dx ? GetX(x,i+dx,j,k).x:NAN;\r
+                       zz = i<lx-dx ? z->v(i+dx,j,k):NAN;\r
+                       long k2 = gr->AddPnt(mglPoint(xx,yy,zz),cc,s);\r
+                       xx = j<ly-dy ? GetX(x,i,j+dy,k).x:NAN;\r
+                       zz = j<ly-dy ? z->v(i,j+dy,k):NAN;\r
+                       long k3 = gr->AddPnt(mglPoint(xx,yy,zz),cc,s);\r
+                       xx = i<lx-dx && j<ly-dy ? GetX(x,i+dx,j+dy,k).x:NAN;\r
+                       zz = i<lx-dx && j<ly-dy ? z->v(i+dx,j+dy,k):NAN;\r
+                       long k4 = gr->AddPnt(mglPoint(xx,yy,zz),cc,s);\r
+                       gr->quad_plot(k1,k2,k3,k4);\r
+               }\r
+               else    for(long j=0;j<m;j+=dx) for(long i=0;i<n;i+=dy)\r
                {\r
-                       register mreal zz = z->v(i,j,k), c = gr->GetC(ss,zz);\r
-                       register mreal xx = GetX(x,i,j,k).x, yy = GetY(y,i,j,k).x;\r
-                       register long k1 = gr->AddPnt(mglPoint(xx,yy,zz),c,s);\r
+                       mreal zz = z->v(i,j,k), cc = gr->GetC(ss,c->v(i,j,k));\r
+                       mreal xx = GetX(x,i,j,k).x, yy = GetY(y,i,j,k).x;\r
+                       long k1 = gr->AddPnt(mglPoint(xx,yy,zz),cc,s);\r
                        xx = i<lx-dx ? GetX(x,i+dx,j,k).x:NAN;\r
                        yy = i<lx-dx ? GetY(y,i+dx,j,k).x:NAN;\r
-                       register long k2 = gr->AddPnt(mglPoint(xx,yy,zz),c,s);\r
+                       long k2 = gr->AddPnt(mglPoint(xx,yy,zz),cc,s);\r
                        xx = j<ly-dy ? GetX(x,i,j+dy,k).x:NAN;\r
                        yy = j<ly-dy ? GetY(y,i,j+dy,k).x:NAN;\r
-                       register long k3 = gr->AddPnt(mglPoint(xx,yy,zz),c,s);\r
+                       long k3 = gr->AddPnt(mglPoint(xx,yy,zz),cc,s);\r
                        xx = i<lx-dx && j<ly-dy ? GetX(x,i+dx,j+dy,k).x:NAN;\r
                        yy = i<lx-dx && j<ly-dy ? GetY(y,i+dx,j+dy,k).x:NAN;\r
-                       register long k4 = gr->AddPnt(mglPoint(xx,yy,zz),c,s);\r
+                       long k4 = gr->AddPnt(mglPoint(xx,yy,zz),cc,s);\r
                        gr->quad_plot(k1,k2,k3,k4);\r
                }\r
        }\r
        gr->EndGroup();\r
 }\r
 //-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_tile_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt)\r
+{      mgl_tile_xyc(gr,x,y,z,z,sch,opt);       }\r
+//-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_tile(HMGL gr, HCDT z, const char *sch, const char *opt)\r
 {\r
        gr->SaveState(opt);\r
        mglDataV x(z->GetNx()+1), y(z->GetNy()+1);\r
        x.Fill(gr->Min.x,gr->Max.x);\r
        y.Fill(gr->Min.y,gr->Max.y);\r
-       mgl_tile_xy(gr,&x,&y,z,sch,0);\r
+       mgl_tile_xyc(gr,&x,&y,z,z,sch,0);\r
 }\r
 //-----------------------------------------------------------------------------\r
-void MGL_EXPORT mgl_tile_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *a, const char *sch, const char *opt,int l,int lo)\r
+void MGL_EXPORT mgl_tile_xyc_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int l,int lo)\r
 {      char *s=new char[l+1];  memcpy(s,sch,l);        s[l]=0;\r
        char *o=new char[lo+1];         memcpy(o,opt,lo);       o[lo]=0;\r
-       mgl_tile_xy(_GR_, _DA_(x), _DA_(y), _DA_(a), s, o);     delete []o;     delete []s;     }\r
+       mgl_tile_xyc(_GR_, _DA_(x), _DA_(y), _DA_(z), _DA_(c), s, o);   delete []o;     delete []s;     }\r
 //-----------------------------------------------------------------------------\r
-void MGL_EXPORT mgl_tile_(uintptr_t *gr, uintptr_t *a, const char *sch, const char *opt,int l,int lo)\r
+void MGL_EXPORT mgl_tile_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int l,int lo)\r
+{      char *s=new char[l+1];  memcpy(s,sch,l);        s[l]=0;\r
+       char *o=new char[lo+1];         memcpy(o,opt,lo);       o[lo]=0;\r
+       mgl_tile_xy(_GR_, _DA_(x), _DA_(y), _DA_(z), s, o);     delete []o;     delete []s;     }\r
+       //-----------------------------------------------------------------------------\r
+       void MGL_EXPORT mgl_tile_(uintptr_t *gr, uintptr_t *a, const char *sch, const char *opt,int l,int lo)\r
 {      char *s=new char[l+1];  memcpy(s,sch,l);        s[l]=0;\r
        char *o=new char[lo+1];         memcpy(o,opt,lo);       o[lo]=0;\r
        mgl_tile(_GR_, _DA_(a), s, o);  delete []o;     delete []s;     }\r
@@ -724,64 +781,105 @@ void MGL_EXPORT mgl_tile_(uintptr_t *gr, uintptr_t *a, const char *sch, const ch
 //     TileS series\r
 //\r
 //-----------------------------------------------------------------------------\r
-void MGL_EXPORT mgl_tiles_xy(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT s, const char *sch, const char *opt)\r
+void MGL_EXPORT mgl_tiles_xyc(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT s, HCDT c, const char *sch, const char *opt)\r
 {\r
        long n=z->GetNx(),m=z->GetNy();\r
        if(mgl_check_dim2(gr,x,y,z,s,"TileS",true))     return;\r
+       if(mgl_check_dim2(gr,x,y,z,c,"TileS",true))     return;\r
 \r
        gr->SaveState(opt);\r
        static int cgid=1;      gr->StartGroup("TileS",cgid++);\r
        long ly = x->GetNy()>=z->GetNy() ? y->GetNy() : y->GetNx(), lx = x->GetNx();\r
        int d = gr->MeshNum>0 ? gr->MeshNum+1 : n*m, dx = n>d?n/d:1, dy = m>d?m/d:1;\r
 \r
-       long cc = gr->AddTexture(sch);\r
+       long sc = gr->AddTexture(sch);\r
        gr->Reserve(4*n*m*z->GetNz());\r
+       bool alongX = mglchr(sch,'x');\r
+       bool alongY = mglchr(mglchr(sch,':'),'y');\r
 \r
        mglPoint t(0,0,1);\r
        mreal x1,x2,x3,x4,y1,y2,y3,y4;\r
        for(long k=0;k<z->GetNz();k++)\r
        {\r
                if(gr->NeedStop())      break;\r
-               for(long j=0;j<m;j+=dx) for(long i=0;i<n;i+=dy)\r
+               if(alongX)      for(long j=0;j<m;j+=dx) for(long i=0;i<n;i+=dy)\r
+               {\r
+                       mreal xx = GetX(x,i,j,k).x, cc = gr->GetC(sc,c->v(i,j,k));\r
+                       mreal ss = (1-gr->GetA(s->v(i,j,k)))/2, sm = 1-ss;\r
+                       x1 = z->v(i,j,k);       y1 = GetY(y,i,j,k).x;\r
+                       x2 = x3 = x4 = y2 = y3 = y4 = NAN;\r
+                       if(i<lx-dx)     {       x2 = z->v(i+dx,j,k)-x1; y2 = GetY(y,i+dx,j,k).x-y1;     }\r
+                       if(j<ly-dy)     {       x4 = z->v(i,j+dy,k)-x1; y4 = GetY(y,i,j+dy,k).x-y1;     }\r
+                       if(i<lx-dx && j<ly-dy)\r
+                       {       x3 = z->v(i+dx,j+dy,k)-x2-x4-x1;        y3 = GetY(y,i+dx,j+dy,k).x-y2-y4-y1;    }\r
+\r
+                       long k1 = gr->AddPnt(mglPoint(xx, y1+y2*ss+y4*ss+y3*ss*ss, x1+x2*ss+x4*ss+x3*ss*ss),cc,t);\r
+                       long k2 = gr->AddPnt(mglPoint(xx, y1+y2*sm+y4*ss+y3*ss*sm, x1+x2*sm+x4*ss+x3*ss*sm),cc,t);\r
+                       long k3 = gr->AddPnt(mglPoint(xx, y1+y2*ss+y4*sm+y3*ss*sm, x1+x2*ss+x4*sm+x3*ss*sm),cc,t);\r
+                       long k4 = gr->AddPnt(mglPoint(xx, y1+y2*sm+y4*sm+y3*sm*sm, x1+x2*sm+x4*sm+x3*sm*sm),cc,t);\r
+                       gr->quad_plot(k1,k2,k3,k4);\r
+               }\r
+               else if(alongY) for(long j=0;j<m;j+=dx) for(long i=0;i<n;i+=dy)\r
                {\r
-                       register mreal zz = z->v(i,j,k), c = gr->GetC(cc,zz);\r
-                       register mreal ss = (1-gr->GetA(s->v(i,j,k)))/2, sm = 1-ss;\r
+                       mreal yy = GetY(y,i,j,k).x, cc = gr->GetC(sc,c->v(i,j,k));\r
+                       mreal ss = (1-gr->GetA(s->v(i,j,k)))/2, sm = 1-ss;\r
+                       x1 = GetX(x,i,j,k).x;   y1 = z->v(i,j,k);\r
+                       x2 = x3 = x4 = y2 = y3 = y4 = NAN;\r
+                       if(i<lx-dx)     {       x2 = GetX(x,i+dx,j,k).x-x1;     y2 = z->v(i+dx,j,k)-y1; }\r
+                       if(j<ly-dy)     {       x4 = GetX(x,i,j+dy,k).x-x1;     y4 = z->v(i,j+dy,k)-y1; }\r
+                       if(i<lx-dx && j<ly-dy)\r
+                       {       x3 = GetX(x,i+dx,j+dy,k).x-x2-x4-x1;    y3 = z->v(i+dx,j+dy,k)-y2-y4-y1;        }\r
 \r
+                       long k1 = gr->AddPnt(mglPoint(x1+x2*ss+x4*ss+x3*ss*ss, yy, y1+y2*ss+y4*ss+y3*ss*ss),cc,t);\r
+                       long k2 = gr->AddPnt(mglPoint(x1+x2*sm+x4*ss+x3*ss*sm, yy, y1+y2*sm+y4*ss+y3*ss*sm),cc,t);\r
+                       long k3 = gr->AddPnt(mglPoint(x1+x2*ss+x4*sm+x3*ss*sm, yy, y1+y2*ss+y4*sm+y3*ss*sm),cc,t);\r
+                       long k4 = gr->AddPnt(mglPoint(x1+x2*sm+x4*sm+x3*sm*sm, yy, y1+y2*sm+y4*sm+y3*sm*sm),cc,t);\r
+                       gr->quad_plot(k1,k2,k3,k4);\r
+               }\r
+               else    for(long j=0;j<m;j+=dx) for(long i=0;i<n;i+=dy)\r
+               {\r
+                       mreal zz = z->v(i,j,k), cc = gr->GetC(sc,c->v(i,j,k));\r
+                       mreal ss = (1-gr->GetA(s->v(i,j,k)))/2, sm = 1-ss;\r
                        x1 = GetX(x,i,j,k).x;   y1 = GetY(y,i,j,k).x;\r
                        x2 = x3 = x4 = y2 = y3 = y4 = NAN;\r
-                       if(i<lx-dx)\r
-                       {       x2 = GetX(x,i+dx,j,k).x-x1;     y2 = GetY(y,i+dx,j,k).x-y1;     }\r
-                       if(j<ly-dy)\r
-                       {       x4 = GetX(x,i,j+dy,k).x-x1;     y4 = GetY(y,i,j+dy,k).x-y1;     }\r
+                       if(i<lx-dx)     {       x2 = GetX(x,i+dx,j,k).x-x1;     y2 = GetY(y,i+dx,j,k).x-y1;     }\r
+                       if(j<ly-dy)     {       x4 = GetX(x,i,j+dy,k).x-x1;     y4 = GetY(y,i,j+dy,k).x-y1;     }\r
                        if(i<lx-dx && j<ly-dy)\r
-                       {       x3 = GetX(x,i+dx,j+dy,k).x-x2-x4-x1;\r
-                               y3 = GetY(y,i+dx,j+dy,k).x-y2-y4-y1;    }\r
+                       {       x3 = GetX(x,i+dx,j+dy,k).x-x2-x4-x1;    y3 = GetY(y,i+dx,j+dy,k).x-y2-y4-y1;    }\r
 \r
-                       register long k1 = gr->AddPnt(mglPoint(x1+x2*ss+x4*ss+x3*ss*ss, y1+y2*ss+y4*ss+y3*ss*ss, zz),c,t);\r
-                       register long k2 = gr->AddPnt(mglPoint(x1+x2*sm+x4*ss+x3*ss*sm, y1+y2*sm+y4*ss+y3*ss*sm, zz),c,t);\r
-                       register long k3 = gr->AddPnt(mglPoint(x1+x2*ss+x4*sm+x3*ss*sm, y1+y2*ss+y4*sm+y3*ss*sm, zz),c,t);\r
-                       register long k4 = gr->AddPnt(mglPoint(x1+x2*sm+x4*sm+x3*sm*sm, y1+y2*sm+y4*sm+y3*sm*sm, zz),c,t);\r
+                       long k1 = gr->AddPnt(mglPoint(x1+x2*ss+x4*ss+x3*ss*ss, y1+y2*ss+y4*ss+y3*ss*ss, zz),cc,t);\r
+                       long k2 = gr->AddPnt(mglPoint(x1+x2*sm+x4*ss+x3*ss*sm, y1+y2*sm+y4*ss+y3*ss*sm, zz),cc,t);\r
+                       long k3 = gr->AddPnt(mglPoint(x1+x2*ss+x4*sm+x3*ss*sm, y1+y2*ss+y4*sm+y3*ss*sm, zz),cc,t);\r
+                       long k4 = gr->AddPnt(mglPoint(x1+x2*sm+x4*sm+x3*sm*sm, y1+y2*sm+y4*sm+y3*sm*sm, zz),cc,t);\r
                        gr->quad_plot(k1,k2,k3,k4);\r
                }\r
        }\r
        gr->EndGroup();\r
 }\r
 //-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_tiles_xy(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT s, const char *sch, const char *opt)\r
+{      mgl_tiles_xyc(gr,x,y,z,s,z,sch,opt);    }\r
+//-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_tiles(HMGL gr, HCDT z, HCDT s, const char *sch, const char *opt)\r
 {\r
        gr->SaveState(opt);\r
        mglDataV x(z->GetNx()+1), y(z->GetNy()+1);\r
        x.Fill(gr->Min.x,gr->Max.x);\r
        y.Fill(gr->Min.y,gr->Max.y);\r
-       mgl_tiles_xy(gr,&x,&y,z,s,sch,0);\r
+       mgl_tiles_xyc(gr,&x,&y,z,s,z,sch,0);\r
 }\r
 //-----------------------------------------------------------------------------\r
-void MGL_EXPORT mgl_tiles_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *a, uintptr_t *r, const char *sch, const char *opt,int l,int lo)\r
+void MGL_EXPORT mgl_tiles_xyc_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *r, uintptr_t *c, const char *sch, const char *opt,int l,int lo)\r
 {      char *s=new char[l+1];  memcpy(s,sch,l);        s[l]=0;\r
        char *o=new char[lo+1];         memcpy(o,opt,lo);       o[lo]=0;\r
-       mgl_tiles_xy(_GR_, _DA_(x), _DA_(y), _DA_(a), _DA_(r), s, o);   delete []o;     delete []s;     }\r
+       mgl_tiles_xyc(_GR_, _DA_(x), _DA_(y), _DA_(z), _DA_(r), _DA_(c), s, o); delete []o;     delete []s;     }\r
 //-----------------------------------------------------------------------------\r
-void MGL_EXPORT mgl_tiles_(uintptr_t *gr, uintptr_t *a, uintptr_t *r, const char *sch, const char *opt,int l,int lo)\r
+void MGL_EXPORT mgl_tiles_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *r, const char *sch, const char *opt,int l,int lo)\r
+{      char *s=new char[l+1];  memcpy(s,sch,l);        s[l]=0;\r
+       char *o=new char[lo+1];         memcpy(o,opt,lo);       o[lo]=0;\r
+       mgl_tiles_xy(_GR_, _DA_(x), _DA_(y), _DA_(z), _DA_(r), s, o);   delete []o;     delete []s;     }\r
+       //-----------------------------------------------------------------------------\r
+       void MGL_EXPORT mgl_tiles_(uintptr_t *gr, uintptr_t *a, uintptr_t *r, const char *sch, const char *opt,int l,int lo)\r
 {      char *s=new char[l+1];  memcpy(s,sch,l);        s[l]=0;\r
        char *o=new char[lo+1];         memcpy(o,opt,lo);       o[lo]=0;\r
        mgl_tiles(_GR_, _DA_(a), _DA_(r), s, o);        delete []o;     delete []s;     }\r
@@ -809,14 +907,14 @@ void MGL_EXPORT mgl_map_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char
 #pragma omp parallel for collapse(2)\r
        for(long j=0;j<m;j++)   for(long i=0;i<n;i++)\r
        {\r
-               register long s1 = i>0 ? 1:0, s2 = i<n-1 ? 1:0;\r
-               register mreal xdx = (ax->v(i+s2,j)-ax->v(i-s1,j))/(GetX(x,i+s2,j).x-GetX(x,i-s1,j).x);\r
-               register mreal ydx = (ay->v(i+s2,j)-ay->v(i-s1,j))/(GetX(x,i+s2,j).x-GetX(x,i-s1,j).x);\r
+               long s1 = i>0 ? 1:0, s2 = i<n-1 ? 1:0;\r
+               mreal xdx = (ax->v(i+s2,j)-ax->v(i-s1,j))/(GetX(x,i+s2,j).x-GetX(x,i-s1,j).x);\r
+               mreal ydx = (ay->v(i+s2,j)-ay->v(i-s1,j))/(GetX(x,i+s2,j).x-GetX(x,i-s1,j).x);\r
                s1 = j>0 ? s:0;         s2 = j<m-1 ? s:0;\r
-               register mreal xdy = (ax->v(i,j+s2)-ax->v(i,j-s1))/(GetY(y,i,j+s2).x-GetY(y,i,j-s1).x);\r
-               register mreal ydy = (ay->v(i,j+s2)-ay->v(i,j-s1))/(GetY(y,i,j+s2).x-GetY(y,i,j-s1).x);\r
+               mreal xdy = (ax->v(i,j+s2)-ax->v(i,j-s1))/(GetY(y,i,j+s2).x-GetY(y,i,j-s1).x);\r
+               mreal ydy = (ay->v(i,j+s2)-ay->v(i,j-s1))/(GetY(y,i,j+s2).x-GetY(y,i,j-s1).x);\r
                xdx = xdx*ydy - xdy*ydx;        // Jacobian\r
-               register mreal xx,yy;\r
+               mreal xx,yy;\r
 \r
                if(nboth)\r
                {\r
@@ -828,8 +926,10 @@ void MGL_EXPORT mgl_map_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char
                        xx = (x->v(i,j) - gr->Min.x)/(gr->Max.x - gr->Min.x);\r
                        yy = (y->v(i,j) - gr->Min.y)/(gr->Max.y - gr->Min.y);\r
                }\r
-               if(xx<0)        xx=0;   if(xx>=1)       xx=1/MGL_FEPSILON;\r
-               if(yy<0)        yy=0;   if(yy>=1)       yy=1/MGL_FEPSILON;\r
+               if(xx<0)        xx=0;\r
+               if(xx>=1)       xx=1/MGL_FEPSILON;\r
+               if(yy<0)        yy=0;\r
+               if(yy>=1)       yy=1/MGL_FEPSILON;\r
                pos[i+n*j] = gr->AddPnt(mglPoint(ax->v(i,j), ay->v(i,j), xdx),gr->GetC(ss,xx,false),t,yy);\r
        }\r
        if(sch && mglchr(sch,'.'))\r
index 6f277e65a8bd43e18b7923f579bc88fbadd0a791..86deba28bd475d631c4e18fbff411c4c92e07af1 100644 (file)
@@ -20,8 +20,8 @@
 #include "mgl2/font.h"
 
 /// Table of LaTeX symbols and its UTF8 codes. This array MUST BE sorted!!!
-MGL_EXPORT long mgl_tex_num=1924;
-MGL_EXPORT mglTeXsymb mgl_tex_symb[] = {
+const size_t mgl_tex_num=1924;
+const mglTeXsymb mgl_tex_symb[] = {
        {0x23, L"#"},
        {0x25, L"%"},
        {0x26, L"&"},
index 9ef80fa7bdd7f1b224b3252da61adf35b35ac052..253e140d0ec4a398454e51b0b0b1da770d2f1efa 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * vect.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -39,7 +39,8 @@ void MGL_EXPORT mgl_traj_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay,
        long m = x->GetNy()>y->GetNy() ? x->GetNy():y->GetNy();\r
        long i = ax->GetNy()>ay->GetNy() ? ax->GetNy():ay->GetNy();\r
        long j = z->GetNy()>az->GetNy() ? z->GetNy():az->GetNy();\r
-       if(i>m) m=i;    if(j>m) m=j;\r
+       if(i>m) m=i;\r
+       if(j>m) m=j;\r
        gr->SetPenPal(sch,&pal);        gr->Reserve(4*n*m);\r
 \r
        mglPoint p1,p2;\r
@@ -63,7 +64,7 @@ void MGL_EXPORT mgl_traj_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay,
                        mreal dd = p2.norm();\r
                        if(len==0)\r
                        {\r
-                               register mreal dx,dy,dz;\r
+                               mreal dx,dy,dz;\r
                                if(i<n-1)\r
                                {       dx=x->v(i+1,nx)-p1.x;   dy=y->v(i+1,ny)-p1.y;   dz=z->v(i+1,nz)-p1.z;   }\r
                                else\r
@@ -118,7 +119,8 @@ void MGL_EXPORT mgl_vect_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const cha
 \r
        long tx=1,ty=1;\r
        if(gr->MeshNum>1)       {       tx=(n-1)/(gr->MeshNum-1);       ty=(m-1)/(gr->MeshNum-1);       }\r
-       if(tx<1)        tx=1;   if(ty<1)        ty=1;\r
+       if(tx<1)        tx=1;\r
+       if(ty<1)        ty=1;\r
 \r
        mreal xm=0,cm=0,ca=0;\r
        mreal dm=(fabs(gr->Max.c)+fabs(gr->Min.c))*1e-5;\r
@@ -199,7 +201,7 @@ void MGL_EXPORT mgl_vect_2d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, const
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_vect_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt)\r
 {\r
-       register long n=ax->GetNx(),m=ax->GetNy(),l=ax->GetNz();\r
+       long n=ax->GetNx(),m=ax->GetNy(),l=ax->GetNz();\r
        if(mgl_check_vec3(gr,x,y,z,ax,ay,az,"Vect_3d")) return;\r
 \r
        gr->SaveState(opt);\r
@@ -215,7 +217,9 @@ void MGL_EXPORT mgl_vect_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay,
        long tx=1,ty=1,tz=1;\r
        if(gr->MeshNum>1)\r
        {       tx=(n-1)/(gr->MeshNum-1);       ty=(m-1)/(gr->MeshNum-1);       tz=(l-1)/(gr->MeshNum-1);}\r
-       if(tx<1)        tx=1;   if(ty<1)        ty=1;   if(tz<1)        tz=1;\r
+       if(tx<1)        tx=1;\r
+       if(ty<1)        ty=1;\r
+       if(tz<1)        tz=1;\r
 \r
        mreal xm=0,cm=0,ca=0;\r
        mreal dm=(fabs(gr->Max.c)+fabs(gr->Min.c))*1e-5;\r
@@ -243,7 +247,7 @@ void MGL_EXPORT mgl_vect_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay,
 #pragma omp critical(max_vec)\r
                {cm = cm<cm1 ? cm1:cm;  xm = xm<xm1 ? xm1:xm;}\r
        }\r
-       ca /= (n*m*l)/(tx*ty*tz);\r
+       ca /= mreal(n*m*l)/mreal(tx*ty*tz);\r
        xm = xm?1./xm:0;        cm = cm?1./cm:0;\r
 \r
        for(long k=0;k<l;k+=tz)\r
@@ -319,7 +323,7 @@ void MGL_NO_EXPORT mgl_get_slice(_mgl_vec_slice &s, HCDT x, HCDT y, HCDT z, HCDT
 #pragma omp parallel for collapse(2)\r
                        for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
                        {\r
-                               register long i0 = i+nx*j;\r
+                               long i0 = i+nx*j;\r
                                s.x.a[i0] = x->v(p,i,j)*(1-d) + x->v(p+1,i,j)*d;\r
                                s.y.a[i0] = y->v(p,i,j)*(1-d) + y->v(p+1,i,j)*d;\r
                                s.z.a[i0] = z->v(p,i,j)*(1-d) + z->v(p+1,i,j)*d;\r
@@ -331,7 +335,7 @@ void MGL_NO_EXPORT mgl_get_slice(_mgl_vec_slice &s, HCDT x, HCDT y, HCDT z, HCDT
 #pragma omp parallel for collapse(2)\r
                        for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
                        {\r
-                               register long i0 = i+nx*j;\r
+                               long i0 = i+nx*j;\r
                                s.x.a[i0] = x->v(i,p,j)*(1-d) + x->v(i,p+1,j)*d;\r
                                s.y.a[i0] = y->v(i,p,j)*(1-d) + y->v(i,p+1,j)*d;\r
                                s.z.a[i0] = z->v(i,p,j)*(1-d) + z->v(i,p+1,j)*d;\r
@@ -343,7 +347,7 @@ void MGL_NO_EXPORT mgl_get_slice(_mgl_vec_slice &s, HCDT x, HCDT y, HCDT z, HCDT
 #pragma omp parallel for collapse(2)\r
                        for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
                        {\r
-                               register long i0 = i+nx*j;\r
+                               long i0 = i+nx*j;\r
                                s.x.a[i0] = x->v(i,j,p)*(1-d) + x->v(i,j,p+1)*d;\r
                                s.y.a[i0] = y->v(i,j,p)*(1-d) + y->v(i,j,p+1)*d;\r
                                s.z.a[i0] = z->v(i,j,p)*(1-d) + z->v(i,j,p+1)*d;\r
@@ -360,7 +364,7 @@ void MGL_NO_EXPORT mgl_get_slice(_mgl_vec_slice &s, HCDT x, HCDT y, HCDT z, HCDT
 #pragma omp parallel for collapse(2)\r
                        for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
                        {\r
-                               register long i0 = i+nx*j;      s.x.a[i0] = v;\r
+                               long i0 = i+nx*j;       s.x.a[i0] = v;\r
                                s.y.a[i0] = y->v(i);    s.z.a[i0] = z->v(j);\r
                                s.ax.a[i0] = ax->v(p,i,j)*(1-d) + ax->v(p+1,i,j)*d;\r
                                s.ay.a[i0] = ay->v(p,i,j)*(1-d) + ay->v(p+1,i,j)*d;\r
@@ -373,7 +377,7 @@ void MGL_NO_EXPORT mgl_get_slice(_mgl_vec_slice &s, HCDT x, HCDT y, HCDT z, HCDT
 #pragma omp parallel for collapse(2)\r
                        for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
                        {\r
-                               register long i0 = i+nx*j;      s.y.a[i0] = v;\r
+                               long i0 = i+nx*j;       s.y.a[i0] = v;\r
                                s.x.a[i0] = x->v(i);    s.z.a[i0] = z->v(j);\r
                                s.ax.a[i0] = ax->v(i,p,j)*(1-d) + ax->v(i,p+1,j)*d;\r
                                s.ay.a[i0] = ay->v(i,p,j)*(1-d) + ay->v(i,p+1,j)*d;\r
@@ -386,7 +390,7 @@ void MGL_NO_EXPORT mgl_get_slice(_mgl_vec_slice &s, HCDT x, HCDT y, HCDT z, HCDT
 #pragma omp parallel for collapse(2)\r
                        for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
                        {\r
-                               register long i0 = i+nx*j;      s.z.a[i0] = v;\r
+                               long i0 = i+nx*j;       s.z.a[i0] = v;\r
                                s.x.a[i0] = x->v(i);    s.y.a[i0] = y->v(j);\r
                                s.ax.a[i0] = ax->v(i,j,p)*(1-d) + ax->v(i,j,p+1)*d;\r
                                s.ay.a[i0] = ay->v(i,j,p)*(1-d) + ay->v(i,j,p+1)*d;\r
@@ -419,7 +423,8 @@ void MGL_EXPORT mgl_vect3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay,
 \r
        long n=s.ax.nx,m=s.ax.ny, tx=1,ty=1;\r
        if(gr->MeshNum>1)       {       tx=(n-1)/(gr->MeshNum-1);       ty=(m-1)/(gr->MeshNum-1);       }\r
-       if(tx<1)        tx=1;   if(ty<1)        ty=1;\r
+       if(tx<1)        tx=1;\r
+       if(ty<1)        ty=1;\r
        mreal xm=0,cm=0,ca=0;\r
        mreal dm=(fabs(gr->Max.c)+fabs(gr->Min.c))*1e-5;\r
        // use whole array for determining maximal vectors length\r
@@ -432,7 +437,7 @@ void MGL_EXPORT mgl_vect3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay,
 #pragma omp for nowait collapse(2) reduction(+:ca)\r
                for(long i=0;i<n;i+=tx) for(long j=0;j<m;j+=ty)\r
                {\r
-                       register long i0 = i+n*j;\r
+                       long i0 = i+n*j;\r
                        xx = s.x.a[i0]; yy = s.y.a[i0]; zz = s.z.a[i0];\r
                        p1 = i<n-1 ? mglPoint(s.x.a[i0+tx]-xx, s.y.a[i0+tx]-yy, s.z.a[i0+tx]-zz) : mglPoint(xx-s.x.a[i0-tx], yy-s.y.a[i0-tx], zz-s.z.a[i0-tx]);\r
                        p2 = j<m-1 ? mglPoint(s.x.a[i0+tn]-xx, s.y.a[i0+tn]-yy, s.z.a[i0+tn]-zz) : mglPoint(xx-s.x.a[i0-tn], yy-s.y.a[i0-tn], zz-s.z.a[i0-tn]);\r
@@ -447,12 +452,12 @@ void MGL_EXPORT mgl_vect3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay,
 #pragma omp critical(max_vec)\r
                {cm = cm<cm1 ? cm1:cm;  xm = xm<xm1 ? xm1:xm;}\r
        }\r
-       ca /= (n*m)/(tx*ty);\r
+       ca /= mreal(n*m)/mreal(tx*ty);\r
        xm = xm?1./xm:0;        cm = cm?1./cm:0;\r
 \r
        for(long i=0;i<n;i+=tx) for(long j=0;j<m;j+=ty)\r
        {\r
-               register long i0 = i+n*j;\r
+               long i0 = i+n*j;\r
                d.Set(s.x.a[i0], s.y.a[i0], s.z.a[i0]);\r
                v.Set(s.ax.a[i0], s.ay.a[i0], s.az.a[i0]);\r
                mreal dd = v.norm(),c1,c2;\r
@@ -498,23 +503,24 @@ void MGL_EXPORT mgl_vect3_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, uintptr_
 //     Flow 2d series\r
 //\r
 //-----------------------------------------------------------------------------\r
-void MGL_NO_EXPORT flow(mglBase *gr, double zVal, double u, double v, const mglData &x, const mglData &y, const mglData &ax, const mglData &ay, long ss, bool vv)\r
+void MGL_NO_EXPORT flow(mglBase *gr, double zVal, double u, double v, HCDT x, HCDT y, HCDT ax, HCDT ay, long ss, bool vv)\r
 {\r
-       long n=100*(ax.nx+ax.ny);\r
-       bool nboth = x.nx*x.ny!=ax.nx*ax.ny || y.nx*y.ny!=ax.nx*ax.ny;\r
+       long n=100*(ax->GetNx()+ax->GetNy());\r
+       bool nboth = x->GetNx()*x->GetNy()!=ax->GetNx()*ax->GetNy() || y->GetNx()*y->GetNy()!=ax->GetNx()*ax->GetNy();\r
 \r
        mglPoint *pp = new mglPoint[n], dp;\r
        mglPoint dx(1/fabs(gr->Max.x-gr->Min.x),1/fabs(gr->Max.y-gr->Min.y),1/fabs(gr->Max.z-gr->Min.z));\r
-       mglPoint nx(ax.nx,ax.ny);\r
+       mglPoint nx(ax->GetNx(),ax->GetNy());\r
 \r
-       mreal dt = 0.5/(ax.nx > ax.ny ? ax.nx : ax.ny),e,f,g,ff[4],gg[4],h,s=2,acc=dt/20;\r
+       mreal dt = 0.5/(ax->GetNx() > ax->GetNy() ? ax->GetNx() : ax->GetNy());\r
+       mreal e,f,g,ff[4],gg[4],h,s=2,acc=dt/20;\r
        if(u<0 || v<0)  {       dt = -dt;       u = -u; v = -v; s *= -1;}\r
        long k=0;\r
        bool end = false;\r
        if(nboth) do{\r
                mglPoint dif;\r
-               pp[k].x = x.Spline1(dif,u,0,0); f = ax.Spline1(u,v,0)/dif.x;\r
-               pp[k].y = y.Spline1(dif,v,0,0); g = ay.Spline1(u,v,0)/dif.x;\r
+               pp[k].x = x->Spline1(dif,u,0,0);        f = ax->Spline1(u,v,0)/dif.x;\r
+               pp[k].y = y->Spline1(dif,v,0,0);        g = ay->Spline1(u,v,0)/dif.x;\r
                pp[k].z = zVal;\r
                if(mgl_isbad(f+g))      break;\r
                else    for(long m=0;m<k-1;m+=10)       // determines encircle\r
@@ -525,16 +531,16 @@ void MGL_NO_EXPORT flow(mglBase *gr, double zVal, double u, double v, const mglD
                // find next point by midpoint method\r
                h+=1;   ff[0]=f*dt/h;   gg[0]=g*dt/h;\r
                e = u+ff[0]/2;  h = v+gg[0]/2;\r
-               x.Spline1(dif,e,0,0);   f = ax.Spline1(e,h,0)/dif.x;\r
-               y.Spline1(dif,h,0,0);   g = ay.Spline1(e,h,0)/dif.x;\r
+               x->Spline1(dif,e,0,0);  f = ax->Spline1(e,h,0)/dif.x;\r
+               y->Spline1(dif,h,0,0);  g = ay->Spline1(e,h,0)/dif.x;\r
                h = 1+hypot(f,g);       ff[1]=f*dt/h;   gg[1]=g*dt/h;\r
                e = u+ff[1]/2;  h = v+gg[1]/2;\r
-               x.Spline1(dif,e,0,0);   f = ax.Spline1(e,h,0)/dif.x;\r
-               y.Spline1(dif,h,0,0);   g = ay.Spline1(e,h,0)/dif.x;\r
+               x->Spline1(dif,e,0,0);  f = ax->Spline1(e,h,0)/dif.x;\r
+               y->Spline1(dif,h,0,0);  g = ay->Spline1(e,h,0)/dif.x;\r
                h = 1+hypot(f,g);       ff[2]=f*dt/h;   gg[2]=g*dt/h;\r
                e = u+ff[2];    h = v+gg[2];\r
-               x.Spline1(dif,e,0,0);   f = ax.Spline1(e,h,0)/dif.x;\r
-               y.Spline1(dif,h,0,0);   g = ay.Spline1(e,h,0)/dif.x;\r
+               x->Spline1(dif,e,0,0);  f = ax->Spline1(e,h,0)/dif.x;\r
+               y->Spline1(dif,h,0,0);  g = ay->Spline1(e,h,0)/dif.x;\r
                h = 1+hypot(f,g);       ff[3]=f*dt/h;   gg[3]=g*dt/h;\r
                u += ff[0]/6+ff[1]/3+ff[2]/3+ff[3]/6;\r
                v += gg[0]/6+gg[1]/3+gg[2]/3+gg[3]/6;\r
@@ -543,10 +549,10 @@ void MGL_NO_EXPORT flow(mglBase *gr, double zVal, double u, double v, const mglD
        } while(!end);\r
        else do{\r
                mglPoint dif;\r
-               register mreal xu,xv,yu,yv,det,xx,yy;\r
-               pp[k].x = x.Spline1(dif,u,v,0); xu=dif.x;       xv=dif.y;\r
-               pp[k].y = y.Spline1(dif,u,v,0); yu=dif.x;       yv=dif.y;\r
-               xx = ax.Spline1(u,v,0); yy = ay.Spline1(u,v,0);\r
+               mreal xu,xv,yu,yv,det,xx,yy;\r
+               pp[k].x = x->Spline1(dif,u,v,0);        xu=dif.x;       xv=dif.y;\r
+               pp[k].y = y->Spline1(dif,u,v,0);        yu=dif.x;       yv=dif.y;\r
+               xx = ax->Spline1(u,v,0);        yy = ay->Spline1(u,v,0);\r
                det = xv*yu-xu*yv;      f = (yy*xv-xx*yv)/det;  g = (xx*yu-yy*xu)/det;\r
                pp[k].z = zVal;\r
                if(mgl_isbad(f+g))      break;\r
@@ -558,21 +564,21 @@ void MGL_NO_EXPORT flow(mglBase *gr, double zVal, double u, double v, const mglD
                // find next point by midpoint method\r
                h+=1;   ff[0]=f*dt/h;   gg[0]=g*dt/h;\r
                e = u+ff[0]/2;  h = v+gg[0]/2;\r
-                       x.Spline1(dif,e,h,0);   xu=dif.x;       xv=dif.y;\r
-                       y.Spline1(dif,e,h,0);   yu=dif.x;       yv=dif.y;\r
-                       xx = ax.Spline1(e,h,0); yy = ay.Spline1(e,h,0);\r
+                       x->Spline1(dif,e,h,0);  xu=dif.x;       xv=dif.y;\r
+                       y->Spline1(dif,e,h,0);  yu=dif.x;       yv=dif.y;\r
+                       xx = ax->Spline1(e,h,0);        yy = ay->Spline1(e,h,0);\r
                        det = xv*yu-xu*yv;      f = (yy*xv-xx*yv)/det;  g = (xx*yu-yy*xu)/det;\r
                h = 1+hypot(f,g);       ff[1]=f*dt/h;   gg[1]=g*dt/h;\r
                e = u+ff[1]/2;  h = v+gg[1]/2;\r
-                       x.Spline1(dif,e,h,0);   xu=dif.x;       xv=dif.y;\r
-                       y.Spline1(dif,e,h,0);   yu=dif.x;       yv=dif.y;\r
-                       xx = ax.Spline1(e,h,0); yy = ay.Spline1(e,h,0);\r
+                       x->Spline1(dif,e,h,0);  xu=dif.x;       xv=dif.y;\r
+                       y->Spline1(dif,e,h,0);  yu=dif.x;       yv=dif.y;\r
+                       xx = ax->Spline1(e,h,0);        yy = ay->Spline1(e,h,0);\r
                        det = xv*yu-xu*yv;      f = (yy*xv-xx*yv)/det;  g = (xx*yu-yy*xu)/det;\r
                h = 1+hypot(f,g);       ff[2]=f*dt/h;   gg[2]=g*dt/h;\r
                e = u+ff[2];    h = v+gg[2];\r
-                       x.Spline1(dif,e,h,0);   xu=dif.x;       xv=dif.y;\r
-                       y.Spline1(dif,e,h,0);   yu=dif.x;       yv=dif.y;\r
-                       xx = ax.Spline1(e,h,0); yy = ay.Spline1(e,h,0);\r
+                       x->Spline1(dif,e,h,0);  xu=dif.x;       xv=dif.y;\r
+                       y->Spline1(dif,e,h,0);  yu=dif.x;       yv=dif.y;\r
+                       xx = ax->Spline1(e,h,0);        yy = ay->Spline1(e,h,0);\r
                        det = xv*yu-xu*yv;      f = (yy*xv-xx*yv)/det;  g = (xx*yu-yy*xu)/det;\r
                h = 1+hypot(f,g);       ff[3]=f*dt/h;   gg[3]=g*dt/h;\r
                u += ff[0]/6+ff[1]/3+ff[2]/3+ff[3]/6;\r
@@ -583,7 +589,7 @@ void MGL_NO_EXPORT flow(mglBase *gr, double zVal, double u, double v, const mglD
        if(k>1)\r
        {\r
                long j,a=long(0.3*gr->GetArrowSize()/fabs(dt));\r
-               gr->Reserve(k);         j = gr->AddPnt(pp[0],pp[0].c);\r
+               gr->Reserve(k); j = gr->AddPnt(pp[0],pp[0].c);\r
                for(long i=1;i<k;i++)\r
                {\r
                        long jj=j;      j = gr->AddPnt(pp[i],pp[i].c);\r
@@ -611,32 +617,42 @@ void MGL_EXPORT mgl_flow_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const cha
        // allocate memory\r
        mreal zVal = gr->Min.z;\r
        bool cnt=!mglchr(sch,'#');\r
-       mglData xx(x), yy(y), bx(ax), by(ay);\r
 \r
+       std::vector<mreal> u, v;\r
+       if(mglchr(sch,'*'))     for(long i=0;i<num;i++) for(long j=0;j<num;j++)\r
+       {\r
+               mreal t = (i+1.)/(num+1.), s = (j+1.)/(num+1.);\r
+               u.push_back(s);         v.push_back(t);\r
+               u.push_back(-s);        v.push_back(-t);\r
+       }\r
+       else    for(long i=0;i<num;i++)\r
+       {\r
+               mreal t = (i+1.)/(num+1.);\r
+               u.push_back(0);         v.push_back(t);\r
+               u.push_back(0);         v.push_back(-t);\r
+               u.push_back(1);         v.push_back(t);\r
+               u.push_back(-1);        v.push_back(-t);\r
+               u.push_back(t);         v.push_back(0);\r
+               u.push_back(-t);        v.push_back(0);\r
+               u.push_back(t);         v.push_back(1);\r
+               u.push_back(-t);        v.push_back(-1);\r
+               if(cnt)\r
+               {\r
+                       u.push_back(t);         v.push_back(0.5);\r
+                       u.push_back(-t);        v.push_back(-0.5);\r
+                       u.push_back(0.5);       v.push_back(t);\r
+                       u.push_back(-0.5);      v.push_back(-t);\r
+               }\r
+       }\r
        for(long k=0;k<ax->GetNz();k++)\r
        {\r
                if(gr->NeedStop())      break;\r
                if(ax->GetNz()>1)       zVal = gr->Min.z+(gr->Max.z-gr->Min.z)*mreal(k)/(ax->GetNz()-1);\r
-               for(long i=0;i<num;i++) for(int s=-1;s<=1;s+=2)\r
-               {\r
-                       mreal u,v;\r
-                       if(gr->NeedStop())      {       i=num;  s=2;    continue;       }\r
-                       u = 0;  v = (i+1.)/(num+1.);\r
-                       flow(gr, zVal, s*u, s*v, xx, yy, bx, by,ss,vv);\r
-                       u = 1;  v = (i+1.)/(num+1.);\r
-                       flow(gr, zVal, s*u, s*v, xx, yy, bx, by,ss,vv);\r
-                       u = (i+1.)/(num+1.);    v = 0;\r
-                       flow(gr, zVal, s*u, s*v, xx, yy, bx, by,ss,vv);\r
-                       u = (i+1.)/(num+1.);    v = 1;\r
-                       flow(gr, zVal, s*u, s*v, xx, yy, bx, by,ss,vv);\r
-                       if(cnt)\r
-                       {\r
-                               u = 0.5;        v = (i+1.)/(num+1.);\r
-                               flow(gr, zVal, s*u, s*v, xx, yy, bx, by,ss,vv);\r
-                               u = (i+1.)/(num+1.);    v = 0.5;\r
-                               flow(gr, zVal, s*u, s*v, xx, yy, bx, by,ss,vv);\r
-                       }\r
-               }\r
+               HMDT bx=mgl_data_subdata(ax,-1,-1,k), by=mgl_data_subdata(ay,-1,-1,k);\r
+#pragma omp parallel for\r
+               for(long i=0;i<long(u.size());i++)      if(!gr->NeedStop())\r
+                       flow(gr, zVal, u[i], v[i], x, y, bx, by,ss,vv);\r
+               mgl_delete_data(bx);    mgl_delete_data(by);\r
        }\r
        gr->EndGroup();\r
 }\r
@@ -673,12 +689,11 @@ void MGL_EXPORT mgl_flowp_xy(HMGL gr, double x0, double y0, double z0, HCDT x, H
        long ss = gr->AddTexture(sch);\r
        bool vv = mglchr(sch,'v');\r
        // find coordinates u, v\r
-       register long i,j;\r
-       register mreal d, dm=INFINITY;\r
+       mreal dm=INFINITY;\r
        long i0=0,j0=0;\r
-       for(i=0;i<n;i++)        for(j=0;j<m;j++)        // first find closest\r
+       for(long i=0;i<n;i++)   for(long j=0;j<m;j++)   // first find closest\r
        {\r
-               d = nboth ? hypot(x->v(i)-x0,y->v(j)-y0) : hypot(x->v(i,j)-x0,y->v(i,j)-y0);\r
+               mreal d = nboth ? hypot(x->v(i)-x0,y->v(j)-y0) : hypot(x->v(i,j)-x0,y->v(i,j)-y0);\r
                if(d<dm)        {       i0=i;   j0=j;   dm=d;   }\r
        }\r
        if(dm==0)       {       u = i0/mreal(n);        v = j0/mreal(m);        }       // we find it\r
@@ -696,13 +711,12 @@ void MGL_EXPORT mgl_flowp_xy(HMGL gr, double x0, double y0, double z0, HCDT x, H
                        dx = x->v(i0,j0)-x0;    dy = y->v(i0,j0)-y0;\r
                        dxu= x->dvx(i0,j0);             dyu= y->dvx(i0,j0);\r
                        dxv= x->dvy(i0,j0);             dyv= y->dvy(i0,j0);\r
-                       d = dxv*dyu-dxu*dyv;\r
+                       mreal d = dxv*dyu-dxu*dyv;\r
                        u = (i0+(dxv*dy-dx*dyv)/d)/n;\r
                        v = (j0-(dxu*dy-dx*dyu)/d)/m;\r
                }\r
        }\r
-       mglData xx(x), yy(y), bx(ax), by(ay);\r
-       flow(gr, z0, u, v, xx, yy, bx, by,ss,vv);\r
+       flow(gr, z0, u, v, x, y, ax, ay,ss,vv);\r
        gr->EndGroup();\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -729,17 +743,17 @@ void MGL_EXPORT mgl_flowp_2d_(uintptr_t *gr, mreal *x0, mreal *y0, mreal *z0, ui
 //     Flow 3d series\r
 //\r
 //-----------------------------------------------------------------------------\r
-void flow(mglBase *gr, double u, double v, double w, const mglData &x, const mglData &y, const mglData &z, const mglData &ax, const mglData &ay, const mglData &az,long ss,bool vv, bool xo, bool zo)\r
+void flow(mglBase *gr, double u, double v, double w, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az,long ss,bool vv, bool xo, bool zo)\r
 {\r
-       static long n=100*(ax.nx+ax.ny+ax.nz);\r
-       long nn = ax.nx*ax.ny*ax.nz;\r
-       bool nboth = x.nx*x.ny*x.nz!=nn || y.nx*y.ny*y.nz!=nn || z.nx*z.ny*z.nz!=nn;\r
+       static long n=100*(ax->GetNx()+ax->GetNy()+ax->GetNz());\r
+       long nn = ax->GetNN();\r
+       bool nboth = x->GetNN()!=nn || y->GetNN()!=nn || z->GetNN()!=nn;\r
        mglPoint *pp = new mglPoint[n], dp;\r
        mglPoint dx(1/fabs(gr->Max.x-gr->Min.x),1/fabs(gr->Max.y-gr->Min.y),1/fabs(gr->Max.z-gr->Min.z));\r
-       mglPoint nx(ax.nx,ax.ny,ax.nz);\r
+       mglPoint nx(ax->GetNx(),ax->GetNy(),ax->GetNz());\r
 \r
-       nn = (ax.nx > ax.ny ? ax.nx : ax.ny);\r
-       nn = (nn > ax.nz ? nn : ax.nz);\r
+       nn = (ax->GetNx() > ax->GetNy() ? ax->GetNz() : ax->GetNy());\r
+       nn = (nn > ax->GetNz() ? nn : ax->GetNz());\r
        mreal dt = 0.2/nn, e,f,g,ee[4],ff[4],gg[4],h,s=2,u1,v1,w1,acc=dt/20;\r
        if(u<0 || v<0 || w<0)\r
        {       dt = -dt;       u = -u; v = -v; w = -w; s *= -1;}\r
@@ -747,9 +761,9 @@ void flow(mglBase *gr, double u, double v, double w, const mglData &x, const mgl
        bool end = false;\r
        if(nboth) do{\r
                mglPoint dif;\r
-               pp[k].x = x.Spline1(dif,u,0,0); e = ax.Spline1(u,v,w)/dif.x;\r
-               pp[k].y = y.Spline1(dif,v,0,0); f = ay.Spline1(u,v,w)/dif.x;\r
-               pp[k].z = z.Spline1(dif,w,0,0); g = az.Spline1(u,v,w)/dif.x;\r
+               pp[k].x = x->Spline1(dif,u,0,0);        e = ax->Spline1(u,v,w)/dif.x;\r
+               pp[k].y = y->Spline1(dif,v,0,0);        f = ay->Spline1(u,v,w)/dif.x;\r
+               pp[k].z = z->Spline1(dif,w,0,0);        g = az->Spline1(u,v,w)/dif.x;\r
                if(mgl_isbad(e+f+g))    end = true;\r
                else    for(long m=0;m<k-1;m+=10)       // determines encircle\r
                        if(mgl_anorm((pp[k]-pp[m])/dx)<acc)     end = true;\r
@@ -760,21 +774,21 @@ void flow(mglBase *gr, double u, double v, double w, const mglData &x, const mgl
                // find next point by midpoint method\r
                h+=1;   ee[0]=e*dt/h;   ff[0]=f*dt/h;   gg[0]=g*dt/h;\r
                u1 = u+ee[0]/2; v1 = v+ff[0]/2; w1 = w+gg[0]/2;\r
-               x.Spline1(dif,u1,0,0);  e = ax.Spline1(u1,v1,w1)/dif.x;\r
-               y.Spline1(dif,v1,0,0);  f = ay.Spline1(u1,v1,w1)/dif.x;\r
-               z.Spline1(dif,w1,0,0);  g = az.Spline1(u1,v1,w1)/dif.x;\r
+               x->Spline1(dif,u1,0,0); e = ax->Spline1(u1,v1,w1)/dif.x;\r
+               y->Spline1(dif,v1,0,0); f = ay->Spline1(u1,v1,w1)/dif.x;\r
+               z->Spline1(dif,w1,0,0); g = az->Spline1(u1,v1,w1)/dif.x;\r
                h = 1+sqrt(e*e+f*f+g*g);\r
                ee[1]=e*dt/h;   ff[1]=f*dt/h;   gg[1]=g*dt/h;\r
                u1 = u+ee[1]/2; v1 = v+ff[1]/2; w1 = w+gg[1]/2;\r
-               x.Spline1(dif,u1,0,0);  e = ax.Spline1(u1,v1,w1)/dif.x;\r
-               y.Spline1(dif,v1,0,0);  f = ay.Spline1(u1,v1,w1)/dif.x;\r
-               z.Spline1(dif,w1,0,0);  g = az.Spline1(u1,v1,w1)/dif.x;\r
+               x->Spline1(dif,u1,0,0); e = ax->Spline1(u1,v1,w1)/dif.x;\r
+               y->Spline1(dif,v1,0,0); f = ay->Spline1(u1,v1,w1)/dif.x;\r
+               z->Spline1(dif,w1,0,0); g = az->Spline1(u1,v1,w1)/dif.x;\r
                h = 1+sqrt(e*e+f*f+g*g);\r
                ee[2]=e*dt/h;   ff[2]=f*dt/h;   gg[2]=g*dt/h;\r
                u1 = u+ee[2];   v1 = v+ff[2];   w1 = w+gg[2];\r
-               x.Spline1(dif,u1,0,0);  e = ax.Spline1(u1,v1,w1)/dif.x;\r
-               y.Spline1(dif,v1,0,0);  f = ay.Spline1(u1,v1,w1)/dif.x;\r
-               z.Spline1(dif,w1,0,0);  g = az.Spline1(u1,v1,w1)/dif.x;\r
+               x->Spline1(dif,u1,0,0); e = ax->Spline1(u1,v1,w1)/dif.x;\r
+               y->Spline1(dif,v1,0,0); f = ay->Spline1(u1,v1,w1)/dif.x;\r
+               z->Spline1(dif,w1,0,0); g = az->Spline1(u1,v1,w1)/dif.x;\r
                h = 1+sqrt(e*e+f*f+g*g);\r
                ee[3]=e*dt/h;   ff[3]=f*dt/h;   gg[3]=g*dt/h;\r
                u += ee[0]/6+ee[1]/3+ee[2]/3+ee[3]/6;\r
@@ -785,11 +799,11 @@ void flow(mglBase *gr, double u, double v, double w, const mglData &x, const mgl
        } while(!end);\r
        else do{\r
                mglPoint dif;\r
-               register mreal xu,xv,xw,yu,yv,yw,zv,zu,zw,det,xx,yy,zz;\r
-               pp[k].x = x.Spline1(dif,u,v,w); xu=dif.x;       xv=dif.y;       xw=dif.z;\r
-               pp[k].y = y.Spline1(dif,u,v,w); yu=dif.x;       yv=dif.y;       yw=dif.z;\r
-               pp[k].z = z.Spline1(dif,u,v,w); zu=dif.x;       zv=dif.y;       zw=dif.z;\r
-               xx = ax.Spline1(u,v,w); yy = ay.Spline1(u,v,w); zz = az.Spline1(u,v,w);\r
+               mreal xu,xv,xw,yu,yv,yw,zv,zu,zw,det,xx,yy,zz;\r
+               pp[k].x = x->Spline1(dif,u,v,w);        xu=dif.x;       xv=dif.y;       xw=dif.z;\r
+               pp[k].y = y->Spline1(dif,u,v,w);        yu=dif.x;       yv=dif.y;       yw=dif.z;\r
+               pp[k].z = z->Spline1(dif,u,v,w);        zu=dif.x;       zv=dif.y;       zw=dif.z;\r
+               xx = ax->Spline1(u,v,w);        yy = ay->Spline1(u,v,w);        zz = az->Spline1(u,v,w);\r
                det = -xu*yv*zw+xv*yu*zw+xu*yw*zv-xw*yu*zv-xv*yw*zu+xw*yv*zu;\r
                e = (-xv*yw*zz+xw*yv*zz+xv*yy*zw-xx*yv*zw-xw*yy*zv+xx*yw*zv)/det;\r
                f = (xu*yw*zz-xw*yu*zz-xu*yy*zw+xx*yu*zw+xw*yy*zu-xx*yw*zu)/det;\r
@@ -804,9 +818,9 @@ void flow(mglBase *gr, double u, double v, double w, const mglData &x, const mgl
                // find next point by midpoint method\r
                h+=1;   ee[0]=e*dt/h;   ff[0]=f*dt/h;   gg[0]=g*dt/h;\r
                u1 = u+ee[0]/2; v1 = v+ff[0]/2; w1 = w+gg[0]/2;\r
-               x.Spline1(dif,u1,v1,w1);        xu=dif.x;       xv=dif.y;       xw=dif.z;       xx = ax.Spline1(u1,v1,w1);\r
-               y.Spline1(dif,u1,v1,w1);        yu=dif.x;       yv=dif.y;       yw=dif.z;       yy = ay.Spline1(u1,v1,w1);\r
-               z.Spline1(dif,u1,v1,w1);        zu=dif.x;       zv=dif.y;       zw=dif.z;       zz = az.Spline1(u1,v1,w1);\r
+               x->Spline1(dif,u1,v1,w1);       xu=dif.x;       xv=dif.y;       xw=dif.z;       xx = ax->Spline1(u1,v1,w1);\r
+               y->Spline1(dif,u1,v1,w1);       yu=dif.x;       yv=dif.y;       yw=dif.z;       yy = ay->Spline1(u1,v1,w1);\r
+               z->Spline1(dif,u1,v1,w1);       zu=dif.x;       zv=dif.y;       zw=dif.z;       zz = az->Spline1(u1,v1,w1);\r
                det = -xu*yv*zw+xv*yu*zw+xu*yw*zv-xw*yu*zv-xv*yw*zu+xw*yv*zu;\r
                e = (-xv*yw*zz+xw*yv*zz+xv*yy*zw-xx*yv*zw-xw*yy*zv+xx*yw*zv)/det;\r
                f = (xu*yw*zz-xw*yu*zz-xu*yy*zw+xx*yu*zw+xw*yy*zu-xx*yw*zu)/det;\r
@@ -814,9 +828,9 @@ void flow(mglBase *gr, double u, double v, double w, const mglData &x, const mgl
                h = 1+sqrt(e*e+f*f+g*g);\r
                ee[1]=e*dt/h;   ff[1]=f*dt/h;   gg[1]=g*dt/h;\r
                u1 = u+ee[1]/2; v1 = v+ff[1]/2; w1 = w+gg[1]/2;\r
-               x.Spline1(dif,u1,v1,w1);        xu=dif.x;       xv=dif.y;       xw=dif.z;       xx = ax.Spline1(u1,v1,w1);\r
-               y.Spline1(dif,u1,v1,w1);        yu=dif.x;       yv=dif.y;       yw=dif.z;       yy = ay.Spline1(u1,v1,w1);\r
-               z.Spline1(dif,u1,v1,w1);        zu=dif.x;       zv=dif.y;       zw=dif.z;       zz = az.Spline1(u1,v1,w1);\r
+               x->Spline1(dif,u1,v1,w1);       xu=dif.x;       xv=dif.y;       xw=dif.z;       xx = ax->Spline1(u1,v1,w1);\r
+               y->Spline1(dif,u1,v1,w1);       yu=dif.x;       yv=dif.y;       yw=dif.z;       yy = ay->Spline1(u1,v1,w1);\r
+               z->Spline1(dif,u1,v1,w1);       zu=dif.x;       zv=dif.y;       zw=dif.z;       zz = az->Spline1(u1,v1,w1);\r
                det = -xu*yv*zw+xv*yu*zw+xu*yw*zv-xw*yu*zv-xv*yw*zu+xw*yv*zu;\r
                e = (-xv*yw*zz+xw*yv*zz+xv*yy*zw-xx*yv*zw-xw*yy*zv+xx*yw*zv)/det;\r
                f = (xu*yw*zz-xw*yu*zz-xu*yy*zw+xx*yu*zw+xw*yy*zu-xx*yw*zu)/det;\r
@@ -824,9 +838,9 @@ void flow(mglBase *gr, double u, double v, double w, const mglData &x, const mgl
                h = 1+sqrt(e*e+f*f+g*g);\r
                ee[2]=e*dt/h;   ff[2]=f*dt/h;   gg[2]=g*dt/h;\r
                u1 = u+ee[2];   v1 = v+ff[2];   w1 = w+gg[2];\r
-               x.Spline1(dif,u1,v1,w1);        xu=dif.x;       xv=dif.y;       xw=dif.z;       xx = ax.Spline1(u1,v1,w1);\r
-               y.Spline1(dif,u1,v1,w1);        yu=dif.x;       yv=dif.y;       yw=dif.z;       yy = ay.Spline1(u1,v1,w1);\r
-               z.Spline1(dif,u1,v1,w1);        zu=dif.x;       zv=dif.y;       zw=dif.z;       zz = az.Spline1(u1,v1,w1);\r
+               x->Spline1(dif,u1,v1,w1);       xu=dif.x;       xv=dif.y;       xw=dif.z;       xx = ax->Spline1(u1,v1,w1);\r
+               y->Spline1(dif,u1,v1,w1);       yu=dif.x;       yv=dif.y;       yw=dif.z;       yy = ay->Spline1(u1,v1,w1);\r
+               z->Spline1(dif,u1,v1,w1);       zu=dif.x;       zv=dif.y;       zw=dif.z;       zz = az->Spline1(u1,v1,w1);\r
                det = -xu*yv*zw+xv*yu*zw+xu*yw*zv-xw*yu*zv-xv*yw*zu+xw*yv*zu;\r
                e = (-xv*yw*zz+xw*yv*zz+xv*yy*zw-xx*yv*zw-xw*yy*zv+xx*yw*zv)/det;\r
                f = (xu*yw*zz-xw*yu*zz-xu*yy*zw+xx*yu*zw+xw*yy*zu-xx*yw*zu)/det;\r
@@ -885,33 +899,37 @@ void MGL_EXPORT mgl_flow_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay,
        long ss = gr->AddTexture(sch);\r
        bool vv = mglchr(sch,'v'), xo = mglchr(sch,'x'), zo = mglchr(sch,'z');\r
 \r
-       mglData xx(x), yy(y), zz(z), bx(ax), by(ay), bz(az);\r
-       for(long i=0;i<num;i++) for(long j=0;j<num;j++) for(int s=-1;s<=1;s+=2)\r
+       std::vector<mreal> u, v, w;\r
+       for(long i=0;i<num;i++) for(long j=0;j<num;j++)\r
        {\r
-               mreal u,v,w;\r
-               if(gr->NeedStop())      {       i=j=num;        s=2;    continue;       }\r
-               u = (i+1.)/(num+1.);    v = (j+1.)/(num+1.);    w = 0;\r
-               flow(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,ss,vv,xo,zo);\r
-               u = (i+1.)/(num+1.);    v = (j+1.)/(num+1.);    w = 1;\r
-               flow(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,ss,vv,xo,zo);\r
-               u = 0;  v = (j+1.)/(num+1.);    w = (i+1.)/(num+1.);\r
-               flow(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,ss,vv,xo,zo);\r
-               u = 1;  v = (j+1.)/(num+1.);    w = (i+1.)/(num+1.);\r
-               flow(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,ss,vv,xo,zo);\r
-               u = (i+1.)/(num+1.);    v = 0;  w = (j+1.)/(num+1.);\r
-               flow(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,ss,vv,xo,zo);\r
-               u = (i+1.)/(num+1.);    v = 1;  w = (j+1.)/(num+1.);\r
-               flow(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,ss,vv,xo,zo);\r
+               mreal t = (i+1.)/(num+1.), s = (j+1.)/(num+1.);\r
+               u.push_back(t);         v.push_back(s);         w.push_back(0);\r
+               u.push_back(-t);        v.push_back(-s);        w.push_back(0);\r
+               u.push_back(t);         v.push_back(s);         w.push_back(1);\r
+               u.push_back(-t);        v.push_back(-s);        w.push_back(-1);\r
+\r
+               u.push_back(t);         v.push_back(0);         w.push_back(s);\r
+               u.push_back(-t);        v.push_back(0);         w.push_back(-s);\r
+               u.push_back(t);         v.push_back(1);         w.push_back(s);\r
+               u.push_back(-t);        v.push_back(-1);        w.push_back(-s);\r
+\r
+               u.push_back(0);         v.push_back(s);         w.push_back(t);\r
+               u.push_back(0);         v.push_back(-s);        w.push_back(-t);\r
+               u.push_back(1);         v.push_back(s);         w.push_back(t);\r
+               u.push_back(-1);        v.push_back(-s);        w.push_back(-t);\r
                if(cnt)\r
                {\r
-                       u = (i+1.)/(num+1.);    v = (j+1.)/(num+1.);    w = 0.5;\r
-                       flow(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,ss,vv,xo,zo);\r
-                       u = 0.5;        v = (j+1.)/(num+1.);    w = (i+1.)/(num+1.);\r
-                       flow(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,ss,vv,xo,zo);\r
-                       u = (i+1.)/(num+1.);    v = 0.5;        w = (j+1.)/(num+1.);\r
-                       flow(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,ss,vv,xo,zo);\r
+                       u.push_back(t);         v.push_back(s);         w.push_back(0.5);\r
+                       u.push_back(-t);        v.push_back(-s);        w.push_back(-0.5);\r
+                       u.push_back(t);         v.push_back(0.5);       w.push_back(s);\r
+                       u.push_back(-t);        v.push_back(-0.5);      w.push_back(-s);\r
+                       u.push_back(0.5);       v.push_back(s);         w.push_back(t);\r
+                       u.push_back(-0.5);      v.push_back(-s);        w.push_back(-t);\r
                }\r
        }\r
+#pragma omp parallel for\r
+       for(long i=0;i<long(u.size());i++)      if(!gr->NeedStop())\r
+               flow(gr, u[i], v[i], w[i], x, y, z, ax, ay, az,ss,vv,xo,zo);\r
        gr->EndGroup();\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -948,17 +966,16 @@ void MGL_EXPORT mgl_flowp_xyz(HMGL gr, double x0, double y0, double z0, HCDT x,
        bool vv = mglchr(sch,'v'), xo = mglchr(sch,'x'), zo = mglchr(sch,'z');\r
 \r
        // find coordinates u, v, w\r
-       register long i,j,k;\r
-       register mreal d, dm=INFINITY;\r
+       mreal dm=INFINITY;\r
        long i0=0,j0=0,k0=0;\r
        mreal dx,dy,dz;\r
-       for(i=0;i<n;i++)        for(j=0;j<m;j++)        for(k=0;k<l;k++)        // first find closest\r
+       for(long i=0;i<n;i++)   for(long j=0;j<m;j++)   for(long k=0;k<l;k++)   // first find closest\r
        {\r
                if(nboth)\r
                {       dx = x->v(i)-p.x;       dy = y->v(j)-p.y;       dz = x->v(k)-p.z;       }\r
                else\r
                {       dx = x->v(i,j,k)-p.x;   dy = y->v(i,j,k)-p.y;   dz = x->v(i,j,k)-p.z;   }\r
-               d = sqrt(dx*dx+dy*dy+dz*dz);\r
+               mreal d = sqrt(dx*dx+dy*dy+dz*dz);\r
                if(d<dm)        {       i0=i;   j0=j;   k0=k;   dm=d;   }\r
        }\r
        if(dm==0)       // we find it\r
@@ -978,14 +995,13 @@ void MGL_EXPORT mgl_flowp_xyz(HMGL gr, double x0, double y0, double z0, HCDT x,
                        dxu= x->dvx(i0,j0,k0);          dyu= y->dvx(i0,j0,k0);          dzu= z->dvx(i0,j0,k0);\r
                        dxv= x->dvy(i0,j0,k0);          dyv= y->dvy(i0,j0,k0);          dzv= z->dvy(i0,j0,k0);\r
                        dxw= x->dvz(i0,j0,k0);          dyw= y->dvz(i0,j0,k0);          dzw= z->dvz(i0,j0,k0);\r
-                       d = dxu*(dyw*dzv-dyv*dzw)+dxv*(dyu*dzw-dyw*dzu)+dxw*(dyv*dzu-dyu*dzv);\r
+                       mreal d = dxu*(dyw*dzv-dyv*dzw)+dxv*(dyu*dzw-dyw*dzu)+dxw*(dyv*dzu-dyu*dzv);\r
                        u = (i0+(dx*(dyw*dzv-dyv*dzw)+dxv*(dy*dzw-dyw*dz)+dxw*(dyv*dz-dy*dzv))/d)/n;\r
                        v = (j0-(dx*(dyw*dzu-dyu*dzw)+dxu*(dy*dzw-dyw*dz)+dxw*(dyu*dz-dy*dzu))/d)/m;\r
                        w = (i0+(dx*(dyv*dzu-dyu*dzv)+dxu*(dy*dzv-dyv*dz)+dxv*(dyu*dz-dy*dzu))/d)/l;\r
                }\r
        }\r
-       mglData xx(x), yy(y), zz(z), bx(ax), by(ay), bz(az);\r
-       flow(gr, u, v, w, xx, yy, zz, bx, by, bz,ss,vv,xo,zo);\r
+       flow(gr, u, v, w, x, y, z, ax, ay, az,ss,vv,xo,zo);\r
        gr->EndGroup();\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -1024,7 +1040,7 @@ void MGL_EXPORT mgl_grad_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT phi, const ch
 #pragma omp parallel for collapse(3)\r
                for(long i=0;i<n;i++)   for(long j=0;j<m;j++)   for(long k=0;k<l;k++)\r
                {\r
-                       register long i0 = i+n*(j+m*k);\r
+                       long i0 = i+n*(j+m*k);\r
                        xx.a[i0] = x->v(i);     yy.a[i0] = y->v(j);     zz.a[i0] = z->v(k);\r
                }\r
        else    {       gr->SetWarn(mglWarnDim,"Grad"); return; }\r
@@ -1041,7 +1057,7 @@ void MGL_EXPORT mgl_grad_xy(HMGL gr, HCDT x, HCDT y, HCDT phi, const char *sch,
        else if(x->GetNx()==n && y->GetNx()==m)\r
 #pragma omp parallel for collapse(2)\r
                for(long i=0;i<n;i++)   for(long j=0;j<m;j++)\r
-               {       register long i0 = i+n*j;       xx.a[i0] = x->v(i);     yy.a[i0] = y->v(j);     }\r
+               {       long i0 = i+n*j;        xx.a[i0] = x->v(i);     yy.a[i0] = y->v(j);     }\r
        else    {       gr->SetWarn(mglWarnDim,"Grad"); return; }\r
        ax.Diff(xx,yy); ay.Diff(yy,xx);\r
        mgl_flow_xy(gr,&xx,&yy,&ax,&ay,sch,opt);\r
@@ -1075,25 +1091,25 @@ void MGL_EXPORT mgl_grad_(uintptr_t *gr, uintptr_t *ph, const char *sch, const c
 //     Pipe 2d series\r
 //\r
 //-----------------------------------------------------------------------------\r
-void MGL_NO_EXPORT flowr(mglBase *gr, double zVal, double u, double v, const mglData &x, const mglData &y, const mglData &ax, const mglData &ay, double r0,long sc)\r
+void MGL_NO_EXPORT flowr(mglBase *gr, double zVal, double u, double v, HCDT x, HCDT y, HCDT ax, HCDT ay, double r0,long sc)\r
 {\r
-       long n=100*(ax.nx+ax.ny);\r
-       bool nboth = x.nx*x.ny!=ax.nx*ax.ny || y.nx*y.ny!=ax.nx*ax.ny;\r
+       long n=100*(ax->GetNx()+ax->GetNy());\r
+       bool nboth = x->GetNx()*x->GetNy()!=ax->GetNx()*ax->GetNy() || y->GetNx()*y->GetNy()!=ax->GetNx()*ax->GetNy();\r
 \r
        mglPoint *pp = new mglPoint[n], dp;\r
        mreal *cc = new mreal[n];\r
        mglPoint dx(1/fabs(gr->Max.x-gr->Min.x),1/fabs(gr->Max.y-gr->Min.y),1/fabs(gr->Max.z-gr->Min.z));\r
-       mglPoint nx(ax.nx,ax.ny);\r
+       mglPoint nx(ax->GetNx(),ax->GetNy());\r
 \r
-       mreal dt = 0.5/(ax.nx > ax.ny ? ax.nx : ax.ny),e,f,g,ff[4],gg[4],h,s=2,acc=dt/20;\r
+       mreal dt = 0.5/(ax->GetNx() > ax->GetNy() ? ax->GetNx() : ax->GetNy()),e,f,g,ff[4],gg[4],h,s=2,acc=dt/20;\r
        mreal ss = 16./mgl_ipow(gr->Max.c - gr->Min.c,2);\r
        if(u<0 || v<0)  {       dt = -dt;       u = -u; v = -v; s *= -1;}\r
        long k=0;\r
        bool end = false;\r
        if(nboth) do{\r
                mglPoint dif;\r
-               pp[k].x = x.Spline1(dif,u,0,0); f = ax.Spline1(u,v,0)/dif.x;\r
-               pp[k].y = y.Spline1(dif,v,0,0); g = ay.Spline1(u,v,0)/dif.x;\r
+               pp[k].x = x->Spline1(dif,u,0,0);        f = ax->Spline1(u,v,0)/dif.x;\r
+               pp[k].y = y->Spline1(dif,v,0,0);        g = ay->Spline1(u,v,0)/dif.x;\r
                pp[k].z = zVal;\r
                if(mgl_isbad(f+g))      end = true;\r
                else    for(long m=0;m<k-1;m+=10)       // determines encircle\r
@@ -1106,16 +1122,16 @@ void MGL_NO_EXPORT flowr(mglBase *gr, double zVal, double u, double v, const mgl
                // find next point by midpoint method\r
                h+=1;   ff[0]=f*dt/h;   gg[0]=g*dt/h;\r
                e = u+ff[0]/2;  h = v+gg[0]/2;\r
-               x.Spline1(dif,e,0,0);   f = ax.Spline1(e,h,0)/dif.x;\r
-               y.Spline1(dif,h,0,0);   g = ay.Spline1(e,h,0)/dif.x;\r
+               x->Spline1(dif,e,0,0);  f = ax->Spline1(e,h,0)/dif.x;\r
+               y->Spline1(dif,h,0,0);  g = ay->Spline1(e,h,0)/dif.x;\r
                h = 1+hypot(f,g);       ff[1]=f*dt/h;   gg[1]=g*dt/h;\r
                e = u+ff[1]/2;  h = v+gg[1]/2;\r
-               x.Spline1(dif,e,0,0);   f = ax.Spline1(e,h,0)/dif.x;\r
-               y.Spline1(dif,h,0,0);   g = ay.Spline1(e,h,0)/dif.x;\r
+               x->Spline1(dif,e,0,0);  f = ax->Spline1(e,h,0)/dif.x;\r
+               y->Spline1(dif,h,0,0);  g = ay->Spline1(e,h,0)/dif.x;\r
                h = 1+hypot(f,g);       ff[2]=f*dt/h;   gg[2]=g*dt/h;\r
                e = u+ff[2];    h = v+gg[2];\r
-               x.Spline1(dif,e,0,0);   f = ax.Spline1(e,h,0)/dif.x;\r
-               y.Spline1(dif,h,0,0);   g = ay.Spline1(e,h,0)/dif.x;\r
+               x->Spline1(dif,e,0,0);  f = ax->Spline1(e,h,0)/dif.x;\r
+               y->Spline1(dif,h,0,0);  g = ay->Spline1(e,h,0)/dif.x;\r
                h = 1+hypot(f,g);       ff[3]=f*dt/h;   gg[3]=g*dt/h;\r
                u += ff[0]/6+ff[1]/3+ff[2]/3+ff[3]/6;\r
                v += gg[0]/6+gg[1]/3+gg[2]/3+gg[3]/6;\r
@@ -1124,10 +1140,10 @@ void MGL_NO_EXPORT flowr(mglBase *gr, double zVal, double u, double v, const mgl
        } while(!end);\r
        else do{\r
                mglPoint dif;\r
-               register mreal xu,xv,yu,yv,det,xx,yy;\r
-                       pp[k].x = x.Spline1(dif,u,v,0); xu=dif.x;       xv=dif.y;\r
-                       pp[k].y = y.Spline1(dif,u,v,0); yu=dif.x;       yv=dif.y;\r
-                       xx = ax.Spline1(u,v,0); yy = ay.Spline1(u,v,0);\r
+               mreal xu,xv,yu,yv,det,xx,yy;\r
+                       pp[k].x = x->Spline1(dif,u,v,0);        xu=dif.x;       xv=dif.y;\r
+                       pp[k].y = y->Spline1(dif,u,v,0);        yu=dif.x;       yv=dif.y;\r
+                       xx = ax->Spline1(u,v,0);        yy = ay->Spline1(u,v,0);\r
                        det = xv*yu-xu*yv;      f = (yy*xv-xx*yv)/det;  g = (xx*yu-yy*xu)/det;\r
                pp[k].z = zVal;\r
                if(mgl_isbad(f+g))      end = true;\r
@@ -1141,21 +1157,21 @@ void MGL_NO_EXPORT flowr(mglBase *gr, double zVal, double u, double v, const mgl
                // find next point by midpoint method\r
                h+=1;   ff[0]=f*dt/h;   gg[0]=g*dt/h;\r
                e = u+ff[0]/2;  h = v+gg[0]/2;\r
-                       x.Spline1(dif,e,h,0);   xu=dif.x;       xv=dif.y;\r
-                       y.Spline1(dif,e,h,0);   yu=dif.x;       yv=dif.y;\r
-                       xx = ax.Spline1(e,h,0); yy = ay.Spline1(e,h,0);\r
+                       x->Spline1(dif,e,h,0);  xu=dif.x;       xv=dif.y;\r
+                       y->Spline1(dif,e,h,0);  yu=dif.x;       yv=dif.y;\r
+                       xx = ax->Spline1(e,h,0);        yy = ay->Spline1(e,h,0);\r
                        det = xv*yu-xu*yv;      f = (yy*xv-xx*yv)/det;  g = (xx*yu-yy*xu)/det;\r
                h = 1+hypot(f,g);       ff[1]=f*dt/h;   gg[1]=g*dt/h;\r
                e = u+ff[1]/2;  h = v+gg[1]/2;\r
-                       x.Spline1(dif,e,h,0);   xu=dif.x;       xv=dif.y;\r
-                       y.Spline1(dif,e,h,0);   yu=dif.x;       yv=dif.y;\r
-                       xx = ax.Spline1(e,h,0); yy = ay.Spline1(e,h,0);\r
+                       x->Spline1(dif,e,h,0);  xu=dif.x;       xv=dif.y;\r
+                       y->Spline1(dif,e,h,0);  yu=dif.x;       yv=dif.y;\r
+                       xx = ax->Spline1(e,h,0);        yy = ay->Spline1(e,h,0);\r
                        det = xv*yu-xu*yv;      f = (yy*xv-xx*yv)/det;  g = (xx*yu-yy*xu)/det;\r
                h = 1+hypot(f,g);       ff[2]=f*dt/h;   gg[2]=g*dt/h;\r
                e = u+ff[2];    h = v+gg[2];\r
-                       x.Spline1(dif,e,h,0);   xu=dif.x;       xv=dif.y;\r
-                       y.Spline1(dif,e,h,0);   yu=dif.x;       yv=dif.y;\r
-                       xx = ax.Spline1(e,h,0); yy = ay.Spline1(e,h,0);\r
+                       x->Spline1(dif,e,h,0);  xu=dif.x;       xv=dif.y;\r
+                       y->Spline1(dif,e,h,0);  yu=dif.x;       yv=dif.y;\r
+                       xx = ax->Spline1(e,h,0);        yy = ay->Spline1(e,h,0);\r
                        det = xv*yu-xu*yv;      f = (yy*xv-xx*yv)/det;  g = (xx*yu-yy*xu)/det;\r
                h = 1+hypot(f,g);       ff[3]=f*dt/h;   gg[3]=g*dt/h;\r
                u += ff[0]/6+ff[1]/3+ff[2]/3+ff[3]/6;\r
@@ -1174,8 +1190,8 @@ void MGL_NO_EXPORT flowr(mglBase *gr, double zVal, double u, double v, const mgl
 \r
                for(long j=0;j<num;j++)\r
                {\r
-                       register int fi=j*360/(num-1);\r
-                       register float co = mgl_cos[fi%360], si = mgl_cos[(270+fi)%360];\r
+                       int fi=j*360/(num-1);\r
+                       float co = mgl_cos[fi%360], si = mgl_cos[(270+fi)%360];\r
                        p = pp[0] + t*(rr*co) + q*(rr*si);\r
                        d = (t*si - q*co)^(l + t*(dr*co) + q*(dr*si));\r
                        id[j] = gr->AddPnt(p,cc[0],d);\r
@@ -1189,8 +1205,8 @@ void MGL_NO_EXPORT flowr(mglBase *gr, double zVal, double u, double v, const mgl
                        memcpy(id+num,id,num*sizeof(long));\r
                        for(long j=0;j<num;j++)\r
                        {\r
-                               register int fi=j*360/(num-1);\r
-                               register float co = mgl_cos[fi%360], si = mgl_cos[(270+fi)%360];\r
+                               int fi=j*360/(num-1);\r
+                               float co = mgl_cos[fi%360], si = mgl_cos[(270+fi)%360];\r
                                p = pp[i] + t*(rr*co) + q*(rr*si);\r
                                d = (t*si - q*co)^(l + t*(dr*co) + q*(dr*si));\r
                                id[j] = gr->AddPnt(p,cc[i],d);\r
@@ -1216,31 +1232,41 @@ void MGL_EXPORT mgl_pipe_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const cha
        bool cnt=!mglchr(sch,'#');\r
        if(mglchr(sch,'i'))     r0 = -fabs(r0);\r
 \r
-       mglData xx(x), yy(y), bx(ax), by(ay);\r
+       std::vector<mreal> u, v;\r
+       if(mglchr(sch,'*'))     for(long i=0;i<num;i++) for(long j=0;j<num;j++)\r
+       {\r
+               mreal t = (i+1.)/(num+1.), s = (j+1.)/(num+1.);\r
+               u.push_back(s);         v.push_back(t);\r
+               u.push_back(-s);                v.push_back(-t);\r
+       }\r
+       else    for(long i=0;i<num;i++)\r
+       {\r
+               mreal t = (i+1.)/(num+1.);\r
+               u.push_back(0);         v.push_back(t);\r
+               u.push_back(0);         v.push_back(-t);\r
+               u.push_back(1);         v.push_back(t);\r
+               u.push_back(-1);        v.push_back(-t);\r
+               u.push_back(t);         v.push_back(0);\r
+               u.push_back(-t);        v.push_back(0);\r
+               u.push_back(t);         v.push_back(1);\r
+               u.push_back(-t);        v.push_back(-1);\r
+               if(cnt)\r
+               {\r
+                       u.push_back(t);         v.push_back(0.5);\r
+                       u.push_back(-t);        v.push_back(-0.5);\r
+                       u.push_back(0.5);       v.push_back(t);\r
+                       u.push_back(-0.5);      v.push_back(-t);\r
+               }\r
+       }\r
        for(long k=0;k<ax->GetNz();k++)\r
        {\r
                if(gr->NeedStop())      break;\r
                if(ax->GetNz()>1)       zVal = gr->Min.z+(gr->Max.z-gr->Min.z)*mreal(k)/(ax->GetNz()-1);\r
-               for(long i=0;i<num;i++) for(int s=-1;s<=1;s+=2)\r
-               {\r
-                       mreal u,v;\r
-                       if(gr->NeedStop())      {       i=num;  s=2;    continue;       }\r
-                       u = 0;  v = (i+1.)/(num+1.);\r
-                       flowr(gr, zVal, s*u, s*v, xx, yy, bx, by,r0,ss);\r
-                       u = 1;  v = (i+1.)/(num+1.);\r
-                       flowr(gr, zVal, s*u, s*v, xx, yy, bx, by,r0,ss);\r
-                       u = (i+1.)/(num+1.);    v = 0;\r
-                       flowr(gr, zVal, s*u, s*v, xx, yy, bx, by,r0,ss);\r
-                       u = (i+1.)/(num+1.);    v = 1;\r
-                       flowr(gr, zVal, s*u, s*v, xx, yy, bx, by,r0,ss);\r
-                       if(cnt)\r
-                       {\r
-                               u = 0.5;        v = (i+1.)/(num+1.);\r
-                               flowr(gr, zVal, s*u, s*v, xx, yy, bx, by,r0,ss);\r
-                               u = (i+1.)/(num+1.);    v = 0.5;\r
-                               flowr(gr, zVal, s*u, s*v, xx, yy, bx, by,r0,ss);\r
-                       }\r
-               }\r
+               HMDT bx=mgl_data_subdata(ax,-1,-1,k), by=mgl_data_subdata(ay,-1,-1,k);\r
+#pragma omp parallel for\r
+               for(long i=0;i<long(u.size());i++)      if(!gr->NeedStop())\r
+                       flowr(gr, zVal, u[i], v[i], x, y, bx, by,r0,ss);\r
+               mgl_delete_data(bx);    mgl_delete_data(by);\r
        }\r
        gr->EndGroup();\r
 }\r
@@ -1267,18 +1293,18 @@ void MGL_EXPORT mgl_pipe_2d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, const
 //     Pipe 3d series\r
 //\r
 //-----------------------------------------------------------------------------\r
-void flowr(mglBase *gr, double u, double v, double w, const mglData &x, const mglData &y, const mglData &z, const mglData &ax, const mglData &ay, const mglData &az, double r0,long sc)\r
+void flowr(mglBase *gr, double u, double v, double w, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, double r0,long sc)\r
 {\r
-       static long n=100*(ax.nx+ax.ny+ax.nz);\r
-       long nn = ax.nx*ax.ny*ax.nz;\r
-       bool nboth = x.nx*x.ny*x.nz!=nn || y.nx*y.ny*y.nz!=nn || z.nx*z.ny*z.nz!=nn;\r
+       static long n=100*(ax->GetNx()+ax->GetNy()+ax->GetNz());\r
+       long nn = ax->GetNN();\r
+       bool nboth = x->GetNN()!=nn || y->GetNN()!=nn || z->GetNN()!=nn;\r
        mglPoint *pp = new mglPoint[n], dp;\r
        mreal *cc = new mreal[n];\r
        mglPoint dx(1/fabs(gr->Max.x-gr->Min.x),1/fabs(gr->Max.y-gr->Min.y),1/fabs(gr->Max.z-gr->Min.z));\r
-       mglPoint nx(ax.nx,ax.ny,ax.nz);\r
+       mglPoint nx(ax->GetNx(),ax->GetNy(),ax->GetNz());\r
 \r
-       nn = (ax.nx > ax.ny ? ax.nx : ax.ny);\r
-       nn = (nn > ax.nz ? nn : ax.nz);\r
+       nn = (ax->GetNx() > ax->GetNy() ? ax->GetNx() : ax->GetNy());\r
+       nn = (nn > ax->GetNz() ? nn : ax->GetNz());\r
        mreal dt = 0.2/nn, e,f,g,ee[4],ff[4],gg[4],h,s=2,u1,v1,w1,acc=dt/20;\r
        mreal ss = 16./mgl_ipow(gr->Max.c - gr->Min.c,2);\r
 \r
@@ -1288,9 +1314,9 @@ void flowr(mglBase *gr, double u, double v, double w, const mglData &x, const mg
        bool end = false;\r
        if(nboth) do{\r
                mglPoint dif;\r
-               pp[k].x = x.Spline1(dif,u,0,0); e = ax.Spline1(u,v,w)/dif.x;\r
-               pp[k].y = y.Spline1(dif,v,0,0); f = ay.Spline1(u,v,w)/dif.x;\r
-               pp[k].z = z.Spline1(dif,w,0,0); g = az.Spline1(u,v,w)/dif.x;\r
+               pp[k].x = x->Spline1(dif,u,0,0);        e = ax->Spline1(u,v,w)/dif.x;\r
+               pp[k].y = y->Spline1(dif,v,0,0);        f = ay->Spline1(u,v,w)/dif.x;\r
+               pp[k].z = z->Spline1(dif,w,0,0);        g = az->Spline1(u,v,w)/dif.x;\r
                if(mgl_isbad(e+f+g))    end = true;\r
                else    for(long m=0;m<k-1;m+=10)       // determines encircle\r
                        if(mgl_anorm((pp[k]-pp[m])/dx)<acc)     end = true;\r
@@ -1302,21 +1328,21 @@ void flowr(mglBase *gr, double u, double v, double w, const mglData &x, const mg
                // find next point by midpoint method\r
                h+=1;   ee[0]=e*dt/h;   ff[0]=f*dt/h;   gg[0]=g*dt/h;\r
                u1 = u+ee[0]/2; v1 = v+ff[0]/2; w1 = w+gg[0]/2;\r
-               x.Spline1(dif,u1,0,0);  e = ax.Spline1(u1,v1,w1)/dif.x;\r
-               y.Spline1(dif,v1,0,0);  f = ay.Spline1(u1,v1,w1)/dif.x;\r
-               z.Spline1(dif,w1,0,0);  g = az.Spline1(u1,v1,w1)/dif.x;\r
+               x->Spline1(dif,u1,0,0); e = ax->Spline1(u1,v1,w1)/dif.x;\r
+               y->Spline1(dif,v1,0,0); f = ay->Spline1(u1,v1,w1)/dif.x;\r
+               z->Spline1(dif,w1,0,0); g = az->Spline1(u1,v1,w1)/dif.x;\r
                h = 1+sqrt(e*e+f*f+g*g);\r
                ee[1]=e*dt/h;   ff[1]=f*dt/h;   gg[1]=g*dt/h;\r
                u1 = u+ee[1]/2; v1 = v+ff[1]/2; w1 = w+gg[1]/2;\r
-               x.Spline1(dif,u1,0,0);  e = ax.Spline1(u1,v1,w1)/dif.x;\r
-               y.Spline1(dif,v1,0,0);  f = ay.Spline1(u1,v1,w1)/dif.x;\r
-               z.Spline1(dif,w1,0,0);  g = az.Spline1(u1,v1,w1)/dif.x;\r
+               x->Spline1(dif,u1,0,0); e = ax->Spline1(u1,v1,w1)/dif.x;\r
+               y->Spline1(dif,v1,0,0); f = ay->Spline1(u1,v1,w1)/dif.x;\r
+               z->Spline1(dif,w1,0,0); g = az->Spline1(u1,v1,w1)/dif.x;\r
                h = 1+sqrt(e*e+f*f+g*g);\r
                ee[2]=e*dt/h;   ff[2]=f*dt/h;   gg[2]=g*dt/h;\r
                u1 = u+ee[2];   v1 = v+ff[2];   w1 = w+gg[2];\r
-               x.Spline1(dif,u1,0,0);  e = ax.Spline1(u1,v1,w1)/dif.x;\r
-               y.Spline1(dif,v1,0,0);  f = ay.Spline1(u1,v1,w1)/dif.x;\r
-               z.Spline1(dif,w1,0,0);  g = az.Spline1(u1,v1,w1)/dif.x;\r
+               x->Spline1(dif,u1,0,0); e = ax->Spline1(u1,v1,w1)/dif.x;\r
+               y->Spline1(dif,v1,0,0); f = ay->Spline1(u1,v1,w1)/dif.x;\r
+               z->Spline1(dif,w1,0,0); g = az->Spline1(u1,v1,w1)/dif.x;\r
                h = 1+sqrt(e*e+f*f+g*g);\r
                ee[3]=e*dt/h;   ff[3]=f*dt/h;   gg[3]=g*dt/h;\r
                u += ee[0]/6+ee[1]/3+ee[2]/3+ee[3]/6;\r
@@ -1327,11 +1353,11 @@ void flowr(mglBase *gr, double u, double v, double w, const mglData &x, const mg
        } while(!end);\r
        else do{\r
                mglPoint dif;\r
-               register mreal xu,xv,xw,yu,yv,yw,zv,zu,zw,det,xx,yy,zz;\r
-               pp[k].x = x.Spline1(dif,u,v,w); xu=dif.x;       xv=dif.y;       xw=dif.z;\r
-               pp[k].y = y.Spline1(dif,u,v,w); yu=dif.x;       yv=dif.y;       yw=dif.z;\r
-               pp[k].z = z.Spline1(dif,u,v,w); zu=dif.x;       zv=dif.y;       zw=dif.z;\r
-               xx = ax.Spline1(u,v,w); yy = ay.Spline1(u,v,w); zz = az.Spline1(u,v,w);\r
+               mreal xu,xv,xw,yu,yv,yw,zv,zu,zw,det,xx,yy,zz;\r
+               pp[k].x = x->Spline1(dif,u,v,w);        xu=dif.x;       xv=dif.y;       xw=dif.z;\r
+               pp[k].y = y->Spline1(dif,u,v,w);        yu=dif.x;       yv=dif.y;       yw=dif.z;\r
+               pp[k].z = z->Spline1(dif,u,v,w);        zu=dif.x;       zv=dif.y;       zw=dif.z;\r
+               xx = ax->Spline1(u,v,w);        yy = ay->Spline1(u,v,w);        zz = az->Spline1(u,v,w);\r
                det = -xu*yv*zw+xv*yu*zw+xu*yw*zv-xw*yu*zv-xv*yw*zu+xw*yv*zu;\r
                e = (-xv*yw*zz+xw*yv*zz+xv*yy*zw-xx*yv*zw-xw*yy*zv+xx*yw*zv)/det;\r
                f = (xu*yw*zz-xw*yu*zz-xu*yy*zw+xx*yu*zw+xw*yy*zu-xx*yw*zu)/det;\r
@@ -1347,9 +1373,9 @@ void flowr(mglBase *gr, double u, double v, double w, const mglData &x, const mg
                // find next point by midpoint method\r
                h+=1;   ee[0]=e*dt/h;   ff[0]=f*dt/h;   gg[0]=g*dt/h;\r
                u1 = u+ee[0]/2; v1 = v+ff[0]/2; w1 = w+gg[0]/2;\r
-               x.Spline1(dif,u1,v1,w1);        xu=dif.x;       xv=dif.y;       xw=dif.z;       xx = ax.Spline1(u1,v1,w1);\r
-               y.Spline1(dif,u1,v1,w1);        yu=dif.x;       yv=dif.y;       yw=dif.z;       yy = ay.Spline1(u1,v1,w1);\r
-               z.Spline1(dif,u1,v1,w1);        zu=dif.x;       zv=dif.y;       zw=dif.z;       zz = az.Spline1(u1,v1,w1);\r
+               x->Spline1(dif,u1,v1,w1);       xu=dif.x;       xv=dif.y;       xw=dif.z;       xx = ax->Spline1(u1,v1,w1);\r
+               y->Spline1(dif,u1,v1,w1);       yu=dif.x;       yv=dif.y;       yw=dif.z;       yy = ay->Spline1(u1,v1,w1);\r
+               z->Spline1(dif,u1,v1,w1);       zu=dif.x;       zv=dif.y;       zw=dif.z;       zz = az->Spline1(u1,v1,w1);\r
                det = -xu*yv*zw+xv*yu*zw+xu*yw*zv-xw*yu*zv-xv*yw*zu+xw*yv*zu;\r
                e = (-xv*yw*zz+xw*yv*zz+xv*yy*zw-xx*yv*zw-xw*yy*zv+xx*yw*zv)/det;\r
                f = (xu*yw*zz-xw*yu*zz-xu*yy*zw+xx*yu*zw+xw*yy*zu-xx*yw*zu)/det;\r
@@ -1357,9 +1383,9 @@ void flowr(mglBase *gr, double u, double v, double w, const mglData &x, const mg
                h = 1+sqrt(e*e+f*f+g*g);\r
                ee[1]=e*dt/h;   ff[1]=f*dt/h;   gg[1]=g*dt/h;\r
                u1 = u+ee[1]/2; v1 = v+ff[1]/2; w1 = w+gg[1]/2;\r
-               x.Spline1(dif,u1,v1,w1);        xu=dif.x;       xv=dif.y;       xw=dif.z;       xx = ax.Spline1(u1,v1,w1);\r
-               y.Spline1(dif,u1,v1,w1);        yu=dif.x;       yv=dif.y;       yw=dif.z;       yy = ay.Spline1(u1,v1,w1);\r
-               z.Spline1(dif,u1,v1,w1);        zu=dif.x;       zv=dif.y;       zw=dif.z;       zz = az.Spline1(u1,v1,w1);\r
+               x->Spline1(dif,u1,v1,w1);       xu=dif.x;       xv=dif.y;       xw=dif.z;       xx = ax->Spline1(u1,v1,w1);\r
+               y->Spline1(dif,u1,v1,w1);       yu=dif.x;       yv=dif.y;       yw=dif.z;       yy = ay->Spline1(u1,v1,w1);\r
+               z->Spline1(dif,u1,v1,w1);       zu=dif.x;       zv=dif.y;       zw=dif.z;       zz = az->Spline1(u1,v1,w1);\r
                det = -xu*yv*zw+xv*yu*zw+xu*yw*zv-xw*yu*zv-xv*yw*zu+xw*yv*zu;\r
                e = (-xv*yw*zz+xw*yv*zz+xv*yy*zw-xx*yv*zw-xw*yy*zv+xx*yw*zv)/det;\r
                f = (xu*yw*zz-xw*yu*zz-xu*yy*zw+xx*yu*zw+xw*yy*zu-xx*yw*zu)/det;\r
@@ -1367,9 +1393,9 @@ void flowr(mglBase *gr, double u, double v, double w, const mglData &x, const mg
                h = 1+sqrt(e*e+f*f+g*g);\r
                ee[2]=e*dt/h;   ff[2]=f*dt/h;   gg[2]=g*dt/h;\r
                u1 = u+ee[2];   v1 = v+ff[2];   w1 = w+gg[2];\r
-               x.Spline1(dif,u1,v1,w1);        xu=dif.x;       xv=dif.y;       xw=dif.z;       xx = ax.Spline1(u1,v1,w1);\r
-               y.Spline1(dif,u1,v1,w1);        yu=dif.x;       yv=dif.y;       yw=dif.z;       yy = ay.Spline1(u1,v1,w1);\r
-               z.Spline1(dif,u1,v1,w1);        zu=dif.x;       zv=dif.y;       zw=dif.z;       zz = az.Spline1(u1,v1,w1);\r
+               x->Spline1(dif,u1,v1,w1);       xu=dif.x;       xv=dif.y;       xw=dif.z;       xx = ax->Spline1(u1,v1,w1);\r
+               y->Spline1(dif,u1,v1,w1);       yu=dif.x;       yv=dif.y;       yw=dif.z;       yy = ay->Spline1(u1,v1,w1);\r
+               z->Spline1(dif,u1,v1,w1);       zu=dif.x;       zv=dif.y;       zw=dif.z;       zz = az->Spline1(u1,v1,w1);\r
                det = -xu*yv*zw+xv*yu*zw+xu*yw*zv-xw*yu*zv-xv*yw*zu+xw*yv*zu;\r
                e = (-xv*yw*zz+xw*yv*zz+xv*yy*zw-xx*yv*zw-xw*yy*zv+xx*yw*zv)/det;\r
                f = (xu*yw*zz-xw*yu*zz-xu*yy*zw+xx*yu*zw+xw*yy*zu-xx*yw*zu)/det;\r
@@ -1393,8 +1419,8 @@ void flowr(mglBase *gr, double u, double v, double w, const mglData &x, const mg
 \r
                for(long j=0;j<num;j++)\r
                {\r
-                       register int fi=j*360/(num-1);\r
-                       register float co = mgl_cos[fi%360], si = mgl_cos[(270+fi)%360];\r
+                       int fi=j*360/(num-1);\r
+                       float co = mgl_cos[fi%360], si = mgl_cos[(270+fi)%360];\r
                        p = pp[0] + t*(rr*co) + q*(rr*si);\r
                        d = (t*si - q*co)^(l + t*(dr*co) + q*(dr*si));\r
                        id[j] = gr->AddPnt(p,cc[0],d);\r
@@ -1408,8 +1434,8 @@ void flowr(mglBase *gr, double u, double v, double w, const mglData &x, const mg
                        memcpy(id+num,id,num*sizeof(long));\r
                        for(long j=0;j<num;j++)\r
                        {\r
-                               register int fi=j*360/(num-1);\r
-                               register float co = mgl_cos[fi%360], si = mgl_cos[(270+fi)%360];\r
+                               int fi=j*360/(num-1);\r
+                               float co = mgl_cos[fi%360], si = mgl_cos[(270+fi)%360];\r
                                p = pp[i] + t*(rr*co) + q*(rr*si);\r
                                d = (t*si - q*co)^(l + t*(dr*co) + q*(dr*si));\r
                                id[j] = gr->AddPnt(p,cc[i],d);\r
@@ -1433,33 +1459,37 @@ void MGL_EXPORT mgl_pipe_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay,
        long ss = gr->AddTexture(sch);\r
        bool cnt=!mglchr(sch,'#');\r
 \r
-       mglData xx(x), yy(y), zz(z), bx(ax), by(ay), bz(az);\r
-       for(long i=0;i<num;i++) for(long j=0;j<num;j++) for(int s=-1;s<=1;s+=2)\r
+       std::vector<mreal> u, v, w;\r
+       for(long i=0;i<num;i++) for(long j=0;j<num;j++)\r
        {\r
-               mreal u,v,w;\r
-               if(gr->NeedStop())      {       i=j=num;        s=2;    continue;       }\r
-               u = (i+1.)/(num+1.);    v = (j+1.)/(num+1.);    w = 0;\r
-               flowr(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,r0,ss);\r
-               u = (i+1.)/(num+1.);    v = (j+1.)/(num+1.);    w = 1;\r
-               flowr(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,r0,ss);\r
-               u = 0;  v = (j+1.)/(num+1.);    w = (i+1.)/(num+1.);\r
-               flowr(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,r0,ss);\r
-               u = 1;  v = (j+1.)/(num+1.);    w = (i+1.)/(num+1.);\r
-               flowr(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,r0,ss);\r
-               u = (i+1.)/(num+1.);    v = 0;  w = (j+1.)/(num+1.);\r
-               flowr(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,r0,ss);\r
-               u = (i+1.)/(num+1.);    v = 1;  w = (j+1.)/(num+1.);\r
-               flowr(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,r0,ss);\r
+               mreal t = (i+1.)/(num+1.), s = (j+1.)/(num+1.);\r
+               u.push_back(t);         v.push_back(s);         w.push_back(0);\r
+               u.push_back(-t);        v.push_back(-s);        w.push_back(0);\r
+               u.push_back(t);         v.push_back(s);         w.push_back(1);\r
+               u.push_back(-t);        v.push_back(-s);        w.push_back(-1);\r
+\r
+               u.push_back(t);         v.push_back(0);         w.push_back(s);\r
+               u.push_back(-t);        v.push_back(0);         w.push_back(-s);\r
+               u.push_back(t);         v.push_back(1);         w.push_back(s);\r
+               u.push_back(-t);        v.push_back(-1);        w.push_back(-s);\r
+\r
+               u.push_back(0);         v.push_back(s);         w.push_back(t);\r
+               u.push_back(0);         v.push_back(-s);        w.push_back(-t);\r
+               u.push_back(1);         v.push_back(s);         w.push_back(t);\r
+               u.push_back(-1);        v.push_back(-s);        w.push_back(-t);\r
                if(cnt)\r
                {\r
-                       u = (i+1.)/(num+1.);    v = (j+1.)/(num+1.);    w = 0.5;\r
-                       flowr(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,r0,ss);\r
-                       u = 0.5;        v = (j+1.)/(num+1.);    w = (i+1.)/(num+1.);\r
-                       flowr(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,r0,ss);\r
-                       u = (i+1.)/(num+1.);    v = 0.5;        w = (j+1.)/(num+1.);\r
-                       flowr(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,r0,ss);\r
+                       u.push_back(t);         v.push_back(s);         w.push_back(0.5);\r
+                       u.push_back(-t);        v.push_back(-s);        w.push_back(-0.5);\r
+                       u.push_back(t);         v.push_back(0.5);       w.push_back(s);\r
+                       u.push_back(-t);        v.push_back(-0.5);      w.push_back(-s);\r
+                       u.push_back(0.5);       v.push_back(s);         w.push_back(t);\r
+                       u.push_back(-0.5);      v.push_back(-s);        w.push_back(-t);\r
                }\r
        }\r
+#pragma omp parallel for\r
+       for(long i=0;i<long(u.size());i++)      if(!gr->NeedStop())\r
+               flowr(gr, u[i], v[i], w[i], x, y, z, ax, ay, az,r0,ss);\r
        gr->EndGroup();\r
 }\r
 //-----------------------------------------------------------------------------\r
index a6090a5d28274ff90aadb4480a497a7c9d4b89f0..b6b91488f32d96d740d8e38ae8a5aecf5404e805 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * surf.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -22,7 +22,6 @@
 #include "mgl2/data.h"\r
 #include "mgl2/eval.h"\r
 #include "mgl2/base.h"\r
-//#include <vector>\r
 //-----------------------------------------------------------------------------\r
 //\r
 //     CloudQ series\r
@@ -49,7 +48,7 @@ void MGL_EXPORT mgl_cloud_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const cha
        mreal   alpha = gr->AlphaDef;\r
        bool inv = mglchr(sch,'i');\r
        bool dot = mglchr(sch,'.');\r
-       alpha /= pow(n/tx*m/ty*l/tz,1./3)/20;\r
+       alpha /= pow((n/tx)*(m/ty)*(l/tz),1./3)/20;\r
        if(alpha>1)     alpha = 1;\r
        long ss = gr->AddTexture(sch);\r
 \r
@@ -75,7 +74,7 @@ void MGL_EXPORT mgl_cloud_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const cha
                if(gr->NeedStop())      break;\r
                for(long j=0;j<m;j++)   for(long i=0;i<n;i++)\r
                {\r
-                       register long i0 = i+n*(j+m*k);\r
+                       long i0 = i+n*(j+m*k);\r
                        if(i<n-1 && j<m-1)      gr->quad_plot(pos[i0],pos[i0+1],pos[i0+n],pos[i0+n+1]);\r
                        if(i<n-1 && k<l-1)      gr->quad_plot(pos[i0],pos[i0+1],pos[i0+n*m],pos[i0+n*m+1]);\r
                        if(k<l-1 && j<m-1)      gr->quad_plot(pos[i0],pos[i0+n],pos[i0+n*m],pos[i0+n+n*m]);\r
@@ -108,27 +107,40 @@ void MGL_EXPORT mgl_cloud_(uintptr_t *gr, uintptr_t *a, const char *sch, const c
 //     Surf3 series\r
 //\r
 //-----------------------------------------------------------------------------\r
+mreal MGL_NO_EXPORT mgl_get_norm(mreal x, mreal d1, mreal d2, mreal d3)\r
+{\r
+       mreal nx = d1*(1-x) + d2*x;\r
+       if(mgl_isbad(nx))\r
+       {\r
+               nx = d1*(1+x) - d3*x;\r
+               if(mgl_isbad(nx))\r
+               {\r
+                       if(mgl_isfin(d1))       nx = d1;\r
+                       if(mgl_isfin(d2))       nx = d2;\r
+                       if(mgl_isfin(d3))       nx = d3;\r
+               }\r
+       }\r
+       return nx;\r
+}\r
 mglPoint MGL_NO_EXPORT mgl_normal_3d(HCDT a, mglPoint p, bool inv, long n,long m,long l)\r
 {\r
-       register long i,j,k;\r
-       register mreal x=p.x, y=p.y, z=p.z;\r
+       mreal x=p.x, y=p.y, z=p.z;\r
        mreal nx=0, ny=0, nz=0;\r
-       i=long(x);      j=long(y);      k=long(z);\r
+       long i=long(x), j=long(y), k=long(z);\r
        i = i<n-1 ? i:n-2;      j = j<m-1 ? j:m-2;      k = k<l-1 ? k:l-2;\r
        x-=i;   y-=j;   z-=k;\r
 \r
-       nx = a->dvx(i,j,k)*(1-x) + a->dvx(i+1,j,k)*x;\r
-       ny = a->dvy(i,j,k)*(1-y) + a->dvy(i,j+1,k)*y;\r
-       nz = a->dvz(i,j,k)*(1-z) + a->dvz(i,j,k+1)*z;\r
+       nx = mgl_get_norm(x, a->dvx(i,j,k), a->dvx(i+1,j,k), i>0?a->dvx(i-1,j,k):NAN);\r
+       ny = mgl_get_norm(y, a->dvy(i,j,k), a->dvy(i,j+1,k), j>0?a->dvy(i,j-1,k):NAN);\r
+       nz = mgl_get_norm(z, a->dvz(i,j,k), a->dvz(i,j,k+1), k>0?a->dvz(i,j,k-1):NAN);\r
        return inv ? mglPoint(nx,ny,nz) : mglPoint(-nx,-ny,-nz);\r
 }\r
 //-----------------------------------------------------------------------------\r
-mreal MGL_NO_EXPORT mgl_normal_1d(HCDT a, mreal x, bool inv, long n)\r
+mreal MGL_NO_EXPORT mgl_normal_1d(HCDT a, mreal x, long n)\r
 {\r
-       register long i=long(x);        x-=i;\r
-       mreal nx = a->dvx(i);\r
-       if(i<n-1)       nx = nx*(1-x) + a->dvx(i+1)*x;\r
-       return inv ? nx : -nx;\r
+       long i=long(x);\r
+       i = i<n-1 ? i:n-2;      x-=i;\r
+       return mgl_get_norm(x, a->dvx(i), a->dvx(i+1), i>0?a->dvx(i-1):NAN);\r
 }\r
 //-----------------------------------------------------------------------------\r
 mglPoint MGL_NO_EXPORT mgl_find_norm(bool nboth, HCDT x, HCDT y, HCDT z, HCDT a, mglPoint u, bool inv, long n,long m,long l)\r
@@ -136,9 +148,9 @@ mglPoint MGL_NO_EXPORT mgl_find_norm(bool nboth, HCDT x, HCDT y, HCDT z, HCDT a,
        mglPoint s = mgl_normal_3d(a,u,inv,n,m,l), t, q;\r
        if(nboth)\r
        {\r
-               q.x = s.x/mgl_normal_1d(x,u.x,true,n);\r
-               q.y = s.y/mgl_normal_1d(y,u.y,true,m);\r
-               q.z = s.z/mgl_normal_1d(z,u.z,true,l);\r
+               q.x = s.x/mgl_normal_1d(x,u.x,n);\r
+               q.y = s.y/mgl_normal_1d(y,u.y,m);\r
+               q.z = s.z/mgl_normal_1d(z,u.z,l);\r
        }\r
        else\r
        {\r
@@ -164,7 +176,7 @@ void MGL_EXPORT mgl_surf3_plot(HMGL gr, long n,long m,long *kx1,long *kx2,long *
 #pragma omp parallel for private(id,us,pd,pp) collapse(2)\r
        for(long j=0;j<m-1;j++) for(long i=0;i<n-1;i++)\r
        {\r
-               register long i0 = i+n*j,ii,jj,k;\r
+               long i0 = i+n*j,ii,jj,k;\r
                // find ID of points of Surf3 intersection with cell i0\r
                memset(id,-1,12*sizeof(long));  long ni = 0;\r
                if(kx1[i0]>=0)          id[ni++] = kx1[i0];\r
@@ -186,7 +198,7 @@ void MGL_EXPORT mgl_surf3_plot(HMGL gr, long n,long m,long *kx1,long *kx2,long *
                // remove points which is too close to first one\r
                for(jj=1;jj<ni;)\r
                {\r
-                       register mreal d = mgl_norm(pp[jj] - pp[0]);\r
+                       mreal d = mgl_norm(pp[jj] - pp[0]);\r
                        if(d>1e-5)      jj++;\r
                        else\r
                        {       ni--;   for(ii=jj;ii<ni;ii++)   id[ii]=id[ii+1];        }\r
@@ -198,7 +210,7 @@ void MGL_EXPORT mgl_surf3_plot(HMGL gr, long n,long m,long *kx1,long *kx2,long *
                mreal d0=2;\r
                for(jj=1,ii=2;ii<ni;ii++)\r
                {\r
-                       register mreal d = mgl_cos_pp(pp,0,ii,1);\r
+                       mreal d = mgl_cos_pp(pp,0,ii,1);\r
                        if(d<d0)        {       d0=d;   jj=ii;  }\r
                }\r
                // copy first 2 points as base\r
@@ -212,7 +224,7 @@ void MGL_EXPORT mgl_surf3_plot(HMGL gr, long n,long m,long *kx1,long *kx2,long *
                        for(i0=-1,ii=1,d0=-2;ii<ni;ii++)\r
                        {\r
                                if(us[ii])      continue;\r
-                               register mreal d = mgl_cos_pp(pp,0,ii,jj);\r
+                               mreal d = mgl_cos_pp(pp,0,ii,jj);\r
                                if(d>d0)        {       d0=d;   i0=ii;  }\r
                        }\r
                        if(i0<0)        break;  // no more triangles. NOTE: should be never here\r
@@ -260,8 +272,9 @@ void MGL_NO_EXPORT mgl_surf3ca_gen(HMGL gr, double val, HCDT x, HCDT y, HCDT z,
                size_t kk1 = kk.size();\r
                for(long j=0;j<m;j++)   for(long i=0;i<n;i++)\r
                {\r
-                       register long i1 = i+n*j;\r
+                       long i1 = i+n*j;\r
                        mreal a0 = a->v(i,j,k);\r
+                       if(mgl_isnan(a0))       continue;\r
                        if(i<n-1)\r
                        {\r
                                mreal d = mgl_d(val,a0,a->v(i+1,j,k));\r
@@ -275,7 +288,7 @@ void MGL_NO_EXPORT mgl_surf3ca_gen(HMGL gr, double val, HCDT x, HCDT y, HCDT z,
                                {       ky2[i1] = kk.size();    kk.push_back(mglPoint(i,j+d,k));        }\r
                        }\r
                        if(k>0)\r
-                       {       \r
+                       {\r
                                mreal d = mgl_d(val,a->v(i,j,k-1),a0);\r
                                if(d>=0 && d<1)\r
                                {       kz[i1] = kk.size();             kk.push_back(mglPoint(i,j,k+d-1));      }\r
@@ -285,36 +298,38 @@ void MGL_NO_EXPORT mgl_surf3ca_gen(HMGL gr, double val, HCDT x, HCDT y, HCDT z,
                if(b && c)      for(size_t i=kk1;i<kk.size();i++)\r
                {\r
                        mglPoint &u = kk[i];\r
-                       u.c = gr->AddPnt(nboth ? mglPoint(x->linear(u.x,0,0),y->linear(u.y,0,0),z->linear(u.z,0,0)) : \r
+                       mreal cc = c->linear(u.x,u.y,u.z), bb = b->linear(u.x,u.y,u.z);\r
+                       if(mgl_isnan(cc) || mgl_isnan(bb))      u.c = -1;       else\r
+                       u.c = gr->AddPnt(nboth ? mglPoint(x->linear(u.x,0,0),y->linear(u.y,0,0),z->linear(u.z,0,0)) :\r
                                        mglPoint(x->linear(u.x,u.y,u.z),y->linear(u.x,u.y,u.z),z->linear(u.x,u.y,u.z)),\r
-                                       gr->GetC(ss,c->linear(u.x,u.y,u.z)),\r
-                                       mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l),\r
-                                       gr->GetA(b->linear(u.x,u.y,u.z)));\r
+                                       gr->GetC(ss,cc), mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l), gr->GetA(bb));\r
                }\r
                else if(c)      for(size_t i=kk1;i<kk.size();i++)\r
                {\r
                        mglPoint &u = kk[i];\r
-                       u.c = gr->AddPnt(nboth ? mglPoint(x->linear(u.x,0,0),y->linear(u.y,0,0),z->linear(u.z,0,0)) : \r
+                       mreal cc = c->linear(u.x,u.y,u.z);\r
+                       if(mgl_isnan(cc))       u.c = -1;       else\r
+                       u.c = gr->AddPnt(nboth ? mglPoint(x->linear(u.x,0,0),y->linear(u.y,0,0),z->linear(u.z,0,0)) :\r
                                        mglPoint(x->linear(u.x,u.y,u.z),y->linear(u.x,u.y,u.z),z->linear(u.x,u.y,u.z)),\r
-                                       gr->GetC(ss,c->linear(u.x,u.y,u.z)),\r
-                                       mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l));\r
+                                       gr->GetC(ss,cc), mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l));\r
                }\r
                else if(b)      for(size_t i=kk1;i<kk.size();i++)\r
                {\r
                        mglPoint &u = kk[i];\r
-                       u.c = gr->AddPnt(nboth ? mglPoint(x->linear(u.x,0,0),y->linear(u.y,0,0),z->linear(u.z,0,0)) : \r
+                       mreal bb = b->linear(u.x,u.y,u.z);\r
+                       if(mgl_isnan(bb))       u.c = -1;       else\r
+                       u.c = gr->AddPnt(nboth ? mglPoint(x->linear(u.x,0,0),y->linear(u.y,0,0),z->linear(u.z,0,0)) :\r
                                        mglPoint(x->linear(u.x,u.y,u.z),y->linear(u.x,u.y,u.z),z->linear(u.x,u.y,u.z)),\r
-                                       cv, mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l),\r
-                                       gr->GetA(b->linear(u.x,u.y,u.z)));\r
+                                       cv, mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l), gr->GetA(bb));\r
                }\r
                else    for(size_t i=kk1;i<kk.size();i++)\r
                {\r
                        mglPoint &u = kk[i];\r
-                       u.c = gr->AddPnt(nboth ? mglPoint(x->linear(u.x,0,0),y->linear(u.y,0,0),z->linear(u.z,0,0)) : \r
+                       u.c = gr->AddPnt(nboth ? mglPoint(x->linear(u.x,0,0),y->linear(u.y,0,0),z->linear(u.z,0,0)) :\r
                                        mglPoint(x->linear(u.x,u.y,u.z),y->linear(u.x,u.y,u.z),z->linear(u.x,u.y,u.z)),\r
                                        cv, mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l));\r
                }\r
-               \r
+\r
                if(k>0) mgl_surf3_plot(gr,n,m,kx1,kx2,ky1,ky2,kz,kk,wire);\r
        }\r
        delete []kx1;   delete []kx2;   delete []ky1;\r
@@ -408,20 +423,21 @@ void MGL_EXPORT mgl_surf3a_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b,
        long num = mgl_isnan(r)?3:long(r+0.5);\r
        if(b->GetNx()==num && b->GetNy()==1 && b->GetNz()==1)\r
        {\r
-               mreal v,a0=gr->AlphaDef;\r
+               mreal a0=gr->AlphaDef;\r
                for(long i=0;i<num;i++)\r
                {\r
-                       v = gr->Max.c + (gr->Min.c-gr->Max.c)*(i+1.)/(num+1);\r
+                       mreal v = gr->Max.c + (gr->Min.c-gr->Max.c)*(i+1.)/(num+1);\r
                        gr->AlphaDef = gr->GetA(b->v(i));\r
                        mgl_surf3_xyz_val(gr,v,x,y,z,a,sch,0);\r
                }\r
                gr->AlphaDef = a0;\r
        }\r
-       else for(long i=0;i<num;i++)\r
-       {\r
-               mreal v = gr->Max.c + (gr->Min.c-gr->Max.c)*(i+1.)/(num+1);\r
-               mgl_surf3a_xyz_val(gr,v,x,y,z,a,b,sch,0);\r
-       }\r
+       else\r
+               for(long i=0;i<num;i++)\r
+               {\r
+                       mreal v = gr->Max.c + (gr->Min.c-gr->Max.c)*(i+1.)/(num+1);\r
+                       mgl_surf3a_xyz_val(gr,v,x,y,z,a,b,sch,0);\r
+               }\r
        gr->LoadState();\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -604,50 +620,41 @@ void MGL_EXPORT mgl_beam_val(HMGL gr, double val, HCDT tr, HCDT g1, HCDT g2, HCD
        if(tr->GetNx()<3 || tr->GetNy()<n || g1->GetNx()<3 || g1->GetNy()<n || g2->GetNx()<3 || g2->GetNy()<n)\r
        {       gr->SetWarn(mglWarnDim,"Beam"); return; }\r
        mglData x(a),y(a),z(a),b(a);\r
-       register long i,j,k,i0;\r
        mreal asum0=1;  r = fabs(r);\r
-       if(flag & 4)    for(j=0;j<m*l;j++)      asum0 += a->vthr(j)*a->vthr(j);\r
+       if(flag & 4)    for(long j=0;j<m*l;j++) asum0 += a->vthr(j)*a->vthr(j);\r
        if(asum0==0)    {       gr->SetWarn(mglWarnZero,"Beam");        return; }\r
-       for(i=0;i<n;i++)\r
+#pragma omp parallel for\r
+       for(long i=0;i<n;i++)\r
        {\r
-               if(gr->NeedStop())      break;\r
+               if(gr->NeedStop())      continue;\r
                if(flag & 4)\r
                {\r
                        mreal asum=0, amax=0;\r
-                       for(j=0;j<m*l;j++)\r
+                       for(long j=0;j<m*l;j++)\r
                        {\r
-                               register mreal aa = a->vthr(j+m*l*i);\r
+                               mreal aa = a->vthr(j+m*l*i);\r
                                asum += aa*aa;  amax = amax>aa ? amax : aa;\r
                        }\r
                        amax = amax?sqrt(asum/asum0)/amax:0;\r
-#pragma omp parallel for\r
-                       for(j=0;j<m*l;j++)      b.a[j+m*l*i] = b.a[j+m*l*i]*amax;\r
+                       for(long j=0;j<m*l;j++) b.a[j+m*l*i] = b.a[j+m*l*i]*amax;\r
                }\r
-               if(flag & 1)\r
-#pragma omp parallel for collapse(2)\r
-                       for(j=0;j<m;j++)        for(k=0;k<l;k++)\r
-                       {\r
-                               i0 = j+m*(k+l*i);\r
-                               x.a[i0] = 2*j/(m-1.)-1;\r
-                               y.a[i0] = 2*k/(l-1.)-1;\r
-                               z.a[i0] = gr->Max.z*i/(n-1.);\r
-                       }\r
-               else\r
-#pragma omp parallel for collapse(2)\r
-                       for(j=0;j<m;j++)        for(k=0;k<l;k++)\r
-                       {\r
-                               i0 = j+m*(k+l*i);\r
-                               x.a[i0] = tr->v(0,i) + g1->v(0,i)*(2*j/(m-1.)-1)*r + g2->v(0,i)*(2*k/(l-1.)-1)*r;\r
-                               y.a[i0] = tr->v(1,i) + g1->v(1,i)*(2*j/(m-1.)-1)*r + g2->v(1,i)*(2*k/(l-1.)-1)*r;\r
-                               z.a[i0] = tr->v(2,i) + g1->v(2,i)*(2*j/(m-1.)-1)*r + g2->v(2,i)*(2*k/(l-1.)-1)*r;\r
-                       }\r
-               if(flag & 2)\r
-#pragma omp parallel for collapse(2)\r
-                       for(j=0;j<m;j++)        for(k=0;k<l;k++)\r
-                       {\r
-                               long i0 = j+m*(k+l*i);\r
-                               x.a[i0] = hypot(x.a[i0],y.a[i0]);\r
-                       }\r
+               const long ii=m*l*i;\r
+               if(flag & 1)    for(long k=0;k<l;k++)   for(long j=0;j<m;j++)\r
+               {\r
+                       long i0 = ii+j+m*k;\r
+                       x.a[i0] = 2*j/(m-1.)-1;\r
+                       y.a[i0] = 2*k/(l-1.)-1;\r
+                       z.a[i0] = gr->Max.z*i/(n-1.);\r
+               }\r
+               else    for(long k=0;k<l;k++)   for(long j=0;j<m;j++)\r
+               {\r
+                       long i0 = ii+j+m*k;\r
+                       x.a[i0] = tr->v(0,i) + g1->v(0,i)*(2*j/(m-1.)-1)*r + g2->v(0,i)*(2*k/(l-1.)-1)*r;\r
+                       y.a[i0] = tr->v(1,i) + g1->v(1,i)*(2*j/(m-1.)-1)*r + g2->v(1,i)*(2*k/(l-1.)-1)*r;\r
+                       z.a[i0] = tr->v(2,i) + g1->v(2,i)*(2*j/(m-1.)-1)*r + g2->v(2,i)*(2*k/(l-1.)-1)*r;\r
+               }\r
+               if(flag & 2)    for(long j=0;j<m*l;j++)\r
+               {       long i0 = j+ii; x.a[i0] = hypot(x.a[i0],y.a[i0]);       }\r
        }\r
        mgl_surf3_xyz_val(gr,val,&x,&y,&z,&b,stl,0);\r
 }\r
index 1f0001bfc9c89f981f95f34a3d6eedd7dc0d10a4..068db2aaf5689bde5d5f473b873761ebb3fbe7f3 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * window.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -39,8 +39,8 @@ void mglCanvasWnd::SetCurFig(int c)
 //-----------------------------------------------------------------------------\r
 void mglCanvasWnd::ResetFrames()\r
 {\r
-       if(GG)  free(GG);       GG = 0;\r
-       NumFig = CurFig = 0;\r
+       if(GG)  free(GG);\r
+       GG = 0; NumFig = CurFig = 0;\r
        mglCanvas::ResetFrames();\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -86,20 +86,24 @@ void mglCanvasWnd::DelFrame(long i)
 //-----------------------------------------------------------------------------\r
 void mglCanvasWnd::SetDrawFunc(int (*draw)(mglBase *gr, void *p), void *par, void (*reload)(void *p))\r
 {\r
-       ResetFrames();\r
-       if(get(MGL_CLF_ON_UPD)) DefaultPlotParam();\r
-       const std::string loc = setlocale(LC_NUMERIC, NULL);    setlocale(LC_NUMERIC, "C");\r
-       // use frames for quickly redrawing while adding/changing primitives\r
-       if(mgl_is_frames(this)) NewFrame();\r
+       if(draw)\r
+       {\r
+               ResetFrames();\r
+               if(get(MGL_CLF_ON_UPD)) DefaultPlotParam();\r
+               const std::string loc = setlocale(LC_NUMERIC, "C");\r
+               // use frames for quickly redrawing while adding/changing primitives\r
+               if(mgl_is_frames(this)) NewFrame();\r
 \r
-       int n = draw ? draw(this,par) : 0;\r
-       if(n<NumFig && n>=0)    NumFig = n;\r
-       DrawFunc = draw;                FuncPar = par;\r
-       LoadFunc = reload;\r
+               int n = draw(this,par);\r
+               if(n<NumFig && n>=0)    NumFig = n;\r
+               DrawFunc = draw;                FuncPar = par;\r
+               LoadFunc = reload;\r
 \r
-       if(mgl_is_frames(this)) EndFrame();\r
-       if(n>=0)        SetCurFig(0);\r
-       setlocale(LC_NUMERIC, loc.c_str());\r
+               if(mgl_is_frames(this)) EndFrame();\r
+               if(n>=0)        SetCurFig(0);\r
+               setlocale(LC_NUMERIC, loc.c_str());\r
+       }\r
+       else    LoadFunc = 0;\r
 }\r
 //-----------------------------------------------------------------------------\r
 const unsigned char *mglCanvasWnd::GetBits()\r
@@ -117,7 +121,7 @@ void mglCanvasWnd::ReLoad()
                LoadFunc(FuncPar);\r
                // update number of slides\r
                ResetFrames();\r
-               const std::string loc = setlocale(LC_NUMERIC, NULL);    setlocale(LC_NUMERIC, "C");\r
+               const std::string loc = setlocale(LC_NUMERIC, "C");\r
                // use frames for quickly redrawing while adding/changing primitives\r
                if(mgl_is_frames(this)) NewFrame();\r
 \r
index 97819deb827b7cfd0e6d51b25bf8a0a2c3d4bc79..7d6abafacc74641eb9297db0a2210ef9c25951a8 100644 (file)
@@ -1,4 +1,4 @@
-configure_file(${MathGL_SOURCE_DIR}/texinfo/version.texi.in ${MathGL_BINARY_DIR}/texinfo/version.texi)
+configure_file(${MathGL2_SOURCE_DIR}/texinfo/version.texi.in ${MathGL2_BINARY_DIR}/texinfo/version.texi)
 
 set(MGL_EXTRA light pendelta)
 set(MGL_PNG alpha area aspect axial axis barh bars belt boxplot
@@ -11,7 +11,8 @@ set(MGL_PNG alpha area aspect axial axis barh bars belt boxplot
        surfa surfc surfca surf table tape tens ternary textmark text ticks tile tiles
        torus traj triangulation triplot tube type0 type1 type2 vect vecta venn
        projection5 mask correl refill ohlc ode indirect
-       pulse scanfile bifurcation lamerey pmap ifs2d ifs3d )
+       pulse scanfile bifurcation lamerey pmap ifs2d ifs3d
+       flame2d detect dilate iris section apde earth )
 set(MGL_PNG_N )
 set(MGL_PNG_S )
 set(MGL_PNG_J )
@@ -26,6 +27,14 @@ file(MAKE_DIRECTORY ${MGL_OUT}/json)
 file(MAKE_DIRECTORY ${MGL_OUT}/pdf)
 file(COPY ${MGL_TEX}/qt.png ${MGL_TEX}/fltk.png ${MGL_TEX}/classes.png ${MGL_TEX}/emblem_sm.png ${MGL_TEX}/datadvance.png DESTINATION ${MGL_OUT})
 file(COPY ${MGL_TEX}/index.html ${MGL_TEX}/json.html ${MGL_TEX}/mathgl.js DESTINATION ${MGL_OUT})
+file(COPY ${CMAKE_SOURCE_DIR}/examples/iris.dat DESTINATION ${MGL_OUT}/png)
+file(COPY ${CMAKE_SOURCE_DIR}/examples/iris.dat DESTINATION ${MGL_OUT}/small)
+file(COPY ${CMAKE_SOURCE_DIR}/examples/iris.dat DESTINATION ${MGL_OUT}/json)
+file(COPY ${CMAKE_SOURCE_DIR}/examples/iris.dat DESTINATION ${MGL_OUT}/pdf)
+file(COPY ${CMAKE_SOURCE_DIR}/examples/Equirectangular-projection.jpg DESTINATION ${MGL_OUT}/png)
+file(COPY ${CMAKE_SOURCE_DIR}/examples/Equirectangular-projection.jpg DESTINATION ${MGL_OUT}/small)
+file(COPY ${CMAKE_SOURCE_DIR}/examples/Equirectangular-projection.jpg DESTINATION ${MGL_OUT}/json)
+file(COPY ${CMAKE_SOURCE_DIR}/examples/Equirectangular-projection.jpg DESTINATION ${MGL_OUT}/pdf)
 
 set(UDAV_IMG udav_arg.png udav_calc.png udav_cmd.png udav_data.png udav_mask.png
        udav_gen_set.png udav_help.png udav_light.png udav_main.png udav_opt.png udav_inplot.png
@@ -45,22 +54,21 @@ foreach(SAMPLE ${MGL_PNG})
                COMMAND mgl_example -kind=${SAMPLE} -mini
                DEPENDS mgl_example
                WORKING_DIRECTORY ${MGL_OUT}/small )
-               
-               
-if(MGL_HAVE_DOC_JSON)
-       set(MGL_PNG_J ${MGL_PNG_J} ${MGL_OUT}/json/${SAMPLE}.json)
-       add_custom_command(OUTPUT ${MGL_OUT}/json/${SAMPLE}.json
-               COMMAND mgl_example -json -kind=${SAMPLE}
-               DEPENDS mgl_example
-               WORKING_DIRECTORY ${MGL_OUT}/json )
-endif(MGL_HAVE_DOC_JSON)
-if(MGL_HAVE_DOC_PRC)
-       set(MGL_PNG_D ${MGL_PNG_D} ${MGL_OUT}/pdf/${SAMPLE}.pdf)
-       add_custom_command(OUTPUT ${MGL_OUT}/pdf/${SAMPLE}.pdf
-               COMMAND mgl_example -pdf -kind=${SAMPLE}
-               DEPENDS mgl_example
-               WORKING_DIRECTORY ${MGL_OUT}/pdf )
-endif(MGL_HAVE_DOC_PRC)
+
+       if(MGL_HAVE_DOC_JSON)
+               set(MGL_PNG_J ${MGL_PNG_J} ${MGL_OUT}/json/${SAMPLE}.json)
+               add_custom_command(OUTPUT ${MGL_OUT}/json/${SAMPLE}.json
+                       COMMAND mgl_example -json -kind=${SAMPLE}
+                       DEPENDS mgl_example
+                       WORKING_DIRECTORY ${MGL_OUT}/json )
+       endif(MGL_HAVE_DOC_JSON)
+       if(MGL_HAVE_DOC_PRC)
+               set(MGL_PNG_D ${MGL_PNG_D} ${MGL_OUT}/pdf/${SAMPLE}.pdf)
+               add_custom_command(OUTPUT ${MGL_OUT}/pdf/${SAMPLE}.pdf
+                       COMMAND mgl_example -pdf -kind=${SAMPLE}
+                       DEPENDS mgl_example
+                       WORKING_DIRECTORY ${MGL_OUT}/pdf )
+       endif(MGL_HAVE_DOC_PRC)
 endforeach(SAMPLE)
 
 foreach(SAMPLE ${MGL_EXTRA})
@@ -76,8 +84,8 @@ foreach(SAMPLE ${MGL_EXTRA})
                WORKING_DIRECTORY ${MGL_OUT}/small )
 endforeach(SAMPLE)
 
-set(list_texi_files_en overview_en.texi example_en.texi ex_mgl_en.texi parse_en.texi formats_en.texi udav_en.texi symbols_en.texi core_en.texi concept_en.texi widget_en.texi data_en.texi other_en.texi appendix_en.texi fdl.texi ${MathGL_BINARY_DIR}/texinfo/version.texi time.texi time_big.texi )
-set(list_texi_files_ru overview_ru.texi example_ru.texi ex_mgl_ru.texi parse_ru.texi formats_ru.texi udav_ru.texi symbols_ru.texi core_ru.texi concept_ru.texi widget_ru.texi data_ru.texi other_ru.texi appendix_ru.texi fdl.texi ${MathGL_BINARY_DIR}/texinfo/version.texi time.texi time_big.texi )
+set(list_texi_files_en overview_en.texi example_en.texi ex_mgl_en.texi parse_en.texi formats_en.texi udav_en.texi symbols_en.texi core_en.texi concept_en.texi widget_en.texi data_en.texi other_en.texi appendix_en.texi fdl.texi ${MathGL2_BINARY_DIR}/texinfo/version.texi time.texi time_big.texi )
+set(list_texi_files_ru overview_ru.texi example_ru.texi ex_mgl_ru.texi parse_ru.texi formats_ru.texi udav_ru.texi symbols_ru.texi core_ru.texi concept_ru.texi widget_ru.texi data_ru.texi other_ru.texi appendix_ru.texi fdl.texi ${MathGL2_BINARY_DIR}/texinfo/version.texi time.texi time_big.texi )
 
 add_custom_command(OUTPUT ${MGL_OUT}/mathgl_en.info
        COMMAND ${findmi} ${MGL_TEX}/mathgl_en.texi
@@ -97,6 +105,10 @@ add_custom_command(OUTPUT ${MGL_OUT}/mathgl_en.html
 )
 add_custom_command(OUTPUT ${MGL_OUT}/mgl_en.html
        COMMAND ${findth} ${th_opt} --set-customization-variable 'BODYTEXT ' -I ${MGL_OUT} --no-split ${MGL_TEX}/mgl_en.texi
+       # following line bypass FLTK bugs
+       COMMAND sed "'s/&ndash;/-/g'" -i ${MGL_OUT}/mgl_en.html
+       COMMAND sed "'s/&lsquo;/`/g'" -i ${MGL_OUT}/mgl_en.html
+       COMMAND sed "'s/&rsquo;/`/g'" -i ${MGL_OUT}/mgl_en.html
        DEPENDS ${list_texi_files_en} mgl_en.texi ${MGL_PNG_N}
        WORKING_DIRECTORY ${MGL_OUT}
 )
@@ -107,6 +119,10 @@ add_custom_command(OUTPUT ${MGL_OUT}/mathgl_ru.html
 )
 add_custom_command(OUTPUT ${MGL_OUT}/mgl_ru.html
        COMMAND ${findth} ${th_opt} --set-customization-variable 'BODYTEXT ' -I=${MGL_OUT} --no-split ${MGL_TEX}/mgl_ru.texi
+       # following line bypass FLTK bugs
+       COMMAND sed "'s/&ndash;/-/g'" -i ${MGL_OUT}/mgl_ru.html
+       COMMAND sed "'s/&lsquo;/`/g'" -i ${MGL_OUT}/mgl_ru.html
+       COMMAND sed "'s/&rsquo;/`/g'" -i ${MGL_OUT}/mgl_ru.html
        DEPENDS ${list_texi_files_ru} mgl_ru.texi ${MGL_PNG_N}
        WORKING_DIRECTORY ${MGL_OUT}
 )
index ed1cb27c97561be1c301234facb5603d93cb206a..aa21d0b9a90bd773bd3525ccd017109485ffad52 100644 (file)
@@ -9,7 +9,7 @@ The full list of TeX-like commands recognizable by MathGL is shown below. If com
 
 @strong{Roots}: \sqrt, \sqrt3, \sqrt4
 
-@strong{Fractions}: \frac, \stack, \overset, \underset, \stackr, \stackl
+@strong{Fractions}: \frac, \dfrac, \stack, \overset, \underset, \stackr, \stackl
 
 @strong{Accents}: \hat, \tilde, \dot, \ddot, \dddot, \ddddot, \acute, \check, \grave, \vec, \bar, \breve
 
index 16c4c344f01ce2f2be0d247923fb507a2a2ff512..06bf9d98db99a753497e919a6e94fc4303c95649 100644 (file)
@@ -8,7 +8,7 @@
 
 @strong{Корни}: \sqrt, \sqrt3, \sqrt4
 
-@strong{Дроби}: \frac, \stack, \overset, \underset, \stackr, \stackl
+@strong{Дроби}: \frac, \dfrac, \stack, \overset, \underset, \stackr, \stackl
 
 @strong{Акценты}: \hat, \tilde, \dot, \ddot, \dddot, \ddddot, \acute, \check, \grave, \vec, \bar, \breve
 
index c668416e6c85b23ac0eb7b758ac62ea3b04672a4..4a318f83201d0b1c87be8697682bd14fa5c6c70b 100644 (file)
@@ -8,7 +8,7 @@ used for different drawing functions.
 There are six most general (base) concepts:
 @enumerate
 @item
-@strong{Any picture is created in memory first.} The internal (memory) representation can be different: bitmap picture (for @code{SetQuality(MGL_DRAW_LMEM)}) or the list of vector primitives (default). After that the user may decide what he/she want: save to file, display on the screen, run animation, do additional editing and so on. This approach assures a high portability of the program -- the source code will produce exactly the same picture in @emph{any} OS. Another big positive consequence is the ability to create the picture in the console program (using command line, without creating a window)!
+@strong{Any picture is created in memory first.} The internal (memory) representation can be different: bitmap picture (for @code{SetQuality(MGL_DRAW_LMEM)} or @code{@ref{quality} 6}) or the list of vector primitives (default). After that the user may decide what he/she want: save to file, display on the screen, run animation, do additional editing and so on. This approach assures a high portability of the program -- the source code will produce exactly the same picture in @emph{any} OS. Another big positive consequence is the ability to create the picture in the console program (using command line, without creating a window)!
 @item
 @strong{Every plot settings (style of lines, font, color scheme) are specified by a string.} It provides convenience for user/programmer -- short string with parameters is more comprehensible than a large set of parameters. Also it provides portability -- the strings are the same in any OS so that it is not necessary to think about argument types.
 @item
@@ -42,9 +42,9 @@ In addition to the general concepts I want to comment on some non-trivial or les
 
 Two axis representations are used in MathGL. The first one consists of normalizing coordinates of data points in axis range (see @ref{Axis settings}). If @code{SetCut()} is @code{true} then the outlier points are omitted, otherwise they are projected to the bounding box (see @ref{Cutting}). Also, the point will be omitted if it lies inside the box defined by @code{SetCutBox()} or if the value of formula @code{CutOff()} is nonzero for its coordinates. After that, transformation formulas defined by @code{SetFunc()} or @code{SetCoor()} are applied to the data point (see @ref{Curved coordinates}). Finally, the data point is plotted by one of the functions.
 
-The range of @emph{x, y, z}-axis can be specified by @code{SetRange()} or @code{SetRanges()} functions. Its origin is specified by @code{SetOrigin()} function. At this you can you can use @code{NAN} values for selecting axis origin automatically.
+The range of @emph{x, y, z}-axis can be specified by @code{SetRange()} or @ref{ranges} functions. Its origin is specified by @ref{origin} function. At this you can you can use @code{NAN} values for selecting axis origin automatically.
 
-There is 4-th axis @emph{c} (color axis or colorbar) in addition to the usual axes @emph{x, y, z}. It sets the range of values for the surface coloring. Its borders are automatically set to values of z-range during the call of @code{SetRanges()} function. Also, one can directly set it by call @code{SetRange('c', ...)}. Use @code{Colorbar()} function for drawing the colorbar.
+There is 4-th axis @emph{c} (color axis or colorbar) in addition to the usual axes @emph{x, y, z}. It sets the range of values for the surface coloring. Its borders are automatically set to values of z-range during the call of @ref{ranges} function. Also, one can directly set it by call @code{SetRange('c', ...)}. Use @ref{colorbar} function for drawing the colorbar.
 
 The form (appearence) of tick labels is controlled by @code{SetTicks()} function (@pxref{Ticks}). Function @var{SetTuneTicks} switches on/off tick enhancing by factoring out acommon multiplier (for small coordinate values, like 0.001 to 0.002, or large, like from 1000 to 2000) or common component (for narrow range, like from 0.999 to 1.000). Finally, you may use functions @code{SetTickTempl()} for setting templates for tick labels (it supports TeX symbols). Also, there is a possibility to print arbitrary text as tick labels the by help of @code{SetTicksVal()} function.
 
@@ -86,7 +86,7 @@ melone color.
 @cindex Mark style
 @cindex Arrows
 
-The line style is defined by the string which may contain specifications for color (@samp{wkrgbcymhRGBCYMHWlenupqLENUPQ}), dashing style (@samp{-|;:ji=} or space), width (@samp{123456789}) and marks (@samp{*o+xsd.^v<>} and @samp{#} modifier). If one of the type of information is omitted then default values used with next color from palette (see @ref{Palette and colors}). Note, that internal color counter will be nullified by any change of palette. This includes even hidden change (for example, by @code{Box()} or @code{Axis()} functions).
+The line style is defined by the string which may contain specifications for color (@samp{wkrgbcymhRGBCYMHWlenupqLENUPQ}), dashing style (@samp{-|;:ji=} or space), width (@samp{123456789}) and marks (@samp{*o+xsd.^v<>} and @samp{#} modifier). If one of the type of information is omitted then default values used with next color from palette (see @ref{Palette and colors}). Note, that internal color counter will be nullified by any change of palette. This includes even hidden change (for example, by @ref{box} or @ref{axis} functions).
 @ifhtml
 @html
 By default palette contain following colors: <span style="color: rgb(76, 76, 76);">dark gray</span> &lsquo;<samp>H</samp>&rsquo;, <span style="color: rgb(0, 0, 255);">blue</span> &lsquo;<samp>b</samp>&rsquo;, <span style="color: rgb(0, 255, 0);">green</span> &lsquo;<samp>g</samp>&rsquo;, <span style="color: rgb(255, 0, 0);">red</span> &lsquo;<samp>r</samp>&rsquo;, <span style="color: rgb(0, 255, 255);">cyan</span> &lsquo;<samp>c</samp>&rsquo;, <span style="color: rgb(255, 0, 255);">magenta</span> &lsquo;<samp>m</samp>&rsquo;, <span style="color: rgb(255, 255, 0);">yellow</span> &lsquo;<samp>y</samp>&rsquo;, <span style="color: rgb(127, 127, 127);">gray</span> &lsquo;<samp>h</samp>&rsquo;, <span style="color: rgb(0, 255, 127);">green-blue</span> &lsquo;<samp>l</samp>&rsquo;, <span style="color: rgb(0, 127, 255);">sky-blue</span> &lsquo;<samp>n</samp>&rsquo;, <span style="color: rgb(255, 127, 0);">orange</span> &lsquo;<samp>q</samp>&rsquo;, <span style="color: rgb(127, 255, 0);">green-yellow</span> &lsquo;<samp>e</samp>&rsquo;, <span style="color: rgb(127, 0, 255);">blue-violet</span> &lsquo;<samp>u</samp>&rsquo;, <span style="color: rgb(255, 0, 127);">purple</span> &lsquo;<samp>p</samp>&rsquo;.
@@ -100,7 +100,10 @@ By default palette contain following colors: dark gray @samp{H}, blue @samp{b},
 Dashing style has the following meaning: space -- no line (usable for plotting only marks), @samp{-} -- solid line (################), @samp{|} -- long dashed line (########________), @samp{;} -- dashed line (####____####____), @samp{=} -- small dashed line (##__##__##__##__), @samp{:} -- dotted line (#___#___#___#___), @samp{j} -- dash-dotted line (#######____#____), @samp{i} -- small dash-dotted line (###__#__###__#__), @samp{@{dNNNN@}} -- manual mask style (for v.2.3 and later, like @samp{@{df090@}} for (####____#__#____)).
 @end ifnothtml
 
-Marker types are: @samp{o} -- circle, @samp{+} -- cross, @samp{x} -- skew cross, @samp{s} - square, @samp{d} - rhomb (or diamond), @samp{.} -- dot (point), @samp{^} -- triangle up, @samp{v} -- triangle down, @samp{<} -- triangle left, @samp{>} -- triangle right, @samp{#*} -- Y sign, @samp{#+} -- squared cross, @samp{#x} -- squared skew cross, @samp{#.} -- circled dot. If string contain symbol @samp{#} then the solid versions of markers are used.
+Marker types are: @samp{o} -- circle, @samp{+} -- cross, @samp{x} -- skew cross, @samp{s} -- square, @samp{d} -- rhomb (or diamond), @samp{.} -- dot (point), @samp{^} -- triangle up, @samp{v} -- triangle down, @samp{<} -- triangle left, @samp{>} -- triangle right, @samp{#*} -- Y sign, @samp{#+} -- squared cross, @samp{#x} -- squared skew cross, @samp{#.} -- circled dot. If string contain symbol @samp{#} then the solid versions of markers are used.
+
+You can provide user-defined symbols (see @ref{addsymbol}) to draw it as marker by using @samp{&} style. In particular, @samp{&*}, @samp{&o}, @samp{&+}, @samp{&x}, @samp{&s}, @samp{&d}, @samp{&.}, @samp{&^}, @samp{&v}, @samp{&<}, @samp{&>} will draw user-defined symbol @samp{*o+xsd.^v<>} correspondingly; and 
+@samp{&#o}, @samp{&#+}, @samp{&#x}, @samp{&#s}, @samp{&#d}, @samp{&#.}, @samp{&#^}, @samp{&#v}, @samp{&#<}, @samp{&#>} will draw user-defined symbols @samp{YOPXSDCTVLR} correspondingly. Note, that wired version of user-defined symbols will be drawn if you set negative marker size (see @ref{marksize} or @code{size} in @ref{Command options}).
 
 One may specify to draw a special symbol (an arrow) at the beginning and at the end of line. This is done if the specification string contains one of the following symbols: @samp{A} -- outer arrow, @samp{V} -- inner arrow, @samp{I} -- transverse hatches, @samp{K} -- arrow with hatches, @samp{T} -- triangle, @samp{S} -- square, @samp{D} -- rhombus, @samp{O} -- circle, @samp{X} -- skew cross, @samp{_} -- nothing (the default). The following rule applies: the first symbol specifies the arrow at the end of line, the second specifies the arrow at the beginning of the line. For example, @samp{r-A} defines a red solid line with usual arrow at the end, @samp{b|AI} defines a blue dash line with an arrow at the end and with hatches at the beginning, @samp{_O} defines a line with the current style and with a circle at the beginning. These styles are applicable during the graphics plotting as well (for example, @ref{1D plotting}).
 
@@ -200,7 +203,7 @@ MathGL have the fast variant of textual formula evaluation
 @end ifclear
 . There are a lot of functions and operators available. The operators are: @samp{+} -- addition, @samp{-} -- subtraction, @samp{*} -- multiplication, @samp{/} -- division, @samp{^} -- integer power. Also there are logical ``operators'': @samp{<} -- true if x<y, @samp{>} -- true if x>y, @samp{=} -- true if x=y, @samp{&} -- true if x and y both nonzero, @samp{|} -- true if x or y nonzero. These logical operators have lowest priority and return 1 if true or 0 if false.
 
-The basic functions are: @samp{sqrt(x)} -- square root of @var{x}, @samp{pow(x,y)} -- power @var{x} in @var{y}, @samp{ln(x)} -- natural logarithm of @var{x}, @samp{lg(x)} -- decimal logarithm of @var{x}, @samp{log(a,x)} -- logarithm base @var{a} of @var{x}, @samp{abs(x)} -- absolute value of @var{x}, @samp{sign(x)} -- sign of @var{x}, @samp{mod(x,y)} -- @var{x} modulo @var{y}, @samp{step(x)} -- step function, @samp{int(x)} -- integer part of @var{x}, @samp{rnd} -- random number, @samp{random(x)} -- random data of size as in @var{x}, @samp{pi} -- number
+The basic functions are: @samp{sqrt(x)} -- square root of @var{x}, @samp{pow(x,y)} -- power @var{x} in @var{y}, @samp{ln(x)} -- natural logarithm of @var{x}, @samp{lg(x)} -- decimal logarithm of @var{x}, @samp{log(a,x)} -- logarithm base @var{a} of @var{x}, @samp{abs(x)} -- absolute value of @var{x}, @samp{sign(x)} -- sign of @var{x}, @samp{mod(x,y)} -- @var{x} modulo @var{y}, @samp{step(x)} -- step function, @samp{int(x)} -- integer part of @var{x}, @samp{rnd} -- random number, @samp{random(x)} -- random data of size as in @var{x}, @samp{hypot(x,y)}=sqrt(x^2+y^2) -- hypotenuse, @samp{cmplx(x,y)}=x+i*y -- complex number,  @samp{pi} -- number
 @ifhtml
 @html
 &pi; = 3.1415926&hellip;, inf=&infin;
index d0bea9395fb617bb880bfa5b38fa3ca2d7eff1e4..ca607902fd79502df16f55f0a1deecf046e6ac82 100644 (file)
@@ -6,7 +6,7 @@
 Всего основных концепций (базисных идей) шесть:
 @enumerate
 @item
-@strong{Все рисунки создаются в памяти.} Это могут быть как растровые картинки (для @code{SetQuality(MGL_DRAW_LMEM)}), так и векторные списки примитивов (по умолчанию). Дальнейшая судьба рисунков определяется пользователем: можно сохранить в файл, вывести на экран, создать анимацию/кино, дополнительно отредактировать и т.д. Такой подход обеспечивает высокую переносимость библиотеки -- один и тот же программный код создаст в точности одинаковый рисунок на @emph{любой} операционной системе. Кроме того, при таком подходе рисунки можно создавать непосредственно в консольной программе -- графическое окно не нужно!
+@strong{Все рисунки создаются в памяти.} Это могут быть как растровые картинки (для @code{SetQuality(MGL_DRAW_LMEM)} или @code{@ref{quality} 6}), так и векторные списки примитивов (по умолчанию). Дальнейшая судьба рисунков определяется пользователем: можно сохранить в файл, вывести на экран, создать анимацию/кино, дополнительно отредактировать и т.д. Такой подход обеспечивает высокую переносимость библиотеки -- один и тот же программный код создаст в точности одинаковый рисунок на @emph{любой} операционной системе. Кроме того, при таком подходе рисунки можно создавать непосредственно в консольной программе -- графическое окно не нужно!
 @item
 @strong{Все настройки графиков (стиль линий, цветовые схемы поверхностей, стиль и цвет текста) задаются строками.} Это обеспечивает: удобство для пользователя -- короткую строку легче читать и здесь тяжелее ошибиться, чем в большом списке параметров; переносимость -- строки выглядят одинаково на всех платформах и не надо заботиться о типе и числе аргументов.
 @item
@@ -40,9 +40,9 @@
 
 Представление системы координат в MathGL состоит из двух частей. Вначале координаты нормируются в диапазон изменения осей координат (@pxref{Axis settings}). Если флаг @code{SetCut()} установлен, то точки вне интервала отбрасываются, в противном случае, они проецируются на ограничивающий параллелепипед (см. @ref{Cutting}). Кроме того, отбрасываются точки внутри границ, определенных переменными @var{CutMin}x@var{CutMax} и точки, для которых значение функции @code{CutOff}() не равно нулю. После этого формулы перехода в криволинейную систему координат @code{SetFunc()}применяются к каждой точке. Наконец, точка данных отображается с помощью одной из графических функций.
 
-Диапазон изменения @emph{x, y, z}-координат задается функциями @code{SetRange()} или @code{SetRanges()}. Точка пересечения осей координат задается функцией @code{SetOrigin()}. При этом можно использовать NAN значения для автоматического выбора положения оси.
+Диапазон изменения @emph{x, y, z}-координат задается функциями @code{SetRange()} или @ref{ranges}. Точка пересечения осей координат задается функцией @code{SetOrigin()}. При этом можно использовать NAN значения для автоматического выбора положения оси.
 
-Кроме привычных осей @emph{x, y, z} есть еще одна ось -- цветовая шкала -- ось @emph{c}. Она используется при окрашивании поверхностей и задает границы изменения функции при окрашивании. Ее границы автоматически устанавливаются равными диапазону z-оси при вызове @code{SetRanges()}. Возможно и ручное изменение границ цветового интервала посредством вызова @code{SetRange('c', ...)}. Используйте @code{Colorbar()} для отображения цветовой шкалы.
+Кроме привычных осей @emph{x, y, z} есть еще одна ось -- цветовая шкала -- ось @emph{c}. Она используется при окрашивании поверхностей и задает границы изменения функции при окрашивании. Ее границы автоматически устанавливаются равными диапазону z-оси при вызове @ref{ranges}. Возможно и ручное изменение границ цветового интервала посредством вызова @code{SetRange('c', ...)}. Используйте @ref{colorbar} для отображения цветовой шкалы.
 
 Вид меток по осям определяется функцией @code{SetTicks()} (@pxref{Ticks}). Функция @var{SetTuneTicks} включает/выключает выделение общего множителя (большого или малого факторов в диапазоне) для меток осей координат. Наконец, если стандартный вид меток не устраивает пользователя, то их шаблон можно задать явно (можно использовать и ТеХ символы), воспользовавшись функцией  @code{SetTickTempl()}. Кроме того, в качестве меток можно вывести произвольный текст использовав функцию @code{SetTicksVal()}.
 
@@ -100,6 +100,9 @@ Base colors are defined by one of symbol @samp{wkrgbcymhRGBCYMHWlenupqLENUPQ}.
 
 Типы маркеров: @samp{o} -- окружность, @samp{+} -- крест, @samp{x} -- косой крест, @samp{s} -- квадрат, @samp{d} - ромб, @samp{.} -- точка, @samp{^} -- треугольник вверх, @samp{v} -- треугольник вниз, @samp{<} -- треугольник влево, @samp{>} -- треугольник вправо, @samp{#*} -- знак Y, @samp{#+} -- крест в квадрате, @samp{#x} -- косой крест в квадрате, @samp{#.} -- точка в окружности. Если в строке присутствует символ @samp{#}, то используются символы с заполнением.
 
+Вы можете определить собственные символы (см. @ref{addsymbol}) для рисования маркеров при использовании стиля @samp{&}. В частности, @samp{&*}, @samp{&o}, @samp{&+}, @samp{&x}, @samp{&s}, @samp{&d}, @samp{&.}, @samp{&^}, @samp{&v}, @samp{&<}, @samp{&>} нарисует определенный пользователем символ с именем @samp{*o+xsd.^v<>} соответственно; и
+@samp{&#o}, @samp{&#+}, @samp{&#x}, @samp{&#s}, @samp{&#d}, @samp{&#.}, @samp{&#^}, @samp{&#v}, @samp{&#<}, @samp{&#>} нарисует определенный пользователем символ с именем @samp{YOPXSDCTVLR} соответственно. Замечу, что будет нарисован только контур определенного пользователем символа если задан отрицательный размер маркера (см. @ref{marksize} или опцию @code{size} в @ref{Command options}).
+
 На конце и в начале линии можно выводить специальный символ (стрелку), если в строке указать один из символов: @samp{A} -- стрелка наружу, @samp{V} -- стрелка внутрь, @samp{I} -- поперечная черта, @samp{K} -- стрелка с чертой, @samp{T} -- треугольник, @samp{S} -- квадрат, @samp{D} -- ромб, @samp{O} -- круг, @samp{X} -- косой крест, @samp{_} -- нет стрелки (по умолчанию). При этом действует следующее правило: первый символ определяет стрелку на конце линии, второй символ -- стрелку в начале линии. Например, @samp{r-A} -- красная сплошная линия со стрелкой на конце, @samp{b|AI} -- синий пунктир со стрелкой на конце и чертой вначале, @samp{_O} -- линия с текущим стилем и кружком вначале. Эти стили действуют и при построении графиков (например, @ref{1D plotting}).
 
 @pfig{style, Color and line styles.}
@@ -198,7 +201,7 @@ MathGL имеет быстрый парсер текстовых формул
 @end ifclear
 , понимающий большое число функций и операций. Базовые операции: @samp{+} -- сложение, @samp{-} -- вычитание, @samp{*} -- умножение, @samp{/} -- деление, @samp{^} -- возведение в целосичленную степень. Также есть логические операции: @samp{<} -- истина если if x<y, @samp{>} -- истина если x>y, @samp{=} -- истина если x=y, @samp{&} -- истина если x и y оба не равны нулю, @samp{|} -- истина если x или y не нуль. Логические операции имеют наинизший приоритет и возвращают 1 если истина или 0 если ложно.
 
-Базовые функции: @samp{sqrt(x)} -- квадратный корень из @var{x}, @samp{pow(x,y)} -- @var{x} в степени @var{y}, @samp{ln(x)} -- натуральный логарифм @var{x}, @samp{lg(x)} -- десятичный логарифм @var{x}, @samp{log(a,x)} -- логарифм по основанию @var{a} от @var{x}, @samp{abs(x)} -- модуль @var{x}, @samp{sign(x)} -- знак @var{x}, @samp{mod(x,y)} -- остаток от деления @var{x} на @var{y}, @samp{step(x)} -- ступенчатая функция, @samp{int(x)} -- целая часть @var{x}, @samp{rnd} -- случайное число, @samp{random(x)} -- матрица случайный чисел размером как @var{x}, @samp{pi} -- число
+Базовые функции: @samp{sqrt(x)} -- квадратный корень из @var{x}, @samp{pow(x,y)} -- @var{x} в степени @var{y}, @samp{ln(x)} -- натуральный логарифм @var{x}, @samp{lg(x)} -- десятичный логарифм @var{x}, @samp{log(a,x)} -- логарифм по основанию @var{a} от @var{x}, @samp{abs(x)} -- модуль @var{x}, @samp{sign(x)} -- знак @var{x}, @samp{mod(x,y)} -- остаток от деления @var{x} на @var{y}, @samp{step(x)} -- ступенчатая функция, @samp{int(x)} -- целая часть @var{x}, @samp{rnd} -- случайное число, @samp{random(x)} -- матрица случайный чисел размером как @var{x}, @samp{hypot(x,y)}=sqrt(x^2+y^2) -- гипотенуза, @samp{cmplx(x,y)}=x+i*y -- комплексное число, @samp{pi} -- число
 @ifhtml
 @html
 &pi; = 3.1415926&hellip;, inf=&infin;
index 92f29e3350e6f60db703748d99e52e86cafde30b..16e74888215f0073c6353bfca453a6aa5125b408 100644 (file)
@@ -187,7 +187,7 @@ Switch on/off @var{n}-th light source separately.
 @end deftypefn
 
 @deftypefn {MGL command} {} light @code{num xdir ydir zdir} ['col'='w' @code{br=0.5}]
-@deftypefnx {MGL command} {} light @code{num xdir ydir zdir xpos ypos zpos} ['col'='w' @code{br=0.5}]
+@deftypefnx {MGL command} {} light @code{num xdir ydir zdir xpos ypos zpos} ['col'='w' @code{br=0.5 ap=0}]
 @ifclear UDAV
 @deftypefnx {Method on @code{mglGraph}} @code{void} AddLight (@code{int} n, @code{mglPoint} d, @code{char} c=@code{'w'}, @code{mreal} bright=@code{0.5}, @code{mreal} ap=@code{0})
 @deftypefnx {Method on @code{mglGraph}} @code{void} AddLight (@code{int} n, @code{mglPoint} r, @code{mglPoint} d, @code{char} c=@code{'w'}, @code{mreal} bright=@code{0.5}, @code{mreal} ap=@code{0})
@@ -294,7 +294,7 @@ Sets size of arrows for @ref{1D plotting}, lines and curves (see @ref{Primitives
 @deftypefnx {Method on @code{mglGraph}} @code{void} SetMeshNum (@code{int} val)
 @deftypefnx {C function} @code{void} mgl_set_meshnum (@code{HMGL} gr, @code{int} num)
 @end ifclear
-Sets approximate number of lines in @ref{mesh}, @ref{fall}, @ref{grid2} and also the number of hachures in @ref{vect}, @ref{dew} and the number of cells in @ref{cloud}. By default (=0) it draws all lines/hachures/cells.
+Sets approximate number of lines in @ref{mesh}, @ref{fall}, @ref{grid2}, and also the number of hachures in @ref{vect}, @ref{dew}, and the number of cells in @ref{cloud}, and the number of markers in @ref{plot}, @ref{tens}, @ref{step}, @ref{mark}, @ref{textmark}. By default (=0) it draws all lines/hachures/cells/markers.
 @end deftypefn
 
 @anchor{facenum}
@@ -434,11 +434,6 @@ Set FontSize by size in centimeters and picture DPI (default is 0.56 cm = 16 pt)
 Set FontSize by size in inch and picture DPI (default is 0.22 in = 16 pt).
 @end deftypefn
 
-@deftypefn {Method on @code{mglGraph}} @code{void} LoadFont (@code{const char *}name, @code{const char *}path=@code{""})
-@deftypefnx {C function} @code{void} mgl_load_font (@code{HMGL} gr, @code{const char *}name, @code{const char *}path)
-Load font typeface from @var{path}/@var{name}.
-@end deftypefn
-
 @deftypefn {Method on @code{mglGraph}} @code{void} CopyFont (@code{mglGraph *} from)
 @deftypefnx {C function} @code{void} mgl_copy_font (@code{HMGL} gr, @code{HMGL} gr_from)
 Copy font data from another @code{mglGraph} object.
@@ -488,6 +483,15 @@ Sets RGB values for color with given @var{id}. This is global setting which infl
 @end ifclear
 
 
+@anchor{gray}
+@deftypefn {MGL command} {} gray [@code{val=on}]
+@ifclear UDAV
+@deftypefnx {Method on @code{mglGraph}} @code{void} Gray (@code{bool} enable)
+@deftypefnx {C function} @code{void} mgl_set_gray (@code{HMGL} gr, @code{int} enable)
+@end ifclear
+Sets the gray-scale mode on/off.
+@end deftypefn
+
 @c ==================================================================
 @external{}
 @node Masks, Error handling, Palette and colors, Graphics setup
@@ -498,6 +502,7 @@ Sets RGB values for color with given @var{id}. This is global setting which infl
 
 @anchor{mask}
 @deftypefn {MGL command} {} mask 'id' 'hex'
+@deftypefnx {Команда MGL} {} mask 'id' hex
 @ifclear UDAV
 @deftypefnx {Method on @code{mglGraph}} @code{void} SetMask (@code{char} id, @code{const char *}hex)
 @deftypefnx {Method on @code{mglGraph}} @code{void} SetMask (@code{char} id, @code{uint64_t} hex)
@@ -610,7 +615,6 @@ Get warning message(s) for global scope.
 
 @end ifclear
 
-
 @c ==================================================================
 @external{}
 @node Stop drawing, , Error handling, Graphics setup
@@ -711,19 +715,21 @@ Sets the range for @samp{x}-,@samp{y}-,@samp{z}- coordinate or coloring (@samp{c
 Sets the ranges of coordinates. If minimal and maximal values of the coordinate are the same then they are ignored. Also it sets the range for coloring (analogous to @code{crange z1 z2}). This is default color range for 2d plots. Initial ranges are [-1, 1].
 @end deftypefn
 
+@deftypefn {MGL command} {} ranges @code{xx yy [zz cc=zz]}
 @ifclear UDAV
-@deftypefn {Method on @code{mglGraph}} @code{void} SetRanges (@code{const mglDataA &}xx, @code{const mglDataA &}yy)
+@deftypefnx {Method on @code{mglGraph}} @code{void} SetRanges (@code{const mglDataA &}xx, @code{const mglDataA &}yy)
 @deftypefnx {Method on @code{mglGraph}} @code{void} SetRanges (@code{const mglDataA &}xx, @code{const mglDataA &}yy, @code{const mglDataA &}zz)
 @deftypefnx {Method on @code{mglGraph}} @code{void} SetRanges (@code{const mglDataA &}xx, @code{const mglDataA &}yy, @code{const mglDataA &}zz, @code{const mglDataA &}cc)
-Sets the ranges of @samp{x}-,@samp{y}-,@samp{z}-coordinates and coloring as minimal and maximal values of data @var{xx}, @var{yy}, @var{zz}, @var{cc} correspondingly.
+@end ifclear
+Sets the ranges of @samp{x}-,@samp{y}-,@samp{z}-,@samp{c}-coordinates and coloring as minimal and maximal values of data @var{xx}, @var{yy}, @var{zz}, @var{cc} correspondingly.
 @end deftypefn
 
+@ifclear UDAV
 @deftypefn {Method on @code{mglGraph}} @code{void} SetAutoRanges (@code{mglPoint} p1, @code{mglPoint} p2)
 @deftypefnx {Method on @code{mglGraph}} @code{void} SetAutoRanges (@code{double} x1, @code{double} x2, @code{double} y1, @code{double} y2, @code{double} z1=@code{0}, @code{double} z2=@code{0}, @code{double} c1=@code{0}, @code{double} c2=@code{0})
 @deftypefnx {C function} @code{void} mgl_set_auto_ranges (@code{HMGL} gr, @code{double} x1, @code{double} x2, @code{double} y1, @code{double} y2, @code{double} z1, @code{double} z2, @code{double} z1, @code{double} z2)
 Sets the ranges for automatic coordinates. If minimal and maximal values of the coordinate are the same then they are ignored.
 @end deftypefn
-
 @end ifclear
 
 @anchor{origin}
@@ -774,7 +780,37 @@ Sets transformation formulas for curvilinear coordinate. Each string should cont
 @deftypefnx {Method on @code{mglGraph}} @code{void} SetCoor (@code{int} how)
 @deftypefnx {C function} @code{void} mgl_set_coor (@code{HMGL} gr, @code{int} how)
 @end ifclear
-Sets one of the predefined transformation formulas for curvilinear coordinate. Parameter @var{how} define the coordinates: @code{mglCartesian=0} -- Cartesian coordinates (no transformation); @code{mglPolar=1} -- Polar coordinates @math{x_n=x*cos(y),y_n=x*sin(y), z_n=z}; @code{mglSpherical=2} -- Sperical coordinates @math{x_n=x*sin(y)*cos(z), y_n=x*sin(y)*sin(z), z_n=x*cos(y)}; @code{mglParabolic=3} -- Parabolic coordinates @math{x_n=x*y, y_n=(x*x-y*y)/2, z_n=z}; @code{mglParaboloidal=4} -- Paraboloidal coordinates @math{x_n=(x*x-y*y)*cos(z)/2, y_n=(x*x-y*y)*sin(z)/2, z_n=x*y}; @code{mglOblate=5} -- Oblate coordinates @math{x_n=cosh(x)*cos(y)*cos(z), y_n=cosh(x)*cos(y)*sin(z), z_n=sinh(x)*sin(y)}; @code{mglProlate=6} -- Prolate coordinates @math{x_n=sinh(x)*sin(y)*cos(z), y_n=sinh(x)*sin(y)*sin(z), z_n=cosh(x)*cos(y)}; @code{mglElliptic=7} -- Elliptic coordinates @math{x_n=cosh(x)*cos(y), y_n=sinh(x)*sin(y), z_n=z}; @code{mglToroidal=8} -- Toroidal coordinates @math{x_n=sinh(x)*cos(z)/(cosh(x)-cos(y)), y_n=sinh(x)*sin(z)/(cosh(x)-cos(y)), z_n=sin(y)/(cosh(x)-cos(y))}; @code{mglBispherical=9} -- Bispherical coordinates @math{x_n=sin(y)*cos(z)/(cosh(x)-cos(y)), y_n=sin(y)*sin(z)/(cosh(x)-cos(y)), z_n=sinh(x)/(cosh(x)-cos(y))}; @code{mglBipolar=10} -- Bipolar coordinates @math{x_n=sinh(x)/(cosh(x)-cos(y)), y_n=sin(y)/(cosh(x)-cos(y)), z_n=z}; @code{mglLogLog=11} -- log-log coordinates @math{x_n=lg(x), y_n=lg(y), z_n=lg(z)}; @code{mglLogX=12} -- log-x coordinates @math{x_n=lg(x), y_n=y, z_n=z}; @code{mglLogY=13} -- log-y coordinates @math{x_n=x, y_n=lg(y), z_n=z}.
+Sets one of the predefined transformation formulas for curvilinear coordinate. Parameter @var{how} define the coordinates:
+@table @code
+@item mglCartesian=0
+Cartesian coordinates (no transformation, @{x,y,z@});
+@item mglPolar=1
+Polar coordinates: @{x*cos(y), x*sin(y), z@};
+@item mglSpherical=2
+Sperical coordinates: @{x*sin(y)*cos(z), x*sin(y)*sin(z), x*cos(y)@};
+@item mglParabolic=3
+Parabolic coordinates: @{x*y, (x*x-y*y)/2, z@}
+@item mglParaboloidal=4
+Paraboloidal coordinates: @{(x*x-y*y)*cos(z)/2, (x*x-y*y)*sin(z)/2, x*y@};
+@item mglOblate=5
+Oblate coordinates: @{cosh(x)*cos(y)*cos(z), cosh(x)*cos(y)*sin(z), sinh(x)*sin(y)@};
+@item mglProlate=6
+Prolate coordinates: @{sinh(x)*sin(y)*cos(z), sinh(x)*sin(y)*sin(z), cosh(x)*cos(y)@};
+@item mglElliptic=7
+Elliptic coordinates: @{cosh(x)*cos(y), sinh(x)*sin(y), z@};
+@item mglToroidal=8
+Toroidal coordinates: @{sinh(x)*cos(z)/(cosh(x)-cos(y)), sinh(x)*sin(z)/(cosh(x)-cos(y)), sin(y)/(cosh(x)-cos(y))@};
+@item mglBispherical=9
+Bispherical coordinates: @{sin(y)*cos(z)/(cosh(x)-cos(y)), sin(y)*sin(z)/(cosh(x)-cos(y)), sinh(x)/(cosh(x)-cos(y))@};
+@item mglBipolar=10
+Bipolar coordinates: @{sinh(x)/(cosh(x)-cos(y)), sin(y)/(cosh(x)-cos(y)), z@};
+@item mglLogLog=11
+Log-log coordinates: @{lg(x), lg(y), lg(z)@};
+@item mglLogX=12
+Log-x coordinates: @{lg(x), y, z@};
+@item mglLogY=13
+Log-y coordinates: @{x, lg(y), z@}.
+@end table
 @end deftypefn
 
 @anchor{ternary}
@@ -833,10 +869,10 @@ Set the ticks step, number of sub-ticks and initial ticks position to be the mos
 @anchor{ytick}
 @anchor{ztick}
 @anchor{ctick}
-@deftypefn {MGL command} {} xtick @code{val [sub=0 org=nan]}
-@deftypefnx {MGL command} {} ytick @code{val [sub=0 org=nan]}
-@deftypefnx {MGL command} {} ztick @code{val [sub=0 org=nan]}
-@deftypefnx {MGL command} {} ctick @code{val [sub=0 org=nan]}
+@deftypefn {MGL command} {} xtick @code{val [sub=0 org=nan 'fact'='']}
+@deftypefnx {MGL command} {} ytick @code{val [sub=0 org=nan 'fact'='']}
+@deftypefnx {MGL command} {} ztick @code{val [sub=0 org=nan 'fact'='']}
+@deftypefnx {MGL command} {} ctick @code{val [sub=0 org=nan 'fact'='']}
 @ifclear UDAV
 @deftypefnx {Method on @code{mglGraph}} @code{void} SetTicks (@code{char} dir, @code{mreal} d=@code{0}, @code{int} ns=@code{0}, @code{mreal} org=@code{NAN}, @code{const char *}fact=@code{""})
 @deftypefnx {Method on @code{mglGraph}} @code{void} SetTicks (@code{char} dir, @code{mreal} d, @code{int} ns, @code{mreal} org, @code{const wchar_t *}fact)
@@ -863,7 +899,7 @@ Set the ticks step @var{d}, number of sub-ticks @var{ns} (used for positive @var
 @deftypefnx {C function} @code{void} mgl_set_ticks_val (@code{HMGL} gr, @code{char} dir, @code{HCDT} val, @code{const char *}lbl, @code{bool} add)
 @deftypefnx {C function} @code{void} mgl_set_ticks_valw (@code{HMGL} gr, @code{char} dir, @code{HCDT} val, @code{const wchar_t *}lbl, @code{bool} add)
 @end ifclear
-Set the manual positions @var{val} and its labels @var{lbl} for ticks along axis @var{dir}. If array @var{val} is absent then values equidistantly distributed in x-axis range are used. Labels are separated by @samp{\n} symbol. Use @code{SetTicks()} to restore automatic ticks.
+Set the manual positions @var{val} and its labels @var{lbl} for ticks along axis @var{dir}. If array @var{val} is absent then values equidistantly distributed in x-axis range are used. Labels are separated by @samp{\n} symbol. If only one value is specified in MGL command then the label will be @emph{add} to the current ones. Use @code{SetTicks()} to restore automatic ticks.
 @end deftypefn
 
 @ifclear UDAV
@@ -871,7 +907,7 @@ Set the manual positions @var{val} and its labels @var{lbl} for ticks along axis
 @deftypefnx {Method on @code{mglGraph}} @code{void} AddTick (@code{char} dir, @code{double} val, @code{const wchar_t *}lbl)
 @deftypefnx {C function} @code{void} mgl_add_tick (@code{HMGL} gr, @code{char} dir, @code{double} val, @code{const char *}lbl)
 @deftypefnx {C function} @code{void} mgl_set_tickw (@code{HMGL} gr, @code{char} dir, @code{double} val, @code{const wchar_t *}lbl)
-The same as previous but add single tick label @var{lbl} at position @var{val} to the lest of existed ones.
+The same as previous but add single tick label @var{lbl} at position @var{val} to the list of existed ones.
 @end deftypefn
 @end ifclear
 
@@ -889,7 +925,7 @@ Set template @var{templ} for x-,y-,z-axis ticks or colorbar ticks. It may contai
 @end deftypefn
 
 @anchor{ticktime}
-@deftypefn {MGL command} {} ticktime 'dir' [@code{dv} 'tmpl']
+@deftypefn {MGL command} {} ticktime 'dir' [@code{dv=0} 'tmpl'='']
 @ifclear UDAV
 @deftypefnx {Method on @code{mglGraph}} @code{void} SetTicksTime (@code{char} dir, @code{mreal} val, @code{const char *}templ)
 @deftypefnx {C function} @code{void} mgl_set_ticks_time (@code{HMGL} gr, @code{mreal} val, @code{const char *}templ)
@@ -984,16 +1020,16 @@ The line style of axis (@var{stl}), ticks (@var{tck}) and subticks (@var{sub}).
 @cindex Push
 @cindex Pop
 
-These functions control how and where further plotting will be placed. There is a certain calling order of these functions for the better plot appearance. First one should be @ref{subplot}, @ref{multiplot} or @ref{inplot} for specifying the place. Second one can be @ref{title} for adding title for the subplot. After it a @ref{rotate} and @ref{aspect}. And finally any other plotting functions may be called. Alternatively you can use @ref{columnplot}, @ref{gridplot}, @ref{stickplot} or relative @ref{inplot} for positioning plots in the column (or grid, or stick) one by another without gap between plot axis (bounding boxes). @sref{Subplots}
+These functions control how and where further plotting will be placed. There is a certain calling order of these functions for the better plot appearance. First one should be @ref{subplot}, @ref{multiplot} or @ref{inplot} for specifying the place. Second one can be @ref{title} for adding title for the subplot. After it a @ref{rotate}, @ref{shear} and @ref{aspect}. And finally any other plotting functions may be called. Alternatively you can use @ref{columnplot}, @ref{gridplot}, @ref{stickplot}, @ref{shearplot} or relative @ref{inplot} for positioning plots in the column (or grid, or stick) one by another without gap between plot axis (bounding boxes). @sref{Subplots}
 
 @anchor{subplot}
-@deftypefn {MGL command} {} subplot @code{nx ny m ['stl'='<>_^' dx=0 dy=0]}
+@deftypefn {MGL command} {} subplot @code{nx ny m} ['stl'='<>_^' @code{dx=0 dy=0}]
 @ifclear UDAV
 @deftypefnx {Method on @code{mglGraph}} @code{void} SubPlot (@code{int} nx, @code{int} ny, @code{int} m, @code{const char *}stl=@code{"<>_^"}, @code{mreal} dx=@code{0}, @code{mreal} dy=@code{0})
 @deftypefnx {C function} @code{void} mgl_subplot (@code{HMGL} gr, @code{int} nx, @code{int} ny, @code{int} m, @code{const char *}stl)
 @deftypefnx {C function} @code{void} mgl_subplot_d (@code{HMGL} gr, @code{int} nx, @code{int} ny, @code{int} m, @code{const char *}stl, @code{mreal} dx, @code{mreal} dy)
 @end ifclear
-Puts further plotting in a @var{m}-th cell of @var{nx}*@var{ny} grid of the whole frame area. This function set off any aspects or rotations. So it should be used first for creating the subplot. Extra space will be reserved for axis/colorbar if @var{stl} contain:
+Puts further plotting in a @var{m}-th cell of @var{nx}*@var{ny} grid of the whole frame area. The position of the cell can be shifted from its default position by relative size @var{dx}, @var{dy}. This function set off any aspects or rotations. So it should be used first for creating the subplot. Extra space will be reserved for axis/colorbar if @var{stl} contain:
 @itemize @bullet
 @item
 @samp{L} or @samp{<} -- at left side,
@@ -1006,16 +1042,16 @@ Puts further plotting in a @var{m}-th cell of @var{nx}*@var{ny} grid of the whol
 @item
 @samp{#} -- reserve none space (use whole region for axis range) -- axis and tick labels will be invisible by default.
 @end itemize
-From the aesthetical point of view it is not recommended to use this function with different matrices in the same frame. The position of the cell can be shifted from its default position by relative size @var{dx}, @var{dy}. Note, colorbar can be invisible (be out of image borders) if you set empty style @samp{}.
+From the aesthetical point of view it is not recommended to use this function with different matrices in the same frame. Note, colorbar can be invisible (be out of image borders) if you set empty style @samp{}.
 @end deftypefn
 
 @anchor{multiplot}
-@deftypefn {MGL command} {} multiplot @code{nx ny m dx dy} ['style'='<>_^']
+@deftypefn {MGL command} {} multiplot @code{nx ny m dx dy} ['style'='<>_^' sx sy]
 @ifclear UDAV
 @deftypefnx {Method on @code{mglGraph}} @code{void} MultiPlot (@code{int} nx, @code{int} ny, @code{int} m, @code{int} dx, @code{int} dy, @code{const char *}stl=@code{"<>_^"})
 @deftypefnx {C function} @code{void} mgl_multiplot (@code{HMGL} gr, @code{int} nx, @code{int} ny, @code{int} m, @code{int} dx, @code{int} dy, @code{const char *}stl)
 @end ifclear
-Puts further plotting in a rectangle of @var{dx}*@var{dy} cells starting from @var{m}-th cell of @var{nx}*@var{ny} grid of the whole frame area. This function set off any aspects or rotations.  So it should be used first for creating subplot. Extra space will be reserved for axis/colorbar if @var{stl} contain:
+Puts further plotting in a rectangle of @var{dx}*@var{dy} cells starting from @var{m}-th cell of @var{nx}*@var{ny} grid of the whole frame area. The position of the rectangular area can be shifted from its default position by relative size @var{sx}, @var{sy}. This function set off any aspects or rotations.  So it should be used first for creating subplot. Extra space will be reserved for axis/colorbar if @var{stl} contain:
 @itemize @bullet
 @item
 @samp{L} or @samp{<} -- at left side,
@@ -1025,6 +1061,7 @@ Puts further plotting in a rectangle of @var{dx}*@var{dy} cells starting from @v
 @samp{A} or @samp{^} -- at top side,
 @item
 @samp{U} or @samp{_} -- at bottom side.
+@samp{#} -- reserve none space (use whole region for axis range) -- axis and tick labels will be invisible by default.
 @end itemize
 @end deftypefn
 
@@ -1067,6 +1104,16 @@ Puts further plotting in @var{ind}-th cell of @var{nx}*@var{ny} grid. The positi
 Puts further plotting in @var{ind}-th cell of stick with @var{num} cells. At this, stick is rotated on angles @var{tet}, @var{phi}. The position is relative to previous @ref{subplot} (or @ref{inplot} with @var{rel}=@code{false}).
 @end deftypefn
 
+@anchor{shearplot}
+@deftypefn {MGL command} {} shearplot @code{num ind sx sy [xd yd]}
+@ifclear UDAV
+@deftypefnx {Method on @code{mglGraph}} @code{void} ShearPlot (@code{int} num, @code{int} ind, @code{mreal} sx, @code{mreal} sy, @code{mreal} xd=@code{1}, @code{mreal} yd=@code{0})
+@deftypefnx {C function} @code{void} mgl_shearplot (@code{HMGL} gr, @code{int} num, @code{int} ind, @code{mreal} sx, @code{mreal} sy, @code{mreal} xd, @code{mreal} yd)
+@end ifclear
+Puts further plotting in @var{ind}-th cell of stick with @var{num} cells. At this, cell is sheared on values @var{sx}, @var{sy}. Stick direction is specified be @var{xd} and @var{yd}. The position is relative to previous @ref{subplot} (or @ref{inplot} with @var{rel}=@code{false}).
+@end deftypefn
+
+
 @anchor{title}
 @deftypefn {MGL command} {} title 'title' ['stl'='' @code{size=-2}]
 @ifclear UDAV
@@ -1102,6 +1149,15 @@ Rotates a further plotting relative to each axis @{x, z, y@} consecutively on an
 Rotates a further plotting around vector @{@var{x}, @var{y}, @var{z}@} on angle @var{Tet}.
 @end deftypefn
 
+@anchor{shear}
+@deftypefn {MGL command} {} shear @code{sx sy}
+@ifclear UDAV
+@deftypefnx {Method on @code{mglGraph}} @code{void} Shear (@code{mreal} sx, @code{mreal} sy)
+@deftypefnx {C function} @code{void} mgl_shear (@code{HMGL} gr, @code{mreal} sx, @code{mreal} sy)
+@end ifclear
+Shears a further plotting on values @var{sx}, @var{sy}.
+@end deftypefn
+
 @anchor{aspect}
 @deftypefn {MGL command} {} aspect @code{ax ay [az=1]}
 @ifclear UDAV
@@ -1178,12 +1234,14 @@ Functions in this group save or give access to produced picture. So, usually the
 Sets size of picture in pixels. This function @strong{should be} called before any other plotting because it completely remove picture contents if @var{clear}=@code{true}. Function just clear pixels and scale all primitives if @var{clear}=@code{false}.
 @end deftypefn
 
+@anchor{setsizescl}
+@deftypefn {MGL command} {} setsizescl @code{factor}
 @ifclear UDAV
-@deftypefn {Method on @code{mglGraph}} @code{void} SetSizeScl (@code{double} factor)
+@deftypefnx {Method on @code{mglGraph}} @code{void} SetSizeScl (@code{double} factor)
 @deftypefnx {C function} @code{void} mgl_set_size_scl (@code{HMGL} gr, @code{double} factor)
+@end ifclear
 Set factor for width and height in all further calls of @ref{setsize}.
 @end deftypefn
-@end ifclear
 
 @anchor{quality}
 @deftypefn {MGL command} {} quality [@code{val}=2]
@@ -1253,6 +1311,16 @@ These functions export current view to a graphic file. The filename @var{fname}
 Exports current frame to a file @var{fname} which type is determined by the extension. Parameter @var{descr} adds description to file (can be @code{""}). If @var{fname}=@code{""} then the file @samp{frame####.jpg} is used, where @samp{####} is current frame id and name @samp{frame} is defined by @ref{plotid} class property.
 @end deftypefn
 
+@anchor{bbox}
+@deftypefn {MGL command} {} bbox x1 y1 [x2=@code{-1} y2=@code{-1}]
+@ifclear UDAV
+@deftypefnx {Method on @code{mglGraph}} @code{void} SetBBox (@code{int} x1=@code{0}, @code{int} y1=@code{0}, @code{int} x2=@code{-1}, @code{int} y2=@code{-1})
+@deftypefnx {C function} @code{void} mgl_set_bbox (@code{HMGL} gr, @code{int} x1, @code{int} y1, @code{int} x2, @code{int} y2)
+@end ifclear
+Set boundary box for export graphics into 2D file formats. If @var{x2}<0 (@var{y2}<0) then original image width (height) will be used. If @var{x1}<0 or @var{y1}<0 or @var{x1}>=@var{x2}|Width or @var{y1}>=@var{y2}|Height then cropping will be disabled.
+@end deftypefn
+
+
 @ifclear UDAV
 
 @deftypefn {Method on @code{mglGraph}} @code{void} WritePNG (@code{const char *}fname, @code{const char *}descr=@code{""}, @code{int} compr=@code{""}, @code{bool} alpha=@code{true})
@@ -1566,6 +1634,7 @@ These functions change background image.
 
 @anchor{clf}
 @deftypefn {MGL command} {} clf ['col']
+@deftypefnx {MGL command} {} clf r g b
 @ifclear UDAV
 @deftypefnx {Method on @code{mglGraph}} @code{void} Clf ()
 @deftypefnx {Method on @code{mglGraph}} @code{void} Clf (@code{const char *} col)
@@ -1651,7 +1720,7 @@ Draws a 3d error box at position @var{p}=@{@var{x}, @var{y}, @var{z}@} with size
 @deftypefnx {Method on @code{mglGraph}} @code{void} Line (@code{mglPoint} p1, @code{mglPoint} p2, @code{char *}stl=@code{"B"}, @code{int} num=@code{2})
 @deftypefnx {C function} @code{void} mgl_line (@code{HMGL} gr, @code{mreal} x1, @code{mreal} y1, @code{mreal} z1, @code{mreal} x2, @code{mreal} y2, @code{mreal} z2, @code{char *}stl, @code{int} num)
 @end ifclear
-Draws a geodesic line (straight line in Cartesian coordinates) from point @var{p1} to @var{p2} using line style @var{stl}. Parameter @var{num} define the ``quality'' of the line. If @var{num}=@code{2} then the stright line will be drawn in all coordinate system (independently on transformation formulas (see @ref{Curved coordinates}). Contrary, for large values (for example, =@code{100}) the geodesic line will be drawn in corresponding coordinate system (straight line in Cartesian coordinates, circle in polar coordinates and so on). Line will be drawn even if it lies out of bounding box.
+Draws a geodesic line (straight line in Cartesian coordinates) from point @var{p1} to @var{p2} using line style @var{stl}. Parameter @var{num} define the ``quality'' of the line. If @var{num}=@code{2} then the straight line will be drawn in all coordinate system (independently on transformation formulas (see @ref{Curved coordinates}). Contrary, for large values (for example, =@code{100}) the geodesic line will be drawn in corresponding coordinate system (straight line in Cartesian coordinates, circle in polar coordinates and so on). Line will be drawn even if it lies out of bounding box.
 @end deftypefn
 
 @anchor{curve}
@@ -1832,6 +1901,36 @@ colors for filling and boundary (second one if style @samp{@@} is used, black co
 Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command options}. Bitmap can be loaded from file or specified as RGBA values for pixels. Parameter @var{smooth} set to draw bitmap without or with color interpolation.
 @end deftypefn
 
+
+@anchor{symbol}
+@deftypefn {MGL command} {} symbol @code{x y} 'id' ['fnt'='' @code{size=-1}]
+@deftypefnx {MGL command} {} symbol @code{x y z} 'id' ['fnt'='' @code{size=-1}]
+@ifclear UDAV
+@deftypefnx {Method on @code{mglGraph}} @code{void} Symbol (@code{mglPoint} p, @code{char} id, @code{const char *}fnt=@code{""}, @code{mreal} size=@code{-1})
+@deftypefnx {C function} @code{void} mgl_symbol (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{mreal} z, @code{char} id, @code{const char *}fnt, @code{mreal} size)
+@end ifclear
+Draws user-defined symbol with name @var{id} at position @var{p} with style specifying by @var{fnt}. The size of font is set by @var{size} parameter (default is @code{-1}). The string @var{fnt} may contain color specification ended by @samp{:} symbol; styles @samp{a}, @samp{A} to draw at absolute position @{@var{x}, @var{y}@} (supposed to be in range [0,1]) of picture (for @samp{A}) or subplot/inplot (for @samp{a}); and style @samp{w} to draw wired symbol.
+@end deftypefn
+
+@deftypefn {MGL command} {} symbol @code{x y dx dy} 'id' ['fnt'=':L' @code{size=-1}]
+@deftypefnx {MGL command} {} symbol @code{x y z dx dy dz} 'id' ['fnt'=':L' @code{size=-1}]
+@ifclear UDAV
+@deftypefnx {Method on @code{mglGraph}} @code{void} Symbol (@code{mglPoint} p, @code{mglPoint} d, @code{char} id, @code{const char *}fnt=@code{""}, @code{mreal} size=@code{-1})
+@deftypefnx {C function} @code{void} mgl_symbol_dir (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{mreal} z, @code{mreal} dx, @code{mreal} dy, @code{mreal} dz, @code{const char *}text, @code{const char *}fnt, @code{mreal} size)
+@end ifclear
+The same as previous but symbol will be drawn rotated along direction @var{d}.
+@end deftypefn
+
+@anchor{addsymbol}
+@deftypefn {MGL command} {} addsymbol 'id' xdat ydat
+@ifclear UDAV
+@deftypefnx {Method on @code{mglGraph}} @code{void} DefineSymbol (@code{char} id, @code{const mglDataA &}xdat, @code{const mglDataA &}ydat)
+@deftypefnx {C function} @code{void} mgl_define_symbol (@code{HMGL} gr, @code{HCDT} xdat, @code{HCDT} ydat)
+@end ifclear
+Add user-defined symbol with name @var{id} and contour @{@var{xdat}, @var{ydat}@}. You can use @code{NAN} values to set break (jump) of contour curve.
+@end deftypefn
+
+
 @c ##################################################################
 @external{}
 @node Text printing, Axis and Colorbar, Primitives, MathGL core
@@ -1864,7 +1963,7 @@ If string contains symbols @samp{aA} then text is printed at absolute position @
 @deftypefnx {C function} @code{void} mgl_puts (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{mreal} z, @code{const char *}text, @code{const char *}fnt, @code{mreal} size)
 @deftypefnx {C function} @code{void} mgl_putsw (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{mreal} z, @code{const wchar_t *}text, @code{const char *}fnt, @code{mreal} size)
 @end ifclear
-The function plots the string @var{text} at position @var{p} with fonts specifying by the criteria @var{fnt}. The size of font is set by @var{size} parameter (default is @code{-1}).
+Draws the string @var{text} at position @var{p} with fonts specifying by the criteria @var{fnt}. The size of font is set by @var{size} parameter (default is @code{-1}).
 @end deftypefn
 
 @deftypefn {MGL command} {} text @code{x y dx dy} 'text' ['fnt'=':L' @code{size=-1}]
@@ -1875,7 +1974,7 @@ The function plots the string @var{text} at position @var{p} with fonts specifyi
 @deftypefnx {C function} @code{void} mgl_puts_dir (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{mreal} z, @code{mreal} dx, @code{mreal} dy, @code{mreal} dz, @code{const char *}text, @code{const char *}fnt, @code{mreal} size)
 @deftypefnx {C function} @code{void} mgl_putsw_dir (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{mreal} z, @code{mreal} dx, @code{mreal} dy, @code{mreal} dz, @code{const wchar_t *}text, @code{const char *}fnt, @code{mreal} size)
 @end ifclear
-The function plots the string @var{text} at position @var{p} along direction @var{d} with specified @var{size}. Parameter @var{fnt} set text style and text position: under (@samp{T}) or above (@samp{t}) the line.
+Draws the string @var{text} at position @var{p} along direction @var{d} with specified @var{size}. Parameter @var{fnt} set text style and text position: under (@samp{T}) or above (@samp{t}) the line.
 @end deftypefn
 
 @anchor{fgets}
@@ -1933,6 +2032,7 @@ Draws axes with ticks (see @ref{Axis settings}). Parameter @var{dir} may contain
 @item @samp{!} for disabling ticks tuning (see @ref{tuneticks});
 @item @samp{AKDTVISO} for drawing arrow at the end of axis;
 @item @samp{a} for forced adjusting of axis ticks;
+@item @samp{:} for drawing lines through point (0,0,0);
 @item @samp{f} for printing ticks labels in fixed format;
 @item @samp{E} for using @samp{E} instead of @samp{e} in ticks labels;
 @item @samp{F} for printing ticks labels in LaTeX format;
@@ -2005,7 +2105,7 @@ Draws grid lines perpendicular to direction determined by string parameter @var{
 @deftypefn {MGL command} {} box ['stl'='k' @code{ticks=on}]
 @ifclear UDAV
 @deftypefnx {Method on @code{mglGraph}} @code{void} Box (@code{const char *}col=@code{""}, @code{bool} ticks=@code{true})
-@deftypefnx {C function} @code{void} mgl_box (@code{HMGL} gr, @code{int} ticks)
+@deftypefnx {C function} @code{void} mgl_box (@code{HMGL} gr)
 @deftypefnx {C function} @code{void} mgl_box_str (@code{HMGL} gr, @code{const char *}col, @code{int} ticks)
 @end ifclear
 Draws bounding box outside the plotting volume with color @var{col}. If @var{col} contain @samp{@@} then filled faces are drawn. At this first color is used for faces (default is light yellow), last one for edges. @sref{Bounding box}
@@ -2039,7 +2139,7 @@ Prints the label @var{text} for axis @var{dir}=@samp{x},@samp{y},@samp{z},@samp{
 @cindex SetLegendBox
 @cindex SetLegendMarks
 
-These functions draw legend to the graph (useful for @ref{1D plotting}). Legend entry is a pair of strings: one for style of the line, another one with description text (with included TeX parsing). The arrays of strings may be used directly or by accumulating first to the internal arrays (by function @ref{addlegend}) and further plotting it. The position of the legend can be selected automatic or manually (even out of bounding box). Parameters @var{fnt} and @var{size} specify the font style and size (see @ref{Font settings}). Parameter @var{llen} set the relative width of the line sample and the text indent. If line style string for entry is empty then the corresponding text is printed without indent. Parameter @var{fnt} may contain:
+These functions draw legend to the graph (useful for @ref{1D plotting}). Legend entry is a pair of strings: one for style of the line, another one with description text (with included TeX parsing). The arrays of strings may be used directly or by accumulating first to the internal arrays (by function @ref{addlegend}) and further plotting it. The position of the legend can be selected automatic or manually (even out of bounding box). Parameters @var{fnt} and @var{size} specify the font style and size (see @ref{Font settings}). Option @code{value} set the relative width of the line sample and the text indent. If line style string for entry is empty then the corresponding text is printed without indent. Parameter @var{fnt} may contain:
 @itemize @bullet
 @item
 font style for legend text;
@@ -2144,7 +2244,7 @@ String @var{pen} specifies the color and style of line and marks (see @ref{Line
 @deftypefnx {C function} @code{void} mgl_plot_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_plot_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}pen, @code{const char *}opt)
 @end ifclear
-These functions draw continuous lines between points @{@var{x}[i], @var{y}[i], @var{z}[i]@}. See also @ref{area}, @ref{step}, @ref{stem}, @ref{tube}, @ref{mark}, @ref{error}, @ref{belt}, @ref{tens}, @ref{tape}. @sref{Plot sample}
+These functions draw continuous lines between points @{@var{x}[i], @var{y}[i], @var{z}[i]@}. If @var{pen} contain @samp{a} then segments between points outside of axis range are drawn too. If @var{pen} contain @samp{~} then number of segments is reduce for quasi-straight curves. See also @ref{area}, @ref{step}, @ref{stem}, @ref{tube}, @ref{mark}, @ref{error}, @ref{belt}, @ref{tens}, @ref{tape}, @ref{meshnum}. @sref{Plot sample}
 @end deftypefn
 
 @anchor{radar}
@@ -2153,7 +2253,7 @@ These functions draw continuous lines between points @{@var{x}[i], @var{y}[i], @
 @deftypefnx {Method on @code{mglGraph}} @code{void} Radar (@code{const mglDataA &}a, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""})
 @deftypefnx {C function} @code{void} mgl_radar (@code{HMGL} gr, @code{HCDT} a, @code{const char *}pen, @code{const char *}opt)
 @end ifclear
-This functions draws radar chart which is continuous lines between points located on an radial lines (like plot in Polar coordinates). Option @code{value} set the additional shift of data (i.e. the data @var{a}+@code{value} is used instead of @var{a}). If @code{value<0} then @code{r=max(0, -min(value)}. If @var{pen} containt @samp{#} symbol then "grid" (radial lines and circle for @var{r}) is drawn. See also @ref{plot}. @sref{Radar sample}
+This functions draws radar chart which is continuous lines between points located on an radial lines (like plot in Polar coordinates). Option @code{value} set the additional shift of data (i.e. the data @var{a}+@code{value} is used instead of @var{a}). If @code{value<0} then @code{r=max(0, -min(value)}. If @var{pen} containt @samp{#} symbol then "grid" (radial lines and circle for @var{r}) is drawn. If @var{pen} contain @samp{a} then segments between points outside of axis range are drawn too. See also @ref{plot}, @ref{meshnum}. @sref{Radar sample}
 @end deftypefn
 
 @anchor{step}
@@ -2168,7 +2268,7 @@ This functions draws radar chart which is continuous lines between points locate
 @deftypefnx {C function} @code{void} mgl_step_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_step_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}pen, @code{const char *}opt)
 @end ifclear
-These functions draw continuous stairs for points to axis plane. See also @ref{plot}, @ref{stem}, @ref{tile}, @ref{boxs}. @sref{Step sample}
+These functions draw continuous stairs for points to axis plane. If @var{x}.nx>@var{y}.nx then @var{x} set the edges of bars, rather than its central positions. See also @ref{plot}, @ref{stem}, @ref{tile}, @ref{boxs}, @ref{meshnum}. @sref{Step sample}
 @end deftypefn
 
 @anchor{tens}
@@ -2183,7 +2283,7 @@ These functions draw continuous stairs for points to axis plane. See also @ref{p
 @deftypefnx {C function} @code{void} mgl_tens_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} c, @code{const char *}pen, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_tens_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{const char *}pen, @code{const char *}opt)
 @end ifclear
-These functions draw continuous lines between points @{@var{x}[i], @var{y}[i], @var{z}[i]@} with color defined by the special array @var{c}[i] (look like tension plot). String @var{pen} specifies the color scheme (see @ref{Color scheme}) and style and/or width of line (see @ref{Line styles}). See also @ref{plot}, @ref{mesh}, @ref{fall}. @sref{Tens sample}
+These functions draw continuous lines between points @{@var{x}[i], @var{y}[i], @var{z}[i]@} with color defined by the special array @var{c}[i] (look like tension plot). String @var{pen} specifies the color scheme (see @ref{Color scheme}) and style and/or width of line (see @ref{Line styles}). If @var{pen} contain @samp{a} then segments between points outside of axis range are drawn too. If @var{pen} contain @samp{~} then number of segments is reduce for quasi-straight curves. See also @ref{plot}, @ref{mesh}, @ref{fall}, @ref{meshnum}. @sref{Tens sample}
 @end deftypefn
 
 @anchor{tape}
@@ -2213,7 +2313,7 @@ These functions draw tapes of normals for curve between points @{@var{x}[i], @va
 @deftypefnx {C function} @code{void} mgl_area_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_area_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}pen, @code{const char *}opt)
 @end ifclear
-These functions draw continuous lines between points and fills it to axis plane. Also you can use gradient filling if number of specified colors is equal to 2*number of curves. See also @ref{plot}, @ref{bars}, @ref{stem}, @ref{region}. @sref{Area sample}
+These functions draw continuous lines between points and fills it to axis plane. Also you can use gradient filling if number of specified colors is equal to 2*number of curves. If @var{pen} contain @samp{#} then wired plot is drawn. If @var{pen} contain @samp{a} then segments between points outside of axis range are drawn too. See also @ref{plot}, @ref{bars}, @ref{stem}, @ref{region}. @sref{Area sample}
 @end deftypefn
 
 @anchor{region}
@@ -2230,7 +2330,7 @@ These functions draw continuous lines between points and fills it to axis plane.
 @deftypefnx {C function} @code{void} mgl_region_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y1, @code{HCDT} y2, @code{const char *}pen, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_region_3d (@code{HMGL} gr, @code{HCDT} x1, @code{HCDT} y1, @code{HCDT} z1, @code{HCDT} x2, @code{HCDT} y2, @code{HCDT} z2, @code{const char *}pen, @code{const char *}opt)
 @end ifclear
-These functions fill area between 2 curves. Dimensions of arrays @var{y1} and @var{y2} must be equal. Also you can use gradient filling if number of specified colors is equal to 2*number of curves. If for 2D version @var{pen} contain symbol @samp{i} then only area with y1<y<y2 will be filled else the area with y2<y<y1 will be filled too. See also @ref{area}, @ref{bars}, @ref{stem}. @sref{Region sample}
+These functions fill area between 2 curves. Dimensions of arrays @var{y1} and @var{y2} must be equal. Also you can use gradient filling if number of specified colors is equal to 2*number of curves. If for 2D version @var{pen} contain symbol @samp{i} then only area with y1<y<y2 will be filled else the area with y2<y<y1 will be filled too. If @var{pen} contain @samp{#} then wired plot is drawn. If @var{pen} contain @samp{a} then segments between points outside of axis range are drawn too. See also @ref{area}, @ref{bars}, @ref{stem}. @sref{Region sample}
 @end deftypefn
 
 @anchor{stem}
@@ -2260,7 +2360,18 @@ These functions draw vertical lines from points to axis plane. See also @ref{are
 @deftypefnx {C function} @code{void} mgl_bars_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_bars_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}pen, @code{const char *}opt)
 @end ifclear
-These functions draw vertical bars from points to axis plane. If string @var{pen} contain symbol @samp{a} then lines are drawn one above another (like summation). If string contain symbol @samp{f} then waterfall chart is drawn for determining the cumulative effect of sequentially introduced positive or negative values. You can give different colors for positive and negative values if number of specified colors is equal to 2*number of curves. If @var{pen} contain @samp{<}, @samp{^} or @samp{>} then boxes will be aligned left, right or centered at its x-coordinates. See also @ref{barh}, @ref{cones}, @ref{area}, @ref{stem}, @ref{chart}, @ref{barwidth}. @sref{Bars sample}
+These functions draw vertical bars from points to axis plane. Parameter @var{pen} can contain:
+@itemize @bullet
+@item
+@samp{a} for drawing lines one above another (like summation);
+@item
+@samp{f} for drawing waterfall chart, which show the cumulative effect of sequential positive or negative values;
+@item
+@samp{F} for using fixed (minimal) width for all bars;
+@item
+@samp{<}, @samp{^} or @samp{>} for aligning boxes left, right or centering them at its x-coordinates.
+@end itemize
+You can give different colors for positive and negative values if number of specified colors is equal to 2*number of curves. If @var{x}.nx>@var{y}.nx then @var{x} set the edges of bars, rather than its central positions. See also @ref{barh}, @ref{cones}, @ref{area}, @ref{stem}, @ref{chart}, @ref{barwidth}. @sref{Bars sample}
 @end deftypefn
 
 @anchor{barh}
@@ -2272,7 +2383,18 @@ These functions draw vertical bars from points to axis plane. If string @var{pen
 @deftypefnx {C function} @code{void} mgl_barh (@code{HMGL} gr, @code{HCDT} v, @code{const char *}pen, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_barh_xy (@code{HMGL} gr, @code{HCDT} y, @code{HCDT} v, @code{const char *}pen, @code{const char *}opt)
 @end ifclear
-These functions draw horizontal bars from points to axis plane. If string contain symbol @samp{a} then lines are drawn one above another (like summation). If string contain symbol @samp{f} then waterfall chart is drawn for determining the cumulative effect of sequentially introduced positive or negative values. You can give different colors for positive and negative values if number of specified colors is equal to 2*number of curves. If @var{pen} contain @samp{<}, @samp{^} or @samp{>} then boxes will be aligned left, right or centered at its x-coordinates. See also @ref{bars}, @ref{barwidth}. @sref{Barh sample}
+These functions draw horizontal bars from points to axis plane. Parameter @var{pen} can contain:
+@itemize @bullet
+@item
+@samp{a} for drawing lines one above another (like summation);
+@item
+@samp{f} for drawing waterfall chart, which show the cumulative effect of sequential positive or negative values;
+@item
+@samp{F} for using fixed (minimal) width for all bars;
+@item
+@samp{<}, @samp{^} or @samp{>} for aligning boxes left, right or centering them at its x-coordinates.
+@end itemize
+You can give different colors for positive and negative values if number of specified colors is equal to 2*number of curves. If @var{x}.nx>@var{y}.nx then @var{x} set the edges of bars, rather than its central positions. See also @ref{bars}, @ref{barwidth}. @sref{Barh sample}
 @end deftypefn
 
 @anchor{cones}
@@ -2385,7 +2507,7 @@ These functions draw error boxes @{@var{ex}[i], @var{ey}[i]@} at points @{@var{x
 @deftypefnx {C function} @code{void} mgl_mark_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} r, @code{const char *}pen, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_mark_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} r, @code{const char *}pen, @code{const char *}opt)
 @end ifclear
-These functions draw marks with size @var{r}[i]*@ref{marksize} at points @{@var{x}[i], @var{y}[i], @var{z}[i]@}. If you need to draw markers of the same size then you can use @ref{plot} function with empty line style @samp{ }. For markers with size in axis range use @ref{error} with style @samp{@@}. See also @ref{plot}, @ref{textmark}, @ref{error}, @ref{stem}. @sref{Mark sample}
+These functions draw marks with size @var{r}[i]*@ref{marksize} at points @{@var{x}[i], @var{y}[i], @var{z}[i]@}. If you need to draw markers of the same size then you can use @ref{plot} function with empty line style @samp{ }. For markers with size in axis range use @ref{error} with style @samp{@@}. See also @ref{plot}, @ref{textmark}, @ref{error}, @ref{stem}, @ref{meshnum}. @sref{Mark sample}
 @end deftypefn
 
 @anchor{textmark}
@@ -2411,7 +2533,7 @@ These functions draw marks with size @var{r}[i]*@ref{marksize} at points @{@var{
 @deftypefnx {C function} @code{void} mgl_textmark_xyzr (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} r, @code{const char *}txt, @code{const char *}fnt, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_textmarkw_xyzr (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} r, @code{const wchar_t *}txt, @code{const char *}fnt, @code{const char *}opt)
 @end ifclear
-These functions draw string @var{txt} as marks with size proportional to @var{r}[i]*@var{marksize} at points @{@var{x}[i], @var{y}[i], @var{z}[i]@}. By default (if omitted) @var{r}[i]=1. See also @ref{plot}, @ref{mark}, @ref{stem}. @sref{TextMark sample}
+These functions draw string @var{txt} as marks with size proportional to @var{r}[i]*@var{marksize} at points @{@var{x}[i], @var{y}[i], @var{z}[i]@}. By default (if omitted) @var{r}[i]=1. See also @ref{plot}, @ref{mark}, @ref{stem}, @ref{meshnum}. @sref{TextMark sample}
 @end deftypefn
 
 @anchor{label}
@@ -2434,7 +2556,7 @@ These functions draw string @var{txt} as marks with size proportional to @var{r}
 @end ifclear
 These functions draw string @var{txt} at points @{@var{x}[i], @var{y}[i], @var{z}[i]@}. If string @var{txt} contain @samp{%x}, @samp{%y}, @samp{%z} or @samp{%n} then it will be replaced by the value of x-,y-,z-coordinate of the point or its index. String @var{fnt} may contain:
 @itemize
-@item @ref{Font styles};
+@item font style @ref{Font styles};
 @item @samp{f} for fixed format of printed numbers;
 @item @samp{E} for using @samp{E} instead of @samp{e};
 @item @samp{F} for printing in LaTeX format;
@@ -2458,7 +2580,7 @@ See also @ref{plot}, @ref{mark}, @ref{textmark}, @ref{table}. @sref{Label sample
 @end ifclear
 These functions draw table with values of @var{val} and captions from string @var{txt} (separated by newline symbol @samp{\n}) at points @{@var{x}, @var{y}@} (default at @{0,0@}) related to current subplot. String @var{fnt} may contain:
 @itemize
-@item @ref{Font styles};
+@item font style @ref{Font styles};
 @item @samp{#} for drawing cell borders;
 @item @samp{|} for limiting table widh by subplot one (equal to option @samp{value 1});
 @item @samp{=} for equal width of all cells;
@@ -2472,6 +2594,22 @@ These functions draw table with values of @var{val} and captions from string @va
 Option @code{value} set the width of the table (default is 1). See also @ref{plot}, @ref{label}. @sref{Table sample}
 @end deftypefn
 
+@anchor{iris}
+@deftypefn {MGL command} {} iris dats 'ids' ['stl'='']
+@deftypefnx {MGL command} {} iris dats rngs 'ids' ['stl'='']
+@ifclear UDAV
+@deftypefnx {Method on @code{mglGraph}} @code{void} Iris (@code{const mglDataA &}dats, @code{const char *}ids, @code{const char *}stl=@code{""}, @code{const char *}opt=@code{""})
+@deftypefnx {Method on @code{mglGraph}} @code{void} Iris (@code{const mglDataA &}dats, @code{const wchar_t *}ids, @code{const char *}stl=@code{""}, @code{const char *}opt=@code{""})
+@deftypefnx {Method on @code{mglGraph}} @code{void} Iris (@code{const mglDataA &}dats, @code{const mglDataA &}rngs, @code{const char *}ids, @code{const char *}stl=@code{""}, @code{const char *}opt=@code{""})
+@deftypefnx {Method on @code{mglGraph}} @code{void} Iris (@code{const mglDataA &}dats, @code{const mglDataA &}rngs, @code{const wchar_t *}ids, @code{const char *}stl=@code{""}, @code{const char *}opt=@code{""})
+@deftypefnx {C function} @code{void} mgl_iris_1 (@code{HMGL} gr, @code{HCDT} dats, @code{const char *}ids, @code{const char *}stl, @code{const char *}opt)
+@deftypefnx {C function} @code{void} mgl_irisw_1 (@code{HMGL} gr, @code{HCDT} dats, @code{const wchar_t *}ids, @code{const char *}stl, @code{const char *}opt)
+@deftypefnx {C function} @code{void} mgl_iris (@code{HMGL} gr, @code{HCDT} dats, @code{HCDT} rngs, @code{const char *}ids, @code{const char *}stl, @code{const char *}opt)
+@deftypefnx {C function} @code{void} mgl_irisw (@code{HMGL} gr, @code{HCDT} dats, @code{HCDT} rngs, @code{const wchar_t *}ids, @code{const char *}stl, @code{const char *}opt)
+@end ifclear
+Draws Iris plots for determining cross-dependences of data arrays @var{dats} (see @uref{http://en.wikipedia.org/wiki/Iris_flower_data_set}). Data @var{rngs} of size 2*@var{dats}.nx provide manual axis ranges for each column. String @var{ids} contain column names, separated by @samp{;} symbol. Option @code{value} set the text size for column names. You can add another data set to existing Iris plot by providing the same ranges @var{rngs} and empty column names @var{ids}. See also @ref{plot}. @sref{Iris sample}
+@end deftypefn
+
 @anchor{tube}
 @deftypefn {MGL command} {} tube ydat rdat ['stl'='']
 @deftypefnx {MGL command} {} tube ydat @code{rval} ['stl'='']
@@ -2611,7 +2749,7 @@ The function draws fall lines for surface specified parametrically @{@var{x}[i,j
 @deftypefnx {C function} @code{void} mgl_belt (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_belt_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
 @end ifclear
-The function draws belts for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. This plot can be used as 3d generalization of @ref{plot}). If @var{sch} contain @samp{x} then belts are drawn along x-direction else (by default) belts are drawn along y-direction. See also @ref{fall}, @ref{surf}, @ref{plot}, @ref{meshnum}. @sref{Belt sample}
+The function draws belts for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. This plot can be used as 3d generalization of @ref{plot}). If @var{sch} contain @samp{x} then belts are drawn along x-direction else (by default) belts are drawn along y-direction. See also @ref{fall}, @ref{surf}, @ref{beltc}, @ref{plot}, @ref{meshnum}. @sref{Belt sample}
 @end deftypefn
 
 @anchor{boxs}
@@ -2629,13 +2767,16 @@ The function draws vertical boxes for surface specified parametrically @{@var{x}
 @anchor{tile}
 @deftypefn {MGL command} {} tile zdat ['sch'='']
 @deftypefnx {MGL command} {} tile xdat ydat zdat ['sch'='']
+@deftypefnx {MGL command} {} tile xdat ydat zdat cdat ['sch'='']
 @ifclear UDAV
 @deftypefnx {Method on @code{mglGraph}} @code{void} Tile (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""})
 @deftypefnx {Method on @code{mglGraph}} @code{void} Tile (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""})
+@deftypefnx {Method on @code{mglGraph}} @code{void} Tile (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""})
 @deftypefnx {C function} @code{void} mgl_tile (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_tile_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
+@deftypefnx {C function} @code{void} mgl_tile_xyc (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt)
 @end ifclear
-The function draws horizontal tiles for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. Such plot can be used as 3d generalization of @ref{step}. See also @ref{surf}, @ref{boxs}, @ref{step}, @ref{tiles}. @sref{Tile sample}
+The function draws horizontal tiles for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} and color it by matrix @var{c}[i,j] (@var{c}=@var{z} if @var{c} is not provided). If string @var{sch} contain style @samp{x} or @samp{y} then tiles will be oriented perpendicular to x- or y-axis. Such plot can be used as 3d generalization of @ref{step}. See also @ref{surf}, @ref{boxs}, @ref{step}, @ref{tiles}. @sref{Tile sample}
 @end deftypefn
 
 @anchor{dens}
@@ -2656,7 +2797,7 @@ The function draws density plot for surface specified parametrically @{@var{x}[i
 @ifclear UDAV
 @deftypefnx {Method on @code{mglGraph}} @code{void} Cont (@code{const mglDataA &}v, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""})
 @deftypefnx {Method on @code{mglGraph}} @code{void} Cont (@code{const mglDataA &}v, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""})
-@deftypefnx {C function} @code{void} mgl_cont__val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
+@deftypefnx {C function} @code{void} mgl_cont_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_cont_xy_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
 @end ifclear
 The function draws contour lines for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} at @var{z}=@var{v}[k], or at @var{z} equal to minimal z-axis value if @var{sch} contain symbol @samp{_}. Contours are plotted for @var{z}[i,j]=@var{v}[k] where @var{v}[k] are values of data array @var{v}. If string @var{sch} have symbol @samp{t} or @samp{T} then contour labels @var{v}[k] will be drawn below (or above) the contours. See also @ref{dens}, @ref{contf}, @ref{contd}, @ref{axial}, @code{cont[xyz]}. @sref{Cont sample}
@@ -2719,6 +2860,24 @@ The function draws solid (or filled) contour lines for surface specified paramet
 The same as previous with vector @var{v} of @var{num}-th elements equidistantly distributed in color range. Here @var{num} is equal to parameter @code{value} in options @var{opt} (default is 7).
 @end deftypefn
 
+@anchor{contp}
+@deftypefn {MGL command} {} contp vdat xdat ydat zdat adat ['sch'='']
+@ifclear UDAV
+@deftypefnx {Method on @code{mglGraph}} @code{void} ContP (@code{const mglDataA &}v, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""})
+@deftypefnx {C function} @code{void} mgl_contp_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt)
+@end ifclear
+The function draws contour lines on surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. Contours are plotted for @var{a}[i,j]=@var{v}[k] where @var{v}[k] are values of data array @var{v}. If string @var{sch} have symbol @samp{t} or @samp{T} then contour labels @var{v}[k] will be drawn below (or above) the contours. If string @var{sch} have symbol @samp{f} then solid contours will be drawn. See also @ref{cont}, @ref{contf}, @ref{surfc}, @code{cont[xyz]}. @c TODO @sref{Cont sample}
+@end deftypefn
+
+@deftypefn {MGL command} {} contp xdat ydat zdat adat ['sch'='']
+@ifclear UDAV
+@deftypefnx {Method on @code{mglGraph}} @code{void} ContP (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""})
+@deftypefnx {C function} @code{void} mgl_contp (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt)
+@end ifclear
+The same as previous with vector @var{v} of @var{num}-th elements equidistantly distributed in color range. Here @var{num} is equal to parameter @code{value} in options @var{opt} (default is 7).
+@end deftypefn
+
+
 @anchor{contv}
 @deftypefn {MGL command} {} contv vdat zdat ['sch'='']
 @deftypefnx {MGL command} {} contv vdat xdat ydat zdat ['sch'='']
@@ -2934,9 +3093,24 @@ These plotting functions draw @emph{two matrix} simultaneously. There are 5 gene
 @deftypefnx {C function} @code{void} mgl_surfc (@code{HMGL} gr, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_surfc_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt)
 @end ifclear
-The function draws surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} and color it by matrix @var{c}[i,j]. If string @var{sch} have symbol @samp{#} then grid lines are drawn. If string @var{sch} have symbol @samp{.} then plot by dots is produced. All dimensions of arrays @var{z} and @var{c} must be equal. Surface is plotted for each z slice of the data. See also @ref{surf}, @ref{surfa}, @ref{surfca}, @ref{surf3c}. @sref{SurfC sample}
+The function draws surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} and color it by matrix @var{c}[i,j]. If string @var{sch} have symbol @samp{#} then grid lines are drawn. If string @var{sch} have symbol @samp{.} then plot by dots is produced. All dimensions of arrays @var{z} and @var{c} must be equal. Surface is plotted for each z slice of the data. See also @ref{surf}, @ref{surfa}, @ref{surfca}, @ref{beltc}, @ref{surf3c}. @sref{SurfC sample}
+@end deftypefn
+
+
+@anchor{beltc}
+@deftypefn {MGL command} {} beltc zdat cdat ['sch'='']
+@deftypefnx {MGL command} {} beltc xdat ydat zdat cdat ['sch'='']
+@ifclear UDAV
+@deftypefnx {Method on @code{mglGraph}} @code{void} BeltC (@code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""})
+@deftypefnx {Method on @code{mglGraph}} @code{void} BeltC (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""})
+@deftypefnx {C function} @code{void} mgl_beltc (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
+@deftypefnx {C function} @code{void} mgl_beltc_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
+@end ifclear
+The function draws belts for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} and color it by matrix @var{c}[i,j]. This plot can be used as 3d generalization of @ref{plot}). If @var{sch} contain @samp{x} then belts are drawn along x-direction else (by default) belts are drawn along y-direction. See also @ref{belt}, @ref{surfc}, @ref{meshnum}. @c TODO @sref{BeltC sample}
 @end deftypefn
 
+
+
 @anchor{surf3c}
 @deftypefn {MGL command} {} surf3c adat cdat @code{val} ['sch'='']
 @deftypefnx {MGL command} {} surf3c xdat ydat zdat adat cdat @code{val} ['sch'='']
@@ -3036,13 +3210,16 @@ Draws @var{num}-th uniformly distributed in color range isosurfaces for 3d data.
 @anchor{tiles}
 @deftypefn {MGL command} {} tiles zdat rdat ['sch'='']
 @deftypefnx {MGL command} {} tiles xdat ydat zdat rdat ['sch'='']
+@deftypefnx {MGL command} {} tiles xdat ydat zdat rdat cdat ['sch'='']
 @ifclear UDAV
 @deftypefnx {Method on @code{mglGraph}} @code{void} TileS (@code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""})
 @deftypefnx {Method on @code{mglGraph}} @code{void} TileS (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}r, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""})
+@deftypefnx {Method on @code{mglGraph}} @code{void} TileS (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}r, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""})
 @deftypefnx {C function} @code{void} mgl_tiles (@code{HMGL} gr, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_tiles_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} r, @code{const char *}sch, @code{const char *}opt)
+@deftypefnx {C function} @code{void} mgl_tiles_xyc (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} r, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt)
 @end ifclear
-The function draws horizontal tiles for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. It is mostly the same as @ref{tile} but the size of tiles is determined by @var{r} array. This is some kind of ``transparency'' useful for exporting to EPS files. Tiles is plotted for each z slice of the data. See also @ref{surfa}, @ref{tile}. @sref{TileS sample}
+The function draws horizontal tiles for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} and color it by matrix @var{c}[i,j]. It is mostly the same as @ref{tile} but the size of tiles is determined by @var{r} array. If string @var{sch} contain style @samp{x} or @samp{y} then tiles will be oriented perpendicular to x- or y-axis. This is some kind of ``transparency'' useful for exporting to EPS files. Tiles is plotted for each z slice of the data. See also @ref{surfa}, @ref{tile}. @sref{TileS sample}
 @end deftypefn
 
 @anchor{map}
@@ -3181,6 +3358,8 @@ color scheme -- up-half (warm) corresponds to normal flow (like attractor), bott
 @item
 @samp{#} for starting threads from edges only;
 @item
+@samp{*} for starting threads from a 2D array of points inside the data;
+@item
 @samp{v} for drawing arrows on the threads;
 @item
 @samp{x}, @samp{z} for drawing tapes of normals in x-y and y-z planes correspondingly.
index 31777bccf4c09239791b347d07a403c0647d2db8..684e3eaac8644604fcfe378c30963e6f9a062cbf 100644 (file)
@@ -142,7 +142,16 @@ MGL не требует создания данного типа объекто
 @deftypefnx {Метод класса @code{mglGraph}} @code{void} SetTranspType (@code{int} type)
 @deftypefnx {Функция С} @code{void} mgl_set_transp_type (@code{HMGL} gr, @code{int} type)
 @end ifclear
-Задает тип прозрачности. Обычная прозрачность (@samp{0}) -- "закрытые" объекты видны меньше чем закрывающие. Этот режим некорректно отображается в OpenGL (mglGraphGL) для нескольких перекрывающихся поверхностей. "Стеклянная" прозрачность (@samp{1}) -- закрытые и закрывающие объекты единообразно ослабляют интенсивность света (по RGB каналам). "Ламповая" прозрачность (@samp{2}) -- закрытые и закрывающие объекты являются источниками дополнительного освещения (рекомендую установить @code{SetAlphaDef(0.3)} или меньше в этом случае). @sref{Types of transparency}
+Задает тип прозрачности. Допустимые значения:
+@itemize @bullet
+@item
+Обычная прозрачность (@samp{0}) -- "закрытые" объекты видны меньше чем закрывающие. Этот режим некорректно отображается в OpenGL (mglGraphGL) для нескольких перекрывающихся поверхностей.
+@item
+"Стеклянная" прозрачность (@samp{1}) -- закрытые и закрывающие объекты единообразно ослабляют интенсивность света (по RGB каналам).
+@item
+"Ламповая" прозрачность (@samp{2}) -- закрытые и закрывающие объекты являются источниками дополнительного освещения (рекомендую установить @code{SetAlphaDef(0.3)} или меньше в этом случае).
+@end itemize
+@sref{Types of transparency}
 @end deftypefn
 
 @c ==================================================================
@@ -176,7 +185,7 @@ MGL не требует создания данного типа объекто
 Включает/выключает @var{n}-ый источник света.
 @end deftypefn
 
-@deftypefn {Команда MGL} {} light @code{num xdir ydir zdir} ['col'='w' @code{br=0.5}]
+@deftypefn {Команда MGL} {} light @code{num xdir ydir zdir} ['col'='w' @code{br=0.5 ap=0}]
 @deftypefnx {Команда MGL} {} light @code{num xdir ydir zdir xpos ypos zpos} ['col'='w' @code{br=0.5}]
 @ifclear UDAV
 @deftypefnx {Метод класса @code{mglGraph}} @code{void} AddLight (@code{int} n, @code{mglPoint} d, @code{char} c=@code{'w'}, @code{mreal} bright=@code{0.5}, @code{mreal} ap=@code{0})
@@ -285,7 +294,7 @@ MGL не требует создания данного типа объекто
 @deftypefnx {Метод класса @code{mglGraph}} @code{void} SetMeshNum (@code{int} val)
 @deftypefnx {Функция С} @code{void} mgl_set_meshnum (@code{HMGL} gr, @code{int} num)
 @end ifclear
-Задает ориентировочное число линий в @ref{mesh}, @ref{fall} и число стрелок (штрихов) в @ref{vect}, @ref{dew} и число ячеек в @ref{cloud}. По умолчанию (=0) рисуются все линии, стрелки, ячейки.
+Задает ориентировочное число линий в @ref{mesh}, @ref{fall}, и число стрелок (штрихов) в @ref{vect}, @ref{dew}, и число ячеек в @ref{cloud}, и число маркеров в @ref{plot}, @ref{tens}, @ref{step}, @ref{mark}, @ref{textmark}. По умолчанию (=0) рисуются все линии, стрелки, ячейки и т.д.
 @end deftypefn
 
 @anchor{facenum}
@@ -473,6 +482,15 @@ MGL не требует создания данного типа объекто
 @end deftypefn
 @end ifclear
 
+@anchor{gray}
+@deftypefn {Команда MGL} {} gray [@code{val=on}]
+@ifclear UDAV
+@deftypefnx {Метод класса @code{mglGraph}} @code{void} Gray (@code{bool} enable)
+@deftypefnx {Функция С} @code{void} mgl_set_gray (@code{HMGL} gr, @code{int} enable)
+@end ifclear
+Включает/выключает вывод графика в оттенках серого.
+@end deftypefn
+
 @c ==================================================================
 @external{}
 @node Masks, Error handling, Palette and colors, Graphics setup
@@ -483,6 +501,7 @@ MGL не требует создания данного типа объекто
 
 @anchor{mask}
 @deftypefn {Команда MGL} {} mask 'id' 'hex'
+@deftypefnx {Команда MGL} {} mask 'id' hex
 @ifclear UDAV
 @deftypefnx {Метод класса @code{mglGraph}} @code{void} SetMask (@code{char} id, @code{const char *}hex)
 @deftypefnx {Метод класса @code{mglGraph}} @code{void} SetMask (@code{char} id, @code{uint64_t} hex)
@@ -695,13 +714,16 @@ Setsize: размер(ы) равны нулю или отрицательны
 Задает диапазон изменения координат. Если минимальное и максимальное значение координаты равны, то они игнорируются по данному направлению. Также устанавливает размер цветовой шкалы, аналогично команде  @code{crange z1 z2}. Начальные диапазоны равны [-1, 1].
 @end deftypefn
 
+@deftypefn {Команда MGL} {} ranges @code{xx yy [zz cc=zz]}
 @ifclear UDAV
-@deftypefn {Метод класса @code{mglGraph}} @code{void} SetRanges (@code{const mglDataA &}xx, @code{const mglDataA &}yy)
+@deftypefnx {Метод класса @code{mglGraph}} @code{void} SetRanges (@code{const mglDataA &}xx, @code{const mglDataA &}yy)
 @deftypefnx {Метод класса @code{mglGraph}} @code{void} SetRanges (@code{const mglDataA &}xx, @code{const mglDataA &}yy, @code{const mglDataA &}zz)
 @deftypefnx {Метод класса @code{mglGraph}} @code{void} SetRanges (@code{const mglDataA &}xx, @code{const mglDataA &}yy, @code{const mglDataA &}zz, @code{const mglDataA &}cc)
+@end ifclear
 Задает диапазон изменения @samp{x}-,@samp{y}-,@samp{z}-,@samp{c}-координат как минимальное и максимальное значение массивов @var{xx}, @var{yy}, @var{zz}, @var{cc} соответственно.
 @end deftypefn
 
+@ifclear UDAV
 @deftypefn {Метод класса @code{mglGraph}} @code{void} SetAutoRanges (@code{mglPoint} p1, @code{mglPoint} p2)
 @deftypefnx {Метод класса @code{mglGraph}} @code{void} SetAutoRanges (@code{double} x1, @code{double} x2, @code{double} y1, @code{double} y2, @code{double} z1=@code{0}, @code{double} z2=@code{0}, @code{double} c1=@code{0}, @code{double} c2=@code{0})
 @deftypefnx {Функция С} @code{void} mgl_set_auto_ranges (@code{HMGL} gr, @code{double} x1, @code{double} x2, @code{double} y1, @code{double} y2, @code{double} z1, @code{double} z2, @code{double} z1, @code{double} z2)
@@ -744,7 +766,7 @@ Setsize: размер(ы) равны нулю или отрицательны
 @cindex Ternary
 @end ifclear
 
-@deftypefn {Команда MGL} {} axis 'fx' 'fy' 'fz'='' ['fa'='']
+@deftypefn {Команда MGL} {} axis 'fx' 'fy' 'fz' ['fa'='']
 @ifclear UDAV
 @deftypefnx {Метод класса @code{mglGraph}} @code{void} SetFunc (@code{const char *}EqX, @code{const char *}EqY, @code{const char *}EqZ=@code{""}, @code{const char *}EqA=@code{""})
 @deftypefnx {Функция С} @code{void} mgl_set_func (@code{HMGL} gr, @code{const char *}EqX, @code{const char *}EqY, @code{const char *}EqZ, @code{const char *}EqA)
@@ -757,7 +779,37 @@ Setsize: размер(ы) равны нулю или отрицательны
 @deftypefnx {Метод класса @code{mglGraph}} @code{void} SetCoor (@code{int} how)
 @deftypefnx {Функция С} @code{void} mgl_set_coor (@code{HMGL} gr, @code{int} how)
 @end ifclear
-Устанавливает одну из предопределенных систем криволинейных координат в зависимости от параметра @var{how}: @code{mglCartesian=0} -- декартова система (нет преобразования координат, наиболее быстрая); @code{mglPolar=1} -- полярные координаты @math{x_n=x*cos(y),y_n=x*sin(y), z_n=z}; @code{mglSpherical=2} -- сферические координаты @math{x_n=x*sin(y)*cos(z), y_n=x*sin(y)*sin(z), z_n=x*cos(y)}; @code{mglParabolic=3} -- параболические координаты @math{x_n=x*y, y_n=(x*x-y*y)/2, z_n=z}; @code{mglParaboloidal=4} -- Paraboloidal coordinates @math{x_n=(x*x-y*y)*cos(z)/2, y_n=(x*x-y*y)*sin(z)/2, z_n=x*y}; @code{mglOblate=5} -- Oblate coordinates @math{x_n=cosh(x)*cos(y)*cos(z), y_n=cosh(x)*cos(y)*sin(z), z_n=sinh(x)*sin(y)}; @code{mglProlate=6} -- Prolate coordinates @math{x_n=sinh(x)*sin(y)*cos(z), y_n=sinh(x)*sin(y)*sin(z), z_n=cosh(x)*cos(y)}; @code{mglElliptic=7} -- эллиптические координаты @math{x_n=cosh(x)*cos(y), y_n=sinh(x)*sin(y), z_n=z}; @code{mglToroidal=8} -- тороидальные координаты @math{x_n=sinh(x)*cos(z)/(cosh(x)-cos(y)), y_n=sinh(x)*sin(z)/(cosh(x)-cos(y)), z_n=sin(y)/(cosh(x)-cos(y))}; @code{mglBispherical=9} -- бисферические координаты @math{x_n=sin(y)*cos(z)/(cosh(x)-cos(y)), y_n=sin(y)*sin(z)/(cosh(x)-cos(y)), z_n=sinh(x)/(cosh(x)-cos(y))}; @code{mglBipolar=10} -- биполярные координаты @math{x_n=sinh(x)/(cosh(x)-cos(y)), y_n=sin(y)/(cosh(x)-cos(y)), z_n=z}; @code{mglLogLog=11} -- log-log координаты @math{x_n=lg(x), y_n=lg(y), z_n=lg(z)}; @code{mglLogX=12} -- log-x координаты @math{x_n=lg(x), y_n=y, z_n=z}; @code{mglLogY=13} -- log-y координаты @math{x_n=x, y_n=lg(y), z_n=z}.
+Устанавливает одну из предопределенных систем криволинейных координат в зависимости от параметра @var{how}:
+@table @code
+@item mglCartesian=0
+декартова система (нет преобразования координат, @{x,y,z@});
+@item mglPolar=1
+полярные координаты: @{x*cos(y),x*sin(y), z@};
+@item mglSpherical=2
+сферические координаты: @{x*sin(y)*cos(z), x*sin(y)*sin(z), x*cos(y)@};
+@item mglParabolic=3
+параболические координаты: @{x*y, (x*x-y*y)/2, z@};
+@item mglParaboloidal=4
+Paraboloidal coordinates: @{(x*x-y*y)*cos(z)/2, (x*x-y*y)*sin(z)/2, x*y@};
+@item mglOblate=5
+Oblate coordinates: @{cosh(x)*cos(y)*cos(z), cosh(x)*cos(y)*sin(z), sinh(x)*sin(y)@};
+@item mglProlate=6
+Prolate coordinates: @{sinh(x)*sin(y)*cos(z), sinh(x)*sin(y)*sin(z), cosh(x)*cos(y)@};
+@item mglElliptic=7
+эллиптические координаты: @{cosh(x)*cos(y), sinh(x)*sin(y), z@};
+@item mglToroidal=8
+тороидальные координаты: @{sinh(x)*cos(z)/(cosh(x)-cos(y)), sinh(x)*sin(z)/(cosh(x)-cos(y)), sin(y)/(cosh(x)-cos(y))@};
+@item mglBispherical=9
+бисферические координаты: @{sin(y)*cos(z)/(cosh(x)-cos(y)), sin(y)*sin(z)/(cosh(x)-cos(y)), sinh(x)/(cosh(x)-cos(y))@};
+@item mglBipolar=10
+биполярные координаты: @{sinh(x)/(cosh(x)-cos(y)), sin(y)/(cosh(x)-cos(y)), z@};
+@item mglLogLog=11
+Log-log координаты: @{lg(x), lg(y), lg(z)@};
+@item mglLogX=12
+Log-x координаты: @{lg(x), y, z@};
+@item mglLogY=13
+Log-y координаты: @{x, lg(y), z@}.
+@end table
 @end deftypefn
 
 @anchor{ternary}
@@ -816,10 +868,10 @@ Ternary -- специальный тип графика для 3 зависим
 @anchor{ytick}
 @anchor{ztick}
 @anchor{ctick}
-@deftypefn {Команда MGL} {} xtick @code{val [sub=0 org=nan]}
-@deftypefnx {Команда MGL} {} ytick @code{val [sub=0 org=nan]}
-@deftypefnx {Команда MGL} {} ztick @code{val [sub=0 org=nan]}
-@deftypefnx {Команда MGL} {} ctick @code{val [sub=0 org=nan]}
+@deftypefn {Команда MGL} {} xtick @code{val [sub=0 org=nan 'fact'='']}
+@deftypefnx {Команда MGL} {} ytick @code{val [sub=0 org=nan 'fact'='']}
+@deftypefnx {Команда MGL} {} ztick @code{val [sub=0 org=nan 'fact'='']}
+@deftypefnx {Команда MGL} {} ctick @code{val [sub=0 org=nan 'fact'='']}
 @ifclear UDAV
 @deftypefnx {Метод класса @code{mglGraph}} @code{void} SetTicks (@code{char} dir, @code{mreal} d=@code{0}, @code{int} ns=@code{0}, @code{mreal} org=@code{NAN}, @code{const char *}fact=@code{""})
 @deftypefnx {Метод класса @code{mglGraph}} @code{void} SetTicks (@code{char} dir, @code{mreal} d=@code{0}, @code{int} ns=@code{0}, @code{mreal} org=@code{NAN}, @code{const wchar_t *}fact)
@@ -846,7 +898,7 @@ Ternary -- специальный тип графика для 3 зависим
 @deftypefnx {Функция С} @code{void} mgl_set_ticks_val (@code{HMGL} gr, @code{char} dir, @code{HCDT} val, @code{const char *}lbl, @code{bool} add)
 @deftypefnx {Функция С} @code{void} mgl_set_ticks_valw (@code{HMGL} gr, @code{char} dir, @code{HCDT} val, @code{const wchar_t *}lbl, @code{bool} add)
 @end ifclear
-Задает явное положение @var{val} и подписи @var{lbl} для меток вдоль оси @var{dir}. Если массив @var{val} не указан, то используются значения равно распределённые в диапазоне осей координат. Метки разделяются символом @samp{\n}. Используйте @code{SetTicks()} для восстановления автоматических меток.
\97адаеÑ\82 Ñ\8fвное Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ðµ @var{val} Ð¸ Ð¿Ð¾Ð´Ð¿Ð¸Ñ\81и @var{lbl} Ð´Ð»Ñ\8f Ð¼ÐµÑ\82ок Ð²Ð´Ð¾Ð»Ñ\8c Ð¾Ñ\81и @var{dir}. Ð\95Ñ\81ли Ð¼Ð°Ñ\81Ñ\81ив @var{val} Ð½Ðµ Ñ\83казан, Ñ\82о Ð¸Ñ\81полÑ\8cзÑ\83Ñ\8eÑ\82Ñ\81Ñ\8f Ð·Ð½Ð°Ñ\87ениÑ\8f Ñ\80авно Ñ\80аÑ\81пÑ\80еделÑ\91ннÑ\8bе Ð² Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ðµ Ð¾Ñ\81ей ÐºÐ¾Ð¾Ñ\80динаÑ\82. Ð\9cеÑ\82ки Ñ\80азделÑ\8fÑ\8eÑ\82Ñ\81Ñ\8f Ñ\81имволом @samp{\n}. Ð\95Ñ\81ли Ð² ÐºÐ¾Ð¼Ð°Ð½Ð´Ðµ MGL Ð·Ð°Ð´Ð°Ð½Ð¾ Ñ\82олÑ\8cко Ð¾Ð´Ð½Ð¾ Ð·Ð½Ð°Ñ\87ение, Ñ\82о Ð¼ÐµÑ\82ка Ð±Ñ\83деÑ\82 @emph{добавлена} Ðº Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83Ñ\8eÑ\89им Ð¼ÐµÑ\82кам. Ð\98Ñ\81полÑ\8cзÑ\83йÑ\82е @code{SetTicks()} Ð´Ð»Ñ\8f Ð²Ð¾Ñ\81Ñ\81Ñ\82ановлениÑ\8f Ð°Ð²Ñ\82омаÑ\82иÑ\87еÑ\81киÑ\85 Ð¼ÐµÑ\82ок.
 @end deftypefn
 
 @ifclear UDAV
@@ -872,7 +924,7 @@ Ternary -- специальный тип графика для 3 зависим
 @end deftypefn
 
 @anchor{ticktime}
-@deftypefn {Команда MGL} {} ticktime 'dir' [@code{dv} 'tmpl']
+@deftypefn {Команда MGL} {} ticktime 'dir' [@code{dv=0} 'tmpl'='']
 @ifclear UDAV
 @deftypefnx {Метод класса @code{mglGraph}} @code{void} SetTicksTime (@code{char} dir, @code{mreal} val, @code{const char *}templ)
 @deftypefnx {Функция С} @code{void} mgl_set_ticks_time (@code{HMGL} gr, @code{mreal} val, @code{const char *}templ)
@@ -966,25 +1018,51 @@ Ternary -- специальный тип графика для 3 зависим
 @cindex Push
 @cindex Pop
 
-Эти функции контролируют где и как график будет расположен. Существует определенный порядок вызова этих функций для лучшего вида графика. Вначале должны вызываться функции @ref{subplot}, @ref{multiplot} или @ref{inplot} для указания местоположения вывода. После них -- функции вращения @ref{rotate} и @ref{aspect}. И наконец любые другие функции для рисования графика. Вместо вращения графика можно вызвать функцию @ref{columnplot}, @ref{gridplot}, @ref{stickplot} или относительную @ref{inplot} для расположения графиков в столбец одного над другим без зазора между осями. @sref{Subplots}
+Эти функции контролируют где и как график будет расположен. Существует определенный порядок вызова этих функций для лучшего вида графика. Вначале должны вызываться функции @ref{subplot}, @ref{multiplot} или @ref{inplot} для указания местоположения вывода. После них -- функции вращения @ref{rotate}, @ref{shear} и @ref{aspect}. И наконец любые другие функции для рисования графика. Вместо вращения графика можно вызвать функцию @ref{columnplot}, @ref{gridplot}, @ref{stickplot}, @ref{shearplot} или относительную @ref{inplot} для расположения графиков в столбец одного над другим без зазора между осями. @sref{Subplots}
 
 @anchor{subplot}
-@deftypefn {Команда MGL} {} subplot @code{nx ny m ['stl'='<>_^' dx=0 dy=0]}
+@deftypefn {Команда MGL} {} subplot @code{nx ny m} ['stl'='<>_^' @code{dx=0 dy=0}]
 @ifclear UDAV
 @deftypefnx {Метод класса @code{mglGraph}} @code{void} SubPlot (@code{int} nx, @code{int} ny, @code{int} m, @code{const char *}stl=@code{"<>_^"}, @code{mreal} dx=@code{0}, @code{mreal} dy=@code{0})
 @deftypefnx {Функция С} @code{void} mgl_subplot (@code{HMGL} gr, @code{int} nx, @code{int} ny, @code{int} m, @code{const char *}stl)
 @deftypefnx {Функция С} @code{void} mgl_subplot_d (@code{HMGL} gr, @code{int} nx, @code{int} ny, @code{int} m, @code{const char *}stl, @code{mreal} dx, @code{mreal} dy)
 @end ifclear
-Помещает последующий вывод в @var{m}-ую ячейку сетки размером @var{nx}*@var{ny} от всего рисунка. Функция сбрасывает матрицу трансформации (повороты и сжатие графика) и должна вызываться первой для создания "подграфика". С эстетической точки зрения не рекомендуется вызывать эту функцию с различными (или не кратными) размерами сетки. Место для осей/colorbar резервируется только если строка @var{stl} содержит: @samp{L} или @samp{<} -- с левого края, @samp{R} или @samp{>} -- с правого края, @samp{A} или @samp{^} -- с верхнего края, @samp{U} или @samp{_} -- с нижнего края. Если строка @var{stl} содержит @samp{#}, то оси координат будут занимать все доступное пространство (место резервироваться не будет). Ячейка может быть дополнительно сдвинута относительно своего обычного положения на относительный размер @var{dx}, @var{dy}. Отмечу, что colorbar может находиться за пределами рисунка если выбран пустой стиль @samp{}.
+Помещает последующий вывод в @var{m}-ую ячейку сетки размером @var{nx}*@var{ny} от всего рисунка. Функция сбрасывает матрицу трансформации (повороты и сжатие графика) и должна вызываться первой для создания "подграфика". С эстетической точки зрения не рекомендуется вызывать эту функцию с различными (или не кратными) размерами сетки. Дополнительное место для осей/colorbar резервируется только если строка @var{stl} содержит: 
+@itemize @bullet
+@item
+@samp{L} или @samp{<} -- с левого края,
+@item
+@samp{R} или @samp{>} -- с правого края,
+@item
+@samp{A} или @samp{^} -- с верхнего края,
+@item
+@samp{U} или @samp{_} -- с нижнего края,
+@item
+@samp{#} -- место резервироваться не будет -- оси координат будут занимать все доступное пространство.
+@end itemize
+Ячейка может быть дополнительно сдвинута относительно своего обычного положения на относительный размер @var{dx}, @var{dy}. Отмечу, что colorbar может находиться за пределами рисунка если выбран пустой стиль @samp{}.
 @end deftypefn
 
 @anchor{multiplot}
-@deftypefn {Команда MGL} {} multiplot @code{nx ny m dx dy} ['style'='<>_^']
+@deftypefn {Команда MGL} {} multiplot @code{nx ny m dx dy} ['style'='<>_^' sx sy]
 @ifclear UDAV
 @deftypefnx {Метод класса @code{mglGraph}} @code{void} MultiPlot (@code{int} nx, @code{int} ny, @code{int} m, @code{int} dx, @code{int} dy, @code{const char *}stl=@code{"<>_^"})
 @deftypefnx {Функция С} @code{void} mgl_multiplot (@code{HMGL} gr, @code{int} nx, @code{int} ny, @code{int} m, @code{int} dx, @code{int} dy, @code{const char *}stl)
 @end ifclear
-Помещает последующий вывод в прямоугольник из @var{dx}*@var{dy} ячеек, начиная с @var{m}-ой ячейки, сетки размером @var{nx}*@var{ny} от всего рисунка. Функция сбрасывает матрицу трансформации (повороты и сжатие графика) и должна вызываться первой для создания "подграфика". Место для осей/colorbar резервируется если строка @var{stl} содержит: @samp{L} или @samp{<} -- с левого края, @samp{R} или @samp{>} -- с правого края, @samp{A} или @samp{^} -- с верхнего края, @samp{U} или @samp{_} -- с нижнего края.
+Помещает последующий вывод в прямоугольник из @var{dx}*@var{dy} ячеек, начиная с @var{m}-ой ячейки, сетки размером @var{nx}*@var{ny} от всего рисунка. Функция сбрасывает матрицу трансформации (повороты и сжатие графика) и должна вызываться первой для создания "подграфика". Дополнительное место для осей/colorbar резервируется если строка @var{stl} содержит:
+@itemize @bullet
+@item
+@samp{L} или @samp{<} -- с левого края,
+@item
+@samp{R} или @samp{>} -- с правого края,
+@item
+@samp{A} или @samp{^} -- с верхнего края,
+@item
+@samp{U} или @samp{_} -- с нижнего края,
+@item
+@samp{#} -- место резервироваться не будет -- оси координат будут занимать все доступное пространство.
+@end itemize
+Область вывода может быть дополнительно сдвинута относительно своего обычного положения на относительный размер @var{sx}, @var{sy}.
 @end deftypefn
 
 @anchor{inplot}
@@ -1014,7 +1092,7 @@ Ternary -- специальный тип графика для 3 зависим
 @deftypefnx {Функция С} @code{void} mgl_gridplot (@code{HMGL} gr, @code{int} nx, @code{int} ny, @code{int} ind)
 @deftypefnx {Функция С} @code{void} mgl_gridplot_d (@code{HMGL} gr, @code{int} nx, @code{int} ny, @code{int} ind, @code{mreal} d)
 @end ifclear
\9fомеÑ\89аеÑ\82 Ð¿Ð¾Ñ\81ледÑ\83Ñ\8eÑ\89ий Ð²Ñ\8bвод Ð² @var{ind}-Ñ\83Ñ\8e Ñ\8fÑ\87ейкÑ\83 Ñ\82аблиÑ\86Ñ\8b @var{nx}*@var{ny}. Ð\9fоложение Ñ\8fÑ\87ейки Ð²Ñ\8bбиÑ\80аеÑ\82Ñ\81Ñ\8f Ð¾Ñ\82ноÑ\81иÑ\82елÑ\8cно Ð¿Ð¾Ñ\81леднего Ð²Ñ\8bзова @ref{subplot} (или @ref{inplot} Ñ\81 @var{rel}=@code{false}). Ð\9fаÑ\80амеÑ\82Ñ\80 @var{d} Ð·Ð°Ð´Ð°ÐµÑ\82 Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ\82елÑ\8cнÑ\8bй Ð·Ð°Ð·Ð¾Ñ\80 Ð¼ÐµÐ¶Ð´Ñ\83 Ñ\81Ñ\82Ñ\80ок.
\9fомеÑ\89аеÑ\82 Ð¿Ð¾Ñ\81ледÑ\83Ñ\8eÑ\89ий Ð²Ñ\8bвод Ð² @var{ind}-Ñ\83Ñ\8e Ñ\8fÑ\87ейкÑ\83 Ñ\82аблиÑ\86Ñ\8b @var{nx}*@var{ny}. Ð\9fоложение Ñ\8fÑ\87ейки Ð²Ñ\8bбиÑ\80аеÑ\82Ñ\81Ñ\8f Ð¾Ñ\82ноÑ\81иÑ\82елÑ\8cно Ð¿Ð¾Ñ\81леднего Ð²Ñ\8bзова @ref{subplot} (или @ref{inplot} Ñ\81 @var{rel}=@code{false}). Ð\9fаÑ\80амеÑ\82Ñ\80 @var{d} Ð·Ð°Ð´Ð°ÐµÑ\82 Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ\82елÑ\8cнÑ\8bй Ð·Ð°Ð·Ð¾Ñ\80 Ð¼ÐµÐ¶Ð´Ñ\83 Ñ\8fÑ\87еек.
 @end deftypefn
 
 @anchor{stickplot}
@@ -1026,6 +1104,15 @@ Ternary -- специальный тип графика для 3 зависим
 Помещает последующий вывод в @var{ind}-ую ячейку "бруска" из @var{num} ячеек. При этом сам брусок повернут на углы @var{tet}, @var{phi}. Положение выбирается относительно последнего вызова  @ref{subplot} (или @ref{inplot} с @var{rel}=@code{false}).
 @end deftypefn
 
+@anchor{shearplot}
+@deftypefn {Команда MGL} {} shearplot @code{num ind sx sy [xd yd]}
+@ifclear UDAV
+@deftypefnx {Метод класса @code{mglGraph}} @code{void} ShearPlot (@code{int} num, @code{int} ind, @code{mreal} sx, @code{mreal} sy, @code{mreal} xd=@code{1}, @code{mreal} yd=@code{0})
+@deftypefnx {Функция С} @code{void} mgl_shearplot (@code{HMGL} gr, @code{int} num, @code{int} ind, @code{mreal} sx, @code{mreal} sy, @code{mreal} xd, @code{mreal} yd)
+@end ifclear
+Помещает последующий вывод в @var{ind}-ую ячейку "бруска" из @var{num} ячеек. При этом сама ячейка скошена на @var{sx}, @var{sy}. Направление бруска задается переменными @var{xd} и @var{yd}. Положение выбирается относительно последнего вызова  @ref{subplot} (или @ref{inplot} с @var{rel}=@code{false}).
+@end deftypefn
+
 @anchor{title}
 @deftypefn {Команда MGL} {} title 'title' ['stl'='' @code{size=-2}]
 @ifclear UDAV
@@ -1054,6 +1141,17 @@ Ternary -- специальный тип графика для 3 зависим
 Вращает систему координат относительно вектора @{@var{x}, @var{y}, @var{z}@} на угол @var{Tet}.
 @end deftypefn
 
+
+@anchor{shear}
+@deftypefn {Команда MGL} {} shear @code{sx sy}
+@ifclear UDAV
+@deftypefnx {Метод класса @code{mglGraph}} @code{void} Shear (@code{mreal} sx, @code{mreal} sy)
+@deftypefnx {Функция С} @code{void} mgl_shear (@code{HMGL} gr, @code{mreal} sx, @code{mreal} sy)
+@end ifclear
+Сдвигает (скашивает) систему координат на значения @var{sx}, @var{sy}.
+@end deftypefn
+
+
 @anchor{aspect}
 @deftypefn {Команда MGL} {} aspect @code{ax ay [az=1]}
 @ifclear UDAV
@@ -1132,12 +1230,14 @@ Ternary -- специальный тип графика для 3 зависим
 @end deftypefn
 
 
+@anchor{setsizescl}
+@deftypefn {Команда MGL} {} setsizescl @code{factor}
 @ifclear UDAV
-@deftypefn {Метод класса @code{mglGraph}} @code{void} SetSizeScl (@code{double} factor)
+@deftypefnx {Метод класса @code{mglGraph}} @code{void} SetSizeScl (@code{double} factor)
 @deftypefnx {Функция С} @code{void} mgl_set_size_scl (@code{HMGL} gr, @code{double} factor)
+@end ifclear
 Задает множитель для высоты и ширины во всех последующих вызовах @ref{setsize}.
 @end deftypefn
-@end ifclear
 
 
 @anchor{quality}
@@ -1208,6 +1308,15 @@ Ternary -- специальный тип графика для 3 зависим
 Экспортирует текущий кадр в файл @var{fname} с типом, определяемым по расширению. Параметр @var{descr} добавляет описание (может быть пустым). Если @var{fname} пустой, то используется имя @samp{frame####.jpg}, где @samp{####} -- текущий номер кадра и имя @samp{frame} определяется переменной @ref{plotid}.
 @end deftypefn
 
+@anchor{bbox}
+@deftypefn {Команда MGL} {} bbox x1 y1 [x2=@code{-1} y2=@code{-1}]
+@ifclear UDAV
+@deftypefnx {Метод класса @code{mglGraph}} @code{void} SetBBox (@code{int} x1=@code{0}, @code{int} y1=@code{0}, @code{int} x2=@code{-1}, @code{int} y2=@code{-1})
+@deftypefnx {Функция С} @code{void} mgl_set_bbox (@code{HMGL} gr, @code{int} x1, @code{int} y1, @code{int} x2, @code{int} y2)
+@end ifclear
+Задает область изображения, которая будет сохранена в файл 2D формата. Если @var{x2}<0 (@var{y2}<0), то исходная ширина (высота) рисунка будет использована. Если @var{x1}<0 или @var{y1}<0 или @var{x1}>=@var{x2}|Width или @var{y1}>=@var{y2}|Height, то обрезания рисунка не будет.
+@end deftypefn
+
 @ifclear UDAV
 
 @deftypefn {Метод класса @code{mglGraph}} @code{void} WritePNG (@code{const char *}fname, @code{const char *}descr=@code{""}, @code{int} compr=@code{""}, @code{bool} alpha=@code{true})
@@ -1522,6 +1631,7 @@ These functions change background image.
 
 @anchor{clf}
 @deftypefn {Команда MGL} {} clf ['col']
+@deftypefnx {Команда MGL} {} clf r g b
 @ifclear UDAV
 @deftypefnx {Метод класса @code{mglGraph}} @code{void} Clf ()
 @deftypefnx {Метод класса @code{mglGraph}} @code{void} Clf (@code{const char *} col)
@@ -1708,7 +1818,7 @@ These functions change background image.
 @deftypefnx {Метод класса @code{mglGraph}} @code{void} Ellipse (@code{mglPoint} p1, @code{mglPoint} p2, @code{mreal} r, @code{const char *}col=@code{"r"})
 @deftypefnx {Функция С} @code{void} mgl_ellipse (@code{HMGL} gr, @code{mreal} x1, @code{mreal} y1, @code{mreal} z1, @code{mreal} x2, @code{mreal} y2, @code{mreal} z2, @code{mreal} r, @code{const char *}col)
 @end ifclear
-Рисует круг радиуса @var{r} с фокусами в точках @var{p1}, @var{p2} цветом @var{stl}. Если @var{col} содержит: @samp{#} то рисуется только граница, @samp{@@} то рисуется граница (вторым цветом из @var{col} или черными).
+Рисует эллипс радиуса @var{r} с фокусами в точках @var{p1}, @var{p2} цветом @var{stl}. Если @var{col} содержит: @samp{#} то рисуется только граница, @samp{@@} то рисуется граница (вторым цветом из @var{col} или черными).
 @end deftypefn
 
 @anchor{rhomb}
@@ -1756,6 +1866,37 @@ These functions change background image.
 Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command options}. Bitmap can be loaded from file or specified as RGBA values for pixels. Parameter @var{smooth} set to draw bitmap without or with color interpolation.
 @end deftypefn
 
+
+
+@anchor{symbol}
+@deftypefn {Команда MGL} {} symbol @code{x y} 'id' ['fnt'='' @code{size=-1}]
+@deftypefnx {Команда MGL} {} symbol @code{x y z} 'id' ['fnt'='' @code{size=-1}]
+@ifclear UDAV
+@deftypefnx {Метод класса @code{mglGraph}} @code{void} Symbol (@code{mglPoint} p, @code{char} id, @code{const char *}fnt=@code{""}, @code{mreal} size=@code{-1})
+@deftypefnx {Функция С} @code{void} mgl_symbol (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{mreal} z, @code{char} id, @code{const char *}fnt, @code{mreal} size)
+@end ifclear
+Рисует определенный пользователем символ с именем @var{id} в точке @var{p} стилем @var{fnt}. Размер задается параметром @var{size} (по умолчанию @code{-1}). Строка @var{fnt}  может содержать цвет (до разделителя @samp{:}); стили @samp{a} или @samp{A} для вывода в абсолютной позиции (@{@var{x}, @var{y}@} полагаются в диапазоне [0,1]) относительно рисунка (для @samp{A}) или subplot/inplot (для @samp{a}); и стиль @samp{w} для рисования только контура символа.
+@end deftypefn
+
+@deftypefn {Команда MGL} {} symbol @code{x y dx dy} 'id' ['fnt'=':L' @code{size=-1}]
+@deftypefnx {Команда MGL} {} symbol @code{x y z dx dy dz} 'id' ['fnt'=':L' @code{size=-1}]
+@ifclear UDAV
+@deftypefnx {Метод класса @code{mglGraph}} @code{void} Symbol (@code{mglPoint} p, @code{mglPoint} d, @code{char} id, @code{const char *}fnt=@code{""}, @code{mreal} size=@code{-1})
+@deftypefnx {Функция С} @code{void} mgl_symbol_dir (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{mreal} z, @code{mreal} dx, @code{mreal} dy, @code{mreal} dz, @code{const char *}text, @code{const char *}fnt, @code{mreal} size)
+@end ifclear
+Аналогично предыдущему, но символ рисуется в повернутым в направлении @var{d}.
+@end deftypefn
+
+@anchor{addsymbol}
+@deftypefn {Команда MGL} {} addsymbol 'id' xdat ydat
+@ifclear UDAV
+@deftypefnx {Метод класса @code{mglGraph}} @code{void} DefineSymbol (@code{char} id, @code{const mglDataA &}xdat, @code{const mglDataA &}ydat)
+@deftypefnx {Функция С} @code{void} mgl_define_symbol (@code{HMGL} gr, @code{HCDT} xdat, @code{HCDT} ydat)
+@end ifclear
+Добавляет определенный пользователем символ с именем @var{id} и границей @{@var{xdat}, @var{ydat}@}. Значения @code{NAN} задают разрыв (скачок) граничной кривой.
+@end deftypefn
+
+
 @c ##################################################################
 @external{}
 @node Text printing, Axis and Colorbar, Primitives, MathGL core
@@ -1856,6 +1997,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @item @samp{!} для отключения улучшения вида меток (см. @ref{tuneticks});
 @item @samp{AKDTVISO} для вывода стрелки на конце оси;
 @item @samp{a} для принудительной автоматической расстановки меток;
+@item @samp{:} для рисования линий через точку (0,0,0);
 @item @samp{f} для вывода чисел в фиксированном формате;
 @item @samp{E} для вывода @samp{E} вместо @samp{e};
 @item @samp{F} для вывода в формате LaTeX;
@@ -1927,7 +2069,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefn {Команда MGL} {} box ['stl'='k' @code{ticks=on}]
 @ifclear UDAV
 @deftypefnx {Метод класса @code{mglGraph}} @code{void} Box (@code{const char *}col=@code{""}, @code{bool} ticks=@code{true})
-@deftypefnx {Функция С} @code{void} mgl_box (@code{HMGL} gr, @code{int} ticks)
+@deftypefnx {Функция С} @code{void} mgl_box (@code{HMGL} gr)
 @deftypefnx {Функция С} @code{void} mgl_box_str (@code{HMGL} gr, @code{const char *}col, @code{int} ticks)
 @end ifclear
 Рисует ограничивающий параллелепипед цветом @var{col}. Если @var{col} содержит @samp{@@}, то рисуются закрашенные задние грани. При этом первый цвет используется для граней (по умолчанию светло жёлтый), а последний для рёбер и меток.
@@ -1961,7 +2103,22 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @cindex SetLegendBox
 @cindex SetLegendMarks
 
-Эти функции обеспечивают рисование легенды графика (полезно для @ref{1D plotting}). Запись в легенде состоит из двух строк: одна для стиля линии и маркеров, другая с текстом описания (с включенным разбором TeX-их команд). Можно использовать непосредственно массивы строк, или накопление во внутренние массивы с помощью функции AddLegend() с последующим отображением. Положение легенды можно задать автоматически или вручную. Параметры @var{fnt} и @var{size} задают стиль и размер шрифта (см. @ref{Font settings}). Параметр @var{llen} задает относительную ширину примера линии. Ели стиль линии пустой, то соответствующий текст печатается без отступа. Если строка @var{fnt} содержит символ @samp{A}, то координаты легенды считаются относительно картинки (а не текущего subplot). Если строка @var{fnt} содержит символ @samp{^}, то легенда располагается снаружи от указанных координат. Если строка @var{fnt} содержит символ @samp{#}, то рисуется прямоугольник вокруг легенды. @sref{Legend sample}
+Эти функции обеспечивают рисование легенды графика (полезно для @ref{1D plotting}). Запись в легенде состоит из двух строк: одна для стиля линии и маркеров, другая с текстом описания (с включенным разбором TeX-их команд). Можно использовать непосредственно массивы строк, или накопление во внутренние массивы с помощью функции AddLegend() с последующим отображением. Положение легенды можно задать автоматически или вручную. Параметры @var{fnt} и @var{size} задают стиль и размер шрифта (см. @ref{Font settings}). Опция @code{value} задает зазор между примером линии и текстом (по умолчанию 0.1). Опция @code{size} задает размер текста. Если стиль линии пустой, то соответствующий текст печатается без отступа. Строка @var{fnt} может содержать:
+@itemize @bullet
+@item
+стиль текста для записей;
+@item
+@samp{A} для расположения относительно всего рисунка, а не текущего subplot;
+@item
+@samp{^} для размещения снаружи от указанных координат;
+@item
+@samp{#} для вывода прямоугольника вокруг легенды;
+@item
+@samp{-} для горизонтального расположения записей;
+@item
+цвета для заливки (1-ый), для границы (2-ой) и для текста записей (3-ий). Если указано меньше трех цветов, то цвет границы черный (для 2 и менее цветов), и цвет заливки белый (для 1 и менее цвета).
+@end itemize
+@sref{Legend sample}
 
 @anchor{legend}
 @deftypefn {Команда MGL} {} legend [@code{pos=3} 'fnt'='#']
@@ -1969,7 +2126,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Метод класса @code{mglGraph}} @code{void} Legend (@code{int} pos=@code{0x3}, @code{const char *}fnt=@code{"#"}, @code{const char *}opt=@code{""})
 @deftypefnx {Функция С} @code{void} mgl_legend (@code{HMGL} gr, @code{int} pos, @code{const char *}fnt, @code{const char *}opt)
 @end ifclear
-Рисует легенду из накопленных записей шрифтом @var{fnt} размером @var{size}. Параметр @var{pos} задает положение легенды: @samp{0} -- в нижнем левом углу, @samp{1} -- нижнем правом углу, @samp{2} -- верхнем левом углу, @samp{3} -- верхнем правом углу (по умолчанию). Строка @var{fnt} может содержать вет для прямоугольника (1-ый цвет), для его границы (2-ой цвет) и для текста (последний). Если указано менее 3 цветов, то цвет рёбер будет чёрным (2 и менее цвета), а цвет прямоугольника белым (1 и менее цвета). Прямоугольник рисуется если строка @var{fnt} содержит @samp{#}. Если строка @var{fnt} содержит @samp{-}, то записи располагаются горизонтально. Опция @code{value} задает зазор между примером линии и текстом (по умолчанию 0.1).
+Рисует легенду из накопленных записей шрифтом @var{fnt}. Параметр @var{pos} задает положение легенды: @samp{0} -- в нижнем левом углу, @samp{1} -- нижнем правом углу, @samp{2} -- верхнем левом углу, @samp{3} -- верхнем правом углу (по умолчанию). Опция @code{value} задает зазор между примером линии и текстом (по умолчанию 0.1).
 @end deftypefn
 
 @deftypefn {Команда MGL} {} legend @code{x y} ['fnt'='#']
@@ -1977,7 +2134,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Метод класса @code{mglGraph}} @code{void} Legend (@code{mreal} x, @code{mreal} y, @code{const char *}fnt=@code{"#"}, @code{const char *}opt=@code{""})
 @deftypefnx {Функция С} @code{void} mgl_legend_pos (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{const char *}fnt, @code{const char *}opt)
 @end ifclear
-Рисует легенду из накопленных записей шрифтом @var{fnt} размером @var{size}. Положение легенды задается параметрами @var{x}, @var{y}, которые полагаются нормированными в диапазоне [0,1]. Опция @code{value} задает зазор между примером линии и текстом (по умолчанию 0.1).
+Рисует легенду из накопленных записей шрифтом @var{fnt}. Положение легенды задается параметрами @var{x}, @var{y}, которые полагаются нормированными в диапазоне [0,1]. Опция @code{value} задает зазор между примером линии и текстом (по умолчанию 0.1).
 @end deftypefn
 
 @anchor{addlegend}
@@ -2051,7 +2208,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_plot_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_plot_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}pen, @code{const char *}opt)
 @end ifclear
-ФÑ\83нкÑ\86ии Ñ\80иÑ\81Ñ\83Ñ\8eÑ\82 Ð»Ð¾Ð¼Ð°Ð½Ð½Ñ\83Ñ\8e Ð»Ð¸Ð½Ð¸Ñ\8e Ð¿Ð¾ Ñ\82оÑ\87кам @{@var{x}[i], @var{y}[i], @var{z}[i]@}. Ð¡Ð¼. Ñ\82акже @ref{area}, @ref{step}, @ref{stem}, @ref{tube}, @ref{mark}, @ref{error}, @ref{belt}, @ref{tens}, @ref{tape}. @sref{Plot sample}
+ФÑ\83нкÑ\86ии Ñ\80иÑ\81Ñ\83Ñ\8eÑ\82 Ð»Ð¾Ð¼Ð°Ð½Ð½Ñ\83Ñ\8e Ð»Ð¸Ð½Ð¸Ñ\8e Ð¿Ð¾ Ñ\82оÑ\87кам @{@var{x}[i], @var{y}[i], @var{z}[i]@}. Ð\95Ñ\81ли @var{pen} Ñ\81одеÑ\80жиÑ\82 @samp{a}, Ñ\82о Ñ\80иÑ\81Ñ\83Ñ\8eÑ\82Ñ\81Ñ\8f Ð¸ Ñ\81егменÑ\82Ñ\8b Ð¼ÐµÐ¶Ð´Ñ\83 Ñ\82оÑ\87ками Ð²Ð½Ðµ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð° Ð¾Ñ\81ей ÐºÐ¾Ð¾Ñ\80динаÑ\82. Ð\95Ñ\81ли @var{pen} Ñ\81одеÑ\80жиÑ\82 @samp{~}, Ñ\82о Ñ\87иÑ\81ло Ñ\81егменÑ\82ов Ñ\83менÑ\8cÑ\88аеÑ\82Ñ\81Ñ\8f Ð´Ð»Ñ\8f ÐºÐ²Ð°Ð·Ð¸-линейнÑ\8bÑ\85 Ñ\83Ñ\87аÑ\81Ñ\82ков. Ð¡Ð¼. Ñ\82акже @ref{area}, @ref{step}, @ref{stem}, @ref{tube}, @ref{mark}, @ref{error}, @ref{belt}, @ref{tens}, @ref{tape}, @ref{meshnum}. @sref{Plot sample}
 @end deftypefn
 
 @anchor{radar}
@@ -2060,7 +2217,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Метод класса @code{mglGraph}} @code{void} Radar (@code{const mglDataA &}a, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""})
 @deftypefnx {Функция С} @code{void} mgl_radar (@code{HMGL} gr, @code{HCDT} a, @code{const char *}pen, @code{const char *}opt)
 @end ifclear
-ФÑ\83нкÑ\86ии Ñ\80иÑ\81Ñ\83Ñ\8eÑ\82 radar chart, Ð¿Ñ\80едÑ\81Ñ\82авлÑ\8fÑ\8eÑ\89ий Ñ\81обой Ð»Ð¾Ð¼Ð°Ð½Ð½Ñ\83Ñ\8e Ñ\81 Ð²ÐµÑ\80Ñ\88инами Ð½Ð° Ñ\80адиалÑ\8cнÑ\8bÑ\85 Ð»Ð¸Ð½Ð¸Ñ\8fÑ\85 (Ñ\82ипа Ð»Ð¾Ð¼Ð°Ð½Ð½Ð¾Ð¹ Ð² Ð¿Ð¾Ð»Ñ\8fÑ\80нÑ\8bÑ\85 ÐºÐ¾Ð¾Ñ\80динаÑ\82аÑ\85). Ð\9fаÑ\80амеÑ\82Ñ\80 @code{value} Ð² Ð¾Ð¿Ñ\86иÑ\8fÑ\85 @var{opt} Ð·Ð°Ð´Ð°ÐµÑ\82 Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ\82елÑ\8cнÑ\8bй Ñ\81двиг Ð´Ð°Ð½Ð½Ñ\8bÑ\85 (Ñ\82.е. Ð¸Ñ\81полÑ\8cзование @var{a}+@code{value} Ð²Ð¼ÐµÑ\81Ñ\82о @var{a}). Ð\95Ñ\81ли @var{pen} Ñ\81одеÑ\80жиÑ\82 @samp{#}, Ñ\82о Ñ\80иÑ\81Ñ\83еÑ\82Ñ\81Ñ\8f "Ñ\81еÑ\82ка" (Ñ\80адиалÑ\8cнÑ\8bе Ð»Ð¸Ð½Ð¸Ð¸). Ð¡Ð¼. Ñ\82акже @ref{plot}. @sref{Radar sample}
+ФÑ\83нкÑ\86ии Ñ\80иÑ\81Ñ\83Ñ\8eÑ\82 radar chart, Ð¿Ñ\80едÑ\81Ñ\82авлÑ\8fÑ\8eÑ\89ий Ñ\81обой Ð»Ð¾Ð¼Ð°Ð½Ð½Ñ\83Ñ\8e Ñ\81 Ð²ÐµÑ\80Ñ\88инами Ð½Ð° Ñ\80адиалÑ\8cнÑ\8bÑ\85 Ð»Ð¸Ð½Ð¸Ñ\8fÑ\85 (Ñ\82ипа Ð»Ð¾Ð¼Ð°Ð½Ð½Ð¾Ð¹ Ð² Ð¿Ð¾Ð»Ñ\8fÑ\80нÑ\8bÑ\85 ÐºÐ¾Ð¾Ñ\80динаÑ\82аÑ\85). Ð\9fаÑ\80амеÑ\82Ñ\80 @code{value} Ð² Ð¾Ð¿Ñ\86иÑ\8fÑ\85 @var{opt} Ð·Ð°Ð´Ð°ÐµÑ\82 Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ\82елÑ\8cнÑ\8bй Ñ\81двиг Ð´Ð°Ð½Ð½Ñ\8bÑ\85 (Ñ\82.е. Ð¸Ñ\81полÑ\8cзование @var{a}+@code{value} Ð²Ð¼ÐµÑ\81Ñ\82о @var{a}). Ð\95Ñ\81ли @var{pen} Ñ\81одеÑ\80жиÑ\82 @samp{#}, Ñ\82о Ñ\80иÑ\81Ñ\83еÑ\82Ñ\81Ñ\8f "Ñ\81еÑ\82ка" (Ñ\80адиалÑ\8cнÑ\8bе Ð»Ð¸Ð½Ð¸Ð¸). Ð\95Ñ\81ли @var{pen} Ñ\81одеÑ\80жиÑ\82 @samp{a}, Ñ\82о Ñ\80иÑ\81Ñ\83Ñ\8eÑ\82Ñ\81Ñ\8f Ð¸ Ñ\81егменÑ\82Ñ\8b Ð¼ÐµÐ¶Ð´Ñ\83 Ñ\82оÑ\87ками Ð²Ð½Ðµ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð° Ð¾Ñ\81ей ÐºÐ¾Ð¾Ñ\80динаÑ\82. Ð¡Ð¼. Ñ\82акже @ref{plot}, @ref{meshnum}. @sref{Radar sample}
 @end deftypefn
 
 @anchor{step}
@@ -2075,7 +2232,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_step_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_step_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}pen, @code{const char *}opt)
 @end ifclear
-ФÑ\83нкÑ\86ии Ñ\80иÑ\81Ñ\83Ñ\8eÑ\82 Ñ\81Ñ\82Ñ\83пенÑ\8cки Ð´Ð»Ñ\8f Ñ\82оÑ\87ек Ð¼Ð°Ñ\81Ñ\81ива. Ð¡Ð¼. Ñ\82акже @ref{plot}, @ref{stem}, @ref{tile}, @ref{boxs}. @sref{Step sample}
+ФÑ\83нкÑ\86ии Ñ\80иÑ\81Ñ\83Ñ\8eÑ\82 Ñ\81Ñ\82Ñ\83пенÑ\8cки Ð´Ð»Ñ\8f Ñ\82оÑ\87ек Ð¼Ð°Ñ\81Ñ\81ива. Ð\95Ñ\81ли @var{x}.nx>@var{y}.nx, Ñ\82о Ð¼Ð°Ñ\81Ñ\81ив @var{x} Ð·Ð°Ð´Ð°ÐµÑ\82 Ð³Ñ\80аниÑ\86Ñ\8b Ñ\81Ñ\82Ñ\83пенек, Ð° Ð½Ðµ Ð¸Ñ\85 ÐºÐ¾Ð½ÐµÑ\86. Ð¡Ð¼. Ñ\82акже @ref{plot}, @ref{stem}, @ref{tile}, @ref{boxs}, @ref{meshnum}. @sref{Step sample}
 @end deftypefn
 
 @anchor{tens}
@@ -2090,7 +2247,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_tens_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} c, @code{const char *}pen, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_tens_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{const char *}pen, @code{const char *}opt)
 @end ifclear
-ФÑ\83нкÑ\86ии Ñ\80иÑ\81Ñ\83Ñ\8eÑ\82 Ð»Ð¾Ð¼Ð°Ð½Ð½Ñ\83Ñ\8e Ð»Ð¸Ð½Ð¸Ñ\8e Ð¿Ð¾ Ñ\82оÑ\87кам Ñ\81 Ñ\86веÑ\82ом, Ð¾Ð¿Ñ\80еделÑ\8fемÑ\8bм Ð¼Ð°Ñ\81Ñ\81ивом @var{c} (Ñ\82ипа Ð³Ñ\80аÑ\84ика Ð½Ð°Ñ\82Ñ\8fжений). Ð¡Ñ\82Ñ\80ока @var{pen} Ð·Ð°Ð´Ð°ÐµÑ\82 Ñ\86веÑ\82овÑ\83Ñ\8e Ñ\81Ñ\85емÑ\83 (Ñ\81м. @ref{Color scheme}) Ð¸ Ñ\81Ñ\82илÑ\8c Ð»Ð¸Ð½Ð¸Ð¹ Ð¸/или Ð¼Ð°Ñ\80кеÑ\80ов (Ñ\81м. @ref{Line styles}). Ð¡Ð¼. Ñ\82акже @ref{plot}, @ref{mesh}, @ref{fall}. @sref{Tens sample}
+ФÑ\83нкÑ\86ии Ñ\80иÑ\81Ñ\83Ñ\8eÑ\82 Ð»Ð¾Ð¼Ð°Ð½Ð½Ñ\83Ñ\8e Ð»Ð¸Ð½Ð¸Ñ\8e Ð¿Ð¾ Ñ\82оÑ\87кам Ñ\81 Ñ\86веÑ\82ом, Ð¾Ð¿Ñ\80еделÑ\8fемÑ\8bм Ð¼Ð°Ñ\81Ñ\81ивом @var{c} (Ñ\82ипа Ð³Ñ\80аÑ\84ика Ð½Ð°Ñ\82Ñ\8fжений). Ð¡Ñ\82Ñ\80ока @var{pen} Ð·Ð°Ð´Ð°ÐµÑ\82 Ñ\86веÑ\82овÑ\83Ñ\8e Ñ\81Ñ\85емÑ\83 (Ñ\81м. @ref{Color scheme}) Ð¸ Ñ\81Ñ\82илÑ\8c Ð»Ð¸Ð½Ð¸Ð¹ Ð¸/или Ð¼Ð°Ñ\80кеÑ\80ов (Ñ\81м. @ref{Line styles}). Ð\95Ñ\81ли @var{pen} Ñ\81одеÑ\80жиÑ\82 @samp{a}, Ñ\82о Ñ\80иÑ\81Ñ\83Ñ\8eÑ\82Ñ\81Ñ\8f Ð¸ Ñ\81егменÑ\82Ñ\8b Ð¼ÐµÐ¶Ð´Ñ\83 Ñ\82оÑ\87ками Ð²Ð½Ðµ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð° Ð¾Ñ\81ей ÐºÐ¾Ð¾Ñ\80динаÑ\82. Ð\95Ñ\81ли @var{pen} Ñ\81одеÑ\80жиÑ\82 @samp{~}, Ñ\82о Ñ\87иÑ\81ло Ñ\81егменÑ\82ов Ñ\83менÑ\8cÑ\88аеÑ\82Ñ\81Ñ\8f Ð´Ð»Ñ\8f ÐºÐ²Ð°Ð·Ð¸-линейнÑ\8bÑ\85 Ñ\83Ñ\87аÑ\81Ñ\82ков. Ð¡Ð¼. Ñ\82акже @ref{plot}, @ref{mesh}, @ref{fall}, @ref{meshnum}. @sref{Tens sample}
 @end deftypefn
 
 @anchor{tape}
@@ -2120,7 +2277,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_area_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_area_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}pen, @code{const char *}opt)
 @end ifclear
-Функции рисуют ломанную линию между точками и закрашивает её вниз до плоскости осей координат. Градиентная заливка используется если число цветов равно удвоенному число кривых. См. также @ref{plot}, @ref{bars}, @ref{stem}, @ref{region}. @sref{Area sample}
+ФÑ\83нкÑ\86ии Ñ\80иÑ\81Ñ\83Ñ\8eÑ\82 Ð»Ð¾Ð¼Ð°Ð½Ð½Ñ\83Ñ\8e Ð»Ð¸Ð½Ð¸Ñ\8e Ð¼ÐµÐ¶Ð´Ñ\83 Ñ\82оÑ\87ками Ð¸ Ð·Ð°ÐºÑ\80аÑ\88иваеÑ\82 ÐµÑ\91 Ð²Ð½Ð¸Ð· Ð´Ð¾ Ð¿Ð»Ð¾Ñ\81коÑ\81Ñ\82и Ð¾Ñ\81ей ÐºÐ¾Ð¾Ñ\80динаÑ\82. Ð\93Ñ\80адиенÑ\82наÑ\8f Ð·Ð°Ð»Ð¸Ð²ÐºÐ° Ð¸Ñ\81полÑ\8cзÑ\83еÑ\82Ñ\81Ñ\8f ÐµÑ\81ли Ñ\87иÑ\81ло Ñ\86веÑ\82ов Ñ\80авно Ñ\83двоенномÑ\83 Ñ\87иÑ\81ло ÐºÑ\80ивÑ\8bÑ\85. Ð\95Ñ\81ли @var{pen} Ñ\81одеÑ\80жиÑ\82 @samp{#}, Ñ\82о Ñ\80иÑ\81Ñ\83еÑ\82Ñ\81Ñ\8f Ñ\82олÑ\8cко ÐºÐ°Ñ\80каÑ\81. Ð\95Ñ\81ли @var{pen} Ñ\81одеÑ\80жиÑ\82 @samp{a}, Ñ\82о Ñ\80иÑ\81Ñ\83Ñ\8eÑ\82Ñ\81Ñ\8f Ð¸ Ñ\81егменÑ\82Ñ\8b Ð¼ÐµÐ¶Ð´Ñ\83 Ñ\82оÑ\87ками Ð²Ð½Ðµ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð° Ð¾Ñ\81ей ÐºÐ¾Ð¾Ñ\80динаÑ\82. Ð¡Ð¼. Ñ\82акже @ref{plot}, @ref{bars}, @ref{stem}, @ref{region}. @sref{Area sample}
 @end deftypefn
 
 @anchor{region}
@@ -2137,7 +2294,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_region_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y1, @code{HCDT} y2, @code{const char *}pen, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_region_3d (@code{HMGL} gr, @code{HCDT} x1, @code{HCDT} y1, @code{HCDT} z1, @code{HCDT} x2, @code{HCDT} y2, @code{HCDT} z2, @code{const char *}pen, @code{const char *}opt)
 @end ifclear
-Функции закрашивают область между 2 кривыми. Градиентная заливка используется если число цветов равно удвоенному число кривых. Если в 2d версии @var{pen} содержит @samp{i}, то закрашивается только область y1<y<y2, в противном случае будет закрашена и область y2<y<y1. См. также @ref{area}, @ref{bars}, @ref{stem}. @sref{Region sample}
+ФÑ\83нкÑ\86ии Ð·Ð°ÐºÑ\80аÑ\88иваÑ\8eÑ\82 Ð¾Ð±Ð»Ð°Ñ\81Ñ\82Ñ\8c Ð¼ÐµÐ¶Ð´Ñ\83 2 ÐºÑ\80ивÑ\8bми. Ð\93Ñ\80адиенÑ\82наÑ\8f Ð·Ð°Ð»Ð¸Ð²ÐºÐ° Ð¸Ñ\81полÑ\8cзÑ\83еÑ\82Ñ\81Ñ\8f ÐµÑ\81ли Ñ\87иÑ\81ло Ñ\86веÑ\82ов Ñ\80авно Ñ\83двоенномÑ\83 Ñ\87иÑ\81ло ÐºÑ\80ивÑ\8bÑ\85. Ð\95Ñ\81ли Ð² 2d Ð²ÐµÑ\80Ñ\81ии @var{pen} Ñ\81одеÑ\80жиÑ\82 @samp{i}, Ñ\82о Ð·Ð°ÐºÑ\80аÑ\88иваеÑ\82Ñ\81Ñ\8f Ñ\82олÑ\8cко Ð¾Ð±Ð»Ð°Ñ\81Ñ\82Ñ\8c y1<y<y2, Ð² Ð¿Ñ\80оÑ\82ивном Ñ\81лÑ\83Ñ\87ае Ð±Ñ\83деÑ\82 Ð·Ð°ÐºÑ\80аÑ\88ена Ð¸ Ð¾Ð±Ð»Ð°Ñ\81Ñ\82Ñ\8c y2<y<y1. Ð\95Ñ\81ли @var{pen} Ñ\81одеÑ\80жиÑ\82 @samp{#}, Ñ\82о Ñ\80иÑ\81Ñ\83еÑ\82Ñ\81Ñ\8f Ñ\82олÑ\8cко ÐºÐ°Ñ\80каÑ\81. Ð\95Ñ\81ли @var{pen} Ñ\81одеÑ\80жиÑ\82 @samp{a}, Ñ\82о Ñ\80иÑ\81Ñ\83Ñ\8eÑ\82Ñ\81Ñ\8f Ð¸ Ñ\81егменÑ\82Ñ\8b Ð¼ÐµÐ¶Ð´Ñ\83 Ñ\82оÑ\87ками Ð²Ð½Ðµ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð° Ð¾Ñ\81ей ÐºÐ¾Ð¾Ñ\80динаÑ\82. Ð¡Ð¼. Ñ\82акже @ref{area}, @ref{bars}, @ref{stem}. @sref{Region sample}
 @end deftypefn
 
 @anchor{stem}
@@ -2167,7 +2324,18 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_bars_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_bars_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}pen, @code{const char *}opt)
 @end ifclear
-Функции рисуют вертикальные полосы (прямоугольники) из точек до плоскости осей координат. Если строка @var{pen} содержит символ @samp{a}, то линии рисуются одна поверх другой. Если строка содержит символ @samp{f}, то рисуется график типа waterfall для определения кумулятивного эффекта последовательности положительных и отрицательных значений. Можно использовать разные цвета для положительных и отрицательных значений если число указанных цветов равно удвоенному числу кривых для построения. Если @var{pen} содержит @samp{<}, @samp{^} или @samp{>}, то полоски будут выровнены влево, вправо или центрированы относительно их координат. См. также @ref{barh}, @ref{cones}, @ref{area}, @ref{stem}, @ref{chart}, @ref{barwidth}. @sref{Bars sample}
+Функции рисуют вертикальные полосы (прямоугольники) из точек до плоскости осей координат. Строка @var{pen} может содержать:
+@itemize @bullet
+@item
+@samp{a} для вывода линий одной поверх другой (как при суммировании);
+@item
+@samp{f} для определения кумулятивного эффекта последовательности положительных и отрицательных значений (график типа waterfall);
+@item
+@samp{F} для использования одинаковой (минимальной) ширины полосок;
+@item
+@samp{<}, @samp{^} or @samp{>} для выравнивания полосок влево, вправо или центрирования относительно их координат.
+@end itemize
+Можно использовать разные цвета для положительных и отрицательных значений если число указанных цветов равно удвоенному числу кривых для построения. Если @var{x}.nx>@var{y}.nx, то массив @var{x} задает границы полос, а не их центр. См. также @ref{barh}, @ref{cones}, @ref{area}, @ref{stem}, @ref{chart}, @ref{barwidth}. @sref{Bars sample}
 @end deftypefn
 
 @anchor{barh}
@@ -2179,7 +2347,18 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_barh (@code{HMGL} gr, @code{HCDT} v, @code{const char *}pen, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_barh_xy (@code{HMGL} gr, @code{HCDT} y, @code{HCDT} v, @code{const char *}pen, @code{const char *}opt)
 @end ifclear
-Функции рисуют горизонтальные полосы (прямоугольники) из точек до плоскости осей координат. Если строка @var{pen} содержит символ @samp{a}, то линии рисуются одна поверх другой. Если строка содержит символ @samp{f}, то рисуется график типа waterfall для определения кумулятивного эффекта последовательности положительных и отрицательных значений. Можно использовать разные цвета для положительных и отрицательных значений если число указанных цветов равно удвоенному числу кривых для построения. Если @var{pen} содержит @samp{<}, @samp{^} или @samp{>}, то полоски будут выровнены влево, вправо или центрированы относительно их координат. См. также @ref{bars}, @ref{barwidth}. @sref{Barh sample}
+Функции рисуют горизонтальные полосы (прямоугольники) из точек до плоскости осей координат. Строка @var{pen} может содержать:
+@itemize @bullet
+@item
+@samp{a} для вывода линий одной поверх другой (как при суммировании);
+@item
+@samp{f} для определения кумулятивного эффекта последовательности положительных и отрицательных значений (график типа waterfall);
+@item
+@samp{F} для использования одинаковой (минимальной) ширины полосок;
+@item
+@samp{<}, @samp{^} or @samp{>} для выравнивания полосок влево, вправо или центрирования относительно их координат.
+@end itemize
+Можно использовать разные цвета для положительных и отрицательных значений если число указанных цветов равно удвоенному числу кривых для построения. Если @var{x}.nx>@var{y}.nx, то массив @var{x} задает границы полос, а не их центр. См. также @ref{bars}, @ref{barwidth}. @sref{Barh sample}
 @end deftypefn
 
 @anchor{cones}
@@ -2292,7 +2471,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_mark_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} r, @code{const char *}pen, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_mark_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} r, @code{const char *}pen, @code{const char *}opt)
 @end ifclear
-Функции рисуют маркеры размером @var{r}[i]*@ref{marksize} (см. @ref{Default sizes}) в точках @{@var{x}[i], @var{y}[i], @var{z}[i]@}. Для рисования маркеров одинакового размера можно использовать функцию @ref{plot} с невидимой линией (со стилем содержащим @samp{ }). Для маркеров с размером как у координат можно использовать @ref{error} со стилем @samp{@@}. См. также @ref{plot}, @ref{textmark}, @ref{error}, @ref{stem}. @sref{Mark sample}
+Функции рисуют маркеры размером @var{r}[i]*@ref{marksize} (см. @ref{Default sizes}) в точках @{@var{x}[i], @var{y}[i], @var{z}[i]@}. Для рисования маркеров одинакового размера можно использовать функцию @ref{plot} с невидимой линией (со стилем содержащим @samp{ }). Для маркеров с размером как у координат можно использовать @ref{error} со стилем @samp{@@}. См. также @ref{plot}, @ref{textmark}, @ref{error}, @ref{stem}, @ref{meshnum}. @sref{Mark sample}
 @end deftypefn
 
 @anchor{textmark}
@@ -2318,7 +2497,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_textmark_xyzr (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} r, @code{const char *}txt, @code{const char *}fnt, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_textmarkw_xyzr (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} r, @code{const wchar_t *}txt, @code{const char *}fnt, @code{const char *}opt)
 @end ifclear
-Функции рисуют текст @var{txt} как маркер с размером пропорциональным @var{r}[i]*@var{marksize} в точках @{@var{x}[i], @var{y}[i], @var{z}[i]@}. См. также @ref{plot}, @ref{mark}, @ref{stem}. @sref{TextMark sample}
+Функции рисуют текст @var{txt} как маркер с размером пропорциональным @var{r}[i]*@var{marksize} в точках @{@var{x}[i], @var{y}[i], @var{z}[i]@}. См. также @ref{plot}, @ref{mark}, @ref{stem}, @ref{meshnum}. @sref{TextMark sample}
 @end deftypefn
 
 @anchor{label}
@@ -2341,7 +2520,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @end ifclear
 Функции выводят текстовую строку @var{txt} в точках @{@var{x}[i], @var{y}[i], @var{z}[i]@}. Если строка @var{txt} содержит @samp{%x}, @samp{%y}, @samp{%z} или @samp{%n}, то они будут заменены на значения соответствующих координат или на номер точки. Строка @var{fnt} может содержать:
 @itemize
-@item @ref{Font styles};
+@item стиль текста @ref{Font styles};
 @item @samp{f} для вывода чисел в фиксированном формате;
 @item @samp{E} для вывода @samp{E} вместо @samp{e};
 @item @samp{F} для вывода в формате LaTeX;
@@ -2365,7 +2544,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @end ifclear
 Рисует таблицу значений массива @var{val} с заголовками @var{txt} (разделенными символом новой строки @samp{\n}) в точке @{@var{x}, @var{y}@} (по умолчанию @{0,0@}) относительно текущего subplot. Строка @var{fnt} может содержать:
 @itemize
-@item @ref{Font styles};
+@item стиль текста @ref{Font styles};
 @item @samp{#} для рисования границ ячеек;
 @item @samp{=} для одинаковой ширины всех ячеек;
 @item @samp{|} для ограничения ширины таблицы шириной subplot (эквивалентно опции @samp{value 1});
@@ -2376,7 +2555,23 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @item @samp{-} для вывода обычного @samp{-};
 @item @samp{0123456789} для задания точности при выводе чисел.
 @end itemize
-Опция @code{value} задает ширину таблицы (по умолчанию 1). См. также @ref{label}. @sref{Table sample}
+Опция @code{value} задает ширину таблицы (по умолчанию 1). См. также @ref{plot}, @ref{label}. @sref{Table sample}
+@end deftypefn
+
+@anchor{iris}
+@deftypefn {Команда MGL} {} iris dats 'ids' ['stl'='']
+@deftypefnx {Команда MGL} {} iris dats rngs 'ids' ['stl'='']
+@ifclear UDAV
+@deftypefnx {Метод класса @code{mglGraph}} @code{void} Iris (@code{const mglDataA &}dats, @code{const char *}ids, @code{const char *}stl=@code{""}, @code{const char *}opt=@code{""})
+@deftypefnx {Метод класса @code{mglGraph}} @code{void} Iris (@code{const mglDataA &}dats, @code{const wchar_t *}ids, @code{const char *}stl=@code{""}, @code{const char *}opt=@code{""})
+@deftypefnx {Метод класса @code{mglGraph}} @code{void} Iris (@code{const mglDataA &}dats, @code{const mglDataA &}rngs, @code{const char *}ids, @code{const char *}stl=@code{""}, @code{const char *}opt=@code{""})
+@deftypefnx {Метод класса @code{mglGraph}} @code{void} Iris (@code{const mglDataA &}dats, @code{const mglDataA &}rngs, @code{const wchar_t *}ids, @code{const char *}stl=@code{""}, @code{const char *}opt=@code{""})
+@deftypefnx {Функция С} @code{void} mgl_iris_1 (@code{HMGL} gr, @code{HCDT} dats, @code{const char *}ids, @code{const char *}stl, @code{const char *}opt)
+@deftypefnx {Функция С} @code{void} mgl_irisw_1 (@code{HMGL} gr, @code{HCDT} dats, @code{const wchar_t *}ids, @code{const char *}stl, @code{const char *}opt)
+@deftypefnx {Функция С} @code{void} mgl_iris (@code{HMGL} gr, @code{HCDT} dats, @code{HCDT} rngs, @code{const char *}ids, @code{const char *}stl, @code{const char *}opt)
+@deftypefnx {Функция С} @code{void} mgl_irisw (@code{HMGL} gr, @code{HCDT} dats, @code{HCDT} rngs, @code{const wchar_t *}ids, @code{const char *}stl, @code{const char *}opt)
+@end ifclear
+Рисует Ирисы Фишера для определения зависимостей данных @var{dats} друг от друга (см. @uref{http://en.wikipedia.org/wiki/Iris_flower_data_set}). Массив @var{rngs} размером 2*@var{dats}.nx задает диапазон изменения осей для каждой из колонки. Строка @var{ids} содержит имена колонок данных, разделенных символом @samp{;}. Опция @code{value} задает размер текста для имен данных. На график можно добавить новый набор данных если указать тот же размер @var{rngs} и использовать пустую строку имен @var{ids}. См. также @ref{plot}. @sref{Iris sample}
 @end deftypefn
 
 @anchor{tube}
@@ -2520,7 +2715,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_belt (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_belt_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
 @end ifclear
-Рисует ленточки для параметрически заданной поверхности @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. График может использоваться как 3d обобщение графика @ref{plot}. Если @var{sch} содержит @samp{x}, то ленточки рисуются вдоль оси x, иначе (по умолчанию) вдоль оси y. См. также @ref{fall}, @ref{surf}, @ref{plot}, @ref{meshnum}. @sref{Belt sample}
+Рисует ленточки для параметрически заданной поверхности @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. График может использоваться как 3d обобщение графика @ref{plot}. Если @var{sch} содержит @samp{x}, то ленточки рисуются вдоль оси x, иначе (по умолчанию) вдоль оси y. См. также @ref{fall}, @ref{surf}, @ref{beltc}, @ref{plot}, @ref{meshnum}. @sref{Belt sample}
 @end deftypefn
 
 @anchor{boxs}
@@ -2538,13 +2733,16 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @anchor{tile}
 @deftypefn {Команда MGL} {} tile zdat ['sch'='']
 @deftypefnx {Команда MGL} {} tile xdat ydat zdat ['sch'='']
+@deftypefnx {Команда MGL} {} tile xdat ydat zdat cdat ['sch'='']
 @ifclear UDAV
 @deftypefnx {Метод класса @code{mglGraph}} @code{void} Tile (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""})
 @deftypefnx {Метод класса @code{mglGraph}} @code{void} Tile (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""})
+@deftypefnx {Метод класса @code{mglGraph}} @code{void} Tile (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""})
 @deftypefnx {Функция С} @code{void} mgl_tile (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_tile_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
+@deftypefnx {Функция С} @code{void} mgl_tile_xyc (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt)
 @end ifclear
-Рисует плитки для параметрически заданной поверхности @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. График может использоваться как 3d обобщение @ref{step}. См. также @ref{surf}, @ref{boxs}, @ref{step}, @ref{tiles}. @sref{Tile sample}
+Рисует плитки для параметрически заданной поверхности @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} с цветом, заданным массивом @var{c}[i,j]. Если строка @var{sch} содержит стиль @samp{x} или @samp{y}, то плитки будут ориентированы перпендикулярно x- или y-оси. График может использоваться как 3d обобщение @ref{step}. См. также @ref{surf}, @ref{boxs}, @ref{step}, @ref{tiles}. @sref{Tile sample}
 @end deftypefn
 
 @anchor{dens}
@@ -2628,6 +2826,24 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 Как предыдущий с вектором @var{v} из @var{num} элементов равно распределенных в диапазоне изменения цвета. Здесь @var{num} равен значению параметра @code{value} в опциях @var{opt} (по умолчанию 7).
 @end deftypefn
 
+
+@anchor{contp}
+@deftypefn {Команда MGL} {} contp vdat xdat ydat zdat adat ['sch'='']
+@ifclear UDAV
+@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContP (@code{const mglDataA &}v, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""})
+@deftypefnx {Функция С} @code{void} mgl_contp_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt)
+@end ifclear
+Рисует линии уровня для параметрически заданной поверхности @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. Линии уровня рисуются для @var{a}[i,j]=@var{v}[k]. Если @var{sch} содержит @samp{t} или @samp{T}, то значения @var{v}[k] будут выведены вдоль контуров над (или под) кривой. Если @var{sch} содержит @samp{f}, то контуры будут закрашены. См. также @ref{cont}, @ref{contf}, @ref{surfc}, @code{cont[xyz]}. @c TODO @sref{Cont sample}
+@end deftypefn
+
+@deftypefn {Команда MGL} {} contp xdat ydat zdat adat ['sch'='']
+@ifclear UDAV
+@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContP (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""})
+@deftypefnx {Функция С} @code{void} mgl_contp (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt)
+@end ifclear
+Как предыдущий с вектором @var{v} из @var{num} элементов равно распределенных в диапазоне изменения цвета. Здесь @var{num} равен значению параметра @code{value} в опциях @var{opt} (по умолчанию 7).
+@end deftypefn
+
 @anchor{contv}
 @deftypefn {Команда MGL} {} contv vdat zdat ['sch'='']
 @deftypefnx {Команда MGL} {} contv vdat xdat ydat zdat ['sch'='']
@@ -2845,9 +3061,23 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_surfc (@code{HMGL} gr, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_surfc_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt)
 @end ifclear
-Рисует параметрически заданную поверхность @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} с цветом, заданным массивом @var{c}[i,j]. Если @var{sch} содержит @samp{#}, то на поверхности рисуется сетка. Если @var{sch} содержит @samp{.}, то рисуется поверхность из точек. Размерность массивов @var{z} и @var{c} должна быть одинакова. График строится для каждого z среза данных. См. также @ref{surf}, @ref{surfa}, @ref{surf3c}. @sref{SurfC sample}
+Рисует параметрически заданную поверхность @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} с цветом, заданным массивом @var{c}[i,j]. Если @var{sch} содержит @samp{#}, то на поверхности рисуется сетка. Если @var{sch} содержит @samp{.}, то рисуется поверхность из точек. Размерность массивов @var{z} и @var{c} должна быть одинакова. График строится для каждого z среза данных. См. также @ref{surf}, @ref{surfa}, @ref{beltc}, @ref{surf3c}. @sref{SurfC sample}
+@end deftypefn
+
+
+@anchor{beltc}
+@deftypefn {Команда MGL} {} beltc zdat cdat ['sch'='']
+@deftypefnx {Команда MGL} {} beltc xdat ydat zdat cdat ['sch'='']
+@ifclear UDAV
+@deftypefnx {Метод класса @code{mglGraph}} @code{void} BeltC (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""})
+@deftypefnx {Метод класса @code{mglGraph}} @code{void} BeltC (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""})
+@deftypefnx {Функция С} @code{void} mgl_beltc (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
+@deftypefnx {Функция С} @code{void} mgl_beltc_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
+@end ifclear
+Рисует ленточки для параметрически заданной поверхности @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} с цветом, заданным массивом @var{c}[i,j]. График может использоваться как 3d обобщение графика @ref{plot}. Если @var{sch} содержит @samp{x}, то ленточки рисуются вдоль оси x, иначе (по умолчанию) вдоль оси y. См. также @ref{belt}, @ref{surfc}, @ref{meshnum}. @c TODO @sref{Belt sample}
 @end deftypefn
 
+
 @anchor{surf3c}
 @deftypefn {Команда MGL} {} surf3c adat cdat @code{val} ['sch'='']
 @deftypefnx {Команда MGL} {} surf3c xdat ydat zdat adat cdat @code{val} ['sch'='']
@@ -2948,13 +3178,16 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @anchor{tiles}
 @deftypefn {Команда MGL} {} tiles zdat rdat ['sch'='']
 @deftypefnx {Команда MGL} {} tiles xdat ydat zdat rdat ['sch'='']
+@deftypefnx {Команда MGL} {} tiles xdat ydat zdat rdat cdat ['sch'='']
 @ifclear UDAV
 @deftypefnx {Метод класса @code{mglGraph}} @code{void} TileS (@code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""})
 @deftypefnx {Метод класса @code{mglGraph}} @code{void} TileS (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}r, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""})
+@deftypefnx {Метод класса @code{mglGraph}} @code{void} TileS (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}r, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""})
 @deftypefnx {Функция С} @code{void} mgl_tiles (@code{HMGL} gr, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_tiles_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} r, @code{const char *}sch, @code{const char *}opt)
+@deftypefnx {Функция С} @code{void} mgl_tiles_xyc (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} r, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt)
 @end ifclear
-Рисует плитки для параметрически заданной поверхности @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. Аналогично Tile(), но размер плиток задается массивов @var{r}. Это создает эффект "прозрачности" при экспорте в файлы EPS. График строится для каждого z среза данных. См. также @ref{surfa}, @ref{tile}. @sref{TileS sample}
+Рисует плитки для параметрически заданной поверхности @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} с цветом, заданным массивом @var{c}[i,j]. Аналогично Tile(), но размер плиток задается массивов @var{r}. Если строка @var{sch} содержит стиль @samp{x} или @samp{y}, то плитки будут ориентированы перпендикулярно x- или y-оси. Это создает эффект "прозрачности" при экспорте в файлы EPS. График строится для каждого z среза данных. См. также @ref{surfa}, @ref{tile}. @sref{TileS sample}
 @end deftypefn
 
 @anchor{map}
@@ -3093,6 +3326,8 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @item
 @samp{#} для использования нитей, начинающихся только на границе;
 @item
+@samp{*} для использования нитей, начинающихся с двумерной сетки внутри данных;
+@item
 @samp{v} для рисования стрелок на нитях;
 @item
 @samp{x}, @samp{z} для рисования лент нормалей, начинающихся в плоскостях x-y и y-z соответственно.
index d2b7a1bea0eeaf7253600a236cc3eee156640de8..284e383b17ac52794599349e930e45fd96956208 100644 (file)
@@ -163,9 +163,18 @@ Default constructor. Allocates the memory for data array and initializes it by z
 @deftypefnx {Constructor on @code{mglDataC}} {} mglDataC (@code{int} size, @code{const dual *}dat2)
 @deftypefnx {Constructor on @code{mglDataC}} {} mglDataC (@code{int} size, @code{int} cols, @code{const dual *}dat2)
 @end ifclear
-Copy constructor. Allocates the memory for data array and copy values from other array. At this, if parameter @var{eq} is specified then the data will be modified by corresponding formula similarly to @ref{fill}.
+Copy constructor. Allocates the memory for data array and copy values from other array. At this, if parameter @var{eq} or @var{val} is specified then the data will be modified by corresponding formula similarly to @ref{fill}.
 @end deftypefn
 
+@deftypefn {MGL command} {} copy @sc{redat} @sc{imdat} dat2 ['eq'='']
+Allocates the memory for data array and copy real and imaginary values from complex array @var{dat2}.
+@end deftypefn
+
+@deftypefn {MGL command} {} copy 'name'
+Allocates the memory for data array and copy values from other array specified by its name, which can be "invalid" for MGL names (like one read from HDF5 files).
+@end deftypefn
+
+
 @deftypefn {MGL command} {} read @sc{dat} 'fname'
 @ifclear UDAV
 @deftypefnx {Constructor on @code{mglData}} {} mglData (@code{const char *}fname)
@@ -177,13 +186,14 @@ Reads data from tab-separated text file with auto determining sizes of the data.
 @end deftypefn
 
 @deftypefn {MGL command} {} delete dat
+@deftypefnx {MGL command} {} delete 'name'
 @ifclear UDAV
 @deftypefnx {Destructor on @code{mglData}} {} ~mglData ()
 @deftypefnx {C function} @code{void} mgl_delete_data (@code{HMDT} dat)
 @deftypefnx {Destructor on @code{mglDataC}} {} ~mglDataC ()
 @deftypefnx {C function} @code{void} mgl_delete_datac (@code{HADT} dat)
 @end ifclear
-Deletes the instance of class mglData.
+Deletes the data array from memory.
 @end deftypefn
 
 
@@ -281,6 +291,16 @@ Reduces the data size by excluding data elements which indexes are not divisible
 Cuts off edges of the data @var{i}<@var{n1} and @var{i}>@var{n2} if @var{n2}>0 or @var{i}>@code{n[xyz]}-@var{n2} if @var{n2}<=0 along direction @var{dir}.
 @end deftypefn
 
+@deftypefn {MGL command} {} crop dat 'how'
+@ifclear UDAV
+@deftypefnx {Method on @code{mglData}} @code{void} Crop (@code{const char *}how=@code{"235x"})
+@deftypefnx {Method on @code{mglDataC}} @code{void} Crop (@code{const char *}how=@code{"235x"})
+@deftypefnx {C function} @code{void} mgl_data_crop_opt (@code{HMDT} dat, @code{const char *}how)
+@deftypefnx {C function} @code{void} mgl_datac_crop_opt (@code{HADT} dat, @code{const char *}how)
+@end ifclear
+Cuts off far edge of the data to be more optimal for fast Fourier transform. The resulting size will be the closest value of 2^n*3^m*5^l to the original one. The string @var{how} may contain: @samp{x}, @samp{y}, @samp{z} for directions, and @samp{2}, @samp{3}, @samp{5} for using corresponding bases.
+@end deftypefn
+
 @anchor{insert}
 @deftypefn {MGL command} {} insert dat 'dir' @code{[pos=off num=0]}
 @ifclear UDAV
@@ -303,6 +323,11 @@ Insert @var{num} slices along @var{dir}-direction at position @var{pos} and fill
 Delete @var{num} slices along @var{dir}-direction at position @var{pos}.
 @end deftypefn
 
+@deftypefn {MGL command} {} delete dat
+@deftypefnx {MGL command} {} delete 'name'
+Deletes the whole data array.
+@end deftypefn
+
 @anchor{sort}
 @deftypefn {MGL command} {} sort dat @code{idx [idy=-1]}
 @ifclear UDAV
@@ -461,9 +486,7 @@ Creates new variable with name @var{dat} for one-dimensional array of size @var{
 Equidistantly fills the data values to range [@var{v1}, @var{v2}] in direction @var{dir}=@{@samp{x},@samp{y},@samp{z}@}.
 @end deftypefn
 
-@deftypefn {MGL command} {} fill dat 'eq'
-@deftypefnx {MGL command} {} fill dat 'eq' vdat
-@deftypefnx {MGL command} {} fill dat 'eq' vdat wdat
+@deftypefn {MGL command} {} fill dat 'eq' [vdat wdat]
 @ifclear UDAV
 @deftypefnx {Method on @code{mglData}} @code{void} Fill (@code{HMGL} gr, @code{const char *}eq, @code{const char *}opt=@code{""})
 @deftypefnx {Method on @code{mglData}} @code{void} Fill (@code{HMGL} gr, @code{const char *}eq, @code{const mglDataA &}vdat, @code{const char *}opt=@code{""})
@@ -479,8 +502,7 @@ Fills the value of array according to the formula in string @var{eq}. Formula is
 
 @anchor{modify}
 @deftypefn {MGL command} {} modify dat 'eq' [@code{dim=0}]
-@deftypefnx {MGL command} {} modify dat 'eq' vdat
-@deftypefnx {MGL command} {} modify dat 'eq' vdat wdat
+@deftypefnx {MGL command} {} modify dat 'eq' vdat [wdat]
 @ifclear UDAV
 @deftypefnx {Method on @code{mglData}} @code{void} Modify (@code{const char *}eq, @code{int} dim=@code{0})
 @deftypefnx {Method on @code{mglData}} @code{void} Modify (@code{const char *}eq, @code{const mglDataA &}v)
@@ -519,7 +541,7 @@ Fills the value of array according to the linear interpolation of triangulated s
 
 
 @anchor{put}
-@deftypefn {MGL command} {} put dat @code{val [i=: j=: k=:]}
+@deftypefn {MGL command} {} put dat @code{val [i=all j=all k=all]}
 @ifclear UDAV
 @deftypefnx {Method on @code{mglData}} @code{void} Put (@code{mreal} val, @code{int} i=@code{-1}, @code{int} j=@code{-1}, @code{int} k=@code{-1})
 @deftypefnx {Method on @code{mglDataC}} @code{void} Put (@code{dual} val, @code{int} i=@code{-1}, @code{int} j=@code{-1}, @code{int} k=@code{-1})
@@ -529,7 +551,7 @@ Fills the value of array according to the linear interpolation of triangulated s
 Sets value(s) of array a[@var{i}, @var{j}, @var{k}] = @var{val}. Negative indexes @var{i}, @var{j}, @var{k}=-1 set the value @var{val} to whole range in corresponding direction(s). For example, @code{Put(val,-1,0,-1);} sets a[i,0,j]=@var{val} for i=0...(nx-1), j=0...(nz-1).
 @end deftypefn
 
-@deftypefn {MGL command} {} put dat vdat [@code{i=: j=: k=:}]
+@deftypefn {MGL command} {} put dat vdat [@code{i=all j=all k=all}]
 @ifclear UDAV
 @deftypefnx {Method on @code{mglData}} @code{void} Put (@code{const mglDataA &}v, @code{int} i=@code{-1}, @code{int} j=@code{-1}, @code{int} k=@code{-1})
 @deftypefnx {Method on @code{mglDataC}} @code{void} Put (@code{const mglDataA &}v, @code{int} i=@code{-1}, @code{int} j=@code{-1}, @code{int} k=@code{-1})
@@ -597,6 +619,7 @@ Sets the symbol @var{ids} for data columns. The string should contain one symbol
 
 @anchor{read}
 @deftypefn {MGL command} {} read @sc{dat} 'fname'
+@deftypefnx {MGL command} {} read @sc{redat} @sc{imdat} 'fname'
 @ifclear UDAV
 @deftypefnx {Method on @code{mglData}} @code{bool} Read (@code{const char *}fname)
 @deftypefnx {Method on @code{mglDataC}} @code{bool} Read (@code{const char *}fname)
@@ -607,6 +630,7 @@ Reads data from tab-separated text file with auto determining sizes of the data.
 @end deftypefn
 
 @deftypefn {MGL command} {} read @sc{dat} 'fname' @code{mx [my=1 mz=1]}
+@deftypefnx {MGL command} {} read @sc{redat} @sc{imdat} 'fname' @code{mx [my=1 mz=1]}
 @ifclear UDAV
 @deftypefnx {Method on @code{mglData}} @code{bool} Read (@code{const char *}fname, @code{int} mx, @code{int} my=@code{1}, @code{int} mz=@code{1})
 @deftypefnx {Method on @code{mglDataC}} @code{bool} Read (@code{const char *}fname, @code{int} mx, @code{int} my=@code{1}, @code{int} mz=@code{1})
@@ -702,6 +726,22 @@ Saves data array named @var{dname} to HDF5 file. This function does nothing if H
 Put data names from HDF5 file @var{fname} into @var{buf} as '\t' separated fields. In MGL version the list of data names will be printed as message. This function does nothing if HDF5 was disabled during library compilation.
 @end deftypefn
 
+@anchor{openhdf}
+@deftypefn {MGL command} {} openhdf 'fname'
+@ifclear UDAV
+@deftypefnx {Method on @code{mglParse}} @code{void} OpenHDF (@code{const char *}fname)
+@deftypefnx {C function} @code{void} mgl_parser_openhdf (@code{HMPR} pr, @code{const char *}fname)
+@end ifclear
+Reads all data array from HDF5 file @var{fname} and create MGL variables with names of data names in HDF file. Complex variables will be created if data name starts with @samp{!}.
+@end deftypefn
+
+@ifclear UDAV
+@deftypefn {C function} @code{const char * const *} mgl_datas_hdf_str (@code{HMPR} pr, @code{const char *}fname)
+Put HDF data names as list of strings (last one is ""). The result is valid untill next call of the function.
+@end deftypefn
+@end ifclear
+
+
 @anchor{import}
 @deftypefn {MGL command} {} import @sc{dat} 'fname' 'sch' [@code{v1=0 v2=1}]
 @ifclear UDAV
@@ -742,7 +782,7 @@ Saves data matrix (or @code{ns}-th slice for 3d data) to bitmap file (now suppor
 
 
 @anchor{subdata}
-@deftypefn {MGL command} {} subdata @sc{res} dat @code{xx [yy=: zz=:]}
+@deftypefn {MGL command} {} subdata @sc{res} dat @code{xx [yy=all zz=all]}
 @ifclear UDAV
 @deftypefnx {Method on @code{mglData}} @code{mglData} SubData (@code{mreal} xx, @code{mreal} yy=@code{-1}, @code{mreal} zz=@code{-1}) @code{const}
 @deftypefnx {Method on @code{mglDataC}} @code{mglData} SubData (@code{mreal} xx, @code{mreal} yy=@code{-1}, @code{mreal} zz=@code{-1}) @code{const}
@@ -751,7 +791,7 @@ Saves data matrix (or @code{ns}-th slice for 3d data) to bitmap file (now suppor
 Extracts sub-array data from the original data array keeping fixed positive index. For example @code{SubData(-1,2)} extracts 3d row (indexes are zero based), @code{SubData(4,-1)} extracts 5th column, @code{SubData(-1,-1,3)} extracts 4th slice and so on. If argument(s) are non-integer then linear interpolation between slices is used. In MGL version this command usually is used as inline one @code{dat(xx,yy,zz)}. Function return NULL or create empty data if data cannot be created for given arguments.
 @end deftypefn
 
-@deftypefn {MGL command} {} subdata @sc{res} dat xdat [ydat=: zdat=:]
+@deftypefn {MGL command} {} subdata @sc{res} dat xdat [ydat zdat]
 @ifclear UDAV
 @deftypefnx {Method on @code{mglData}} @code{mglData} SubData (@code{const mglDataA &}xx, @code{const mglDataA &}yy, @code{const mglDataA &}zz) @code{const}
 @deftypefnx {Method on @code{mglDataC}} @code{mglData} SubData (@code{const mglDataA &}xx, @code{const mglDataA &}yy, @code{const mglDataA &}zz) @code{const}
@@ -802,6 +842,23 @@ Resizes the data to new size @var{mx}, @var{my}, @var{mz} from box (part) [@var{
 Gets array which values is result of interpolation of original array for coordinates from other arrays. All dimensions must be the same for data @var{idat}, @var{jdat}, @var{kdat}. Coordinates from @var{idat}, @var{jdat}, @var{kdat} are supposed to be normalized in range [0,1] (if @var{norm}=@code{true}) or in ranges [0,nx], [0,ny], [0,nz] correspondingly. Function return NULL or create empty data if data cannot be created for given arguments.
 @end deftypefn
 
+@anchor{section}
+@deftypefn {MGL command} {} section @sc{res} dat ids ['dir'='y' @code{val=nan}]
+@deftypefnx {MGL command} {} section @sc{res} dat @code{id} ['dir'='y' @code{val=nan}]
+@ifclear UDAV
+@deftypefnx {Method on @code{mglData}} @code{mglData} Section (@code{const mglDataA &}ids, @code{const char *}dir=@code{'y'}, @code{mreal} val=@code{NAN}) @code{const}
+@deftypefnx {Method on @code{mglData}} @code{mglData} Section (@code{long} id, @code{const char *}dir=@code{'y'}, @code{mreal} val=@code{NAN}) @code{const}
+@deftypefnx {Method on @code{mglDataC}} @code{mglData} Section (@code{const mglDataA &}ids, @code{const char *}dir=@code{'y'}, @code{mreal} val=@code{NAN}) @code{const}
+@deftypefnx {Method on @code{mglDataC}} @code{mglData} Section (@code{long} id, @code{const char *}dir=@code{'y'}, @code{mreal} val=@code{NAN}) @code{const}
+@deftypefnx {C function} @code{HMDT} mgl_data_section (@code{HCDT} dat, @code{HCDT} ids, @code{const char *}dir, @code{mreal} val)
+@deftypefnx {C function} @code{HMDT} mgl_data_section_val (@code{HCDT} dat, @code{long} id, @code{const char *}dir, @code{mreal} val)
+@deftypefnx {C function} @code{HADT} mgl_datac_section (@code{HCDT} dat, @code{HCDT} ids, @code{const char *}dir, @code{mreal} val)
+@deftypefnx {C function} @code{HADT} mgl_datac_section_val (@code{HCDT} dat, @code{long} id, @code{const char *}dir, @code{mreal} val)
+@end ifclear
+Gets array which is @var{id}-th section (range of slices separated by value @var{val}) of original array @var{dat}. For @var{id}<0 the reverse order is used (i.e. -1 give last section). If several @var{ids} are provided then output array will be result  of sequential joining of sections.
+@end deftypefn
+
+
 @anchor{solve}
 @deftypefn {MGL command} {} solve @sc{res} dat @code{val} 'dir' [@code{norm=on}]
 @deftypefnx {MGL command} {} solve @sc{res} dat @code{val} 'dir' idat [@code{norm=on}]
@@ -824,6 +881,15 @@ Gets array which values is indexes (roots) along given direction @var{dir}, wher
 Find roots of equation 'func'=0 for variable @var{var} with initial guess @var{ini}. Secant method is used for root finding. Function return NULL or create empty data if data cannot be created for given arguments.
 @end deftypefn
 
+@anchor{detect}
+@deftypefn {MGL command} {} detect @sc{res} dat @code{lvl dj [di=0 minlen=0]}
+@ifclear UDAV
+@deftypefnx {Method on @code{mglData}} @code{mglData} Detect (@code{mreal} lvl, @code{mreal} dj, @code{mreal} di=@code{0}, @code{mreal} minlen=@code{0}) @code{const}
+@deftypefnx {C function} @code{HMDT} mgl_data_detect (@code{HCDT} dat, @code{mreal} lvl, @code{mreal} dj, @code{mreal} di, @code{mreal} minlen)
+@end ifclear
+Get curves @{x,y@}, separated by NAN values, for local maximal values of array @var{dat} as function of x-coordinate. Noises below @var{lvl} amplitude are ignored. Parameter @var{dj} (in range [0,ny]) set the "attraction" y-distance of points to the curve. Similarly, @var{di} continue curve in x-direction through gaps smaller than @var{di} points. Curves with minimal length smaller than @var{minlen} will be ignored.
+@end deftypefn
+
 @anchor{hist}
 @deftypefn {MGL command} {} hist @sc{res} dat @code{num v1 v2 [nsub=0]}
 @deftypefnx {MGL command} {} hist @sc{res} dat wdat @code{num v1 v2 [nsub=0]}
@@ -1003,11 +1069,16 @@ Integrates (like cumulative summation) the data in given direction or directions
 Differentiates the data in given direction or directions.
 @end deftypefn
 
-@deftypefn {MGL command} {} diff dat xdat ydat [zdat=0]
+@deftypefn {MGL command} {} diff dat xdat ydat [zdat]
 @ifclear UDAV
+@deftypefnx {Method on @code{mglData}} @code{void} Diff (@code{const mglDataA &}x)
 @deftypefnx {Method on @code{mglData}} @code{void} Diff (@code{const mglDataA &}x, @code{const mglDataA &}y)
 @deftypefnx {Method on @code{mglData}} @code{void} Diff (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z)
+@deftypefnx {Method on @code{mglDataC}} @code{void} Diff (@code{const mglDataA &}x)
+@deftypefnx {Method on @code{mglDataC}} @code{void} Diff (@code{const mglDataA &}x, @code{const mglDataA &}y)
+@deftypefnx {Method on @code{mglDataC}} @code{void} Diff (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z)
 @deftypefnx {C function} @code{void} mgl_data_diff_par (@code{HMDT} dat, @code{HCDT} x, @code{HCDT}y, @code{HCDT}z)
+@deftypefnx {C function} @code{void} mgl_datac_diff_par (@code{HADT} dat, @code{HCDT} x, @code{HCDT}y, @code{HCDT}z)
 @end ifclear
 Differentiates the data specified parametrically in direction @var{x} with @var{y}, @var{z}=constant. Parametrical differentiation uses the formula (for 2D case): @math{da/dx = (a_j*y_i-a_i*y_j)/(x_j*y_i-x_i*y_j)} where @math{a_i=da/di, a_j=da/dj} denotes usual differentiation along 1st and 2nd dimensions. The similar formula is used for 3D case. Note, that you may change the order of arguments -- for example, if you have 2D data a(i,j) which depend on coordinates @{x(i,j), y(i,j)@} then usual derivative along @samp{x} will be @code{Diff(x,y);} and usual derivative along @samp{y} will be @code{Diff(y,x);}.
 @end deftypefn
@@ -1112,14 +1183,26 @@ Remove value steps (like phase jumps after inverse trigonometric functions) with
 @end deftypefn
 
 @anchor{smooth}
-@deftypefn {MGL command} {} smooth data @code{type} ['dir'='xyz']
+@deftypefn {MGL command} {} smooth data ['dir'='xyz']
 @ifclear UDAV
 @deftypefnx {Method on @code{mglData}} @code{void} Smooth (@code{const char *}dir=@code{"xyz"}, @code{mreal} delta=@code{0})
 @deftypefnx {Method on @code{mglDataC}} @code{void} Smooth (@code{const char *}dir=@code{"xyz"}, @code{mreal} delta=@code{0})
 @deftypefnx {C function} @code{void} mgl_data_smooth (@code{HMDT} dat, @code{const char *}dir, @code{mreal} delta)
 @deftypefnx {C function} @code{void} mgl_datac_smooth (@code{HADT} dat, @code{const char *}dir, @code{mreal} delta)
 @end ifclear
-Smooths the data on specified direction or directions. String @var{dirs} specifies the dimensions which will be smoothed. It may contain characters: @samp{x} for 1st dimension, @samp{y} for 2nd dimension, @samp{z} for 3d dimension. If string @var{dir} contain: @samp{0} then does nothing, @samp{3} -- linear averaging over 3 points, @samp{5} -- linear averaging over 5 points. If string @var{dir} contain @samp{dN} (where @samp{N} is digit 1,2,...,9) then linear averaging over (2*N+1)-th points is used.
+Smooths the data on specified direction or directions. String @var{dirs} specifies the dimensions which will be smoothed. It may contain characters:
+@itemize @bullet
+@item
+@samp{xyz} for smoothing along x-,y-,z-directions correspondingly,
+@item
+@samp{0} does nothing,
+@item
+@samp{3} for linear averaging over 3 points,
+@item
+@samp{5} for linear averaging over 5 points,
+@item
+@samp{d1}...@samp{d9} for linear averaging over (2*N+1)-th points.
+@end itemize
 By default quadratic averaging over 5 points is used.
 @end deftypefn
 
@@ -1132,10 +1215,37 @@ By default quadratic averaging over 5 points is used.
 Find envelop for data values along direction @var{dir}.
 @end deftypefn
 
+@anchor{diffract}
+@deftypefn {MGL command} {} diffract dat 'how' @code{q}
+@ifclear UDAV
+@deftypefnx {Method on @code{mglDataC}} @code{void} Diffraction (@code{const char *}how, @code{mreal} q)
+@deftypefnx {C function} @code{void} mgl_datac_diffr (@code{HADT} dat, @code{const char *}how, @code{mreal} q)
+@end ifclear
+Calculates one step of diffraction by finite-difference method with parameter @var{q}=@math{\delta t/\delta x^2} using method with 3-d order of accuracy. Parameter @var{how} may contain:
+@itemize @bullet
+ @item @samp{xyz} for calculations along x-,y-,z-directions correspondingly;
+@item
+ @samp{r} for using axial symmetric Laplace operator for x-direction;
+@item
+ @samp{0} for zero boundary conditions;
+@item
+ @samp{1} for constant boundary conditions;
+@item
+ @samp{2} for linear boundary conditions;
+@item
+ @samp{3} for parabolic boundary conditions;
+@item
+ @samp{4} for exponential boundary conditions;
+@item
+ @samp{5} for gaussian boundary conditions.
+@end itemize
+@end deftypefn
+
 @anchor{norm}
 @deftypefn {MGL command} {} norm dat @code{v1 v2 [sym=off dim=0]}
 @ifclear UDAV
-@deftypefnx {Method on @code{mglData}} @code{void} Norm (@code{mreal} v1=@code{0}, @code{mreal} v2=@code{1}, @code{bool} sym=@code{false}, @code{int} dim=@code{0})
+@deftypefnx {Method on @code{mglData}} @code{void} Norm (@code{mreal} v1=@code{0}, @code{mreal} v2=@code{1}, @code{bool} sym=@code{false}, @code{long} dim=@code{0})
+@deftypefnx {C function} @code{void} mgl_data_norm (@code{HMDT} dat, @code{mreal} v1, @code{mreal} v2, @code{int} sym, @code{long} dim)
 @end ifclear
 Normalizes the data to range [@var{v1},@var{v2}]. If flag @var{sym}=@code{true} then symmetrical interval [-max(|v1|,|v2|), max(|v1|,|v2|)] is used. Modification will be applied only for slices >=@var{dim}.
 @end deftypefn
@@ -1143,10 +1253,10 @@ Normalizes the data to range [@var{v1},@var{v2}]. If flag @var{sym}=@code{true}
 @anchor{normsl}
 @deftypefn {MGL command} {} normsl dat @code{v1 v2} ['dir'='z' @code{keep=on sym=off}]
 @ifclear UDAV
-@deftypefnx {Method on @code{mglData}} @code{void} NormSl (@code{mreal} v1=@code{0}, @code{mreal} v2=@code{1}, @code{char} dir=@code{'z'}, @code{bool} keep_en=@code{true}, @code{bool} sym=@code{false})
-@deftypefnx {C function} @code{void} mgl_data_norm_slice (@code{HMDT} dat, @code{mreal} v1, @code{mreal} v2, @code{char} dir, @code{int} keep_en, @code{int} sym)
+@deftypefnx {Method on @code{mglData}} @code{void} NormSl (@code{mreal} v1=@code{0}, @code{mreal} v2=@code{1}, @code{char} dir=@code{'z'}, @code{bool} keep=@code{true}, @code{bool} sym=@code{false})
+@deftypefnx {C function} @code{void} mgl_data_norm_slice (@code{HMDT} dat, @code{mreal} v1, @code{mreal} v2, @code{char} dir, @code{int} keep, @code{int} sym)
 @end ifclear
-Normalizes data slice-by-slice along direction @var{dir} the data in slices to range [@var{v1},@var{v2}]. If flag @var{sym}=@code{true} then symmetrical interval [-max(|v1|,|v2|), max(|v1|,|v2|)] is used. If @var{keep_en} is set then maximal value of k-th slice will be limited by
+Normalizes data slice-by-slice along direction @var{dir} the data in slices to range [@var{v1},@var{v2}]. If flag @var{sym}=@code{true} then symmetrical interval [-max(|v1|,|v2|), max(|v1|,|v2|)] is used. If @var{keep} is set then maximal value of k-th slice will be limited by
 @iftex
 @math{\sqrt{\sum a_{ij}(k)/\sum a_{ij}(0)}}.
 @end iftex
@@ -1155,6 +1265,36 @@ Normalizes data slice-by-slice along direction @var{dir} the data in slices to r
 @end ifnottex
 @end deftypefn
 
+@anchor{limit}
+@deftypefn {MGL command} {} limit dat @code{val}
+@ifclear UDAV
+@deftypefnx {Method on @code{mglData}} @code{void} Limit (@code{mreal} val)
+@deftypefnx {Method on @code{mglDataC}} @code{void} Limit (@code{mreal} val)
+@deftypefnx {C function} @code{void} mgl_data_limit (@code{HMDT} dat, @code{mreal} val)
+@deftypefnx {C function} @code{void} mgl_datac_limit (@code{HADT} dat, @code{mreal} val)
+@end ifclear
+Limits the data values to be inside the range [-@var{val},@var{val}], keeping the original sign of the value (phase for complex numbers). This is equivalent to operation @code{a[i] *= abs(a[i])<val?1.:val/abs(a[i]);}.
+@end deftypefn
+
+@anchor{dilate}
+@deftypefn {MGL command} {} dilate dat @code{[val=1 step=1]}
+@ifclear UDAV
+@deftypefnx {Method on @code{mglData}} @code{void} Dilate (@code{mreal} val=@code{1}, @code{long} step=@code{1})
+@deftypefnx {C function} @code{void} mgl_data_dilate (@code{HMDT} dat, @code{mreal} val, @code{long} step)
+@end ifclear
+Return dilated by @var{step} cells array of 0 or 1 for data values larger @var{val}. @c TODO @sref{Dilate and erode sample}
+@end deftypefn
+
+@anchor{erode}
+@deftypefn {MGL command} {} erode dat @code{[val=1 step=1]}
+@ifclear UDAV
+@deftypefnx {Method on @code{mglData}} @code{void} Erode (@code{mreal} val=@code{1}, @code{long} step=@code{1})
+@deftypefnx {C function} @code{void} mgl_data_erode (@code{HMDT} dat, @code{mreal} val, @code{long} step)
+@end ifclear
+Return eroded by @var{step} cells array of 0 or 1 for data values larger @var{val}. @c TODO @sref{Dilate and erode sample}
+@end deftypefn
+
+
 @c ------------------------------------------------------------------
 @external{}
 @node Interpolation, Data information, Data changing, Data processing
@@ -1326,6 +1466,23 @@ Gets approximated (interpolated) position of maximum to variables @var{x}, @var{
 @end deftypefn
 
 
+@anchor{.mxf} @anchor{.myf} @anchor{.mzf}
+@anchor{.mxl} @anchor{.myl} @anchor{.mzl}
+@deftypefn {MGL suffix} {(dat)} .mxf
+@deftypefnx {MGL suffix} {(dat)} .myf
+@deftypefnx {MGL suffix} {(dat)} .mzf
+@deftypefnx {MGL suffix} {(dat)} .mxl
+@deftypefnx {MGL suffix} {(dat)} .myl
+@deftypefnx {MGL suffix} {(dat)} .mzl
+@ifclear UDAV
+@deftypefnx {Method on @code{mglDataA}} @code{long} Maximal (@code{char} dir, @code{long} from) @code{const}
+@deftypefnx {Method on @code{mglDataA}} @code{long} Maximal (@code{char} dir, @code{long} from, @code{long} &p1, @code{long} &p2) @code{const}
+@deftypefnx {C function} @code{mreal} mgl_data_max_firstl (@code{HCDT} dat, @code{char} dir, @code{long} from, @code{long} *p1, @code{long} *p2)
+@end ifclear
+Get first starting @var{from} give position (or last one if @var{from}<0) maximum along direction @var{dir}, and save its orthogonal coordinates in @var{p1}, @var{p2}.
+@end deftypefn
+
+
 @cindex Momentum
 @anchor{.ax} @anchor{.ay} @anchor{.az} @anchor{.aa} @anchor{.sum}
 @anchor{.wx} @anchor{.wy} @anchor{.wz} @anchor{.wa}
@@ -1520,20 +1677,45 @@ The same as previous but with specified amplitude @var{ampl} and phase @var{phas
 @deftypefnx {MGL command} {} fourier complexDat 'dir'
 @ifclear UDAV
 @deftypefnx {Global function} @code{void} mglFourier @code{const mglDataA &}re, @code{const mglDataA &}im, @code{const char *}dir)
+@deftypefnx {Method on @code{mglDataC}} @code{void} FFT (@code{const char *}dir)
 @deftypefnx {C function} @code{void} mgl_data_fourier @code{HCDT} re, @code{HCDT} im, @code{const char *}dir)
+@deftypefnx {C function} @code{void} mgl_datac_fft (@code{HADT} dat, @code{const char *}dir)
 @end ifclear
-Does Fourier transform of complex data @var{re}+i*@var{im} in directions @var{dir}. Result is placed back into @var{re} and @var{im} data arrays.
+Does Fourier transform of complex data @var{re}+i*@var{im} in directions @var{dir}. Result is placed back into @var{re} and @var{im} data arrays. If @var{dir} contain @samp{i} then inverse Fourier is used.
 @end deftypefn
 
 @anchor{stfad}
 @deftypefn {MGL command} {} stfad @sc{res} real imag @code{dn} ['dir'='x']
 @ifclear UDAV
 @deftypefnx {Global function} @code{mglData} mglSTFA (@code{const mglDataA &}real, @code{const mglDataA &}imag, @code{int} dn, @code{char} dir=@code{'x'})
-@deftypefnx {C function} @code{HMDT} mgl_data_stfa (@code{HCDT} real, @code{HCDT} imag, @code{int} dn,@code{char} dir)
+@deftypefnx {C function} @code{HMDT} mgl_data_stfa (@code{HCDT} real, @code{HCDT} imag, @code{int} dn, @code{char} dir)
 @end ifclear
 Short time Fourier transformation for real and imaginary parts. Output  is amplitude of partial Fourier of length @var{dn}. For example if @var{dir}=@samp{x}, result will have size @{int(nx/dn), dn, ny@} and it will contain @math{res[i,j,k]=|\sum_d^dn exp(I*j*d)*(real[i*dn+d,k]+I*imag[i*dn+d,k])|/dn}.
 @end deftypefn
 
+@anchor{tridmat}
+@deftypefn {MGL command} {} tridmat @sc{res adat bdat cdat ddat} 'how'
+@ifclear UDAV
+@deftypefnx {Global function} @code{mglData} mglTridMat (@code{const mglDataA &}A, @code{const mglDataA &}B, @code{const mglDataA &}C, @code{const mglDataA &}D, @code{const char *}how)
+@deftypefnx {Global function} @code{mglDataC} mglTridMatC (@code{const mglDataA &}A, @code{const mglDataA &}B, @code{const mglDataA &}C, @code{const mglDataA &}D, @code{const char *}how)
+@deftypefnx {C function} @code{HMDT} mgl_data_tridmat (@code{HCDT} A, @code{HCDT} B, @code{HCDT} C, @code{HCDT} D, @code{const char*}how)
+@deftypefnx {C function} @code{HADT} mgl_datac_tridmat (@code{HCDT} A, @code{HCDT} B, @code{HCDT} C, @code{HCDT} D, @code{const char*}how)
+@end ifclear
+Get array as solution of tridiagonal system of equations @var{A}[i]*x[i-1]+@var{B}[i]*x[i]+@var{C}[i]*x[i+1]=@var{D}[i]. String @var{how} may contain:
+@itemize @bullet
+@item
+@samp{xyz} for solving along x-,y-,z-directions correspondingly;
+@item
+@samp{h} for solving along hexagonal direction at x-y plain (require square matrix);
+@item
+@samp{c} for using periodical boundary conditions;
+@item
+@samp{d} for for diffraction/diffuse calculation (i.e. for using -@var{A}[i]*@var{D}[i-1]+(2-@var{B}[i])*@var{D}[i]-@var{C}[i]*@var{D}[i+1] at right part instead of @var{D}[i]).
+@end itemize
+Data dimensions of arrays @var{A}, @var{B}, @var{C} should be equal. Also their dimensions need to be equal to all or to minor dimension(s) of array @var{D}. @sref{PDE solving hints}
+@end deftypefn
+
+
 @anchor{pde}
 @deftypefn {MGL command} {} pde @sc{res} 'ham' ini_re ini_im [@code{dz=0.1 k0=100}]
 @ifclear UDAV
@@ -1542,9 +1724,21 @@ Short time Fourier transformation for real and imaginary parts. Output  is ampli
 @deftypefnx {C function} @code{HMDT} mgl_pde_solve (@code{HMGL} gr, @code{const char *}ham, @code{HCDT} ini_re, @code{HCDT} ini_im, @code{mreal} dz, @code{mreal} k0, @code{const char *}opt)
 @deftypefnx {C function} @code{HADT} mgl_pde_solve_c (@code{HMGL} gr, @code{const char *}ham, @code{HCDT} ini_re, @code{HCDT} ini_im, @code{mreal} dz, @code{mreal} k0, @code{const char *}opt)
 @end ifclear
-Solves equation du/dz = i*k0*@var{ham}(p,q,x,y,z,|u|)[u], where p=-i/k0*d/dx, q=-i/k0*d/dy are pseudo-differential operators. Parameters @var{ini_re}, @var{ini_im} specify real and imaginary part of initial field distribution. Parameters @var{Min}, @var{Max} set the bounding box for the solution. Note, that really this ranges are increased by factor 3/2 for purpose of reducing reflection from boundaries. Parameter @var{dz} set the step along evolutionary coordinate z. At this moment, simplified form of function @var{ham} is supported -- all ``mixed'' terms (like @samp{x*p}->x*d/dx) are excluded. For example, in 2D case this function is effectively @math{ham = f(p,z) + g(x,z,u)}. However commutable combinations (like @samp{x*q}->x*d/dy) are allowed. Here variable @samp{u} is used for field amplitude |u|. This allow one solve nonlinear problems -- for example, for nonlinear Shrodinger equation you may set @code{ham="p^2 + q^2 - u^2"}. You may specify imaginary part for wave absorption, like @code{ham = "p^2 + i*x*(x>0)"}, but only if dependence on variable @samp{i} is linear (i.e. @math{ham = hre+i*him}). See also @ref{qo2d}, @ref{qo3d}. @sref{PDE solving hints}
+Solves equation du/dz = i*k0*@var{ham}(p,q,x,y,z,|u|)[u], where p=-i/k0*d/dx, q=-i/k0*d/dy are pseudo-differential operators. Parameters @var{ini_re}, @var{ini_im} specify real and imaginary part of initial field distribution. Parameters @var{Min}, @var{Max} set the bounding box for the solution. Note, that really this ranges are increased by factor 3/2 for purpose of reducing reflection from boundaries. Parameter @var{dz} set the step along evolutionary coordinate z. At this moment, simplified form of function @var{ham} is supported -- all ``mixed'' terms (like @samp{x*p}->x*d/dx) are excluded. For example, in 2D case this function is effectively @math{ham = f(p,z) + g(x,z,u)}. However commutable combinations (like @samp{x*q}->x*d/dy) are allowed. Here variable @samp{u} is used for field amplitude |u|. This allow one solve nonlinear problems -- for example, for nonlinear Shrodinger equation you may set @code{ham="p^2 + q^2 - u^2"}. You may specify imaginary part for wave absorption, like @code{ham = "p^2 + i*x*(x>0)"}. See also @ref{apde}, @ref{qo2d}, @ref{qo3d}. @sref{PDE solving hints}
 @end deftypefn
 
+@anchor{apde}
+@deftypefn {MGL command} {} apde @sc{res} 'ham' ini_re ini_im [@code{dz=0.1 k0=100}]
+@ifclear UDAV
+@deftypefnx {Global function} @code{mglData} mglAPDE (@code{HMGL} gr, @code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{mreal} dz=@code{0.1}, @code{mreal} k0=@code{100}, @code{const char *}opt=@code{""})
+@deftypefnx {Global function} @code{mglDataC} mglAPDEc (@code{HMGL} gr, @code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{mreal} dz=@code{0.1}, @code{mreal} k0=@code{100}, @code{const char *}opt=@code{""})
+@deftypefnx {C function} @code{HMDT} mgl_pde_solve_adv (@code{HMGL} gr, @code{const char *}ham, @code{HCDT} ini_re, @code{HCDT} ini_im, @code{mreal} dz, @code{mreal} k0, @code{const char *}opt)
+@deftypefnx {C function} @code{HADT} mgl_pde_solve_adv_c (@code{HMGL} gr, @code{const char *}ham, @code{HCDT} ini_re, @code{HCDT} ini_im, @code{mreal} dz, @code{mreal} k0, @code{const char *}opt)
+@end ifclear
+Solves equation du/dz = i*k0*@var{ham}(p,q,x,y,z,|u|)[u], where p=-i/k0*d/dx, q=-i/k0*d/dy are pseudo-differential operators. Parameters @var{ini_re}, @var{ini_im} specify real and imaginary part of initial field distribution. Parameters @var{Min}, @var{Max} set the bounding box for the solution. Note, that really this ranges are increased by factor 3/2 for purpose of reducing reflection from boundaries. Parameter @var{dz} set the step along evolutionary coordinate z. The advanced and rather slow algorithm is used for taking into account both spatial dispersion and inhomogeneities of media [see A.A. Balakin, E.D. Gospodchikov, A.G. Shalashov, JETP letters v.104, p.690-695 (2016)]. Variable @samp{u} is used for field amplitude |u|. This allow one solve nonlinear problems -- for example, for nonlinear Shrodinger equation you may set @code{ham="p^2 + q^2 - u^2"}. You may specify imaginary part for wave absorption, like @code{ham = "p^2 + i*x*(x>0)"}. See also @ref{pde}. @sref{PDE solving hints}
+@end deftypefn
+
+
 @anchor{ray}
 @deftypefn {MGL command} {} ray @sc{res} 'ham' @code{x0 y0 z0 p0 q0 v0 [dt=0.1 tmax=10]}
 @ifclear UDAV
@@ -1558,7 +1752,9 @@ Solves GO ray equation like dr/dt = d @var{ham}/dp, dp/dt = -d @var{ham}/dr. Thi
 @deftypefn {MGL command} {} ode @sc{res} 'df' 'var' ini [@code{dt=0.1 tmax=10}]
 @ifclear UDAV
 @deftypefnx {Global function} @code{mglData} mglODE (@code{const char *}df, @code{const char *}var, @code{const mglDataA &}ini, @code{mreal} dt=@code{0.1}, @code{mreal} tmax=@code{10})
+@deftypefnx {Global function} @code{mglDataC} mglODEc (@code{const char *}df, @code{const char *}var, @code{const mglDataA &}ini, @code{mreal} dt=@code{0.1}, @code{mreal} tmax=@code{10})
 @deftypefnx {C function} @code{HMDT} mgl_ode_solve_str (@code{const char *}df, @code{const char *}var, @code{HCDT} ini, @code{mreal} dt, @code{mreal} tmax)
+@deftypefnx {C function} @code{HADT} mgl_ode_solve_str_c (@code{const char *}df, @code{const char *}var, @code{HCDT} ini, @code{mreal} dt, @code{mreal} tmax)
 @deftypefnx {C function} @code{HMDT} mgl_ode_solve (@code{void (*}df@code{)(const mreal *x, mreal *dx, void *par)}, @code{int} n, @code{const mreal *}ini, @code{mreal} dt, @code{mreal} tmax)
 @deftypefnx {C function} @code{HMDT} mgl_ode_solve_ex (@code{void (*}df@code{)(const mreal *x, mreal *dx, void *par)}, @code{int} n, @code{const mreal *}ini, @code{mreal} dt, @code{mreal} tmax, @code{void (*}bord@code{)(mreal *x, const mreal *xprev, void *par)})
 @end ifclear
@@ -1650,7 +1846,7 @@ Computes @var{num} points @{x[i]=res[0,i], y[i]=res[1,i]@} for fractal using ite
 x[i+1] = dat[0,i]*x[i] + dat[1,i]*y[i] + dat[4,i];
 y[i+1] = dat[2,i]*x[i] + dat[3,i]*y[i] + dat[5,i];
 @end verbatim
-Value @code{dat[6,i]} is used as weight factor for i-th row of matrix @var{dat}. At this first @var{skip} iterations will be omitted. Data array @var{dat} must have x-size greater or equal to 7. @sref{IFS sample}
+Value @code{dat[6,i]} is used as weight factor for i-th row of matrix @var{dat}. At this first @var{skip} iterations will be omitted. Data array @var{dat} must have x-size greater or equal to 7. @sref{Fractal sample}
 @end deftypefn
 
 @anchor{ifs3d}
@@ -1663,11 +1859,74 @@ Computes @var{num} points @{x[i]=res[0,i], y[i]=res[1,i], z[i]=res[2,i]@} for fr
 @verbatim
 x[i+1] = dat[0,i]*x[i] + dat[1,i]*y[i] + dat[2,i]*z[i] + dat[9,i];
 y[i+1] = dat[3,i]*x[i] + dat[4,i]*y[i] + dat[5,i]*z[i] + dat[10,i];
-z[i+1] = dat[6,i]*x[i] + dat[7,i]*y[i] + dat[8,i]*z[i] + dat[10,i];
+z[i+1] = dat[6,i]*x[i] + dat[7,i]*y[i] + dat[8,i]*z[i] + dat[11,i];
+@end verbatim
+Value @code{dat[12,i]} is used as weight factor for i-th row of matrix @var{dat}. At this first @var{skip} iterations will be omitted. Data array @var{dat} must have x-size greater or equal to 13. @sref{Fractal sample}
+@end deftypefn
+
+@anchor{ifsfile}
+@deftypefn {MGL command} {} ifsfile @sc{res} 'fname' 'name' @code{num} [@code{skip=20}]
+@ifclear UDAV
+@deftypefnx {Global function} @code{mglData} mglIFSfile (@code{const char *}fname, @code{const char *}name, @code{long} num, @code{long} skip=@code{20})
+@deftypefnx {C function} @code{HMDT} mgl_data_ifs_file (@code{const char *}fname, @code{const char *}name, @code{long} num, @code{long} skip)
+@end ifclear
+Reads parameters of IFS fractal named @var{name} from file @var{fname} and computes @var{num} points for this fractal. At this first @var{skip} iterations will be omitted. See also @ref{ifs2d}, @ref{ifs3d}.
+
+IFS file may contain several records. Each record contain the name of fractal (@samp{binary} in the example below) and the body of fractal, which is enclosed in curly braces @{@}. Symbol @samp{;} start the comment. If the name of fractal contain @samp{(3D)} or @samp{(3d)} then the 3d IFS fractal is specified. The sample below contain two fractals: @samp{binary} -- usual 2d fractal, and @samp{3dfern (3D)} -- 3d fractal.
+
+@verbatim
+ binary
+ { ; comment allowed here
+  ; and here
+  .5  .0 .0 .5 -2.563477 -0.000003 .333333   ; also comment allowed here
+  .5  .0 .0 .5  2.436544 -0.000003 .333333
+  .0 -.5 .5 .0  4.873085  7.563492 .333333
+  }
+
+ 3dfern (3D) {
+   .00  .00 0 .0 .18 .0 0  0.0 0.00 0 0.0 0 .01
+   .85  .00 0 .0 .85 .1 0 -0.1 0.85 0 1.6 0 .85
+   .20 -.20 0 .2 .20 .0 0  0.0 0.30 0 0.8 0 .07
+  -.20  .20 0 .2 .20 .0 0  0.0 0.30 0 0.8 0 .07
+  }
 @end verbatim
-Value @code{dat[12,i]} is used as weight factor for i-th row of matrix @var{dat}. At this first @var{skip} iterations will be omitted. Data array @var{dat} must have x-size greater or equal to 13. @sref{IFS sample}
 @end deftypefn
 
+@anchor{flame2d}
+@deftypefn {MGL command} {} flame2d @sc{res} dat func @code{num} [@code{skip=20}]
+@ifclear UDAV
+@deftypefnx {Global function} @code{mglData} mglFlame2d (@code{const mglDataA &}dat, @code{const mglDataA &}func, @code{long} num, @code{long} skip=@code{20})
+@deftypefnx {C function} @code{HMDT} mgl_data_flame_2d (@code{HCDT} dat, @code{HCDT} func, @code{long} num, @code{long} skip)
+@end ifclear
+Computes @var{num} points @{x[i]=res[0,i], y[i]=res[1,i]@} for "flame" fractal using iterated function system. Array @var{func} define "flame" function identificator (@var{func}[0,i,j]), its weight (@var{func}[0,i,j]) and arguments (@var{func}[2 ... 5,i,j]). Matrix @var{dat} set linear transformation of coordinates before applying the function. The resulting coordinates are
+@verbatim
+xx = dat[0,i]*x[j] + dat[1,j]*y[i] + dat[4,j];
+yy = dat[2,i]*x[j] + dat[3,j]*y[i] + dat[5,j];
+x[j+1] = sum_i @var{func}[1,i,j]*@var{func}[0,i,j]_x(xx, yy; @var{func}[2,i,j],...,@var{func}[5,i,j]);
+y[j+1] = sum_i @var{func}[1,i,j]*@var{func}[0,i,j]_y(xx, yy; @var{func}[2,i,j],...,@var{func}[5,i,j]);
+@end verbatim
+The possible function ids are: @code{mglFlame2d_linear=0,      mglFlame2d_sinusoidal,  mglFlame2d_spherical,   mglFlame2d_swirl,               mglFlame2d_horseshoe,
+       mglFlame2d_polar,               mglFlame2d_handkerchief,mglFlame2d_heart,               mglFlame2d_disc,                mglFlame2d_spiral,
+       mglFlame2d_hyperbolic,  mglFlame2d_diamond,             mglFlame2d_ex,                  mglFlame2d_julia,               mglFlame2d_bent,
+       mglFlame2d_waves,               mglFlame2d_fisheye,             mglFlame2d_popcorn,             mglFlame2d_exponential, mglFlame2d_power,
+       mglFlame2d_cosine,              mglFlame2d_rings,               mglFlame2d_fan,                 mglFlame2d_blob,                mglFlame2d_pdj,
+       mglFlame2d_fan2,                mglFlame2d_rings2,              mglFlame2d_eyefish,             mglFlame2d_bubble,              mglFlame2d_cylinder,
+       mglFlame2d_perspective, mglFlame2d_noise,               mglFlame2d_juliaN,              mglFlame2d_juliaScope,  mglFlame2d_blur,
+       mglFlame2d_gaussian,    mglFlame2d_radialBlur,  mglFlame2d_pie,                 mglFlame2d_ngon,                mglFlame2d_curl,
+       mglFlame2d_rectangles,  mglFlame2d_arch,                mglFlame2d_tangent,             mglFlame2d_square,              mglFlame2d_blade,
+       mglFlame2d_secant,              mglFlame2d_rays,                mglFlame2d_twintrian,   mglFlame2d_cross,               mglFlame2d_disc2,
+       mglFlame2d_supershape,  mglFlame2d_flower,              mglFlame2d_conic,               mglFlame2d_parabola,    mglFlame2d_bent2,
+       mglFlame2d_bipolar,             mglFlame2d_boarders,    mglFlame2d_butterfly,   mglFlame2d_cell,                mglFlame2d_cpow,
+       mglFlame2d_curve,               mglFlame2d_edisc,               mglFlame2d_elliptic,    mglFlame2d_escher,              mglFlame2d_foci,
+       mglFlame2d_lazySusan,   mglFlame2d_loonie,              mglFlame2d_preBlur,             mglFlame2d_modulus,             mglFlame2d_oscope,
+       mglFlame2d_polar2,              mglFlame2d_popcorn2,    mglFlame2d_scry,                mglFlame2d_separation,  mglFlame2d_split,
+       mglFlame2d_splits,              mglFlame2d_stripes,             mglFlame2d_wedge,               mglFlame2d_wedgeJulia,  mglFlame2d_wedgeSph,
+       mglFlame2d_whorl,               mglFlame2d_waves2,              mglFlame2d_exp,                 mglFlame2d_log,                 mglFlame2d_sin,
+       mglFlame2d_cos,                 mglFlame2d_tan,                 mglFlame2d_sec,                 mglFlame2d_csc,                 mglFlame2d_cot,
+       mglFlame2d_sinh,                mglFlame2d_cosh,                mglFlame2d_tanh,                mglFlame2d_sech,                mglFlame2d_csch,
+       mglFlame2d_coth,                mglFlame2d_auger,               mglFlame2d_flux.}
+Value @code{dat[6,i]} is used as weight factor for i-th row of matrix @var{dat}. At this first @var{skip} iterations will be omitted. Sizes of data arrays must be: @var{dat}.nx>=7, @var{func}.nx>=2 and @var{func}.nz=@var{dat}.ny.  @sref{Fractal sample}
+@end deftypefn
 
 
 @c ------------------------------------------------------------------
@@ -1793,7 +2052,6 @@ Create variable which reference @var{col}-th column of data @var{d}.
 Set reference to another column of the same data and its name.
 @end deftypefn
 
-
 @heading Class @code{mglDataR}
 represent named reference to row of another data array.
 @deftypefn {Constructor on @code{mglDataR}} @code{} mglDataR (@code{const mglDataR &} d)
@@ -1807,6 +2065,40 @@ Create variable which reference @var{row}-th row of data @var{d}.
 Set reference to another row of the same data and its name.
 @end deftypefn
 
+@heading Class @code{mglDataW}
+represent FFT frequency as data array.
+@deftypefn {Constructor on @code{mglDataW}} @code{} mglDataW (@code{const mglDataW &} d)
+Copy constructor.
+@end deftypefn
+@deftypefn {Constructor on @code{mglDataW}} @code{} mglDataW (@code{long} xx=@code{1}, @code{long} yy=@code{1}, @code{long} zz=@code{1}, @code{double} dp=@code{0}, @code{char} dir=@code{'x'})
+Set frequency sizes, direction @var{dir} and increment @var{dp}.
+@end deftypefn
+@deftypefn {Method on @code{mglDataR}} @code{void} Freq (@code{double} dp, @code{char} dir=@code{'x'})
+Equidistantly fill the data with step @var{dp} in direction @var{dir}.
+@end deftypefn
+
+
+@heading Class @code{mglDataS}
+incapsulate std::vector and present it as data array.
+@deftypecv {Variable} mglDataS @code{std::vector<mreal>} dat
+Data array itself.
+@end deftypecv
+@deftypefn {Constructor on @code{mglDataS}} @code{} mglDataS (@code{const mglDataS &} d)
+Copy constructor.
+@end deftypefn
+@deftypefn {Constructor on @code{mglDataS}} @code{} mglDataS (@code{const std::vector<mreal> &} d)
+Create copy data from @var{d}.
+@end deftypefn
+@deftypefn {Constructor on @code{mglDataS}} @code{} mglDataS (@code{size_t} s)
+Allocate memory for @var{s} .
+@end deftypefn
+@deftypefn {Method on @code{mglDataS}} @code{void} reserve (@code{size_t} num)
+Reserve space for @var{num} elements.
+@end deftypefn
+@deftypefn {Method on @code{mglDataS}} @code{void} push_back (@code{double} v)
+Appends value @var{v} to the end of data.
+@end deftypefn
+
 @end ifclear
 
 @external{}
index ab646042a199d7d9a922171215db2e0cb9a26623..4cbad380cc421f496b437215304c14f9ce49ca25 100644 (file)
@@ -162,6 +162,16 @@ There are many functions, which can create data for output (see @ref{Data fillin
 Копирует данные из другого экземпляра данных. Если указана формула @var{eq}, то данные заполняются также как при использовании @ref{fill}.
 @end deftypefn
 
+@deftypefn {Команда MGL} {} copy @sc{redat} @sc{imdat} dat2
+Копирует действительную и мнимую часть данных из комплексного массива данных @var{dat2}.
+@end deftypefn
+
+@deftypefn {Команда MGL} {} copy @sc{dat} 'name'
+Копирует данные из другого экземпляра данных с именем @var{name}. При этом имя @var{name} может быть некорректным с точки зрения MGL (например, взятым из HDF5 файла).
+@end deftypefn
+
+
+
 @deftypefn {Команда MGL} {} read @sc{dat} 'fname'
 @ifclear UDAV
 @deftypefnx {Конструктор класса @code{mglData}} {} mglData (@code{const char *}fname)
@@ -173,6 +183,7 @@ There are many functions, which can create data for output (see @ref{Data fillin
 @end deftypefn
 
 @deftypefn {Команда MGL} {} delete dat
+@deftypefnx {Команда MGL} {} delete 'name'
 @ifclear UDAV
 @deftypefnx {Destructor on @code{mglData}} {} ~mglData ()
 @deftypefnx {Функция С} @code{void} mgl_delete_data (@code{HMDT} dat)
@@ -278,6 +289,16 @@ a_ij^new = a_i^old where j=0...@var{n1}. Соответственно, для @v
 Обрезает границы данных при @var{i}<@var{n1} и @var{i}>@var{n2} (при @var{n2}>0) или @var{i}>@code{n[xyz]}-@var{n2} (при @var{n2}<=0) вдоль направления @var{dir}.
 @end deftypefn
 
+@deftypefn {Команда MGL} {} crop dat 'how'
+@ifclear UDAV
+@deftypefnx {Метод класса @code{mglData}} @code{void} Crop (@code{const char *}how=@code{"235x"})
+@deftypefnx {Метод класса @code{mglDataC}} @code{void} Crop (@code{const char *}how=@code{"235x"})
+@deftypefnx {Функция Сn} @code{void} mgl_data_crop_opt (@code{HMDT} dat, @code{const char *}how)
+@deftypefnx {Функция Сn} @code{void} mgl_datac_crop_opt (@code{HADT} dat, @code{const char *}how)
+@end ifclear
+Обрезает дальний край данных, чтобы сделать их более оптимальным для быстрого преобразования Фурье. Размер массива будет равен наиболее близким к исходному из 2^n*3^m*5^l. Строка @var{how} может содержать: @samp{x}, @samp{y}, @samp{z} для направлений, и @samp{2}, @samp{3}, @samp{5} для использования соответствующего основания.
+@end deftypefn
+
 @anchor{insert}
 @deftypefn {Команда MGL} {} insert dat 'dir' @code{[pos=off num=0]}
 @ifclear UDAV
@@ -300,6 +321,11 @@ a_ij^new = a_i^old where j=0...@var{n1}. Соответственно, для @v
 Удаляет @var{num} срезов вдоль направления @var{dir} с позиции @var{pos}.
 @end deftypefn
 
+@deftypefn {Команда MGL} {} delete dat
+@deftypefnx {Команда MGL} {} delete 'name'
+Удаляет массив данных из памяти.
+@end deftypefn
+
 @anchor{sort}
 @deftypefn {Команда MGL} {} sort dat @code{idx [idy=-1]}
 @ifclear UDAV
@@ -425,7 +451,7 @@ a_ij^new = a_i^old where j=0...@var{n1}. Соответственно, для @v
 @end deftypefn
 
 
-@deftypefn {Method on @code{mglData}} @code{void} SetList (@code{long} n, ...)
+@deftypefn {Метод класса @code{mglData}} @code{void} SetList (@code{long} n, ...)
 Allocate memory and set data from variable argument list of @emph{double} values. Note, you need to specify decimal point @samp{.} for integer values! For example, the code @code{SetList(2,0.,1.);} is correct, but the code @code{SetList(2,0,1);} is incorrect.
 @end deftypefn
 
@@ -456,9 +482,7 @@ Allocate memory and set data from variable argument list of @emph{double} values
 Заполняет значениями равно распределёнными в диапазоне [@var{x1}, @var{x2}] в направлении @var{dir}=@{@samp{x},@samp{y},@samp{z}@}.
 @end deftypefn
 
-@deftypefn {Команда MGL} {} fill dat 'eq'
-@deftypefnx {Команда MGL} {} fill dat 'eq' vdat
-@deftypefnx {Команда MGL} {} fill dat 'eq' vdat wdat
+@deftypefn {Команда MGL} {} fill dat 'eq'[vdat wdat]
 @ifclear UDAV
 @deftypefnx {Метод класса @code{mglData}} @code{void} Fill (@code{HMGL} gr, @code{const char *}eq, @code{const char *}opt=@code{""})
 @deftypefnx {Метод класса @code{mglData}} @code{void} Fill (@code{HMGL} gr, @code{const char *}eq, @code{const mglDataA &}vdat, @code{const char *}opt=@code{""})
@@ -474,8 +498,7 @@ Allocate memory and set data from variable argument list of @emph{double} values
 
 @anchor{modify}
 @deftypefn {Команда MGL} {} modify dat 'eq' [@code{dim=0}]
-@deftypefnx {Команда MGL} {} modify dat 'eq' vdat
-@deftypefnx {Команда MGL} {} modify dat 'eq' vdat wdat
+@deftypefnx {Команда MGL} {} modify dat 'eq' vdat [wdat]
 @ifclear UDAV
 @deftypefnx {Метод класса @code{mglData}} @code{void} Modify (@code{const char *}eq, @code{int} dim=@code{0})
 @deftypefnx {Метод класса @code{mglData}} @code{void} Modify (@code{const char *}eq, @code{const mglDataA &}v)
@@ -514,7 +537,7 @@ Allocate memory and set data from variable argument list of @emph{double} values
 
 
 @anchor{put}
-@deftypefn {Команда MGL} {} put dat @code{val [i=: j=: k=:]}
+@deftypefn {Команда MGL} {} put dat @code{val [i=all j=all k=all]}
 @ifclear UDAV
 @deftypefnx {Метод класса @code{mglData}} @code{void} Put (@code{mreal} val, @code{int} i=@code{-1}, @code{int} j=@code{-1}, @code{int} k=@code{-1})
 @deftypefnx {Метод класса @code{mglDataC}} @code{void} Put (@code{dual} val, @code{int} i=@code{-1}, @code{int} j=@code{-1}, @code{int} k=@code{-1})
@@ -524,7 +547,7 @@ Allocate memory and set data from variable argument list of @emph{double} values
 Присваивает значения (под-)массива @var{dat}[@var{i}, @var{j}, @var{k}] = @var{val}. Индексы @var{i}, @var{j}, @var{k} равные @samp{-1} задают значения @var{val} для всего диапазона соответствующего направления(ий). Например, @code{Put(val,-1,0,-1);} задает a[i,0,j]=@var{val} для i=0...(nx-1), j=0...(nz-1).
 @end deftypefn
 
-@deftypefn {Команда MGL} {} put dat vdat [@code{i=: j=: k=:}]
+@deftypefn {Команда MGL} {} put dat vdat [@code{i=all j=all k=all}]
 @ifclear UDAV
 @deftypefnx {Метод класса @code{mglData}} @code{void} Put (@code{const mglDataA &}v, @code{int} i=@code{-1}, @code{int} j=@code{-1}, @code{int} k=@code{-1})
 @deftypefnx {Метод класса @code{mglDataC}} @code{void} Put (@code{const mglDataA &}v, @code{int} i=@code{-1}, @code{int} j=@code{-1}, @code{int} k=@code{-1})
@@ -557,7 +580,7 @@ Allocate memory and set data from variable argument list of @emph{double} values
 @anchor{gspline}
 @deftypefn {Команда MGL} {} gspline dat xdat vdat [sl=-1]
 @ifclear UDAV
-@deftypefnx {Method on @code{mglData}} @code{void} RefillGS (@code{const mglDataA &}x, @code{const mglDataA &}v, @code{mreal} x1, @code{mreal} x2, @code{long} sl=@code{-1})
+@deftypefnx {Метод класса @code{mglData}} @code{void} RefillGS (@code{const mglDataA &}x, @code{const mglDataA &}v, @code{mreal} x1, @code{mreal} x2, @code{long} sl=@code{-1})
 @deftypefnx {Функция С} @code{void} mgl_data_refill_gs (@code{HMDT} a, @code{HCDT} x, @code{HCDT} v, @code{mreal} x1, @code{mreal} x2, @code{long} sl)
 @end ifclear
 Заполняет значениями глобального кубического сплайна для массива @var{v} в точках @var{x}=@code{X[i]}, где @code{X} равномерно распределен в диапазоне [@var{x1},@var{x2}] и имеет такой же размер как и заполняемый массив. Если параметр @var{sl} равен 0 или положительный, то изменятся будет только @var{sl}-ый срез.
@@ -592,6 +615,7 @@ Allocate memory and set data from variable argument list of @emph{double} values
 
 @anchor{read}
 @deftypefn {Команда MGL} {} read @sc{dat} 'fname'
+@deftypefnx {Команда MGL} {} read @sc{redat} @sc{imdat} 'fname'
 @ifclear UDAV
 @deftypefnx {Метод класса @code{mglData}} @code{void} Read (@code{const char *}fname)
 @deftypefnx {Метод класса @code{mglDataC}} @code{bool} Read (@code{const char *}fname)
@@ -602,6 +626,7 @@ Allocate memory and set data from variable argument list of @emph{double} values
 @end deftypefn
 
 @deftypefn {Команда MGL} {} read @sc{dat} 'fname' @code{mx [my=1 mz=1]}
+@deftypefnx {Команда MGL} {} read @sc{redat} @sc{imdat} 'fname' @code{mx [my=1 mz=1]}
 @ifclear UDAV
 @deftypefnx {Метод класса @code{mglData}} @code{void} Read (@code{const char *}fname, @code{int} mx, @code{int} my=@code{1}, @code{int} mz=@code{1})
 @deftypefnx {Метод класса @code{mglDataC}} @code{bool} Read (@code{const char *}fname, @code{int} mx, @code{int} my=@code{1}, @code{int} mz=@code{1})
@@ -696,6 +721,21 @@ Allocate memory and set data from variable argument list of @emph{double} values
 Помещает имена массивов данных в HDF5 файле @var{fname} в строку @var{buf} разделёнными символом табуляции '\t'. В версии MGL имена массивов будут выведены как сообщение. Функция ничего не делает если библиотека была собрана без поддержки HDF5.
 @end deftypefn
 
+@anchor{openhdf}
+@deftypefn {Команда MGL} {} openhdf 'fname'
+@ifclear UDAV
+@deftypefnx {Метод класса @code{mglParse}} @code{void} OpenHDF (@code{const char *}fname)
+@deftypefnx {Функция С} @code{void} mgl_parser_openhdf (@code{HMPR} pr, @code{const char *}fname)
+@end ifclear
+Читает все массивы данных из HDF5 файла @var{fname} и создает переменные MGL с соответствующими именами. Если имя данных начинается с @samp{!}, то будут созданы комплексные массивы.
+@end deftypefn
+
+@ifclear UDAV
+@deftypefn {Функция С} @code{const char * const *} mgl_datas_hdf_str (@code{HMPR} pr, @code{const char *}fname)
+Помещает имена данных из HDF файла @var{fname} в массив строк (последняя строка ""). Массив строк будет изменен при следующем вызове функции.
+@end deftypefn
+@end ifclear
+
 @anchor{import}
 @deftypefn {Команда MGL} {} import @sc{dat} 'fname' 'sch' [@code{v1=0 v2=1}]
 @ifclear UDAV
@@ -735,7 +775,7 @@ Allocate memory and set data from variable argument list of @emph{double} values
 @cindex AutoCorrel
 
 @anchor{subdata}
-@deftypefn {Команда MGL} {} subdata @sc{res} dat @code{xx [yy=: zz=:]}
+@deftypefn {Команда MGL} {} subdata @sc{res} dat @code{xx [yy=all zz=all]}
 @ifclear UDAV
 @deftypefnx {Метод класса @code{mglData}} @code{mglData} SubData (@code{mreal} xx, @code{mreal} yy=@code{-1}, @code{mreal} zz=@code{-1}) @code{const}
 @deftypefnx {Метод класса @code{mglDataC}} @code{mglData} SubData (@code{mreal} xx, @code{mreal} yy=@code{-1}, @code{mreal} zz=@code{-1}) @code{const}
@@ -744,7 +784,7 @@ Allocate memory and set data from variable argument list of @emph{double} values
 Возвращает в @var{res} подмассив массива данных @var{dat} с фиксированными значениями индексов с положительными значениями. Например, @code{SubData(-1,2)} выделяет третью строку (индексы начинаются с нуля), @code{SubData(4,-1)} выделяет 5-ую колонку, @code{SubData(-1,-1,3)} выделяет 4-ый срез и т.д. В MGL скриптах обычно используется упрощенная версия @code{dat(xx,yy,zz)}. Функция возвращает NULL или пустой массив если данные не могут быть созданы при данных значениях аргументов.
 @end deftypefn
 
-@deftypefn {Команда MGL} {} subdata @sc{res} dat xdat [ydat=: zdat=:]
+@deftypefn {Команда MGL} {} subdata @sc{res} dat xdat [ydat zdat]
 @ifclear UDAV
 @deftypefnx {Метод класса @code{mglData}} @code{mglData} SubData (@code{const mglDataA &}xx, @code{const mglDataA &}yy, @code{const mglDataA &}zz) @code{const}
 @deftypefnx {Метод класса @code{mglDataC}} @code{mglData} SubData (@code{const mglDataA &}xx, @code{const mglDataA &}yy, @code{const mglDataA &}zz) @code{const}
@@ -790,6 +830,22 @@ Allocate memory and set data from variable argument list of @emph{double} values
 Возвращает массив данных, полученный в результате интерполяции исходного массива в точках других массивов (например, res[i,j]=dat[idat[i,j],jdat[i,j]]). Размеры массивов @var{idat}, @var{jdat}, @var{kdat} должны совпадать. Координаты в @var{idat}, @var{jdat}, @var{kdat} полагаются нормированными в диапазон [0,1] (при @var{norm}=@code{true}) или в диапазоны [0,nx], [0,ny], [0,nz] соответственно. Функция возвращает NULL или пустой массив если данные не могут быть созданы при данных значениях аргументов.
 @end deftypefn
 
+@anchor{section}
+@deftypefn {Команда MGL} {} section @sc{res} dat ids ['dir'='y' @code{val=nan}]
+@deftypefnx {Команда MGL} {} section @sc{res} dat @code{id} ['dir'='y' @code{val=nan}]
+@ifclear UDAV
+@deftypefnx {Метод класса @code{mglData}} @code{mglData} Section (@code{const mglDataA &}ids, @code{const char *}dir=@code{'y'}, @code{mreal} val=@code{NAN}) @code{const}
+@deftypefnx {Метод класса @code{mglData}} @code{mglData} Section (@code{long} id, @code{const char *}dir=@code{'y'}, @code{mreal} val=@code{NAN}) @code{const}
+@deftypefnx {Метод класса @code{mglDataC}} @code{mglData} Section (@code{const mglDataA &}ids, @code{const char *}dir=@code{'y'}, @code{mreal} val=@code{NAN}) @code{const}
+@deftypefnx {Метод класса @code{mglDataC}} @code{mglData} Section (@code{long} id, @code{const char *}dir=@code{'y'}, @code{mreal} val=@code{NAN}) @code{const}
+@deftypefnx {Функция С} @code{HMDT} mgl_data_section (@code{HCDT} dat, @code{HCDT} ids, @code{const char *}dir, @code{mreal} val)
+@deftypefnx {Функция С} @code{HMDT} mgl_data_section_val (@code{HCDT} dat, @code{long} id, @code{const char *}dir, @code{mreal} val)
+@deftypefnx {Функция С} @code{HADT} mgl_datac_section (@code{HCDT} dat, @code{HCDT} ids, @code{const char *}dir, @code{mreal} val)
+@deftypefnx {Функция С} @code{HADT} mgl_datac_section_val (@code{HCDT} dat, @code{long} id, @code{const char *}dir, @code{mreal} val)
+@end ifclear
+Возвращает массив данных, являющийся @var{id}-ой секцией (диапазоном срезов, разделенных значениями @var{val}) исходного массива @var{dat}. Для @var{id}<0 используется обратный порядок (т.e. -1 даст последнюю секцию). Если указано несколько @var{ids}, то выходной массив будет результатом последовательного объединения секций.
+@end deftypefn
+
 @anchor{solve}
 @deftypefn {Команда MGL} {} solve @sc{res} dat @code{val} 'dir' [@code{norm=on}]
 @deftypefnx {Команда MGL} {} solve @sc{res} dat @code{val} 'dir' idat [@code{norm=on}]
@@ -812,6 +868,15 @@ Allocate memory and set data from variable argument list of @emph{double} values
 Возвращает массив корней уравнения 'func'=0 для переменной @var{var} с начальными положениями @var{ini}. Функция возвращает NULL или пустой массив если данные не могут быть созданы при данных значениях аргументов.
 @end deftypefn
 
+@anchor{detect}
+@deftypefn {Команда MGL} {} detect @sc{res} dat @code{lvl dj [di=0 minlen=0]}
+@ifclear UDAV
+@deftypefnx {Метод класса @code{mglData}} @code{mglData} Detect (@code{mreal} lvl, @code{mreal} dj, @code{mreal} di=@code{0}, @code{mreal} minlen=@code{0}) @code{const}
+@deftypefnx {Функция С} @code{HMDT} mgl_data_detect (@code{HCDT} dat, @code{mreal} lvl, @code{mreal} dj, @code{mreal} di, @code{mreal} minlen)
+@end ifclear
+Возвращает массив кривых @{x,y@}, разделенных NAN значениями, для локальных максимумов массива @var{dat} как функцию координаты x. Шумы амплитудой меньше @var{lvl} игнорируются. Параметр @var{dj} (в диапазоне [0,ny]) задает область "притяжения" точек в y-направлении к кривой. Аналогично, @var{di} продолжает кривые в x-направлении через разрывы длиной менее @var{di} точек. Кривые с минимальной длинной менее @var{minlen} игнорируются.
+@end deftypefn
+
 @anchor{hist}
 @deftypefn {Команда MGL} {} hist @sc{res} dat @code{num v1 v2 [nsub=0]}
 @deftypefnx {Команда MGL} {} hist @sc{res} dat wdat @code{num v1 v2 [nsub=0]}
@@ -990,11 +1055,16 @@ These functions change the data in some direction like differentiations, integra
 Выполняет дифференцирование в выбранном направлении(ях).
 @end deftypefn
 
-@deftypefn {Команда MGL} {} diff dat xdat ydat [zdat=0]
+@deftypefn {Команда MGL} {} diff dat xdat ydat [zdat]
 @ifclear UDAV
+@deftypefnx {Метод класса @code{mglData}} @code{void} Diff (@code{const mglDataA &}x)
 @deftypefnx {Метод класса @code{mglData}} @code{void} Diff (@code{const mglDataA &}x, @code{const mglDataA &}y)
 @deftypefnx {Метод класса @code{mglData}} @code{void} Diff (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z)
+@deftypefnx {Метод класса @code{mglDataC}} @code{void} Diff (@code{const mglDataA &}x)
+@deftypefnx {Метод класса @code{mglDataC}} @code{void} Diff (@code{const mglDataA &}x, @code{const mglDataA &}y)
+@deftypefnx {Метод класса @code{mglDataC}} @code{void} Diff (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z)
 @deftypefnx {Функция С} @code{void} mgl_data_diff_par (@code{HMDT} dat, @code{HCDT} x, @code{HCDT}y, @code{HCDT}z)
+@deftypefnx {Функция С} @code{void} mgl_datac_diff_par (@code{HADT} dat, @code{HCDT} x, @code{HCDT}y, @code{HCDT}z)
 @end ifclear
 Выполняет дифференцирование данных, параметрически зависящих от координат, в направлении @var{x} с @var{y}, @var{z}=constant. Параметр @var{z} может быть опущен, что соответствует 2D случаю. Используются следующие формулы (2D случай): @math{da/dx = (a_j*y_i-a_i*y_j)/(x_j*y_i-x_i*y_j)}, где @math{a_i=da/di, a_j=da/dj} обозначает дифференцирование вдоль 1-ой и 2-ой размерности. Похожие формулы используются и в 3D случае. Порядок аргументов можно менять -- например, если данные a(i,j) зависят от координат @{x(i,j), y(i,j)@}, то обычная производная по @samp{x} будет равна @code{Diff(x,y);}, а обычная производная по @samp{y} будет равна @code{Diff(y,x);}.
 @end deftypefn
@@ -1099,14 +1169,27 @@ These functions change the data in some direction like differentiations, integra
 @end deftypefn
 
 @anchor{smooth}
-@deftypefn {Команда MGL} {} smooth data @code{type} ['dir'='xyz']
+@deftypefn {Команда MGL} {} smooth data ['dir'='xyz']
 @ifclear UDAV
 @deftypefnx {Метод класса @code{mglData}} @code{void} Smooth (@code{const char *}dir=@code{"xyz"}, @code{mreal} delta=@code{0})
 @deftypefnx {Метод класса @code{mglDataC}} @code{void} Smooth (@code{const char *}dir=@code{"xyz"}, @code{mreal} delta=@code{0})
 @deftypefnx {Функция С} @code{void} mgl_data_smooth (@code{HMDT} dat, @code{const char *}dir, @code{mreal} delta)
 @deftypefnx {Функция С} @code{void} mgl_datac_smooth (@code{HADT} dat, @code{const char *}dir, @code{mreal} delta)
 @end ifclear
-Сглаживает данные в выбранном направлении(ях) @var{dir}. Строка @var{dirs} задает направления вдоль которых будет производиться сглаживание. Если @var{dirs} содержит: @samp{0} -- ничего не делает, @samp{3} линейное усреднение по 3 точкам, @samp{5} линейное усреднение по 5 точкам. Если @var{dir} содержит символы @samp{dN} (где @samp{N} -- цифра 1,2,...,9), то используется линейное усреднение по (2*N+1)-ой точке. По умолчанию используется квадратичное усреднение по 5 точкам.
+Сглаживает данные в выбранном направлении(ях) @var{dir}. Строка @var{dirs} задает направления вдоль которых будет производиться сглаживание. Строка @var{dir} может содержать:
+@itemize @bullet
+@item
+@samp{xyz} -- сглаживание по x-,y-,z-направлениям,
+@item
+@samp{0} -- ничего не делает,
+@item
+@samp{3} -- линейное усреднение по 3 точкам,
+@item
+@samp{5} -- линейное усреднение по 5 точкам,
+@item
+@samp{d1}...@samp{d9} -- линейное усреднение по (2*N+1) точкам.
+@end itemize
+По умолчанию используется квадратичное усреднение по 5 точкам.
 @end deftypefn
 
 @anchor{envelop}
@@ -1118,10 +1201,37 @@ These functions change the data in some direction like differentiations, integra
 Находит огибающую данных в выбранном направлении @var{dir}.
 @end deftypefn
 
+@anchor{diffract}
+@deftypefn {Команда MGL} {} diffract dat 'how' @code{q}
+@ifclear UDAV
+@deftypefnx {Метод класса @code{mglDataC}} @code{void} Diffraction (@code{const char *}how, @code{mreal} q)
+@deftypefnx {Функция С} @code{void} mgl_datac_diffr (@code{HADT} dat, @code{const char *}how, @code{mreal} q)
+@end ifclear
+Вычисляет один шаг диффракции в конечно-разностной схеме с параметром @var{q}=@math{\delta t/\delta x^2} используя метод третьего порядка точности. Параметр @var{how} может содержать:
+@itemize @bullet
+ @item @samp{xyz} для расчета вдоль x-,y-,z-направления;
+@item
+ @samp{r} для аксиально симметричного лапласиана по направлению x;
+@item
+ @samp{0} для нулевых граничных условий;
+@item
+ @samp{1} для постоянных граничных условий;
+@item
+ @samp{2} для линейных граничных условий;
+@item
+ @samp{3} для параболлических граничных условий;
+@item
+ @samp{4} для экспоненциальных граничных условий;
+@item
+ @samp{5} для гауссовых граничных условий.
+@end itemize
+@end deftypefn
+
 @anchor{norm}
 @deftypefn {Команда MGL} {} norm dat @code{v1 v2 [sym=off dim=0]}
 @ifclear UDAV
-@deftypefnx {Метод класса @code{mglData}} @code{void} Norm (@code{mreal} v1=@code{0}, @code{mreal} v2=@code{1}, @code{bool} sym=@code{false}, @code{int} dim=@code{0})
+@deftypefnx {Метод класса @code{mglData}} @code{void} Norm (@code{mreal} v1=@code{0}, @code{mreal} v2=@code{1}, @code{bool} sym=@code{false}, @code{long} dim=@code{0})
+@deftypefnx {Функция С} @code{void} mgl_data_norm (@code{HMDT} dat, @code{mreal} v1, @code{mreal} v2, @code{int} sym, @code{long} dim)
 @end ifclear
 Нормирует данные в интервал [@var{v1},@var{v2}]. Если @var{sym}=@code{true}, то используется симметричный интервал [-max(|v1|,|v2|), max(|v1|,|v2|)]. Изменения применяются только к срезам >=@var{dim}.
 @end deftypefn
@@ -1129,8 +1239,8 @@ These functions change the data in some direction like differentiations, integra
 @anchor{normsl}
 @deftypefn {Команда MGL} {} normsl dat @code{v1 v2} ['dir'='z' @code{keep=on sym=off}]
 @ifclear UDAV
-@deftypefnx {Метод класса @code{mglData}} @code{void} NormSl (@code{mreal} v1=@code{0}, @code{mreal} v2=@code{1}, @code{char} dir=@code{'z'}, @code{bool} keep_en=@code{true}, @code{bool} sym=@code{false})
-@deftypefnx {Функция С} @code{void} mgl_data_norm_slice (@code{HMDT} dat, @code{mreal} v1, @code{mreal} v2, @code{char} dir, @code{int} keep_en, @code{int} sym)
+@deftypefnx {Метод класса @code{mglData}} @code{void} NormSl (@code{mreal} v1=@code{0}, @code{mreal} v2=@code{1}, @code{char} dir=@code{'z'}, @code{bool} keep=@code{true}, @code{bool} sym=@code{false})
+@deftypefnx {Функция С} @code{void} mgl_data_norm_slice (@code{HMDT} dat, @code{mreal} v1, @code{mreal} v2, @code{char} dir, @code{int} keep, @code{int} sym)
 @end ifclear
 Нормирует данные срез-за-срезом в выбранном направлении @var{dir} в интервал [@var{v1},@var{v2}]. Если @var{sym}=@code{true}, то используется симметричный интервал [-max(|v1|,|v2|), max(|v1|,|v2|)]. Если @var{keep}=@code{true}, то максимальное значение k-го среза ограничено величиной
 @iftex
@@ -1141,6 +1251,35 @@ These functions change the data in some direction like differentiations, integra
 @end ifnottex
 @end deftypefn
 
+@anchor{limit}
+@deftypefn {Команда MGL} {} limit dat @code{val}
+@ifclear UDAV
+@deftypefnx {Метод класса @code{mglData}} @code{void} Limit (@code{mreal} val)
+@deftypefnx {Метод класса @code{mglDataC}} @code{void} Limit (@code{mreal} val)
+@deftypefnx {Функция С} @code{void} mgl_data_limit (@code{HMDT} dat, @code{mreal} val)
+@deftypefnx {Функция С} @code{void} mgl_datac_limit (@code{HADT} dat, @code{mreal} val)
+@end ifclear
+Ограничивает амплитуду данных диапазоном [-@var{val},@var{val}]. При этом сохраняется исходный знак (фаза для комплексных чисел). Эквивалентно операции @code{a[i] *= abs(a[i])<val?1.:val/abs(a[i]);}.
+@end deftypefn
+
+@anchor{dilate}
+@deftypefn {Команда MGL} {} dilate dat @code{[val=1 step=1]}
+@ifclear UDAV
+@deftypefnx {Метод класса @code{mglData}} @code{void} Dilate (@code{mreal} val=@code{1}, @code{long} step=@code{1})
+@deftypefnx {Функция С} @code{void} mgl_data_dilate (@code{HMDT} dat, @code{mreal} val, @code{long} step)
+@end ifclear
+Возвращает "расширенный" на @var{step} ячеек массив из 0 и 1 для данных больших порогового значения @var{val}. @c TODO @sref{Dilate and erode sample}
+@end deftypefn
+
+@anchor{erode}
+@deftypefn {Команда MGL} {} erode dat @code{[val=1 step=1]}
+@ifclear UDAV
+@deftypefnx {Метод класса @code{mglData}} @code{void} Erode (@code{mreal} val=@code{1}, @code{long} step=@code{1})
+@deftypefnx {Функция С} @code{void} mgl_data_erode (@code{HMDT} dat, @code{mreal} val, @code{long} step)
+@end ifclear
+Возвращает "суженный" на @var{step} ячеек массив из 0 и 1 для данных больших порогового значения @var{val}. @c TODO @sref{Dilate and erode sample}
+@end deftypefn
+
 @c ------------------------------------------------------------------
 @external{}
 @node Interpolation, Data information, Data changing, Data processing
@@ -1312,6 +1451,22 @@ These functions change the data in some direction like differentiations, integra
 Возвращает минимальное значение массива данных и его приближенное (интерполированное) положение в переменные @var{x}, @var{y}, @var{z}.
 @end deftypefn
 
+@anchor{.mxf} @anchor{.myf} @anchor{.mzf}
+@anchor{.mxl} @anchor{.myl} @anchor{.mzl}
+@deftypefn {MGL suffix} {(dat)} .mxf
+@deftypefnx {MGL suffix} {(dat)} .myf
+@deftypefnx {MGL suffix} {(dat)} .mzf
+@deftypefnx {MGL suffix} {(dat)} .mxl
+@deftypefnx {MGL suffix} {(dat)} .myl
+@deftypefnx {MGL suffix} {(dat)} .mzl
+@ifclear UDAV
+@deftypefnx {Метод класса @code{mglDataA}} @code{long} Maximal (@code{char} dir, @code{long} from) @code{const}
+@deftypefnx {Метод класса @code{mglDataA}} @code{long} Maximal (@code{char} dir, @code{long} from, @code{long} &p1, @code{long} &p2) @code{const}
+@deftypefnx {Функция С} @code{mreal} mgl_data_max_firstl (@code{HCDT} dat, @code{char} dir, @code{long} from, @code{long} *p1, @code{long} *p2)
+@end ifclear
+Возвращает положение первого (последнего при @var{from}<0) максимума в направлении @var{dir}, начиная с позиции @var{from}. Положение остальных координат для максимума сохраняется в @var{p1}, @var{p2}.
+@end deftypefn
+
 
 @cindex Momentum
 @anchor{.ax} @anchor{.ay} @anchor{.az} @anchor{.aa} @anchor{.sum}
@@ -1487,7 +1642,7 @@ These functions change the data in some direction like differentiations, integra
 @anchor{transform}
 @deftypefn {Команда MGL} {} transform @sc{dat} 'type' real imag
 @ifclear UDAV
-@deftypefnx {Global function} @code{mglData} mglTransform (@code{const mglDataA &}real, @code{const mglDataA &}imag, @code{const char *}type)
+@deftypefnx {Общая функция} @code{mglData} mglTransform (@code{const mglDataA &}real, @code{const mglDataA &}imag, @code{const char *}type)
 @deftypefnx {Функция С} @code{HMDT} mgl_transform (@code{HCDT} real, @code{HCDT} imag, @code{const char *}type)
 @end ifclear
 Выполняет интегральное преобразование комплексных данных @var{real}, @var{imag} в выбранном направлении и возвращает модуль результата. Порядок и тип преобразований задается строкой @var{type}: первый символ для x-направления, второй для y-направления, третий для z-направления. Возможные символы: @samp{f} -- прямое преобразование Фурье, @samp{i} -- обратное преобразование Фурье, @samp{s} -- синус преобразование, @samp{c} -- косинус преобразование, @samp{h} -- преобразование Ханкеля, @samp{n} или @samp{ } -- нет преобразования.
@@ -1496,7 +1651,7 @@ These functions change the data in some direction like differentiations, integra
 @anchor{transforma}
 @deftypefn {Команда MGL} {} transforma @sc{dat} 'type' ampl phase
 @ifclear UDAV
-@deftypefnx {Global function} @code{mglData} mglTransformA @code{const mglDataA &}ampl, @code{const mglDataA &}phase, @code{const char *}type)
+@deftypefnx {Общая функция} @code{mglData} mglTransformA @code{const mglDataA &}ampl, @code{const mglDataA &}phase, @code{const char *}type)
 @deftypefnx {Функция С} @code{HMDT} mgl_transform_a @code{HCDT} ampl, @code{HCDT} phase, @code{const char *}type)
 @end ifclear
 Аналогично предыдущему с заданными амплитудой @var{ampl} и фазой @var{phase} комплексных чисел.
@@ -1506,34 +1661,71 @@ These functions change the data in some direction like differentiations, integra
 @deftypefn {Команда MGL} {} fourier reDat imDat 'dir'
 @deftypefnx {Команда MGL} {} fourier complexDat 'dir'
 @ifclear UDAV
-@deftypefnx {Global function} @code{void} mglFourier @code{const mglDataA &}re, @code{const mglDataA &}im, @code{const char *}dir)
+@deftypefnx {Общая функция} @code{void} mglFourier @code{const mglDataA &}re, @code{const mglDataA &}im, @code{const char *}dir)
+@deftypefnx {Метод класса @code{mglDataC}} @code{void} FFT (@code{const char *}dir)
 @deftypefnx {Функция С} @code{void} mgl_data_fourier @code{HCDT} re, @code{HCDT} im, @code{const char *}dir)
+@deftypefnx {Функция С} @code{void} mgl_datac_fft (@code{HADT} dat, @code{const char *}dir)
 @end ifclear
-Выполняет Фурье преобразование для комплексных данных @var{re}+i*@var{im} в направлениях @var{dir}. Результат помещается обратно в массивы @var{re} и @var{im}.
+Выполняет Фурье преобразование для комплексных данных @var{re}+i*@var{im} в направлениях @var{dir}. Результат помещается обратно в массивы @var{re} и @var{im}. Если @var{dir} содержит @samp{i}, то выполняется обратное преобразование Фурье.
 @end deftypefn
 
 @anchor{stfad}
 @deftypefn {Команда MGL} {} stfad @sc{res} real imag @code{dn} ['dir'='x']
 @ifclear UDAV
-@deftypefnx {Global function} @code{mglData} mglSTFA (@code{const mglDataA &}real, @code{const mglDataA &}imag, @code{int} dn, @code{char} dir=@code{'x'})
-@deftypefnx {Функция С} @code{HMDT} mgl_data_stfa (@code{HCDT} real, @code{HCDT} imag, @code{int} dn,@code{char} dir)
+@deftypefnx {Общая функция} @code{mglData} mglSTFA (@code{const mglDataA &}real, @code{const mglDataA &}imag, @code{int} dn, @code{char} dir=@code{'x'})
+@deftypefnx {Функция С} @code{HMDT} mgl_data_stfa (@code{HCDT} real, @code{HCDT} imag, @code{int} dn, @code{char} dir)
 @end ifclear
 Выполняет оконное преобразование Фурье длиной @var{dn} для комплексных данных @var{real}, @var{imag} и возвращает модуль результата. Например, для @var{dir}=@samp{x} результат будет иметь размер @{int(nx/dn), dn, ny@} и будет равен @math{res[i,j,k]=|\sum_d^dn exp(I*j*d)*(real[i*dn+d,k]+I*imag[i*dn+d,k])|/dn}.
 @end deftypefn
 
+@anchor{tridmat}
+@deftypefn {Команда MGL} {} tridmat @sc{res adat bdat cdat ddat} 'how'
+@ifclear UDAV
+@deftypefnx {Общая функция} @code{mglData} mglTridMat (@code{const mglDataA &}A, @code{const mglDataA &}B, @code{const mglDataA &}C, @code{const mglDataA &}D, @code{const char *}how)
+@deftypefnx {Общая функция} @code{mglDataC} mglTridMatC (@code{const mglDataA &}A, @code{const mglDataA &}B, @code{const mglDataA &}C, @code{const mglDataA &}D, @code{const char *}how)
+@deftypefnx {Функция С} @code{HMDT} mgl_data_tridmat (@code{HCDT} A, @code{HCDT} B, @code{HCDT} C, @code{HCDT} D, @code{const char*}how)
+@deftypefnx {Функция С} @code{HADT} mgl_datac_tridmat (@code{HCDT} A, @code{HCDT} B, @code{HCDT} C, @code{HCDT} D, @code{const char*}how)
+@end ifclear
+Возвращает решение трехдиагональной системы уравнений @var{A}[i]*x[i-1]+@var{B}[i]*x[i]+@var{C}[i]*x[i+1]=@var{D}[i]. Строка @var{how} может содержать:
+@itemize @bullet
+@item
+@samp{xyz} для решения вдоль x-,y-,z-направлений;
+@item
+@samp{h} для решения вдоль диагонали на плоскости x-y (требует квадратную матрицу);
+@item
+@samp{c} для использования периодических граничных условий;
+@item
+@samp{d} для расчета диффракции/диффузии (т.е. для использования -@var{A}[i]*@var{D}[i-1]+(2-@var{B}[i])*@var{D}[i]-@var{C}[i]*@var{D}[i+1] в правой частиц вместо @var{D}[i]).
+@end itemize
+Размеры массивов @var{A}, @var{B}, @var{C} должны быть одинаковы. Также их размерности должны совпадать со всеми или с "младшими" размерностями массива @var{D}. @sref{PDE solving hints}
+@end deftypefn
+
 @anchor{pde}
 @deftypefn {Команда MGL} {} pde @sc{res} 'ham' ini_re ini_im [@code{dz=0.1 k0=100}]
 @ifclear UDAV
-@deftypefnx {Global function} @code{mglData} mglPDE (@code{HMGL} gr, @code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{mreal} dz=@code{0.1}, @code{mreal} k0=@code{100}, @code{const char *}opt=@code{""})
+@deftypefnx {Общая функция} @code{mglData} mglPDE (@code{HMGL} gr, @code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{mreal} dz=@code{0.1}, @code{mreal} k0=@code{100}, @code{const char *}opt=@code{""})
+@deftypefnx {Общая функция} @code{mglDataC} mglPDEc (@code{HMGL} gr, @code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{mreal} dz=@code{0.1}, @code{mreal} k0=@code{100}, @code{const char *}opt=@code{""})
 @deftypefnx {Функция С} @code{HMDT} mgl_pde_solve (@code{HMGL} gr, @code{const char *}ham, @code{HCDT} ini_re, @code{HCDT} ini_im, @code{mreal} dz, @code{mreal} k0, @code{const char *}opt)
+@deftypefnx {Функция С} @code{HADT} mgl_pde_solve_c (@code{HMGL} gr, @code{const char *}ham, @code{HCDT} ini_re, @code{HCDT} ini_im, @code{mreal} dz, @code{mreal} k0, @code{const char *}opt)
+@end ifclear
+Решает уравнение в частных производных du/dz = i*k0*@var{ham}(p,q,x,y,z,|u|)[u], где p=-i/k0*d/dx, q=-i/k0*d/dy -- псевдо-дифференциальные операторы. Параметры @var{ini_re}, @var{ini_im} задают начальное распределение поля. Координаты в уравнении и в решении полагаются в диапазоне осей координат. Замечу, что внутри этот диапазон увеличивается в 3/2 раза для уменьшения отражения от границ расчетного интервала. Параметр @var{dz} задает шаг по эволюционной координате z. В данный момент использован упрощенный алгоритм, когда все ``смешанные'' члена (типа @samp{x*p}->x*d/dx) исключаются. Например, в 2D случае это функции типа @math{ham = f(p,z) + g(x,z,u)}. При этом допускаются коммутирующие комбинации (типа @samp{x*q}->x*d/dy). Переменная @samp{u} используется для обозначения амплитуды поля |u|. Это позволяет решать нелинейные задачи -- например, нелинейное уравнение Шредингера @code{ham='p^2+q^2-u^2'}. Также можно указать мнимую часть для поглощения (типа @code{ham = 'p^2+i*x*(x>0)'}). См. также @ref{apde}, @ref{qo2d}, @ref{qo3d}. @sref{PDE solving hints}
+@end deftypefn
+
+@anchor{apde}
+@deftypefn {Команда MGL} {} apde @sc{res} 'ham' ini_re ini_im [@code{dz=0.1 k0=100}]
+@ifclear UDAV
+@deftypefnx {Общая функция} @code{mglData} mglAPDE (@code{HMGL} gr, @code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{mreal} dz=@code{0.1}, @code{mreal} k0=@code{100}, @code{const char *}opt=@code{""})
+@deftypefnx {Общая функция} @code{mglDataC} mglAPDEc (@code{HMGL} gr, @code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{mreal} dz=@code{0.1}, @code{mreal} k0=@code{100}, @code{const char *}opt=@code{""})
+@deftypefnx {Функция С} @code{HMDT} mgl_pde_solve_adv (@code{HMGL} gr, @code{const char *}ham, @code{HCDT} ini_re, @code{HCDT} ini_im, @code{mreal} dz, @code{mreal} k0, @code{const char *}opt)
+@deftypefnx {Функция С} @code{HADT} mgl_pde_solve_adv_c (@code{HMGL} gr, @code{const char *}ham, @code{HCDT} ini_re, @code{HCDT} ini_im, @code{mreal} dz, @code{mreal} k0, @code{const char *}opt)
 @end ifclear
-РеÑ\88аеÑ\82 Ñ\83Ñ\80авнение Ð² Ñ\87аÑ\81Ñ\82нÑ\8bÑ\85 Ð¿Ñ\80оизводнÑ\8bÑ\85 du/dz = i*k0*@var{ham}(p,q,x,y,z,|u|)[u], Ð³Ð´Ðµ p=-i/k0*d/dx, q=-i/k0*d/dy -- Ð¿Ñ\81евдо-диÑ\84Ñ\84еÑ\80енÑ\86иалÑ\8cнÑ\8bе Ð¾Ð¿ÐµÑ\80аÑ\82оÑ\80Ñ\8b. Ð\9fаÑ\80амеÑ\82Ñ\80Ñ\8b @var{ini_re}, @var{ini_im} Ð·Ð°Ð´Ð°Ñ\8eÑ\82 Ð½Ð°Ñ\87алÑ\8cное Ñ\80аÑ\81пÑ\80еделение Ð¿Ð¾Ð»Ñ\8f. Ð\9aооÑ\80динаÑ\82Ñ\8b Ð² Ñ\83Ñ\80авнении Ð¸ Ð² Ñ\80еÑ\88ении Ð¿Ð¾Ð»Ð°Ð³Ð°Ñ\8eÑ\82Ñ\81Ñ\8f Ð² Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ðµ Ð¾Ñ\81ей ÐºÐ¾Ð¾Ñ\80динаÑ\82. Ð\97амеÑ\87Ñ\83, Ñ\87Ñ\82о Ð²Ð½Ñ\83Ñ\82Ñ\80и Ñ\8dÑ\82оÑ\82 Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½ Ñ\83велиÑ\87иваеÑ\82Ñ\81Ñ\8f Ð² 3/2 Ñ\80аза Ð´Ð»Ñ\8f Ñ\83менÑ\8cÑ\88ениÑ\8f Ð¾Ñ\82Ñ\80ажениÑ\8f Ð¾Ñ\82 Ð³Ñ\80аниÑ\86 Ñ\80аÑ\81Ñ\87еÑ\82ного Ð¸Ð½Ñ\82еÑ\80вала. Ð\9fаÑ\80амеÑ\82Ñ\80 @var{dz} Ð·Ð°Ð´Ð°ÐµÑ\82 Ñ\88аг Ð¿Ð¾ Ñ\8dволÑ\8eÑ\86ионной ÐºÐ¾Ð¾Ñ\80динаÑ\82е z. Ð\92 Ð´Ð°Ð½Ð½Ñ\8bй Ð¼Ð¾Ð¼ÐµÐ½Ñ\82 Ð¸Ñ\81полÑ\8cзован Ñ\83пÑ\80оÑ\89еннÑ\8bй Ð°Ð»Ð³Ð¾Ñ\80иÑ\82м, ÐºÐ¾Ð³Ð´Ð° Ð²Ñ\81е ``Ñ\81меÑ\88аннÑ\8bе'' Ñ\87лена (Ñ\82ипа @samp{x*p}->x*d/dx) Ð¸Ñ\81клÑ\8eÑ\87аÑ\8eÑ\82Ñ\81Ñ\8f. Ð\9dапÑ\80имеÑ\80, Ð² 2D Ñ\81лÑ\83Ñ\87ае Ñ\8dÑ\82о Ñ\84Ñ\83нкÑ\86ии Ñ\82ипа @math{ham = f(p,z) + g(x,z,u)}. Ð\9fÑ\80и Ñ\8dÑ\82ом Ð´Ð¾Ð¿Ñ\83Ñ\81каÑ\8eÑ\82Ñ\81Ñ\8f ÐºÐ¾Ð¼Ð¼Ñ\83Ñ\82иÑ\80Ñ\83Ñ\8eÑ\89ие ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ\86ии (Ñ\82ипа @samp{x*q}->x*d/dy). Ð\9fеÑ\80еменнаÑ\8f @samp{u} Ð¸Ñ\81полÑ\8cзÑ\83еÑ\82Ñ\81Ñ\8f Ð´Ð»Ñ\8f Ð¾Ð±Ð¾Ð·Ð½Ð°Ñ\87ениÑ\8f Ð°Ð¼Ð¿Ð»Ð¸Ñ\82Ñ\83дÑ\8b Ð¿Ð¾Ð»Ñ\8f |u|. Ð­Ñ\82о Ð¿Ð¾Ð·Ð²Ð¾Ð»Ñ\8fеÑ\82 Ñ\80еÑ\88аÑ\82Ñ\8c Ð½ÐµÐ»Ð¸Ð½ÐµÐ¹Ð½Ñ\8bе Ð·Ð°Ð´Ð°Ñ\87и -- Ð½Ð°Ð¿Ñ\80имеÑ\80, Ð½ÐµÐ»Ð¸Ð½ÐµÐ¹Ð½Ð¾Ðµ Ñ\83Ñ\80авнение Ð¨Ñ\80едингеÑ\80а @code{ham='p^2+q^2-u^2'}. Ð¢Ð°ÐºÐ¶Ðµ Ð¼Ð¾Ð¶Ð½Ð¾ Ñ\83казаÑ\82Ñ\8c Ð¼Ð½Ð¸Ð¼Ñ\83Ñ\8e Ñ\87аÑ\81Ñ\82Ñ\8c Ð´Ð»Ñ\8f Ð¿Ð¾Ð³Ð»Ð¾Ñ\89ениÑ\8f (Ñ\82ипа @code{ham = 'p^2+i*x*(x>0)'}), Ð½Ð¾ Ñ\82олÑ\8cко ÐµÑ\81ли Ð·Ð°Ð²Ð¸Ñ\81имоÑ\81Ñ\82Ñ\8c Ð¾Ñ\82 @samp{i} Ð»Ð¸Ð½ÐµÐ¹Ð½Ð°Ñ\8f, Ñ\82.е. @math{ham = hre+i*him}. @sref{PDE solving hints}
+РеÑ\88аеÑ\82 Ñ\83Ñ\80авнение Ð² Ñ\87аÑ\81Ñ\82нÑ\8bÑ\85 Ð¿Ñ\80оизводнÑ\8bÑ\85 du/dz = i*k0*@var{ham}(p,q,x,y,z,|u|)[u], Ð³Ð´Ðµ p=-i/k0*d/dx, q=-i/k0*d/dy -- Ð¿Ñ\81евдо-диÑ\84Ñ\84еÑ\80енÑ\86иалÑ\8cнÑ\8bе Ð¾Ð¿ÐµÑ\80аÑ\82оÑ\80Ñ\8b. Ð\9fаÑ\80амеÑ\82Ñ\80Ñ\8b @var{ini_re}, @var{ini_im} Ð·Ð°Ð´Ð°Ñ\8eÑ\82 Ð½Ð°Ñ\87алÑ\8cное Ñ\80аÑ\81пÑ\80еделение Ð¿Ð¾Ð»Ñ\8f. Ð\9aооÑ\80динаÑ\82Ñ\8b Ð² Ñ\83Ñ\80авнении Ð¸ Ð² Ñ\80еÑ\88ении Ð¿Ð¾Ð»Ð°Ð³Ð°Ñ\8eÑ\82Ñ\81Ñ\8f Ð² Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ðµ Ð¾Ñ\81ей ÐºÐ¾Ð¾Ñ\80динаÑ\82. Ð\97амеÑ\87Ñ\83, Ñ\87Ñ\82о Ð²Ð½Ñ\83Ñ\82Ñ\80и Ñ\8dÑ\82оÑ\82 Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½ Ñ\83велиÑ\87иваеÑ\82Ñ\81Ñ\8f Ð² 3/2 Ñ\80аза Ð´Ð»Ñ\8f Ñ\83менÑ\8cÑ\88ениÑ\8f Ð¾Ñ\82Ñ\80ажениÑ\8f Ð¾Ñ\82 Ð³Ñ\80аниÑ\86 Ñ\80аÑ\81Ñ\87еÑ\82ного Ð¸Ð½Ñ\82еÑ\80вала. Ð\9fаÑ\80амеÑ\82Ñ\80 @var{dz} Ð·Ð°Ð´Ð°ÐµÑ\82 Ñ\88аг Ð¿Ð¾ Ñ\8dволÑ\8eÑ\86ионной ÐºÐ¾Ð¾Ñ\80динаÑ\82е z. Ð\98Ñ\81полÑ\8cзÑ\83еÑ\82Ñ\81Ñ\8f Ð´Ð¾Ñ\81Ñ\82аÑ\82оÑ\87но Ñ\81ложнÑ\8bй Ð¸ Ð¼ÐµÐ´Ð»ÐµÐ½Ð½Ñ\8bй Ð°Ð»Ð³Ð¾Ñ\80иÑ\82м, Ñ\81поÑ\81обнÑ\8bй Ñ\83Ñ\87еÑ\81Ñ\82Ñ\8c Ð¾Ð´Ð½Ð¾Ð²Ñ\80еменное Ð²Ð»Ð¸Ñ\8fние Ð¿Ñ\80оÑ\81Ñ\82Ñ\80анÑ\81Ñ\82венной Ð´Ð¸Ñ\81пеÑ\80Ñ\81ии Ð¸ Ð½ÐµÐ¾Ð´Ð½Ð¾Ñ\80одноÑ\81Ñ\82и Ñ\81Ñ\80едÑ\8b [Ñ\81м. Ð\90\90. Ð\91алакин, Ð\95\94. Ð\93оÑ\81подÑ\87иков, Ð\90\93. ШалаÑ\88ов, Ð\9fиÑ\81Ñ\8cма Ð\96ЭТФ 104, 701 (2016)]. Ð\9fеÑ\80еменнаÑ\8f @samp{u} Ð¸Ñ\81полÑ\8cзÑ\83еÑ\82Ñ\81Ñ\8f Ð´Ð»Ñ\8f Ð¾Ð±Ð¾Ð·Ð½Ð°Ñ\87ениÑ\8f Ð°Ð¼Ð¿Ð»Ð¸Ñ\82Ñ\83дÑ\8b Ð¿Ð¾Ð»Ñ\8f |u|. Ð­Ñ\82о Ð¿Ð¾Ð·Ð²Ð¾Ð»Ñ\8fеÑ\82 Ñ\80еÑ\88аÑ\82Ñ\8c Ð½ÐµÐ»Ð¸Ð½ÐµÐ¹Ð½Ñ\8bе Ð·Ð°Ð´Ð°Ñ\87и -- Ð½Ð°Ð¿Ñ\80имеÑ\80, Ð½ÐµÐ»Ð¸Ð½ÐµÐ¹Ð½Ð¾Ðµ Ñ\83Ñ\80авнение Ð¨Ñ\80едингеÑ\80а @code{ham='p^2+q^2-u^2'}. Ð¢Ð°ÐºÐ¶Ðµ Ð¼Ð¾Ð¶Ð½Ð¾ Ñ\83казаÑ\82Ñ\8c Ð¼Ð½Ð¸Ð¼Ñ\83Ñ\8e Ñ\87аÑ\81Ñ\82Ñ\8c Ð´Ð»Ñ\8f Ð¿Ð¾Ð³Ð»Ð¾Ñ\89ениÑ\8f (Ñ\82ипа @code{ham = 'p^2+i*x*(x>0)'}).  Ð¡Ð¼. Ñ\82акже @ref{apde}. @sref{PDE solving hints}
 @end deftypefn
 
 @anchor{ray}
 @deftypefn {Команда MGL} {} ray @sc{res} 'ham' @code{x0 y0 z0 p0 q0 v0 [dt=0.1 tmax=10]}
 @ifclear UDAV
-@deftypefnx {Global function} @code{mglData} mglRay (@code{const char *}ham, @code{mglPoint} r0, @code{mglPoint} p0, @code{mreal} dt=@code{0.1}, @code{mreal} tmax=@code{10})
+@deftypefnx {Общая функция} @code{mglData} mglRay (@code{const char *}ham, @code{mglPoint} r0, @code{mglPoint} p0, @code{mreal} dt=@code{0.1}, @code{mreal} tmax=@code{10})
 @deftypefnx {Функция С} @code{HMDT} mgl_ray_trace (@code{const char *}ham, @code{mreal} x0, @code{mreal} y0, @code{mreal} z0, @code{mreal} px, @code{mreal} py, @code{mreal} pz, @code{mreal} dt, @code{mreal} tmax)
 @end ifclear
 Решает систему геометрооптических уравнений d@emph{r}/dt = d @var{ham}/d@emph{p}, d@emph{p}/dt = -d @var{ham}/d@emph{r}. Это гамильтоновы уравнения для траектории частицы в 3D случае. Гамильтониан @var{ham} может зависеть от координат @samp{x}, @samp{y}, @samp{z}, импульсов @samp{p}=px, @samp{q}=py, @samp{v}=pz и времени @samp{t}: @math{ham = H(x,y,z,p,q,v,t)}. Начальная точка (при @code{t=0}) задается переменными @{@var{x0}, @var{y0}, @var{z0}, @var{p0}, @var{q0}, @var{v0}@}. Параметры @var{dt} и @var{tmax} задают шаг и максимальное время интегрирования. Результат -- массив @{x,y,z,p,q,v,t@} с размером @{7 * int(@var{tmax}/@var{dt}+1) @}.
@@ -1542,8 +1734,10 @@ These functions change the data in some direction like differentiations, integra
 @anchor{ode}
 @deftypefn {Команда MGL} {} ode @sc{res} 'df' 'var' ini [@code{dt=0.1 tmax=10}]
 @ifclear UDAV
-@deftypefnx {Global function} @code{mglData} mglODE (@code{const char *}df, @code{const char *}var, @code{const mglDataA &}ini, @code{mreal} dt=@code{0.1}, @code{mreal} tmax=@code{10})
+@deftypefnx {Общая функция} @code{mglData} mglODE (@code{const char *}df, @code{const char *}var, @code{const mglDataA &}ini, @code{mreal} dt=@code{0.1}, @code{mreal} tmax=@code{10})
+@deftypefnx {Общая функция} @code{mglDataC} mglODEc (@code{const char *}df, @code{const char *}var, @code{const mglDataA &}ini, @code{mreal} dt=@code{0.1}, @code{mreal} tmax=@code{10})
 @deftypefnx {Функция С} @code{HMDT} mgl_ode_solve_str (@code{const char *}df, @code{const char *}var, @code{HCDT} ini, @code{mreal} dt, @code{mreal} tmax)
+@deftypefnx {Функция С} @code{HADT} mgl_ode_solve_str_c (@code{const char *}df, @code{const char *}var, @code{HCDT} ini, @code{mreal} dt, @code{mreal} tmax)
 @deftypefnx {Функция С} @code{HMDT} mgl_ode_solve (@code{void (*}df@code{)(const mreal *x, mreal *dx, void *par)}, @code{int} n, @code{const mreal *}ini, @code{mreal} dt, @code{mreal} tmax)
 @deftypefnx {Функция С} @code{HMDT} mgl_ode_solve_ex (@code{void (*}df@code{)(const mreal *x, mreal *dx, void *par)}, @code{int} n, @code{const mreal *}ini, @code{mreal} dt, @code{mreal} tmax, @code{void (*}bord@code{)(mreal *x, const mreal *xprev, void *par)})
 @end ifclear
@@ -1553,10 +1747,10 @@ These functions change the data in some direction like differentiations, integra
 @anchor{qo2d}
 @deftypefn {Команда MGL} {} qo2d @sc{res} 'ham' ini_re ini_im ray [@code{r=1 k0=100} xx yy]
 @ifclear UDAV
-@deftypefnx {Global function} @code{mglData} mglQO2d (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{const mglDataA &}ray, @code{mreal} r=@code{1}, @code{mreal} k0=@code{100}, @code{mglData *}xx=@code{0}, @code{mglData *}yy=@code{0})
-@deftypefnx {Global function} @code{mglData} mglQO2d (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{const mglDataA &}ray, @code{mglData &}xx, @code{mglData &}yy, @code{mreal} r=@code{1}, @code{mreal} k0=@code{100})
-@deftypefnx {Global function} @code{mglDataC} mglQO2dc (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{const mglDataA &}ray, @code{mreal} r=@code{1}, @code{mreal} k0=@code{100})
-@deftypefnx {Global function} @code{mglDataC} mglQO2dc (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{const mglDataA &}ray, @code{mglData &}xx, @code{mglData &}yy, @code{mreal} r=@code{1}, @code{mreal} k0=@code{100})
+@deftypefnx {Общая функция} @code{mglData} mglQO2d (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{const mglDataA &}ray, @code{mreal} r=@code{1}, @code{mreal} k0=@code{100}, @code{mglData *}xx=@code{0}, @code{mglData *}yy=@code{0})
+@deftypefnx {Общая функция} @code{mglData} mglQO2d (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{const mglDataA &}ray, @code{mglData &}xx, @code{mglData &}yy, @code{mreal} r=@code{1}, @code{mreal} k0=@code{100})
+@deftypefnx {Общая функция} @code{mglDataC} mglQO2dc (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{const mglDataA &}ray, @code{mreal} r=@code{1}, @code{mreal} k0=@code{100})
+@deftypefnx {Общая функция} @code{mglDataC} mglQO2dc (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{const mglDataA &}ray, @code{mglData &}xx, @code{mglData &}yy, @code{mreal} r=@code{1}, @code{mreal} k0=@code{100})
 @deftypefnx {Функция С} @code{HMDT} mgl_qo2d_solve (@code{const char *}ham, @code{HCDT} ini_re, @code{HCDT} ini_im, @code{HCDT} ray, @code{mreal} r, @code{mreal} k0, @code{HMDT} xx, @code{HMDT} yy)
 @deftypefnx {Функция С} @code{HADT} mgl_qo2d_solve_c (@code{const char *}ham, @code{HCDT} ini_re, @code{HCDT} ini_im, @code{HCDT} ray, @code{mreal} r, @code{mreal} k0, @code{HMDT} xx, @code{HMDT} yy)
 @deftypefnx {Функция С} @code{HMDT} mgl_qo2d_func (@code{dual (*}ham@code{)(mreal u, mreal x, mreal y, mreal px, mreal py, void *par)}, @code{HCDT} ini_re, @code{HCDT} ini_im, @code{HCDT} ray, @code{mreal} r, @code{mreal} k0, @code{HMDT} xx, @code{HMDT} yy)
@@ -1568,10 +1762,10 @@ These functions change the data in some direction like differentiations, integra
 @anchor{qo3d}
 @deftypefn {Команда MGL} {} qo3d @sc{res} 'ham' ini_re ini_im ray [@code{r=1 k0=100} xx yy zz]
 @ifclear UDAV
-@deftypefnx {Global function} @code{mglData} mglQO3d (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{const mglDataA &}ray, @code{mreal} r=@code{1}, @code{mreal} k0=@code{100})
-@deftypefnx {Global function} @code{mglData} mglQO3d (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{const mglDataA &}ray, @code{mglData &}xx, @code{mglData &}yy, @code{mglData &}zz, @code{mreal} r=@code{1}, @code{mreal} k0=@code{100})
-@deftypefnx {Global function} @code{mglDataC} mglQO3dc (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{const mglDataA &}ray, @code{mreal} r=@code{1}, @code{mreal} k0=@code{100})
-@deftypefnx {Global function} @code{mglDataC} mglQO3dc (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{const mglDataA &}ray, @code{mglData &}xx, @code{mglData &}yy, @code{mglData &}zz, @code{mreal} r=@code{1}, @code{mreal} k0=@code{100})
+@deftypefnx {Общая функция} @code{mglData} mglQO3d (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{const mglDataA &}ray, @code{mreal} r=@code{1}, @code{mreal} k0=@code{100})
+@deftypefnx {Общая функция} @code{mglData} mglQO3d (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{const mglDataA &}ray, @code{mglData &}xx, @code{mglData &}yy, @code{mglData &}zz, @code{mreal} r=@code{1}, @code{mreal} k0=@code{100})
+@deftypefnx {Общая функция} @code{mglDataC} mglQO3dc (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{const mglDataA &}ray, @code{mreal} r=@code{1}, @code{mreal} k0=@code{100})
+@deftypefnx {Общая функция} @code{mglDataC} mglQO3dc (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{const mglDataA &}ray, @code{mglData &}xx, @code{mglData &}yy, @code{mglData &}zz, @code{mreal} r=@code{1}, @code{mreal} k0=@code{100})
 @deftypefnx {Функция С} @code{HMDT} mgl_qo3d_solve (@code{const char *}ham, @code{HCDT} ini_re, @code{HCDT} ini_im, @code{HCDT} ray, @code{mreal} r, @code{mreal} k0, @code{HMDT} xx, @code{HMDT} yy, @code{HMDT} zz)
 @deftypefnx {Функция С} @code{HADT} mgl_qo3d_solve_c (@code{const char *}ham, @code{HCDT} ini_re, @code{HCDT} ini_im, @code{HCDT} ray, @code{mreal} r, @code{mreal} k0, @code{HMDT} xx, @code{HMDT} yy, @code{HMDT} zz)
 @deftypefnx {Функция С} @code{HMDT} mgl_qo3d_func (@code{dual (*}ham@code{)(mreal u, mreal x, mreal y, mreal z, mreal px, mreal py, mreal pz, void *par)}, @code{HCDT} ini_re, @code{HCDT} ini_im, @code{HCDT} ray, @code{mreal} r, @code{mreal} k0, @code{HMDT} xx, @code{HMDT} yy, @code{HMDT} zz)
@@ -1583,8 +1777,8 @@ These functions change the data in some direction like differentiations, integra
 @anchor{jacobian}
 @deftypefn {Команда MGL} {} jacobian @sc{res} xdat ydat [zdat]
 @ifclear UDAV
-@deftypefnx {Global function} @code{mglData} mglJacobian (@code{const mglDataA &}x, @code{const mglDataA &}y)
-@deftypefnx {Global function} @code{mglData} mglJacobian (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z)
+@deftypefnx {Общая функция} @code{mglData} mglJacobian (@code{const mglDataA &}x, @code{const mglDataA &}y)
+@deftypefnx {Общая функция} @code{mglData} mglJacobian (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z)
 @deftypefnx {Функция С} @code{HMDT} mgl_jacobian_2d (@code{HCDT} x, @code{HCDT} y)
 @deftypefnx {Функция С} @code{HMDT} mgl_jacobian_3d (@code{HCDT} x, @code{HCDT} y, @code{HCDT} z)
 @end ifclear
@@ -1595,8 +1789,8 @@ These functions change the data in some direction like differentiations, integra
 @deftypefn {Команда MGL} {} triangulation @sc{res} xdat ydat [zdat]
 @c @deftypefn {Команда MGL} {} triangulation @sc{res} xdat ydat [zdat]
 @ifclear UDAV
-@deftypefnx {Global function} @code{mglData} mglTriangulation (@code{const mglDataA &}x, @code{const mglDataA &}y)
-@deftypefnx {Global function} @code{mglData} mglTriangulation (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z)
+@deftypefnx {Общая функция} @code{mglData} mglTriangulation (@code{const mglDataA &}x, @code{const mglDataA &}y)
+@deftypefnx {Общая функция} @code{mglData} mglTriangulation (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z)
 @deftypefnx {Функция С} @code{HMDT} mgl_triangulation_2d (@code{HCDT} x, @code{HCDT} y)
 @deftypefnx {Функция С} @code{HMDT} mgl_triangulation_3d (@code{HCDT} x, @code{HCDT} y, @code{HCDT} z)
 @end ifclear
@@ -1606,15 +1800,15 @@ These functions change the data in some direction like differentiations, integra
 
 @ifclear UDAV
 
-@deftypefn {Global function} @code{mglData} mglGSplineInit (@code{const mglDataA &}x, @code{const mglDataA &}y)
-@deftypefnx {Global function} @code{mglDataC} mglGSplineCInit (@code{const mglDataA &}x, @code{const mglDataA &}y)
+@deftypefn {Общая функция} @code{mglData} mglGSplineInit (@code{const mglDataA &}x, @code{const mglDataA &}y)
+@deftypefnx {Общая функция} @code{mglDataC} mglGSplineCInit (@code{const mglDataA &}x, @code{const mglDataA &}y)
 @deftypefnx {Функция С} @code{HMDT} mgl_gspline_init (@code{HCDT} x, @code{HCDT} y)
 @deftypefnx {Функция С} @code{HADT} mgl_gsplinec_init (@code{HCDT} x, @code{HCDT} y)
 Подготавливает коэффициенты для глобального кубического сплайна.
 @end deftypefn
 
-@deftypefn {Global function} @code{mreal} mglGSpline (@code{const mglDataA &}coef, @code{mreal} dx, @code{mreal *}d1=@code{0}, @code{mreal *}d2=@code{0})
-@deftypefnx {Global function} @code{dual} mglGSplineC (@code{const mglDataA &}coef, @code{mreal} dx, @code{dual *}d1=@code{0}, @code{dual *}d2=@code{0})
+@deftypefn {Общая функция} @code{mreal} mglGSpline (@code{const mglDataA &}coef, @code{mreal} dx, @code{mreal *}d1=@code{0}, @code{mreal *}d2=@code{0})
+@deftypefnx {Общая функция} @code{dual} mglGSplineC (@code{const mglDataA &}coef, @code{mreal} dx, @code{dual *}d1=@code{0}, @code{dual *}d2=@code{0})
 @deftypefnx {Функция С} @code{mreal} mgl_gspline (@code{HCDT} coef, @code{mreal} dx, @code{mreal *}d1, @code{mreal *}d2)
 @deftypefnx {Функция С} @code{dual} mgl_gsplinec (@code{HCDT} coef, @code{mreal} dx, @code{dual *}d1, @code{dual *}d2)
 Вычисляет глобальный кубический сплайн (а также 1ую и 2ую производные @var{d1}, @var{d2} если они не @code{NULL}), используя коэффициенты @var{coef} в точке @var{dx}+@var{x0} (здесь @var{x0} -- 1ый элемент массива @var{x} в функции @code{mglGSpline*Init()}).
@@ -1625,7 +1819,7 @@ These functions change the data in some direction like differentiations, integra
 @anchor{ifs2d}
 @deftypefn {Команда MGL} {} ifs2d @sc{res} dat @code{num} [@code{skip=20}]
 @ifclear UDAV
-@deftypefnx {Global function} @code{mglData} mglIFS2d (@code{const mglDataA &}dat, @code{long} num, @code{long} skip=@code{20})
+@deftypefnx {Общая функция} @code{mglData} mglIFS2d (@code{const mglDataA &}dat, @code{long} num, @code{long} skip=@code{20})
 @deftypefnx {Функция С} @code{HMDT} mgl_data_ifs_2d (@code{HCDT} dat, @code{long} num, @code{long} skip)
 @end ifclear
 Находит @var{num} точек @{x[i]=res[0,i], y[i]=res[1,i]@} фрактала с использованием итерационной системы функций (IFS). Матрица @var{dat} используется для генерации в соответствии с формулами
@@ -1633,24 +1827,91 @@ These functions change the data in some direction like differentiations, integra
 x[i+1] = dat[0,i]*x[i] + dat[1,i]*y[i] + dat[4,i];
 y[i+1] = dat[2,i]*x[i] + dat[3,i]*y[i] + dat[5,i];
 @end verbatim
-Значение @code{dat[6,i]} -- весовой коэффициент для i-ой строки матрицы @var{dat}. Первые @var{skip} итераций будут опущены. Массив @var{dat} должен иметь размер по x больше или равный 7. @sref{IFS sample}
+Значение @code{dat[6,i]} -- весовой коэффициент для i-ой строки матрицы @var{dat}. Первые @var{skip} итераций будут опущены. Массив @var{dat} должен иметь размер по x больше или равный 7. @sref{Fractal sample}
 @end deftypefn
 
 @anchor{ifs3d}
 @deftypefn {Команда MGL} {} ifs3d @sc{res} dat @code{num} [@code{skip=20}]
 @ifclear UDAV
-@deftypefnx {Global function} @code{mglData} mglIFS3d (@code{const mglDataA &}dat, @code{long} num, @code{long} skip=@code{20})
+@deftypefnx {Общая функция} @code{mglData} mglIFS3d (@code{const mglDataA &}dat, @code{long} num, @code{long} skip=@code{20})
 @deftypefnx {Функция С} @code{HMDT} mgl_data_ifs_3d (@code{HCDT} dat, @code{long} num, @code{long} skip)
 @end ifclear
 Находит @var{num} точек @{x[i]=res[0,i], y[i]=res[1,i], z[i]=res[2,i]@} фрактала с использованием итерационной системы функций (IFS). Матрица @var{dat} используется для генерации в соответствии с формулами
 @verbatim
 x[i+1] = dat[0,i]*x[i] + dat[1,i]*y[i] + dat[2,i]*z[i] + dat[9,i];
 y[i+1] = dat[3,i]*x[i] + dat[4,i]*y[i] + dat[5,i]*z[i] + dat[10,i];
-z[i+1] = dat[6,i]*x[i] + dat[7,i]*y[i] + dat[8,i]*z[i] + dat[10,i];
+z[i+1] = dat[6,i]*x[i] + dat[7,i]*y[i] + dat[8,i]*z[i] + dat[11,i];
+@end verbatim
+Значение @code{dat[12,i]} -- весовой коэффициент для i-ой строки матрицы @var{dat}. Первые @var{skip} итераций будут опущены. Массив @var{dat} должен иметь размер по x больше или равный 13. @sref{Fractal sample}
+@end deftypefn
+
+@anchor{ifsfile}
+@deftypefn {Команда MGL} {} ifsfile @sc{res} 'fname' 'name' @code{num} [@code{skip=20}]
+@ifclear UDAV
+@deftypefnx {Общая функция} @code{mglData} mglIFSfile (@code{const char *}fname, @code{const char *}name, @code{long} num, @code{long} skip=@code{20})
+@deftypefnx {Функция С} @code{HMDT} mgl_data_ifs_file (@code{const char *}fname, @code{const char *}name, @code{long} num, @code{long} skip)
+@end ifclear
+Считывает параметры фрактала @var{name} из файла @var{fname} и находит @var{num} точек для него. Первые @var{skip} итераций будут опущены. См. также @ref{ifs2d}, @ref{ifs3d}.
+
+Файл IFS может содержать несколько записей. Каждая запись содержит имя фрактала (@samp{binary} в примере ниже) и тело в фигурных скобках @{@} с параметрами фрактала. Символ @samp{;} начинает комментарий. Если имя содержит @samp{(3D)} или @samp{(3d)}, то определен 3d IFS фрактал. Пример содержит два фрактала: @samp{binary} -- обычный 2d фрактал, и @samp{3dfern (3D)} -- 3d фрактал.
+
+@verbatim
+ binary
+ { ; comment allowed here
+  ; and here
+  .5  .0 .0 .5 -2.563477 -0.000003 .333333   ; also comment allowed here
+  .5  .0 .0 .5  2.436544 -0.000003 .333333
+  .0 -.5 .5 .0  4.873085  7.563492 .333333
+  }
+
+ 3dfern (3D) {
+   .00  .00 0 .0 .18 .0 0  0.0 0.00 0 0.0 0 .01
+   .85  .00 0 .0 .85 .1 0 -0.1 0.85 0 1.6 0 .85
+   .20 -.20 0 .2 .20 .0 0  0.0 0.30 0 0.8 0 .07
+  -.20  .20 0 .2 .20 .0 0  0.0 0.30 0 0.8 0 .07
+  }
+@end verbatim
+@end deftypefn
+
+@anchor{flame2d}
+@deftypefn {Команда MGL} {} flame2d @sc{res} dat func @code{num} [@code{skip=20}]
+@ifclear UDAV
+@deftypefnx {Общая функция} @code{mglData} mglFlame2d (@code{const mglDataA &}dat, @code{const mglDataA &}func, @code{long} num, @code{long} skip=@code{20})
+@deftypefnx {Функция С} @code{HMDT} mgl_data_flame_2d (@code{HCDT} dat, @code{HCDT} func, @code{long} num, @code{long} skip)
+@end ifclear
+Находит @var{num} точек @{x[i]=res[0,i], y[i]=res[1,i]@} фрактала с использованием итерационной системы функций (IFS). Массив @var{func} задает идентификатор функции (@var{func}[0,i,j]), ее вес (@var{func}[0,i,j]) и аргументы (@var{func}[2 ... 5,i,j]). Матрица @var{dat} используется для преобразования координат для аргументов функции. Результирующее преобразование имеет вид:
+@verbatim
+xx = dat[0,i]*x[j] + dat[1,j]*y[i] + dat[4,j];
+yy = dat[2,i]*x[j] + dat[3,j]*y[i] + dat[5,j];
+x[j+1] = sum_i @var{func}[1,i,j]*@var{func}[0,i,j]_x(xx, yy; @var{func}[2,i,j],...,@var{func}[5,i,j]);
+y[j+1] = sum_i @var{func}[1,i,j]*@var{func}[0,i,j]_y(xx, yy; @var{func}[2,i,j],...,@var{func}[5,i,j]);
 @end verbatim
-Значение @code{dat[6,i]} -- весовой коэффициент для i-ой строки матрицы @var{dat}. Первые @var{skip} итераций будут опущены. Массив @var{dat} должен иметь размер по x больше или равный 13. @sref{IFS sample}
+Значение @code{dat[6,i]} -- весовой коэффициент для i-ой строки матрицы @var{dat}. Первые @var{skip} итераций будут опущены. Массив @var{dat} должен иметь размер по x больше или равный 7.
+Доступные идентификаторы функций: @code{mglFlame2d_linear=0,     mglFlame2d_sinusoidal,  mglFlame2d_spherical,   mglFlame2d_swirl,               mglFlame2d_horseshoe,
+       mglFlame2d_polar,               mglFlame2d_handkerchief,mglFlame2d_heart,               mglFlame2d_disc,                mglFlame2d_spiral,
+       mglFlame2d_hyperbolic,  mglFlame2d_diamond,             mglFlame2d_ex,                  mglFlame2d_julia,               mglFlame2d_bent,
+       mglFlame2d_waves,               mglFlame2d_fisheye,             mglFlame2d_popcorn,             mglFlame2d_exponential, mglFlame2d_power,
+       mglFlame2d_cosine,              mglFlame2d_rings,               mglFlame2d_fan,                 mglFlame2d_blob,                mglFlame2d_pdj,
+       mglFlame2d_fan2,                mglFlame2d_rings2,              mglFlame2d_eyefish,             mglFlame2d_bubble,              mglFlame2d_cylinder,
+       mglFlame2d_perspective, mglFlame2d_noise,               mglFlame2d_juliaN,              mglFlame2d_juliaScope,  mglFlame2d_blur,
+       mglFlame2d_gaussian,    mglFlame2d_radialBlur,  mglFlame2d_pie,                 mglFlame2d_ngon,                mglFlame2d_curl,
+       mglFlame2d_rectangles,  mglFlame2d_arch,                mglFlame2d_tangent,             mglFlame2d_square,              mglFlame2d_blade,
+       mglFlame2d_secant,              mglFlame2d_rays,                mglFlame2d_twintrian,   mglFlame2d_cross,               mglFlame2d_disc2,
+       mglFlame2d_supershape,  mglFlame2d_flower,              mglFlame2d_conic,               mglFlame2d_parabola,    mglFlame2d_bent2,
+       mglFlame2d_bipolar,             mglFlame2d_boarders,    mglFlame2d_butterfly,   mglFlame2d_cell,                mglFlame2d_cpow,
+       mglFlame2d_curve,               mglFlame2d_edisc,               mglFlame2d_elliptic,    mglFlame2d_escher,              mglFlame2d_foci,
+       mglFlame2d_lazySusan,   mglFlame2d_loonie,              mglFlame2d_preBlur,             mglFlame2d_modulus,             mglFlame2d_oscope,
+       mglFlame2d_polar2,              mglFlame2d_popcorn2,    mglFlame2d_scry,                mglFlame2d_separation,  mglFlame2d_split,
+       mglFlame2d_splits,              mglFlame2d_stripes,             mglFlame2d_wedge,               mglFlame2d_wedgeJulia,  mglFlame2d_wedgeSph,
+       mglFlame2d_whorl,               mglFlame2d_waves2,              mglFlame2d_exp,                 mglFlame2d_log,                 mglFlame2d_sin,
+       mglFlame2d_cos,                 mglFlame2d_tan,                 mglFlame2d_sec,                 mglFlame2d_csc,                 mglFlame2d_cot,
+       mglFlame2d_sinh,                mglFlame2d_cosh,                mglFlame2d_tanh,                mglFlame2d_sech,                mglFlame2d_csch,
+       mglFlame2d_coth,                mglFlame2d_auger,               mglFlame2d_flux.}
+Значение @code{dat[6,i]} -- весовой коэффициент для i-ой строки матрицы @var{dat}. Первые @var{skip} итераций будут опущены. Размеры массивов должны удовлетворять требованиям: @var{dat}.nx>=7, @var{func}.nx>=2 и @var{func}.nz=@var{dat}.ny. @sref{Fractal sample}
 @end deftypefn
 
+
+
 @c ------------------------------------------------------------------
 @external{}
 @node Evaluate expression, Special data classes, Global functions, Data processing
@@ -1784,6 +2045,42 @@ MGL использует специальные классы автоматич
 Задает ссылку на другой столбец того же массива данных.
 @end deftypefn
 
+
+@heading Class @code{mglDataW}
+представляет часоту для FFT в виде массива данных.
+@deftypefn {Конструктор @code{mglDataW}} @code{} mglDataW (@code{const mglDataW &} d)
+Конструктор копирования.
+@end deftypefn
+@deftypefn {Конструктор @code{mglDataW}} @code{} mglDataW (@code{long} xx=@code{1}, @code{long} yy=@code{1}, @code{long} zz=@code{1}, @code{double} dp=@code{0}, @code{char} dir=@code{'x'})
+Задает размеры, направление @var{dir} и шаг @var{dp} для частоты.
+@end deftypefn
+@deftypefn {Метод класса @code{mglDataR}} @code{void} Freq (@code{double} dp, @code{char} dir=@code{'x'})
+Равномерно распределяет данные с шагом @var{dp} в направлении @var{dir}.
+@end deftypefn
+
+
+@heading Class @code{mglDataS}
+представляет std::vector в виде массива данных.
+@deftypecv {Variable} mglDataS @code{std::vector<mreal>} dat
+Собственно данные.
+@end deftypecv
+@deftypefn {Конструктор @code{mglDataS}} @code{} mglDataS (@code{const mglDataS &} d)
+Конструктор копирования.
+@end deftypefn
+@deftypefn {Конструктор @code{mglDataS}} @code{} mglDataS (@code{const std::vector<mreal> &} d)
+Копирует данные из @var{d}.
+@end deftypefn
+@deftypefn {Конструктор @code{mglDataS}} @code{} mglDataS (@code{size_t} s)
+Выделяет память для @var{s} элементов.
+@end deftypefn
+@deftypefn {Метод класса @code{mglDataS}} @code{void} reserve (@code{size_t} num)
+Резервирует место для @var{num} элементов.
+@end deftypefn
+@deftypefn {Метод класса @code{mglDataS}} @code{void} push_back (@code{double} v)
+Добавляет значение @var{v} к концу массива данных.
+@end deftypefn
+
+
 @end ifclear
 
 @external{}
index 918c67cbd0877c09b84098d4c798a2f1d49f22c3..2dad786e5d676abe2f04e09296e0c68d0969301c 100644 (file)
@@ -126,7 +126,7 @@ Let me demonstrate possibilities of plot positioning and rotation. MathGL has a
 @verbatim
 subplot 2 2 0
 box:text -1 1.1 'Just box' ':L'
-inplot 0.2 0.5 0.7 off
+inplot 0.2 0.5 0.7 off
 box:text 0 1.2 'InPlot example'
 
 subplot 2 2 1:title 'Rotate only'
@@ -135,8 +135,8 @@ rotate 50 60:box
 subplot 2 2 2:title 'Rotate and Aspect'
 rotate 50 60:aspect 1 1 2:box
 
-subplot 2 2 3:title 'Aspect in other direction'
-rotate 50 60:aspect 1 2 2:box
+subplot 2 2 3:title 'Shear'
+box 'c':shear 0.2 0.1:box
 @end verbatim
 Here I used function @code{Puts} for printing the text in arbitrary position of picture (see @ref{Text printing}). Text coordinates and size are connected with axes. However, text coordinates may be everywhere, including the outside the bounding box. I'll show its features later in @ref{Text features}.
 
@@ -147,9 +147,9 @@ Note that several commands can be placed in a string if they are separated by @s
 More complicated sample show how to use most of positioning functions:
 @verbatim
 subplot 3 2 0:title 'StickPlot'
-stickplot 3 0 20 30:box 'r':text 0 0 '0' 'r'
-stickplot 3 1 20 30:box 'g':text 0 0 '1' 'g'
-stickplot 3 2 20 30:box 'b':text 0 0 '2' 'b'
+stickplot 3 0 20 30:box 'r':text 0 0 '0' 'r'
+stickplot 3 1 20 30:box 'g':text 0 0 '1' 'g'
+stickplot 3 2 20 30:box 'b':text 0 0 '2' 'b'
 
 subplot 3 2 3 '':title 'ColumnPlot'
 columnplot 3 0:box 'r':text 0 0 '0' 'r'
@@ -165,7 +165,10 @@ gridplot 2 2 3:box 'm':text 0 0 '3' 'm'
 subplot 3 2 5 '':title 'InPlot':box
 inplot 0.4 1 0.6 1 on:box 'r'
 
-multiplot 3 2 1 2 1 '':title 'MultiPlot':box
+multiplot 3 2 1 2 1 '':title 'MultiPlot and ShearPlot':box
+shearplot 3 0 0.2 0.1:box 'r':text 0 0 '0' 'r'
+shearplot 3 1 0.2 0.1:box 'g':text 0 0 '1' 'g'
+shearplot 3 2 0.2 0.1:box 'b':text 0 0 '2' 'b'
 @end verbatim
 
 @pfig{inplot, Example for most of positioning functions.}
@@ -880,6 +883,7 @@ Basically, you can put this text after the script. Note, that you need to termin
 * TextMark sample::
 * Label sample::
 * Table sample::
+* Iris sample::
 * Tube sample::
 * Tape sample::
 * Torus sample::
@@ -1308,7 +1312,7 @@ plot ys ' *':label ys 'y=%y'
 
 @c ------------------------------------------------------------------
 @external{}
-@node Table sample, Tube sample, Label sample, 1D samples
+@node Table sample, Iris sample, Label sample, 1D samples
 @subsection Table sample
 @nav{}
 
@@ -1333,7 +1337,24 @@ table 0.5 0.95 ys 'y_1\n{}y_2\n{}y_3' '#';value 0.7
 
 @c ------------------------------------------------------------------
 @external{}
-@node Tube sample, Tape sample, Table sample, 1D samples
+@node Iris sample, Tube sample, Table sample, 1D samples
+@subsection Iris sample
+@nav{}
+
+Command @ref{iris} draw Iris plot for columns of data array. The sample code is:
+@verbatim
+read a 'iris.dat'
+crop a 0 4 'x':rearrange a a.nx 50
+subplot 1 1 0 '':title 'Iris plot'
+iris a 'sepal\n length;sepal\n width;petal\n length;petal\n width' '. ';value -1.5;size -2
+@end verbatim
+
+@pfig{iris, Example of Iris()}
+
+
+@c ------------------------------------------------------------------
+@external{}
+@node Tube sample, Tape sample, Iris sample, 1D samples
 @subsection Tube sample
 @nav{}
 
@@ -1873,7 +1894,7 @@ Basically, you can put this text after the script. Note, that you need to termin
 * ContF projection sample::
 * TriPlot and QuadPlot::
 * Dots sample::
-* IFS sample::
+* Fractal sample::
 @end menu
 
 @c ------------------------------------------------------------------
@@ -2105,7 +2126,7 @@ tricont t xt yt zt 'B'
 
 @c ------------------------------------------------------------------
 @external{}
-@node Dots sample, IFS sample, TriPlot and QuadPlot, 3D samples
+@node Dots sample, Fractal sample, TriPlot and QuadPlot, 3D samples
 @subsection Dots sample
 @nav{}
 
@@ -2129,8 +2150,8 @@ box:tens x y z x ' .'
 
 @c ------------------------------------------------------------------
 @external{}
-@node IFS sample, , Dots sample, 3D samples
-@subsection IFS sample
+@node Fractal sample, , Dots sample, 3D samples
+@subsection Fractal sample
 @nav{}
 
 Commands @ref{ifs2d} and @ref{ifs3d} generate points for fractals using iterated function system in 2d and 3d cases correspondingly. The sample codes are:
@@ -2157,6 +2178,22 @@ dots f(0) f(1) f(2) 'G#o';size 0.05
 @pfig{ifs3d, Example of IFS fractal (3d case).}
 
 
+Command @ref{flame2d} generate points for flame fractals in 2d case. The sample codes are:
+@verbatim
+list A [0.33,0,0,0.33,0,0,0.2] [0.33,0,0,0.33,0.67,0,0.2] [0.33,0,0,0.33,0.33,0.33,0.2]\
+        [0.33,0,0,0.33,0,0.67,0.2] [0.33,0,0,0.33,0.67,0.67,0.2]
+new B 2 3 A.ny '0.3'
+put B 3 0 0 -1
+put B 3 0 1 -1
+put B 3 0 2 -1
+flame2d fx fy A B 1000000
+subplot 1 1 0 '<_':title 'Flame2d sample'
+ranges fx fy:box:axis
+plot fx fy 'r#o ';size 0.05
+@end verbatim
+
+@pfig{flame2d, Example of flame fractal (2d case).}
+
 
 @c ------------------------------------------------------------------
 @external{}
@@ -2360,6 +2397,7 @@ In this section I've included some small hints and advices for the improving of
 * Stereo image::
 * Reduce memory usage::
 * Saving and scanning file::
+* Mixing bitmap and vector output::
 @end menu
 
 @c ------------------------------------------------------------------
@@ -2695,7 +2733,7 @@ There is difference in indirect access functions. Function @ref{subdata} use use
 subplot 1 1 0 '':title 'SubData vs Evaluate'
 new in 9 'x^3/1.1':plot in 'ko ':box
 new arg 99 '4*x+4'
-evaluate e in arg:plot e 'b.'; legend 'Evaluate'
+evaluate e in arg off:plot e 'b.'; legend 'Evaluate'
 subdata s in arg:plot s 'r.';legend 'SubData'
 legend 2
 @end verbatim
@@ -2854,7 +2892,7 @@ text 0 0.95 'Equation: ik_0\partial_zu + \Delta u + x\cdot u +\
 
 @pfig{pde, Example of PDE solving.}
 
-The last example is example of beam tracing. Beam tracing equation is special kind of PDE equation written in coordinates accompanied to a ray. Generally this is the same parameters and limitation as for PDE solving but the coordinates are defined by the ray and by parameter of grid width @var{w} in direction transverse the ray. So, you don't need to specify the range of coordinates. @strong{BUT} there is limitation. The accompanied coordinates are well defined only for smooth enough rays, i.e. then the ray curvature @math{K} (which is defined as @math{1/K^2 = (|r''|^2 |r'|^2 - (r'', r'')^2)/|r'|^6}) is much large then the grid width: @math{K>>w}. So, you may receive incorrect results if this condition will be broken.
+The next example is example of beam tracing. Beam tracing equation is special kind of PDE equation written in coordinates accompanied to a ray. Generally this is the same parameters and limitation as for PDE solving but the coordinates are defined by the ray and by parameter of grid width @var{w} in direction transverse the ray. So, you don't need to specify the range of coordinates. @strong{BUT} there is limitation. The accompanied coordinates are well defined only for smooth enough rays, i.e. then the ray curvature @math{K} (which is defined as @math{1/K^2 = (|r''|^2 |r'|^2 - (r'', r'')^2)/|r'|^6}) is much large then the grid width: @math{K>>w}. So, you may receive incorrect results if this condition will be broken.
 
 You may use following code for obtaining the same solution as in previous example:
 @verbatim
@@ -2872,6 +2910,26 @@ text 0.7 -0.05 'central ray'
 
 @pfig{qo2d, Example of beam tracing.}
 
+Note, the @ref{pde} is fast enough and suitable for many cases routine. However, there is situations then media have both together: strong spatial dispersion and spatial inhomogeneity. In this, case the @ref{pde} will produce incorrect result and you need to use advanced PDE solver @ref{apde}. For example, a wave beam, propagated in plasma, described by Hamiltonian @math{exp(-x^2-p^2)}, will have different solution for using of simplification and advanced PDE solver:
+@verbatim
+ranges -1 1 0 2 0 2
+new ar 256 'exp(-2*(x+0.0)^2)':new ai 256
+
+apde res1 'exp(-x^2-p^2)' ar ai 0.01:transpose res1
+subplot 1 2 0 '_':title 'Advanced PDE solver'
+ranges 0 2 -1 1:crange res1
+dens res1:box                                                                     
+axis:xlabel '\i z':ylabel '\i x'                                                  
+text -0.5 0.2 'i\partial_z\i u = exp(-\i x^2+\partial_x^2)[\i u]' 'y'             
+                                                                                  
+pde res2 'exp(-x^2-p^2)' ar ai 0.01
+subplot 1 2 1 '_':title 'Simplified PDE solver'                                   
+dens res2:box                                                                     
+axis:xlabel '\i z':ylabel '\i x'                                                  
+text -0.5 0.2 'i\partial_z\i u \approx\ exp(-\i x^2)\i u+exp(\partial_x^2)[\i u]' 'y'
+@end verbatim
+
+@pfig{apde, Comparison of simplified and advanced PDE solvers.}
 
 @c ------------------------------------------------------------------
 @external{}
@@ -3069,7 +3127,7 @@ next
 
 @c ------------------------------------------------------------------
 @external{}
-@node Saving and scanning file, , Reduce memory usage, Hints
+@node Saving and scanning file, Mixing bitmap and vector output, Reduce memory usage, Hints
 @subsection Scanning file
 @nav{}
 
@@ -3100,6 +3158,31 @@ ranges a(0) a(1):axis:plot a(0) a(1) 'o'
 
 Note, I keep only the leading part of template (i.e. @samp{This is test: %g -> %g} instead of @samp{This is test: %g -> %g q}), because there is no important for us information after the second number in the line.
 
+@c ------------------------------------------------------------------
+@external{}
+@node Mixing bitmap and vector output, , Saving and scanning file, Hints
+@subsection Mixing bitmap and vector output
+@nav{}
+
+Sometimes output plots contain surfaces with a lot of points, and some vector primitives (like axis, text, curves, etc.). Using vector output formats (like EPS or SVG) will produce huge files with possible loss of smoothed lighting. Contrary, the bitmap output may cause the roughness of text and curves. Hopefully, MathGL have a possibility to combine bitmap output for surfaces and vector one for other primitives in the same EPS file, by using @ref{rasterize} command. 
+
+The idea is to prepare part of picture with surfaces or other "heavy" plots and produce the background image from them by help of @ref{rasterize} command. Next, we draw everything to be saved in vector form (text, curves, axis and etc.). Note, that you need to clear primitives (use @ref{clf} command) after @ref{rasterize} if you want to disable duplication of surfaces in output files (like EPS). Note, that some of output formats (like 3D ones, and TeX) don't support the background bitmap, and use @ref{clf} for them will cause the loss of part of picture.
+
+The sample code is:
+@verbatim
+# first draw everything to be in bitmap output
+fsurf 'x^2+y^2' '#';value 10
+
+rasterize   # set above plots as bitmap background
+clf         # clear primitives, to exclude them from file
+
+# now draw everything to be in vector output
+axis:box
+
+# and save file
+write 'fname.eps'
+@end verbatim
+
 @c ==================================================================
 
 @external{}
index ddc3186eb377a553e38f35f1e4e5f794f544645e..5cd8bf714f266619acaf8fc9b24ae34e4a9d8b59 100644 (file)
@@ -126,7 +126,7 @@ Let me demonstrate possibilities of plot positioning and rotation. MathGL has a
 @verbatim
 subplot 2 2 0
 box:text -1 1.1 'Just box' ':L'
-inplot 0.2 0.5 0.7 off
+inplot 0.2 0.5 0.7 off
 box:text 0 1.2 'InPlot example'
 
 subplot 2 2 1:title 'Rotate only'
@@ -135,8 +135,8 @@ rotate 50 60:box
 subplot 2 2 2:title 'Rotate and Aspect'
 rotate 50 60:aspect 1 1 2:box
 
-subplot 2 2 3:title 'Aspect in other direction'
-rotate 50 60:aspect 1 2 2:box
+subplot 2 2 3:title 'Shear'
+box 'c':shear 0.2 0.1:box
 @end verbatim
 Here I used function @code{Puts} for printing the text in arbitrary position of picture (see @ref{Text printing}). Text coordinates and size are connected with axes. However, text coordinates may be everywhere, including the outside the bounding box. I'll show its features later in @ref{Text features}.
 
@@ -147,9 +147,9 @@ Note that several commands can be placed in a string if they are separated by @s
 More complicated sample show how to use most of positioning functions:
 @verbatim
 subplot 3 2 0:title 'StickPlot'
-stickplot 3 0 20 30:box 'r':text 0 0 '0' 'r'
-stickplot 3 1 20 30:box 'g':text 0 0 '1' 'g'
-stickplot 3 2 20 30:box 'b':text 0 0 '2' 'b'
+stickplot 3 0 20 30:box 'r':text 0 0 '0' 'r'
+stickplot 3 1 20 30:box 'g':text 0 0 '1' 'g'
+stickplot 3 2 20 30:box 'b':text 0 0 '2' 'b'
 
 subplot 3 2 3 '':title 'ColumnPlot'
 columnplot 3 0:box 'r':text 0 0 '0' 'r'
@@ -165,7 +165,10 @@ gridplot 2 2 3:box 'm':text 0 0 '3' 'm'
 subplot 3 2 5 '':title 'InPlot':box
 inplot 0.4 1 0.6 1 on:box 'r'
 
-multiplot 3 2 1 2 1 '':title 'MultiPlot':box
+multiplot 3 2 1 2 1 '':title 'MultiPlot and ShearPlot':box
+shearplot 3 0 0.2 0.1:box 'r':text 0 0 '0' 'r'
+shearplot 3 1 0.2 0.1:box 'g':text 0 0 '1' 'g'
+shearplot 3 2 0.2 0.1:box 'b':text 0 0 '2' 'b'
 @end verbatim
 
 @pfig{inplot, Example for most of positioning functions.}
@@ -880,6 +883,7 @@ Basically, you can put this text after the script. Note, that you need to termin
 * TextMark sample::
 * Label sample::
 * Table sample::
+* Iris sample::
 * Tube sample::
 * Tape sample::
 * Torus sample::
@@ -1308,7 +1312,7 @@ plot ys ' *':label ys 'y=%y'
 
 @c ------------------------------------------------------------------
 @external{}
-@node Table sample, Tube sample, Label sample, 1D samples
+@node Table sample, Iris sample, Label sample, 1D samples
 @subsection Table sample
 @nav{}
 
@@ -1333,7 +1337,23 @@ table 0.5 0.95 ys 'y_1\n{}y_2\n{}y_3' '#';value 0.7
 
 @c ------------------------------------------------------------------
 @external{}
-@node Tube sample, Tape sample, Table sample, 1D samples
+@node Iris sample, Tube sample, Table sample, 1D samples
+@subsection Iris sample
+@nav{}
+
+Command @ref{iris} draw Iris plot for columns of data array. The sample code is:
+@verbatim
+read a 'iris.dat'
+crop a 0 4 'x':rearrange a a.nx 50
+subplot 1 1 0 '':title 'Iris plot'
+iris a 'sepal\n length;sepal\n width;petal\n length;petal\n width' '. ';value -1.5;size -2
+@end verbatim
+
+@pfig{iris, Example of Iris()}
+
+@c ------------------------------------------------------------------
+@external{}
+@node Tube sample, Tape sample, Iris sample, 1D samples
 @subsection Tube sample
 @nav{}
 
@@ -1872,7 +1892,7 @@ Basically, you can put this text after the script. Note, that you need to termin
 * ContF projection sample::
 * TriPlot and QuadPlot::
 * Dots sample::
-* IFS sample::
+* Fractal sample::
 @end menu
 
 @c ------------------------------------------------------------------
@@ -2104,7 +2124,7 @@ tricont t xt yt zt 'B'
 
 @c ------------------------------------------------------------------
 @external{}
-@node Dots sample, IFS sample, TriPlot and QuadPlot, 3D samples
+@node Dots sample, Fractal sample, TriPlot and QuadPlot, 3D samples
 @subsection Dots sample
 @nav{}
 
@@ -2128,8 +2148,8 @@ box:tens x y z x ' .'
 
 @c ------------------------------------------------------------------
 @external{}
-@node IFS sample, , Dots sample, 3D samples
-@subsection IFS sample
+@node Fractal sample, , Dots sample, 3D samples
+@subsection Fractal sample
 @nav{}
 
 Commands @ref{ifs2d} and @ref{ifs3d} generate points for fractals using iterated function system in 2d and 3d cases correspondingly. The sample codes are:
@@ -2156,6 +2176,20 @@ dots f(0) f(1) f(2) 'G#o';size 0.05
 @pfig{ifs3d, Example of IFS fractal (3d case).}
 
 
+Command @ref{flame2d} generate points for flame fractals in 2d case. The sample codes are:
+@verbatim
+list A [0.33,0,0,0.33,0,0,0.2] [0.33,0,0,0.33,0.67,0,0.2] [0.33,0,0,0.33,0.33,0.33,0.2]\
+        [0.33,0,0,0.33,0,0.67,0.2] [0.33,0,0,0.33,0.67,0.67,0.2]
+new B 2 3 A.ny '0.3'
+put B 3 0 0 -1
+put B 3 0 1 -1
+put B 3 0 2 -1
+flame2d fx fy A B 1000000
+subplot 1 1 0 '<_':title 'Flame2d sample'
+ranges fx fy:box:axis
+plot fx fy 'r#o ';size 0.05
+@end verbatim
+
 
 
 @c ------------------------------------------------------------------
@@ -2360,6 +2394,7 @@ In this section I've included some small hints and advices for the improving of
 * Stereo image::
 * Reduce memory usage::
 * Saving and scanning file::
+* Mixing bitmap and vector output::
 @end menu
 
 @c ------------------------------------------------------------------
@@ -2695,7 +2730,7 @@ There is difference in indirect access functions. Function @ref{subdata} use use
 subplot 1 1 0 '':title 'SubData vs Evaluate'
 new in 9 'x^3/1.1':plot in 'ko ':box
 new arg 99 '4*x+4'
-evaluate e in arg:plot e 'b.'; legend 'Evaluate'
+evaluate e in arg off:plot e 'b.'; legend 'Evaluate'
 subdata s in arg:plot s 'r.';legend 'SubData'
 legend 2
 @end verbatim
@@ -2854,7 +2889,7 @@ text 0 0.95 'Equation: ik_0\partial_zu + \Delta u + x\cdot u +\
 
 @pfig{pde, Example of PDE solving.}
 
-The last example is example of beam tracing. Beam tracing equation is special kind of PDE equation written in coordinates accompanied to a ray. Generally this is the same parameters and limitation as for PDE solving but the coordinates are defined by the ray and by parameter of grid width @var{w} in direction transverse the ray. So, you don't need to specify the range of coordinates. @strong{BUT} there is limitation. The accompanied coordinates are well defined only for smooth enough rays, i.e. then the ray curvature @math{K} (which is defined as @math{1/K^2 = (|r''|^2 |r'|^2 - (r'', r'')^2)/|r'|^6}) is much large then the grid width: @math{K>>w}. So, you may receive incorrect results if this condition will be broken.
+The next example is example of beam tracing. Beam tracing equation is special kind of PDE equation written in coordinates accompanied to a ray. Generally this is the same parameters and limitation as for PDE solving but the coordinates are defined by the ray and by parameter of grid width @var{w} in direction transverse the ray. So, you don't need to specify the range of coordinates. @strong{BUT} there is limitation. The accompanied coordinates are well defined only for smooth enough rays, i.e. then the ray curvature @math{K} (which is defined as @math{1/K^2 = (|r''|^2 |r'|^2 - (r'', r'')^2)/|r'|^6}) is much large then the grid width: @math{K>>w}. So, you may receive incorrect results if this condition will be broken.
 
 You may use following code for obtaining the same solution as in previous example:
 @verbatim
@@ -2872,6 +2907,27 @@ text 0.7 -0.05 'central ray'
 
 @pfig{qo2d, Example of beam tracing.}
 
+Note, the @ref{pde} is fast enough and suitable for many cases routine. However, there is situations then media have both together: strong spatial dispersion and spatial inhomogeneity. In this, case the @ref{pde} will produce incorrect result and you need to use advanced PDE solver @ref{apde}. For example, a wave beam, propagated in plasma, described by Hamiltonian @math{exp(-x^2-p^2)}, will have different solution for using of simplification and advanced PDE solver:
+@verbatim
+ranges -1 1 0 2 0 2
+new ar 256 'exp(-2*(x+0.0)^2)':new ai 256
+
+apde res1 'exp(-x^2-p^2)' ar ai 0.01:transpose res1
+subplot 1 2 0 '_':title 'Advanced PDE solver'
+ranges 0 2 -1 1:crange res1
+dens res1:box                                                                     
+axis:xlabel '\i z':ylabel '\i x'                                                  
+text -0.5 0.2 'i\partial_z\i u = exp(-\i x^2+\partial_x^2)[\i u]' 'y'             
+                                                                                  
+pde res2 'exp(-x^2-p^2)' ar ai 0.01
+subplot 1 2 1 '_':title 'Simplified PDE solver'                                   
+dens res2:box                                                                     
+axis:xlabel '\i z':ylabel '\i x'                                                  
+text -0.5 0.2 'i\partial_z\i u \approx\ exp(-\i x^2)\i u+exp(\partial_x^2)[\i u]' 'y'
+@end verbatim
+
+@pfig{apde, Comparison of simplified and advanced PDE solvers.}
+
 
 @c ------------------------------------------------------------------
 @external{}
@@ -3071,7 +3127,7 @@ next
 
 @c ------------------------------------------------------------------
 @external{}
-@node Saving and scanning file, , Reduce memory usage, Hints
+@node Saving and scanning file, Mixing bitmap and vector output, Reduce memory usage, Hints
 @subsection Scanning file
 @nav{}
 
@@ -3102,6 +3158,31 @@ ranges a(0) a(1):axis:plot a(0) a(1) 'o'
 
 Note, I keep only the leading part of template (i.e. @samp{This is test: %g -> %g} instead of @samp{This is test: %g -> %g q}), because there is no important for us information after the second number in the line.
 
+@c ------------------------------------------------------------------
+@external{}
+@node Mixing bitmap and vector output, , Saving and scanning file, Hints
+@subsection Mixing bitmap and vector output
+@nav{}
+
+Sometimes output plots contain surfaces with a lot of points, and some vector primitives (like axis, text, curves, etc.). Using vector output formats (like EPS or SVG) will produce huge files with possible loss of smoothed lighting. Contrary, the bitmap output may cause the roughness of text and curves. Hopefully, MathGL have a possibility to combine bitmap output for surfaces and vector one for other primitives in the same EPS file, by using @ref{rasterize} command. 
+
+The idea is to prepare part of picture with surfaces or other "heavy" plots and produce the background image from them by help of @ref{rasterize} command. Next, we draw everything to be saved in vector form (text, curves, axis and etc.). Note, that you need to clear primitives (use @ref{clf} command) after @ref{rasterize} if you want to disable duplication of surfaces in output files (like EPS). Note, that some of output formats (like 3D ones, and TeX) don't support the background bitmap, and use @ref{clf} for them will cause the loss of part of picture.
+
+The sample code is:
+@verbatim
+# first draw everything to be in bitmap output
+fsurf 'x^2+y^2' '#';value 10
+
+rasterize   # set above plots as bitmap background
+clf         # clear primitives, to exclude them from file
+
+# now draw everything to be in vector output
+axis:box
+
+# and save file
+write 'fname.eps'
+@end verbatim
+
 @c ==================================================================
 
 @external{}
index ceb404aa2a90386f094d54e518b0ea20ceefa331..d7d6be7e7ac5b5c8c44f97f7542a28568d63d6d6 100644 (file)
@@ -136,8 +136,9 @@ int main(int argc,char **argv)
 @end verbatim
 Here callback function @code{sample} is defined. This function does all drawing. Other function @code{main} is entry point function for console program. For compilation, just execute the command
 @verbatim
-gcc test.cpp -lmgl-qt -lmgl
+gcc test.cpp -lmgl-qt5 -lmgl
 @end verbatim
+You can use "-lmgl-qt4" instead of "-lmgl-qt5", if Qt4 is installed.
 
 Alternatively you can create yours own class inherited from @ref{mglDraw class} and re-implement the function @code{Draw()} in it:
 @verbatim
@@ -707,8 +708,8 @@ int sample(mglGraph *gr)
   gr->Rotate(50,60);  gr->Box();
   gr->SubPlot(2,2,2); gr->Title("Rotate and Aspect");
   gr->Rotate(50,60);  gr->Aspect(1,1,2);  gr->Box();
-  gr->SubPlot(2,2,3); gr->Title("Aspect in other direction");
-  gr->Rotate(50,60);  gr->Aspect(1,2,2);  gr->Box();
+  gr->SubPlot(2,2,3); gr->Title("Shear");
+  gr->Box("c"); gr->Shear(0.2,0.1); gr->Box();
   return 0;
 }
 @end verbatim
@@ -735,7 +736,10 @@ int sample(mglGraph *gr)
   gr->GridPlot(2, 2, 3);  gr->Box("m"); gr->Puts(mglPoint(0),"3","m");
   gr->SubPlot(3,2,5,"");  gr->Title("InPlot");  gr->Box();
   gr->InPlot(0.4, 1, 0.6, 1, true); gr->Box("r");
-  gr->MultiPlot(3,2,1, 2, 1,"");  gr->Title("MultiPlot"); gr->Box();
+  gr->MultiPlot(3,2,1, 2, 1,"");  gr->Title("MultiPlot and ShearPlot"); gr->Box();
+  gr->ShearPlot(3, 0, 0.2, 0.1);  gr->Box("r"); gr->Puts(mglPoint(0),"0","r");
+  gr->ShearPlot(3, 1, 0.2, 0.1);  gr->Box("g"); gr->Puts(mglPoint(0),"1","g");
+  gr->ShearPlot(3, 2, 0.2, 0.1);  gr->Box("b"); gr->Puts(mglPoint(0),"2","b");
   return 0;
 }
 @end verbatim
@@ -1623,6 +1627,7 @@ void mgls_prepare1d(HMDT y, HMDT y1=0, HMDT y2=0, HMDT x1=0, HMDT x2=0)
 * TextMark sample::
 * Label sample::
 * Table sample::
+* Iris sample::
 * Tube sample::
 * Tape sample::
 * Torus sample::
@@ -2153,7 +2158,7 @@ int sample(mglGraph *gr)
 
 @c ------------------------------------------------------------------
 @external{}
-@node Table sample, Tube sample, Label sample, 1D samples
+@node Table sample, Iris sample, Label sample, 1D samples
 @subsection Table sample
 @nav{}
 
@@ -2177,9 +2182,27 @@ int sample(mglGraph *gr)
 @pfig{table, Example of Table()}
 
 
+
 @c ------------------------------------------------------------------
 @external{}
-@node Tube sample, Tape sample, Table sample, 1D samples
+@node Iris sample, Tube sample, Table sample, 1D samples
+@subsection Iris sample
+@nav{}
+
+Command @ref{iris} draw Iris plot for columns of data array. The sample code is:
+@verbatim
+  mglData a("iris.dat");  a.Crop(0,4,'x');  a.Rearrange(4,50);
+  gr->SubPlot(1,1,0,"");
+  if(big!=3)   gr->Title("Iris sample");
+  gr->Iris(a, "sepal\nlength;sepal\nwidth;petal\nlength;petal\nwidth", ". ", "value -1.5;size -2");
+@end verbatim
+
+@pfig{iris, Example of Iris()}
+
+
+@c ------------------------------------------------------------------
+@external{}
+@node Tube sample, Tape sample, Iris sample, 1D samples
 @subsection Tube sample
 @nav{}
 
@@ -2868,7 +2891,7 @@ void mgls_prepare3d(HMDT a, HMDT b=0)
 * ContF projection sample::
 * TriPlot and QuadPlot::
 * Dots sample::
-* IFS sample::
+* Fractal sample::
 @end menu
 
 @c ------------------------------------------------------------------
@@ -3149,7 +3172,7 @@ int sample(mglGraph *gr)
 
 @c ------------------------------------------------------------------
 @external{}
-@node Dots sample, IFS sample, TriPlot and QuadPlot, 3D samples
+@node Dots sample, Fractal sample, TriPlot and QuadPlot, 3D samples
 @subsection Dots sample
 @nav{}
 
@@ -3184,8 +3207,8 @@ int sample(mglGraph *gr)
 
 @c ------------------------------------------------------------------
 @external{}
-@node IFS sample, , Dots sample, 3D samples
-@subsection IFS sample
+@node Fractal sample, , Dots sample, 3D samples
+@subsection Fractal sample
 @nav{}
 
 Commands @ref{ifs2d} and @ref{ifs3d} generate points for fractals using iterated function system in 2d and 3d cases correspondingly. The sample codes are:
@@ -3224,6 +3247,27 @@ int sample(mglGraph *gr)
 @pfig{ifs3d, Example of IFS fractal (3d case).}
 
 
+Command @ref{flame2d} generate points for flame fractals in 2d case. The sample codes are:
+@verbatim
+int sample(mglGraph *gr)
+{
+  mglData A, B(2,3,5);
+  A.SetList(35, 0.33,0.,0.,0.33,0.,0.,0.2, 0.33,0.,0.,0.33,0.67,0.,0.2, 0.33,0.,0.,0.33,0.33,0.33,0.2,
+      0.33,0.,0.,0.33,0.,0.67,0.2, 0.33,0.,0.,0.33,0.67,0.67,0.2);
+  A.Rearrange(7);
+  for(long i=0;i<2*3*5;i++)    B.a[i] = 0.3;
+  for(long i=0;i<5;i++)        B.a[2*3*i] = B.a[2*3*i+1*2] = B.a[2*3*i+2*2] = 3;
+  mglData f(mglFlame2d(A,B,1000000));
+  gr->SubPlot(1,1,0,"<_");
+  if(big!=3)   gr->Title("Flame2d sample");
+  gr->SetRanges(f.SubData(0), f.SubData(1));
+  gr->Axis();  gr->Box();
+  gr->Plot(f.SubData(0), f.SubData(1),"r#o ","size 0.05");
+}
+@end verbatim
+
+@pfig{flame2d, Example of flame fractal (2d case).}
+
 
 @c ------------------------------------------------------------------
 @external{}
@@ -3500,6 +3544,7 @@ In this section I've included some small hints and advices for the improving of
 * Stereo image::
 * Reduce memory usage::
 * Saving and scanning file::
+* Mixing bitmap and vector output::
 @end menu
 
 @c ------------------------------------------------------------------
@@ -3916,7 +3961,7 @@ int sample(mglGraph *gr)
   mglData in(9), arg(99), e, s;
   gr->Fill(in,"x^3/1.1"); gr->Fill(arg,"4*x+4");
   gr->Plot(in,"ko ");     gr->Box();
-  e = in.Evaluate(arg);   gr->Plot(e,"b.","legend 'Evaluate'");
+  e = in.Evaluate(arg,false); gr->Plot(e,"b.","legend 'Evaluate'");
   s = in.SubData(arg);    gr->Plot(s,"r.","legend 'SubData'");
   gr->Legend(2);
 }
@@ -4118,7 +4163,7 @@ int sample(mglGraph *gr)
 
 @pfig{pde, Example of PDE solving.}
 
-The last example is example of beam tracing. Beam tracing equation is special kind of PDE equation written in coordinates accompanied to a ray. Generally this is the same parameters and limitation as for PDE solving but the coordinates are defined by the ray and by parameter of grid width @var{w} in direction transverse the ray. So, you don't need to specify the range of coordinates. @strong{BUT} there is limitation. The accompanied coordinates are well defined only for smooth enough rays, i.e. then the ray curvature @math{K} (which is defined as @math{1/K^2 = (|r''|^2 |r'|^2 - (r'', r'')^2)/|r'|^6}) is much large then the grid width: @math{K>>w}. So, you may receive incorrect results if this condition will be broken.
+The next example is the beam tracing. Beam tracing equation is special kind of PDE equation written in coordinates accompanied to a ray. Generally this is the same parameters and limitation as for PDE solving but the coordinates are defined by the ray and by parameter of grid width @var{w} in direction transverse the ray. So, you don't need to specify the range of coordinates. @strong{BUT} there is limitation. The accompanied coordinates are well defined only for smooth enough rays, i.e. then the ray curvature @math{K} (which is defined as @math{1/K^2 = (|r''|^2 |r'|^2 - (r'', r'')^2)/|r'|^6}) is much large then the grid width: @math{K>>w}. So, you may receive incorrect results if this condition will be broken.
 
 You may use following code for obtaining the same solution as in previous example:
 @verbatim
@@ -4145,6 +4190,30 @@ int sample(mglGraph *gr)
 
 @pfig{qo2d, Example of beam tracing.}
 
+Note, the @ref{pde} is fast enough and suitable for many cases routine. However, there is situations then media have both together: strong spatial dispersion and spatial inhomogeneity. In this, case the @ref{pde} will produce incorrect result and you need to use advanced PDE solver @ref{apde}. For example, a wave beam, propagated in plasma, described by Hamiltonian @math{exp(-x^2-p^2)}, will have different solution for using of simplification and advanced PDE solver:
+@verbatim
+int sample(mglGraph *gr)
+{
+  gr->SetRanges(-1,1,0,2,0,2);
+  mglData ar(256), ai(256);    gr->Fill(ar,"exp(-2*x^2)");
+
+  mglData res1(gr->APDE("exp(-x^2-p^2)",ar,ai,0.01));  res1.Transpose();
+  gr->SubPlot(1,2,0,"_");      gr->Title("Advanced PDE solver");
+  gr->SetRanges(0,2,-1,1);     gr->SetRange('c',res1);
+  gr->Dens(res1);      gr->Axis();     gr->Box();
+  gr->Label('x',"\\i z");      gr->Label('y',"\\i x");
+  gr->Puts(mglPoint(-0.5,0.2),"i\\partial_z\\i u = exp(-\\i x^2+\\partial_x^2)[\\i u]","y");
+
+  mglData res2(gr->PDE("exp(-x^2-p^2)",ar,ai,0.01));
+  gr->SubPlot(1,2,1,"_");      gr->Title("Simplified PDE solver");
+  gr->Dens(res2);      gr->Axis();     gr->Box();
+  gr->Label('x',"\\i z");      gr->Label('y',"\\i x");
+  gr->Puts(mglPoint(-0.5,0.2),"i\\partial_z\\i u \\approx\\ exp(-\\i x^2)\\i u+exp(\\partial_x^2)[\\i u]","y");
+  return 0;
+}
+@end verbatim
+
+@pfig{apde, Comparison of simplified and advanced PDE solvers.}
 
 @c ------------------------------------------------------------------
 @external{}
@@ -4394,7 +4463,7 @@ int sample(mglGraph *gr)
 
 @c ------------------------------------------------------------------
 @external{}
-@node Saving and scanning file, , Reduce memory usage, Hints
+@node Saving and scanning file, Mixing bitmap and vector output, Reduce memory usage, Hints
 @subsection Scanning file
 @nav{}
 
@@ -4427,6 +4496,31 @@ gr->Axis();      gr->Plot(a.SubData(0),a.SubData(1),"o");
 Note, I keep only the leading part of template (i.e. "This is test: %g -> %g" instead of "This is test: %g -> %g q\n"), because there is no important for us information after the second number in the line.
 
 
+@c ------------------------------------------------------------------
+@external{}
+@node Mixing bitmap and vector output, , Saving and scanning file, Hints
+@subsection Mixing bitmap and vector output
+@nav{}
+
+Sometimes output plots contain surfaces with a lot of points, and some vector primitives (like axis, text, curves, etc.). Using vector output formats (like EPS or SVG) will produce huge files with possible loss of smoothed lighting. Contrary, the bitmap output may cause the roughness of text and curves. Hopefully, MathGL have a possibility to combine bitmap output for surfaces and vector one for other primitives in the same EPS file, by using @ref{rasterize} command. 
+
+The idea is to prepare part of picture with surfaces or other "heavy" plots and produce the background image from them by help of @ref{rasterize} command. Next, we draw everything to be saved in vector form (text, curves, axis and etc.). Note, that you need to clear primitives (use @ref{clf} command) after @ref{rasterize} if you want to disable duplication of surfaces in output files (like EPS). Note, that some of output formats (like 3D ones, and TeX) don't support the background bitmap, and use @ref{clf} for them will cause the loss of part of picture.
+
+The sample code is:
+@verbatim
+// first draw everything to be in bitmap output
+gr->FSurf("x^2+y^2", "#", "value 10");
+
+gr->Rasterize();  // set above plots as bitmap background
+gr->Clf();        // clear primitives, to exclude them from file
+
+// now draw everything to be in vector output
+gr->Axis(); gr->Box();
+
+// and save file
+gr->WriteFrame("fname.eps");
+@end verbatim
+
 
 @c ==================================================================
 @external{}
index 2fca8a27a16ee1165c40be88061012e2fd2e1a8d..49b39161cee21e2c742a54f9ef58a6a9199cdd8e 100644 (file)
@@ -134,8 +134,9 @@ int main(int argc,char **argv)
 @end verbatim
 Здесь используется callback функция @code{sample}, выполняющая собственно рисование. Функция @code{main} -- точка входа в программу -- создает окно (объект @var{gr} типа @code{mglQT}) и запускает цикл обработки сообщений (вызов @code{gr.Run()}). Для компиляции достаточно выполнить команду
 @verbatim
-gcc test.cpp -lmgl-qt -lmgl
+gcc test.cpp -lmgl-qt5 -lmgl
 @end verbatim
+Вы можете использовать "-lmgl-qt4" вместо "-lmgl-qt5", если установлен Qt4.
 
 Альтернативный способ состоит в использовании класса, производного от @code{mglDraw} с переопределенной функцией @code{Draw()}:
 @verbatim
@@ -706,8 +707,8 @@ int sample(mglGraph *gr)
   gr->Rotate(50,60);  gr->Box();
   gr->SubPlot(2,2,2); gr->Title("Rotate and Aspect");
   gr->Rotate(50,60);  gr->Aspect(1,1,2);  gr->Box();
-  gr->SubPlot(2,2,3); gr->Title("Aspect in other direction");
-  gr->Rotate(50,60);  gr->Aspect(1,2,2);  gr->Box();
+  gr->SubPlot(2,2,3); gr->Title("Shear");
+  gr->Box("c"); gr->Shear(0.2,0.1); gr->Box();
   return 0;
 }
 @end verbatim
@@ -734,7 +735,10 @@ int sample(mglGraph *gr)
   gr->GridPlot(2, 2, 3);  gr->Box("m"); gr->Puts(mglPoint(0),"3","m");
   gr->SubPlot(3,2,5,"");  gr->Title("InPlot");  gr->Box();
   gr->InPlot(0.4, 1, 0.6, 1, true); gr->Box("r");
-  gr->MultiPlot(3,2,1, 2, 1,"");  gr->Title("MultiPlot"); gr->Box();
+  gr->MultiPlot(3,2,1, 2, 1,"");  gr->Title("MultiPlot and ShearPlot"); gr->Box();
+  gr->ShearPlot(3, 0, 0.2, 0.1);  gr->Box("r"); gr->Puts(mglPoint(0),"0","r");
+  gr->ShearPlot(3, 1, 0.2, 0.1);  gr->Box("g"); gr->Puts(mglPoint(0),"1","g");
+  gr->ShearPlot(3, 2, 0.2, 0.1);  gr->Box("b"); gr->Puts(mglPoint(0),"2","b");
   return 0;
 }
 @end verbatim
@@ -1612,6 +1616,7 @@ void mgls_prepare1d(HMDT y, HMDT y1=0, HMDT y2=0, HMDT x1=0, HMDT x2=0)
 * TextMark sample::
 * Label sample::
 * Table sample::
+* Iris sample::
 * Tube sample::
 * Tape sample::
 * Torus sample::
@@ -2141,7 +2146,7 @@ int sample(mglGraph *gr)
 
 @c ------------------------------------------------------------------
 @external{}
-@node Table sample, Tube sample, Label sample, 1D samples
+@node Table sample, Iris sample, Label sample, 1D samples
 @subsection Table sample
 @nav{}
 
@@ -2167,7 +2172,24 @@ int sample(mglGraph *gr)
 
 @c ------------------------------------------------------------------
 @external{}
-@node Tube sample, Tape sample, Table sample, 1D samples
+@node Iris sample, Tube sample, Table sample, 1D samples
+@subsection Iris sample
+@nav{}
+
+Command @ref{iris} draw Iris plot for columns of data array. The sample code is:
+@verbatim
+  mglData a("iris.dat");  a.Crop(0,4,'x');  a.Rearrange(4,50);
+  gr->SubPlot(1,1,0,"");
+  if(big!=3)   gr->Title("Iris sample");
+  gr->Iris(a, "sepal\nlength;sepal\nwidth;petal\nlength;petal\nwidth", ". ", "value -1.5;size -2");
+@end verbatim
+
+@pfig{iris, Example of Iris()}
+
+
+@c ------------------------------------------------------------------
+@external{}
+@node Tube sample, Tape sample, Iris sample, 1D samples
 @subsection Tube sample
 @nav{}
 
@@ -2854,7 +2876,7 @@ void mgls_prepare3d(HMDT a, HMDT b=0)
 * ContF projection sample::
 * TriPlot and QuadPlot::
 * Dots sample::
-* IFS sample::
+* Fractal sample::
 @end menu
 
 @c ------------------------------------------------------------------
@@ -3135,7 +3157,7 @@ int sample(mglGraph *gr)
 
 @c ------------------------------------------------------------------
 @external{}
-@node Dots sample, IFS sample, TriPlot and QuadPlot, 3D samples
+@node Dots sample, Fractal sample, TriPlot and QuadPlot, 3D samples
 @subsection Dots sample
 @nav{}
 
@@ -3170,8 +3192,8 @@ int sample(mglGraph *gr)
 
 @c ------------------------------------------------------------------
 @external{}
-@node IFS sample, , Dots sample, 3D samples
-@subsection IFS sample
+@node Fractal sample, , Dots sample, 3D samples
+@subsection Fractal sample
 @nav{}
 
 Commands @ref{ifs2d} and @ref{ifs3d} generate points for fractals using iterated function system in 2d and 3d cases correspondingly. The sample codes are:
@@ -3209,6 +3231,28 @@ int sample(mglGraph *gr)
 
 @pfig{ifs3d, Example of IFS fractal (3d case).}
 
+Command @ref{flame2d} generate points for flame fractals in 2d case. The sample codes are:
+@verbatim
+int sample(mglGraph *gr)
+{
+  mglData A, B(2,3,5);
+  A.SetList(35, 0.33,0.,0.,0.33,0.,0.,0.2, 0.33,0.,0.,0.33,0.67,0.,0.2, 0.33,0.,0.,0.33,0.33,0.33,0.2,
+      0.33,0.,0.,0.33,0.,0.67,0.2, 0.33,0.,0.,0.33,0.67,0.67,0.2);
+  A.Rearrange(7);
+  for(long i=0;i<2*3*5;i++)    B.a[i] = 0.3;
+  for(long i=0;i<5;i++)        B.a[2*3*i] = B.a[2*3*i+1*2] = B.a[2*3*i+2*2] = 3;
+  mglData f(mglFlame2d(A,B,1000000));
+  gr->SubPlot(1,1,0,"<_");
+  if(big!=3)   gr->Title("Flame2d sample");
+  gr->SetRanges(f.SubData(0), f.SubData(1));
+  gr->Axis();  gr->Box();
+  gr->Plot(f.SubData(0), f.SubData(1),"r#o ","size 0.05");
+}
+@end verbatim
+
+@pfig{flame2d, Example of flame fractal (2d case).}
+
+
 
 @c ------------------------------------------------------------------
 @external{}
@@ -3485,6 +3529,7 @@ In this section I've included some small hints and advices for the improving of
 * Stereo image::
 * Reduce memory usage::
 * Saving and scanning file::
+* Mixing bitmap and vector output::
 @end menu
 
 @c ------------------------------------------------------------------
@@ -3899,7 +3944,7 @@ int sample(mglGraph *gr)
   mglData in(9), arg(99), e, s;
   gr->Fill(in,"x^3/1.1"); gr->Fill(arg,"4*x+4");
   gr->Plot(in,"ko ");     gr->Box();
-  e = in.Evaluate(arg);   gr->Plot(e,"b.","legend 'Evaluate'");
+  e = in.Evaluate(arg,false); gr->Plot(e,"b.","legend 'Evaluate'");
   s = in.SubData(arg);    gr->Plot(s,"r.","legend 'SubData'");
   gr->Legend(2);
 }
@@ -4101,7 +4146,7 @@ int sample(mglGraph *gr)
 
 @pfig{pde, Example of PDE solving.}
 
-The last example is example of beam tracing. Beam tracing equation is special kind of PDE equation written in coordinates accompanied to a ray. Generally this is the same parameters and limitation as for PDE solving but the coordinates are defined by the ray and by parameter of grid width @var{w} in direction transverse the ray. So, you don't need to specify the range of coordinates. @strong{BUT} there is limitation. The accompanied coordinates are well defined only for smooth enough rays, i.e. then the ray curvature @math{K} (which is defined as @math{1/K^2 = (|r''|^2 |r'|^2 - (r'', r'')^2)/|r'|^6}) is much large then the grid width: @math{K>>w}. So, you may receive incorrect results if this condition will be broken.
+The next example is example of beam tracing. Beam tracing equation is special kind of PDE equation written in coordinates accompanied to a ray. Generally this is the same parameters and limitation as for PDE solving but the coordinates are defined by the ray and by parameter of grid width @var{w} in direction transverse the ray. So, you don't need to specify the range of coordinates. @strong{BUT} there is limitation. The accompanied coordinates are well defined only for smooth enough rays, i.e. then the ray curvature @math{K} (which is defined as @math{1/K^2 = (|r''|^2 |r'|^2 - (r'', r'')^2)/|r'|^6}) is much large then the grid width: @math{K>>w}. So, you may receive incorrect results if this condition will be broken.
 
 You may use following code for obtaining the same solution as in previous example:
 @verbatim
@@ -4128,6 +4173,31 @@ int sample(mglGraph *gr)
 
 @pfig{qo2d, Example of beam tracing.}
 
+Note, the @ref{pde} is fast enough and suitable for many cases routine. However, there is situations then media have both together: strong spatial dispersion and spatial inhomogeneity. In this, case the @ref{pde} will produce incorrect result and you need to use advanced PDE solver @ref{apde}. For example, a wave beam, propagated in plasma, described by Hamiltonian @math{exp(-x^2-p^2)}, will have different solution for using of simplification and advanced PDE solver:
+@verbatim
+int sample(mglGraph *gr)
+{
+  gr->SetRanges(-1,1,0,2,0,2);
+  mglData ar(256), ai(256);    gr->Fill(ar,"exp(-2*x^2)");
+
+  mglData res1(gr->APDE("exp(-x^2-p^2)",ar,ai,0.01));  res1.Transpose();
+  gr->SubPlot(1,2,0,"_");      gr->Title("Advanced PDE solver");
+  gr->SetRanges(0,2,-1,1);     gr->SetRange('c',res1);
+  gr->Dens(res1);      gr->Axis();     gr->Box();
+  gr->Label('x',"\\i z");      gr->Label('y',"\\i x");
+  gr->Puts(mglPoint(-0.5,0.2),"i\\partial_z\\i u = exp(-\\i x^2+\\partial_x^2)[\\i u]","y");
+
+  mglData res2(gr->PDE("exp(-x^2-p^2)",ar,ai,0.01));
+  gr->SubPlot(1,2,1,"_");      gr->Title("Simplified PDE solver");
+  gr->Dens(res2);      gr->Axis();     gr->Box();
+  gr->Label('x',"\\i z");      gr->Label('y',"\\i x");
+  gr->Puts(mglPoint(-0.5,0.2),"i\\partial_z\\i u \\approx\\ exp(-\\i x^2)\\i u+exp(\\partial_x^2)[\\i u]","y");
+  return 0;
+}
+@end verbatim
+
+@pfig{apde, Comparison of simplified and advanced PDE solvers.}
+
 
 @c ------------------------------------------------------------------
 @external{}
@@ -4374,7 +4444,7 @@ int sample(mglGraph *gr)
 
 @c ------------------------------------------------------------------
 @external{}
-@node Saving and scanning file, , Reduce memory usage, Hints
+@node Saving and scanning file, Mixing bitmap and vector output, Reduce memory usage, Hints
 @subsection Scanning file
 @nav{}
 
@@ -4406,6 +4476,32 @@ gr->Axis();      gr->Plot(a.SubData(0),a.SubData(1),"o");
 
 Note, I keep only the leading part of template (i.e. "This is test: %g -> %g" instead of "This is test: %g -> %g q\n"), because there is no important for us information after the second number in the line.
 
+
+@c ------------------------------------------------------------------
+@external{}
+@node Mixing bitmap and vector output, , Saving and scanning file, Hints
+@subsection Mixing bitmap and vector output
+@nav{}
+
+Sometimes output plots contain surfaces with a lot of points, and some vector primitives (like axis, text, curves, etc.). Using vector output formats (like EPS or SVG) will produce huge files with possible loss of smoothed lighting. Contrary, the bitmap output may cause the roughness of text and curves. Hopefully, MathGL have a possibility to combine bitmap output for surfaces and vector one for other primitives in the same EPS file, by using @ref{rasterize} command. 
+
+The idea is to prepare part of picture with surfaces or other "heavy" plots and produce the background image from them by help of @ref{rasterize} command. Next, we draw everything to be saved in vector form (text, curves, axis and etc.). Note, that you need to clear primitives (use @ref{clf} command) after @ref{rasterize} if you want to disable duplication of surfaces in output files (like EPS). Note, that some of output formats (like 3D ones, and TeX) don't support the background bitmap, and use @ref{clf} for them will cause the loss of part of picture.
+
+The sample code is:
+@verbatim
+// first draw everything to be in bitmap output
+gr->FSurf("x^2+y^2", "#", "value 10");
+
+gr->Rasterize();  // set above plots as bitmap background
+gr->Clf();        // clear primitives, to exclude them from file
+
+// now draw everything to be in vector output
+gr->Axis(); gr->Box();
+
+// and save file
+gr->WriteFrame("fname.eps");
+@end verbatim
+
 @c ==================================================================
 @external{}
 @node FAQ, , Hints, Examples
index 96fee70578705f6cdaac868a16d72c56e62e0853..089d1a67787e8b8bd771cc75ad28009efc3b4dd5 100644 (file)
@@ -6,6 +6,7 @@ This appendix contain description of file formats used by MathGL.
 * Font files::
 * MGLD format::
 * JSON format::
+* IFS format::
 @end menu
 
 @c ------------------------------------------------------------------
@@ -75,7 +76,7 @@ Here nT is the number of triangles; nL is the number of line vertexes; xA, yA, x
 
 @c ------------------------------------------------------------------
 @external{}
-@node JSON format, , MGLD format, File formats
+@node JSON format, IFS format, MGLD format, File formats
 @section JSON format
 @nav{}
 
@@ -97,7 +98,7 @@ array of coordinates of points (vertexes), each element is array in form [x, y,
 @item nprim
 number of primitives;
 @item prim
-array of primitives, each element is array in form [type, n1, n2, n3, n4, id, s, w, p, z, color]. 
+array of primitives, each element is array in form [type, n1, n2, n3, n4, id, s, w, p, z, color].
 
 Here @var{type} is kind of primitive (0 - mark, 1 - line, 2 - triangle, 3 - quadrangle, 4 - glyph), @var{n1}...@var{n4} is index of point for vertexes and @var{n2} can be index of glyph coordinate, @var{s} and @var{w} are size and width if applicable, @var{z} is average z-coordinate, @var{id} is primitive identification number, @var{p} is scaling factor for glyphs.
 
@@ -112,4 +113,29 @@ number of glyph descriptions
 array of glyph descriptions, each element is array in form @code{[nL, [xP0, yP0, xP1, yP1 ...]]}. Here @code{nL} is the number of line vertexes; and @code{xP, yP, xQ, yQ} are coordinates of lines. Line coordinate xP=0x3fff, yP=0x3fff denote line breaking.
 
 @end table
+
+@c ------------------------------------------------------------------
+@external{}
+@node IFS format, , JSON format, File formats
+@section IFS format
+@nav{}
+
+MathGL can read IFS fractal parameters (see @ref{ifsfile}) from a IFS file. Let remind IFS file format. File may contain several records. Each record contain the name of fractal (@samp{binary} in the example below) and the body of fractal, which is enclosed in curly braces @{@}. Symbol @samp{;} start the comment. If the name of fractal contain @samp{(3D)} or @samp{(3d)} then the 3d IFS fractal is specified. The sample below contain two fractals: @samp{binary} -- usual 2d fractal, and @samp{3dfern (3D)} -- 3d fractal.
+
+@verbatim
+ binary
+ { ; comment allowed here
+  ; and here
+  .5  .0 .0 .5 -2.563477 -0.000003 .333333   ; also comment allowed here
+  .5  .0 .0 .5  2.436544 -0.000003 .333333
+  .0 -.5 .5 .0  4.873085  7.563492 .333333
+  }
+
+ 3dfern (3D) {
+   .00  .00 0 .0 .18 .0 0  0.0 0.00 0 0.0 0 .01
+   .85  .00 0 .0 .85 .1 0 -0.1 0.85 0 1.6 0 .85
+   .20 -.20 0 .2 .20 .0 0  0.0 0.30 0 0.8 0 .07
+  -.20  .20 0 .2 .20 .0 0  0.0 0.30 0 0.8 0 .07
+  }
+@end verbatim
 @external{}
index 96fee70578705f6cdaac868a16d72c56e62e0853..089d1a67787e8b8bd771cc75ad28009efc3b4dd5 100644 (file)
@@ -6,6 +6,7 @@ This appendix contain description of file formats used by MathGL.
 * Font files::
 * MGLD format::
 * JSON format::
+* IFS format::
 @end menu
 
 @c ------------------------------------------------------------------
@@ -75,7 +76,7 @@ Here nT is the number of triangles; nL is the number of line vertexes; xA, yA, x
 
 @c ------------------------------------------------------------------
 @external{}
-@node JSON format, , MGLD format, File formats
+@node JSON format, IFS format, MGLD format, File formats
 @section JSON format
 @nav{}
 
@@ -97,7 +98,7 @@ array of coordinates of points (vertexes), each element is array in form [x, y,
 @item nprim
 number of primitives;
 @item prim
-array of primitives, each element is array in form [type, n1, n2, n3, n4, id, s, w, p, z, color]. 
+array of primitives, each element is array in form [type, n1, n2, n3, n4, id, s, w, p, z, color].
 
 Here @var{type} is kind of primitive (0 - mark, 1 - line, 2 - triangle, 3 - quadrangle, 4 - glyph), @var{n1}...@var{n4} is index of point for vertexes and @var{n2} can be index of glyph coordinate, @var{s} and @var{w} are size and width if applicable, @var{z} is average z-coordinate, @var{id} is primitive identification number, @var{p} is scaling factor for glyphs.
 
@@ -112,4 +113,29 @@ number of glyph descriptions
 array of glyph descriptions, each element is array in form @code{[nL, [xP0, yP0, xP1, yP1 ...]]}. Here @code{nL} is the number of line vertexes; and @code{xP, yP, xQ, yQ} are coordinates of lines. Line coordinate xP=0x3fff, yP=0x3fff denote line breaking.
 
 @end table
+
+@c ------------------------------------------------------------------
+@external{}
+@node IFS format, , JSON format, File formats
+@section IFS format
+@nav{}
+
+MathGL can read IFS fractal parameters (see @ref{ifsfile}) from a IFS file. Let remind IFS file format. File may contain several records. Each record contain the name of fractal (@samp{binary} in the example below) and the body of fractal, which is enclosed in curly braces @{@}. Symbol @samp{;} start the comment. If the name of fractal contain @samp{(3D)} or @samp{(3d)} then the 3d IFS fractal is specified. The sample below contain two fractals: @samp{binary} -- usual 2d fractal, and @samp{3dfern (3D)} -- 3d fractal.
+
+@verbatim
+ binary
+ { ; comment allowed here
+  ; and here
+  .5  .0 .0 .5 -2.563477 -0.000003 .333333   ; also comment allowed here
+  .5  .0 .0 .5  2.436544 -0.000003 .333333
+  .0 -.5 .5 .0  4.873085  7.563492 .333333
+  }
+
+ 3dfern (3D) {
+   .00  .00 0 .0 .18 .0 0  0.0 0.00 0 0.0 0 .01
+   .85  .00 0 .0 .85 .1 0 -0.1 0.85 0 1.6 0 .85
+   .20 -.20 0 .2 .20 .0 0  0.0 0.30 0 0.8 0 .07
+  -.20  .20 0 .2 .20 .0 0  0.0 0.30 0 0.8 0 .07
+  }
+@end verbatim
 @external{}
index e631a217ee813f61669dded402a1e3659cc498cc..58de41eed97b492d95b5f167efd68a1b4886fe87 100644 (file)
@@ -24,14 +24,19 @@ MathGL library supports the simplest scripts for data handling and plotting. The
 @section MGL definition
 @nav{}
 
-MGL script language is rather simple. Each string is a command. First word of string is the name of command. Other words are command arguments. Command may have up to 1000 arguments (at least for now). Words are separated from each other by space or tabulation symbol. The upper or lower case of words is important, i.e. variables @var{a} and @var{A} are different variables. Symbol @samp{#} starts the comment (all characters after # will be ignored). The exception is situation when @samp{#} is a part of some string. Also options can be specified after symbol @samp{;} (@pxref{Command options}). Symbol @samp{:} starts new command (like new line character) if it is not placed inside a string or inside brackets.
+MGL script language is rather simple. Each string is a command. First word of string is the name of command. Other words are command arguments. Words are separated from each other by space or tabulation symbol. The upper or lower case of words is important, i.e. variables @var{a} and @var{A} are different variables. Symbol @samp{#} starts the comment (all characters after # will be ignored). The exception is situation when @samp{#} is a part of some string. Also options can be specified after symbol @samp{;} (@pxref{Command options}). Symbol @samp{:} starts new command (like new line character) if it is not placed inside a string or inside brackets.
 
 If string contain references to external parameters (substrings @samp{$0}, @samp{$1} ... @samp{$9}) or definitions (substrings @samp{$a}, @samp{$b} ... @samp{$z}) then before execution the values of parameter/definition will be substituted instead of reference. It allows to use the same MGL script for different parameters (filenames, paths, condition and so on).
 
 Argument can be a string, a variable (data arrays) or a number (scalars).
 @itemize @bullet
 @item
-The string is any symbols between ordinary marks @samp{'}. Long strings can be concatenated from several lines by @samp{\} symbol. I.e. the string @samp{'a +'\<br>' b'} will give string @samp{'a + b'} (here @samp{<br>} is newline). Also you can concatenate strings and numbers using @samp{,} with out spaces (for example, @samp{'max(u)=',u.max,' a.u.'}).
+The string is any symbols between ordinary marks @samp{'}. Long strings can be concatenated from several lines by @samp{\} symbol. I.e. the string @samp{'a +\<br> b'} will give string @samp{'a + b'} (here @samp{<br>} is newline). There are several operations which can be performed with string:
+@itemize @bullet
+@item Concatenation of strings and numbers using @samp{,} with out spaces (for example, @samp{'max(u)=',u.max,' a.u.'} or @samp{'u=',!(1+i2)} for complex numbers);
+@item Getting n-th symbol of the string using @samp{[]} (for example, @samp{'abc'[1]} will give @code{'b'});
+@item Adding value to the last character of the string using @samp{+} (for example, @samp{'abc'+3} will give @code{'abf'}).
+@end itemize
 
 @item
 Usually variable have a name which is arbitrary combination of symbols (except spaces and @samp{'}) started from a letter. Note, you can start an expression with @samp{!} symbol if you want to use complex values. For example, the code @code{new x 100 'x':copy !b !exp(1i*x)} will create real valued data @var{x} and complex data @var{b}, which is equal to @math{exp(I*x)}, where @math{I^2=-1}. A temporary array can be used as variable too:
@@ -54,12 +59,19 @@ result of code for making new data (@pxref{Make another data}) inside @{@}. For
 Temporary variables can not be used as 1st argument for commands which create (return) the data (like @samp{new}, @samp{read}, @samp{hist} and so on).
 
 @item
-Special names @code{nan=#QNAN, inf=INFINITY, rnd=random value, pi=3.1415926..., on=1, off=0, :=-1}, variables with suffixes (@pxref{Data information}), names defined by @ref{define} command are treated as number. Also results of formulas with sizes 1x1x1 are treated as number (for example, @samp{pi/dat.nx}).
+Special names @code{nan=#QNAN, inf=INFINITY, rnd=random value, pi=3.1415926..., on=1, off=0, all=-1, :=-1}, variables with suffixes (@pxref{Data information}), names defined by @ref{define} command, time values (in format "hh-mm-ss_DD.MM.YYYY", "hh-mm-ss" or "DD.MM.YYYY") are treated as number. Also results of formulas with sizes 1x1x1 are treated as number (for example, @samp{pi/dat.nx}). 
 @end itemize
 Before the first using all variables must be defined with the help of commands, like, @ref{new}, @ref{var}, @ref{list}, @ref{copy}, @ref{read}, @ref{hist}, @ref{sum} and so on (see sections @ref{Data constructor}, @ref{Data filling} and @ref{Make another data}).
 
 Command may have several set of possible arguments (for example, @code{plot ydat} and @code{plot xdat ydat}). All command arguments for a selected set must be specified. However, some arguments can have default values. These argument are printed in [], like @code{text ydat ['stl'='']} or @code{text x y 'txt' ['fnt'='' size=-1]}. At this, the record @code{[arg1 arg2 arg3 ...]} means @code{[arg1 [arg2 [arg3 ...]]]}, i.e. you can omit only tailing arguments if you agree with its default values. For example, @code{text x y 'txt' '' 1} or @code{text x y 'txt' ''} is correct, but @code{text x y 'txt' 1} is incorrect (argument @code{'fnt'} is missed).
 
+You can provide several variants of arguments for a command by using @samp{?} symbol for separating them. The actual argument being used is set by @ref{variant}. At this, the last argument is used if the value of @ref{variant} is large than the number of provided variants. By default the first argument is used (i.e. as for @code{variant 0}). For example, the first plot will be drawn by blue (default is the first argument @samp{b}), but the plot after @code{variant 1} will be drawn by red dash (the second is @samp{r|}):
+@verbatim
+fplot 'x' 'b'?'r'
+variant 1
+fplot 'x^3' 'b'?'r|'
+@end verbatim
+
 
 @c ------------------------------------------------------------------
 @external{}
@@ -181,6 +193,12 @@ The code between @code{once on} and @code{once off} will be executed only once.
 Terminate execution.
 @end deftypefn
 
+@cindex variant
+@anchor{variant}
+@deftypefn {MGL command} {} variant @code{val}
+Set variant of argument(s) separated by @samp{?} symbol to be used in further commands.
+@end deftypefn
+
 
 @cindex rkstep
 @anchor{rkstep}
@@ -397,6 +415,11 @@ Function returns the pointer to variable with name @var{name} or zero if variabl
 Function returns the pointer to variable with name @var{name}. If variable is absent then new variable is created with name @var{name}. Use this function to put external data array to the script or get the data from the script. You must @strong{not delete} obtained data arrays!
 @end deftypefn
 
+@deftypefn {Method on @code{mglParse}} @code{void} OpenHDF (@code{const char *}fname)
+@deftypefnx {C function} @code{void} mgl_parser_openhdf (@code{HMPR} pr, @code{const char *}fname)
+Reads all data array from HDF5 file @var{fname} and create MGL variables with names of data names in HDF file. Complex variables will be created if data name starts with @samp{!}.
+@end deftypefn
+
 @deftypefn{Method on @code{mglParse} (C++)} @code{void} DeleteVar (@code{const char *}name)
 @deftypefnx{Method on @code{mglParse} (C++)} @code{void} DeleteVar (@code{const wchar_t *}name)
 @deftypefnx {C function} @code{void} mgl_parser_del_var (@code{HMPR} p, @code{const char *}name)
@@ -434,6 +457,15 @@ Allow to parse @ref{load} command or not.
 Sends stop signal which terminate execution at next command.
 @end deftypefn
 
+@deftypefn {Method on @code{mglParse}} @code{void} SetVariant (@code{int} var=@code{0})
+@deftypefnx {C function} @code{void} mgl_parser_variant (@code{HMPR} p, @code{int} var)
+Sets variant of argument(s) separated by @samp{?} symbol to be used in further commands.
+@end deftypefn
+
+@deftypefn {Method on @code{mglParse}} @code{void} StartID (@code{int} id=@code{0})
+@deftypefnx {C function} @code{void} mgl_parser_start_id (@code{HMPR} p, @code{int} id)
+Sets id (like, line number) of first line in further script parsing.
+@end deftypefn
 
 @deftypefn {Method on @code{mglParse}} @code{long} GetCmdNum ()
 @deftypefnx {C function} @code{long} mgl_parser_cmd_num (@code{HMPR} p)
index d51da364ec4325a3618346bb8c4871c20f3720f9..f05afbe352b9e6a0448e9ffe49383e7150367fb9 100644 (file)
@@ -31,7 +31,12 @@ MathGL имеет встроенный скриптовый язык MGL для
 Аргументы команды могут быть строками, переменными или числами.
 @itemize @bullet
 @item
-Строка -- произвольный набор символов между метками @samp{'}. Длинные строки могут быть соединены из нескольких линий файла символом @samp{\}. Т.е. строки файла @samp{'a +'\<br>' b'} дадут строку @samp{'a + b'} (здесь @samp{<br>} -- перевод строки). Также можно использовать соединение строк и чисел, используя символ @samp{,} без пробелов (например, @samp{'max(u)=',u.max,' a.u.'}).
+Строка -- произвольный набор символов между метками @samp{'}. Длинные строки могут быть соединены из нескольких линий файла символом @samp{\}. Т.е. строки файла @samp{'a +'\<br>' b'} дадут строку @samp{'a + b'} (здесь @samp{<br>} -- перевод строки). MGL поддерживает несколько операций над строками:
+@itemize @bullet
+@item Соединение строк и чисел, используя @samp{,} без пробелов (например, @samp{'max(u)=',u.max,' a.u.'} или @samp{'u=',!(1+i2)} для комплексных чисел);
+@item Получение n-го символа строки, используя @samp{[]} (например, @samp{'abc'[1]} даст @code{'b'});
+@item Инкремент последнего символа строки, используя @samp{+} (например, @samp{'abc'+3} даст @code{'abf'}).
+@end itemize
 
 @item
 Обычно переменная имеет имя, состоящее из букв и чисел (должно начинаться с буквы и не быть длиннее 64 символов). Если выражение или переменная начинается с символа @samp{!}, то будут использованы комплексные значения. Например, код @code{new x 100 'x':copy !b !exp(1i*x)} создаст массив действительных чисел @var{x} и массив комплексных чисел @var{b}, который будет равен @math{exp(I*x)}, где @math{I^2=-1}. 
@@ -55,12 +60,19 @@ MathGL имеет встроенный скриптовый язык MGL для
 Временные массивы не могут стоять в качестве первого аргумента команд, создающих массивы (например, @samp{new}, @samp{read}, @samp{hist} и т.д.).
 
 @item
-К скалярным переменным, кроме собственно чисел, относятся: специальные переменные @code{nan=#QNAN, inf=бесконечность, rnd=случайное число, pi=3.1415926..., on=1, off=0, :=-1}, переменные с суффиксами (@pxref{Data information}), переменные определенные командой @ref{define}. Также массивы размером 1x1x1 считаются скалярами (например, @samp{pi/dat.nx}).
+К скалярным переменным, кроме собственно чисел, относятся: специальные переменные @code{nan=#QNAN, inf=бесконечность, rnd=случайное число, pi=3.1415926..., on=1, off=0, all=-1, :=-1}, переменные с суффиксами (@pxref{Data information}), переменные определенные командой @ref{define}, значения времени (в формате "hh-mm-ss_DD.MM.YYYY", "hh-mm-ss" или "DD.MM.YYYY") . Также массивы размером 1x1x1 считаются скалярами (например, @samp{pi/dat.nx}).
 @end itemize
 Перед первым использованием все переменные должны быть определены с помощью команд, создающих массивы (@ref{new}, @ref{var}, @ref{list}, @ref{copy}, @ref{read}, @ref{hist}, @ref{sum} и др., см. @ref{Data constructor}, @ref{Data filling} и @ref{Make another data}).
 
 Команды могут иметь несколько наборов аргументов (например, @code{plot ydat} и @code{plot xdat ydat}). Все аргументы команды для выбранного набора должны быть указаны, однако часть из них могут иметь значения по умолчанию. Такие аргументы в описании команд будут помещены в квадратные скобки [], например @code{plot ydat ['stl'='' zval=nan]}. При этом запись @code{[arg1 arg2 arg3 ...]} подразумевает @code{[arg1 [arg2 [arg3 ...]]]}, т.е. опускать можно только аргументы с конца, если вы согласны с их значениями по умолчанию. Например, @code{plot ydat '' 1} или @code{plot ydat ''} правильно, а @code{plot ydat 1} не правильно (аргумент @code{'stl'} пропущен).
 
+Можно предоставить несколько вариантов аргументов комманд при использовании символа @samp{?} для их разделения. Конкретный вариант аргумента, используемый при выполнении команды, задается значением команды @ref{variant}. При этом будет использован последний вариант, если задано слишком большое значение. По умолчанию используется первый вариант (т.е. как при @code{variant 0}). Например в следующем коде будет сначала нарисован график синим цветом (первый аргумент @samp{b}), а затем красным пунктиром -- после @code{variant 1} будет использован второй аргумент @samp{r|}:
+@verbatim
+fplot 'x' 'b'?'r'
+variant 1
+fplot 'x^3' 'b'?'r|'
+@end verbatim
+
 
 
 @c TODO Translate it!
@@ -75,80 +87,80 @@ MathGL имеет встроенный скриптовый язык MGL для
 
 @cindex chdir
 @anchor{chdir}
-@deftypefn {MGL command} {} chdir 'path'
+@deftypefn {Команда MGL} {} chdir 'path'
 Переходит в папку @var{path}.
 @end deftypefn
 
 @cindex ask
 @anchor{ask}
-@deftypefn {MGL command} {} ask $N 'question'
+@deftypefn {Команда MGL} {} ask $N 'question'
 Задает @var{N}-ый аргумент скрипта равным ответу пользователя на вопрос @var{question}. Обычно команда показывает диалог с вопросом и полем ввода текста ответа. Здесь @var{N} это цифра (0...9) или буква (a...z).
 @end deftypefn
 
 @cindex define
 @anchor{define}
-@deftypefn {MGL command} {} define $N smth
+@deftypefn {Команда MGL} {} define $N smth
 Задает @var{N}-ый аргумент скрипта равным @var{smth}. Отмечу, что @var{smth} используется как есть (с символами @samp{'} если присутствуют). Выполняется только подстановка других макроопределений $0...$9, $a...$z. Здесь @var{N} это цифра (0...9) или буква (a...z).
 @end deftypefn
-@deftypefn {MGL command} {} define name smth
+@deftypefn {Команда MGL} {} define name smth
 Определяет константу (скаляр) с именем @code{name} и числовым значением @code{smth}. Позднее она может быть использована как обычное число.
 @end deftypefn
 @cindex defchr
 @anchor{defchr}
-@deftypefn {MGL command} {} defchr $N smth
+@deftypefn {Команда MGL} {} defchr $N smth
 Задает @var{N}-ый аргумент скрипта равным символу с UTF кодом @var{smth}. Здесь @var{N} это цифра (0...9) или буква (a...z).
 @end deftypefn
 @cindex defnum
 @anchor{defnum}
-@deftypefn {MGL command} {} defnum $N smth
+@deftypefn {Команда MGL} {} defnum $N smth
 Задает @var{N}-ый аргумент скрипта равным числовому значению @var{smth}. Здесь @var{N} это цифра (0...9) или буква (a...z).
 @end deftypefn
 
 @comment  @cindex defpal
 @comment  @anchor{defpal}
-@comment  @deftypefn {MGL command} {} defpal $N smth
+@comment  @deftypefn {Команда MGL} {} defpal $N smth
 @comment  Задает @var{N}-ый аргумент скрипта равным символу палитры с индексом, найденным из @var{smth}. Здесь @var{N} это цифра (0...9) или буква (a...z).
 @comment  @end deftypefn
 
 @cindex call
 @anchor{call}
-@deftypefn {MGL command} {} call 'fname' [ARG1 ARG2 ... ARG9]
+@deftypefn {Команда MGL} {} call 'fname' [ARG1 ARG2 ... ARG9]
 Переходит к выполнению (вызывает) подпрограммы @var{fname} (или внешнего скрипта, если функция не была найдена). Опциональные аргументы передаются в подпрограмму. См. также @ref{func}.
 @end deftypefn
 
 @cindex func
 @anchor{func}
-@deftypefn {MGL command} {} func 'fname' [narg=0]
+@deftypefn {Команда MGL} {} func 'fname' [narg=0]
 Определяет подпрограмму с именем @var{fname} и задает число требуемых аргументов. Аргументы будут помещены в параметры скрипта $1, $2, ... $9. Отмечу, что выполнение основной программы будет остановлено при встрече @code{func} -- действует аналогично комманде @ref{stop}. См. также @ref{return}.
 
 @end deftypefn
 @cindex return
 @anchor{return}
-@deftypefn {MGL command} {} return
+@deftypefn {Команда MGL} {} return
 Возвращается из подпрограммы. См. также @ref{func}.
 @end deftypefn
 
 @cindex load
 @anchor{load}
-@deftypefn {MGL command} {} load 'filename'
+@deftypefn {Команда MGL} {} load 'filename'
 Загружает дополнительные команды MGL из внешней динамической библиотеки @var{filename}. Данная библиотека должна содержать массив с именем @code{mgl_cmd_extra} типа  @code{mglCommand}, который содержит описание новых комманд.
 @end deftypefn
 
 
 @cindex if
 @anchor{if}
-@deftypefn {MGL command} {} if dat 'cond'
+@deftypefn {Команда MGL} {} if dat 'cond'
 Начинает блок команд, выполняемый если каждый элемент @var{dat} удовлетворяет условию @var{cond}.
 @end deftypefn
-@deftypefn {MGL command} {} if @code{val}
+@deftypefn {Команда MGL} {} if @code{val}
 Начинает блок команд, выполняемый если @code{val} не ноль.
 @end deftypefn
 @cindex elseif
 @anchor{elseif}
-@deftypefn {MGL command} {} elseif dat 'cond'
+@deftypefn {Команда MGL} {} elseif dat 'cond'
 Начинает блок команд, выполняемый если предыдущий @code{if} или @code{elseif} не был выполнен и каждый элемент @var{dat} удовлетворяет условию @var{cond}.
 @end deftypefn
-@deftypefn {MGL command} {} elseif @code{val}
+@deftypefn {Команда MGL} {} elseif @code{val}
 Начинает блок команд, выполняемый если предыдущий @code{if} или @code{elseif} не был выполнен и @code{val} не ноль.
 @end deftypefn
 @cindex else
@@ -164,7 +176,7 @@ MathGL имеет встроенный скриптовый язык MGL для
 
 @cindex for
 @anchor{for}
-@deftypefn {MGL command} {} for $N @code{v1 v2 [dv=1]}
+@deftypefn {Команда MGL} {} for $N @code{v1 v2 [dv=1]}
 Начинает блок команд, выполняемый в цикле с $@var{N}-ым аргументом изменяющимся от @var{v1} до @var{v2} с шагом @var{dv}. Здесь @var{N} это цифра (0...9) или буква (a...z).
 @end deftypefn
 @deftypefn {Команда MGL} {} for $N dat
@@ -178,18 +190,27 @@ MathGL имеет встроенный скриптовый язык MGL для
 
 @cindex once
 @anchor{once}
-@deftypefn {MGL command} {} once @code{val}
+@deftypefn {Команда MGL} {} once @code{val}
 Определяет код (между @code{once on} и @code{once off}) который будет выполнен только один раз. Полезно для работы с большими данными в программах типа UDAV.
 @end deftypefn
 @cindex stop
 @anchor{stop}
-@deftypefn {MGL command} {} stop
+@deftypefn {Команда MGL} {} stop
 Останавливает выполнение скрипта.
 @end deftypefn
 
+
+@cindex variant
+@anchor{variant}
+@deftypefn {Команда MGL} {} variant @code{val}
+Задает вариант аргумента(ов), разделенных символом @samp{?}, для всех последующих комманд.
+@end deftypefn
+
+
+
 @cindex rkstep
 @anchor{rkstep}
-@deftypefn {MGL command} {} rkstep eq1;... var1;... [@code{dt=1}]
+@deftypefn {Команда MGL} {} rkstep eq1;... var1;... [@code{dt=1}]
 Выполняет один шаг решения системы обыкновенных дифференциальных уравнений @{var1' = eq1, ... @} с временным шагом @var{dt}. Здесь переменные @samp{var1}, ... -- переменные, определенные в MGL скрипте ранее. При решении используется метод Рунге-Кутта 4-го порядка.
 @end deftypefn
 
@@ -406,6 +427,11 @@ As an additional feature, when an image is not found or cannot be included, inst
 Возвращает указатель на переменную с именем @var{name}. Если переменная отсутствует, то она будет создана. Используйте эту функцию для добавления внешних массивов в скрипт. @strong{Не удаляйте} полученный массив!
 @end deftypefn
 
+@deftypefn {Метод класса @code{mglParse}} @code{void} OpenHDF (@code{const char *}fname)
+@deftypefnx {Функция С} @code{void} mgl_parser_openhdf (@code{HMPR} pr, @code{const char *}fname)
+Читает все массивы данных из HDF5 файла @var{fname} и создает переменные MGL с соответствующими именами. Если имя данных начинается с @samp{!}, то будут созданы комплексные массивы.
+@end deftypefn
+
 @deftypefn{Метод класса @code{mglParse} (C++)} @code{void} DeleteVar (@code{const char *}name)
 @deftypefnx{Метод класса @code{mglParse} (C++)} @code{void} DeleteVar (@code{const wchar_t *}name)
 @deftypefnx {Функция С} @code{void} mgl_parser_del_var (@code{HMPR} p, @code{const char *}name)
@@ -443,6 +469,16 @@ As an additional feature, when an image is not found or cannot be included, inst
 Посылает сигнал завершения выполнения для следующей команды.
 @end deftypefn
 
+@deftypefn {Метод класса @code{mglParse}} @code{void} SetVariant (@code{int} var=@code{0})
+@deftypefnx {Функция С} @code{void} mgl_parser_variant (@code{HMPR} p, @code{int} var=@code{0})
+Задает вариант аргумента(ов), разделенных символом @samp{?}, для всех последующих комманд.
+@end deftypefn
+
+@deftypefn {Метод класса @code{mglParse}} @code{void} StartID (@code{int} id=@code{0})
+@deftypefnx {Функция С} @code{void} mgl_parser_start_id (@code{HMPR} p, @code{int} id)
+Задает начальный id (обычно это номер строки) первой строки при последующем выполнении скрипта.
+@end deftypefn
+
 
 @deftypefn {Метод класса @code{mglParse}} @code{long} GetCmdNum ()
 @deftypefnx {Функция С} @code{long} mgl_parser_cmd_num (@code{HMPR} p)
@@ -469,10 +505,10 @@ As an additional feature, when an image is not found or cannot be included, inst
 Возвращает описание команды MGL с именем @var{name}.
 @end deftypefn
 
-@deftypefn {Method on @code{mglParse}} @code{void} RK_Step (@code{const char *}eqs, @code{const char *}vars, @code{mreal} dt=@code{1})
-@deftypefnx {Method on @code{mglParse}} @code{void} RK_Step (@code{const wchar_t *}eqs, @code{const wchar_t *}vars, @code{mreal} dt=@code{1})
-@deftypefnx {C function} @code{void} mgl_rk_step (@code{HMPR} p, @code{const char *}eqs, @code{const char *}vars, @code{mreal} dt)
-@deftypefnx {C function} @code{void} mgl_rk_step_w (@code{HMPR} p, @code{const wchar_t *}eqs, @code{const wchar_t *}vars, @code{mreal} dt)
+@deftypefn {Метод класса @code{mglParse}} @code{void} RK_Step (@code{const char *}eqs, @code{const char *}vars, @code{mreal} dt=@code{1})
+@deftypefnx {Метод класса @code{mglParse}} @code{void} RK_Step (@code{const wchar_t *}eqs, @code{const wchar_t *}vars, @code{mreal} dt=@code{1})
+@deftypefnx {Функция С} @code{void} mgl_rk_step (@code{HMPR} p, @code{const char *}eqs, @code{const char *}vars, @code{mreal} dt)
+@deftypefnx {Функция С} @code{void} mgl_rk_step_w (@code{HMPR} p, @code{const wchar_t *}eqs, @code{const wchar_t *}vars, @code{mreal} dt)
 Make one step for ordinary differential equation(s) @{var1' = eq1, ... @} with time-step @var{dt}. Here strings @var{eqs} and @var{vars} contain the equations and variable names separated by symbol @samp{;}. The variable(s) @samp{var1}, ... are the ones, defined in MGL script previously. The Runge-Kutta 4-th order method is used.
 @end deftypefn
 
index 00e102bbbd0436930d3faa0c177a057132602794..f2c279e79c429875e8f114b6bc52e8b9685e179b 100644 (file)
@@ -34,7 +34,7 @@ define complex variable/expression in MGL script if placed at beginning.
 @item #
 set to use solid marks (see @ref{Line styles}) or solid @ref{error} boxes;
 
-set to draw wired plot for @ref{axial}, @ref{surf3}, @ref{surf3a}, @ref{surf3c}, @ref{triplot}, @ref{quadplot}, @ref{area}, @ref{bars}, @ref{barh}, @ref{tube}, @ref{tape}, @ref{cone}, @ref{boxs} and draw boundary only for @ref{circle}, @ref{ellipse}, @ref{rhomb};
+set to draw wired plot for @ref{axial}, @ref{surf3}, @ref{surf3a}, @ref{surf3c}, @ref{triplot}, @ref{quadplot}, @ref{area}, @ref{region}, @ref{bars}, @ref{barh}, @ref{tube}, @ref{tape}, @ref{cone}, @ref{boxs} and draw boundary only for @ref{circle}, @ref{ellipse}, @ref{rhomb};
 
 set to draw also mesh lines for @ref{surf}, @ref{surfc}, @ref{surfa}, @ref{dens}, @ref{densx}, @ref{densy}, @ref{densz}, @ref{dens3}, or boundary for @ref{chart}, @ref{facex}, @ref{facey}, @ref{facez}, @ref{rect};
 
@@ -58,7 +58,9 @@ set color scheme along 2 coordinates @ref{Color scheme}.
 
 @item &
 
-set to pass long integer number in tick template @ref{xtick}, @ref{ytick}, @ref{ztick}, @ref{ctick}.
+set to pass long integer number in tick template @ref{xtick}, @ref{ytick}, @ref{ztick}, @ref{ctick};
+
+specifier of drawing user-defined symbols as mark (see @ref{Line styles});
 
 operation in @ref{Textual formulas}.
 
@@ -70,6 +72,8 @@ one of marks (see @ref{Line styles});
 
 one of mask for face filling (see @ref{Color scheme});
 
+set to start flow threads from 2d array inside data (see @ref{flow});
+
 operation in @ref{Textual formulas}.
 
 @item +
@@ -79,10 +83,14 @@ one of mask for face filling (see @ref{Color scheme});
 
 set to print @samp{+} for positive numbers in @ref{axis}, @ref{label}, @ref{table};
 
+operation of increasing last character value in MGL strings;
+
 operation in @ref{Textual formulas}.
 
 @item ,
-separator for color positions (see @ref{Color styles}) or items in a list.
+separator for color positions (see @ref{Color styles}) or items in a list
+
+concatenation of MGL string with another string or numerical value.
 
 @item -
 solid line style (see @ref{Line styles});
@@ -112,14 +120,22 @@ line dashing style (see @ref{Line styles});
 
 stop color scheme parsing (see @ref{Color scheme});
 
-range operation in @ref{MGL scripts}.
+range operation in @ref{MGL scripts};
+
+style for @ref{axis};
+
+separator of commands in @ref{MGL scripts}.
 
 @item ;
 line dashing style (see @ref{Line styles});
 
 one of mask for face filling (see @ref{Color scheme});
 
-end of an option in @ref{MGL scripts} or in @ref{Command options}.
+start of an option in @ref{MGL scripts} or in @ref{Command options};
+
+separator of equations in @ref{ode};
+
+separator of labels in @ref{iris}.
 
 @item <
 one of marks (see @ref{Line styles});
@@ -176,7 +192,9 @@ set to draw edges for @ref{cone};
 
 set to draw filled boxes for @ref{boxs};
 
-reduce text size inside a string (see @ref{Font styles}).
+reduce text size inside a string (see @ref{Font styles});
+
+operation in @ref{Textual formulas}.
 
 @item ^
 one of marks (see @ref{Line styles});
@@ -211,7 +229,9 @@ set to draw contours at bottom for @ref{cont}, @ref{contf}, @ref{contd}, @ref{co
 switch to lower index inside a string (see @ref{Font styles}).
 
 @item []
-contain symbols excluded from color scheme parsing (see @ref{Color scheme}).
+contain symbols excluded from color scheme parsing (see @ref{Color scheme});
+
+operation of getting n-th character from MGL string.
 
 @item @{@}
 contain extended specification of color (see @ref{Color styles}), dashing (see @ref{Line styles}) or mask (see @ref{Color scheme});
@@ -239,6 +259,8 @@ disable drawing of tick labels for @ref{axis} and @ref{colorbar};
 
 disable first segment in @ref{lamerey};
 
+reduce number of segments in @ref{plot} and @ref{tens};
+
 one of mask for face filling (see @ref{Color scheme}).
 
 @item 0,1,2,3,4,5,6,7,8,9
@@ -266,6 +288,8 @@ set to use absolute position in whole picture for @ref{text}, @ref{colorbar}, @r
 @item a
 set to use absolute position in subplot for @ref{text};
 
+style of @ref{plot}, @ref{radar}, @ref{tens}, @ref{area}, @ref{region} to draw segments between points outside of axis range;
+
 style of @ref{bars}, @ref{barh}, @ref{cones}.
 
 @item B
@@ -308,6 +332,8 @@ green-yellow color (see @ref{Color styles}).
 
 @item F
 
+set fixed bar widths in @ref{bars}, @ref{barh};
+
 set LaTeX-like format for numbers in @ref{axis}, @ref{label}, @ref{table}.
 
 @item f
@@ -347,7 +373,7 @@ set to use inverse values for @ref{cloud}, @ref{pipe}, @ref{dew};
 
 set to fill only area with y1<y<y2 for @ref{region};
 
-inverse Fourier transform for @ref{transform}.
+inverse Fourier transform for @ref{transform}, @ref{transforma}, @ref{fourier}.
 
 @item j
 line dashing style (see @ref{Line styles});
@@ -479,12 +505,15 @@ name of w-axis (one of ternary axis);
 arrow style (see @ref{Line styles}).
 
 @item x
-one of marks (see @ref{Line styles}) or kind of @ref{error} boxes;
 
 name of x-axis or x-direction or 1st dimension of a data array;
 
 start hex-color description if placed inside @{@} (see @ref{Color styles});
 
+one of marks (see @ref{Line styles}) or kind of @ref{error} boxes;
+
+tiles orientation perpendicular to x-axis in @ref{tile}, @ref{tiles};
+
 style of @ref{tape}.
 
 @item Y
@@ -493,7 +522,9 @@ dark yellow or gold color (see @ref{Color styles}).
 @item y
 yellow color (see @ref{Color styles});
 
-name of y-axis or y-direction or 2nd dimension of a data array.
+name of y-axis or y-direction or 2nd dimension of a data array;
+
+tiles orientation perpendicular to y-axis in @ref{tile}, @ref{tiles}.
 
 @item z
 
index 00e102bbbd0436930d3faa0c177a057132602794..f2c279e79c429875e8f114b6bc52e8b9685e179b 100644 (file)
@@ -34,7 +34,7 @@ define complex variable/expression in MGL script if placed at beginning.
 @item #
 set to use solid marks (see @ref{Line styles}) or solid @ref{error} boxes;
 
-set to draw wired plot for @ref{axial}, @ref{surf3}, @ref{surf3a}, @ref{surf3c}, @ref{triplot}, @ref{quadplot}, @ref{area}, @ref{bars}, @ref{barh}, @ref{tube}, @ref{tape}, @ref{cone}, @ref{boxs} and draw boundary only for @ref{circle}, @ref{ellipse}, @ref{rhomb};
+set to draw wired plot for @ref{axial}, @ref{surf3}, @ref{surf3a}, @ref{surf3c}, @ref{triplot}, @ref{quadplot}, @ref{area}, @ref{region}, @ref{bars}, @ref{barh}, @ref{tube}, @ref{tape}, @ref{cone}, @ref{boxs} and draw boundary only for @ref{circle}, @ref{ellipse}, @ref{rhomb};
 
 set to draw also mesh lines for @ref{surf}, @ref{surfc}, @ref{surfa}, @ref{dens}, @ref{densx}, @ref{densy}, @ref{densz}, @ref{dens3}, or boundary for @ref{chart}, @ref{facex}, @ref{facey}, @ref{facez}, @ref{rect};
 
@@ -58,7 +58,9 @@ set color scheme along 2 coordinates @ref{Color scheme}.
 
 @item &
 
-set to pass long integer number in tick template @ref{xtick}, @ref{ytick}, @ref{ztick}, @ref{ctick}.
+set to pass long integer number in tick template @ref{xtick}, @ref{ytick}, @ref{ztick}, @ref{ctick};
+
+specifier of drawing user-defined symbols as mark (see @ref{Line styles});
 
 operation in @ref{Textual formulas}.
 
@@ -70,6 +72,8 @@ one of marks (see @ref{Line styles});
 
 one of mask for face filling (see @ref{Color scheme});
 
+set to start flow threads from 2d array inside data (see @ref{flow});
+
 operation in @ref{Textual formulas}.
 
 @item +
@@ -79,10 +83,14 @@ one of mask for face filling (see @ref{Color scheme});
 
 set to print @samp{+} for positive numbers in @ref{axis}, @ref{label}, @ref{table};
 
+operation of increasing last character value in MGL strings;
+
 operation in @ref{Textual formulas}.
 
 @item ,
-separator for color positions (see @ref{Color styles}) or items in a list.
+separator for color positions (see @ref{Color styles}) or items in a list
+
+concatenation of MGL string with another string or numerical value.
 
 @item -
 solid line style (see @ref{Line styles});
@@ -112,14 +120,22 @@ line dashing style (see @ref{Line styles});
 
 stop color scheme parsing (see @ref{Color scheme});
 
-range operation in @ref{MGL scripts}.
+range operation in @ref{MGL scripts};
+
+style for @ref{axis};
+
+separator of commands in @ref{MGL scripts}.
 
 @item ;
 line dashing style (see @ref{Line styles});
 
 one of mask for face filling (see @ref{Color scheme});
 
-end of an option in @ref{MGL scripts} or in @ref{Command options}.
+start of an option in @ref{MGL scripts} or in @ref{Command options};
+
+separator of equations in @ref{ode};
+
+separator of labels in @ref{iris}.
 
 @item <
 one of marks (see @ref{Line styles});
@@ -176,7 +192,9 @@ set to draw edges for @ref{cone};
 
 set to draw filled boxes for @ref{boxs};
 
-reduce text size inside a string (see @ref{Font styles}).
+reduce text size inside a string (see @ref{Font styles});
+
+operation in @ref{Textual formulas}.
 
 @item ^
 one of marks (see @ref{Line styles});
@@ -211,7 +229,9 @@ set to draw contours at bottom for @ref{cont}, @ref{contf}, @ref{contd}, @ref{co
 switch to lower index inside a string (see @ref{Font styles}).
 
 @item []
-contain symbols excluded from color scheme parsing (see @ref{Color scheme}).
+contain symbols excluded from color scheme parsing (see @ref{Color scheme});
+
+operation of getting n-th character from MGL string.
 
 @item @{@}
 contain extended specification of color (see @ref{Color styles}), dashing (see @ref{Line styles}) or mask (see @ref{Color scheme});
@@ -239,6 +259,8 @@ disable drawing of tick labels for @ref{axis} and @ref{colorbar};
 
 disable first segment in @ref{lamerey};
 
+reduce number of segments in @ref{plot} and @ref{tens};
+
 one of mask for face filling (see @ref{Color scheme}).
 
 @item 0,1,2,3,4,5,6,7,8,9
@@ -266,6 +288,8 @@ set to use absolute position in whole picture for @ref{text}, @ref{colorbar}, @r
 @item a
 set to use absolute position in subplot for @ref{text};
 
+style of @ref{plot}, @ref{radar}, @ref{tens}, @ref{area}, @ref{region} to draw segments between points outside of axis range;
+
 style of @ref{bars}, @ref{barh}, @ref{cones}.
 
 @item B
@@ -308,6 +332,8 @@ green-yellow color (see @ref{Color styles}).
 
 @item F
 
+set fixed bar widths in @ref{bars}, @ref{barh};
+
 set LaTeX-like format for numbers in @ref{axis}, @ref{label}, @ref{table}.
 
 @item f
@@ -347,7 +373,7 @@ set to use inverse values for @ref{cloud}, @ref{pipe}, @ref{dew};
 
 set to fill only area with y1<y<y2 for @ref{region};
 
-inverse Fourier transform for @ref{transform}.
+inverse Fourier transform for @ref{transform}, @ref{transforma}, @ref{fourier}.
 
 @item j
 line dashing style (see @ref{Line styles});
@@ -479,12 +505,15 @@ name of w-axis (one of ternary axis);
 arrow style (see @ref{Line styles}).
 
 @item x
-one of marks (see @ref{Line styles}) or kind of @ref{error} boxes;
 
 name of x-axis or x-direction or 1st dimension of a data array;
 
 start hex-color description if placed inside @{@} (see @ref{Color styles});
 
+one of marks (see @ref{Line styles}) or kind of @ref{error} boxes;
+
+tiles orientation perpendicular to x-axis in @ref{tile}, @ref{tiles};
+
 style of @ref{tape}.
 
 @item Y
@@ -493,7 +522,9 @@ dark yellow or gold color (see @ref{Color styles}).
 @item y
 yellow color (see @ref{Color styles});
 
-name of y-axis or y-direction or 2nd dimension of a data array.
+name of y-axis or y-direction or 2nd dimension of a data array;
+
+tiles orientation perpendicular to y-axis in @ref{tile}, @ref{tiles}.
 
 @item z
 
index 648031cfe617083eeeaa464f94743f54e50aa880..80a9a9e541a9dd4031cf60a7d4614f5acfb96e3c 100644 (file)
 @multitable @columnfractions .16 .12 .12 .12 .12 .12 .12 .12
 @headitem Name @tab q=0 @tab q=1 @tab q=2 @tab q=4 @tab q=5 @tab q=6 @tab q=8
-@item alpha @tab 0.0994 @tab 0.106 @tab 0.137 @tab 0.034 @tab 0.0565 @tab 0.068 @tab 0.0332
-@item area @tab 0.0813 @tab 0.0666 @tab 0.11 @tab 0.0342 @tab 0.0426 @tab 0.0794 @tab 0.0435
-@item aspect @tab 0.0924 @tab 0.142 @tab 0.118 @tab 0.0281 @tab 0.0376 @tab 0.0693 @tab 0.0246
-@item axial @tab 0.706 @tab 0.606 @tab 0.911 @tab 0.243 @tab 0.264 @tab 0.475 @tab 0.0657
-@item axis @tab 0.136 @tab 0.163 @tab 0.155 @tab 0.0299 @tab 0.0293 @tab 0.0494 @tab 0.0506
-@item barh @tab 0.0811 @tab 0.105 @tab 0.121 @tab 0.0299 @tab 0.0326 @tab 0.0454 @tab 0.0273
-@item bars @tab 0.739 @tab 0.134 @tab 0.134 @tab 0.0477 @tab 0.0832 @tab 0.0662 @tab 0.0641
-@item belt @tab 0.0576 @tab 0.0984 @tab 0.0916 @tab 0.0429 @tab 0.0307 @tab 0.0465 @tab 0.0252
-@item box @tab 0.0938 @tab 0.105 @tab 0.127 @tab 0.0312 @tab 0.0352 @tab 0.0549 @tab 0.0501
-@item boxplot @tab 0.0469 @tab 0.127 @tab 0.0534 @tab 0.0587 @tab 0.0252 @tab 0.035 @tab 0.0152
-@item boxs @tab 0.242 @tab 0.223 @tab 0.331 @tab 0.0567 @tab 0.0683 @tab 0.189 @tab 0.095
-@item candle @tab 0.0842 @tab 0.132 @tab 0.0634 @tab 0.0541 @tab 0.0509 @tab 0.0532 @tab 0.016
-@item chart @tab 0.506 @tab 0.427 @tab 0.715 @tab 0.182 @tab 0.199 @tab 0.477 @tab 0.154
-@item cloud @tab 0.0927 @tab 4.72 @tab 5.16 @tab 0.0308 @tab 1.2 @tab 1.64 @tab 0.0265
-@item colorbar @tab 0.266 @tab 0.273 @tab 0.246 @tab 0.174 @tab 0.182 @tab 0.253 @tab 0.267
-@item combined @tab 0.603 @tab 0.401 @tab 0.458 @tab 0.306 @tab 0.276 @tab 0.362 @tab 0.256
-@item cones @tab 0.308 @tab 0.189 @tab 0.241 @tab 0.144 @tab 0.132 @tab 0.172 @tab 0.109
-@item cont @tab 0.079 @tab 0.0795 @tab 0.124 @tab 0.0374 @tab 0.0374 @tab 0.0606 @tab 0.0326
-@item cont_xyz @tab 0.14 @tab 0.106 @tab 0.249 @tab 0.33 @tab 0.159 @tab 0.115 @tab 0.152
-@item conta @tab 0.135 @tab 0.106 @tab 0.132 @tab 0.0822 @tab 0.101 @tab 0.0894 @tab 0.083
-@item contd @tab 0.209 @tab 0.181 @tab 0.2 @tab 0.0722 @tab 0.075 @tab 0.109 @tab 0.0666
-@item contf @tab 0.156 @tab 0.157 @tab 0.177 @tab 0.0645 @tab 0.0658 @tab 0.0881 @tab 0.0584
-@item contf_xyz @tab 0.214 @tab 0.211 @tab 0.175 @tab 0.0934 @tab 0.111 @tab 0.104 @tab 0.0851
-@item contfa @tab 0.293 @tab 0.224 @tab 0.259 @tab 0.142 @tab 0.165 @tab 0.176 @tab 0.14
-@item contv @tab 0.113 @tab 0.105 @tab 0.135 @tab 0.051 @tab 0.0482 @tab 0.071 @tab 0.0386
-@item correl @tab 0.0597 @tab 0.0798 @tab 0.0772 @tab 0.0617 @tab 0.0697 @tab 0.0569 @tab 0.0284
-@item curvcoor @tab 0.0906 @tab 0.0892 @tab 0.134 @tab 0.0434 @tab 0.0432 @tab 0.0688 @tab 0.0403
-@item cut @tab 1.21 @tab 0.776 @tab 0.795 @tab 0.843 @tab 0.632 @tab 0.683 @tab 0.62
-@item dat_diff @tab 0.144 @tab 0.104 @tab 0.13 @tab 0.105 @tab 0.0779 @tab 0.0954 @tab 0.0927
-@item dat_extra @tab 0.442 @tab 0.279 @tab 0.304 @tab 0.122 @tab 0.213 @tab 0.257 @tab 0.0869
-@item data1 @tab 5.13 @tab 4.08 @tab 3.72 @tab 3.74 @tab 3.45 @tab 3.95 @tab 3.35
-@item data2 @tab 3.31 @tab 2.72 @tab 2.81 @tab 3 @tab 2.98 @tab 2.82 @tab 2.61
-@item dens @tab 0.105 @tab 0.118 @tab 0.168 @tab 0.0456 @tab 0.0547 @tab 0.085 @tab 0.0426
-@item dens_xyz @tab 0.158 @tab 0.16 @tab 0.23 @tab 0.0827 @tab 0.168 @tab 0.106 @tab 0.148
-@item densa @tab 0.127 @tab 0.138 @tab 0.159 @tab 0.0915 @tab 0.0981 @tab 0.11 @tab 0.0805
-@item dew @tab 1.7 @tab 0.831 @tab 0.765 @tab 0.204 @tab 0.172 @tab 0.182 @tab 0.0895
-@item dots @tab 0.148 @tab 0.119 @tab 0.13 @tab 0.0535 @tab 0.0535 @tab 0.0674 @tab 0.0636
-@item error @tab 0.104 @tab 0.0724 @tab 0.0861 @tab 0.0999 @tab 0.121 @tab 0.111 @tab 0.0285
-@item error2 @tab 0.0625 @tab 0.0672 @tab 0.0873 @tab 0.0463 @tab 0.0359 @tab 0.0558 @tab 0.0365
-@item export @tab 0.177 @tab 0.221 @tab 0.249 @tab 0.112 @tab 0.124 @tab 0.154 @tab 0.17
-@item fall @tab 0.135 @tab 0.0346 @tab 0.0641 @tab 0.0363 @tab 0.0485 @tab 0.0797 @tab 0.084
-@item fit @tab 3.11 @tab 0.169 @tab 0.13 @tab 0.0734 @tab 0.0727 @tab 2.99 @tab 0.123
-@item flow @tab 0.513 @tab 0.386 @tab 0.497 @tab 0.272 @tab 0.423 @tab 0.377 @tab 0.262
-@item fog @tab 0.1 @tab 0.113 @tab 0.117 @tab 0.0297 @tab 0.039 @tab 0.0712 @tab 0.0616
-@item fonts @tab 2.67 @tab 2.63 @tab 3.03 @tab 2.74 @tab 2.67 @tab 2.88 @tab 2.94
-@item grad @tab 0.124 @tab 0.119 @tab 0.192 @tab 0.127 @tab 0.0672 @tab 0.109 @tab 0.0476
-@item hist @tab 0.216 @tab 0.202 @tab 0.226 @tab 0.131 @tab 0.149 @tab 0.142 @tab 0.0786
-@item indirect @tab 0.0602 @tab 0.0582 @tab 0.0586 @tab 0.0844 @tab 0.0792 @tab 0.152 @tab 0.0262
-@item inplot @tab 0.148 @tab 0.139 @tab 0.0964 @tab 0.0399 @tab 0.0624 @tab 0.0449 @tab 0.0495
-@item label @tab 0.146 @tab 0.0577 @tab 0.169 @tab 0.0578 @tab 0.0959 @tab 0.079 @tab 0.0289
-@item legend @tab 0.168 @tab 0.227 @tab 0.23 @tab 0.0345 @tab 0.0364 @tab 0.073 @tab 0.0382
-@item light @tab 0.107 @tab 0.0814 @tab 0.0821 @tab 0.0804 @tab 0.073 @tab 0.0774 @tab 0.073
-@item loglog @tab 0.0776 @tab 0.0741 @tab 0.113 @tab 0.0451 @tab 0.0375 @tab 0.0559 @tab 0.0335
-@item map @tab 0.178 @tab 0.119 @tab 0.188 @tab 0.0767 @tab 0.0887 @tab 0.111 @tab 0.0304
-@item mark @tab 0.0785 @tab 0.141 @tab 0.0551 @tab 0.028 @tab 0.0311 @tab 0.0365 @tab 0.016
-@item mask @tab 0.0854 @tab 0.131 @tab 0.115 @tab 0.0296 @tab 0.0412 @tab 0.0547 @tab 0.0213
-@item mesh @tab 0.11 @tab 0.112 @tab 0.0894 @tab 0.0368 @tab 0.0518 @tab 0.0508 @tab 0.0724
-@item mirror @tab 0.197 @tab 0.104 @tab 0.146 @tab 0.0363 @tab 0.0433 @tab 0.0695 @tab 0.0384
-@item molecule @tab 0.153 @tab 0.107 @tab 0.199 @tab 0.0653 @tab 0.0657 @tab 0.086 @tab 0.037
-@item ode @tab 1.49 @tab 0.618 @tab 0.718 @tab 0.62 @tab 0.595 @tab 0.72 @tab 0.556
-@item ohlc @tab 0.0347 @tab 0.0487 @tab 0.0551 @tab 0.0406 @tab 0.0281 @tab 0.0389 @tab 0.0167
-@item param1 @tab 0.316 @tab 0.247 @tab 0.321 @tab 0.119 @tab 0.155 @tab 0.158 @tab 0.0958
-@item param2 @tab 0.505 @tab 0.428 @tab 0.496 @tab 0.152 @tab 0.138 @tab 0.187 @tab 0.104
-@item param3 @tab 3.33 @tab 3.59 @tab 3.37 @tab 1.82 @tab 1.89 @tab 1.94 @tab 1.65
-@item paramv @tab 4.31 @tab 4.7 @tab 4.25 @tab 1.21 @tab 1.13 @tab 1.23 @tab 1.07
-@item parser @tab 0.074 @tab 0.102 @tab 0.128 @tab 0.0973 @tab 0.154 @tab 0.104 @tab 0.145
-@item pde @tab 0.943 @tab 0.934 @tab 0.987 @tab 1.01 @tab 0.816 @tab 0.79 @tab 0.809
-@item pipe @tab 4.13 @tab 2.98 @tab 2.46 @tab 0.597 @tab 0.848 @tab 0.815 @tab 0.588
-@item plot @tab 0.0702 @tab 0.0848 @tab 0.112 @tab 0.0409 @tab 0.0409 @tab 0.0568 @tab 0.029
-@item primitives @tab 0.0998 @tab 0.0958 @tab 0.175 @tab 0.0313 @tab 0.0363 @tab 0.0815 @tab 0.0265
-@item projection @tab 0.138 @tab 0.14 @tab 0.222 @tab 0.0463 @tab 0.046 @tab 0.157 @tab 0.104
-@item projection5 @tab 0.124 @tab 0.132 @tab 0.197 @tab 0.0414 @tab 0.0423 @tab 0.1 @tab 0.0353
-@item qo2d @tab 0.375 @tab 0.331 @tab 0.364 @tab 0.244 @tab 0.279 @tab 0.287 @tab 0.244
-@item radar @tab 0.0348 @tab 0.0503 @tab 0.0598 @tab 0.0582 @tab 0.0297 @tab 0.083 @tab 0.0147
-@item refill @tab 0.391 @tab 0.28 @tab 0.233 @tab 0.161 @tab 0.133 @tab 0.155 @tab 0.0867
-@item region @tab 0.0748 @tab 0.0719 @tab 0.117 @tab 0.0291 @tab 0.0319 @tab 0.0566 @tab 0.0256
-@item schemes @tab 0.123 @tab 0.102 @tab 0.184 @tab 0.0371 @tab 0.0392 @tab 0.0717 @tab 0.0469
-@item several_light @tab 0.0862 @tab 0.102 @tab 0.128 @tab 0.0284 @tab 0.0327 @tab 0.0912 @tab 0.0246
-@item solve @tab 0.126 @tab 0.0944 @tab 0.148 @tab 0.06 @tab 0.078 @tab 0.0841 @tab 0.0579
-@item stem @tab 0.061 @tab 0.0558 @tab 0.124 @tab 0.0312 @tab 0.0315 @tab 0.0479 @tab 0.0265
-@item step @tab 0.132 @tab 0.0962 @tab 0.0708 @tab 0.0321 @tab 0.0322 @tab 0.191 @tab 0.0398
-@item stereo @tab 0.0706 @tab 0.0877 @tab 0.137 @tab 0.0304 @tab 0.0334 @tab 0.0672 @tab 0.0394
-@item stfa @tab 0.177 @tab 0.0918 @tab 0.146 @tab 0.0518 @tab 0.0657 @tab 0.0935 @tab 0.059
-@item style @tab 0.176 @tab 0.166 @tab 0.226 @tab 0.0408 @tab 0.0426 @tab 0.082 @tab 0.0252
-@item surf @tab 0.191 @tab 0.191 @tab 0.233 @tab 0.0669 @tab 0.0704 @tab 0.105 @tab 0.118
-@item surf3 @tab 3.1 @tab 2.9 @tab 2.88 @tab 2.89 @tab 2.78 @tab 3.57 @tab 1.16
-@item surf3a @tab 0.754 @tab 0.471 @tab 0.526 @tab 0.399 @tab 0.394 @tab 0.511 @tab 0.349
-@item surf3c @tab 0.736 @tab 0.448 @tab 0.502 @tab 0.383 @tab 0.387 @tab 0.494 @tab 0.333
-@item surfa @tab 0.0647 @tab 0.112 @tab 0.0916 @tab 0.0298 @tab 0.0311 @tab 0.0626 @tab 0.025
-@item surfc @tab 0.0588 @tab 0.103 @tab 0.139 @tab 0.0313 @tab 0.0311 @tab 0.0602 @tab 0.0248
-@item table @tab 0.194 @tab 0.226 @tab 0.279 @tab 0.0358 @tab 0.0361 @tab 0.0809 @tab 0.0438
-@item tape @tab 0.1 @tab 0.108 @tab 0.125 @tab 0.0302 @tab 0.0326 @tab 0.0526 @tab 0.0405
-@item tens @tab 0.0959 @tab 0.109 @tab 0.0642 @tab 0.0727 @tab 0.0965 @tab 0.074 @tab 0.0254
-@item ternary @tab 0.142 @tab 0.137 @tab 0.205 @tab 0.041 @tab 0.0418 @tab 0.0942 @tab 0.0355
-@item text @tab 0.123 @tab 0.124 @tab 0.166 @tab 0.045 @tab 0.0567 @tab 0.0758 @tab 0.025
-@item text2 @tab 0.132 @tab 0.132 @tab 0.167 @tab 0.0721 @tab 0.0872 @tab 0.095 @tab 0.0467
-@item textmark @tab 0.224 @tab 0.0722 @tab 0.0939 @tab 0.126 @tab 0.0474 @tab 0.0575 @tab 0.0242
-@item ticks @tab 0.186 @tab 0.145 @tab 0.207 @tab 0.0341 @tab 0.042 @tab 0.0689 @tab 0.0609
-@item tile @tab 0.0861 @tab 0.0811 @tab 0.11 @tab 0.0277 @tab 0.0299 @tab 0.0451 @tab 0.0618
-@item tiles @tab 0.0558 @tab 0.0581 @tab 0.0772 @tab 0.0272 @tab 0.0303 @tab 0.0454 @tab 0.0583
-@item torus @tab 0.121 @tab 0.116 @tab 0.193 @tab 0.038 @tab 0.0448 @tab 0.104 @tab 0.0314
-@item traj @tab 0.0354 @tab 0.0395 @tab 0.0789 @tab 0.0467 @tab 0.0253 @tab 0.0364 @tab 0.0173
-@item triangulation @tab 0.0603 @tab 0.214 @tab 0.139 @tab 0.0455 @tab 0.0734 @tab 0.0845 @tab 0.0265
-@item triplot @tab 0.0692 @tab 0.0519 @tab 0.131 @tab 0.0497 @tab 0.0325 @tab 0.0943 @tab 0.0124
-@item tube @tab 0.151 @tab 0.135 @tab 0.294 @tab 0.0491 @tab 0.0601 @tab 0.108 @tab 0.0609
-@item type0 @tab 0.251 @tab 0.187 @tab 0.248 @tab 0.113 @tab 0.0785 @tab 0.157 @tab 0.0567
-@item type1 @tab 0.249 @tab 0.179 @tab 0.274 @tab 0.0796 @tab 0.0786 @tab 0.145 @tab 0.0564
-@item type2 @tab 0.246 @tab 0.212 @tab 0.25 @tab 0.0868 @tab 0.104 @tab 0.151 @tab 0.0625
-@item vect @tab 0.166 @tab 0.155 @tab 0.255 @tab 0.13 @tab 0.132 @tab 0.181 @tab 0.174
-@item vecta @tab 0.121 @tab 0.0841 @tab 0.108 @tab 0.0755 @tab 0.0672 @tab 0.155 @tab 0.0686
-@item venn @tab 0.0182 @tab 0.0527 @tab 0.0913 @tab 0.0368 @tab 0.0385 @tab 0.0706 @tab 0.013
+@item 3wave @tab 0.0447 @tab 0.0932 @tab 0.0975 @tab 0.038 @tab 0.0758 @tab 0.0879 @tab 0.0241
+@item alpha @tab 0.0833 @tab 0.142 @tab 0.131 @tab 0.0256 @tab 0.0494 @tab 0.0562 @tab 0.0294
+@item apde @tab 85.7 @tab 86.1 @tab 86 @tab 85.7 @tab 85.4 @tab 85.9 @tab 85.8
+@item area @tab 0.0419 @tab 0.0876 @tab 0.104 @tab 0.0239 @tab 0.0631 @tab 0.081 @tab 0.0163
+@item aspect @tab 0.0382 @tab 0.0748 @tab 0.0797 @tab 0.0197 @tab 0.0461 @tab 0.0482 @tab 0.0155
+@item axial @tab 0.756 @tab 1.2 @tab 1.13 @tab 0.2 @tab 0.573 @tab 0.597 @tab 0.131
+@item axis @tab 0.0691 @tab 0.163 @tab 0.153 @tab 0.0204 @tab 0.0717 @tab 0.0665 @tab 0.0201
+@item barh @tab 0.0363 @tab 0.0668 @tab 0.0659 @tab 0.019 @tab 0.0432 @tab 0.0412 @tab 0.00942
+@item bars @tab 0.0436 @tab 0.0855 @tab 0.0982 @tab 0.0378 @tab 0.0574 @tab 0.0709 @tab 0.0172
+@item belt @tab 0.0398 @tab 0.052 @tab 0.0577 @tab 0.0251 @tab 0.0285 @tab 0.0359 @tab 0.0232
+@item bifurcation @tab 0.58 @tab 0.657 @tab 0.662 @tab 0.619 @tab 0.668 @tab 0.659 @tab 0.566
+@item box @tab 0.0572 @tab 0.103 @tab 0.105 @tab 0.024 @tab 0.0446 @tab 0.0537 @tab 0.0419
+@item boxplot @tab 0.0437 @tab 0.158 @tab 0.149 @tab 0.083 @tab 0.091 @tab 0.0985 @tab 0.103
+@item boxs @tab 0.267 @tab 0.516 @tab 0.494 @tab 0.0499 @tab 0.17 @tab 0.188 @tab 0.0469
+@item candle @tab 0.0275 @tab 0.0531 @tab 0.0622 @tab 0.0282 @tab 0.0399 @tab 0.0489 @tab 0.0131
+@item chart @tab 0.421 @tab 0.797 @tab 0.812 @tab 0.124 @tab 0.301 @tab 0.458 @tab 0.0935
+@item cloud @tab 0.0415 @tab 5.25 @tab 4.1 @tab 0.0366 @tab 0.618 @tab 0.838 @tab 0.0216
+@item colorbar @tab 0.123 @tab 0.23 @tab 0.244 @tab 0.0901 @tab 0.231 @tab 0.231 @tab 0.0461
+@item combined @tab 0.416 @tab 0.413 @tab 0.387 @tab 0.202 @tab 0.276 @tab 0.299 @tab 0.176
+@item cones @tab 0.185 @tab 0.21 @tab 0.19 @tab 0.0694 @tab 0.11 @tab 0.134 @tab 0.0577
+@item cont @tab 0.0727 @tab 0.146 @tab 0.15 @tab 0.0482 @tab 0.188 @tab 0.16 @tab 0.0438
+@item cont_xyz @tab 0.0408 @tab 0.0712 @tab 0.0748 @tab 0.0306 @tab 0.0619 @tab 0.0785 @tab 0.0302
+@item conta @tab 0.0419 @tab 0.0775 @tab 0.0761 @tab 0.0321 @tab 0.0651 @tab 0.0584 @tab 0.0289
+@item contd @tab 0.206 @tab 0.258 @tab 0.251 @tab 0.114 @tab 0.145 @tab 0.158 @tab 0.0892
+@item contf @tab 0.159 @tab 0.245 @tab 0.207 @tab 0.0796 @tab 0.133 @tab 0.144 @tab 0.0759
+@item contf_xyz @tab 0.1 @tab 0.109 @tab 0.108 @tab 0.0589 @tab 0.078 @tab 0.0812 @tab 0.0495
+@item contfa @tab 0.152 @tab 0.195 @tab 0.17 @tab 0.083 @tab 0.105 @tab 0.143 @tab 0.0596
+@item contv @tab 0.119 @tab 0.162 @tab 0.161 @tab 0.0706 @tab 0.117 @tab 0.143 @tab 0.0475
+@item correl @tab 0.0319 @tab 0.0791 @tab 0.0791 @tab 0.0293 @tab 0.0519 @tab 0.0546 @tab 0.0144
+@item curvcoor @tab 0.0734 @tab 0.151 @tab 0.153 @tab 0.0374 @tab 0.0922 @tab 0.091 @tab 0.0326
+@item cut @tab 0.826 @tab 0.718 @tab 0.544 @tab 0.356 @tab 0.338 @tab 0.383 @tab 0.318
+@item dat_diff @tab 0.0712 @tab 0.109 @tab 0.106 @tab 0.0457 @tab 0.0664 @tab 0.0825 @tab 0.0285
+@item dat_extra @tab 0.216 @tab 0.32 @tab 0.241 @tab 0.0643 @tab 0.131 @tab 0.22 @tab 0.0508
+@item data1 @tab 2.7 @tab 1.99 @tab 1.78 @tab 1.4 @tab 1.4 @tab 1.49 @tab 1.28
+@item data2 @tab 1.56 @tab 1.34 @tab 1.26 @tab 1.17 @tab 1.3 @tab 1.24 @tab 1.09
+@item dens @tab 0.0815 @tab 0.145 @tab 0.147 @tab 0.0282 @tab 0.0668 @tab 0.0834 @tab 0.0259
+@item dens_xyz @tab 0.0693 @tab 0.105 @tab 0.116 @tab 0.0566 @tab 0.0659 @tab 0.0751 @tab 0.0311
+@item densa @tab 0.0709 @tab 0.0963 @tab 0.111 @tab 0.0562 @tab 0.0598 @tab 0.0835 @tab 0.0438
+@item detect @tab 0.138 @tab 0.175 @tab 0.17 @tab 0.082 @tab 0.1 @tab 0.116 @tab 0.0695
+@item dew @tab 1.82 @tab 1.8 @tab 0.838 @tab 0.14 @tab 0.142 @tab 0.123 @tab 0.0846
+@item diffract @tab 0.0745 @tab 0.157 @tab 0.171 @tab 0.0584 @tab 0.125 @tab 0.146 @tab 0.0351
+@item dilate @tab 0.078 @tab 0.179 @tab 0.199 @tab 0.0343 @tab 0.103 @tab 0.112 @tab 0.031
+@item dots @tab 0.0694 @tab 0.104 @tab 0.11 @tab 0.0285 @tab 0.0503 @tab 0.0571 @tab 0.0166
+@item earth @tab 31.5 @tab 34.8 @tab 22.7 @tab 12.4 @tab 13 @tab 12.4 @tab 12.1
+@item error @tab 0.0383 @tab 0.0944 @tab 0.0927 @tab 0.0301 @tab 0.0791 @tab 0.0704 @tab 0.016
+@item error2 @tab 0.0371 @tab 0.0927 @tab 0.0951 @tab 0.019 @tab 0.0571 @tab 0.0583 @tab 0.0297
+@item export @tab 0.128 @tab 0.201 @tab 0.179 @tab 0.0842 @tab 0.0948 @tab 0.115 @tab 0.079
+@item fall @tab 0.041 @tab 0.0523 @tab 0.0598 @tab 0.0162 @tab 0.0384 @tab 0.0412 @tab 0.0129
+@item fit @tab 0.0348 @tab 0.091 @tab 0.0833 @tab 0.0237 @tab 0.0465 @tab 0.048 @tab 0.0159
+@item flame2d @tab 5.63 @tab 5.88 @tab 5.75 @tab 3.1 @tab 3.27 @tab 3.13 @tab 0.984
+@item flow @tab 0.341 @tab 0.416 @tab 0.42 @tab 0.315 @tab 0.41 @tab 0.402 @tab 0.322
+@item fog @tab 0.0453 @tab 0.0778 @tab 0.0943 @tab 0.0156 @tab 0.0546 @tab 0.0768 @tab 0.0153
+@item fonts @tab 0.0589 @tab 0.1 @tab 0.099 @tab 0.035 @tab 0.0651 @tab 0.0678 @tab 0.0391
+@item grad @tab 0.072 @tab 0.11 @tab 0.135 @tab 0.0729 @tab 0.0929 @tab 0.11 @tab 0.0593
+@item hist @tab 0.15 @tab 0.154 @tab 0.154 @tab 0.0614 @tab 0.0863 @tab 0.0862 @tab 0.0386
+@item ifs2d @tab 0.635 @tab 0.645 @tab 0.637 @tab 0.305 @tab 0.336 @tab 0.321 @tab 0.106
+@item ifs3d @tab 0.794 @tab 0.794 @tab 0.793 @tab 0.325 @tab 0.312 @tab 0.344 @tab 0.0855
+@item indirect @tab 0.034 @tab 0.0656 @tab 0.0643 @tab 0.024 @tab 0.0675 @tab 0.0626 @tab 0.00264
+@item inplot @tab 0.0533 @tab 0.131 @tab 0.121 @tab 0.0251 @tab 0.0678 @tab 0.0697 @tab 0.0269
+@item iris @tab 0.0653 @tab 0.161 @tab 0.175 @tab 0.0368 @tab 0.0872 @tab 0.105 @tab 0.0187
+@item label @tab 0.0273 @tab 0.054 @tab 0.0605 @tab 0.0259 @tab 0.045 @tab 0.0455 @tab 0.0024
+@item lamerey @tab 0.0299 @tab 0.0548 @tab 0.0575 @tab 0.0159 @tab 0.0336 @tab 0.0277 @tab 0.0132
+@item legend @tab 0.102 @tab 0.262 @tab 0.27 @tab 0.0259 @tab 0.131 @tab 0.133 @tab 0.0167
+@item light @tab 0.127 @tab 0.163 @tab 0.13 @tab 0.0295 @tab 0.0487 @tab 0.0743 @tab 0.0237
+@item loglog @tab 0.066 @tab 0.192 @tab 0.191 @tab 0.0352 @tab 0.0903 @tab 0.1 @tab 0.0292
+@item map @tab 0.0413 @tab 0.0949 @tab 0.0855 @tab 0.0314 @tab 0.0655 @tab 0.0766 @tab 0.0162
+@item mark @tab 0.0164 @tab 0.0338 @tab 0.0469 @tab 0.022 @tab 0.0235 @tab 0.0318 @tab 0.0123
+@item mask @tab 0.0639 @tab 0.125 @tab 0.125 @tab 0.0227 @tab 0.0711 @tab 0.0694 @tab 0.00337
+@item mesh @tab 0.0311 @tab 0.0894 @tab 0.0981 @tab 0.0252 @tab 0.0506 @tab 0.0637 @tab 0.016
+@item mirror @tab 0.0988 @tab 0.179 @tab 0.177 @tab 0.0369 @tab 0.0799 @tab 0.0871 @tab 0.0251
+@item molecule @tab 0.1 @tab 0.129 @tab 0.112 @tab 0.0198 @tab 0.0416 @tab 0.0599 @tab 0.0173
+@item ode @tab 0.217 @tab 0.323 @tab 0.303 @tab 0.191 @tab 0.309 @tab 0.321 @tab 0.175
+@item ohlc @tab 0.0154 @tab 0.0286 @tab 0.0411 @tab 0.0175 @tab 0.0286 @tab 0.0368 @tab 0.0104
+@item param1 @tab 0.177 @tab 0.381 @tab 0.323 @tab 0.0653 @tab 0.17 @tab 0.196 @tab 0.0374
+@item param2 @tab 0.569 @tab 0.711 @tab 0.547 @tab 0.169 @tab 0.221 @tab 0.25 @tab 0.135
+@item param3 @tab 2.2 @tab 3.25 @tab 2.54 @tab 0.802 @tab 0.936 @tab 0.937 @tab 0.689
+@item paramv @tab 1.2 @tab 1.45 @tab 1.32 @tab 0.635 @tab 0.789 @tab 0.787 @tab 0.629
+@item parser @tab 0.0412 @tab 0.0635 @tab 0.0632 @tab 0.0284 @tab 0.0566 @tab 0.0707 @tab 0.0165
+@item pde @tab 0.327 @tab 0.406 @tab 0.395 @tab 0.333 @tab 0.282 @tab 0.293 @tab 0.26
+@item pendelta @tab 0.0435 @tab 0.0435 @tab 0.0483 @tab 0.0468 @tab 0.0449 @tab 0.0453 @tab 0.0442
+@item pipe @tab 0.8 @tab 1.19 @tab 0.797 @tab 0.378 @tab 0.474 @tab 0.487 @tab 0.344
+@item plot @tab 0.0541 @tab 0.0884 @tab 0.0983 @tab 0.0217 @tab 0.0555 @tab 0.0517 @tab 0.0199
+@item pmap @tab 0.103 @tab 0.139 @tab 0.136 @tab 0.0491 @tab 0.0767 @tab 0.0922 @tab 0.0473
+@item primitives @tab 0.0747 @tab 0.145 @tab 0.153 @tab 0.02 @tab 0.065 @tab 0.0892 @tab 0.0178
+@item projection @tab 0.116 @tab 0.301 @tab 0.315 @tab 0.0267 @tab 0.17 @tab 0.183 @tab 0.0282
+@item projection5 @tab 0.12 @tab 0.255 @tab 0.256 @tab 0.0356 @tab 0.143 @tab 0.159 @tab 0.021
+@item pulse @tab 0.0254 @tab 0.0448 @tab 0.0563 @tab 0.0174 @tab 0.049 @tab 0.0557 @tab 0.0144
+@item qo2d @tab 0.294 @tab 0.275 @tab 0.286 @tab 0.188 @tab 0.218 @tab 0.233 @tab 0.196
+@item radar @tab 0.0195 @tab 0.0323 @tab 0.0427 @tab 0.00979 @tab 0.0518 @tab 0.0431 @tab 0.0118
+@item refill @tab 0.193 @tab 0.286 @tab 0.215 @tab 0.074 @tab 0.133 @tab 0.13 @tab 0.0559
+@item region @tab 0.0539 @tab 0.0867 @tab 0.0868 @tab 0.0232 @tab 0.0709 @tab 0.0724 @tab 0.0164
+@item scanfile @tab 0.0302 @tab 0.0559 @tab 0.0555 @tab 0.0152 @tab 0.046 @tab 0.0569 @tab 0.0121
+@item schemes @tab 0.0686 @tab 0.132 @tab 0.133 @tab 0.0317 @tab 0.0632 @tab 0.0779 @tab 0.0179
+@item section @tab 0.0291 @tab 0.0632 @tab 0.0614 @tab 0.0265 @tab 0.0478 @tab 0.056 @tab 0.00308
+@item several_light @tab 0.0623 @tab 0.0793 @tab 0.108 @tab 0.0262 @tab 0.0423 @tab 0.0676 @tab 0.015
+@item solve @tab 0.0616 @tab 0.186 @tab 0.15 @tab 0.038 @tab 0.0907 @tab 0.101 @tab 0.017
+@item stem @tab 0.0409 @tab 0.0826 @tab 0.0797 @tab 0.0153 @tab 0.0553 @tab 0.0546 @tab 0.0155
+@item step @tab 0.0417 @tab 0.0657 @tab 0.0722 @tab 0.018 @tab 0.0448 @tab 0.0467 @tab 0.0158
+@item stereo @tab 0.0714 @tab 0.0817 @tab 0.0735 @tab 0.0187 @tab 0.0316 @tab 0.06 @tab 0.0161
+@item stfa @tab 0.0534 @tab 0.124 @tab 0.14 @tab 0.0295 @tab 0.0843 @tab 0.0965 @tab 0.0168
+@item style @tab 0.105 @tab 0.256 @tab 0.256 @tab 0.0333 @tab 0.134 @tab 0.138 @tab 0.017
+@item surf @tab 0.119 @tab 0.19 @tab 0.169 @tab 0.0383 @tab 0.0857 @tab 0.102 @tab 0.0258
+@item surf3 @tab 2.28 @tab 3.29 @tab 3.25 @tab 0.975 @tab 2.8 @tab 2.94 @tab 0.508
+@item surf3a @tab 0.531 @tab 0.391 @tab 0.362 @tab 0.247 @tab 0.246 @tab 0.301 @tab 0.254
+@item surf3c @tab 0.546 @tab 0.389 @tab 0.345 @tab 0.217 @tab 0.214 @tab 0.298 @tab 0.176
+@item surf3ca @tab 0.554 @tab 0.395 @tab 0.343 @tab 0.219 @tab 0.219 @tab 0.317 @tab 0.178
+@item surfa @tab 0.0426 @tab 0.0691 @tab 0.082 @tab 0.016 @tab 0.0355 @tab 0.0564 @tab 0.0161
+@item surfc @tab 0.0441 @tab 0.0606 @tab 0.0713 @tab 0.0259 @tab 0.0383 @tab 0.0459 @tab 0.0199
+@item surfca @tab 0.0429 @tab 0.0601 @tab 0.0702 @tab 0.0233 @tab 0.0256 @tab 0.0524 @tab 0.016
+@item table @tab 0.124 @tab 0.301 @tab 0.29 @tab 0.0257 @tab 0.145 @tab 0.154 @tab 0.0165
+@item tape @tab 0.0428 @tab 0.089 @tab 0.0966 @tab 0.0214 @tab 0.0583 @tab 0.0539 @tab 0.0184
+@item tens @tab 0.0337 @tab 0.06 @tab 0.0624 @tab 0.0289 @tab 0.0533 @tab 0.0551 @tab 0.0131
+@item ternary @tab 0.113 @tab 0.275 @tab 0.269 @tab 0.0507 @tab 0.155 @tab 0.171 @tab 0.0316
+@item text @tab 0.0832 @tab 0.226 @tab 0.218 @tab 0.035 @tab 0.116 @tab 0.127 @tab 0.00324
+@item text2 @tab 0.073 @tab 0.161 @tab 0.163 @tab 0.0435 @tab 0.0997 @tab 0.111 @tab 0.0184
+@item textmark @tab 0.044 @tab 0.112 @tab 0.112 @tab 0.0288 @tab 0.0632 @tab 0.0652 @tab 0.0136
+@item ticks @tab 0.0983 @tab 0.265 @tab 0.261 @tab 0.0263 @tab 0.126 @tab 0.139 @tab 0.0275
+@item tile @tab 0.0371 @tab 0.0569 @tab 0.064 @tab 0.0256 @tab 0.0321 @tab 0.0397 @tab 0.0227
+@item tiles @tab 0.0377 @tab 0.0619 @tab 0.0687 @tab 0.0298 @tab 0.0194 @tab 0.0459 @tab 0.019
+@item torus @tab 0.108 @tab 0.225 @tab 0.226 @tab 0.0269 @tab 0.102 @tab 0.124 @tab 0.0242
+@item traj @tab 0.0145 @tab 0.0485 @tab 0.0451 @tab 0.0272 @tab 0.0286 @tab 0.0314 @tab 0.0131
+@item triangulation @tab 0.0402 @tab 0.0847 @tab 0.111 @tab 0.0276 @tab 0.0648 @tab 0.0761 @tab 0.0156
+@item triplot @tab 0.0294 @tab 0.0799 @tab 0.125 @tab 0.0157 @tab 0.0715 @tab 0.0863 @tab 0.0126
+@item tube @tab 0.0844 @tab 0.214 @tab 0.203 @tab 0.0311 @tab 0.0878 @tab 0.105 @tab 0.0259
+@item type0 @tab 0.228 @tab 0.274 @tab 0.229 @tab 0.0692 @tab 0.111 @tab 0.141 @tab 0.0619
+@item type1 @tab 0.217 @tab 0.292 @tab 0.261 @tab 0.0715 @tab 0.106 @tab 0.152 @tab 0.0564
+@item type2 @tab 0.221 @tab 0.276 @tab 0.231 @tab 0.0676 @tab 0.111 @tab 0.142 @tab 0.0649
+@item vect @tab 0.0907 @tab 0.226 @tab 0.216 @tab 0.0601 @tab 0.139 @tab 0.166 @tab 0.045
+@item vecta @tab 0.0318 @tab 0.0941 @tab 0.104 @tab 0.0334 @tab 0.117 @tab 0.118 @tab 0.0292
+@item venn @tab 0.0156 @tab 0.0632 @tab 0.0922 @tab 0.0156 @tab 0.0367 @tab 0.0644 @tab 0.00185
 @end multitable
index 5a2b9f8cef0ed73168ce43f51404b3342c1091cb..e2a1cbf5268af0d2b00dcd6000f4e58aab53db81 100644 (file)
 @multitable @columnfractions .16 .12 .12 .12 .12 .12 .12 .12
 @headitem Name @tab q=0 @tab q=1 @tab q=2 @tab q=4 @tab q=5 @tab q=6 @tab q=8
-@item alpha @tab 0.16 @tab 0.184 @tab 0.362 @tab 0.0868 @tab 0.105 @tab 0.246 @tab 0.0674
-@item area @tab 0.102 @tab 0.165 @tab 0.327 @tab 0.0795 @tab 0.124 @tab 0.255 @tab 0.0656
-@item aspect @tab 0.094 @tab 0.0939 @tab 0.15 @tab 0.0664 @tab 0.0674 @tab 0.11 @tab 0.0618
-@item axial @tab 0.909 @tab 0.985 @tab 2.03 @tab 0.371 @tab 0.464 @tab 1.28 @tab 0.105
-@item axis @tab 0.121 @tab 0.121 @tab 0.198 @tab 0.0705 @tab 0.0683 @tab 0.123 @tab 0.0951
-@item barh @tab 0.0886 @tab 0.105 @tab 0.181 @tab 0.068 @tab 0.0795 @tab 0.137 @tab 0.13
-@item bars @tab 0.11 @tab 0.126 @tab 0.207 @tab 0.0868 @tab 0.0973 @tab 0.162 @tab 0.0754
-@item belt @tab 0.0944 @tab 0.12 @tab 0.212 @tab 0.0674 @tab 0.089 @tab 0.192 @tab 0.0629
-@item box @tab 0.122 @tab 0.161 @tab 0.25 @tab 0.0735 @tab 0.0951 @tab 0.174 @tab 0.0641
-@item boxplot @tab 0.0696 @tab 0.0699 @tab 0.118 @tab 0.0633 @tab 0.0634 @tab 0.106 @tab 0.0514
-@item boxs @tab 0.296 @tab 0.354 @tab 0.786 @tab 0.111 @tab 0.213 @tab 0.58 @tab 0.0872
-@item candle @tab 0.0762 @tab 0.0787 @tab 0.143 @tab 0.0789 @tab 0.0859 @tab 0.135 @tab 0.0548
-@item chart @tab 0.572 @tab 0.778 @tab 2.39 @tab 0.244 @tab 0.429 @tab 1.64 @tab 0.2
-@item cloud @tab 0.0818 @tab 7.16 @tab 9.38 @tab 0.0691 @tab 2.43 @tab 4.96 @tab 0.063
-@item colorbar @tab 0.221 @tab 0.248 @tab 0.363 @tab 0.227 @tab 0.285 @tab 0.378 @tab 0.11
-@item combined @tab 0.583 @tab 0.464 @tab 0.697 @tab 0.339 @tab 0.375 @tab 0.586 @tab 0.293
-@item cones @tab 0.289 @tab 0.24 @tab 0.452 @tab 0.184 @tab 0.191 @tab 0.375 @tab 0.131
-@item cont @tab 0.124 @tab 0.123 @tab 0.208 @tab 0.0785 @tab 0.0778 @tab 0.14 @tab 0.0774
-@item cont_xyz @tab 0.134 @tab 0.13 @tab 0.184 @tab 0.113 @tab 0.113 @tab 0.163 @tab 0.108
-@item conta @tab 0.128 @tab 0.154 @tab 0.289 @tab 0.112 @tab 0.129 @tab 0.162 @tab 0.177
-@item contd @tab 0.239 @tab 0.255 @tab 0.354 @tab 0.12 @tab 0.142 @tab 0.236 @tab 0.103
-@item contf @tab 0.203 @tab 0.226 @tab 0.334 @tab 0.111 @tab 0.13 @tab 0.226 @tab 0.0992
-@item contf_xyz @tab 0.17 @tab 0.215 @tab 0.305 @tab 0.126 @tab 0.151 @tab 0.236 @tab 0.118
-@item contfa @tab 0.287 @tab 0.369 @tab 0.493 @tab 0.18 @tab 0.203 @tab 0.401 @tab 0.165
-@item contv @tab 0.162 @tab 0.176 @tab 0.306 @tab 0.089 @tab 0.103 @tab 0.212 @tab 0.076
-@item correl @tab 0.099 @tab 0.0894 @tab 0.169 @tab 0.0815 @tab 0.0855 @tab 0.129 @tab 0.0659
-@item curvcoor @tab 0.132 @tab 0.131 @tab 0.231 @tab 0.084 @tab 0.0843 @tab 0.151 @tab 0.124
-@item cut @tab 1.25 @tab 0.842 @tab 1.06 @tab 0.743 @tab 0.768 @tab 1.13 @tab 0.644
-@item dat_diff @tab 0.127 @tab 0.163 @tab 0.261 @tab 0.115 @tab 0.135 @tab 0.216 @tab 0.0846
-@item dat_extra @tab 0.328 @tab 0.26 @tab 0.351 @tab 0.17 @tab 0.267 @tab 0.3 @tab 0.114
-@item data1 @tab 4.98 @tab 3.75 @tab 3.98 @tab 3.6 @tab 3.52 @tab 3.9 @tab 3.29
-@item data2 @tab 3.28 @tab 2.74 @tab 2.82 @tab 2.81 @tab 2.78 @tab 3.2 @tab 2.61
-@item dens @tab 0.153 @tab 0.244 @tab 0.407 @tab 0.1 @tab 0.141 @tab 0.273 @tab 0.0771
-@item dens_xyz @tab 0.15 @tab 0.211 @tab 0.358 @tab 0.123 @tab 0.162 @tab 0.282 @tab 0.0961
-@item densa @tab 0.183 @tab 0.211 @tab 0.351 @tab 0.12 @tab 0.154 @tab 0.296 @tab 0.0912
-@item dew @tab 1.7 @tab 0.942 @tab 1.03 @tab 0.224 @tab 0.241 @tab 0.361 @tab 0.129
-@item dots @tab 0.161 @tab 0.167 @tab 0.217 @tab 0.104 @tab 0.11 @tab 0.148 @tab 0.0639
-@item error @tab 0.101 @tab 0.109 @tab 0.176 @tab 0.11 @tab 0.113 @tab 0.194 @tab 0.0688
-@item error2 @tab 0.0931 @tab 0.112 @tab 0.209 @tab 0.0742 @tab 0.0808 @tab 0.156 @tab 0.0675
-@item export @tab 0.287 @tab 0.363 @tab 0.531 @tab 0.174 @tab 0.22 @tab 0.36 @tab 0.253
-@item fall @tab 0.079 @tab 0.0752 @tab 0.157 @tab 0.0652 @tab 0.064 @tab 0.122 @tab 0.0868
-@item fit @tab 0.109 @tab 0.824 @tab 0.173 @tab 0.0894 @tab 0.0918 @tab 0.136 @tab 0.0793
-@item flow @tab 0.39 @tab 0.395 @tab 0.566 @tab 0.313 @tab 0.423 @tab 0.435 @tab 0.3
-@item fog @tab 0.111 @tab 0.169 @tab 0.362 @tab 0.0716 @tab 0.127 @tab 0.3 @tab 0.063
-@item fonts @tab 3 @tab 3.02 @tab 3.14 @tab 2.75 @tab 2.57 @tab 2.88 @tab 2.66
-@item grad @tab 0.119 @tab 0.229 @tab 0.424 @tab 0.103 @tab 0.158 @tab 0.306 @tab 0.0859
-@item hist @tab 0.294 @tab 0.303 @tab 0.358 @tab 0.209 @tab 0.217 @tab 0.274 @tab 0.0886
-@item indirect @tab 0.108 @tab 0.0908 @tab 0.147 @tab 0.111 @tab 0.114 @tab 0.16 @tab 0.0556
-@item inplot @tab 0.102 @tab 0.0998 @tab 0.174 @tab 0.0747 @tab 0.0726 @tab 0.123 @tab 0.0664
-@item label @tab 0.0836 @tab 0.0803 @tab 0.129 @tab 0.0808 @tab 0.08 @tab 0.12 @tab 0.0529
-@item legend @tab 0.185 @tab 0.195 @tab 0.3 @tab 0.0758 @tab 0.0864 @tab 0.171 @tab 0.0622
-@item light @tab 0.273 @tab 0.271 @tab 0.299 @tab 0.277 @tab 0.274 @tab 0.299 @tab 0.274
-@item loglog @tab 0.12 @tab 0.123 @tab 0.198 @tab 0.076 @tab 0.0779 @tab 0.133 @tab 0.0692
-@item map @tab 0.107 @tab 0.159 @tab 0.255 @tab 0.12 @tab 0.149 @tab 0.316 @tab 0.0684
-@item mark @tab 0.083 @tab 0.0937 @tab 0.126 @tab 0.072 @tab 0.0723 @tab 0.11 @tab 0.0507
-@item mask @tab 0.12 @tab 0.24 @tab 0.257 @tab 0.0723 @tab 0.141 @tab 0.169 @tab 0.0597
-@item mesh @tab 0.0866 @tab 0.0906 @tab 0.189 @tab 0.0661 @tab 0.0932 @tab 0.156 @tab 0.0638
-@item mirror @tab 0.163 @tab 0.164 @tab 0.305 @tab 0.08 @tab 0.094 @tab 0.209 @tab 0.0679
-@item molecule @tab 0.155 @tab 0.166 @tab 0.354 @tab 0.0754 @tab 0.111 @tab 0.263 @tab 0.0628
-@item ode @tab 0.652 @tab 0.654 @tab 0.788 @tab 0.631 @tab 0.636 @tab 0.793 @tab 0.635
-@item ohlc @tab 0.0668 @tab 0.0668 @tab 0.117 @tab 0.0675 @tab 0.0734 @tab 0.104 @tab 0.053
-@item param1 @tab 0.288 @tab 0.295 @tab 0.518 @tab 0.137 @tab 0.158 @tab 0.352 @tab 0.147
-@item param2 @tab 0.555 @tab 0.54 @tab 0.767 @tab 0.591 @tab 0.232 @tab 0.51 @tab 0.151
-@item param3 @tab 3.15 @tab 3.63 @tab 3.78 @tab 1.86 @tab 2.03 @tab 2.35 @tab 1.61
-@item paramv @tab 4.55 @tab 4.9 @tab 4.7 @tab 1.14 @tab 1.19 @tab 1.35 @tab 1.11
-@item parser @tab 0.118 @tab 0.116 @tab 0.195 @tab 0.115 @tab 0.122 @tab 0.225 @tab 0.0954
-@item pde @tab 0.883 @tab 0.961 @tab 1.13 @tab 0.834 @tab 0.843 @tab 0.953 @tab 0.781
-@item pipe @tab 4.27 @tab 3.23 @tab 3.04 @tab 0.664 @tab 0.831 @tab 0.993 @tab 0.52
-@item plot @tab 0.154 @tab 0.119 @tab 0.221 @tab 0.0921 @tab 0.0933 @tab 0.143 @tab 0.0835
-@item primitives @tab 0.143 @tab 0.188 @tab 0.43 @tab 0.0749 @tab 0.108 @tab 0.313 @tab 0.0879
-@item projection @tab 0.182 @tab 0.207 @tab 0.494 @tab 0.0878 @tab 0.103 @tab 0.349 @tab 0.0768
-@item projection5 @tab 0.17 @tab 0.2 @tab 0.427 @tab 0.0835 @tab 0.0956 @tab 0.323 @tab 0.11
-@item qo2d @tab 0.325 @tab 0.423 @tab 0.596 @tab 0.286 @tab 0.341 @tab 0.5 @tab 0.26
-@item radar @tab 0.0724 @tab 0.0738 @tab 0.115 @tab 0.076 @tab 0.0804 @tab 0.135 @tab 0.0499
-@item refill @tab 0.329 @tab 0.263 @tab 0.38 @tab 0.197 @tab 0.167 @tab 0.286 @tab 0.114
-@item region @tab 0.0964 @tab 0.235 @tab 0.265 @tab 0.0729 @tab 0.0986 @tab 0.191 @tab 0.0663
-@item schemes @tab 0.158 @tab 0.205 @tab 0.358 @tab 0.0947 @tab 0.116 @tab 0.231 @tab 0.0633
-@item several_light @tab 0.121 @tab 0.136 @tab 0.494 @tab 0.0704 @tab 0.0966 @tab 0.427 @tab 0.0609
-@item solve @tab 0.138 @tab 0.134 @tab 0.247 @tab 0.108 @tab 0.104 @tab 0.204 @tab 0.0741
-@item stem @tab 0.103 @tab 0.101 @tab 0.171 @tab 0.079 @tab 0.0745 @tab 0.135 @tab 0.0653
-@item step @tab 0.114 @tab 0.11 @tab 0.157 @tab 0.0782 @tab 0.0755 @tab 0.119 @tab 0.0636
-@item stereo @tab 0.12 @tab 0.138 @tab 0.308 @tab 0.0715 @tab 0.0996 @tab 0.274 @tab 0.065
-@item stfa @tab 0.128 @tab 0.168 @tab 0.366 @tab 0.0982 @tab 0.122 @tab 0.273 @tab 0.0732
-@item style @tab 0.181 @tab 0.202 @tab 0.338 @tab 0.0814 @tab 0.0929 @tab 0.19 @tab 0.0614
-@item surf @tab 0.235 @tab 0.233 @tab 0.395 @tab 0.12 @tab 0.137 @tab 0.284 @tab 0.0811
-@item surf3 @tab 3.33 @tab 3.34 @tab 4.02 @tab 3.66 @tab 3.31 @tab 5.02 @tab 1.18
-@item surf3a @tab 0.825 @tab 0.581 @tab 0.901 @tab 0.469 @tab 0.641 @tab 1.34 @tab 0.378
-@item surf3c @tab 0.797 @tab 0.577 @tab 0.91 @tab 0.471 @tab 0.637 @tab 1.34 @tab 0.375
-@item surfa @tab 0.0979 @tab 0.141 @tab 0.358 @tab 0.0698 @tab 0.0953 @tab 0.264 @tab 0.0639
-@item surfc @tab 0.0992 @tab 0.135 @tab 0.3 @tab 0.0682 @tab 0.0964 @tab 0.252 @tab 0.0619
-@item table @tab 0.213 @tab 0.205 @tab 0.33 @tab 0.0784 @tab 0.0796 @tab 0.159 @tab 0.0633
-@item tape @tab 0.1 @tab 0.117 @tab 0.211 @tab 0.07 @tab 0.0808 @tab 0.147 @tab 0.0662
-@item tens @tab 0.0891 @tab 0.0865 @tab 0.14 @tab 0.108 @tab 0.11 @tab 0.153 @tab 0.181
-@item ternary @tab 0.18 @tab 0.199 @tab 0.376 @tab 0.0867 @tab 0.0968 @tab 0.263 @tab 0.07
-@item text @tab 0.164 @tab 0.165 @tab 0.253 @tab 0.0863 @tab 0.088 @tab 0.155 @tab 0.0635
-@item text2 @tab 0.145 @tab 0.145 @tab 0.211 @tab 0.109 @tab 0.109 @tab 0.168 @tab 0.0717
-@item textmark @tab 0.115 @tab 0.113 @tab 0.171 @tab 0.0847 @tab 0.0815 @tab 0.133 @tab 0.16
-@item ticks @tab 0.18 @tab 0.184 @tab 0.277 @tab 0.0756 @tab 0.074 @tab 0.161 @tab 0.063
-@item tile @tab 0.0826 @tab 0.116 @tab 0.209 @tab 0.0671 @tab 0.0839 @tab 0.16 @tab 0.0638
-@item tiles @tab 0.0856 @tab 0.134 @tab 0.217 @tab 0.0685 @tab 0.0901 @tab 0.157 @tab 0.0678
-@item torus @tab 0.168 @tab 0.202 @tab 0.521 @tab 0.0812 @tab 0.114 @tab 0.372 @tab 0.0758
-@item traj @tab 0.0641 @tab 0.065 @tab 0.13 @tab 0.066 @tab 0.0625 @tab 0.112 @tab 0.0529
-@item triangulation @tab 0.0895 @tab 0.127 @tab 0.304 @tab 0.0839 @tab 0.117 @tab 0.271 @tab 0.0707
-@item triplot @tab 0.0721 @tab 0.176 @tab 0.581 @tab 0.0639 @tab 0.118 @tab 0.439 @tab 0.0497
-@item tube @tab 0.151 @tab 0.219 @tab 0.48 @tab 0.0922 @tab 0.132 @tab 0.347 @tab 0.0719
-@item type0 @tab 0.296 @tab 0.289 @tab 0.656 @tab 0.135 @tab 0.196 @tab 0.555 @tab 0.117
-@item type1 @tab 0.294 @tab 0.286 @tab 0.661 @tab 0.138 @tab 0.196 @tab 0.566 @tab 0.116
-@item type2 @tab 0.311 @tab 0.304 @tab 0.67 @tab 0.155 @tab 0.215 @tab 0.574 @tab 0.135
-@item vect @tab 0.19 @tab 0.192 @tab 0.31 @tab 0.175 @tab 0.164 @tab 0.273 @tab 0.12
-@item vecta @tab 0.0971 @tab 0.0982 @tab 0.186 @tab 0.108 @tab 0.118 @tab 0.31 @tab 0.0698
-@item venn @tab 0.064 @tab 0.24 @tab 0.397 @tab 0.0631 @tab 0.155 @tab 0.323 @tab 0.0474
+@item 3wave @tab 0.11 @tab 0.151 @tab 0.193 @tab 0.0729 @tab 0.133 @tab 0.188 @tab 0.0457
+@item alpha @tab 0.105 @tab 0.223 @tab 0.306 @tab 0.0591 @tab 0.109 @tab 0.192 @tab 0.0559
+@item apde @tab 86.3 @tab 86 @tab 86.1 @tab 85.6 @tab 85.9 @tab 85.8 @tab 85.6
+@item area @tab 0.0781 @tab 0.196 @tab 0.291 @tab 0.0532 @tab 0.141 @tab 0.221 @tab 0.0452
+@item aspect @tab 0.0629 @tab 0.13 @tab 0.164 @tab 0.0483 @tab 0.0851 @tab 0.107 @tab 0.0425
+@item axial @tab 0.806 @tab 1.74 @tab 1.95 @tab 0.291 @tab 0.938 @tab 1.31 @tab 0.167
+@item axis @tab 0.0949 @tab 0.196 @tab 0.231 @tab 0.0589 @tab 0.111 @tab 0.141 @tab 0.0417
+@item barh @tab 0.063 @tab 0.128 @tab 0.176 @tab 0.0499 @tab 0.0851 @tab 0.121 @tab 0.0348
+@item bars @tab 0.0778 @tab 0.156 @tab 0.219 @tab 0.0646 @tab 0.127 @tab 0.155 @tab 0.0493
+@item belt @tab 0.0754 @tab 0.118 @tab 0.173 @tab 0.0501 @tab 0.0933 @tab 0.127 @tab 0.045
+@item bifurcation @tab 0.602 @tab 0.728 @tab 0.755 @tab 0.635 @tab 0.711 @tab 0.746 @tab 0.575
+@item box @tab 0.0904 @tab 0.164 @tab 0.209 @tab 0.0542 @tab 0.0995 @tab 0.164 @tab 0.0515
+@item boxplot @tab 0.0454 @tab 0.0816 @tab 0.116 @tab 0.0449 @tab 0.0831 @tab 0.102 @tab 0.0327
+@item boxs @tab 0.256 @tab 0.704 @tab 0.905 @tab 0.083 @tab 0.324 @tab 0.522 @tab 0.077
+@item candle @tab 0.0599 @tab 0.107 @tab 0.148 @tab 0.0841 @tab 0.0872 @tab 0.126 @tab 0.0378
+@item chart @tab 0.468 @tab 1.31 @tab 2.14 @tab 0.178 @tab 0.63 @tab 1.45 @tab 0.119
+@item cloud @tab 0.0711 @tab 6.62 @tab 7.17 @tab 0.0517 @tab 1.45 @tab 2.83 @tab 0.0446
+@item colorbar @tab 0.158 @tab 0.328 @tab 0.501 @tab 0.137 @tab 0.293 @tab 0.346 @tab 0.0733
+@item combined @tab 0.462 @tab 0.552 @tab 0.611 @tab 0.253 @tab 0.389 @tab 0.518 @tab 0.201
+@item cones @tab 0.216 @tab 0.309 @tab 0.375 @tab 0.117 @tab 0.192 @tab 0.269 @tab 0.0738
+@item cont @tab 0.0959 @tab 0.22 @tab 0.242 @tab 0.0798 @tab 0.227 @tab 0.259 @tab 0.0616
+@item cont_xyz @tab 0.0733 @tab 0.129 @tab 0.148 @tab 0.0589 @tab 0.111 @tab 0.133 @tab 0.0549
+@item conta @tab 0.075 @tab 0.11 @tab 0.143 @tab 0.0597 @tab 0.11 @tab 0.132 @tab 0.0603
+@item contd @tab 0.25 @tab 0.355 @tab 0.393 @tab 0.149 @tab 0.229 @tab 0.288 @tab 0.119
+@item contf @tab 0.188 @tab 0.297 @tab 0.363 @tab 0.139 @tab 0.199 @tab 0.273 @tab 0.0952
+@item contf_xyz @tab 0.123 @tab 0.18 @tab 0.234 @tab 0.0896 @tab 0.136 @tab 0.192 @tab 0.0852
+@item contfa @tab 0.205 @tab 0.255 @tab 0.355 @tab 0.118 @tab 0.204 @tab 0.37 @tab 0.0739
+@item contv @tab 0.142 @tab 0.248 @tab 0.303 @tab 0.112 @tab 0.21 @tab 0.297 @tab 0.079
+@item correl @tab 0.0623 @tab 0.134 @tab 0.168 @tab 0.058 @tab 0.0907 @tab 0.13 @tab 0.0406
+@item curvcoor @tab 0.0994 @tab 0.244 @tab 0.262 @tab 0.0688 @tab 0.14 @tab 0.175 @tab 0.0559
+@item cut @tab 0.877 @tab 0.733 @tab 0.775 @tab 0.406 @tab 0.451 @tab 0.685 @tab 0.373
+@item dat_diff @tab 0.1 @tab 0.174 @tab 0.221 @tab 0.0739 @tab 0.132 @tab 0.177 @tab 0.0577
+@item dat_extra @tab 0.244 @tab 0.389 @tab 0.349 @tab 0.101 @tab 0.193 @tab 0.25 @tab 0.0777
+@item data1 @tab 2.73 @tab 2.14 @tab 2.03 @tab 1.45 @tab 1.64 @tab 1.72 @tab 1.27
+@item data2 @tab 1.55 @tab 1.41 @tab 1.5 @tab 1.2 @tab 1.29 @tab 1.38 @tab 1.11
+@item dens @tab 0.117 @tab 0.272 @tab 0.396 @tab 0.0659 @tab 0.158 @tab 0.236 @tab 0.0522
+@item dens_xyz @tab 0.0974 @tab 0.212 @tab 0.269 @tab 0.086 @tab 0.135 @tab 0.209 @tab 0.0576
+@item densa @tab 0.104 @tab 0.18 @tab 0.266 @tab 0.092 @tab 0.135 @tab 0.21 @tab 0.0606
+@item detect @tab 0.172 @tab 0.321 @tab 0.431 @tab 0.119 @tab 0.2 @tab 0.285 @tab 0.0936
+@item dew @tab 1.85 @tab 1.91 @tab 1.21 @tab 0.177 @tab 0.209 @tab 0.272 @tab 0.108
+@item diffract @tab 0.11 @tab 0.312 @tab 0.415 @tab 0.0894 @tab 0.204 @tab 0.273 @tab 0.0561
+@item dilate @tab 0.112 @tab 0.27 @tab 0.408 @tab 0.0561 @tab 0.192 @tab 0.28 @tab 0.058
+@item dots @tab 0.107 @tab 0.168 @tab 0.2 @tab 0.0547 @tab 0.101 @tab 0.12 @tab 0.0428
+@item earth @tab 32.2 @tab 35.9 @tab 23.9 @tab 12.5 @tab 14.9 @tab 13.2 @tab 12.1
+@item error @tab 0.0756 @tab 0.138 @tab 0.192 @tab 0.0735 @tab 0.115 @tab 0.158 @tab 0.0436
+@item error2 @tab 0.0684 @tab 0.188 @tab 0.224 @tab 0.053 @tab 0.124 @tab 0.158 @tab 0.051
+@item export @tab 0.18 @tab 0.329 @tab 0.426 @tab 0.111 @tab 0.191 @tab 0.279 @tab 0.1
+@item fall @tab 0.0495 @tab 0.114 @tab 0.148 @tab 0.0421 @tab 0.0834 @tab 0.11 @tab 0.0456
+@item fit @tab 0.0744 @tab 0.133 @tab 0.17 @tab 0.0488 @tab 0.0926 @tab 0.124 @tab 0.0452
+@item flame2d @tab 6.3 @tab 6.61 @tab 6.46 @tab 3.71 @tab 3.89 @tab 3.77 @tab 1.04
+@item flow @tab 0.364 @tab 0.53 @tab 0.526 @tab 0.35 @tab 0.495 @tab 0.508 @tab 0.328
+@item fog @tab 0.0789 @tab 0.169 @tab 0.269 @tab 0.0601 @tab 0.129 @tab 0.243 @tab 0.043
+@item fonts @tab 0.0976 @tab 0.149 @tab 0.168 @tab 0.0693 @tab 0.0898 @tab 0.136 @tab 0.0596
+@item grad @tab 0.11 @tab 0.252 @tab 0.363 @tab 0.0929 @tab 0.203 @tab 0.286 @tab 0.0792
+@item hist @tab 0.191 @tab 0.246 @tab 0.284 @tab 0.122 @tab 0.151 @tab 0.182 @tab 0.0648
+@item ifs2d @tab 0.725 @tab 0.756 @tab 0.809 @tab 0.405 @tab 0.435 @tab 0.45 @tab 0.12
+@item ifs3d @tab 0.857 @tab 0.875 @tab 0.918 @tab 0.368 @tab 0.389 @tab 0.44 @tab 0.11
+@item indirect @tab 0.0616 @tab 0.105 @tab 0.137 @tab 0.0611 @tab 0.103 @tab 0.147 @tab 0.0334
+@item inplot @tab 0.0825 @tab 0.187 @tab 0.203 @tab 0.0511 @tab 0.121 @tab 0.148 @tab 0.0496
+@item iris @tab 0.0963 @tab 0.243 @tab 0.274 @tab 0.0651 @tab 0.148 @tab 0.183 @tab 0.0559
+@item label @tab 0.0482 @tab 0.106 @tab 0.135 @tab 0.0474 @tab 0.104 @tab 0.116 @tab 0.0353
+@item lamerey @tab 0.0499 @tab 0.0916 @tab 0.119 @tab 0.0422 @tab 0.0708 @tab 0.103 @tab 0.0325
+@item legend @tab 0.139 @tab 0.364 @tab 0.395 @tab 0.0578 @tab 0.198 @tab 0.239 @tab 0.0452
+@item light @tab 0.148 @tab 0.245 @tab 0.371 @tab 0.0578 @tab 0.114 @tab 0.252 @tab 0.0426
+@item loglog @tab 0.109 @tab 0.244 @tab 0.292 @tab 0.0681 @tab 0.165 @tab 0.2 @tab 0.0496
+@item map @tab 0.0669 @tab 0.157 @tab 0.237 @tab 0.0728 @tab 0.136 @tab 0.199 @tab 0.0463
+@item mark @tab 0.0617 @tab 0.0833 @tab 0.111 @tab 0.0602 @tab 0.0638 @tab 0.0986 @tab 0.0367
+@item mask @tab 0.106 @tab 0.25 @tab 0.249 @tab 0.0428 @tab 0.148 @tab 0.161 @tab 0.0418
+@item mesh @tab 0.0618 @tab 0.152 @tab 0.195 @tab 0.0507 @tab 0.117 @tab 0.157 @tab 0.0463
+@item mirror @tab 0.131 @tab 0.269 @tab 0.325 @tab 0.0622 @tab 0.144 @tab 0.206 @tab 0.041
+@item molecule @tab 0.126 @tab 0.204 @tab 0.312 @tab 0.0563 @tab 0.0954 @tab 0.234 @tab 0.045
+@item ode @tab 0.23 @tab 0.386 @tab 0.414 @tab 0.222 @tab 0.396 @tab 0.427 @tab 0.204
+@item ohlc @tab 0.0487 @tab 0.0735 @tab 0.116 @tab 0.0484 @tab 0.0702 @tab 0.0948 @tab 0.0419
+@item param1 @tab 0.222 @tab 0.479 @tab 0.536 @tab 0.0829 @tab 0.26 @tab 0.362 @tab 0.0677
+@item param2 @tab 0.597 @tab 0.909 @tab 0.882 @tab 0.21 @tab 0.352 @tab 0.51 @tab 0.299
+@item param3 @tab 2.26 @tab 3.58 @tab 3.31 @tab 0.899 @tab 1.15 @tab 1.33 @tab 0.697
+@item paramv @tab 1.25 @tab 1.63 @tab 1.52 @tab 0.664 @tab 0.873 @tab 0.943 @tab 0.644
+@item parser @tab 0.0729 @tab 0.142 @tab 0.166 @tab 0.0555 @tab 0.139 @tab 0.168 @tab 0.0428
+@item pde @tab 0.377 @tab 0.522 @tab 0.581 @tab 0.294 @tab 0.36 @tab 0.459 @tab 0.364
+@item pendelta @tab 0.103 @tab 0.103 @tab 0.0974 @tab 0.106 @tab 0.103 @tab 0.123 @tab 0.1
+@item pipe @tab 0.87 @tab 1.39 @tab 1.18 @tab 0.435 @tab 0.6 @tab 0.833 @tab 0.376
+@item plot @tab 0.0781 @tab 0.135 @tab 0.17 @tab 0.0525 @tab 0.103 @tab 0.138 @tab 0.0452
+@item pmap @tab 0.121 @tab 0.212 @tab 0.254 @tab 0.0869 @tab 0.144 @tab 0.195 @tab 0.0671
+@item primitives @tab 0.109 @tab 0.243 @tab 0.401 @tab 0.0751 @tab 0.135 @tab 0.277 @tab 0.0456
+@item projection @tab 0.15 @tab 0.51 @tab 0.592 @tab 0.0726 @tab 0.327 @tab 0.423 @tab 0.0504
+@item projection5 @tab 0.131 @tab 0.41 @tab 0.479 @tab 0.0533 @tab 0.271 @tab 0.359 @tab 0.0422
+@item pulse @tab 0.058 @tab 0.0867 @tab 0.117 @tab 0.0499 @tab 0.0795 @tab 0.111 @tab 0.0389
+@item qo2d @tab 0.263 @tab 0.396 @tab 0.523 @tab 0.227 @tab 0.311 @tab 0.397 @tab 0.203
+@item radar @tab 0.0462 @tab 0.0789 @tab 0.107 @tab 0.0545 @tab 0.0798 @tab 0.118 @tab 0.0329
+@item refill @tab 0.226 @tab 0.357 @tab 0.343 @tab 0.109 @tab 0.189 @tab 0.238 @tab 0.081
+@item region @tab 0.0774 @tab 0.188 @tab 0.246 @tab 0.0596 @tab 0.124 @tab 0.176 @tab 0.0417
+@item scanfile @tab 0.0475 @tab 0.0924 @tab 0.12 @tab 0.0457 @tab 0.0809 @tab 0.119 @tab 0.0332
+@item schemes @tab 0.128 @tab 0.254 @tab 0.334 @tab 0.0724 @tab 0.146 @tab 0.218 @tab 0.0515
+@item section @tab 0.0611 @tab 0.106 @tab 0.135 @tab 0.0553 @tab 0.1 @tab 0.127 @tab 0.0378
+@item several_light @tab 0.095 @tab 0.159 @tab 0.394 @tab 0.0565 @tab 0.0946 @tab 0.347 @tab 0.0477
+@item solve @tab 0.0972 @tab 0.241 @tab 0.266 @tab 0.072 @tab 0.168 @tab 0.2 @tab 0.042
+@item stem @tab 0.0637 @tab 0.152 @tab 0.189 @tab 0.0552 @tab 0.101 @tab 0.136 @tab 0.0376
+@item step @tab 0.0634 @tab 0.123 @tab 0.141 @tab 0.141 @tab 0.0798 @tab 0.116 @tab 0.0464
+@item stereo @tab 0.0897 @tab 0.149 @tab 0.26 @tab 0.053 @tab 0.098 @tab 0.212 @tab 0.046
+@item stfa @tab 0.102 @tab 0.272 @tab 0.365 @tab 0.0665 @tab 0.206 @tab 0.27 @tab 0.0483
+@item style @tab 0.139 @tab 0.347 @tab 0.414 @tab 0.0583 @tab 0.207 @tab 0.249 @tab 0.0454
+@item surf @tab 0.151 @tab 0.288 @tab 0.38 @tab 0.0754 @tab 0.156 @tab 0.257 @tab 0.0569
+@item surf3 @tab 2.35 @tab 4.26 @tab 4.16 @tab 1.45 @tab 4.03 @tab 4.18 @tab 0.539
+@item surf3a @tab 0.618 @tab 0.502 @tab 0.655 @tab 0.27 @tab 0.39 @tab 0.885 @tab 0.195
+@item surf3c @tab 0.607 @tab 0.501 @tab 0.643 @tab 0.266 @tab 0.377 @tab 0.832 @tab 0.206
+@item surf3ca @tab 0.613 @tab 0.511 @tab 0.665 @tab 0.281 @tab 0.391 @tab 0.878 @tab 0.198
+@item surfa @tab 0.0777 @tab 0.137 @tab 0.235 @tab 0.0478 @tab 0.0916 @tab 0.205 @tab 0.047
+@item surfc @tab 0.0658 @tab 0.134 @tab 0.239 @tab 0.0497 @tab 0.0845 @tab 0.208 @tab 0.0388
+@item surfca @tab 0.0774 @tab 0.126 @tab 0.238 @tab 0.0612 @tab 0.0847 @tab 0.201 @tab 0.0403
+@item table @tab 0.145 @tab 0.387 @tab 0.401 @tab 0.0592 @tab 0.196 @tab 0.251 @tab 0.0454
+@item tape @tab 0.0733 @tab 0.158 @tab 0.205 @tab 0.0476 @tab 0.117 @tab 0.152 @tab 0.0453
+@item tens @tab 0.061 @tab 0.0914 @tab 0.131 @tab 0.0661 @tab 0.0965 @tab 0.132 @tab 0.0367
+@item ternary @tab 0.151 @tab 0.419 @tab 0.501 @tab 0.0744 @tab 0.267 @tab 0.342 @tab 0.0543
+@item text @tab 0.123 @tab 0.283 @tab 0.332 @tab 0.0588 @tab 0.167 @tab 0.207 @tab 0.0359
+@item text2 @tab 0.102 @tab 0.224 @tab 0.254 @tab 0.0707 @tab 0.151 @tab 0.181 @tab 0.0419
+@item textmark @tab 0.0771 @tab 0.16 @tab 0.183 @tab 0.055 @tab 0.108 @tab 0.141 @tab 0.0338
+@item ticks @tab 0.139 @tab 0.331 @tab 0.36 @tab 0.0597 @tab 0.178 @tab 0.207 @tab 0.0445
+@item tile @tab 0.0615 @tab 0.112 @tab 0.172 @tab 0.0456 @tab 0.0817 @tab 0.132 @tab 0.0449
+@item tiles @tab 0.0611 @tab 0.132 @tab 0.186 @tab 0.0598 @tab 0.082 @tab 0.134 @tab 0.05
+@item torus @tab 0.135 @tab 0.367 @tab 0.491 @tab 0.0662 @tab 0.203 @tab 0.342 @tab 0.0506
+@item traj @tab 0.0463 @tab 0.105 @tab 0.126 @tab 0.0445 @tab 0.072 @tab 0.102 @tab 0.0434
+@item triangulation @tab 0.0616 @tab 0.175 @tab 0.294 @tab 0.056 @tab 0.148 @tab 0.237 @tab 0.0412
+@item triplot @tab 0.0496 @tab 0.202 @tab 0.5 @tab 0.0519 @tab 0.118 @tab 0.358 @tab 0.0329
+@item tube @tab 0.132 @tab 0.349 @tab 0.473 @tab 0.0673 @tab 0.17 @tab 0.291 @tab 0.0515
+@item type0 @tab 0.282 @tab 0.456 @tab 0.62 @tab 0.131 @tab 0.234 @tab 0.486 @tab 0.112
+@item type1 @tab 0.284 @tab 0.441 @tab 0.628 @tab 0.135 @tab 0.242 @tab 0.503 @tab 0.107
+@item type2 @tab 0.296 @tab 0.445 @tab 0.605 @tab 0.128 @tab 0.25 @tab 0.472 @tab 0.124
+@item vect @tab 0.114 @tab 0.306 @tab 0.341 @tab 0.102 @tab 0.22 @tab 0.247 @tab 0.0755
+@item vecta @tab 0.0637 @tab 0.161 @tab 0.2 @tab 0.0751 @tab 0.178 @tab 0.213 @tab 0.047
+@item venn @tab 0.0527 @tab 0.201 @tab 0.269 @tab 0.0406 @tab 0.148 @tab 0.233 @tab 0.027
 @end multitable
index a1087f1c33c5a3f1d5894bcf1f090b34900c8a99..b0c144e0b9ccaa0e9c091ef242f685de4a968e95 100644 (file)
@@ -1,3 +1,7 @@
+2.4.1 Released 20 July 2017
+2.4 Released 17 May 2017
+2.3.5.1 Released 30 May 2015
+2.3.5 Released 16 May 2015
 2.3.4 Released 11 February 2015
 2.3.3 Released 01 June 2015
 2.3.2 Released 2 February 2015
index 967c47778a2dcff55f56dcd5bce70a15b0e92eee..dfea37354ffcef15795251f4a94cb5136e981a0a 100644 (file)
@@ -52,10 +52,11 @@ Generally, MathGL is GPL library. However, you can use LGPL license for MathGL c
 
 @strong{Latest news}
 @itemize
-@item @emph{13 February 2016.}
-New version (v.@value{VERSION}@value{MINVER}) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are new functions, plot types and styles, improvement in MGL scripts and in mgltex, some speeding up and bugfixes, which denoted @ref{News, here}.
-@item @emph{7 August 2014.}
-New version (v.2.3) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are many major improvements for both MathGL core and for UDAV, which denoted @ref{News, here}.
+
+@item @strong{20 July 2017.}
+New version (v.2.4.1) with bugfixes of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released.
+@item @emph{17 May 2017.}
+New version (v.2.4) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are @code{mgllab} executable, string manipulation in MGL, new functions, plot types and styles, translation to Russian using @code{gettext} and bugfixes, which denoted @ref{News, here}.
 @end itemize
 
 There is detailed @ref{News, news list}. Sourceforge project page @uref{http://sourceforge.net/projects/mathgl/, here}.
@@ -75,182 +76,78 @@ Javascript interface was developed with support of @url{http://www.datadvance.ne
 
 @itemize
 
-@item @strong{13 February 2016.}
-New version (v.2.3.4) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are new functions, plot types and styles, improvement in MGL scripts and in mgltex, some speeding up and bugfixes:
+@item @strong{20 July 2017.}
+New version (v.2.4.1) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released.
 @itemize @bullet
-@item Update @ref{LaTeX package} (thanks to Diego Sejas Viscarra)
-
-@item Add @ref{pmap} plot for Poincare map.
-@item Add @ref{lamerey} plot for Lamerey diagram.
-@item Add @ref{bifurcation} plot for Bifurcation diagram.
-@item Add @ref{ifs2d} and @ref{ifs3d} functions for fractal generation using iterated function system (thanks to Diego Sejas Viscarra).
-
-@item Add @ref{pulse} function for determining pulse parameters.
-@item Add @ref{scanfile} function for getting formated data from textual file.
-@item Add mglData::SetList() function for setting data from variable argument list of double values.
-@item Add @ref{echo} command for printing the content of data.
-@item Add @ref{print} command for print messages to stdout immediately.
-@item Add @ref{pendelta} function for changing size of blur area around lines, marks, glyphs, ...
-
-@item Allow MGL command @ref{save} to write/append strings to a file.
-@item Add option to rewrite file in @ref{savehdf} command.
-@item Add option to @ref{setsize} for scaling primitives without its erasing.
-
-@item Add callback functions to mglQt, mglFLTK, and extend @ref{mglDraw class} for simpler drawing in parallel with calculation (see @ref{Draw and calculate}).
-@item Force set focus for editor in UDAV.
-@item Add line numbers to UDAV editor. Cyan number denote current line, red numbers denote lines with errors.
-@item Disable mouse wheel for zooming in UDAV by default.
-
-@item @strong{INCOMPATIBLE} Scale internally d1,d2 arguments in @ref{curve} to be exactly the same as Bezier curve (P0=p1, P1=d1+p1, P2=p2-d2, P3=p2).
-@item Other minor improvements, bugfixes and compatibility changes
-@end itemize
 
-@item @strong{1 June 2015.}
-New version (v.2.3.3) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are new functions, plot types and styles, improvement in MGL scripts and in mgltex, speeding up and bugfixes:
-@itemize @bullet
-@item Update @ref{LaTeX package} (thanks to Diego Sejas Viscarra)
-@item Add @ref{surfca} and @ref{surf3ca} plots.
-@item Add @ref{wavelet} transforms.
-@item Add @ref{attachlight} for attaching light settings to inplots.
-@item Add manual rotation angle for @ref{axis} ticks (by "value" option).
-@item Add @code{mglDataS} class which is similar to std::vector<double> one.
-@item Add missing @code{mglDataC} functions.
-
-@item Add style '%' for color scheme along 2 coordinates (as in @ref{map}).
-@item If tick template start with '&' then long integer is passed instead of double.
-@item Add style 'V' for drawing @ref{text} centered vertically.
-@item Add style "dN" in @ref{smooth} for averaging over (2*N+1)-th points.
-@item Add TeX symbols "\quote", "--" and Cyrillic ones.
-
-@item Add complex numbers in MGL -- any expression started with '!' will have complex value(s).
-@item Add @ref{rkstep} command for Runge-Kutta step in MGL script.
-@item Add functions 'min()', 'max()' to MGL parser and formula evaluation.
-@item MGL command @ref{join} now can join arbitrary number of data arrays.
-@item Command @ref{stop} is not required to be placed before @ref{func}.
-@item Add warning about writing to temporary arrays in MGL scripts.
-@item Names 'rnd','nan','inf' are reserved in MGL scripts now.
-
-@item Add annotation for plot styles and options into header files.
-@item Greatly improve the speed of formula parsing for MGL scripts
-@item Update JS interface
-@item Add binary font files for speeding up initialization and font loading
-@item Exclude "pure" attribute for function due to compatibility reasons
-@item Add mgl_set_size_scl() for additional scaling width and height of the image
-@item Add options -S, -q for mglconv
-@item Rearrange toolbuttons in @ref{UDAV}.
-@item Bugfix for @ref{flow} and @ref{pipe} functions
-@item Other minor improvements, bugfixes and compatibility changes
-@end itemize
+@item Add @ref{beltc} plot, which is @ref{belt} with manual coloring.
+@item Add style @samp{~} for @ref{plot} and @ref{tens} to omit some points at output.
+@item Add style @samp{:} for @ref{axis} to draw lines through point (0,0,0).
+@item Bugfixes.
 
-@item @strong{2 February 2015.}
-New version (v.2.3.2) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are minor improvements and bugfixes:
-@itemize @bullet
-@item Update @ref{LaTeX package} (thanks to Diego Sejas Viscarra)
-@item Add reading files with complex numbers by @ref{read} command.
-@item Parallelize reading textual data files.
-@item Add 'i','j','k' variables for data filling (see @ref{fill}).
-@item Add saving images in QMathGL even if corresponding format support is disabled.
-@item Add cmake option MGL_DEF_FONT to change default font name or use built-in one (if MGL_DEF_FONT is empty).
-@item Compatibility changes and bugfixes.
 @end itemize
 
-@item @strong{21 October 2014.}
-New version (v.2.3.1) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are minor improvements and bugfixes:
+@item @strong{17 May 2017.}
+New version (v.2.4) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are @code{mgllab} executable, string manipulation in MGL, new functions, plot types and styles, translation to Russian using @code{gettext} and bugfixes:
 @itemize @bullet
-@item Add @ref{LaTeX package} @emph{mglTeX} (author Diego Sejas Viscarra) for making figures directly from MGL script located in LaTeX file.
-@item Add MGL command @ref{load} for loading MGL commands from external DLL (or .so) module.
-@item Add @ref{logo} function to draw bitmap (logo), which is stretched along whole axis range.
-@item Add MGL command @ref{reset} which restore default settings and clear image (i.e. call @code{DefaultPlotParam()}).
-@c @item Add option @code{value} to @ref{axis} function, which allow to set rotation angle for tick labels.
-@item Change y coordinate at x-z projection.
-@item Improve projection of 'unrotatable' objects (like @ref{legend}, @ref{title}, ...).
-@item Add projection (@ref{ternary}&8) which is the same as usual (@ref{ternary}&4) but don't print text on projections
-@item Improve orientation of axis ticks and labels.
-@item Add mglWnd::SetDrawFunc().
-@item Add mgl_set_global_warn() and mgl_get_global_warn() for set/get messages of global scope.
-@item Make copying private of mglGraph and derived.
-@item Add virtual destructors.
-@item Add some static functions for mglGraph.
-@item Add option @samp{-n} to mglconv to disable automatic saving of the image.
-@item Add option @samp{-s} to mglview and mglconv to run setup script before the main one.
-@item Become compatible with giflib 5.1.
-@item Add light scaling at MGLD import.
-@item Add scaling of frames at Adjust().
-@item Possible bugfix for 32bit gcc.
-@item Update documentation and make other minor bugfixes and compatibility changes.
-@end itemize
 
-@item @strong{7 August 2014.}
-New version (v.2.3) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are major improvements and speeding up of core MathGL and UDAV.
+@item Add @code{mgllab} executable, which is FLTK based version of @code{UDAV}. So, most things @code{mgllab} do faster.
+@item Add string manipulation in MGL language:
 @itemize @bullet
-@item Add background image, which allow in particular semi-transparent background color. Correspondingly add function @ref{rasterize} for saving current image as background, and function @ref{background} for loading background image from PNG or JPEG file.
-@item Add primitives to draw @ref{polygon} and angle @ref{arc}.
-@item Allow arbitrary factor for axis ticks (like, @code{gr->SetTicks('x',M_PI,0,NAN,"\\pi");} or @code{@ref{xtick} pi '\pi'}).
-@item Add function @code{AddTick()} for adding manual tick to the list of existed ones.
-
-@item Add new styles and symbols:
-@itemize
-@item arrow style @samp{X} (see @ref{Line styles});
-@item color gradient (color scheme) for text string (see @ref{Color scheme});
-@item manual dash style, like @samp{@{df090@}} (see @ref{Line styles});
-@item manual mask style, like @samp{@{s00ff00182424f800@}} (see @ref{Color scheme});
-@item styles @samp{fFE0123456789+-} for printing numbers in functions @ref{axis}, @ref{colorbar}, @ref{table}, @ref{label};
-@item style @samp{!} to disable ticks tuning in @ref{axis} and @ref{colorbar};
-@item style @samp{!} to draw @ref{grid} lines at subticks coordinates too;
-@item special symbol @samp{\b} which will be ignored at printing;
-@item calligraphic TeX symbols, like @samp{\calB}, @samp{\calE}, @samp{\calF}, @samp{\calH}, @samp{\calI}, @samp{\calL}, @samp{\calM}, @samp{\calR}, @samp{\ell}, @samp{\scrg}, @samp{\scro}.
-@end itemize
-
-@item Add @ref{ode} solving functions for textual formulas.
-@item Add function for global cubic spline interpolation, and function @ref{gspline} to refill data using global spline.
-
-@item Add functions @code{random(dat)} and @code{gamma_inc(a,x)} to the list of known functions for formula parsing
-@item Add @code{inf} variable to the MGL and formula parsing
-@item Allow reading JPEG files for @ref{import}.
-@item Function @ref{subdata} now can handle NULL argument(s). Add variants of @ref{subdata} with provided 1 and 2 arguments.
-
-@item Warning messages and information are printed to @code{stderr} until call of @code{mgl_suppress_warn(true);} will disable it.
-@item Add function @ref{version} to check if MathGL version is valid.
-
-@item Add move constructor(s) if compiler support C++11 rvalues.
-
-@item Changes in algorithms:
-@itemize
-@item Greatly increase speed of formula parsing (i.e. of functions @ref{modify}, @ref{fill} and similar), and speeding up many other places;
-@item Improve algorithm for contours drawing and filling, taking special attention to quasi-random data;
-@item Function @code{Spline()} now use 5-th order polynomials to keep continuity of 2nd derivative too;
-@item Add function attributes @code{pure} or @code{const}, which potentially can speed up drawing;
-@item Use spline instead of linear interpolation in functions @ref{flow} and @ref{pipe};
-@item Adjust @ref{columnplot} and @ref{gridplot} positions for non-zero distance between the inplots;
-@item Improve @ref{colorbar} labels drawing for the case of disabled label rotation;
-@item Choose new scales for @ref{perspective};
-@item Allow 'negative' angles for text rotation;
-@item Use new s-hull version for triangulation.
+       @item 'str'[n] -- get string of only n-th symbol;
+       @item 'str'+v -- add value v to the last character of the string;
+       @item 'str',val or 'str',!val -- append numeric value to the string (as before).
 @end itemize
+@item Add time value to MGL language in format: @samp{hh-mm-ss_DD.MM.YYYY} or @samp{hh-mm-ss} or @samp{DD.MM.YYYY}.
+@item Add @ref{iris} plot to show cross-dependencies of several data arrays.
+@item Add @ref{flame2d} to draw flame fractals.
+@item Add @ref{bbox} to set bounding box for 2D output.
+@item Add @ref{section} to get part of data between specified values.
+@item Add @ref{detect} to found curves along data maximums.
+@item Add @ref{dilate} to extend the region of 1-th value.
+@item Add @ref{erode} to narrow the region of 1-th value.
+@item Add @ref{apde} to solve PDE equation in inhomogeneous nonlinear media with spatial dispersion.
+@item Add @ref{symbol} to draw the glyphs defined by @ref{addsymbol}.
+@item Add @ref{addsymbol} to declare user-defined symbol (or glyph), which can be used as markers for plot (with style '&') or drawn itself by @ref{symbol} command.
+@item Add @ref{openhdf} to open all data arrays from HDF file.
+@item Extend @ref{crop} to cut to optimal size for FFT (i.e. to closest of 2^n*3^m*5^l).
+@item Add function mgl_data_max_first() and data suffixes .m[xyz][fl] to find first/last maximum along direction (see @ref{Data information}).
+@item Add function mgl_datac_diff_par() to parametric derivative of complex data (see @ref{diff}).
+@item Add style @samp{F} for @ref{bars} and @ref{barh} to set fixed bar widths.
+@item Add style @samp{a} for @ref{plot}, @ref{tens}, @ref{area} and @ref{region} to accurate drawing of data, which partially lie out of axis range.
+@item Add style @samp{#} for @ref{region} to draw wired plot.
+@item Add possibility of manual shift in @ref{multiplot}.
+@item Add parsing arguments of options for MGL commands.
+@item MGL command @ref{correl} now can perform 2d and 3d correlations.
+@item Option @ref{meshnum} now change the number of drawn markers for @ref{plot}, @ref{tens}, @ref{step}, @ref{mark} and @ref{textmark}.
+@item Function @ref{step} handle data with x.nx>y.nx similarly to @ref{bars}.
+@item Extend @ref{tile} and @ref{tiles} by adding manual coloring and face orientation.
+@item Add variant of MGL command @ref{copy} to copy data with "incorrect" names.
+@item Improve tick labels drawing.
+@item Improve time-ticks (add weeks) and add subticks to its.
+@item Improve @ref{fplot} to handle several singularities.
+@item Add LaTeX command \dfrac@{@}@{@}. This is full-sized version of \frac@{@}@{@}. Unfortunately, there is no support of nesting. Contrary, \frac allow nesting.
+@item Add mglODEc() -- ODE solver for complex variables (see @ref{ode}).
+@item Add cmplx(a,b)=a+i*b to the list of known functions in formula parsing
+@item Update CMake find_package to find MathGL.
+@item Increase line width for wired text.
+@item Update documentation: add description of new commands, add hint @ref{Mixing bitmap and vector output}.
+@item Add translation to Russian for most of labels and messages.
+@item Name @code{all} are reserved in MGL scripts now as synonym of -1.
+
+@item INCOMPATIBLE: Replace libmgl-qt by libmgl-qt4 and libmgl-qt5 for resolving conflicts of simultaneously installed both Qt4 and Qt5.
+@item Minor bugfixes.
 
-@item Add @code{ViewAsRotate()} function which handle arguments of @ref{view} by the same way as @ref{rotate} function, i.e @code{View(tetx,tetz,tety)} <=> @code{ViewAsRotate(-tetz,-tetx,-tety)}.
-@item Function @code{mglWindow::Adjust()} for Quality&4==0 now show image in widgets even if draw function is absent (i.e. =NULL).
-@item Make function mgl_get_curvs() to be exported. This function is used internally to connect line segments to a set of curves (in particular, for contour lines).
-
-@item Improvements in UDAV
-@itemize
-@item Rearrange tool buttons;
-@item Add features for manual dashing and manual mask in Style dialog;
-@item Add dialog for new dialog for new inplots (including @ref{subplot}, @ref{multiplot}, @ref{columnplot}, @ref{stickplot}, @ref{gridplot});
-@item Add option to use dots plot at image refreshing (for faster rotation etc);
-@item Add new primitives (@ref{arc}, @ref{polygon}, rotated @ref{text}) as mouse handled ones;
-@item Add close button to data tabs;
-@item Add button to stop script drawing and @code{stop()} slot for QMathGL;
-@item Allow to delete/hide/unhide selected plot;
-@item Allow to move selected plot between inplots;
-@item Improve NewCommand dialog. Now it replace the script command if user change arguments only;
-@item MGL commands @ref{perspective} and @ref{fog} now work correctly in UDAV;
-@item Update icons to use Oxygen ones.
 @end itemize
-@end itemize
-
 
-@item @strong{19 March 2014.}Version 2.2.2.1 was released.
+@item @strong{20 June 2016.} Version 2.3.5.1 was released.
+@item @strong{16 May 2016.} Version 2.3.5 was released.
+@item @strong{13 February 2016.} Version 2.3.4 was released.
+@item @strong{1 June 2015.} Version 2.3.3 was released.
+@item @strong{2 February 2015.} Version 2.3.2 was released.
+@item @strong{21 October 2014.} Version 2.3.1 was released.
+@item @strong{7 August 2014.} Version 2.3 was released.
+@item @strong{19 March 2014.} Version 2.2.2.1 was released.
 @item @strong{10 March 2014.} Version 2.2.2 was released.
 @item @strong{22 January 2014.} Version 2.2.1 was released.
 @item @strong{11 November 2013.} Version 2.2 was released.
@@ -450,20 +347,14 @@ You may download current version of MathGL for following configurations:
 @item
 @uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}.tar.gz, Source} file with cmake build system.
 @item
-@uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}-mingw.i686.7z,Win32 GPL} binaries for MinGW (build for i686).
+@uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}-mingw.win32.7z,GPL} or @uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}.LGPL-mingw.win32.7z,LGPL} binaries for MinGW, 32-bit build for Pentium IV.
 @item
-@uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}.LGPL-mingw.i386.7z,Win32 LGPL} binaries for MinGW (build for i386, no GSL and HDF5 support).
+@uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}-mingw.win64.7z,GPL} or @uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}.LGPL-mingw.win64.7z,LGPL} binaries for MinGW, 64-bit build.
 @item
-@uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}.Win10-mingw.i386.7z,Win32 GPL} binaries for MinGW (build for i386). This should work on Windows 8 and Windows 10.
-@c @item
-@c @uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}.LGPL-win64.7z,Win64 LGPL} binaries for MSVS 2010 (no GSL and HDF5 support)
+MathGL utilities with all required DLL files for @uref{http://downloads.sourceforge.net/mathgl/mgl_scripts-@value{VERSION}.win32.7z,32-bit} and @uref{http://downloads.sourceforge.net/mathgl/mgl_scripts-@value{VERSION}.win64.7z,64-bit} versions of MS Windows.
 @item
 @uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}.eng.pdf,PDF} documentation in English.
 @item
-@uref{http://downloads.sourceforge.net/mathgl/mgl_scripts-@value{VERSION}@value{MINVER}.7z, UDAV and utilities} with all required DLL files (build for i686).
-@item
-@uref{http://downloads.sourceforge.net/mathgl/mgl_scripts-@value{VERSION}@value{MINVER}.Win10.7z, UDAV and utilities} with all required DLL files (build for i386). This should work on Windows 8 and Windows 10.
-@item
 @uref{http://downloads.sourceforge.net/mathgl/mathgl-doc-html-@value{VERSION}@value{MINVER}.7z, Archive} with HTML documentation and figures.
 @c @item
 @c @uref{http://downloads.sourceforge.net/mathgl/mathgl_slides-1.9.pdf,PDF} slideshow of main features
index 967c47778a2dcff55f56dcd5bce70a15b0e92eee..44b65bf95a4c383a050202c8bc79c14a42ef362a 100644 (file)
@@ -52,10 +52,11 @@ Generally, MathGL is GPL library. However, you can use LGPL license for MathGL c
 
 @strong{Latest news}
 @itemize
-@item @emph{13 February 2016.}
-New version (v.@value{VERSION}@value{MINVER}) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are new functions, plot types and styles, improvement in MGL scripts and in mgltex, some speeding up and bugfixes, which denoted @ref{News, here}.
-@item @emph{7 August 2014.}
-New version (v.2.3) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are many major improvements for both MathGL core and for UDAV, which denoted @ref{News, here}.
+
+@item @strong{20 July 2017.}
+New version (v.2.4.1) with bugfixes of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released.
+@item @emph{17 May 2017.}
+New version (v.2.4) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are @code{mgllab} executable, string manipulation in MGL, new functions, plot types and styles, translation to Russian using @code{gettext} and bugfixes, which denoted @ref{News, here}.
 @end itemize
 
 There is detailed @ref{News, news list}. Sourceforge project page @uref{http://sourceforge.net/projects/mathgl/, here}.
@@ -75,182 +76,79 @@ Javascript interface was developed with support of @url{http://www.datadvance.ne
 
 @itemize
 
-@item @strong{13 February 2016.}
-New version (v.2.3.4) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are new functions, plot types and styles, improvement in MGL scripts and in mgltex, some speeding up and bugfixes:
-@itemize @bullet
-@item Update @ref{LaTeX package} (thanks to Diego Sejas Viscarra)
-
-@item Add @ref{pmap} plot for Poincare map.
-@item Add @ref{lamerey} plot for Lamerey diagram.
-@item Add @ref{bifurcation} plot for Bifurcation diagram.
-@item Add @ref{ifs2d} and @ref{ifs3d} functions for fractal generation using iterated function system (thanks to Diego Sejas Viscarra).
-
-@item Add @ref{pulse} function for determining pulse parameters.
-@item Add @ref{scanfile} function for getting formated data from textual file.
-@item Add mglData::SetList() function for setting data from variable argument list of double values.
-@item Add @ref{echo} command for printing the content of data.
-@item Add @ref{print} command for print messages to stdout immediately.
-@item Add @ref{pendelta} function for changing size of blur area around lines, marks, glyphs, ...
-
-@item Allow MGL command @ref{save} to write/append strings to a file.
-@item Add option to rewrite file in @ref{savehdf} command.
-@item Add option to @ref{setsize} for scaling primitives without its erasing.
-
-@item Add callback functions to mglQt, mglFLTK, and extend @ref{mglDraw class} for simpler drawing in parallel with calculation (see @ref{Draw and calculate}).
-@item Force set focus for editor in UDAV.
-@item Add line numbers to UDAV editor. Cyan number denote current line, red numbers denote lines with errors.
-@item Disable mouse wheel for zooming in UDAV by default.
-
-@item @strong{INCOMPATIBLE} Scale internally d1,d2 arguments in @ref{curve} to be exactly the same as Bezier curve (P0=p1, P1=d1+p1, P2=p2-d2, P3=p2).
-@item Other minor improvements, bugfixes and compatibility changes
-@end itemize
 
-@item @strong{1 June 2015.}
-New version (v.2.3.3) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are new functions, plot types and styles, improvement in MGL scripts and in mgltex, speeding up and bugfixes:
+@item @strong{20 July 2017.}
+New version (v.2.4.1) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released.
 @itemize @bullet
-@item Update @ref{LaTeX package} (thanks to Diego Sejas Viscarra)
-@item Add @ref{surfca} and @ref{surf3ca} plots.
-@item Add @ref{wavelet} transforms.
-@item Add @ref{attachlight} for attaching light settings to inplots.
-@item Add manual rotation angle for @ref{axis} ticks (by "value" option).
-@item Add @code{mglDataS} class which is similar to std::vector<double> one.
-@item Add missing @code{mglDataC} functions.
-
-@item Add style '%' for color scheme along 2 coordinates (as in @ref{map}).
-@item If tick template start with '&' then long integer is passed instead of double.
-@item Add style 'V' for drawing @ref{text} centered vertically.
-@item Add style "dN" in @ref{smooth} for averaging over (2*N+1)-th points.
-@item Add TeX symbols "\quote", "--" and Cyrillic ones.
-
-@item Add complex numbers in MGL -- any expression started with '!' will have complex value(s).
-@item Add @ref{rkstep} command for Runge-Kutta step in MGL script.
-@item Add functions 'min()', 'max()' to MGL parser and formula evaluation.
-@item MGL command @ref{join} now can join arbitrary number of data arrays.
-@item Command @ref{stop} is not required to be placed before @ref{func}.
-@item Add warning about writing to temporary arrays in MGL scripts.
-@item Names 'rnd','nan','inf' are reserved in MGL scripts now.
-
-@item Add annotation for plot styles and options into header files.
-@item Greatly improve the speed of formula parsing for MGL scripts
-@item Update JS interface
-@item Add binary font files for speeding up initialization and font loading
-@item Exclude "pure" attribute for function due to compatibility reasons
-@item Add mgl_set_size_scl() for additional scaling width and height of the image
-@item Add options -S, -q for mglconv
-@item Rearrange toolbuttons in @ref{UDAV}.
-@item Bugfix for @ref{flow} and @ref{pipe} functions
-@item Other minor improvements, bugfixes and compatibility changes
-@end itemize
 
-@item @strong{2 February 2015.}
-New version (v.2.3.2) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are minor improvements and bugfixes:
-@itemize @bullet
-@item Update @ref{LaTeX package} (thanks to Diego Sejas Viscarra)
-@item Add reading files with complex numbers by @ref{read} command.
-@item Parallelize reading textual data files.
-@item Add 'i','j','k' variables for data filling (see @ref{fill}).
-@item Add saving images in QMathGL even if corresponding format support is disabled.
-@item Add cmake option MGL_DEF_FONT to change default font name or use built-in one (if MGL_DEF_FONT is empty).
-@item Compatibility changes and bugfixes.
-@end itemize
+@item Add @ref{beltc} plot, which is @ref{belt} with manual coloring.
+@item Add style @samp{~} for @ref{plot} and @ref{tens} to omit some points at output.
+@item Add style @samp{:} for @ref{axis} to draw lines through point (0,0,0).
+@item Bugfixes.
 
-@item @strong{21 October 2014.}
-New version (v.2.3.1) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are minor improvements and bugfixes:
-@itemize @bullet
-@item Add @ref{LaTeX package} @emph{mglTeX} (author Diego Sejas Viscarra) for making figures directly from MGL script located in LaTeX file.
-@item Add MGL command @ref{load} for loading MGL commands from external DLL (or .so) module.
-@item Add @ref{logo} function to draw bitmap (logo), which is stretched along whole axis range.
-@item Add MGL command @ref{reset} which restore default settings and clear image (i.e. call @code{DefaultPlotParam()}).
-@c @item Add option @code{value} to @ref{axis} function, which allow to set rotation angle for tick labels.
-@item Change y coordinate at x-z projection.
-@item Improve projection of 'unrotatable' objects (like @ref{legend}, @ref{title}, ...).
-@item Add projection (@ref{ternary}&8) which is the same as usual (@ref{ternary}&4) but don't print text on projections
-@item Improve orientation of axis ticks and labels.
-@item Add mglWnd::SetDrawFunc().
-@item Add mgl_set_global_warn() and mgl_get_global_warn() for set/get messages of global scope.
-@item Make copying private of mglGraph and derived.
-@item Add virtual destructors.
-@item Add some static functions for mglGraph.
-@item Add option @samp{-n} to mglconv to disable automatic saving of the image.
-@item Add option @samp{-s} to mglview and mglconv to run setup script before the main one.
-@item Become compatible with giflib 5.1.
-@item Add light scaling at MGLD import.
-@item Add scaling of frames at Adjust().
-@item Possible bugfix for 32bit gcc.
-@item Update documentation and make other minor bugfixes and compatibility changes.
 @end itemize
 
-@item @strong{7 August 2014.}
-New version (v.2.3) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are major improvements and speeding up of core MathGL and UDAV.
+@item @strong{17 May 2017.}
+New version (v.2.4) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are @code{mgllab} executable, string manipulation in MGL, new functions, plot types and styles, translation to Russian using @code{gettext} and bugfixes:
 @itemize @bullet
-@item Add background image, which allow in particular semi-transparent background color. Correspondingly add function @ref{rasterize} for saving current image as background, and function @ref{background} for loading background image from PNG or JPEG file.
-@item Add primitives to draw @ref{polygon} and angle @ref{arc}.
-@item Allow arbitrary factor for axis ticks (like, @code{gr->SetTicks('x',M_PI,0,NAN,"\\pi");} or @code{@ref{xtick} pi '\pi'}).
-@item Add function @code{AddTick()} for adding manual tick to the list of existed ones.
-
-@item Add new styles and symbols:
-@itemize
-@item arrow style @samp{X} (see @ref{Line styles});
-@item color gradient (color scheme) for text string (see @ref{Color scheme});
-@item manual dash style, like @samp{@{df090@}} (see @ref{Line styles});
-@item manual mask style, like @samp{@{s00ff00182424f800@}} (see @ref{Color scheme});
-@item styles @samp{fFE0123456789+-} for printing numbers in functions @ref{axis}, @ref{colorbar}, @ref{table}, @ref{label};
-@item style @samp{!} to disable ticks tuning in @ref{axis} and @ref{colorbar};
-@item style @samp{!} to draw @ref{grid} lines at subticks coordinates too;
-@item special symbol @samp{\b} which will be ignored at printing;
-@item calligraphic TeX symbols, like @samp{\calB}, @samp{\calE}, @samp{\calF}, @samp{\calH}, @samp{\calI}, @samp{\calL}, @samp{\calM}, @samp{\calR}, @samp{\ell}, @samp{\scrg}, @samp{\scro}.
-@end itemize
-
-@item Add @ref{ode} solving functions for textual formulas.
-@item Add function for global cubic spline interpolation, and function @ref{gspline} to refill data using global spline.
-
-@item Add functions @code{random(dat)} and @code{gamma_inc(a,x)} to the list of known functions for formula parsing
-@item Add @code{inf} variable to the MGL and formula parsing
-@item Allow reading JPEG files for @ref{import}.
-@item Function @ref{subdata} now can handle NULL argument(s). Add variants of @ref{subdata} with provided 1 and 2 arguments.
 
-@item Warning messages and information are printed to @code{stderr} until call of @code{mgl_suppress_warn(true);} will disable it.
-@item Add function @ref{version} to check if MathGL version is valid.
-
-@item Add move constructor(s) if compiler support C++11 rvalues.
-
-@item Changes in algorithms:
-@itemize
-@item Greatly increase speed of formula parsing (i.e. of functions @ref{modify}, @ref{fill} and similar), and speeding up many other places;
-@item Improve algorithm for contours drawing and filling, taking special attention to quasi-random data;
-@item Function @code{Spline()} now use 5-th order polynomials to keep continuity of 2nd derivative too;
-@item Add function attributes @code{pure} or @code{const}, which potentially can speed up drawing;
-@item Use spline instead of linear interpolation in functions @ref{flow} and @ref{pipe};
-@item Adjust @ref{columnplot} and @ref{gridplot} positions for non-zero distance between the inplots;
-@item Improve @ref{colorbar} labels drawing for the case of disabled label rotation;
-@item Choose new scales for @ref{perspective};
-@item Allow 'negative' angles for text rotation;
-@item Use new s-hull version for triangulation.
+@item Add @code{mgllab} executable, which is FLTK based version of @code{UDAV}. So, most things @code{mgllab} do faster.
+@item Add string manipulation in MGL language:
+@itemize @bullet
+       @item 'str'[n] -- get string of only n-th symbol;
+       @item 'str'+v -- add value v to the last character of the string;
+       @item 'str',val or 'str',!val -- append numeric value to the string (as before).
 @end itemize
+@item Add time value to MGL language in format: @samp{hh-mm-ss_DD.MM.YYYY} or @samp{hh-mm-ss} or @samp{DD.MM.YYYY}.
+@item Add @ref{iris} plot to show cross-dependencies of several data arrays.
+@item Add @ref{flame2d} to draw flame fractals.
+@item Add @ref{bbox} to set bounding box for 2D output.
+@item Add @ref{section} to get part of data between specified values.
+@item Add @ref{detect} to found curves along data maximums.
+@item Add @ref{dilate} to extend the region of 1-th value.
+@item Add @ref{erode} to narrow the region of 1-th value.
+@item Add @ref{apde} to solve PDE equation in inhomogeneous nonlinear media with spatial dispersion.
+@item Add @ref{symbol} to draw the glyphs defined by @ref{addsymbol}.
+@item Add @ref{addsymbol} to declare user-defined symbol (or glyph), which can be used as markers for plot (with style '&') or drawn itself by @ref{symbol} command.
+@item Add @ref{openhdf} to open all data arrays from HDF file.
+@item Extend @ref{crop} to cut to optimal size for FFT (i.e. to closest of 2^n*3^m*5^l).
+@item Add function mgl_data_max_first() and data suffixes .m[xyz][fl] to find first/last maximum along direction (see @ref{Data information}).
+@item Add function mgl_datac_diff_par() to parametric derivative of complex data (see @ref{diff}).
+@item Add style @samp{F} for @ref{bars} and @ref{barh} to set fixed bar widths.
+@item Add style @samp{a} for @ref{plot}, @ref{tens}, @ref{area} and @ref{region} to accurate drawing of data, which partially lie out of axis range.
+@item Add style @samp{#} for @ref{region} to draw wired plot.
+@item Add possibility of manual shift in @ref{multiplot}.
+@item Add parsing arguments of options for MGL commands.
+@item MGL command @ref{correl} now can perform 2d and 3d correlations.
+@item Option @ref{meshnum} now change the number of drawn markers for @ref{plot}, @ref{tens}, @ref{step}, @ref{mark} and @ref{textmark}.
+@item Function @ref{step} handle data with x.nx>y.nx similarly to @ref{bars}.
+@item Extend @ref{tile} and @ref{tiles} by adding manual coloring and face orientation.
+@item Add variant of MGL command @ref{copy} to copy data with "incorrect" names.
+@item Improve tick labels drawing.
+@item Improve time-ticks (add weeks) and add subticks to its.
+@item Improve @ref{fplot} to handle several singularities.
+@item Add LaTeX command \dfrac@{@}@{@}. This is full-sized version of \frac@{@}@{@}. Unfortunately, there is no support of nesting. Contrary, \frac allow nesting.
+@item Add mglODEc() -- ODE solver for complex variables (see @ref{ode}).
+@item Add cmplx(a,b)=a+i*b to the list of known functions in formula parsing
+@item Update CMake find_package to find MathGL.
+@item Increase line width for wired text.
+@item Update documentation: add description of new commands, add hint @ref{Mixing bitmap and vector output}.
+@item Add translation to Russian for most of labels and messages.
+@item Name @code{all} are reserved in MGL scripts now as synonym of -1.
+
+@item INCOMPATIBLE: Replace libmgl-qt by libmgl-qt4 and libmgl-qt5 for resolving conflicts of simultaneously installed both Qt4 and Qt5.
+@item Minor bugfixes.
 
-@item Add @code{ViewAsRotate()} function which handle arguments of @ref{view} by the same way as @ref{rotate} function, i.e @code{View(tetx,tetz,tety)} <=> @code{ViewAsRotate(-tetz,-tetx,-tety)}.
-@item Function @code{mglWindow::Adjust()} for Quality&4==0 now show image in widgets even if draw function is absent (i.e. =NULL).
-@item Make function mgl_get_curvs() to be exported. This function is used internally to connect line segments to a set of curves (in particular, for contour lines).
-
-@item Improvements in UDAV
-@itemize
-@item Rearrange tool buttons;
-@item Add features for manual dashing and manual mask in Style dialog;
-@item Add dialog for new dialog for new inplots (including @ref{subplot}, @ref{multiplot}, @ref{columnplot}, @ref{stickplot}, @ref{gridplot});
-@item Add option to use dots plot at image refreshing (for faster rotation etc);
-@item Add new primitives (@ref{arc}, @ref{polygon}, rotated @ref{text}) as mouse handled ones;
-@item Add close button to data tabs;
-@item Add button to stop script drawing and @code{stop()} slot for QMathGL;
-@item Allow to delete/hide/unhide selected plot;
-@item Allow to move selected plot between inplots;
-@item Improve NewCommand dialog. Now it replace the script command if user change arguments only;
-@item MGL commands @ref{perspective} and @ref{fog} now work correctly in UDAV;
-@item Update icons to use Oxygen ones.
 @end itemize
-@end itemize
-
 
-@item @strong{19 March 2014.}Version 2.2.2.1 was released.
+@item @strong{20 June 2016.} Version 2.3.5.1 was released.
+@item @strong{16 May 2016.} Version 2.3.5 was released.
+@item @strong{13 February 2016.} Version 2.3.4 was released.
+@item @strong{1 June 2015.} Version 2.3.3 was released.
+@item @strong{2 February 2015.} Version 2.3.2 was released.
+@item @strong{21 October 2014.} Version 2.3.1 was released.
+@item @strong{7 August 2014.} Version 2.3 was released.
+@item @strong{19 March 2014.} Version 2.2.2.1 was released.
 @item @strong{10 March 2014.} Version 2.2.2 was released.
 @item @strong{22 January 2014.} Version 2.2.1 was released.
 @item @strong{11 November 2013.} Version 2.2 was released.
@@ -450,20 +348,14 @@ You may download current version of MathGL for following configurations:
 @item
 @uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}.tar.gz, Source} file with cmake build system.
 @item
-@uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}-mingw.i686.7z,Win32 GPL} binaries for MinGW (build for i686).
+@uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}-mingw.win32.7z,GPL} or @uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}.LGPL-mingw.win32.7z,LGPL} binaries for MinGW, 32-bit build for Pentium IV.
 @item
-@uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}.LGPL-mingw.i386.7z,Win32 LGPL} binaries for MinGW (build for i386, no GSL and HDF5 support).
+@uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}-mingw.win64.7z,GPL} or @uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}.LGPL-mingw.win64.7z,LGPL} binaries for MinGW, 64-bit build.
 @item
-@uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}.Win10-mingw.i386.7z,Win32 GPL} binaries for MinGW (build for i386). This should work on Windows 8 and Windows 10.
-@c @item
-@c @uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}.LGPL-win64.7z,Win64 LGPL} binaries for MSVS 2010 (no GSL and HDF5 support)
+MathGL utilities with all required DLL files for @uref{http://downloads.sourceforge.net/mathgl/mgl_scripts-@value{VERSION}.win32.7z,32-bit} and @uref{http://downloads.sourceforge.net/mathgl/mgl_scripts-@value{VERSION}.win64.7z,64-bit} versions of MS Windows.
 @item
 @uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}.eng.pdf,PDF} documentation in English.
 @item
-@uref{http://downloads.sourceforge.net/mathgl/mgl_scripts-@value{VERSION}@value{MINVER}.7z, UDAV and utilities} with all required DLL files (build for i686).
-@item
-@uref{http://downloads.sourceforge.net/mathgl/mgl_scripts-@value{VERSION}@value{MINVER}.Win10.7z, UDAV and utilities} with all required DLL files (build for i386). This should work on Windows 8 and Windows 10.
-@item
 @uref{http://downloads.sourceforge.net/mathgl/mathgl-doc-html-@value{VERSION}@value{MINVER}.7z, Archive} with HTML documentation and figures.
 @c @item
 @c @uref{http://downloads.sourceforge.net/mathgl/mathgl_slides-1.9.pdf,PDF} slideshow of main features
index d9f51699192788524e3ae781fac35fdf36a4e47e..0414293fc905118a224e4b5ec355ed32f3c130a7 100644 (file)
@@ -176,6 +176,12 @@ showing the last mouse click position in the widget.
 Gets last position of mouse click.
 @end deftypefn
 
+@deftypefn {Method on @code{mglWnd}} @code{void *} Widget ()
+@deftypefnx {C function} @code{void *} mgl_fltk_widget (@code{HMGL} gr)
+@deftypefnx {C function} @code{void *} mgl_qt_widget (@code{HMGL} gr)
+Return pointer to widget (@ref{Fl_MathGL class} or @ref{QMathGL class}) used for plotting.
+@end deftypefn
+
 
 @c ------------------------------------------------------------------
 @external{}
@@ -230,7 +236,7 @@ Checks if calculations should be paused and pause it. Function is present only i
 @cindex Fl_MathGL
 @cindex widgets
 
-Class is FLTK widget which display MathGL graphics. It is defined in @code{#include <mgl2/fltk.h>}.
+Class is FLTK widget which display MathGL graphics. It is defined in @code{#include <mgl2/Fl_MathGL.h>}.
 
 @fig{fltk, Example of FLTK window with MathGL plot.}
 
@@ -239,6 +245,10 @@ Class is FLTK widget which display MathGL graphics. It is defined in @code{#incl
 @deftypemethodx Fl_MathGL @code{void} set_draw (@code{mglDraw *}draw)
 Sets drawing function as global function or as one from a class @code{mglDraw}. There is support of a list of plots (frames). So as one can prepare a set of frames at first and redraw it fast later (but it requires more memory). Function should return positive number of frames for the list or zero if it will plot directly. Parameter @var{par} contains pointer to data for the plotting function @var{draw}.
 @end deftypemethod
+@deftypemethod Fl_MathGL @code{mglDraw *}get_class ()
+Get pointer to @code{mglDraw} class or @code{NULL} if absent.
+@end deftypemethod
+
 @deftypemethod Fl_MathGL @code{void} update ()
 Update (redraw) plot.
 @end deftypemethod
@@ -272,8 +282,21 @@ Set new grapher instead of built-in one. Note that Fl_MathGL will automatically
 @deftypemethod Fl_MathGL @code{HMGL} get_graph ()
 Get pointer to grapher.
 @end deftypemethod
-@deftypemethod Fl_MathGL @code{void} adjust ()
-Adjust image size to fit whole widget.
+
+@deftypemethod Fl_MathGL @code{void} set_show_warn (@code{bool} val)
+Show window with warnings after script parsing.
+@end deftypemethod
+@deftypemethod Fl_MathGL @code{void} stop (@code{bool} stop=@code{true})
+Ask to stop of script parsing.
+@end deftypemethod
+@deftypemethod Fl_MathGL @code{void} set_handle_key (@code{bool} val)
+Enable/disable key handling as in mglview (default is false).
+@end deftypemethod
+@deftypemethod Fl_MathGL @code{int} get_last_id ()
+Get id of last clicked object.
+@end deftypemethod
+@deftypemethod Fl_MathGL @code{bool} running ()
+Check if script is parsing now or not.
 @end deftypemethod
 
 @deftypecv {Fl_MathGL option} Fl_MathGL @code{Fl_Valuator *} tet_val
index 5066c5891d93d485bd74a00fe6efcb02cfb6de7e..ac1fe0abc1652a2fe1d8fe7d8f8dd3b179cfbed6 100644 (file)
@@ -177,6 +177,12 @@ public:
 Возвращает положение щелчка мыши.
 @end deftypefn
 
+@deftypefn {Method on @code{mglWnd}} @code{void *} Widget ()
+@deftypefnx {C function} @code{void *} mgl_fltk_widget (@code{HMGL} gr)
+@deftypefnx {C function} @code{void *} mgl_qt_widget (@code{HMGL} gr)
+Возвращает указатель на виджет (@ref{Fl_MathGL class} or @ref{QMathGL class}), используемый для рисования.
+@end deftypefn
+
 @c ------------------------------------------------------------------
 @external{}
 @node mglDraw class, Fl_MathGL class, mglWnd class, Widget classes
@@ -230,7 +236,7 @@ Checks if calculations should be paused and pause it. Function is present only i
 @cindex Fl_MathGL
 @cindex widgets
 
-Класс реализует элемент интерфейса FLTK для отображения графики MathGL. Он определен в @code{#include <mgl2/fltk.h>}.
+Класс реализует элемент интерфейса FLTK для отображения графики MathGL. Он определен в @code{#include <mgl2/Fl_MathGL.h>}.
 
 @fig{fltk, Пример окна FLTK с графикой MathGL.}
 
@@ -239,6 +245,10 @@ Checks if calculations should be paused and pause it. Function is present only i
 @deftypemethodx Fl_MathGL @code{void} set_draw (@code{mglDraw *}draw)
 Устанавливает функцию рисования как глобальную функцию или как функцию член класса, производного от @code{mglDraw}. Поддерживается список графиков (кадров), так что можно вначале их нарисовать (требует довольно много памяти), а потом достаточно быстро отображать. Функция должна возвращать положительное число создаваемых кадров или ноль для непосредственного рисования. Параметр @var{par} содержит указатель на данные пользователя, передаваемый функции рисования @var{draw}.
 @end deftypemethod
+@deftypemethod Fl_MathGL @code{mglDraw *}get_class ()
+Указатель на экземпляр класса @code{mglDraw} или @code{NULL} если отсутствует.
+@end deftypemethod
+
 @deftypemethod Fl_MathGL @code{void} update ()
 Обновляет (перерисовывает) график.
 @end deftypemethod
@@ -270,8 +280,21 @@ Checks if calculations should be paused and pause it. Function is present only i
 @deftypemethod Fl_MathGL @code{mglGraph *} get_graph ()
 Возвращает указатель на объект, строящий графики.
 @end deftypemethod
-@deftypemethod Fl_MathGL @code{void} adjust ()
-Подгоняет размер картинки под размер окна.
+
+@deftypemethod Fl_MathGL @code{void} set_show_warn (@code{bool} val)
+Флаг показа окна с сообщениями после выполнения скрипта.
+@end deftypemethod
+@deftypemethod Fl_MathGL @code{void} stop (@code{bool} stop=@code{true})
+Запрос на остановку рисования.
+@end deftypemethod
+@deftypemethod Fl_MathGL @code{void} set_handle_key (@code{bool} val)
+Вкл/выкл обработку нажатий клавиш (как в mglview, по умолчанию выкл).
+@end deftypemethod
+@deftypemethod Fl_MathGL @code{int} get_last_id ()
+Вернуть id последнего выделенного объекта.
+@end deftypemethod
+@deftypemethod Fl_MathGL @code{bool} running ()
+Проверяет выполняется ли сейчас скрипт или нет.
 @end deftypemethod
 
 @deftypecv {Widget option} Fl_MathGL @code{Fl_Valuator *} tet_val
index 2bef2163cf59eeb1d294ed1f9439c21012ffe3c0..d62d7ef9c01975160cb5f4775966b2f1208c7d02 100644 (file)
--- a/todo.txt
+++ b/todo.txt
 
 ============= FAR FUTURE ================
 
-1. GTK window/widgets ???
-2. Export to COLLADA !!!
-3. Export to X3D !!!
+1. Export to COLLADA or X3D !!!
+2. Use mglDataV in 'var' ?!?
+
+3. Contour lines for bilinear interpolation (strong saddle-like faces) -- best way by adding curve primitive (type=5)?!?
 4. 3D text (with depth), and text along 3D curve (for Quality=3) ???
-5. Improve fplot, fsurf ???
-6. Get true coordinates in CalcXYZ for curved equations too.
-9. Inplot data should have ranges (add mglInPlot{x1,x2,y1,y2,Bp or something like this} which include mglMatrix instead of mglBase::Bp) + calc coor + JS
-10. Test mglDataC::Diffraction() + write sample + add rational function???
-12. Extra markers for '&' and '&#' signs ?!?
-13. Enable consecutive (as multiplication of matrices instead of single summary one) rotation of axis + the same in JS. Problem with widgets?!?
-14. Export background image to svg ???
-15. Frames by mouse in UDAV ???
-       A. мысли о frame??? для группы графиков -- не "удалять" их, а запихивать в отдельный кадр -- вопрос что с анимацией???
-       B. как делать анимацию (кадры) для мышиной версии ... список кадров, кнопки добавить в кадры + вставить из кадра
-17. Extend QO + extra docs
-18. Import OBJ ???
-19. Simplified triangle filling for Quality=1 ?!?
-20. Extend 'ask' by adding multiple questions simultaneously (+ set/get default values from file ???)
-21. Occasional seg.fault in mgl_qt_example at exit
-22. \overline{\overline{a}} ???
+5. Get true coordinates in CalcXYZ for curved equations too.
+6. Extra markers for '&' and '&#' signs ?!? or user-defined signs
 
+7. Improve z-order for rapidly oscillating surfaces (сравнение проекций центров на грань -- too slow)
 
-============= NEW FEATURES =============
+8. Enable consecutive (as multiplication of matrices instead of single summary one) rotation of axis + the same in JS. Problem with widgets?!?
 
-1. New tests:
-       c. Tests for mglDataC arrays (as separate flag)
-       e. Test for Crop, Momentum, NormSl, Sew, DiffParam, Envelope, STFA for all directions "xyz"; Clean, Last, First, Find, Spline3, FindAny, Insert, Delete, Put, SetId/Column, Squeeze, Extend, Trace, Combine, new Max/Min/Momentum, FillSample, Hist, operators, Sort, Roots, Jacobian
-       u. Test FlowP + 3d
+9. Export background image to svg ???
 
-2. Add manual shift of unrotated axis/tick labels.
-3. Centered curved text (see text2)
+10. Frames by mouse in UDAV ???
+       A. мысли о frame??? для группы графиков -- не "удалять" их, а запихивать в отдельный кадр -- вопрос что с анимацией???
+       B. как делать анимацию (кадры) для мышиной версии ... список кадров, кнопки добавить в кадры + вставить из кадра
+
+11. Parallel drawing in QMathGL (looks to complicated -- FLTK is better!)
+12. \overline{\overline{a}} ???
+13. Manual AddPnt() with specified id + openmp ?!? -- possible memory overuse
 
-4. Alternative algorithm for filled glyphs + user-defined glyphs.
-int DefineGlyph(const mglData &x, const mglData &y);
-void DrawGlyph(int id, mglPoint pos, double angle, double scale, const char *stl);
 
-5. Check lighting in OpenGL mode
-6. Add string manipulation -- {'str',val}=>str[val]; {'str',v1,v2}=>str.substr(v1,v2) [v1,v2 can be -1]; {'ch'+val'}=>char(ch+val)
-7. Improve z-order for rapidly oscillating surfaces
-8. Contour lines for bilinear interpolation (strong saddle-like faces)
-9. More accurate face cutting if one partially out of axis ranges
+============= NEW FEATURES =============
 
-11. Iris plot -- https://en.wikipedia.org/wiki/Iris_flower_data_set
-12. Parallel drawing in QMathGL.
+1. Centered curved text (see text2)
+2. Read MAT files ?!!
+3. Read WFM files ?!!
+4. "latex on" option ?!?
+
+5. Add 'goto' or 'do|while' command
+6. Extend 'ask' as:
+       ask $N1 'text|kind:arg1:arg2:...' $N2 'text|kind:arg1:arg2:...' ...
+       where kind={default=edit,spin,choice,check,slider,float?}
+7. Add ##d comment(s) -- analogue of 'ask' but update figure after each change ???
+8. Add "mgl_zoomview(int x, int y)" for zoom circle around image point {x,y}
+9. Mask in EPS/SVG
+11. Add momentum dat vdat ... where vdat is corresponding coordinate ???
 
 ZZ. Update *.i for new functions {before release!!!}
 
 
 ============= DOCUMENTATION =============
 
-A. Paper about MathGL!!! 6099610006
+A. Paper about MathGL!!!
 B. Add chapter with real samples
 C. Translate to Russian everything
 D. Docs about JS interface
 
-6. Update Qt and UDAV figures
+1. Update Qt and UDAV figures
+
+2. Sample about PDE -- add 'tridmat' + 'diffract'
+3. Sample about complex 'ode' (like Raman scattering)
+4. Sample about earth map
+5. Sample about 'erode' and 'dilate'
+7. Sample about 'detect'
+8. Sample about 'section'
+
+26. Update installation (dll from mgl_script + Qt plugins/ + Win10)
+
+ZZ. Update time.texi {before release!!!}
+
+как начать пользоваться (quickstart)
+как скомпилировать и установить (building & installing)
+как запустить (running)
+как протестировать свои правки (testing)
+как настроить (configuration)
+какие есть примеры использования (examples)
+
+============= mgllab ===========
+
+* Manual data changing should be written into script ?!?
+* Check: "You can shift axis range by pressing middle button and moving mouse. Also, you can zoom in/out axis range by using mouse wheel."
+* Shift/Zoom/Perspective by mouse!!!
+* Hint about string manipulation
+* Progress bar for external loop ?!!
+* 1d view -- over longer size + y-size for current slice only
+
+X. Own file-chooser dialog -- separate path and fname fields + add sorting by date|size
+Y. Window with Zoom/Hidden ???
+Z. Flat toolbuttons ???
+
 
-YY. Sample like http://pyxplot.org.uk/examples/05ap/02hlines/index.html using Stem()
 
 ============= UDAV =============
 
 1. Zoom rectangle after mouse selection
 
-2. Create default plot depending on selected row/column/range in data table ?!?
-
 3. Manual data changing should be written into script
        a. Suggest to save into HDF5 if data changed manually
        b. Each manual change in cell produce command like 'put dat val i j k'
        c. Add command to insert as 'list'
        d. Reset script after saving to HDF5 or putting to main script
        e. Ask about script changes before closing data tab
-
 4. List of constants into the list of data?!
 5. Add color cycle ???
 6. Color position in color scheme dialog
-7. QML ???
-8, Changable panels???
-
+7. Select 'bbox' by mouse
+9. Save data from the summary panel
+10. Select subdata section (between NAN in curve) by mouse + adding it to script ?!!
+11. Zoom in a region by middle mouse (if not in rotation mode)
+12. Extend 'ask' by adding multiple questions simultaneously (+ set/get default values from file ???)
 
 ============= UNSURE ===========
 
-1. \dfrac for normal size and centering  (sample \big\big{\frac{1}{2}}) ???
+1. GTK window/widgets ???
 2. "Cut off" curves if text is printed inside it (for contour labels) ?!?
-3. String variables in MGL + readstr command.
 4. Read DICOM files
 5. Check RunThr() in python/octave
 6. Auto axis range for formulas, like AutoRange("y(x)") or AutoRange('x',"x(t)").
index 4c80b360ad6138e3194620f06138fe02ac648dc6..29df76937b6303c1da88c0ab75ea5182f7ff599c 100644 (file)
@@ -1,6 +1,6 @@
 if(QT_ENABLED)
 
-configure_file(${MathGL_SOURCE_DIR}/udav/mgl.xml.in ${MathGL_BINARY_DIR}/udav/mgl.xml)
+configure_file(${MathGL2_SOURCE_DIR}/udav/mgl.xml.in ${MathGL2_BINARY_DIR}/udav/mgl.xml)
 
 #set(mgl_wnd_src window.cpp)
 set(udav_src anim_dlg.cpp find_dlg.cpp mem_pnl.cpp prop_dlg.cpp textedit.cpp args_dlg.cpp
@@ -18,40 +18,31 @@ if(WIN32)
        set(udav_src ${udav_src} udav.rc)
 endif(WIN32)
 
-if(MGL_HAVE_HDF5)
-#      target_link_libraries(mgl ${HDF5_LIBRARIES})
-       include_directories(${HDF5_INCLUDE_DIR})
-endif(MGL_HAVE_HDF5)
-
-if(MGL_HAVE_GSL)
-#      target_link_libraries(mgl ${GSL_LIB} ${GSL_CBLAS_LIB} )
-       include_directories(${GSL_INCLUDE_DIR})
-endif(MGL_HAVE_GSL)
-
 if(enable-qt5)
-       include(../cmake-qt5.txt)
+       include(../scripts/qt5.cmake)
        qt5_add_resources(udav_rc_src ${udav_rc} )
 else(enable-qt5)
-       include(../cmake-qt4.txt)
+       include(../scripts/qt4.cmake)
        qt4_add_resources(udav_rc_src ${udav_rc} )
 endif(enable-qt5)
 add_executable(udav ${udav_src} ${udav_moc_hdr} ${udav_rc_src})
 #set_target_properties(udav PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS} -pthread")
 if(enable-qt5)
-       target_link_libraries(udav mgl-qt5)
-       qt5_use_modules(udav ${MGL_QT5_LIBS})
+       target_link_libraries(udav mgl-qt5 ${MGL_QT5_LIBS})
 else(enable-qt5)
-       target_link_libraries(udav mgl-qt4)
-       qt4_use_modules(udav ${MGL_QT4_LIBS})
+       target_link_libraries(udav mgl-qt4 ${MGL_QT4_LIBS})
 endif(enable-qt5)
 
+mgl_po_src(${udav_src} ${udav_hdr})
+
 if(MGL_HAVE_PTHREAD)
        target_link_libraries(udav ${CMAKE_THREAD_LIBS_INIT})
 endif(MGL_HAVE_PTHREAD)
 
 install(
        TARGETS udav
-       RUNTIME DESTINATION bin
+       EXPORT MathGLTargets
+       RUNTIME DESTINATION ${MathGL_INSTALL_BIN_DIR}
 )
 install(FILES udav.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/pixmaps/)
 install(FILES udav_ru.qm DESTINATION ${CMAKE_INSTALL_PREFIX}/share/udav/)
index 99902a97f0f0712bb434bfe7c3047de25879b1e4..bef8c5ec8005c5c17fd8ba486542cc64c0f7ee87 100644 (file)
 #include <QCheckBox>\r
 //-----------------------------------------------------------------------------\r
 #include "anim_dlg.h"\r
+#undef sprintf // fix libintl bug of defining sprintf\r
 extern int animDelay;\r
 //-----------------------------------------------------------------------------\r
 AnimParam::AnimParam(QWidget *parent) : QDialog(parent)\r
 {\r
-       setWindowTitle(tr("UDAV - Animation setup"));\r
+       setWindowTitle(_("UDAV - Animation setup"));\r
        QHBoxLayout *a;\r
        QVBoxLayout *o, *g;\r
        QLabel *lbl;\r
        QPushButton *b;\r
        o = new QVBoxLayout(this);\r
-       lbl = new QLabel(tr("Redraw picture for $0 equal to"),this);\r
+       lbl = new QLabel(_("Redraw picture for $0 equal to"),this);\r
        o->addWidget(lbl);\r
        a = new QHBoxLayout();          o->addLayout(a);\r
        g = new QVBoxLayout();          a->addLayout(g);\r
-       rbt = new QRadioButton(tr("strings"),this);\r
+       rbt = new QRadioButton(_("strings"),this);\r
        connect(rbt, SIGNAL(clicked()),this, SLOT(setRBT()));\r
        g->addWidget(rbt);\r
        text = new QTextEdit(this);     g->addWidget(text);\r
        connect(text,SIGNAL(textChanged()),this,SLOT(setRBT()));\r
 \r
        g = new QVBoxLayout();          a->addLayout(g);\r
-       rbf = new QRadioButton(tr("values"),this);\r
+       rbf = new QRadioButton(_("values"),this);\r
        connect(rbf, SIGNAL(clicked()),this, SLOT(setRBF()));\r
        g->addWidget(rbf);\r
-       lbl = new QLabel(tr("from"),this);\r
+       lbl = new QLabel(_("from"),this);\r
        g->addWidget(lbl, Qt::AlignLeft);\r
        p1 = new QLineEdit(this);       g->addWidget(p1);\r
        connect(p1,SIGNAL(textChanged(QString)),this,SLOT(setRBF()));\r
-       lbl = new QLabel(tr("to"),this);\r
+       lbl = new QLabel(_("to"),this);\r
        g->addWidget(lbl, Qt::AlignLeft);\r
        p2 = new QLineEdit(this);       g->addWidget(p2);\r
        connect(p2,SIGNAL(textChanged(QString)),this,SLOT(setRBF()));\r
-       lbl = new QLabel(tr("with step"),this);\r
+       lbl = new QLabel(_("with step"),this);\r
        g->addWidget(lbl, Qt::AlignLeft);\r
        dp = new QLineEdit(this);       g->addWidget(dp);       dp->setText("1");\r
        connect(dp,SIGNAL(textChanged(QString)),this,SLOT(setRBF()));\r
-       b = new QPushButton(tr("Cancel"), this);        g->addWidget(b);\r
+       b = new QPushButton(_("Cancel"), this); g->addWidget(b);\r
        connect(b, SIGNAL(clicked()),this, SLOT(reject()));\r
-       b = new QPushButton(tr("OK"), this);    g->addWidget(b);\r
+       b = new QPushButton(_("OK"), this);     g->addWidget(b);\r
        connect(b, SIGNAL(clicked()),this, SLOT(fillRes()));\r
        b->setDefault(true);\r
        // general\r
        a = new QHBoxLayout();          o->addLayout(a);\r
-       b = new QPushButton(tr("Put to script"), this); a->addWidget(b);\r
+       b = new QPushButton(_("Put to script"), this);  a->addWidget(b);\r
        connect(b, SIGNAL(clicked()),this, SLOT(putTxt()));\r
-       lbl = new QLabel(tr("Delay (in ms)"),this);     a->addWidget(lbl);\r
+       lbl = new QLabel(_("Delay (in ms)"),this);      a->addWidget(lbl);\r
        delay = new QLineEdit(this);    a->addWidget(delay);\r
        QString s;      s.sprintf("%d",animDelay);      delay->setText(s);\r
        // export to gif/jpeg\r
        a = new QHBoxLayout();          o->addLayout(a);\r
 //     fname = new QLineEdit(this);    a->addWidget(fname);\r
-       gif = new QCheckBox(tr("Export to GIF"), this);         a->addWidget(gif);\r
-       jpg = new QCheckBox(tr("Save JPEG frames"), this);      a->addWidget(jpg);\r
+       gif = new QCheckBox(_("Export to GIF"), this);          a->addWidget(gif);\r
+       jpg = new QCheckBox(_("Save JPEG frames"), this);       a->addWidget(jpg);\r
+       gifOn = jpgOn = false;\r
 }\r
 //-----------------------------------------------------------------------------\r
 AnimParam::~AnimParam()        {}\r
@@ -100,8 +102,8 @@ void AnimParam::fillRes()
                        res = res+QString::number(x,'g',4)+"\n";\r
                accept();\r
        }\r
-       else    QMessageBox::warning(this,tr("UDAV - animation"),\r
-                                                                tr("You should select one of case"));\r
+       else    QMessageBox::warning(this,_("UDAV - animation"),\r
+                                                                _("You should select one of case"));\r
 }\r
 //-----------------------------------------------------------------------------\r
 void AnimParam::putTxt()\r
index 4a34682dbbbf44513687c4d056b7a6ffd5f1d7ce..60f7c98b8fa7383387863cd33d0486842328ca56 100644 (file)
@@ -21,6 +21,7 @@
 #define ANIMPARAM_H
 //-----------------------------------------------------------------------------
 #include <QDialog>
+#include "mgl2/define.h"
 //-----------------------------------------------------------------------------
 class QLineEdit;
 class QTextEdit;
index aa20c484145605136f92739bf45d48af41277189..e4655827635708a2fa6b5e0a68796d460ff20e54 100644 (file)
@@ -29,7 +29,7 @@ QDialog *createArgsDlg(QWidget *p)    {       return new ArgsDialog(p);       }
 //-----------------------------------------------------------------------------
 ArgsDialog::ArgsDialog(QWidget *parent) : QDialog(parent)
 {
-       setWindowTitle(tr("UDAV - Set script arguments"));
+       setWindowTitle(_("UDAV - Set script arguments"));
        QHBoxLayout *h;
        QVBoxLayout *v;
        QGridLayout *g;
@@ -38,31 +38,31 @@ ArgsDialog::ArgsDialog(QWidget *parent) : QDialog(parent)
 
        v = new QVBoxLayout(this);
        g = new QGridLayout();          v->addLayout(g);
-       l = new QLabel(tr("String for $1"), this);      g->addWidget(l, 0, 0);
+       l = new QLabel(_("String for $1"), this);       g->addWidget(l, 0, 0);
        a[1] = new QLineEdit(this);                                     g->addWidget(a[1], 1, 0);
-       l = new QLabel(tr("String for $2"), this);      g->addWidget(l, 0, 1);
+       l = new QLabel(_("String for $2"), this);       g->addWidget(l, 0, 1);
        a[2] = new QLineEdit(this);                                     g->addWidget(a[2], 1, 1);
-       l = new QLabel(tr("String for $3"), this);      g->addWidget(l, 2, 0);
+       l = new QLabel(_("String for $3"), this);       g->addWidget(l, 2, 0);
        a[3] = new QLineEdit(this);                                     g->addWidget(a[3], 3, 0);
-       l = new QLabel(tr("String for $4"), this);      g->addWidget(l, 2, 1);
+       l = new QLabel(_("String for $4"), this);       g->addWidget(l, 2, 1);
        a[4] = new QLineEdit(this);                                     g->addWidget(a[4], 3, 1);
-       l = new QLabel(tr("String for $5"), this);      g->addWidget(l, 4, 0);
+       l = new QLabel(_("String for $5"), this);       g->addWidget(l, 4, 0);
        a[5] = new QLineEdit(this);                                     g->addWidget(a[5], 5, 0);
-       l = new QLabel(tr("String for $6"), this);      g->addWidget(l, 4, 1);
+       l = new QLabel(_("String for $6"), this);       g->addWidget(l, 4, 1);
        a[6] = new QLineEdit(this);                                     g->addWidget(a[6], 5, 1);
-       l = new QLabel(tr("String for $7"), this);      g->addWidget(l, 6, 0);
+       l = new QLabel(_("String for $7"), this);       g->addWidget(l, 6, 0);
        a[7] = new QLineEdit(this);                                     g->addWidget(a[7], 7, 0);
-       l = new QLabel(tr("String for $8"), this);      g->addWidget(l, 6, 1);
+       l = new QLabel(_("String for $8"), this);       g->addWidget(l, 6, 1);
        a[8] = new QLineEdit(this);                                     g->addWidget(a[8], 7, 1);
-       l = new QLabel(tr("String for $9"), this);      g->addWidget(l, 8, 0);
+       l = new QLabel(_("String for $9"), this);       g->addWidget(l, 8, 0);
        a[9] = new QLineEdit(this);                                     g->addWidget(a[9], 9, 0);
-       l = new QLabel(tr("String for $0"), this);      g->addWidget(l, 8, 1);
+       l = new QLabel(_("String for $0"), this);       g->addWidget(l, 8, 1);
        a[0] = new QLineEdit(this);                                     g->addWidget(a[0], 9, 1);
 
        h = new QHBoxLayout();  h->addStretch(1);       v->addLayout(h);
-       b = new QPushButton(tr("Cancel"), this);        h->addWidget(b);
+       b = new QPushButton(_("Cancel"), this); h->addWidget(b);
        connect(b, SIGNAL(clicked()),this, SLOT(reject()));
-       b = new QPushButton(tr("OK"), this);            h->addWidget(b);
+       b = new QPushButton(_("OK"), this);             h->addWidget(b);
        connect(b, SIGNAL(clicked()),this, SLOT(putArguments()));
        b->setDefault(true);
 }
@@ -84,6 +84,6 @@ void ArgsDialog::putArguments()
                str[j] = 0;
                parser.AddParam(i, str);
        }
-       accept();
+       delete []str;   accept();
 }
 //-----------------------------------------------------------------------------
index 37307cce038946dae8c135b07b34d64abf9224cd..b891668931ec92784ae5c588b193e3cc639f2b40 100644 (file)
@@ -50,8 +50,8 @@ CalcDialog::CalcDialog(QWidget *parent) : QWidget(parent)
        connect(text,SIGNAL(textChanged(QString)),this,SLOT(evaluate()));
        connect(text,SIGNAL(returnPressed()),this,SLOT(addResult()));
        hist = new QStandardItemModel(this);
-//     it = new QStandardItem(tr("Formula"));  hist->setHorizontalHeaderItem(0,it);
-//     it = new QStandardItem(tr("Result"));   hist->setHorizontalHeaderItem(1,it);
+//     it = new QStandardItem(_("Formula"));   hist->setHorizontalHeaderItem(0,it);
+//     it = new QStandardItem(_("Result"));    hist->setHorizontalHeaderItem(1,it);
        prev = new QListView(this);     o->addWidget(prev);
        connect(prev,SIGNAL(clicked(QModelIndex)),this,SLOT(putText(QModelIndex)));
        QFont f(font());        f.setPointSize(f.pointSize()*0.75);
@@ -60,12 +60,12 @@ CalcDialog::CalcDialog(QWidget *parent) : QWidget(parent)
 
 
        o = new QVBoxLayout;            m->addLayout(o);
-       QLabel *l = new QLabel(tr("Result"),this);      o->addWidget(l);
+       QLabel *l = new QLabel(_("Result"),this);       o->addWidget(l);
        result=new QLineEdit(this);     result->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
        result->setReadOnly(true);      o->addWidget(result);
-       b = new QPushButton(tr("To script"), this);     o->addWidget(b);
+       b = new QPushButton(_("To script"), this);      o->addWidget(b);
        connect(b, SIGNAL(clicked()), this, SLOT(keyPut()));
-       b = new QPushButton(tr("Clear"), this); o->addWidget(b);
+       b = new QPushButton(_("Clear"), this);  o->addWidget(b);
        connect(b, SIGNAL(clicked()), this, SLOT(clear()));
 
        QGridLayout *g = new QGridLayout;       m->addLayout(g);        m->setStretchFactor(g,0);
@@ -124,7 +124,7 @@ CalcDialog::CalcDialog(QWidget *parent) : QWidget(parent)
        descr->setText(funcInfo[0].at(0));
        connect(type, SIGNAL(currentIndexChanged(int)), this, SLOT(typeUpdate(int)));
        connect(func, SIGNAL(currentIndexChanged(int)), this, SLOT(funcUpdate(int)));
-       b = new QPushButton(tr("Put function"), this);  o->addWidget(b);
+       b = new QPushButton(_("Put function"), this);   o->addWidget(b);
        connect(b, SIGNAL(clicked()), this, SLOT(keyFnc()));
 }
 //-----------------------------------------------------------------------------
@@ -189,9 +189,9 @@ void CalcDialog::evaluate()
 //-----------------------------------------------------------------------------
 void CalcDialog::fillFuncName()
 {
-       names<<tr("Basic")<<tr("Exp and log")<<tr("Trigonometric")<<tr("Hyperbolic")
-                       <<tr("Bessel")<<tr("Elliptic")<<tr("Jacobi")<<tr("Airy and Gamma")
-                       <<tr("Exp-integrals")<<tr("Special");
+       names<<_("Basic")<<_("Exp and log")<<_("Trigonometric")<<_("Hyperbolic")
+                       <<_("Bessel")<<_("Elliptic")<<_("Jacobi")<<_("Airy and Gamma")
+                       <<_("Exp-integrals")<<_("Special");
        // basic
        funcName[0]<<"abs()"<<"sign()"<<"step()"<<"sqrt()"<<"mod(,)"<<"arg(,)";
        funcInfo[0]<<"Absolute value"<<"Sign of number"<<"Step function"
@@ -251,7 +251,7 @@ void CalcDialog::fillFuncName()
 //-----------------------------------------------------------------------------
 void CalcDialog::typeUpdate(int s)
 {
-       if(s<0 && s>9)  return;
+       if(s<0 || s>9)  return;
        func->clear();  func->addItems(funcName[s]);    func->setCurrentIndex(0);
 }
 //-----------------------------------------------------------------------------
index 950886a53d43b17dc58a1827ec983b4db6a66fd9..385619053c885a14d07eb66c0a3c1544ab2a5c5a 100644 (file)
@@ -40,6 +40,7 @@
 #include "dat_pnl.h"
 #include "info_dlg.h"
 #include "xpm/table.xpm"
+#undef sprintf // fix libintl bug of defining sprintf
 //-----------------------------------------------------------------------------
 extern mglParse parser;
 void updateDataItems();
@@ -62,7 +63,7 @@ DatPanel::DatPanel(InfoDialog *inf, QWidget *parent) : QWidget(parent)
        ready = false;  infoDlg = inf;
        QBoxLayout *v,*h,*m;
 
-       menu = new QMenu(tr("Data"),this);
+       menu = new QMenu(_("Data"),this);
        v = new QVBoxLayout(this);
        h = new QHBoxLayout();  v->addLayout(h);        toolTop(h);
        h = new QHBoxLayout();  v->addLayout(h);
@@ -145,11 +146,11 @@ void DatPanel::setVar(mglDataA *v)
        nx = ny = nz = kz = 0;
        if(v)
        {
-               QString s = QString::fromStdWString(v->s);
+               QString s = QString::fromWCharArray(v->s.c_str());
                v->o = this;    v->func = deleteDat;
                refresh();
-               setWindowTitle(s + tr(" - UDAV variable"));
-               infoDlg->setWindowTitle(s + tr(" - UDAV preview"));
+               setWindowTitle(s + _(" - UDAV variable"));
+               infoDlg->setWindowTitle(s + _(" - UDAV preview"));
        }
        else
        {       tab->setColumnCount(0); tab->setRowCount(0);    emit nzChanged(nz);     }
@@ -158,7 +159,8 @@ void DatPanel::setVar(mglDataA *v)
 //-----------------------------------------------------------------------------
 void DatPanel::setSlice(int k)
 {
-       if(k>=nz)       k=nz-1; if(k<0) k=0;
+       if(k>=nz)       k=nz-1;
+       if(k<0) k=0;
        if(k!=kz)
        {
                infoDlg->setSlice(k);
@@ -211,8 +213,8 @@ void DatPanel::putValue(int r, int c)
        if(s=="nan")    f=NAN;
        else if(s=="inf")       f=INFINITY;
        else if(s=="-inf")      f=-INFINITY;
-       else    g = mgl_str2dual(s.toStdString().c_str());      //f = s.toDouble();
-       f = real(g);
+       else
+       {       g = mgl_str2dual(s.toLocal8Bit().constData());  f = real(g);    }
        mglDataC *cc = dynamic_cast<mglDataC*>(var);
        if(cc)
        {
@@ -243,56 +245,55 @@ void DatPanel::putValue(int r, int c)
 //-----------------------------------------------------------------------------
 void DatPanel::save()
 {
-       QString fn = QFileDialog::getSaveFileName(this, tr("UDAV - Save/export data"), "",
-                               tr("Data files (*.dat)\nHDF5 files (*.h5 *.hdf)\nPNG files (*.png)\nAll files (*.*)"));
+       QString fn = QFileDialog::getSaveFileName(this, _("UDAV - Save/export data"), "",
+                               _("Data files (*.dat)\nHDF5 files (*.h5 *.hdf)\nPNG files (*.png)\nAll files (*.*)"));
        if(fn.isEmpty())        return;
        QString ext = fn.section(".",-1);
        if(ext=="png")
        {
                bool ok;
-               QString s = QInputDialog::getText(this, tr("UDAV - Export to PNG"), tr("Enter color scheme for picture"), QLineEdit::Normal, MGL_DEF_SCH, &ok);
-               if(ok)  var->Export(fn.toStdString().c_str(), s.toStdString().c_str());
+               QString s = QInputDialog::getText(this, _("UDAV - Export to PNG"), _("Enter color scheme"), QLineEdit::Normal, MGL_DEF_SCH, &ok);
+               if(ok)  var->Export(fn.toLocal8Bit().constData(), s.toLocal8Bit().constData());
        }
        else if(ext=="h5" || ext=="hdf")
        {
                bool ok;
-               QString s = QInputDialog::getText(this, tr("UDAV - Save to HDF"), tr("Enter data name"), QLineEdit::Normal, QString::fromStdWString(var->s), &ok);
-               if(ok)  var->SaveHDF(fn.toStdString().c_str(), s.toStdString().c_str());
+               QString s = QInputDialog::getText(this, _("UDAV - Save to HDF"), _("Enter data name"), QLineEdit::Normal, QString::fromWCharArray(var->s.c_str()), &ok);
+               if(ok)  var->SaveHDF(fn.toLocal8Bit().constData(), s.toLocal8Bit().constData());
        }
-       else    var->Save(fn.toStdString().c_str());
+       else    var->Save(fn.toLocal8Bit().constData());
 }
 //-----------------------------------------------------------------------------
 void DatPanel::load()
 {
        mglData *d = dynamic_cast<mglData *>(var);      if(!d)  return;
-       QString fn = QFileDialog::getOpenFileName(this, tr("UDAV - Load data"), "",
-                               tr("Data files (*.dat)\nHDF5 files (*.h5 *.hdf)\nPNG files (*.png)\nAll files (*.*)"));
+       QString fn = QFileDialog::getOpenFileName(this, _("UDAV - Load data"), "",
+                               _("Data files (*.dat)\nHDF5 files (*.h5 *.hdf)\nPNG files (*.png)\nAll files (*.*)"));
        if(fn.isEmpty())        return;
        QString ext = fn.section(".",-1);
        if(ext=="png")
        {
                bool ok;
-               QString s = QInputDialog::getText(this, tr("UDAV - Import PNG"), tr("Enter color scheme for picture"), QLineEdit::Normal, MGL_DEF_SCH, &ok);
-               if(ok)  d->Import(fn.toStdString().c_str(), s.toStdString().c_str());
+               QString s = QInputDialog::getText(this, _("UDAV - Import PNG"), _("Enter color scheme"), QLineEdit::Normal, MGL_DEF_SCH, &ok);
+               if(ok)  d->Import(fn.toLocal8Bit().constData(), s.toLocal8Bit().constData());
        }
        else if(ext=="h5" || ext=="hdf")
        {
                bool ok;
-               QString s = QInputDialog::getText(this, tr("UDAV - Read from HDF"), tr("Enter data name"), QLineEdit::Normal, QString::fromStdWString(var->s), &ok);
-               if(ok)  d->ReadHDF(fn.toStdString().c_str(), s.toStdString().c_str());
+               QString s = QInputDialog::getText(this, _("UDAV - Read from HDF"), _("Enter data name"), QLineEdit::Normal, QString::fromWCharArray(var->s.c_str()), &ok);
+               if(ok)  d->ReadHDF(fn.toLocal8Bit().constData(), s.toLocal8Bit().constData());
        }
-       else    d->Read(fn.toStdString().c_str());
+       else    d->Read(fn.toLocal8Bit().constData());
        refresh();
 }
 //-----------------------------------------------------------------------------
 void DatPanel::copy()
 {
        QTableWidgetSelectionRange ts = tab->selectedRanges().first();
-       register long i,j;
        QString res, s;
-       for(j=ts.topRow();j<=ts.bottomRow();j++)
+       for(long j=ts.topRow();j<=ts.bottomRow();j++)
        {
-               for(i=ts.leftColumn();i<=ts.rightColumn();i++)
+               for(long i=ts.leftColumn();i<=ts.rightColumn();i++)
                {
                        res = res + tab->item(j,i)->text();
                        if(i<ts.rightColumn())  res = res + "\t";
@@ -329,14 +330,13 @@ void DatPanel::plot()     // TODO: plot dialog
 void DatPanel::list()  // TODO: in which script insert ???
 {
 /*     if(nx*ny+ny > 1020)
-       {       QMessageBox::warning(this, tr("UDAV - To list conversion"), tr("Too many numbers (>1000) on slice"), QMessageBox::Ok, 0, 0);    return; }
+       {       QMessageBox::warning(this, _("UDAV - To list conversion"), _("Too many numbers (>1000) on slice"), QMessageBox::Ok, 0, 0);      return; }
        if(nz > 1)
-               QMessageBox::information(this, tr("UDAV - To list conversion"), tr("Only current slice will be inserted"), QMessageBox::Ok, 0, 0);
+               QMessageBox::information(this, _("UDAV - To list conversion"), _("Only current slice will be inserted"), QMessageBox::Ok, 0, 0);
        QString res = "list\t", s;
-       register long i,j;
-       for(j=0;j<ny;j++)
+       for(long j=0;j<ny;j++)
        {
-               for(i=0;i<nx;i++)
+       for(long i=0;i<nx;i++)
                {
                        s.sprintf("%g\t",d->a[i+nx*(j+kz*ny)]);
                        res += s;
@@ -348,7 +348,7 @@ void DatPanel::list()       // TODO: in which script insert ???
 void DatPanel::inrange()
 {
        QString v1("-1"), v2("1"), dir("x");
-       if(sizesDialog(tr("UDAV - Fill data"), tr("Enter range for data and direction of filling"), tr("From"), tr("To"), tr("Direction"), v1, v2, dir))
+       if(sizesDialog(_("UDAV - Fill data"), _("Enter range for data and direction of filling"), _("From"), _("To"), _("Direction"), v1, v2, dir))
        {
                mglData *d = dynamic_cast<mglData *>(var);
                if(d)   d->Fill(v1.toDouble(), v2.toDouble(), dir[0].toLatin1());
@@ -363,7 +363,7 @@ void DatPanel::inrange()
 void DatPanel::norm()
 {
        QString v1("0"), v2("1"), how;
-       if(sizesDialog(tr("UDAV - Normalize data"), tr("Enter range for final data"), tr("From"), tr("To"), tr("Symmetrical?"), v1, v2, how))
+       if(sizesDialog(_("UDAV - Normalize data"), _("Enter range for final data"), _("From"), _("To"), _("Symmetrical?"), v1, v2, how))
        {
                mglData *d = dynamic_cast<mglData *>(var);
                if(d)   d->Norm(v1.toDouble(), v2.toDouble(), (how=="on" || how.contains('s')));
@@ -374,7 +374,7 @@ void DatPanel::norm()
 void DatPanel::normsl()
 {
        QString v1("0"), v2("1"), dir("z");
-       if(sizesDialog(tr("UDAV - Normalize by slice"), tr("Enter range for final data"), tr("From"), tr("To"), tr("Direction"), v1, v2, dir))
+       if(sizesDialog(_("UDAV - Normalize by slice"), _("Enter range for final data"), _("From"), _("To"), _("Direction"), v1, v2, dir))
        {
                mglData *d = dynamic_cast<mglData *>(var);
                if(d)   d->NormSl(v1.toDouble(), v2.toDouble(), dir[0].toLatin1());
@@ -385,7 +385,7 @@ void DatPanel::normsl()
 void DatPanel::create()
 {
        QString mx, my("1"), mz("1");
-       if(sizesDialog(tr("UDAV - Clear data"), tr("Enter new data sizes"), tr("X-size"), tr("Y-size"), tr("Z-size"), mx, my, mz))
+       if(sizesDialog(_("UDAV - Clear data"), _("Enter new data sizes"), _("X-size"), _("Y-size"), _("Z-size"), mx, my, mz))
        {
                mglData *d = dynamic_cast<mglData *>(var);
                if(d)   d->Create(mx.toInt(), my.toInt(), mz.toInt());
@@ -399,7 +399,7 @@ void DatPanel::reSize()
 {
        QString mx, my, mz;
        mx.sprintf("%d",nx);    my.sprintf("%d",ny);    mz.sprintf("%d",nz);
-       if(sizesDialog(tr("UDAV - Resize data"), tr("Enter new data sizes"), tr("X-size"), tr("Y-size"), tr("Z-size"), mx, my, mz))
+       if(sizesDialog(_("UDAV - Resize data"), _("Enter new data sizes"), _("X-size"), _("Y-size"), _("Z-size"), mx, my, mz))
        {
                mglData *d = dynamic_cast<mglData *>(var);
                if(d)   d->Set(d->Resize(mx.toInt(), my.toInt(), mz.toInt()));
@@ -410,7 +410,7 @@ void DatPanel::reSize()
 void DatPanel::squize()
 {
        QString mx("1"), my("1"), mz("1");
-       if(sizesDialog(tr("UDAV - Squeeze data"), tr("Enter step of saved points. For example, '1' save all, '2' save each 2nd point, '3' save each 3d and so on."), tr("X-direction"), tr("Y-direction"), tr("Z-direction"), mx, my, mz))
+       if(sizesDialog(_("UDAV - Squeeze data"), _("Enter step of saved points. For example, '1' save all, '2' save each 2nd point, '3' save each 3d and so on."), _("X-direction"), _("Y-direction"), _("Z-direction"), mx, my, mz))
        {
                mglData *d = dynamic_cast<mglData *>(var);
                if(d)   d->Squeeze(mx.toInt(), my.toInt(), mz.toInt());
@@ -421,7 +421,7 @@ void DatPanel::squize()
 void DatPanel::crop()
 {
        QString n1("1"), n2("1"), dir;
-       if(sizesDialog(tr("UDAV - Crop data"), tr("Enter range of saved date."), tr("From"), tr("To"), tr("Direction"), n1, n2, dir))
+       if(sizesDialog(_("UDAV - Crop data"), _("Enter range of saved date."), _("From"), _("To"), _("Direction"), n1, n2, dir))
        {
                mglData *d = dynamic_cast<mglData *>(var);
                if(d)   d->Squeeze(n1.toInt(), n2.toInt(), dir[0].toLatin1());
@@ -433,7 +433,7 @@ void DatPanel::rearrange()
 {
        QString mx, my, mz;
        mx.sprintf("%d",nx);    my.sprintf("%d",ny);    mz.sprintf("%d",nz);
-       if(sizesDialog(tr("UDAV - Rearrange data"), tr("Enter new data sizes"), tr("X-size"), tr("Y-size"), tr("Z-size"), mx, my, mz))
+       if(sizesDialog(_("UDAV - Rearrange data"), _("Enter new data sizes"), _("X-size"), _("Y-size"), _("Z-size"), mx, my, mz))
        {
                mglData *d = dynamic_cast<mglData *>(var);
                if(d)   d->Rearrange(mx.toInt(), my.toInt(), mz.toInt());
@@ -447,25 +447,25 @@ void DatPanel::hist()
        QLineEdit *id, *v1, *v2;
        QSpinBox *nm;
        QPushButton *b;
-       QDialog *d = new QDialog(this); d->setWindowTitle(tr("UDAV - Make histogram"));
+       QDialog *d = new QDialog(this); d->setWindowTitle(_("UDAV - Make histogram"));
        QGridLayout *g = new QGridLayout(d);
-       l = new QLabel(tr("From"), d);  g->addWidget(l,0,0);
-       l = new QLabel(tr("To"), d);    g->addWidget(l,0,1);
+       l = new QLabel(_("From"), d);   g->addWidget(l,0,0);
+       l = new QLabel(_("To"), d);     g->addWidget(l,0,1);
        v1 = new QLineEdit(d);  g->addWidget(v1,1,0);
        v2 = new QLineEdit(d);  g->addWidget(v2,1,1);
-       l = new QLabel(tr("Number of points"), d);      g->addWidget(l,2,0);
-       l = new QLabel(tr("Put in variable"), d);       g->addWidget(l,2,1);
+       l = new QLabel(_("Number of points"), d);       g->addWidget(l,2,0);
+       l = new QLabel(_("Put in variable"), d);        g->addWidget(l,2,1);
        nm = new QSpinBox(d);   nm->setRange(2,8192);   g->addWidget(nm,3,0);
        id = new QLineEdit(d);  nm->setSingleStep(10);  g->addWidget(id,3,1);
-       b = new QPushButton(tr("Cancel"), d);   g->addWidget(b,4,0);
+       b = new QPushButton(_("Cancel"), d);    g->addWidget(b,4,0);
        connect(b, SIGNAL(clicked()), d, SLOT(reject()));
-       b = new QPushButton(tr("OK"), d);               g->addWidget(b,4,1);
+       b = new QPushButton(_("OK"), d);                g->addWidget(b,4,1);
        connect(b, SIGNAL(clicked()), d, SLOT(accept()));       b->setDefault(true);
        // now execute dialog and get values
        bool res = d->exec();
        if(res && !v1->text().isEmpty() && !v2->text().isEmpty() && !id->text().isEmpty())
        {
-               mglData *vv = dynamic_cast<mglData*>(parser.AddVar(id->text().toStdString().c_str()));
+               mglData *vv = dynamic_cast<mglData*>(parser.AddVar(id->text().toLocal8Bit().constData()));
                if(vv)  vv->Set(mgl_data_hist(var, nm->value(), v1->text().toDouble(), v2->text().toDouble(),0));
                updateDataItems();
        }
@@ -482,7 +482,7 @@ void DatPanel::prev()       {       setSlice(kz-1); }
 void DatPanel::gosl()
 {
        bool ok;
-       QString s = QInputDialog::getText(this, tr("UDAV - Go to slice"), tr("Enter slice id:"), QLineEdit::Normal, "0", &ok);
+       QString s = QInputDialog::getText(this, _("UDAV - Go to slice"), _("Enter slice id:"), QLineEdit::Normal, "0", &ok);
        if(ok)  setSlice(s.toInt());
 }
 //-----------------------------------------------------------------------------
@@ -497,7 +497,7 @@ bool DatPanel::sizesDialog(const QString &cap, const QString &lab, const QString
        d->setWindowTitle(cap);
        QVBoxLayout *v = new QVBoxLayout(d);
        l = new QLabel(lab, d); v->addWidget(l);
-       l = new QLabel(tr("NOTE: All fields must be filled!"), d);      v->addWidget(l);
+       l = new QLabel(_("NOTE: All fields must be filled!"), d);       v->addWidget(l);
        QGridLayout *g = new QGridLayout();     v->addLayout(g);
        l = new QLabel(desc1, d);               g->addWidget(l, 0, 0);
        l = new QLabel(desc2, d);               g->addWidget(l, 0, 1);
@@ -507,9 +507,9 @@ bool DatPanel::sizesDialog(const QString &cap, const QString &lab, const QString
        f3 = new QLineEdit(val3, d);    g->addWidget(f3, 1, 2);
        QHBoxLayout *h = new QHBoxLayout();     v->addLayout(h);
        h->addStretch(1);
-       b = new QPushButton(tr("Cancel"), d);   h->addWidget(b);
+       b = new QPushButton(_("Cancel"), d);    h->addWidget(b);
        connect(b, SIGNAL(clicked()), d, SLOT(reject()));
-       b = new QPushButton(tr("OK"), d);               h->addWidget(b);
+       b = new QPushButton(_("OK"), d);                h->addWidget(b);
        connect(b, SIGNAL(clicked()), d, SLOT(accept()));
        b->setDefault(true);
        // now execute dialog and get values
@@ -533,44 +533,44 @@ void DatPanel::newdat()
        QLineEdit *f1, *f2;
        QPushButton *b;
        QDialog *d = new QDialog(this);
-       d->setWindowTitle(tr("UDAV - make new data"));
+       d->setWindowTitle(_("UDAV - make new data"));
        QVBoxLayout *v = new QVBoxLayout(d);
        QComboBox *c = new QComboBox(d);        v->addWidget(c);
-       c->addItem(tr("Sum along direction(s)"));
-       c->addItem(tr("Min along direction(s)"));
-       c->addItem(tr("Max along direction(s)"));
-       c->addItem(tr("Momentum along 'x' for function"));
-       c->addItem(tr("Momentum along 'y' for function"));
-       c->addItem(tr("Momentum along 'z' for function"));
+       c->addItem(_("Sum along direction(s)"));
+       c->addItem(_("Min along direction(s)"));
+       c->addItem(_("Max along direction(s)"));
+       c->addItem(_("Momentum along 'x' for function"));
+       c->addItem(_("Momentum along 'y' for function"));
+       c->addItem(_("Momentum along 'z' for function"));
        c->setCurrentIndex(0);
 
        f1 = new QLineEdit("z",d);      v->addWidget(f1);
-       QCheckBox *cb = new QCheckBox(tr("Put into this data array"), d);       v->addWidget(cb);
-       l = new QLabel(tr("or enter name for new variable"), d);        v->addWidget(l);
+       QCheckBox *cb = new QCheckBox(_("Put into this data array"), d);        v->addWidget(cb);
+       l = new QLabel(_("or enter name for new variable"), d); v->addWidget(l);
        f2 = new QLineEdit(d);          v->addWidget(f2);
        QHBoxLayout *h = new QHBoxLayout();     v->addLayout(h);        h->addStretch(1);
-       b = new QPushButton(tr("Cancel"), d);   h->addWidget(b);
+       b = new QPushButton(_("Cancel"), d);    h->addWidget(b);
        connect(b, SIGNAL(clicked()), d, SLOT(reject()));
-       b = new QPushButton(tr("OK"), d);               h->addWidget(b);
+       b = new QPushButton(_("OK"), d);                h->addWidget(b);
        connect(b, SIGNAL(clicked()), d, SLOT(accept()));
        b->setDefault(true);
        // now execute dialog and get values
        bool res = d->exec();
        QString         val = f1->text(), mgl;
        int k = c->currentIndex();
-       QString self = QString::fromStdWString(var->s);
+       QString self = QString::fromWCharArray(var->s.c_str());
        if(res)
        {
                if(k<0)
                {
-                       QMessageBox::warning(d, tr("UDAV - make new data"),
-                               tr("No action is selected. Do nothing."));
+                       QMessageBox::warning(d, _("UDAV - make new data"),
+                               _("No action is selected. Do nothing."));
                        return;
                }
                if(val.isEmpty())
                {
-                       QMessageBox::warning(d, tr("UDAV - make new data"),
-                               tr("No direction/formula is entered. Do nothing."));
+                       QMessageBox::warning(d, _("UDAV - make new data"),
+                               _("No direction/formula is entered. Do nothing."));
                        return;
                }
                if(cb->isChecked())     k += 6;
@@ -594,7 +594,7 @@ void DatPanel::newdat()
        if(!mgl.isEmpty())
        {
                mglGraph gr;
-               parser.Execute(&gr,mgl.toStdString().c_str());
+               parser.Execute(&gr,mgl.toLocal8Bit().constData());
                if(k>=6)        opers += mgl+"\n";
                updateDataItems();
        }
@@ -605,43 +605,43 @@ void DatPanel::oper()
        QLineEdit *f1;
        QPushButton *b;
        QDialog *d = new QDialog(this);
-       d->setWindowTitle(tr("UDAV - change data"));
+       d->setWindowTitle(_("UDAV - change data"));
        QVBoxLayout *v = new QVBoxLayout(d);
        QComboBox *c = new QComboBox(d);        v->addWidget(c);
-       c->addItem(tr("Fill data by formula"));
-       c->addItem(tr("Transpose data with new dimensions"));
-       c->addItem(tr("Smooth data along direction(s)"));
-       c->addItem(tr("Summarize data along direction(s)"));
-       c->addItem(tr("Integrate data along direction(s)"));
-       c->addItem(tr("Differentiate data along direction(s)"));
-       c->addItem(tr("Laplace transform along direction(s)"));
-       c->addItem(tr("Swap data along direction(s)"));
-       c->addItem(tr("Mirror data along direction(s)"));
-       c->addItem(tr("Sin-Fourier transform along direction(s)"));
-       c->addItem(tr("Cos-Fourier transform along direction(s)"));
-       c->addItem(tr("Hankel transform along direction(s)"));
-       c->addItem(tr("Sew data along direction(s)"));
-       c->addItem(tr("Find envelope along direction(s)"));
+       c->addItem(_("Fill data by formula"));
+       c->addItem(_("Transpose data with new dimensions"));
+       c->addItem(_("Smooth data along direction(s)"));
+       c->addItem(_("Summarize data along direction(s)"));
+       c->addItem(_("Integrate data along direction(s)"));
+       c->addItem(_("Differentiate data along direction(s)"));
+       c->addItem(_("Laplace transform along direction(s)"));
+       c->addItem(_("Swap data along direction(s)"));
+       c->addItem(_("Mirror data along direction(s)"));
+       c->addItem(_("Sin-Fourier transform along direction(s)"));
+       c->addItem(_("Cos-Fourier transform along direction(s)"));
+       c->addItem(_("Hankel transform along direction(s)"));
+       c->addItem(_("Sew data along direction(s)"));
+       c->addItem(_("Find envelope along direction(s)"));
        c->setCurrentIndex(0);
 
        f1 = new QLineEdit("z",d);      v->addWidget(f1);
        QHBoxLayout *h = new QHBoxLayout();     v->addLayout(h);        h->addStretch(1);
-       b = new QPushButton(tr("Cancel"), d);   h->addWidget(b);
+       b = new QPushButton(_("Cancel"), d);    h->addWidget(b);
        connect(b, SIGNAL(clicked()), d, SLOT(reject()));
-       b = new QPushButton(tr("OK"), d);               h->addWidget(b);
+       b = new QPushButton(_("OK"), d);                h->addWidget(b);
        connect(b, SIGNAL(clicked()), d, SLOT(accept()));
        b->setDefault(true);
        // now execute dialog and get values
        bool res = d->exec();
        QString         val = f1->text(), mgl;
        int k = c->currentIndex();
-       QString self = QString::fromStdWString(var->s);
+       QString self = QString::fromWCharArray(var->s.c_str());
        if(res)
        {
                if(k<0)
                {
-                       QMessageBox::warning(d, tr("UDAV - make new data"),
-                               tr("No action is selected. Do nothing."));
+                       QMessageBox::warning(d, _("UDAV - make new data"),
+                               _("No action is selected. Do nothing."));
                        return;
                }
                switch(k)
@@ -665,7 +665,7 @@ void DatPanel::oper()
        if(!mgl.isEmpty())
        {
                mglGraph gr;
-               parser.Execute(&gr,mgl.toStdString().c_str());
+               parser.Execute(&gr,mgl.toLocal8Bit().constData());
                opers += mgl+"\n";
                updateDataItems();
        }
@@ -678,80 +678,80 @@ void DatPanel::toolTop(QBoxLayout *l)
        QToolButton *bb;
 
        // file menu
-       o = menu->addMenu(tr("File"));
-       a = new QAction(QPixmap(":/png/document-open.png"), tr("Load data"), this);
+       o = menu->addMenu(_("File"));
+       a = new QAction(QPixmap(":/png/document-open.png"), _("Load data"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(load()));
-       a->setToolTip(tr("Load data from file. Data will be deleted only\nat exit but UDAV will not ask to save it (Ctrl+Shift+O)."));
+       a->setToolTip(_("Load data from file. Data will be deleted only\nat exit but UDAV will not ask to save it (Ctrl+Shift+O)."));
        a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_O);   o->addAction(a);
        bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
 
-       a = new QAction(QPixmap(":/png/document-save.png"), tr("Save data"), this);
+       a = new QAction(QPixmap(":/png/document-save.png"), _("Save data"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(save()));
-       a->setToolTip(tr("Save data to a file (Ctrl+Shift+S)."));
+       a->setToolTip(_("Save data to a file (Ctrl+Shift+S)."));
        a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_S);   o->addAction(a);
        bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
 
 //     o->addSeparator();      bb->addSeparator();
-//     a = new QAction(QPixmap(insert_xpm), tr("Insert as list"), this);
+//     a = new QAction(QPixmap(insert_xpm), _("Insert as list"), this);
 //     connect(a, SIGNAL(triggered()), this, SLOT(list()));
 //     o->addAction(a);
 //     bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
 
 
-       a = new QAction(QPixmap(":/png/office-chart-line.png"), tr("Plot data"), this);
+       a = new QAction(QPixmap(":/png/office-chart-line.png"), _("Plot data"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(plot()));
-       a->setToolTip(tr("Plot data in new script window. You may select the kind\nof plot, its style and so on."));
+       a->setToolTip(_("Plot data in new script window. You may select the kind\nof plot, its style and so on."));
        o->addAction(a);
        bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
 
-       a = new QAction(QPixmap(":/png/edit-copy.png"), tr("Copy data"), this);
+       a = new QAction(QPixmap(":/png/edit-copy.png"), _("Copy data"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(copy()));
-       a->setToolTip(tr("Copy range of numbers to clipboard (Ctrl+Shift+C)."));
+       a->setToolTip(_("Copy range of numbers to clipboard (Ctrl+Shift+C)."));
        a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_C);   o->addAction(a);
        bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
 
-       a = new QAction(QPixmap(":/png/edit-paste.png"), tr("Paste data"), this);
+       a = new QAction(QPixmap(":/png/edit-paste.png"), _("Paste data"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(copy()));
-       a->setToolTip(tr("Paste range of numbers from clipboard (Ctrl+Shift+P)."));
+       a->setToolTip(_("Paste range of numbers from clipboard (Ctrl+Shift+P)."));
        a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_V);   o->addAction(a);
        bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
 
        // navigation menu
-       o = menu->addMenu(tr("Navigate"));
-       a = new QAction(QPixmap(":/png/go-first.png"), tr("First slice"), this);
+       o = menu->addMenu(_("Navigation"));
+       a = new QAction(QPixmap(":/png/go-first.png"), _("First slice"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(first()));
-       a->setToolTip(tr("Go to the first data slice for 3D data."));
-       o->addAction(a);
+       a->setToolTip(_("Go to first slice for 3D data (Ctrl-F1)."));
+       a->setShortcut(Qt::CTRL+Qt::Key_F1);    o->addAction(a);
        bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
 
-       a = new QAction(QPixmap(":/png/go-previous.png"), tr("Prev. slice"), this);
+       a = new QAction(QPixmap(":/png/go-previous.png"), _("Prev slice"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(prev()));
-       a->setToolTip(tr("Go to the previous data slice for 3D data."));
+       a->setToolTip(_("Go to the previous slice for 3D data."));
        o->addAction(a);
        bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
 
        sb = new QSpinBox(this);
        l->addWidget(sb);       sb->setRange(0,0);
-       sb->setToolTip(tr("Go to the specified data slice for 3D data."));
+       sb->setToolTip(_("Go to the specified slice for 3D data."));
        connect(sb, SIGNAL(valueChanged(int)), this, SLOT(setSlice(int)));
        connect(this, SIGNAL(sliceChanged(int)), sb, SLOT(setValue(int)));
        connect(this, SIGNAL(nzChanged(int)), this, SLOT(setNz(int)));
 
-       a = new QAction(tr("Go to slice"), this);
+       a = new QAction(_("Go to slice"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(gosl()));
-       a->setToolTip(tr("Go to the specified data slice for 3D data."));
+       a->setToolTip(_("Go to the specified slice for 3D data."));
        o->addAction(a);
 
-       a = new QAction(QPixmap(":/png/go-next.png"), tr("Next slice"), this);
+       a = new QAction(QPixmap(":/png/go-next.png"), _("Next slice"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(next()));
-       a->setToolTip(tr("Go to the next data slice for 3D data."));
+       a->setToolTip(_("Go to the next slice for 3D data."));
        o->addAction(a);
        bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
 
-       a = new QAction(QPixmap(":/png/go-last.png"), tr("Last slice"), this);
+       a = new QAction(QPixmap(":/png/go-last.png"), _("Last slice"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(last()));
-       a->setToolTip(tr("Go to the last data slice for 3D data."));
-       o->addAction(a);
+       a->setToolTip(_("Go to last slice for 3D data (Ctrl-F4)."));
+       a->setShortcut(Qt::CTRL+Qt::Key_F4);    o->addAction(a);
        bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
 }
 //-----------------------------------------------------------------------------
@@ -762,79 +762,79 @@ void DatPanel::toolLeft(QBoxLayout *l)
        QToolButton *bb;
 
        // size menu
-       o = menu->addMenu(tr("Sizes"));
-       a = new QAction(QPixmap(":/png/document-new.png"), tr("Create new"), this);
+       o = menu->addMenu(_("Sizes"));
+       a = new QAction(QPixmap(":/png/document-new.png"), _("Create new"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(create()));
-       a->setToolTip(tr("Recreate the data with new sizes and fill it by zeros (Ctrl+Shift+N)."));
+       a->setToolTip(_("Recreate the data with new sizes and fill it by zeros (Ctrl+Shift+N)."));
        a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_N);   o->addAction(a);
        bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
 
-       a = new QAction(QPixmap(size_xpm), tr("Resize"), this);
+       a = new QAction(QPixmap(size_xpm), _("Resize"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(reSize()));
-       a->setToolTip(tr("Resize (interpolate) the data to specified sizes (Ctrl+Shift+R)."));
+       a->setToolTip(_("Resize (interpolate) the data to specified sizes (Ctrl+Shift+R)."));
        a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_R);   o->addAction(a);
        bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
 
-       a = new QAction(QPixmap(squize_xpm), tr("Squeeze"), this);
+       a = new QAction(QPixmap(squize_xpm), _("Squeeze"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(squize()));
-       a->setToolTip(tr("Keep only each n-th element of the data array."));
+       a->setToolTip(_("Keep only each n-th element of the data array."));
        o->addAction(a);
        bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
 
-       a = new QAction(QPixmap(crop_xpm), tr("Cro&p"), this);
+       a = new QAction(QPixmap(crop_xpm), _("Crop"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(crop()));
-       a->setToolTip(tr("Crop the data edges. Useful to cut off the zero-filled area."));
+       a->setToolTip(_("Crop the data edges. Useful to cut off the zero-filled area."));
        o->addAction(a);
        bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
 
-       a = new QAction(QPixmap(oper_of_xpm), tr("Transform"), this);
+       a = new QAction(QPixmap(oper_of_xpm), _("Transform"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(newdat()));
-       a->setToolTip(tr("Transform data along dimension(s) (Ctrl+Shift+T)."));
+       a->setToolTip(_("Transform data along dimension(s) (Ctrl+Shift+T)."));
        a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_T);   o->addAction(a);
        bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
 
-       a = new QAction(QPixmap(oper_dir_xpm), tr("Make new (Ctrl+Shift+M)"), this);
+       a = new QAction(QPixmap(oper_dir_xpm), _("Make new (Ctrl+Shift+M)"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(oper()));
-       a->setToolTip(tr("Make another data."));
+       a->setToolTip(_("Make another data."));
        a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_M);   o->addAction(a);
        bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
 
-       a = new QAction(QPixmap(hist_xpm), tr("Histogram (Ctrl+Shift+H)"), this);
+       a = new QAction(QPixmap(hist_xpm), _("Histogram (Ctrl+Shift+H)"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(hist()));
-       a->setToolTip(tr("Find histogram of data."));
+       a->setToolTip(_("Find histogram of data."));
        a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_H);   o->addAction(a);
        bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
 
-/*     a = new QAction(QPixmap(":/png/view-refresh.png"), tr("Refresh"), this);
+/*     a = new QAction(QPixmap(":/png/view-refresh.png"), _("Refresh"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(refresh()));
-       a->setToolTip(tr("Refresh data values."));
+       a->setToolTip(_("Refresh data values."));
        o->addAction(a);
        bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);*/
 
-/*     a = new QAction(tr("Rearrange"), this); // TODO: move in generalized dialog
+/*     a = new QAction(_("Rearrange"), this);  // TODO: move in generalized dialog
        connect(a, SIGNAL(triggered()), this, SLOT(rearrange()));
-       a->setToolTip(tr("Rearrange data sizes without changing data values."));
+       a->setToolTip(_("Rearrange data sizes without changing data values."));
        o->addAction(a);
-       a = new QAction(tr("Fill in range"), this);
+       a = new QAction(_("Fill in range"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(inrange()));
-       a->setToolTip(tr("Fill data equidistantly from one value to another."));
+       a->setToolTip(_("Fill data equidistantly from one value to another."));
        o->addAction(a);
-       a = new QAction(tr("Normalize"), this);
+       a = new QAction(_("Normalize"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(norm()));
-       a->setToolTip(tr("Normalize data so that its minimal\nand maximal values be in specified range."));
+       a->setToolTip(_("Normalize data so that its minimal\nand maximal values be in specified range."));
        o->addAction(a);
-       a = new QAction(tr("Norm. slices"), this);
+       a = new QAction(_("Norm. slices"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(normsl()));
-       a->setToolTip(tr("Normalize each data slice perpendicular to some direction\nso that its minimal and maximal values be in specified range."));
+       a->setToolTip(_("Normalize each data slice perpendicular to some direction\nso that its minimal and maximal values be in specified range."));
        o->addAction(a);*/
 
        l->addStretch(1);
 
-       a = new QAction(QPixmap(":/png/tab-close.png"), tr("Close tab"), this);
+       a = new QAction(QPixmap(":/png/tab-close.png"), _("Close tab"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(close()));
-       a->setToolTip(tr("Close this data tab."));
+       a->setToolTip(_("Close this data tab."));
        bb = new QToolButton(this);     l->addWidget(bb);       bb->setDefaultAction(a);
 }
 //-----------------------------------------------------------------------------
-QString DatPanel::dataName()   {       return QString::fromStdWString(var->s); }
+QString DatPanel::dataName()   {       return QString::fromWCharArray(var->s.c_str()); }
 //-----------------------------------------------------------------------------
index 3ad3c551599be96f483488de995f68348796a04d..7fcf7a5e2b5e3b17e40bca6eba173c0a4e29ce4c 100644 (file)
@@ -30,7 +30,7 @@ extern mglParse parser;
 //-----------------------------------------------------------------------------
 DataDialog::DataDialog(QWidget* parent): QDialog(parent)
 {
-       setWindowTitle(tr("UDAV - Insert style/scheme"));
+       setWindowTitle(_("UDAV - Insert style/scheme"));
        QHBoxLayout *h;
        QVBoxLayout *v;
        QGridLayout *g;
@@ -39,7 +39,7 @@ DataDialog::DataDialog(QWidget* parent): QDialog(parent)
 
        v = new QVBoxLayout(this);
        h = new QHBoxLayout();  v->addLayout(h);
-       l = new QLabel(tr("Data name"), this);  h->addWidget(l);
+       l = new QLabel(_("Data name"), this);   h->addWidget(l);
        name = new QComboBox(this);     h->addWidget(name);
        
        g = new QGridLayout();  v->addLayout(g);
@@ -62,10 +62,10 @@ DataDialog::DataDialog(QWidget* parent): QDialog(parent)
        x1->setValue(-1);       y1->setValue(-1);       z1->setValue(-1);
        x2->setValue(-1);       y2->setValue(-1);       z2->setValue(-1);
        
-       l = new QLabel(tr("Operation"));        g->addWidget(l, 3, 0);
+       l = new QLabel(_("Operation")); g->addWidget(l, 3, 0);
        oper = new QComboBox(this);             g->addWidget(oper, 3, 1);
-       oper->addItem(tr("none"));              oper->addItem(tr("sum"));
-       oper->addItem(tr("min"));       oper->addItem(tr("max"));
+       oper->addItem(_("none"));               oper->addItem(_("sum"));
+       oper->addItem(_("min"));        oper->addItem(_("max"));
        l = new QLabel("along", this);  g->addWidget(l, 3, 2);
        dirs = new QComboBox(this);             g->addWidget(dirs, 3, 3);
        dirs->addItem("xyz");
@@ -82,14 +82,14 @@ DataDialog::DataDialog(QWidget* parent): QDialog(parent)
        connect(oper, SIGNAL(currentIndexChanged(int)), this, SLOT(updateRes()));
        connect(dirs, SIGNAL(currentIndexChanged(int)), this, SLOT(updateRes()));
 
-       sizes = new QLabel(tr("Result"));       v->addWidget(sizes);
+       sizes = new QLabel(_("Result"));        v->addWidget(sizes);
        res = new QLineEdit(this);              v->addWidget(res);
        connect(res, SIGNAL(textChanged(QString)), this, SLOT(userRes()));
        
        h = new QHBoxLayout();  v->addLayout(h);        h->addStretch(1);
-       b = new QPushButton(tr("Cancel"), this);        h->addWidget(b);
+       b = new QPushButton(_("Cancel"), this); h->addWidget(b);
        connect(b, SIGNAL(clicked()),this, SLOT(reject()));
-       b = new QPushButton(tr("OK"), this);            h->addWidget(b);
+       b = new QPushButton(_("OK"), this);             h->addWidget(b);
        connect(b, SIGNAL(clicked()),this, SLOT(accept()));
        b->setDefault(true);
 }
@@ -121,7 +121,7 @@ void DataDialog::updateRes()
        wchar_t *txt=new wchar_t[result.length()+1];
        result.toWCharArray(txt);       txt[result.length()]=0;
        mglData dat=parser.Calc(txt);   delete []txt;
-       sizes->setText(tr("Result (will have sizes ") + QString::number(dat.nx)+"*"+QString::number(dat.ny)+"*"+QString::number(dat.nz)+")"     );
+       sizes->setText(_("Result (will have sizes ") + QString::number(dat.nx)+"*"+QString::number(dat.ny)+"*"+QString::number(dat.nz)+")"      );
        res->setText(result);
 }
 //-----------------------------------------------------------------------------
@@ -132,7 +132,7 @@ void DataDialog::updateNames()
        for(i=0;i<n;i++)
        {
                const mglDataA *v = parser.GetVar(i);
-               if(v)   name->addItem(QString::fromStdWString(v->s));
+               if(v)   name->addItem(QString::fromWCharArray(v->s.c_str()));
        }
 }
 //-----------------------------------------------------------------------------
@@ -140,6 +140,6 @@ void DataDialog::userRes()
 {
        QString txt = res->text();
        if(txt != result)
-       {       result = txt;   sizes->setText(tr("Result"));   }
+       {       result = txt;   sizes->setText(_("Result"));    }
 }
 //-----------------------------------------------------------------------------
index 048da957aac0a6aefd19ec0d2c8028f75b2288fb..ffed0882f5da176090e51b54f70ef45488ff367a 100644 (file)
@@ -45,8 +45,8 @@ private slots:
        void userRes();
 private:
        QString result;
-       QComboBox *name, *suffix, *oper, *dirs;
-       QLineEdit *res, *func;
+       QComboBox *name, *oper, *dirs;
+       QLineEdit *res;
        QSpinBox  *x1, *y1, *z1, *x2, *y2, *z2;
        QLabel *sizes;
 };
index 9be25ee5c5ac3f18dc1586985bd565cd53c46526..8b82ae16e5b0a382fb4efa6a2218b9529e24caec 100644 (file)
 #include <QLineEdit>
 #include <QPushButton>
 #include "files_dlg.h"
+#include "mgl2/define.h"
 //-----------------------------------------------------------------------------
 FilesDialog::FilesDialog(QWidget *parent) : QDialog(parent)
 {
-       setWindowTitle(tr("UDAV - Set template parameters"));
+       setWindowTitle(_("UDAV - Set template parameters"));
        QHBoxLayout *h;
        QVBoxLayout *v;
        QGridLayout *g;
@@ -34,31 +35,31 @@ FilesDialog::FilesDialog(QWidget *parent) : QDialog(parent)
 
        v = new QVBoxLayout(this);
        g = new QGridLayout();          v->addLayout(g);
-       l = new QLabel(tr("String for %1"), this);      g->addWidget(l, 0, 0);
+       l = new QLabel(_("String for %1"), this);       g->addWidget(l, 0, 0);
        a[0] = new QLineEdit(this);                                     g->addWidget(a[0], 1, 0);
-       l = new QLabel(tr("String for %2"), this);      g->addWidget(l, 0, 1);
+       l = new QLabel(_("String for %2"), this);       g->addWidget(l, 0, 1);
        a[1] = new QLineEdit(this);                                     g->addWidget(a[1], 1, 1);
-       l = new QLabel(tr("String for %3"), this);      g->addWidget(l, 2, 0);
+       l = new QLabel(_("String for %3"), this);       g->addWidget(l, 2, 0);
        a[2] = new QLineEdit(this);                                     g->addWidget(a[2], 3, 0);
-       l = new QLabel(tr("String for %4"), this);      g->addWidget(l, 2, 1);
+       l = new QLabel(_("String for %4"), this);       g->addWidget(l, 2, 1);
        a[3] = new QLineEdit(this);                                     g->addWidget(a[3], 3, 1);
-       l = new QLabel(tr("String for %5"), this);      g->addWidget(l, 4, 0);
+       l = new QLabel(_("String for %5"), this);       g->addWidget(l, 4, 0);
        a[4] = new QLineEdit(this);                                     g->addWidget(a[4], 5, 0);
-       l = new QLabel(tr("String for %6"), this);      g->addWidget(l, 4, 1);
+       l = new QLabel(_("String for %6"), this);       g->addWidget(l, 4, 1);
        a[5] = new QLineEdit(this);                                     g->addWidget(a[5], 5, 1);
-       l = new QLabel(tr("String for %7"), this);      g->addWidget(l, 6, 0);
+       l = new QLabel(_("String for %7"), this);       g->addWidget(l, 6, 0);
        a[6] = new QLineEdit(this);                                     g->addWidget(a[6], 7, 0);
-       l = new QLabel(tr("String for %8"), this);      g->addWidget(l, 6, 1);
+       l = new QLabel(_("String for %8"), this);       g->addWidget(l, 6, 1);
        a[7] = new QLineEdit(this);                                     g->addWidget(a[7], 7, 1);
-       l = new QLabel(tr("String for %9"), this);      g->addWidget(l, 8, 0);
+       l = new QLabel(_("String for %9"), this);       g->addWidget(l, 8, 0);
        a[8] = new QLineEdit(this);                                     g->addWidget(a[8], 9, 0);
 
        h = new QHBoxLayout();  h->addStretch(1);       v->addLayout(h);
-       b = new QPushButton(tr("Cancel"), this);        h->addWidget(b);
+       b = new QPushButton(_("Cancel"), this); h->addWidget(b);
        connect(b, SIGNAL(clicked()),this, SLOT(reject()));
-       b = new QPushButton(tr("OK"), this);            h->addWidget(b);
+       b = new QPushButton(_("OK"), this);             h->addWidget(b);
        connect(b, SIGNAL(clicked()),this, SLOT(putArguments()));
-       b->setDefault(true);
+       b->setDefault(true);    narg=0;
 }
 //-----------------------------------------------------------------------------
 FilesDialog::~FilesDialog()    {}
index 2bb3177a437ff184e87004986de5e844aaa3bf1c..1db3a5a6b25b2ad23d5725c3c925dee5815ec00c 100644 (file)
@@ -21,6 +21,9 @@
 #define FILES_DLG_H
 //-----------------------------------------------------------------------------
 #include <QDialog>
+#if defined(_MSC_VER)
+#include <mgl2/define.h>
+#endif
 class QLineEdit;
 class QComboBox;
 class QRadioButton;
index 56bbaf1195ef1b442635d4b221478c4826b557fd..d6b397d1b33e9b4bae07e379319440d9b07d5709 100644 (file)
 #include <QCheckBox>
 #include <QPushButton>
 #include <QCloseEvent>
+#include "mgl2/define.h"
 #include "find_dlg.h"
 //-----------------------------------------------------------------------------
 FindDialog::FindDialog(QWidget *parent) : QDialog(parent)
 {
        QLabel *lbl;
        QHBoxLayout *a;
-       setWindowTitle(tr("UDAV - Find"));
+       setWindowTitle(_("UDAV - Find"));
        QVBoxLayout *o = new QVBoxLayout;
        a = new QHBoxLayout;    o->addLayout(a);
-       lbl = new QLabel(tr("Find what:"), this);                       a->addWidget(lbl);
+       lbl = new QLabel(_("Find what:"), this);                        a->addWidget(lbl);
        line = new QLineEdit(this);     lbl->setBuddy(line);    a->addWidget(line);
        a = new QHBoxLayout;    o->addLayout(a);
-       lbl = new QLabel(tr("Replace by:"), this);                      a->addWidget(lbl);
+       lbl = new QLabel(_("Replace by:"), this);                       a->addWidget(lbl);
        text = new QLineEdit(this);     lbl->setBuddy(text);    a->addWidget(text);
 
-       caseUse = new QCheckBox(tr("Match case"), this);        o->addWidget(caseUse);
-       backward = new QCheckBox(tr("Search backward"), this);  o->addWidget(backward);
+       caseUse = new QCheckBox(_("Match case"), this); o->addWidget(caseUse);
+       backward = new QCheckBox(_("Search backward"), this);   o->addWidget(backward);
 
        a = new QHBoxLayout(this);      a->setMargin(11);
        a->setSpacing(6);                       a->addLayout(o);
        o = new QVBoxLayout;            a->addLayout(o);
-       find = new QPushButton(tr("Find"), this);               o->addWidget(find);
+       find = new QPushButton(_("Find"), this);                o->addWidget(find);
        find->setDefault(true); find->setEnabled(false);
-       repl= new QPushButton(tr("Replace"), this);     o->addWidget(repl);
+       repl= new QPushButton(_("Replace"), this);      o->addWidget(repl);
        repl->setEnabled(false);
-       cancel = new QPushButton(tr("Close"), this);    o->addWidget(cancel);
+       cancel = new QPushButton(_("Close"), this);     o->addWidget(cancel);
        o->addStretch(1);
        connect(line, SIGNAL(textChanged(const QString &)), this, SLOT(enableFind(const QString &)));
        connect(find, SIGNAL(clicked()), this, SLOT(findClicked()));
index 921c25956c3f46b2457474e5cc8a253ff8c62c17..221901c13ef6fbd7cf42158ee020308bcbb18684 100644 (file)
@@ -24,6 +24,9 @@
 class QCheckBox;
 class QLineEdit;
 class QPushButton;
+#if defined(_MSC_VER)
+#include <mgl2/define.h>
+#endif
 //-----------------------------------------------------------------------------
 /// Dialog for finding something in text
 class FindDialog : public QDialog
index 1864664a64f16f05abbfeb4c95c85d82c2f87dca..0cac496562cfc33d1989f9a5aca8d8b98c4ab413 100644 (file)
@@ -25,6 +25,7 @@
 #include <QToolButton>
 #include <stdio.h>
 //-----------------------------------------------------------------------------
+#include "mgl2/define.h"
 #include "help_pnl.h"
 extern QString pathHelp;
 void raisePanel(QWidget *w);
@@ -44,16 +45,16 @@ HelpPanel::HelpPanel(QWidget *parent) : QWidget(parent)
        QVBoxLayout *v = new QVBoxLayout(this); v->addWidget(t);
        help = new QTextBrowser(this);  v->addWidget(help);     help->setOpenExternalLinks(false);
 
-       t->addAction(QPixmap(":/png/go-previous.png"), tr("Backward"), help, SLOT(backward()));
+       t->addAction(QPixmap(":/png/go-previous.png"), _("Backward"), help, SLOT(backward()));
        entry = new QLineEdit(this);    t->addWidget(entry);
        connect(entry, SIGNAL(textChanged(const QString &)), this, SLOT(showHelp(const QString &)));
        connect(entry, SIGNAL(returnPressed()), this, SLOT(showHelp()));
-       t->addAction(QPixmap(":/png/go-next.png"), tr("Forward"), help, SLOT(forward()));
+       t->addAction(QPixmap(":/png/go-next.png"), _("Forward"), help, SLOT(forward()));
        t->addSeparator();
-//     t->addAction(QPixmap(":/png/help-faq.png"), tr("Examples"), this, SLOT(showExamples()));
-       t->addAction(QPixmap(":/png/zoom-in.png"), tr("Zoom in text"), this, SLOT(zoomIn()));
-       t->addAction(QPixmap(":/png/zoom-out.png"), tr("Zoom out text"), this, SLOT(zoomOut()));
-       setWindowTitle(tr("Help"));
+//     t->addAction(QPixmap(":/png/help-faq.png"), _("Examples"), this, SLOT(showExamples()));
+       t->addAction(QPixmap(":/png/zoom-in.png"), _("Zoom in text"), this, SLOT(zoomIn()));
+       t->addAction(QPixmap(":/png/zoom-out.png"), _("Zoom out text"), this, SLOT(zoomOut()));
+       setWindowTitle(_("Help"));
 }
 //-----------------------------------------------------------------------------
 // void HelpPanel::showExamples()
@@ -61,7 +62,7 @@ HelpPanel::HelpPanel(QWidget *parent) : QWidget(parent)
 //     QStringList s;  s<<(pathHelp);
 //     help->setSearchPaths(s);
 //     setWindowTitle("Examples");     raisePanel(this);
-//     help->setSource(tr("mgl_en")+"_2.html");
+//     help->setSource("mgl_en"+"_2.html");
 // }
 //-----------------------------------------------------------------------------
 void HelpPanel::showHelp(const QString &txt)
@@ -71,8 +72,9 @@ void HelpPanel::showHelp(const QString &txt)
        QStringList s;  s<<(pathHelp);
        help->setSearchPaths(s);
        if(cmd.isEmpty())       cmd = entry->text().trimmed();
-       if(cmd.isEmpty())       help->setSource(tr("mgl_en")+".html");
-       else    help->setSource(tr("mgl_en")+".html#"+cmd);
+       // NOTE disable other translations for help files due to Qt bug
+       if(cmd.isEmpty())       help->setSource("mgl_en"+QString(".html"));
+       else    help->setSource("mgl_en"+QString(".html#")+cmd);
        setWindowTitle("Help");
 }
 //-----------------------------------------------------------------------------
index 132f7ed4b2775d4e3fe9ae3765aca482ac5118cf..c6e4a1d66d523ac2b06ac63f764729f2f06ef993 100644 (file)
@@ -21,6 +21,9 @@
 #define HELP_PNL_H
 //-----------------------------------------------------------------------------
 #include <QWidget>
+#if defined(_MSC_VER)
+#include <mgl2/define.h>
+#endif
 class QTextBrowser;
 class QLineEdit;
 //-----------------------------------------------------------------------------
index be555e42f1f262bad34f8d8bdde52dac912e1718..2ef75ea89dee247ad2edde893f3a1dbb0c207112 100644 (file)
 #include "hint_dlg.h"
 #include "mgl2/data_cf.h"
 //-----------------------------------------------------------------------------
-#define qtr    HintDialog::tr
-QString hints[] = {
-       qtr("You can shift axis range by pressing middle button and moving mouse. Also, you can zoom in/out axis range by using mouse wheel."),
-       qtr("You can rotate/shift/zoom whole plot by mouse. Just press 'Rotate' toolbutton, click image and hold a mouse button: left button for rotation, right button for zoom/perspective, middle button for shift."),
-       qtr("You may quickly draw the data from file. Just use: udav 'filename.dat' in command line."),
-       qtr("You can copy the current image to clipboard by pressing Ctrl-Shift-C. Later you can paste it directly into yours document or presentation."),
-       qtr("You can export image into a set of format (EPS, SVG, PNG, JPEG) by pressing right mouse button inside image and selecting 'Export as ...'."),
-       qtr("You can setup colors for script highlighting in Property dialog. Just select menu item 'Settings/Properties'."),
-       qtr("You can save the parameter of animation inside MGL script by using comment started from '##a ' or '##c ' for loops."),
-       qtr("New drawing never clears things drawn already. For example, you can make a surface with contour lines by calling commands 'surf' and 'cont' one after another (in any order). "),
-       qtr("You can put several plots in the same image by help of commands 'subplot' or 'inplot'."),
-       qtr("All indexes (of data arrays, subplots and so on) are always start from 0."),
-       qtr("You can edit MGL file in any text editor. Also you can run it in console by help of commands: mglconv, mglview."),
-       qtr("You can use command 'once on|off' for marking the block which should be executed only once. For example, this can be the block of large data reading/creating/handling. Press F9 (or menu item 'Graphics/Reload') to re-execute this block."),
-       qtr("You can use command 'stop' for terminating script parsing. It is useful if you don't want to execute a part of script."),
-       qtr("You can type arbitrary expression as input argument for data or number. In last case (for numbers), the first value of data array is used."),
-       qtr("There is powerful calculator with a lot of special functions. You can use buttons or keyboard to type the expression. Also you can use existed variables in the expression."),
-       qtr("The calculator can help you to put complex expression in the script. Just type the expression (which may depend on coordinates x,y,z and so on) and put it into the script."),
-       qtr("You can easily insert file or folder names, last fitted formula or numerical value of selection by using menu Edit|Insert."),
-       qtr("The special dialog (Edit|Insert|New Command) help you select the command, fill its arguments and put it into the script."),
-       qtr("You can put several plotting commands in the same line or in separate function, for highlighting all of them simultaneously."),
-       qtr("")
-};
-//-----------------------------------------------------------------------------
 //
 //     Hint dialog
 //
 //-----------------------------------------------------------------------------
 HintDialog::HintDialog(QWidget *parent) : QDialog(parent)
 {
-       for(numHints=0;!hints[numHints].isEmpty();numHints++);
+       hints.append(_("You can shift axis range by pressing middle button and moving mouse. Also, you can zoom in/out axis range by using mouse wheel."));
+       hints.append(_("You can rotate/shift/zoom whole plot by mouse. Just press 'Rotate' toolbutton, click image and hold a mouse button: left button for rotation, right button for zoom/perspective, middle button for shift."));
+       hints.append(_("You may quickly draw the data from file. Just use: udav 'filename.dat' in command line."));
+       hints.append(_("You can copy the current image to clipboard by pressing Ctrl-Shift-C. Later you can paste it directly into yours document or presentation."));
+       hints.append(_("You can export image into a set of format (EPS, SVG, PNG, JPEG) by pressing right mouse button inside image and selecting 'Export as ...'."));
+       hints.append(_("You can setup colors for script highlighting in Property dialog. Just select menu item 'Settings/Properties'."));
+       hints.append(_("You can save the parameter of animation inside MGL script by using comment started from '##a ' or '##c ' for loops."));
+       hints.append(_("New drawing never clears things drawn already. For example, you can make a surface with contour lines by calling commands 'surf' and 'cont' one after another (in any order). "));
+       hints.append(_("You can put several plots in the same image by help of commands 'subplot' or 'inplot'."));
+       hints.append(_("All indexes (of data arrays, subplots and so on) are always start from 0."));
+       hints.append(_("You can edit MGL file in any text editor. Also you can run it in console by help of commands: mglconv, mglview."));
+       hints.append(_("You can use command 'once on|off' for marking the block which should be executed only once. For example, this can be the block of large data reading/creating/handling. Press F9 (or menu item 'Graphics/Reload') to re-execute this block."));
+       hints.append(_("You can use command 'stop' for terminating script parsing. It is useful if you don't want to execute a part of script."));
+       hints.append(_("You can type arbitrary expression as input argument for data or number. In last case (for numbers), the first value of data array is used."));
+       hints.append(_("There is powerful calculator with a lot of special functions. You can use buttons or keyboard to type the expression. Also you can use existed variables in the expression."));
+       hints.append(_("The calculator can help you to put complex expression in the script. Just type the expression (which may depend on coordinates x,y,z and so on) and put it into the script."));
+       hints.append(_("You can easily insert file or folder names, last fitted formula or numerical value of selection by using menu Edit|Insert."));
+       hints.append(_("The special dialog (Edit|Insert|New Command) help you select the command, fill its arguments and put it into the script."));
+       hints.append(_("You can put several plotting commands in the same line or in separate function, for highlighting all of them simultaneously."));
+
+       numHints=hints.size();
        cur = int(mgl_rnd()*numHints);
-       setWindowTitle(tr("UDAV - Hint"));
+       setWindowTitle(_("UDAV - Hint"));
        QHBoxLayout *a;
        QPushButton *b;
        QVBoxLayout *o = new QVBoxLayout(this);
        text = new QTextEdit(this);     o->addWidget(text);
        text->setReadOnly(true);        text->setText(hints[cur]);
 
-       start = new QCheckBox(tr("Show at startup"), this);     o->addWidget(start);
+       start = new QCheckBox(_("Show at startup"), this);      o->addWidget(start);
        start->setChecked(true);
 
        a = new QHBoxLayout;    o->addLayout(a);
-       b = new QPushButton(tr("Prev"), this);          a->addWidget(b);
+       b = new QPushButton(_("Prev"), this);           a->addWidget(b);
        connect(b, SIGNAL(clicked()), this, SLOT(prevClicked()));
-       b = new QPushButton(tr("Next"), this);          a->addWidget(b);
+       b = new QPushButton(_("Next"), this);           a->addWidget(b);
        connect(b, SIGNAL(clicked()), this, SLOT(nextClicked()));
-       b = new QPushButton(tr("Close"), this); a->addWidget(b);
+       b = new QPushButton(_("Close"), this);  a->addWidget(b);
        connect(b, SIGNAL(clicked()),this, SLOT(close()));
 }
 //-----------------------------------------------------------------------------
index 338b222c95fe4069fdae613a75759af15ed14aba..8bb2a6679b994f441688ce6525285406b2c0cbb6 100644 (file)
@@ -23,7 +23,6 @@
 #include <QTextEdit>
 #include <QDialog>
 class QCheckBox;
-extern QString hints[];
 //-----------------------------------------------------------------------------
 /// Dialog for showing hints
 class HintDialog : public QDialog
@@ -42,6 +41,7 @@ private slots:
 private:
        int cur;
        int numHints;
+       QVector<QString> hints;
        QTextEdit *text;
        QCheckBox *start;
 };
index 528da56c8d88afdd216f4c46fb8ad25511164dee..dc6426ccdcee918c4fdeb41b618844936a8d2faf 100644 (file)
@@ -36,23 +36,23 @@ InfoDialog::InfoDialog(QWidget *parent) : QDialog(parent)
        u = new QVBoxLayout(this);      u->addWidget(tab);
        // graphics
        p = new QWidget(this);  v = new QVBoxLayout(p);
-       l = new QLabel(tr("Select kind of plot"),this); v->addWidget(l);
+       l = new QLabel(_("Select kind of plot"),this);  v->addWidget(l);
        kind = new QComboBox(this);     v->addWidget(kind);
        mgl = new QMathGL(this);        v->addWidget(mgl,1);
-       mgl->autoResize = true;         mgl->appName = tr("Data preview");
-       mgl->setToolTip(tr("Data preview for current slice."));
+       mgl->autoResize = true;         mgl->appName = _("Data preview");
+       mgl->setToolTip(_("Data preview for current slice."));
 
        draw = new mglDrawScript(parser.Self());        mgl->setDraw(draw);
 
-       kind->addItem(tr("1D plot"));   kind->addItem(tr("2D plot"));
-       kind->setCurrentIndex(0);       //      kind->addItem(tr("3D plot"));
+       kind->addItem(_("1D plot"));    kind->addItem(_("2D plot"));
+       kind->setCurrentIndex(0);       //      kind->addItem(_("3D plot"));
        connect(kind, SIGNAL(currentIndexChanged(int)), this, SLOT(refresh()));
-       kind->setToolTip(tr("Kind of plots: lines for 1D, density for 2D."));
-       tab->addTab(p, tr("Preview"));
+       kind->setToolTip(_("Kind of plots: lines for 1D, density for 2D."));
+       tab->addTab(p, _("Preview"));
        // information
        info = new QTextEdit(this);
-       info->setToolTip(tr("Short information about the data."));
-       tab->addTab(info, tr("Information"));
+       info->setToolTip(_("Short information about the data."));
+       tab->addTab(info, _("Information"));
        connect(mgl,SIGNAL(showWarn(QString)),info,SLOT(setText(QString)));
 }
 //-----------------------------------------------------------------------------
@@ -63,7 +63,7 @@ void InfoDialog::refresh(bool force)
 {
        if(!var || (!force && (!allowRefresh || !isVisible()))) return;
        QString text, name, sub;
-       name = QString::fromStdWString(var->s);
+       name = QString::fromWCharArray(var->s.c_str());
        sub = "(:,:,"+QString::number(kz)+")\n";
        int i = kind->currentIndex();
        if(i<1) text = "yrange "+name+"\nplot "+name + sub;
index 7b9da01bcd268f07020036a3ff12556b9fd1eed8..e9cd4fd4e03d8af8af3a1c27d54d4f511e1a0131 100644 (file)
@@ -26,6 +26,7 @@
 //-----------------------------------------------------------------------------
 #include "mem_pnl.h"
 #include "info_dlg.h"
+#undef sprintf // fix libintl bug of defining sprintf
 //-----------------------------------------------------------------------------
 #include "xpm/table.xpm"
 #include "xpm/preview.xpm"
@@ -54,22 +55,22 @@ MemPanel::MemPanel(QWidget *parent) : QWidget(parent)
 
        QToolBar *t = new QToolBar(this);       t->setMovable(false);
        QVBoxLayout *v = new QVBoxLayout(this); v->addWidget(t);
-       t->addAction(QPixmap(":/png/document-new.png"), tr("Create new data array"), this, SLOT(newTable()));
-       t->addAction(QPixmap(table_xpm), tr("Edit selected data array"), this, SLOT(editData()));
-       t->addAction(QPixmap(":/png/edit-delete.png"), tr("Delete selected data array"), this, SLOT(delData()));
-       t->addAction(QPixmap(preview_xpm), tr("Properties of selected data array"), this, SLOT(infoData()));
-       t->addAction(QPixmap(":/png/view-refresh.png"), tr("Update list of data arrays"), this, SLOT(refresh()));
+       t->addAction(QPixmap(":/png/document-new.png"), _("Create new data array"), this, SLOT(newTable()));
+       t->addAction(QPixmap(table_xpm), _("Edit selected data array"), this, SLOT(editData()));
+       t->addAction(QPixmap(":/png/edit-delete.png"), _("Delete selected data array"), this, SLOT(delData()));
+       t->addAction(QPixmap(preview_xpm), _("Properties of selected data array"), this, SLOT(infoData()));
+       t->addAction(QPixmap(":/png/view-refresh.png"), _("Update list of data arrays"), this, SLOT(refresh()));
        t->addSeparator();
-       t->addAction(QPixmap(":/png/edit-clear.png"), tr("Delete ALL data arrays"), this, SLOT(delAllData()));
+       t->addAction(QPixmap(":/png/edit-clear.png"), _("Delete ALL data arrays"), this, SLOT(delAllData()));
 
        colSort = 0;
        tab = new QTableWidget(this);   tab->setColumnCount(3); v->addWidget(tab);
-       QStringList sl; sl<<tr("Name")<<tr("Sizes")<<tr("Memory");
+       QStringList sl; sl<<_("Name")<<_("Sizes")<<_("Memory");
        tab->setHorizontalHeaderLabels(sl);
        connect(tab, SIGNAL(cellClicked(int,int)), this, SLOT(tableClicked(int,int)));
        connect(tab, SIGNAL(cellDoubleClicked(int,int)), this, SLOT(tableDClicked(int,int)));
 
-       setWindowTitle(tr("Memory"));
+       setWindowTitle(_("Memory"));
 }
 //-----------------------------------------------------------------------------
 void MemPanel::tableClicked(int, int col)
@@ -80,10 +81,10 @@ void MemPanel::tableDClicked(int row, int)  {       editData(row);  }
 void MemPanel::newTable()
 {
        bool ok;
-       QString name = QInputDialog::getText(this, tr("UDAV - New variable"),
-                               tr("Enter name for new variable"), QLineEdit::Normal, "", &ok);
+       QString name = QInputDialog::getText(this, _("UDAV - New variable"),
+                               _("Enter name for new variable"), QLineEdit::Normal, "", &ok);
        if(!ok || name.isEmpty())       return;
-       mglDataA *v = parser.AddVar(name.toStdString().c_str());
+       mglDataA *v = parser.AddVar(name.toLocal8Bit().constData());
        QWidget *t;
        if(v->o)        t = (QWidget *)v->o;
        else            t = newDataWnd(infoDlg,wnd,v);
@@ -96,7 +97,7 @@ void MemPanel::editData(int n)
        if(tab->rowCount()<1)   return;
        if(n<0) n = tab->currentRow();
        if(n<0) n = 0;
-       mglDataA *v = parser.FindVar(tab->item(n,0)->text().toStdString().c_str());
+       mglDataA *v = parser.FindVar(tab->item(n,0)->text().toLocal8Bit().constData());
        if(!v)  return;
        QWidget *t;
        if(v->o)        t = (QWidget *)v->o;
@@ -109,16 +110,16 @@ void MemPanel::delData()
        if(tab->rowCount()<1)   return;
        int     n = tab->currentRow();
        if(n<0) n = 0;
-       mglDataA *v = parser.FindVar(tab->item(n,0)->text().toStdString().c_str());
-       if(!v && v->o)  ((QWidget *)v->o)->close();
-       parser.DeleteVar(tab->item(n,0)->text().toStdString().c_str());
+       mglDataA *v = parser.FindVar(tab->item(n,0)->text().toLocal8Bit().constData());
+       if(v && v->o)   ((QWidget *)v->o)->close();
+       parser.DeleteVar(tab->item(n,0)->text().toLocal8Bit().constData());
        refresh();
 }
 //-----------------------------------------------------------------------------
 void MemPanel::delAllData()
 {
-       if(QMessageBox::information(this, tr("UDAV - delete all data"),
-                       tr("Do you want to delete all data?"), QMessageBox::No,
+       if(QMessageBox::information(this, _("UDAV - delete all data"),
+                       _("Do you want to delete all data?"), QMessageBox::No,
                        QMessageBox::Yes)!=QMessageBox::Yes)    return;
        parser.DeleteAll();     refresh();
 }
@@ -128,11 +129,11 @@ void MemPanel::infoData()
        if(tab->rowCount()<1)   return;
        int     n = tab->currentRow();
        if(n<0) n = 0;
-       mglDataA *v = parser.FindVar(tab->item(n,0)->text().toStdString().c_str());
+       mglDataA *v = parser.FindVar(tab->item(n,0)->text().toLocal8Bit().constData());
        if(!v)  return;
        infoDlg->setVar(v);
-       QString s = QString::fromStdWString(v->s);
-       infoDlg->setWindowTitle(s + tr(" - UDAV preview"));
+       QString s = QString::fromWCharArray(v->s.c_str());
+       infoDlg->setWindowTitle(s + _(" - UDAV preview"));
        infoDlg->refresh();
        infoDlg->show();
 }
@@ -149,7 +150,7 @@ void MemPanel::refresh()
        {
                mglDataA *v = parser.GetVar(i);
                if(!v)  continue;
-               s = QString::fromStdWString(v->s);
+               s = QString::fromWCharArray(v->s.c_str());
                it = new QTableWidgetItem(s);
                tab->setItem(m,0,it);   it->setFlags(flags);
                s.sprintf("%ld * %ld * %ld", v->GetNx(), v->GetNy(), v->GetNz());
@@ -164,7 +165,7 @@ void MemPanel::refresh()
                else if(dynamic_cast<mglDataF*>(v))     sv = sizeof(mglDataF);
                else if(dynamic_cast<mglDataR*>(v))     sv = sizeof(mglDataR);
                else if(dynamic_cast<mglDataT*>(v))     sv = sizeof(mglDataT);
-               if(sv==0)       s = tr("unknown");
+               if(sv==0)       s = _("unknown");
 #if MGL_SIZEOF_LONG>4
 //             else if((sv>>80L)>0)    s.sprintf("%ld Yb",sv>>80L);
 //             else if((sv>>70L)>0)    s.sprintf("%ld Zb",sv>>70L);
index 3d1d24fc1a8c67763fedef9dbcffc3de3a2a23fd..fa08dd5b51cb543a6d911f2c29e321211152e56e 100644 (file)
@@ -47,37 +47,37 @@ NewCmdDialog::NewCmdDialog(QWidget *p) : QDialog(p,Qt::WindowStaysOnTopHint)
        stlDialog = new StyleDialog(this);
        datDialog = new DataDialog(this);
        type = new QComboBox(this);             o->addWidget(type);
-       type->setToolTip(tr("Groups of MGL commands"));
+       type->setToolTip(_("Groups of MGL commands"));
        fillList();
        name = new QComboBox(this);             o->addWidget(name);
-       name->setToolTip(tr("MGL commands for selected group"));
+       name->setToolTip(_("MGL commands for selected group"));
        name->addItems(argn[0]);
        info = new QLabel(this);                o->addWidget(info);
-       info->setToolTip(tr("Short description of selected command"));
+       info->setToolTip(_("Short description of selected command"));
        kind= new QComboBox(this);              o->addWidget(kind);     kind->addItem("");
-       kind->setToolTip(tr("Kind of command argument order. The notation is:\n"
+       kind->setToolTip(_("Kind of command argument order. The notation is:\n"
                                                " * Capital arguments are data (like, Ydat);\n"
                                                " * Argument in '' are strings (like, 'fmt');\n"
                                                " * Other arguments are numbers (like, zval);\n"
                                                " * Arguments in [] are optional arguments."));
        args = new QTableWidget(this);  o->addWidget(args);
-       args->setToolTip(tr("Command arguments. Bold ones are required arguments.\n"
+       args->setToolTip(_("Command arguments. Bold ones are required arguments.\n"
                                                "Other are optional arguments but its order is required.\n"
                                                "You can use '' for default format. See help at right\nfor default values."));
-       QStringList sl; sl<<tr("Argument")<<tr("Value");
+       QStringList sl; sl<<_("Argument")<<_("Value");
        args->setHorizontalHeaderLabels(sl);
        connect(args,SIGNAL(cellDoubleClicked(int,int)), this, SLOT(insertData()));
 
        a = new QHBoxLayout;    o->addLayout(a);
-       b = new QPushButton(tr("Options"),this);        a->addWidget(b);
-       b->setToolTip(tr("Here you can specify command options.\nOptions are used for additional plot tunning."));
+       b = new QPushButton(_("Options"),this); a->addWidget(b);
+       b->setToolTip(_("Here you can specify command options.\nOptions are used for additional plot tunning."));
        connect(b, SIGNAL(clicked()),this,SLOT(insertOpt()));
        opt = new QLineEdit(this);      a->addWidget(opt);
 
        a = new QHBoxLayout;    o->addLayout(a);
-       b = new QPushButton(tr("Cancel"),this); a->addWidget(b);
+       b = new QPushButton(_("Cancel"),this);  a->addWidget(b);
        connect(b, SIGNAL(clicked()), this, SLOT(reject()));
-       b = new QPushButton(tr("OK"),this);     a->addWidget(b);
+       b = new QPushButton(_("OK"),this);      a->addWidget(b);
        connect(b, SIGNAL(clicked()), this, SLOT(finish()));
 
        o = new QVBoxLayout;    m->addLayout(o,1);
@@ -98,7 +98,7 @@ NewCmdDialog::NewCmdDialog(QWidget *p) : QDialog(p,Qt::WindowStaysOnTopHint)
        connect(name, SIGNAL(currentIndexChanged(int)),this,SLOT(nameChanged(int)));
        connect(kind, SIGNAL(currentIndexChanged(int)),this,SLOT(kindChanged(int)));
        type->setCurrentIndex(0);       typeChanged(0);
-       setWindowTitle(tr("New command"));
+       setWindowTitle(_("New command"));
 }
 //-----------------------------------------------------------------------------
 void NewCmdDialog::zoomIn()
@@ -120,12 +120,12 @@ void NewCmdDialog::parseCmd(const QString &txt)
                {
                        typeChanged(i);
                        name->setCurrentIndex(cmds[i].indexOf(cmd));
-                       register int j,j0,k,k0;
-                       bool ok;
-                       for(j0=k0=-1,j=0;j<NUM_CH;j++)          // determine set of arguments
+                       int j0=-1,k0=-1,k;
+                       for(int j=0;j<NUM_CH;j++)               // determine set of arguments
                        {
                                if(argn[j].isEmpty())   break;
-                               for(ok=true,k=0;k<argn[j].count();k++)
+                               bool ok=true;
+                               for(k=0;k<argn[j].count();k++)
                                {
                                        a = argn[j].at(k);              opt = (a[0]=='_'  || a[0]=='+');
                                        chr = (a[0]=='\'' || (opt && a[1]=='\''));
@@ -140,7 +140,7 @@ void NewCmdDialog::parseCmd(const QString &txt)
                        if(j0>=0)       // best choice
                        {
                                kind->setCurrentIndex(j0);
-                               for(k=0;k<argn[j0].count();k++)
+                               for(int k=0;k<argn[j0].count();k++)
                                        args->item(k,1)->setText(str.section(sep,k+1,k+1).trimmed());
                        }
                        replace = true; return;         // selection is done
@@ -163,22 +163,22 @@ void NewCmdDialog::parseCmd(const QString &txt)
 //-----------------------------------------------------------------------------
 void NewCmdDialog::fillList()
 {
-       type->addItem(QPixmap(plot_xpm), tr("1D plots"));
-       type->addItem(QPixmap(preview_xpm), tr("2D plots"));
-       type->addItem(QPixmap(":/png/weather-clouds.png"), tr("3D plots"));
-       type->addItem(QPixmap(tiles_xpm), tr("Dual plots"));
-       type->addItem(QPixmap(vect_xpm), tr("Vector plots"));
-       type->addItem(QPixmap(other_xpm), tr("Other plots"));
-       type->addItem(QPixmap(text_xpm), tr("Text and legend"));
-       type->addItem(QPixmap(table_xpm), tr("Create data and I/O"));
-       type->addItem(QPixmap(oper_dir_xpm), tr("Data transform"));
-       type->addItem(QPixmap(oper_dir_xpm), tr("Data handling"));
-       type->addItem(QPixmap(axis_xpm), tr("Axis and colorbar"));
-       type->addItem(QPixmap(axis_sh_xpm), tr("Axis setup"));
-       type->addItem(QPixmap(":/png/preferences-system.png"), tr("General setup"));
-       type->addItem(QPixmap(box_xpm), tr("Scale and rotate"));
-       type->addItem(QPixmap(":/png/media-playback-start.png"), tr("Program flow"));
-       type->addItem(QPixmap(curve_xpm), tr("Primitives"));
+       type->addItem(QPixmap(plot_xpm), _("1D plots"));
+       type->addItem(QPixmap(preview_xpm), _("2D plots"));
+       type->addItem(QPixmap(":/png/weather-clouds.png"), _("3D plots"));
+       type->addItem(QPixmap(tiles_xpm), _("Dual plots"));
+       type->addItem(QPixmap(vect_xpm), _("Vector plots"));
+       type->addItem(QPixmap(other_xpm), _("Other plots"));
+       type->addItem(QPixmap(text_xpm), _("Text and legend"));
+       type->addItem(QPixmap(table_xpm), _("Create data and I/O"));
+       type->addItem(QPixmap(oper_dir_xpm), _("Data transform"));
+       type->addItem(QPixmap(oper_dir_xpm), _("Data handling"));
+       type->addItem(QPixmap(axis_xpm), _("Axis and colorbar"));
+       type->addItem(QPixmap(axis_sh_xpm), _("Axis setup"));
+       type->addItem(QPixmap(":/png/preferences-system.png"), _("General setup"));
+       type->addItem(QPixmap(box_xpm), _("Scale and rotate"));
+       type->addItem(QPixmap(":/png/media-playback-start.png"), _("Program flow"));
+       type->addItem(QPixmap(curve_xpm), _("Primitives"));
 
        // now fill it automatically from parser for all categories
        long i, n = parser.GetCmdNum();
@@ -244,14 +244,16 @@ void NewCmdDialog::nameChanged(int s)
        if(n.isEmpty()) return;
        QStringList ss; ss<<(pathHelp);
        help->setSearchPaths(ss);
-       help->setSource(tr("mgl_en")+".html#"+n);
+       help->setSource(_("mgl_en")+QString(".html#")+n);
        // clear old
        kind->clear();  kinds.clear();  for(k=0;k<NUM_CH;k++)   argn[k].clear();
        // try to find the keyword
-       if(!parser.CmdType(n.toStdString().c_str()))    return;
-       info->setText(QString::fromLocal8Bit(parser.CmdDesc(n.toStdString().c_str())));
+       QByteArray qcmd = n.toLatin1();
+       const char *cmd = qcmd.constData();
+       if(!parser.CmdType(cmd))        return;
+       info->setText(parser.CmdDesc(cmd));
 
-       par = QString::fromLocal8Bit(parser.CmdFormat(n.toStdString().c_str()));
+       par = parser.CmdFormat(cmd);
        int i0 = par.indexOf(' ');      // first space if present
        if(i0<0)        {       kind->addItem(par);     return; }       // no arguments
        // parse kind of arguments
@@ -305,7 +307,7 @@ void NewCmdDialog::insertData()
        int row = args->currentRow();
        if(row<0)
        {
-               QMessageBox::warning(this,tr("New command"), tr("No argument is selected"));
+               QMessageBox::warning(this,_("New command"), _("No argument is selected"));
                return;
        }
        QString a = args->item(row,0)->text();
@@ -319,12 +321,12 @@ void NewCmdDialog::insertData()
        }
        else if(a=="'file'")
        {
-               QString str = QFileDialog::getOpenFileName(this, tr("UDAV - Insert filename"));
+               QString str = QFileDialog::getOpenFileName(this, _("UDAV - Insert filename"));
                if(!str.isEmpty())      args->item(row,1)->setText(str);
        }
        else if(a=="'path'")
        {
-               QString str = QFileDialog::getExistingDirectory(this, tr("UDAV - Insert path"));
+               QString str = QFileDialog::getExistingDirectory(this, _("UDAV - Insert path"));
                if(!str.isEmpty())      args->item(row,1)->setText(str);
        }
 }
@@ -333,12 +335,12 @@ void NewCmdDialog::insertStl()
 {
        int s=kind->currentIndex();
        if(s<0 || s>4)
-       {       QMessageBox::warning(this,tr("New command"),
-                       tr("Select first the proper kind of arguments"));
+       {       QMessageBox::warning(this,_("New command"),
+                       _("Select first the proper kind of arguments"));
                return; }
        if(!argn[s].contains("'fmt'") && !argn[s].contains("_'fmt'"))
-       {       QMessageBox::warning(this,tr("New command"),
-                       tr("There is no 'fmt' argument for this command"));
+       {       QMessageBox::warning(this,_("New command"),
+                       _("There is no 'fmt' argument for this command"));
                return; }
        int i;
        i = argn[s].indexOf("'fmt'");
@@ -351,8 +353,8 @@ void NewCmdDialog::finish()
        QString txt,cur;
        int s = kind->currentIndex();
        if(s<0 || s>4)
-       {       QMessageBox::warning(this,tr("New command"),
-                       tr("Select first the proper kind of arguments"));
+       {       QMessageBox::warning(this,_("New command"),
+                       _("Select first the proper kind of arguments"));
                cmd=""; return; }
        cmd = name->currentText();
        int n = argn[s].count(), i;
@@ -364,24 +366,24 @@ void NewCmdDialog::finish()
                if(txt.isEmpty())
                {
                        if(cur[0]!='_' && cur[0]!='+')
-                       {       QMessageBox::warning(this,tr("New command"),
-                                       tr("You should specify required argument ")+cur);
+                       {       QMessageBox::warning(this,_("New command"),
+                                       _("You should specify required argument ")+cur);
                                cmd=""; return; }
                        if(argn[s].at(i)[0]=='_')       op = true;
                }
                else
                {
                        if(cur[0]=='\'' && txt[0]!='\'')
-                       {       QMessageBox::warning(this,tr("New command"),
-                                       tr("You should put text inside ' ' for argument ")+cur);
+                       {       QMessageBox::warning(this,_("New command"),
+                                       _("You should put text inside ' ' for argument ")+cur);
                                cmd=""; return; }
                        if(cur[1]=='\'' && txt[0]!='\'')
-                       {       QMessageBox::warning(this,tr("New command"),
-                                       tr("You should put text inside ' ' for argument ")+cur.mid(1));
+                       {       QMessageBox::warning(this,_("New command"),
+                                       _("You should put text inside ' ' for argument ")+cur.mid(1));
                                cmd=""; return; }
                        if(cur[0]=='_' && op)
-                       {       QMessageBox::warning(this,tr("New command"),
-                                       tr("You should specify all optional arguments before ")+cur.mid(1));
+                       {       QMessageBox::warning(this,_("New command"),
+                                       _("You should specify all optional arguments before ")+cur.mid(1));
                                cmd=""; return; }
                        cmd = cmd + ' ' + txt;
                }
index 58ae5fd7ca9aa86e8e7a7de8eb354359b7cf008e..a82b2cc9d55f8ebece5befa478af97ab27a4802f 100644 (file)
@@ -46,29 +46,29 @@ QString getOpenDataFile(QWidget *w, QString filename)
 //-----------------------------------------------------------------------------
 DataOpenDialog::DataOpenDialog(QWidget *parent) : QDialog(parent)
 {
-       setWindowTitle(tr("UDAV - Open data file"));
+       setWindowTitle(_("UDAV - Open data file"));
        QHBoxLayout *a;
        QLabel *l;
        QPushButton *b;
        QVBoxLayout *o=new QVBoxLayout(this);
 
        a = new QHBoxLayout;    o->addLayout(a);
-       l = new QLabel(tr("Data name"));        a->addWidget(l);
+       l = new QLabel(_("Data name")); a->addWidget(l);
        char buf[32];   snprintf(buf,32,"mgl_%d",numDataOpened);        buf[31]=0;
        name = new QLineEdit(buf,this);         a->addWidget(name);
 
-       rA = new QRadioButton(tr("Auto detect data sizes"), this);
+       rA = new QRadioButton(_("Auto detect data sizes"), this);
        rA->setChecked(true);   o->addWidget(rA);
-       rM = new QRadioButton(tr("Set data sizes manually"), this);
+       rM = new QRadioButton(_("Set data sizes manually"), this);
        o->addWidget(rM);       a = new QHBoxLayout;    o->addLayout(a);
-       l = new QLabel(tr("Nx"));       a->addWidget(l);
+       l = new QLabel(_("Nx"));        a->addWidget(l);
        nx = new QLineEdit("1",this);   a->addWidget(nx);
-       l = new QLabel(tr("Ny"));       a->addWidget(l);
+       l = new QLabel(_("Ny"));        a->addWidget(l);
        ny = new QLineEdit("1",this);   a->addWidget(ny);
-       l = new QLabel(tr("Nz"));       a->addWidget(l);
+       l = new QLabel(_("Nz"));        a->addWidget(l);
        nz = new QLineEdit("1",this);   a->addWidget(nz);
-       r2 = new QRadioButton(tr("Matrix with sizes from file"), this); o->addWidget(r2);
-       r3 = new QRadioButton(tr("3D data with sizes from file"), this);o->addWidget(r3);
+       r2 = new QRadioButton(_("Matrix with sizes from file"), this);  o->addWidget(r2);
+       r3 = new QRadioButton(_("3D data with sizes from file"), this);o->addWidget(r3);
 
 
        QSettings settings("udav","UDAV");
@@ -79,17 +79,17 @@ DataOpenDialog::DataOpenDialog(QWidget *parent) : QDialog(parent)
        settings.endGroup();
 
        a = new QHBoxLayout;            o->addLayout(a);
-       l = new QLabel(tr("Template")); a->addWidget(l,0);
+       l = new QLabel(_("Template"));  a->addWidget(l,0);
        scr = new QComboBox(this);              a->addWidget(scr,1);
        scr->setEditable(true);                 scr->lineEdit()->setText("");
-       scr->addItem(tr("default"));    scr->addItems(dataScr);
+       scr->addItem(_("default"));     scr->addItems(dataScr);
        b = new QPushButton("...", this);       a->addWidget(b,0);
        connect(b, SIGNAL(clicked()),this, SLOT(selectScr()));
 
        a = new QHBoxLayout;    o->addLayout(a);        a->addStretch(1);
-       b = new QPushButton(tr("Cancel"),this); a->addWidget(b);
+       b = new QPushButton(_("Cancel"),this);  a->addWidget(b);
        connect(b,SIGNAL(clicked()),this,SLOT(reject()));
-       b = new QPushButton(tr("OK"), this);    a->addWidget(b);
+       b = new QPushButton(_("OK"), this);     a->addWidget(b);
        connect(b, SIGNAL(clicked()),this, SLOT(prepareResult()));
        b->setDefault(true);
 }
@@ -98,8 +98,8 @@ DataOpenDialog::~DataOpenDialog(){}
 //-----------------------------------------------------------------------------
 void DataOpenDialog::selectScr()
 {
-       QString str = QFileDialog::getOpenFileName(this, tr("UDAV - Insert filename"),
-                                       scr->lineEdit()->text(), tr("MGL files (*.mgl)"));
+       QString str = QFileDialog::getOpenFileName(this, _("UDAV - Insert filename"),
+                                       scr->lineEdit()->text(), _("MGL files (*.mgl)"));
        if(!str.isEmpty())
        {
                scr->lineEdit()->setText(str);
@@ -116,32 +116,32 @@ void DataOpenDialog::prepareResult()
        // prepare unique value of name for next time
        char buf[32];   snprintf(buf,32,"mgl_%d",numDataOpened);
        buf[31]=0;      name->setText(buf);
-       mglData *v = dynamic_cast<mglData*>(parser.AddVar(data.toStdString().c_str()));
+       mglData *v = dynamic_cast<mglData*>(parser.AddVar(data.toLocal8Bit().constData()));
        if(!v)  return;
        int dd=0;
        if(rA->isChecked())     //      auto sizes
        {
-               setlocale(LC_NUMERIC, "C");     v->Read(file.toStdString().c_str());    setlocale(LC_NUMERIC, "");
+               v->Read(file.toLocal8Bit().constData());
                if(v->nx==1)    {       v->nx = v->ny;  v->ny = v->nz;  }
                code=QString("#read %1 '%2'\n").arg(data).arg(file);
        }
        else if(rM->isChecked())        //      manual sizes
        {
                int x=nx->text().toInt(), y=ny->text().toInt(), z=nz->text().toInt();
-               setlocale(LC_NUMERIC, "C");     v->Read(file.toStdString().c_str(),x,y,z);      setlocale(LC_NUMERIC, "");
+               v->Read(file.toLocal8Bit().constData(),x,y,z);
                code=QString("#read %1 '%2' %3 %4 %5\n").arg(data).arg(file).arg(x).arg(y).arg(z);
        }
        else if(r2->isChecked())        //      matrix
        {
-               setlocale(LC_NUMERIC, "C");     v->ReadMat(file.toStdString().c_str()); setlocale(LC_NUMERIC, "");
+               v->ReadMat(file.toLocal8Bit().constData());
                code=QString("#readmat %1 '%2'\n").arg(data).arg(file);         dd=1;
        }
        else if(r3->isChecked())        //      3d-data
        {
-               setlocale(LC_NUMERIC, "C");     v->ReadMat(file.toStdString().c_str(),3);       setlocale(LC_NUMERIC, "");
+               v->ReadMat(file.toLocal8Bit().constData(),3);
                code=QString("#readmat %1 '%2' 3\n").arg(data).arg(file);       dd=2;
        }
-       if(scr->lineEdit()->text().isEmpty() || scr->lineEdit()->text()==tr("default"))
+       if(scr->lineEdit()->text().isEmpty() || scr->lineEdit()->text()==_("default"))
        {
                if(v->nz>1 || dd==2)
                        code+=QString("rotate 40 60\ncrange %1:box\nsurf3 %1\n").arg(data);
@@ -173,7 +173,7 @@ void DataOpenDialog::prepareResult()
 void DataOpenDialog::setFile(const QString &fname)
 {
        file=fname;
-       mglData d(file.toStdString().c_str());
-       rA->setText(tr("Auto detect data sizes (%1 x %2 x %3)").arg(d.nx).arg(d.ny).arg(d.nz));
+       mglData d(file.toLocal8Bit().constData());
+       rA->setText(QString(_("Auto detect data sizes (%1 x %2 x %3)")).arg(d.nx).arg(d.ny).arg(d.nz));
 }
 //-----------------------------------------------------------------------------
index 32a2e7a679f441da7dba9f18da370b999bccaee2..27c5af6a6d8983ac1ad4e31c2000e3298b450aeb 100644 (file)
 #include <QPushButton>
 #include <QMessageBox>
 #include "opt_dlg.h"
+#include "mgl2/define.h"
 //-----------------------------------------------------------------------------
 OptionDialog::OptionDialog(QWidget *parent) : QDialog(parent)
 {
-       setWindowTitle(tr("UDAV - Add options"));
+       setWindowTitle(_("UDAV - Add options"));
        QHBoxLayout *a;
        QGridLayout *g;
        QLabel *lbl;
        QPushButton *b;
        QVBoxLayout *o = new QVBoxLayout(this); //o->setSpacing(6);
        g = new QGridLayout();          o->addLayout(g);
-       lbl = new QLabel(tr("X-range"),this);   g->addWidget(lbl,0,0);
+       lbl = new QLabel(_("X-range"),this);    g->addWidget(lbl,0,0);
        x1 = new QLineEdit(this);       g->addWidget(x1,0,1);
        x2 = new QLineEdit(this);       g->addWidget(x2,0,2);
-       lbl = new QLabel(tr("Y-range"),this);   g->addWidget(lbl,0,3);
+       lbl = new QLabel(_("Y-range"),this);    g->addWidget(lbl,0,3);
        y1 = new QLineEdit(this);       g->addWidget(y1,0,4);
        y2 = new QLineEdit(this);       g->addWidget(y2,0,5);
-       lbl = new QLabel(tr("Z-range"),this);   g->addWidget(lbl,1,0);
+       lbl = new QLabel(_("Z-range"),this);    g->addWidget(lbl,1,0);
        z1 = new QLineEdit(this);       g->addWidget(z1,1,1);
        z2 = new QLineEdit(this);       g->addWidget(z2,1,2);
-       lbl = new QLabel(tr("C-range"),this);   g->addWidget(lbl,1,3);
+       lbl = new QLabel(_("C-range"),this);    g->addWidget(lbl,1,3);
        c1 = new QLineEdit(this);       g->addWidget(c1,1,4);
        c2 = new QLineEdit(this);       g->addWidget(c2,1,5);
 
-       lbl = new QLabel(tr("Alpha"),this);             g->addWidget(lbl,2,0);
+       lbl = new QLabel(_("Alpha"),this);              g->addWidget(lbl,2,0);
        alpha = new QLineEdit(this);    g->addWidget(alpha,2,1);
-       lbl = new QLabel(tr("Mesh num"),this);  g->addWidget(lbl,2,3);
+       lbl = new QLabel(_("Mesh num"),this);   g->addWidget(lbl,2,3);
        mn = new QLineEdit(this);               g->addWidget(mn,2,4);
 
-       lbl = new QLabel(tr("Ambient"),this);   g->addWidget(lbl,3,0);
+       lbl = new QLabel(_("Ambient"),this);    g->addWidget(lbl,3,0);
        amb = new QLineEdit(this);              g->addWidget(amb,3,1);
-       lbl = new QLabel(tr("Diffuse"),this);   g->addWidget(lbl,3,3);
+       lbl = new QLabel(_("Diffuse"),this);    g->addWidget(lbl,3,3);
        dif = new QLineEdit(this);              g->addWidget(dif,3,4);
 
-       lbl = new QLabel(tr("Cutting"),this);   g->addWidget(lbl,4,0);
+       lbl = new QLabel(_("Cutting"),this);    g->addWidget(lbl,4,0);
        cut = new QComboBox(this);              g->addWidget(cut,4,1);
-       cut->insertItem(0,tr("default"));       cut->insertItem(1,tr("on"));    cut->insertItem(2,tr("off"));
-       lbl = new QLabel(tr("Light"),this);     g->addWidget(lbl,4,3);
+       cut->insertItem(0,_("default"));        cut->insertItem(1,_("on"));     cut->insertItem(2,_("off"));
+       lbl = new QLabel(_("Light"),this);      g->addWidget(lbl,4,3);
        lig = new QComboBox(this);              g->addWidget(lig,4,4);
-       lig->insertItem(0,tr("default"));       lig->insertItem(1,tr("on"));    lig->insertItem(2,tr("off"));
+       lig->insertItem(0,_("default"));        lig->insertItem(1,_("on"));     lig->insertItem(2,_("off"));
        
-       lbl = new QLabel(tr("Value"),this);     g->addWidget(lbl,5,0);
+       lbl = new QLabel(_("Value"),this);      g->addWidget(lbl,5,0);
        val = new QLineEdit(this);              g->addWidget(val,5,1);
-       lbl = new QLabel(tr("Size"),this);      g->addWidget(lbl,5,3);
+       lbl = new QLabel(_("Size"),this);       g->addWidget(lbl,5,3);
        fs = new QLineEdit(this);               g->addWidget(fs,5,4);
        
        a = new QHBoxLayout();  o->addLayout(a);
-       lbl = new QLabel(tr("Legend"),this);    a->addWidget(lbl);
+       lbl = new QLabel(_("Legend"),this);     a->addWidget(lbl);
        leg = new QLineEdit(this);      a->addWidget(leg);
        a = new QHBoxLayout();  o->addLayout(a);
        a->addStretch(1);
-       b = new QPushButton(tr("Cancel"), this);        a->addWidget(b);
+       b = new QPushButton(_("Cancel"), this); a->addWidget(b);
        connect(b, SIGNAL(clicked()),this, SLOT(reject()));
-       b = new QPushButton(tr("OK"), this);            a->addWidget(b);
+       b = new QPushButton(_("OK"), this);             a->addWidget(b);
        connect(b, SIGNAL(clicked()),this, SLOT(prepareResult()));
        b->setDefault(true);
 }
@@ -90,28 +91,28 @@ void OptionDialog::prepareResult()
                result = result + "; xrange "+x1->text()+" "+x2->text();
        if((x1->text().isEmpty()) ^ (x2->text().isEmpty()))
        {
-               QMessageBox::warning(this,tr("UDAV - command options"), tr("Both fields in xrange must be filled"));
+               QMessageBox::warning(this,_("UDAV - command options"), _("Both fields in xrange must be filled"));
                return;
        }
        if(!y1->text().isEmpty() && !y2->text().isEmpty())
                result = result + "; yrange "+y1->text()+" "+y2->text();
        if((y1->text().isEmpty()) ^ (y2->text().isEmpty()))
        {
-               QMessageBox::warning(this,tr("UDAV - command options"), tr("Both fields in yrange must be filled"));
+               QMessageBox::warning(this,_("UDAV - command options"), _("Both fields in yrange must be filled"));
                return;
        }
        if(!z1->text().isEmpty() && !z2->text().isEmpty())
                result = result + "; zrange "+z1->text()+" "+z2->text();
        if((z1->text().isEmpty()) ^ (z2->text().isEmpty()))
        {
-               QMessageBox::warning(this,tr("UDAV - command options"), tr("Both fields in zrange must be filled"));
+               QMessageBox::warning(this,_("UDAV - command options"), _("Both fields in zrange must be filled"));
                return;
        }
        if(!c1->text().isEmpty() && !c2->text().isEmpty())
                result = result + "; crange "+c1->text()+" "+c2->text();
        if((c1->text().isEmpty()) ^ (c2->text().isEmpty()))
        {
-               QMessageBox::warning(this,tr("UDAV - command options"), tr("Both fields in crange must be filled"));
+               QMessageBox::warning(this,_("UDAV - command options"), _("Both fields in crange must be filled"));
                return;
        }
        if(!val->text().isEmpty())      result = result+"; value "+val->text();
index 2e2595295219eafa40afb68191faf5699ffb3c42..796c1e1a83432554fdc1364578f604493b8616db 100644 (file)
@@ -21,6 +21,9 @@
 #define OPTION_DLG_H
 //-----------------------------------------------------------------------------
 #include <QDialog>
+#if defined(_MSC_VER)
+#include <mgl2/define.h>
+#endif
 class QLineEdit;
 class QComboBox;
 class QRadioButton;
index 3aa0eba48439723fe133cf86e065b23018236747..430d35f73cba847735d7f30a7f4fc8c7e296400d 100644 (file)
@@ -41,7 +41,7 @@
 #include "style_dlg.h"
 #include "newcmd_dlg.h"
 #include "subplot_dlg.h"
-
+#undef sprintf
 extern bool mglAutoSave;
 extern bool mglHighlight;
 extern bool mglDotsRefr;
@@ -63,7 +63,7 @@ PlotPanel::PlotPanel(QWidget *parent) : QWidget(parent)
        connect(newCmdDlg, SIGNAL(result(const QString&, bool)), this, SLOT(putCmd(const QString&)));
        connect(subplotDlg, SIGNAL(result(const QString&)), this, SLOT(insCmd(const QString&)));
 
-       menu = new QMenu(tr("Graphics"),this);
+       menu = new QMenu(_("Graphics"),this);
        popup = new QMenu(this);
        mgl = new QMathGL(this);
        draw = new mglDrawScript(parser.Self());
@@ -108,7 +108,7 @@ void PlotPanel::execute()
        draw->text=textMGL->toPlainText();
        draw->line=curPos;
        mgl->update();
-       setStatus(QString(tr("Drawing time %1 ms")).arg(t.elapsed()*1e-3));
+       setStatus(QString(_("Drawing time %1 ms")).arg(t.elapsed()*1e-3));
        emit giveFocus();
 }
 //-----------------------------------------------------------------------------
@@ -127,7 +127,7 @@ void PlotPanel::pressF9()
        parser.RestoreOnce();
        draw->text=textMGL->toPlainText();
        draw->line=curPos;      mgl->update();
-       setStatus(QString(tr("Drawing time %1 ms")).arg(t.elapsed()*1e-3));
+       setStatus(QString(_("Drawing time %1 ms")).arg(t.elapsed()*1e-3));
        emit giveFocus();
 }
 //-----------------------------------------------------------------------------
@@ -188,8 +188,8 @@ void PlotPanel::next()
        {
                gr.NewFrame();  execute();      gr.EndFrame();
                if(jpgOn)       gr.WriteFrame();
-               QString s;      s.sprintf("%d - %d of %d",gr.GetNumFrame(),animPos,n);
-               setStatus(QString(tr("Frame %1 of %2")).arg(animPos).arg(n));
+               QString s;      s.sprintf(_("%d - %d of %d"),gr.GetNumFrame(),animPos,n);
+               setStatus(QString(_("Frame %1 of %2")).arg(animPos).arg(n));
        }
 }
 //-----------------------------------------------------------------------------
@@ -287,134 +287,134 @@ void PlotPanel::toolTop(QBoxLayout *v)
        QToolBar *t = new QToolBar(this);       v->addWidget(t);        t->setMovable(false);
 
        // graphics menu
-       a = new QAction(QPixmap(":/png/alpha.png"), tr("Alpha"), this);
+       a = new QAction(QPixmap(":/png/alpha.png"), _("Alpha"), this);
        a->setShortcut(Qt::CTRL+Qt::Key_T);     a->setCheckable(true);
        connect(a, SIGNAL(toggled(bool)), mgl, SLOT(setAlpha(bool)));
        connect(mgl, SIGNAL(alphaChanged(bool)), a, SLOT(setChecked(bool)));
-       a->setToolTip(tr("Switch on/off transparency for the graphics (Ctrl+T)."));
+       a->setToolTip(_("Switch on/off transparency for the graphics (Ctrl+T)."));
        o->addAction(a);        t->addAction(a);
 
-       a = new QAction(QPixmap(":/png/weather-clear.png"), tr("Light"), this);
+       a = new QAction(QPixmap(":/png/weather-clear.png"), _("Light"), this);
        a->setShortcut(Qt::CTRL+Qt::Key_L);     a->setCheckable(true);
        connect(a, SIGNAL(toggled(bool)), mgl, SLOT(setLight(bool)));
        connect(mgl, SIGNAL(lightChanged(bool)), a, SLOT(setChecked(bool)));
-       a->setToolTip(tr("Switch on/off lightning for the graphics (Ctrl+L)."));
+       a->setToolTip(_("Switch on/off lightning for the graphics (Ctrl+L)."));
        o->addAction(a);        t->addAction(a);
 
-       a = new QAction(QPixmap(":/png/view-grid.png"), tr("Grid"), this);
+       a = new QAction(QPixmap(":/png/view-grid.png"), _("Grid"), this);
        a->setShortcut(Qt::CTRL+Qt::Key_G);     a->setCheckable(true);
        connect(a, SIGNAL(toggled(bool)), mgl, SLOT(setGrid(bool)));
-       a->setToolTip(tr("Switch on/off grid of absolute coordinates (Ctrl+G)."));
+       a->setToolTip(_("Switch on/off grid of absolute coordinates (Ctrl+G)."));
        o->addAction(a);        t->addAction(a);
 
-       a = new QAction(QPixmap(":/png/transform-move.png"), tr("Rotate by mouse"), this);
+       a = new QAction(QPixmap(":/png/transform-move.png"), _("Rotate by mouse"), this);
        a->setCheckable(true);
        connect(a, SIGNAL(toggled(bool)), mgl, SLOT(setRotate(bool)));
        connect(mgl, SIGNAL(rotateChanged(bool)), a, SLOT(setChecked(bool)));
-       a->setToolTip(tr("Switch on/off mouse handling of the graphics\n(rotation, shifting, zooming and perspective)."));
+       a->setToolTip(_("Switch on/off mouse handling of the graphics\n(rotation, shifting, zooming and perspective)."));
        t->addAction(a);
 
-/*     a = new QAction(QPixmap(":/png/zoom-fit-best.png"), tr("Zoom by mouse"), this);
+/*     a = new QAction(QPixmap(":/png/zoom-fit-best.png"), _("Zoom by mouse"), this);
        a->setCheckable(true);
        connect(a, SIGNAL(toggled(bool)), mgl, SLOT(setZoom(bool)));
        connect(mgl, SIGNAL(zoomChanged(bool)), a, SLOT(setChecked(bool)));
-       a->setToolTip(tr("Switch on/off mouse zoom of selected region."));
+       a->setToolTip(_("Switch on/off mouse zoom of selected region."));
        t->addAction(a);*/
 
        o->addSeparator();
-       a = new QAction(QPixmap(":/png/zoom-original.png"), tr("Restore"), this);
+       a = new QAction(QPixmap(":/png/zoom-original.png"), _("Restore"), this);
        connect(a, SIGNAL(triggered()), mgl, SLOT(restore()));
-       a->setToolTip(tr("Restore default graphics rotation, zoom and perspective (Ctrl+Space)."));
+       a->setToolTip(_("Restore default graphics rotation, zoom and perspective (Ctrl+Space)."));
        a->setShortcut(Qt::CTRL+Qt::Key_Space);
        o->addAction(a);        popup->addAction(a);    t->addAction(a);
 
-       a = new QAction(QPixmap(":/png/view-refresh.png"), tr("Redraw"), this);
+       a = new QAction(QPixmap(":/png/view-refresh.png"), _("Redraw"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(execute()));
-       a->setToolTip(tr("Execute script and redraw graphics (F5)."));
+       a->setToolTip(_("Execute script and redraw graphics (F5)."));
        a->setShortcut(Qt::Key_F5);
        o->addAction(a);        popup->addAction(a);    t->addAction(a);
 
-       a = new QAction(QPixmap(":/png/view-fullscreen.png"), tr("Adjust size"), this);
+       a = new QAction(QPixmap(":/png/view-fullscreen.png"), _("Adjust size"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(adjust()));
-       a->setToolTip(tr("Change canvas size to fill whole region (F6)."));
+       a->setToolTip(_("Change canvas size to fill whole region (F6)."));
        a->setShortcut(Qt::Key_F6);             o->addAction(a);
 
-       a = new QAction(QPixmap(":/png/document-revert.png"), tr("Reload"), this);
+       a = new QAction(QPixmap(":/png/document-revert.png"), _("Reload"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(pressF9()));
-       a->setToolTip(tr("Restore status for 'once' command and reload data (F9)."));
+       a->setToolTip(_("Restore status for 'once' command and reload data (F9)."));
        a->setShortcut(Qt::Key_F9);     o->addAction(a);        popup->addAction(a);
 
-       a = new QAction(QPixmap(":/png/process-stop.png"), tr("Stop"), this);
+       a = new QAction(QPixmap(":/png/process-stop.png"), _("Stop"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(stop()));
-       a->setToolTip(tr("Stop script execution (F7)."));
+       a->setToolTip(_("Stop script execution (F7)."));
        a->setShortcut(Qt::Key_F7);     o->addAction(a);        t->addAction(a);
 
-       a = new QAction(QPixmap(":/png/edit-copy.png"), tr("Copy plot"), this);
+       a = new QAction(QPixmap(":/png/edit-copy.png"), _("Copy plot"), this);
        connect(a, SIGNAL(triggered()), mgl, SLOT(copy()));
-       a->setToolTip(tr("Copy graphics to clipboard (Ctrl+Shift+G)."));
+       a->setToolTip(_("Copy graphics to clipboard (Ctrl+Shift+G)."));
        a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_G);
        o->addAction(a);        popup->addAction(a);    t->addAction(a);
 
-       a = new QAction(QPixmap(":/png/edit-copy.png"), tr("Copy click coor."), this);
+       a = new QAction(QPixmap(":/png/edit-copy.png"), _("Copy click coor."), this);
        connect(a, SIGNAL(triggered()), mgl, SLOT(copyClickCoor()));
-       a->setToolTip(tr("Copy coordinates of last mouse click to clipboard."));
+       a->setToolTip(_("Copy coordinates of last mouse click to clipboard."));
        o->addAction(a);        popup->addAction(a);
 
 //     l->addStretch(1);
        {
-               oo = new QMenu(tr("Primitives ..."),this);
-               aa=a = new QAction(QPixmap(line_xpm), tr("Add line"), this);
+               oo = new QMenu(_("Primitives ..."),this);
+               aa=a = new QAction(QPixmap(line_xpm), _("Add line"), this);
                connect(a, SIGNAL(triggered()), mgl, SLOT(addLine()));
                connect(mgl, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool)));
-               a->setToolTip(tr("Add line which properties can be changed later by mouse."));
+               a->setToolTip(_("Add line which properties can be changed later by mouse."));
                oo->addAction(a);
 
-               a = new QAction(QPixmap(arc_xpm), tr("Add arc"), this);
+               a = new QAction(QPixmap(arc_xpm), _("Add arc"), this);
                connect(a, SIGNAL(triggered()), mgl, SLOT(addArc()));
                connect(mgl, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool)));
-               a->setToolTip(tr("Add arc which properties can be changed later by mouse."));
+               a->setToolTip(_("Add arc which properties can be changed later by mouse."));
                oo->addAction(a);
 
-               a = new QAction(QPixmap(curve_xpm), tr("Add curve"), this);
+               a = new QAction(QPixmap(curve_xpm), _("Add curve"), this);
                connect(a, SIGNAL(triggered()), mgl, SLOT(addCurve()));
                connect(mgl, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool)));
-               a->setToolTip(tr("Add curve which properties can be changed later by mouse."));
+               a->setToolTip(_("Add curve which properties can be changed later by mouse."));
                oo->addAction(a);
 
-               a = new QAction(QPixmap(mark_s_xpm), tr("Add rect"), this);
+               a = new QAction(QPixmap(mark_s_xpm), _("Add rect"), this);
                connect(a, SIGNAL(triggered()), mgl, SLOT(addRect()));
                connect(mgl, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool)));
-               a->setToolTip(tr("Add rectangle which properties can be changed later by mouse."));
+               a->setToolTip(_("Add rectangle which properties can be changed later by mouse."));
                oo->addAction(a);
 
-               a = new QAction(QPixmap(mark_d_xpm), tr("Add rhombus"), this);
+               a = new QAction(QPixmap(mark_d_xpm), _("Add rhombus"), this);
                connect(a, SIGNAL(triggered()), mgl, SLOT(addRhomb()));
                connect(mgl, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool)));
-               a->setToolTip(tr("Add rhombus which properties can be changed later by mouse."));
+               a->setToolTip(_("Add rhombus which properties can be changed later by mouse."));
                oo->addAction(a);
 
-               a = new QAction(QPixmap(mark_o_xpm), tr("Add ellipse"), this);
+               a = new QAction(QPixmap(mark_o_xpm), _("Add ellipse"), this);
                connect(a, SIGNAL(triggered()), mgl, SLOT(addEllipse()));
                connect(mgl, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool)));
-               a->setToolTip(tr("Add ellipse which properties can be changed later by mouse."));
+               a->setToolTip(_("Add ellipse which properties can be changed later by mouse."));
                oo->addAction(a);
 
-               a = new QAction(QPixmap(polygon_xpm), tr("Add polygon"), this);
+               a = new QAction(QPixmap(polygon_xpm), _("Add polygon"), this);
                connect(a, SIGNAL(triggered()), mgl, SLOT(addPolygon()));
                connect(mgl, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool)));
-               a->setToolTip(tr("Add ellipse which properties can be changed later by mouse."));
+               a->setToolTip(_("Add ellipse which properties can be changed later by mouse."));
                oo->addAction(a);
 
-               a = new QAction(QPixmap(mark_a_xpm), tr("Add mark"), this);
+               a = new QAction(QPixmap(mark_a_xpm), _("Add mark"), this);
                connect(a, SIGNAL(triggered()), mgl, SLOT(addMark()));
                connect(mgl, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool)));
-               a->setToolTip(tr("Add marker which properties can be changed later by mouse."));
+               a->setToolTip(_("Add marker which properties can be changed later by mouse."));
                oo->addAction(a);
 
-               a = new QAction(QPixmap(text_xpm), tr("Add text"), this);
+               a = new QAction(QPixmap(text_xpm), _("Add text"), this);
                connect(a, SIGNAL(triggered()), mgl, SLOT(addText()));
                connect(mgl, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool)));
-               a->setToolTip(tr("Add text which properties can be changed later by mouse."));
+               a->setToolTip(_("Add text which properties can be changed later by mouse."));
                oo->addAction(a);
 
                QToolButton *bb = new QToolButton(this);
@@ -423,37 +423,37 @@ void PlotPanel::toolTop(QBoxLayout *v)
                t->addWidget(bb);
        }
 
-       a = new QAction(QPixmap(":/png/edit-delete.png"), tr("Delete selected"), this);
+       a = new QAction(QPixmap(":/png/edit-delete.png"), _("Delete selected"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(deleteSelected()));
-       a->setToolTip(tr("Delete selected plot."));
+       a->setToolTip(_("Delete selected plot."));
        o->addAction(a);        popup->addAction(a);    t->addAction(a);
 
-       a = new QAction(QPixmap(":/png/layer-visible-off.png"), tr("Hide selected"), this);
+       a = new QAction(QPixmap(":/png/layer-visible-off.png"), _("Hide selected"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(hideSelected()));
-       a->setToolTip(tr("Hide selected plot."));
+       a->setToolTip(_("Hide selected plots."));
        o->addAction(a);        popup->addAction(a);    t->addAction(a);
 
        const MainWindow *mw=findMain(this);
        if(mw)  t->addAction(mw->ahide);
 
-       a = new QAction(QPixmap(":/png/format-indent-more.png"), tr("New command"), this);
+       a = new QAction(QPixmap(":/png/format-indent-more.png"), _("New command"), this);
        connect(a, SIGNAL(triggered()), newCmdDlg, SLOT(show()));
-       a->setToolTip(tr("Show dialog for new command and put it into the script."));
+       a->setToolTip(_("Show dialog for new command or edit arguments of existed one."));
        o->addAction(a);        popup->addAction(a);    t->addAction(a);
 
-       a = new QAction(QPixmap(box_xpm), tr("New inplot"), this);
+       a = new QAction(QPixmap(box_xpm), _("New inplot"), this);
        connect(a, SIGNAL(triggered()), subplotDlg, SLOT(show()));
-       a->setToolTip(tr("Show dialog for new inplot and put it into the script."));
+       a->setToolTip(_("Show dialog for new inplot and put it into the script."));
        o->addAction(a);        popup->addAction(a);    t->addAction(a);
 
-       a = new QAction(QPixmap(":/png/object-order-lower.png"), tr("Move plot up"), this);
+       a = new QAction(QPixmap(":/png/object-order-lower.png"), _("Move plot up"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(movePlotUp()));
-       a->setToolTip(tr("Move selected plot up to previous subplot."));
+       a->setToolTip(_("Move selected plot up to previous subplot."));
        o->addAction(a);        popup->addAction(a);    t->addAction(a);
 
-       a = new QAction(QPixmap(":/png/object-order-raise.png"), tr("Move plot down"), this);
+       a = new QAction(QPixmap(":/png/object-order-raise.png"), _("Move plot down"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(movePlotDown()));
-       a->setToolTip(tr("Move selected plot down to next subplot."));
+       a->setToolTip(_("Move selected plot down to next subplot."));
        o->addAction(a);        popup->addAction(a);    t->addAction(a);
 
 
@@ -463,31 +463,31 @@ void PlotPanel::toolTop(QBoxLayout *v)
        t->addWidget(tet);      tet->setRange(-180, 180);       tet->setSingleStep(10);
        connect(tet, SIGNAL(valueChanged(int)), mgl, SLOT(setTet(int)));
        connect(mgl, SIGNAL(tetChanged(int)), tet, SLOT(setValue(int)));
-       tet->setToolTip(tr("Set value of \\theta angle.\nYou can use keys (Shift+Meta+Up or Shift+Meta+Down)."));
+       tet->setToolTip(_("Set value of \\theta angle.\nYou can use keys (Shift+Meta+Up or Shift+Meta+Down)."));
 
        phi = new QSpinBox(this);       phi->setWrapping(true);
        t->addWidget(phi);      phi->setRange(-180, 180);       phi->setSingleStep(10);
        connect(phi, SIGNAL(valueChanged(int)), mgl, SLOT(setPhi(int)));
        connect(mgl, SIGNAL(phiChanged(int)), phi, SLOT(setValue(int)));
-       phi->setToolTip(tr("Set value of \\phi angle.\nYou can use keys (Shift+Meta+Left or Shift+Meta+Right)."));
+       phi->setToolTip(_("Set value of \\phi angle.\nYou can use keys (Shift+Meta+Left or Shift+Meta+Right)."));
 
-       oo = new QMenu(tr("Export as 2D ..."),this);
-       oo->addAction(tr("PNG"), mgl, SLOT(exportPNG()),Qt::ALT+Qt::Key_P);
-       oo->addAction(tr("solid PNG"), mgl, SLOT(exportPNGs()),Qt::ALT+Qt::Key_F);
-       oo->addAction(tr("JPEG"), mgl, SLOT(exportJPG()),Qt::ALT+Qt::Key_J);
-       oo->addAction(tr("bitmap EPS"), mgl, SLOT(exportBPS()));
-       oo->addAction(tr("vector EPS"), mgl, SLOT(exportEPS()),Qt::ALT+Qt::Key_E);
-       oo->addAction(tr("SVG"), mgl, SLOT(exportSVG()),Qt::ALT+Qt::Key_S);
-       oo->addAction(tr("LaTeX"), mgl, SLOT(exportTEX()),Qt::ALT+Qt::Key_L);
+       oo = new QMenu(_("Export as 2D ..."),this);
+       oo->addAction(_("PNG"), mgl, SLOT(exportPNG()),Qt::ALT+Qt::Key_P);
+       oo->addAction(_("solid PNG"), mgl, SLOT(exportPNGs()),Qt::ALT+Qt::Key_F);
+       oo->addAction(_("JPEG"), mgl, SLOT(exportJPG()),Qt::ALT+Qt::Key_J);
+       oo->addAction(_("bitmap EPS"), mgl, SLOT(exportBPS()));
+       oo->addAction(_("vector EPS"), mgl, SLOT(exportEPS()),Qt::ALT+Qt::Key_E);
+       oo->addAction(_("SVG"), mgl, SLOT(exportSVG()),Qt::ALT+Qt::Key_S);
+       oo->addAction(_("LaTeX"), mgl, SLOT(exportTEX()),Qt::ALT+Qt::Key_L);
 
        o->addMenu(oo);         popup->addMenu(oo);
-       oo = new QMenu(tr("Export as 3D ..."),this);
-       oo->addAction(tr("MGLD"), mgl, SLOT(exportMGLD()),Qt::ALT+Qt::Key_M);
-       oo->addAction(tr("PRC"), mgl, SLOT(exportPRC()),Qt::ALT+Qt::Key_D);
-       oo->addAction(tr("OBJ"), mgl, SLOT(exportOBJ()),Qt::ALT+Qt::Key_O);
-       oo->addAction(tr("STL"), mgl, SLOT(exportSTL()));
-       oo->addAction(tr("XYZ"), mgl, SLOT(exportXYZ()));
-//     oo->addAction(tr("X3D"), QMGL, SLOT(exportX3D()),Qt::ALT+Qt::Key_X);    // TODO: Add later
+       oo = new QMenu(_("Export as 3D ..."),this);
+       oo->addAction(_("MGLD"), mgl, SLOT(exportMGLD()),Qt::ALT+Qt::Key_M);
+       oo->addAction(_("PRC"), mgl, SLOT(exportPRC()),Qt::ALT+Qt::Key_D);
+       oo->addAction(_("OBJ"), mgl, SLOT(exportOBJ()),Qt::ALT+Qt::Key_O);
+       oo->addAction(_("STL"), mgl, SLOT(exportSTL()));
+       oo->addAction(_("XYZ"), mgl, SLOT(exportXYZ()));
+//     oo->addAction(_("X3D"), QMGL, SLOT(exportX3D()),Qt::ALT+Qt::Key_X);     // TODO: Add later
        o->addMenu(oo);         popup->addMenu(oo);
 }
 //-----------------------------------------------------------------------------
@@ -499,83 +499,83 @@ void PlotPanel::toolLeft(QBoxLayout *h)
        t->setAllowedAreas(Qt::LeftToolBarArea);        t->setOrientation(Qt::Vertical);
 
        // zooming menu
-       oo = o->addMenu(tr("Zoom/move"));
-       a = new QAction(QPixmap(":/png/arrow-left.png"), tr("Move left"), this);
+       oo = o->addMenu(_("Zoom/move"));
+       a = new QAction(QPixmap(":/png/arrow-left.png"), _("Move left"), this);
        connect(a, SIGNAL(triggered()), mgl, SLOT(shiftLeft()));
        a->setShortcut(Qt::ALT+Qt::Key_Left);
-       a->setToolTip(tr("Move graphics left by 1/3 of its width."));
+       a->setToolTip(_("Move graphics left by 1/3 of its width."));
        oo->addAction(a);       t->addAction(a);
 
-       a = new QAction(QPixmap(":/png/arrow-up.png"), tr("Move up"), this);
+       a = new QAction(QPixmap(":/png/arrow-up.png"), _("Move up"), this);
        connect(a, SIGNAL(triggered()), mgl, SLOT(shiftUp()));
        a->setShortcut(Qt::ALT+Qt::Key_Up);
-       a->setToolTip(tr("Move graphics up by 1/3 of its height."));
+       a->setToolTip(_("Move graphics up by 1/3 of its height."));
        oo->addAction(a);       t->addAction(a);
 
-       a = new QAction(QPixmap(":/png/zoom-in.png"), tr("Zoom in"), this);
+       a = new QAction(QPixmap(":/png/zoom-in.png"), _("Zoom in"), this);
        connect(a, SIGNAL(triggered()), mgl, SLOT(zoomIn()));
        a->setShortcut(Qt::ALT+Qt::Key_Equal);
-       a->setToolTip(tr("Zoom in graphics."));
+       a->setToolTip(_("Zoom in graphics."));
        oo->addAction(a);       t->addAction(a);
 
-       a = new QAction(QPixmap(":/png/zoom-out.png"), tr("Zoom out"), this);
+       a = new QAction(QPixmap(":/png/zoom-out.png"), _("Zoom out"), this);
        connect(a, SIGNAL(triggered()), mgl, SLOT(zoomOut()));
        a->setShortcut(Qt::ALT+Qt::Key_Minus);
-       a->setToolTip(tr("Zoom out graphics."));
+       a->setToolTip(_("Zoom out graphics."));
        oo->addAction(a);       t->addAction(a);
 
-       a = new QAction(QPixmap(":/png/arrow-down.png"), tr("Move down"), this);
+       a = new QAction(QPixmap(":/png/arrow-down.png"), _("Move down"), this);
        connect(a, SIGNAL(triggered()), mgl, SLOT(shiftDown()));
        a->setShortcut(Qt::ALT+Qt::Key_Down);
-       a->setToolTip(tr("Move graphics up down 1/3 of its height."));
+       a->setToolTip(_("Move graphics up down 1/3 of its height."));
        oo->addAction(a);       t->addAction(a);
 
-       a = new QAction(QPixmap(":/png/arrow-right.png"), tr("Move right"), this);
+       a = new QAction(QPixmap(":/png/arrow-right.png"), _("Move right"), this);
        connect(a, SIGNAL(triggered()), mgl, SLOT(shiftRight()));
        a->setShortcut(Qt::ALT+Qt::Key_Right);
-       a->setToolTip(tr("Move graphics right by 1/3 of its width."));
+       a->setToolTip(_("Move graphics right by 1/3 of its width."));
        oo->addAction(a);       t->addAction(a);
 
        // rotate menu
-       oo = o->addMenu(tr("Rotate"));
-       a = new QAction(QPixmap(":/png/object-rotate-up.png"), tr("Rotate up"), this);
+       oo = o->addMenu(_("Rotate"));
+       a = new QAction(QPixmap(":/png/object-rotate-up.png"), _("Rotate up"), this);
        a->setShortcut(Qt::SHIFT+Qt::META+Qt::Key_Up);
        connect(a, SIGNAL(triggered()), tet, SLOT(stepUp()));   oo->addAction(a);
-       a->setToolTip(tr("Increase \\theta angle by 10 degrees."));
-       a = new QAction(QPixmap(":/png/object-rotate-down.png"), tr("Rotate down"), this);
+       a->setToolTip(_("Increase \\theta angle by 10 degrees."));
+       a = new QAction(QPixmap(":/png/object-rotate-down.png"), _("Rotate down"), this);
        a->setShortcut(Qt::SHIFT+Qt::META+Qt::Key_Down);
        connect(a, SIGNAL(triggered()), tet, SLOT(stepDown())); oo->addAction(a);
-       a->setToolTip(tr("Decrease \\theta angle by 10 degrees."));
-       a = new QAction(QPixmap(":/png/object-rotate-left.png"), tr("Rotate left"), this);
+       a->setToolTip(_("Decrease \\theta angle by 10 degrees."));
+       a = new QAction(QPixmap(":/png/object-rotate-left.png"), _("Rotate left"), this);
        a->setShortcut(Qt::SHIFT+Qt::META+Qt::Key_Right);
        connect(a, SIGNAL(triggered()), phi, SLOT(stepUp()));   oo->addAction(a);
-       a->setToolTip(tr("Increase \\phi angle by 10 degrees."));
-       a = new QAction(QPixmap(":/png/object-rotate-right.png"), tr("Rotate right"), this);
+       a->setToolTip(_("Increase \\phi angle by 10 degrees."));
+       a = new QAction(QPixmap(":/png/object-rotate-right.png"), _("Rotate right"), this);
        a->setShortcut(Qt::SHIFT+Qt::META+Qt::Key_Left);
        connect(a, SIGNAL(triggered()), phi, SLOT(stepDown())); oo->addAction(a);
-       a->setToolTip(tr("Decrease \\phi angle by 10 degrees."));
+       a->setToolTip(_("Decrease \\phi angle by 10 degrees."));
 
        // animation menu
-       oo = o->addMenu(tr("Animation"));
-       a = new QAction(QPixmap(":/png/media-seek-forward.png"), tr("Next slide"), this);
+       oo = o->addMenu(_("Animation"));
+       a = new QAction(QPixmap(":/png/media-seek-forward.png"), _("Next slide"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(nextSlide()));
        a->setShortcut(Qt::CTRL+Qt::Key_Period);
-       a->setToolTip(tr("Show next slide (Ctrl+.)."));
+       a->setToolTip(_("Show next slide (Ctrl+.)."));
        oo->addAction(a);       t->addAction(a);
 
-       a = new QAction(QPixmap(":/png/media-playback-start.png"), tr("Slideshow"), this);
+       a = new QAction(QPixmap(":/png/media-playback-start.png"), _("Slideshow"), this);
        a->setCheckable(true);
        connect(a, SIGNAL(toggled(bool)), this, SLOT(animStart(bool)));
        connect(this, SIGNAL(animSwitch(bool)),a,SLOT(setChecked(bool)));
-       a->setToolTip(tr("Run slideshow (Ctrl+F5). If no parameter specified\nthen the dialog with slideshow options will appear."));
+       a->setToolTip(_("Run slideshow (Ctrl+F5). If no parameter specified\nthen the dialog with slideshow options will appear."));
        a->setShortcut(Qt::CTRL+Qt::Key_F5);    oo->addAction(a);       t->addAction(a);
 
-       oo->addAction(tr("Setup show"), this, SLOT(animSetup()), Qt::CTRL+Qt::Key_W);
+       oo->addAction(_("Setup show"), this, SLOT(animSetup()), Qt::CTRL+Qt::Key_W);
 
-       a = new QAction(QPixmap(":/png/media-seek-backward.png"), tr("Prev slide"), this);
+       a = new QAction(QPixmap(":/png/media-seek-backward.png"), _("Prev slide"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(prevSlide()));
        a->setShortcut(Qt::CTRL+Qt::Key_Comma);
-       a->setToolTip(tr("Show previous slide (Ctrl+,)."));
+       a->setToolTip(_("Show previous slide (Ctrl+,)."));
        oo->addAction(a);       t->addAction(a);
 }
 //-----------------------------------------------------------------------------
index 09ddf5c262f51ea342e7d03f99637d0b65305c5d..b119340fe2f6b3dbc07afd151f362ca79e79c36e 100644 (file)
@@ -53,11 +53,11 @@ extern bool mglDotsRefr;
 extern bool mglWheelZoom;\r
 int defWidth, defHeight;\r
 QString pathFont;\r
-QString lang[]={"","ru"};\r
+QString lang[]={"en","ru","es"};\r
 //-----------------------------------------------------------------------------\r
 PropDialog::PropDialog(QWidget *parent) : QDialog(parent)\r
 {\r
-       setWindowTitle(tr("UDAV - Properties"));\r
+       setWindowTitle(_("UDAV - Properties"));\r
        QHBoxLayout *h;\r
        QVBoxLayout *v;\r
        QLabel *l;\r
@@ -65,10 +65,10 @@ PropDialog::PropDialog(QWidget *parent) : QDialog(parent)
 \r
        v = new QVBoxLayout(this);\r
        h = new QHBoxLayout();          v->addLayout(h);\r
-       lbl = new QLabel(tr("Current font"), this);     h->addWidget(lbl);\r
+       lbl = new QLabel(_("Current font"), this);      h->addWidget(lbl);\r
        lbl->setFont(QFont(defFontFamily, defFontSize));\r
        h->addStretch(1);       defFont = QFont(defFontFamily, defFontSize);\r
-       b = new QPushButton(tr("Change font"), this);   h->addWidget(b);\r
+       b = new QPushButton(_("Change font"), this);    h->addWidget(b);\r
        connect(b, SIGNAL(clicked()),this, SLOT(setF()));\r
 \r
        cc[0]=mglColorScheme[0];        cc[1]=mglColorScheme[1];\r
@@ -77,37 +77,37 @@ PropDialog::PropDialog(QWidget *parent) : QDialog(parent)
        cc[6]=mglColorScheme[6];        cc[7]=mglColorScheme[7];\r
        cc[8]=mglColorScheme[8];        cc[9]=mglColorScheme[9];\r
        QPixmap pic(16,16);\r
-       l = new QLabel(tr("Setup colors for:"), this);  v->addWidget(l, Qt::AlignHCenter);\r
+       l = new QLabel(_("Setup colors for:"), this);   v->addWidget(l, Qt::AlignHCenter);\r
        QGridLayout *g = new QGridLayout();             v->addLayout(g);\r
-       pic.fill(cc[0]);        cb[0] = new QPushButton(pic, tr("Comments"), this);\r
+       pic.fill(cc[0]);        cb[0] = new QPushButton(pic, _("Comments"), this);\r
        connect(cb[0], SIGNAL(clicked()),this, SLOT(setC0()));\r
        g->addWidget(cb[0], 0, 0);\r
-       pic.fill(cc[1]);        cb[1] = new QPushButton(pic, tr("Strings"), this);\r
+       pic.fill(cc[1]);        cb[1] = new QPushButton(pic, _("Strings"), this);\r
        connect(cb[1], SIGNAL(clicked()),this, SLOT(setC1()));\r
        g->addWidget(cb[1], 0, 1);\r
-       pic.fill(cc[2]);        cb[2] = new QPushButton(pic, tr("Keywords"), this);\r
+       pic.fill(cc[2]);        cb[2] = new QPushButton(pic, _("Keywords"), this);\r
        connect(cb[2], SIGNAL(clicked()),this, SLOT(setC2()));\r
        g->addWidget(cb[2], 0, 2);\r
-       pic.fill(cc[3]);        cb[3] = new QPushButton(pic, tr("Options"), this);\r
+       pic.fill(cc[3]);        cb[3] = new QPushButton(pic, _("Options"), this);\r
        connect(cb[3], SIGNAL(clicked()),this, SLOT(setC3()));\r
        g->addWidget(cb[3], 1, 0);\r
-       pic.fill(cc[4]);        cb[4] = new QPushButton(pic, tr("Suffixes"), this);\r
+       pic.fill(cc[4]);        cb[4] = new QPushButton(pic, _("Suffixes"), this);\r
        connect(cb[4], SIGNAL(clicked()),this, SLOT(setC4()));\r
        g->addWidget(cb[4], 1, 1);\r
-       pic.fill(cc[5]);        cb[5] = new QPushButton(pic, tr("Numbers"), this);\r
+       pic.fill(cc[5]);        cb[5] = new QPushButton(pic, _("Numbers"), this);\r
        connect(cb[5], SIGNAL(clicked()),this, SLOT(setC5()));\r
        g->addWidget(cb[5], 1, 2);\r
-       pic.fill(cc[6]);        cb[6] = new QPushButton(pic, tr("AutoKey"), this);\r
+       pic.fill(cc[6]);        cb[6] = new QPushButton(pic, _("AutoKey"), this);\r
        connect(cb[6], SIGNAL(clicked()),this, SLOT(setC6()));\r
        g->addWidget(cb[6], 2, 0);\r
-       pic.fill(cc[7]);        cb[7] = new QPushButton(pic, tr("FlowKey"), this);\r
+       pic.fill(cc[7]);        cb[7] = new QPushButton(pic, _("FlowKey"), this);\r
        connect(cb[7], SIGNAL(clicked()),this, SLOT(setC7()));\r
        g->addWidget(cb[7], 2, 1);\r
-       pic.fill(cc[9]);        cb[9] = new QPushButton(pic, tr("CurrLine"), this);\r
+       pic.fill(cc[9]);        cb[9] = new QPushButton(pic, _("CurrLine"), this);\r
        connect(cb[9], SIGNAL(clicked()),this, SLOT(setC9()));\r
        g->addWidget(cb[9], 2, 2);\r
 \r
-       l = new QLabel(tr("Path for help files"), this);        v->addWidget(l);\r
+       l = new QLabel(_("Path for help files"), this); v->addWidget(l);\r
        h = new QHBoxLayout();          v->addLayout(h);\r
        hlp = new QLineEdit(pathHelp, this);    h->addWidget(hlp,1);\r
        b = new QPushButton("...", this);               h->addWidget(b,0);\r
@@ -127,7 +127,7 @@ PropDialog::PropDialog(QWidget *parent) : QDialog(parent)
                if(!info.at(i).fileName().contains('_'))\r
                        files << info.at(i).absoluteFilePath();\r
 \r
-       l = new QLabel(tr("Path for user MathGL font files"), this);    v->addWidget(l);\r
+       l = new QLabel(_("Path for user MathGL font files"), this);     v->addWidget(l);\r
        h = new QHBoxLayout();          v->addLayout(h);\r
        fnt = new QComboBox(this);      h->addWidget(fnt,1);\r
        fnt->addItems(files);   fnt->setEditable(true);\r
@@ -136,49 +136,50 @@ PropDialog::PropDialog(QWidget *parent) : QDialog(parent)
        connect(b,SIGNAL(clicked()),this,SLOT(getPathF()));\r
 \r
        h = new QHBoxLayout();          v->addLayout(h);\r
-       l = new QLabel(tr("Language for UDAV"), this);  h->addWidget(l,0);\r
+       l = new QLabel(_("Language for UDAV"), this);   h->addWidget(l,0);\r
        lng = new QComboBox(this);              h->addWidget(lng,1);\r
-       lng->addItem(tr("English"));    lng->addItem(tr("Russian"));\r
+       lng->addItem(_("English"));     lng->addItem(_("Russian"));     lng->addItem(_("Spanish"));\r
 \r
        QSettings settings("udav","UDAV");\r
        settings.setPath(QSettings::IniFormat, QSettings::UserScope, "UDAV");\r
        settings.beginGroup("/UDAV");\r
        QString prev = settings.value("/udavLang", "").toString();\r
        if(prev==lang[1])       lng->setCurrentIndex(1);\r
+       if(prev==lang[2])       lng->setCurrentIndex(2);\r
        defWidth = settings.value("/defWidth", 640).toInt();\r
        defHeight = settings.value("/defHeight", 480).toInt();\r
        settings.endGroup();\r
 \r
        h = new QHBoxLayout();          v->addLayout(h);\r
-       l = new QLabel(tr("Image size"), this); h->addWidget(l,0);\r
+       l = new QLabel(_("Image size"), this);  h->addWidget(l,0);\r
        defW = new QLineEdit(QString::number(defWidth),this);   h->addWidget(defW,1);\r
        l = new QLabel("x", this);      h->addWidget(l,0);\r
        defH = new QLineEdit(QString::number(defHeight),this);  h->addWidget(defH,1);\r
 \r
-       run = new QCheckBox(tr("Automatically execute script after loading"), this);\r
+       run = new QCheckBox(_("Automatically execute script after loading"), this);\r
        run->setChecked(mglAutoExecute);        v->addWidget(run);\r
-       edt = new QCheckBox(tr("Place editor at top"), this);\r
+       edt = new QCheckBox(_("Place editor at top"), this);\r
        edt->setChecked(editPosBottom); v->addWidget(edt);\r
-       load = new QCheckBox(tr("Load script to new window"), this);\r
+       load = new QCheckBox(_("Load script to new window"), this);\r
        load->setChecked(loadInNewWnd); v->addWidget(load);\r
-       save = new QCheckBox(tr("Automatically save before redrawing (F5)"), this);\r
+       save = new QCheckBox(_("Automatically save before redrawing (F5)"), this);\r
        save->setChecked(mglAutoSave);  v->addWidget(save);\r
-//     pure = new QCheckBox(tr("Disable face drawing (faster) for mouse rotation/shift/zoom."), this);\r
+//     pure = new QCheckBox(_("Disable face drawing (faster) for mouse rotation/shift/zoom."), this);\r
 //     pure->setChecked(mglAutoPure);  v->addWidget(pure);     pure->setEnabled(false);\r
-       wheel = new QCheckBox(tr("Enable mouse wheel for zooming."), this);\r
+       wheel = new QCheckBox(_("Enable mouse wheel for zooming"), this);\r
        wheel->setChecked(mglWheelZoom);        v->addWidget(wheel);\r
-       cmpl = new QCheckBox(tr("Enable keywords completition"), this);\r
+       cmpl = new QCheckBox(_("Enable keywords completion"), this);\r
        cmpl->setChecked(mglCompleter); v->addWidget(cmpl);\r
-       high = new QCheckBox(tr("Highlight current object(s)"), this);\r
+       high = new QCheckBox(_("Highlight current object(s)"), this);\r
        high->setChecked(mglHighlight); v->addWidget(high);\r
-       dots = new QCheckBox(tr("Use dots plot for preview"), this);\r
+       dots = new QCheckBox(_("Use dots plot for preview"), this);\r
        dots->setChecked(mglDotsRefr);  v->addWidget(dots);\r
 \r
        h = new QHBoxLayout();          v->addLayout(h);\r
        h->addStretch(1);\r
-       b = new QPushButton(tr("Cancel"), this);        h->addWidget(b);\r
+       b = new QPushButton(_("Cancel"), this); h->addWidget(b);\r
        connect(b, SIGNAL(clicked()),this, SLOT(reject()));\r
-       b = new QPushButton(tr("OK"), this);            h->addWidget(b);\r
+       b = new QPushButton(_("OK"), this);             h->addWidget(b);\r
        connect(b, SIGNAL(clicked()),this, SLOT(applyChanges()));\r
        b->setDefault(true);\r
 }\r
@@ -188,14 +189,14 @@ PropDialog::~PropDialog() {}
 void PropDialog::getPathH()\r
 {\r
        QString str = QFileDialog::getExistingDirectory(this,\r
-                               tr("UDAV - Insert filename"), hlp->text());\r
+                               _("UDAV - Insert filename"), hlp->text());\r
        if(!str.isEmpty())      hlp->setText(str+'/');\r
 }\r
 //-----------------------------------------------------------------------------\r
 void PropDialog::getPathF()\r
 {\r
-       QString str = QFileDialog::getOpenFileName(this, tr("UDAV - Insert filename"),\r
-                                       fnt->lineEdit()->text(), tr("Font files (*.vfm)"));\r
+       QString str = QFileDialog::getOpenFileName(this, _("UDAV - Insert filename"),\r
+                                       fnt->lineEdit()->text(), _("Font files (*.vfm)"));\r
 //     if(str.contains(".vfm"))        str = str.left(str.length()-4);\r
        if(!str.isEmpty())      fnt->lineEdit()->setText(str);\r
 }\r
@@ -275,7 +276,13 @@ void PropDialog::applyChanges()
        if(cur>=0 && prev!=lang[cur])\r
        {\r
                settings.setValue("/udavLang", lang[lng->currentIndex()]);\r
-               QMessageBox::critical(this,tr("UDAV - Properties"),tr("You have to restart UDAV for applying the cahnges."));\r
+#if WIN32\r
+               const char *loc[]={"C.UTF8",    "ru_RU.cp1251", "es_ES.utf8",   ""};\r
+#else\r
+               const char *loc[]={"C.UTF8",    "ru_RU.utf8",   "es_ES.utf8",   ""};\r
+#endif\r
+               mgl_textdomain(NULL,loc[cur]);\r
+               QMessageBox::critical(this,_("UDAV - Properties"),_("You need to restart UDAV for applying the changes."));\r
        }\r
        settings.setValue("/defWidth", defWidth);\r
        settings.setValue("/defHeight", defHeight);\r
index 1534a49ea1a88c1ada869d4023e396d55b52dd00..8426e9dc231bb9416e0be6578d80fb34a024186d 100644 (file)
@@ -31,7 +31,7 @@ QMGLSyntax::QMGLSyntax(QTextEdit *textEdit) : QSyntaxHighlighter(textEdit)    {}
 //-----------------------------------------------------------------------------\r
 void QMGLSyntax::highlightBlock(const QString &text)\r
 {\r
-       register int i, j, m = text.length(),s=0;\r
+       int i, j, m = text.length(),s=0;\r
        bool arg = false, nl = true;\r
        QString num("+-.0123456789:");\r
        i=0;\r
@@ -50,7 +50,8 @@ void QMGLSyntax::highlightBlock(const QString &text)
        }\r
        for(;i<m;i++)                           // highlight paragraph\r
        {\r
-               if(text[i]=='(')        s++;    if(text[i]==')')        s--;\r
+               if(text[i]=='(')        s++;\r
+               if(text[i]==')')        s--;\r
                if(text[i]==' ' || text[i]=='\t')       continue;\r
                else if(text[i]=='#')   // comment\r
                {       setFormat(i,m-i,mglColorScheme[0]);     break;  }\r
@@ -100,9 +101,9 @@ void QMGLSyntax::highlightBlock(const QString &text)
                        setFormat(i,1,mglColorScheme[5]);\r
                else            // number as its symbolic id\r
                {\r
-                       const char *o[]={"nan","inf","pi","on","off"};\r
-                       int l[5] = {3, 3, 2, 2, 3};\r
-                       for(j=0;j<5;j++)\r
+                       const char *o[6]={"nan","inf","pi","on","off","all"};\r
+                       int l[6] = {3, 3, 2, 2, 3, 3};\r
+                       for(j=0;j<6;j++)\r
                                if(text.indexOf(o[j],i)==i && (i+l[j]==text.length() || text[i+l[j]].isSpace()))\r
                                        setFormat(i,l[j],mglColorScheme[5]);\r
                }\r
index a730c62c57037913cac038575ef3e999df7a3bd1..0494c8f0091ccd4b8790d8f31de441d91a8d799d 100644 (file)
 #include <QTextStream>
 //-----------------------------------------------------------------------------
 #include "setup_dlg.h"
+#include "mgl2/define.h"
+#undef sprintf // fix libintl bug of defining sprintf
 void fillColors(QComboBox *cb);
 //-----------------------------------------------------------------------------
 SetupDialog::SetupDialog(QWidget *parent) : QDialog(parent)
 {
-       setWindowTitle(tr("UDAV - Setup plot"));
+       setWindowTitle(_("UDAV - Setup plot"));
        QWidget *p;
        QGridLayout *g;
        QLabel *l;
@@ -43,87 +45,87 @@ SetupDialog::SetupDialog(QWidget *parent) : QDialog(parent)
        // line style
        p = new QWidget(this);
        g = new QGridLayout(p); g->setAlignment(Qt::AlignTop);
-       l = new QLabel(tr("X axis"), p);        g->addWidget(l,0,1);
-       l = new QLabel(tr("Y axis"), p);        g->addWidget(l,0,2);
-       l = new QLabel(tr("Z axis"), p);        g->addWidget(l,0,3);
-       l = new QLabel(tr("C axis"), p);        g->addWidget(l,0,4);
-       l = new QLabel(tr("Minimal"), p);       g->addWidget(l,1,0);
+       l = new QLabel(_("X axis"), p); g->addWidget(l,0,1);
+       l = new QLabel(_("Y axis"), p); g->addWidget(l,0,2);
+       l = new QLabel(_("Z axis"), p); g->addWidget(l,0,3);
+       l = new QLabel(_("C axis"), p); g->addWidget(l,0,4);
+       l = new QLabel(_("Minimal"), p);        g->addWidget(l,1,0);
        xmin = new QLineEdit(p);        g->addWidget(xmin,1,1);
        ymin = new QLineEdit(p);        g->addWidget(ymin,1,2);
        zmin = new QLineEdit(p);        g->addWidget(zmin,1,3);
        cmin = new QLineEdit(p);        g->addWidget(cmin,1,4);
-       l = new QLabel(tr("Maximal"), p);       g->addWidget(l,2,0);
+       l = new QLabel(_("Maximal"), p);        g->addWidget(l,2,0);
        xmax = new QLineEdit(p);        g->addWidget(xmax,2,1);
        ymax = new QLineEdit(p);        g->addWidget(ymax,2,2);
        zmax = new QLineEdit(p);        g->addWidget(zmax,2,3);
        cmax = new QLineEdit(p);        g->addWidget(cmax,2,4);
-       l = new QLabel(tr("Origin"), p);        g->addWidget(l,3,0);
+       l = new QLabel(_("Origin"), p); g->addWidget(l,3,0);
        xorg = new QLineEdit(p);        g->addWidget(xorg,3,1);
        yorg = new QLineEdit(p);        g->addWidget(yorg,3,2);
        zorg = new QLineEdit(p);        g->addWidget(zorg,3,3);
-       l = new QLabel(tr("Label"), p); g->addWidget(l,4,0);
+       l = new QLabel(_("Label"), p);  g->addWidget(l,4,0);
        xlbl = new QLineEdit(p);        g->addWidget(xlbl,4,1);
        ylbl = new QLineEdit(p);        g->addWidget(ylbl,4,2);
        zlbl = new QLineEdit(p);        g->addWidget(zlbl,4,3);
-       l = new QLabel(tr("at position"), p);   g->addWidget(l,5,0);
+       l = new QLabel(_("at position"), p);    g->addWidget(l,5,0);
        QStringList lpos;
-       lpos.append(tr("at minimum"));  lpos += tr("at center");        lpos += tr("at maximum");
+       lpos.append(_("at minimum"));   lpos += _("at center"); lpos += _("at maximum");
        xpos = new QComboBox(p);        g->addWidget(xpos,5,1); xpos->addItems(lpos);
        ypos = new QComboBox(p);        g->addWidget(ypos,5,2); ypos->addItems(lpos);
        zpos = new QComboBox(p);        g->addWidget(zpos,5,3); zpos->addItems(lpos);
-       l = new QLabel(tr("Ticks"), p); g->addWidget(l,6,0);
+       l = new QLabel(_("Ticks"), p);  g->addWidget(l,6,0);
        xtck = new QLineEdit(p);        g->addWidget(xtck,6,1);
        ytck = new QLineEdit(p);        g->addWidget(ytck,6,2);
        ztck = new QLineEdit(p);        g->addWidget(ztck,6,3);
-       l = new QLabel(tr("SubTicks"), p);      g->addWidget(l,7,0);
+       l = new QLabel(_("SubTicks"), p);       g->addWidget(l,7,0);
        xsub = new QLineEdit(p);        g->addWidget(xsub,7,1);
        ysub = new QLineEdit(p);        g->addWidget(ysub,7,2);
        zsub = new QLineEdit(p);        g->addWidget(zsub,7,3);
-       l = new QLabel(tr("Start"), p); g->addWidget(l,8,0);
+       l = new QLabel(_("Start"), p);  g->addWidget(l,8,0);
        xort = new QLineEdit(p);        g->addWidget(xort,8,1);
        yort = new QLineEdit(p);        g->addWidget(yort,8,2);
        zort = new QLineEdit(p);        g->addWidget(zort,8,3);
-       l = new QLabel(tr("Template"), p);      g->addWidget(l,9,0);
+       l = new QLabel(_("Template"), p);       g->addWidget(l,9,0);
        xtt = new QLineEdit(p); g->addWidget(xtt,9,1);
        ytt = new QLineEdit(p); g->addWidget(ytt,9,2);
        ztt = new QLineEdit(p); g->addWidget(ztt,9,3);
        ctt = new QLineEdit(p); g->addWidget(ctt,9,4);
-       l = new QLabel(tr("AlphaDef"), p);      g->addWidget(l,10,0);
+       l = new QLabel(_("AlphaDef"), p);       g->addWidget(l,10,0);
        aldef = new QLineEdit(p);       g->addWidget(aldef,11,0);
-       l = new QLabel(tr("Ambient"), p);       g->addWidget(l,10,1);
+       l = new QLabel(_("Ambient"), p);        g->addWidget(l,10,1);
        amb = new QLineEdit(p); g->addWidget(amb,11,1);
-       l = new QLabel(tr("BaseWidth"), p);     g->addWidget(l,10,2);
+       l = new QLabel(_("BaseWidth"), p);      g->addWidget(l,10,2);
        basew = new QLineEdit(p);       g->addWidget(basew,11,2);
-       l = new QLabel(tr("MeshNum"), p);       g->addWidget(l,10,3);
+       l = new QLabel(_("MeshNum"), p);        g->addWidget(l,10,3);
        mesh = new QLineEdit(p);        g->addWidget(mesh,11,3);
-       l = new QLabel(tr("AxialDir"), p);      g->addWidget(l,10,4);
+       l = new QLabel(_("AxialDir"), p);       g->addWidget(l,10,4);
        axial = new QComboBox(p);       g->addWidget(axial,11,4);
        axial->addItem("none"); axial->addItem("x");
        axial->addItem("y");    axial->addItem("z");
-       l = new QLabel(tr("Font"), p);  g->addWidget(l,12,0);
+       l = new QLabel(_("Font"), p);   g->addWidget(l,12,0);
        font = new QLineEdit(p);        g->addWidget(font,13,0);
-       l = new QLabel(tr("FontSize"), p);      g->addWidget(l,12,1);
+       l = new QLabel(_("FontSize"), p);       g->addWidget(l,12,1);
        fsize = new QLineEdit(p);       g->addWidget(fsize,13,1);
-       alpha = new QCheckBox(tr("Alpha on"),p);        g->addWidget(alpha, 13,2);
-       light = new QCheckBox(tr("Light on"),p);        g->addWidget(light, 13,3);
-       rotate = new QCheckBox(tr("No text rotation"),p);       g->addWidget(rotate, 13,4);
-       tab->addTab(p, tr("General settings"));
+       alpha = new QCheckBox(_("Alpha"),p);    g->addWidget(alpha, 13,2);
+       light = new QCheckBox(_("Light"),p);    g->addWidget(light, 13,3);
+       rotate = new QCheckBox(_("No text rotation"),p);        g->addWidget(rotate, 13,4);
+       tab->addTab(p, _("General setup"));
 
        p = new QWidget(this);
        g = new QGridLayout(p); g->setAlignment(Qt::AlignTop);
-       l = new QLabel(tr("ID"), p);    g->addWidget(l,0,0);
-       l = new QLabel(tr("State"), p); g->addWidget(l,0,1);
-       l = new QLabel(tr("X pos"), p); g->addWidget(l,0,2);
-       l = new QLabel(tr("Y pos"), p); g->addWidget(l,0,3);
-       l = new QLabel(tr("Z pos"), p); g->addWidget(l,0,4);
-       l = new QLabel(tr("Color"), p); g->addWidget(l,0,5);
-       l = new QLabel(tr("Brightness"), p);    g->addWidget(l,0,6);
+       l = new QLabel(_("ID"), p);     g->addWidget(l,0,0);
+       l = new QLabel(_("State"), p);  g->addWidget(l,0,1);
+       l = new QLabel(_("X pos"), p);  g->addWidget(l,0,2);
+       l = new QLabel(_("Y pos"), p);  g->addWidget(l,0,3);
+       l = new QLabel(_("Z pos"), p);  g->addWidget(l,0,4);
+       l = new QLabel(_("Color"), p);  g->addWidget(l,0,5);
+       l = new QLabel(_("Brightness"), p);     g->addWidget(l,0,6);
        char s[3] = "0:";
        for(int i=0;i<10;i++)
        {
                s[0] = char(i+'0');
                l = new QLabel(s, p);   g->addWidget(l,i+1,0);
-               slight[i] = new QCheckBox(tr("on"),p);  g->addWidget(slight[i], i+1, 1);
+               slight[i] = new QCheckBox(_("on"),p);   g->addWidget(slight[i], i+1, 1);
                xlight[i] = new QLineEdit(p);   g->addWidget(xlight[i], i+1, 2);
                ylight[i] = new QLineEdit(p);   g->addWidget(ylight[i], i+1, 3);
                zlight[i] = new QLineEdit(p);   g->addWidget(zlight[i], i+1, 4);
@@ -131,18 +133,18 @@ SetupDialog::SetupDialog(QWidget *parent) : QDialog(parent)
                fillColors(clight[i]);
                blight[i] = new QLineEdit(p);   g->addWidget(blight[i], i+1, 6);
        }
-       tab->addTab(p, tr("Light settings"));
+       tab->addTab(p, _("Light settings"));
 
        QVBoxLayout *v = new QVBoxLayout(this); v->addWidget(tab);
        QHBoxLayout *h = new QHBoxLayout();             v->addLayout(h);
-       l = new QLabel(tr("Template name"), this);              h->addWidget(l);
+       l = new QLabel(_("Template name"), this);               h->addWidget(l);
        fname = new QLineEdit("template.mgl", this);    h->addWidget(fname);
        h->addStretch(1);
-       b = new QPushButton(tr("Save"), this);          h->addWidget(b);
+       b = new QPushButton(_("Save"), this);           h->addWidget(b);
        connect(b, SIGNAL(clicked()),this, SLOT(saveTmpl()));
-       b = new QPushButton(tr("Cancel"), this);        h->addWidget(b);
+       b = new QPushButton(_("Cancel"), this); h->addWidget(b);
        connect(b, SIGNAL(clicked()),this, SLOT(reject()));
-       b = new QPushButton(tr("To script"), this);     h->addWidget(b);
+       b = new QPushButton(_("To script"), this);      h->addWidget(b);
        connect(b, SIGNAL(clicked()),this, SLOT(toScript()));
        b->setDefault(true);
 }
@@ -154,11 +156,11 @@ void SetupDialog::saveTmpl()
        if(!convert())  return;
        QFile f(fname->text());
        if(!f.open(QIODevice::WriteOnly))
-               QMessageBox::warning(this, tr("UDAV - Save template"), tr("Could not write to file"), QMessageBox::Ok, 0);
+               QMessageBox::warning(this, _("UDAV - Save template"), _("Could not write to file"), QMessageBox::Ok, 0);
        else
        {
                QTextStream t(&f);      t << res;       f.close();
-               QMessageBox::information(this, tr("UDAV - Save template"), tr("Template saved"), QMessageBox::Ok);
+               QMessageBox::information(this, _("UDAV - Save template"), _("Template saved"), QMessageBox::Ok);
                emit putText(QString("#call %1").arg(fname->text()));
        }
 
@@ -185,7 +187,7 @@ bool SetupDialog::convert()
                if(!slight[i]->isChecked())     continue;
                if(xlight[i]->text().isEmpty() || ylight[i]->text().isEmpty() || zlight[i]->text().isEmpty())
                {
-                       QMessageBox::information(this, tr("UDAV - Setup plot"), tr("Light position should be filled. Ignore it."), QMessageBox::Ok);
+                       QMessageBox::information(this, _("UDAV - Setup plot"), _("Light position should be filled. Ignore it."), QMessageBox::Ok);
                        continue;
                }
                x1=xlight[i]->text().toDouble();        y1=ylight[i]->text().toDouble();
index 5b501a90c1f55f1a3153c452ecc9a2d2d0305b4d..6e365a44d982872b01489321487cd2f28cfe0011 100644 (file)
@@ -21,6 +21,9 @@
 #define SETUPDIALOG_H
 //-----------------------------------------------------------------------------
 #include <qdialog.h>
+#if defined(_MSC_VER)
+#include <mgl2/define.h>
+#endif
 class QLineEdit;
 class QCheckBox;
 class QComboBox;
index f9e0c296acd5ad38b433b74100727d1330d2d196..1dc52c50f4d8b52af8725dc06e65766e67feeba2 100644 (file)
@@ -33,6 +33,7 @@
 #include <mgl2/mgl.h>\r
 //-----------------------------------------------------------------------------\r
 #include "style_dlg.h"\r
+#include "mgl2/define.h"\r
 void fillColors(QComboBox *cb);\r
 void fillArrows(QComboBox *cb);\r
 void fillBArrows(QComboBox *cb);\r
@@ -44,7 +45,7 @@ void convertFromGraph(QPixmap &pic, mglGraph *gr, uchar **buf);
 StyleDialog::StyleDialog(QWidget *parent) : QDialog(parent)\r
 {\r
        grBuf = 0;\r
-       setWindowTitle(tr("UDAV - Insert style/scheme"));\r
+       setWindowTitle(_("UDAV - Insert style/scheme"));\r
        QWidget *p;\r
        QHBoxLayout *h;\r
        QVBoxLayout *v, *u, *vv;\r
@@ -57,13 +58,13 @@ StyleDialog::StyleDialog(QWidget *parent) : QDialog(parent)
        p = new QWidget(this);  v = new QVBoxLayout(p);\r
        g = new QGridLayout;    g->setAlignment(Qt::AlignTop);  v->addLayout(g);\r
 //     g->setColStretch(0, 1); g->setColStretch(1, 1); g->setColStretch(2, 1);\r
-       l = new QLabel(tr("Arrow at start"), p);        g->addWidget(l, 0, 0);\r
-       l = new QLabel(tr("Dashing"), p);               g->addWidget(l, 0, 1);\r
-       l = new QLabel(tr("Arrow at end"), p);  g->addWidget(l, 0, 2);\r
+       l = new QLabel(_("Arrow at start"), p); g->addWidget(l, 0, 0);\r
+       l = new QLabel(_("Dashing"), p);                g->addWidget(l, 0, 1);\r
+       l = new QLabel(_("Arrow at end"), p);   g->addWidget(l, 0, 2);\r
        a1 = new QComboBox(p);  g->addWidget(a1, 1, 0); fillArrows(a1);\r
        dash = new QComboBox(p);        g->addWidget(dash, 1, 1);       fillDashes(dash);\r
        a2 = new QComboBox(p);  g->addWidget(a2, 1, 2); fillBArrows(a2);\r
-       l = new QLabel(tr("Color"), p); g->addWidget(l, 2, 0, Qt::AlignRight);\r
+       l = new QLabel(_("Color"), p);  g->addWidget(l, 2, 0, Qt::AlignRight);\r
        cline=new QComboBox(p); g->addWidget(cline, 2, 1);      fillColors(cline);\r
 \r
        nline = new QSlider(p);         g->addWidget(nline, 2, 2);\r
@@ -71,15 +72,15 @@ StyleDialog::StyleDialog(QWidget *parent) : QDialog(parent)
        nline->setTickPosition(QSlider::TicksBothSides);\r
        nline->setTickInterval(1);      nline->setPageStep(2);\r
        nline->setOrientation(Qt::Horizontal);\r
-       \r
-       l = new QLabel(tr("Marks"), p); g->addWidget(l, 3, 0, Qt::AlignRight);\r
+\r
+       l = new QLabel(_("Marks"), p);  g->addWidget(l, 3, 0, Qt::AlignRight);\r
        mark = new QComboBox(p);        g->addWidget(mark, 3, 1);       fillMarkers(mark);\r
-       l = new QLabel(tr("Line width"), p);    g->addWidget(l, 4, 0, Qt::AlignRight);\r
+       l = new QLabel(_("Line width"), p);     g->addWidget(l, 4, 0, Qt::AlignRight);\r
        width = new QSpinBox(p);        g->addWidget(width, 4, 1);\r
        width->setRange(1,9);   width->setValue(1);\r
-       \r
+\r
        v->addStretch(1);\r
-       l = new QLabel(tr("Manual dashing"), p);        v->addWidget(l);\r
+       l = new QLabel(_("Manual dashing"), p); v->addWidget(l);\r
        h = new QHBoxLayout;    v->addLayout(h);        h->setSpacing(1);\r
        for(int i=0;i<16;i++)\r
        {\r
@@ -95,15 +96,15 @@ StyleDialog::StyleDialog(QWidget *parent) : QDialog(parent)
        connect(cline,SIGNAL(activated(int)), this, SLOT(updatePic()));\r
        connect(nline,SIGNAL(valueChanged(int)), this, SLOT(updatePic()));\r
        connect(width,SIGNAL(valueChanged(int)), this, SLOT(updatePic()));\r
-       tab->addTab(p, tr("Line style"));\r
+       tab->addTab(p, _("Line style"));\r
 \r
        // color scheme\r
        p = new QWidget(this);\r
        v = new QVBoxLayout(p); v->setAlignment(Qt::AlignTop);\r
        g = new QGridLayout();  v->addLayout(g);\r
 //     g->setColStretch(0, 1);                 g->setColStretch(1, 1);\r
-       l = new QLabel(tr("Color order"), p);   g->addWidget(l, 0, 0);\r
-       l = new QLabel(tr("Saturation"),p);             g->addWidget(l, 0, 1);\r
+       l = new QLabel(_("Color order"), p);    g->addWidget(l, 0, 0);\r
+       l = new QLabel(_("Saturation"),p);              g->addWidget(l, 0, 1);\r
        for(int i=0;i<7;i++)\r
        {\r
                cc[i] = new QComboBox(p);       g->addWidget(cc[i], i+1, 0);\r
@@ -116,23 +117,23 @@ StyleDialog::StyleDialog(QWidget *parent) : QDialog(parent)
                connect(cc[i],SIGNAL(activated(int)), this, SLOT(updatePic()));\r
                connect(nn[i],SIGNAL(valueChanged(int)), this, SLOT(updatePic()));\r
        }\r
-       swire = new QCheckBox(tr("Wire or mesh plot"),p);       v->addWidget(swire);\r
+       swire = new QCheckBox(_("Wire or mesh plot"),p);        v->addWidget(swire);\r
        g = new QGridLayout();  v->addLayout(g);\r
-       l = new QLabel(tr("Axial direction"), p);       g->addWidget(l, 0, 0, Qt::AlignRight);\r
-       l = new QLabel(tr("Text on contours"), p);      g->addWidget(l, 1, 0, Qt::AlignRight);\r
-       l = new QLabel(tr("Mask for bitmap coloring"), p);      g->addWidget(l, 2, 0, Qt::AlignRight);\r
-       l = new QLabel(tr("Mask rotation angle"), p);   g->addWidget(l, 3, 0, Qt::AlignRight);\r
-       l = new QLabel(tr("Mask size"), p);     g->addWidget(l, 4, 0, Qt::AlignRight);\r
+       l = new QLabel(_("Axial direction"), p);        g->addWidget(l, 0, 0, Qt::AlignRight);\r
+       l = new QLabel(_("Text on contours"), p);       g->addWidget(l, 1, 0, Qt::AlignRight);\r
+       l = new QLabel(_("Mask for bitmap coloring"), p);       g->addWidget(l, 2, 0, Qt::AlignRight);\r
+       l = new QLabel(_("Mask rotation angle"), p);    g->addWidget(l, 3, 0, Qt::AlignRight);\r
+       l = new QLabel(_("Mask size"), p);      g->addWidget(l, 4, 0, Qt::AlignRight);\r
        axial = new QComboBox(p);       g->addWidget(axial, 0, 1);\r
-       axial->addItem(tr("none"));     axial->addItem("x");\r
+       axial->addItem(_("none"));      axial->addItem("x");\r
        axial->addItem("y");    axial->addItem("z");\r
        ctext = new QComboBox(p);       g->addWidget(ctext, 1, 1);\r
-       ctext->addItem(tr("none"));     ctext->addItem(tr("under"));    ctext->addItem(tr("above"));\r
+       ctext->addItem(_("none"));      ctext->addItem(_("under"));     ctext->addItem(_("above"));\r
        mask = new QComboBox(p);        g->addWidget(mask, 2, 1);       fillMasks(mask);\r
        angle = new QComboBox(p);       g->addWidget(angle, 3, 1);\r
-       angle->addItem(tr("none"));     \r
+       angle->addItem(_("none"));\r
        angle->addItem(QString::fromWCharArray(L"+45\xb0"));\r
-       angle->addItem(QString::fromWCharArray(L"-45\xb0"));    \r
+       angle->addItem(QString::fromWCharArray(L"-45\xb0"));\r
        angle->addItem(QString::fromWCharArray(L"90\xb0"));     // \xb0 <-> °\r
        msize = new QSlider(p);         g->addWidget(msize, 4, 1);\r
        msize->setRange(1, 9);          msize->setValue(1);\r
@@ -146,29 +147,29 @@ StyleDialog::StyleDialog(QWidget *parent) : QDialog(parent)
        connect(mask,SIGNAL(activated(int)), this, SLOT(updatePic()));\r
        connect(angle,SIGNAL(activated(int)), this, SLOT(updatePic()));\r
        connect(msize,SIGNAL(valueChanged(int)), this, SLOT(updatePic()));\r
-       tab->addTab(p, tr("Color scheme"));\r
+       tab->addTab(p, _("Color scheme"));\r
 \r
        // font style\r
        p = new QWidget(this);\r
        v = new QVBoxLayout(p); v->setAlignment(Qt::AlignTop);\r
        h = new QHBoxLayout();  v->addLayout(h);\r
        u = new QVBoxLayout();  h->addLayout(u);\r
-       bold = new QCheckBox(tr("Bold style"), p);      u->addWidget(bold);\r
-       ital = new QCheckBox(tr("Italic style"), p);u->addWidget(ital);\r
-       wire = new QCheckBox(tr("Wire style"), p);      u->addWidget(wire);\r
-       uline = new QCheckBox(tr("Underline"), p);      u->addWidget(uline);\r
-       oline = new QCheckBox(tr("Overline"), p);       u->addWidget(oline);\r
-       font_sch = new QCheckBox(tr("Use color scheme"), p);    u->addWidget(font_sch);\r
+       bold = new QCheckBox(_("Bold style"), p);       u->addWidget(bold);\r
+       ital = new QCheckBox(_("Italic style"), p);u->addWidget(ital);\r
+       wire = new QCheckBox(_("Wire style"), p);       u->addWidget(wire);\r
+       uline = new QCheckBox(_("Underline"), p);       u->addWidget(uline);\r
+       oline = new QCheckBox(_("Overline"), p);        u->addWidget(oline);\r
+       font_sch = new QCheckBox(_("Use color scheme"), p);     u->addWidget(font_sch);\r
        u = new QVBoxLayout();  h->addLayout(u);\r
-       l = new QLabel(tr("Text color"), p);            u->addWidget(l);\r
+       l = new QLabel(_("Text color"), p);             u->addWidget(l);\r
        cfont = new QComboBox(p);       fillColors(cfont);      u->addWidget(cfont);\r
        u->addSpacing(6);\r
-       align = new QGroupBox(tr("Text align"), p);     u->addWidget(align);\r
+       align = new QGroupBox(_("Text align"), p);      u->addWidget(align);\r
        vv = new QVBoxLayout(align);            //vv->addSpacing(11);\r
-       rbL = new QRadioButton(tr("left"), align);      vv->addWidget(rbL);\r
-       rbC = new QRadioButton(tr("at center"), align);\r
+       rbL = new QRadioButton(_("left"), align);       vv->addWidget(rbL);\r
+       rbC = new QRadioButton(_("at center"), align);\r
        vv->addWidget(rbC);     rbC->setChecked(true);\r
-       rbR = new QRadioButton(tr("right"), align);     vv->addWidget(rbR);\r
+       rbR = new QRadioButton(_("right"), align);      vv->addWidget(rbR);\r
        connect(bold,SIGNAL(toggled(bool)), this, SLOT(updatePic()));\r
        connect(ital,SIGNAL(toggled(bool)), this, SLOT(updatePic()));\r
        connect(wire,SIGNAL(toggled(bool)), this, SLOT(updatePic()));\r
@@ -179,7 +180,7 @@ StyleDialog::StyleDialog(QWidget *parent) : QDialog(parent)
        connect(rbL,SIGNAL(toggled(bool)), this, SLOT(updatePic()));\r
        connect(rbC,SIGNAL(toggled(bool)), this, SLOT(updatePic()));\r
        connect(rbR,SIGNAL(toggled(bool)), this, SLOT(updatePic()));\r
-       tab->addTab(p, tr("Font style"));\r
+       tab->addTab(p, _("Font style"));\r
        connect(tab,SIGNAL(currentChanged(int)), this, SLOT(updatePic()));\r
 \r
        // hex-mask\r
@@ -192,19 +193,19 @@ StyleDialog::StyleDialog(QWidget *parent) : QDialog(parent)
                g->addWidget(mask_bit[i],7-i/8,i%8);\r
                connect(mask_bit[i],SIGNAL(toggled(bool)), this, SLOT(updatePic()));\r
        }\r
-       tab->addTab(p, tr("Manual mask"));\r
+       tab->addTab(p, _("Manual mask"));\r
 \r
        // dialog itself\r
        v = new QVBoxLayout(this);      v->addWidget(tab);\r
        h = new QHBoxLayout();          v->addLayout(h);\r
-       l = new QLabel(tr("Resulting string"), this);   h->addWidget(l);        h->addStretch(1);\r
+       l = new QLabel(_("Resulting string"), this);    h->addWidget(l);        h->addStretch(1);\r
        pic = new QLabel(this); pic->setMinimumSize(QSize(128,30));     h->addWidget(pic);\r
        res = new QLineEdit(this);      res->setReadOnly(true); v->addWidget(res);\r
 \r
        h = new QHBoxLayout();  v->addLayout(h);        h->addStretch(1);\r
-       b = new QPushButton(tr("Cancel"), this);        h->addWidget(b);\r
+       b = new QPushButton(_("Cancel"), this); h->addWidget(b);\r
        connect(b, SIGNAL(clicked()),this, SLOT(reject()));\r
-       b = new QPushButton(tr("OK"), this);            h->addWidget(b);\r
+       b = new QPushButton(_("OK"), this);             h->addWidget(b);\r
        connect(b, SIGNAL(clicked()),this, SLOT(accept()));\r
        b->setDefault(true);\r
 }\r
@@ -216,36 +217,36 @@ void fillColors(QComboBox *cb)
 {\r
 //     string id :     "wbgrcmylenuqphkWBGRCMYLENUQPH"\r
        QPixmap pic(16,16);\r
-       cb->addItem(QPixmap(none_xpm), QObject::tr("none or default"));\r
-       pic.fill(QColor(255,255,255));  cb->addItem(pic, QObject::tr("w - white"));\r
-       pic.fill(QColor(0,0,255));              cb->addItem(pic, QObject::tr("b - blue"));\r
-       pic.fill(QColor(0,255,0));              cb->addItem(pic, QObject::tr("g - lime"));\r
-       pic.fill(QColor(255,0,0));              cb->addItem(pic, QObject::tr("r - red"));\r
-       pic.fill(QColor(0,255,255));    cb->addItem(pic, QObject::tr("c - cyan"));\r
-       pic.fill(QColor(255,0,255));    cb->addItem(pic, QObject::tr("m - magenta"));\r
-       pic.fill(QColor(255,255,0));    cb->addItem(pic, QObject::tr("y - yellow"));\r
-       pic.fill(QColor(0,255,127));    cb->addItem(pic, QObject::tr("l - springgreen"));\r
-       pic.fill(QColor(127,255,0));    cb->addItem(pic, QObject::tr("e - lawngreen"));\r
-       pic.fill(QColor(0,127,255));    cb->addItem(pic, QObject::tr("n - skyblue"));\r
-       pic.fill(QColor(127,0,255));    cb->addItem(pic, QObject::tr("u - blueviolet"));\r
-       pic.fill(QColor(255,127,0));    cb->addItem(pic, QObject::tr("q - orange"));\r
-       pic.fill(QColor(255,0,127));    cb->addItem(pic, QObject::tr("p - deeppink"));\r
-       pic.fill(QColor(127,127,127));  cb->addItem(pic, QObject::tr("h - gray"));\r
-       pic.fill(QColor(0,0,0));                cb->addItem(pic, QObject::tr("k - black"));\r
-       pic.fill(QColor(179,179,179));  cb->addItem(pic, QObject::tr("W - lightgray"));\r
-       pic.fill(QColor(0,0,127));              cb->addItem(pic, QObject::tr("B - navy"));\r
-       pic.fill(QColor(0,127,0));              cb->addItem(pic, QObject::tr("G - green"));\r
-       pic.fill(QColor(127,0,0));              cb->addItem(pic, QObject::tr("R - maroon"));\r
-       pic.fill(QColor(0,127,127));    cb->addItem(pic, QObject::tr("C - teal"));\r
-       pic.fill(QColor(127,0,127));    cb->addItem(pic, QObject::tr("M - purple"));\r
-       pic.fill(QColor(127,127,0));    cb->addItem(pic, QObject::tr("Y - olive"));\r
-       pic.fill(QColor(0,127,77));             cb->addItem(pic, QObject::tr("L - seagreen"));\r
-       pic.fill(QColor(77,127,0));             cb->addItem(pic, QObject::tr("E - darklawn"));\r
-       pic.fill(QColor(0,77,127));             cb->addItem(pic, QObject::tr("N - darkskyblue"));\r
-       pic.fill(QColor(77,0,127));             cb->addItem(pic, QObject::tr("U - indigo"));\r
-       pic.fill(QColor(127,77,0));             cb->addItem(pic, QObject::tr("Q - brown"));\r
-       pic.fill(QColor(127,0,77));             cb->addItem(pic, QObject::tr("P - darkpink"));\r
-       pic.fill(QColor(77,77,77));             cb->addItem(pic, QObject::tr("H - darkgray"));\r
+       cb->addItem(QPixmap(none_xpm), _("none or default"));\r
+       pic.fill(QColor(255,255,255));  cb->addItem(pic, _("w - white"));\r
+       pic.fill(QColor(0,0,255));              cb->addItem(pic, _("b - blue"));\r
+       pic.fill(QColor(0,255,0));              cb->addItem(pic, _("g - lime"));\r
+       pic.fill(QColor(255,0,0));              cb->addItem(pic, _("r - red"));\r
+       pic.fill(QColor(0,255,255));    cb->addItem(pic, _("c - cyan"));\r
+       pic.fill(QColor(255,0,255));    cb->addItem(pic, _("m - magenta"));\r
+       pic.fill(QColor(255,255,0));    cb->addItem(pic, _("y - yellow"));\r
+       pic.fill(QColor(0,255,127));    cb->addItem(pic, _("l - springgreen"));\r
+       pic.fill(QColor(127,255,0));    cb->addItem(pic, _("e - lawngreen"));\r
+       pic.fill(QColor(0,127,255));    cb->addItem(pic, _("n - skyblue"));\r
+       pic.fill(QColor(127,0,255));    cb->addItem(pic, _("u - blueviolet"));\r
+       pic.fill(QColor(255,127,0));    cb->addItem(pic, _("q - orange"));\r
+       pic.fill(QColor(255,0,127));    cb->addItem(pic, _("p - deeppink"));\r
+       pic.fill(QColor(127,127,127));  cb->addItem(pic, _("h - gray"));\r
+       pic.fill(QColor(0,0,0));                cb->addItem(pic, _("k - black"));\r
+       pic.fill(QColor(179,179,179));  cb->addItem(pic, _("W - lightgray"));\r
+       pic.fill(QColor(0,0,127));              cb->addItem(pic, _("B - navy"));\r
+       pic.fill(QColor(0,127,0));              cb->addItem(pic, _("G - green"));\r
+       pic.fill(QColor(127,0,0));              cb->addItem(pic, _("R - maroon"));\r
+       pic.fill(QColor(0,127,127));    cb->addItem(pic, _("C - teal"));\r
+       pic.fill(QColor(127,0,127));    cb->addItem(pic, _("M - purple"));\r
+       pic.fill(QColor(127,127,0));    cb->addItem(pic, _("Y - olive"));\r
+       pic.fill(QColor(0,127,77));             cb->addItem(pic, _("L - seagreen"));\r
+       pic.fill(QColor(77,127,0));             cb->addItem(pic, _("E - darklawn"));\r
+       pic.fill(QColor(0,77,127));             cb->addItem(pic, _("N - darkskyblue"));\r
+       pic.fill(QColor(77,0,127));             cb->addItem(pic, _("U - indigo"));\r
+       pic.fill(QColor(127,77,0));             cb->addItem(pic, _("Q - brown"));\r
+       pic.fill(QColor(127,0,77));             cb->addItem(pic, _("P - darkpink"));\r
+       pic.fill(QColor(77,77,77));             cb->addItem(pic, _("H - darkgray"));\r
 }\r
 //-----------------------------------------------------------------------------\r
 #include "xpm/arrow_n.xpm"\r
@@ -260,15 +261,15 @@ void fillColors(QComboBox *cb)
 void fillArrows(QComboBox *cb)\r
 {\r
        // "AVIKTSDO"\r
-       cb->addItem(QPixmap(arrow_n_xpm), QObject::tr("none"));\r
-       cb->addItem(QPixmap(arrow_a_xpm), QObject::tr("arrow"));\r
-       cb->addItem(QPixmap(arrow_v_xpm), QObject::tr("back arrow"));\r
-       cb->addItem(QPixmap(arrow_i_xpm), QObject::tr("stop"));\r
-       cb->addItem(QPixmap(arrow_k_xpm), QObject::tr("size"));\r
-       cb->addItem(QPixmap(arrow_t_xpm), QObject::tr("triangle"));\r
-       cb->addItem(QPixmap(arrow_s_xpm), QObject::tr("square"));\r
-       cb->addItem(QPixmap(arrow_d_xpm), QObject::tr("rhomb"));\r
-       cb->addItem(QPixmap(arrow_o_xpm), QObject::tr("circle"));\r
+       cb->addItem(QPixmap(arrow_n_xpm), _("'_' none"));\r
+       cb->addItem(QPixmap(arrow_a_xpm), _("'A' arrow"));\r
+       cb->addItem(QPixmap(arrow_v_xpm), _("'V' back arrow"));\r
+       cb->addItem(QPixmap(arrow_i_xpm), _("'I' stop"));\r
+       cb->addItem(QPixmap(arrow_k_xpm), _("'K' size"));\r
+       cb->addItem(QPixmap(arrow_t_xpm), _("'T' triangle"));\r
+       cb->addItem(QPixmap(arrow_s_xpm), _("'S' square"));\r
+       cb->addItem(QPixmap(arrow_d_xpm), _("'D' rhomb"));\r
+       cb->addItem(QPixmap(arrow_o_xpm), _("'O' circle"));\r
 }\r
 //-----------------------------------------------------------------------------\r
 #include "xpm/barrow_n.xpm"\r
@@ -283,15 +284,15 @@ void fillArrows(QComboBox *cb)
 void fillBArrows(QComboBox *cb)\r
 {\r
        // "AVIKTSDO"\r
-       cb->addItem(QPixmap(barrow_n_xpm), QObject::tr("none"));\r
-       cb->addItem(QPixmap(barrow_a_xpm), QObject::tr("arrow"));\r
-       cb->addItem(QPixmap(barrow_v_xpm), QObject::tr("back arrow"));\r
-       cb->addItem(QPixmap(barrow_i_xpm), QObject::tr("stop"));\r
-       cb->addItem(QPixmap(barrow_k_xpm), QObject::tr("size"));\r
-       cb->addItem(QPixmap(barrow_t_xpm), QObject::tr("triangle"));\r
-       cb->addItem(QPixmap(barrow_s_xpm), QObject::tr("square"));\r
-       cb->addItem(QPixmap(barrow_d_xpm), QObject::tr("rhomb"));\r
-       cb->addItem(QPixmap(barrow_o_xpm), QObject::tr("circle"));\r
+       cb->addItem(QPixmap(barrow_n_xpm), _("'_' none"));\r
+       cb->addItem(QPixmap(barrow_a_xpm), _("'A' arrow"));\r
+       cb->addItem(QPixmap(barrow_v_xpm), _("'V' back arrow"));\r
+       cb->addItem(QPixmap(barrow_i_xpm), _("'I' stop"));\r
+       cb->addItem(QPixmap(barrow_k_xpm), _("'K' size"));\r
+       cb->addItem(QPixmap(barrow_t_xpm), _("'T' triangle"));\r
+       cb->addItem(QPixmap(barrow_s_xpm), _("'S' square"));\r
+       cb->addItem(QPixmap(barrow_d_xpm), _("'D' rhomb"));\r
+       cb->addItem(QPixmap(barrow_o_xpm), _("'O' circle"));\r
 }\r
 //-----------------------------------------------------------------------------\r
 #include "xpm/dash_e.xpm"\r
@@ -305,15 +306,15 @@ void fillBArrows(QComboBox *cb)
 void fillDashes(QComboBox *cb)\r
 {\r
        // "-|;=ji: "\r
-       cb->addItem(QPixmap(dash_s_xpm), QObject::tr("solid"));\r
-       cb->addItem(QPixmap(dash_l_xpm), QObject::tr("long dash"));\r
-       cb->addItem(QPixmap(dash_m_xpm), QObject::tr("dash"));\r
-       cb->addItem(QPixmap(dash_e_xpm), QObject::tr("small dash"));\r
-       cb->addItem(QPixmap(dash_j_xpm), QObject::tr("dash dot"));\r
-       cb->addItem(QPixmap(dash_i_xpm), QObject::tr("small dash dot"));\r
-       cb->addItem(QPixmap(dash_d_xpm), QObject::tr("dots"));\r
-       cb->addItem(QPixmap(mark_n_xpm), QObject::tr("none"));\r
-       cb->addItem(QPixmap(":/png/tools-wizard.png"), QObject::tr("manual"));\r
+       cb->addItem(QPixmap(dash_s_xpm), _("'-' solid"));\r
+       cb->addItem(QPixmap(dash_l_xpm), _("'|' long dash"));\r
+       cb->addItem(QPixmap(dash_m_xpm), _("';' dash"));\r
+       cb->addItem(QPixmap(dash_e_xpm), _("'=' small dash"));\r
+       cb->addItem(QPixmap(dash_j_xpm), _("'j' dash dot"));\r
+       cb->addItem(QPixmap(dash_i_xpm), _("'i' small dash dot"));\r
+       cb->addItem(QPixmap(dash_d_xpm), _("':' dots"));\r
+       cb->addItem(QPixmap(mark_n_xpm), _("' ' none"));\r
+       cb->addItem(QPixmap(":/png/tools-wizard.png"), _("manual"));\r
 }\r
 //-----------------------------------------------------------------------------\r
 #include "xpm/mask_a.xpm"\r
@@ -335,24 +336,24 @@ void fillDashes(QComboBox *cb)
 void fillMasks(QComboBox *cb)\r
 {\r
        // "-+=;oOsS~<>jdD*^"\r
-       cb->addItem(QPixmap(none_xpm), QObject::tr("none"));\r
-       cb->addItem(QPixmap(mask_m_xpm), QObject::tr("line"));\r
-       cb->addItem(QPixmap(mask_p_xpm), QObject::tr("plus"));\r
-       cb->addItem(QPixmap(mask_e_xpm), QObject::tr("double line"));\r
-       cb->addItem(QPixmap(mask_i_xpm), QObject::tr("dash"));\r
-       cb->addItem(QPixmap(mask_o_xpm), QObject::tr("circle"));\r
-       cb->addItem(QPixmap(mask_O_xpm), QObject::tr("filled circle"));\r
-       cb->addItem(QPixmap(mask_s_xpm), QObject::tr("square"));\r
-       cb->addItem(QPixmap(mask_S_xpm), QObject::tr("filled square"));\r
-       cb->addItem(QPixmap(mask_t_xpm), QObject::tr("wave"));\r
-       cb->addItem(QPixmap(mask_l_xpm), QObject::tr("left sign"));\r
-       cb->addItem(QPixmap(mask_r_xpm), QObject::tr("right sign"));\r
-       cb->addItem(QPixmap(mask_j_xpm), QObject::tr("dash dot"));\r
-       cb->addItem(QPixmap(mask_d_xpm), QObject::tr("rhomb"));\r
-       cb->addItem(QPixmap(mask_D_xpm), QObject::tr("filled rhomb"));\r
-       cb->addItem(QPixmap(mask_a_xpm), QObject::tr("cross"));\r
-       cb->addItem(QPixmap(mask_u_xpm), QObject::tr("up sign"));\r
-       cb->addItem(QPixmap(":/png/tools-wizard.png"), QObject::tr("manual"));\r
+       cb->addItem(QPixmap(none_xpm), _("none"));\r
+       cb->addItem(QPixmap(mask_m_xpm), _("'-' lines"));\r
+       cb->addItem(QPixmap(mask_p_xpm), _("'+' plus"));\r
+       cb->addItem(QPixmap(mask_e_xpm), _("'=' double lines"));\r
+       cb->addItem(QPixmap(mask_i_xpm), _("';' dash"));\r
+       cb->addItem(QPixmap(mask_o_xpm), _("'o' circle"));\r
+       cb->addItem(QPixmap(mask_O_xpm), _("'O' solid circle"));\r
+       cb->addItem(QPixmap(mask_s_xpm), _("'s' square"));\r
+       cb->addItem(QPixmap(mask_S_xpm), _("'S' solid square"));\r
+       cb->addItem(QPixmap(mask_t_xpm), _("'~' waves"));\r
+       cb->addItem(QPixmap(mask_l_xpm), _("'<' left sign"));\r
+       cb->addItem(QPixmap(mask_r_xpm), _("'>' right sign"));\r
+       cb->addItem(QPixmap(mask_j_xpm), _("'j' dash dot"));\r
+       cb->addItem(QPixmap(mask_d_xpm), _("'d' rhomb"));\r
+       cb->addItem(QPixmap(mask_D_xpm), _("'D' solid rhomb"));\r
+       cb->addItem(QPixmap(mask_a_xpm), _("'*' cross"));\r
+       cb->addItem(QPixmap(mask_u_xpm), _("'^' hats"));\r
+       cb->addItem(QPixmap(":/png/tools-wizard.png"), _("manual"));\r
 }\r
 //-----------------------------------------------------------------------------\r
 #include "xpm/mark_.xpm"\r
@@ -379,31 +380,31 @@ void fillMasks(QComboBox *cb)
 void fillMarkers(QComboBox *cb)\r
 {\r
        // ".+x*sdv^<>o.*+xsdv^<>o" : nf = 10\r
-       cb->addItem(QPixmap(mark_n_xpm), QObject::tr("none"));\r
-       cb->addItem(QPixmap(mark__xpm), QObject::tr("dot"));\r
-       cb->addItem(QPixmap(mark_p_xpm), QObject::tr("plus"));\r
-       cb->addItem(QPixmap(mark_x_xpm), QObject::tr("skew cross"));\r
-       cb->addItem(QPixmap(mark_a_xpm), QObject::tr("asterix"));\r
-       cb->addItem(QPixmap(mark_s_xpm), QObject::tr("square"));\r
-       cb->addItem(QPixmap(mark_d_xpm), QObject::tr("rhomb"));\r
-       cb->addItem(QPixmap(mark_v_xpm), QObject::tr("triangle down"));\r
-       cb->addItem(QPixmap(mark_t_xpm), QObject::tr("triangle up"));\r
-       cb->addItem(QPixmap(mark_l_xpm), QObject::tr("triangle left"));\r
-       cb->addItem(QPixmap(mark_r_xpm), QObject::tr("triangle right"));\r
-       cb->addItem(QPixmap(mark_o_xpm), QObject::tr("circle"));\r
+       cb->addItem(QPixmap(mark_n_xpm), _("none"));\r
+       cb->addItem(QPixmap(mark__xpm), _("'.' dot"));\r
+       cb->addItem(QPixmap(mark_p_xpm), _("'+' plus"));\r
+       cb->addItem(QPixmap(mark_x_xpm), _("'x' skew cross"));\r
+       cb->addItem(QPixmap(mark_a_xpm), _("'*' star"));\r
+       cb->addItem(QPixmap(mark_s_xpm), _("'s' square"));\r
+       cb->addItem(QPixmap(mark_d_xpm), _("'d' rhomb"));\r
+       cb->addItem(QPixmap(mark_v_xpm), _("'v' triangle down"));\r
+       cb->addItem(QPixmap(mark_t_xpm), _("'^' triangle up"));\r
+       cb->addItem(QPixmap(mark_l_xpm), _("'<' triangle left"));\r
+       cb->addItem(QPixmap(mark_r_xpm), _("'>' triangle right"));\r
+       cb->addItem(QPixmap(mark_o_xpm), _("'o' circle"));\r
 \r
-       cb->addItem(QPixmap(mark_cf_xpm), QObject::tr("circled dot"));\r
-       cb->addItem(QPixmap(mark_y_xpm),  QObject::tr("Y-sign"));\r
-       cb->addItem(QPixmap(mark_pf_xpm), QObject::tr("squared plus"));\r
-       cb->addItem(QPixmap(none_xpm),    QObject::tr("squared cross"));\r
+       cb->addItem(QPixmap(mark_cf_xpm), _("'#.' circled dot"));\r
+       cb->addItem(QPixmap(mark_y_xpm),  _("'#*' Y-sign"));\r
+       cb->addItem(QPixmap(mark_pf_xpm), _("'#+' squared plus"));\r
+       cb->addItem(QPixmap(none_xpm),    _("'#x' squared cross"));\r
 \r
-       cb->addItem(QPixmap(mark_sf_xpm), QObject::tr("solid square"));\r
-       cb->addItem(QPixmap(mark_df_xpm), QObject::tr("solid rhomb"));\r
-       cb->addItem(QPixmap(mark_vf_xpm), QObject::tr("solid triangle down"));\r
-       cb->addItem(QPixmap(mark_tf_xpm), QObject::tr("solid triangle up"));\r
-       cb->addItem(QPixmap(mark_lf_xpm), QObject::tr("solid triangle left"));\r
-       cb->addItem(QPixmap(mark_rf_xpm), QObject::tr("solid triangle right"));\r
-       cb->addItem(QPixmap(mark_of_xpm), QObject::tr("solid circle"));\r
+       cb->addItem(QPixmap(mark_sf_xpm), _("'#s' solid square"));\r
+       cb->addItem(QPixmap(mark_df_xpm), _("'#d' solid rhomb"));\r
+       cb->addItem(QPixmap(mark_vf_xpm), _("'#v' solid triangle down"));\r
+       cb->addItem(QPixmap(mark_tf_xpm), _("'#^' solid triangle up"));\r
+       cb->addItem(QPixmap(mark_lf_xpm), _("'#<' solid triangle left"));\r
+       cb->addItem(QPixmap(mark_rf_xpm), _("'#>' solid triangle right"));\r
+       cb->addItem(QPixmap(mark_of_xpm), _("'#o' solid circle"));\r
 }\r
 //-----------------------------------------------------------------------------\r
 void StyleDialog::updatePic()\r
@@ -451,7 +452,7 @@ void StyleDialog::updatePic()
                        else            result += col[i-1];\r
                }\r
                i = width->value();             if(i>1) result += char('0'+i);\r
-               gr.Plot(x,y,result.toStdString().c_str());\r
+               gr.Plot(x,y,result.toLocal8Bit().constData());\r
                break;\r
        case 1: // color sceheme\r
        case 3: // manual mask\r
@@ -488,11 +489,11 @@ void StyleDialog::updatePic()
                        i = msize->value();\r
                        if(i>1) result += char('0'+i);\r
                }\r
-               \r
-               \r
+\r
+\r
                i = axial->currentIndex();\r
                if(i>0) result = result+':'+char('x'+i-1);\r
-               gr.Surf(a,result.toStdString().c_str());\r
+               gr.Surf(a,result.toLocal8Bit().constData());\r
                break;\r
        case 2: // text style\r
                if(font_sch->isChecked())       for(j=0;j<7;j++)\r
@@ -518,7 +519,7 @@ void StyleDialog::updatePic()
                if(rbL->isChecked())    result += 'L';\r
                if(rbC->isChecked())    result += 'C';\r
                if(rbR->isChecked())    result += 'R';\r
-               gr.Puts(mglPoint(0,-0.5),"Font test",result.toStdString().c_str(),-10);\r
+               gr.Puts(mglPoint(0,-0.5),"Font test",result.toLocal8Bit().constData(),-10);\r
                break;\r
        }\r
        result = "'" + result + "'";\r
@@ -530,7 +531,7 @@ void StyleDialog::updatePic()
 //-----------------------------------------------------------------------------\r
 void convertFromGraph(QPixmap &pic, mglGraph *gr, uchar **buf)\r
 {\r
-       register long w=gr->GetWidth(), h=gr->GetHeight();\r
+       long w=gr->GetWidth(), h=gr->GetHeight();\r
        if(*buf)        delete [](*buf);\r
        *buf = new uchar[4*w*h];\r
        gr->GetBGRN(*buf,4*w*h);\r
index 348632c5aa160e3aaeedcb9d2be72e1b8eb5e8d7..99d318d225f8e9d1ec707765aa91f2f13a23fac4 100644 (file)
@@ -51,12 +51,12 @@ private:
        QComboBox *cc[8], *cline, *cfont;
        QSlider *nn[8], *nline;
        QComboBox *axial, *ctext, *a1, *a2, *dash, *mark;
-       QCheckBox *swire, *upd;
+       QCheckBox *swire;
        QCheckBox *ital, *bold, *wire, *uline, *oline;
        QSpinBox *width;
        QGroupBox *align;
        QTabWidget *tab;
-       QLabel *box, *pic;
+       QLabel *pic;
        QLineEdit *res;
        QRadioButton *rbL, *rbC, *rbR;
        uchar *grBuf;
index 80b1c64d963f98cc796a4ac781326de1a25d0c30..dd164ac93d33a35e7269dc340df79d231d876f53 100644 (file)
 #include <mgl2/qmathgl.h>
 #include "subplot_dlg.h"
 #include "style_dlg.h"
+#undef sprintf
 //-----------------------------------------------------------------------------
 void convertFromGraph(QPixmap &pic, mglGraph *gr, uchar **buf);
 //-----------------------------------------------------------------------------
 SubplotDialog::SubplotDialog(QWidget *parent) : QDialog(parent)
 {
        grBuf = 0;
-       setWindowTitle(tr("UDAV - Setup inplot"));
+       setWindowTitle(_("UDAV - Setup inplot"));
        QLabel *l;
        QPushButton *b;
        QVBoxLayout *v = new QVBoxLayout(this), *u;
@@ -43,116 +44,116 @@ SubplotDialog::SubplotDialog(QWidget *parent) : QDialog(parent)
        g->setColumnStretch(10, 1);     g->setAlignment(Qt::AlignTop);
        // SubPlot section
        cb = new QRadioButton("SubPlot",this);  g->addWidget(cb,0,0);
-       cb->setToolTip(tr("Set drawing area as cell of matrix nx*ny."));
+       cb->setToolTip(_("Set drawing area as cell of matrix nx*ny."));
        connect(cb,SIGNAL(toggled(bool)),this,SLOT(updatePic()));
        l = new QLabel("nx",this);      g->addWidget(l,0,1);
        bn = new QSpinBox(this);        g->addWidget(bn,0,2);
-       bn->setMinimum(1);      bn->setToolTip(tr("Horizontal size"));
+       bn->setMinimum(1);      bn->setToolTip(_("Horizontal size"));
        connect(bn,SIGNAL(valueChanged(QString)),this,SLOT(updatePic()));
        l = new QLabel("ny",this);      g->addWidget(l,0,3);
        bm = new QSpinBox(this);        g->addWidget(bm,0,4);
-       bm->setMinimum(1);      bm->setToolTip(tr("Vertical size"));
+       bm->setMinimum(1);      bm->setToolTip(_("Vertical size"));
        connect(bm,SIGNAL(valueChanged(QString)),this,SLOT(updatePic()));
        l = new QLabel("ind",this);     g->addWidget(l,0,5);
        bk = new QSpinBox(this);        g->addWidget(bk,0,6);
-       bk->setMinimum(0);      bk->setToolTip(tr("Cell index"));
+       bk->setMinimum(0);      bk->setToolTip(_("Cell index"));
        connect(bk,SIGNAL(valueChanged(QString)),this,SLOT(updatePic()));
 
        // MultiPlot section
        cm = new QRadioButton("MultiPlot",this);        g->addWidget(cm,1,0);
-       cm->setToolTip(tr("Set drawing area as cells of matrix nx*ny."));
+       cm->setToolTip(_("Set drawing area as cells of matrix nx*ny."));
        connect(cm,SIGNAL(toggled(bool)),this,SLOT(updatePic()));
        l = new QLabel("nx",this);      g->addWidget(l,1,1);
        mn = new QSpinBox(this);        g->addWidget(mn,1,2);
-       mn->setMinimum(1);      mn->setToolTip(tr("Horizontal size"));
+       mn->setMinimum(1);      mn->setToolTip(_("Horizontal size"));
        connect(mn,SIGNAL(valueChanged(QString)),this,SLOT(updatePic()));
        l = new QLabel("ny",this);      g->addWidget(l,1,3);
        mm = new QSpinBox(this);        g->addWidget(mm,1,4);
-       mm->setMinimum(1);      mm->setToolTip(tr("Vertical size"));
+       mm->setMinimum(1);      mm->setToolTip(_("Vertical size"));
        connect(mm,SIGNAL(valueChanged(QString)),this,SLOT(updatePic()));
        l = new QLabel("ind",this);     g->addWidget(l,1,5);
        mk = new QSpinBox(this);        g->addWidget(mk,1,6);
-       mk->setMinimum(0);      mk->setToolTip(tr("Starting cell index"));
+       mk->setMinimum(0);      mk->setToolTip(_("Starting cell index"));
        connect(mk,SIGNAL(valueChanged(QString)),this,SLOT(updatePic()));
        l = new QLabel("dx",this);      g->addWidget(l,1,7);
        mx = new QSpinBox(this);        g->addWidget(mx,1,8);
-       mx->setMinimum(1);      mx->setToolTip(tr("Width of selected cells"));
+       mx->setMinimum(1);      mx->setToolTip(_("Width of selected cells"));
        connect(mx,SIGNAL(valueChanged(QString)),this,SLOT(updatePic()));
        l = new QLabel("dy",this);      g->addWidget(l,1,9);
        my = new QSpinBox(this);        g->addWidget(my,1,10);
-       my->setMinimum(1);      my->setToolTip(tr("Height of selected cells"));
+       my->setMinimum(1);      my->setToolTip(_("Height of selected cells"));
        connect(my,SIGNAL(valueChanged(QString)),this,SLOT(updatePic()));
 
        // GridPlot section
        cg = new QRadioButton("GridPlot",this); g->addWidget(cg,2,0);
-       cg->setToolTip(tr("Set drawing area as cell of matrix nx*ny."));
+       cg->setToolTip(_("Set drawing area as cell of matrix nx*ny."));
        connect(cg,SIGNAL(toggled(bool)),this,SLOT(updatePic()));
        l = new QLabel("nx",this);      g->addWidget(l,2,1);
        gn = new QSpinBox(this);        g->addWidget(gn,2,2);
-       gn->setMinimum(1);      gn->setToolTip(tr("Horizontal size"));
+       gn->setMinimum(1);      gn->setToolTip(_("Horizontal size"));
        connect(gn,SIGNAL(valueChanged(QString)),this,SLOT(updatePic()));
        l = new QLabel("ny",this);      g->addWidget(l,2,3);
        gm = new QSpinBox(this);        g->addWidget(gm,2,4);
-       gm->setMinimum(1);      gm->setToolTip(tr("Vertical size"));
+       gm->setMinimum(1);      gm->setToolTip(_("Vertical size"));
        connect(gm,SIGNAL(valueChanged(QString)),this,SLOT(updatePic()));
        l = new QLabel("ind",this);     g->addWidget(l,2,5);
        gk = new QSpinBox(this);        g->addWidget(gk,2,6);
-       gk->setMinimum(0);      gk->setToolTip(tr("Cell index"));
+       gk->setMinimum(0);      gk->setToolTip(_("Cell index"));
        connect(gk,SIGNAL(valueChanged(QString)),this,SLOT(updatePic()));
        l = new QLabel("d",this);       g->addWidget(l,2,7);
        gd = new QLineEdit(this);       g->addWidget(gd,2,8);
-       gd->setToolTip(tr("Distance between cells"));
+       gd->setToolTip(_("Distance between cells"));
        connect(gd,SIGNAL(textChanged(QString)),this,SLOT(updatePic()));
 
        // ColumnPlot section
        cc = new QRadioButton("ColumnPlot",this);       g->addWidget(cc,3,0);
-       cc->setToolTip(tr("Set drawing area as cells of column."));
+       cc->setToolTip(_("Set drawing area as cells of column."));
        connect(cc,SIGNAL(toggled(bool)),this,SLOT(updatePic()));
        l = new QLabel("num",this);     g->addWidget(l,3,1);
        cn = new QSpinBox(this);        g->addWidget(cn,3,2);
-       cn->setMinimum(1);      cn->setToolTip(tr("Size of column"));
+       cn->setMinimum(1);      cn->setToolTip(_("Size of column"));
        connect(cn,SIGNAL(valueChanged(QString)),this,SLOT(updatePic()));
        l = new QLabel("ind",this);     g->addWidget(l,3,5);
        ck = new QSpinBox(this);        g->addWidget(ck,3,6);
-       ck->setMinimum(0);      ck->setToolTip(tr("Cell index"));
+       ck->setMinimum(0);      ck->setToolTip(_("Cell index"));
        connect(ck,SIGNAL(valueChanged(QString)),this,SLOT(updatePic()));
        l = new QLabel("d",this);       g->addWidget(l,3,7);
        cd = new QLineEdit(this);       g->addWidget(cd,3,8);
-       cd->setToolTip(tr("Distance between cells"));
+       cd->setToolTip(_("Distance between cells"));
        connect(cd,SIGNAL(textChanged(QString)),this,SLOT(updatePic()));
 
        // StickPlot section
        cs = new QRadioButton("StickPlot",this);        g->addWidget(cs,4,0);
-       cs->setToolTip(tr("Set drawing area as cells of stick."));
+       cs->setToolTip(_("Set drawing area as cells of stick."));
        connect(cc,SIGNAL(toggled(bool)),this,SLOT(updatePic()));
        l = new QLabel("num",this);     g->addWidget(l,4,1);
        sn = new QSpinBox(this);        g->addWidget(sn,4,2);
-       sn->setMinimum(1);      sn->setToolTip(tr("Size of stick"));
+       sn->setMinimum(1);      sn->setToolTip(_("Size of stick"));
        connect(sn,SIGNAL(valueChanged(QString)),this,SLOT(updatePic()));
        l = new QLabel("ind",this);     g->addWidget(l,4,5);
        sk = new QSpinBox(this);        g->addWidget(sk,4,6);
-       sk->setMinimum(0);      sk->setToolTip(tr("Cell index"));
+       sk->setMinimum(0);      sk->setToolTip(_("Cell index"));
        connect(sk,SIGNAL(valueChanged(QString)),this,SLOT(updatePic()));
 
        // InPlot section
        ci = new QRadioButton("InPlot",this);   g->addWidget(ci,5,0);
-       ci->setToolTip(tr("Set drawing area as cells of matrix nx*ny."));
+       ci->setToolTip(_("Set drawing area as cells of matrix nx*ny."));
        connect(ci,SIGNAL(toggled(bool)),this,SLOT(updatePic()));
        l = new QLabel("x1",this);      g->addWidget(l,5,1);
        x1 = new QLineEdit(this);       g->addWidget(x1,5,2);
-       x1->setText("0");       x1->setToolTip(tr("Left bottom edge"));
+       x1->setText("0");       x1->setToolTip(_("Left bottom edge"));
        connect(x1,SIGNAL(textChanged(QString)),this,SLOT(updatePic()));
        l = new QLabel("x2",this);      g->addWidget(l,5,3);
        x2 = new QLineEdit(this);       g->addWidget(x2,5,4);
-       x2->setText("1");       x2->setToolTip(tr("Right bottom edge"));
+       x2->setText("1");       x2->setToolTip(_("Right bottom edge"));
        connect(x2,SIGNAL(textChanged(QString)),this,SLOT(updatePic()));
        l = new QLabel("y1",this);      g->addWidget(l,5,5);
        y1 = new QLineEdit(this);       g->addWidget(y1,5,6);
-       y1->setText("0");       y1->setToolTip(tr("Left top edge"));
+       y1->setText("0");       y1->setToolTip(_("Left top edge"));
        connect(y1,SIGNAL(textChanged(QString)),this,SLOT(updatePic()));
        l = new QLabel("y2",this);      g->addWidget(l,5,7);
        y2 = new QLineEdit(this);       g->addWidget(y2,5,8);
-       y2->setText("1");       y2->setToolTip(tr("Right top edge"));
+       y2->setText("1");       y2->setToolTip(_("Right top edge"));
        connect(y2,SIGNAL(textChanged(QString)),this,SLOT(updatePic()));
 
        QHBoxLayout *h, *H;
@@ -160,39 +161,39 @@ SubplotDialog::SubplotDialog(QWidget *parent) : QDialog(parent)
        u = new QVBoxLayout;    h->addLayout(u);
 
        H = new QHBoxLayout;    u->addLayout(H);
-       l = new QLabel(tr("Rotate on"),this);   H->addWidget(l);
+       l = new QLabel(_("Rotate on"),this);    H->addWidget(l);
        l = new QLabel(QString::fromWCharArray(L"\u03b8"),this);        H->addWidget(l);
        tet = new QSpinBox(this);       H->addWidget(tet,1);    tet->setValue(0);       tet->setSingleStep(5);
-       tet->setToolTip(tr("Angle around x axis (in degrees)"));
+       tet->setToolTip(_("Angle around x axis (in degrees)"));
        connect(tet,SIGNAL(valueChanged(QString)),this,SLOT(updatePic()));
        l = new QLabel(QString::fromWCharArray(L"\u03c6"),this);        H->addWidget(l);
        phi = new QSpinBox(this);       H->addWidget(phi,1);    phi->setValue(0);       phi->setSingleStep(5);
-       phi->setToolTip(tr("Angle around z axis (in degrees)"));
+       phi->setToolTip(_("Angle around z axis (in degrees)"));
        connect(phi,SIGNAL(valueChanged(QString)),this,SLOT(updatePic()));
 
        H = new QHBoxLayout;    u->addLayout(H);
-       l = new QLabel(tr("Aspect"),this);      H->addWidget(l);
-       l = new QLabel(tr("X/Z"),this); H->addWidget(l);
+       l = new QLabel(_("Aspect"),this);       H->addWidget(l);
+       l = new QLabel(_("X/Z"),this);  H->addWidget(l);
        axz = new QLineEdit(this);      H->addWidget(axz);      axz->setText("1");
-       axz->setToolTip(tr("Aspect ratio of x-scale to z-acale"));
+       axz->setToolTip(_("Aspect ratio of x-scale to z-scale"));
        connect(axz,SIGNAL(textChanged(QString)),this,SLOT(updatePic()));
-       l = new QLabel(tr("Y/Z"),this); H->addWidget(l);
+       l = new QLabel(_("Y/Z"),this);  H->addWidget(l);
        ayz = new QLineEdit(this);      H->addWidget(ayz);      ayz->setText("1");
-       ayz->setToolTip(tr("Aspect ratio of y-scale to z-acale"));
+       ayz->setToolTip(_("Aspect ratio of y-scale to z-scale"));
        connect(ayz,SIGNAL(textChanged(QString)),this,SLOT(updatePic()));
 
        H = new QHBoxLayout;    u->addLayout(H);
-       l = new QLabel(tr("Reserve at"),this);  H->addWidget(l);
-       rl = new QCheckBox(tr("left"),this);    H->addWidget(rl);       rl->setChecked(true);
-       rl->setToolTip(tr("Reserve space for labels at left side (style '<')"));
-       rb = new QCheckBox(tr("bottom"),this);  H->addWidget(rb);       rb->setChecked(true);
-       rb->setToolTip(tr("Reserve space for labels at bottom side (style '_')"));
-       rt = new QCheckBox(tr("top"),this);             H->addWidget(rt);       rt->setChecked(true);
-       rt->setToolTip(tr("Reserve space for labels at top side (style '^')"));
-       rr = new QCheckBox(tr("right"),this);   H->addWidget(rr);       rr->setChecked(true);
-       rr->setToolTip(tr("Reserve space for labels at right side (style '>')"));
-       rw = new QCheckBox(tr("Whole area"),this);      H->addWidget(rw);
-       rw->setToolTip(tr("Set to use whole area (style '#')"));
+       l = new QLabel(_("Reserve at"),this);   H->addWidget(l);
+       rl = new QCheckBox(_("left"),this);     H->addWidget(rl);       rl->setChecked(true);
+       rl->setToolTip(_("Reserve space for labels at left side (style '<')"));
+       rb = new QCheckBox(_("bottom"),this);   H->addWidget(rb);       rb->setChecked(true);
+       rb->setToolTip(_("Reserve space for labels at bottom side (style '_')"));
+       rt = new QCheckBox(_("top"),this);              H->addWidget(rt);       rt->setChecked(true);
+       rt->setToolTip(_("Reserve space for labels at top side (style '^')"));
+       rr = new QCheckBox(_("right"),this);    H->addWidget(rr);       rr->setChecked(true);
+       rr->setToolTip(_("Reserve space for labels at right side (style '>')"));
+       rw = new QCheckBox(_("Whole area"),this);       H->addWidget(rw);
+       rw->setToolTip(_("Set to use whole area (style '#')"));
        connect(rl,SIGNAL(toggled(bool)),this,SLOT(updatePic()));
        connect(rr,SIGNAL(toggled(bool)),this,SLOT(updatePic()));
        connect(rt,SIGNAL(toggled(bool)),this,SLOT(updatePic()));
@@ -200,24 +201,24 @@ SubplotDialog::SubplotDialog(QWidget *parent) : QDialog(parent)
        connect(rw,SIGNAL(toggled(bool)),this,SLOT(updatePic()));
 
        H = new QHBoxLayout;    u->addLayout(H);
-       l = new QLabel(tr("Title"),this);       H->addWidget(l);
+       l = new QLabel(_("Title"),this);        H->addWidget(l);
        title = new QLineEdit(this);            H->addWidget(title);
-       title->setToolTip(tr("Title for plot. Can be used in SubPlot or MultiPlot only."));
+       title->setToolTip(_("Title for plot. Can be used in SubPlot or MultiPlot only."));
        connect(title,SIGNAL(textChanged(QString)),this,SLOT(updatePic()));
-       b = new QPushButton(tr("Style"),this);  H->addWidget(b);
+       b = new QPushButton(_("Style"),this);   H->addWidget(b);
        connect(b, SIGNAL(clicked()),this, SLOT(titleStl()));
 
        H = new QHBoxLayout;    u->addLayout(H);
-       l = new QLabel(tr("Result is"),this);   H->addWidget(l);
+       l = new QLabel(_("Result"),this);       H->addWidget(l);
        res = new QLineEdit(this);              H->addWidget(res);      res->setReadOnly(true);
-       res->setToolTip(tr("Resulting string."));
+       res->setToolTip(_("Resulting string"));
 
        pic = new QLabel(this); h->addWidget(pic,1);
 
        h = new QHBoxLayout;    v->addLayout(h);        h->addStretch(1);
-       b = new QPushButton(tr("Cancel"),this); h->addWidget(b);
+       b = new QPushButton(_("Cancel"),this);  h->addWidget(b);
        connect(b, SIGNAL(clicked()),this, SLOT(reject()));
-       b = new QPushButton(tr("OK"), this);    h->addWidget(b);        b->setDefault(true);
+       b = new QPushButton(_("OK"), this);     h->addWidget(b);        b->setDefault(true);
        connect(b, SIGNAL(clicked()),this, SLOT(finish()));
        
        stlDialog = new StyleDialog(this);
@@ -231,6 +232,7 @@ void SubplotDialog::updatePic()
 {
        static mglGraph gr;     gr.SetSize(pic->width(),pic->height());
        mglParse par;
+       wchar_t *wcmd;
 
        setlocale(LC_NUMERIC, "C");
        QString stl="'";        // style for subplot
@@ -255,7 +257,11 @@ void SubplotDialog::updatePic()
                {       cmd += ":title '"+title->text()+"'";    if(!fmt.isEmpty())      cmd += fmt;     }
                if(Tet || Phi)  cmd += ":rotate "+QString::number(Tet)+" "+QString::number(Phi);
                if(Ax!=1 || Ay!=1)      cmd += ":aspect "+QString::number(Ax)+" "+QString::number(Ay);
-               par.Execute(&gr, cmd.toStdWString().c_str());   gr.Box();
+               wcmd = new wchar_t[cmd.size()+1];
+               cmd.toWCharArray(wcmd);
+               wcmd[cmd.size()] = 0;
+               par.Execute(&gr, wcmd); gr.Box();
+               delete[] wcmd;
                res->setText(cmd);
        }
        else if(cm->isChecked())        // multiplot
@@ -267,7 +273,11 @@ void SubplotDialog::updatePic()
                {       cmd += ":title '"+title->text()+"'";    if(!fmt.isEmpty())      cmd += fmt;     }
                if(Tet || Phi)  cmd += ":rotate "+QString::number(Tet)+" "+QString::number(Phi);
                if(Ax!=1 || Ay!=1)      cmd += ":aspect "+QString::number(Ax)+" "+QString::number(Ay);
-               par.Execute(&gr, cmd.toStdWString().c_str());   gr.Box();
+               wcmd = new wchar_t[cmd.size() + 1];
+               cmd.toWCharArray(wcmd);
+               wcmd[cmd.size()] = 0;
+               par.Execute(&gr, wcmd); gr.Box();
+               delete[] wcmd;
                res->setText(cmd);
        }
        else if(cg->isChecked())        // gridplot
@@ -277,7 +287,11 @@ void SubplotDialog::updatePic()
                for(int i=0;i<n*m;i++)  if(i!=k)        {       gr.GridPlot(n,m,i,d);   gr.Box("h");    }
                cmd = "gridplot "+QString::number(n)+" "+QString::number(m)+" "+QString::number(k)+" "+QString::number(d);
                if(Ax!=1 || Ay!=1)      cmd += ":aspect "+QString::number(Ax)+" "+QString::number(Ay);
-               par.Execute(&gr, cmd.toStdWString().c_str());   gr.Box();
+               wcmd = new wchar_t[cmd.size() + 1];
+               cmd.toWCharArray(wcmd);
+               wcmd[cmd.size()] = 0;
+               par.Execute(&gr, wcmd); gr.Box();
+               delete[] wcmd;
                res->setText(cmd);
        }
        else if(cs->isChecked())        // stickplot
@@ -286,7 +300,11 @@ void SubplotDialog::updatePic()
                for(int i=0;i<n;i++)    if(i!=k)        {       gr.StickPlot(n,i,Tet,Phi);      gr.Box("h");    }
                cmd = "stickplot "+QString::number(n)+" "+QString::number(k)+" "+QString::number(Tet)+" "+QString::number(Phi);
                if(Ax!=1 || Ay!=1)      cmd += ":aspect "+QString::number(Ax)+" "+QString::number(Ay);
-               par.Execute(&gr, cmd.toStdWString().c_str());   gr.Box();
+               wcmd = new wchar_t[cmd.size() + 1];
+               cmd.toWCharArray(wcmd);
+               wcmd[cmd.size()] = 0;
+               par.Execute(&gr, wcmd); gr.Box();
+               delete[] wcmd;
                res->setText(cmd);
        }
        else if(cc->isChecked())        // columnplot   // TODO add angles
@@ -297,7 +315,11 @@ void SubplotDialog::updatePic()
                cmd = "columnplot "+QString::number(n)+" "+QString::number(k)+" "+QString::number(d);
                if(Tet || Phi)  cmd += ":rotate "+QString::number(Tet)+" "+QString::number(Phi);
                if(Ax!=1 || Ay!=1)      cmd += ":aspect "+QString::number(Ax)+" "+QString::number(Ay);
-               par.Execute(&gr, cmd.toStdWString().c_str());   gr.Box();
+               wcmd = new wchar_t[cmd.size() + 1];
+               cmd.toWCharArray(wcmd);
+               wcmd[cmd.size()] = 0;
+               par.Execute(&gr, wcmd); gr.Box();
+               delete[] wcmd;
                res->setText(cmd);
        }
        else if(ci->isChecked())        // inplot
@@ -308,7 +330,11 @@ void SubplotDialog::updatePic()
                {       cmd += ":title '"+title->text()+"'";    if(!fmt.isEmpty())      cmd += fmt;     }
                if(Tet || Phi)  cmd += ":rotate "+QString::number(Tet)+" "+QString::number(Phi);
                if(Ax!=1 || Ay!=1)      cmd += ":aspect "+QString::number(Ax)+" "+QString::number(Ay);
-               par.Execute(&gr, cmd.toStdWString().c_str());   gr.Box();
+               wcmd = new wchar_t[cmd.size() + 1];
+               cmd.toWCharArray(wcmd);
+               wcmd[cmd.size()] = 0;
+               par.Execute(&gr, wcmd); gr.Box();
+               delete[] wcmd;
                res->setText(cmd);
        }
        setlocale(LC_NUMERIC, "");
index 293c10b0b36c4d9a2d7fff12d900c9702eb552a3..26f69739ccd96303aa12fde331cdc461bcfcc839 100644 (file)
@@ -62,8 +62,8 @@ TextPanel::TextPanel(QWidget *parent) : QWidget(parent)
        dataOpenDlg = createDataOpenDlg(this);
        if(!files_dlg)  files_dlg= new FilesDialog;
 
-       register int i,n=parser.GetCmdNum();
-       for(i=0;i<n;i++)        words<<QString::fromLocal8Bit(parser.GetCmdName(i));
+       int n=parser.GetCmdNum();
+       for(int i=0;i<n;i++)    words<<QString::fromLatin1(parser.GetCmdName(i));
        vars = words;
 
        connect(setupDlg, SIGNAL(putText(const QString &)), this, SLOT(animPutText(const QString &)));
@@ -81,7 +81,7 @@ TextPanel::TextPanel(QWidget *parent) : QWidget(parent)
        QFontMetrics metrics(edit->currentFont());
        edit->setTabStopWidth(4 * metrics.width(' '));
 
-       menu = new QMenu(tr("Edit"),this);
+       menu = new QMenu(_("Edit"),this);
        QBoxLayout *v = new QVBoxLayout(this);
        toolTop(v);     v->addWidget(edit);
 }
@@ -106,7 +106,7 @@ void TextPanel::insNVal()
        QString sel=edit->textCursor().selectedText();
        if(sel.isEmpty())
        {
-               QMessageBox::warning(this,tr("UDAV"),tr("There is no selection to evaluate."));
+               QMessageBox::warning(this,_("UDAV"),_("There is no selection to evaluate."));
                return;
        }
        wchar_t *txt=new wchar_t[sel.length()+1];
@@ -121,7 +121,7 @@ void TextPanel::insPrim()
        QString str(graph->mgl->primitives);
        if(str.isEmpty())
        {
-               QMessageBox::warning(this,tr("UDAV"),tr("There is manual primitives."));
+               QMessageBox::warning(this,_("UDAV"),_("There is manual primitives."));
                return;
        }
        edit->moveCursor(QTextCursor::Start);
@@ -134,7 +134,7 @@ void TextPanel::insFitF()
        QString str(graph->getFit());
        if(str.isEmpty())
        {
-               QMessageBox::warning(this,tr("UDAV"),tr("There is no fitted formula."));
+               QMessageBox::warning(this,_("UDAV"),_("There is no fitted formula."));
                return;
        }
        edit->textCursor().insertText("'"+str+"'");
@@ -142,14 +142,14 @@ void TextPanel::insFitF()
 //-----------------------------------------------------------------------------
 void TextPanel::insFile()
 {
-       QString str = QFileDialog::getOpenFileName(this, tr("UDAV - Insert filename"));
+       QString str = QFileDialog::getOpenFileName(this, _("UDAV - Insert filename"));
        if(str.isEmpty())       return;
        edit->textCursor().insertText("'"+str+"'");
 }
 //-----------------------------------------------------------------------------
 void TextPanel::insPath()
 {
-       QString str = QFileDialog::getExistingDirectory(this, tr("UDAV - Insert path"));
+       QString str = QFileDialog::getExistingDirectory(this, _("UDAV - Insert path"));
        if(str.isEmpty())       return;
        edit->textCursor().insertText("'"+str+"'");
 }
@@ -161,7 +161,7 @@ void TextPanel::refreshData()
        for(i=0;i<n;i++)
        {
                const mglDataA *v=parser.GetVar(i);
-               if(v && v->s.length()>2)        vars<<QString::fromStdWString(v->s);
+               if(v && v->s.length()>2)        vars<<QString::fromWCharArray(v->s.c_str());
        }
        setCompleter(mglCompleter);
 }
@@ -171,11 +171,11 @@ void TextPanel::printText()
        QPrintDialog printDlg(printer, this);
        if (printDlg.exec() == QDialog::Accepted)
        {
-               setStatus(tr("Printing..."));
+               setStatus(_("Printing..."));
                edit->print(printer);
-               setStatus(tr("Printing completed"));
+               setStatus(_("Printing completed"));
        }
-       else    setStatus(tr("Printing aborted"));
+       else    setStatus(_("Printing aborted"));
 }
 //-----------------------------------------------------------------------------
 void TextPanel::find()
@@ -199,7 +199,7 @@ bool TextPanel::findText(const QString &str, bool cs, bool fw)
        }
        bool res = edit->find(stri, f);
        if(!res)
-               QMessageBox::information(this, tr("UDAV - find text"), tr("No string occurrence is found"));
+               QMessageBox::information(this, _("UDAV - find text"), _("No string occurrence is found"));
        return res;
 }
 //-----------------------------------------------------------------------------
@@ -293,7 +293,7 @@ void TextPanel::loadHDF5(const QString &fileName)
        hid_t hf,hg,hd,hs,ht;
        hsize_t dims[3];
        long rank;
-       hf = H5Fopen(fileName.toStdString().c_str(), H5F_ACC_RDONLY, H5P_DEFAULT);
+       hf = H5Fopen(fileName.toLocal8Bit().constData(), H5F_ACC_RDONLY, H5P_DEFAULT);
        if(!hf) return;
        hg = H5Gopen(hf, "/");
        hsize_t num, nx, ny, nz, i;
@@ -322,7 +322,7 @@ void TextPanel::loadHDF5(const QString &fileName)
                        graph->animParseText(edit->toPlainText());
                        setCurrentFile(fileName);
                        delete []buf;
-                       setStatus(tr("Loaded document %1").arg(fileName));
+                       setStatus(QString(_("Loaded document %1")).arg(fileName));
                        if(mglAutoExecute)      graph->execute();
                }
                else if(H5Tget_class(ht)==H5T_FLOAT || H5Tget_class(ht)==H5T_INTEGER)
@@ -359,10 +359,10 @@ void TextPanel::saveHDF5(const QString &fileName)
        long rank = 3;
 
        H5Eset_auto(0,0);
-       hf = H5Fcreate(fileName.toStdString().c_str(), H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+       hf = H5Fcreate(fileName.toLocal8Bit().constData(), H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
        if(hf<0)
        {
-               setStatus(tr("Could not write to %1").arg(fileName));
+               setStatus(QString(_("Could not write to %1")).arg(fileName));
                return;
        }
        {       // save script
@@ -372,7 +372,7 @@ void TextPanel::saveHDF5(const QString &fileName)
                txt += edit->toPlainText();
                dims[0] = txt.length()+1;
                char *buf = new char[dims[0]+1];
-               memcpy(buf, txt.toStdString().c_str(), dims[0]);
+               memcpy(buf, txt.toLocal8Bit().constData(), dims[0]);
                buf[dims[0]]=0;
                hs = H5Screate_simple(1, dims, 0);
                hd = H5Dcreate(hf, "mgl_script", H5T_C_S1, hs, H5P_DEFAULT);
@@ -402,7 +402,7 @@ void TextPanel::saveHDF5(const QString &fileName)
        }
        H5Fclose(hf);
        setCurrentFile(fileName);
-       setStatus(tr("File %1 saved").arg(fileName));
+       setStatus(QString(_("File %1 saved")).arg(fileName));
        return;
 }
 #else
@@ -428,9 +428,7 @@ void TextPanel::load(const QString &fileName)
                QFile f(fileName);
                if(!f.open(QIODevice::ReadOnly))
                {
-                       QMessageBox::warning(this,tr("UDAV - open file"),
-                                                               tr("Couldn't open file ")+"'"+fileName+"'",
-                                                               QMessageBox::Ok,0,0);
+                       QMessageBox::warning(this,_("UDAV - open file"), _("Couldn't open file ") + QString("'") + fileName+"'", QMessageBox::Ok,0,0);
                        return;
                }
 
@@ -466,7 +464,7 @@ void TextPanel::load(const QString &fileName)
                graph->animParseText(edit->toPlainText());
                if(narg==0)     setCurrentFile(fileName);
        }
-       setStatus(tr("Loaded document ")+fileName);
+       setStatus(_("Loaded document ")+fileName);
        if(mglAutoExecute)      graph->execute();
 }
 //-----------------------------------------------------------------------------
@@ -481,14 +479,14 @@ void TextPanel::save(const QString &fileName)
        QFile f(fileName);
        if(!f.open(QIODevice::WriteOnly))
        {
-               setStatus(tr("Could not write to %1").arg(fileName));
+               setStatus(QString(_("Could not write to %1")).arg(fileName));
                return;
        }
        QTextStream t(&f);
        t.setAutoDetectUnicode(true);
        t << text;      f.close();
        setCurrentFile(fileName);
-       setStatus(tr("File %1 saved").arg(fileName));
+       setStatus(QString(_("File %1 saved")).arg(fileName));
 }
 //-----------------------------------------------------------------------------
 void TextPanel::addSetup()     {       setupDlg->exec();       }
@@ -515,89 +513,89 @@ void TextPanel::toolTop(QBoxLayout *v)
        t->addWidget(bb);
 
        // edit menu
-       a = new QAction(QPixmap(":/png/edit-undo.png"), tr("Undo"), this);
+       a = new QAction(QPixmap(":/png/edit-undo.png"), _("Undo"), this);
        connect(a, SIGNAL(triggered()), edit, SLOT(undo()));
-       a->setToolTip(tr("Undo editor change (Ctrl+Z)."));
+       a->setToolTip(_("Undo editor change (Ctrl+Z)."));
        a->setShortcut(Qt::CTRL+Qt::Key_Z);     o->addAction(a);        t->addAction(a);
 
-       a = new QAction(QPixmap(":/png/edit-redo.png"), tr("Redo"), this);
+       a = new QAction(QPixmap(":/png/edit-redo.png"), _("Redo"), this);
        connect(a, SIGNAL(triggered()), edit, SLOT(redo()));
-       a->setToolTip(tr("Redo editor change (Ctrl+Shift+Z)."));
+       a->setToolTip(_("Redo editor change (Ctrl+Shift+Z)."));
        a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_Z);   o->addAction(a);        t->addAction(a);
 
        o->addSeparator();
-       o->addAction(tr("Clear all"), edit, SLOT(clear()));
-       a = new QAction(QPixmap(":/png/edit-cut.png"), tr("Cut text"), this);
+       o->addAction(_("Clear all"), edit, SLOT(clear()));
+       a = new QAction(QPixmap(":/png/edit-cut.png"), _("Cut text"), this);
        connect(a, SIGNAL(triggered()), edit, SLOT(cut()));
-       a->setToolTip(tr("Cut selected text to clipboard (Ctrl+X)."));
+       a->setToolTip(_("Cut selected text to clipboard (Ctrl+X)."));
        a->setShortcut(Qt::CTRL+Qt::Key_X);     o->addAction(a);        t->addAction(a);
 
-       a = new QAction(QPixmap(":/png/edit-copy.png"), tr("Copy text"), this);
+       a = new QAction(QPixmap(":/png/edit-copy.png"), _("Copy text"), this);
        connect(a, SIGNAL(triggered()), edit, SLOT(copy()));
-       a->setToolTip(tr("Copy selected text or data to clipboard (Ctrl+C)."));
+       a->setToolTip(_("Copy selected text or data to clipboard (Ctrl+C)."));
        a->setShortcut(Qt::CTRL+Qt::Key_C);     o->addAction(a);        t->addAction(a);
 
-       a = new QAction(QPixmap(":/png/edit-paste.png"), tr("Paste text"), this);
+       a = new QAction(QPixmap(":/png/edit-paste.png"), _("Paste text"), this);
        connect(a, SIGNAL(triggered()), edit, SLOT(paste()));
-       a->setToolTip(tr("Paste text or data from clipboard (Ctrl+V)."));
+       a->setToolTip(_("Paste text or data from clipboard (Ctrl+V)."));
        a->setShortcut(Qt::CTRL+Qt::Key_V);     o->addAction(a);        t->addAction(a);
 
-       o->addAction(QPixmap(":/png/edit-select-all.png"), tr("Select all"), edit, SLOT(selectAll()), Qt::CTRL+Qt::Key_A);
+       o->addAction(QPixmap(":/png/edit-select-all.png"), _("Select all"), edit, SLOT(selectAll()), Qt::CTRL+Qt::Key_A);
        o->addSeparator();
 
-       a = new QAction(QPixmap(":/png/edit-find.png"), tr("Find/Replace"), this);
+       a = new QAction(QPixmap(":/png/edit-find.png"), _("Find/Replace"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(find()));
-       a->setToolTip(tr("Show dialog for text finding (Ctrl+F)."));
+       a->setToolTip(_("Show dialog for text finding (Ctrl+F)."));
        a->setShortcut(Qt::CTRL+Qt::Key_F);     o->addAction(a);        t->addAction(a);
 
-       a = new QAction(tr("Find next"), this);
+       a = new QAction(_("Find next"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(findText()));
        a->setShortcut(Qt::Key_F3);     o->addAction(a);
        o->addSeparator();
 
        // insert menu
-       oo = o->addMenu(tr("Insert"));
-       aa=a = new QAction(QPixmap(":/png/format-indent-more.png"), tr("New command"), this);
+       oo = o->addMenu(_("Insert"));
+       aa=a = new QAction(QPixmap(":/png/format-indent-more.png"), _("New command"), this);
        a->setShortcut(Qt::META+Qt::Key_C);     connect(a, SIGNAL(triggered()), this, SLOT(newCmd()));
-       a->setToolTip(tr("Show dialog for new command or edit arguments of existed one."));
+       a->setToolTip(_("Show dialog for new command or edit arguments of existed one."));
        oo->addAction(a);
-       a = new QAction(QPixmap(box_xpm), tr("New inplot"), this);
+       a = new QAction(QPixmap(box_xpm), _("New inplot"), this);
        a->setShortcut(Qt::META+Qt::Key_C);     connect(a, SIGNAL(triggered()), subplotDlg, SLOT(show()));
-       a->setToolTip(tr("Show dialog for new inplot and put it into the script."));
+       a->setToolTip(_("Show dialog for new inplot and put it into the script."));
        oo->addAction(a);
 
-       a = new QAction(tr("Fitted formula"), this);
+       a = new QAction(_("Fitted formula"), this);
        a->setShortcut(Qt::META+Qt::Key_F);     connect(a, SIGNAL(triggered()), this, SLOT(insFitF()));
-       a->setToolTip(tr("Insert last fitted formula with found coefficients."));
+       a->setToolTip(_("Insert last fitted formula with found coefficients."));
        oo->addAction(a);
-       a = new QAction(QPixmap(style_xpm), tr("Plot style"), this);
+       a = new QAction(QPixmap(style_xpm), _("Plot style"), this);
        a->setShortcut(Qt::META+Qt::Key_S);     connect(a, SIGNAL(triggered()), this, SLOT(addStyle()));
-       a->setToolTip(tr("Show dialog for styles and put it into the script.\nStyles define the plot view (color scheme, marks, dashing and so on)."));
+       a->setToolTip(_("Show dialog for styles and put it into the script.\nStyles define the plot view (color scheme, marks, dashing and so on)."));
        oo->addAction(a);
-       a = new QAction(QPixmap(option_xpm), tr("Command options"), this);
+       a = new QAction(QPixmap(option_xpm), _("Command options"), this);
        a->setShortcut(Qt::META+Qt::Key_O);     connect(a, SIGNAL(triggered()), this, SLOT(addOptions()));
-       a->setToolTip(tr("Show dialog for options and put it into the script.\nOptions are used for additional setup the plot."));
+       a->setToolTip(_("Show dialog for options and put it into the script.\nOptions are used for additional setup the plot."));
        oo->addAction(a);
-       a = new QAction(tr("Numeric value"), this);
+       a = new QAction(_("Numeric value"), this);
        a->setShortcut(Qt::META+Qt::Key_N);     connect(a, SIGNAL(triggered()), this, SLOT(insNVal()));
-       a->setToolTip(tr("Replace expression by its numerical value."));
+       a->setToolTip(_("Replace expression by its numerical value."));
        oo->addAction(a);
-       a = new QAction(QPixmap(":/png/text-csv.png"), tr("File name"), this);
+       a = new QAction(QPixmap(":/png/text-csv.png"), _("File name"), this);
        a->setShortcut(Qt::META+Qt::Key_P);     connect(a, SIGNAL(triggered()), this, SLOT(insFile()));
-       a->setToolTip(tr("Select and insert file name."));
+       a->setToolTip(_("Select and insert file name."));
        oo->addAction(a);
-       a = new QAction(QPixmap(":/png/folder.png"), tr("Folder path"), this);
+       a = new QAction(QPixmap(":/png/folder.png"), _("Folder path"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(insPath()));
-       a->setToolTip(tr("Select and insert folder name."));
+       a->setToolTip(_("Select and insert folder name."));
        oo->addAction(a);
-       a = new QAction(QPixmap(curve_xpm), tr("Manual primitives"), this);
+       a = new QAction(QPixmap(curve_xpm), _("Manual primitives"), this);
        a->setShortcut(Qt::META+Qt::Key_P);     connect(a, SIGNAL(triggered()), this, SLOT(insPrim()));
-       a->setToolTip(tr("Move mouse-handled primitives to script."));
+       a->setToolTip(_("Move mouse-handled primitives to script."));
        oo->addAction(a);       bb->setMenu(oo);        bb->setDefaultAction(aa);
 
-       a = new QAction(QPixmap(":/png/document-properties.png"), tr("Graphics setup"), this);
+       a = new QAction(QPixmap(":/png/document-properties.png"), _("Graphics setup"), this);
        a->setShortcut(Qt::META+Qt::Key_G);     connect(a, SIGNAL(triggered()), this, SLOT(addSetup()));
-       a->setToolTip(tr("Show dialog for plot setup and put code into the script.\nThis dialog setup axis, labels, lighting and other general things."));
+       a->setToolTip(_("Show dialog for plot setup and put code into the script.\nThis dialog setup axis, labels, lighting and other general things."));
        o->addAction(a);        t->addAction(a);
 }
 //-----------------------------------------------------------------------------
index 7a046108de8d60f79dfa794267b3879139d5c3cc..846f54fde37642074ad4d86f25ee9272b7781677 100644 (file)
@@ -305,7 +305,8 @@ bool TextEdit::isErrLine(int line) const
 void TextEdit::setErrMessage(const QString &mess)
 {
        err.clear();
-       const char *s = mess.toStdString().c_str();
+       QByteArray qs = mess.toLatin1();
+       const char *s = qs.constData();
        s = strstr(s,"in line ");
        while(s)
        {
index 6a54db948253944f1061c5c7ca2743f27b182cd7..080cafd2cc2a8b274281aedbaeeaef41ddec9b83 100644 (file)
@@ -41,6 +41,9 @@
 #define TEXTEDIT_H
 //-----------------------------------------------------------------------------
 #include <QTextEdit>
+#if defined(_MSC_VER)
+#include <mgl2/define.h>
+#endif
 //-----------------------------------------------------------------------------
 class QCompleter;
 class Numb;
index 9ce96a604db0e96a0361d0690a9eb337d8f34845..893bb55b1359f73d9b7ce0da5e0a0ca7b51fb6bf 100644 (file)
@@ -91,6 +91,28 @@ void mgl_ask_qt(const wchar_t *quest, wchar_t *res);
 //-----------------------------------------------------------------------------
 int main(int argc, char **argv)
 {
+       QString lang="";
+       QSettings settings("udav","UDAV");
+       settings.setPath(QSettings::IniFormat, QSettings::UserScope, "UDAV");
+       settings.beginGroup("/UDAV");
+       pathHelp = settings.value("/helpPath", MGL_DOC_DIR).toString();
+       pathFont = settings.value("/userFont", "").toString();
+       lang = settings.value("/udavLang", "").toString();
+       
+       const char *loc="";
+       if(lang=="en")  loc = "C.UTF8";
+#if WIN32
+       if(lang=="ru")  loc = "ru_RU.cp1251";
+#else
+       if(lang=="ru")  loc = "ru_RU.utf8";
+#endif
+       if(lang=="es")  {       loc = "es_ES.utf8";     lang="en";      }       // TODO remove lang="en"; then Spanish translation is ready !
+       mgl_textdomain(argv?argv[0]:NULL,loc);
+       
+       bool showHint = settings.value("/showHint", true).toBool();
+       mglCompleter = settings.value("/completer",  true).toBool();
+       settings.endGroup();
+
        mgl_suppress_warn(true);
        QCoreApplication::setAttribute(Qt::AA_X11InitThreads);
 #ifdef WIN32
@@ -102,20 +124,11 @@ int main(int argc, char **argv)
        QApplication a(argc, argv);
        QTranslator translator;
 //QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
-       QString lang="";
-       QSettings settings("udav","UDAV");
-       settings.setPath(QSettings::IniFormat, QSettings::UserScope, "UDAV");
-       settings.beginGroup("/UDAV");
-       pathHelp = settings.value("/helpPath", MGL_DOC_DIR).toString();
 #if defined(WIN32)
        if(pathHelp.isEmpty())  pathHelp = a.applicationDirPath()+"\\";
-#endif
-       pathFont = settings.value("/userFont", "").toString();
-       lang = settings.value("/udavLang", "").toString();
-       bool showHint = settings.value("/showHint", true).toBool();
-       mglCompleter = settings.value("/completer",  true).toBool();
-       settings.endGroup();
+#else
        if(pathHelp.isEmpty())  pathHelp=MGL_DOC_DIR;
+#endif
 
        if(!lang.isEmpty())
        {
@@ -152,7 +165,7 @@ void udavLoadDefCommands()  {}      //{     udavAddCommands(udav_base_cmd); }
 MainWindow::MainWindow(QWidget *wp) : QMainWindow(wp)
 {
        QAction *a;
-       setWindowTitle(tr("untitled - UDAV"));
+       setWindowTitle(_("untitled - UDAV"));
        setAttribute(Qt::WA_DeleteOnClose);
 
        split = new QSplitter(this);
@@ -162,7 +175,7 @@ MainWindow::MainWindow(QWidget *wp) : QMainWindow(wp)
        rtab = new QTabWidget(split);
        rtab->setMovable(true); rtab->setTabPosition(QTabWidget::South);
 
-       messWnd = new QDockWidget(tr("Messages and warnings"),this);
+       messWnd = new QDockWidget(_("Messages and warnings"),this);
        mess = new QTextEdit(this);     messWnd->setWidget(mess);
        messWnd->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
        addDockWidget(Qt::BottomDockWidgetArea, messWnd);
@@ -170,7 +183,7 @@ MainWindow::MainWindow(QWidget *wp) : QMainWindow(wp)
 //     connect(mess,SIGNAL(cursorPositionChanged()),this,SLOT(messClicked()));
        connect(mess,SIGNAL(selectionChanged()),this,SLOT(messClicked()));
 
-       hideWnd = new QDockWidget(tr("Hidden plots"),this);
+       hideWnd = new QDockWidget(_("Hidden plots"),this);
        hidden = new TextEdit(this);    hideWnd->setWidget(hidden);
        hideWnd->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
        addDockWidget(Qt::BottomDockWidgetArea, hideWnd);
@@ -178,50 +191,50 @@ MainWindow::MainWindow(QWidget *wp) : QMainWindow(wp)
        connect(hidden,SIGNAL(selectionChanged()),this,SLOT(hiddenClicked()));  // TODO
 //     connect(hidden,SIGNAL(cursorPositionChanged()),this,SLOT(hiddenClicked()));
 
-       calcWnd = new QDockWidget(tr("Calculator"),this);
+       calcWnd = new QDockWidget(_("Calculator"),this);
 
-       aload = a = new QAction(QPixmap(":/png/document-open.png"), tr("Open file"), this);
+       aload = a = new QAction(QPixmap(":/png/document-open.png"), _("Open file"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(choose()));
-       a->setToolTip(tr("Open and execute/show script or data from file (Ctrl+O).\nYou may switch off automatic exection in UDAV properties."));
+       a->setToolTip(_("Open and execute/show script or data from file (Ctrl+O).\nYou may switch off automatic exection in UDAV properties."));
        a->setShortcut(Qt::CTRL+Qt::Key_O);
 
-       asave = a = new QAction(QPixmap(":/png/document-save.png"), tr("Save script"), this);
+       asave = a = new QAction(QPixmap(":/png/document-save.png"), _("Save script"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(save()));
-       a->setToolTip(tr("Save script to a file (Ctrl+S)"));
+       a->setToolTip(_("Save script to a file (Ctrl+S)"));
        a->setShortcut(Qt::CTRL+Qt::Key_S);
 
-       acalc = a = new QAction(QPixmap(":/png/accessories-calculator.png"), tr("Calculator"), this);
+       acalc = a = new QAction(QPixmap(":/png/accessories-calculator.png"), _("Calculator"), this);
        a->setShortcut(Qt::Key_F4);     a->setCheckable(true);
        connect(a, SIGNAL(toggled(bool)), calcWnd, SLOT(setVisible(bool)));
        connect(calcWnd, SIGNAL(visibilityChanged(bool)), a, SLOT(setChecked(bool)));
-       a->setToolTip(tr("Show calculator which evaluate and help to type textual formulas.\nTextual formulas may contain data variables too."));
+       a->setToolTip(_("Show calculator which evaluate and help to type textual formulas.\nTextual formulas may contain data variables too."));
        a->setChecked(false);   calcWnd->setVisible(false);
 
-       ainfo = a = new QAction(tr("Show info"), this);
+       ainfo = a = new QAction(_("Show info"), this);
        a->setShortcut(Qt::Key_F2);     a->setCheckable(true);
        connect(a, SIGNAL(toggled(bool)), messWnd, SLOT(setVisible(bool)));
        connect(messWnd, SIGNAL(visibilityChanged(bool)), a, SLOT(setChecked(bool)));
        a->setChecked(false);   messWnd->setVisible(false);
 
-       ahide = a = new QAction(QPixmap(":/png/layer-visible-on.png"), tr("Show hidden plots"), this);
+       ahide = a = new QAction(QPixmap(":/png/layer-visible-on.png"), _("Show hidden plots"), this);
        a->setShortcut(Qt::Key_F8);     a->setCheckable(true);
        connect(a, SIGNAL(toggled(bool)), hideWnd, SLOT(setVisible(bool)));
        connect(hideWnd, SIGNAL(visibilityChanged(bool)), a, SLOT(setChecked(bool)));
        a->setChecked(false);   hideWnd->setVisible(false);
 
        graph = new PlotPanel(this);
-       rtab->addTab(graph,QPixmap(":/png/office-chart-line.png"),tr("Canvas"));
+       rtab->addTab(graph,QPixmap(":/png/office-chart-line.png"),_("Canvas"));
        //      connect(info,SIGNAL(addPanel(QWidget*)),this,SLOT(addPanel(QWidget*)));
        info = createMemPanel(this);
-       rtab->addTab(info,QPixmap(":/png/system-file-manager.png"),tr("Info"));
+       rtab->addTab(info,QPixmap(":/png/system-file-manager.png"),_("Info"));
        hlp = createHlpPanel(this);
-       rtab->addTab(hlp,QPixmap(":/png/help-contents.png"),tr("Help"));
+       rtab->addTab(hlp,QPixmap(":/png/help-contents.png"),_("Help"));
        edit = new TextPanel(this);     edit->graph = graph;
        graph->textMGL = edit->edit;
        connect(graph->mgl,SIGNAL(showWarn(QString)),mess,SLOT(setText(QString)));
        connect(graph->mgl,SIGNAL(showWarn(QString)),edit->edit,SLOT(setErrMessage(QString)));
        connect(graph,SIGNAL(clearWarn()),mess,SLOT(clear()));
-       ltab->addTab(edit,QPixmap(":/png/text-plain.png"),tr("Script"));
+       ltab->addTab(edit,QPixmap(":/png/text-plain.png"),_("Script"));
 
        calcWnd->setWidget(createCalcDlg(this, edit->edit));
        calcWnd->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
@@ -252,7 +265,7 @@ MainWindow::MainWindow(QWidget *wp) : QMainWindow(wp)
        connect(edit,SIGNAL(setCurrentFile(QString)),this,SLOT(setCurrentFile(QString)));
        connect(edit,SIGNAL(setStatus(QString)),this,SLOT(setStatus(QString)));
 
-       setStatus(tr("Ready"));
+       setStatus(_("Ready"));
        num_wnd++;
        edit->setAcceptDrops(false);    // for disabling default action by 'edit'
        setAcceptDrops(true);
@@ -265,29 +278,29 @@ void MainWindow::makeMenu()
 
        // file menu
        {
-       o = menuBar()->addMenu(tr("File"));
-       a = new QAction(QPixmap(":/png/document-new.png"), tr("New script"), this);
+       o = menuBar()->addMenu(_("File"));
+       a = new QAction(QPixmap(":/png/document-new.png"), _("New script"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(newDoc()));
-       a->setToolTip(tr("Create new empty script window (Ctrl+N)."));
+       a->setToolTip(_("Create new empty script window (Ctrl+N)."));
        a->setShortcut(Qt::CTRL+Qt::Key_N);     o->addAction(a);
 
        o->addAction(aload);
        o->addAction(asave);
 
-       a = new QAction(tr("Save as ..."), this);
+       a = new QAction(_("Save as ..."), this);
        connect(a, SIGNAL(triggered()), this, SLOT(saveAs()));
        o->addAction(a);
 
        o->addSeparator();
-       o->addAction(tr("Print script"), edit, SLOT(printText()));
-       a = new QAction(QPixmap(":/png/document-print.png"), tr("Print graphics"), this);
+       o->addAction(_("Print script"), edit, SLOT(printText()));
+       a = new QAction(QPixmap(":/png/document-print.png"), _("Print graphics"), this);
        connect(a, SIGNAL(triggered()), graph->mgl, SLOT(print()));
-       a->setToolTip(tr("Open printer dialog and print graphics (Ctrl+P)"));
+       a->setToolTip(_("Open printer dialog and print graphics (Ctrl+P)"));
        a->setShortcut(Qt::CTRL+Qt::Key_P);     o->addAction(a);
        o->addSeparator();
-       fileMenu = o->addMenu(tr("Recent files"));
+       fileMenu = o->addMenu(_("Recent files"));
        o->addSeparator();
-       o->addAction(tr("Quit"), qApp, SLOT(closeAllWindows()));
+       o->addAction(_("Quit"), qApp, SLOT(closeAllWindows()));
        }
 
        menuBar()->addMenu(edit->menu);
@@ -295,11 +308,11 @@ void MainWindow::makeMenu()
 
        // settings menu
        {
-       o = menuBar()->addMenu(tr("Settings"));
-       a = new QAction(QPixmap(":/png/preferences-system.png"), tr("Properties"), this);
+       o = menuBar()->addMenu(_("Settings"));
+       a = new QAction(QPixmap(":/png/preferences-system.png"), _("Properties"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(properties()));
-       a->setToolTip(tr("Show dialog for UDAV properties."));  o->addAction(a);
-       o->addAction(tr("Set arguments"), createArgsDlg(this), SLOT(exec()));
+       a->setToolTip(_("Show dialog for UDAV properties."));   o->addAction(a);
+       o->addAction(_("Set arguments"), createArgsDlg(this), SLOT(exec()));
 
        o->addAction(acalc);
        o->addAction(ainfo);
@@ -307,16 +320,16 @@ void MainWindow::makeMenu()
        }
 
        menuBar()->addSeparator();
-       o = menuBar()->addMenu(tr("Help"));
-       a = new QAction(QPixmap(":/png/help-contents.png"), tr("MGL help"), this);
+       o = menuBar()->addMenu(_("Help"));
+       a = new QAction(QPixmap(":/png/help-contents.png"), _("MGL help"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(showHelp()));
-       a->setToolTip(tr("Show help on MGL commands (F1)."));
+       a->setToolTip(_("Show help on MGL commands (F1)."));
        a->setShortcut(Qt::Key_F1);     o->addAction(a);
-       a = new QAction(QPixmap(":/png/help-faq.png"), tr("Hints"), this);
+       a = new QAction(QPixmap(":/png/help-faq.png"), _("Hints"), this);
        connect(a, SIGNAL(triggered()), this, SLOT(showHint()));
-       a->setToolTip(tr("Show hints of MGL usage."));  o->addAction(a);
-       o->addAction(tr("About"), this, SLOT(about()));
-       o->addAction(tr("About Qt"), this, SLOT(aboutQt()));
+       a->setToolTip(_("Show hints of MGL usage."));   o->addAction(a);
+       o->addAction(_("About"), this, SLOT(about()));
+       o->addAction(_("About Qt"), this, SLOT(aboutQt()));
 }
 //-----------------------------------------------------------------------------
 void MainWindow::closeEvent(QCloseEvent* ce)
@@ -324,8 +337,8 @@ void MainWindow::closeEvent(QCloseEvent* ce)
        bool ok=true;
        writeSettings();
        if(edit->isModified())
-               switch(QMessageBox::information(this, tr("UDAV"),
-                               tr("Do you want to save the changes to the document?"),
+               switch(QMessageBox::information(this, _("UDAV"),
+                               _("Do you want to save the changes to the document?"),
                                QMessageBox::Yes, QMessageBox::No, QMessageBox::Cancel))
                {
                        case QMessageBox::Yes:  save(); break;
@@ -418,16 +431,17 @@ void MainWindow::showHelp()
 int mgl_cmd_cmp(const void *a, const void *b);
 void MainWindow::editPosChanged()
 {
-       register int i, n;
        QString text = edit->selection(), dlm(" #;:\t");
-       n = text.length();
+       int n = text.length(), i;
        for(i=0;i<n;i++)        if(dlm.contains(text[i]))       break;
        text.truncate(i);
 
-       const char *desc = parser.CmdDesc(text.toStdString().c_str());
-       const char *form = parser.CmdFormat(text.toStdString().c_str());
-       if(form)        setStatus(QString::fromLocal8Bit(desc)+": "+QString::fromLocal8Bit(form));
-       else    setStatus(tr("Not recognized"));
+       QByteArray qxtext = text.toLatin1();
+       const char *ctext = qxtext.constData();
+       const char *desc = parser.CmdDesc(ctext);
+       const char *form = parser.CmdFormat(ctext);
+       if(form)        setStatus(QString(desc)+": "+QString(form));
+       else    setStatus(_("Not recognized"));
 }
 //-----------------------------------------------------------------------------
 void MainWindow::setEditPos(bool bottom)
@@ -437,13 +451,13 @@ void MainWindow::properties()     {       propDlg->exec();        }
 //-----------------------------------------------------------------------------
 void MainWindow::about()
 {
-       QString s = tr("<a href='http://mathgl.sourceforge.net/doc_en/UDAV-overview.html'>UDAV</a> v. 2.")+QString::number(MGL_VER2)+
-       tr("<br>(c) Alexey Balakin, 2007-2014<br><br><a href='http://www.gnu.org/copyleft/gpl.html'>License is GPL v.2 or later.</a>");
-       QMessageBox::about(this, tr("UDAV - about"), s);
+       QString s = "<a href='http://mathgl.sourceforge.net/doc_en/UDAV-overview.html'>UDAV</a> v. 2."+QString::number(MGL_VER2)+
+       _("<br>(c) Alexey Balakin, 2007-present<br><br><a href='http://www.gnu.org/copyleft/gpl.html'>License is GPL v.2 or later.</a>");
+       QMessageBox::about(this, _("UDAV - about"), s);
 }
 //-----------------------------------------------------------------------------
 void MainWindow::aboutQt()
-{      QMessageBox::aboutQt(this, tr("About Qt"));     }
+{      QMessageBox::aboutQt(this, _("About Qt"));      }
 //-----------------------------------------------------------------------------
 void MainWindow::writeSettings()
 {
@@ -540,20 +554,20 @@ void MainWindow::setStatus(const QString &txt)
 void MainWindow::setCurrentFile(const QString &fileName)
 {
        filename = fileName;
-       mgl_set_plotid(graph->mgl->getGraph(), fileName.toStdString().c_str());
+       mgl_set_plotid(graph->mgl->getGraph(), fileName.toLocal8Bit().constData());
        edit->setModified(false);
        if(filename.isEmpty())
-               setWindowTitle(tr("untitled - UDAV"));
+               setWindowTitle(_("untitled - UDAV"));
        else
        {
-               setWindowTitle(QFileInfo(filename).fileName()+tr(" - UDAV"));
+               setWindowTitle(QFileInfo(filename).fileName()+" - UDAV");
                int i = recentFiles.indexOf(filename);
                if(i>=0)        recentFiles.removeAt(i);
                recentFiles.push_front(filename);
                updateRecentFileItems();
                if(chdir(qPrintable(QFileInfo(filename).path())))
-                       QMessageBox::warning(this, tr("UDAV - save current"),
-                               tr("Couldn't change to folder ")+QFileInfo(filename).path());
+                       QMessageBox::warning(this, _("UDAV - save current"),
+                               _("Couldn't change to folder ")+QFileInfo(filename).path());
        }
 }
 //-----------------------------------------------------------------------------
@@ -562,8 +576,8 @@ void MainWindow::openRecentFile()
        QAction *a = qobject_cast<QAction *>(sender());
        if(!a)  return;
        if(edit->isModified())
-               switch(QMessageBox::information(this, tr("UDAV - save current"),
-                               tr("Do you want to save the changes to the document?"),
+               switch(QMessageBox::information(this, _("UDAV - save current"),
+                               _("Do you want to save the changes to the document?"),
                                QMessageBox::Yes, QMessageBox::No, QMessageBox::Cancel))
                {
                        case QMessageBox::Yes:  save(); break;
@@ -604,8 +618,8 @@ void MainWindow::newDoc()
 void MainWindow::choose()
 {
        if(edit->isModified())
-               switch(QMessageBox::information(this, tr("UDAV - save current"),
-                               tr("Do you want to save the changes to the document?"),
+               switch(QMessageBox::information(this, _("UDAV - save current"),
+                               _("Do you want to save the changes to the document?"),
                                QMessageBox::Yes, QMessageBox::No, QMessageBox::Cancel))
                {
                        case QMessageBox::Yes:  save(); break;
@@ -616,12 +630,12 @@ void MainWindow::choose()
        settings.setPath(QSettings::IniFormat, QSettings::UserScope, "UDAV");
        settings.beginGroup("/UDAV");
        QString fn = QFileDialog::getOpenFileName(this,
-                       tr("UDAV - Open file"),
+                       _("UDAV - Open file"),
                        settings.value("/filePath", MGL_DOC_DIR).toString(),
-                       tr("MGL scripts (*.mgl)\nHDF5 files (*.hdf *.h5)\nText files (*.txt)\nData files (*.dat)\nAll files (*.*)"));
+                       _("MGL scripts (*.mgl)\nHDF5 files (*.hdf *.h5)\nText files (*.txt)\nData files (*.dat)\nAll files (*.*)"));
        settings.endGroup();
        if(!fn.isEmpty())       load(fn);
-       else    setStatus(tr("Loading aborted"));
+       else    setStatus(_("Loading aborted"));
 }
 //-----------------------------------------------------------------------------
 void MainWindow::load(const QString &fileName, bool noNewWnd)
@@ -652,10 +666,10 @@ void MainWindow::save()
 void MainWindow::saveAs()
 {
        QString fn;
-       fn = QFileDialog::getSaveFileName(this, tr("UDAV - save file"), "",
-                       tr("MGL scripts (*.mgl)\nHDF5 files (*.hdf *.h5)\nAll files (*.*)"));
+       fn = QFileDialog::getSaveFileName(this, _("UDAV - save file"), "",
+                       _("MGL scripts (*.mgl)\nHDF5 files (*.hdf *.h5)\nAll files (*.*)"));
        if(fn.isEmpty())
-       {       setStatus(tr("Saving aborted"));        return; }
+       {       setStatus(_("Saving aborted")); return; }
        else
        {
                int nn=fn.length();
@@ -669,16 +683,16 @@ void MainWindow::setAsterix()
        if(edit->isModified())
        {
                if(filename.isEmpty())
-                       setWindowTitle(tr("untitled* - UDAV"));
+                       setWindowTitle(_("untitled* - UDAV"));
                else
-                       setWindowTitle(QFileInfo(filename).fileName()+tr("* - UDAV"));
+                       setWindowTitle(QFileInfo(filename).fileName()+"* - UDAV");
        }
        else
        {
                if(filename.isEmpty())
-                       setWindowTitle(tr("untitled - UDAV"));
+                       setWindowTitle(_("untitled - UDAV"));
                else
-                       setWindowTitle(QFileInfo(filename).fileName()+tr(" - UDAV"));
+                       setWindowTitle(QFileInfo(filename).fileName()+" - UDAV");
        }
 }
 //-----------------------------------------------------------------------------
index 9dca3b13ba49b2dcc4db7f1b2e001778990f36f3..688e1b1ee67abe537900ec15d8a3b04316c4822c 100644 (file)
@@ -1,35 +1,54 @@
-include_directories(${GSL_INCLUDE_DIR})
 add_executable(make_pas make_pas.cpp)
 
 add_executable(mglconv mglconv.cpp)
-target_link_libraries(mglconv mgl)
+if(MSVC)
+set(link_type -static)
+else(MSVC)
+set(link_type)
+endif(MSVC)
+target_link_libraries(mglconv mgl${link_type} ${getopt_lib-static})
 install(
        TARGETS mglconv
-       RUNTIME DESTINATION bin
+       EXPORT MathGLTargets
+       RUNTIME DESTINATION ${MathGL_INSTALL_BIN_DIR}
 )
 
 add_executable(mgl.cgi mglcgi.cpp)
-target_link_libraries(mgl.cgi mgl)
+target_link_libraries(mgl.cgi mgl${link_type})
 install(
        TARGETS mgl.cgi
+       EXPORT MathGLTargets
 # should be /usr/lib/cgi-bin/
        RUNTIME DESTINATION ${MGL_CGI_PATH}
 )
 
-if(QT_ENABLED)
-       add_executable(mglview mglview.cpp)
-       if(enable-qt5)
-               include(../cmake-qt5.txt)
-               target_link_libraries(mglview mgl-qt5)
-               qt5_use_modules(mglview ${MGL_QT5_LIBS})
-       else(enable-qt5)
-               include(../cmake-qt4.txt)
-               target_link_libraries(mglview mgl-qt4)
-               qt4_use_modules(mglview ${MGL_QT4_LIBS})
-       endif(enable-qt5)
+mgl_po_src(mglconv.cpp mglview.cpp mglcgi.cpp)
 
+if(MGL_HAVE_FLTK)
+       add_definitions(-DUSE_FLTK)
+       add_executable(mglview mglview.cpp)
+       target_link_libraries(mglview mgl-fltk ${getopt_lib-static} ${FLTK_LIBRARIES})
        install(
                TARGETS mglview
-               RUNTIME DESTINATION bin
+               EXPORT MathGLTargets
+               RUNTIME DESTINATION ${MathGL_INSTALL_BIN_DIR}
        )
-endif(QT_ENABLED)
+
+else(MGL_HAVE_FLTK)
+       if(QT_ENABLED)
+               add_executable(mglview mglview.cpp)
+               if(enable-qt5)
+                       include(../scripts/qt5.cmake)
+                       target_link_libraries(mglview mgl-qt5${link_type} ${getopt_lib-static} ${MGL_QT5_LIBS})
+               else(enable-qt5)
+                       include(../scripts/qt4.cmake)
+                       target_link_libraries(mglview mgl-qt4${link_type} ${getopt_lib-static} ${MGL_QT4_LIBS})
+               endif(enable-qt5)
+
+               install(
+                       TARGETS mglview
+                       EXPORT MathGLTargets
+                       RUNTIME DESTINATION ${MathGL_INSTALL_BIN_DIR}
+               )
+       endif(QT_ENABLED)
+endif(MGL_HAVE_FLTK)
index fd38efdf5553fbd27f9187d2a23e552f6bd732ec..eb677902842f1f0c43f607d061a357498dbe6e3c 100644 (file)
@@ -1,5 +1,7 @@
 #include <stdio.h>
 #include <string.h>
+#include<mgl2/define.h>
+
 
 const char *files[] =
 {
index befec3001b942c25c8960c03b44740be6c66b567..d602de0573e6d6eb26fd08ffb7058207663e35c8 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************
  * mglcgi.cpp is part of Math Graphic Library
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   it under the terms of the GNU General Public License as published by  *
@@ -38,10 +38,10 @@ void mgl_get_value(const char *buf, const char *name, char *val)
        if(pos && (pos==buf || pos[-1]=='&'))
        {
                pos+=4; // shift for "mgl="
-               register size_t i,j,l=strlen(pos);
-               for(i=j=0;i<l;i++,j++)
+               size_t l=strlen(pos);
+               for(size_t i=0, j=0;i<l;i++,j++)
                {
-                       register char ch=pos[i];
+                       char ch=pos[i];
                        if(ch=='&')     break;
                        else if(ch=='+')        val[j]=' ';
                        else if(ch=='%' && i+2<l)
@@ -51,16 +51,15 @@ void mgl_get_value(const char *buf, const char *name, char *val)
        }
 }
 //-----------------------------------------------------------------------------
-int main()
+int main(int argc, char **argv)
 {
+       mgl_textdomain(argv?argv[0]:NULL,"");
        mgl_suppress_warn(true);
        mglGraph gr;
        mglParse p(true);
 
        mgl_ask_func = 0;
        // read script
-       setlocale(LC_CTYPE, "");
-
        char *str, *buf;
        const char *method = getenv("REQUEST_METHOD");
        bool alloc=false;
@@ -68,11 +67,11 @@ int main()
        {
                long len=atol(getenv("CONTENT_LENGTH"));
                buf = new char[len+1];
-               if(!fread(buf,len,1,stdin))     len=0;
+               len = fread(buf,len,1,stdin);
                buf[len]=0;     alloc=true;
        }
        else            buf = getenv("QUERY_STRING");
-       if(buf==0)      {       printf("There is no query. Exit.\n");   return 0;       }
+       if(buf==0)      {       printf(_("There is no query. Exit.\n"));        return 0;       }
        str = new char[strlen(buf)+1];
        mgl_get_value(buf,"mgl",str);
 
index 9f6551c9024918e4e0c9edc14fbc7eb099f82671..e86e8744faec60dfd5ddccc4b271aca34894d3bb 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * mglconv.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU General Public License as published by  *\r
 #include <locale.h>\r
 #include <getopt.h>\r
 #include "mgl2/mgl.h"\r
+\r
+#ifdef _MSC_VER\r
+#define mnpos (std::basic_string<wchar_t>::size_type)-1\r
+#else\r
+#define mnpos std::wstring::npos\r
+#endif\r
 void mgl_error_print(const char *Message, void *par);\r
 void mgl_ask_gets(const wchar_t *quest, wchar_t *res);\r
 //-----------------------------------------------------------------------------\r
 int main(int argc, char *argv[])\r
 {\r
+       mgl_textdomain(argv?argv[0]:NULL,"");\r
        mgl_suppress_warn(true);\r
        mglGraph gr;\r
        mglParse p(true);\r
@@ -35,11 +42,10 @@ int main(int argc, char *argv[])
 \r
        while(1)\r
        {\r
-               int ch = getopt(argc, argv, "1:2:3:4:5:6:7:8:9:hno:L:C:A:s:S:q:");\r
+               int ch = getopt(argc, argv, "1:2:3:4:5:6:7:8:9:hno:L:C:A:s:S:q:v:g:");\r
                if(ch>='1' && ch<='9')  p.AddParam(ch-'0', optarg);\r
                else if(ch=='s')\r
                {\r
-                       setlocale(LC_CTYPE, "");\r
                        FILE *fp = fopen(optarg,"r");\r
                        if(fp)\r
                        {\r
@@ -49,13 +55,16 @@ int main(int argc, char *argv[])
                        }\r
                }\r
                else if(ch=='n')        none = true;\r
-               else if(ch=='L')        setlocale(LC_CTYPE, optarg);\r
+               else if(ch=='L')\r
+               {       setlocale(LC_ALL, optarg);      setlocale(LC_NUMERIC, "C");     }\r
                else if(ch=='S')        mgl_set_size_scl(atof(optarg));\r
                else if(ch=='q')        gr.SetQuality(atoi(optarg));\r
+               else if(ch=='v')        p.SetVariant(atoi(optarg));\r
+               else if(ch=='g')        gr.Gray(atoi(optarg));\r
                else if(ch=='A')\r
                {\r
                        std::wstring str;\r
-                       for(long i=0;optarg[i];i++)     str.push_back(optarg[i]);\r
+                       for(size_t i=0;optarg[i];i++)   str.push_back(optarg[i]);\r
                        var.push_back(str);\r
                }\r
                else if(ch=='C')\r
@@ -72,51 +81,52 @@ int main(int argc, char *argv[])
                }\r
                else if(ch=='h' || (ch==-1 && optind>=argc))\r
                {\r
-                       printf("mglconv convert mgl script to bitmap png file.\nCurrent version is 2.%g\n",MGL_VER2);\r
-                       printf("Usage:\tmglconv [parameter(s)] scriptfile\n");\r
+                       printf(_("mglconv convert mgl script to image file (default PNG).\nCurrent version is 2.%g\n"),MGL_VER2);\r
+                       printf(_("Usage:\tmglconv [parameter(s)] scriptfile\n"));\r
                        printf(\r
-                               "\t-1 str       set str as argument $1 for script\n"\r
+                               _("\t-1 str       set str as argument $1 for script\n"\r
                                "\t...          ...\n"\r
                                "\t-9 str       set str as argument $9 for script\n"\r
                                "\t-L loc       set locale to loc\n"\r
                                "\t-s fname     set MGL script for setting up the plot\n"\r
                                "\t-S val       set scaling factor for images\n"\r
                                "\t-q val       set quality for output (val=0...9)\n"\r
+                               "\t-g val       set gray-scale mode (val=0|1)\n"\r
+                               "\t-v val       set variant of arguments\n"\r
                                "\t-o name      set output file name\n"\r
                                "\t-n           no default output (script should save results by itself)\n"\r
                                "\t-A val       add animation value val\n"\r
                                "\t-C n1:n2:dn  add animation value in range [n1,n2] with step dn\n"\r
                                "\t-C n1:n2     add animation value in range [n1,n2] with step 1\n"\r
                                "\t-            get script from standard input\n"\r
-                               "\t-h           print this message\n" );\r
+                               "\t-h           print this message\n") );\r
                        return 0;\r
                }\r
-               else if(ch=='o')        strncpy(oname, optarg,256);\r
+               else if(ch=='o')        mgl_strncpy(oname, optarg,256);\r
                else if(ch==-1 && optind<argc)\r
-               {       strncpy(iname, argv[optind][0]=='-'?"":argv[optind],256);       break;  }\r
+               {       mgl_strncpy(iname, argv[optind][0]=='-'?"":argv[optind],256);   break;  }\r
        }\r
-       if(*oname==0)   {       strncpy(oname,*iname?iname:"out",250);  strcat(oname,".png");   }\r
+       if(*oname==0)   {       mgl_strncpy(oname,*iname?iname:"out",250);      strcat(oname,".png");   }\r
        else    none = false;\r
 \r
        mgl_ask_func = mgl_ask_gets;\r
        // prepare for animation\r
-       setlocale(LC_CTYPE, "");\r
        FILE *fp = *iname?fopen(iname,"r"):stdin;\r
        if(!fp) {       printf("No file for MGL script\n");     return 0;       }\r
        wchar_t cw;\r
        while(!feof(fp) && size_t(cw=fgetwc(fp))!=WEOF) str.push_back(cw);\r
        if(*iname)      fclose(fp);\r
 \r
-       unsigned long n;\r
-       for(long i=0;;) // collect exact values\r
+       size_t n;\r
+       for(size_t i=0;;)       // collect exact values\r
        {\r
                n = str.find(L"##a ",i);\r
-               if(n==std::string::npos)        break;\r
+               if (n == mnpos) break;\r
                i = n+4;        var.push_back(str.substr(i,str.find('\n',i)));\r
        }\r
        n = str.find(L"##c ");\r
-       if(n!=std::string::npos)\r
-       {\r
+       if (n != mnpos)\r
+               {\r
                double v1,v2,dv,v;\r
                wscanf(str.c_str()+n+4,L"%lg%lg%lg",&v1,&v2,&dv);\r
                wchar_t ss[64];\r
@@ -124,18 +134,19 @@ int main(int argc, char *argv[])
                {       mglprintf(ss,64,L"%g",v);       var.push_back(ss);      }\r
        }\r
        bool gif = !strcmp(oname+strlen(oname)-4,".gif");\r
+       gr.SetSize(600,400);    // specially call for "S" option\r
        if(var.size()>1)        // there is animation\r
        {\r
                if(gif) gr.StartGIF(oname);\r
-               for(unsigned long i=0;i<var.size();i++)\r
+               for(size_t i=0;i<var.size();i++)\r
                {\r
                        gr.NewFrame();\r
-                       printf("frame %ld for $0 = \"%ls\"\n",i,var[i].c_str());\r
+                       printf("frame %zu for $0 = \"%ls\"\n",i,var[i].c_str());\r
                        p.AddParam(0,var[i].c_str());\r
                        p.Execute(&gr,str.c_str());\r
                        if(gr.Message()[0])     printf("%s\n",gr.Message());\r
                        gr.EndFrame();\r
-                       snprintf(buf,2048,"%s-%ld",oname,i);    buf[2047]=0;\r
+                       snprintf(buf,2048,"%s-%zu",oname,i);    buf[2047]=0;\r
                        if(!gif)        gr.WriteFrame(buf);\r
                }\r
                if(gif) gr.CloseGIF();\r
index a005cebaf343ed75a0df82ae6b1f6b3c90ca9532..a13dd67b58bda93638bd3d95846e05740969bc84 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************
  * mglview.cpp is part of Math Graphic Library
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   it under the terms of the GNU General Public License as published by  *
 #include <getopt.h>
 
 #include "mgl2/mgl.h"
-#include "mgl2/qt.h"
+#if USE_FLTK
+       #include "mgl2/fltk.h"
+       #include <Fl/Fl.H>
+       #include <Fl/Fl_Preferences.H>
+#else
+       #include "mgl2/qt.h"
+#endif
 //-----------------------------------------------------------------------------
 std::wstring str, opt;
 mglParse p(true);
-void mgl_error_print(const char *Message, void *par);
-void mgl_ask_fltk(const wchar_t *quest, wchar_t *res);
-void mgl_ask_qt(const wchar_t *quest, wchar_t *res);
-void mgl_ask_gets(const wchar_t *quest, wchar_t *res);
 //-----------------------------------------------------------------------------
 int show(mglGraph *gr)
 {
@@ -39,15 +41,16 @@ int show(mglGraph *gr)
 //-----------------------------------------------------------------------------
 int main(int argc, char **argv)
 {
+       mgl_textdomain(argv?argv[0]:NULL,"");
        char iname[256]="";
        mgl_suppress_warn(true);
+       bool gray = false;
        while(1)
        {
-               int ch = getopt(argc, argv, "1:2:3:4:5:6:7:8:9:hL:s:");
+               int ch = getopt(argc, argv, "1:2:3:4:5:6:7:8:9:hL:s:g:v:");
                if(ch>='1' && ch<='9')  p.AddParam(ch-'0', optarg);
                else if(ch=='s')
                {
-                       setlocale(LC_CTYPE, "");
                        FILE *fp = fopen(optarg,"r");
                        if(fp)
                        {
@@ -56,30 +59,34 @@ int main(int argc, char **argv)
                                fclose(fp);
                        }
                }
-               else if(ch=='L')        setlocale(LC_CTYPE, optarg);
+               else if(ch=='v')        p.SetVariant(atoi(optarg));
+               else if(ch=='g')        gray= atoi(optarg);
+               else if(ch=='L')
+               {       setlocale(LC_ALL, optarg);      setlocale(LC_NUMERIC, "C");     }
                else if(ch=='h' || (ch==-1 && optind>=argc))
                {
-                       printf("mglview show plot from MGL script or MGLD file.\nCurrent version is 2.%g\n",MGL_VER2);
-                       printf("Usage:\tmglview [parameter(s)] scriptfile\n");
+                       printf(_("mglview show plot from MGL script or MGLD file.\nCurrent version is 2.%g\n"),MGL_VER2);
+                       printf(_("Usage:\tmglview [parameter(s)] scriptfile\n"));
                        printf(
-                               "\t-1 str       set str as argument $1 for script\n"
+                               _("\t-1 str       set str as argument $1 for script\n"
                                "\t...          ...\n"
                                "\t-9 str       set str as argument $9 for script\n"
+                               "\t-g val       set gray-scale mode (val=0|1)\n"
+                               "\t-v val       set variant of arguments\n"
                                "\t-s opt       set MGL script for setting up the plot\n"
                                "\t-L loc       set locale to loc\n"
                                "\t-            get script from standard input\n"
-                               "\t-h           print this message\n" );
+                               "\t-h           print this message\n") );
                        return 0;
                }
                else if(ch==-1 && optind<argc)
-               {       strncpy(iname, argv[optind][0]=='-'?"":argv[optind],256);       break;  }
+               {       mgl_strncpy(iname, argv[optind][0]=='-'?"":argv[optind],256);   break;  }
        }
 
        bool mgld=(*iname && iname[strlen(iname)-1]=='d');
        if(!mgld)
        {
                str = opt + L"\n";
-               setlocale(LC_CTYPE, "");
                FILE *fp = *iname?fopen(iname,"r"):stdin;
                if(fp)
                {
@@ -90,13 +97,24 @@ int main(int argc, char **argv)
                else    {       printf("No file for MGL script\n");     return 0;       }
        }
 
-       mgl_ask_func = mgl_ask_gets;
+#if USE_FLTK
+       mgl_ask_func = mgl_ask_fltk;
+       Fl_Preferences pref(Fl_Preferences::USER,"abalakin","mgllab");
+       static const char *sch[4]={"base","gtk+","plastic","gleam"};
+       int scheme;     pref.get("scheme",scheme,2);
+       Fl::scheme(sch[scheme]);
+       mglFLTK gr(mgld?NULL:show, *iname?iname:"mglview");
+#else
        mgl_ask_func = mgl_ask_qt;
        mglQT gr(mgld?NULL:show, *iname?iname:"mglview");
+#endif
+       if(gray)        gr.Gray(gray);
+
        if(mgld)
        {
                gr.Setup(false);
-               gr.NewFrame();  setlocale(LC_NUMERIC, "C");
+               gr.NewFrame();
+               const std::string loc = setlocale(LC_NUMERIC, "C");
                if(!opt.empty())
                {
                        p.Execute(&gr,opt.c_str());
@@ -104,8 +122,8 @@ int main(int argc, char **argv)
                        gr.ImportMGLD(iname,true);
                }
                else    gr.ImportMGLD(iname);
-               setlocale(LC_NUMERIC, "");      gr.EndFrame();
-               gr.Update();
+               setlocale(LC_NUMERIC, loc.c_str());
+               gr.EndFrame();  gr.Update();
        }
        if(!mglGlobalMess.empty())      printf("%s",mglGlobalMess.c_str());
        return gr.Run();
index f05ea5ad5380fc52b94741b2507300970beaca5a..1b5ceb2e08733035d96bdde5264dbb419f7e8f38 100644 (file)
@@ -1,11 +1,11 @@
 include(GenerateExportHeader)
-add_compiler_export_flags()
 
 if(MGL_HAVE_FLTK)
-       mgl_add_lib(fltk fltk.cpp ../include/mgl2/fltk.h)
+       mgl_add_lib(fltk fltk.cpp  image.cpp  image.h ../include/mgl2/fltk.h ../include/mgl2/Fl_MathGL.h)
        target_include_directories(mgl-fltk SYSTEM PUBLIC ${FLTK_INCLUDE_DIR})
        target_include_directories(mgl-fltk-static SYSTEM PUBLIC ${FLTK_INCLUDE_DIR})
        target_link_libraries(mgl-fltk mgl ${FLTK_LIBRARIES})
+       target_link_libraries(mgl-fltk-static mgl-static ${FLTK_LIBRARIES})
 endif(MGL_HAVE_FLTK)
 
 if(MGL_HAVE_GLUT)
@@ -13,14 +13,17 @@ if(MGL_HAVE_GLUT)
        target_include_directories(mgl-glut SYSTEM PUBLIC ${GLUT_INCLUDE_DIR})
        target_include_directories(mgl-glut-static SYSTEM PUBLIC ${GLUT_INCLUDE_DIR})
        target_link_libraries(mgl-glut mgl ${GLUT_LIBRARIES} ${OPENGL_LIBRARIES})
+       target_link_libraries(mgl-glut-static mgl-static ${GLUT_LIBRARIES} ${OPENGL_LIBRARIES})
 endif(MGL_HAVE_GLUT)
 
 if(MGL_HAVE_WX)
        mgl_add_lib(wx wx.cpp ../include/mgl2/wx.h)
        include(${wxWidgets_USE_FILE})
-       target_link_libraries(mgl-wx mgl)
-       target_link_libraries(mgl-wx ${wxWidgets_LIBRARIES})
+       target_link_libraries(mgl-wx mgl ${wxWidgets_LIBRARIES})
+       target_link_libraries(mgl-wx-static mgl-static ${wxWidgets_LIBRARIES})
 endif(MGL_HAVE_WX)
 
 add_subdirectory( qt4 )
 add_subdirectory( qt5 )
+
+mgl_po_src(fltk.cpp ../include/mgl2/fltk.h ../include/mgl2/Fl_MathGL.h glut.cpp ../include/mgl2/glut.h wx.cpp ../include/mgl2/wx.h qt.cpp ../include/mgl2/qt.h  ../include/mgl2/qmathgl.h)
index 551681391eec27c2c2bfbfc65dd2c66c62b6992f..c176f251cd4cbeb57c252f5bb331380a1712cd2b 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************
  * fltk.cpp is part of Math Graphic Library
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   it under the terms of the GNU Library General Public License as       *
 #include <FL/fl_ask.H>
 #include <FL/Fl_Double_Window.H>
 #include <FL/fl_draw.H>
-#include <FL/Fl_File_Chooser.H>
-//-----------------------------------------------------------------------------
-#ifdef USE_GETTEXT
-#include <libintl.h>
-#endif
-#ifndef _LIBINTL_H     // Workaround for gcc 4.2
-#define mgl_gettext(x) (x)
-#else
-#define mgl_gettext(x) gettext(x)
-#endif
+#include <FL/Fl_Native_File_Chooser.H>
 //-----------------------------------------------------------------------------
 #include "mgl2/canvas_wnd.h"
 #include "mgl2/Fl_MathGL.h"
+#include <limits.h>
 //-----------------------------------------------------------------------------
-#include "xpm/show_sl.xpm"
-#include "xpm/next_sl.xpm"
-#include "xpm/prev_sl.xpm"
-#include "xpm/left_1.xpm"
-#include "xpm/right_1.xpm"
-#include "xpm/down_1.xpm"
-#include "xpm/norm_1.xpm"
-#include "xpm/zoom_1.xpm"
-#include "xpm/up_1.xpm"
-#include "xpm/alpha.xpm"
-#include "xpm/light.xpm"
-#include "xpm/zoom_in.xpm"
-#include "xpm/zoom_out.xpm"
-#include "xpm/rotate.xpm"
-#include "xpm/ok.xpm"
-#include "xpm/wire.xpm"
-#include "xpm/stop.xpm"
-#include "xpm/pause.xpm"
-//-----------------------------------------------------------------------------
-Fl_Pixmap xpm_a1(alpha_xpm);
-Fl_Pixmap xpm_l1(light_xpm);
-Fl_Pixmap xpm_z1(zoom_in_xpm);
-Fl_Pixmap xpm_s1(show_sl_xpm);
-Fl_Pixmap xpm_r1(rotate_xpm);
-Fl_Pixmap xpm_wire(wire_xpm);
-Fl_Pixmap xpm_pause(pause_xpm);
+#define MGL_MAX_LINES  (INT_MAX-1000)
 //-----------------------------------------------------------------------------
 /// Class allows the window creation for displaying plot bitmap with the help of FLTK library
 /** NOTE!!! All frames are saved in memory. So animation with many frames require a lot memory and CPU time (for example, for mouse rotation).*/
@@ -92,7 +59,7 @@ using mglCanvasWnd::Window;
 //-----------------------------------------------------------------------------
 void MGL_EXPORT mgl_ask_fltk(const wchar_t *quest, wchar_t *res)
 {
-       static char buf[1024];  *res=0;
+       static char buf[1024];  *res=0; // TODO
 #if FL_MINOR_VERSION>=3
        fl_utf8fromwc(buf, 1024, quest, mgl_wcslen(quest)+1);
        const char *str = fl_input("%s",buf,"");
@@ -108,14 +75,36 @@ void MGL_EXPORT mgl_ask_fltk(const wchar_t *quest, wchar_t *res)
 //             class Fl_MathGL
 //
 //-----------------------------------------------------------------------------
+MGL_EXPORT const char *mgl_file_chooser(const char *mess, const char *filter, bool save)
+{
+       static Fl_Native_File_Chooser fnfc;
+       fnfc.title(mess);
+       fnfc.type(save ? Fl_Native_File_Chooser::BROWSE_SAVE_FILE : Fl_Native_File_Chooser::BROWSE_FILE);
+       fnfc.filter(filter);
+//     fnfc.directory("/var/tmp");           // default directory to use
+       fnfc.show();
+       return fnfc.filename();
+}
+MGL_EXPORT const char *mgl_dir_chooser(const char *mess, const char *path)
+{
+       static Fl_Native_File_Chooser fnfc;
+       fnfc.title(mess);
+       fnfc.type(Fl_Native_File_Chooser::BROWSE_DIRECTORY);
+       fnfc.directory(path);           // default directory to use
+       fnfc.show();
+       return fnfc.filename();
+}
+//-----------------------------------------------------------------------------
 Fl_MathGL::Fl_MathGL(int xx, int yy, int ww, int hh, const char *lbl) : Fl_Widget(xx,yy,ww,hh,lbl)
 {
-       gr = new mglCanvas;
-       tet=phi=x1=y1=0;        x2=y2=1;
-       zoom = rotate = false;
-       flag=x0=y0=xe=ye=0;
+       gr = new mglCanvas;     use_pthr = true;
+       tet=phi=x1=y1=0;        x2=y2=1;        img = 0;
+       zoom = rotate = handle_keys = grid = false;
+       flag=x0=y0=xe=ye=0;     show_warn=true;
        tet_val = phi_val = 0;
        draw_par = 0;   draw_func = 0;  draw_cl = 0;
+       last_id = -1;   run = false;
+       popup=0;        vpar=0; wpar=0; thr=0;
 }
 //-----------------------------------------------------------------------------
 Fl_MathGL::~Fl_MathGL()        {       if(mgl_use_graph(gr,-1)<1)      mgl_delete_graph(gr);   }
@@ -135,50 +124,105 @@ void Fl_MathGL::set_graph(HMGL GR)
 //-----------------------------------------------------------------------------
 void Fl_MathGL::draw()
 {
-       // TODO: add active points drawing here (from Qt)
-       const unsigned char *g = mgl_get_rgb(gr);
-       int i, ww=mgl_get_width(gr), hh=mgl_get_height(gr);
-       if(g)   fl_draw_image(g, x(), y(), ww, hh, 3);
-       if(flag&4)
+       if(!img)        img = mgl_get_rgb(gr);
+       int ww=mgl_get_width(gr), hh=mgl_get_height(gr);
+       if(img) fl_draw_image(img, x(), y(), ww, hh, 3);
+       if(grid)
        {
                char str[5]="0.0";
                fl_color(192,192,192);
-               for(i=1;i<10;i++)
+               for(int i=1;i<10;i++)
+               {
+                       str[2] = '0'+10-i;      fl_draw(str, x(), y()+i*hh/10);
+                       fl_line(x(), y()+i*hh/10, x()+ww, y()+i*hh/10);
+                       str[2] = '0'+i; fl_draw(str, x()+i*ww/10, y()+hh);
+                       fl_line(x()+i*ww/10, y(), x()+i*ww/10, y()+hh);
+               }
+               int d = (hh>ww?ww:hh)/100;
+               for(size_t i=0;i<gr->Act.size();i++)
                {
-                       str[2] = '0'+10-i;      fl_draw(str,30,30+i*hh/10);
-                       fl_line(30,30+i*hh/10,30+ww,30+i*hh/10);
-                       str[2] = '0'+i; fl_draw(str,30+i*ww/10,30+hh);
-                       fl_line(30+i*ww/10,30,30+i*ww/10,30+hh);
+                       const mglActivePos &p=gr->Act[i];
+                       fl_rectf(x()+p.x-d/2, y()+p.y-d/2-1, d,d, fl_rgb_color(127,255,63));
+                       fl_rect(x()+p.x-d/2, y()+p.y-d/2-1, d,d, FL_BLACK);
                }
-//             if(*MouseBuf)   fl_draw(MouseBuf,30,50);
+               mgl_set_flag(gr,1,MGL_SHOW_POS);
        }
+       else    mgl_set_flag(gr,0,MGL_SHOW_POS);
 }
 //-----------------------------------------------------------------------------
-void Fl_MathGL::update()
+inline void Fl_MathGL::draw_plot()     // drawing itself
 {
-       Fl::lock();
        if(draw_func || draw_cl)
        {
-               mgl_reset_frames(gr);
+               mgl_set_def_param(gr);          mgl_reset_frames(gr);
                if(mgl_get_flag(gr,MGL_CLF_ON_UPD))     mgl_set_def_param(gr);
                mgl_set_alpha(gr,flag&1);       mgl_set_light(gr,flag&2);
                if(tet_val)     tet = tet_val->value();
                if(phi_val)     phi = phi_val->value();
                mgl_zoom(gr,x1,y1,x2,y2);       mgl_view(gr,-phi,-tet,0);
-               setlocale(LC_NUMERIC, "C");
+               const std::string loc = setlocale(LC_NUMERIC, "C");
                // use frames for quickly redrawing while adding/changing primitives
                if(mgl_is_frames(gr))   mgl_new_frame(gr);
-               if(draw_func)   draw_func(gr, draw_par);        // drawing itself
+
+               if(draw_func)   draw_func(gr, draw_par);
                else    if(draw_cl)     {       mglGraph g(gr); draw_cl->Draw(&g);      }
+
                if(mgl_is_frames(gr))   mgl_end_frame(gr);
-               setlocale(LC_NUMERIC, "");
+               setlocale(LC_NUMERIC, loc.c_str());
                const char *buf = mgl_get_mess(gr);
-               if(*buf)        fl_message("%s",buf);
+               if(show_warn && *buf)   fl_message("%s",buf);
+               if(!prim.empty())       // manual primitives
+               {
+                       const std::string loc = setlocale(LC_NUMERIC, "C");
+                       mgl_subplot(gr,1,1,0,"#");
+                       mgl_set_ranges(gr, -1,1, -1,1, -1,1);
+                       mglParse pr;    pr.StartID(MGL_MAX_LINES);
+                       mgl_parse_text(gr,pr.Self(),prim.c_str());
+                       setlocale(LC_NUMERIC, loc.c_str());
+               }
+       }
+       else if(mgl_get_num_frame(gr)>0)
+       {
+               mgl_set_alpha(gr,flag&1);       mgl_set_light(gr,flag&2);
+               if(tet_val)     tet = tet_val->value();
+               if(phi_val)     phi = phi_val->value();
+               mgl_zoom(gr,x1,y1,x2,y2);       mgl_view(gr,-phi,-tet,0);
+               mgl_get_frame(gr,0);
+       }
+       mgl_finish(gr); img = mgl_get_rgb(gr);
+       run = false;    Fl::awake();
+}
+//-----------------------------------------------------------------------------
+MGL_NO_EXPORT void *draw_plot_thr(void *v)
+{      ((Fl_MathGL*)v)->draw_plot();   return 0;       }
+//-----------------------------------------------------------------------------
+void Fl_MathGL::update()
+{
+       if(run) return;
+//     Fl::lock();
+       run = true;
+#if MGL_HAVE_FL_COPY
+       top_window()->cursor(FL_CURSOR_WAIT);
+#endif
+#if MGL_HAVE_PTHR_WIDGET
+       if(use_pthr)
+       {
+               pthread_create(&thr,0,draw_plot_thr,this);
+               while(run)      Fl::wait();
+               pthread_join(thr,0);
        }
+       else
+#endif
+               draw_plot();
+//     Fl::unlock();
+
        if(mgl_get_width(gr)!=w() || mgl_get_height(gr)!=h())
                size(mgl_get_width(gr), mgl_get_height(gr));
        gr->AskStop(false);     redraw();
-       Fl::flush();    Fl::unlock();
+#if MGL_HAVE_FL_COPY
+       top_window()->cursor(FL_CURSOR_DEFAULT);
+#endif
+       Fl::flush();
 }
 //-----------------------------------------------------------------------------
 void Fl_MathGL::resize(int xx, int yy, int ww, int hh)
@@ -186,105 +230,225 @@ void Fl_MathGL::resize(int xx, int yy, int ww, int hh)
 //-----------------------------------------------------------------------------
 int Fl_MathGL::handle(int code)
 {
-       if(popup && code==FL_PUSH && Fl::event_button()==FL_RIGHT_MOUSE)
+       static bool busy=false;
+       static int last_pos=-1;
+       if(handle_keys && code==FL_KEYUP && Fl::event_button()!=FL_LEFT_MOUSE)
        {
-               const Fl_Menu_Item *m = popup->popup(Fl::event_x(), Fl::event_y(), 0, 0, 0);
-               if(m)   m->do_callback(wpar, vpar);
+               int key=Fl::event_key();
+               if(!strchr(" .,wasdrfx",key))   return 0;
+               if(key==' ')    {       update();       return 1;       }
+               if(key=='w')
+               {
+                       tet += 10;
+                       if(tet_val)     tet_val->value(tet);
+                       update();       return 1;
+               }
+               if(key=='s')
+               {
+                       tet -= 10;
+                       if(tet_val)     tet_val->value(tet);
+                       update();       return 1;
+               }
+               if(key=='a')
+               {
+                       phi += 10;
+                       if(phi_val)     phi_val->value(phi);
+                       update();       return 1;
+               }
+               if(key=='d')
+               {
+                       phi -= 10;
+                       if(phi_val)     phi_val->value(phi);
+                       update();       return 1;
+               }
+               if(key=='x')
+               {
+                       mglCanvasFL *g=dynamic_cast<mglCanvasFL *>(gr);
+                       if(g && g->mgl->FMGL==this)
+                       {       g->Wnd->hide(); return 1;       }
+                       else    return 0;
+                       //                              exit(0);
+               }
+               if(key==',')
+               {
+                       mglCanvasFL *g=dynamic_cast<mglCanvasFL *>(gr);
+                       if(g && g->mgl->FMGL==this)
+                       {       g->PrevFrame(); return 1;       }
+                       else    return 0;
+               }
+               if(key=='.')
+               {
+                       mglCanvasFL *g=dynamic_cast<mglCanvasFL *>(gr);
+                       if(g && g->mgl->FMGL==this)
+                       {       g->NextFrame(); return 1;       }
+                       else    return 0;
+               }
+               if(key=='r')
+               {       flag = (flag&2) + ((~(flag&1))&1);      update();       return 1;       }
+               if(key=='f')
+               {       flag = (flag&1) + ((~(flag&2))&2);      update();       return 1;       }
        }
-       else if(!zoom && !rotate && code==FL_PUSH && Fl::event_button()==FL_LEFT_MOUSE)
+       else if(code==FL_PUSH)
        {
-               mglCanvasWnd *g=dynamic_cast<mglCanvasWnd *>(gr);
-               if(g && g->ClickFunc)   g->ClickFunc(draw_par);
-               if(mgl_get_flag(gr,MGL_SHOW_POS))
+               last_pos=-1;    xe=x0=Fl::event_x();    ye=y0=Fl::event_y();
+               if(popup && Fl::event_button()==FL_RIGHT_MOUSE)
+               {
+                       const Fl_Menu_Item *m = popup->popup(Fl::event_x(), Fl::event_y(), 0, 0, 0);
+                       if(m)   m->do_callback(wpar, vpar);
+               }
+               else if(!zoom && !rotate && Fl::event_button()==FL_LEFT_MOUSE)
                {
-                       mglPoint p = gr->CalcXYZ(Fl::event_x()-x(), Fl::event_y()-y());
-                       if(g)   g->LastMousePos = p;
-                       char s[128];
-                       snprintf(s,128,"x=%g, y=%g, z=%g",p.x,p.y,p.z); s[127]=0;
-                       draw(); fl_color(FL_BLACK);             fl_draw(s,40,70);
+                       int xx = x0-x(), yy = y0-y();
+                       last_id = mgl_get_obj_id(gr,xx, yy);
+                       if(last_id>=MGL_MAX_LINES)      last_id=-1;
+                       mglCanvasWnd *g=dynamic_cast<mglCanvasWnd *>(gr);
+                       if(g && g->ClickFunc)   g->ClickFunc(draw_par);
+                       if(mgl_get_flag(gr,MGL_SHOW_POS))
+                       {
+                               mglPoint p = gr->CalcXYZ(xx, yy);
+                               if(g)   g->LastMousePos = p;
+                               char s[128];
+                               snprintf(s,128,"x=%g, y=%g, z=%g",p.x,p.y,p.z); s[127]=0;
+                               draw(); fl_color(FL_BLACK);             fl_draw(s,40,70);
+                       }
+                       if(Fl::event_clicks())
+                       {
+                               int id = mgl_get_obj_id(gr,x0-x(), y0-y()) - MGL_MAX_LINES-1;
+                               if(grid && id>=0)       // delete manual primitive
+                               {
+                                       prim = (id>0?mgl_str_arg(prim, '\n', 0,id-1)+'\n':"") + mgl_str_arg(prim, '\n', id+1,INT_MAX);
+                                       update();
+                               }
+                               else if(draw_cl)        draw_cl->Click();
+                               else    update();
+                       }
                }
+               return 1;
        }
-       else if((!rotate && !zoom) || Fl::event_button()!=FL_LEFT_MOUSE)
+       else if(code==FL_DRAG)
        {
-               if(code==FL_FOCUS || code==FL_UNFOCUS)  return 1;
-               if(code==FL_KEYUP)
+               if(busy)        return 1;       // remove possible conflicts of too often events
+               busy = true;    xe=Fl::event_x();       ye=Fl::event_y();
+               mreal ff = 240./sqrt(mreal(w()*h()));
+               // handle primitives
+               int id = mgl_get_obj_id(gr,x0-x(), y0-y()) - MGL_MAX_LINES-1;
+               int ww=mgl_get_width(gr), hh=mgl_get_height(gr), d=(hh>ww?ww:hh)/100;
+               long pos = mgl_is_active(gr,x0-x(),y0-y(),d);
+               if(grid && pos<0)       pos=last_pos;
+               if(grid && pos>=0)
                {
-                       int key=Fl::event_key();
-                       if(!strchr(" .,wasdrfx",key))   return 0;
-                       if(key==' ')    {       update();       return 1;       }
-                       if(key=='w')
+//                     Fl::lock();
+                       last_pos=pos;
+                       const mglActivePos &p = gr->Act[pos];
+                       id = long(p.id)-MGL_MAX_LINES-1;
+                       if(id<0)        return 0;
+                       std::string line = mgl_str_arg(prim, '\n', id), res;
+                       if(line.empty())        return 0;       // NOTE stupid check (never should be here)
+                       std::vector<std::string> arg = mgl_str_args(line,' ');
+                       // try "attract" mouse
+                       for(size_t i=0;i<=10;i++)
                        {
-                               tet += 10;
-                               if(tet_val)     tet_val->value(tet);
-                               update();       return 1;
+                               int tt = i*(w()/10);    if(abs(xe-tt)<2*d)      xe = tt;
+                               tt = i*(h()/10);        if(abs(ye-tt)<2*d)      ye = tt;
                        }
-                       if(key=='s')
+                       for(size_t i=0;i<gr->Act.size();i++)
                        {
-                               tet -= 10;
-                               if(tet_val)     tet_val->value(tet);
-                               update();       return 1;
+                               const mglActivePos &q = gr->Act[i];
+                               if(abs(xe-q.x)<2*d && abs(ye-q.y)<2*d)  {       xe=q.x; ye=q.y; }
                        }
-                       if(key=='a')
+                       // now move point
+                       float dx = 2*(xe-x0)/float(w()), dy = 2*(y0-ye)/float(h());
+                       float xx=atof(arg[1].c_str()), yy=atof(arg[2].c_str());
+                       if(p.n==0)      {       arg[1]=mgl_str_num(xx+dx);      arg[2]=mgl_str_num(yy+dy);      }
+                       else if(arg[0]=="rect")
                        {
-                               phi += 10;
-                               if(phi_val)     phi_val->value(phi);
-                               update();       return 1;
+                               float x_=atof(arg[3].c_str()), y_=atof(arg[4].c_str());
+                               if(p.n==1)      {       xx+=dx; y_+=dy; }
+                               if(p.n==2)      {       x_+=dx; yy+=dy; }
+                               if(p.n==3)      {       x_+=dx; y_+=dy; }
+                               arg[1]=mgl_str_num(xx); arg[2]=mgl_str_num(yy);
+                               arg[3]=mgl_str_num(x_); arg[4]=mgl_str_num(y_);
                        }
-                       if(key=='d')
+                       else if(p.n==1)
                        {
-                               phi -= 10;
-                               if(phi_val)     phi_val->value(phi);
-                               update();       return 1;
+                               float xx=atof(arg[3].c_str()), yy=atof(arg[4].c_str());
+                               arg[3]=mgl_str_num(xx+dx);      arg[4]=mgl_str_num(yy+dy);
                        }
-                       if(key=='x')
+                       else if(arg[0]=="rhomb" || arg[0]=="ellipse")
                        {
-                               mglCanvasFL *g=dynamic_cast<mglCanvasFL *>(gr);
-                               if(g && g->mgl->FMGL==this)
-                               {       g->Wnd->hide(); return 1;       }
-                               else    return 0;
-//                             exit(0);
+                               float x_=atof(arg[3].c_str())-xx, y_=atof(arg[4].c_str())-yy;
+                               float r_=atof(arg[5].c_str()), dr=0;
+                               if(x_*x_+y_*y_>0)
+                               {       dr = (dx*x_+dy*y_)/(x_*x_+y_*y_);       dr = hypot(dx-dr*x_,dy-dr*y_);  }
+                               else    dr = hypot(dx,dy);
+                               arg[5]=mgl_str_num(r_+dr);
                        }
-                       if(key==',')
+                       else if(arg[0]=="arc")
                        {
-                               mglCanvasFL *g=dynamic_cast<mglCanvasFL *>(gr);
-                               if(g && g->mgl->FMGL==this)
-                               {       g->PrevFrame(); return 1;       }
-                               else    return 0;
+                               float x_=atof(arg[3].c_str())-xx, y_=atof(arg[4].c_str())-yy;
+                               float a_=atof(arg[5].c_str());
+                               double c=cos(M_PI*a_/180), s=sin(M_PI*a_/180);
+                               double a = atan2(x_,y_) - atan2(x_*c-y_*s+dx,x_*s+y_*c+dy);
+                               arg[5]=mgl_str_num(a*180/M_PI);
                        }
-                       if(key=='.')
+                       else if(p.n==2)
                        {
-                               mglCanvasFL *g=dynamic_cast<mglCanvasFL *>(gr);
-                               if(g && g->mgl->FMGL==this)
-                               {       g->NextFrame(); return 1;       }
-                               else    return 0;
+                               float xx=atof(arg[5].c_str()), yy=atof(arg[6].c_str());
+                               arg[5]=mgl_str_num(xx+dx);      arg[6]=mgl_str_num(yy+dy);
                        }
-                       if(key=='r')
-                       {       flag = (flag&2) + ((~(flag&1))&1);      update();       return 1;       }
-                       if(key=='f')
-                       {       flag = (flag&1) + ((~(flag&2))&2);      update();       return 1;       }
+                       else if(p.n==3)
+                       {
+                               float xx=atof(arg[7].c_str()), yy=atof(arg[8].c_str());
+                               if(arg[0]=="curve")     {       dx*=-1; dy*=-1; }
+                               arg[7]=mgl_str_num(xx+dx);      arg[8]=mgl_str_num(yy+dy);
+                       }
+                       res = arg[0];   for(size_t i=1;i<arg.size();i++)        res += ' '+arg[i];
+                       prim = (id>0?mgl_str_arg(prim, '\n', 0,id-1)+'\n':"") + res+'\n' + mgl_str_arg(prim, '\n', id+1,INT_MAX);
+//                     Fl::unlock();
+                       x0 = xe;        y0 = ye;        update();
                }
-               return 0;
-       }
-       else if(code==FL_PUSH)  {       xe=x0=Fl::event_x();    ye=y0=Fl::event_y();    }
-       else if(code==FL_DRAG)
-       {
-               xe=Fl::event_x();       ye=Fl::event_y();
-               mreal ff = 240./sqrt(mreal(w()*h()));
-               if(rotate)
+               else if(grid && id>=0)
+               {
+//                     Fl::lock();
+                       std::string line = mgl_str_arg(prim, '\n', id), res;
+                       if(line.empty())        return 0;       // NOTE stupid check (never should be here)
+                       std::vector<std::string> arg = mgl_str_args(line,' ');
+
+                       float dx = 2*(xe-x0)/float(w()), dy = 2*(y0-ye)/float(h());
+                       float x1=atof(arg[1].c_str()), y1=atof(arg[2].c_str());
+                       arg[1] = mgl_str_num(x1+dx);    arg[2] = mgl_str_num(y1+dy);
+                       if(arg[0]=="curve")
+                       {
+                               float x2=atof(arg[5].c_str()), y2=atof(arg[6].c_str());
+                               arg[5]=mgl_str_num(x2+dx);      arg[6]=mgl_str_num(y2+dy);
+                       }
+                       else if(arg[0]!="ball")
+                       {
+                               float x2=atof(mgl_str_arg(line,' ',3).c_str()), y2=atof(mgl_str_arg(line,' ',4).c_str());
+                               arg[3]=mgl_str_num(x2+dx);      arg[4]=mgl_str_num(y2+dy);
+                       }
+                       res = arg[0];   for(size_t i=1;i<arg.size();i++)        res += ' '+arg[i];
+                       prim = (id>0?mgl_str_arg(prim, '\n', 0,id-1)+'\n':"") + res+'\n' + mgl_str_arg(prim, '\n', id+1,INT_MAX);
+//                     Fl::unlock();
+                       x0 = xe;        y0 = ye;        update();
+               }
+               else if(rotate)
                {
                        phi += (x0-xe)*ff;
                        tet += (y0-ye)*ff;
-                       if(phi>180)     phi-=360;               if(phi<-180)    phi+=360;
-                       if(tet>180)     tet-=360;               if(tet<-180)    tet+=360;
+                       if(phi>180)             phi-=360;
+                       if(phi<-180)    phi+=360;
+                       if(tet>180)             tet-=360;
+                       if(tet<-180)    tet+=360;
                        if(tet_val)     tet_val->value(tet);
                        if(phi_val)     phi_val->value(phi);
-                       x0 = xe;        y0 = ye;
-                       update();
+                       x0 = xe;        y0 = ye;        update();
                }
-               redraw();
+               busy = false;   redraw();       return 1;
        }
        else if(code==FL_RELEASE)
        {
+               last_pos=-1;
                if(zoom)
                {
                        int w1=w(),h1=h();
@@ -298,14 +462,14 @@ int Fl_MathGL::handle(int code)
                        if(y1>y2)       {       _x1=y1; y1=y2;  y2=_x1; }
                        update();
                }
-               else
+               else if(rotate)
                {
                        if(tet_val)     tet_val->value(tet);
                        if(phi_val)     phi_val->value(phi);
                }
-               redraw();
+               redraw();       return 1;
        }
-       return 1;
+       return 0;
 }
 //-----------------------------------------------------------------------------
 //
@@ -317,7 +481,7 @@ void Fl_MGLView::toggle(int &val, Fl_Button *b, const char *txt)
        val = 1-val;    b->value(val);
        if(menu && txt && *txt)
        {
-               Fl_Menu_Item *m = (Fl_Menu_Item *)menu->find_item(mgl_gettext(txt));
+               Fl_Menu_Item *m = (Fl_Menu_Item *)menu->find_item(_(txt));
                if(m && val)    m->set();
                if(m && !val)   m->clear();
        }
@@ -329,7 +493,7 @@ void Fl_MGLView::setoff(int &val, Fl_Button *b, const char *txt)
        val = 0;        b->value(val);
        if(menu && txt && *txt)
        {
-               Fl_Menu_Item *m = (Fl_Menu_Item *)menu->find_item(mgl_gettext(txt));
+               Fl_Menu_Item *m = (Fl_Menu_Item *)menu->find_item(_(txt));
                if(m && val)    m->set();
                if(m && !val)   m->clear();
        }
@@ -349,8 +513,8 @@ void Fl_MGLView::exec_pause()
        }
        if(mutex)
        {
-               if(pauseC)      pthread_mutex_lock(mutex);
-               else    pthread_mutex_unlock(mutex);
+               pthread_mutex_trylock(mutex);
+               if(!pauseC)     pthread_mutex_unlock(mutex);
        }
 #endif
 }
@@ -395,89 +559,106 @@ void mglCanvasFL::ToggleRotate() {       mgl_rotate_cb(0,mgl);   }
 //-----------------------------------------------------------------------------
 void Fl_MGLView::update()
 {
-       FMGL->set_state(zoom_bt->value(), rotate_bt->value());
-       FMGL->set_flag(alpha + 2*light + 4*grid);
+       FMGL->set_state(zoom_bt->value(), rotate_bt->value(), grid_bt->value());
+       FMGL->set_flag(alpha + 2*light);
        FMGL->update();
 }
 void MGL_NO_EXPORT mgl_draw_cb(Fl_Widget*, void* v)
 {      if(v)   ((Fl_MGLView*)v)->update();     }
 void mglCanvasFL::Update()             {       mgl->update();  Wnd->show();    }
 //-----------------------------------------------------------------------------
+MGL_NO_EXPORT const char *mgl_save_name(const char *ext)
+{
+       static std::string fname;
+       fname = mgl_file_chooser(_("Save File As?"), ext, true);
+       if(fname.empty())       return NULL;
+       if(fname.find(ext+1)==std::string::npos)        fname += ext+1;
+       return fname.c_str();
+}
+#define _FGR_  ((Fl_MGLView*)v)->FMGL->get_graph()
+//-----------------------------------------------------------------------------
 void MGL_NO_EXPORT mgl_export_png_cb(Fl_Widget*, void* v)
 {
-       char *fname = fl_file_chooser(mgl_gettext("Save File As?"), "*.png", 0);
-       if(!fname || !fname[0]) return;
-       mgl_write_png(((Fl_MGLView*)v)->FMGL->get_graph(),fname,0);
+       const char *fname = mgl_save_name("*.png");
+       if(fname)       mgl_write_png(_FGR_,fname,0);
 }
 //-----------------------------------------------------------------------------
 void MGL_NO_EXPORT mgl_export_bps_cb(Fl_Widget*, void* v)
 {
-       char *fname = fl_file_chooser(mgl_gettext("Save File As?"), "*.eps", 0);
-       if(!fname || !fname[0]) return;
-       mgl_write_bps(((Fl_MGLView*)v)->FMGL->get_graph(),fname,0);
+       const char *fname = mgl_save_name("*.eps");
+       if(fname)       mgl_write_bps(_FGR_,fname,0);
 }
 //-----------------------------------------------------------------------------
 void MGL_NO_EXPORT mgl_export_pngn_cb(Fl_Widget*, void* v)
 {
-       char *fname = fl_file_chooser(mgl_gettext("Save File As?"), "*.png", 0);
-       if(!fname || !fname[0]) return;
-       mgl_write_png_solid(((Fl_MGLView*)v)->FMGL->get_graph(),fname,0);
+       const char *fname = mgl_save_name("*.png");
+       if(fname)       mgl_write_png_solid(_FGR_,fname,0);
 }
 //-----------------------------------------------------------------------------
 void MGL_NO_EXPORT mgl_export_jpeg_cb(Fl_Widget*, void* v)
 {
-       char *fname = fl_file_chooser(mgl_gettext("Save File As?"), "*.jpg", 0);
-       if(!fname || !fname[0]) return;
-       mgl_write_jpg(((Fl_MGLView*)v)->FMGL->get_graph(),fname,0);
+       const char *fname = mgl_save_name("*.jpg");
+       if(fname)       mgl_write_jpg(_FGR_,fname,0);
 }
 //-----------------------------------------------------------------------------
 void MGL_NO_EXPORT mgl_export_svg_cb(Fl_Widget*, void* v)
 {
-       char *fname = fl_file_chooser(mgl_gettext("Save File As?"), "*.svg", 0);
-       if(!fname || !fname[0]) return;
-       mgl_write_svg(((Fl_MGLView*)v)->FMGL->get_graph(),fname,0);
+       const char *fname = mgl_save_name("*.svg");
+       if(fname)       mgl_write_svg(_FGR_,fname,0);
 }
 //-----------------------------------------------------------------------------
 void MGL_NO_EXPORT mgl_export_eps_cb(Fl_Widget*, void* v)
 {
-       char *fname = fl_file_chooser(mgl_gettext("Save File As?"), "*.eps", 0);
-       if(!fname || !fname[0]) return;
-       mgl_write_eps(((Fl_MGLView*)v)->FMGL->get_graph(),fname,0);
+       const char *fname = mgl_save_name("*.eps");
+       if(fname)       mgl_write_eps(_FGR_,fname,0);
+}
+//-----------------------------------------------------------------------------
+void MGL_NO_EXPORT mgl_export_gif_cb(Fl_Widget*, void* v)
+{
+       const char *fname = mgl_save_name("*.gif");
+       if(fname)       mgl_write_gif(_FGR_,fname,0);
+}
+//-----------------------------------------------------------------------------
+void MGL_NO_EXPORT mgl_export_bmp_cb(Fl_Widget*, void* v)
+{
+       const char *fname = mgl_save_name("*.bmp");
+       if(fname)       mgl_write_bmp(_FGR_,fname,0);
 }
 //-----------------------------------------------------------------------------
 void MGL_NO_EXPORT mgl_export_prc_cb(Fl_Widget*, void* v)
 {
-       char *fname = fl_file_chooser(mgl_gettext("Save File As?"), "*.prc", 0);
-       if(!fname || !fname[0]) return;
-       mgl_write_prc(((Fl_MGLView*)v)->FMGL->get_graph(),fname,0,1);
+       const char *fname = mgl_save_name("*.prc");
+       if(fname)       mgl_write_prc(_FGR_,fname,0,1);
 }
 //-----------------------------------------------------------------------------
 void MGL_NO_EXPORT mgl_export_tex_cb(Fl_Widget*, void* v)
 {
-       char *fname = fl_file_chooser(mgl_gettext("Save File As?"), "*.tex", 0);
-       if(!fname || !fname[0]) return;
-       mgl_write_tex(((Fl_MGLView*)v)->FMGL->get_graph(),fname,0);
+       const char *fname = mgl_save_name("*.tex");
+       if(fname)       mgl_write_tex(_FGR_,fname,0);
 }
 //-----------------------------------------------------------------------------
 void MGL_NO_EXPORT mgl_export_obj_cb(Fl_Widget*, void* v)
 {
-       char *fname = fl_file_chooser(mgl_gettext("Save File As?"), "*.obj", 0);
-       if(!fname || !fname[0]) return;
-       mgl_write_obj(((Fl_MGLView*)v)->FMGL->get_graph(),fname,0,1);
+       const char *fname = mgl_save_name("*.obj");
+       if(fname)       mgl_write_obj(_FGR_,fname,0,1);
 }
 //-----------------------------------------------------------------------------
 void MGL_NO_EXPORT mgl_export_off_cb(Fl_Widget*, void* v)
 {
-       char *fname = fl_file_chooser(mgl_gettext("Save File As?"), "*.off", 0);
-       if(!fname || !fname[0]) return;
-       mgl_write_off(((Fl_MGLView*)v)->FMGL->get_graph(),fname,0,0);
+       const char *fname = mgl_save_name("*.off");
+       if(fname)       mgl_write_off(_FGR_,fname,0,0);
 }
 //-----------------------------------------------------------------------------
 void MGL_NO_EXPORT mgl_export_stl_cb(Fl_Widget*, void* v)
 {
-       char *fname = fl_file_chooser(mgl_gettext("Save File As?"), "*.stl", 0);
-       if(!fname || !fname[0]) return;
-       mgl_write_stl(((Fl_MGLView*)v)->FMGL->get_graph(),fname,0);
+       const char *fname = mgl_save_name("*.stl");
+       if(fname)       mgl_write_stl(_FGR_,fname,0);
+}
+//-----------------------------------------------------------------------------
+void MGL_NO_EXPORT mgl_export_xyz_cb(Fl_Widget*, void* v)
+{
+       const char *fname = mgl_save_name("*.xyz");
+       if(fname)       mgl_write_xyz(_FGR_,fname,0);
 }
 //-----------------------------------------------------------------------------
 void MGL_NO_EXPORT mgl_su_cb(Fl_Widget*, void* v)
@@ -570,108 +751,154 @@ void mglCanvasFL::Animation()   {       mgl_sshow_cb(0,mgl);    }
 void MGL_LOCAL_CONST mgl_no_cb(Fl_Widget *, void *)    {}
 //-----------------------------------------------------------------------------
 void MGL_NO_EXPORT mgl_stop_cb(Fl_Widget*, void* v)
-{      Fl_MGLView *e = (Fl_MGLView*)v; if(e)   e->FMGL->stop();        }
-//-----------------------------------------------------------------------------
-Fl_Menu_Item pop_graph[20] = {
-       { mgl_gettext("Export"), 0, mgl_no_cb, 0, FL_SUBMENU,0,0,0,0},
-               { mgl_gettext("... as PNG"),    0, mgl_export_png_cb,0,0,0,0,0,0 },
-               { mgl_gettext("... as PNG (solid)"),    0, mgl_export_pngn_cb,0,0,0,0,0,0 },
-               { mgl_gettext("... as JPEG"),   0, mgl_export_jpeg_cb,0,0,0,0,0,0 },
-               { mgl_gettext("... as SVG"),    0, mgl_export_svg_cb,0,0,0,0,0,0 },
-               { mgl_gettext("... as vector EPS"),     0, mgl_export_eps_cb,0,0,0,0,0,0 },
-               { mgl_gettext("... as bitmap EPS"),     0, mgl_export_bps_cb, 0, FL_MENU_DIVIDER,0,0,0,0 },
-               { mgl_gettext("... as TeX"),    0, mgl_export_tex_cb,0,0,0,0,0,0 },
-               { mgl_gettext("... as OBJ"),    0, mgl_export_obj_cb,0,0,0,0,0,0 },
-               { mgl_gettext("... as PRC"),    0, mgl_export_prc_cb,0,0,0,0,0,0 },
-               { mgl_gettext("... as OFF"),    0, mgl_export_off_cb,0,0,0,0,0,0 },
-               { mgl_gettext("... as STL"),    0, mgl_export_stl_cb,0,0,0,0,0,0 },
-               { 0,0,0,0,0,0,0,0,0 },
-       { mgl_gettext("Copy graphics"), 0, 0, 0, FL_MENU_INACTIVE|FL_MENU_DIVIDER,0,0,0,0},
-       { mgl_gettext("Normal view"),   0, mgl_norm_cb,0,0,0,0,0,0 },
-       { mgl_gettext("Redraw plot"),   0, mgl_draw_cb,0,0,0,0,0,0 },
-       { mgl_gettext("Adjust size"),   0, mgl_adjust_cb,0,0,0,0,0,0 },
-       { mgl_gettext("Reload data"),   0, mgl_oncemore_cb,0,0,0,0,0,0 },
-       { 0,0,0,0,0,0,0,0,0 }
+{
+       Fl_MGLView *e = (Fl_MGLView*)v;
+       if(e)   e->FMGL->stop();
+}
+//-----------------------------------------------------------------------------
+void MGL_NO_EXPORT mgl_fl_next(void *v)        {       ((mglCanvasWnd*)v)->NextFrame();        }       ///< Callback function for next frame
+void MGL_NO_EXPORT mgl_fl_prev(void *v)        {       ((mglCanvasWnd*)v)->PrevFrame();        }       ///< Callback function for prev frame
+void MGL_NO_EXPORT mgl_fl_reload(void *v)      {       ((mglCanvasWnd*)v)->ReLoad();   }               ///< Callback function for reloading
+mreal MGL_LOCAL_PURE mgl_fl_delay(void *v)     {       return ((mglCanvasWnd*)v)->GetDelay();  }       ///< Callback function for delay
+//-----------------------------------------------------------------------------
+void copy_coor_cb(Fl_Widget *,void *v)
+{
+       HMGL gr = ((Fl_MGLView*)v)->get_graph();
+       mreal x,y,z;    mgl_get_last_mouse_pos(gr,&x,&y,&z);
+       static char buf[256];
+       snprintf(buf,255,_("click at %g, %g, %g"),x,y,z);
+       Fl::copy(buf,strlen(buf),1);
+}
+//-----------------------------------------------------------------------------
+#if MGL_HAVE_FL_COPY
+#include <FL/Fl_Copy_Surface.H>
+void mgl_copyimg_cb(Fl_Widget *,void *v)
+{
+       Fl_MathGL *g = ((Fl_MGLView*)v)->FMGL;
+       Fl_Copy_Surface *copy_surf = new Fl_Copy_Surface(g->w(), g->h());       // create an Fl_Copy_Surface object
+       copy_surf->set_current();                                                       // direct graphics requests to the clipboard
+       fl_color(FL_WHITE);     fl_rectf(0, 0, g->w(), g->h()); // draw a white background
+       copy_surf->draw(g);                                                                     // draw the g widget in the clipboard
+       delete copy_surf;                                                                       // after this, the clipboard is loaded
+       Fl_Display_Device::display_device()->set_current();     // direct graphics requests back to the display
+}
+#else
+void mgl_copyimg_cb(Fl_Widget *,void *v)       {}
+#endif
+//-----------------------------------------------------------------------------
+Fl_Menu_Item pop_graph[] = {
+       { _("Export as ..."), 0, mgl_no_cb, 0, FL_SUBMENU},
+#if MGL_HAVE_PNG
+               { "PNG",        0, mgl_export_png_cb},
+               { "PNG (solid)",        0, mgl_export_pngn_cb},
+#endif
+#if MGL_HAVE_JPEG
+               { "JPEG",       0, mgl_export_jpeg_cb},
+#endif
+#if MGL_HAVE_GIF
+               { "GIF",        0, mgl_export_gif_cb},
+#endif
+               { "BMP",        0, mgl_export_bmp_cb},
+               { "SVG",        0, mgl_export_svg_cb},
+               { "vector EPS", 0, mgl_export_eps_cb},
+               { "bitmap EPS", 0, mgl_export_bps_cb},
+               { "TeX",        0, mgl_export_tex_cb,0, FL_MENU_DIVIDER},
+               { "OBJ",        0, mgl_export_obj_cb},
+               { "PRC",        0, mgl_export_prc_cb},
+               { "OFF",        0, mgl_export_off_cb},
+               { "STL",        0, mgl_export_stl_cb},
+               { "XYZ",        0, mgl_export_xyz_cb},
+               {0},
+       { _("Copy graphics"),   0, mgl_copyimg_cb, 0, FL_MENU_INACTIVE|FL_MENU_DIVIDER},
+       { _("Normal view"),     0, mgl_norm_cb},
+       { _("Redraw plot"),     0, mgl_draw_cb},
+       { _("Adjust size"),     0, mgl_adjust_cb},
+       { _("Reload data"),     0, mgl_oncemore_cb},
+       {0}
 };
 //-----------------------------------------------------------------------------
+#include "image.h"
+#include "xpm/wire.xpm"
 Fl_MGLView::Fl_MGLView(int xx, int yy, int ww, int hh, const char *lbl) : Fl_Window(xx,yy,ww,hh,lbl)
 {
        Fl_Button *o;
-       grid = alpha = light = sshow = pauseC = 0;      menu = 0;
-       next = prev = reload = NULL;    delay = NULL;
+       grid = alpha = light = sshow = pauseC = rotate = zoom = 0;
+       menu = NULL;    next = prev = reload = NULL;    delay = NULL;
 
-       Fl_Group *g = new Fl_Group(0,0,435,30);
+       Fl_Group *g = new Fl_Group(0,0,480,30);
        alpha_bt = new Fl_Button(0, 1, 25, 25); alpha_bt->type(FL_TOGGLE_BUTTON);
-       alpha_bt->image(xpm_a1);        alpha_bt->callback(mgl_alpha_cb,this);
-       alpha_bt->tooltip(mgl_gettext("Switch on/off transparency in the picture"));
+       alpha_bt->image(img_alpha);     alpha_bt->callback(mgl_alpha_cb,this);
+       alpha_bt->tooltip(_("Switch on/off transparency in the picture"));
        light_bt = new Fl_Button(25, 1, 25, 25);        light_bt->type(FL_TOGGLE_BUTTON);
-       light_bt->image(xpm_l1);        light_bt->callback(mgl_light_cb,this);
-       light_bt->tooltip(mgl_gettext("Switch on/off lightning in the picture"));
+       light_bt->image(img_light);     light_bt->callback(mgl_light_cb,this);
+       light_bt->tooltip(_("Switch on/off lightning in the picture"));
        grid_bt = new Fl_Button(50, 1, 25, 25); grid_bt->type(FL_TOGGLE_BUTTON);
-       grid_bt->image(xpm_wire);       grid_bt->callback(mgl_grid_cb,this);
-       grid_bt->tooltip(mgl_gettext("Switch on/off grid drawing"));
+       grid_bt->image(new Fl_Pixmap(wire_xpm));        grid_bt->callback(mgl_grid_cb,this);
+       grid_bt->tooltip(_("Switch on/off grid drawing"));
 
        rotate_bt = new Fl_Button(80, 1, 25, 25);rotate_bt->type(FL_TOGGLE_BUTTON);
-       rotate_bt->image(xpm_r1);       rotate_bt->callback(mgl_rotate_cb,this);
-       rotate_bt->tooltip(mgl_gettext("Rotate picture by holding left mouse button"));
+       rotate_bt->image(img_move);     rotate_bt->callback(mgl_rotate_cb,this);
+       rotate_bt->tooltip(_("Rotate picture by holding left mouse button"));
        zoom_bt = new Fl_Button(105, 1, 25, 25);        zoom_bt->type(FL_TOGGLE_BUTTON);
-       zoom_bt->image(xpm_z1); zoom_bt->callback(mgl_zoom_cb,this);
-       zoom_bt->tooltip(mgl_gettext("Zoom in selected region of the picture"));
-       o = new Fl_Button(130, 1, 25, 25);              o->tooltip(mgl_gettext("Return picture to normal zoom"));
-       o->image(new Fl_Pixmap(zoom_out_xpm));  o->callback(mgl_norm_cb,this);
-       o = new Fl_Button(160, 1, 25, 25);      o->tooltip(mgl_gettext("Stop drawing"));
-       o->image(new Fl_Pixmap(stop_xpm));      o->callback(mgl_stop_cb,this);
-       o = new Fl_Button(160, 1, 25, 25);      o->tooltip(mgl_gettext("Refresh the picture"));
-       o->image(new Fl_Pixmap(ok_xpm));        o->callback(mgl_draw_cb,this);
+       zoom_bt->image(img_zoomIn);     zoom_bt->callback(mgl_zoom_cb,this);
+       zoom_bt->tooltip(_("Zoom in selected region of the picture"));
+       o = new Fl_Button(130, 1, 25, 25);              o->tooltip(_("Restore default graphics rotation, zoom and perspective"));
+       o->image(img_orig);     o->callback(mgl_norm_cb,this);
+
+       o = new Fl_Button(160, 1, 25, 25);      o->tooltip(_("Refresh the picture"));
+       o->image(img_update);   o->callback(mgl_draw_cb,this);
+       o = new Fl_Button(185, 1, 25, 25);      o->tooltip(_("Stop drawing"));
+       o->image(img_stop);     o->callback(mgl_stop_cb,this);
+       o = new Fl_Button(210, 1, 25, 25);      o->tooltip(_("Adjust picture size to fill drawing area"));
+       o->image(img_adjust);   o->callback(mgl_adjust_cb,this);
+       o = new Fl_Button(235, 1, 25, 25);      o->tooltip(_("Reload data and refresh the picture"));
+       o->image(img_reload);   o->callback(mgl_oncemore_cb,this);
+       o = new Fl_Button(265, 1, 25, 25);      o->tooltip(_("Copy image to clipboard"));
+       o->image(img_copy);     o->callback(mgl_copyimg_cb,this);
 
        Fl_Counter *tet, *phi;
-       tet = new Fl_Counter(195, 1, 90, 25, 0);        tet->callback(mgl_draw_cb,this);
-       phi = new Fl_Counter(290, 1, 90, 25, 0);        phi->callback(mgl_draw_cb,this);
+       tet = new Fl_Counter(295, 1, 90, 25, 0);        tet->callback(mgl_draw_cb,this);
+       phi = new Fl_Counter(390, 1, 90, 25, 0);        phi->callback(mgl_draw_cb,this);
        tet->lstep(10); tet->step(1);   tet->range(-180,180);
-       tet->tooltip(mgl_gettext("Theta angle (tilt z-axis)"));
+       tet->tooltip(_("Theta angle (tilt z-axis)"));
        phi->lstep(10); phi->step(1);   phi->range(-180,180);
-       phi->tooltip(mgl_gettext("Phi angle (rotate in x*y plane)"));
+       phi->tooltip(_("Phi angle (rotate in x*y plane)"));
        g->end();       g->resizable(0);
 
        g = new Fl_Group(0,0,30,285);
-       o = new Fl_Button(1, 30, 25, 25);               o->tooltip(mgl_gettext("Shift the picture up"));
-       o->image(new Fl_Pixmap(up_1_xpm));              o->callback(mgl_su_cb,this);
-//     o->box(FL_PLASTIC_UP_BOX);      o->down_box(FL_PLASTIC_DOWN_BOX);
-       o = new Fl_Button(1, 55, 25, 25);               o->tooltip(mgl_gettext("Shift the picture left"));
-       o->image(new Fl_Pixmap(left_1_xpm));    o->callback(mgl_sl_cb,this);
-       o = new Fl_Button(1, 80, 25, 25);               o->tooltip(mgl_gettext("Zoom in the picture"));
-       o->image(new Fl_Pixmap(zoom_1_xpm));    o->callback(mgl_sz_cb,this);
-       o = new Fl_Button(1, 105, 25, 25);              o->tooltip(mgl_gettext("Zoom out the picture"));
-       o->image(new Fl_Pixmap(norm_1_xpm));    o->callback(mgl_so_cb,this);
-       o = new Fl_Button(1, 130, 25, 25);              o->tooltip(mgl_gettext("Shift the picture right"));
-       o->image(new Fl_Pixmap(right_1_xpm));   o->callback(mgl_sr_cb,this);
-       o = new Fl_Button(1, 155, 25, 25);              o->tooltip(mgl_gettext("Shift the picture down"));
-       o->image(new Fl_Pixmap(down_1_xpm));    o->callback(mgl_sd_cb,this);
-
+       o = new Fl_Button(1, 30, 25, 25);               o->tooltip(_("Shift the picture up"));
+       o->image(img_goU);              o->callback(mgl_su_cb,this);
+       o = new Fl_Button(1, 55, 25, 25);               o->tooltip(_("Shift the picture left"));
+       o->image(img_goL);      o->callback(mgl_sl_cb,this);
+       o = new Fl_Button(1, 80, 25, 25);               o->tooltip(_("Zoom in the picture"));
+       o->image(img_plus);     o->callback(mgl_sz_cb,this);
+       o = new Fl_Button(1, 105, 25, 25);              o->tooltip(_("Zoom out the picture"));
+       o->image(img_minus);    o->callback(mgl_so_cb,this);
+       o = new Fl_Button(1, 130, 25, 25);              o->tooltip(_("Shift the picture right"));
+       o->image(img_goR);      o->callback(mgl_sr_cb,this);
+       o = new Fl_Button(1, 155, 25, 25);              o->tooltip(_("Shift the picture down"));
+       o->image(img_goD);      o->callback(mgl_sd_cb,this);
 
-       o = new Fl_Button(1, 185, 25, 25);              o->tooltip(mgl_gettext("Show previous frame in slideshow"));
-       o->image(new Fl_Pixmap(prev_sl_xpm));   o->callback(mgl_sprev_cb,this);
+       o = new Fl_Button(1, 185, 25, 25);              o->tooltip(_("Show previous frame in slideshow"));
+       o->image(img_prev);     o->callback(mgl_sprev_cb,this);
        anim_bt = new Fl_Button(1, 210, 25, 25);        anim_bt->type(FL_TOGGLE_BUTTON);
-       anim_bt->image(xpm_s1); anim_bt->callback(mgl_sshow_cb,this);
-       anim_bt->tooltip(mgl_gettext("Run/Stop slideshow (graphics animation)"));
-       o = new Fl_Button(1, 235, 25, 25);              o->tooltip(mgl_gettext("Show next frame in slideshow"));
-       o->image(new Fl_Pixmap(next_sl_xpm));   o->callback(mgl_snext_cb,this);
-
+       anim_bt->image(img_play);       anim_bt->callback(mgl_sshow_cb,this);
+       anim_bt->tooltip(_("Run/Stop slideshow (graphics animation)"));
+       o = new Fl_Button(1, 235, 25, 25);              o->tooltip(_("Show next frame in slideshow"));
+       o->image(img_next);     o->callback(mgl_snext_cb,this);
 #if MGL_HAVE_PTHR_WIDGET
        pause_bt = new Fl_Button(1, 260, 25, 25);       pause_bt->type(FL_TOGGLE_BUTTON);
-       pause_bt->image(xpm_pause);     pause_bt->callback(mgl_pause_cb,this);
-       pause_bt->tooltip(mgl_gettext("Pause on/off calculations"));
+       pause_bt->image(img_pause);     pause_bt->callback(mgl_pause_cb,this);
+       pause_bt->tooltip(_("Pause on/off external calculations"));
 #endif
-
        g->end();       g->resizable(0);
 
-       scroll = new Fl_Scroll(30, 30, 800, 600);
-       //scroll->begin();
+       scroll = new Fl_Scroll(30, 30, ww-30, hh-30);
        FMGL = new Fl_MathGL(30, 30, 800, 600);
        FMGL->tet_val = tet;
        FMGL->phi_val = phi;
        FMGL->set_popup(pop_graph,FMGL,this);
-       scroll->end();  resizable(scroll);      end();
+       scroll->end();  resizable(scroll);      end();  par=0;
 }
 Fl_MGLView::~Fl_MGLView()      {}
 //-----------------------------------------------------------------------------
@@ -679,7 +906,7 @@ Fl_MGLView::~Fl_MGLView()   {}
 //             class mglCanvasFL
 //
 //-----------------------------------------------------------------------------
-mglCanvasFL::mglCanvasFL() : mglCanvasWnd()    {       Wnd=0;  }
+mglCanvasFL::mglCanvasFL() : mglCanvasWnd()    {       Wnd=0;  mgl=0;  }
 mglCanvasFL::~mglCanvasFL()            {       if(Wnd) {       mgl->FMGL->gr=0;        delete Wnd;     }       }
 //-----------------------------------------------------------------------------
 void mglCanvasFL::GotoFrame(int d)
@@ -690,36 +917,52 @@ void mglCanvasFL::GotoFrame(int d)
        if(GetNumFig()>0 && d)  {       SetCurFig(f);   mgl->FMGL->redraw();    }
 }
 //-----------------------------------------------------------------------------
-void MGL_NO_EXPORT mgl_fl_next(void *v)        {       ((mglCanvasWnd*)v)->NextFrame();        }       ///< Callback function for next frame
-void MGL_NO_EXPORT mgl_fl_prev(void *v)        {       ((mglCanvasWnd*)v)->PrevFrame();        }       ///< Callback function for prev frame
-void MGL_NO_EXPORT mgl_fl_reload(void *v)      {       ((mglCanvasWnd*)v)->ReLoad();   }               ///< Callback function for reloading
-mreal MGL_LOCAL_PURE mgl_fl_delay(void *v)     {       return ((mglCanvasWnd*)v)->GetDelay();  }       ///< Callback function for delay
-//-----------------------------------------------------------------------------
 void MGL_EXPORT mgl_makemenu_fltk(Fl_Menu_ *m, Fl_MGLView *w)
 {
-       m->add("Graphics/Alpha", "^t", mgl_alpha_cb, w, FL_MENU_TOGGLE);
-       m->add("Graphics/Light", "^l", mgl_light_cb, w, FL_MENU_TOGGLE);
-       m->add("Graphics/Grid", "^g", mgl_grid_cb, w, FL_MENU_TOGGLE|FL_MENU_DIVIDER);
+       m->add(_("Graphics/Alpha"), "^t", mgl_alpha_cb, w, FL_MENU_TOGGLE);
+       m->add(_("Graphics/Light"), "^l", mgl_light_cb, w, FL_MENU_TOGGLE);
+       m->add(_("Graphics/Grid"), "^g", mgl_grid_cb, w, FL_MENU_TOGGLE|FL_MENU_DIVIDER);
 
-       m->add("Graphics/Restore", "^ ", mgl_norm_cb, w);
-       m->add("Graphics/Redraw", "f5", mgl_draw_cb, w);
-       m->add("Graphics/Adjust size", "f6", mgl_adjust_cb, w);
-       m->add("Graphics/Reload data", "f9", mgl_oncemore_cb, w);
-       m->add("Graphics/Stop", "f7", mgl_stop_cb, w);
-       //TODO  m->add("Graphics/Copy graphics","+^c", mgl_copyimg_cb, w);
-       m->add("Graphics/Pause calc", "^t", mgl_pause_cb, w, FL_MENU_TOGGLE);
+       m->add(_("Graphics/Restore"), "^ ", mgl_norm_cb, w);
+       m->add(_("Graphics/Redraw"), FL_F+5, mgl_draw_cb, w);
+       m->add(_("Graphics/Adjust size"), FL_F+6, mgl_adjust_cb, w);
+       m->add(_("Graphics/Reload data"), FL_F+9, mgl_oncemore_cb, w);
+       m->add(_("Graphics/Stop"), FL_F+7, mgl_stop_cb, w);
+       m->add(_("Graphics/Copy graphics"), "+^c", mgl_copyimg_cb, w);
+       m->add(_("Graphics/Copy click coor."), 0, copy_coor_cb, w);
+       m->add(_("Graphics/Pause calc"), "^t", mgl_pause_cb, w, FL_MENU_TOGGLE);
 
-       m->add("Graphics/Export/as PNG", "#p", mgl_export_png_cb, w);
-       m->add("Graphics/Export/as solid PNG", "#f", mgl_export_pngn_cb, w);
-       m->add("Graphics/Export/as JPEG", "#j", mgl_export_jpeg_cb, w);
-       m->add("Graphics/Export/as SVG", "#s", mgl_export_svg_cb, w);
-       m->add("Graphics/Export/as vector EPS", "#e", mgl_export_eps_cb, w);
-       m->add("Graphics/Export/as bitmap EPS", "", mgl_export_bps_cb, w);
+#if MGL_HAVE_PNG
+       m->add(_("Graphics/Export/as PNG"), "#p", mgl_export_png_cb, w);
+       m->add(_("Graphics/Export/as solid PNG"), "#f", mgl_export_pngn_cb, w);
+#endif
+#if MGL_HAVE_JPEG
+       m->add(_("Graphics/Export/as JPEG"), "#j", mgl_export_jpeg_cb, w);
+#endif
+#if MGL_HAVE_GIF
+       m->add(_("Graphics/Export/as GIF"), "#g", mgl_export_gif_cb, w);
+#endif
+       m->add(_("Graphics/Export/as BMP"), 0, mgl_export_bmp_cb, w);
+       m->add(_("Graphics/Export/as SVG"), "#s", mgl_export_svg_cb, w);
+       m->add(_("Graphics/Export/as vector EPS"), "#e", mgl_export_eps_cb, w);
+       m->add(_("Graphics/Export/as bitmap EPS"), 0, mgl_export_bps_cb, w);
+       m->add(_("Graphics/Export/as TeX"), "#l", mgl_export_tex_cb, w, FL_MENU_DIVIDER);
+       m->add(_("Graphics/Export/as PRC"), "#d", mgl_export_prc_cb, w);
+       m->add(_("Graphics/Export/as OBJ"), "#o", mgl_export_obj_cb, w);
+       m->add(_("Graphics/Export/as OFF"), 0, mgl_export_off_cb, w);
+       m->add(_("Graphics/Export/as STL"), 0, mgl_export_stl_cb, w);
+       m->add(_("Graphics/Export/as XYZ"), 0, mgl_export_xyz_cb, w);
 
-       m->add("Graphics/Animation/Slideshow", "^f5", mgl_sshow_cb, w, FL_MENU_TOGGLE);
-       m->add("Graphics/Animation/Next frame", "#<", mgl_snext_cb, w);
-       m->add("Graphics/Animation/Prev frame", "#>", mgl_sprev_cb, w);
-       //TODO  m->add("Graphics/Animation/Setup", "", mgl_ssetup_cb, w);
+       m->add(_("Graphics/Animation/Slideshow"), FL_CTRL+FL_F+5, mgl_sshow_cb, w, FL_MENU_TOGGLE);
+       m->add(_("Graphics/Animation/Next frame"), "#<", mgl_snext_cb, w);
+       m->add(_("Graphics/Animation/Prev frame"), "#>", mgl_sprev_cb, w);
+
+       m->add(_("Graphics/Transform/Move left"), FL_ALT+FL_Left, mgl_sl_cb, w);
+       m->add(_("Graphics/Transform/Move up"), FL_ALT+FL_Up, mgl_su_cb, w);
+       m->add(_("Graphics/Transform/Zoom in"), "#=", mgl_sz_cb, w);
+       m->add(_("Graphics/Transform/Zoom out"), "#-", mgl_so_cb, w);
+       m->add(_("Graphics/Transform/Move down"), FL_ALT+FL_Down, mgl_sd_cb, w);
+       m->add(_("Graphics/Transform/Move right"), FL_ALT+FL_Right, mgl_sr_cb, w);
 }
 //-----------------------------------------------------------------------------
 void mglCanvasFL::Window(int argc, char **argv, int (*draw)(mglBase *gr, void *p), const char *title, void *par, void (*reload)(void *p), bool maximize)
@@ -731,9 +974,7 @@ void mglCanvasFL::Window(int argc, char **argv, int (*draw)(mglBase *gr, void *p
        if(Wnd) {       Wnd->label(title);      Wnd->show();    return; }
 
        Wnd = new Fl_Double_Window(830,660,title);
-
        mgl = new Fl_MGLView(0,30,830,630);             mgl->par = this;
-
        mgl->menu = new Fl_Menu_Bar(0, 0, 830, 30);
        mgl_makemenu_fltk(mgl->menu, mgl);
 
@@ -762,8 +1003,14 @@ HMGL MGL_EXPORT mgl_create_graph_fltk(int (*draw)(HMGL gr, void *p), const char
 {
        mglCanvasFL *g = new mglCanvasFL;
        g->Window(0,0,draw,title,par,load);
+       g->mgl->FMGL->set_handle_key(true);
        return g;
 }
+void* mgl_fltk_widget(HMGL gr)
+{
+       mglCanvasFL *g = dynamic_cast<mglCanvasFL *>(gr);
+       return g?g->mgl:NULL;
+}
 int MGL_EXPORT mgl_fltk_run()          {       return Fl::run();       }
 //-----------------------------------------------------------------------------
 uintptr_t MGL_EXPORT mgl_create_graph_fltk_(const char *title, int l)
index 99651d68ad0ad5f5052cb65572b2b9c41a67b33f..ca8bff86d0dfdf4e686719a3cc1f6e443a3dc76c 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * glut.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -100,19 +100,14 @@ void _mgl_key_up(unsigned char ch,int ,int )
 \r
        if(ch=='h')\r
        {\r
-               printf("Use 'a', 'd', 'w', 's', 'q', 'e' for changing view angles\n");\r
-               printf("Use 'j', 'l', 'i', 'k' for changing light angles\n");\r
-               printf("Use 'u', 'o' for changing distance to light\n");\r
-               printf("Use 'r' for switching transparency\n");\r
-               printf("Use 'f' for switching lightning\n");\r
-               printf("Use 'E' for exporting to EPS file\n");\r
-               printf("Use 'S' for exporting to SVG file\n");\r
-               printf("Use 'J' for exporting to JPEG file\n");\r
-               printf("Use 'P' for exporting to PNG file\n");\r
-               printf("Use ',', '.' for show other frames\n");\r
-               printf("Use 'm' for view movie\n");\r
-               printf("Use 'h' for view this text\n");\r
-               printf("Use 'x' for exit\n");\r
+               printf(_("Use 'a', 'd', 'w', 's', 'q', 'e' for changing view angles\n"\r
+               "Use 'j', 'l', 'i', 'k' for changing light angles\n"\r
+               "Use 'u', 'o' for changing distance to light\n"\r
+               "Use 'r' for switching transparency\nUse 'f' for switching lightning\n"\r
+               "Use 'E' for exporting to EPS file\nUse 'S' for exporting to SVG file\n"\r
+               "Use 'J' for exporting to JPEG file\nUse 'P' for exporting to PNG file\n"\r
+               "Use ',', '.' for show other frames\nUse 'm' for view movie\n"\r
+               "Use 'h' for view this text\nUse 'x' for exit\n") );\r
 \r
        }\r
        if(ch=='w')     _mgl_glwnd->View(-10,0,0);\r
index 485abe9e65b9f6b86a8b35568fe4dc67b4a3036d..9c0f072812bdb6bb6873291dd5bdc0a5831ff842 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************
  * qt.cpp is part of Math Graphic Library                              *
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   it under the terms of the GNU Library General Public License as       *
@@ -42,6 +42,7 @@
 #include "mgl2/canvas_wnd.h"
 #include "mgl2/qmathgl.h"
 #include "mgl2/qt.h"
+#undef sprintf // fix libintl bug of defining sprintf
 //-----------------------------------------------------------------------------
 #define MGL_MAX_LINES  (INT_MAX-1000)
 //-----------------------------------------------------------------------------
@@ -99,8 +100,8 @@ QMathGL::QMathGL(QWidget *parent, Qt::WindowFlags f) : QWidget(parent, f)
        autoResize = false;     draw_par = 0;   draw_func = 0;
        dotsRefr = true;
        gr = new mglCanvas;     appName = "MathGL";
-       popup = 0;      grBuf = 0;      draw = 0;
-       phi = tet = per = 0;
+       popup = 0;      grBuf = 0;      draw = 0;       prevQuality=MGL_DRAW_NORM;
+       phi = tet = per = 0;    x0=y0=xe=ye=0;
        x1 = y1 = ax1 = ay1 = 0;        x2 = y2 = ax2 = ay2 = 1;
        alpha = light = zoom = rotate = grid = viewYZ = custZoom = custDraw = pause = false;
        resize(600, 400);       mgl_set_flag(gr, true, MGL_CLF_ON_UPD);
@@ -132,8 +133,8 @@ void QMathGL::setDotsPreview(bool d)
 //-----------------------------------------------------------------------------
 void QMathGL::setDraw(int (*func)(mglBase *gr, void *par), void *par)
 {
-       if(draw)        delete draw;    draw = 0;
-       draw_func = func;       draw_par = par;
+       if(draw)        delete draw;
+       draw = 0;       draw_func = func;       draw_par = par;
        emit usePrimChanged(draw_func || draw);
 }
 //-----------------------------------------------------------------------------
@@ -166,9 +167,9 @@ void QMathGL::paintEvent(QPaintEvent *)
                paint.drawText(0,12,mousePos);
        if(grid)
        {
-               long i, d, h=pic.height(), w=pic.width();
+               long d, h=pic.height(), w=pic.width();
                paint.setPen(QColor(192,192,192));
-               for(i=1;i<10;i++)
+               for(long i=1;i<10;i++)
                {
                        paint.drawText(0,i*h/10,QString::number(1-i*0.1));
                        paint.drawLine(0,i*h/10,w,i*h/10);
@@ -178,7 +179,7 @@ void QMathGL::paintEvent(QPaintEvent *)
                paint.setPen(QColor(0,0,0));
                d = (h>w?w:h)/100;
                if(mgl_is_frames(gr))
-                       for(i=0;i<(long)gr->Act.size();i++)
+                       for(size_t i=0;i<gr->Act.size();i++)
                        {
                                const mglActivePos &p=gr->Act[i];
                                QRect rf(p.x-d/2,p.y-d/2-1,d,d);
@@ -324,14 +325,21 @@ void QMathGL::update()
                task->draw_func = draw_func;
                task->draw_par = draw_par;
                thread->start();*/
-               setlocale(LC_NUMERIC, "C");
+               const std::string loc = setlocale(LC_NUMERIC, "C");
                if(mgl_is_frames(gr))   mgl_new_frame(gr);
                if(draw_func)   draw_func(gr, draw_par);
                else if(draw)   {       mglGraph g(gr); draw->Draw(&g); }
                if(mgl_is_frames(gr))   mgl_end_frame(gr);
-               setlocale(LC_NUMERIC, "");
-               gr->AskStop(false);     afterPlot();
+               setlocale(LC_NUMERIC, loc.c_str());
+               gr->AskStop(false);
+       }
+       else if(mgl_get_num_frame(gr)>0)
+       {
+               mgl_set_alpha(gr,alpha);        mgl_set_light(gr,light);
+//             mgl_zoom(gr,x1,y1,x2,y2);       mgl_view(gr,-phi,-tet,0);
+               mgl_get_frame(gr,0);
        }
+       afterPlot();
 }
 //-----------------------------------------------------------------------------
 void QMathGL::afterPlot()
@@ -351,7 +359,7 @@ void QMathGL::drawPrim()
        mglParse pr;
        long i, n=primitives.count('\n');
        mglGraph gg(gr);
-       setlocale(LC_NUMERIC, "C");
+       const std::string loc = setlocale(LC_NUMERIC, "C");
        gg.Push();      gg.SubPlot(1,1,0,"#");
        mglPoint ox1=gr->Min, ox2=gr->Max;
        gg.SetRanges(mglPoint(-1,-1,-1),mglPoint(1,1,1));
@@ -359,9 +367,9 @@ void QMathGL::drawPrim()
        {
                mgl_set_obj_id(gr,i+MGL_MAX_LINES);
                QString tst = primitives.section('\n',i,i);
-               pr.Parse(&gg,primitives.section('\n',i,i).toStdString().c_str(),i+MGL_MAX_LINES);
+               pr.Parse(&gg,primitives.section('\n',i,i).toLocal8Bit().constData(),i+MGL_MAX_LINES);
        }
-       gg.SetRanges(ox1,ox2);  gg.Pop();       setlocale(LC_NUMERIC, "");
+       gg.SetRanges(ox1,ox2);  gg.Pop();       setlocale(LC_NUMERIC, loc.c_str());
 }
 //-----------------------------------------------------------------------------
 void QMathGL::refresh()
@@ -467,8 +475,10 @@ void QMathGL::mouseMoveEvent(QMouseEvent *ev)
                        mreal ff = 240/sqrt(mreal(width()*height()));
                        phi += int((x0-xe)*ff);
                        tet -= int((y0-ye)*ff);
-                       if(phi>180)     phi-=360;               if(phi<-180)    phi+=360;
-                       if(tet>180)     tet-=360;               if(tet<-180)    tet+=360;
+                       if(phi>180)             phi-=360;
+                       if(phi<-180)    phi+=360;
+                       if(tet>180)             tet-=360;
+                       if(tet<-180)    tet+=360;
                        emit tetChanged(int(tet));              emit phiChanged(int(phi));
                        refresh();
                }
@@ -479,7 +489,8 @@ void QMathGL::mouseMoveEvent(QMouseEvent *ev)
                        x1 = cx+(x1-cx)*exp(-ff);       x2 = cx+(x2-cx)*exp(-ff);
                        y1 = cy+(y1-cy)*exp(-ff);       y2 = cy+(y2-cy)*exp(-ff);
                        per = per + gg;
-                       if(per<0)       per = 0;        if(per>=1)      per = 0.9999;
+                       if(per<0)       per = 0;
+                       if(per>=1)      per = 0.9999;
                        if(gg)  emit perChanged(int(per));
                        refresh();
                }
@@ -513,14 +524,12 @@ void QMathGL::mouseMoveEvent(QMouseEvent *ev)
                        if(id>=0)       // this is our primitive
                        {
                                // try "attract" mouse
-                               register size_t i;
-                               register int tt;
-                               for(i=0;i<=10;i++)
+                               for(size_t i=0;i<=10;i++)
                                {
-                                       tt = i*(w/10);  if(abs(xe-tt)<2*d)      xe = tt;
+                                       int tt = i*(w/10);      if(abs(xe-tt)<2*d)      xe = tt;
                                        tt = i*(h/10);  if(abs(ye-tt)<2*d)      ye = tt;
                                }
-                               for(i=0;i<gr->Act.size();i++)
+                               for(size_t i=0;i<gr->Act.size();i++)
                                {
                                        const mglActivePos &q = gr->Act[i];
                                        if(abs(xe-q.x)<2*d && abs(ye-q.y)<2*d)  {       xe=q.x; ye=q.y; }
@@ -668,10 +677,10 @@ QString setExtension(const QString &fname, const char *ext)
 void QMathGL::exportGIF(QString fname)
 {
        if(fname.isEmpty())     fname = mgl_get_plotid(gr);
-       if(fname.isEmpty())     QMessageBox::critical(this, appName, tr("No filename."),QMessageBox::Ok,0,0);
+       if(fname.isEmpty())     QMessageBox::critical(this, appName, _("No filename."),QMessageBox::Ok,0,0);
        else
 #if MGL_HAVE_GIF
-               mgl_write_gif(gr,setExtension(fname,"png").toStdString().c_str(), appName.toStdString().c_str());
+               mgl_write_gif(gr,setExtension(fname,"png").toLocal8Bit().constData(), appName.toLocal8Bit().constData());
 #else
                img.save(setExtension(fname,"gif"));
 #endif
@@ -680,10 +689,10 @@ void QMathGL::exportGIF(QString fname)
 void QMathGL::exportPNG(QString fname)
 {
        if(fname.isEmpty())     fname = mgl_get_plotid(gr);
-       if(fname.isEmpty())     QMessageBox::critical(this, appName, tr("No filename."),QMessageBox::Ok,0,0);
+       if(fname.isEmpty())     QMessageBox::critical(this, appName, _("No filename."),QMessageBox::Ok,0,0);
        else
 #if MGL_HAVE_PNG
-               mgl_write_png(gr,setExtension(fname,"png").toStdString().c_str(), appName.toStdString().c_str());
+               mgl_write_png(gr,setExtension(fname,"png").toLocal8Bit().constData(), appName.toLocal8Bit().constData());
 #else
                img.save(setExtension(fname,"png"));
 #endif
@@ -692,10 +701,10 @@ void QMathGL::exportPNG(QString fname)
 void QMathGL::exportPNGs(QString fname)
 {
        if(fname.isEmpty())     fname = mgl_get_plotid(gr);
-       if(fname.isEmpty())     QMessageBox::critical(this, appName, tr("No filename."),QMessageBox::Ok,0,0);
+       if(fname.isEmpty())     QMessageBox::critical(this, appName, _("No filename."),QMessageBox::Ok,0,0);
        else
 #if MGL_HAVE_PNG
-               mgl_write_png_solid(gr,setExtension(fname,"png").toStdString().c_str(), appName.toStdString().c_str());
+               mgl_write_png_solid(gr,setExtension(fname,"png").toLocal8Bit().constData(), appName.toLocal8Bit().constData());
 #else
                img.save(setExtension(fname,"png"));
 #endif
@@ -704,10 +713,10 @@ void QMathGL::exportPNGs(QString fname)
 void QMathGL::exportJPG(QString fname)
 {
        if(fname.isEmpty())     fname = mgl_get_plotid(gr);
-       if(fname.isEmpty())     QMessageBox::critical(this, appName, tr("No filename."),QMessageBox::Ok,0,0);
+       if(fname.isEmpty())     QMessageBox::critical(this, appName, _("No filename."),QMessageBox::Ok,0,0);
        else
 #if MGL_HAVE_JPEG
-               mgl_write_jpg(gr,setExtension(fname,"jpg").toStdString().c_str(), appName.toStdString().c_str());
+               mgl_write_jpg(gr,setExtension(fname,"jpg").toLocal8Bit().constData(), appName.toLocal8Bit().constData());
 #else
                img.save(setExtension(fname,"jpg"));
 #endif
@@ -716,154 +725,106 @@ void QMathGL::exportJPG(QString fname)
 void QMathGL::exportBPS(QString fname)
 {
        if(fname.isEmpty())     fname = mgl_get_plotid(gr);
-       if(fname.isEmpty())     QMessageBox::critical(this, appName, tr("No filename."),QMessageBox::Ok,0,0);
+       if(fname.isEmpty())     QMessageBox::critical(this, appName, _("No filename."),QMessageBox::Ok,0,0);
        else
-       {
-               setlocale(LC_NUMERIC, "C");
-               mgl_write_bps(gr,setExtension(fname,"eps").toStdString().c_str(), appName.toStdString().c_str());
-               setlocale(LC_NUMERIC, "");
-       }
+               mgl_write_bps(gr,setExtension(fname,"eps").toLocal8Bit().constData(), appName.toLocal8Bit().constData());
 }
 //-----------------------------------------------------------------------------
 void QMathGL::exportEPS(QString fname)
 {
        if(fname.isEmpty())     fname = mgl_get_plotid(gr);
-       if(fname.isEmpty())     QMessageBox::critical(this, appName, tr("No filename."),QMessageBox::Ok,0,0);
+       if(fname.isEmpty())     QMessageBox::critical(this, appName, _("No filename."),QMessageBox::Ok,0,0);
        else
-       {
-               setlocale(LC_NUMERIC, "C");
-               mgl_write_eps(gr,setExtension(fname,"eps").toStdString().c_str(), appName.toStdString().c_str());
-               setlocale(LC_NUMERIC, "");
-       }
+               mgl_write_eps(gr,setExtension(fname,"eps").toLocal8Bit().constData(), appName.toLocal8Bit().constData());
 }
 //-----------------------------------------------------------------------------
 void QMathGL::exportSVG(QString fname)
 {
        if(fname.isEmpty())     fname = mgl_get_plotid(gr);
-       if(fname.isEmpty())     QMessageBox::critical(this, appName, tr("No filename."),QMessageBox::Ok,0,0);
+       if(fname.isEmpty())     QMessageBox::critical(this, appName, _("No filename."),QMessageBox::Ok,0,0);
        else
-       {
-               setlocale(LC_NUMERIC, "C");
-               mgl_write_svg(gr,setExtension(fname,"svg").toStdString().c_str(), appName.toStdString().c_str());
-               setlocale(LC_NUMERIC, "");
-       }
+               mgl_write_svg(gr,setExtension(fname,"svg").toLocal8Bit().constData(), appName.toLocal8Bit().constData());
 }
 //-----------------------------------------------------------------------------
 void QMathGL::exportXYZ(QString fname)
 {
        if(fname.isEmpty())     fname = mgl_get_plotid(gr);
-       if(fname.isEmpty())     QMessageBox::critical(this, appName, tr("No filename."),QMessageBox::Ok,0,0);
+       if(fname.isEmpty())     QMessageBox::critical(this, appName, _("No filename."),QMessageBox::Ok,0,0);
        else
-       {
-               setlocale(LC_NUMERIC, "C");
-               mgl_write_xyz(gr,setExtension(fname,"xyz").toStdString().c_str(), appName.toStdString().c_str());
-               setlocale(LC_NUMERIC, "");
-       }
+               mgl_write_xyz(gr,setExtension(fname,"xyz").toLocal8Bit().constData(), appName.toLocal8Bit().constData());
 }
 //-----------------------------------------------------------------------------
 void QMathGL::exportTEX(QString fname)
 {
        if(fname.isEmpty())     fname = mgl_get_plotid(gr);
-       if(fname.isEmpty())     QMessageBox::critical(this, appName, tr("No filename."),QMessageBox::Ok,0,0);
+       if(fname.isEmpty())     QMessageBox::critical(this, appName, _("No filename."),QMessageBox::Ok,0,0);
        else
-       {
-               setlocale(LC_NUMERIC, "C");
-               mgl_write_tex(gr,setExtension(fname,"tex").toStdString().c_str(), appName.toStdString().c_str());
-               setlocale(LC_NUMERIC, "");
-       }
+               mgl_write_tex(gr,setExtension(fname,"tex").toLocal8Bit().constData(), appName.toLocal8Bit().constData());
 }
 //-----------------------------------------------------------------------------
 void QMathGL::exportOFF(QString fname)
 {
        if(fname.isEmpty())     fname = mgl_get_plotid(gr);
-       if(fname.isEmpty())     QMessageBox::critical(this, appName, tr("No filename."),QMessageBox::Ok,0,0);
+       if(fname.isEmpty())     QMessageBox::critical(this, appName, _("No filename."),QMessageBox::Ok,0,0);
        else
-       {
-               setlocale(LC_NUMERIC, "C");
-               mgl_write_off(gr,setExtension(fname,"off").toStdString().c_str(), appName.toStdString().c_str(),0);
-               setlocale(LC_NUMERIC, "");
-       }
+               mgl_write_off(gr,setExtension(fname,"off").toLocal8Bit().constData(), appName.toLocal8Bit().constData(),0);
 }
 //-----------------------------------------------------------------------------
 void QMathGL::exportOBJ(QString fname)
 {
        if(fname.isEmpty())     fname = mgl_get_plotid(gr);
-       if(fname.isEmpty())     QMessageBox::critical(this, appName, tr("No filename."),QMessageBox::Ok,0,0);
+       if(fname.isEmpty())     QMessageBox::critical(this, appName, _("No filename."),QMessageBox::Ok,0,0);
        else
-       {
-               setlocale(LC_NUMERIC, "C");
-               mgl_write_obj(gr,setExtension(fname,"obj").toStdString().c_str(), appName.toStdString().c_str(),1);
-               setlocale(LC_NUMERIC, "");
-       }
+               mgl_write_obj(gr,setExtension(fname,"obj").toLocal8Bit().constData(), appName.toLocal8Bit().constData(),1);
 }
 //-----------------------------------------------------------------------------
 void QMathGL::exportSTL(QString fname)
 {
        if(fname.isEmpty())     fname = mgl_get_plotid(gr);
-       if(fname.isEmpty())     QMessageBox::critical(this, appName, tr("No filename."),QMessageBox::Ok,0,0);
+       if(fname.isEmpty())     QMessageBox::critical(this, appName, _("No filename."),QMessageBox::Ok,0,0);
        else
-       {
-               setlocale(LC_NUMERIC, "C");
-               mgl_write_stl(gr,setExtension(fname,"stl").toStdString().c_str(), appName.toStdString().c_str());
-               setlocale(LC_NUMERIC, "");
-       }
+               mgl_write_stl(gr,setExtension(fname,"stl").toLocal8Bit().constData(), appName.toLocal8Bit().constData());
 }
 //-----------------------------------------------------------------------------
 /*void QMathGL::exportX3D(QString fname)
 {
        if(fname.isEmpty())     fname = mgl_get_plotid(gr);
-       if(fname.isEmpty())     QMessageBox::critical(this, appName, tr("No filename."),QMessageBox::Ok,0,0);
+       if(fname.isEmpty())     QMessageBox::critical(this, appName, _("No filename."),QMessageBox::Ok,0,0);
        else
-       {
-               setlocale(LC_NUMERIC, "C");
-               mgl_write_x3d(gr,setExtension(fname,"x3d").toStdString().c_str(), appName.toStdString().c_str());
-               setlocale(LC_NUMERIC, "");
-       }
+               mgl_write_x3d(gr,setExtension(fname,"x3d").toLocal8Bit().constData(), appName.toLocal8Bit().constData());
 }*/
 //-----------------------------------------------------------------------------
 void QMathGL::exportTGA(QString fname)
 {
        if(fname.isEmpty())     fname = mgl_get_plotid(gr);
-       if(fname.isEmpty())     QMessageBox::critical(this, appName, tr("No filename."),QMessageBox::Ok,0,0);
+       if(fname.isEmpty())     QMessageBox::critical(this, appName, _("No filename."),QMessageBox::Ok,0,0);
        else
-       {
-               setlocale(LC_NUMERIC, "C");
-               mgl_write_tga(gr,setExtension(fname,"tga").toStdString().c_str(), appName.toStdString().c_str());
-               setlocale(LC_NUMERIC, "");
-       }
+               mgl_write_tga(gr,setExtension(fname,"tga").toLocal8Bit().constData(), appName.toLocal8Bit().constData());
 }
 //-----------------------------------------------------------------------------
 void QMathGL::exportPRC(QString fname)
 {
        if(fname.isEmpty())     fname = mgl_get_plotid(gr);
-       if(fname.isEmpty())     QMessageBox::critical(this, appName, tr("No filename."),QMessageBox::Ok,0,0);
+       if(fname.isEmpty())     QMessageBox::critical(this, appName, _("No filename."),QMessageBox::Ok,0,0);
        else
-       {
-               setlocale(LC_NUMERIC, "C");
-               mgl_write_prc(gr,setExtension(fname,"prc").toStdString().c_str(), appName.toStdString().c_str(),1);
-               setlocale(LC_NUMERIC, "");
-       }
+               mgl_write_prc(gr,setExtension(fname,"prc").toLocal8Bit().constData(), appName.toLocal8Bit().constData(),1);
 }
 //-----------------------------------------------------------------------------
 void QMathGL::exportMGLD(QString fname)
 {
        if(fname.isEmpty())     fname = mgl_get_plotid(gr);
-       if(fname.isEmpty())     QMessageBox::critical(this, appName, tr("No filename."),QMessageBox::Ok,0,0);
+       if(fname.isEmpty())     QMessageBox::critical(this, appName, _("No filename."),QMessageBox::Ok,0,0);
        else
-       {
-               setlocale(LC_NUMERIC, "C");
-               mgl_export_mgld(gr,setExtension(fname,"mgld").toStdString().c_str(), appName.toStdString().c_str());
-               setlocale(LC_NUMERIC, "");
-       }
+               mgl_export_mgld(gr,setExtension(fname,"mgld").toLocal8Bit().constData(), appName.toLocal8Bit().constData());
 }
 //-----------------------------------------------------------------------------
 void mglConvertFromGraph(QPixmap &pic, mglCanvas *gr, uchar **buf, QImage *out)
 {
        const uchar *bb = mgl_get_rgb(gr);
-       register long i,w=mgl_get_width(gr), h=mgl_get_height(gr);
+       long w=mgl_get_width(gr), h=mgl_get_height(gr);
        if(*buf)        delete [](*buf);
        *buf = new uchar[4*w*h];
-       for(i=0;i<w*h;i++)
+       for(long i=0;i<w*h;i++)
        {
                (*buf)[4*i]   = bb[3*i+2];
                (*buf)[4*i+1] = bb[3*i+1];
@@ -884,7 +845,7 @@ void QMathGL::copyClickCoor()
 //-----------------------------------------------------------------------------
 void QMathGL::setMGLFont(QString path)
 {      if(path.isEmpty())      mgl_restore_font(gr);
-       else    mgl_load_font(gr,path.toStdString().c_str(),0); }
+       else    mgl_load_font(gr,path.toLocal8Bit().constData(),0);     }
 //-----------------------------------------------------------------------------
 void QMathGL::setSize(int w, int h)
 {
@@ -895,11 +856,11 @@ void QMathGL::setSize(int w, int h)
 //-----------------------------------------------------------------------------
 void QMathGL::about()
 {
-       QString s = tr("MathGL v. 2.") + QString::number(MGL_VER2) + tr("\n(c) Alexey Balakin, 2007\nhttp://mathgl.sourceforge.net/");
-       QMessageBox::about(this, tr("MathGL - about"), s);
+       QString s = _("MathGL v. 2.") + QString::number(MGL_VER2) + _("\n(c) Alexey Balakin, 2007\nhttp://mathgl.sourceforge.net/");
+       QMessageBox::about(this, _("MathGL - about"), s);
 }
 //-----------------------------------------------------------------------------
-void QMathGL::aboutQt()        {       QMessageBox::aboutQt(this, tr("About Qt"));     }
+void QMathGL::aboutQt()        {       QMessageBox::aboutQt(this, _("About Qt"));      }
 //-----------------------------------------------------------------------------
 void QMathGL::print()
 {
@@ -911,7 +872,8 @@ void QMathGL::print()
                QRectF r = printer->pageRect(QPrinter::Inch);
                int d1 = int(pic.width()/r.width()), d2 = int(pic.height()/r.height());
                int dpi = printer->resolution();
-               if(dpi<d1)      dpi=d1;         if(dpi<d2)      dpi=d2;
+               if(dpi<d1)      dpi=d1;
+               if(dpi<d2)      dpi=d2;
                printer->setResolution(dpi);
 
                QPainter p;
@@ -971,7 +933,7 @@ void QMathGL::addArc()
 void QMathGL::addPolygon(int n)
 {
        if(n<3)
-               n = QInputDialog::getText(QApplication::activeWindow(), "MathGL", tr("Enter number of vertexes")).toInt();
+               n = QInputDialog::getText(QApplication::activeWindow(), "MathGL", _("Enter number of vertexes")).toInt();
        if(n>=3)
        {       primitives += "polygon 0 0 0 0.2 "+QString::number(n)+" 'r'\n"; refresh();      }
 }
@@ -980,7 +942,7 @@ void QMathGL::addPolygon(int n)
 void QMathGL::addText(QString txt)
 {
        if(txt.isEmpty())
-               txt = QInputDialog::getText(QApplication::activeWindow(), "MathGL", tr("Enter text"));
+               txt = QInputDialog::getText(QApplication::activeWindow(), "MathGL", _("Enter text"));
        if(!txt.isEmpty())
        {       primitives += "text 0 0 0.1 0 '"+txt+"' ''\n";  refresh();      }
 }
@@ -1092,7 +1054,6 @@ void mglCanvasQT::Window(int argc, char **argv, int (*draw)(mglBase *gr, void *p
 #include "xpm/stop.xpm"
 #include "xpm/pause.xpm"
 //-----------------------------------------------------------------------------
-#define TR     QObject::tr
 MGL_EXPORT QMenu *mglMakeMenu(QMainWindow *Wnd, QMathGL *QMGL, QSpinBox *&tet, QSpinBox *&phi)
 {
        QAction *a;
@@ -1102,135 +1063,135 @@ MGL_EXPORT QMenu *mglMakeMenu(QMainWindow *Wnd, QMathGL *QMGL, QSpinBox *&tet, Q
        QMenu *popup = new QMenu(Wnd);
        // file menu
        {
-               f = o = Wnd->menuBar()->addMenu(TR("&File"));
-               oo = new QMenu(TR("&Export as 2D ..."),Wnd);
-               oo->addAction(TR("PNG"), QMGL, SLOT(exportPNG()),Qt::ALT+Qt::Key_P);
-               oo->addAction(TR("solid PNG"), QMGL, SLOT(exportPNGs()),Qt::ALT+Qt::Key_F);
-               oo->addAction(TR("JPEG"), QMGL, SLOT(exportJPG()),Qt::ALT+Qt::Key_J);
-               oo->addAction(TR("bitmap EPS"), QMGL, SLOT(exportBPS()));
-               oo->addAction(TR("vector EPS"), QMGL, SLOT(exportEPS()),Qt::ALT+Qt::Key_E);
-               oo->addAction(TR("SVG"), QMGL, SLOT(exportSVG()),Qt::ALT+Qt::Key_S);
-               oo->addAction(TR("LaTeX"), QMGL, SLOT(exportTEX()),Qt::ALT+Qt::Key_L);
+               f = o = Wnd->menuBar()->addMenu(_("File"));
+               oo = new QMenu(_("Export as 2D ..."),Wnd);
+               oo->addAction(_("PNG"), QMGL, SLOT(exportPNG()),Qt::ALT+Qt::Key_P);
+               oo->addAction(_("solid PNG"), QMGL, SLOT(exportPNGs()),Qt::ALT+Qt::Key_F);
+               oo->addAction(_("JPEG"), QMGL, SLOT(exportJPG()),Qt::ALT+Qt::Key_J);
+               oo->addAction(_("bitmap EPS"), QMGL, SLOT(exportBPS()));
+               oo->addAction(_("vector EPS"), QMGL, SLOT(exportEPS()),Qt::ALT+Qt::Key_E);
+               oo->addAction(_("SVG"), QMGL, SLOT(exportSVG()),Qt::ALT+Qt::Key_S);
+               oo->addAction(_("LaTeX"), QMGL, SLOT(exportTEX()),Qt::ALT+Qt::Key_L);
                o->addMenu(oo);         popup->addMenu(oo);
-               oo = new QMenu(TR("&Export as 3D ..."),Wnd);
-               oo->addAction(TR("MGLD"), QMGL, SLOT(exportMGLD()),Qt::ALT+Qt::Key_M);
-               oo->addAction(TR("PRC"), QMGL, SLOT(exportPRC()),Qt::ALT+Qt::Key_D);
-               oo->addAction(TR("OBJ"), QMGL, SLOT(exportOBJ()),Qt::ALT+Qt::Key_O);
-               oo->addAction(TR("STL"), QMGL, SLOT(exportSTL()));
-               oo->addAction(TR("XYZ"), QMGL, SLOT(exportXYZ()));
-//             oo->addAction(TR("X3D"), QMGL, SLOT(exportX3D()),Qt::ALT+Qt::Key_X);
+               oo = new QMenu(_("Export as 3D ..."),Wnd);
+               oo->addAction(_("MGLD"), QMGL, SLOT(exportMGLD()),Qt::ALT+Qt::Key_M);
+               oo->addAction(_("PRC"), QMGL, SLOT(exportPRC()),Qt::ALT+Qt::Key_D);
+               oo->addAction(_("OBJ"), QMGL, SLOT(exportOBJ()),Qt::ALT+Qt::Key_O);
+               oo->addAction(_("STL"), QMGL, SLOT(exportSTL()));
+               oo->addAction(_("XYZ"), QMGL, SLOT(exportXYZ()));
+//             oo->addAction(_("X3D"), QMGL, SLOT(exportX3D()),Qt::ALT+Qt::Key_X);
                o->addMenu(oo);         popup->addMenu(oo);
 
                o->addSeparator();
-               a = new QAction(QPixmap(fileprint), TR("Print &graphics"), Wnd);
+               a = new QAction(QPixmap(fileprint), _("Print graphics"), Wnd);
                Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(print()));
-               a->setToolTip(TR("Open printer dialog and print graphics\t(CTRl+P)"));
+               a->setToolTip(_("Open printer dialog and print graphics (Ctrl+P)"));
                a->setShortcut(Qt::CTRL+Qt::Key_P);     o->addAction(a);
                o->addSeparator();
-               o->addAction(TR("&Close"), Wnd, SLOT(close()), Qt::CTRL+Qt::Key_W);
+               o->addAction(_("Close"), Wnd, SLOT(close()), Qt::CTRL+Qt::Key_W);
        }
        // graphics menu
        {
-               bb = new QToolBar(TR("Graphics"),Wnd);
+               bb = new QToolBar(_("Graphics"),Wnd);
                Wnd->addToolBar(Qt::TopToolBarArea, bb);
-               o = Wnd->menuBar()->addMenu(TR("&Graphics"));
-               a = new QAction(QPixmap(alpha_xpm), TR("&Alpha"), Wnd);
+               o = Wnd->menuBar()->addMenu(_("Graphics"));
+               a = new QAction(QPixmap(alpha_xpm), _("Alpha"), Wnd);
                a->setShortcut(Qt::ALT+Qt::Key_T);      a->setCheckable(true);
                Wnd->connect(a, SIGNAL(toggled(bool)), QMGL, SLOT(setAlpha(bool)));
                Wnd->connect(QMGL, SIGNAL(alphaChanged(bool)), a, SLOT(setChecked(bool)));
-               a->setToolTip(TR("Switch on/off TRansparency for the graphics (Alt+T)."));
+               a->setToolTip(_("Switch on/off transparency for the graphics (Alt+T)."));
                o->addAction(a);                bb->addAction(a);
-               a = new QAction(QPixmap(light_xpm), TR("&Light"), Wnd);
+               a = new QAction(QPixmap(light_xpm), _("Light"), Wnd);
                a->setShortcut(Qt::ALT+Qt::Key_L);      a->setCheckable(true);
                Wnd->connect(a, SIGNAL(toggled(bool)), QMGL, SLOT(setLight(bool)));
                Wnd->connect(QMGL, SIGNAL(lightChanged(bool)), a, SLOT(setChecked(bool)));
-               a->setToolTip(TR("Switch on/off lightning for the graphics (Alt+L)."));
+               a->setToolTip(_("Switch on/off lightning for the graphics (Alt+L)."));
                o->addAction(a);                bb->addAction(a);
-               a = new QAction(QPixmap(rotate_xpm), TR("&Rotate by mouse"), Wnd);
+               a = new QAction(QPixmap(rotate_xpm), _("Rotate by mouse"), Wnd);
                a->setCheckable(true);
                Wnd->connect(a, SIGNAL(toggled(bool)), QMGL, SLOT(setRotate(bool)));
                Wnd->connect(QMGL, SIGNAL(rotateChanged(bool)), a, SLOT(setChecked(bool)));
-               a->setToolTip(TR("Switch on/off mouse handling of the graphics\n(rotation, shifting, zooming and perspective)."));
+               a->setToolTip(_("Switch on/off mouse handling of the graphics\n(rotation, shifting, zooming and perspective)."));
                bb->addAction(a);
-               a = new QAction(QPixmap(zoom_in_xpm), TR("&Zoom by mouse"), Wnd);
+               a = new QAction(QPixmap(zoom_in_xpm), _("Zoom by mouse"), Wnd);
                a->setCheckable(true);
                Wnd->connect(a, SIGNAL(toggled(bool)), QMGL, SLOT(setZoom(bool)));
                Wnd->connect(QMGL, SIGNAL(zoomChanged(bool)), a, SLOT(setChecked(bool)));
-               a->setToolTip(TR("Switch on/off mouse zoom of selected region."));
+               a->setToolTip(_("Switch on/off mouse zoom of selected region."));
                bb->addAction(a);
                o->addSeparator();
-               a = new QAction(QPixmap(zoom_out_xpm), TR("Res&tore"), Wnd);
+               a = new QAction(QPixmap(zoom_out_xpm), _("Restore"), Wnd);
                Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(restore()));
-               a->setToolTip(TR("Restore default graphics rotation, zoom and perspective (Alt+Space)."));
+               a->setToolTip(_("Restore default graphics rotation, zoom and perspective (Alt+Space)."));
                a->setShortcut(Qt::ALT+Qt::Key_Space);
                o->addAction(a);        bb->addAction(a);       popup->addAction(a);
                bb->addSeparator();
                o->addAction(a);        bb->addAction(a);       popup->addAction(a);
-               a = new QAction(QPixmap(ok_xpm), TR("Re&draw"), Wnd);
+               a = new QAction(QPixmap(ok_xpm), _("Redraw"), Wnd);
                Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(update()));
-               a->setToolTip(TR("Execute script and redraw graphics (F5)."));
+               a->setToolTip(_("Execute script and redraw graphics (F5)."));
                a->setShortcut(Qt::Key_F5);
                o->addAction(a);        bb->addAction(a);       popup->addAction(a);
-               a = new QAction(QPixmap(stop_xpm), TR("Stop"), Wnd);
+               a = new QAction(QPixmap(stop_xpm), _("Stop"), Wnd);
                Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(stop()));
-               a->setToolTip(TR("Ask to stop plot drawing (F7)."));
+               a->setToolTip(_("Ask to stop plot drawing (F7)."));
                a->setShortcut(Qt::Key_F7);
-               a = new QAction(TR("&Adjust size"), Wnd);
+               a = new QAction(_("Adjust size"), Wnd);
                Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(adjust()));
-               a->setToolTip(TR("Change canvas size to fill whole region (F6)."));
+               a->setToolTip(_("Change canvas size to fill whole region (F6)."));
                a->setShortcut(Qt::Key_F6);             o->addAction(a);
-               a = new QAction(QPixmap(copy_xpm), TR("&Copy plot"), Wnd);
+               a = new QAction(QPixmap(copy_xpm), _("Copy plot"), Wnd);
                Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(copy()));
-               a->setToolTip(TR("Copy graphics to clipboard (CTRl+Shift+G)."));
+               a->setToolTip(_("Copy graphics to clipboard (Ctrl+Shift+G)."));
                a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_G);
                o->addAction(a);                bb->addAction(a);       popup->addAction(a);
 
                bb->addSeparator();
-               oo = new QMenu(TR("Primitives ..."),Wnd);
-               a = new QAction(QPixmap(line_xpm), TR("Add line"), Wnd);
+               oo = new QMenu(_("Primitives ..."),Wnd);
+               a = new QAction(QPixmap(line_xpm), _("Add line"), Wnd);
                Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(addLine()));
                Wnd->connect(QMGL, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool)));
-               a->setToolTip(TR("Add line which properties can be changed later by mouse."));
+               a->setToolTip(_("Add line which properties can be changed later by mouse."));
                bb->addAction(a);       oo->addAction(a);
-               a = new QAction(QPixmap(arc_xpm), TR("Add arc"), Wnd);
+               a = new QAction(QPixmap(arc_xpm), _("Add arc"), Wnd);
                Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(addArc()));
                Wnd->connect(QMGL, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool)));
-               a->setToolTip(TR("Add arc which properties can be changed later by mouse."));
+               a->setToolTip(_("Add arc which properties can be changed later by mouse."));
                bb->addAction(a);       oo->addAction(a);
-               a = new QAction(QPixmap(curve_xpm), TR("Add curve"), Wnd);
+               a = new QAction(QPixmap(curve_xpm), _("Add curve"), Wnd);
                Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(addCurve()));
                Wnd->connect(QMGL, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool)));
-               a->setToolTip(TR("Add curve which properties can be changed later by mouse."));
+               a->setToolTip(_("Add curve which properties can be changed later by mouse."));
                bb->addAction(a);       oo->addAction(a);
-               a = new QAction(QPixmap(mark_s_xpm), TR("Add rect"), Wnd);
+               a = new QAction(QPixmap(mark_s_xpm), _("Add rect"), Wnd);
                Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(addRect()));
                Wnd->connect(QMGL, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool)));
-               a->setToolTip(TR("Add rectangle which properties can be changed later by mouse."));
+               a->setToolTip(_("Add rectangle which properties can be changed later by mouse."));
                bb->addAction(a);       oo->addAction(a);
-               a = new QAction(QPixmap(mark_d_xpm), TR("Add rhombus"), Wnd);
+               a = new QAction(QPixmap(mark_d_xpm), _("Add rhombus"), Wnd);
                Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(addRhomb()));
                Wnd->connect(QMGL, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool)));
-               a->setToolTip(TR("Add rhombus which properties can be changed later by mouse."));
+               a->setToolTip(_("Add rhombus which properties can be changed later by mouse."));
                bb->addAction(a);       oo->addAction(a);
-               a = new QAction(QPixmap(mark_o_xpm), TR("Add ellipse"), Wnd);
+               a = new QAction(QPixmap(mark_o_xpm), _("Add ellipse"), Wnd);
                Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(addEllipse()));
                Wnd->connect(QMGL, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool)));
-               a->setToolTip(TR("Add ellipse which properties can be changed later by mouse."));
+               a->setToolTip(_("Add ellipse which properties can be changed later by mouse."));
                bb->addAction(a);       oo->addAction(a);
-               a = new QAction(QPixmap(polygon_xpm), TR("Add polygon"), Wnd);
+               a = new QAction(QPixmap(polygon_xpm), _("Add polygon"), Wnd);
                Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(addPolygon()));
                Wnd->connect(QMGL, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool)));
-               a->setToolTip(TR("Add polygon which properties can be changed later by mouse."));
+               a->setToolTip(_("Add polygon which properties can be changed later by mouse."));
                bb->addAction(a);       oo->addAction(a);
-               a = new QAction(QPixmap(mark_a_xpm), TR("Add mark"), Wnd);
+               a = new QAction(QPixmap(mark_a_xpm), _("Add mark"), Wnd);
                Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(addMark()));
                Wnd->connect(QMGL, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool)));
-               a->setToolTip(TR("Add marker which properties can be changed later by mouse."));
+               a->setToolTip(_("Add marker which properties can be changed later by mouse."));
                bb->addAction(a);       oo->addAction(a);
-               a = new QAction(QPixmap(text_xpm), TR("Add text"), Wnd);
+               a = new QAction(QPixmap(text_xpm), _("Add text"), Wnd);
                Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(addText()));
                Wnd->connect(QMGL, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool)));
-               a->setToolTip(TR("Add text which properties can be changed later by mouse."));
+               a->setToolTip(_("Add text which properties can be changed later by mouse."));
                bb->addAction(a);       oo->addAction(a);
                o->addMenu(oo);
 
@@ -1239,82 +1200,82 @@ MGL_EXPORT QMenu *mglMakeMenu(QMainWindow *Wnd, QMathGL *QMGL, QSpinBox *&tet, Q
                bb->addWidget(tet);     tet->setRange(-180, 180);       tet->setSingleStep(10);
                Wnd->connect(tet, SIGNAL(valueChanged(int)), QMGL, SLOT(setTet(int)));
                Wnd->connect(QMGL, SIGNAL(tetChanged(int)), tet, SLOT(setValue(int)));
-               tet->setToolTip(TR("Set value of \\theta angle."));
+               tet->setToolTip(_("Set value of \\theta angle."));
                bb->addSeparator();
                phi = new QSpinBox(Wnd);        phi->setWrapping(true);
                bb->addWidget(phi);     phi->setRange(-180, 180);       phi->setSingleStep(10);
                Wnd->connect(phi, SIGNAL(valueChanged(int)), QMGL, SLOT(setPhi(int)));
                Wnd->connect(QMGL, SIGNAL(phiChanged(int)), phi, SLOT(setValue(int)));
-               phi->setToolTip(TR("Set value of \\phi angle."));
+               phi->setToolTip(_("Set value of \\phi angle."));
 //     bb->addSeparator();
        }
        // zooming menu
        {
-               oo = o->addMenu(TR("Zoom/move"));
-               bb = new QToolBar(TR("Zoom graphics"),Wnd);
+               oo = o->addMenu(_("Zoom/move"));
+               bb = new QToolBar(_("Zoom graphics"),Wnd);
                Wnd->addToolBar(Qt::LeftToolBarArea, bb);
-               a = new QAction(QPixmap(left_1_xpm), TR("Move &left"), Wnd);
+               a = new QAction(QPixmap(left_1_xpm), _("Move left"), Wnd);
                Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(shiftLeft()));
-               a->setToolTip(TR("Move graphics left by 1/3 of its width."));
+               a->setToolTip(_("Move graphics left by 1/3 of its width."));
                bb->addAction(a);               oo->addAction(a);
-               a = new QAction(QPixmap(up_1_xpm), TR("Move &up"), Wnd);
+               a = new QAction(QPixmap(up_1_xpm), _("Move up"), Wnd);
                Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(shiftUp()));
-               a->setToolTip(TR("Move graphics up by 1/3 of its height."));
+               a->setToolTip(_("Move graphics up by 1/3 of its height."));
                bb->addAction(a);               oo->addAction(a);
-               a = new QAction(QPixmap(zoom_1_xpm), TR("Zoom &in"), Wnd);
+               a = new QAction(QPixmap(zoom_1_xpm), _("Zoom in"), Wnd);
                Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(zoomIn()));
-               a->setToolTip(TR("Zoom in graphics."));
+               a->setToolTip(_("Zoom in graphics."));
                bb->addAction(a);               oo->addAction(a);
-               a = new QAction(QPixmap(norm_1_xpm), TR("Zoom &out"), Wnd);
+               a = new QAction(QPixmap(norm_1_xpm), _("Zoom out"), Wnd);
                Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(zoomOut()));
-               a->setToolTip(TR("Zoom out graphics."));
+               a->setToolTip(_("Zoom out graphics."));
                bb->addAction(a);               oo->addAction(a);
-               a = new QAction(QPixmap(down_1_xpm), TR("Move &down"), Wnd);
+               a = new QAction(QPixmap(down_1_xpm), _("Move down"), Wnd);
                Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(shiftDown()));
-               a->setToolTip(TR("Move graphics up down 1/3 of its height."));
+               a->setToolTip(_("Move graphics up down 1/3 of its height."));
                bb->addAction(a);               oo->addAction(a);
-               a = new QAction(QPixmap(right_1_xpm), TR("Move &right"), Wnd);
+               a = new QAction(QPixmap(right_1_xpm), _("Move right"), Wnd);
                Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(shiftRight()));
-               a->setToolTip(TR("Move graphics right by 1/3 of its width."));
+               a->setToolTip(_("Move graphics right by 1/3 of its width."));
                bb->addAction(a);               oo->addAction(a);
        }
        // animation menu
        {
-               o = Wnd->menuBar()->addMenu(TR("&Animation"));
-               bb = new QToolBar(TR("Animation"),Wnd);
+               o = Wnd->menuBar()->addMenu(_("Animation"));
+               bb = new QToolBar(_("Animation"),Wnd);
                Wnd->addToolBar(Qt::LeftToolBarArea, bb);
-               a = new QAction(QPixmap(next_sl_xpm), TR("&Next slide"), Wnd);
+               a = new QAction(QPixmap(next_sl_xpm), _("Next slide"), Wnd);
                Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(nextSlide()));
-               a->setToolTip(TR("Show next slide (Ctrl+.)."));
+               a->setToolTip(_("Show next slide (Ctrl+.)."));
                a->setShortcut(Qt::CTRL+Qt::Key_Period);        o->addAction(a);                bb->addAction(a);
-               a = new QAction(QPixmap(show_sl_xpm), TR("&Slideshow"), Wnd);
+               a = new QAction(QPixmap(show_sl_xpm), _("Slideshow"), Wnd);
                a->setCheckable(true);
                Wnd->connect(a, SIGNAL(toggled(bool)), QMGL, SLOT(animation(bool)));
-               a->setToolTip(TR("Run slideshow (CTRl+F5)."));
+               a->setToolTip(_("Run slideshow (CTRl+F5)."));
                a->setShortcut(Qt::CTRL+Qt::Key_F5);    o->addAction(a);                bb->addAction(a);
-               a = new QAction(QPixmap(prev_sl_xpm), TR("&Prev slide"), Wnd);
+               a = new QAction(QPixmap(prev_sl_xpm), _("Prev slide"), Wnd);
                Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(prevSlide()));
-               a->setToolTip(TR("Show previous slide (Ctrl+,)."));
+               a->setToolTip(_("Show previous slide (Ctrl+,)."));
                a->setShortcut(Qt::CTRL+Qt::Key_Comma); o->addAction(a);                bb->addAction(a);
        }
 #if MGL_HAVE_PTHR_WIDGET
        {
-               bb = new QToolBar(TR("Calculations"),Wnd);
+               bb = new QToolBar(_("Calculations"),Wnd);
                Wnd->addToolBar(Qt::LeftToolBarArea, bb);
-               a = new QAction(QPixmap(pause_xpm), TR("Pause calculation"), Wnd);
+               a = new QAction(QPixmap(pause_xpm), _("Pause calculation"), Wnd);
                a->setCheckable(true);
                Wnd->connect(a, SIGNAL(toggled(bool)), QMGL, SLOT(setPause(bool)));
                Wnd->connect(QMGL, SIGNAL(pauseChanged(bool)), a, SLOT(setChecked(bool)));
 //             Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(setPause()));
-               a->setToolTip(TR("Pause on/off calculations."));
+               a->setToolTip(_("Pause on/off external calculations"));
                f->addSeparator();      f->addAction(a);        bb->addAction(a);
        }
 #endif
 
        Wnd->menuBar()->addSeparator();
-       o = Wnd->menuBar()->addMenu(TR("&Help"));
-       o->addAction(TR("About"), QMGL, SLOT(about()));
-       o->addAction(TR("About &Qt"), QMGL, SLOT(aboutQt()));
+       o = Wnd->menuBar()->addMenu(_("Help"));
+       o->addAction(_("About"), QMGL, SLOT(about()));
+       o->addAction(_("About Qt"), QMGL, SLOT(aboutQt()));
        return popup;
 }
 //-----------------------------------------------------------------------------
@@ -1324,6 +1285,11 @@ HMGL MGL_EXPORT mgl_create_graph_qt(int (*draw)(HMGL gr, void *p), const char *t
        g->Window(0,0,draw,title,par,load);
        return g;
 }
+void* mgl_qt_widget(HMGL gr)
+{
+       mglCanvasQT *g = dynamic_cast<mglCanvasQT *>(gr);
+       return g?g->QMGL:NULL;
+}
 int MGL_EXPORT mgl_qt_run()    {       return (qApp)?qApp->exec():-1;  }
 //-----------------------------------------------------------------------------
 uintptr_t MGL_EXPORT mgl_create_graph_qt_(const char *title, int l)
index 569f931143e84c871420a1c1c0a96e25d2d601f3..5ed58685fd434d620393443d6516fae3af9889ae 100644 (file)
@@ -1,29 +1,22 @@
 include(GenerateExportHeader)
-add_compiler_export_flags()
 
 if(enable-qt4)
-       include(../../cmake-qt4.txt)
+       include(../../scripts/qt4.cmake)
        set(MGL_QT4_FILES ../qt.cpp ../../include/mgl2/qt.h ../../include/mgl2/qmathgl.h)
        mgl_add_lib(qt4 ${MGL_QT4_FILES})
-       qt4_use_modules(mgl-qt4 ${MGL_QT4_LIBS})
-       qt4_use_modules(mgl-qt4-static ${MGL_QT4_LIBS})
-       target_link_libraries(mgl-qt4 mgl)
-       target_link_libraries(mgl-qt4-static mgl)
-       if(NOT enable-qt5asqt)
+       target_link_libraries(mgl-qt4 mgl ${MGL_QT4_LIBS})
+       target_link_libraries(mgl-qt4-static mgl-static ${MGL_QT4_LIBS})
+       if(enable-qt4asqt)
                mgl_add_lib(qt ${MGL_QT4_FILES})
-               qt4_use_modules(mgl-qt ${MGL_QT4_LIBS})
-               qt4_use_modules(mgl-qt-static ${MGL_QT4_LIBS})
-               target_link_libraries(mgl-qt mgl)
-               target_link_libraries(mgl-qt-static mgl)
-       endif(NOT enable-qt5asqt)
+               target_link_libraries(mgl-qt mgl ${MGL_QT4_LIBS})
+               target_link_libraries(mgl-qt-static mgl-static ${MGL_QT4_LIBS})
+       endif(enable-qt4asqt)
 
        if(MGL_HAVE_FLTK AND NOT enable-qt5)
-               mgl_add_lib(wnd ${MGL_QT4_FILES} ../fltk.cpp ../../include/mgl2/fltk.h)
+               mgl_add_lib(wnd ${MGL_QT4_FILES} ../fltk.cpp ../../include/mgl2/fltk.h ../image.cpp ../image.h)
                target_include_directories(mgl-wnd SYSTEM PUBLIC ${FLTK_INCLUDE_DIR})
                target_include_directories(mgl-wnd-static SYSTEM PUBLIC ${FLTK_INCLUDE_DIR})
-               qt4_use_modules(mgl-wnd ${MGL_QT4_LIBS})
-               qt4_use_modules(mgl-wnd-static ${MGL_QT4_LIBS})
-               target_link_libraries(mgl-wnd mgl ${FLTK_LIBRARIES})
-               target_link_libraries(mgl-wnd-static mgl ${FLTK_LIBRARIES})
+               target_link_libraries(mgl-wnd mgl ${FLTK_LIBRARIES} ${MGL_QT4_LIBS})
+               target_link_libraries(mgl-wnd-static mgl-static ${FLTK_LIBRARIES} ${MGL_QT4_LIBS})
        endif(MGL_HAVE_FLTK AND  NOT enable-qt5)
 endif(enable-qt4)
index dcc30e53ebde5e4e48c12a32042627a2cd18914b..5c5bbd79d9499ba46460f2c7fd032dd65a49fa3a 100644 (file)
@@ -1,28 +1,21 @@
 include(GenerateExportHeader)
-add_compiler_export_flags()
 
 if(enable-qt5)
-       include(../../cmake-qt5.txt)
+       include(../../scripts/qt5.cmake)
        set(MGL_QT5_FILES ../qt.cpp ../../include/mgl2/qt.h ../../include/mgl2/qmathgl.h)
        mgl_add_lib(qt5 ${MGL_QT5_FILES})
-       qt5_use_modules(mgl-qt5 ${MGL_QT5_LIBS})
-       qt5_use_modules(mgl-qt5-static ${MGL_QT5_LIBS})
-       target_link_libraries(mgl-qt5 mgl)
-       target_link_libraries(mgl-qt5-static mgl)
+       target_link_libraries(mgl-qt5 mgl ${MGL_QT5_LIBS})
+       target_link_libraries(mgl-qt5-static mgl-static ${MGL_QT5_LIBS})
        if(enable-qt5asqt)
                mgl_add_lib(qt ${MGL_QT5_FILES})
-               qt5_use_modules(mgl-qt ${MGL_QT5_LIBS})
-               qt5_use_modules(mgl-qt-static ${MGL_QT5_LIBS})
-               target_link_libraries(mgl-qt mgl)
-               target_link_libraries(mgl-qt-static mgl)
+               target_link_libraries(mgl-qt mgl ${MGL_QT5_LIBS})
+               target_link_libraries(mgl-qt-static mgl-static ${MGL_QT5_LIBS})
        endif(enable-qt5asqt)
        if(MGL_HAVE_FLTK)
-               mgl_add_lib(wnd ${MGL_QT5_FILES} ../fltk.cpp ../../include/mgl2/fltk.h)
+               mgl_add_lib(wnd ${MGL_QT5_FILES} ../fltk.cpp ../../include/mgl2/fltk.h ../image.cpp ../image.h)
                target_include_directories(mgl-wnd SYSTEM PUBLIC ${FLTK_INCLUDE_DIR})
                target_include_directories(mgl-wnd-static SYSTEM PUBLIC ${FLTK_INCLUDE_DIR})
-               qt5_use_modules(mgl-wnd ${MGL_QT5_LIBS})
-               qt5_use_modules(mgl-wnd-static ${MGL_QT5_LIBS})
-               target_link_libraries(mgl-wnd mgl ${FLTK_LIBRARIES})
-               target_link_libraries(mgl-wnd-static mgl ${FLTK_LIBRARIES})
+               target_link_libraries(mgl-wnd mgl ${FLTK_LIBRARIES} ${MGL_QT5_LIBS})
+               target_link_libraries(mgl-wnd-static mgl-static ${FLTK_LIBRARIES} ${MGL_QT5_LIBS})
        endif(MGL_HAVE_FLTK)
 endif(enable-qt5)
index b36401067d3ad230b56c1aeb6a4bf84aa6dabd6c..2a3988ef94226b1a7e225ef20927959b973cd336 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************\r
  * wx.cpp is part of Math Graphic Library                              *\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
+ * Copyright (C) 2007-2016 Alexey Balakin <mathgl.abalakin@gmail.ru>       *\r
  *                                                                         *\r
  *   This program is free software; you can redistribute it and/or modify  *\r
  *   it under the terms of the GNU Library General Public License as       *\r
@@ -25,6 +25,8 @@
 #include <wx/menu.h>\r
 #include <wx/scrolwin.h>\r
 \r
+#undef _\r
+\r
 #include "mgl2/canvas_wnd.h"\r
 #include "mgl2/wx.h"\r
 //-----------------------------------------------------------------------------\r
@@ -87,8 +89,8 @@ END_EVENT_TABLE()
 wxMathGL::wxMathGL(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name) : wxWindow(parent,id,pos,size,style,name)\r
 {\r
        AutoResize = false;     draw_par = 0;   draw_func = 0;\r
-       gr = new mglCanvas;     popup = 0;\r
-       phi = tet = per = 0;\r
+       gr = new mglCanvas;     popup = 0;              draw_cl = 0;\r
+       phi = tet = per = 0;    x0=y0=xe=ye=0;\r
        x1 = y1 = 0;    x2 = y2 = 1;\r
        alpha = light = zoom = rotate = false;\r
 //     SetSize(600, 400);\r
@@ -191,7 +193,7 @@ void wxMathGL::Update()
        if(draw_func || draw_cl)\r
        {\r
                if(mgl_get_flag(gr,MGL_CLF_ON_UPD))     mgl_set_def_param(gr);\r
-               mgl_reset_frames(gr);\r
+               mgl_set_def_param(gr);          mgl_reset_frames(gr);\r
                mgl_set_alpha(gr,alpha);        mgl_set_light(gr,light);\r
                if(draw_func)   draw_func(gr, draw_par);        // drawing itself\r
                else    if(draw_cl)     {       mglGraph g(gr); draw_cl->Draw(&g);      }\r
@@ -202,6 +204,12 @@ void wxMathGL::Update()
                        dlg.ShowModal();\r
                }\r
        }\r
+       else if(mgl_get_num_frame(gr)>0)\r
+       {\r
+               mgl_set_alpha(gr,alpha);        mgl_set_light(gr,light);\r
+//             mgl_zoom(gr,x1,y1,x2,y2);       mgl_view(gr,-phi,-tet,0);\r
+               mgl_get_frame(gr,0);\r
+       }\r
        MousePos.Empty();       Repaint();\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -273,8 +281,10 @@ void wxMathGL::OnMouseMove(wxMouseEvent &ev)
                        mreal ff = 240/sqrt(mreal(w*h));\r
                        phi += int((x0-xe)*ff);\r
                        tet += int((y0-ye)*ff);\r
-                       if(phi>180)     phi-=360;               if(phi<-180)    phi+=360;\r
-                       if(tet>180)     tet-=360;               if(tet<-180)    tet+=360;\r
+                       if(phi>180)             phi-=360;\r
+                       if(phi<-180)    phi+=360;\r
+                       if(tet>180)             tet-=360;\r
+                       if(tet<-180)    tet+=360;\r
 //                     Update();\r
                }\r
                if(ev.ButtonDown(wxMOUSE_BTN_RIGHT))    // zoom and perspective\r
@@ -284,7 +294,8 @@ void wxMathGL::OnMouseMove(wxMouseEvent &ev)
                        x1 = cx+(x1-cx)*exp(-ff);       x2 = cx+(x2-cx)*exp(-ff);\r
                        y1 = cy+(y1-cy)*exp(-ff);       y2 = cy+(y2-cy)*exp(-ff);\r
                        per = per + gg;\r
-                       if(per<0)       per = 0;        if(per>=1)      per = 0.9999;\r
+                       if(per<0)       per = 0;\r
+                       if(per>=1)      per = 0.9999;\r
 //                     Update();\r
                }\r
                if(ev.ButtonDown(wxMOUSE_BTN_MIDDLE))   // shift\r
@@ -313,7 +324,7 @@ const char *mglw_str(const wxString &str)
 {\r
        static char *buf=0;\r
        if(buf) delete []buf;\r
-       long i, n=str.Len();\r
+       size_t i, n=str.Len();\r
        buf = new char[n+1];    buf[n]=0;\r
        for(i=0;i<n;i++)        buf[i] = str.GetChar(i);\r
        return buf;\r
@@ -345,11 +356,7 @@ void wxMathGL::ExportBPS(wxString fname)
        if(fname.IsEmpty())     fname = ScriptName;\r
        if(fname.IsEmpty())     wxMessageBox(appName, wxT("No filename."),wxOK|wxICON_ERROR ,this);\r
        else\r
-       {\r
-               setlocale(LC_ALL, "C");\r
                mgl_write_bps(gr,mglw_str(mglSetExtension(fname,"eps")), mglw_str(appName));\r
-               setlocale(LC_ALL, "");\r
-       }\r
 }\r
 //-----------------------------------------------------------------------------\r
 void wxMathGL::ExportEPS(wxString fname)\r
@@ -357,11 +364,7 @@ void wxMathGL::ExportEPS(wxString fname)
        if(fname.IsEmpty())     fname = ScriptName;\r
        if(fname.IsEmpty())     wxMessageBox(appName, wxT("No filename."),wxOK|wxICON_ERROR ,this);\r
        else\r
-       {\r
-               setlocale(LC_ALL, "C");\r
                mgl_write_eps(gr,mglw_str(mglSetExtension(fname,"eps")), mglw_str(appName));\r
-               setlocale(LC_ALL, "");\r
-       }\r
 }\r
 //-----------------------------------------------------------------------------\r
 void wxMathGL::ExportSVG(wxString fname)\r
@@ -369,11 +372,7 @@ void wxMathGL::ExportSVG(wxString fname)
        if(fname.IsEmpty())     fname = ScriptName;\r
        if(fname.IsEmpty())     wxMessageBox(appName, wxT("No filename."),wxOK|wxICON_ERROR ,this);\r
        else\r
-       {\r
-               setlocale(LC_ALL, "C");\r
                mgl_write_svg(gr,mglw_str(mglSetExtension(fname,"eps")), mglw_str(appName));\r
-               setlocale(LC_ALL, "");\r
-       }\r
 }\r
 //-----------------------------------------------------------------------------\r
 void wxMathGL::Copy()\r