New upstream version 2.4.2
authorDimitrios Eftaxiopoulos <eftaxi12@otenet.gr>
Sun, 25 Mar 2018 23:51:14 +0000 (02:51 +0300)
committerDimitrios Eftaxiopoulos <eftaxi12@otenet.gr>
Sun, 25 Mar 2018 23:51:14 +0000 (02:51 +0300)
437 files changed:
CMakeLists.txt
ChangeLog.txt
FindMathGL2.cmake [deleted file]
addons/getopt/getopt.c
ads.txt [new file with mode: 0644]
cmake-qt4.txt [deleted file]
cmake-qt5.txt [deleted file]
emblem.mgl
examples/CMakeLists.txt
examples/Equirectangular-projection.jpg [new file with mode: 0644]
examples/fltk_example.cpp
examples/full_test.cpp
examples/glut_example.cpp
examples/iris.dat [new file with mode: 0644]
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
include/CMakeLists.txt
include/build.h.in [new file with mode: 0644]
include/config.h.in
include/mgl2/Fl_MathGL.h
include/mgl2/abstract.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/fltk.h
include/mgl2/font.h
include/mgl2/mgl.h
include/mgl2/opengl.h
include/mgl2/parser.h
include/mgl2/pde.h
include/mgl2/prim.h
include/mgl2/qmathgl.h
include/mgl2/surf.h
include/mgl2/type.h
include/mgl2/vect.h
include/mgl2/wnd.h
include/mgl2/wx.h
json/Backend.cpp
json/CMakeLists.txt
lang/CMakeLists.txt
lang/data.i
lang/mathgl.i
lang/mgl.i
lang/type.i
mathgl-2x.cbp
mathgl_en.po [new file with mode: 0644]
mathgl_es.po [new file with mode: 0644]
mathgl_ru.po [new file with mode: 0644]
mgllab/CMakeLists.txt [new file with mode: 0644]
mgllab/dialogs.cpp [new file with mode: 0644]
mgllab/editor.cpp [new file with mode: 0644]
mgllab/fltk_test.fl [new file with mode: 0644]
mgllab/grid.cpp [new file with mode: 0644]
mgllab/help.cpp [new file with mode: 0644]
mgllab/mathgl.cpp [new file with mode: 0644]
mgllab/mgl.xml.in [new file with mode: 0644]
mgllab/mgllab.cpp [new file with mode: 0644]
mgllab/mgllab.desktop [new file with mode: 0755]
mgllab/mgllab.h [new file with mode: 0644]
mgllab/mgllab.rc [new file with mode: 0644]
mgllab/table.cpp [new file with mode: 0644]
mgllab/todo.txt [new file with mode: 0644]
mgllab/udav.ico [new file with mode: 0644]
mgllab/udav.png [new file with mode: 0644]
mgllab/udav48.ico [new file with mode: 0644]
mgllab/xpm/accessories-calculator.xpm [new file with mode: 0644]
mgllab/xpm/alpha.xpm [new file with mode: 0644]
mgllab/xpm/arc.xpm [new file with mode: 0644]
mgllab/xpm/arrow-down-double.xpm [new file with mode: 0644]
mgllab/xpm/arrow-down.xpm [new file with mode: 0644]
mgllab/xpm/arrow-left-double.xpm [new file with mode: 0644]
mgllab/xpm/arrow-left.xpm [new file with mode: 0644]
mgllab/xpm/arrow-right-double.xpm [new file with mode: 0644]
mgllab/xpm/arrow-right.xpm [new file with mode: 0644]
mgllab/xpm/arrow-up-double.xpm [new file with mode: 0644]
mgllab/xpm/arrow-up.xpm [new file with mode: 0644]
mgllab/xpm/arrow_a.xpm [new file with mode: 0644]
mgllab/xpm/arrow_d.xpm [new file with mode: 0644]
mgllab/xpm/arrow_i.xpm [new file with mode: 0644]
mgllab/xpm/arrow_k.xpm [new file with mode: 0644]
mgllab/xpm/arrow_n.xpm [new file with mode: 0644]
mgllab/xpm/arrow_o.xpm [new file with mode: 0644]
mgllab/xpm/arrow_s.xpm [new file with mode: 0644]
mgllab/xpm/arrow_t.xpm [new file with mode: 0644]
mgllab/xpm/arrow_v.xpm [new file with mode: 0644]
mgllab/xpm/axis.xpm [new file with mode: 0644]
mgllab/xpm/axis_sh.xpm [new file with mode: 0644]
mgllab/xpm/barrow_a.xpm [new file with mode: 0644]
mgllab/xpm/barrow_d.xpm [new file with mode: 0644]
mgllab/xpm/barrow_i.xpm [new file with mode: 0644]
mgllab/xpm/barrow_k.xpm [new file with mode: 0644]
mgllab/xpm/barrow_n.xpm [new file with mode: 0644]
mgllab/xpm/barrow_o.xpm [new file with mode: 0644]
mgllab/xpm/barrow_s.xpm [new file with mode: 0644]
mgllab/xpm/barrow_t.xpm [new file with mode: 0644]
mgllab/xpm/barrow_v.xpm [new file with mode: 0644]
mgllab/xpm/box.xpm [new file with mode: 0644]
mgllab/xpm/comment.xpm [new file with mode: 0644]
mgllab/xpm/cons.xpm [new file with mode: 0644]
mgllab/xpm/copy.xpm [new file with mode: 0644]
mgllab/xpm/crop.xpm [new file with mode: 0644]
mgllab/xpm/curve.xpm [new file with mode: 0644]
mgllab/xpm/dash_d.xpm [new file with mode: 0644]
mgllab/xpm/dash_e.xpm [new file with mode: 0644]
mgllab/xpm/dash_i.xpm [new file with mode: 0644]
mgllab/xpm/dash_j.xpm [new file with mode: 0644]
mgllab/xpm/dash_l.xpm [new file with mode: 0644]
mgllab/xpm/dash_m.xpm [new file with mode: 0644]
mgllab/xpm/dash_s.xpm [new file with mode: 0644]
mgllab/xpm/delete.xpm [new file with mode: 0644]
mgllab/xpm/dialog-information.xpm [new file with mode: 0644]
mgllab/xpm/diff.xpm [new file with mode: 0644]
mgllab/xpm/diff2.xpm [new file with mode: 0644]
mgllab/xpm/document-export.xpm [new file with mode: 0644]
mgllab/xpm/document-import.xpm [new file with mode: 0644]
mgllab/xpm/document-new.xpm [new file with mode: 0644]
mgllab/xpm/document-open-folder.xpm [new file with mode: 0644]
mgllab/xpm/document-open.xpm [new file with mode: 0644]
mgllab/xpm/document-print.xpm [new file with mode: 0644]
mgllab/xpm/document-properties.xpm [new file with mode: 0644]
mgllab/xpm/document-revert.xpm [new file with mode: 0644]
mgllab/xpm/document-save.xpm [new file with mode: 0644]
mgllab/xpm/down_1.xpm [new file with mode: 0644]
mgllab/xpm/edit-clear.xpm [new file with mode: 0644]
mgllab/xpm/edit-copy.xpm [new file with mode: 0644]
mgllab/xpm/edit-cut.xpm [new file with mode: 0644]
mgllab/xpm/edit-delete.xpm [new file with mode: 0644]
mgllab/xpm/edit-find.xpm [new file with mode: 0644]
mgllab/xpm/edit-paste.xpm [new file with mode: 0644]
mgllab/xpm/edit-redo.xpm [new file with mode: 0644]
mgllab/xpm/edit-select-all.xpm [new file with mode: 0644]
mgllab/xpm/edit-undo.xpm [new file with mode: 0644]
mgllab/xpm/edit_xpm [new file with mode: 0755]
mgllab/xpm/fileprint.xpm [new file with mode: 0644]
mgllab/xpm/first.xpm [new file with mode: 0644]
mgllab/xpm/folder.xpm [new file with mode: 0644]
mgllab/xpm/format-indent-more.xpm [new file with mode: 0644]
mgllab/xpm/format-stroke-color.xpm [new file with mode: 0644]
mgllab/xpm/func.xpm [new file with mode: 0644]
mgllab/xpm/go-bottom.xpm [new file with mode: 0644]
mgllab/xpm/go-down.xpm [new file with mode: 0644]
mgllab/xpm/go-first-view.xpm [new file with mode: 0644]
mgllab/xpm/go-first.xpm [new file with mode: 0644]
mgllab/xpm/go-jump-locationbar.xpm [new file with mode: 0644]
mgllab/xpm/go-last-view.xpm [new file with mode: 0644]
mgllab/xpm/go-last.xpm [new file with mode: 0644]
mgllab/xpm/go-next-view-page.xpm [new file with mode: 0644]
mgllab/xpm/go-next-view.xpm [new file with mode: 0644]
mgllab/xpm/go-next.xpm [new file with mode: 0644]
mgllab/xpm/go-previous-view-page.xpm [new file with mode: 0644]
mgllab/xpm/go-previous-view.xpm [new file with mode: 0644]
mgllab/xpm/go-previous.xpm [new file with mode: 0644]
mgllab/xpm/go-top.xpm [new file with mode: 0644]
mgllab/xpm/go-up.xpm [new file with mode: 0644]
mgllab/xpm/help-contents.xpm [new file with mode: 0644]
mgllab/xpm/help-faq.xpm [new file with mode: 0644]
mgllab/xpm/hist.xpm [new file with mode: 0644]
mgllab/xpm/insert.xpm [new file with mode: 0644]
mgllab/xpm/integr.xpm [new file with mode: 0644]
mgllab/xpm/last.xpm [new file with mode: 0644]
mgllab/xpm/layer-visible-off.xpm [new file with mode: 0644]
mgllab/xpm/layer-visible-on.xpm [new file with mode: 0644]
mgllab/xpm/left_1.xpm [new file with mode: 0644]
mgllab/xpm/light.xpm [new file with mode: 0644]
mgllab/xpm/line.xpm [new file with mode: 0644]
mgllab/xpm/list-add.xpm [new file with mode: 0644]
mgllab/xpm/list-remove.xpm [new file with mode: 0644]
mgllab/xpm/mark_.xpm [new file with mode: 0644]
mgllab/xpm/mark_a.xpm [new file with mode: 0644]
mgllab/xpm/mark_cf.xpm [new file with mode: 0644]
mgllab/xpm/mark_d.xpm [new file with mode: 0644]
mgllab/xpm/mark_df.xpm [new file with mode: 0644]
mgllab/xpm/mark_l.xpm [new file with mode: 0644]
mgllab/xpm/mark_lf.xpm [new file with mode: 0644]
mgllab/xpm/mark_n.xpm [new file with mode: 0644]
mgllab/xpm/mark_o.xpm [new file with mode: 0644]
mgllab/xpm/mark_of.xpm [new file with mode: 0644]
mgllab/xpm/mark_p.xpm [new file with mode: 0644]
mgllab/xpm/mark_pf.xpm [new file with mode: 0644]
mgllab/xpm/mark_r.xpm [new file with mode: 0644]
mgllab/xpm/mark_rf.xpm [new file with mode: 0644]
mgllab/xpm/mark_s.xpm [new file with mode: 0644]
mgllab/xpm/mark_sf.xpm [new file with mode: 0644]
mgllab/xpm/mark_t.xpm [new file with mode: 0644]
mgllab/xpm/mark_tf.xpm [new file with mode: 0644]
mgllab/xpm/mark_v.xpm [new file with mode: 0644]
mgllab/xpm/mark_vf.xpm [new file with mode: 0644]
mgllab/xpm/mark_x.xpm [new file with mode: 0644]
mgllab/xpm/mark_y.xpm [new file with mode: 0644]
mgllab/xpm/mask_a.xpm [new file with mode: 0644]
mgllab/xpm/mask_d.xpm [new file with mode: 0644]
mgllab/xpm/mask_d_.xpm [new file with mode: 0644]
mgllab/xpm/mask_e.xpm [new file with mode: 0644]
mgllab/xpm/mask_i.xpm [new file with mode: 0644]
mgllab/xpm/mask_j.xpm [new file with mode: 0644]
mgllab/xpm/mask_l.xpm [new file with mode: 0644]
mgllab/xpm/mask_m.xpm [new file with mode: 0644]
mgllab/xpm/mask_o.xpm [new file with mode: 0644]
mgllab/xpm/mask_o_.xpm [new file with mode: 0644]
mgllab/xpm/mask_p.xpm [new file with mode: 0644]
mgllab/xpm/mask_r.xpm [new file with mode: 0644]
mgllab/xpm/mask_s.xpm [new file with mode: 0644]
mgllab/xpm/mask_s_.xpm [new file with mode: 0644]
mgllab/xpm/mask_t.xpm [new file with mode: 0644]
mgllab/xpm/mask_u.xpm [new file with mode: 0644]
mgllab/xpm/media-playback-start.xpm [new file with mode: 0644]
mgllab/xpm/media-seek-backward.xpm [new file with mode: 0644]
mgllab/xpm/media-seek-forward.xpm [new file with mode: 0644]
mgllab/xpm/next.xpm [new file with mode: 0644]
mgllab/xpm/next_sl.xpm [new file with mode: 0644]
mgllab/xpm/none.xpm [new file with mode: 0644]
mgllab/xpm/norm_1.xpm [new file with mode: 0644]
mgllab/xpm/object-group.xpm [new file with mode: 0644]
mgllab/xpm/object-order-lower.xpm [new file with mode: 0644]
mgllab/xpm/object-order-raise.xpm [new file with mode: 0644]
mgllab/xpm/object-rotate-down.xpm [new file with mode: 0644]
mgllab/xpm/object-rotate-left.xpm [new file with mode: 0644]
mgllab/xpm/object-rotate-right.xpm [new file with mode: 0644]
mgllab/xpm/object-rotate-up.xpm [new file with mode: 0644]
mgllab/xpm/object-ungroup.xpm [new file with mode: 0644]
mgllab/xpm/office-chart-bar.xpm [new file with mode: 0644]
mgllab/xpm/office-chart-line.xpm [new file with mode: 0644]
mgllab/xpm/office-chart-scatter.xpm [new file with mode: 0644]
mgllab/xpm/ok.xpm [new file with mode: 0644]
mgllab/xpm/oper.xpm [new file with mode: 0644]
mgllab/xpm/oper_a.xpm [new file with mode: 0644]
mgllab/xpm/oper_d.xpm [new file with mode: 0644]
mgllab/xpm/oper_dir.xpm [new file with mode: 0644]
mgllab/xpm/oper_m.xpm [new file with mode: 0644]
mgllab/xpm/oper_of.xpm [new file with mode: 0644]
mgllab/xpm/oper_s.xpm [new file with mode: 0644]
mgllab/xpm/option.xpm [new file with mode: 0644]
mgllab/xpm/other.xpm [new file with mode: 0644]
mgllab/xpm/package-x-generic.xpm [new file with mode: 0644]
mgllab/xpm/pause.xpm [new file with mode: 0644]
mgllab/xpm/plot.xpm [new file with mode: 0644]
mgllab/xpm/polygon.xpm [new file with mode: 0644]
mgllab/xpm/preferences-system.xpm [new file with mode: 0644]
mgllab/xpm/prev_sl.xpm [new file with mode: 0644]
mgllab/xpm/preview.xpm [new file with mode: 0644]
mgllab/xpm/process-stop.xpm [new file with mode: 0644]
mgllab/xpm/right_1.xpm [new file with mode: 0644]
mgllab/xpm/rotate.xpm [new file with mode: 0644]
mgllab/xpm/show_sl.xpm [new file with mode: 0644]
mgllab/xpm/size.xpm [new file with mode: 0644]
mgllab/xpm/squize.xpm [new file with mode: 0644]
mgllab/xpm/stop.xpm [new file with mode: 0644]
mgllab/xpm/style.xpm [new file with mode: 0644]
mgllab/xpm/system-file-manager.xpm [new file with mode: 0644]
mgllab/xpm/tab-close.xpm [new file with mode: 0644]
mgllab/xpm/table.xpm [new file with mode: 0644]
mgllab/xpm/text-csv.xpm [new file with mode: 0644]
mgllab/xpm/text-field.xpm [new file with mode: 0644]
mgllab/xpm/text-plain.xpm [new file with mode: 0644]
mgllab/xpm/text-x-generic.xpm [new file with mode: 0644]
mgllab/xpm/text.xpm [new file with mode: 0644]
mgllab/xpm/tiles.xpm [new file with mode: 0644]
mgllab/xpm/tools-wizard.xpm [new file with mode: 0644]
mgllab/xpm/tran.xpm [new file with mode: 0644]
mgllab/xpm/transform-crop.xpm [new file with mode: 0644]
mgllab/xpm/transform-move.xpm [new file with mode: 0644]
mgllab/xpm/transform-rotate.xpm [new file with mode: 0644]
mgllab/xpm/transform-scale.xpm [new file with mode: 0644]
mgllab/xpm/udav.xpm [new file with mode: 0644]
mgllab/xpm/unused/smth.xpm [new file with mode: 0644]
mgllab/xpm/unused/sum.xpm [new file with mode: 0644]
mgllab/xpm/unused/swap.xpm [new file with mode: 0644]
mgllab/xpm/up_1.xpm [new file with mode: 0644]
mgllab/xpm/update.xpm [new file with mode: 0644]
mgllab/xpm/vect.xpm [new file with mode: 0644]
mgllab/xpm/view-filter.xpm [new file with mode: 0644]
mgllab/xpm/view-fullscreen.xpm [new file with mode: 0644]
mgllab/xpm/view-grid.xpm [new file with mode: 0644]
mgllab/xpm/view-group.xpm [new file with mode: 0644]
mgllab/xpm/view-refresh.xpm [new file with mode: 0644]
mgllab/xpm/weather-clear.xpm [new file with mode: 0644]
mgllab/xpm/weather-clear_old.xpm [new file with mode: 0644]
mgllab/xpm/weather-clouds.xpm [new file with mode: 0644]
mgllab/xpm/window.xpm [new file with mode: 0644]
mgllab/xpm/wire.xpm [new file with mode: 0644]
mgllab/xpm/zoom-draw.xpm [new file with mode: 0644]
mgllab/xpm/zoom-in.xpm [new file with mode: 0644]
mgllab/xpm/zoom-original.xpm [new file with mode: 0644]
mgllab/xpm/zoom-out.xpm [new file with mode: 0644]
mgllab/xpm/zoom_1.xpm [new file with mode: 0644]
mgllab/xpm/zoom_in.xpm [new file with mode: 0644]
mgllab/xpm/zoom_out.xpm [new file with mode: 0644]
mgltex/CMakeLists.txt
scripts/CMakeLists.txt [new file with mode: 0644]
scripts/CodeCoverage.cmake [new file with mode: 0644]
scripts/FindMathGL2.cmake [new file with mode: 0644]
scripts/MathGLConfig.cmake.in [new file with mode: 0644]
scripts/MathGLConfigVersion.cmake.in [new file with mode: 0644]
scripts/install-deps.cmake [new file with mode: 0644]
scripts/qt4.cmake [new file with mode: 0644]
scripts/qt5.cmake [new file with mode: 0644]
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/exec_dat.cpp [new file with mode: 0644]
src/exec_gr.cpp [new file with mode: 0644]
src/exec_prm.cpp [new file with mode: 0644]
src/exec_set.cpp [new file with mode: 0644]
src/export.cpp
src/export_2d.cpp
src/export_3d.cpp
src/fft.cpp
src/fit.cpp
src/font.cpp
src/fractal.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/pixel_gen.cpp [new file with mode: 0644]
src/pixel_pix.cpp [new file with mode: 0644]
src/plot.cpp
src/prc.cpp
src/prc/oPRCFile.cc
src/prc/writePRC.h
src/prim.cpp
src/surf.cpp
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/doc_en.texi
texinfo/doc_ru.texi
texinfo/ex_mgl_en.texi
texinfo/ex_mgl_ru.texi
texinfo/example_en.texi
texinfo/example_ru.texi
texinfo/mathgl_en.texi
texinfo/mathgl_ru.texi
texinfo/mgl_en.texi
texinfo/mgl_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.texi.in
texinfo/version_hist.txt
texinfo/web_en.texi
texinfo/web_ru.texi
texinfo/widget_en.texi
texinfo/widget_ru.texi
todo.txt
translations/mathgl_en.mo [new file with mode: 0644]
translations/mathgl_es.mo [new file with mode: 0644]
translations/mathgl_ru.mo [new file with mode: 0644]
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/find_dlg.cpp
udav/help_pnl.cpp
udav/hint_dlg.cpp
udav/info_dlg.cpp
udav/mem_pnl.cpp
udav/newcmd_dlg.cpp
udav/open_dlg.cpp
udav/opt_dlg.cpp
udav/plot_pnl.cpp
udav/prop_dlg.cpp
udav/qmglsyntax.cpp
udav/setup_dlg.cpp
udav/style_dlg.cpp
udav/style_dlg.h
udav/subplot_dlg.cpp
udav/text_pnl.cpp
udav/udav_wnd.cpp
utils/CMakeLists.txt
utils/mglcgi.cpp
utils/mglconv.cpp
utils/mglview.cpp
widgets/CMakeLists.txt
widgets/fltk.cpp
widgets/glut.cpp
widgets/image.cpp [new file with mode: 0644]
widgets/image.h [new file with mode: 0644]
widgets/qt.cpp
widgets/qt4/CMakeLists.txt
widgets/qt5/CMakeLists.txt
widgets/wx.cpp

index df67e618be1e9f3d7cd2cc9b08b26c304992a311..a2a3ab3384206fddf1192e2ab95f834d10a0dfc1 100644 (file)
@@ -1,11 +1,16 @@
-cmake_minimum_required(VERSION 2.8.12)
+cmake_minimum_required(VERSION 3.1.0)
 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)
+
+#add_definitions(-DZLIB_WINAPI)
+set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${MathGL2_SOURCE_DIR}/scripts)
 
 if(NOT CMAKE_BUILD_TYPE)
        set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are:
@@ -14,8 +19,49 @@ endif(NOT CMAKE_BUILD_TYPE)
 
 set(CMAKE_VERBOSE_MAKEFILE ON)
 set(MathGL_VERSION_MAJOR 2)
-set(MathGL_VERSION_MINOR 3.5)
-set(MathGL_SOVERSION 7.4.3)
+set(MathGL_VERSION_MINOR 4)
+set(MathGL_PATCH_VERSION 2)
+set(MathGL_VERSION ${MathGL_VERSION_MAJOR}.${MathGL_VERSION_MINOR}.${MathGL_PATCH_VERSION})
+set(MathGL_SOVERSION 7.5.0)
+string(TIMESTAMP MathGL_DATE UTC)
+
+if(CMAKE_BUILD_TYPE STREQUAL "Debug")
+       option(enable-lcov "Enable coverage." OFF)
+       if(enable-lcov)
+               include(CodeCoverage)
+               APPEND_COVERAGE_COMPILER_FLAGS()
+       endif(enable-lcov)
+else(CMAKE_BUILD_TYPE STREQUAL "Debug")
+       unset(enable-lcov CACHE)
+endif(CMAKE_BUILD_TYPE STREQUAL "Debug")
+
+#set(CMAKE_CXX_OUTPUT_EXTENSION_REPLACE 1)
+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)
@@ -57,9 +103,10 @@ function(mgl_add_lib mgl_tmp_lib)
 
        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)
 
@@ -106,9 +153,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)
@@ -119,7 +169,11 @@ option(enable-all-widgets "Enable all Widgets")
 option(enable-all-swig "Enable all SWIG based interfaces")
 option(enable-rvalue "Enable move constructor support (need C++11)" OFF)
 option(enable-pthread "Enable POSIX threads support" OFF)
-option(enable-pthr-widget "Enable POSIX threads for widgets" ON)
+if(MSVC)
+       option(enable-pthr-widget "Enable POSIX threads for widgets" OFF)
+else(MSVC)
+       option(enable-pthr-widget "Enable POSIX threads for widgets" ON)
+endif(MSVC)
 option(enable-openmp "Enable OpenMP support" ON)
 
 if(enable-pthread AND enable-openmp)
@@ -129,13 +183,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)
 
@@ -161,6 +216,19 @@ if(MSVC AND MSVC_VERSION GREATER 1899)
        SET(CMAKE_C_FLAGS "-D_CRT_STDIO_ISO_WIDE_SPECIFIERS ${CMAKE_C_FLAGS}")
 endif(MSVC AND MSVC_VERSION GREATER 1899)
 
+include(CheckCXXSourceCompiles)
+
+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)
        if(enable-qt4asqt AND enable-qt5asqt)
@@ -177,15 +245,17 @@ if(enable-qt4 OR enable-qt5)
 #      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_CGI_PATH_INSTALL "share/mathgl" CACHE STRING "Set CGI install directory")
+set(MGL_CGI_PATH "${CMAKE_INSTALL_PREFIX}/${MGL_CGI_PATH_INSTALL}")
 set(MGL_DEF_FONT "STIX" CACHE STRING "Set default font name")
 
 if(NOT WIN32)
@@ -230,7 +300,6 @@ endif(HAVE_MEMRCHR)
 include(CheckTypeSize)
 check_type_size("long" SIZEOF_LONG)
 
-include(CheckCXXSourceCompiles)
 #unset(MGL_HAVE_C99_COMPLEX)
 CHECK_CXX_SOURCE_COMPILES(
 "#include <complex>
@@ -261,14 +330,6 @@ if(NOT MGL_HAVE_ATTRIBUTE)
        set(MGL_HAVE_ATTRIBUTE 0)
 endif(NOT MGL_HAVE_ATTRIBUTE)
 
-unset(MGL_HAVE_TYPEOF CACHE)
-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)
@@ -290,7 +351,7 @@ CHECK_CXX_SOURCE_COMPILES(
 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(${MathGL_SOURCE_DIR}/addons/getopt)
+       include_directories(${MathGL2_SOURCE_DIR}/addons/getopt)
        set(getopt_lib-static getopt-static)
 endif(NOT MGL_HAVE_GETOPT)
 
@@ -304,20 +365,6 @@ if(enable-qt4 OR enable-qt5)
        set(MGL_HAVE_QT 1)
 endif(enable-qt4 OR enable-qt5)
 
-if(enable-openmp)
-       find_package(OpenMP)
-       if(OPENMP_FOUND)
-               set(MGL_HAVE_OMP 1)
-               set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
-               set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
-       else(OPENMP_FOUND)
-               message(SEND_ERROR "Couldn't find OpenMP. You can enable POSIX threads instead.")
-               set(MGL_HAVE_OMP 0)
-       endif(OPENMP_FOUND)
-else(enable-openmp)
-       set(MGL_HAVE_OMP 0)
-endif(enable-openmp)
-
 if(enable-mpi)
        set(MGL_HAVE_MPI 1)
        find_package(MPI REQUIRED)
@@ -328,7 +375,6 @@ else(enable-mpi)
        set(MGL_HAVE_MPI 0)
 endif(enable-mpi)
 
-
 if(enable-pthr-widget OR enable-pthread)
        if(enable-pthread)
                set(MGL_HAVE_PTHREAD 1)
@@ -336,16 +382,32 @@ if(enable-pthr-widget OR enable-pthread)
                set(MGL_HAVE_PTHREAD 0)
        endif(enable-pthread)
        set(MGL_HAVE_PTHR_WIDGET 1)
-       include(FindThreads)
+       set(CMAKE_THREAD_PREFER_PTHREAD ON)
+       set(THREADS_PREFER_PTHREAD_FLAG ON)
+       find_package(Threads REQUIRED)
        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})
+       set(MGL_DEP_LIBS Threads::Threads ${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-openmp)
+        find_package(OpenMP)
+        if(OPENMP_FOUND)
+                set(MGL_HAVE_OMP 1)
+                set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
+                set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
+        else(OPENMP_FOUND)
+                message(SEND_ERROR "Couldn't find OpenMP. You can enable POSIX threads instead.")
+                set(MGL_HAVE_OMP 0)
+        endif(OPENMP_FOUND)
+else(enable-openmp)
+        set(MGL_HAVE_OMP 0)
+endif(enable-openmp)
+
 if(enable-gsl)
        set(MGL_HAVE_GSL 1)
        find_library(GSL_LIB gsl)
@@ -362,6 +424,8 @@ if(enable-gsl)
                CHECK_CXX_SOURCE_COMPILES("#include <gsl/gsl_multifit_nlin.h>
                int main(){gsl_multifit_fdfsolver *s=0;gsl_matrix *J = 0;
                gsl_multifit_fdfsolver_jac(s, J);}" MGL_HAVE_GSL2)
+               unset(CMAKE_REQUIRED_INCLUDES)
+               unset(CMAKE_REQUIRED_LIBRARIES)
        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})
@@ -386,9 +450,9 @@ endif(enable-all OR enable-ltdl)
 
 if(enable-hdf4)
        set(MGL_HAVE_HDF4 1)
-       find_library(HDF4_LIB df)
+       find_library(HDF4_LIB NAMES df hdf)
        find_library(HDF4MF_LIB mfhdf)
-       find_path(HDF4_INCLUDE_DIR hdf/mfhdf.h)
+       find_path(HDF4_INCLUDE_DIR mfhdf.h PATH_SUFFIXES hdf)
        if(NOT HDF4_LIB OR NOT HDF4MF_LIB OR NOT HDF4_INCLUDE_DIR)
                message(SEND_ERROR "${HDF4_LIB}")
                message(SEND_ERROR "${HDF4MF_LIB}")
@@ -411,7 +475,7 @@ if(enable-hdf5)
                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_DIR})
+       include_directories(${HDF5_INCLUDE_DIRS})
 else(enable-hdf5)
        set(MGL_HAVE_HDF5 0)
 endif(enable-hdf5)
@@ -515,10 +579,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)
@@ -533,6 +605,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)
@@ -599,20 +697,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)
@@ -630,17 +728,21 @@ 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)
 add_subdirectory( utils )
 add_subdirectory( examples )
-       if(NOT WIN32)
-               add_subdirectory( fonts )
-       endif(NOT WIN32)
-#      add_subdirectory( mgllab )
+if(NOT WIN32)
+       add_subdirectory( fonts )
+endif(NOT WIN32)
+add_subdirectory( mgllab )
 endif(NOT enable-lgpl)
 
 if(NOT MSVC AND NOT BORLAND)
@@ -655,8 +757,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 c47c1765d0cc6600c81fdf16a2a9c37861ac2d22..99a53ddcbcf52b1c670f70c8006079776fc7289e 100644 (file)
@@ -1,4 +1,91 @@
-2.3.5.1 Released 2 June 2016
+
+2.4.2 Released 21 March 2018
+
+* Add custom dialog for FLTK widgets. This can be constructed from C/C++ code, or from MGL script using special comments "##d##d $I kind|label|par1|par2|..." will create an entry in custom dialog for changing plot properties. Here "$I" is id ($0,$1...$9,$a,$b...$z), "label" is the label of element, "kind" is one following:
+       'e' for editor or input line (parameter is initial value) , 
+       'v' for spinner or counter (parameters are "ini|min|max|step|big_step"), 
+       's' for slider (parameters are "ini|min|max|step"), 
+       'b' for check box (parameter is "ini"; also understand "on"=1), 
+       'c' for choice (parameters are possible choices).
+* Add 'progress' for displaying the progress of execution (by '#' symbols in console, or by progress-bar widget).
+* Add 'contp' for contour lines on parametrically specified surface.
+* Add 'flow3' for flow threads of 3D vector field, which start from the plain.
+* Add variant of 'flow' for drawing a flow thread, starting from specified point.
+* Add 'scaletext' for disabling text size scaling in relative inplots (like columnplot, ...).
+* Add 'setup' for setting all low-level flags.
+* Add 'coil' for projecting periodical data.
+* Add modulo operation "%" (x%y=fmod(x,y)) to the list of known operations in real-valued formulas.
+* Add style '.' for 'cont' to draw contour lines from saddle points.
+* Add style '.' for 'flow' to draw flow thread from saddle points.
+* Add option 'value' in 'tube' for setting number of edges manually.
+* Crop output of 'ode' if NAN or INFINITY value occurs.
+* Remove style '~' for 'plot' and 'tens'. Now, all curves try to omit points.
+* Add setup flag MGL_FULL_CURV which disable omitting points of curve.
+* Shift axis labels closer to axis.
+* Change size of LaTeX-like commands \sup, \sub to be the same as \overset, \underset.
+* Change ticks drawing in colorbar.
+* Add new section "All samples" of documentation with large set of samples for most of MathGL features.
+* Samples in documentation are generated automatically now (from sample.cpp).
+INCOMPATIBLE:
+* Make obsolete MGL command 'setsizescl'. At this, the similar C/C++/Fortran/... functions still working.
+
+
+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.
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)
index dd4f2c5546eb7a69b2d8821ec3ddd2623c0cfd05..dd21231cf830e4edf9967cb6965e63fe08c34334 100644 (file)
@@ -55,7 +55,7 @@ enum ENUM_ORDERING { REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER };
 //\r
 //\r
 //             Ansi structures and functions follow\r
-// \r
+//\r
 //\r
 \r
 static struct _getopt_data_a\r
@@ -84,8 +84,7 @@ static void exchange_a(char **argv, struct _getopt_data_a *d)
                if (top - middle > middle - bottom)\r
                {\r
                        int len = middle - bottom;\r
-                       register int i;\r
-                       for (i = 0; i < len; i++)\r
+                       for (int i = 0; i < len; i++)\r
                        {\r
                                tem = argv[bottom + i];\r
                                argv[bottom + i] = argv[top - (middle - bottom) + i];\r
@@ -96,8 +95,7 @@ static void exchange_a(char **argv, struct _getopt_data_a *d)
                else\r
                {\r
                        int len = top - middle;\r
-                       register int i;\r
-                       for (i = 0; i < len; i++)\r
+                       for (int i = 0; i < len; i++)\r
                        {\r
                                tem = argv[bottom + i];\r
                                argv[bottom + i] = argv[middle + i];\r
@@ -515,7 +513,7 @@ int _getopt_long_only_r_a (int argc, char *const *argv, const char *options, con
 //\r
 //\r
 //     Unicode Structures and Functions\r
-// \r
+//\r
 //\r
 \r
 static struct _getopt_data_w\r
@@ -544,8 +542,7 @@ static void exchange_w(wchar_t **argv, struct _getopt_data_w *d)
                if (top - middle > middle - bottom)\r
                {\r
                        int len = middle - bottom;\r
-                       register int i;\r
-                       for (i = 0; i < len; i++)\r
+                       for (int i = 0; i < len; i++)\r
                        {\r
                                tem = argv[bottom + i];\r
                                argv[bottom + i] = argv[top - (middle - bottom) + i];\r
@@ -556,8 +553,7 @@ static void exchange_w(wchar_t **argv, struct _getopt_data_w *d)
                else\r
                {\r
                        int len = top - middle;\r
-                       register int i;\r
-                       for (i = 0; i < len; i++)\r
+                       for (int i = 0; i < len; i++)\r
                        {\r
                                tem = argv[bottom + i];\r
                                argv[bottom + i] = argv[middle + i];\r
@@ -690,7 +686,7 @@ int _getopt_internal_r_w (int argc, wchar_t *const *argv, const wchar_t *optstri
                        if (ambig_list != NULL && !exact)\r
                        {\r
                                if (print_errors)\r
-                               {                                               \r
+                               {\r
                                        struct option_list first;\r
                                        first.p = pfound;\r
                                        first.next = ambig_list;\r
@@ -970,4 +966,4 @@ int _getopt_long_r_w (int argc, wchar_t *const *argv, const wchar_t *options, co
 int _getopt_long_only_r_w (int argc, wchar_t *const *argv, const wchar_t *options, const struct option_w *long_options, int *opt_index, struct _getopt_data_w *d)\r
 {\r
        return _getopt_internal_r_w (argc, argv, options, long_options, opt_index, 1, d, 0);\r
-}
\ No newline at end of file
+}\r
diff --git a/ads.txt b/ads.txt
new file mode 100644 (file)
index 0000000..166586d
--- /dev/null
+++ b/ads.txt
@@ -0,0 +1 @@
+google.com, pub-1128070552722622, DIRECT, f08c47fec0942fa0
diff --git a/cmake-qt4.txt b/cmake-qt4.txt
deleted file mode 100644 (file)
index 7e661ea..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-set(MGL_HAVE_QT4 1)
-set(MGL_QT4_LIBS)
-if(enable-json-sample)
-set(MGL_QT4_LIBS_FIND QtCore QtGui QtNetwork QtWebKit QtOpenGL)
-else(enable-json-sample)
-set(MGL_QT4_LIBS_FIND QtCore QtGui QtOpenGL)
-endif(enable-json-sample)
-
-FIND_PACKAGE(Qt4 4.8 REQUIRED ${MGL_QT4_LIBS_FIND})
-
-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)
-
-foreach(mgl_qt4_lib ${MGL_QT4_LIBS_FIND})
-        set(MGL_QT4_LIBS ${MGL_QT4_LIBS} Qt4::${mgl_qt4_lib})
-endforeach(mgl_qt4_lib)
diff --git a/cmake-qt5.txt b/cmake-qt5.txt
deleted file mode 100644 (file)
index 4b7f0b9..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-set(MGL_HAVE_QT5 1)
-
-set(MGL_QT5_LIBS_FIND Core Gui Widgets PrintSupport OpenGL)
-
-if(enable-json-sample)
-    set(MGL_QT5_LIBS_FIND ${MGL_QT5_LIBS_FIND} Network WebKit WebKitWidgets)
-endif(enable-json-sample)
-
-foreach(mgl_qt5_lib ${MGL_QT5_LIBS_FIND})
-       set(MGL_QT5_LIBS ${MGL_QT5_LIBS} Qt5::${mgl_qt5_lib})
-       find_package(Qt5${mgl_qt5_lib} REQUIRED)
-       if(NOT Qt5${mgl_qt5_lib}_FOUND)
-               message(SEND_ERROR "Couldn't find Qt5 ${mgl_qt5_lib} library.")
-       endif(NOT Qt5${mgl_qt5_lib}_FOUND)
-endforeach(mgl_qt5_lib)
-
-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 d216bef86be2f742eb727fafea67130cc7f5ea5e..7c25819cdce255c3ecc7b085392cae5e09cc7096 100644 (file)
@@ -1,5 +1,16 @@
+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)
+file(COPY ${CMAKE_SOURCE_DIR}/examples/samples.cpp DESTINATION ${CMAKE_BINARY_DIR}/examples)
+file(COPY ${CMAKE_SOURCE_DIR}/examples/wnd_samples.cpp DESTINATION ${CMAKE_BINARY_DIR}/examples)
 add_executable(mgl_example wnd_samples.cpp full_test.cpp samples.cpp)
 target_link_libraries(mgl_example mgl-static ${getopt_lib-static})
+if(CMAKE_BUILD_TYPE STREQUAL "Debug" AND CMAKE_COMPILER_IS_GNUCXX AND enable-lcov)
+       setup_target_for_coverage(
+           NAME mgl_coverage
+           EXECUTABLE $<TARGET_FILE:mgl_example> -mgl
+           DEPENDENCIES mgl_example
+       )
+endif(CMAKE_BUILD_TYPE STREQUAL "Debug" AND CMAKE_COMPILER_IS_GNUCXX AND enable-lcov)
 
 if(MGL_HAVE_FLTK)
        include_directories(${FLTK_INCLUDE_DIR})
@@ -21,10 +32,10 @@ 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)
        
@@ -43,3 +54,8 @@ if(MGL_HAVE_LTDL)
        target_link_libraries(mgl_module mgl)   # for compatibility with win32
 endif(MGL_HAVE_LTDL)
 
+if(MGL_HAVE_MPI)
+       add_executable(mgl_mpi_example mpi_test.cpp)
+       target_link_libraries(mgl_mpi_example mgl-mpi mgl ${MPI_LIBRARIES})
+       target_include_directories(mgl_mpi_example SYSTEM PUBLIC ${MPI_CXX_INCLUDE_PATH})
+endif(MGL_HAVE_MPI)
diff --git a/examples/Equirectangular-projection.jpg b/examples/Equirectangular-projection.jpg
new file mode 100644 (file)
index 0000000..bfc62ab
Binary files /dev/null and b/examples/Equirectangular-projection.jpg differ
index 61d39c9885099fb9780a07b1c24314cf0e10837a..9dc8db33f87290c5a42dfede306af099945f2b20 100644 (file)
@@ -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,6 +121,7 @@ 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
index 538dfba3224b9595c897f8e6b4f26f28ee50661d..714ac1b5a138e70356c0a84c9409019c05282185 100644 (file)
 #include <locale.h>\r
 #include <time.h>\r
 #include <getopt.h>\r
+#ifdef WIN32\r
+#include <io.h>\r
+#include <direct.h>\r
+#else\r
+#include <unistd.h>\r
+#endif\r
 \r
+#include "mgl2/base.h"\r
 #include "mgl2/mgl.h"\r
 #include "mgl2/font.h"\r
 #include "mgl2/eval.h"\r
 //-----------------------------------------------------------------------------\r
+void smgl_fexport(mglGraph *gr);       // test file export\r
 void MGL_EXPORT mgl_create_cpp_font(HMGL gr, const wchar_t *how);\r
 long MGL_EXPORT mgl_check_tex_table();\r
 //-----------------------------------------------------------------------------\r
@@ -34,6 +42,7 @@ struct mglSample      /// Structure for list of samples
        const char *name;\r
        void (*func)(mglGraph*);\r
        const char *mgl;\r
+       const char *info;\r
 };\r
 extern mglSample samp[];\r
 extern const char *mmgl_dat_prepare;\r
@@ -64,8 +73,9 @@ 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
-       mglData a;      a.SetList(5,0.,1.,0.,1.,-1.,2.);\r
-       gr->Plot(a);\r
+//     printf("Prim=%lu, Pnt=%lu, Matrix=%lu, Color=%lu, Point=%lu, Light=%lu, ActivePos=%lu\n",\r
+//             sizeof(mglPrim), sizeof(mglPnt), sizeof(mglMatrix), sizeof(mglColor), sizeof(mglPoint), sizeof(mglLight), sizeof(mglActivePos) );\r
+       gr->ShearPlot(3, 0, 0.2, 0.1);  gr->Box("r");\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
@@ -74,6 +84,64 @@ void test(mglGraph *gr)
        return;\r
 }\r
 //-----------------------------------------------------------------------------\r
+void mgl_generate_texi()\r
+{\r
+       FILE *fp = fopen("samples.texi","w");\r
+       FILE *fq = fopen("samples_list.texi","w");\r
+       fprintf(fp,"@c ------------------------------------------------------------------\n"\r
+               "@chapter All samples\n@nav{}\n\n"\r
+               "This chapter contain alphabetical list of MGL and C++ samples for most of MathGL graphics and features.\n\n@menu\n* initialization sample::\n");\r
+       for(const mglSample *s = samp;s->name && s->name[0];s++)\r
+               fprintf(fp,"* %s sample::\n",s->name);\r
+       fprintf(fp,"@end menu\n@external{}\n");\r
+       fprintf(fp,"@c ------------------------------------------------------------------\n"\r
+               "@node initialization sample, %s sample, , All samples\n@section Functions for initialization\n@nav{}\n", samp[0].name);\r
+       fprintf(fp,"\nThis section contain functions for input data for most of further samples.\n\n@strong{MGL code:}\n@verbatim\n%s\n@end verbatim\n", mmgl_dat_prepare);\r
+       fprintf(fp,"\n@ifclear UDAV\n@strong{C++ code:}\n@verbatim\n");\r
+       \r
+       char buf[512], name[64];\r
+       FILE *fs = fopen("wnd_samples.cpp","r");\r
+       while(!feof(fs))\r
+       {\r
+               fgets(buf,512,fs);\r
+               if(strstr(buf,"void mgls_prepare1d"))   break;\r
+       }\r
+       while(!feof(fs))\r
+       {       fprintf(fp,"%s",buf);   fgets(buf,512,fs);      }\r
+       fprintf(fp,"\n@end verbatim\n@end ifclear\n\n@external{}\n");\r
+       fclose(fs);\r
+\r
+       const char *prev = "initialization";\r
+       fs = fopen("samples.cpp","r");\r
+       for(size_t i=0;samp[i].name && samp[i].name[0];i++)\r
+       {\r
+               fprintf(fq, "@sfig{%s, %s sample}\n", samp[i].name, samp[i].name);\r
+               if(samp[i+1].name && samp[i+1].name[0])\r
+                       fprintf(fp,"@c ------------------------------------------------------------------\n"\r
+                               "@node %s sample, %s sample, %s sample, All samples\n@section Sample @samp{%s}\n@nav{}\n",\r
+                               samp[i].name, samp[i+1].name, prev, samp[i].name);\r
+               else\r
+                       fprintf(fp,"@c ------------------------------------------------------------------\n"\r
+                               "@node %s sample, , %s sample, All samples\n@section Sample '%s'\n@nav{}\n",\r
+                               samp[i].name, samp[i-1].name, samp[i].name);\r
+               prev = samp[i].name;\r
+               fprintf(fp,"\n%s\n\n@strong{MGL code:}\n@verbatim\n%s\n@end verbatim\n", samp[i].info, samp[i].mgl);\r
+               fprintf(fp,"\n@ifclear UDAV\n@strong{C++ code:}\n@verbatim\n");\r
+\r
+               fseek(fs,0,SEEK_SET);\r
+               snprintf(name, 64, "void smgl_%s", samp[i].name);\r
+               while(!feof(fs))\r
+               {       fgets(buf,512,fs);      if(strstr(buf,name))    break;  }\r
+               while(!feof(fs))\r
+               {\r
+                       fprintf(fp,"%s",buf);   fgets(buf,512,fs);\r
+                       if(*buf=='}')   break;\r
+               }\r
+               fprintf(fp,"}\n@end verbatim\n@end ifclear\n@pfig{%s, Sample @samp{%s}}\n@external{}\n", samp[i].name, samp[i].name);\r
+       }\r
+       fclose(fs);     fclose(fp);     fclose(fq);\r
+}\r
+\r
 static struct option longopts[] =\r
 {\r
        { "big",        no_argument,    &big,           1 },\r
@@ -110,6 +178,7 @@ static struct option longopts[] =
        { "time",       no_argument,    &dotest,        3 },\r
        { "fexport",no_argument,        &dotest,        4 },\r
        { "textbl",     no_argument,    &dotest,        5 },\r
+       { "texi",       no_argument,    &dotest,        6 },\r
 \r
        { "thread",     required_argument,      NULL,   't' },\r
        { "verbose",no_argument,        &verbose,       1 },\r
@@ -149,6 +218,7 @@ void usage()
                "--mgl          - use MGL scripts for samples\n"\r
                "--test         - run in test mode\n"\r
                "--time         - measure execution time for all samples\n"\r
+               "--texi         - make TeXi file with all samples\n"\r
                "--font         - write current font as C++ file\n"\r
                "--quality=val  - use specified quality for plot(s)\n"\r
                "--fexport      - test most of output formats\n"\r
@@ -171,7 +241,7 @@ void save(mglGraph *gr,const char *name,const char *suf="")
                case 3: // PNG\r
                        snprintf(buf,128,"%s%s.png",name,suf);\r
                        gr->WritePNG(buf,0,true);       break;\r
-               case 4: // JPEG\r
+               case 4: // JPEG/*               r1 = 1./(x*x+y*y+z*z+0.01);     r2=exp(-0.01/r1/r1)*r1;\r
                        snprintf(buf,128,"%s%s.jpg",name,suf);\r
                        gr->WriteJPEG(buf);     break;\r
                case 5: // PRC\r
@@ -229,165 +299,14 @@ void save(mglGraph *gr,const char *name,const char *suf="")
        }\r
 }\r
 //-----------------------------------------------------------------------------\r
-void smgl_fexport(mglGraph *gr)        // test file export\r
-{\r
-       gr->SubPlot(3,2,0);\r
-       double d,x1,x2,x0,y=0.95;\r
-       d=0.3, x0=0.2, x1=0.5, x2=0.6;\r
-       gr->Line(mglPoint(x0,1-0*d),mglPoint(x1,1-0*d),"k-");   gr->Puts(mglPoint(x2,y-0*d),"Solid '-'",":rL");\r
-       gr->Line(mglPoint(x0,1-1*d),mglPoint(x1,1-1*d),"k|");   gr->Puts(mglPoint(x2,y-1*d),"Long Dash '|'",":rL");\r
-       gr->Line(mglPoint(x0,1-2*d),mglPoint(x1,1-2*d),"k;");   gr->Puts(mglPoint(x2,y-2*d),"Dash ';'",":rL");\r
-       gr->Line(mglPoint(x0,1-3*d),mglPoint(x1,1-3*d),"k=");   gr->Puts(mglPoint(x2,y-3*d),"Small dash '='",":rL");\r
-       gr->Line(mglPoint(x0,1-4*d),mglPoint(x1,1-4*d),"kj");   gr->Puts(mglPoint(x2,y-4*d),"Dash-dot 'j'",":rL");\r
-       gr->Line(mglPoint(x0,1-5*d),mglPoint(x1,1-5*d),"ki");   gr->Puts(mglPoint(x2,y-5*d),"Small dash-dot 'i'",":rL");\r
-       gr->Line(mglPoint(x0,1-6*d),mglPoint(x1,1-6*d),"k:");   gr->Puts(mglPoint(x2,y-6*d),"Dots ':'",":rL");\r
-       gr->Line(mglPoint(x0,1-7*d),mglPoint(x1,1-7*d),"k ");   gr->Puts(mglPoint(x2,y-7*d),"None ' '",":rL");\r
-\r
-       d=0.25; x1=-1; x0=-0.8; y = -0.05;\r
-       gr->Mark(mglPoint(x1,5*d),"k.");        gr->Puts(mglPoint(x0,y+5*d),"'.'",":rL");\r
-       gr->Mark(mglPoint(x1,4*d),"k+");        gr->Puts(mglPoint(x0,y+4*d),"'+'",":rL");\r
-       gr->Mark(mglPoint(x1,3*d),"kx");        gr->Puts(mglPoint(x0,y+3*d),"'x'",":rL");\r
-       gr->Mark(mglPoint(x1,2*d),"k*");        gr->Puts(mglPoint(x0,y+2*d),"'*'",":rL");\r
-       gr->Mark(mglPoint(x1,d),"ks");          gr->Puts(mglPoint(x0,y+d),"'s'",":rL");\r
-       gr->Mark(mglPoint(x1,0),"kd");          gr->Puts(mglPoint(x0,y),"'d'",":rL");\r
-       gr->Mark(mglPoint(x1,-d,0),"ko");       gr->Puts(mglPoint(x0,y-d),"'o'",":rL");\r
-       gr->Mark(mglPoint(x1,-2*d,0),"k^");     gr->Puts(mglPoint(x0,y-2*d),"'\\^'",":rL");\r
-       gr->Mark(mglPoint(x1,-3*d,0),"kv");     gr->Puts(mglPoint(x0,y-3*d),"'v'",":rL");\r
-       gr->Mark(mglPoint(x1,-4*d,0),"k<");     gr->Puts(mglPoint(x0,y-4*d),"'<'",":rL");\r
-       gr->Mark(mglPoint(x1,-5*d,0),"k>");     gr->Puts(mglPoint(x0,y-5*d),"'>'",":rL");\r
-\r
-       d=0.25; x1=-0.5; x0=-0.3;       y = -0.05;\r
-       gr->Mark(mglPoint(x1,5*d),"k#.");       gr->Puts(mglPoint(x0,y+5*d),"'\\#.'",":rL");\r
-       gr->Mark(mglPoint(x1,4*d),"k#+");       gr->Puts(mglPoint(x0,y+4*d),"'\\#+'",":rL");\r
-       gr->Mark(mglPoint(x1,3*d),"k#x");       gr->Puts(mglPoint(x0,y+3*d),"'\\#x'",":rL");\r
-       gr->Mark(mglPoint(x1,2*d),"k#*");       gr->Puts(mglPoint(x0,y+2*d),"'\\#*'",":rL");\r
-       gr->Mark(mglPoint(x1,d),"k#s");         gr->Puts(mglPoint(x0,y+d),"'\\#s'",":rL");\r
-       gr->Mark(mglPoint(x1,0),"k#d");         gr->Puts(mglPoint(x0,y),"'\\#d'",":rL");\r
-       gr->Mark(mglPoint(x1,-d,0),"k#o");      gr->Puts(mglPoint(x0,y-d),"'\\#o'",":rL");\r
-       gr->Mark(mglPoint(x1,-2*d,0),"k#^");    gr->Puts(mglPoint(x0,y-2*d),"'\\#\\^'",":rL");\r
-       gr->Mark(mglPoint(x1,-3*d,0),"k#v");    gr->Puts(mglPoint(x0,y-3*d),"'\\#v'",":rL");\r
-       gr->Mark(mglPoint(x1,-4*d,0),"k#<");    gr->Puts(mglPoint(x0,y-4*d),"'\\#<'",":rL");\r
-       gr->Mark(mglPoint(x1,-5*d,0),"k#>");    gr->Puts(mglPoint(x0,y-5*d),"'\\#>'",":rL");\r
-\r
-       gr->SubPlot(3,2,1);\r
-       double a=0.1,b=0.4,c=0.5;\r
-       gr->Line(mglPoint(a,1),mglPoint(b,1),"k-A");            gr->Puts(mglPoint(c,1),"Style 'A' or 'A\\_'",":rL");\r
-       gr->Line(mglPoint(a,0.8),mglPoint(b,0.8),"k-V");        gr->Puts(mglPoint(c,0.8),"Style 'V' or 'V\\_'",":rL");\r
-       gr->Line(mglPoint(a,0.6),mglPoint(b,0.6),"k-K");        gr->Puts(mglPoint(c,0.6),"Style 'K' or 'K\\_'",":rL");\r
-       gr->Line(mglPoint(a,0.4),mglPoint(b,0.4),"k-I");        gr->Puts(mglPoint(c,0.4),"Style 'I' or 'I\\_'",":rL");\r
-       gr->Line(mglPoint(a,0.2),mglPoint(b,0.2),"k-D");        gr->Puts(mglPoint(c,0.2),"Style 'D' or 'D\\_'",":rL");\r
-       gr->Line(mglPoint(a,0),mglPoint(b,0),"k-S");            gr->Puts(mglPoint(c,0),"Style 'S' or 'S\\_'",":rL");\r
-       gr->Line(mglPoint(a,-0.2),mglPoint(b,-0.2),"k-O");      gr->Puts(mglPoint(c,-0.2),"Style 'O' or 'O\\_'",":rL");\r
-       gr->Line(mglPoint(a,-0.4),mglPoint(b,-0.4),"k-T");      gr->Puts(mglPoint(c,-0.4),"Style 'T' or 'T\\_'",":rL");\r
-       gr->Line(mglPoint(a,-0.6),mglPoint(b,-0.6),"k-_");      gr->Puts(mglPoint(c,-0.6),"Style '\\_' or none",":rL");\r
-       gr->Line(mglPoint(a,-0.8),mglPoint(b,-0.8),"k-AS");     gr->Puts(mglPoint(c,-0.8),"Style 'AS'",":rL");\r
-       gr->Line(mglPoint(a,-1),mglPoint(b,-1),"k-_A");         gr->Puts(mglPoint(c,-1),"Style '\\_A'",":rL");\r
-\r
-       a=-1;   b=-0.7; c=-0.6;\r
-       gr->Line(mglPoint(a,1),mglPoint(b,1),"kAA");            gr->Puts(mglPoint(c,1),"Style 'AA'",":rL");\r
-       gr->Line(mglPoint(a,0.8),mglPoint(b,0.8),"kVV");        gr->Puts(mglPoint(c,0.8),"Style 'VV'",":rL");\r
-       gr->Line(mglPoint(a,0.6),mglPoint(b,0.6),"kKK");        gr->Puts(mglPoint(c,0.6),"Style 'KK'",":rL");\r
-       gr->Line(mglPoint(a,0.4),mglPoint(b,0.4),"kII");        gr->Puts(mglPoint(c,0.4),"Style 'II'",":rL");\r
-       gr->Line(mglPoint(a,0.2),mglPoint(b,0.2),"kDD");        gr->Puts(mglPoint(c,0.2),"Style 'DD'",":rL");\r
-       gr->Line(mglPoint(a,0),mglPoint(b,0),"kSS");            gr->Puts(mglPoint(c,0),"Style 'SS'",":rL");\r
-       gr->Line(mglPoint(a,-0.2),mglPoint(b,-0.2),"kOO");      gr->Puts(mglPoint(c,-0.2),"Style 'OO'",":rL");\r
-       gr->Line(mglPoint(a,-0.4),mglPoint(b,-0.4),"kTT");      gr->Puts(mglPoint(c,-0.4),"Style 'TT'",":rL");\r
-       gr->Line(mglPoint(a,-0.6),mglPoint(b,-0.6),"k-__");     gr->Puts(mglPoint(c,-0.6),"Style '\\_\\_'",":rL");\r
-       gr->Line(mglPoint(a,-0.8),mglPoint(b,-0.8),"k-VA");     gr->Puts(mglPoint(c,-0.8),"Style 'VA'",":rL");\r
-       gr->Line(mglPoint(a,-1),mglPoint(b,-1),"k-AV");         gr->Puts(mglPoint(c,-1),"Style 'AV'",":rL");\r
-\r
-       gr->SubPlot(3,2,2);\r
-       //#LENUQ\r
-       gr->FaceZ(mglPoint(-1,  -1), 0.4, 0.3, "L#");   gr->Puts(mglPoint(-0.8,-0.9), "L", "w:C", -1.4);\r
-       gr->FaceZ(mglPoint(-0.6,-1), 0.4, 0.3, "E#");   gr->Puts(mglPoint(-0.4,-0.9), "E", "w:C", -1.4);\r
-       gr->FaceZ(mglPoint(-0.2,-1), 0.4, 0.3, "N#");   gr->Puts(mglPoint(0,  -0.9), "N", "w:C", -1.4);\r
-       gr->FaceZ(mglPoint(0.2, -1), 0.4, 0.3, "U#");   gr->Puts(mglPoint(0.4,-0.9), "U", "w:C", -1.4);\r
-       gr->FaceZ(mglPoint(0.6, -1), 0.4, 0.3, "Q#");   gr->Puts(mglPoint(0.8,-0.9), "Q", "w:C", -1.4);\r
-       //#lenuq\r
-       gr->FaceZ(mglPoint(-1,  -0.7), 0.4, 0.3, "l#"); gr->Puts(mglPoint(-0.8,-0.6), "l", "k:C", -1.4);\r
-       gr->FaceZ(mglPoint(-0.6,-0.7), 0.4, 0.3, "e#"); gr->Puts(mglPoint(-0.4,-0.6), "e", "k:C", -1.4);\r
-       gr->FaceZ(mglPoint(-0.2,-0.7), 0.4, 0.3, "n#"); gr->Puts(mglPoint(0,  -0.6), "n", "k:C", -1.4);\r
-       gr->FaceZ(mglPoint(0.2, -0.7), 0.4, 0.3, "u#"); gr->Puts(mglPoint(0.4,-0.6), "u", "k:C", -1.4);\r
-       gr->FaceZ(mglPoint(0.6, -0.7), 0.4, 0.3, "q#"); gr->Puts(mglPoint(0.8,-0.6), "q", "k:C", -1.4);\r
-       //#CMYkP\r
-       gr->FaceZ(mglPoint(-1,  -0.4), 0.4, 0.3, "C#"); gr->Puts(mglPoint(-0.8,-0.3), "C", "w:C", -1.4);\r
-       gr->FaceZ(mglPoint(-0.6,-0.4), 0.4, 0.3, "M#"); gr->Puts(mglPoint(-0.4,-0.3), "M", "w:C", -1.4);\r
-       gr->FaceZ(mglPoint(-0.2,-0.4), 0.4, 0.3, "Y#"); gr->Puts(mglPoint(0,  -0.3), "Y", "w:C", -1.4);\r
-       gr->FaceZ(mglPoint(0.2, -0.4), 0.4, 0.3, "k#"); gr->Puts(mglPoint(0.4,-0.3), "k", "w:C", -1.4);\r
-       gr->FaceZ(mglPoint(0.6, -0.4), 0.4, 0.3, "P#"); gr->Puts(mglPoint(0.8,-0.3), "P", "w:C", -1.4);\r
-       //#cmywp\r
-       gr->FaceZ(mglPoint(-1,  -0.1), 0.4, 0.3, "c#"); gr->Puts(mglPoint(-0.8, 0), "c", "k:C", -1.4);\r
-       gr->FaceZ(mglPoint(-0.6,-0.1), 0.4, 0.3, "m#"); gr->Puts(mglPoint(-0.4, 0), "m", "k:C", -1.4);\r
-       gr->FaceZ(mglPoint(-0.2,-0.1), 0.4, 0.3, "y#"); gr->Puts(mglPoint(0,   0), "y", "k:C", -1.4);\r
-       gr->FaceZ(mglPoint(0.2, -0.1), 0.4, 0.3, "w#"); gr->Puts(mglPoint(0.4, 0), "w", "k:C", -1.4);\r
-       gr->FaceZ(mglPoint(0.6, -0.1), 0.4, 0.3, "p#"); gr->Puts(mglPoint(0.8, 0), "p", "k:C", -1.4);\r
-       //#BGRHW\r
-       gr->FaceZ(mglPoint(-1,  0.2), 0.4, 0.3, "B#");  gr->Puts(mglPoint(-0.8, 0.3), "B", "w:C", -1.4);\r
-       gr->FaceZ(mglPoint(-0.6,0.2), 0.4, 0.3, "G#");  gr->Puts(mglPoint(-0.4, 0.3), "G", "w:C", -1.4);\r
-       gr->FaceZ(mglPoint(-0.2,0.2), 0.4, 0.3, "R#");  gr->Puts(mglPoint(0,   0.3), "R", "w:C", -1.4);\r
-       gr->FaceZ(mglPoint(0.2, 0.2), 0.4, 0.3, "H#");  gr->Puts(mglPoint(0.4, 0.3), "H", "w:C", -1.4);\r
-       gr->FaceZ(mglPoint(0.6, 0.2), 0.4, 0.3, "W#");  gr->Puts(mglPoint(0.8, 0.3), "W", "w:C", -1.4);\r
-       //#bgrhw\r
-       gr->FaceZ(mglPoint(-1,  0.5), 0.4, 0.3, "b#");  gr->Puts(mglPoint(-0.8, 0.6), "b", "k:C", -1.4);\r
-       gr->FaceZ(mglPoint(-0.6,0.5), 0.4, 0.3, "g#");  gr->Puts(mglPoint(-0.4, 0.6), "g", "k:C", -1.4);\r
-       gr->FaceZ(mglPoint(-0.2,0.5), 0.4, 0.3, "r#");  gr->Puts(mglPoint(0,   0.6), "r", "k:C", -1.4);\r
-       gr->FaceZ(mglPoint(0.2, 0.5), 0.4, 0.3, "h#");  gr->Puts(mglPoint(0.4, 0.6), "h", "k:C", -1.4);\r
-       gr->FaceZ(mglPoint(0.6, 0.5), 0.4, 0.3, "w#");  gr->Puts(mglPoint(0.8, 0.6), "w", "k:C", -1.4);\r
-       //#brighted\r
-       gr->FaceZ(mglPoint(-1,  0.8), 0.4, 0.3, "{r1}#");       gr->Puts(mglPoint(-0.8, 0.9), "\\{r1\\}", "w:C", -1.4);\r
-       gr->FaceZ(mglPoint(-0.6,0.8), 0.4, 0.3, "{r3}#");       gr->Puts(mglPoint(-0.4, 0.9), "\\{r3\\}", "w:C", -1.4);\r
-       gr->FaceZ(mglPoint(-0.2,0.8), 0.4, 0.3, "{r5}#");       gr->Puts(mglPoint(0,   0.9), "\\{r5\\}", "k:C", -1.4);\r
-       gr->FaceZ(mglPoint(0.2, 0.8), 0.4, 0.3, "{r7}#");       gr->Puts(mglPoint(0.4, 0.9), "\\{r7\\}", "k:C", -1.4);\r
-       gr->FaceZ(mglPoint(0.6, 0.8), 0.4, 0.3, "{r9}#");       gr->Puts(mglPoint(0.8, 0.9), "\\{r9\\}", "k:C", -1.4);\r
-       // HEX\r
-       gr->FaceZ(mglPoint(-1, -1.3), 1, 0.3, "{xff9966}#");    gr->Puts(mglPoint(-0.5,-1.2), "\\{xff9966\\}", "k:C", -1.4);\r
-       gr->FaceZ(mglPoint(0,  -1.3), 1, 0.3, "{x83CAFF}#");    gr->Puts(mglPoint( 0.5,-1.2), "\\{x83CAFF\\}", "k:C", -1.4);\r
-\r
-       gr->SubPlot(3,2,3);\r
-       char stl[3]="r1", txt[4]="'1'";\r
-       for(int i=0;i<10;i++)\r
-       {\r
-               txt[1]=stl[1]='0'+i;\r
-               gr->Line(mglPoint(-1,0.2*i-1),mglPoint(1,0.2*i-1),stl);\r
-               gr->Puts(mglPoint(1.05,0.2*i-1),txt,":L");\r
-       }\r
-\r
-       gr->SubPlot(3,2,4);     gr->Title("TriPlot sample");    gr->Rotate(50,60);\r
-       double t[] = {0,1,2, 0,1,3, 0,2,3, 1,2,3};\r
-       double xt[] = {-1,1,0,0}, yt[] = {-1,-1,1,0}, zt[] = {-1,-1,-1,1};\r
-       mglData tt(4,3,t), uu(4,xt), vv(4,yt), ww(4,zt);\r
-       gr->TriPlot(tt,uu,vv,ww,"b");\r
-       gr->TriPlot(tt,uu,vv,ww,"k#");\r
-\r
-       gr->SubPlot(3,2,5);\r
-       mglData r(4);   r.Fill(1,4);\r
-       gr->SetRanges(1,4,1,4); gr->Axis();\r
-       gr->Mark(r,r,"s");\r
-       gr->Plot(r,"b");\r
-\r
-       gr->WriteJPEG("fexport.jpg");\r
-//     gr->WritePNG("fexport.png");\r
-       gr->WriteBMP("fexport.bmp");\r
-       gr->WriteTGA("fexport.tga");\r
-       gr->WriteEPS("fexport.eps");\r
-       gr->WriteSVG("fexport.svg");\r
-       gr->WriteGIF("fexport.gif");\r
-\r
-       gr->WriteXYZ("fexport.xyz");\r
-       gr->WriteSTL("fexport.stl");\r
-       gr->WriteOFF("fexport.off");\r
-       gr->WriteTEX("fexport.tex");\r
-       gr->WriteOBJ("fexport.obj");\r
-       gr->WritePRC("fexport.prc");\r
-       gr->WriteJSON("fexport.json");\r
-\r
-       gr->ExportMGLD("fexport.mgld");\r
-       gr->Clf();\r
-       gr->ImportMGLD("fexport.mgld");\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
@@ -402,7 +321,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
@@ -442,7 +361,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
@@ -450,8 +368,18 @@ 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
+               FILE *fi = fopen("/proc/cpuinfo","r");\r
+               if(fi)\r
+               {\r
+                       char buf[128];\r
+                       while(!feof(fi))\r
+                       {       fgets(buf,128,fi);      \r
+                               if(!strstr(buf,"model name"))\r
+                               {       fprintf(fp,"@c %s\n",buf);      break;  }       }\r
+                       fclose(fi);\r
+               }\r
                fprintf(fp,"@multitable @columnfractions .16 .12 .12 .12 .12 .12 .12 .12\n");\r
                fprintf(fp,"@headitem Name");\r
                for(int i=0;i<7;i++)    fprintf(fp," @tab q=%d",qual[i]);\r
@@ -487,6 +415,11 @@ int main(int argc,char **argv)
                mgl_check_tex_table();\r
                delete gr;      return 0;\r
        }\r
+       else if(dotest==6)\r
+       {\r
+               mgl_generate_texi();\r
+               delete gr;      return 0;\r
+       }\r
 \r
        if(type==15 || type==16)        big=3;  // save mini version for json\r
 \r
@@ -501,7 +434,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
@@ -512,6 +444,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
@@ -528,7 +461,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 c92158324cbcb55545da72fe571f38af777292aa..07a70f5c79ab5c6af7f5bf64057cc9fd3139d425 100644 (file)
@@ -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
diff --git a/examples/iris.dat b/examples/iris.dat
new file mode 100644 (file)
index 0000000..5c4316c
--- /dev/null
@@ -0,0 +1,151 @@
+5.1,3.5,1.4,0.2,Iris-setosa
+4.9,3.0,1.4,0.2,Iris-setosa
+4.7,3.2,1.3,0.2,Iris-setosa
+4.6,3.1,1.5,0.2,Iris-setosa
+5.0,3.6,1.4,0.2,Iris-setosa
+5.4,3.9,1.7,0.4,Iris-setosa
+4.6,3.4,1.4,0.3,Iris-setosa
+5.0,3.4,1.5,0.2,Iris-setosa
+4.4,2.9,1.4,0.2,Iris-setosa
+4.9,3.1,1.5,0.1,Iris-setosa
+5.4,3.7,1.5,0.2,Iris-setosa
+4.8,3.4,1.6,0.2,Iris-setosa
+4.8,3.0,1.4,0.1,Iris-setosa
+4.3,3.0,1.1,0.1,Iris-setosa
+5.8,4.0,1.2,0.2,Iris-setosa
+5.7,4.4,1.5,0.4,Iris-setosa
+5.4,3.9,1.3,0.4,Iris-setosa
+5.1,3.5,1.4,0.3,Iris-setosa
+5.7,3.8,1.7,0.3,Iris-setosa
+5.1,3.8,1.5,0.3,Iris-setosa
+5.4,3.4,1.7,0.2,Iris-setosa
+5.1,3.7,1.5,0.4,Iris-setosa
+4.6,3.6,1.0,0.2,Iris-setosa
+5.1,3.3,1.7,0.5,Iris-setosa
+4.8,3.4,1.9,0.2,Iris-setosa
+5.0,3.0,1.6,0.2,Iris-setosa
+5.0,3.4,1.6,0.4,Iris-setosa
+5.2,3.5,1.5,0.2,Iris-setosa
+5.2,3.4,1.4,0.2,Iris-setosa
+4.7,3.2,1.6,0.2,Iris-setosa
+4.8,3.1,1.6,0.2,Iris-setosa
+5.4,3.4,1.5,0.4,Iris-setosa
+5.2,4.1,1.5,0.1,Iris-setosa
+5.5,4.2,1.4,0.2,Iris-setosa
+4.9,3.1,1.5,0.1,Iris-setosa
+5.0,3.2,1.2,0.2,Iris-setosa
+5.5,3.5,1.3,0.2,Iris-setosa
+4.9,3.1,1.5,0.1,Iris-setosa
+4.4,3.0,1.3,0.2,Iris-setosa
+5.1,3.4,1.5,0.2,Iris-setosa
+5.0,3.5,1.3,0.3,Iris-setosa
+4.5,2.3,1.3,0.3,Iris-setosa
+4.4,3.2,1.3,0.2,Iris-setosa
+5.0,3.5,1.6,0.6,Iris-setosa
+5.1,3.8,1.9,0.4,Iris-setosa
+4.8,3.0,1.4,0.3,Iris-setosa
+5.1,3.8,1.6,0.2,Iris-setosa
+4.6,3.2,1.4,0.2,Iris-setosa
+5.3,3.7,1.5,0.2,Iris-setosa
+5.0,3.3,1.4,0.2,Iris-setosa
+7.0,3.2,4.7,1.4,Iris-versicolor
+6.4,3.2,4.5,1.5,Iris-versicolor
+6.9,3.1,4.9,1.5,Iris-versicolor
+5.5,2.3,4.0,1.3,Iris-versicolor
+6.5,2.8,4.6,1.5,Iris-versicolor
+5.7,2.8,4.5,1.3,Iris-versicolor
+6.3,3.3,4.7,1.6,Iris-versicolor
+4.9,2.4,3.3,1.0,Iris-versicolor
+6.6,2.9,4.6,1.3,Iris-versicolor
+5.2,2.7,3.9,1.4,Iris-versicolor
+5.0,2.0,3.5,1.0,Iris-versicolor
+5.9,3.0,4.2,1.5,Iris-versicolor
+6.0,2.2,4.0,1.0,Iris-versicolor
+6.1,2.9,4.7,1.4,Iris-versicolor
+5.6,2.9,3.6,1.3,Iris-versicolor
+6.7,3.1,4.4,1.4,Iris-versicolor
+5.6,3.0,4.5,1.5,Iris-versicolor
+5.8,2.7,4.1,1.0,Iris-versicolor
+6.2,2.2,4.5,1.5,Iris-versicolor
+5.6,2.5,3.9,1.1,Iris-versicolor
+5.9,3.2,4.8,1.8,Iris-versicolor
+6.1,2.8,4.0,1.3,Iris-versicolor
+6.3,2.5,4.9,1.5,Iris-versicolor
+6.1,2.8,4.7,1.2,Iris-versicolor
+6.4,2.9,4.3,1.3,Iris-versicolor
+6.6,3.0,4.4,1.4,Iris-versicolor
+6.8,2.8,4.8,1.4,Iris-versicolor
+6.7,3.0,5.0,1.7,Iris-versicolor
+6.0,2.9,4.5,1.5,Iris-versicolor
+5.7,2.6,3.5,1.0,Iris-versicolor
+5.5,2.4,3.8,1.1,Iris-versicolor
+5.5,2.4,3.7,1.0,Iris-versicolor
+5.8,2.7,3.9,1.2,Iris-versicolor
+6.0,2.7,5.1,1.6,Iris-versicolor
+5.4,3.0,4.5,1.5,Iris-versicolor
+6.0,3.4,4.5,1.6,Iris-versicolor
+6.7,3.1,4.7,1.5,Iris-versicolor
+6.3,2.3,4.4,1.3,Iris-versicolor
+5.6,3.0,4.1,1.3,Iris-versicolor
+5.5,2.5,4.0,1.3,Iris-versicolor
+5.5,2.6,4.4,1.2,Iris-versicolor
+6.1,3.0,4.6,1.4,Iris-versicolor
+5.8,2.6,4.0,1.2,Iris-versicolor
+5.0,2.3,3.3,1.0,Iris-versicolor
+5.6,2.7,4.2,1.3,Iris-versicolor
+5.7,3.0,4.2,1.2,Iris-versicolor
+5.7,2.9,4.2,1.3,Iris-versicolor
+6.2,2.9,4.3,1.3,Iris-versicolor
+5.1,2.5,3.0,1.1,Iris-versicolor
+5.7,2.8,4.1,1.3,Iris-versicolor
+6.3,3.3,6.0,2.5,Iris-virginica
+5.8,2.7,5.1,1.9,Iris-virginica
+7.1,3.0,5.9,2.1,Iris-virginica
+6.3,2.9,5.6,1.8,Iris-virginica
+6.5,3.0,5.8,2.2,Iris-virginica
+7.6,3.0,6.6,2.1,Iris-virginica
+4.9,2.5,4.5,1.7,Iris-virginica
+7.3,2.9,6.3,1.8,Iris-virginica
+6.7,2.5,5.8,1.8,Iris-virginica
+7.2,3.6,6.1,2.5,Iris-virginica
+6.5,3.2,5.1,2.0,Iris-virginica
+6.4,2.7,5.3,1.9,Iris-virginica
+6.8,3.0,5.5,2.1,Iris-virginica
+5.7,2.5,5.0,2.0,Iris-virginica
+5.8,2.8,5.1,2.4,Iris-virginica
+6.4,3.2,5.3,2.3,Iris-virginica
+6.5,3.0,5.5,1.8,Iris-virginica
+7.7,3.8,6.7,2.2,Iris-virginica
+7.7,2.6,6.9,2.3,Iris-virginica
+6.0,2.2,5.0,1.5,Iris-virginica
+6.9,3.2,5.7,2.3,Iris-virginica
+5.6,2.8,4.9,2.0,Iris-virginica
+7.7,2.8,6.7,2.0,Iris-virginica
+6.3,2.7,4.9,1.8,Iris-virginica
+6.7,3.3,5.7,2.1,Iris-virginica
+7.2,3.2,6.0,1.8,Iris-virginica
+6.2,2.8,4.8,1.8,Iris-virginica
+6.1,3.0,4.9,1.8,Iris-virginica
+6.4,2.8,5.6,2.1,Iris-virginica
+7.2,3.0,5.8,1.6,Iris-virginica
+7.4,2.8,6.1,1.9,Iris-virginica
+7.9,3.8,6.4,2.0,Iris-virginica
+6.4,2.8,5.6,2.2,Iris-virginica
+6.3,2.8,5.1,1.5,Iris-virginica
+6.1,2.6,5.6,1.4,Iris-virginica
+7.7,3.0,6.1,2.3,Iris-virginica
+6.3,3.4,5.6,2.4,Iris-virginica
+6.4,3.1,5.5,1.8,Iris-virginica
+6.0,3.0,4.8,1.8,Iris-virginica
+6.9,3.1,5.4,2.1,Iris-virginica
+6.7,3.1,5.6,2.4,Iris-virginica
+6.9,3.1,5.1,2.3,Iris-virginica
+5.8,2.7,5.1,1.9,Iris-virginica
+6.8,3.2,5.9,2.3,Iris-virginica
+6.7,3.3,5.7,2.5,Iris-virginica
+6.7,3.0,5.2,2.3,Iris-virginica
+6.3,2.5,5.0,1.9,Iris-virginica
+6.5,3.0,5.2,2.0,Iris-virginica
+6.2,3.4,5.4,2.3,Iris-virginica
+5.9,3.0,5.1,1.8,Iris-virginica
+
index 34ecf67aabea84096ed9a22d6856abd7019c0705..e74196471c7d0707f8d1e84eb0f2e90d9a936c1a 100644 (file)
@@ -6,8 +6,9 @@ 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 if(!strcmp(k,"s")) {       gr->Box();      gr->Axis(a[0].s.s);     }
+       else res = 1;
+       return res;
 }
 //-----------------------------------------------------------------------------
 int test2(mglGraph *gr, long , mglArg *a, const char *k, const char *)
@@ -16,14 +17,15 @@ int test2(mglGraph *gr, long , mglArg *a, const char *k, const char *)
        if(!strcmp(k,"nnnns"))
        {
                gr->FaceZ(mglPoint(a[0].v-a[2].v/2,a[1].v-a[3].v/2),a[2].v,a[3].v,"r");
-               gr->Putsw(mglPoint(a[0].v,a[1].v),a[4].w.c_str());
+               gr->Putsw(mglPoint(a[0].v,a[1].v),a[4].s.w);
        }
        else if(!strcmp(k,"nnnnss"))
        {
-               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());
+               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.s);
+               gr->Putsw(mglPoint(a[0].v,a[1].v),a[4].s.w);
        }
-       else res = 1;   return res;
+       else res = 1;
+       return res;
 }
 //-----------------------------------------------------------------------------
 mglCommand mgl_cmd_extra[] = {
index 74865f733902fc05a4654110dd09a54054b47eec..1f8d982c70159a2836edc9d7bd70289cbbd8a6a6 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 77fa94bf5250bda8709c03a155e33bec35311970..b0f0d5ce88da2dd9ff81c44dc3897947c070dc73 100644 (file)
@@ -23,6 +23,7 @@
 //-----------------------------------------------------------------------------
 int main(int argc, char *argv[])
 {
+       mgl_textdomain(argv?argv[0]:NULL,"");
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
@@ -42,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 7d5e4ab0cb88baf64c1a42872bba5fc35ce8effd..c27b101cac22a0eea2716e3afa7fa5e5efcd6723 100644 (file)
@@ -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,6 +135,7 @@ 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
index 243f59a2782f0f18e1f8ae5612c3dd69c805afaf..3114c8a28259520df619f1b43bce9eab14a6374e 100644 (file)
@@ -31,11 +31,12 @@ struct mglSample    /// Structure for list of samples
        const char *name;
        void (*func)(mglGraph*);
        const char *mgl;
+       const char *info;
 };
 //-----------------------------------------------------------------------------
 //             MGL functions for preparing data
 //-----------------------------------------------------------------------------
-const char *mmgl_dat_prepare = "\nstop\n\nfunc 'prepare1d'\n\
+const char *mmgl_dat_prepare = "\nfunc 'prepare1d'\n\
 new y 50 3\nmodify y '0.7*sin(2*pi*x)+0.5*cos(3*pi*x)+0.2*sin(pi*x)'\n\
 modify y 'sin(2*pi*x)' 1\nmodify y 'cos(2*pi*x)' 2\n\
 new x1 50 'x'\nnew x2 50 '0.05-0.03*cos(pi*x)'\n\
@@ -754,8 +755,9 @@ const char *mmgl_text="call 'prepare1d'\nsubplot 2 2 0 ''\ntext 0 1 'Text can be
 "text 0 -0.6 'Easy to change indexes ^{up} _{down} @{center}'\n"
 "text 0 -1 'It parse TeX: \\int \\alpha \\cdot \\\n\\sqrt3{sin(\\pi x)^2 + \\gamma_{i_k}} dx'\n"
 "subplot 2 2 1 ''\n text 0 0.5 '\\sqrt{\\frac{\\alpha^{\\gamma^2}+\\overset 1{\\big\\infty}}{\\sqrt3{2+b}}}' '@' -2\n"
-"text 0 -0.3 'Text can be printed\\n{}on several lines'\n"
-"text 0 -0.7 'or with color gradient' 'BbcyrR'\n"
+"text 0 -0.1 'More text position: \\frac{a}{b}, \\dfrac{a}{b}, [\\stack{a}{bbb}], [\\stackl{a}{bbb}], [\\stackr{a}{bbb}], \\sup{a}{sup}, \\sub{a}{sub}'"
+"text 0 -0.5 'Text can be printed\\n{}on several lines'\n"
+"text 0 -0.9 'or with color gradient' 'BbcyrR'\n"
 "subplot 2 2 2 '':box:plot y(:,0)\ntext y 'This is very very long string drawn along a curve' 'k'\ntext y 'Another string drawn above a curve' 'Tr'\n"
 "subplot 2 2 3 '':line -1 -1 1 -1 'rA':text 0 -1 1 -1 'Horizontal'\n"
 "line -1 -1 1 1 'rA':text 0 0 1 1 'At angle' '@'\nline -1 -1 -1 1 'rA':text -1 0 -1 1 'Vertical'";
@@ -775,8 +777,9 @@ void smgl_text(mglGraph *gr)        // text drawing
 
        gr->SubPlot(2,2,1,"");
        gr->Puts(mglPoint(0,0.5), "\\sqrt{\\frac{\\alpha^{\\gamma^2}+\\overset 1{\\big\\infty}}{\\sqrt3{2+b}}}", "@", -2);
-       gr->Puts(mglPoint(0,-0.3),"Text can be printed\non several lines");
-       gr->Puts(mglPoint(0,-0.7),"or with col\bor gradient","BbcyrR");
+       gr->Puts(mglPoint(0,-0.1),"More text position: \\frac{a}{b}, \\dfrac{a}{b}, [\\stack{a}{bbb}], [\\stackl{a}{bbb}], [\\stackr{a}{bbb}], \\sup{a}{sup}, \\sub{a}{sub}");
+       gr->Puts(mglPoint(0,-0.5),"Text can be printed\non several lines");
+       gr->Puts(mglPoint(0,-0.9),"or with col\bor gradient","BbcyrR");
 
        gr->SubPlot(2,2,2,"");
        mglData y;      mgls_prepare1d(&y);
@@ -1388,8 +1391,8 @@ void smgl_pde(mglGraph *gr)       // PDE sample
        gr->Puts(mglPoint(0, 0.95), "Equation: ik_0\\partial_zu + \\Delta u + x\\cdot u + i \\frac{x+z}{2}\\cdot u = 0\nabsorption: (x+z)/2 for x+z>0");
 }
 //-----------------------------------------------------------------------------
-const char *mmgl_conta="call 'prepare3d'\ntitle 'Cont3 sample':rotate 50 60:box\ncont3 c 'x':cont3 c:cont3 c 'z'";
-void smgl_conta(mglGraph *gr)
+const char *mmgl_cont3="call 'prepare3d'\ntitle 'Cont3 sample':rotate 50 60:box\ncont3 c 'x':cont3 c:cont3 c 'z'";
+void smgl_cont3(mglGraph *gr)
 {
        mglData c;      mgls_prepare3d(&c);
        if(big!=3)      gr->Title("Cont3 sample");
@@ -1397,9 +1400,9 @@ void smgl_conta(mglGraph *gr)
        gr->Cont3(c,"x");       gr->Cont3(c);   gr->Cont3(c,"z");
 }
 //-----------------------------------------------------------------------------
-const char *mmgl_contfa="call 'prepare3d'\ntitle 'Cont3 sample':rotate 50 60:box:light on\n"
+const char *mmgl_contf3="call 'prepare3d'\ntitle 'Cont3 sample':rotate 50 60:box:light on\n"
 "contf3 c 'x':contf3 c:contf3 c 'z'\ncont3 c 'xk':cont3 c 'k':cont3 c 'zk'";
-void smgl_contfa(mglGraph *gr)
+void smgl_contf3(mglGraph *gr)
 {
        mglData c;      mgls_prepare3d(&c);
        if(big!=3)      gr->Title("ContF3 sample");
@@ -1408,9 +1411,9 @@ void smgl_contfa(mglGraph *gr)
        gr->Cont3(c,"kx");      gr->Cont3(c,"k");       gr->Cont3(c,"kz");
 }
 //-----------------------------------------------------------------------------
-const char *mmgl_densa="call 'prepare3d'\ntitle 'Dens3 sample':rotate 50 60:alpha on:alphadef 0.7\n"
+const char *mmgl_dens3="call 'prepare3d'\ntitle 'Dens3 sample':rotate 50 60:alpha on:alphadef 0.7\n"
 "origin 0 0 0:box:axis '_xyz'\ndens3 c 'x':dens3 c ':y':dens3 c 'z'";
-void smgl_densa(mglGraph *gr)
+void smgl_dens3(mglGraph *gr)
 {
        mglData c;      mgls_prepare3d(&c);
        if(big!=3)      gr->Title("Dens3 sample");
@@ -1470,7 +1473,7 @@ void smgl_cloud(mglGraph *gr)
 //-----------------------------------------------------------------------------
 const char *mmgl_cont="call 'prepare2d'\nlist v -0.5 -0.15 0 0.15 0.5\nsubplot 2 2 0:title 'Cont plot (default)':rotate 50 60:box:cont a\n"
 "subplot 2 2 1:title 'manual levels':rotate 50 60:box:cont v a\n"
-"subplot 2 2 2:title '\"\\_\" style':rotate 50 60:box:cont a '_'\n"
+"subplot 2 2 2:title '\"\\_\" and \".\" styles':rotate 50 60:box:cont a '_':cont a '_.2k'\n"
 "subplot 2 2 3 '':title '\"t\" style':box:cont a 't'";
 void smgl_cont(mglGraph *gr)
 {
@@ -1480,8 +1483,8 @@ void smgl_cont(mglGraph *gr)
        if(big==3)      return;
        gr->SubPlot(2,2,1);     gr->Title("manual levels");
        gr->Rotate(50,60);      gr->Box();      gr->Cont(v,a);
-       gr->SubPlot(2,2,2);     gr->Title("'\\_' style");
-       gr->Rotate(50,60);      gr->Box();      gr->Cont(a,"_");
+       gr->SubPlot(2,2,2);     gr->Title("'\\_' and '.' styles");
+       gr->Rotate(50,60);      gr->Box();      gr->Cont(a,"_");        gr->Cont(a,"_.2k");
        gr->SubPlot(2,2,3,"");  gr->Title("'t' style");
        gr->Box();      gr->Cont(a,"t");
 }
@@ -1731,26 +1734,64 @@ void smgl_surf(mglGraph *gr)
        gr->Rotate(50,60);      gr->Box();      gr->Surf(x,y,z,"BbwrR");
 }
 //-----------------------------------------------------------------------------
-const char *mmgl_parser="title 'MGL parser sample'\ncall 'sample'\nstop\nfunc 'sample'\n"
-"new dat 100 'sin(2*pi*(x+1))'\nplot dat; xrange 0 1\nbox\naxis\n"
-"xlabel 'x'\nylabel 'y'\nbox\nfor $0 -1 1 0.1\nif $0<0\n"
-"line 0 0 -1 $0 'r':else:line 0 0 -1 $0 'g'\nendif\nnext";
+const char *mmgl_parser="title 'MGL parser sample'\n# call function\ncall 'sample'\n"
+"\n# ordinary for-loop\nfor $0 -1 1 0.1\n"
+"if $0<0:line 0 0 1 $0 'r':else:line 0 0 1 $0 'g':endif\nnext\n"
+"\n# if-elseif-else\nfor $i -1 1 0.5\nif $i<0\ntext 1.1 $i '$i' 'b'\n"
+"elseif $i>0\ntext 1.1 $i '$i' 'r'\nelse\ntext 1.1 $i '$i'\nendif\nnext\n"
+"\n# ordinary do-while\ndo\ndefnum $i $i-0.2\nline 0 0 $i 1 'b'\nwhile $i>0\n"
+"\n# do-next-break\ndo\ndefnum $i $i-0.2\nif $i<-1 then break\nline 0 0 $i 1 'm'\nnext\n"
+"\n# for-while-continue\nfor $i -5 10\ntext $i/5 1.1 'a'+($i+5)\nif $i<0\n"
+"text $i/5-0.06 1.1 '--' 'b'\nelseif mod($i,2)=0\ntext $i/5-0.06 1.1 '~' 'r'\n"
+"else\n# NOTE: 'continue' bypass the 'while'!\ncontinue\nendif\n"
+"# NOTE: 'while' limit the actual number of iterations\nwhile $i<5\n"
+"\n# nested loops\nfor $i 0 1 0.1\nfor $j 0 1 0.1\nball $i $j\n"
+"if $j>0.5 then continue\nball $i $j 'b+'\nnext\nnext\n"
+"\nfunc 'sample'\nnew dat 100 'sin(2*pi*(i/99+1))'\nplot dat;xrange -1 0\n"
+"box:axis\nxlabel 'x':ylabel 'y'\nreturn";
 void smgl_parser(mglGraph *gr) // example of MGL parsing
-{
+{      // NOTE: MGL version show much more variants of loops and conditions.
        gr->Title("MGL parser sample");
        double a[100];   // let a_i = sin(4*pi*x), x=0...1
-       for(int i=0;i<100;i++)a[i]=sin(4*M_PI*i/99);
+       for(int i=0;i<100;i++)a[i]=sin(2*M_PI*i/99);
        mglParse *parser = new mglParse;
+       // Add MGL variable and set yours data to it.
        mglData *d = dynamic_cast<mglData*>(parser->AddVar("dat"));
-       if(d)   d->Set(a,100); // set data to variable
-       parser->Execute(gr, "plot dat; xrange 0 1\nbox\naxis");
-       // you may break script at any line do something
-       // and continue after that
+       if(d)   d->Set(a,100);
+       parser->Execute(gr, "plot dat; xrange -1 0\nbox\naxis");
+       // You may break script at any line do something
+       // and continue after that.
        parser->Execute(gr, "xlabel 'x'\nylabel 'y'\nbox");
-       // also you may use cycles or conditions in script
+       // Also you may use cycles or conditions in script.
        parser->Execute(gr, "for $0 -1 1 0.1\nif $0<0\n"
-               "line 0 0 -1 $0 'r':else:line 0 0 -1 $0 'g'\n"
+               "line 0 0 1 $0 'r':else:line 0 0 1 $0 'g'\n"
                "endif\nnext");
+       // You may use for or do-while loops as C/C++ one
+       double i=1;
+       do      {
+               char buf[64];   sprintf(buf,"line 0 0 %g 1 'b'",i);
+               parser->Execute(gr, buf);       i=i-0.2;
+       } while(i>0);
+       // or as MGL one.
+       parser->Execute(gr, "for $i -1 1 0.5\n"
+               "if $i<0\ntext 1.1 $i '$i' 'b'\n"
+               "elseif $i>0\ntext 1.1 $i '$i' 'r'\n"
+               "else\ntext 1.1 $i '$i'\nendif\nnext\n");
+       // There are 'break' and 'continue' commands in MGL too.
+       // NOTE: 'next' act as "while(1)" in do-while loops.
+       parser->Execute(gr, "do\ndefnum $i $i-0.2\n"
+               "if $i<-1 then break\nline 0 0 $i 1 'm'\nnext\n");
+       // One issue with 'continue' -- it bypass 'while' checking
+       parser->Execute(gr, "for $i -5 10\ntext $i/5 1.1 'a'+($i+5)\nif $i<0\n"
+               "text $i/5-0.06 1.1 '--' 'b'\n"
+               "elseif mod($i,2)=0\ntext $i/5-0.06 1.1 '~' 'r'\n"
+               "else\ncontinue\nendif\n"
+               // NOTE: 'while' limit the actual number of iterations in for-loop.
+               "while $i<5\n");
+       // Finally, MGL support nested loops too.
+       parser->Execute(gr, "for $i 0 1 0.1\nfor $j 0 1 0.1\nball $i $j\n"
+               "if $j>0.5 then continue\nball $i $j 'b+'\nnext\nnext\n");
+       // Clean up memory.
        delete parser;
 }
 //-----------------------------------------------------------------------------
@@ -1786,24 +1827,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";
@@ -1863,12 +1906,12 @@ void smgl_fit(mglGraph *gr)     // nonlinear fitting
 //     gr->SetRanges(mglPoint(-1,-1,-1),mglPoint(1,1,1));      gr->SetOrigin(0,0,0);
 }
 //-----------------------------------------------------------------------------
-const char *mmgl_vecta="call 'prepare3v'\nsubplot 2 1 0:title 'Vect3 sample':rotate 50 60\n"
+const char *mmgl_vect3="call 'prepare3v'\nsubplot 2 1 0:title 'Vect3 sample':rotate 50 60\n"
 "origin 0 0 0:box:axis '_xyz'\nvect3 ex ey ez 'x':vect3 ex ey ez:vect3 ex ey ez 'z'\n"
 "subplot 2 1 1:title '\"f\" style':rotate 50 60\n"
 "origin 0 0 0:box:axis '_xyz'\nvect3 ex ey ez 'fx':vect3 ex ey ez 'f':vect3 ex ey ez 'fz'\n"
 "grid3 ex 'Wx':grid3 ex 'W':grid3 ex 'Wz'";
-void smgl_vecta(mglGraph *gr)
+void smgl_vect3(mglGraph *gr)
 {
        mglData ex,ey,ez;       mgls_prepare3v(&ex,&ey,&ez);
        if(big!=3)      {       gr->SubPlot(2,1,0);     gr->Title("Vect3 sample");      }
@@ -1894,9 +1937,12 @@ void smgl_vect(mglGraph *gr)
        gr->Box();      gr->Vect(a,b);
        if(big==3)      return;
        gr->SubPlot(3,2,1,"");  gr->Title("'.' style; '=' style");      gr->Box();      gr->Vect(a,b,"=.");
-       gr->SubPlot(3,2,2,"");  gr->Title("'f' style"); gr->Box();      gr->Vect(a,b,"f");
-       gr->SubPlot(3,2,3,"");  gr->Title("'>' style"); gr->Box();      gr->Vect(a,b,">");
-       gr->SubPlot(3,2,4,"");  gr->Title("'<' style"); gr->Box();      gr->Vect(a,b,"<");
+       gr->SubPlot(3,2,2,"");  gr->Title("'f' style");
+       gr->Box();      gr->Vect(a,b,"f");
+       gr->SubPlot(3,2,3,"");  gr->Title("'>' style");
+       gr->Box();      gr->Vect(a,b,">");
+       gr->SubPlot(3,2,4,"");  gr->Title("'<' style");
+       gr->Box();      gr->Vect(a,b,"<");
        mglData ex,ey,ez;       mgls_prepare3v(&ex,&ey,&ez);
        gr->SubPlot(3,2,5);     gr->Title("3d variant");        gr->Rotate(50,60);
        gr->Box();      gr->Vect(ex,ey,ez);
@@ -1904,7 +1950,7 @@ void smgl_vect(mglGraph *gr)
 //-----------------------------------------------------------------------------
 const char *mmgl_flow="call 'prepare2v'\ncall 'prepare3v'\nsubplot 2 2 0 '':title 'Flow plot (default)':box:flow a b\n"
 "subplot 2 2 1 '':title '\"v\" style':box:flow a b 'v'\n"
-"subplot 2 2 2 '':title 'from edges only':box:flow a b '#'\n"
+"subplot 2 2 2 '':title '\"#\" and \".\" styles':box:flow a b '#':flow a b '.2k'\n"
 "subplot 2 2 3:title '3d variant':rotate 50 60:box:flow ex ey ez";
 void smgl_flow(mglGraph *gr)
 {
@@ -1912,13 +1958,34 @@ void smgl_flow(mglGraph *gr)
        if(big!=3)      {gr->SubPlot(2,2,0,""); gr->Title("Flow plot (default)");}
        gr->Box();      gr->Flow(a,b);
        if(big==3)      return;
-       gr->SubPlot(2,2,1,"");  gr->Title("'v' style"); gr->Box();      gr->Flow(a,b,"v");
-       gr->SubPlot(2,2,2,"");  gr->Title("'\\#' style");       gr->Box();      gr->Flow(a,b,"#");
+       gr->SubPlot(2,2,1,"");  gr->Title("'v' style");
+       gr->Box();      gr->Flow(a,b,"v");
+       gr->SubPlot(2,2,2,"");  gr->Title("'\\#' and '.' styles");
+       gr->Box();      gr->Flow(a,b,"#");      gr->Flow(a,b,".2k");
        mglData ex,ey,ez;       mgls_prepare3v(&ex,&ey,&ez);
        gr->SubPlot(2,2,3);     gr->Title("3d variant");        gr->Rotate(50,60);
        gr->Box();      gr->Flow(ex,ey,ez);
 }
 //-----------------------------------------------------------------------------
+const char *mmgl_flow3="call 'prepare3v'\n"
+"subplot 2 2 0:title 'Flow3 plot (default)':rotate 50 60:box\nflow3 ex ey ez\n"
+"subplot 2 2 1:title '\"v\" style, from boundary':rotate 50 60:box\nflow3 ex ey ez 'v' 0\n"
+"subplot 2 2 2:title '\"t\" style':rotate 50 60:box\nflow3 ex ey ez 't' 0\n"
+"subplot 2 2 3:title 'from \\i z planes':rotate 50 60:box\nflow3 ex ey ez 'z' 0\nflow3 ex ey ez 'z' 9";
+void smgl_flow3(mglGraph *gr)
+{
+       mglData ex,ey,ez;       mgls_prepare3v(&ex,&ey,&ez);
+       if(big!=3)      {gr->SubPlot(2,2,0);    gr->Title("Flow3 plot (default)");}
+       gr->Rotate(50,60);      gr->Box();              gr->Flow3(ex,ey,ez);
+       if(big==3)      return;
+       gr->SubPlot(2,2,1);     gr->Title("'v' style, from boundary");
+       gr->Rotate(50,60);      gr->Box();      gr->Flow3(ex,ey,ez,"v",0);
+       gr->SubPlot(2,2,2);     gr->Title("'t' style");
+       gr->Rotate(50,60);      gr->Box();      gr->Flow3(ex,ey,ez,"t",0);
+       gr->SubPlot(2,2,3);     gr->Title("from \\i z planes");
+       gr->Rotate(50,60);      gr->Box();      gr->Flow3(ex,ey,ez,"z",0);      gr->Flow3(ex,ey,ez,"z",9);
+}
+//-----------------------------------------------------------------------------
 const char *mmgl_pipe="call 'prepare2v'\ncall 'prepare3v'\nsubplot 2 2 0 '':title 'Pipe plot (default)':light on:box:pipe a b\n"
 "subplot 2 2 1 '':title '\"i\" style':box:pipe a b 'i'\n"
 "subplot 2 2 2 '':title 'from edges only':box:pipe a b '#'\n"
@@ -2091,7 +2158,7 @@ void smgl_axis(mglGraph *gr)
        gr->InPlot(0,0.5,0,0.5);        gr->SetRanges(1,0,4,0); gr->FPlot("4*x^2");
 }
 //-----------------------------------------------------------------------------
-const char *mmgl_ticks="subplot 3 3 0:title 'Usual axis'\naxis\n\n"
+const char *mmgl_ticks="subplot 3 3 0:title 'Usual axis with \":\" style'\naxis ':'\n\n"
 "subplot 3 3 1:title 'Too big/small range'\nranges -1000 1000 0 0.001:axis\n\n"
 "subplot 3 3 2:title 'LaTeX-like labels'\naxis 'F!'\n\n"
 "subplot 3 3 3:title 'Too narrow range'\nranges 100 100.1 10 10.01:axis\n\n"
@@ -2103,12 +2170,12 @@ const char *mmgl_ticks="subplot 3 3 0:title 'Usual axis'\naxis\n\n"
 "subplot 3 3 7:title 'Manual ticks'\nranges -pi pi 0 2\n"
 "xtick pi 3 '\\pi'\nxtick 0.886 'x^*' on # note this will disable subticks drawing\n"
 "# or you can use\n#xtick -pi '\\pi' -pi/2 '-\\pi/2' 0 '0' 0.886 'x^*' pi/2 '\\pi/2' pi 'pi'\n"
-"# or you can use\n#list v -pi -pi/2 0 0.886 pi/2 pi:xtick v '-\\pi\\n-\\pi/2\\n{}0\\n{}x^*\\n\\pi/2\\n\\pi'\n"
+"list v 0 0.5 1 2:ytick v '0\n0.5\n1\n2'\n"
 "axis:grid:fplot '2*cos(x^2)^2' 'r2'\n\n"
 "subplot 3 3 8:title 'Time ticks'\nxrange 0 3e5:ticktime 'x':axis";
 void smgl_ticks(mglGraph *gr)
 {
-       gr->SubPlot(3,3,0);     gr->Title("Usual axis");        gr->Axis();
+       gr->SubPlot(3,3,0);     gr->Title("Usual axis with ':' style"); gr->Axis(":");
        gr->SubPlot(3,3,1);     gr->Title("Too big/small range");
        gr->SetRanges(-1000,1000,0,0.001);      gr->Axis();
        gr->SubPlot(3,3,2);     gr->Title("LaTeX-like labels");
@@ -2128,8 +2195,8 @@ void smgl_ticks(mglGraph *gr)
        gr->SubPlot(3,3,7);     gr->Title("Manual ticks");      gr->SetRanges(-M_PI,M_PI, 0, 2);
        gr->SetTicks('x',M_PI,0,0,"\\pi");      gr->AddTick('x',0.886,"x^*");
        // alternatively you can use following lines
-       //double val[]={-M_PI, -M_PI/2, 0, 0.886, M_PI/2, M_PI};
-       //gr->SetTicksVal('x', mglData(6,val), "-\\pi\n-\\pi/2\n0\nx^*\n\\pi/2\n\\pi");
+       double val[]={0, 0.5, 1, 2};
+       gr->SetTicksVal('y', mglData(4,val), "0\n0.5\n1\n2");
        gr->Axis();     gr->Grid();     gr->FPlot("2*cos(x^2)^2", "r2");
        gr->SubPlot(3,3,8);     gr->Title("Time ticks");        gr->SetRange('x',0,3e5);
        gr->SetTicksTime('x',0);        gr->Axis();
@@ -2206,13 +2273,17 @@ const char *mmgl_primitives="subplot 2 2 0 '':title 'Line, Curve, Rhomb, Ellipse
 "line -1 -1 -0.5 1 'qAI'\ncurve -0.6 -1 1 1 0 1 1 1 'rA'\nball 0 -0.5 '*':ball 1 -0.1 '*'\n"
 "rhomb 0 0.4 1 0.9 0.2 'b#'\nrhomb 0 0 1 0.4 0.2 'cg@'\n"
 "ellipse 0 -0.5 1 -0.1 0.2 'u#'\nellipse 0 -1 1 -0.6 0.2 'm@'\n\n"
-"light on\nsubplot 2 2 1:title 'Face[xyz]':rotate 50 60:box\n"
+"subplot 2 3 1 '':title 'Arc, Polygon, Symbol';size -1.2\n"
+"arc -0.6 0 -0.6 0.3 180 '2kA':ball -0.6 0\npolygon 0 0 0 0.4 6 'r'\n"
+"new x 50 'cos(3*pi*x)':new y 50 'sin(pi*x)'\n"
+"addsymbol 'a' x y\nsymbol 0.7 0 'a'\n\n"
+"light on\nsubplot 2 3 3 '<^>' 0 -0.2:title 'Face[xyz]';size -1.5:rotate 50 60:box\n"
 "facex 1 0 -1 1 1 'r':facey -1 -1 -1 1 1 'g':facez 1 -1 -1 -1 1 'b'\n"
 "face -1 -1 1 -1 1 1 1 -1 0 1 1 1 'bmgr'\n\n"
-"subplot 2 2 3 '':title 'Cone'\n"
-"cone -0.7 -0.3 0 -0.7 0.7 0.5 0.2 0.1 'b':text -0.7 -0.7 'no edges\\n(default)'\n"
-"cone 0 -0.3 0 0 0.7 0.5 0.2 0.1 'g@':text 0 -0.7 'with edges\\n('\\@' style)'\n"
-"cone 0.7 -0.3 0 0.7 0.7 0.5 0.2 0.1 'ry':text 0.7 -0.7 '\"arrow\" with\\n{}gradient'\n\n"
+"subplot 2 3 5 '':title 'Cone';size -1.5\n"
+"cone -0.7 -0.3 0 -0.7 0.7 0.5 0.2 0.1 'b':text -0.7 -0.7 'no edges\\n(default)';size -1.5\n"
+"cone 0 -0.3 0 0 0.7 0.5 0.2 0.1 'g@':text 0 -0.7 'with edges\\n(\"\\@\" style)';size -1.5\n"
+"cone 0.7 -0.3 0 0.7 0.7 0.5 0.2 0 'Ggb':text 0.7 -0.7 '\"arrow\" with\\n{}gradient';size -1.5\n"
 "subplot 2 2 2 '':title 'Sphere and Drop'\nline -0.9 0 1 0.9 0 1\n"
 "text -0.9 0.4 'sh=0':drop -0.9 0 0 1 0.5 'r' 0:ball -0.9 0 1 'k'\n"
 "text -0.3 0.6 'sh=0.33':drop -0.3 0 0 1 0.5 'r' 0.33:ball -0.3 0 1 'k'\n"
@@ -2233,20 +2304,27 @@ void smgl_primitives(mglGraph *gr)      // flag #
        gr->Ellipse(mglPoint(0,-1),mglPoint(1,-0.6),0.2,"m@");
        gr->Mark(mglPoint(0,-0.5),"*"); gr->Mark(mglPoint(1,-0.1),"*");
 
+       gr->SubPlot(2,3,1,"");  gr->Title("Arc, Polygon, Symbol","", -1.2*2);
+       gr->Arc(mglPoint(-0.6,0), mglPoint(-0.6,0.3), 180, "2kA");      gr->Ball(-0.6,0);
+       gr->Polygon(mglPoint(), mglPoint(0,0.4), 6, "r");
+       mglData x(50), y(50);   gr->Fill(x,"cos(3*pi*x)");      gr->Fill(y,"sin(pi*x)");
+       gr->DefineSymbol('a',x,y);      gr->Symbol(mglPoint(0.7),'a');
+
        gr->Light(true);
-       gr->SubPlot(2,2,1);     gr->Title("Face[xyz]"); gr->Rotate(50,60);      gr->Box();
+       gr->SubPlot(2,3,3,"<^>",0,-0.2);        gr->Title("Face[xyz]", "", -1.5*2);
+       gr->Rotate(50,60);      gr->Box();
        gr->FaceX(mglPoint(1,0,-1),1,1,"r");
        gr->FaceY(mglPoint(-1,-1,-1),1,1,"g");
        gr->FaceZ(mglPoint(1,-1,-1),-1,1,"b");
        gr->Face(mglPoint(-1,-1,1),mglPoint(-1,1,1),mglPoint(1,-1,0),mglPoint(1,1,1),"bmgr");
 
-       gr->SubPlot(2,2,3,"");  gr->Title("Cone");
+       gr->SubPlot(2,3,5,"");  gr->Title("Cone", "", -1.5*2);
        gr->Cone(mglPoint(-0.7,-0.3),mglPoint(-0.7,0.7,0.5),0.2,0.1,"b");
-       gr->Puts(mglPoint(-0.7,-0.7),"no edges\n(default)");
+       gr->Puts(mglPoint(-0.7,-0.7),"no edges\n(default)","", -1.5);
        gr->Cone(mglPoint(0,-0.3),mglPoint(0,0.7,0.5),0.2,0.1,"g@");
-       gr->Puts(mglPoint(0,-0.7),"with edges\n('\\@' style)");
+       gr->Puts(mglPoint(0,-0.7),"with edges\n('\\@' style)","", -1.5);
        gr->Cone(mglPoint(0.7,-0.3),mglPoint(0.7,0.7,0.5),0.2,0,"ry");
-       gr->Puts(mglPoint(0.7,-0.7),"'arrow' with\ngradient");
+       gr->Puts(mglPoint(0.7,-0.7),"'arrow' with\ngradient","", -1.5);
 
        gr->SubPlot(2,2,2,"");  gr->Title("Sphere and Drop");   gr->Alpha(false);
        gr->Puts(mglPoint(-0.9,0.4),"sh=0");            gr->Ball(mglPoint(-0.9,0,1),'k');
@@ -2334,10 +2412,11 @@ void smgl_colorbar(mglGraph *gr)
 const char *mmgl_legend="addlegend 'sin(\\pi {x^2})' 'b':addlegend 'sin(\\pi x)' 'g*'\n"
 "addlegend 'sin(\\pi \\sqrt{x})' 'rd':addlegend 'jsut text' ' ':addlegend 'no indent for this' ''\n"
 "subplot 2 2 0 '':title 'Legend (default)':box:legend\n"
+"legend 1 0.5 '^':text 0.49 0.88 'Style \"\\^\"' 'A:L'\n"
 "legend 3 'A#':text 0.75 0.65 'Absolute position' 'A'\n"
 "subplot 2 2 2 '':title 'coloring':box:legend 0 'r#':legend 1 'Wb#':legend 2 'ygr#'\n"
 "subplot 2 2 3 '':title 'manual position':box\n"
-"legend 0.5 1:text 0.5 0.55 'at x=0.5, y=1' 'a'\n"
+"legend 0.5 1:text 0.5 0.5 'at x=0.5, y=1' 'a'\n"
 "legend 1 '#-':text 0.75 0.25 'Horizontal legend' 'a'";
 void smgl_legend(mglGraph *gr)
 {
@@ -2349,13 +2428,14 @@ void smgl_legend(mglGraph *gr)
        if(big!=3)      {gr->SubPlot(2,2,0,""); gr->Title("Legend (default)");}
        gr->Box();      gr->Legend();
        if(big==3)      return;
+       gr->Legend(1,0.5,"^");  gr->Puts(0.49, 0.88, "Style '\\^'","A:L");
        gr->Legend(3,"A#");
        gr->Puts(mglPoint(0.75,0.65),"Absolute position","A");
        gr->SubPlot(2,2,2,"");  gr->Title("coloring");  gr->Box();
        gr->Legend(0,"r#");     gr->Legend(1,"Wb#");    gr->Legend(2,"ygr#");
        gr->SubPlot(2,2,3,"");  gr->Title("manual position");   gr->Box();
        gr->Legend(0.5,1);
-       gr->Puts(mglPoint(0.5,0.55),"at x=0.5, y=1","a");
+       gr->Puts(mglPoint(0.5,0.5),"at x=0.5, y=1","a");
        gr->Legend(1,"#-");
        gr->Puts(mglPoint(0.75,0.25),"Horizontal legend","a");
 }
@@ -2782,129 +2862,703 @@ 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.51,-0.51] 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(1);        vals.a[0]=-0.51;
+       gr->ContP(vals, x,y,z,dat,"y");
+}
+//-----------------------------------------------------------------------------
+#define all_prims_str "subplot 3 2 0:define y 0.95\n\
+define d 0.3:define x0 0.2:define x1 0.5:define x2 0.6\n\
+line x0 1-0*d x1 1-0*d 'k-':text x2 y-0*d 'Solid `-`' ':rL'\n\
+line x0 1-1*d x1 1-1*d 'k|':text x2 y-1*d 'Long Dash `|`' ':rL'\n\
+line x0 1-2*d x1 1-2*d 'k;':text x2 y-2*d 'Dash 1;`' ':rL'\n\
+line x0 1-3*d x1 1-3*d 'k=':text x2 y-3*d 'Small dash `=`' ':rL'\n\
+line x0 1-4*d x1 1-4*d 'kj':text x2 y-4*d 'Dash-dot `j`' ':rL'\n\
+line x0 1-5*d x1 1-5*d 'ki':text x2 y-5*d 'Small dash-dot `i`' ':rL'\n\
+line x0 1-6*d x1 1-6*d 'k:':text x2 y-6*d 'Dots `:`' ':rL'\n\
+line x0 1-7*d x1 1-7*d 'k ':text x2 y-7*d 'None ``' ':rL'\n\
+define d 0.25:define x0 -0.8:define x1 -1:define x2 -0.05\n\
+ball x1 5*d 'k.':text x0 5*d '.' ':rL'\n\
+ball x1 4*d 'k+':text x0 4*d '+' ':rL'\n\
+ball x1 3*d 'kx':text x0 3*d 'x' ':rL'\n\
+ball x1 2*d 'k*':text x0 2*d '*' ':rL'\n\
+ball x1 d 'ks':text x0 d 's' ':rL'\n\
+ball x1 0 'kd':text x0 0 'd' ':rL'\n\
+ball x1 -d 0 'ko':text x0 y-d 'o' ':rL'\n\
+ball x1 -2*d 0 'k^':text x0 -2*d '\\^' ':rL'\n\
+ball x1 -3*d 0 'kv':text x0 -3*d 'v' ':rL'\n\
+ball x1 -4*d 0 'k<':text x0 -4*d '<' ':rL'\n\
+ball x1 -5*d 0 'k>':text x0 -5*d '>' ':rL'\n\n\
+define x0 -0.3:define x1 -0.5\n\
+ball x1 5*d 'k#.':text x0 5*d '\\#.' ':rL'\n\
+ball x1 4*d 'k#+':text x0 4*d '\\#+' ':rL'\n\
+ball x1 3*d 'k#x':text x0 3*d '\\#x' ':rL'\n\
+ball x1 2*d 'k#*':text x0 2*d '\\#*' ':rL'\n\
+ball x1 d 'k#s':text x0 d '\\#s' ':rL'\n\
+ball x1 0 'k#d':text x0 0 '\\#d' ':rL'\n\
+ball x1 -d 0 'k#o':text x0 -d '\\#o' ':rL'\n\
+ball x1 -2*d 0 'k#^':text x0 -2*d '\\#\\^' ':rL'\n\
+ball x1 -3*d 0 'k#v':text x0 -3*d '\\#v' ':rL'\n\
+ball x1 -4*d 0 'k#<':text x0 -4*d '\\#<' ':rL'\n\
+ball x1 -5*d 0 'k#>':text x0 -5*d '\\#>' ':rL'\n\n\
+subplot 3 2 1\ndefine a 0.1:define b 0.4:define c 0.5\n\
+line a 1 b 1 'k-A':text c 1 'Style `A` or `A\\_`' ':rL'\n\
+line a 0.8 b 0.8 'k-V':text c 0.8 'Style `V` or `V\\_`' ':rL'\n\
+line a 0.6 b 0.6 'k-K':text c 0.6 'Style `K` or `K\\_`' ':rL'\n\
+line a 0.4 b 0.4 'k-I':text c 0.4 'Style `I` or `I\\_`' ':rL'\n\
+line a 0.2 b 0.2 'k-D':text c 0.2 'Style `D` or `D\\_`' ':rL'\n\
+line a 0 b 0 'k-S':text c 0 'Style `S` or `S\\_`' ':rL'\n\
+line a -0.2 b -0.2 'k-O':text c -0.2 'Style `O` or `O\\_`' ':rL'\n\
+line a -0.4 b -0.4 'k-T':text c -0.4 'Style `T` or `T\\_`' ':rL'\n\
+line a -0.6 b -0.6 'k-_':text c -0.6 'Style `\\_` or none' ':rL'\n\
+line a -0.8 b -0.8 'k-AS':text c -0.8 'Style `AS`' ':rL'\n\
+line a -1 b -1 'k-_A':text c -1 'Style `\\_A`' ':rL'\n\n\
+define a -1:define b -0.7:define c -0.6\n\
+line a 1 b 1 'kAA':text c 1 'Style `AA`' ':rL'\n\
+line a 0.8 b 0.8 'kVV':text c 0.8 'Style `VV`' ':rL'\n\
+line a 0.6 b 0.6 'kKK':text c 0.6 'Style `KK`' ':rL'\n\
+line a 0.4 b 0.4 'kII':text c 0.4 'Style `II`' ':rL'\n\
+line a 0.2 b 0.2 'kDD':text c 0.2 'Style `DD`' ':rL'\n\
+line a 0 b 0 'kSS':text c 0 'Style `SS`' ':rL'\n\
+line a -0.2 b -0.2 'kOO':text c -0.2 'Style `OO`' ':rL'\n\
+line a -0.4 b -0.4 'kTT':text c -0.4 'Style `TT`' ':rL'\n\
+line a -0.6 b -0.6 'k-__':text c -0.6 'Style `\\_\\_`' ':rL'\n\
+line a -0.8 b -0.8 'k-VA':text c -0.8 'Style `VA`' ':rL'\n\
+line a -1 b -1 'k-AV':text c -1 'Style `AV`' ':rL'\n\n\
+subplot 3 2 2\n#LENUQ\n\n\
+facez -1 -1 0 0.4 0.3 'L#':text -0.8 -0.9 'L' 'w:C' -1.4\n\
+facez -0.6 -1 0 0.4 0.3 'E#':text -0.4 -0.9 'E' 'w:C' -1.4\n\
+facez -0.2 -1 0 0.4 0.3 'N#':text 0 -0.9 'N' 'w:C' -1.4\n\
+facez 0.2 -1 0 0.4 0.3 'U#':text 0.4 -0.9 'U' 'w:C' -1.4\n\
+facez 0.6 -1 0 0.4 0.3 'Q#':text 0.8 -0.9 'Q' 'w:C' -1.4\n\
+#lenuq\nfacez -1 -0.7 0 0.4 0.3 'l#':text -0.8 -0.6 'l' 'k:C' -1.4\n\
+facez -0.6 -0.7 0 0.4 0.3 'e#':text -0.4 -0.6 'e' 'k:C' -1.4\n\
+facez -0.2 -0.7 0 0.4 0.3 'n#':text 0 -0.6 'n' 'k:C' -1.4\n\
+facez 0.2 -0.7 0 0.4 0.3 'u#':text 0.4 -0.6 'u' 'k:C' -1.4\n\
+facez 0.6 -0.7 0 0.4 0.3 'q#':text 0.8 -0.6 'q' 'k:C' -1.4\n\
+#CMYkP\nfacez -1 -0.4 0 0.4 0.3 'C#':text -0.8 -0.3 'C' 'w:C' -1.4\n\
+facez -0.6 -0.4 0 0.4 0.3 'M#':text -0.4 -0.3 'M' 'w:C' -1.4\n\
+facez -0.2 -0.4 0 0.4 0.3 'Y#':text 0 -0.3 'Y' 'w:C' -1.4\n\
+facez 0.2 -0.4 0 0.4 0.3 'k#':text 0.4 -0.3 'k' 'w:C' -1.4\n\
+facez 0.6 -0.4 0 0.4 0.3 'P#':text 0.8 -0.3 'P' 'w:C' -1.4\n\
+#cmywp\nfacez -1 -0.1 0 0.4 0.3 'c#':text -0.8 0 'c' 'k:C' -1.4\n\
+facez -0.6 -0.1 0 0.4 0.3 'm#':text -0.4 0 'm' 'k:C' -1.4\n\
+facez -0.2 -0.1 0 0.4 0.3 'y#':text 0 0 'y' 'k:C' -1.4\n\
+facez 0.2 -0.1 0 0.4 0.3 'w#':text 0.4 0 'w' 'k:C' -1.4\n\
+facez 0.6 -0.1 0 0.4 0.3 'p#':text 0.8 0 'p' 'k:C' -1.4\n\
+#BGRHW\nfacez -1 0.2 0 0.4 0.3 'B#':text -0.8 0.3 'B' 'w:C' -1.4\n\
+facez -0.6 0.2 0 0.4 0.3 'G#':text -0.4 0.3 'G' 'w:C' -1.4\n\
+facez -0.2 0.2 0 0.4 0.3 'R#':text 0 0.3 'R' 'w:C' -1.4\n\
+facez 0.2 0.2 0 0.4 0.3 'H#':text 0.4 0.3 'H' 'w:C' -1.4\n\
+facez 0.6 0.2 0 0.4 0.3 'W#':text 0.8 0.3 'W' 'w:C' -1.4\n\
+#bgrhw\nfacez -1 0.5 0 0.4 0.3 'b#':text -0.8 0.6 'b' 'k:C' -1.4\n\
+facez -0.6 0.5 0 0.4 0.3 'g#':text -0.4 0.6 'g' 'k:C' -1.4\n\
+facez -0.2 0.5 0 0.4 0.3 'r#':text 0 0.6 'r' 'k:C' -1.4\n\
+facez 0.2 0.5 0 0.4 0.3 'h#':text 0.4 0.6 'h' 'k:C' -1.4\n\
+facez 0.6 0.5 0 0.4 0.3 'w#':text 0.8 0.6 'w' 'k:C' -1.4\n\
+#brighted\nfacez -1 0.8 0 0.4 0.3 '{r1}#':text -0.8 0.9 '\\{r1\\}' 'w:C' -1.4\n\
+facez -0.6 0.8 0 0.4 0.3 '{r3}#':text -0.4 0.9 '\\{r3\\}' 'w:C' -1.4\n\
+facez -0.2 0.8 0 0.4 0.3 '{r5}#':text 0 0.9 '\\{r5\\}' 'k:C' -1.4\n\
+facez 0.2 0.8 0 0.4 0.3 '{r7}#':text 0.4 0.9 '\\{r7\\}' 'k:C' -1.4\n\
+facez 0.6 0.8 0 0.4 0.3 '{r9}#':text 0.8 0.9 '\\{r9\\}' 'k:C' -1.4\n\
+# HEX\nfacez -1 -1.3 0 1 0.3 '{xff9966}#':text -0.5 -1.2 '\\{xff9966\\}' 'k:C' -1.4\n\
+facez 0 -1.3 0 1 0.3 '{x83CAFF}#':text 0.5 -1.2 '\\{x83caff\\}' 'k:C' -1.4\n\n\
+subplot 3 2 3\nfor $i 0 9\nline -1 0.2*$i-1 1 0.2*$i-1 'r','0'+$i\n\
+text 1.05 0.2*$i-1 '0'+$i ':L'\nnext\n\n\
+subplot 3 2 4:title 'TriPlot sample':rotate 50 60\n\
+list tt 0 1 2 | 0 1 3 | 0 2 3 | 1 2 3\n\
+list xt -1 1 0 0:list yt -1 -1 1 0:list zt -1 -1 -1 1:light on\n\
+triplot tt xt yt zt 'b':triplot tt xt yt zt 'k#'\n\n\
+subplot 3 2 5:new r 4 'i+1':ranges 1 4 1 4\naxis:mark r r 's':plot r 'b'\n"
+void all_prims(mglGraph *gr)   // test drawing of all kinds
+{
+       gr->SubPlot(3,2,0);
+       double d,x1,x2,x0,y=0.95;
+       d=0.3, x0=0.2, x1=0.5, x2=0.6;
+       gr->Line(mglPoint(x0,1-0*d),mglPoint(x1,1-0*d),"k-");   gr->Puts(mglPoint(x2,y-0*d),"Solid '-'",":rL");
+       gr->Line(mglPoint(x0,1-1*d),mglPoint(x1,1-1*d),"k|");   gr->Puts(mglPoint(x2,y-1*d),"Long Dash '|'",":rL");
+       gr->Line(mglPoint(x0,1-2*d),mglPoint(x1,1-2*d),"k;");   gr->Puts(mglPoint(x2,y-2*d),"Dash ';'",":rL");
+       gr->Line(mglPoint(x0,1-3*d),mglPoint(x1,1-3*d),"k=");   gr->Puts(mglPoint(x2,y-3*d),"Small dash '='",":rL");
+       gr->Line(mglPoint(x0,1-4*d),mglPoint(x1,1-4*d),"kj");   gr->Puts(mglPoint(x2,y-4*d),"Dash-dot 'j'",":rL");
+       gr->Line(mglPoint(x0,1-5*d),mglPoint(x1,1-5*d),"ki");   gr->Puts(mglPoint(x2,y-5*d),"Small dash-dot 'i'",":rL");
+       gr->Line(mglPoint(x0,1-6*d),mglPoint(x1,1-6*d),"k:");   gr->Puts(mglPoint(x2,y-6*d),"Dots ':'",":rL");
+       gr->Line(mglPoint(x0,1-7*d),mglPoint(x1,1-7*d),"k ");   gr->Puts(mglPoint(x2,y-7*d),"None ' '",":rL");
+
+       d=0.25; x1=-1; x0=-0.8; y = -0.05;
+       gr->Mark(mglPoint(x1,5*d),"k.");        gr->Puts(mglPoint(x0,y+5*d),"'.'",":rL");
+       gr->Mark(mglPoint(x1,4*d),"k+");        gr->Puts(mglPoint(x0,y+4*d),"'+'",":rL");
+       gr->Mark(mglPoint(x1,3*d),"kx");        gr->Puts(mglPoint(x0,y+3*d),"'x'",":rL");
+       gr->Mark(mglPoint(x1,2*d),"k*");        gr->Puts(mglPoint(x0,y+2*d),"'*'",":rL");
+       gr->Mark(mglPoint(x1,d),"ks");          gr->Puts(mglPoint(x0,y+d),"'s'",":rL");
+       gr->Mark(mglPoint(x1,0),"kd");          gr->Puts(mglPoint(x0,y),"'d'",":rL");
+       gr->Mark(mglPoint(x1,-d,0),"ko");       gr->Puts(mglPoint(x0,y-d),"'o'",":rL");
+       gr->Mark(mglPoint(x1,-2*d,0),"k^");     gr->Puts(mglPoint(x0,y-2*d),"'\\^'",":rL");
+       gr->Mark(mglPoint(x1,-3*d,0),"kv");     gr->Puts(mglPoint(x0,y-3*d),"'v'",":rL");
+       gr->Mark(mglPoint(x1,-4*d,0),"k<");     gr->Puts(mglPoint(x0,y-4*d),"'<'",":rL");
+       gr->Mark(mglPoint(x1,-5*d,0),"k>");     gr->Puts(mglPoint(x0,y-5*d),"'>'",":rL");
+
+       d=0.25; x1=-0.5; x0=-0.3;       y = -0.05;
+       gr->Mark(mglPoint(x1,5*d),"k#.");       gr->Puts(mglPoint(x0,y+5*d),"'\\#.'",":rL");
+       gr->Mark(mglPoint(x1,4*d),"k#+");       gr->Puts(mglPoint(x0,y+4*d),"'\\#+'",":rL");
+       gr->Mark(mglPoint(x1,3*d),"k#x");       gr->Puts(mglPoint(x0,y+3*d),"'\\#x'",":rL");
+       gr->Mark(mglPoint(x1,2*d),"k#*");       gr->Puts(mglPoint(x0,y+2*d),"'\\#*'",":rL");
+       gr->Mark(mglPoint(x1,d),"k#s");         gr->Puts(mglPoint(x0,y+d),"'\\#s'",":rL");
+       gr->Mark(mglPoint(x1,0),"k#d");         gr->Puts(mglPoint(x0,y),"'\\#d'",":rL");
+       gr->Mark(mglPoint(x1,-d,0),"k#o");      gr->Puts(mglPoint(x0,y-d),"'\\#o'",":rL");
+       gr->Mark(mglPoint(x1,-2*d,0),"k#^");    gr->Puts(mglPoint(x0,y-2*d),"'\\#\\^'",":rL");
+       gr->Mark(mglPoint(x1,-3*d,0),"k#v");    gr->Puts(mglPoint(x0,y-3*d),"'\\#v'",":rL");
+       gr->Mark(mglPoint(x1,-4*d,0),"k#<");    gr->Puts(mglPoint(x0,y-4*d),"'\\#<'",":rL");
+       gr->Mark(mglPoint(x1,-5*d,0),"k#>");    gr->Puts(mglPoint(x0,y-5*d),"'\\#>'",":rL");
+
+       gr->SubPlot(3,2,1);
+       double a=0.1,b=0.4,c=0.5;
+       gr->Line(mglPoint(a,1),mglPoint(b,1),"k-A");            gr->Puts(mglPoint(c,1),"Style 'A' or 'A\\_'",":rL");
+       gr->Line(mglPoint(a,0.8),mglPoint(b,0.8),"k-V");        gr->Puts(mglPoint(c,0.8),"Style 'V' or 'V\\_'",":rL");
+       gr->Line(mglPoint(a,0.6),mglPoint(b,0.6),"k-K");        gr->Puts(mglPoint(c,0.6),"Style 'K' or 'K\\_'",":rL");
+       gr->Line(mglPoint(a,0.4),mglPoint(b,0.4),"k-I");        gr->Puts(mglPoint(c,0.4),"Style 'I' or 'I\\_'",":rL");
+       gr->Line(mglPoint(a,0.2),mglPoint(b,0.2),"k-D");        gr->Puts(mglPoint(c,0.2),"Style 'D' or 'D\\_'",":rL");
+       gr->Line(mglPoint(a,0),mglPoint(b,0),"k-S");            gr->Puts(mglPoint(c,0),"Style 'S' or 'S\\_'",":rL");
+       gr->Line(mglPoint(a,-0.2),mglPoint(b,-0.2),"k-O");      gr->Puts(mglPoint(c,-0.2),"Style 'O' or 'O\\_'",":rL");
+       gr->Line(mglPoint(a,-0.4),mglPoint(b,-0.4),"k-T");      gr->Puts(mglPoint(c,-0.4),"Style 'T' or 'T\\_'",":rL");
+       gr->Line(mglPoint(a,-0.6),mglPoint(b,-0.6),"k-_");      gr->Puts(mglPoint(c,-0.6),"Style '\\_' or none",":rL");
+       gr->Line(mglPoint(a,-0.8),mglPoint(b,-0.8),"k-AS");     gr->Puts(mglPoint(c,-0.8),"Style 'AS'",":rL");
+       gr->Line(mglPoint(a,-1),mglPoint(b,-1),"k-_A");         gr->Puts(mglPoint(c,-1),"Style '\\_A'",":rL");
+
+       a=-1;   b=-0.7; c=-0.6;
+       gr->Line(mglPoint(a,1),mglPoint(b,1),"kAA");            gr->Puts(mglPoint(c,1),"Style 'AA'",":rL");
+       gr->Line(mglPoint(a,0.8),mglPoint(b,0.8),"kVV");        gr->Puts(mglPoint(c,0.8),"Style 'VV'",":rL");
+       gr->Line(mglPoint(a,0.6),mglPoint(b,0.6),"kKK");        gr->Puts(mglPoint(c,0.6),"Style 'KK'",":rL");
+       gr->Line(mglPoint(a,0.4),mglPoint(b,0.4),"kII");        gr->Puts(mglPoint(c,0.4),"Style 'II'",":rL");
+       gr->Line(mglPoint(a,0.2),mglPoint(b,0.2),"kDD");        gr->Puts(mglPoint(c,0.2),"Style 'DD'",":rL");
+       gr->Line(mglPoint(a,0),mglPoint(b,0),"kSS");            gr->Puts(mglPoint(c,0),"Style 'SS'",":rL");
+       gr->Line(mglPoint(a,-0.2),mglPoint(b,-0.2),"kOO");      gr->Puts(mglPoint(c,-0.2),"Style 'OO'",":rL");
+       gr->Line(mglPoint(a,-0.4),mglPoint(b,-0.4),"kTT");      gr->Puts(mglPoint(c,-0.4),"Style 'TT'",":rL");
+       gr->Line(mglPoint(a,-0.6),mglPoint(b,-0.6),"k-__");     gr->Puts(mglPoint(c,-0.6),"Style '\\_\\_'",":rL");
+       gr->Line(mglPoint(a,-0.8),mglPoint(b,-0.8),"k-VA");     gr->Puts(mglPoint(c,-0.8),"Style 'VA'",":rL");
+       gr->Line(mglPoint(a,-1),mglPoint(b,-1),"k-AV");         gr->Puts(mglPoint(c,-1),"Style 'AV'",":rL");
+
+       gr->SubPlot(3,2,2);
+       //#LENUQ
+       gr->FaceZ(mglPoint(-1,  -1), 0.4, 0.3, "L#");   gr->Puts(mglPoint(-0.8,-0.9), "L", "w:C", -1.4);
+       gr->FaceZ(mglPoint(-0.6,-1), 0.4, 0.3, "E#");   gr->Puts(mglPoint(-0.4,-0.9), "E", "w:C", -1.4);
+       gr->FaceZ(mglPoint(-0.2,-1), 0.4, 0.3, "N#");   gr->Puts(mglPoint(0,  -0.9), "N", "w:C", -1.4);
+       gr->FaceZ(mglPoint(0.2, -1), 0.4, 0.3, "U#");   gr->Puts(mglPoint(0.4,-0.9), "U", "w:C", -1.4);
+       gr->FaceZ(mglPoint(0.6, -1), 0.4, 0.3, "Q#");   gr->Puts(mglPoint(0.8,-0.9), "Q", "w:C", -1.4);
+       //#lenuq
+       gr->FaceZ(mglPoint(-1,  -0.7), 0.4, 0.3, "l#"); gr->Puts(mglPoint(-0.8,-0.6), "l", "k:C", -1.4);
+       gr->FaceZ(mglPoint(-0.6,-0.7), 0.4, 0.3, "e#"); gr->Puts(mglPoint(-0.4,-0.6), "e", "k:C", -1.4);
+       gr->FaceZ(mglPoint(-0.2,-0.7), 0.4, 0.3, "n#"); gr->Puts(mglPoint(0,  -0.6), "n", "k:C", -1.4);
+       gr->FaceZ(mglPoint(0.2, -0.7), 0.4, 0.3, "u#"); gr->Puts(mglPoint(0.4,-0.6), "u", "k:C", -1.4);
+       gr->FaceZ(mglPoint(0.6, -0.7), 0.4, 0.3, "q#"); gr->Puts(mglPoint(0.8,-0.6), "q", "k:C", -1.4);
+       //#CMYkP
+       gr->FaceZ(mglPoint(-1,  -0.4), 0.4, 0.3, "C#"); gr->Puts(mglPoint(-0.8,-0.3), "C", "w:C", -1.4);
+       gr->FaceZ(mglPoint(-0.6,-0.4), 0.4, 0.3, "M#"); gr->Puts(mglPoint(-0.4,-0.3), "M", "w:C", -1.4);
+       gr->FaceZ(mglPoint(-0.2,-0.4), 0.4, 0.3, "Y#"); gr->Puts(mglPoint(0,  -0.3), "Y", "w:C", -1.4);
+       gr->FaceZ(mglPoint(0.2, -0.4), 0.4, 0.3, "k#"); gr->Puts(mglPoint(0.4,-0.3), "k", "w:C", -1.4);
+       gr->FaceZ(mglPoint(0.6, -0.4), 0.4, 0.3, "P#"); gr->Puts(mglPoint(0.8,-0.3), "P", "w:C", -1.4);
+       //#cmywp
+       gr->FaceZ(mglPoint(-1,  -0.1), 0.4, 0.3, "c#"); gr->Puts(mglPoint(-0.8, 0), "c", "k:C", -1.4);
+       gr->FaceZ(mglPoint(-0.6,-0.1), 0.4, 0.3, "m#"); gr->Puts(mglPoint(-0.4, 0), "m", "k:C", -1.4);
+       gr->FaceZ(mglPoint(-0.2,-0.1), 0.4, 0.3, "y#"); gr->Puts(mglPoint(0,   0), "y", "k:C", -1.4);
+       gr->FaceZ(mglPoint(0.2, -0.1), 0.4, 0.3, "w#"); gr->Puts(mglPoint(0.4, 0), "w", "k:C", -1.4);
+       gr->FaceZ(mglPoint(0.6, -0.1), 0.4, 0.3, "p#"); gr->Puts(mglPoint(0.8, 0), "p", "k:C", -1.4);
+       //#BGRHW
+       gr->FaceZ(mglPoint(-1,  0.2), 0.4, 0.3, "B#");  gr->Puts(mglPoint(-0.8, 0.3), "B", "w:C", -1.4);
+       gr->FaceZ(mglPoint(-0.6,0.2), 0.4, 0.3, "G#");  gr->Puts(mglPoint(-0.4, 0.3), "G", "w:C", -1.4);
+       gr->FaceZ(mglPoint(-0.2,0.2), 0.4, 0.3, "R#");  gr->Puts(mglPoint(0,   0.3), "R", "w:C", -1.4);
+       gr->FaceZ(mglPoint(0.2, 0.2), 0.4, 0.3, "H#");  gr->Puts(mglPoint(0.4, 0.3), "H", "w:C", -1.4);
+       gr->FaceZ(mglPoint(0.6, 0.2), 0.4, 0.3, "W#");  gr->Puts(mglPoint(0.8, 0.3), "W", "w:C", -1.4);
+       //#bgrhw
+       gr->FaceZ(mglPoint(-1,  0.5), 0.4, 0.3, "b#");  gr->Puts(mglPoint(-0.8, 0.6), "b", "k:C", -1.4);
+       gr->FaceZ(mglPoint(-0.6,0.5), 0.4, 0.3, "g#");  gr->Puts(mglPoint(-0.4, 0.6), "g", "k:C", -1.4);
+       gr->FaceZ(mglPoint(-0.2,0.5), 0.4, 0.3, "r#");  gr->Puts(mglPoint(0,   0.6), "r", "k:C", -1.4);
+       gr->FaceZ(mglPoint(0.2, 0.5), 0.4, 0.3, "h#");  gr->Puts(mglPoint(0.4, 0.6), "h", "k:C", -1.4);
+       gr->FaceZ(mglPoint(0.6, 0.5), 0.4, 0.3, "w#");  gr->Puts(mglPoint(0.8, 0.6), "w", "k:C", -1.4);
+       //#brighted
+       gr->FaceZ(mglPoint(-1,  0.8), 0.4, 0.3, "{r1}#");       gr->Puts(mglPoint(-0.8, 0.9), "\\{r1\\}", "w:C", -1.4);
+       gr->FaceZ(mglPoint(-0.6,0.8), 0.4, 0.3, "{r3}#");       gr->Puts(mglPoint(-0.4, 0.9), "\\{r3\\}", "w:C", -1.4);
+       gr->FaceZ(mglPoint(-0.2,0.8), 0.4, 0.3, "{r5}#");       gr->Puts(mglPoint(0,   0.9), "\\{r5\\}", "k:C", -1.4);
+       gr->FaceZ(mglPoint(0.2, 0.8), 0.4, 0.3, "{r7}#");       gr->Puts(mglPoint(0.4, 0.9), "\\{r7\\}", "k:C", -1.4);
+       gr->FaceZ(mglPoint(0.6, 0.8), 0.4, 0.3, "{r9}#");       gr->Puts(mglPoint(0.8, 0.9), "\\{r9\\}", "k:C", -1.4);
+       // HEX
+       gr->FaceZ(mglPoint(-1, -1.3), 1, 0.3, "{xff9966}#");    gr->Puts(mglPoint(-0.5,-1.2), "\\{xff9966\\}", "k:C", -1.4);
+       gr->FaceZ(mglPoint(0,  -1.3), 1, 0.3, "{x83CAFF}#");    gr->Puts(mglPoint( 0.5,-1.2), "\\{x83CAFF\\}", "k:C", -1.4);
+
+       gr->SubPlot(3,2,3);
+       char stl[3]="r1", txt[4]="'1'";
+       for(int i=0;i<10;i++)
+       {
+               txt[1]=stl[1]='0'+i;
+               gr->Line(mglPoint(-1,0.2*i-1),mglPoint(1,0.2*i-1),stl);
+               gr->Puts(mglPoint(1.05,0.2*i-1),txt,":L");
+       }
+
+       gr->SubPlot(3,2,4);     gr->Title("TriPlot sample");    gr->Rotate(50,60);
+       double t[] = {0,1,2, 0,1,3, 0,2,3, 1,2,3};
+       double xt[] = {-1,1,0,0}, yt[] = {-1,-1,1,0}, zt[] = {-1,-1,-1,1};
+       mglData tt(4,3,t), uu(4,xt), vv(4,yt), ww(4,zt);
+       gr->TriPlot(tt,uu,vv,ww,"b");
+       gr->TriPlot(tt,uu,vv,ww,"k#");
+
+       gr->SubPlot(3,2,5);
+       mglData r(4);   r.Fill(1,4);
+       gr->SetRanges(1,4,1,4); gr->Axis();
+       gr->Mark(r,r,"s");
+       gr->Plot(r,"b");
+}
+//-----------------------------------------------------------------------------
+const char *mmgl_fexport=all_prims_str
+"write 'fexport.jpg':#write 'fexport.png'\nwrite 'fexport.bmp':write 'fexport.tga'\n"
+"write 'fexport.eps':write 'fexport.svg'\nwrite 'fexport.gif':write 'fexport.xyz'\n"
+"write 'fexport.stl':write 'fexport.off'\nwrite 'fexport.tex':write 'fexport.obj'\n"
+"write 'fexport.prc':write 'fexport.json'\nwrite 'fexport.mgld'";
+void smgl_fexport(mglGraph *gr)        // test file export
+{
+       all_prims(gr);
+       gr->WriteJPEG("fexport.jpg");
+//     gr->WritePNG("fexport.png");
+       gr->WriteBMP("fexport.bmp");
+       gr->WriteTGA("fexport.tga");
+       gr->WriteEPS("fexport.eps");
+       gr->WriteSVG("fexport.svg");
+       gr->WriteGIF("fexport.gif");
+
+       gr->WriteXYZ("fexport.xyz");
+       gr->WriteSTL("fexport.stl");
+       gr->WriteOFF("fexport.off");
+       gr->WriteTEX("fexport.tex");
+       gr->WriteOBJ("fexport.obj");
+       gr->WritePRC("fexport.prc");
+       gr->WriteJSON("fexport.json");
+
+       gr->ExportMGLD("fexport.mgld");
+       gr->Clf();
+       gr->ImportMGLD("fexport.mgld");
+}
+//-----------------------------------------------------------------------------
+const char *mmgl_quality0="quality 0\n"
+all_prims_str;
+void smgl_quality0(mglGraph *gr)       // test file export
+{
+       gr->SetQuality(0);      all_prims(gr);
+}
+//-----------------------------------------------------------------------------
+const char *mmgl_quality1="quality 1\n"
+all_prims_str;
+void smgl_quality1(mglGraph *gr)       // test file export
+{
+       gr->SetQuality(1);      all_prims(gr);  
+}
+//-----------------------------------------------------------------------------
+const char *mmgl_quality2="quality 2\n"
+all_prims_str;
+void smgl_quality2(mglGraph *gr)       // test file export
+{
+       gr->SetQuality(2);      all_prims(gr);  
+}
+//-----------------------------------------------------------------------------
+const char *mmgl_quality4="quality 4\n"
+all_prims_str;
+void smgl_quality4(mglGraph *gr)       // test file export
+{
+       gr->SetQuality(4);      all_prims(gr);  
+}
+//-----------------------------------------------------------------------------
+const char *mmgl_quality5="quality 5\n"
+all_prims_str;
+void smgl_quality5(mglGraph *gr)       // test file export
+{
+       gr->SetQuality(5);      all_prims(gr);  
+}
+//-----------------------------------------------------------------------------
+const char *mmgl_quality6="quality 6\n"
+all_prims_str;
+void smgl_quality6(mglGraph *gr)       // test file export
+{
+       gr->SetQuality(6);      all_prims(gr);  
+}
+//-----------------------------------------------------------------------------
+const char *mmgl_quality8="quality 8\n"
+all_prims_str;
+void smgl_quality8(mglGraph *gr)       // test file export
+{
+       gr->SetQuality(8);      all_prims(gr);  
+}
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
 mglSample samp[] = {
-       {"alpha", smgl_alpha, mmgl_alpha},
-       {"apde", smgl_apde, mmgl_apde},
-       {"area", smgl_area, mmgl_area},
-       {"aspect", smgl_aspect, mmgl_aspect},
-       {"axial", smgl_axial, mmgl_axial},
-       {"axis", smgl_axis, mmgl_axis},
-       {"barh", smgl_barh, mmgl_barh},
-       {"bars", smgl_bars, mmgl_bars},
-       {"belt", smgl_belt, mmgl_belt},
-       {"bifurcation", smgl_bifurcation, mmgl_bifurcation},
-       {"box", smgl_box, mmgl_box},
-       {"boxplot", smgl_boxplot, mmgl_boxplot},
-       {"boxs", smgl_boxs, mmgl_boxs},
-       {"candle", smgl_candle, mmgl_candle},
-       {"chart", smgl_chart, mmgl_chart},
-       {"cloud", smgl_cloud, mmgl_cloud },
-       {"colorbar", smgl_colorbar, mmgl_colorbar},
-       {"combined", smgl_combined, mmgl_combined },
-       {"cones", smgl_cones, mmgl_cones},
-       {"cont", smgl_cont, mmgl_cont},
-       {"cont_xyz", smgl_cont_xyz, mmgl_cont_xyz},
-       {"conta", smgl_conta, mmgl_conta},
-       {"contd", smgl_contd, mmgl_contd},
-       {"contf", smgl_contf, mmgl_contf},
-       {"contf_xyz", smgl_contf_xyz, mmgl_contf_xyz},
-       {"contfa", smgl_contfa, mmgl_contfa},
-       {"contv", smgl_contv, mmgl_contv},
-       {"correl", smgl_correl, mmgl_correl},
-//     {"crust", smgl_crust, mmgl_crust},      // TODO: open after triangulation
-       {"curvcoor", smgl_curvcoor, mmgl_curvcoor},
-       {"cut", smgl_cut, mmgl_cut},
-       {"dat_diff", smgl_dat_diff, mmgl_dat_diff},
-       {"dat_extra", smgl_dat_extra, mmgl_dat_extra },
-       {"data1", smgl_data1, mmgl_data1},
-       {"data2", smgl_data2, mmgl_data2},
-       {"dens", smgl_dens, mmgl_dens},
-       {"dens_xyz", smgl_dens_xyz, mmgl_dens_xyz},
-       {"densa", smgl_densa, mmgl_densa},
-       {"dew", smgl_dew, mmgl_dew},
-       {"dots", smgl_dots, mmgl_dots},
-       {"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},
-       {"flow", smgl_flow, mmgl_flow},
-       {"fog", smgl_fog, mmgl_fog},
-       {"fonts", smgl_fonts, mmgl_fonts},
-       {"grad", smgl_grad, mmgl_grad},
-       {"hist", smgl_hist, mmgl_hist},
-       {"ifs2d", smgl_ifs2d, mmgl_ifs2d},
-       {"ifs3d", smgl_ifs3d, mmgl_ifs3d},
-       {"indirect",smgl_indirect,mmgl_indirect},
-       {"inplot", smgl_inplot, mmgl_inplot},
-       {"label", smgl_label, mmgl_label},
-       {"lamerey", smgl_lamerey, mmgl_lamerey},
-       {"legend", smgl_legend, mmgl_legend },
-       {"light", smgl_light, mmgl_light},
-       {"loglog", smgl_loglog, mmgl_loglog},
-       {"map", smgl_map, mmgl_map},
-       {"mark", smgl_mark, mmgl_mark},
-       {"mask", smgl_mask, mmgl_mask},
-       {"mesh", smgl_mesh, mmgl_mesh},
-       {"mirror", smgl_mirror, mmgl_mirror },
-       {"molecule", smgl_molecule, mmgl_molecule },
-       {"ode", smgl_ode, mmgl_ode},
-       {"ohlc", smgl_ohlc, mmgl_ohlc},
-       {"param1", smgl_param1, mmgl_param1},
-       {"param2", smgl_param2, mmgl_param2},
-       {"param3", smgl_param3, mmgl_param3},
-       {"paramv", smgl_paramv, mmgl_paramv},
-       {"parser", smgl_parser, mmgl_parser},
-       {"pde", smgl_pde, mmgl_pde},
-       {"pendelta", smgl_pendelta, mmgl_pendelta},
-       {"pipe", smgl_pipe, mmgl_pipe},
-       {"plot", smgl_plot, mmgl_plot},
-       {"pmap", smgl_pmap, mmgl_pmap},
-       {"primitives", smgl_primitives, mmgl_primitives },
-       {"projection", smgl_projection, mmgl_projection },
-       {"projection5", smgl_projection5, mmgl_projection5 },
-       {"pulse", smgl_pulse, mmgl_pulse },
-       {"qo2d", smgl_qo2d, mmgl_qo2d},
-       {"radar", smgl_radar, mmgl_radar},
-       {"refill", smgl_refill, mmgl_refill},
-       {"region", smgl_region, mmgl_region},
-       {"scanfile", smgl_scanfile, mmgl_scanfile },
-       {"schemes", smgl_schemes, mmgl_schemes },
-       {"several_light", smgl_several_light, mmgl_several_light },
-       {"solve", smgl_solve, mmgl_solve},
-       {"stem", smgl_stem, mmgl_stem},
-       {"step", smgl_step, mmgl_step},
-       {"stereo", smgl_stereo, mmgl_stereo},
-       {"stfa", smgl_stfa, mmgl_stfa},
-       {"style", smgl_style, mmgl_style },
-       {"surf", smgl_surf, mmgl_surf},
-       {"surf3", smgl_surf3, mmgl_surf3},
-       {"surf3a", smgl_surf3a, mmgl_surf3a},
-       {"surf3c", smgl_surf3c, mmgl_surf3c},
-       {"surf3ca", smgl_surf3ca, mmgl_surf3ca},
-       {"surfa", smgl_surfa, mmgl_surfa},
-       {"surfc", smgl_surfc, mmgl_surfc},
-       {"surfca", smgl_surfca, mmgl_surfca},
-       {"table", smgl_table, mmgl_table},
-       {"tape", smgl_tape, mmgl_tape},
-       {"tens", smgl_tens, mmgl_tens},
-       {"ternary", smgl_ternary, mmgl_ternary },
-       {"text", smgl_text, mmgl_text},
-       {"text2", smgl_text2, mmgl_text2},
-       {"textmark", smgl_textmark, mmgl_textmark},
-       {"ticks", smgl_ticks, mmgl_ticks},
-       {"tile", smgl_tile, mmgl_tile},
-       {"tiles", smgl_tiles, mmgl_tiles},
-       {"torus", smgl_torus, mmgl_torus },
-       {"traj", smgl_traj, mmgl_traj},
-       {"triangulation",smgl_triangulation, mmgl_triangulation },
-       {"triplot", smgl_triplot, mmgl_triplot},
-       {"tube", smgl_tube, mmgl_tube},
-       {"type0", smgl_type0, mmgl_type0},
-       {"type1", smgl_type1, mmgl_type1},
-       {"type2", smgl_type2, mmgl_type2},
-       {"vect", smgl_vect, mmgl_vect},
-       {"vecta", smgl_vecta, mmgl_vecta},
-       {"venn", smgl_venn, mmgl_venn},
-{"", NULL, NULL}};
+       {"3wave", smgl_3wave, mmgl_3wave, "Example of complex @ref{ode} on basis of 3-wave decay."},
+       {"alpha", smgl_alpha, mmgl_alpha, "Example of @ref{light} and @ref{alpha} (transparency)."},
+       {"apde", smgl_apde, mmgl_apde,  "Comparison of advanced PDE solver (@ref{apde}) and ordinary one (@ref{pde})."},
+       {"area", smgl_area, mmgl_area, "Function @ref{area} fill the area between curve and axis plane. It support gradient filling if 2 colors per curve is specified."}, 
+       {"aspect", smgl_aspect, mmgl_aspect, "Example of @ref{subplot}, @ref{inplot}, @ref{rotate}, @ref{aspect}, @ref{shear}."},
+       {"axial", smgl_axial, mmgl_axial, "Function @ref{axial} draw surfaces of rotation for contour lines. You can draw wire surfaces (@samp{#} style) or ones rotated in other directions (@samp{x}, @samp{z} styles)."},
+       {"axis", smgl_axis, mmgl_axis, "Different forms of @ref{axis} position."},
+       {"barh", smgl_barh, mmgl_barh, "Function @ref{barh} is the similar to @ref{bars} but draw horizontal bars."},
+       {"bars", smgl_bars, mmgl_bars, "Function @ref{bars} draw vertical bars. It have a lot of options: bar-above-bar (@samp{a} style), fall like (@samp{f} style), 2 colors for positive and negative values, wired bars (@samp{#} style), 3D variant."},
+       {"belt", smgl_belt, mmgl_belt, "Function @ref{belt} draw surface by belts. You can use @samp{x} style for drawing lines in other direction."},
+       {"bifurcation", smgl_bifurcation, mmgl_bifurcation, "Function @ref{bifurcation} draw Bifurcation diagram for multiple stationary points of the map (like logistic map)."},
+       {"box", smgl_box, mmgl_box, "Different styles of bounding @ref{box}."},
+       {"boxplot", smgl_boxplot, mmgl_boxplot, "Function @ref{boxplot} draw box-and-whisker diagram."},
+       {"boxs", smgl_boxs, mmgl_boxs, "Function @ref{boxs} draw surface by boxes. You can use @samp{#} for drawing wire plot."},
+       {"candle", smgl_candle, mmgl_candle, "Function @ref{candle} draw candlestick chart. This is a combination of a line-chart and a bar-chart, in that each bar represents the range of price movement over a given time interval."},
+       {"chart", smgl_chart, mmgl_chart, "Function @ref{chart} draw colored boxes with width proportional to data values. Use @samp{ } for empty box. It produce well known pie chart if drawn in polar coordinates."},
+       {"cloud", smgl_cloud, mmgl_cloud , "Function @ref{cloud} draw cloud-like object which is less transparent for higher data values. Similar plot can be created using many (about 10...20 -- @code{surf3a a a;value 10}) isosurfaces @ref{surf3a}."},
+       {"colorbar", smgl_colorbar, mmgl_colorbar, "Example of @ref{colorbar} position and styles."},
+       {"combined", smgl_combined, mmgl_combined , "Example of several plots in the same axis."},
+       {"cones", smgl_cones, mmgl_cones, "Function @ref{cones} is similar to @ref{bars} but draw cones."},
+       {"cont", smgl_cont, mmgl_cont, "Function @ref{cont} draw contour lines for surface. You can select automatic (default) or manual levels for contours, print contour labels, draw it on the surface (default) or at plane (as @code{Dens})."},
+       {"cont3", smgl_cont3, mmgl_cont3, "Function @ref{contf3} draw ordinary contour lines but at slices of 3D data. "},
+       {"cont_xyz", smgl_cont_xyz, mmgl_cont_xyz, "Functions @ref{contz}, @ref{conty}, @ref{contx} draw contour lines on plane perpendicular to corresponding axis. One of possible application is drawing projections of 3D field."},
+       {"contd", smgl_contd, mmgl_contd, "Function @ref{contd} is similar to @ref{contf} but with manual contour colors."},
+       {"contf", smgl_contf, mmgl_contf, "Function @ref{contf} draw filled contours.  You can select automatic (default) or manual levels for contours."},
+       {"contf3", smgl_contf3, mmgl_contf3, "Function @ref{contf3} draw ordinary filled contours but at slices of 3D data. "},
+       {"contf_xyz", smgl_contf_xyz, mmgl_contf_xyz, "Functions @ref{contfz}, @ref{contfy}, @ref{contfx}, draw filled contours on plane perpendicular to corresponding axis. One of possible application is drawing projections of 3D field."},
+       {"contv", smgl_contv, mmgl_contv, "Function @ref{contv} draw vertical cylinders (belts) at contour lines."},
+       {"correl", smgl_correl, mmgl_correl, "Test of correlation function (@ref{correl})."},
+//     {"crust", smgl_crust, mmgl_crust, ""},  // TODO: open after triangulation
+       {"curvcoor", smgl_curvcoor, mmgl_curvcoor, "Some common curvilinear coordinates."},
+       {"cut", smgl_cut, mmgl_cut, "Example of point cutting (@ref{cut}."},
+       {"dat_diff", smgl_dat_diff, mmgl_dat_diff, "Example of @ref{diff} and @ref{integrate}."},
+       {"dat_extra", smgl_dat_extra, mmgl_dat_extra , "Example of @ref{envelop}, @ref{sew}, @ref{smooth} and @ref{resize}."},
+       {"data1", smgl_data1, mmgl_data1, ""},
+       {"data2", smgl_data2, mmgl_data2, ""},
+       {"dens", smgl_dens, mmgl_dens, "Function @ref{dens} draw density plot (also known as color-map) for surface."},
+       {"dens3", smgl_dens3, mmgl_dens3, "Function @ref{dens3} draw ordinary density plots but at slices of 3D data."},
+       {"dens_xyz", smgl_dens_xyz, mmgl_dens_xyz, "Functions @ref{densz}, @ref{densy}, @ref{densx} draw density plot on plane perpendicular to corresponding axis. One of possible application is drawing projections of 3D field."},
+       {"detect", smgl_detect, mmgl_detect, "Example of curve @ref{detect}."},
+       {"dew", smgl_dew, mmgl_dew, "Function @ref{dew} is similar to @ref{vect} but use drops instead of arrows."},
+       {"diffract", smgl_diffract, mmgl_diffract, ""},
+       {"dilate", smgl_dilate, mmgl_dilate, "Example of @ref{dilate} and @ref{erode}."},
+       {"dots", smgl_dots, mmgl_dots, "Function @ref{dots} is another way to draw irregular points. @code{Dots} use color scheme for coloring (see @ref{Color scheme})."},
+       {"earth", smgl_earth, mmgl_earth, "Example of Earth map by using @ref{import}."},
+       {"error", smgl_error, mmgl_error, "Function @ref{error} draw error boxes around the points. You can draw default boxes or semi-transparent symbol (like marker, see @ref{Line styles}). Also you can set individual color for each box. See also @ref{error2 sample}."},
+       {"error2", smgl_error2, mmgl_error2, "Example of @ref{error} kinds."},
+       {"export", smgl_export, mmgl_export, "Example of data @ref{export} and @ref{import}."},
+       {"fall", smgl_fall, mmgl_fall, "Function @ref{fall} draw waterfall surface. You can use @ref{meshnum} for changing number of lines to be drawn. Also you can use @samp{x} style for drawing lines in other direction."},
+       {"fexport", smgl_fexport, mmgl_fexport, "Example of @ref{write} to different file formats."},
+       {"fit", smgl_fit, mmgl_fit, "Example of nonlinear @ref{fit}."},
+       {"flame2d", smgl_flame2d, mmgl_flame2d, "Function @ref{flame2d} generate points for flame fractals in 2d case."},
+       {"flow", smgl_flow, mmgl_flow, "Function @ref{flow} is another standard way to visualize vector fields -- it draw lines (threads) which is tangent to local vector field direction. MathGL draw threads from edges of bounding box and from central slices. Sometimes it is not most appropriate variant -- you may want to use @code{flowp} to specify manual position of threads. The color scheme is used for coloring (see @ref{Color scheme}). At this warm color corresponds to normal flow (like attractor), cold one corresponds to inverse flow (like source)."}, // TODO @ref{flowp}
+       {"flow3", smgl_flow3, mmgl_flow3, "Function @ref{flow3} draw flow threads, which start from given plane."},
+       {"fog", smgl_fog, mmgl_fog, "Example of @ref{fog}."},
+       {"fonts", smgl_fonts, mmgl_fonts, "Example of @ref{font} typefaces."},
+       {"grad", smgl_grad, mmgl_grad, "Function @ref{grad} draw gradient lines for matrix."},
+       {"hist", smgl_hist, mmgl_hist, "Example of @ref{hist} (histogram)."},
+       {"ifs2d", smgl_ifs2d, mmgl_ifs2d, "Function @ref{ifs2d} generate points for fractals using iterated function system in 2d case."},
+       {"ifs3d", smgl_ifs3d, mmgl_ifs3d, "Function @ref{ifs3d} generate points for fractals using iterated function system in 3d case."},
+       {"indirect",smgl_indirect,mmgl_indirect, "Comparison of @ref{subdata} vs @ref{evaluate}/"},
+       {"inplot", smgl_inplot, mmgl_inplot, "Example of @ref{inplot}, @ref{multiplot}, @ref{columnplot}, @ref{gridplot}, @ref{shearplot}, @ref{stickplot}."},
+       {"iris", smgl_iris, mmgl_iris, "Function @ref{iris} draw Iris plot for columns of data array."},
+       {"label", smgl_label, mmgl_label, "Function @ref{label} print text at data points. The string may contain @samp{%x}, @samp{%y}, @samp{%z} for x-, y-, z-coordinates of points, @samp{%n} for point index."},
+       {"lamerey", smgl_lamerey, mmgl_lamerey, "Function @ref{lamerey} draw Lamerey diagram."},
+       {"legend", smgl_legend, mmgl_legend , "Example of @ref{legend} styles."},
+       {"light", smgl_light, mmgl_light, "Example of @ref{light} with different types."},
+       {"loglog", smgl_loglog, mmgl_loglog, "Example of log- and log-log- axis labels."},
+       {"map", smgl_map, mmgl_map, "Example of @ref{map}."},
+       {"mark", smgl_mark, mmgl_mark, "Example of @ref{mark}."},
+       {"mask", smgl_mask, mmgl_mask, "Example of @ref{mask} kinds."},
+       {"mesh", smgl_mesh, mmgl_mesh, "Function @ref{mesh} draw wired surface. You can use @ref{meshnum} for changing number of lines to be drawn."},
+       {"mirror", smgl_mirror, mmgl_mirror , "Example of using options."},
+       {"molecule", smgl_molecule, mmgl_molecule , "Example of drawing molecules."},
+       {"ode", smgl_ode, mmgl_ode, "Example of phase plain created by @ref{ode} solving, contour lines (@ref{cont}) and @ref{flow} threads."},
+       {"ohlc", smgl_ohlc, mmgl_ohlc, "Function @ref{ohlc} draw Open-High-Low-Close diagram. This diagram show vertical line for between maximal(high) and minimal(low) values, as well as horizontal lines before/after vertical line for initial(open)/final(close) values of some process."},
+       {"param1", smgl_param1, mmgl_param1, "Example of parametric plots for 1D data."},
+       {"param2", smgl_param2, mmgl_param2, "Example of parametric plots for 2D data."},
+       {"param3", smgl_param3, mmgl_param3, "Example of parametric plots for 3D data."},
+       {"paramv", smgl_paramv, mmgl_paramv, "Example of parametric plots for vector fields."},
+       {"parser", smgl_parser, mmgl_parser, "Basic MGL script."},
+       {"pde", smgl_pde, mmgl_pde, "Example of @ref{pde} solver."},
+       {"pendelta", smgl_pendelta, mmgl_pendelta, "Example of @ref{pendelta} for lines and glyphs smoothing."},
+       {"pipe", smgl_pipe, mmgl_pipe, "Function @ref{pipe} is similar to @ref{flow} but draw pipes (tubes) which radius is proportional to the amplitude of vector field. The color scheme is used for coloring (see @ref{Color scheme}). At this warm color corresponds to normal flow (like attractor), cold one corresponds to inverse flow (like source)."},
+       {"plot", smgl_plot, mmgl_plot, "Function @ref{plot} is most standard way to visualize 1D data array. By default, @code{Plot} use colors from palette. However, you can specify manual color/palette, and even set to use new color for each points by using @samp{!} style. Another feature is @samp{ } style which draw only markers without line between points."},
+       {"pmap", smgl_pmap, mmgl_pmap, "Function @ref{pmap} draw Poincare map -- show intersections of the curve and the surface."},
+       {"primitives", smgl_primitives, mmgl_primitives , "Example of primitives: @ref{line}, @ref{curve}, @ref{rhomb}, @ref{ellipse}, @ref{face}, @ref{sphere}, @ref{drop}, @ref{cone}."},
+       {"projection", smgl_projection, mmgl_projection , "Example of plot projection (@ref{ternary}=4)."},
+       {"projection5", smgl_projection5, mmgl_projection5 , "Example of plot projection in ternary coordinates (@ref{ternary}=5)."},
+       {"pulse", smgl_pulse, mmgl_pulse , "Example of @ref{pulse} parameter determining."},
+       {"qo2d", smgl_qo2d, mmgl_qo2d, "Example of PDE solving by quasioptical approach @ref{qo2d}."},
+       {"quality0", smgl_quality0, mmgl_quality0, "Show all kind of primitives in @ref{quality}=0."},
+       {"quality1", smgl_quality1, mmgl_quality1, "Show all kind of primitives in @ref{quality}=1."},
+       {"quality2", smgl_quality2, mmgl_quality2, "Show all kind of primitives in @ref{quality}=2."},
+       {"quality4", smgl_quality4, mmgl_quality4, "Show all kind of primitives in @ref{quality}=4."},
+       {"quality5", smgl_quality5, mmgl_quality5, "Show all kind of primitives in @ref{quality}=5."},
+       {"quality6", smgl_quality6, mmgl_quality6, "Show all kind of primitives in @ref{quality}=6."},
+       {"quality8", smgl_quality8, mmgl_quality8, "Show all kind of primitives in @ref{quality}=8."},
+       {"radar", smgl_radar, mmgl_radar, "The @ref{radar} plot is variant of @ref{plot}, which make plot in polar coordinates and draw radial rays in point directions. If you just need a plot in polar coordinates then I recommend to use @ref{Curvilinear coordinates} or @ref{plot} in parametric form with @code{x=r*cos(fi); y=r*sin(fi);}."},
+       {"refill", smgl_refill, mmgl_refill, "Example of @ref{refill} and @ref{gspline}."},
+       {"region", smgl_region, mmgl_region, "Function @ref{region} fill the area between 2 curves. It support gradient filling if 2 colors per curve is specified. Also it can fill only the region y1<y<y2 if style @samp{i} is used."},
+       {"scanfile", smgl_scanfile, mmgl_scanfile , "Example of @ref{scanfile} for reading 'named' data."},
+       {"schemes", smgl_schemes, mmgl_schemes , "Example of popular color schemes."},
+       {"section", smgl_section, mmgl_section, "Example of @ref{section} to separate data and @ref{join} it back."},
+       {"several_light", smgl_several_light, mmgl_several_light , "Example of using several @ref{light} sources."},
+       {"solve", smgl_solve, mmgl_solve, "Example of @ref{solve} for root finding."},
+       {"stem", smgl_stem, mmgl_stem, "Function @ref{stem} draw vertical bars. It is most attractive if markers are drawn too."},
+       {"step", smgl_step, mmgl_step, "Function @ref{step} plot data as stairs. At this stairs can be centered if sizes are differ by 1."},
+       {"stereo", smgl_stereo, mmgl_stereo, "Example of stereo image of @ref{surf}."},
+       {"stfa", smgl_stfa, mmgl_stfa, "Example of @ref{stfa}."},
+       {"style", smgl_style, mmgl_style , "Example of colors and styles for plots."},
+       {"surf", smgl_surf, mmgl_surf, "Function @ref{surf} is most standard way to visualize 2D data array. @code{Surf} use color scheme for coloring (see @ref{Color scheme}). You can use @samp{#} style for drawing black meshes on the surface."},
+       {"surf3", smgl_surf3, mmgl_surf3, "Function @ref{surf3} is one of most suitable (for my opinion) functions to visualize 3D data. It draw the isosurface(s) -- surface(s) of constant amplitude (3D analogue of contour lines). You can draw wired isosurfaces if specify @samp{#} style."},
+       {"surf3a", smgl_surf3a, mmgl_surf3a, "Function @ref{surf3c} is similar to @ref{surf3} but its transparency is determined by another data."},
+       {"surf3c", smgl_surf3c, mmgl_surf3c, "Function @ref{surf3c} is similar to @ref{surf3} but its coloring is determined by another data."},
+       {"surf3ca", smgl_surf3ca, mmgl_surf3ca, "Function @ref{surf3c} is similar to @ref{surf3} but its coloring and transparency is determined by another data arrays."},
+       {"surfa", smgl_surfa, mmgl_surfa, "Function @ref{surfa} is similar to @ref{surf} but its transparency is determined by another data."},
+       {"surfc", smgl_surfc, mmgl_surfc, "Function @ref{surfc} is similar to @ref{surf} but its coloring is determined by another data."},
+       {"surfca", smgl_surfca, mmgl_surfca, "Function @ref{surfca} is similar to @ref{surf} but its coloring and transparency is determined by another data arrays."},
+       {"table", smgl_table, mmgl_table, "Function @ref{table} draw table with data values."},
+       {"tape", smgl_tape, mmgl_tape, "Function @ref{tape} draw tapes which rotate around the curve as transverse orts of accompanied coordinates."},
+       {"tens", smgl_tens, mmgl_tens, "Function @ref{tens} is variant of @ref{plot} with smooth coloring along the curves. At this, color is determined as for surfaces (see @ref{Color scheme})."},
+       {"ternary", smgl_ternary, mmgl_ternary , "Example of @ref{ternary} coordinates."},
+       {"text", smgl_text, mmgl_text, "Example of @ref{text} possibilities."},
+       {"text2", smgl_text2, mmgl_text2, "Example of @ref{text} along curve."},
+       {"textmark", smgl_textmark, mmgl_textmark, "Function @ref{textmark} is similar to @ref{mark} but draw text instead of markers."},
+       {"ticks", smgl_ticks, mmgl_ticks, "Example of @ref{axis} ticks."},
+       {"tile", smgl_tile, mmgl_tile, "Function @ref{tile} draw surface by tiles."},
+       {"tiles", smgl_tiles, mmgl_tiles, "Function @ref{tiles} is similar to @ref{tile} but tile sizes is determined by another data. This allows one to simulate transparency of the plot."},
+       {"torus", smgl_torus, mmgl_torus , "Function @ref{torus} draw surface of the curve rotation."},
+       {"traj", smgl_traj, mmgl_traj, "Function @ref{traj} is 1D analogue of @ref{vect}. It draw vectors from specified points."},
+       {"triangulation",smgl_triangulation, mmgl_triangulation , "Example of use @ref{triangulate} for arbitrary placed points."},
+       {"triplot", smgl_triplot, mmgl_triplot, "Functions @ref{triplot} and @ref{quadplot} draw set of triangles (or quadrangles, correspondingly) for irregular data arrays. Note, that you have to provide not only vertexes, but also the indexes of triangles or quadrangles. I.e. perform triangulation by some other library. See also @ref{triangulate}."},
+       {"tube", smgl_tube, mmgl_tube, "Function @ref{tube} draw tube with variable radius."},
+       {"type0", smgl_type0, mmgl_type0, "Example of ordinary transparency (@ref{transptype}=0)."},
+       {"type1", smgl_type1, mmgl_type1, "Example of glass-like transparency (@ref{transptype}=1)."},
+       {"type2", smgl_type2, mmgl_type2, "Example of lamp-like transparency (@ref{transptype}=2)."},
+       {"vect", smgl_vect, mmgl_vect, "Function @ref{vect} is most standard way to visualize vector fields -- it draw a lot of arrows or hachures for each data cell. It have a lot of options which can be seen on the figure (and in the sample code), and use color scheme for coloring (see @ref{Color scheme})."},
+       {"vect3", smgl_vect3, mmgl_vect3, "Function @ref{vect3} draw ordinary vector field plot but at slices of 3D data."},
+       {"venn", smgl_venn, mmgl_venn, "Example of venn-like diagram."},
+{"", NULL, NULL, NULL}};
 //-----------------------------------------------------------------------------
index bea8abe976c63d24b83846fadea0097a807c0cf6..7ee6317a19238150585e0e79a764567e8ca55d8f 100644 (file)
 //-----------------------------------------------------------------------------\r
 #include "mgl2/mgl.h"\r
 //-----------------------------------------------------------------------------\r
-void mgls_prepare1d(mglData *y, mglData *y1=0, mglData *y2=0, mglData *x1=0, mglData *x2=0);\r
-void mgls_prepare2d(mglData *a, mglData *b=0, mglData *v=0);\r
-void mgls_prepare3d(mglData *a, mglData *b=0);\r
-void mgls_prepare2v(mglData *a, mglData *b);\r
-void mgls_prepare3v(mglData *ex, mglData *ey, mglData *ez);\r
-//-----------------------------------------------------------------------------\r
 int test_wnd(mglGraph *gr)\r
 {\r
 mgl_set_test_mode(true);\r
@@ -429,8 +423,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 +446,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 +461,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 +475,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,14 +495,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
-/*             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
-               ez->a[i0]=y*x*r2*r2;*/\r
-/*             ex->a[i0]=3*z;\r
-               ey->a[i0]=1;\r
-               ez->a[i0]=-3*x;*/\r
+               long i0 = i+n*(j+k*n);\r
                double r1 = pow(x*x+y*y+(z-z0)*(z-z0)+0.03,1.5);\r
                double r2 = pow(x*x+y*y+(z+z0)*(z+z0)+0.03,1.5);\r
                ex->a[i0]=0.2*x/r1 - 0.2*x/r2;\r
index 34b1c722f7669bad220b57c18195d46fc77c91bd..2f827653cb8df2684ba945cae6e68476108da762 100644 (file)
@@ -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 f24af56e28b931ab76551264bda719591c710822..f529c1872cbe34cd97c19c7cb9a5fb94f322946a 100644 (file)
@@ -1,20 +1,23 @@
-add_executable(make_bin make_bin.cpp)
-target_link_libraries(make_bin mgl-static ${getopt_lib-static})
+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 cbde2e558a39abcc8ddac42bef591bbb795a6daa..b3e2744f9eaf40c1ad16640fea5f7cea85b82c4e 100644 (file)
@@ -1,4 +1,5 @@
-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)
+configure_file(${MathGL2_SOURCE_DIR}/include/build.h.in ${MathGL2_BINARY_DIR}/include/mgl2/build.h)
 
 install(DIRECTORY mgl2/ DESTINATION ${MGL_INCLUDE_PATH}
                         PATTERN ".svn" EXCLUDE
@@ -14,7 +15,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)
diff --git a/include/build.h.in b/include/build.h.in
new file mode 100644 (file)
index 0000000..f791535
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef _MGL_BUILD_H_
+#define _MGL_BUILD_H_
+
+#define MGL_BUILD_DATE "${MathGL_DATE}"
+
+#endif
index 233e3126cab57d702183afae371b2a4028487c3a..6367a08604666f8ba89c9631def81618d443c7a8 100644 (file)
@@ -1,7 +1,12 @@
 #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_VER_MAJOR  ${MathGL_VERSION_MAJOR}
+#define MGL_VER_MINOR  ${MathGL_VERSION_MINOR}
+#define MGL_VER_PATCH  ${MathGL_PATCH_VERSION}
+#define MGL_VERSION    (${MathGL_VERSION_MAJOR}000+${MathGL_VERSION_MINOR}.${MathGL_PATCH_VERSION})
+#define MGL_VER_STRING         "${MathGL_VERSION_MAJOR}.${MathGL_VERSION_MINOR}.${MathGL_PATCH_VERSION}"
 
 #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 +44,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 372bae2c7d338aea0f0665dcc832fc53bd11bc08..b533c4868a4d7e80c143a014ddb618f940051438 100644 (file)
@@ -30,6 +30,7 @@
 #include <FL/Fl_Button.H>\r
 #include <FL/Fl_Counter.H>\r
 #include <FL/Fl_Menu_Bar.H>\r
+#include <FL/Fl_Progress.H>\r
 #include <mgl2/fltk.h>\r
 class mglCanvas;\r
 //-----------------------------------------------------------------------------\r
@@ -41,64 +42,105 @@ 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)\r
+       {       if(draw_cl)     delete draw_cl; draw_cl=dr;     draw_func=0;    }\r
+       /// Set function for parameters\r
+       inline void set_prop(void (*func)(char id, const char *val, void *par), void *par)\r
+       {       prop_func=func; prop_par=par;   }\r
 \r
+       /// Refresh image (without executing update)\r
+       void refresh();\r
        /// Update (redraw) plot\r
        virtual void update();\r
        /// Set angles for additional plot rotation\r
-       inline void set_angle(mreal t, mreal p){        tet = t;        phi = p;        }\r
+       inline void set_angle(double t, double p){      tet = t;        phi = p;        }\r
        /// 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
+       void set_state(bool z, bool r, bool g=false)\r
+       {       zoom = z;       rotate = r;     grid = g;       }\r
+       /// Set zoom in/out region\r
+       inline void set_zoom(double X1, double Y1, double X2, double Y2)\r
+       {       x1 = X1;        x2 = X2;        y1 = Y1;        y2 = Y2;        update();       }\r
+       /// Get zoom region\r
+       inline void get_zoom(double *X1, double *Y1, double *X2, double *Y2)\r
+       {       *X1 = x1;       *X2 = x2;       *Y1 = y1;       *Y2 = y2;       }\r
+       /// 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
+\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;    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
-       /// 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
-       /// Get zoom region\r
-       inline void get_zoom(mreal *X1, mreal *Y1, mreal *X2, mreal *Y2)\r
-       {       *X1 = x1;       *X2 = x2;       *Y1 = y1;       *Y2 = y2;       }\r
-       /// 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
+               if(draw_cl)     d = draw_cl;\r
+               return d;       }\r
+       inline void set_param(char id, const char *val)\r
+       {       mglDraw *d=get_class(); if(d)   d->Param(id,val);       else    prop_func(id,val,prop_par);     }\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
+       void *draw_par;         ///< Parameters for drawing function draw_func().\r
        /// Drawing function for window procedure. It should return the number of frames.\r
        int (*draw_func)(mglBase *gr, void *par);\r
+       void *prop_par; ///< Parameters for prop_func().\r
+       /// Function for setting properties.\r
+       void (*prop_func)(char id, const char *val, 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
        void *vpar;                                     ///< parameter for popup menu\r
-       mreal tet,phi;                          ///< rotation angles\r
+       double tet,phi;                         ///< rotation angles\r
        bool rotate;                            ///< flag for handle mouse\r
        bool zoom;                                      ///< flag for zoom by mouse\r
-       bool wire;\r
-       mreal x1,x2,y1,y2;                      ///< zoom region\r
+       bool grid;                                      ///< flag to draw grid and edit prim\r
+       bool show_warn;                         ///< show window with warnings\r
+       bool handle_keys;\r
+       double 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
+       char mouse_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,25 +160,63 @@ 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
+       /// Toggle transparency (alpha) button\r
+       void toggle_alpha()     {       toggle(alpha, alpha_bt, _("Graphics/Alpha"));   }\r
+       /// Toggle lighting button\r
+       void toggle_light()     {       toggle(light, light_bt, _("Graphics/Light"));   }\r
+       /// Toggle slideshow button\r
+       void toggle_sshow()     {       toggle(sshow, anim_bt, _("Graphics/Animation/Slideshow"));      }\r
+       /// Toggle grid drawing button\r
+       void toggle_grid()      {       toggle(grid, grid_bt, _("Graphics/Grid"));      }\r
+       /// Toggle mouse zoom button\r
        void toggle_zoom()      {       toggle(zoom, zoom_bt);  }\r
+       /// Toggle mouse rotate button\r
        void toggle_rotate(){   toggle(rotate, rotate_bt);      }\r
+       /// Switch off zoom button\r
        void setoff_zoom()      {       setoff(zoom, zoom_bt);  }\r
+       /// Switch off rotate button\r
        void setoff_rotate(){   setoff(rotate, rotate_bt);      }\r
+       /// Check if slideshow running\r
        bool is_sshow()         {       return sshow;   }\r
-       void toggle_pause()     {       toggle(pauseC, pause_bt, "Graphics/Pause calc");        exec_pause();   }\r
+       /// Toggle pause calculation button\r
+       void toggle_pause()     {       toggle(pauseC, pause_bt, _("Graphics/Pause calc"));     exec_pause();   }\r
+       /// Adjust image sizes to the current widget sizes\r
        void adjust()\r
        {       mgl_set_size(FMGL->get_graph(),scroll->w(),scroll->h());        FMGL->size(scroll->w(),scroll->h());    update();       }\r
+       /// Get current grapher\r
+       HMGL get_graph()        {       return FMGL->get_graph();       }\r
+       /// Update picture by calling user drawing function\r
+       void update();\r
+       \r
+       /// Create and show custom dialog \r
+       void dialog(const char *ids, char const * const *args, const char *title="")\r
+       {\r
+               if(!ids || *ids==0)     return;\r
+               dlg_window(title);\r
+               for(int i=0;ids[i];i++) add_widget(ids[i], args[i]);\r
+               dlg_finish();   dlg_wnd->show();\r
+       }\r
+       void dialog(const std::string &ids, const std::vector<std::string> &args, const char *title="")\r
+       {\r
+               std::vector<const char *> buf;  buf.reserve(args.size());\r
+               for(size_t i=0;i<args.size();i++)       buf.push_back(args[i].c_str());\r
+               dialog(ids.c_str(), &(buf[0]), title);\r
+//             dlg_window(title);\r
+//             for(size_t i=0;i<ids.length();i++)      add_widget(ids[i], args[i].c_str());\r
+//             dlg_finish();   dlg_wnd->show();\r
+       }\r
+       void dlg_window(const char *title="");  ///< Create/label dialog window\r
+       void add_widget(char id, const char *args);     ///< Add widget to dialog\r
+       void dlg_show() {       dlg_finish();   dlg_wnd->show();        }       ///< Show window\r
+       void dlg_hide() {       dlg_wnd->hide();        }       ///< Close window\r
+       void get_values();      ///< Get all values from dialog window\r
+       void set_progress(int value, int maximal);      ///< Set progress\r
 \r
        Fl_MGLView(int x, int y, int w, int h, const char *label=0);\r
        virtual ~Fl_MGLView();\r
-       void update();                  ///< Update picture by calling user drawing function\r
 protected:\r
        Fl_Button *alpha_bt, *light_bt, *rotate_bt, *anim_bt, *zoom_bt, *grid_bt, *pause_bt;\r
-//     Fl_Counter *tet, *phi;\r
+       Fl_Progress *progress;\r
 \r
        int grid, alpha, light; ///< Current states of wire, alpha, light switches (toggle buttons)\r
        int sshow, rotate, zoom;///< Current states of slideshow, rotate, zoom switches (toggle buttons)\r
@@ -145,8 +225,21 @@ protected:
        void toggle(int &val, Fl_Button *b, const char *txt=NULL);\r
        void setoff(int &val, Fl_Button *b, const char *txt=NULL);\r
        void exec_pause();\r
+\r
+       Fl_Double_Window *dlg_wnd;      ///< Dialog window itself\r
+       std::vector<char*> strs;        ///< Strings for widget labels\r
+       bool dlg_done;          ///< Dialog is created\r
+       int dlg_ind;            ///< Current index of widget\r
+       std::vector<char> dlg_kind;                     ///< Kind of elements\r
+       std::vector<Fl_Widget*> dlg_wdgt;       ///< List of widgets\r
+       std::vector<char> dlg_ids;                      ///< Id of elements\r
+       std::vector<std::string> dlg_vals;      ///< resulting strings\r
+       void dlg_finish();      ///< Finish dialog window creation\r
+\r
 };\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 861aeb127f1845731e2a771300008f2a5ed7f11f..515b8143f199f744154115324e62cfbee5cef495 100644 (file)
-/***************************************************************************
- * abstract.h is part of Math Graphic Library
- * 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       *
- *   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.             *
- ***************************************************************************/
-#ifndef _MGL_ABSTRACT_H_
-#define _MGL_ABSTRACT_H_
-
-#include "mgl2/define.h"
-//-----------------------------------------------------------------------------
-#ifdef __cplusplus
-#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;}
-//-----------------------------------------------------------------------------
-class mglBase;
-class mglData;
-class mglDataA;
-class mglDataC;
-class mglParser;
-class mglFormula;
-class mglFormulaC;
-class mglFont;
-typedef mglBase* HMGL;
-typedef mglData* HMDT;
-typedef mglDataC* HADT;
-typedef mglParser* HMPR;
-typedef mglFormula* HMEX;
-typedef mglFormulaC* HAEX;
-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);
-extern "C" {
-
-#else
-#define mglDataA void
-typedef void *HMGL;
-typedef void *HMDT;
-typedef void *HADT;
-typedef void *HMEX;
-typedef void *HAEX;
-typedef void *HMPR;
-typedef const void *HCDT;
-#endif
-
-/// Set seed for random numbers
-void MGL_EXPORT mgl_srnd(long seed);
-void MGL_EXPORT mgl_srnd_(int *seed);
-/// Get random number
-double MGL_EXPORT mgl_rnd();
-double MGL_EXPORT mgl_rnd_();
-
-/// Set name for data variable (can be used in mgl_formula_calc() or in MGL scripts)
-void MGL_EXPORT mgl_data_set_name(mglDataA *dat, const char *name);
-void MGL_EXPORT mgl_data_set_name_(uintptr_t *dat, const char *name,int);
-void MGL_EXPORT mgl_data_set_name_w(mglDataA *dat, const wchar_t *name);
-/// Set callback function which is called at deleting variable
-void MGL_EXPORT mgl_data_set_func(mglDataA *dat, void (*func)(void *), void *par);
-
-/// Save whole data array (for ns=-1) or only ns-th slice to text file
-void MGL_EXPORT mgl_data_save(HCDT dat, const char *fname,long ns);
-void MGL_EXPORT mgl_data_save_(uintptr_t *dat, const char *fname,int *ns,int);
-/// Export data array (for ns=-1) or only ns-th slice to PNG file according color scheme
-void MGL_EXPORT mgl_data_export(HCDT dat, const char *fname, const char *scheme,mreal v1,mreal v2,long ns);
-void MGL_EXPORT mgl_data_export_(uintptr_t *dat, const char *fname, const char *scheme,mreal *v1,mreal *v2,int *ns,int,int);
-/// Save data to HDF file
-void MGL_EXPORT mgl_data_save_hdf(HCDT d,const char *fname,const char *data,int rewrite);
-void MGL_EXPORT mgl_data_save_hdf_(uintptr_t *d, const char *fname, const char *data, int *rewrite,int l,int n);
-/// Get information about the data (sizes and momentum) to string
-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);
-
-/// Get maximal value of the data
-mreal MGL_EXPORT mgl_data_max(HCDT dat);
-mreal MGL_EXPORT mgl_data_max_(uintptr_t *dat);
-/// Get maximal value of the data which is less than 0
-mreal MGL_EXPORT mgl_data_neg_max(HCDT dat);
-mreal MGL_EXPORT mgl_data_neg_max_(uintptr_t *dat);
-/// Get minimal value of the data
-mreal MGL_EXPORT mgl_data_min(HCDT dat);
-mreal MGL_EXPORT mgl_data_min_(uintptr_t *dat);
-/// Get minimal value of the data which is larger than 0
-mreal MGL_EXPORT mgl_data_pos_min(HCDT dat);
-mreal MGL_EXPORT mgl_data_pos_min_(uintptr_t *dat);
-/// Find position (after specified in i,j,k) of first nonzero value of formula
-mreal MGL_EXPORT mgl_data_first(HCDT dat, const char *cond, long *i, long *j, long *k);
-mreal MGL_EXPORT mgl_data_first_(uintptr_t *dat, const char *cond, int *i, int *j, int *k, int);
-/// Find position (before specified in i,j,k) of last nonzero value of formula
-mreal MGL_EXPORT mgl_data_last(HCDT dat, const char *cond, long *i, long *j, long *k);
-mreal MGL_EXPORT mgl_data_last_(uintptr_t *dat, const char *cond, int *i, int *j, int *k, int);
-/// Find position of first in direction 'dir' nonzero value of formula
-long MGL_EXPORT mgl_data_find(HCDT dat, const char *cond, char dir, long i, long j, long k);
-int MGL_EXPORT mgl_data_find_(uintptr_t *dat, const char *cond, char *dir, int *i, int *j, int *k, int,int);
-/// Find if any nonzero value of formula
-int MGL_EXPORT mgl_data_find_any(HCDT dat, const char *cond);
-int MGL_EXPORT mgl_data_find_any_(uintptr_t *dat, const char *cond, int);
-/// Get maximal value of the data and its position
-mreal MGL_EXPORT mgl_data_max_int(HCDT dat, long *i, long *j, long *k);
-mreal MGL_EXPORT mgl_data_max_int_(uintptr_t *dat, int *i, int *j, int *k);
-/// Get maximal value of the data and its approximated position
-mreal MGL_EXPORT mgl_data_max_real(HCDT dat, mreal *x, mreal *y, mreal *z);
-mreal MGL_EXPORT mgl_data_max_real_(uintptr_t *dat, mreal *x, mreal *y, mreal *z);
-/// Get minimal value of the data and its position
-mreal MGL_EXPORT mgl_data_min_int(HCDT dat, long *i, long *j, long *k);
-mreal MGL_EXPORT mgl_data_min_int_(uintptr_t *dat, int *i, int *j, int *k);
-/// Get minimal value of the data and its approximated position
-mreal MGL_EXPORT mgl_data_min_real(HCDT dat, mreal *x, mreal *y, mreal *z);
-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);
-
-/// 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);
-mreal MGL_EXPORT mgl_data_linear_(uintptr_t *dat, mreal *x,mreal *y,mreal *z);
-/// 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]
-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
-}
-/// Abstract class for data array
-class MGL_EXPORT mglDataA
-{
-public:
-       std::wstring s; ///< Data name
-       bool temp;              ///< This is temporary variable
-       void (*func)(void *);   ///< Callback function for destroying
-       void *o;                ///< Pointer to external object
-
-       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) {}
-       /// 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
-       virtual mreal value(mreal x,mreal y=0,mreal z=0) const =0;
-       /// Interpolate by linear function the data to given point
-       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 linear function the data to given point and get the gradient
-       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
-       {       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;
-       inline long GetNN() const {     return GetNx()*GetNy()*GetNz(); }
-       virtual mreal dvx(long i,long j=0,long k=0) const = 0;
-//     {       return i>0 ? (i<GetNx()-1 ? (v(i+1,j,k)-v(i-1,j,k))/2 : v(i,j,k)-v(i-1,j,k)) : v(1,j,k)-v(0,j,k);       }
-       virtual mreal dvy(long i,long j=0,long k=0) const = 0;
-//     {       return j>0 ? (j<GetNy()-1 ? (v(i,j+1,k)-v(i,j-1,k))/2 : v(i,j,k)-v(i,j-1,k)) : v(i,1,k)-v(i,0,k);       }
-       virtual mreal dvz(long i,long j=0,long k=0) const = 0;
-//     {       return k>0 ? (k<GetNz()-1 ? (v(i,j,k+1)-v(i,j,k-1))/2 : v(i,j,k)-v(i,j,k-1)) : v(i,j,1)-v(i,j,0);       }
-
-       // Now some common function which applicable for most of data types
-       /// Save whole data array (for ns=-1) or only ns-th slice to text file
-       virtual void Save(const char *fname,long ns=-1) const
-       {       mgl_data_save(this,fname,ns);   }
-       /// Get whole data array (for ns=-1) or only ns-th slice to string
-       virtual std::string Get(long ns=-1) const
-       {       return mgl_data_to_string(this,ns);     }
-       /// Export data array (for ns=-1) or only ns-th slice to PNG file according color scheme
-       inline void Export(const char *fname,const char *scheme,mreal v1=0,mreal v2=0,long ns=-1) const
-       {       mgl_data_export(this,fname,scheme,v1,v2,ns);    }
-       /// Save data to HDF file
-       virtual void SaveHDF(const char *fname,const char *data,bool rewrite=false) const
-       {       mgl_data_save_hdf(this,fname,data,rewrite);     }
-       /// 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);   }
-
-       /// Get information about the data (sizes and momentum) to string
-       inline const char *PrintInfo() const    {       return mgl_data_info(this);     }
-       /// Print information about the data (sizes and momentum) to FILE (for example, stdout)
-       inline void PrintInfo(FILE *fp) const
-       {       if(fp)  {       fprintf(fp,"%s",mgl_data_info(this));   fflush(fp);     }       }
-       /// Get maximal value of the data
-       virtual mreal Maximal() const   {       return mgl_data_max(this);      }
-       /// Get minimal value of the data
-       virtual mreal Minimal() const   {       return mgl_data_min(this);      }
-       /// Get maximal value of the data which is less than 0
-       inline mreal MaximalNeg() const {       return mgl_data_neg_max(this);  }
-       /// Get minimal value of the data which is larger than 0
-       inline mreal MinimalPos() const {       return mgl_data_pos_min(this);  }
-       /// Get maximal value of the data and its position
-       inline mreal Maximal(long &i,long &j,long &k) const
-       {       return mgl_data_max_int(this,&i,&j,&k); }
-       /// Get minimal value of the data and its position
-       inline mreal Minimal(long &i,long &j,long &k) const
-       {       return mgl_data_min_int(this,&i,&j,&k); }
-       /// Get maximal value of the data and its approximated position
-       inline mreal Maximal(mreal &x,mreal &y,mreal &z) const
-       {       return mgl_data_max_real(this,&x,&y,&z);        }
-       /// 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 "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);       }
-       /// Get "energy and find 4 momenta of data: median, width, skewness, kurtosis
-       inline mreal Momentum(char dir,mreal &m,mreal &w,mreal &s,mreal &k) const
-       {       return mgl_data_momentum_val(this,dir,&m,&w,&s,&k);     }
-       /// Find position (after specified in i,j,k) of first nonzero value of formula
-       inline mreal Find(const char *cond, long &i, long &j, long &k) const
-       {       return mgl_data_first(this,cond,&i,&j,&k);      }
-       /// Find position (before specified in i,j,k) of last nonzero value of formula
-       inline mreal Last(const char *cond, long &i, long &j, long &k) const
-       {       return mgl_data_last(this,cond,&i,&j,&k);       }
-       /// Find position of first in direction 'dir' nonzero value of formula
-       inline long Find(const char *cond, char dir, long i=0, long j=0, long k=0) const
-       {       return mgl_data_find(this,cond,dir,i,j,k);      }
-       /// 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
-struct MGL_EXPORT mglColorID
-{
-       char id;
-       mglColor col;
-};
-MGL_EXPORT extern mglColorID mglColorIds[31];
-MGL_EXPORT extern std::string mglGlobalMess;   ///< Buffer for receiving global messages
-//-----------------------------------------------------------------------------
-#endif
-
-#ifdef MGL_SRC
-#define _Da_(d)        (*((const mglDataA *)(d)))
-#define _DA_(a)        ((const mglDataA *)*(a))
-#define _GR_   ((mglBase *)(*gr))
-//#define _D_(d)       *((mglData *)*(d))
-#define _DM_(a)        ((mglData *)*(a))
-#define _DT_   ((mglData *)*d)
-#endif
-
-#endif
+/***************************************************************************\r
+ * abstract.h is part of Math Graphic Library\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
+ *   published by the Free Software Foundation; either version 3 of the    *\r
+ *   License, or (at your option) any later version.                       *\r
+ *                                                                         *\r
+ *   This program is distributed in the hope that it will be useful,       *\r
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *\r
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *\r
+ *   GNU General Public License for more details.                          *\r
+ *                                                                         *\r
+ *   You should have received a copy of the GNU Library General Public     *\r
+ *   License along with this program; if not, write to the                 *\r
+ *   Free Software Foundation, Inc.,                                       *\r
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *\r
+ ***************************************************************************/\r
+#ifndef _MGL_ABSTRACT_H_\r
+#define _MGL_ABSTRACT_H_\r
+\r
+#include "mgl2/define.h"\r
+//-----------------------------------------------------------------------------\r
+#ifdef __cplusplus\r
+#include "mgl2/type.h"\r
+#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;}\r
+//-----------------------------------------------------------------------------\r
+class mglBase;\r
+class mglData;\r
+class mglDataA;\r
+class mglDataC;\r
+class mglParser;\r
+class mglFormula;\r
+class mglFormulaC;\r
+class mglFont;\r
+typedef mglBase* HMGL;\r
+typedef mglData* HMDT;\r
+typedef mglDataC* HADT;\r
+typedef mglParser* HMPR;\r
+typedef mglFormula* HMEX;\r
+typedef mglFormulaC* HAEX;\r
+typedef const mglDataA* HCDT;\r
+//-----------------------------------------------------------------------------\r
+std::string MGL_EXPORT mgl_data_to_string(HCDT d, long ns);\r
+std::string MGL_EXPORT mgl_datac_to_string(HCDT d, long ns);\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=-1);\r
+/// Get sections separated by symbol ch\r
+std::vector<std::string> MGL_EXPORT mgl_str_args(const std::string &str, char ch);\r
+/// Get string from real number\r
+std::string MGL_EXPORT mgl_str_num(double val);\r
+/// Get string from complex number\r
+std::string MGL_EXPORT mgl_str_num(dual val);\r
+//-----------------------------------------------------------------------------\r
+\r
+extern "C" {\r
+\r
+#else\r
+#define mglDataA void\r
+#define mglNum void\r
+typedef void *HMGL;\r
+typedef void *HMDT;\r
+typedef void *HADT;\r
+typedef void *HMEX;\r
+typedef void *HAEX;\r
+typedef void *HMPR;\r
+typedef const void *HCDT;\r
+#endif\r
+\r
+/// Set buffer size for number of primitives as (1<<bsize)^2.\r
+/** I.e. as 10^12 for bsize=20 or 4*10^9 for bsize=16 (default). NOTE: you set it only once. The current value is returned. */\r
+unsigned MGL_EXPORT mgl_bsize(unsigned bsize);\r
+unsigned MGL_EXPORT mgl_bsize_(unsigned *bsize);\r
+\r
+/// Set seed for random numbers\r
+void MGL_EXPORT mgl_srnd(long seed);\r
+void MGL_EXPORT mgl_srnd_(int *seed);\r
+/// Get random number\r
+double MGL_EXPORT mgl_rnd();\r
+double MGL_EXPORT mgl_rnd_();\r
+\r
+/// Set name for data variable (can be used in mgl_formula_calc() or in MGL scripts)\r
+void MGL_EXPORT mgl_data_set_name(mglDataA *dat, const char *name);\r
+void MGL_EXPORT mgl_data_set_name_(uintptr_t *dat, const char *name,int);\r
+void MGL_EXPORT mgl_data_set_name_w(mglDataA *dat, const wchar_t *name);\r
+/// Get name of data variable\r
+MGL_EXPORT const wchar_t *mgl_data_get_name_w(HCDT dat);\r
+/// Set callback function which is called at deleting variable\r
+void MGL_EXPORT mgl_data_set_func(mglDataA *dat, void (*func)(void *), void *par);\r
+\r
+#define mgl_datac_set_id       mgl_data_set_id\r
+#define mgl_datac_set_id_      mgl_data_set_id_\r
+/// Set names for columns (slices)\r
+void MGL_EXPORT mgl_data_set_id(mglDataA *d, const char *ids);\r
+void MGL_EXPORT mgl_datac_set_id_(uintptr_t *d, const char *eq,int );\r
+/// Get names for columns (slices)\r
+MGL_EXPORT const char *mgl_data_get_id(HCDT d);\r
+\r
+/// Save whole data array (for ns=-1) or only ns-th slice to text file\r
+void MGL_EXPORT mgl_data_save(HCDT dat, const char *fname,long ns);\r
+void MGL_EXPORT mgl_data_save_(uintptr_t *dat, const char *fname,int *ns,int);\r
+/// Export data array (for ns=-1) or only ns-th slice to PNG file according color scheme\r
+void MGL_EXPORT mgl_data_export(HCDT dat, const char *fname, const char *scheme, double v1, double v2, long ns);\r
+void MGL_EXPORT mgl_data_export_(uintptr_t *dat, const char *fname, const char *scheme, mreal *v1, mreal *v2, int *ns,int,int);\r
+/// Save data to HDF file\r
+void MGL_EXPORT mgl_data_save_hdf(HCDT d,const char *fname,const char *data,int rewrite);\r
+void MGL_EXPORT mgl_data_save_hdf_(uintptr_t *d, const char *fname, const char *data, int *rewrite,int l,int n);\r
+/// Get information about the data (sizes and momentum) to string\r
+MGL_EXPORT const char *mgl_data_info(HCDT dat);\r
+int MGL_EXPORT mgl_data_info_(uintptr_t *dat, char *out, int len);\r
+/// Put HDF data names into buf as '\t' separated.\r
+long MGL_EXPORT mgl_datas_hdf(const char *fname, char *buf, long size);\r
+long MGL_EXPORT mgl_datas_hdf_(const char *fname, char *buf, int l, int size);\r
+/// Put HDF data names as list of strings (last one is "").\r
+MGL_EXPORT const char * const * mgl_datas_hdf_str(const char *fname);\r
+\r
+/// Get maximal value of the data\r
+mreal MGL_EXPORT mgl_data_max(HCDT dat);\r
+mreal MGL_EXPORT mgl_data_max_(uintptr_t *dat);\r
+/// Get maximal value of the data which is less than 0\r
+mreal MGL_EXPORT mgl_data_neg_max(HCDT dat);\r
+mreal MGL_EXPORT mgl_data_neg_max_(uintptr_t *dat);\r
+/// Get minimal value of the data\r
+mreal MGL_EXPORT mgl_data_min(HCDT dat);\r
+mreal MGL_EXPORT mgl_data_min_(uintptr_t *dat);\r
+/// Get minimal value of the data which is larger than 0\r
+mreal MGL_EXPORT mgl_data_pos_min(HCDT dat);\r
+mreal MGL_EXPORT mgl_data_pos_min_(uintptr_t *dat);\r
+/// Find position (after specified in i,j,k) of first nonzero value of formula\r
+mreal MGL_EXPORT mgl_data_first(HCDT dat, const char *cond, long *i, long *j, long *k);\r
+mreal MGL_EXPORT mgl_data_first_(uintptr_t *dat, const char *cond, int *i, int *j, int *k, int);\r
+/// Find position (before specified in i,j,k) of last nonzero value of formula\r
+mreal MGL_EXPORT mgl_data_last(HCDT dat, const char *cond, long *i, long *j, long *k);\r
+mreal MGL_EXPORT mgl_data_last_(uintptr_t *dat, const char *cond, int *i, int *j, int *k, int);\r
+/// Find position of first in direction 'dir' nonzero value of formula\r
+long MGL_EXPORT mgl_data_find(HCDT dat, const char *cond, char dir, long i, long j, long k);\r
+int MGL_EXPORT mgl_data_find_(uintptr_t *dat, const char *cond, char *dir, int *i, int *j, int *k, int,int);\r
+/// Find if any nonzero value of formula\r
+int MGL_EXPORT mgl_data_find_any(HCDT dat, const char *cond);\r
+int MGL_EXPORT mgl_data_find_any_(uintptr_t *dat, const char *cond, int);\r
+/// Get maximal value of the data and its position\r
+mreal MGL_EXPORT mgl_data_max_int(HCDT dat, long *i, long *j, long *k);\r
+mreal MGL_EXPORT mgl_data_max_int_(uintptr_t *dat, int *i, int *j, int *k);\r
+/// Get maximal value of the data and its approximated position\r
+mreal MGL_EXPORT mgl_data_max_real(HCDT dat, mreal *x, mreal *y, mreal *z);\r
+mreal MGL_EXPORT mgl_data_max_real_(uintptr_t *dat, mreal *x, mreal *y, mreal *z);\r
+/// Get minimal value of the data and its position\r
+mreal MGL_EXPORT mgl_data_min_int(HCDT dat, long *i, long *j, long *k);\r
+mreal MGL_EXPORT mgl_data_min_int_(uintptr_t *dat, int *i, int *j, int *k);\r
+/// Get minimal value of the data and its approximated position\r
+mreal MGL_EXPORT mgl_data_min_real(HCDT dat, mreal *x, mreal *y, mreal *z);\r
+mreal MGL_EXPORT mgl_data_min_real_(uintptr_t *dat, mreal *x, mreal *y, mreal *z);\r
+/// Get "energy and find 4 momenta of data: median, width, skewness, kurtosis\r
+mreal MGL_EXPORT mgl_data_momentum_val(HCDT d, char dir, mreal *m, mreal *w, mreal *s, mreal *k);\r
+mreal MGL_EXPORT mgl_data_momentum_val_(uintptr_t *dat, char *dir, mreal *m, mreal *w, mreal *s, mreal *k,int);\r
+/// Get first (last if from<0) maximum along direction dir, and save its orthogonal coordinates in p1, p2\r
+long MGL_EXPORT mgl_data_max_first(HCDT d, char dir, long from, long *p1, long *p2);\r
+long MGL_EXPORT mgl_data_max_first_(uintptr_t *d, const char *dir, long *from, long *p1, long *p2,int);\r
+\r
+/// Interpolate by linear function the data to given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1]\r
+mreal MGL_EXPORT mgl_data_linear(HCDT dat, mreal x,mreal y,mreal z);\r
+mreal MGL_EXPORT mgl_data_linear_(uintptr_t *dat, mreal *x,mreal *y,mreal *z);\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
+mreal MGL_EXPORT mgl_data_linear_ext(HCDT dat, mreal x,mreal y,mreal z, mreal *dx,mreal *dy,mreal *dz);\r
+mreal MGL_EXPORT mgl_data_linear_ext_(uintptr_t *dat, mreal *x,mreal *y,mreal *z, mreal *dx,mreal *dy,mreal *dz);\r
+\r
+/// Internal function for (un-)locking mutex in mglStack\r
+void MGL_EXPORT mgl_mutex_lock(void *);\r
+void MGL_EXPORT mgl_mutex_unlock(void *);\r
+\r
+//-----------------------------------------------------------------------------\r
+/// Create HMEX object for expression evaluating\r
+HMEX MGL_EXPORT mgl_create_expr(const char *expr);\r
+uintptr_t MGL_EXPORT mgl_create_expr_(const char *expr, int);\r
+/// Delete HMEX object\r
+void MGL_EXPORT mgl_delete_expr(HMEX ex);\r
+void MGL_EXPORT mgl_delete_expr_(uintptr_t *ex);\r
+/// Return value of expression for given x,y,z variables\r
+double MGL_EXPORT mgl_expr_eval(HMEX ex, double x, double y,double z);\r
+double MGL_EXPORT mgl_expr_eval_(uintptr_t *ex, mreal *x, mreal *y, mreal *z);\r
+/// Return value of expression for given variables\r
+double MGL_EXPORT mgl_expr_eval_v(HMEX ex, mreal *vars);\r
+/// Return value of expression differentiation over variable dir for given x,y,z variables\r
+double MGL_EXPORT mgl_expr_diff(HMEX ex, char dir, double x, double y,double z);\r
+double MGL_EXPORT mgl_expr_diff_(uintptr_t *ex, const char *dir, mreal *x, mreal *y, mreal *z, int);\r
+/// Return value of expression differentiation over variable dir for given variables\r
+double MGL_EXPORT mgl_expr_diff_v(HMEX ex, char dir, mreal *vars);\r
+//-----------------------------------------------------------------------------\r
+/// Create HAEX object for expression evaluating\r
+HAEX MGL_EXPORT mgl_create_cexpr(const char *expr);\r
+uintptr_t MGL_EXPORT mgl_create_cexpr_(const char *expr, int);\r
+/// Delete HAEX object\r
+void MGL_EXPORT mgl_delete_cexpr(HAEX ex);\r
+void MGL_EXPORT mgl_delete_cexpr_(uintptr_t *ex);\r
+/// Return value of expression for given x,y,z variables\r
+mdual MGL_EXPORT mgl_cexpr_eval(HAEX ex, dual x, dual y,dual z);\r
+mdual MGL_EXPORT mgl_cexpr_eval_(uintptr_t *ex, dual *x, dual *y, dual *z);\r
+/// Return value of expression for given variables\r
+mdual MGL_EXPORT mgl_cexpr_eval_v(HAEX ex, dual *vars);\r
+\r
+//-----------------------------------------------------------------------------\r
+/// Callback function for asking user a question. Result shouldn't exceed 1024.\r
+extern MGL_EXPORT void (*mgl_ask_func)(const wchar_t *quest, wchar_t *res);\r
+/// Console function for asking user a question. Result shouldn't exceed 1024.\r
+void MGL_EXPORT mgl_ask_gets(const wchar_t *quest, wchar_t *res);\r
+/// Callback function for displaying progress of something.\r
+extern MGL_EXPORT void (*mgl_progress_func)(int value, int maximal, HMGL gr);\r
+/// Console function for displaying progress of something.\r
+void MGL_EXPORT mgl_progress_txt(int value, int maximal, HMGL gr);\r
+/// Display progress of something.\r
+void MGL_EXPORT mgl_progress(int value, int maximal, HMGL gr);\r
+//-----------------------------------------------------------------------------\r
+#ifdef __cplusplus\r
+}\r
+//-----------------------------------------------------------------------------\r
+/// Structure for the number handling (see mglParse class).\r
+struct MGL_EXPORT mglNum\r
+{\r
+       mreal d;                ///< Number itself\r
+       dual c;\r
+       mglString s;    ///< Number name\r
+       mglNum(mreal val=0):d(val),c(val)       {}\r
+       mglNum(const mglNum &n):d(n.d),c(n.c),s(n.s) {}\r
+       const mglNum &operator=(const mglNum &n)\r
+       {       d=n.d;  c=n.c;  s=n.s;  return n;       }\r
+};\r
+//-----------------------------------------------------------------------------\r
+/// Abstract class for data array\r
+class MGL_EXPORT mglDataA\r
+{\r
+public:\r
+       mglString s;    ///< Data name\r
+       mglString id;   ///< column (or slice) names\r
+\r
+       bool temp;              ///< This is temporary variable\r
+       void (*func)(void *);   ///< Callback function for destroying\r
+       void *o;                ///< Pointer to external object\r
+\r
+       mglDataA()      {       temp=false;     func=0; o=0;    }\r
+       virtual ~mglDataA()     {       if(func)        func(o);        }\r
+       /// Set name for data variable (can be used in mgl_formula_calc() or in MGL scripts)\r
+       inline void Name(const char *name)              {       s = name;       }\r
+       inline void Name(const wchar_t *name)   {       s = name;       }\r
+       /// Get name of data variable\r
+       inline const wchar_t *Name()    const   {       return s.w;     }\r
+\r
+       /// Set names for columns (slices)\r
+       inline void SetColumnId(const char *ids)        {       id = ids;       }\r
+       /// Make new id\r
+       inline void NewId()     {       id = "";        }\r
+       /// Get names for columns (slices)\r
+       inline const char *GetColumnId() const  {       return id.s;    }\r
+       \r
+       virtual void set_v(mreal /*val*/, long /*i*/,long /*j*/=0,long /*k*/=0) {}\r
+       /// Get the interpolated value and its derivatives in given data cell without border checking\r
+       virtual mreal valueD(mreal x,mreal y=0,mreal z=0,mreal *dx=0,mreal *dy=0,mreal *dz=0) const =0;\r
+       /// Get the interpolated value in given data cell without border checking\r
+       virtual mreal value(mreal x,mreal y=0,mreal z=0) const =0;\r
+       /// Interpolate by linear function the data to given point\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 linear function the data to given point and get the gradient\r
+       inline mreal linearD(mreal x,mreal y=0,mreal z=0,mreal *dx=0,mreal *dy=0,mreal *dz=0)   const\r
+       {       return mgl_data_linear_ext(this,x,y,z,dx,dy,dz);        }\r
+       virtual mreal v(long i,long j=0,long k=0) const = 0;\r
+       virtual mreal vthr(long i) const\r
+       {       return v(i%GetNx(), (i/GetNx())%GetNy(), i/(GetNx()*GetNy()));  }\r
+       virtual dual vc(long i,long j=0,long k=0) const {       return v(i,j,k);        }\r
+       virtual dual vcthr(long i) const        {       return vthr(i); }\r
+       virtual long GetNx() const = 0;\r
+       virtual long GetNy() const = 0;\r
+       virtual long GetNz() const = 0;\r
+       inline long GetNN() const {     return GetNx()*GetNy()*GetNz(); }\r
+       virtual mreal dvx(long i,long j=0,long k=0) const = 0;\r
+//     {       return i>0 ? (i<GetNx()-1 ? (v(i+1,j,k)-v(i-1,j,k))/2 : v(i,j,k)-v(i-1,j,k)) : v(1,j,k)-v(0,j,k);       }\r
+       virtual mreal dvy(long i,long j=0,long k=0) const = 0;\r
+//     {       return j>0 ? (j<GetNy()-1 ? (v(i,j+1,k)-v(i,j-1,k))/2 : v(i,j,k)-v(i,j-1,k)) : v(i,1,k)-v(i,0,k);       }\r
+       virtual mreal dvz(long i,long j=0,long k=0) const = 0;\r
+//     {       return k>0 ? (k<GetNz()-1 ? (v(i,j,k+1)-v(i,j,k-1))/2 : v(i,j,k)-v(i,j,k-1)) : v(i,j,1)-v(i,j,0);       }\r
+\r
+       // Now some common function which applicable for most of data types\r
+       /// Save whole data array (for ns=-1) or only ns-th slice to text file\r
+       virtual void Save(const char *fname,long ns=-1) const\r
+       {       mgl_data_save(this,fname,ns);   }\r
+       /// Get whole data array (for ns=-1) or only ns-th slice to string\r
+       virtual std::string Get(long ns=-1) const\r
+       {       return mgl_data_to_string(this,ns);     }\r
+       /// Export data array (for ns=-1) or only ns-th slice to PNG file according color scheme\r
+       inline void Export(const char *fname,const char *scheme,mreal v1=0,mreal v2=0,long ns=-1) const\r
+       {       mgl_data_export(this,fname,scheme,v1,v2,ns);    }\r
+       /// Save data to HDF file\r
+       virtual void SaveHDF(const char *fname,const char *data,bool rewrite=false) const\r
+       {       mgl_data_save_hdf(this,fname,data,rewrite);     }\r
+       /// Put HDF data names into buf as '\t' separated.\r
+       inline static int DatasHDF(const char *fname, char *buf, long size)\r
+       {       return mgl_datas_hdf(fname,buf,size);   }\r
+       /// Put HDF data names as list of strings (last one is "").\r
+       inline static const char * const * DatasHDF(const char *fname)\r
+       {       return mgl_datas_hdf_str(fname);        }\r
+\r
+       /// Get information about the data (sizes and momentum) to string\r
+       inline const char *PrintInfo() const    {       return mgl_data_info(this);     }\r
+       /// Print information about the data (sizes and momentum) to FILE (for example, stdout)\r
+       inline void PrintInfo(FILE *fp) const\r
+       {       if(fp)  {       fprintf(fp,"%s",mgl_data_info(this));   fflush(fp);     }       }\r
+       /// Get maximal value of the data\r
+       virtual mreal Maximal() const   {       return mgl_data_max(this);      }\r
+       /// Get minimal value of the data\r
+       virtual mreal Minimal() const   {       return mgl_data_min(this);      }\r
+       /// Get maximal value of the data which is less than 0\r
+       inline mreal MaximalNeg() const {       return mgl_data_neg_max(this);  }\r
+       /// Get minimal value of the data which is larger than 0\r
+       inline mreal MinimalPos() const {       return mgl_data_pos_min(this);  }\r
+       /// Get maximal value of the data and its position\r
+       inline mreal Maximal(long &i,long &j,long &k) const\r
+       {       return mgl_data_max_int(this,&i,&j,&k); }\r
+       /// Get minimal value of the data and its position\r
+       inline mreal Minimal(long &i,long &j,long &k) const\r
+       {       return mgl_data_min_int(this,&i,&j,&k); }\r
+       /// Get maximal value of the data and its approximated position\r
+       inline mreal Maximal(mreal &x,mreal &y,mreal &z) const\r
+       {       return mgl_data_max_real(this,&x,&y,&z);        }\r
+       /// Get minimal value of the data and its approximated position\r
+       inline mreal Minimal(mreal &x,mreal &y,mreal &z) const\r
+       {       return mgl_data_min_real(this,&x,&y,&z);        }\r
+       /// Get first (last if from<0) maximum along direction dir, and save its orthogonal coordinates in p1, p2\r
+       inline long Maximal(char dir, long from, long &p1, long &p2) const\r
+       {       return mgl_data_max_first(this,dir,from,&p1,&p2);       }\r
+       inline long Maximal(char dir, long from) const\r
+       {       return mgl_data_max_first(this,dir,from,0,0);   }\r
+       /// Get "energy" and find first (median) and second (width) momenta of data\r
+       inline mreal Momentum(char dir,mreal &m,mreal &w) const\r
+       {       return mgl_data_momentum_val(this,dir,&m,&w,0,0);       }\r
+       /// Get "energy and find 4 momenta of data: median, width, skewness, kurtosis\r
+       inline mreal Momentum(char dir,mreal &m,mreal &w,mreal &s,mreal &k) const\r
+       {       return mgl_data_momentum_val(this,dir,&m,&w,&s,&k);     }\r
+       /// Find position (after specified in i,j,k) of first nonzero value of formula\r
+       inline mreal Find(const char *cond, long &i, long &j, long &k) const\r
+       {       return mgl_data_first(this,cond,&i,&j,&k);      }\r
+       /// Find position (before specified in i,j,k) of last nonzero value of formula\r
+       inline mreal Last(const char *cond, long &i, long &j, long &k) const\r
+       {       return mgl_data_last(this,cond,&i,&j,&k);       }\r
+       /// Find position of first in direction 'dir' nonzero value of formula\r
+       inline long Find(const char *cond, char dir, long i=0, long j=0, long k=0) const\r
+       {       return mgl_data_find(this,cond,dir,i,j,k);      }\r
+       /// Find if any nonzero value of formula\r
+       inline bool FindAny(const char *cond) const\r
+       {       return mgl_data_find_any(this,cond);    }\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*(GetNx()-1),y*(GetNy()-1),z*(GetNz()-1));        }\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*(GetNx()-1),y*(GetNy()-1),z*(GetNz()-1), &(dif.x),&(dif.y), &(dif.z));\r
+               dif.x*=GetNx()>1?GetNx()-1:1;   dif.y*=GetNy()>1?GetNy()-1:1;   dif.z*=GetNz()>1?GetNz()-1:1;   return res;     }\r
+\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*(GetNx()-1),y*(GetNy()-1),z*(GetNz()-1),0,0,0);       }\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*(GetNx()-1),y*(GetNy()-1),z*(GetNz()-1), &(dif.x),&(dif.y), &(dif.z));\r
+               dif.x*=GetNx()>1?GetNx()-1:1;   dif.y*=GetNy()>1?GetNy()-1:1;   dif.z*=GetNz()>1?GetNz()-1:1;   return res;     }\r
+};\r
+//-----------------------------------------------------------------------------\r
+/// Structure for color ID\r
+struct MGL_EXPORT mglColorID\r
+{\r
+       char id;\r
+       mglColor col;\r
+};\r
+MGL_EXPORT extern mglColorID mglColorIds[31];\r
+MGL_EXPORT extern std::string mglGlobalMess;   ///< Buffer for receiving global messages\r
+//-----------------------------------------------------------------------------\r
+#endif\r
+\r
+#ifdef MGL_SRC\r
+#define _Da_(d)        (*((const mglDataA *)(d)))\r
+#define _DA_(a)        ((const mglDataA *)*(a))\r
+#define _GR_   ((mglBase *)(*gr))\r
+//#define _D_(d)       *((mglData *)*(d))\r
+#define _DM_(a)        ((mglData *)*(a))\r
+#define _DT_   ((mglData *)*d)\r
+#endif\r
+\r
+#endif\r
index a455625c14c9cf4a1bf3cba95930a0da9771427d..154640ad04d5d157d72daecd7601ccedad5ea59d 100644 (file)
 #else\r
 #define MGL_PUSH(a,v,m)        a.push_back(v);\r
 #endif\r
+\r
+#if MGL_HAVE_PTHREAD\r
+#define MGL_PUSHs(func,m)      {pthread_mutex_lock(&m);        func;   pthread_mutex_unlock(&m);}\r
+#else\r
+#define MGL_PUSHs(func,m)      {func;}\r
+#endif\r
 //-----------------------------------------------------------------------------\r
 inline mreal mgl_d(mreal v,mreal v1,mreal v2) { return v2!=v1?(v-v1)/(v2-v1):NAN; }\r
 //-----------------------------------------------------------------------------\r
@@ -44,55 +50,66 @@ mglPoint GetZ(HCDT z, int i, int j, int k=0);
 // NOTE memcpy is used --> no memory allocation in T\r
 template <class T> class mglStack\r
 {\r
-       T** dat;\r
-       size_t pb;      ///< size of buffer (real size is 2^pb == 1L<<pb)\r
-       size_t np;      ///< allocated pointers\r
-       size_t m;       ///< used pointers (allocated size is m*nb)\r
+       T **dat;\r
+       unsigned MGL_PB;        ///< size of buffer (real size is 2^pb == 1L<<pb). \r
+       /** NOTE This limit the number of maximal points and primitives as (1<<MGL_PB)^2, \r
+         * i.e. as 10^12 for MGL_PB=20 or 4*10^9 for MGL_PB=16. See mgl_bsize().*/\r
+       size_t nb;      ///< used blocks\r
        size_t n;       ///< used cells\r
        void *mutex;\r
 public:\r
        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],((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[(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
+       {       mutex = 0;      n=0;    nb=1;   MGL_PB = mgl_bsize(0);\r
+               dat = new T*[(size_t)1<<MGL_PB];\r
+               *dat = new T[(size_t)1<<MGL_PB];        reserve(st.n);\r
+               for(size_t i=0;i<nb;i++)\r
+                       memcpy(dat[i],st.dat[i],((size_t)1<<MGL_PB)*sizeof(T));\r
+               n=st.n; }\r
+       mglStack()\r
+       {       mutex = 0;      n=0;    nb=1;   MGL_PB = mgl_bsize(0);\r
+               dat = new T*[(size_t)1<<MGL_PB];\r
+               *dat = new T[(size_t)1<<MGL_PB];        }\r
+       ~mglStack()     {       clear();        delete [](*dat);        delete []dat;   }\r
+       inline void set_mutex(void *mtx)        {       mutex=mtx;      }\r
+       inline size_t allocate(size_t num)\r
+       {       reserve(num);   size_t r=n;     n+=num; return r;       }\r
        void reserve(size_t num)\r
        {\r
-               num+=n;\r
-               if(num>(m<<pb))\r
+               num = num?num+n:n+1;    // final required size\r
+               if(num>(nb<<MGL_PB))\r
                {\r
-                       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[(size_t)1<<pb];\r
-                       m = num;\r
+                       num = 1 + (num>>MGL_PB);\r
+                       for(;nb<num;nb++)       dat[nb] = new T[(size_t)1<<MGL_PB];\r
                }\r
        }\r
        void clear()\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[(size_t)1<<pb];  n=0;    m=1;\r
+               for(size_t i=1;i<nb;i++)        delete [](dat[i]);\r
+               n=0;    nb=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)\r
+       {       size_t d=i>>MGL_PB;     return dat[d][i-(d<<MGL_PB)];   }\r
+       const T &operator[](size_t i)   const\r
+       {       size_t d=i>>MGL_PB;     return dat[d][i-(d<<MGL_PB)];   }\r
        void push_back(const T &t)\r
        {\r
-               if(n>=(m<<pb))  reserve(1);\r
-               register size_t d=n>>pb;\r
-               dat[d][n-(d<<pb)] = t;  n++;\r
+               if(n>=(nb<<MGL_PB))     reserve(1);\r
+               size_t d=n>>MGL_PB;     dat[d][n-(d<<MGL_PB)] = t;      n++;\r
+       }\r
+       void push_back(size_t num, const T *t)\r
+       {\r
+               if(n+num>=(nb<<MGL_PB)) reserve(num);\r
+               for(size_t i=0;i<num;i++)\r
+               {       size_t d=n>>MGL_PB;     dat[d][n-(d<<MGL_PB)] = t[i];   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],((size_t)1<<pb)*sizeof(T));\r
+               clear();        reserve(st.n);\r
+               for(size_t i=0;i<nb;i++)\r
+                       memcpy(dat[i],st.dat[i],((size_t)1<<MGL_PB)*sizeof(T));\r
                n = st.n;       return st;\r
        }\r
 };\r
@@ -100,21 +117,21 @@ public:
 /// Structure for transformation matrix\r
 struct MGL_EXPORT mglMatrix\r
 {\r
-       mreal b[9];\r
-       mreal x,y,z,pf;\r
+       float x,y,z,pf;\r
+       float b[9];\r
        bool norot;     // flag to disable pnts rotation\r
-       mglMatrix()     {       memset(this,0,sizeof(mglMatrix));       clear();        }\r
-       mglMatrix(const mglMatrix &aa) : x(aa.x),y(aa.y),z(aa.z),pf(aa.pf),norot(aa.norot)      {       memcpy(b,aa.b,9*sizeof(mreal)); }\r
+       mglMatrix()     {       clear();        }\r
+       mglMatrix(const mglMatrix &aa) : x(aa.x),y(aa.y),z(aa.z),pf(aa.pf),norot(aa.norot)      {       memcpy(b,aa.b,9*sizeof(float)); }\r
        void Rotate(mreal tetz,mreal tetx,mreal tety);\r
        void RotateN(mreal Tet,mreal x,mreal y,mreal z);\r
-       inline void clear()     {       x=y=z=pf=0;     memset(b,0,9*sizeof(mreal));    b[0]=b[4]=b[8]=1;       norot=false;    }\r
+       inline void clear()     {       x=y=z=pf=0;     memset(b,0,9*sizeof(float));    b[0]=b[4]=b[8]=1;       norot=false;    }\r
        inline const mglMatrix &operator=(const mglMatrix &a)\r
-       {       x=a.x;  y=a.y;  z=a.z;  pf=a.pf;        memcpy(b,a.b,9*sizeof(mreal));  norot=false;    return a;       }\r
+       {       x=a.x;  y=a.y;  z=a.z;  pf=a.pf;        memcpy(b,a.b,9*sizeof(float));  norot=false;    return a;       }\r
 };\r
 inline bool operator==(const mglMatrix &a, const mglMatrix &b)\r
-{      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.pf-b.pf)*(a.pf-b.pf)==0)&&!memcmp(b.b,a.b,9*sizeof(mreal));}\r
+{      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.pf-b.pf)*(a.pf-b.pf)==0)&&!memcmp(b.b,a.b,9*sizeof(float));}\r
 inline bool operator!=(const mglMatrix &a, const mglMatrix &b)\r
-{      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.pf-b.pf)*(a.pf-b.pf)!=0)||memcmp(b.b,a.b,9*sizeof(mreal));       }\r
+{      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.pf-b.pf)*(a.pf-b.pf)!=0)||memcmp(b.b,a.b,9*sizeof(float));       }\r
 //-----------------------------------------------------------------------------\r
 /// Structure for simplest primitives\r
 struct MGL_EXPORT mglPrim      // NOTE: use float for reducing memory size\r
@@ -136,7 +153,8 @@ struct MGL_EXPORT mglPrim   // NOTE: use float for reducing memory size
                };\r
                uint64_t m;\r
        };\r
-       mglPrim(int t=0):n1(0),n2(0),n3(0),n4(0),type(t),angl(0),id(0),z(0),w(0),m(0)   {}\r
+       mglPrim():n1(0),n2(0),n3(0),n4(0),type(0),angl(0),id(0),z(0),w(0),m(0)  {}\r
+       explicit mglPrim(int t):n1(0),n2(0),n3(0),n4(0),type(t),angl(0),id(0),z(0),w(0),m(0)    {}\r
        mglPrim(const mglPrim &aa) : n1(aa.n1),n2(aa.n2),n3(aa.n3),n4(aa.n4),type(aa.type),angl(aa.angl),id(aa.id),z(aa.z),w(aa.w),m(aa.m)      {}\r
        const mglPrim &operator=(const mglPrim &aa)     {       memcpy(this, &aa, sizeof(mglPrim));     return aa;      }\r
 };\r
@@ -146,31 +164,33 @@ bool operator>(const mglPrim &a,const mglPrim &b);
 /// Structure for light source\r
 struct MGL_EXPORT mglLight\r
 {\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
+       mglLight():a(0),b(0),n(false)   {}\r
+       mglLight(const mglLight &aa) : d(aa.d),r(aa.r),q(aa.q),p(aa.p),c(aa.c),a(aa.a),b(aa.b),n(aa.n)  {}\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
        mglPoint r;             ///< Position of light sources (NAN for infinity)\r
        mglPoint q;             ///< Actual position of light sources (filled by LightScale() function)\r
        mglPoint p;             ///< Actual direction of light sources (filled by LightScale() function)\r
-       mreal a;                ///< Aperture of light sources\r
-       mreal b;                ///< Brightness of light sources\r
        mglColor c;             ///< Color of light sources\r
+       float a;                ///< Aperture of light sources\r
+       float b;                ///< Brightness of light sources\r
+       bool n;                 ///< Availability of light sources\r
 };\r
 //-----------------------------------------------------------------------------\r
 /// Structure for inplot\r
 struct MGL_EXPORT mglBlock\r
 {\r
-       int id;         ///< object id\r
        long n1,n2,n3,n4;       ///< coordinates of corners {n1=x1,n2=x2,n3=y1,n4=y2}\r
 \r
        mglLight light[10];     ///< Light sources\r
-       mreal AmbBr;            ///< Default ambient light brightness\r
-       mreal DifBr;            ///< Default diffusive light brightness\r
+       float AmbBr;            ///< Default ambient light brightness\r
+       float DifBr;            ///< Default diffusive light brightness\r
        mglMatrix B;            ///< Transformation matrix\r
+       int id;         ///< object id\r
 \r
-       mglBlock():id(0),n1(0),n2(0),n3(0),n4(0),AmbBr(0.5),DifBr(0.5)  {}\r
+       mglBlock():n1(0),n2(0),n3(0),n4(0),AmbBr(0.5),DifBr(0.5),id(0)  {}\r
        mglBlock(const mglBlock &aa)    {       memcpy(this, &aa, sizeof(mglBlock));    }\r
        const mglBlock &operator=(const mglBlock &aa)   {       memcpy(this, &aa, sizeof(mglBlock));    return aa;      }\r
 };\r
@@ -194,9 +214,9 @@ struct MGL_EXPORT mglText
 {\r
        std::wstring text;\r
        std::string stl;\r
-       mreal val;\r
-       mglText(const wchar_t *txt=L"", const char *fnt="", mreal v=0) : text(txt), stl(fnt), val(v) {}\r
-       mglText(const std::wstring &txt, mreal v=0): text(txt), val(v)  {}\r
+       float val;\r
+       mglText(const wchar_t *txt=L"", const char *fnt="", float v=0) : text(txt), stl(fnt), val(v) {}\r
+       mglText(const std::wstring &txt, float v=0): text(txt), val(v)  {}\r
        mglText(const mglText &aa) : text(aa.text),stl(aa.stl),val(aa.val)      {}\r
 #if MGL_HAVE_RVAL\r
        mglText(mglText &&aa) : text(aa.text),stl(aa.stl),val(aa.val)   {}\r
@@ -207,52 +227,52 @@ struct MGL_EXPORT mglText
 /// Structure for internal point representation\r
 struct MGL_EXPORT mglPnt       // NOTE: use float for reducing memory size\r
 {\r
-       union { float dat[16];  struct {\r
+       union { float dat[15];  struct {\r
                float x,y,z;    // coordinates\r
                float u,v,w;    // normales\r
                float r,g,b,a;  // RGBA color\r
                float xx,yy,zz; // original coordinates\r
-               float c,t,ta;   // index in color scheme\r
+               float c,ta;     // index in color scheme\r
        }; };\r
-       short sub;              // subplot id and rotation information (later will be in subplot)\r
-       mglPnt(float X, float Y=0, float Z=0, float U=0, float V=0, float W=0, float R=0, float G=0, float B=0, float A=0):x(X),y(Y),z(Z),u(U),v(V),w(W),r(R),g(G),b(B),a(A),xx(X),yy(Y),zz(Z),c(0),t(0),ta(0),sub(0)   {}\r
-       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
+       int sub;                // subplot id and rotation information (later will be in subplot)\r
+       mglPnt(float X=0, float Y=0, float Z=0, float U=0, float V=0, float W=0, float R=0, float G=0, float B=0, float A=0, short s=0) :x(X),y(Y),z(Z),u(U),v(V),w(W),r(R),g(G),b(B),a(A),xx(X),yy(Y),zz(Z),c(0),ta(0),sub(s)  {}\r
+       mglPnt(const mglPnt &aa) : sub(aa.sub)  {       memcpy(dat,aa.dat,15*sizeof(float));    }\r
+       inline const mglPnt&operator=(const mglPnt &aa) { sub=aa.sub;   memcpy(dat,aa.dat,15*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
-//{    return mglPnt(a.x+b.x,a.y+b.y,a.z+b.z, a.u+b.u,a.v+b.v,a.w+b.w, a.r+b.r,a.g+b.g,a.b+b.b,a.a+b.a);       }\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
+{      return mglPnt(a.x+b.x,a.y+b.y,a.z+b.z, a.u+b.u,a.v+b.v,a.w+b.w, a.r+b.r,a.g+b.g,a.b+b.b,a.a+b.a, a.sub);        }\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
-//{    return mglPnt(a.x-b.x,a.y-b.y,a.z-b.z, a.u-b.u,a.v-b.v,a.w-b.w, a.r-b.r,a.g-b.g,a.b-b.b,a.a-b.a);       }\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
+{      return mglPnt(a.x-b.x,a.y-b.y,a.z-b.z, a.u-b.u,a.v-b.v,a.w-b.w, a.r-b.r,a.g-b.g,a.b-b.b,a.a-b.a, a.sub);        }\r
 inline mglPnt operator*(const mglPnt &a, float b)\r
-{      mglPnt p;       for(long i=0;i<10;i++)  p.dat[i] = a.dat[i]*b;  p.sub=a.sub;    return p;       }\r
-//{    return mglPnt(a.x*b,a.y*b,a.z*b, a.u*b,a.v*b,a.w*b, a.r*b,a.g*b,a.b*b,a.a*b);   }\r
+//{    mglPnt p;       for(long i=0;i<10;i++)  p.dat[i] = a.dat[i]*b;  p.sub=a.sub;    return p;       }\r
+{      return mglPnt(a.x*b,a.y*b,a.z*b, a.u*b,a.v*b,a.w*b, a.r*b,a.g*b,a.b*b,a.a*b, a.sub);    }\r
 inline mglPnt operator*(float b, const mglPnt &a)\r
-{      mglPnt p;       for(long i=0;i<10;i++)  p.dat[i] = a.dat[i]*b;  p.sub=a.sub;    return p;       }\r
-//{    return mglPnt(a.x*b,a.y*b,a.z*b, a.u*b,a.v*b,a.w*b, a.r*b,a.g*b,a.b*b,a.a*b);   }\r
+//{    mglPnt p;       for(long i=0;i<10;i++)  p.dat[i] = a.dat[i]*b;  p.sub=a.sub;    return p;       }\r
+{      return mglPnt(a.x*b,a.y*b,a.z*b, a.u*b,a.v*b,a.w*b, a.r*b,a.g*b,a.b*b,a.a*b, a.sub);    }\r
 //-----------------------------------------------------------------------------\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
@@ -260,25 +280,31 @@ struct MGL_EXPORT mglGlyph
 struct MGL_EXPORT mglTexture\r
 {\r
        mglColor *col;  ///< Colors itself\r
-       long n;                         ///< Number of initial colors along u\r
+       long n;                 ///< Number of initial colors along u\r
+       mglColor *c0;   ///< Initial colors\r
+       float *val;     ///< Initial color positions\r
 \r
-       char Sch[260];          ///< Color scheme used\r
-       int Smooth;                     ///< Type of texture (smoothing and so on)\r
-       mreal Alpha;                    ///< Transparency\r
+       char Sch[260];  ///< Color scheme used\r
+       int Smooth;             ///< Type of texture (smoothing and so on)\r
+       float Alpha;    ///< Transparency\r
 \r
-       mglTexture():n(0),Smooth(0),Alpha(1)\r
+       mglTexture():n(0),c0(NULL),val(NULL),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
+       mglTexture(const char *cols, int smooth=0,mreal alpha=1):n(0),c0(NULL),val(NULL)\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
        {       col = new mglColor[MGL_TEXTURE_COLOURS];        memcpy(Sch,aa.Sch,260);\r
-               memcpy(col,aa.col,MGL_TEXTURE_COLOURS*sizeof(mglColor));        }\r
+               memcpy(col,aa.col,MGL_TEXTURE_COLOURS*sizeof(mglColor));\r
+               c0 = new mglColor[2*aa.n];      memcpy(c0,aa.c0,2*aa.n*sizeof(mglColor));\r
+               val = new float[aa.n];          memcpy(val,aa.val,aa.n*sizeof(float));  }\r
 #if MGL_HAVE_RVAL\r
-       mglTexture(mglTexture &&aa) : n(aa.n),Smooth(aa.Smooth),Alpha(aa.Alpha)\r
-       {       col = aa.col;   memcpy(Sch,aa.Sch,260); aa.col=0;       }\r
+       mglTexture(mglTexture &&aa) : n(aa.n),c0(aa.c0),val(aa.val),Smooth(aa.Smooth),Alpha(aa.Alpha)\r
+       {       col = aa.col;   memcpy(Sch,aa.Sch,260); aa.col=aa.c0=0; aa.val=0;       }\r
 #endif\r
-       ~mglTexture()   {       if(col) delete []col;   }\r
-       void Clear()    {       n=0;    }\r
+       ~mglTexture()   {       if(col) delete []col;   Clear();        }\r
+       void Clear()\r
+       {       if(c0)  {       delete []c0;    delete []val;   }\r
+               n=0;    c0=NULL;        val=NULL;       }\r
        void Set(const char *cols, int smooth=0,mreal alpha=1);\r
        void Set(HCDT val, const char *cols);\r
        void GetC(mreal u,mreal v,mglPnt &p) const;\r
@@ -308,15 +334,15 @@ struct MGL_EXPORT mglActivePos
 };\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
+MGL_EXTERN template class MGL_EXPORT mglStack<mglPnt>;\r
+MGL_EXTERN template class MGL_EXPORT mglStack<mglPrim>;\r
+MGL_EXTERN template class MGL_EXPORT std::vector<mglGroup>;\r
+MGL_EXTERN template class MGL_EXPORT std::vector<mglText>;\r
+MGL_EXTERN template class MGL_EXPORT std::vector<mglTexture>;\r
+MGL_EXTERN template class MGL_EXPORT std::vector<mglGlyph>;\r
+MGL_EXTERN template class MGL_EXPORT std::vector<mglBlock>;\r
+MGL_EXTERN template class MGL_EXPORT std::vector<mglMatrix>;\r
+MGL_EXTERN template class MGL_EXPORT mglStack<mglActivePos>;\r
 #endif\r
 //-----------------------------------------------------------------------------\r
 /// Base class for canvas which handle all basic drawing\r
@@ -335,6 +361,8 @@ public:
        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
@@ -420,6 +448,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
@@ -428,11 +457,11 @@ public:
        /// Set number of mesh lines\r
        inline void SetMeshNum(int val) {       MeshNum=val;    }\r
        /// Set relative width of rectangles in Bars, Barh, BoxPlot\r
-       inline void SetBarWidth(mreal val)      {       BarWidth=val;   }\r
+       inline void SetBarWidth(mreal val)      {       BarWidth=val>0?val:-BarWidth*val;       }\r
        /// Set size of marks\r
-       inline void SetMarkSize(mreal val)      {       MarkSize=0.02*val;      }\r
+       inline void SetMarkSize(mreal val)      {       MarkSize=val>0?0.02*val:-val*MarkSize;  }\r
        /// Set size of arrows\r
-       inline void SetArrowSize(mreal val)     {       ArrowSize=0.03*val;     }\r
+       inline void SetArrowSize(mreal val)     {       ArrowSize=val>0?0.03*val:-val*ArrowSize;        }\r
        /// Get unscaled arrow size\r
        inline mreal GetArrowSize() const       {       return ArrowSize/0.03;  }\r
 \r
@@ -472,11 +501,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
@@ -498,15 +529,33 @@ public:
        inline long AddPnt(mglPoint p, mreal c=-1, mglPoint n=mglPoint(NAN), mreal a=-1, int scl=1)\r
        {       return AddPnt(&B,p,c,n,a,scl);  }\r
        long AddPnt(const mglMatrix *M, mglPoint p, mreal c=-1, mglPoint n=mglPoint(NAN), mreal a=-1, int scl=1);\r
+       bool AddPntQ(mglPnt &q, const mglMatrix *M, mglPoint p, mreal c=-1, mglPoint n=mglPoint(NAN), mreal a=-1, int scl=1);\r
+       inline bool AddPntQ(mglPnt &q, mglPoint p, mreal c=-1, mglPoint n=mglPoint(NAN), mreal a=-1, int scl=1)\r
+       {       return AddPntQ(q,&B,p,c,n,a,scl);       }\r
+       inline bool AddPntQ(long id, const mglMatrix *M, mglPoint p, mreal c=-1, mglPoint n=mglPoint(NAN), mreal a=-1, int scl=1)\r
+       {       return AddPntQ(Pnt[id],M,p,c,n,a,scl);  }\r
+       inline bool AddPntQ(long id, mglPoint p, mreal c=-1, mglPoint n=mglPoint(NAN), mreal a=-1, int scl=1)\r
+       {       return AddPntQ(Pnt[id],&B,p,c,n,a,scl); }\r
+       inline void SetPntOff(size_t id)        {       Pnt[id].x=NAN;  }\r
+       long AllocPnts(size_t num);\r
+       long PushPnts(size_t num, const mglPnt *qq);\r
        long CopyNtoC(long k, mreal c);\r
+       bool CopyNtoC(mglPnt &q, long k, mreal c);\r
+       inline bool CopyNtoC(long id, long k, mreal c)\r
+       {       return (id>=0)?CopyNtoC(Pnt[id],k,c):false;     }\r
        long CopyProj(long from, mglPoint p, mglPoint n, short sub=0);\r
+       bool CopyProj(mglPnt &q, long from, mglPoint p, mglPoint n, short sub=0);\r
+       void CopyProj(long id, long from, mglPoint p, mglPoint n, short sub=0)\r
+       {       if(id>=0)       CopyProj(Pnt[id],from,p,n,sub); }\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
@@ -526,6 +575,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 mgl_isnan(p.x) || mgl_isnan(q.x) || (p.x==q.x && p.y==q.y);\r
+       }\r
+       inline bool ValidPnt(size_t i)  {       return mgl_isnum(Pnt[i].x);     }\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
@@ -539,6 +595,9 @@ public:
        /// Scale coordinates and cut off some points\r
        virtual bool ScalePoint(const mglMatrix *M, mglPoint &p, mglPoint &n, bool use_nan=true) const;\r
 \r
+       inline const mglBlock &GetSub(size_t i) const   {       return Sub[i];  }\r
+       inline const mglBlock &GetSub() const   {       return Sub.back();      }\r
+\r
        virtual mreal GetOrgX(char dir, bool inv=false) const=0;        ///< Get Org.x (parse NAN value)\r
        virtual mreal GetOrgY(char dir, bool inv=false) const=0;        ///< Get Org.y (parse NAN value)\r
        virtual mreal GetOrgZ(char dir, bool inv=false) const=0;        ///< Get Org.z (parse NAN value)\r
@@ -566,14 +625,21 @@ 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
+       void curve_plot(size_t n, size_t kq, size_t step=1);\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
@@ -594,7 +660,7 @@ 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
@@ -613,8 +679,8 @@ protected:
        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
@@ -626,16 +692,16 @@ protected:
        char FontDef[32];       ///< Font specification (see mglGraph::Puts). Default is Roman with align at center.\r
        int Quality;            ///< Quality of plot (0x0-pure, 0x1-fast; 0x2-fine; 0x4 - low memory)\r
 \r
-       mglFormula *fx;         ///< Transformation formula for x direction.\r
-       mglFormula *fy;         ///< Transformation formula for y direction.\r
-       mglFormula *fz;         ///< Transformation formula for z direction.\r
-       mglFormula *fa;         ///< Transformation formula for coloring.\r
-       mglFormula *fc;         ///< Cutting off condition (formula).\r
+       HMEX fx;                        ///< Transformation formula for x direction.\r
+       HMEX fy;                        ///< Transformation formula for y direction.\r
+       HMEX fz;                        ///< Transformation formula for z direction.\r
+       HMEX fa;                        ///< Transformation formula for coloring.\r
+       HMEX fc;                        ///< Cutting off condition (formula).\r
 \r
        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 9bcb77190827cddbd546349a38cfbd5b5f9fca4c..77a6dbc5fb6b7545d7e7626f9e25599f55b4cd26 100644 (file)
@@ -213,6 +213,9 @@ void MGL_EXPORT mgl_set_font_def_(uintptr_t *gr, const char *fnt, int);
 /// Set to use or not text rotation\r
 void MGL_EXPORT mgl_set_rotated_text(HMGL gr, int enable);\r
 void MGL_EXPORT mgl_set_rotated_text_(uintptr_t *gr, int *enable);\r
+/// Set to scale text in relative subplots too\r
+void MGL_EXPORT mgl_set_scale_text(HMGL gr, int enable);\r
+void MGL_EXPORT mgl_set_scale_text_(uintptr_t *gr, int *enable);\r
 /// Load font from file\r
 void MGL_EXPORT mgl_load_font(HMGL gr, const char *name, const char *path);\r
 void MGL_EXPORT mgl_load_font_(uintptr_t *gr, char *name, char *path, int l, int n);\r
@@ -222,6 +225,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 d8c1db61577ece0e72d9a25d0d365b8d01c42253..10e695e5047fbb906ec4507ff7129bfe92a08a97 100644 (file)
@@ -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
@@ -102,7 +108,7 @@ struct MGL_EXPORT mglDrawDat
        std::vector<mglTexture> Txt;    ///< Pointer to textures\r
 };\r
 #if defined(_MSC_VER)\r
-template class MGL_EXPORT std::vector<mglDrawDat>;\r
+MGL_EXTERN template class MGL_EXPORT std::vector<mglDrawDat>;\r
 #endif\r
 //-----------------------------------------------------------------------------\r
 union mglRGBA  {       uint32_t c; unsigned char r[4]; };\r
@@ -139,7 +145,7 @@ 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
@@ -167,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
@@ -186,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
@@ -206,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
@@ -367,16 +382,20 @@ 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
+       inline mglAxis &GetAxis(unsigned ch)\r
+       {       mglAxis *aa[3]={&ax,&ay,&az};   ch-='x';        return ch<3?*(aa[ch]):ac;       }\r
+       inline HMEX GetFormula(unsigned ch)\r
+       {       HMEX aa[3]={fx,fy,fz};  ch-='x';        return ch<3?aa[ch]:fa;  }\r
        /// Auto adjust ticks\r
        void AdjustTicks(mglAxis &aa, bool ff);\r
        /// 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
@@ -406,6 +425,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
@@ -418,8 +438,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
@@ -442,6 +472,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
@@ -462,7 +495,7 @@ private:
        void tick_draw(mglPoint o, mglPoint d1, mglPoint d2, int f);\r
        mreal FindOptOrg(char dir, int ind) const MGL_FUNC_PURE;\r
        /// Transform mreal color and alpha to bits format\r
-       unsigned char* col2int(const mglPnt &p, unsigned char *r, int obj_id) const;\r
+       void col2int(const mglPnt &p, unsigned char *r, int obj_id) const;\r
        /// Combine colors in 2 plane.\r
        void combine(unsigned char *c1, const unsigned char *c2) const;\r
        /// Fast drawing of line between 2 points\r
@@ -475,11 +508,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
@@ -504,4 +532,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 91fddea2cb8b45b1c005589419719e152ebb2ed9..5892897be43026e2a42716e5de90d71fa240b522 100644 (file)
@@ -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
@@ -467,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
@@ -527,8 +541,12 @@ void MGL_EXPORT mgl_set_click_func(HMGL gr, void (*func)(void *p));
 void MGL_EXPORT mgl_wnd_set_mutex(HMGL gr, pthread_mutex_t *mutex);\r
 #endif\r
 \r
+/// Make custom dialog for parameters ids of element properties defined by args\r
+void MGL_EXPORT mgl_wnd_make_dialog(HMGL gr, const char *ids, char const * const *args, const char *title);\r
 /// Set callback functions for drawing and data reloading\r
 void MGL_EXPORT mgl_wnd_set_func(HMGL gr, int (*draw)(HMGL gr, void *p), void *par, void (*reload)(void *p));\r
+/// Set callback functions for setting properties\r
+void MGL_EXPORT mgl_wnd_set_prop(HMGL gr, void (*prop)(char id, const char *val, void *p), void *par);\r
 /// Set delay for animation in seconds\r
 void MGL_EXPORT mgl_wnd_set_delay(HMGL gr, double dt);\r
 void MGL_EXPORT mgl_wnd_set_delay_(uintptr_t *gr, mreal *dt);\r
@@ -607,6 +625,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
@@ -624,6 +650,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
@@ -653,6 +683,10 @@ void MGL_EXPORT mgl_parser_stop_(uintptr_t* p);
 /// 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
@@ -664,7 +698,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 19091edaccadcdbef3c166c260e62167a587be40..4c330f36463d79659e98662575d350352e991eb9 100644 (file)
@@ -53,11 +53,11 @@ public:
 \r
        virtual void ToggleAlpha()=0;   ///< Switch on/off transparency (do not overwrite user settings)\r
        virtual void ToggleLight()=0;   ///< Switch on/off lighting (do not overwrite user settings)\r
-       virtual void ToggleZoom()=0;            ///< Switch on/off zooming by mouse\r
+       virtual void ToggleZoom()=0;    ///< Switch on/off zooming by mouse\r
        virtual void ToggleRotate()=0;  ///< Switch on/off rotation by mouse\r
        virtual void ToggleNo()=0;              ///< Switch off all zooming and rotation\r
-       virtual void Update()=0;                        ///< Update picture by calling user drawing function\r
-       virtual void Adjust()=0;                        ///< Adjust size of bitmap to window size\r
+       virtual void Update()=0;                ///< Update picture by calling user drawing function\r
+       virtual void Adjust()=0;                ///< Adjust size of bitmap to window size\r
        virtual void GotoFrame(int d)=0;///< Show arbitrary frame (use relative step)\r
        virtual void NextFrame()        {GotoFrame(+1);}        ///< Show next frame (if one)\r
        virtual void PrevFrame()        {GotoFrame(-1);}        ///< Show previous frame (if one)\r
@@ -68,6 +68,13 @@ public:
                                                const char *title, void *par=NULL,\r
                                                void (*reload)(void *p)=NULL, bool maximize=false)=0;\r
        void SetDrawFunc(int (*draw)(mglBase *gr, void *p), void *par=NULL, void (*reload)(void *p)=NULL);\r
+       /// Set callback function for properties setup\r
+       void SetPropFunc(void (*prop)(char id, const char *val, void *p), void *par=NULL)\r
+       {       PropFunc = prop;        PropPar = par;  }\r
+       inline void SetParam(char id, const char *val)  ///< Set parameter (usually from custom dialog)\r
+       {       if(PropFunc)    {       PropFunc(id,val,PropPar);       Update();       }       }\r
+       ///< Make custom dialog\r
+       virtual void MakeDialog(const char *ids, char const * const *args, const char *title="")=0;\r
 \r
 private:\r
        int CurFig;                     ///< Current figure in the list.\r
@@ -78,6 +85,9 @@ private:
        void *FuncPar;          ///< Parameters for drawing function mglCanvas::DrawFunc.\r
        /// Drawing function for window procedure. It should return the number of frames.\r
        int (*DrawFunc)(mglBase *gr, void *par);\r
+       void *PropPar;  ///< Parameters for prop_func().\r
+       /// Function for setting properties.\r
+       void (*PropFunc)(char id, const char *val, void *par);\r
 };\r
 //-----------------------------------------------------------------------------\r
 #endif\r
index bd3b91c201ae1f0c2af4a9188beecc98e66a5f50..6f52224fbab54b88913160bdf446adf29ec543ae 100644 (file)
@@ -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 462ec83483d2eb33a803bb4e5e279a961518ea85..06658ff92170aa4b969144aa2a023b4d23fd27bd 100644 (file)
@@ -28,7 +28,6 @@
 mreal MGL_EXPORT mglLinear(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z);\r
 mreal MGL_EXPORT mglSpline3(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z,mreal *dx=0, mreal *dy=0, mreal *dz=0);\r
 mreal MGL_EXPORT mglSpline3s(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z);\r
-std::string MGL_EXPORT mgl_data_to_string(HCDT d, long ns);\r
 //-----------------------------------------------------------------------------\r
 /// Class for working with data array\r
 class MGL_EXPORT mglData : public mglDataA\r
@@ -39,14 +38,13 @@ using mglDataA::Momentum;
        long ny;                ///< number of points in 2nd dimensions ('y' dimension)\r
        long nz;                ///< number of points in 3d dimensions ('z' dimension)\r
        mreal *a;               ///< data array\r
-       std::string id; ///< column (or slice) names\r
        bool link;              ///< use external data (i.e. don't free it)\r
 \r
        /// Initiate by other mglData variable\r
        mglData(const mglData &d)       {       a=0;    mgl_data_set(this,&d);          }       // NOTE: must be constructor for mglData& to exclude copy one\r
 #if MGL_HAVE_RVAL\r
-       mglData(mglData &&d):nx(d.nx),ny(d.ny),nz(d.nz),a(d.a),id(d.id),link(d.link)\r
-       {       s=d.s;  temp=d.temp;    func=d.func;    o=d.o;  d.a=0;  d.func=0;       }\r
+       mglData(mglData &&d):nx(d.nx),ny(d.ny),nz(d.nz),a(d.a),link(d.link)\r
+       {       s=d.s;  temp=d.temp;    func=d.func;    o=d.o;  id=d.id;        d.a=0;  d.func=0;       }\r
 #endif\r
        mglData(const mglDataA *d)\r
        {       a=0;    if(d)   mgl_data_set(this, d);  else    mgl_data_create(this,1,1,1);            }\r
@@ -143,6 +141,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
@@ -163,15 +162,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
@@ -226,11 +228,6 @@ using mglDataA::Momentum;
        /// Put array to data element(s)\r
        inline void Put(const mglDataA &dat, long i=-1, long j=-1, long k=-1)\r
        {       mgl_data_put_dat(this,&dat,i,j,k);      }\r
-       /// Set names for columns (slices)\r
-       inline void SetColumnId(const char *ids)\r
-       {       mgl_data_set_id(this,ids);      }\r
-       /// Make new id\r
-       inline void NewId()     {       id.clear();     }\r
 \r
        /// Read data from tab-separated text file with auto determining size\r
        inline bool Read(const char *fname)\r
@@ -276,6 +273,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
@@ -307,15 +311,23 @@ using mglDataA::Momentum;
        {       return mglData(true,mgl_data_evaluate(this,&idat,&jdat,0,norm));        }\r
        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 nonlinear equation defined by textual formula\r
+       inline mglData Roots(const char *eq, char var='x') const\r
+       {       return mglData(true,mgl_data_roots(eq, this, var));     }\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 MultiRoots(const char *eq, const char *vars) const\r
+       {       return mglData(true,mgl_find_roots_txt(eq, vars, this));        }\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
@@ -323,6 +335,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
@@ -340,6 +355,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
@@ -365,6 +386,9 @@ using mglDataA::Momentum;
        /// 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
+       /// Project the periodical data to range [v1,v2] (like mod() function). Separate branches by NAN if sep=true.\r
+       inline void Coil(mreal v1, mreal v2, bool sep=true)\r
+       {       mgl_data_coil(this, v1, v2, sep);       }\r
 \r
        /// Apply Hankel transform\r
        inline void Hankel(const char *dir)     {       mgl_data_hankel(this,dir);      }\r
@@ -372,7 +396,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
@@ -418,8 +447,8 @@ using mglDataA::Momentum;
        inline void operator-=(mreal d)         {       mgl_data_sub_num(this,d);       }\r
 #ifndef SWIG\r
        /// Direct access to the data cell\r
-       inline mreal &operator[](long i)        {       return a[i];    }\r
-       // NOTE see 13.10 for operator(), operator[] -- m.b. I should add it ???\r
+       inline mreal operator[](long i) const   {       return a[i];    }\r
+       inline mreal &operator[](long i)                {       return a[i];    }\r
 #endif\r
 \r
 #ifndef DEBUG\r
@@ -442,14 +471,17 @@ 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
-               return i>0? (i<nx-1? (a[i0+1]-a[i0-1])/2:a[i0]-a[i0-1]) : a[i0+1]-a[i0];        }\r
+       {   long i0 = size_t(i)<size_t(nx-1) ? i+nx*(j+ny*k):nx*(1+j+ny*k)-2;   return a[i0+1]-a[i0];   }\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
-               return j>0? (j<ny-1? (a[i0+nx]-a[i0-nx])/2:a[i0]-a[i0-nx]) : a[i0+nx]-a[i0];}\r
+       {   long i0 = size_t(j)<size_t(ny-1) ? i+nx*(j+ny*k):i+nx*(ny*(k+1)-2); return a[i0+nx]-a[i0];  }\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
-               return k>0? (k<nz-1? (a[i0+n]-a[i0-n])/2:a[i0]-a[i0-n]) : a[i0+n]-a[i0];        }\r
+       {   long n=nx*ny, i0 = size_t(k)<size_t(nz-1) ? i+nx*(j+ny*k):i+nx*(j+ny*(nz-2));       return a[i0+n]-a[i0];   }\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
 #ifndef SWIG\r
@@ -512,9 +544,9 @@ 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
@@ -536,6 +568,12 @@ 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
@@ -545,7 +583,6 @@ inline mglData mglIFS3d(const mglDataA &A, long n, long skip=20)
 /// 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
 /// 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
@@ -598,7 +635,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
@@ -656,7 +693,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
@@ -717,7 +754,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
@@ -725,7 +762,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
@@ -778,7 +815,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
@@ -805,7 +844,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
@@ -846,14 +885,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
@@ -894,13 +935,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
@@ -941,7 +985,7 @@ public:
        {       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,14 +1011,14 @@ public:
        {       return mglSpline3s(dat.data(),dat.size(),1,1,x,0,0);    }\r
 \r
        mreal v(long i,long =0,long =0) const           {       return dat[i];  }\r
-       mreal vthr(long i) 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 =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 ,long =0,long =0) const  {       return 1;       }\r
-       mreal dvz(long ,long =0,long =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 05e5f3b193f1e83e89b4f5d58275a064f855f6e7..a5b291a861a920bb172f90c3cb346cc8ab971fde 100644 (file)
@@ -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
@@ -141,6 +148,10 @@ void MGL_EXPORT mgl_data_norm_slice_(uintptr_t *dat, mreal *v1,mreal *v2,char *d
 /// 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
+/// Project the periodical data to range [v1,v2] (like mod() function). Separate branches by NAN if sep=true.\r
+void MGL_EXPORT mgl_data_coil(HMDT dat, mreal v1, mreal v2, int sep);\r
+void MGL_EXPORT mgl_data_coil_(uintptr_t *dat, mreal &v1, mreal *v2, int *sep);\r
+\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
@@ -150,9 +161,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
-/// 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
+/// 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
 /// Equidistantly fill the data to range [x1,x2] in direction dir\r
 void MGL_EXPORT mgl_data_fill(HMDT dat, mreal x1,mreal x2,char dir);\r
 void MGL_EXPORT mgl_data_fill_(uintptr_t *dat, mreal *x1,mreal *x2,const char *dir,int);\r
@@ -209,16 +226,26 @@ HMDT MGL_EXPORT mgl_data_ifs_file(const char *fname, const char *name, long n, l
 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
-       mglFlameLinear=0,               mglFlameSin,                    mglFlameSphere,         mglFlameSwirl,          mglFlameHorseshoe,\r
-       mglFlamePolar,                  mglFlameHandkerchief,   mglFlameHeart,          mglFlameDisk,           mglFlameSpiral,\r
-       mglFlameHyperbolic,             mglFlameDiamond,                mglFlameEx,                     mglFlameJulia,          mglFlameBent,\r
-       mglFlameWaves,                  mglFlameFishEye,                mglFlamePopcorn,        mglFlameExponent,       mglFlamePower,\r
-       mglFlameCos,                    mglFlameRings,                  mglFlameFan,            mglFlameBlob,           mglFlamePdj,\r
-       mglFlameFan2,                   mglFlameRings2,                 mglFlameEyefish,        mglFlameBubble,         mglFlameCylinder,\r
-       mglFlamePerspective,    mglFlameNoise,                  mglFlameJuliaN,         mglFlameJuliaScope,     mglFlameBlur,\r
-       mglFlameGaussian,               mglFlameRadialBlur,             mglFlamePie,            mglFlameNgon,           mglFlameCurl,\r
-       mglFlameRectangles,             mglFlameArch,                   mglFlameTangent,        mglFlameSquare,         mglFlameRays,\r
-       mglFlameBlade,                  mglFlameSecant,                 mglFlameTwintrian,      mglFlameCross,          mglFlameLAST\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
@@ -227,6 +254,11 @@ enum {
 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
@@ -314,6 +346,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
@@ -324,7 +362,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
@@ -403,6 +446,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
@@ -460,24 +506,11 @@ mreal MGL_EXPORT mgl_find_root_txt_(const char *func, mreal *ini, const char *va
 /// Find roots for nonlinear equation defined by textual formula\r
 HMDT MGL_EXPORT mgl_data_roots(const char *func, HCDT ini, char var_id);\r
 uintptr_t MGL_EXPORT mgl_data_roots_(const char *func, uintptr_t *ini, const char *var_id,int,int);\r
-\r
-//-----------------------------------------------------------------------------\r
-/// Create HMEX object for expression evaluating\r
-HMEX MGL_EXPORT mgl_create_expr(const char *expr);\r
-uintptr_t MGL_EXPORT mgl_create_expr_(const char *expr, int);\r
-/// Delete HMEX object\r
-void MGL_EXPORT mgl_delete_expr(HMEX ex);\r
-void MGL_EXPORT mgl_delete_expr_(uintptr_t *ex);\r
-/// Return value of expression for given x,y,z variables\r
-double MGL_EXPORT mgl_expr_eval(HMEX ex, double x, double y,double z);\r
-double MGL_EXPORT mgl_expr_eval_(uintptr_t *ex, mreal *x, mreal *y, mreal *z);\r
-/// Return value of expression for given variables\r
-double MGL_EXPORT mgl_expr_eval_v(HMEX ex, mreal *vars);\r
-/// Return value of expression differentiation over variable dir for given x,y,z variables\r
-double MGL_EXPORT mgl_expr_diff(HMEX ex, char dir, double x, double y,double z);\r
-double MGL_EXPORT mgl_expr_diff_(uintptr_t *ex, const char *dir, mreal *x, mreal *y, mreal *z, int);\r
-/// Return value of expression differentiation over variable dir for given variables\r
-double MGL_EXPORT mgl_expr_diff_v(HMEX ex, char dir, mreal *vars);\r
+/// Find roots for set of nonlinear equations defined by textual formulas\r
+HMDT MGL_EXPORT mgl_find_roots_txt(const char *func, const char *vars, HCDT ini);\r
+uintptr_t MGL_EXPORT mgl_find_roots_txt_(const char *func, const char *vars, uintptr_t *ini,int,int);\r
+/// Find roots for set of nonlinear equations defined by function\r
+bool MGL_EXPORT mgl_find_roots(size_t n, void (*func)(const mreal *x, mreal *f, void *par), mreal *x0, void *par);\r
 //-----------------------------------------------------------------------------\r
 #ifdef __cplusplus\r
 }\r
index 39670ccd483ce4012afb68c29d8def7d7658d3ff..64e3e1d1c2f3c0e535afc9fc412e3bda6a1dafb2 100644 (file)
@@ -40,15 +40,14 @@ using mglDataA::Momentum;
        long ny;                ///< number of points in 2nd dimensions ('y' dimension)\r
        long nz;                ///< number of points in 3d dimensions ('z' dimension)\r
        dual *a;                ///< data array\r
-       std::string id; ///< column (or slice) names\r
        bool link;              ///< use external data (i.e. don't free it)\r
 \r
        /// Initiate by other mglDataC variable\r
        mglDataC(const mglDataC &d)     {       a=0;    mgl_datac_set(this,&d);         }       // NOTE: must be constructor for mglDataC& to exclude copy one\r
        mglDataC(const mglDataA &d)     {       a=0;    mgl_datac_set(this,&d);         }\r
 #if MGL_HAVE_RVAL\r
-       mglDataC(mglDataC &&d):nx(d.nx),ny(d.ny),nz(d.nz),a(d.a),id(d.id),link(d.link)\r
-       {       s=d.s;  temp=d.temp;    func=d.func;    o=d.o;  d.a=0;  d.func=0;       }\r
+       mglDataC(mglDataC &&d):nx(d.nx),ny(d.ny),nz(d.nz),a(d.a),link(d.link)\r
+       {       s=d.s;  temp=d.temp;    func=d.func;    o=d.o;  id=d.id;        d.a=0;  d.func=0;       }\r
 #endif\r
        mglDataC(const mglDataA &re, const mglDataA &im)        {       a=0;    mgl_datac_set_ri(this,&re,&im); }\r
        mglDataC(HCDT d)        {       a=0;    mgl_datac_set(this, d);         }\r
@@ -165,6 +164,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
@@ -223,12 +225,6 @@ using mglDataA::Momentum;
        inline void Put(const mglDataA &dat, long i=-1, long j=-1, long k=-1)\r
        {       mgl_datac_put_dat(this,&dat,i,j,k);     }\r
 \r
-       /// Set names for columns (slices)\r
-       inline void SetColumnId(const char *ids)\r
-       {       mgl_datac_set_id(this,ids);     }\r
-       /// Make new id\r
-       inline void NewId()     {       id.clear();     }\r
-\r
        /// Read data from tab-separated text file with auto determining size\r
        inline bool Read(const char *fname)\r
        {       return mgl_datac_read(this,fname); }\r
@@ -290,6 +286,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
@@ -329,6 +332,9 @@ using mglDataA::Momentum;
        /// Get array which is result of minimal values in given direction or directions\r
        inline mglData Min(const char *dir) const\r
        {       return mglData(true,mgl_data_min_dir(this,dir));        }\r
+       /// Find roots for set of nonlinear equations defined by textual formula\r
+       inline mglDataC MultiRoots(const char *eq, const char *vars) const\r
+       {       return mglDataC(true,mgl_find_roots_txt_c(eq, vars, this));     }\r
 \r
        /// Cumulative summation the data in given direction or directions\r
        inline void CumSum(const char *dir)     {       mgl_datac_cumsum(this,dir);     }\r
@@ -336,6 +342,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
@@ -358,12 +373,26 @@ using mglDataA::Momentum;
        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
@@ -433,7 +462,8 @@ using mglDataA::Momentum;
        inline void operator-=(dual d)          {       mgl_datac_sub_num(this,d);      }\r
 #ifndef SWIG\r
        /// Direct access to the data cell\r
-       inline dual &operator[](long i) {       return a[i];    }\r
+       inline dual operator[](long i) const    {       return a[i];    }\r
+       inline dual &operator[](long i)                 {       return a[i];    }\r
 #endif\r
 \r
 \r
@@ -457,21 +487,25 @@ using mglDataA::Momentum;
                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
-               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
+       {   long i0 = size_t(i)<size_t(nx-1) ? i+nx*(j+ny*k):nx*(1+j+ny*k)-2;   return abs(a[i0+1]-a[i0]);      }\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
-               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
+       {   long i0 = size_t(j)<size_t(ny-1) ? i+nx*(j+ny*k):i+nx*(ny*(k+1)-2); return abs(a[i0+nx]-a[i0]);     }\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
-               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
+       {   long n=nx*ny, i0 = size_t(k)<size_t(nz-1) ? i+nx*(j+ny*k):i+nx*(j+ny*(nz-2));       return abs(a[i0+n]-a[i0]);      }\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
 /// Saves result of PDE solving (|u|^2) for "Hamiltonian" ham with initial conditions ini\r
@@ -487,6 +521,9 @@ 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
index b6f5ad2f059a445d771825cd5854c12798f7db37..cd83b5d0814ac9adfc4aa14c2873d36dc2cb286f 100644 (file)
@@ -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
@@ -173,10 +175,15 @@ 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
-void MGL_EXPORT mgl_datac_set_id_(uintptr_t *dat, const char *id,int l);\r
 /// Equidistantly fill the data to range [x1,x2] in direction dir\r
 void MGL_EXPORT mgl_datac_fill(HADT dat, dual x1,dual x2,char dir);\r
 void MGL_EXPORT mgl_datac_fill_(uintptr_t *dat, dual *x1,dual *x2,const char *dir,int);\r
@@ -251,6 +258,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
@@ -266,6 +276,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
@@ -295,6 +308,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
@@ -304,6 +323,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
@@ -339,18 +370,10 @@ uintptr_t MGL_EXPORT mgl_gspline_init_(uintptr_t *x, uintptr_t *v);
 /// Evaluate global spline (and its derivatives d1, d2 if not NULL) using prepared coefficients \a coef\r
 mdual MGL_EXPORT mgl_gsplinec(HCDT coef, mreal dx, dual *d1, dual *d2);\r
 mdual MGL_EXPORT mgl_gsplinec_(uintptr_t *c, mreal *dx, dual *d1, dual *d2);\r
-//-----------------------------------------------------------------------------\r
-/// Create HAEX object for expression evaluating\r
-HAEX MGL_EXPORT mgl_create_cexpr(const char *expr);\r
-uintptr_t MGL_EXPORT mgl_create_cexpr_(const char *expr, int);\r
-/// Delete HAEX object\r
-void MGL_EXPORT mgl_delete_cexpr(HAEX ex);\r
-void MGL_EXPORT mgl_delete_cexpr_(uintptr_t *ex);\r
-/// Return value of expression for given x,y,z variables\r
-mdual MGL_EXPORT mgl_cexpr_eval(HAEX ex, dual x, dual y,dual z);\r
-mdual MGL_EXPORT mgl_cexpr_eval_(uintptr_t *ex, dual *x, dual *y, dual *z);\r
-/// Return value of expression for given variables\r
-mdual MGL_EXPORT mgl_cexpr_eval_v(HAEX ex, dual *vars);\r
+\r
+/// Find roots for set of nonlinear equations defined by textual formulas\r
+HADT MGL_EXPORT mgl_find_roots_txt_c(const char *func, const char *vars, HCDT ini);\r
+uintptr_t MGL_EXPORT mgl_find_roots_txt_c_(const char *func, const char *vars, uintptr_t *ini,int,int);\r
 \r
 #ifdef __cplusplus\r
 }\r
index 8a753852e792046e602d714eb82017cc9d760cf9..77cb8a9467eb6a813c11439a383f34720e4f8fd2 100644 (file)
 // 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
+// 4251 - class 'type' needs to have dll-interface to be used by clients of class 'type2'\r
 #if defined(_MSC_VER)\r
-#pragma warning(disable: 4996 4190 4786 4231 4800 4244 4267 4305)\r
+#pragma warning(disable: 4190 4996 4786 4800 4244 4267 4305 4251)\r
+#endif\r
+\r
+#if defined(_WIN32) && !defined(WIN32)\r
+#define WIN32 1\r
 #endif\r
 \r
 #include "mgl2/config.h"\r
 #endif\r
 \r
 #include "mgl2/dllexport.h"\r
+#if defined(MGL_LIB_MSVC)\r
+#define MGL_EXTERN\r
+#else\r
+#define MGL_EXTERN extern\r
+#endif\r
+\r
 #if defined(_MSC_VER)\r
 #define MGL_OBSOLETE   MGL_NO_EXPORT\r
 #else\r
 \r
 #endif\r
 //-----------------------------------------------------------------------------\r
-#ifdef WIN32 //_MSC_VER needs this before math.h\r
-#define        _USE_MATH_DEFINES\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
-#ifdef MGL_SRC\r
+\r
 #if MGL_HAVE_ZLIB\r
 #include <zlib.h>\r
 #ifndef Z_BEST_COMPRESSION\r
@@ -104,6 +120,10 @@ typedef unsigned long long uint64_t;
 typedef unsigned long uintptr_t;\r
 #endif\r
 \r
+#if ((defined(_MSC_VER) || defined(__BORLANDC__)) && !defined(M_PI))   //_MSC_VER needs this before math.h\r
+#define        _USE_MATH_DEFINES\r
+#endif\r
+\r
 #include <math.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
@@ -111,6 +131,7 @@ typedef unsigned long uintptr_t;
 #include <wchar.h>\r
 \r
 #if defined(_MSC_VER)\r
+typedef long msize;\r
 #define collapse(a)    // MSVS don't support OpenMP 3.*\r
 #if (_MSC_VER<=1800)\r
 #define strtoull _strtoui64\r
@@ -122,6 +143,8 @@ typedef unsigned long uintptr_t;
 #if (_MSC_VER<1600) // based on https://hg.python.org/cpython/rev/9aedb876c2d7\r
 #define hypot  _hypot\r
 #endif\r
+#else\r
+typedef size_t msize;\r
 #endif\r
 \r
 #if !MGL_SYS_NAN\r
@@ -181,28 +204,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
@@ -259,34 +260,36 @@ 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
-#define MGL_TRANSP_NORM                0x000000\r
-#define MGL_TRANSP_GLASS       0x000001\r
-#define MGL_TRANSP_LAMP                0x000002\r
-#define MGL_ENABLE_CUT         0x000004        ///< Flag which determines how points outside bounding box are drown.\r
-#define MGL_ENABLE_RTEXT       0x000008        ///< Use text rotation along axis\r
-#define MGL_AUTO_FACTOR                0x000010        ///< Enable autochange PlotFactor\r
-#define MGL_ENABLE_ALPHA       0x000020        ///< Flag that Alpha is used\r
-#define MGL_ENABLE_LIGHT       0x000040        ///< Flag of using lightning\r
-#define MGL_TICKS_ROTATE       0x000080        ///< Allow ticks rotation\r
-#define MGL_TICKS_SKIP         0x000100        ///< Allow ticks rotation\r
+#define MGL_TRANSP_NORM                0x00000000\r
+#define MGL_TRANSP_GLASS       0x00000001\r
+#define MGL_TRANSP_LAMP                0x00000002\r
+#define MGL_ENABLE_CUT         0x00000004      ///< Flag which determines how points outside bounding box are drown.\r
+#define MGL_ENABLE_RTEXT       0x00000008      ///< Use text rotation along axis\r
+#define MGL_AUTO_FACTOR                0x00000010      ///< Enable autochange PlotFactor\r
+#define MGL_ENABLE_ALPHA       0x00000020      ///< Flag that Alpha is used\r
+#define MGL_ENABLE_LIGHT       0x00000040      ///< Flag of using lightning\r
+#define MGL_TICKS_ROTATE       0x00000080      ///< Allow ticks rotation\r
+#define MGL_TICKS_SKIP         0x00000100      ///< Allow ticks rotation\r
 // flags for internal use only\r
-#define MGL_DISABLE_SCALE      0x000200        ///< Temporary flag for disable scaling (used for axis)\r
-#define MGL_FINISHED           0x000400        ///< Flag that final picture (i.e. mglCanvas::G) is ready\r
-#define MGL_USE_GMTIME         0x000800        ///< Use gmtime instead of localtime\r
-#define MGL_SHOW_POS           0x001000        ///< Switch to show or not mouse click position\r
-#define MGL_CLF_ON_UPD         0x002000        ///< Clear plot before Update()\r
-#define MGL_NOSUBTICKS         0x004000        ///< Disable subticks drawing (for bounding box)\r
-#define MGL_LOCAL_LIGHT                0x008000        ///< Keep light sources for each inplot\r
-#define MGL_VECT_FRAME         0x010000        ///< Use DrwDat to remember all data of frames\r
-#define MGL_REDUCEACC          0x020000        ///< Reduce accuracy of points (to reduc size of output files)\r
-#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          0x100000        ///< Convert all colors to gray ones\r
+#define MGL_DISABLE_SCALE      0x00000200      ///< Temporary flag for disable scaling (used for axis)\r
+#define MGL_FINISHED           0x00000400      ///< Flag that final picture (i.e. mglCanvas::G) is ready\r
+#define MGL_USE_GMTIME         0x00000800      ///< Use gmtime instead of localtime\r
+#define MGL_SHOW_POS           0x00001000      ///< Switch to show or not mouse click position\r
+#define MGL_CLF_ON_UPD         0x00002000      ///< Clear plot before Update()\r
+#define MGL_NOSUBTICKS         0x00004000      ///< Disable subticks drawing (for bounding box)\r
+#define MGL_LOCAL_LIGHT                0x00008000      ///< Keep light sources for each inplot\r
+#define MGL_VECT_FRAME         0x00010000      ///< Use DrwDat to remember all data of frames\r
+#define MGL_REDUCEACC          0x00020000      ///< Reduce accuracy of points (to reduce size of output files)\r
+#define MGL_PREFERVC           0x00040000      ///< Prefer vertex color instead of texture if output format supports\r
+#define MGL_ONESIDED           0x00080000      ///< Render only front side of surfaces if output format supports (for debugging)\r
+#define MGL_NO_ORIGIN          0x00100000      ///< Don't draw tick labels at axis origin\r
+#define MGL_GRAY_MODE          0x00200000      ///< Convert all colors to gray ones\r
+#define MGL_FULL_CURV          0x00400000      ///< Disable omitting points in straight-line part(s).\r
+#define MGL_NO_SCALE_REL       0x00800000      ///< Disable font scaling in relative inplots\r
 //-----------------------------------------------------------------------------\r
 #if MGL_HAVE_C99_COMPLEX\r
 #include <complex.h>\r
@@ -304,24 +307,24 @@ const mdual mgl_I=_Complex_I;
 #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
+// #if defined(_MSC_VER) && !defined(__INTEL_COMPILER)\r
+// MGL_EXTERN template class MGL_EXPORT std::allocator<char>;\r
+// MGL_EXTERN template class MGL_EXPORT std::allocator<wchar_t>;\r
+// MGL_EXTERN template struct MGL_EXPORT std::char_traits<char>;\r
+// MGL_EXTERN template struct MGL_EXPORT std::char_traits<wchar_t>;\r
+// MGL_EXTERN template class MGL_EXPORT std::basic_string< char, std::char_traits<char>, std::allocator<char> >;\r
+// MGL_EXTERN template class MGL_EXPORT std::basic_string< wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >;\r
+// MGL_EXTERN template class MGL_EXPORT std::vector<long>;\r
+// MGL_EXTERN 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
+// #if defined(_MSC_VER)\r
+// MGL_EXTERN template class MGL_EXPORT std::complex<float>;\r
+// MGL_EXTERN 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
@@ -330,6 +333,24 @@ 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 long mgl_imin(long a, long b)   {       return a>b?b:a; }\r
+inline long mgl_imax(long a, long 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
@@ -342,6 +363,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
@@ -369,6 +392,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 920c0c707d2c7f7d529ea89e2e89c099a18870e0..0910e93c3dd4136ccba8bf1987eb433f0976dbaa 100644 (file)
@@ -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 9d4a223362cb145a8af36a9f2f99030d970fddf3..3b4ef74348348ce43d584aa301251567b47ce5bf 100644 (file)
@@ -33,8 +33,10 @@ int MGL_EXPORT mgl_fltk_run();
 int MGL_EXPORT mgl_fltk_run_();\r
 /// Run main FLTK loop for event handling in separate thread.\r
 int MGL_EXPORT mgl_fltk_thr();\r
-/// Callback function for asking user.\r
+/// FLTK function for asking user.\r
 void MGL_EXPORT mgl_ask_fltk(const wchar_t *quest, wchar_t *res);\r
+/// FLTK function for displaying progress of something.\r
+void MGL_EXPORT mgl_progress_fltk(int value, int maximal, HMGL gr);\r
 /// Return pointer to widget (Fl_MGLView*) used for plotting\r
 MGL_EXPORT void *mgl_fltk_widget(HMGL gr);\r
 #ifdef __cplusplus\r
index 8c0abdb5cfb618bf1b8a4fd9392eb6d27fc31cc5..e735e24869c4fe23302e9c37afc909483549a278 100644 (file)
@@ -50,9 +50,10 @@ struct mglGlyphDescr
 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
+MGL_EXTERN 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 023cd849b7ce5c43ef00000c9ad169c669c141ef..c83b6eee4a64ccf142e1cd84bc7d5bd15b2e769a 100644 (file)
@@ -34,8 +34,9 @@ class MGL_EXPORT mglGraph
 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
@@ -118,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
@@ -135,9 +136,14 @@ public:
        /// Restore font (load default font for new HMGL objects)\r
        inline void RestoreFont()                               {       mgl_restore_font(gr);   }\r
        /// Set to use or not text rotation\r
-       inline void SetRotatedText(bool rotated)        {       mgl_set_rotated_text(gr, rotated);      }\r
+       inline void SetRotatedText(bool enable) {       mgl_set_rotated_text(gr, enable);       }\r
+       /// Set to scale text in relative subplots too\r
+       inline void SetScaleText(bool enable)   {       mgl_set_scale_text(gr, enable); }\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
@@ -167,6 +173,8 @@ public:
        static inline void SuppressWarn(bool on)        {       mgl_suppress_warn(on);  }\r
        /// Check if MathGL version is valid (return false) or not (return true)\r
        static inline bool CheckVersion(const char *ver)        {       return mgl_check_version(ver);  }\r
+       /// Display progress of something.\r
+       inline void Progress(int value, int maximal)    {       mgl_progress(value, maximal, gr);       }\r
 \r
        /// Set axis range scaling -- simplified way to shift/zoom axis range -- need to replot whole image!\r
        inline void ZoomAxis(mglPoint p1=mglPoint(0,0,0,0), mglPoint p2=mglPoint(1,1,1,1))\r
@@ -274,6 +282,9 @@ public:
        /// Set to draw tick labels at axis origin\r
        inline void SetOriginTick(bool enable=true)\r
        {       mgl_set_flag(gr,!enable, MGL_NO_ORIGIN);        }\r
+       /// Set bit-value flag of HMGL state (for advanced users only)\r
+       inline void SetFlagAdv(int val, uint32_t flag)\r
+       {       mgl_set_flag(gr, val, flag);    }\r
 \r
        /// Put further plotting in m-th cell of nx*ny grid of the image.\r
        /** String \a style may contain:\r
@@ -284,15 +295,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
@@ -369,11 +380,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
@@ -596,6 +612,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
@@ -648,8 +676,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
@@ -659,6 +687,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
@@ -1255,6 +1290,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
@@ -1272,6 +1315,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
@@ -1297,6 +1343,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
@@ -1517,6 +1576,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
@@ -1762,6 +1824,23 @@ public:
        inline void FlowP(mglPoint p, const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", const char *opt="")\r
        {       mgl_flowp_3d(gr, p.x, p.y, p.z, &ax, &ay, &az, sch, opt);       }\r
 \r
+       /// Plot flows from given plain for vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with color proportional to |a|\r
+       /** String \a sch may contain:\r
+       * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
+       * 'v' for drawing arrows on the threads;\r
+       * 't' for drawing tapes of normals in x-y and y-z planes.\r
+       * Option "value" sets the number of threads (default is 5). */\r
+       inline void Flow3(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", double sVal=-1, const char *opt="")\r
+       {       mgl_flow3_xyz(gr, &x, &y, &z, &ax, &ay, &az, sch, sVal, opt);   }\r
+       /// Plot flows from given plain for vector field {ax,ay,az} with color proportional to |a|\r
+       /** String \a sch may contain:\r
+       * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
+       * 'v' for drawing arrows on the threads;\r
+       * 't' for drawing tapes of normals in x-y and y-z planes.\r
+       * Option "value" sets the number of threads (default is 5). */\r
+       inline void Flow3(const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", double sVal=-1, const char *opt="")\r
+       {       mgl_flow3(gr, &ax, &ay, &az, sch, sVal, opt);   }\r
+\r
        /// Plot flows for gradient of scalar field phi parametrically depended on coordinate {x,y,z}\r
        /** String \a sch may contain:\r
         * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
@@ -2144,6 +2223,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
@@ -2182,7 +2263,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
@@ -2196,6 +2277,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
@@ -2215,7 +2299,10 @@ public:
        /// 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
-       \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
        {       return mglData(true,mgl_parser_calc(pr,formula));       }\r
@@ -2252,6 +2339,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 a1b1354c3c52436087744d83dcee9fa9d1b596b4..98cf1f469b2e2efd8d7a76f4ab74b508d825b1a7 100644 (file)
@@ -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 fe21f8099ce384cf6c08406e80e2cc3d91904ec0..488c5779d5401d123d6786641f9d2294691c1d80 100644 (file)
@@ -31,8 +31,7 @@ struct mglArg
 {\r
        int type;               ///< Type of argument {0-data,1-string,2-number}\r
        mglDataA *d;    ///< Pointer to data (used if type==0)\r
-       std::wstring w; ///< String with parameters\r
-       std::string s;  ///< String with parameters\r
+       mglString s;    ///< String with parameters\r
        mreal v;                ///< Numerical value (used if type==2)\r
        dual c;                 ///< Numerical complex value (used if type==2)\r
        mglArg():type(-1),d(0),v(0),c(0.)       {}\r
@@ -46,40 +45,52 @@ 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
 {\r
        long pos;\r
        int narg;\r
-       std::wstring func;\r
+       mglString func;\r
        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
 struct mglFnStack\r
 {\r
-       long pos;\r
-       std::wstring par[10];\r
-       mglFnStack():pos(0)     {}\r
+       long pos;       ///< position to return\r
+       size_t stk;     ///< stack at 'call'\r
+       mglString par[10];      ///< input parameters\r
+       mglFnStack():pos(0),stk(0)      {}\r
+};\r
+//-----------------------------------------------------------------------------\r
+/// Structure for stack of if|for|while.\r
+#define MGL_ST_TRUE            0       // condition true\r
+#define MGL_ST_FALSE   1       // condition false\r
+#define MGL_ST_DONE            2       // condition done\r
+#define MGL_ST_LOOP            4       // normal loop\r
+#define MGL_ST_BREAK   8       // loop break\r
+#define MGL_ST_STOP            (MGL_ST_FALSE|MGL_ST_DONE|MGL_ST_BREAK)\r
+#define MGL_ST_SKIP            (MGL_ST_FALSE|MGL_ST_DONE)\r
+struct mglPosStack\r
+{\r
+       int pos;        ///< position to return\r
+       mglData v;      ///< data to iterate\r
+       long ind;       ///< index in data array\r
+       int par;        ///< for-parameter\r
+       unsigned state; ///< state of stack item\r
+       mglPosStack(int st=MGL_ST_LOOP):pos(-1),ind(0),par(-1),state(st)        {}\r
 };\r
 //-----------------------------------------------------------------------------\r
 /// Function for asking question in console mode\r
@@ -101,7 +112,8 @@ public:
        volatile bool Stop;     ///< Stop command was. Flag prevent further execution\r
        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
+       HMGL curGr;                     ///< Current grapher\r
+       int StarObhID;          ///< staring object id\r
 \r
        mglParser(bool setsize=false);\r
        virtual ~mglParser();\r
@@ -135,7 +147,7 @@ public:
        /// Scan for functions (use NULL for reset)\r
        void ScanFunc(const wchar_t *line);\r
        /// Check if name is function and return its address (or 0 if no)\r
-       long IsFunc(const std::wstring &name, int *narg=0);\r
+       long IsFunc(const wchar_t *name, int *narg=0);\r
        /// Find variable or return 0 if absent\r
        mglDataA *FindVar(const char *name) MGL_FUNC_PURE;\r
        mglDataA *FindVar(const wchar_t *name) MGL_FUNC_PURE;\r
@@ -152,7 +164,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
@@ -160,23 +172,33 @@ public:
        void DeleteVar(const wchar_t *name);\r
        /// Delete all data variables\r
        void DeleteAll();\r
+       /// Delete temporary data arrays\r
+       inline void DeleteTemp()\r
+       {       for(size_t i=0;i<DataList.size();i++)   if(DataList[i] && DataList[i]->temp)\r
+               {       mglDataA *u=DataList[i];        DataList[i]=0;  delete u;       }       }\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
+\r
+       ///< Test if condition is not-valid (n=1) or false (0) or true (1)\r
+       int TestCond(long m, const mglArg &a0, mglArg &a1, bool &cond)\r
+       {\r
+               int n = 1;\r
+               if(a0.type==2)  {       cond = a0.v!=0; n=0;    }\r
+               else if(a0.type==0)\r
+               {       n=0;    cond = a0.d->FindAny((m>1 && a1.type==1) ? a1.s.s:"u"); }\r
+               return n;\r
+       }\r
 private:\r
 //     long parlen;            ///< Length of parameter strings\r
-       std::wstring par[40];   ///< Parameter for substituting instead of $1, ..., $9\r
+       mglString par[40];      ///< Parameter for substituting instead of $1, ..., $9\r
        bool Once;                      ///< Flag for command which should be executed only once\r
        bool Skip;                      ///< Flag that commands should be skiped (inside 'once' block)\r
-       int if_stack[40];       ///< Stack for if-else-endif commands\r
-       int if_pos;                     ///< position in if_stack\r
+       std::vector<mglPosStack> stack; ///< Stack of if|for|while commands\r
        std::vector<mglFunc> func;      ///< function names and position\r
        std::vector<mglFnStack> fn_stack;       ///< function calls stack\r
-//     int fn_pos;                     ///< position in function stack\r
-       int if_for[40];         ///< position in if_stack for for-cycle start\r
-       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
        unsigned Variant;       ///< Select variant of argument(s) separated by '?'\r
 \r
        /// Parse command\r
@@ -194,8 +216,10 @@ private:
        /// Parse $N arguments\r
        void PutArg(std::wstring &str, bool def);\r
        /// In skip mode\r
-       bool inline ifskip()    {       return (if_pos>0 && !(if_stack[if_pos-1]&1));   }\r
-       bool inline skip()              {       return (Skip || ifskip() || for_br);    }\r
+       bool inline ifskip()\r
+       {       return ( stack.size() && (stack.back().state & MGL_ST_SKIP) );  }\r
+       bool inline skip()\r
+       {       return (Skip || (stack.size() && (stack.back().state & MGL_ST_STOP) )); }\r
        bool CheckForName(const std::wstring &s);       // check if name is valid for new data\r
 };\r
 //-----------------------------------------------------------------------------\r
index d47656933e704e1dfc16a3c7622e40212a56bc69..6b59eb4483b208cd1fba807f60024c41069243a6 100644 (file)
@@ -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 43abeaaa94dd96cc7d86decc4cafa64de7a03bf0..102a76c778821dc344038ccd22ea99034cb0bc34 100644 (file)
@@ -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 de39072e5afac5d2f4236967fc3681b9ee07b94d..228ddc513c797014bf9338028de30a9d8265c05a 100644 (file)
@@ -65,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
@@ -205,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
@@ -228,7 +228,7 @@ 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
index b2903193dd6e7a29a8128e5da60224cf67941b73..c8283548ee88a4b6dce4229a0882f3fbc3cc2b13 100644 (file)
@@ -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 6d639c0f301ca041fe6ba857b674a03d102992b6..77431696f55e4d60b80501b146a939192e3de0e5 100644 (file)
@@ -42,9 +42,9 @@ struct MGL_EXPORT mglPoint
        mglPoint(mglPoint &&d):x(d.x),y(d.y),z(d.z),c(d.c)      {}
 #endif
        inline void Set(mreal X=0,mreal Y=0,mreal Z=0,mreal C=0)        {x=X;y=Y;z=Z;c=C;}
-       inline bool IsNAN()             {       return (x!=x || y!=y || z!=z || c!=c);  }
-       inline mreal val(int i) {       return (i<2 ? (i==0 ? x:y) : (i==2 ? z:c));     }
-       inline mreal norm()             {       return sqrt(x*x+y*y+z*z);       }
+       inline bool IsNAN() const               {       return (x!=x || y!=y || z!=z || c!=c);  }
+       inline mreal val(int i) const   {       mreal dat[4]={x,y,z,c}; return dat[i];  }
+       inline mreal norm() const               {       return sqrt(x*x+y*y+z*z);       }
        inline void Normalize() {       mreal v=norm(); x/=v;   y/=v;   z/=v;   }
 
        inline const mglPoint &operator=(const mglPoint &p)
@@ -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)
@@ -107,6 +107,8 @@ struct MGL_EXPORT mglColor
 
        /// Constructor for RGB components manualy
        mglColor(float R,float G,float B, float A=1):r(R),g(G),b(B),a(A)        {}
+       /// Constructor for RGB components manualy
+       mglColor(const unsigned char *c, float A=1):r(c[0]/255.f),g(c[1]/255.f),b(c[3]/255.f),a(A)      {}
        /// Constructor set default color
        mglColor():r(0),g(0),b(0),a(1)  {}
        /// Constructor set color from character id
@@ -121,18 +123,20 @@ 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;
-               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;
+               if(bright<0)    bright=0;
+               if(bright>2.f)  bright=2.f;
+               if(bright<=1)
+               {       r=c.r*bright;   g=c.g*bright;   b=c.b*bright;   a = 1;  }
+               else
+               {       r=1-(1-c.r)*(2-bright); g=1-(1-c.g)*(2-bright); b=1-(1-c.b)*(2-bright); a=1;    }
        }
        /// Check if color is valid
-       inline bool Valid()
-       {       return (r>=0 && r<=1 && g>=0 && g<=1 && b>=0 && b<=1 && a>=0 && a<=1);  }
+       inline bool Valid() const
+       {       return ((r>=0) & (r<=1) & (g>=0) & (g<=1) & (b>=0) & (b<=1) & (a>=0) & (a<=1)); }
        /// Get maximal spectral component
-       inline float Norm()
+       inline float Norm() const
        {       return r>g ? r : (g>b ? g : b); }
-       inline float NormS()
+       inline float NormS() const
        {       return r*r+g*g+b*b;     }
        /// Set color from symbolic id
        inline void Set(char p, float bright=1)
@@ -143,10 +147,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
@@ -165,10 +169,160 @@ inline mglColor operator*(const mglColor &a, float b)
 {      return mglColor(a.r*b, a.g*b, a.b*b, a.a*b);    }
 inline mglColor operator*(float b, const mglColor &a)
 {      return mglColor(a.r*b, a.g*b, a.b*b, a.a*b);    }
+inline float operator*(const mglColor &b, const mglColor &a)
+{      return a.r*b.r+a.g*b.g+a.b*b.b; }
 inline mglColor operator/(const mglColor &a, float b)
 {      return mglColor(a.r/b, a.g/b, a.b/b, a.a/b);    }
 inline mglColor operator!(const mglColor &a)
 {      return mglColor(1-a.r, 1-a.g, 1-a.b, a.a);      }
 #endif
 //-----------------------------------------------------------------------------
+#ifndef SWIG
+/// Class for Unicode string.
+/** NOTE: mglString accept multi-byte char* string for converting to wchar_t*. But it keep only single-byte char*!!! */
+struct MGL_EXPORT mglString
+{
+       char *s;
+       wchar_t *w;
+       mglString()     {       s=new char[1];  w=new wchar_t[1];       *s=*w=0;        }
+       mglString(const mglString &str)
+       {
+               size_t ls = wcslen(str.w)+1;
+               s = new char[ls];               memcpy(s,str.s,ls);
+               w = new wchar_t[ls];    memcpy(w,str.w,ls*sizeof(wchar_t));
+       }
+#if MGL_HAVE_RVAL
+       mglString(mglString &&d):s(d.s),w(d.w)  {       d.s=NULL;       d.w=NULL;       }
+#endif
+       mglString(const char *str)
+       {
+               if(str)
+               {
+                       size_t ls=mbstowcs(0,str,0);
+                       w = new wchar_t[ls+1];  mbstowcs(w,str,ls); w[ls]=0;
+                       s = new char[ls+1];     for(size_t i=0;i<=ls;i++)       s[i]=w[i];
+               }
+               else    {       s=new char[1];  w=new wchar_t[1];       *s=*w=0;        }
+       }
+       mglString(const wchar_t *str)
+       {
+               if(str)
+               {
+                       size_t len=wcslen(str);
+                       w = new wchar_t[len+1]; s = new char[len+1];
+                       for(size_t i=0;i<=len;i++)      s[i]=w[i]=str[i];
+               }
+               else    {       s=new char[1];  w=new wchar_t[1];       *s=*w=0;        }
+       }
+       mglString(const std::string &str)
+       {
+               size_t ls=mbstowcs(0,str.c_str(),0);
+               w = new wchar_t[ls+1];  mbstowcs(w,str.c_str(),ls); w[ls]=0;
+               s = new char[ls+1];     for(size_t i=0;i<=ls;i++)       s[i]=w[i];
+       }
+       mglString(const std::wstring &str)
+       {
+               size_t len=str.length();
+               w = new wchar_t[len+1]; s = new char[len+1];
+               for(size_t i=0;i<=len;i++)      s[i]=w[i]=str[i];
+       }
+       ~mglString()    {       if(w)   {       delete []s;     delete []w;     }       }
+       /// String length
+       size_t length() const
+       {       return wcslen(w);       }
+       /// Crop string (like std::string::substr())
+       void crop(size_t pos, size_t len=size_t(-1))
+       {
+               if(pos) for(size_t i=0;i<len;i++)
+                       s[i] = w[i] = w[i+pos];
+               s[len] = w[len] = 0;
+       }
+       /// Find the position of symbol
+       size_t find(wchar_t ch)
+       {       const wchar_t *p = wcschr(w,ch);        return p?p-w:size_t(-1);        }
+       /// Find the position of string
+       size_t find(const wchar_t *str)
+       {       const wchar_t *p = wcsstr(w,str);       return p?p-w:size_t(-1);        }
+       size_t find(const char *str)
+       {       const char *p = strstr(s,str);          return p?p-s:size_t(-1);        }
+       /// Access to i-th symbol
+       wchar_t operator[](size_t i) const      {       return w[i];    }
+       wchar_t &operator[](size_t i)           {       return w[i];    }
+       /// Comparison operators
+       bool operator==(const char *str) const  {       return  !strcmp(s,str); }
+       bool operator==(const wchar_t *str) const{      return  !wcscmp(w,str); }
+       bool operator==(const std::string &str) const   {       return  str==s; }
+       bool operator==(const std::wstring &str) const  {       return  str==w; }
+       /// Set operators
+       const mglString &operator=(const mglString &str)
+       {
+               delete []s;     delete []w;
+               size_t ls = wcslen(str.w)+1;
+               s = new char[ls];               memcpy(s,str.s,ls);
+               w = new wchar_t[ls];    memcpy(w,str.w,ls*sizeof(wchar_t));
+               return str;
+       }
+       wchar_t operator=(wchar_t ch)
+       {
+               delete []s;     delete []w;
+               w = new wchar_t[2];     s = new char[2];
+               s[0]=w[0]=ch;   s[1]=w[1]=0;
+               return ch;
+       }
+       const std::string &operator=(const std::string &str)
+       {
+               delete []s;     delete []w;
+               size_t ls=mbstowcs(0,str.c_str(),0);
+               w = new wchar_t[ls+1];  mbstowcs(w,str.c_str(),ls); w[ls]=0;
+               s = new char[ls+1];     for(size_t i=0;i<=ls;i++)       s[i]=w[i];
+               return str;
+       }
+       const char *operator=(const char *str)
+       {
+               delete []s;     delete []w;
+               if(str)
+               {
+                       size_t ls=mbstowcs(0,str,0);
+                       w = new wchar_t[ls+1];  mbstowcs(w,str,ls); w[ls]=0;
+                       s = new char[ls+1];     for(size_t i=0;i<=ls;i++)       s[i]=w[i];
+               }
+               else    {       s=new char[1];  w=new wchar_t[1];       *s=*w=0;        }
+               return str;
+       }
+       const std::wstring &operator=(const std::wstring &str)
+       {
+               delete []s;     delete []w;
+               size_t len=str.length();
+               w = new wchar_t[len+1]; s = new char[len+1];
+               for(size_t i=0;i<=len;i++)      s[i]=w[i]=str[i];
+               return str;
+       }
+       const wchar_t *operator=(const wchar_t *str)
+       {
+               delete []s;     delete []w;
+               if(str)
+               {
+                       size_t len=wcslen(str);
+                       w = new wchar_t[len+1]; s = new char[len+1];
+                       for(size_t i=0;i<=len;i++)      s[i]=w[i]=str[i];
+               }
+               else    {       s=new char[1];  w=new wchar_t[1];       *s=*w=0;        }
+               return str;
+       }
+       /// Append operator
+       void operator+=(const wchar_t *str)
+       {
+               if(str && *str)
+               {
+                       wchar_t *t=w;   delete []s;
+                       size_t l1=wcslen(w), l2=wcslen(str);
+                       w = new wchar_t[l1+l2+1];       s = new char[l1+l2+1];
+                       for(size_t i=0;i<l1;i++)        s[i]=w[i]=t[i];
+                       for(size_t i=0;i<=l2;i++)       s[i+l1]=w[i+l1]=str[i];
+                       delete []t;
+               }
+       }
+};
+#endif
+//-----------------------------------------------------------------------------
 #endif
index 120fd300b03758699108a7e83eefca311c2e6f02..fbe4443fd863061ebe24218423b208b3ff101b19 100644 (file)
@@ -71,6 +71,7 @@ void MGL_EXPORT mgl_vect_3d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, uintpt
 /** String \a sch may contain:\r
  * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
  * ‘#’ for starting threads from edges only;\r
+ * ‘.’ for threads from vicinity of saddle point;\r
  * ‘v’ for drawing arrows on the threads.\r
  * Option "value" sets the number of threads (default is 5). */\r
 void MGL_EXPORT mgl_flow_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, const char *opt);\r
@@ -79,6 +80,7 @@ void MGL_EXPORT mgl_flow_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_
 /** String \a sch may contain:\r
  * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
  * ‘#’ for starting threads from edges only;\r
+ * ‘.’ for threads from vicinity of saddle point;\r
  * ‘v’ for drawing arrows on the threads.\r
  * Option "value" sets the number of threads (default is 5). */\r
 void MGL_EXPORT mgl_flow_2d(HMGL gr, HCDT ax, HCDT ay, const char *sch, const char *opt);\r
@@ -102,6 +104,23 @@ void MGL_EXPORT mgl_flow_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr
 void MGL_EXPORT mgl_flow_3d(HMGL gr, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt);\r
 void MGL_EXPORT mgl_flow_3d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, const char *opt,int,int);\r
 \r
+/// Plot flows from given plain for vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with color proportional to |a|\r
+/** String \a sch may contain:\r
+ * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
+ * ‘v’ for drawing arrows on the threads;\r
+ * 't' for drawing tapes of normals in x-y and y-z planes.\r
+ * Option "value" sets the number of threads (default is 5). */\r
+void MGL_EXPORT mgl_flow3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, double sVal, const char *opt);\r
+void MGL_EXPORT mgl_flow3_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, double *sVal, const char *opt,int,int);\r
+/// Plot flows from given plain for vector field {ax,ay,az} with color proportional to |a|\r
+/** String \a sch may contain:\r
+ * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
+ * ‘v’ for drawing arrows on the threads;\r
+ * 't' for drawing tapes of normals in x-y and y-z planes.\r
+ * Option "value" sets the number of threads (default is 5). */\r
+void MGL_EXPORT mgl_flow3(HMGL gr, HCDT ax, HCDT ay, HCDT az, const char *sch, double sVal, const char *opt);\r
+void MGL_EXPORT mgl_flow3_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, double *sVal, const char *opt,int,int);\r
+\r
 /// Plot flow from point p for vector field {ax,ay} parametrically depended on coordinate {x,y} with color proportional to |a|\r
 /** String \a sch may contain:\r
  * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);\r
index 8cadd9c255c4052e097594a2a670ed3a8c54fb66..d174c2bcf55b23aa545ca596b995e04e3899def0 100644 (file)
@@ -23,6 +23,8 @@
 #include "mgl2/mgl.h"\r
 //-----------------------------------------------------------------------------\r
 MGL_EXPORT void *mgl_draw_calc(void *p);\r
+void MGL_EXPORT mgl_parse_comments(const char *text, double &a1, double &a2, double &da, std::vector<std::string> &anim, std::string &dlg_ids, std::vector<std::string> &dlg_par);\r
+void MGL_EXPORT mgl_parse_animation(const char *text, std::vector<std::string> &anim);\r
 //-----------------------------------------------------------------------------\r
 /// Class for drawing in windows (like, mglCanvasFL, mglCanvasQT and so on)\r
 /// Make inherited class and redefine Draw() function if you don't want to use function pointers.\r
@@ -31,9 +33,10 @@ class MGL_EXPORT mglDraw
 public:\r
        virtual int Draw(mglGraph *)=0; ///< Function for drawing\r
        virtual void Reload(){}         ///< Function for reloading data\r
+       virtual void Param(char id, const char *val){}  ///< Function for setting parameter\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
@@ -69,6 +72,8 @@ int MGL_EXPORT mgl_draw_graph(HMGL gr, void *p);
 int MGL_EXPORT mgl_draw_class(HMGL gr, void *p);\r
 void MGL_EXPORT mgl_click_class(void *p);\r
 void MGL_EXPORT mgl_reload_class(void *p);\r
+void MGL_EXPORT mgl_prop_class(char id, const char *val, void *p);\r
+void MGL_EXPORT mgl_prop_func(char id, const char *val, void *p);\r
 }\r
 //-----------------------------------------------------------------------------\r
 /// Abstract class for windows displaying graphics\r
@@ -107,6 +112,21 @@ public:
        {       mgl_wnd_animation(gr);  }\r
        inline void SetClickFunc(void (*func)(void *p)) ///< Callback function for mouse click\r
        {       mgl_set_click_func(gr,func);    }\r
+       /// Set callback function for properties setup\r
+       void SetPropFunc(void (*prop)(char id, const char *val, void *p), void *par=NULL)\r
+       {       mgl_wnd_set_prop(gr,prop,par);  }\r
+       /// Make custom dialog for parameters ids of element properties defined by args\r
+       inline void MakeDialog(const char *ids, char const * const *args, const char *title)\r
+       {       mgl_wnd_make_dialog(gr, ids, args, title);      }\r
+       inline void MakeDialog(const std::string &ids, const std::vector<std::string> &args, const char *title="")\r
+       {\r
+               if(args.size()>0)\r
+               {\r
+                       std::vector<const char *> buf;  buf.reserve(args.size());\r
+                       for(size_t i=0;i<args.size();i++)       buf.push_back(args[i].c_str());\r
+                       MakeDialog(ids.c_str(), &(buf[0]), title);\r
+               }\r
+       }\r
        /// Set callback functions for drawing and data reloading\r
        inline void SetDrawFunc(int (*draw)(mglBase *gr, void *p), void *par=NULL, void (*reload)(void *p)=NULL)\r
        {       mgl_wnd_set_func(gr,draw,par,reload);   }\r
index 6e1d05181eb77c57d57cd9ed51d23c6f46560604..b7d208ed62d60d06667e49a527dcf307b39b708e 100644 (file)
@@ -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 89f9e5b4d0a568852762d879cf1ab76735f1a917..0ef110464306931d5d293c6424f88da94363a9d8 100644 (file)
@@ -4,20 +4,23 @@
 #include <QDebug>
 #include "Backend.hpp"
 #include <mgl2/mgl.h>
+#undef sprintf // fix libintl bug of defining sprintf
 //-----------------------------------------------------------------------------
 Backend::Backend(QObject *parent) : QObject(parent) { }
 //-----------------------------------------------------------------------------
 QString Backend::show(const QString& text) const
 {
+       static size_t counter=size_t(0xffffffff*mgl_rnd());
+       char tmp[256];
+       snprintf(tmp,256,"%s/mathgl%lu.json", P_tmpdir, counter);
+       tmp[255]=0;     counter++;
        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");
+       setlocale(LC_ALL, "");  setlocale(LC_NUMERIC, "C");
        wtext = new wchar_t[text.size()+1];
        text.toWCharArray(wtext);
        wtext[text.size()] = 0;
@@ -42,8 +45,7 @@ QString Backend::coor(const QString& xy, const QString& text) const
        mglGraph gr;
        mglParse pr;
        pr.AllowSetSize(true);
-       setlocale(LC_CTYPE, "");
-       setlocale(LC_NUMERIC, "C");
+       setlocale(LC_ALL, "");  setlocale(LC_NUMERIC, "C");
        wtext = new wchar_t[text.size()+1];
        text.toWCharArray(wtext);
        wtext[text.size()] = 0;
@@ -63,7 +65,10 @@ QString Backend::coor(const QString& xy, const QString& text) const
 QString Backend::geometry(const QString& mgl) const
 {
        qDebug() << __FUNCTION__;
-       const char *tmp = tmpnam(0);
+       char tmp[256];
+       static size_t counter=size_t(0xffffffff*mgl_rnd());
+       snprintf(tmp,256,"%s/mathgl%lu.json", P_tmpdir, counter);
+       tmp[255]=0;     counter++;
        wchar_t *wmgl;
        mglGraph gr;
 #if 0
@@ -71,8 +76,7 @@ QString Backend::geometry(const QString& mgl) const
 #endif
        mglParse pr;
        pr.AllowSetSize(true);
-       setlocale(LC_CTYPE, "");
-       setlocale(LC_NUMERIC, "C");
+       setlocale(LC_ALL, "");  setlocale(LC_NUMERIC, "C");
        wmgl = new wchar_t[mgl.size()+1];
        mgl.toWCharArray(wmgl);
        wmgl[mgl.size()] = 0;
index 63733a1416f8c2c708942ae32241f29c835583cb..8e501498470324826d61bfe8f4282fe752ba1908 100644 (file)
@@ -1,19 +1,51 @@
+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_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-qt4 ${MGL_QT4_LIBS})
index d6b84c107ceb5db9ba79d08c195d0079bf79b940..da245d2c6267e0da46b2cb8958bec9a007321543 100644 (file)
@@ -43,7 +43,11 @@ if(enable-python)
                OUTPUT_VARIABLE MGL_PYTHON_SITE_PACKAGES
                OUTPUT_STRIP_TRAILING_WHITESPACE)
        set(SWIG_MODULE_mathgl_EXTRA_DEPS numpy.i ${src_imp_dep})
-       SWIG_ADD_MODULE(mathgl python mathgl.i)
+       if(${CMAKE_VERSION} VERSION_LESS "3.8.0") 
+               SWIG_ADD_MODULE(mathgl python mathgl.i)
+       else(${CMAKE_VERSION} VERSION_LESS "3.8.0")
+               SWIG_ADD_LIBRARY(mathgl LANGUAGE python SOURCES mathgl.i)
+       endif(${CMAKE_VERSION} VERSION_LESS "3.8.0")
        SWIG_LINK_LIBRARIES(mathgl mgl ${PYTHON_LIBRARIES})
        set_target_properties(_mathgl PROPERTIES BUILD_WITH_INSTALL_RPATH ON)
        add_custom_command(OUTPUT mathgl.pyc
@@ -54,7 +58,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)
@@ -67,11 +71,15 @@ if(enable-lua)
 
        include_directories(${LUA_INCLUDE_DIR})
        set(SWIG_MODULE_mgl-lua_EXTRA_DEPS numpy.i ${src_imp_dep})
-       SWIG_ADD_MODULE(mgl-lua lua mathgl.i)
+       if(${CMAKE_VERSION} VERSION_LESS "3.8.0") 
+               SWIG_ADD_MODULE(mgl-lua lua mathgl.i)
+       else(${CMAKE_VERSION} VERSION_LESS "3.8.0")
+               SWIG_ADD_LIBRARY(mgl-lua LANGUAGE lua SOURCES mathgl.i)
+       endif(${CMAKE_VERSION} VERSION_LESS "3.8.0")
        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,19 +113,23 @@ 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})
-       SWIG_ADD_MODULE(mgl-oct octave mathgl.i)
+       if(${CMAKE_VERSION} VERSION_LESS "3.8.0") 
+               SWIG_ADD_MODULE(mgl-oct octave mathgl.i)
+       else(${CMAKE_VERSION} VERSION_LESS "3.8.0")
+               SWIG_ADD_LIBRARY(mgl-oct LANGUAGE octave SOURCES mathgl.i)
+       endif(${CMAKE_VERSION} VERSION_LESS "3.8.0")
        SWIG_LINK_LIBRARIES(mgl-oct mgl)
        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..6d289d5547b8afb51ed6cb559e6dfe633946b7cb 100644 (file)
@@ -27,7 +27,6 @@ public:
        long ny;                ///< number of points in 2nd dimensions ('y' dimension)
        long nz;                ///< number of points in 3d dimensions ('z' dimension)
        mreal *a;               ///< data array
-       std::string id; ///< column (or slice) names
        bool link;              ///< use external data (i.e. don't free it)
 
        /// Initiate by other mglData variable
@@ -114,15 +113,18 @@ public:
        /// Crop the data
        inline void Crop(long n1, long n2,char dir='x')
        {       mgl_data_crop(this,n1,n2,dir);  }
+       /// Crop the data to be most optimal for FFT (i.e. to closest value of 2^n*3^m*5^l)
+       inline void Crop(const char *how="235x")
+       {       mgl_data_crop_opt(this, how);   }
        /// Insert data rows/columns/slices
        inline void Insert(char dir, long at=0, long num=1)
        {       mgl_data_insert(this,dir,at,num);       }
        /// 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 +240,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));      }
@@ -269,15 +278,23 @@ public:
        {       return mglData(true,mgl_data_evaluate(this,&idat,&jdat,0,norm));        }
        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 nonlinear equation defined by textual formula
+       inline mglData Roots(const char *eq, char var='x') const
+       {       return mglData(true,mgl_data_roots(eq, this, var));     }
        /// 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 MultiRoots(const char *eq, const char *vars) const
+       {       return mglData(true,mgl_find_roots_txt(eq, vars, this));        }
        /// 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);      }
@@ -285,6 +302,9 @@ public:
        inline void Integral(const char *dir)   {       mgl_data_integral(this,dir);    }
        /// Differentiate the data in given direction or directions
        inline void Diff(const char *dir)       {       mgl_data_diff(this,dir);        }
+       /// Differentiate the parametrically specified data along direction v1
+       inline void Diff(const mglData &v1)
+       {       mgl_data_diff_par(this,&v1,0,0);        }
        /// Differentiate the parametrically specified data along direction v1 with v2=const
        inline void Diff(const mglData &v1, const mglData &v2)
        {       mgl_data_diff_par(this,&v1,&v2,0);      }
@@ -302,6 +322,12 @@ 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 +350,12 @@ 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);        }
+       /// Project the periodical data to range [v1,v2] (like mod() function). Separate branches by NAN if sep=true.
+       inline void Coil(mreal v1, mreal v2, bool sep=true)
+       {       mgl_data_coil(this, v1, v2, sep);       }
 
        /// Apply Hankel transform
        inline void Hankel(const char *dir)     {       mgl_data_hankel(this,dir);      }
@@ -331,7 +363,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 +513,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 +537,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 8fef5356735873a28f2d82976ea5fe87e4548093..48badd96deae2a44d18f3b37d5a406a058d8800c 100644 (file)
@@ -34,7 +34,7 @@ public:
 #else
                else if(kind==1)
                {       gr=mgl_create_graph(width, height);
-                       mglGlobalMess += "OpenGL support was disabled. Please, enable it and rebuild MathGL.\n";        }
+                       SetGlobalWarn("OpenGL support was disabled. Please, enable it and rebuild MathGL.");    }
 #endif
                else    gr=mgl_create_graph(width, height);
        }
@@ -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)
@@ -122,9 +124,14 @@ public:
        /// Restore font (load default font for new HMGL objects)
        inline void RestoreFont()                               {       mgl_restore_font(gr);   }
        /// Set to use or not text rotation
-       inline void SetRotatedText(bool rotated)        {       mgl_set_rotated_text(gr, rotated);      }
+       inline void SetRotatedText(bool enable) {       mgl_set_rotated_text(gr, enable);       }
+       /// Set to scale text in relative subplots too
+       inline void SetScaleText(bool enable)   {       mgl_set_scale_text(gr, enable); }
        /// Set default font for all new HMGL and mglGraph objects
        static inline void SetDefFont(const char *name, const char *path="")    {       mgl_def_font(name,path);        }
+       /// Add user-defined glyph for symbol and set its optional id
+       inline void DefineSymbol(char id, const mglData &x, const mglData &y)
+       {       mgl_define_symbol(gr, id, &x, &y);      }
 
        /// Set default palette
        inline void SetPalette(const char *colors)      {       mgl_set_palette(gr, colors);    }
@@ -154,6 +161,8 @@ public:
        static inline void SuppressWarn(bool on)        {       mgl_suppress_warn(on);  }
        /// Check if MathGL version is valid (return false) or not (return true)
        static inline bool CheckVersion(const char *ver)        {       return mgl_check_version(ver);  }
+       /// Display progress of something.
+       inline void Progress(int value, int maximal)    {       mgl_progress(value, maximal, gr);       }
 
        /// Set axis range scaling -- simplified way to shift/zoom axis range -- need to replot whole image!
        inline void ZoomAxis(mglPoint p1=mglPoint(0,0,0,0), mglPoint p2=mglPoint(1,1,1,1))
@@ -261,6 +270,9 @@ public:
        /// Set to draw tick labels at axis origin
        inline void SetOriginTick(bool enable=true)
        {       mgl_set_flag(gr,!enable, MGL_NO_ORIGIN);        }
+       /// Set bit-value flag of HMGL state (for advanced users only)
+       inline void SetFlagAdv(int val, uint32_t flag)
+       {       mgl_set_flag(gr, val, flag);    }
 
        /// Put further plotting in m-th cell of nx*ny grid of the image.
        /** String \a style may contain:
@@ -271,15 +283,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 +305,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 +328,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 +368,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 +600,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 +664,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);  }
@@ -640,6 +675,12 @@ public:
        inline void Logo(const char *fname, bool smooth=false, const char *opt="")
        {       mgl_logo_file(gr, fname, smooth, opt);  }
 
+       /// Draw user-defined symbol in position p
+       inline void Symbol(mglPoint p, char id, const char *how="", double size=-1)
+       {       mgl_symbol(gr, p.x, p.y, p.z, id, how, size);   }
+       /// Draw user-defined symbol in position p along direction d
+       inline void Symbol(mglPoint p, mglPoint d, char id, const char *how="", double size=-1)
+       {       mgl_symbol_dir(gr, p.x, p.y, p.z, d.x, d.y, d.z, id, how, size);        }
        /// Print text in position p with specified font
        inline void Putsw(mglPoint p,const wchar_t *text,const char *font=":C",double size=-1)
        {       mgl_putsw(gr, p.x, p.y, p.z, text, font, size); }
@@ -1236,6 +1277,14 @@ public:
        /** Style 'x' draw belts in x-direction. */
        inline void Belt(const mglData &z, const char *stl="", const char *opt="")
        {       mgl_belt(gr, &z, stl, opt);     }
+       /// Draw belts for 2d data specified parametrically with color proportional to c
+       /** Style 'x' draw belts in x-direction. */
+       inline void BeltC(const mglData &x, const mglData &y, const mglData &z, const mglData &c, const char *stl="", const char *opt="")
+       {       mgl_beltc_xy(gr, &x, &y, &z, &c, stl, opt);     }
+       /// Draw belts for 2d data with color proportional to c
+       /** Style 'x' draw belts in x-direction. */
+       inline void BeltC(const mglData &z, const mglData &c, const char *stl="", const char *opt="")
+       {       mgl_beltc(gr, &z, &c, stl, opt);        }
 
        /// Draw surface for 2d data specified parametrically with color proportional to z
        /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/
@@ -1253,12 +1302,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="")
@@ -1277,6 +1330,17 @@ public:
        inline void Boxs(const mglData &z, const char *stl="", const char *opt="")
        {       mgl_boxs(gr, &z, stl, opt);     }
 
+       /// Draw contour lines on parametric surface at manual levels for 2d data specified parametrically
+       /** Style ‘f’ to draw solid contours.
+        * Style 't'/'T' draw contour labels below/above contours.*/
+       inline void ContP(const mglData &v, const mglData &x, const mglData &y, const mglData &z, const mglData &a, const char *sch="", const char *opt="")
+       {       mgl_contp_val(gr, &v, &x, &y, &z, &a, sch, opt);        }
+       /// Draw contour lines on parametric surface at manual levels for 2d data specified parametrically
+       /** Style ‘f’ to draw solid contours.
+        * Style ‘t’/‘T’ draw contour labels below/above contours.
+        * Option "value" set the number of contour levels (default is 7). */
+       inline void ContP(const mglData &x, const mglData &y, const mglData &z, const mglData &a, const char *sch="", const char *opt="")
+       {       mgl_contp(gr, &x, &y, &z, &a, sch, opt);        }
        /// Draw contour lines at manual levels for 2d data specified parametrically
        /** Style ‘_’ to draw contours at bottom of axis box.
         * Style 't'/'T' draw contour labels below/above contours.*/
@@ -1497,6 +1561,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);     }
@@ -1742,6 +1809,22 @@ public:
        inline void FlowP(mglPoint p, const mglData &ax, const mglData &ay, const mglData &az, const char *sch="", const char *opt="")
        {       mgl_flowp_3d(gr, p.x, p.y, p.z, &ax, &ay, &az, sch, opt);       }
 
+       /// Plot flows from given plain for vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with color proportional to |a|
+       /** String \a sch may contain:
+       * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);
+       * 'v' for drawing arrows on the threads;
+       * 't' for drawing tapes of normals in x-y and y-z planes.
+       * Option "value" sets the number of threads (default is 5). */
+       inline void Flow3(const mglData &x, const mglData &y, const mglData &z, const mglData &ax, const mglData &ay, const mglData &az, const char *sch="", double sVal=-1, const char *opt="")
+       {       mgl_flow3_xyz(gr, &x, &y, &z, &ax, &ay, &az, sch, sVal, opt);   }
+       /// Plot flows from given plain for vector field {ax,ay,az} with color proportional to |a|
+       /** String \a sch may contain:
+       * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);
+       * 'v' for drawing arrows on the threads;
+       * 't' for drawing tapes of normals in x-y and y-z planes.
+       * Option "value" sets the number of threads (default is 5). */
+       inline void Flow3(const mglData &ax, const mglData &ay, const mglData &az, const char *sch="", double sVal=-1, const char *opt="")
+       {       mgl_flow3(gr, &ax, &ay, &az, sch, sVal, opt);   }
        /// Plot flows for gradient of scalar field phi parametrically depended on coordinate {x,y,z}
        /** String \a sch may contain:
         * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);
@@ -2124,6 +2207,8 @@ public:
 class mglParse
 {
        HMPR pr;
+       mglParse &operator=(mglParse &p)
+       {       pr = p.pr;      mgl_use_parser(pr,1);   return p;       }
 public:
        mglParse(HMPR p)                {       pr = p;         mgl_use_parser(pr,1);   }
        mglParse(mglParse &p)   {       pr = p.pr;      mgl_use_parser(pr,1);   }
@@ -2158,7 +2243,7 @@ public:
        /// Return description of MGL command
        inline const char *CmdDesc(const char *name)
        {       return mgl_parser_cmd_desc(pr, name);   }
-       /// Get name of command with nmber n
+       /// Get name of command with number n
        inline const char *GetCmdName(long n)
        {       return mgl_parser_cmd_name(pr,n);       }
        /// Get number of defined commands
@@ -2172,6 +2257,9 @@ public:
        {       mgl_rk_step(pr, eqs, vars, dt); }
        inline void RK_Step(const wchar_t *eqs, const wchar_t *vars, mreal dt=1)
        {       mgl_rk_step_w(pr, eqs, vars, dt);       }
+       // Open all data arrays from HDF file and assign it as variables of parser p
+       inline void OpenHDF(const char *fname)
+       {       mgl_parser_openhdf(pr, fname);  }
 
        /// Set value for parameter $N
        inline void AddParam(int id, const char *str)
@@ -2188,6 +2276,12 @@ 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);    }
+       /// Set starting object ID
+       inline void     StartID(int id=0)
+       {       mgl_parser_start_id(pr, id);    }
 
        /// Return result of formula evaluation
        inline mglData Calc(const char *formula)
index 6704b2a2ba19fede79615fb15bebae6cd3f1b3b8..8f96bb9fafe86e80fef6126306cd552203daa17c 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;
@@ -33,12 +34,15 @@ const mreal mgl_min_a = 1./256;
 struct mglPoint
 {
        mreal x,y,z,c;
-       mglPoint(mreal X=0,mreal Y=0,mreal Z=0,mreal C=0){x=X;y=Y;z=Z;c=C;}
+       mglPoint(mreal X=0,mreal Y=0,mreal Z=0,mreal C=0):x(X),y(Y),z(Z),c(C) {}
+       mglPoint(const mglPoint &d):x(d.x),y(d.y),z(d.z),c(d.c) {}
        inline bool IsNAN()             {       return (x!=x || y!=y || z!=z || c!=c);  }
        inline mreal val(int i) {       return (i<2 ? (i==0 ? x:y) : (i==2 ? z:c));     }
        inline mreal norm()             {       return sqrt(x*x+y*y+z*z);       }
        inline void Normalize() {       mreal v=norm(); x/=v;   y/=v;   z/=v;   }
 
+       inline const mglPoint &operator=(const mglPoint &p)
+       {       x=p.x;  y=p.y;  z=p.z;  c=p.c;  return p;       }
        inline void operator+=(const mglPoint &a)       {       x+=a.x; y+=a.y; z+=a.z; c+=a.c; }
        inline void operator-=(const mglPoint &a)       {       x-=a.x; y-=a.y; z-=a.z; c-=a.c; }
        inline void operator+=(mreal a) {       x+=a;   y+=a;   z+=a;   }
@@ -56,17 +60,22 @@ struct mglColor
        float a;        ///< Alpha component of color
 
        /// Constructor for RGB components manualy
-       mglColor(float R,float G,float B, float A=1){   r=R;    g=G;    b=B;    a=A;    }
+       mglColor(float R,float G,float B, float A=1):r(R),g(G),b(B),a(A)        {}
+       /// Constructor for RGB components manualy
+       mglColor(const unsigned char *c, float A=1):r(c[0]/255.f),g(c[1]/255.f),b(c[3]/255.f),a(A)      {}
        /// Constructor set default color
-       mglColor()              {       r=g=b=0;        a=1;    }
+       mglColor():r(0),g(0),b(0),a(1)  {}
        /// Constructor set color from character id
        mglColor(char c, float bright=1)                {       Set(c,bright);  }
+       /// Copy constructor
+       mglColor(const mglColor &d):r(d.r),g(d.g),b(d.b),a(d.a) {}
        /// Set color as Red, Green, Blue values
        void Set(float R,float G,float B,float A=1)     {       r=R;    g=G;    b=B;    a=A;    }
        /// 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;
@@ -85,11 +94,15 @@ struct mglColor
                float rgb[3];   mgl_chrrgb(p,rgb);
                Set(mglColor(rgb[0],rgb[1],rgb[2]),bright);
        }
+       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
-       {       return !memcmp(this, &c, sizeof(mglColor));     }
-       inline bool operator!=(const mglColor &c) const
-       {       return memcmp(this, &c, sizeof(mglColor));              }
+       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 // 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
        {       return memcmp(this, &c, sizeof(mglColor))<0;    }
        // transparency still the same
@@ -98,3 +111,4 @@ struct mglColor
        inline void operator-=(const mglColor &c)       {       r-=c.r; g-=c.g; b-=c.b; a-=c.a; }
 };
 //-----------------------------------------------------------------------------
+
index 40ea8f60eab83518c2e762c81bb757553b9c1ee5..0c49253b00886d1766f2bf754f0de63e11178ead 100644 (file)
@@ -3,15 +3,18 @@
        <FileVersion major="1" minor="6" />
        <Project>
                <Option title="mathgl-2x" />
+               <Option makefile_is_custom="1" />
+               <Option execution_dir="/home/balakin/mathgl-code/mathgl-2x/Debug/" />
                <Option pch_mode="2" />
                <Option compiler="gcc" />
                <Build>
-                       <Target title="Release">
-                               <Option output="bin/Release/mathgl-2x" prefix_auto="1" extension_auto="1" />
-                               <Option working_dir="bin/" />
+                       <Target title="all">
+                               <Option output="Debug/mgllab/mgllab" prefix_auto="1" extension_auto="1" />
+                               <Option working_dir="Debug/" />
                                <Option object_output="obj/Release/" />
                                <Option type="1" />
                                <Option compiler="gcc" />
+                               <Option use_console_runner="0" />
                                <Option parameters="-test" />
                                <Compiler>
                                        <Add option="-I include/" />
                        <Add option="-lpng -ljpeg -lgif -lhpdf" />
                        <Add option="-lhdf5 -lmfhdf -ldf -lmfhdf" />
                </Linker>
-               <Unit filename="build/include/mgl2/config.h" />
+               <Unit filename="CMakeLists.txt" />
+               <Unit filename="ChangeLog.txt" />
+               <Unit filename="Debug/include/mgl2/config.h" />
+               <Unit filename="Debug/include/mgl2/dllexport.h" />
+               <Unit filename="examples/CMakeLists.txt" />
                <Unit filename="examples/full_test.cpp" />
                <Unit filename="examples/samples.cpp" />
                <Unit filename="examples/wnd_samples.cpp" />
+               <Unit filename="include/CMakeLists.txt" />
+               <Unit filename="include/config.h.in" />
+               <Unit filename="include/mgl2/Fl_MathGL.h" />
+               <Unit filename="include/mgl2/abstract.h" />
                <Unit filename="include/mgl2/addon.h" />
                <Unit filename="include/mgl2/base.h" />
                <Unit filename="include/mgl2/base_cf.h" />
                <Unit filename="include/mgl2/opengl.h" />
                <Unit filename="include/mgl2/other.h" />
                <Unit filename="include/mgl2/parser.h" />
+               <Unit filename="include/mgl2/pde.h" />
                <Unit filename="include/mgl2/plot.h" />
                <Unit filename="include/mgl2/prim.h" />
                <Unit filename="include/mgl2/qmathgl.h" />
                <Unit filename="include/mgl2/qt.h" />
                <Unit filename="include/mgl2/surf.h" />
+               <Unit filename="include/mgl2/thread.h" />
                <Unit filename="include/mgl2/type.h" />
                <Unit filename="include/mgl2/vect.h" />
                <Unit filename="include/mgl2/volume.h" />
                <Unit filename="include/mgl2/window.h" />
                <Unit filename="include/mgl2/wnd.h" />
                <Unit filename="include/mgl2/wx.h" />
+               <Unit filename="mgllab/CMakeLists.txt" />
+               <Unit filename="mgllab/dialogs.cpp" />
+               <Unit filename="mgllab/editor.cpp" />
+               <Unit filename="mgllab/grid.cpp" />
+               <Unit filename="mgllab/help.cpp" />
+               <Unit filename="mgllab/mathgl.cpp" />
+               <Unit filename="mgllab/mgllab.cpp" />
+               <Unit filename="mgllab/mgllab.h" />
+               <Unit filename="mgllab/mgllab.rc" />
+               <Unit filename="mgllab/table.cpp" />
+               <Unit filename="mgllab/todo.txt" />
+               <Unit filename="mgltex/CMakeLists.txt" />
+               <Unit filename="mgltex/CMakeLists.txt~" />
+               <Unit filename="mgltex/Recompilation_decision.eps" />
+               <Unit filename="mgltex/Recompilation_decision.pdf" />
+               <Unit filename="mgltex/Recompilation_decision.svg" />
+               <Unit filename="mgltex/mgltex.dtx" />
+               <Unit filename="mgltex/mgltex.ins" />
+               <Unit filename="mgltex/mgltex.pdf" />
+               <Unit filename="mgltex/sample.tex" />
+               <Unit filename="src/CMakeLists.txt" />
                <Unit filename="src/addon.cpp" />
                <Unit filename="src/axis.cpp" />
                <Unit filename="src/base.cpp" />
                <Unit filename="src/canvas.cpp" />
                <Unit filename="src/canvas_cf.cpp" />
                <Unit filename="src/complex.cpp" />
+               <Unit filename="src/complex_ex.cpp" />
                <Unit filename="src/complex_io.cpp" />
                <Unit filename="src/cont.cpp" />
+               <Unit filename="src/cont.hpp" />
                <Unit filename="src/crust.cpp" />
                <Unit filename="src/data.cpp" />
+               <Unit filename="src/data_ex.cpp" />
+               <Unit filename="src/data_gr.cpp" />
                <Unit filename="src/data_io.cpp" />
-               <Unit filename="src/data_new.cpp" />
                <Unit filename="src/data_png.cpp" />
-               <Unit filename="src/def_font.cpp" />
+               <Unit filename="src/def_font.cc" />
                <Unit filename="src/eval.cpp" />
                <Unit filename="src/evalc.cpp" />
                <Unit filename="src/evalp.cpp" />
-               <Unit filename="src/exec.cpp" />
+               <Unit filename="src/exec_dat.cpp" />
+               <Unit filename="src/exec_gr.cpp" />
+               <Unit filename="src/exec_prm.cpp" />
+               <Unit filename="src/exec_set.cpp" />
                <Unit filename="src/export.cpp" />
                <Unit filename="src/export_2d.cpp" />
                <Unit filename="src/export_3d.cpp" />
                <Unit filename="src/fft.cpp" />
                <Unit filename="src/fit.cpp" />
                <Unit filename="src/font.cpp" />
+               <Unit filename="src/fractal.cpp" />
+               <Unit filename="src/interp.hpp" />
+               <Unit filename="src/mpi.cpp" />
                <Unit filename="src/obj.cpp" />
+               <Unit filename="src/opengl.cpp" />
                <Unit filename="src/other.cpp" />
                <Unit filename="src/parser.cpp" />
                <Unit filename="src/pde.cpp" />
                <Unit filename="src/pixel.cpp" />
+               <Unit filename="src/pixel_gen.cpp" />
+               <Unit filename="src/pixel_pix.cpp" />
                <Unit filename="src/plot.cpp" />
                <Unit filename="src/prc.cpp" />
                <Unit filename="src/prc/PRC.h" />
                <Unit filename="src/s_hull/s_hull_pro.cpp" />
                <Unit filename="src/s_hull/s_hull_pro.h" />
                <Unit filename="src/surf.cpp" />
-               <Unit filename="src/tex_table.cpp" />
+               <Unit filename="src/tex_table.cc" />
                <Unit filename="src/vect.cpp" />
                <Unit filename="src/volume.cpp" />
                <Unit filename="src/window.cpp" />
+               <Unit filename="texinfo/CMakeLists.txt" />
+               <Unit filename="texinfo/appendix_en.texi" />
+               <Unit filename="texinfo/appendix_ru.texi" />
+               <Unit filename="texinfo/classes.dia" />
+               <Unit filename="texinfo/classes.pdf" />
+               <Unit filename="texinfo/classes.png" />
+               <Unit filename="texinfo/concept_en.texi" />
+               <Unit filename="texinfo/concept_ru.texi" />
+               <Unit filename="texinfo/copyright.texi" />
+               <Unit filename="texinfo/core_en.texi" />
+               <Unit filename="texinfo/core_ru.texi" />
+               <Unit filename="texinfo/data_en.texi" />
+               <Unit filename="texinfo/data_ru.texi" />
+               <Unit filename="texinfo/datadvance.png" />
+               <Unit filename="texinfo/doc_en.texi" />
+               <Unit filename="texinfo/doc_ru.texi" />
+               <Unit filename="texinfo/emblem_sm.png" />
+               <Unit filename="texinfo/ex_mgl_en.texi" />
+               <Unit filename="texinfo/ex_mgl_ru.texi" />
+               <Unit filename="texinfo/example_en.texi" />
+               <Unit filename="texinfo/example_ru.texi" />
+               <Unit filename="texinfo/fdl.texi" />
+               <Unit filename="texinfo/filter.py" />
+               <Unit filename="texinfo/fltk.png" />
+               <Unit filename="texinfo/formats_en.texi" />
+               <Unit filename="texinfo/formats_ru.texi" />
+               <Unit filename="texinfo/glut.png" />
+               <Unit filename="texinfo/gpl-2.0.texi" />
+               <Unit filename="texinfo/gpl-3.0.texi" />
+               <Unit filename="texinfo/gplv3-127x51.png" />
+               <Unit filename="texinfo/index.html" />
+               <Unit filename="texinfo/json.html" />
+               <Unit filename="texinfo/lgplv3-147x51.png" />
+               <Unit filename="texinfo/mathgl.js" />
+               <Unit filename="texinfo/mathgl.texi" />
+               <Unit filename="texinfo/mathgl_en.texi" />
+               <Unit filename="texinfo/mathgl_ru.texi" />
+               <Unit filename="texinfo/mgl.5" />
+               <Unit filename="texinfo/mgl.cgi.1" />
+               <Unit filename="texinfo/mgl_en.texi" />
+               <Unit filename="texinfo/mgl_ru.texi" />
+               <Unit filename="texinfo/mglconv.1" />
+               <Unit filename="texinfo/mglview.1" />
+               <Unit filename="texinfo/other_en.texi" />
+               <Unit filename="texinfo/other_ru.texi" />
+               <Unit filename="texinfo/overview_en.texi" />
+               <Unit filename="texinfo/overview_ru.texi" />
+               <Unit filename="texinfo/parse_en.texi" />
+               <Unit filename="texinfo/parse_ru.texi" />
+               <Unit filename="texinfo/qt.png" />
+               <Unit filename="texinfo/symbols_en.texi" />
+               <Unit filename="texinfo/symbols_ru.texi" />
+               <Unit filename="texinfo/time.texi" />
+               <Unit filename="texinfo/time_big.texi" />
+               <Unit filename="texinfo/udav.1" />
+               <Unit filename="texinfo/udav/udav_anim.png" />
+               <Unit filename="texinfo/udav/udav_arg.png" />
+               <Unit filename="texinfo/udav/udav_calc.png" />
+               <Unit filename="texinfo/udav/udav_cmd.png" />
+               <Unit filename="texinfo/udav/udav_data.png" />
+               <Unit filename="texinfo/udav/udav_gen_set.png" />
+               <Unit filename="texinfo/udav/udav_help.png" />
+               <Unit filename="texinfo/udav/udav_inplot.png" />
+               <Unit filename="texinfo/udav/udav_light.png" />
+               <Unit filename="texinfo/udav/udav_main.png" />
+               <Unit filename="texinfo/udav/udav_mask.png" />
+               <Unit filename="texinfo/udav/udav_opt.png" />
+               <Unit filename="texinfo/udav/udav_pen.png" />
+               <Unit filename="texinfo/udav/udav_prop.png" />
+               <Unit filename="texinfo/udav/udav_sch.png" />
+               <Unit filename="texinfo/udav/udav_txt.png" />
+               <Unit filename="texinfo/udav/udav_var.png" />
+               <Unit filename="texinfo/udav_en.texi" />
+               <Unit filename="texinfo/udav_ru.texi" />
+               <Unit filename="texinfo/version.texi.in" />
+               <Unit filename="texinfo/version_hist.txt" />
+               <Unit filename="texinfo/web_en.texi" />
+               <Unit filename="texinfo/web_fr.texi" />
+               <Unit filename="texinfo/web_ru.texi" />
+               <Unit filename="texinfo/widget_en.texi" />
+               <Unit filename="texinfo/widget_ru.texi" />
+               <Unit filename="todo.txt" />
+               <Unit filename="udav/CMakeLists.txt" />
+               <Unit filename="udav/anim_dlg.cpp" />
+               <Unit filename="udav/anim_dlg.h" />
+               <Unit filename="udav/args_dlg.cpp" />
+               <Unit filename="udav/args_dlg.h" />
+               <Unit filename="udav/calc_dlg.cpp" />
+               <Unit filename="udav/calc_dlg.h" />
+               <Unit filename="udav/dat_pnl.cpp" />
+               <Unit filename="udav/dat_pnl.h" />
+               <Unit filename="udav/data_dlg.cpp" />
+               <Unit filename="udav/data_dlg.h" />
+               <Unit filename="udav/files_dlg.cpp" />
+               <Unit filename="udav/files_dlg.h" />
+               <Unit filename="udav/find_dlg.cpp" />
+               <Unit filename="udav/find_dlg.h" />
+               <Unit filename="udav/help_pnl.cpp" />
+               <Unit filename="udav/help_pnl.h" />
+               <Unit filename="udav/hint_dlg.cpp" />
+               <Unit filename="udav/hint_dlg.h" />
+               <Unit filename="udav/info_dlg.cpp" />
+               <Unit filename="udav/info_dlg.h" />
+               <Unit filename="udav/linenumber.h" />
+               <Unit filename="udav/mem_pnl.cpp" />
+               <Unit filename="udav/mem_pnl.h" />
+               <Unit filename="udav/newcmd_dlg.cpp" />
+               <Unit filename="udav/newcmd_dlg.h" />
+               <Unit filename="udav/open_dlg.cpp" />
+               <Unit filename="udav/open_dlg.h" />
+               <Unit filename="udav/opt_dlg.cpp" />
+               <Unit filename="udav/opt_dlg.h" />
+               <Unit filename="udav/plot_pnl.cpp" />
+               <Unit filename="udav/plot_pnl.h" />
+               <Unit filename="udav/prop_dlg.cpp" />
+               <Unit filename="udav/prop_dlg.h" />
+               <Unit filename="udav/qmglsyntax.cpp" />
+               <Unit filename="udav/qmglsyntax.h" />
+               <Unit filename="udav/setup_dlg.cpp" />
+               <Unit filename="udav/setup_dlg.h" />
+               <Unit filename="udav/style_dlg.cpp" />
+               <Unit filename="udav/style_dlg.h" />
+               <Unit filename="udav/subplot_dlg.cpp" />
+               <Unit filename="udav/subplot_dlg.h" />
+               <Unit filename="udav/text_pnl.cpp" />
+               <Unit filename="udav/text_pnl.h" />
+               <Unit filename="udav/textedit.cpp" />
+               <Unit filename="udav/textedit.h" />
+               <Unit filename="udav/tree_pnl.cpp" />
+               <Unit filename="udav/tree_pnl.h" />
+               <Unit filename="udav/udav.rc" />
+               <Unit filename="udav/udav_wnd.cpp" />
+               <Unit filename="udav/udav_wnd.h" />
+               <Unit filename="utils/CMakeLists.txt" />
+               <Unit filename="utils/make_forth.cpp" />
+               <Unit filename="utils/make_pas.cpp" />
+               <Unit filename="utils/mglcgi.cpp" />
+               <Unit filename="utils/mglconv.cpp" />
+               <Unit filename="utils/mglview.cpp" />
+               <Unit filename="widgets/CMakeLists.txt" />
+               <Unit filename="widgets/fltk.cpp" />
+               <Unit filename="widgets/glut.cpp" />
+               <Unit filename="widgets/image.cpp" />
+               <Unit filename="widgets/image.h" />
+               <Unit filename="widgets/qt.cpp" />
+               <Unit filename="widgets/wx.cpp" />
                <Extensions>
                        <code_completion />
                        <envvars />
diff --git a/mathgl_en.po b/mathgl_en.po
new file mode 100644 (file)
index 0000000..3db32ce
--- /dev/null
@@ -0,0 +1,6307 @@
+#: mgllab/mgllab.cpp:415
+#, c-format
+msgid ""
+"\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-L loc       set locale to loc\n"
+"\t-h           print this message\n"
+msgstr ""
+
+#: utils/mglconv.cpp:87
+#, c-format
+msgid ""
+"\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-L loc       set locale to loc\n"
+"\t-s fname     set MGL script for setting up the plot\n"
+"\t-S val       set scaling factor for images\n"
+"\t-q val       set quality for output (val=0...9)\n"
+"\t-g val       set gray-scale mode (val=0|1)\n"
+"\t-v val       set variant of arguments\n"
+"\t-o name      set output file name\n"
+"\t-n           no default output (script should save results by itself)\n"
+"\t-A val       add animation value val\n"
+"\t-C n1:n2:dn  add animation value in range [n1,n2] with step dn\n"
+"\t-C n1:n2     add animation value in range [n1,n2] with step 1\n"
+"\t-            get script from standard input\n"
+"\t-h           print this message\n"
+msgstr ""
+
+#: utils/mglview.cpp:71
+#, c-format
+msgid ""
+"\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"
+msgstr ""
+
+#: widgets/qt.cpp:859
+msgid ""
+"\n"
+"(c) Alexey Balakin, 2007\n"
+"http://mathgl.sourceforge.net/"
+msgstr ""
+
+#: src/parser.cpp:1010
+#, c-format
+msgid ""
+"\n"
+"Change temporary data in line %ld"
+msgstr ""
+
+#: src/parser.cpp:1008
+#, c-format
+msgid ""
+"\n"
+"String too long in line %ld"
+msgstr ""
+
+#: src/parser.cpp:1009
+#, c-format
+msgid ""
+"\n"
+"Unbalanced ' in line %ld"
+msgstr ""
+
+#: src/parser.cpp:1006
+#, c-format
+msgid ""
+"\n"
+"Wrong argument(s) in line %ld"
+msgstr ""
+
+#: src/parser.cpp:1007
+#, c-format
+msgid ""
+"\n"
+"Wrong command in line %ld"
+msgstr ""
+
+#: udav/mem_pnl.cpp:136 udav/dat_pnl.cpp:153
+msgid " - UDAV preview"
+msgstr ""
+
+#: udav/dat_pnl.cpp:152
+msgid " - UDAV variable"
+msgstr ""
+
+#. o = new Fl_Button(420, 400, 90, 25, _(" Refresh")); o->callback(mem_update_cb,w);
+#. o->image(img_update);       o->align(FL_ALIGN_IMAGE_NEXT_TO_TEXT);
+#. o->tooltip(_("Refresh list of variables."));
+#: mgllab/help.cpp:176
+msgid " Del.all"
+msgstr ""
+
+#: mgllab/help.cpp:164
+msgid " Delete"
+msgstr ""
+
+#: mgllab/help.cpp:158
+msgid " Edit"
+msgstr ""
+
+#: mgllab/help.cpp:161
+msgid " Info"
+msgstr ""
+
+#: mgllab/help.cpp:167
+msgid " New"
+msgstr ""
+
+#: mgllab/help.cpp:170
+msgid " Save"
+msgstr ""
+
+#: mgllab/mgllab.cpp:225
+msgid " Yes "
+msgstr ""
+
+#: udav/plot_pnl.cpp:191
+#, c-format
+msgid "%d - %d of %d"
+msgstr ""
+
+#. :
+#: udav/style_dlg.cpp:316 mgllab/dialogs.cpp:208
+msgid "' ' none"
+msgstr ""
+
+#: udav/style_dlg.cpp:397
+msgid "'#*' Y-sign"
+msgstr ""
+
+#: udav/style_dlg.cpp:398
+msgid "'#+' squared plus"
+msgstr ""
+
+#: udav/style_dlg.cpp:396
+msgid "'#.' circled dot"
+msgstr ""
+
+#: udav/style_dlg.cpp:405
+msgid "'#<' solid triangle left"
+msgstr ""
+
+#: udav/style_dlg.cpp:406
+msgid "'#>' solid triangle right"
+msgstr ""
+
+#: udav/style_dlg.cpp:404
+msgid "'#^' solid triangle up"
+msgstr ""
+
+#: udav/style_dlg.cpp:402
+msgid "'#d' solid rhomb"
+msgstr ""
+
+#: udav/style_dlg.cpp:407
+msgid "'#o' solid circle"
+msgstr ""
+
+#: udav/style_dlg.cpp:401
+msgid "'#s' solid square"
+msgstr ""
+
+#: udav/style_dlg.cpp:403
+msgid "'#v' solid triangle down"
+msgstr ""
+
+#: udav/style_dlg.cpp:399
+msgid "'#x' squared cross"
+msgstr ""
+
+#. D
+#: udav/style_dlg.cpp:354 mgllab/dialogs.cpp:245
+msgid "'*' cross"
+msgstr ""
+
+#.
+#: udav/style_dlg.cpp:387 mgllab/dialogs.cpp:215
+msgid "'*' star"
+msgstr ""
+
+#. o
+#. -
+#: udav/style_dlg.cpp:341 udav/style_dlg.cpp:385 mgllab/dialogs.cpp:217
+#: mgllab/dialogs.cpp:232
+msgid "'+' plus"
+msgstr ""
+
+#.
+#: udav/style_dlg.cpp:340 mgllab/dialogs.cpp:231
+msgid "'-' lines"
+msgstr ""
+
+#. "-|;=ji: "
+#: udav/style_dlg.cpp:309 mgllab/dialogs.cpp:201
+msgid "'-' solid"
+msgstr ""
+
+#. d
+#: udav/style_dlg.cpp:384 mgllab/dialogs.cpp:221
+msgid "'.' dot"
+msgstr ""
+
+#. =
+#: udav/style_dlg.cpp:315 mgllab/dialogs.cpp:207
+msgid "':' dots"
+msgstr ""
+
+#. j
+#. =
+#: udav/style_dlg.cpp:311 udav/style_dlg.cpp:343 mgllab/dialogs.cpp:204
+#: mgllab/dialogs.cpp:234
+msgid "';' dash"
+msgstr ""
+
+#. ~
+#: udav/style_dlg.cpp:349 mgllab/dialogs.cpp:241
+msgid "'<' left sign"
+msgstr ""
+
+#. v
+#: udav/style_dlg.cpp:392 mgllab/dialogs.cpp:224
+msgid "'<' triangle left"
+msgstr ""
+
+#. +
+#: udav/style_dlg.cpp:342 mgllab/dialogs.cpp:233
+msgid "'=' double lines"
+msgstr ""
+
+#. i
+#: udav/style_dlg.cpp:312 mgllab/dialogs.cpp:206
+msgid "'=' small dash"
+msgstr ""
+
+#. <
+#: udav/style_dlg.cpp:350 mgllab/dialogs.cpp:242
+msgid "'>' right sign"
+msgstr ""
+
+#. <
+#: udav/style_dlg.cpp:393 mgllab/dialogs.cpp:225
+msgid "'>' triangle right"
+msgstr ""
+
+#. _
+#: udav/style_dlg.cpp:265 udav/style_dlg.cpp:288 mgllab/dialogs.cpp:188
+msgid "'A' arrow"
+msgstr ""
+
+#. S
+#: udav/style_dlg.cpp:271 udav/style_dlg.cpp:294 mgllab/dialogs.cpp:194
+msgid "'D' rhomb"
+msgstr ""
+
+#. d
+#: udav/style_dlg.cpp:353 mgllab/dialogs.cpp:244
+msgid "'D' solid rhomb"
+msgstr ""
+
+#. V
+#: udav/style_dlg.cpp:267 udav/style_dlg.cpp:290 mgllab/dialogs.cpp:191
+msgid "'I' stop"
+msgstr ""
+
+#. A
+#: udav/style_dlg.cpp:268 udav/style_dlg.cpp:291 mgllab/dialogs.cpp:189
+msgid "'K' size"
+msgstr ""
+
+#. D
+#: udav/style_dlg.cpp:272 udav/style_dlg.cpp:295 mgllab/dialogs.cpp:195
+msgid "'O' circle"
+msgstr ""
+
+#. o
+#: udav/style_dlg.cpp:345 mgllab/dialogs.cpp:237
+msgid "'O' solid circle"
+msgstr ""
+
+#. s
+#: udav/style_dlg.cpp:347 mgllab/dialogs.cpp:239
+msgid "'S' solid square"
+msgstr ""
+
+#. T
+#: udav/style_dlg.cpp:270 udav/style_dlg.cpp:293 mgllab/dialogs.cpp:193
+msgid "'S' square"
+msgstr ""
+
+#. I
+#: udav/style_dlg.cpp:269 udav/style_dlg.cpp:292 mgllab/dialogs.cpp:192
+msgid "'T' triangle"
+msgstr ""
+
+#. K
+#: udav/style_dlg.cpp:266 udav/style_dlg.cpp:289 mgllab/dialogs.cpp:190
+msgid "'V' back arrow"
+msgstr ""
+
+#. O
+#: mgllab/dialogs.cpp:196
+msgid "'X' cross"
+msgstr ""
+
+#. *
+#: udav/style_dlg.cpp:355 mgllab/dialogs.cpp:246
+msgid "'^' hats"
+msgstr ""
+
+#. .
+#: udav/style_dlg.cpp:391 mgllab/dialogs.cpp:222
+msgid "'^' triangle up"
+msgstr ""
+
+#. "AVIKTSDO"
+#: udav/style_dlg.cpp:264 udav/style_dlg.cpp:287 mgllab/dialogs.cpp:187
+msgid "'_' none"
+msgstr ""
+
+#. s
+#. >
+#: udav/style_dlg.cpp:352 udav/style_dlg.cpp:389 mgllab/dialogs.cpp:220
+#: mgllab/dialogs.cpp:243
+msgid "'d' rhomb"
+msgstr ""
+
+#. ;
+#: udav/style_dlg.cpp:314 mgllab/dialogs.cpp:205
+msgid "'i' small dash dot"
+msgstr ""
+
+#. |
+#. ;
+#: udav/style_dlg.cpp:313 udav/style_dlg.cpp:351 mgllab/dialogs.cpp:203
+#: mgllab/dialogs.cpp:235
+msgid "'j' dash dot"
+msgstr ""
+
+#. *
+#. j
+#: udav/style_dlg.cpp:344 udav/style_dlg.cpp:394 mgllab/dialogs.cpp:216
+#: mgllab/dialogs.cpp:236
+msgid "'o' circle"
+msgstr ""
+
+#. x
+#. O
+#: udav/style_dlg.cpp:346 udav/style_dlg.cpp:388 mgllab/dialogs.cpp:219
+#: mgllab/dialogs.cpp:238
+msgid "'s' square"
+msgstr ""
+
+#. ^
+#: udav/style_dlg.cpp:390 mgllab/dialogs.cpp:223
+msgid "'v' triangle down"
+msgstr ""
+
+#. +
+#: udav/style_dlg.cpp:386 mgllab/dialogs.cpp:218
+msgid "'x' skew cross"
+msgstr ""
+
+#. -
+#: udav/style_dlg.cpp:310 mgllab/dialogs.cpp:202
+msgid "'|' long dash"
+msgstr ""
+
+#. S
+#: udav/style_dlg.cpp:348 mgllab/dialogs.cpp:240
+msgid "'~' waves"
+msgstr ""
+
+#: src/parser.cpp:51
+msgid "0 - special plot"
+msgstr ""
+
+#: src/parser.cpp:51
+msgid "1 - other plot"
+msgstr ""
+
+#: src/parser.cpp:51
+msgid "10 - dd plot"
+msgstr ""
+
+#: src/parser.cpp:51
+msgid "11 - vector plot"
+msgstr ""
+
+#: src/parser.cpp:51
+msgid "12 - axis"
+msgstr ""
+
+#: src/parser.cpp:51
+msgid "13 - primitives"
+msgstr ""
+
+#: src/parser.cpp:51
+msgid "14 - axis setup"
+msgstr ""
+
+#: src/parser.cpp:51
+msgid "15 - text/legend"
+msgstr ""
+
+#: src/parser.cpp:51
+msgid "16 - data transform"
+msgstr ""
+
+#: udav/info_dlg.cpp:47
+msgid "1D plot"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:166 mgllab/dialogs.cpp:707
+msgid "1D plots"
+msgstr ""
+
+#: mgllab/help.cpp:360
+msgid "1D view"
+msgstr ""
+
+#: src/parser.cpp:51
+msgid "2 - setup"
+msgstr ""
+
+#: udav/info_dlg.cpp:47
+msgid "2D plot"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:167 mgllab/dialogs.cpp:708
+msgid "2D plots"
+msgstr ""
+
+#: mgllab/help.cpp:362
+msgid "2D view"
+msgstr ""
+
+#: src/parser.cpp:51
+msgid "3 - data handle"
+msgstr ""
+
+#: udav/open_dlg.cpp:71
+msgid "3D data with sizes from file"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:168 mgllab/dialogs.cpp:709
+msgid "3D plots"
+msgstr ""
+
+#: mgllab/help.cpp:364
+msgid "3D view"
+msgstr ""
+
+#: src/parser.cpp:51
+msgid "4 - data create"
+msgstr ""
+
+#: src/parser.cpp:51
+msgid "5 - subplot"
+msgstr ""
+
+#: src/parser.cpp:51
+msgid "6 - program flow"
+msgstr ""
+
+#: src/parser.cpp:51
+msgid "7 - 1d plot"
+msgstr ""
+
+#: src/parser.cpp:51
+msgid "8 - 2d plot"
+msgstr ""
+
+#: src/parser.cpp:51
+msgid "9 - 3d plot"
+msgstr ""
+
+#: udav/udav_wnd.cpp:455
+msgid ""
+"<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>"
+msgstr ""
+
+#: mgllab/help.cpp:304
+msgid "@<-  Prev"
+msgstr ""
+
+#: widgets/qt.cpp:1277 udav/udav_wnd.cpp:331 mgllab/mgllab.cpp:330
+msgid "About"
+msgstr ""
+
+#. -----------------------------------------------------------------------------
+#: widgets/qt.cpp:863 widgets/qt.cpp:1278 udav/udav_wnd.cpp:332
+#: udav/udav_wnd.cpp:460
+msgid "About Qt"
+msgstr ""
+
+#: widgets/qt.cpp:1156 udav/plot_pnl.cpp:372
+msgid "Add arc"
+msgstr ""
+
+#: widgets/qt.cpp:1159 udav/plot_pnl.cpp:375
+msgid "Add arc which properties can be changed later by mouse."
+msgstr ""
+
+#: mgllab/dialogs.cpp:84
+msgid "Add command option(s)"
+msgstr ""
+
+#: widgets/qt.cpp:1161 udav/plot_pnl.cpp:378
+msgid "Add curve"
+msgstr ""
+
+#: widgets/qt.cpp:1164 udav/plot_pnl.cpp:381
+msgid "Add curve which properties can be changed later by mouse."
+msgstr ""
+
+#: src/exec_dat.cpp:1523
+msgid "Add data or number"
+msgstr ""
+
+#: widgets/qt.cpp:1176 udav/plot_pnl.cpp:396
+msgid "Add ellipse"
+msgstr ""
+
+#: widgets/qt.cpp:1179 udav/plot_pnl.cpp:399 udav/plot_pnl.cpp:405
+msgid "Add ellipse which properties can be changed later by mouse."
+msgstr ""
+
+#: mgllab/dialogs.cpp:1229
+msgid "Add inplot"
+msgstr ""
+
+#: src/exec_set.cpp:690
+msgid "Add legend entry"
+msgstr ""
+
+#: mgllab/dialogs.cpp:119
+msgid "Add legend entry for the plot"
+msgstr ""
+
+#: widgets/qt.cpp:1151 udav/plot_pnl.cpp:366
+msgid "Add line"
+msgstr ""
+
+#: widgets/qt.cpp:1154 udav/plot_pnl.cpp:369
+msgid "Add line which properties can be changed later by mouse."
+msgstr ""
+
+#: widgets/qt.cpp:1186 udav/plot_pnl.cpp:408
+msgid "Add mark"
+msgstr ""
+
+#: widgets/qt.cpp:1189 udav/plot_pnl.cpp:411
+msgid "Add marker which properties can be changed later by mouse."
+msgstr ""
+
+#: widgets/qt.cpp:1181 udav/plot_pnl.cpp:402
+msgid "Add polygon"
+msgstr ""
+
+#: widgets/qt.cpp:1184
+msgid "Add polygon which properties can be changed later by mouse."
+msgstr ""
+
+#: mgllab/dialogs.cpp:1453
+msgid "Add primitive"
+msgstr ""
+
+#: widgets/qt.cpp:1166 udav/plot_pnl.cpp:384
+msgid "Add rect"
+msgstr ""
+
+#: widgets/qt.cpp:1169 udav/plot_pnl.cpp:387
+msgid "Add rectangle which properties can be changed later by mouse."
+msgstr ""
+
+#: widgets/qt.cpp:1171 udav/plot_pnl.cpp:390
+msgid "Add rhombus"
+msgstr ""
+
+#: widgets/qt.cpp:1174 udav/plot_pnl.cpp:393
+msgid "Add rhombus which properties can be changed later by mouse."
+msgstr ""
+
+#: widgets/qt.cpp:1191 udav/plot_pnl.cpp:414
+msgid "Add text"
+msgstr ""
+
+#: widgets/qt.cpp:1194 udav/plot_pnl.cpp:417
+msgid "Add text which properties can be changed later by mouse."
+msgstr ""
+
+#: src/exec_prm.cpp:611
+msgid "Add title for current subplot/inplot"
+msgstr ""
+
+#: mgllab/table.cpp:794
+msgid "Add to"
+msgstr ""
+
+#: src/exec_set.cpp:691
+msgid "Add user-defined symbol"
+msgstr ""
+
+#: widgets/fltk.cpp:852
+msgid "Adjust picture size to fill drawing area"
+msgstr ""
+
+#: widgets/fltk.cpp:815 widgets/qt.cpp:1139 udav/plot_pnl.cpp:337
+msgid "Adjust size"
+msgstr ""
+
+#: src/exec_set.cpp:692
+msgid "Adjust ticks for best view"
+msgstr ""
+
+#: udav/calc_dlg.cpp:193
+msgid "Airy and Gamma"
+msgstr ""
+
+#: udav/hint_dlg.cpp:42 mgllab/help.cpp:276
+msgid ""
+"All indexes (of data arrays, subplots and so on) are always start from 0."
+msgstr ""
+
+#. graphics menu
+#: widgets/qt.cpp:1098 udav/opt_dlg.cpp:51 udav/setup_dlg.cpp:109
+#: udav/plot_pnl.cpp:290 mgllab/dialogs.cpp:109
+msgid "Alpha"
+msgstr ""
+
+#: mgllab/dialogs.cpp:110
+msgid "Alpha value (transparency) of surface or cloud"
+msgstr ""
+
+#: udav/setup_dlg.cpp:93 mgllab/dialogs.cpp:1003
+msgid "AlphaDef"
+msgstr ""
+
+#: udav/opt_dlg.cpp:56 udav/setup_dlg.cpp:95 mgllab/dialogs.cpp:111
+#: mgllab/dialogs.cpp:1004
+msgid "Ambient"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:167
+msgid "Angle around x axis (in degrees)"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:171
+msgid "Angle around z axis (in degrees)"
+msgstr ""
+
+#. animation menu
+#: widgets/qt.cpp:1244 widgets/qt.cpp:1245 udav/plot_pnl.cpp:559
+#: mgllab/mathgl.cpp:183
+msgid "Animation"
+msgstr ""
+
+#: mgllab/table.cpp:786
+msgid "Another"
+msgstr ""
+
+#: mgllab/table.cpp:852
+msgid "Apply operator (smoothing, integration, difference ...) to data"
+msgstr ""
+
+#: mgllab/dialogs.cpp:103
+msgid "Approximate number of mesh lines in plot"
+msgstr ""
+
+#: mgllab/help.cpp:135
+msgid "Are you sure that you want to delete ALL data arrays?"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:67
+msgid "Argument"
+msgstr ""
+
+#: mgllab/dialogs.cpp:738
+msgid "Arguments"
+msgstr ""
+
+#: udav/style_dlg.cpp:63 mgllab/dialogs.cpp:321
+msgid "Arrow at end"
+msgstr ""
+
+#. g->setColStretch(0, 1);     g->setColStretch(1, 1); g->setColStretch(2, 1);
+#: udav/style_dlg.cpp:61 mgllab/dialogs.cpp:315
+msgid "Arrow at start"
+msgstr ""
+
+#: widgets/qt.cpp:1137
+msgid "Ask to stop plot drawing (F7)."
+msgstr ""
+
+#: udav/subplot_dlg.cpp:175
+msgid "Aspect"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:178
+msgid "Aspect ratio of x-scale to z-scale"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:182
+msgid "Aspect ratio of y-scale to z-scale"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1298
+msgid "Aspect x/z"
+msgstr ""
+
+#: src/exec_set.cpp:698
+msgid "Attach light settings to inplot"
+msgstr ""
+
+#: udav/open_dlg.cpp:60
+msgid "Auto detect data sizes"
+msgstr ""
+
+#: udav/open_dlg.cpp:177
+msgid "Auto detect data sizes (%1 x %2 x %3)"
+msgstr ""
+
+#: udav/prop_dlg.cpp:100
+msgid "AutoKey"
+msgstr ""
+
+#: udav/prop_dlg.cpp:159
+msgid "Automatically execute script after loading"
+msgstr ""
+
+#: udav/prop_dlg.cpp:165
+msgid "Automatically save before redrawing (F5)"
+msgstr ""
+
+#: src/data.cpp:1425
+#, c-format
+msgid ""
+"Averages are:\n"
+"<a> = %g\t<x> = %g\t<y> = %g\t<z> = %g\n"
+msgstr ""
+
+#: udav/style_dlg.cpp:122 mgllab/dialogs.cpp:340
+msgid "Axial direction"
+msgstr ""
+
+#: udav/setup_dlg.cpp:101
+msgid "AxialDir"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1008
+msgid "Axis"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:176 mgllab/dialogs.cpp:717
+msgid "Axis and colorbar"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:177 mgllab/dialogs.cpp:718 mgllab/dialogs.cpp:949
+msgid "Axis setup"
+msgstr ""
+
+#. W
+#: udav/style_dlg.cpp:237 mgllab/dialogs.cpp:45
+msgid "B - navy"
+msgstr ""
+
+#: udav/help_pnl.cpp:48
+msgid "Backward"
+msgstr ""
+
+#: src/font.cpp:948
+#, c-format
+msgid "Bad '%ls' at %zu\n"
+msgstr ""
+
+#: src/parser.cpp:766
+#, c-format
+msgid "Bad arguments for %ls: %ld instead of %d\n"
+msgstr ""
+
+#: udav/setup_dlg.cpp:97
+msgid "BaseWidth"
+msgstr ""
+
+#: udav/calc_dlg.cpp:192
+msgid "Basic"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1461
+msgid "Begin"
+msgstr ""
+
+#: udav/calc_dlg.cpp:193
+msgid "Bessel"
+msgstr ""
+
+#: udav/style_dlg.cpp:157 mgllab/dialogs.cpp:368
+msgid "Bold style"
+msgstr ""
+
+#: udav/opt_dlg.cpp:115
+msgid "Both fields in crange must be filled"
+msgstr ""
+
+#: udav/opt_dlg.cpp:94
+msgid "Both fields in xrange must be filled"
+msgstr ""
+
+#: udav/opt_dlg.cpp:101
+msgid "Both fields in yrange must be filled"
+msgstr ""
+
+#: udav/opt_dlg.cpp:108
+msgid "Both fields in zrange must be filled"
+msgstr ""
+
+#: src/parser.cpp:1423
+msgid "Break for-loop"
+msgstr ""
+
+#: udav/setup_dlg.cpp:122 mgllab/dialogs.cpp:1069
+msgid "Brightness"
+msgstr ""
+
+#: mgllab/dialogs.cpp:401
+msgid "Brightness of i-th color"
+msgstr ""
+
+#: mgllab/table.cpp:766
+msgid "By formula"
+msgstr ""
+
+#. R
+#: udav/style_dlg.cpp:240 mgllab/dialogs.cpp:48
+msgid "C - teal"
+msgstr ""
+
+#: udav/setup_dlg.cpp:51 mgllab/dialogs.cpp:989
+msgid "C axis"
+msgstr ""
+
+#: udav/opt_dlg.cpp:47 mgllab/dialogs.cpp:97
+msgid "C-range"
+msgstr ""
+
+#: widgets/qt.cpp:1263
+msgid "Calculations"
+msgstr ""
+
+#. TODO
+#. connect(hidden,SIGNAL(cursorPositionChanged()),this,SLOT(hiddenClicked()));
+#: udav/udav_wnd.cpp:194 udav/udav_wnd.cpp:206 mgllab/mgllab.cpp:324
+#: mgllab/mgllab.cpp:554
+msgid "Calculator"
+msgstr ""
+
+#: udav/anim_dlg.cpp:67 udav/prop_dlg.cpp:180 udav/args_dlg.cpp:63
+#: udav/newcmd_dlg.cpp:78 udav/open_dlg.cpp:90 udav/dat_pnl.cpp:460
+#: udav/dat_pnl.cpp:510 udav/dat_pnl.cpp:552 udav/dat_pnl.cpp:629
+#: udav/opt_dlg.cpp:78 udav/setup_dlg.cpp:145 udav/files_dlg.cpp:58
+#: udav/style_dlg.cpp:206 udav/data_dlg.cpp:90 udav/subplot_dlg.cpp:219
+#: mgllab/editor.cpp:282 mgllab/mathgl.cpp:164 mgllab/mathgl.cpp:195
+#: mgllab/dialogs.cpp:120 mgllab/dialogs.cpp:164 mgllab/dialogs.cpp:410
+#: mgllab/dialogs.cpp:584 mgllab/dialogs.cpp:749 mgllab/dialogs.cpp:1071
+#: mgllab/dialogs.cpp:1318 mgllab/dialogs.cpp:1473 mgllab/mgllab.cpp:479
+#: mgllab/table.cpp:101 mgllab/table.cpp:179 mgllab/table.cpp:353
+#: mgllab/table.cpp:556 mgllab/table.cpp:619 mgllab/table.cpp:674
+msgid "Cancel"
+msgstr ""
+
+#: src/crust.cpp:557
+msgid "Cannot triangulate this set!"
+msgstr ""
+
+#: udav/udav_wnd.cpp:226 mgllab/mgllab.cpp:353 mgllab/mgllab.cpp:354
+msgid "Canvas"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:59 udav/subplot_dlg.cpp:101 udav/subplot_dlg.cpp:118
+#: udav/subplot_dlg.cpp:135
+msgid "Cell index"
+msgstr ""
+
+#: mgllab/table.cpp:103 mgllab/table.cpp:558 mgllab/table.cpp:770
+msgid "Change"
+msgstr ""
+
+#: mgllab/table.cpp:104
+msgid "Change (resize) data"
+msgstr ""
+
+#: widgets/qt.cpp:1141 udav/plot_pnl.cpp:339
+msgid "Change canvas size to fill whole region (F6)."
+msgstr ""
+
+#: src/exec_set.cpp:702
+msgid "Change current directory"
+msgstr ""
+
+#: mgllab/table.cpp:168
+msgid "Change data"
+msgstr ""
+
+#: mgllab/table.cpp:91
+msgid "Change data sizes"
+msgstr ""
+
+#: mgllab/table.cpp:559 mgllab/table.cpp:622 mgllab/table.cpp:677
+msgid "Change data values and close this window"
+msgstr ""
+
+#: udav/prop_dlg.cpp:71
+msgid "Change font"
+msgstr ""
+
+#: src/exec_set.cpp:751
+msgid "Change view angles - use 'rotate' for plot rotation"
+msgstr ""
+
+#: udav/calc_dlg.cpp:68
+msgid "Clear"
+msgstr ""
+
+#: udav/text_pnl.cpp:527
+msgid "Clear all"
+msgstr ""
+
+#: src/exec_set.cpp:703
+msgid "Clear legend entries"
+msgstr ""
+
+#: src/exec_set.cpp:704
+msgid "Clear picture"
+msgstr ""
+
+#. o = new Fl_Button(180, 130, 25, 25);o->image(img_save);     o->tooltip("img_save");
+#: widgets/qt.cpp:1091 udav/find_dlg.cpp:52 udav/hint_dlg.cpp:70
+#: mgllab/editor.cpp:565 mgllab/help.cpp:308 mgllab/help.cpp:368
+#: mgllab/help.cpp:484
+msgid "Close"
+msgstr ""
+
+#: udav/dat_pnl.cpp:833
+msgid "Close tab"
+msgstr ""
+
+#: udav/dat_pnl.cpp:835
+msgid "Close this data tab."
+msgstr ""
+
+#: udav/setup_dlg.cpp:121 udav/style_dlg.cpp:67 mgllab/dialogs.cpp:1068
+#: mgllab/dialogs.cpp:1459
+msgid "Color"
+msgstr ""
+
+#. g->setColStretch(0, 1);                     g->setColStretch(1, 1);
+#: udav/style_dlg.cpp:106
+msgid "Color order"
+msgstr ""
+
+#: udav/style_dlg.cpp:150 mgllab/dialogs.cpp:339
+msgid "Color scheme"
+msgstr ""
+
+#: mgllab/dialogs.cpp:384
+msgid "Color(s) or color scheme"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1002
+msgid "Colors"
+msgstr ""
+
+#: mgllab/table.cpp:879
+msgid ""
+"Colors denote values: magenta - local max, cyan - local min,\n"
+"\tred - Re(v)>0, blue - Re(v)<0, purple - Im(v)>0, teal - Im(v)<0."
+msgstr ""
+
+#: mgllab/dialogs.cpp:577
+msgid "Column expr"
+msgstr ""
+
+#: mgllab/dialogs.cpp:724 mgllab/mgllab.cpp:303
+msgid "Command"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:64 mgllab/dialogs.cpp:740
+msgid ""
+"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\n"
+"for default values."
+msgstr ""
+
+#: udav/text_pnl.cpp:575
+msgid "Command options"
+msgstr ""
+
+#: udav/prop_dlg.cpp:82
+msgid "Comments"
+msgstr ""
+
+#: src/exec_prm.cpp:599
+msgid "Computes the attractor of an IFS"
+msgstr ""
+
+#: src/exec_prm.cpp:600
+msgid "Computes the attractor of an IFS for 3d case"
+msgstr ""
+
+#: src/exec_prm.cpp:601
+msgid "Computes the attractor of an IFS with parameters from *.ifs file"
+msgstr ""
+
+#: src/exec_prm.cpp:595
+msgid "Computes the flame fractal"
+msgstr ""
+
+#: src/parser.cpp:1431 src/parser.cpp:1435
+msgid "Conditional operator"
+msgstr ""
+
+#: udav/plot_pnl.cpp:358
+msgid "Copy click coor."
+msgstr ""
+
+#: udav/plot_pnl.cpp:360
+msgid "Copy coordinates of last mouse click to clipboard."
+msgstr ""
+
+#: udav/dat_pnl.cpp:707
+msgid "Copy data"
+msgstr ""
+
+#: src/exec_dat.cpp:1528
+msgid "Copy data from another variable"
+msgstr ""
+
+#: widgets/fltk.cpp:812
+msgid "Copy graphics"
+msgstr ""
+
+#: widgets/qt.cpp:1145 udav/plot_pnl.cpp:354
+msgid "Copy graphics to clipboard (Ctrl+Shift+G)."
+msgstr ""
+
+#: widgets/fltk.cpp:856
+msgid "Copy image to clipboard"
+msgstr ""
+
+#: widgets/qt.cpp:1143 udav/plot_pnl.cpp:352
+msgid "Copy plot"
+msgstr ""
+
+#: udav/dat_pnl.cpp:709
+msgid "Copy range of numbers to clipboard (Ctrl+Shift+C)."
+msgstr ""
+
+#: udav/text_pnl.cpp:535
+msgid "Copy selected text or data to clipboard (Ctrl+C)."
+msgstr ""
+
+#: mgllab/editor.cpp:511
+msgid "Copy selection to clipboard"
+msgstr ""
+
+#: udav/text_pnl.cpp:533 mgllab/mgllab.cpp:293
+msgid "Copy text"
+msgstr ""
+
+#: mgllab/table.cpp:778
+msgid "Cos FFT"
+msgstr ""
+
+#: udav/dat_pnl.cpp:621
+msgid "Cos-Fourier transform along direction(s)"
+msgstr ""
+
+#: src/exec_dat.cpp:1530
+msgid "Cos-Fourier transform at some direction"
+msgstr ""
+
+#: mgllab/table.cpp:165
+msgid "Cosine FFT"
+msgstr ""
+
+#: udav/text_pnl.cpp:365 udav/text_pnl.cpp:482
+msgid "Could not write to %1"
+msgstr ""
+
+#: udav/setup_dlg.cpp:159
+msgid "Could not write to file"
+msgstr ""
+
+#: udav/udav_wnd.cpp:570
+msgid "Couldn't change to folder "
+msgstr ""
+
+#: udav/text_pnl.cpp:431
+msgid "Couldn't open file "
+msgstr ""
+
+#: mgllab/dialogs.cpp:1190
+#, c-format
+msgid "Couldn't open file %s"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:173
+msgid "Create data and I/O"
+msgstr ""
+
+#: mgllab/dialogs.cpp:714
+msgid "Create data and IO"
+msgstr ""
+
+#: src/exec_dat.cpp:1555
+msgid "Create histogram (distribution) of data values"
+msgstr ""
+
+#: udav/dat_pnl.cpp:766 mgllab/table.cpp:758
+msgid "Create new"
+msgstr ""
+
+#: src/exec_dat.cpp:1614
+msgid "Create new 1D data and fill it in range"
+msgstr ""
+
+#: src/exec_dat.cpp:1570
+msgid "Create new data"
+msgstr ""
+
+#: udav/mem_pnl.cpp:58
+msgid "Create new data array"
+msgstr ""
+
+#: mgllab/table.cpp:836
+msgid "Create new data with zero filling"
+msgstr ""
+
+#: udav/udav_wnd.cpp:284
+msgid "Create new empty script window (Ctrl+N)."
+msgstr ""
+
+#: src/parser.cpp:1436
+msgid "Creates new variable from list of numbers or data"
+msgstr ""
+
+#: udav/dat_pnl.cpp:784 mgllab/table.cpp:761
+msgid "Crop"
+msgstr ""
+
+#: mgllab/table.cpp:858
+msgid "Crop (cut off edges) data"
+msgstr ""
+
+#: mgllab/table.cpp:607
+msgid "Crop data"
+msgstr ""
+
+#: src/exec_dat.cpp:1531
+msgid "Crop edge of data"
+msgstr ""
+
+#: udav/dat_pnl.cpp:786
+msgid "Crop the data edges. Useful to cut off the zero-filled area."
+msgstr ""
+
+#: mgllab/table.cpp:163 mgllab/table.cpp:772
+msgid "CumSum"
+msgstr ""
+
+#: src/exec_dat.cpp:1532
+msgid "Cumulative summation along direction(s)"
+msgstr ""
+
+#: udav/prop_dlg.cpp:106
+msgid "CurrLine"
+msgstr ""
+
+#: udav/prop_dlg.cpp:68
+msgid "Current font"
+msgstr ""
+
+#: udav/text_pnl.cpp:530
+msgid "Cut selected text to clipboard (Ctrl+X)."
+msgstr ""
+
+#: udav/text_pnl.cpp:528 mgllab/mgllab.cpp:292
+msgid "Cut text"
+msgstr ""
+
+#: udav/opt_dlg.cpp:61 mgllab/dialogs.cpp:106
+msgid "Cutting"
+msgstr ""
+
+#: mgllab/help.cpp:251 mgllab/table.cpp:428 mgllab/table.cpp:457
+msgid ""
+"DAT Files \t*.{dat,csv}\n"
+"HDF Files \t*.{h5,hdf}"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1465
+msgid "Dash"
+msgstr ""
+
+#: udav/style_dlg.cpp:62 mgllab/dialogs.cpp:318
+msgid "Dashing"
+msgstr ""
+
+#: udav/dat_pnl.cpp:66
+msgid "Data"
+msgstr ""
+
+#: udav/dat_pnl.cpp:249 udav/dat_pnl.cpp:271
+msgid ""
+"Data files (*.dat)\n"
+"HDF5 files (*.h5 *.hdf)\n"
+"PNG files (*.png)\n"
+"All files (*.*)"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:175 mgllab/dialogs.cpp:716
+msgid "Data handling"
+msgstr ""
+
+#: mgllab/help.cpp:163 mgllab/table.cpp:849
+msgid "Data information and preview."
+msgstr ""
+
+#: udav/open_dlg.cpp:56 udav/data_dlg.cpp:42 mgllab/dialogs.cpp:566
+msgid "Data name"
+msgstr ""
+
+#: udav/info_dlg.cpp:42
+msgid "Data preview"
+msgstr ""
+
+#: udav/info_dlg.cpp:43
+msgid "Data preview for current slice."
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:174 mgllab/dialogs.cpp:715
+msgid "Data transform"
+msgstr ""
+
+#: udav/plot_pnl.cpp:556
+msgid "Decrease \\phi angle by 10 degrees."
+msgstr ""
+
+#: udav/plot_pnl.cpp:548
+msgid "Decrease \\theta angle by 10 degrees."
+msgstr ""
+
+#: mgllab/help.cpp:105
+msgid "Decrease font size"
+msgstr ""
+
+#: src/parser.cpp:1427
+msgid "Define constant or parameter"
+msgstr ""
+
+#: src/parser.cpp:1426
+msgid "Define parameter as character"
+msgstr ""
+
+#: src/parser.cpp:1428
+msgid "Define parameter as numerical value"
+msgstr ""
+
+#: src/parser.cpp:1422
+msgid "Define parameter from user input"
+msgstr ""
+
+#: udav/anim_dlg.cpp:76
+msgid "Delay (in ms)"
+msgstr ""
+
+#: mgllab/mathgl.cpp:202
+msgid "Delay (in sec)"
+msgstr ""
+
+#: mgllab/help.cpp:178
+msgid "Delete @b all@. data arrays."
+msgstr ""
+
+#: udav/mem_pnl.cpp:64
+msgid "Delete ALL data arrays"
+msgstr ""
+
+#: src/exec_dat.cpp:1535
+msgid "Delete data or slice of data"
+msgstr ""
+
+#: udav/plot_pnl.cpp:426
+msgid "Delete selected"
+msgstr ""
+
+#: udav/mem_pnl.cpp:60
+msgid "Delete selected data array"
+msgstr ""
+
+#: mgllab/help.cpp:166
+msgid "Delete selected data."
+msgstr ""
+
+#: udav/plot_pnl.cpp:428
+msgid "Delete selected plot."
+msgstr ""
+
+#: mgllab/dialogs.cpp:734
+msgid "Description"
+msgstr ""
+
+#: src/exec_dat.cpp:1536
+msgid "Detect curves for maximums of data array"
+msgstr ""
+
+#: mgllab/table.cpp:164 mgllab/table.cpp:774
+msgid "Difference"
+msgstr ""
+
+#: udav/dat_pnl.cpp:616
+msgid "Differentiate data along direction(s)"
+msgstr ""
+
+#: udav/opt_dlg.cpp:58 mgllab/dialogs.cpp:113 mgllab/dialogs.cpp:1005
+msgid "Diffuse"
+msgstr ""
+
+#: src/exec_dat.cpp:1540
+msgid "Dilate data larger val"
+msgstr ""
+
+#: src/exec_dat.cpp:1527
+msgid "Direct multiplication of arrays"
+msgstr ""
+
+#: udav/dat_pnl.cpp:351 udav/dat_pnl.cpp:377 udav/dat_pnl.cpp:424
+#: mgllab/dialogs.cpp:161 mgllab/table.cpp:549
+msgid "Direction"
+msgstr ""
+
+#: mgllab/table.cpp:551
+msgid "Direction along which data will be filled"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:105 udav/subplot_dlg.cpp:122
+msgid "Distance between cells"
+msgstr ""
+
+#: mgllab/table.cpp:797
+msgid "Divide by"
+msgstr ""
+
+#: src/exec_dat.cpp:1541
+msgid "Divide by data or number"
+msgstr ""
+
+#: mgllab/table.cpp:180 mgllab/table.cpp:354 mgllab/table.cpp:676
+msgid "Do"
+msgstr ""
+
+#: src/exec_dat.cpp:1603
+msgid "Do STFA transform"
+msgstr ""
+
+#: src/exec_dat.cpp:1609 src/exec_dat.cpp:1610
+msgid "Do integral transform of data"
+msgstr ""
+
+#: mgllab/table.cpp:102 mgllab/table.cpp:557 mgllab/table.cpp:620
+#: mgllab/table.cpp:675
+msgid "Do nothing and close this window"
+msgstr ""
+
+#: udav/mem_pnl.cpp:122
+msgid "Do you want to delete all data?"
+msgstr ""
+
+#: udav/udav_wnd.cpp:341 udav/udav_wnd.cpp:580 udav/udav_wnd.cpp:622
+msgid "Do you want to save the changes to the document?"
+msgstr ""
+
+#: mgllab/editor.cpp:282
+msgid "Don't Save"
+msgstr ""
+
+#: mgllab/table.cpp:164
+msgid "Double diff."
+msgstr ""
+
+#: src/exec_gr.cpp:1032
+msgid "Draw Bifurcation diagram"
+msgstr ""
+
+#: src/exec_gr.cpp:1067
+msgid "Draw Iris plots"
+msgstr ""
+
+#: src/exec_gr.cpp:1069
+msgid "Draw Lamerey diagram"
+msgstr ""
+
+#: src/exec_gr.cpp:1073
+msgid "Draw Open-High-Low-Close (OHLC) diagram"
+msgstr ""
+
+#: src/exec_gr.cpp:1076
+msgid "Draw Poincare map"
+msgstr ""
+
+#: src/exec_gr.cpp:1082
+msgid "Draw STFA diagram"
+msgstr ""
+
+#: src/exec_gr.cpp:1094
+msgid "Draw TeX mark at point position"
+msgstr ""
+
+#: src/exec_prm.cpp:578
+msgid "Draw angle arc"
+msgstr ""
+
+#: src/exec_gr.cpp:1026
+msgid "Draw area plot for 1D data"
+msgstr ""
+
+#: src/exec_gr.cpp:1029
+msgid "Draw bars for 1D data"
+msgstr ""
+
+#: src/exec_gr.cpp:1031
+msgid "Draw belts"
+msgstr ""
+
+#: src/exec_gr.cpp:1092
+msgid "Draw binormales for 1D data"
+msgstr ""
+
+#: src/exec_prm.cpp:604
+msgid "Draw bitmap (logo) along axis range"
+msgstr ""
+
+#: src/exec_prm.cpp:582
+msgid "Draw bounding box"
+msgstr ""
+
+#: src/exec_gr.cpp:1034
+msgid "Draw boxes"
+msgstr ""
+
+#: src/exec_gr.cpp:1033
+msgid "Draw boxplot for 2D data"
+msgstr ""
+
+#: src/exec_gr.cpp:1035
+msgid "Draw candlestick chart"
+msgstr ""
+
+#: src/exec_gr.cpp:1036
+msgid "Draw chart"
+msgstr ""
+
+#: src/exec_prm.cpp:583
+msgid "Draw circle"
+msgstr ""
+
+#: src/exec_gr.cpp:1037
+msgid "Draw cloud"
+msgstr ""
+
+#: src/exec_prm.cpp:584
+msgid "Draw colorbar"
+msgstr ""
+
+#: src/exec_prm.cpp:585
+msgid "Draw cone"
+msgstr ""
+
+#: src/exec_gr.cpp:1038
+msgid "Draw cones for 1D data"
+msgstr ""
+
+#: src/exec_gr.cpp:1039
+msgid "Draw contour lines"
+msgstr ""
+
+#: src/exec_gr.cpp:1049
+msgid "Draw contour lines at x-slice (or x-plane)"
+msgstr ""
+
+#: src/exec_gr.cpp:1050
+msgid "Draw contour lines at y-slice (or y-plane)"
+msgstr ""
+
+#: src/exec_gr.cpp:1051
+msgid "Draw contour lines at z-slice (or z-plane)"
+msgstr ""
+
+#: src/exec_gr.cpp:1040
+msgid "Draw contour lines for 3D data"
+msgstr ""
+
+#: src/exec_gr.cpp:1099
+msgid "Draw contour lines for surface of triangles"
+msgstr ""
+
+#: src/exec_gr.cpp:1047
+msgid "Draw contour lines on parametric surface"
+msgstr ""
+
+#: src/exec_gr.cpp:1048
+msgid "Draw contour tubes"
+msgstr ""
+
+#: src/exec_gr.cpp:1100
+msgid "Draw contour tubes for surface of triangles"
+msgstr ""
+
+#: src/exec_prm.cpp:586
+msgid "Draw curve"
+msgstr ""
+
+#: src/exec_gr.cpp:1102
+msgid "Draw curve by tube"
+msgstr ""
+
+#: src/exec_gr.cpp:1053
+msgid "Draw density plot"
+msgstr ""
+
+#: src/exec_gr.cpp:1054
+msgid "Draw density plot at slices of 3D data"
+msgstr ""
+
+#: src/exec_gr.cpp:1055
+msgid "Draw density plot at x-slice (or x-plane)"
+msgstr ""
+
+#: src/exec_gr.cpp:1056
+msgid "Draw density plot at y-slice (or y-plane)"
+msgstr ""
+
+#: src/exec_gr.cpp:1057
+msgid "Draw density plot at z-slice (or z-plane)"
+msgstr ""
+
+#: src/exec_gr.cpp:1058
+msgid "Draw dew plot"
+msgstr ""
+
+#: src/exec_gr.cpp:1059
+msgid "Draw dots for arbitrary data points"
+msgstr ""
+
+#: src/exec_prm.cpp:587
+msgid "Draw drop"
+msgstr ""
+
+#: src/exec_prm.cpp:588
+msgid "Draw ellipse"
+msgstr ""
+
+#: src/exec_prm.cpp:589
+msgid "Draw error box"
+msgstr ""
+
+#: src/exec_gr.cpp:1060
+msgid "Draw error boxes"
+msgstr ""
+
+#: src/exec_prm.cpp:590
+msgid "Draw face (quadrangle)"
+msgstr ""
+
+#: src/exec_prm.cpp:591
+msgid "Draw face perpendicular to x-axis"
+msgstr ""
+
+#: src/exec_prm.cpp:592
+msgid "Draw face perpendicular to y-axis"
+msgstr ""
+
+#: src/exec_prm.cpp:593
+msgid "Draw face perpendicular to z-axis"
+msgstr ""
+
+#: src/exec_gr.cpp:1079
+msgid "Draw filled region (ribbon) between 2 curves"
+msgstr ""
+
+#: src/exec_gr.cpp:1074
+msgid "Draw flow pipes for vector field"
+msgstr ""
+
+#: src/exec_gr.cpp:1062
+msgid "Draw flow threads for vector field"
+msgstr ""
+
+#: src/exec_gr.cpp:1064
+msgid "Draw gradient lines for scalar field"
+msgstr ""
+
+#: src/exec_prm.cpp:598
+msgid "Draw grid"
+msgstr ""
+
+#: src/exec_gr.cpp:1066
+msgid "Draw grid at slices of 3D data"
+msgstr ""
+
+#: src/exec_gr.cpp:1065
+msgid "Draw grid for data array(s)"
+msgstr ""
+
+#: src/exec_gr.cpp:1028
+msgid "Draw horizontal bars for 1D data"
+msgstr ""
+
+#: src/exec_gr.cpp:1095
+msgid "Draw horizontal tiles"
+msgstr ""
+
+#: src/exec_gr.cpp:1096
+msgid "Draw horizontal tiles with variable size"
+msgstr ""
+
+#: src/exec_gr.cpp:1084
+msgid "Draw isosurface for 3D data"
+msgstr ""
+
+#: src/exec_gr.cpp:1087
+msgid "Draw isosurface for 3D data colored and transpared by other data"
+msgstr ""
+
+#: src/exec_gr.cpp:1086
+msgid "Draw isosurface for 3D data colored by other data"
+msgstr ""
+
+#: src/exec_gr.cpp:1085
+msgid "Draw isosurface for 3D data transpared by other data"
+msgstr ""
+
+#: src/exec_gr.cpp:1068
+msgid "Draw label at arbitrary position"
+msgstr ""
+
+#: src/exec_prm.cpp:612
+msgid "Draw label for t-axis"
+msgstr ""
+
+#: src/exec_prm.cpp:613
+msgid "Draw label for x-axis"
+msgstr ""
+
+#: src/exec_prm.cpp:614
+msgid "Draw label for y-axis"
+msgstr ""
+
+#: src/exec_prm.cpp:615
+msgid "Draw label for z-axis"
+msgstr ""
+
+#: src/exec_prm.cpp:602
+msgid "Draw legend"
+msgstr ""
+
+#: src/exec_prm.cpp:603
+msgid "Draw line"
+msgstr ""
+
+#: src/exec_gr.cpp:1070
+msgid "Draw mapping plot"
+msgstr ""
+
+#: src/exec_gr.cpp:1071
+msgid "Draw mark plot for 1D data"
+msgstr ""
+
+#: src/exec_gr.cpp:1072
+msgid "Draw mesh surface"
+msgstr ""
+
+#: src/exec_prm.cpp:581
+msgid "Draw point (ball)"
+msgstr ""
+
+#: src/exec_prm.cpp:605
+msgid "Draw polygon"
+msgstr ""
+
+#: src/exec_gr.cpp:1030
+msgid "Draw quasi-optical beam"
+msgstr ""
+
+#: src/exec_gr.cpp:1078
+msgid "Draw radar chart"
+msgstr ""
+
+#: src/exec_gr.cpp:1052
+msgid "Draw reconstructed surface for arbitrary data points"
+msgstr ""
+
+#: src/exec_prm.cpp:606
+msgid "Draw rectangle"
+msgstr ""
+
+#: src/exec_prm.cpp:607
+msgid "Draw rhombus"
+msgstr ""
+
+#: src/exec_gr.cpp:1044
+msgid "Draw solid contour lines at x-slice (or x-plane)"
+msgstr ""
+
+#: src/exec_gr.cpp:1045
+msgid "Draw solid contour lines at y-slice (or y-plane)"
+msgstr ""
+
+#: src/exec_gr.cpp:1046
+msgid "Draw solid contour lines at z-slice (or z-plane)"
+msgstr ""
+
+#: src/exec_gr.cpp:1043
+msgid "Draw solid contour lines for 3D data"
+msgstr ""
+
+#: src/exec_gr.cpp:1042
+msgid "Draw solid contours"
+msgstr ""
+
+#: src/exec_gr.cpp:1041
+msgid "Draw solid contours with manual colors"
+msgstr ""
+
+#: src/exec_gr.cpp:1083
+msgid "Draw solid surface"
+msgstr ""
+
+#: src/exec_gr.cpp:1090
+msgid "Draw solid surface colored and transpared by other data"
+msgstr ""
+
+#: src/exec_gr.cpp:1089
+msgid "Draw solid surface colored by other data"
+msgstr ""
+
+#: src/exec_gr.cpp:1088
+msgid "Draw solid surface transpared by other data"
+msgstr ""
+
+#: src/exec_prm.cpp:608
+msgid "Draw sphere"
+msgstr ""
+
+#: src/exec_gr.cpp:1080
+msgid "Draw stem plot for 1D data"
+msgstr ""
+
+#: src/exec_gr.cpp:1081
+msgid "Draw step plot for 1D data"
+msgstr ""
+
+#: src/exec_gr.cpp:1097
+msgid "Draw surface of curve rotation"
+msgstr ""
+
+#: src/exec_gr.cpp:1077
+msgid "Draw surface of quadrangles"
+msgstr ""
+
+#: src/exec_gr.cpp:1101
+msgid "Draw surface of triangles"
+msgstr ""
+
+#: src/exec_gr.cpp:1027
+msgid "Draw surfaces of contour lines rotation"
+msgstr ""
+
+#: src/exec_gr.cpp:1091
+msgid "Draw table with data values"
+msgstr ""
+
+#: src/exec_gr.cpp:1093
+msgid "Draw tension plot for 1D data"
+msgstr ""
+
+#: src/exec_prm.cpp:610
+msgid "Draw text at some position or along curve"
+msgstr ""
+
+#: src/exec_prm.cpp:609
+msgid "Draw user-defined symbol at given position and direction"
+msgstr ""
+
+#: src/exec_gr.cpp:1075
+msgid "Draw usual plot for 1D data"
+msgstr ""
+
+#: src/exec_gr.cpp:1103
+msgid "Draw vector field"
+msgstr ""
+
+#: src/exec_gr.cpp:1104
+msgid "Draw vector field at slices of 3D data"
+msgstr ""
+
+#: src/exec_gr.cpp:1098
+msgid "Draw vectors along a curve"
+msgstr ""
+
+#: src/exec_gr.cpp:1061
+msgid "Draw waterfalls"
+msgstr ""
+
+#: udav/plot_pnl.cpp:111 udav/plot_pnl.cpp:130
+msgid "Drawing time %1 ms"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:169 mgllab/dialogs.cpp:710
+msgid "Dual plots"
+msgstr ""
+
+#. L
+#: udav/style_dlg.cpp:244 mgllab/dialogs.cpp:52
+msgid "E - darklawn"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1469
+msgid "Edges"
+msgstr ""
+
+#: udav/text_pnl.cpp:84 mgllab/mgllab.cpp:290
+msgid "Edit"
+msgstr ""
+
+#: udav/mem_pnl.cpp:59
+msgid "Edit selected data array"
+msgstr ""
+
+#: udav/calc_dlg.cpp:193
+msgid "Elliptic"
+msgstr ""
+
+#: udav/prop_dlg.cpp:171 mgllab/mgllab.cpp:471
+msgid "Enable keywords completion"
+msgstr ""
+
+#. pure = new QCheckBox(_("Disable face drawing (faster) for mouse rotation/shift/zoom."), this);
+#. pure->setChecked(mglAutoPure);      v->addWidget(pure);     pure->setEnabled(false);
+#: udav/prop_dlg.cpp:169 mgllab/mgllab.cpp:473
+msgid "Enable mouse wheel for zooming"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1463
+msgid "End"
+msgstr ""
+
+#: udav/prop_dlg.cpp:141
+msgid "English"
+msgstr ""
+
+#. TODO show dialog for color scheme
+#: udav/dat_pnl.cpp:255 udav/dat_pnl.cpp:277 mgllab/table.cpp:477
+#: mgllab/table.cpp:490
+msgid "Enter color scheme"
+msgstr ""
+
+#: udav/dat_pnl.cpp:261 udav/dat_pnl.cpp:283
+msgid "Enter data name"
+msgstr ""
+
+#: mgllab/table.cpp:523
+msgid ""
+"Enter formula for data modification\n"
+"Here x, y, z in range [0,1], u is data value"
+msgstr ""
+
+#: udav/mem_pnl.cpp:85 mgllab/help.cpp:242
+msgid "Enter name for new variable"
+msgstr ""
+
+#. this is HDF file
+#. TODO add dialog with choice of HDF names
+#: mgllab/table.cpp:436
+msgid "Enter name of data"
+msgstr ""
+
+#: udav/dat_pnl.cpp:388 udav/dat_pnl.cpp:402 udav/dat_pnl.cpp:436
+msgid "Enter new data sizes"
+msgstr ""
+
+#: mgllab/table.cpp:28
+msgid "Enter number for addition to data values"
+msgstr ""
+
+#: mgllab/table.cpp:58
+msgid "Enter number for division of data values"
+msgstr ""
+
+#: mgllab/table.cpp:48
+msgid "Enter number for multiplication of data values"
+msgstr ""
+
+#: mgllab/table.cpp:38
+msgid "Enter number for subtraction from data values"
+msgstr ""
+
+#: widgets/qt.cpp:936
+msgid "Enter number of vertexes"
+msgstr ""
+
+#: udav/dat_pnl.cpp:351
+msgid "Enter range for data and direction of filling"
+msgstr ""
+
+#: udav/dat_pnl.cpp:366 udav/dat_pnl.cpp:377
+msgid "Enter range for final data"
+msgstr ""
+
+#: udav/dat_pnl.cpp:424
+msgid "Enter range of saved date."
+msgstr ""
+
+#: udav/dat_pnl.cpp:485
+msgid "Enter slice id:"
+msgstr ""
+
+#: udav/dat_pnl.cpp:413
+msgid ""
+"Enter step of saved points. For example, '1' save all, '2' save each 2nd "
+"point, '3' save each 3d and so on."
+msgstr ""
+
+#: widgets/qt.cpp:945
+msgid "Enter text"
+msgstr ""
+
+#: mgllab/dialogs.cpp:860 mgllab/dialogs.cpp:866
+#, c-format
+msgid "Enter value for %s argument"
+msgstr ""
+
+#: mgllab/table.cpp:166 mgllab/table.cpp:784
+msgid "Envelop"
+msgstr ""
+
+#: src/exec_dat.cpp:1544
+msgid "Erode data larger val"
+msgstr ""
+
+#: mgllab/editor.cpp:348
+#, c-format
+msgid ""
+"Error reading from file '%s':\n"
+"%s."
+msgstr ""
+
+#: src/export.cpp:623 src/export.cpp:632 src/export.cpp:639
+#, c-format
+msgid "Error to call external viewer\n"
+msgstr ""
+
+#: mgllab/editor.cpp:359
+#, c-format
+msgid ""
+"Error writing to file '%s':\n"
+"%s."
+msgstr ""
+
+#: src/exec_dat.cpp:1545
+msgid ""
+"Evaluate (interpolate) values of array Dat at points i=idat,j=jdat,k=kdat"
+msgstr ""
+
+#. {"defpal",_("Define parameter as palette color"),"defpal $N val", 0, 6},
+#: src/parser.cpp:1430
+msgid "Execute if condition is false"
+msgstr ""
+
+#: mgllab/mgllab.cpp:469
+msgid "Execute script after loading"
+msgstr ""
+
+#: widgets/qt.cpp:1132 udav/plot_pnl.cpp:333
+msgid "Execute script and redraw graphics (F5)."
+msgstr ""
+
+#: src/parser.cpp:1424
+msgid "Execute script in external file"
+msgstr ""
+
+#: mgllab/help.cpp:146
+msgid "Existed data arrays"
+msgstr ""
+
+#: mgllab/mgllab.cpp:288
+msgid "Exit"
+msgstr ""
+
+#: udav/calc_dlg.cpp:192
+msgid "Exp and log"
+msgstr ""
+
+#: udav/calc_dlg.cpp:194
+msgid "Exp-integrals"
+msgstr ""
+
+#: mgllab/table.cpp:473
+msgid "Export Data?"
+msgstr ""
+
+#: widgets/fltk.cpp:790
+msgid "Export as ..."
+msgstr ""
+
+#: widgets/qt.cpp:1067 udav/plot_pnl.cpp:474
+msgid "Export as 2D ..."
+msgstr ""
+
+#: widgets/qt.cpp:1076 udav/plot_pnl.cpp:484
+msgid "Export as 3D ..."
+msgstr ""
+
+#: src/exec_dat.cpp:1546 mgllab/table.cpp:844
+msgid "Export data to PNG file"
+msgstr ""
+
+#. fname = new QLineEdit(this);        a->addWidget(fname);
+#: udav/anim_dlg.cpp:82
+msgid "Export to GIF"
+msgstr ""
+
+#: mgllab/table.cpp:752
+msgid "Export to PNG"
+msgstr ""
+
+#: src/exec_dat.cpp:1547
+msgid "Extend data array"
+msgstr ""
+
+#: mgllab/table.cpp:343
+msgid "Extract data"
+msgstr ""
+
+#: src/exec_dat.cpp:1604
+msgid "Extract sub-array"
+msgstr ""
+
+#: src/exec_dat.cpp:1596
+msgid "Extract sub-array between values"
+msgstr ""
+
+#: mgllab/dialogs.cpp:962
+msgid "Factor"
+msgstr ""
+
+#. file menu
+#: widgets/qt.cpp:1066 udav/udav_wnd.cpp:281 udav/dat_pnl.cpp:681
+#: mgllab/mgllab.cpp:275 mgllab/table.cpp:748
+msgid "File"
+msgstr ""
+
+#: udav/text_pnl.cpp:405 udav/text_pnl.cpp:489
+msgid "File %1 saved"
+msgstr ""
+
+#: mgllab/mgllab.cpp:225
+msgid "File is exesist. Overwrite it?"
+msgstr ""
+
+#: udav/text_pnl.cpp:583
+msgid "File name"
+msgstr ""
+
+#: mgllab/mgllab.cpp:301
+msgid "File path"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1073
+msgid "File to export"
+msgstr ""
+
+#: mgllab/editor.cpp:267 mgllab/mgllab.cpp:394
+msgid "File/Recent files"
+msgstr ""
+
+#: mgllab/table.cpp:765
+msgid "Fill"
+msgstr ""
+
+#: udav/dat_pnl.cpp:611 mgllab/table.cpp:854
+msgid "Fill data by formula"
+msgstr ""
+
+#: src/exec_dat.cpp:1553
+msgid "Fill data by global spline of Vdat"
+msgstr ""
+
+#: src/exec_dat.cpp:1588
+msgid "Fill data by interpolation of Vdat"
+msgstr ""
+
+#: src/exec_dat.cpp:1533
+msgid "Fill data by triangulated values"
+msgstr ""
+
+#: src/exec_dat.cpp:1548
+msgid "Fill data linearly in range [v1, v2]"
+msgstr ""
+
+#: mgllab/table.cpp:578 mgllab/table.cpp:592
+msgid "Fill in range"
+msgstr ""
+
+#: src/exec_dat.cpp:1549
+msgid "Fill x-,k-samples for transforms"
+msgstr ""
+
+#: udav/find_dlg.cpp:48 mgllab/editor.cpp:559
+msgid "Find"
+msgstr ""
+
+#: src/exec_dat.cpp:1529
+msgid "Find correlation between data arrays"
+msgstr ""
+
+#: src/exec_dat.cpp:1543
+msgid "Find envelop for the data"
+msgstr ""
+
+#: udav/dat_pnl.cpp:624
+msgid "Find envelope along direction(s)"
+msgstr ""
+
+#: udav/dat_pnl.cpp:804
+msgid "Find histogram of data."
+msgstr ""
+
+#: src/exec_dat.cpp:1564
+msgid "Find maximal value over direction"
+msgstr ""
+
+#: src/exec_dat.cpp:1565
+msgid "Find minimal value over direction"
+msgstr ""
+
+#: udav/text_pnl.cpp:551 mgllab/mgllab.cpp:299
+msgid "Find next"
+msgstr ""
+
+#: mgllab/editor.cpp:515
+msgid "Find or replace text"
+msgstr ""
+
+#: src/exec_dat.cpp:1600
+msgid "Find root Dat[i,j,k]=val (inverse evaluate)"
+msgstr ""
+
+#: src/exec_dat.cpp:1592
+msgid "Find roots using data as initial values"
+msgstr ""
+
+#: src/exec_dat.cpp:1606
+msgid "Find summation over direction"
+msgstr ""
+
+#: src/exec_dat.cpp:1612
+msgid "Find triangles of randomly placed points"
+msgstr ""
+
+#: udav/find_dlg.cpp:36 mgllab/editor.cpp:558
+msgid "Find what:"
+msgstr ""
+
+#: udav/text_pnl.cpp:546 mgllab/editor.cpp:557
+msgid "Find/Replace"
+msgstr ""
+
+#: mgllab/mgllab.cpp:298
+msgid "Find|Replace"
+msgstr ""
+
+#: src/parser.cpp:1432
+msgid "Finish if/else block"
+msgstr ""
+
+#: mgllab/table.cpp:804
+msgid "First cell"
+msgstr ""
+
+#: udav/dat_pnl.cpp:721 mgllab/table.cpp:800
+msgid "First slice"
+msgstr ""
+
+#: src/exec_dat.cpp:1550 src/exec_dat.cpp:1551
+msgid "Fit data to formula"
+msgstr ""
+
+#: udav/text_pnl.cpp:567 mgllab/mgllab.cpp:305
+msgid "Fitted formula"
+msgstr ""
+
+#: udav/prop_dlg.cpp:103
+msgid "FlowKey"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1009
+msgid "Fog"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1010
+msgid "Fog dist."
+msgstr ""
+
+#: mgllab/mgllab.cpp:530
+msgid "Folder for help files"
+msgstr ""
+
+#: udav/text_pnl.cpp:587 mgllab/mgllab.cpp:302
+msgid "Folder path"
+msgstr ""
+
+#: udav/setup_dlg.cpp:105 mgllab/dialogs.cpp:1007
+msgid "Font"
+msgstr ""
+
+#: mgllab/mgllab.cpp:521
+msgid "Font file name"
+msgstr ""
+
+#: udav/prop_dlg.cpp:199
+msgid "Font files (*.vfm)"
+msgstr ""
+
+#: mgllab/mgllab.cpp:460
+msgid "Font kind"
+msgstr ""
+
+#: mgllab/mgllab.cpp:462
+msgid "Font size"
+msgstr ""
+
+#: udav/style_dlg.cpp:183
+msgid "Font style"
+msgstr ""
+
+#: udav/setup_dlg.cpp:107
+msgid "FontSize"
+msgstr ""
+
+#: src/parser.cpp:1433
+msgid "For loop"
+msgstr ""
+
+#: udav/help_pnl.cpp:52
+msgid "Forward"
+msgstr ""
+
+#: udav/plot_pnl.cpp:192
+msgid "Frame %1 of %2"
+msgstr ""
+
+#: udav/dat_pnl.cpp:351 udav/dat_pnl.cpp:366 udav/dat_pnl.cpp:377
+#: udav/dat_pnl.cpp:424 udav/dat_pnl.cpp:452 mgllab/table.cpp:608
+msgid "From"
+msgstr ""
+
+#: mgllab/mgllab.cpp:589
+msgid "Function"
+msgstr ""
+
+#. B
+#: udav/style_dlg.cpp:238 mgllab/dialogs.cpp:46
+msgid "G - green"
+msgstr ""
+
+#: src/export.cpp:306 src/export.cpp:375 src/export.cpp:388
+msgid "GIF support was disabled. Please, enable it and rebuild MathGL."
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:178 udav/setup_dlg.cpp:112 mgllab/dialogs.cpp:719
+#: mgllab/dialogs.cpp:1001
+msgid "General setup"
+msgstr ""
+
+#: src/exec_dat.cpp:1561
+msgid "Get Jacobian"
+msgstr ""
+
+#: src/exec_dat.cpp:1526
+msgid "Get data column filled by formula on column ids"
+msgstr ""
+
+#: src/exec_dat.cpp:1595
+msgid "Get formated data from file"
+msgstr ""
+
+#: src/exec_dat.cpp:1568
+msgid "Get momentum along direction"
+msgstr ""
+
+#: src/exec_dat.cpp:1577
+msgid "Get pulse properties"
+msgstr ""
+
+#: src/exec_dat.cpp:1608
+msgid "Get trace of array"
+msgstr ""
+
+#: src/base_cf.cpp:85
+#, c-format
+msgid "Global message - %s\n"
+msgstr ""
+
+#: udav/dat_pnl.cpp:723 mgllab/table.cpp:865
+msgid "Go to first slice for 3D data (Ctrl-F1)."
+msgstr ""
+
+#: udav/dat_pnl.cpp:753 mgllab/table.cpp:869
+msgid "Go to last slice for 3D data (Ctrl-F4)."
+msgstr ""
+
+#: udav/dat_pnl.cpp:740
+msgid "Go to slice"
+msgstr ""
+
+#: udav/dat_pnl.cpp:747
+msgid "Go to the next slice for 3D data."
+msgstr ""
+
+#: udav/dat_pnl.cpp:729
+msgid "Go to the previous slice for 3D data."
+msgstr ""
+
+#: udav/dat_pnl.cpp:735 udav/dat_pnl.cpp:742
+msgid "Go to the specified slice for 3D data."
+msgstr ""
+
+#: widgets/qt.cpp:1095 widgets/qt.cpp:1097 udav/plot_pnl.cpp:66
+#: mgllab/mgllab.cpp:317
+msgid "Graphics"
+msgstr ""
+
+#: udav/text_pnl.cpp:596
+msgid "Graphics setup"
+msgstr ""
+
+#: widgets/fltk.cpp:928
+msgid "Graphics/Adjust size"
+msgstr ""
+
+#. /< Parameter for handling animation
+#. /< Callback function for next frame
+#. /< Callback function for prev frame
+#. /< Callback function for delay
+#. /< Callback function for reloading
+#: widgets/fltk.cpp:922 include/mgl2/Fl_MathGL.h:150
+msgid "Graphics/Alpha"
+msgstr ""
+
+#: widgets/fltk.cpp:957
+msgid "Graphics/Animation/Next frame"
+msgstr ""
+
+#: widgets/fltk.cpp:958
+msgid "Graphics/Animation/Prev frame"
+msgstr ""
+
+#: mgllab/mgllab.cpp:369
+msgid "Graphics/Animation/Setup animation"
+msgstr ""
+
+#: widgets/fltk.cpp:956 include/mgl2/Fl_MathGL.h:152
+msgid "Graphics/Animation/Slideshow"
+msgstr ""
+
+#: widgets/fltk.cpp:932
+msgid "Graphics/Copy click coor."
+msgstr ""
+
+#: widgets/fltk.cpp:931
+msgid "Graphics/Copy graphics"
+msgstr ""
+
+#: widgets/fltk.cpp:945
+msgid "Graphics/Export/as BMP"
+msgstr ""
+
+#: widgets/fltk.cpp:943
+msgid "Graphics/Export/as GIF"
+msgstr ""
+
+#: widgets/fltk.cpp:940
+msgid "Graphics/Export/as JPEG"
+msgstr ""
+
+#: widgets/fltk.cpp:951
+msgid "Graphics/Export/as OBJ"
+msgstr ""
+
+#: widgets/fltk.cpp:952
+msgid "Graphics/Export/as OFF"
+msgstr ""
+
+#: widgets/fltk.cpp:936
+msgid "Graphics/Export/as PNG"
+msgstr ""
+
+#: widgets/fltk.cpp:950
+msgid "Graphics/Export/as PRC"
+msgstr ""
+
+#: widgets/fltk.cpp:953
+msgid "Graphics/Export/as STL"
+msgstr ""
+
+#: widgets/fltk.cpp:946
+msgid "Graphics/Export/as SVG"
+msgstr ""
+
+#: widgets/fltk.cpp:949
+msgid "Graphics/Export/as TeX"
+msgstr ""
+
+#: widgets/fltk.cpp:954
+msgid "Graphics/Export/as XYZ"
+msgstr ""
+
+#: widgets/fltk.cpp:948
+msgid "Graphics/Export/as bitmap EPS"
+msgstr ""
+
+#: widgets/fltk.cpp:937
+msgid "Graphics/Export/as solid PNG"
+msgstr ""
+
+#: widgets/fltk.cpp:947
+msgid "Graphics/Export/as vector EPS"
+msgstr ""
+
+#: widgets/fltk.cpp:924 include/mgl2/Fl_MathGL.h:153
+msgid "Graphics/Grid"
+msgstr ""
+
+#: widgets/fltk.cpp:923 include/mgl2/Fl_MathGL.h:151
+msgid "Graphics/Light"
+msgstr ""
+
+#: widgets/fltk.cpp:933 include/mgl2/Fl_MathGL.h:159 mgllab/mgllab.cpp:370
+msgid "Graphics/Pause calc"
+msgstr ""
+
+#: mgllab/mgllab.cpp:368
+msgid "Graphics/Primitive"
+msgstr ""
+
+#: widgets/fltk.cpp:927
+msgid "Graphics/Redraw"
+msgstr ""
+
+#: widgets/fltk.cpp:929
+msgid "Graphics/Reload data"
+msgstr ""
+
+#: widgets/fltk.cpp:926
+msgid "Graphics/Restore"
+msgstr ""
+
+#: widgets/fltk.cpp:930
+msgid "Graphics/Stop"
+msgstr ""
+
+#: widgets/fltk.cpp:964
+msgid "Graphics/Transform/Move down"
+msgstr ""
+
+#: widgets/fltk.cpp:960
+msgid "Graphics/Transform/Move left"
+msgstr ""
+
+#: widgets/fltk.cpp:965
+msgid "Graphics/Transform/Move right"
+msgstr ""
+
+#: widgets/fltk.cpp:961
+msgid "Graphics/Transform/Move up"
+msgstr ""
+
+#: widgets/fltk.cpp:962
+msgid "Graphics/Transform/Zoom in"
+msgstr ""
+
+#: widgets/fltk.cpp:963
+msgid "Graphics/Transform/Zoom out"
+msgstr ""
+
+#: udav/plot_pnl.cpp:304
+msgid "Grid"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:50 mgllab/dialogs.cpp:705
+msgid "Groups of MGL commands"
+msgstr ""
+
+#. P
+#: udav/style_dlg.cpp:249 mgllab/dialogs.cpp:57
+msgid "H - darkgray"
+msgstr ""
+
+#: src/data_io.cpp:1085
+msgid "HDF4 support was disabled. Please, enable it and rebuild MathGL."
+msgstr ""
+
+#: src/complex_io.cpp:922 src/complex_io.cpp:924 src/data_io.cpp:1184
+#: src/data_io.cpp:1186 src/data_io.cpp:1188 src/data_io.cpp:1190
+msgid "HDF5 support was disabled. Please, enable it and rebuild MathGL."
+msgstr ""
+
+#: mgllab/table.cpp:165 mgllab/table.cpp:779
+msgid "Hankel"
+msgstr ""
+
+#: udav/dat_pnl.cpp:622
+msgid "Hankel transform along direction(s)"
+msgstr ""
+
+#: src/exec_dat.cpp:1554
+msgid "Hankel transform at some direction"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:84
+msgid "Height of selected cells"
+msgstr ""
+
+#: widgets/qt.cpp:1276 udav/help_pnl.cpp:57 udav/udav_wnd.cpp:231
+#: udav/udav_wnd.cpp:323 mgllab/mgllab.cpp:327 mgllab/mgllab.cpp:328
+#: mgllab/mgllab.cpp:356
+msgid "Help"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:73
+msgid ""
+"Here you can specify command options.\n"
+"Options are used for additional plot tunning."
+msgstr ""
+
+#: udav/udav_wnd.cpp:186 mgllab/mgllab.cpp:296
+msgid "Hidden plots"
+msgstr ""
+
+#: udav/plot_pnl.cpp:431
+msgid "Hide selected"
+msgstr ""
+
+#: udav/plot_pnl.cpp:433
+msgid "Hide selected plots."
+msgstr ""
+
+#: udav/prop_dlg.cpp:173 mgllab/mgllab.cpp:472
+msgid "Highlight current object(s)"
+msgstr ""
+
+#: udav/udav_wnd.cpp:328 mgllab/mgllab.cpp:329
+msgid "Hints"
+msgstr ""
+
+#: udav/dat_pnl.cpp:802
+msgid "Histogram (Ctrl+Shift+H)"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:51 udav/subplot_dlg.cpp:68 udav/subplot_dlg.cpp:93
+msgid "Horizontal size"
+msgstr ""
+
+#: udav/calc_dlg.cpp:192
+msgid "Hyperbolic"
+msgstr ""
+
+#: udav/setup_dlg.cpp:116
+msgid "ID"
+msgstr ""
+
+#: mgllab/mgllab.cpp:331
+msgid "Icon list"
+msgstr ""
+
+#: mgllab/table.cpp:867
+msgid "Id of slice on third (z-) dimension"
+msgstr ""
+
+#: udav/prop_dlg.cpp:154
+msgid "Image size"
+msgstr ""
+
+#: src/exec_dat.cpp:1576
+msgid "Immediately print the message"
+msgstr ""
+
+#: mgllab/table.cpp:485
+msgid "Import Data?"
+msgstr ""
+
+#: src/exec_dat.cpp:1557 mgllab/table.cpp:840
+msgid "Import data from PNG file"
+msgstr ""
+
+#: mgllab/table.cpp:750
+msgid "Import from PNG"
+msgstr ""
+
+#: mgllab/table.cpp:767
+msgid "In range"
+msgstr ""
+
+#: src/exec_dat.cpp:1552
+msgid "In-place Fourier transform"
+msgstr ""
+
+#: mgllab/mathgl.cpp:245
+msgid "Incompatible loop parameters!"
+msgstr ""
+
+#: mgllab/table.cpp:503
+msgid "Incorrect type of base data"
+msgstr ""
+
+#: udav/plot_pnl.cpp:552
+msgid "Increase \\phi angle by 10 degrees."
+msgstr ""
+
+#: udav/plot_pnl.cpp:544
+msgid "Increase \\theta angle by 10 degrees."
+msgstr ""
+
+#: mgllab/help.cpp:103
+msgid "Increase font size"
+msgstr ""
+
+#: udav/udav_wnd.cpp:229
+msgid "Info"
+msgstr ""
+
+#: udav/info_dlg.cpp:55 mgllab/help.cpp:354
+msgid "Information"
+msgstr ""
+
+#: mgllab/mgllab.cpp:304
+msgid "Inplot"
+msgstr ""
+
+#. insert menu
+#: udav/text_pnl.cpp:557 mgllab/mgllab.cpp:300
+msgid "Insert"
+msgstr ""
+
+#: mgllab/editor.cpp:518
+msgid "Insert MGL command"
+msgstr ""
+
+#: mgllab/table.cpp:753
+msgid "Insert as 'list'"
+msgstr ""
+
+#: mgllab/editor.cpp:486
+msgid "Insert file content?"
+msgstr ""
+
+#: mgllab/mgllab.cpp:148
+msgid "Insert file name?"
+msgstr ""
+
+#: mgllab/editor.cpp:520
+msgid "Insert filename"
+msgstr ""
+
+#: mgllab/editor.cpp:522
+msgid "Insert inplot command"
+msgstr ""
+
+#: udav/text_pnl.cpp:569
+msgid "Insert last fitted formula with found coefficients."
+msgstr ""
+
+#: src/exec_dat.cpp:1559
+msgid "Insert slice of data"
+msgstr ""
+
+#: mgllab/table.cpp:847
+msgid "Insert to script as 'list' command"
+msgstr ""
+
+#: mgllab/table.cpp:163 mgllab/table.cpp:773
+msgid "Integrate"
+msgstr ""
+
+#: src/exec_dat.cpp:1560 udav/dat_pnl.cpp:615
+msgid "Integrate data along direction(s)"
+msgstr ""
+
+#: mgllab/dialogs.cpp:114
+msgid "Intensity of diffuse light"
+msgstr ""
+
+#: udav/style_dlg.cpp:158 mgllab/dialogs.cpp:369
+msgid "Italic style"
+msgstr ""
+
+#: widgets/qt.cpp:1070 udav/plot_pnl.cpp:477
+msgid "JPEG"
+msgstr ""
+
+#: src/data_png.cpp:162 src/export.cpp:192
+msgid "JPEG support was disabled. Please, enable it and rebuild MathGL."
+msgstr ""
+
+#: udav/calc_dlg.cpp:193
+msgid "Jacobi"
+msgstr ""
+
+#: src/exec_dat.cpp:1562
+msgid "Join data arrays"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1075
+msgid "Keep empty to put at beginning of main script."
+msgstr ""
+
+#: udav/dat_pnl.cpp:780
+msgid "Keep only each n-th element of the data array."
+msgstr ""
+
+#: mgllab/mathgl.cpp:198
+msgid "Keep slides in memory (faster animation but require more memory)"
+msgstr ""
+
+#: udav/prop_dlg.cpp:88
+msgid "Keywords"
+msgstr ""
+
+#: mgllab/dialogs.cpp:354 mgllab/dialogs.cpp:704 mgllab/dialogs.cpp:1457
+msgid "Kind"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:58
+msgid ""
+"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."
+msgstr ""
+
+#: udav/info_dlg.cpp:50
+msgid "Kind of plots: lines for 1D, density for 2D."
+msgstr ""
+
+#. Y
+#: udav/style_dlg.cpp:243 mgllab/dialogs.cpp:51
+msgid "L - seagreen"
+msgstr ""
+
+#: widgets/qt.cpp:1074 udav/plot_pnl.cpp:481
+msgid "LaTeX"
+msgstr ""
+
+#: udav/setup_dlg.cpp:66 mgllab/dialogs.cpp:954
+msgid "Label"
+msgstr ""
+
+#: udav/prop_dlg.cpp:139
+msgid "Language for UDAV"
+msgstr ""
+
+#: mgllab/mgllab.cpp:475
+msgid "Language for mgllab"
+msgstr ""
+
+#: udav/dat_pnl.cpp:617
+msgid "Laplace transform along direction(s)"
+msgstr ""
+
+#: mgllab/table.cpp:775
+msgid "Laplacian"
+msgstr ""
+
+#: udav/dat_pnl.cpp:751 mgllab/table.cpp:803
+msgid "Last slice"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:144
+msgid "Left bottom edge"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:152
+msgid "Left top edge"
+msgstr ""
+
+#: udav/opt_dlg.cpp:74 mgllab/dialogs.cpp:118
+msgid "Legend"
+msgstr ""
+
+#: widgets/qt.cpp:1104 udav/opt_dlg.cpp:64 udav/setup_dlg.cpp:110
+#: udav/plot_pnl.cpp:297 mgllab/dialogs.cpp:115
+msgid "Light"
+msgstr ""
+
+#: udav/setup_dlg.cpp:190
+msgid "Light position should be filled. Ignore it."
+msgstr ""
+
+#: udav/setup_dlg.cpp:136 mgllab/dialogs.cpp:1053
+msgid "Light settings"
+msgstr ""
+
+#: src/exec_dat.cpp:1563
+msgid "Limit data to be inside [-v,v]"
+msgstr ""
+
+#: udav/style_dlg.cpp:99 mgllab/dialogs.cpp:314
+msgid "Line style"
+msgstr ""
+
+#: udav/style_dlg.cpp:78
+msgid "Line width"
+msgstr ""
+
+#: mgllab/table.cpp:167
+msgid "Linear *3"
+msgstr ""
+
+#: mgllab/table.cpp:167
+msgid "Linear *5"
+msgstr ""
+
+#: mgllab/help.cpp:156
+msgid "List of available data."
+msgstr ""
+
+#: mgllab/table.cpp:427
+msgid "Load Data?"
+msgstr ""
+
+#: src/exec_set.cpp:719
+msgid "Load commands from external DLL"
+msgstr ""
+
+#: udav/dat_pnl.cpp:682
+msgid "Load data"
+msgstr ""
+
+#: mgllab/table.cpp:838
+msgid "Load data from file"
+msgstr ""
+
+#: udav/dat_pnl.cpp:684
+msgid ""
+"Load data from file. Data will be deleted only\n"
+"at exit but UDAV will not ask to save it (Ctrl+Shift+O)."
+msgstr ""
+
+#: src/exec_set.cpp:720
+msgid "Load fontfaces"
+msgstr ""
+
+#: mgllab/table.cpp:749
+msgid "Load from file"
+msgstr ""
+
+#: src/exec_prm.cpp:580
+msgid "Load image for background"
+msgstr ""
+
+#: udav/prop_dlg.cpp:163
+msgid "Load script to new window"
+msgstr ""
+
+#: udav/text_pnl.cpp:467
+msgid "Loaded document "
+msgstr ""
+
+#: udav/text_pnl.cpp:325
+msgid "Loaded document %1"
+msgstr ""
+
+#: udav/udav_wnd.cpp:638
+msgid "Loading aborted"
+msgstr ""
+
+#: mgllab/dialogs.cpp:98
+msgid "Low border for determining color or alpha"
+msgstr ""
+
+#. C
+#: udav/style_dlg.cpp:241 mgllab/dialogs.cpp:49
+msgid "M - purple"
+msgstr ""
+
+#: src/parser.cpp:1018
+msgid "MGL Parser"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:53 mgllab/dialogs.cpp:725
+msgid "MGL commands for selected group"
+msgstr ""
+
+#: mgllab/mgllab.cpp:212
+msgid "MGL files \t*.mgl"
+msgstr ""
+
+#: mgllab/mgllab.cpp:172
+msgid ""
+"MGL files \t*.mgl\n"
+"DAT files \t*.{dat,csv}"
+msgstr ""
+
+#: udav/open_dlg.cpp:102
+msgid "MGL files (*.mgl)"
+msgstr ""
+
+#: udav/udav_wnd.cpp:324
+msgid "MGL help"
+msgstr ""
+
+#: mgllab/mathgl.cpp:421
+msgid "MGL messages"
+msgstr ""
+
+#: mgllab/help.cpp:101
+msgid "MGL samples and hints"
+msgstr ""
+
+#: udav/udav_wnd.cpp:670
+msgid ""
+"MGL scripts (*.mgl)\n"
+"HDF5 files (*.hdf *.h5)\n"
+"All files (*.*)"
+msgstr ""
+
+#: udav/udav_wnd.cpp:635
+msgid ""
+"MGL scripts (*.mgl)\n"
+"HDF5 files (*.hdf *.h5)\n"
+"Text files (*.txt)\n"
+"Data files (*.dat)\n"
+"All files (*.*)"
+msgstr ""
+
+#: widgets/qt.cpp:1077 udav/plot_pnl.cpp:485
+msgid "MGLD"
+msgstr ""
+
+#: udav/dat_pnl.cpp:798
+msgid "Make another data."
+msgstr ""
+
+#: udav/dat_pnl.cpp:796
+msgid "Make new (Ctrl+Shift+M)"
+msgstr ""
+
+#: udav/style_dlg.cpp:83 mgllab/dialogs.cpp:336
+msgid "Manual dashing"
+msgstr ""
+
+#: udav/style_dlg.cpp:196
+msgid "Manual mask"
+msgstr ""
+
+#: udav/text_pnl.cpp:591 mgllab/mgllab.cpp:306
+msgid "Manual primitives"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1467
+msgid "Mark"
+msgstr ""
+
+#: udav/style_dlg.cpp:76 mgllab/dialogs.cpp:324
+msgid "Marks"
+msgstr ""
+
+#: mgllab/dialogs.cpp:352
+msgid "Mask"
+msgstr ""
+
+#: udav/style_dlg.cpp:124
+msgid "Mask for bitmap coloring"
+msgstr ""
+
+#: udav/style_dlg.cpp:125
+msgid "Mask rotation angle"
+msgstr ""
+
+#: udav/style_dlg.cpp:126
+msgid "Mask size"
+msgstr ""
+
+#: udav/find_dlg.cpp:42 mgllab/editor.cpp:562
+msgid "Match case"
+msgstr ""
+
+#: widgets/qt.cpp:860
+msgid "MathGL - about"
+msgstr ""
+
+#: src/base.cpp:250
+#, c-format
+msgid "MathGL message - %s\n"
+msgstr ""
+
+#: widgets/qt.cpp:859
+msgid "MathGL v. 2."
+msgstr ""
+
+#: udav/open_dlg.cpp:70
+msgid "Matrix with sizes from file"
+msgstr ""
+
+#: udav/dat_pnl.cpp:541
+msgid "Max along direction(s)"
+msgstr ""
+
+#: udav/setup_dlg.cpp:57 mgllab/dialogs.cpp:952
+msgid "Maximal"
+msgstr ""
+
+#: mgllab/table.cpp:546
+msgid "Maximal value (v2)"
+msgstr ""
+
+#: mgllab/table.cpp:548
+msgid "Maximal value for resulting data values"
+msgstr ""
+
+#: mgllab/dialogs.cpp:88
+msgid "Maximal value of X for cutting or for coordinate filling"
+msgstr ""
+
+#: mgllab/dialogs.cpp:92
+msgid "Maximal value of Y for cutting or for coordinate filling"
+msgstr ""
+
+#: mgllab/dialogs.cpp:96
+msgid "Maximal value of Z for cutting or for coordinate filling"
+msgstr ""
+
+#: src/data.cpp:1417
+#, c-format
+msgid "Maximum is %g\t at x = %ld\ty = %ld\tz = %ld\n"
+msgstr ""
+
+#: mgllab/table.cpp:342 mgllab/table.cpp:789
+msgid "Maximum of"
+msgstr ""
+
+#: udav/mem_pnl.cpp:68 udav/mem_pnl.cpp:73 mgllab/mgllab.cpp:358
+msgid "Memory"
+msgstr ""
+
+#: udav/opt_dlg.cpp:53
+msgid "Mesh num"
+msgstr ""
+
+#: udav/setup_dlg.cpp:99 mgllab/dialogs.cpp:102
+msgid "MeshNum"
+msgstr ""
+
+#: mgllab/mgllab.cpp:325
+msgid "Messages"
+msgstr ""
+
+#: udav/udav_wnd.cpp:178
+msgid "Messages and warnings"
+msgstr ""
+
+#: udav/dat_pnl.cpp:540
+msgid "Min along direction(s)"
+msgstr ""
+
+#: udav/setup_dlg.cpp:52 mgllab/dialogs.cpp:951
+msgid "Minimal"
+msgstr ""
+
+#: mgllab/table.cpp:543
+msgid "Minimal value (v1)"
+msgstr ""
+
+#: mgllab/table.cpp:545
+msgid "Minimal value for resulting data values"
+msgstr ""
+
+#: mgllab/dialogs.cpp:86
+msgid "Minimal value of X for cutting or for coordinate filling"
+msgstr ""
+
+#: mgllab/dialogs.cpp:90
+msgid "Minimal value of Y for cutting or for coordinate filling"
+msgstr ""
+
+#: mgllab/dialogs.cpp:94
+msgid "Minimal value of Z for cutting or for coordinate filling"
+msgstr ""
+
+#: src/data.cpp:1420
+#, c-format
+msgid "Minimum is %g\t at x = %ld\ty = %ld\tz = %ld\n"
+msgstr ""
+
+#: mgllab/table.cpp:342 mgllab/table.cpp:790
+msgid "Minimum of"
+msgstr ""
+
+#. { _("Wavelet"),     0, wavelet_cb },
+#: mgllab/table.cpp:166 mgllab/table.cpp:781
+msgid "Mirror"
+msgstr ""
+
+#: udav/dat_pnl.cpp:619
+msgid "Mirror data along direction(s)"
+msgstr ""
+
+#: src/exec_dat.cpp:1566
+msgid "Mirror data at some direction"
+msgstr ""
+
+#: src/exec_dat.cpp:1567
+msgid "Modify data values by formula"
+msgstr ""
+
+#: udav/dat_pnl.cpp:542
+msgid "Momentum along 'x' for function"
+msgstr ""
+
+#: udav/dat_pnl.cpp:543
+msgid "Momentum along 'y' for function"
+msgstr ""
+
+#: udav/dat_pnl.cpp:544
+msgid "Momentum along 'z' for function"
+msgstr ""
+
+#: widgets/qt.cpp:1233 udav/plot_pnl.cpp:527
+msgid "Move down"
+msgstr ""
+
+#: widgets/qt.cpp:1219 udav/plot_pnl.cpp:506
+msgid "Move graphics left by 1/3 of its width."
+msgstr ""
+
+#: widgets/qt.cpp:1239 udav/plot_pnl.cpp:536
+msgid "Move graphics right by 1/3 of its width."
+msgstr ""
+
+#: widgets/qt.cpp:1223 udav/plot_pnl.cpp:512
+msgid "Move graphics up by 1/3 of its height."
+msgstr ""
+
+#: widgets/qt.cpp:1235 udav/plot_pnl.cpp:530
+msgid "Move graphics up down 1/3 of its height."
+msgstr ""
+
+#: widgets/qt.cpp:1217 udav/plot_pnl.cpp:503
+msgid "Move left"
+msgstr ""
+
+#: udav/text_pnl.cpp:593
+msgid "Move mouse-handled primitives to script."
+msgstr ""
+
+#: udav/plot_pnl.cpp:454
+msgid "Move plot down"
+msgstr ""
+
+#: udav/plot_pnl.cpp:449
+msgid "Move plot up"
+msgstr ""
+
+#: widgets/qt.cpp:1237 udav/plot_pnl.cpp:533
+msgid "Move right"
+msgstr ""
+
+#: udav/plot_pnl.cpp:456
+msgid "Move selected plot down to next subplot."
+msgstr ""
+
+#: udav/plot_pnl.cpp:451
+msgid "Move selected plot up to previous subplot."
+msgstr ""
+
+#: widgets/qt.cpp:1221 udav/plot_pnl.cpp:509
+msgid "Move up"
+msgstr ""
+
+#: mgllab/table.cpp:796
+msgid "Multiply by"
+msgstr ""
+
+#: src/exec_dat.cpp:1569
+msgid "Multiply by data or number"
+msgstr ""
+
+#. E
+#: udav/style_dlg.cpp:245 mgllab/dialogs.cpp:53
+msgid "N - darkskyblue"
+msgstr ""
+
+#: udav/dat_pnl.cpp:500
+msgid "NOTE: All fields must be filled!"
+msgstr ""
+
+#: udav/mem_pnl.cpp:68
+msgid "Name"
+msgstr ""
+
+#: mgllab/table.cpp:349
+msgid "Name for output"
+msgstr ""
+
+#. navigation menu
+#: udav/dat_pnl.cpp:720 mgllab/table.cpp:799
+msgid "Navigation"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:101 udav/newcmd_dlg.cpp:310 udav/newcmd_dlg.cpp:338
+#: udav/newcmd_dlg.cpp:342 udav/newcmd_dlg.cpp:356 udav/newcmd_dlg.cpp:369
+#: udav/newcmd_dlg.cpp:377 udav/newcmd_dlg.cpp:381 udav/newcmd_dlg.cpp:385
+#: udav/text_pnl.cpp:558 udav/plot_pnl.cpp:439 mgllab/dialogs.cpp:702
+msgid "New command"
+msgstr ""
+
+#: udav/hint_dlg.cpp:40 mgllab/help.cpp:274
+msgid ""
+"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). "
+msgstr ""
+
+#: udav/text_pnl.cpp:562 udav/plot_pnl.cpp:444
+msgid "New inplot"
+msgstr ""
+
+#: mgllab/table.cpp:671
+msgid "New order of dimensions"
+msgstr ""
+
+#: udav/udav_wnd.cpp:282 mgllab/mgllab.cpp:276
+msgid "New script"
+msgstr ""
+
+#: mgllab/table.cpp:95
+msgid "New size of data on 1st dimension (x-direction)"
+msgstr ""
+
+#: mgllab/table.cpp:97
+msgid "New size of data on 2nd dimension (y-direction)"
+msgstr ""
+
+#: mgllab/table.cpp:99
+msgid "New size of data on 3d dimension (z-direction)"
+msgstr ""
+
+#: udav/hint_dlg.cpp:68
+msgid "Next"
+msgstr ""
+
+#: mgllab/help.cpp:306
+msgid "Next @->"
+msgstr ""
+
+#: udav/dat_pnl.cpp:745 mgllab/table.cpp:802
+msgid "Next slice"
+msgstr ""
+
+#: widgets/qt.cpp:1247 udav/plot_pnl.cpp:560
+msgid "Next slide"
+msgstr ""
+
+#: mgllab/help.cpp:135 mgllab/mgllab.cpp:225
+msgid "No"
+msgstr ""
+
+#: udav/dat_pnl.cpp:567 udav/dat_pnl.cpp:644
+msgid "No action is selected. Do nothing."
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:310
+msgid "No argument is selected"
+msgstr ""
+
+#: udav/dat_pnl.cpp:573
+msgid "No direction/formula is entered. Do nothing."
+msgstr ""
+
+#: widgets/qt.cpp:680 widgets/qt.cpp:692 widgets/qt.cpp:704 widgets/qt.cpp:716
+#: widgets/qt.cpp:728 widgets/qt.cpp:736 widgets/qt.cpp:744 widgets/qt.cpp:752
+#: widgets/qt.cpp:760 widgets/qt.cpp:768 widgets/qt.cpp:776 widgets/qt.cpp:784
+#: widgets/qt.cpp:800 widgets/qt.cpp:808 widgets/qt.cpp:816
+msgid "No filename."
+msgstr ""
+
+#: mgllab/editor.cpp:584 mgllab/editor.cpp:606 mgllab/editor.cpp:631
+#, c-format
+msgid "No occurrences of '%s' found!"
+msgstr ""
+
+#: mgllab/mathgl.cpp:260
+msgid "No selection. So nothing to do"
+msgstr ""
+
+#: udav/text_pnl.cpp:202
+msgid "No string occurrence is found"
+msgstr ""
+
+#: udav/setup_dlg.cpp:111
+msgid "No text rotation"
+msgstr ""
+
+#: widgets/fltk.cpp:813
+msgid "Normal view"
+msgstr ""
+
+#: mgllab/table.cpp:768
+msgid "Normalize"
+msgstr ""
+
+#: src/exec_dat.cpp:1571
+msgid "Normalize data"
+msgstr ""
+
+#: src/exec_dat.cpp:1572
+msgid "Normalize data slice by slice"
+msgstr ""
+
+#: mgllab/table.cpp:553
+msgid "Normalize in symmetrical range: -max(|v1|,|v2|) ... max(|v1|,|v2|)"
+msgstr ""
+
+#: udav/udav_wnd.cpp:444
+msgid "Not recognized"
+msgstr ""
+
+#: udav/dat_pnl.cpp:456
+msgid "Number of points"
+msgstr ""
+
+#: udav/prop_dlg.cpp:97
+msgid "Numbers"
+msgstr ""
+
+#: mgllab/table.cpp:176
+msgid "Numeric parameter"
+msgstr ""
+
+#: udav/text_pnl.cpp:579
+msgid "Numeric value"
+msgstr ""
+
+#: src/exec_dat.cpp:1537
+msgid "Numerically differentiate data"
+msgstr ""
+
+#: src/exec_dat.cpp:1538
+msgid "Numerically double differentiate data"
+msgstr ""
+
+#: udav/open_dlg.cpp:64
+msgid "Nx"
+msgstr ""
+
+#: udav/open_dlg.cpp:66
+msgid "Ny"
+msgstr ""
+
+#: udav/open_dlg.cpp:68
+msgid "Nz"
+msgstr ""
+
+#: widgets/qt.cpp:1079 udav/plot_pnl.cpp:487
+msgid "OBJ"
+msgstr ""
+
+#: udav/anim_dlg.cpp:69 udav/prop_dlg.cpp:182 udav/args_dlg.cpp:65
+#: udav/newcmd_dlg.cpp:80 udav/open_dlg.cpp:92 udav/dat_pnl.cpp:462
+#: udav/dat_pnl.cpp:512 udav/dat_pnl.cpp:554 udav/dat_pnl.cpp:631
+#: udav/opt_dlg.cpp:80 udav/files_dlg.cpp:60 udav/style_dlg.cpp:208
+#: udav/data_dlg.cpp:92 udav/subplot_dlg.cpp:221 mgllab/mathgl.cpp:196
+#: mgllab/dialogs.cpp:121 mgllab/dialogs.cpp:165 mgllab/dialogs.cpp:411
+#: mgllab/dialogs.cpp:585 mgllab/dialogs.cpp:750 mgllab/dialogs.cpp:1072
+#: mgllab/dialogs.cpp:1319 mgllab/dialogs.cpp:1474 mgllab/mgllab.cpp:480
+#: mgllab/table.cpp:621
+msgid "OK"
+msgstr ""
+
+#: mgllab/table.cpp:504
+msgid "Only current slice will be inserted"
+msgstr ""
+
+#: mgllab/mgllab.cpp:171
+msgid "Open File?"
+msgstr ""
+
+#: src/exec_dat.cpp:1574
+msgid "Open all data arrays from HDF file"
+msgstr ""
+
+#: udav/udav_wnd.cpp:198
+msgid ""
+"Open and execute/show script or data from file (Ctrl+O).\n"
+"You may switch off automatic exection in UDAV properties."
+msgstr ""
+
+#: mgllab/help.cpp:169
+msgid "Open dialog for new data creation."
+msgstr ""
+
+#: udav/udav_wnd.cpp:196
+msgid "Open file"
+msgstr ""
+
+#: mgllab/mgllab.cpp:277
+msgid "Open file ..."
+msgstr ""
+
+#: widgets/qt.cpp:1088 udav/udav_wnd.cpp:298
+msgid "Open printer dialog and print graphics (Ctrl+P)"
+msgstr ""
+
+#: mgllab/editor.cpp:506
+msgid "Open script or data file"
+msgstr ""
+
+#: mgllab/help.cpp:160
+msgid "Open table with selected data for editing."
+msgstr ""
+
+#: udav/data_dlg.cpp:65 mgllab/dialogs.cpp:578
+msgid "Operation"
+msgstr ""
+
+#: mgllab/table.cpp:231
+msgid "Operation is not supported for this type of data."
+msgstr ""
+
+#: mgllab/table.cpp:793
+msgid "Operations"
+msgstr ""
+
+#: udav/prop_dlg.cpp:91 udav/newcmd_dlg.cpp:72 mgllab/dialogs.cpp:746
+#: mgllab/mgllab.cpp:308
+msgid "Options"
+msgstr ""
+
+#: udav/setup_dlg.cpp:62 mgllab/dialogs.cpp:953
+msgid "Origin"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:171 mgllab/dialogs.cpp:712
+msgid "Other plots"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1025
+msgid "Others"
+msgstr ""
+
+#: udav/style_dlg.cpp:161 mgllab/dialogs.cpp:372
+msgid "Overline"
+msgstr ""
+
+#: mgllab/dialogs.cpp:112
+msgid "Own brightness of the surface"
+msgstr ""
+
+#. Q
+#: udav/style_dlg.cpp:248 mgllab/dialogs.cpp:56
+msgid "P - darkpink"
+msgstr ""
+
+#: src/prc.cpp:981
+msgid "PDF support was disabled. Please, enable it and rebuild MathGL."
+msgstr ""
+
+#: widgets/qt.cpp:1068 udav/plot_pnl.cpp:475
+msgid "PNG"
+msgstr ""
+
+#: mgllab/table.cpp:474 mgllab/table.cpp:486
+msgid "PNG Files \t*.png"
+msgstr ""
+
+#: src/canvas_cf.cpp:502 src/canvas_cf.cpp:504 src/data_png.cpp:122
+#: src/export.cpp:75 src/export.cpp:109
+msgid "PNG support was disabled. Please, enable it and rebuild MathGL."
+msgstr ""
+
+#: widgets/qt.cpp:1078 udav/plot_pnl.cpp:486
+msgid "PRC"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1006
+msgid "Palette"
+msgstr ""
+
+#: mgllab/table.cpp:167
+msgid "Parabolic *5"
+msgstr ""
+
+#: udav/dat_pnl.cpp:713
+msgid "Paste data"
+msgstr ""
+
+#: udav/dat_pnl.cpp:715
+msgid "Paste range of numbers from clipboard (Ctrl+Shift+P)."
+msgstr ""
+
+#: udav/text_pnl.cpp:538 mgllab/mgllab.cpp:294
+msgid "Paste text"
+msgstr ""
+
+#: mgllab/editor.cpp:513
+msgid "Paste text from clipboard"
+msgstr ""
+
+#: udav/text_pnl.cpp:540
+msgid "Paste text or data from clipboard (Ctrl+V)."
+msgstr ""
+
+#: mgllab/mgllab.cpp:466
+msgid "Path for MathGL font (without extension)"
+msgstr ""
+
+#: udav/prop_dlg.cpp:110 mgllab/mgllab.cpp:463
+msgid "Path for help files"
+msgstr ""
+
+#: udav/prop_dlg.cpp:130
+msgid "Path for user MathGL font files"
+msgstr ""
+
+#: widgets/qt.cpp:1265
+msgid "Pause calculation"
+msgstr ""
+
+#. Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(setPause()));
+#: widgets/fltk.cpp:892 widgets/qt.cpp:1270
+msgid "Pause on/off external calculations"
+msgstr ""
+
+#: src/exec_dat.cpp:1590
+msgid "Perform Runge-Kutta step"
+msgstr ""
+
+#: widgets/fltk.cpp:865
+msgid "Phi angle (rotate in x*y plane)"
+msgstr ""
+
+#: udav/prop_dlg.cpp:161
+msgid "Place editor at top"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1050
+msgid "Plot ID"
+msgstr ""
+
+#: src/exec_prm.cpp:596
+msgid "Plot curve by formula"
+msgstr ""
+
+#. o->addSeparator();  bb->addSeparator();
+#. 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);
+#: udav/dat_pnl.cpp:701
+msgid "Plot data"
+msgstr ""
+
+#: udav/dat_pnl.cpp:703
+msgid ""
+"Plot data in new script window. You may select the kind\n"
+"of plot, its style and so on."
+msgstr ""
+
+#: mgllab/mgllab.cpp:323
+msgid "Plot setup"
+msgstr ""
+
+#: udav/text_pnl.cpp:571 mgllab/dialogs.cpp:312 mgllab/mgllab.cpp:307
+msgid "Plot style"
+msgstr ""
+
+#: src/exec_prm.cpp:597
+msgid "Plot surface by formula"
+msgstr ""
+
+#: mgllab/dialogs.cpp:386
+msgid "Popular color schemes"
+msgstr ""
+
+#: udav/hint_dlg.cpp:66
+msgid "Prev"
+msgstr ""
+
+#: udav/dat_pnl.cpp:727 mgllab/table.cpp:801
+msgid "Prev slice"
+msgstr ""
+
+#: widgets/qt.cpp:1256 udav/plot_pnl.cpp:575
+msgid "Prev slide"
+msgstr ""
+
+#: udav/info_dlg.cpp:51
+msgid "Preview"
+msgstr ""
+
+#: mgllab/mgllab.cpp:563
+msgid "Previous expressions"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:181 mgllab/dialogs.cpp:722
+msgid "Primitives"
+msgstr ""
+
+#: widgets/qt.cpp:1150 udav/plot_pnl.cpp:365
+msgid "Primitives ..."
+msgstr ""
+
+#: src/exec_set.cpp:750
+msgid "Print MathGL version or check if it is valid"
+msgstr ""
+
+#: src/exec_dat.cpp:1542
+msgid "Print content of the data"
+msgstr ""
+
+#: src/exec_dat.cpp:1579
+msgid "Print fitted formula"
+msgstr ""
+
+#: widgets/qt.cpp:1086 udav/udav_wnd.cpp:296
+msgid "Print graphics"
+msgstr ""
+
+#: src/exec_dat.cpp:1534
+msgid "Print list of data names in HDF file"
+msgstr ""
+
+#: src/exec_dat.cpp:1558
+msgid "Print message or information about the data"
+msgstr ""
+
+#: mgllab/mgllab.cpp:280
+msgid "Print plot"
+msgstr ""
+
+#: udav/udav_wnd.cpp:295
+msgid "Print script"
+msgstr ""
+
+#: src/exec_prm.cpp:594
+msgid "Print string from file"
+msgstr ""
+
+#: udav/text_pnl.cpp:178
+msgid "Printing aborted"
+msgstr ""
+
+#: udav/text_pnl.cpp:176
+msgid "Printing completed"
+msgstr ""
+
+#: udav/text_pnl.cpp:174
+msgid "Printing..."
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:180 mgllab/dialogs.cpp:721
+msgid "Program flow"
+msgstr ""
+
+#: udav/udav_wnd.cpp:312 mgllab/mgllab.cpp:320 mgllab/mgllab.cpp:458
+msgid "Properties"
+msgstr ""
+
+#: udav/mem_pnl.cpp:61
+msgid "Properties of selected data array"
+msgstr ""
+
+#: mgllab/table.cpp:342 mgllab/table.cpp:791
+msgid "Pulse prop."
+msgstr ""
+
+#: udav/calc_dlg.cpp:127 mgllab/mgllab.cpp:597
+msgid "Put function"
+msgstr ""
+
+#: udav/dat_pnl.cpp:457
+msgid "Put in variable"
+msgstr ""
+
+#: udav/dat_pnl.cpp:548
+msgid "Put into this data array"
+msgstr ""
+
+#: udav/anim_dlg.cpp:74 mgllab/mathgl.cpp:201
+msgid "Put to script"
+msgstr ""
+
+#: src/exec_dat.cpp:1578
+msgid "Put value (numeric or array) to given data element"
+msgstr ""
+
+#. U
+#: udav/style_dlg.cpp:247 mgllab/dialogs.cpp:55
+msgid "Q - brown"
+msgstr ""
+
+#: udav/udav_wnd.cpp:303
+msgid "Quit"
+msgstr ""
+
+#. G
+#: udav/style_dlg.cpp:239 mgllab/dialogs.cpp:47
+msgid "R - maroon"
+msgstr ""
+
+#: src/exec_set.cpp:733
+msgid "Rasterize plot and save to background"
+msgstr ""
+
+#: src/exec_dat.cpp:1584
+msgid "Read and join data from several files"
+msgstr ""
+
+#: src/exec_dat.cpp:1583
+msgid "Read data from file"
+msgstr ""
+
+#: src/exec_dat.cpp:1586
+msgid "Read data from file with sizes specified in first row"
+msgstr ""
+
+#: src/exec_dat.cpp:1585
+msgid "Read data with name 'id' from HDF file"
+msgstr ""
+
+#: udav/udav_wnd.cpp:268 mgllab/mgllab.cpp:365
+msgid "Ready"
+msgstr ""
+
+#: src/exec_dat.cpp:1587
+msgid "Rearrange data dimensions"
+msgstr ""
+
+#: udav/udav_wnd.cpp:301 mgllab/mgllab.cpp:281
+msgid "Recent files"
+msgstr ""
+
+#: udav/dat_pnl.cpp:768
+msgid "Recreate the data with new sizes and fill it by zeros (Ctrl+Shift+N)."
+msgstr ""
+
+#: udav/text_pnl.cpp:521
+msgid "Redo"
+msgstr ""
+
+#: udav/text_pnl.cpp:523
+msgid "Redo editor change (Ctrl+Shift+Z)."
+msgstr ""
+
+#: widgets/qt.cpp:1130 udav/plot_pnl.cpp:331
+msgid "Redraw"
+msgstr ""
+
+#: udav/anim_dlg.cpp:41 mgllab/mathgl.cpp:184
+msgid "Redraw picture for $0 equal to"
+msgstr ""
+
+#: widgets/fltk.cpp:814
+msgid "Redraw plot"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1320
+msgid "Refresh"
+msgstr ""
+
+#: widgets/fltk.cpp:848
+msgid "Refresh the picture"
+msgstr ""
+
+#: mgllab/dialogs.cpp:404
+msgid "Relative position of i-th color"
+msgstr ""
+
+#: udav/plot_pnl.cpp:342
+msgid "Reload"
+msgstr ""
+
+#: widgets/fltk.cpp:816
+msgid "Reload data"
+msgstr ""
+
+#: widgets/fltk.cpp:854
+msgid "Reload data and refresh the picture"
+msgstr ""
+
+#: src/exec_dat.cpp:1525
+msgid "Remove duplicate rows"
+msgstr ""
+
+#: src/exec_dat.cpp:1597
+msgid "Remove jump into the data, like phase jumps"
+msgstr ""
+
+#: udav/find_dlg.cpp:50 mgllab/editor.cpp:561
+msgid "Replace"
+msgstr ""
+
+#: mgllab/editor.cpp:564
+msgid "Replace all"
+msgstr ""
+
+#: udav/find_dlg.cpp:39 mgllab/editor.cpp:560
+msgid "Replace by:"
+msgstr ""
+
+#: udav/text_pnl.cpp:581
+msgid "Replace expression by its numerical value."
+msgstr ""
+
+#: mgllab/editor.cpp:630
+#, c-format
+msgid "Replaced %ld occurrences."
+msgstr ""
+
+#: mgllab/dialogs.cpp:891
+#, c-format
+msgid "Required argument %s is not specified!"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:186
+msgid "Reserve at"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1303
+msgid "Reserve at:"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:190
+msgid "Reserve space for labels at bottom side (style '_')"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:188
+msgid "Reserve space for labels at left side (style '<')"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:194
+msgid "Reserve space for labels at right side (style '>')"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:192
+msgid "Reserve space for labels at top side (style '^')"
+msgstr ""
+
+#: src/exec_set.cpp:734
+msgid "Reset settings and clear picture"
+msgstr ""
+
+#: udav/dat_pnl.cpp:772 mgllab/table.cpp:759
+msgid "Resize"
+msgstr ""
+
+#: udav/dat_pnl.cpp:774
+msgid "Resize (interpolate) the data to specified sizes (Ctrl+Shift+R)."
+msgstr ""
+
+#: src/exec_dat.cpp:1589
+msgid "Resize data array"
+msgstr ""
+
+#: mgllab/table.cpp:856
+msgid "Resize data with smoothing"
+msgstr ""
+
+#: widgets/qt.cpp:1123 udav/plot_pnl.cpp:325
+msgid "Restore"
+msgstr ""
+
+#: widgets/fltk.cpp:845
+msgid "Restore default graphics rotation, zoom and perspective"
+msgstr ""
+
+#: widgets/qt.cpp:1125
+msgid "Restore default graphics rotation, zoom and perspective (Alt+Space)."
+msgstr ""
+
+#: udav/plot_pnl.cpp:327
+msgid "Restore default graphics rotation, zoom and perspective (Ctrl+Space)."
+msgstr ""
+
+#: udav/plot_pnl.cpp:344
+msgid "Restore status for 'once' command and reload data (F9)."
+msgstr ""
+
+#: udav/calc_dlg.cpp:63 udav/data_dlg.cpp:85 udav/data_dlg.cpp:143
+#: udav/subplot_dlg.cpp:212 mgllab/dialogs.cpp:1315
+msgid "Result"
+msgstr ""
+
+#: udav/data_dlg.cpp:124
+msgid "Result (will have sizes "
+msgstr ""
+
+#: udav/style_dlg.cpp:201 udav/subplot_dlg.cpp:214 mgllab/dialogs.cpp:408
+msgid "Resulting string"
+msgstr ""
+
+#: src/parser.cpp:1439
+msgid "Return from function"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:148
+msgid "Right bottom edge"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:156
+msgid "Right top edge"
+msgstr ""
+
+#: mgllab/table.cpp:166 mgllab/table.cpp:782
+msgid "Roll"
+msgstr ""
+
+#: src/exec_dat.cpp:1591
+msgid "Roll data along direction(s)"
+msgstr ""
+
+#. rotate menu
+#: udav/plot_pnl.cpp:540
+msgid "Rotate"
+msgstr ""
+
+#: widgets/qt.cpp:1110 udav/plot_pnl.cpp:310
+msgid "Rotate by mouse"
+msgstr ""
+
+#: udav/plot_pnl.cpp:545
+msgid "Rotate down"
+msgstr ""
+
+#: udav/plot_pnl.cpp:549
+msgid "Rotate left"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:164 mgllab/dialogs.cpp:1294
+msgid "Rotate on"
+msgstr ""
+
+#: widgets/fltk.cpp:841
+msgid "Rotate picture by holding left mouse button"
+msgstr ""
+
+#: src/exec_set.cpp:735
+msgid "Rotate plot"
+msgstr ""
+
+#: udav/plot_pnl.cpp:553
+msgid "Rotate right"
+msgstr ""
+
+#: udav/plot_pnl.cpp:541
+msgid "Rotate up"
+msgstr ""
+
+#: mgllab/dialogs.cpp:356
+msgid "Rotation"
+msgstr ""
+
+#: widgets/qt.cpp:1254
+msgid "Run slideshow (CTRl+F5)."
+msgstr ""
+
+#: udav/plot_pnl.cpp:570
+msgid ""
+"Run slideshow (Ctrl+F5). If no parameter specified\n"
+"then the dialog with slideshow options will appear."
+msgstr ""
+
+#: widgets/fltk.cpp:886
+msgid "Run/Stop slideshow (graphics animation)"
+msgstr ""
+
+#: udav/prop_dlg.cpp:141
+msgid "Russian"
+msgstr ""
+
+#: widgets/qt.cpp:1080 udav/plot_pnl.cpp:488
+msgid "STL"
+msgstr ""
+
+#: widgets/qt.cpp:1073 udav/plot_pnl.cpp:480
+msgid "SVG"
+msgstr ""
+
+#: udav/style_dlg.cpp:107
+msgid "Saturation"
+msgstr ""
+
+#: udav/setup_dlg.cpp:143 mgllab/editor.cpp:282
+msgid "Save"
+msgstr ""
+
+#: mgllab/help.cpp:250 mgllab/table.cpp:456
+msgid "Save Data?"
+msgstr ""
+
+#: widgets/fltk.cpp:573 mgllab/mgllab.cpp:212
+msgid "Save File As?"
+msgstr ""
+
+#: udav/anim_dlg.cpp:83
+msgid "Save JPEG frames"
+msgstr ""
+
+#: udav/udav_wnd.cpp:290 mgllab/mgllab.cpp:279
+msgid "Save as ..."
+msgstr ""
+
+#: udav/dat_pnl.cpp:688
+msgid "Save data"
+msgstr ""
+
+#: src/exec_dat.cpp:1594
+msgid "Save data to HDF5 file"
+msgstr ""
+
+#: udav/dat_pnl.cpp:690
+msgid "Save data to a file (Ctrl+Shift+S)."
+msgstr ""
+
+#: src/exec_dat.cpp:1593 mgllab/table.cpp:842
+msgid "Save data to file"
+msgstr ""
+
+#: mgllab/mgllab.cpp:278
+msgid "Save file"
+msgstr ""
+
+#: mgllab/mgllab.cpp:470
+msgid "Save file before redrawing"
+msgstr ""
+
+#: udav/udav_wnd.cpp:201
+msgid "Save script"
+msgstr ""
+
+#: udav/udav_wnd.cpp:203
+msgid "Save script to a file (Ctrl+S)"
+msgstr ""
+
+#: mgllab/editor.cpp:508
+msgid "Save script to file"
+msgstr ""
+
+#: mgllab/help.cpp:172
+msgid "Save selected data to file."
+msgstr ""
+
+#: mgllab/table.cpp:751
+msgid "Save to file"
+msgstr ""
+
+#: udav/udav_wnd.cpp:672
+msgid "Saving aborted"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:179 mgllab/dialogs.cpp:720
+msgid "Scale and rotate"
+msgstr ""
+
+#: udav/udav_wnd.cpp:237
+msgid "Script"
+msgstr ""
+
+#: udav/find_dlg.cpp:43 mgllab/editor.cpp:563
+msgid "Search backward"
+msgstr ""
+
+#: udav/text_pnl.cpp:543 mgllab/mgllab.cpp:295
+msgid "Select all"
+msgstr ""
+
+#: udav/text_pnl.cpp:585
+msgid "Select and insert file name."
+msgstr ""
+
+#: udav/text_pnl.cpp:589
+msgid "Select and insert folder name."
+msgstr ""
+
+#: mgllab/dialogs.cpp:565
+msgid "Select data argument"
+msgstr ""
+
+#: mgllab/dialogs.cpp:160
+msgid "Select direction"
+msgstr ""
+
+#: mgllab/editor.cpp:654
+msgid "Select file name"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:339 udav/newcmd_dlg.cpp:357
+msgid "Select first the proper kind of arguments"
+msgstr ""
+
+#: mgllab/editor.cpp:667
+msgid "Select folder name"
+msgstr ""
+
+#: udav/info_dlg.cpp:39
+msgid "Select kind of plot"
+msgstr ""
+
+#: src/exec_set.cpp:749
+msgid "Select variant of plot style(s)"
+msgstr ""
+
+#: mgllab/mathgl.cpp:166
+msgid "Set"
+msgstr ""
+
+#: src/exec_set.cpp:745
+msgid "Set additional tick and axis labels shift"
+msgstr ""
+
+#: src/exec_set.cpp:695
+msgid "Set ambient light brightness"
+msgstr ""
+
+#: src/exec_set.cpp:716
+msgid "Set arbitrary position of plot in picture"
+msgstr ""
+
+#: udav/udav_wnd.cpp:315 mgllab/mgllab.cpp:321
+msgid "Set arguments"
+msgstr ""
+
+#: src/exec_set.cpp:697
+msgid "Set aspect ration"
+msgstr ""
+
+#: src/exec_set.cpp:699
+msgid "Set axis and tick style"
+msgstr ""
+
+#: src/exec_set.cpp:725
+msgid "Set axis origin"
+msgstr ""
+
+#: src/exec_set.cpp:732
+msgid "Set axis ranges"
+msgstr ""
+
+#: src/exec_set.cpp:701
+msgid "Set bounding box for 2d export"
+msgstr ""
+
+#: src/exec_set.cpp:722
+msgid "Set brush for given mask id"
+msgstr ""
+
+#: src/exec_set.cpp:706
+msgid "Set color range"
+msgstr ""
+
+#: src/exec_dat.cpp:1556
+msgid "Set column id for data"
+msgstr ""
+
+#: mgllab/dialogs.cpp:108
+msgid "Set cutting off/on for particular plot"
+msgstr ""
+
+#: udav/open_dlg.cpp:62
+msgid "Set data sizes manually"
+msgstr ""
+
+#: src/exec_set.cpp:700
+msgid "Set default bars width"
+msgstr ""
+
+#: src/exec_set.cpp:730
+msgid "Set default filename"
+msgstr ""
+
+#: src/exec_set.cpp:694
+msgid "Set default transparency"
+msgstr ""
+
+#: src/exec_set.cpp:709
+msgid "Set diffusive light brightness"
+msgstr ""
+
+#: src/exec_set.cpp:710
+msgid "Set draw region for quality&4"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:47 udav/subplot_dlg.cpp:89
+msgid "Set drawing area as cell of matrix nx*ny."
+msgstr ""
+
+#: udav/subplot_dlg.cpp:110
+msgid "Set drawing area as cells of column."
+msgstr ""
+
+#: udav/subplot_dlg.cpp:64 udav/subplot_dlg.cpp:140
+msgid "Set drawing area as cells of matrix nx*ny."
+msgstr ""
+
+#: udav/subplot_dlg.cpp:127
+msgid "Set drawing area as cells of stick."
+msgstr ""
+
+#: mgllab/dialogs.cpp:117
+msgid "Set lighting off/on for particular plot"
+msgstr ""
+
+#: src/exec_set.cpp:723
+msgid "Set number of lines in mesh/fall/vect and so on"
+msgstr ""
+
+#: src/exec_set.cpp:717
+msgid "Set number of marks in the legend"
+msgstr ""
+
+#: src/exec_set.cpp:711
+msgid "Set number of visible faces"
+msgstr ""
+
+#: src/exec_set.cpp:727
+msgid "Set palette for 1D plots"
+msgstr ""
+
+#: src/exec_set.cpp:729
+msgid "Set perspective"
+msgstr ""
+
+#: src/exec_set.cpp:737
+msgid "Set picture size"
+msgstr ""
+
+#: src/exec_set.cpp:731
+msgid "Set plot quality"
+msgstr ""
+
+#: src/exec_set.cpp:742
+msgid "Set position of plot as cell of matrix"
+msgstr ""
+
+#: src/exec_set.cpp:724
+msgid "Set position of plot block in matrix"
+msgstr ""
+
+#: src/exec_set.cpp:705
+msgid "Set position of plot inside cell of column"
+msgstr ""
+
+#: src/exec_set.cpp:715
+msgid "Set position of plot inside cell of matrix"
+msgstr ""
+
+#: src/exec_set.cpp:741
+msgid "Set position of plot inside cell of rotated stick"
+msgstr ""
+
+#: src/exec_set.cpp:740
+msgid "Set position of plot inside cell of sheared stick"
+msgstr ""
+
+#: src/exec_set.cpp:753
+msgid "Set range for x-axis"
+msgstr ""
+
+#: src/exec_set.cpp:755
+msgid "Set range for y-axis"
+msgstr ""
+
+#: src/exec_set.cpp:759
+msgid "Set range for z-axis"
+msgstr ""
+
+#: src/exec_set.cpp:738
+msgid "Set scaling factor for further setsize"
+msgstr ""
+
+#: mgllab/mathgl.cpp:143
+msgid "Set script arguments"
+msgstr ""
+
+#: mgllab/dialogs.cpp:105
+msgid "Set size for text, marks and others"
+msgstr ""
+
+#: src/exec_set.cpp:696
+msgid "Set size of arrows"
+msgstr ""
+
+#: src/exec_set.cpp:721
+msgid "Set size of markers"
+msgstr ""
+
+#: src/exec_set.cpp:728
+msgid "Set size of semi-transparent area around line"
+msgstr ""
+
+#: src/exec_set.cpp:726
+msgid "Set tick labels drawing at origin"
+msgstr ""
+
+#: src/exec_set.cpp:744
+msgid "Set tick length"
+msgstr ""
+
+#: src/exec_set.cpp:707
+msgid "Set ticks for colorbar"
+msgstr ""
+
+#: src/exec_set.cpp:754
+msgid "Set ticks for x-axis"
+msgstr ""
+
+#: src/exec_set.cpp:756
+msgid "Set ticks for y-axis"
+msgstr ""
+
+#: src/exec_set.cpp:760
+msgid "Set ticks for z-axis"
+msgstr ""
+
+#: src/exec_set.cpp:746
+msgid "Set ticks in time format"
+msgstr ""
+
+#: src/exec_set.cpp:748
+msgid "Set ticks tuning"
+msgstr ""
+
+#: src/exec_set.cpp:736
+msgid "Set to auto rotate text or not"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:196
+msgid "Set to use whole area (style '#')"
+msgstr ""
+
+#: src/exec_set.cpp:747
+msgid "Set type transparency"
+msgstr ""
+
+#: widgets/qt.cpp:1209
+msgid "Set value of \\phi angle."
+msgstr ""
+
+#: udav/plot_pnl.cpp:472
+msgid ""
+"Set value of \\phi angle.\n"
+"You can use keys (Shift+Meta+Left or Shift+Meta+Right)."
+msgstr ""
+
+#: widgets/qt.cpp:1203
+msgid "Set value of \\theta angle."
+msgstr ""
+
+#: udav/plot_pnl.cpp:466
+msgid ""
+"Set value of \\theta angle.\n"
+"You can use keys (Shift+Meta+Up or Shift+Meta+Down)."
+msgstr ""
+
+#: udav/udav_wnd.cpp:311
+msgid "Settings"
+msgstr ""
+
+#: mgllab/mgllab.cpp:319
+msgid "Setup"
+msgstr ""
+
+#: mgllab/mgllab.cpp:322
+msgid "Setup animation"
+msgstr ""
+
+#: udav/prop_dlg.cpp:80
+msgid "Setup colors for:"
+msgstr ""
+
+#: src/exec_set.cpp:713
+msgid "Setup font"
+msgstr ""
+
+#: src/exec_set.cpp:718
+msgid "Setup light"
+msgstr ""
+
+#: src/exec_prm.cpp:579
+msgid "Setup or draw axis"
+msgstr ""
+
+#: src/exec_set.cpp:708
+msgid "Setup plot points cutting"
+msgstr ""
+
+#: mgllab/dialogs.cpp:947
+msgid "Setup script"
+msgstr ""
+
+#: udav/plot_pnl.cpp:573
+msgid "Setup show"
+msgstr ""
+
+#: udav/dat_pnl.cpp:623
+msgid "Sew data along direction(s)"
+msgstr ""
+
+#: mgllab/table.cpp:166 mgllab/table.cpp:783
+msgid "Sew phase"
+msgstr ""
+
+#: mgllab/dialogs.cpp:350
+msgid "Sharp colors"
+msgstr ""
+
+#: src/exec_set.cpp:739
+msgid "Shear plot"
+msgstr ""
+
+#: widgets/fltk.cpp:879
+msgid "Shift the picture down"
+msgstr ""
+
+#: widgets/fltk.cpp:871
+msgid "Shift the picture left"
+msgstr ""
+
+#: widgets/fltk.cpp:877
+msgid "Shift the picture right"
+msgstr ""
+
+#: widgets/fltk.cpp:869
+msgid "Shift the picture up"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:56 mgllab/dialogs.cpp:737
+msgid "Short description of selected command"
+msgstr ""
+
+#: udav/info_dlg.cpp:54
+msgid "Short information about the data."
+msgstr ""
+
+#: udav/hint_dlg.cpp:62
+msgid "Show at startup"
+msgstr ""
+
+#: udav/udav_wnd.cpp:210
+msgid ""
+"Show calculator which evaluate and help to type textual formulas.\n"
+"Textual formulas may contain data variables too."
+msgstr ""
+
+#: mgllab/editor.cpp:525 mgllab/editor.cpp:527
+msgid "Show calculator window"
+msgstr ""
+
+#: udav/udav_wnd.cpp:314
+msgid "Show dialog for UDAV properties."
+msgstr ""
+
+#: udav/text_pnl.cpp:560 udav/plot_pnl.cpp:441
+msgid "Show dialog for new command or edit arguments of existed one."
+msgstr ""
+
+#: udav/text_pnl.cpp:564 udav/plot_pnl.cpp:446
+msgid "Show dialog for new inplot and put it into the script."
+msgstr ""
+
+#: udav/text_pnl.cpp:577
+msgid ""
+"Show dialog for options and put it into the script.\n"
+"Options are used for additional setup the plot."
+msgstr ""
+
+#: udav/text_pnl.cpp:598
+msgid ""
+"Show dialog for plot setup and put code into the script.\n"
+"This dialog setup axis, labels, lighting and other general things."
+msgstr ""
+
+#: udav/text_pnl.cpp:573
+msgid ""
+"Show dialog for styles and put it into the script.\n"
+"Styles define the plot view (color scheme, marks, dashing and so on)."
+msgstr ""
+
+#: udav/text_pnl.cpp:548
+msgid "Show dialog for text finding (Ctrl+F)."
+msgstr ""
+
+#: udav/udav_wnd.cpp:326
+msgid "Show help on MGL commands (F1)."
+msgstr ""
+
+#: udav/udav_wnd.cpp:219
+msgid "Show hidden plots"
+msgstr ""
+
+#: mgllab/help.cpp:303
+msgid "Show hint on startup"
+msgstr ""
+
+#: udav/udav_wnd.cpp:330
+msgid "Show hints of MGL usage."
+msgstr ""
+
+#: udav/udav_wnd.cpp:213
+msgid "Show info"
+msgstr ""
+
+#: mgllab/mgllab.cpp:297
+msgid "Show lines"
+msgstr ""
+
+#: widgets/fltk.cpp:887
+msgid "Show next frame in slideshow"
+msgstr ""
+
+#: widgets/qt.cpp:1249 udav/plot_pnl.cpp:563
+msgid "Show next slide (Ctrl+.)."
+msgstr ""
+
+#: widgets/fltk.cpp:882
+msgid "Show previous frame in slideshow"
+msgstr ""
+
+#: widgets/qt.cpp:1258 udav/plot_pnl.cpp:578
+msgid "Show previous slide (Ctrl+,)."
+msgstr ""
+
+#: mgllab/table.cpp:777
+msgid "Sin FFT"
+msgstr ""
+
+#: udav/dat_pnl.cpp:620
+msgid "Sin-Fourier transform along direction(s)"
+msgstr ""
+
+#: src/exec_dat.cpp:1598
+msgid "Sin-Fourier transform at some direction"
+msgstr ""
+
+#: mgllab/table.cpp:165
+msgid "Sinus FFT"
+msgstr ""
+
+#: udav/opt_dlg.cpp:70 mgllab/dialogs.cpp:104 mgllab/dialogs.cpp:359
+msgid "Size"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:114
+msgid "Size of column"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:131
+msgid "Size of stick"
+msgstr ""
+
+#. size menu
+#: udav/mem_pnl.cpp:68 udav/dat_pnl.cpp:765 mgllab/dialogs.cpp:1015
+#: mgllab/table.cpp:757
+msgid "Sizes"
+msgstr ""
+
+#: src/parser.cpp:1425
+msgid "Skip commands and iterate for-loop again"
+msgstr ""
+
+#: widgets/qt.cpp:1251 udav/plot_pnl.cpp:566
+msgid "Slideshow"
+msgstr ""
+
+#: mgllab/table.cpp:163 mgllab/table.cpp:771
+msgid "Smooth"
+msgstr ""
+
+#: src/exec_dat.cpp:1599
+msgid "Smooth data"
+msgstr ""
+
+#: udav/dat_pnl.cpp:613
+msgid "Smooth data along direction(s)"
+msgstr ""
+
+#: src/exec_dat.cpp:1582
+msgid "Solve Hamiltonian ODE (find GO ray or trajectory)"
+msgstr ""
+
+#: src/exec_dat.cpp:1573
+msgid "Solve ODE"
+msgstr ""
+
+#: src/exec_dat.cpp:1575
+msgid "Solve PDE"
+msgstr ""
+
+#: src/exec_dat.cpp:1580
+msgid "Solve PDE in accompanied coordinates for 2d case"
+msgstr ""
+
+#: src/exec_dat.cpp:1581
+msgid "Solve PDE in accompanied coordinates for 3d case"
+msgstr ""
+
+#: src/exec_dat.cpp:1524
+msgid "Solve PDE using advanced method (X-Y only)"
+msgstr ""
+
+#: src/exec_dat.cpp:1613
+msgid "Solve tridiagonal matrix"
+msgstr ""
+
+#: src/exec_dat.cpp:1601
+msgid "Sort data by values in column"
+msgstr ""
+
+#: udav/prop_dlg.cpp:141
+msgid "Spanish"
+msgstr ""
+
+#: udav/calc_dlg.cpp:194
+msgid "Special"
+msgstr ""
+
+#: mgllab/table.cpp:129
+msgid ""
+"Specify new data size\n"
+"Data will be interpolated"
+msgstr ""
+
+#: mgllab/table.cpp:114
+msgid ""
+"Specify new data size\n"
+"Data will be zero filled"
+msgstr ""
+
+#: mgllab/table.cpp:144
+msgid ""
+"Specify the skipping step\n"
+"Each m-th point will be saved only"
+msgstr ""
+
+#: udav/dat_pnl.cpp:778 mgllab/table.cpp:760
+msgid "Squeeze"
+msgstr ""
+
+#: src/exec_dat.cpp:1602
+msgid "Squeeze data"
+msgstr ""
+
+#: udav/setup_dlg.cpp:84
+msgid "Start"
+msgstr ""
+
+#: src/parser.cpp:1434
+msgid "Start function definition and stop execution of main script"
+msgstr ""
+
+#: src/parser.cpp:1437
+msgid "Start next for-loop iteration"
+msgstr ""
+
+#: src/parser.cpp:1438
+msgid "Start/close commands which should executed only once"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:76
+msgid "Starting cell index"
+msgstr ""
+
+#: udav/setup_dlg.cpp:117
+msgid "State"
+msgstr ""
+
+#: src/exec_dat.cpp:1539
+msgid "Step for pulse diffraction"
+msgstr ""
+
+#: widgets/qt.cpp:1135 udav/plot_pnl.cpp:347
+msgid "Stop"
+msgstr ""
+
+#: widgets/fltk.cpp:850
+msgid "Stop drawing"
+msgstr ""
+
+#: src/parser.cpp:1440
+msgid "Stop execution"
+msgstr ""
+
+#: udav/plot_pnl.cpp:349
+msgid "Stop script execution (F7)."
+msgstr ""
+
+#: udav/args_dlg.cpp:59 mgllab/mathgl.cpp:162
+msgid "String for $0"
+msgstr ""
+
+#: udav/args_dlg.cpp:41 mgllab/mathgl.cpp:144
+msgid "String for $1"
+msgstr ""
+
+#: udav/args_dlg.cpp:43 mgllab/mathgl.cpp:146
+msgid "String for $2"
+msgstr ""
+
+#: udav/args_dlg.cpp:45 mgllab/mathgl.cpp:148
+msgid "String for $3"
+msgstr ""
+
+#: udav/args_dlg.cpp:47 mgllab/mathgl.cpp:150
+msgid "String for $4"
+msgstr ""
+
+#: udav/args_dlg.cpp:49 mgllab/mathgl.cpp:152
+msgid "String for $5"
+msgstr ""
+
+#: udav/args_dlg.cpp:51 mgllab/mathgl.cpp:154
+msgid "String for $6"
+msgstr ""
+
+#: udav/args_dlg.cpp:53 mgllab/mathgl.cpp:156
+msgid "String for $7"
+msgstr ""
+
+#: udav/args_dlg.cpp:55 mgllab/mathgl.cpp:158
+msgid "String for $8"
+msgstr ""
+
+#: udav/args_dlg.cpp:57 mgllab/mathgl.cpp:160
+msgid "String for $9"
+msgstr ""
+
+#: udav/files_dlg.cpp:38
+msgid "String for %1"
+msgstr ""
+
+#: udav/files_dlg.cpp:40
+msgid "String for %2"
+msgstr ""
+
+#: udav/files_dlg.cpp:42
+msgid "String for %3"
+msgstr ""
+
+#: udav/files_dlg.cpp:44
+msgid "String for %4"
+msgstr ""
+
+#: udav/files_dlg.cpp:46
+msgid "String for %5"
+msgstr ""
+
+#: udav/files_dlg.cpp:48
+msgid "String for %6"
+msgstr ""
+
+#: udav/files_dlg.cpp:50
+msgid "String for %7"
+msgstr ""
+
+#: udav/files_dlg.cpp:52
+msgid "String for %8"
+msgstr ""
+
+#: udav/files_dlg.cpp:54
+msgid "String for %9"
+msgstr ""
+
+#: udav/prop_dlg.cpp:85
+msgid "Strings"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:208 mgllab/dialogs.cpp:1314
+msgid "Style"
+msgstr ""
+
+#: udav/setup_dlg.cpp:80
+msgid "SubTicks"
+msgstr ""
+
+#: mgllab/dialogs.cpp:959
+msgid "Subticks"
+msgstr ""
+
+#: src/exec_dat.cpp:1605
+msgid "Subtract data or number"
+msgstr ""
+
+#: mgllab/table.cpp:795
+msgid "Subtract to"
+msgstr ""
+
+#: udav/prop_dlg.cpp:94
+msgid "Suffixes"
+msgstr ""
+
+#: udav/dat_pnl.cpp:539
+msgid "Sum along direction(s)"
+msgstr ""
+
+#: udav/dat_pnl.cpp:614
+msgid "Summarize data along direction(s)"
+msgstr ""
+
+#. { _("Histogram of"),        0, hist_cb },
+#: mgllab/table.cpp:342 mgllab/table.cpp:788
+msgid "Summation of"
+msgstr ""
+
+#: src/exec_dat.cpp:1607
+msgid "Swap data (useful after Fourier transform)"
+msgstr ""
+
+#: udav/dat_pnl.cpp:618
+msgid "Swap data along direction(s)"
+msgstr ""
+
+#: mgllab/table.cpp:164 mgllab/table.cpp:776
+msgid "Swap parts"
+msgstr ""
+
+#: src/exec_set.cpp:712
+msgid "Switch on/off fog"
+msgstr ""
+
+#: src/exec_set.cpp:714
+msgid "Switch on/off gray-scale mode"
+msgstr ""
+
+#: widgets/fltk.cpp:837
+msgid "Switch on/off grid drawing"
+msgstr ""
+
+#: udav/plot_pnl.cpp:307
+msgid "Switch on/off grid of absolute coordinates (Ctrl+G)."
+msgstr ""
+
+#: widgets/qt.cpp:1108
+msgid "Switch on/off lightning for the graphics (Alt+L)."
+msgstr ""
+
+#: udav/plot_pnl.cpp:301
+msgid "Switch on/off lightning for the graphics (Ctrl+L)."
+msgstr ""
+
+#: widgets/fltk.cpp:834
+msgid "Switch on/off lightning in the picture"
+msgstr ""
+
+#: widgets/qt.cpp:1114 udav/plot_pnl.cpp:314
+msgid ""
+"Switch on/off mouse handling of the graphics\n"
+"(rotation, shifting, zooming and perspective)."
+msgstr ""
+
+#: widgets/qt.cpp:1120
+msgid "Switch on/off mouse zoom of selected region."
+msgstr ""
+
+#: src/exec_set.cpp:743
+msgid "Switch on/off to use ternary axis"
+msgstr ""
+
+#: src/exec_set.cpp:693
+msgid "Switch on/off transparency"
+msgstr ""
+
+#: widgets/qt.cpp:1102
+msgid "Switch on/off transparency for the graphics (Alt+T)."
+msgstr ""
+
+#: udav/plot_pnl.cpp:294
+msgid "Switch on/off transparency for the graphics (Ctrl+T)."
+msgstr ""
+
+#: widgets/fltk.cpp:831
+msgid "Switch on/off transparency in the picture"
+msgstr ""
+
+#: mgllab/table.cpp:552
+msgid "Symmetrical range"
+msgstr ""
+
+#: udav/dat_pnl.cpp:366
+msgid "Symmetrical?"
+msgstr ""
+
+#: src/addon.cpp:111 src/base_cf.cpp:266
+#, c-format
+msgid "TEST: %s\n"
+msgstr ""
+
+#: udav/open_dlg.cpp:82 udav/setup_dlg.cpp:88 mgllab/dialogs.cpp:961
+msgid "Template"
+msgstr ""
+
+#: udav/setup_dlg.cpp:140
+msgid "Template name"
+msgstr ""
+
+#: udav/setup_dlg.cpp:163
+msgid "Template saved"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1038
+msgid "Ternary"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1472
+msgid "Text"
+msgstr ""
+
+#: udav/style_dlg.cpp:167 mgllab/dialogs.cpp:376
+msgid "Text align"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:172 mgllab/dialogs.cpp:713
+msgid "Text and legend"
+msgstr ""
+
+#: udav/style_dlg.cpp:164
+msgid "Text color"
+msgstr ""
+
+#: udav/style_dlg.cpp:123 mgllab/dialogs.cpp:343
+msgid "Text on contours"
+msgstr ""
+
+#: mgllab/dialogs.cpp:367
+msgid "Text style"
+msgstr ""
+
+#: udav/hint_dlg.cpp:48 mgllab/help.cpp:282
+msgid ""
+"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."
+msgstr ""
+
+#: mgllab/editor.cpp:280
+msgid ""
+"The current file has not been saved.\n"
+"Would you like to save it now?"
+msgstr ""
+
+#: udav/hint_dlg.cpp:50 mgllab/help.cpp:284
+msgid ""
+"The special dialog (Edit|Insert|New Command) help you select the command, "
+"fill its arguments and put it into the script."
+msgstr ""
+
+#: src/crust.cpp:559
+msgid ""
+"There are duplicated or indistinguishably adjacent points for triangulation."
+msgstr ""
+
+#. mglScrStr
+#: src/base.cpp:236
+msgid "There is changing temporary data in script"
+msgstr ""
+
+#: udav/text_pnl.cpp:124
+msgid "There is manual primitives."
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:343
+msgid "There is no 'fmt' argument for this command"
+msgstr ""
+
+#: udav/text_pnl.cpp:137 mgllab/editor.cpp:681
+msgid "There is no fitted formula."
+msgstr ""
+
+#: utils/mglcgi.cpp:74
+#, c-format
+msgid "There is no query. Exit.\n"
+msgstr ""
+
+#: udav/text_pnl.cpp:109
+msgid "There is no selection to evaluate."
+msgstr ""
+
+#: udav/hint_dlg.cpp:47 mgllab/help.cpp:281
+msgid ""
+"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."
+msgstr ""
+
+#. mglScrCmd
+#: src/base.cpp:234
+msgid "There is too long string(s) in script"
+msgstr ""
+
+#. mglScrLong
+#: src/base.cpp:235
+msgid "There is unbalanced ' in script"
+msgstr ""
+
+#. mglWarnSpc
+#: src/base.cpp:232
+msgid "There is wrong argument(s) in script"
+msgstr ""
+
+#. mglScrArg
+#: src/base.cpp:233
+msgid "There is wrong command(s) in script"
+msgstr ""
+
+#: widgets/fltk.cpp:863
+msgid "Theta angle (tilt z-axis)"
+msgstr ""
+
+#: mgllab/table.cpp:494
+msgid "This operation is not supported for this kind of data."
+msgstr ""
+
+#: udav/setup_dlg.cpp:76 mgllab/dialogs.cpp:955
+msgid "Ticks"
+msgstr ""
+
+#: mgllab/dialogs.cpp:960
+msgid "Ticks start"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1031
+msgid "Time ticks"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:204 mgllab/dialogs.cpp:1313
+msgid "Title"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:206
+msgid "Title for plot. Can be used in SubPlot or MultiPlot only."
+msgstr ""
+
+#: udav/dat_pnl.cpp:351 udav/dat_pnl.cpp:366 udav/dat_pnl.cpp:377
+#: udav/dat_pnl.cpp:424 udav/dat_pnl.cpp:453 mgllab/table.cpp:609
+msgid "To"
+msgstr ""
+
+#: udav/calc_dlg.cpp:66 udav/setup_dlg.cpp:147
+msgid "To script"
+msgstr ""
+
+#: udav/dat_pnl.cpp:790
+msgid "Transform"
+msgstr ""
+
+#: udav/dat_pnl.cpp:792
+msgid "Transform data along dimension(s) (Ctrl+Shift+T)."
+msgstr ""
+
+#: mgllab/dialogs.cpp:346
+msgid "Transparency"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1043
+msgid "Transparency type"
+msgstr ""
+
+#: mgllab/table.cpp:762
+msgid "Transpose"
+msgstr ""
+
+#: mgllab/table.cpp:670
+msgid "Transpose data"
+msgstr ""
+
+#: src/exec_dat.cpp:1611
+msgid "Transpose data array"
+msgstr ""
+
+#: mgllab/table.cpp:860
+msgid "Transpose data dimensions"
+msgstr ""
+
+#: udav/dat_pnl.cpp:612
+msgid "Transpose data with new dimensions"
+msgstr ""
+
+#: udav/calc_dlg.cpp:192
+msgid "Trigonometric"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1034
+msgid "Tune ticks"
+msgstr ""
+
+#: mgllab/table.cpp:169 mgllab/table.cpp:344
+msgid "Type of operation"
+msgstr ""
+
+#: mgllab/table.cpp:174
+msgid "Type of smoothing"
+msgstr ""
+
+#. N
+#: udav/style_dlg.cpp:246 mgllab/dialogs.cpp:54
+msgid "U - indigo"
+msgstr ""
+
+#: udav/text_pnl.cpp:109 udav/text_pnl.cpp:124 udav/text_pnl.cpp:137
+#: udav/udav_wnd.cpp:340
+msgid "UDAV"
+msgstr ""
+
+#: udav/opt_dlg.cpp:31
+msgid "UDAV - Add options"
+msgstr ""
+
+#: udav/anim_dlg.cpp:35
+msgid "UDAV - Animation setup"
+msgstr ""
+
+#: udav/dat_pnl.cpp:388
+msgid "UDAV - Clear data"
+msgstr ""
+
+#: udav/dat_pnl.cpp:424
+msgid "UDAV - Crop data"
+msgstr ""
+
+#: udav/dat_pnl.cpp:255
+msgid "UDAV - Export to PNG"
+msgstr ""
+
+#: udav/dat_pnl.cpp:351
+msgid "UDAV - Fill data"
+msgstr ""
+
+#: udav/find_dlg.cpp:33
+msgid "UDAV - Find"
+msgstr ""
+
+#: udav/dat_pnl.cpp:485
+msgid "UDAV - Go to slice"
+msgstr ""
+
+#: udav/hint_dlg.cpp:55
+msgid "UDAV - Hint"
+msgstr ""
+
+#: udav/dat_pnl.cpp:277
+msgid "UDAV - Import PNG"
+msgstr ""
+
+#: udav/prop_dlg.cpp:192 udav/prop_dlg.cpp:198 udav/newcmd_dlg.cpp:324
+#: udav/text_pnl.cpp:145 udav/open_dlg.cpp:101
+msgid "UDAV - Insert filename"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:329 udav/text_pnl.cpp:152
+msgid "UDAV - Insert path"
+msgstr ""
+
+#: udav/style_dlg.cpp:48 udav/data_dlg.cpp:33
+msgid "UDAV - Insert style/scheme"
+msgstr ""
+
+#: udav/dat_pnl.cpp:270
+msgid "UDAV - Load data"
+msgstr ""
+
+#: udav/dat_pnl.cpp:450
+msgid "UDAV - Make histogram"
+msgstr ""
+
+#: udav/mem_pnl.cpp:84
+msgid "UDAV - New variable"
+msgstr ""
+
+#: udav/dat_pnl.cpp:377
+msgid "UDAV - Normalize by slice"
+msgstr ""
+
+#: udav/dat_pnl.cpp:366
+msgid "UDAV - Normalize data"
+msgstr ""
+
+#: udav/open_dlg.cpp:49
+msgid "UDAV - Open data file"
+msgstr ""
+
+#: udav/udav_wnd.cpp:633
+msgid "UDAV - Open file"
+msgstr ""
+
+#: udav/prop_dlg.cpp:60 udav/prop_dlg.cpp:285
+msgid "UDAV - Properties"
+msgstr ""
+
+#: udav/dat_pnl.cpp:283
+msgid "UDAV - Read from HDF"
+msgstr ""
+
+#: udav/dat_pnl.cpp:436
+msgid "UDAV - Rearrange data"
+msgstr ""
+
+#: udav/dat_pnl.cpp:402
+msgid "UDAV - Resize data"
+msgstr ""
+
+#: udav/setup_dlg.cpp:159 udav/setup_dlg.cpp:163
+msgid "UDAV - Save template"
+msgstr ""
+
+#: udav/dat_pnl.cpp:261
+msgid "UDAV - Save to HDF"
+msgstr ""
+
+#: udav/dat_pnl.cpp:248
+msgid "UDAV - Save/export data"
+msgstr ""
+
+#: udav/args_dlg.cpp:32
+msgid "UDAV - Set script arguments"
+msgstr ""
+
+#: udav/files_dlg.cpp:29
+msgid "UDAV - Set template parameters"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:37
+msgid "UDAV - Setup inplot"
+msgstr ""
+
+#: udav/setup_dlg.cpp:39 udav/setup_dlg.cpp:190
+msgid "UDAV - Setup plot"
+msgstr ""
+
+#: udav/dat_pnl.cpp:413
+msgid "UDAV - Squeeze data"
+msgstr ""
+
+#: udav/udav_wnd.cpp:456
+msgid "UDAV - about"
+msgstr ""
+
+#: udav/anim_dlg.cpp:105
+msgid "UDAV - animation"
+msgstr ""
+
+#: udav/dat_pnl.cpp:608
+msgid "UDAV - change data"
+msgstr ""
+
+#: udav/opt_dlg.cpp:94 udav/opt_dlg.cpp:101 udav/opt_dlg.cpp:108
+#: udav/opt_dlg.cpp:115
+msgid "UDAV - command options"
+msgstr ""
+
+#: udav/mem_pnl.cpp:121
+msgid "UDAV - delete all data"
+msgstr ""
+
+#: udav/text_pnl.cpp:202
+msgid "UDAV - find text"
+msgstr ""
+
+#: udav/dat_pnl.cpp:536 udav/dat_pnl.cpp:566 udav/dat_pnl.cpp:572
+#: udav/dat_pnl.cpp:643
+msgid "UDAV - make new data"
+msgstr ""
+
+#: udav/text_pnl.cpp:431
+msgid "UDAV - open file"
+msgstr ""
+
+#: udav/udav_wnd.cpp:569 udav/udav_wnd.cpp:579 udav/udav_wnd.cpp:621
+msgid "UDAV - save current"
+msgstr ""
+
+#: udav/udav_wnd.cpp:669
+msgid "UDAV - save file"
+msgstr ""
+
+#: udav/style_dlg.cpp:160 mgllab/dialogs.cpp:371
+msgid "Underline"
+msgstr ""
+
+#. edit menu
+#: udav/text_pnl.cpp:516 mgllab/mgllab.cpp:291
+msgid "Undo"
+msgstr ""
+
+#: udav/text_pnl.cpp:518
+msgid "Undo editor change (Ctrl+Z)."
+msgstr ""
+
+#: mgllab/mgllab.cpp:127
+msgid "Untitled"
+msgstr ""
+
+#: mgllab/mgllab.cpp:343 mgllab/mgllab.cpp:347
+msgid "Untitled - mgllab"
+msgstr ""
+
+#: udav/mem_pnl.cpp:62
+msgid "Update list of data arrays"
+msgstr ""
+
+#: mgllab/dialogs.cpp:100
+msgid "Upper border for determining color or alpha"
+msgstr ""
+
+#: utils/mglconv.cpp:85
+#, c-format
+msgid "Usage:\tmglconv [parameter(s)] scriptfile\n"
+msgstr ""
+
+#: mgllab/mgllab.cpp:414
+#, c-format
+msgid "Usage:\tmgllab [parameter(s)] scriptfile\n"
+msgstr ""
+
+#: utils/mglview.cpp:69
+#, c-format
+msgid "Usage:\tmglview [parameter(s)] scriptfile\n"
+msgstr ""
+
+#: widgets/glut.cpp:103
+#, c-format
+msgid ""
+"Use 'a', 'd', 'w', 's', 'q', 'e' for changing view angles\n"
+"Use 'j', 'l', 'i', 'k' for changing light angles\n"
+"Use 'u', 'o' for changing distance to light\n"
+"Use 'r' for switching transparency\n"
+"Use 'f' for switching lightning\n"
+"Use 'E' for exporting to EPS file\n"
+"Use 'S' for exporting to SVG file\n"
+"Use 'J' for exporting to JPEG file\n"
+"Use 'P' for exporting to PNG file\n"
+"Use ',', '.' for show other frames\n"
+"Use 'm' for view movie\n"
+"Use 'h' for view this text\n"
+"Use 'x' for exit\n"
+msgstr ""
+
+#: udav/style_dlg.cpp:162
+msgid "Use color scheme"
+msgstr ""
+
+#: udav/prop_dlg.cpp:175
+msgid "Use dots plot for preview"
+msgstr ""
+
+#: mgllab/mgllab.cpp:474
+msgid "Use multi-threading for drawing"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:67 udav/opt_dlg.cpp:68 mgllab/dialogs.cpp:101
+msgid "Value"
+msgstr ""
+
+#: mgllab/dialogs.cpp:398
+msgid "Value for i-th color"
+msgstr ""
+
+#: mgllab/dialogs.cpp:727 mgllab/dialogs.cpp:1047
+msgid "Variant"
+msgstr ""
+
+#: mgllab/dialogs.cpp:728
+msgid ""
+"Variant 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."
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:170 mgllab/dialogs.cpp:711
+msgid "Vector plots"
+msgstr ""
+
+#: mgllab/dialogs.cpp:379
+msgid "Vertical align"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:55 udav/subplot_dlg.cpp:72 udav/subplot_dlg.cpp:97
+msgid "Vertical size"
+msgstr ""
+
+#. k
+#: udav/style_dlg.cpp:236 mgllab/dialogs.cpp:44
+msgid "W - lightgray"
+msgstr ""
+
+#: src/exec_dat.cpp:1615
+msgid "Wavelet transform at some direction"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:195
+msgid "Whole area"
+msgstr ""
+
+#: mgllab/mgllab.cpp:477
+msgid "Widget scheme"
+msgstr ""
+
+#: mgllab/dialogs.cpp:329
+msgid "Width"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:80
+msgid "Width of selected cells"
+msgstr ""
+
+#: src/data.cpp:1427
+#, c-format
+msgid ""
+"Widths are:\n"
+"Wa = %g\tWx = %g\tWy = %g\tWz = %g\n"
+msgstr ""
+
+#: mgllab/dialogs.cpp:348
+msgid "Wire or mesh"
+msgstr ""
+
+#: udav/style_dlg.cpp:120
+msgid "Wire or mesh plot"
+msgstr ""
+
+#: udav/style_dlg.cpp:159 mgllab/dialogs.cpp:370
+msgid "Wire style"
+msgstr ""
+
+#: src/exec_set.cpp:752
+msgid "Write current image to graphical file"
+msgstr ""
+
+#: udav/setup_dlg.cpp:48 mgllab/dialogs.cpp:950
+msgid "X axis"
+msgstr ""
+
+#: udav/setup_dlg.cpp:118
+msgid "X pos"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1065
+msgid "X position"
+msgstr ""
+
+#: udav/dat_pnl.cpp:413
+msgid "X-direction"
+msgstr ""
+
+#: udav/opt_dlg.cpp:38 mgllab/dialogs.cpp:85
+msgid "X-range"
+msgstr ""
+
+#: udav/dat_pnl.cpp:388 udav/dat_pnl.cpp:402 udav/dat_pnl.cpp:436
+msgid "X-size"
+msgstr ""
+
+#: mgllab/dialogs.cpp:568
+msgid "X-slice from"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:176
+msgid "X/Z"
+msgstr ""
+
+#: widgets/qt.cpp:1081 udav/plot_pnl.cpp:489
+msgid "XYZ"
+msgstr ""
+
+#. M
+#: udav/style_dlg.cpp:242 mgllab/dialogs.cpp:50
+msgid "Y - olive"
+msgstr ""
+
+#: udav/setup_dlg.cpp:49 mgllab/dialogs.cpp:963
+msgid "Y axis"
+msgstr ""
+
+#: udav/setup_dlg.cpp:119
+msgid "Y pos"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1066
+msgid "Y position"
+msgstr ""
+
+#: udav/dat_pnl.cpp:413
+msgid "Y-direction"
+msgstr ""
+
+#: udav/opt_dlg.cpp:41 mgllab/dialogs.cpp:89
+msgid "Y-range"
+msgstr ""
+
+#: udav/dat_pnl.cpp:388 udav/dat_pnl.cpp:402 udav/dat_pnl.cpp:436
+msgid "Y-size"
+msgstr ""
+
+#: mgllab/dialogs.cpp:571
+msgid "Y-slice from"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:180
+msgid "Y/Z"
+msgstr ""
+
+#: mgllab/help.cpp:135
+msgid "Yes"
+msgstr ""
+
+#: udav/hint_dlg.cpp:36 mgllab/help.cpp:270
+msgid ""
+"You can copy the current image to clipboard by pressing Ctrl-Shift-C. Later "
+"you can paste it directly into yours document or presentation."
+msgstr ""
+
+#: udav/hint_dlg.cpp:49 mgllab/help.cpp:283
+msgid ""
+"You can easily insert file or folder names, last fitted formula or numerical "
+"value of selection by using menu Edit|Insert."
+msgstr ""
+
+#: udav/hint_dlg.cpp:43 mgllab/help.cpp:277
+msgid ""
+"You can edit MGL file in any text editor. Also you can run it in console by "
+"help of commands: mglconv, mglview."
+msgstr ""
+
+#: udav/hint_dlg.cpp:37 mgllab/help.cpp:271
+msgid ""
+"You can export image into a set of format (EPS, SVG, PNG, JPEG) by pressing "
+"right mouse button inside image and selecting 'Export as ...'."
+msgstr ""
+
+#: udav/hint_dlg.cpp:41 mgllab/help.cpp:275
+msgid ""
+"You can put several plots in the same image by help of commands 'subplot' or "
+"'inplot'."
+msgstr ""
+
+#: udav/hint_dlg.cpp:51 mgllab/help.cpp:285
+msgid ""
+"You can put several plotting commands in the same line or in separate "
+"function, for highlighting all of them simultaneously."
+msgstr ""
+
+#: udav/hint_dlg.cpp:34 mgllab/help.cpp:268
+msgid ""
+"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."
+msgstr ""
+
+#: udav/hint_dlg.cpp:39 mgllab/help.cpp:273
+msgid ""
+"You can save the parameter of animation inside MGL script by using comment "
+"started from '##a ' or '##c ' for loops."
+msgstr ""
+
+#: udav/hint_dlg.cpp:38 mgllab/help.cpp:272
+msgid ""
+"You can setup colors for script highlighting in Property dialog. Just select "
+"menu item 'Settings/Properties'."
+msgstr ""
+
+#: udav/hint_dlg.cpp:33 mgllab/help.cpp:267
+msgid ""
+"You can shift axis range by pressing middle button and moving mouse. Also, "
+"you can zoom in/out axis range by using mouse wheel."
+msgstr ""
+
+#: udav/hint_dlg.cpp:46 mgllab/help.cpp:280
+msgid ""
+"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."
+msgstr ""
+
+#: udav/hint_dlg.cpp:44 mgllab/help.cpp:278
+msgid ""
+"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."
+msgstr ""
+
+#: udav/hint_dlg.cpp:45 mgllab/help.cpp:279
+msgid ""
+"You can use command 'stop' for terminating script parsing. It is useful if "
+"you don't want to execute a part of script."
+msgstr ""
+
+#: udav/hint_dlg.cpp:35 mgllab/help.cpp:269
+msgid ""
+"You may quickly draw the data from file. Just use: udav 'filename.dat' in "
+"command line."
+msgstr ""
+
+#: mgllab/dialogs.cpp:1529
+msgid "You need to enter text!"
+msgstr ""
+
+#: mgllab/table.cpp:367
+msgid "You need to provide output name"
+msgstr ""
+
+#: udav/prop_dlg.cpp:285
+msgid "You need to restart UDAV for applying the changes."
+msgstr ""
+
+#: mgllab/dialogs.cpp:592
+msgid "You need to select data array"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1489
+msgid "You need to select marker!"
+msgstr ""
+
+#: mgllab/table.cpp:190 mgllab/table.cpp:364
+msgid "You need to specify direction(s)"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:378 udav/newcmd_dlg.cpp:382
+msgid "You should put text inside ' ' for argument "
+msgstr ""
+
+#: udav/anim_dlg.cpp:106
+msgid "You should select one of case"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:386
+msgid "You should specify all optional arguments before "
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:370
+msgid "You should specify required argument "
+msgstr ""
+
+#: udav/setup_dlg.cpp:50 mgllab/dialogs.cpp:976
+msgid "Z axis"
+msgstr ""
+
+#: udav/setup_dlg.cpp:120
+msgid "Z pos"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1067
+msgid "Z position"
+msgstr ""
+
+#: udav/dat_pnl.cpp:413
+msgid "Z-direction"
+msgstr ""
+
+#: udav/opt_dlg.cpp:44 mgllab/dialogs.cpp:93
+msgid "Z-range"
+msgstr ""
+
+#: udav/dat_pnl.cpp:388 udav/dat_pnl.cpp:402 udav/dat_pnl.cpp:436
+msgid "Z-size"
+msgstr ""
+
+#: mgllab/dialogs.cpp:574
+msgid "Z-slice from"
+msgstr ""
+
+#: src/exec_set.cpp:758
+msgid "Zoom axis range"
+msgstr ""
+
+#: widgets/qt.cpp:1116
+msgid "Zoom by mouse"
+msgstr ""
+
+#: widgets/qt.cpp:1215
+msgid "Zoom graphics"
+msgstr ""
+
+#: widgets/qt.cpp:1225 udav/plot_pnl.cpp:515
+msgid "Zoom in"
+msgstr ""
+
+#: widgets/qt.cpp:1227 udav/plot_pnl.cpp:518
+msgid "Zoom in graphics."
+msgstr ""
+
+#: widgets/fltk.cpp:844
+msgid "Zoom in selected region of the picture"
+msgstr ""
+
+#. t->addAction(QPixmap(":/png/help-faq.png"), _("Examples"), this, SLOT(showExamples()));
+#: udav/help_pnl.cpp:55
+msgid "Zoom in text"
+msgstr ""
+
+#: widgets/fltk.cpp:873
+msgid "Zoom in the picture"
+msgstr ""
+
+#: widgets/qt.cpp:1229 udav/plot_pnl.cpp:521
+msgid "Zoom out"
+msgstr ""
+
+#: widgets/qt.cpp:1231 udav/plot_pnl.cpp:524
+msgid "Zoom out graphics."
+msgstr ""
+
+#: udav/help_pnl.cpp:56
+msgid "Zoom out text"
+msgstr ""
+
+#: widgets/fltk.cpp:875
+msgid "Zoom out the picture"
+msgstr ""
+
+#: src/exec_set.cpp:757
+msgid "Zoom plot region"
+msgstr ""
+
+#. zooming menu
+#: widgets/qt.cpp:1214 udav/plot_pnl.cpp:502
+msgid "Zoom/move"
+msgstr ""
+
+#: udav/style_dlg.cpp:131
+msgid "above"
+msgstr ""
+
+#: mgllab/dialogs.cpp:570 mgllab/dialogs.cpp:573 mgllab/dialogs.cpp:576
+msgid "all"
+msgstr ""
+
+#: mgllab/dialogs.cpp:581
+msgid "along"
+msgstr ""
+
+#: mgllab/table.cpp:171 mgllab/table.cpp:346
+msgid "along x"
+msgstr ""
+
+#: mgllab/table.cpp:172 mgllab/table.cpp:347
+msgid "along y"
+msgstr ""
+
+#: mgllab/table.cpp:173 mgllab/table.cpp:348
+msgid "along z"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1012
+msgid "alpha"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1296
+msgid "and"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1456
+msgid "arc"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1018
+msgid "arrows"
+msgstr ""
+
+#: udav/setup_dlg.cpp:72 udav/style_dlg.cpp:170
+msgid "at center"
+msgstr ""
+
+#: udav/setup_dlg.cpp:72
+msgid "at maximum"
+msgstr ""
+
+#: udav/setup_dlg.cpp:72
+msgid "at minimum"
+msgstr ""
+
+#: udav/setup_dlg.cpp:70 mgllab/dialogs.cpp:956
+msgid "at position"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1027
+msgid "attach light"
+msgstr ""
+
+#. mglWarnFmt
+#: src/base.cpp:229
+msgid "axis ranges are incompatible"
+msgstr ""
+
+#. w
+#: udav/style_dlg.cpp:222 mgllab/dialogs.cpp:29
+msgid "b - blue"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1019
+msgid "bars"
+msgstr ""
+
+#: widgets/qt.cpp:1071 udav/plot_pnl.cpp:478
+msgid "bitmap EPS"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1036
+msgid "both"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:189 mgllab/dialogs.cpp:1306
+msgid "bottom"
+msgstr ""
+
+#. r
+#: udav/style_dlg.cpp:225 mgllab/dialogs.cpp:32
+msgid "c - cyan"
+msgstr ""
+
+#: mgllab/dialogs.cpp:957 mgllab/dialogs.cpp:970 mgllab/dialogs.cpp:983
+#: mgllab/dialogs.cpp:996
+msgid "center"
+msgstr ""
+
+#: widgets/fltk.cpp:769
+#, c-format
+msgid "click at %g, %g, %g"
+msgstr ""
+
+#. mglWarnCnt
+#: src/base.cpp:225
+msgid "couldn't open file"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1455
+msgid "curve"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1026
+msgid "cutting"
+msgstr ""
+
+#. -----------------------------------------------------------------------------
+#: src/base.cpp:216
+msgid "data dimension(s) is incompatible"
+msgstr ""
+
+#. mglWarnDim
+#: src/base.cpp:217
+msgid "data dimension(s) is too small"
+msgstr ""
+
+#. mglWarnMem
+#: src/base.cpp:221
+msgid "data values are zero"
+msgstr ""
+
+#: udav/open_dlg.cpp:85 udav/open_dlg.cpp:144 udav/opt_dlg.cpp:63
+#: udav/opt_dlg.cpp:66 mgllab/dialogs.cpp:107 mgllab/dialogs.cpp:116
+#: mgllab/dialogs.cpp:1044
+msgid "default"
+msgstr ""
+
+#: mgllab/help.cpp:149
+msgid "dimensions"
+msgstr ""
+
+#. l
+#: udav/style_dlg.cpp:229 mgllab/dialogs.cpp:36
+msgid "e - lawngreen"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1455
+msgid "ellipse"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1017
+msgid "facenum"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1035
+msgid "factor"
+msgstr ""
+
+#. mglWarnSize
+#: src/base.cpp:228
+msgid "format is not supported for that build"
+msgstr ""
+
+#: src/canvas.cpp:33
+msgid "frame"
+msgstr ""
+
+#: udav/anim_dlg.cpp:55 mgllab/mathgl.cpp:190
+msgid "from"
+msgstr ""
+
+#. b
+#: udav/style_dlg.cpp:223 mgllab/dialogs.cpp:30
+msgid "g - lime"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1044
+msgid "glass-like"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1011
+msgid "grayscale"
+msgstr ""
+
+#. p
+#: udav/style_dlg.cpp:234 mgllab/dialogs.cpp:41
+msgid "h - gray"
+msgstr ""
+
+#: src/parser.cpp:1011
+#, c-format
+msgid "in line %ld"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1036
+msgid "increment"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1236 mgllab/dialogs.cpp:1249 mgllab/dialogs.cpp:1262
+#: mgllab/dialogs.cpp:1271 mgllab/dialogs.cpp:1280
+msgid "ind"
+msgstr ""
+
+#. h
+#: udav/style_dlg.cpp:235 mgllab/dialogs.cpp:43
+msgid "k - black"
+msgstr ""
+
+#. y
+#: udav/style_dlg.cpp:228 mgllab/dialogs.cpp:35
+msgid "l - springgreen"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1045
+msgid "lamp-like"
+msgstr ""
+
+#. vv->addSpacing(11);
+#: udav/style_dlg.cpp:169 udav/subplot_dlg.cpp:187 mgllab/dialogs.cpp:957
+#: mgllab/dialogs.cpp:970 mgllab/dialogs.cpp:983 mgllab/dialogs.cpp:996
+#: mgllab/dialogs.cpp:1304
+msgid "left"
+msgstr ""
+
+#. mglWarnOpen
+#: src/base.cpp:226
+msgid "light: ID is out of range"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1013
+msgid "lighting"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1454
+msgid "line"
+msgstr ""
+
+#. c
+#: udav/style_dlg.cpp:226 mgllab/dialogs.cpp:33
+msgid "m - magenta"
+msgstr ""
+
+#.
+#. ^
+#: udav/style_dlg.cpp:317 udav/style_dlg.cpp:356 mgllab/dialogs.cpp:209
+#: mgllab/dialogs.cpp:247
+msgid "manual"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1454
+msgid "marker"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1020
+msgid "markers"
+msgstr ""
+
+#: udav/data_dlg.cpp:68
+msgid "max"
+msgstr ""
+
+#: mgllab/help.cpp:151
+msgid "mem. usage"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1016
+msgid "meshnum"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:247
+msgid "mgl_en"
+msgstr ""
+
+#: utils/mglconv.cpp:84
+#, c-format
+msgid ""
+"mglconv convert mgl script to image file (default PNG).\n"
+"Current version is 2.%g\n"
+msgstr ""
+
+#: mgllab/mgllab.cpp:413
+#, c-format
+msgid ""
+"mgllab draw mgl script interactively.\n"
+"Current version is 2.%g\n"
+msgstr ""
+
+#: mgllab/help.cpp:78
+#, c-format
+msgid ""
+"mgllab v. 2.%g\n"
+"(c) Alexey Balakin, 2017\n"
+"http://mathgl.sf.net/"
+msgstr ""
+
+#: utils/mglview.cpp:68
+#, c-format
+msgid ""
+"mglview show plot from MGL script or MGLD file.\n"
+"Current version is 2.%g\n"
+msgstr ""
+
+#: udav/data_dlg.cpp:68
+msgid "min"
+msgstr ""
+
+#. mglWarnLow
+#: src/base.cpp:218
+msgid "minimal data value is negative"
+msgstr ""
+
+#. e
+#: udav/style_dlg.cpp:230 mgllab/dialogs.cpp:37
+msgid "n - skyblue"
+msgstr ""
+
+#: mgllab/help.cpp:147
+msgid "name"
+msgstr ""
+
+#. mglWarnNeg
+#: src/base.cpp:219
+msgid "no file or wrong data dimensions"
+msgstr ""
+
+#. mglWarnZero
+#: src/base.cpp:222
+msgid "no legend entries"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1028
+msgid "no origin tick"
+msgstr ""
+
+#. "-+=;oOsS~<>jdD*^"
+#. ".+x*sdv^<>o.*+xsdv^<>o" : nf = 10
+#: udav/style_dlg.cpp:128 udav/style_dlg.cpp:131 udav/style_dlg.cpp:134
+#: udav/style_dlg.cpp:339 udav/style_dlg.cpp:383 udav/data_dlg.cpp:67
+#: mgllab/dialogs.cpp:214 mgllab/dialogs.cpp:230 mgllab/dialogs.cpp:1035
+#: mgllab/dialogs.cpp:1039
+msgid "none"
+msgstr ""
+
+#: udav/style_dlg.cpp:220
+msgid "none or default"
+msgstr ""
+
+#. mglWarnFile
+#: src/base.cpp:220
+msgid "not enough memory"
+msgstr ""
+
+#. mglWarnNull
+#: src/base.cpp:231
+msgid "not enough space for plot"
+msgstr ""
+
+#: mgllab/table.cpp:85
+msgid "not used"
+msgstr ""
+
+#. mglWarnSlc
+#: src/base.cpp:224
+msgid "number of contours is zero or negative"
+msgstr ""
+
+#: udav/opt_dlg.cpp:63 udav/opt_dlg.cpp:66
+msgid "off"
+msgstr ""
+
+#: udav/opt_dlg.cpp:63 udav/opt_dlg.cpp:66 udav/setup_dlg.cpp:128
+msgid "on"
+msgstr ""
+
+#: udav/dat_pnl.cpp:549
+msgid "or enter name for new variable"
+msgstr ""
+
+#. q
+#: udav/style_dlg.cpp:233 mgllab/dialogs.cpp:40
+msgid "p - deeppink"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1023
+msgid "pen blur"
+msgstr ""
+
+#: mgllab/dialogs.cpp:392
+msgid "plain"
+msgstr ""
+
+#. mglWarnTern
+#: src/base.cpp:230
+msgid "pointer is NULL"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1456
+msgid "polygon"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1040
+msgid "projection"
+msgstr ""
+
+#. u
+#: udav/style_dlg.cpp:232 mgllab/dialogs.cpp:39
+msgid "q - orange"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1040
+msgid "quaternary"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1041
+msgid "quaternary proj"
+msgstr ""
+
+#. g
+#: udav/style_dlg.cpp:224 mgllab/dialogs.cpp:31
+msgid "r - red"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1454
+msgid "rectangle"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1455
+msgid "rhomb"
+msgstr ""
+
+#: udav/style_dlg.cpp:172 udav/subplot_dlg.cpp:193 mgllab/dialogs.cpp:958
+#: mgllab/dialogs.cpp:971 mgllab/dialogs.cpp:984 mgllab/dialogs.cpp:997
+#: mgllab/dialogs.cpp:1310
+msgid "right"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1029
+msgid "rotate text"
+msgstr ""
+
+#: mgllab/mathgl.cpp:197
+msgid "save slides"
+msgstr ""
+
+#. mglWarnLId
+#: src/base.cpp:227
+msgid "size(s) is zero or negative"
+msgstr ""
+
+#. mglWarnLeg
+#: src/base.cpp:223
+msgid "slice value is out of range"
+msgstr ""
+
+#: mgllab/table.cpp:144
+msgid "smoothed"
+msgstr ""
+
+#: mgllab/dialogs.cpp:326
+msgid "solid"
+msgstr ""
+
+#: widgets/qt.cpp:1069 udav/plot_pnl.cpp:476
+msgid "solid PNG"
+msgstr ""
+
+#: udav/anim_dlg.cpp:45 mgllab/mathgl.cpp:185
+msgid "strings"
+msgstr ""
+
+#: udav/data_dlg.cpp:67
+msgid "sum"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1039
+msgid "ternary"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1041
+msgid "ternary proj"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1021 mgllab/dialogs.cpp:1456
+msgid "text"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1022
+msgid "ticks"
+msgstr ""
+
+#: udav/anim_dlg.cpp:59 mgllab/mathgl.cpp:191 mgllab/dialogs.cpp:569
+#: mgllab/dialogs.cpp:572 mgllab/dialogs.cpp:575
+msgid "to"
+msgstr ""
+
+#: mgllab/mgllab.cpp:561
+msgid "to script"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:191 mgllab/dialogs.cpp:1308
+msgid "top"
+msgstr ""
+
+#. n
+#: udav/style_dlg.cpp:231 mgllab/dialogs.cpp:38
+msgid "u - blueviolet"
+msgstr ""
+
+#: udav/style_dlg.cpp:131
+msgid "under"
+msgstr ""
+
+#: udav/mem_pnl.cpp:168 mgllab/help.cpp:199
+msgid "unknown"
+msgstr ""
+
+#: udav/udav_wnd.cpp:168 udav/udav_wnd.cpp:560 udav/udav_wnd.cpp:693
+msgid "untitled - UDAV"
+msgstr ""
+
+#: udav/udav_wnd.cpp:686
+msgid "untitled* - UDAV"
+msgstr ""
+
+#: mgllab/dialogs.cpp:327
+msgid "user"
+msgstr ""
+
+#: udav/anim_dlg.cpp:52 mgllab/mathgl.cpp:187
+msgid "values"
+msgstr ""
+
+#: widgets/qt.cpp:1072 udav/plot_pnl.cpp:479
+msgid "vector EPS"
+msgstr ""
+
+#.
+#: udav/style_dlg.cpp:221 mgllab/dialogs.cpp:28
+msgid "w - white"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1312
+msgid "whole area"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1471
+msgid "wire"
+msgstr "wire"
+
+#: udav/anim_dlg.cpp:63 mgllab/mathgl.cpp:192
+msgid "with step"
+msgstr ""
+
+#. m
+#: udav/style_dlg.cpp:227 mgllab/dialogs.cpp:34
+msgid "y - yellow"
+msgstr ""
diff --git a/mathgl_es.po b/mathgl_es.po
new file mode 100644 (file)
index 0000000..420ff1e
--- /dev/null
@@ -0,0 +1,6455 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the MathGL2 package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: MathGL2 2.4.2\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-03-20 11:17+0300\n"
+"PO-Revision-Date: 2018-03-18 21:55-0400\n"
+"Last-Translator: Diego Sejas Viscarra <dsejas.math@protonmail.com>\n"
+"Language-Team: \n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.0.4\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: mgllab/mgllab.cpp:433
+#, c-format
+msgid ""
+"\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-L loc       set locale to loc\n"
+"\t-h           print this message\n"
+msgstr ""
+
+#: utils/mglconv.cpp:85
+#, c-format
+msgid ""
+"\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-L loc       set locale to loc\n"
+"\t-s fname     set MGL script for setting up the plot\n"
+"\t-S val       set scaling factor for images\n"
+"\t-q val       set quality for output (val=0...9)\n"
+"\t-g val       set gray-scale mode (val=0|1)\n"
+"\t-v val       set variant of arguments\n"
+"\t-o name      set output file name\n"
+"\t-n           no default output (script should save results by itself)\n"
+"\t-A val       add animation value val\n"
+"\t-C n1:n2:dn  add animation value in range [n1,n2] with step dn\n"
+"\t-C n1:n2     add animation value in range [n1,n2] with step 1\n"
+"\t-            get script from standard input\n"
+"\t-h           print this message\n"
+msgstr ""
+
+#: utils/mglview.cpp:85
+#, c-format
+msgid ""
+"\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"
+msgstr ""
+
+#: widgets/qt.cpp:872
+msgid ""
+"\n"
+"(c) Alexey Balakin, 2007\n"
+"http://mathgl.sourceforge.net/"
+msgstr ""
+
+#: src/parser.cpp:1066
+#, c-format
+msgid ""
+"\n"
+"Change temporary data in line %ld"
+msgstr ""
+"\n"
+"Cambiar datos temporales en linea %ld"
+
+#: src/parser.cpp:1064
+#, c-format
+msgid ""
+"\n"
+"String too long in line %ld"
+msgstr ""
+"\n"
+"Texto demasiado largo en linea %ld"
+
+#: src/parser.cpp:1065
+#, c-format
+msgid ""
+"\n"
+"Unbalanced ' in line %ld"
+msgstr ""
+"\n"
+"Desbalance de ' en linea %ld"
+
+#: src/parser.cpp:1062
+#, c-format
+msgid ""
+"\n"
+"Wrong argument(s) in line %ld"
+msgstr ""
+"\n"
+"Argumento(s) incorrecto(s) en linea %ld"
+
+#: src/parser.cpp:1063
+#, c-format
+msgid ""
+"\n"
+"Wrong command in line %ld"
+msgstr ""
+"\n"
+"Comando incorrecto en linea %ld"
+
+#: udav/mem_pnl.cpp:136 udav/dat_pnl.cpp:153
+msgid " - UDAV preview"
+msgstr " - UDAV vista previa"
+
+#: udav/dat_pnl.cpp:152
+msgid " - UDAV variable"
+msgstr " - UDAV variable"
+
+#. o = new Fl_Button(420, 400, 90, 25, _(" Refresh")); o->callback(mem_update_cb,w);
+#. o->image(img_update);       o->align(FL_ALIGN_IMAGE_NEXT_TO_TEXT);
+#. o->tooltip(_("Refresh list of variables."));
+#: mgllab/help.cpp:176
+msgid " Del.all"
+msgstr " Del.all"
+
+#: mgllab/help.cpp:164
+msgid " Delete"
+msgstr " Borrar"
+
+#: mgllab/help.cpp:158
+msgid " Edit"
+msgstr " Editar"
+
+#: mgllab/help.cpp:161
+msgid " Info"
+msgstr " Info"
+
+#: mgllab/help.cpp:167
+msgid " New"
+msgstr " Nuevo"
+
+#: mgllab/help.cpp:170
+msgid " Save"
+msgstr " Guardar"
+
+#: mgllab/mgllab.cpp:242
+msgid " Yes "
+msgstr " Si "
+
+#: udav/plot_pnl.cpp:191
+#, c-format
+msgid "%d - %d of %d"
+msgstr "%d - %d de %d"
+
+#. :
+#: udav/style_dlg.cpp:316 mgllab/dialogs.cpp:208
+msgid "' ' none"
+msgstr "' ' ninguno"
+
+#: udav/style_dlg.cpp:397
+msgid "'#*' Y-sign"
+msgstr "'#*' simbolo Y"
+
+#: udav/style_dlg.cpp:398
+msgid "'#+' squared plus"
+msgstr "'#+' cruz encuadrada"
+
+#: udav/style_dlg.cpp:396
+msgid "'#.' circled dot"
+msgstr "'#.' punto en circulo"
+
+#: udav/style_dlg.cpp:405
+msgid "'#<' solid triangle left"
+msgstr "'#<' triangulo relleno izq."
+
+#: udav/style_dlg.cpp:406
+msgid "'#>' solid triangle right"
+msgstr "'#>' triangulo relleno der."
+
+#: udav/style_dlg.cpp:404
+msgid "'#^' solid triangle up"
+msgstr "'#^' triangulo relleno arriba"
+
+#: udav/style_dlg.cpp:402
+msgid "'#d' solid rhomb"
+msgstr "'#d' rombo relleno"
+
+#: udav/style_dlg.cpp:407
+msgid "'#o' solid circle"
+msgstr "'#o' circulo relleno"
+
+#: udav/style_dlg.cpp:401
+msgid "'#s' solid square"
+msgstr "'#s' cuadrado relleno"
+
+#: udav/style_dlg.cpp:403
+msgid "'#v' solid triangle down"
+msgstr "'#v' triangulo relleno abajo"
+
+#: udav/style_dlg.cpp:399
+msgid "'#x' squared cross"
+msgstr "'#x' equis enmarcada"
+
+#. D
+#: udav/style_dlg.cpp:354 mgllab/dialogs.cpp:245
+msgid "'*' cross"
+msgstr "'*' cruz"
+
+#.
+#: udav/style_dlg.cpp:387 mgllab/dialogs.cpp:215
+msgid "'*' star"
+msgstr "'*' asterisco"
+
+#. o
+#. -
+#: udav/style_dlg.cpp:341 udav/style_dlg.cpp:385 mgllab/dialogs.cpp:217
+#: mgllab/dialogs.cpp:232
+msgid "'+' plus"
+msgstr "'+' cruz"
+
+#.
+#: udav/style_dlg.cpp:340 mgllab/dialogs.cpp:231
+msgid "'-' lines"
+msgstr "'-' segmentos"
+
+#. "-|;=ji: "
+#: udav/style_dlg.cpp:309 mgllab/dialogs.cpp:201
+msgid "'-' solid"
+msgstr "'-' solido"
+
+#. d
+#: udav/style_dlg.cpp:384 mgllab/dialogs.cpp:221
+msgid "'.' dot"
+msgstr "'.' punto"
+
+#. =
+#: udav/style_dlg.cpp:315 mgllab/dialogs.cpp:207
+msgid "':' dots"
+msgstr "':' puntos"
+
+#. j
+#. =
+#: udav/style_dlg.cpp:311 udav/style_dlg.cpp:343 mgllab/dialogs.cpp:204
+#: mgllab/dialogs.cpp:234
+msgid "';' dash"
+msgstr "';' guion"
+
+#. ~
+#: udav/style_dlg.cpp:349 mgllab/dialogs.cpp:241
+msgid "'<' left sign"
+msgstr "'<' signo izq."
+
+#. v
+#: udav/style_dlg.cpp:392 mgllab/dialogs.cpp:224
+msgid "'<' triangle left"
+msgstr "'<' triangulo izq."
+
+#. +
+#: udav/style_dlg.cpp:342 mgllab/dialogs.cpp:233
+msgid "'=' double lines"
+msgstr "'=' guion doble"
+
+#. i
+#: udav/style_dlg.cpp:312 mgllab/dialogs.cpp:206
+msgid "'=' small dash"
+msgstr "'=' guion pequeno"
+
+#. <
+#: udav/style_dlg.cpp:350 mgllab/dialogs.cpp:242
+msgid "'>' right sign"
+msgstr "'>' signo der."
+
+#. <
+#: udav/style_dlg.cpp:393 mgllab/dialogs.cpp:225
+msgid "'>' triangle right"
+msgstr "'>' triangulo derecha"
+
+#. _
+#: udav/style_dlg.cpp:265 udav/style_dlg.cpp:288 mgllab/dialogs.cpp:188
+msgid "'A' arrow"
+msgstr "'A' flecha"
+
+#. S
+#: udav/style_dlg.cpp:271 udav/style_dlg.cpp:294 mgllab/dialogs.cpp:194
+msgid "'D' rhomb"
+msgstr "'D' rombo"
+
+#. d
+#: udav/style_dlg.cpp:353 mgllab/dialogs.cpp:244
+msgid "'D' solid rhomb"
+msgstr "'D' rombo relleno"
+
+#. V
+#: udav/style_dlg.cpp:267 udav/style_dlg.cpp:290 mgllab/dialogs.cpp:191
+msgid "'I' stop"
+msgstr "'I' truncado"
+
+#. A
+#: udav/style_dlg.cpp:268 udav/style_dlg.cpp:291 mgllab/dialogs.cpp:189
+msgid "'K' size"
+msgstr "'K' tamano"
+
+#. D
+#: udav/style_dlg.cpp:272 udav/style_dlg.cpp:295 mgllab/dialogs.cpp:195
+msgid "'O' circle"
+msgstr "'O' circulo"
+
+#. o
+#: udav/style_dlg.cpp:345 mgllab/dialogs.cpp:237
+msgid "'O' solid circle"
+msgstr "'O' circulo relleno"
+
+#. s
+#: udav/style_dlg.cpp:347 mgllab/dialogs.cpp:239
+msgid "'S' solid square"
+msgstr "'S' cuadrado relleno"
+
+#. T
+#: udav/style_dlg.cpp:270 udav/style_dlg.cpp:293 mgllab/dialogs.cpp:193
+msgid "'S' square"
+msgstr "'S' cuadrado"
+
+#. I
+#: udav/style_dlg.cpp:269 udav/style_dlg.cpp:292 mgllab/dialogs.cpp:192
+msgid "'T' triangle"
+msgstr "'T' triangulo"
+
+#. K
+#: udav/style_dlg.cpp:266 udav/style_dlg.cpp:289 mgllab/dialogs.cpp:190
+msgid "'V' back arrow"
+msgstr "'V' flecha atras"
+
+#. O
+#: mgllab/dialogs.cpp:196
+msgid "'X' cross"
+msgstr "'X' equis"
+
+#. *
+#: udav/style_dlg.cpp:355 mgllab/dialogs.cpp:246
+msgid "'^' hats"
+msgstr "'^' sombrero"
+
+#. .
+#: udav/style_dlg.cpp:391 mgllab/dialogs.cpp:222
+msgid "'^' triangle up"
+msgstr "'^' triangulo arriba"
+
+#. "AVIKTSDO"
+#: udav/style_dlg.cpp:264 udav/style_dlg.cpp:287 mgllab/dialogs.cpp:187
+msgid "'_' none"
+msgstr "'_' ninguno"
+
+#. s
+#. >
+#: udav/style_dlg.cpp:352 udav/style_dlg.cpp:389 mgllab/dialogs.cpp:220
+#: mgllab/dialogs.cpp:243
+msgid "'d' rhomb"
+msgstr "'d' rombo"
+
+#. ;
+#: udav/style_dlg.cpp:314 mgllab/dialogs.cpp:205
+msgid "'i' small dash dot"
+msgstr "'i' guion corto y punto"
+
+#. |
+#. ;
+#: udav/style_dlg.cpp:313 udav/style_dlg.cpp:351 mgllab/dialogs.cpp:203
+#: mgllab/dialogs.cpp:235
+msgid "'j' dash dot"
+msgstr "'j' guion y punto"
+
+#. *
+#. j
+#: udav/style_dlg.cpp:344 udav/style_dlg.cpp:394 mgllab/dialogs.cpp:216
+#: mgllab/dialogs.cpp:236
+msgid "'o' circle"
+msgstr "'o' circulo"
+
+#. x
+#. O
+#: udav/style_dlg.cpp:346 udav/style_dlg.cpp:388 mgllab/dialogs.cpp:219
+#: mgllab/dialogs.cpp:238
+msgid "'s' square"
+msgstr "'s' cuadrado"
+
+#. ^
+#: udav/style_dlg.cpp:390 mgllab/dialogs.cpp:223
+msgid "'v' triangle down"
+msgstr "'v' triangulo abajo"
+
+#. +
+#: udav/style_dlg.cpp:386 mgllab/dialogs.cpp:218
+msgid "'x' skew cross"
+msgstr "'x' equis"
+
+#. -
+#: udav/style_dlg.cpp:310 mgllab/dialogs.cpp:202
+msgid "'|' long dash"
+msgstr "'|' guion largo"
+
+#. S
+#: udav/style_dlg.cpp:348 mgllab/dialogs.cpp:240
+msgid "'~' waves"
+msgstr "'~' ondas"
+
+#: src/parser.cpp:51
+msgid "0 - special plot"
+msgstr "0 - grafico especial"
+
+#: src/parser.cpp:51
+msgid "1 - other plot"
+msgstr "1 - otro grafico"
+
+#: src/parser.cpp:51
+msgid "10 - dd plot"
+msgstr "10 - grafico dd"
+
+#: src/parser.cpp:51
+msgid "11 - vector plot"
+msgstr "11 - grafico vectorial"
+
+#: src/parser.cpp:51
+msgid "12 - axis"
+msgstr "12 - eje"
+
+#: src/parser.cpp:51
+msgid "13 - primitives"
+msgstr "13 - primitivas"
+
+#: src/parser.cpp:51
+msgid "14 - axis setup"
+msgstr "14 - configurar eje"
+
+#: src/parser.cpp:51
+msgid "15 - text/legend"
+msgstr "15 - texto/leyenda"
+
+#: src/parser.cpp:51
+msgid "16 - data transform"
+msgstr "16 - transformar datos"
+
+#: udav/info_dlg.cpp:47
+msgid "1D plot"
+msgstr "Grafico 1D"
+
+#: udav/newcmd_dlg.cpp:166 mgllab/dialogs.cpp:707
+msgid "1D plots"
+msgstr "Graficos 1D"
+
+#: mgllab/help.cpp:360
+msgid "1D view"
+msgstr "Vista 1D"
+
+#: src/parser.cpp:51
+msgid "2 - setup"
+msgstr "2 - configuracion"
+
+#: udav/info_dlg.cpp:47
+msgid "2D plot"
+msgstr "Grafico 2D"
+
+#: udav/newcmd_dlg.cpp:167 mgllab/dialogs.cpp:708
+msgid "2D plots"
+msgstr "Graficos 2D"
+
+#: mgllab/help.cpp:362
+msgid "2D view"
+msgstr "Vista 2D"
+
+#: src/parser.cpp:51
+msgid "3 - data handle"
+msgstr "3 - referencia a datos"
+
+#: udav/open_dlg.cpp:71
+msgid "3D data with sizes from file"
+msgstr "Datos 3D con tamanos de archivo"
+
+#: udav/newcmd_dlg.cpp:168 mgllab/dialogs.cpp:709
+msgid "3D plots"
+msgstr "Graficos 3D"
+
+#: mgllab/help.cpp:364
+msgid "3D view"
+msgstr "Vista 3D"
+
+#: src/parser.cpp:51
+msgid "4 - data create"
+msgstr "4 - crear datos"
+
+#: src/parser.cpp:51
+msgid "5 - subplot"
+msgstr "5 - subgrafico"
+
+#: src/parser.cpp:51
+msgid "6 - program flow"
+msgstr "6 - flujo de programa"
+
+#: src/parser.cpp:51
+msgid "7 - 1d plot"
+msgstr "7 - grafico 1d"
+
+#: src/parser.cpp:51
+msgid "8 - 2d plot"
+msgstr "8 - grafico 2d"
+
+#: src/parser.cpp:51
+msgid "9 - 3d plot"
+msgstr "9 - grafico 3d"
+
+#: udav/udav_wnd.cpp:455
+msgid ""
+"<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>"
+msgstr ""
+"<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>"
+
+#: mgllab/help.cpp:304
+msgid "@<-  Prev"
+msgstr "@<-  Prev"
+
+#: widgets/qt.cpp:1290 udav/udav_wnd.cpp:331 mgllab/mgllab.cpp:347
+msgid "About"
+msgstr "Acerca de"
+
+#. -----------------------------------------------------------------------------
+#: widgets/qt.cpp:876 widgets/qt.cpp:1291 udav/udav_wnd.cpp:332
+#: udav/udav_wnd.cpp:460
+msgid "About Qt"
+msgstr "Acerca de Qt"
+
+#: widgets/qt.cpp:1169 udav/plot_pnl.cpp:372
+msgid "Add arc"
+msgstr "Anadir arco"
+
+#: widgets/qt.cpp:1172 udav/plot_pnl.cpp:375
+msgid "Add arc which properties can be changed later by mouse."
+msgstr "Anadir arco configurable por el mouse."
+
+#: mgllab/dialogs.cpp:84
+msgid "Add command option(s)"
+msgstr "Anadir opcion(es) de comando"
+
+#: widgets/qt.cpp:1174 udav/plot_pnl.cpp:378
+msgid "Add curve"
+msgstr "Anadir curva"
+
+#: widgets/qt.cpp:1177 udav/plot_pnl.cpp:381
+msgid "Add curve which properties can be changed later by mouse."
+msgstr "Anadir curva configurable por el mouse."
+
+#: src/exec_dat.cpp:1634
+msgid "Add data or number"
+msgstr "Anadir datos o numero"
+
+#: widgets/qt.cpp:1189 udav/plot_pnl.cpp:396
+msgid "Add ellipse"
+msgstr "Anadir elipse"
+
+#: widgets/qt.cpp:1192 udav/plot_pnl.cpp:399 udav/plot_pnl.cpp:405
+msgid "Add ellipse which properties can be changed later by mouse."
+msgstr "Anadir elipse configurable por el mouse."
+
+#: mgllab/dialogs.cpp:1229
+msgid "Add inplot"
+msgstr "Anadir grafico interno"
+
+# Anadir a la leyenda?
+#: src/exec_set.cpp:775
+msgid "Add legend entry"
+msgstr "Anadir entrada a leyenda"
+
+#: mgllab/dialogs.cpp:119
+msgid "Add legend entry for the plot"
+msgstr "Anadir entrada a leyenda del grafico"
+
+#: widgets/qt.cpp:1164 udav/plot_pnl.cpp:366
+msgid "Add line"
+msgstr "Anadir linea"
+
+#: widgets/qt.cpp:1167 udav/plot_pnl.cpp:369
+msgid "Add line which properties can be changed later by mouse."
+msgstr "Anadir linea configurable por el mouse."
+
+#: widgets/qt.cpp:1199 udav/plot_pnl.cpp:408
+msgid "Add mark"
+msgstr "Anadir marca"
+
+# Marker or mark?
+#: widgets/qt.cpp:1202 udav/plot_pnl.cpp:411
+msgid "Add marker which properties can be changed later by mouse."
+msgstr "Anadir marca configurable por el mouse."
+
+#: widgets/qt.cpp:1194 udav/plot_pnl.cpp:402
+msgid "Add polygon"
+msgstr "Anadir poligono"
+
+#: widgets/qt.cpp:1197
+msgid "Add polygon which properties can be changed later by mouse."
+msgstr "Anadir poligono configurable por el mouose."
+
+#: mgllab/dialogs.cpp:1453
+msgid "Add primitive"
+msgstr "Anadir primitiva"
+
+# rect?
+#: widgets/qt.cpp:1179 udav/plot_pnl.cpp:384
+msgid "Add rect"
+msgstr "Anadir rectangulo"
+
+#: widgets/qt.cpp:1182 udav/plot_pnl.cpp:387
+msgid "Add rectangle which properties can be changed later by mouse."
+msgstr "Anadir rectangulo configurable por el mouse."
+
+#: widgets/qt.cpp:1184 udav/plot_pnl.cpp:390
+msgid "Add rhombus"
+msgstr "Anadir rombo"
+
+#: widgets/qt.cpp:1187 udav/plot_pnl.cpp:393
+msgid "Add rhombus which properties can be changed later by mouse."
+msgstr "Anadir rombo configurable por el mouse."
+
+#: widgets/qt.cpp:1204 udav/plot_pnl.cpp:414
+msgid "Add text"
+msgstr "Anadir texto"
+
+#: widgets/qt.cpp:1207 udav/plot_pnl.cpp:417
+msgid "Add text which properties can be changed later by mouse."
+msgstr "Anadir texto configurable por el mouse."
+
+#: src/exec_prm.cpp:648
+msgid "Add title for current subplot/inplot"
+msgstr "Anadir titulo al subgrafico/grafico interno"
+
+#: mgllab/table.cpp:796
+msgid "Add to"
+msgstr "Anadir a"
+
+# user-defined
+#: src/exec_set.cpp:776
+msgid "Add user-defined symbol"
+msgstr "Anadir simbolo personalizado"
+
+#: widgets/fltk.cpp:873
+msgid "Adjust picture size to fill drawing area"
+msgstr "Ajustar imagen al área de dibujo"
+
+#: widgets/fltk.cpp:836 widgets/qt.cpp:1152 udav/plot_pnl.cpp:337
+msgid "Adjust size"
+msgstr "Ajustar tamano"
+
+#: src/exec_set.cpp:777
+msgid "Adjust ticks for best view"
+msgstr "Optimizar marcas de los ejes"
+
+#: udav/calc_dlg.cpp:193
+msgid "Airy and Gamma"
+msgstr "Funciones de Airy y Gamma"
+
+#: udav/hint_dlg.cpp:42 mgllab/help.cpp:276
+msgid ""
+"All indexes (of data arrays, subplots and so on) are always start from 0."
+msgstr ""
+"Todos los indices (de vectores de datos, subgraficos, etc.) siempre empiezan "
+"en 0."
+
+#. graphics menu
+#: widgets/qt.cpp:1111 udav/opt_dlg.cpp:51 udav/setup_dlg.cpp:109
+#: udav/plot_pnl.cpp:290 mgllab/dialogs.cpp:109
+msgid "Alpha"
+msgstr "Alfa"
+
+#: mgllab/dialogs.cpp:110
+msgid "Alpha value (transparency) of surface or cloud"
+msgstr "Valor alfa (transparencia) de superficie o nube"
+
+#: udav/setup_dlg.cpp:93 mgllab/dialogs.cpp:1003
+msgid "AlphaDef"
+msgstr "AlphaDef"
+
+#: udav/opt_dlg.cpp:56 udav/setup_dlg.cpp:95 mgllab/dialogs.cpp:111
+#: mgllab/dialogs.cpp:1004
+msgid "Ambient"
+msgstr "Ambiente"
+
+#: udav/subplot_dlg.cpp:167
+msgid "Angle around x axis (in degrees)"
+msgstr "Angulo alrededor del eje x (en grados)"
+
+#: udav/subplot_dlg.cpp:171
+msgid "Angle around z axis (in degrees)"
+msgstr "Angulo alrededor del eje z (en grados)"
+
+#. animation menu
+#: widgets/qt.cpp:1257 widgets/qt.cpp:1258 udav/plot_pnl.cpp:559
+#: mgllab/mathgl.cpp:185
+msgid "Animation"
+msgstr "Animacion"
+
+#: mgllab/table.cpp:788
+msgid "Another"
+msgstr "Otro"
+
+#: mgllab/table.cpp:854
+msgid "Apply operator (smoothing, integration, difference ...) to data"
+msgstr "Aplicar operador (suavizado, integracion, diferencia ...) a datos"
+
+# Mesh=malla or mesh=grilla depending on context
+#: mgllab/dialogs.cpp:103
+msgid "Approximate number of mesh lines in plot"
+msgstr "Numero aprox. de lineas de malla en grafico"
+
+#: mgllab/help.cpp:135
+msgid "Are you sure that you want to delete ALL data arrays?"
+msgstr "¿Esta seguro que desea borrar TODOS los datos?"
+
+#: udav/newcmd_dlg.cpp:67
+msgid "Argument"
+msgstr "Argumento"
+
+#: mgllab/dialogs.cpp:738
+msgid "Arguments"
+msgstr "Argumentos"
+
+#: udav/style_dlg.cpp:63 mgllab/dialogs.cpp:321
+msgid "Arrow at end"
+msgstr "Flecha al final"
+
+#. g->setColStretch(0, 1);     g->setColStretch(1, 1); g->setColStretch(2, 1);
+#: udav/style_dlg.cpp:61 mgllab/dialogs.cpp:315
+msgid "Arrow at start"
+msgstr "Flecha al principio"
+
+#: widgets/qt.cpp:1150
+msgid "Ask to stop plot drawing (F7)."
+msgstr "Detener creacion de grafico (F7)."
+
+#: udav/subplot_dlg.cpp:175
+msgid "Aspect"
+msgstr "Aspecto"
+
+# Aspect ratio=Proporcion? Maybe Aspecto x/z
+#: udav/subplot_dlg.cpp:178
+msgid "Aspect ratio of x-scale to z-scale"
+msgstr "Proporcion de escala x a escala z"
+
+#: udav/subplot_dlg.cpp:182
+msgid "Aspect ratio of y-scale to z-scale"
+msgstr "Proporcion de escala y a escala z"
+
+#: mgllab/dialogs.cpp:1298
+msgid "Aspect x/z"
+msgstr "Aspecto x/z"
+
+#: src/exec_set.cpp:783
+msgid "Attach light settings to inplot"
+msgstr "Vincular configuracion de luz a grafico interno"
+
+#: udav/open_dlg.cpp:60
+msgid "Auto detect data sizes"
+msgstr "Autodetectar tamano de datos"
+
+#: udav/open_dlg.cpp:177
+msgid "Auto detect data sizes (%1 x %2 x %3)"
+msgstr "Autodetectar tamano de datos (%1 x %2 x %3)"
+
+#: udav/prop_dlg.cpp:100
+msgid "AutoKey"
+msgstr "AutoKey"
+
+#: udav/prop_dlg.cpp:159
+msgid "Automatically execute script after loading"
+msgstr "Ejecutar script automaticamente al cargarlo"
+
+#: udav/prop_dlg.cpp:165
+msgid "Automatically save before redrawing (F5)"
+msgstr "Guardar automaticamente antes de graficar (F5)"
+
+#: src/data.cpp:1425
+#, c-format
+msgid ""
+"Averages are:\n"
+"<a> = %g\t<x> = %g\t<y> = %g\t<z> = %g\n"
+msgstr ""
+"Promedios:\n"
+"<a> = %g\t<x> = %g\t<y> = %g\t<z> = %g\n"
+
+#: udav/style_dlg.cpp:122 mgllab/dialogs.cpp:340
+msgid "Axial direction"
+msgstr "Direccion del eje"
+
+#: udav/setup_dlg.cpp:101
+msgid "AxialDir"
+msgstr "AxialDir"
+
+#: mgllab/dialogs.cpp:1008
+msgid "Axis"
+msgstr "Eje"
+
+#: udav/newcmd_dlg.cpp:176 mgllab/dialogs.cpp:717
+msgid "Axis and colorbar"
+msgstr "Eje y barra de color"
+
+#: udav/newcmd_dlg.cpp:177 mgllab/dialogs.cpp:718 mgllab/dialogs.cpp:949
+msgid "Axis setup"
+msgstr "Configurar eje"
+
+#. W
+#: udav/style_dlg.cpp:237 mgllab/dialogs.cpp:45
+msgid "B - navy"
+msgstr "B - azul marino"
+
+#: udav/help_pnl.cpp:48
+msgid "Backward"
+msgstr "Retroceder"
+
+#: src/font.cpp:953
+#, c-format
+msgid "Bad '%ls' at %zu\n"
+msgstr "'%ls' incorrecto en %zu\n"
+
+#: src/parser.cpp:769
+#, c-format
+msgid "Bad arguments for %ls: %ld instead of %d\n"
+msgstr "Error en argumentos de %ls: %ld en vez de %d\n"
+
+#: udav/setup_dlg.cpp:97
+msgid "BaseWidth"
+msgstr "BaseWidth"
+
+#: udav/calc_dlg.cpp:192
+msgid "Basic"
+msgstr "Basicas"
+
+#: mgllab/dialogs.cpp:1461
+msgid "Begin"
+msgstr "Inicio"
+
+#: src/parser.cpp:1483
+msgid "Begin of do-while loop"
+msgstr "Inicio de bucle do-while"
+
+#: udav/calc_dlg.cpp:193
+msgid "Bessel"
+msgstr "Bessel"
+
+#: udav/style_dlg.cpp:157 mgllab/dialogs.cpp:368
+msgid "Bold style"
+msgstr "Negrilla"
+
+#: udav/opt_dlg.cpp:115
+msgid "Both fields in crange must be filled"
+msgstr "crange requiere dos valores"
+
+#: udav/opt_dlg.cpp:94
+msgid "Both fields in xrange must be filled"
+msgstr "xrange requiere dos valores"
+
+#: udav/opt_dlg.cpp:101
+msgid "Both fields in yrange must be filled"
+msgstr "yrange requiere dos valores"
+
+#: udav/opt_dlg.cpp:108
+msgid "Both fields in zrange must be filled"
+msgstr "zrange requiere dos valores"
+
+#: src/parser.cpp:1480
+msgid "Break for-loop"
+msgstr "Salir de bucle for"
+
+#: udav/setup_dlg.cpp:122 mgllab/dialogs.cpp:1069
+msgid "Brightness"
+msgstr "Luminosidad"
+
+#: mgllab/dialogs.cpp:401
+msgid "Brightness of i-th color"
+msgstr "Luminosidad del i-esimo color"
+
+#: mgllab/table.cpp:768
+msgid "By formula"
+msgstr "Por formula"
+
+#. R
+#: udav/style_dlg.cpp:240 mgllab/dialogs.cpp:48
+msgid "C - teal"
+msgstr "C - verde azulado"
+
+#: udav/setup_dlg.cpp:51 mgllab/dialogs.cpp:989
+msgid "C axis"
+msgstr "Eje c"
+
+#: udav/opt_dlg.cpp:47 mgllab/dialogs.cpp:97
+msgid "C-range"
+msgstr "Rango c"
+
+#: widgets/qt.cpp:1276
+msgid "Calculations"
+msgstr "Calculos"
+
+#. TODO
+#. connect(hidden,SIGNAL(cursorPositionChanged()),this,SLOT(hiddenClicked()));
+#: udav/udav_wnd.cpp:194 udav/udav_wnd.cpp:206 mgllab/mgllab.cpp:341
+#: mgllab/mgllab.cpp:572
+msgid "Calculator"
+msgstr "Calculadora"
+
+#: udav/anim_dlg.cpp:67 udav/prop_dlg.cpp:180 udav/args_dlg.cpp:63
+#: udav/newcmd_dlg.cpp:78 udav/open_dlg.cpp:90 udav/dat_pnl.cpp:460
+#: udav/dat_pnl.cpp:510 udav/dat_pnl.cpp:552 udav/dat_pnl.cpp:629
+#: udav/opt_dlg.cpp:78 udav/setup_dlg.cpp:145 udav/files_dlg.cpp:58
+#: udav/style_dlg.cpp:206 udav/data_dlg.cpp:90 udav/subplot_dlg.cpp:219
+#: mgllab/editor.cpp:282 mgllab/mathgl.cpp:166 mgllab/mathgl.cpp:197
+#: mgllab/dialogs.cpp:120 mgllab/dialogs.cpp:164 mgllab/dialogs.cpp:410
+#: mgllab/dialogs.cpp:584 mgllab/dialogs.cpp:749 mgllab/dialogs.cpp:1071
+#: mgllab/dialogs.cpp:1318 mgllab/dialogs.cpp:1473 mgllab/mgllab.cpp:497
+#: mgllab/table.cpp:101 mgllab/table.cpp:179 mgllab/table.cpp:353
+#: mgllab/table.cpp:556 mgllab/table.cpp:619 mgllab/table.cpp:675
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: src/crust.cpp:589
+msgid "Cannot triangulate this set!"
+msgstr "Imposible triangular conjunto!"
+
+# Area de imagen? Area de figura?
+#: udav/udav_wnd.cpp:226 mgllab/mgllab.cpp:370 mgllab/mgllab.cpp:371
+msgid "Canvas"
+msgstr "Area de dibujo"
+
+#: udav/subplot_dlg.cpp:59 udav/subplot_dlg.cpp:101 udav/subplot_dlg.cpp:118
+#: udav/subplot_dlg.cpp:135
+msgid "Cell index"
+msgstr "Indice de celda"
+
+#: mgllab/table.cpp:103 mgllab/table.cpp:558 mgllab/table.cpp:772
+msgid "Change"
+msgstr "Cambiar"
+
+#: mgllab/table.cpp:104
+msgid "Change (resize) data"
+msgstr "Cambiar (tamano de) datos"
+
+#: widgets/qt.cpp:1154 udav/plot_pnl.cpp:339
+msgid "Change canvas size to fill whole region (F6)."
+msgstr "Maximizar el area de dibujo (F6)."
+
+#: src/exec_set.cpp:787
+msgid "Change current directory"
+msgstr "Cambiar directorio actual"
+
+#: mgllab/table.cpp:168
+msgid "Change data"
+msgstr "Modificar datos"
+
+#: mgllab/table.cpp:91
+msgid "Change data sizes"
+msgstr "Modificar tamano de datos"
+
+#: mgllab/table.cpp:559 mgllab/table.cpp:622 mgllab/table.cpp:678
+msgid "Change data values and close this window"
+msgstr "Cambiar valores y cerrar esta ventana"
+
+#: udav/prop_dlg.cpp:71
+msgid "Change font"
+msgstr "Cambiar fuente"
+
+#: src/exec_set.cpp:838
+msgid "Change view angles - use 'rotate' for plot rotation"
+msgstr "Modificar angulos - use 'rotate' para rotar grafico"
+
+# Limpiar?
+#: udav/calc_dlg.cpp:68
+msgid "Clear"
+msgstr "Borrar"
+
+#: udav/text_pnl.cpp:527
+msgid "Clear all"
+msgstr "Borrar todo"
+
+#: src/exec_set.cpp:788
+msgid "Clear legend entries"
+msgstr "Borrar entradas de leyenda"
+
+#: src/exec_set.cpp:789
+msgid "Clear picture"
+msgstr "Borrar imagen"
+
+#. o = new Fl_Button(180, 130, 25, 25);o->image(img_save);     o->tooltip("img_save");
+#: widgets/fltk.cpp:1102 widgets/qt.cpp:1104 udav/find_dlg.cpp:52
+#: udav/hint_dlg.cpp:70 mgllab/editor.cpp:565 mgllab/help.cpp:308
+#: mgllab/help.cpp:368 mgllab/help.cpp:484
+msgid "Close"
+msgstr "Cerrar"
+
+#: udav/dat_pnl.cpp:833
+msgid "Close tab"
+msgstr "Cerrar pestana"
+
+#: udav/dat_pnl.cpp:835
+msgid "Close this data tab."
+msgstr "Cerrar esta pestana de datos."
+
+#: udav/setup_dlg.cpp:121 udav/style_dlg.cpp:67 mgllab/dialogs.cpp:1068
+#: mgllab/dialogs.cpp:1459
+msgid "Color"
+msgstr "Color"
+
+#. g->setColStretch(0, 1);                     g->setColStretch(1, 1);
+#: udav/style_dlg.cpp:106
+msgid "Color order"
+msgstr "Orden de color"
+
+#: udav/style_dlg.cpp:150 mgllab/dialogs.cpp:339
+msgid "Color scheme"
+msgstr "Esquema de color"
+
+#: mgllab/dialogs.cpp:384
+msgid "Color(s) or color scheme"
+msgstr "Color(es) o esquema de color"
+
+#: mgllab/dialogs.cpp:1002
+msgid "Colors"
+msgstr "Colores"
+
+#: mgllab/table.cpp:881
+msgid ""
+"Colors denote values: magenta - local max, cyan - local min,\n"
+"\tred - Re(v)>0, blue - Re(v)<0, purple - Im(v)>0, teal - Im(v)<0."
+msgstr ""
+"Colores denotan valores: magenta -  max. local, cyan -  min. local,\n"
+"\trojo - Re(v)>0, azul - Re(v)<0, purpura - Im(v)>0, verde azulado - Im(v)<0."
+
+#: mgllab/dialogs.cpp:577
+msgid "Column expr"
+msgstr "Column expr"
+
+#: mgllab/dialogs.cpp:724 mgllab/mgllab.cpp:320
+msgid "Command"
+msgstr "Comando"
+
+#: udav/newcmd_dlg.cpp:64 mgllab/dialogs.cpp:740
+msgid ""
+"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\n"
+"for default values."
+msgstr ""
+"Argumentos de comando. Obligatorios en negrilla.\n"
+"Otros son requeridos, pero su orden es obligatorio.\n"
+"Puede usar '' para predeterminado. Ver ayuda a la\n"
+"der. para valores por defecto."
+
+#: udav/text_pnl.cpp:575
+msgid "Command options"
+msgstr "Opciones de comando"
+
+#: udav/prop_dlg.cpp:82
+msgid "Comments"
+msgstr "Comentarios"
+
+#: src/exec_prm.cpp:636
+msgid "Computes the attractor of an IFS"
+msgstr "Calcula el atractor de un IFS"
+
+#: src/exec_prm.cpp:637
+msgid "Computes the attractor of an IFS for 3d case"
+msgstr "Calcula el atractor de un IFS para el caso 3d"
+
+#: src/exec_prm.cpp:638
+msgid "Computes the attractor of an IFS with parameters from *.ifs file"
+msgstr "Calcula el atractor de un IFS con parametros de un archivo *.ifs"
+
+#: src/exec_prm.cpp:632
+msgid "Computes the flame fractal"
+msgstr "Calcula un fractal de flama"
+
+#: src/parser.cpp:1499
+msgid "Condition of do-while loop"
+msgstr "Condicion de un bucle do-while"
+
+#: src/parser.cpp:1489 src/parser.cpp:1493
+msgid "Conditional operator"
+msgstr "Operador condicional"
+
+#: udav/plot_pnl.cpp:358
+msgid "Copy click coor."
+msgstr "Copiar coords. al clicar"
+
+# Clipboard=?
+#: udav/plot_pnl.cpp:360
+msgid "Copy coordinates of last mouse click to clipboard."
+msgstr "Copiar coordenadas del ultimo clic. a memoria"
+
+#: udav/dat_pnl.cpp:707
+msgid "Copy data"
+msgstr "Copiar datos"
+
+#: src/exec_dat.cpp:1640
+msgid "Copy data from another variable"
+msgstr "Copiar datos de otra variable"
+
+#: widgets/fltk.cpp:833
+msgid "Copy graphics"
+msgstr "Copiar grafico"
+
+#: widgets/qt.cpp:1158 udav/plot_pnl.cpp:354
+msgid "Copy graphics to clipboard (Ctrl+Shift+G)."
+msgstr "Copiar grafico a memoria (Ctrl+Shift+G)."
+
+#: widgets/fltk.cpp:877
+msgid "Copy image to clipboard"
+msgstr "Copiar imagen a memoria"
+
+#: widgets/qt.cpp:1156 udav/plot_pnl.cpp:352
+msgid "Copy plot"
+msgstr "Copiar grafico"
+
+#: udav/dat_pnl.cpp:709
+msgid "Copy range of numbers to clipboard (Ctrl+Shift+C)."
+msgstr "Copiar rango de numeros a memoria (Ctrl+Shift+C)."
+
+#: udav/text_pnl.cpp:535
+msgid "Copy selected text or data to clipboard (Ctrl+C)."
+msgstr "Copiar texto seleccionado o datos a memoria (Ctrl+C)."
+
+#: mgllab/editor.cpp:511
+msgid "Copy selection to clipboard"
+msgstr "Copiar seleccion a memoria"
+
+#: udav/text_pnl.cpp:533 mgllab/mgllab.cpp:310
+msgid "Copy text"
+msgstr "Copiar texto"
+
+#: mgllab/table.cpp:780
+msgid "Cos FFT"
+msgstr "Cos FFT"
+
+#: udav/dat_pnl.cpp:621
+msgid "Cos-Fourier transform along direction(s)"
+msgstr "Cos-transformada de Fourier en dirreccion(es)"
+
+#: src/exec_dat.cpp:1642
+msgid "Cos-Fourier transform at some direction"
+msgstr "Cos-transformada de Fourier en una direccion"
+
+#: mgllab/table.cpp:165
+msgid "Cosine FFT"
+msgstr "Coseno FFT"
+
+#: udav/text_pnl.cpp:365 udav/text_pnl.cpp:482
+msgid "Could not write to %1"
+msgstr "No se pudo escribir a %1"
+
+#: udav/setup_dlg.cpp:159
+msgid "Could not write to file"
+msgstr "No se pudo escribir a archivo"
+
+#: udav/udav_wnd.cpp:570
+msgid "Couldn't change to folder "
+msgstr "No se puede ir a directorio "
+
+#: udav/text_pnl.cpp:431
+msgid "Couldn't open file "
+msgstr "No se pudo abrir archivo "
+
+#: mgllab/dialogs.cpp:1190
+#, c-format
+msgid "Couldn't open file %s"
+msgstr "No se pudo abrir archivo %s"
+
+#: udav/newcmd_dlg.cpp:173
+msgid "Create data and I/O"
+msgstr "Crear datos e I/O"
+
+#: mgllab/dialogs.cpp:714
+msgid "Create data and IO"
+msgstr "Crear datos e I/O"
+
+#: src/exec_dat.cpp:1667
+msgid "Create histogram (distribution) of data values"
+msgstr "Crear histograma (distribucion) de valores de datos"
+
+#: udav/dat_pnl.cpp:766 mgllab/table.cpp:760
+msgid "Create new"
+msgstr "Crear nuevo"
+
+#: src/exec_dat.cpp:1727
+msgid "Create new 1D data and fill it in range"
+msgstr "Crear nuevos datos1D y llenar en rango"
+
+#: src/exec_dat.cpp:1682
+msgid "Create new data"
+msgstr "Crear nuevos datos"
+
+#: udav/mem_pnl.cpp:58
+msgid "Create new data array"
+msgstr "Crear nuevo arreglo de datos"
+
+#: mgllab/table.cpp:838
+msgid "Create new data with zero filling"
+msgstr "Crear arreglo y llenarlo con ceros"
+
+#: udav/udav_wnd.cpp:284
+msgid "Create new empty script window (Ctrl+N)."
+msgstr "Crear ventana para nuevo script (Ctrl+N)."
+
+#: src/parser.cpp:1494
+msgid "Creates new variable from list of numbers or data"
+msgstr "Crear nueva variable de una lista de numeros o datos"
+
+#: udav/dat_pnl.cpp:784 mgllab/table.cpp:763
+msgid "Crop"
+msgstr "Cortar"
+
+#: mgllab/table.cpp:860
+msgid "Crop (cut off edges) data"
+msgstr "Cortar (bordes) de datos"
+
+#: mgllab/table.cpp:607
+msgid "Crop data"
+msgstr "Cortar datos"
+
+#: src/exec_dat.cpp:1643
+msgid "Crop edge of data"
+msgstr "Cortar borde de datos"
+
+#: udav/dat_pnl.cpp:786
+msgid "Crop the data edges. Useful to cut off the zero-filled area."
+msgstr "Cortar bordes de datos. Util para cortar area con ceros."
+
+#: mgllab/table.cpp:163 mgllab/table.cpp:774
+msgid "CumSum"
+msgstr "SumCum"
+
+#: src/exec_dat.cpp:1644
+msgid "Cumulative summation along direction(s)"
+msgstr "Suma acumulativa en la(s) direccion(es)"
+
+#: udav/prop_dlg.cpp:106
+msgid "CurrLine"
+msgstr "CurrLine"
+
+#: udav/prop_dlg.cpp:68
+msgid "Current font"
+msgstr "Fuente actual"
+
+#: udav/text_pnl.cpp:530
+msgid "Cut selected text to clipboard (Ctrl+X)."
+msgstr "Cortar texto seleccionado a memoria (Ctrl+X)."
+
+#: udav/text_pnl.cpp:528 mgllab/mgllab.cpp:309
+msgid "Cut text"
+msgstr "Cortar texto"
+
+#: udav/opt_dlg.cpp:61 mgllab/dialogs.cpp:106
+msgid "Cutting"
+msgstr "Recortado"
+
+#: mgllab/help.cpp:251 mgllab/table.cpp:428 mgllab/table.cpp:457
+msgid ""
+"DAT Files \t*.{dat,csv}\n"
+"HDF Files \t*.{h5,hdf}"
+msgstr ""
+"Archivos DAT \t*.{dat,csv}\n"
+"Archivos HDF \t*.{h5,hdf}"
+
+#: mgllab/dialogs.cpp:1465
+msgid "Dash"
+msgstr "Guion"
+
+#: udav/style_dlg.cpp:62 mgllab/dialogs.cpp:318
+msgid "Dashing"
+msgstr "Guiones"
+
+#: udav/dat_pnl.cpp:66
+msgid "Data"
+msgstr "Datos"
+
+#: udav/dat_pnl.cpp:249 udav/dat_pnl.cpp:271
+msgid ""
+"Data files (*.dat)\n"
+"HDF5 files (*.h5 *.hdf)\n"
+"PNG files (*.png)\n"
+"All files (*.*)"
+msgstr ""
+"Archivos DAT (*.dat)\n"
+"Archivos HDF5 (*.h5 *.hdf)\n"
+"Archivos PNG (*.png)\n"
+"Todos los archivos (*.*)"
+
+#: udav/newcmd_dlg.cpp:175 mgllab/dialogs.cpp:716
+msgid "Data handling"
+msgstr "Manipulacion de datos"
+
+#: mgllab/help.cpp:163 mgllab/table.cpp:851
+msgid "Data information and preview."
+msgstr "Informacion sobre datos y vista previa."
+
+#: udav/open_dlg.cpp:56 udav/data_dlg.cpp:42 mgllab/dialogs.cpp:566
+msgid "Data name"
+msgstr "Nombre de datos"
+
+#: udav/info_dlg.cpp:42
+msgid "Data preview"
+msgstr "Vista previa de datos"
+
+#: udav/info_dlg.cpp:43
+msgid "Data preview for current slice."
+msgstr "Vista previa de datos para porcion actual."
+
+#: udav/newcmd_dlg.cpp:174 mgllab/dialogs.cpp:715
+msgid "Data transform"
+msgstr "Transformar datos"
+
+#: udav/plot_pnl.cpp:556
+msgid "Decrease \\phi angle by 10 degrees."
+msgstr "Decrementar angulo \\phi en 10 gardos."
+
+#: udav/plot_pnl.cpp:548
+msgid "Decrease \\theta angle by 10 degrees."
+msgstr "Decrease \\theta angle by 10 degrees."
+
+#: mgllab/help.cpp:105
+msgid "Decrease font size"
+msgstr "Reducir tamaño de fuente"
+
+#: src/parser.cpp:1485
+msgid "Define constant or parameter"
+msgstr "DEfinir constante o parametro"
+
+#: src/parser.cpp:1484
+msgid "Define parameter as character"
+msgstr "Definir parametro como caracter"
+
+#: src/parser.cpp:1486
+msgid "Define parameter as numerical value"
+msgstr "Definir parametro como valor numerico"
+
+#: src/parser.cpp:1479
+msgid "Define parameter from user input"
+msgstr "Definir parametro de input del usuario"
+
+#: udav/anim_dlg.cpp:76
+msgid "Delay (in ms)"
+msgstr "Retraso (en ms)"
+
+#: mgllab/mathgl.cpp:204
+msgid "Delay (in sec)"
+msgstr "Retraso (en seg)"
+
+#: mgllab/help.cpp:178
+msgid "Delete @b all@. data arrays."
+msgstr "Borrar @b todos@. los datos."
+
+#: udav/mem_pnl.cpp:64
+msgid "Delete ALL data arrays"
+msgstr "Borrar TODOS los datos"
+
+#: src/exec_dat.cpp:1647
+msgid "Delete data or slice of data"
+msgstr "Borrar datos o porcion de los datos"
+
+#: udav/plot_pnl.cpp:426
+msgid "Delete selected"
+msgstr "Borrar seleccion"
+
+#: udav/mem_pnl.cpp:60
+msgid "Delete selected data array"
+msgstr "Borrar datos seleccionados"
+
+#: mgllab/help.cpp:166
+msgid "Delete selected data."
+msgstr "Borrar datos seleccionados."
+
+#: udav/plot_pnl.cpp:428
+msgid "Delete selected plot."
+msgstr "Borrar grafico seleccionado."
+
+#: mgllab/dialogs.cpp:734
+msgid "Description"
+msgstr "Descripcion"
+
+#: src/exec_dat.cpp:1648
+msgid "Detect curves for maximums of data array"
+msgstr "Analizar curvas en busca de maximos"
+
+#: mgllab/table.cpp:164 mgllab/table.cpp:776
+msgid "Difference"
+msgstr "Diferencia"
+
+#: udav/dat_pnl.cpp:616
+msgid "Differentiate data along direction(s)"
+msgstr "Diferenciar datos en la(s) direccion(es)"
+
+#: udav/opt_dlg.cpp:58 mgllab/dialogs.cpp:113 mgllab/dialogs.cpp:1005
+msgid "Diffuse"
+msgstr "Difuso"
+
+#: src/exec_dat.cpp:1652
+msgid "Dilate data larger val"
+msgstr "Dilate data larger val"
+
+#: src/exec_dat.cpp:1639
+msgid "Direct multiplication of arrays"
+msgstr "Multiplicacion directa de arreglos"
+
+#: udav/dat_pnl.cpp:351 udav/dat_pnl.cpp:377 udav/dat_pnl.cpp:424
+#: mgllab/dialogs.cpp:161 mgllab/table.cpp:549
+msgid "Direction"
+msgstr "Direccion"
+
+#: mgllab/table.cpp:551
+msgid "Direction along which data will be filled"
+msgstr "Direccion para llenar los datos"
+
+#: udav/subplot_dlg.cpp:105 udav/subplot_dlg.cpp:122
+msgid "Distance between cells"
+msgstr "Distancia entre celdas"
+
+#: mgllab/table.cpp:799
+msgid "Divide by"
+msgstr "Dividir por"
+
+#: src/exec_dat.cpp:1653
+msgid "Divide by data or number"
+msgstr "Dividir por datos o numero"
+
+#: mgllab/table.cpp:180 mgllab/table.cpp:354 mgllab/table.cpp:677
+msgid "Do"
+msgstr "Hacer"
+
+#: src/exec_dat.cpp:1716
+msgid "Do STFA transform"
+msgstr "Transformada STFA"
+
+#: src/exec_dat.cpp:1722 src/exec_dat.cpp:1723
+msgid "Do integral transform of data"
+msgstr "Transformada integral de datos"
+
+#: mgllab/table.cpp:102 mgllab/table.cpp:557 mgllab/table.cpp:620
+#: mgllab/table.cpp:676
+msgid "Do nothing and close this window"
+msgstr "Cerrar esta ventana sin hacer nada"
+
+#: udav/mem_pnl.cpp:122
+msgid "Do you want to delete all data?"
+msgstr "Desea borrar todos los datos?"
+
+#: udav/udav_wnd.cpp:341 udav/udav_wnd.cpp:580 udav/udav_wnd.cpp:622
+msgid "Do you want to save the changes to the document?"
+msgstr "Desea guardar los cambios del documento?"
+
+#: mgllab/editor.cpp:282
+msgid "Don't Save"
+msgstr "No guardar"
+
+#: mgllab/table.cpp:164
+msgid "Double diff."
+msgstr "Doble dif."
+
+#: src/exec_gr.cpp:1135
+msgid "Draw Bifurcation diagram"
+msgstr "Diagrama de bifurcacion"
+
+#: src/exec_gr.cpp:1171
+msgid "Draw Iris plots"
+msgstr "Grafico de Iris"
+
+#: src/exec_gr.cpp:1173
+msgid "Draw Lamerey diagram"
+msgstr "Diagrama de Lamerey"
+
+# apertura-alto-bajo-clausura?
+#: src/exec_gr.cpp:1177
+msgid "Draw Open-High-Low-Close (OHLC) diagram"
+msgstr "Diagrama (OHLC)"
+
+#: src/exec_gr.cpp:1180
+msgid "Draw Poincare map"
+msgstr "Mapa de Poincare"
+
+#: src/exec_gr.cpp:1186
+msgid "Draw STFA diagram"
+msgstr "Diagrama STFA"
+
+#: src/exec_gr.cpp:1198
+msgid "Draw TeX mark at point position"
+msgstr "Graficar marca de TeX en posicion"
+
+#: src/exec_prm.cpp:615
+msgid "Draw angle arc"
+msgstr "Graficar arco"
+
+#: src/exec_gr.cpp:1128
+msgid "Draw area plot for 1D data"
+msgstr "Grafica de area para datos 1D"
+
+#: src/exec_gr.cpp:1131
+msgid "Draw bars for 1D data"
+msgstr "Grafica de barras para 1D"
+
+#: src/exec_gr.cpp:1133
+msgid "Draw belts"
+msgstr "Grafica de correas"
+
+#: src/exec_gr.cpp:1134
+msgid "Draw belts colored by other data"
+msgstr "Grafica de correas coloreada por otros datos"
+
+#: src/exec_gr.cpp:1196
+msgid "Draw binormales for 1D data"
+msgstr "Grafico de binormales para datos 1D"
+
+#: src/exec_prm.cpp:641
+msgid "Draw bitmap (logo) along axis range"
+msgstr "Graficar imagen (logo) en el rango de ejes"
+
+#: src/exec_prm.cpp:619
+msgid "Draw bounding box"
+msgstr "Graficar bordes"
+
+#: src/exec_gr.cpp:1137
+msgid "Draw boxes"
+msgstr "Diagrama de cajas"
+
+#: src/exec_gr.cpp:1136
+msgid "Draw boxplot for 2D data"
+msgstr "Diagrama de cajas para datos 2D"
+
+#: src/exec_gr.cpp:1138
+msgid "Draw candlestick chart"
+msgstr "Diagrama de velas"
+
+#: src/exec_gr.cpp:1139
+msgid "Draw chart"
+msgstr "Grafico de cuadros"
+
+#: src/exec_prm.cpp:620
+msgid "Draw circle"
+msgstr "Graficar circulo"
+
+#: src/exec_gr.cpp:1140
+msgid "Draw cloud"
+msgstr "Grafico de nube"
+
+#: src/exec_prm.cpp:621
+msgid "Draw colorbar"
+msgstr "Graficar barra de colores"
+
+#: src/exec_prm.cpp:622
+msgid "Draw cone"
+msgstr "Dibujar cono"
+
+#: src/exec_gr.cpp:1141
+msgid "Draw cones for 1D data"
+msgstr "Grafico de conos para datos 1D"
+
+#: src/exec_gr.cpp:1142
+msgid "Draw contour lines"
+msgstr "Grafico de curvas de nivel"
+
+#: src/exec_gr.cpp:1152
+msgid "Draw contour lines at x-slice (or x-plane)"
+msgstr "Curvas de nivel en el plano x"
+
+#: src/exec_gr.cpp:1153
+msgid "Draw contour lines at y-slice (or y-plane)"
+msgstr "Curvas de nivel en el plano y"
+
+#: src/exec_gr.cpp:1154
+msgid "Draw contour lines at z-slice (or z-plane)"
+msgstr "Curvas de nivel en el plano z"
+
+#: src/exec_gr.cpp:1143
+msgid "Draw contour lines for 3D data"
+msgstr "Grafico de curvas de nivel para datos 3D"
+
+#: src/exec_gr.cpp:1203
+msgid "Draw contour lines for surface of triangles"
+msgstr "Curvas de nivel para superficie de triangulos"
+
+#: src/exec_gr.cpp:1150
+msgid "Draw contour lines on parametric surface"
+msgstr "Curvas de nivel sobre superficie parametrica"
+
+#: src/exec_gr.cpp:1151
+msgid "Draw contour tubes"
+msgstr "Cilindros de nivel"
+
+#: src/exec_gr.cpp:1204
+msgid "Draw contour tubes for surface of triangles"
+msgstr "Cilindros de nivel para superficie de triangulos"
+
+#: src/exec_prm.cpp:623
+msgid "Draw curve"
+msgstr "Graficar curva"
+
+#: src/exec_gr.cpp:1206
+msgid "Draw curve by tube"
+msgstr "Graficar curva tubular"
+
+#: src/exec_gr.cpp:1156
+msgid "Draw density plot"
+msgstr "Grafica de densidad"
+
+#: src/exec_gr.cpp:1157
+msgid "Draw density plot at slices of 3D data"
+msgstr "Grafica de densidad para secciones de datos 3D data"
+
+#: src/exec_gr.cpp:1158
+msgid "Draw density plot at x-slice (or x-plane)"
+msgstr "Grafica de densidad en el plano x"
+
+#: src/exec_gr.cpp:1159
+msgid "Draw density plot at y-slice (or y-plane)"
+msgstr "Grafica de densidad en el plano y"
+
+#: src/exec_gr.cpp:1160
+msgid "Draw density plot at z-slice (or z-plane)"
+msgstr "Grafica de densidad en el plano z"
+
+# Esquema de gotas?
+#: src/exec_gr.cpp:1161
+msgid "Draw dew plot"
+msgstr "Grafica de gotas"
+
+#: src/exec_gr.cpp:1162
+msgid "Draw dots for arbitrary data points"
+msgstr "Diagrama  para datos arbitrarios"
+
+#: src/exec_prm.cpp:624
+msgid "Draw drop"
+msgstr "Graficar gota"
+
+#: src/exec_prm.cpp:625
+msgid "Draw ellipse"
+msgstr "Graficar elipse"
+
+#: src/exec_prm.cpp:626
+msgid "Draw error box"
+msgstr "Graficar caja de error"
+
+#: src/exec_gr.cpp:1163
+msgid "Draw error boxes"
+msgstr "Graficar cajas de error"
+
+#: src/exec_prm.cpp:627
+msgid "Draw face (quadrangle)"
+msgstr "Graficar faceta (cuadrangulo)"
+
+#: src/exec_prm.cpp:628
+msgid "Draw face perpendicular to x-axis"
+msgstr "Graficar faceta perpendicular al eje x"
+
+#: src/exec_prm.cpp:629
+msgid "Draw face perpendicular to y-axis"
+msgstr "Graficar faceta perpendicular al eje y"
+
+#: src/exec_prm.cpp:630
+msgid "Draw face perpendicular to z-axis"
+msgstr "Graficar faceta perpendicular al eje z"
+
+#: src/exec_gr.cpp:1183
+msgid "Draw filled region (ribbon) between 2 curves"
+msgstr "Graficar region rellena (banda) entre dos curbas"
+
+#: src/exec_gr.cpp:1178
+msgid "Draw flow pipes for vector field"
+msgstr "Graficar tubos de flujo de campo vectorial"
+
+#: src/exec_gr.cpp:1165
+msgid "Draw flow threads for vector field"
+msgstr "Graficar lineas de flujo para campo vectorial"
+
+#: src/exec_gr.cpp:1167
+msgid "Draw flow threads from plain for vector field"
+msgstr "Draw flow threads from plain for vector field"
+
+#: src/exec_gr.cpp:1168
+msgid "Draw gradient lines for scalar field"
+msgstr "Graficar lineas de gradiente para campo escalar"
+
+#: src/exec_prm.cpp:635
+msgid "Draw grid"
+msgstr "Graficar grilla"
+
+#: src/exec_gr.cpp:1170
+msgid "Draw grid at slices of 3D data"
+msgstr "Graficar grilla para cortes de datos 3D"
+
+#: src/exec_gr.cpp:1169
+msgid "Draw grid for data array(s)"
+msgstr "Graficar grilla para arreglo(s) de datos"
+
+#: src/exec_gr.cpp:1130
+msgid "Draw horizontal bars for 1D data"
+msgstr "Graficar barras horizontales pata datos 1D"
+
+#: src/exec_gr.cpp:1199
+msgid "Draw horizontal tiles"
+msgstr "Graficar baldosas horizontales"
+
+#: src/exec_gr.cpp:1200
+msgid "Draw horizontal tiles with variable size"
+msgstr "Baldosas horizontales con tamaño variable"
+
+#: src/exec_gr.cpp:1188
+msgid "Draw isosurface for 3D data"
+msgstr "Isosuperficie para datos 3D"
+
+#: src/exec_gr.cpp:1191
+msgid "Draw isosurface for 3D data colored and transpared by other data"
+msgstr ""
+"Isosuperficie para datos 3D coloreados y con transparencia de otros datos"
+
+#: src/exec_gr.cpp:1190
+msgid "Draw isosurface for 3D data colored by other data"
+msgstr "Isosuperficie para datos 3D coloreada por otros datos"
+
+#: src/exec_gr.cpp:1189
+msgid "Draw isosurface for 3D data transpared by other data"
+msgstr "Isosuperficie para datos 3D con transparencia de otros datos"
+
+#: src/exec_gr.cpp:1172
+msgid "Draw label at arbitrary position"
+msgstr "Etiqueta en posicion arbitraria"
+
+#: src/exec_prm.cpp:649
+msgid "Draw label for t-axis"
+msgstr "Etiqueta para eje t"
+
+#: src/exec_prm.cpp:650
+msgid "Draw label for x-axis"
+msgstr "Draw label for x-axis"
+
+#: src/exec_prm.cpp:651
+msgid "Draw label for y-axis"
+msgstr "Etiqueta para el eje y"
+
+#: src/exec_prm.cpp:652
+msgid "Draw label for z-axis"
+msgstr "Etiqueta para el eje z"
+
+#: src/exec_prm.cpp:639
+msgid "Draw legend"
+msgstr "Graficar leyenda"
+
+#: src/exec_prm.cpp:640
+msgid "Draw line"
+msgstr "Graficar recta"
+
+#: src/exec_gr.cpp:1174
+msgid "Draw mapping plot"
+msgstr "Grafica de mapeo"
+
+#: src/exec_gr.cpp:1175
+msgid "Draw mark plot for 1D data"
+msgstr "Grafico de marcas para datos 1D"
+
+#: src/exec_gr.cpp:1176
+msgid "Draw mesh surface"
+msgstr "Graficar grilla de superficie"
+
+#: src/exec_prm.cpp:618
+msgid "Draw point (ball)"
+msgstr "Graficar punto (esfera)"
+
+#: src/exec_prm.cpp:642
+msgid "Draw polygon"
+msgstr "Graficar poligono"
+
+#: src/exec_gr.cpp:1132
+msgid "Draw quasi-optical beam"
+msgstr "Graficar haz cuasioptico"
+
+#: src/exec_gr.cpp:1182
+msgid "Draw radar chart"
+msgstr "Diagrama de radar"
+
+#: src/exec_gr.cpp:1155
+msgid "Draw reconstructed surface for arbitrary data points"
+msgstr "Graficar superficie reconstruida para puntos arbitrarios"
+
+#: src/exec_prm.cpp:643
+msgid "Draw rectangle"
+msgstr "Graficar rectangulo"
+
+#: src/exec_prm.cpp:644
+msgid "Draw rhombus"
+msgstr "Graficar rombo"
+
+#: src/exec_gr.cpp:1147
+msgid "Draw solid contour lines at x-slice (or x-plane)"
+msgstr "Curvas de nivel rellenas en el plano x"
+
+#: src/exec_gr.cpp:1148
+msgid "Draw solid contour lines at y-slice (or y-plane)"
+msgstr "Curvas de nivel rellenas en el plano y"
+
+#: src/exec_gr.cpp:1149
+msgid "Draw solid contour lines at z-slice (or z-plane)"
+msgstr "Curvas de nivel rellenas en el plano z"
+
+#: src/exec_gr.cpp:1146
+msgid "Draw solid contour lines for 3D data"
+msgstr "Isosuperficies rellenas para datos 3D"
+
+#: src/exec_gr.cpp:1145
+msgid "Draw solid contours"
+msgstr "Curvas de nivel rellenas"
+
+#: src/exec_gr.cpp:1144
+msgid "Draw solid contours with manual colors"
+msgstr "Curvas de nivel rellenas con coloracion manual"
+
+#: src/exec_gr.cpp:1187
+msgid "Draw solid surface"
+msgstr "Gaficar superficie solida"
+
+#: src/exec_gr.cpp:1194
+msgid "Draw solid surface colored and transpared by other data"
+msgstr "Superficie solida con color y transparencia de otros datos"
+
+#: src/exec_gr.cpp:1193
+msgid "Draw solid surface colored by other data"
+msgstr "Superficie solida con coloracion de otros datos"
+
+#: src/exec_gr.cpp:1192
+msgid "Draw solid surface transpared by other data"
+msgstr "Superficie solida con transparencia de otros datos"
+
+#: src/exec_prm.cpp:645
+msgid "Draw sphere"
+msgstr "Graficar esfera"
+
+#: src/exec_gr.cpp:1184
+msgid "Draw stem plot for 1D data"
+msgstr "Grafica de tallos para datos 1D"
+
+#: src/exec_gr.cpp:1185
+msgid "Draw step plot for 1D data"
+msgstr "Grafica scalonada para datos 1D"
+
+#: src/exec_gr.cpp:1201
+msgid "Draw surface of curve rotation"
+msgstr "Graficar superficie de rotacion"
+
+#: src/exec_gr.cpp:1181
+msgid "Draw surface of quadrangles"
+msgstr "Graficar superficie de cuadrangulos"
+
+#: src/exec_gr.cpp:1205
+msgid "Draw surface of triangles"
+msgstr "Graficar superficie de triangulos"
+
+#: src/exec_gr.cpp:1129
+msgid "Draw surfaces of contour lines rotation"
+msgstr "Superficie de rotacion de curvas de nivel"
+
+#: src/exec_gr.cpp:1195
+msgid "Draw table with data values"
+msgstr "Graficar tabla de valores"
+
+#: src/exec_gr.cpp:1197
+msgid "Draw tension plot for 1D data"
+msgstr "Grafica de tension para datos 1D"
+
+#: src/exec_prm.cpp:647
+msgid "Draw text at some position or along curve"
+msgstr "Texto en posicion especifica o curva"
+
+#: src/exec_prm.cpp:646
+msgid "Draw user-defined symbol at given position and direction"
+msgstr "Simbolo personalizado en posicion y direccion dadas"
+
+#: src/exec_gr.cpp:1179
+msgid "Draw usual plot for 1D data"
+msgstr "Grafica estandar para datos 1D"
+
+#: src/exec_gr.cpp:1207
+msgid "Draw vector field"
+msgstr "Campo vectorial"
+
+#: src/exec_gr.cpp:1208
+msgid "Draw vector field at slices of 3D data"
+msgstr "Campo vectorial de cortes de datos 3D"
+
+#: src/exec_gr.cpp:1202
+msgid "Draw vectors along a curve"
+msgstr "Vectores a lo largo de curva"
+
+#: src/exec_gr.cpp:1164
+msgid "Draw waterfalls"
+msgstr "Grafica de cascadas"
+
+#: udav/plot_pnl.cpp:111 udav/plot_pnl.cpp:130
+msgid "Drawing time %1 ms"
+msgstr "Tiempo de graficacion %1 ms"
+
+#: udav/newcmd_dlg.cpp:169 mgllab/dialogs.cpp:710
+msgid "Dual plots"
+msgstr "Graficas duales"
+
+#. L
+#: udav/style_dlg.cpp:244 mgllab/dialogs.cpp:52
+msgid "E - darklawn"
+msgstr "E - verde pasto oscuro"
+
+#: mgllab/dialogs.cpp:1469
+msgid "Edges"
+msgstr "Bordes"
+
+#: udav/text_pnl.cpp:84 mgllab/mgllab.cpp:307
+msgid "Edit"
+msgstr "Editar"
+
+#: udav/mem_pnl.cpp:59
+msgid "Edit selected data array"
+msgstr "Editor arreglo de datos deleccionado"
+
+#: udav/calc_dlg.cpp:193
+msgid "Elliptic"
+msgstr "Eliptico"
+
+#: udav/prop_dlg.cpp:171 mgllab/mgllab.cpp:489
+msgid "Enable keywords completion"
+msgstr "Completar palabras clave"
+
+#. pure = new QCheckBox(_("Disable face drawing (faster) for mouse rotation/shift/zoom."), this);
+#. pure->setChecked(mglAutoPure);      v->addWidget(pure);     pure->setEnabled(false);
+#: udav/prop_dlg.cpp:169 mgllab/mgllab.cpp:491
+msgid "Enable mouse wheel for zooming"
+msgstr "Rueda del maouse para el zoom"
+
+#: mgllab/dialogs.cpp:1463
+msgid "End"
+msgstr "Fin"
+
+#: udav/prop_dlg.cpp:141
+msgid "English"
+msgstr "Ingles"
+
+#. TODO show dialog for color scheme
+#: udav/dat_pnl.cpp:255 udav/dat_pnl.cpp:277 mgllab/table.cpp:477
+#: mgllab/table.cpp:490
+msgid "Enter color scheme"
+msgstr "Ingresar esquema de colores"
+
+#: udav/dat_pnl.cpp:261 udav/dat_pnl.cpp:283
+msgid "Enter data name"
+msgstr "Ingresar nombre de datos"
+
+#: mgllab/table.cpp:523
+msgid ""
+"Enter formula for data modification\n"
+"Here x, y, z in range [0,1], u is data value"
+msgstr ""
+"Ingresar formula para modificar datos\n"
+"Aqui, x, y, z estan en [0,1], u es valor de dato"
+
+#: udav/mem_pnl.cpp:85 mgllab/help.cpp:242
+msgid "Enter name for new variable"
+msgstr "Ingresar nombre para nueva variable"
+
+#. this is HDF file
+#. TODO add dialog with choice of HDF names
+#: mgllab/table.cpp:436
+msgid "Enter name of data"
+msgstr "Ingresar nombre de datos"
+
+#: udav/dat_pnl.cpp:388 udav/dat_pnl.cpp:402 udav/dat_pnl.cpp:436
+msgid "Enter new data sizes"
+msgstr "Nuevo tamaño para datos"
+
+#: mgllab/table.cpp:28
+msgid "Enter number for addition to data values"
+msgstr "Numero para sumar a valores"
+
+#: mgllab/table.cpp:58
+msgid "Enter number for division of data values"
+msgstr "Numero para division de valores"
+
+#: mgllab/table.cpp:48
+msgid "Enter number for multiplication of data values"
+msgstr "Numero para multiplicacion por valores"
+
+#: mgllab/table.cpp:38
+msgid "Enter number for subtraction from data values"
+msgstr "Numero para restar de valores"
+
+#: widgets/qt.cpp:949
+msgid "Enter number of vertexes"
+msgstr "Ingresar numero de vertices"
+
+#: udav/dat_pnl.cpp:351
+msgid "Enter range for data and direction of filling"
+msgstr "Rango para datos y direccion de llenado"
+
+#: udav/dat_pnl.cpp:366 udav/dat_pnl.cpp:377
+msgid "Enter range for final data"
+msgstr "Rango para datos finales"
+
+#: udav/dat_pnl.cpp:424
+msgid "Enter range of saved date."
+msgstr "Rango para datos guardados."
+
+#: udav/dat_pnl.cpp:485
+msgid "Enter slice id:"
+msgstr "Ingresar id del corte:"
+
+#: udav/dat_pnl.cpp:413
+msgid ""
+"Enter step of saved points. For example, '1' save all, '2' save each 2nd "
+"point, '3' save each 3rd and so on."
+msgstr ""
+"Ingresar distancia para guardar puntos. Ejemplos: '1' todo, '2' cada 2 "
+"puntos, '3' cada tres puntos, etc."
+
+#: widgets/qt.cpp:958
+msgid "Enter text"
+msgstr "Ingresar texto"
+
+#: mgllab/dialogs.cpp:860 mgllab/dialogs.cpp:866
+#, c-format
+msgid "Enter value for %s argument"
+msgstr "Ingresar valor para argumento %s"
+
+#: mgllab/table.cpp:166 mgllab/table.cpp:786
+msgid "Envelop"
+msgstr "Envoltura"
+
+#: src/exec_dat.cpp:1656
+msgid "Erode data larger val"
+msgstr "Erosionar datos"
+
+#: mgllab/editor.cpp:348
+#, c-format
+msgid ""
+"Error reading from file '%s':\n"
+"%s."
+msgstr ""
+"Error al leer archivo '%s':\n"
+"%s."
+
+# Viewer=visor?
+#: src/export.cpp:629 src/export.cpp:638 src/export.cpp:645
+#, c-format
+msgid "Error to call external viewer\n"
+msgstr "Error al ejecutar visor externo\n"
+
+#: mgllab/editor.cpp:359
+#, c-format
+msgid ""
+"Error writing to file '%s':\n"
+"%s."
+msgstr ""
+"Error al escribir al archivo '%s':\n"
+"%s."
+
+#: src/exec_dat.cpp:1657
+msgid ""
+"Evaluate (interpolate) values of array Dat at points i=idat,j=jdat,k=kdat"
+msgstr ""
+"Evaluar (interpolar) valores de arreglo Dat en los puntos i=idat,j=jdat,"
+"k=kdat"
+
+#. {"defpal",_("Define parameter as palette color"),"defpal $N val", 0, 6},
+#: src/parser.cpp:1488
+msgid "Execute if condition is false"
+msgstr "Ejecutar si condicion es falsa"
+
+#: mgllab/mgllab.cpp:487
+msgid "Execute script after loading"
+msgstr "Ejecutar script al cargarlo"
+
+#: widgets/qt.cpp:1145 udav/plot_pnl.cpp:333
+msgid "Execute script and redraw graphics (F5)."
+msgstr "Ejecutar script y volver a graficar (F5)."
+
+#: src/parser.cpp:1481
+msgid "Execute script in external file"
+msgstr "Ejecutar script de archivo externo"
+
+#: mgllab/help.cpp:146
+msgid "Existing data arrays"
+msgstr "Arreglos de datos existentes"
+
+#: mgllab/mgllab.cpp:305
+msgid "Exit"
+msgstr "Salir"
+
+#: udav/calc_dlg.cpp:192
+msgid "Exp and log"
+msgstr "Exp y log"
+
+#: udav/calc_dlg.cpp:194
+msgid "Exp-integrals"
+msgstr "Integrales exp"
+
+#: mgllab/table.cpp:473
+msgid "Export Data?"
+msgstr "Exportar datos?"
+
+#: widgets/fltk.cpp:811
+msgid "Export as ..."
+msgstr "Exportar como ..."
+
+#: widgets/qt.cpp:1080 udav/plot_pnl.cpp:474
+msgid "Export as 2D ..."
+msgstr "Exportar como 2D ..."
+
+#: widgets/qt.cpp:1089 udav/plot_pnl.cpp:484
+msgid "Export as 3D ..."
+msgstr "Exportar como 3D ..."
+
+#: src/exec_dat.cpp:1658 mgllab/table.cpp:846
+msgid "Export data to PNG file"
+msgstr "Exportar a PNG"
+
+#. fname = new QLineEdit(this);        a->addWidget(fname);
+#: udav/anim_dlg.cpp:82
+msgid "Export to GIF"
+msgstr "Exportar a GIF"
+
+#: mgllab/table.cpp:754
+msgid "Export to PNG"
+msgstr "Exportar a PNG"
+
+#: src/exec_dat.cpp:1659
+msgid "Extend data array"
+msgstr "Extender arreglo de datos"
+
+#: mgllab/table.cpp:343
+msgid "Extract data"
+msgstr "Extraer datos"
+
+#: src/exec_dat.cpp:1717
+msgid "Extract sub-array"
+msgstr "Extraer subarreglo"
+
+#: src/exec_dat.cpp:1709
+msgid "Extract sub-array between values"
+msgstr "Extraer subarreglo entre valores"
+
+#: mgllab/dialogs.cpp:962
+msgid "Factor"
+msgstr "Factor"
+
+#. file menu
+#: widgets/qt.cpp:1079 udav/udav_wnd.cpp:281 udav/dat_pnl.cpp:681
+#: mgllab/mgllab.cpp:292 mgllab/table.cpp:750
+msgid "File"
+msgstr "Archivo"
+
+#: udav/text_pnl.cpp:405 udav/text_pnl.cpp:489
+msgid "File %1 saved"
+msgstr "Archivo %1 guardado"
+
+#: mgllab/mgllab.cpp:242
+msgid "File exist. Overwrite it?"
+msgstr "¡Sobreescribir archivo existente?"
+
+#: udav/text_pnl.cpp:583
+msgid "File name"
+msgstr "Nombre de archivo"
+
+#: mgllab/mgllab.cpp:318
+msgid "File path"
+msgstr "Ubicacion de archivo"
+
+#: mgllab/dialogs.cpp:1073
+msgid "File to export"
+msgstr "Archivo para exportar"
+
+#: mgllab/editor.cpp:267 mgllab/mgllab.cpp:412
+msgid "File/Recent files"
+msgstr "Archivo/Archivos recientes"
+
+#: mgllab/table.cpp:767
+msgid "Fill"
+msgstr "Llenar"
+
+#: udav/dat_pnl.cpp:611 mgllab/table.cpp:856
+msgid "Fill data by formula"
+msgstr "Llenar datos por formula"
+
+#: src/exec_dat.cpp:1665
+msgid "Fill data by global spline of Vdat"
+msgstr "Llenar datos con spline global de Vdat"
+
+#: src/exec_dat.cpp:1701
+msgid "Fill data by interpolation of Vdat"
+msgstr "Llenar datos por interpolacion de Vdat"
+
+#: src/exec_dat.cpp:1645
+msgid "Fill data by triangulated values"
+msgstr "Llenar datos con valores triangulados"
+
+#: src/exec_dat.cpp:1660
+msgid "Fill data linearly in range [v1, v2]"
+msgstr "Llenar datos linealmente en rango [v1, v2]"
+
+#: mgllab/table.cpp:578 mgllab/table.cpp:592
+msgid "Fill in range"
+msgstr "Llenar en rango"
+
+#: src/exec_dat.cpp:1661
+msgid "Fill x-,k-samples for transforms"
+msgstr "Llenar muestreo x o k para transformada"
+
+#: udav/find_dlg.cpp:48 mgllab/editor.cpp:559
+msgid "Find"
+msgstr "Buscar"
+
+#: src/exec_dat.cpp:1641
+msgid "Find correlation between data arrays"
+msgstr "Correlacion entre arreglos de datos"
+
+#: src/exec_dat.cpp:1655
+msgid "Find envelop for the data"
+msgstr "Envoltura para datos"
+
+#: udav/dat_pnl.cpp:624
+msgid "Find envelope along direction(s)"
+msgstr "Envoltura a lo largo de direccion(es)"
+
+#: udav/dat_pnl.cpp:804
+msgid "Find histogram of data."
+msgstr "Histograma de datos."
+
+#: src/exec_dat.cpp:1676
+msgid "Find maximal value over direction"
+msgstr "Valor maximal en una direccion"
+
+#: src/exec_dat.cpp:1677
+msgid "Find minimal value over direction"
+msgstr "Valor minimal en una direccion"
+
+#: udav/text_pnl.cpp:551 mgllab/mgllab.cpp:316
+msgid "Find next"
+msgstr "Buscar sgte."
+
+#: mgllab/editor.cpp:515
+msgid "Find or replace text"
+msgstr "Buscar o reemplazar texto"
+
+#: src/exec_dat.cpp:1713
+msgid "Find root Dat[i,j,k]=val (inverse evaluate)"
+msgstr "Encontrar raiz Dat[i,j,k]=val (evaluacion inversa)"
+
+#: src/exec_dat.cpp:1705
+msgid "Find roots using data as initial values"
+msgstr "Encontrar raices usando datos como valores iniciales"
+
+#: src/exec_dat.cpp:1719
+msgid "Find summation over direction"
+msgstr "Sumatoria en una direccion"
+
+#: src/exec_dat.cpp:1725
+msgid "Find triangles of randomly placed points"
+msgstr "Triangulacion de puntos arbitrarios"
+
+#: udav/find_dlg.cpp:36 mgllab/editor.cpp:558
+msgid "Find what:"
+msgstr "Find what:"
+
+#: udav/text_pnl.cpp:546 mgllab/editor.cpp:557
+msgid "Find/Replace"
+msgstr "Buscar/Reemplazar"
+
+#: mgllab/mgllab.cpp:315
+msgid "Find|Replace"
+msgstr "Buscar|Reemplazar"
+
+#: src/parser.cpp:1490
+msgid "Finish if/else block"
+msgstr "Terminar bloque if/else"
+
+#: mgllab/table.cpp:806
+msgid "First cell"
+msgstr "Primera celda"
+
+#: udav/dat_pnl.cpp:721 mgllab/table.cpp:802
+msgid "First slice"
+msgstr "Primera seccion"
+
+#: src/exec_dat.cpp:1662 src/exec_dat.cpp:1663
+msgid "Fit data to formula"
+msgstr "Ajustar datos a formula"
+
+#: udav/text_pnl.cpp:567 mgllab/mgllab.cpp:322
+msgid "Fitted formula"
+msgstr "Formula ajustada"
+
+#: udav/prop_dlg.cpp:103
+msgid "FlowKey"
+msgstr "FlowKey"
+
+#: mgllab/dialogs.cpp:1009
+msgid "Fog"
+msgstr "Niebla"
+
+#: mgllab/dialogs.cpp:1010
+msgid "Fog dist."
+msgstr "Dist. niebla"
+
+#: mgllab/mgllab.cpp:548
+msgid "Folder for help files"
+msgstr "Folder de archivos de ayuda"
+
+#: udav/text_pnl.cpp:587 mgllab/mgllab.cpp:319
+msgid "Folder path"
+msgstr "Ubicacion de directorio"
+
+#: udav/setup_dlg.cpp:105 mgllab/dialogs.cpp:1007
+msgid "Font"
+msgstr "Fuente"
+
+#: mgllab/mgllab.cpp:539
+msgid "Font file name"
+msgstr "Nombre de archivo de fuente"
+
+#: udav/prop_dlg.cpp:199
+msgid "Font files (*.vfm)"
+msgstr "Archivos de fuente (*.vfm)"
+
+#: mgllab/mgllab.cpp:478
+msgid "Font kind"
+msgstr "Tipo de fuente"
+
+#: mgllab/mgllab.cpp:480
+msgid "Font size"
+msgstr "Tamaño de fuente"
+
+#: udav/style_dlg.cpp:183
+msgid "Font style"
+msgstr "Estilo de fuente"
+
+#: udav/setup_dlg.cpp:107
+msgid "FontSize"
+msgstr "FontSize"
+
+#: src/parser.cpp:1491
+msgid "For loop"
+msgstr "Bucle for"
+
+#: udav/help_pnl.cpp:52
+msgid "Forward"
+msgstr "Adelante"
+
+#: udav/plot_pnl.cpp:192
+msgid "Frame %1 of %2"
+msgstr "Cuadro %1 de %2"
+
+#: udav/dat_pnl.cpp:351 udav/dat_pnl.cpp:366 udav/dat_pnl.cpp:377
+#: udav/dat_pnl.cpp:424 udav/dat_pnl.cpp:452 mgllab/table.cpp:608
+msgid "From"
+msgstr "Desde"
+
+#: mgllab/mgllab.cpp:607
+msgid "Function"
+msgstr "Funcion"
+
+#. B
+#: udav/style_dlg.cpp:238 mgllab/dialogs.cpp:46
+msgid "G - green"
+msgstr "G - verde"
+
+#: src/export.cpp:306 src/export.cpp:375 src/export.cpp:388
+msgid "GIF support was disabled. Please, enable it and rebuild MathGL."
+msgstr "Formato GIF desabilitado. Habilitelo y recompile MathGL."
+
+#: udav/newcmd_dlg.cpp:178 udav/setup_dlg.cpp:112 mgllab/dialogs.cpp:719
+#: mgllab/dialogs.cpp:1001
+msgid "General setup"
+msgstr "Config. general"
+
+#: src/exec_dat.cpp:1673
+msgid "Get Jacobian"
+msgstr "Obtener Jacobian"
+
+#: src/exec_dat.cpp:1638
+msgid "Get data column filled by formula on column ids"
+msgstr "Llenar columna de datos por formula en ids de columnas"
+
+#: src/exec_dat.cpp:1708
+msgid "Get formated data from file"
+msgstr "Obtener datos con formato de archivo"
+
+#: src/exec_dat.cpp:1680
+msgid "Get momentum along direction"
+msgstr "Obtener el momento en una direccion"
+
+#: src/exec_dat.cpp:1690
+msgid "Get pulse properties"
+msgstr "Obtener propiedades de pulso"
+
+#: src/exec_dat.cpp:1721
+msgid "Get trace of array"
+msgstr "Obtener la traza de un arreglo"
+
+#: src/base_cf.cpp:85
+#, c-format
+msgid "Global message - %s\n"
+msgstr "Mensaje global - %s\n"
+
+#: udav/dat_pnl.cpp:723 mgllab/table.cpp:867
+msgid "Go to first slice for 3D data (Ctrl-F1)."
+msgstr "Ir a primera seccion de datos 3D (Ctrl-F1)."
+
+#: udav/dat_pnl.cpp:753 mgllab/table.cpp:871
+msgid "Go to last slice for 3D data (Ctrl-F4)."
+msgstr "Ir a ultima seccion de datos 3D (Ctrl-F4)."
+
+#: udav/dat_pnl.cpp:740
+msgid "Go to slice"
+msgstr "Ir a seccion"
+
+#: udav/dat_pnl.cpp:747
+msgid "Go to the next slice for 3D data."
+msgstr "Ir a la sgte. seccion de datos 3D."
+
+#: udav/dat_pnl.cpp:729
+msgid "Go to the previous slice for 3D data."
+msgstr "Ir a la seccion previa de datos 3D."
+
+#: udav/dat_pnl.cpp:735 udav/dat_pnl.cpp:742
+msgid "Go to the specified slice for 3D data."
+msgstr "Ir a la seccion especificada de datos 3D."
+
+#: widgets/qt.cpp:1108 widgets/qt.cpp:1110 udav/plot_pnl.cpp:66
+#: mgllab/mgllab.cpp:334
+msgid "Graphics"
+msgstr "Grafica"
+
+#: udav/text_pnl.cpp:596
+msgid "Graphics setup"
+msgstr "Config. grafica"
+
+#: widgets/fltk.cpp:960
+msgid "Graphics/Adjust size"
+msgstr "Grafica/Ajustar tamano"
+
+#. /< Parameter for handling animation
+#. /< Callback function for next frame
+#. /< Callback function for prev frame
+#. /< Callback function for delay
+#. /< Callback function for reloading
+#. / Toggle transparency (alpha) button
+#: widgets/fltk.cpp:954 include/mgl2/Fl_MathGL.h:164
+msgid "Graphics/Alpha"
+msgstr "Grafica/Alfa"
+
+#: widgets/fltk.cpp:989
+msgid "Graphics/Animation/Next frame"
+msgstr "Grafica/Animacion/Sgte. cuadro"
+
+#: widgets/fltk.cpp:990
+msgid "Graphics/Animation/Prev frame"
+msgstr "Grafica/Animacion/Ant. cuadro"
+
+#: mgllab/mgllab.cpp:386
+msgid "Graphics/Animation/Setup animation"
+msgstr "Grafica/Animacion/Config. animacion"
+
+#. / Toggle slideshow button
+#: widgets/fltk.cpp:988 include/mgl2/Fl_MathGL.h:168
+msgid "Graphics/Animation/Slideshow"
+msgstr "Grafica/Animacion/Presentacion"
+
+#: widgets/fltk.cpp:964
+msgid "Graphics/Copy click coor."
+msgstr "Grafica/Copiar coord. al clicar"
+
+#: widgets/fltk.cpp:963
+msgid "Graphics/Copy graphics"
+msgstr "Grafica/Copiar grafica"
+
+#: widgets/fltk.cpp:977
+msgid "Graphics/Export/as BMP"
+msgstr "Grafica/Exportar/como BMP"
+
+#: widgets/fltk.cpp:975
+msgid "Graphics/Export/as GIF"
+msgstr "Grafica/Exportar/como GIF"
+
+#: widgets/fltk.cpp:972
+msgid "Graphics/Export/as JPEG"
+msgstr "Grafica/Exportar/como JPEG"
+
+#: widgets/fltk.cpp:983
+msgid "Graphics/Export/as OBJ"
+msgstr "Grafica/Exportar/como OBJ"
+
+#: widgets/fltk.cpp:984
+msgid "Graphics/Export/as OFF"
+msgstr "Grafica/Exportar/como OFF"
+
+#: widgets/fltk.cpp:968
+msgid "Graphics/Export/as PNG"
+msgstr "Grafica/Exportar/como PNG"
+
+#: widgets/fltk.cpp:982
+msgid "Graphics/Export/as PRC"
+msgstr "Grafica/Exportar/como PRC"
+
+#: widgets/fltk.cpp:985
+msgid "Graphics/Export/as STL"
+msgstr "Grafica/Exportar/como STL"
+
+#: widgets/fltk.cpp:978
+msgid "Graphics/Export/as SVG"
+msgstr "Grafica/Exportar/como SVG"
+
+#: widgets/fltk.cpp:981
+msgid "Graphics/Export/as TeX"
+msgstr "Grafica/Exportar/como TeX"
+
+#: widgets/fltk.cpp:986
+msgid "Graphics/Export/as XYZ"
+msgstr "Grafica/Exportar/como XYZ"
+
+#: widgets/fltk.cpp:980
+msgid "Graphics/Export/as bitmap EPS"
+msgstr "Grafica/Exportar/como mapa de bits EPS"
+
+#: widgets/fltk.cpp:969
+msgid "Graphics/Export/as solid PNG"
+msgstr "Grafica/Exportar/como PNG solido"
+
+#: widgets/fltk.cpp:979
+msgid "Graphics/Export/as vector EPS"
+msgstr "Grafica/Exportar/como EPS vectorial"
+
+#. / Toggle grid drawing button
+#: widgets/fltk.cpp:956 include/mgl2/Fl_MathGL.h:170
+msgid "Graphics/Grid"
+msgstr "Grafica/Grilla"
+
+#. / Toggle lighting button
+#: widgets/fltk.cpp:955 include/mgl2/Fl_MathGL.h:166
+msgid "Graphics/Light"
+msgstr "Grafica/Luz"
+
+#. / Toggle pause calculation button
+#: widgets/fltk.cpp:965 include/mgl2/Fl_MathGL.h:182 mgllab/mgllab.cpp:387
+msgid "Graphics/Pause calc"
+msgstr "Grafica/Pausar calc."
+
+#: mgllab/mgllab.cpp:385
+msgid "Graphics/Primitive"
+msgstr "Grafica/Primitiva"
+
+#: widgets/fltk.cpp:959
+msgid "Graphics/Redraw"
+msgstr "Grafica/Redibujar"
+
+#: widgets/fltk.cpp:961
+msgid "Graphics/Reload data"
+msgstr "Graficar/Volver a cargar datos"
+
+#: widgets/fltk.cpp:958
+msgid "Graphics/Restore"
+msgstr "Grafica/Reestablecer"
+
+#: widgets/fltk.cpp:962
+msgid "Graphics/Stop"
+msgstr "Grafica/Detener"
+
+#: widgets/fltk.cpp:996
+msgid "Graphics/Transform/Move down"
+msgstr "Grafica/Transformar/Mover abajo"
+
+#: widgets/fltk.cpp:992
+msgid "Graphics/Transform/Move left"
+msgstr "Grafica/Transformar/Mover izq."
+
+#: widgets/fltk.cpp:997
+msgid "Graphics/Transform/Move right"
+msgstr "Grafica/Transformar/Mover der."
+
+#: widgets/fltk.cpp:993
+msgid "Graphics/Transform/Move up"
+msgstr "Grafica/Transformar/Mover arriba"
+
+#: widgets/fltk.cpp:994
+msgid "Graphics/Transform/Zoom in"
+msgstr "Grafica/Transformar/Acercar"
+
+#: widgets/fltk.cpp:995
+msgid "Graphics/Transform/Zoom out"
+msgstr "Grafica/Transformar/Alejar"
+
+#: udav/plot_pnl.cpp:304
+msgid "Grid"
+msgstr "Grilla"
+
+#: udav/newcmd_dlg.cpp:50 mgllab/dialogs.cpp:705
+msgid "Groups of MGL commands"
+msgstr "Grupos de comandos de MGL"
+
+#. P
+#: udav/style_dlg.cpp:249 mgllab/dialogs.cpp:57
+msgid "H - darkgray"
+msgstr "H - gris oscuro"
+
+#: src/data_io.cpp:1092
+msgid "HDF4 support was disabled. Please, enable it and rebuild MathGL."
+msgstr "Formato HDF4 deshabilitado. Habilitelo y recompile MathGL."
+
+#: src/complex_io.cpp:925 src/complex_io.cpp:927 src/data_io.cpp:1191
+#: src/data_io.cpp:1193 src/data_io.cpp:1195 src/data_io.cpp:1197
+msgid "HDF5 support was disabled. Please, enable it and rebuild MathGL."
+msgstr "Formato HDF5 deshabilitado. Habilitelo y recompile MathGL."
+
+#: mgllab/table.cpp:165 mgllab/table.cpp:781
+msgid "Hankel"
+msgstr "Hankel"
+
+#: udav/dat_pnl.cpp:622
+msgid "Hankel transform along direction(s)"
+msgstr "Transformada de Hankel en alguna(s) direccion(es)"
+
+#: src/exec_dat.cpp:1666
+msgid "Hankel transform at some direction"
+msgstr "Transformada de Hankel en alguna direccion"
+
+#: udav/subplot_dlg.cpp:84
+msgid "Height of selected cells"
+msgstr "Altura de celdas seleccionadas"
+
+#: widgets/qt.cpp:1289 udav/help_pnl.cpp:57 udav/udav_wnd.cpp:231
+#: udav/udav_wnd.cpp:323 mgllab/mgllab.cpp:344 mgllab/mgllab.cpp:345
+#: mgllab/mgllab.cpp:373
+msgid "Help"
+msgstr "Ayuda"
+
+#: udav/newcmd_dlg.cpp:73
+msgid ""
+"Here you can specify command options.\n"
+"Options are used for additional plot tunning."
+msgstr ""
+"Aqui puede especificar opciones de cmando.\n"
+"Uselas para configuracion adicional del grafico."
+
+#: udav/udav_wnd.cpp:186 mgllab/mgllab.cpp:313
+msgid "Hidden plots"
+msgstr "Graficos ocultos"
+
+#: udav/plot_pnl.cpp:431
+msgid "Hide selected"
+msgstr "Ocultar seleccionados"
+
+#: udav/plot_pnl.cpp:433
+msgid "Hide selected plots."
+msgstr "Ocultar graficos seleccionados."
+
+#: udav/prop_dlg.cpp:173 mgllab/mgllab.cpp:490
+msgid "Highlight current object(s)"
+msgstr "Resaltar objeto(s) actuales"
+
+#: udav/udav_wnd.cpp:328 mgllab/mgllab.cpp:346
+msgid "Hints"
+msgstr "Consejos"
+
+#: udav/dat_pnl.cpp:802
+msgid "Histogram (Ctrl+Shift+H)"
+msgstr "Histograma (Ctrl+Shift+H)"
+
+#: udav/subplot_dlg.cpp:51 udav/subplot_dlg.cpp:68 udav/subplot_dlg.cpp:93
+msgid "Horizontal size"
+msgstr "Tamano horizontal"
+
+#: udav/calc_dlg.cpp:192
+msgid "Hyperbolic"
+msgstr "Hiperbolicas"
+
+#: udav/setup_dlg.cpp:116
+msgid "ID"
+msgstr "ID"
+
+#: mgllab/mgllab.cpp:348
+msgid "Icon list"
+msgstr "Lista de iconos"
+
+#: mgllab/table.cpp:869
+msgid "Id of slice on third (z-) dimension"
+msgstr "Id de seccion en la tercera (z) dimension"
+
+#: udav/prop_dlg.cpp:154
+msgid "Image size"
+msgstr "Tamano de imagen"
+
+#: src/exec_dat.cpp:1689
+msgid "Immediately display the progress of calculation"
+msgstr "Mostrar inmediatamente el progreso de calculo"
+
+#: src/exec_dat.cpp:1688
+msgid "Immediately print the message"
+msgstr "Mostrar inmediatamente el mensaje"
+
+#: mgllab/table.cpp:485
+msgid "Import Data?"
+msgstr "¿Importar datos?"
+
+#: src/exec_dat.cpp:1669 mgllab/table.cpp:842
+msgid "Import data from PNG file"
+msgstr "Importar datos de archivo PNG"
+
+#: mgllab/table.cpp:752
+msgid "Import from PNG"
+msgstr "Importar de PNG"
+
+#: mgllab/table.cpp:769
+msgid "In range"
+msgstr "En rango"
+
+#: src/exec_dat.cpp:1664
+msgid "In-place Fourier transform"
+msgstr "Transformada de Gabor"
+
+#: mgllab/mathgl.cpp:247
+msgid "Incompatible loop parameters!"
+msgstr "¡Parametros de bucle incompatibles!"
+
+#: mgllab/table.cpp:503
+msgid "Incorrect type of base data"
+msgstr "Tipo incorrecto de datos base"
+
+#: udav/plot_pnl.cpp:552
+msgid "Increase \\phi angle by 10 degrees."
+msgstr "Incrementar angulo \\phi en 10 grados."
+
+#: udav/plot_pnl.cpp:544
+msgid "Increase \\theta angle by 10 degrees."
+msgstr "Incrementar angulo \\theta en 10 grados."
+
+#: mgllab/help.cpp:103
+msgid "Increase font size"
+msgstr "Aumentar tamano de fuente"
+
+#: udav/udav_wnd.cpp:229
+msgid "Info"
+msgstr "Info"
+
+#: udav/info_dlg.cpp:55 mgllab/help.cpp:354
+msgid "Information"
+msgstr "Informacion"
+
+#: mgllab/mgllab.cpp:321
+msgid "Inplot"
+msgstr "Grafica interna"
+
+#. insert menu
+#: udav/text_pnl.cpp:557 mgllab/mgllab.cpp:317
+msgid "Insert"
+msgstr "Insertar"
+
+#: mgllab/editor.cpp:518
+msgid "Insert MGL command"
+msgstr "Insertar comando de MGL"
+
+#: mgllab/table.cpp:755
+msgid "Insert as 'list'"
+msgstr "Insertar con 'list'"
+
+#: mgllab/editor.cpp:486
+msgid "Insert file content?"
+msgstr "¿Insertar contenido de archivo?"
+
+#: mgllab/mgllab.cpp:158
+msgid "Insert file name?"
+msgstr "¿Insertar nombre de archivo?"
+
+#: mgllab/editor.cpp:520
+msgid "Insert filename"
+msgstr "Insertar nombre de archivo"
+
+#: mgllab/editor.cpp:522
+msgid "Insert inplot command"
+msgstr "Insertar comando de grafica interna"
+
+#: udav/text_pnl.cpp:569
+msgid "Insert last fitted formula with found coefficients."
+msgstr "Insertar ultima formula ajustada con coeficientes encontrados."
+
+#: src/exec_dat.cpp:1671
+msgid "Insert slice of data"
+msgstr "Insertar seccion de datos"
+
+#: mgllab/table.cpp:849
+msgid "Insert to script as 'list' command"
+msgstr "Insertar al script como comando 'list'"
+
+#: mgllab/table.cpp:163 mgllab/table.cpp:775
+msgid "Integrate"
+msgstr "Integrar"
+
+#: src/exec_dat.cpp:1672 udav/dat_pnl.cpp:615
+msgid "Integrate data along direction(s)"
+msgstr "Integrar datos en una(s) direccion(es)"
+
+#: mgllab/dialogs.cpp:114
+msgid "Intensity of diffuse light"
+msgstr "Intensidad de luz difusa"
+
+#: udav/style_dlg.cpp:158 mgllab/dialogs.cpp:369
+msgid "Italic style"
+msgstr "Estilo italico"
+
+#: widgets/qt.cpp:1083 udav/plot_pnl.cpp:477
+msgid "JPEG"
+msgstr "JPEG"
+
+#: src/data_png.cpp:157 src/export.cpp:192
+msgid "JPEG support was disabled. Please, enable it and rebuild MathGL."
+msgstr "Formato JPEG deshabilitado. Habilitelo y recompile MathGL."
+
+#: udav/calc_dlg.cpp:193
+msgid "Jacobi"
+msgstr "Jacobi"
+
+#: src/exec_dat.cpp:1674
+msgid "Join data arrays"
+msgstr "Juntar arreglos de datos"
+
+#: mgllab/dialogs.cpp:1075
+msgid "Keep empty to put at beginning of main script."
+msgstr "Mantener vacio para poner al principio del script principal."
+
+#: udav/dat_pnl.cpp:780
+msgid "Keep only each n-th element of the data array."
+msgstr "Mantener solo cada n-esimo elemento del arreglo."
+
+#: mgllab/mathgl.cpp:200
+msgid "Keep slides in memory (faster animation but require more memory)"
+msgstr "Mantener cuadros en memoria (animacion rapida, ocupa mas memoria)"
+
+#: udav/prop_dlg.cpp:88
+msgid "Keywords"
+msgstr "Palabras clave"
+
+#: mgllab/dialogs.cpp:354 mgllab/dialogs.cpp:704 mgllab/dialogs.cpp:1457
+msgid "Kind"
+msgstr "Tipo"
+
+#: udav/newcmd_dlg.cpp:58
+msgid ""
+"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."
+msgstr ""
+"Tipo de argumentos de comando. La notacion es:\n"
+" * mayusculas denotan datos (ej.: Ydat);\n"
+" * argumentos en '' son texto (ej.: 'fmt');\n"
+" * otros argumentos son numeros (ej.: zval);\n"
+" * argumento en [] son opcionales."
+
+#: udav/info_dlg.cpp:50
+msgid "Kind of plots: lines for 1D, density for 2D."
+msgstr "Tipo de graficos: lineas para 1D, densidad para 2D."
+
+#. Y
+#: udav/style_dlg.cpp:243 mgllab/dialogs.cpp:51
+msgid "L - seagreen"
+msgstr "L - verde marino"
+
+#: widgets/qt.cpp:1087 udav/plot_pnl.cpp:481
+msgid "LaTeX"
+msgstr "LaTeX"
+
+#: udav/setup_dlg.cpp:66 mgllab/dialogs.cpp:954
+msgid "Label"
+msgstr "Etiqueta"
+
+#: udav/prop_dlg.cpp:139
+msgid "Language for UDAV"
+msgstr "Lenguaje para UDAV"
+
+#: mgllab/mgllab.cpp:493
+msgid "Language for mgllab"
+msgstr "Lenguaje para mgllab"
+
+#: udav/dat_pnl.cpp:617
+msgid "Laplace transform along direction(s)"
+msgstr "Transformada de Laplace an alguna(s) direccion(es)"
+
+#: mgllab/table.cpp:777
+msgid "Laplacian"
+msgstr "Laplaciano"
+
+#: udav/dat_pnl.cpp:751 mgllab/table.cpp:805
+msgid "Last slice"
+msgstr "Ultima seccion"
+
+#: udav/subplot_dlg.cpp:144
+msgid "Left bottom edge"
+msgstr "Esquina inferior izq."
+
+#: udav/subplot_dlg.cpp:152
+msgid "Left top edge"
+msgstr "Esquina superior izq."
+
+#: udav/opt_dlg.cpp:74 mgllab/dialogs.cpp:118
+msgid "Legend"
+msgstr "Leyenda"
+
+#: widgets/qt.cpp:1117 udav/opt_dlg.cpp:64 udav/setup_dlg.cpp:110
+#: udav/plot_pnl.cpp:297 mgllab/dialogs.cpp:115
+msgid "Light"
+msgstr "Luz"
+
+#: udav/setup_dlg.cpp:190
+msgid "Light position should be filled. Ignore it."
+msgstr "Light position should be filled. Ignore it."
+
+#: udav/setup_dlg.cpp:136 mgllab/dialogs.cpp:1053
+msgid "Light settings"
+msgstr "Config. de luz"
+
+#: src/exec_dat.cpp:1675
+msgid "Limit data to be inside [-v,v]"
+msgstr "Limitar datos al rango [-v,v]"
+
+#: udav/style_dlg.cpp:99 mgllab/dialogs.cpp:314
+msgid "Line style"
+msgstr "Estilo de linea"
+
+#: udav/style_dlg.cpp:78
+msgid "Line width"
+msgstr "Ancho de linea"
+
+#: mgllab/table.cpp:167
+msgid "Linear *3"
+msgstr "Lineal *3"
+
+#: mgllab/table.cpp:167
+msgid "Linear *5"
+msgstr "Lineal *5"
+
+#: mgllab/help.cpp:156
+msgid "List of available data."
+msgstr "Lista de datos disponibles."
+
+#: mgllab/table.cpp:427
+msgid "Load Data?"
+msgstr "¿Cargar datos?"
+
+#: src/exec_set.cpp:804
+msgid "Load commands from external DLL"
+msgstr "Cargar comandos de libreria externa"
+
+#: udav/dat_pnl.cpp:682
+msgid "Load data"
+msgstr "Cargar datos"
+
+#: mgllab/table.cpp:840
+msgid "Load data from file"
+msgstr "Cargar datos de archivo"
+
+#: udav/dat_pnl.cpp:684
+msgid ""
+"Load data from file. Data will be deleted only\n"
+"at exit but UDAV will not ask to save it (Ctrl+Shift+O)."
+msgstr ""
+"Cargar datos de archivo. Estos se borraran solo al\n"
+"cerrar UDAV, sin advertencia explicita (Ctrl+Shift+O)."
+
+#: src/exec_set.cpp:805
+msgid "Load fontfaces"
+msgstr "Cargar fuentes"
+
+#: mgllab/table.cpp:751
+msgid "Load from file"
+msgstr "Cargar de archivo"
+
+#: src/exec_prm.cpp:617
+msgid "Load image for background"
+msgstr "Cargar imagen como fondo"
+
+#: udav/prop_dlg.cpp:163
+msgid "Load script to new window"
+msgstr "Cargar script a nueva ventana"
+
+#: udav/text_pnl.cpp:467
+msgid "Loaded document "
+msgstr "Se cargo documento "
+
+#: udav/text_pnl.cpp:325
+msgid "Loaded document %1"
+msgstr "Se cargo documento %1"
+
+#: udav/udav_wnd.cpp:638
+msgid "Loading aborted"
+msgstr "Cargado abortado"
+
+#: mgllab/dialogs.cpp:98
+msgid "Low border for determining color or alpha"
+msgstr "Borde inferior para determinar color o alfa"
+
+#. C
+#: udav/style_dlg.cpp:241 mgllab/dialogs.cpp:49
+msgid "M - purple"
+msgstr "M - purpura"
+
+#: src/parser.cpp:1074
+msgid "MGL Parser"
+msgstr "Interprete MGL"
+
+#: udav/newcmd_dlg.cpp:53 mgllab/dialogs.cpp:725
+msgid "MGL commands for selected group"
+msgstr "Comandos de MGL para grupo seleccionado"
+
+#: mgllab/mgllab.cpp:229
+msgid "MGL files \t*.mgl"
+msgstr "Archivos MGL \t*.mgl"
+
+#: mgllab/mgllab.cpp:182
+msgid ""
+"MGL files \t*.mgl\n"
+"DAT files \t*.{dat,csv}"
+msgstr ""
+"Archivos MGL \t*.mgl\n"
+"Archivos DAT \t*.{dat,csv}"
+
+#: udav/open_dlg.cpp:102
+msgid "MGL files (*.mgl)"
+msgstr "Archivos MGL (*.mgl)"
+
+#: udav/udav_wnd.cpp:324
+msgid "MGL help"
+msgstr "Ayuda de MGL"
+
+#: mgllab/mathgl.cpp:397
+msgid "MGL messages"
+msgstr "Mensaje de MGL"
+
+#: mgllab/help.cpp:101
+msgid "MGL samples and hints"
+msgstr "Ejemplo y sugerencias de MGL"
+
+#: udav/udav_wnd.cpp:670
+msgid ""
+"MGL scripts (*.mgl)\n"
+"HDF5 files (*.hdf *.h5)\n"
+"All files (*.*)"
+msgstr ""
+"Scripts MGL (*.mgl)\n"
+"Archivos HDF5 (*.hdf *.h5)\n"
+"Todos los archivos (*.*)"
+
+#: udav/udav_wnd.cpp:635
+msgid ""
+"MGL scripts (*.mgl)\n"
+"HDF5 files (*.hdf *.h5)\n"
+"Text files (*.txt)\n"
+"Data files (*.dat)\n"
+"All files (*.*)"
+msgstr ""
+"Scripts MGL (*.mgl)\n"
+"Archivos HDF5 (*.hdf *.h5)\n"
+"Archivos de texto (*.txt)\n"
+"Archivos de datos (*.dat)\n"
+"Todos los archivos (*.*)"
+
+#: widgets/qt.cpp:1090 udav/plot_pnl.cpp:485
+msgid "MGLD"
+msgstr "MGLD"
+
+#: udav/dat_pnl.cpp:798
+msgid "Make another data."
+msgstr "Crear otros datos."
+
+#: udav/dat_pnl.cpp:796
+msgid "Make new (Ctrl+Shift+M)"
+msgstr "Crear nuevo (Ctrl+Shift+M)"
+
+#: udav/style_dlg.cpp:83 mgllab/dialogs.cpp:336
+msgid "Manual dashing"
+msgstr "Guiones peronalizados"
+
+#: udav/style_dlg.cpp:196
+msgid "Manual mask"
+msgstr "Mascaras personalozadas"
+
+#: udav/text_pnl.cpp:591 mgllab/mgllab.cpp:323
+msgid "Manual primitives"
+msgstr "Primitivas personalizadas"
+
+#: mgllab/dialogs.cpp:1467
+msgid "Mark"
+msgstr "Marca"
+
+#: udav/style_dlg.cpp:76 mgllab/dialogs.cpp:324
+msgid "Marks"
+msgstr "Marcas"
+
+#: mgllab/dialogs.cpp:352
+msgid "Mask"
+msgstr "Mascara"
+
+#: udav/style_dlg.cpp:124
+msgid "Mask for bitmap coloring"
+msgstr "Mascara para coloreo de imagen"
+
+#: udav/style_dlg.cpp:125
+msgid "Mask rotation angle"
+msgstr "Angulo de rotacion de mascara"
+
+#: udav/style_dlg.cpp:126
+msgid "Mask size"
+msgstr "Tamano de mascara"
+
+#: udav/find_dlg.cpp:42 mgllab/editor.cpp:562
+msgid "Match case"
+msgstr "Match case"
+
+#: widgets/qt.cpp:873
+msgid "MathGL - about"
+msgstr "MathGL - acerca de"
+
+#: src/base.cpp:259
+#, c-format
+msgid "MathGL message - %s\n"
+msgstr "Mensaje de MathGL - %s\n"
+
+#: widgets/qt.cpp:872
+msgid "MathGL v. 2."
+msgstr "MathGL v. 2."
+
+#: udav/open_dlg.cpp:70
+msgid "Matrix with sizes from file"
+msgstr "Matriz con tamano de archivo"
+
+#: udav/dat_pnl.cpp:541
+msgid "Max along direction(s)"
+msgstr "Max en direccion(es)"
+
+#: udav/setup_dlg.cpp:57 mgllab/dialogs.cpp:952
+msgid "Maximal"
+msgstr "Maximal"
+
+#: mgllab/table.cpp:546
+msgid "Maximal value (v2)"
+msgstr "Valor maximal (v2)"
+
+#: mgllab/table.cpp:548
+msgid "Maximal value for resulting data values"
+msgstr "Valor maximal para valores resultantes"
+
+#: mgllab/dialogs.cpp:88
+msgid "Maximal value of X for cutting or for coordinate filling"
+msgstr "Valor maximal de X para corte o para llenado de coord."
+
+#: mgllab/dialogs.cpp:92
+msgid "Maximal value of Y for cutting or for coordinate filling"
+msgstr "Valor maximal de Y para o para llenado de coord."
+
+#: mgllab/dialogs.cpp:96
+msgid "Maximal value of Z for cutting or for coordinate filling"
+msgstr "Valor maximal de Z para corte o para llenado de coord."
+
+#: src/data.cpp:1417
+#, c-format
+msgid "Maximum is %g\t at x = %ld\ty = %ld\tz = %ld\n"
+msgstr "Maximo es %g\t en x = %ld\ty = %ld\tz = %ld\n"
+
+#: mgllab/table.cpp:342 mgllab/table.cpp:791
+msgid "Maximum of"
+msgstr "Maximo de"
+
+#: udav/mem_pnl.cpp:68 udav/mem_pnl.cpp:73 mgllab/mgllab.cpp:375
+msgid "Memory"
+msgstr "Memoria"
+
+#: udav/opt_dlg.cpp:53
+msgid "Mesh num"
+msgstr "Mesh num"
+
+#: udav/setup_dlg.cpp:99 mgllab/dialogs.cpp:102
+msgid "MeshNum"
+msgstr "MeshNum"
+
+#: mgllab/mgllab.cpp:342
+msgid "Messages"
+msgstr "Mensajes"
+
+#: udav/udav_wnd.cpp:178
+msgid "Messages and warnings"
+msgstr "Mansajes y advertencias"
+
+#: udav/dat_pnl.cpp:540
+msgid "Min along direction(s)"
+msgstr "Min la(s) direccion(es)"
+
+#: udav/setup_dlg.cpp:52 mgllab/dialogs.cpp:951
+msgid "Minimal"
+msgstr "Minimal"
+
+#: mgllab/table.cpp:543
+msgid "Minimal value (v1)"
+msgstr "Valor minimal (v1)"
+
+#: mgllab/table.cpp:545
+msgid "Minimal value for resulting data values"
+msgstr "Valor minimal para datos resultantes"
+
+#: mgllab/dialogs.cpp:86
+msgid "Minimal value of X for cutting or for coordinate filling"
+msgstr "Valor minimal de X para corte o para llenado de coord."
+
+#: mgllab/dialogs.cpp:90
+msgid "Minimal value of Y for cutting or for coordinate filling"
+msgstr "Valor minimal de Y para corte o para llenado de coord."
+
+#: mgllab/dialogs.cpp:94
+msgid "Minimal value of Z for cutting or for coordinate filling"
+msgstr "Valor minimal de Z para corte o para llenado de coord."
+
+#: src/data.cpp:1420
+#, c-format
+msgid "Minimum is %g\t at x = %ld\ty = %ld\tz = %ld\n"
+msgstr "Minimo es %g\t en x = %ld\ty = %ld\tz = %ld\n"
+
+#: mgllab/table.cpp:342 mgllab/table.cpp:792
+msgid "Minimum of"
+msgstr "Minimo de"
+
+#. { _("Wavelet"),     0, wavelet_cb },
+#: mgllab/table.cpp:166 mgllab/table.cpp:783
+msgid "Mirror"
+msgstr "Reflejar"
+
+#: udav/dat_pnl.cpp:619
+msgid "Mirror data along direction(s)"
+msgstr "Reflejar datos en una(s) direccion(es)"
+
+#: src/exec_dat.cpp:1678
+msgid "Mirror data at some direction"
+msgstr "Reflejar datos en alguna(s) direccion(es)"
+
+#: src/exec_dat.cpp:1679
+msgid "Modify data values by formula"
+msgstr "Modificar datos por formula"
+
+#: udav/dat_pnl.cpp:542
+msgid "Momentum along 'x' for function"
+msgstr "Momento en direccion 'x' para funcion"
+
+#: udav/dat_pnl.cpp:543
+msgid "Momentum along 'y' for function"
+msgstr "Momento en direccion 'y' para funcion"
+
+#: udav/dat_pnl.cpp:544
+msgid "Momentum along 'z' for function"
+msgstr "Momento en direccion 'z' para funcion"
+
+#: widgets/qt.cpp:1246 udav/plot_pnl.cpp:527
+msgid "Move down"
+msgstr "Mover abajo"
+
+#: widgets/qt.cpp:1248 udav/plot_pnl.cpp:530
+msgid "Move graphics down 1/3 of its height."
+msgstr "Mover grafico abajo 1/3 de su altura."
+
+#: widgets/qt.cpp:1232 udav/plot_pnl.cpp:506
+msgid "Move graphics left by 1/3 of its width."
+msgstr "Mover grafico a la izq. 1/3 de su ancho."
+
+#: widgets/qt.cpp:1252 udav/plot_pnl.cpp:536
+msgid "Move graphics right by 1/3 of its width."
+msgstr "Mover grafico a la der. 1/3 de su ancho."
+
+#: widgets/qt.cpp:1236 udav/plot_pnl.cpp:512
+msgid "Move graphics up by 1/3 of its height."
+msgstr "Mover grafico arriba 1/3 de su altura."
+
+#: widgets/qt.cpp:1230 udav/plot_pnl.cpp:503
+msgid "Move left"
+msgstr "Mover a la izq."
+
+#: udav/text_pnl.cpp:593
+msgid "Move mouse-handled primitives to script."
+msgstr "Move mouse-handled primitives to script."
+
+#: udav/plot_pnl.cpp:454
+msgid "Move plot down"
+msgstr "Mover grafica abajo"
+
+#: udav/plot_pnl.cpp:449
+msgid "Move plot up"
+msgstr "Mover grafica arriba"
+
+#: widgets/qt.cpp:1250 udav/plot_pnl.cpp:533
+msgid "Move right"
+msgstr "Mover a la der."
+
+#: udav/plot_pnl.cpp:456
+msgid "Move selected plot down to next subplot."
+msgstr "Mover grafica seleccionada al subgrafico abajo."
+
+#: udav/plot_pnl.cpp:451
+msgid "Move selected plot up to previous subplot."
+msgstr "Mover grafica seleccionada al subgrafico arriba."
+
+#: widgets/qt.cpp:1234 udav/plot_pnl.cpp:509
+msgid "Move up"
+msgstr "Mover arriba"
+
+#: mgllab/table.cpp:798
+msgid "Multiply by"
+msgstr "Multiplicar por"
+
+#: src/exec_dat.cpp:1681
+msgid "Multiply by data or number"
+msgstr "Multiplicar por datos o numero"
+
+#. E
+#: udav/style_dlg.cpp:245 mgllab/dialogs.cpp:53
+msgid "N - darkskyblue"
+msgstr "N - azul cielo oscuro"
+
+#: udav/dat_pnl.cpp:500
+msgid "NOTE: All fields must be filled!"
+msgstr "NOTA: ¡Todos los campos deben llenarse!"
+
+#: udav/mem_pnl.cpp:68
+msgid "Name"
+msgstr "Nombre"
+
+#: mgllab/table.cpp:349
+msgid "Name for output"
+msgstr "Nombre para salida"
+
+#. navigation menu
+#: udav/dat_pnl.cpp:720 mgllab/table.cpp:801
+msgid "Navigation"
+msgstr "Navegacion"
+
+#: udav/newcmd_dlg.cpp:101 udav/newcmd_dlg.cpp:308 udav/newcmd_dlg.cpp:336
+#: udav/newcmd_dlg.cpp:340 udav/newcmd_dlg.cpp:354 udav/newcmd_dlg.cpp:367
+#: udav/newcmd_dlg.cpp:375 udav/newcmd_dlg.cpp:379 udav/newcmd_dlg.cpp:383
+#: udav/text_pnl.cpp:558 udav/plot_pnl.cpp:439 mgllab/dialogs.cpp:702
+msgid "New command"
+msgstr "Nuevo comando"
+
+#: udav/hint_dlg.cpp:40 mgllab/help.cpp:274
+msgid ""
+"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). "
+msgstr ""
+"Nuevos graficos no sobreescriben lo ya graficado. por ejemplo, se puede "
+"hacer una superficie con curvas de nivel usando los comandos 'surf' y 'cont' "
+"uno luego del otro (en cualquier orden). "
+
+#: udav/text_pnl.cpp:562 udav/plot_pnl.cpp:444
+msgid "New inplot"
+msgstr "Nuevo grafico interno"
+
+#: mgllab/table.cpp:672
+msgid "New order of dimensions"
+msgstr "Nuevo orden de dimensiones"
+
+#: udav/udav_wnd.cpp:282 mgllab/mgllab.cpp:293
+msgid "New script"
+msgstr ""
+
+#: mgllab/table.cpp:95
+msgid "New size of data on 1st dimension (x-direction)"
+msgstr ""
+
+#: mgllab/table.cpp:97
+msgid "New size of data on 2nd dimension (y-direction)"
+msgstr ""
+
+#: mgllab/table.cpp:99
+msgid "New size of data on 3d dimension (z-direction)"
+msgstr ""
+
+#: udav/hint_dlg.cpp:68
+msgid "Next"
+msgstr ""
+
+#: mgllab/help.cpp:306
+msgid "Next @->"
+msgstr ""
+
+#: udav/dat_pnl.cpp:745 mgllab/table.cpp:804
+msgid "Next slice"
+msgstr ""
+
+#: widgets/qt.cpp:1260 udav/plot_pnl.cpp:560
+msgid "Next slide"
+msgstr ""
+
+#: mgllab/help.cpp:135 mgllab/mgllab.cpp:242
+msgid "No"
+msgstr ""
+
+#: udav/dat_pnl.cpp:567 udav/dat_pnl.cpp:644
+msgid "No action is selected. Do nothing."
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:308
+msgid "No argument is selected"
+msgstr ""
+
+#: udav/dat_pnl.cpp:573
+msgid "No direction/formula is entered. Do nothing."
+msgstr ""
+
+#: widgets/qt.cpp:692 widgets/qt.cpp:704 widgets/qt.cpp:716 widgets/qt.cpp:728
+#: widgets/qt.cpp:740 widgets/qt.cpp:748 widgets/qt.cpp:756 widgets/qt.cpp:764
+#: widgets/qt.cpp:772 widgets/qt.cpp:780 widgets/qt.cpp:788 widgets/qt.cpp:796
+#: widgets/qt.cpp:812 widgets/qt.cpp:820 widgets/qt.cpp:828
+msgid "No filename."
+msgstr ""
+
+#: mgllab/editor.cpp:584 mgllab/editor.cpp:606 mgllab/editor.cpp:631
+#, c-format
+msgid "No occurrences of '%s' found!"
+msgstr ""
+
+#: mgllab/mathgl.cpp:262
+msgid "No selection. So nothing to do"
+msgstr ""
+
+#: udav/text_pnl.cpp:202
+msgid "No string occurrence is found"
+msgstr ""
+
+#: udav/setup_dlg.cpp:111
+msgid "No text rotation"
+msgstr ""
+
+#: widgets/fltk.cpp:834
+msgid "Normal view"
+msgstr ""
+
+#: mgllab/table.cpp:770
+msgid "Normalize"
+msgstr ""
+
+#: src/exec_dat.cpp:1683
+msgid "Normalize data"
+msgstr ""
+
+#: src/exec_dat.cpp:1684
+msgid "Normalize data slice by slice"
+msgstr ""
+
+#: mgllab/table.cpp:553
+msgid "Normalize in symmetrical range: -max(|v1|,|v2|) ... max(|v1|,|v2|)"
+msgstr ""
+
+#: udav/udav_wnd.cpp:444
+msgid "Not recognized"
+msgstr ""
+
+#: udav/dat_pnl.cpp:456
+msgid "Number of points"
+msgstr ""
+
+#: udav/prop_dlg.cpp:97
+msgid "Numbers"
+msgstr ""
+
+#: mgllab/table.cpp:176
+msgid "Numeric parameter"
+msgstr ""
+
+#: udav/text_pnl.cpp:579
+msgid "Numeric value"
+msgstr ""
+
+#: src/exec_dat.cpp:1649
+msgid "Numerically differentiate data"
+msgstr ""
+
+#: src/exec_dat.cpp:1650
+msgid "Numerically double differentiate data"
+msgstr ""
+
+#: udav/open_dlg.cpp:64
+msgid "Nx"
+msgstr ""
+
+#: udav/open_dlg.cpp:66
+msgid "Ny"
+msgstr ""
+
+#: udav/open_dlg.cpp:68
+msgid "Nz"
+msgstr ""
+
+#: widgets/qt.cpp:1092 udav/plot_pnl.cpp:487
+msgid "OBJ"
+msgstr ""
+
+#: udav/anim_dlg.cpp:69 udav/prop_dlg.cpp:182 udav/args_dlg.cpp:65
+#: udav/newcmd_dlg.cpp:80 udav/open_dlg.cpp:92 udav/dat_pnl.cpp:462
+#: udav/dat_pnl.cpp:512 udav/dat_pnl.cpp:554 udav/dat_pnl.cpp:631
+#: udav/opt_dlg.cpp:80 udav/files_dlg.cpp:60 udav/style_dlg.cpp:208
+#: udav/data_dlg.cpp:92 udav/subplot_dlg.cpp:221 mgllab/mathgl.cpp:198
+#: mgllab/dialogs.cpp:121 mgllab/dialogs.cpp:165 mgllab/dialogs.cpp:411
+#: mgllab/dialogs.cpp:585 mgllab/dialogs.cpp:750 mgllab/dialogs.cpp:1072
+#: mgllab/dialogs.cpp:1319 mgllab/dialogs.cpp:1474 mgllab/mgllab.cpp:498
+#: mgllab/table.cpp:621
+msgid "OK"
+msgstr ""
+
+#: mgllab/table.cpp:504
+msgid "Only current slice will be inserted"
+msgstr ""
+
+#: mgllab/mgllab.cpp:181
+msgid "Open File?"
+msgstr ""
+
+#: src/exec_dat.cpp:1686
+msgid "Open all data arrays from HDF file"
+msgstr ""
+
+#: udav/udav_wnd.cpp:198
+msgid ""
+"Open and execute/show script or data from file (Ctrl+O).\n"
+"You may switch off automatic exection in UDAV properties."
+msgstr ""
+
+#: mgllab/help.cpp:169
+msgid "Open dialog for new data creation."
+msgstr ""
+
+#: udav/udav_wnd.cpp:196
+msgid "Open file"
+msgstr ""
+
+#: mgllab/mgllab.cpp:294
+msgid "Open file ..."
+msgstr ""
+
+#: widgets/qt.cpp:1101 udav/udav_wnd.cpp:298
+msgid "Open printer dialog and print graphics (Ctrl+P)"
+msgstr ""
+
+#: mgllab/editor.cpp:506
+msgid "Open script or data file"
+msgstr ""
+
+#: mgllab/help.cpp:160
+msgid "Open table with selected data for editing."
+msgstr ""
+
+#: udav/data_dlg.cpp:65 mgllab/dialogs.cpp:578
+msgid "Operation"
+msgstr ""
+
+#: mgllab/table.cpp:231
+msgid "Operation is not supported for this type of data."
+msgstr ""
+
+#: mgllab/table.cpp:795
+msgid "Operations"
+msgstr ""
+
+#: udav/prop_dlg.cpp:91 udav/newcmd_dlg.cpp:72 mgllab/dialogs.cpp:746
+#: mgllab/mgllab.cpp:325
+msgid "Options"
+msgstr ""
+
+#: udav/setup_dlg.cpp:62 mgllab/dialogs.cpp:953
+msgid "Origin"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:171 mgllab/dialogs.cpp:712
+msgid "Other plots"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1025
+msgid "Others"
+msgstr ""
+
+#: udav/style_dlg.cpp:161 mgllab/dialogs.cpp:372
+msgid "Overline"
+msgstr ""
+
+#: mgllab/dialogs.cpp:112
+msgid "Own brightness of the surface"
+msgstr ""
+
+#. Q
+#: udav/style_dlg.cpp:248 mgllab/dialogs.cpp:56
+msgid "P - darkpink"
+msgstr ""
+
+#: src/prc.cpp:982
+msgid "PDF support was disabled. Please, enable it and rebuild MathGL."
+msgstr ""
+
+#: widgets/qt.cpp:1081 udav/plot_pnl.cpp:475
+msgid "PNG"
+msgstr ""
+
+#: mgllab/table.cpp:474 mgllab/table.cpp:486
+msgid "PNG Files \t*.png"
+msgstr ""
+
+#: src/canvas_cf.cpp:502 src/canvas_cf.cpp:504 src/data_png.cpp:117
+#: src/export.cpp:75 src/export.cpp:109
+msgid "PNG support was disabled. Please, enable it and rebuild MathGL."
+msgstr ""
+
+#: widgets/qt.cpp:1091 udav/plot_pnl.cpp:486
+msgid "PRC"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1006
+msgid "Palette"
+msgstr ""
+
+#: mgllab/table.cpp:167
+msgid "Parabolic *5"
+msgstr ""
+
+#: udav/dat_pnl.cpp:713
+msgid "Paste data"
+msgstr ""
+
+#: udav/dat_pnl.cpp:715
+msgid "Paste range of numbers from clipboard (Ctrl+Shift+P)."
+msgstr ""
+
+#: udav/text_pnl.cpp:538 mgllab/mgllab.cpp:311
+msgid "Paste text"
+msgstr ""
+
+#: mgllab/editor.cpp:513
+msgid "Paste text from clipboard"
+msgstr ""
+
+#: udav/text_pnl.cpp:540
+msgid "Paste text or data from clipboard (Ctrl+V)."
+msgstr ""
+
+#: mgllab/mgllab.cpp:484
+msgid "Path for MathGL font (without extension)"
+msgstr ""
+
+#: udav/prop_dlg.cpp:110 mgllab/mgllab.cpp:481
+msgid "Path for help files"
+msgstr ""
+
+#: udav/prop_dlg.cpp:130
+msgid "Path for user MathGL font files"
+msgstr ""
+
+#: widgets/qt.cpp:1278
+msgid "Pause calculation"
+msgstr ""
+
+#. Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(setPause()));
+#: widgets/fltk.cpp:917 widgets/qt.cpp:1283
+msgid "Pause on/off external calculations"
+msgstr ""
+
+#: src/exec_dat.cpp:1703
+msgid "Perform Runge-Kutta step"
+msgstr ""
+
+#: widgets/fltk.cpp:886
+msgid "Phi angle (rotate in x*y plane)"
+msgstr ""
+
+#: udav/prop_dlg.cpp:161
+msgid "Place editor at top"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1050
+msgid "Plot ID"
+msgstr ""
+
+#: src/exec_prm.cpp:633
+msgid "Plot curve by formula"
+msgstr ""
+
+#. o->addSeparator();  bb->addSeparator();
+#. 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);
+#: udav/dat_pnl.cpp:701
+msgid "Plot data"
+msgstr ""
+
+#: udav/dat_pnl.cpp:703
+msgid ""
+"Plot data in new script window. You may select the kind\n"
+"of plot, its style and so on."
+msgstr ""
+
+#: mgllab/mgllab.cpp:340
+msgid "Plot setup"
+msgstr ""
+
+#: udav/text_pnl.cpp:571 mgllab/dialogs.cpp:312 mgllab/mgllab.cpp:324
+msgid "Plot style"
+msgstr ""
+
+#: src/exec_prm.cpp:634
+msgid "Plot surface by formula"
+msgstr ""
+
+#: mgllab/dialogs.cpp:386
+msgid "Popular color schemes"
+msgstr ""
+
+#: udav/hint_dlg.cpp:66
+msgid "Prev"
+msgstr ""
+
+#: udav/dat_pnl.cpp:727 mgllab/table.cpp:803
+msgid "Prev slice"
+msgstr ""
+
+#: widgets/qt.cpp:1269 udav/plot_pnl.cpp:575
+msgid "Prev slide"
+msgstr ""
+
+#: udav/info_dlg.cpp:51
+msgid "Preview"
+msgstr ""
+
+#: mgllab/mgllab.cpp:581
+msgid "Previous expressions"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:181 mgllab/dialogs.cpp:722
+msgid "Primitives"
+msgstr ""
+
+#: widgets/qt.cpp:1163 udav/plot_pnl.cpp:365
+msgid "Primitives ..."
+msgstr ""
+
+#: src/exec_set.cpp:837
+msgid "Print MathGL version or check if it is valid"
+msgstr ""
+
+#: src/exec_dat.cpp:1654
+msgid "Print content of the data"
+msgstr ""
+
+#: src/exec_dat.cpp:1692
+msgid "Print fitted formula"
+msgstr ""
+
+#: widgets/qt.cpp:1099 udav/udav_wnd.cpp:296
+msgid "Print graphics"
+msgstr ""
+
+#: src/exec_dat.cpp:1646
+msgid "Print list of data names in HDF file"
+msgstr ""
+
+#: src/exec_dat.cpp:1670
+msgid "Print message or information about the data"
+msgstr ""
+
+#: mgllab/mgllab.cpp:297
+msgid "Print plot"
+msgstr ""
+
+#: udav/udav_wnd.cpp:295
+msgid "Print script"
+msgstr ""
+
+#: src/exec_prm.cpp:631
+msgid "Print string from file"
+msgstr ""
+
+#: udav/text_pnl.cpp:178
+msgid "Printing aborted"
+msgstr ""
+
+#: udav/text_pnl.cpp:176
+msgid "Printing completed"
+msgstr ""
+
+#: udav/text_pnl.cpp:174
+msgid "Printing..."
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:180 mgllab/dialogs.cpp:721
+msgid "Program flow"
+msgstr ""
+
+#: src/exec_dat.cpp:1637
+msgid "Project periodical data in [v1,v2]"
+msgstr ""
+
+#: udav/udav_wnd.cpp:312 mgllab/mgllab.cpp:337 mgllab/mgllab.cpp:476
+msgid "Properties"
+msgstr ""
+
+#: udav/mem_pnl.cpp:61
+msgid "Properties of selected data array"
+msgstr ""
+
+#: mgllab/table.cpp:342 mgllab/table.cpp:793
+msgid "Pulse prop."
+msgstr ""
+
+#: udav/calc_dlg.cpp:127 mgllab/mgllab.cpp:615
+msgid "Put function"
+msgstr ""
+
+#: udav/dat_pnl.cpp:457
+msgid "Put in variable"
+msgstr ""
+
+#: udav/dat_pnl.cpp:548
+msgid "Put into this data array"
+msgstr ""
+
+#: udav/anim_dlg.cpp:74 mgllab/mathgl.cpp:203
+msgid "Put to script"
+msgstr ""
+
+#: src/exec_dat.cpp:1691
+msgid "Put value (numeric or array) to given data element"
+msgstr ""
+
+#. U
+#: udav/style_dlg.cpp:247 mgllab/dialogs.cpp:55
+msgid "Q - brown"
+msgstr ""
+
+#: udav/udav_wnd.cpp:303
+msgid "Quit"
+msgstr ""
+
+#. G
+#: udav/style_dlg.cpp:239 mgllab/dialogs.cpp:47
+msgid "R - maroon"
+msgstr ""
+
+#: src/exec_set.cpp:818
+msgid "Rasterize plot and save to background"
+msgstr ""
+
+#: src/exec_dat.cpp:1697
+msgid "Read and join data from several files"
+msgstr ""
+
+#: src/exec_dat.cpp:1696
+msgid "Read data from file"
+msgstr ""
+
+#: src/exec_dat.cpp:1699
+msgid "Read data from file with sizes specified in first row"
+msgstr ""
+
+#: src/exec_dat.cpp:1698
+msgid "Read data with name 'id' from HDF file"
+msgstr ""
+
+#: udav/udav_wnd.cpp:268 mgllab/mgllab.cpp:382
+msgid "Ready"
+msgstr ""
+
+#: src/exec_dat.cpp:1700
+msgid "Rearrange data dimensions"
+msgstr ""
+
+#: udav/udav_wnd.cpp:301 mgllab/mgllab.cpp:298
+msgid "Recent files"
+msgstr ""
+
+#: udav/dat_pnl.cpp:768
+msgid "Recreate the data with new sizes and fill it by zeros (Ctrl+Shift+N)."
+msgstr ""
+
+#: udav/text_pnl.cpp:521
+msgid "Redo"
+msgstr ""
+
+#: udav/text_pnl.cpp:523
+msgid "Redo editor change (Ctrl+Shift+Z)."
+msgstr ""
+
+#: widgets/qt.cpp:1143 udav/plot_pnl.cpp:331
+msgid "Redraw"
+msgstr ""
+
+#: udav/anim_dlg.cpp:41 mgllab/mathgl.cpp:186
+msgid "Redraw picture for $0 equal to"
+msgstr ""
+
+#: widgets/fltk.cpp:835
+msgid "Redraw plot"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1320
+msgid "Refresh"
+msgstr ""
+
+#: widgets/fltk.cpp:869
+msgid "Refresh the picture"
+msgstr ""
+
+#: mgllab/dialogs.cpp:404
+msgid "Relative position of i-th color"
+msgstr ""
+
+#: udav/plot_pnl.cpp:342
+msgid "Reload"
+msgstr ""
+
+#: widgets/fltk.cpp:837
+msgid "Reload data"
+msgstr ""
+
+#: widgets/fltk.cpp:875
+msgid "Reload data and refresh the picture"
+msgstr ""
+
+#: src/exec_dat.cpp:1636
+msgid "Remove duplicate rows"
+msgstr ""
+
+#: src/exec_dat.cpp:1710
+msgid "Remove jump into the data, like phase jumps"
+msgstr ""
+
+#: udav/find_dlg.cpp:50 mgllab/editor.cpp:561
+msgid "Replace"
+msgstr ""
+
+#: mgllab/editor.cpp:564
+msgid "Replace all"
+msgstr ""
+
+#: udav/find_dlg.cpp:39 mgllab/editor.cpp:560
+msgid "Replace by:"
+msgstr ""
+
+#: udav/text_pnl.cpp:581
+msgid "Replace expression by its numerical value."
+msgstr ""
+
+#: mgllab/editor.cpp:630
+#, c-format
+msgid "Replaced %ld occurrences."
+msgstr ""
+
+#: mgllab/dialogs.cpp:891
+#, c-format
+msgid "Required argument %s is not specified!"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:186
+msgid "Reserve at"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1303
+msgid "Reserve at:"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:190
+msgid "Reserve space for labels at bottom side (style '_')"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:188
+msgid "Reserve space for labels at left side (style '<')"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:194
+msgid "Reserve space for labels at right side (style '>')"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:192
+msgid "Reserve space for labels at top side (style '^')"
+msgstr ""
+
+#: src/exec_set.cpp:819
+msgid "Reset settings and clear picture"
+msgstr ""
+
+#: udav/dat_pnl.cpp:772 mgllab/table.cpp:761
+msgid "Resize"
+msgstr ""
+
+#: udav/dat_pnl.cpp:774
+msgid "Resize (interpolate) the data to specified sizes (Ctrl+Shift+R)."
+msgstr ""
+
+#: src/exec_dat.cpp:1702
+msgid "Resize data array"
+msgstr ""
+
+#: mgllab/table.cpp:858
+msgid "Resize data with smoothing"
+msgstr ""
+
+#: widgets/qt.cpp:1136 udav/plot_pnl.cpp:325
+msgid "Restore"
+msgstr ""
+
+#: widgets/fltk.cpp:866
+msgid "Restore default graphics rotation, zoom and perspective"
+msgstr ""
+
+#: widgets/qt.cpp:1138
+msgid "Restore default graphics rotation, zoom and perspective (Alt+Space)."
+msgstr ""
+
+#: udav/plot_pnl.cpp:327
+msgid "Restore default graphics rotation, zoom and perspective (Ctrl+Space)."
+msgstr ""
+
+#: udav/plot_pnl.cpp:344
+msgid "Restore status for 'once' command and reload data (F9)."
+msgstr ""
+
+#: udav/calc_dlg.cpp:63 udav/data_dlg.cpp:85 udav/data_dlg.cpp:143
+#: udav/subplot_dlg.cpp:212 mgllab/dialogs.cpp:1315
+msgid "Result"
+msgstr ""
+
+#: udav/data_dlg.cpp:124
+msgid "Result (will have sizes "
+msgstr ""
+
+#: udav/style_dlg.cpp:201 udav/subplot_dlg.cpp:214 mgllab/dialogs.cpp:408
+msgid "Resulting string"
+msgstr ""
+
+#: src/parser.cpp:1497
+msgid "Return from function"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:148
+msgid "Right bottom edge"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:156
+msgid "Right top edge"
+msgstr ""
+
+#: mgllab/table.cpp:166 mgllab/table.cpp:784
+msgid "Roll"
+msgstr ""
+
+#: src/exec_dat.cpp:1704
+msgid "Roll data along direction(s)"
+msgstr ""
+
+#. rotate menu
+#: udav/plot_pnl.cpp:540
+msgid "Rotate"
+msgstr ""
+
+#: widgets/qt.cpp:1123 udav/plot_pnl.cpp:310
+msgid "Rotate by mouse"
+msgstr ""
+
+#: udav/plot_pnl.cpp:545
+msgid "Rotate down"
+msgstr ""
+
+#: udav/plot_pnl.cpp:549
+msgid "Rotate left"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:164 mgllab/dialogs.cpp:1294
+msgid "Rotate on"
+msgstr ""
+
+#: widgets/fltk.cpp:862
+msgid "Rotate picture by holding left mouse button"
+msgstr ""
+
+#: src/exec_set.cpp:820
+msgid "Rotate plot"
+msgstr ""
+
+#: udav/plot_pnl.cpp:553
+msgid "Rotate right"
+msgstr ""
+
+#: udav/plot_pnl.cpp:541
+msgid "Rotate up"
+msgstr ""
+
+#: mgllab/dialogs.cpp:356
+msgid "Rotation"
+msgstr ""
+
+#: widgets/qt.cpp:1267
+msgid "Run slideshow (CTRl+F5)."
+msgstr ""
+
+#: udav/plot_pnl.cpp:570
+msgid ""
+"Run slideshow (Ctrl+F5). If no parameter specified\n"
+"then the dialog with slideshow options will appear."
+msgstr ""
+
+#: widgets/fltk.cpp:908
+msgid "Run/Stop slideshow (graphics animation)"
+msgstr ""
+
+#: udav/prop_dlg.cpp:141
+msgid "Russian"
+msgstr ""
+
+#: widgets/qt.cpp:1093 udav/plot_pnl.cpp:488
+msgid "STL"
+msgstr ""
+
+#: widgets/qt.cpp:1086 udav/plot_pnl.cpp:480
+msgid "SVG"
+msgstr ""
+
+#: udav/style_dlg.cpp:107
+msgid "Saturation"
+msgstr ""
+
+#: udav/setup_dlg.cpp:143 mgllab/editor.cpp:282
+msgid "Save"
+msgstr ""
+
+#: mgllab/help.cpp:250 mgllab/table.cpp:456
+msgid "Save Data?"
+msgstr ""
+
+#: widgets/fltk.cpp:591 mgllab/mgllab.cpp:229
+msgid "Save File As?"
+msgstr ""
+
+#: udav/anim_dlg.cpp:83
+msgid "Save JPEG frames"
+msgstr ""
+
+#: udav/udav_wnd.cpp:290 mgllab/mgllab.cpp:296
+msgid "Save as ..."
+msgstr ""
+
+#: udav/dat_pnl.cpp:688
+msgid "Save data"
+msgstr ""
+
+#: src/exec_dat.cpp:1707
+msgid "Save data to HDF5 file"
+msgstr ""
+
+#: udav/dat_pnl.cpp:690
+msgid "Save data to a file (Ctrl+Shift+S)."
+msgstr ""
+
+#: src/exec_dat.cpp:1706 mgllab/table.cpp:844
+msgid "Save data to file"
+msgstr ""
+
+#: mgllab/mgllab.cpp:295
+msgid "Save file"
+msgstr ""
+
+#: mgllab/mgllab.cpp:488
+msgid "Save file before redrawing"
+msgstr ""
+
+#: udav/udav_wnd.cpp:201
+msgid "Save script"
+msgstr ""
+
+#: udav/udav_wnd.cpp:203
+msgid "Save script to a file (Ctrl+S)"
+msgstr ""
+
+#: mgllab/editor.cpp:508
+msgid "Save script to file"
+msgstr ""
+
+#: mgllab/help.cpp:172
+msgid "Save selected data to file."
+msgstr ""
+
+#: mgllab/table.cpp:753
+msgid "Save to file"
+msgstr ""
+
+#: udav/udav_wnd.cpp:672
+msgid "Saving aborted"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:179 mgllab/dialogs.cpp:720
+msgid "Scale and rotate"
+msgstr ""
+
+#: udav/udav_wnd.cpp:237
+msgid "Script"
+msgstr ""
+
+#: udav/find_dlg.cpp:43 mgllab/editor.cpp:563
+msgid "Search backward"
+msgstr ""
+
+#: udav/text_pnl.cpp:543 mgllab/mgllab.cpp:312
+msgid "Select all"
+msgstr ""
+
+#: udav/text_pnl.cpp:585
+msgid "Select and insert file name."
+msgstr ""
+
+#: udav/text_pnl.cpp:589
+msgid "Select and insert folder name."
+msgstr ""
+
+#: mgllab/dialogs.cpp:565
+msgid "Select data argument"
+msgstr ""
+
+#: mgllab/dialogs.cpp:160
+msgid "Select direction"
+msgstr ""
+
+#: mgllab/editor.cpp:653
+msgid "Select file name"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:337 udav/newcmd_dlg.cpp:355
+msgid "Select first the proper kind of arguments"
+msgstr ""
+
+#: mgllab/editor.cpp:666
+msgid "Select folder name"
+msgstr ""
+
+#: udav/info_dlg.cpp:39
+msgid "Select kind of plot"
+msgstr ""
+
+#: src/exec_set.cpp:836
+msgid "Select variant of plot style(s)"
+msgstr ""
+
+#: mgllab/mathgl.cpp:168
+msgid "Set"
+msgstr ""
+
+#: src/exec_set.cpp:832
+msgid "Set additional tick and axis labels shift"
+msgstr ""
+
+#: src/exec_set.cpp:780
+msgid "Set ambient light brightness"
+msgstr ""
+
+#: src/exec_set.cpp:801
+msgid "Set arbitrary position of plot in picture"
+msgstr ""
+
+#: udav/udav_wnd.cpp:315 mgllab/mgllab.cpp:338
+msgid "Set arguments"
+msgstr ""
+
+#: src/exec_set.cpp:782
+msgid "Set aspect ration"
+msgstr ""
+
+#: src/exec_set.cpp:784
+msgid "Set axis and tick style"
+msgstr ""
+
+#: src/exec_set.cpp:810
+msgid "Set axis origin"
+msgstr ""
+
+#: src/exec_set.cpp:817
+msgid "Set axis ranges"
+msgstr ""
+
+#: src/exec_set.cpp:825
+msgid "Set bit-flags (for advanced users only)"
+msgstr ""
+
+#: src/exec_set.cpp:786
+msgid "Set bounding box for 2d export"
+msgstr ""
+
+#: src/exec_set.cpp:807
+msgid "Set brush for given mask id"
+msgstr ""
+
+#: src/exec_set.cpp:791
+msgid "Set color range"
+msgstr ""
+
+#: src/exec_dat.cpp:1668
+msgid "Set column id for data"
+msgstr ""
+
+#: mgllab/dialogs.cpp:108
+msgid "Set cutting off/on for particular plot"
+msgstr ""
+
+#: udav/open_dlg.cpp:62
+msgid "Set data sizes manually"
+msgstr ""
+
+#: src/exec_set.cpp:785
+msgid "Set default bars width"
+msgstr ""
+
+#: src/exec_set.cpp:815
+msgid "Set default filename"
+msgstr ""
+
+#: src/exec_set.cpp:779
+msgid "Set default transparency"
+msgstr ""
+
+#: src/exec_set.cpp:794
+msgid "Set diffusive light brightness"
+msgstr ""
+
+#: src/exec_set.cpp:795
+msgid "Set draw region for quality&4"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:47 udav/subplot_dlg.cpp:89
+msgid "Set drawing area as cell of matrix nx*ny."
+msgstr ""
+
+#: udav/subplot_dlg.cpp:110
+msgid "Set drawing area as cells of column."
+msgstr ""
+
+#: udav/subplot_dlg.cpp:64 udav/subplot_dlg.cpp:140
+msgid "Set drawing area as cells of matrix nx*ny."
+msgstr ""
+
+#: udav/subplot_dlg.cpp:127
+msgid "Set drawing area as cells of stick."
+msgstr ""
+
+#: mgllab/dialogs.cpp:117
+msgid "Set lighting off/on for particular plot"
+msgstr ""
+
+#: src/exec_set.cpp:808
+msgid "Set number of lines in mesh/fall/vect and so on"
+msgstr ""
+
+#: src/exec_set.cpp:802
+msgid "Set number of marks in the legend"
+msgstr ""
+
+#: src/exec_set.cpp:796
+msgid "Set number of visible faces"
+msgstr ""
+
+#: src/exec_set.cpp:812
+msgid "Set palette for 1D plots"
+msgstr ""
+
+#: src/exec_set.cpp:814
+msgid "Set perspective"
+msgstr ""
+
+#: src/exec_set.cpp:823
+msgid "Set picture size"
+msgstr ""
+
+#: src/exec_set.cpp:816
+msgid "Set plot quality"
+msgstr ""
+
+#: src/exec_set.cpp:829
+msgid "Set position of plot as cell of matrix"
+msgstr ""
+
+#: src/exec_set.cpp:809
+msgid "Set position of plot block in matrix"
+msgstr ""
+
+#: src/exec_set.cpp:790
+msgid "Set position of plot inside cell of column"
+msgstr ""
+
+#: src/exec_set.cpp:800
+msgid "Set position of plot inside cell of matrix"
+msgstr ""
+
+#: src/exec_set.cpp:828
+msgid "Set position of plot inside cell of rotated stick"
+msgstr ""
+
+#: src/exec_set.cpp:827
+msgid "Set position of plot inside cell of sheared stick"
+msgstr ""
+
+#: src/exec_set.cpp:840
+msgid "Set range for x-axis"
+msgstr ""
+
+#: src/exec_set.cpp:842
+msgid "Set range for y-axis"
+msgstr ""
+
+#: src/exec_set.cpp:846
+msgid "Set range for z-axis"
+msgstr ""
+
+#: src/exec_set.cpp:822
+msgid "Set scale text in relative subplots too"
+msgstr ""
+
+#: src/exec_set.cpp:824
+msgid "Set scaling factor for further setsize"
+msgstr ""
+
+#: mgllab/mathgl.cpp:145
+msgid "Set script arguments"
+msgstr ""
+
+#: mgllab/dialogs.cpp:105
+msgid "Set size for text, marks and others"
+msgstr ""
+
+#: src/exec_set.cpp:781
+msgid "Set size of arrows"
+msgstr ""
+
+#: src/exec_set.cpp:806
+msgid "Set size of markers"
+msgstr ""
+
+#: src/exec_set.cpp:813
+msgid "Set size of semi-transparent area around line"
+msgstr ""
+
+#: src/exec_set.cpp:811
+msgid "Set tick labels drawing at origin"
+msgstr ""
+
+#: src/exec_set.cpp:831
+msgid "Set tick length"
+msgstr ""
+
+#: src/exec_set.cpp:792
+msgid "Set ticks for colorbar"
+msgstr ""
+
+#: src/exec_set.cpp:841
+msgid "Set ticks for x-axis"
+msgstr ""
+
+#: src/exec_set.cpp:843
+msgid "Set ticks for y-axis"
+msgstr ""
+
+#: src/exec_set.cpp:847
+msgid "Set ticks for z-axis"
+msgstr ""
+
+#: src/exec_set.cpp:833
+msgid "Set ticks in time format"
+msgstr ""
+
+#: src/exec_set.cpp:835
+msgid "Set ticks tuning"
+msgstr ""
+
+#: src/exec_set.cpp:821
+msgid "Set to auto rotate text or not"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:196
+msgid "Set to use whole area (style '#')"
+msgstr ""
+
+#: src/exec_set.cpp:834
+msgid "Set type transparency"
+msgstr ""
+
+#: widgets/qt.cpp:1222
+msgid "Set value of \\phi angle."
+msgstr ""
+
+#: udav/plot_pnl.cpp:472
+msgid ""
+"Set value of \\phi angle.\n"
+"You can use keys (Shift+Meta+Left or Shift+Meta+Right)."
+msgstr ""
+
+#: widgets/qt.cpp:1216
+msgid "Set value of \\theta angle."
+msgstr ""
+
+#: udav/plot_pnl.cpp:466
+msgid ""
+"Set value of \\theta angle.\n"
+"You can use keys (Shift+Meta+Up or Shift+Meta+Down)."
+msgstr ""
+
+#: udav/udav_wnd.cpp:311
+msgid "Settings"
+msgstr ""
+
+#: mgllab/mgllab.cpp:336
+msgid "Setup"
+msgstr ""
+
+#: mgllab/mgllab.cpp:339
+msgid "Setup animation"
+msgstr ""
+
+#: udav/prop_dlg.cpp:80
+msgid "Setup colors for:"
+msgstr ""
+
+#: src/exec_set.cpp:798
+msgid "Setup font"
+msgstr ""
+
+#: src/exec_set.cpp:803
+msgid "Setup light"
+msgstr ""
+
+#: src/exec_prm.cpp:616
+msgid "Setup or draw axis"
+msgstr ""
+
+#: src/exec_set.cpp:793
+msgid "Setup plot points cutting"
+msgstr ""
+
+#: mgllab/dialogs.cpp:947
+msgid "Setup script"
+msgstr ""
+
+#: udav/plot_pnl.cpp:573
+msgid "Setup show"
+msgstr ""
+
+#: udav/dat_pnl.cpp:623
+msgid "Sew data along direction(s)"
+msgstr ""
+
+#: mgllab/table.cpp:166 mgllab/table.cpp:785
+msgid "Sew phase"
+msgstr ""
+
+#: mgllab/dialogs.cpp:350
+msgid "Sharp colors"
+msgstr ""
+
+#: src/exec_set.cpp:826
+msgid "Shear plot"
+msgstr ""
+
+#: widgets/fltk.cpp:901
+msgid "Shift the picture down"
+msgstr ""
+
+#: widgets/fltk.cpp:893
+msgid "Shift the picture left"
+msgstr ""
+
+#: widgets/fltk.cpp:899
+msgid "Shift the picture right"
+msgstr ""
+
+#: widgets/fltk.cpp:891
+msgid "Shift the picture up"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:56 mgllab/dialogs.cpp:737
+msgid "Short description of selected command"
+msgstr ""
+
+#: udav/info_dlg.cpp:54
+msgid "Short information about the data."
+msgstr ""
+
+#: udav/hint_dlg.cpp:62
+msgid "Show at startup"
+msgstr ""
+
+#: udav/udav_wnd.cpp:210
+msgid ""
+"Show calculator which evaluate and help to type textual formulas.\n"
+"Textual formulas may contain data variables too."
+msgstr ""
+
+#: mgllab/editor.cpp:525 mgllab/editor.cpp:527
+msgid "Show calculator window"
+msgstr ""
+
+#: widgets/fltk.cpp:912
+msgid "Show custom dialog for plot setup"
+msgstr ""
+
+#: udav/udav_wnd.cpp:314
+msgid "Show dialog for UDAV properties."
+msgstr ""
+
+#: udav/text_pnl.cpp:560 udav/plot_pnl.cpp:441
+msgid "Show dialog for new command or edit arguments of existed one."
+msgstr ""
+
+#: udav/text_pnl.cpp:564 udav/plot_pnl.cpp:446
+msgid "Show dialog for new inplot and put it into the script."
+msgstr ""
+
+#: udav/text_pnl.cpp:577
+msgid ""
+"Show dialog for options and put it into the script.\n"
+"Options are used for additional setup the plot."
+msgstr ""
+
+#: udav/text_pnl.cpp:598
+msgid ""
+"Show dialog for plot setup and put code into the script.\n"
+"This dialog setup axis, labels, lighting and other general things."
+msgstr ""
+
+#: udav/text_pnl.cpp:573
+msgid ""
+"Show dialog for styles and put it into the script.\n"
+"Styles define the plot view (color scheme, marks, dashing and so on)."
+msgstr ""
+
+#: udav/text_pnl.cpp:548
+msgid "Show dialog for text finding (Ctrl+F)."
+msgstr ""
+
+#: udav/udav_wnd.cpp:326
+msgid "Show help on MGL commands (F1)."
+msgstr ""
+
+#: udav/udav_wnd.cpp:219
+msgid "Show hidden plots"
+msgstr ""
+
+#: mgllab/help.cpp:303
+msgid "Show hint on startup"
+msgstr ""
+
+#: udav/udav_wnd.cpp:330
+msgid "Show hints of MGL usage."
+msgstr ""
+
+#: udav/udav_wnd.cpp:213
+msgid "Show info"
+msgstr ""
+
+#: mgllab/mgllab.cpp:314
+msgid "Show lines"
+msgstr ""
+
+#: widgets/fltk.cpp:909
+msgid "Show next frame in slideshow"
+msgstr ""
+
+#: widgets/qt.cpp:1262 udav/plot_pnl.cpp:563
+msgid "Show next slide (Ctrl+.)."
+msgstr ""
+
+#: widgets/fltk.cpp:904
+msgid "Show previous frame in slideshow"
+msgstr ""
+
+#: widgets/qt.cpp:1271 udav/plot_pnl.cpp:578
+msgid "Show previous slide (Ctrl+,)."
+msgstr ""
+
+#: mgllab/table.cpp:779
+msgid "Sin FFT"
+msgstr ""
+
+#: udav/dat_pnl.cpp:620
+msgid "Sin-Fourier transform along direction(s)"
+msgstr ""
+
+#: src/exec_dat.cpp:1711
+msgid "Sin-Fourier transform at some direction"
+msgstr ""
+
+#: mgllab/table.cpp:165
+msgid "Sinus FFT"
+msgstr ""
+
+#: udav/opt_dlg.cpp:70 mgllab/dialogs.cpp:104 mgllab/dialogs.cpp:359
+msgid "Size"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:114
+msgid "Size of column"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:131
+msgid "Size of stick"
+msgstr ""
+
+#. size menu
+#: udav/mem_pnl.cpp:68 udav/dat_pnl.cpp:765 mgllab/dialogs.cpp:1015
+#: mgllab/table.cpp:759
+msgid "Sizes"
+msgstr ""
+
+#: src/parser.cpp:1482
+msgid "Skip commands and iterate for-loop again"
+msgstr ""
+
+#: widgets/qt.cpp:1264 udav/plot_pnl.cpp:566
+msgid "Slideshow"
+msgstr ""
+
+#: mgllab/table.cpp:163 mgllab/table.cpp:773
+msgid "Smooth"
+msgstr ""
+
+#: src/exec_dat.cpp:1712
+msgid "Smooth data"
+msgstr ""
+
+#: udav/dat_pnl.cpp:613
+msgid "Smooth data along direction(s)"
+msgstr ""
+
+#: src/exec_dat.cpp:1695
+msgid "Solve Hamiltonian ODE (find GO ray or trajectory)"
+msgstr ""
+
+#: src/exec_dat.cpp:1685
+msgid "Solve ODE"
+msgstr ""
+
+#: src/exec_dat.cpp:1687
+msgid "Solve PDE"
+msgstr ""
+
+#: src/exec_dat.cpp:1693
+msgid "Solve PDE in accompanied coordinates for 2d case"
+msgstr ""
+
+#: src/exec_dat.cpp:1694
+msgid "Solve PDE in accompanied coordinates for 3d case"
+msgstr ""
+
+#: src/exec_dat.cpp:1635
+msgid "Solve PDE using advanced method (X-Y only)"
+msgstr ""
+
+#: src/exec_dat.cpp:1726
+msgid "Solve tridiagonal matrix"
+msgstr ""
+
+#: src/exec_dat.cpp:1714
+msgid "Sort data by values in column"
+msgstr ""
+
+#: udav/prop_dlg.cpp:141
+msgid "Spanish"
+msgstr ""
+
+#: udav/calc_dlg.cpp:194
+msgid "Special"
+msgstr ""
+
+#: mgllab/table.cpp:129
+msgid ""
+"Specify new data size\n"
+"Data will be interpolated"
+msgstr ""
+
+#: mgllab/table.cpp:114
+msgid ""
+"Specify new data size\n"
+"Data will be zero filled"
+msgstr ""
+
+#: mgllab/table.cpp:144
+msgid ""
+"Specify the skipping step\n"
+"Each m-th point will be saved only"
+msgstr ""
+
+#: udav/dat_pnl.cpp:778 mgllab/table.cpp:762
+msgid "Squeeze"
+msgstr ""
+
+#: src/exec_dat.cpp:1715
+msgid "Squeeze data"
+msgstr ""
+
+#: udav/setup_dlg.cpp:84
+msgid "Start"
+msgstr ""
+
+#: src/parser.cpp:1492
+msgid "Start function definition and stop execution of main script"
+msgstr ""
+
+#: src/parser.cpp:1495
+msgid "Start next for-loop iteration"
+msgstr ""
+
+#: src/parser.cpp:1496
+msgid "Start/close commands which should executed only once"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:76
+msgid "Starting cell index"
+msgstr ""
+
+#: udav/setup_dlg.cpp:117
+msgid "State"
+msgstr ""
+
+#: src/exec_dat.cpp:1651
+msgid "Step for pulse diffraction"
+msgstr ""
+
+#: widgets/qt.cpp:1148 udav/plot_pnl.cpp:347
+msgid "Stop"
+msgstr ""
+
+#: widgets/fltk.cpp:871
+msgid "Stop drawing"
+msgstr ""
+
+#: src/parser.cpp:1498
+msgid "Stop execution"
+msgstr ""
+
+#: udav/plot_pnl.cpp:349
+msgid "Stop script execution (F7)."
+msgstr ""
+
+#: udav/args_dlg.cpp:59 mgllab/mathgl.cpp:164
+msgid "String for $0"
+msgstr ""
+
+#: udav/args_dlg.cpp:41 mgllab/mathgl.cpp:146
+msgid "String for $1"
+msgstr ""
+
+#: udav/args_dlg.cpp:43 mgllab/mathgl.cpp:148
+msgid "String for $2"
+msgstr ""
+
+#: udav/args_dlg.cpp:45 mgllab/mathgl.cpp:150
+msgid "String for $3"
+msgstr ""
+
+#: udav/args_dlg.cpp:47 mgllab/mathgl.cpp:152
+msgid "String for $4"
+msgstr ""
+
+#: udav/args_dlg.cpp:49 mgllab/mathgl.cpp:154
+msgid "String for $5"
+msgstr ""
+
+#: udav/args_dlg.cpp:51 mgllab/mathgl.cpp:156
+msgid "String for $6"
+msgstr ""
+
+#: udav/args_dlg.cpp:53 mgllab/mathgl.cpp:158
+msgid "String for $7"
+msgstr ""
+
+#: udav/args_dlg.cpp:55 mgllab/mathgl.cpp:160
+msgid "String for $8"
+msgstr ""
+
+#: udav/args_dlg.cpp:57 mgllab/mathgl.cpp:162
+msgid "String for $9"
+msgstr ""
+
+#: udav/files_dlg.cpp:38
+msgid "String for %1"
+msgstr ""
+
+#: udav/files_dlg.cpp:40
+msgid "String for %2"
+msgstr ""
+
+#: udav/files_dlg.cpp:42
+msgid "String for %3"
+msgstr ""
+
+#: udav/files_dlg.cpp:44
+msgid "String for %4"
+msgstr ""
+
+#: udav/files_dlg.cpp:46
+msgid "String for %5"
+msgstr ""
+
+#: udav/files_dlg.cpp:48
+msgid "String for %6"
+msgstr ""
+
+#: udav/files_dlg.cpp:50
+msgid "String for %7"
+msgstr ""
+
+#: udav/files_dlg.cpp:52
+msgid "String for %8"
+msgstr ""
+
+#: udav/files_dlg.cpp:54
+msgid "String for %9"
+msgstr ""
+
+#: udav/prop_dlg.cpp:85
+msgid "Strings"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:208 mgllab/dialogs.cpp:1314
+msgid "Style"
+msgstr ""
+
+#: udav/setup_dlg.cpp:80
+msgid "SubTicks"
+msgstr ""
+
+#: mgllab/dialogs.cpp:959
+msgid "Subticks"
+msgstr ""
+
+#: src/exec_dat.cpp:1718
+msgid "Subtract data or number"
+msgstr ""
+
+#: mgllab/table.cpp:797
+msgid "Subtract to"
+msgstr ""
+
+#: udav/prop_dlg.cpp:94
+msgid "Suffixes"
+msgstr ""
+
+#: udav/dat_pnl.cpp:539
+msgid "Sum along direction(s)"
+msgstr ""
+
+#: udav/dat_pnl.cpp:614
+msgid "Summarize data along direction(s)"
+msgstr ""
+
+#. { _("Histogram of"),        0, hist_cb },
+#: mgllab/table.cpp:342 mgllab/table.cpp:790
+msgid "Summation of"
+msgstr ""
+
+#: src/exec_dat.cpp:1720
+msgid "Swap data (useful after Fourier transform)"
+msgstr ""
+
+#: udav/dat_pnl.cpp:618
+msgid "Swap data along direction(s)"
+msgstr ""
+
+#: mgllab/table.cpp:164 mgllab/table.cpp:778
+msgid "Swap parts"
+msgstr ""
+
+#: src/exec_set.cpp:797
+msgid "Switch on/off fog"
+msgstr ""
+
+#: src/exec_set.cpp:799
+msgid "Switch on/off gray-scale mode"
+msgstr ""
+
+#: widgets/fltk.cpp:858
+msgid "Switch on/off grid drawing"
+msgstr ""
+
+#: udav/plot_pnl.cpp:307
+msgid "Switch on/off grid of absolute coordinates (Ctrl+G)."
+msgstr ""
+
+#: widgets/qt.cpp:1121
+msgid "Switch on/off lightning for the graphics (Alt+L)."
+msgstr ""
+
+#: udav/plot_pnl.cpp:301
+msgid "Switch on/off lightning for the graphics (Ctrl+L)."
+msgstr ""
+
+#: widgets/fltk.cpp:855
+msgid "Switch on/off lightning in the picture"
+msgstr ""
+
+#: widgets/qt.cpp:1127 udav/plot_pnl.cpp:314
+msgid ""
+"Switch on/off mouse handling of the graphics\n"
+"(rotation, shifting, zooming and perspective)."
+msgstr ""
+
+#: widgets/qt.cpp:1133
+msgid "Switch on/off mouse zoom of selected region."
+msgstr ""
+
+#: src/exec_set.cpp:830
+msgid "Switch on/off to use ternary axis"
+msgstr ""
+
+#: src/exec_set.cpp:778
+msgid "Switch on/off transparency"
+msgstr ""
+
+#: widgets/qt.cpp:1115
+msgid "Switch on/off transparency for the graphics (Alt+T)."
+msgstr ""
+
+#: udav/plot_pnl.cpp:294
+msgid "Switch on/off transparency for the graphics (Ctrl+T)."
+msgstr ""
+
+#: widgets/fltk.cpp:852
+msgid "Switch on/off transparency in the picture"
+msgstr ""
+
+#: mgllab/table.cpp:552
+msgid "Symmetrical range"
+msgstr ""
+
+#: udav/dat_pnl.cpp:366
+msgid "Symmetrical?"
+msgstr ""
+
+#: src/addon.cpp:111 src/base_cf.cpp:268
+#, c-format
+msgid "TEST: %s\n"
+msgstr ""
+
+#: udav/open_dlg.cpp:82 udav/setup_dlg.cpp:88 mgllab/dialogs.cpp:961
+msgid "Template"
+msgstr ""
+
+#: udav/setup_dlg.cpp:140
+msgid "Template name"
+msgstr ""
+
+#: udav/setup_dlg.cpp:163
+msgid "Template saved"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1038
+msgid "Ternary"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1472
+msgid "Text"
+msgstr ""
+
+#: udav/style_dlg.cpp:167 mgllab/dialogs.cpp:376
+msgid "Text align"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:172 mgllab/dialogs.cpp:713
+msgid "Text and legend"
+msgstr ""
+
+#: udav/style_dlg.cpp:164
+msgid "Text color"
+msgstr ""
+
+#: udav/style_dlg.cpp:123 mgllab/dialogs.cpp:343
+msgid "Text on contours"
+msgstr ""
+
+#: mgllab/dialogs.cpp:367
+msgid "Text style"
+msgstr ""
+
+#: udav/hint_dlg.cpp:48 mgllab/help.cpp:282
+msgid ""
+"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."
+msgstr ""
+
+#: mgllab/editor.cpp:280
+msgid ""
+"The current file has not been saved.\n"
+"Would you like to save it now?"
+msgstr ""
+
+#: udav/hint_dlg.cpp:50 mgllab/help.cpp:284
+msgid ""
+"The special dialog (Edit|Insert|New Command) help you select the command, "
+"fill its arguments and put it into the script."
+msgstr ""
+
+#: src/crust.cpp:591
+msgid ""
+"There are duplicated or indistinguishably adjacent points for triangulation."
+msgstr ""
+
+#. mglScrStr
+#: src/base.cpp:245
+msgid "There is changing temporary data in script"
+msgstr ""
+
+#: udav/text_pnl.cpp:124
+msgid "There is manual primitives."
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:341
+msgid "There is no 'fmt' argument for this command"
+msgstr ""
+
+#: udav/text_pnl.cpp:137 mgllab/editor.cpp:680
+msgid "There is no fitted formula."
+msgstr ""
+
+#: utils/mglcgi.cpp:74
+#, c-format
+msgid "There is no query. Exit.\n"
+msgstr ""
+
+#: udav/text_pnl.cpp:109
+msgid "There is no selection to evaluate."
+msgstr ""
+
+#: udav/hint_dlg.cpp:47 mgllab/help.cpp:281
+msgid ""
+"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."
+msgstr ""
+
+#. mglScrCmd
+#: src/base.cpp:243
+msgid "There is too long string(s) in script"
+msgstr ""
+
+#. mglScrLong
+#: src/base.cpp:244
+msgid "There is unbalanced ' in script"
+msgstr ""
+
+#. mglWarnSpc
+#: src/base.cpp:241
+msgid "There is wrong argument(s) in script"
+msgstr ""
+
+#. mglScrArg
+#: src/base.cpp:242
+msgid "There is wrong command(s) in script"
+msgstr ""
+
+#: widgets/fltk.cpp:884
+msgid "Theta angle (tilt z-axis)"
+msgstr ""
+
+#: widgets/fltk.cpp:1187
+msgid "This is for parameter "
+msgstr ""
+
+#: mgllab/table.cpp:494
+msgid "This operation is not supported for this kind of data."
+msgstr ""
+
+#: udav/setup_dlg.cpp:76 mgllab/dialogs.cpp:955
+msgid "Ticks"
+msgstr ""
+
+#: mgllab/dialogs.cpp:960
+msgid "Ticks start"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1031
+msgid "Time ticks"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:204 mgllab/dialogs.cpp:1313
+msgid "Title"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:206
+msgid "Title for plot. Can be used in SubPlot or MultiPlot only."
+msgstr ""
+
+#: udav/dat_pnl.cpp:351 udav/dat_pnl.cpp:366 udav/dat_pnl.cpp:377
+#: udav/dat_pnl.cpp:424 udav/dat_pnl.cpp:453 mgllab/table.cpp:609
+msgid "To"
+msgstr ""
+
+#: udav/calc_dlg.cpp:66 udav/setup_dlg.cpp:147
+msgid "To script"
+msgstr ""
+
+#: udav/dat_pnl.cpp:790
+msgid "Transform"
+msgstr ""
+
+#: udav/dat_pnl.cpp:792
+msgid "Transform data along dimension(s) (Ctrl+Shift+T)."
+msgstr ""
+
+#: mgllab/dialogs.cpp:346
+msgid "Transparency"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1043
+msgid "Transparency type"
+msgstr ""
+
+#: mgllab/table.cpp:764
+msgid "Transpose"
+msgstr ""
+
+#: mgllab/table.cpp:671
+msgid "Transpose data"
+msgstr ""
+
+#: src/exec_dat.cpp:1724
+msgid "Transpose data array"
+msgstr ""
+
+#: mgllab/table.cpp:862
+msgid "Transpose data dimensions"
+msgstr ""
+
+#: udav/dat_pnl.cpp:612
+msgid "Transpose data with new dimensions"
+msgstr ""
+
+#: udav/calc_dlg.cpp:192
+msgid "Trigonometric"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1034
+msgid "Tune ticks"
+msgstr ""
+
+#: mgllab/table.cpp:169 mgllab/table.cpp:344
+msgid "Type of operation"
+msgstr ""
+
+#: mgllab/table.cpp:174
+msgid "Type of smoothing"
+msgstr ""
+
+#. N
+#: udav/style_dlg.cpp:246 mgllab/dialogs.cpp:54
+msgid "U - indigo"
+msgstr ""
+
+#: udav/text_pnl.cpp:109 udav/text_pnl.cpp:124 udav/text_pnl.cpp:137
+#: udav/udav_wnd.cpp:340
+msgid "UDAV"
+msgstr ""
+
+#: udav/opt_dlg.cpp:31
+msgid "UDAV - Add options"
+msgstr ""
+
+#: udav/anim_dlg.cpp:35
+msgid "UDAV - Animation setup"
+msgstr ""
+
+#: udav/dat_pnl.cpp:388
+msgid "UDAV - Clear data"
+msgstr ""
+
+#: udav/dat_pnl.cpp:424
+msgid "UDAV - Crop data"
+msgstr ""
+
+#: udav/dat_pnl.cpp:255
+msgid "UDAV - Export to PNG"
+msgstr ""
+
+#: udav/dat_pnl.cpp:351
+msgid "UDAV - Fill data"
+msgstr ""
+
+#: udav/find_dlg.cpp:33
+msgid "UDAV - Find"
+msgstr ""
+
+#: udav/dat_pnl.cpp:485
+msgid "UDAV - Go to slice"
+msgstr ""
+
+#: udav/hint_dlg.cpp:55
+msgid "UDAV - Hint"
+msgstr ""
+
+#: udav/dat_pnl.cpp:277
+msgid "UDAV - Import PNG"
+msgstr ""
+
+#: udav/prop_dlg.cpp:192 udav/prop_dlg.cpp:198 udav/newcmd_dlg.cpp:322
+#: udav/text_pnl.cpp:145 udav/open_dlg.cpp:101
+msgid "UDAV - Insert filename"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:327 udav/text_pnl.cpp:152
+msgid "UDAV - Insert path"
+msgstr ""
+
+#: udav/style_dlg.cpp:48 udav/data_dlg.cpp:33
+msgid "UDAV - Insert style/scheme"
+msgstr ""
+
+#: udav/dat_pnl.cpp:270
+msgid "UDAV - Load data"
+msgstr ""
+
+#: udav/dat_pnl.cpp:450
+msgid "UDAV - Make histogram"
+msgstr ""
+
+#: udav/mem_pnl.cpp:84
+msgid "UDAV - New variable"
+msgstr ""
+
+#: udav/dat_pnl.cpp:377
+msgid "UDAV - Normalize by slice"
+msgstr ""
+
+#: udav/dat_pnl.cpp:366
+msgid "UDAV - Normalize data"
+msgstr ""
+
+#: udav/open_dlg.cpp:49
+msgid "UDAV - Open data file"
+msgstr ""
+
+#: udav/udav_wnd.cpp:633
+msgid "UDAV - Open file"
+msgstr ""
+
+#: udav/prop_dlg.cpp:60 udav/prop_dlg.cpp:285
+msgid "UDAV - Properties"
+msgstr ""
+
+#: udav/dat_pnl.cpp:283
+msgid "UDAV - Read from HDF"
+msgstr ""
+
+#: udav/dat_pnl.cpp:436
+msgid "UDAV - Rearrange data"
+msgstr ""
+
+#: udav/dat_pnl.cpp:402
+msgid "UDAV - Resize data"
+msgstr ""
+
+#: udav/setup_dlg.cpp:159 udav/setup_dlg.cpp:163
+msgid "UDAV - Save template"
+msgstr ""
+
+#: udav/dat_pnl.cpp:261
+msgid "UDAV - Save to HDF"
+msgstr ""
+
+#: udav/dat_pnl.cpp:248
+msgid "UDAV - Save/export data"
+msgstr ""
+
+#: udav/args_dlg.cpp:32
+msgid "UDAV - Set script arguments"
+msgstr ""
+
+#: udav/files_dlg.cpp:29
+msgid "UDAV - Set template parameters"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:37
+msgid "UDAV - Setup inplot"
+msgstr ""
+
+#: udav/setup_dlg.cpp:39 udav/setup_dlg.cpp:190
+msgid "UDAV - Setup plot"
+msgstr ""
+
+#: udav/dat_pnl.cpp:413
+msgid "UDAV - Squeeze data"
+msgstr ""
+
+#: udav/udav_wnd.cpp:456
+msgid "UDAV - about"
+msgstr ""
+
+#: udav/anim_dlg.cpp:105
+msgid "UDAV - animation"
+msgstr ""
+
+#: udav/dat_pnl.cpp:608
+msgid "UDAV - change data"
+msgstr ""
+
+#: udav/opt_dlg.cpp:94 udav/opt_dlg.cpp:101 udav/opt_dlg.cpp:108
+#: udav/opt_dlg.cpp:115
+msgid "UDAV - command options"
+msgstr ""
+
+#: udav/mem_pnl.cpp:121
+msgid "UDAV - delete all data"
+msgstr ""
+
+#: udav/text_pnl.cpp:202
+msgid "UDAV - find text"
+msgstr ""
+
+#: udav/dat_pnl.cpp:536 udav/dat_pnl.cpp:566 udav/dat_pnl.cpp:572
+#: udav/dat_pnl.cpp:643
+msgid "UDAV - make new data"
+msgstr ""
+
+#: udav/text_pnl.cpp:431
+msgid "UDAV - open file"
+msgstr ""
+
+#: udav/udav_wnd.cpp:569 udav/udav_wnd.cpp:579 udav/udav_wnd.cpp:621
+msgid "UDAV - save current"
+msgstr ""
+
+#: udav/udav_wnd.cpp:669
+msgid "UDAV - save file"
+msgstr ""
+
+#: udav/style_dlg.cpp:160 mgllab/dialogs.cpp:371
+msgid "Underline"
+msgstr ""
+
+#. edit menu
+#: udav/text_pnl.cpp:516 mgllab/mgllab.cpp:308
+msgid "Undo"
+msgstr ""
+
+#: udav/text_pnl.cpp:518
+msgid "Undo editor change (Ctrl+Z)."
+msgstr ""
+
+#: mgllab/mgllab.cpp:137
+msgid "Untitled"
+msgstr ""
+
+#: mgllab/mgllab.cpp:360 mgllab/mgllab.cpp:364
+msgid "Untitled - mgllab"
+msgstr ""
+
+#: widgets/fltk.cpp:1104
+msgid "Update"
+msgstr ""
+
+#: udav/mem_pnl.cpp:62
+msgid "Update list of data arrays"
+msgstr ""
+
+#: mgllab/dialogs.cpp:100
+msgid "Upper border for determining color or alpha"
+msgstr ""
+
+#: utils/mglconv.cpp:83
+#, c-format
+msgid "Usage:\tmglconv [parameter(s)] scriptfile\n"
+msgstr ""
+
+#: mgllab/mgllab.cpp:432
+#, c-format
+msgid "Usage:\tmgllab [parameter(s)] scriptfile\n"
+msgstr ""
+
+#: utils/mglview.cpp:83
+#, c-format
+msgid "Usage:\tmglview [parameter(s)] scriptfile\n"
+msgstr ""
+
+#: widgets/glut.cpp:103
+#, c-format
+msgid ""
+"Use 'a', 'd', 'w', 's', 'q', 'e' for changing view angles\n"
+"Use 'j', 'l', 'i', 'k' for changing light angles\n"
+"Use 'u', 'o' for changing distance to light\n"
+"Use 'r' for switching transparency\n"
+"Use 'f' for switching lightning\n"
+"Use 'E' for exporting to EPS file\n"
+"Use 'S' for exporting to SVG file\n"
+"Use 'J' for exporting to JPEG file\n"
+"Use 'P' for exporting to PNG file\n"
+"Use ',', '.' for show other frames\n"
+"Use 'm' for view movie\n"
+"Use 'h' for view this text\n"
+"Use 'x' for exit\n"
+msgstr ""
+
+#: udav/style_dlg.cpp:162
+msgid "Use color scheme"
+msgstr ""
+
+#: udav/prop_dlg.cpp:175
+msgid "Use dots plot for preview"
+msgstr ""
+
+#: mgllab/mgllab.cpp:492
+msgid "Use multi-threading for drawing"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:67 udav/opt_dlg.cpp:68 mgllab/dialogs.cpp:101
+msgid "Value"
+msgstr ""
+
+#: mgllab/dialogs.cpp:398
+msgid "Value for i-th color"
+msgstr ""
+
+#: mgllab/dialogs.cpp:727 mgllab/dialogs.cpp:1047
+msgid "Variant"
+msgstr ""
+
+#: mgllab/dialogs.cpp:728
+msgid ""
+"Variant 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."
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:170 mgllab/dialogs.cpp:711
+msgid "Vector plots"
+msgstr ""
+
+#: mgllab/dialogs.cpp:379
+msgid "Vertical align"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:55 udav/subplot_dlg.cpp:72 udav/subplot_dlg.cpp:97
+msgid "Vertical size"
+msgstr ""
+
+#. k
+#: udav/style_dlg.cpp:236 mgllab/dialogs.cpp:44
+msgid "W - lightgray"
+msgstr ""
+
+#: src/exec_dat.cpp:1728
+msgid "Wavelet transform at some direction"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:195
+msgid "Whole area"
+msgstr ""
+
+#: mgllab/mgllab.cpp:495
+msgid "Widget scheme"
+msgstr ""
+
+#: mgllab/dialogs.cpp:329
+msgid "Width"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:80
+msgid "Width of selected cells"
+msgstr ""
+
+#: src/data.cpp:1427
+#, c-format
+msgid ""
+"Widths are:\n"
+"Wa = %g\tWx = %g\tWy = %g\tWz = %g\n"
+msgstr ""
+
+#: mgllab/dialogs.cpp:348
+msgid "Wire or mesh"
+msgstr ""
+
+#: udav/style_dlg.cpp:120
+msgid "Wire or mesh plot"
+msgstr ""
+
+#: udav/style_dlg.cpp:159 mgllab/dialogs.cpp:370
+msgid "Wire style"
+msgstr ""
+
+#: src/exec_set.cpp:839
+msgid "Write current image to graphical file"
+msgstr ""
+
+#: udav/setup_dlg.cpp:48 mgllab/dialogs.cpp:950
+msgid "X axis"
+msgstr ""
+
+#: udav/setup_dlg.cpp:118
+msgid "X pos"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1065
+msgid "X position"
+msgstr ""
+
+#: udav/dat_pnl.cpp:413
+msgid "X-direction"
+msgstr ""
+
+#: udav/opt_dlg.cpp:38 mgllab/dialogs.cpp:85
+msgid "X-range"
+msgstr ""
+
+#: udav/dat_pnl.cpp:388 udav/dat_pnl.cpp:402 udav/dat_pnl.cpp:436
+msgid "X-size"
+msgstr ""
+
+#: mgllab/dialogs.cpp:568
+msgid "X-slice from"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:176
+msgid "X/Z"
+msgstr ""
+
+#: widgets/qt.cpp:1094 udav/plot_pnl.cpp:489
+msgid "XYZ"
+msgstr ""
+
+#. M
+#: udav/style_dlg.cpp:242 mgllab/dialogs.cpp:50
+msgid "Y - olive"
+msgstr ""
+
+#: udav/setup_dlg.cpp:49 mgllab/dialogs.cpp:963
+msgid "Y axis"
+msgstr ""
+
+#: udav/setup_dlg.cpp:119
+msgid "Y pos"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1066
+msgid "Y position"
+msgstr ""
+
+#: udav/dat_pnl.cpp:413
+msgid "Y-direction"
+msgstr ""
+
+#: udav/opt_dlg.cpp:41 mgllab/dialogs.cpp:89
+msgid "Y-range"
+msgstr ""
+
+#: udav/dat_pnl.cpp:388 udav/dat_pnl.cpp:402 udav/dat_pnl.cpp:436
+msgid "Y-size"
+msgstr ""
+
+#: mgllab/dialogs.cpp:571
+msgid "Y-slice from"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:180
+msgid "Y/Z"
+msgstr ""
+
+#: mgllab/help.cpp:135
+msgid "Yes"
+msgstr ""
+
+#: udav/hint_dlg.cpp:36 mgllab/help.cpp:270
+msgid ""
+"You can copy the current image to clipboard by pressing Ctrl-Shift-C. Later "
+"you can paste it directly into yours document or presentation."
+msgstr ""
+
+#: udav/hint_dlg.cpp:49 mgllab/help.cpp:283
+msgid ""
+"You can easily insert file or folder names, last fitted formula or numerical "
+"value of selection by using menu Edit|Insert."
+msgstr ""
+
+#: udav/hint_dlg.cpp:43 mgllab/help.cpp:277
+msgid ""
+"You can edit MGL file in any text editor. Also you can run it in console by "
+"help of commands: mglconv, mglview."
+msgstr ""
+
+#: udav/hint_dlg.cpp:37 mgllab/help.cpp:271
+msgid ""
+"You can export image into a set of format (EPS, SVG, PNG, JPEG) by pressing "
+"right mouse button inside image and selecting 'Export as ...'."
+msgstr ""
+
+#: udav/hint_dlg.cpp:41 mgllab/help.cpp:275
+msgid ""
+"You can put several plots in the same image by help of commands 'subplot' or "
+"'inplot'."
+msgstr ""
+
+#: udav/hint_dlg.cpp:51 mgllab/help.cpp:285
+msgid ""
+"You can put several plotting commands in the same line or in separate "
+"function, for highlighting all of them simultaneously."
+msgstr ""
+
+#: udav/hint_dlg.cpp:34 mgllab/help.cpp:268
+msgid ""
+"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."
+msgstr ""
+
+#: udav/hint_dlg.cpp:39 mgllab/help.cpp:273
+msgid ""
+"You can save the parameter of animation inside MGL script by using comment "
+"started from '##a ' or '##c ' for loops."
+msgstr ""
+
+#: udav/hint_dlg.cpp:38 mgllab/help.cpp:272
+msgid ""
+"You can setup colors for script highlighting in Property dialog. Just select "
+"menu item 'Settings/Properties'."
+msgstr ""
+
+#: udav/hint_dlg.cpp:33 mgllab/help.cpp:267
+msgid ""
+"You can shift axis range by pressing middle button and moving mouse. Also, "
+"you can zoom in/out axis range by using mouse wheel."
+msgstr ""
+
+#: udav/hint_dlg.cpp:46 mgllab/help.cpp:280
+msgid ""
+"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."
+msgstr ""
+
+#: udav/hint_dlg.cpp:44 mgllab/help.cpp:278
+msgid ""
+"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."
+msgstr ""
+
+#: udav/hint_dlg.cpp:45 mgllab/help.cpp:279
+msgid ""
+"You can use command 'stop' for terminating script parsing. It is useful if "
+"you don't want to execute a part of script."
+msgstr ""
+
+#: mgllab/help.cpp:269
+msgid ""
+"You may quickly draw the data from file. Just use: mgllab 'filename.dat' in "
+"command line."
+msgstr ""
+
+#: udav/hint_dlg.cpp:35
+msgid ""
+"You may quickly draw the data from file. Just use: udav 'filename.dat' in "
+"command line."
+msgstr ""
+
+#: mgllab/dialogs.cpp:1529
+msgid "You need to enter text!"
+msgstr ""
+
+#: mgllab/table.cpp:367
+msgid "You need to provide output name"
+msgstr ""
+
+#: udav/prop_dlg.cpp:285
+msgid "You need to restart UDAV for applying the changes."
+msgstr ""
+
+#: mgllab/dialogs.cpp:592
+msgid "You need to select data array"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1489
+msgid "You need to select marker!"
+msgstr ""
+
+#: mgllab/table.cpp:190 mgllab/table.cpp:364
+msgid "You need to specify direction(s)"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:376 udav/newcmd_dlg.cpp:380
+msgid "You should put text inside ' ' for argument "
+msgstr ""
+
+#: udav/anim_dlg.cpp:106
+msgid "You should select one of case"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:384
+msgid "You should specify all optional arguments before "
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:368
+msgid "You should specify required argument "
+msgstr ""
+
+#: udav/setup_dlg.cpp:50 mgllab/dialogs.cpp:976
+msgid "Z axis"
+msgstr ""
+
+#: udav/setup_dlg.cpp:120
+msgid "Z pos"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1067
+msgid "Z position"
+msgstr ""
+
+#: udav/dat_pnl.cpp:413
+msgid "Z-direction"
+msgstr ""
+
+#: udav/opt_dlg.cpp:44 mgllab/dialogs.cpp:93
+msgid "Z-range"
+msgstr ""
+
+#: udav/dat_pnl.cpp:388 udav/dat_pnl.cpp:402 udav/dat_pnl.cpp:436
+msgid "Z-size"
+msgstr ""
+
+#: mgllab/dialogs.cpp:574
+msgid "Z-slice from"
+msgstr ""
+
+#: src/exec_set.cpp:845
+msgid "Zoom axis range"
+msgstr ""
+
+#: widgets/qt.cpp:1129
+msgid "Zoom by mouse"
+msgstr ""
+
+#: widgets/qt.cpp:1228
+msgid "Zoom graphics"
+msgstr ""
+
+#: widgets/qt.cpp:1238 udav/plot_pnl.cpp:515
+msgid "Zoom in"
+msgstr ""
+
+#: widgets/qt.cpp:1240 udav/plot_pnl.cpp:518
+msgid "Zoom in graphics."
+msgstr ""
+
+#: widgets/fltk.cpp:865
+msgid "Zoom in selected region of the picture"
+msgstr ""
+
+#. t->addAction(QPixmap(":/png/help-faq.png"), _("Examples"), this, SLOT(showExamples()));
+#: udav/help_pnl.cpp:55
+msgid "Zoom in text"
+msgstr ""
+
+#: widgets/fltk.cpp:895
+msgid "Zoom in the picture"
+msgstr ""
+
+#: widgets/qt.cpp:1242 udav/plot_pnl.cpp:521
+msgid "Zoom out"
+msgstr ""
+
+#: widgets/qt.cpp:1244 udav/plot_pnl.cpp:524
+msgid "Zoom out graphics."
+msgstr ""
+
+#: udav/help_pnl.cpp:56
+msgid "Zoom out text"
+msgstr ""
+
+#: widgets/fltk.cpp:897
+msgid "Zoom out the picture"
+msgstr ""
+
+#: src/exec_set.cpp:844
+msgid "Zoom plot region"
+msgstr ""
+
+#. zooming menu
+#: widgets/qt.cpp:1227 udav/plot_pnl.cpp:502
+msgid "Zoom/move"
+msgstr ""
+
+#: udav/style_dlg.cpp:131
+msgid "above"
+msgstr ""
+
+#: mgllab/dialogs.cpp:570 mgllab/dialogs.cpp:573 mgllab/dialogs.cpp:576
+msgid "all"
+msgstr ""
+
+#: mgllab/dialogs.cpp:581
+msgid "along"
+msgstr ""
+
+#: mgllab/table.cpp:171 mgllab/table.cpp:346
+msgid "along x"
+msgstr ""
+
+#: mgllab/table.cpp:172 mgllab/table.cpp:347
+msgid "along y"
+msgstr ""
+
+#: mgllab/table.cpp:173 mgllab/table.cpp:348
+msgid "along z"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1012
+msgid "alpha"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1296
+msgid "and"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1456
+msgid "arc"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1018
+msgid "arrows"
+msgstr ""
+
+#: udav/setup_dlg.cpp:72 udav/style_dlg.cpp:170
+msgid "at center"
+msgstr ""
+
+#: udav/setup_dlg.cpp:72
+msgid "at maximum"
+msgstr ""
+
+#: udav/setup_dlg.cpp:72
+msgid "at minimum"
+msgstr ""
+
+#: udav/setup_dlg.cpp:70 mgllab/dialogs.cpp:956
+msgid "at position"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1027
+msgid "attach light"
+msgstr ""
+
+#. mglWarnFmt
+#: src/base.cpp:238
+msgid "axis ranges are incompatible"
+msgstr ""
+
+#. w
+#: udav/style_dlg.cpp:222 mgllab/dialogs.cpp:29
+msgid "b - blue"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1019
+msgid "bars"
+msgstr ""
+
+#: widgets/qt.cpp:1084 udav/plot_pnl.cpp:478
+msgid "bitmap EPS"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1036
+msgid "both"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:189 mgllab/dialogs.cpp:1306
+msgid "bottom"
+msgstr ""
+
+#. r
+#: udav/style_dlg.cpp:225 mgllab/dialogs.cpp:32
+msgid "c - cyan"
+msgstr ""
+
+#: mgllab/dialogs.cpp:957 mgllab/dialogs.cpp:970 mgllab/dialogs.cpp:983
+#: mgllab/dialogs.cpp:996
+msgid "center"
+msgstr ""
+
+#: widgets/fltk.cpp:790
+#, c-format
+msgid "click at %g, %g, %g"
+msgstr ""
+
+#. mglWarnCnt
+#: src/base.cpp:234
+msgid "couldn't open file"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1455
+msgid "curve"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1026
+msgid "cutting"
+msgstr ""
+
+#. -----------------------------------------------------------------------------
+#: src/base.cpp:225
+msgid "data dimension(s) is incompatible"
+msgstr ""
+
+#. mglWarnDim
+#: src/base.cpp:226
+msgid "data dimension(s) is too small"
+msgstr ""
+
+#. mglWarnMem
+#: src/base.cpp:230
+msgid "data values are zero"
+msgstr ""
+
+#: udav/open_dlg.cpp:85 udav/open_dlg.cpp:144 udav/opt_dlg.cpp:63
+#: udav/opt_dlg.cpp:66 mgllab/dialogs.cpp:107 mgllab/dialogs.cpp:116
+#: mgllab/dialogs.cpp:1044
+msgid "default"
+msgstr ""
+
+#: mgllab/help.cpp:149
+msgid "dimensions"
+msgstr ""
+
+#. l
+#: udav/style_dlg.cpp:229 mgllab/dialogs.cpp:36
+msgid "e - lawngreen"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1455
+msgid "ellipse"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1017
+msgid "facenum"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1035
+msgid "factor"
+msgstr ""
+
+#. mglWarnSize
+#: src/base.cpp:237
+msgid "format is not supported for that build"
+msgstr ""
+
+#: src/canvas.cpp:33
+msgid "frame"
+msgstr ""
+
+#: udav/anim_dlg.cpp:55 mgllab/mathgl.cpp:192
+msgid "from"
+msgstr ""
+
+#. b
+#: udav/style_dlg.cpp:223 mgllab/dialogs.cpp:30
+msgid "g - lime"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1044
+msgid "glass-like"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1011
+msgid "grayscale"
+msgstr ""
+
+#. p
+#: udav/style_dlg.cpp:234 mgllab/dialogs.cpp:41
+msgid "h - gray"
+msgstr ""
+
+#: src/parser.cpp:1067
+#, c-format
+msgid "in line %ld"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1036
+msgid "increment"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1236 mgllab/dialogs.cpp:1249 mgllab/dialogs.cpp:1262
+#: mgllab/dialogs.cpp:1271 mgllab/dialogs.cpp:1280
+msgid "ind"
+msgstr ""
+
+#. h
+#: udav/style_dlg.cpp:235 mgllab/dialogs.cpp:43
+msgid "k - black"
+msgstr ""
+
+#. y
+#: udav/style_dlg.cpp:228 mgllab/dialogs.cpp:35
+msgid "l - springgreen"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1045
+msgid "lamp-like"
+msgstr ""
+
+#. vv->addSpacing(11);
+#: udav/style_dlg.cpp:169 udav/subplot_dlg.cpp:187 mgllab/dialogs.cpp:957
+#: mgllab/dialogs.cpp:970 mgllab/dialogs.cpp:983 mgllab/dialogs.cpp:996
+#: mgllab/dialogs.cpp:1304
+msgid "left"
+msgstr ""
+
+#. mglWarnOpen
+#: src/base.cpp:235
+msgid "light: ID is out of range"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1013
+msgid "lighting"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1454
+msgid "line"
+msgstr ""
+
+#. c
+#: udav/style_dlg.cpp:226 mgllab/dialogs.cpp:33
+msgid "m - magenta"
+msgstr ""
+
+#.
+#. ^
+#: udav/style_dlg.cpp:317 udav/style_dlg.cpp:356 mgllab/dialogs.cpp:209
+#: mgllab/dialogs.cpp:247
+msgid "manual"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1454
+msgid "marker"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1020
+msgid "markers"
+msgstr ""
+
+#: udav/data_dlg.cpp:68
+msgid "max"
+msgstr ""
+
+#: mgllab/help.cpp:151
+msgid "mem. usage"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1016
+msgid "meshnum"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:247
+msgid "mgl_en"
+msgstr ""
+
+#: utils/mglconv.cpp:82
+#, c-format
+msgid ""
+"mglconv convert mgl script to image file (default PNG).\n"
+"Current version is 2.%g\n"
+msgstr ""
+
+#: mgllab/mgllab.cpp:431
+#, c-format
+msgid ""
+"mgllab draw mgl script interactively.\n"
+"Current version is 2.%g\n"
+msgstr ""
+
+#: mgllab/help.cpp:78
+#, c-format
+msgid ""
+"mgllab v. 2.%g\n"
+"(c) Alexey Balakin, 2017\n"
+"http://mathgl.sf.net/"
+msgstr ""
+
+#: utils/mglview.cpp:82
+#, c-format
+msgid ""
+"mglview show plot from MGL script or MGLD file.\n"
+"Current version is 2.%g\n"
+msgstr ""
+
+#: udav/data_dlg.cpp:68
+msgid "min"
+msgstr ""
+
+#. mglWarnLow
+#: src/base.cpp:227
+msgid "minimal data value is negative"
+msgstr ""
+
+#. e
+#: udav/style_dlg.cpp:230 mgllab/dialogs.cpp:37
+msgid "n - skyblue"
+msgstr ""
+
+#: mgllab/help.cpp:147
+msgid "name"
+msgstr ""
+
+#. mglWarnNeg
+#: src/base.cpp:228
+msgid "no file or wrong data dimensions"
+msgstr ""
+
+#. mglWarnZero
+#: src/base.cpp:231
+msgid "no legend entries"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1028
+msgid "no origin tick"
+msgstr ""
+
+#. "-+=;oOsS~<>jdD*^"
+#. ".+x*sdv^<>o.*+xsdv^<>o" : nf = 10
+#: udav/style_dlg.cpp:128 udav/style_dlg.cpp:131 udav/style_dlg.cpp:134
+#: udav/style_dlg.cpp:339 udav/style_dlg.cpp:383 udav/data_dlg.cpp:67
+#: mgllab/dialogs.cpp:214 mgllab/dialogs.cpp:230 mgllab/dialogs.cpp:1035
+#: mgllab/dialogs.cpp:1039
+msgid "none"
+msgstr ""
+
+#: udav/style_dlg.cpp:220
+msgid "none or default"
+msgstr ""
+
+#. mglWarnFile
+#: src/base.cpp:229
+msgid "not enough memory"
+msgstr ""
+
+#. mglWarnNull
+#: src/base.cpp:240
+msgid "not enough space for plot"
+msgstr ""
+
+#: mgllab/table.cpp:85
+msgid "not used"
+msgstr ""
+
+#. mglWarnSlc
+#: src/base.cpp:233
+msgid "number of contours is zero or negative"
+msgstr ""
+
+#: udav/opt_dlg.cpp:63 udav/opt_dlg.cpp:66
+msgid "off"
+msgstr ""
+
+#: udav/opt_dlg.cpp:63 udav/opt_dlg.cpp:66 udav/setup_dlg.cpp:128
+msgid "on"
+msgstr ""
+
+#: udav/dat_pnl.cpp:549
+msgid "or enter name for new variable"
+msgstr ""
+
+#. q
+#: udav/style_dlg.cpp:233 mgllab/dialogs.cpp:40
+msgid "p - deeppink"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1023
+msgid "pen blur"
+msgstr ""
+
+#: mgllab/dialogs.cpp:392
+msgid "plain"
+msgstr ""
+
+#. mglWarnTern
+#: src/base.cpp:239
+msgid "pointer is NULL"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1456
+msgid "polygon"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1040
+msgid "projection"
+msgstr ""
+
+#. u
+#: udav/style_dlg.cpp:232 mgllab/dialogs.cpp:39
+msgid "q - orange"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1040
+msgid "quaternary"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1041
+msgid "quaternary proj"
+msgstr ""
+
+#. g
+#: udav/style_dlg.cpp:224 mgllab/dialogs.cpp:31
+msgid "r - red"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1454
+msgid "rectangle"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1455
+msgid "rhomb"
+msgstr ""
+
+#: udav/style_dlg.cpp:172 udav/subplot_dlg.cpp:193 mgllab/dialogs.cpp:958
+#: mgllab/dialogs.cpp:971 mgllab/dialogs.cpp:984 mgllab/dialogs.cpp:997
+#: mgllab/dialogs.cpp:1310
+msgid "right"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1029
+msgid "rotate text"
+msgstr ""
+
+#: mgllab/mathgl.cpp:199
+msgid "save slides"
+msgstr ""
+
+#. mglWarnLId
+#: src/base.cpp:236
+msgid "size(s) is zero or negative"
+msgstr ""
+
+#. mglWarnLeg
+#: src/base.cpp:232
+msgid "slice value is out of range"
+msgstr ""
+
+#: mgllab/table.cpp:144
+msgid "smoothed"
+msgstr ""
+
+#: mgllab/dialogs.cpp:326
+msgid "solid"
+msgstr ""
+
+#: widgets/qt.cpp:1082 udav/plot_pnl.cpp:476
+msgid "solid PNG"
+msgstr ""
+
+#: udav/anim_dlg.cpp:45 mgllab/mathgl.cpp:187
+msgid "strings"
+msgstr ""
+
+#: udav/data_dlg.cpp:67
+msgid "sum"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1039
+msgid "ternary"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1041
+msgid "ternary proj"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1021 mgllab/dialogs.cpp:1456
+msgid "text"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1022
+msgid "ticks"
+msgstr ""
+
+#: udav/anim_dlg.cpp:59 mgllab/mathgl.cpp:193 mgllab/dialogs.cpp:569
+#: mgllab/dialogs.cpp:572 mgllab/dialogs.cpp:575
+msgid "to"
+msgstr ""
+
+#: mgllab/mgllab.cpp:579
+msgid "to script"
+msgstr ""
+
+#: udav/subplot_dlg.cpp:191 mgllab/dialogs.cpp:1308
+msgid "top"
+msgstr ""
+
+#. n
+#: udav/style_dlg.cpp:231 mgllab/dialogs.cpp:38
+msgid "u - blueviolet"
+msgstr ""
+
+#: udav/style_dlg.cpp:131
+msgid "under"
+msgstr ""
+
+#: udav/mem_pnl.cpp:168 mgllab/help.cpp:199
+msgid "unknown"
+msgstr ""
+
+#: udav/udav_wnd.cpp:168 udav/udav_wnd.cpp:560 udav/udav_wnd.cpp:693
+msgid "untitled - UDAV"
+msgstr ""
+
+#: udav/udav_wnd.cpp:686
+msgid "untitled* - UDAV"
+msgstr ""
+
+#: mgllab/dialogs.cpp:327
+msgid "user"
+msgstr ""
+
+#: udav/anim_dlg.cpp:52 mgllab/mathgl.cpp:189
+msgid "values"
+msgstr ""
+
+#: widgets/qt.cpp:1085 udav/plot_pnl.cpp:479
+msgid "vector EPS"
+msgstr ""
+
+#.
+#: udav/style_dlg.cpp:221 mgllab/dialogs.cpp:28
+msgid "w - white"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1312
+msgid "whole area"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1471
+msgid "wire"
+msgstr ""
+
+#: udav/anim_dlg.cpp:63 mgllab/mathgl.cpp:194
+msgid "with step"
+msgstr ""
+
+#. m
+#: udav/style_dlg.cpp:227 mgllab/dialogs.cpp:34
+msgid "y - yellow"
+msgstr ""
diff --git a/mathgl_ru.po b/mathgl_ru.po
new file mode 100644 (file)
index 0000000..105d0b6
--- /dev/null
@@ -0,0 +1,6575 @@
+# Russian translations for MathGL2 package.
+# Copyright (C) 2017 THE MathGL2'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the MathGL2 package.
+# Alexey Balakin <mathgl.abalakin@gmail.com>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: MathGL2 2.4.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-03-20 11:17+0300\n"
+"PO-Revision-Date: 2017-04-19 01:17+0300\n"
+"Last-Translator: Alexey Balakin <mathgl.abalakin@gmail.com>\n"
+"Language-Team: Russian\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: mgllab/mgllab.cpp:433
+#, c-format
+msgid ""
+"\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-L loc       set locale to loc\n"
+"\t-h           print this message\n"
+msgstr ""
+"\t-1 str       установить аргумент $1 равным str\n"
+"\t...          ...\n"
+"\t-9 str       установить аргумент $9 равным str\n"
+"\t-L loc       изменить локаль на loc\n"
+"\t-h           показать справку \n"
+
+#: utils/mglconv.cpp:85
+#, c-format
+msgid ""
+"\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-L loc       set locale to loc\n"
+"\t-s fname     set MGL script for setting up the plot\n"
+"\t-S val       set scaling factor for images\n"
+"\t-q val       set quality for output (val=0...9)\n"
+"\t-g val       set gray-scale mode (val=0|1)\n"
+"\t-v val       set variant of arguments\n"
+"\t-o name      set output file name\n"
+"\t-n           no default output (script should save results by itself)\n"
+"\t-A val       add animation value val\n"
+"\t-C n1:n2:dn  add animation value in range [n1,n2] with step dn\n"
+"\t-C n1:n2     add animation value in range [n1,n2] with step 1\n"
+"\t-            get script from standard input\n"
+"\t-h           print this message\n"
+msgstr ""
+"\t-1 str       установить аргумент $1 равным str\n"
+"\t...          ...\n"
+"\t-9 str       установить аргумент $9 равным str\n"
+"\t-L loc       изменить локаль на loc\n"
+"\t-s fname     дополнительный скрипт с настройками графика\n"
+"\t-S val       масштабирование для рисунка\n"
+"\t-q val       качество рисунка по умолчанию (val=0...9)\n"
+"\t-g val       режим оттенков серого (val=0|1)\n"
+"\t-v val       задать вариант аргументов\n"
+"\t-o name      имя файла для сохранения рисунка\n"
+"\t-n           нет вывода по умолчанию (скрипт должен сохранить рисунок "
+"сам)\n"
+"\t-A val       добавить значение val в анимацию\n"
+"\t-C n1:n2:dn  добавить диапазон [n1,n2] с шагом dn анимацию\n"
+"\t-C n1:n2     добавить диапазон [n1,n2] с шагом 1 анимацию\n"
+"\t-            загрузить скрипт из стандартного ввода\n"
+"\t-h           показать справку\n"
+
+#: utils/mglview.cpp:85
+#, c-format
+msgid ""
+"\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"
+msgstr ""
+"\t-1 str       установить аргумент $1 равным str\n"
+"\t...          ...\n"
+"\t-9 str       установить аргумент $9 равным str\n"
+"\t-g val       режим оттенков серого (val=0|1)\n"
+"\t-v val       задать вариант аргументов\n"
+"\t-s opt       дополнительный скрипт с настройками графика\n"
+"\t-L loc       изменить локаль на loc\n"
+"\t-            загрузить скрипт из стандартного ввода\n"
+"\t-h           показать справку\n"
+
+#: widgets/qt.cpp:872
+msgid ""
+"\n"
+"(c) Alexey Balakin, 2007\n"
+"http://mathgl.sourceforge.net/"
+msgstr ""
+"\n"
+"(c) Алексей Балакин, 2007\n"
+"http://mathgl.sourceforge.net/"
+
+#: src/parser.cpp:1066
+#, c-format
+msgid ""
+"\n"
+"Change temporary data in line %ld"
+msgstr ""
+"\n"
+"Попытка изменить временные данные в строке %ld"
+
+#: src/parser.cpp:1064
+#, c-format
+msgid ""
+"\n"
+"String too long in line %ld"
+msgstr ""
+"\n"
+"Строковый аргумент слишком длинный в строке %ld"
+
+#: src/parser.cpp:1065
+#, c-format
+msgid ""
+"\n"
+"Unbalanced ' in line %ld"
+msgstr ""
+"\n"
+"Лишняя кавычка ' в строке %ld"
+
+#: src/parser.cpp:1062
+#, c-format
+msgid ""
+"\n"
+"Wrong argument(s) in line %ld"
+msgstr ""
+"\n"
+"Неправильные аргументы в строке %ld"
+
+#: src/parser.cpp:1063
+#, c-format
+msgid ""
+"\n"
+"Wrong command in line %ld"
+msgstr ""
+"\n"
+"Неправильная команда в строке %ld"
+
+#: udav/mem_pnl.cpp:136 udav/dat_pnl.cpp:153
+msgid " - UDAV preview"
+msgstr " - UDAV предпросмотр"
+
+#: udav/dat_pnl.cpp:152
+msgid " - UDAV variable"
+msgstr " - UDAV переменная"
+
+#. o = new Fl_Button(420, 400, 90, 25, _(" Refresh")); o->callback(mem_update_cb,w);
+#. o->image(img_update);       o->align(FL_ALIGN_IMAGE_NEXT_TO_TEXT);
+#. o->tooltip(_("Refresh list of variables."));
+#: mgllab/help.cpp:176
+msgid " Del.all"
+msgstr " Удал.все"
+
+#: mgllab/help.cpp:164
+msgid " Delete"
+msgstr " Удалить"
+
+#: mgllab/help.cpp:158
+msgid " Edit"
+msgstr " Правка"
+
+#: mgllab/help.cpp:161
+msgid " Info"
+msgstr " Инфо"
+
+#: mgllab/help.cpp:167
+msgid " New"
+msgstr " Новый"
+
+#: mgllab/help.cpp:170
+msgid " Save"
+msgstr " Сохранить"
+
+#: mgllab/mgllab.cpp:242
+msgid " Yes "
+msgstr "Да"
+
+#: udav/plot_pnl.cpp:191
+#, c-format
+msgid "%d - %d of %d"
+msgstr "%d - %d из %d"
+
+#. :
+#: udav/style_dlg.cpp:316 mgllab/dialogs.cpp:208
+msgid "' ' none"
+msgstr "' ' нет"
+
+#: udav/style_dlg.cpp:397
+msgid "'#*' Y-sign"
+msgstr "'#*' знак Y"
+
+#: udav/style_dlg.cpp:398
+msgid "'#+' squared plus"
+msgstr "'#+' плюс в квадрате"
+
+#: udav/style_dlg.cpp:396
+msgid "'#.' circled dot"
+msgstr "'#.' точка в круге"
+
+#: udav/style_dlg.cpp:405
+msgid "'#<' solid triangle left"
+msgstr "'#<' треуг.влево сплошной"
+
+#: udav/style_dlg.cpp:406
+msgid "'#>' solid triangle right"
+msgstr "'#>' треуг.вправо сплошной"
+
+#: udav/style_dlg.cpp:404
+msgid "'#^' solid triangle up"
+msgstr "'#^' треуг.вверх сплошной"
+
+#: udav/style_dlg.cpp:402
+msgid "'#d' solid rhomb"
+msgstr "'#d' ромб сплошной"
+
+#: udav/style_dlg.cpp:407
+msgid "'#o' solid circle"
+msgstr "'#o' круг"
+
+#: udav/style_dlg.cpp:401
+msgid "'#s' solid square"
+msgstr "'#s' квадрат сплошной"
+
+#: udav/style_dlg.cpp:403
+msgid "'#v' solid triangle down"
+msgstr "'#v' треуг.вниз сплошной"
+
+#: udav/style_dlg.cpp:399
+msgid "'#x' squared cross"
+msgstr "'#x' крест в квадрате"
+
+#. D
+#: udav/style_dlg.cpp:354 mgllab/dialogs.cpp:245
+msgid "'*' cross"
+msgstr "'*' крест"
+
+#.
+#: udav/style_dlg.cpp:387 mgllab/dialogs.cpp:215
+msgid "'*' star"
+msgstr "'*' звезда"
+
+#. o
+#. -
+#: udav/style_dlg.cpp:341 udav/style_dlg.cpp:385 mgllab/dialogs.cpp:217
+#: mgllab/dialogs.cpp:232
+msgid "'+' plus"
+msgstr "'+' плюс"
+
+#.
+#: udav/style_dlg.cpp:340 mgllab/dialogs.cpp:231
+msgid "'-' lines"
+msgstr "'-' линии"
+
+#. "-|;=ji: "
+#: udav/style_dlg.cpp:309 mgllab/dialogs.cpp:201
+msgid "'-' solid"
+msgstr "'-' сплошная"
+
+#. d
+#: udav/style_dlg.cpp:384 mgllab/dialogs.cpp:221
+msgid "'.' dot"
+msgstr "'.' точка"
+
+#. =
+#: udav/style_dlg.cpp:315 mgllab/dialogs.cpp:207
+msgid "':' dots"
+msgstr "':' точками"
+
+#. j
+#. =
+#: udav/style_dlg.cpp:311 udav/style_dlg.cpp:343 mgllab/dialogs.cpp:204
+#: mgllab/dialogs.cpp:234
+msgid "';' dash"
+msgstr "';' пунктир"
+
+#. ~
+#: udav/style_dlg.cpp:349 mgllab/dialogs.cpp:241
+msgid "'<' left sign"
+msgstr "'<' знак влево"
+
+#. v
+#: udav/style_dlg.cpp:392 mgllab/dialogs.cpp:224
+msgid "'<' triangle left"
+msgstr "'<' треуг.влево"
+
+#. +
+#: udav/style_dlg.cpp:342 mgllab/dialogs.cpp:233
+msgid "'=' double lines"
+msgstr "'=' двойные линии"
+
+#. i
+#: udav/style_dlg.cpp:312 mgllab/dialogs.cpp:206
+msgid "'=' small dash"
+msgstr "'=' мелкий пунктир"
+
+#. <
+#: udav/style_dlg.cpp:350 mgllab/dialogs.cpp:242
+msgid "'>' right sign"
+msgstr "'>' знак вправо"
+
+#. <
+#: udav/style_dlg.cpp:393 mgllab/dialogs.cpp:225
+msgid "'>' triangle right"
+msgstr "'>' треуг.вправо"
+
+#. _
+#: udav/style_dlg.cpp:265 udav/style_dlg.cpp:288 mgllab/dialogs.cpp:188
+msgid "'A' arrow"
+msgstr "'A' стрелка"
+
+#. S
+#: udav/style_dlg.cpp:271 udav/style_dlg.cpp:294 mgllab/dialogs.cpp:194
+msgid "'D' rhomb"
+msgstr "'D' ромб"
+
+#. d
+#: udav/style_dlg.cpp:353 mgllab/dialogs.cpp:244
+msgid "'D' solid rhomb"
+msgstr "'D' ромб сплошной"
+
+#. V
+#: udav/style_dlg.cpp:267 udav/style_dlg.cpp:290 mgllab/dialogs.cpp:191
+msgid "'I' stop"
+msgstr "'I' стоп"
+
+#. A
+#: udav/style_dlg.cpp:268 udav/style_dlg.cpp:291 mgllab/dialogs.cpp:189
+msgid "'K' size"
+msgstr "'K' размер"
+
+#. D
+#: udav/style_dlg.cpp:272 udav/style_dlg.cpp:295 mgllab/dialogs.cpp:195
+msgid "'O' circle"
+msgstr "'O' круг"
+
+#. o
+#: udav/style_dlg.cpp:345 mgllab/dialogs.cpp:237
+msgid "'O' solid circle"
+msgstr "'O' круг"
+
+#. s
+#: udav/style_dlg.cpp:347 mgllab/dialogs.cpp:239
+msgid "'S' solid square"
+msgstr "'S' квадрат сплошной"
+
+#. T
+#: udav/style_dlg.cpp:270 udav/style_dlg.cpp:293 mgllab/dialogs.cpp:193
+msgid "'S' square"
+msgstr "'S' квадрат"
+
+#. I
+#: udav/style_dlg.cpp:269 udav/style_dlg.cpp:292 mgllab/dialogs.cpp:192
+msgid "'T' triangle"
+msgstr "'T' треугольник"
+
+#. K
+#: udav/style_dlg.cpp:266 udav/style_dlg.cpp:289 mgllab/dialogs.cpp:190
+msgid "'V' back arrow"
+msgstr "'V' обр.стрелка"
+
+#. O
+#: mgllab/dialogs.cpp:196
+msgid "'X' cross"
+msgstr "'X' крест"
+
+#. *
+#: udav/style_dlg.cpp:355 mgllab/dialogs.cpp:246
+msgid "'^' hats"
+msgstr "'^' шляпы"
+
+#. .
+#: udav/style_dlg.cpp:391 mgllab/dialogs.cpp:222
+msgid "'^' triangle up"
+msgstr "'^' треуг.вверх"
+
+#. "AVIKTSDO"
+#: udav/style_dlg.cpp:264 udav/style_dlg.cpp:287 mgllab/dialogs.cpp:187
+msgid "'_' none"
+msgstr "'_' нет"
+
+#. s
+#. >
+#: udav/style_dlg.cpp:352 udav/style_dlg.cpp:389 mgllab/dialogs.cpp:220
+#: mgllab/dialogs.cpp:243
+msgid "'d' rhomb"
+msgstr "'d' ромб"
+
+#. ;
+#: udav/style_dlg.cpp:314 mgllab/dialogs.cpp:205
+msgid "'i' small dash dot"
+msgstr "'i' точка-пунктир"
+
+#. |
+#. ;
+#: udav/style_dlg.cpp:313 udav/style_dlg.cpp:351 mgllab/dialogs.cpp:203
+#: mgllab/dialogs.cpp:235
+msgid "'j' dash dot"
+msgstr "'j' точка-штрих"
+
+#. *
+#. j
+#: udav/style_dlg.cpp:344 udav/style_dlg.cpp:394 mgllab/dialogs.cpp:216
+#: mgllab/dialogs.cpp:236
+msgid "'o' circle"
+msgstr "'o' окружность"
+
+#. x
+#. O
+#: udav/style_dlg.cpp:346 udav/style_dlg.cpp:388 mgllab/dialogs.cpp:219
+#: mgllab/dialogs.cpp:238
+msgid "'s' square"
+msgstr "'s' квадрат"
+
+#. ^
+#: udav/style_dlg.cpp:390 mgllab/dialogs.cpp:223
+msgid "'v' triangle down"
+msgstr "'v' треуг.вниз"
+
+#. +
+#: udav/style_dlg.cpp:386 mgllab/dialogs.cpp:218
+msgid "'x' skew cross"
+msgstr "'x' косой крест"
+
+#. -
+#: udav/style_dlg.cpp:310 mgllab/dialogs.cpp:202
+msgid "'|' long dash"
+msgstr "'|' штрихи"
+
+#. S
+#: udav/style_dlg.cpp:348 mgllab/dialogs.cpp:240
+msgid "'~' waves"
+msgstr "'~' волны"
+
+#: src/parser.cpp:51
+msgid "0 - special plot"
+msgstr "0 - специальные графики"
+
+#: src/parser.cpp:51
+msgid "1 - other plot"
+msgstr "1 - прочие графики"
+
+#: src/parser.cpp:51
+msgid "10 - dd plot"
+msgstr "10 - двойный графики"
+
+#: src/parser.cpp:51
+msgid "11 - vector plot"
+msgstr "11 - векторные графики"
+
+#: src/parser.cpp:51
+msgid "12 - axis"
+msgstr "12 - оси координат"
+
+#: src/parser.cpp:51
+msgid "13 - primitives"
+msgstr "13 - примитивы"
+
+#: src/parser.cpp:51
+msgid "14 - axis setup"
+msgstr "14 - настройка осей"
+
+#: src/parser.cpp:51
+msgid "15 - text/legend"
+msgstr "15 - текст/легенда"
+
+#: src/parser.cpp:51
+msgid "16 - data transform"
+msgstr "16 - преобразования данных"
+
+#: udav/info_dlg.cpp:47
+msgid "1D plot"
+msgstr "1D график"
+
+#: udav/newcmd_dlg.cpp:166 mgllab/dialogs.cpp:707
+msgid "1D plots"
+msgstr "1D графики"
+
+#: mgllab/help.cpp:360
+msgid "1D view"
+msgstr "1D вид"
+
+#: src/parser.cpp:51
+msgid "2 - setup"
+msgstr "2 - настройки"
+
+#: udav/info_dlg.cpp:47
+msgid "2D plot"
+msgstr "2D график"
+
+#: udav/newcmd_dlg.cpp:167 mgllab/dialogs.cpp:708
+msgid "2D plots"
+msgstr "2D графики"
+
+#: mgllab/help.cpp:362
+msgid "2D view"
+msgstr "2D вид"
+
+#: src/parser.cpp:51
+msgid "3 - data handle"
+msgstr "3 - изменение данных"
+
+#: udav/open_dlg.cpp:71
+msgid "3D data with sizes from file"
+msgstr "3D данные с размерами из файла"
+
+#: udav/newcmd_dlg.cpp:168 mgllab/dialogs.cpp:709
+msgid "3D plots"
+msgstr "3D графики"
+
+#: mgllab/help.cpp:364
+msgid "3D view"
+msgstr "3D вид"
+
+#: src/parser.cpp:51
+msgid "4 - data create"
+msgstr "4 - создание данных"
+
+#: src/parser.cpp:51
+msgid "5 - subplot"
+msgstr "5 - картинка в картинке"
+
+#: src/parser.cpp:51
+msgid "6 - program flow"
+msgstr "6 - команды управления"
+
+#: src/parser.cpp:51
+msgid "7 - 1d plot"
+msgstr "7 - 1D графики"
+
+#: src/parser.cpp:51
+msgid "8 - 2d plot"
+msgstr "8 - 2D графики"
+
+#: src/parser.cpp:51
+msgid "9 - 3d plot"
+msgstr "9 - 3D графики"
+
+#: udav/udav_wnd.cpp:455
+msgid ""
+"<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>"
+msgstr ""
+"<br>(c) Алексей Балакин, 2007-наст.вр.<br><br><a href='http://www.gnu.org/"
+"copyleft/gpl.html'>Лицензия GPL v.2 или более поздняя.</a>"
+
+#: mgllab/help.cpp:304
+msgid "@<-  Prev"
+msgstr "@<-  Пред."
+
+#: widgets/qt.cpp:1290 udav/udav_wnd.cpp:331 mgllab/mgllab.cpp:347
+msgid "About"
+msgstr "О программе"
+
+#. -----------------------------------------------------------------------------
+#: widgets/qt.cpp:876 widgets/qt.cpp:1291 udav/udav_wnd.cpp:332
+#: udav/udav_wnd.cpp:460
+msgid "About Qt"
+msgstr "О версии Qt"
+
+#: widgets/qt.cpp:1169 udav/plot_pnl.cpp:372
+msgid "Add arc"
+msgstr "Добавить дугу"
+
+#: widgets/qt.cpp:1172 udav/plot_pnl.cpp:375
+msgid "Add arc which properties can be changed later by mouse."
+msgstr "Добавить дугу. Ее свойства можно изменить позже мышью."
+
+#: mgllab/dialogs.cpp:84
+msgid "Add command option(s)"
+msgstr "Добавить опции команды"
+
+#: widgets/qt.cpp:1174 udav/plot_pnl.cpp:378
+msgid "Add curve"
+msgstr "Добавить кривую"
+
+#: widgets/qt.cpp:1177 udav/plot_pnl.cpp:381
+msgid "Add curve which properties can be changed later by mouse."
+msgstr "Добавить кривую. Ее свойства можно изменить позже мышью."
+
+#: src/exec_dat.cpp:1634
+msgid "Add data or number"
+msgstr "Прибавить массив или число"
+
+#: widgets/qt.cpp:1189 udav/plot_pnl.cpp:396
+msgid "Add ellipse"
+msgstr "Добавить эллипс"
+
+#: widgets/qt.cpp:1192 udav/plot_pnl.cpp:399 udav/plot_pnl.cpp:405
+msgid "Add ellipse which properties can be changed later by mouse."
+msgstr "Добавить эллипс. Его свойства можно изменить позже мышью."
+
+#: mgllab/dialogs.cpp:1229
+msgid "Add inplot"
+msgstr "Добавить под-график"
+
+#: src/exec_set.cpp:775
+msgid "Add legend entry"
+msgstr "Добавить запись легенды"
+
+#: mgllab/dialogs.cpp:119
+msgid "Add legend entry for the plot"
+msgstr "Добавить запись легенды для графика"
+
+#: widgets/qt.cpp:1164 udav/plot_pnl.cpp:366
+msgid "Add line"
+msgstr "Добавить линию"
+
+#: widgets/qt.cpp:1167 udav/plot_pnl.cpp:369
+msgid "Add line which properties can be changed later by mouse."
+msgstr "Добавить линию. Ее свойства можно изменить позже мышью."
+
+#: widgets/qt.cpp:1199 udav/plot_pnl.cpp:408
+msgid "Add mark"
+msgstr "Добавить маркер"
+
+#: widgets/qt.cpp:1202 udav/plot_pnl.cpp:411
+msgid "Add marker which properties can be changed later by mouse."
+msgstr "Добавить маркер. Его свойства можно изменить позже мышью."
+
+#: widgets/qt.cpp:1194 udav/plot_pnl.cpp:402
+msgid "Add polygon"
+msgstr "Добавить полигон"
+
+#: widgets/qt.cpp:1197
+msgid "Add polygon which properties can be changed later by mouse."
+msgstr "Добавить полигон. Его свойства можно изменить позже мышью."
+
+#: mgllab/dialogs.cpp:1453
+msgid "Add primitive"
+msgstr "Добавить примитивы"
+
+#: widgets/qt.cpp:1179 udav/plot_pnl.cpp:384
+msgid "Add rect"
+msgstr "Добавить прямоугольник"
+
+#: widgets/qt.cpp:1182 udav/plot_pnl.cpp:387
+msgid "Add rectangle which properties can be changed later by mouse."
+msgstr "Добавить прямоугольник. Его свойства можно изменить позже мышью."
+
+#: widgets/qt.cpp:1184 udav/plot_pnl.cpp:390
+msgid "Add rhombus"
+msgstr "Добавить ромб"
+
+#: widgets/qt.cpp:1187 udav/plot_pnl.cpp:393
+msgid "Add rhombus which properties can be changed later by mouse."
+msgstr "Добавить ромб. Его свойства можно изменить позже мышью."
+
+#: widgets/qt.cpp:1204 udav/plot_pnl.cpp:414
+msgid "Add text"
+msgstr "Добавить текст"
+
+#: widgets/qt.cpp:1207 udav/plot_pnl.cpp:417
+msgid "Add text which properties can be changed later by mouse."
+msgstr "Добавить текст. Его свойства можно изменить позже мышью."
+
+#: src/exec_prm.cpp:648
+msgid "Add title for current subplot/inplot"
+msgstr "Добавить заголовок к текущему под-графику"
+
+#: mgllab/table.cpp:796
+msgid "Add to"
+msgstr "Добавить к"
+
+#: src/exec_set.cpp:776
+msgid "Add user-defined symbol"
+msgstr "Добавить пользовательский символ"
+
+#: widgets/fltk.cpp:873
+msgid "Adjust picture size to fill drawing area"
+msgstr "Подогнать размер картинки под область окна"
+
+#: widgets/fltk.cpp:836 widgets/qt.cpp:1152 udav/plot_pnl.cpp:337
+msgid "Adjust size"
+msgstr "Подогнать размер"
+
+#: src/exec_set.cpp:777
+msgid "Adjust ticks for best view"
+msgstr "Подобрать метки осей для лучшего вида"
+
+#: udav/calc_dlg.cpp:193
+msgid "Airy and Gamma"
+msgstr "Эйри и Гамма"
+
+#: udav/hint_dlg.cpp:42 mgllab/help.cpp:276
+msgid ""
+"All indexes (of data arrays, subplots and so on) are always start from 0."
+msgstr "Все индексы (данных, под-графиков и пр.) всегда начинаются с 0."
+
+#. graphics menu
+#: widgets/qt.cpp:1111 udav/opt_dlg.cpp:51 udav/setup_dlg.cpp:109
+#: udav/plot_pnl.cpp:290 mgllab/dialogs.cpp:109
+msgid "Alpha"
+msgstr ""
+
+#: mgllab/dialogs.cpp:110
+msgid "Alpha value (transparency) of surface or cloud"
+msgstr "Значение прозрачности для поверхностей и облаков"
+
+#: udav/setup_dlg.cpp:93 mgllab/dialogs.cpp:1003
+msgid "AlphaDef"
+msgstr ""
+
+#: udav/opt_dlg.cpp:56 udav/setup_dlg.cpp:95 mgllab/dialogs.cpp:111
+#: mgllab/dialogs.cpp:1004
+msgid "Ambient"
+msgstr "Фон.свет"
+
+#: udav/subplot_dlg.cpp:167
+msgid "Angle around x axis (in degrees)"
+msgstr "Угол относительно оси x (в градусах)"
+
+#: udav/subplot_dlg.cpp:171
+msgid "Angle around z axis (in degrees)"
+msgstr "Угол относительно оси z (в градусах)"
+
+#. animation menu
+#: widgets/qt.cpp:1257 widgets/qt.cpp:1258 udav/plot_pnl.cpp:559
+#: mgllab/mathgl.cpp:185
+msgid "Animation"
+msgstr "Анимация"
+
+#: mgllab/table.cpp:788
+msgid "Another"
+msgstr "Другой"
+
+#: mgllab/table.cpp:854
+msgid "Apply operator (smoothing, integration, difference ...) to data"
+msgstr ""
+"Применить к данным оператор (сглаживание, интегрирование, дифференцирование "
+"и пр.)"
+
+#: mgllab/dialogs.cpp:103
+msgid "Approximate number of mesh lines in plot"
+msgstr "Примерное число линий сетки на графике"
+
+#: mgllab/help.cpp:135
+msgid "Are you sure that you want to delete ALL data arrays?"
+msgstr "Вы уверены, что хотите удалит ВСЕ данные?"
+
+#: udav/newcmd_dlg.cpp:67
+msgid "Argument"
+msgstr "Аргумент"
+
+#: mgllab/dialogs.cpp:738
+msgid "Arguments"
+msgstr "Аргументы"
+
+#: udav/style_dlg.cpp:63 mgllab/dialogs.cpp:321
+msgid "Arrow at end"
+msgstr "Стрелка кон."
+
+#. g->setColStretch(0, 1);     g->setColStretch(1, 1); g->setColStretch(2, 1);
+#: udav/style_dlg.cpp:61 mgllab/dialogs.cpp:315
+msgid "Arrow at start"
+msgstr "Стрелка нач."
+
+#: widgets/qt.cpp:1150
+msgid "Ask to stop plot drawing (F7)."
+msgstr "Запрос на остановку рисования (F7)"
+
+#: udav/subplot_dlg.cpp:175
+msgid "Aspect"
+msgstr "Соотношение сторон"
+
+#: udav/subplot_dlg.cpp:178
+msgid "Aspect ratio of x-scale to z-scale"
+msgstr "Соотношение сторон по x и z"
+
+#: udav/subplot_dlg.cpp:182
+msgid "Aspect ratio of y-scale to z-scale"
+msgstr "Соотношение сторон по y и z"
+
+#: mgllab/dialogs.cpp:1298
+msgid "Aspect x/z"
+msgstr "Стороны x/z"
+
+#: src/exec_set.cpp:783
+msgid "Attach light settings to inplot"
+msgstr "Привязать настройки света к под-графику"
+
+#: udav/open_dlg.cpp:60
+msgid "Auto detect data sizes"
+msgstr "Автоматически определят размер данных"
+
+#: udav/open_dlg.cpp:177
+msgid "Auto detect data sizes (%1 x %2 x %3)"
+msgstr "Автоматически определят размер данных (%1 x %2 x %3)"
+
+#: udav/prop_dlg.cpp:100
+msgid "AutoKey"
+msgstr ""
+
+#: udav/prop_dlg.cpp:159
+msgid "Automatically execute script after loading"
+msgstr "Выполнить скрипт после загрузки"
+
+#: udav/prop_dlg.cpp:165
+msgid "Automatically save before redrawing (F5)"
+msgstr "Сохранять скрипт перед рисованием (F5)"
+
+#: src/data.cpp:1425
+#, c-format
+msgid ""
+"Averages are:\n"
+"<a> = %g\t<x> = %g\t<y> = %g\t<z> = %g\n"
+msgstr "Средние: <a> = %g\t<x> = %g\t<y> = %g\t<z> = %g\n"
+
+#: udav/style_dlg.cpp:122 mgllab/dialogs.cpp:340
+msgid "Axial direction"
+msgstr "Ось вращения"
+
+#: udav/setup_dlg.cpp:101
+msgid "AxialDir"
+msgstr "Ось вращ."
+
+#: mgllab/dialogs.cpp:1008
+msgid "Axis"
+msgstr "Оси"
+
+#: udav/newcmd_dlg.cpp:176 mgllab/dialogs.cpp:717
+msgid "Axis and colorbar"
+msgstr "Оси и цв.шкала"
+
+#: udav/newcmd_dlg.cpp:177 mgllab/dialogs.cpp:718 mgllab/dialogs.cpp:949
+msgid "Axis setup"
+msgstr "Настройка осей"
+
+#. W
+#: udav/style_dlg.cpp:237 mgllab/dialogs.cpp:45
+msgid "B - navy"
+msgstr "B - темно-синий"
+
+#: udav/help_pnl.cpp:48
+msgid "Backward"
+msgstr "Назад"
+
+#: src/font.cpp:953
+#, c-format
+msgid "Bad '%ls' at %zu\n"
+msgstr "Неправильный '%ls' при %zu\n"
+
+#: src/parser.cpp:769
+#, c-format
+msgid "Bad arguments for %ls: %ld instead of %d\n"
+msgstr "Неправильные аргументы для %ls: %ld вместо %d\n"
+
+#: udav/setup_dlg.cpp:97
+msgid "BaseWidth"
+msgstr "Баз.Ширина"
+
+#: udav/calc_dlg.cpp:192
+msgid "Basic"
+msgstr "Базовые"
+
+#: mgllab/dialogs.cpp:1461
+msgid "Begin"
+msgstr "Начало"
+
+#: src/parser.cpp:1483
+msgid "Begin of do-while loop"
+msgstr "Начало цикла do-while"
+
+#: udav/calc_dlg.cpp:193
+msgid "Bessel"
+msgstr "Бессель"
+
+#: udav/style_dlg.cpp:157 mgllab/dialogs.cpp:368
+msgid "Bold style"
+msgstr "Жирный шрифт"
+
+#: udav/opt_dlg.cpp:115
+msgid "Both fields in crange must be filled"
+msgstr "Оба поля в crange должны быть заполнены"
+
+#: udav/opt_dlg.cpp:94
+msgid "Both fields in xrange must be filled"
+msgstr "Оба поля в xrange должны быть заполнены"
+
+#: udav/opt_dlg.cpp:101
+msgid "Both fields in yrange must be filled"
+msgstr "Оба поля в yrange должны быть заполнены"
+
+#: udav/opt_dlg.cpp:108
+msgid "Both fields in zrange must be filled"
+msgstr "Оба поля в zrange должны быть заполнены"
+
+#: src/parser.cpp:1480
+msgid "Break for-loop"
+msgstr "Прервать выполнение цикла for"
+
+#: udav/setup_dlg.cpp:122 mgllab/dialogs.cpp:1069
+msgid "Brightness"
+msgstr "Яркость"
+
+#: mgllab/dialogs.cpp:401
+msgid "Brightness of i-th color"
+msgstr "Яркость i-го цвета"
+
+#: mgllab/table.cpp:768
+msgid "By formula"
+msgstr "По формуле"
+
+#. R
+#: udav/style_dlg.cpp:240 mgllab/dialogs.cpp:48
+msgid "C - teal"
+msgstr "C - бирюзовый"
+
+#: udav/setup_dlg.cpp:51 mgllab/dialogs.cpp:989
+msgid "C axis"
+msgstr "Цв. ось"
+
+#: udav/opt_dlg.cpp:47 mgllab/dialogs.cpp:97
+msgid "C-range"
+msgstr "Цв.диапазон"
+
+#: widgets/qt.cpp:1276
+msgid "Calculations"
+msgstr "Вычисления"
+
+#. TODO
+#. connect(hidden,SIGNAL(cursorPositionChanged()),this,SLOT(hiddenClicked()));
+#: udav/udav_wnd.cpp:194 udav/udav_wnd.cpp:206 mgllab/mgllab.cpp:341
+#: mgllab/mgllab.cpp:572
+msgid "Calculator"
+msgstr "Калькулятор"
+
+#: udav/anim_dlg.cpp:67 udav/prop_dlg.cpp:180 udav/args_dlg.cpp:63
+#: udav/newcmd_dlg.cpp:78 udav/open_dlg.cpp:90 udav/dat_pnl.cpp:460
+#: udav/dat_pnl.cpp:510 udav/dat_pnl.cpp:552 udav/dat_pnl.cpp:629
+#: udav/opt_dlg.cpp:78 udav/setup_dlg.cpp:145 udav/files_dlg.cpp:58
+#: udav/style_dlg.cpp:206 udav/data_dlg.cpp:90 udav/subplot_dlg.cpp:219
+#: mgllab/editor.cpp:282 mgllab/mathgl.cpp:166 mgllab/mathgl.cpp:197
+#: mgllab/dialogs.cpp:120 mgllab/dialogs.cpp:164 mgllab/dialogs.cpp:410
+#: mgllab/dialogs.cpp:584 mgllab/dialogs.cpp:749 mgllab/dialogs.cpp:1071
+#: mgllab/dialogs.cpp:1318 mgllab/dialogs.cpp:1473 mgllab/mgllab.cpp:497
+#: mgllab/table.cpp:101 mgllab/table.cpp:179 mgllab/table.cpp:353
+#: mgllab/table.cpp:556 mgllab/table.cpp:619 mgllab/table.cpp:675
+msgid "Cancel"
+msgstr "Отмена"
+
+#: src/crust.cpp:589
+msgid "Cannot triangulate this set!"
+msgstr "Не могу построить триангуляцию!"
+
+#: udav/udav_wnd.cpp:226 mgllab/mgllab.cpp:370 mgllab/mgllab.cpp:371
+msgid "Canvas"
+msgstr "График"
+
+#: udav/subplot_dlg.cpp:59 udav/subplot_dlg.cpp:101 udav/subplot_dlg.cpp:118
+#: udav/subplot_dlg.cpp:135
+msgid "Cell index"
+msgstr "Индекс ячейки"
+
+#: mgllab/table.cpp:103 mgllab/table.cpp:558 mgllab/table.cpp:772
+msgid "Change"
+msgstr "Изменить"
+
+#: mgllab/table.cpp:104
+msgid "Change (resize) data"
+msgstr "Изменить размер данных"
+
+#: widgets/qt.cpp:1154 udav/plot_pnl.cpp:339
+msgid "Change canvas size to fill whole region (F6)."
+msgstr "Подогнать размер рисунка под размер окна (F6)."
+
+#: src/exec_set.cpp:787
+msgid "Change current directory"
+msgstr "Сменить директорию"
+
+#: mgllab/table.cpp:168
+msgid "Change data"
+msgstr "Изменить данные"
+
+#: mgllab/table.cpp:91
+msgid "Change data sizes"
+msgstr "Изменить размер данных"
+
+#: mgllab/table.cpp:559 mgllab/table.cpp:622 mgllab/table.cpp:678
+msgid "Change data values and close this window"
+msgstr "Изменить данные и закрыть окно"
+
+#: udav/prop_dlg.cpp:71
+msgid "Change font"
+msgstr "Изменить шрифт"
+
+#: src/exec_set.cpp:838
+msgid "Change view angles - use 'rotate' for plot rotation"
+msgstr "Изменяет углы обзора, а не поворот как 'rotate'"
+
+#: udav/calc_dlg.cpp:68
+msgid "Clear"
+msgstr "Очистить"
+
+#: udav/text_pnl.cpp:527
+msgid "Clear all"
+msgstr "Удалить все"
+
+#: src/exec_set.cpp:788
+msgid "Clear legend entries"
+msgstr "Удалить записи легенды"
+
+#: src/exec_set.cpp:789
+msgid "Clear picture"
+msgstr "Очистить рисунок"
+
+#. o = new Fl_Button(180, 130, 25, 25);o->image(img_save);     o->tooltip("img_save");
+#: widgets/fltk.cpp:1102 widgets/qt.cpp:1104 udav/find_dlg.cpp:52
+#: udav/hint_dlg.cpp:70 mgllab/editor.cpp:565 mgllab/help.cpp:308
+#: mgllab/help.cpp:368 mgllab/help.cpp:484
+msgid "Close"
+msgstr "Закрыть"
+
+#: udav/dat_pnl.cpp:833
+msgid "Close tab"
+msgstr "Закрыть вкладку"
+
+#: udav/dat_pnl.cpp:835
+msgid "Close this data tab."
+msgstr "Закрыть вкладку с данными"
+
+#: udav/setup_dlg.cpp:121 udav/style_dlg.cpp:67 mgllab/dialogs.cpp:1068
+#: mgllab/dialogs.cpp:1459
+msgid "Color"
+msgstr "Цвет"
+
+#. g->setColStretch(0, 1);                     g->setColStretch(1, 1);
+#: udav/style_dlg.cpp:106
+msgid "Color order"
+msgstr "Порядок цветов"
+
+#: udav/style_dlg.cpp:150 mgllab/dialogs.cpp:339
+msgid "Color scheme"
+msgstr "Цветовая схема"
+
+#: mgllab/dialogs.cpp:384
+msgid "Color(s) or color scheme"
+msgstr "Цвет(а) или цветовая схема"
+
+#: mgllab/dialogs.cpp:1002
+msgid "Colors"
+msgstr "Цвета"
+
+#: mgllab/table.cpp:881
+msgid ""
+"Colors denote values: magenta - local max, cyan - local min,\n"
+"\tred - Re(v)>0, blue - Re(v)<0, purple - Im(v)>0, teal - Im(v)<0."
+msgstr ""
+"Цветом выделены значения: фуксия - лок.максимум, голубой - лок.минимум,\n"
+"\tкрасный - Re(v)>0, синий - Re(v)<0, пурпурный - Im(v)>0, бирюзовый - "
+"Im(v)<0."
+
+#: mgllab/dialogs.cpp:577
+msgid "Column expr"
+msgstr ""
+
+#: mgllab/dialogs.cpp:724 mgllab/mgllab.cpp:320
+msgid "Command"
+msgstr "Команда"
+
+#: udav/newcmd_dlg.cpp:64 mgllab/dialogs.cpp:740
+msgid ""
+"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\n"
+"for default values."
+msgstr ""
+"Аргументы команды. Жирным обозначены обязательные аргументы.\n"
+"Прочие - опциональные, но их порядок фиксирован.\n"
+"Можно использовать '' для стиля по умолчанию.\n"
+"См. справку справа для значений по умолчанию."
+
+#: udav/text_pnl.cpp:575
+msgid "Command options"
+msgstr "Опции команды"
+
+#: udav/prop_dlg.cpp:82
+msgid "Comments"
+msgstr "Комментарий"
+
+#: src/exec_prm.cpp:636
+msgid "Computes the attractor of an IFS"
+msgstr "Вычисляет точки фрактала IFS"
+
+#: src/exec_prm.cpp:637
+msgid "Computes the attractor of an IFS for 3d case"
+msgstr "Вычисляет точки фрактала IFS в 3d случае"
+
+#: src/exec_prm.cpp:638
+msgid "Computes the attractor of an IFS with parameters from *.ifs file"
+msgstr "Вычисляет точки фрактала IFS с параметрами из файла"
+
+#: src/exec_prm.cpp:632
+msgid "Computes the flame fractal"
+msgstr "Вычисляет точки фрактала flame"
+
+#: src/parser.cpp:1499
+msgid "Condition of do-while loop"
+msgstr "Условие do-while цикла"
+
+#: src/parser.cpp:1489 src/parser.cpp:1493
+msgid "Conditional operator"
+msgstr "Условный оператор"
+
+#: udav/plot_pnl.cpp:358
+msgid "Copy click coor."
+msgstr "Копировать коор. мыши"
+
+#: udav/plot_pnl.cpp:360
+msgid "Copy coordinates of last mouse click to clipboard."
+msgstr "Копировать координаты последнего нажатия в буфер обмена"
+
+#: udav/dat_pnl.cpp:707
+msgid "Copy data"
+msgstr "Копировать данные"
+
+#: src/exec_dat.cpp:1640
+msgid "Copy data from another variable"
+msgstr "Копировать данные из другой переменной"
+
+#: widgets/fltk.cpp:833
+msgid "Copy graphics"
+msgstr "Копировать рисунок"
+
+#: widgets/qt.cpp:1158 udav/plot_pnl.cpp:354
+msgid "Copy graphics to clipboard (Ctrl+Shift+G)."
+msgstr "Копировать рисунок в буфер обмена (Ctrl+Shift+G)."
+
+#: widgets/fltk.cpp:877
+msgid "Copy image to clipboard"
+msgstr "Копировать рисунок в буфер обмена"
+
+#: widgets/qt.cpp:1156 udav/plot_pnl.cpp:352
+msgid "Copy plot"
+msgstr "Копировать рисунок"
+
+#: udav/dat_pnl.cpp:709
+msgid "Copy range of numbers to clipboard (Ctrl+Shift+C)."
+msgstr "Копировать диапазон чисел в буфер обмена (Ctrl+Shift+C)."
+
+#: udav/text_pnl.cpp:535
+msgid "Copy selected text or data to clipboard (Ctrl+C)."
+msgstr "Копировать выделенный текст или данные в буфер обмена (Ctrl+C)."
+
+#: mgllab/editor.cpp:511
+msgid "Copy selection to clipboard"
+msgstr "Копировать выделение в буфер обмена"
+
+#: udav/text_pnl.cpp:533 mgllab/mgllab.cpp:310
+msgid "Copy text"
+msgstr "Копировать текст"
+
+#: mgllab/table.cpp:780
+msgid "Cos FFT"
+msgstr "Косинус-Фурье"
+
+#: udav/dat_pnl.cpp:621
+msgid "Cos-Fourier transform along direction(s)"
+msgstr "Косинус-Фурье преобразование вдоль направления(й)"
+
+#: src/exec_dat.cpp:1642
+msgid "Cos-Fourier transform at some direction"
+msgstr "Косинус-Фурье преобразование вдоль направления"
+
+#: mgllab/table.cpp:165
+msgid "Cosine FFT"
+msgstr "Косинус-Фурье"
+
+#: udav/text_pnl.cpp:365 udav/text_pnl.cpp:482
+msgid "Could not write to %1"
+msgstr "Не могу записать в %1"
+
+#: udav/setup_dlg.cpp:159
+msgid "Could not write to file"
+msgstr "Не могу записать в файл"
+
+#: udav/udav_wnd.cpp:570
+msgid "Couldn't change to folder "
+msgstr "Не могу сменить папку "
+
+#: udav/text_pnl.cpp:431
+msgid "Couldn't open file "
+msgstr "Не могу открыть файл "
+
+#: mgllab/dialogs.cpp:1190
+#, c-format
+msgid "Couldn't open file %s"
+msgstr "Не могу открыть файл %s"
+
+#: udav/newcmd_dlg.cpp:173
+msgid "Create data and I/O"
+msgstr "Создание данных и I/O"
+
+#: mgllab/dialogs.cpp:714
+msgid "Create data and IO"
+msgstr "Создание данных и ввод-вывод"
+
+#: src/exec_dat.cpp:1667
+msgid "Create histogram (distribution) of data values"
+msgstr "Создать гистограмму (распределение) значений данных"
+
+#: udav/dat_pnl.cpp:766 mgllab/table.cpp:760
+msgid "Create new"
+msgstr "Создать новый"
+
+#: src/exec_dat.cpp:1727
+msgid "Create new 1D data and fill it in range"
+msgstr "Создать новые 1d данные и заполнить их в диапазоне"
+
+#: src/exec_dat.cpp:1682
+msgid "Create new data"
+msgstr "Создать новый массив данных"
+
+#: udav/mem_pnl.cpp:58
+msgid "Create new data array"
+msgstr "Создать новый массив данных"
+
+#: mgllab/table.cpp:838
+msgid "Create new data with zero filling"
+msgstr "Создать новый массив данных, заполненный нулями"
+
+#: udav/udav_wnd.cpp:284
+msgid "Create new empty script window (Ctrl+N)."
+msgstr "Создать новое окно скрипта (Ctrl+N)."
+
+#: src/parser.cpp:1494
+msgid "Creates new variable from list of numbers or data"
+msgstr "Создать новый массив из списка значений или данных"
+
+#: udav/dat_pnl.cpp:784 mgllab/table.cpp:763
+msgid "Crop"
+msgstr "Обрезать"
+
+#: mgllab/table.cpp:860
+msgid "Crop (cut off edges) data"
+msgstr "Обрезать края массива данных"
+
+#: mgllab/table.cpp:607
+msgid "Crop data"
+msgstr "Обрезать данные"
+
+#: src/exec_dat.cpp:1643
+msgid "Crop edge of data"
+msgstr "Обрезать края массива данных"
+
+#: udav/dat_pnl.cpp:786
+msgid "Crop the data edges. Useful to cut off the zero-filled area."
+msgstr ""
+"Обрезать края массива данных. Полезно для удаления краев заполненных нулями."
+
+#: mgllab/table.cpp:163 mgllab/table.cpp:774
+msgid "CumSum"
+msgstr ""
+
+#: src/exec_dat.cpp:1644
+msgid "Cumulative summation along direction(s)"
+msgstr "Накопительное суммирование данных по направлению"
+
+#: udav/prop_dlg.cpp:106
+msgid "CurrLine"
+msgstr "Тек.строка"
+
+#: udav/prop_dlg.cpp:68
+msgid "Current font"
+msgstr "Текущий шрифт"
+
+#: udav/text_pnl.cpp:530
+msgid "Cut selected text to clipboard (Ctrl+X)."
+msgstr "Вырезать выбранный текст в буфер обмена (Ctrl+X)."
+
+#: udav/text_pnl.cpp:528 mgllab/mgllab.cpp:309
+msgid "Cut text"
+msgstr "Вырезать текст"
+
+#: udav/opt_dlg.cpp:61 mgllab/dialogs.cpp:106
+msgid "Cutting"
+msgstr "Обрезание"
+
+#: mgllab/help.cpp:251 mgllab/table.cpp:428 mgllab/table.cpp:457
+msgid ""
+"DAT Files \t*.{dat,csv}\n"
+"HDF Files \t*.{h5,hdf}"
+msgstr ""
+"DAT файлы \t*.{dat,csv}\n"
+"HDF файлы \t*.{h5,hdf}"
+
+#: mgllab/dialogs.cpp:1465
+msgid "Dash"
+msgstr "Пунктир"
+
+#: udav/style_dlg.cpp:62 mgllab/dialogs.cpp:318
+msgid "Dashing"
+msgstr "Штриховка"
+
+#: udav/dat_pnl.cpp:66
+msgid "Data"
+msgstr "Данные"
+
+#: udav/dat_pnl.cpp:249 udav/dat_pnl.cpp:271
+msgid ""
+"Data files (*.dat)\n"
+"HDF5 files (*.h5 *.hdf)\n"
+"PNG files (*.png)\n"
+"All files (*.*)"
+msgstr ""
+"DAT файлы (*.dat)\n"
+"HDF5 файлы (*.h5 *.hdf)\n"
+"PNG файлы (*.png)\n"
+"Все файлы (*.*)"
+
+#: udav/newcmd_dlg.cpp:175 mgllab/dialogs.cpp:716
+msgid "Data handling"
+msgstr "Изменение данных"
+
+#: mgllab/help.cpp:163 mgllab/table.cpp:851
+msgid "Data information and preview."
+msgstr "Информация и просмотр данных."
+
+#: udav/open_dlg.cpp:56 udav/data_dlg.cpp:42 mgllab/dialogs.cpp:566
+msgid "Data name"
+msgstr "Имя данных"
+
+#: udav/info_dlg.cpp:42
+msgid "Data preview"
+msgstr "Просмотр данных"
+
+#: udav/info_dlg.cpp:43
+msgid "Data preview for current slice."
+msgstr "Просмотр текущего среза данных."
+
+#: udav/newcmd_dlg.cpp:174 mgllab/dialogs.cpp:715
+msgid "Data transform"
+msgstr "Преобразование данных"
+
+#: udav/plot_pnl.cpp:556
+msgid "Decrease \\phi angle by 10 degrees."
+msgstr "Уменьшить угол φ на 10 градусов."
+
+#: udav/plot_pnl.cpp:548
+msgid "Decrease \\theta angle by 10 degrees."
+msgstr "Уменьшить угол θ на 10 градусов."
+
+#: mgllab/help.cpp:105
+msgid "Decrease font size"
+msgstr "Уменьшить размер шрифта"
+
+#: src/parser.cpp:1485
+msgid "Define constant or parameter"
+msgstr "Определит постоянную или параметр"
+
+#: src/parser.cpp:1484
+msgid "Define parameter as character"
+msgstr "Определить параметр как символ"
+
+#: src/parser.cpp:1486
+msgid "Define parameter as numerical value"
+msgstr "Определить параметр как значение выражения"
+
+#: src/parser.cpp:1479
+msgid "Define parameter from user input"
+msgstr "Определить параметр по вводу пользователя"
+
+#: udav/anim_dlg.cpp:76
+msgid "Delay (in ms)"
+msgstr "Задержка, мс"
+
+#: mgllab/mathgl.cpp:204
+msgid "Delay (in sec)"
+msgstr "Задержка, с"
+
+#: mgllab/help.cpp:178
+msgid "Delete @b all@. data arrays."
+msgstr "Удалить @b все@. массивы данных."
+
+#: udav/mem_pnl.cpp:64
+msgid "Delete ALL data arrays"
+msgstr "Удалить ВСЕ массивы данных"
+
+#: src/exec_dat.cpp:1647
+msgid "Delete data or slice of data"
+msgstr "Удалить данные или их срез"
+
+#: udav/plot_pnl.cpp:426
+msgid "Delete selected"
+msgstr "Удалить выбранное"
+
+#: udav/mem_pnl.cpp:60
+msgid "Delete selected data array"
+msgstr "Удалить выбранные данные"
+
+#: mgllab/help.cpp:166
+msgid "Delete selected data."
+msgstr "Удалить выбранные данные."
+
+#: udav/plot_pnl.cpp:428
+msgid "Delete selected plot."
+msgstr "Удалить выбранный график"
+
+#: mgllab/dialogs.cpp:734
+msgid "Description"
+msgstr "Описание"
+
+#: src/exec_dat.cpp:1648
+msgid "Detect curves for maximums of data array"
+msgstr "Найти кривые по максимумам массива данных"
+
+#: mgllab/table.cpp:164 mgllab/table.cpp:776
+msgid "Difference"
+msgstr "Дифференцировать"
+
+#: udav/dat_pnl.cpp:616
+msgid "Differentiate data along direction(s)"
+msgstr "Дифференцировать данные по направлению(ям)"
+
+#: udav/opt_dlg.cpp:58 mgllab/dialogs.cpp:113 mgllab/dialogs.cpp:1005
+msgid "Diffuse"
+msgstr "Расс.свет"
+
+#: src/exec_dat.cpp:1652
+msgid "Dilate data larger val"
+msgstr "Расширить данные большие val"
+
+#: src/exec_dat.cpp:1639
+msgid "Direct multiplication of arrays"
+msgstr "Прямое произведение массивов"
+
+#: udav/dat_pnl.cpp:351 udav/dat_pnl.cpp:377 udav/dat_pnl.cpp:424
+#: mgllab/dialogs.cpp:161 mgllab/table.cpp:549
+msgid "Direction"
+msgstr "Направление"
+
+#: mgllab/table.cpp:551
+msgid "Direction along which data will be filled"
+msgstr "Направление по которому данные будут заполняться"
+
+#: udav/subplot_dlg.cpp:105 udav/subplot_dlg.cpp:122
+msgid "Distance between cells"
+msgstr "Расстояние между ячейками"
+
+#: mgllab/table.cpp:799
+msgid "Divide by"
+msgstr "Разделить на"
+
+#: src/exec_dat.cpp:1653
+msgid "Divide by data or number"
+msgstr "Разделить данные поэлементно на массив или число"
+
+#: mgllab/table.cpp:180 mgllab/table.cpp:354 mgllab/table.cpp:677
+msgid "Do"
+msgstr "OK"
+
+#: src/exec_dat.cpp:1716
+msgid "Do STFA transform"
+msgstr "Выполнить преобразование STFA"
+
+#: src/exec_dat.cpp:1722 src/exec_dat.cpp:1723
+msgid "Do integral transform of data"
+msgstr "Выполнить интегральное преобразование данных"
+
+#: mgllab/table.cpp:102 mgllab/table.cpp:557 mgllab/table.cpp:620
+#: mgllab/table.cpp:676
+msgid "Do nothing and close this window"
+msgstr "Закрыть это окно ничего не выполняя"
+
+#: udav/mem_pnl.cpp:122
+msgid "Do you want to delete all data?"
+msgstr "Вы хотите удалить все данные?"
+
+#: udav/udav_wnd.cpp:341 udav/udav_wnd.cpp:580 udav/udav_wnd.cpp:622
+msgid "Do you want to save the changes to the document?"
+msgstr "Вы хотите сохранить изменения в документе?"
+
+#: mgllab/editor.cpp:282
+msgid "Don't Save"
+msgstr "Не сохранять"
+
+#: mgllab/table.cpp:164
+msgid "Double diff."
+msgstr "Вторая производная"
+
+#: src/exec_gr.cpp:1135
+msgid "Draw Bifurcation diagram"
+msgstr "Нарисовать бифуркационную диаграмму"
+
+#: src/exec_gr.cpp:1171
+msgid "Draw Iris plots"
+msgstr "Нарисовать график Iris"
+
+#: src/exec_gr.cpp:1173
+msgid "Draw Lamerey diagram"
+msgstr "Нарисовать диаграмму Ламерея"
+
+#: src/exec_gr.cpp:1177
+msgid "Draw Open-High-Low-Close (OHLC) diagram"
+msgstr "Нарисовать диаграмму OHLC (Open-High-Low-Close)"
+
+#: src/exec_gr.cpp:1180
+msgid "Draw Poincare map"
+msgstr "Нарисовать диаграмму Пуанкаре"
+
+#: src/exec_gr.cpp:1186
+msgid "Draw STFA diagram"
+msgstr "Нарисовать диаграмму STFA"
+
+#: src/exec_gr.cpp:1198
+msgid "Draw TeX mark at point position"
+msgstr "Нарисовать ТеХ символы в положении точек"
+
+#: src/exec_prm.cpp:615
+msgid "Draw angle arc"
+msgstr "Нарисовать дугу"
+
+#: src/exec_gr.cpp:1128
+msgid "Draw area plot for 1D data"
+msgstr "Закрасить область между кривой и осью"
+
+#: src/exec_gr.cpp:1131
+msgid "Draw bars for 1D data"
+msgstr "Нарисовать график из вертикальных полос"
+
+#: src/exec_gr.cpp:1133
+msgid "Draw belts"
+msgstr "Нарисовать поверхность ленточками"
+
+#: src/exec_gr.cpp:1134
+msgid "Draw belts colored by other data"
+msgstr "Нарисовать поверхность ленточками с заданным цветом"
+
+#: src/exec_gr.cpp:1196
+msgid "Draw binormales for 1D data"
+msgstr "Нарисовать нормаль и бинормаль для кривой"
+
+#: src/exec_prm.cpp:641
+msgid "Draw bitmap (logo) along axis range"
+msgstr "Нарисовать растр (логотип) в области осей координат"
+
+#: src/exec_prm.cpp:619
+msgid "Draw bounding box"
+msgstr "Нарисовать ограничивающий параллелепипед"
+
+#: src/exec_gr.cpp:1137
+msgid "Draw boxes"
+msgstr "Нарисовать поверхность ящиками"
+
+#: src/exec_gr.cpp:1136
+msgid "Draw boxplot for 2D data"
+msgstr "Нарисовать box-and-whisker диаграмму"
+
+#: src/exec_gr.cpp:1138
+msgid "Draw candlestick chart"
+msgstr "Нарисовать свечной график"
+
+#: src/exec_gr.cpp:1139
+msgid "Draw chart"
+msgstr "Нарисовать линейчатую (круговую) диаграмму"
+
+#: src/exec_prm.cpp:620
+msgid "Draw circle"
+msgstr "Нарисовать окружность (круг)"
+
+#: src/exec_gr.cpp:1140
+msgid "Draw cloud"
+msgstr "Нарисовать облако для 3D данных"
+
+#: src/exec_prm.cpp:621
+msgid "Draw colorbar"
+msgstr "Нарисовать цветовую шкалу"
+
+#: src/exec_prm.cpp:622
+msgid "Draw cone"
+msgstr "Нарисовать конус"
+
+#: src/exec_gr.cpp:1141
+msgid "Draw cones for 1D data"
+msgstr "Нарисовать конусы для 1D данных"
+
+#: src/exec_gr.cpp:1142
+msgid "Draw contour lines"
+msgstr "Нарисовать линии уровня"
+
+#: src/exec_gr.cpp:1152
+msgid "Draw contour lines at x-slice (or x-plane)"
+msgstr "Нарисовать линии уровня на x-срезе"
+
+#: src/exec_gr.cpp:1153
+msgid "Draw contour lines at y-slice (or y-plane)"
+msgstr "Нарисовать линии уровня на y-срезе"
+
+#: src/exec_gr.cpp:1154
+msgid "Draw contour lines at z-slice (or z-plane)"
+msgstr "Нарисовать линии уровня на z-срезе"
+
+#: src/exec_gr.cpp:1143
+msgid "Draw contour lines for 3D data"
+msgstr "Нарисовать линии уровня на срезах 3D данных"
+
+#: src/exec_gr.cpp:1203
+msgid "Draw contour lines for surface of triangles"
+msgstr "Нарисовать линии уровня для поверхности из треугольников"
+
+#: src/exec_gr.cpp:1150
+msgid "Draw contour lines on parametric surface"
+msgstr "Нарисовать линии уровня на параметрической поверхности"
+
+#: src/exec_gr.cpp:1151
+msgid "Draw contour tubes"
+msgstr "Нарисовать цилиндры по линиям уровней"
+
+#: src/exec_gr.cpp:1204
+msgid "Draw contour tubes for surface of triangles"
+msgstr "Нарисовать цилиндры по линиям уровней для поверхности из треугольников"
+
+#: src/exec_prm.cpp:623
+msgid "Draw curve"
+msgstr "Нарисовать кривую"
+
+#: src/exec_gr.cpp:1206
+msgid "Draw curve by tube"
+msgstr "Нарисовать трубу около кривой"
+
+#: src/exec_gr.cpp:1156
+msgid "Draw density plot"
+msgstr "Нарисовать график плотности"
+
+#: src/exec_gr.cpp:1157
+msgid "Draw density plot at slices of 3D data"
+msgstr "Нарисовать график плотности на срезе 3D данных"
+
+#: src/exec_gr.cpp:1158
+msgid "Draw density plot at x-slice (or x-plane)"
+msgstr "Нарисовать график плотности на x-срезе"
+
+#: src/exec_gr.cpp:1159
+msgid "Draw density plot at y-slice (or y-plane)"
+msgstr "Нарисовать график плотности на y-срезе"
+
+#: src/exec_gr.cpp:1160
+msgid "Draw density plot at z-slice (or z-plane)"
+msgstr "Нарисовать график плотности на z-срезе"
+
+#: src/exec_gr.cpp:1161
+msgid "Draw dew plot"
+msgstr "Нарисовать векторное поле каплями"
+
+#: src/exec_gr.cpp:1162
+msgid "Draw dots for arbitrary data points"
+msgstr "Нарисовать набор точек"
+
+#: src/exec_prm.cpp:624
+msgid "Draw drop"
+msgstr "Нарисовать каплю"
+
+#: src/exec_prm.cpp:625
+msgid "Draw ellipse"
+msgstr "Нарисовать эллипс"
+
+#: src/exec_prm.cpp:626
+msgid "Draw error box"
+msgstr "Нарисовать размер ошибки"
+
+#: src/exec_gr.cpp:1163
+msgid "Draw error boxes"
+msgstr "Нарисовать размеры ошибок для 1D данных"
+
+#: src/exec_prm.cpp:627
+msgid "Draw face (quadrangle)"
+msgstr "Нарисовать грань (четырехугольник)"
+
+#: src/exec_prm.cpp:628
+msgid "Draw face perpendicular to x-axis"
+msgstr "Нарисовать грань поперек оси x"
+
+#: src/exec_prm.cpp:629
+msgid "Draw face perpendicular to y-axis"
+msgstr "Нарисовать грань поперек оси y"
+
+#: src/exec_prm.cpp:630
+msgid "Draw face perpendicular to z-axis"
+msgstr "Нарисовать грань поперек оси z"
+
+#: src/exec_gr.cpp:1183
+msgid "Draw filled region (ribbon) between 2 curves"
+msgstr "Закрасить область между двумя кривыми"
+
+#: src/exec_gr.cpp:1178
+msgid "Draw flow pipes for vector field"
+msgstr "Нарисовать трубки тока для векторного поля"
+
+#: src/exec_gr.cpp:1165
+msgid "Draw flow threads for vector field"
+msgstr "Нарисовать линии тока для векторного поля"
+
+#: src/exec_gr.cpp:1167
+msgid "Draw flow threads from plain for vector field"
+msgstr "Нарисовать линии тока для векторного поля, начинающиеся с плоскости"
+
+#: src/exec_gr.cpp:1168
+msgid "Draw gradient lines for scalar field"
+msgstr "Нарисовать линии градиента для скалярного поля"
+
+#: src/exec_prm.cpp:635
+msgid "Draw grid"
+msgstr "Нарисовать сетку осей координат"
+
+#: src/exec_gr.cpp:1170
+msgid "Draw grid at slices of 3D data"
+msgstr "Нарисовать сетку на срезе 3D данных"
+
+#: src/exec_gr.cpp:1169
+msgid "Draw grid for data array(s)"
+msgstr "Нарисовать сетку для массива"
+
+#: src/exec_gr.cpp:1130
+msgid "Draw horizontal bars for 1D data"
+msgstr "Нарисовать график из горизонтальных полос"
+
+#: src/exec_gr.cpp:1199
+msgid "Draw horizontal tiles"
+msgstr "Нарисовать поверхность горизонтальными плитками"
+
+#: src/exec_gr.cpp:1200
+msgid "Draw horizontal tiles with variable size"
+msgstr "Нарисовать поверхность плитками переменного размера"
+
+#: src/exec_gr.cpp:1188
+msgid "Draw isosurface for 3D data"
+msgstr "Нарисовать поверхность постоянного уровня"
+
+#: src/exec_gr.cpp:1191
+msgid "Draw isosurface for 3D data colored and transpared by other data"
+msgstr "Нарисовать поверхность уровня с заданными цветом и прозрачностью"
+
+#: src/exec_gr.cpp:1190
+msgid "Draw isosurface for 3D data colored by other data"
+msgstr "Нарисовать поверхность уровня с заданным цветом"
+
+#: src/exec_gr.cpp:1189
+msgid "Draw isosurface for 3D data transpared by other data"
+msgstr "Нарисовать поверхность уровня с заданной прозрачностью"
+
+#: src/exec_gr.cpp:1172
+msgid "Draw label at arbitrary position"
+msgstr "Вывести надписи для 1D данных"
+
+#: src/exec_prm.cpp:649
+msgid "Draw label for t-axis"
+msgstr "Вывести подпись оси t"
+
+#: src/exec_prm.cpp:650
+msgid "Draw label for x-axis"
+msgstr "Вывести подпись оси x"
+
+#: src/exec_prm.cpp:651
+msgid "Draw label for y-axis"
+msgstr "Вывести подпись оси y"
+
+#: src/exec_prm.cpp:652
+msgid "Draw label for z-axis"
+msgstr "Вывести подпись оси z"
+
+#: src/exec_prm.cpp:639
+msgid "Draw legend"
+msgstr "Нарисовать легенду графика"
+
+#: src/exec_prm.cpp:640
+msgid "Draw line"
+msgstr "Нарисовать прямую линию"
+
+#: src/exec_gr.cpp:1174
+msgid "Draw mapping plot"
+msgstr "Нарисовать отображение матрицы"
+
+#: src/exec_gr.cpp:1175
+msgid "Draw mark plot for 1D data"
+msgstr "Нарисовать маркеры переменного размера"
+
+#: src/exec_gr.cpp:1176
+msgid "Draw mesh surface"
+msgstr "Нарисовать сетчатую поверхность"
+
+#: src/exec_prm.cpp:618
+msgid "Draw point (ball)"
+msgstr "Нарисовать точку"
+
+#: src/exec_prm.cpp:642
+msgid "Draw polygon"
+msgstr "Нарисовать полигон"
+
+#: src/exec_gr.cpp:1132
+msgid "Draw quasi-optical beam"
+msgstr "Нарисовать квазиоптический пучок"
+
+#: src/exec_gr.cpp:1182
+msgid "Draw radar chart"
+msgstr "Нарисовать круговой график"
+
+#: src/exec_gr.cpp:1155
+msgid "Draw reconstructed surface for arbitrary data points"
+msgstr "Нарисовать поверхность по произвольным точкам"
+
+#: src/exec_prm.cpp:643
+msgid "Draw rectangle"
+msgstr "Нарисовать прямоугольник"
+
+#: src/exec_prm.cpp:644
+msgid "Draw rhombus"
+msgstr "Нарисовать ромб"
+
+#: src/exec_gr.cpp:1147
+msgid "Draw solid contour lines at x-slice (or x-plane)"
+msgstr "Закрасить линии уровня на x-срезе"
+
+#: src/exec_gr.cpp:1148
+msgid "Draw solid contour lines at y-slice (or y-plane)"
+msgstr "Закрасить линии уровня на y-срезе"
+
+#: src/exec_gr.cpp:1149
+msgid "Draw solid contour lines at z-slice (or z-plane)"
+msgstr "Закрасить линии уровня на z-срезе"
+
+#: src/exec_gr.cpp:1146
+msgid "Draw solid contour lines for 3D data"
+msgstr "Закрасить линии уровня на 3D данных"
+
+#: src/exec_gr.cpp:1145
+msgid "Draw solid contours"
+msgstr "Закрасить линии уровня"
+
+#: src/exec_gr.cpp:1144
+msgid "Draw solid contours with manual colors"
+msgstr "Закрасить линии уровня заданными цветами"
+
+#: src/exec_gr.cpp:1187
+msgid "Draw solid surface"
+msgstr "Нарисовать поверхность"
+
+#: src/exec_gr.cpp:1194
+msgid "Draw solid surface colored and transpared by other data"
+msgstr "Нарисовать поверхность с заданными цветом и прозрачностью"
+
+#: src/exec_gr.cpp:1193
+msgid "Draw solid surface colored by other data"
+msgstr "Нарисовать поверхность с заданным цветом"
+
+#: src/exec_gr.cpp:1192
+msgid "Draw solid surface transpared by other data"
+msgstr "Нарисовать поверхность с заданной прозрачностью"
+
+#: src/exec_prm.cpp:645
+msgid "Draw sphere"
+msgstr "Нарисовать сферу"
+
+#: src/exec_gr.cpp:1184
+msgid "Draw stem plot for 1D data"
+msgstr "Нарисовать линии от 1D данных до оси"
+
+#: src/exec_gr.cpp:1185
+msgid "Draw step plot for 1D data"
+msgstr "Нарисовать ступеньки"
+
+#: src/exec_gr.cpp:1201
+msgid "Draw surface of curve rotation"
+msgstr "Нарисовать поверхность вращения"
+
+#: src/exec_gr.cpp:1181
+msgid "Draw surface of quadrangles"
+msgstr "Нарисовать поверхность из четырехугольников"
+
+#: src/exec_gr.cpp:1205
+msgid "Draw surface of triangles"
+msgstr "Нарисовать поверхность из треугольников"
+
+#: src/exec_gr.cpp:1129
+msgid "Draw surfaces of contour lines rotation"
+msgstr "Нарисовать поверхность вращения линий уровня"
+
+#: src/exec_gr.cpp:1195
+msgid "Draw table with data values"
+msgstr "Нарисовать таблицу значений данных"
+
+#: src/exec_gr.cpp:1197
+msgid "Draw tension plot for 1D data"
+msgstr "Нарисовать кривую с заданным цветом"
+
+#: src/exec_prm.cpp:647
+msgid "Draw text at some position or along curve"
+msgstr "Вывести текст в точке или вдоль кривой"
+
+#: src/exec_prm.cpp:646
+msgid "Draw user-defined symbol at given position and direction"
+msgstr "Нарисовать символ в заданных точке и направлении"
+
+#: src/exec_gr.cpp:1179
+msgid "Draw usual plot for 1D data"
+msgstr "Нарисовать кривую для 1D данных"
+
+#: src/exec_gr.cpp:1207
+msgid "Draw vector field"
+msgstr "Нарисовать векторное поле"
+
+#: src/exec_gr.cpp:1208
+msgid "Draw vector field at slices of 3D data"
+msgstr "Нарисовать векторное поле на срезах 3D данных"
+
+#: src/exec_gr.cpp:1202
+msgid "Draw vectors along a curve"
+msgstr "Нарисовать вектора вдоль кривой"
+
+#: src/exec_gr.cpp:1164
+msgid "Draw waterfalls"
+msgstr "Нарисовать поверхность набором линий (водопад)"
+
+#: udav/plot_pnl.cpp:111 udav/plot_pnl.cpp:130
+msgid "Drawing time %1 ms"
+msgstr "Время рисования %1 мс"
+
+#: udav/newcmd_dlg.cpp:169 mgllab/dialogs.cpp:710
+msgid "Dual plots"
+msgstr "Двойные графики"
+
+#. L
+#: udav/style_dlg.cpp:244 mgllab/dialogs.cpp:52
+msgid "E - darklawn"
+msgstr "E - темно-салатовый"
+
+#: mgllab/dialogs.cpp:1469
+msgid "Edges"
+msgstr "Края"
+
+#: udav/text_pnl.cpp:84 mgllab/mgllab.cpp:307
+msgid "Edit"
+msgstr "Правка"
+
+#: udav/mem_pnl.cpp:59
+msgid "Edit selected data array"
+msgstr "Редактировать выбранный массив данных"
+
+#: udav/calc_dlg.cpp:193
+msgid "Elliptic"
+msgstr "Эллиптические"
+
+#: udav/prop_dlg.cpp:171 mgllab/mgllab.cpp:489
+msgid "Enable keywords completion"
+msgstr "Разрешить дополнение команд"
+
+#. pure = new QCheckBox(_("Disable face drawing (faster) for mouse rotation/shift/zoom."), this);
+#. pure->setChecked(mglAutoPure);      v->addWidget(pure);     pure->setEnabled(false);
+#: udav/prop_dlg.cpp:169 mgllab/mgllab.cpp:491
+msgid "Enable mouse wheel for zooming"
+msgstr "Колесо мыши приближает график"
+
+#: mgllab/dialogs.cpp:1463
+msgid "End"
+msgstr "Конец"
+
+#: udav/prop_dlg.cpp:141
+msgid "English"
+msgstr "Английский"
+
+#. TODO show dialog for color scheme
+#: udav/dat_pnl.cpp:255 udav/dat_pnl.cpp:277 mgllab/table.cpp:477
+#: mgllab/table.cpp:490
+msgid "Enter color scheme"
+msgstr "Введите цветовую схему"
+
+#: udav/dat_pnl.cpp:261 udav/dat_pnl.cpp:283
+msgid "Enter data name"
+msgstr "Введите имя данных"
+
+#: mgllab/table.cpp:523
+msgid ""
+"Enter formula for data modification\n"
+"Here x, y, z in range [0,1], u is data value"
+msgstr ""
+"Введите формулу для изменения данных\n"
+"x, y, z в диапазоне [0,1], u - сами данные"
+
+#: udav/mem_pnl.cpp:85 mgllab/help.cpp:242
+msgid "Enter name for new variable"
+msgstr "Введите имя для нового массива"
+
+#. this is HDF file
+#. TODO add dialog with choice of HDF names
+#: mgllab/table.cpp:436
+msgid "Enter name of data"
+msgstr "Введите имя данных"
+
+#: udav/dat_pnl.cpp:388 udav/dat_pnl.cpp:402 udav/dat_pnl.cpp:436
+msgid "Enter new data sizes"
+msgstr "Введите новый размер данных"
+
+#: mgllab/table.cpp:28
+msgid "Enter number for addition to data values"
+msgstr "Введите число для добавления"
+
+#: mgllab/table.cpp:58
+msgid "Enter number for division of data values"
+msgstr "Введите число для делителя"
+
+#: mgllab/table.cpp:48
+msgid "Enter number for multiplication of data values"
+msgstr "Введите число для умножения"
+
+#: mgllab/table.cpp:38
+msgid "Enter number for subtraction from data values"
+msgstr "Введите число для вычитания"
+
+#: widgets/qt.cpp:949
+msgid "Enter number of vertexes"
+msgstr "Введите число вершин"
+
+#: udav/dat_pnl.cpp:351
+msgid "Enter range for data and direction of filling"
+msgstr "Введите диапазон и направление заполнения"
+
+#: udav/dat_pnl.cpp:366 udav/dat_pnl.cpp:377
+msgid "Enter range for final data"
+msgstr "Введите диапазон для выходных данных"
+
+#: udav/dat_pnl.cpp:424
+msgid "Enter range of saved date."
+msgstr "Введите диапазон сохраненных данных"
+
+#: udav/dat_pnl.cpp:485
+msgid "Enter slice id:"
+msgstr "Введите номер среза:"
+
+#: udav/dat_pnl.cpp:413
+msgid ""
+"Enter step of saved points. For example, '1' save all, '2' save each 2nd "
+"point, '3' save each 3rd and so on."
+msgstr ""
+"Введите шаг сохранения. Например, '1' - все точки, '2' - каждая вторая, и т."
+"д."
+
+#: widgets/qt.cpp:958
+msgid "Enter text"
+msgstr "Введите текст"
+
+#: mgllab/dialogs.cpp:860 mgllab/dialogs.cpp:866
+#, c-format
+msgid "Enter value for %s argument"
+msgstr "Введите значение аргумента %s"
+
+#: mgllab/table.cpp:166 mgllab/table.cpp:786
+msgid "Envelop"
+msgstr "Огибающая"
+
+#: src/exec_dat.cpp:1656
+msgid "Erode data larger val"
+msgstr "Сузить данные большие val"
+
+#: mgllab/editor.cpp:348
+#, c-format
+msgid ""
+"Error reading from file '%s':\n"
+"%s."
+msgstr ""
+"Ошибка чтения файла '%s':\n"
+"%s."
+
+#: src/export.cpp:629 src/export.cpp:638 src/export.cpp:645
+#, c-format
+msgid "Error to call external viewer\n"
+msgstr "Ошибка вызова внешнего просмотра\n"
+
+#: mgllab/editor.cpp:359
+#, c-format
+msgid ""
+"Error writing to file '%s':\n"
+"%s."
+msgstr ""
+"Ошибка записи в файл '%s':\n"
+"%s."
+
+#: src/exec_dat.cpp:1657
+msgid ""
+"Evaluate (interpolate) values of array Dat at points i=idat,j=jdat,k=kdat"
+msgstr "Интерполирует значения в точках i=idat,j=jdat,k=kdat"
+
+#. {"defpal",_("Define parameter as palette color"),"defpal $N val", 0, 6},
+#: src/parser.cpp:1488
+msgid "Execute if condition is false"
+msgstr "Выполнить если условие ложно"
+
+#: mgllab/mgllab.cpp:487
+msgid "Execute script after loading"
+msgstr "Выполнить скрипт после загрузки"
+
+#: widgets/qt.cpp:1145 udav/plot_pnl.cpp:333
+msgid "Execute script and redraw graphics (F5)."
+msgstr "Выполнить скрипт и обновить рисунок (F5)."
+
+#: src/parser.cpp:1481
+msgid "Execute script in external file"
+msgstr "Выполнить скрипт из внешнего файла"
+
+#: mgllab/help.cpp:146
+msgid "Existing data arrays"
+msgstr "Массивы данных"
+
+#: mgllab/mgllab.cpp:305
+msgid "Exit"
+msgstr "Выход"
+
+#: udav/calc_dlg.cpp:192
+msgid "Exp and log"
+msgstr "Exp и log"
+
+#: udav/calc_dlg.cpp:194
+msgid "Exp-integrals"
+msgstr "Exp-интегралы"
+
+#: mgllab/table.cpp:473
+msgid "Export Data?"
+msgstr "Экспорт данных?"
+
+#: widgets/fltk.cpp:811
+msgid "Export as ..."
+msgstr "Экспорт как ..."
+
+#: widgets/qt.cpp:1080 udav/plot_pnl.cpp:474
+msgid "Export as 2D ..."
+msgstr "Экспорт как 2D ..."
+
+#: widgets/qt.cpp:1089 udav/plot_pnl.cpp:484
+msgid "Export as 3D ..."
+msgstr "Экспорт как 3D ..."
+
+#: src/exec_dat.cpp:1658 mgllab/table.cpp:846
+msgid "Export data to PNG file"
+msgstr "Экспорт данных в PNG файл"
+
+#. fname = new QLineEdit(this);        a->addWidget(fname);
+#: udav/anim_dlg.cpp:82
+msgid "Export to GIF"
+msgstr "Экспорт в GIF"
+
+#: mgllab/table.cpp:754
+msgid "Export to PNG"
+msgstr "Экспорт в PNG"
+
+#: src/exec_dat.cpp:1659
+msgid "Extend data array"
+msgstr "Расширить массив данных"
+
+#: mgllab/table.cpp:343
+msgid "Extract data"
+msgstr "Выделить данные"
+
+#: src/exec_dat.cpp:1717
+msgid "Extract sub-array"
+msgstr "Выделить под-массив"
+
+#: src/exec_dat.cpp:1709
+msgid "Extract sub-array between values"
+msgstr "Выделить под-массив в диапазоне между значениями"
+
+#: mgllab/dialogs.cpp:962
+msgid "Factor"
+msgstr "Фактор"
+
+#. file menu
+#: widgets/qt.cpp:1079 udav/udav_wnd.cpp:281 udav/dat_pnl.cpp:681
+#: mgllab/mgllab.cpp:292 mgllab/table.cpp:750
+msgid "File"
+msgstr "Файл"
+
+#: udav/text_pnl.cpp:405 udav/text_pnl.cpp:489
+msgid "File %1 saved"
+msgstr "Файл %1 сохранен."
+
+#: mgllab/mgllab.cpp:242
+msgid "File exist. Overwrite it?"
+msgstr "Файл существует. Переписать?"
+
+#: udav/text_pnl.cpp:583
+msgid "File name"
+msgstr "Имя файла"
+
+#: mgllab/mgllab.cpp:318
+msgid "File path"
+msgstr "Путь к файлу"
+
+#: mgllab/dialogs.cpp:1073
+msgid "File to export"
+msgstr "Экспорт в файл"
+
+#: mgllab/editor.cpp:267 mgllab/mgllab.cpp:412
+msgid "File/Recent files"
+msgstr "Файл/Последние файлы"
+
+#: mgllab/table.cpp:767
+msgid "Fill"
+msgstr "Заполнить"
+
+#: udav/dat_pnl.cpp:611 mgllab/table.cpp:856
+msgid "Fill data by formula"
+msgstr "Заполнить по формуле"
+
+#: src/exec_dat.cpp:1665
+msgid "Fill data by global spline of Vdat"
+msgstr "Заполнить данные по глобальному сплайну Vdat"
+
+#: src/exec_dat.cpp:1701
+msgid "Fill data by interpolation of Vdat"
+msgstr "Заполнить данные интерполяцией Vdat"
+
+#: src/exec_dat.cpp:1645
+msgid "Fill data by triangulated values"
+msgstr "Заполнить данные триангуляцией"
+
+#: src/exec_dat.cpp:1660
+msgid "Fill data linearly in range [v1, v2]"
+msgstr "Заполнить данные линейно в диапазоне [v1, v2]"
+
+#: mgllab/table.cpp:578 mgllab/table.cpp:592
+msgid "Fill in range"
+msgstr "Заполнить в диапазоне"
+
+#: src/exec_dat.cpp:1661
+msgid "Fill x-,k-samples for transforms"
+msgstr "Заполнить как x-,k-координаты для трансформации"
+
+#: udav/find_dlg.cpp:48 mgllab/editor.cpp:559
+msgid "Find"
+msgstr "Найти"
+
+#: src/exec_dat.cpp:1641
+msgid "Find correlation between data arrays"
+msgstr "Найти корреляцию между данными"
+
+#: src/exec_dat.cpp:1655
+msgid "Find envelop for the data"
+msgstr "Найти огибающую данных"
+
+#: udav/dat_pnl.cpp:624
+msgid "Find envelope along direction(s)"
+msgstr "Найти огибающую в направлении"
+
+#: udav/dat_pnl.cpp:804
+msgid "Find histogram of data."
+msgstr "Найти гистограмму данных"
+
+#: src/exec_dat.cpp:1676
+msgid "Find maximal value over direction"
+msgstr "Найти максимум по направлению"
+
+#: src/exec_dat.cpp:1677
+msgid "Find minimal value over direction"
+msgstr "Найти минимум по направлению"
+
+#: udav/text_pnl.cpp:551 mgllab/mgllab.cpp:316
+msgid "Find next"
+msgstr "Найти следующее"
+
+#: mgllab/editor.cpp:515
+msgid "Find or replace text"
+msgstr "Найти или заменить"
+
+#: src/exec_dat.cpp:1713
+msgid "Find root Dat[i,j,k]=val (inverse evaluate)"
+msgstr "Найти корень Dat[i,j,k]=val (обратно evaluate)"
+
+#: src/exec_dat.cpp:1705
+msgid "Find roots using data as initial values"
+msgstr "Найти корни используя данные как начальные условия"
+
+#: src/exec_dat.cpp:1719
+msgid "Find summation over direction"
+msgstr "Найти сумму по направлению"
+
+#: src/exec_dat.cpp:1725
+msgid "Find triangles of randomly placed points"
+msgstr "Триангулировать произвольно расположенные точки"
+
+#: udav/find_dlg.cpp:36 mgllab/editor.cpp:558
+msgid "Find what:"
+msgstr "Найти что:"
+
+#: udav/text_pnl.cpp:546 mgllab/editor.cpp:557
+msgid "Find/Replace"
+msgstr "Найти/Заменить"
+
+#: mgllab/mgllab.cpp:315
+msgid "Find|Replace"
+msgstr "Найти|Заменить"
+
+#: src/parser.cpp:1490
+msgid "Finish if/else block"
+msgstr "Окончание блока if/else"
+
+#: mgllab/table.cpp:806
+msgid "First cell"
+msgstr "Первая ячейка"
+
+#: udav/dat_pnl.cpp:721 mgllab/table.cpp:802
+msgid "First slice"
+msgstr "Первый срез"
+
+#: src/exec_dat.cpp:1662 src/exec_dat.cpp:1663
+msgid "Fit data to formula"
+msgstr "Подогнать данные по формуле"
+
+#: udav/text_pnl.cpp:567 mgllab/mgllab.cpp:322
+msgid "Fitted formula"
+msgstr "Подобранная формула"
+
+#: udav/prop_dlg.cpp:103
+msgid "FlowKey"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1009
+msgid "Fog"
+msgstr "Туман"
+
+#: mgllab/dialogs.cpp:1010
+msgid "Fog dist."
+msgstr "глубина"
+
+#: mgllab/mgllab.cpp:548
+msgid "Folder for help files"
+msgstr "Папка для файлов справки"
+
+#: udav/text_pnl.cpp:587 mgllab/mgllab.cpp:319
+msgid "Folder path"
+msgstr "Путь к папке"
+
+#: udav/setup_dlg.cpp:105 mgllab/dialogs.cpp:1007
+msgid "Font"
+msgstr "Шрифт"
+
+#: mgllab/mgllab.cpp:539
+msgid "Font file name"
+msgstr "Имя файла шрифта"
+
+#: udav/prop_dlg.cpp:199
+msgid "Font files (*.vfm)"
+msgstr "Файлы шрифтов (*.vfm)"
+
+#: mgllab/mgllab.cpp:478
+msgid "Font kind"
+msgstr "Шрифт"
+
+#: mgllab/mgllab.cpp:480
+msgid "Font size"
+msgstr "Размер"
+
+#: udav/style_dlg.cpp:183
+msgid "Font style"
+msgstr "Шрифт"
+
+#: udav/setup_dlg.cpp:107
+msgid "FontSize"
+msgstr "Размер"
+
+#: src/parser.cpp:1491
+msgid "For loop"
+msgstr "Цикл for"
+
+#: udav/help_pnl.cpp:52
+msgid "Forward"
+msgstr "Вперед"
+
+#: udav/plot_pnl.cpp:192
+msgid "Frame %1 of %2"
+msgstr "Кадр %1 из %2"
+
+#: udav/dat_pnl.cpp:351 udav/dat_pnl.cpp:366 udav/dat_pnl.cpp:377
+#: udav/dat_pnl.cpp:424 udav/dat_pnl.cpp:452 mgllab/table.cpp:608
+msgid "From"
+msgstr "от"
+
+#: mgllab/mgllab.cpp:607
+msgid "Function"
+msgstr "Функция"
+
+#. B
+#: udav/style_dlg.cpp:238 mgllab/dialogs.cpp:46
+msgid "G - green"
+msgstr "G - зеленый"
+
+#: src/export.cpp:306 src/export.cpp:375 src/export.cpp:388
+msgid "GIF support was disabled. Please, enable it and rebuild MathGL."
+msgstr "GIF поддержка отключена. Включите ее и пересоберите MathGL."
+
+#: udav/newcmd_dlg.cpp:178 udav/setup_dlg.cpp:112 mgllab/dialogs.cpp:719
+#: mgllab/dialogs.cpp:1001
+msgid "General setup"
+msgstr "Общие настройки"
+
+#: src/exec_dat.cpp:1673
+msgid "Get Jacobian"
+msgstr "Вычислить якобиан"
+
+#: src/exec_dat.cpp:1638
+msgid "Get data column filled by formula on column ids"
+msgstr "Вычислить данные по формуле из имен колонок"
+
+#: src/exec_dat.cpp:1708
+msgid "Get formated data from file"
+msgstr "Загрузить форматированные данные из файла"
+
+#: src/exec_dat.cpp:1680
+msgid "Get momentum along direction"
+msgstr "Вычислить момент по направлению"
+
+#: src/exec_dat.cpp:1690
+msgid "Get pulse properties"
+msgstr "Найти параметры импульса"
+
+#: src/exec_dat.cpp:1721
+msgid "Get trace of array"
+msgstr "Найти след матрицы"
+
+#: src/base_cf.cpp:85
+#, c-format
+msgid "Global message - %s\n"
+msgstr "Общее сообщение - %s\n"
+
+#: udav/dat_pnl.cpp:723 mgllab/table.cpp:867
+msgid "Go to first slice for 3D data (Ctrl-F1)."
+msgstr "Перейти к первому срезу 3D данных (Ctrl-F1)"
+
+#: udav/dat_pnl.cpp:753 mgllab/table.cpp:871
+msgid "Go to last slice for 3D data (Ctrl-F4)."
+msgstr "Перейти к последнему срезу 3D данных (Ctrl-F1)"
+
+#: udav/dat_pnl.cpp:740
+msgid "Go to slice"
+msgstr "Перейти к срезу"
+
+#: udav/dat_pnl.cpp:747
+msgid "Go to the next slice for 3D data."
+msgstr "Перейти к следующему срезу 3D данных"
+
+#: udav/dat_pnl.cpp:729
+msgid "Go to the previous slice for 3D data."
+msgstr "Перейти к предыдущему срезу 3D данных"
+
+#: udav/dat_pnl.cpp:735 udav/dat_pnl.cpp:742
+msgid "Go to the specified slice for 3D data."
+msgstr "Перейти к указанному срезу 3D данных"
+
+#: widgets/qt.cpp:1108 widgets/qt.cpp:1110 udav/plot_pnl.cpp:66
+#: mgllab/mgllab.cpp:334
+msgid "Graphics"
+msgstr "Графика"
+
+#: udav/text_pnl.cpp:596
+msgid "Graphics setup"
+msgstr "Настройка графика"
+
+#: widgets/fltk.cpp:960
+msgid "Graphics/Adjust size"
+msgstr "Графика/Подогнать размер"
+
+#. /< Parameter for handling animation
+#. /< Callback function for next frame
+#. /< Callback function for prev frame
+#. /< Callback function for delay
+#. /< Callback function for reloading
+#. / Toggle transparency (alpha) button
+#: widgets/fltk.cpp:954 include/mgl2/Fl_MathGL.h:164
+msgid "Graphics/Alpha"
+msgstr "Графика/Прозрачность"
+
+#: widgets/fltk.cpp:989
+msgid "Graphics/Animation/Next frame"
+msgstr "Графика/Анимация/Следующий"
+
+#: widgets/fltk.cpp:990
+msgid "Graphics/Animation/Prev frame"
+msgstr "Графика/Анимация/Предыдущий"
+
+#: mgllab/mgllab.cpp:386
+msgid "Graphics/Animation/Setup animation"
+msgstr "Графика/Анимация/Настройка"
+
+#. / Toggle slideshow button
+#: widgets/fltk.cpp:988 include/mgl2/Fl_MathGL.h:168
+msgid "Graphics/Animation/Slideshow"
+msgstr "Графика/Анимация/Запустить"
+
+#: widgets/fltk.cpp:964
+msgid "Graphics/Copy click coor."
+msgstr "Графика/Копировать коор."
+
+#: widgets/fltk.cpp:963
+msgid "Graphics/Copy graphics"
+msgstr "Графика/Копировать рисунок"
+
+#: widgets/fltk.cpp:977
+msgid "Graphics/Export/as BMP"
+msgstr "Графика/Экспорт/как BMP"
+
+#: widgets/fltk.cpp:975
+msgid "Graphics/Export/as GIF"
+msgstr "Графика/Экспорт/как GIF"
+
+#: widgets/fltk.cpp:972
+msgid "Graphics/Export/as JPEG"
+msgstr "Графика/Экспорт/как JPEG"
+
+#: widgets/fltk.cpp:983
+msgid "Graphics/Export/as OBJ"
+msgstr "Графика/Экспорт/как OBJ"
+
+#: widgets/fltk.cpp:984
+msgid "Graphics/Export/as OFF"
+msgstr "Графика/Экспорт/как OFF"
+
+#: widgets/fltk.cpp:968
+msgid "Graphics/Export/as PNG"
+msgstr "Графика/Экспорт/как PNG"
+
+#: widgets/fltk.cpp:982
+msgid "Graphics/Export/as PRC"
+msgstr "Графика/Экспорт/как PRC"
+
+#: widgets/fltk.cpp:985
+msgid "Graphics/Export/as STL"
+msgstr "Графика/Экспорт/как STL"
+
+#: widgets/fltk.cpp:978
+msgid "Graphics/Export/as SVG"
+msgstr "Графика/Экспорт/как SVG"
+
+#: widgets/fltk.cpp:981
+msgid "Graphics/Export/as TeX"
+msgstr "Графика/Экспорт/как TeX"
+
+#: widgets/fltk.cpp:986
+msgid "Graphics/Export/as XYZ"
+msgstr "Графика/Экспорт/как XYZ"
+
+#: widgets/fltk.cpp:980
+msgid "Graphics/Export/as bitmap EPS"
+msgstr "Графика/Экспорт/как растровый EPS"
+
+#: widgets/fltk.cpp:969
+msgid "Graphics/Export/as solid PNG"
+msgstr "Графика/Экспорт/как PNG с заливкой"
+
+#: widgets/fltk.cpp:979
+msgid "Graphics/Export/as vector EPS"
+msgstr "Графика/Экспорт/как EPS"
+
+#. / Toggle grid drawing button
+#: widgets/fltk.cpp:956 include/mgl2/Fl_MathGL.h:170
+msgid "Graphics/Grid"
+msgstr "Графика/Сетка"
+
+#. / Toggle lighting button
+#: widgets/fltk.cpp:955 include/mgl2/Fl_MathGL.h:166
+msgid "Graphics/Light"
+msgstr "Графика/Освещение"
+
+#. / Toggle pause calculation button
+#: widgets/fltk.cpp:965 include/mgl2/Fl_MathGL.h:182 mgllab/mgllab.cpp:387
+msgid "Graphics/Pause calc"
+msgstr "Графика/Пауза расчета"
+
+#: mgllab/mgllab.cpp:385
+msgid "Graphics/Primitive"
+msgstr "Графика/Примитивы"
+
+#: widgets/fltk.cpp:959
+msgid "Graphics/Redraw"
+msgstr "Графика/Перерисовать"
+
+#: widgets/fltk.cpp:961
+msgid "Graphics/Reload data"
+msgstr "Графика/Перезагрузить"
+
+#: widgets/fltk.cpp:958
+msgid "Graphics/Restore"
+msgstr "Графика/Восстановить"
+
+#: widgets/fltk.cpp:962
+msgid "Graphics/Stop"
+msgstr "Графика/Стоп"
+
+#: widgets/fltk.cpp:996
+msgid "Graphics/Transform/Move down"
+msgstr "Графика/Сдвиг/Вниз"
+
+#: widgets/fltk.cpp:992
+msgid "Graphics/Transform/Move left"
+msgstr "Графика/Сдвиг/Влево"
+
+#: widgets/fltk.cpp:997
+msgid "Graphics/Transform/Move right"
+msgstr "Графика/Сдвиг/Вправо"
+
+#: widgets/fltk.cpp:993
+msgid "Graphics/Transform/Move up"
+msgstr "Графика/Сдвиг/Вверх"
+
+#: widgets/fltk.cpp:994
+msgid "Graphics/Transform/Zoom in"
+msgstr "Графика/Сдвиг/Приблизить"
+
+#: widgets/fltk.cpp:995
+msgid "Graphics/Transform/Zoom out"
+msgstr "Графика/Сдвиг/Отдалить"
+
+#: udav/plot_pnl.cpp:304
+msgid "Grid"
+msgstr "Сетка"
+
+#: udav/newcmd_dlg.cpp:50 mgllab/dialogs.cpp:705
+msgid "Groups of MGL commands"
+msgstr "Группы команд MGL"
+
+#. P
+#: udav/style_dlg.cpp:249 mgllab/dialogs.cpp:57
+msgid "H - darkgray"
+msgstr "H - темно-серый"
+
+#: src/data_io.cpp:1092
+msgid "HDF4 support was disabled. Please, enable it and rebuild MathGL."
+msgstr "HDF4 поддержка отключена. Включите ее и пересоберите MathGL."
+
+#: src/complex_io.cpp:925 src/complex_io.cpp:927 src/data_io.cpp:1191
+#: src/data_io.cpp:1193 src/data_io.cpp:1195 src/data_io.cpp:1197
+msgid "HDF5 support was disabled. Please, enable it and rebuild MathGL."
+msgstr "HDF5 поддержка отключена. Включите ее и пересоберите MathGL."
+
+#: mgllab/table.cpp:165 mgllab/table.cpp:781
+msgid "Hankel"
+msgstr "Ханкель"
+
+#: udav/dat_pnl.cpp:622
+msgid "Hankel transform along direction(s)"
+msgstr "Преобразование Ханкеля по направлению(ям)"
+
+#: src/exec_dat.cpp:1666
+msgid "Hankel transform at some direction"
+msgstr "Преобразование Ханкеля по направлению"
+
+#: udav/subplot_dlg.cpp:84
+msgid "Height of selected cells"
+msgstr "Высота выбранных ячеек"
+
+#: widgets/qt.cpp:1289 udav/help_pnl.cpp:57 udav/udav_wnd.cpp:231
+#: udav/udav_wnd.cpp:323 mgllab/mgllab.cpp:344 mgllab/mgllab.cpp:345
+#: mgllab/mgllab.cpp:373
+msgid "Help"
+msgstr "Справка"
+
+#: udav/newcmd_dlg.cpp:73
+msgid ""
+"Here you can specify command options.\n"
+"Options are used for additional plot tunning."
+msgstr ""
+"Здесь можно задать опции команды, \n"
+"которые используются для доп.настройки графика."
+
+#: udav/udav_wnd.cpp:186 mgllab/mgllab.cpp:313
+msgid "Hidden plots"
+msgstr "Скрытые графики"
+
+#: udav/plot_pnl.cpp:431
+msgid "Hide selected"
+msgstr "Скрыть выделенное"
+
+#: udav/plot_pnl.cpp:433
+msgid "Hide selected plots."
+msgstr "Скрыть выделенные графики"
+
+#: udav/prop_dlg.cpp:173 mgllab/mgllab.cpp:490
+msgid "Highlight current object(s)"
+msgstr "Выделить текущие графики"
+
+#: udav/udav_wnd.cpp:328 mgllab/mgllab.cpp:346
+msgid "Hints"
+msgstr "Подсказки"
+
+#: udav/dat_pnl.cpp:802
+msgid "Histogram (Ctrl+Shift+H)"
+msgstr "Гистограмма (Ctrl+Shift+H)"
+
+#: udav/subplot_dlg.cpp:51 udav/subplot_dlg.cpp:68 udav/subplot_dlg.cpp:93
+msgid "Horizontal size"
+msgstr "Горизонтальный размер"
+
+#: udav/calc_dlg.cpp:192
+msgid "Hyperbolic"
+msgstr "Гиперболические"
+
+#: udav/setup_dlg.cpp:116
+msgid "ID"
+msgstr ""
+
+#: mgllab/mgllab.cpp:348
+msgid "Icon list"
+msgstr "Список иконок"
+
+#: mgllab/table.cpp:869
+msgid "Id of slice on third (z-) dimension"
+msgstr "Номер среза в z-направлении"
+
+#: udav/prop_dlg.cpp:154
+msgid "Image size"
+msgstr "Размер рисунка"
+
+#: src/exec_dat.cpp:1689
+msgid "Immediately display the progress of calculation"
+msgstr "Показать прогресс вычислений сразу"
+
+#: src/exec_dat.cpp:1688
+msgid "Immediately print the message"
+msgstr "Напечатать это сообщение сразу же"
+
+#: mgllab/table.cpp:485
+msgid "Import Data?"
+msgstr "Импортировать данные?"
+
+#: src/exec_dat.cpp:1669 mgllab/table.cpp:842
+msgid "Import data from PNG file"
+msgstr "Импортировать данные из PNG файла"
+
+#: mgllab/table.cpp:752
+msgid "Import from PNG"
+msgstr "Импортировать из PNG"
+
+#: mgllab/table.cpp:769
+msgid "In range"
+msgstr "В диапазоне"
+
+#: src/exec_dat.cpp:1664
+msgid "In-place Fourier transform"
+msgstr "Фурье преобразование по месту"
+
+#: mgllab/mathgl.cpp:247
+msgid "Incompatible loop parameters!"
+msgstr "Неверные параметры цикла!"
+
+#: mgllab/table.cpp:503
+msgid "Incorrect type of base data"
+msgstr "Неверный тип данных"
+
+#: udav/plot_pnl.cpp:552
+msgid "Increase \\phi angle by 10 degrees."
+msgstr "Увеличить угол φ на 10 градусов"
+
+#: udav/plot_pnl.cpp:544
+msgid "Increase \\theta angle by 10 degrees."
+msgstr "Увеличить угол θ на 10 градусов"
+
+#: mgllab/help.cpp:103
+msgid "Increase font size"
+msgstr "Увеличить размер шрифта"
+
+#: udav/udav_wnd.cpp:229
+msgid "Info"
+msgstr "Инфо"
+
+#: udav/info_dlg.cpp:55 mgllab/help.cpp:354
+msgid "Information"
+msgstr "Информация"
+
+#: mgllab/mgllab.cpp:321
+msgid "Inplot"
+msgstr "Под-график"
+
+#. insert menu
+#: udav/text_pnl.cpp:557 mgllab/mgllab.cpp:317
+msgid "Insert"
+msgstr "Вставить"
+
+#: mgllab/editor.cpp:518
+msgid "Insert MGL command"
+msgstr "Вставить команду MGL"
+
+#: mgllab/table.cpp:755
+msgid "Insert as 'list'"
+msgstr "Вставить как 'list'"
+
+#: mgllab/editor.cpp:486
+msgid "Insert file content?"
+msgstr "Вставить содержимое файла?"
+
+#: mgllab/mgllab.cpp:158
+msgid "Insert file name?"
+msgstr "Вставить имя файла?"
+
+#: mgllab/editor.cpp:520
+msgid "Insert filename"
+msgstr "Вставить имя файла"
+
+#: mgllab/editor.cpp:522
+msgid "Insert inplot command"
+msgstr "Вставить под-график"
+
+#: udav/text_pnl.cpp:569
+msgid "Insert last fitted formula with found coefficients."
+msgstr "Вставить последнюю подогнанную формулу с найденными коэффициентами"
+
+#: src/exec_dat.cpp:1671
+msgid "Insert slice of data"
+msgstr "Вставить срез данных"
+
+#: mgllab/table.cpp:849
+msgid "Insert to script as 'list' command"
+msgstr "Вставить в скрипт как команду 'list'"
+
+#: mgllab/table.cpp:163 mgllab/table.cpp:775
+msgid "Integrate"
+msgstr "Интегрировать"
+
+#: src/exec_dat.cpp:1672 udav/dat_pnl.cpp:615
+msgid "Integrate data along direction(s)"
+msgstr "Интегрировать данные по направлению"
+
+#: mgllab/dialogs.cpp:114
+msgid "Intensity of diffuse light"
+msgstr "Интенсивность рассеянного света"
+
+#: udav/style_dlg.cpp:158 mgllab/dialogs.cpp:369
+msgid "Italic style"
+msgstr "Курсив"
+
+#: widgets/qt.cpp:1083 udav/plot_pnl.cpp:477
+msgid "JPEG"
+msgstr ""
+
+#: src/data_png.cpp:157 src/export.cpp:192
+msgid "JPEG support was disabled. Please, enable it and rebuild MathGL."
+msgstr "JPEG поддержка отключена. Включите ее и пересоберите MathGL."
+
+#: udav/calc_dlg.cpp:193
+msgid "Jacobi"
+msgstr "Якоби"
+
+#: src/exec_dat.cpp:1674
+msgid "Join data arrays"
+msgstr "Объединить массивы данных"
+
+#: mgllab/dialogs.cpp:1075
+msgid "Keep empty to put at beginning of main script."
+msgstr "Оставьте пустым для добавления в начало скрипта."
+
+#: udav/dat_pnl.cpp:780
+msgid "Keep only each n-th element of the data array."
+msgstr "Сохранить каждый n-ый элемент массива данных"
+
+#: mgllab/mathgl.cpp:200
+msgid "Keep slides in memory (faster animation but require more memory)"
+msgstr "Хранить кадры в памяти (быстрее анимация, но требуется больше памяти)"
+
+#: udav/prop_dlg.cpp:88
+msgid "Keywords"
+msgstr "Ключевые слова"
+
+#: mgllab/dialogs.cpp:354 mgllab/dialogs.cpp:704 mgllab/dialogs.cpp:1457
+msgid "Kind"
+msgstr "Тип"
+
+#: udav/newcmd_dlg.cpp:58
+msgid ""
+"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."
+msgstr ""
+"Вариант аргументов команды. Обозначения:\n"
+" * Заглавные  -- данные (например, Ydat);\n"
+" * В кавычках '' -- строки (например, 'fmt');\n"
+" * Прочие -- числа (например, zval);\n"
+" * В скобках [] -- опциональные аргументы."
+
+#: udav/info_dlg.cpp:50
+msgid "Kind of plots: lines for 1D, density for 2D."
+msgstr "Тип графика: кривые для 1D, график плотности для 2D."
+
+#. Y
+#: udav/style_dlg.cpp:243 mgllab/dialogs.cpp:51
+msgid "L - seagreen"
+msgstr "L - морской волны"
+
+#: widgets/qt.cpp:1087 udav/plot_pnl.cpp:481
+msgid "LaTeX"
+msgstr "LaTeX"
+
+#: udav/setup_dlg.cpp:66 mgllab/dialogs.cpp:954
+msgid "Label"
+msgstr "Надпись"
+
+#: udav/prop_dlg.cpp:139
+msgid "Language for UDAV"
+msgstr "Язык для UDAV"
+
+#: mgllab/mgllab.cpp:493
+msgid "Language for mgllab"
+msgstr "Язык для mgllab"
+
+#: udav/dat_pnl.cpp:617
+msgid "Laplace transform along direction(s)"
+msgstr "Преобразование Лапласа"
+
+#: mgllab/table.cpp:777
+msgid "Laplacian"
+msgstr "Лапласиан"
+
+#: udav/dat_pnl.cpp:751 mgllab/table.cpp:805
+msgid "Last slice"
+msgstr "Последний срез"
+
+#: udav/subplot_dlg.cpp:144
+msgid "Left bottom edge"
+msgstr "Левый нижний угол"
+
+#: udav/subplot_dlg.cpp:152
+msgid "Left top edge"
+msgstr "Левый верхний угол"
+
+#: udav/opt_dlg.cpp:74 mgllab/dialogs.cpp:118
+msgid "Legend"
+msgstr "Легенда"
+
+#: widgets/qt.cpp:1117 udav/opt_dlg.cpp:64 udav/setup_dlg.cpp:110
+#: udav/plot_pnl.cpp:297 mgllab/dialogs.cpp:115
+msgid "Light"
+msgstr "Свет"
+
+#: udav/setup_dlg.cpp:190
+msgid "Light position should be filled. Ignore it."
+msgstr "Положение источника света должно быть заполнено."
+
+#: udav/setup_dlg.cpp:136 mgllab/dialogs.cpp:1053
+msgid "Light settings"
+msgstr "Настройки освещения"
+
+#: src/exec_dat.cpp:1675
+msgid "Limit data to be inside [-v,v]"
+msgstr "Ограничить данные диапазоном [-v,v]"
+
+#: udav/style_dlg.cpp:99 mgllab/dialogs.cpp:314
+msgid "Line style"
+msgstr "Стиль линии"
+
+#: udav/style_dlg.cpp:78
+msgid "Line width"
+msgstr "Толщина линии"
+
+#: mgllab/table.cpp:167
+msgid "Linear *3"
+msgstr "Линейно *3"
+
+#: mgllab/table.cpp:167
+msgid "Linear *5"
+msgstr "Линейно *5"
+
+#: mgllab/help.cpp:156
+msgid "List of available data."
+msgstr "Список доступных данных."
+
+#: mgllab/table.cpp:427
+msgid "Load Data?"
+msgstr "Загрузить данные?"
+
+#: src/exec_set.cpp:804
+msgid "Load commands from external DLL"
+msgstr "Загрузить команды из внешней DLL"
+
+#: udav/dat_pnl.cpp:682
+msgid "Load data"
+msgstr "Загрузить данные"
+
+#: mgllab/table.cpp:840
+msgid "Load data from file"
+msgstr "Загрузить данные из файла"
+
+#: udav/dat_pnl.cpp:684
+msgid ""
+"Load data from file. Data will be deleted only\n"
+"at exit but UDAV will not ask to save it (Ctrl+Shift+O)."
+msgstr ""
+"Загрузить данные. Данные будут удалены только\n"
+"при выходе из программы без запроса на сохранение (Ctrl+Shift+O)."
+
+#: src/exec_set.cpp:805
+msgid "Load fontfaces"
+msgstr "Загрузить шрифт"
+
+#: mgllab/table.cpp:751
+msgid "Load from file"
+msgstr "Загрузить из файла"
+
+#: src/exec_prm.cpp:617
+msgid "Load image for background"
+msgstr "Загрузить фоновое изображение"
+
+#: udav/prop_dlg.cpp:163
+msgid "Load script to new window"
+msgstr "Загрузить скрипт в новое окно"
+
+#: udav/text_pnl.cpp:467
+msgid "Loaded document "
+msgstr "Загруженные документы "
+
+#: udav/text_pnl.cpp:325
+msgid "Loaded document %1"
+msgstr "Загруженные документы %1"
+
+#: udav/udav_wnd.cpp:638
+msgid "Loading aborted"
+msgstr "Загрузка отменена"
+
+#: mgllab/dialogs.cpp:98
+msgid "Low border for determining color or alpha"
+msgstr "Нижняя граница для цвета или прозрачности"
+
+#. C
+#: udav/style_dlg.cpp:241 mgllab/dialogs.cpp:49
+msgid "M - purple"
+msgstr "M - пурпурный"
+
+#: src/parser.cpp:1074
+msgid "MGL Parser"
+msgstr "MGL парсер"
+
+#: udav/newcmd_dlg.cpp:53 mgllab/dialogs.cpp:725
+msgid "MGL commands for selected group"
+msgstr "Команда MGL для выбранной группы"
+
+#: mgllab/mgllab.cpp:229
+msgid "MGL files \t*.mgl"
+msgstr "MGL файлы \t*.mgl"
+
+#: mgllab/mgllab.cpp:182
+msgid ""
+"MGL files \t*.mgl\n"
+"DAT files \t*.{dat,csv}"
+msgstr ""
+"MGL файлы \t*.mgl\n"
+"DAT файлы \t*.{dat,csv}"
+
+#: udav/open_dlg.cpp:102
+msgid "MGL files (*.mgl)"
+msgstr "MGL файлы (*.mgl)"
+
+#: udav/udav_wnd.cpp:324
+msgid "MGL help"
+msgstr "Справка MGL"
+
+#: mgllab/mathgl.cpp:397
+msgid "MGL messages"
+msgstr "Сообщение MGL"
+
+#: mgllab/help.cpp:101
+msgid "MGL samples and hints"
+msgstr "Примеры и подсказки"
+
+#: udav/udav_wnd.cpp:670
+msgid ""
+"MGL scripts (*.mgl)\n"
+"HDF5 files (*.hdf *.h5)\n"
+"All files (*.*)"
+msgstr ""
+"MGL файлы (*.mgl)\n"
+"HDF5 файлы (*.hdf *.h5)\n"
+"Все файлы (*.*)"
+
+#: udav/udav_wnd.cpp:635
+msgid ""
+"MGL scripts (*.mgl)\n"
+"HDF5 files (*.hdf *.h5)\n"
+"Text files (*.txt)\n"
+"Data files (*.dat)\n"
+"All files (*.*)"
+msgstr ""
+"MGL файлы (*.mgl)\n"
+"HDF5 файлы (*.hdf *.h5)\n"
+"Text файлы (*.txt)\n"
+"Data файлы (*.dat)\n"
+"Все файлы (*.*)"
+
+#: widgets/qt.cpp:1090 udav/plot_pnl.cpp:485
+msgid "MGLD"
+msgstr ""
+
+#: udav/dat_pnl.cpp:798
+msgid "Make another data."
+msgstr "Создание новых данных"
+
+#: udav/dat_pnl.cpp:796
+msgid "Make new (Ctrl+Shift+M)"
+msgstr "Создать новый (Ctrl+Shift+M)"
+
+#: udav/style_dlg.cpp:83 mgllab/dialogs.cpp:336
+msgid "Manual dashing"
+msgstr "Штриховка вручную"
+
+#: udav/style_dlg.cpp:196
+msgid "Manual mask"
+msgstr "Маска вручную"
+
+#: udav/text_pnl.cpp:591 mgllab/mgllab.cpp:323
+msgid "Manual primitives"
+msgstr "Примитивы вручную"
+
+#: mgllab/dialogs.cpp:1467
+msgid "Mark"
+msgstr "Маркер"
+
+#: udav/style_dlg.cpp:76 mgllab/dialogs.cpp:324
+msgid "Marks"
+msgstr "Маркеры"
+
+#: mgllab/dialogs.cpp:352
+msgid "Mask"
+msgstr "Маска"
+
+#: udav/style_dlg.cpp:124
+msgid "Mask for bitmap coloring"
+msgstr "Маска для растровой закраски"
+
+#: udav/style_dlg.cpp:125
+msgid "Mask rotation angle"
+msgstr "Угол поворота маски"
+
+#: udav/style_dlg.cpp:126
+msgid "Mask size"
+msgstr "Размер маски"
+
+#: udav/find_dlg.cpp:42 mgllab/editor.cpp:562
+msgid "Match case"
+msgstr "Учитывать регистр"
+
+#: widgets/qt.cpp:873
+msgid "MathGL - about"
+msgstr "MathGL - о программе"
+
+#: src/base.cpp:259
+#, c-format
+msgid "MathGL message - %s\n"
+msgstr "Сообщение MathGL - %s\n"
+
+#: widgets/qt.cpp:872
+msgid "MathGL v. 2."
+msgstr ""
+
+#: udav/open_dlg.cpp:70
+msgid "Matrix with sizes from file"
+msgstr "Матрица с размерами из файла"
+
+#: udav/dat_pnl.cpp:541
+msgid "Max along direction(s)"
+msgstr "Максимум вдоль направления"
+
+#: udav/setup_dlg.cpp:57 mgllab/dialogs.cpp:952
+msgid "Maximal"
+msgstr "Максимум"
+
+#: mgllab/table.cpp:546
+msgid "Maximal value (v2)"
+msgstr "Максимальное значение (v2)"
+
+#: mgllab/table.cpp:548
+msgid "Maximal value for resulting data values"
+msgstr "Максимальное значение для получившихся данных"
+
+#: mgllab/dialogs.cpp:88
+msgid "Maximal value of X for cutting or for coordinate filling"
+msgstr "Максимум X для обрезания или координат"
+
+#: mgllab/dialogs.cpp:92
+msgid "Maximal value of Y for cutting or for coordinate filling"
+msgstr "Максимум Y для обрезания или координат"
+
+#: mgllab/dialogs.cpp:96
+msgid "Maximal value of Z for cutting or for coordinate filling"
+msgstr "Максимум Z для обрезания или координат"
+
+#: src/data.cpp:1417
+#, c-format
+msgid "Maximum is %g\t at x = %ld\ty = %ld\tz = %ld\n"
+msgstr "Максимум %g\t при x = %ld\ty = %ld\tz = %ld\n"
+
+#: mgllab/table.cpp:342 mgllab/table.cpp:791
+msgid "Maximum of"
+msgstr "Максимум от"
+
+#: udav/mem_pnl.cpp:68 udav/mem_pnl.cpp:73 mgllab/mgllab.cpp:375
+msgid "Memory"
+msgstr "Память"
+
+#: udav/opt_dlg.cpp:53
+msgid "Mesh num"
+msgstr "Число линий"
+
+#: udav/setup_dlg.cpp:99 mgllab/dialogs.cpp:102
+msgid "MeshNum"
+msgstr "Число линий"
+
+#: mgllab/mgllab.cpp:342
+msgid "Messages"
+msgstr "Сообщения"
+
+#: udav/udav_wnd.cpp:178
+msgid "Messages and warnings"
+msgstr "Сообщения"
+
+#: udav/dat_pnl.cpp:540
+msgid "Min along direction(s)"
+msgstr "Минимум по направления"
+
+#: udav/setup_dlg.cpp:52 mgllab/dialogs.cpp:951
+msgid "Minimal"
+msgstr "Минимум"
+
+#: mgllab/table.cpp:543
+msgid "Minimal value (v1)"
+msgstr "Минимальное значение (v1)"
+
+#: mgllab/table.cpp:545
+msgid "Minimal value for resulting data values"
+msgstr "Минимальное значение для получившихся данных"
+
+#: mgllab/dialogs.cpp:86
+msgid "Minimal value of X for cutting or for coordinate filling"
+msgstr "Минимум X для обрезания или координат"
+
+#: mgllab/dialogs.cpp:90
+msgid "Minimal value of Y for cutting or for coordinate filling"
+msgstr "Минимум Y для обрезания или координат"
+
+#: mgllab/dialogs.cpp:94
+msgid "Minimal value of Z for cutting or for coordinate filling"
+msgstr "Минимум Z для обрезания или координат"
+
+#: src/data.cpp:1420
+#, c-format
+msgid "Minimum is %g\t at x = %ld\ty = %ld\tz = %ld\n"
+msgstr "Минимум %g\t при x = %ld\ty = %ld\tz = %ld\n"
+
+#: mgllab/table.cpp:342 mgllab/table.cpp:792
+msgid "Minimum of"
+msgstr "Минимум от"
+
+#. { _("Wavelet"),     0, wavelet_cb },
+#: mgllab/table.cpp:166 mgllab/table.cpp:783
+msgid "Mirror"
+msgstr "Отразить"
+
+#: udav/dat_pnl.cpp:619
+msgid "Mirror data along direction(s)"
+msgstr "Отразить данные по направлению"
+
+#: src/exec_dat.cpp:1678
+msgid "Mirror data at some direction"
+msgstr "Отразить данные по направлению"
+
+#: src/exec_dat.cpp:1679
+msgid "Modify data values by formula"
+msgstr "Изменить данные по формуле"
+
+#: udav/dat_pnl.cpp:542
+msgid "Momentum along 'x' for function"
+msgstr "Момент вдоль 'x' для функции"
+
+#: udav/dat_pnl.cpp:543
+msgid "Momentum along 'y' for function"
+msgstr "Момент вдоль 'y' для функции"
+
+#: udav/dat_pnl.cpp:544
+msgid "Momentum along 'z' for function"
+msgstr "Момент вдоль 'z' для функции"
+
+#: widgets/qt.cpp:1246 udav/plot_pnl.cpp:527
+msgid "Move down"
+msgstr "Сдвиг вниз"
+
+#: widgets/qt.cpp:1248 udav/plot_pnl.cpp:530
+msgid "Move graphics down 1/3 of its height."
+msgstr "Сдвинуть графику вниз на 1/3 высоты"
+
+#: widgets/qt.cpp:1232 udav/plot_pnl.cpp:506
+msgid "Move graphics left by 1/3 of its width."
+msgstr "Сдвинуть графику влево на 1/3 ширины"
+
+#: widgets/qt.cpp:1252 udav/plot_pnl.cpp:536
+msgid "Move graphics right by 1/3 of its width."
+msgstr "Сдвинуть графику вправо на 1/3 ширины"
+
+#: widgets/qt.cpp:1236 udav/plot_pnl.cpp:512
+msgid "Move graphics up by 1/3 of its height."
+msgstr "Сдвинуть графику вверх на 1/3 высоты"
+
+#: widgets/qt.cpp:1230 udav/plot_pnl.cpp:503
+msgid "Move left"
+msgstr "Сдвиг влево"
+
+#: udav/text_pnl.cpp:593
+msgid "Move mouse-handled primitives to script."
+msgstr "Перенести заданные вручную примитивы в скрипт."
+
+#: udav/plot_pnl.cpp:454
+msgid "Move plot down"
+msgstr "Сдвинуть график вниз"
+
+#: udav/plot_pnl.cpp:449
+msgid "Move plot up"
+msgstr "Сдвинуть график вверх"
+
+#: widgets/qt.cpp:1250 udav/plot_pnl.cpp:533
+msgid "Move right"
+msgstr "Сдвиг вправо"
+
+#: udav/plot_pnl.cpp:456
+msgid "Move selected plot down to next subplot."
+msgstr "Переместить выбранное в следующий под-график."
+
+#: udav/plot_pnl.cpp:451
+msgid "Move selected plot up to previous subplot."
+msgstr "Переместить выбранное в предыдущий под-график."
+
+#: widgets/qt.cpp:1234 udav/plot_pnl.cpp:509
+msgid "Move up"
+msgstr "Сдвиг вверх"
+
+#: mgllab/table.cpp:798
+msgid "Multiply by"
+msgstr "Умножить на"
+
+#: src/exec_dat.cpp:1681
+msgid "Multiply by data or number"
+msgstr "Умножить на массив данных или число"
+
+#. E
+#: udav/style_dlg.cpp:245 mgllab/dialogs.cpp:53
+msgid "N - darkskyblue"
+msgstr "N - грозовой"
+
+#: udav/dat_pnl.cpp:500
+msgid "NOTE: All fields must be filled!"
+msgstr "Все поля должны быть заполнены!"
+
+#: udav/mem_pnl.cpp:68
+msgid "Name"
+msgstr "Имя"
+
+#: mgllab/table.cpp:349
+msgid "Name for output"
+msgstr "Имя для результата"
+
+#. navigation menu
+#: udav/dat_pnl.cpp:720 mgllab/table.cpp:801
+msgid "Navigation"
+msgstr "Навигация"
+
+#: udav/newcmd_dlg.cpp:101 udav/newcmd_dlg.cpp:308 udav/newcmd_dlg.cpp:336
+#: udav/newcmd_dlg.cpp:340 udav/newcmd_dlg.cpp:354 udav/newcmd_dlg.cpp:367
+#: udav/newcmd_dlg.cpp:375 udav/newcmd_dlg.cpp:379 udav/newcmd_dlg.cpp:383
+#: udav/text_pnl.cpp:558 udav/plot_pnl.cpp:439 mgllab/dialogs.cpp:702
+msgid "New command"
+msgstr "Новая команда"
+
+#: udav/hint_dlg.cpp:40 mgllab/help.cpp:274
+msgid ""
+"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). "
+msgstr ""
+"Новый график никогда не удаляет уже нарисованный. Например, можно построить "
+"поверхность с линиями уровня вызывая последовательно 'surf' и 'cont' (в "
+"любом порядке)."
+
+#: udav/text_pnl.cpp:562 udav/plot_pnl.cpp:444
+msgid "New inplot"
+msgstr "Новый под-график"
+
+#: mgllab/table.cpp:672
+msgid "New order of dimensions"
+msgstr "Новый порядок размерностей"
+
+#: udav/udav_wnd.cpp:282 mgllab/mgllab.cpp:293
+msgid "New script"
+msgstr "Новый скрипт"
+
+#: mgllab/table.cpp:95
+msgid "New size of data on 1st dimension (x-direction)"
+msgstr "Новый размер данных по x"
+
+#: mgllab/table.cpp:97
+msgid "New size of data on 2nd dimension (y-direction)"
+msgstr "Новый размер данных по y"
+
+#: mgllab/table.cpp:99
+msgid "New size of data on 3d dimension (z-direction)"
+msgstr "Новый размер данных по z"
+
+#: udav/hint_dlg.cpp:68
+msgid "Next"
+msgstr "Следующий"
+
+#: mgllab/help.cpp:306
+msgid "Next @->"
+msgstr "Следующий @->"
+
+#: udav/dat_pnl.cpp:745 mgllab/table.cpp:804
+msgid "Next slice"
+msgstr "Следующий срез"
+
+#: widgets/qt.cpp:1260 udav/plot_pnl.cpp:560
+msgid "Next slide"
+msgstr "Следующий кадр"
+
+#: mgllab/help.cpp:135 mgllab/mgllab.cpp:242
+msgid "No"
+msgstr "Нет"
+
+#: udav/dat_pnl.cpp:567 udav/dat_pnl.cpp:644
+msgid "No action is selected. Do nothing."
+msgstr "Действие не выбрано."
+
+#: udav/newcmd_dlg.cpp:308
+msgid "No argument is selected"
+msgstr "Аргумент не выбран"
+
+#: udav/dat_pnl.cpp:573
+msgid "No direction/formula is entered. Do nothing."
+msgstr "Не введено направление/формула"
+
+#: widgets/qt.cpp:692 widgets/qt.cpp:704 widgets/qt.cpp:716 widgets/qt.cpp:728
+#: widgets/qt.cpp:740 widgets/qt.cpp:748 widgets/qt.cpp:756 widgets/qt.cpp:764
+#: widgets/qt.cpp:772 widgets/qt.cpp:780 widgets/qt.cpp:788 widgets/qt.cpp:796
+#: widgets/qt.cpp:812 widgets/qt.cpp:820 widgets/qt.cpp:828
+msgid "No filename."
+msgstr "Отсутствует имя файла."
+
+#: mgllab/editor.cpp:584 mgllab/editor.cpp:606 mgllab/editor.cpp:631
+#, c-format
+msgid "No occurrences of '%s' found!"
+msgstr "Вхождения '%s' не найдены!"
+
+#: mgllab/mathgl.cpp:262
+msgid "No selection. So nothing to do"
+msgstr "Ничего не выбрано."
+
+#: udav/text_pnl.cpp:202
+msgid "No string occurrence is found"
+msgstr "Вхождения не найдены"
+
+#: udav/setup_dlg.cpp:111
+msgid "No text rotation"
+msgstr "Не вращать текст"
+
+#: widgets/fltk.cpp:834
+msgid "Normal view"
+msgstr "Обычный вид"
+
+#: mgllab/table.cpp:770
+msgid "Normalize"
+msgstr "Нормировать"
+
+#: src/exec_dat.cpp:1683
+msgid "Normalize data"
+msgstr "Нормировать данные"
+
+#: src/exec_dat.cpp:1684
+msgid "Normalize data slice by slice"
+msgstr "Нормировать данные по срезам"
+
+#: mgllab/table.cpp:553
+msgid "Normalize in symmetrical range: -max(|v1|,|v2|) ... max(|v1|,|v2|)"
+msgstr "Нормировать симметрично: -max(|v1|,|v2|) ... max(|v1|,|v2|)"
+
+#: udav/udav_wnd.cpp:444
+msgid "Not recognized"
+msgstr "Не распознано"
+
+#: udav/dat_pnl.cpp:456
+msgid "Number of points"
+msgstr "Число точек"
+
+#: udav/prop_dlg.cpp:97
+msgid "Numbers"
+msgstr "Числа"
+
+#: mgllab/table.cpp:176
+msgid "Numeric parameter"
+msgstr "Численный параметр"
+
+#: udav/text_pnl.cpp:579
+msgid "Numeric value"
+msgstr "Численное значение"
+
+#: src/exec_dat.cpp:1649
+msgid "Numerically differentiate data"
+msgstr "Численно дифференцировать данные"
+
+#: src/exec_dat.cpp:1650
+msgid "Numerically double differentiate data"
+msgstr "Численно дифференцировать данные дважды"
+
+#: udav/open_dlg.cpp:64
+msgid "Nx"
+msgstr "Nx"
+
+#: udav/open_dlg.cpp:66
+msgid "Ny"
+msgstr "Ny"
+
+#: udav/open_dlg.cpp:68
+msgid "Nz"
+msgstr "Nz"
+
+#: widgets/qt.cpp:1092 udav/plot_pnl.cpp:487
+msgid "OBJ"
+msgstr "OBJ"
+
+#: udav/anim_dlg.cpp:69 udav/prop_dlg.cpp:182 udav/args_dlg.cpp:65
+#: udav/newcmd_dlg.cpp:80 udav/open_dlg.cpp:92 udav/dat_pnl.cpp:462
+#: udav/dat_pnl.cpp:512 udav/dat_pnl.cpp:554 udav/dat_pnl.cpp:631
+#: udav/opt_dlg.cpp:80 udav/files_dlg.cpp:60 udav/style_dlg.cpp:208
+#: udav/data_dlg.cpp:92 udav/subplot_dlg.cpp:221 mgllab/mathgl.cpp:198
+#: mgllab/dialogs.cpp:121 mgllab/dialogs.cpp:165 mgllab/dialogs.cpp:411
+#: mgllab/dialogs.cpp:585 mgllab/dialogs.cpp:750 mgllab/dialogs.cpp:1072
+#: mgllab/dialogs.cpp:1319 mgllab/dialogs.cpp:1474 mgllab/mgllab.cpp:498
+#: mgllab/table.cpp:621
+msgid "OK"
+msgstr "OK"
+
+#: mgllab/table.cpp:504
+msgid "Only current slice will be inserted"
+msgstr "Только текущий срез будет вставлен"
+
+#: mgllab/mgllab.cpp:181
+msgid "Open File?"
+msgstr "Открыть файл?"
+
+#: src/exec_dat.cpp:1686
+msgid "Open all data arrays from HDF file"
+msgstr "Загрузить все данные из HDF файла"
+
+#: udav/udav_wnd.cpp:198
+msgid ""
+"Open and execute/show script or data from file (Ctrl+O).\n"
+"You may switch off automatic exection in UDAV properties."
+msgstr ""
+"Открыть и выполнить скрипт или данные (Ctrl+O).\n"
+"Вы можете отключить автоматическое выполнение в настройках."
+
+#: mgllab/help.cpp:169
+msgid "Open dialog for new data creation."
+msgstr "Открыть диалог создания новых данных."
+
+#: udav/udav_wnd.cpp:196
+msgid "Open file"
+msgstr "Открыть файл"
+
+#: mgllab/mgllab.cpp:294
+msgid "Open file ..."
+msgstr "Открыть файл ..."
+
+#: widgets/qt.cpp:1101 udav/udav_wnd.cpp:298
+msgid "Open printer dialog and print graphics (Ctrl+P)"
+msgstr "Открыть диалог и напечатать график (CTRl+P)"
+
+#: mgllab/editor.cpp:506
+msgid "Open script or data file"
+msgstr "Загрузить скрипт или файл данных"
+
+#: mgllab/help.cpp:160
+msgid "Open table with selected data for editing."
+msgstr "Открыть таблицу с выбранным массивом данных."
+
+#: udav/data_dlg.cpp:65 mgllab/dialogs.cpp:578
+msgid "Operation"
+msgstr "Операция"
+
+#: mgllab/table.cpp:231
+msgid "Operation is not supported for this type of data."
+msgstr "Операция не поддерживается для данного типа данных."
+
+#: mgllab/table.cpp:795
+msgid "Operations"
+msgstr "Операции"
+
+#: udav/prop_dlg.cpp:91 udav/newcmd_dlg.cpp:72 mgllab/dialogs.cpp:746
+#: mgllab/mgllab.cpp:325
+msgid "Options"
+msgstr "Опции"
+
+#: udav/setup_dlg.cpp:62 mgllab/dialogs.cpp:953
+msgid "Origin"
+msgstr "Начало"
+
+#: udav/newcmd_dlg.cpp:171 mgllab/dialogs.cpp:712
+msgid "Other plots"
+msgstr "Другие графики"
+
+#: mgllab/dialogs.cpp:1025
+msgid "Others"
+msgstr "Другие"
+
+#: udav/style_dlg.cpp:161 mgllab/dialogs.cpp:372
+msgid "Overline"
+msgstr "Надчеркнутый"
+
+#: mgllab/dialogs.cpp:112
+msgid "Own brightness of the surface"
+msgstr "Собственная яркость поверхности"
+
+#. Q
+#: udav/style_dlg.cpp:248 mgllab/dialogs.cpp:56
+msgid "P - darkpink"
+msgstr "P - багровый"
+
+#: src/prc.cpp:982
+msgid "PDF support was disabled. Please, enable it and rebuild MathGL."
+msgstr "PDF поддержка отключена. Включите ее и пересоберите MathGL."
+
+#: widgets/qt.cpp:1081 udav/plot_pnl.cpp:475
+msgid "PNG"
+msgstr ""
+
+#: mgllab/table.cpp:474 mgllab/table.cpp:486
+msgid "PNG Files \t*.png"
+msgstr "PNG файлы \t*.png"
+
+#: src/canvas_cf.cpp:502 src/canvas_cf.cpp:504 src/data_png.cpp:117
+#: src/export.cpp:75 src/export.cpp:109
+msgid "PNG support was disabled. Please, enable it and rebuild MathGL."
+msgstr "PNG поддержка отключена. Включите ее и пересоберите MathGL."
+
+#: widgets/qt.cpp:1091 udav/plot_pnl.cpp:486
+msgid "PRC"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1006
+msgid "Palette"
+msgstr "Палитра"
+
+#: mgllab/table.cpp:167
+msgid "Parabolic *5"
+msgstr "По параболе *5"
+
+#: udav/dat_pnl.cpp:713
+msgid "Paste data"
+msgstr "Вставить данные"
+
+#: udav/dat_pnl.cpp:715
+msgid "Paste range of numbers from clipboard (Ctrl+Shift+P)."
+msgstr "Вставить диапазон значений из буфера обмена (Ctrl+Shift+P)."
+
+#: udav/text_pnl.cpp:538 mgllab/mgllab.cpp:311
+msgid "Paste text"
+msgstr "Вставить текст"
+
+#: mgllab/editor.cpp:513
+msgid "Paste text from clipboard"
+msgstr "Вставить текст из буфера обмена"
+
+#: udav/text_pnl.cpp:540
+msgid "Paste text or data from clipboard (Ctrl+V)."
+msgstr "Вставить текст из буфера обмена (Ctrl+V)."
+
+#: mgllab/mgllab.cpp:484
+msgid "Path for MathGL font (without extension)"
+msgstr "Путь к шрифтам MathGL (без расширения)"
+
+#: udav/prop_dlg.cpp:110 mgllab/mgllab.cpp:481
+msgid "Path for help files"
+msgstr "Путь к файлам справки"
+
+#: udav/prop_dlg.cpp:130
+msgid "Path for user MathGL font files"
+msgstr "Путь к шрифтам MathGL"
+
+#: widgets/qt.cpp:1278
+msgid "Pause calculation"
+msgstr "Пауза вычислений"
+
+#. Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(setPause()));
+#: widgets/fltk.cpp:917 widgets/qt.cpp:1283
+msgid "Pause on/off external calculations"
+msgstr "Пауза вкл/выкл для внешних вычислений"
+
+#: src/exec_dat.cpp:1703
+msgid "Perform Runge-Kutta step"
+msgstr "Выполнить шаг Рунге-Кутта"
+
+#: widgets/fltk.cpp:886
+msgid "Phi angle (rotate in x*y plane)"
+msgstr "Угол Phi (вращать в плоскости x*y)"
+
+#: udav/prop_dlg.cpp:161
+msgid "Place editor at top"
+msgstr "Поместить редактор сверху"
+
+#: mgllab/dialogs.cpp:1050
+msgid "Plot ID"
+msgstr "ID графика"
+
+#: src/exec_prm.cpp:633
+msgid "Plot curve by formula"
+msgstr "Построить кривую по формуле"
+
+#. o->addSeparator();  bb->addSeparator();
+#. 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);
+#: udav/dat_pnl.cpp:701
+msgid "Plot data"
+msgstr "Нарисовать данные"
+
+#: udav/dat_pnl.cpp:703
+msgid ""
+"Plot data in new script window. You may select the kind\n"
+"of plot, its style and so on."
+msgstr ""
+"Нарисовать данные в новом окне.\n"
+"Вы можете выбрать тип графика, его стиль и т.д."
+
+#: mgllab/mgllab.cpp:340
+msgid "Plot setup"
+msgstr "Настройки графика"
+
+#: udav/text_pnl.cpp:571 mgllab/dialogs.cpp:312 mgllab/mgllab.cpp:324
+msgid "Plot style"
+msgstr "Стиль графика"
+
+#: src/exec_prm.cpp:634
+msgid "Plot surface by formula"
+msgstr "Построить поверхность по формуле"
+
+#: mgllab/dialogs.cpp:386
+msgid "Popular color schemes"
+msgstr "Популярные цв.схемы"
+
+#: udav/hint_dlg.cpp:66
+msgid "Prev"
+msgstr "Предыдущий"
+
+#: udav/dat_pnl.cpp:727 mgllab/table.cpp:803
+msgid "Prev slice"
+msgstr "Предыдущий срез"
+
+#: widgets/qt.cpp:1269 udav/plot_pnl.cpp:575
+msgid "Prev slide"
+msgstr "Предыдущий кадр"
+
+#: udav/info_dlg.cpp:51
+msgid "Preview"
+msgstr "Просмотр"
+
+#: mgllab/mgllab.cpp:581
+msgid "Previous expressions"
+msgstr "Предыдущее выражение"
+
+#: udav/newcmd_dlg.cpp:181 mgllab/dialogs.cpp:722
+msgid "Primitives"
+msgstr "Примитивы"
+
+#: widgets/qt.cpp:1163 udav/plot_pnl.cpp:365
+msgid "Primitives ..."
+msgstr "Примитивы ..."
+
+#: src/exec_set.cpp:837
+msgid "Print MathGL version or check if it is valid"
+msgstr "Вывести версию MathGL или проверить, что она подходит"
+
+#: src/exec_dat.cpp:1654
+msgid "Print content of the data"
+msgstr "Вывести содержимое массива данных"
+
+#: src/exec_dat.cpp:1692
+msgid "Print fitted formula"
+msgstr "Вывести подобранную формулу"
+
+#: widgets/qt.cpp:1099 udav/udav_wnd.cpp:296
+msgid "Print graphics"
+msgstr "Напечатать график"
+
+#: src/exec_dat.cpp:1646
+msgid "Print list of data names in HDF file"
+msgstr "Вывести список имен переменных в HDF файле"
+
+#: src/exec_dat.cpp:1670
+msgid "Print message or information about the data"
+msgstr "Вывести сообщение или информацию о данных"
+
+#: mgllab/mgllab.cpp:297
+msgid "Print plot"
+msgstr "Напечатать график"
+
+#: udav/udav_wnd.cpp:295
+msgid "Print script"
+msgstr "Напечатать скрипт"
+
+#: src/exec_prm.cpp:631
+msgid "Print string from file"
+msgstr "Вывести строку в файл"
+
+#: udav/text_pnl.cpp:178
+msgid "Printing aborted"
+msgstr "Печать отменена"
+
+#: udav/text_pnl.cpp:176
+msgid "Printing completed"
+msgstr "Печать закончена"
+
+#: udav/text_pnl.cpp:174
+msgid "Printing..."
+msgstr "Печатаю ..."
+
+#: udav/newcmd_dlg.cpp:180 mgllab/dialogs.cpp:721
+msgid "Program flow"
+msgstr "Команды управления"
+
+#: src/exec_dat.cpp:1637
+msgid "Project periodical data in [v1,v2]"
+msgstr "Проецирует периодические данные в [v1,v2]"
+
+#: udav/udav_wnd.cpp:312 mgllab/mgllab.cpp:337 mgllab/mgllab.cpp:476
+msgid "Properties"
+msgstr "Свойства"
+
+#: udav/mem_pnl.cpp:61
+msgid "Properties of selected data array"
+msgstr "Свойства выбранного массива данных"
+
+#: mgllab/table.cpp:342 mgllab/table.cpp:793
+msgid "Pulse prop."
+msgstr "Свойства импульса"
+
+#: udav/calc_dlg.cpp:127 mgllab/mgllab.cpp:615
+msgid "Put function"
+msgstr "Поместить"
+
+#: udav/dat_pnl.cpp:457
+msgid "Put in variable"
+msgstr "Поместить в переменную"
+
+#: udav/dat_pnl.cpp:548
+msgid "Put into this data array"
+msgstr "Поместить в этот массив данных"
+
+#: udav/anim_dlg.cpp:74 mgllab/mathgl.cpp:203
+msgid "Put to script"
+msgstr "В скрипт"
+
+#: src/exec_dat.cpp:1691
+msgid "Put value (numeric or array) to given data element"
+msgstr "Поместить число или массив в заданный элемент данных"
+
+#. U
+#: udav/style_dlg.cpp:247 mgllab/dialogs.cpp:55
+msgid "Q - brown"
+msgstr "Q - коричневый"
+
+#: udav/udav_wnd.cpp:303
+msgid "Quit"
+msgstr "Выход"
+
+#. G
+#: udav/style_dlg.cpp:239 mgllab/dialogs.cpp:47
+msgid "R - maroon"
+msgstr "R - темно-красный"
+
+#: src/exec_set.cpp:818
+msgid "Rasterize plot and save to background"
+msgstr "Растеризовать график и установить вместо фона"
+
+#: src/exec_dat.cpp:1697
+msgid "Read and join data from several files"
+msgstr "Загрузить и объединить данные из нескольких файлов"
+
+#: src/exec_dat.cpp:1696
+msgid "Read data from file"
+msgstr "Загрузить данные из файла"
+
+#: src/exec_dat.cpp:1699
+msgid "Read data from file with sizes specified in first row"
+msgstr "Загрузить данные из файла с размерами из первой строки"
+
+#: src/exec_dat.cpp:1698
+msgid "Read data with name 'id' from HDF file"
+msgstr "Загрузить данные с именем 'id' из HDF файла"
+
+#: udav/udav_wnd.cpp:268 mgllab/mgllab.cpp:382
+msgid "Ready"
+msgstr "Готов"
+
+#: src/exec_dat.cpp:1700
+msgid "Rearrange data dimensions"
+msgstr "Упорядочить размерности массива данных"
+
+#: udav/udav_wnd.cpp:301 mgllab/mgllab.cpp:298
+msgid "Recent files"
+msgstr "Последние файлы"
+
+#: udav/dat_pnl.cpp:768
+msgid "Recreate the data with new sizes and fill it by zeros (Ctrl+Shift+N)."
+msgstr "Пересоздать данные с новым размером и заполнить нулями (Ctrl+Shift+N)."
+
+#: udav/text_pnl.cpp:521
+msgid "Redo"
+msgstr "Отменить"
+
+#: udav/text_pnl.cpp:523
+msgid "Redo editor change (Ctrl+Shift+Z)."
+msgstr "Отменить правку в редакторе (Ctrl+Shift+Z)."
+
+#: widgets/qt.cpp:1143 udav/plot_pnl.cpp:331
+msgid "Redraw"
+msgstr "Перерисовать"
+
+#: udav/anim_dlg.cpp:41 mgllab/mathgl.cpp:186
+msgid "Redraw picture for $0 equal to"
+msgstr "Перерисовать для $0 равного"
+
+#: widgets/fltk.cpp:835
+msgid "Redraw plot"
+msgstr "Перерисовать график"
+
+#: mgllab/dialogs.cpp:1320
+msgid "Refresh"
+msgstr "Обновить"
+
+#: widgets/fltk.cpp:869
+msgid "Refresh the picture"
+msgstr "Обновить рисунок"
+
+#: mgllab/dialogs.cpp:404
+msgid "Relative position of i-th color"
+msgstr "Положение i-го цвета"
+
+#: udav/plot_pnl.cpp:342
+msgid "Reload"
+msgstr "Перезагрузить"
+
+#: widgets/fltk.cpp:837
+msgid "Reload data"
+msgstr "Перезагрузить"
+
+#: widgets/fltk.cpp:875
+msgid "Reload data and refresh the picture"
+msgstr "Перезагрузить данные и обновить рисунок"
+
+#: src/exec_dat.cpp:1636
+msgid "Remove duplicate rows"
+msgstr "Удалить одинаковые строки"
+
+#: src/exec_dat.cpp:1710
+msgid "Remove jump into the data, like phase jumps"
+msgstr "Убрать скачки данных, например скачки фазы"
+
+#: udav/find_dlg.cpp:50 mgllab/editor.cpp:561
+msgid "Replace"
+msgstr "Заменить"
+
+#: mgllab/editor.cpp:564
+msgid "Replace all"
+msgstr "Заменить все"
+
+#: udav/find_dlg.cpp:39 mgllab/editor.cpp:560
+msgid "Replace by:"
+msgstr "Заменить на:"
+
+#: udav/text_pnl.cpp:581
+msgid "Replace expression by its numerical value."
+msgstr "Заменить выражение на его числовое значение."
+
+#: mgllab/editor.cpp:630
+#, c-format
+msgid "Replaced %ld occurrences."
+msgstr "Заменено %ld вхождений."
+
+#: mgllab/dialogs.cpp:891
+#, c-format
+msgid "Required argument %s is not specified!"
+msgstr "Обязательный аргумент %s не задан!"
+
+#: udav/subplot_dlg.cpp:186
+msgid "Reserve at"
+msgstr "Оставить место"
+
+#: mgllab/dialogs.cpp:1303
+msgid "Reserve at:"
+msgstr "Пустое поле"
+
+#: udav/subplot_dlg.cpp:190
+msgid "Reserve space for labels at bottom side (style '_')"
+msgstr "Оставить место для подписей снизу (стиль '_')"
+
+#: udav/subplot_dlg.cpp:188
+msgid "Reserve space for labels at left side (style '<')"
+msgstr "Оставить место для подписей слева (стиль '<')"
+
+#: udav/subplot_dlg.cpp:194
+msgid "Reserve space for labels at right side (style '>')"
+msgstr "Оставить место для подписей справа (стиль '>')"
+
+#: udav/subplot_dlg.cpp:192
+msgid "Reserve space for labels at top side (style '^')"
+msgstr "Оставить место для подписей сверху (стиль '^')"
+
+#: src/exec_set.cpp:819
+msgid "Reset settings and clear picture"
+msgstr "Сбросить настройки и обновить рисунок"
+
+#: udav/dat_pnl.cpp:772 mgllab/table.cpp:761
+msgid "Resize"
+msgstr "Изменить размер"
+
+#: udav/dat_pnl.cpp:774
+msgid "Resize (interpolate) the data to specified sizes (Ctrl+Shift+R)."
+msgstr "Изменить размер (интерполоировать) данных (Ctrl+Shift+R)."
+
+#: src/exec_dat.cpp:1702
+msgid "Resize data array"
+msgstr "Изменить размер массива данных"
+
+#: mgllab/table.cpp:858
+msgid "Resize data with smoothing"
+msgstr "Изменить размер массива данных со сглаживанием"
+
+#: widgets/qt.cpp:1136 udav/plot_pnl.cpp:325
+msgid "Restore"
+msgstr "Восстановить"
+
+#: widgets/fltk.cpp:866
+msgid "Restore default graphics rotation, zoom and perspective"
+msgstr "Восстановить вращение, приближение и перспективу графика"
+
+#: widgets/qt.cpp:1138
+msgid "Restore default graphics rotation, zoom and perspective (Alt+Space)."
+msgstr "Восстановить вращение, приближение и перспективу графика (Alt+Space)."
+
+#: udav/plot_pnl.cpp:327
+msgid "Restore default graphics rotation, zoom and perspective (Ctrl+Space)."
+msgstr "Восстановить вращение, приближение и перспективу графика (Ctrl+Space)."
+
+#: udav/plot_pnl.cpp:344
+msgid "Restore status for 'once' command and reload data (F9)."
+msgstr "Восстановить статус команды 'once' и перезагрузить данные (F9)"
+
+#: udav/calc_dlg.cpp:63 udav/data_dlg.cpp:85 udav/data_dlg.cpp:143
+#: udav/subplot_dlg.cpp:212 mgllab/dialogs.cpp:1315
+msgid "Result"
+msgstr "Итог"
+
+#: udav/data_dlg.cpp:124
+msgid "Result (will have sizes "
+msgstr "Результат (будет иметь размеры "
+
+#: udav/style_dlg.cpp:201 udav/subplot_dlg.cpp:214 mgllab/dialogs.cpp:408
+msgid "Resulting string"
+msgstr "Итоговая строка"
+
+#: src/parser.cpp:1497
+msgid "Return from function"
+msgstr "Возврат из функции"
+
+#: udav/subplot_dlg.cpp:148
+msgid "Right bottom edge"
+msgstr "Правый нижний угол"
+
+#: udav/subplot_dlg.cpp:156
+msgid "Right top edge"
+msgstr "Правый верхний угол"
+
+#: mgllab/table.cpp:166 mgllab/table.cpp:784
+msgid "Roll"
+msgstr "Сдвинуть"
+
+#: src/exec_dat.cpp:1704
+msgid "Roll data along direction(s)"
+msgstr "Сдвинуть данные по направлению"
+
+#. rotate menu
+#: udav/plot_pnl.cpp:540
+msgid "Rotate"
+msgstr "Вращать"
+
+#: widgets/qt.cpp:1123 udav/plot_pnl.cpp:310
+msgid "Rotate by mouse"
+msgstr "Вращать мышкой"
+
+#: udav/plot_pnl.cpp:545
+msgid "Rotate down"
+msgstr "Вращать вниз"
+
+#: udav/plot_pnl.cpp:549
+msgid "Rotate left"
+msgstr "Вращать влево"
+
+#: udav/subplot_dlg.cpp:164 mgllab/dialogs.cpp:1294
+msgid "Rotate on"
+msgstr "Поворот"
+
+#: widgets/fltk.cpp:862
+msgid "Rotate picture by holding left mouse button"
+msgstr "Вращать рисунок при удержании кнопок мыши"
+
+#: src/exec_set.cpp:820
+msgid "Rotate plot"
+msgstr "Вращать график"
+
+#: udav/plot_pnl.cpp:553
+msgid "Rotate right"
+msgstr "Вращать вправо"
+
+#: udav/plot_pnl.cpp:541
+msgid "Rotate up"
+msgstr "Вращать вверх"
+
+#: mgllab/dialogs.cpp:356
+msgid "Rotation"
+msgstr "Вращение"
+
+#: widgets/qt.cpp:1267
+msgid "Run slideshow (CTRl+F5)."
+msgstr "Запустить анимацию (CTRl+F5)."
+
+#: udav/plot_pnl.cpp:570
+msgid ""
+"Run slideshow (Ctrl+F5). If no parameter specified\n"
+"then the dialog with slideshow options will appear."
+msgstr ""
+"Запустить анимацию (CTRl+F5). Если ее параметры\n"
+"не заданы, то будет показан диалог настройки."
+
+#: widgets/fltk.cpp:908
+msgid "Run/Stop slideshow (graphics animation)"
+msgstr "Запустить/остановить анимацию"
+
+#: udav/prop_dlg.cpp:141
+msgid "Russian"
+msgstr "Русский"
+
+#: widgets/qt.cpp:1093 udav/plot_pnl.cpp:488
+msgid "STL"
+msgstr ""
+
+#: widgets/qt.cpp:1086 udav/plot_pnl.cpp:480
+msgid "SVG"
+msgstr ""
+
+#: udav/style_dlg.cpp:107
+msgid "Saturation"
+msgstr "Насыщенность"
+
+#: udav/setup_dlg.cpp:143 mgllab/editor.cpp:282
+msgid "Save"
+msgstr "Сохранить"
+
+#: mgllab/help.cpp:250 mgllab/table.cpp:456
+msgid "Save Data?"
+msgstr "Сохранить данные?"
+
+#: widgets/fltk.cpp:591 mgllab/mgllab.cpp:229
+msgid "Save File As?"
+msgstr "Сохранить файл?"
+
+#: udav/anim_dlg.cpp:83
+msgid "Save JPEG frames"
+msgstr "Сохранить кадры в JPEG"
+
+#: udav/udav_wnd.cpp:290 mgllab/mgllab.cpp:296
+msgid "Save as ..."
+msgstr "Сохранить как ..."
+
+#: udav/dat_pnl.cpp:688
+msgid "Save data"
+msgstr "Сохранить данные"
+
+#: src/exec_dat.cpp:1707
+msgid "Save data to HDF5 file"
+msgstr "Сохранить данные в HDF5 файл"
+
+#: udav/dat_pnl.cpp:690
+msgid "Save data to a file (Ctrl+Shift+S)."
+msgstr "Сохранить данные в файл (Ctrl+Shift+S)."
+
+#: src/exec_dat.cpp:1706 mgllab/table.cpp:844
+msgid "Save data to file"
+msgstr "Сохранить данные в файл"
+
+#: mgllab/mgllab.cpp:295
+msgid "Save file"
+msgstr "Сохранить файл"
+
+#: mgllab/mgllab.cpp:488
+msgid "Save file before redrawing"
+msgstr "Сохранить файл перед рисованием"
+
+#: udav/udav_wnd.cpp:201
+msgid "Save script"
+msgstr "Сохранить скрипт"
+
+#: udav/udav_wnd.cpp:203
+msgid "Save script to a file (Ctrl+S)"
+msgstr "Сохранить скрипт в файл (Ctrl+S)"
+
+#: mgllab/editor.cpp:508
+msgid "Save script to file"
+msgstr "Сохранить скрипт в файл"
+
+#: mgllab/help.cpp:172
+msgid "Save selected data to file."
+msgstr "Сохранить выбранные данные в файл."
+
+#: mgllab/table.cpp:753
+msgid "Save to file"
+msgstr "Сохранить в файл"
+
+#: udav/udav_wnd.cpp:672
+msgid "Saving aborted"
+msgstr "Сохранение прервано"
+
+#: udav/newcmd_dlg.cpp:179 mgllab/dialogs.cpp:720
+msgid "Scale and rotate"
+msgstr "Масштаб и вращение"
+
+#: udav/udav_wnd.cpp:237
+msgid "Script"
+msgstr "Скрипт"
+
+#: udav/find_dlg.cpp:43 mgllab/editor.cpp:563
+msgid "Search backward"
+msgstr "Искать назад"
+
+#: udav/text_pnl.cpp:543 mgllab/mgllab.cpp:312
+msgid "Select all"
+msgstr "Выделить все"
+
+#: udav/text_pnl.cpp:585
+msgid "Select and insert file name."
+msgstr "Выбрать и вставить имя файла."
+
+#: udav/text_pnl.cpp:589
+msgid "Select and insert folder name."
+msgstr "Выбрать и вставить путь к папке."
+
+#: mgllab/dialogs.cpp:565
+msgid "Select data argument"
+msgstr "Выбрать данные"
+
+#: mgllab/dialogs.cpp:160
+msgid "Select direction"
+msgstr "Выбрать направление"
+
+#: mgllab/editor.cpp:653
+msgid "Select file name"
+msgstr "Выбрать имя файла"
+
+#: udav/newcmd_dlg.cpp:337 udav/newcmd_dlg.cpp:355
+msgid "Select first the proper kind of arguments"
+msgstr "Сначала выберите вариант аргументов"
+
+#: mgllab/editor.cpp:666
+msgid "Select folder name"
+msgstr "Выбрать путь к папке"
+
+#: udav/info_dlg.cpp:39
+msgid "Select kind of plot"
+msgstr "Выбрать тип графика"
+
+#: src/exec_set.cpp:836
+msgid "Select variant of plot style(s)"
+msgstr "Выбрать вариант стиля графика"
+
+#: mgllab/mathgl.cpp:168
+msgid "Set"
+msgstr "Задать"
+
+#: src/exec_set.cpp:832
+msgid "Set additional tick and axis labels shift"
+msgstr "Задает дополнительный сдвиш меток осей"
+
+#: src/exec_set.cpp:780
+msgid "Set ambient light brightness"
+msgstr "Задает яркость фонового освещения"
+
+#: src/exec_set.cpp:801
+msgid "Set arbitrary position of plot in picture"
+msgstr "Задать произвольную область рисования внутри рисунка"
+
+#: udav/udav_wnd.cpp:315 mgllab/mgllab.cpp:338
+msgid "Set arguments"
+msgstr "Задать аргументы"
+
+#: src/exec_set.cpp:782
+msgid "Set aspect ration"
+msgstr "Задать соотношение сторон"
+
+#: src/exec_set.cpp:784
+msgid "Set axis and tick style"
+msgstr "Задать стиль осей и меток"
+
+#: src/exec_set.cpp:810
+msgid "Set axis origin"
+msgstr "Задать начало координат"
+
+#: src/exec_set.cpp:817
+msgid "Set axis ranges"
+msgstr "Задать диапазон осей"
+
+#: src/exec_set.cpp:825
+msgid "Set bit-flags (for advanced users only)"
+msgstr "Задает битовый флаг (для опытных пользователей)"
+
+#: src/exec_set.cpp:786
+msgid "Set bounding box for 2d export"
+msgstr "Задать границы для 2d экспорта"
+
+#: src/exec_set.cpp:807
+msgid "Set brush for given mask id"
+msgstr "Задать кисть для маски с выбранным id"
+
+#: src/exec_set.cpp:791
+msgid "Set color range"
+msgstr "Задать диапазон цвета"
+
+#: src/exec_dat.cpp:1668
+msgid "Set column id for data"
+msgstr "Задать id колонок данных"
+
+#: mgllab/dialogs.cpp:108
+msgid "Set cutting off/on for particular plot"
+msgstr "Вкл/выкл обрезание для конкретного графика"
+
+#: udav/open_dlg.cpp:62
+msgid "Set data sizes manually"
+msgstr "Задать размеры данных вручную"
+
+#: src/exec_set.cpp:785
+msgid "Set default bars width"
+msgstr "Задать размер полос по умолчанию"
+
+#: src/exec_set.cpp:815
+msgid "Set default filename"
+msgstr "Задать имя файла по умолчанию"
+
+#: src/exec_set.cpp:779
+msgid "Set default transparency"
+msgstr "Задать прозрачность по умолчанию"
+
+#: src/exec_set.cpp:794
+msgid "Set diffusive light brightness"
+msgstr "Задать яркость рассеянного света"
+
+#: src/exec_set.cpp:795
+msgid "Set draw region for quality&4"
+msgstr "Задать область рисования при quality&4"
+
+#: udav/subplot_dlg.cpp:47 udav/subplot_dlg.cpp:89
+msgid "Set drawing area as cell of matrix nx*ny."
+msgstr "Задать область рисования как ячейку матрицы nx*ny."
+
+#: udav/subplot_dlg.cpp:110
+msgid "Set drawing area as cells of column."
+msgstr "Задать область рисования как ячейку колонки."
+
+#: udav/subplot_dlg.cpp:64 udav/subplot_dlg.cpp:140
+msgid "Set drawing area as cells of matrix nx*ny."
+msgstr "Задать область рисования как ячейки матрицы nx*ny."
+
+#: udav/subplot_dlg.cpp:127
+msgid "Set drawing area as cells of stick."
+msgstr "Задать область рисования как ячейку бруска."
+
+#: mgllab/dialogs.cpp:117
+msgid "Set lighting off/on for particular plot"
+msgstr "Вкл/выкл освещение отдельного графика"
+
+#: src/exec_set.cpp:808
+msgid "Set number of lines in mesh/fall/vect and so on"
+msgstr "Задать примерное число линий в mesh/fall/vect ..."
+
+#: src/exec_set.cpp:802
+msgid "Set number of marks in the legend"
+msgstr "Задать число маркеров в легенде"
+
+#: src/exec_set.cpp:796
+msgid "Set number of visible faces"
+msgstr "Задать число видимых граней"
+
+#: src/exec_set.cpp:812
+msgid "Set palette for 1D plots"
+msgstr "Задать палитру для 1D графиков"
+
+#: src/exec_set.cpp:814
+msgid "Set perspective"
+msgstr "Задать перспективу"
+
+#: src/exec_set.cpp:823
+msgid "Set picture size"
+msgstr "Задать размер рисунка"
+
+#: src/exec_set.cpp:816
+msgid "Set plot quality"
+msgstr "Задать качество рисования картинки"
+
+#: src/exec_set.cpp:829
+msgid "Set position of plot as cell of matrix"
+msgstr "Задать область рисования как ячейку матрицы"
+
+#: src/exec_set.cpp:809
+msgid "Set position of plot block in matrix"
+msgstr "Задать область рисования как блок в матрице"
+
+#: src/exec_set.cpp:790
+msgid "Set position of plot inside cell of column"
+msgstr "Задать область рисования как ячейку колонки"
+
+#: src/exec_set.cpp:800
+msgid "Set position of plot inside cell of matrix"
+msgstr "Задать область рисования внутри ячейки колонки"
+
+#: src/exec_set.cpp:828
+msgid "Set position of plot inside cell of rotated stick"
+msgstr "Задать область рисования как ячейку повернутого бруска"
+
+#: src/exec_set.cpp:827
+msgid "Set position of plot inside cell of sheared stick"
+msgstr "Задать область рисования как ячейку наклоненной колонки"
+
+#: src/exec_set.cpp:840
+msgid "Set range for x-axis"
+msgstr "Задать диапазон по x"
+
+#: src/exec_set.cpp:842
+msgid "Set range for y-axis"
+msgstr "Задать диапазон по y"
+
+#: src/exec_set.cpp:846
+msgid "Set range for z-axis"
+msgstr "Задать диапазон по z"
+
+#: src/exec_set.cpp:822
+msgid "Set scale text in relative subplots too"
+msgstr "Задает масштабирование текста в отн.подграфиках"
+
+#: src/exec_set.cpp:824
+msgid "Set scaling factor for further setsize"
+msgstr "Задать множитель для всех 'setsize'"
+
+#: mgllab/mathgl.cpp:145
+msgid "Set script arguments"
+msgstr "Задать аргументы скрипта"
+
+#: mgllab/dialogs.cpp:105
+msgid "Set size for text, marks and others"
+msgstr "Задать размер текста, маркеров и пр."
+
+#: src/exec_set.cpp:781
+msgid "Set size of arrows"
+msgstr "Задать размер стрелок"
+
+#: src/exec_set.cpp:806
+msgid "Set size of markers"
+msgstr "Задать размер маркеров"
+
+#: src/exec_set.cpp:813
+msgid "Set size of semi-transparent area around line"
+msgstr "Задать размер полупрозрачной области около линии"
+
+#: src/exec_set.cpp:811
+msgid "Set tick labels drawing at origin"
+msgstr "Разрешить вывод меток осей в начале координат"
+
+#: src/exec_set.cpp:831
+msgid "Set tick length"
+msgstr "Задать длину меток осей"
+
+#: src/exec_set.cpp:792
+msgid "Set ticks for colorbar"
+msgstr "Задать метки для цветовой шкалы"
+
+#: src/exec_set.cpp:841
+msgid "Set ticks for x-axis"
+msgstr "Задать метки для оси x"
+
+#: src/exec_set.cpp:843
+msgid "Set ticks for y-axis"
+msgstr "Задать метки для оси y"
+
+#: src/exec_set.cpp:847
+msgid "Set ticks for z-axis"
+msgstr "Задать метки для оси z"
+
+#: src/exec_set.cpp:833
+msgid "Set ticks in time format"
+msgstr "Задать метки в формате времени"
+
+#: src/exec_set.cpp:835
+msgid "Set ticks tuning"
+msgstr "Включить оптимизацию меток осей"
+
+#: src/exec_set.cpp:821
+msgid "Set to auto rotate text or not"
+msgstr "Разрешить поворот текста"
+
+#: udav/subplot_dlg.cpp:196
+msgid "Set to use whole area (style '#')"
+msgstr "Задать использование всей области (стиль '#')"
+
+#: src/exec_set.cpp:834
+msgid "Set type transparency"
+msgstr "Задать тип прозрачности"
+
+#: widgets/qt.cpp:1222
+msgid "Set value of \\phi angle."
+msgstr "Задать значени угла φ"
+
+#: udav/plot_pnl.cpp:472
+msgid ""
+"Set value of \\phi angle.\n"
+"You can use keys (Shift+Meta+Left or Shift+Meta+Right)."
+msgstr ""
+"Задать значени угла φ.\n"
+"Вы можете использовать клавиши (Shift+Meta+Left или Shift+Meta+Right)."
+
+#: widgets/qt.cpp:1216
+msgid "Set value of \\theta angle."
+msgstr "Задать значени угла θ"
+
+#: udav/plot_pnl.cpp:466
+msgid ""
+"Set value of \\theta angle.\n"
+"You can use keys (Shift+Meta+Up or Shift+Meta+Down)."
+msgstr ""
+"Задать значени угла θ.\n"
+"Вы можете использовать клавиши (Shift+Meta+Up или Shift+Meta+Down)."
+
+#: udav/udav_wnd.cpp:311
+msgid "Settings"
+msgstr "Настройки"
+
+#: mgllab/mgllab.cpp:336
+msgid "Setup"
+msgstr "Настройки"
+
+#: mgllab/mgllab.cpp:339
+msgid "Setup animation"
+msgstr "Настроить анимацию"
+
+#: udav/prop_dlg.cpp:80
+msgid "Setup colors for:"
+msgstr "Настроить цвета:"
+
+#: src/exec_set.cpp:798
+msgid "Setup font"
+msgstr "Настроить шрифт"
+
+#: src/exec_set.cpp:803
+msgid "Setup light"
+msgstr "Настроить освещение"
+
+#: src/exec_prm.cpp:616
+msgid "Setup or draw axis"
+msgstr "Настроить или нарисовать оси"
+
+#: src/exec_set.cpp:793
+msgid "Setup plot points cutting"
+msgstr "Настроить обрезание точек графика"
+
+#: mgllab/dialogs.cpp:947
+msgid "Setup script"
+msgstr "Настроить скрипт"
+
+#: udav/plot_pnl.cpp:573
+msgid "Setup show"
+msgstr "Настроить анимацию"
+
+#: udav/dat_pnl.cpp:623
+msgid "Sew data along direction(s)"
+msgstr "Сшить данные по направлению"
+
+#: mgllab/table.cpp:166 mgllab/table.cpp:785
+msgid "Sew phase"
+msgstr "Сшить фазу"
+
+#: mgllab/dialogs.cpp:350
+msgid "Sharp colors"
+msgstr "Контрастные"
+
+#: src/exec_set.cpp:826
+msgid "Shear plot"
+msgstr "Наклон графика"
+
+#: widgets/fltk.cpp:901
+msgid "Shift the picture down"
+msgstr "Сдвинуть рисунок вниз"
+
+#: widgets/fltk.cpp:893
+msgid "Shift the picture left"
+msgstr "Сдвинуть рисунок слево"
+
+#: widgets/fltk.cpp:899
+msgid "Shift the picture right"
+msgstr "Сдвинуть рисунок вправо"
+
+#: widgets/fltk.cpp:891
+msgid "Shift the picture up"
+msgstr "Сдвинуть рисунок вверх"
+
+#: udav/newcmd_dlg.cpp:56 mgllab/dialogs.cpp:737
+msgid "Short description of selected command"
+msgstr "Краткое описание выбранной команды"
+
+#: udav/info_dlg.cpp:54
+msgid "Short information about the data."
+msgstr "Краткая информация о данных"
+
+#: udav/hint_dlg.cpp:62
+msgid "Show at startup"
+msgstr "Показать при запуске"
+
+#: udav/udav_wnd.cpp:210
+msgid ""
+"Show calculator which evaluate and help to type textual formulas.\n"
+"Textual formulas may contain data variables too."
+msgstr ""
+"Показать калькулятор, который вычисляет текстовые формулы,\n"
+"которые могут содержать и переменные из скрипта."
+
+#: mgllab/editor.cpp:525 mgllab/editor.cpp:527
+msgid "Show calculator window"
+msgstr "Показать окно калькулятора"
+
+#: widgets/fltk.cpp:912
+msgid "Show custom dialog for plot setup"
+msgstr "Показать диалог настроек графика"
+
+#: udav/udav_wnd.cpp:314
+msgid "Show dialog for UDAV properties."
+msgstr "Показать диалог настроек UDAV"
+
+#: udav/text_pnl.cpp:560 udav/plot_pnl.cpp:441
+msgid "Show dialog for new command or edit arguments of existed one."
+msgstr "Показать диалог ввода новой команды или редактирования существующей"
+
+#: udav/text_pnl.cpp:564 udav/plot_pnl.cpp:446
+msgid "Show dialog for new inplot and put it into the script."
+msgstr "Показать диалог создания под-графика и вставки его в скрипт"
+
+#: udav/text_pnl.cpp:577
+msgid ""
+"Show dialog for options and put it into the script.\n"
+"Options are used for additional setup the plot."
+msgstr ""
+"Показать диалог ввода опций и вставки их в скрипт.\n"
+"Опции используются для дополнительной настройки графика."
+
+#: udav/text_pnl.cpp:598
+msgid ""
+"Show dialog for plot setup and put code into the script.\n"
+"This dialog setup axis, labels, lighting and other general things."
+msgstr "Показать диалог настройки рисунка: осей, подписей, освещения и пр."
+
+#: udav/text_pnl.cpp:573
+msgid ""
+"Show dialog for styles and put it into the script.\n"
+"Styles define the plot view (color scheme, marks, dashing and so on)."
+msgstr ""
+"Показать диалог стиля графика и вставить его в скрипт.\n"
+"Стиль задает цветовую схему, маркеры, штриховку и пр."
+
+#: udav/text_pnl.cpp:548
+msgid "Show dialog for text finding (Ctrl+F)."
+msgstr "Показать диалог поиска текста (Ctrl+F)."
+
+#: udav/udav_wnd.cpp:326
+msgid "Show help on MGL commands (F1)."
+msgstr "Показать справку по командам MGL (F1)."
+
+#: udav/udav_wnd.cpp:219
+msgid "Show hidden plots"
+msgstr "Показать скрытые графики"
+
+#: mgllab/help.cpp:303
+msgid "Show hint on startup"
+msgstr "Показать подсказки при старте"
+
+#: udav/udav_wnd.cpp:330
+msgid "Show hints of MGL usage."
+msgstr "Показать подсказки по использованию MGL."
+
+#: udav/udav_wnd.cpp:213
+msgid "Show info"
+msgstr "Показать информацию"
+
+#: mgllab/mgllab.cpp:314
+msgid "Show lines"
+msgstr "Показать строки"
+
+#: widgets/fltk.cpp:909
+msgid "Show next frame in slideshow"
+msgstr "Показать следующий кадр"
+
+#: widgets/qt.cpp:1262 udav/plot_pnl.cpp:563
+msgid "Show next slide (Ctrl+.)."
+msgstr "Показать следующий кадр (Ctrl+.)."
+
+#: widgets/fltk.cpp:904
+msgid "Show previous frame in slideshow"
+msgstr "Показать предыдущий кадр"
+
+#: widgets/qt.cpp:1271 udav/plot_pnl.cpp:578
+msgid "Show previous slide (Ctrl+,)."
+msgstr "Показать предыдущий кадр (Ctrl+,)."
+
+#: mgllab/table.cpp:779
+msgid "Sin FFT"
+msgstr "Синус-Фурье"
+
+#: udav/dat_pnl.cpp:620
+msgid "Sin-Fourier transform along direction(s)"
+msgstr "Синус-Фурье преобразование вдоль направления"
+
+#: src/exec_dat.cpp:1711
+msgid "Sin-Fourier transform at some direction"
+msgstr "Синус-Фурье преобразование вдоль направления"
+
+#: mgllab/table.cpp:165
+msgid "Sinus FFT"
+msgstr "Синус-Фурье"
+
+#: udav/opt_dlg.cpp:70 mgllab/dialogs.cpp:104 mgllab/dialogs.cpp:359
+msgid "Size"
+msgstr "Размер"
+
+#: udav/subplot_dlg.cpp:114
+msgid "Size of column"
+msgstr "Размер колонки"
+
+#: udav/subplot_dlg.cpp:131
+msgid "Size of stick"
+msgstr "Размер бруска"
+
+#. size menu
+#: udav/mem_pnl.cpp:68 udav/dat_pnl.cpp:765 mgllab/dialogs.cpp:1015
+#: mgllab/table.cpp:759
+msgid "Sizes"
+msgstr "Размеры"
+
+#: src/parser.cpp:1482
+msgid "Skip commands and iterate for-loop again"
+msgstr "Пропустить команды до конца цикла for"
+
+#: widgets/qt.cpp:1264 udav/plot_pnl.cpp:566
+msgid "Slideshow"
+msgstr "Анимация"
+
+#: mgllab/table.cpp:163 mgllab/table.cpp:773
+msgid "Smooth"
+msgstr "Сгладить"
+
+#: src/exec_dat.cpp:1712
+msgid "Smooth data"
+msgstr "Сгладить массив данных"
+
+#: udav/dat_pnl.cpp:613
+msgid "Smooth data along direction(s)"
+msgstr "Сгладить массив данных по направлению"
+
+#: src/exec_dat.cpp:1695
+msgid "Solve Hamiltonian ODE (find GO ray or trajectory)"
+msgstr "Решить гамильтонову ОДУ (найти ГО луч/траекторию)"
+
+#: src/exec_dat.cpp:1685
+msgid "Solve ODE"
+msgstr "Решить систему обыкновенных диф. уравнений"
+
+#: src/exec_dat.cpp:1687
+msgid "Solve PDE"
+msgstr "Решить уравнение в частных производных"
+
+#: src/exec_dat.cpp:1693
+msgid "Solve PDE in accompanied coordinates for 2d case"
+msgstr "Решить PDE в сопровождающей системе координат (2d)"
+
+#: src/exec_dat.cpp:1694
+msgid "Solve PDE in accompanied coordinates for 3d case"
+msgstr "Решить PDE в сопровождающей системе координат (3d)"
+
+#: src/exec_dat.cpp:1635
+msgid "Solve PDE using advanced method (X-Y only)"
+msgstr "Решить PDE (сложные уравнения, 2d случай)"
+
+#: src/exec_dat.cpp:1726
+msgid "Solve tridiagonal matrix"
+msgstr "Решить трехдиагональную систему"
+
+#: src/exec_dat.cpp:1714
+msgid "Sort data by values in column"
+msgstr "Сортировать данные по значениям в колонке"
+
+#: udav/prop_dlg.cpp:141
+msgid "Spanish"
+msgstr ""
+
+#: udav/calc_dlg.cpp:194
+msgid "Special"
+msgstr "Специальные"
+
+#: mgllab/table.cpp:129
+msgid ""
+"Specify new data size\n"
+"Data will be interpolated"
+msgstr ""
+"Укажите новый размер данных.\n"
+"Данные будут интерполированы."
+
+#: mgllab/table.cpp:114
+msgid ""
+"Specify new data size\n"
+"Data will be zero filled"
+msgstr ""
+"Укажите новый размер данных.\n"
+"Данные будут обнулены."
+
+#: mgllab/table.cpp:144
+msgid ""
+"Specify the skipping step\n"
+"Each m-th point will be saved only"
+msgstr ""
+"Укажите шаг пропуска.\n"
+"Только каждая m-ая точка будет сохранена."
+
+#: udav/dat_pnl.cpp:778 mgllab/table.cpp:762
+msgid "Squeeze"
+msgstr "Сжать"
+
+#: src/exec_dat.cpp:1715
+msgid "Squeeze data"
+msgstr "Сжать данные"
+
+#: udav/setup_dlg.cpp:84
+msgid "Start"
+msgstr "Старт"
+
+#: src/parser.cpp:1492
+msgid "Start function definition and stop execution of main script"
+msgstr "Начало определения функции и остановка выполнения основного скрипта"
+
+#: src/parser.cpp:1495
+msgid "Start next for-loop iteration"
+msgstr "Начать новую итерацию цикла for"
+
+#: src/parser.cpp:1496
+msgid "Start/close commands which should executed only once"
+msgstr "Начало/конец блока команд, которые будут выполняться единожды"
+
+#: udav/subplot_dlg.cpp:76
+msgid "Starting cell index"
+msgstr "Индекс начальной ячейки"
+
+#: udav/setup_dlg.cpp:117
+msgid "State"
+msgstr "Состояние"
+
+#: src/exec_dat.cpp:1651
+msgid "Step for pulse diffraction"
+msgstr "Шаг для расчета дифракции импульса"
+
+#: widgets/qt.cpp:1148 udav/plot_pnl.cpp:347
+msgid "Stop"
+msgstr "Стоп"
+
+#: widgets/fltk.cpp:871
+msgid "Stop drawing"
+msgstr "Остановить рисование"
+
+#: src/parser.cpp:1498
+msgid "Stop execution"
+msgstr "Остановить выполнение скрипта"
+
+#: udav/plot_pnl.cpp:349
+msgid "Stop script execution (F7)."
+msgstr "Остановить выполнение скрипта (F7)"
+
+#: udav/args_dlg.cpp:59 mgllab/mathgl.cpp:164
+msgid "String for $0"
+msgstr "Строка для $0"
+
+#: udav/args_dlg.cpp:41 mgllab/mathgl.cpp:146
+msgid "String for $1"
+msgstr "Строка для $1"
+
+#: udav/args_dlg.cpp:43 mgllab/mathgl.cpp:148
+msgid "String for $2"
+msgstr "Строка для $2"
+
+#: udav/args_dlg.cpp:45 mgllab/mathgl.cpp:150
+msgid "String for $3"
+msgstr "Строка для $3"
+
+#: udav/args_dlg.cpp:47 mgllab/mathgl.cpp:152
+msgid "String for $4"
+msgstr "Строка для $4"
+
+#: udav/args_dlg.cpp:49 mgllab/mathgl.cpp:154
+msgid "String for $5"
+msgstr "Строка для $5"
+
+#: udav/args_dlg.cpp:51 mgllab/mathgl.cpp:156
+msgid "String for $6"
+msgstr "Строка для $6"
+
+#: udav/args_dlg.cpp:53 mgllab/mathgl.cpp:158
+msgid "String for $7"
+msgstr "Строка для $7"
+
+#: udav/args_dlg.cpp:55 mgllab/mathgl.cpp:160
+msgid "String for $8"
+msgstr "Строка для $8"
+
+#: udav/args_dlg.cpp:57 mgllab/mathgl.cpp:162
+msgid "String for $9"
+msgstr "Строка для $9"
+
+#: udav/files_dlg.cpp:38
+msgid "String for %1"
+msgstr "Строка для %1"
+
+#: udav/files_dlg.cpp:40
+msgid "String for %2"
+msgstr "Строка для %2"
+
+#: udav/files_dlg.cpp:42
+msgid "String for %3"
+msgstr "Строка для %3"
+
+#: udav/files_dlg.cpp:44
+msgid "String for %4"
+msgstr "Строка для %4"
+
+#: udav/files_dlg.cpp:46
+msgid "String for %5"
+msgstr "Строка для %5"
+
+#: udav/files_dlg.cpp:48
+msgid "String for %6"
+msgstr "Строка для %6"
+
+#: udav/files_dlg.cpp:50
+msgid "String for %7"
+msgstr "Строка для %7"
+
+#: udav/files_dlg.cpp:52
+msgid "String for %8"
+msgstr "Строка для %8"
+
+#: udav/files_dlg.cpp:54
+msgid "String for %9"
+msgstr "Строка для %9"
+
+#: udav/prop_dlg.cpp:85
+msgid "Strings"
+msgstr "Строки"
+
+#: udav/subplot_dlg.cpp:208 mgllab/dialogs.cpp:1314
+msgid "Style"
+msgstr "Стиль"
+
+#: udav/setup_dlg.cpp:80
+msgid "SubTicks"
+msgstr "Подметки"
+
+#: mgllab/dialogs.cpp:959
+msgid "Subticks"
+msgstr "Подметки"
+
+#: src/exec_dat.cpp:1718
+msgid "Subtract data or number"
+msgstr "Вычесть данные или число"
+
+#: mgllab/table.cpp:797
+msgid "Subtract to"
+msgstr "Вычесть"
+
+#: udav/prop_dlg.cpp:94
+msgid "Suffixes"
+msgstr "Суффиксы"
+
+#: udav/dat_pnl.cpp:539
+msgid "Sum along direction(s)"
+msgstr "Суммировать вдоль направления"
+
+#: udav/dat_pnl.cpp:614
+msgid "Summarize data along direction(s)"
+msgstr "Суммировать вдоль направления"
+
+#. { _("Histogram of"),        0, hist_cb },
+#: mgllab/table.cpp:342 mgllab/table.cpp:790
+msgid "Summation of"
+msgstr "Сумма от"
+
+#: src/exec_dat.cpp:1720
+msgid "Swap data (useful after Fourier transform)"
+msgstr "Поменять местами левую и правую части данных"
+
+#: udav/dat_pnl.cpp:618
+msgid "Swap data along direction(s)"
+msgstr "Поменять местами данные по направлению"
+
+#: mgllab/table.cpp:164 mgllab/table.cpp:778
+msgid "Swap parts"
+msgstr "Поменять местами"
+
+#: src/exec_set.cpp:797
+msgid "Switch on/off fog"
+msgstr "Вкл/выкл туман"
+
+#: src/exec_set.cpp:799
+msgid "Switch on/off gray-scale mode"
+msgstr "Вкл/выкл режим оттенков серого"
+
+#: widgets/fltk.cpp:858
+msgid "Switch on/off grid drawing"
+msgstr "Вкл/выкл рисование сетки"
+
+#: udav/plot_pnl.cpp:307
+msgid "Switch on/off grid of absolute coordinates (Ctrl+G)."
+msgstr "Вкл/выкл сетку абсолютных координат (Ctrl+G)."
+
+#: widgets/qt.cpp:1121
+msgid "Switch on/off lightning for the graphics (Alt+L)."
+msgstr "Вкл/выкл освещение графика (Alt+L)."
+
+#: udav/plot_pnl.cpp:301
+msgid "Switch on/off lightning for the graphics (Ctrl+L)."
+msgstr "Вкл/выкл освещение графика (Ctrl+L)."
+
+#: widgets/fltk.cpp:855
+msgid "Switch on/off lightning in the picture"
+msgstr "Вкл/выкл освещение графика"
+
+#: widgets/qt.cpp:1127 udav/plot_pnl.cpp:314
+msgid ""
+"Switch on/off mouse handling of the graphics\n"
+"(rotation, shifting, zooming and perspective)."
+msgstr ""
+"Вкл/выкл изменение графика мышью\n"
+"(вращение, сдвиг, приближение и перспективу)."
+
+#: widgets/qt.cpp:1133
+msgid "Switch on/off mouse zoom of selected region."
+msgstr "Вкл/выкл приближение мышью выбранной области."
+
+#: src/exec_set.cpp:830
+msgid "Switch on/off to use ternary axis"
+msgstr "Указать тип тернарных координат или проекций"
+
+#: src/exec_set.cpp:778
+msgid "Switch on/off transparency"
+msgstr "Вкл/выкл прозрачность"
+
+#: widgets/qt.cpp:1115
+msgid "Switch on/off transparency for the graphics (Alt+T)."
+msgstr "Вкл/выкл прозрачность рисунка (Alt+T)."
+
+#: udav/plot_pnl.cpp:294
+msgid "Switch on/off transparency for the graphics (Ctrl+T)."
+msgstr "Вкл/выкл прозрачность рисунка (Ctrl+T)."
+
+#: widgets/fltk.cpp:852
+msgid "Switch on/off transparency in the picture"
+msgstr "Вкл/выкл прозрачность рисунка"
+
+#: mgllab/table.cpp:552
+msgid "Symmetrical range"
+msgstr "Симметричный диапазон"
+
+#: udav/dat_pnl.cpp:366
+msgid "Symmetrical?"
+msgstr "Симметрично?"
+
+#: src/addon.cpp:111 src/base_cf.cpp:268
+#, c-format
+msgid "TEST: %s\n"
+msgstr "ТЕСТ: %s\n"
+
+#: udav/open_dlg.cpp:82 udav/setup_dlg.cpp:88 mgllab/dialogs.cpp:961
+msgid "Template"
+msgstr "Шаблон"
+
+#: udav/setup_dlg.cpp:140
+msgid "Template name"
+msgstr "Имя шаблона"
+
+#: udav/setup_dlg.cpp:163
+msgid "Template saved"
+msgstr "Шаблон сохранен"
+
+#: mgllab/dialogs.cpp:1038
+msgid "Ternary"
+msgstr "Тернарный"
+
+#: mgllab/dialogs.cpp:1472
+msgid "Text"
+msgstr "Текст"
+
+#: udav/style_dlg.cpp:167 mgllab/dialogs.cpp:376
+msgid "Text align"
+msgstr "Выравнивание"
+
+#: udav/newcmd_dlg.cpp:172 mgllab/dialogs.cpp:713
+msgid "Text and legend"
+msgstr "Текст и легенда"
+
+#: udav/style_dlg.cpp:164
+msgid "Text color"
+msgstr "Цвет текста"
+
+#: udav/style_dlg.cpp:123 mgllab/dialogs.cpp:343
+msgid "Text on contours"
+msgstr "Текст на кривых"
+
+#: mgllab/dialogs.cpp:367
+msgid "Text style"
+msgstr "Стиль текста"
+
+#: udav/hint_dlg.cpp:48 mgllab/help.cpp:282
+msgid ""
+"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."
+msgstr ""
+"Калькулятор поможет вставить в скрипт сложное выражение. Просто наберите в "
+"калькуляторе выражение (которое может зависеть от координат x,y,z и др.) и "
+"вставьте его в скрипт."
+
+#: mgllab/editor.cpp:280
+msgid ""
+"The current file has not been saved.\n"
+"Would you like to save it now?"
+msgstr "Текущий документ не сохранен. Сохранить сейчас?"
+
+#: udav/hint_dlg.cpp:50 mgllab/help.cpp:284
+msgid ""
+"The special dialog (Edit|Insert|New Command) help you select the command, "
+"fill its arguments and put it into the script."
+msgstr ""
+"Специальный диалог (Правка|Вставить|Новая команда) поможет Вам выбрать "
+"команду, заполнить ее аргументы и вставить в скрипт."
+
+#: src/crust.cpp:591
+msgid ""
+"There are duplicated or indistinguishably adjacent points for triangulation."
+msgstr "Повторяющиеся или близкие точки при триангуляции"
+
+#. mglScrStr
+#: src/base.cpp:245
+msgid "There is changing temporary data in script"
+msgstr "Попытка изменить временные данные в скрипте"
+
+#: udav/text_pnl.cpp:124
+msgid "There is manual primitives."
+msgstr "Есть примитивы, заданные вручную"
+
+#: udav/newcmd_dlg.cpp:341
+msgid "There is no 'fmt' argument for this command"
+msgstr "Отсутствует 'fmt' аргумент для этой команды"
+
+#: udav/text_pnl.cpp:137 mgllab/editor.cpp:680
+msgid "There is no fitted formula."
+msgstr "Нет подобранной формулы."
+
+#: utils/mglcgi.cpp:74
+#, c-format
+msgid "There is no query. Exit.\n"
+msgstr "Нет запроса. Выхожу.\n"
+
+#: udav/text_pnl.cpp:109
+msgid "There is no selection to evaluate."
+msgstr "Ничего не выделено для вычисления."
+
+#: udav/hint_dlg.cpp:47 mgllab/help.cpp:281
+msgid ""
+"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."
+msgstr ""
+"Есть мощный калькулятор с большим числом специальных функций. Выражения "
+"можно набирать кнопками или с клавиатуры. Также можно использовать "
+"переменные из скрипта."
+
+#. mglScrCmd
+#: src/base.cpp:243
+msgid "There is too long string(s) in script"
+msgstr "Слишком длинная строка в скрипте"
+
+#. mglScrLong
+#: src/base.cpp:244
+msgid "There is unbalanced ' in script"
+msgstr "Лишняя кавычка ' в скрипте"
+
+#. mglWarnSpc
+#: src/base.cpp:241
+msgid "There is wrong argument(s) in script"
+msgstr "Неправильные аргументы команды в скрипте"
+
+#. mglScrArg
+#: src/base.cpp:242
+msgid "There is wrong command(s) in script"
+msgstr "В скрипте неправильная команд(ы)"
+
+#: widgets/fltk.cpp:884
+msgid "Theta angle (tilt z-axis)"
+msgstr "Угол Theta (наклон оси z)"
+
+#: widgets/fltk.cpp:1187
+msgid "This is for parameter "
+msgstr "Это для параметра "
+
+#: mgllab/table.cpp:494
+msgid "This operation is not supported for this kind of data."
+msgstr "Операция не поддерживается для этого типа данных."
+
+#: udav/setup_dlg.cpp:76 mgllab/dialogs.cpp:955
+msgid "Ticks"
+msgstr "Метки"
+
+#: mgllab/dialogs.cpp:960
+msgid "Ticks start"
+msgstr "Начать с"
+
+#: mgllab/dialogs.cpp:1031
+msgid "Time ticks"
+msgstr "Метки времени"
+
+#: udav/subplot_dlg.cpp:204 mgllab/dialogs.cpp:1313
+msgid "Title"
+msgstr "Заголовок"
+
+#: udav/subplot_dlg.cpp:206
+msgid "Title for plot. Can be used in SubPlot or MultiPlot only."
+msgstr "Заголовок для графика. Следует использовать в SubPlot или MultiPlot"
+
+#: udav/dat_pnl.cpp:351 udav/dat_pnl.cpp:366 udav/dat_pnl.cpp:377
+#: udav/dat_pnl.cpp:424 udav/dat_pnl.cpp:453 mgllab/table.cpp:609
+msgid "To"
+msgstr "до"
+
+#: udav/calc_dlg.cpp:66 udav/setup_dlg.cpp:147
+msgid "To script"
+msgstr "В скрипт"
+
+#: udav/dat_pnl.cpp:790
+msgid "Transform"
+msgstr "Трансформация"
+
+#: udav/dat_pnl.cpp:792
+msgid "Transform data along dimension(s) (Ctrl+Shift+T)."
+msgstr "Трансформация данных по направлению (Ctrl+Shift+T)."
+
+#: mgllab/dialogs.cpp:346
+msgid "Transparency"
+msgstr "Прозрачность"
+
+#: mgllab/dialogs.cpp:1043
+msgid "Transparency type"
+msgstr "Тип прозрачности"
+
+#: mgllab/table.cpp:764
+msgid "Transpose"
+msgstr "Транспонировать"
+
+#: mgllab/table.cpp:671
+msgid "Transpose data"
+msgstr "Транспонировать данные"
+
+#: src/exec_dat.cpp:1724
+msgid "Transpose data array"
+msgstr "Транспонировать данные"
+
+#: mgllab/table.cpp:862
+msgid "Transpose data dimensions"
+msgstr "Транспонировать данные"
+
+#: udav/dat_pnl.cpp:612
+msgid "Transpose data with new dimensions"
+msgstr "Транспонировать данные"
+
+#: udav/calc_dlg.cpp:192
+msgid "Trigonometric"
+msgstr "Тригонометрия"
+
+#: mgllab/dialogs.cpp:1034
+msgid "Tune ticks"
+msgstr "Настроить метки"
+
+#: mgllab/table.cpp:169 mgllab/table.cpp:344
+msgid "Type of operation"
+msgstr "Тип операции"
+
+#: mgllab/table.cpp:174
+msgid "Type of smoothing"
+msgstr "Тип сглаживания"
+
+#. N
+#: udav/style_dlg.cpp:246 mgllab/dialogs.cpp:54
+msgid "U - indigo"
+msgstr "U - темно-фиолетовый"
+
+#: udav/text_pnl.cpp:109 udav/text_pnl.cpp:124 udav/text_pnl.cpp:137
+#: udav/udav_wnd.cpp:340
+msgid "UDAV"
+msgstr ""
+
+#: udav/opt_dlg.cpp:31
+msgid "UDAV - Add options"
+msgstr "UDAV - добавить опции"
+
+#: udav/anim_dlg.cpp:35
+msgid "UDAV - Animation setup"
+msgstr "UDAV - настройка анимации"
+
+#: udav/dat_pnl.cpp:388
+msgid "UDAV - Clear data"
+msgstr "UDAV - очистить данные"
+
+#: udav/dat_pnl.cpp:424
+msgid "UDAV - Crop data"
+msgstr "UDAV - обрезать данные"
+
+#: udav/dat_pnl.cpp:255
+msgid "UDAV - Export to PNG"
+msgstr "UDAV - экспорт в PNG"
+
+#: udav/dat_pnl.cpp:351
+msgid "UDAV - Fill data"
+msgstr "UDAV - заполнить данные"
+
+#: udav/find_dlg.cpp:33
+msgid "UDAV - Find"
+msgstr "UDAV - найти"
+
+#: udav/dat_pnl.cpp:485
+msgid "UDAV - Go to slice"
+msgstr "UDAV - перейти к срезу"
+
+#: udav/hint_dlg.cpp:55
+msgid "UDAV - Hint"
+msgstr "UDAV - подсказки"
+
+#: udav/dat_pnl.cpp:277
+msgid "UDAV - Import PNG"
+msgstr "UDAV - импорт PNG"
+
+#: udav/prop_dlg.cpp:192 udav/prop_dlg.cpp:198 udav/newcmd_dlg.cpp:322
+#: udav/text_pnl.cpp:145 udav/open_dlg.cpp:101
+msgid "UDAV - Insert filename"
+msgstr "UDAV - вставить имя файла"
+
+#: udav/newcmd_dlg.cpp:327 udav/text_pnl.cpp:152
+msgid "UDAV - Insert path"
+msgstr "UDAV - вставить путь"
+
+#: udav/style_dlg.cpp:48 udav/data_dlg.cpp:33
+msgid "UDAV - Insert style/scheme"
+msgstr "UDAV - вставить стиль"
+
+#: udav/dat_pnl.cpp:270
+msgid "UDAV - Load data"
+msgstr "UDAV - загрузить данные"
+
+#: udav/dat_pnl.cpp:450
+msgid "UDAV - Make histogram"
+msgstr "UDAV - создать гистограмму"
+
+#: udav/mem_pnl.cpp:84
+msgid "UDAV - New variable"
+msgstr "UDAV - новая переменная"
+
+#: udav/dat_pnl.cpp:377
+msgid "UDAV - Normalize by slice"
+msgstr "UDAV - нормировать по срезам"
+
+#: udav/dat_pnl.cpp:366
+msgid "UDAV - Normalize data"
+msgstr "UDAV - нормировать данные"
+
+#: udav/open_dlg.cpp:49
+msgid "UDAV - Open data file"
+msgstr "UDAV - открыть файл данных"
+
+#: udav/udav_wnd.cpp:633
+msgid "UDAV - Open file"
+msgstr "UDAV - открыть файл"
+
+#: udav/prop_dlg.cpp:60 udav/prop_dlg.cpp:285
+msgid "UDAV - Properties"
+msgstr "UDAV - свойства"
+
+#: udav/dat_pnl.cpp:283
+msgid "UDAV - Read from HDF"
+msgstr "UDAV - загрузить из HDF"
+
+#: udav/dat_pnl.cpp:436
+msgid "UDAV - Rearrange data"
+msgstr "UDAV - упорядочить размеры данных"
+
+#: udav/dat_pnl.cpp:402
+msgid "UDAV - Resize data"
+msgstr "UDAV - изменить размер данных"
+
+#: udav/setup_dlg.cpp:159 udav/setup_dlg.cpp:163
+msgid "UDAV - Save template"
+msgstr "UDAV - сохранить шаблон"
+
+#: udav/dat_pnl.cpp:261
+msgid "UDAV - Save to HDF"
+msgstr "UDAV - сохранить в HDF"
+
+#: udav/dat_pnl.cpp:248
+msgid "UDAV - Save/export data"
+msgstr "UDAV - сохранить/экспортировать данные"
+
+#: udav/args_dlg.cpp:32
+msgid "UDAV - Set script arguments"
+msgstr "UDAV - задать аргументы"
+
+#: udav/files_dlg.cpp:29
+msgid "UDAV - Set template parameters"
+msgstr "UDAV - задать шаблон параметров"
+
+#: udav/subplot_dlg.cpp:37
+msgid "UDAV - Setup inplot"
+msgstr "UDAV - настройки под-графика"
+
+#: udav/setup_dlg.cpp:39 udav/setup_dlg.cpp:190
+msgid "UDAV - Setup plot"
+msgstr "UDAV - настройки графика"
+
+#: udav/dat_pnl.cpp:413
+msgid "UDAV - Squeeze data"
+msgstr "UDAV - сжать данные"
+
+#: udav/udav_wnd.cpp:456
+msgid "UDAV - about"
+msgstr "UDAV - о программе"
+
+#: udav/anim_dlg.cpp:105
+msgid "UDAV - animation"
+msgstr "UDAV - анимация"
+
+#: udav/dat_pnl.cpp:608
+msgid "UDAV - change data"
+msgstr "UDAV - изменить данные"
+
+#: udav/opt_dlg.cpp:94 udav/opt_dlg.cpp:101 udav/opt_dlg.cpp:108
+#: udav/opt_dlg.cpp:115
+msgid "UDAV - command options"
+msgstr "UDAV - опции команды"
+
+#: udav/mem_pnl.cpp:121
+msgid "UDAV - delete all data"
+msgstr "UDAV - удалить все данные"
+
+#: udav/text_pnl.cpp:202
+msgid "UDAV - find text"
+msgstr "UDAV - найти текст"
+
+#: udav/dat_pnl.cpp:536 udav/dat_pnl.cpp:566 udav/dat_pnl.cpp:572
+#: udav/dat_pnl.cpp:643
+msgid "UDAV - make new data"
+msgstr "UDAV - создать новый массив данных"
+
+#: udav/text_pnl.cpp:431
+msgid "UDAV - open file"
+msgstr "UDAV - открыть файл"
+
+#: udav/udav_wnd.cpp:569 udav/udav_wnd.cpp:579 udav/udav_wnd.cpp:621
+msgid "UDAV - save current"
+msgstr "UDAV - сохранить текущий"
+
+#: udav/udav_wnd.cpp:669
+msgid "UDAV - save file"
+msgstr "UDAV - сохранить файл"
+
+#: udav/style_dlg.cpp:160 mgllab/dialogs.cpp:371
+msgid "Underline"
+msgstr "Подчеркивание"
+
+#. edit menu
+#: udav/text_pnl.cpp:516 mgllab/mgllab.cpp:308
+msgid "Undo"
+msgstr "Отмена"
+
+#: udav/text_pnl.cpp:518
+msgid "Undo editor change (Ctrl+Z)."
+msgstr "Отменить изменения в редакторе (Ctrl+Z)."
+
+#: mgllab/mgllab.cpp:137
+msgid "Untitled"
+msgstr "без имени"
+
+#: mgllab/mgllab.cpp:360 mgllab/mgllab.cpp:364
+msgid "Untitled - mgllab"
+msgstr "без имени - mgllab"
+
+#: widgets/fltk.cpp:1104
+msgid "Update"
+msgstr "Обновить"
+
+#: udav/mem_pnl.cpp:62
+msgid "Update list of data arrays"
+msgstr "Обновить список массивов данных"
+
+#: mgllab/dialogs.cpp:100
+msgid "Upper border for determining color or alpha"
+msgstr "Верхняя граница для цвета или прозрачности"
+
+#: utils/mglconv.cpp:83
+#, c-format
+msgid "Usage:\tmglconv [parameter(s)] scriptfile\n"
+msgstr "Использование:\tmglconv [параметр(ы)] имя_скрипта\n"
+
+#: mgllab/mgllab.cpp:432
+#, c-format
+msgid "Usage:\tmgllab [parameter(s)] scriptfile\n"
+msgstr "Использование:\tmgllab [параметр(ы)] имя_скрипта\n"
+
+#: utils/mglview.cpp:83
+#, c-format
+msgid "Usage:\tmglview [parameter(s)] scriptfile\n"
+msgstr "Использование:\tmglview [параметр(ы)] имя_скрипта\n"
+
+#: widgets/glut.cpp:103
+#, c-format
+msgid ""
+"Use 'a', 'd', 'w', 's', 'q', 'e' for changing view angles\n"
+"Use 'j', 'l', 'i', 'k' for changing light angles\n"
+"Use 'u', 'o' for changing distance to light\n"
+"Use 'r' for switching transparency\n"
+"Use 'f' for switching lightning\n"
+"Use 'E' for exporting to EPS file\n"
+"Use 'S' for exporting to SVG file\n"
+"Use 'J' for exporting to JPEG file\n"
+"Use 'P' for exporting to PNG file\n"
+"Use ',', '.' for show other frames\n"
+"Use 'm' for view movie\n"
+"Use 'h' for view this text\n"
+"Use 'x' for exit\n"
+msgstr ""
+"* 'a', 'd', 'w', 's', 'q', 'e' для изменения углов просмотра\n"
+"* 'j', 'l', 'i', 'k' для изменения углов освещения\n"
+"* 'u', 'o' для изменения расстояния до источника света\n"
+"* 'r' для переключения прозрачности\n"
+"* 'f' для переключения освещения\n"
+"* 'E' для экспорта в EPS\n"
+"* 'S' для экспорта в SVG\n"
+"* 'J' для экспорта в JPEG\n"
+"* 'P' для экспорта в PNG\n"
+"* ',', '.' для показа других кадров\n"
+"* 'm' для запуска анимации\n"
+"* 'h' для этого Сообщения\n"
+"* 'x' для выхода\n"
+
+#: udav/style_dlg.cpp:162
+msgid "Use color scheme"
+msgstr "Использовать цветовую схему"
+
+#: udav/prop_dlg.cpp:175
+msgid "Use dots plot for preview"
+msgstr "Использовать точки для просмотра"
+
+#: mgllab/mgllab.cpp:492
+msgid "Use multi-threading for drawing"
+msgstr "Рисование в отдельном потоке"
+
+#: udav/newcmd_dlg.cpp:67 udav/opt_dlg.cpp:68 mgllab/dialogs.cpp:101
+msgid "Value"
+msgstr "Значение"
+
+#: mgllab/dialogs.cpp:398
+msgid "Value for i-th color"
+msgstr "Значение для i-го цвета"
+
+#: mgllab/dialogs.cpp:727 mgllab/dialogs.cpp:1047
+msgid "Variant"
+msgstr "Вариант"
+
+#: mgllab/dialogs.cpp:728
+msgid ""
+"Variant 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."
+msgstr ""
+"Вариант порядка аргументов команды. Обозначения:\n"
+" * Заглавные -- данные (например, Ydat);\n"
+" * В кавычках '' -- строки (например, 'fmt');\n"
+" * Прочие -- числа (например, zval);\n"
+" * Аргументы в скобках [] -- не обязательные."
+
+#: udav/newcmd_dlg.cpp:170 mgllab/dialogs.cpp:711
+msgid "Vector plots"
+msgstr "Векторные графики"
+
+#: mgllab/dialogs.cpp:379
+msgid "Vertical align"
+msgstr "По вертикали"
+
+#: udav/subplot_dlg.cpp:55 udav/subplot_dlg.cpp:72 udav/subplot_dlg.cpp:97
+msgid "Vertical size"
+msgstr "Вертикальный размер"
+
+#. k
+#: udav/style_dlg.cpp:236 mgllab/dialogs.cpp:44
+msgid "W - lightgray"
+msgstr "W - светло-серый"
+
+#: src/exec_dat.cpp:1728
+msgid "Wavelet transform at some direction"
+msgstr "Wavelet преобразование вдоль направления"
+
+#: udav/subplot_dlg.cpp:195
+msgid "Whole area"
+msgstr "Вся область"
+
+#: mgllab/mgllab.cpp:495
+msgid "Widget scheme"
+msgstr "Вид виджетов"
+
+#: mgllab/dialogs.cpp:329
+msgid "Width"
+msgstr "Ширина"
+
+#: udav/subplot_dlg.cpp:80
+msgid "Width of selected cells"
+msgstr "Ширины выбранных ячеек"
+
+#: src/data.cpp:1427
+#, c-format
+msgid ""
+"Widths are:\n"
+"Wa = %g\tWx = %g\tWy = %g\tWz = %g\n"
+msgstr "Ширины: Wa = %g\tWx = %g\tWy = %g\tWz = %g\n"
+
+#: mgllab/dialogs.cpp:348
+msgid "Wire or mesh"
+msgstr "Сетчатый"
+
+#: udav/style_dlg.cpp:120
+msgid "Wire or mesh plot"
+msgstr "Сетчатый график"
+
+#: udav/style_dlg.cpp:159 mgllab/dialogs.cpp:370
+msgid "Wire style"
+msgstr "Контур"
+
+#: src/exec_set.cpp:839
+msgid "Write current image to graphical file"
+msgstr "Сохранить текущий рисунок в файл"
+
+#: udav/setup_dlg.cpp:48 mgllab/dialogs.cpp:950
+msgid "X axis"
+msgstr "Ось X"
+
+#: udav/setup_dlg.cpp:118
+msgid "X pos"
+msgstr "X коор."
+
+#: mgllab/dialogs.cpp:1065
+msgid "X position"
+msgstr "X коор."
+
+#: udav/dat_pnl.cpp:413
+msgid "X-direction"
+msgstr "X-направление"
+
+#: udav/opt_dlg.cpp:38 mgllab/dialogs.cpp:85
+msgid "X-range"
+msgstr "X-диапазон"
+
+#: udav/dat_pnl.cpp:388 udav/dat_pnl.cpp:402 udav/dat_pnl.cpp:436
+msgid "X-size"
+msgstr "Размер по X"
+
+#: mgllab/dialogs.cpp:568
+msgid "X-slice from"
+msgstr "Х срез от"
+
+#: udav/subplot_dlg.cpp:176
+msgid "X/Z"
+msgstr ""
+
+#: widgets/qt.cpp:1094 udav/plot_pnl.cpp:489
+msgid "XYZ"
+msgstr ""
+
+#. M
+#: udav/style_dlg.cpp:242 mgllab/dialogs.cpp:50
+msgid "Y - olive"
+msgstr "Y - оливковый"
+
+#: udav/setup_dlg.cpp:49 mgllab/dialogs.cpp:963
+msgid "Y axis"
+msgstr "Ось Y"
+
+#: udav/setup_dlg.cpp:119
+msgid "Y pos"
+msgstr "Y коор."
+
+#: mgllab/dialogs.cpp:1066
+msgid "Y position"
+msgstr "Y коор."
+
+#: udav/dat_pnl.cpp:413
+msgid "Y-direction"
+msgstr "Y-направление"
+
+#: udav/opt_dlg.cpp:41 mgllab/dialogs.cpp:89
+msgid "Y-range"
+msgstr "Y-диапазон"
+
+#: udav/dat_pnl.cpp:388 udav/dat_pnl.cpp:402 udav/dat_pnl.cpp:436
+msgid "Y-size"
+msgstr "Размер по Y"
+
+#: mgllab/dialogs.cpp:571
+msgid "Y-slice from"
+msgstr "Y срез от"
+
+#: udav/subplot_dlg.cpp:180
+msgid "Y/Z"
+msgstr ""
+
+#: mgllab/help.cpp:135
+msgid "Yes"
+msgstr "Да"
+
+#: udav/hint_dlg.cpp:36 mgllab/help.cpp:270
+msgid ""
+"You can copy the current image to clipboard by pressing Ctrl-Shift-C. Later "
+"you can paste it directly into yours document or presentation."
+msgstr ""
+"Текущий рисунок можно скопировать нажав Ctrl-Shift-C. Позже его можно "
+"вставить в документ или презентацию."
+
+#: udav/hint_dlg.cpp:49 mgllab/help.cpp:283
+msgid ""
+"You can easily insert file or folder names, last fitted formula or numerical "
+"value of selection by using menu Edit|Insert."
+msgstr ""
+"Можно легко вставить имя файла, путь к папке, последнюю подобранную формулу "
+"и т.л., используя меню Правка|Вставить"
+
+#: udav/hint_dlg.cpp:43 mgllab/help.cpp:277
+msgid ""
+"You can edit MGL file in any text editor. Also you can run it in console by "
+"help of commands: mglconv, mglview."
+msgstr ""
+"Скрипт MGL можно редактировать в любом текстовом редакторе. Также его можно "
+"запустить (и просмотреть) прямо из консоли с помошью программ mglconv, "
+"mglview."
+
+#: udav/hint_dlg.cpp:37 mgllab/help.cpp:271
+msgid ""
+"You can export image into a set of format (EPS, SVG, PNG, JPEG) by pressing "
+"right mouse button inside image and selecting 'Export as ...'."
+msgstr ""
+"Текущий рисунок можно экспортировать во множество форматов (EPS, SVG, PNG, "
+"JPEG и др.), просто нажав правой кнопкой на рисунке и выбрать 'Экспорт'"
+
+#: udav/hint_dlg.cpp:41 mgllab/help.cpp:275
+msgid ""
+"You can put several plots in the same image by help of commands 'subplot' or "
+"'inplot'."
+msgstr ""
+"Рисунок может содержать несколько вставок (под-графиков) при использовании "
+"команд 'subplot', 'inplot' и пр."
+
+#: udav/hint_dlg.cpp:51 mgllab/help.cpp:285
+msgid ""
+"You can put several plotting commands in the same line or in separate "
+"function, for highlighting all of them simultaneously."
+msgstr ""
+"Можно сгруппировать несколько графиков поместив их в одну строку с "
+"разделителем ':' или в функцию. Группа графиков будет подсвечиваться и "
+"перемещаться как целое."
+
+#: udav/hint_dlg.cpp:34 mgllab/help.cpp:268
+msgid ""
+"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."
+msgstr ""
+"График можно вращать/сдвигать/приближать с помощью мыши. Просто нажмите "
+"кнопку 'Вращать' и удерживайте кнопку мыши: левую для вращения, правую для "
+"приближения/перспективы, среднюю для сдвига."
+
+#: udav/hint_dlg.cpp:39 mgllab/help.cpp:273
+msgid ""
+"You can save the parameter of animation inside MGL script by using comment "
+"started from '##a ' or '##c ' for loops."
+msgstr ""
+"Параметры анимации можно сохранить внутри скрипта с помощью комментариев "
+"'##a' или '##c'."
+
+#: udav/hint_dlg.cpp:38 mgllab/help.cpp:272
+msgid ""
+"You can setup colors for script highlighting in Property dialog. Just select "
+"menu item 'Settings/Properties'."
+msgstr "Расцветку скрипта можно настроить в диалоге 'Свойства'."
+
+#: udav/hint_dlg.cpp:33 mgllab/help.cpp:267
+msgid ""
+"You can shift axis range by pressing middle button and moving mouse. Also, "
+"you can zoom in/out axis range by using mouse wheel."
+msgstr ""
+"Диапазон осей координат можно сместить нажав среднюю кнопку мыши, при этом "
+"колесо мыши приближает/отдаляет график."
+
+#: udav/hint_dlg.cpp:46 mgllab/help.cpp:280
+msgid ""
+"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."
+msgstr ""
+"Аргументом может быть любое выражение. Если требуется число, то будет "
+"использован первый элемент массива."
+
+#: udav/hint_dlg.cpp:44 mgllab/help.cpp:278
+msgid ""
+"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."
+msgstr ""
+"Команда 'once on|off' позволяет выделить блок, который будет исполняться "
+"только один раз. Например, это могут быть команды чтения больших файлов, "
+"длительные вычисления и т.д. Нажмите F9 (меню 'Графика|Перезагрузить') для "
+"повторного выполнения этого блока команд."
+
+#: udav/hint_dlg.cpp:45 mgllab/help.cpp:279
+msgid ""
+"You can use command 'stop' for terminating script parsing. It is useful if "
+"you don't want to execute a part of script."
+msgstr ""
+"Команда 'stop' останавливает выполение скрипта. Она полезна если Вы не "
+"хотите выполнять часть скрипта."
+
+#: mgllab/help.cpp:269
+msgid ""
+"You may quickly draw the data from file. Just use: mgllab 'filename.dat' in "
+"command line."
+msgstr ""
+"Быстро построить данные из файла можно при использовании: mgllab 'filename."
+"dat'."
+
+#: udav/hint_dlg.cpp:35
+msgid ""
+"You may quickly draw the data from file. Just use: udav 'filename.dat' in "
+"command line."
+msgstr ""
+"Быстро построить данные из файла можно при использовании: udav 'filename."
+"dat'."
+
+#: mgllab/dialogs.cpp:1529
+msgid "You need to enter text!"
+msgstr "Необходимо ввести текст!"
+
+#: mgllab/table.cpp:367
+msgid "You need to provide output name"
+msgstr "Необходимо ввести имя"
+
+#: udav/prop_dlg.cpp:285
+msgid "You need to restart UDAV for applying the changes."
+msgstr "Необходимо перезапустить UDAV для применения изменений."
+
+#: mgllab/dialogs.cpp:592
+msgid "You need to select data array"
+msgstr "Необходимо выбрать массив данных"
+
+#: mgllab/dialogs.cpp:1489
+msgid "You need to select marker!"
+msgstr "Необходимо выбрать маркер!"
+
+#: mgllab/table.cpp:190 mgllab/table.cpp:364
+msgid "You need to specify direction(s)"
+msgstr "Необходимо указать направление"
+
+#: udav/newcmd_dlg.cpp:376 udav/newcmd_dlg.cpp:380
+msgid "You should put text inside ' ' for argument "
+msgstr "Необходимо ввести текст в ' ' для аргумента"
+
+#: udav/anim_dlg.cpp:106
+msgid "You should select one of case"
+msgstr "Необходимо выбрать один из вариантов"
+
+#: udav/newcmd_dlg.cpp:384
+msgid "You should specify all optional arguments before "
+msgstr "Необходимо ввести все аргументы перед "
+
+#: udav/newcmd_dlg.cpp:368
+msgid "You should specify required argument "
+msgstr "Необходимо ввести обязательный аргумент "
+
+#: udav/setup_dlg.cpp:50 mgllab/dialogs.cpp:976
+msgid "Z axis"
+msgstr "Ось Z"
+
+#: udav/setup_dlg.cpp:120
+msgid "Z pos"
+msgstr "Z коор."
+
+#: mgllab/dialogs.cpp:1067
+msgid "Z position"
+msgstr "Z коор."
+
+#: udav/dat_pnl.cpp:413
+msgid "Z-direction"
+msgstr "Z-направление"
+
+#: udav/opt_dlg.cpp:44 mgllab/dialogs.cpp:93
+msgid "Z-range"
+msgstr "Z-диапазон"
+
+#: udav/dat_pnl.cpp:388 udav/dat_pnl.cpp:402 udav/dat_pnl.cpp:436
+msgid "Z-size"
+msgstr "Размер по Z"
+
+#: mgllab/dialogs.cpp:574
+msgid "Z-slice from"
+msgstr "Z срез от"
+
+#: src/exec_set.cpp:845
+msgid "Zoom axis range"
+msgstr "Увеличить диапазон осей координат"
+
+#: widgets/qt.cpp:1129
+msgid "Zoom by mouse"
+msgstr "Приблизить мышкой"
+
+#: widgets/qt.cpp:1228
+msgid "Zoom graphics"
+msgstr "Приблизить рисунок"
+
+#: widgets/qt.cpp:1238 udav/plot_pnl.cpp:515
+msgid "Zoom in"
+msgstr "Приблизить"
+
+#: widgets/qt.cpp:1240 udav/plot_pnl.cpp:518
+msgid "Zoom in graphics."
+msgstr "Приблизить рисунок"
+
+#: widgets/fltk.cpp:865
+msgid "Zoom in selected region of the picture"
+msgstr "Приблизить выбранную область рисунка"
+
+#. t->addAction(QPixmap(":/png/help-faq.png"), _("Examples"), this, SLOT(showExamples()));
+#: udav/help_pnl.cpp:55
+msgid "Zoom in text"
+msgstr "Увеличить текст"
+
+#: widgets/fltk.cpp:895
+msgid "Zoom in the picture"
+msgstr "Приблизить рисунок"
+
+#: widgets/qt.cpp:1242 udav/plot_pnl.cpp:521
+msgid "Zoom out"
+msgstr "Отдалить"
+
+#: widgets/qt.cpp:1244 udav/plot_pnl.cpp:524
+msgid "Zoom out graphics."
+msgstr "Отдалить рисунок"
+
+#: udav/help_pnl.cpp:56
+msgid "Zoom out text"
+msgstr "Уменьшить текст"
+
+#: widgets/fltk.cpp:897
+msgid "Zoom out the picture"
+msgstr "Отдалить рисунок"
+
+#: src/exec_set.cpp:844
+msgid "Zoom plot region"
+msgstr "Приблизить область рисунка"
+
+#. zooming menu
+#: widgets/qt.cpp:1227 udav/plot_pnl.cpp:502
+msgid "Zoom/move"
+msgstr "Приближение/сдвиг"
+
+#: udav/style_dlg.cpp:131
+msgid "above"
+msgstr "выше"
+
+#: mgllab/dialogs.cpp:570 mgllab/dialogs.cpp:573 mgllab/dialogs.cpp:576
+msgid "all"
+msgstr "все"
+
+#: mgllab/dialogs.cpp:581
+msgid "along"
+msgstr "вдоль"
+
+#: mgllab/table.cpp:171 mgllab/table.cpp:346
+msgid "along x"
+msgstr "вдоль x"
+
+#: mgllab/table.cpp:172 mgllab/table.cpp:347
+msgid "along y"
+msgstr "вдоль y"
+
+#: mgllab/table.cpp:173 mgllab/table.cpp:348
+msgid "along z"
+msgstr "вдоль z"
+
+#: mgllab/dialogs.cpp:1012
+msgid "alpha"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1296
+msgid "and"
+msgstr "и"
+
+#: mgllab/dialogs.cpp:1456
+msgid "arc"
+msgstr "дуга"
+
+#: mgllab/dialogs.cpp:1018
+msgid "arrows"
+msgstr "стрелки"
+
+#: udav/setup_dlg.cpp:72 udav/style_dlg.cpp:170
+msgid "at center"
+msgstr "по центру"
+
+#: udav/setup_dlg.cpp:72
+msgid "at maximum"
+msgstr "в максимуме"
+
+#: udav/setup_dlg.cpp:72
+msgid "at minimum"
+msgstr "в минимуме"
+
+#: udav/setup_dlg.cpp:70 mgllab/dialogs.cpp:956
+msgid "at position"
+msgstr "позиция"
+
+#: mgllab/dialogs.cpp:1027
+msgid "attach light"
+msgstr "прикрепить свет"
+
+#. mglWarnFmt
+#: src/base.cpp:238
+msgid "axis ranges are incompatible"
+msgstr "размеры осей неправильные"
+
+#. w
+#: udav/style_dlg.cpp:222 mgllab/dialogs.cpp:29
+msgid "b - blue"
+msgstr "b - синий"
+
+#: mgllab/dialogs.cpp:1019
+msgid "bars"
+msgstr ""
+
+#: widgets/qt.cpp:1084 udav/plot_pnl.cpp:478
+msgid "bitmap EPS"
+msgstr "растровый EPS"
+
+#: mgllab/dialogs.cpp:1036
+msgid "both"
+msgstr "оба"
+
+#: udav/subplot_dlg.cpp:189 mgllab/dialogs.cpp:1306
+msgid "bottom"
+msgstr "снизу"
+
+#. r
+#: udav/style_dlg.cpp:225 mgllab/dialogs.cpp:32
+msgid "c - cyan"
+msgstr "c - голубой"
+
+#: mgllab/dialogs.cpp:957 mgllab/dialogs.cpp:970 mgllab/dialogs.cpp:983
+#: mgllab/dialogs.cpp:996
+msgid "center"
+msgstr "центр"
+
+#: widgets/fltk.cpp:790
+#, c-format
+msgid "click at %g, %g, %g"
+msgstr "клик в %g, %g, %g"
+
+#. mglWarnCnt
+#: src/base.cpp:234
+msgid "couldn't open file"
+msgstr "не могу открыть файл"
+
+#: mgllab/dialogs.cpp:1455
+msgid "curve"
+msgstr "кривая"
+
+#: mgllab/dialogs.cpp:1026
+msgid "cutting"
+msgstr "обрезание"
+
+#. -----------------------------------------------------------------------------
+#: src/base.cpp:225
+msgid "data dimension(s) is incompatible"
+msgstr "размеры данных несовместимы"
+
+#. mglWarnDim
+#: src/base.cpp:226
+msgid "data dimension(s) is too small"
+msgstr "размеры данных слишком малы"
+
+#. mglWarnMem
+#: src/base.cpp:230
+msgid "data values are zero"
+msgstr "значение данных равно нулю"
+
+#: udav/open_dlg.cpp:85 udav/open_dlg.cpp:144 udav/opt_dlg.cpp:63
+#: udav/opt_dlg.cpp:66 mgllab/dialogs.cpp:107 mgllab/dialogs.cpp:116
+#: mgllab/dialogs.cpp:1044
+msgid "default"
+msgstr "по умолчанию"
+
+#: mgllab/help.cpp:149
+msgid "dimensions"
+msgstr "размерности"
+
+#. l
+#: udav/style_dlg.cpp:229 mgllab/dialogs.cpp:36
+msgid "e - lawngreen"
+msgstr "e - салатовый"
+
+#: mgllab/dialogs.cpp:1455
+msgid "ellipse"
+msgstr "эллипс"
+
+#: mgllab/dialogs.cpp:1017
+msgid "facenum"
+msgstr ""
+
+#: mgllab/dialogs.cpp:1035
+msgid "factor"
+msgstr "множитель"
+
+#. mglWarnSize
+#: src/base.cpp:237
+msgid "format is not supported for that build"
+msgstr "формат не поддерживается для этой сборки"
+
+#: src/canvas.cpp:33
+msgid "frame"
+msgstr "кадр"
+
+#: udav/anim_dlg.cpp:55 mgllab/mathgl.cpp:192
+msgid "from"
+msgstr "от"
+
+#. b
+#: udav/style_dlg.cpp:223 mgllab/dialogs.cpp:30
+msgid "g - lime"
+msgstr "g - липовый"
+
+#: mgllab/dialogs.cpp:1044
+msgid "glass-like"
+msgstr "стеклянная"
+
+#: mgllab/dialogs.cpp:1011
+msgid "grayscale"
+msgstr "черно-белый"
+
+#. p
+#: udav/style_dlg.cpp:234 mgllab/dialogs.cpp:41
+msgid "h - gray"
+msgstr "h - серый"
+
+#: src/parser.cpp:1067
+#, c-format
+msgid "in line %ld"
+msgstr "в строке %ld"
+
+#: mgllab/dialogs.cpp:1036
+msgid "increment"
+msgstr "шаг"
+
+#: mgllab/dialogs.cpp:1236 mgllab/dialogs.cpp:1249 mgllab/dialogs.cpp:1262
+#: mgllab/dialogs.cpp:1271 mgllab/dialogs.cpp:1280
+msgid "ind"
+msgstr "№"
+
+#. h
+#: udav/style_dlg.cpp:235 mgllab/dialogs.cpp:43
+msgid "k - black"
+msgstr "k - черный"
+
+#. y
+#: udav/style_dlg.cpp:228 mgllab/dialogs.cpp:35
+msgid "l - springgreen"
+msgstr "l - весенне-зеленый"
+
+#: mgllab/dialogs.cpp:1045
+msgid "lamp-like"
+msgstr "ламповая"
+
+#. vv->addSpacing(11);
+#: udav/style_dlg.cpp:169 udav/subplot_dlg.cpp:187 mgllab/dialogs.cpp:957
+#: mgllab/dialogs.cpp:970 mgllab/dialogs.cpp:983 mgllab/dialogs.cpp:996
+#: mgllab/dialogs.cpp:1304
+msgid "left"
+msgstr "слева"
+
+#. mglWarnOpen
+#: src/base.cpp:235
+msgid "light: ID is out of range"
+msgstr "light: ID вне диапазона"
+
+#: mgllab/dialogs.cpp:1013
+msgid "lighting"
+msgstr "освещение"
+
+#: mgllab/dialogs.cpp:1454
+msgid "line"
+msgstr "линия"
+
+#. c
+#: udav/style_dlg.cpp:226 mgllab/dialogs.cpp:33
+msgid "m - magenta"
+msgstr "m - фуксия"
+
+#.
+#. ^
+#: udav/style_dlg.cpp:317 udav/style_dlg.cpp:356 mgllab/dialogs.cpp:209
+#: mgllab/dialogs.cpp:247
+msgid "manual"
+msgstr "вручную"
+
+#: mgllab/dialogs.cpp:1454
+msgid "marker"
+msgstr "маркер"
+
+#: mgllab/dialogs.cpp:1020
+msgid "markers"
+msgstr "маркеры"
+
+#: udav/data_dlg.cpp:68
+msgid "max"
+msgstr "max"
+
+#: mgllab/help.cpp:151
+msgid "mem. usage"
+msgstr "исп.памяти"
+
+#: mgllab/dialogs.cpp:1016
+msgid "meshnum"
+msgstr ""
+
+#: udav/newcmd_dlg.cpp:247
+msgid "mgl_en"
+msgstr "mgl_ru"
+
+#: utils/mglconv.cpp:82
+#, c-format
+msgid ""
+"mglconv convert mgl script to image file (default PNG).\n"
+"Current version is 2.%g\n"
+msgstr ""
+"mglconv конвертирует mgl скрипт в рисунок (по умолчанию PNG).\n"
+"Текущая версия 2.%g\n"
+
+#: mgllab/mgllab.cpp:431
+#, c-format
+msgid ""
+"mgllab draw mgl script interactively.\n"
+"Current version is 2.%g\n"
+msgstr ""
+"mgllab рисует mgl скрипт интерактивно.\n"
+"Текущая версия 2.%g\n"
+
+#: mgllab/help.cpp:78
+#, c-format
+msgid ""
+"mgllab v. 2.%g\n"
+"(c) Alexey Balakin, 2017\n"
+"http://mathgl.sf.net/"
+msgstr ""
+"mgllab v. 2.%g\n"
+"(c) Алексей Балакин, 2017\n"
+"http://mathgl.sf.net/"
+
+#: utils/mglview.cpp:82
+#, c-format
+msgid ""
+"mglview show plot from MGL script or MGLD file.\n"
+"Current version is 2.%g\n"
+msgstr ""
+"mglview показывает график MGL скрипта или MGLD файла.\n"
+"Текущая версия 2.%g\n"
+
+#: udav/data_dlg.cpp:68
+msgid "min"
+msgstr "min"
+
+#. mglWarnLow
+#: src/base.cpp:227
+msgid "minimal data value is negative"
+msgstr "минимальное значение отрицательно"
+
+#. e
+#: udav/style_dlg.cpp:230 mgllab/dialogs.cpp:37
+msgid "n - skyblue"
+msgstr "n - небесно-голубой"
+
+#: mgllab/help.cpp:147
+msgid "name"
+msgstr "имя"
+
+#. mglWarnNeg
+#: src/base.cpp:228
+msgid "no file or wrong data dimensions"
+msgstr "нет файла или неверные размеры"
+
+#. mglWarnZero
+#: src/base.cpp:231
+msgid "no legend entries"
+msgstr "нет записей легенды"
+
+#: mgllab/dialogs.cpp:1028
+msgid "no origin tick"
+msgstr ""
+
+#. "-+=;oOsS~<>jdD*^"
+#. ".+x*sdv^<>o.*+xsdv^<>o" : nf = 10
+#: udav/style_dlg.cpp:128 udav/style_dlg.cpp:131 udav/style_dlg.cpp:134
+#: udav/style_dlg.cpp:339 udav/style_dlg.cpp:383 udav/data_dlg.cpp:67
+#: mgllab/dialogs.cpp:214 mgllab/dialogs.cpp:230 mgllab/dialogs.cpp:1035
+#: mgllab/dialogs.cpp:1039
+msgid "none"
+msgstr "нет"
+
+#: udav/style_dlg.cpp:220
+msgid "none or default"
+msgstr "нет или по умолчанию"
+
+#. mglWarnFile
+#: src/base.cpp:229
+msgid "not enough memory"
+msgstr "не хватает памяти"
+
+#. mglWarnNull
+#: src/base.cpp:240
+msgid "not enough space for plot"
+msgstr "не достаточно места для графика"
+
+#: mgllab/table.cpp:85
+msgid "not used"
+msgstr "не используется"
+
+#. mglWarnSlc
+#: src/base.cpp:233
+msgid "number of contours is zero or negative"
+msgstr "число контуров меньше или равно нуля"
+
+#: udav/opt_dlg.cpp:63 udav/opt_dlg.cpp:66
+msgid "off"
+msgstr "выкл."
+
+#: udav/opt_dlg.cpp:63 udav/opt_dlg.cpp:66 udav/setup_dlg.cpp:128
+msgid "on"
+msgstr "вкл."
+
+#: udav/dat_pnl.cpp:549
+msgid "or enter name for new variable"
+msgstr "или введите имя новой переменной"
+
+#. q
+#: udav/style_dlg.cpp:233 mgllab/dialogs.cpp:40
+msgid "p - deeppink"
+msgstr "p - малиновый"
+
+#: mgllab/dialogs.cpp:1023
+msgid "pen blur"
+msgstr "размытие"
+
+#: mgllab/dialogs.cpp:392
+msgid "plain"
+msgstr "карта"
+
+#. mglWarnTern
+#: src/base.cpp:239
+msgid "pointer is NULL"
+msgstr "указатель равен NULL"
+
+#: mgllab/dialogs.cpp:1456
+msgid "polygon"
+msgstr "полигон"
+
+#: mgllab/dialogs.cpp:1040
+msgid "projection"
+msgstr "проекция"
+
+#. u
+#: udav/style_dlg.cpp:232 mgllab/dialogs.cpp:39
+msgid "q - orange"
+msgstr "q - оранжевый"
+
+#: mgllab/dialogs.cpp:1040
+msgid "quaternary"
+msgstr "quaternary"
+
+#: mgllab/dialogs.cpp:1041
+msgid "quaternary proj"
+msgstr "quaternary проекция"
+
+#. g
+#: udav/style_dlg.cpp:224 mgllab/dialogs.cpp:31
+msgid "r - red"
+msgstr "r - красный"
+
+#: mgllab/dialogs.cpp:1454
+msgid "rectangle"
+msgstr "прямоугольник"
+
+#: mgllab/dialogs.cpp:1455
+msgid "rhomb"
+msgstr "ромб"
+
+#: udav/style_dlg.cpp:172 udav/subplot_dlg.cpp:193 mgllab/dialogs.cpp:958
+#: mgllab/dialogs.cpp:971 mgllab/dialogs.cpp:984 mgllab/dialogs.cpp:997
+#: mgllab/dialogs.cpp:1310
+msgid "right"
+msgstr "справа"
+
+#: mgllab/dialogs.cpp:1029
+msgid "rotate text"
+msgstr "вращать текст"
+
+#: mgllab/mathgl.cpp:199
+msgid "save slides"
+msgstr "сохранить кадры"
+
+#. mglWarnLId
+#: src/base.cpp:236
+msgid "size(s) is zero or negative"
+msgstr "размер(ы) меньше или равны нулю"
+
+#. mglWarnLeg
+#: src/base.cpp:232
+msgid "slice value is out of range"
+msgstr "срез вне диапазона"
+
+#: mgllab/table.cpp:144
+msgid "smoothed"
+msgstr "сгладить"
+
+#: mgllab/dialogs.cpp:326
+msgid "solid"
+msgstr "сплош."
+
+#: widgets/qt.cpp:1082 udav/plot_pnl.cpp:476
+msgid "solid PNG"
+msgstr "PNG с заливкой"
+
+#: udav/anim_dlg.cpp:45 mgllab/mathgl.cpp:187
+msgid "strings"
+msgstr "строки"
+
+#: udav/data_dlg.cpp:67
+msgid "sum"
+msgstr "sum"
+
+#: mgllab/dialogs.cpp:1039
+msgid "ternary"
+msgstr "ternary"
+
+#: mgllab/dialogs.cpp:1041
+msgid "ternary proj"
+msgstr "ternary проекция"
+
+#: mgllab/dialogs.cpp:1021 mgllab/dialogs.cpp:1456
+msgid "text"
+msgstr "текст"
+
+#: mgllab/dialogs.cpp:1022
+msgid "ticks"
+msgstr "метки"
+
+#: udav/anim_dlg.cpp:59 mgllab/mathgl.cpp:193 mgllab/dialogs.cpp:569
+#: mgllab/dialogs.cpp:572 mgllab/dialogs.cpp:575
+msgid "to"
+msgstr "до"
+
+#: mgllab/mgllab.cpp:579
+msgid "to script"
+msgstr "в скрипт"
+
+#: udav/subplot_dlg.cpp:191 mgllab/dialogs.cpp:1308
+msgid "top"
+msgstr "сверху"
+
+#. n
+#: udav/style_dlg.cpp:231 mgllab/dialogs.cpp:38
+msgid "u - blueviolet"
+msgstr "u - фиолетовый"
+
+#: udav/style_dlg.cpp:131
+msgid "under"
+msgstr "снизу"
+
+#: udav/mem_pnl.cpp:168 mgllab/help.cpp:199
+msgid "unknown"
+msgstr "не знаю"
+
+#: udav/udav_wnd.cpp:168 udav/udav_wnd.cpp:560 udav/udav_wnd.cpp:693
+msgid "untitled - UDAV"
+msgstr "без имени - UDAV"
+
+#: udav/udav_wnd.cpp:686
+msgid "untitled* - UDAV"
+msgstr "без имени* - UDAV"
+
+#: mgllab/dialogs.cpp:327
+msgid "user"
+msgstr "символ"
+
+#: udav/anim_dlg.cpp:52 mgllab/mathgl.cpp:189
+msgid "values"
+msgstr "значения"
+
+#: widgets/qt.cpp:1085 udav/plot_pnl.cpp:479
+msgid "vector EPS"
+msgstr "векторный EPS"
+
+#.
+#: udav/style_dlg.cpp:221 mgllab/dialogs.cpp:28
+msgid "w - white"
+msgstr "w - белый"
+
+#: mgllab/dialogs.cpp:1312
+msgid "whole area"
+msgstr "без полей"
+
+#: mgllab/dialogs.cpp:1471
+msgid "wire"
+msgstr "сеткой"
+
+#: udav/anim_dlg.cpp:63 mgllab/mathgl.cpp:194
+msgid "with step"
+msgstr "с шагом"
+
+#. m
+#: udav/style_dlg.cpp:227 mgllab/dialogs.cpp:34
+msgid "y - yellow"
+msgstr "y - желтый"
+
+#~ msgid "Lower bound"
+#~ msgstr "Нижняя граница"
+
+#~ msgid "Upper bound"
+#~ msgstr "Верхняя граница"
+
+#~ msgid "Add"
+#~ msgstr "Добавить"
diff --git a/mgllab/CMakeLists.txt b/mgllab/CMakeLists.txt
new file mode 100644 (file)
index 0000000..1649104
--- /dev/null
@@ -0,0 +1,59 @@
+# cmake_minimum_required(VERSION 2.8.9)
+#
+# project( MGLLAB )
+#
+# include(FindFLTK)
+# if(NOT FLTK_FOUND)
+#      message(SEND_ERROR "Couldn't find FLTK library.")
+# endif(NOT FLTK_FOUND)
+#
+# include_directories( ${MGLLAB_SOURCE_DIR} ${MGLLAB_BINARY_DIR})
+#
+# find_package(MathGL2 REQUIRED FLTK)
+# #find_package(MathGL REQUIRED FLTK PATHS /usr/local/lib/CMake/MathGL/)
+#
+# find_package(OpenMP)
+# if(OPENMP_FOUND)
+#      set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
+#      set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
+# else(OPENMP_FOUND)
+#      message(SEND_ERROR "Couldn't find OpenMP.")
+# endif(OPENMP_FOUND)
+#
+# include_directories(${FLTK_INCLUDE_DIR})
+# set(mgl_lab_src editor.cpp help.cpp mathgl.cpp grid.cpp dialogs.cpp mgllab.cpp option.cpp table.cpp image.cpp)
+# set(mgl_lab_hdr mgllab.h image.h)
+# add_executable(mgllab ${mgl_lab_src} ${mgl_lab_hdr})
+# target_link_libraries(mgllab ${MATHGL2_FLTK_LIBRARY} ${MATHGL2_LIBRARY} ${FLTK_LIBRARIES})
+# install(
+#      TARGETS mgllab
+#      RUNTIME DESTINATION bin )
+
+if(MGL_HAVE_FLTK)
+       configure_file(${MathGL2_SOURCE_DIR}/mgllab/mgl.xml.in ${MathGL2_BINARY_DIR}/mgllab/mgl.xml)
+       include_directories(${FLTK_INCLUDE_DIR})
+       set(mgllab_src editor.cpp help.cpp mathgl.cpp grid.cpp dialogs.cpp mgllab.cpp table.cpp)
+       set(mgllab_hdr mgllab.h)
+       if(WIN32)
+               set(mgllab_src ${mgllab_src} mgllab.rc)
+       endif(WIN32)
+       add_executable(mgllab ${mgllab_src} ${mgllab_hdr})
+       target_link_libraries(mgllab mgl mgl-fltk ${FLTK_LIBRARIES})
+       install(
+               TARGETS mgllab
+               RUNTIME DESTINATION bin )
+       install(FILES udav.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/pixmaps/)
+       find_program(findupddb update-desktop-database)
+       if(findupddb)
+               install(FILES mgllab.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications/)
+               install(CODE "execute_process(COMMAND \"${findupddb}\" \"${CMAKE_INSTALL_PREFIX}/share/applications\")")
+       endif(findupddb)
+       find_program(findupmdb update-mime-database)
+       if(findupmdb)
+               install(FILES ${CMAKE_BINARY_DIR}/mgllab/mgl.xml DESTINATION ${CMAKE_INSTALL_PREFIX}/share/mime/packages/)
+               install(CODE "execute_process(COMMAND \"${findupmdb}\" \"${CMAKE_INSTALL_PREFIX}/share/mime\")")
+       endif(findupmdb)
+
+       mgl_po_src(${mgllab_src} ${mgllab_hdr})
+
+endif(MGL_HAVE_FLTK)
diff --git a/mgllab/dialogs.cpp b/mgllab/dialogs.cpp
new file mode 100644 (file)
index 0000000..8f39ee5
--- /dev/null
@@ -0,0 +1,1541 @@
+/* setup.cpp is part of UDAV
+ * 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
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+#include "mgl2/mgl.h"
+#include "mgllab.h"
+#include <string.h>
+#include <FL/Fl_Spinner.H>
+#include <FL/Fl_Output.H>
+#include <FL/Fl_Select_Browser.H>
+#include <FL/Fl_Toggle_Button.H>
+//-----------------------------------------------------------------------------
+const char *cols = " wbgrcmylenuqphkWBGRCMYLENUQPH";
+Fl_Menu_Item colors[] = {
+       {"-----", 0,0,0,0,0,0,0, 0},    //
+       {_("w - white"), 0,0,0,0,0,0,0, fl_rgb_color(0,0,0)},                   //w
+       {_("b - blue"), 0,0,0,0,0,0,0, fl_rgb_color(0,0,255)},          //b
+       {_("g - lime"), 0,0,0,0,0,0,0, fl_rgb_color(0,255,0)},          //g
+       {_("r - red"), 0,0,0,0,0,0,0, fl_rgb_color(255,0,0)},                   //r
+       {_("c - cyan"), 0,0,0,0,0,0,0, fl_rgb_color(0,255,255)},                //c
+       {_("m - magenta"), 0,0,0,0,0,0,0, fl_rgb_color(255,0,255)},     //m
+       {_("y - yellow"), 0,0,0,0,0,0,0, fl_rgb_color(255,255,0)},      //y
+       {_("l - springgreen"), 0,0,0,0,0,0,0, fl_rgb_color(0,255,127)},//l
+       {_("e - lawngreen"), 0,0,0,0,0,0,0, fl_rgb_color(127,255,0)},   //e
+       {_("n - skyblue"), 0,0,0,0,0,0,0, fl_rgb_color(0,127,255)},     //n
+       {_("u - blueviolet"), 0,0,0,0,0,0,0, fl_rgb_color(127,0,255)},//u
+       {_("q - orange"), 0,0,0,0,0,0,0, fl_rgb_color(255,127,0)},      //q
+       {_("p - deeppink"), 0,0,0,0,0,0,0, fl_rgb_color(255,0,127)},    //p
+       {_("h - gray"), 0,0,0,0,0,0,0, fl_rgb_color(127,127,127)},      //h
+
+       {_("k - black"), 0,0,0,0,0,0,0, fl_rgb_color(0,0,0)},                   //k
+       {_("W - lightgray"), 0,0,0,0,0,0,0, fl_rgb_color(179,179,179)},//W
+       {_("B - navy"), 0,0,0,0,0,0,0, fl_rgb_color(0,0,127)},          //B
+       {_("G - green"), 0,0,0,0,0,0,0, fl_rgb_color(0,127,0)},         //G
+       {_("R - maroon"), 0,0,0,0,0,0,0, fl_rgb_color(127,0,0)},                //R
+       {_("C - teal"), 0,0,0,0,0,0,0, fl_rgb_color(0,127,127)},                //C
+       {_("M - purple"), 0,0,0,0,0,0,0, fl_rgb_color(127,0,127)},      //M
+       {_("Y - olive"), 0,0,0,0,0,0,0, fl_rgb_color(127,127,0)},               //Y
+       {_("L - seagreen"), 0,0,0,0,0,0,0, fl_rgb_color(0,127,77)},     //L
+       {_("E - darklawn"), 0,0,0,0,0,0,0, fl_rgb_color(77,127,0)},     //E
+       {_("N - darkskyblue"), 0,0,0,0,0,0,0, fl_rgb_color(0,77,127)},//N
+       {_("U - indigo"), 0,0,0,0,0,0,0, fl_rgb_color(77,0,127)},               //U
+       {_("Q - brown"), 0,0,0,0,0,0,0, fl_rgb_color(127,77,0)},                //Q
+       {_("P - darkpink"), 0,0,0,0,0,0,0, fl_rgb_color(127,0,77)},     //P
+       {_("H - darkgray"), 0,0,0,0,0,0,0, fl_rgb_color(77,77,77)},     //H
+{0}};
+//-----------------------------------------------------------------------------
+void cb_dlg_cancel(Fl_Widget*, void *v)        {       if(v)   ((GeneralDlg*)v)->hide();       }
+void cb_dlg_ok(Fl_Widget*, void *v)            {       if(v)   ((GeneralDlg*)v)->cb_ok();      }
+std::string wcstombs(std::wstring wcs)
+{
+       std::string str;
+       const wchar_t *ss = wcs.c_str();
+       size_t s=wcstombs(0,ss,0);      char *buf=new char[s+1];
+       wcstombs(buf,ss,s); buf[s]=0;
+       str = buf;      delete []buf;   return str;
+}
+//-----------------------------------------------------------------------------
+void cb_option_change(Fl_Widget *, void *);
+class OptionDlg : public GeneralDlg
+{
+       Fl_Input *x1, *x2, *y1, *y2, *z1, *z2, *c1, *c2;
+       Fl_Input *val, *meshnum, *size;
+       Fl_Choice *cut, *light;
+       Fl_Input *alpha, *amb, *dif, *legend;
+public:
+       Fl_Input *ext;
+       OptionDlg() : GeneralDlg()
+       {
+               e=NULL; ext=NULL;
+               Fl_Button *o;
+               w = new Fl_Double_Window(640, 185, _("Add command option(s)"));
+               x1 = new Fl_Input(95, 5, 85, 25, _("X-range"));
+               x1->tooltip(_("Minimal value of X for cutting or for coordinate filling"));
+               x2 = new Fl_Input(190, 5, 85, 25, "-");
+               x2->tooltip(_("Maximal value of X for cutting or for coordinate filling"));
+               y1 = new Fl_Input(95, 35, 85, 25, _("Y-range"));
+               y1->tooltip(_("Minimal value of Y for cutting or for coordinate filling"));
+               y2 = new Fl_Input(190, 35, 85, 25, "-");
+               y2->tooltip(_("Maximal value of Y for cutting or for coordinate filling"));
+               z1 = new Fl_Input(95, 65, 85, 25, _("Z-range"));
+               z1->tooltip(_("Minimal value of Z for cutting or for coordinate filling"));
+               z2 = new Fl_Input(190, 65, 85, 25, "-");
+               z2->tooltip(_("Maximal value of Z for cutting or for coordinate filling"));
+               c1 = new Fl_Input(95, 95, 85, 25, _("C-range"));        c1->deactivate();
+               c1->tooltip(_("Low border for determining color or alpha"));
+               c2 = new Fl_Input(190, 95, 85, 25, "-");                c2->deactivate();
+               c2->tooltip(_("Upper border for determining color or alpha"));
+               val = new Fl_Input(375, 5, 85, 25, _("Value")); val->labelfont(1);
+               meshnum = new Fl_Input(375, 35, 85, 25, _("MeshNum"));
+               meshnum->tooltip(_("Approximate number of mesh lines in plot"));
+               size = new Fl_Input(375, 65, 85, 25, _("Size"));
+               size->tooltip(_("Set size for text, marks and others"));
+               cut = new Fl_Choice(375, 95, 85, 25, _("Cutting"));
+               cut->add(_("default")); cut->add("on"); cut->add("off");
+               cut->tooltip(_("Set cutting off/on for particular plot"));
+               alpha = new Fl_Input(550, 5, 85, 25, _("Alpha"));
+               alpha->tooltip(_("Alpha value (transparency) of surface or cloud"));
+               amb = new Fl_Input(550, 35, 85, 25, _("Ambient"));
+               amb->tooltip(_("Own brightness of the surface"));
+               dif = new Fl_Input(550, 65, 85, 25, _("Diffuse"));
+               dif->tooltip(_("Intensity of diffuse light"));
+               light = new Fl_Choice(550, 95, 85, 25, _("Light"));
+               light->add(_("default"));       light->add("on");       light->add("off");
+               cut->tooltip(_("Set lighting off/on for particular plot"));
+               legend = new Fl_Input(95, 125, 540, 25, _("Legend"));
+               cut->tooltip(_("Add legend entry for the plot"));
+               o = new Fl_Button(455, 155, 85, 25, _("Cancel"));       o->callback(cb_dlg_cancel,this);
+               o = new Fl_Return_Button(550, 155, 85, 25, _("OK"));    o->callback(cb_dlg_ok,this);
+               w->set_modal(); w->end();
+       }
+       void cb_ok()
+       {
+               int v;  const char *s1, *s2;    result.clear();
+               s1=val->value();        if(s1 && *s1)   result = result+";value "+s1;
+               s1=x1->value(); s2=x2->value(); if(s1 && *s1 && s2 && *s2)      result = result+";xrange "+s1+' '+s2;
+               s1=y1->value(); s2=y2->value(); if(s1 && *s1 && s2 && *s2)      result = result+";yrange "+s1+' '+s2;
+               s1=z1->value(); s2=z2->value(); if(s1 && *s1 && s2 && *s2)      result = result+";zrange "+s1+' '+s2;
+//             s1=c1->value(); s2=c2->value(); if(s1 && *s1 && s2 && *s2)      result = result+";crange "+s1+' '+s2;
+               s1=legend->value();     if(s1 && *s1)   result = result+";legend '"+s1+"'";
+               s1=size->value();       if(s1 && *s1)   result = result+";size "+s1;
+               s1=alpha->value();      if(s1 && *s1)   result = result+";alpha "+s1;
+               s1=amb->value();        if(s1 && *s1)   result = result+";ambient "+s1;
+               s1=dif->value();        if(s1 && *s1)   result = result+";diffuse "+s1;
+               s1=meshnum->value();if(s1 && *s1)       result = result+";meshnum "+s1;
+               v=cut->value();         if(v==1 || v==2)        result = result+";cut "+cut->text();
+               v=light->value();       if(v==1 || v==2)        result = result+";light "+light->text();
+               if(e)   e->editor->insert(result.c_str());
+               if(ext) ext->value(result.c_str());
+               hide();
+       }
+} option_dlg;
+//-----------------------------------------------------------------------------
+void option_dlg_cb(Fl_Widget *, void *v)
+{      option_dlg.ext=NULL;    option_dlg.e=(ScriptWindow *)v; option_dlg.show();      }
+//-----------------------------------------------------------------------------
+void option_in_cb(Fl_Widget *, void *v)
+{      option_dlg.ext=(Fl_Input*)v;    option_dlg.e=NULL;      option_dlg.show();      }
+//-----------------------------------------------------------------------------
+class DirSelDlg : public GeneralDlg
+{
+       Fl_Choice *dir;
+public:
+       Fl_Input *ext;
+       DirSelDlg() : GeneralDlg()
+       {
+               Fl_Button *o;
+               w = new Fl_Double_Window(220, 85, _("Select direction"));
+               dir = new Fl_Choice(80, 10, 135, 25, _("Direction"));
+               dir->add("xyz");        dir->add("x");  dir->add("y");  dir->add("z");
+               dir->add("xy"); dir->add("xz"); dir->add("yz");
+               o = new Fl_Button(55, 50, 75, 25, _("Cancel")); o->callback(cb_dlg_cancel,this);
+               o = new Fl_Return_Button(140, 50, 75, 25, _("OK"));     o->callback(cb_dlg_ok,this);
+               w->set_modal(); w->end();
+       }
+       void cb_ok()
+       {
+               const char *s = dir->text();
+               if(s && *s)     result = std::string("'")+s+"'";
+               if(e)   e->editor->insert(result.c_str());
+               else if(ext)    ext->value(result.c_str());
+               else    cb_args_set(result.c_str());
+               hide();
+       }
+} dirsel_dlg;
+//-----------------------------------------------------------------------------
+void dirsel_dlg_cb(Fl_Widget *, void *v)
+{      dirsel_dlg.ext=NULL;    dirsel_dlg.e=(ScriptWindow *)v; dirsel_dlg.show();      }
+//-----------------------------------------------------------------------------
+void dirsel_in_cb(Fl_Widget *, void *v)
+{      dirsel_dlg.ext=(Fl_Input*)v;    dirsel_dlg.e=NULL;      dirsel_dlg.show();      }
+//-----------------------------------------------------------------------------
+//const char *arr = "_AKVITSDOX";
+Fl_Menu_Item arrows[] = {
+       {_("'_' none")},                //_
+       {_("'A' arrow")},       //A
+       {_("'K' size")},                //K
+       {_("'V' back arrow")},//V
+       {_("'I' stop")},                //I
+       {_("'T' triangle")},    //T
+       {_("'S' square")},      //S
+       {_("'D' rhomb")},       //D
+       {_("'O' circle")},      //O
+       {_("'X' cross")},       //X
+       {0}};
+//-----------------------------------------------------------------------------
+//const char *stl = "-|j;i=: d";
+Fl_Menu_Item dashing[] = {
+       {_("'-' solid")},               //-
+       {_("'|' long dash")},   //|
+       {_("'j' dash dot")},    //j
+       {_("';' dash")},                //;
+       {_("'i' small dash dot")},      //i
+       {_("'=' small dash")},  //=
+       {_("':' dots")},                //:
+       {_("' ' none")},                //
+       {_("manual")},                  // d
+       {0}};
+//-----------------------------------------------------------------------------
+//const char *mrk = "*o+xsd.^v<>";
+Fl_Menu_Item markers[] = {
+       {_("none")},                    //
+       {_("'*' star")},                //*
+       {_("'o' circle")},              //o
+       {_("'+' plus")},                //+
+       {_("'x' skew cross")},  //x
+       {_("'s' square")},              //s
+       {_("'d' rhomb")},               //d
+       {_("'.' dot")},                 //.
+       {_("'^' triangle up")}, //^
+       {_("'v' triangle down")},//v
+       {_("'<' triangle left")},//<
+       {_("'>' triangle right")},//>
+       {0}};
+//-----------------------------------------------------------------------------
+//const char *msk = " -+=;joOsS~<>dD*^M";
+Fl_Menu_Item masks[] = {
+       {_("none")},                    //
+       {_("'-' lines")},               //-
+       {_("'+' plus")},                //+
+       {_("'=' double lines")},//=
+       {_("';' dash")},                //;
+       {_("'j' dash dot")},    //j
+       {_("'o' circle")},              //o
+       {_("'O' solid circle")},//O
+       {_("'s' square")},              //s
+       {_("'S' solid square")},//S
+       {_("'~' waves")},               //~
+       {_("'<' left sign")},   //<
+       {_("'>' right sign")},  //>
+       {_("'d' rhomb")},               //d
+       {_("'D' solid rhomb")}, //D
+       {_("'*' cross")},               //*
+       {_("'^' hats")},                //^
+       {_("manual")},                  //M
+       {0}};
+//-----------------------------------------------------------------------------
+std::string get_color(Fl_Choice *c, Fl_Spinner *s, Fl_Input *p)
+{
+       std::string res;
+       const char *ps = p->value();
+       int cv = c->value(), sv = s->value();
+       int pv = ps?10*atof(ps):-1;
+       if(pv<0 || pv>9)        ps = NULL;
+       if(cv>0 && cv<long(strlen(cols)))
+       {
+               if(ps)
+               {
+                       if(sv>0 && sv<10 && sv!=5)
+                       {
+                               char buf[16];   snprintf(buf,16,"{%c%d,0.%d}",cols[cv],sv,pv);
+                               res = buf;
+                       }
+                       else    res = cols[cv];
+               }
+               else
+               {
+                       if(sv>0 && sv<10 && sv!=5)
+                       {
+                               char buf[16];   snprintf(buf,16,"{%c%d}",cols[cv],sv);
+                               res = buf;
+                       }
+                       else    res = cols[cv];
+               }
+       }
+       return res;
+}
+//-----------------------------------------------------------------------------
+void cb_style_upd(Fl_Widget *, void *);
+void cb_style_sch(Fl_Widget *, void *);
+class StyleDlg : public GeneralDlg
+{
+       Fl_Choice *arr1, *dash, *arr2;
+       Fl_Choice *mark;
+       Fl_Check_Button *solid, *user;
+       Fl_Spinner *width;
+       Fl_Button *dash_m[16];
+
+       Fl_Choice *c[8], *sch;
+       Fl_Spinner *s[8];
+       Fl_Input *p[8];
+       Fl_Choice *axial, *contt, *mask, *angle;
+       Fl_Spinner *msize;
+       Fl_Input *alpha;
+       Fl_Button *mask_m[64];
+       Fl_Check_Button *wire, *sharp;
+
+       Fl_Check_Button *bold, *ital, *twire, *uline, *oline, *plain;
+       Fl_Choice *align, *vert;
+
+       Fl_Group *gline, *gsurf, *gfont;
+       Fl_Output *res;
+       Fl_MathGL *gr;
+       std::string script;
+public:
+       Fl_Input *ext;
+       StyleDlg() : GeneralDlg()
+       {
+               Fl_Group *g;    Fl_Button *o;
+               w = new Fl_Double_Window(380, 540, _("Plot style"));
+               Fl_Tabs* tt = new Fl_Tabs(0, 5, 375, 235);
+               gline = new Fl_Group(0, 30, 375, 210, _("Line style"));
+                       arr1 = new Fl_Choice(5, 50, 110, 25, _("Arrow at start"));
+                       arr1->align(FL_ALIGN_TOP_LEFT); arr1->copy(arrows);
+                       arr1->callback(cb_style_upd);
+                       dash = new Fl_Choice(125, 50, 110, 25, _("Dashing"));
+                       dash->align(FL_ALIGN_TOP_LEFT); dash->copy(dashing);
+                       dash->callback(cb_style_upd);
+                       arr2 = new Fl_Choice(245, 50, 110, 25, _("Arrow at end"));
+                       arr2->align(FL_ALIGN_TOP_LEFT); arr2->copy(arrows);
+                       arr2->callback(cb_style_upd);
+                       mark = new Fl_Choice(125, 80, 110, 25, _("Marks"));
+                       mark->copy(markers);    mark->callback(cb_style_upd);
+                       solid = new Fl_Check_Button(240, 80, 55, 25, _("solid"));
+                       user = new Fl_Check_Button(300, 80, 55, 25, _("user"));
+                       solid->callback(cb_style_upd);  user->callback(cb_style_upd);
+                       width = new Fl_Spinner(125, 110, 110, 25, _("Width"));
+                       width->range(1,9);      width->value(1);        width->callback(cb_style_upd);
+                       for(int i=0;i<16;i++)
+                       {
+                               dash_m[i] = new Fl_Toggle_Button(10+20*i, 210, 20, 20);
+                               dash_m[i]->callback(cb_style_upd);
+                       }
+                       dash_m[0]->label(_("Manual dashing"));
+                       dash_m[0]->align(FL_ALIGN_TOP_LEFT);
+                       gline->end();
+               gsurf = new Fl_Group(0, 30, 375, 210, _("Color scheme"));       gsurf->hide();
+                       axial = new Fl_Choice(5, 50, 110, 25, _("Axial direction"));
+                       axial->align(FL_ALIGN_TOP_LEFT);        axial->callback(cb_style_upd);
+                       axial->add("none");     axial->add("x");        axial->add("y");        axial->add("z");
+                       contt = new Fl_Choice(125, 50, 110, 25, _("Text on contours"));
+                       contt->add("none");     contt->add("under");    contt->add("above");
+                       contt->align(FL_ALIGN_TOP_LEFT);        contt->callback(cb_style_upd);
+                       alpha = new Fl_Input(255, 50, 110, 25, _("Transparency"));
+                       alpha->align(FL_ALIGN_TOP_LEFT);        alpha->callback(cb_style_upd);
+                       wire = new Fl_Check_Button(125, 80, 115, 25, _("Wire or mesh"));
+                       wire->callback(cb_style_upd);
+                       sharp = new Fl_Check_Button(250, 80, 110, 25, _("Sharp colors"));
+                       sharp->callback(cb_style_upd);
+                       g = new Fl_Group(10, 105, 360, 130, _("Mask"));
+                               g->box(FL_ENGRAVED_BOX);        g->align(FL_ALIGN_TOP_LEFT);
+                               mask = new Fl_Choice(100, 110, 95, 25, _("Kind"));
+                               mask->copy(masks);      mask->callback(cb_style_upd);
+                               angle = new Fl_Choice(100, 140, 95, 25, _("Rotation"));
+                               angle->add("none");     angle->add("+45");      angle->add("90");       angle->add("-45");
+                               angle->callback(cb_style_upd);
+                               msize = new Fl_Spinner(100, 170, 95, 25, _("Size"));
+                               msize->range(1,9);      msize->value(1);        msize->callback(cb_style_upd);
+                               for(int i=0;i<8;i++)    for(int j=0;j<8;j++)
+                               {
+                                       mask_m[i+8*j] = new Fl_Toggle_Button(240+15*i, 110+15*(7-j), 15, 15);
+                                       mask_m[i+8*j]->callback(cb_style_upd);
+                               }
+                       g->end();       gsurf->end();
+               gfont = new Fl_Group(0, 30, 375, 210, _("Text style")); gfont->hide();
+                       bold = new Fl_Check_Button(5, 40, 150, 25, _("Bold style"));
+                       ital = new Fl_Check_Button(5, 65, 150, 25, _("Italic style"));
+                       twire = new Fl_Check_Button(5, 90, 150, 25, _("Wire style"));
+                       uline = new Fl_Check_Button(5, 115, 150, 25, _("Underline"));
+                       oline = new Fl_Check_Button(5, 140, 150, 25, _("Overline"));
+                       bold->callback(cb_style_upd);   ital->callback(cb_style_upd);
+                       twire->callback(cb_style_upd);  uline->callback(cb_style_upd);
+                       oline->callback(cb_style_upd);
+                       align = new Fl_Choice(270, 40, 95, 25, _("Text align"));
+                       align->add("left");     align->add("center");   align->add("right");
+                       align->value(1);        align->callback(cb_style_upd);
+                       vert = new Fl_Choice(270, 75, 95, 25, _("Vertical align"));
+                       vert->add("default");   vert->add("center");    vert->add("under");
+                       vert->value(0); vert->callback(cb_style_upd);
+               gfont->end();   tt->end();      tt->callback(cb_style_upd);
+
+               g = new Fl_Group(0, 265, 375, 155, _("Color(s) or color scheme"));
+               g->box(FL_ENGRAVED_BOX);        g->align(FL_ALIGN_TOP_LEFT);
+                       sch = new Fl_Choice(170, 270, 115, 25, _("Popular color schemes"));
+                       sch->add("BbcyrR");     sch->add("kw");         sch->add("wk");         sch->add("bwr");
+                       sch->add("kHCcw");      sch->add("kBbcw");      sch->add("kRryw");      sch->add("kGgew");
+                       sch->add("BbwrR");      sch->add("BbwgG");      sch->add("GgwmM");      sch->add("UuwqR");
+                       sch->add("QqwcC");      sch->add("CcwyY");      sch->add("bcwyr");      sch->add("wUrqy");
+                       sch->add("UbcyqR");     sch->add("bgr");        sch->callback(cb_style_sch);
+                       plain = new Fl_Check_Button(290, 270, 80, 25, _("plain"));
+                       plain->callback(cb_style_upd);
+                       for(int i=0;i<8;i++)
+                       {
+                               c[i] = new Fl_Choice(5+185*(i/4), 300+30*(i%4), 95, 25);
+                               c[i]->copy(colors);     c[i]->callback(cb_style_upd);
+                               c[i]->tooltip(_("Value for i-th color"));
+                               s[i] = new Fl_Spinner(105+185*(i/4), 300+30*(i%4), 40, 25);
+                               s[i]->range(1,9);       s[i]->value(5);
+                               s[i]->tooltip(_("Brightness of i-th color"));
+                               s[i]->callback(cb_style_upd);
+                               p[i] = new Fl_Input(145+185*(i/4), 300+30*(i%4), 40, 25);
+                               p[i]->tooltip(_("Relative position of i-th color"));
+                               p[i]->callback(cb_style_upd);
+                       }
+                       g->end();
+               res = new Fl_Output(5, 440, 370, 25, _("Resulting string"));
+               res->align(FL_ALIGN_TOP_LEFT);
+               o = new Fl_Button(300, 475, 75, 25, _("Cancel"));       o->callback(cb_dlg_cancel,this);
+               o = new Fl_Return_Button(300, 505, 75, 25, _("OK"));    o->callback(cb_dlg_ok,this);
+               gr = new Fl_MathGL(5, 470, 285, 65);    gr->box(FL_ENGRAVED_BOX);       gr->use_pthr = false;
+               mgl_set_size(gr->get_graph(),285,65);   gr->align(FL_ALIGN_LEFT);
+               w->set_modal(); w->end();
+       }
+       void init()     {       update();       }
+       void set_scheme()
+       {
+               const char *ss = sch->text();
+               if(!ss || *ss==0)       return;
+               for(int i=0;i<8;i++)
+               {       p[i]->value(NULL);      s[i]->value(5); c[i]->value(0); }
+               for(int i=0;i<8;i++)
+               {
+                       if(ss[i]==0)    break;
+                       size_t pos = strchr(cols,ss[i])-cols;
+                       c[i]->value(pos);
+               }
+               update();
+       }
+       void stl_color()
+       {
+               result.clear();
+               for(int i=0;i<8;i++)
+                       result += get_color(c[i],s[i],p[i]);
+       }
+       void stl_line()
+       {
+               stl_color();
+               char dsh = dash->text()[1];
+               char a1 = arr1->text()[1], a2 = arr2->text()[1];
+               const char *s = mark->text();
+               if(*s=='\'')
+               {
+                       if(user->value())       result += '&';
+                       if(solid->value())      result += '#';
+                       result += s[1];
+               }
+               int v = width->value();
+               if(v>1) result += char(v+'0');
+               if(a1!='_')     result = result + a1 + a2;
+               else if(a2!='_')        result += a2;
+               if(dsh=='a')
+               {
+                       unsigned long mask=0;
+                       for(int i=0;i<16;i++)   if(dash_m[i]->value())  mask += 1<<i;
+                       char buf[128];  snprintf(buf,128,"{d%lX}",mask);        // TODO: %llX in 32bit!
+                       result += buf;
+               }
+               else if(dsh!='-')       result += dsh;
+               result = '\''+result+'\'';
+               script = "new a 5 5 'y':plot a "+result+";size 8";
+       }
+       void stl_surf()
+       {
+               stl_color();
+               int v = contt->value(); const char *tt="Tt";
+               if(v>0 && v<3)  result += tt[v-1];
+               const char *m = mask->text();
+               if(*m=='\'')
+               {
+                       v = angle->value();     const char *rr="/I\\";
+                       if(v>0 && v<4)  result += rr[v-1];
+                       v = msize->value();     if(v>1) result += char(v+'0');
+                       result += m[1];
+               }
+               if(*m=='m')
+               {
+                       v = angle->value();     const char *rr="/I\\";
+                       if(v>0 && v<4)  result += rr[v-1];
+                       v = msize->value();     if(v>1) result += char(v+'0');
+                       uint64_t mask=0;
+                       for(int i=0;i<64;i++)   if(mask_m[i]->value())  mask += uint64_t(1)<<i;
+#ifdef WIN32
+                       char buf[128];  snprintf(buf,128,"{s%llX}",mask);
+#else
+                       char buf[128];  snprintf(buf,128,"{s%lX}",mask);
+#endif
+                       result += buf;
+               }
+               if(wire->value())       result += '#';
+               if(sharp->value())      result += '|';
+               if(plain->value())      result += '%';
+               v = atoi(alpha->value());
+               if(v>0 && v<10) result = result + "{A"+char(v+'0')+'}';
+               v = axial->value();     const char *ax="xyz";
+               if(v>0 && v<4)  result = result+':'+ax[v-1];
+               result = '\''+result+'\'';
+               script = "fsurf 'x' "+result;
+       }
+       void stl_font()
+       {
+               stl_color();
+               const char *a="LCR";
+               result = result+':'+a[align->value()];
+               if(bold->value())       result += 'b';
+               if(ital->value())       result += 'i';
+               if(twire->value())      result += 'w';
+               if(uline->value())      result += 'u';
+               if(oline->value())      result += 'o';
+               if(vert->value()==1)    result += 'V';
+               if(vert->value()==2)    result += 'T';
+               result = '\''+result+'\'';
+               script = "text 0 0 'Font test' "+result+";size -8";
+       }
+       void update()
+       {
+               static int busy=0;
+               if(!busy)       {       busy=1;
+                       result.clear();
+                       if(gline->visible())            stl_line();
+                       else if(gfont->visible())       stl_font();
+                       else    stl_surf();
+                       res->value(result.c_str());
+                       mglParse pr;
+                       script = "clf:subplot 1 1 0 '':"+script;
+                       mgl_parse_text(gr->get_graph(), pr.Self(), script.c_str());
+                       gr->update();
+               busy=0; }
+       }
+       void cb_ok()
+       {
+               update();
+               if(e)   e->editor->insert(result.c_str());
+               else if(ext)    ext->value(result.c_str());
+               else    cb_args_set(result.c_str());
+               hide();
+       }
+} style_dlg;
+//-----------------------------------------------------------------------------
+void cb_style_upd(Fl_Widget *, void *) {       style_dlg.update();     }
+void cb_style_sch(Fl_Widget *, void *) {       style_dlg.set_scheme(); }
+//-----------------------------------------------------------------------------
+void style_dlg_cb(Fl_Widget *, void *v)
+{      style_dlg.ext=NULL;     style_dlg.e=(ScriptWindow *)v;  style_dlg.show();       }
+//-----------------------------------------------------------------------------
+void style_in_cb(Fl_Widget *, void *v)
+{      style_dlg.ext=(Fl_Input*)v;     style_dlg.e=NULL;       style_dlg.show();       }
+//-----------------------------------------------------------------------------
+void cb_datsel_upd(Fl_Widget *, void *);
+void cb_datsel_act(Fl_Widget *, void *);
+class DatSelDlg : public GeneralDlg
+{
+       Fl_Choice *name;
+       Fl_Choice *oper;
+       Fl_Choice *dir;
+       Fl_Spinner *x1, *x2, *y1, *y2, *z1, *z2;
+       Fl_Input *clmn;
+       Fl_Check_Button *ax, *ay, *az;
+public:
+       Fl_Input *ext;
+       DatSelDlg() : GeneralDlg()
+       {
+               Fl_Button *o;
+               w = new Fl_Double_Window(355, 255, _("Select data argument"));
+               name = new Fl_Choice(105, 5, 145, 25, _("Data name"));
+               name->callback(cb_datsel_upd);
+               x1 = new Fl_Spinner(105, 35, 60, 25, _("X-slice from"));
+               x2 = new Fl_Spinner(190, 35, 60, 25, _("to"));
+               ax = new Fl_Check_Button(260, 35, 90, 25, _("all"));    ax->callback(cb_datsel_act);
+               y1 = new Fl_Spinner(105, 65, 60, 25, _("Y-slice from"));
+               y2 = new Fl_Spinner(190, 65, 60, 25, _("to"));
+               ay = new Fl_Check_Button(260, 65, 90, 25, _("all"));    ay->callback(cb_datsel_act);
+               z1 = new Fl_Spinner(105, 95, 60, 25, _("Z-slice from"));
+               z2 = new Fl_Spinner(190, 95, 60, 25, _("to"));
+               az = new Fl_Check_Button(260, 95, 90, 25, _("all"));    az->callback(cb_datsel_act);
+               clmn = new Fl_Input(105, 125, 245, 25, _("Column expr"));
+               oper = new Fl_Choice(105, 155, 130, 25, _("Operation"));
+               oper->add("none");      oper->add("max");       oper->add("min");       oper->add("sum");
+               oper->add("trace");     oper->add("pulse");     oper->value(0);
+               dir = new Fl_Choice(285, 155, 65, 25, _("along"));
+               dir->add("none");       dir->add("x");  dir->add("y");  dir->add("z");
+               dir->add("xy");         dir->add("xz"); dir->add("yz");
+               o = new Fl_Button(190, 190, 75, 25, _("Cancel"));       o->callback(cb_dlg_cancel,this);
+               o = new Fl_Return_Button(275, 190, 75, 25, _("OK"));    o->callback(cb_dlg_ok,this);
+               w->set_modal(); w->end();
+       }
+       void cb_ok()
+       {
+               result.clear();
+               if(name->value()<0)
+               {       fl_alert(_("You need to select data array"));   return; }
+               std::string data = name->text();
+               const char *eq = clmn->value();
+               int rx=ax->value(), ry=ay->value(), rz=az->value();
+               int vx1=x1->value(), vy1=y1->value(), vz1=z1->value();
+               int vx2=x2->value(), vy2=y2->value(), vz2=z2->value();
+               if(eq && *eq)   data = data+"('"+eq+"')";
+               else    if(!rx || !ry || !rz)
+               {
+                       char bx[256],by[256],bz[256];
+                       if(rx)  strcpy(bx,"(:");
+                       else if(vx2<=vx1)       snprintf(bx,255,"(%d",vx1);
+                       else    snprintf(bx,255,"(%d:%d",vx1,vx2);
+                       if(ry)  strcpy(by,",:");
+                       else if(vy2<=vy1)       snprintf(by,255,",%d",vy1);
+                       else    snprintf(by,255,",%d:%d",vy1,vy2);
+                       if(vz2<=vz1)    snprintf(bz,255,",%d)",vz1);
+                       else    snprintf(bz,255,",%d:%d)",vz1,vz2);
+                       if(!rz) data = data+bx+by+bz;
+                       else if(!ry)    data = data+bx+by+')';
+                       else if(!rx)    data = data+bx+')';
+               }
+               if(oper->value()>0)
+               {
+                       result = result+'{'+oper->text()+' '+data;
+                       if(dir->value()>0)      result = result+" '"+dir->text()+"'}";
+                       else    result += '}';
+               }
+               else    result = data;
+               if(e)   e->editor->insert(result.c_str());
+               else if(ext)    ext->value(result.c_str());
+               else    cb_args_set(result.c_str());
+               hide();
+       }
+       void init()
+       {
+               name->clear();
+               long n = Parse->GetNumVar();
+               for(long i=0;i<n;i++)
+               {
+                       HCDT d = Parse->GetVar(i);
+                       if(!d->temp)    name->add(wcstombs(d->Name()).c_str());
+               }
+               x1->value(0);   x2->value(0);
+               y1->value(0);   y2->value(0);
+               z1->value(0);   z2->value(0);
+       }
+       void update()
+       {
+               HCDT d = Parse->FindVar(name->text());
+               if(d)
+               {
+                       long nx=d->GetNx()-1, ny=d->GetNy()-1, nz=d->GetNz()-1;
+                       x1->range(0,nx);        if(x1->value()>nx)      x1->value(0);
+                       x2->range(0,nx);        if(x2->value()>nx)      x2->value(0);
+                       y1->range(0,ny);        if(y1->value()>ny)      y1->value(0);
+                       y2->range(0,ny);        if(y2->value()>ny)      y2->value(0);
+                       z1->range(0,nz);        if(z1->value()>nz)      z1->value(0);
+                       z2->range(0,nz);        if(z2->value()>nz)      z2->value(0);
+                       ax->value(1);   ay->value(1);   az->value(1);
+                       x1->deactivate();       y1->deactivate();       z1->deactivate();
+                       x2->deactivate();       y2->deactivate();       z2->deactivate();
+                       clmn->value("");
+               }
+       }
+       void activate()
+       {
+               if(!ax->value())        {       x1->activate(); x2->activate(); }
+               else    {       x1->deactivate();       x2->deactivate();       }
+               if(!ay->value())        {       y1->activate(); y2->activate(); }
+               else    {       y1->deactivate();       y2->deactivate();       }
+               if(!az->value())        {       z1->activate(); z2->activate(); }
+               else    {       z1->deactivate();       z2->deactivate();       }
+       }
+} datsel_dlg;
+//-----------------------------------------------------------------------------
+void cb_datsel_upd(Fl_Widget *, void *)        {       datsel_dlg.update();    }
+void cb_datsel_act(Fl_Widget *, void *)        {       datsel_dlg.activate();  }
+//-----------------------------------------------------------------------------
+void datsel_dlg_cb(Fl_Widget *, void *v)
+{      datsel_dlg.ext=NULL;    datsel_dlg.e=(ScriptWindow *)v; datsel_dlg.show();      }
+//-----------------------------------------------------------------------------
+void datsel_in_cb(Fl_Widget *, void *v)
+{      datsel_dlg.ext=(Fl_Input*)v;    datsel_dlg.e=NULL;      datsel_dlg.show();      }
+//-----------------------------------------------------------------------------
+std::string with_arg(std::string ss, std::vector<std::string> prev)
+{
+       size_t l=ss.length(), n=prev.size();
+       for(size_t i=0;i<n;i++)
+               if(!strncmp(prev[i].c_str(),ss.c_str(),l))
+               {       ss = prev[i];   break;  }
+       return ss;
+}
+//-----------------------------------------------------------------------------
+void cb_cmd_type(Fl_Widget*, void*);
+void cb_cmd_cmd(Fl_Widget*, void*);
+void cb_cmd_var(Fl_Widget*, void*);
+void cb_cmd_args(Fl_Widget*, void*);
+class NewCmdDlg : public GeneralDlg
+{
+       Fl_Choice *type, *cmd, *var;
+       Fl_Group *desc;
+       Fl_Select_Browser *args;
+       Fl_Input *opt;
+       Fl_Help_View *help;
+       std::vector<std::string> cmds[17];      ///< commands divided by type
+public:
+       NewCmdDlg() : GeneralDlg()
+       {
+               Fl_Button *o;
+               w = new Fl_Double_Window(780, 300, _("New command"));
+               Fl_Group *g = new Fl_Group(5,5,315,320);
+               type = new Fl_Choice(80, 5, 270, 25, _("Kind"));
+               type->tooltip(_("Groups of MGL commands"));
+               type->callback(cb_cmd_type);
+               type->add(_("1D plots"));
+               type->add(_("2D plots"));
+               type->add(_("3D plots"));
+               type->add(_("Dual plots"));
+               type->add(_("Vector plots"));
+               type->add(_("Other plots"));
+               type->add(_("Text and legend"));
+               type->add(_("Create data and IO"));
+               type->add(_("Data transform"));
+               type->add(_("Data handling"));
+               type->add(_("Axis and colorbar"));
+               type->add(_("Axis setup"));
+               type->add(_("General setup"));
+               type->add(_("Scale and rotate"));
+               type->add(_("Program flow"));
+               type->add(_("Primitives"));
+
+               cmd = new Fl_Choice(80, 35, 270, 25, _("Command"));
+               cmd->tooltip(_("MGL commands for selected group"));
+               cmd->callback(cb_cmd_cmd);
+               var = new Fl_Choice(80, 95, 270, 25, _("Variant"));
+               var->tooltip(_("Variant 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."));
+               var->callback(cb_cmd_var);
+               desc = new Fl_Group(0, 65, 350, 25, _("Description"));
+               desc->box(FL_ENGRAVED_BOX);     desc->labelsize(12);
+               desc->align(FL_ALIGN_CENTER);   desc->end();
+               desc->tooltip(_("Short description of selected command"));
+               args = new Fl_Select_Browser(5, 140, 345, 95, _("Arguments"));
+               args->align(FL_ALIGN_TOP_LEFT); args->callback(cb_cmd_args);
+               args->tooltip(_("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."));
+               static int widths[] = { 95, 250, 0 };  // widths for each column
+               args->column_widths(widths);    args->column_char('\t');
+
+               opt = new Fl_Input(60, 240, 265, 25, _("Options"));
+               o = new Fl_Button(325, 240, 25, 25, "...");     o->callback(option_in_cb,opt);
+
+               o = new Fl_Button(190, 270, 75, 25, _("Cancel"));       o->callback(cb_dlg_cancel,this);
+               o = new Fl_Return_Button(275, 270, 75, 25, _("OK"));    o->callback(cb_dlg_ok,this);
+               g->end();       g->resizable(args);
+
+               help = new Fl_Help_View(360, 5, 415, 290);      help->labelsize(12);
+               w->set_modal(); w->end();       w->resizable(help);
+       }
+       void init()     // fill cmds from parser for all categories
+       {
+               long i, n = Parse->GetCmdNum();
+               for(i=0;i<n;i++)
+               {
+                       std::string name = Parse->GetCmdName(i);
+                       switch(Parse->CmdType(name.c_str()))
+                       {
+                               case 1: cmds[5].push_back(name);        break;
+                               case 2: cmds[5].push_back(name);        break;
+                               case 3: cmds[12].push_back(name);       break;
+                               case 4: cmds[9].push_back(name);        break;
+                               case 5: cmds[7].push_back(name);        break;
+                               case 6: cmds[13].push_back(name);       break;
+                               case 7: cmds[14].push_back(name);       break;
+                               case 8: cmds[0].push_back(name);        break;
+                               case 9: cmds[1].push_back(name);        break;
+                               case 10:cmds[2].push_back(name);        break;
+                               case 11:cmds[3].push_back(name);        break;
+                               case 12:cmds[4].push_back(name);        break;
+                               case 13:cmds[10].push_back(name);       break;
+                               case 14:cmds[15].push_back(name);       break;
+                               case 15:cmds[11].push_back(name);       break;
+                               case 16:cmds[6].push_back(name);        break;
+                               case 17:cmds[8].push_back(name);        break;
+                       }
+               }
+               type->value(0); type_sel();
+       }
+       void type_sel() // fill list of commands for selected type
+       {
+               int t = type->value();  cmd->clear();
+               for(size_t i=0;i<cmds[t].size();i++)    cmd->add(cmds[t][i].c_str());
+               cmd->value(0);  cmd_sel();
+       }
+       void cmd_sel()  // fill list of variants for selected command
+       {
+               static std::string str;
+               const char *c = cmd->text();
+               desc->label(Parse->CmdDesc(c));
+               str = helpname+c;
+               help->load(str.c_str());
+               std::string par = Parse->CmdFormat(c), cname;
+               std::vector<std::string> vars;
+               size_t isp = par.find_first_of(' ');
+               if(isp<par.length())
+               {
+                       cname = par.substr(0,isp+1);
+                       par = par.substr(isp+1);
+                       while((isp=par.find_first_of('|'))<par.length())
+                       {
+                               vars.push_back(cname+par.substr(0,isp));
+                               par = par.substr(isp+1);
+                       }
+                       vars.push_back(cname+par);
+               }
+               else    vars.push_back(par);
+               var->clear();
+               for(size_t i=0;i<vars.size();i++)       var->add(vars[i].c_str());
+               var->value(0);  var_sel();
+       }
+       void var_sel()  // fill list of arguments for selected variant
+       {
+               std::string par = var->text(), sec;
+               size_t isp = par.find_first_of(' ');
+               par = par.substr(isp+1);        // remove command name
+               isp = par.find_first_of('[');   // here secional args starts
+               sec = isp<par.length()?par.substr(isp+1,par.length()-isp-2):"";
+               par = isp>0?par.substr(0,isp-1):"";
+               std::vector<std::string> prev_args;
+               for(int i=1;i<=args->size();i++)
+               {
+                       const char *s = args->text(i);
+                       if(s && *s && strchr(s,'\t'))   prev_args.push_back(s[0]=='@'?s+3:s);
+               }
+               args->clear();
+               while((isp=par.find_first_of(' '))<par.length())
+               {
+                       args->add(("@b "+with_arg(par.substr(0,isp), prev_args)).c_str());
+                       par = par.substr(isp+1);
+               }
+               if(!par.empty())        args->add(("@b "+with_arg(par, prev_args)).c_str());
+               while((isp=sec.find_first_of(' '))<sec.length())
+               {
+                       args->add(with_arg(sec.substr(0,isp), prev_args).c_str());
+                       sec = sec.substr(isp+1);
+               }
+               if(!sec.empty())        args->add(with_arg(sec, prev_args).c_str());
+       }
+       void args_sel() // fill argument by calling external dialog
+       {
+               int a = args->value();
+               const char *s = args->text(a);  if(!s || *s==0) return;
+               std::string arg = s, val;
+               size_t isp = arg.find_first_of('\t');
+               val = arg.substr(isp+1);        arg = arg.substr(0,isp);
+               if(arg[0]=='@') arg = arg.substr(3);
+               if(arg[0]>='A' && arg[0]<='Z')  datsel_dlg_cb(0,0);     // this is data
+               else if(arg=="'fmt'")   style_dlg_cb(0,0);      // this is style
+               else if(arg=="'fname'") ins_fname_cb(0,0);      // this is file name
+               else if(arg=="'path'")  ins_path_cb(0,0);       // this is path
+               else if(arg=="'dir'")   dirsel_dlg_cb(0,0);     // this is path
+               else if(arg[0]=='\'')   // this is general string
+               {
+                       const char *s = fl_input(_("Enter value for %s argument"), val.c_str(), arg.c_str());
+                       if(s)
+                       {       std::string ss=s;       args_set(('\''+ss+'\'').c_str());       }
+               }
+               else    // this is general constant
+               {
+                       const char *s = fl_input(_("Enter value for %s argument"), val.c_str(), arg.c_str());
+                       if(s)   args_set(s);
+               }
+       }
+       void args_set(const char *val)  // set value for current argument
+       {
+               int a = args->value();
+               const char *s = args->text(a);  if(!s || *s==0) return;
+               std::string arg = s;
+               size_t isp = arg.find_first_of('\t');
+               arg = arg.substr(0,isp)+'\t'+val;
+               args->text(a,arg.c_str());
+       }
+       void cb_ok()
+       {
+               std::string par = var->text();
+               size_t isp = par.find_first_of(' ');
+               result = par.substr(0,isp);     // command name
+               for(int i=1;i<=args->size();i++)
+               {
+                       const char *s = args->text(i);
+                       if(!s)  continue;
+                       const char *p = strchr(s,'\t');
+                       if(s[0]=='@' && !p)
+                       {
+                               fl_alert(_("Required argument %s is not specified!"),s+3);      return;
+                       }
+                       if(p)   result = result+' '+(p+1);
+               }
+               result += opt->value();
+               if(e)
+               {
+                       int p = textbuf->line_start(e->editor->insert_position());
+                       textbuf->insert(p, (result+'\n').c_str());
+               }
+               hide();
+       }
+       void set_cmd(const char *line)  // TODO
+       {}
+} newcmd_dlg;
+//-----------------------------------------------------------------------------
+void cb_cmd_type(Fl_Widget*, void*)    {       newcmd_dlg.type_sel();  }
+void cb_cmd_cmd(Fl_Widget*, void*)     {       newcmd_dlg.cmd_sel();   }
+void cb_cmd_var(Fl_Widget*, void*)     {       newcmd_dlg.var_sel();   }
+void cb_cmd_args(Fl_Widget*, void*)    {       newcmd_dlg.args_sel();  }
+void cb_args_set(const char *val)      {       newcmd_dlg.args_set(val);       }
+//-----------------------------------------------------------------------------
+void newcmd_dlg_cb(Fl_Widget*,void *v)         // TODO parse current line?!?
+{      newcmd_dlg.e=(ScriptWindow *)v; newcmd_dlg.show();      }
+//-----------------------------------------------------------------------------
+void cb_setup_save(Fl_Widget*,void *v);
+class SetupDlg : public GeneralDlg
+{
+       Fl_Choice *xlpos, *ylpos, *zlpos, *clpos;
+       Fl_Float_Input *x1, *x2, *x0, *xtick, *xstick, *xotick;
+       Fl_Input *xlabel, *xtmpl, *xfact;
+       Fl_Float_Input *y1, *y2, *y0, *ytick, *ystick, *yotick;
+       Fl_Input *ylabel, *ytmpl, *yfact;
+       Fl_Float_Input *z1, *z2, *z0, *ztick, *zstick, *zotick;
+       Fl_Input *zlabel, *ztmpl, *zfact;
+       Fl_Float_Input *c1, *c2, *c0, *ctick;
+       Fl_Input *clabel, *ctmpl, *cfact;
+       Fl_Float_Input *alphadef, *ambient, *diffuse;
+       Fl_Input *palette, *font_stl, *axis_stl, *plotid;
+       Fl_Float_Input *fog, *fog_dz, *pendelta;
+       Fl_Float_Input *meshnum, *facenum, *arr_size, *bar_size;
+       Fl_Float_Input *mrk_size, *txt_size, *tick_size;
+
+       Fl_Check_Button *alpha, *light, *cut, *attach;
+       Fl_Check_Button *origintick, *gray, *rotatetext;
+       Fl_Choice *time, *tunetick, *ternary, *transptype;
+       Fl_Spinner *variant;
+
+       Fl_Toggle_Button *lb[10];
+       Fl_Choice *lc[10];
+       Fl_Float_Input *lx[10], *ly[10], *lz[10], *lbr[10];
+       Fl_Input *fname;
+public:
+       SetupDlg() : GeneralDlg()
+       {
+               Fl_Button *o;   Fl_Group *g, *gg;
+               w = new Fl_Double_Window(525, 395, _("Setup script"));
+               Fl_Tabs* tt = new Fl_Tabs(0, 0, 525, 355);
+               gg = new Fl_Group(0, 25, 525, 330, _("Axis setup"));
+                       new Fl_Box(85, 30, 100, 25, _("X axis"));
+                       x1 = new Fl_Float_Input(85, 55, 100, 25, _("Minimal"));
+                       x2 = new Fl_Float_Input(85, 85, 100, 25, _("Maximal"));
+                       x0 = new Fl_Float_Input(85, 115, 100, 25, _("Origin"));
+                       xlabel = new Fl_Input(85, 145, 100, 25, _("Label"));
+                       xtick = new Fl_Float_Input(85, 205, 100, 25, _("Ticks"));
+                       xlpos = new Fl_Choice(85, 175, 100, 25, _("at position"));
+                       xlpos->add(_("left"));  xlpos->add(_("center"));
+                       xlpos->add(_("right")); xlpos->value(1);
+                       xstick = new Fl_Float_Input(85, 235, 100, 25, _("Subticks"));
+                       xotick = new Fl_Float_Input(85, 265, 100, 25, _("Ticks start"));
+                       xtmpl = new Fl_Input(85, 295, 100, 25, _("Template"));
+                       xfact = new Fl_Input(85, 325, 100, 25, _("Factor"));
+                       new Fl_Box(195, 30, 100, 25, _("Y axis"));
+                       y1 = new Fl_Float_Input(195, 55, 100, 25);
+                       y2 = new Fl_Float_Input(195, 85, 100, 25);
+                       y0 = new Fl_Float_Input(195, 115, 100, 25);
+                       ylabel = new Fl_Input(195, 145, 100, 25);
+                       ytick = new Fl_Float_Input(195, 205, 100, 25);
+                       ylpos = new Fl_Choice(195, 175, 100, 25);
+                       ylpos->add(_("left"));  ylpos->add(_("center"));
+                       ylpos->add(_("right")); ylpos->value(1);
+                       ystick = new Fl_Float_Input(195, 235, 100, 25);
+                       yotick = new Fl_Float_Input(195, 265, 100, 25);
+                       ytmpl = new Fl_Input(195, 295, 100, 25);
+                       yfact = new Fl_Input(195, 325, 100, 25);
+                       new Fl_Box(305, 30, 100, 25, _("Z axis"));
+                       z1 = new Fl_Float_Input(305, 55, 100, 25);
+                       z2 = new Fl_Float_Input(305, 85, 100, 25);
+                       z0 = new Fl_Float_Input(305, 115, 100, 25);
+                       zlabel = new Fl_Input(305, 145, 100, 25);
+                       ztick = new Fl_Float_Input(305, 205, 100, 25);
+                       zlpos = new Fl_Choice(305, 175, 100, 25);
+                       zlpos->add(_("left"));  zlpos->add(_("center"));
+                       zlpos->add(_("right")); zlpos->value(1);
+                       zstick = new Fl_Float_Input(305, 235, 100, 25);
+                       zotick = new Fl_Float_Input(305, 265, 100, 25);
+                       ztmpl = new Fl_Input(305, 295, 100, 25);
+                       zfact = new Fl_Input(305, 325, 100, 25);
+                       new Fl_Box(415, 30, 100, 25, _("C axis"));
+                       c1 = new Fl_Float_Input(415, 55, 100, 25);
+                       c2 = new Fl_Float_Input(415, 85, 100, 25);
+                       c0 = new Fl_Float_Input(415, 115, 100, 25);
+                       clabel = new Fl_Input(415, 145, 100, 25);
+                       ctick = new Fl_Float_Input(415, 205, 100, 25);
+                       clpos = new Fl_Choice(415, 175, 100, 25);
+                       clpos->add(_("left"));  clpos->add(_("center"));
+                       clpos->add(_("right")); clpos->value(1);
+                       ctmpl = new Fl_Input(415, 295, 100, 25);
+                       cfact = new Fl_Input(415, 325, 100, 25);
+                       gg->end();
+               gg = new Fl_Group(0, 25, 525, 330, _("General setup")); gg->hide();
+                       g = new Fl_Group(5, 45, 180, 305, _("Colors")); g->box(FL_ENGRAVED_BOX);
+                       alphadef = new Fl_Float_Input(80, 55, 100, 25, _("AlphaDef"));
+                       ambient = new Fl_Float_Input(80, 85, 100, 25, _("Ambient"));
+                       diffuse = new Fl_Float_Input(80, 115, 100, 25, _("Diffuse"));
+                       palette = new Fl_Input(80, 145, 100, 25, _("Palette"));
+                       font_stl = new Fl_Input(80, 175, 100, 25, _("Font"));
+                       axis_stl = new Fl_Input(80, 205, 100, 25, _("Axis"));
+                       fog = new Fl_Float_Input(80, 235, 100, 25, _("Fog"));
+                       fog_dz = new Fl_Float_Input(80, 265, 100, 25, _("Fog dist."));
+                       gray = new Fl_Check_Button(80, 290, 100, 25, _("grayscale"));
+                       alpha = new Fl_Check_Button(10, 315, 65, 25, _("alpha"));
+                       light = new Fl_Check_Button(80, 315, 100, 25, _("lighting"));
+                       g->end();
+                       g = new Fl_Group(185, 45, 180, 250, _("Sizes"));        g->box(FL_ENGRAVED_BOX);
+                       meshnum = new Fl_Float_Input(260, 55, 100, 25, _("meshnum"));
+                       facenum = new Fl_Float_Input(260, 85, 100, 25, _("facenum"));
+                       arr_size = new Fl_Float_Input(260, 115, 100, 25, _("arrows"));
+                       bar_size = new Fl_Float_Input(260, 145, 100, 25, _("bars"));
+                       mrk_size = new Fl_Float_Input(260, 175, 100, 25, _("markers"));
+                       txt_size = new Fl_Float_Input(260, 205, 100, 25, _("text"));
+                       tick_size = new Fl_Float_Input(260, 235, 100, 25, _("ticks"));
+                       pendelta = new Fl_Float_Input(260, 265, 100, 25, _("pen blur"));
+                       g->end();
+                       g = new Fl_Group(365, 45, 155, 305, _("Others"));       g->box(FL_ENGRAVED_BOX);
+                       cut = new Fl_Check_Button(370, 50, 115, 25, _("cutting"));
+                       attach = new Fl_Check_Button(370, 70, 115, 25, _("attach light"));
+                       origintick = new Fl_Check_Button(370, 90, 115, 25, _("no origin tick"));
+                       rotatetext = new Fl_Check_Button(370, 110, 115, 25, _("rotate text"));
+
+                       time = new Fl_Choice(370, 150, 145, 25, _("Time ticks"));
+                       time->add("none");      time->add("x"); time->add("y"); time->add("z");
+                       time->align(FL_ALIGN_TOP_LEFT); time->value(0);
+                       tunetick = new Fl_Choice(370, 195, 145, 25, _("Tune ticks"));
+                       tunetick->add(_("none"));       tunetick->add(_("factor"));
+                       tunetick->add(_("increment"));  tunetick->add(_("both"));
+                       tunetick->align(FL_ALIGN_TOP_LEFT);     tunetick->value(0);
+                       ternary = new Fl_Choice(370, 235, 145, 25, _("Ternary"));
+                       ternary->add(_("none"));        ternary->add(_("ternary"));
+                       ternary->add(_("quaternary"));  ternary->add(_("projection"));
+                       ternary->add(_("ternary proj"));        ternary->add(_("quaternary proj"));
+                       ternary->align(FL_ALIGN_TOP_LEFT);      ternary->value(0);
+                       transptype = new Fl_Choice(370, 275, 145, 25, _("Transparency type"));
+                       transptype->add(_("default"));  ternary->add(_("glass-like"));
+                       transptype->add(_("lamp-like"));
+                       transptype->align(FL_ALIGN_TOP_LEFT);   transptype->value(0);
+                       variant = new Fl_Spinner(370, 315, 145, 25, _("Variant"));
+                       variant->align(FL_ALIGN_TOP_LEFT);      variant->range(0,100);  variant->value(0);
+                       g->end();
+               plotid = new Fl_Input(190, 321, 172, 25, _("Plot ID"));
+               plotid->align(FL_ALIGN_TOP_LEFT);
+               gg->end();
+               gg = new Fl_Group(0, 25, 525, 330, _("Light settings"));        gg->hide();
+                       static const char *id[10]={"0:","1:","2:","3:","4:","5:","6:","7:","8:","9:"};
+                       for(int i=0;i<10;i++)
+                       {
+                               lb[i] = new Fl_Toggle_Button(10, 50+30*i, 25, 25, id[i]);
+                               lx[i] = new Fl_Float_Input(40, 50+30*i, 90, 25);
+                               ly[i] = new Fl_Float_Input(135, 50+30*i, 90, 25);
+                               lz[i] = new Fl_Float_Input(230, 50+30*i, 90, 25);
+                               lc[i] = new Fl_Choice(325, 50+30*i, 95, 25);
+                               lbr[i]= new Fl_Float_Input(425, 50+30*i, 90, 25);
+                               lc[i]->copy(colors);    lc[i]->value(0);
+                       }
+                       lx[0]->label(_("X position"));  lx[0]->align(FL_ALIGN_TOP_LEFT);
+                       ly[0]->label(_("Y position"));  ly[0]->align(FL_ALIGN_TOP_LEFT);
+                       lz[0]->label(_("Z position"));  lz[0]->align(FL_ALIGN_TOP_LEFT);
+                       lc[0]->label(_("Color"));                       lc[0]->align(FL_ALIGN_TOP_LEFT);
+                       lbr[0]->label(_("Brightness")); lbr[0]->align(FL_ALIGN_TOP_LEFT);
+                       gg->end();      tt->end();
+               o = new Fl_Button(365, 365, 75, 25, _("Cancel"));       o->callback(cb_dlg_cancel,this);
+               o = new Fl_Return_Button(445, 365, 75, 25, _("OK"));    o->callback(cb_dlg_ok,this);
+               fname = new Fl_Input(100, 365, 175, 25, _("File to export"));
+               o = new Fl_Button(275, 365, 25, 25, "@->");     o->callback(cb_setup_save);
+               o->tooltip(_("Keep empty to put at beginning of main script."));
+               w->end();
+       }
+       void prepare()
+       {
+               result.clear();
+               const char *s1, *s2, *s3, *s4;
+               s1=x1->value(); s2=x2->value();
+               if(s1 && *s1 && s2 && *s2)      result = result+"xrange "+s1+' '+s2+'\n';
+               s1=y1->value(); s2=y2->value();
+               if(s1 && *s1 && s2 && *s2)      result = result+"yrange "+s1+' '+s2+'\n';
+               s1=z1->value(); s2=z2->value();
+               if(s1 && *s1 && s2 && *s2)      result = result+"zrange "+s1+' '+s2+'\n';
+               s1=c1->value(); s2=c2->value();
+               if(s1 && *s1 && s2 && *s2)      result = result+"crange "+s1+' '+s2+'\n';
+               s1=x0->value(); s2=y0->value(); s3=z0->value();
+               if(s3 && *s3)   result = result+"origin "+(s1?s1:"nan")+' '+(s2?s2:"nan")+' '+s3+'\n';
+               else if(s2 && *s2)      result = result+"origin "+(s1?s1:"nan")+' '+s2+'\n';
+               else if(s1 && *s1)      result = result+"origin "+s1+"nan\n";
+
+               s1=xtmpl->value();      if(s1 && *s1)   result = result+"xtick '"+s1+"'\n";
+               s1=ytmpl->value();      if(s1 && *s1)   result = result+"ytick '"+s1+"'\n";
+               s1=ztmpl->value();      if(s1 && *s1)   result = result+"ztick '"+s1+"'\n";
+               s1=ctmpl->value();      if(s1 && *s1)   result = result+"ctick '"+s1+"'\n";
+
+               s1=xtick->value();      s2=xstick->value();     s3=xotick->value();     s4=xfact->value();
+               if(s4 && *s4)   result = result+"xtick "+(s1?s1:"0")+' '+(s2?s2:"0")+' '+(s3?s3:"nan")+" '"+s4+"'\n";
+               else if(s3 && *s3)      result = result+"xtick "+(s1?s1:"0")+' '+(s2?s2:"0")+' '+s3+'\n';
+               else if(s2 && *s2)      result = result+"xtick "+(s1?s1:"0")+' '+s2+'\n';
+               else if(s1 && *s1)      result = result+"xtick "+s1+'\n';
+               s1=ytick->value();      s2=ystick->value();     s3=yotick->value();     s4=yfact->value();
+               if(s4 && *s4)   result = result+"ytick "+(s1?s1:"0")+' '+(s2?s2:"0")+' '+(s3?s3:"nan")+" '"+s4+"'\n";
+               else if(s3 && *s3)      result = result+"ytick "+(s1?s1:"0")+' '+(s2?s2:"0")+' '+s3+'\n';
+               else if(s2 && *s2)      result = result+"ytick "+(s1?s1:"0")+' '+s2+'\n';
+               else if(s1 && *s1)      result = result+"ytick "+s1+'\n';
+               s1=ztick->value();      s2=zstick->value();     s3=zotick->value();     s4=zfact->value();
+               if(s4 && *s4)   result = result+"ztick "+(s1?s1:"0")+' '+(s2?s2:"0")+' '+(s3?s3:"nan")+" '"+s4+"'\n";
+               else if(s3 && *s3)      result = result+"ztick "+(s1?s1:"0")+' '+(s2?s2:"0")+' '+s3+'\n';
+               else if(s2 && *s2)      result = result+"ztick "+(s1?s1:"0")+' '+s2+'\n';
+               else if(s1 && *s1)      result = result+"ztick "+s1+'\n';
+               s1=ctick->value();      s4=cfact->value();
+               if(s4 && *s4)   result = result+"ctick "+(s1?s1:"0")+" '"+s4+"'\n";
+               else if(s1 && *s1)      result = result+"ctick "+s1+'\n';
+               const char *pos[3]={"' -1\n","' 0\n","' 1\n"};
+               s1=xlabel->value();     if(s1 && *s1)   result = result+"xlabel '"+s1+pos[xlpos->value()];
+               s1=ylabel->value();     if(s1 && *s1)   result = result+"ylabel '"+s1+pos[ylpos->value()];
+               s1=zlabel->value();     if(s1 && *s1)   result = result+"zlabel '"+s1+pos[zlpos->value()];
+//TODO s1=clabel->value();     if(s1 && *s1)   result = result+"clabel '"+s1+pos[clpos->value()];
+
+               s1=alphadef->value();   if(s1 && *s1)   result = result+"alphadef "+s1+'\n';
+               s1=ambient->value();    if(s1 && *s1)   result = result+"ambient "+s1+'\n';
+               s1=diffuse->value();    if(s1 && *s1)   result = result+"diffuse "+s1+'\n';
+               s1=palette->value();    if(s1 && *s1)   result = result+"palette '"+s1+"'\n";
+               s1=plotid->value();             if(s1 && *s1)   result = result+"plotid '"+s1+"'\n";
+               s1=axis_stl->value();   if(s1 && *s1)   result = result+"axisstl '"+s1+"'\n";
+               s1=meshnum->value();    if(s1 && *s1)   result = result+"meshnum "+s1+'\n';
+               s1=facenum->value();    if(s1 && *s1)   result = result+"facenum "+s1+'\n';
+               s1=arr_size->value();   if(s1 && *s1)   result = result+"arrowsize "+s1+'\n';
+               s1=bar_size->value();   if(s1 && *s1)   result = result+"barwidth "+s1+'\n';
+               s1=mrk_size->value();   if(s1 && *s1)   result = result+"marksize "+s1+'\n';
+               s1=pendelta->value();   if(s1 && *s1)   result = result+"pendelta "+s1+'\n';
+               s1=tick_size->value();  if(s1 && *s1)   result = result+"ticklen "+s1+'\n';
+
+               s1=font_stl->value();   s2=txt_size->value();
+               if(s2 && *s2)   result = result+"font '"+(s1?s1:"")+"' "+s2+'\n';
+               else if(s1 && *s1)      result = result+"font '"+s1+"'\n";
+               s1=fog->value();        s2=fog_dz->value();
+               if(s1 && *s1 && s2 && *s2)      result = result+"fog "+s1+' '+s2+'\n';
+               else if(s1 && *s1)      result = result+"font "+s1+"\n";
+
+               if(alpha->value())      result = result+"alpha on\n";
+               if(light->value())      result = result+"light on\n";
+               if(cut->value())        result = result+"cut on\n";
+               if(attach->value())     result = result+"attachlight on\n";
+               if(gray->value())       result = result+"gray on\n";
+               if(rotatetext->value()) result = result+"rotatetext on\n";
+               if(origintick->value()) result = result+"origintick off\n";
+               if(variant->value()>0)
+               {       char buf[32];   snprintf(buf,31,"variant %ld\n",mgl_int(variant->value()));     result += buf;  }
+               const char *stime[4]={"''\n","'x'\n","'y'\n","'z'\n"};
+               if(time->value()>0)     result = result+"timetick "+stime[time->value()];
+               const char *stune[4]={" 0\n"," 1\n"," 2\n"," 3\n"};
+               if(tunetick->value()>0) result = result+"tunetick "+stune[tunetick->value()];
+               const char *stern[6]={" 0\n"," 1\n"," 2\n"," 4\n"," 5\n"," 6\n"};
+               if(ternary->value()>0)  result = result+"ternary "+stern[ternary->value()];
+               const char *stype[3]={" 0\n"," 1\n"," 2\n"};
+               if(transptype->value()>0)       result = result+"ternary "+stype[transptype->value()];
+               for(int i=0;i<10;i++)
+               {
+                       if(!lb[i]->value())     continue;
+                       s1 = lx[i]->value();    s2 = ly[i]->value();
+                       s3 = lz[i]->value();    s4 = lbr[i]->value();
+                       char col = cols[lc[i]->value()];        if(col==' ')    col='w';
+                       if(s1 && *s1 && s2 && *s2 && s3 && *s3)
+                       {
+                               result = result+"light "+char('0'+i)+' '+s1+' '+s2+' '+s3+" '"+col+'\'';
+                               if(s4 && *s4)   result = result+' '+s4;
+                               result += '\n';
+                       }
+               }
+       }
+       void cb_ok()
+       {
+               prepare();
+               if(e)   {       e->draw->script=result; e->graph->update();     }
+               hide();
+       }
+       void save()
+       {
+               prepare();
+               const char *s=fname->value();
+               if(s && *s)
+               {
+                       FILE *fp = fl_fopen(s,"wt");
+                       if(fp)  {       fputs(result.c_str(),fp);       fclose(fp);     }
+                       else    fl_alert(_("Couldn't open file %s"),s);
+               }
+               else
+               {
+                       textbuf->insert(0, ("##### setup start #####\n" + result + "##### setup end #####\n").c_str());
+//                     if(e)   e->draw->script="";
+               }
+       }
+} setup_dlg;
+//-----------------------------------------------------------------------------
+void setup_dlg_cb(Fl_Widget*,void *v)
+{      setup_dlg.e = (ScriptWindow*)v; setup_dlg.show();       }
+//-----------------------------------------------------------------------------
+void cb_setup_save(Fl_Widget*,void *v) {       setup_dlg.save();       }
+//-----------------------------------------------------------------------------
+void cp_inplot_upd(Fl_Widget*,void*);
+void cb_only_inplot(Fl_Widget*,void*);
+class InplotDlg : public GeneralDlg
+{
+       Fl_Round_Button *k1, *k2, *k3, *k4, *k5, *k6;
+       Fl_Spinner *n1, *m1, *i1;
+       Fl_Counter *x1, *y1;
+       Fl_Spinner *n2, *m2, *i2, *x2, *y2;
+       Fl_Spinner *n3, *m3, *i3;
+       Fl_Counter *d3;
+       Fl_Spinner *n4, *i4;
+       Fl_Counter *d4;
+       Fl_Spinner *n5, *i5;
+       Fl_Float_Input *xx1, *xx2, *yy1, *yy2;
+       Fl_Spinner *tet, *phi;
+       Fl_Float_Input *ax, *ay;
+       Fl_Check_Button *rl, *rb, *rt, *rr, *rw;
+       Fl_Input *text;
+       Fl_Output *res;
+       Fl_MathGL *gr;
+public:
+       InplotDlg() : GeneralDlg()
+       {
+               Fl_Button *o;
+               w = new Fl_Double_Window(715, 315, _("Add inplot"));
+               k1 = new Fl_Round_Button(5, 5, 105, 25, "SubPlot");
+               k1->callback(cb_only_inplot,k1);        k1->type(FL_RADIO_BUTTON);
+               n1 = new Fl_Spinner(145, 5, 55, 25, "nx");
+               n1->callback(cp_inplot_upd);    n1->range(1,100);
+               m1 = new Fl_Spinner(230, 5, 55, 25, "ny");
+               m1->callback(cp_inplot_upd);    m1->range(1,100);
+               i1 = new Fl_Spinner(315, 5, 55, 25, _("ind"));
+               i1->callback(cp_inplot_upd);    i1->value(0);
+               x1 = new Fl_Counter(400, 5, 95, 25, "dx");              x1->align(FL_ALIGN_LEFT);
+               x1->callback(cp_inplot_upd);    x1->value(0);   x1->step(0.01); x1->lstep(0.1);
+               y1 = new Fl_Counter(525, 5, 95, 25, "dy");              y1->align(FL_ALIGN_LEFT);
+               y1->callback(cp_inplot_upd);    y1->value(0);   y1->step(0.01); y1->lstep(0.1);
+
+               k2 = new Fl_Round_Button(5, 35, 105, 25, "MultiPlot");
+               k2->callback(cb_only_inplot,k2);        k2->type(FL_RADIO_BUTTON);
+               n2 = new Fl_Spinner(145, 35, 55, 25, "nx");
+               n2->callback(cp_inplot_upd);    n2->range(1,100);
+               m2 = new Fl_Spinner(230, 35, 55, 25, "ny");
+               m2->callback(cp_inplot_upd);    m2->range(1,100);
+               i2 = new Fl_Spinner(315, 35, 55, 25, _("ind"));
+               i2->callback(cp_inplot_upd);    i2->value(0);
+               x2 = new Fl_Spinner(425, 35, 70, 25, "x-size");
+               x2->callback(cp_inplot_upd);    x2->value(1);
+               y2 = new Fl_Spinner(550, 35, 70, 25, "y-size");
+               y2->callback(cp_inplot_upd);    y2->value(1);
+
+               k3 = new Fl_Round_Button(5, 65, 105, 25, "GridPlot");
+               k3->callback(cb_only_inplot,k3);        k3->type(FL_RADIO_BUTTON);
+               n3 = new Fl_Spinner(145, 65, 55, 25, "nx");
+               n3->callback(cp_inplot_upd);    n3->range(1,100);
+               m3 = new Fl_Spinner(230, 65, 55, 25, "ny");
+               m3->callback(cp_inplot_upd);    m3->range(1,100);
+               i3 = new Fl_Spinner(315, 65, 55, 25, _("ind"));
+               i3->callback(cp_inplot_upd);    i3->value(0);
+               d3 = new Fl_Counter(400, 65, 95, 25, "d");      d3->align(FL_ALIGN_LEFT);
+               d3->callback(cp_inplot_upd);    d3->step(0.01); d3->lstep(0.1);
+
+               k4 = new Fl_Round_Button(5, 95, 105, 25, "ColumnPlot");
+               k4->callback(cb_only_inplot,k4);        k4->type(FL_RADIO_BUTTON);
+               n4 = new Fl_Spinner(145, 95, 55, 25, "nx");
+               n4->callback(cp_inplot_upd);    n4->range(1,100);
+               i4 = new Fl_Spinner(315, 95, 55, 25, _("ind"));
+               i4->callback(cp_inplot_upd);    i4->value(0);
+               d4 = new Fl_Counter(400, 95, 95, 25, "d");      d4->align(FL_ALIGN_LEFT);
+               d4->callback(cp_inplot_upd);    d4->step(0.01); d4->lstep(0.1);
+
+               k5 = new Fl_Round_Button(5, 125, 105, 25, "StickPlot");
+               k5->callback(cb_only_inplot,k5);        k5->type(FL_RADIO_BUTTON);
+               n5 = new Fl_Spinner(145, 125, 55, 25, "nx");
+               n5->callback(cp_inplot_upd);    n5->range(1,100);
+               i5 = new Fl_Spinner(315, 125, 55, 25, _("ind"));
+               i5->callback(cp_inplot_upd);    i5->value(0);
+
+               k6 = new Fl_Round_Button(5, 155, 105, 25, "InPlot");
+               k6->callback(cb_only_inplot,k6);        k6->type(FL_RADIO_BUTTON);
+               xx1 = new Fl_Float_Input(145, 155, 60, 25, "x:");
+               xx1->callback(cp_inplot_upd);   xx1->value("0");
+               xx2 = new Fl_Float_Input(225, 155, 60, 25, "...");
+               xx2->callback(cp_inplot_upd);   xx2->value("1");
+               yy1 = new Fl_Float_Input(315, 155, 60, 25, "y:");
+               yy1->callback(cp_inplot_upd);   yy1->value("0");
+               yy2 = new Fl_Float_Input(400, 155, 60, 25, "...");
+               yy2->callback(cp_inplot_upd);   yy2->value("1");
+
+               tet = new Fl_Spinner(75, 190, 60, 25, _("Rotate on"));
+               tet->callback(cp_inplot_upd);   tet->value(0);  tet->step(5);   tet->range( -90, 90);
+               phi = new Fl_Spinner(170, 190, 60, 25, _("and"));
+               phi->callback(cp_inplot_upd);   phi->value(0);  phi->step(5);   phi->range(-180,180);
+               ax = new Fl_Float_Input(315, 190, 60, 25, _("Aspect x/z"));
+               ax->callback(cp_inplot_upd);    ax->value("1");
+               ay = new Fl_Float_Input(400, 190, 60, 25, "y/z");
+               ay->callback(cp_inplot_upd);    ay->value("1");
+
+               new Fl_Box(0, 225, 90, 25, _("Reserve at:"));
+               rl = new Fl_Check_Button(90, 225, 70, 25, _("left"));
+               rl->callback(cp_inplot_upd);    rl->value(1);
+               rb = new Fl_Check_Button(160, 225, 70, 25, _("bottom"));
+               rb->callback(cp_inplot_upd);    rb->value(1);
+               rt = new Fl_Check_Button(230, 225, 70, 25, _("top"));
+               rt->callback(cp_inplot_upd);    rt->value(1);
+               rr = new Fl_Check_Button(300, 225, 70, 25, _("right"));
+               rr->callback(cp_inplot_upd);    rr->value(1);
+               rw = new Fl_Check_Button(370, 225, 90, 25, _("whole area"));    rw->callback(cp_inplot_upd);
+               text = new Fl_Input(80, 255, 320, 25, _("Title"));      text->callback(cp_inplot_upd);
+               o = new Fl_Button(400, 255, 60, 25, _("Style"));        o->callback(style_dlg_cb,0);
+               res = new Fl_Output(50, 285, 410, 25, _("Result"));
+               gr = new Fl_MathGL(470, 130, 240, 180); gr->box(FL_ENGRAVED_BOX);       gr->use_pthr = false;
+               mgl_set_size(gr->get_graph(),240,180);  gr->align(FL_ALIGN_LEFT);
+               o = new Fl_Button(545, 95, 75, 25, _("Cancel"));        o->callback(cb_dlg_cancel,this);
+               o = new Fl_Return_Button(630, 95, 75, 25, _("OK"));     o->callback(cb_dlg_ok,this);
+               o = new Fl_Button(630, 60, 75, 25, _("Refresh"));       o->callback(cp_inplot_upd);
+               w->set_modal(); w->end();
+       }
+       void init()     {       style_dlg.result.clear();       }
+       void update()
+       {
+               std::string how, title, script;
+               if(rw->value()) // prepare space reservation
+                       how="#";
+               else
+               {
+                       if(rl->value()) how+='<';
+                       if(rb->value()) how+='_';
+                       if(rt->value()) how+='^';
+                       if(rr->value()) how+='>';
+               }
+               char buf[128];  result.clear();
+               const char *s=text->value();
+               if(s && *s)     // prepare title
+               {
+                       std::string fmt = style_dlg.result;
+                       snprintf(buf,127,"title '%s'",s);       title = buf;
+                       if(fmt.empty()) title += ':';
+                       else    title += ' '+fmt+':';
+               }
+               if(k1->value()) // subplot
+               {
+                       long n=mgl_int(n1->value()), m=mgl_int(m1->value()), k=mgl_int(i1->value());
+                       i1->range(0, m*n-1);    // set to be sure if n or m are changed
+                       snprintf(buf,127,"subplot %ld %ld %ld '%s' %g %g:", n,m,k, how.c_str(), x1->value(), y1->value());
+                       result = buf+title;
+                       double t=tet->value(), p=phi->value();
+                       if(t!=0 || p!=0)
+                       {       snprintf(buf,127,"rotate %g %g:", t,p); result += buf;  }
+                       for(long i=0;i<m*n;i++) if(i!=k)
+                       {       snprintf(buf,127,"subplot %ld %ld %ld:box 'c'\n", n,m,i);       script += buf;  }
+               }
+               else if(k2->value())    // multiplot
+               {
+                       long n=mgl_int(n2->value()), m=mgl_int(m2->value()), k=mgl_int(i2->value());
+                       long x=mgl_int(x2->value()), y=mgl_int(y2->value());
+                       i2->range(0, m*n-1);    x2->range(0, n-1);      y2->range(0, m-1);      // set to be sure if n or m are changed
+                       snprintf(buf,127,"multiplot %ld %ld %ld %ld %ld '%s':", n,m,k,x,y, how.c_str());
+                       result = buf+title;
+                       double t=tet->value(), p=phi->value();
+                       if(t!=0 || p!=0)
+                       {       snprintf(buf,127,"rotate %g %g:", t,p); result += buf;  }
+                       for(long i=0;i<m*n;i++) if(i!=k)
+                       {       snprintf(buf,127,"subplot %ld %ld %ld:box 'c'\n", n,m,i);       script += buf;  }
+               }
+               else if(k3->value())    // gridplot
+               {
+                       long n=mgl_int(n3->value()), m=mgl_int(m3->value()), k=mgl_int(i3->value());
+                       double d=d3->value();
+                       i3->range(0, m*n-1);    // set to be sure if n or m are changed
+                       snprintf(buf,127,"gridplot %ld %ld %ld %g:", n,m,k,d);
+                       result = buf;
+                       for(long i=0;i<m*n;i++) if(i!=k)
+                       {       snprintf(buf,127,"gridplot %ld %ld %ld %g:box 'c'\n", n,m,k,d); script += buf;  }
+               }
+               else if(k4->value())    // columnplot
+               {
+                       long n=mgl_int(n4->value()), k=mgl_int(i4->value());
+                       double d=d4->value();
+                       i4->range(0, n-1);      // set to be sure if n or m are changed
+                       snprintf(buf,127,"columnplot %ld %ld %g:", n,k,d);      result = buf;
+                       double t=tet->value(), p=phi->value();
+                       std::string rot="";
+                       if(t!=0 || p!=0)
+                       {       snprintf(buf,127,"rotate %g %g:", t,p); result += buf;  rot = buf;      }
+                       for(long i=0;i<n;i++)   if(i!=k)
+                       {       snprintf(buf,127,"columnplot %ld %ld %g:%sbox 'c'\n", n,k,d,rot.c_str());       script += buf;  }
+               }
+               else if(k5->value())    // stickplot
+               {
+                       long n=mgl_int(n5->value()), k=mgl_int(i5->value());
+                       i5->range(0, n-1);      // set to be sure if n or m are changed
+                       double t=tet->value(), p=phi->value();
+                       snprintf(buf,127,"stickplot %ld %ld %g %g:", n,k,t,p);  result = buf;
+                       for(long i=0;i<n;i++)   if(i!=k)
+                       {       snprintf(buf,127,"stickplot %ld %ld %g %g:box 'c'\n", n,k,t,p); script += buf;  }
+               }
+               else if(k6->value())    // inplot
+               {
+                       std::string sx1=xx1->value(), sx2=xx2->value(), sy1=yy1->value(), sy2=yy2->value();
+                       if(!sx1.empty() && !sy1.empty() && !sx2.empty() && !sy2.empty())
+                       {
+                               snprintf(buf,127,"inplot %s %s %s %s:", sx1.c_str(), sx2.c_str(), sy1.c_str(), sy2.c_str());
+                               result = buf;
+                               double t=tet->value(), p=phi->value();
+                               if(t!=0 || p!=0)        {       snprintf(buf,127,"rotate %g %g:", t,p); result += buf;  }
+                       }
+                       script = "subplot 1 1 0:box 'c'\n";
+               }
+               double aspx = atof(ax->value()), aspy = atof(ay->value());
+               snprintf(buf,127,"aspect %g %g 1",aspx,aspy);
+               if(aspx!=0 && aspy!=0 && (aspx!=1 || aspy!=1))  result += buf;
+               script = "clf\n"+script+result+"\nbox\n";
+               res->value(result.c_str());
+
+               mglParse pr;
+               mgl_parse_text(gr->get_graph(), pr.Self(), script.c_str());
+               gr->update();
+       }
+       void cb_ok()
+       {
+               update();
+               if(e)
+               {
+                       int p = textbuf->line_start(e->editor->insert_position());
+                       textbuf->insert(p, (result+'\n').c_str());
+               }
+               hide();
+       }
+} inplot_dlg;
+//-----------------------------------------------------------------------------
+void cp_inplot_upd(Fl_Widget*,void*)   {       inplot_dlg.update();    }
+void cb_only_inplot(Fl_Widget*,void *v)
+{      ((Fl_Round_Button*)v)->setonly();       inplot_dlg.update();    }
+//-----------------------------------------------------------------------------
+void inplot_dlg_cb(Fl_Widget*,void *v)
+{      inplot_dlg.e = (ScriptWindow*)v;        inplot_dlg.show();      }
+//-----------------------------------------------------------------------------
+class PrimDlg : public GeneralDlg
+{
+       Fl_Choice *kind, *col, *arr1, *arr2, *dash, *mark;
+       Fl_Check_Button *fill;
+       Fl_Input *text;
+       Fl_Spinner *num;
+public:
+       PrimDlg() : GeneralDlg()
+       {
+               Fl_Button *o;
+               w = new Fl_Double_Window(295, 200, _("Add primitive"));
+               Fl_Menu_Item k[]={{_("marker")}, {_("line")}, { _("rectangle")},
+                       {_("curve")}, {_("rhomb")}, { _("ellipse")},
+                       {_("arc")}, {_("polygon")}, { _("text")}, {0}};
+               kind = new Fl_Choice(65, 10, 75, 25, _("Kind"));
+               kind->copy(k);          kind->value(0);
+               col = new Fl_Choice(205, 10, 75, 25, _("Color"));
+               col->copy(colors);      col->value(4);
+               arr1 = new Fl_Choice(65, 40, 75, 25, _("Begin"));
+               arr1->copy(arrows);     arr1->value(0);
+               arr2 = new Fl_Choice(205, 40, 75, 25, _("End"));
+               arr2->copy(arrows);     arr2->value(0);
+               dash = new Fl_Choice(65, 70, 75, 25, _("Dash"));
+               dash->copy(dashing);    dash->value(0);
+               mark = new Fl_Choice(205, 70, 75, 25, _("Mark"));
+               mark->copy(markers);    mark->value(0); mark->value(2);
+               num = new Fl_Spinner(65, 100, 75, 25, _("Edges"));
+               num->range(1,100);      num->value(5);
+               fill = new Fl_Check_Button(205, 100, 75, 25, _("wire"));        fill->value(1);
+               text = new Fl_Input(65, 130, 215, 25, _("Text"));
+               o = new Fl_Button(120, 165, 75, 25, _("Cancel"));       o->callback(cb_dlg_cancel,this);
+               o = new Fl_Return_Button(205, 165, 75, 25, _("OK"));    o->callback(cb_dlg_ok,this);
+               w->set_modal(); w->end();
+       }
+       void cb_ok()
+       {
+               result.clear();
+               int k = kind->value();
+               char c = cols[col->value()];    if(c==' ')      c='w';
+               char dsh = dash->text()[1];
+               char a1 = arr1->text()[1], a2 = arr2->text()[1];
+               const char *s = mark->text();
+               char mrk = (s && *s=='\'')? s[1]:0;
+               switch(k)
+               {
+               case 0:
+                       if(!mrk)        {       fl_alert(_("You need to select marker!"));      return; }
+                       result = "ball 0 0 '";
+                       if(!fill->value())      result += '&';
+                       result = result+mrk+c+"'\n";    break;
+               case 1:
+                       result = "line -0.2 0 0.2 0 '2";
+                       if(dsh!=' ' && dsh!='-')        result += dsh;
+                       if(a1!='_')     result = result+a2+a1;
+                       else if(a2!='_')        result += a2;
+                       result = result+c+"'\n";        break;
+               case 2:
+                       result = "rect -0.2 -0.2 0.2 0.2 '2";
+                       if(!fill->value())      result += '#';
+                       result = result+c+"'\n";        break;
+               case 3:
+                       result = "curve -0.2 0 0 0.5 0.2 0 0 0.5 '2";
+                       if(dsh!=' ' && dsh!='-')        result += dsh;
+                       if(a1!='_')     result = result+a2+a1;
+                       else if(a2!='_')        result += a2;
+                       result = result+c+"'\n";        break;
+               case 4:
+                       result = "rhomb -0.2 0 0.2 0 0.1 '2";
+                       if(!fill->value())      result += '#';
+                       result = result+c+"'\n";        break;
+               case 5:
+                       result = "ellipse -0.2 0 0.2 0 0.1 '2";
+                       if(!fill->value())      result += '#';
+                       result = result+c+"'\n";        break;
+               case 6:
+                       result = "arc 0 0 0.2 0 60 '2";
+                       if(dsh!=' ' && dsh!='-')        result += dsh;
+                       if(a1!='_')     result = result+a2+a1;
+                       else if(a2!='_')        result += a2;
+                       result = result+c+"'\n";        break;
+               case 7:
+                       result = "polygon 0 0 0 0.2 "+mgl_str_num(num->value())+" '2";
+                       if(!fill->value())      result += '#';
+                       result = result+c+"'\n";        break;
+               case 8:
+                       s = text->value();
+                       if(!s || *s==0) {       fl_alert(_("You need to enter text!")); return; }
+                       result = result+"text 0 0 0.1 0 '"+s+"' '"+c;
+                       if(fill->value())       result += ":w";
+                       result = result+"'\n";  break;
+               }
+               if(e)   {       e->graph->FMGL->prim += result; e->graph->update();     }
+               hide();
+       }
+} prim_dlg;
+//-----------------------------------------------------------------------------
+void prim_dlg_cb(Fl_Widget*, void* v)
+{      prim_dlg.e=(ScriptWindow*)v;    prim_dlg.show();        }
+//-----------------------------------------------------------------------------
diff --git a/mgllab/editor.cpp b/mgllab/editor.cpp
new file mode 100644 (file)
index 0000000..6d1689c
--- /dev/null
@@ -0,0 +1,691 @@
+/* editor.cpp is part of UDAV\r
+ * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>\r
+ *\r
+ * This program is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Library General Public License\r
+ * as published by the Free Software Foundation\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
+ */\r
+#include <ctype.h>\r
+#include <errno.h>\r
+#ifdef __MWERKS__\r
+# define FL_DLL\r
+#endif\r
+#ifdef WIN32\r
+#include <direct.h>\r
+#else\r
+#include <unistd.h>\r
+#endif\r
+#include "mgllab.h"\r
+//-----------------------------------------------------------------------------\r
+int changed = 0;\r
+std::string filename;\r
+Fl_Text_Buffer *textbuf = 0;\r
+//-----------------------------------------------------------------------------\r
+// Syntax highlighting\r
+Fl_Text_Buffer  *stylebuf = 0;\r
+Fl_Text_Display::Style_Table_Entry styletable[10] = {  // Style table\r
+               { FL_BLACK,             FL_COURIER,             14, 0 },                // A - Plain\r
+               { FL_DARK_GREEN,FL_COURIER_ITALIC,      14, 0 },        // B - Line comments\r
+               { FL_BLUE,              FL_COURIER,             14, 0 },                // C - Number\r
+               { FL_RED,               FL_COURIER,             14, 0 },                // D - Strings\r
+               { FL_DARK_BLUE, FL_COURIER,             14, 0 },                // E - Usual command\r
+               { FL_DARK_CYAN, FL_COURIER,             14, 0 },                // F - Flow command\r
+               { FL_DARK_MAGENTA,      FL_COURIER,     14, 0 },                // G - New-data command\r
+               { FL_DARK_RED,  FL_COURIER,             14, 0 },                // H - Option\r
+               { FL_DARK_GREEN,FL_COURIER,             14, 0 },                // I - Inactive command\r
+               { FL_MAGENTA,   FL_COURIER,             14, 0 }                 // J - Error line ???\r
+       };\r
+int font_kind; ///< Editor font kind\r
+int font_size; ///< Editor font size\r
+//-----------------------------------------------------------------------------\r
+void set_style(int kind, int size)\r
+{\r
+       if(kind<0 || kind>2)    kind = 1;\r
+       if(size<1)      size = 14;\r
+       for(int i=0;i<10;i++)   // set font for styles\r
+       {       styletable[i].size = size;      styletable[i].font = 4*kind;    }\r
+       styletable[1].font = 4*kind+2;\r
+       font_kind = kind;       font_size = size;\r
+}\r
+//-----------------------------------------------------------------------------\r
+bool is_sfx(const char *s)     // suffix\r
+{\r
+       size_t i,n=strlen(s);\r
+       for(i=0;i<n && s[i]>='a';i++);\r
+       if(i==1 && s[0]=='a')   return true;\r
+       if(i==2 && strchr("nmawsk",s[0]) && strchr("axyz",s[1]))        return true;\r
+       if(i==3 && (!strncmp("fst",s,3) || !strncmp("lst",s,3) || !strncmp("max",s,3) ||\r
+                               !strncmp("min",s,3) || !strncmp("sum",s,3)))\r
+               return true;\r
+       if(i==3 && s[0]=='m' && strchr("xyz",s[1]) && strchr("fl",s[2]))        return true;\r
+       return false;\r
+//     char *t = new char[i+1];        memcpy(t,s,i*sizeof(char));     t[i]=0;\r
+}\r
+//-----------------------------------------------------------------------------\r
+bool is_opt(const char *s)     // option\r
+{\r
+       const char *o[13]={"xrange","yrange","zrange","crange","alpha",\r
+                                       "cut","value","meshnum","size","legend",\r
+                                       "ambient","diffuse","light"};\r
+       int l[13] = {6,6,6,6,5, 3,5,7,4,6, 7,7,5};\r
+       for(size_t i=0;i<13;i++)        if(!strncmp(o[i],s,l[i]) && s[l[i]]<=' ')       return true;\r
+       return false;\r
+}\r
+//-----------------------------------------------------------------------------\r
+bool is_num(const char *s)     // number\r
+{\r
+       size_t n=strlen(s);\r
+//     if(s[0]==':' && (s[1]<=' ' || s[1]==';'))       return true;\r
+       if(s[0]<=' ' || s[0]==';' || s[0]==':') return false;\r
+       if(n>=2 && (s[2]<=' ' || s[2]==';' || s[2]==':'))\r
+       {\r
+               if(!strncmp("pi",s,2))  return true;\r
+               if(!strncmp("on",s,2))  return true;\r
+       }\r
+       if(n>=3 && (s[3]<=' ' || s[3]==';' || s[3]==':'))\r
+       {\r
+               if(!strncmp("off",s,3)) return true;\r
+               if(!strncmp("nan",s,3)) return true;\r
+               if(!strncmp("inf",s,3)) return true;\r
+               if(!strncmp("all",s,3)) return true;\r
+       }\r
+       for(size_t i=0;i<n;i++)\r
+       {\r
+               if(s[i]<=' ' || s[i]==';' || s[i]==':') break;\r
+               if(!strchr("+-.eE0123456789",s[i]))     return false;\r
+       }\r
+       return true;\r
+//     char *t = new char[i+1];        memcpy(t,s,i*sizeof(char));     t[i]=0;\r
+}\r
+//-----------------------------------------------------------------------------\r
+char is_cmd(const char *s)     // command\r
+{\r
+       register long i,n=strlen(s)+1;\r
+       char res=0, *w=new char[n];     strcpy(w,s);\r
+       for(i=0;i<n;i++)        if(!isalnum(s[i]))      w[i]=0;\r
+       int rts = Parse->CmdType(w);\r
+       if(rts==5)              res = 'G';\r
+       else if(rts==7) res = 'F';\r
+       else if(rts)    res = 'E';\r
+       delete []w;             return res;\r
+}\r
+//-----------------------------------------------------------------------------\r
+// Parse text and produce style data.\r
+void style_parse(const char *text, char *style, int /*length*/)\r
+{\r
+       size_t n=strlen(text);\r
+       bool nl=true;\r
+       // Style letters:\r
+       // A - Plain\r
+       // B - Line comments\r
+       // C - Number\r
+       // D - Strings\r
+       // E - Usual command\r
+       // F - Flow command\r
+       // G - New data command\r
+       // H - Option\r
+\r
+       for(size_t i=0;i<n;i++)\r
+       {\r
+               char ch = text[i], r;   style[i] = 'A';\r
+               if(ch=='#')     // comment\r
+                       for(;i<n && text[i]!='\n';i++)  style[i]='B';\r
+               else if(ch=='\'')       // string\r
+               {\r
+                       style[i]='D';   i++;\r
+                       for(;i<n && text[i]!='\n' && text[i]!='\'';i++) style[i]='D';\r
+                       style[i]='D';\r
+               }\r
+               else if(ch=='\n' || ch==':')    {       nl=true;        continue;       }\r
+               else if(nl && (r=is_cmd(text+i)) )      // command name\r
+               {       for(;i<n && isalnum(text[i]);i++)       style[i]=r;     i--;    }\r
+               else if(!nl && is_opt(text+i))  // option\r
+               {       for(;i<n && isalpha(text[i]);i++)       style[i]='H';   i--;    }\r
+               else if(!nl && is_num(text+i))  // number\r
+               {\r
+                       for(;i<n && strchr("+-.eE0123456789pionaf",text[i]);i++)        style[i]='C';\r
+                       i--;\r
+               }\r
+               else if(ch=='.' && is_sfx(text+i+1))    // option (suffix)\r
+               {\r
+                       style[i]='H';   i++;\r
+                       for(;i<n && isalpha(text[i]);i++)       style[i]='H';\r
+               }\r
+               else if(ch=='.' || (ch>='0' && ch<='9'))\r
+               {       style[i]='C';   if(text[i+1]=='e' || text[i+1]=='E')    style[i+1]='C'; }\r
+               nl = false;\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
+// Initialize the style buffer\r
+void style_init()\r
+{\r
+       long len = textbuf->length();\r
+       char *style = new char[len + 1];\r
+       char *text = textbuf->text();\r
+       memset(style, 'A', len);        style[len] = '\0';\r
+       if(!stylebuf)   stylebuf = new Fl_Text_Buffer(len);\r
+       style_parse(text, style, len);\r
+       stylebuf->text(style);\r
+       delete []style; free(text);\r
+}\r
+//-----------------------------------------------------------------------------\r
+// Update unfinished styles.\r
+void style_unfinished_cb(int, void*) {}\r
+//-----------------------------------------------------------------------------\r
+// Update the style buffer...\r
+void style_update(int pos, int nInserted, int nDeleted, int    /*nRestyled*/, const char */*deletedText*/, void *cbArg)\r
+{\r
+       long start, end;        // Start and end of text\r
+       char last,              // Last style on line\r
+               *style,         // Style data\r
+               *text;          // Text data\r
+\r
+       // If this is just a selection change, just unselect the style buffer...\r
+       if (nInserted == 0 && nDeleted == 0) {  stylebuf->unselect();   return;  }\r
+       // Track changes in the text buffer...\r
+       if (nInserted > 0)\r
+       {\r
+               // Insert characters into the style buffer...\r
+               style = new char[nInserted + 1];\r
+               memset(style, 'A', nInserted);\r
+               style[nInserted] = '\0';\r
+\r
+               stylebuf->replace(pos, pos + nDeleted, style);\r
+               delete[] style;\r
+       }\r
+       else    // Just delete characters in the style buffer...\r
+               stylebuf->remove(pos, pos + nDeleted);\r
+       // Select the area that was just updated to avoid unnecessary callbacks...\r
+       stylebuf->select(pos, pos + nInserted - nDeleted);\r
+       // Re-parse the changed region; we do this by parsing from the\r
+       // beginning of the previous line of the changed region to the end of\r
+       // the line of the changed region...  Then we check the last\r
+       // style character and keep updating if we have a multi-line\r
+       // comment character...\r
+       start = textbuf->line_start(pos);\r
+       end   = textbuf->line_end(pos + nInserted);\r
+       text  = textbuf->text_range(start, end);\r
+       style = stylebuf->text_range(start, end);\r
+       if (start==end) last = 0;\r
+       else    last = style[end-start-1];\r
+       style_parse(text, style, end - start);\r
+       stylebuf->replace(start, end, style);\r
+       ((Fl_Text_Editor *)cbArg)->redisplay_range(start, end);\r
+\r
+       if (start==end || last != style[end-start-1])\r
+       {\r
+               // Either the user deleted some text, or the last character on\r
+               // the line changed styles, so reparse the remainder of the buffer...\r
+               free(text);     free(style);\r
+               end   = textbuf->length();\r
+               text  = textbuf->text_range(start, end);\r
+               style = stylebuf->text_range(start, end);\r
+               style_parse(text, style, end - start);\r
+               stylebuf->replace(start, end, style);\r
+               ((Fl_Text_Editor *)cbArg)->redisplay_range(start, end);\r
+       }\r
+       free(text);     free(style);\r
+}\r
+//-----------------------------------------------------------------------------\r
+ScriptWindow::ScriptWindow(int w, int h, const char* t) : Fl_Double_Window(w, h, t)\r
+{      editor = 0;     }\r
+//-----------------------------------------------------------------------------\r
+void set_path(char *buf)\r
+{\r
+#ifdef WIN32\r
+       char sep='\\';\r
+#else\r
+       char sep='/';\r
+#endif\r
+       for(long i=strlen(buf)-1;i>=0;i--)      if(buf[i]==sep)\r
+       {       buf[i]=0;       break;  }\r
+       if(!chdir(buf)) printf("chdir to '%s'\n",buf);\r
+}\r
+//-----------------------------------------------------------------------------\r
+void add_filename(const char *fname, ScriptWindow *e)\r
+{\r
+       static char buf[FL_PATH_MAX];\r
+       fl_filename_absolute(buf, FL_PATH_MAX, fname);  fname=buf;\r
+       if(!fname || !fname[0] || lastfiles[0]==fname)\r
+       {       set_path(buf);  return; }\r
+       pref.set("last_file",fname);\r
+       int ii=4;\r
+       for(int i=1;i<5;i++)\r
+               if(lastfiles[i]==fname) {       ii=i;   break;  }\r
+       for(int i=ii;i>0;i--)   lastfiles[i]=lastfiles[i-1];\r
+       lastfiles[0]=fname;\r
+       int ir = e->menu->find_index(_("File/Recent files"));\r
+       if(ir<0)        ir = 6;\r
+       e->menu->replace(ir+1, lastfiles[0].c_str());\r
+       e->menu->replace(ir+2, lastfiles[1].c_str());\r
+       e->menu->replace(ir+3, lastfiles[2].c_str());\r
+       e->menu->replace(ir+4, lastfiles[3].c_str());\r
+       e->menu->replace(ir+5, lastfiles[4].c_str());\r
+       set_path(buf);  save_pref();\r
+}\r
+//-----------------------------------------------------------------------------\r
+int check_save(void)\r
+{\r
+  if (!changed) return 1;\r
+  int r = fl_choice(_("The current file has not been saved.\n"\r
+                                       "Would you like to save it now?"),\r
+                                       _("Cancel"), _("Save"), _("Don't Save"));\r
+  if(r==1)     {       save_cb(0,0);   return !changed;        } // Save the file...\r
+  return (r==2) ? 1 : 0;\r
+}\r
+//-----------------------------------------------------------------------------\r
+void data_file(const char *fn)\r
+{\r
+       static int num=0;\r
+       static char name[32], res[256];\r
+       snprintf(name,32,"mgl_%d",num); num++;\r
+       mglDataA *v = Parse->AddVar(name);\r
+       mglData *d = dynamic_cast<mglData*>(v);\r
+       mglDataC *c = dynamic_cast<mglDataC*>(v);\r
+       if(d)\r
+       {\r
+               d->Read(fn);\r
+               if(d->nz>1)\r
+                       snprintf(res,256,"#read %s '%s'\nrotate 40 60\ncrange %s\nbox\nsurf3 %s\n", name, fn, name, name);\r
+               else if(d->ny>1)\r
+                       snprintf(res,256,"#read %s '%s'\nrotate 40 60\ncrange %s\nzrange %s\nbox\nsurf %s\n", name, fn, name, name, name);\r
+               else\r
+                       snprintf(res,256,"#read %s '%s'\nyrange %s\nbox\nplot %s\n", name, fn, name, name);\r
+               textbuf->text(res);\r
+       }\r
+       else if(c)\r
+       {\r
+               c->Read(fn);\r
+               if(c->nz>1)\r
+                       snprintf(res,256,"#read %s '%s'\nrotate 40 60\ncrange %s\nbox\nsurf3 %s\n", name, fn, name, name);\r
+               else if(c->ny>1)\r
+                       snprintf(res,256,"#read %s '%s'\nrotate 40 60\ncrange %s\nzrange %s\nbox\nsurf %s\n", name, fn, name, name, name);\r
+               else\r
+                       snprintf(res,256,"#read %s '%s'\nyrange %s\nbox\nplot %s\n", name, fn, name, name);\r
+               textbuf->text(res);\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
+int loading = 0;\r
+void load_file(const char *newfile, int ipos, ScriptWindow *e)\r
+{\r
+       long len = strlen(newfile);\r
+       if(ipos==-1 && (!strcmp(newfile+len-4,".dat") || !strcmp(newfile+len-4,".csv")))\r
+       {\r
+               data_file(newfile);\r
+               filename = newfile;     filename += ".mgl";\r
+               add_filename(filename.c_str(),e);\r
+       }\r
+       else\r
+       {\r
+               loading = 1;\r
+               int insert = (ipos != -1);\r
+               changed = insert;\r
+               if(!insert) filename="";\r
+               long r;\r
+               if(!insert)     r = textbuf->loadfile(newfile);\r
+               else r = textbuf->insertfile(newfile, ipos);\r
+\r
+               char *t = textbuf->text();\r
+#ifndef WIN32\r
+               register size_t i,l=strlen(t);\r
+               for(i=0;i<l;i++)        if(t[i]=='\r')  t[i]=' ';\r
+               textbuf->text(t);\r
+#endif\r
+               fill_animate(t, e->draw);       free(t);\r
+\r
+               if (r)\r
+                       fl_alert(_("Error reading from file \'%s\':\n%s."), newfile, strerror(errno));\r
+               else    if(!insert)\r
+               {       filename = newfile;     add_filename(filename.c_str(),e);       }\r
+               loading = 0;\r
+               textbuf->call_modify_callbacks();\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
+void save_file(const char *newfile, ScriptWindow *e)\r
+{\r
+       if (textbuf->savefile(newfile))\r
+               fl_alert(_("Error writing to file \'%s\':\n%s."), newfile, strerror(errno));\r
+       else\r
+       {       filename = newfile;     add_filename(filename.c_str(),e);       }\r
+       changed = 0;\r
+       textbuf->call_modify_callbacks();\r
+}\r
+//-----------------------------------------------------------------------------\r
+void undo_cb(Fl_Widget*, void* v)\r
+{\r
+       ScriptWindow* e = (ScriptWindow*)v;\r
+       Fl_Text_Editor::kf_undo(0, e->editor);\r
+}\r
+//-----------------------------------------------------------------------------\r
+void select_all_cb(Fl_Widget *, void *v)\r
+{\r
+       ScriptWindow* e = (ScriptWindow*)v;\r
+       Fl_Text_Editor::kf_select_all(0, e->editor);\r
+}\r
+//-----------------------------------------------------------------------------\r
+void copy_cb(Fl_Widget*, void* v)\r
+{\r
+       ScriptWindow* e = (ScriptWindow*)v;\r
+       Fl_Text_Editor::kf_copy(0, e->editor);\r
+}\r
+//-----------------------------------------------------------------------------\r
+void cut_cb(Fl_Widget*, void* v)\r
+{\r
+       ScriptWindow* e = (ScriptWindow*)v;\r
+       Fl_Text_Editor::kf_cut(0, e->editor);\r
+}\r
+//-----------------------------------------------------------------------------\r
+void hide_cb(Fl_Widget*, void* v)\r
+{\r
+       ScriptWindow* e = (ScriptWindow*)v;\r
+       int p1,p2;\r
+       textbuf->selection_position(&p1, &p2);\r
+       if(!textbuf->selected())        p2=p1=e->editor->insert_position();\r
+       p1 = textbuf->line_start(p1);\r
+       while(p1<p2)\r
+       {\r
+               textbuf->insert(p1,"#h ");\r
+               int p = textbuf->line_start(textbuf->line_end(p1)+1);\r
+               if(p!=p1)       p1=p;   else    return;\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
+void unhide_cb(Fl_Widget*, void* v)\r
+{\r
+       ScriptWindow* e = (ScriptWindow*)v;\r
+       int p1,p2;\r
+       textbuf->selection_position(&p1, &p2);\r
+       if(!textbuf->selected())        p2=p1=e->editor->insert_position();\r
+       p1 = textbuf->line_start(p1);\r
+       while(p1<p2)\r
+       {\r
+               if(textbuf->char_at(p1)=='#')\r
+               {\r
+                       if(textbuf->char_at(p1+1)=='h' && textbuf->char_at(p1+2)==' ')\r
+                               textbuf->remove(p1,p1+3);\r
+                       else    textbuf->remove(p1,p1+1);\r
+               }\r
+               int p = textbuf->line_start(textbuf->line_end(p1)+1);\r
+               if(p!=p1)       p1=p;   else    return;\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
+void delete_cb(Fl_Widget*, void*) {    textbuf->remove_selection();    }\r
+//-----------------------------------------------------------------------------\r
+void cb_descr(Fl_Widget*,void *v)\r
+{\r
+       static size_t len=0;\r
+       ScriptWindow *w = (ScriptWindow*)v;\r
+       if(!textbuf || !Parse || !w)    return;\r
+       int cur = w->editor->insert_position(), br=0;\r
+       int beg = textbuf->line_start(cur);\r
+       const char *s = textbuf->text();\r
+       for(int i=beg;i<cur;i++)\r
+       {\r
+               if(strchr("({[",s[i]))  br++;\r
+               if(strchr(")}]",s[i]))  br--;\r
+               if(br==0 && s[i]==':' && i+1<cur)       beg=i+1;\r
+       }\r
+       for(br=beg;s[br]>' ' && s[br]!=':';br++);\r
+       std::string cmd(s+beg,br-beg);\r
+       const char *desc = Parse->CmdDesc(cmd.c_str());\r
+       const char *form = Parse->CmdFormat(cmd.c_str());\r
+       static std::string txt;\r
+       txt = desc?std::string(desc)+":  "+form : "";\r
+       w->set_status(txt.c_str());\r
+\r
+       size_t ll = strlen(s);\r
+       if(complete_word && br==cur+1 && br-beg>2 && len<ll)    // try complete word\r
+       {\r
+               long n = Parse->GetCmdNum();\r
+               std::vector<std::string> vars;\r
+               for(long i=0;i<n;i++)\r
+               {\r
+                       const char *c = Parse->GetCmdName(i);\r
+                       if(!strncmp(c,cmd.c_str(),cmd.length()))        vars.push_back(c);\r
+               }\r
+               for(size_t i=0;i<vars.size();i++)\r
+                       if(vars[i].length()>cmd.length())\r
+                       {\r
+                               std::string suggest = vars[i].substr(cmd.length());\r
+                               textbuf->insert(cur+1, suggest.c_str());\r
+                               textbuf->select(cur+1, cur+suggest.length()+1);\r
+                               break;\r
+                       }\r
+       }\r
+       len = ll;\r
+}\r
+//-----------------------------------------------------------------------------\r
+void ScriptWindow::set_status(const char *txt)\r
+{      if(txt && status)       {       status->label(txt);     redraw();       }       }\r
+//-----------------------------------------------------------------------------\r
+void changed_cb(int pos, int nInserted, int nDeleted, int nRestyled, const char *deletedText, void* v)\r
+{\r
+       if ((nInserted || nDeleted) && !loading) changed = 1;\r
+       ScriptWindow *w = (ScriptWindow *)v;\r
+       cb_descr(0,v);\r
+       set_title(w);\r
+       style_update(pos, nInserted, nDeleted, nRestyled, deletedText, w->editor);\r
+       if (loading) w->editor->show_insert_position();\r
+}\r
+//-----------------------------------------------------------------------------\r
+void insert_cb(Fl_Widget*, void *v)\r
+{\r
+       const char *newfile = mgl_file_chooser(_("Insert file content?"));\r
+       ScriptWindow *w = (ScriptWindow *)v;\r
+       if (newfile != NULL) load_file(newfile, w->editor->insert_position(),w);\r
+}\r
+//-----------------------------------------------------------------------------\r
+void paste_cb(Fl_Widget*, void* v)\r
+{\r
+       ScriptWindow* e = (ScriptWindow*)v;\r
+       Fl_Text_Editor::kf_paste(0, e->editor);\r
+}\r
+//-----------------------------------------------------------------------------\r
+#include "../widgets/image.h"\r
+#include "xpm/box.xpm"\r
+Fl_Widget *add_editor(ScriptWindow *w, int txtW, int wndH)\r
+{\r
+       Fl_Window *w1=new Fl_Window(0,30,txtW,wndH-55,0);\r
+       Fl_Group *g = new Fl_Group(0,0,txtW-10,30);\r
+       Fl_Button *o;\r
+\r
+       o = new Fl_Button(0, 1, 25, 25);        o->image(img_load);     o->callback(open_cb,w);\r
+       o->tooltip(_("Open script or data file"));\r
+       o = new Fl_Button(25, 1, 25, 25);       o->image(img_save);     o->callback(save_cb,w);\r
+       o->tooltip(_("Save script to file"));\r
+\r
+       o = new Fl_Button(55, 1, 25, 25);       o->image(img_copy);     o->callback(copy_cb,w);\r
+       o->tooltip(_("Copy selection to clipboard"));\r
+       o = new Fl_Button(80, 1, 25, 25);       o->image(img_paste);o->callback(paste_cb,w);\r
+       o->tooltip(_("Paste text from clipboard"));\r
+       o = new Fl_Button(105, 1, 25, 25);      o->image(img_find);     o->callback(find_dlg_cb,w);\r
+       o->tooltip(_("Find or replace text"));\r
+\r
+       o = new Fl_Button(135, 1, 25, 25);      o->image(img_insert);   o->callback(newcmd_dlg_cb,w);\r
+       o->tooltip(_("Insert MGL command"));\r
+       o = new Fl_Button(160, 1, 25, 25);      o->image(img_fname);    o->callback(ins_fname_cb,w);\r
+       o->tooltip(_("Insert filename"));\r
+       o = new Fl_Button(185, 1, 25, 25);      o->image(new Fl_Pixmap(box_xpm));       o->callback(inplot_dlg_cb,w);\r
+       o->tooltip(_("Insert inplot command"));\r
+\r
+       o = new Fl_Button(210, 1, 25, 25);      o->image(img_calc);     o->callback(calc_dlg_cb,w);\r
+       o->tooltip(_("Show calculator window"));\r
+       o = new Fl_Button(240, 1, 25, 25);      o->image(img_curve);o->callback(prim_dlg_cb,w);\r
+       o->tooltip(_("Show calculator window"));\r
+       g->end();       g->resizable(0);\r
+\r
+       w->editor = new Fl_Text_Editor(0, 28, txtW, wndH-85);\r
+       w->editor->textfont(FL_COURIER);\r
+       w->editor->buffer(textbuf);\r
+       w->editor->highlight_data(stylebuf, styletable, sizeof(styletable) / sizeof(styletable[0]), 'A', style_unfinished_cb, 0);\r
+#if MGL_HAVE_FL_COPY\r
+       w->editor->linenumber_width(30);\r
+#endif\r
+//     w->editor->when(FL_WHEN_RELEASE_ALWAYS);        w->editor->callback(cb_descr,w);\r
+\r
+       textbuf->add_modify_callback(changed_cb, w);\r
+       textbuf->call_modify_callbacks();\r
+\r
+       w1->end();      w1->resizable(w->editor);\r
+       return w1;\r
+}\r
+//-----------------------------------------------------------------------------\r
+void cp_find_next(Fl_Widget*,void*);\r
+void cp_repl_next(Fl_Widget*,void*);\r
+void cp_repl_all(Fl_Widget*,void*);\r
+class FindDlg : public GeneralDlg\r
+{\r
+       Fl_Input *find, *replace;\r
+       Fl_Check_Button *mcase, *sback;\r
+public:\r
+       FindDlg() : GeneralDlg()\r
+       {\r
+               Fl_Button* o;\r
+               w = new Fl_Double_Window(375, 130, _("Find/Replace"));\r
+               find = new Fl_Input(90, 10, 180, 25, _("Find what:"));\r
+               o = new Fl_Return_Button(275, 10, 95, 25, _("Find"));   o->callback(cp_find_next);\r
+               replace = new Fl_Input(90, 40, 180, 25, _("Replace by:"));\r
+               o = new Fl_Button(275, 40, 95, 25, _("Replace"));               o->callback(cp_repl_next);\r
+               mcase = new Fl_Check_Button(5, 70, 265, 25, _("Match case"));\r
+               sback = new Fl_Check_Button(5, 95, 265, 25, _("Search backward"));\r
+               o = new Fl_Button(275, 70, 95, 25, _("Replace all"));   o->callback(cp_repl_all);\r
+               o = new Fl_Button(275, 100, 95, 25, _("Close"));        o->callback(cb_dlg_cancel,this);\r
+               w->end();\r
+       }\r
+       const char *to_find()   {       return find->value();   }\r
+       void find_next()\r
+       {\r
+               const char *s = find->value();\r
+               int c = mcase->value(), b = sback->value();\r
+               if(s && *s)\r
+               {\r
+                       int pos = e->editor->insert_position();\r
+                       int found = b ? textbuf->search_backward(pos,s,&pos,c) : textbuf->search_forward(pos,s,&pos,c);\r
+                       if(found)\r
+                       {       // Found a match; select and update the position...\r
+                               size_t len = strlen(s);\r
+                               textbuf->select(pos, pos+len);\r
+                               e->editor->insert_position(pos+len);\r
+                               e->editor->show_insert_position();\r
+                       }\r
+                       else fl_alert(_("No occurrences of \'%s\' found!"), s);\r
+               }\r
+       }\r
+       void repl_next()\r
+       {\r
+               const char *s = find->value();\r
+               const char *r = replace->value();\r
+               int c = mcase->value(), b = sback->value();\r
+               if(s && *s)\r
+               {\r
+                       int pos = e->editor->insert_position();\r
+                       int found = b ? textbuf->search_backward(pos,s,&pos,c) : textbuf->search_forward(pos,s,&pos,c);\r
+                       if(found)\r
+                       {       // Found a match; select and update the position...\r
+                               size_t len = strlen(r);\r
+                               textbuf->select(pos, pos+strlen(s));\r
+                               textbuf->remove_selection();\r
+                               textbuf->insert(pos, r);\r
+                               textbuf->select(pos, pos+len);\r
+                               e->editor->insert_position(pos+len);\r
+                               e->editor->show_insert_position();\r
+                       }\r
+                       else fl_alert(_("No occurrences of \'%s\' found!"), s);\r
+               }\r
+       }\r
+       void repl_all()\r
+       {\r
+               const char *s = find->value();\r
+               const char *r = replace->value();\r
+               int c = mcase->value(), b = sback->value();\r
+               int found = (s && *s)?1:0;\r
+               long num=0;\r
+               while(found)\r
+               {\r
+                       int pos = e->editor->insert_position();\r
+                       int found = b ? textbuf->search_backward(pos,s,&pos,c) : textbuf->search_forward(pos,s,&pos,c);\r
+                       if(!found)      break;\r
+                       size_t len = strlen(r);\r
+                       textbuf->select(pos, pos+strlen(s));\r
+                       textbuf->remove_selection();\r
+                       textbuf->insert(pos, r);\r
+                       textbuf->select(pos, pos+len);\r
+                       e->editor->insert_position(pos+len);\r
+                       e->editor->show_insert_position();\r
+                       num++;\r
+               }\r
+               if(num) fl_message(_("Replaced %ld occurrences."), num);\r
+               else fl_alert(_("No occurrences of \'%s\' found!"), s);\r
+       }\r
+} find_dlg;\r
+//-----------------------------------------------------------------------------\r
+void cp_find_next(Fl_Widget*,void*)    {       find_dlg.find_next();   }\r
+void cp_repl_next(Fl_Widget*,void*)    {       find_dlg.repl_next();   }\r
+void cp_repl_all(Fl_Widget*,void*)     {       find_dlg.repl_all();    }\r
+//-----------------------------------------------------------------------------\r
+void find_dlg_cb(Fl_Widget*,void *v)\r
+{      find_dlg.e = (ScriptWindow*)v;  find_dlg.show();        }\r
+//-----------------------------------------------------------------------------\r
+void find_next_cb(Fl_Widget*,void *v)\r
+{\r
+       find_dlg.e = (ScriptWindow*)v;\r
+       const char *s = find_dlg.to_find();\r
+       if(s && *s)     find_dlg.find_next();\r
+       else    find_dlg.show();\r
+}\r
+//-----------------------------------------------------------------------------\r
+void ins_fname_cb(Fl_Widget *, void *v)\r
+{      // TODO: use previous file name?!?\r
+       ScriptWindow* e = (ScriptWindow*)v;\r
+       const char *s = mgl_file_chooser(_("Select file name"), "DAT files \t*.{dat,csv}\nHDF files \t*.{hdf,h5}\nImage files \t*.{png,jpg,jpeg}");\r
+       if(s)\r
+       {\r
+               std::string ss=s;       ss = '\''+ss+'\'';\r
+               if(e)   e->editor->insert(ss.c_str());\r
+               else    cb_args_set(ss.c_str());\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
+void ins_path_cb(Fl_Widget *, void *v)\r
+{\r
+       static std::string prev;\r
+       ScriptWindow* e = (ScriptWindow*)v;\r
+       const char *s = mgl_dir_chooser(_("Select folder name"), prev.c_str());\r
+       if(s)\r
+       {\r
+               std::string ss=prev=s;  ss = '\''+ss+'\'';\r
+               if(e)   e->editor->insert(ss.c_str());\r
+               else    cb_args_set(ss.c_str());\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
+void ins_fits_cb(Fl_Widget *, void *v)\r
+{\r
+       ScriptWindow* e = (ScriptWindow*)v;\r
+       HMGL gr = e->graph->get_graph();\r
+       std::string ss=mgl_get_fit(gr);\r
+       if(ss.empty())  fl_alert(_("There is no fitted formula."));\r
+       else    {       ss = '\''+ss+'\'';      e->editor->insert(ss.c_str());  }\r
+}\r
+//-----------------------------------------------------------------------------\r
+void ins_prim_cb(Fl_Widget *, void *v)\r
+{\r
+       ScriptWindow* e = (ScriptWindow*)v;\r
+       std::string ss = "subplot 1 1 0 '#'\n"+e->graph->FMGL->prim+"subplot 1 1 0\n###### end of primitives\n";\r
+       e->editor->insert(ss.c_str());\r
+       e->graph->FMGL->prim.clear();\r
+}\r
+//-----------------------------------------------------------------------------\r
diff --git a/mgllab/fltk_test.fl b/mgllab/fltk_test.fl
new file mode 100644 (file)
index 0000000..a78e3c9
--- /dev/null
@@ -0,0 +1,2662 @@
+# data file for the Fltk User Interface Designer (fluid)
+version 1.0303 
+i18n_type 1 
+i18n_include <libintl.h> 
+i18n_function gettext 
+header_name {.h} 
+code_name {.cxx}
+decl {\#include <mgllab.h>} {public local
+} 
+
+Function {make_window()} {
+  comment {Main mgllab window}
+} {
+  Fl_Window {} {
+    label mgllab open
+    xywh {6 393 780 375} type Double align 80 hide resizable
+    code0 {load_pref();}
+    code1 {create_common();}
+  } {
+    Fl_Tile {} {open
+      xywh {0 30 740 320} resizable
+    } {
+      Fl_Group {} {open
+        xywh {0 35 260 310}
+      } {
+        Fl_Text_Editor edit {
+          xywh {0 60 260 285} resizable
+        }
+        Fl_Pack {} {open
+          private xywh {0 35 260 25}
+          code0 {o->type(Fl_Pack::HORIZONTAL);}
+        } {
+          Fl_Button open {
+            image {png/document-open.png} xywh {0 35 25 25} box ENGRAVED_BOX
+          }
+          Fl_Button {} {
+            image {png/document-save.png} xywh {25 35 25 25} box ENGRAVED_BOX
+          }
+          Fl_Button {} {
+            image {png/accessories-calculator.png} xywh {50 35 25 25} box ENGRAVED_BOX
+          }
+          Fl_Button {} {
+            image {png/edit-undo.png} xywh {75 35 25 25} box ENGRAVED_BOX
+          }
+          Fl_Button {} {
+            image {png/edit-redo.png} xywh {100 35 25 25} box ENGRAVED_BOX
+          }
+          Fl_Button {} {
+            image {png/edit-copy.png} xywh {125 35 25 25} box ENGRAVED_BOX
+          }
+          Fl_Button {} {
+            image {png/edit-paste.png} xywh {150 35 25 25} box ENGRAVED_BOX
+          }
+          Fl_Button {} {
+            image {png/edit-find.png} xywh {175 35 25 25} box ENGRAVED_BOX
+          }
+          Fl_Button {} {
+            image {png/document-properties.png} xywh {200 35 25 25} box ENGRAVED_BOX
+          }
+        }
+      }
+      Fl_Group {} {open
+        xywh {260 35 480 315}
+      } {
+        Fl_Pack {} {open
+          private xywh {260 35 480 25}
+          code0 {o->type(Fl_Pack::HORIZONTAL);}
+        } {
+          Fl_Button {} {
+            image {png/alpha.png} xywh {260 35 25 25} box ENGRAVED_BOX
+          }
+          Fl_Button {} {
+            image {png/weather-clear.png} xywh {285 35 25 25} box ENGRAVED_BOX
+          }
+          Fl_Button {} {
+            image {png/view-grid.png} xywh {310 35 25 25} box ENGRAVED_BOX
+          }
+          Fl_Button {} {
+            image {png/transform-move.png} xywh {335 35 25 25} box ENGRAVED_BOX
+          }
+          Fl_Button {} {
+            image {png/zoom-original.png} xywh {360 35 25 25} box ENGRAVED_BOX
+          }
+          Fl_Button {} {
+            image {png/view-refresh.png} xywh {385 35 25 25} box ENGRAVED_BOX
+          }
+          Fl_Button {} {
+            image {png/process-stop.png} xywh {410 35 25 25} box ENGRAVED_BOX
+          }
+          Fl_Button {} {
+            image {png/edit-copy.png} xywh {435 35 25 25} box ENGRAVED_BOX
+          }
+          Fl_Button {} {
+            image {png/format-indent-more.png} xywh {460 35 25 25} box ENGRAVED_BOX
+          }
+          Fl_Button {} {
+            image {png/document-print.png} xywh {485 35 25 25} box ENGRAVED_BOX
+          }
+        }
+        Fl_Pack {} {open
+          private xywh {260 60 25 285}
+          code0 {o->type(Fl_Pack::VERTICAL);}
+        } {
+          Fl_Button {} {
+            image {png/go-previous.png} xywh {260 60 25 25} box ENGRAVED_BOX
+          }
+          Fl_Button {} {
+            image {png/go-up.png} xywh {260 85 25 25} box ENGRAVED_BOX
+          }
+          Fl_Button {} {
+            image {png/zoom-in.png} xywh {260 110 25 25} box ENGRAVED_BOX
+          }
+          Fl_Button {} {
+            image {png/zoom-out.png} xywh {260 135 25 25} box ENGRAVED_BOX
+          }
+          Fl_Button {} {
+            image {png/go-down.png} xywh {260 160 25 25} box ENGRAVED_BOX
+          }
+          Fl_Button {} {
+            image {png/go-next.png} xywh {260 185 25 25} box ENGRAVED_BOX
+          }
+          Fl_Button {} {
+            image {png/arrow-right-double.png} xywh {260 210 25 25} box ENGRAVED_BOX
+          }
+          Fl_Button {} {
+            image {png/media-playback-start.png} xywh {260 235 25 25} box ENGRAVED_BOX
+          }
+          Fl_Button {} {
+            image {png/arrow-left-double.png} xywh {260 260 25 25} box ENGRAVED_BOX
+          }
+        }
+        Fl_Tabs {} {open
+          xywh {285 60 425 290} align 289 resizable
+        } {
+          Fl_Scroll {} {
+            label Plot open
+            image {png/office-chart-line.png} xywh {285 85 425 265} align 257 hide
+          } {
+            Fl_Box graph {
+              xywh {285 85 425 265} box ENGRAVED_BOX resizable
+              class Fl_MathGL
+            }
+          }
+          Fl_Group {} {
+            label Data open
+            image {png/system-file-manager.png} xywh {285 85 425 260} hide
+          } {}
+          Fl_Group {} {
+            label Info open
+            image {png/dialog-information.png} xywh {285 85 425 260} hide
+          } {}
+          Fl_Group {} {
+            label Help open
+            image {png/help-contents.png} xywh {285 85 425 260} align 289 resizable
+          } {
+            Fl_Help_View {} {
+              xywh {285 110 425 235} resizable
+            }
+          }
+        }
+        Fl_Pack {} {open
+          private xywh {710 60 25 285}
+          code0 {o->type(Fl_Pack::VERTICAL);}
+        } {
+          Fl_Button {} {
+            image {png/edit-delete.png} xywh {710 60 25 25} box ENGRAVED_BOX
+          }
+          Fl_Button {} {
+            image {png/object-order-lower.png} xywh {710 85 25 25} box ENGRAVED_BOX
+          }
+          Fl_Button {} {
+            image {png/object-order-raise.png} xywh {710 110 25 25} box ENGRAVED_BOX
+          }
+          Fl_Button {} {
+            image {png/layer-visible-on.png} xywh {710 135 25 25} box ENGRAVED_BOX
+          }
+          Fl_Button {} {
+            image {png/document-new.png} xywh {710 160 25 25} box ENGRAVED_BOX
+          }
+          Fl_Button {} {
+            image {png/document-print.png} xywh {710 185 25 25} box ENGRAVED_BOX
+          }
+          Fl_Button {} {
+            image {png/edit-clear.png} xywh {710 210 25 25} box ENGRAVED_BOX
+          }
+          Fl_Button {} {
+            image {png/list-add.png} xywh {710 235 25 25} box ENGRAVED_BOX
+          }
+          Fl_Button {} {
+            image {png/list-remove.png} xywh {710 260 25 25} box ENGRAVED_BOX
+          }
+        }
+      }
+    }
+    Fl_Menu_Bar menu {open
+      xywh {0 0 680 25} align 288
+    } {
+      Submenu {} {
+        label File
+        xywh {0 0 100 20}
+      } {
+        MenuItem {} {
+          label {New script}
+          xywh {0 0 100 20}
+        }
+        MenuItem {} {
+          label {Open file ...}
+          xywh {0 0 100 20} shortcut 0x4006f
+        }
+        MenuItem {} {
+          label {Save file}
+          xywh {0 0 100 20} shortcut 0x40073
+        }
+        MenuItem {} {
+          label {Save as ...}
+          xywh {0 0 100 20} divider
+        }
+        MenuItem {} {
+          label {Print script}
+          xywh {0 0 100 20}
+        }
+        MenuItem {} {
+          label {Print plot}
+          xywh {0 0 100 20} divider
+        }
+        Submenu {} {
+          label {Recent files} open
+          xywh {0 0 100 20} divider
+        } {
+          MenuItem {} {
+            label {1.}
+            xywh {0 0 100 20}
+          }
+          MenuItem {} {
+            label {2.}
+            xywh {0 0 100 20}
+          }
+          MenuItem {} {
+            label {3.}
+            xywh {0 0 100 20}
+          }
+          MenuItem {} {
+            label {4.}
+            xywh {0 0 100 20}
+          }
+          MenuItem {} {
+            label {5.}
+            xywh {0 0 100 20}
+          }
+        }
+        MenuItem {} {
+          label Exit
+          callback {exit(0);}
+          xywh {0 0 100 20}
+        }
+      }
+      Submenu {} {
+        label Edit
+        xywh {0 0 100 20}
+      } {
+        MenuItem {} {
+          label Undo
+          xywh {0 0 100 20} shortcut 0x4007a
+        }
+        MenuItem {} {
+          label Redo
+          xywh {0 0 100 20} divider
+        }
+        MenuItem {} {
+          label {Cut text}
+          xywh {0 0 100 20} shortcut 0x40078
+        }
+        MenuItem {} {
+          label {Copy text}
+          xywh {0 0 100 20} shortcut 0x40063
+        }
+        MenuItem {} {
+          label {Paste text}
+          xywh {0 0 100 20} shortcut 0x40076
+        }
+        MenuItem {} {
+          label {Select all}
+          xywh {0 0 100 20} shortcut 0x40061 divider
+        }
+        MenuItem {} {
+          label {Find|Replace}
+          xywh {0 0 100 20} shortcut 0x40066
+        }
+        MenuItem {} {
+          label {Find next}
+          xywh {0 0 100 20} shortcut 0xffc0 divider
+        }
+        Submenu {} {
+          label Insert open
+          xywh {0 0 100 20}
+        } {
+          MenuItem {} {
+            label Command
+            xywh {0 0 100 20} shortcut 0x400063
+          }
+          MenuItem {} {
+            label Inplot
+            xywh {0 0 100 20} shortcut 0x400069
+          }
+          MenuItem {} {
+            label {Fitted formula}
+            xywh {0 0 100 20} shortcut 0x400066
+          }
+          MenuItem {} {
+            label {Plot style}
+            xywh {0 0 100 20}
+          }
+          MenuItem {} {
+            label {Option(s)}
+            xywh {0 0 100 20} shortcut 0x40006f
+          }
+          MenuItem {} {
+            label {File path}
+            xywh {0 0 100 20} shortcut 0x400070
+          }
+          MenuItem {} {
+            label {Folder path}
+            xywh {0 0 100 20}
+          }
+          MenuItem {} {
+            label {Numeric value}
+            xywh {0 0 100 20} shortcut 0x40006e
+          }
+        }
+      }
+      Submenu {} {
+        label Plot
+        xywh {0 0 100 20}
+      } {
+        MenuItem {} {
+          label Alpha
+          xywh {0 0 100 20} shortcut 0x40073
+        }
+        MenuItem {} {
+          label Light
+          xywh {0 0 100 20} shortcut 0x4006c
+        }
+        MenuItem {} {
+          label Grid
+          xywh {0 0 100 20} shortcut 0x40067 divider
+        }
+        MenuItem {} {
+          label {Restore size}
+          xywh {0 0 100 20} shortcut 0x40020
+        }
+        MenuItem {} {
+          label {Update plot}
+          xywh {0 0 100 20} shortcut 0xffc2
+        }
+        MenuItem {} {
+          label {Adjust size}
+          xywh {0 0 100 20} shortcut 0xffc3
+        }
+        MenuItem {} {
+          label Stop
+          xywh {0 0 100 20} divider
+        }
+        MenuItem {} {
+          label {Copy image}
+          xywh {0 0 100 20} shortcut 0x50067
+        }
+        MenuItem {} {
+          label {Copy click coor.}
+          xywh {0 0 100 20} divider
+        }
+        Submenu {} {
+          label {Add objects}
+          xywh {5 5 100 20}
+        } {
+          MenuItem {} {
+            label Line
+            xywh {5 5 100 20}
+          }
+          MenuItem {} {
+            label Arc
+            xywh {5 5 100 20}
+          }
+          MenuItem {} {
+            label Curve
+            xywh {5 5 100 20}
+          }
+          MenuItem {} {
+            label Rectangle
+            xywh {5 5 100 20}
+          }
+          MenuItem {} {
+            label Rhombus
+            xywh {5 5 100 20}
+          }
+          MenuItem {} {
+            label Ellipse
+            xywh {5 5 100 20}
+          }
+          MenuItem {} {
+            label Polygon
+            xywh {5 5 100 20}
+          }
+          MenuItem {} {
+            label Marker
+            xywh {5 5 100 20}
+          }
+          MenuItem {} {
+            label Text
+            xywh {5 5 100 20}
+          }
+        }
+        Submenu {} {
+          label Selection
+          xywh {0 0 100 20}
+        } {
+          MenuItem {} {
+            label Hide
+            xywh {0 0 100 20}
+          }
+          MenuItem {} {
+            label Delete
+            xywh {0 0 100 20}
+          }
+          MenuItem {} {
+            label {Move up}
+            xywh {0 0 100 20}
+          }
+          MenuItem {} {
+            label {Move down}
+            xywh {0 0 100 20}
+          }
+          MenuItem {} {
+            label {Show hidden}
+            xywh {0 0 100 20} shortcut 0xffc5
+          }
+        }
+        Submenu {} {
+          label {Export as 2D}
+          xywh {0 0 100 20}
+        } {
+          MenuItem {} {
+            label PNG
+            xywh {0 0 100 20} shortcut 0x80070
+          }
+          MenuItem {} {
+            label {solid PNG}
+            xywh {0 0 100 20} shortcut 0x80066
+          }
+          MenuItem {} {
+            label JPEG
+            xywh {0 0 100 20} shortcut 0x8006a
+          }
+          MenuItem {} {
+            label GIF
+            xywh {0 0 100 20} shortcut 0x80067
+          }
+          MenuItem {} {
+            label BMP
+            xywh {0 0 100 20} shortcut 0x80062
+          }
+          MenuItem {} {
+            label {bitmap EPS}
+            xywh {0 0 100 20}
+          }
+          MenuItem {} {
+            label {vector EPS}
+            xywh {0 0 100 20} shortcut 0x80065
+          }
+          MenuItem {} {
+            label SVG
+            xywh {0 0 100 20} shortcut 0x80073
+          }
+          MenuItem {} {
+            label LaTeX
+            xywh {0 0 100 20} shortcut 0x40073
+          }
+        }
+        Submenu {} {
+          label {Export as 3D}
+          xywh {0 0 100 20}
+        } {
+          MenuItem {} {
+            label {3D PDF}
+            xywh {0 0 100 20} shortcut 0x80064
+          }
+          MenuItem {} {
+            label PRC
+            xywh {0 0 100 20}
+          }
+          MenuItem {} {
+            label OBJ
+            xywh {0 0 100 20} shortcut 0x8006f
+          }
+          MenuItem {} {
+            label STL
+            xywh {0 0 100 20}
+          }
+          MenuItem {} {
+            label XYZ
+            xywh {0 0 100 20}
+          }
+        }
+        Submenu {} {
+          label Transform
+          xywh {0 0 100 20}
+        } {
+          MenuItem {} {
+            label {Move left}
+            xywh {0 0 100 20} shortcut 0x8ff51
+          }
+          MenuItem {} {
+            label {Move up}
+            xywh {0 0 100 20} shortcut 0x8ff52
+          }
+          MenuItem {} {
+            label {Zoom in}
+            xywh {0 0 100 20} shortcut 0x8003d
+          }
+          MenuItem {} {
+            label {Zoom out}
+            xywh {0 0 100 20} shortcut 0x8002d
+          }
+          MenuItem {} {
+            label {Move down}
+            xywh {0 0 100 20} shortcut 0x8ff54
+          }
+          MenuItem {} {
+            label {Move right}
+            xywh {0 0 100 20} shortcut 0x8ff53 divider
+          }
+          MenuItem {} {
+            label {Rotate up}
+            xywh {0 0 100 20} shortcut 0x41ff52
+          }
+          MenuItem {} {
+            label {Rotate down}
+            xywh {0 0 100 20} shortcut 0x9ff54
+          }
+          MenuItem {} {
+            label {Rotate left}
+            xywh {0 0 100 20} shortcut 0x9ff51
+          }
+          MenuItem {} {
+            label {Rotate right}
+            xywh {0 0 100 20} shortcut 0x9ff53
+          }
+        }
+        Submenu {} {
+          label Animation
+          xywh {0 0 100 20}
+        } {
+          MenuItem {} {
+            label {Next slide}
+            xywh {0 0 100 20} shortcut 0x4002e
+          }
+          MenuItem {} {
+            label Slideshow
+            xywh {0 0 100 20} shortcut 0x4ffc2
+          }
+          MenuItem {} {
+            label {Prev. slide}
+            xywh {0 0 100 20} shortcut 0x4002c
+          }
+          MenuItem {} {
+            label {Setup show}
+            xywh {0 0 100 20} shortcut 0x40077
+          }
+        }
+      }
+      Submenu {} {
+        label Setup
+        xywh {0 0 100 20}
+      } {
+        MenuItem {} {
+          label Properties
+          callback {prop_dlg->show();}
+          xywh {0 0 100 20}
+        }
+        MenuItem {} {
+          label {Set arguments}
+          callback {args_dlg->show();}
+          xywh {0 0 100 20}
+        }
+        MenuItem {} {
+          label {Plot setup}
+          xywh {10 10 100 20} shortcut 0x400067 divider
+        }
+        MenuItem {} {
+          label Calculator
+          xywh {0 0 100 20} shortcut 0xffc1
+        }
+        MenuItem {} {
+          label Messages
+          xywh {0 0 100 20} shortcut 0xffbf
+        }
+      }
+      Submenu {} {
+        label Help
+        xywh {0 0 100 20}
+      } {
+        MenuItem {} {
+          label Help
+          xywh {0 0 100 20} shortcut 0xffbe
+        }
+        MenuItem {} {
+          label Hints
+          xywh {0 0 100 20}
+        }
+        MenuItem {} {
+          label About
+          xywh {0 0 100 20}
+        }
+      }
+    }
+    Fl_Output {} {
+      xywh {0 350 680 25}
+    }
+  }
+} 
+
+Function {create_common()} {return_type void
+} {
+  code {make_prop();
+make_args();
+make_find();} {}
+} 
+
+Function {make_args()} {
+  comment {Dialog to set MGL arguments}
+} {
+  Fl_Window args_dlg {
+    label {Set script arguments}
+    xywh {966 713 290 320} type Double hide
+  } {
+    Fl_Input arg1 {
+      label {String for $1}
+      xywh {5 20 135 30} align 5
+    }
+    Fl_Input arg2 {
+      label {String for $2}
+      xywh {150 20 135 30} align 5
+    }
+    Fl_Input arg3 {
+      label {String for $3}
+      xywh {5 75 135 30} align 5
+    }
+    Fl_Input arg4 {
+      label {String for $4}
+      xywh {150 75 135 30} align 5
+    }
+    Fl_Input arg5 {
+      label {String for $5}
+      xywh {5 130 135 30} align 5
+    }
+    Fl_Input arg6 {
+      label {String for $6}
+      xywh {150 130 135 30} align 5
+    }
+    Fl_Input arg7 {
+      label {String for $7}
+      xywh {5 185 135 30} align 5
+    }
+    Fl_Input arg8 {
+      label {String for $8}
+      xywh {150 185 135 30} align 5
+    }
+    Fl_Input arg9 {
+      label {String for $9}
+      xywh {5 240 135 30} align 5
+    }
+    Fl_Input arg0 {
+      label {String for $0}
+      xywh {150 240 135 30} align 5
+    }
+    Fl_Button {} {
+      label Cancel
+      callback {args_dlg->hide();}
+      xywh {60 290 75 25}
+    }
+    Fl_Return_Button {} {
+      label Set
+      callback {parser.AddParam(0,arg0->value());
+parser.AddParam(1,arg1->value());
+parser.AddParam(2,arg2->value());
+parser.AddParam(3,arg3->value());
+parser.AddParam(4,arg4->value());
+parser.AddParam(5,arg5->value());
+parser.AddParam(6,arg6->value());
+parser.AddParam(7,arg7->value());
+parser.AddParam(8,arg8->value());
+parser.AddParam(9,arg9->value());
+args_dlg->hide();}
+      xywh {155 290 75 25}
+    }
+  }
+} 
+
+Function {make_prop()} {
+  comment {Dialog for mgllab properties}
+} {
+  Fl_Window prop_dlg {
+    label Properties
+    xywh {1026 403 340 365} type Double align 80 hide modal
+  } {
+    Fl_Choice fkind {
+      label {Font kind} open
+      xywh {75 10 90 25} down_box BORDER_BOX
+      code0 {fkind->add("Helvetica");}
+      code1 {fkind->add("Courier");}
+      code2 {fkind->add("Times");}
+      code3 {fkind->value(styletable[0].font/4);}
+    } {}
+    Fl_Spinner fsize {
+      label {Font size}
+      xywh {245 10 90 25}
+      code0 {fsize->value(styletable[0].size);}
+    }
+    Fl_File_Input help_path {
+      label {Path for help files}
+      xywh {5 55 305 35} align 5
+      code0 {help_path->value(docdir.c_str());}
+    }
+    Fl_Button {} {
+      label {...}
+      xywh {310 65 25 25}
+    }
+    Fl_File_Input font_path {
+      label {Path for MathGL font (without extension)}
+      xywh {5 110 305 35} align 5
+      code0 {font_path->value(fontname.c_str());}
+    }
+    Fl_Button {} {
+      label {...}
+      xywh {310 120 25 25}
+    }
+    Fl_Check_Button auto_exec_w {
+      label {Execute script after loading}
+      xywh {5 145 330 25} down_box DOWN_BOX
+    }
+    Fl_Check_Button exec_save_w {
+      label {Save file before redrawing}
+      xywh {5 170 330 25} down_box DOWN_BOX
+    }
+    Fl_Check_Button complete_w {
+      label {Enable keywords completition}
+      xywh {5 195 330 25} down_box DOWN_BOX deactivate
+    }
+    Fl_Check_Button highlight_w {
+      label {Highlight current object(s)}
+      xywh {5 220 330 25} down_box DOWN_BOX
+    }
+    Fl_Check_Button mouse_zoom_w {
+      label {Enable mouse wheel for zooming}
+      xywh {5 245 330 25} down_box DOWN_BOX
+    }
+    Fl_Choice lang_w {
+      label {Language for mgllab} open
+      xywh {160 275 175 25} down_box BORDER_BOX
+      code0 {lang_w->add("C.UTF8");}
+      code1 {lang_w->add("ru_RU.utf8");}
+      code2 {lang_w->add("ru_RU.cp1251");}
+    } {}
+    Fl_Choice scheme_w {
+      label {Widget scheme} open
+      xywh {160 305 175 25} down_box BORDER_BOX
+      code0 {scheme_w->add("base");}
+      code1 {scheme_w->add("gtk+");}
+      code2 {scheme_w->add("plastic");}
+      code3 {scheme_w->add("gleam");}
+    } {}
+    Fl_Button {} {
+      label Cancel
+      callback {prop_dlg->hide();}
+      xywh {85 340 75 25}
+    }
+    Fl_Return_Button {} {
+      label OK
+      callback {set_style(fkind->value(),fsize->value());
+auto_exec = auto_exec_w->value();
+exec_save = exec_save_w->value();
+highlight = highlight_w->value();
+mouse_zoom = mouse_zoom_w->value();
+docdir = help_path->value();
+fontname = font_path->value();
+mgl_load_font(graph->get_graph(),fontname.c_str(),NULL);
+set_scheme_lang(scheme_w->value(),lang_w->value());
+save_pref();
+prop_dlg->hide();}
+      xywh {180 340 75 25}
+    }
+  }
+} 
+
+Function {make_calc()} {
+  comment Calculator
+} {
+  Fl_Window {} {
+    label Calculator open
+    xywh {378 341 275 275} type Double hide
+  } {
+    Fl_Input edit {
+      xywh {5 5 240 25}
+    }
+    Fl_Button {} {
+      label {@>}
+      xywh {245 5 25 25}
+    }
+    Fl_Output result {
+      label Result
+      xywh {55 35 120 25}
+    }
+    Fl_Button {} {
+      label {@-> to script}
+      xywh {180 35 90 25}
+    }
+    Fl_Browser prev {
+      label {Previous expressions}
+      xywh {5 80 265 70} align 5
+    }
+    Fl_Group {} {open
+      xywh {5 155 145 120}
+    } {
+      Fl_Button {} {
+        label 7
+        user_data {"7"}
+        xywh {10 160 25 25}
+      }
+      Fl_Button {} {
+        label 8
+        user_data {"8"}
+        xywh {40 160 25 25}
+      }
+      Fl_Button {} {
+        label 9
+        user_data {"9"}
+        xywh {70 160 25 25}
+      }
+      Fl_Button {} {
+        label {+}
+        user_data {"+"}
+        xywh {100 160 25 25}
+      }
+      Fl_Button {} {
+        label pi
+        user_data {"pi"}
+        xywh {130 160 25 25}
+      }
+      Fl_Button {} {
+        label 4
+        user_data {"4"}
+        xywh {10 190 25 25}
+      }
+      Fl_Button {} {
+        label 5
+        user_data {"5"}
+        xywh {40 190 25 25}
+      }
+      Fl_Button {} {
+        label 6
+        user_data {"6"}
+        xywh {70 190 25 25}
+      }
+      Fl_Button {} {
+        label {-}
+        user_data {"-"}
+        xywh {100 190 25 25}
+      }
+      Fl_Button {} {
+        label {^}
+        user_data {"^"}
+        xywh {130 190 25 25}
+      }
+      Fl_Button {} {
+        label 1
+        user_data {"1"}
+        xywh {10 220 25 25}
+      }
+      Fl_Button {} {
+        label 2
+        user_data {"2"}
+        xywh {40 220 25 25}
+      }
+      Fl_Button {} {
+        label 3
+        user_data {"3"}
+        xywh {70 220 25 25}
+      }
+      Fl_Button {} {
+        label {*}
+        user_data {"8"}
+        xywh {100 220 25 25}
+      }
+      Fl_Button {} {
+        label {(}
+        user_data {"("}
+        xywh {130 220 25 25}
+      }
+      Fl_Button {} {
+        label 0
+        user_data {"0"}
+        xywh {10 250 25 25}
+      }
+      Fl_Button {} {
+        label {.}
+        user_data {"."}
+        xywh {40 250 25 25}
+      }
+      Fl_Button {} {
+        label E
+        xywh {70 250 25 25}
+      }
+      Fl_Button {} {
+        label {/}
+        user_data {"/"}
+        xywh {100 250 25 25}
+      }
+      Fl_Button {} {
+        label {)}
+        user_data {")"}
+        xywh {130 250 25 25}
+      }
+    }
+    Fl_Group {} {
+      label Function open
+      xywh {155 174 115 95} box DOWN_BOX
+    } {
+      Fl_Choice kind {open
+        xywh {160 179 105 25} down_box BORDER_BOX
+      } {}
+      Fl_Choice func {open
+        xywh {160 209 105 25} down_box BORDER_BOX
+      } {}
+      Fl_Button {} {
+        label {Put function}
+        xywh {160 239 105 25}
+      }
+    }
+  }
+} 
+
+Function {make_option()} {} {
+  Fl_Window {} {
+    label {Add command option(s)}
+    xywh {336 575 570 185} type Double hide modal
+  } {
+    Fl_Input x1 {
+      label {X-range}
+      xywh {65 5 85 25}
+    }
+    Fl_Input x2 {
+      label {-}
+      xywh {160 5 85 25}
+    }
+    Fl_Input y1 {
+      label {Y-range}
+      xywh {65 35 85 25}
+    }
+    Fl_Input y2 {
+      label {-}
+      xywh {160 35 85 25}
+    }
+    Fl_Input z1 {
+      label {Z-range}
+      xywh {65 65 85 25}
+    }
+    Fl_Input z2 {
+      label {-}
+      xywh {160 65 85 25}
+    }
+    Fl_Input c1 {
+      label {C-range}
+      xywh {65 95 85 25} deactivate
+    }
+    Fl_Input c2 {
+      label {-}
+      xywh {160 95 85 25} deactivate
+    }
+    Fl_Input val {
+      label Value
+      xywh {325 5 85 25} labelfont 1
+    }
+    Fl_Input meshnum {
+      label MeshNum
+      xywh {325 35 85 25}
+    }
+    Fl_Input size {
+      label Size
+      xywh {325 65 85 25}
+    }
+    Fl_Choice cut {
+      label Cutting open
+      xywh {325 95 85 25} down_box BORDER_BOX
+      code0 {cut->add("default");}
+      code1 {cut->add("on");}
+      code2 {cut->add("off");}
+    } {}
+    Fl_Input alpha {
+      label Alpha
+      xywh {480 5 85 25}
+    }
+    Fl_Input amb {
+      label Ambient
+      xywh {480 35 85 25}
+    }
+    Fl_Input dif {
+      label Diffuse
+      xywh {480 65 85 25}
+    }
+    Fl_Choice light {
+      label Light open
+      xywh {480 95 85 25} down_box BORDER_BOX
+      code0 {light->add("default");}
+      code1 {light->add("on");}
+      code2 {light->add("off");}
+    } {}
+    Fl_Input legend {
+      label Legend
+      xywh {65 125 500 25}
+    }
+    Fl_Button {} {
+      label Cancel
+      xywh {385 155 85 25}
+    }
+    Fl_Return_Button {} {
+      label OK
+      xywh {480 155 85 25}
+    }
+  }
+} 
+
+Function {make_dirsel()} {} {
+  Fl_Window {} {
+    label {Select direction}
+    xywh {454 309 220 85} type Double hide modal
+  } {
+    Fl_Choice dir {
+      label Direction open
+      xywh {80 10 135 25} down_box BORDER_BOX
+      code0 {dir->add("default"); dir->add("xyz");}
+      code1 {dir->add("x"); dir->add("y"); dir->add("z");}
+      code2 {dir->add("xy"); dir->add("xz"); dir->add("yz");}
+    } {}
+    Fl_Button {} {
+      label Cancel
+      xywh {55 50 75 25}
+    }
+    Fl_Return_Button {} {
+      label OK
+      xywh {140 50 75 25}
+    }
+  }
+} 
+
+Function {make_datsel()} {} {
+  Fl_Window {} {
+    label {Select data argument}
+    xywh {440 689 355 255} type Double hide modal
+  } {
+    Fl_Choice name {
+      label {Data name} open
+      xywh {105 5 145 25} down_box BORDER_BOX
+    } {}
+    Fl_Choice oper {
+      label Operation open
+      xywh {105 155 130 25} down_box BORDER_BOX
+      code0 {oper->add("max"); oper->add("min");}
+      code1 {oper->add("sum"); oper->add("trace");}
+      code2 {oper->add("pulse");}
+    } {}
+    Fl_Choice dir {
+      label along open
+      xywh {285 155 65 25} down_box BORDER_BOX
+      code0 {dir->add("none");}
+      code1 {dir->add("x"); dir->add("y"); dir->add("z");}
+      code2 {dir->add("xy"); dir->add("xz"); dir->add("yz");}
+    } {}
+    Fl_Spinner x1 {
+      label {X-slice from}
+      xywh {105 35 60 25}
+    }
+    Fl_Spinner x2 {
+      label to
+      xywh {190 35 60 25}
+    }
+    Fl_Spinner y1 {
+      label {Y-slice from}
+      xywh {105 65 60 25}
+    }
+    Fl_Spinner y2 {
+      label to
+      xywh {190 65 60 25}
+    }
+    Fl_Spinner z1 {
+      label {Z-slice from}
+      xywh {105 95 60 25}
+    }
+    Fl_Spinner z2 {
+      label to
+      xywh {190 95 60 25}
+    }
+    Fl_Output res {
+      label Result
+      xywh {60 190 290 25}
+    }
+    Fl_Button {} {
+      label Cancel
+      xywh {190 225 75 25}
+    }
+    Fl_Return_Button {} {
+      label OK
+      xywh {275 225 75 25}
+    }
+    Fl_Input clmn {
+      label {Column expr}
+      xywh {105 125 245 25}
+    }
+  }
+} 
+
+Function {make_newcmd()} {} {
+  Fl_Window {} {
+    label {New command}
+    xywh {985 165 780 515} type Double hide modal
+  } {
+    Fl_Choice kind {
+      label Kind open
+      xywh {80 5 270 25} down_box BORDER_BOX
+    } {}
+    Fl_Choice cmd {
+      label Command open
+      xywh {80 35 270 25} down_box BORDER_BOX
+    } {}
+    Fl_Choice var {
+      label Variant open
+      xywh {80 95 270 25} down_box BORDER_BOX
+    } {}
+    Fl_Group desc {
+      label Description open
+      xywh {5 65 345 25} box ENGRAVED_BOX labelsize 12 align 0
+    } {}
+    Fl_Browser args {
+      label Arguments
+      xywh {5 140 345 115} align 5
+    }
+    Fl_Output res {
+      label Result
+      xywh {60 295 290 25}
+    }
+    Fl_Input {} {
+      label Options
+      xywh {60 265 265 25}
+    }
+    Fl_Button {} {
+      label {...}
+      xywh {325 265 25 25}
+    }
+    Fl_Button {} {
+      label Cancel
+      xywh {275 450 75 25}
+    }
+    Fl_Return_Button {} {
+      label OK
+      xywh {275 480 75 25}
+    }
+    Fl_Help_View help {
+      xywh {360 5 415 505} labelsize 12
+    }
+    Fl_Box gr {
+      xywh {10 330 240 180} box ENGRAVED_BOX
+    }
+    Fl_Check_Button {} {
+      label Preview
+      xywh {260 330 79 25} down_box DOWN_BOX
+    }
+  }
+} 
+
+Function {make_style()} {} {
+  Fl_Window {} {
+    label {Plot style} open
+    xywh {322 168 380 540} type Double hide
+  } {
+    Fl_Tabs {} {open
+      xywh {0 5 375 235}
+    } {
+      Fl_Group {} {
+        label {Line style} open
+        xywh {0 30 375 210} hide
+      } {
+        Fl_Choice arr1 {
+          label {Arrow at start} open
+          xywh {5 50 110 25} down_box BORDER_BOX align 5
+        } {}
+        Fl_Choice dash {
+          label Dashing open
+          xywh {125 50 110 25} down_box BORDER_BOX align 5
+        } {}
+        Fl_Choice arr2 {
+          label {Arrow at end} open
+          xywh {245 50 110 25} down_box BORDER_BOX align 5
+        } {}
+        Fl_Choice mark {
+          label Marks open
+          xywh {125 80 110 25} down_box BORDER_BOX
+        } {}
+        Fl_Check_Button solid {
+          label solid
+          xywh {240 80 55 25} down_box DOWN_BOX
+        }
+        Fl_Check_Button user {
+          label user
+          xywh {300 80 55 25} down_box DOWN_BOX
+        }
+        Fl_Spinner width {
+          label Width
+          xywh {125 110 110 25}
+          code0 {o->bounds(1,9); o->value(1);}
+        }
+        Fl_Button {} {
+          label {Manual dashing}
+          xywh {10 210 20 20} align 5
+        }
+        Fl_Button {} {
+          xywh {30 210 20 20}
+        }
+        Fl_Button {} {
+          xywh {50 210 20 20}
+        }
+        Fl_Button {} {
+          xywh {70 210 20 20}
+        }
+        Fl_Button {} {
+          xywh {90 210 20 20}
+        }
+        Fl_Button {} {
+          xywh {110 210 20 20}
+        }
+        Fl_Button {} {
+          xywh {130 210 20 20}
+        }
+        Fl_Button {} {
+          xywh {150 210 20 20}
+        }
+        Fl_Button {} {
+          xywh {170 210 20 20}
+        }
+        Fl_Button {} {
+          xywh {190 210 20 20}
+        }
+        Fl_Button {} {
+          xywh {210 210 20 20}
+        }
+        Fl_Button {} {
+          xywh {230 210 20 20}
+        }
+        Fl_Button {} {
+          xywh {250 210 20 20}
+        }
+        Fl_Button {} {
+          xywh {270 210 20 20}
+        }
+        Fl_Button {} {
+          xywh {290 210 20 20}
+        }
+        Fl_Button {} {
+          xywh {310 210 20 20}
+        }
+      }
+      Fl_Group {} {
+        label {Color scheme} open
+        xywh {0 30 375 210}
+      } {
+        Fl_Choice axial {
+          label {Axial direction} open
+          xywh {5 50 110 25} down_box BORDER_BOX align 5
+          code0 {axial->add("none");}
+          code1 {axial->add("x");}
+          code2 {axial->add("y");}
+          code3 {axial->add("z");}
+        } {}
+        Fl_Choice contt {
+          label {Text on contours} open
+          xywh {125 50 110 25} down_box BORDER_BOX align 5
+          code0 {contt->add("none");}
+          code1 {contt->add("under");}
+          code2 {contt->add("above");}
+        } {}
+        Fl_Input alpha {
+          label Transparency
+          xywh {255 50 110 25} align 5
+        }
+        Fl_Check_Button wire {
+          label {Wire or mesh}
+          xywh {125 80 115 25} down_box DOWN_BOX
+        }
+        Fl_Check_Button sharp {
+          label {Sharp colors}
+          xywh {250 80 110 25} down_box DOWN_BOX
+        }
+        Fl_Group {} {
+          label Mask open
+          xywh {10 105 360 130} box ENGRAVED_BOX align 5
+        } {
+          Fl_Choice mask {
+            label Kind open
+            xywh {80 110 95 25} down_box BORDER_BOX
+          } {}
+          Fl_Choice angle {
+            label Rotation open
+            xywh {80 140 95 25} down_box BORDER_BOX
+            code0 {angle->add("none");}
+            code1 {angle->add("+45");}
+            code2 {angle->add("perp");}
+            code3 {angle->add("-45");}
+          } {}
+          Fl_Spinner msize {
+            label Size
+            xywh {80 170 95 25}
+          }
+          Fl_Button {} {
+            xywh {240 110 15 15}
+          }
+          Fl_Button {} {
+            xywh {255 110 15 15}
+          }
+          Fl_Button {} {
+            xywh {270 110 15 15}
+          }
+          Fl_Button {} {
+            xywh {285 110 15 15}
+          }
+          Fl_Button {} {
+            xywh {300 110 15 15}
+          }
+          Fl_Button {} {
+            xywh {315 110 15 15}
+          }
+          Fl_Button {} {
+            xywh {330 110 15 15}
+          }
+          Fl_Button {} {
+            xywh {345 110 15 15}
+          }
+          Fl_Button {} {
+            xywh {240 125 15 15}
+          }
+          Fl_Button {} {
+            xywh {255 125 15 15}
+          }
+          Fl_Button {} {
+            xywh {270 125 15 15}
+          }
+          Fl_Button {} {
+            xywh {285 125 15 15}
+          }
+          Fl_Button {} {
+            xywh {300 125 15 15}
+          }
+          Fl_Button {} {
+            xywh {315 125 15 15}
+          }
+          Fl_Button {} {
+            xywh {330 125 15 15}
+          }
+          Fl_Button {} {
+            xywh {345 125 15 15}
+          }
+          Fl_Button {} {
+            xywh {240 140 15 15}
+          }
+          Fl_Button {} {
+            xywh {255 140 15 15}
+          }
+          Fl_Button {} {
+            xywh {270 140 15 15}
+          }
+          Fl_Button {} {
+            xywh {285 140 15 15}
+          }
+          Fl_Button {} {
+            xywh {300 140 15 15}
+          }
+          Fl_Button {} {
+            xywh {315 140 15 15}
+          }
+          Fl_Button {} {
+            xywh {330 140 15 15}
+          }
+          Fl_Button {} {
+            xywh {345 140 15 15}
+          }
+          Fl_Button {} {
+            xywh {240 155 15 15}
+          }
+          Fl_Button {} {
+            xywh {255 155 15 15}
+          }
+          Fl_Button {} {
+            xywh {270 155 15 15}
+          }
+          Fl_Button {} {
+            xywh {285 155 15 15}
+          }
+          Fl_Button {} {
+            xywh {300 155 15 15}
+          }
+          Fl_Button {} {
+            xywh {315 155 15 15}
+          }
+          Fl_Button {} {
+            xywh {330 155 15 15}
+          }
+          Fl_Button {} {
+            xywh {345 155 15 15}
+          }
+          Fl_Button {} {
+            xywh {240 170 15 15}
+          }
+          Fl_Button {} {
+            xywh {255 170 15 15}
+          }
+          Fl_Button {} {
+            xywh {270 170 15 15}
+          }
+          Fl_Button {} {
+            xywh {285 170 15 15}
+          }
+          Fl_Button {} {
+            xywh {300 170 15 15}
+          }
+          Fl_Button {} {
+            xywh {315 170 15 15}
+          }
+          Fl_Button {} {
+            xywh {330 170 15 15}
+          }
+          Fl_Button {} {
+            xywh {345 170 15 15}
+          }
+          Fl_Button {} {
+            xywh {240 185 15 15}
+          }
+          Fl_Button {} {
+            xywh {255 185 15 15}
+          }
+          Fl_Button {} {
+            xywh {270 185 15 15}
+          }
+          Fl_Button {} {
+            xywh {285 185 15 15}
+          }
+          Fl_Button {} {
+            xywh {300 185 15 15}
+          }
+          Fl_Button {} {
+            xywh {315 185 15 15}
+          }
+          Fl_Button {} {
+            xywh {330 185 15 15}
+          }
+          Fl_Button {} {
+            xywh {345 185 15 15}
+          }
+          Fl_Button {} {
+            xywh {240 200 15 15}
+          }
+          Fl_Button {} {
+            xywh {255 200 15 15}
+          }
+          Fl_Button {} {
+            xywh {270 200 15 15}
+          }
+          Fl_Button {} {
+            xywh {285 200 15 15}
+          }
+          Fl_Button {} {
+            xywh {300 200 15 15}
+          }
+          Fl_Button {} {
+            xywh {315 200 15 15}
+          }
+          Fl_Button {} {
+            xywh {330 200 15 15}
+          }
+          Fl_Button {} {
+            xywh {345 200 15 15}
+          }
+          Fl_Button {} {
+            label {Manual mask}
+            xywh {240 215 15 15} align 4
+          }
+          Fl_Button {} {
+            xywh {255 215 15 15}
+          }
+          Fl_Button {} {
+            xywh {270 215 15 15}
+          }
+          Fl_Button {} {
+            xywh {285 215 15 15}
+          }
+          Fl_Button {} {
+            xywh {300 215 15 15}
+          }
+          Fl_Button {} {
+            xywh {315 215 15 15}
+          }
+          Fl_Button {} {
+            xywh {330 215 15 15}
+          }
+          Fl_Button {} {
+            xywh {345 215 15 15}
+          }
+        }
+      }
+      Fl_Group {} {
+        label {Text style}
+        xywh {0 30 375 210} hide
+      } {
+        Fl_Check_Button bold {
+          label {Bold style}
+          xywh {5 40 150 25} down_box DOWN_BOX
+        }
+        Fl_Check_Button ital {
+          label {Italic style}
+          xywh {5 65 150 25} down_box DOWN_BOX
+        }
+        Fl_Check_Button twire {
+          label {Wire style}
+          xywh {5 90 150 25} down_box DOWN_BOX
+        }
+        Fl_Check_Button uline {
+          label Underline
+          xywh {5 115 150 25} down_box DOWN_BOX
+        }
+        Fl_Check_Button oline {
+          label Overline
+          xywh {5 140 150 25} down_box DOWN_BOX
+        }
+        Fl_Choice align {
+          label {Text align} open
+          xywh {270 40 95 25} down_box BORDER_BOX
+          code0 {align->add("left");}
+          code1 {align->add("center");}
+          code2 {align->add("right");}
+          code3 {align->value(1);}
+        } {}
+        Fl_Choice align {
+          label {Vertical align} open
+          xywh {270 75 95 25} down_box BORDER_BOX
+          code0 {align->add("default");}
+          code1 {align->add("center");}
+          code2 {align->add("right");}
+        } {}
+      }
+    }
+    Fl_Group {} {
+      label {Color(s) or color scheme} open
+      xywh {0 265 375 155} box ENGRAVED_BOX align 5
+    } {
+      Fl_Choice sch {
+        label {Popular color schemes} open
+        xywh {170 270 115 25} down_box BORDER_BOX
+      } {}
+      Fl_Choice c1 {open
+        xywh {5 300 95 25} down_box BORDER_BOX align 5
+      } {}
+      Fl_Spinner s1 {
+        xywh {105 300 40 25} align 1
+        code0 {o->bounds(1,9); o->value(5);}
+      }
+      Fl_Input p1 {
+        xywh {145 300 40 25}
+      }
+      Fl_Choice c2 {open
+        xywh {190 300 95 25} down_box BORDER_BOX
+      } {}
+      Fl_Spinner s2 {
+        xywh {290 300 40 25}
+        code0 {o->bounds(1,9); o->value(5);}
+      }
+      Fl_Input p2 {
+        xywh {330 300 40 25}
+      }
+      Fl_Choice c3 {open
+        xywh {5 330 95 25} down_box BORDER_BOX
+      } {}
+      Fl_Spinner s3 {
+        xywh {105 330 40 25}
+        code0 {o->bounds(1,9); o->value(5);}
+      }
+      Fl_Input p3 {
+        xywh {145 330 40 25}
+      }
+      Fl_Choice c4 {open
+        xywh {190 330 95 25} down_box BORDER_BOX
+      } {}
+      Fl_Input p4 {
+        xywh {330 330 40 25}
+      }
+      Fl_Spinner s4 {
+        xywh {290 330 40 25}
+        code0 {o->bounds(1,9); o->value(5);}
+      }
+      Fl_Choice c5 {open
+        xywh {5 360 95 25} down_box BORDER_BOX
+      } {}
+      Fl_Spinner s5 {
+        xywh {105 360 40 25}
+        code0 {o->bounds(1,9); o->value(5);}
+      }
+      Fl_Input p5 {
+        xywh {145 360 40 25}
+      }
+      Fl_Choice c6 {open
+        xywh {190 360 95 25} down_box BORDER_BOX
+      } {}
+      Fl_Spinner s6 {
+        xywh {290 360 40 25}
+        code0 {o->bounds(1,9); o->value(5);}
+      }
+      Fl_Input p6 {
+        xywh {330 360 40 25}
+      }
+      Fl_Choice c7 {open
+        xywh {5 390 95 25} down_box BORDER_BOX
+      } {}
+      Fl_Spinner s7 {
+        xywh {105 390 40 25}
+        code0 {o->bounds(1,9); o->value(5);}
+      }
+      Fl_Input p7 {
+        xywh {145 390 40 25}
+      }
+      Fl_Choice c8 {open
+        xywh {190 390 95 25} down_box BORDER_BOX
+      } {}
+      Fl_Spinner s8 {
+        xywh {290 390 40 25}
+        code0 {o->bounds(1,9); o->value(5);}
+      }
+      Fl_Input p8 {
+        xywh {330 390 40 25}
+      }
+      Fl_Check_Button sharp {
+        label plain
+        xywh {290 270 80 25} down_box DOWN_BOX
+      }
+    }
+    Fl_Output {} {
+      label {Resulting string}
+      xywh {5 440 370 25} align 5
+    }
+    Fl_Button {} {
+      label Cancel
+      xywh {300 475 75 25}
+    }
+    Fl_Return_Button {} {
+      label OK
+      xywh {300 505 75 25}
+    }
+    Fl_Box {} {
+      xywh {5 470 285 65} box ENGRAVED_BOX align 4
+    }
+  }
+} 
+
+Function {make_setup()} {} {
+  Fl_Window {} {
+    label {Setup script}
+    xywh {838 369 525 395} type Double hide
+  } {
+    Fl_Tabs {} {open
+      xywh {0 0 525 355}
+    } {
+      Fl_Group {} {
+        label {Axis settings} open
+        xywh {0 25 525 330} hide
+      } {
+        Fl_Input x1 {
+          label Minimal
+          xywh {85 55 100 25}
+        }
+        Fl_Box {} {
+          label {X axis}
+          xywh {85 30 100 25}
+        }
+        Fl_Input x2 {
+          label Maximal
+          xywh {85 85 100 25}
+        }
+        Fl_Input x0 {
+          label Origin
+          xywh {85 115 100 25}
+        }
+        Fl_Input xlabel {
+          label Label
+          xywh {85 145 100 25}
+        }
+        Fl_Input xtick {
+          label Ticks
+          xywh {85 205 100 25}
+        }
+        Fl_Choice xlpos {
+          label {at position} open
+          xywh {85 175 100 25} down_box BORDER_BOX
+        } {}
+        Fl_Input xstick {
+          label Subticks
+          xywh {85 235 100 25}
+        }
+        Fl_Input xotick {
+          label {Ticks start}
+          xywh {85 265 100 25}
+        }
+        Fl_Input xtmpl {
+          label Template
+          xywh {85 295 100 25}
+        }
+        Fl_Input y1 {
+          xywh {195 55 100 25}
+        }
+        Fl_Box {} {
+          label {Y axis}
+          xywh {195 30 100 25}
+        }
+        Fl_Input y2 {
+          xywh {195 85 100 25}
+        }
+        Fl_Input y0 {
+          xywh {195 115 100 25}
+        }
+        Fl_Input ylabel {
+          xywh {195 145 100 25}
+        }
+        Fl_Input ytick {
+          xywh {195 205 100 25}
+        }
+        Fl_Choice ylpos {open
+          xywh {195 175 100 25} down_box BORDER_BOX
+        } {}
+        Fl_Input ystick {
+          xywh {195 235 100 25}
+        }
+        Fl_Input yotick {
+          xywh {195 265 100 25}
+        }
+        Fl_Input ytmpl {
+          xywh {195 295 100 25}
+        }
+        Fl_Input z1 {
+          xywh {305 55 100 25}
+        }
+        Fl_Box {} {
+          label {Z axis}
+          xywh {305 30 100 25}
+        }
+        Fl_Input z2 {
+          xywh {305 85 100 25}
+        }
+        Fl_Input z0 {
+          xywh {305 115 100 25}
+        }
+        Fl_Input zlabel {
+          xywh {305 145 100 25}
+        }
+        Fl_Input ztick {
+          xywh {305 205 100 25}
+        }
+        Fl_Choice zlpos {open
+          xywh {305 175 100 25} down_box BORDER_BOX
+        } {}
+        Fl_Input zstick {
+          xywh {305 235 100 25}
+        }
+        Fl_Input zotick {
+          xywh {305 265 100 25}
+        }
+        Fl_Input ztmpl {
+          xywh {305 295 100 25}
+        }
+        Fl_Input ctmpl {
+          xywh {415 295 100 25}
+        }
+        Fl_Input c0 {
+          xywh {415 115 100 25}
+        }
+        Fl_Input clabel {
+          xywh {415 145 100 25}
+        }
+        Fl_Choice clpos {open
+          xywh {415 175 100 25} down_box BORDER_BOX
+        } {}
+        Fl_Input c1 {
+          xywh {415 55 100 25}
+        }
+        Fl_Box {} {
+          label {C axis}
+          xywh {415 30 100 25}
+        }
+        Fl_Input c2 {
+          xywh {415 85 100 25}
+        }
+        Fl_Input xtmpl {
+          label Template
+          xywh {85 325 100 25}
+        }
+        Fl_Input ytmpl {
+          xywh {195 325 100 25}
+        }
+        Fl_Input ztmpl {
+          xywh {305 325 100 25}
+        }
+        Fl_Input ctmpl {
+          xywh {415 325 100 25}
+        }
+      }
+      Fl_Group {} {
+        label {General settings} open
+        xywh {0 25 525 330}
+      } {
+        Fl_Group {} {
+          label Colors open
+          xywh {5 45 180 305} box ENGRAVED_BOX
+        } {
+          Fl_Input alphadef {
+            label AlphaDef
+            xywh {80 55 100 25}
+          }
+          Fl_Input ambient {
+            label Ambient
+            xywh {80 85 100 25}
+          }
+          Fl_Input diffuse {
+            label Diffuse
+            xywh {80 115 100 25}
+          }
+          Fl_Input palette {
+            label Palette
+            xywh {80 145 100 25}
+          }
+          Fl_Input font_stl {
+            label Font
+            xywh {80 175 100 25}
+          }
+          Fl_Input axis_stl {
+            label Axis
+            xywh {80 205 100 25}
+          }
+          Fl_Input fog {
+            label Fog
+            xywh {80 235 100 25}
+          }
+          Fl_Input fog_dz {
+            label {Fog dist.}
+            xywh {80 265 100 25}
+          }
+          Fl_Check_Button gray {
+            label grayscale
+            xywh {80 290 100 25} down_box DOWN_BOX
+          }
+          Fl_Check_Button alpha {
+            label alpha
+            xywh {10 315 64 25} down_box DOWN_BOX
+          }
+          Fl_Check_Button light {
+            label lighting
+            xywh {80 315 100 25} down_box DOWN_BOX
+          }
+        }
+        Fl_Group {} {
+          label Sizes open
+          xywh {185 45 180 250} box ENGRAVED_BOX
+        } {
+          Fl_Input meshnum {
+            label meshnum
+            xywh {260 55 100 25}
+          }
+          Fl_Input arr_size {
+            label arrows
+            xywh {260 85 100 25}
+          }
+          Fl_Input bar_size {
+            label bars
+            xywh {260 115 100 25}
+          }
+          Fl_Input mrk_size {
+            label markers
+            xywh {260 145 100 25}
+          }
+          Fl_Input txt_size {
+            label text
+            xywh {260 175 100 25}
+          }
+          Fl_Input tick_size {
+            label ticks
+            xywh {260 205 100 25}
+          }
+          Fl_Input pendelta {
+            label {pen blur}
+            xywh {260 235 100 25}
+          }
+          Fl_Input facenum {
+            label facenum
+            xywh {260 265 100 25}
+          }
+        }
+        Fl_Group {} {
+          label Others open
+          xywh {365 45 160 305} box ENGRAVED_BOX
+        } {
+          Fl_Check_Button cut {
+            label cutting
+            xywh {370 50 115 25} down_box DOWN_BOX
+          }
+          Fl_Check_Button attach {
+            label {attach light}
+            xywh {370 70 115 25} down_box DOWN_BOX
+          }
+          Fl_Check_Button origintick {
+            label {no origin tick}
+            xywh {370 90 115 25} down_box DOWN_BOX
+          }
+          Fl_Check_Button rotatetext {
+            label {rotate text}
+            xywh {370 110 115 25} down_box DOWN_BOX
+          }
+          Fl_Choice time {
+            label {Time ticks} open
+            xywh {370 150 145 25} down_box BORDER_BOX align 5
+          } {}
+          Fl_Choice tunetick {
+            label {Tune ticks} open
+            xywh {370 195 145 25} down_box BORDER_BOX align 5
+          } {}
+          Fl_Choice ternary {
+            label Ternary open
+            xywh {370 235 145 25} down_box BORDER_BOX align 5
+          } {}
+          Fl_Choice transptype {
+            label {Transparency type} open
+            xywh {370 277 145 25} down_box BORDER_BOX align 5
+          } {}
+          Fl_Spinner variant {
+            label Variant
+            xywh {372 321 145 25} align 5
+          }
+        }
+        Fl_Input plotid {
+          label {Plot ID}
+          xywh {190 321 172 25} align 5
+        }
+      }
+      Fl_Group {} {
+        label {Light settings}
+        xywh {0 25 525 330} hide
+      } {
+        Fl_Button {} {
+          label {0:}
+          xywh {10 50 25 25}
+        }
+        Fl_Input {} {
+          label {X position}
+          xywh {40 50 90 25} align 5
+        }
+        Fl_Input {} {
+          label {Y position}
+          xywh {135 50 90 25} align 5
+        }
+        Fl_Input {} {
+          label {Z position}
+          xywh {230 50 90 25} align 5
+        }
+        Fl_Choice c1 {
+          label Color open
+          xywh {325 50 95 25} down_box BORDER_BOX align 5
+        } {}
+        Fl_Input {} {
+          label Brightness
+          xywh {425 50 90 25} align 5
+        }
+        Fl_Button {} {
+          label {1:}
+          xywh {10 80 25 25}
+        }
+        Fl_Input {} {
+          xywh {40 80 90 25} align 5
+        }
+        Fl_Input {} {
+          xywh {135 80 90 25} align 5
+        }
+        Fl_Input {} {
+          xywh {230 80 90 25} align 5
+        }
+        Fl_Choice c1 {open
+          xywh {325 80 95 25} down_box BORDER_BOX align 5
+        } {}
+        Fl_Input {} {
+          xywh {425 80 90 25} align 5
+        }
+        Fl_Button {} {
+          label {2:}
+          xywh {10 110 25 25}
+        }
+        Fl_Input {} {
+          xywh {40 110 90 25} align 5
+        }
+        Fl_Input {} {
+          xywh {135 110 90 25} align 5
+        }
+        Fl_Input {} {
+          xywh {230 110 90 25} align 5
+        }
+        Fl_Choice c1 {open
+          xywh {325 110 95 25} down_box BORDER_BOX align 5
+        } {}
+        Fl_Input {} {
+          xywh {425 110 90 25} align 5
+        }
+        Fl_Button {} {
+          label {3:}
+          xywh {10 140 25 25}
+        }
+        Fl_Input {} {
+          xywh {40 140 90 25} align 5
+        }
+        Fl_Input {} {
+          xywh {135 140 90 25} align 5
+        }
+        Fl_Input {} {
+          xywh {230 140 90 25} align 5
+        }
+        Fl_Choice c1 {open
+          xywh {325 140 95 25} down_box BORDER_BOX align 5
+        } {}
+        Fl_Input {} {
+          xywh {425 140 90 25} align 5
+        }
+        Fl_Button {} {
+          label {4:}
+          xywh {10 170 25 25}
+        }
+        Fl_Input {} {
+          xywh {40 170 90 25} align 5
+        }
+        Fl_Input {} {
+          xywh {135 170 90 25} align 5
+        }
+        Fl_Input {} {
+          xywh {230 170 90 25} align 5
+        }
+        Fl_Choice c1 {open
+          xywh {325 170 95 25} down_box BORDER_BOX align 5
+        } {}
+        Fl_Input {} {
+          xywh {425 170 90 25} align 5
+        }
+        Fl_Button {} {
+          label {5:}
+          xywh {10 200 25 25}
+        }
+        Fl_Input {} {
+          xywh {40 200 90 25} align 5
+        }
+        Fl_Input {} {
+          xywh {135 200 90 25} align 5
+        }
+        Fl_Input {} {
+          xywh {230 200 90 25} align 5
+        }
+        Fl_Choice c1 {open
+          xywh {325 200 95 25} down_box BORDER_BOX align 5
+        } {}
+        Fl_Input {} {
+          xywh {425 200 90 25} align 5
+        }
+        Fl_Button {} {
+          label {6:}
+          xywh {10 230 25 25}
+        }
+        Fl_Input {} {
+          xywh {40 230 90 25} align 5
+        }
+        Fl_Input {} {
+          xywh {135 230 90 25} align 5
+        }
+        Fl_Input {} {
+          xywh {230 230 90 25} align 5
+        }
+        Fl_Choice c1 {open
+          xywh {325 230 95 25} down_box BORDER_BOX align 5
+        } {}
+        Fl_Input {} {
+          xywh {425 230 90 25} align 5
+        }
+        Fl_Button {} {
+          label {7:}
+          xywh {10 260 25 25}
+        }
+        Fl_Input {} {
+          xywh {40 260 90 25} align 5
+        }
+        Fl_Input {} {
+          xywh {135 260 90 25} align 5
+        }
+        Fl_Input {} {
+          xywh {230 260 90 25} align 5
+        }
+        Fl_Choice c1 {open
+          xywh {325 260 95 25} down_box BORDER_BOX align 5
+        } {}
+        Fl_Input {} {
+          xywh {425 260 90 25} align 5
+        }
+        Fl_Button {} {
+          label {8:}
+          xywh {10 290 25 25}
+        }
+        Fl_Input {} {
+          xywh {40 290 90 25} align 5
+        }
+        Fl_Input {} {
+          xywh {135 290 90 25} align 5
+        }
+        Fl_Input {} {
+          xywh {230 290 90 25} align 5
+        }
+        Fl_Choice c1 {open
+          xywh {325 290 95 25} down_box BORDER_BOX align 5
+        } {}
+        Fl_Input {} {
+          xywh {425 290 90 25} align 5
+        }
+        Fl_Button {} {
+          label {9:}
+          xywh {10 320 25 25}
+        }
+        Fl_Input {} {
+          xywh {40 320 90 25} align 5
+        }
+        Fl_Input {} {
+          xywh {135 320 90 25} align 5
+        }
+        Fl_Input {} {
+          xywh {230 320 90 25} align 5
+        }
+        Fl_Choice c1 {open
+          xywh {325 320 95 25} down_box BORDER_BOX align 5
+        } {}
+        Fl_Input {} {
+          xywh {425 320 90 25} align 5
+        }
+      }
+    }
+    Fl_Button {} {
+      label Cancel
+      xywh {365 365 75 25}
+    }
+    Fl_Return_Button {} {
+      label OK
+      xywh {445 365 75 25}
+    }
+    Fl_Input fname {
+      label {File to export}
+      tooltip {Keep empty to put at beginning of main script.} xywh {100 365 175 25}
+    }
+    Fl_Button {} {
+      label {@->}
+      xywh {275 365 25 25}
+    }
+  }
+} 
+
+Function {make_inplot()} {} {
+  Fl_Window {} {
+    label {Add inplot}
+    xywh {378 449 715 315} type Double hide modal
+  } {
+    Fl_Round_Button k1 {
+      label SubPlot
+      xywh {5 5 105 25} down_box ROUND_DOWN_BOX
+    }
+    Fl_Round_Button k2 {
+      label MultiPlot
+      xywh {5 35 105 25} down_box ROUND_DOWN_BOX
+    }
+    Fl_Round_Button k3 {
+      label GridPlot
+      xywh {5 65 105 25} down_box ROUND_DOWN_BOX
+    }
+    Fl_Round_Button k4 {
+      label ColumnPlot
+      xywh {5 95 105 25} down_box ROUND_DOWN_BOX
+    }
+    Fl_Round_Button k5 {
+      label StickPlot
+      xywh {5 125 105 25} down_box ROUND_DOWN_BOX
+    }
+    Fl_Round_Button k6 {
+      label InPlot
+      xywh {5 155 105 25} down_box ROUND_DOWN_BOX
+    }
+    Fl_Spinner n1 {
+      label nx
+      xywh {145 5 55 25}
+    }
+    Fl_Spinner m1 {
+      label ny
+      xywh {230 5 55 25}
+    }
+    Fl_Spinner i1 {
+      label ind
+      xywh {315 5 55 25}
+    }
+    Fl_Counter x1 {
+      label dx
+      xywh {400 5 95 25} align 4
+    }
+    Fl_Counter y1 {
+      label dy
+      xywh {525 5 95 25} align 4
+    }
+    Fl_Spinner n2 {
+      label nx
+      xywh {145 35 55 25}
+    }
+    Fl_Spinner m2 {
+      label ny
+      xywh {230 35 55 25}
+    }
+    Fl_Spinner i2 {
+      label ind
+      xywh {315 35 55 25}
+    }
+    Fl_Spinner n3 {
+      label nx
+      xywh {145 65 55 25}
+    }
+    Fl_Spinner m3 {
+      label ny
+      xywh {230 65 55 25}
+    }
+    Fl_Spinner i3 {
+      label ind
+      xywh {315 65 55 25}
+    }
+    Fl_Counter d3 {
+      label d
+      xywh {400 65 95 25} align 4
+    }
+    Fl_Spinner n4 {
+      label nx
+      xywh {145 95 55 25}
+    }
+    Fl_Spinner i4 {
+      label ind
+      xywh {315 95 55 25}
+    }
+    Fl_Counter d4 {
+      label d
+      xywh {400 95 95 25} align 4
+    }
+    Fl_Spinner n5 {
+      label nx
+      xywh {145 125 55 25}
+    }
+    Fl_Spinner i5 {
+      label ind
+      xywh {315 125 55 25}
+    }
+    Fl_Input xx1 {
+      label {x:}
+      xywh {145 155 60 25}
+    }
+    Fl_Input xx2 {
+      label {...}
+      xywh {225 155 60 25}
+    }
+    Fl_Input yy1 {
+      label {y:}
+      xywh {315 155 60 25}
+    }
+    Fl_Input yy2 {
+      label {...}
+      xywh {400 155 60 25}
+    }
+    Fl_Spinner tet {
+      label {Rotate on}
+      xywh {75 190 60 25}
+    }
+    Fl_Spinner phi {
+      label and
+      xywh {170 190 60 25}
+    }
+    Fl_Input ax {
+      label {Aspect x/z}
+      xywh {315 190 60 25}
+    }
+    Fl_Input ay {
+      label {y/z}
+      xywh {400 190 60 25}
+    }
+    Fl_Box {} {
+      label {Reserve at:}
+      xywh {0 225 90 25}
+    }
+    Fl_Check_Button rl {
+      label left
+      xywh {90 225 75 25} down_box DOWN_BOX
+    }
+    Fl_Check_Button rb {
+      label bottom
+      xywh {145 225 75 25} down_box DOWN_BOX
+    }
+    Fl_Check_Button rt {
+      label top
+      xywh {225 225 75 25} down_box DOWN_BOX
+    }
+    Fl_Check_Button rr {
+      label right
+      xywh {285 225 75 25} down_box DOWN_BOX
+    }
+    Fl_Check_Button rw {
+      label {whole area}
+      xywh {360 225 100 25} down_box DOWN_BOX
+    }
+    Fl_Input title {
+      label Title
+      xywh {50 255 350 25}
+    }
+    Fl_Button {} {
+      label Style
+      xywh {400 255 60 25}
+    }
+    Fl_Output res {
+      label Result
+      xywh {50 285 410 25}
+    }
+    Fl_Box gr {
+      xywh {470 130 240 180} box ENGRAVED_BOX
+    }
+    Fl_Button {} {
+      label Cancel
+      xywh {545 95 75 25}
+    }
+    Fl_Return_Button {} {
+      label OK
+      xywh {630 95 75 25}
+    }
+    Fl_Button {} {
+      label Refresh
+      xywh {630 60 75 25}
+    }
+    Fl_Spinner {} {
+      label {x-size}
+      xywh {425 35 70 25}
+    }
+    Fl_Spinner {} {
+      label {y-size}
+      xywh {550 35 70 25}
+    }
+  }
+} 
+
+Function {make_find()} {
+  comment {Dialog to Find/Replace text}
+} {
+  Fl_Window find_dlg {
+    label {Find/Replace}
+    xywh {88 605 375 130} type Double hide modal
+  } {
+    Fl_Input find_w {
+      label {Find what:}
+      xywh {90 10 180 25}
+    }
+    Fl_Return_Button {} {
+      label Find
+      xywh {275 10 95 25}
+    }
+    Fl_Input replace_w {
+      label {Replace by:}
+      xywh {90 40 180 25}
+    }
+    Fl_Button {} {
+      label Replace
+      xywh {275 40 95 25}
+    }
+    Fl_Button {} {
+      label {Replace All}
+      xywh {275 70 95 25}
+    }
+    Fl_Check_Button case_w {
+      label {Match case}
+      xywh {5 70 265 25} down_box DOWN_BOX
+    }
+    Fl_Check_Button sback_w {
+      label {Search backward}
+      xywh {5 95 265 25} down_box DOWN_BOX
+    }
+    Fl_Button {} {
+      label Close
+      callback {find_dlg->hide();}
+      xywh {275 100 95 25}
+    }
+  }
+} 
+
+Function {make_animate()} {open
+} {
+  Fl_Window {} {open
+    xywh {360 218 405 405} type Double hide
+  } {}
+} 
+
+Function {make_datinfo()} {} {
+  Fl_Window {} {open
+    xywh {304 146 420 530} type Double hide
+  } {
+    Fl_Output out {
+      label Information
+      xywh {10 26 400 150} align 5
+    }
+    Fl_Box gr {
+      xywh {10 221 400 300} box ENGRAVED_BOX
+    }
+    Fl_Button {} {
+      label {@<-}
+      xywh {10 186 25 25}
+    }
+    Fl_Button {} {
+      label {as 1D}
+      xywh {40 186 75 25}
+    }
+    Fl_Button {} {
+      label {2D view}
+      xywh {120 186 75 25}
+    }
+    Fl_Button {} {
+      label {as 3D}
+      xywh {200 186 75 25}
+    }
+    Fl_Button {} {
+      label {@->}
+      xywh {280 186 25 25}
+    }
+    Fl_Return_Button {} {
+      label Close
+      xywh {335 186 75 25}
+    }
+  }
+} 
+
+Function {make_prim()} {} {
+  Fl_Window {} {
+    label {Add primitive} open
+    xywh {333 270 295 195} type Double hide
+  } {
+    Fl_Choice kind {
+      label Kind open
+      xywh {65 10 75 25} down_box BORDER_BOX
+    } {}
+    Fl_Choice col {
+      label Color open
+      xywh {205 10 75 25} down_box BORDER_BOX
+    } {}
+    Fl_Choice arr1 {
+      label Arrow1 open
+      xywh {65 40 75 25} down_box BORDER_BOX
+    } {}
+    Fl_Choice arr2 {
+      label Arrow2 open
+      xywh {205 40 75 25} down_box BORDER_BOX
+    } {}
+    Fl_Choice dash {
+      label Dash open
+      xywh {65 70 75 25} down_box BORDER_BOX
+    } {}
+    Fl_Choice mark {
+      label Mark open
+      xywh {205 70 75 25} down_box BORDER_BOX
+    } {}
+    Fl_Button {} {
+      label Cancel
+      xywh {120 160 75 25}
+    }
+    Fl_Return_Button {} {
+      label Add
+      xywh {205 160 75 25}
+    }
+    Fl_Check_Button fill {
+      label solid
+      xywh {205 95 75 25} down_box DOWN_BOX
+    }
+    Fl_Input text {
+      label Text
+      xywh {65 125 215 25}
+    }
+    Fl_Spinner {} {
+      label Edges
+      xywh {65 100 75 25}
+    }
+  }
+} 
+
+Function {make_images()} {open
+} {
+  Fl_Window {} {open
+    xywh {507 371 210 190} type Double visible
+  } {
+    Fl_Button {} {selected
+      image {new_icon/media-playback-pause.png} xywh {5 5 25 25}
+    }
+    Fl_Button {} {
+      xywh {30 5 25 25}
+    }
+    Fl_Button {} {
+      xywh {55 5 25 25}
+    }
+    Fl_Button {} {
+      xywh {80 5 25 25}
+    }
+    Fl_Button {} {
+      xywh {105 5 25 25}
+    }
+    Fl_Button {} {
+      xywh {130 5 25 25}
+    }
+    Fl_Button {} {
+      xywh {155 5 25 25}
+    }
+    Fl_Button {} {
+      xywh {180 5 25 25}
+    }
+    Fl_Button {} {
+      xywh {5 30 25 25}
+    }
+    Fl_Button {} {
+      xywh {30 30 25 25}
+    }
+    Fl_Button {} {
+      xywh {55 30 25 25}
+    }
+    Fl_Button {} {
+      xywh {80 30 25 25}
+    }
+    Fl_Button {} {
+      xywh {105 30 25 25}
+    }
+    Fl_Button {} {
+      xywh {130 30 25 25}
+    }
+    Fl_Button {} {
+      xywh {155 30 25 25}
+    }
+    Fl_Button {} {
+      xywh {180 30 25 25}
+    }
+    Fl_Button {} {
+      xywh {5 55 25 25}
+    }
+    Fl_Button {} {
+      xywh {30 55 25 25}
+    }
+    Fl_Button {} {
+      xywh {55 55 25 25}
+    }
+    Fl_Button {} {
+      xywh {80 55 25 25}
+    }
+    Fl_Button {} {
+      xywh {105 55 25 25}
+    }
+    Fl_Button {} {
+      xywh {130 55 25 25}
+    }
+    Fl_Button {} {
+      xywh {155 55 25 25}
+    }
+    Fl_Button {} {
+      xywh {180 55 25 25}
+    }
+    Fl_Button {} {
+      xywh {5 80 25 25}
+    }
+    Fl_Button {} {
+      xywh {30 80 25 25}
+    }
+    Fl_Button {} {
+      xywh {55 80 25 25}
+    }
+    Fl_Button {} {
+      xywh {80 80 25 25}
+    }
+    Fl_Button {} {
+      xywh {105 80 25 25}
+    }
+    Fl_Button {} {
+      xywh {130 80 25 25}
+    }
+    Fl_Button {} {
+      xywh {155 80 25 25}
+    }
+    Fl_Button {} {
+      xywh {180 80 25 25}
+    }
+    Fl_Button {} {
+      xywh {5 105 25 25}
+    }
+    Fl_Button {} {
+      xywh {30 105 25 25}
+    }
+    Fl_Button {} {
+      xywh {55 105 25 25}
+    }
+    Fl_Button {} {
+      xywh {80 105 25 25}
+    }
+    Fl_Button {} {
+      xywh {105 105 25 25}
+    }
+    Fl_Button {} {
+      xywh {130 105 25 25}
+    }
+    Fl_Button {} {
+      xywh {155 105 25 25}
+    }
+    Fl_Button {} {
+      xywh {180 105 25 25}
+    }
+    Fl_Button {} {
+      xywh {5 130 25 25}
+    }
+    Fl_Button {} {
+      xywh {30 130 25 25}
+    }
+    Fl_Button {} {
+      xywh {55 130 25 25}
+    }
+    Fl_Button {} {
+      xywh {80 130 25 25}
+    }
+    Fl_Button {} {
+      xywh {105 130 25 25}
+    }
+    Fl_Button {} {
+      xywh {130 130 25 25}
+    }
+    Fl_Button {} {
+      xywh {155 130 25 25}
+    }
+    Fl_Button {} {
+      xywh {180 130 25 25}
+    }
+    Fl_Output {} {
+      label Name
+      xywh {50 160 75 25}
+    }
+    Fl_Button {} {
+      label Close
+      xywh {130 160 75 25}
+    }
+  }
+} 
diff --git a/mgllab/grid.cpp b/mgllab/grid.cpp
new file mode 100644 (file)
index 0000000..cc82b24
--- /dev/null
@@ -0,0 +1,137 @@
+/* grid.cpp is part of UDAV
+ * 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
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+#include <FL/Fl.H>
+#include <FL/Fl_Window.H>
+#include <FL/Fl_Int_Input.H>
+#include <FL/Fl_Value_Slider.H>
+#include <FL/fl_draw.H>
+#include "mgllab.h"
+//-----------------------------------------------------------------------------
+Fl_Callback input_cb;
+//-----------------------------------------------------------------------------
+void input_cb(Fl_Widget*, void* v)     { ((Fl_Data_Table*)v)->set_value(); }
+//-----------------------------------------------------------------------------
+Fl_Data_Table::Fl_Data_Table(int x, int y, int w, int h, const char *l) : Fl_Table(x,y,w,h,l)
+{
+       callback(&event_callback, (void*)this);
+       input = new Fl_Input(w/2,h/2,0,0);
+       input->hide();
+       input->callback(input_cb, (void*)this);
+       input->when(FL_WHEN_ENTER_KEY_ALWAYS);
+       input->maximum_size(16);
+       nx=ny=sl = 0;   row=col=-1;     data = NULL;
+//     (new Fl_Box(9999,9999,0,0))->hide();  // HACK: prevent flickering in Fl_Scroll
+       end();
+}
+//-----------------------------------------------------------------------------
+// Handle drawing all cells in table
+void Fl_Data_Table::draw_cell(TableContext context, int R, int C, int X, int Y, int W, int H)
+{
+       static char s[64];
+       fl_push_clip(X, Y, W, H);
+       switch ( context )
+       {
+       case CONTEXT_COL_HEADER:
+               fl_draw_box(FL_THIN_UP_BOX, X, Y, W, H, col_header_color());
+               fl_font(FL_HELVETICA | FL_BOLD, 14);
+               fl_color(FL_BLACK);             snprintf(s,32,"%d",C);
+               fl_draw(s, X, Y, W, H, FL_ALIGN_CENTER);
+               break;
+       case CONTEXT_ROW_HEADER:
+               fl_draw_box(FL_THIN_UP_BOX, X, Y, W, H, col_header_color());
+               fl_font(FL_HELVETICA | FL_BOLD, 14);
+               fl_color(FL_BLACK);             snprintf(s,32,"%d",R);
+               fl_draw(s, X, Y, W, H, FL_ALIGN_CENTER);
+               break;
+       case CONTEXT_CELL:
+           if (R == row && C == col && input->visible())       break;
+               fl_draw_box(FL_THIN_DOWN_BOX, X, Y, W, H, FL_WHITE);
+               fl_pop_clip();
+               fl_push_clip(X+3, Y+3, W-6, H-6);
+               fl_font(FL_HELVETICA, 14);
+               if(mgl_isnan(data->v(C,R,sl)))  strcpy(s,"nan");
+               else if(mgl_isbad(data->v(C,R,sl)))     strcpy(s,data->v(C,R,sl)>0?"inf":"-inf");
+               else    mgl_strncpy(s,mgl_str_num(data->vc(C,R,sl)).c_str(),64);
+               {       dual vc = data->vc(C,R,sl);
+                       mreal v = data->v(C,R,sl);
+                       std::vector<mreal> vn;
+                       if(C>0) vn.push_back(data->v(C-1,R,sl));
+                       if(R>0) vn.push_back(data->v(C,R-1,sl));
+                       if(C<data->GetNx()-1)   vn.push_back(data->v(C+1,R,sl));
+                       if(R<data->GetNy()-1)   vn.push_back(data->v(C,R+1,sl));
+                       bool v1=true, v2=true;
+                       for(size_t i=0;i<vn.size();i++) {       if(vn[i]<=v)    v1=false;       if(vn[i]>=v)    v2=false;       }
+                       if(v2)  fl_color(FL_MAGENTA);
+                       else if(v1)     fl_color(FL_CYAN);
+                       else if(real(vc)>0)             fl_color(FL_RED);
+                       else if(real(vc)<0)     fl_color(FL_BLUE);
+                       else if(imag(vc)>0)     fl_color(FL_DARK_MAGENTA);
+                       else if(imag(vc)<0)     fl_color(FL_DARK_CYAN);
+                       else    fl_color(FL_BLACK);     }
+               fl_draw(s, X+3, Y+3, W-6, H-6, FL_ALIGN_RIGHT);
+               break;
+       case CONTEXT_RC_RESIZE:
+               if (!input->visible()) break;
+               find_cell(CONTEXT_TABLE, row, col, X, Y, W, H);
+               if (X!=input->x() || Y!=input->y() || W!=input->w() || H!=input->h())
+                       input->resize(X,Y,W,H);
+               break;
+       default:        break;
+       }
+       fl_pop_clip();
+}
+//-----------------------------------------------------------------------------
+void Fl_Data_Table::cell_click()
+{
+    int R = callback_row(), C = callback_col();
+    TableContext context = callback_context();
+
+    if(context==CONTEXT_CELL)
+       {
+               if (input->visible())   set_value();
+               row = R;        col = C;
+               int XX,YY,WW,HH;
+               find_cell(CONTEXT_CELL, R, C, XX, YY, WW, HH);
+               input->resize(XX,YY,WW,HH);
+               std::string s;
+               if(mgl_isnan(data->v(C,R,sl)))  s = "nan";
+               else if(mgl_isbad(data->v(C,R,sl)))     s = data->v(C,R,sl)>0?"inf":"-inf";
+               else    s = mgl_str_num(data->vc(C,R,sl));
+               input->value(s.c_str());        input->show();
+               input->take_focus();
+       }
+}
+//-----------------------------------------------------------------------------
+void Fl_Data_Table::set_value()
+{
+       const char *s = input->value();
+       if(s[0]==0 || !strcmp(s,"nan")) data->set_v(NAN, col,row,sl);
+       else if(!strcmp(s,"inf"))       data->set_v(INFINITY, col,row,sl);
+       else if(!strcmp(s,"-inf"))      data->set_v(-INFINITY, col,row,sl);
+       else
+       {
+               dual v = mgl_atoc(s,true);
+               if(imag(v)==0)  data->set_v(real(v), col,row,sl);
+               else
+               {
+                       HADT c = dynamic_cast<HADT>(data);
+                       if(c)   c->a[col+c->nx*(row+c->ny*sl)] = v;
+                       else    data->set_v(abs(v),col,row,sl);
+               }
+       }
+}
+//-----------------------------------------------------------------------------
diff --git a/mgllab/help.cpp b/mgllab/help.cpp
new file mode 100644 (file)
index 0000000..ad1e53c
--- /dev/null
@@ -0,0 +1,490 @@
+/* help.cpp is part of UDAV\r
+ * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>\r
+ *\r
+ * This program is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Library General Public License\r
+ * as published by the Free Software Foundation\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
+ */\r
+#include "mgllab.h"\r
+#include "../widgets/image.h"\r
+#include <ctype.h>\r
+#include <FL/Fl_Select_Browser.H>\r
+//-----------------------------------------------------------------------------\r
+void help_cb(Fl_Widget*, void*v)\r
+{\r
+       ScriptWindow* e = (ScriptWindow*)v;\r
+       int cur = e->editor->insert_position(), br=0;\r
+       int beg = textbuf->line_start(cur);\r
+       const char *s = textbuf->text();\r
+       for(int i=beg;i<cur;i++)\r
+       {\r
+               if(strchr("({[",s[i]))  br++;\r
+               if(strchr(")}]",s[i]))  br--;\r
+               if(br==0 && s[i]==':' && i+1<cur)       beg=i+1;\r
+       }\r
+       for(br=beg;s[br]>' ' && s[br]!=':';br++);\r
+       std::string cmd(s+beg,br-beg);\r
+       e->link_cmd->value(cmd.c_str());\r
+       static std::string str;\r
+       str = helpname+cmd;\r
+       e->hd->load(str.c_str());\r
+       if(e->rtab)     e->rtab->value(e->ghelp);\r
+}\r
+//-----------------------------------------------------------------------------\r
+void link_cb(Fl_Widget*, void*v)\r
+{\r
+       ScriptWindow* e = (ScriptWindow*)v;\r
+       const char *s = e->link_cmd->value();\r
+       if(!s)  s="Examples";\r
+       static std::string str;\r
+       str = helpname+s;\r
+       e->hd->load(str.c_str());\r
+       if(e->rtab)     e->rtab->value(e->ghelp);\r
+}\r
+//-----------------------------------------------------------------------------\r
+void example_cb(Fl_Widget*, void*v)\r
+{\r
+       ScriptWindow* e = (ScriptWindow*)v;\r
+       static std::string str = helpname+"Examples";\r
+       e->hd->load(str.c_str());       e->rtab->value(e->ghelp);\r
+       if(e->rtab)     e->rtab->value(e->ghelp);\r
+}\r
+//-----------------------------------------------------------------------------\r
+void help_in_cb(Fl_Widget*, void*v)\r
+{\r
+       ScriptWindow* e = (ScriptWindow*)v;\r
+       e->hd->textsize(e->hd->textsize()+1);\r
+}\r
+//-----------------------------------------------------------------------------\r
+void help_out_cb(Fl_Widget*, void*v)\r
+{\r
+       ScriptWindow* e = (ScriptWindow*)v;\r
+       e->hd->textsize(e->hd->textsize()-1);\r
+}\r
+//-----------------------------------------------------------------------------\r
+#include "xpm/udav.xpm"\r
+void about_cb(Fl_Widget*, void*)\r
+{\r
+       static char s[128];\r
+       snprintf(s,128,_("mgllab v. 2.%g\n(c) Alexey Balakin, 2017\nhttp://mathgl.sf.net/"), MGL_VER2);\r
+       Fl_Double_Window* w = new Fl_Double_Window(355, 130, "About UDAV");\r
+       Fl_Box* o = new Fl_Box(10, 15, 65, 65);\r
+       o->box(FL_UP_BOX);      o->color(55);   o->image(new Fl_Pixmap(udav_xpm));\r
+       o = new Fl_Box(85, 15, 260, 65);        o->label(s);\r
+       Fl_Button *b = new Fl_Return_Button(255, 90, 90, 30, "Close");\r
+       b->callback(close_dlg_cb,w);\r
+       w->end();       w->set_modal(); w->show();\r
+}\r
+//-----------------------------------------------------------------------------\r
+#include "xpm/zoom-out.xpm"\r
+#include "xpm/zoom-in.xpm"\r
+#include "xpm/help-faq.xpm"\r
+Fl_Widget *add_help(ScriptWindow *w)\r
+{\r
+       Fl_Window *w1=new Fl_Window(300,30,630,430,0);\r
+       Fl_Group *g = new Fl_Group(0,0,290,30);\r
+       Fl_Button *o;\r
+\r
+       w->link_cmd = new Fl_Input(0,1,150,25);\r
+       w->link_cmd->when(FL_WHEN_CHANGED);\r
+       w->link_cmd->callback(link_cb,w);\r
+\r
+       o = new Fl_Button(155, 1, 25, 25);      o->tooltip(_("MGL samples and hints"));\r
+       o->image(new Fl_Pixmap(help_faq_xpm));  o->callback(example_cb,w);\r
+       o = new Fl_Button(180, 1, 25, 25);      o->tooltip(_("Increase font size"));\r
+       o->image(new Fl_Pixmap(zoom_in_xpm));   o->callback(help_in_cb,w);\r
+       o = new Fl_Button(205, 1, 25, 25);      o->tooltip(_("Decrease font size"));\r
+       o->image(new Fl_Pixmap(zoom_out_xpm));  o->callback(help_out_cb,w);\r
+\r
+       g->end();       g->resizable(0);\r
+\r
+       w->hd = new Fl_Help_View(0,28,630,400);\r
+       w1->end();      link_cb(w,w);\r
+       w1->resizable(w->hd);   return w1;\r
+}\r
+//-----------------------------------------------------------------------------\r
+void mem_dlg_cb0(Fl_Widget *, void *v)\r
+{      ((ScriptWindow*)v)->mem_pressed(0);     }\r
+//-----------------------------------------------------------------------------\r
+void mem_dlg_cb1(Fl_Widget *, void *v)\r
+{      ((ScriptWindow*)v)->mem_pressed(1);     }\r
+//-----------------------------------------------------------------------------\r
+void mem_dlg_cb2(Fl_Widget *, void *v)\r
+{      ((ScriptWindow*)v)->mem_pressed(2);     }\r
+//-----------------------------------------------------------------------------\r
+void mem_dlg_cb3(Fl_Widget *, void *v)\r
+{      ((ScriptWindow*)v)->mem_pressed(3);     }\r
+//-----------------------------------------------------------------------------\r
+void mem_dlg_cb4(Fl_Widget *, void *v)\r
+{      ((ScriptWindow*)v)->mem_pressed(4);     }\r
+//-----------------------------------------------------------------------------\r
+void mem_update_cb(Fl_Widget *, void *v)\r
+{      ((ScriptWindow*)v)->mem_init(); }\r
+//-----------------------------------------------------------------------------\r
+void delete_all_cb(Fl_Widget *, void *v)\r
+{\r
+       if(fl_choice(_("Are you sure that you want to delete ALL data arrays?"), _("Yes"), _("No"), NULL) == 0)\r
+       {       Parse->DeleteAll();     ((ScriptWindow*)v)->mem_init(); }\r
+}\r
+//-----------------------------------------------------------------------------\r
+Fl_Widget *add_mem(ScriptWindow *w)\r
+{\r
+       static int widths[] = {220,205,0};\r
+       Fl_Button *o;\r
+       Fl_Box *b;\r
+       Fl_Window *wnd = new Fl_Window(300,30,630,430,0);\r
+\r
+       b = new Fl_Box(0, 10, 630, 25, _("Existing data arrays"));      b->labeltype(FL_ENGRAVED_LABEL);\r
+       b = new Fl_Box(0, 35, 220, 25, _("name"));\r
+       b->box(FL_THIN_UP_BOX); b->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE);\r
+       b = new Fl_Box(220, 35, 205, 25, _("dimensions"));\r
+       b->box(FL_THIN_UP_BOX); b->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE);\r
+       b = new Fl_Box(425, 35, 205, 25, _("mem. usage"));\r
+       b->box(FL_THIN_UP_BOX); b->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE);\r
+\r
+       w->var = new Fl_Select_Browser(0, 60, 630, 335);        w->var->column_char('\t');\r
+       w->var->align(FL_ALIGN_TOP);    w->var->column_widths(widths);\r
+       w->var->tooltip(_("List of available data."));\r
+\r
+       o = new Fl_Button(20, 400, 90, 25, _(" Edit")); o->callback(mem_dlg_cb0,w);\r
+       o->image(img_grid);     o->align(FL_ALIGN_IMAGE_NEXT_TO_TEXT);\r
+       o->tooltip(_("Open table with selected data for editing."));\r
+       o = new Fl_Button(120, 400, 90, 25, _(" Info"));        o->callback(mem_dlg_cb1,w);\r
+       o->image(img_info);     o->align(FL_ALIGN_IMAGE_NEXT_TO_TEXT);\r
+       o->tooltip(_("Data information and preview."));\r
+       o = new Fl_Button(220, 400, 90, 25, _(" Delete"));      o->callback(mem_dlg_cb2,w);\r
+       o->image(img_delete);   o->align(FL_ALIGN_IMAGE_NEXT_TO_TEXT);\r
+       o->tooltip(_("Delete selected data."));\r
+       o = new Fl_Button(320, 400, 90, 25, _(" New")); o->callback(mem_dlg_cb3,w);\r
+       o->image(img_new);      o->align(FL_ALIGN_IMAGE_NEXT_TO_TEXT);\r
+       o->tooltip(_("Open dialog for new data creation."));\r
+       o = new Fl_Button(420, 400, 90, 25, _(" Save"));        o->callback(mem_dlg_cb4,w);\r
+       o->image(img_save);     o->align(FL_ALIGN_IMAGE_NEXT_TO_TEXT);\r
+       o->tooltip(_("Save selected data to file."));\r
+//     o = new Fl_Button(420, 400, 90, 25, _(" Refresh"));     o->callback(mem_update_cb,w);\r
+//     o->image(img_update);   o->align(FL_ALIGN_IMAGE_NEXT_TO_TEXT);\r
+//     o->tooltip(_("Refresh list of variables."));\r
+       o = new Fl_Button(520, 400, 90, 25, _(" Del.all"));     o->callback(delete_all_cb,w);\r
+       o->image(img_clear);    o->align(FL_ALIGN_IMAGE_NEXT_TO_TEXT);\r
+       o->tooltip(_("Delete @b all@. data arrays."));\r
+       wnd->end();     wnd->resizable(w->var); return wnd;\r
+}\r
+//-----------------------------------------------------------------------------\r
+void ScriptWindow::mem_init()\r
+{\r
+       char str[128];\r
+       var->clear();\r
+       for(long i=0;i<Parse->GetNumVar();i++)\r
+       {\r
+               mglDataA *v = Parse->GetVar(i);\r
+               if(v && !v->temp)\r
+               {\r
+                       long sv = 0;\r
+                       if(dynamic_cast<mglData*>(v))   sv = v->GetNN()*sizeof(mreal)+sizeof(mglData);\r
+                       else if(dynamic_cast<mglDataC*>(v))     sv = v->GetNN()*sizeof(dual)+sizeof(mglDataC);\r
+                       else if(dynamic_cast<mglDataV*>(v))     sv = sizeof(mglDataV);\r
+                       else if(dynamic_cast<mglDataW*>(v))     sv = sizeof(mglDataW);\r
+                       else if(dynamic_cast<mglDataF*>(v))     sv = sizeof(mglDataF);\r
+                       else if(dynamic_cast<mglDataR*>(v))     sv = sizeof(mglDataR);\r
+                       else if(dynamic_cast<mglDataT*>(v))     sv = sizeof(mglDataT);\r
+                       const char *ext[]={_("unknown"),"b","Kb","Mb","Gb","Tb","Pb","Eb","Zb","Yb"}, *e;\r
+                       if(sv==0)       e = ext[0];\r
+#if MGL_SIZEOF_LONG>4\r
+//                     else if((sv>>80L)>0)    {       e=ext[9];       sv = sv>>80L;   }\r
+//                     else if((sv>>70L)>0)    {       e=ext[8];       sv = sv>>70L;   }\r
+                       else if((sv>>60L)>0)    {       e=ext[7];       sv = sv>>60L;   }\r
+                       else if((sv>>50L)>0)    {       e=ext[6];       sv = sv>>50L;   }\r
+                       else if((sv>>40L)>0)    {       e=ext[5];       sv = sv>>40L;   }\r
+#endif\r
+                       else if((sv>>30L)>0)    {       e=ext[4];       sv = sv>>30L;   }\r
+                       else if((sv>>20L)>0)    {       e=ext[3];       sv = sv>>20L;   }\r
+                       else if((sv>>10L)>0)    {       e=ext[2];       sv = sv>>10L;   }\r
+                       else    e=ext[1];\r
+                       snprintf(str,128,"%ls\t%ld*%ld*%ld\t%ld %s", v->Name(), v->GetNx(), v->GetNy(), v->GetNz(), sv, e);\r
+                       var->add(str,v);\r
+               }\r
+       }\r
+       for(long i=0;i<Parse->GetNumConst();i++)\r
+       {\r
+               mglNum *v = Parse->GetConst(i);\r
+               snprintf(str,128,"%ls\t%s\t%zu b", v->s.w, ("const="+mgl_str_num(v->c)).c_str(), sizeof(mglNum));\r
+               var->add(str,v);\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
+void ScriptWindow::mem_pressed(int kind)\r
+{\r
+       TableWindow *w;\r
+       int ind = var->value();\r
+       mglDataA *v = (mglDataA *)var->data(ind);\r
+       const char *s = var->text(ind);\r
+       bool dat = s && !strstr(s,"\tconst");\r
+       if(!v && kind!=3)       return;\r
+       if(dat && kind==0)\r
+       {\r
+               w = (TableWindow *)v->o;\r
+               if(!w)  w = new TableWindow(this);\r
+               w->update(v);   w->show();\r
+       }\r
+       else if(dat && kind==1) info_dlg_cb(v);\r
+       else if(dat && kind==2) Parse->DeleteVar(v->Name());\r
+       else if(kind==3)\r
+       {\r
+               const char *name = fl_input(_("Enter name for new variable"),"dat");\r
+               if(!name)       return;\r
+               v = Parse->AddVar(name);\r
+               w = v->o? (TableWindow*)v->o:new TableWindow(this);\r
+               w->update(v);   w->show();\r
+       }\r
+       else if(dat && kind==4)\r
+       {\r
+               const char *newfile = mgl_file_chooser(_("Save Data?"),\r
+                               _("DAT Files \t*.{dat,csv}\nHDF Files \t*.{h5,hdf}"), true);\r
+               if(newfile)\r
+               {\r
+                       const char *ext = fl_filename_ext(newfile);\r
+                       if(!strcmp(ext,"h5") || !strcmp(ext,"hdf"))     // this is HDF file\r
+                       {\r
+                               std::string name = wcstombs(v->Name());\r
+                               v->SaveHDF(newfile, name.c_str());\r
+                       }\r
+                       else    v->Save(newfile);\r
+               }\r
+       }\r
+       mem_init();\r
+}\r
+//-----------------------------------------------------------------------------\r
+const char *hints[] = {\r
+       _("You can shift axis range by pressing middle button and moving mouse. Also, you can zoom in/out axis range by using mouse wheel."),\r
+       _("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."),\r
+       _("You may quickly draw the data from file. Just use: mgllab 'filename.dat' in command line."),\r
+       _("You can copy the current image to clipboard by pressing Ctrl-Shift-C. Later you can paste it directly into yours document or presentation."),\r
+       _("You can export image into a set of format (EPS, SVG, PNG, JPEG) by pressing right mouse button inside image and selecting 'Export as ...'."),\r
+       _("You can setup colors for script highlighting in Property dialog. Just select menu item 'Settings/Properties'."),\r
+       _("You can save the parameter of animation inside MGL script by using comment started from '##a ' or '##c ' for loops."),\r
+       _("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). "),\r
+       _("You can put several plots in the same image by help of commands 'subplot' or 'inplot'."),\r
+       _("All indexes (of data arrays, subplots and so on) are always start from 0."),\r
+       _("You can edit MGL file in any text editor. Also you can run it in console by help of commands: mglconv, mglview."),\r
+       _("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."),\r
+       _("You can use command 'stop' for terminating script parsing. It is useful if you don't want to execute a part of script."),\r
+       _("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."),\r
+       _("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."),\r
+       _("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."),\r
+       _("You can easily insert file or folder names, last fitted formula or numerical value of selection by using menu Edit|Insert."),\r
+       _("The special dialog (Edit|Insert|New Command) help you select the command, fill its arguments and put it into the script."),\r
+       _("You can put several plotting commands in the same line or in separate function, for highlighting all of them simultaneously."),\r
+       NULL\r
+};\r
+//-----------------------------------------------------------------------------\r
+void cb_hint_prev(Fl_Widget*,void*);\r
+void cb_hint_next(Fl_Widget*,void*);\r
+class HintDlg : public GeneralDlg\r
+{\r
+       Fl_Help_View *hint;\r
+       Fl_Check_Button *start;\r
+       int cur;\r
+public:\r
+       HintDlg() : GeneralDlg()\r
+       {\r
+               Fl_Button *o;\r
+               w = new Fl_Double_Window(280, 265);     cur=0;\r
+               hint = new Fl_Help_View(10, 10, 260, 185);\r
+               hint->value(hints[0]);\r
+               start = new Fl_Check_Button(10, 200, 260, 25, _("Show hint on startup"));\r
+               o = new Fl_Button(10, 230, 80, 25, _("@<-  Prev"));\r
+               o->callback(cb_hint_prev);\r
+               o = new Fl_Button(100, 230, 80, 25, _("Next @->"));\r
+               o->callback(cb_hint_next);\r
+               o = new Fl_Return_Button(190, 230, 80, 25, _("Close"));\r
+               o->callback(cb_dlg_ok,this);\r
+               w->end();\r
+       }\r
+       void init()\r
+       {       int sh; pref.get("show_hint",sh,1);     start->value(sh);       }\r
+       void cb_ok()\r
+       {       pref.set("show_hint",start->value());   hide(); }\r
+       void prev()\r
+       {\r
+               int n=0;        while(hints[n]) n++;\r
+               cur = cur>0?cur-1:n-1;\r
+               hint->value(hints[cur]);\r
+       }\r
+       void next()\r
+       {\r
+               int n=0;        while(hints[n]) n++;\r
+               cur = cur<n-1?cur+1:0;\r
+               hint->value(hints[cur]);\r
+       }\r
+} hint_dlg;\r
+//-----------------------------------------------------------------------------\r
+void cb_hint_prev(Fl_Widget*,void*)    {       hint_dlg.prev();        }\r
+void cb_hint_next(Fl_Widget*,void*)    {       hint_dlg.next();        }\r
+//-----------------------------------------------------------------------------\r
+void hint_dlg_cb(Fl_Widget*,void *)    {       hint_dlg.show();        }\r
+//-----------------------------------------------------------------------------\r
+void cb_info_prev(Fl_Widget*,void*);\r
+void cb_info_next(Fl_Widget*,void*);\r
+void cb_info_1d(Fl_Widget*,void*);\r
+void cb_info_2d(Fl_Widget*,void*);\r
+void cb_info_3d(Fl_Widget*,void*);\r
+class InfoDlg : public GeneralDlg\r
+{\r
+       Fl_Multiline_Output *out;\r
+       Fl_MathGL *gr;\r
+       long nx, ny, nz;\r
+       long sl;\r
+       int plot;\r
+       std::string name;\r
+public:\r
+       InfoDlg() : GeneralDlg()\r
+       {\r
+               nx=ny=nz=sl=plot=0;\r
+               Fl_Button *o;\r
+               w = new Fl_Double_Window(420, 530);\r
+               out = new Fl_Multiline_Output(10, 25, 400, 150, _("Information"));\r
+               out->align(FL_ALIGN_TOP_LEFT);\r
+               gr = new Fl_MathGL(10, 220, 400, 300);  gr->box(FL_ENGRAVED_BOX);       gr->use_pthr = false;\r
+               mgl_set_size(gr->get_graph(),400,300);\r
+               o = new Fl_Button(10, 185, 25, 25, "@<-");\r
+               o->callback(cb_info_prev,this);\r
+               o = new Fl_Button(40, 185, 75, 25, _("1D view"));\r
+               o->callback(cb_info_1d,this);\r
+               o = new Fl_Button(120, 185, 75, 25, _("2D view"));\r
+               o->callback(cb_info_2d,this);\r
+               o = new Fl_Button(200, 185, 75, 25, _("3D view"));\r
+               o->callback(cb_info_3d,this);\r
+               o = new Fl_Button(280, 185, 25, 25, "@->");\r
+               o->callback(cb_info_next,this);\r
+               o = new Fl_Return_Button(335, 185, 75, 25, _("Close"));\r
+               o->callback(cb_dlg_cancel,this);\r
+               w->set_modal(); w->end();\r
+       }\r
+       void update()\r
+       {\r
+               if(!dat)        return;\r
+               std::string script;\r
+               char buf[32];\r
+               switch(plot)\r
+               {\r
+               case 0:\r
+                       if(sl<0)        sl=ny-1;\r
+                       if(sl>=ny)      sl=0;\r
+                       snprintf(buf,31,"%ld",sl);\r
+                       script = "subplot 1 1 0 '<_':xrange 0 1:yrange " + name + ":plot " + name + "(:," + buf + "):axis:box:text 1 1 'sl=" + buf + "' 'r:aR'";\r
+                       break;\r
+               case 1:\r
+                       if(sl<0)        sl=nz-1;\r
+                       if(sl>=nz)      sl=0;\r
+                       snprintf(buf,31,"%ld",sl);\r
+                       script = "subplot 1 1 0 '':crange " + name + ":dens " + name + "(:,:," + buf + "):box:text 1 1 'sl=" + buf + "' 'r:aR'";\r
+                       break;\r
+               case 2:\r
+                       script = "rotate 40 60:light on:crange " + name + ":surf3 " + name + ":box";\r
+                       break;\r
+               }\r
+               script = "clf:"+script;\r
+               mgl_set_def_param(gr->get_graph());\r
+               mgl_parse_text(gr->get_graph(), Parse->Self(), script.c_str());\r
+               gr->update();\r
+       }\r
+       void prev()             {       sl--;   update();       }\r
+       void next()             {       sl++;   update();       }\r
+       void plot_1d()  {       plot=0; update();       }\r
+       void plot_2d()  {       if(ny>1)        {       plot=1; update();       }       }\r
+       void plot_3d()  {       if(nz>1)        {       plot=2; update();       }       }\r
+       void init()\r
+       {\r
+               nx=ny=nz=sl=plot=0;\r
+               if(dat)\r
+               {\r
+                       nx=dat->GetNx();        ny=dat->GetNy();        nz=dat->GetNz();\r
+                       result = dat->PrintInfo();      out->value(result.c_str());\r
+                       name = wcstombs(dat->Name());\r
+                       if(nz>1)                plot_3d();\r
+                       else if(ny>1)   plot_2d();\r
+                       else                    plot_1d();\r
+               }\r
+       }\r
+} info_dlg;\r
+//-----------------------------------------------------------------------------\r
+void info_dlg_cb(mglDataA *d)\r
+{      if(d)   {       info_dlg.dat=d; info_dlg.show();        }       }\r
+//-----------------------------------------------------------------------------\r
+void cb_info_prev(Fl_Widget*,void*)    {       info_dlg.prev();        }\r
+void cb_info_next(Fl_Widget*,void*)    {       info_dlg.next();        }\r
+void cb_info_1d(Fl_Widget*,void*)      {       info_dlg.plot_1d();     }\r
+void cb_info_2d(Fl_Widget*,void*)      {       info_dlg.plot_2d();     }\r
+void cb_info_3d(Fl_Widget*,void*)      {       info_dlg.plot_3d();     }\r
+//-----------------------------------------------------------------------------\r
+class IconListDlg : public GeneralDlg\r
+{\r
+public:\r
+       IconListDlg() : GeneralDlg()\r
+       {\r
+               Fl_Button* o;\r
+               w = new Fl_Double_Window(210, 190, "mgllab icons");\r
+               o = new Fl_Button(5, 5, 25, 25);        o->image(img_load);     o->tooltip("img_load");\r
+               o = new Fl_Button(30, 5, 25, 25);       o->image(img_save);     o->tooltip("img_save");\r
+               o = new Fl_Button(55, 5, 25, 25);       o->image(img_calc);     o->tooltip("img_calc");\r
+               o = new Fl_Button(80, 5, 25, 25);       o->image(img_undo);     o->tooltip("img_undo");\r
+               o = new Fl_Button(105, 5, 25, 25);      o->image(img_redo);     o->tooltip("img_redo");\r
+               o = new Fl_Button(130, 5, 25, 25);      o->image(img_copy);     o->tooltip("img_copy");\r
+               o = new Fl_Button(155, 5, 25, 25);      o->image(img_paste);o->tooltip("img_paste");\r
+               o = new Fl_Button(180, 5, 25, 25);      o->image(img_find);     o->tooltip("img_find");\r
+               o = new Fl_Button(5, 30, 25, 25);       o->image(img_prop);     o->tooltip("img_prop");\r
+               o = new Fl_Button(30, 30, 25, 25);      o->image(img_alpha);o->tooltip("img_alpha");\r
+               o = new Fl_Button(55, 30, 25, 25);      o->image(img_light);o->tooltip("img_light");\r
+               o = new Fl_Button(80, 30, 25, 25);      o->image(img_grid);     o->tooltip("img_grid");\r
+               o = new Fl_Button(105, 30, 25, 25);     o->image(img_move);     o->tooltip("img_move");\r
+               o = new Fl_Button(130, 30, 25, 25);     o->image(img_orig);     o->tooltip("img_orig");\r
+               o = new Fl_Button(155, 30, 25, 25);     o->image(img_update);   o->tooltip("img_update");\r
+               o = new Fl_Button(180, 30, 25, 25);     o->image(img_stop);     o->tooltip("img_stop");\r
+               o = new Fl_Button(5, 55, 25, 25);       o->image(img_insert);   o->tooltip("img_insert");\r
+               o = new Fl_Button(30, 55, 25, 25);      o->image(img_print);o->tooltip("img_print");\r
+               o = new Fl_Button(55, 55, 25, 25);      o->image(img_goL);      o->tooltip("img_goL");\r
+               o = new Fl_Button(80, 55, 25, 25);      o->image(img_goU);      o->tooltip("img_goU");\r
+               o = new Fl_Button(105, 55, 25, 25);     o->image(img_zoomIn);   o->tooltip("img_zoomIn");\r
+               o = new Fl_Button(130, 55, 25, 25);     o->image(img_zoomOut);  o->tooltip("img_zoomOut");\r
+               o = new Fl_Button(155, 55, 25, 25);     o->image(img_goD);      o->tooltip("img_goD");\r
+               o = new Fl_Button(180, 55, 25, 25);     o->image(img_goR);      o->tooltip("img_goR");\r
+               o = new Fl_Button(5, 80, 25, 25);       o->image(img_next);     o->tooltip("img_next");\r
+               o = new Fl_Button(30, 80, 25, 25);      o->image(img_play);     o->tooltip("img_play");\r
+               o = new Fl_Button(55, 80, 25, 25);      o->image(img_prev);     o->tooltip("img_prev");\r
+               o = new Fl_Button(80, 80, 25, 25);      o->image(img_plot);     o->tooltip("img_plot");\r
+               o = new Fl_Button(105, 80, 25, 25);     o->image(img_system);   o->tooltip("img_system");\r
+               o = new Fl_Button(130, 80, 25, 25);     o->image(img_info);     o->tooltip("img_info");\r
+               o = new Fl_Button(155, 80, 25, 25);     o->image(img_help);     o->tooltip("img_help");\r
+               o = new Fl_Button(180, 80, 25, 25);     o->image(img_delete);   o->tooltip("img_delete");\r
+               o = new Fl_Button(5, 105, 25, 25);      o->image(img_objectU);  o->tooltip("img_objectU");\r
+               o = new Fl_Button(30, 105, 25, 25);     o->image(img_objectD);  o->tooltip("img_objectD");\r
+               o = new Fl_Button(55, 105, 25, 25);     o->image(img_layer);o->tooltip("img_layer");\r
+               o = new Fl_Button(80, 105, 25, 25);     o->image(img_new);      o->tooltip("img_new");\r
+               o = new Fl_Button(105, 105, 25, 25);o->image(img_clear);o->tooltip("img_clear");\r
+               o = new Fl_Button(130, 105, 25, 25);o->image(img_plus); o->tooltip("img_plus");\r
+               o = new Fl_Button(155, 105, 25, 25);o->image(img_minus);o->tooltip("img_minus");\r
+               o = new Fl_Button(180, 105, 25, 25);o->image(img_fname);o->tooltip("img_fname");\r
+               o = new Fl_Button(5, 130, 25, 25);      o->image(img_curve);o->tooltip("img_curve");\r
+               o = new Fl_Button(30, 130, 25, 25);     o->image(img_svn);      o->tooltip("img_svn");\r
+               o = new Fl_Button(55, 130, 25, 25);     o->image(img_adjust);   o->tooltip("img_adjust");\r
+               o = new Fl_Button(80, 130, 25, 25);     o->image(img_reload);   o->tooltip("img_reload");\r
+               o = new Fl_Button(105, 130, 25, 25);o->image(img_zoom12);       o->tooltip("img_zoom12");\r
+               o = new Fl_Button(130, 130, 25, 25);o->image(img_zoom21);       o->tooltip("img_zoom21");\r
+               o = new Fl_Button(155, 130, 25, 25);o->image(img_pause);        o->tooltip("img_pause");\r
+//             o = new Fl_Button(180, 130, 25, 25);o->image(img_save); o->tooltip("img_save");\r
+               o = new Fl_Button(130, 160, 75, 25, _("Close"));\r
+               o->callback(cb_dlg_cancel,this);\r
+               w->end();\r
+       }\r
+} iconlist;\r
+void iconlist_cb(Fl_Widget*,void*)     {       iconlist.show();        }\r
+//-----------------------------------------------------------------------------\r
diff --git a/mgllab/mathgl.cpp b/mgllab/mathgl.cpp
new file mode 100644 (file)
index 0000000..5b15a91
--- /dev/null
@@ -0,0 +1,454 @@
+/* mathgl.cpp is part of UDAV\r
+ * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>\r
+ *\r
+ * This program is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Library General Public License\r
+ * as published by the Free Software Foundation\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
+ */\r
+#include "mgl2/mgl.h"\r
+#include "mgllab.h"\r
+#include "../widgets/image.h"\r
+//-----------------------------------------------------------------------------\r
+mglParse *Parse=0;\r
+//-----------------------------------------------------------------------------\r
+mreal udav_delay(void *v)\r
+{      return ((Fl_MGL*)v)->delay;     }\r
+void udav_reload(void *v)\r
+{      Parse->RestoreOnce();   ((Fl_MGL*)v)->update(); }\r
+//-----------------------------------------------------------------------------\r
+void udav_next(void *v)        {       ((Fl_MGL*)v)->next_frame();     }\r
+void Fl_MGL::next_frame()\r
+{\r
+       size_t n=anim.size();\r
+       if(n==0 && animate_cb(this))    {       gr->toggle_sshow();     return; }\r
+       n=anim.size();\r
+       cur = (cur+1)%n;\r
+       Parse->AddParam(0,anim[cur].c_str());\r
+       update();\r
+}\r
+//-----------------------------------------------------------------------------\r
+void udav_prev(void *v)        {       ((Fl_MGL*)v)->prev_frame();     }\r
+void Fl_MGL::prev_frame()\r
+{\r
+       size_t n=anim.size();\r
+       if(n==0 && animate_cb(this))    {       gr->toggle_sshow();     return; }\r
+       n=anim.size();\r
+       cur = (cur+n-1)%n;\r
+       Parse->AddParam(0,anim[cur].c_str());\r
+       update();\r
+}\r
+//-----------------------------------------------------------------------------\r
+Fl_MGL::Fl_MGL(Fl_MGLView *GR)\r
+{\r
+       if(!Parse)      Parse = new mglParse;\r
+       Parse->AllowSetSize(true);\r
+       gr = GR;        gr->par = this; e = 0;\r
+       gr->next = udav_next;   gr->delay = udav_delay;\r
+       gr->prev = udav_prev;   gr->reload = udav_reload;\r
+       gr->FMGL->set_draw(this);\r
+       gr->FMGL->set_show_warn(false);\r
+       a1=a2=0;        da=1;   cur=0;  delay=0.5;\r
+}\r
+//-----------------------------------------------------------------------------\r
+Fl_MGL::~Fl_MGL()      {}\r
+//-----------------------------------------------------------------------------\r
+void Fl_MGL::Param(char id, const char *val)\r
+{      Parse->AddParam(id<='9' ? id-'0' : id-'a'+10, val);     }\r
+//-----------------------------------------------------------------------------\r
+void Fl_MGL::Reload()\r
+{\r
+       Parse->RestoreOnce();\r
+       e->graph->update();\r
+}\r
+//-----------------------------------------------------------------------------\r
+void Fl_MGL::Click()\r
+{\r
+       int id = e->graph->FMGL->get_last_id();\r
+       if(id>0)\r
+       {\r
+               Fl_Text_Editor::kf_ctrl_move(FL_Home, e->editor);\r
+               for(int i=0;i<id;i++)   Fl_Text_Editor::kf_down(0, e->editor);\r
+               Fl_Text_Editor::kf_up(0, e->editor);\r
+               Fl::focus(e->editor);\r
+       }\r
+       e->graph->update();\r
+}\r
+//-----------------------------------------------------------------------------\r
+int Fl_MGL::Draw(mglGraph *gr)\r
+{\r
+       if(exec_save)   save_cb(0,e);\r
+       Parse->Execute(gr,script.c_str());\r
+       if(textbuf)\r
+       {\r
+               char *text = textbuf->text();\r
+               if(highlight)   gr->Highlight(e->graph->FMGL->get_last_id());\r
+               Parse->Execute(gr,text);\r
+               free(text);\r
+       }\r
+       // TODO go to line with warning?!!\r
+       message_set(gr->Message(), e);\r
+       if(e && e->rtab)        e->rtab->value(e->gplot);\r
+       return 0;\r
+}\r
+//-----------------------------------------------------------------------------\r
+void Fl_MGL::update()\r
+{\r
+       // NOTE: hint for old style View(). May be I should remove it!\r
+       char *text = textbuf->text();\r
+       if(script.empty() || !text || !strstr(text,"rotate"))\r
+               mgl_rotate(gr->get_graph(),0,0,0);\r
+\r
+       gr->update();\r
+       for(long i=0;i<Parse->GetNumVar();i++)\r
+       {\r
+               mglDataA *v = Parse->GetVar(i);\r
+               if(v && v->o)   ((TableWindow *)v->o)->update(v);\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
+void add_suffix(char *fname, const char *ext)\r
+{\r
+       long n=strlen(fname);\r
+       if(n>4 && fname[n-4]=='.')\r
+       {       fname[n-3]=ext[0];      fname[n-2]=ext[1];      fname[n-1]=ext[2];      }\r
+       else    {       strcat(fname,".");      strcat(fname,ext);      }\r
+}\r
+//-----------------------------------------------------------------------------\r
+class ArgsDlg : public GeneralDlg\r
+{\r
+       Fl_Input *arg[10];\r
+public:\r
+       void cb_ok()\r
+       {\r
+               for(int i=0;i<10;i++)   Parse->AddParam(i,arg[i]->value());\r
+               hide();\r
+       }\r
+       void set(int id, const char *val)\r
+       {\r
+               if(id>=0 && id<10)\r
+               {       arg[id]->value(val);    Parse->AddParam(id,val);        }\r
+       }\r
+       void init()\r
+       {       // NOTE I'm not sure that I need to get current arguments. So keep function empty.\r
+       }\r
+       ArgsDlg() : GeneralDlg()\r
+       {\r
+               w = new Fl_Double_Window(290, 320, _("Set script arguments"));\r
+               arg[1] = new Fl_Input(5, 20, 135, 30, _("String for $1"));\r
+               arg[1]->align(FL_ALIGN_TOP_LEFT);\r
+               arg[2] = new Fl_Input(150, 20, 135, 30, _("String for $2"));\r
+               arg[2]->align(FL_ALIGN_TOP_LEFT);\r
+               arg[3] = new Fl_Input(5, 75, 135, 30, _("String for $3"));\r
+               arg[3]->align(FL_ALIGN_TOP_LEFT);\r
+               arg[4] = new Fl_Input(150, 75, 135, 30, _("String for $4"));\r
+               arg[4]->align(FL_ALIGN_TOP_LEFT);\r
+               arg[5] = new Fl_Input(5, 130, 135, 30, _("String for $5"));\r
+               arg[5]->align(FL_ALIGN_TOP_LEFT);\r
+               arg[6] = new Fl_Input(150, 130, 135, 30, _("String for $6"));\r
+               arg[6]->align(FL_ALIGN_TOP_LEFT);\r
+               arg[7] = new Fl_Input(5, 185, 135, 30, _("String for $7"));\r
+               arg[7]->align(FL_ALIGN_TOP_LEFT);\r
+               arg[8] = new Fl_Input(150, 185, 135, 30, _("String for $8"));\r
+               arg[8]->align(FL_ALIGN_TOP_LEFT);\r
+               arg[9] = new Fl_Input(5, 240, 135, 30, _("String for $9"));\r
+               arg[9]->align(FL_ALIGN_TOP_LEFT);\r
+               arg[0] = new Fl_Input(150, 240, 135, 30, _("String for $0"));\r
+               arg[0]->align(FL_ALIGN_TOP_LEFT);\r
+               Fl_Button* o = new Fl_Button(60, 290, 75, 25, _("Cancel"));\r
+               o->callback(cb_dlg_cancel, this);\r
+               o = new Fl_Return_Button(155, 290, 75, 25, _("Set"));\r
+               o->callback(cb_dlg_ok, this);\r
+               w->set_modal(); w->end();\r
+       }\r
+} args_dlg;\r
+//-----------------------------------------------------------------------------\r
+void args_dlg_cb(Fl_Widget *, void *)  {       args_dlg.show();        }\r
+void argument_set(int id, const char *val)     {       args_dlg.set(id,val);   }\r
+//-----------------------------------------------------------------------------\r
+void cb_anim_put(Fl_Widget *, void *);\r
+void cb_dlg_only(Fl_Widget*,void *v)   {       ((Fl_Round_Button*)v)->setonly();       }\r
+class AnimateDlg : public GeneralDlg\r
+{\r
+public:\r
+       Fl_MGL* dr;\r
+       AnimateDlg() : GeneralDlg()\r
+       {\r
+               w = new Fl_Double_Window(335, 350, _("Animation"));\r
+               new Fl_Box(10, 5, 315, 25, _("Redraw picture for $0 equal to"));\r
+               rt = new Fl_Round_Button(10, 30, 200, 25, _("strings"));\r
+               rt->callback(cb_dlg_only, rt);\r
+               rv = new Fl_Round_Button(220, 30, 105, 25, _("values"));\r
+               rv->callback(cb_dlg_only, rv);\r
+               txt = new Fl_Multiline_Input(10, 60, 200, 250);\r
+               x0 = new Fl_Float_Input(220, 80, 105, 25, _("from"));                   x0->align(FL_ALIGN_TOP_LEFT);\r
+               x1 = new Fl_Float_Input(220, 130, 105, 25, _("to"));                    x1->align(FL_ALIGN_TOP_LEFT);\r
+               dx = new Fl_Float_Input(220, 180, 105, 25, _("with step"));     dx->align(FL_ALIGN_TOP_LEFT);\r
+\r
+               Fl_Button *o;\r
+               o = new Fl_Button(230, 215, 80, 25, _("Cancel"));       o->callback(cb_dlg_cancel, this);\r
+               o = new Fl_Return_Button(230, 250, 80, 25, _("OK"));o->callback(cb_dlg_ok, this);\r
+               save = new Fl_Check_Button(220, 285, 105, 25, _("save slides"));\r
+               save->tooltip(_("Keep slides in memory (faster animation but require more memory)"));\r
+               save->down_box(FL_DOWN_BOX);    save->deactivate();\r
+\r
+               o = new Fl_Button(10, 315, 100, 25, _("Put to script"));        o->callback(cb_anim_put,w);\r
+               dt = new Fl_Float_Input(220, 315, 105, 25, _("Delay (in sec)"));//      dx->align(FL_ALIGN_TOP_LEFT);\r
+               w->end();\r
+       }\r
+       void init()\r
+       {\r
+               if(e)   dr = e->draw;\r
+               if(dr && dr->da*(dr->a2-dr->a1)>0)\r
+               {\r
+                       char buf[128];  rv->setonly();\r
+                       snprintf(buf,127,"%g",dr->a1);  x0->value(buf);\r
+                       snprintf(buf,127,"%g",dr->a2);  x1->value(buf);\r
+                       snprintf(buf,127,"%g",dr->da);  dx->value(buf);\r
+               }\r
+               else if(dr)\r
+               {\r
+                       rt->setonly();\r
+                       std::string str;\r
+                       for(size_t i=0;i<dr->anim.size();i++)\r
+                               str += dr->anim[i]+'\n';\r
+                       txt->value(str.c_str());\r
+               }\r
+       }\r
+       void prepare()\r
+       {\r
+               result.clear();\r
+               if(dr)  dr->anim.clear();\r
+               if(rv->value())\r
+               {\r
+                       const char *s1=x0->value(), *s2=x1->value(), *s3=dx->value();\r
+                       double a1=s1?atof(s1):NAN, a2=s2?atof(s2):NAN, a3=s3?atof(s3):1;\r
+                       if(a3*(a2-a1)>0)\r
+                       {\r
+                               result = result + "##c "+(s1?s1:"nan")+' '+(s2?s2:"nan")+' '+(s3?s3:"1")+'\n';\r
+                               if(dr)\r
+                               {\r
+                                       dr->a1=a1;      dr->a2=a2;      dr->da=a3;\r
+                                       for(double a=a1;a3*(a2-a)>=0;a+=a3)\r
+                                       {\r
+                                               char buf[128];  snprintf(buf,128,"%g",a);\r
+                                               dr->anim.push_back(buf);\r
+                                       }\r
+                               }\r
+                       }\r
+                       else    fl_alert(_("Incompatible loop parameters!"));\r
+               }\r
+               else if(rt->value())\r
+               {\r
+                       const char *s = txt->value();\r
+                       while(s && *s)\r
+                       {\r
+                               const char *j = strchr(s,'\n');\r
+                               size_t len = j?(j-s):strlen(s);\r
+                               std::string val(s,len);\r
+                               if(dr)  dr->anim.push_back(val);\r
+                               result = result+"##a "+val+'\n';\r
+                               s=j?j+1:NULL;\r
+                       }\r
+               }\r
+               else    fl_message(_("No selection. So nothing to do"));\r
+\r
+       }\r
+       void into_script()\r
+       {\r
+               prepare();\r
+               if(e)\r
+               {\r
+                       int p = textbuf->line_start(e->editor->insert_position());\r
+                       textbuf->insert(p, (result+'\n').c_str());\r
+               }\r
+       }\r
+       void cb_ok()\r
+       {\r
+               if(!dr) return;\r
+               prepare();\r
+               const char *s = dt->value();\r
+               if(s && *s)     dr->delay = atof(s);\r
+               hide();\r
+       }\r
+protected:\r
+       bool swap;\r
+       Fl_Round_Button *rt, *rv;\r
+       Fl_Multiline_Input *txt;\r
+       Fl_Float_Input *x0, *x1, *dx, *dt;\r
+       Fl_Check_Button *save;\r
+       void create_dlg();\r
+} animate_dlg;\r
+//-----------------------------------------------------------------------------\r
+void animate_dlg_cb(Fl_Widget *, void *v)\r
+{      animate_dlg.e = (ScriptWindow*)v;       animate_dlg.show();     }\r
+void cb_anim_put(Fl_Widget *, void *)  {       animate_dlg.into_script();      }\r
+//-----------------------------------------------------------------------------\r
+bool animate_cb(Fl_MGL *d)\r
+{      animate_dlg.dr = d;     animate_dlg.show();     return animate_dlg.wait();      }\r
+//-----------------------------------------------------------------------------\r
+void fill_animate(const char *text, Fl_MGL *dr)\r
+{\r
+       char tmp[4]="#$0";\r
+       for(int i=0;i<10;i++)   // first read script arguments (if one)\r
+       {\r
+               tmp[2] = '0'+i;\r
+               const char *str=strstr(text,tmp);\r
+               if(str)\r
+               {\r
+                       str+=3;\r
+                       while(*str>0 && *str<=' ' && *str!='\n')        str++;\r
+                       if(*str>' ')\r
+                       {\r
+                               size_t j=0;     while(str[j]>' ')       j++;\r
+                               std::string val(str,j);\r
+                               argument_set(i,val.c_str());\r
+                       }\r
+               }\r
+       }\r
+       dr->anim.clear();\r
+       std::string ids;\r
+       std::vector<std::string> par;\r
+       mgl_parse_comments(text, dr->a1, dr->a2, dr->da, dr->anim, ids, par);\r
+       if(!ids.empty())        dr->gr->dialog(ids,par);\r
+}\r
+//-----------------------------------------------------------------------------\r
+Fl_Text_Display::Style_Table_Entry stylemess[2] = {    // Style table\r
+       { FL_BLACK,             FL_COURIER,             12, 0 },                // A - Plain\r
+       { FL_RED,               FL_COURIER,             12, 0 } };              // B - Strings\r
+void mess_parse(const char *text, char *style, int /*length*/)\r
+{\r
+       size_t n=strlen(text);\r
+       // Style letters: A - Plain; B - Error\r
+       for(size_t i=0;i<n;i++) style[i] = 'A';\r
+       const char *l1=text, *l2=strchr(l1, '\n');\r
+       while(l1)\r
+       {\r
+               size_t len = l2?l2-l1:strlen(l1), st=l1-text;\r
+               const char *p = strstr(l1,"in line");\r
+               if(p && size_t(p-l1)<len)\r
+                       for(size_t i=0;i<len;i++)       style[i+st]='B';\r
+               l1=l2?l2+1:NULL;        l2=l1?strchr(l1, '\n'):NULL;\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
+static Fl_Text_Buffer *sbuf=0;\r
+void mess_update(int pos, int nInserted, int nDeleted, int, const char *, void *cbArg)\r
+{\r
+       Fl_Text_Buffer *mbuf=((Fl_Text_Editor *)cbArg)->buffer();\r
+       long    start, end;     // Start and end of text\r
+       char last, *style, *text;               // Text data\r
+       if (nInserted == 0 && nDeleted == 0) {  sbuf->unselect();       return;  }\r
+       if (nInserted > 0)\r
+       {\r
+               style = new char[nInserted + 1];\r
+               memset(style, 'A', nInserted);\r
+               style[nInserted] = '\0';\r
+               sbuf->replace(pos, pos + nDeleted, style);\r
+               delete[] style;\r
+       }\r
+       else    sbuf->remove(pos, pos + nDeleted);\r
+       sbuf->select(pos, pos + nInserted - nDeleted);\r
+       start = mbuf->line_start(pos);\r
+       end   = mbuf->line_end(pos + nInserted);\r
+       text  = mbuf->text_range(start, end);\r
+       style = sbuf->text_range(start, end);\r
+       if (start==end) last = 0;\r
+       else    last = style[end-start-1];\r
+       mess_parse(text, style, end - start);\r
+       sbuf->replace(start, end, style);\r
+       ((Fl_Text_Editor *)cbArg)->redisplay_range(start, end);\r
+\r
+       if (start==end || last != style[end-start-1])\r
+       {\r
+               // Either the user deleted some text, or the last character on\r
+               // the line changed styles, so reparse the remainder of the buffer...\r
+               free(text);     free(style);\r
+               end   = mbuf->length();\r
+               text  = mbuf->text_range(start, end);\r
+               style = sbuf->text_range(start, end);\r
+               mess_parse(text, style, end - start);\r
+               sbuf->replace(start, end, style);\r
+               ((Fl_Text_Editor *)cbArg)->redisplay_range(start, end);\r
+       }\r
+       free(text);     free(style);\r
+}\r
+//-----------------------------------------------------------------------------\r
+void style_unfinished_cb(int, void*);\r
+void cb_mess_copy(Fl_Widget*,void *v);\r
+void cb_mess_jump(Fl_Widget*,void *v);\r
+class MessDlg : public GeneralDlg\r
+{\r
+       Fl_Text_Display *mess;\r
+       Fl_Text_Buffer *mbuf;\r
+       int pos, last;\r
+public:\r
+       MessDlg() : GeneralDlg()\r
+       {\r
+               Fl_Button *o;\r
+               w = new Fl_Double_Window(500, 195, _("MGL messages"));\r
+               mess = new Fl_Text_Display(30, 5, 460, 190);\r
+               o = new Fl_Return_Button(5,5,25,25);    o->callback(cb_mess_jump,e);\r
+               o = new Fl_Button(5,35,25,25);  o->callback(cb_mess_copy,e);    o->image(img_copy);\r
+               w->end();       w->resizable(mess);\r
+               mbuf = new Fl_Text_Buffer;      sbuf = new Fl_Text_Buffer;\r
+               mess->buffer(mbuf);     pos=last=0;\r
+               mess->highlight_data(sbuf, stylemess, sizeof(stylemess) / sizeof(stylemess[0]), 'A', style_unfinished_cb, 0);\r
+               mbuf->add_modify_callback(mess_update, mess);\r
+               mbuf->call_modify_callbacks();\r
+       }\r
+       void copy()\r
+       {\r
+               char *s = mbuf->selection_text();\r
+               if(s && *s==0)  {       free(s);        s=0;    }\r
+               if(!s)  s = mbuf->text();\r
+               Fl::copy(s,strlen(s),1);        free(s);\r
+       }\r
+       void jump()\r
+       {\r
+               if(!e)  return;\r
+               char *s = mbuf->text();\r
+               if(*s==0)       {       free(s);        return; }\r
+               int ipos = mess->line_start(mess->insert_position());\r
+               if(ipos!=last)  last=pos=ipos;\r
+\r
+               int id=-1;\r
+               const char *p = strstr(s+pos,"in line");\r
+               if(p)   {       pos = p-s+7;    id = atoi(p+8); }\r
+               else    // try from beginning\r
+               {\r
+                       p = strstr(s,"in line");\r
+                       if(p)   {       pos = p-s+7;    id = atoi(p+8); }\r
+               }\r
+               free(s);\r
+\r
+               if(id>=0)\r
+               {\r
+                       Fl_Text_Editor::kf_ctrl_move(FL_Home, e->editor);\r
+                       for(int i=0;i<id;i++)   Fl_Text_Editor::kf_down(0, e->editor);\r
+                       Fl_Text_Editor::kf_up(0, e->editor);\r
+                       Fl::focus(e->editor);\r
+               }\r
+       }\r
+       void set(const char *s)\r
+       {       mbuf->text(s);  show(); }\r
+} mess_wnd;\r
+//-----------------------------------------------------------------------------\r
+void message_cb(Fl_Widget*,void *v)\r
+{      animate_dlg.e = (ScriptWindow*)v;       mess_wnd.show();        }\r
+//-----------------------------------------------------------------------------\r
+void message_set(const char *s, ScriptWindow *e)\r
+{      mess_wnd.e = e; if(s && *s)     mess_wnd.set(s);        else    mess_wnd.hide();        }\r
+//-----------------------------------------------------------------------------\r
+void cb_mess_copy(Fl_Widget*,void *v)  {       mess_wnd.copy();        }\r
+//-----------------------------------------------------------------------------\r
+void cb_mess_jump(Fl_Widget*,void *v)  {       mess_wnd.jump();        }\r
+//-----------------------------------------------------------------------------\r
diff --git a/mgllab/mgl.xml.in b/mgllab/mgl.xml.in
new file mode 100644 (file)
index 0000000..325aaac
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<mime-info xmlns='http://www.freedesktop.org/standards/shared-mime-info'>
+  <mime-type type="text/mgl">
+    <alias type="text/x.mgl"/>
+    <alias type="text/x-mgl"/>
+    <comment>MGL script</comment>
+    <icon name="${CMAKE_INSTALL_PREFIX}/share/pixmaps/udav.png"/>
+    <glob pattern="*.mgl"/>
+  </mime-type>
+</mime-info>
diff --git a/mgllab/mgllab.cpp b/mgllab/mgllab.cpp
new file mode 100644 (file)
index 0000000..7473d41
--- /dev/null
@@ -0,0 +1,691 @@
+/* main.cpp is part of UDAV\r
+ * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>\r
+ *\r
+ * This program is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Library General Public License\r
+ * as published by the Free Software Foundation\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
+ */\r
+#include <ctype.h>\r
+#include <errno.h>\r
+#include <locale.h>\r
+#include <getopt.h>\r
+#include "mgllab.h"\r
+#include <Fl/Fl_Spinner.H>\r
+#include <Fl/Fl_Output.H>\r
+#include <Fl/Fl_Select_Browser.H>\r
+#include <Fl/Fl_Printer.H>\r
+//-----------------------------------------------------------------------------\r
+#ifndef MGL_DOC_DIR\r
+#ifdef WIN32\r
+#define MGL_DOC_DIR ""\r
+#else\r
+#define MGL_DOC_DIR "/usr/local/share/doc/mathgl/"\r
+#endif\r
+#endif\r
+//-----------------------------------------------------------------------------\r
+//int num_windows = 0, auto_exec=1, plastic_scheme=1, internal_font=0;\r
+int num_windows = 0;\r
+int auto_exec;\r
+int exec_save;\r
+int highlight;\r
+int mouse_zoom;\r
+int use_thr;\r
+int complete_word;\r
+int wndW=930, wndH=510, txtW=300;\r
+std::string docdir;\r
+std::string helpname;\r
+std::string fontname;\r
+int lang;\r
+int scheme;\r
+std::string lastfiles[5];\r
+Fl_Preferences pref(Fl_Preferences::USER,"abalakin","mgllab");\r
+//-----------------------------------------------------------------------------\r
+#define NUM_LOCALE     4\r
+const char *sch[4]={"base","gtk+","plastic","gleam"};\r
+const char *loc[]={"en_EN.UTF8",       "ru_RU.utf8",   "ru_RU.cp1251", "es_ES.utf8",   ""};\r
+const char *hlp[]={"mgl_en.html#","mgl_ru.html#", "mgl_ru.html#", "mgl_en.html#",      ""};\r
+void set_scheme_lang(int s, int l)\r
+{\r
+       if(s<0 || s>3)  s=1;\r
+       if(l<0 || l>NUM_LOCALE-1)       l=1;\r
+       mgl_textdomain(NULL,loc[l]);\r
+       Fl::scheme(sch[s]);\r
+       scheme = s;     lang = l;\r
+#ifdef WIN32\r
+       char sep = '\\';\r
+#else\r
+       char sep = '/';\r
+#endif\r
+       helpname = docdir+sep+hlp[l];\r
+}\r
+//-----------------------------------------------------------------------------\r
+void save_pref()\r
+{\r
+       pref.set("locale",lang);\r
+       pref.set("scheme",scheme);\r
+       pref.set("help_dir",docdir.c_str());\r
+       pref.set("auto_exec",auto_exec);\r
+       pref.set("exec_save",exec_save);\r
+       pref.set("highlight",highlight);\r
+       pref.set("mouse_zoom",mouse_zoom);\r
+       pref.set("use_thr", use_thr);\r
+       pref.set("font_kind",font_kind);\r
+       pref.set("font_size",font_size);\r
+       pref.set("complete_word",complete_word);\r
+       pref.set("font_name",fontname.c_str());\r
+       pref.set("fname1",lastfiles[0].c_str());\r
+       pref.set("fname2",lastfiles[1].c_str());\r
+       pref.set("fname3",lastfiles[2].c_str());\r
+       pref.set("fname4",lastfiles[3].c_str());\r
+       pref.set("fname5",lastfiles[4].c_str());\r
+\r
+       pref.set("wnd_width", wndW);\r
+       pref.set("wnd_height",wndH);\r
+       pref.set("txt_width", txtW);\r
+}\r
+//-----------------------------------------------------------------------------\r
+void load_pref(ScriptWindow *w)\r
+{\r
+       static char *s=0;\r
+       pref.get("locale",lang,1);\r
+       pref.get("scheme",scheme,2);\r
+       pref.get("help_dir",s,MGL_DOC_DIR);\r
+       if(s)   {       docdir=s;       free(s);        }\r
+       pref.get("auto_exec",auto_exec,1);\r
+       pref.get("exec_save",exec_save,1);\r
+       pref.get("highlight",highlight,1);\r
+       pref.get("mouse_zoom",mouse_zoom,0);\r
+       pref.get("use_thr",use_thr,1);\r
+       pref.get("complete_word",complete_word,1);\r
+       pref.get("font_kind",font_kind,1);\r
+       pref.get("font_size",font_size,14);\r
+       set_style(font_kind, font_size);\r
+       pref.get("font_name",s,"");\r
+       if(s)   {       fontname=s;     free(s);        }\r
+\r
+       pref.get("wnd_width", wndW,930);\r
+       pref.get("wnd_height",wndH,510);\r
+       pref.get("txt_width", txtW,300);\r
+\r
+       pref.get("fname1",s,"");        if(s)   {       lastfiles[0]=s; free(s);        }\r
+       pref.get("fname2",s,"");        if(s)   {       lastfiles[1]=s; free(s);        }\r
+       pref.get("fname3",s,"");        if(s)   {       lastfiles[2]=s; free(s);        }\r
+       pref.get("fname4",s,"");        if(s)   {       lastfiles[3]=s; free(s);        }\r
+       pref.get("fname5",s,"");        if(s)   {       lastfiles[4]=s; free(s);        }\r
+       set_scheme_lang(scheme,lang);   // NOTE: must be after setting docdir\r
+       if(w && w->graph)\r
+       {\r
+               w->graph->FMGL->use_pthr = use_thr;\r
+               mgl_load_font(w->graph->get_graph(),fontname.c_str(),NULL);\r
+               example_cb(NULL, w);\r
+               w->graph->parent()->show();\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
+void set_title(Fl_Window* w)\r
+{\r
+       static std::string title;\r
+       if (filename.empty()) title=_("Untitled");\r
+       else\r
+       {\r
+               size_t sep = filename.find_last_of('/');\r
+#ifdef WIN32\r
+               if(sep==std::string::npos)\r
+                       sep = filename.find_last_of('\\');\r
+#endif\r
+               if(sep!=std::string::npos)      title = filename.substr(sep+1);\r
+               else    title = filename;\r
+       }\r
+       if(changed)     title += " *";\r
+       title = title + " - mgllab";\r
+       w->label(title.c_str());\r
+}\r
+//-----------------------------------------------------------------------------\r
+void close_dlg_cb(Fl_Widget *, void *v)        {       ((Fl_Window *)v)->hide();       }\r
+//-----------------------------------------------------------------------------\r
+void fname_cb(Fl_Widget*, void *v)\r
+{\r
+       ScriptWindow* e = (ScriptWindow*)v;\r
+       const char *file = mgl_file_chooser(_("Insert file name?"));\r
+       if(file)\r
+       {\r
+               char *str = new char[strlen(file)+4];\r
+               snprintf(str,strlen(file)+4," '%s'",file);\r
+               e->editor->insert(str);\r
+               delete []str;\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
+void new_cb(Fl_Widget*, void*)\r
+{\r
+       if (!check_save()) return;\r
+       filename[0] = '\0';\r
+       textbuf->select(0, textbuf->length());\r
+       textbuf->remove_selection();\r
+       changed = 0;\r
+       textbuf->call_modify_callbacks();\r
+}\r
+//-----------------------------------------------------------------------------\r
+void open_cb(Fl_Widget*, void *v)\r
+{\r
+       if (!check_save()) return;\r
+       const char *newfile = mgl_file_chooser(_("Open File?"),\r
+               _("MGL files \t*.mgl\nDAT files \t*.{dat,csv}"));\r
+       if(newfile != NULL)\r
+       {\r
+               ScriptWindow* e = (ScriptWindow*)v;\r
+               load_file(newfile, -1,e);\r
+               if(auto_exec)   e->graph->update();\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
+void close_cb(Fl_Widget*, void* v)\r
+{\r
+       Fl_Window* w = (Fl_Window*)v;\r
+       if (num_windows == 1 && !check_save())  return;\r
+\r
+       w->hide();\r
+       textbuf->remove_modify_callback(changed_cb, w);\r
+       ScriptWindow *wnd = dynamic_cast<ScriptWindow*>(w);\r
+       if(wnd)\r
+       {\r
+               wndW = wnd->w();\r
+               wndH = wnd->h();\r
+               txtW = wnd->editor->w();\r
+               save_pref();\r
+       }\r
+       delete w;\r
+       num_windows--;\r
+       if (!num_windows) exit(0);\r
+}\r
+//-----------------------------------------------------------------------------\r
+void quit_cb(Fl_Widget*, void*)\r
+{\r
+       if (changed && !check_save())   return;\r
+       exit(0);\r
+}\r
+//-----------------------------------------------------------------------------\r
+void save_cb(Fl_Widget*w, void*v)\r
+{\r
+       if(filename.empty())    {       saveas_cb(w,v); return; }       // No filename - get one!\r
+       else save_file(filename.c_str(),(ScriptWindow*)v);\r
+}\r
+//-----------------------------------------------------------------------------\r
+void saveas_cb(Fl_Widget*, void *v)\r
+{\r
+       const char *newfile;\r
+       char *fname=0;\r
+       while(1)\r
+       {\r
+               newfile = mgl_file_chooser(_("Save File As?"), _("MGL files \t*.mgl"), true);\r
+               if(!newfile || !newfile[0])     break;\r
+               if(!strchr(newfile,'.'))\r
+               {\r
+                       if(fname)       delete []fname;\r
+                       fname = new char[strlen(newfile)+5];\r
+                       strcpy(fname,newfile);  strcat(fname,".mgl");\r
+                       newfile = fname;\r
+               }\r
+               FILE *fp = fl_fopen(newfile,"r");\r
+               if(fp)\r
+               {\r
+                       fclose(fp);\r
+                       if(fl_choice(_("File exist. Overwrite it?"),0,_("No"),_(" Yes "))==2)\r
+                               break;\r
+               }\r
+               else    break;\r
+       }\r
+       if (newfile != NULL)    save_file(newfile, (ScriptWindow*)v);\r
+       if(fname)       delete []fname;\r
+}\r
+//-----------------------------------------------------------------------------\r
+ScriptWindow *new_view();\r
+void view_cb(Fl_Widget*, void*)\r
+{      Fl_Window* w = new_view();      w->show();      }\r
+//-----------------------------------------------------------------------------\r
+void hint_cb(Fl_Widget*, void*)        {}\r
+void lastfile1_cb(Fl_Widget*, void *v)\r
+{      if (!check_save()) return;\r
+       load_file(lastfiles[0].c_str(),-1,(ScriptWindow*)v);    }\r
+void lastfile2_cb(Fl_Widget*, void *v)\r
+{      if (!check_save()) return;\r
+       load_file(lastfiles[1].c_str(),-1,(ScriptWindow*)v);    }\r
+void lastfile3_cb(Fl_Widget*, void *v)\r
+{      if (!check_save()) return;\r
+       load_file(lastfiles[2].c_str(),-1,(ScriptWindow*)v);    }\r
+void lastfile4_cb(Fl_Widget*, void *v)\r
+{      if (!check_save()) return;\r
+       load_file(lastfiles[3].c_str(),-1,(ScriptWindow*)v);    }\r
+void lastfile5_cb(Fl_Widget*, void *v)\r
+{      if (!check_save()) return;\r
+       load_file(lastfiles[4].c_str(),-1,(ScriptWindow*)v);    }\r
+//-----------------------------------------------------------------------------\r
+void print_plot_cb(Fl_Widget*,void *v)\r
+{\r
+       ScriptWindow *w = (ScriptWindow*)v;\r
+       Fl_Printer *p = new Fl_Printer;\r
+       if(!p->start_job(1) && !p->start_page())\r
+       {\r
+               int wp,hp, ww=w->graph->FMGL->w(), hh=w->graph->FMGL->h();\r
+               p->printable_rect(&wp,&hp);\r
+               double s=1, sw=double(wp)/ww, sh=double(hp)/hh;\r
+               if(sw<s)        s=sw;\r
+               if(sh<s)        s=sh;\r
+//             if(sw<sh)       p->rotate(90);  // TODO add rotation ???\r
+               p->scale(s,s);\r
+               p->print_widget(w->graph->FMGL);\r
+               p->end_page();          p->end_job();\r
+       }\r
+       delete p;\r
+}\r
+//-----------------------------------------------------------------------------\r
+Fl_Menu_Item menuitems[] = {\r
+       {_("File"), 0, 0, 0, FL_SUBMENU},\r
+               {_("New script"), 0, new_cb},\r
+               {_("Open file ..."), FL_CTRL+'o', open_cb},\r
+               {_("Save file"), FL_CTRL+'s', save_cb},\r
+               {_("Save as ..."), 0, saveas_cb, 0, FL_MENU_DIVIDER},\r
+               {_("Print plot"), 0, print_plot_cb, 0, FL_MENU_DIVIDER},\r
+               {_("Recent files"), 0, 0, 0, FL_SUBMENU|FL_MENU_DIVIDER},\r
+                       {"1.", 0, lastfile1_cb},\r
+                       {"2.", 0, lastfile2_cb},\r
+                       {"3.", 0, lastfile3_cb},\r
+                       {"4.", 0, lastfile4_cb},\r
+                       {"5.", 0, lastfile5_cb},\r
+                       {0},\r
+               {_("Exit"), 0, quit_cb},\r
+               {0},\r
+       {_("Edit"), 0, 0, 0, FL_SUBMENU},\r
+               {_("Undo"), FL_CTRL+'z', undo_cb},\r
+               {_("Cut text"), FL_CTRL+'x', cut_cb},\r
+               {_("Copy text"), FL_CTRL+'c', copy_cb},\r
+               {_("Paste text"), FL_CTRL+'v', paste_cb},\r
+               {_("Select all"), FL_CTRL+'a', select_all_cb, 0, FL_MENU_DIVIDER},\r
+               {_("Hidden plots"), FL_CTRL+'d', hide_cb},\r
+               {_("Show lines"), FL_CTRL+FL_SHIFT+'d', unhide_cb, 0, FL_MENU_DIVIDER},\r
+               {_("Find|Replace"), FL_CTRL+'f', find_dlg_cb},\r
+               {_("Find next"), FL_F+3, find_next_cb, 0, FL_MENU_DIVIDER},\r
+               {_("Insert"), 0, 0, 0, FL_SUBMENU},\r
+                       {_("File path"), FL_META+'p', ins_fname_cb},\r
+                       {_("Folder path"), 0, ins_path_cb},\r
+                       {_("Command"), FL_META+'c', newcmd_dlg_cb},\r
+                       {_("Inplot"), FL_META+'i', inplot_dlg_cb},\r
+                       {_("Fitted formula"), FL_META+'f', ins_fits_cb},\r
+                       {_("Manual primitives"), 0, ins_prim_cb},\r
+                       {_("Plot style"), 0, style_dlg_cb},\r
+                       {_("Options"), FL_META+'o', option_dlg_cb},\r
+                       {0},\r
+       // TODO{_("Selection"), 0,  0, 0, FL_SUBMENU|FL_MENU_DIVIDER},\r
+               // TODO{_("Hide"), 0,  0},\r
+               // TODO{_("Delete"), 0,  0},\r
+               // TODO{_("Move up"), 0,  0},\r
+               // TODO{_("Move down"), 0,  0},\r
+               // TODO{_("Show hidden"), FL_F+8,  0, 0, FL_MENU_TOGGLE},\r
+               {0},\r
+       {_("Graphics"), 0, 0, 0, FL_SUBMENU},\r
+               {0},\r
+       {_("Setup"), 0, 0, 0, FL_SUBMENU},\r
+               {_("Properties"), 0, prop_dlg_cb},\r
+               {_("Set arguments"), 0, args_dlg_cb},\r
+               {_("Setup animation"), 0, animate_dlg_cb},\r
+               {_("Plot setup"), FL_META+'g', setup_dlg_cb, 0, FL_MENU_DIVIDER},\r
+               {_("Calculator"), FL_F+4, calc_dlg_cb},\r
+               {_("Messages"), FL_F+2, message_cb},\r
+               {0},\r
+       {_("Help"), 0, 0, 0, FL_SUBMENU},\r
+               {_("Help"), FL_F+1, help_cb},\r
+               {_("Hints"), 0, hint_dlg_cb},\r
+               {_("About"), 0, about_cb},\r
+               {_("Icon list"), 0, iconlist_cb},       // TODO remove before release\r
+               {0},\r
+       {0}\r
+};\r
+//-----------------------------------------------------------------------------\r
+void mem_upd_cb(Fl_Widget *, void *v)\r
+{      ((ScriptWindow*)v)->mem_init(); }\r
+//-----------------------------------------------------------------------------\r
+extern Fl_RGB_Image img_udav;\r
+ScriptWindow *new_view()\r
+{\r
+       Fl_Group *gg;\r
+       ScriptWindow *w = new ScriptWindow(wndW, wndH, _("Untitled - mgllab"));\r
+       w->begin();\r
+       w->menu = new Fl_Menu_Bar(0, 0, wndW, 30);\r
+       w->menu->copy(menuitems, w);\r
+       w->label(_("Untitled - mgllab"));\r
+\r
+       Fl_Tile *t = new Fl_Tile(0,30,wndW,wndH-55);\r
+       add_editor(w, txtW, wndH);\r
+\r
+       w->rtab = new Fl_Tabs(txtW,30,wndW-txtW,wndH-55,0);\r
+       w->gplot = new Fl_Group(txtW,30,wndW-txtW,wndH-80,_("Canvas"));\r
+       w->graph = new Fl_MGLView(txtW,30,wndW-txtW,wndH-80,_("Canvas"));\r
+       w->gplot->resizable(w->graph);  w->gplot->end();        w->graph->adjust();\r
+       w->ghelp = new Fl_Group(txtW,30,wndW-txtW,wndH-80,_("Help"));\r
+       add_help(w);    w->ghelp->end();        w->ghelp->hide();\r
+       gg = new Fl_Group(txtW,30,wndW-txtW,wndH-80,_("Memory"));       gg->hide();\r
+       add_mem(w);             gg->end();\r
+       w->rtab->end();\r
+\r
+//     w->status = new Fl_Output(0,485,wndW,25);\r
+       w->status = new Fl_Box(0,wndH-25,wndW,25);      w->status->box(FL_ENGRAVED_BOX);\r
+       w->status->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE);\r
+       w->set_status(_("Ready"));\r
+       w->draw = new Fl_MGL(w->graph); w->draw->e = w;\r
+       mgl_makemenu_fltk(w->menu, w->graph);\r
+       w->menu->add(_("Graphics/Primitive"), FL_CTRL+'m', prim_dlg_cb, w);\r
+       w->menu->add(_("Graphics/Animation/Setup animation"), 0, animate_dlg_cb, w);\r
+       int index = w->menu->find_index(_("Graphics/Pause calc"));\r
+       if(index>=0)    w->menu->remove(index);\r
+//     m->add(_("Graphics/Pause calc"), "^t", mgl_pause_cb, w, FL_MENU_TOGGLE);\r
+\r
+\r
+       t->end();       w->end();       w->resizable(t);\r
+       w->rtab->callback(mem_upd_cb, w);\r
+       w->callback(close_cb, w);       w->icon(&img_udav);\r
+       num_windows++;  return w;\r
+}\r
+//-----------------------------------------------------------------------------\r
+void argument_set(int n, const char *s);\r
+int main(int argc, char **argv)\r
+{\r
+//     Fl::lock();\r
+       mgl_ask_func = mgl_ask_fltk;\r
+       mgl_progress_func = mgl_progress_fltk;\r
+       load_pref(NULL);\r
+\r
+       textbuf = new Fl_Text_Buffer;\r
+       style_init();\r
+       textbuf->tab_distance(4);\r
+       ScriptWindow *w = new_view();\r
+       Fl::visual(FL_DOUBLE|FL_RGB);\r
+       load_pref(w);\r
+       int ir = w->menu->find_index(_("File/Recent files"));\r
+       if(ir<0)        ir = 6;\r
+       w->menu->replace(ir+1, lastfiles[0].c_str());\r
+       w->menu->replace(ir+2, lastfiles[1].c_str());\r
+       w->menu->replace(ir+3, lastfiles[2].c_str());\r
+       w->menu->replace(ir+4, lastfiles[3].c_str());\r
+       w->menu->replace(ir+5, lastfiles[4].c_str());\r
+       int sh; pref.get("show_hint",sh,1);\r
+       if(sh)  hint_dlg_cb(0,0);\r
+\r
+       std::string fname;\r
+       while(1)\r
+       {\r
+               char ch = getopt(argc, argv, "1:2:3:4:5:6:7:8:9:ho:L:");\r
+               if(ch>='1' && ch<='9')  argument_set(ch-'0', optarg);\r
+               else if(ch=='L')\r
+               {       setlocale(LC_CTYPE, optarg);    setlocale(LC_NUMERIC, "C");     }\r
+               else if(ch=='h')\r
+               {\r
+                       printf(_("mgllab draw mgl script interactively.\nCurrent version is 2.%g\n"),MGL_VER2);\r
+                       printf(_("Usage:\tmgllab [parameter(s)] scriptfile\n"));\r
+                       printf(_("\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-            get script from standard input\n"\r
+                                       "\t-h           print this message\n") );\r
+                       return 0;\r
+               }\r
+               // NOTE: I will not parse stdin here\r
+               else if(ch==-1)\r
+               {       if(optind<argc) fname = argv[optind];\r
+                       break;  }\r
+       }\r
+\r
+       w->show(1, argv);\r
+       if(!fname.empty() && fname[0]!='-')\r
+       {\r
+               load_file(fname.c_str(), -1,w);\r
+               if(auto_exec)   w->graph->update();\r
+       }\r
+       return Fl::run();\r
+}\r
+//-----------------------------------------------------------------------------\r
+void cb_filech(Fl_Widget*, void *v);\r
+class PropDlg : public GeneralDlg\r
+{\r
+       friend void cb_filech(Fl_Widget*, void *v);\r
+       Fl_Choice *fkind;\r
+       Fl_Spinner *fsize;\r
+       Fl_File_Input *help_path;\r
+       Fl_File_Input *font_path;\r
+       Fl_Check_Button *auto_exec_w;\r
+       Fl_Check_Button *exec_save_w;\r
+       Fl_Check_Button *complete_w;\r
+       Fl_Check_Button *highlight_w;\r
+       Fl_Check_Button *mouse_zoom_w;\r
+       Fl_Check_Button *use_thr_w;\r
+       Fl_Choice *lang_w;\r
+       Fl_Choice *scheme_w;\r
+public:\r
+       PropDlg() : GeneralDlg()\r
+       {\r
+               Fl_Button *o;\r
+               w = new Fl_Double_Window(340, 390, _("Properties"));\r
+               w->align(Fl_Align(FL_ALIGN_CLIP|FL_ALIGN_INSIDE));\r
+               fkind = new Fl_Choice(75, 10, 90, 25, _("Font kind"));\r
+               fkind->add("Helvetica");        fkind->add("Courier");  fkind->add("Times");\r
+               fsize = new Fl_Spinner(245, 10, 90, 25, _("Font size"));\r
+               help_path = new Fl_File_Input(5, 55, 305, 35, _("Path for help files"));\r
+               help_path->align(FL_ALIGN_TOP_LEFT);\r
+               o = new Fl_Button(310, 65, 25, 25, "...");      o->callback(cb_filech, 0);\r
+               font_path = new Fl_File_Input(5, 110, 305, 35, _("Path for MathGL font (without extension)"));\r
+               font_path->align(FL_ALIGN_TOP_LEFT);\r
+               o = new Fl_Button(310, 120, 25, 25, "...");     o->callback(cb_filech, (void *)1);\r
+               auto_exec_w = new Fl_Check_Button(5, 145, 330, 25, _("Execute script after loading"));\r
+               exec_save_w = new Fl_Check_Button(5, 170, 330, 25, _("Save file before redrawing"));\r
+               complete_w = new Fl_Check_Button(5, 195, 330, 25, _("Enable keywords completion"));\r
+               highlight_w = new Fl_Check_Button(5, 220, 330, 25, _("Highlight current object(s)"));\r
+               mouse_zoom_w = new Fl_Check_Button(5, 245, 330, 25, _("Enable mouse wheel for zooming"));\r
+               use_thr_w = new Fl_Check_Button(5, 270, 330, 25, _("Use multi-threading for drawing"));\r
+               lang_w = new Fl_Choice(160, 300, 175, 25, _("Language for mgllab"));\r
+               for(long i=0;i<NUM_LOCALE;i++)  lang_w->add(loc[i]);\r
+               scheme_w = new Fl_Choice(160, 330, 175, 25, _("Widget scheme"));\r
+               scheme_w->add("base");  scheme_w->add("gtk+");  scheme_w->add("plastic");       scheme_w->add("gleam");\r
+               o = new Fl_Button(85, 360, 75, 25, _("Cancel"));        o->callback(cb_dlg_cancel,this);\r
+               o = new Fl_Return_Button(180, 360, 75, 25, _("OK"));    o->callback(cb_dlg_ok,this);\r
+               w->set_modal(); w->end();\r
+       }\r
+       void init()\r
+       {\r
+               fkind->value(styletable[0].font/4);\r
+               fsize->value(styletable[0].size);\r
+               font_path->value(fontname.c_str());\r
+               help_path->value(docdir.c_str());\r
+               auto_exec_w->value(auto_exec);\r
+               exec_save_w->value(exec_save);\r
+               complete_w->value(complete_word);\r
+               highlight_w->value(highlight);\r
+               mouse_zoom_w->value(mouse_zoom);\r
+               use_thr_w->value(use_thr);\r
+               lang_w->value(lang);\r
+               scheme_w->value(scheme);\r
+       }\r
+       void cb_ok()\r
+       {\r
+               set_style(fkind->value(),fsize->value());\r
+               auto_exec = auto_exec_w->value();\r
+               exec_save = exec_save_w->value();\r
+               highlight = highlight_w->value();\r
+               mouse_zoom = mouse_zoom_w->value();\r
+               complete_word = complete_w->value();\r
+               use_thr = use_thr_w->value();\r
+               docdir = help_path->value();\r
+               fontname = font_path->value();\r
+               if(e->graph->get_graph())\r
+                       mgl_load_font(e->graph->get_graph(),fontname.c_str(),NULL);\r
+               set_scheme_lang(scheme_w->value(),lang_w->value());     // NOTE: must be after setting docdir\r
+               example_cb(NULL, e);    e->graph->parent()->show();\r
+               save_pref();    hide();\r
+       }\r
+} prop_dlg;\r
+//-----------------------------------------------------------------------------\r
+void cb_filech(Fl_Widget*, void *v)\r
+{\r
+       if(v)\r
+       {\r
+               const char *s = mgl_file_chooser(_("Font file name"), "MGL font files \t*.vfm*");\r
+               if(s)\r
+               {       std::string ss = s;\r
+                       size_t pos = ss.find(".vfm");\r
+                       if(pos!=std::string::npos)      ss = ss.substr(0,pos);\r
+                       prop_dlg.font_path->value(ss.c_str());  }\r
+       }\r
+       else\r
+       {\r
+               const char *s = mgl_dir_chooser(_("Folder for help files"), prop_dlg.help_path->value());\r
+               if(s)   prop_dlg.help_path->value(s);\r
+       }\r
+}\r
+void prop_dlg_cb(Fl_Widget *, void *v)\r
+{      prop_dlg.e = (ScriptWindow *)v; prop_dlg.show();        }\r
+//-----------------------------------------------------------------------------\r
+void cb_calc_key(Fl_Widget *, void *v);\r
+void cb_calc_ins(Fl_Widget *, void *);\r
+void cb_calc_prev(Fl_Widget *, void *);\r
+void cb_calc_edit(Fl_Widget *, void *);\r
+void cb_calc_kind(Fl_Widget *, void *);\r
+void cb_calc_func(Fl_Widget *, void *);\r
+class CalcDlg : public GeneralDlg\r
+{\r
+public:\r
+       Fl_Input *edit;\r
+       Fl_Output *output;\r
+       Fl_Browser *prev;\r
+       Fl_Choice *kind;\r
+       Fl_Choice *func;\r
+       CalcDlg() : GeneralDlg()\r
+       {\r
+               Fl_Button *o;   Fl_Group* g, *gg;\r
+               w = new Fl_Double_Window(275, 275, _("Calculator"));\r
+               g = new Fl_Group(5, 5, 265, 25);\r
+               edit = new Fl_Input(5, 5, 240, 25);     //edit->callback(cb_calc_edit);\r
+               o = new Fl_Return_Button(245, 5, 25, 25, "@>");\r
+               o->callback(cb_calc_edit);      g->end();       g->resizable(edit);\r
+               g = new Fl_Group(5, 35, 265, 25);\r
+               output = new Fl_Output(30, 35, 145, 25, "@->");\r
+               o = new Fl_Button(180, 35, 90, 25, _("to script"));\r
+               o->callback(cb_calc_ins);       g->end();       g->resizable(output);\r
+               prev = new Fl_Select_Browser(5, 80, 265, 70, _("Previous expressions"));\r
+               prev->align(FL_ALIGN_TOP_LEFT); prev->callback(cb_calc_prev);\r
+               static int widths[] = { 200, 65, 0 };  // widths for each column\r
+               prev->column_widths(widths);    prev->column_char('\t');\r
+               gg = new Fl_Group(5, 155, 265, 115);\r
+                       o = new Fl_Button(5, 155, 25, 25, "7");         o->callback(cb_calc_key,o);\r
+                       o = new Fl_Button(35, 155, 25, 25, "8");        o->callback(cb_calc_key,o);\r
+                       o = new Fl_Button(65, 155, 25, 25, "9");        o->callback(cb_calc_key,o);\r
+                       o = new Fl_Button(95, 155, 25, 25, "+");        o->callback(cb_calc_key,o);\r
+                       o = new Fl_Button(125, 155, 25, 25, "pi");      o->callback(cb_calc_key,o);\r
+                       o = new Fl_Button(5, 185, 25, 25, "4");         o->callback(cb_calc_key,o);\r
+                       o = new Fl_Button(35, 185, 25, 25, "5");        o->callback(cb_calc_key,o);\r
+                       o = new Fl_Button(65, 185, 25, 25, "6");        o->callback(cb_calc_key,o);\r
+                       o = new Fl_Button(95, 185, 25, 25, "-");        o->callback(cb_calc_key,o);\r
+                       o = new Fl_Button(125, 185, 25, 25, "^");       o->callback(cb_calc_key,o);\r
+                       o = new Fl_Button(5, 215, 25, 25, "1");         o->callback(cb_calc_key,o);\r
+                       o = new Fl_Button(35, 215, 25, 25, "2");        o->callback(cb_calc_key,o);\r
+                       o = new Fl_Button(65, 215, 25, 25, "3");        o->callback(cb_calc_key,o);\r
+                       o = new Fl_Button(95, 215, 25, 25, "*");        o->callback(cb_calc_key,o);\r
+                       o = new Fl_Button(125, 215, 25, 25, "(");       o->callback(cb_calc_key,o);\r
+                       o = new Fl_Button(5, 245, 25, 25, "0");         o->callback(cb_calc_key,o);\r
+                       o = new Fl_Button(35, 245, 25, 25, ".");        o->callback(cb_calc_key,o);\r
+                       o = new Fl_Button(65, 245, 25, 25, "E");        o->callback(cb_calc_key,o);\r
+                       o = new Fl_Button(95, 245, 25, 25, "/");        o->callback(cb_calc_key,o);\r
+                       o = new Fl_Button(125, 245, 25, 25, ")");       o->callback(cb_calc_key,o);\r
+\r
+                       g = new Fl_Group(155, 175, 115, 95, _("Function"));\r
+                       kind = new Fl_Choice(160, 179, 105, 25);        kind->callback(cb_calc_kind);\r
+                       kind->add("Basic");     kind->add("Exp and log");       kind->add("Trigonometric");\r
+                       kind->add("Hyperbolic");        kind->add("Bessel");    kind->add("Elliptic");\r
+                       kind->add("Jacobi");     kind->add("Airy and Gamma");\r
+                       kind->add("Exp-integrals"); kind->add("Special");       kind->value(0);\r
+\r
+                       func = new Fl_Choice(160, 209, 105, 25);\r
+                       o = new Fl_Button(160, 239, 105, 25, _("Put function"));        o->callback(cb_calc_func);\r
+                       g->end();       g->box(FL_DOWN_BOX);\r
+               gg->end();      gg->resizable(g);\r
+\r
+               w->end();       w->resizable(prev);\r
+       }\r
+       void eval()\r
+       {\r
+               const char *eq = edit->value();\r
+               mglData d = Parse->Calc(eq);\r
+               result = mgl_str_num(d.a[0]);\r
+               output->value(result.c_str());\r
+               std::string buf = eq+('\t'+result);\r
+               prev->insert(0,buf.c_str());\r
+       }\r
+       void set_kind()\r
+       {\r
+               int val = kind->value();        func->clear();\r
+               switch(val)\r
+               {\r
+               case 0: // basic\r
+                       func->add("abs()");             func->add("sign()");    func->add("step()");    func->add("sqrt()");\r
+                       func->add("mod(,)");    func->add("arg(,)");    break;\r
+               case 1: // exp and logarithms\r
+                       func->add("exp()");             func->add("pow(,)");    func->add("ln()");              func->add("lg()");\r
+                       func->add("log(,)");    break;\r
+               case 2: // trigonometric\r
+                       func->add("sin()");             func->add("cos()");             func->add("tan()");             func->add("sinc()");\r
+                       func->add("asin()");    func->add("acos()");    func->add("atan()");    break;\r
+               case 3: // hyperbolic\r
+                       func->add("sinh()");    func->add("cosh()");    func->add("tanh()");    func->add("asinh()");\r
+                       func->add("acosh()");   func->add("atanh()");   break;\r
+               case 4: // bessel\r
+                       func->add("bessel_j(,)");       func->add("bessel_y(,)");       func->add("bessel_i(,)");       func->add("bessel_k(,)");       break;\r
+               case 5: // elliptic\r
+                       func->add("elliptic_e(,)");     func->add("elliptic_f(,)");     func->add("elliptic_ec()");     func->add("elliptic_kc()");     break;\r
+               case 6: // jacobi\r
+                       func->add("sn(,)");             func->add("cn(,)");             func->add("dn(,)");             func->add("sc(,)");\r
+                       func->add("dc(,)");             func->add("nc(,)");             func->add("cs(,)");             func->add("ds(,)");\r
+                       func->add("ns(,)");             func->add("sd(,)");             func->add("cd(,)");             func->add("nd(,)");     break;\r
+               case 7: // airy and gamma\r
+                       func->add("airy_ai()"); func->add("airy_bi()"); func->add("airy_dai()");func->add("airy_dbi()");\r
+                       func->add("gamma()");   func->add("psi()");             func->add("beta(,)");   break;\r
+               case 8: // exp integrals\r
+                       func->add("ci()");              func->add("si()");              func->add("ei()");              func->add("e1()");\r
+                       func->add("e2()");              func->add("ei3()");     break;\r
+               case 9: // special\r
+                       func->add("erf()");             func->add("z()");               func->add("legendre(,)");       func->add("dilog()");\r
+                       func->add("eta()");             func->add("zeta()");    func->add("w0()");              func->add("w1()");      break;\r
+               }\r
+//             func->value(0);\r
+       }\r
+} calc_dlg;\r
+//-----------------------------------------------------------------------------\r
+void cb_calc_key(Fl_Widget *, void *v)\r
+{      Fl_Button *o=(Fl_Button *)v;    calc_dlg.edit->insert(o->label());      }\r
+void cb_calc_ins(Fl_Widget *, void *)\r
+{      if(calc_dlg.e)  calc_dlg.e->editor->insert(calc_dlg.output->value());   }\r
+void cb_calc_prev(Fl_Widget *, void *)\r
+{\r
+       const char *s = calc_dlg.prev->text(calc_dlg.prev->value());\r
+       if(s && *s)\r
+       {\r
+               std::string ss(s);      size_t l=ss.length();\r
+               for(size_t i=0;i<l;i++) if(ss[i]=='\t') ss[i]=0;\r
+               calc_dlg.edit->value(ss.c_str());\r
+       }\r
+}\r
+void cb_calc_edit(Fl_Widget *, void *) {       calc_dlg.eval();        }\r
+void cb_calc_kind(Fl_Widget *, void *) {       calc_dlg.set_kind();    }\r
+void cb_calc_func(Fl_Widget *, void *)\r
+{      const char *s = calc_dlg.func->text();\r
+       if(s && *s)     calc_dlg.edit->insert(s);       }\r
+//-----------------------------------------------------------------------------\r
+void calc_dlg_cb(Fl_Widget *, void *v)\r
+{      calc_dlg.e = (ScriptWindow *)v; calc_dlg.show();        }\r
+//-----------------------------------------------------------------------------\r
diff --git a/mgllab/mgllab.desktop b/mgllab/mgllab.desktop
new file mode 100755 (executable)
index 0000000..a9c86dc
--- /dev/null
@@ -0,0 +1,13 @@
+[Desktop Entry]
+Version=1.0
+Type=Application
+Terminal=false
+Icon=udav
+Name=mgllab
+Exec=mgllab %f
+MimeType=text/mgl;
+Comment=Data handling and plotting tool
+Comment[en_US]=Data handling and plotting tool
+Comment[ru_RU]=Обработка и отображение данных
+Categories=Education;Science;Math;
+Keywords=Visualization;Data;Array;
diff --git a/mgllab/mgllab.h b/mgllab/mgllab.h
new file mode 100644 (file)
index 0000000..2f50a43
--- /dev/null
@@ -0,0 +1,273 @@
+/* udav.h is part of UDAV\r
+ * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>\r
+ *\r
+ * This program is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Library General Public License\r
+ * as published by the Free Software Foundation\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
+ */\r
+//-----------------------------------------------------------------------------\r
+#ifndef _UDAV_H_\r
+#define _UDAV_H_\r
+//-----------------------------------------------------------------------------\r
+#ifdef __MWERKS__\r
+# define FL_DLL\r
+#endif\r
+#include <FL/Fl.H>\r
+#include <FL/Fl_Group.H>\r
+#include <FL/Fl_Double_Window.H>\r
+#include <FL/fl_ask.H>\r
+#include <FL/Fl_File_Chooser.H>\r
+#include <FL/Fl_Menu_Bar.H>\r
+#include <FL/Fl_Input.H>\r
+#include <FL/Fl_Button.H>\r
+#include <FL/Fl_Return_Button.H>\r
+#include <FL/Fl_Text_Buffer.H>\r
+#include <FL/Fl_Text_Editor.H>\r
+#include <FL/Fl_Pixmap.H>\r
+#include <FL/Fl_Counter.H>\r
+#include <Fl/Fl_Scroll.H>\r
+#include <FL/Fl_Tabs.H>\r
+#include <FL/Fl_Help_View.H>\r
+#include <Fl/Fl_Table.H>\r
+#include <Fl/Fl_Round_Button.H>\r
+#include <Fl/Fl_Float_Input.H>\r
+#include <Fl/Fl_Multiline_Input.H>\r
+#include <Fl/Fl_Multiline_Output.H>\r
+//-----------------------------------------------------------------------------\r
+#include "mgl2/Fl_MathGL.h"\r
+//-----------------------------------------------------------------------------\r
+extern mglParse *Parse;\r
+extern Fl_Menu_Item colors[];\r
+struct Fl_MGL;\r
+//-----------------------------------------------------------------------------\r
+extern Fl_Preferences pref;\r
+extern Fl_Text_Display::Style_Table_Entry styletable[10];\r
+extern int changed;            ///< flag of script is changed or not\r
+extern std::string filename;   ///< Current filename\r
+extern std::string lastfiles[5];///< Last opened files\r
+extern std::string search;             ///< Text to search\r
+extern Fl_Text_Buffer *textbuf;\r
+//-----------------------------------------------------------------------------\r
+extern int auto_exec;  ///< Enable auto execution\r
+extern int exec_save;  ///< Save before running\r
+extern int highlight;  ///< Highlight current line\r
+extern int mouse_zoom; ///< Use mouse wheel for zooming\r
+extern std::string helpname;   ///< Path to help files\r
+extern std::string fontname;   ///< Path to font files\r
+extern int lang;               ///< Locale for script and help files\r
+extern int scheme;             ///< FLTK scheme\r
+extern int font_kind;  ///< Editor font kind\r
+extern int font_size;  ///< Editor font size\r
+extern int complete_word;      ///< enable word completion\r
+//-----------------------------------------------------------------------------\r
+void set_scheme_lang(int s, int l);            ///< Set FLTK scheme and locale\r
+void set_style(int fkind, int fsize);  ///< Change the style of highlight\r
+void style_init();             ///< Initialize the style buffer\r
+void save_pref();              ///< Apply and save preferences\r
+void load_pref();              ///< Load preferences\r
+void add_filename(const char *fname);  ///< Add filename to lastfiles\r
+std::string wcstombs(std::wstring wcs);        ///< Convert std::wstring to std::string\r
+//-----------------------------------------------------------------------------\r
+class Fl_Data_Table : public Fl_Table\r
+{\r
+private:\r
+       int row, col;\r
+       Fl_Input* input;\r
+protected:\r
+       void draw_cell(TableContext context, int R, int C, int X, int Y, int W, int H);\r
+       static void event_callback(Fl_Widget*, void*v)\r
+       {       ((Fl_Data_Table*)v)->cell_click();      }\r
+       void cell_click();\r
+\r
+public:\r
+       mglDataA *data;\r
+       int nx, ny, sl;\r
+\r
+       Fl_Data_Table(int x, int y, int w, int h, const char *l=0);\r
+    ~Fl_Data_Table() { }\r
+\r
+       void set_value();\r
+    void rows(int val) { if (input->visible()) input->do_callback(); Fl_Table::rows(val); }\r
+    void cols(int val) { if (input->visible()) input->do_callback(); Fl_Table::cols(val); }\r
+    inline int rows() { return Fl_Table::rows(); }\r
+    inline int cols() { return Fl_Table::cols(); }\r
+};\r
+//-----------------------------------------------------------------------------\r
+class ScriptWindow;\r
+struct Fl_MGL : public mglDraw\r
+{\r
+       ScriptWindow *e;\r
+       Fl_MGLView *gr;\r
+       std::vector<std::string> anim;\r
+       mreal delay;\r
+       std::string script;             ///< script with settings\r
+       size_t cur;                             ///< current frame\r
+       double a1, a2, da;              ///< animation loop parameters\r
+\r
+       Fl_MGL(Fl_MGLView *GR);\r
+       ~Fl_MGL();\r
+\r
+       void Reload();                  ///< Function for reloading data\r
+       void Click();                   ///< Callback function on mouse click\r
+       int Draw(mglGraph *);   ///< Drawing itself\r
+       void Param(char id, const char *val);   ///< Function for setting parameter\r
+       void update();                  ///< Update (redraw) plot\r
+       void next_frame();              ///< Show next frame\r
+       void prev_frame();              ///< Show prev frame\r
+       HMGL get_graph()                ///< Get pointer to grapher\r
+       {       return gr->FMGL->get_graph();   }\r
+};\r
+//-----------------------------------------------------------------------------\r
+struct TableWindow\r
+{\r
+public:\r
+       TableWindow(ScriptWindow *e);\r
+       ~TableWindow();\r
+       void update(mglDataA *v);\r
+       void refresh();\r
+       void set_slice(long s);\r
+       inline long get_slice() {       return sl;      }\r
+       inline long num_slice() {       return nz;      }\r
+       void go_home();\r
+       void show()     {       w->show();      }\r
+\r
+       ScriptWindow *main;\r
+       Fl_Counter *slice;\r
+       mglDataA *var;\r
+protected:\r
+       TableWindow(const TableWindow &){}      // copying is not allowed\r
+       Fl_Data_Table *data;\r
+       Fl_Menu_Bar     *menu;\r
+       Fl_Double_Window *w;\r
+//     long nx,ny,nz;\r
+       long nz;\r
+       long sl;                // current slice\r
+       char sl_id[64]; // slice id\r
+};\r
+//-----------------------------------------------------------------------------\r
+class ScriptWindow : public Fl_Double_Window\r
+{\r
+public:\r
+       ScriptWindow(int w, int h, const char* t);\r
+       ~ScriptWindow() {}\r
+\r
+       Fl_Text_Editor *editor;\r
+       Fl_Menu_Bar *menu;\r
+       Fl_Tabs  *rtab;\r
+       Fl_Help_View *hd;\r
+       Fl_Input *link_cmd;\r
+       Fl_Group *ghelp, *gplot;\r
+       Fl_Browser *var;\r
+       Fl_Box *status;\r
+\r
+       void set_status(const char *txt);\r
+       void mem_init();\r
+       void mem_pressed(int n);\r
+       Fl_MGLView *graph;\r
+       Fl_MGL *draw;\r
+};\r
+//-----------------------------------------------------------------------------\r
+class GeneralDlg\r
+{\r
+protected:\r
+       Fl_Double_Window *w;\r
+public:\r
+//     GeneralDlg()    {       mgl_textdomain(NULL);   }\r
+       mglDataA *dat;\r
+       ScriptWindow *e;\r
+       std::string result;\r
+       virtual void cb_ok(){}\r
+       virtual void init()     {       result.clear(); }\r
+       void show()     {       init(); w->show();      }\r
+       void hide()     {       w->hide();      }\r
+       bool wait()     {       while(w->shown())       Fl::wait();     return result.empty();  }\r
+};\r
+void cb_dlg_cancel(Fl_Widget*, void*);\r
+void cb_dlg_ok(Fl_Widget*, void*);\r
+void cb_dlg_only(Fl_Widget*,void *v);\r
+//-----------------------------------------------------------------------------\r
+// Editor window functions\r
+void insert_cb(Fl_Widget *, void *);\r
+//-----------------------------------------------------------------------------\r
+void paste_cb(Fl_Widget *, void *);\r
+void select_all_cb(Fl_Widget *, void *);\r
+void undo_cb(Fl_Widget *, void *);\r
+void copy_cb(Fl_Widget *, void *);\r
+void cut_cb(Fl_Widget *, void *);\r
+void delete_cb(Fl_Widget *, void *);\r
+void changed_cb(int, int nInserted, int nDeleted,int, const char*, void* v);\r
+void ins_fname_cb(Fl_Widget *, void *);\r
+void ins_path_cb(Fl_Widget *, void *);\r
+void ins_fits_cb(Fl_Widget *, void *);\r
+void ins_prim_cb(Fl_Widget *, void *);\r
+void hide_cb(Fl_Widget*, void *);\r
+void unhide_cb(Fl_Widget*, void *);\r
+//-----------------------------------------------------------------------------\r
+// General callback functions\r
+void new_cb(Fl_Widget *, void *);\r
+void open_cb(Fl_Widget *, void *);\r
+void save_cb(Fl_Widget*, void*);\r
+void saveas_cb(Fl_Widget*, void*);\r
+void help_cb(Fl_Widget*, void*);\r
+//-----------------------------------------------------------------------------\r
+// Dialogs callback functions\r
+void close_dlg_cb(Fl_Widget *w, void *);\r
+void font_cb(Fl_Widget *, void *v);\r
+void line_cb(Fl_Widget *, void *v);\r
+void face_cb(Fl_Widget *, void *v);\r
+void data_cb(Fl_Widget *, void *v);\r
+//-----------------------------------------------------------------------------\r
+int check_save(void);\r
+void load_file(const char *newfile, int ipos, ScriptWindow *e);\r
+void save_file(const char *newfile, ScriptWindow *e);\r
+Fl_Widget *add_editor(ScriptWindow *w, int txtW, int wndH);\r
+Fl_Widget *add_mem(ScriptWindow *w);\r
+void set_title(Fl_Window* w);\r
+//-----------------------------------------------------------------------------\r
+// Animation\r
+bool animate_cb(Fl_MGL *dr);\r
+void animate_dlg_cb(Fl_Widget *, void *v);\r
+void fill_animate(const char *text, Fl_MGL *dr);\r
+void argument_set(int id, const char *val);\r
+//-----------------------------------------------------------------------------\r
+Fl_Widget *add_help(ScriptWindow *w);\r
+void help_cb(Fl_Widget*, void*v);\r
+void link_cb(Fl_Widget*, void*v);\r
+void example_cb(Fl_Widget*, void*v);\r
+void about_cb(Fl_Widget*, void*);\r
+//-----------------------------------------------------------------------------\r
+void prop_dlg_cb(Fl_Widget*, void*);\r
+void calc_dlg_cb(Fl_Widget*, void*);\r
+void args_dlg_cb(Fl_Widget*, void*);\r
+void option_dlg_cb(Fl_Widget*, void*);\r
+void dirsel_dlg_cb(Fl_Widget*, void*);\r
+void datsel_dlg_cb(Fl_Widget*, void*);\r
+void style_dlg_cb(Fl_Widget*, void*);\r
+void newcmd_dlg_cb(Fl_Widget*,void*);\r
+void setup_dlg_cb(Fl_Widget*,void *);\r
+void inplot_dlg_cb(Fl_Widget*,void*);\r
+void find_dlg_cb(Fl_Widget*,void*);\r
+void find_next_cb(Fl_Widget*,void*);\r
+void hint_dlg_cb(Fl_Widget*,void*);\r
+void iconlist_cb(Fl_Widget*,void*);\r
+void message_cb(Fl_Widget*,void*);\r
+void message_set(const char *s, ScriptWindow *e);\r
+void info_dlg_cb(mglDataA *d);\r
+void prim_dlg_cb(Fl_Widget*, void* v);\r
+void cb_args_set(const char *val);     ///< set value for argument in newcmd_dlg\r
+//-----------------------------------------------------------------------------\r
+extern Fl_Text_Buffer *textbuf;\r
+extern std::string filename;\r
+extern int     changed;\r
+//-----------------------------------------------------------------------------\r
+#endif\r
+//-----------------------------------------------------------------------------\r
diff --git a/mgllab/mgllab.rc b/mgllab/mgllab.rc
new file mode 100644 (file)
index 0000000..56a99a9
--- /dev/null
@@ -0,0 +1,25 @@
+/* udav.rc is part of UDAV\r
+ * Copyright (C) 2007 Alexey Balakin <balakin@appl.sci-nnov.ru>\r
+ *\r
+ * This program is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Library General Public License\r
+ * as published by the Free Software Foundation\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
+ */\r
+//-----------------------------------------------------------------------------\r
+#include <windows.h>\r
+\r
+#define APPICON 1001\r
+#define APPICON48 1002\r
+\r
+APPICON ICON "udav.ico"\r
+APPICON48 ICON "udav48.ico"\r
+IDI_ICON1               ICON    DISCARDABLE     "udav.ico"\r
diff --git a/mgllab/table.cpp b/mgllab/table.cpp
new file mode 100644 (file)
index 0000000..65400c2
--- /dev/null
@@ -0,0 +1,935 @@
+/* table.cpp is part of UDAV\r
+ * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru>\r
+ *\r
+ * This program is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Library General Public License\r
+ * as published by the Free Software Foundation\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
+ */\r
+#include <FL/Fl_Spinner.H>\r
+#include <FL/Fl_Output.H>\r
+#include <FL/Fl_Float_Input.H>\r
+#include <FL/Fl_Value_Input.H>\r
+#include <FL/Fl_Round_Button.H>\r
+#include "mgllab.h"\r
+\r
+//-----------------------------------------------------------------------------\r
+void addto_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       const char *s = fl_input(_("Enter number for addition to data values"),0);\r
+       HMDT d = dynamic_cast<HMDT>(e->var);\r
+       if(d && s)      {       mgl_data_add_num(d, atof(s));   e->refresh();   }\r
+       HADT c = dynamic_cast<HADT>(e->var);\r
+       if(c && s)      {       mgl_datac_add_num(c, mgl_atoc(s,true)); e->refresh();   }\r
+}\r
+//-----------------------------------------------------------------------------\r
+void subto_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       const char *s = fl_input(_("Enter number for subtraction from data values"),0);\r
+       HMDT d = dynamic_cast<HMDT>(e->var);\r
+       if(d && s)      {       mgl_data_sub_num(d, atof(s));   e->refresh();   }\r
+       HADT c = dynamic_cast<HADT>(e->var);\r
+       if(c && s)      {       mgl_datac_sub_num(c, mgl_atoc(s,true)); e->refresh();   }\r
+}\r
+//-----------------------------------------------------------------------------\r
+void multo_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       const char *s = fl_input(_("Enter number for multiplication of data values"),0);\r
+       HMDT d = dynamic_cast<HMDT>(e->var);\r
+       if(d && s)      {       mgl_data_mul_num(d, atof(s));   e->refresh();   }\r
+       HADT c = dynamic_cast<HADT>(e->var);\r
+       if(c && s)      {       mgl_datac_mul_num(c, mgl_atoc(s,true)); e->refresh();   }\r
+}\r
+//-----------------------------------------------------------------------------\r
+void divto_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       const char *s = fl_input(_("Enter number for division of data values"),0);\r
+       HMDT d = dynamic_cast<HMDT>(e->var);\r
+       if(d && s)      {       mgl_data_div_num(d, atof(s));   e->refresh();   }\r
+       HADT c = dynamic_cast<HADT>(e->var);\r
+       if(c && s)      {       mgl_datac_div_num(c, mgl_atoc(s,true)); e->refresh();   }\r
+}\r
+//-----------------------------------------------------------------------------\r
+class XYZDlg : public GeneralDlg\r
+{\r
+       Fl_Box *box;\r
+       Fl_Check_Button *wch;\r
+       Fl_Spinner *wmx, *wmy, *wmz;\r
+public:\r
+       bool OK;\r
+       double rx()     {       return wmx->value();    }\r
+       double ry()     {       return wmy->value();    }\r
+       double rz()     {       return wmz->value();    }\r
+       double nx()     {       return mgl_int(wmx->value());   }\r
+       double ny()     {       return mgl_int(wmy->value());   }\r
+       double nz()     {       return mgl_int(wmz->value());   }\r
+       double ch()     {       return wch->value();    }\r
+       void setup(const char *desc, const char *ch=NULL)\r
+       {\r
+               if(desc)        box->label(desc);\r
+               if(ch && *ch)\r
+               {       wch->label(ch); wch->activate();        }\r
+               else\r
+               {       wch->label(_("not used"));\r
+                       wch->deactivate();      }\r
+       }\r
+       void init()     {       OK=false;       }\r
+       XYZDlg() : GeneralDlg()\r
+       {\r
+               w = new Fl_Double_Window(325, 125, _("Change data sizes"));\r
+               box = new Fl_Box(10, 10, 305, 40);\r
+               box->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE);\r
+               wmx = new Fl_Spinner(30, 55, 75, 25, "mx");\r
+               wmx->tooltip(_("New size of data on 1st dimension (x-direction)"));\r
+               wmy = new Fl_Spinner(135, 55, 75, 25, "my");\r
+               wmy->tooltip(_("New size of data on 2nd dimension (y-direction)"));\r
+               wmz = new Fl_Spinner(240, 55, 75, 25, "mz");\r
+               wmz->tooltip(_("New size of data on 3d dimension (z-direction)"));\r
+               wch = new Fl_Check_Button(15, 90, 95, 25);\r
+               Fl_Button *o = new Fl_Button(125, 90, 85, 25, _("Cancel"));\r
+               o->tooltip(_("Do nothing and close this window"));      o->callback(cb_dlg_cancel,this);\r
+               o = new Fl_Return_Button(230, 90, 85, 25, _("Change"));\r
+               o->tooltip(_("Change (resize) data"));  o->callback(cb_dlg_ok,this);\r
+               w->end();       w->set_modal(); OK=false;\r
+       }\r
+       void cb_ok()    {       OK=true;        hide(); }\r
+       bool run()      {       OK=false;       w->show();      while(w->shown())       Fl::wait();     return OK;      }\r
+} xyz_dlg;\r
+//-----------------------------------------------------------------------------\r
+void new_dat_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       xyz_dlg.setup(_("Specify new data size\nData will be zero filled"));\r
+       if(xyz_dlg.run())\r
+       {\r
+               HMDT d = dynamic_cast<HMDT>(e->var);\r
+               if(d)\r
+               {       d->Create(xyz_dlg.nx(), xyz_dlg.ny(), xyz_dlg.nz());    e->refresh();   }\r
+               HADT c = dynamic_cast<HADT>(e->var);\r
+               if(c)\r
+               {       c->Create(xyz_dlg.nx(), xyz_dlg.ny(), xyz_dlg.nz());    e->refresh();   }\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
+void resize_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       xyz_dlg.setup(_("Specify new data size\nData will be interpolated"));\r
+       if(xyz_dlg.run())\r
+       {\r
+               HMDT d = dynamic_cast<HMDT>(e->var);\r
+               if(d)\r
+               {       *d = d->Resize(xyz_dlg.nx(), xyz_dlg.ny(), xyz_dlg.nz());       e->refresh();   }\r
+               HADT c = dynamic_cast<HADT>(e->var);\r
+               if(c)\r
+               {       *c = c->Resize(xyz_dlg.nx(), xyz_dlg.ny(), xyz_dlg.nz());       e->refresh();   }\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
+void squeeze_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       xyz_dlg.setup(_("Specify the skipping step\nEach m-th point will be saved only"), _("smoothed"));       if(xyz_dlg.run())\r
+       {\r
+               HMDT d = dynamic_cast<HMDT>(e->var);\r
+               if(d)\r
+               {       d->Squeeze(xyz_dlg.nx(), xyz_dlg.ny(), xyz_dlg.nz(), xyz_dlg.ch());     e->refresh();   }\r
+               HADT c = dynamic_cast<HADT>(e->var);\r
+               if(c)\r
+               {       c->Squeeze(xyz_dlg.nx(), xyz_dlg.ny(), xyz_dlg.nz(), xyz_dlg.ch());     e->refresh();   }\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
+class ChngDlg : public GeneralDlg\r
+{\r
+       Fl_Check_Button *dx, *dy, *dz;\r
+       Fl_Choice *kind, *type;\r
+       Fl_Float_Input *val;\r
+public:\r
+       ChngDlg() : GeneralDlg()\r
+       {\r
+               Fl_Menu_Item k[]={{_("Smooth")}, {_("CumSum")}, { _("Integrate")},\r
+               { _("Difference")}, { _("Double diff.")}, { _("Swap parts")},\r
+               { _("Sinus FFT")}, { _("Cosine FFT")}, { _("Hankel")},\r
+               { _("Mirror")}, { _("Roll")}, { _("Sew phase")}, { _("Envelop")}, {0}};\r
+               Fl_Menu_Item t[]={{_("Linear *3")}, {_("Linear *5")}, {_("Parabolic *5")},{0}};\r
+               w = new Fl_Double_Window(165, 215, _("Change data"));\r
+               kind = new Fl_Choice(10, 25, 145, 25, _("Type of operation"));\r
+               kind->align(FL_ALIGN_TOP_LEFT); kind->copy(k);\r
+               dx = new Fl_Check_Button(10, 55, 140, 25, _("along x"));\r
+               dy = new Fl_Check_Button(10, 80, 140, 25, _("along y"));\r
+               dz = new Fl_Check_Button(10, 105, 140, 25, _("along z"));\r
+               type = new Fl_Choice(10, 145, 145, 25, _("Type of smoothing"));\r
+               type->align(FL_ALIGN_TOP_LEFT); type->copy(t);\r
+               val = new Fl_Float_Input(10, 145, 145, 25, _("Numeric parameter"));\r
+               val->align(FL_ALIGN_TOP_LEFT);\r
+               Fl_Button *o;\r
+               o = new Fl_Button(10, 180, 65, 25, _("Cancel"));        o->callback(cb_dlg_cancel,this);\r
+               o = new Fl_Return_Button(90, 180, 65, 25, _("Do"));     o->callback(cb_dlg_ok,this);\r
+               w->end();       w->set_modal();\r
+       }\r
+       void cb_ok()\r
+       {\r
+               result.clear();\r
+               if(dx->value()) result += 'x';\r
+               if(dy->value()) result += 'y';\r
+               if(dz->value()) result += 'z';\r
+               if(result.empty())\r
+               {       fl_alert(_("You need to specify direction(s)"));        return; }\r
+               if(type->value()==0)    result += '3';\r
+               if(type->value()==1)    result += '5';\r
+               HMDT d = dynamic_cast<HMDT>(dat);\r
+               HADT c = dynamic_cast<HADT>(dat);\r
+               const char *r = result.c_str();\r
+               bool err = false;\r
+               double v = val->value() ? atof(val->value()) : 0;\r
+               if(d)   switch(kind->value())\r
+               {\r
+               case 0: d->Smooth(r);   break;\r
+               case 1: d->CumSum(r);   break;\r
+               case 2: d->Integral(r); break;\r
+               case 3: d->Diff(r);             break;\r
+               case 4: d->Diff2(r);    break;\r
+               case 5: d->Swap(r);             break;\r
+               case 6: d->SinFFT(r);   break;\r
+               case 7: d->CosFFT(r);   break;\r
+               case 8: d->Hankel(r);   break;\r
+               case 9: d->Mirror(r);   break;\r
+               case 10:d->Roll(*r ,v); break;\r
+               case 11:d->Sew(r);              break;\r
+               case 12:d->Envelop(*r); break;\r
+               }\r
+               else if(c)      switch(kind->value())\r
+               {\r
+               case 0: c->Smooth(r);   break;\r
+               case 1: c->CumSum(r);   break;\r
+               case 2: c->Integral(r); break;\r
+               case 3: c->Diff(r);             break;\r
+               case 4: c->Diff2(r);    break;\r
+               case 5: c->Swap(r);             break;\r
+               case 6: c->SinFFT(r);   break;\r
+               case 7: c->CosFFT(r);   break;\r
+               case 8: c->Hankel(r);   break;\r
+               case 9: c->Mirror(r);   break;\r
+               case 10:c->Roll(*r, v); break;\r
+               case 11:err=true;               break;\r
+               case 12:c->Envelop(*r); break;\r
+               }\r
+               else    err=true;\r
+               if(err) fl_alert(_("Operation is not supported for this type of data."));\r
+               else    hide();\r
+       }\r
+       void run(int k, mglDataA *d)\r
+       {\r
+               init(); dat=d;  kind->value(k);\r
+               if(k)   {       type->hide();   val->show();    }\r
+               else    {       type->show();   val->hide();    }\r
+               w->show();      while(w->shown())       Fl::wait();\r
+       }\r
+} chng_dlg;\r
+//-----------------------------------------------------------------------------\r
+void smooth_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       chng_dlg.run(0, e->var);\r
+       if(!chng_dlg.result.empty())    e->refresh();\r
+}\r
+//-----------------------------------------------------------------------------\r
+void cumsum_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       chng_dlg.run(1, e->var);\r
+       if(!chng_dlg.result.empty())    e->refresh();\r
+}\r
+//-----------------------------------------------------------------------------\r
+void integr_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       chng_dlg.run(2, e->var);\r
+       if(!chng_dlg.result.empty())    e->refresh();\r
+}\r
+//-----------------------------------------------------------------------------\r
+void diff_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       chng_dlg.run(3, e->var);\r
+       if(!chng_dlg.result.empty())    e->refresh();\r
+}\r
+//-----------------------------------------------------------------------------\r
+void diff2_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       chng_dlg.run(4, e->var);\r
+       if(!chng_dlg.result.empty())    e->refresh();\r
+}\r
+//-----------------------------------------------------------------------------\r
+void swap_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       chng_dlg.run(5, e->var);\r
+       if(!chng_dlg.result.empty())    e->refresh();\r
+}\r
+//-----------------------------------------------------------------------------\r
+void sinfft_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       chng_dlg.run(6, e->var);\r
+       if(!chng_dlg.result.empty())    e->refresh();\r
+}\r
+//-----------------------------------------------------------------------------\r
+void cosfft_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       chng_dlg.run(7, e->var);\r
+       if(!chng_dlg.result.empty())    e->refresh();\r
+}\r
+//-----------------------------------------------------------------------------\r
+void hankel_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       chng_dlg.run(8, e->var);\r
+       if(!chng_dlg.result.empty())    e->refresh();\r
+}\r
+//-----------------------------------------------------------------------------\r
+void mirror_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       chng_dlg.run(9, e->var);\r
+       if(!chng_dlg.result.empty())    e->refresh();\r
+}\r
+//-----------------------------------------------------------------------------\r
+void roll_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       chng_dlg.run(10, e->var);\r
+       if(!chng_dlg.result.empty())    e->refresh();\r
+}\r
+//-----------------------------------------------------------------------------\r
+void sew_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       chng_dlg.run(11, e->var);\r
+       if(!chng_dlg.result.empty())    e->refresh();\r
+}\r
+//-----------------------------------------------------------------------------\r
+void envelop_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       chng_dlg.run(12, e->var);\r
+       if(!chng_dlg.result.empty())    e->refresh();\r
+}\r
+//-----------------------------------------------------------------------------\r
+class NwdtDlg : public GeneralDlg\r
+{\r
+       Fl_Check_Button *dx, *dy, *dz;\r
+       Fl_Choice *kind;\r
+       Fl_Input *name;\r
+public:\r
+       NwdtDlg() : GeneralDlg()\r
+       {\r
+               Fl_Menu_Item k[]={{_("Summation of")}, {_("Maximum of")}, { _("Minimum of")}, { _("Pulse prop.")}, {0}};\r
+               w = new Fl_Double_Window(165, 215, _("Extract data"));\r
+               kind = new Fl_Choice(10, 25, 145, 25, _("Type of operation"));\r
+               kind->align(FL_ALIGN_TOP_LEFT); kind->copy(k);\r
+               dx = new Fl_Check_Button(10, 55, 140, 25, _("along x"));\r
+               dy = new Fl_Check_Button(10, 80, 140, 25, _("along y"));\r
+               dz = new Fl_Check_Button(10, 105, 140, 25, _("along z"));\r
+               name = new Fl_Input(10, 145, 145, 25, _("Name for output"));\r
+               name->align(FL_ALIGN_TOP_LEFT);\r
+\r
+               Fl_Button *o;\r
+               o = new Fl_Button(10, 180, 65, 25, _("Cancel"));        o->callback(cb_dlg_cancel,this);\r
+               o = new Fl_Return_Button(90, 180, 65, 25, _("Do"));     o->callback(cb_dlg_ok,this);\r
+               w->set_modal(); w->end();\r
+       }\r
+       void cb_ok()\r
+       {\r
+               result.clear();\r
+               if(dx->value()) result += 'x';\r
+               if(dy->value()) result += 'y';\r
+               if(dz->value()) result += 'z';\r
+               if(result.empty())\r
+               {       fl_alert(_("You need to specify direction(s)"));        return; }\r
+               const char *s = name->value();\r
+               if(!s || !s[0])\r
+               {       fl_alert(_("You need to provide output name")); return; }\r
+               mglDataA *out = Parse->AddVar(s);\r
+\r
+               HMDT d = dynamic_cast<HMDT>(dat);\r
+               HADT c = dynamic_cast<HADT>(dat);\r
+               const char *r = result.c_str();\r
+               if(d)   switch(kind->value())\r
+               {\r
+                       case 0: *out = d->Sum(r);       break;\r
+                       case 1: *out = d->Max(r);       break;\r
+                       case 2: *out = d->Min(r);       break;\r
+                       case 3: *out = d->Pulse(*r);break;\r
+               }\r
+               if(c)   switch(kind->value())\r
+               {\r
+                       case 0: *out = c->Sum(r);       break;\r
+                       case 1: *out = c->Max(r);       break;\r
+                       case 2: *out = c->Min(r);       break;\r
+                       case 3: out = mgl_data_pulse(c,*r);     break;\r
+               }\r
+               hide();\r
+       }\r
+       void run(int k, mglDataA *d)\r
+       {\r
+               init(); dat=d;  kind->value(k);\r
+               w->show();      while(w->shown())       Fl::wait();\r
+       }\r
+} nwdt_dlg;\r
+//-----------------------------------------------------------------------------\r
+void asum_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       nwdt_dlg.run(0, e->var);\r
+       if(!chng_dlg.result.empty())    e->refresh();\r
+}\r
+//-----------------------------------------------------------------------------\r
+void amax_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       nwdt_dlg.run(1, e->var);\r
+       if(!chng_dlg.result.empty())    e->refresh();\r
+}\r
+//-----------------------------------------------------------------------------\r
+void amin_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       nwdt_dlg.run(2, e->var);\r
+       if(!chng_dlg.result.empty())    e->refresh();\r
+}\r
+//-----------------------------------------------------------------------------\r
+void pulse_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       nwdt_dlg.run(3, e->var);\r
+       if(!chng_dlg.result.empty())    e->refresh();\r
+}\r
+//-----------------------------------------------------------------------------\r
+void load_dat_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       const char *newfile = mgl_file_chooser(_("Load Data?"),\r
+               _("DAT Files \t*.{dat,csv}\nHDF Files \t*.{h5,hdf}"));\r
+       if(newfile)\r
+       {\r
+               const char *ext = fl_filename_ext(newfile);\r
+               HMDT d = dynamic_cast<HMDT>(e->var);\r
+               HADT c = dynamic_cast<HADT>(e->var);\r
+               if(!strcmp(ext,"h5") || !strcmp(ext,"hdf"))     // this is HDF file\r
+               {       // TODO add dialog with choice of HDF names\r
+                       const char *name = fl_input(_("Enter name of data"),"");\r
+                       if(name)\r
+                       {\r
+                               if(d)   d->ReadHDF(newfile,name);\r
+                               if(c)   c->ReadHDF(newfile,name);\r
+                               e->refresh();\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if(d)   d->Read(newfile);\r
+                       if(c)   c->Read(newfile);\r
+                       e->refresh();\r
+               }\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
+void save_dat_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       const char *newfile = mgl_file_chooser(_("Save Data?"),\r
+               _("DAT Files \t*.{dat,csv}\nHDF Files \t*.{h5,hdf}"), true);\r
+       if(newfile)\r
+       {\r
+               const char *ext = fl_filename_ext(newfile);\r
+               if(!strcmp(ext,"h5") || !strcmp(ext,"hdf"))     // this is HDF file\r
+               {\r
+                       std::string name = wcstombs(e->var->Name());\r
+                       e->var->SaveHDF(newfile, name.c_str());\r
+               }\r
+               else    e->var->Save(newfile);\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
+void exp_dat_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       const char *newfile = mgl_file_chooser(_("Export Data?"),\r
+               _("PNG Files \t*.png"), true);\r
+       if(newfile)\r
+       {       // TODO show dialog for color scheme\r
+               const char *scheme = fl_input(_("Enter color scheme"),MGL_DEF_SCH);\r
+               if(scheme)      e->var->Export(newfile,scheme);\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
+void imp_dat_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       const char *newfile = mgl_file_chooser(_("Import Data?"),\r
+               _("PNG Files \t*.png"));\r
+       HMDT d = dynamic_cast<HMDT>(e->var);\r
+       if(d && newfile)\r
+       {\r
+               const char *scheme = fl_input(_("Enter color scheme"),MGL_DEF_SCH);\r
+               if(scheme)\r
+               {       d->Import(newfile,scheme);      e->refresh();   }\r
+       }\r
+       if(!d)  fl_alert(_("This operation is not supported for this kind of data."));\r
+}\r
+//-----------------------------------------------------------------------------\r
+void list_dat_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       HMDT d = dynamic_cast<HMDT>(e->var);\r
+       HADT c = dynamic_cast<HADT>(e->var);\r
+       if(!d && !c)\r
+       {       fl_message(_("Incorrect type of base data"));   return; }\r
+       if(e->var->GetNz()>1)   fl_message(_("Only current slice will be inserted"));\r
+\r
+       std::string list = "list " + wcstombs(e->var->Name());\r
+       long k=e->get_slice(), nx=e->var->GetNx(), ny=e->var->GetNy();\r
+       for(long j=0;j<ny;j++)\r
+       {\r
+               for(long i=0;i<nx;i++)\r
+               {\r
+                       if(d)   list += '\t'+mgl_str_num(d->a[i+nx*(j+k*ny)]);\r
+                       if(c)   list += '\t'+mgl_str_num(c->a[i+nx*(j+k*ny)]);\r
+               }\r
+               if(j<ny-1)      list += "\t|";\r
+       }\r
+       textbuf->insert(0,list.c_str());\r
+}\r
+//-----------------------------------------------------------------------------\r
+void modify_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       const char *eq=fl_input(_("Enter formula for data modification\nHere x, y, z in range [0,1], u is data value"),0);\r
+       if(eq)\r
+       {\r
+               HMDT d = dynamic_cast<HMDT>(e->var);\r
+               HADT c = dynamic_cast<HADT>(e->var);\r
+               if(d)   {       d->Modify(eq);  e->refresh();   }\r
+               if(c)   {       c->Modify(eq);  e->refresh();   }\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
+class NrmDlg : public GeneralDlg\r
+{\r
+       Fl_Value_Input *wmin, *wmax;\r
+       Fl_Choice *dir;\r
+       Fl_Check_Button *wsym;\r
+public:\r
+       NrmDlg() : GeneralDlg()\r
+       {\r
+               Fl_Menu_Item k[]={{"x"}, {"y"}, { "z"}, {0}};\r
+               w = new Fl_Double_Window(135, 215);\r
+               wmin = new Fl_Value_Input(10, 25, 115, 25, _("Minimal value (v1)"));\r
+               wmin->align(FL_ALIGN_TOP_LEFT);\r
+               wmin->tooltip(_("Minimal value for resulting data values"));\r
+               wmax = new Fl_Value_Input(10, 70, 115, 25, _("Maximal value (v2)"));\r
+               wmax->align(FL_ALIGN_TOP_LEFT);\r
+               wmax->tooltip(_("Maximal value for resulting data values"));\r
+               dir = new Fl_Choice(10, 115, 115, 25, _("Direction"));\r
+               dir->align(FL_ALIGN_TOP_LEFT);  dir->copy(k);   dir->value(0);\r
+               dir->tooltip(_("Direction along which data will be filled"));\r
+               wsym = new Fl_Check_Button(10, 115, 115, 25, _("Symmetrical range"));\r
+               wsym->tooltip(_("Normalize in symmetrical range: -max(|v1|,|v2|) ... max(|v1|,|v2|)"));\r
+\r
+               Fl_Button *o;\r
+               o = new Fl_Button(25, 150, 85, 25, _("Cancel"));        o->callback(cb_dlg_cancel,this);\r
+               o->tooltip(_("Do nothing and close this window"));\r
+               o = new Fl_Return_Button(25, 180, 85, 25, _("Change")); o->callback(cb_dlg_ok,this);\r
+               o->tooltip(_("Change data values and close this window"));\r
+               w->set_modal(); w->end();\r
+       }\r
+       double min()    {       return wmin->value();   }\r
+       double max()    {       return wmax->value();   }\r
+       int sym()               {       return wsym->value();   }\r
+       bool ok()               {       return !result.empty(); }\r
+       void cb_ok()\r
+       {       result = dir->value();  hide(); }\r
+       void run(const char *lbl)\r
+       {\r
+               init(); w->label(lbl?lbl:"");\r
+               w->show();      while(w->shown())       Fl::wait();\r
+       }\r
+} nrm_dlg;\r
+//-----------------------------------------------------------------------------\r
+void fill_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       nrm_dlg.run(_("Fill in range"));\r
+       if(nrm_dlg.ok())\r
+       {\r
+               HMDT d = dynamic_cast<HMDT>(e->var);\r
+               HADT c = dynamic_cast<HADT>(e->var);\r
+               char ch = nrm_dlg.result[0];\r
+               if(d)   {       d->Fill(nrm_dlg.min(),nrm_dlg.max(),ch);        e->refresh();   }\r
+               if(c)   {       c->Fill(nrm_dlg.min(),nrm_dlg.max(),ch);        e->refresh();   }\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
+void normal_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       nrm_dlg.run(_("Fill in range"));\r
+       if(nrm_dlg.ok())\r
+       {\r
+               HMDT d = dynamic_cast<HMDT>(e->var);\r
+               HADT c = dynamic_cast<HADT>(e->var);\r
+               if(d)   {       d->Norm(nrm_dlg.min(),nrm_dlg.max(),nrm_dlg.sym());     e->refresh();   }\r
+               if(c)   {       c->Fill(nrm_dlg.min(),nrm_dlg.max(),nrm_dlg.sym());     e->refresh();   }\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
+struct CropDlg : public GeneralDlg\r
+{\r
+       Fl_Spinner *x1,*x2, *y1,*y2, *z1,*z2;\r
+       CropDlg() : GeneralDlg()\r
+       {\r
+               w = new Fl_Double_Window(230, 155, _("Crop data"));\r
+               x1 = new Fl_Spinner(45, 25, 80, 25, _("From")); x1->align(FL_ALIGN_TOP);\r
+               x2 = new Fl_Spinner(140, 25, 80, 25, _("To"));  x2->align(FL_ALIGN_TOP);\r
+               y1 = new Fl_Spinner(45, 55, 80, 25);\r
+               y2 = new Fl_Spinner(140, 55, 80, 25);\r
+               z1 = new Fl_Spinner(45, 85, 80, 25);\r
+               z2 = new Fl_Spinner(140, 85, 80, 25);\r
+\r
+               new Fl_Box(15, 25, 25, 25, "X");\r
+               new Fl_Box(15, 55, 25, 25, "Y");\r
+               new Fl_Box(15, 85, 25, 25, "Z");\r
+               Fl_Button *o;\r
+               o = new Fl_Button(45, 120, 75, 25, _("Cancel"));        o->callback(cb_dlg_cancel,this);\r
+               o->tooltip(_("Do nothing and close this window"));\r
+               o = new Fl_Return_Button(145, 120, 75, 25, _("OK"));    o->callback(cb_dlg_ok,this);\r
+               o->tooltip(_("Change data values and close this window"));\r
+               w->set_modal(); w->end();\r
+       }\r
+       void init()\r
+       {\r
+               long nx=dat->GetNx(), ny=dat->GetNy(), nz=dat->GetNz();\r
+               x1->range(0,nx-1);      x1->value(0);\r
+               x2->range(0,nx-1);      x2->value(nx-1);\r
+               y1->range(0,nx-1);      y1->value(0);\r
+               y2->range(0,nx-1);      y2->value(ny-1);\r
+               z1->range(0,nx-1);      z1->value(0);\r
+               z2->range(0,nx-1);      z2->value(nz-1);\r
+       }\r
+       void cb_ok()\r
+       {\r
+               long n1,n2;\r
+               HMDT d = dynamic_cast<HMDT>(dat);\r
+               HADT c = dynamic_cast<HADT>(dat);\r
+               n1=mgl_int(x1->value());        n2=mgl_int(x2->value());\r
+               if(d)   d->Crop(n1,n2,'x');\r
+               if(c)   c->Crop(n1,n2,'x');\r
+               n1=mgl_int(y1->value());        n2=mgl_int(y2->value());\r
+               if(d)   d->Crop(n1,n2,'y');\r
+               if(c)   c->Crop(n1,n2,'y');\r
+               n1=mgl_int(z1->value());        n2=mgl_int(z2->value());\r
+               if(d)   d->Crop(n1,n2,'z');\r
+               if(c)   c->Crop(n1,n2,'z');\r
+               hide();\r
+       }\r
+       void run(mglDataA *d)\r
+       {\r
+               dat = d;        init();\r
+               w->show();      while(w->shown())       Fl::wait();\r
+       }\r
+} crop_dlg;\r
+//-----------------------------------------------------------------------------\r
+void crop_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       crop_dlg.run(e->var);   e->refresh();\r
+}\r
+//-----------------------------------------------------------------------------\r
+struct TrspDlg : public GeneralDlg\r
+{\r
+       Fl_Choice *how;\r
+public:\r
+       TrspDlg() : GeneralDlg()\r
+       {\r
+               Fl_Menu_Item k[]={{"yxz"}, {"zxy"}, {"zyx"}, {"yzx"}, {"xzy"}, {0}};\r
+               w = new Fl_Double_Window(200, 90, _("Transpose data"));\r
+               how = new Fl_Choice(10, 20, 180, 25, _("New order of dimensions"));\r
+               how->align(FL_ALIGN_TOP_LEFT);  how->copy(k);   how->value(0);\r
+               Fl_Button *o;\r
+               o = new Fl_Button(30, 55, 75, 25, _("Cancel")); o->callback(cb_dlg_cancel,this);\r
+               o->tooltip(_("Do nothing and close this window"));\r
+               o = new Fl_Return_Button(115, 55, 75, 25, _("Do"));     o->callback(cb_dlg_ok,this);\r
+               o->tooltip(_("Change data values and close this window"));\r
+               w->set_modal(); w->end();\r
+       }\r
+       void cb_ok()\r
+       {\r
+               HMDT d = dynamic_cast<HMDT>(dat);\r
+               HADT c = dynamic_cast<HADT>(dat);\r
+               if(d)   d->Transpose(how->text());\r
+               if(c)   c->Transpose(how->text());\r
+               hide();\r
+       }\r
+       void run(mglDataA *d)\r
+       {\r
+               dat = d;        init();\r
+               w->show();      while(w->shown())       Fl::wait();\r
+       }\r
+} trsp_dlg;\r
+//-----------------------------------------------------------------------------\r
+void transp_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       trsp_dlg.run(e->var);   e->refresh();\r
+}\r
+//-----------------------------------------------------------------------------\r
+void first_sl_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       e->slice->value(0);\r
+       e->set_slice(0);\r
+       e->go_home();\r
+}\r
+//-----------------------------------------------------------------------------\r
+void last_sl_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       e->slice->value(e->num_slice()-1);\r
+       e->set_slice(e->num_slice()-1);\r
+       e->go_home();\r
+}\r
+//-----------------------------------------------------------------------------\r
+void prev_sl_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       int p = int(e->slice->value())-1;\r
+       if(p<0) p = 0;\r
+       e->slice->value(p);             e->set_slice(p);\r
+       e->go_home();\r
+}\r
+//-----------------------------------------------------------------------------\r
+void next_sl_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       int p = int(e->slice->value())+1;\r
+       if(p>=e->num_slice())   p = e->num_slice()-1;\r
+       e->slice->value(p);             e->set_slice(p);\r
+       e->go_home();\r
+}\r
+//-----------------------------------------------------------------------------\r
+void first_cl_cb(Fl_Widget*, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       e->go_home();\r
+}\r
+//-----------------------------------------------------------------------------\r
+void change_sl_cb(Fl_Widget*w, void*v)\r
+{\r
+       TableWindow* e = (TableWindow*)v;\r
+       e->set_slice(long(e->slice->value()));\r
+       e->go_home();\r
+}\r
+//-----------------------------------------------------------------------------\r
+Fl_Menu_Item tablemenu[60] = {\r
+       { _("File"), 0, 0, 0, FL_SUBMENU },\r
+               { _("Load from file"),0, load_dat_cb },\r
+               { _("Import from PNG"),0, imp_dat_cb },\r
+               { _("Save to file"),    0, save_dat_cb },\r
+               { _("Export to PNG"),   0, exp_dat_cb, 0, FL_MENU_DIVIDER },\r
+               { _("Insert as 'list'"),0, list_dat_cb },\r
+//             { _("Plot data"),               0, plot_dat_cb },\r
+//             { _("Info for data"),   0, info_dat_cb },\r
+               { 0 },\r
+       { _("Sizes"), 0, 0, 0, FL_SUBMENU },\r
+               { _("Create new"),      0, new_dat_cb },\r
+               { _("Resize"),          0, resize_cb },\r
+               { _("Squeeze"), 0, squeeze_cb },\r
+               { _("Crop"),            0, crop_cb },\r
+               { _("Transpose"),       0, transp_cb },\r
+//             { _("Extend"),  0, extend_cb },\r
+               { 0 },\r
+       { _("Fill"), 0, 0, 0, FL_SUBMENU },\r
+               { _("By formula"),      0, modify_cb },\r
+               { _("In range"),        0, fill_cb },\r
+               { _("Normalize"),       0, normal_cb },\r
+               { 0 },\r
+       { _("Change"), 0, 0, 0, FL_SUBMENU },\r
+               { _("Smooth"),  0, smooth_cb },\r
+               { _("CumSum"),  0, cumsum_cb },\r
+               { _("Integrate"),       0, integr_cb },\r
+               { _("Difference"),0, diff_cb },\r
+               { _("Laplacian"),       0, diff2_cb },\r
+               { _("Swap parts"),0, swap_cb },\r
+               { _("Sin FFT"), 0, sinfft_cb },\r
+               { _("Cos FFT"), 0, cosfft_cb },\r
+               { _("Hankel"),  0, hankel_cb },\r
+//             { _("Wavelet"), 0, wavelet_cb },\r
+               { _("Mirror"),  0, mirror_cb },\r
+               { _("Roll"),            0, roll_cb },\r
+               { _("Sew phase"),       0, sew_cb },\r
+               { _("Envelop"), 0, envelop_cb },\r
+               { 0 },\r
+       { _("Another"), 0, 0, 0, FL_SUBMENU },\r
+//             { _("Histogram of"),    0, hist_cb },\r
+               { _("Summation of"),    0, asum_cb },\r
+               { _("Maximum of"),      0, amax_cb },\r
+               { _("Minimum of"),      0, amin_cb },\r
+               { _("Pulse prop."),     0, pulse_cb },\r
+               { 0 },\r
+       { _("Operations"), 0, 0, 0, FL_SUBMENU },\r
+               { _("Add to"),          0, addto_cb },\r
+               { _("Subtract to"),0, subto_cb },\r
+               { _("Multiply by"),0, multo_cb },\r
+               { _("Divide by"),       0, divto_cb },\r
+               { 0 },\r
+       { _("Navigation"), 0, 0, 0, FL_SUBMENU },\r
+               { _("First slice"), FL_CTRL + FL_F + 1, first_sl_cb },\r
+               { _("Prev slice"), FL_CTRL + FL_F + 2, prev_sl_cb },\r
+               { _("Next slice"), FL_CTRL + FL_F + 3, next_sl_cb },\r
+               { _("Last slice"),      FL_CTRL + FL_F + 4, last_sl_cb, 0, FL_MENU_DIVIDER },\r
+               { _("First cell"), FL_ALT + FL_F + 1, first_cl_cb },\r
+//             { _("Last cell"), FL_ALT + FL_F + 2, last_cl_cb },\r
+//             { _("Center grid"), FL_ALT + FL_F + 3, center_cl_cb },\r
+               { 0 },\r
+       { 0 }\r
+};\r
+//-----------------------------------------------------------------------------\r
+void plot_dat_cb(Fl_Widget*,void *v)\r
+{\r
+       TableWindow *e=(TableWindow*)v;\r
+       info_dlg_cb(e->var);\r
+}\r
+//-----------------------------------------------------------------------------\r
+#include "../widgets/image.h"\r
+#include "xpm/document-import.xpm"\r
+#include "xpm/document-export.xpm"\r
+#include "xpm/diff.xpm"\r
+#include "xpm/func.xpm"\r
+#include "xpm/size.xpm"\r
+#include "xpm/tran.xpm"\r
+#include "xpm/crop.xpm"\r
+#include "xpm/go-first.xpm"\r
+#include "xpm/go-last.xpm"\r
+TableWindow::TableWindow(ScriptWindow *e)\r
+{\r
+       main = e;\r
+       const int ww = 600, hh = 430;   // initial width (>300) and height (>430)\r
+       w = new Fl_Double_Window(ww,430);               var = 0;\r
+       menu = new Fl_Menu_Bar(0, 0, ww, 30);   menu->copy(tablemenu, this);\r
+       Fl_Button *o;\r
+       Fl_Group *g = new Fl_Group(0,0,30,350);\r
+       o = new Fl_Button(0, 30, 25, 25);       o->image(img_new);\r
+       o->callback(new_dat_cb,this);           o->tooltip(_("Create new data with zero filling"));\r
+       o = new Fl_Button(0, 55, 25, 25);       o->image(img_load);\r
+       o->callback(load_dat_cb,this);          o->tooltip(_("Load data from file"));\r
+       o = new Fl_Button(0, 80, 25, 25);       o->image(new Fl_Pixmap(document_import_xpm));\r
+       o->callback(imp_dat_cb,this);           o->tooltip(_("Import data from PNG file"));\r
+       o = new Fl_Button(0, 105, 25, 25);      o->image(img_save);\r
+       o->callback(save_dat_cb,this);          o->tooltip(_("Save data to file"));\r
+       o = new Fl_Button(0, 130, 25, 25);      o->image(new Fl_Pixmap(document_export_xpm));\r
+       o->callback(exp_dat_cb,this);           o->tooltip(_("Export data to PNG file"));\r
+\r
+       o = new Fl_Button(0, 160, 25, 25);      o->image(img_insert);\r
+       o->callback(list_dat_cb,this);          o->tooltip(_("Insert to script as 'list' command"));\r
+       o = new Fl_Button(0, 185, 25, 25);      o->image(img_plot);\r
+       o->callback(plot_dat_cb,this);          o->tooltip(_("Data information and preview."));\r
+\r
+       o = new Fl_Button(0, 215, 25, 25);      o->image(new Fl_Pixmap(diff_xpm));\r
+       o->callback(smooth_cb,this);            o->tooltip(_("Apply operator (smoothing, integration, difference ...) to data"));\r
+       o = new Fl_Button(0, 240, 25, 25);      o->image(new Fl_Pixmap(func_xpm));\r
+       o->callback(modify_cb,this);            o->tooltip(_("Fill data by formula"));\r
+       o = new Fl_Button(0, 265, 25, 25);      o->image(new Fl_Pixmap(size_xpm));\r
+       o->callback(resize_cb,this);            o->tooltip(_("Resize data with smoothing"));\r
+       o = new Fl_Button(0, 290, 25, 25);      o->image(new Fl_Pixmap(crop_xpm));\r
+       o->callback(crop_cb,this);              o->tooltip(_("Crop (cut off edges) data"));\r
+       o = new Fl_Button(0, 315, 25, 25);      o->image(new Fl_Pixmap(tran_xpm));\r
+       o->callback(transp_cb,this);            o->tooltip(_("Transpose data dimensions"));\r
+       g->end();       g->resizable(0);\r
+\r
+       g = new Fl_Group(30, 30, 200, 30);\r
+       o = new Fl_Button(30, 30, 25, 25);      o->image(new Fl_Pixmap(go_first_xpm));\r
+       o->callback(first_sl_cb,this);          o->tooltip(_("Go to first slice for 3D data (Ctrl-F1)."));\r
+       slice = new Fl_Counter(55, 30, 90, 25, 0);      slice->callback(change_sl_cb,this);\r
+       slice->lstep(10);       slice->step(1); slice->tooltip(_("Id of slice on third (z-) dimension"));\r
+       o = new Fl_Button(147, 30, 25, 25);     o->image(new Fl_Pixmap(go_last_xpm));\r
+       o->callback(last_sl_cb,this);           o->tooltip(_("Go to last slice for 3D data (Ctrl-F4)."));\r
+       g->end();       g->resizable(0);\r
+\r
+       data = new Fl_Data_Table(30,60,ww-30,hh-60);\r
+       data->row_header(1);    data->row_header_width(80);\r
+       data->row_resize(1);    data->rows(1);\r
+       data->row_height_all(25);\r
+       data->col_header(1);    data->col_header_height(25);\r
+       data->col_resize(1);    data->cols(1);\r
+       data->col_width_all(80);\r
+       data->tooltip(_("Colors denote values: magenta - local max, cyan - local min,\n"\r
+       "\tred - Re(v)>0, blue - Re(v)<0, purple - Im(v)>0, teal - Im(v)<0."));\r
+\r
+       w->end();       w->resizable(data);\r
+}\r
+//-----------------------------------------------------------------------------\r
+TableWindow::~TableWindow()    {       if(var) var->o=NULL;    Fl::delete_widget(w);   }\r
+//-----------------------------------------------------------------------------\r
+void delete_cb(void *v)\r
+{\r
+       if(v)\r
+       {\r
+               TableWindow *w = (TableWindow *)v;\r
+               w->var->o=NULL;         delete w;\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
+void TableWindow::update(mglDataA *v)\r
+{\r
+       static std::string name;\r
+       if(v==0)        return;\r
+       name = wcstombs(v->Name());\r
+       w->label(name.c_str());\r
+       v->func = delete_cb;\r
+       if(var) var->o = 0;\r
+       var = v;        v->o = this;\r
+       refresh();\r
+}\r
+//-----------------------------------------------------------------------------\r
+void TableWindow::refresh()\r
+{\r
+       if(var==0)      return;\r
+       w->deactivate();        nz = var->GetNz();\r
+       sl = 0; slice->range(0,nz-1);\r
+\r
+       data->rows(var->GetNy());       data->cols(var->GetNx());\r
+       data->ny = var->GetNy();        data->nx = var->GetNx();\r
+       data->data = var;\r
+       w->activate();\r
+//     show();\r
+}\r
+//-----------------------------------------------------------------------------\r
+void TableWindow::set_slice(long s)\r
+{\r
+       if(s>=0 && s<nz)\r
+       {\r
+               data->sl = sl = s;\r
+               refresh();\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
+void TableWindow::go_home()\r
+{\r
+}\r
+//-----------------------------------------------------------------------------\r
diff --git a/mgllab/todo.txt b/mgllab/todo.txt
new file mode 100644 (file)
index 0000000..60867bc
--- /dev/null
@@ -0,0 +1,8 @@
+1. Start/Stop on single button
+2. Update FLTK icons
+3. Flat toolbuttons
+4. Detach data table
+5. Menu items to show/hide extra toolbars
+6. Update help or graph only if paths are changed
+7. Common colors in format dialog
+8. Show graph on update
diff --git a/mgllab/udav.ico b/mgllab/udav.ico
new file mode 100644 (file)
index 0000000..27423de
Binary files /dev/null and b/mgllab/udav.ico differ
diff --git a/mgllab/udav.png b/mgllab/udav.png
new file mode 100644 (file)
index 0000000..76ba7d9
Binary files /dev/null and b/mgllab/udav.png differ
diff --git a/mgllab/udav48.ico b/mgllab/udav48.ico
new file mode 100644 (file)
index 0000000..a286d6d
Binary files /dev/null and b/mgllab/udav48.ico differ
diff --git a/mgllab/xpm/accessories-calculator.xpm b/mgllab/xpm/accessories-calculator.xpm
new file mode 100644 (file)
index 0000000..20a11f8
--- /dev/null
@@ -0,0 +1,103 @@
+/* XPM */
+static const char *accessories_calculator_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 81 1 ",
+"  c #313131",
+". c #313231",
+"X c gray21",
+"o c #363736",
+"O c gray22",
+"+ c gray23",
+"@ c #3C3C3C",
+"# c gray24",
+"$ c #3E3E3E",
+"% c #414141",
+"& c #424342",
+"* c gray27",
+"= c gray28",
+"- c #494B48",
+"; c #4B4B4B",
+": c #4D4D4C",
+"> c gray30",
+", c #656565",
+"< c gray40",
+"1 c #676965",
+"2 c #686A67",
+"3 c DimGray",
+"4 c #6C6C6C",
+"5 c #6D6D6D",
+"6 c #727371",
+"7 c #747674",
+"8 c #757774",
+"9 c #767676",
+"0 c #777777",
+"q c #797979",
+"w c gray48",
+"e c #7C7C7C",
+"r c #9BAB90",
+"t c #9DAD92",
+"y c gray72",
+"u c gray",
+"i c #B3C2A9",
+"p c #BDCAB5",
+"a c #BFCBB7",
+"s c #C0CCB7",
+"d c #C1C1C1",
+"f c gray76",
+"g c #C3C3C3",
+"h c gray77",
+"j c #C6C6C6",
+"k c gray78",
+"l c #C8C8C8",
+"z c #CACACA",
+"x c gray80",
+"c c #CECECE",
+"v c gray81",
+"b c gray82",
+"n c LightGray",
+"m c gray83",
+"M c #D5D5D5",
+"N c gray84",
+"B c #D7D7D7",
+"V c #D8D8D8",
+"C c gray85",
+"Z c #DADADA",
+"A c gray86",
+"S c gainsboro",
+"D c gray87",
+"F c #DFDFDF",
+"G c gray88",
+"H c #E1E1E1",
+"J c #E2E2E2",
+"K c gray89",
+"L c #E4E4E4",
+"P c gray90",
+"I c #E6E6E6",
+"U c #E7E7E7",
+"Y c gray91",
+"T c #EAEAEA",
+"R c gray92",
+"E c #ECECEC",
+"W c gray93",
+"Q c #EEEEEE",
+"! c gray94",
+"~ c gray95",
+"^ c None",
+/* pixels */
+"^^^*qeqq8080>^^^",
+"^^^c068873->g^^^",
+"^^^n3spsitr1g^^^",
+"^^^c;>&o  @$u^^^",
+"^^^GhlhgggghI^^^",
+"^^^F$$W$OG$$R^^^",
+"^^^AW~RIIRR~R^^^",
+"^^^B$$I$OA$$G^^^",
+"^^^nWWGGGGYEG^^^",
+"^^^n$$G$$A$$G^^^",
+"^^^cIGFAFFIYG^^^",
+"^^^c$$A$OB&$F^^^",
+"^^^lABBBnAXOA^^^",
+"^^^l$OB$OB  B^^^",
+"^^^ynBBBBAGFc^^^",
+"^^^-,,,,,344*^^^"
+};
diff --git a/mgllab/xpm/alpha.xpm b/mgllab/xpm/alpha.xpm
new file mode 100644 (file)
index 0000000..102c0e1
--- /dev/null
@@ -0,0 +1,126 @@
+/* XPM */
+static const char * alpha_xpm[] = {
+"16 16 107 2",
+"      c None",
+".     c #395155",
+"+     c #3A5155",
+"@     c #384F54",
+"#     c #4C6A71",
+"$     c #68929C",
+"%     c #B8FFFF",
+"&     c #B1F9FF",
+"*     c #B7FFFF",
+"=     c #6B939C",
+"-     c #113F4A",
+";     c #7CADB9",
+">     c #B4FCFF",
+",     c #84BAC8",
+"'     c #51585B",
+")     c #78888C",
+"!     c #79898D",
+"~     c #4D4D4D",
+"{     c #17B0D6",
+"]     c #2CE0FF",
+"^     c #1D99B8",
+"/     c #1F282B",
+"(     c #A1E2F3",
+"_     c #ABF0FF",
+":     c #ACF2FF",
+"<     c #658187",
+"[     c #E1FFFF",
+"}     c #D7F8FF",
+"|     c #D7F9FF",
+"1     c #D7F7FF",
+"2     c #428494",
+"3     c #28D6FF",
+"4     c #2AD6FF",
+"5     c #26C3EA",
+"6     c #1A88A2",
+"7     c #346974",
+"8     c #7BB8C6",
+"9     c #9FDEEE",
+"0     c #97D4E3",
+"a     c #C2E2E9",
+"b     c #D6F8FF",
+"c     c #C5E6ED",
+"d     c #2DB7DA",
+"e     c #2AD1FB",
+"f     c #23BFE6",
+"g     c #0B6A81",
+"h     c #42B0CC",
+"i     c #4DB0C8",
+"j     c #3A575C",
+"k     c #7B878A",
+"l     c #7D8A8E",
+"m     c #7D8A8D",
+"n     c #3B4A4E",
+"o     c #0586A5",
+"p     c #00BEED",
+"q     c #005A70",
+"r     c #317F93",
+"s     c #56DFFF",
+"t     c #47AEC7",
+"u     c #7ADDF6",
+"v     c #81ECFF",
+"w     c #84F0FF",
+"x     c #2F7E90",
+"y     c #00DBFF",
+"z     c #0094B9",
+"A     c #3FA4BC",
+"B     c #4CC5E4",
+"C     c #72D1E7",
+"D     c #7FE4FE",
+"E     c #80E5FF",
+"F     c #78D1E8",
+"G     c #0EABD1",
+"H     c #00BBEA",
+"I     c #51D4F4",
+"J     c #3A7888",
+"K     c #85EEFF",
+"L     c #60C0D8",
+"M     c #00B7E6",
+"N     c #0096BB",
+"O     c #215764",
+"P     c #3FA7C0",
+"Q     c #70C6DC",
+"R     c #83ECFF",
+"S     c #378599",
+"T     c #00B1DE",
+"U     c #4AC5E4",
+"V     c #447B89",
+"W     c #82E8FF",
+"X     c #84E4FD",
+"Y     c #007696",
+"Z     c #00556A",
+"`     c #0A1A1E",
+" .    c #4FC5E2",
+"..    c #75D1E8",
+"+.    c #81E7FF",
+"@.    c #598B98",
+"#.    c #00B1DF",
+"$.    c #235C69",
+"%.    c #6BC4DA",
+"&.    c #82E6FF",
+"*.    c #148099",
+"=.    c #2C5B65",
+"-.    c #74D6F0",
+";.    c #074F61",
+">.    c #13353F",
+",.    c #67B8C9",
+"'.    c #0E191C",
+"            . + + @             ",
+"        # $ % & & * = -         ",
+"      ; > , ' ) ! ~ { ] ^       ",
+"  / ( _ : < [ } | 1 2 3 4 5 6   ",
+"  7 8 9 0 a b } } b c d e f g   ",
+"    h i j k l l l l m n o p q   ",
+"    r s t u v v v v w x y z     ",
+"      A B C D E E E F G H       ",
+"        I J K D E E L M N       ",
+"        O P Q E E R S T         ",
+"          U V W E X Y Z         ",
+"          `  ...+.@.#.          ",
+"            $.%.&.*.            ",
+"              =.-.;.            ",
+"              >.,.              ",
+"                '.              "};
diff --git a/mgllab/xpm/arc.xpm b/mgllab/xpm/arc.xpm
new file mode 100644 (file)
index 0000000..28f80a1
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * arc_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"     ......     ",
+"   ..      ..   ",
+"  .          .  ",
+"              . ",
+"              . ",
+"               .",
+"               .",
+"               .",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/arrow-down-double.xpm b/mgllab/xpm/arrow-down-double.xpm
new file mode 100644 (file)
index 0000000..29408f8
--- /dev/null
@@ -0,0 +1,129 @@
+/* XPM */
+static const char *arrow_down_double_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 107 2 ",
+"   c #045304",
+".  c #0A5E0A",
+"X  c #185C18",
+"o  c #1A5D1A",
+"O  c #0B600B",
+"+  c #037503",
+"@  c #007800",
+"#  c #007801",
+"$  c #007F01",
+"%  c #0C720C",
+"&  c #146715",
+"*  c #166417",
+"=  c #107411",
+"-  c #117A11",
+";  c #1A781A",
+":  c #197C19",
+">  c #276827",
+",  c #296C29",
+"<  c #2F6A2F",
+"1  c #267626",
+"2  c #307430",
+"3  c #357235",
+"4  c #347B34",
+"5  c #367B36",
+"6  c #3C743C",
+"7  c #008100",
+"8  c #008300",
+"9  c #008201",
+"0  c #008202",
+"q  c #008800",
+"w  c #008900",
+"e  c #008C05",
+"r  c #048608",
+"t  c #0B830B",
+"y  c #048D08",
+"u  c #009600",
+"i  c #009105",
+"p  c #009A00",
+"a  c #009F00",
+"s  c #049F04",
+"d  c #099109",
+"f  c #0A910A",
+"g  c #099C09",
+"h  c #0A9B0C",
+"j  c #0C8A10",
+"k  c #128414",
+"l  c #108A13",
+"z  c #158C17",
+"x  c #1D8B1D",
+"c  c #00A000",
+"v  c #00A400",
+"b  c #00A700",
+"n  c #00AA00",
+"m  c #08A208",
+"M  c #00B200",
+"N  c #00B300",
+"B  c #00B400",
+"V  c #00B800",
+"C  c #00BC00",
+"Z  c #00BE00",
+"A  c #0DB40E",
+"S  c #11A612",
+"D  c #15AC17",
+"F  c #17A118",
+"G  c #1BAE1C",
+"H  c #1ABE1B",
+"J  c #1E8B21",
+"K  c #1E9521",
+"L  c #2D812D",
+"P  c #239823",
+"I  c #249F24",
+"U  c #318E31",
+"Y  c #388138",
+"T  c #3A853A",
+"R  c #3A8F3A",
+"E  c #359635",
+"W  c #309C30",
+"Q  c #379837",
+"!  c #3B9F3B",
+"~  c #1EA321",
+"^  c #27A127",
+"/  c #21A424",
+"(  c #2BA02B",
+")  c #00C500",
+"_  c #00C700",
+"`  c #00D300",
+"'  c #438343",
+"]  c #408840",
+"[  c #418D41",
+"{  c #468B46",
+"}  c #4A964A",
+"|  c #4E9F4E",
+" . c #5F9B5F",
+".. c #40A240",
+"X. c #44A344",
+"o. c #49A249",
+"O. c #4FA04F",
+"+. c #50A050",
+"@. c #58A958",
+"#. c #5DAB5D",
+"$. c #64A464",
+"%. c #63AD63",
+"&. c #72A572",
+"*. c #72B672",
+"=. c #75B675",
+"-. c #80BA80",
+";. c None",
+/* pixels */
+";.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.",
+";.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.",
+";.;.< 6 2 1 ; - # 7 7 7 z J i ;.",
+";.;.X &. .{ L : # 8 w w 7 K ;.;.",
+";.;.;.> $.} U x w u c c F y ;.;.",
+";.;.;.;.5 +.E P u b B A h ;.;.;.",
+";.;.3 ' Y O.! ^ s M ) H D ~ e ;.",
+";.;.X -.*.@...^ m M _ ` Z / ;.;.",
+";.;.;., =.#.X.( g n B Z G r ;.;.",
+";.;.;.;.5 %.o.W f p b S j ;.;.;.",
+";.;.;.;.;.] | E t w f l ;.;.;.;.",
+";.;.;.;.;.  [ R % + k ;.;.;.;.;.",
+";.;.;.;.;.;.. T O = ;.;.;.;.;.;.",
+";.;.;.;.;.;.;.& * ;.;.;.;.;.;.;.",
+";.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.",
+";.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;."
+};
diff --git a/mgllab/xpm/arrow-down.xpm b/mgllab/xpm/arrow-down.xpm
new file mode 100644 (file)
index 0000000..b11d8aa
--- /dev/null
@@ -0,0 +1,85 @@
+/* XPM */
+static const char *arrow_down_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 63 1 ",
+"  c #004D00",
+". c #055205",
+"X c #045D04",
+"o c #0D5D0D",
+"O c #0B620C",
+"+ c #057005",
+"@ c #077A07",
+"# c #0C760E",
+"$ c #0B7F0D",
+"% c #156716",
+"& c #1D6A1E",
+"* c #327032",
+"= c #068206",
+"- c #008A00",
+"; c #008D03",
+": c #09810C",
+"> c #009001",
+", c #029102",
+"< c #009D00",
+"1 c #009E01",
+"2 c #0D920E",
+"3 c #178F17",
+"4 c #16981A",
+"5 c #00A300",
+"6 c #00A500",
+"7 c #00A902",
+"8 c #00AB02",
+"9 c #00AE00",
+"0 c #00B800",
+"q c #00BA00",
+"w c #05B805",
+"e c #15A017",
+"r c #18A11B",
+"t c #16AA18",
+"y c ForestGreen",
+"u c #2D882D",
+"i c #2F942F",
+"p c #2D9D2D",
+"a c #348C34",
+"s c #388238",
+"d c #3A853A",
+"f c #25A425",
+"g c #25A328",
+"h c #2AA22A",
+"j c #3AA23A",
+"k c #3EA33E",
+"l c #00CC00",
+"z c #00D000",
+"x c #418141",
+"c c #458545",
+"v c #4A844A",
+"b c #469246",
+"n c #479C47",
+"m c #4D904D",
+"M c #4E974E",
+"N c #43A043",
+"B c #52A752",
+"V c #57A957",
+"C c #5BA95B",
+"Z c #6BB26B",
+"A c #70B670",
+"S c #83C183",
+"D c None",
+/* pixels */
+"DDDDDDDDDDDDDDDD",
+"DDDDDDDDDDDDDDDD",
+"DDDDDDDDDDDDDDDD",
+"DDDDDDDDDDDDDDDD",
+"D vcduy3;<88tg;D",
+"DD*SZBjf60lzw4DD",
+"DDDxAVkh<9qqrDDD",
+"DDDDmCNp,<6eDDDD",
+"DDDD.Mni=-2:DDDD",
+"DDDDDoba+@$DDDDD",
+"DDDDDD%sX#DDDDDD",
+"DDDDDDD&ODDDDDDD",
+"DDDDDDDDDDDDDDDD",
+"DDDDDDDDDDDDDDDD",
+"DDDDDDDDDDDDDDDD",
+"DDDDDDDDDDDDDDDD"
+};
diff --git a/mgllab/xpm/arrow-left-double.xpm b/mgllab/xpm/arrow-left-double.xpm
new file mode 100644 (file)
index 0000000..a687b9b
--- /dev/null
@@ -0,0 +1,128 @@
+/* XPM */
+static const char *arrow_left_double_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 106 2 ",
+"   c #034703",
+".  c #004E00",
+"X  c #015B01",
+"o  c #085408",
+"O  c #0D5C0E",
+"+  c #0F5C0F",
+"@  c #016E01",
+"#  c #096809",
+"$  c #007500",
+"%  c #007F00",
+"&  c #0D7D0F",
+"*  c #166517",
+"=  c #1F671F",
+"-  c #0E7010",
+";  c #2C6A2C",
+":  c #237D23",
+">  c #2D792D",
+",  c #337133",
+"<  c #347F34",
+"1  c #3A773A",
+"2  c #3C743C",
+"3  c #397939",
+"4  c #3D7E3D",
+"5  c #008A00",
+"6  c #008C00",
+"7  c #008F00",
+"8  c #038E06",
+"9  c #09820C",
+"0  c #09890A",
+"q  c #009000",
+"w  c #039406",
+"e  c #069706",
+"r  c #009900",
+"t  c #009A00",
+"y  c #009A02",
+"u  c #009D00",
+"i  c #009E00",
+"p  c #0C920D",
+"a  c #108211",
+"s  c #118611",
+"d  c #138513",
+"f  c #1B811B",
+"g  c #0F9611",
+"h  c #159315",
+"j  c #139815",
+"k  c #169518",
+"l  c #19971B",
+"z  c #189B18",
+"x  c #1B9E1B",
+"c  c #189B1C",
+"v  c #1A9A1E",
+"b  c #1E9D1F",
+"n  c #1F9D1F",
+"m  c #00A000",
+"M  c #00A300",
+"N  c #00A500",
+"B  c #01A401",
+"V  c #00AB00",
+"C  c #00AE00",
+"Z  c #07AD07",
+"A  c #00B302",
+"S  c #00B500",
+"D  c #00B600",
+"F  c #00B700",
+"G  c #00B800",
+"H  c #00BA00",
+"J  c #00BB00",
+"K  c #16AB18",
+"L  c #17B819",
+"P  c #278927",
+"I  c #259825",
+"U  c #2B922B",
+"Y  c #2B942B",
+"T  c #299C2C",
+"R  c #308830",
+"E  c #398539",
+"W  c #309B30",
+"Q  c #349F34",
+"!  c #3A9F3A",
+"~  c #3E9D3E",
+"^  c #29A52C",
+"/  c #00C900",
+"(  c #07CD07",
+")  c #408240",
+"_  c #458145",
+"`  c #458245",
+"'  c #468746",
+"]  c #409040",
+"[  c #479447",
+"{  c #439943",
+"}  c #449944",
+"|  c #499149",
+" . c #499F49",
+".. c #509350",
+"X. c #529052",
+"o. c #589B58",
+"O. c #4EA44E",
+"+. c #52A552",
+"@. c #57A557",
+"#. c #5BA45B",
+"$. c #5DA35D",
+"%. c #6BB16B",
+"&. c #70AA70",
+"*. c #70B370",
+"=. c #83C083",
+"-. c None",
+/* pixels */
+"-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.",
+"-.-.-.-.-.-.-.-.-.. -.-.-.. -.-.",
+"-.-.-.-.-.-.-.-., _ -.-.; 2 -.-.",
+"-.-.-.-.-.-.-._ =.) -.4 &.3 -.-.",
+"-.-.-.-.-.o ..*.%.E | $.o.> -.-.",
+"-.-.-.-.+ ..#.@.+.O. .} ] : -.-.",
+"-.-.-.* ' [ { ~ ! Q W Y P f -.-.",
+"-.-.= 1 < R U I I x z h s d -.-.",
+"-.-.+   X @ 5 q m N N t 6 0 -.-.",
+"-.-.-.- # $ 5 i C G A C t p -.-.",
+"-.-.-.-.& & 6 N G ( / G m g -.-.",
+"-.-.-.-.-.& l N J L A A i j -.-.",
+"-.-.-.-.-.-.-.n Z K -.t e k -.-.",
+"-.-.-.-.-.-.-.-.c ^ -.-.c T -.-.",
+"-.-.-.-.-.-.-.-.-.8 -.-.-.w -.-.",
+"-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-."
+};
diff --git a/mgllab/xpm/arrow-left.xpm b/mgllab/xpm/arrow-left.xpm
new file mode 100644 (file)
index 0000000..d4de224
--- /dev/null
@@ -0,0 +1,86 @@
+/* XPM */
+static const char *arrow_left_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 64 1 ",
+"  c #034703",
+". c #004E00",
+"X c #075307",
+"o c #015B01",
+"O c #0D5C0E",
+"+ c #0F5C0F",
+"@ c #026F02",
+"# c #096809",
+"$ c #007500",
+"% c #007F00",
+"& c #0D7D0F",
+"* c #186619",
+"= c #1F671F",
+"- c #0E7010",
+"; c #327032",
+": c #337E33",
+"> c #397639",
+", c #008A00",
+"< c #008F00",
+"1 c #038E06",
+"2 c #09820C",
+"3 c #009000",
+"4 c #009D00",
+"5 c #09960A",
+"6 c #108211",
+"7 c #19971B",
+"8 c #1C931C",
+"9 c #1A9A1E",
+"0 c #1E9D1F",
+"q c #00A500",
+"w c #01A401",
+"e c #00AE00",
+"r c #07AD07",
+"t c #0CA40D",
+"y c #00BA00",
+"u c #00BB00",
+"i c #16AB18",
+"p c #0FB011",
+"a c #13B415",
+"s c #248D24",
+"d c #2F872F",
+"f c #2D892D",
+"g c #239E23",
+"h c #279927",
+"j c #2D922D",
+"k c #3A853A",
+"l c #3A9F3A",
+"z c #3E9D3E",
+"x c #29A52C",
+"c c #438143",
+"v c #458545",
+"b c #468746",
+"n c #4A844A",
+"m c #4F8E4F",
+"M c #479447",
+"N c #439943",
+"B c #4F934F",
+"V c #52A552",
+"C c #57A557",
+"Z c #5BA45B",
+"A c #6BB16B",
+"S c #70B370",
+"D c #83C083",
+"F c None",
+/* pixels */
+"FFFFFFFFFFFFFFFF",
+"FFFFFFFFFFF.FFFF",
+"FFFFFFFFFF;nFFFF",
+"FFFFFFFFFcDbFFFF",
+"FFFFFFFXmSAkFFFF",
+"FFFFFF+BZCVfFFFF",
+"FFFFF*bMNzlsFFFF",
+"FFFF=>:djhg8FFFF",
+"FFFF+ o@%345FFFF",
+"FFFFF-#$,4etFFFF",
+"FFFFFF&6<wupFFFF",
+"FFFFFFF27wuaFFFF",
+"FFFFFFFFF0riFFFF",
+"FFFFFFFFFF9xFFFF",
+"FFFFFFFFFFF1FFFF",
+"FFFFFFFFFFFFFFFF"
+};
diff --git a/mgllab/xpm/arrow-right-double.xpm b/mgllab/xpm/arrow-right-double.xpm
new file mode 100644 (file)
index 0000000..1e6ee90
--- /dev/null
@@ -0,0 +1,128 @@
+/* XPM */
+static const char *arrow_right_double_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 106 2 ",
+"   c #004E00",
+".  c #035C03",
+"X  c #085408",
+"o  c #0F5F0F",
+"O  c #016F01",
+"+  c #0D650E",
+"@  c #007B00",
+"#  c #097B09",
+"$  c #0D7F0F",
+"%  c #166917",
+"&  c #1F6E1F",
+"*  c #0E7610",
+"=  c #117911",
+"-  c #137D13",
+";  c #1B7B1B",
+":  c #2C682C",
+">  c #237723",
+",  c #277F27",
+"<  c #2D752D",
+"1  c #337133",
+"2  c #397539",
+"3  c #3C733C",
+"4  c #3D7C3D",
+"5  c #018001",
+"6  c #008500",
+"7  c #008700",
+"8  c #068206",
+"9  c #008900",
+"0  c #008A00",
+"q  c #008C00",
+"w  c #038E06",
+"e  c #09800A",
+"r  c #09820C",
+"t  c #0C870D",
+"y  c #009000",
+"u  c #009202",
+"i  c #039406",
+"p  c #009900",
+"a  c #009A00",
+"s  c #009D00",
+"d  c #009E00",
+"f  c #0F8B11",
+"g  c #158915",
+"h  c #138D15",
+"j  c #168B18",
+"k  c #109411",
+"l  c #189618",
+"z  c #18961C",
+"x  c #1B9D1B",
+"c  c #1A9C1E",
+"v  c #00A000",
+"b  c #00A300",
+"n  c #00A500",
+"m  c #00A502",
+"M  c #00AB00",
+"N  c #00AE00",
+"B  c #00B600",
+"V  c #00B700",
+"C  c #00B800",
+"Z  c #00BB00",
+"A  c #01BA01",
+"S  c #07B807",
+"D  c #19A21B",
+"F  c #1FA11F",
+"G  c #1EA31F",
+"H  c #16AA18",
+"J  c #17B619",
+"K  c #2B8D2B",
+"L  c #28942B",
+"P  c #2B9C2B",
+"I  c #348B34",
+"U  c #3A833A",
+"Y  c #398539",
+"T  c #309530",
+"R  c #309730",
+"E  c #349E34",
+"W  c #25A125",
+"Q  c #28A42B",
+"!  c #3AA23A",
+"~  c #3EA33E",
+"^  c #00CC00",
+"/  c #07CA07",
+"(  c #00D000",
+")  c #408240",
+"_  c #458145",
+"`  c #458345",
+"'  c #408840",
+"]  c #469246",
+"[  c #449444",
+"{  c #479C47",
+"}  c #499049",
+"|  c #499C49",
+" . c #529452",
+".. c #509950",
+"X. c #589658",
+"o. c #5D9F5D",
+"O. c #43A043",
+"+. c #4EA34E",
+"@. c #52A752",
+"#. c #57A957",
+"$. c #5BA95B",
+"%. c #6BB26B",
+"&. c #70A670",
+"*. c #70B570",
+"=. c #83C183",
+"-. c None",
+/* pixels */
+"-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.",
+"-.-.  -.-.-.  -.-.-.-.-.-.-.-.-.",
+"-.-.3 : -.-._ 1 -.-.-.-.-.-.-.-.",
+"-.-.2 &.4 -.) =._ -.-.-.-.-.-.-.",
+"-.-.< X.o.} Y %.*. .X -.-.-.-.-.",
+"-.-.> ' [ | +.@.$.$...o -.-.-.-.",
+"-.-.; , K R E ! ~ O.{ ] % -.-.-.",
+"-.-.- = g l x F W P R I Y & -.-.",
+"-.-.# @ q a b n s y 5 O . + -.-.",
+"-.-.t 6 a M B Z N s 0 # * -.-.-.",
+"-.-.f 0 s B / ^ Z n k $ -.-.-.-.",
+"-.-.h 0 s m J ( Z D r -.-.-.-.-.",
+"-.-.j 8 y -.H S F -.-.-.-.-.-.-.",
+"-.-.L z -.-.Q c -.-.-.-.-.-.-.-.",
+"-.-.i -.-.-.w -.-.-.-.-.-.-.-.-.",
+"-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-."
+};
diff --git a/mgllab/xpm/arrow-right.xpm b/mgllab/xpm/arrow-right.xpm
new file mode 100644 (file)
index 0000000..4b1246f
--- /dev/null
@@ -0,0 +1,92 @@
+/* XPM */
+static const char *arrow_right_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 70 1 ",
+"  c #004E00",
+". c #005700",
+"X c #055905",
+"o c #0D570D",
+"O c #0A5C0A",
+"+ c #195F19",
+"@ c #006200",
+"# c #006300",
+"$ c #026C03",
+"% c #086608",
+"& c #0C630D",
+"* c #066F08",
+"= c #047405",
+"- c #037803",
+"; c #007F00",
+": c #007E02",
+"> c #067C07",
+", c #117A12",
+"< c #236B23",
+"1 c #2D782D",
+"2 c #327A32",
+"3 c #327F32",
+"4 c #018801",
+"5 c #09820C",
+"6 c #0B880E",
+"7 c #0C8D0F",
+"8 c #009400",
+"9 c #009700",
+"0 c #059B05",
+"q c #0C8F11",
+"w c #0F9213",
+"e c #129115",
+"r c #149216",
+"t c #119615",
+"y c #00A100",
+"u c #00A600",
+"i c #04A604",
+"p c #00B000",
+"a c #00B400",
+"s c #06BB06",
+"d c #0CB00C",
+"f c #0BBC0B",
+"g c #16B117",
+"h c #2E992E",
+"j c #368836",
+"k c #319031",
+"l c #25A325",
+"z c #2AA02A",
+"x c #2AA52A",
+"c c #2CA92E",
+"v c #3CA23C",
+"b c #3EA43E",
+"n c #00C400",
+"m c #00C500",
+"M c #08D008",
+"N c #09D509",
+"B c #459E45",
+"V c #499A49",
+"C c #40A240",
+"Z c #55A855",
+"A c #55A955",
+"S c #5CA75C",
+"D c #59A959",
+"F c #6BAF6B",
+"G c #6DB36D",
+"H c #6DB46D",
+"J c #70AC70",
+"K c #7BAD7B",
+"L c #85C185",
+"P c None",
+/* pixels */
+"PPPPPPPPPPPPPPPP",
+"PPPPPPPPPPPPPPPP",
+"PPPP KoPPPPPPPPP",
+"PPPP LJ+PPPPPPPP",
+"PPPP.GHG<PPPPPPP",
+"PPPP@ZZDS1PPPPPP",
+"PPPP$bvCBV3XPPPP",
+"PPPP=xlzhkj2&PPP",
+"PPPP>iy84-@O%PPP",
+"PPPP5sau8;,*PPPP",
+"PPPP6Mmp0;PPPPPP",
+"PPPPqNmdrPPPPPPP",
+"PPPPwfgePPPPPPPP",
+"PPPPtcqPPPPPPPPP",
+"PPPPPPPPPPPPPPPP",
+"PPPPPPPPPPPPPPPP"
+};
diff --git a/mgllab/xpm/arrow-up-double.xpm b/mgllab/xpm/arrow-up-double.xpm
new file mode 100644 (file)
index 0000000..bedf985
--- /dev/null
@@ -0,0 +1,132 @@
+/* XPM */
+static const char *arrow_up_double_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 110 2 ",
+"   c #0B4C0B",
+".  c #045304",
+"X  c #0A5D0A",
+"o  c #185D18",
+"O  c #1A5D1A",
+"+  c #036103",
+"@  c #0C600C",
+"#  c #007300",
+"$  c #0B720B",
+"%  c #097E09",
+"&  c #146315",
+"*  c #106B11",
+"=  c #127D14",
+"-  c #256426",
+";  c #276927",
+":  c #296B29",
+">  c #2F6B2F",
+",  c #267C26",
+"<  c #277829",
+"1  c #357235",
+"2  c #307930",
+"3  c #367836",
+"4  c #347D34",
+"5  c #3A793A",
+"6  c #3C783C",
+"7  c #008800",
+"8  c #008900",
+"9  c #008E00",
+"0  c #048608",
+"q  c #0A820A",
+"w  c #088609",
+"e  c #048D08",
+"r  c #009600",
+"t  c #009700",
+"y  c #009A00",
+"u  c #009D00",
+"i  c #009F00",
+"p  c #099109",
+"a  c #0B900C",
+"s  c #0A910C",
+"d  c #089C08",
+"f  c #0C8A10",
+"g  c #108613",
+"h  c #168416",
+"j  c #1C801C",
+"k  c #198919",
+"l  c #0F9610",
+"z  c #119412",
+"x  c #129714",
+"c  c #159617",
+"v  c #15971A",
+"b  c #1D951D",
+"n  c #159D1A",
+"m  c #00A000",
+"M  c #00A400",
+"N  c #00A500",
+"B  c #00A700",
+"V  c #04A004",
+"C  c #00AA00",
+"Z  c #00B000",
+"A  c #00B200",
+"S  c #00B300",
+"D  c #00B400",
+"F  c #00B700",
+"G  c #00B800",
+"H  c #00BC00",
+"J  c #15AD17",
+"K  c #1BA21C",
+"L  c #17AD18",
+"P  c #1E9421",
+"I  c #1E9D21",
+"U  c #2D8A2D",
+"Y  c #239E23",
+"T  c #249F24",
+"R  c #279D27",
+"E  c #2B992B",
+"W  c #358B35",
+"Q  c #388138",
+"!  c #3A833A",
+"~  c #309230",
+"^  c #319431",
+"/  c #379C37",
+"(  c #3B9F3B",
+")  c #1EA421",
+"_  c #21A124",
+"`  c #00C500",
+"'  c #00C700",
+"]  c #0DC60E",
+"[  c #1AC11B",
+"{  c #408340",
+"}  c #438343",
+"|  c #418541",
+" . c #469246",
+".. c #449F44",
+"X. c #4E974E",
+"o. c #499B49",
+"O. c #4A9B4A",
+"+. c #5F9F5F",
+"@. c #40A040",
+"#. c #4FA04F",
+"$. c #50A350",
+"%. c #58A758",
+"&. c #5DA85D",
+"*. c #64A764",
+"=. c #63A863",
+"-. c #72A872",
+";. c #72B572",
+":. c #75B475",
+">. c #80BA80",
+",. c None",
+/* pixels */
+",.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.",
+",.,.,.,.,.,.,.,.< ,.,.,.,.,.,.,.",
+",.,.,.,.,.,.,.& - ,.,.,.,.,.,.,.",
+",.,.,.,.,.,.X 5   * ,.,.,.,.,.,.",
+",.,.,.,.,.. | ! @ + = ,.,.,.,.,.",
+",.,.,.,.,.{ X.W $ # % g ,.,.,.,.",
+",.,.,.,.3 =.o.~ q 7 9 z f ,.,.,.",
+",.,.,.: :.&...E p y N N K 0 ,.,.",
+",.,.O >.;.%.@.R d C G H S _ ,.,.",
+",.,.1 | ! #.( T V S ' [ J ) v ,.",
+",.,.,.,.4 #./ Y u S ` ] s ,.,.,.",
+",.,.,.; *.O.^ b r N D D L e ,.,.",
+",.,.O -.+. .U k 7 r m m r I ,.,.",
+",.,.> 6 2 , j h w s l x c P n ,.",
+",.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.",
+",.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,."
+};
diff --git a/mgllab/xpm/arrow-up.xpm b/mgllab/xpm/arrow-up.xpm
new file mode 100644 (file)
index 0000000..4d1e744
--- /dev/null
@@ -0,0 +1,86 @@
+/* XPM */
+static const char *arrow_up_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 64 1 ",
+"  c #004D00",
+". c #044804",
+"X c #055205",
+"o c #055D05",
+"O c #0D5A0D",
+"+ c #076707",
+"@ c #007500",
+"# c #067106",
+"$ c #0C710E",
+"% c #0B7D0D",
+"& c #156216",
+"* c #1A661B",
+"= c #1D631E",
+"- c #327032",
+"; c #347F34",
+": c #387638",
+"> c #028002",
+", c #008A00",
+"< c #008F00",
+"1 c #008E03",
+"2 c #038E06",
+"3 c #09810C",
+"4 c #0D810E",
+"5 c #009000",
+"6 c #009D00",
+"7 c #09960A",
+"8 c #159517",
+"9 c #16961A",
+"0 c #1C931C",
+"q c #00A400",
+"w c #00A500",
+"e c #00AE00",
+"r c #05AC05",
+"t c #0CA40D",
+"y c #00BA00",
+"u c #00BB00",
+"i c #16AB18",
+"p c #0FB011",
+"a c #13B415",
+"s c #258D25",
+"d c #2F872F",
+"f c #2D892D",
+"g c #259F25",
+"h c #2D932D",
+"j c #2A9A2A",
+"k c #3A853A",
+"l c #3A9F3A",
+"z c #3E9D3E",
+"x c #27A429",
+"c c #418041",
+"v c #458545",
+"b c #468946",
+"n c #4A844A",
+"m c #4D8C4D",
+"M c #479447",
+"N c #439943",
+"B c #4E924E",
+"V c #52A552",
+"C c #57A557",
+"Z c #5BA45B",
+"A c #6BB16B",
+"S c #70B370",
+"D c #83C083",
+"F c None",
+/* pixels */
+"FFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFFF",
+"FFFFFFF=*FFFFFFF",
+"FFFFFF&:.$FFFFFF",
+"FFFFFOb;o+%FFFFF",
+"FFFFXBMd#@43FFFF",
+"FFFFmZNh>,<8FFFF",
+"FFFcSCzj56qq<FFF",
+"FF-DAVlg6euur9FF",
+"F nvkfs07tpaix2F",
+"FFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFFF"
+};
diff --git a/mgllab/xpm/arrow_a.xpm b/mgllab/xpm/arrow_a.xpm
new file mode 100644 (file)
index 0000000..457c0aa
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * arrow_a_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"                ",
+"                ",
+"         ...    ",
+"       ....     ",
+"     .....      ",
+"   ......       ",
+" ...............",
+"   ......       ",
+"     .....      ",
+"       ....     ",
+"         ...    ",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/arrow_d.xpm b/mgllab/xpm/arrow_d.xpm
new file mode 100644 (file)
index 0000000..834f703
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * arrow_d_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"                ",
+"                ",
+"     .          ",
+"    ...         ",
+"   .....        ",
+"  .......       ",
+" ...............",
+"  .......       ",
+"   .....        ",
+"    ...         ",
+"     .          ",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/arrow_i.xpm b/mgllab/xpm/arrow_i.xpm
new file mode 100644 (file)
index 0000000..a8c617e
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * arrow_i_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"                ",
+" ..             ",
+" ..             ",
+" ..             ",
+" ..             ",
+" ..             ",
+" ...............",
+" ..             ",
+" ..             ",
+" ..             ",
+" ..             ",
+" ..             ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/arrow_k.xpm b/mgllab/xpm/arrow_k.xpm
new file mode 100644 (file)
index 0000000..840d325
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * arrow_k_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"                ",
+" ..             ",
+" ..      ...    ",
+" ..    ....     ",
+" ..  .....      ",
+" ........       ",
+" ...............",
+" ........       ",
+" ..  .....      ",
+" ..    ....     ",
+" ..      ...    ",
+" ..             ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/arrow_n.xpm b/mgllab/xpm/arrow_n.xpm
new file mode 100644 (file)
index 0000000..305238b
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * arrow_n_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"  ..............",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/arrow_o.xpm b/mgllab/xpm/arrow_o.xpm
new file mode 100644 (file)
index 0000000..6f4b583
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * arrow_o_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"                ",
+"                ",
+"    ....        ",
+"   ......       ",
+"  ........      ",
+"  ........      ",
+"  ..............",
+"  ........      ",
+"  ........      ",
+"  .......       ",
+"    ....        ",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/arrow_s.xpm b/mgllab/xpm/arrow_s.xpm
new file mode 100644 (file)
index 0000000..ddeeb7f
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * arrow_s_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"                ",
+"                ",
+"  ........      ",
+"  ........      ",
+"  ........      ",
+"  ........      ",
+"  ..............",
+"  ........      ",
+"  ........      ",
+"  ........      ",
+"  ........      ",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/arrow_t.xpm b/mgllab/xpm/arrow_t.xpm
new file mode 100644 (file)
index 0000000..71ff9dc
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * arrow_t_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"                ",
+"                ",
+"         ..     ",
+"       ....     ",
+"     ......     ",
+"   ........     ",
+" ...............",
+"   ........     ",
+"     ......     ",
+"       ....     ",
+"         ..     ",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/arrow_v.xpm b/mgllab/xpm/arrow_v.xpm
new file mode 100644 (file)
index 0000000..038a3e5
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * arrow_v_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"                ",
+"                ",
+"  ...           ",
+"   ....         ",
+"    .....       ",
+"     ......     ",
+"     ...........",
+"     ......     ",
+"    .....       ",
+"   ....         ",
+"  ...           ",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/axis.xpm b/mgllab/xpm/axis.xpm
new file mode 100644 (file)
index 0000000..65014f1
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * axis_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+" ..             ",
+"  .             ",
+"  .             ",
+" ..             ",
+"  .             ",
+"  .             ",
+" ..             ",
+"  .             ",
+"  .             ",
+" ..             ",
+"  .             ",
+"  .             ",
+" .............. ",
+"  .   .   .   . ",
+"                "};
diff --git a/mgllab/xpm/axis_sh.xpm b/mgllab/xpm/axis_sh.xpm
new file mode 100644 (file)
index 0000000..d09869f
--- /dev/null
@@ -0,0 +1,22 @@
+/* XPM */
+static const char * axis_sh_xpm[] = {
+"16 16 3 1",
+"      c None",
+".     c #000000",
+"+     c #FF0000",
+"                ",
+"  .             ",
+". .      +      ",
+"  .     +++     ",
+"  .      +      ",
+". .   +  +  +   ",
+"  .  +++++++++  ",
+"  .   +  +  +   ",
+". .      +      ",
+"  .     +++     ",
+"  .      +      ",
+". .             ",
+"  .             ",
+"  ............. ",
+".               ",
+"  .  .  .  .  . "};
diff --git a/mgllab/xpm/barrow_a.xpm b/mgllab/xpm/barrow_a.xpm
new file mode 100644 (file)
index 0000000..8545b8f
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+const char * barrow_a_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"                ",
+"                ",
+"    ...         ",
+"     ....       ",
+"      .....     ",
+"       ......   ",
+"............... ",
+"       ......   ",
+"      .....     ",
+"     ....       ",
+"    ...         ",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/barrow_d.xpm b/mgllab/xpm/barrow_d.xpm
new file mode 100644 (file)
index 0000000..fe133de
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+const char * barrow_d_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"                ",
+"                ",
+"          .     ",
+"         ...    ",
+"        .....   ",
+"       .......  ",
+"............... ",
+"       .......  ",
+"        .....   ",
+"         ...    ",
+"          .     ",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/barrow_i.xpm b/mgllab/xpm/barrow_i.xpm
new file mode 100644 (file)
index 0000000..54e91ad
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+const char * barrow_i_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"                ",
+"             .. ",
+"             .. ",
+"             .. ",
+"             .. ",
+"             .. ",
+"............... ",
+"             .. ",
+"             .. ",
+"             .. ",
+"             .. ",
+"             .. ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/barrow_k.xpm b/mgllab/xpm/barrow_k.xpm
new file mode 100644 (file)
index 0000000..be962b1
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+const char * barrow_k_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"                ",
+"             .. ",
+"    ...      .. ",
+"     ....    .. ",
+"      .....  .. ",
+"       ........ ",
+"............... ",
+"       ........ ",
+"      .....  .. ",
+"     ....    .. ",
+"    ...      .. ",
+"             .. ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/barrow_n.xpm b/mgllab/xpm/barrow_n.xpm
new file mode 100644 (file)
index 0000000..7d2b54c
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+const char * barrow_n_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"..............  ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/barrow_o.xpm b/mgllab/xpm/barrow_o.xpm
new file mode 100644 (file)
index 0000000..a0ea264
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+const char * barrow_o_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"                ",
+"                ",
+"        ....    ",
+"       ......   ",
+"      ........  ",
+"      ........  ",
+"..............  ",
+"      ........  ",
+"      ........  ",
+"       .......  ",
+"        ....    ",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/barrow_s.xpm b/mgllab/xpm/barrow_s.xpm
new file mode 100644 (file)
index 0000000..f19c4d8
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+const char * barrow_s_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"                ",
+"                ",
+"      ........  ",
+"      ........  ",
+"      ........  ",
+"      ........  ",
+"..............  ",
+"      ........  ",
+"      ........  ",
+"      ........  ",
+"      ........  ",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/barrow_t.xpm b/mgllab/xpm/barrow_t.xpm
new file mode 100644 (file)
index 0000000..06e23d5
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+const char * barrow_t_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"                ",
+"                ",
+"     ..         ",
+"     ....       ",
+"     ......     ",
+"     ........   ",
+"............... ",
+"     ........   ",
+"     ......     ",
+"     ....       ",
+"     ..         ",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/barrow_v.xpm b/mgllab/xpm/barrow_v.xpm
new file mode 100644 (file)
index 0000000..b31d4d2
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+const char * barrow_v_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"                ",
+"                ",
+"           ...  ",
+"         ....   ",
+"       .....    ",
+"     ......     ",
+"...........     ",
+"     ......     ",
+"       .....    ",
+"         ....   ",
+"           ...  ",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/box.xpm b/mgllab/xpm/box.xpm
new file mode 100644 (file)
index 0000000..23260d1
--- /dev/null
@@ -0,0 +1,22 @@
+/* XPM */
+static const char * box_xpm[] = {
+"16 16 3 1",
+"      c None",
+".     c #000000",
+"+     c #666666",
+"                ",
+"      ......... ",
+"     .+      .. ",
+"    . +     . . ",
+"   .  +    .  . ",
+"  .   +   .   . ",
+" .........    . ",
+" .    +  .    . ",
+" .    +  .    . ",
+" .    +++.++++. ",
+" .   +   .   .  ",
+" .  +    .  .   ",
+" . +     . .    ",
+" .+      ..     ",
+" .........      ",
+"                "};
diff --git a/mgllab/xpm/comment.xpm b/mgllab/xpm/comment.xpm
new file mode 100644 (file)
index 0000000..1aebddd
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * comment_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #009f00",
+"                ",
+"                ",
+"                ",
+"     .    .     ",
+"     .    .     ",
+"     .    .     ",
+"  ............  ",
+"     .    .     ",
+"     .    .     ",
+"     .    .     ",
+"     .    .     ",
+"  ............  ",
+"     .    .     ",
+"     .    .     ",
+"     .    .     ",
+"                "};
diff --git a/mgllab/xpm/cons.xpm b/mgllab/xpm/cons.xpm
new file mode 100644 (file)
index 0000000..b22b0f4
--- /dev/null
@@ -0,0 +1,23 @@
+/* XPM */
+static const char * cons_xpm[] = {
+"16 16 4 1",
+"      c None",
+".     c #000000",
+"+     c #0000FF",
+"@     c #FF0000",
+"                ",
+" .............. ",
+" .            . ",
+" . . . . . . .. ",
+" .            . ",
+" . . . . . . .. ",
+" .............. ",
+"                ",
+"  +++++++++++++ ",
+"    +++++++++   ",
+"      +++++     ",
+"        +       ",
+" @@@@@@@@@@@@@@ ",
+" @ @ @ @ @ @ @@ ",
+" @@@@@@@@@@@@@@ ",
+"                "};
diff --git a/mgllab/xpm/copy.xpm b/mgllab/xpm/copy.xpm
new file mode 100644 (file)
index 0000000..bfaecb1
--- /dev/null
@@ -0,0 +1,23 @@
+/* XPM */
+static const char * copy_xpm[] = {
+"16 16 4 1",
+"      c None",
+".     c #000000",
+"+     c #FFFFFF",
+"@     c #808080",
+"                ",
+"                ",
+"  ........      ",
+"  .++++++.@     ",
+"  .+@@@@+.@     ",
+"  .++........   ",
+"  .+@.++++++.@  ",
+"  .++.+....+.@  ",
+"  .+@.++++++.@  ",
+"  .++.+....+.@  ",
+"  ....++++++.@  ",
+"    @.+....+.@  ",
+"     .++++++.@  ",
+"     ........@  ",
+"      @@@@@@@@  ",
+"                "};
diff --git a/mgllab/xpm/crop.xpm b/mgllab/xpm/crop.xpm
new file mode 100644 (file)
index 0000000..e18a730
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * crop_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"     .          ",
+"                ",
+"     .          ",
+"                ",
+" . . ......     ",
+"     .    .     ",
+"     .    .     ",
+"     .    .     ",
+"     .    .     ",
+"     ...... . . ",
+"                ",
+"          .     ",
+"                ",
+"          .     ",
+"                "};
diff --git a/mgllab/xpm/curve.xpm b/mgllab/xpm/curve.xpm
new file mode 100644 (file)
index 0000000..88e37e3
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * curve_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"               .",
+"               .",
+"              . ",
+"              . ",
+"             .  ",
+"            .   ",
+"          ..    ",
+"        ..      ",
+"      ..        ",
+"    ..          ",
+"   .            ",
+"  .             ",
+" .              ",
+" .              ",
+".               ",
+".               "};
diff --git a/mgllab/xpm/dash_d.xpm b/mgllab/xpm/dash_d.xpm
new file mode 100644 (file)
index 0000000..6892ce6
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * dash_d_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+".   .   .   .   ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/dash_e.xpm b/mgllab/xpm/dash_e.xpm
new file mode 100644 (file)
index 0000000..13eaf63
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * dash_e_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+". . . . . . . . ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/dash_i.xpm b/mgllab/xpm/dash_i.xpm
new file mode 100644 (file)
index 0000000..2ad1f1c
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * dash_i_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+".. . .. . .. . .",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/dash_j.xpm b/mgllab/xpm/dash_j.xpm
new file mode 100644 (file)
index 0000000..70a9cc4
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * dash_j_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"....  .  ....  .",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/dash_l.xpm b/mgllab/xpm/dash_l.xpm
new file mode 100644 (file)
index 0000000..4346c08
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * dash_l_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"....    ....    ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/dash_m.xpm b/mgllab/xpm/dash_m.xpm
new file mode 100644 (file)
index 0000000..7cd2b39
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * dash_m_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"..  ..  ..  ..  ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/dash_s.xpm b/mgllab/xpm/dash_s.xpm
new file mode 100644 (file)
index 0000000..4edb6c5
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * dash_s_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"................",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/delete.xpm b/mgllab/xpm/delete.xpm
new file mode 100644 (file)
index 0000000..a191ea2
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * delete_xpm[] = {
+"16 16 2 1",
+"      c none",
+".     c #000000",
+"                ",
+"                ",
+"                ",
+"  ...      ...  ",
+"   ...    ...   ",
+"    ...  ...    ",
+"     ......     ",
+"      ....      ",
+"      ....      ",
+"     ......     ",
+"    ...  ...    ",
+"   ...    ...   ",
+"  ...      ...  ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/dialog-information.xpm b/mgllab/xpm/dialog-information.xpm
new file mode 100644 (file)
index 0000000..3cad076
--- /dev/null
@@ -0,0 +1,138 @@
+/* XPM */
+static const char *dialog_information_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 116 2 ",
+"   c gray19",
+".  c #393936",
+"X  c #5E5E3E",
+"o  c #3A4A77",
+"O  c #3A4B77",
+"+  c #3B4B77",
+"@  c #3D4C76",
+"#  c #3D4D76",
+"$  c #384978",
+"%  c #384A79",
+"&  c #394A79",
+"*  c #394B7A",
+"=  c #3A4B7A",
+"-  c #3B4C78",
+";  c #3C4D78",
+":  c #3E4E79",
+">  c #464646",
+",  c #435177",
+"<  c #40507A",
+"1  c #41517B",
+"2  c #45547E",
+"3  c #46557F",
+"4  c #4A577A",
+"5  c #80805C",
+"6  c #8A8B66",
+"7  c #475780",
+"8  c #485883",
+"9  c #4B5B83",
+"0  c #495985",
+"q  c #4A5A86",
+"w  c #546083",
+"e  c #586383",
+"r  c #5E6880",
+"t  c #4B7EB2",
+"y  c #5E8DBA",
+"u  c #608EBC",
+"i  c #7E91B1",
+"p  c #7E90B2",
+"a  c #779DC5",
+"s  c #789DC4",
+"d  c #A8AA84",
+"f  c #A6AC98",
+"g  c #A7AD98",
+"h  c #ABB198",
+"j  c #8C9BB8",
+"k  c #8D9CB8",
+"l  c #98A4BD",
+"z  c #9AA5BE",
+"x  c #DDDFAB",
+"c  c #D3D5B0",
+"v  c #E3E6BA",
+"b  c #87A8CC",
+"n  c #91AECD",
+"m  c #9BAEC8",
+"M  c #9DB9D6",
+"N  c #A4ADC3",
+"B  c #A5BED8",
+"V  c #A6BED8",
+"C  c #A9C0D9",
+"Z  c #AAC1D9",
+"A  c #B7C2D5",
+"S  c #B9C4D6",
+"D  c #B5C6DA",
+"F  c #B5C7DB",
+"G  c #B5CAE0",
+"H  c #C1CCD7",
+"J  c #EBEDC1",
+"K  c #F3F6C9",
+"L  c #F5F8CA",
+"P  c #C2D0E0",
+"I  c #C0D0E3",
+"U  c #C5D2E1",
+"Y  c #C1D2E4",
+"T  c #C2D3E4",
+"R  c #C3D3E4",
+"E  c #C5D5E5",
+"W  c #C7D6E5",
+"Q  c #C9D6E7",
+"!  c #C8D7E8",
+"~  c #CBD9E8",
+"^  c #CCD9E8",
+"/  c #CEDBE9",
+"(  c #D0D5E0",
+")  c #D2DAE2",
+"_  c #D0DDEB",
+"`  c #D3DFEB",
+"'  c #D4E0EC",
+"]  c #D4E0ED",
+"[  c #D6E1ED",
+"{  c #D8E2ED",
+"}  c #D9E3EE",
+"|  c #DEE7F1",
+" . c #DFE7F2",
+".. c #DFE8F2",
+"X. c #E0E5ED",
+"o. c #E0E6EC",
+"O. c #E2E7EF",
+"+. c #E0E9F2",
+"@. c #E2EAF3",
+"#. c #E8EFF4",
+"$. c #E8EFF5",
+"%. c #EDEFF4",
+"&. c #EBF0F5",
+"*. c #EBF0F6",
+"=. c #ECF1F7",
+"-. c #EFF3F7",
+";. c #EEF3F8",
+":. c #F3F7FA",
+">. c #F4F7FA",
+",. c #F5F8FA",
+"<. c #F7F9FB",
+"1. c #FAFBFD",
+"2. c #FAFCFD",
+"3. c #FCFCFD",
+"4. c white",
+"5. c None",
+/* pixels */
+"5.5.5.5.5.= o $ $ o # 5.5.5.5.5.",
+"5.5.5.5.- N %.4.,.X.z ; 5.5.5.5.",
+"5.5.5.; ( ,.&.@.} ` [ S 1 5.5.5.",
+"5.5.# N ,.;.:.&.+.[ R E k , 5.5.",
+"5.5.; &.&.>.2.&.| ` Y s U 7 5.5.",
+"5.5.= 1.+.;.4.4.4.4.H 5./ - 5.5.",
+"5.5.= >.[ | 4.&.} ) n 5.Q = 5.5.",
+"5.5.2 X.^ ! 4.I F B 5.y F 0 5.5.",
+"5.5.4 l ' C 4.V b 5.t Z p w 5.5.",
+"5.5.5.9 A I a 4.5.y Z m 0 5.5.5.",
+"5.5.5.5.2 k I ^ E F p 0 5.5.5.5.",
+"5.5.5.5.5.e 9 g g h r 5.5.5.5.5.",
+"5.5.5.5.5.5.X J L x X 5.5.5.5.5.",
+"5.5.5.5.5.5.X 5 d 6 X 5.5.5.5.5.",
+"5.5.5.5.5.5.X v K c X 5.5.5.5.5.",
+"5.5.5.5.5.5.5.. >   5.5.5.5.5.5."
+};
diff --git a/mgllab/xpm/diff.xpm b/mgllab/xpm/diff.xpm
new file mode 100644 (file)
index 0000000..b90448a
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * diff_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"                ",
+"   ..           ",
+"  .  .   .      ",
+"     .  .       ",
+"  ....  .       ",
+" .   . .  ..    ",
+" .  .  . .  .   ",
+"  ..  .     .   ",
+"      .  ....   ",
+"     .  .   .   ",
+"     .  .  . . .",
+"    .    ..   . ",
+"             . .",
+"                ",
+"                "};
diff --git a/mgllab/xpm/diff2.xpm b/mgllab/xpm/diff2.xpm
new file mode 100644 (file)
index 0000000..7a2d7eb
--- /dev/null
@@ -0,0 +1,22 @@
+/* XPM */
+static const char * diff2_xpm[] = {
+"16 16 3 1",
+"      c None",
+".     c #000000",
+"+     c #7F7F7F",
+"                ",
+"                ",
+"                ",
+"                ",
+"       .        ",
+"       ..       ",
+"      .+..      ",
+"     +. ..+     ",
+"     .   ..     ",
+"    .+   +..    ",
+"   +.     ..+   ",
+"   .       ..   ",
+"  .+       +..  ",
+"  ............  ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/document-export.xpm b/mgllab/xpm/document-export.xpm
new file mode 100644 (file)
index 0000000..b1119d2
--- /dev/null
@@ -0,0 +1,169 @@
+/* XPM */
+static const char *document_export_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 147 2 ",
+"   c #4E6A7D",
+".  c #58787A",
+"X  c #667173",
+"o  c #627075",
+"O  c #B30000",
+"+  c #B60000",
+"@  c #BB0000",
+"#  c #E60000",
+"$  c #EE1200",
+"%  c #E21D00",
+"&  c #E92400",
+"*  c #EA2400",
+"=  c #FF3500",
+"-  c #FE3C00",
+";  c #F94100",
+":  c #FA4200",
+">  c #FB4D00",
+",  c #FC5500",
+"<  c #FE5F00",
+"1  c #F86B00",
+"2  c #F97200",
+"3  c #FF7400",
+"4  c #FE7E00",
+"5  c #F88F01",
+"6  c #EF9800",
+"7  c #FF9100",
+"8  c #F89A00",
+"9  c #F99A00",
+"0  c #FF9A00",
+"q  c #ECA307",
+"w  c #FDB701",
+"e  c #FDA917",
+"r  c #BDFB3F",
+"t  c #F2C505",
+"y  c #FAC004",
+"u  c #F0CA07",
+"i  c #F8C805",
+"p  c #F2D10B",
+"a  c #DDE01B",
+"s  c #DDFE1F",
+"d  c #ECEA10",
+"f  c #E3FF18",
+"g  c #D2EA2B",
+"h  c #C7FF34",
+"j  c #E4E822",
+"k  c #BDD552",
+"l  c #AFFA4D",
+"z  c #B7F746",
+"x  c #BBFF41",
+"c  c #B2FA4B",
+"v  c #AAFF53",
+"b  c #94FB69",
+"n  c #8BFF72",
+"m  c #85FE79",
+"M  c #80F87D",
+"N  c #A0FE7E",
+"B  c #0024B3",
+"V  c #38678B",
+"C  c #37698D",
+"Z  c #3D698A",
+"A  c #3B6B8F",
+"S  c #3D6B8E",
+"D  c #3F6C8E",
+"F  c #4A6D85",
+"G  c #436E88",
+"H  c #4A7180",
+"J  c #41749A",
+"K  c #44789F",
+"L  c #547D9B",
+"P  c #6B7F88",
+"I  c #0029CA",
+"U  c #0037E9",
+"Y  c #0037EC",
+"T  c #0035F2",
+"R  c #0039FF",
+"E  c #003DFE",
+"W  c #0041FF",
+"Q  c #0045FC",
+"!  c #0057FF",
+"~  c #006CFF",
+"^  c #006DFF",
+"/  c #0074F6",
+"(  c #5186AF",
+")  c #5892BD",
+"_  c #688BA0",
+"`  c #6E99B6",
+"'  c #7798B0",
+"]  c #719FBF",
+"[  c #6EF18E",
+"{  c #75F389",
+"}  c #59FEA3",
+"|  c #51FFAC",
+" . c #49FEB4",
+".. c #43FABA",
+"X. c #53F8BE",
+"o. c #0082FF",
+"O. c #009FFF",
+"+. c #328AFE",
+"@. c #02ABF0",
+"#. c #00AEFF",
+"$. c #03BDFB",
+"%. c #739FC0",
+"&. c #79A7CA",
+"*. c #21CBDE",
+"=. c #1CFFDF",
+"-. c #2FE6CE",
+";. c #3DF5C0",
+":. c #32FFCA",
+">. c #2BECD2",
+",. c #28FFD3",
+"<. c #17CDE7",
+"1. c #13DBEB",
+"2. c #0ED7F0",
+"3. c #08D3F4",
+"4. c #0BDAF2",
+"5. c #3BC4F1",
+"6. c #16FFE5",
+"7. c #13FFE9",
+"8. c #0BEBF1",
+"9. c #8BA4AF",
+"0. c #92A6AC",
+"q. c #95A9AF",
+"w. c #9AAEB4",
+"e. c #9DE4A5",
+"r. c #CAC6AC",
+"t. c #8FB3CE",
+"y. c #92B7D3",
+"u. c #96BBD8",
+"i. c #9EBFD9",
+"p. c #98BFDC",
+"a. c #ACBCC3",
+"s. c #AABCD1",
+"d. c #9BC2DF",
+"f. c #ABC8DF",
+"g. c #8CFDCB",
+"h. c #9EDEE9",
+"j. c #ABCBE2",
+"k. c #ACCBE3",
+"l. c #B1CEE6",
+"z. c #BFE6E5",
+"x. c #BBF8EA",
+"c. c #C1D9EB",
+"v. c #C5DBEC",
+"b. c #D5DFE5",
+"n. c #D0DFEF",
+"m. c #EEEEEE",
+"M. c None",
+/* pixels */
+"M.M.M.V V V Z H . M.M.M.M.M.M.M.",
+"M.M.M.l.n.v.d._ G M.M.M.M.M.M.M.",
+"P X o F J K i.c.(   M.M.M.M.M.M.",
+"M.M.M.M.M.` V j.y.L b.M.M.M.M.M.",
+"M.M.M.M.M.' V &.t.S a.M.M.M.M.M.",
+"M.M.M.V V V V &.) V V V V M.M.M.",
+"M.6 q k V p.] ] ] %.u.V q.@./ M.",
+"M.2 - = r.V p.%.%.f.V 0.z.=.:.M.",
+"M.9 3 e j e.C k.p.A 9.h.g.x d M.",
+"M.t c X.5.+.s.D V w.x.N m.y w M.",
+"M.a  .#.R B I ! $.,.m f s h n M.",
+"M.u l } -.*.<.1.7.6...;.>.3.O.M.",
+"M.9 < > , 4 i r | 4.o.Q Y E W M.",
+"M.1 # + O @ $ 0 v 8.~ T U ~ 2.M.",
+"M.5 : * % * : 7 p z M [ { b g M.",
+"M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M."
+};
diff --git a/mgllab/xpm/document-import.xpm b/mgllab/xpm/document-import.xpm
new file mode 100644 (file)
index 0000000..edb07cd
--- /dev/null
@@ -0,0 +1,197 @@
+/* XPM */
+static const char *document_import_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 175 2 ",
+"   c #001230",
+".  c #001431",
+"X  c #001E45",
+"o  c #0E2A4A",
+"O  c #11345E",
+"+  c #18395B",
+"@  c #224164",
+"#  c #274466",
+"$  c #25466A",
+"%  c #21436D",
+"&  c #2B4B71",
+"*  c #2A4B73",
+"=  c #284C76",
+"-  c #2F527A",
+";  c #30527B",
+":  c #485D78",
+">  c #495F7B",
+",  c #4A5F7C",
+"<  c #C00000",
+"1  c #C40100",
+"2  c #DE1900",
+"3  c #DE1A00",
+"4  c #E00600",
+"5  c #ED1C00",
+"6  c #F32E00",
+"7  c #F42F00",
+"8  c #FF3F00",
+"9  c #FA6201",
+"0  c #FF6200",
+"q  c #FB6801",
+"w  c #FB7E01",
+"e  c #FF8400",
+"r  c #FAA302",
+"t  c #F9A502",
+"y  c #FAA205",
+"u  c #F5A10A",
+"i  c #F1B50D",
+"p  c #E0A31C",
+"a  c #CCB833",
+"s  c #F5CE09",
+"d  c #EDDE11",
+"f  c #E6DE18",
+"g  c #DFE11A",
+"h  c #DDE31D",
+"j  c #EDEC10",
+"k  c #E5E019",
+"l  c #E1FF1B",
+"z  c #C6FB38",
+"x  c #B3DD4C",
+"c  c #BFE240",
+"v  c #B7F047",
+"b  c #91F96D",
+"n  c #91FF6C",
+"m  c #8CFF72",
+"M  c #83FC7B",
+"N  c #85FF79",
+"B  c #0030BE",
+"V  c #3E5E87",
+"C  c #3D6492",
+"Z  c #39679B",
+"A  c #3F74B0",
+"S  c #455F80",
+"D  c #506481",
+"F  c #4A6A90",
+"G  c #4F769F",
+"H  c #51729B",
+"J  c #4A73A7",
+"K  c #4A75A6",
+"L  c #4976AD",
+"P  c #5079A9",
+"I  c #517AAA",
+"U  c #587FAD",
+"Y  c #4074B0",
+"T  c #4076B4",
+"R  c #437AB9",
+"E  c #547FB5",
+"W  c #0032C9",
+"Q  c #004EE6",
+"!  c #0051EC",
+"~  c #0041FF",
+"^  c #0043FF",
+"/  c #004CFC",
+"(  c #004DFF",
+")  c #0062FD",
+"_  c #0064FF",
+"`  c #0066FF",
+"'  c #0374F4",
+"]  c #047CF5",
+"[  c #0070FF",
+"{  c #0170FF",
+"}  c #0279F8",
+"|  c #7EFF81",
+" . c #73F18B",
+".. c #60EA9E",
+"X. c #61F29D",
+"o. c #65FA99",
+"O. c #5AE5A4",
+"+. c #5CFEA1",
+"@. c #59FCA5",
+"#. c #58FFA6",
+"$. c #56FAA8",
+"%. c #43FFBB",
+"&. c #0297FD",
+"*. c #0195FF",
+"=. c #059FF9",
+"-. c #049DFB",
+";. c #10BFEE",
+":. c #0AA6F5",
+">. c #08A6F7",
+",. c #0FB6F0",
+"<. c #5887C2",
+"1. c #7CA3D6",
+"2. c #7DA3D6",
+"3. c #7EA3D6",
+"4. c #7FA6D7",
+"5. c #78A3D9",
+"6. c #79A3D9",
+"7. c #7AA3D8",
+"8. c #7CA3D8",
+"9. c #7DA3D8",
+"0. c #7CA3D9",
+"q. c #7EA3D8",
+"w. c #7EA3D9",
+"e. c #7EA4D8",
+"r. c #7EA4D9",
+"t. c #2CE1D3",
+"y. c #27F0D6",
+"u. c #2DFFD0",
+"i. c #2CFFD1",
+"p. c #08C2F6",
+"a. c #0EC8F0",
+"s. c #07C2F8",
+"d. c #0AD3F4",
+"f. c #0DDEF1",
+"g. c #0FE8EF",
+"h. c #87A2BE",
+"j. c #93B1CB",
+"k. c #80A6D7",
+"l. c #82A6D7",
+"z. c #81A6D8",
+"x. c #80A7D8",
+"c. c #81A7D8",
+"v. c #82A7D8",
+"b. c #83A9DA",
+"n. c #83A9DB",
+"m. c #84A9DA",
+"M. c #85A9DA",
+"N. c #84A9DB",
+"B. c #85A9DB",
+"V. c #86A9DA",
+"C. c #86A9DB",
+"Z. c #87A9DB",
+"A. c #85ABDA",
+"S. c #81A8DD",
+"D. c #83A9DC",
+"F. c #87ADDF",
+"G. c #81A9E0",
+"H. c #87ADE1",
+"J. c #87AEE1",
+"K. c #8AAEE0",
+"L. c #8AB0E3",
+"P. c #89B1E4",
+"I. c #A6CBE9",
+"U. c #A6CCEA",
+"Y. c #A7CCEA",
+"T. c #A7CDEB",
+"R. c #A8CDEA",
+"E. c #A8CDEB",
+"W. c #A9CDEB",
+"Q. c #A8CEEB",
+"!. c #AACEEA",
+"~. c #AACEEB",
+"^. c #BCE0FB",
+"/. c #BCE0FC",
+"(. c None",
+/* pixels */
+"(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.",
+"E = q 8 0 d #.s.[ ` *.d.i.+.(.(.",
+"J H r i c X.;.` ~ { a.#.z s <.(.",
+"C F g $.>.Q W ~ &.y.n l j k L (.",
+"- V h $.,.] ' -.g.%.| m o.t.; (.",
+"& - t u p a x M u.f.=.} ) ( & (.",
+"$ % 9 4 < 1 5 y N p.( B ! >.o (.",
+"@ O w 6 3 3 7 e f b ..O. .v . (.",
+"+ X w 6 3 3 h.T.R.R.T.R.E.R./.j.",
+"G ^.U.T.T.!.R.B.l.l.l.l.x.l.H.: ",
+"P D.3.3.3.3.3.l.l.x.x.x.l.b.H.> ",
+"I K.b.b.B.b.B.B.b.b.C.D.B.B.P.> ",
+"Z A A A A A A A Y A A A A A R # ",
+"U F.b.C.B.B.B.b.B.B.B.B.B.b.L.D ",
+"K D.r.r.w.5.w.r.3.r.6.6.r.w.D.S ",
+"(.(.(.(.(.(.(.    (.(.(.(.(.(.(."
+};
diff --git a/mgllab/xpm/document-new.xpm b/mgllab/xpm/document-new.xpm
new file mode 100644 (file)
index 0000000..bb8aa7e
--- /dev/null
@@ -0,0 +1,97 @@
+/* XPM */
+static const char *document_new_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 75 1 ",
+"  c #007500",
+". c #009300",
+"X c #009B00",
+"o c #099509",
+"O c #03A000",
+"+ c #00A800",
+"@ c #03AD00",
+"# c #02AD02",
+"$ c #0AAF0A",
+"% c #1AA300",
+"& c #00B300",
+"* c #1DB61D",
+"= c #34A000",
+"- c #32AF00",
+"; c #36B000",
+": c #33BC1D",
+"> c #21A621",
+", c #29A829",
+"< c #2AAA2A",
+"1 c #21B421",
+"2 c #3FB429",
+"3 c #36BF36",
+"4 c #64B000",
+"5 c #5ABC29",
+"6 c #23C423",
+"7 c #35C035",
+"8 c #5BC35B",
+"9 c #78D578",
+"0 c #7AD578",
+"q c #7E8181",
+"w c #7E8383",
+"e c #808585",
+"r c #848688",
+"t c #8FCF8F",
+"y c #95DD95",
+"u c #95DF95",
+"i c gray77",
+"p c #C6C6C6",
+"a c gray80",
+"s c #CECFCF",
+"d c gray88",
+"f c #E8E9E9",
+"g c #E8E9EA",
+"h c #E9E9EA",
+"j c #EAEAEA",
+"k c #EAEBEB",
+"l c #EBECEC",
+"z c #ECEDED",
+"x c gray93",
+"c c #EDEEEE",
+"v c #EEEFEF",
+"b c #EFEFF0",
+"n c #EFF0F0",
+"m c #F0F1F1",
+"M c #F1F1F1",
+"N c gray95",
+"B c #F2F3F3",
+"V c #F3F3F3",
+"C c #F3F4F4",
+"Z c #F4F4F4",
+"A c #F4F5F5",
+"S c gray96",
+"D c #F5F6F6",
+"F c #F6F6F6",
+"G c #F6F7F7",
+"H c gray97",
+"J c #F8F8F8",
+"K c #F9F9F9",
+"L c gray98",
+"P c #FBFBFB",
+"I c gray99",
+"U c #FDFDFD",
+"Y c #FEFEFE",
+"T c white",
+"R c None",
+/* pixels */
+"RRRRRRRRRR ,8,RR",
+"RjjjzccnNt39T97R",
+"Rffjccnnn>*2T5:X",
+"RzzzcnNCCoTTTTT.",
+"RcccNNZZG1O=T4-+",
+"RccNNCZGLy@%T;@R",
+"RNnBCZLLLLu6$&RR",
+"RNNZZLLLPLLLTRRR",
+"RZZZLLLLPTPTPRRR",
+"RZGZLLLTTPTTTRRR",
+"RZZLLLTLTPPLbRRR",
+"RGLLLLLTTdpsrRRR",
+"RZLLLTTTLiTeRRRR",
+"RGLLLLLTCaqRRRRR",
+"RZLLLTTTjqRRRRRR",
+"RRRRRRRRRRRRRRRR"
+};
diff --git a/mgllab/xpm/document-open-folder.xpm b/mgllab/xpm/document-open-folder.xpm
new file mode 100644 (file)
index 0000000..a4c7dd7
--- /dev/null
@@ -0,0 +1,179 @@
+/* XPM */
+static const char *document_open_folder_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 157 2 ",
+"   c #00112F",
+".  c #001230",
+"X  c #142E4B",
+"o  c #0A2D56",
+"O  c #0C305A",
+"+  c #0C315A",
+"@  c #0D315B",
+"#  c #0E335D",
+"$  c #0F335D",
+"%  c #10335E",
+"&  c #123763",
+"*  c #1B3F6C",
+"=  c #203E61",
+"-  c #274466",
+";  c #25456A",
+":  c #26456A",
+">  c #2B4A71",
+",  c #2B4C73",
+"<  c #2F5179",
+"1  c #2F517A",
+"2  c #485D78",
+"3  c #495F7B",
+"4  c #4A5F7C",
+"5  c #2F598B",
+"6  c #335F92",
+"7  c #326092",
+"8  c #346092",
+"9  c #3D6392",
+"0  c #366498",
+"q  c #39679B",
+"w  c #3B689E",
+"e  c #3B699E",
+"r  c #3A689F",
+"t  c #3B689F",
+"y  c #3C699F",
+"u  c #3D6AA0",
+"i  c #3D6CA5",
+"p  c #3D6DA5",
+"a  c #3F6DA5",
+"s  c #3F6EA5",
+"d  c #3F74B0",
+"f  c #455F80",
+"g  c #506481",
+"h  c #4F779F",
+"j  c #4371A7",
+"k  c #4972A6",
+"l  c #4A75A7",
+"z  c #4976AD",
+"x  c #5079A9",
+"c  c #517AAA",
+"v  c #587FAD",
+"b  c #4074B0",
+"n  c #4776B2",
+"m  c #4076B4",
+"M  c #4B79B1",
+"N  c #4878B3",
+"B  c #4978B3",
+"V  c #4878B4",
+"C  c #4978B4",
+"Z  c #4A78B4",
+"A  c #4B78B4",
+"S  c #4A79B4",
+"D  c #437AB9",
+"F  c #4E7FBF",
+"G  c #507DB1",
+"H  c #517FB7",
+"J  c #527FB7",
+"K  c #547FB5",
+"L  c #527EB8",
+"P  c #4F81BF",
+"I  c #5180B7",
+"U  c #5180BA",
+"Y  c #5380BA",
+"T  c #5381BA",
+"R  c #5382BA",
+"E  c #5481BB",
+"W  c #5482BA",
+"Q  c #5684BB",
+"!  c #5081BF",
+"~  c #5182BF",
+"^  c #6788AA",
+"/  c #5181C0",
+"(  c #5082C0",
+")  c #5182C0",
+"_  c #5082C1",
+"`  c #5182C1",
+"'  c #5484C1",
+"]  c #5887C2",
+"[  c #5B88C0",
+"{  c #568CCD",
+"}  c #588CCF",
+"|  c #6390C5",
+" . c #6D99D0",
+".. c #76A1D4",
+"X. c #7CA3D6",
+"o. c #7DA3D6",
+"O. c #7EA3D6",
+"+. c #7FA6D7",
+"@. c #79A3D8",
+"#. c #78A3D9",
+"$. c #79A3D9",
+"%. c #7AA3D9",
+"&. c #7CA3D9",
+"*. c #7DA3D9",
+"=. c #7EA3D8",
+"-. c #7EA4D9",
+";. c #7CA7DB",
+":. c #7DA8DD",
+">. c #7CA8DF",
+",. c #93B1CB",
+"<. c #80A6D7",
+"1. c #81A6D7",
+"2. c #81A6D8",
+"3. c #80A7D8",
+"4. c #81A7D8",
+"5. c #82A7D8",
+"6. c #83A9DA",
+"7. c #83A9DB",
+"8. c #84A9DA",
+"9. c #85A9DA",
+"0. c #84A9DB",
+"q. c #85A9DB",
+"w. c #86A9DA",
+"e. c #86A9DB",
+"r. c #87A9DB",
+"t. c #85ABDA",
+"y. c #81A8DD",
+"u. c #80A9DD",
+"i. c #83A9DC",
+"p. c #82ABDE",
+"a. c #84ACDE",
+"s. c #86ADDF",
+"d. c #87ADDF",
+"f. c #86AFDF",
+"g. c #8AAFDF",
+"h. c #81A9E0",
+"j. c #87ADE1",
+"k. c #87AEE1",
+"l. c #86AFE1",
+"z. c #8AAEE0",
+"x. c #8AB0E3",
+"c. c #89B1E4",
+"v. c #8EB6EA",
+"b. c #8FB9EF",
+"n. c #90B8EB",
+"m. c #93BBEF",
+"M. c #AFD1ED",
+"N. c #B7D9F4",
+"B. c #B8DAF5",
+"V. c #B8DBF5",
+"C. c #B9DBF6",
+"Z. c #BADBF6",
+"A. c #B9DCF6",
+"S. c #BBDCF6",
+"D. c #BDE0FB",
+"F. c #BFE1FB",
+"G. c None",
+/* pixels */
+"G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.",
+"K I J J I Q G.G.G.G.G.G.G.G.G.G.",
+"k b.v.v.m.B I U E L U U E E [ G.",
+"9 l.{ } @.g.s.s.s.p.p.:.:.>.z G.",
+"1 ..! ' ( ! P ( ( ( ( ( P  .1 G.",
+"> | n n B B B A V V A V n [ , G.",
+": G p j p p u e u u e u e j : G.",
+"= 0 8 7 6 5 * % $ $ $ $ $ # & G.",
+"X # + + @ o ^ S.B.B.A.A.B.A.D.,.",
+"h D.N.N.A.N.M.0.2.2.1.1.1.1.j.2 ",
+"c 7.O.O.O.O.O.1.2.2.-.5.5.5.j.3 ",
+"c g.0.0.0.0.w.0.0.7.0.0.0.0.c.4 ",
+"q n d d b d b d b b d d d d D - ",
+"I r.t.0.0.0.0.0.0.0.0.0.0.0.x.4 ",
+"l p.o.-.=.#.=.-.2.=.@.@.-.-.j.f ",
+"G.G.G.G.. . .       . . G.G.G.G."
+};
diff --git a/mgllab/xpm/document-open.xpm b/mgllab/xpm/document-open.xpm
new file mode 100644 (file)
index 0000000..a2b1312
--- /dev/null
@@ -0,0 +1,168 @@
+/* XPM */
+static const char *document_open_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 146 2 ",
+"   c #001230",
+".  c #001431",
+"X  c #2A2A29",
+"o  c #001E45",
+"O  c #0E2A4A",
+"+  c #11345E",
+"@  c #18395B",
+"#  c #224164",
+"$  c #274466",
+"%  c #25466A",
+"&  c #21436D",
+"*  c #374F6D",
+"=  c #3B516A",
+"-  c #2B4B71",
+";  c #2A4B73",
+":  c #284C76",
+">  c #2F527A",
+",  c #30527B",
+"<  c #465D79",
+"1  c #485D78",
+"2  c #495F7B",
+"3  c #4A5F7C",
+"4  c #4E6177",
+"5  c #3E5E87",
+"6  c #3D6492",
+"7  c #39679B",
+"8  c #3F74B0",
+"9  c #455F80",
+"0  c #506481",
+"q  c #4A6A90",
+"w  c #4F769F",
+"e  c #51729B",
+"r  c #4A73A7",
+"t  c #4A75A6",
+"y  c #4976AD",
+"u  c #5079A9",
+"i  c #517AAA",
+"p  c #587FAD",
+"a  c #4074B0",
+"s  c #4076B4",
+"d  c #437AB9",
+"f  c #547FB5",
+"g  c #517EB8",
+"h  c #5481BB",
+"j  c #5483BC",
+"k  c #5887C2",
+"l  c #6894CD",
+"z  c #78A2D7",
+"x  c #7CA3D6",
+"c  c #7DA3D6",
+"v  c #7EA3D6",
+"b  c #7FA6D7",
+"n  c #78A3D9",
+"m  c #79A3D9",
+"M  c #7AA3D8",
+"N  c #7CA3D8",
+"B  c #7DA3D8",
+"V  c #7CA3D9",
+"C  c #7EA3D8",
+"Z  c #7EA3D9",
+"A  c #7EA4D8",
+"S  c #7EA4D9",
+"D  c #7CA9E1",
+"F  c #9A9A9A",
+"G  c #87A2BE",
+"H  c #A0A0A0",
+"J  c #A1A0A0",
+"K  c #ADACAC",
+"L  c #B2B0B0",
+"P  c #B4B3B3",
+"I  c gray72",
+"U  c #93B1CB",
+"Y  c #80A6D7",
+"T  c #82A6D7",
+"R  c #81A6D8",
+"E  c #80A7D8",
+"W  c #81A7D8",
+"Q  c #82A7D8",
+"!  c #83A9DA",
+"~  c #83A9DB",
+"^  c #84A9DA",
+"/  c #85A9DA",
+"(  c #84A9DB",
+")  c #85A9DB",
+"_  c #86A9DA",
+"`  c #86A9DB",
+"'  c #87A9DB",
+"]  c #85ABDA",
+"[  c #81A8DD",
+"{  c #83A9DC",
+"}  c #87ADDF",
+"|  c #B5BBC3",
+" . c #81A9E0",
+".. c #87ADE1",
+"X. c #87AEE1",
+"o. c #8AAEE0",
+"O. c #8AB0E3",
+"+. c #89B1E4",
+"@. c #A6CBE9",
+"#. c #A6CCEA",
+"$. c #A7CCEA",
+"%. c #A7CDEB",
+"&. c #A8CDEA",
+"*. c #A8CDEB",
+"=. c #A9CDEB",
+"-. c #A8CEEB",
+";. c #AACEEA",
+":. c #AACEEB",
+">. c #BCE0FB",
+",. c #BCE0FC",
+"<. c gray77",
+"1. c #C1C4CA",
+"2. c #C6C8CE",
+"3. c #C9CDD1",
+"4. c #CCCFD5",
+"5. c #CED1D5",
+"6. c #CED2D6",
+"7. c #CFD3D8",
+"8. c #D0D2D6",
+"9. c #E1DDDB",
+"0. c #E4E1DE",
+"q. c #DFE1E5",
+"w. c #E0E2E5",
+"e. c #E8E7E7",
+"r. c #E8E8EA",
+"t. c gray92",
+"y. c #EFEEEE",
+"u. c #F1EFEF",
+"i. c gray95",
+"p. c #F4F2F0",
+"a. c #F5F4F4",
+"s. c gray96",
+"d. c #F6F6F6",
+"f. c gray97",
+"g. c #F8F7F7",
+"h. c #F8F8F8",
+"j. c #F9F8F8",
+"k. c #F9F9F9",
+"l. c #FAF9F9",
+"z. c #FAF9FA",
+"x. c #FBFAFA",
+"c. c #FBFBFA",
+"v. c #FFFCFA",
+"b. c #FFFFFE",
+"n. c white",
+"m. c None",
+/* pixels */
+"m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.",
+"f : n.n.n.n.n.n.e.X m.m.m.m.m.m.",
+"r e n.d.h.h.a.t.<.n.= g j h k m.",
+"6 q n.h.h.h.d.y.H n.0.4 z D y m.",
+"> 5 n.g.h.h.h.i.F n.u.9.* l , m.",
+"- > n.h.h.h.h.d.H n.n.n.v.< - m.",
+"% & n.d.h.h.v.h.t.I P K L p.O m.",
+"# + n.h.n.h.q.7.6.4.3.2.1.w.. m.",
+"@ o e.5.8.| G &.&.&.&.&.-.&.,.U ",
+"w >.%.@.%.;.&.( T R b T R b o.1 ",
+"u { v v b v v T R ~ b T ~ R X.2 ",
+"u o.~ ~ ( ~ _ ( ( ~ ( ~ ( ( +.2 ",
+"7 s 8 8 8 8 a 8 a a 8 8 8 8 d $ ",
+"p } ( ( ( ( ( ( ( ( ( ( ( ( O.3 ",
+"t { v A Z n Z A T v m m A Z ..9 ",
+"m.m.m.m.m.m.m.    m.m.m.m.m.m.m."
+};
diff --git a/mgllab/xpm/document-print.xpm b/mgllab/xpm/document-print.xpm
new file mode 100644 (file)
index 0000000..16fcf4f
--- /dev/null
@@ -0,0 +1,95 @@
+/* XPM */
+static const char *document_print_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 73 1 ",
+"  c #070707",
+". c #090909",
+"X c #4E4E4E",
+"o c gray34",
+"O c gray35",
+"+ c #5A5A5A",
+"@ c #5B5B5B",
+"# c #606060",
+"$ c #626262",
+"% c #646464",
+"& c #66666A",
+"* c #6E6E71",
+"= c #747474",
+"- c #777777",
+"; c #797979",
+": c gray48",
+"> c gray53",
+", c #888888",
+"< c gray57",
+"1 c #939393",
+"2 c #959595",
+"3 c gray60",
+"4 c gray61",
+"5 c #9E9EA1",
+"6 c #A4A4A4",
+"7 c #A9A9A9",
+"8 c #A9A9AB",
+"9 c #AAAAAA",
+"0 c gray67",
+"q c #ACACAC",
+"w c #AEAEAE",
+"e c #AFAFAF",
+"r c #ADADB3",
+"t c #B2B2B1",
+"y c #B4B4B4",
+"u c #B7B7B7",
+"i c #B6B6BC",
+"p c gray",
+"a c gray75",
+"s c #BCBCC1",
+"d c #BDBDC2",
+"f c #BEBEC3",
+"g c #C0C0C0",
+"h c #C1C1C1",
+"j c #C5C5C5",
+"k c #CACACA",
+"l c #CBCBCF",
+"z c gray80",
+"x c #D3D3D7",
+"c c #D6D6D9",
+"v c #D8D8DB",
+"b c #DCDCDF",
+"n c #DEDEE0",
+"m c #DEDEE1",
+"M c #E2E2E2",
+"N c #E1E1E4",
+"B c #E2E2E4",
+"V c gray90",
+"C c #E5E5E8",
+"Z c #E7E7E9",
+"A c #E9E9EB",
+"S c #EBEBEC",
+"D c #EBEBED",
+"F c #EFEFEF",
+"G c #F1F1F2",
+"H c #F3F3F4",
+"J c #F5F5F6",
+"K c #F8F8F8",
+"L c #FBFBFB",
+"P c #FCFCFD",
+"I c #FDFDFD",
+"U c white",
+"Y c None",
+/* pixels */
+"YYYYYYYYYYYYYYYY",
+"YYYY770000q7YYYY",
+"YYYYUUUUUUUUYYYY",
+"YYYYJUUUUUUUYYYY",
+"YYY,ZHLUUULJ,YYY",
+"Y,<<xNDGGGDN<6<Y",
+",<6>dlcnnncl,y6<",
+"yFF=@@OooO@@;FGy",
+"yJL=XX$$$#XX;LJu",
+"7kkqee3224qt0kk7",
+"eVMjggppppggjMgq",
+"6l3. .      .3y6",
+",,%@&riddsi*O%,,",
+"YYY;5vNZDAN7;YYY",
+"YYY;nJUUUUUD;YYY",
+"YYYYYYYYYYYYYYYY"
+};
diff --git a/mgllab/xpm/document-properties.xpm b/mgllab/xpm/document-properties.xpm
new file mode 100644 (file)
index 0000000..d9d27f3
--- /dev/null
@@ -0,0 +1,63 @@
+/* XPM */
+static const char *document_properties_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 41 1 ",
+"  c #585858",
+". c gray35",
+"X c #626262",
+"o c #696966",
+"O c DimGray",
+"+ c #6A6A6A",
+"@ c #6C6C6C",
+"# c #777777",
+"$ c #818181",
+"% c gray52",
+"& c #909090",
+"* c #929292",
+"= c #959595",
+"- c gray60",
+"; c #9D9D9D",
+": c gray62",
+"> c gray67",
+", c gray68",
+"< c gray69",
+"1 c gray71",
+"2 c gray73",
+"3 c gray77",
+"4 c #C5C5C5",
+"5 c #C6C6C6",
+"6 c gray78",
+"7 c #C8C8C8",
+"8 c #D2D2CC",
+"9 c #D2D2D2",
+"0 c gray83",
+"q c gray84",
+"w c gainsboro",
+"e c gray88",
+"r c #EAEAEA",
+"t c gray92",
+"y c #ECECEC",
+"u c gray93",
+"i c #EEEEEE",
+"p c #EFEFEF",
+"a c gray94",
+"s c white",
+"d c None",
+/* pixels */
+"d-$$$$$$$$$$$$dd",
+"d$ssssssssssss$d",
+"d$syrrrrrryyas$d",
+"d$sr55555555as$d",
+"d$srryOOO9yaas$d",
+"d$sr55<   57as$d",
+"d$syO9y9Ooyyas$d",
+"d$sr  < @O8yas$d",
+"d$syOOO@OOOqas$d",
+"d$sy<     X@ws$d",
+"d$syyyyaq#%*:s$d",
+"d$sy777771*:>s$d",
+"d$syyyayaae,2s$d",
+"d$ssssssssssss$d",
+"d=$$$$$$$$$$$$=d",
+"dddddddddddddddd"
+};
diff --git a/mgllab/xpm/document-revert.xpm b/mgllab/xpm/document-revert.xpm
new file mode 100644 (file)
index 0000000..6b750b2
--- /dev/null
@@ -0,0 +1,164 @@
+/* XPM */
+static const char *document_revert_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 142 2 ",
+"   c #7D5718",
+".  c #7A561E",
+"X  c #7C581C",
+"o  c #8D6416",
+"O  c #8D6719",
+"+  c #8E661E",
+"@  c #906A1A",
+"#  c #947217",
+"$  c #94711F",
+"%  c #95731E",
+"&  c #A36C0E",
+"*  c #B4740A",
+"=  c #B67E0E",
+"-  c #836126",
+";  c #926C25",
+":  c #936E26",
+">  c #906A2F",
+",  c #976F2F",
+"<  c #957027",
+"1  c #97732B",
+"2  c #876833",
+"3  c #8E6C31",
+"4  c #886835",
+"5  c #8B6C39",
+"6  c #8C6F3D",
+"7  c #8E6E3E",
+"8  c #95793F",
+"9  c #AA8413",
+"0  c #B18F3B",
+"q  c #BC953B",
+"w  c #CE850A",
+"e  c #D98E0B",
+"r  c #D69D10",
+"t  c #D6AD0E",
+"y  c #E1A02D",
+"u  c #E7B236",
+"i  c #E4BD3B",
+"p  c #DFC81E",
+"a  c #E2C139",
+"s  c #9F865C",
+"d  c #AA8345",
+"f  c #B99741",
+"g  c #BC9940",
+"h  c #8B8477",
+"j  c #848279",
+"k  c #86847B",
+"l  c #8B877B",
+"z  c #A6906B",
+"x  c #AD9978",
+"c  c #CCA055",
+"v  c #DABC59",
+"b  c #EBBF46",
+"n  c #E8B64A",
+"m  c #E9B948",
+"M  c #E9B849",
+"N  c #E9B850",
+"B  c #E9BE55",
+"V  c #DDC058",
+"C  c #E5CD41",
+"Z  c #E5C249",
+"A  c #ECC151",
+"S  c #ECC156",
+"D  c #E7CD52",
+"F  c #E1C759",
+"G  c #E4C45A",
+"H  c #E1C85C",
+"J  c #EACC5C",
+"K  c #F0CD5F",
+"L  c #EBD05D",
+"P  c #EFD263",
+"I  c #EED463",
+"U  c #EED563",
+"Y  c #F1D363",
+"T  c #F2D462",
+"R  c #F4DA65",
+"E  c #F3DC67",
+"W  c #F0D769",
+"Q  c #F3DA68",
+"!  c #F1DF69",
+"~  c #F7E667",
+"^  c #F2E068",
+"/  c #F7E669",
+"(  c #F7E66A",
+")  c #FAEF74",
+"_  c #B8A68A",
+"`  c #B9A78A",
+"'  c #BDAA8D",
+"]  c #C5B290",
+"[  c #C2B195",
+"{  c #C2B298",
+"}  c #C6B69E",
+"|  c #D3C2A6",
+" . c #CEC5B7",
+".. c #CEC7BC",
+"X. c #D2C7B5",
+"o. c #D2C8B5",
+"O. c #E8D9B9",
+"+. c #DBD2C5",
+"@. c #E1DBD1",
+"#. c #EEE8DE",
+"$. c #E8E9E9",
+"%. c #E8E9EA",
+"&. c #EAEAEA",
+"*. c #EAEBEB",
+"=. c #EBECEC",
+"-. c #ECEDED",
+";. c #EDEEEE",
+":. c #EEEFEF",
+">. c #F1EFEB",
+",. c #F2EFEB",
+"<. c #F3F0EC",
+"1. c #F1F0EE",
+"2. c #EFF0F0",
+"3. c #F0F1F1",
+"4. c #F1F1F1",
+"5. c #F1F2F2",
+"6. c gray95",
+"7. c #F3F3F3",
+"8. c #F4F3F1",
+"9. c #F6F5F2",
+"0. c #F3F4F4",
+"q. c #F4F4F4",
+"w. c #F4F5F5",
+"e. c gray96",
+"r. c #F6F6F4",
+"t. c #F6F6F5",
+"y. c #F7F6F5",
+"u. c #F6F6F6",
+"i. c #F6F7F7",
+"p. c gray97",
+"a. c #F8F7F3",
+"s. c #F8F7F4",
+"d. c #F8F9F9",
+"f. c #F9F9F9",
+"g. c #FAFAF9",
+"h. c #FBFAF9",
+"j. c gray98",
+"k. c #FBFBFB",
+"l. c gray99",
+"z. c #FDFDFD",
+"x. c #FEFEFE",
+"c. c None",
+/* pixels */
+"c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.",
+"c.c.c.&.$.&.;.;.;.2.2.4.4.0.0.c.",
+"c.c.c.&.$.&.-.;.2.2.4.4.4.q.q.c.",
+"c.c.c.*.-.-.2.2.4.4.0.q.q.q.q.c.",
+"c.c.c.:. .z 2 . 5 ` @.i.d.i.d.c.",
+"4 c.c.6 0 H ^ ) ^ F f s s.k.k.c.",
+"1 q - v ( ~ ~ ~ ( ~ ( V 3 >.k.c.",
+"1 Q W Q E Y A u Z Y R R G 7 k.c.",
+"< U U Q i r = & * e m K K q { c.",
+"; J L a t O ` +.x > w m S B X c.",
+"+ Z D a p 9 X.h.h.<.d y N n , c.",
+"  o @ < % # 8 ,.z.x.' c ] o.h c.",
+"c.c.c.1.8.d.h.l.x.x.} [ x.l c.c.",
+"c.c.c.q.a.d.l.l.l.a.| ..k c.c.c.",
+"c.c.c.s.a.h.d.x.d.#.O.k c.c.c.c.",
+"c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c."
+};
diff --git a/mgllab/xpm/document-save.xpm b/mgllab/xpm/document-save.xpm
new file mode 100644 (file)
index 0000000..759d54e
--- /dev/null
@@ -0,0 +1,129 @@
+/* XPM */
+static const char *document_save_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 107 2 ",
+"   c #4E6A7D",
+".  c #58787A",
+"X  c #6E706B",
+"o  c #6B716E",
+"O  c #72756B",
+"+  c #667173",
+"@  c #627075",
+"#  c #38678B",
+"$  c #3D698A",
+"%  c #3B6B8F",
+"&  c #3D6B8E",
+"*  c #3F6C8E",
+"=  c #4A6D85",
+"-  c #436E88",
+";  c #4A7180",
+":  c #41749A",
+">  c #44789F",
+",  c #547D9B",
+"<  c #6B7F88",
+"1  c #5186AF",
+"2  c #5892BD",
+"3  c #688BA0",
+"4  c #6E99B6",
+"5  c #7798B0",
+"6  c #719FBF",
+"7  c #739FC0",
+"8  c #79A7CA",
+"9  c #9F9F9F",
+"0  c #92A6AC",
+"q  c #95A9AF",
+"w  c #9AAEB4",
+"e  c #A8A7A7",
+"r  c #A8A7A8",
+"t  c #A9A9A9",
+"y  c #AAAAA9",
+"u  c #AFAFAF",
+"i  c #B4B4B4",
+"p  c #B7B6B6",
+"a  c #B9B9B9",
+"s  c #BCBCBC",
+"d  c #C5CBBF",
+"f  c #8FB3CE",
+"g  c #92B7D3",
+"h  c #96BBD8",
+"j  c #9EBFD9",
+"k  c #98BFDC",
+"l  c #ACBCC3",
+"z  c #9BC2DF",
+"x  c #ABC8DF",
+"c  c #ABCBE2",
+"v  c #ACCBE3",
+"b  c #B1CEE6",
+"n  c gray76",
+"m  c #C3C3C3",
+"M  c gray77",
+"N  c #C5C5C5",
+"B  c #CACFC4",
+"V  c #C8C8C8",
+"C  c gray79",
+"Z  c #CACACA",
+"A  c #CBCBCB",
+"S  c #CDCDCD",
+"D  c #CECECE",
+"F  c gray81",
+"G  c #CED4C8",
+"H  c #C9D6DD",
+"J  c #D0D0D0",
+"K  c gray82",
+"L  c #D2D2D2",
+"P  c #D5D5D5",
+"I  c gray84",
+"U  c gainsboro",
+"Y  c #DDDDDD",
+"T  c #DDE1D6",
+"R  c #DFE2DE",
+"E  c #E2E6DD",
+"W  c #C1D9EB",
+"Q  c #C5DBEC",
+"!  c #D5DFE5",
+"~  c #D0DFEF",
+"^  c gray89",
+"/  c #E4E4E4",
+"(  c #E9E9EA",
+")  c #EAE9EA",
+"_  c gray92",
+"`  c #EBECEC",
+"'  c #ECECEC",
+"]  c gray93",
+"[  c #EDEEED",
+"{  c #EDEDEE",
+"}  c #EDEEEE",
+"|  c #EEEEEE",
+" . c gray94",
+".. c #F1F1F1",
+"X. c gray95",
+"o. c #F3F3F3",
+"O. c #F3F4F3",
+"+. c #F4F4F4",
+"@. c gray97",
+"#. c #F9F9F9",
+"$. c gray98",
+"%. c #FCFBFC",
+"&. c gray99",
+"*. c #FDFDFD",
+"=. c #FEFEFE",
+"-. c white",
+";. c None",
+/* pixels */
+";.;.;.# # # $   . ;.;.;.;.;.;.;.",
+";.;.;.b ~ Q z 3 - ;.;.;.;.;.;.;.",
+"< + @ = : > j W 1   X X X X X X ",
+"o E -.T H 4 # v g 1 U &.-.-.+.X ",
+"O -.| | R 5 # 8 f & l | | | O.X ",
+"X $.` # # # # 8 2 # # # # ` o.X ",
+"X $.( B # k 6 6 6 6 h # q ( o.X ",
+"X $.$.^ d # k 6 6 x # 0 ^ o.o.X ",
+"X $.| $./ d # v k & 0 ^ $.| o.X ",
+"X +.^ | $.$.G & # w $.-.| ^ | X ",
+"X -.-.-.-.-.-.-.-.+.+.( ( ^  .X ",
+"X D C C C C N C C N N N N N I X ",
+"X D N 9 u a N V D t L t L a C X ",
+"X D m t i n M V A e L e L p C X ",
+"X U U U U I I J J D D J J J A X ",
+"X X X X X X X X X X X X X X X X "
+};
diff --git a/mgllab/xpm/down_1.xpm b/mgllab/xpm/down_1.xpm
new file mode 100644 (file)
index 0000000..e8d3b52
--- /dev/null
@@ -0,0 +1,22 @@
+/* XPM */
+static const char * down_1_xpm[] = {
+"16 16 3 1",
+".     c None",
+"+     c #7F0000",
+"@     c #FF0000",
+"................",
+"................",
+".....+++++++....",
+".....+@@@@@+....",
+".....+@@@@@+....",
+".....+@@@@@+....",
+".....+@@@@@+....",
+".....+@@@@@+....",
+"..++++@@@@@++++.",
+"...+@@@@@@@@@+..",
+"....+@@@@@@@+...",
+".....+@@@@@+....",
+"......+@@@+.....",
+".......+@+......",
+"........+.......",
+"................"};
diff --git a/mgllab/xpm/edit-clear.xpm b/mgllab/xpm/edit-clear.xpm
new file mode 100644 (file)
index 0000000..1640baf
--- /dev/null
@@ -0,0 +1,130 @@
+/* XPM */
+static const char *edit_clear_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 108 2 ",
+"   c #6C3124",
+".  c #991711",
+"X  c #BD1212",
+"o  c #BD1817",
+"O  c #8A231E",
+"+  c #A62013",
+"@  c #AB211A",
+"#  c #A32C1E",
+"$  c #B62C1F",
+"%  c #842D24",
+"&  c #9F2926",
+"*  c #B22824",
+"=  c #B92B27",
+"-  c #A33331",
+";  c #AB3731",
+":  c #CB0907",
+">  c #C0160F",
+",  c #CE100A",
+"<  c #CC140D",
+"1  c #E70A09",
+"2  c #E01713",
+"3  c #D02F23",
+"4  c #D92E20",
+"5  c #D82A27",
+"6  c #894131",
+"7  c #8F4232",
+"8  c #955036",
+"9  c #C7403B",
+"0  c #CE4C3A",
+"q  c #8F7048",
+"w  c #8D714E",
+"e  c #97774F",
+"r  c #9A6C56",
+"t  c #8D7556",
+"y  c #917555",
+"u  c #9A7A52",
+"i  c #9B7C53",
+"p  c #9F7D51",
+"a  c #9D7B54",
+"s  c #9B7F5A",
+"d  c #AF6047",
+"f  c #A17D51",
+"g  c #B4795E",
+"h  c #977F63",
+"j  c #CB4341",
+"k  c #C64B46",
+"l  c #CE4F4C",
+"z  c #CE5955",
+"x  c #DD6766",
+"c  c #D86864",
+"v  c #DE6B68",
+"b  c #DF6E69",
+"n  c #9F845F",
+"m  c #A48157",
+"M  c #A78456",
+"N  c #A88357",
+"B  c #AA8757",
+"V  c #A08158",
+"C  c #A3815A",
+"Z  c #A5835B",
+"A  c #A1845C",
+"S  c #A7865D",
+"D  c #A88459",
+"F  c #AA8758",
+"G  c #AA885B",
+"H  c #AA885E",
+"J  c #B0885C",
+"K  c #B3885C",
+"L  c #B08A5D",
+"P  c #B5895C",
+"I  c #B28E5C",
+"U  c #B28E5E",
+"Y  c #B48F5D",
+"T  c #B88E5A",
+"R  c #B88C5D",
+"E  c #B5905D",
+"W  c #B8915E",
+"Q  c #BA915E",
+"!  c #BB905F",
+"~  c #BA945F",
+"^  c #9F8567",
+"/  c #AC8A62",
+"(  c #A38D6E",
+")  c #A58E6E",
+"_  c #B68266",
+"`  c #B28F60",
+"'  c #BC8F62",
+"]  c #AF9169",
+"[  c #AD916B",
+"{  c #AC906E",
+"}  c #AD936E",
+"|  c #B39165",
+" . c #BE9161",
+".. c #BB9463",
+"X. c #BD9664",
+"o. c #B3946D",
+"O. c #B39B77",
+"+. c #B79B74",
+"@. c #B89D77",
+"#. c #B69C79",
+"$. c #B39E7D",
+"%. c #B99F7B",
+"&. c #B9A07C",
+"*. c #C59961",
+"=. c #C0A57F",
+"-. c #AB9B82",
+";. c #C8AF8C",
+":. c None",
+/* pixels */
+":.:.:.:.:.:.:.:.:.:.#.:.:.:.:.:.",
+":.:.:.:.:.:.:.:.:.$.;.:.:.:.:.:.",
+":.:.:.:.:.:.:.:.:.&.:.:.:.:.:.:.",
+":.:.:.:.:.:.:.:.-.%.:.:.:.:.:.:.",
+":.:.:.:.:.:.:.:.} h :.:.:.:.:.:.",
+":.:.:.:.:.:.} @.^ r :.:.:.:.:.:.",
+":.:.:.:.:.n =.O./ _ = :.:.9 b :.",
+":.:.:.:.:.[ +.o.H g c O ; x v * ",
+":.:.:.:.w ) ) Z S d j k l z @ :.",
+":.:.:.u A [ s y t 7 $ X o + :.:.",
+":.:.:.p | A u M s # , > : < . :.",
+":.:.Y a N J p I m 4 3   % 1 2 - ",
+":.B q ..P m ! E P 0 6 :.:.& 5 :.",
+":.F '  .! E *.Q X.8 :.:.:.:.:.:.",
+":.:.G J Y ~ T R ` :.:.:.:.:.:.:.",
+":.:.:.:.:.:.f :.:.:.:.:.:.:.:.:."
+};
diff --git a/mgllab/xpm/edit-copy.xpm b/mgllab/xpm/edit-copy.xpm
new file mode 100644 (file)
index 0000000..34f56e7
--- /dev/null
@@ -0,0 +1,74 @@
+/* XPM */
+static const char *edit_copy_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 52 1 ",
+"  c black",
+". c #6C6D6C",
+"X c #6F6F6F",
+"o c #737372",
+"O c #797A79",
+"+ c gray69",
+"@ c #B0B1B1",
+"# c #B1B1B1",
+"$ c #B1B2B2",
+"% c gray70",
+"& c #B4B4B4",
+"* c gray71",
+"= c #B7B7B7",
+"- c gray72",
+"; c #E2E2E2",
+": c #E4E4E4",
+"> c #E7E8E7",
+", c #E6EAEB",
+"< c #EAEAE9",
+"1 c #EAEBEA",
+"2 c #EAEBEB",
+"3 c #EBECEC",
+"4 c #ECEDED",
+"5 c #EDEEEE",
+"6 c #EEEEEE",
+"7 c #EFF0F0",
+"8 c gray94",
+"9 c #F0F1F1",
+"0 c #F1F2F2",
+"q c gray95",
+"w c #F2F3F3",
+"e c #F3F3F3",
+"r c #F4F4F3",
+"t c #F1F3F4",
+"y c #F3F4F4",
+"u c #F4F4F4",
+"i c #F4F5F5",
+"p c gray96",
+"a c #F5F6F6",
+"s c #F6F6F6",
+"d c gray97",
+"f c #F7F8F8",
+"g c #F8F8F8",
+"h c #F9F9F9",
+"j c gray98",
+"k c #FBFBFB",
+"l c #FAFCFD",
+"z c gray99",
+"x c #FDFDFD",
+"c c #FEFEFE",
+"v c white",
+"b c None",
+/* pixels */
+"bbbbbbbbbbbbbbbb",
+"bvvvvvvvvvvbbbbb",
+"bv244q7qqqvbbbbb",
+"bv47;++###- bbbb",
+"bv4p#vvvvvvvvvvb",
+"bvqp#v447qyyppvb",
+"bvpk%v4qqppkkpvb",
+"bvpk&vqqpkpkkkvb",
+"bvpk&vqppkkkzkvb",
+"bvkk&vqpklzzvzvb",
+"bvkv&vykkkp:2qtb",
+"bkvv&vpkkv:vvrXb",
+"bbbb vkkkv>vqXbb",
+"bbbbbvpvkv2qobbb",
+"bbbbbkvvvl,Obbbb",
+"bbbbbbbbbbbbbbbb"
+};
diff --git a/mgllab/xpm/edit-cut.xpm b/mgllab/xpm/edit-cut.xpm
new file mode 100644 (file)
index 0000000..5fb9079
--- /dev/null
@@ -0,0 +1,40 @@
+/* XPM */
+static const char *edit_cut_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 18 1 ",
+"  c black",
+". c #626262",
+"X c #6A6A6A",
+"o c gray42",
+"O c #8B8B8B",
+"+ c #D2D2D2",
+"@ c LightGray",
+"# c #D7D7D7",
+"$ c gray85",
+"% c gray86",
+"& c #EEEEEE",
+"* c gray94",
+"= c gray96",
+"- c #F8F8F8",
+"; c #F9F9F9",
+": c #FBFBFB",
+"> c #FEFEFE",
+", c None",
+/* pixels */
+",,,,,,,,,,,,,,,,",
+",,,,,o,,,,o,,,,,",
+",,,,,%,,,,%,,,,,",
+",,,,,>o,,o>,,,,,",
+",,,,,#%,,%$,,,,,",
+",,,,,.-oo-.,,,,,",
+",,,,,,@$$#,,,,,,",
+",,,,,,.--.,,,,,,",
+",,,,,,,&*,,,,,,,",
+",,,,,,o==o,,,,,,",
+",,,,,,@@@@,,,,,,",
+",,,,  O..O  ,,,,",
+",,     ,,     ,,",
+",  ,  ,,,,  ,  ,",
+", ,, ,,,,,, ,, ,",
+",   ,,,,,,,,   ,"
+};
diff --git a/mgllab/xpm/edit-delete.xpm b/mgllab/xpm/edit-delete.xpm
new file mode 100644 (file)
index 0000000..6af3872
--- /dev/null
@@ -0,0 +1,158 @@
+/* XPM */
+static const char *edit_delete_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 136 2 ",
+"   c #242727",
+".  c #272C2E",
+"X  c #282D2F",
+"o  c #292E30",
+"O  c #2B3132",
+"+  c #2B3133",
+"@  c #2E3434",
+"#  c #2E3436",
+"$  c #313432",
+"%  c #333734",
+"&  c #323838",
+"*  c #353939",
+"=  c #373A38",
+"-  c #393E3B",
+";  c #393D3C",
+":  c #3C4041",
+">  c #424745",
+",  c #434844",
+"<  c #454B47",
+"1  c #424749",
+"2  c #4C5052",
+"3  c #515756",
+"4  c #53585A",
+"5  c #555B59",
+"6  c #54595A",
+"7  c #575C5E",
+"8  c #585E5B",
+"9  c #5A5F60",
+"0  c #5C6362",
+"q  c #5F6764",
+"w  c #616866",
+"e  c #64696A",
+"r  c #686D6E",
+"t  c #6A716D",
+"y  c #69706E",
+"u  c #6B7171",
+"i  c #6E7672",
+"p  c #6E7774",
+"a  c #6F7875",
+"s  c #727373",
+"d  c #7A837E",
+"f  c #7E8785",
+"g  c gray53",
+"h  c #818A88",
+"j  c #878B88",
+"k  c #86898A",
+"l  c #838C89",
+"z  c #848C89",
+"x  c #858D8A",
+"c  c #898D8D",
+"v  c #8B8F8D",
+"b  c #8B8F8F",
+"n  c #8D948F",
+"m  c #899290",
+"M  c #939594",
+"N  c #929595",
+"B  c #909894",
+"V  c #919894",
+"C  c #979A9B",
+"Z  c #969C99",
+"A  c #979F9B",
+"S  c #979E9C",
+"D  c #989B99",
+"F  c #9B9C9B",
+"G  c #9B9D9B",
+"H  c #9A9C9C",
+"J  c #A0A3A1",
+"K  c #A1A4A4",
+"L  c #A0A7A4",
+"P  c #A2A8A0",
+"I  c #A2A8A3",
+"U  c #AAAFA7",
+"Y  c #ABB0A8",
+"T  c #AEB3AD",
+"R  c #ADAFB0",
+"E  c #AFB1B0",
+"W  c #AFB5B3",
+"Q  c #B0B6B4",
+"!  c #B3B8B0",
+"~  c #B3B8B3",
+"^  c #B6BBB3",
+"/  c #B5BAB5",
+"(  c #BABFB7",
+")  c #B7BBBB",
+"_  c #B9BBBB",
+"`  c #BCC0BF",
+"'  c #BFC0BF",
+"]  c #BEC1BF",
+"[  c #BFC1C1",
+"{  c #C2C5C4",
+"}  c #C7CAC4",
+"|  c #CBCEC7",
+" . c #CBCECB",
+".. c #CBCFCB",
+"X. c #CBCECD",
+"o. c #CCCFCF",
+"O. c #CCD0CF",
+"+. c #D2D5CD",
+"@. c #CFD2D0",
+"#. c #D1D4D2",
+"$. c #D2D5D3",
+"%. c #D2D6D2",
+"&. c #D4D7D5",
+"*. c #D6D9D2",
+"=. c #D6D9D3",
+"-. c #D5D8D6",
+";. c #D5D8D7",
+":. c #D6D9D7",
+">. c #D9DBD2",
+",. c #D9DBD4",
+"<. c #D9DBD6",
+"1. c #D8DBD7",
+"2. c #DADCD6",
+"3. c #D8DBD8",
+"4. c #DDDED9",
+"5. c #DDDFDC",
+"6. c #DFE0D8",
+"7. c #E6E6DD",
+"8. c #E0E2E2",
+"9. c #E3E5E0",
+"0. c #E5E5E1",
+"q. c #E5E6E0",
+"w. c #E3E5E4",
+"e. c #E3E5E5",
+"r. c #E4E5E5",
+"t. c #E9EAE3",
+"y. c #ECEDE9",
+"u. c #EEEFEC",
+"i. c #EFF0EE",
+"p. c #F0F0EB",
+"a. c #F0F0ED",
+"s. c #F4F4EF",
+"d. c #F4F3F1",
+"f. c #F3F4F0",
+"g. c #F4F4F1",
+"h. c None",
+/* pixels */
+"h.h.h.h.h.# # # # # + h.h.h.h.h.",
+"h.h.h.# e B t.u.i.$.{ D # h.h.h.",
+"h.h.1 <.} i >   $ d ~ ....# h.h.",
+"h.# =.+.2.T 0 * * 8 n U $./ # h.",
+"h.# 0.a.y.9.4.| ~ P ! ` Y  .+ h.",
+"h.# 8.7.s.d.f.s.p.7.*.B n c # h.",
+"h.# H { ` >.6.<.O.z C k 6 # # h.",
+"h.h.# 9 b R r.e.0.K r : 2 # h.h.",
+"h.h.# u % @ + + o . . - N # h.h.",
+"h.h.# W W y A y - q % w D # h.h.",
+"h.h.# ) 3.f $.f 3 m , a K # h.h.",
+"h.h.# ) 3.x 3.I 5 A < a J # h.h.",
+"h.h.# ) :.l <.I 5 H < p D # h.h.",
+"h.h.# E O._ 4.I 5 L j N s # h.h.",
+"h.h.h.# 7 G :.O.[ ` g 5 # h.h.h.",
+"h.h.h.h.h.# # # # # # h.h.h.h.h."
+};
diff --git a/mgllab/xpm/edit-find.xpm b/mgllab/xpm/edit-find.xpm
new file mode 100644 (file)
index 0000000..02cbeb6
--- /dev/null
@@ -0,0 +1,86 @@
+/* XPM */
+static const char *edit_find_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 64 1 ",
+"  c black",
+". c #010101",
+"X c #040404",
+"o c gray4",
+"O c #0B0B0B",
+"+ c #0E0E0E",
+"@ c #101010",
+"# c #111111",
+"$ c gray7",
+"% c #131313",
+"& c #151515",
+"* c #161616",
+"= c gray9",
+"- c #181818",
+"; c #1B1B1B",
+": c gray11",
+"> c gray12",
+", c #36281E",
+"< c #36281F",
+"1 c #38281F",
+"2 c #232323",
+"3 c #262523",
+"4 c gray14",
+"5 c #272727",
+"6 c #282828",
+"7 c gray17",
+"8 c #2C2C2C",
+"9 c #2D2D2D",
+"0 c #362A24",
+"q c #392C25",
+"w c #3C3028",
+"e c #323232",
+"r c #343231",
+"t c gray21",
+"y c #482100",
+"u c #4E2909",
+"i c #53331C",
+"p c #59483D",
+"a c #454240",
+"s c gray29",
+"d c gray30",
+"f c #4E4E4E",
+"g c #555352",
+"h c #565656",
+"j c #695746",
+"k c #68584D",
+"l c #766252",
+"z c #686868",
+"x c DimGray",
+"c c #6A6A6A",
+"v c #72706F",
+"b c gray45",
+"n c gray47",
+"m c #844007",
+"M c #86430B",
+"N c #90490B",
+"B c #845734",
+"V c #875B3B",
+"C c #90613D",
+"Z c #91623F",
+"A c #957254",
+"S c #817E7D",
+"D c #AB917A",
+"F c None",
+/* pixels */
+"FFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFFF",
+"FFFFF  FF  FFFFF",
+"FFFF2z4FF4z2FFFF",
+"FFF 88&&&&68 FFF",
+"FF;b8s&zh&d8b;FF",
+"F tdzed# dezdt F",
+"F&zSn46;;62nSz&F",
+" hqupv:64:vp10g ",
+"OwiCVk;  &kBZiqX",
+" ,yiNl+FF#lNmu, ",
+" 3jADp FF aDAj3 ",
+"F #rO FFFF Or# F",
+"FFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFFF",
+"FFFFFFFFFFFFFFFF"
+};
diff --git a/mgllab/xpm/edit-paste.xpm b/mgllab/xpm/edit-paste.xpm
new file mode 100644 (file)
index 0000000..73f99b0
--- /dev/null
@@ -0,0 +1,120 @@
+/* XPM */
+static const char *edit_paste_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 98 2 ",
+"   c #070707",
+".  c #0C0C0C",
+"X  c #111111",
+"o  c gray8",
+"O  c #161616",
+"+  c gray9",
+"@  c #181818",
+"#  c gray10",
+"$  c #1B1B1B",
+"%  c gray11",
+"&  c #1E1E1E",
+"*  c gray12",
+"=  c gray13",
+"-  c #222222",
+";  c #232323",
+":  c gray14",
+">  c #252525",
+",  c gray15",
+"<  c #272727",
+"1  c #282828",
+"2  c gray18",
+"3  c gray19",
+"4  c #313131",
+"5  c #323232",
+"6  c #353535",
+"7  c #393939",
+"8  c #3A3A3A",
+"9  c gray23",
+"0  c #3E3E3E",
+"q  c gray27",
+"w  c #494949",
+"e  c gray29",
+"r  c #4B4B4B",
+"t  c #4C4D4C",
+"y  c #666766",
+"u  c #686D6D",
+"i  c #848484",
+"p  c gray52",
+"a  c #AEAEAE",
+"s  c #AFAFAF",
+"d  c gray69",
+"f  c #B1B1B1",
+"g  c gray70",
+"h  c #B3B4B3",
+"j  c gray71",
+"k  c #B6B6B6",
+"l  c #B7B7B7",
+"z  c gray72",
+"x  c #BBBBBB",
+"c  c #C5C5C5",
+"v  c #C8C8C8",
+"b  c #CACACA",
+"n  c gray80",
+"m  c #CDCDCD",
+"M  c #CECECE",
+"N  c #D5D5D5",
+"B  c #DADADA",
+"V  c #DCDCDD",
+"C  c #DDDEDF",
+"Z  c gray87",
+"A  c #E1E1E1",
+"S  c #E2E3E3",
+"D  c gray89",
+"F  c #E3E5E5",
+"G  c #E4E4E4",
+"H  c #E5E6E7",
+"J  c #E6E6E6",
+"K  c #E8E9E9",
+"L  c #E9EAEA",
+"P  c #EAEBEB",
+"I  c #EBECEC",
+"U  c #ECECEC",
+"Y  c #ECEDED",
+"T  c gray93",
+"R  c #EDEEEE",
+"E  c #EEEFEF",
+"W  c gray94",
+"Q  c #F0F1F1",
+"!  c #F1F1F1",
+"~  c #F1F2F2",
+"^  c gray95",
+"/  c #F2F3F3",
+"(  c #F3F3F3",
+")  c #F4F4F4",
+"_  c #F4F5F5",
+"`  c gray96",
+"'  c #F6F6F6",
+"]  c gray97",
+"[  c #F8F8F8",
+"{  c #F8F9F9",
+"}  c #F9F9F9",
+"|  c gray98",
+" . c #FBFBFB",
+".. c #FCFCFB",
+"X. c #FDFDFD",
+"o. c #FEFEFE",
+"O. c white",
+"+. c None",
+/* pixels */
+"+.+.+.+.G B B G +.+.+.+.+.+.+.+.",
+"+.8 . N p O.O.p N   8 +.+.+.+.+.",
+"; r o O.W T T W O.; r ; +.+.+.+.",
+"; , n s s f f f f n # ; +.+.+.+.",
+"; ; O.W ] ] D k k n   X +.+.+.+.",
+"& , O.W ] W s O.O.O.O.O.O.O.O.+.",
+"& , O.W W W f O.C D H K P T { +.",
+"# , O.W ] ] f O.F L P Q Q W O.+.",
+"o , O.W ] ] f O.L T Q W ] ] O.+.",
+"o , O.W W { k O.T W ] ] { { O.+.",
+"# , O.] ] { k O.W _ ] { O.O.O.+.",
+"# ; O.) ] { k O._ ] D h f z B +.",
+"; & O.O.O.O.c O.] { C b O.O.y +.",
+", 8 4 0 q r , O.]  .C b  .t +.+.",
+"u 2 4 4 4 4 o O.O.O.F z 6 +.+.+.",
+"+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+."
+};
diff --git a/mgllab/xpm/edit-redo.xpm b/mgllab/xpm/edit-redo.xpm
new file mode 100644 (file)
index 0000000..50b8185
--- /dev/null
@@ -0,0 +1,113 @@
+/* XPM */
+static const char *edit_redo_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 91 1 ",
+"  c #007F00",
+". c #008300",
+"X c #008600",
+"o c #018601",
+"O c #008A00",
+"+ c #028B01",
+"@ c #008C00",
+"# c #018C00",
+"$ c #018D00",
+"% c #018C01",
+"& c #018D01",
+"* c #028C01",
+"= c #028D01",
+"- c #038D01",
+"; c #028D02",
+": c #028E02",
+"> c #038E02",
+", c #048F02",
+"< c #108A0A",
+"1 c #049003",
+"2 c #059003",
+"3 c #079104",
+"4 c #089106",
+"5 c #0B9706",
+"6 c #0A9209",
+"7 c #0F950B",
+"8 c #0E970A",
+"9 c #0D9908",
+"0 c #119D09",
+"q c #109F09",
+"w c #149A0F",
+"e c #149810",
+"r c #179C11",
+"t c #199916",
+"y c #0FAF0A",
+"u c #12AD0D",
+"i c #17AF0F",
+"p c #01B401",
+"a c #03B503",
+"s c #05B505",
+"d c #0FB00A",
+"f c #0BB50B",
+"g c #14B50D",
+"h c #19A110",
+"j c #18A411",
+"k c #12B811",
+"l c #14B912",
+"z c #16B916",
+"x c #18BB17",
+"c c #1DB419",
+"v c #1EBB1D",
+"b c #20A61B",
+"n c #32B21D",
+"m c #33B61F",
+"M c #32AE29",
+"N c #35AE2B",
+"B c #23BE20",
+"V c #23BC22",
+"C c #27BD22",
+"Z c #26BD24",
+"A c #32BC20",
+"S c #36B825",
+"D c #36BA24",
+"F c #39BD21",
+"G c #33C12E",
+"H c #3AC631",
+"J c #38C433",
+"K c #3EC336",
+"L c #3CC834",
+"P c #40C737",
+"I c #48C23F",
+"U c #4CCB43",
+"Y c #4DCB43",
+"T c #50CA46",
+"R c #58C448",
+"E c #5CC64C",
+"W c #5DC64E",
+"Q c #55CF49",
+"! c #5ED254",
+"~ c #64D354",
+"^ c #65D157",
+"/ c #65D455",
+"( c #66D456",
+") c #66D258",
+"_ c #67D658",
+"` c #69D058",
+"' c #72D75E",
+"] c #7FDF67",
+"[ c #85DB6E",
+"{ c #86DB6E",
+"} c None",
+/* pixels */
+"}}}}}&3468}}}}}}",
+"}}}}1MR{{WN,}}&,",
+"}}&r']]]]]]`w,W&",
+"}&e_((QHL!~~~))&",
+"}&UUUvyqjglPYYT,",
+"&tJJx7+&&+hsGJK&",
+"+jZVu+}}}&ikVZC&",
+"&cxf8+}}&FADSmn+",
+"&uap5&}}+&&+X. }",
+"+q}}}X}}}}}}}}}}",
+"}<}}}}}}}}}}}}}}",
+"}}}}}}}}}}}}}}}}",
+"}}}}}}}}}}}}}}}}",
+"}}}}}}}}}}}}}}}}",
+"}}}}}}}}}}}}}}}}",
+"}}}}}}}}}}}}}}}}"
+};
diff --git a/mgllab/xpm/edit-select-all.xpm b/mgllab/xpm/edit-select-all.xpm
new file mode 100644 (file)
index 0000000..5d44ccc
--- /dev/null
@@ -0,0 +1,108 @@
+/* XPM */
+static const char *edit_select_all_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 86 1 ",
+"  c #535453",
+". c #545554",
+"X c #5B5C5A",
+"o c #276CA1",
+"O c #6193B9",
+"+ c #46AFFF",
+"@ c #47AFFF",
+"# c #49B1FF",
+"$ c #4AB1FF",
+"% c #4BB1FF",
+"& c #4CB1FF",
+"* c #4DB2FF",
+"= c #4EB2FF",
+"- c #4FB2FF",
+"; c #4EB3FF",
+": c #4FB3FF",
+"> c #4FB4FF",
+", c #50B3FF",
+"< c #51B4FF",
+"1 c #52B4FF",
+"2 c #54B5FF",
+"3 c #55B5FF",
+"4 c #55B6FF",
+"5 c #56B6FF",
+"6 c #57B6FF",
+"7 c #59B7FE",
+"8 c #58B7FF",
+"9 c #59B7FF",
+"0 c #5EB9FF",
+"q c #5FBAFF",
+"w c #61BBFF",
+"e c #62BBFF",
+"r c #6EC0FF",
+"t c #6FC1FF",
+"y c #7AC6FF",
+"u c #7DC7FF",
+"i c #7EC7FF",
+"p c #7FC8FF",
+"a c #8293A1",
+"s c #B1ADAA",
+"d c #B4B4B4",
+"f c #C3C0BC",
+"g c #80C8FF",
+"h c #91CFFF",
+"j c #92D0FE",
+"k c #99D3FF",
+"l c #A3D7FF",
+"z c #B1DDFF",
+"x c #BCE2FF",
+"c c #CFD7DB",
+"v c #D8DDE0",
+"b c #C9E7FF",
+"n c #CFEAFF",
+"m c #D0EBFF",
+"M c #D3ECFF",
+"N c #DDF0FF",
+"B c #DEF0FF",
+"V c #E3E6E9",
+"C c #E1F2FF",
+"Z c #E5F4FF",
+"A c #E9F6FF",
+"S c #EDF7FF",
+"D c #FCF6F2",
+"F c #FFF9F5",
+"G c #FFFDF4",
+"H c #FFFFF7",
+"J c AliceBlue",
+"K c #F3F9FF",
+"L c #F4F9FF",
+"P c #F8F8F8",
+"I c gray98",
+"U c #FBFBFB",
+"Y c #FFFDF8",
+"T c #FFFFF8",
+"R c #FFFFF9",
+"E c #FFFFFA",
+"W c #FFFFFB",
+"Q c gray99",
+"! c #FDFDFD",
+"~ c #FFFFFC",
+"^ c #FFFFFD",
+"/ c #FDFEFF",
+"( c #FEFEFE",
+") c #FFFFFE",
+"_ c white",
+"` c None",
+/* pixels */
+"````````````````",
+"``____________``",
+"``_0*%*80**%D_``",
+"``_hbJSnLA_tF_``",
+"``_<8883p33<T_``",
+"``_*gy38p3883_``",
+"``_jZCBzmB_Mi_``",
+"``_@**,w*****_``",
+"``_GTTTTT_____``",
+"``_%we,0w*>3T_``",
+"``_kALl_xVaOfv``",
+"``_@**<3<o___ ``",
+"``_TTT___s__X```",
+"``_PI_Q_Id_X````",
+"``_______c.`````",
+"````````````````"
+};
diff --git a/mgllab/xpm/edit-undo.xpm b/mgllab/xpm/edit-undo.xpm
new file mode 100644 (file)
index 0000000..82864bb
--- /dev/null
@@ -0,0 +1,131 @@
+/* XPM */
+static const char *edit_undo_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 109 2 ",
+"   c #8C6803",
+".  c #8E6902",
+"X  c #856708",
+"o  c #996505",
+"O  c #976B04",
+"+  c #9C7603",
+"@  c #9E7702",
+"#  c #9F7801",
+"$  c #95780D",
+"%  c #9E7812",
+"&  c #A26B03",
+"*  c #A07B03",
+"=  c #A37D02",
+"-  c #A57E00",
+";  c #A67F00",
+":  c #A67F01",
+">  c #A57E06",
+",  c #A78001",
+"<  c #A78101",
+"1  c #A88001",
+"2  c #A88101",
+"3  c #A98302",
+"4  c #A98203",
+"5  c #AA8303",
+"6  c #A98505",
+"7  c #AD8504",
+"8  c #AB890E",
+"9  c #AD8A0C",
+"0  c #B98F08",
+"q  c #B0900D",
+"w  c #B0910D",
+"e  c #B1910D",
+"r  c #B49210",
+"t  c #B79319",
+"y  c #B99C1D",
+"u  c #AE8833",
+"i  c #CA8403",
+"p  c #C18806",
+"a  c #C58B07",
+"s  c #CD8806",
+"d  c #C78208",
+"f  c #DB8B04",
+"g  c #DC8F0B",
+"h  c #D59C0E",
+"j  c #C89614",
+"k  c #C39D11",
+"l  c #C29C16",
+"z  c #C49F17",
+"x  c #C59019",
+"c  c #DE961A",
+"v  c #E09C1F",
+"b  c #DAB316",
+"n  c #D7BA11",
+"m  c #D1B218",
+"M  c #C39336",
+"N  c #D69D34",
+"B  c #C8A321",
+"V  c #C4A924",
+"C  c #C5AC27",
+"Z  c #CAAA26",
+"A  c #DEAA21",
+"S  c #D5B920",
+"D  c #D0B228",
+"F  c #C9A235",
+"G  c #C3A935",
+"H  c #E2A227",
+"J  c #E3A733",
+"K  c #E4A839",
+"L  c #E8B73A",
+"P  c #E8B73E",
+"I  c #E0B93F",
+"U  c #E1C92E",
+"Y  c #C8AD44",
+"T  c #E3BB40",
+"R  c #E8B448",
+"E  c #DDC548",
+"W  c #E7CF4E",
+"Q  c #ECC155",
+"!  c #ECC156",
+"~  c #E6C850",
+"^  c #EEC854",
+"/  c #EBCD55",
+"(  c #E9CE56",
+")  c #EAC65B",
+"_  c #EBCB5D",
+"`  c #EECA5C",
+"'  c #EBCF5C",
+"]  c #EFCC5F",
+"[  c #EBD354",
+"{  c #EED159",
+"}  c #EFD363",
+"|  c #EFD463",
+" . c #EED164",
+".. c #F3D965",
+"X. c #F3DA65",
+"o. c #F1D967",
+"O. c #F3D966",
+"+. c #F3DB66",
+"@. c #F3DE64",
+"#. c #F5DF67",
+"$. c #F3D969",
+"%. c #F3DA68",
+"&. c #F3DC68",
+"*. c #F4DF69",
+"=. c #F7E567",
+"-. c #F5E069",
+";. c #F9EC71",
+":. c #F9EC72",
+">. c None",
+/* pixels */
+">.>.>.>.>.3 r G Y t 3 >.>.>.>.>.",
+"9 y >.>.V [ #.;.;.#.[ B >.>.>.>.",
+"w o.C E #.=.=.=.=.=.=.-.T 5 >.>.",
+"w $.$.&.+.o.] P L ^ o.o.$.F : >.",
+"w  .} } / A h j x s H ` ] ) % >.",
+"w _ ' ( b k $ = * X o v Q Q u - ",
+"w T ~ W U n 9 >.>.>.> i J R M + ",
+"6 l z Z D S m 4 >.>.3 a c K N   ",
+">.: : : : : : : >.>.3 p f g d   ",
+">.>.>.>.>.>.>.>.>.>.7 >.>.>.& * ",
+">.>.>.>.>.>.>.>.- 3 0 >.>.>.O - ",
+">.>.>.>.>.>.>.>.>.>.>.>.>.>.+ >.",
+">.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.",
+">.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.",
+">.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.",
+">.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>."
+};
diff --git a/mgllab/xpm/edit_xpm b/mgllab/xpm/edit_xpm
new file mode 100755 (executable)
index 0000000..cc556d6
--- /dev/null
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+for file in *.png
+do
+       convert $file $file.xpm
+       sed 's/_png/_xpm/' $file.xpm > 1.tmp
+       sed 's/static /static const /' 1.tmp > $file.xpm
+done
+rename 's/png.//' *.xpm
diff --git a/mgllab/xpm/fileprint.xpm b/mgllab/xpm/fileprint.xpm
new file mode 100644 (file)
index 0000000..6ada912
--- /dev/null
@@ -0,0 +1,24 @@
+/* XPM */
+static const char *fileprint[] = {
+"    16    14        6            1",
+". c #000000",
+"# c #848284",
+"a c #c6c3c6",
+"b c #ffff00",
+"c c #ffffff",
+"d c None",
+"ddddd.........dd",
+"dddd.cccccccc.dd",
+"dddd.c.....c.ddd",
+"ddd.cccccccc.ddd",
+"ddd.c.....c....d",
+"dd.cccccccc.a.a.",
+"d..........a.a..",
+".aaaaaaaaaa.a.a.",
+".............aa.",
+".aaaaaa###aa.a.d",
+".aaaaaabbbaa...d",
+".............a.d",
+"d.aaaaaaaaa.a.dd",
+"dd...........ddd"
+};
diff --git a/mgllab/xpm/first.xpm b/mgllab/xpm/first.xpm
new file mode 100644 (file)
index 0000000..0265075
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * first_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #0000FF",
+"                ",
+"                ",
+"                ",
+"  ..         .  ",
+"  ..       ...  ",
+"  ..     .....  ",
+"  ..   .......  ",
+"  .. .........  ",
+"  ............  ",
+"  ............  ",
+"  .. .........  ",
+"  ..   .......  ",
+"  ..     .....  ",
+"  ..       ...  ",
+"  ..         .  ",
+"                "};
diff --git a/mgllab/xpm/folder.xpm b/mgllab/xpm/folder.xpm
new file mode 100644 (file)
index 0000000..6473918
--- /dev/null
@@ -0,0 +1,130 @@
+/* XPM */
+static const char * folder_xpm[] = {
+"16 16 111 2",
+"      c None",
+".     c #7A7A7A",
+"+     c #797979",
+"@     c #787878",
+"#     c #C9C9C9",
+"$     c #C7C7C7",
+"%     c #C5C5C5",
+"&     c #C4C4C4",
+"*     c #B4B4B4",
+"=     c #747474",
+"-     c #737373",
+";     c #B0B0B0",
+">     c #ADADAD",
+",     c #ABABAB",
+"'     c #AAAAAA",
+")     c #ACACAC",
+"!     c #8D8D8D",
+"~     c #8C8C8C",
+"{     c #808080",
+"]     c #6C6C6C",
+"^     c #6E6E6E",
+"/     c #C1C1C0",
+"(     c #A7A7A7",
+"_     c #A5A5A5",
+":     c #A4A4A4",
+"<     c #B6B6B6",
+"[     c #B9B9B9",
+"}     c #BBBBBB",
+"|     c #A2A2A2",
+"1     c #6A6A6A",
+"2     c #BDBDBD",
+"3     c #416DA6",
+"4     c #3666A5",
+"5     c #3566A4",
+"6     c #3465A4",
+"7     c #3768A6",
+"8     c #656565",
+"9     c #B7B7B7",
+"0     c #3566A5",
+"a     c #BED3EA",
+"b     c #BFD4EA",
+"c     c #BED4EA",
+"d     c #BED3E9",
+"e     c #B8CFE8",
+"f     c #3465A5",
+"g     c #5F5F5F",
+"h     c #B3B3B3",
+"i     c #C1D5EA",
+"j     c #91B4DB",
+"k     c #91B5DB",
+"l     c #92B5DB",
+"m     c #96B8DC",
+"n     c #B7CFE7",
+"o     c #3466A4",
+"p     c #5B5B5B",
+"q     c #AEAEAE",
+"r     c #3667A5",
+"s     c #C4D7EB",
+"t     c #94B7DC",
+"u     c #91B4DA",
+"v     c #B6CDE6",
+"w     c #565656",
+"x     c #A9A9A9",
+"y     c #3666A4",
+"z     c #C6D8EC",
+"A     c #99BADD",
+"B     c #95B7DC",
+"C     c #8EB2DA",
+"D     c #8BB0D9",
+"E     c #B8CFE7",
+"F     c #515151",
+"G     c #A5A5A4",
+"H     c #3767A5",
+"I     c #BED2E9",
+"J     c #9BBADD",
+"K     c #99B9DD",
+"L     c #95B6DC",
+"M     c #90B3DA",
+"N     c #8EB2D9",
+"O     c #89AED8",
+"P     c #87ADD7",
+"Q     c #8BB0D8",
+"R     c #B1C9E5",
+"S     c #4C4C4C",
+"T     c #A1A1A1",
+"U     c #3868A5",
+"V     c #A9C4E2",
+"W     c #81A8D5",
+"X     c #7AA4D3",
+"Y     c #7EA7D4",
+"Z     c #9CBADD",
+"`     c #484848",
+" .    c #9B9B9B",
+"..    c #3867A4",
+"+.    c #85ABD5",
+"@.    c #6E9CCE",
+"#.    c #6D9CCE",
+"$.    c #709ECF",
+"%.    c #84ABD5",
+"&.    c #494949",
+"*.    c #999999",
+"=.    c #3968A5",
+"-.    c #7EA6D3",
+";.    c #78A3D2",
+">.    c #79A4D3",
+",.    c #7AA5D1",
+"'.    c #788697",
+").    c #3A69A5",
+"!.    c #5083BA",
+"~.    c #4578B2",
+"{.    c #464D53",
+"                                ",
+". + + + + + +                   ",
+"@ # $ % & & * =                 ",
+"- % ; > , ' ) ! ! ~ ~ ~ { ]     ",
+"^ / ) ' ( _ : : ) < [ } | 1     ",
+"1 2 3 4 4 4 4 4 5 5 5 5 6 6 6 7 ",
+"8 9 0 a b b c c c d d d d d e f ",
+"g h 5 i j j k k l l l l l m n o ",
+"p q r s t t t t t t t t t u v 0 ",
+"w x y z A A A A A A A B C D E 0 ",
+"F G H I J K L l M N O P P Q R 0 ",
+"S T U V W X X X X X X X X Y Z 0 ",
+"`  ...+.@.#.#.#.#.#.#.#.#.$.%.0 ",
+"&.*.=.-.;.;.;.;.;.;.;.;.;.>.,.0 ",
+"` '.).!.!.!.!.!.!.!.!.!.!.!.~.4 ",
+"{.6 6 6 6 6 6 6 6 6 6 6 6 6 5   "};
diff --git a/mgllab/xpm/format-indent-more.xpm b/mgllab/xpm/format-indent-more.xpm
new file mode 100644 (file)
index 0000000..43f5c81
--- /dev/null
@@ -0,0 +1,56 @@
+/* XPM */
+static const char *format_indent_more_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 34 1 ",
+"  c #921B18",
+". c #A22320",
+"X c #BE3936",
+"o c #D35451",
+"O c #D35653",
+"+ c #D45552",
+"@ c #D55653",
+"# c #E57471",
+"$ c #E67572",
+"% c #E67772",
+"& c #E67674",
+"* c #498DC7",
+"= c #4C8ECC",
+"- c #4E8FCC",
+"; c #4B90CB",
+": c #F39795",
+"> c #F39B97",
+", c #F49A98",
+"< c #F49A9A",
+"1 c #F39D99",
+"2 c #F8AEAA",
+"3 c #F8AEAC",
+"4 c #F8B0AC",
+"5 c #F8B1AC",
+"6 c #F8B2AE",
+"7 c #F8B3B0",
+"8 c #F9B5B1",
+"9 c #F9B7B3",
+"0 c #FABFBA",
+"q c #FBCAC7",
+"w c #FCD2D2",
+"e c #FEFEFE",
+"r c white",
+"t c None",
+/* pixels */
+"t-************-t",
+"t*rrrrrrrrrrrr;t",
+"t*rrrrrrrrrrrr;t",
+"t*rrrrr;;;;;rr;t",
+"t*rrrrr0rrrrrr*t",
+"t*rrrrr.9rrrrr;t",
+"t*rrrrr. 9rrrr;t",
+"t*w<&@X.  7rrr;t",
+"t*w>&oX.   6rr*t",
+"t*w1$@X.    3r;t",
+"t*w>$oX.   2rr;t",
+"t*w>$oX.  2rrr;t",
+"t*rrrrr. 6rrrr;t",
+"t*rrrrr.4rrrrr;t",
+"t*rrrrrqrrrrrr;t",
+"t-;;;;;;;*;;;*-t"
+};
diff --git a/mgllab/xpm/format-stroke-color.xpm b/mgllab/xpm/format-stroke-color.xpm
new file mode 100644 (file)
index 0000000..96c397f
--- /dev/null
@@ -0,0 +1,87 @@
+/* XPM */
+static const char *format_stroke_color_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 65 1 ",
+"  c #010101",
+". c gray2",
+"X c #0E0E0E",
+"o c #0B1111",
+"O c #131313",
+"+ c gray8",
+"@ c #171716",
+"# c #1D1D1D",
+"$ c #1E1E1E",
+"% c gray12",
+"& c #2A261A",
+"* c #162323",
+"= c #1D2424",
+"- c #1B2C2C",
+"; c #0F3131",
+": c #202020",
+"> c #222222",
+", c #232323",
+"< c #212424",
+"1 c gray14",
+"2 c #222828",
+"3 c gray16",
+"4 c gray17",
+"5 c #2D2D2D",
+"6 c #353535",
+"7 c #393939",
+"8 c #49301E",
+"9 c #4E273A",
+"0 c #5C2531",
+"q c #662226",
+"w c #693A34",
+"e c #4F6F2E",
+"r c #456238",
+"t c #736433",
+"y c #786836",
+"u c #342A4B",
+"i c #282D55",
+"p c #2B3D53",
+"a c #22335A",
+"s c #402842",
+"d c #33494A",
+"f c #3B4D4D",
+"g c #3C5541",
+"h c gray27",
+"j c #605945",
+"k c #686868",
+"l c red",
+"z c #827B68",
+"x c #00CC00",
+"c c #AB8F33",
+"v c #99FF00",
+"b c #C6AF66",
+"n c #330098",
+"m c #340098",
+"M c #340099",
+"N c #670098",
+"B c #660099",
+"V c #0033CC",
+"C c #0034CD",
+"Z c #CC0099",
+"A c #808080",
+"S c #818181",
+"D c gray58",
+"F c #A9A395",
+"G c None",
+/* pixels */
+"G.GGGGGGGGGGGGGG",
+"X4SGGGGGGGGGGGGG",
+"GDk GCVGGnmGGGGG",
+"G42=oGVGGnmGGGGG",
+"GG;-*6GGGGGGNNGG",
+"GGGf<%hGGGGGNGGG",
+"GGGGS1%GGGGGGGGG",
+"GxxGG7,5GGGGGGZZ",
+"GxGGGG,,4GGGGGZG",
+"GGGGGGO,%%GGGGGG",
+"GvvGGGGO%O&GGGlG",
+"GvvGGGGG@jcGGGlG",
+"GGGGGGGGGFbyGGGG",
+"GGGGGGGGGGztGGGG",
+"GGGGGGGGGGGw8GGG",
+"Gergdpaius90qGGG"
+};
diff --git a/mgllab/xpm/func.xpm b/mgllab/xpm/func.xpm
new file mode 100644 (file)
index 0000000..e62cfe7
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * func_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"                ",
+"                ",
+"   .   .    .   ",
+"  .   .      .  ",
+"  .   .      .  ",
+" ... .  .  .  . ",
+"  .  .  .  .  . ",
+"  .  .   ..   . ",
+"  .  .   ..   . ",
+"  .  .  .  .  . ",
+"  .   . .  . .  ",
+"      .      .  ",
+"       .    .   ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/go-bottom.xpm b/mgllab/xpm/go-bottom.xpm
new file mode 100644 (file)
index 0000000..1ccde51
--- /dev/null
@@ -0,0 +1,108 @@
+/* XPM */
+static const char *go_bottom_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 86 1 ",
+"  c #122742",
+". c #102746",
+"X c #1F3344",
+"o c #1E3659",
+"O c #233847",
+"+ c #263F5E",
+"@ c #1E3962",
+"# c #233E60",
+"$ c #29446B",
+"% c #384D6A",
+"& c #35576D",
+"* c #36576D",
+"= c #224470",
+"- c #274873",
+"; c #3A577D",
+": c #365788",
+"> c #37598C",
+", c #3A5E8F",
+"< c #3C5E8E",
+"1 c #3C5F8F",
+"2 c #3D5F8F",
+"3 c #386785",
+"4 c #386885",
+"5 c #2558A5",
+"6 c #426084",
+"7 c #456386",
+"8 c #44628A",
+"9 c #42628F",
+"0 c #4F6B8C",
+"q c #526B8D",
+"w c #526D8E",
+"e c #536E8F",
+"r c #4D6D95",
+"t c #4E6D96",
+"y c #4F709B",
+"u c #4F719C",
+"i c #547091",
+"p c #567295",
+"a c #567395",
+"s c #597497",
+"d c #5E7797",
+"f c #577598",
+"g c #54749D",
+"h c #54749E",
+"j c #59789B",
+"k c #617D9C",
+"l c #617E9D",
+"z c #627E9D",
+"x c #436CA2",
+"c c #486FA4",
+"v c #4E73A9",
+"b c #4F74AA",
+"n c #5071A0",
+"m c #5877A4",
+"M c #5778A2",
+"N c #5C7CAB",
+"B c #5C7DAC",
+"V c #5A80B7",
+"C c #5B80B7",
+"Z c #5D83B8",
+"A c #5D83B9",
+"S c #6181AF",
+"D c #6383AE",
+"F c #6C8AAB",
+"G c #6E8CAB",
+"H c #6383B0",
+"J c #6384B3",
+"K c #6586B4",
+"L c #678BB3",
+"P c #6B8FB7",
+"I c #6187BD",
+"U c #648ABC",
+"Y c #7094BE",
+"T c #6B91C2",
+"R c #6C90C6",
+"E c #6C91C6",
+"W c #7498C1",
+"Q c #7599CE",
+"! c #799DD2",
+"~ c #7A9ED2",
+"^ c #7FA6D5",
+"/ c #81A8D7",
+"( c #88ABDE",
+") c #92B5E7",
+"_ c #93B5E7",
+"` c None",
+/* pixels */
+"`````HugyyD`````",
+"````5xkkDdc`````",
+"`>0eiafjffaiedN`",
+"``o;8rgMjgrsq%``",
+"```$9nBJKHm:@```",
+"```.<vVIICb2 ```",
+"````#ZRQQRZ+````",
+"`````6!((!7`````",
+"``````L))P``````",
+"``````X^/O``````",
+"```````**```````",
+"````````````````",
+"```````YW```````",
+"``````,GF<``````",
+"``````=UT-``````",
+"```````44```````"
+};
diff --git a/mgllab/xpm/go-down.xpm b/mgllab/xpm/go-down.xpm
new file mode 100644 (file)
index 0000000..4d2c523
--- /dev/null
@@ -0,0 +1,122 @@
+/* XPM */
+static const char *go_down_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 100 2 ",
+"   c #070E17",
+".  c #030B18",
+"X  c #070E18",
+"o  c #040E1D",
+"O  c #040F1F",
+"+  c #051327",
+"@  c #0E1725",
+"#  c #0F1927",
+"$  c #0C203C",
+"%  c #092041",
+"&  c #0B2244",
+"*  c #0E2444",
+"=  c #0B2449",
+"-  c #1E324E",
+";  c #0D2952",
+":  c #0F2B55",
+">  c #0F2D59",
+",  c #112D57",
+"<  c #102E5B",
+"1  c #11305D",
+"2  c #11315F",
+"3  c #1B365E",
+"4  c #243958",
+"5  c #123261",
+"6  c #143465",
+"7  c #143566",
+"8  c #153769",
+"9  c #15376B",
+"0  c #16396E",
+"q  c #173C72",
+"w  c #173D74",
+"e  c #1A427E",
+"r  c #254470",
+"t  c #264677",
+"y  c #2E4B72",
+"u  c #2C4B7A",
+"i  c #345178",
+"p  c #1D4887",
+"a  c #1F4D90",
+"s  c #385782",
+"d  c #3B5D8E",
+"f  c #204E91",
+"g  c #204E93",
+"h  c #214F95",
+"j  c #215097",
+"k  c #225198",
+"l  c #22529A",
+"z  c #415E83",
+"x  c #445C80",
+"c  c #446287",
+"v  c #4B6387",
+"b  c #4A688D",
+"n  c #476894",
+"m  c #44689C",
+"M  c #4C6F9F",
+"N  c #526F91",
+"B  c #506E93",
+"V  c #557293",
+"C  c #537297",
+"Z  c #567394",
+"A  c #57769B",
+"S  c #58769C",
+"D  c #5F7C9B",
+"F  c #59789E",
+"G  c #607D9B",
+"H  c #617E9C",
+"J  c #627E9C",
+"K  c #496EA3",
+"L  c #4C70A3",
+"P  c #5173A1",
+"I  c #5474A2",
+"U  c #5676A4",
+"Y  c #5578A7",
+"T  c #5779A8",
+"R  c #5378AF",
+"E  c #5478AC",
+"W  c #567CB2",
+"Q  c #5C81B8",
+"!  c #5D83B9",
+"~  c #6E8BA7",
+"^  c #6F8CA8",
+"/  c #708DA9",
+"(  c #7D9AB4",
+")  c #7E9BB5",
+"_  c #7E9CB6",
+"`  c #7F9CB6",
+"'  c #668CC2",
+"]  c #6C90C6",
+"[  c #7297CB",
+"{  c #7398CC",
+"}  c #759ACE",
+"|  c #7A9ED2",
+" . c #85A2BC",
+".. c #86A3BD",
+"X. c #87A4BE",
+"o. c #83A7DA",
+"O. c #88ABDE",
+"+. c #89ACDF",
+"@. c #8CAFE2",
+"#. c None",
+/* pixels */
+"#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.",
+"#.#.#.#.#.l l h h f f #.#.#.#.#.",
+"#.#.#.#.#.f ....X.X.p #.#.#.#.#.",
+"#.#.#.#.#.p ( ) _ _ e #.#.#.#.#.",
+"#.#.#.#.#.e ~ ~ / / w #.#.#.#.#.",
+"#.#.#.#.#.q D G J J 8 #.#.#.#.#.",
+"#.#.0 8 7 7 N V Z Z 5 5 1 < > #.",
+"#.#.5 i z b C S S A B c y ; #.#.",
+"#.#., 3 s n P Y T K d t < = #.#.",
+"#.#.#.* r m R ! ! W K u % #.#.#.",
+"#.#.#.#.$ K ' [ } ] T * #.#.#.#.",
+"#.#.#.#.+ - [ O.@.| 4 #.#.#.#.#.",
+"#.#.#.#.#.O x o.+.v O #.#.#.#.#.",
+"#.#.#.#.#.#.  I U   #.#.#.#.#.#.",
+"#.#.#.#.#.#.#.# @ #.#.#.#.#.#.#.",
+"#.#.#.#.#.#.#.. . #.#.#.#.#.#.#."
+};
diff --git a/mgllab/xpm/go-first-view.xpm b/mgllab/xpm/go-first-view.xpm
new file mode 100644 (file)
index 0000000..dff3d3f
--- /dev/null
@@ -0,0 +1,138 @@
+/* XPM */
+static const char *go_first_view_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 116 2 ",
+"   c #081D3E",
+".  c #081E40",
+"X  c #082247",
+"o  c #0B2346",
+"O  c #09264F",
+"+  c #0B2A57",
+"@  c #0E2B58",
+"#  c #0F2C58",
+"$  c #1A355E",
+"%  c #0E2F60",
+"&  c #113161",
+"*  c #153764",
+"=  c #163667",
+"-  c #103369",
+";  c #18396B",
+":  c #1B3E6D",
+">  c #123971",
+",  c #183D73",
+"<  c #143D79",
+"1  c #2B4A74",
+"2  c #2C4B74",
+"3  c #234679",
+"4  c #244E7D",
+"5  c #2D4C7B",
+"6  c #294A7D",
+"7  c #314F7B",
+"8  c #355279",
+"9  c #174282",
+"0  c #19468A",
+"q  c #1C4C93",
+"w  c #2B5083",
+"e  c #2E5285",
+"r  c #2E5788",
+"t  c #36598C",
+"y  c #214F94",
+"u  c #21529D",
+"i  c #395E92",
+"p  c #325C99",
+"a  c #376093",
+"s  c #2355A1",
+"d  c #2255A2",
+"f  c #2356A2",
+"g  c #2257A5",
+"h  c #2B5BA1",
+"j  c #2E5FA7",
+"k  c #265AAA",
+"l  c #265BAA",
+"z  c #4D6C93",
+"x  c #43689D",
+"c  c #446A9E",
+"v  c #5B7898",
+"b  c #4469A0",
+"n  c #416EAC",
+"m  c #4D73A9",
+"M  c #4F75AF",
+"N  c #577EAE",
+"B  c #577DB4",
+"V  c #5D81B3",
+"C  c #5B81B8",
+"Z  c #5981BB",
+"A  c #5883BA",
+"S  c #5A85B9",
+"D  c #5F84BC",
+"F  c #6683A3",
+"G  c #6283A8",
+"H  c #6383AC",
+"J  c #7D91AF",
+"K  c #6F8CB4",
+"L  c #6186BE",
+"P  c #7090B1",
+"I  c #7F9DB8",
+"U  c #7B9BBF",
+"Y  c #628AC3",
+"T  c #688DC3",
+"R  c #6E92C6",
+"E  c #6990C9",
+"W  c #6C98CC",
+"Q  c #7496C1",
+"!  c #7195CB",
+"~  c #7399CF",
+"^  c #779BCF",
+"/  c #789BCF",
+"(  c #7CAEE0",
+")  c #92A1B5",
+"_  c #85A3C0",
+"`  c #89A8C7",
+"'  c #84A5CA",
+"]  c #82A4CE",
+"[  c #8CACCB",
+"{  c #89AACF",
+"}  c #93B0C8",
+"|  c #94B3CB",
+" . c #91B0CF",
+".. c #95B3CD",
+"X. c #8AACD5",
+"o. c #81A5D8",
+"O. c #84A8DB",
+"+. c #8FB0D4",
+"@. c #8FB0DB",
+"#. c #91B4D4",
+"$. c #99B8D0",
+"%. c #99B8D2",
+"&. c #B1B9C6",
+"*. c #89ACE0",
+"=. c #8DB0E3",
+"-. c #8EB1E4",
+";. c #98BEEF",
+":. c #9ABEEF",
+">. c #A5C3D8",
+",. c #A8C6DA",
+"<. c #97C1F1",
+"1. c #ABC3E6",
+"2. c #AFC5E5",
+"3. c #D3D7DE",
+"4. c #C3E1F0",
+"5. c None",
+/* pixels */
+"5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.",
+"5.5.5.5.5.5.5.5.5.5.5.5.5.l l 5.",
+"5.2./ 1.5.5.5.5.5.5.5.5.s Z u 5.",
+"5.T 3.E 5.5.5.5.5.5.5.j #.4.q 5.",
+"5.D &.Y 5.5.5.5.5.g n %.>.>.0 5.",
+"5.B ) Z 5.5.5.5.s V }  ...$.9 5.",
+"5.m J M 5.5.5.h G I ) ' [ #.< 5.",
+"5.c K b 5.s p v F P U ' { #.> 5.",
+"5.a S i 5.y w 8 z H U / X.@.- 5.",
+"5.r W e 5.5.5., 4 x Z ! O.-.& 5.",
+"5.4 ( 3 5.5.5.5.= t L ^ =.:.+ 5.",
+"5.: ;.; 5.5.5.5.5.# 5 R o.*.O 5.",
+"5.= <.& 5.5.5.5.5.5.5.$ V ~ X 5.",
+"5.2 @ 1 5.5.5.5.5.5.5.5.o 8 . 5.",
+"5.5.5.5.5.5.5.5.5.5.5.5.5.  . 5.",
+"5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5."
+};
diff --git a/mgllab/xpm/go-first.xpm b/mgllab/xpm/go-first.xpm
new file mode 100644 (file)
index 0000000..7026dfd
--- /dev/null
@@ -0,0 +1,119 @@
+/* XPM */
+static const char *go_first_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 97 2 ",
+"   c #10263B",
+".  c #102A43",
+"X  c #122F49",
+"o  c #122D56",
+"O  c #183B6F",
+"+  c #204060",
+"@  c #22446F",
+"#  c #23477A",
+"$  c #2D4F7F",
+"%  c #2C5670",
+"&  c #2C517B",
+"*  c #3E5A77",
+"=  c #36547B",
+"-  c #28518F",
+";  c #335880",
+":  c #3D5A82",
+">  c #335788",
+",  c #3A5F8D",
+"<  c #395D8F",
+"1  c #356083",
+"2  c #386484",
+"3  c #3C6988",
+"4  c #3E6195",
+"5  c #3D6397",
+"6  c #3F6594",
+"7  c #3A64A0",
+"8  c #3964A2",
+"9  c #426087",
+"0  c #4D688A",
+"q  c #4C6A8C",
+"w  c #516A8A",
+"e  c #556E8C",
+"r  c #4D6B92",
+"t  c #597696",
+"y  c #657B97",
+"u  c #527DA7",
+"i  c #5378AE",
+"p  c #527BB2",
+"a  c #567CB2",
+"s  c #627FA0",
+"d  c #6282A9",
+"f  c #6686A9",
+"g  c #6D8BAB",
+"h  c #6E8CAB",
+"j  c #6C8BAD",
+"k  c #6387B3",
+"l  c #6386B9",
+"z  c #6289BB",
+"x  c #6D91BD",
+"c  c #6F91BD",
+"v  c #7896B3",
+"b  c #7696BA",
+"n  c #7494BC",
+"m  c #7F9EBC",
+"M  c #5C92C1",
+"N  c #678CC2",
+"B  c #6A8FC4",
+"V  c #6D91C3",
+"C  c #7A99C1",
+"Z  c #7297CC",
+"A  c #7D9FCE",
+"S  c #739DD0",
+"D  c #779CD0",
+"F  c #799DD1",
+"G  c #7B9FD3",
+"H  c #7FA0C5",
+"J  c #7EA2D6",
+"K  c #85A5C4",
+"L  c #8BA9C3",
+"P  c #81A2CA",
+"I  c #86A7CD",
+"U  c #86A8CD",
+"Y  c #88A8C8",
+"T  c #89A9C9",
+"R  c #8AAACA",
+"E  c #8EADC8",
+"W  c #8CACCD",
+"Q  c #91B0CB",
+"!  c #92B1CD",
+"~  c #94B2CC",
+"^  c #8AABD1",
+"/  c #8BABD3",
+"(  c #8AACD1",
+")  c #8CACD7",
+"_  c #85A9DC",
+"`  c #87AADD",
+"'  c #87AEDF",
+"]  c #88ACDE",
+"[  c #95ADD1",
+"{  c #9DBBD3",
+"}  c #9DBCD3",
+"|  c #90B0D8",
+" . c #91B4E6",
+".. c #94B8E9",
+"X. c #AECDE1",
+"o. c #BFDBEE",
+"O. c None",
+/* pixels */
+"O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.",
+"O.O.O.O.O.O.O.O.O.O.O.O.O.[ O.O.",
+"O.O.O.O.O.O.O.O.O.O.O.O.c o.- O.",
+"O.O.O.O.O.O.O.O.O.O.8 Y X.X.O O.",
+"O.O.O.O.O.O.O.O.O.p ~ { } } o O.",
+"O.O.O.O.O.O.O.O.k L E ! ! ! e y ",
+"O.c C O.O.O.8 f v m K T W W T 0 ",
+"< h g 6 O.5 t s j b H U ( ^ I w ",
+"@ l V & O.> = r d n P / | ) A : ",
+"O.2 3 O.O.O.# & 5 i N F ` ' G 9 ",
+"O.O.O.O.O.O.O.O.< a V J  ...q * ",
+"O.O.O.O.O.O.O.O.O.= z S ` '   O.",
+"O.O.O.O.O.O.O.O.O.O.+ u Z J . O.",
+"O.O.O.O.O.O.O.O.O.O.O.O.; M X O.",
+"O.O.O.O.O.O.O.O.O.O.O.O.O.% O.O.",
+"O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O."
+};
diff --git a/mgllab/xpm/go-jump-locationbar.xpm b/mgllab/xpm/go-jump-locationbar.xpm
new file mode 100644 (file)
index 0000000..2442811
--- /dev/null
@@ -0,0 +1,103 @@
+/* XPM */
+static const char *go_jump_locationbar_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 81 1 ",
+"  c #071E3F",
+". c #081F40",
+"X c #081E43",
+"o c #092249",
+"O c #092C61",
+"+ c #0F3668",
+"@ c #193964",
+"# c #15336F",
+"$ c #143D78",
+"% c #1F4573",
+"& c #1D4779",
+"* c #2A4871",
+"= c #194388",
+"- c #194995",
+"; c #335786",
+": c #36598C",
+"> c #21539F",
+", c #22549D",
+"< c #1F53A1",
+"1 c #2354A0",
+"2 c #2557A4",
+"3 c #2558A4",
+"4 c #2559A6",
+"5 c #3B5DA0",
+"6 c #3B5EA5",
+"7 c #3362A9",
+"8 c #3767AE",
+"9 c #3D6BAD",
+"0 c #2467B1",
+"q c #2776BA",
+"w c #2B74B8",
+"e c #406597",
+"r c #466A9F",
+"t c #4567A3",
+"y c #496DA4",
+"u c #4171B5",
+"i c #5179B5",
+"p c #5F80A6",
+"a c #5186B9",
+"s c #5787BF",
+"d c #6185BE",
+"f c #3086C5",
+"g c #3C89C5",
+"h c #3292CC",
+"j c #4692CA",
+"k c #638CC2",
+"l c #6C93C5",
+"z c #6699CA",
+"x c #789DCB",
+"c c #7F9FD1",
+"v c #59A3D8",
+"b c #59A7DD",
+"n c #78A1CE",
+"m c #79A4CF",
+"M c #7CAFDA",
+"N c #6AB1DE",
+"B c #66B1E0",
+"V c #6DB7E2",
+"C c #83A3CF",
+"Z c #80ADD4",
+"A c #97BDDC",
+"S c #99B9DB",
+"D c #9FBEDE",
+"F c #A1BCE1",
+"G c #90C9EE",
+"H c #A5C9E6",
+"J c #AECAE6",
+"K c #AECEE9",
+"L c #B4D2EA",
+"P c #AEDDF9",
+"I c #BDDBF1",
+"U c #BFDCF2",
+"Y c #B2DFF8",
+"T c #BEE6FC",
+"R c #C4E1F5",
+"E c #C7E3F5",
+"W c #C7E5F8",
+"Q c #D1EDFA",
+"! c #C9F0FF",
+"~ c #D4F1FF",
+"^ c None",
+/* pixels */
+"^^^^^^^^^^^^^^^^",
+"^^^24^^^^^^^^^^^",
+"^^^-l1^^^^^^^^^^",
+"^^^t~J7^^^^^^^^^",
+"^^^yQLUi<^^^^^^^",
+"^^^rRKDSd>^^^^^^",
+"^^^eWHmnxC9^^^^^",
+"^^^:IAZzskF64^^^",
+"^^^;Mjgq0uc5,^^^",
+"^^^&vNhfw8=^^^^^",
+"^^^%GYYBa$^^^^^^",
+"^^^+VT!pO^^^^^^^",
+"^^^@bR*^^^^^^^^^",
+"^^^X#o^^^^^^^^^^",
+"^^^..^^^^^^^^^^^",
+"^^^^^^^^^^^^^^^^"
+};
diff --git a/mgllab/xpm/go-last-view.xpm b/mgllab/xpm/go-last-view.xpm
new file mode 100644 (file)
index 0000000..b2db855
--- /dev/null
@@ -0,0 +1,139 @@
+/* XPM */
+static const char *go_last_view_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 117 2 ",
+"   c #061D3F",
+".  c #081D3F",
+"X  c #071F42",
+"o  c #061E45",
+"O  c #082042",
+"+  c #06234C",
+"@  c #092956",
+"#  c #0B2957",
+"$  c #0F2D58",
+"%  c #0D2E5F",
+"&  c #153057",
+"*  c #0F3361",
+"=  c #0F3368",
+"-  c #173664",
+";  c #143566",
+":  c #1B3B6B",
+">  c #193D6E",
+",  c #113771",
+"<  c #123C7A",
+"1  c #1B4078",
+"2  c #1B427C",
+"3  c #264673",
+"4  c #254577",
+"5  c #2B4972",
+"6  c #2C4C76",
+"7  c #254778",
+"8  c #234E7F",
+"9  c #2F4F7D",
+"0  c #154083",
+"q  c #1D4784",
+"w  c #16458A",
+"e  c #1A4A93",
+"r  c #1E529D",
+"t  c #2E5385",
+"y  c #2F598D",
+"u  c #3D5A81",
+"i  c #345688",
+"p  c #34578B",
+"a  c #36598C",
+"s  c #23529B",
+"d  c #385D90",
+"f  c #3A6398",
+"g  c #2054A2",
+"h  c #2256A3",
+"j  c #2556A3",
+"k  c #2457A3",
+"l  c #265CAD",
+"z  c #265DAF",
+"x  c #3060A4",
+"c  c #3363AA",
+"v  c #43679C",
+"b  c #45699F",
+"n  c #52739D",
+"m  c #456CA5",
+"M  c #4C71A7",
+"N  c #4D72A8",
+"B  c #4A75AF",
+"V  c #5177AF",
+"C  c #4F78B2",
+"Z  c #577CB3",
+"A  c #5C81B8",
+"S  c #5A85BA",
+"D  c #5E84BA",
+"F  c #5A83BF",
+"G  c #6489B7",
+"H  c #698AB1",
+"J  c #6085BA",
+"K  c #6188BF",
+"L  c #6A8BBB",
+"P  c #728EB6",
+"I  c #6F91B4",
+"U  c #7F92B1",
+"Y  c #668BC1",
+"T  c #638DC7",
+"R  c #698CC0",
+"E  c #6B8FC3",
+"W  c #6892C3",
+"Q  c #6E92C6",
+"!  c #6A92CB",
+"~  c #6E93C8",
+"^  c #6B99CE",
+"/  c #7B9CC1",
+"(  c #7094C9",
+")  c #7296C9",
+"_  c #7398CE",
+"`  c #779BD0",
+"'  c #799DD2",
+"]  c #7BB0E1",
+"[  c #92A0B5",
+"{  c #84A3C1",
+"}  c #87A6C5",
+"|  c #81A2C8",
+" . c #84A6CC",
+".. c #89A9CA",
+"X. c #8BACCC",
+"o. c #98B6CF",
+"O. c #8BACD1",
+"+. c #83A8DC",
+"@. c #84A8DD",
+"#. c #93B3D1",
+"$. c #97B6D2",
+"%. c #98B6D1",
+"&. c #9EBDD7",
+"*. c #9CBEDB",
+"=. c #AFB7C4",
+"-. c #92B5E9",
+";. c #97BFF0",
+":. c #A3C2DA",
+">. c #A8C7DE",
+",. c #97C1F1",
+"<. c #ADC3E5",
+"1. c #AECDE1",
+"2. c #B3CAEA",
+"3. c #A0C4F8",
+"4. c #D1D4DA",
+"5. c #C6E5F3",
+"6. c None",
+/* pixels */
+"6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.",
+"6.z z 6.6.6.6.6.6.6.6.6.6.6.6.6.",
+"6.r W h 6.6.6.6.6.6.6.6.2._ <.6.",
+"6.e 5.*.c 6.6.6.6.6.6.6.! 4.E 6.",
+"6.w 1.>.:.B h 6.6.6.6.6.T =.J 6.",
+"6.0 &.$.%.o.G j 6.6.6.6.F [ Z 6.",
+"6.< #.X...} { I x 6.6.6.C U M 6.",
+"6., O. .| / H n 9 q j 6.m P v 6.",
+"6.; ( E D V m a 4 2 s 6.f S d 6.",
+"6.% ` Q Y A M i 1 6.6.6.y ^ t 6.",
+"6.# @.' ( K i ; 6.6.6.6.8 ] 7 6.",
+"6.+ -.+.Q 3 $ 6.6.6.6.6.> ,.: 6.",
+"6.o 3.L & 6.6.6.6.6.6.6.* ,.- 6.",
+"6.  u X 6.6.6.6.6.6.6.6.6 # 5 6.",
+"6.O . 6.6.6.6.6.6.6.6.6.6.6.6.6.",
+"6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6."
+};
diff --git a/mgllab/xpm/go-last.xpm b/mgllab/xpm/go-last.xpm
new file mode 100644 (file)
index 0000000..1bfde69
--- /dev/null
@@ -0,0 +1,116 @@
+/* XPM */
+static const char *go_last_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 94 2 ",
+"   c #162E44",
+".  c #1D3B5A",
+"X  c #17386A",
+"o  c #1B3A69",
+"O  c #284D6C",
+"+  c #214271",
+"@  c #264B75",
+"#  c #2A4B76",
+"$  c #274778",
+"%  c #31507D",
+"&  c #31557D",
+"*  c #3F5C7C",
+"=  c #345689",
+"-  c #34578A",
+";  c #375A8B",
+":  c #3F5F8B",
+">  c #386484",
+",  c #3C618F",
+"<  c #3C6989",
+"1  c #3E698B",
+"2  c #3B6292",
+"3  c #3E6191",
+"4  c #3C6BAF",
+"5  c #476688",
+"6  c #42638E",
+"7  c #4A6993",
+"8  c #4B6B96",
+"9  c #42659A",
+"0  c #45699E",
+"q  c #51719A",
+"w  c #50719C",
+"e  c #4E73A9",
+"r  c #4E76AD",
+"t  c #5E7EA8",
+"y  c #5D7FAB",
+"u  c #5479B0",
+"i  c #587EB4",
+"p  c #5681AA",
+"a  c #5B80B6",
+"s  c #5F85BB",
+"d  c #6080A6",
+"f  c #6D8BAB",
+"g  c #6E8BAB",
+"h  c #6C89B1",
+"j  c #6F8EB1",
+"k  c #6C8DB6",
+"l  c #6286B9",
+"z  c #618ABB",
+"x  c #6589BE",
+"c  c #678BBF",
+"v  c #6E91BD",
+"b  c #7494B8",
+"n  c #7395BE",
+"m  c #7999BE",
+"M  c #7E9DBD",
+"N  c #658AC0",
+"B  c #688DC3",
+"V  c #6A8EC2",
+"C  c #6B8FC2",
+"Z  c #6E91C4",
+"A  c #6C91C6",
+"S  c #6893CB",
+"D  c #6E92C8",
+"F  c #6F94C9",
+"G  c #7799C3",
+"H  c #7B9BC0",
+"J  c #7B9AC2",
+"K  c #7C9DC2",
+"L  c #7D9EC3",
+"P  c #799CC5",
+"I  c #799CC6",
+"U  c #7D9FC7",
+"Y  c #7094C9",
+"T  c #7599CE",
+"R  c #6995D7",
+"E  c #789CD0",
+"W  c #7BA0D3",
+"Q  c #81A0C0",
+"!  c #83A2C3",
+"~  c #84A3C4",
+"^  c #84A4C4",
+"/  c #86A5C4",
+"(  c #8CABC7",
+")  c #8CABC8",
+"_  c #90ADC9",
+"`  c #98B6CF",
+"'  c #80A4D8",
+"]  c #85AADC",
+"[  c #85ACDD",
+"{  c #9EBBD2",
+"}  c #81B6E1",
+"|  c #8DB6E6",
+" . c #AFC9DE",
+".. c None",
+/* pixels */
+"................................",
+"....R ..........................",
+".... .S ........................",
+"....{ ` ! 4 ....................",
+"...._ ( ( / r ..................",
+"h q ~ ^ Q Q Q p ................",
+"w H L L L m b j d - ......Z G ..",
+"7 G I I G n k t 8 % o ..2 f f 6 ",
+", N Z B x a e 9 - $ o ..@ l Z # ",
+"6 Z Z D B s u 0 ; + ......> < ..",
+"* 5 W E Y N i , ................",
+"..  [ ' T z & ..................",
+"....| ] p . ....................",
+"....} 6 ........................",
+"....O ..........................",
+"................................"
+};
diff --git a/mgllab/xpm/go-next-view-page.xpm b/mgllab/xpm/go-next-view-page.xpm
new file mode 100644 (file)
index 0000000..eb46032
--- /dev/null
@@ -0,0 +1,99 @@
+/* XPM */
+static const char *go_next_view_page_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 77 1 ",
+"  c #18481D",
+". c #1D5617",
+"X c #1B5719",
+"o c #21621E",
+"O c #3E7E18",
+"+ c #184928",
+"@ c #277028",
+"# c #32712D",
+"$ c #328234",
+"% c #3D8E3C",
+"& c #75AC0C",
+"* c #639F38",
+"= c #549D4C",
+"- c #559E4F",
+"; c #55875D",
+": c #5B9D56",
+"> c #64A753",
+", c #77B250",
+"< c #74A477",
+"1 c #7CB378",
+"2 c #85BE20",
+"3 c #99D20B",
+"4 c #A0D70C",
+"5 c #8EC423",
+"6 c #91C824",
+"7 c #A8D06A",
+"8 c #AAD072",
+"9 c #8C8E8F",
+"0 c #8F9091",
+"q c #8F9492",
+"w c #909091",
+"e c #939394",
+"r c #9B9D9E",
+"t c #8BA992",
+"y c #9E9FA0",
+"u c #9F9FA0",
+"i c #9FADA3",
+"p c #A2A3A3",
+"a c #A6A7A8",
+"s c #A7A7A8",
+"d c gray66",
+"f c #B9B9B9",
+"g c gray73",
+"h c #BFDE9A",
+"j c #C5C5C5",
+"k c #C5C6C6",
+"l c #C8CACB",
+"z c #D2D2D2",
+"x c #D2DAD4",
+"c c gray85",
+"v c gray86",
+"b c #D2E2D2",
+"n c #D8E9D6",
+"m c #DFEDDE",
+"M c gray89",
+"N c #EAEAEA",
+"B c #E9EFE9",
+"V c #EEEEEE",
+"C c #EEEFEF",
+"Z c #EFEFEF",
+"A c gray94",
+"S c #F2F7F1",
+"D c #F4F5F5",
+"F c gray96",
+"G c #F5F6F6",
+"H c #F6F6F6",
+"J c gray97",
+"K c #F8F8F8",
+"L c #F8F9F9",
+"P c #F9F9F9",
+"I c gray98",
+"U c #FBFBFB",
+"Y c gray99",
+"T c #FDFDFD",
+"R c #FEFEFE",
+"E c white",
+"W c None",
+/* pixels */
+"WWWWWWWWWWWWWWWW",
+"WEEEEEEEEnmWWWWW",
+"WEDDPPPPP==#WWWW",
+"WEPPPPYPE%h>1SEW",
+"WEPPEPPEE$87,:bW",
+"WEPPPEEEE@265*<W",
+"WEPEEEEEPo34O;BW",
+"WEEPPEPDZ.&XtPEW",
+"WEYYEENau +pEEEW",
+"WEYYEDsEExwvCZDW",
+"WEYEYAuEDrjsralW",
+"WEYYYZsJizsYEPwW",
+"WEEPEDkpcArEK9WW",
+"WWWWWggMEZsPwWWW",
+"WWWWWEPEEDkeWWWW",
+"WWWWWWWWWWWWWWWW"
+};
diff --git a/mgllab/xpm/go-next-view.xpm b/mgllab/xpm/go-next-view.xpm
new file mode 100644 (file)
index 0000000..fabc6cc
--- /dev/null
@@ -0,0 +1,102 @@
+/* XPM */
+static const char *go_next_view_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 80 1 ",
+"  c #071D3B",
+". c #091D3F",
+"X c #081F41",
+"o c #0B2447",
+"O c #0B2449",
+"+ c #0D2850",
+"@ c #0F2D58",
+"# c #122F5C",
+"$ c #19355E",
+"% c #123160",
+"& c #143668",
+"* c #17366A",
+"= c #163A70",
+"- c #183F78",
+"; c #1B4179",
+": c #2A4A78",
+"> c #3C577D",
+", c #1B4380",
+"< c #1D4580",
+"1 c #1D4887",
+"2 c #1F4989",
+"3 c #1F4C8F",
+"4 c #1F4D8F",
+"5 c #2C4E80",
+"6 c #325382",
+"7 c #385B8F",
+"8 c #215197",
+"9 c #23569E",
+"0 c #24559E",
+"q c #395C92",
+"w c #3C5F93",
+"e c #305C9E",
+"r c #2556A3",
+"t c #2457A5",
+"y c #2759A0",
+"u c #2758A2",
+"i c #3663A3",
+"p c #4F709C",
+"a c #496EA3",
+"s c #4D75AA",
+"d c #5076AC",
+"f c #547AB1",
+"g c #5C84B4",
+"h c #5D82B9",
+"j c #5D83B9",
+"k c #6387B2",
+"l c #6687B0",
+"z c #6C8CB1",
+"x c #6388BD",
+"c c #6589BD",
+"v c #6489BF",
+"b c #6B8BBB",
+"n c #7898BF",
+"m c #668BC1",
+"M c #6B8FC5",
+"N c #6B90C5",
+"B c #6F92C6",
+"V c #7E9FC5",
+"C c #7094C9",
+"Z c #779BCF",
+"A c #779CD0",
+"S c #7FA1C6",
+"D c #809FBF",
+"F c #80A2C7",
+"G c #85A4C4",
+"H c #88A8C7",
+"J c #88A7C8",
+"K c #89A8C9",
+"L c #92B1CD",
+"P c #94B3CE",
+"I c #94B3CF",
+"U c #81A5D9",
+"Y c #84A8DB",
+"T c #95B6D1",
+"R c #9CBBD4",
+"E c #91B4E6",
+"W c #A3C2D9",
+"Q c #A4C2DA",
+"! c #B6D6E9",
+"~ c None",
+/* pixels */
+"~~~~~~~~~~~~~~~~",
+"~~~0t~~~~~~~~~~~",
+"~~~8gu~~~~~~~~~~",
+"~~~3!Ti~~~~~~~~~",
+"~~~1WQRsr~~~~~~~",
+"~~~,IIILku~~~~~~",
+"~~~-HKJGDze~~~~~",
+"~~~=SFVnlp629~~~",
+"~~~&vxjfaw5<3~~~",
+"~~~#BNmjdq;~~~~~",
+"~~~#ZZCv7*~~~~~~",
+"~~~@YAB:#~~~~~~~",
+"~~~OEb$~~~~~~~~~",
+"~~~o>o~~~~~~~~~~",
+"~~~. ~~~~~~~~~~~",
+"~~~~~~~~~~~~~~~~"
+};
diff --git a/mgllab/xpm/go-next.xpm b/mgllab/xpm/go-next.xpm
new file mode 100644 (file)
index 0000000..30509c8
--- /dev/null
@@ -0,0 +1,128 @@
+/* XPM */
+static const char *go_next_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 106 2 ",
+"   c #08172B",
+".  c #091B37",
+"X  c #0A1D38",
+"o  c #0D203D",
+"O  c #102130",
+"+  c #11273B",
+"@  c #0B2244",
+"#  c #0B2346",
+"$  c #0F2648",
+"%  c #112747",
+"&  c #122E45",
+"*  c #18304C",
+"=  c #122D54",
+"-  c #122E59",
+";  c #173255",
+":  c #143057",
+">  c #1E3F57",
+",  c #14315C",
+"<  c #133261",
+"1  c #173768",
+"2  c #15386B",
+"3  c #16396E",
+"4  c #183B6F",
+"5  c #29415E",
+"6  c #1F4379",
+"7  c #1F447D",
+"8  c #244760",
+"9  c #23426A",
+"0  c #2B4C7D",
+"q  c #274F8B",
+"w  c #365A89",
+"e  c #35588A",
+"r  c #3A5E8F",
+"t  c #214F93",
+"y  c #2C5592",
+"u  c #235299",
+"i  c #23549D",
+"p  c #315D9E",
+"a  c #3E6393",
+"s  c #2B5CA5",
+"d  c #3865A6",
+"f  c #4E688E",
+"g  c #4D759B",
+"h  c #57749A",
+"j  c #51719C",
+"k  c #436BA5",
+"l  c #496EA2",
+"z  c #4C6FA0",
+"x  c #4B76B0",
+"c  c #547AB0",
+"v  c #557CB0",
+"b  c #5C80B1",
+"n  c #5C85B9",
+"m  c #5F85BB",
+"M  c #6B89AD",
+"N  c #6E8CAD",
+"B  c #6385B1",
+"V  c #6E8FB4",
+"C  c #608BB9",
+"Z  c #658AB8",
+"A  c #688CBD",
+"S  c #6F92BF",
+"D  c #7191B6",
+"F  c #7494B8",
+"G  c #7798BE",
+"H  c #7D9CBC",
+"J  c #658BC0",
+"K  c #648DC1",
+"L  c #688DC3",
+"P  c #6D92C7",
+"I  c #6E96C8",
+"U  c #7094C3",
+"Y  c #7598C6",
+"T  c #7599C7",
+"R  c #7C9DC2",
+"E  c #7D9EC4",
+"W  c #7095CA",
+"Q  c #7299CB",
+"!  c #779AC8",
+"~  c #769CD0",
+"^  c #789DD0",
+"/  c #8AA4BE",
+"(  c #82A2C2",
+")  c #87A4C1",
+"_  c #86A6C7",
+"`  c #8AA8C7",
+"'  c #80A2C8",
+"]  c #81A2C9",
+"[  c #83A5CB",
+"{  c #87A7C8",
+"}  c #89A9CA",
+"|  c #8BAACA",
+" . c #8BABCB",
+".. c #8AAACC",
+"X. c #90AECA",
+"o. c #91B0CD",
+"O. c #93B2CF",
+"+. c #80A6D8",
+"@. c #96B4D0",
+"#. c #97B5D1",
+"$. c #A0BFD7",
+"%. c #81B3E1",
+"&. c #A6C4DA",
+"*. c #B9D5E7",
+"=. c #C1CFE4",
+"-. c None",
+/* pixels */
+"-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.",
+"-.-.-.-.-.-.=.-.-.-.-.-.-.-.-.-.",
+"-.-.-.-.-.-.y k u -.-.-.-.-.-.-.",
+"-.-.-.-.-.-.4 *.{ p -.-.-.-.-.-.",
+"-.-.-.-.-.-.= &.&.@.x -.-.-.-.-.",
+"-.f 3 2 - $ o @.o.o.X.Z s -.-.-.",
+"-.< / ) ` | | ..{ { ( H V d -.-.",
+"-., N F R ' [ [ ' E G D M h q i ",
+"-.= j B P Y ! ! P A v z w 0 4 u ",
+"-.; a v A I Q P L C c l r 0 -.-.",
+"-.5 # # X   O ^ W J n w 2 -.-.-.",
+"-.-.-.-.-.-.+ +.~ C 9 -.-.-.-.-.",
+"-.-.-.-.-.-.& %.g % -.-.-.-.-.-.",
+"-.-.-.-.-.-.> * X -.-.-.-.-.-.-.",
+"-.-.-.-.-.-.8 -.-.-.-.-.-.-.-.-.",
+"-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-."
+};
diff --git a/mgllab/xpm/go-previous-view-page.xpm b/mgllab/xpm/go-previous-view-page.xpm
new file mode 100644 (file)
index 0000000..f62b3b0
--- /dev/null
@@ -0,0 +1,97 @@
+/* XPM */
+static const char *go_previous_view_page_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 75 1 ",
+"  c #0B4716",
+". c #16471D",
+"X c #185C1C",
+"o c #20591A",
+"O c #285632",
+"+ c #236E25",
+"@ c #407E17",
+"# c #348335",
+"$ c #3F8F3C",
+"% c #55952A",
+"& c #549D4C",
+"* c #549851",
+"= c #5DA258",
+"- c #73AF4E",
+"; c #61A551",
+": c #5A8A61",
+"> c #75917C",
+", c #74A970",
+"< c #84B70D",
+"1 c #84BD23",
+"2 c #9DD40D",
+"3 c #A1D90C",
+"4 c #89C220",
+"5 c #90C724",
+"6 c #A7D06A",
+"7 c #ABD171",
+"8 c #8C8E8F",
+"9 c #8F9091",
+"0 c #909091",
+"q c #939394",
+"w c #87AF89",
+"e c #9F9FA0",
+"r c #A6A7A8",
+"t c #A7A7A8",
+"y c gray66",
+"u c #AFAFAF",
+"i c gray69",
+"p c #BFDE99",
+"a c #A6C6A4",
+"s c #C0C0C0",
+"d c #C1C1C1",
+"f c #C5C6C6",
+"g c #C8CACB",
+"h c #CAD6CD",
+"j c #D3DCD6",
+"k c #CCE2CA",
+"l c #D6E4D7",
+"z c gray90",
+"x c #E2EEE1",
+"c c #EAEAEA",
+"v c #EAEFEA",
+"b c #EEEEEE",
+"n c #EEEFEF",
+"m c #EFEFEF",
+"M c #EDF2ED",
+"N c #EEF2EF",
+"B c gray94",
+"V c #F4F5F5",
+"C c gray96",
+"Z c #F5F6F5",
+"A c #F5F6F6",
+"S c #F6F6F6",
+"D c #F6F7F6",
+"F c gray97",
+"G c #F8F8F8",
+"H c #F8F9F8",
+"J c #F9F9F9",
+"K c gray98",
+"L c #FBFBFB",
+"P c gray99",
+"I c #FDFDFD",
+"U c #FDFEFD",
+"Y c #FEFEFE",
+"T c white",
+"R c None",
+/* pixels */
+"RRRRRRRRRRRRRRRR",
+"RTTTTTxkTTTRRRRR",
+"RTVVza&=sigRRRRR",
+"RTGM,;p$TTTTTTTR",
+"RTl*-67#VGGTGGTR",
+"RTw%154+VTGGTGTR",
+"RTv:@23XFPTGTGGR",
+"RTGT>o< VTTGTTTR",
+"RTTTuhO.FTTTPTTR",
+"RTGGiTNjLTPVmbVR",
+"RTTTiTTGTPcyergR",
+"RTGTiTGTTVyTTG0R",
+"RTTGiTTTTBqTV8RR",
+"RRRRRTGTTBuG0RRR",
+"RRRRRTGTTVfqRRRR",
+"RRRRRRRRRRRRRRRR"
+};
diff --git a/mgllab/xpm/go-previous-view.xpm b/mgllab/xpm/go-previous-view.xpm
new file mode 100644 (file)
index 0000000..1831419
--- /dev/null
@@ -0,0 +1,102 @@
+/* XPM */
+static const char *go_previous_view_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 80 1 ",
+"  c #071A3A",
+". c #091C3C",
+"X c #081E3F",
+"o c #0B2344",
+"O c #0B2347",
+"+ c #0D2850",
+"@ c #0F2D58",
+"# c #122E59",
+"$ c #153057",
+"% c #123160",
+"& c #163667",
+"* c #143668",
+"= c #163A70",
+"- c #163C73",
+"; c #1E3F71",
+": c #183F78",
+"> c #26426A",
+", c #23426F",
+"< c #25436C",
+"1 c #2A4B7D",
+"2 c #34537C",
+"3 c #1B4380",
+"4 c #1D4887",
+"5 c #1F4C8F",
+"6 c #244B82",
+"7 c #385B8E",
+"8 c #214E92",
+"9 c #215197",
+"0 c #24559E",
+"q c #26589F",
+"w c #2E5A9B",
+"e c #335B93",
+"r c #2357A0",
+"t c #2556A3",
+"y c #2457A5",
+"u c #2758A2",
+"i c #3461A2",
+"p c #4C6C97",
+"a c #577495",
+"s c #5B7797",
+"d c #476FA3",
+"f c #5A7DA5",
+"g c #5075AB",
+"h c #5577A8",
+"j c #557AB1",
+"k c #5A83B3",
+"l c #6180A2",
+"z c #6684A6",
+"x c #6284AE",
+"c c #7491AE",
+"v c #6286BB",
+"b c #7190B3",
+"n c #7B99B7",
+"m c #7A9BBF",
+"M c #658BC0",
+"N c #6C91C6",
+"B c #7497C3",
+"V c #769ACF",
+"C c #7D9FCB",
+"Z c #789CD1",
+"A c #7EA2D6",
+"S c #82A0BF",
+"D c #81A2C7",
+"F c #85A5C4",
+"G c #87A6C6",
+"H c #89A7C0",
+"J c #8DAAC4",
+"K c #8FADC7",
+"L c #84A5CB",
+"P c #80A2CF",
+"I c #8FAEC8",
+"U c #93B3CD",
+"Y c #97B5CD",
+"T c #83A7DA",
+"R c #9FBDD2",
+"E c #9FBDD3",
+"W c #8CAFE2",
+"Q c #99BBEC",
+"! c #B6D5E8",
+"~ c None",
+/* pixels */
+"~~~~~~~~~~~~~~~~",
+"~~~~~~~~~~~y0~~~",
+"~~~~~~~~~~uk9~~~",
+"~~~~~~~~~iU!5~~~",
+"~~~~~~~tdYEE4~~~",
+"~~~~~~qfHJII3~~~",
+"~~~~~wlcnSFF:~~~",
+"~~~reaszbmDL=~~~",
+"~~~86,2pxBCP*~~~",
+"~~~~~-;7gMZT%~~~",
+"~~~~~~&1jNTQ#~~~",
+"~~~~~~~#,vAW+~~~",
+"~~~~~~~~~$hVO~~~",
+"~~~~~~~~~~O>X~~~",
+"~~~~~~~~~~~ .~~~",
+"~~~~~~~~~~~~~~~~"
+};
diff --git a/mgllab/xpm/go-previous.xpm b/mgllab/xpm/go-previous.xpm
new file mode 100644 (file)
index 0000000..b016b25
--- /dev/null
@@ -0,0 +1,123 @@
+/* XPM */
+static const char *go_previous_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 101 2 ",
+"   c #061020",
+".  c #071428",
+"X  c #071529",
+"o  c #07172E",
+"O  c #071832",
+"+  c #071A34",
+"@  c #071B37",
+"#  c #081A35",
+"$  c #091C38",
+"%  c #0C1E3A",
+"&  c #081F40",
+"*  c #0B2040",
+"=  c #0A2041",
+"-  c #0A2245",
+";  c #0E2444",
+":  c #0A2348",
+">  c #0D2850",
+",  c #0F2D58",
+"<  c #122B52",
+"1  c #112C54",
+"2  c #142E56",
+"3  c #123160",
+"4  c #153565",
+"5  c #153667",
+"6  c #143669",
+"7  c #16396E",
+"8  c #183A6C",
+"9  c #1A3F77",
+"0  c #314A6E",
+"q  c #204070",
+"w  c #274A7E",
+"e  c #1F4A8A",
+"r  c #28518D",
+"t  c #37598C",
+"y  c #204D90",
+"u  c #214F93",
+"i  c #225298",
+"p  c #235299",
+"a  c #23549D",
+"s  c #2C5A9C",
+"d  c #3A5D91",
+"f  c #2557A3",
+"g  c #2658A1",
+"h  c #2959A1",
+"j  c #3C6AAA",
+"k  c #476795",
+"l  c #44689D",
+"z  c #55759D",
+"x  c #476FA1",
+"c  c #4C71A6",
+"v  c #4E72A7",
+"b  c #5A7AA2",
+"n  c #5379AF",
+"m  c #5479AF",
+"M  c #567EB1",
+"N  c #5F85BB",
+"B  c #6688AF",
+"V  c #6C8BAF",
+"C  c #6489BF",
+"Z  c #678CBD",
+"A  c #6F94BC",
+"S  c #7A9ABD",
+"D  c #688DC2",
+"F  c #6C91C7",
+"G  c #6D92C7",
+"H  c #6F94C9",
+"J  c #7499CD",
+"K  c #7A9DCA",
+"L  c #7A9BCC",
+"P  c #779BD0",
+"I  c #809FBD",
+"U  c #82A2C4",
+"Y  c #82A3C7",
+"T  c #86A6C5",
+"R  c #8BA9C4",
+"E  c #8BABCB",
+"W  c #8FAFCB",
+"Q  c #88A9CE",
+"!  c #8CADCE",
+"~  c #8EAECF",
+"^  c #91B0CC",
+"/  c #85A7D0",
+"(  c #80A3D7",
+")  c #8BADD1",
+"_  c #8AACD2",
+"`  c #8FB0D0",
+"'  c #95B4D0",
+"]  c #96B5D2",
+"[  c #96B7D3",
+"{  c #92B3D4",
+"}  c #94B5D5",
+"|  c #98B7D4",
+" . c #99B8D5",
+".. c #9AB9D6",
+"X. c #9ABAD7",
+"o. c #A2C1DA",
+"O. c #A3C2DB",
+"+. c #A3C3DC",
+"@. c #ADCDE3",
+"#. c #AECDE3",
+"$. c None",
+/* pixels */
+"$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.",
+"$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.",
+"$.$.$.$.$.$.$.i y e $.$.$.$.$.$.",
+"$.$.$.$.$.$.i x ' 8 $.$.$.$.$.$.",
+"$.$.$.$.$.h A @.#.< $.$.$.$.$.$.",
+"$.$.$.f j ! O.O.+.% ; 1 6 7 6 $.",
+"$.$.g M W ' | ..X.X...' ^ R 3 $.",
+"a s B I T E ` { } } { ` U b , $.",
+"u r z V S Y Q _ _ / K Z c t > $.",
+"$.$.9 w l m N D G H F C m d : $.",
+"$.$.$.4 q c D G P   X # = - & $.",
+"$.$.$.$.$.2 k J ( X $.$.$.$.$.$.",
+"$.$.$.$.$.$.= 0 L o $.$.$.$.$.$.",
+"$.$.$.$.$.$.$.$ + O $.$.$.$.$.$.",
+"$.$.$.$.$.$.$.$.$.+ $.$.$.$.$.$.",
+"$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$."
+};
diff --git a/mgllab/xpm/go-top.xpm b/mgllab/xpm/go-top.xpm
new file mode 100644 (file)
index 0000000..5dae152
--- /dev/null
@@ -0,0 +1,116 @@
+/* XPM */
+static const char *go_top_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 94 2 ",
+"   c #10243E",
+".  c #102542",
+"X  c #122A47",
+"o  c #152944",
+"O  c #1A365B",
+"+  c #1C365B",
+"@  c #2B4567",
+"#  c #2C536E",
+"$  c #234570",
+"%  c #234777",
+"&  c #274873",
+"*  c #385377",
+"=  c #395E7C",
+"-  c #2F5386",
+";  c #315583",
+":  c #345581",
+">  c #3A5E8F",
+",  c #3B5F8F",
+"<  c #2D5795",
+"1  c #3A6B89",
+"2  c #3B6E8B",
+"3  c #3D6193",
+"4  c #466285",
+"5  c #446286",
+"6  c #456387",
+"7  c #4A6B8F",
+"8  c #446797",
+"9  c #4B6C91",
+"0  c #496A96",
+"q  c #467493",
+"w  c #537396",
+"e  c #537397",
+"r  c #50709B",
+"t  c #55739C",
+"y  c #57769E",
+"u  c #5C7898",
+"i  c #436DA7",
+"p  c #5177AB",
+"a  c #567BAD",
+"s  c #4D77B1",
+"d  c #4C8CB1",
+"f  c #6582A3",
+"g  c #6686A9",
+"h  c #6786AB",
+"j  c #6485AF",
+"k  c #6685AF",
+"l  c #6887AC",
+"z  c #6C8AAB",
+"x  c #6E8CAB",
+"c  c #6085B1",
+"v  c #6187BD",
+"b  c #648ABC",
+"n  c #668CBF",
+"m  c #7291B2",
+"M  c #7392B3",
+"N  c #7091B7",
+"B  c #7191B7",
+"V  c #7896B3",
+"C  c #7996B3",
+"Z  c #7C99B7",
+"A  c #7C9AB7",
+"S  c #7093BE",
+"D  c #7293BE",
+"F  c #7495BF",
+"G  c #7897B9",
+"H  c #7798BE",
+"J  c #7E9CB9",
+"K  c #7A9ABC",
+"L  c #7899BF",
+"P  c #6B90C2",
+"I  c #6F94C9",
+"U  c #7897C0",
+"Y  c #7599C4",
+"T  c #7B9DC4",
+"R  c #7C9DC4",
+"E  c #7497CB",
+"W  c #7A9CC8",
+"Q  c #7E9FC9",
+"!  c #7B9FD2",
+"~  c #7B9FD3",
+"^  c #7FA2CC",
+"/  c #7DA0D3",
+"(  c #7CA0D4",
+")  c #84A1BB",
+"_  c #84A2BB",
+"`  c #84A1BC",
+"'  c #85A2BC",
+"]  c #85A4C3",
+"[  c #82A4CD",
+"{  c #94B2C9",
+"}  c #8BAEE1",
+"|  c #A4C2D8",
+" . c #A4C3D8",
+".. c None",
+/* pixels */
+"..............D U ..............",
+"............> x z > ............",
+"............$ b P & ............",
+"..............1 2 ..............",
+"................................",
+"..............H Y ..............",
+"............0  . .s ............",
+"............` { { ] ............",
+"..........u ` ` ` _ c ..........",
+"........* C J J J Z V i ........",
+"......+ f M G K K G m h < ......",
+"......6 h m K R R K N h r ......",
+"....@ p c F W [ [ W F c t - ....",
+"..# * 0 a b E ! ! E b p 3 ; d ..",
+"....X .   5 ! } } ! 6 o O % ....",
+"..........= 9 e e 9 q .........."
+};
diff --git a/mgllab/xpm/go-up.xpm b/mgllab/xpm/go-up.xpm
new file mode 100644 (file)
index 0000000..523aa9d
--- /dev/null
@@ -0,0 +1,123 @@
+/* XPM */
+static const char *go_up_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 101 2 ",
+"   c #040A14",
+".  c #070C14",
+"X  c #081220",
+"o  c #0A182F",
+"O  c #0C1B32",
+"+  c #081D3B",
+"@  c #081E3E",
+"#  c #081F40",
+"$  c #092041",
+"%  c #0B2142",
+"&  c #0B2244",
+"*  c #0A2245",
+"=  c #0E2547",
+"-  c #0B2448",
+";  c #0C2549",
+":  c #0E274C",
+">  c #0E284D",
+",  c #0F284D",
+"<  c #102749",
+"1  c #10284A",
+"2  c #122D56",
+"3  c #153159",
+"4  c #15305A",
+"5  c #16325A",
+"6  c #12305D",
+"7  c #13325E",
+"8  c #153665",
+"9  c #153667",
+"0  c #143668",
+"q  c #1B3F74",
+"w  c #1B4179",
+"e  c #2A4A77",
+"r  c #2D4C76",
+"t  c #2A4B7B",
+"y  c #1E4887",
+"u  c #385782",
+"i  c #38598B",
+"p  c #215095",
+"a  c #2E5893",
+"s  c #24559F",
+"d  c #26579E",
+"f  c #2657A1",
+"g  c #2558A3",
+"h  c #3260A2",
+"j  c #3663A3",
+"k  c #4B688C",
+"l  c #406498",
+"z  c #4A6E9A",
+"x  c #56769C",
+"c  c #4F74AA",
+"v  c #5073A3",
+"b  c #5375A4",
+"n  c #597FAE",
+"m  c #597DB0",
+"M  c #5A7FB6",
+"N  c #5F84BB",
+"B  c #6687AC",
+"V  c #6E8CAB",
+"C  c #6E8EB2",
+"Z  c #688AB6",
+"A  c #6084B8",
+"S  c #6287BC",
+"D  c #6F90B6",
+"F  c #7392B4",
+"G  c #7594B6",
+"H  c #7596BD",
+"J  c #7897BA",
+"K  c #7998BB",
+"L  c #7E9CBA",
+"P  c #7B9ABD",
+"I  c #678CC2",
+"U  c #698EC3",
+"Y  c #6E92C8",
+"T  c #6F94C8",
+"R  c #7698C0",
+"E  c #7899C0",
+"W  c #7297CC",
+"Q  c #7397CC",
+"!  c #769ACF",
+"~  c #7A9ED2",
+"^  c #7CA0D4",
+"/  c #7DA1D5",
+"(  c #7FA3D6",
+")  c #7FA3D7",
+"_  c #809EBC",
+"`  c #81A0BD",
+"'  c #82A0BD",
+"]  c #87A4BE",
+"[  c #87A6C0",
+"{  c #8AA8C2",
+"}  c #8BA8C2",
+"|  c #88A9C6",
+" . c #8AACCA",
+".. c #98B7CD",
+"X. c #81A5D8",
+"o. c #82A6D8",
+"O. c #8AADE0",
+"+. c #8DB0E2",
+"@. c #8FB2E4",
+"#. c #96B8EA",
+"$. c None",
+/* pixels */
+"$.$.$.$.$.$.$.d p $.$.$.$.$.$.$.",
+"$.$.$.$.$.$.$.h a $.$.$.$.$.$.$.",
+"$.$.$.$.$.$.f  .| w $.$.$.$.$.$.",
+"$.$.$.$.$.g n ....x 0 $.$.$.$.$.",
+"$.$.$.$.$.j [ } } ] r $.$.$.$.$.",
+"$.$.$.$.d C _ ' ' L V 3 $.$.$.$.",
+"$.$.$.y z G K P P K F k : $.$.$.",
+"$.$.q e B D H E R Z b i 3 & $.$.",
+"$.$.3 u v n A S N M c l t % $.$.",
+"$.$.< O X . I Y T U 1 > ; @ + $.",
+"$.$.$.$.$.  ! ( ( ! % $.$.$.$.$.",
+"$.$.$.$.$.o ( o.@.X.& $.$.$.$.$.",
+"$.$.$.$.$.; ~ @.#.X.- $.$.$.$.$.",
+"$.$.$.$.$.6 T ~ ) W & $.$.$.$.$.",
+"$.$.$.$.$.0 8 7 2 > # $.$.$.$.$.",
+"$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$."
+};
diff --git a/mgllab/xpm/help-contents.xpm b/mgllab/xpm/help-contents.xpm
new file mode 100644 (file)
index 0000000..028a211
--- /dev/null
@@ -0,0 +1,126 @@
+/* XPM */
+static const char *help_contents_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 104 2 ",
+"   c #AB1010",
+".  c #A21B1B",
+"X  c #A11C1B",
+"o  c #B21C1C",
+"O  c #A32827",
+"+  c #A52927",
+"@  c #A62A29",
+"#  c #B32020",
+"$  c #B32221",
+"%  c #B52626",
+"&  c #A37A77",
+"*  c #A57B78",
+"=  c #A47C79",
+"-  c #A47E7B",
+";  c #A47F7B",
+":  c #B27774",
+">  c #B17977",
+",  c #B77B79",
+"<  c #B57D7B",
+"1  c #EB5757",
+"2  c #EC5757",
+"3  c #EB5C5C",
+"4  c #ED5F5F",
+"5  c #A2837F",
+"6  c #A6827E",
+"7  c #888A85",
+"8  c #898B86",
+"9  c #8A8C87",
+"0  c #8D8F8A",
+"q  c #8F918C",
+"w  c #A68481",
+"e  c #B68885",
+"r  c #BA8D8B",
+"t  c #B79693",
+"y  c #B99390",
+"u  c #B89490",
+"i  c #BA9694",
+"p  c #BD9896",
+"a  c #BAA6A2",
+"s  c #BBA6A3",
+"d  c #BAA8A5",
+"f  c #BAA9A6",
+"g  c #BCAEAB",
+"h  c #BFAEAB",
+"j  c #BABDB6",
+"k  c #D78F8E",
+"l  c #D69392",
+"z  c #D79C9B",
+"x  c #EC8C8C",
+"c  c #F08686",
+"v  c #E09392",
+"b  c #EE9897",
+"n  c #E39E9D",
+"m  c #F69090",
+"M  c #F09F9F",
+"N  c #C5ABA8",
+"B  c #C6ABA8",
+"V  c #C5ADA9",
+"C  c #C6ACA8",
+"Z  c #C0AFAC",
+"A  c #DBA4A2",
+"S  c #CAB1AE",
+"D  c #CDB3B1",
+"F  c #D0B4B2",
+"G  c #D0B5B3",
+"H  c #EDA7A7",
+"J  c #E6AAA9",
+"K  c #EFB2B1",
+"L  c #EAB8B7",
+"P  c #F9B1B1",
+"I  c #C0C3BC",
+"U  c #C2C4BE",
+"Y  c #DEE1DB",
+"T  c #DFE2DC",
+"R  c #E0E3DD",
+"E  c #E1E3DE",
+"W  c #E2E4DF",
+"Q  c #E2E5E0",
+"!  c #E3E5E0",
+"~  c #E4E6E1",
+"^  c #E6E8E4",
+"/  c #E6E9E4",
+"(  c #EAECE8",
+")  c #ECEDEA",
+"_  c #EDEEEB",
+"`  c #EDEFEC",
+"'  c #EEEEEC",
+"]  c #EEEEED",
+"[  c #EEF0ED",
+"{  c #EFF0ED",
+"}  c #F0F0EE",
+"|  c #F0F1EE",
+" . c #F0F1EF",
+".. c #F1F2F0",
+"X. c #F2F3F0",
+"o. c #F2F2F1",
+"O. c #F4F5F3",
+"+. c #F5F5F4",
+"@. c #F8F8F7",
+"#. c #F8F8F8",
+"$. c #F8F9F8",
+"%. c #FAFAF9",
+"&. c white",
+"*. c None",
+/* pixels */
+"*.0 8 8 8 7 7 7 7 7 8 7 7 8 q *.",
+"*.8 &.&.&.&.&.&.&.&.&.&.&.&.9 *.",
+"*.7 &.Y I j j j j j j U ( &.8 *.",
+"*.8 &.Y W / ( ' [ | | [ ( &.8 *.",
+"*.8 &.E ! N & 0 0 - S | ` &.8 *.",
+"*.7 &.E > O l ' ` z + < [ &.8 *.",
+"*.7 &.N O c 1 a a 3 M @ D &.7 *.",
+"*.8 &.5 k 2   y y   4 A 6 &.8 *.",
+"*.8 &.0 | f e O.#.p s o.0 &.8 *.",
+"*.8 &.0 o.a t O.#.r g +.0 &.8 *.",
+"*.8 &.- v x . y i . H n w &.7 *.",
+"*.7 &.V o m b Z Z K P # D &.8 *.",
+"*.7 &.W > # J @.#.L % , o.&.8 *.",
+"*.8 &.W ~ V - 0 q * D O.o.&.8 *.",
+"*.8 &.&.&.&.&.&.&.&.&.&.&.&.8 *.",
+"*.0 8 7 7 7 7 7 7 7 7 7 8 8 q *."
+};
diff --git a/mgllab/xpm/help-faq.xpm b/mgllab/xpm/help-faq.xpm
new file mode 100644 (file)
index 0000000..77be04e
--- /dev/null
@@ -0,0 +1,95 @@
+/* XPM */
+static const char *help_faq_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 73 1 ",
+"  c #7AA5D2",
+". c #7AA5D3",
+"X c #888A85",
+"o c #8A8C88",
+"O c #8B8D88",
+"+ c #8D8F89",
+"@ c #8D8E8A",
+"# c #8D8F8A",
+"$ c #8E8F8B",
+"% c #8D908A",
+"& c #8E908B",
+"* c #8F908B",
+"= c #8F908C",
+"- c #8F918C",
+"; c #90908C",
+": c #90938C",
+"> c #90928D",
+", c #90928E",
+"< c #91928E",
+"1 c #90938E",
+"2 c #93938F",
+"3 c #92948F",
+"4 c #93968F",
+"5 c #939590",
+"6 c #949591",
+"7 c #969994",
+"8 c #979994",
+"9 c #B4B5B1",
+"0 c #B6B8B4",
+"q c #B8B9B7",
+"w c #BBBCBB",
+"e c #BCBDBA",
+"r c #BDBEBB",
+"t c #C0C1BE",
+"y c #8AAFD5",
+"u c #8AAFD6",
+"i c #91B3D5",
+"p c #91B3D6",
+"a c #A0BDDA",
+"s c #A1BDDA",
+"d c #A3BFDB",
+"f c #ADC6DE",
+"g c #ACC6DF",
+"h c #AEC6DE",
+"j c #BFD1E2",
+"k c #BFD1E3",
+"l c #BDD0E5",
+"z c #DFDFDE",
+"x c #DFE0DE",
+"c c #DBE2EB",
+"v c #E1E7EC",
+"b c #EEEEEB",
+"n c #EDEDEC",
+"m c #EEEEEC",
+"M c #EFEFED",
+"N c #F1F1F0",
+"B c #F1F1F1",
+"V c #F2F2F0",
+"C c #F2F2F1",
+"Z c #F4F5F4",
+"A c #F5F5F4",
+"S c #F6F6F5",
+"D c #F8F8F6",
+"F c #F8F8F7",
+"G c #FBFBFA",
+"H c #FBFBFB",
+"J c #FCFCFB",
+"K c gray99",
+"L c #FDFDFD",
+"P c #FEFEFD",
+"I c #FEFEFE",
+"U c white",
+"Y c None",
+/* pixels */
+"YYYYYYYYYYYYYYYY",
+"YYYYYYY03XXXX%YY",
+"YYYYYY0rKKKLKKwY",
+"Y+<XXXo69bdgpcK%",
+"YeKKKKKKr0VVhkK<",
+"+KVMpgpvK5AlgAK<",
+"$KZVZChkK<FyFFK3",
+"<KAADkhAK-HJJKK-",
+"<KFHFyFHK<K.KKK+",
+"<KJKHHJKK<KKKKK5",
+"%KKKK KKK+6AKK7Y",
+"YtKKKKKKK5Y<NK-Y",
+"Y%$X5AKK8YYY<z%Y",
+"YYYYY<MK<YYYY;XY",
+"YYYYYY<x%YYYYYYY",
+"YYYYYYY%XYYYYYYY"
+};
diff --git a/mgllab/xpm/hist.xpm b/mgllab/xpm/hist.xpm
new file mode 100644 (file)
index 0000000..5c7eb5c
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * hist_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #0000FF",
+"                ",
+"                ",
+"        ...     ",
+"        ...     ",
+"        ...     ",
+"    ... ...     ",
+"    ... ...     ",
+"    ... ...     ",
+"    ... ...     ",
+"    ... ...     ",
+"    ... ... ... ",
+"    ... ... ... ",
+"... ... ... ... ",
+"... ... ... ... ",
+"... ... ... ... ",
+"                "};
diff --git a/mgllab/xpm/insert.xpm b/mgllab/xpm/insert.xpm
new file mode 100644 (file)
index 0000000..e0143f1
--- /dev/null
@@ -0,0 +1,23 @@
+/* XPM */
+static const char * insert_xpm[] = {
+"16 16 4 1",
+"      c None",
+".     c #0000FF",
+"#     c #000000",
+"w     c #FFFFFF",
+"                ",
+"                ",
+".  ############ ",
+".. #wwwwwwwwww# ",
+"...#w########w# ",
+"....wwwwwwwwww# ",
+".....########w# ",
+"......wwwwwwww# ",
+".......######w# ",
+"........wwwwww# ",
+".......######w# ",
+"......wwwwwwww# ",
+".....########w# ",
+"....wwwwwwwwww# ",
+"...############ ",
+"..              "};
diff --git a/mgllab/xpm/integr.xpm b/mgllab/xpm/integr.xpm
new file mode 100644 (file)
index 0000000..ddccb22
--- /dev/null
@@ -0,0 +1,22 @@
+/* XPM */
+static const char * integr_xpm[] = {
+"16 16 3 1",
+"      c None",
+".     c #000000",
+"+     c #808080",
+"                ",
+"                ",
+"                ",
+"     .          ",
+"    .           ",
+"    .    .      ",
+"    .    .      ",
+"    .    .      ",
+"    .  ... . .  ",
+"    . .  .  .   ",
+"    . .  .  .   ",
+"    .  ... . .  ",
+"   .     +      ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/last.xpm b/mgllab/xpm/last.xpm
new file mode 100644 (file)
index 0000000..d774d36
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * last_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #0000FF",
+"                ",
+"                ",
+"                ",
+"  .         ..  ",
+"  ...       ..  ",
+"  .....     ..  ",
+"  .......   ..  ",
+"  ......... ..  ",
+"  ............  ",
+"  ............  ",
+"  ......... ..  ",
+"  .......   ..  ",
+"  .....     ..  ",
+"  ...       ..  ",
+"  .         ..  ",
+"                "};
diff --git a/mgllab/xpm/layer-visible-off.xpm b/mgllab/xpm/layer-visible-off.xpm
new file mode 100644 (file)
index 0000000..6b2db6f
--- /dev/null
@@ -0,0 +1,97 @@
+/* XPM */
+static const char *layer_visible_off_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 75 1 ",
+"  c gray21",
+". c #4B4A4A",
+"X c #555656",
+"o c #656565",
+"O c DimGray",
+"+ c gray43",
+"@ c gray44",
+"# c gray51",
+"$ c #838383",
+"% c #858686",
+"& c #868686",
+"* c #888888",
+"= c #8B8B8B",
+"- c gray56",
+"; c #909090",
+": c gray57",
+"> c #939393",
+", c #959595",
+"< c #989898",
+"1 c gray60",
+"2 c #9A9A9A",
+"3 c #9B9B9B",
+"4 c #9B9C9C",
+"5 c gray61",
+"6 c gray62",
+"7 c #9F9F9F",
+"8 c #9EA0A0",
+"9 c #9FA0A0",
+"0 c gray63",
+"q c #A2A2A2",
+"w c gray64",
+"e c #A4A4A4",
+"r c #A5A5A5",
+"t c #A7A7A7",
+"y c gray66",
+"u c #A9A9A9",
+"i c #ABADAD",
+"p c #ACACAC",
+"a c gray68",
+"s c #AEAEAE",
+"d c #AFAFAF",
+"f c gray69",
+"g c #B1B1B1",
+"h c gray70",
+"j c #B4B4B4",
+"k c gray71",
+"l c #B6B6B6",
+"z c #B7B7B7",
+"x c gray72",
+"c c #B8B9B9",
+"v c #BCBCBC",
+"b c #C1C1C1",
+"n c #C3C3C3",
+"m c #C5C7C7",
+"M c gray78",
+"N c gray79",
+"B c #CBCBCB",
+"V c gray80",
+"C c gray81",
+"Z c #D0D0D0",
+"A c LightGray",
+"S c #D5D5D5",
+"D c gray84",
+"F c #D8D8D8",
+"G c gray85",
+"H c gray86",
+"J c #DDDDDD",
+"K c #E6E6E6",
+"L c gray91",
+"P c #EAEAEA",
+"I c #ECECEC",
+"U c gray93",
+"Y c #F1F1F1",
+"T c gray95",
+"R c None",
+/* pixels */
+"RRRRRRRRRRRRRRRR",
+"RRRRRRRRRRRRRRRR",
+"RRRRjhesjsRRRRRR",
+"RRRq+RRRo,hRRRRR",
+"RR*RRRRRRR+uRRRR",
+"RRRRRRRRRRRR3RRR",
+"RRRRRxvxjRRRRRRR",
+"RRRs3;q6-huRRRRR",
+"RRu*MGSmS*6eRRRR",
+"Re-JBn9&hhZ;eRRR",
+"R3fIM&. 6hLZ-3RR",
+"RRqGBcXOiqYPb;RR",
+"RRReG33#3jUKZ64R",
+"RRRRRs,#sYUGh;RR",
+"RRRRRRRRVj6&RRRR",
+"RRRRRRRRRRRRRRRR"
+};
diff --git a/mgllab/xpm/layer-visible-on.xpm b/mgllab/xpm/layer-visible-on.xpm
new file mode 100644 (file)
index 0000000..b35fd8d
--- /dev/null
@@ -0,0 +1,118 @@
+/* XPM */
+static const char *layer_visible_on_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 96 2 ",
+"   c #343434",
+".  c #393939",
+"X  c #483A37",
+"o  c #134950",
+"O  c #0E5664",
+"+  c #444444",
+"@  c gray34",
+"#  c #565658",
+"$  c #5B5B5B",
+"%  c gray38",
+"&  c #646464",
+"*  c #656565",
+"=  c #6E6663",
+"-  c #63666C",
+";  c #6A6A6A",
+":  c #6C6C6C",
+">  c #6D6D6C",
+",  c #6D6D6D",
+"<  c #6E6C6C",
+"1  c gray43",
+"2  c #6F6F6F",
+"3  c #606674",
+"4  c #727272",
+"5  c #737272",
+"6  c #767676",
+"7  c #777777",
+"8  c gray47",
+"9  c gray49",
+"0  c #7E7E7E",
+"q  c #387CA9",
+"w  c #3177BD",
+"e  c #415C87",
+"r  c #5A6F90",
+"t  c #5B7896",
+"y  c #767F8F",
+"u  c #587CAE",
+"i  c #7B8586",
+"p  c #4480B1",
+"a  c #7789AB",
+"s  c #7193B6",
+"d  c #3E8FDC",
+"f  c #32A6CE",
+"g  c #72AFD2",
+"h  c #44B1E2",
+"j  c #51B5EC",
+"k  c #808080",
+"l  c #848484",
+"z  c #868585",
+"x  c gray53",
+"c  c #848689",
+"v  c #888888",
+"b  c gray54",
+"n  c #8B8B8B",
+"m  c gray55",
+"M  c #8D8D8D",
+"N  c #8E8E8E",
+"B  c gray56",
+"V  c #808B9D",
+"C  c gray57",
+"Z  c #929292",
+"A  c #959595",
+"S  c gray59",
+"D  c gray60",
+"F  c #9B9B9B",
+"G  c #8892A3",
+"H  c #8E95A2",
+"J  c #A7A7A7",
+"K  c #AAAAAA",
+"L  c #ACB8B6",
+"P  c #AAB4C7",
+"I  c #A0B5D3",
+"U  c #ACBDDA",
+"Y  c #82B6F0",
+"T  c #9CC0F0",
+"R  c #9CD1F5",
+"E  c #ADCCEE",
+"W  c #B1D1F7",
+"Q  c #C0C0C0",
+"!  c #C7C7C5",
+"~  c #C8C7C6",
+"^  c #C3C6CA",
+"/  c #D0CECD",
+"(  c #D0D0D0",
+")  c #D2D2D1",
+"_  c #D2D2D2",
+"`  c #D8D8D8",
+"'  c #DFDFDE",
+"]  c #E2E0E0",
+"[  c #E6E6E6",
+"{  c #EAEAEA",
+"}  c #ECECEC",
+"|  c #EEEEEC",
+" . c #F0EEEE",
+".. c #F4F2F0",
+"X. c #F4F3F1",
+"o. c None",
+/* pixels */
+"o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.",
+"o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.",
+"o.o.o.o.x < @ % 0 B o.o.o.o.o.o.",
+"o.o.o.6 . o.o.o.  $ C o.o.o.o.o.",
+"o.o.* o.o.o.o.o.o.o.+ B o.o.o.o.",
+"o.o.o.o.o.o.o.o.o.o.o.o.v o.o.o.",
+"o.o.o.o.o.5 ; < 6 o.o.o.o.o.o.o.",
+"o.o.o.k @ - V y # < x o.o.o.o.o.",
+"o.o.l & ^ W R E E 3 ; v o.o.o.o.",
+"o.b < ' U g L z g a / 5 Z o.o.o.",
+"o.8 A  .I q = X f s ] ( 0 S o.o.",
+"o.o.5 _ U j o O h t X.{ Q B o.o.",
+"o.o.o.< ~ p d w u H | [ _ D D o.",
+"o.o.o.o.o.v r e a X.| ` J B o.o.",
+"o.o.o.o.o.o.o.o.! K B ; o.o.o.o.",
+"o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o."
+};
diff --git a/mgllab/xpm/left_1.xpm b/mgllab/xpm/left_1.xpm
new file mode 100644 (file)
index 0000000..679c3ff
--- /dev/null
@@ -0,0 +1,22 @@
+/* XPM */
+static const char * left_1_xpm[] = {
+"16 16 3 1",
+".     c None",
+"+     c #7F0000",
+"@     c #FF0000",
+"................",
+"................",
+".......+........",
+"......++........",
+".....+@+........",
+"....+@@+++++++..",
+"...+@@@@@@@@@+..",
+"..+@@@@@@@@@@+..",
+".+@@@@@@@@@@@+..",
+"..+@@@@@@@@@@+..",
+"...+@@@@@@@@@+..",
+"....+@@+++++++..",
+".....+@+........",
+"......++........",
+".......+........",
+"................"};
diff --git a/mgllab/xpm/light.xpm b/mgllab/xpm/light.xpm
new file mode 100644 (file)
index 0000000..e813c61
--- /dev/null
@@ -0,0 +1,42 @@
+/* XPM */
+static const char * light_xpm[] = {
+"16 16 23 1",
+"      c None",
+"!     c #000000",
+"#     c #808080",
+"$     c #808000",
+"%     c #606040",
+"&     c #C0C0C0",
+"'     c #808040",
+"(     c #FFFF00",
+")     c #A0A000",
+"*     c #202000",
+"+     c #404000",
+",     c #C0C000",
+"-     c #E0E000",
+".     c #408040",
+"0     c #008080",
+"1     c #408080",
+"2     c #FFFFC0",
+"3     c #C0C080",
+"4     c #FFFFFF",
+"5     c #FFFF80",
+"6     c #FFFF40",
+"7     c #606000",
+"8     c #206040",
+"     #    #     ",
+"    #$%&&'$#    ",
+"    '()*+,-%    ",
+"    $.0000.+    ",
+" #'+01&223.0+'# ",
+"&$(.1455555..($#",
+" %)0&566((-$0)% ",
+" &*055((((-)0*& ",
+" &+056((((-)0+& ",
+" ',035(((-,70,' ",
+"&$-.8,---,,8.-$#",
+" #%*08$))780*%# ",
+"    $.0000.+    ",
+"    '()*+,-%    ",
+"    #$%&&'$#    ",
+"     #    #     "};\r
diff --git a/mgllab/xpm/line.xpm b/mgllab/xpm/line.xpm
new file mode 100644 (file)
index 0000000..aff1af3
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * line_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"               .",
+"              . ",
+"             .  ",
+"            .   ",
+"           .    ",
+"          .     ",
+"         .      ",
+"        .       ",
+"       .        ",
+"      .         ",
+"     .          ",
+"    .           ",
+"   .            ",
+"  .             ",
+" .              ",
+".               "};
diff --git a/mgllab/xpm/list-add.xpm b/mgllab/xpm/list-add.xpm
new file mode 100644 (file)
index 0000000..0620147
--- /dev/null
@@ -0,0 +1,115 @@
+/* XPM */
+static const char *list_add_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 93 2 ",
+"   c #008200",
+".  c #008300",
+"X  c #008700",
+"o  c #048604",
+"O  c #008B00",
+"+  c #018C00",
+"@  c #048E02",
+"#  c #058F02",
+"$  c #068F04",
+"%  c #079004",
+"&  c #0B9205",
+"*  c #0C9208",
+"=  c #0E9308",
+"-  c #13970A",
+";  c #12960B",
+":  c #17990D",
+">  c #179A0C",
+",  c #1B9C0E",
+"<  c #1C9C0E",
+"1  c #1F9810",
+"2  c #1F9F10",
+"3  c #199914",
+"4  c #1F9319",
+"5  c #209F11",
+"6  c #24A113",
+"7  c #28A415",
+"8  c #2AA419",
+"9  c #2FA819",
+"0  c #30A91B",
+"q  c #37AD1D",
+"w  c #37AD1E",
+"e  c #2AA123",
+"r  c #37AC20",
+"t  c #39AA2C",
+"y  c #3CB023",
+"u  c #3FB126",
+"i  c #33A332",
+"p  c #3BA730",
+"a  c #56AB1D",
+"s  c #40B322",
+"d  c #40B223",
+"f  c #42B326",
+"g  c #43B427",
+"h  c #40B028",
+"j  c #40B128",
+"k  c #43B12E",
+"l  c #45B32D",
+"z  c #49B828",
+"x  c #4FBB2A",
+"c  c #4EB734",
+"v  c #56BD35",
+"b  c #58BE35",
+"n  c #58C031",
+"m  c #46A742",
+"M  c #41A841",
+"N  c #4AAD46",
+"B  c #4FB549",
+"V  c #57BB47",
+"C  c #5ABD47",
+"Z  c #57B848",
+"A  c #5DB553",
+"S  c #5DBC55",
+"D  c #60BD4F",
+"F  c #62BE56",
+"G  c #62B662",
+"H  c #68BA63",
+"J  c #68BD60",
+"K  c #6BBF65",
+"L  c #63C353",
+"P  c #65C454",
+"I  c #6BC352",
+"U  c #67C05E",
+"Y  c #6AC359",
+"T  c #68C25F",
+"R  c #6DC561",
+"E  c #75C864",
+"W  c #7CCD61",
+"Q  c #77CA68",
+"!  c #79CC6B",
+"~  c #7BCD6C",
+"^  c #7CC970",
+"/  c #7ECA74",
+"(  c #83D173",
+")  c #84D174",
+"_  c #91D77C",
+"`  c #92D97E",
+"'  c #9AD686",
+"]  c #9ADB80",
+"[  c #9EDE86",
+"{  c #A1DF8A",
+"}  c #A0D98E",
+"|  c #A1D990",
+" . c None",
+/* pixels */
+" . . . . . . . . . . . . . . . .",
+" . . . . . .^ j g |  . . . . . .",
+" . . . . . .Z } ' I  . . . . . .",
+" . . . . . .6 [ { f  . . . . . .",
+" . . . . . .2 _ ` y  . . . . . .",
+" . . . . . ., ( ) r  . . . . . .",
+" .G M $ * ; : ! ~ 0 w d z W ]  .",
+" .o H J U T R L P E Q / K A n  .",
+" .. m N B S F Z C Y D t e t x  .",
+" . .. X O $ & k c 5 7 9 w s  . .",
+" . . . . . .$ l v <  . . . . . .",
+" . . . . . .@ h b :  . . . . . .",
+" . . . . . .+ 8 h ;  . . . . . .",
+" . . . . . .5 * 4 5  . . . . . .",
+" . . . . . .a * i  . . . . . . .",
+" . . . . . . . . . . . . . . . ."
+};
diff --git a/mgllab/xpm/list-remove.xpm b/mgllab/xpm/list-remove.xpm
new file mode 100644 (file)
index 0000000..ed03189
--- /dev/null
@@ -0,0 +1,68 @@
+/* XPM */
+static const char *list_remove_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 46 1 ",
+"  c #9B0000",
+". c #9E0000",
+"X c #A50000",
+"o c #A10404",
+"O c #AB0000",
+"+ c #B00000",
+"@ c #B20000",
+"# c #B70000",
+"$ c #B90000",
+"% c #BE0000",
+"& c #BF0000",
+"* c #BE1C1C",
+"= c #BE2222",
+"- c #C40000",
+"; c #C60000",
+": c #CB0000",
+"> c #CD0000",
+", c #D20000",
+"< c #D30000",
+"1 c #D80000",
+"2 c #DA0000",
+"3 c #DF0000",
+"4 c #E50000",
+"5 c #EA0404",
+"6 c #D02828",
+"7 c #BF4141",
+"8 c #C74545",
+"9 c #C84D4D",
+"0 c #DF4949",
+"q c #DE4D4D",
+"w c #C15252",
+"e c #CF5A5A",
+"r c #D25151",
+"t c #D15757",
+"y c #D95050",
+"u c #D75A5A",
+"i c #DC5A5A",
+"p c #EC4141",
+"a c #E14949",
+"s c #E15A5A",
+"d c #E45A5A",
+"f c #C76464",
+"g c #CC6767",
+"h c #E26464",
+"j c #F66262",
+"k c None",
+/* pixels */
+"kkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkk",
+"kkf7+#%-:,13pjkk",
+"kkogeuisddht85kk",
+"kk.w9ryaa06*=4kk",
+"kkk.XO+$-->,1kkk",
+"kkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkk"
+};
diff --git a/mgllab/xpm/mark_.xpm b/mgllab/xpm/mark_.xpm
new file mode 100644 (file)
index 0000000..b372f5a
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * mark__xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"       ..       ",
+"       ..       ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/mark_a.xpm b/mgllab/xpm/mark_a.xpm
new file mode 100644 (file)
index 0000000..29f34cb
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * mark_a_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"    .       .   ",
+"     .     .    ",
+"      .   .     ",
+"      .   .     ",
+"       . .      ",
+"       ...      ",
+" .............. ",
+"       ...      ",
+"       . .      ",
+"      .   .     ",
+"      .   .     ",
+"     .     .    ",
+"    .       .   ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/mark_cf.xpm b/mgllab/xpm/mark_cf.xpm
new file mode 100644 (file)
index 0000000..f743a31
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * mark_cf_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"     ......     ",
+"   ..      ..   ",
+"  .          .  ",
+" .            . ",
+" .            . ",
+".              .",
+".              .",
+".      ..      .",
+".      ..      .",
+".              .",
+".              .",
+" .            . ",
+" .            . ",
+"  .          .  ",
+"   ..      ..   ",
+"     ......     "};
diff --git a/mgllab/xpm/mark_d.xpm b/mgllab/xpm/mark_d.xpm
new file mode 100644 (file)
index 0000000..678d75e
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * mark_d_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"       ..       ",
+"      .  .      ",
+"     .    .     ",
+"    .      .    ",
+"   .        .   ",
+"  .          .  ",
+" .            . ",
+".              .",
+".              .",
+" .            . ",
+"  .          .  ",
+"   .        .   ",
+"    .      .    ",
+"     .    .     ",
+"      .  .      ",
+"       ..       "};
diff --git a/mgllab/xpm/mark_df.xpm b/mgllab/xpm/mark_df.xpm
new file mode 100644 (file)
index 0000000..582d420
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * mark_df_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"       ..       ",
+"      ....      ",
+"     ......     ",
+"    ........    ",
+"   ..........   ",
+"  ............  ",
+" .............. ",
+"................",
+"................",
+" .............. ",
+"  ............  ",
+"   ..........   ",
+"    ........    ",
+"     ......     ",
+"      ....      ",
+"       ..       "};
diff --git a/mgllab/xpm/mark_l.xpm b/mgllab/xpm/mark_l.xpm
new file mode 100644 (file)
index 0000000..9edd3e0
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * mark_l_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"          ..    ",
+"        .. .    ",
+"       .   .    ",
+"     ..    .    ",
+"    .      .    ",
+"  ..       .    ",
+" .         .    ",
+".          .    ",
+".          .    ",
+" .         .    ",
+"  ..       .    ",
+"    .      .    ",
+"     ..    .    ",
+"       .   .    ",
+"        .. .    ",
+"          ..    "};
diff --git a/mgllab/xpm/mark_lf.xpm b/mgllab/xpm/mark_lf.xpm
new file mode 100644 (file)
index 0000000..2585eb4
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * mark_lf_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"          ..    ",
+"        ....    ",
+"       .....    ",
+"     .......    ",
+"    ........    ",
+"  ..........    ",
+" ...........    ",
+"............    ",
+"............    ",
+" ...........    ",
+"  ..........    ",
+"    ........    ",
+"     .......    ",
+"       .....    ",
+"        ....    ",
+"          ..    "};
diff --git a/mgllab/xpm/mark_n.xpm b/mgllab/xpm/mark_n.xpm
new file mode 100644 (file)
index 0000000..efb363e
--- /dev/null
@@ -0,0 +1,20 @@
+/* XPM */
+static const char * mark_n_xpm[] = {
+"16 16 1 1",
+"      c None",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/mark_o.xpm b/mgllab/xpm/mark_o.xpm
new file mode 100644 (file)
index 0000000..3154cdc
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * mark_o_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"     ......     ",
+"   ..      ..   ",
+"  .          .  ",
+" .            . ",
+" .            . ",
+".              .",
+".              .",
+".              .",
+".              .",
+".              .",
+".              .",
+" .            . ",
+" .            . ",
+"  .          .  ",
+"   ..      ..   ",
+"     ......     "};
diff --git a/mgllab/xpm/mark_of.xpm b/mgllab/xpm/mark_of.xpm
new file mode 100644 (file)
index 0000000..3eeaf38
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * mark_of_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"     ......     ",
+"   ..........   ",
+"  ............  ",
+" .............. ",
+" .............. ",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+" .............. ",
+" .............. ",
+"  ............  ",
+"   ..........   ",
+"     ......     "};
diff --git a/mgllab/xpm/mark_p.xpm b/mgllab/xpm/mark_p.xpm
new file mode 100644 (file)
index 0000000..3f40cfb
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * mark_p_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"        .       ",
+"        .       ",
+"        .       ",
+"        .       ",
+"        .       ",
+"        .       ",
+"        .       ",
+"        .       ",
+"................",
+"        .       ",
+"        .       ",
+"        .       ",
+"        .       ",
+"        .       ",
+"        .       ",
+"        .       "};
diff --git a/mgllab/xpm/mark_pf.xpm b/mgllab/xpm/mark_pf.xpm
new file mode 100644 (file)
index 0000000..ea9cdac
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * mark_pf_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"................",
+".       .      .",
+".       .      .",
+".       .      .",
+".       .      .",
+".       .      .",
+".       .      .",
+".       .      .",
+"................",
+".       .      .",
+".       .      .",
+".       .      .",
+".       .      .",
+".       .      .",
+".       .      .",
+"................"};
diff --git a/mgllab/xpm/mark_r.xpm b/mgllab/xpm/mark_r.xpm
new file mode 100644 (file)
index 0000000..8459014
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * mark_r_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"    ..          ",
+"    . ..        ",
+"    .   .       ",
+"    .    ..     ",
+"    .      .    ",
+"    .       ..  ",
+"    .         . ",
+"    .          .",
+"    .          .",
+"    .         . ",
+"    .       ..  ",
+"    .      .    ",
+"    .    ..     ",
+"    .   .       ",
+"    . ..        ",
+"    ..          "};
diff --git a/mgllab/xpm/mark_rf.xpm b/mgllab/xpm/mark_rf.xpm
new file mode 100644 (file)
index 0000000..cedcd01
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * mark_rf_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"    ..          ",
+"    ....        ",
+"    .....       ",
+"    .......     ",
+"    ........    ",
+"    ..........  ",
+"    ........... ",
+"    ............",
+"    ............",
+"    ........... ",
+"    ..........  ",
+"    ........    ",
+"    .......     ",
+"    .....       ",
+"    ....        ",
+"    ..          "};
diff --git a/mgllab/xpm/mark_s.xpm b/mgllab/xpm/mark_s.xpm
new file mode 100644 (file)
index 0000000..1a4c012
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * mark_s_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"................",
+".              .",
+".              .",
+".              .",
+".              .",
+".              .",
+".              .",
+".              .",
+".              .",
+".              .",
+".              .",
+".              .",
+".              .",
+".              .",
+".              .",
+"................"};
diff --git a/mgllab/xpm/mark_sf.xpm b/mgllab/xpm/mark_sf.xpm
new file mode 100644 (file)
index 0000000..5a89f1d
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * mark_sf_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................"};
diff --git a/mgllab/xpm/mark_t.xpm b/mgllab/xpm/mark_t.xpm
new file mode 100644 (file)
index 0000000..1e6b398
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * mark_t_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"       ..       ",
+"      .  .      ",
+"     .    .     ",
+"     .    .     ",
+"    .      .    ",
+"   .        .   ",
+"   .        .   ",
+"  .          .  ",
+" .            . ",
+" .            . ",
+".              .",
+"................",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/mark_tf.xpm b/mgllab/xpm/mark_tf.xpm
new file mode 100644 (file)
index 0000000..48f61c1
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * mark_tf_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"       ..       ",
+"      ....      ",
+"     ......     ",
+"     ......     ",
+"    ........    ",
+"   ..........   ",
+"   ..........   ",
+"  ............  ",
+" .............. ",
+" .............. ",
+"................",
+"................",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/mark_v.xpm b/mgllab/xpm/mark_v.xpm
new file mode 100644 (file)
index 0000000..9f03771
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * mark_v_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"                ",
+"                ",
+"                ",
+"................",
+".              .",
+" .            . ",
+" .            . ",
+"  .          .  ",
+"   .        .   ",
+"   .        .   ",
+"    .      .    ",
+"     .    .     ",
+"     .    .     ",
+"      .  .      ",
+"       ..       "};
diff --git a/mgllab/xpm/mark_vf.xpm b/mgllab/xpm/mark_vf.xpm
new file mode 100644 (file)
index 0000000..39d7e99
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * mark_vf_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"                ",
+"                ",
+"                ",
+"................",
+"................",
+" .............. ",
+" .............. ",
+"  ............  ",
+"   ..........   ",
+"   ..........   ",
+"    ........    ",
+"     ......     ",
+"     ......     ",
+"      ....      ",
+"       ..       "};
diff --git a/mgllab/xpm/mark_x.xpm b/mgllab/xpm/mark_x.xpm
new file mode 100644 (file)
index 0000000..8d7ee78
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * mark_x_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+".              .",
+" .            . ",
+"  .          .  ",
+"   .        .   ",
+"    .      .    ",
+"     .    .     ",
+"      .  .      ",
+"       ..       ",
+"       ..       ",
+"      .  .      ",
+"     .    .     ",
+"    .      .    ",
+"   .        .   ",
+"  .          .  ",
+" .            . ",
+".              ."};
diff --git a/mgllab/xpm/mark_y.xpm b/mgllab/xpm/mark_y.xpm
new file mode 100644 (file)
index 0000000..b5135fd
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * mark_y_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"                ",
+"   .         .  ",
+"    .       .   ",
+"     .     .    ",
+"      .   .     ",
+"       ...      ",
+"        .       ",
+"        .       ",
+"        .       ",
+"        .       ",
+"        .       ",
+"        .       ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/mask_a.xpm b/mgllab/xpm/mask_a.xpm
new file mode 100644 (file)
index 0000000..6949dd9
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char *mask_a_xpm[]={
+"16 16 2 1",
+". c None",
+"# c #000000",
+"##............##",
+"##............##",
+"..##........##..",
+"..##........##..",
+"....##....##....",
+"....##....##....",
+"......####......",
+"......####......",
+"......####......",
+"......####......",
+"....##....##....",
+"....##....##....",
+"..##........##..",
+"..##........##..",
+"##............##",
+"##............##"};
diff --git a/mgllab/xpm/mask_d.xpm b/mgllab/xpm/mask_d.xpm
new file mode 100644 (file)
index 0000000..dc7f66d
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char *mask_d_xpm[]={
+"16 16 2 1",
+". c None",
+"# c #000000",
+"................",
+"................",
+"........##......",
+"........##......",
+"......##..##....",
+"......##..##....",
+"....##......##..",
+"....##......##..",
+"......##..##....",
+"......##..##....",
+"........##......",
+"........##......",
+"................",
+"................",
+"................",
+"................"};
diff --git a/mgllab/xpm/mask_d_.xpm b/mgllab/xpm/mask_d_.xpm
new file mode 100644 (file)
index 0000000..d3eee46
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char *mask_D_xpm[]={
+"16 16 2 1",
+". c None",
+"# c #000000",
+"................",
+"................",
+"........##......",
+"........##......",
+"......######....",
+"......######....",
+"....##########..",
+"....##########..",
+"......######....",
+"......######....",
+"........##......",
+"........##......",
+"................",
+"................",
+"................",
+"................"};
diff --git a/mgllab/xpm/mask_e.xpm b/mgllab/xpm/mask_e.xpm
new file mode 100644 (file)
index 0000000..2e6b528
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char *mask_e_xpm[]={
+"16 16 2 1",
+". c None",
+"# c #000000",
+"................",
+"................",
+"................",
+"................",
+"################",
+"################",
+"................",
+"................",
+"################",
+"################",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................"};
diff --git a/mgllab/xpm/mask_i.xpm b/mgllab/xpm/mask_i.xpm
new file mode 100644 (file)
index 0000000..a24c1ca
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char *mask_i_xpm[]={
+"16 16 2 1",
+". c None",
+"# c #000000",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"..######..######",
+"..######..######",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................"};
diff --git a/mgllab/xpm/mask_j.xpm b/mgllab/xpm/mask_j.xpm
new file mode 100644 (file)
index 0000000..fcc072f
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char *mask_j_xpm[]={
+"16 16 2 1",
+". c None",
+"# c #000000",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"..##..##########",
+"..##..##########",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................"};
diff --git a/mgllab/xpm/mask_l.xpm b/mgllab/xpm/mask_l.xpm
new file mode 100644 (file)
index 0000000..a062db6
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char *mask_l_xpm[]={
+"16 16 2 1",
+". c None",
+"# c #000000",
+"................",
+"................",
+"..........####..",
+"..........####..",
+"......####..##..",
+"......####..##..",
+"..####......##..",
+"..####......##..",
+"......####..##..",
+"......####..##..",
+"..........####..",
+"..........####..",
+"................",
+"................",
+"................",
+"................"};
diff --git a/mgllab/xpm/mask_m.xpm b/mgllab/xpm/mask_m.xpm
new file mode 100644 (file)
index 0000000..e717d96
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char *mask_m_xpm[]={
+"16 16 2 1",
+". c None",
+"# c #000000",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"################",
+"################",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................"};
diff --git a/mgllab/xpm/mask_o.xpm b/mgllab/xpm/mask_o.xpm
new file mode 100644 (file)
index 0000000..3664bc4
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char *mask_o_xpm[]={
+"16 16 2 1",
+". c None",
+"# c #000000",
+"................",
+"................",
+"................",
+"................",
+"......####......",
+"......####......",
+"....##....##....",
+"....##....##....",
+"....##....##....",
+"....##....##....",
+"......####......",
+"......####......",
+"................",
+"................",
+"................",
+"................"};
diff --git a/mgllab/xpm/mask_o_.xpm b/mgllab/xpm/mask_o_.xpm
new file mode 100644 (file)
index 0000000..fbecff8
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char *mask_O_xpm[]={
+"16 16 2 1",
+". c None",
+"# c #000000",
+"................",
+"................",
+"................",
+"................",
+"......####......",
+"......####......",
+"....########....",
+"....########....",
+"....########....",
+"....########....",
+"......####......",
+"......####......",
+"................",
+"................",
+"................",
+"................"};
diff --git a/mgllab/xpm/mask_p.xpm b/mgllab/xpm/mask_p.xpm
new file mode 100644 (file)
index 0000000..d29f774
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char *mask_p_xpm[]={
+"16 16 2 1",
+". c None",
+"# c #000000",
+"........##......",
+"........##......",
+"........##......",
+"........##......",
+"........##......",
+"........##......",
+"################",
+"################",
+"........##......",
+"........##......",
+"........##......",
+"........##......",
+"........##......",
+"........##......",
+"........##......",
+"........##......"};
diff --git a/mgllab/xpm/mask_r.xpm b/mgllab/xpm/mask_r.xpm
new file mode 100644 (file)
index 0000000..47f2aa5
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char *mask_r_xpm[]={
+"16 16 2 1",
+". c None",
+"# c #000000",
+"................",
+"................",
+"..####..........",
+"..####..........",
+"..##..####......",
+"..##..####......",
+"..##......####..",
+"..##......####..",
+"..##..####......",
+"..##..####......",
+"..####..........",
+"..####..........",
+"................",
+"................",
+"................",
+"................"};
diff --git a/mgllab/xpm/mask_s.xpm b/mgllab/xpm/mask_s.xpm
new file mode 100644 (file)
index 0000000..a5e1e82
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char *mask_s_xpm[]={
+"16 16 2 1",
+". c None",
+"# c #000000",
+"................",
+"................",
+"................",
+"................",
+"....########....",
+"....########....",
+"....##....##....",
+"....##....##....",
+"....##....##....",
+"....##....##....",
+"....########....",
+"....########....",
+"................",
+"................",
+"................",
+"................"};
diff --git a/mgllab/xpm/mask_s_.xpm b/mgllab/xpm/mask_s_.xpm
new file mode 100644 (file)
index 0000000..652db36
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char *mask_S_xpm[]={
+"16 16 2 1",
+". c None",
+"# c #000000",
+"................",
+"................",
+"................",
+"................",
+"....########....",
+"....########....",
+"....########....",
+"....########....",
+"....########....",
+"....########....",
+"....########....",
+"....########....",
+"................",
+"................",
+"................",
+"................"};
diff --git a/mgllab/xpm/mask_t.xpm b/mgllab/xpm/mask_t.xpm
new file mode 100644 (file)
index 0000000..d153fc8
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char *mask_t_xpm[]={
+"16 16 2 1",
+". c None",
+"# c #000000",
+"................",
+"................",
+"................",
+"................",
+"..####..........",
+"..####..........",
+"##....##........",
+"##....##........",
+"........##....##",
+"........##....##",
+"..........####..",
+"..........####..",
+"................",
+"................",
+"................",
+"................"};
diff --git a/mgllab/xpm/mask_u.xpm b/mgllab/xpm/mask_u.xpm
new file mode 100644 (file)
index 0000000..61996fc
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char *mask_u_xpm[]={
+"16 16 2 1",
+". c None",
+"# c #000000",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"......####......",
+"......####......",
+"....##....##....",
+"....##....##....",
+"..##........##..",
+"..##........##..",
+"................",
+"................",
+"................",
+"................"};
diff --git a/mgllab/xpm/media-playback-start.xpm b/mgllab/xpm/media-playback-start.xpm
new file mode 100644 (file)
index 0000000..0818c88
--- /dev/null
@@ -0,0 +1,108 @@
+/* XPM */
+static const char *media_playback_start_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 86 1 ",
+"  c #070707",
+". c gray9",
+"X c #181818",
+"o c gray13",
+"O c #252525",
+"+ c gray21",
+"@ c gray23",
+"# c gray25",
+"$ c #484848",
+"% c gray29",
+"& c gray31",
+"* c #505050",
+"= c #515151",
+"- c gray32",
+"; c #535353",
+": c gray33",
+"> c #555555",
+", c #565656",
+"< c #585858",
+"1 c #5B5B5B",
+"2 c #5D5D5D",
+"3 c gray37",
+"4 c #5F5F5F",
+"5 c #606060",
+"6 c gray38",
+"7 c #646464",
+"8 c #656565",
+"9 c gray40",
+"0 c #676767",
+"q c #686868",
+"w c #6A6A6A",
+"e c gray42",
+"r c #6C6C6C",
+"t c #6F6F6F",
+"y c #727272",
+"u c gray45",
+"i c #747474",
+"p c #767676",
+"a c #777777",
+"s c gray47",
+"d c #797979",
+"f c #7B7B7B",
+"g c #7C7C7C",
+"h c gray49",
+"j c gray50",
+"k c #818181",
+"l c #838383",
+"z c #868686",
+"x c #8D8D8D",
+"c c #8E8E8E",
+"v c gray56",
+"b c gray58",
+"n c #9A9A9A",
+"m c #B2B2B2",
+"M c gray72",
+"N c gray73",
+"B c #BBBBBB",
+"V c gray",
+"C c #CBCBCB",
+"Z c gray80",
+"A c #CECECE",
+"S c gray81",
+"D c #D0D0D0",
+"F c LightGray",
+"G c gray83",
+"H c #D5D5D5",
+"J c gray85",
+"K c gray86",
+"L c #DDDDDD",
+"P c #E2E2E2",
+"I c gray91",
+"U c #E9E9E9",
+"Y c #EAEAEA",
+"T c #ECECEC",
+"R c gray93",
+"E c #EFEFEF",
+"W c gray94",
+"Q c #F1F1F1",
+"! c gray95",
+"~ c #F3F3F3",
+"^ c #F6F6F6",
+"/ c gray98",
+"( c gray99",
+") c #FDFDFD",
+"_ c white",
+"` c None",
+/* pixels */
+"`````lljjll`````",
+"````duujjuud````",
+"``dtaNDJJHNdtd``",
+"``ecHUR^WWULce``",
+"`tuHR^mW))/WPae`",
+"e4VR^)czD)))WD5e",
+"77SW))j7<bW)/Ue5",
+"4uDW/)7;#@4C)Rj5",
+"4uHW))+. O>S)Wj4",
+"<5DR))@oXuW)/R7<",
+"4;MU/)%%N)))/J><",
+"`>eLW)bW))))Wa>`",
+"``;lPW))))/Rn&``",
+"``>&7SURWRLu;>``",
+"````;&4ad4&;````",
+"`````;;&;;>`````"
+};
diff --git a/mgllab/xpm/media-seek-backward.xpm b/mgllab/xpm/media-seek-backward.xpm
new file mode 100644 (file)
index 0000000..3ee8ae8
--- /dev/null
@@ -0,0 +1,112 @@
+/* XPM */
+static const char *media_seek_backward_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 90 1 ",
+"  c #070707",
+". c gray3",
+"X c #191919",
+"o c gray13",
+"O c #252525",
+"+ c #2C2C2C",
+"@ c gray18",
+"# c gray20",
+"$ c #444444",
+"% c #4C4C4C",
+"& c gray31",
+"* c #505050",
+"= c #515151",
+"- c gray32",
+"; c #535353",
+": c gray33",
+"> c #555555",
+", c #565656",
+"< c #5B5B5B",
+"1 c #5D5D5D",
+"2 c #5F5F5F",
+"3 c #606060",
+"4 c gray38",
+"5 c gray39",
+"6 c #646464",
+"7 c #656565",
+"8 c gray40",
+"9 c #676767",
+"0 c #686868",
+"q c #6A6A6A",
+"w c gray42",
+"e c #6C6C6C",
+"r c #6F6F6F",
+"t c #727272",
+"y c gray45",
+"u c #747474",
+"i c #767676",
+"p c #777777",
+"a c gray47",
+"s c #797979",
+"d c #7B7B7B",
+"f c #7C7C7C",
+"g c gray50",
+"h c #818181",
+"j c #838383",
+"k c #868686",
+"l c #8D8D8D",
+"z c #8E8E8E",
+"x c #9A9A9A",
+"c c #9F9F9F",
+"v c #A2A2A2",
+"b c #A5A5A5",
+"n c gray65",
+"m c #AAAAAA",
+"M c #B1B1B1",
+"N c #B2B2B2",
+"B c #B6B6B6",
+"V c gray72",
+"C c gray73",
+"Z c #BCBCBC",
+"A c gray74",
+"S c gray",
+"D c gray76",
+"F c #C3C3C3",
+"G c #CACACA",
+"H c #CECECE",
+"J c #D0D0D0",
+"K c LightGray",
+"L c gray83",
+"P c #D5D5D5",
+"I c gray85",
+"U c gray86",
+"Y c #DDDDDD",
+"T c #E2E2E2",
+"R c gray91",
+"E c #E9E9E9",
+"W c #EAEAEA",
+"Q c #ECECEC",
+"! c gray93",
+"~ c #EFEFEF",
+"^ c #F1F1F1",
+"/ c gray95",
+"( c #F3F3F3",
+") c #F6F6F6",
+"_ c gray98",
+"` c #FBFBFB",
+"' c gray99",
+"] c #FDFDFD",
+"[ c white",
+"{ c None",
+/* pixels */
+"{{{{{jjggjj{{{{{",
+"{{{{syyggyys{{{{",
+"{{srsCJIIPCirs{{",
+"{{wzJR^^^^WYzw{{",
+"{ryPQ)`D]]`^Tiw{",
+"w2SQ)]Ds]]B]^H5w",
+"66H^]Gi5]S:]`W66",
+"2yJ^Ss<%S2@]`^s5",
+"2yP^M*O.M$.]]^g<",
+"<5JQ]m@X]bo]]^6<",
+"<*CW`]v#]]b]`I:<",
+"{:6Y^]]b]]]]^y:{",
+"{{*kT^`]]]`^x*{{",
+"{{:*wJWQ^QIi*:{{",
+"{{{{**2is5**{{{{",
+"{{{{{:****:{{{{{"
+};
diff --git a/mgllab/xpm/media-seek-forward.xpm b/mgllab/xpm/media-seek-forward.xpm
new file mode 100644 (file)
index 0000000..c9cc329
--- /dev/null
@@ -0,0 +1,109 @@
+/* XPM */
+static const char *media_seek_forward_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 87 1 ",
+"  c #070707",
+". c gray3",
+"X c #191919",
+"o c #252525",
+"O c #313131",
+"+ c gray21",
+"@ c gray23",
+"# c #3F3F3F",
+"$ c gray29",
+"% c #4E4E4E",
+"& c gray31",
+"* c #505050",
+"= c #515151",
+"- c gray32",
+"; c gray33",
+": c #555555",
+"> c #565656",
+", c #5A5A5A",
+"< c #5B5B5B",
+"1 c #5D5D5D",
+"2 c #5F5F5F",
+"3 c #606060",
+"4 c gray38",
+"5 c #646464",
+"6 c #656565",
+"7 c gray40",
+"8 c #676767",
+"9 c #686868",
+"0 c #6A6A6A",
+"q c gray42",
+"w c #6C6C6C",
+"e c #6F6F6F",
+"r c #727272",
+"t c gray45",
+"y c #747474",
+"u c #767676",
+"i c #777777",
+"p c gray47",
+"a c #797979",
+"s c #7B7B7B",
+"d c #7C7C7C",
+"f c gray50",
+"g c #818181",
+"h c #838383",
+"j c #868686",
+"k c #8D8D8D",
+"l c #8E8E8E",
+"z c #909090",
+"x c #959595",
+"c c gray60",
+"v c #9A9A9A",
+"b c gray63",
+"n c gray65",
+"m c #A9A9A9",
+"M c gray67",
+"N c #AEAEAE",
+"B c #B2B2B2",
+"V c gray72",
+"C c gray73",
+"Z c gray74",
+"A c gray",
+"S c #CACACA",
+"D c #CECECE",
+"F c #D0D0D0",
+"G c LightGray",
+"H c gray83",
+"J c #D5D5D5",
+"K c gray85",
+"L c gray86",
+"P c #DDDDDD",
+"I c #E2E2E2",
+"U c gray91",
+"Y c #E9E9E9",
+"T c #EAEAEA",
+"R c #ECECEC",
+"E c gray93",
+"W c #EFEFEF",
+"Q c #F1F1F1",
+"! c gray95",
+"~ c #F3F3F3",
+"^ c #F6F6F6",
+"/ c gray98",
+"( c #FBFBFB",
+") c gray99",
+"_ c #FDFDFD",
+"` c white",
+"' c None",
+/* pixels */
+"'''''hhffhh'''''",
+"''''attfftta''''",
+"''aeiVFLLJViea''",
+"''qlJTRQQQTPlq''",
+"'etJR^__A_/QIiq'",
+"q2AR^S__aB__QD3q",
+"55DQ_lA_q%n_/Tq3",
+"2tFQ_q;V,O+M_Rf3",
+"2tJQ/O.b+.oM_Qf2",
+",3FQ_$z_@Xx__R5,",
+",;VT/M__$v__/L;,",
+"';5PQ/__N___Qi;'",
+"''*jIQ/___/Qv*''",
+"'';%qFTRQRLi%;''",
+"''''**2aa2%*''''",
+"''''';****;'''''"
+};
diff --git a/mgllab/xpm/next.xpm b/mgllab/xpm/next.xpm
new file mode 100644 (file)
index 0000000..606c733
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * next_xpm[] = {
+"16 16 2 1",
+"      c #E7E7E7",
+".     c #0000FF",
+"                ",
+"                ",
+"                ",
+"  .             ",
+"  ...           ",
+"  .....         ",
+"  .......       ",
+"  .........     ",
+"  ...........   ",
+"  ...........   ",
+"  .........     ",
+"  .......       ",
+"  .....         ",
+"  ...           ",
+"  .             ",
+"                "};
diff --git a/mgllab/xpm/next_sl.xpm b/mgllab/xpm/next_sl.xpm
new file mode 100644 (file)
index 0000000..da4f178
--- /dev/null
@@ -0,0 +1,24 @@
+/* XPM */
+static const char * next_sl_xpm[] = {
+"16 16 5 1",
+"      c None",
+".     c #00007F",
+"+     c #007FFF",
+"@     c #0000FF",
+"#     c #003F80",
+"                ",
+"      ..        ",
+"      .+.       ",
+"      .++.      ",
+"     .++@+.     ",
+" ....++@+@+.    ",
+" .@+@+@+@+@+.   ",
+" .@@@@@@@@+@+.  ",
+" .@@@@@@@@@@@@. ",
+" .@@@@@@@@#@#.  ",
+" .@#@#@#@#@#.   ",
+" ....@#@#@#.    ",
+"     .@#@#.     ",
+"      .##.      ",
+"      .#.       ",
+"      ..        "};
diff --git a/mgllab/xpm/none.xpm b/mgllab/xpm/none.xpm
new file mode 100644 (file)
index 0000000..e81575f
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * none_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"................",
+"..            ..",
+". .          . .",
+".  .        .  .",
+".   .      .   .",
+".    .    .    .",
+".     .  .     .",
+".      ..      .",
+".      ..      .",
+".     .  .     .",
+".    .    .    .",
+".   .      .   .",
+".  .        .  .",
+". .          . .",
+"..            ..",
+"................"};
diff --git a/mgllab/xpm/norm_1.xpm b/mgllab/xpm/norm_1.xpm
new file mode 100644 (file)
index 0000000..a433a58
--- /dev/null
@@ -0,0 +1,22 @@
+/* XPM */
+static const char * norm_1_xpm[] = {
+"16 16 3 1",
+".     c None",
+"+     c #7F0000",
+"@     c #FF0000",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+".++++++++++++++.",
+".+@@@@@@@@@@@@+.",
+".+@@@@@@@@@@@@+.",
+".++++++++++++++.",
+"................",
+"................",
+"................",
+"................",
+"................"};
diff --git a/mgllab/xpm/object-group.xpm b/mgllab/xpm/object-group.xpm
new file mode 100644 (file)
index 0000000..8b37492
--- /dev/null
@@ -0,0 +1,46 @@
+/* XPM */
+static const char *object_group_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 24 1 ",
+"  c #75777E",
+". c #78787B",
+"X c #1867ED",
+"o c #1867EE",
+"O c #86868A",
+"+ c #949499",
+"@ c #A1A1A6",
+"# c #ACACB1",
+"$ c #B3B5BD",
+"% c #B7B7BC",
+"& c #B8B8BD",
+"* c gray90",
+"= c #E7E7E7",
+"- c gray91",
+"; c #ECECEC",
+": c gray93",
+"> c #EEEEEE",
+", c #EFEFEF",
+"< c #F3F3F3",
+"1 c #F6F6F6",
+"2 c #FBFBFB",
+"3 c #FEFEFE",
+"4 c white",
+"5 c None",
+/* pixels */
+"5555555555555555",
+"5555555555555555",
+"555Xooooo5555555",
+"55X$#@+O o555555",
+"55o%*-><.oo55555",
+"55X%2%#@+O o5555",
+"55X%4%**><.oo555",
+"55X%4%2&#@+O o55",
+"55X$#%4%**><.X55",
+"555XX%4%2,>>.X55",
+"5555X$#%44<-.X55",
+"55555Xo%4444.X55",
+"555555X$#@+O X55",
+"5555555XoooXX555",
+"5555555555555555",
+"5555555555555555"
+};
diff --git a/mgllab/xpm/object-order-lower.xpm b/mgllab/xpm/object-order-lower.xpm
new file mode 100644 (file)
index 0000000..6aa2a11
--- /dev/null
@@ -0,0 +1,101 @@
+/* XPM */
+static const char *object_order_lower_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 79 1 ",
+"  c #757578",
+". c #747479",
+"X c #7C7C7F",
+"o c #7D7D82",
+"O c #7A869A",
+"+ c #7B869A",
+"@ c #7E8999",
+"# c #7D8BA4",
+"$ c #86868A",
+"% c #8F8F93",
+"& c #838C99",
+"* c #97979C",
+"= c #818CA1",
+"- c #8692A7",
+"; c #8C98AE",
+": c #9F9FA4",
+"> c #919EB5",
+", c #A0A0A6",
+"< c #A6A6AA",
+"1 c #A7A7AC",
+"2 c #AAAAAF",
+"3 c #ACACB2",
+"4 c #B3B3B8",
+"5 c #B4B4BA",
+"6 c #BABABE",
+"7 c #BEBEC2",
+"8 c #80B3FF",
+"9 c #81B3FF",
+"0 c #81B4FF",
+"q c #83B4FF",
+"w c #84B5FF",
+"e c #85B6FF",
+"r c #86B6FF",
+"t c #88B7FF",
+"y c #89B8FF",
+"u c #8AB9FE",
+"i c #8AB8FF",
+"p c #8DBAFE",
+"a c #8DBBFE",
+"s c #92BEFE",
+"d c #96BFFE",
+"f c #9CC3FD",
+"g c #9EC5FD",
+"h c #A5C9FD",
+"j c #A7CBFC",
+"k c #ADCDFA",
+"l c #A9CBFC",
+"z c #AACCFC",
+"x c #ABCDFC",
+"c c #ACCDFC",
+"v c #ACCEFC",
+"b c #ADCEFC",
+"n c #C8C8CC",
+"m c #C8C8CD",
+"M c gray90",
+"N c #E6E6E6",
+"B c #E7E7E7",
+"V c gray91",
+"C c #E9E9E9",
+"Z c #EAEAEA",
+"A c gray92",
+"S c #ECECEC",
+"D c gray93",
+"F c #EEEEEE",
+"G c #EFEFEF",
+"H c gray94",
+"J c #F1F1F1",
+"K c gray95",
+"L c #F3F3F3",
+"P c gray96",
+"I c #F6F6F6",
+"U c gray97",
+"Y c #F9F9F9",
+"T c gray98",
+"R c gray99",
+"E c #FDFDFD",
+"W c #FEFEFE",
+"Q c white",
+"! c None",
+/* pixels */
+"!!!!!!!!!!!!!!!!",
+"!643<:*%$o !!!!!",
+"!6MMVVVVFK !!!!!",
+"!6FVMMFKPP !!!!!",
+"!6YKFVFFKK !!!!!",
+"!6QQPKFVFVX%$o !",
+"!6QQQYPKMM&vgu !",
+"!6QQQQQPKV@t88 !",
+"!6QQQQQQQL+www !",
+"!6QQQQQQQQ+tpz !",
+"!643<1>;-=#dlv !",
+"!!!!!m8qwtfzvv !",
+"!!!!!m88sjxvvv !",
+"!!!!!mpjvvvvvk !",
+"!!!!!m753:*%$o !",
+"!!!!!!!!!!!!!!!!"
+};
diff --git a/mgllab/xpm/object-order-raise.xpm b/mgllab/xpm/object-order-raise.xpm
new file mode 100644 (file)
index 0000000..638d527
--- /dev/null
@@ -0,0 +1,102 @@
+/* XPM */
+static const char *object_order_raise_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 80 1 ",
+"  c #757578",
+". c #747479",
+"X c #7D7D82",
+"o c #86868A",
+"O c #8F8F93",
+"+ c #909095",
+"@ c #97979C",
+"# c #9F9FA4",
+"$ c #A0A0A6",
+"% c #A6A6AA",
+"& c #AAAAAF",
+"* c #ACACB2",
+"= c #B2B2B6",
+"- c #B3B3B8",
+"; c #B4B4BA",
+": c #BABABE",
+"> c #BEBEC2",
+", c #80B3FF",
+"< c #81B3FF",
+"1 c #81B4FF",
+"2 c #83B4FF",
+"3 c #83B5FF",
+"4 c #84B5FF",
+"5 c #85B6FF",
+"6 c #86B6FF",
+"7 c #87B7FF",
+"8 c #88B7FF",
+"9 c #89B8FF",
+"0 c #8AB9FE",
+"q c #8BB9FE",
+"w c #8AB8FF",
+"e c #8BB9FF",
+"r c #8DBAFE",
+"t c #8DBBFE",
+"y c #8FBCFF",
+"u c #92BEFE",
+"i c #96BFFE",
+"p c #95C0FE",
+"a c #99C2FD",
+"s c #9CC3FD",
+"d c #9EC5FD",
+"f c #A5C9FD",
+"g c #A7CBFC",
+"h c #ADCDFA",
+"j c #AECEFB",
+"k c #A9CBFC",
+"l c #AACCFC",
+"z c #ABCDFC",
+"x c #ACCDFC",
+"c c #ACCEFC",
+"v c #ADCEFC",
+"b c #C0C0C4",
+"n c #C2C2C6",
+"m c #C8C8CC",
+"M c #C9C9CC",
+"N c #C8C8CD",
+"B c #D5D5D8",
+"V c #D6D6D9",
+"C c gray90",
+"Z c #E6E6E6",
+"A c #E7E7E7",
+"S c gray91",
+"D c #E9E9E9",
+"F c #EAEAEA",
+"G c gray92",
+"H c #ECECEC",
+"J c gray93",
+"K c #EEEEEE",
+"L c #EFEFEF",
+"P c gray94",
+"I c #F1F1F1",
+"U c gray95",
+"Y c #F3F3F3",
+"T c gray96",
+"R c #F6F6F6",
+"E c #F9F9F9",
+"W c #FDFDFD",
+"Q c #FEFEFE",
+"! c white",
+"~ c None",
+/* pixels */
+"~~~~~~~~~~~~~~~~",
+"~:-*%#@OoX ~~~~~",
+"~:CCASSGLU ~~~~~",
+"~:KSCAJLYR ~~~~~",
+"~:EUKSJLUU ~~~~~",
+"~:!!RBNn:=+OoX ~",
+"~:!!!Bjjjzjjd0 ~",
+"~:!!!Bjjzfa8,, ~",
+"~:!!!Bir668666 ~",
+"~:!!!B,,6008rf ~",
+"~:-*%b,660yikz ~",
+"~~~~~N1160szzj ~",
+"~~~~~N,1ugzzzj ~",
+"~~~~~Nrfjzzjjh ~",
+"~~~~~N>;*$@OoX ~",
+"~~~~~~~~~~~~~~~~"
+};
diff --git a/mgllab/xpm/object-rotate-down.xpm b/mgllab/xpm/object-rotate-down.xpm
new file mode 100644 (file)
index 0000000..49352ea
--- /dev/null
@@ -0,0 +1,105 @@
+/* XPM */
+static const char *object_rotate_down_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 83 1 ",
+"  c #210F57",
+". c #221057",
+"X c #24105E",
+"o c #331A73",
+"O c #3E2770",
+"+ c #3F2878",
+"@ c #432B79",
+"# c #3E2280",
+"$ c #482D81",
+"% c #4A2F84",
+"& c #422588",
+"* c #4E318C",
+"= c #4E318D",
+"- c #573B97",
+"; c #52329E",
+": c #573B98",
+"> c #5A389F",
+", c #5432A2",
+"< c #5835A7",
+"1 c #5B38A4",
+"2 c #5F3CAD",
+"3 c #5E3AB1",
+"4 c #603BB3",
+"5 c #653FB7",
+"6 c #633DB8",
+"7 c #673FBC",
+"8 c #56408A",
+"9 c #584288",
+"0 c #594094",
+"q c #5A4094",
+"w c #5B4297",
+"e c #6E589D",
+"r c #6247A0",
+"t c #755DA7",
+"y c #755EA9",
+"u c #6C4ABA",
+"i c #6E4DBA",
+"p c #755AB0",
+"a c #785BB9",
+"s c #7C65AB",
+"d c #6941C0",
+"f c #6C44C4",
+"g c #6C44C5",
+"h c #734EC1",
+"j c #826DB0",
+"k c #836EB3",
+"l c #846DB4",
+"z c #8970BF",
+"x c #8F79BD",
+"c c #907CB8",
+"v c #917CBD",
+"b c #9382B5",
+"n c #9584BA",
+"m c #9784BC",
+"M c #9685BD",
+"N c #9884BB",
+"B c #9987BF",
+"V c #998AB8",
+"C c #9A88BF",
+"Z c #9986C0",
+"A c #9F8FC2",
+"S c #A190C6",
+"D c #AA9AC9",
+"F c #AD9DCA",
+"G c #AA9BCD",
+"H c #AEA0CD",
+"J c #B7AAD1",
+"K c #B9ACD1",
+"L c #BBAFD3",
+"P c #BCAFD7",
+"I c #BCB1D4",
+"U c #BFB1D6",
+"Y c #BFB4D6",
+"T c #C5BBDA",
+"R c #C6BCDA",
+"E c #C8BFDC",
+"W c #C9C0DC",
+"Q c #CFC7E0",
+"! c #D0C4E2",
+"~ c #D0C8E1",
+"^ c #D2CAE2",
+"/ c #DCD6E8",
+"( c None",
+/* pixels */
+"((((((((((((((((",
+"((((((((((((((((",
+"(((((>125(((((((",
+"(((*wtsjZa6(((((",
+"(($eCmcAJUx3((((",
+"(%9FDl-wmYRp((((",
+"(@bUv&((onEH<(((",
+"(OK!r((.X8WR,4g(",
+"(OK!r(( VTE~/Pg(",
+"(@bUv&((+IEQ~i((",
+"(%9FGk:(+yTQzd((",
+"(($eZN(((,AGu(((",
+"(((*w(((((uh((((",
+"((((((((((((((((",
+"((((((((((((((((",
+"(((((((((((((((("
+};
diff --git a/mgllab/xpm/object-rotate-left.xpm b/mgllab/xpm/object-rotate-left.xpm
new file mode 100644 (file)
index 0000000..1465832
--- /dev/null
@@ -0,0 +1,104 @@
+/* XPM */
+static const char *object_rotate_left_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 82 1 ",
+"  c #220F57",
+". c #211057",
+"X c #24105E",
+"o c #331A73",
+"O c #3E2770",
+"+ c #3F2878",
+"@ c #432B79",
+"# c #3E2280",
+"$ c #482D81",
+"% c #4A2F84",
+"& c #422588",
+"* c #4E318C",
+"= c #4E318D",
+"- c #573B97",
+"; c #52329E",
+": c #573B98",
+"> c #5A389F",
+", c #5432A2",
+"< c #5835A7",
+"1 c #5B38A4",
+"2 c #5F3CAD",
+"3 c #5E3AB1",
+"4 c #603BB3",
+"5 c #653FB7",
+"6 c #633DB8",
+"7 c #673FBC",
+"8 c #56408A",
+"9 c #584288",
+"0 c #594094",
+"q c #5A4094",
+"w c #5B4297",
+"e c #6E589D",
+"r c #6247A0",
+"t c #755DA7",
+"y c #755EA9",
+"u c #6C4ABA",
+"i c #6E4DBA",
+"p c #755AB0",
+"a c #785BB9",
+"s c #7C65AB",
+"d c #6941C0",
+"f c #6C44C4",
+"g c #734EC1",
+"h c #826DB0",
+"j c #836EB3",
+"k c #846DB4",
+"l c #8970BF",
+"z c #8F79BD",
+"x c #907CB8",
+"c c #917CBD",
+"v c #9382B5",
+"b c #9584BA",
+"n c #9784BC",
+"m c #9685BD",
+"M c #9884BB",
+"N c #9987BF",
+"B c #998AB8",
+"V c #9A88BF",
+"C c #9986C0",
+"Z c #9F8FC2",
+"A c #A190C6",
+"S c #AA9AC9",
+"D c #AD9DCA",
+"F c #AA9BCD",
+"G c #AEA0CD",
+"H c #B7AAD1",
+"J c #B9ACD1",
+"K c #BBAFD3",
+"L c #BCAFD7",
+"P c #BCB1D4",
+"I c #BFB1D6",
+"U c #BFB4D6",
+"Y c #C5BBDA",
+"T c #C6BCDA",
+"R c #C8BFDC",
+"E c #C9C0DC",
+"W c #CFC7E0",
+"Q c #D0C4E2",
+"! c #D0C8E1",
+"~ c #D2CAE2",
+"^ c #DCD6E8",
+"/ c None",
+/* pixels */
+"////////////////",
+"///////ff///////",
+"/////diL4///////",
+"////ul!^,<//////",
+"///gFWW!TGp3////",
+"///uATREERTz6///",
+"////;yKY8mUPa///",
+"/////#+BXomHC5//",
+"///////. /wZh2//",
+"/////:////-xs1//",
+"////Mj&//&kmt>//",
+"///wNSxrrcSVw///",
+"///=eDYQQPDe*///",
+"////$9xHKv9$////",
+"/////%@OO@%/////",
+"////////////////"
+};
diff --git a/mgllab/xpm/object-rotate-right.xpm b/mgllab/xpm/object-rotate-right.xpm
new file mode 100644 (file)
index 0000000..0b701d4
--- /dev/null
@@ -0,0 +1,105 @@
+/* XPM */
+static const char *object_rotate_right_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 83 1 ",
+"  c #210F57",
+". c #221057",
+"X c #24105E",
+"o c #331A73",
+"O c #3E2770",
+"+ c #3F2878",
+"@ c #432B79",
+"# c #3E2280",
+"$ c #482D81",
+"% c #4A2F84",
+"& c #422588",
+"* c #4E318C",
+"= c #4E318D",
+"- c #573B97",
+"; c #52329E",
+": c #573B98",
+"> c #5A389F",
+", c #5432A2",
+"< c #5835A7",
+"1 c #5B38A4",
+"2 c #5F3CAD",
+"3 c #5E3AB1",
+"4 c #603BB3",
+"5 c #653FB7",
+"6 c #633DB8",
+"7 c #673FBC",
+"8 c #56408A",
+"9 c #584288",
+"0 c #594094",
+"q c #5A4094",
+"w c #5B4297",
+"e c #6E589D",
+"r c #6247A0",
+"t c #755DA7",
+"y c #755EA9",
+"u c #6C4ABA",
+"i c #6E4DBA",
+"p c #755AB0",
+"a c #785BB9",
+"s c #7C65AB",
+"d c #6941C0",
+"f c #6C44C4",
+"g c #6C44C5",
+"h c #734EC1",
+"j c #826DB0",
+"k c #836EB3",
+"l c #846DB4",
+"z c #8970BF",
+"x c #8F79BD",
+"c c #907CB8",
+"v c #917CBD",
+"b c #9382B5",
+"n c #9584BA",
+"m c #9784BC",
+"M c #9685BD",
+"N c #9884BB",
+"B c #9987BF",
+"V c #998AB8",
+"C c #9A88BF",
+"Z c #9986C0",
+"A c #9F8FC2",
+"S c #A190C6",
+"D c #AA9AC9",
+"F c #AD9DCA",
+"G c #AA9BCD",
+"H c #AEA0CD",
+"J c #B7AAD1",
+"K c #B9ACD1",
+"L c #BBAFD3",
+"P c #BCAFD7",
+"I c #BCB1D4",
+"U c #BFB1D6",
+"Y c #BFB4D6",
+"T c #C5BBDA",
+"R c #C6BCDA",
+"E c #C8BFDC",
+"W c #C9C0DC",
+"Q c #CFC7E0",
+"! c #D0C4E2",
+"~ c #D0C8E1",
+"^ c #D2CAE2",
+"/ c #DCD6E8",
+"( c None",
+/* pixels */
+"((((((((((((((((",
+"(((((((gg(((((((",
+"(((((((4Piu(((((",
+"((((((<,/^z7((((",
+"((((3pHR~QQGh(((",
+"(((6xREWWERSu(((",
+"(((aIYn8TLy,((((",
+"((5ZJMoXV+#(((((",
+"((2jAw(. (((((((",
+"((1sc:((((:(((((",
+"((1tNl&((&kN((((",
+"(((qZDvrrvDZ0(((",
+"(((=eFI!!IFe=(((",
+"(((($9bKKb9$((((",
+"(((((%@O@@%(((((",
+"(((((((((((((((("
+};
diff --git a/mgllab/xpm/object-rotate-up.xpm b/mgllab/xpm/object-rotate-up.xpm
new file mode 100644 (file)
index 0000000..e183cde
--- /dev/null
@@ -0,0 +1,104 @@
+/* XPM */
+static const char *object_rotate_up_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 82 1 ",
+"  c #220F57",
+". c #211057",
+"X c #24105E",
+"o c #331A73",
+"O c #3E2770",
+"+ c #3F2878",
+"@ c #432B79",
+"# c #3E2280",
+"$ c #482D81",
+"% c #4A2F84",
+"& c #422588",
+"* c #4E318C",
+"= c #4E318D",
+"- c #573B97",
+"; c #52329E",
+": c #573B98",
+"> c #5A389F",
+", c #5432A2",
+"< c #5835A7",
+"1 c #5B38A4",
+"2 c #5F3CAD",
+"3 c #5E3AB1",
+"4 c #603BB3",
+"5 c #653FB7",
+"6 c #633DB8",
+"7 c #673FBC",
+"8 c #56408A",
+"9 c #584288",
+"0 c #594094",
+"q c #5A4094",
+"w c #5B4297",
+"e c #6E589D",
+"r c #6247A0",
+"t c #755DA7",
+"y c #755EA9",
+"u c #6C4ABA",
+"i c #6E4DBA",
+"p c #755AB0",
+"a c #785BB9",
+"s c #7C65AB",
+"d c #6941C0",
+"f c #6C44C4",
+"g c #734EC1",
+"h c #826DB0",
+"j c #836EB3",
+"k c #846DB4",
+"l c #8970BF",
+"z c #8F79BD",
+"x c #907CB8",
+"c c #917CBD",
+"v c #9382B5",
+"b c #9584BA",
+"n c #9784BC",
+"m c #9685BD",
+"M c #9884BB",
+"N c #9987BF",
+"B c #998AB8",
+"V c #9A88BF",
+"C c #9986C0",
+"Z c #9F8FC2",
+"A c #A190C6",
+"S c #AA9AC9",
+"D c #AD9DCA",
+"F c #AA9BCD",
+"G c #AEA0CD",
+"H c #B7AAD1",
+"J c #B9ACD1",
+"K c #BBAFD3",
+"L c #BCAFD7",
+"P c #BCB1D4",
+"I c #BFB1D6",
+"U c #BFB4D6",
+"Y c #C5BBDA",
+"T c #C6BCDA",
+"R c #C8BFDC",
+"E c #C9C0DC",
+"W c #CFC7E0",
+"Q c #D0C4E2",
+"! c #D0C8E1",
+"~ c #D2CAE2",
+"^ c #DCD6E8",
+"/ c None",
+/* pixels */
+"////////////////",
+"////////////////",
+"////////////////",
+"///=0/////ug////",
+"//$eNM///;AF7///",
+"/%9DSj:/#sREld//",
+"/@vIc&//+JT~~i//",
+"/OJQr//.BTR~^Lf/",
+"/@JRr//.X8ET,4f/",
+"/@xYc&//obRG<///",
+"/$9DSk-0mUTp////",
+"//$eNNxZHPz3////",
+"///=qtshCa6/////",
+"/////1125///////",
+"////////////////",
+"////////////////"
+};
diff --git a/mgllab/xpm/object-ungroup.xpm b/mgllab/xpm/object-ungroup.xpm
new file mode 100644 (file)
index 0000000..174e137
--- /dev/null
@@ -0,0 +1,46 @@
+/* XPM */
+static const char *object_ungroup_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 24 1 ",
+"  c #78787B",
+". c #1867ED",
+"X c #1867EE",
+"o c #1868ED",
+"O c #1868EE",
+"+ c #86868A",
+"@ c #949499",
+"# c #A1A1A6",
+"$ c #ACACB1",
+"% c #B7B7BC",
+"& c #B8B8BD",
+"* c gray90",
+"= c #E7E7E7",
+"- c gray91",
+"; c #ECECEC",
+": c gray93",
+"> c #EEEEEE",
+", c #EFEFEF",
+"< c #F3F3F3",
+"1 c #F6F6F6",
+"2 c #FBFBFB",
+"3 c #FEFEFE",
+"4 c white",
+"5 c None",
+/* pixels */
+"5555555555555555",
+"55555OOOOO.55555",
+"5555555555O55555",
+"555%$#@+ 5OO.555",
+"555%**,< 555O555",
+"5.5%2&$#@+ 5OO.5",
+"5O5%2&*-,< 555O5",
+"5O5%2&2&$#@+ 5O5",
+"5O5&$&2%**,< 5O5",
+"5O555&2%2,,< 5O5",
+"5OOO5&$%222- 5.5",
+"555O555%2222 555",
+"555.OO5%$#@+ 555",
+"55555O5555555555",
+"55555.OOOO.55555",
+"5555555555555555"
+};
diff --git a/mgllab/xpm/office-chart-bar.xpm b/mgllab/xpm/office-chart-bar.xpm
new file mode 100644 (file)
index 0000000..5eff20a
--- /dev/null
@@ -0,0 +1,84 @@
+/* XPM */
+static const char *office_chart_bar_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 62 1 ",
+"  c gray47",
+". c #7F7C7A",
+"X c gray49",
+"o c #7F7E7C",
+"O c #7F7F7E",
+"+ c #807D7B",
+"@ c #807F7D",
+"# c #81807F",
+"$ c #285C9C",
+"% c #2A5F9E",
+"& c #2B60A2",
+"* c #2E64A4",
+"= c #366AA8",
+"- c #3B6EAC",
+"; c #3F71AF",
+": c #4578B4",
+"> c #477AB6",
+", c #5082BD",
+"< c #5182BD",
+"1 c #5182BE",
+"2 c #5A8BC4",
+"3 c #5B8CC6",
+"4 c #5C8DC6",
+"5 c #6393CB",
+"6 c #6696CE",
+"7 c #6796CF",
+"8 c #6C9BD3",
+"9 c #73A1D7",
+"0 c #74A1D7",
+"q c #75A3DA",
+"w c #7FACE1",
+"e c #808080",
+"r c gray51",
+"t c #838383",
+"y c #80ADE1",
+"u c #84B2E7",
+"i c #8AB5E9",
+"p c #8EBAEF",
+"a c #A3C0E4",
+"s c #A3C1E4",
+"d c #A5C2E5",
+"f c #A5C2E6",
+"g c #ADC7E7",
+"h c #AEC8E7",
+"j c #AFC8E7",
+"k c #BDD2EC",
+"l c #C4D6ED",
+"z c #C4D6EE",
+"x c #D5E2F3",
+"c c #D6E2F3",
+"v c #DBE7F4",
+"b c #E0EAF6",
+"n c #E6EDF8",
+"m c #E7EFF8",
+"M c #E9F0F9",
+"N c #F2F5FB",
+"B c #F1F6FB",
+"V c #F4F7FC",
+"C c #F7F9FD",
+"Z c #FDFDFE",
+"A c #FEFEFE",
+"S c None",
+/* pixels */
+"SSSSSSSSSSSSSSSS",
+"SXSSSSSSSSSSSSSS",
+"SXSSSSSSSSSSSSSS",
+"SeSSSSSSpiipSSSS",
+"SeSSSSSSyZZySSSS",
+"StSSSSSSqVNqSSSS",
+" eSuyyuS8Mn8SSSS",
+"SeSqCBqS5vc5SSSS",
+"SeS7mb7S2zk2SSSS",
+" eS2cz4S1jg1SSSS",
+"StS1hg1S>aa>SSSS",
+"SeS:ss>S:aa-SSSS",
+" tS;ff;S=ff=SSSS",
+"SeS*%$*S&$$&SSSS",
+"St#X++@X@@.@@XXS",
+"SSSS SS SS SSSSS"
+};
diff --git a/mgllab/xpm/office-chart-line.xpm b/mgllab/xpm/office-chart-line.xpm
new file mode 100644 (file)
index 0000000..dfff099
--- /dev/null
@@ -0,0 +1,71 @@
+/* XPM */
+static const char *office_chart_line_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 49 1 ",
+"  c gray47",
+". c #7B7B7B",
+"X c #7D7B78",
+"o c #7C7B79",
+"O c #7A7C7A",
+"+ c #7A7C7B",
+"@ c #7B7D7B",
+"# c #7D7C7A",
+"$ c #7C7C7B",
+"% c #7B7D7C",
+"& c #7C7D7D",
+"* c gray49",
+"= c #7E7D7C",
+"- c #7C7E7C",
+"; c #7F7E7D",
+": c #7E7E7E",
+"> c gray50",
+", c #B4274F",
+"< c #B4294B",
+"1 c #B52A4C",
+"2 c #B42750",
+"3 c #B42354",
+"4 c #B52851",
+"5 c #B7215E",
+"6 c #A7267C",
+"7 c #0969F3",
+"8 c #0B6AF3",
+"9 c #1872F2",
+"0 c #3475E9",
+"q c #2079F5",
+"w c #237CF7",
+"e c #427DE6",
+"r c #B81782",
+"t c #B8148B",
+"y c #B70E9A",
+"u c #B71190",
+"i c #B90DA0",
+"p c #B90CA1",
+"a c #B80CA2",
+"s c #83469C",
+"d c #3F8DF8",
+"f c #448EF7",
+"g c #4F95F8",
+"h c #5398F8",
+"j c #60A0F9",
+"k c #6BA7FA",
+"l c #6EA9FA",
+"z c #78AFFB",
+"x c None",
+/* pixels */
+"xxxxxxxxxxxxxxxx",
+"x.xxxxxxxxxxxxxx",
+"x.xxxxxxxxxxlzxx",
+"x*xxxxxxxxxjkxxx",
+"x*xxxxxxxxhxxxxx",
+"x*xxxxxxxxgxxxxx",
+".*xxxxxxxfxxxxxx",
+"x*xxx143edxxxxxx",
+"x*xx<2x5sxxxxxxx",
+".Ox14xx06xxxxxxx",
+"x%xxxxxwxrxxxixx",
+"x.xxxx9qxtuxixxx",
+".ox778xxxxyaxxxx",
+"x.xxxxxxxxxxxxxx",
+"x;$Xo$*O**.O%..x",
+"xxxx.xx.xx.xxxxx"
+};
diff --git a/mgllab/xpm/office-chart-scatter.xpm b/mgllab/xpm/office-chart-scatter.xpm
new file mode 100644 (file)
index 0000000..7ee8b2e
--- /dev/null
@@ -0,0 +1,44 @@
+/* XPM */
+static const char *office_chart_scatter_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 22 1 ",
+"  c gray47",
+". c gray49",
+"X c #B72659",
+"o c #B81F6C",
+"O c #81807E",
+"+ c #056DFF",
+"@ c #0A6EFC",
+"# c #0673FF",
+"$ c #0A72FF",
+"% c #1273FC",
+"& c #1776FD",
+"* c #1579FF",
+"= c #1F7BFD",
+"- c #247EFD",
+"; c #BB1393",
+": c #BC0BA6",
+"> c #2381FF",
+", c #2D88FF",
+"< c #808080",
+"1 c gray51",
+"2 c #838383",
+"3 c None",
+/* pixels */
+"3333333333333333",
+"3.33333333333333",
+"3.33333333333333",
+"3<33X3X33333,333",
+"3<3333333333>333",
+"3233o3o333*&3->3",
+" <3333333333%333",
+"3<3333333333#333",
+"3233333333333333",
+" <333$33333;3;33",
+"32333@3333333333",
+"3<3$@3@$333:3:33",
+" 2333$3333333333",
+"3<333+3333333333",
+"322<OO<<<2<<<..3",
+"3333 33 33 33333"
+};
diff --git a/mgllab/xpm/ok.xpm b/mgllab/xpm/ok.xpm
new file mode 100644 (file)
index 0000000..0a1c7dc
--- /dev/null
@@ -0,0 +1,22 @@
+/* XPM */
+static const char * ok_xpm[] = {
+"16 16 3 1",
+"      c None",
+"!     c #000090",
+"#     c #0000FF",
+"                ",
+"              # ",
+"             ## ",
+"            ##! ",
+"           ##!  ",
+"          ##!   ",
+"         ##!    ",
+"         ##!    ",
+"        ##!     ",
+"  ###  ###!     ",
+"   ### ##!      ",
+"    #####!      ",
+"     ###!       ",
+"      ##!       ",
+"       #!       ",
+"        !       "};\r
diff --git a/mgllab/xpm/oper.xpm b/mgllab/xpm/oper.xpm
new file mode 100644 (file)
index 0000000..ca6a51d
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * oper_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"   .            ",
+"   .            ",
+" .....    ..... ",
+"   .            ",
+"   .            ",
+"                ",
+"                ",
+"                ",
+"    .       .   ",
+"   .      . . . ",
+"   .       ...  ",
+"  .        ...  ",
+"  .       . . . ",
+" .          .   ",
+"                "};
diff --git a/mgllab/xpm/oper_a.xpm b/mgllab/xpm/oper_a.xpm
new file mode 100644 (file)
index 0000000..afa1a80
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * oper_a_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"                ",
+"                ",
+"                ",
+"    .           ",
+"    .           ",
+"    .    ...... ",
+" .......        ",
+"    .    ...... ",
+"    .           ",
+"    .           ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/oper_d.xpm b/mgllab/xpm/oper_d.xpm
new file mode 100644 (file)
index 0000000..2b89d5e
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * oper_d_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"                ",
+"                ",
+"       .        ",
+"      .         ",
+"      .         ",
+"     .   ...... ",
+"     .          ",
+"    .    ...... ",
+"    .           ",
+"   .            ",
+"   .            ",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/oper_dir.xpm b/mgllab/xpm/oper_dir.xpm
new file mode 100644 (file)
index 0000000..f6f7b8a
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * oper_dir_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"   .            ",
+"  .   .         ",
+"  .   .         ",
+"  . .... .      ",
+"  . . . .       ",
+"  . .... .      ",
+" .              ",
+"          ..... ",
+"          .   . ",
+"  ..       .    ",
+" .  .       .   ",
+"    .      .    ",
+" ....     .   . ",
+".   .. .  ..... ",
+".  .  .         ",
+" ..  . .        "};
diff --git a/mgllab/xpm/oper_m.xpm b/mgllab/xpm/oper_m.xpm
new file mode 100644 (file)
index 0000000..f2f8db1
--- /dev/null
@@ -0,0 +1,22 @@
+/* XPM */
+static const char * oper_m_xpm[] = {
+"16 16 3 1",
+"      c None",
+".     c #000000",
+"+     c #7F7F7F",
+"                ",
+"                ",
+"                ",
+"                ",
+"   .   .        ",
+"   +. .+        ",
+"    +.+  ...... ",
+"  ......        ",
+"    +.+  ...... ",
+"   +. .+        ",
+"   .   .        ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/oper_of.xpm b/mgllab/xpm/oper_of.xpm
new file mode 100644 (file)
index 0000000..c22a9ba
--- /dev/null
@@ -0,0 +1,22 @@
+/* XPM */
+static const char * oper_of_xpm[] = {
+"16 16 3 1",
+"      c None",
+".     c #000000",
+"+     c #FF0000",
+"   .        ++  ",
+"  .   .     ++  ",
+"  .   .   ++++++",
+"  . .... .++++++",
+"  . . . .   ++  ",
+"  . .... .  ++  ",
+" .              ",
+"          ..... ",
+"          .   . ",
+"  ..       .    ",
+" .  .       .   ",
+"    .      .    ",
+" ....     .   . ",
+".   .. .  ..... ",
+".  .  .         ",
+" ..  . .        "};
diff --git a/mgllab/xpm/oper_s.xpm b/mgllab/xpm/oper_s.xpm
new file mode 100644 (file)
index 0000000..6bda134
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * oper_s_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"         ...... ",
+" .......        ",
+"         ...... ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/option.xpm b/mgllab/xpm/option.xpm
new file mode 100644 (file)
index 0000000..d7dd6d6
--- /dev/null
@@ -0,0 +1,22 @@
+/* XPM */
+static const char * option_xpm[] = {
+"16 16 3 1",
+"      c None",
+".     c #000000",
+"+     c #7F0000",
+"                ",
+"                ",
+"                ",
+"   ..           ",
+"  .++.          ",
+"  .++.          ",
+"   ..           ",
+"                ",
+"                ",
+"   ..           ",
+"  .++.          ",
+"  .++.          ",
+"   .+. ++ ++ ++ ",
+"    .  ++ ++ ++ ",
+"   .            ",
+"                "};
diff --git a/mgllab/xpm/other.xpm b/mgllab/xpm/other.xpm
new file mode 100644 (file)
index 0000000..e2d7562
--- /dev/null
@@ -0,0 +1,117 @@
+/* XPM */
+static const char * other_xpm[] = {
+"16 16 98 2",
+"      c None",
+".     c #FFFFFF",
+"+     c #00CAFF",
+"@     c #00ADFF",
+"#     c #0000EB",
+"$     c #00007F",
+"%     c #0000B4",
+"&     c #0000B9",
+"*     c #00D1FF",
+"=     c #73FF8B",
+"-     c #68FF96",
+";     c #00BFFF",
+">     c #0000C3",
+",     c #0000C7",
+"'     c #01DDFD",
+")     c #0041FF",
+"!     c #0DFBF1",
+"~     c #3EFFC0",
+"{     c #00EEFF",
+"]     c #0024FF",
+"^     c #000082",
+"/     c #000083",
+"(     c #2EFFD0",
+"_     c #00E9FF",
+":     c #0001EA",
+"<     c #0074FF",
+"[     c #009CFF",
+"}     c #0058FF",
+"|     c #0000D5",
+"1     c #009FFF",
+"2     c #63FF9B",
+"3     c #0000C1",
+"4     c #00009D",
+"5     c #0000F7",
+"6     c #0042FF",
+"7     c #0030FF",
+"8     c #0000DC",
+"9     c #000080",
+"0     c #0017FE",
+"a     c #00E0FF",
+"b     c #0000F6",
+"c     c #0075FF",
+"d     c #0094FF",
+"e     c #0044FF",
+"f     c #0000BE",
+"g     c #000086",
+"h     c #000BFE",
+"i     c #004FFF",
+"j     c #0000AC",
+"k     c #006EFF",
+"l     c #10FEEE",
+"m     c #35FFC9",
+"n     c #0000C9",
+"o     c #0083FF",
+"p     c #0031FF",
+"q     c #000090",
+"r     c #0007F9",
+"s     c #0BF9F3",
+"t     c #7EFF80",
+"u     c #58FFA6",
+"v     c #007DFF",
+"w     c #000085",
+"x     c #1FFFDF",
+"y     c #000081",
+"z     c #0039FF",
+"A     c #00DBFF",
+"B     c #01BDFD",
+"C     c #0AFEF4",
+"D     c #0000AA",
+"E     c #00009A",
+"F     c #001BFC",
+"G     c #00C9FE",
+"H     c #4BFFB3",
+"I     c #0006F7",
+"J     c #008FFF",
+"K     c #6FFF8F",
+"L     c #F5FF09",
+"M     c #FFDB00",
+"N     c #F1FB0D",
+"O     c #0021FF",
+"P     c #0000EA",
+"Q     c #13FCEB",
+"R     c #F0FF0E",
+"S     c #FF8700",
+"T     c #FF5B00",
+"U     c #EDFC11",
+"V     c #12FDEC",
+"W     c #0003E9",
+"X     c #00B7FF",
+"Y     c #98FF66",
+"Z     c #FFDF00",
+"`     c #FFB300",
+" .    c #00B8FF",
+"..    c #0067FF",
+"+.    c #04E9FA",
+"@.    c #1DFCE1",
+"#.    c #00EDFF",
+"$.    c #000088",
+"            + @ # $ $ %         ",
+"      & * = - ; > $ $ , '       ",
+"  $ $ ) ! ~ { ] ^ $ $ / ( _     ",
+"  $ $ : < [ } | $ $ $ $ 1 2 3   ",
+"  $ $ 4 5 6 7 8 9 $ $ $ 0 a 7 $ ",
+"  $ $ / b c d e f $ $ g h i 8 $ ",
+"  $ $ j k l m * # $ $ n o p q $ ",
+"  $ $ r s t u v w $ $ j x 1 y $ ",
+"  $ $ z A B $ $ $ $ $ $ C ~ D $ ",
+"  $ $ $ $ E F [ G [ 0 E $ H I $ ",
+"  $ $ $ D J K L M N K J D $ O $ ",
+"    $ $ P Q R S T S U V W $ $ $ ",
+"      $ f X Y Z ` Z Y  .f $ $ $ ",
+"        $ > ..+.@.#...> $ $     ",
+"          $ $ y $.^ $           ",
+"            $ $ $               "};
diff --git a/mgllab/xpm/package-x-generic.xpm b/mgllab/xpm/package-x-generic.xpm
new file mode 100644 (file)
index 0000000..126a075
--- /dev/null
@@ -0,0 +1,107 @@
+/* XPM */
+static const char *package_x_generic_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 85 1 ",
+"  c #855201",
+". c #8F5902",
+"X c #8F5D0C",
+"o c #945E07",
+"O c #935E08",
+"+ c #93600E",
+"@ c #93600F",
+"# c #95610E",
+"$ c #99630D",
+"% c #9A650E",
+"& c #9B650F",
+"* c #946212",
+"= c #9B6A1B",
+"- c #A06A14",
+"; c #A26D19",
+": c #A87B33",
+"> c #A87C35",
+", c #A87D37",
+"< c #C78C33",
+"1 c #AC8443",
+"2 c #AD8544",
+"3 c #B79255",
+"4 c #BA9861",
+"5 c #D29A46",
+"6 c #DDA858",
+"7 c #C2A26D",
+"8 c #C4A36D",
+"9 c #C3A370",
+"0 c #C4A570",
+"q c #C4A673",
+"w c #C9AB7B",
+"e c #CBAE7F",
+"r c #CDAE7C",
+"t c #D5AE74",
+"y c #D7B074",
+"u c #DAB47B",
+"i c #D8B57E",
+"p c #DDB77E",
+"a c #E7B66A",
+"s c #DFBB83",
+"d c #E3BE87",
+"f c #EDC485",
+"g c #EDC587",
+"h c #E3C08A",
+"j c #EEC78A",
+"k c #EEC98E",
+"l c #E8C792",
+"z c #EFCA90",
+"x c #EFCC94",
+"c c #E0C599",
+"v c #E5CB9F",
+"b c #ECCD9D",
+"n c #ECCD9E",
+"m c #F0CD97",
+"M c #F0CE99",
+"N c #E2CAA6",
+"B c #E2CCA8",
+"V c #E2CEAD",
+"C c #EFD1A1",
+"Z c #EFD3A7",
+"A c #EED3A8",
+"S c #EFD3A8",
+"D c #EFD5AB",
+"F c #EED5AC",
+"G c #EFD6AE",
+"H c #EFD7AE",
+"J c #F0D1A2",
+"K c #F0D4A8",
+"L c #F0D5AB",
+"P c #F0D5AD",
+"I c #F0D7AE",
+"U c #F0D7AF",
+"Y c #E3D0B1",
+"T c #E3D0B2",
+"R c #E5D2B2",
+"E c #E7D3B2",
+"W c #EBDBC0",
+"Q c #EDDDC3",
+"! c #EFE0C7",
+"~ c #F3E7D0",
+"^ c #F1E5D2",
+"/ c #F2E7D3",
+"( c #F6F0E5",
+") c #F9F3EA",
+"_ c None",
+/* pixels */
+"________________",
+"__.........o..__",
+"..(BYYYRREcVN4._",
+".^!O$%o%%-;:)r3*",
+".^W###==,,,7^r8*",
+"oWqPKKKJKAACKqw+",
+".1FJMMmmkjjffA1+",
+".7UUUUPIIFHUFFi.",
+"_.......o......_",
+"_.y<<<<<<<<<<t._",
+"_.p5555555555u._",
+"_.d6666666666s._",
+"_.laaaaaaaaaah._",
+"_.Fnnnnnnnnnnv._",
+"_X............ _",
+"________________"
+};
diff --git a/mgllab/xpm/pause.xpm b/mgllab/xpm/pause.xpm
new file mode 100644 (file)
index 0000000..e09d88b
--- /dev/null
@@ -0,0 +1,22 @@
+/* XPM */
+static const char * pause_xpm[] = {
+"16 16 3 1",
+"      c None",
+".     c #777777",
+"q     c #000000",
+"                ",
+"                ",
+"                ",
+"   qqq    qqq   ",
+"   q.q    q.q   ",
+"   q.q    q.q   ",
+"   q.q    q.q   ",
+"   q.q    q.q   ",
+"   q.q    q.q   ",
+"   q.q    q.q   ",
+"   q.q    q.q   ",
+"   q.q    q.q   ",
+"   qqq    qqq   ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/plot.xpm b/mgllab/xpm/plot.xpm
new file mode 100644 (file)
index 0000000..acc1eea
--- /dev/null
@@ -0,0 +1,23 @@
+/* XPM */
+static const char * plot_xpm[] = {
+"16 16 4 1",
+"      c None",
+".     c #000000",
+"+     c #0000FF",
+"@     c #FF0000",
+"                ",
+" .              ",
+"..            + ",
+" .          ++  ",
+" .         +    ",
+"..        +     ",
+" .       +      ",
+" .       +      ",
+"..   @@@+       ",
+" .  @  +@     @ ",
+" .@@   + @   @  ",
+"..    +   @@@   ",
+" .  ++          ",
+" .++            ",
+"............... ",
+" .   .   .   .  "};
diff --git a/mgllab/xpm/polygon.xpm b/mgllab/xpm/polygon.xpm
new file mode 100644 (file)
index 0000000..ecbdb8f
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char *polygon_xpm[]={
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"       ..       ",
+"      .  .      ",
+"    ..    ..    ",
+"   .        .   ",
+" ..          .. ",
+".              .",
+".              .",
+" .            . ",
+" .            . ",
+" .            . ",
+"  .          .  ",
+"  .          .  ",
+"  .          .  ",
+"   .        .   ",
+"   ..........   "};
diff --git a/mgllab/xpm/preferences-system.xpm b/mgllab/xpm/preferences-system.xpm
new file mode 100644 (file)
index 0000000..0e5374b
--- /dev/null
@@ -0,0 +1,115 @@
+/* XPM */
+static const char *preferences_system_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 93 2 ",
+"   c #393A37",
+".  c #393938",
+"X  c #3E3E3D",
+"o  c #6F4B00",
+"O  c #444542",
+"+  c #444444",
+"@  c #444544",
+"#  c #454747",
+"$  c #505051",
+"%  c gray32",
+"&  c #555655",
+"*  c #57575A",
+"=  c #585858",
+"-  c gray37",
+";  c #626364",
+":  c #656565",
+">  c #686A69",
+",  c #6A6B6A",
+"<  c #6B6B6A",
+"1  c gray42",
+"2  c gray46",
+"3  c #797979",
+"4  c #AF6F00",
+"5  c #AC6F08",
+"6  c #AE7103",
+"7  c #B27300",
+"8  c #A58732",
+"9  c #CA8400",
+"0  c #C68F05",
+"q  c #C39006",
+"w  c #CB9B00",
+"e  c #D4A602",
+"r  c #D5AC02",
+"t  c #DEA801",
+"y  c #EAB002",
+"u  c #E7B70A",
+"i  c #EABF15",
+"p  c #F3CC0B",
+"a  c #FDD708",
+"s  c #F4CF19",
+"d  c #F4D510",
+"f  c #FAE000",
+"g  c #F2CE24",
+"h  c #FAE224",
+"j  c #D1BB76",
+"k  c #818181",
+"l  c gray51",
+"z  c #848484",
+"x  c gray52",
+"c  c #858685",
+"v  c #898989",
+"b  c #898A89",
+"n  c gray55",
+"m  c #8E8F8E",
+"M  c #90908F",
+"N  c #919190",
+"B  c #939392",
+"V  c #989998",
+"C  c #999998",
+"Z  c #9B9B9B",
+"A  c #9C9E9F",
+"S  c #A2A3A2",
+"D  c #A2A4A3",
+"F  c #A5A5A4",
+"G  c #A7A7A6",
+"H  c gray66",
+"J  c #ACACAC",
+"K  c #AEAEAE",
+"L  c #B1B2B2",
+"P  c gray70",
+"I  c #B6B6B5",
+"U  c #B7B7B7",
+"Y  c #BBBBBA",
+"T  c #BBBBBB",
+"R  c #BCBCBB",
+"E  c #BBBCBD",
+"W  c #C2C3C1",
+"Q  c gray77",
+"!  c #C6C7C8",
+"~  c #C8C9C8",
+"^  c #CACBCB",
+"/  c #CECFCF",
+"(  c #D3D3D2",
+")  c #D4D5D6",
+"_  c gray84",
+"`  c #D9DAD9",
+"'  c #DBDCDC",
+"]  c #DFDFDF",
+"[  c #E1E1E1",
+"{  c #ECECEB",
+"}  c #ECEDEC",
+"|  c #EFEFEF",
+" . c None",
+/* pixels */
+" . . . . . . . . . . . .U  . . .",
+"T | L  . . . . . . .N ` ) I  . .",
+" .E ^  . . . . . . .T { K  . . .",
+" . .* [  . . . . . .Q { ^  . . .",
+" . . .# ]  . . . .z D A ( F N  .",
+" . . . .$ '  . . .T < M W V &  .",
+" . . . . .; )  .K b z 2 < #  . .",
+" . . . . . .z / k b  . . . . . .",
+" . . . . . .G < Q j 5  . . . . .",
+" . . . . .S O 3 8 a y  . . . . .",
+" . . . .C X < = o q f d 6  . . .",
+" . . .m . = :  . . .q h g 7  . .",
+" . .H . # 2  . . . . .e i s 7  .",
+" .Z : 2 k  . . . . . . .r u p 9 ",
+" .I K n  . . . . . . . . .w t  .",
+" .$ -  . . . . . . . . . . . . ."
+};
diff --git a/mgllab/xpm/prev_sl.xpm b/mgllab/xpm/prev_sl.xpm
new file mode 100644 (file)
index 0000000..3f20e59
--- /dev/null
@@ -0,0 +1,24 @@
+/* XPM */
+static const char * prev_sl_xpm[] = {
+"16 16 5 1",
+"      c None",
+".     c #00007F",
+"+     c #007FFF",
+"@     c #0000FF",
+"#     c #003F80",
+"                ",
+"        ..      ",
+"       .+.      ",
+"      .++.      ",
+"     .+@++.     ",
+"    .+@+@++.... ",
+"   .+@+@+@+@+@. ",
+"  .+@+@@@@@@@@. ",
+" .@@@@@@@@@@@@. ",
+"  .#@#@@@@@@@@. ",
+"   .#@#@#@#@#@. ",
+"    .#@#@#@.... ",
+"     .#@#@.     ",
+"      .##.      ",
+"       .#.      ",
+"        ..      "};
diff --git a/mgllab/xpm/preview.xpm b/mgllab/xpm/preview.xpm
new file mode 100644 (file)
index 0000000..0446109
--- /dev/null
@@ -0,0 +1,193 @@
+/* XPM */
+static const char *preview_xpm[] = {
+"16 16 174 2",
+"      c None",
+".     c #EA6E0E",
+"+     c #F67F06",
+"@     c #E3BB18",
+"#     c #A4E757",
+"$     c #56E6A3",
+"%     c #25DAD6",
+"&     c #11E5EB",
+"*     c #2AF5D0",
+"=     c #72F588",
+"-     c #B0EC4B",
+";     c #C7DC34",
+">     c #C3E336",
+",     c #98F563",
+"'     c #3FF6BC",
+")     c #07D5F5",
+"!     c #0E9EEA",
+"~     c #F44C0A",
+"{     c #FC0E00",
+"]     c #FB1900",
+"^     c #FF5B00",
+"/     c #F7C407",
+"(     c #B5FD49",
+"_     c #4BFFB3",
+":     c #0BF6F3",
+"<     c #05D9F9",
+"[     c #0CD2F2",
+"}     c #14DEEB",
+"|     c #1BF0E3",
+"1     c #20FEDE",
+"2     c #27FFD7",
+"3     c #2BFDD3",
+"4     c #3BEEC3",
+"5     c #F14F0A",
+"6     c #FC1400",
+"7     c #FB1700",
+"8     c #FF5000",
+"9     c #FBBA03",
+"0     c #B8FD46",
+"a     c #39FCC5",
+"b     c #01CAFE",
+"c     c #0088FF",
+"d     c #0075FF",
+"e     c #008FFF",
+"f     c #01CCFE",
+"g     c #22FCDC",
+"h     c #73FF8B",
+"i     c #BAFC44",
+"j     c #D3E228",
+"k     c #F47B0A",
+"l     c #FF8C00",
+"m     c #F4BA0A",
+"n     c #CBE733",
+"o     c #7DFC81",
+"p     c #2BEDD3",
+"q     c #03C1FB",
+"r     c #0090FF",
+"s     c #0082FF",
+"t     c #009DFF",
+"u     c #08D4F7",
+"v     c #3AFAC4",
+"w     c #98FF66",
+"x     c #E7EF18",
+"y     c #FEBC01",
+"z     c #F4920A",
+"A     c #F4AD0B",
+"B     c #D4F62A",
+"C     c #63FD9B",
+"D     c #16D9E9",
+"E     c #0296FD",
+"F     c #0063FF",
+"G     c #0059FF",
+"H     c #0076FF",
+"I     c #00B6FF",
+"J     c #1AF2E4",
+"K     c #6EFF90",
+"L     c #C8FD36",
+"M     c #F9E306",
+"N     c #FFB900",
+"O     c #FFA800",
+"P     c #F4AF0B",
+"Q     c #EFBD0D",
+"R     c #A0FF5E",
+"S     c #1BF3E3",
+"T     c #009CFF",
+"U     c #0056FF",
+"V     c #0041FF",
+"W     c #005DFF",
+"X     c #00A0FF",
+"Y     c #0EEEF0",
+"Z     c #5FFF9F",
+"`     c #B7FF47",
+" .    c #F1FA0D",
+"..    c #F9E606",
+"+.    c #F0E70E",
+"@.    c #D4F42A",
+"#.    c #9CF05F",
+"$.    c #F4AA0A",
+"%.    c #DFF01F",
+"&.    c #8DFD71",
+"*.    c #4CF4B2",
+"=.    c #2DDFD1",
+"-.    c #21D5DE",
+";.    c #1CDFE2",
+">.    c #20F4DE",
+",.    c #3BFFC3",
+"'.    c #79FF85",
+").    c #80FF7E",
+"!.    c #72FE8C",
+"~.    c #51FAAD",
+"{.    c #28EFD6",
+"].    c #14CDEA",
+"^.    c #F4760A",
+"/.    c #FF6B00",
+"(.    c #FD6D00",
+"_.    c #F87A05",
+":.    c #F1910C",
+"<.    c #E9B615",
+"[.    c #D8DF26",
+"}.    c #B2FC4C",
+"|.    c #70FF8E",
+"1.    c #2DFED1",
+"2.    c #0BE3F3",
+"3.    c #04B9FB",
+"4.    c #0099FE",
+"5.    c #0085FF",
+"6.    c #007EFF",
+"7.    c #0A84F4",
+"8.    c #F1480A",
+"9.    c #EA0500",
+"0.    c #C50000",
+"a.    c #B30000",
+"b.    c #BB0100",
+"c.    c #DA0600",
+"d.    c #FA3500",
+"e.    c #FCB403",
+"f.    c #ACFD52",
+"g.    c #24F8DA",
+"h.    c #00A5FF",
+"i.    c #0036FF",
+"j.    c #0046FF",
+"k.    c #007FFF",
+"l.    c #11C0EA",
+"m.    c #F4440A",
+"n.    c #E10100",
+"o.    c #B20000",
+"p.    c #990000",
+"q.    c #9B0000",
+"r.    c #B90000",
+"s.    c #EB0500",
+"t.    c #FF6700",
+"u.    c #E9E716",
+"v.    c #75FF89",
+"w.    c #1EE7E0",
+"x.    c #09B9F6",
+"y.    c #06ACF8",
+"z.    c #11C6ED",
+"A.    c #38F0C6",
+"B.    c #8FF26F",
+"C.    c #E9630E",
+"D.    c #F43606",
+"E.    c #E92406",
+"F.    c #E02006",
+"G.    c #DE2006",
+"H.    c #F43706",
+"I.    c #F56806",
+"J.    c #F5A106",
+"K.    c #EBCC11",
+"L.    c #CED92D",
+"M.    c #B9DB41",
+"N.    c #B9DD43",
+"O.    c #C8D933",
+"P.    c #E3CE18",
+"Q.    c #E8AB10",
+"                                ",
+"                                ",
+"                                ",
+". + @ # $ % & * = - ; > , ' ) ! ",
+"~ { ] ^ / ( _ : < [ } | 1 2 3 4 ",
+"5 6 7 8 9 0 a b c d e f g h i j ",
+"k l m n o p q r s t u v w x y z ",
+"A B C D E F G H I J K L M N O P ",
+"Q R S T U V W X Y Z `  ...+.@.#.",
+"$.%.&.*.=.-.;.>.,.Z '.).!.~.{.].",
+"^./.(._.:.<.[.}.|.1.2.3.4.5.6.7.",
+"8.9.0.a.b.c.d.e.f.g.h.U i.j.k.l.",
+"m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.",
+"C.D.E.F.G.E.H.I.J.K.L.M.N.O.P.Q.",
+"                                ",
+"                                "};
diff --git a/mgllab/xpm/process-stop.xpm b/mgllab/xpm/process-stop.xpm
new file mode 100644 (file)
index 0000000..d4faa1d
--- /dev/null
@@ -0,0 +1,144 @@
+/* XPM */
+static const char *process_stop_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 122 2 ",
+"   c #890600",
+".  c #8C0600",
+"X  c #950000",
+"o  c #910500",
+"O  c #9A1717",
+"+  c #9E1414",
+"@  c #A30000",
+"#  c #A40000",
+"$  c #AA0000",
+"%  c #AE0000",
+"&  c #B40000",
+"*  c #B00400",
+"=  c #BD0404",
+"-  c #B51300",
+";  c #BE1000",
+":  c #BF1200",
+">  c #BB1400",
+",  c #BF1400",
+"<  c #BF1A0D",
+"1  c #BC1814",
+"2  c #BD1817",
+"3  c #BE1818",
+"4  c #A22929",
+"5  c #A42F2F",
+"6  c #CD0000",
+"7  c #C70E00",
+"8  c #D80500",
+"9  c #D90500",
+"0  c #DA0500",
+"q  c #DC0600",
+"w  c #DD0600",
+"e  c #DF0700",
+"r  c #C01200",
+"t  c #C11601",
+"y  c #C91100",
+"u  c #CB100B",
+"i  c #DC120D",
+"p  c #C11B1A",
+"a  c #C11C1B",
+"s  c #C91E1E",
+"d  c #D01813",
+"f  c #D31C17",
+"g  c #D81913",
+"h  c #DC1912",
+"j  c #D91B15",
+"k  c #DB1A15",
+"l  c #DA1B15",
+"z  c #DC1B15",
+"x  c #DC1C17",
+"c  c #D81E1A",
+"v  c #E00700",
+"b  c #E10700",
+"n  c #D42020",
+"m  c #D32424",
+"M  c #E02925",
+"N  c #E0423E",
+"B  c #DA4848",
+"V  c #DE4F4D",
+"C  c #D1554E",
+"Z  c #D35D58",
+"A  c #D15F5A",
+"S  c #DF5F5F",
+"D  c #E34743",
+"F  c #E55D5B",
+"G  c #EA5E5C",
+"H  c #D76059",
+"J  c #DA605E",
+"K  c #E3615F",
+"L  c #DC6D6C",
+"P  c #DE7E7D",
+"I  c #E96764",
+"U  c #E26E6C",
+"Y  c #E16F6E",
+"T  c #E77574",
+"R  c #E67776",
+"E  c #EB7270",
+"W  c #E97472",
+"Q  c #E97876",
+"!  c #E67A79",
+"~  c #E27D7C",
+"^  c #E27E7D",
+"/  c #E57E7D",
+"(  c #EB7A78",
+")  c #ED7A78",
+"_  c #E1807F",
+"`  c #DD9090",
+"'  c #DF9391",
+"]  c #DE9490",
+"[  c #DD9592",
+"{  c #E68483",
+"}  c #E38584",
+"|  c #E38685",
+" . c #E58887",
+".. c #E58C8B",
+"X. c #E78C8B",
+"o. c #E68F8E",
+"O. c #E88988",
+"+. c #E09A9A",
+"@. c #E09D9B",
+"#. c #E2A4A3",
+"$. c #E3A7A7",
+"%. c #E9B5B4",
+"&. c #E9B6B5",
+"*. c #EAB7B7",
+"=. c #EAB9B9",
+"-. c #F7D0CF",
+";. c #F7D3D2",
+":. c #F8D3D2",
+">. c #F9D6D5",
+",. c #F9DDDC",
+"<. c #F9DEDD",
+"1. c #FADFDE",
+"2. c #FAE1E0",
+"3. c #FAE2E1",
+"4. c #FAE2E2",
+"5. c #FBE2E2",
+"6. c #FBE3E2",
+"7. c #FBE6E5",
+"8. c #FBE6E6",
+"9. c #FBE8E8",
+"0. c white",
+"q. c None",
+/* pixels */
+"q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.",
+"q.q.q.q.q.6 m B J B n q.q.q.q.q.",
+"q.q.q.q.s #.&.*.=.%.$.s q.q.q.q.",
+"q.q.q.a +.o.X. .{ { P ` p q.q.q.",
+"q.q.2 @.| X. .! T / ~ L ' 3 q.q.",
+"q.= [ ^ { 9.7.Q W 5.7.Y J [ = q.",
+"q.& A Y T 5.0.5.5.0.1.F V Z & q.",
+"q.% C K G I 5.0.0.5.E ) ) H % q.",
+"q.$ p f M D 1.0.0.,.N i q 7 # q.",
+"q.# ; 8 j :.0.:.;.0.;.j q y # q.",
+"q.# - 8 k :.:.j g -.>.j q > @ q.",
+"q.q.o : e k j e e h x q : o q.q.",
+"q.q.q.. t e q e w w e , . q.q.q.",
+"q.q.q.q.  * u d f d 1 . q.q.q.q.",
+"q.q.q.q.q.X O 4 5 4 + q.q.q.q.q.",
+"q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q."
+};
diff --git a/mgllab/xpm/right_1.xpm b/mgllab/xpm/right_1.xpm
new file mode 100644 (file)
index 0000000..a7b3a67
--- /dev/null
@@ -0,0 +1,22 @@
+/* XPM */
+static const char * right_1_xpm[] = {
+"16 16 3 1",
+".     c None",
+"+     c #7F0000",
+"@     c #FF0000",
+"................",
+"................",
+"........+.......",
+"........++......",
+"........+@+.....",
+"..+++++++@@+....",
+"..+@@@@@@@@@+...",
+"..+@@@@@@@@@@+..",
+"..+@@@@@@@@@@@+.",
+"..+@@@@@@@@@@+..",
+"..+@@@@@@@@@+...",
+"..+++++++@@+....",
+"........+@+.....",
+"........++......",
+"........+.......",
+"................"};
diff --git a/mgllab/xpm/rotate.xpm b/mgllab/xpm/rotate.xpm
new file mode 100644 (file)
index 0000000..e6b0220
--- /dev/null
@@ -0,0 +1,22 @@
+/* XPM */
+static const char *rotate_xpm[]={
+"16 16 3 1",
+". c None",
+"# c #000080",
+"a c #8080ff",
+"......#########.",
+"......#aaaaaa#..",
+".......#aaaa##..",
+"..###..#aaaaa#..",
+".#aa#..#aaa#aa#.",
+".#aa#...#a##aa#.",
+"#aa#....#a#.#aa#",
+"#aa#.....#..#aa#",
+"#aa#........#aa#",
+"#aa#........#aa#",
+".#a#........#a#.",
+".#aa#......#aa#.",
+"..#aa##..##aa#..",
+"...#aaa##aaa#...",
+"....##aaaa##....",
+"......####......"};
diff --git a/mgllab/xpm/show_sl.xpm b/mgllab/xpm/show_sl.xpm
new file mode 100644 (file)
index 0000000..21e4e90
--- /dev/null
@@ -0,0 +1,22 @@
+/* XPM */
+static const char * show_sl_xpm[] = {
+"16 16 3 1",
+"      c None",
+".     c #000000",
+"+     c #007FFF",
+"                ",
+"                ",
+"  ............  ",
+"  . .++++++. .  ",
+"  ...++++++...  ",
+"  . .++++++. .  ",
+"  . .++++++. .  ",
+"  ...++++++...  ",
+"  . .++++++. .  ",
+"  . .++++++. .  ",
+"  ...++++++...  ",
+"  . .++++++. .  ",
+"  . .++++++. .  ",
+"  ...++++++...  ",
+"  . .++++++. .  ",
+"  ............  "};
diff --git a/mgllab/xpm/size.xpm b/mgllab/xpm/size.xpm
new file mode 100644 (file)
index 0000000..3a1d846
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * size_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"                ",
+" .............. ",
+" .     .      . ",
+" .    ...     . ",
+" .     .      . ",
+" .     .      . ",
+" . .   .    . . ",
+" .............. ",
+" . .   .    . . ",
+" .     .      . ",
+" .     .      . ",
+" .     .      . ",
+" .    ...     . ",
+" .     .      . ",
+" .............. "};
diff --git a/mgllab/xpm/squize.xpm b/mgllab/xpm/squize.xpm
new file mode 100644 (file)
index 0000000..fa68e6a
--- /dev/null
@@ -0,0 +1,22 @@
+/* XPM */
+static const char * squize_xpm[] = {
+"16 16 3 1",
+"      c None",
+".     c #000000",
+"+     c #7F7F7F",
+"                ",
+"                ",
+"     ......     ",
+"     .    .     ",
+"     .    .     ",
+"  .  .    .  .  ",
+"  +. .    . .+  ",
+"......    ......",
+"  +. .    . .+  ",
+"  .  .    .  .  ",
+"     .    .     ",
+"     .    .     ",
+"     .    .     ",
+"     ......     ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/stop.xpm b/mgllab/xpm/stop.xpm
new file mode 100644 (file)
index 0000000..028f468
--- /dev/null
@@ -0,0 +1,23 @@
+/* XPM */
+static const char * stop_xpm[] = {
+"16 16 4 1",
+"      c None",
+".     c #770000",
+"+     c #FF0000",
+"@     c #FFFFFF",
+"                ",
+"     ......     ",
+"    .++++++.    ",
+"   .++++++++.   ",
+"  .++++++++++.  ",
+" .+++@@++@@+++. ",
+" .+++@@@@@@+++. ",
+" .++++@@@@++++. ",
+" .++++@@@@++++. ",
+" .+++@@@@@@+++. ",
+" .+++@@++@@+++. ",
+"  .++++++++++.  ",
+"   .++++++++.   ",
+"    .++++++.    ",
+"     ......     ",
+"                "};
diff --git a/mgllab/xpm/style.xpm b/mgllab/xpm/style.xpm
new file mode 100644 (file)
index 0000000..9125d5f
--- /dev/null
@@ -0,0 +1,22 @@
+/* XPM */
+static const char * style_xpm[] = {
+"16 16 3 1",
+"      c None",
+".     c #FF0000",
+"q     c #7F0000",
+"                ",
+"                ",
+"                ",
+"   qqq   qqq    ",
+"   q.q   q.q    ",
+"   q.q   q.q    ",
+"   q.q   q.q    ",
+"    q     q     ",
+"    q     q     ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/system-file-manager.xpm b/mgllab/xpm/system-file-manager.xpm
new file mode 100644 (file)
index 0000000..6c858df
--- /dev/null
@@ -0,0 +1,44 @@
+/* XPM */
+static const char *system_file_manager_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 22 1 ",
+"  c #5F5B29",
+". c #686326",
+"X c #6C672B",
+"o c #736622",
+"O c #7E6920",
+"+ c #C17D11",
+"@ c #DBB676",
+"# c #D0B782",
+"$ c #D2BA85",
+"% c #D5BC88",
+"& c #D7BF8C",
+"* c #E2BF82",
+"= c #DDC596",
+"- c #DFC696",
+"; c #DFC796",
+": c #E3C082",
+"> c #E3CB9D",
+", c #E3CC9E",
+"< c #E4CC9E",
+"1 c #E4CC9F",
+"2 c #E9D1A6",
+"3 c None",
+/* pixels */
+"33............33",
+"3.2<>>>>>>>>>>.3",
+".;;;;;;;*;;;>=*.",
+".;O..........O=.",
+".=.++++++++++.$X",
+".=.++++++++++.&X",
+".=.++++..++++.&X",
+".=O..........o$.",
+".>++++++++++++&.",
+".&O..........O$.",
+".%.++++++++++.$.",
+".&.++++++++++.$.",
+".%.++++..++++.$.",
+".$O...........$.",
+".@$$$$#$####$#$.",
+" .XXXXXX........"
+};
diff --git a/mgllab/xpm/tab-close.xpm b/mgllab/xpm/tab-close.xpm
new file mode 100644 (file)
index 0000000..bf1d497
--- /dev/null
@@ -0,0 +1,91 @@
+/* XPM */
+static const char *tab_close_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 69 1 ",
+"  c #741F1E",
+". c #9A2E29",
+"X c #9E2D2A",
+"o c #9A342B",
+"O c #9D362E",
+"+ c #BA2F22",
+"@ c #A1342A",
+"# c #A93A37",
+"$ c #B73834",
+"% c #B63E3A",
+"& c #C40201",
+"* c #C50302",
+"= c #E10202",
+"- c #E10404",
+"; c #C5281A",
+": c #C32C1C",
+"> c #CE2E23",
+", c #C32F2F",
+"< c #D22C24",
+"1 c #C23030",
+"2 c #EE2220",
+"3 c #F02220",
+"4 c #C04734",
+"5 c #C04D3B",
+"6 c #AC6765",
+"7 c #B86261",
+"8 c #BE7675",
+"9 c #CF4E4D",
+"0 c #C85242",
+"q c #CA574C",
+"w c #CB5A4D",
+"e c #C55950",
+"r c #D05151",
+"t c #CE6C64",
+"y c #DB6A62",
+"u c #D46E68",
+"i c #D3716B",
+"p c #DE726C",
+"a c #E8706E",
+"s c #E97675",
+"d c #C3817E",
+"f c #D48C8A",
+"g c #CA9A9A",
+"h c #D39E9B",
+"j c #E0B5B4",
+"k c #DEDADA",
+"l c #DFDFDF",
+"z c #E6C3C3",
+"x c #E7D5D7",
+"c c #EDD2D3",
+"v c gray88",
+"b c #E2E2E2",
+"n c #E6E6E6",
+"m c gray91",
+"M c #E9E9E9",
+"N c #EAEAEA",
+"B c #ECECEC",
+"V c #EDECEC",
+"C c #EEEEEE",
+"Z c #F4F0F0",
+"A c #F6F2F3",
+"S c #F8F6F7",
+"D c #FBFAFA",
+"F c #FBFBFB",
+"G c #FCFAFA",
+"H c gray99",
+"J c #FDFDFD",
+"K c white",
+"L c None",
+/* pixels */
+"LLLLLLLLLLLLLLLL",
+"LLLLLLLLLLLLLLLL",
+"LLLLLLLLMKKKKKML",
+"LLLLLLLLKlllllKL",
+"LLLLLLLLKvHDDlKL",
+"LKKKKKKKKvDHKlKL",
+"LKbbbbbbbbHHKbKL",
+"LxkKKDZHHHHDDnKL",
+"Li7ZSfucHHHHHmKL",
+"+ap68ystHHHHKMKL",
+"L09eqrwjKHHKKCKL",
+"Lz4,,5gCCCCCCCKL",
+"Lh:**;dGKKKKKKKL",
+"L>=@o-< LLLLLLLL",
+"O2$LL%3#LLLLLLLL",
+"L.LLLLXLLLLLLLLL"
+};
diff --git a/mgllab/xpm/table.xpm b/mgllab/xpm/table.xpm
new file mode 100644 (file)
index 0000000..43b33a4
--- /dev/null
@@ -0,0 +1,24 @@
+/* XPM */\r
+static const char * table_xpm[] = {\r
+"16 16 4 1",\r
+"      c None",\r
+"#     c #000000",\r
+"o     c #777777",\r
+".     c #FFFFFF",\r
+"                ",\r
+" ###############",\r
+" #ooo#oooo#oooo#",\r
+" #ooo#oooo#oooo#",\r
+" ###############",\r
+" #ooo#....#....#",\r
+" #ooo#....#....#",\r
+" ###############",\r
+" #ooo#....#....#",\r
+" #ooo#....#....#",\r
+" ###############",\r
+" #ooo#....#....#",\r
+" #ooo#....#....#",\r
+" ###############",\r
+"                ",\r
+"                "};\r
+\r
diff --git a/mgllab/xpm/text-csv.xpm b/mgllab/xpm/text-csv.xpm
new file mode 100644 (file)
index 0000000..ffbf3e3
--- /dev/null
@@ -0,0 +1,112 @@
+/* XPM */
+static const char *text_csv_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 90 1 ",
+"  c gray14",
+". c #252626",
+"X c gray16",
+"o c #2A2A2A",
+"O c #38332B",
+"+ c #39342B",
+"@ c #3A3A3A",
+"# c gray24",
+"$ c #3F3F3F",
+"% c gray25",
+"& c gray33",
+"* c #4F96FF",
+"= c #5195FF",
+"- c #5395FF",
+"; c #5096FF",
+": c #5296FF",
+"> c #5396FF",
+", c #5397FF",
+"< c #569DFF",
+"1 c #5899FF",
+"2 c #589BFF",
+"3 c #5CA3FF",
+"4 c #5DA3FF",
+"5 c #63A1FE",
+"6 c #8C8B8B",
+"7 c #979089",
+"8 c #9A948C",
+"9 c #959494",
+"0 c #959595",
+"q c #9F9F9F",
+"w c #A0A0A0",
+"e c gray65",
+"r c #A9A9A9",
+"t c #B2B2B2",
+"y c gray70",
+"u c #B6B6B6",
+"i c gray72",
+"p c #B9B9B9",
+"a c gray74",
+"s c gray",
+"d c #C7C2BB",
+"f c #C5C3BF",
+"g c #CEC7BA",
+"h c #C9C4BD",
+"j c #CAC5BD",
+"k c #CEC7BC",
+"l c #AAD3FF",
+"z c #B2D7FF",
+"x c #BCD9FF",
+"c c #C0C0C0",
+"v c #C1C1C1",
+"b c #C1C1C2",
+"n c gray76",
+"m c gray77",
+"M c #C6C7C7",
+"N c #C9C7C7",
+"B c #CFCAC3",
+"V c #C8C8C8",
+"C c #CACACA",
+"Z c #CBCBCB",
+"A c #CDCDCD",
+"S c #CECDCD",
+"D c #D4D1CE",
+"F c gray82",
+"G c #D1D2D2",
+"H c #D9D7D7",
+"J c gainsboro",
+"K c #DEDCDC",
+"L c gray87",
+"P c #C3DDFF",
+"I c #EBEAEA",
+"U c gray92",
+"Y c #ECEBEB",
+"T c #ECECEC",
+"R c #EEEEEE",
+"E c #F5EFE7",
+"W c #F6F0E8",
+"Q c #FFFDED",
+"! c gray95",
+"~ c #F4F3F3",
+"^ c #F6F6F6",
+"/ c #FFF9F1",
+"( c #FFFFF3",
+") c gray98",
+"_ c #FCFBFA",
+"` c #FFFFF9",
+"' c gray99",
+"] c #FDFDFD",
+"[ c white",
+"{ c None",
+/* pixels */
+"{{{{{{{{{{{{{{{{",
+"{{[[[[[[[[[[[[{{",
+"{{[6Mcj*>>*gfS{{",
+"{{[_j/Q:PP1zlD{{",
+"{{[7<>>5>>3gfF{{",
+"{{[`>xx>([O[[Z{{",
+"{{[82xx>[[@[[S{{",
+"{{[[>::3O@&#ZF{{",
+"{{[0BEWf[[%$)S{{",
+"{{[[cTTaItqptT{{",
+"{{[0ZSSae[[[~{{{",
+"{{[[cTTpq[RHo{{{",
+"{{[0ZIIur[Ko{{{{",
+"{{[[cccmN^.{{{{{",
+"{{[K[[[!J {{{{{{",
+"{{{{{{{{{{{{{{{{"
+};
diff --git a/mgllab/xpm/text-field.xpm b/mgllab/xpm/text-field.xpm
new file mode 100644 (file)
index 0000000..7cb0901
--- /dev/null
@@ -0,0 +1,25 @@
+/* XPM */
+static const char *text_field_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 3 1 ",
+"  c black",
+". c #8B8B8B",
+"X c None",
+/* pixels */
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX",
+"XXX     X....XXX",
+"XXXXX XXXXXXXXXX",
+"XXXXX XXXXXXXXXX",
+"XXXXX XXX....XXX",
+"XXXXX XXXXXXXXXX",
+"XXXXXXXXXXXXXXXX",
+"XXX..........XXX",
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX"
+};
diff --git a/mgllab/xpm/text-plain.xpm b/mgllab/xpm/text-plain.xpm
new file mode 100644 (file)
index 0000000..598558b
--- /dev/null
@@ -0,0 +1,109 @@
+/* XPM */
+static const char *text_plain_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 87 1 ",
+"  c gray14",
+". c #252626",
+"X c gray16",
+"o c #2A2A2A",
+"O c gray52",
+"+ c gray53",
+"@ c #8A8989",
+"# c #8D8B8B",
+"$ c #908F8F",
+"% c gray57",
+"& c #929292",
+"* c #A0A0A0",
+"= c gray68",
+"- c #B0AFAF",
+"; c #B1B1B1",
+": c gray71",
+"> c gray78",
+", c #C8C7C7",
+"< c #C9C8C8",
+"1 c #CAC9C9",
+"2 c #CACACA",
+"3 c #CBCACA",
+"4 c #CCCACA",
+"5 c gray80",
+"6 c #CDCCCC",
+"7 c #CDCDCD",
+"8 c #CECECE",
+"9 c #CFCECE",
+"0 c gray81",
+"q c #D1CECE",
+"w c #D0CFCF",
+"e c #D0D0D0",
+"r c #D0D1D1",
+"t c gray82",
+"y c #D2D1D1",
+"u c LightGray",
+"i c gray84",
+"p c #D9D7D7",
+"a c #D8D8D8",
+"s c #D9D8D8",
+"d c #DADADA",
+"f c #DBDADA",
+"g c gray86",
+"h c #DDDBDB",
+"j c gainsboro",
+"k c #DDDDDD",
+"l c #DEDCDC",
+"z c gray87",
+"x c #E0DFDF",
+"c c #E1E0E0",
+"v c #E2E2E2",
+"b c #E5E4E4",
+"n c gray90",
+"m c #E9E9E9",
+"M c #EAEAEA",
+"N c #ECECEC",
+"B c #EFEDED",
+"V c #EEEEEE",
+"C c #EEEFEF",
+"Z c #EFEFEF",
+"A c #F0EFEF",
+"S c #F1EFEF",
+"D c #F2F0F0",
+"F c #F2F1F1",
+"G c #F3F1F1",
+"H c #F4F3F3",
+"J c #F4F4F4",
+"K c #F6F5F5",
+"L c #F6F6F6",
+"P c #F6F7F7",
+"I c gray97",
+"U c #F8F7F7",
+"Y c #F8F8F8",
+"T c #F9F8F8",
+"R c #F9F9F9",
+"E c #FAF9F9",
+"W c gray98",
+"Q c #FBFAFA",
+"! c #FBFBFB",
+"~ c #FCFBFB",
+"^ c gray99",
+"/ c #FDFCFC",
+"( c #FDFDFD",
+") c #FEFDFD",
+"_ c #FEFEFE",
+"` c white",
+"' c None",
+/* pixels */
+"''''''''''''''''",
+"''````````````''",
+"''`@Gh994q>4gS''",
+"''`USSGGGGKGG`''",
+"''`#g9,t252g2C''",
+"''`~KKEEEEEEE`''",
+"''`$g92tr9tvuK''",
+"''``E````E!YK`''",
+"''`%brrjzz2i2M''",
+"''``E``!M;==:M''",
+"''`%nvz9O```G'''",
+"''``~`!J*`Cpo'''",
+"''`%n9gaO`zo''''",
+"''``EEKN2K.'''''",
+"''`z``ECj ''''''",
+"''''''''''''''''"
+};
diff --git a/mgllab/xpm/text-x-generic.xpm b/mgllab/xpm/text-x-generic.xpm
new file mode 100644 (file)
index 0000000..7dd65de
--- /dev/null
@@ -0,0 +1,43 @@
+/* XPM */
+static const char *text_x_generic_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 21 1 ",
+"  c #818181",
+". c #959595",
+"X c gray60",
+"o c gray77",
+"O c #C5C5C5",
+"+ c #C6C6C6",
+"@ c gray78",
+"# c #C8C8C8",
+"$ c #EDEDE5",
+"% c #EDEDE6",
+"& c #EAEAEA",
+"* c gray92",
+"= c #ECECEC",
+"- c gray93",
+"; c #EEEEEE",
+": c #EFEFEF",
+"> c gray94",
+", c #F1F1F1",
+"< c gray95",
+"1 c white",
+"2 c None",
+/* pixels */
+"X            222",
+" 111111111111 22",
+" 1=&==&====>1 22",
+" 1&oooo#oo#>1 22",
+" 1&=&=====>>1 22",
+" 1=o#oo##o#>1 22",
+" 1&=====%==>1 22",
+" 1=oo#o>:%=>1 22",
+" 1====>=>:>>1 22",
+" 1=##o#####>1 22",
+" 1===>=>>>><1 22",
+" 1=o#####>><1 22",
+" 1===>>>>>>>1 22",
+" 111111111111 22",
+".            .22",
+"2222222222222222"
+};
diff --git a/mgllab/xpm/text.xpm b/mgllab/xpm/text.xpm
new file mode 100644 (file)
index 0000000..56317c0
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * text_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"  ............  ",
+"  ............  ",
+"  .    ..    .  ",
+"       ..       ",
+"       ..       ",
+"       ..       ",
+"       ..       ",
+"       ..       ",
+"       ..       ",
+"       ..       ",
+"       ..       ",
+"       ..       ",
+"       ..       ",
+"      ....      ",
+"                "};
diff --git a/mgllab/xpm/tiles.xpm b/mgllab/xpm/tiles.xpm
new file mode 100644 (file)
index 0000000..505dadd
--- /dev/null
@@ -0,0 +1,132 @@
+/* XPM */
+static const char * tiles_xpm[] = {
+"16 16 113 2",
+"      c None",
+".     c #00D9FB",
+"+     c #00FEC7",
+"@     c #7DFF1E",
+"#     c #DBDF08",
+"$     c #EAC004",
+"%     c #E5D403",
+"&     c #FF5D00",
+"*     c #FC1600",
+"=     c #FC2500",
+"-     c #00EAE9",
+";     c #00E9CA",
+">     c #05F1B1",
+",     c #03F8B5",
+"'     c #00FFC7",
+")     c #00FFD6",
+"!     c #FF5900",
+"~     c #FD0600",
+"{     c #FA0000",
+"]     c #FF2600",
+"^     c #00A1FF",
+"/     c #00CEFF",
+"(     c #00FEE9",
+"_     c #00FF71",
+":     c #80FF12",
+"<     c #CFFF07",
+"[     c #FF7000",
+"}     c #FF5800",
+"|     c #FE7200",
+"1     c #F9B100",
+"2     c #00EDF2",
+"3     c #1AFF56",
+"4     c #C1FA00",
+"5     c #FDD600",
+"6     c #FFA700",
+"7     c #FF9200",
+"8     c #F3D400",
+"9     c #A0FD21",
+"0     c #21F996",
+"a     c #ECF100",
+"b     c #FFC900",
+"c     c #FF9B00",
+"d     c #FF9300",
+"e     c #FDA700",
+"f     c #AEFF05",
+"g     c #00F9C7",
+"h     c #00AAFF",
+"i     c #0052FF",
+"j     c #FDCA00",
+"k     c #E6DE00",
+"l     c #FCA900",
+"m     c #ADFF00",
+"n     c #00FCC3",
+"o     c #00C8FF",
+"p     c #0089FF",
+"q     c #0079FE",
+"r     c #0094FF",
+"s     c #00CDFF",
+"t     c #93E71F",
+"u     c #6BF55F",
+"v     c #57FA76",
+"w     c #3EFF80",
+"x     c #1BFF89",
+"y     c #00FF84",
+"z     c #00FF95",
+"A     c #F52C00",
+"B     c #F03200",
+"C     c #F23E00",
+"D     c #FB5B00",
+"E     c #F39E00",
+"F     c #D4EA00",
+"G     c #3BFF31",
+"H     c #00FCD9",
+"I     c #00C2FF",
+"J     c #FE5500",
+"K     c #E70200",
+"L     c #B30000",
+"M     c #9C0000",
+"N     c #A30000",
+"O     c #C30000",
+"P     c #F61400",
+"Q     c #FF9600",
+"R     c #99FD04",
+"S     c #01FDD5",
+"T     c #00A6FF",
+"U     c #0054FF",
+"V     c #0037FF",
+"W     c #EC0400",
+"X     c #BD0000",
+"Y     c #A20000",
+"Z     c #A00000",
+"`     c #B70000",
+" .    c #EA0100",
+"..    c #FF5600",
+"+.    c #EDE300",
+"@.    c #0CF5CC",
+"#.    c #06D2E4",
+"$.    c #09CEE0",
+"%.    c #18E5C1",
+"&.    c #4AFF6C",
+"*.    c #C1EB09",
+"=.    c #FF7200",
+"-.    c #FE4F00",
+";.    c #F73E00",
+">.    c #F03A00",
+",.    c #F03800",
+"'.    c #F63A00",
+").    c #E2BD00",
+"!.    c #D0C10A",
+"~.    c #CDC110",
+"{.    c #DFBB02",
+"].    c #F7B100",
+"^.    c #FF9C00",
+"                                ",
+"                                ",
+"            . + @ # $ %         ",
+"& * =           - ; > , ' )     ",
+"! ~ { ]             ^ / ( _ : < ",
+"[ } | 1               2 3 4 5 6 ",
+"7 8 9 0                 a b c d ",
+"e f g h i                   j k ",
+"l m n o p q r s                 ",
+"      t u v w x y z             ",
+"    A B C D E F G H I           ",
+"J K L M N O P Q R S T U V       ",
+"} W X Y Z `  ...+.  @.#.$.%.&.*.",
+"=.-.;.>.,.'.        ).!.~.{.].^.",
+"                                ",
+"                                "};
diff --git a/mgllab/xpm/tools-wizard.xpm b/mgllab/xpm/tools-wizard.xpm
new file mode 100644 (file)
index 0000000..f02794d
--- /dev/null
@@ -0,0 +1,82 @@
+/* XPM */
+static const char *tools_wizard_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 60 1 ",
+"  c black",
+". c #020202",
+"X c #060401",
+"o c #040404",
+"O c gray3",
+"+ c #0B0B0B",
+"@ c #0C0C0C",
+"# c #0E0E0E",
+"$ c #140B06",
+"% c #101010",
+"& c gray12",
+"* c #2B2B2A",
+"= c gray17",
+"- c #353535",
+"; c #632B08",
+": c #783500",
+"> c #444444",
+", c #6F6D6C",
+"< c #777777",
+"1 c #A23B00",
+"2 c #904513",
+"3 c #DF6D02",
+"4 c #F07902",
+"5 c #EA6016",
+"6 c #F3741A",
+"7 c #EE7A2D",
+"8 c #E67435",
+"9 c #EB7331",
+"0 c #8C6B50",
+"q c #BE910C",
+"w c #F88903",
+"e c #EC9E0F",
+"r c #F89505",
+"t c #F99C06",
+"y c #EC8618",
+"u c #F69711",
+"i c #FE9713",
+"p c #FEB809",
+"a c #FDAD10",
+"s c #ED8021",
+"d c #F69A2A",
+"f c #EE8731",
+"g c #C5A429",
+"h c #F5CE00",
+"j c #FCDD02",
+"k c #FED20A",
+"l c #F9C41E",
+"z c #FFC91E",
+"x c #FED418",
+"c c #FEC027",
+"v c #FEC327",
+"b c #FBDD21",
+"n c #F2C634",
+"m c #FEC439",
+"M c #FEC23F",
+"N c #FFE923",
+"B c #E48350",
+"V c #CACACA",
+"C c #D5D5D5",
+"Z c None",
+/* pixels */
+"ZZZZZZZZZZZZZZZZ",
+"ZZZZZZZX#ZmzkjZZ",
+"ZZZZZ1Z,VZZZZhNZ",
+"ZZw3ZZZ<CZZZZZbZ",
+"ZeuZ8BZZ&>ZZZlxZ",
+"qMZZZZZZ$*ZrapZZ",
+"gvZZZZZZ;:4itZZZ",
+"Znvd7ys6520ZZZZZ",
+"ZZZZfZZZZO*ZZZZZ",
+"ZZZZZZZZZ%.ZZZZZ",
+"ZZZZZZZZZZ.-Z9ZZ",
+"ZZZZZZZZZZoOZ9ZZ",
+"ZZZZZZZZZZZ.OZZZ",
+"ZZZZZZZZZZZ.#ZZZ",
+"ZZZZZZZZZZZ..ZZZ",
+"ZZZZZZZZZZZZ.ZZZ"
+};
diff --git a/mgllab/xpm/tran.xpm b/mgllab/xpm/tran.xpm
new file mode 100644 (file)
index 0000000..29fa1ee
--- /dev/null
@@ -0,0 +1,23 @@
+/* XPM */
+static const char * tran_xpm[] = {
+"16 16 4 1",
+"      c None",
+".     c #000000",
+"+     c #FF0000",
+"@     c #0000FF",
+"                ",
+"                ",
+" ......++++++++ ",
+" .    .       + ",
+" . . ..+ + + ++ ",
+" .    .       + ",
+" . . ..+ + + ++ ",
+" .++++.++++++++ ",
+" . . ..         ",
+" .    .      @  ",
+" . . ..     @@@ ",
+" .    .      @  ",
+" . . ..      @  ",
+" .    .    @@   ",
+" . . .. @@@     ",
+" ......         "};
diff --git a/mgllab/xpm/transform-crop.xpm b/mgllab/xpm/transform-crop.xpm
new file mode 100644 (file)
index 0000000..ff9ac59
--- /dev/null
@@ -0,0 +1,133 @@
+/* XPM */
+static const char *transform_crop_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 111 2 ",
+"   c #2C3335",
+".  c #353A3C",
+"X  c #3B3F41",
+"o  c #414244",
+"O  c #414F5E",
+"+  c #6E6E6C",
+"@  c #7B7C79",
+"#  c #7A7D7F",
+"$  c #807777",
+"%  c #0069FF",
+"&  c #1271FE",
+"*  c #1371FE",
+"=  c #1271FF",
+"-  c #6B8CBE",
+";  c #5F87C2",
+":  c #5F88C4",
+">  c #6088C4",
+",  c #6089C4",
+"<  c #6289C5",
+"1  c #6289C6",
+"2  c #638AC6",
+"3  c #638AC7",
+"4  c #638BC7",
+"5  c #688DC3",
+"6  c #648BC8",
+"7  c #5DA1FF",
+"8  c #67A3FF",
+"9  c #60A4FF",
+"0  c #67A4FE",
+"q  c #68A5FF",
+"w  c #68A6FF",
+"e  c #828484",
+"r  c #858787",
+"t  c #888586",
+"y  c #8C8686",
+"u  c #8B8989",
+"i  c #8F8F8D",
+"p  c #938C8C",
+"a  c #90918E",
+"s  c #91908F",
+"d  c #949492",
+"f  c #9C9996",
+"g  c #9E9A99",
+"h  c #A1A29F",
+"j  c #ADA59E",
+"k  c #9EA2A3",
+"l  c #A2A0A0",
+"z  c #A9A3A3",
+"x  c #ACADAB",
+"c  c #AEAEAE",
+"v  c #B3ACA6",
+"b  c #B1ABAA",
+"n  c #B2AEAE",
+"m  c #B4AFAC",
+"M  c #B5AFAF",
+"N  c #B7B2B2",
+"B  c #B8B2B1",
+"V  c #B9B4B2",
+"C  c #B9B5B5",
+"Z  c #B9B6B4",
+"A  c #BCB8B8",
+"S  c #BFBABA",
+"D  c #BFBDBD",
+"F  c #C0BBBB",
+"G  c #C1BCBC",
+"H  c #C2BFBF",
+"J  c #C3BFBF",
+"K  c #C3C1C1",
+"L  c #C7C3C3",
+"P  c #C3C4C4",
+"I  c #CACACA",
+"U  c #CDCBCB",
+"Y  c #CFCDC8",
+"T  c #CECDCC",
+"R  c #D0CDCE",
+"E  c #D4CECF",
+"W  c #D6D0CF",
+"Q  c #D8D0CB",
+"!  c #D3D3D2",
+"~  c #D7D1D0",
+"^  c gray84",
+"/  c #D7D6D6",
+"(  c #D8D2D1",
+")  c #D8D3D1",
+"_  c #D9D5D5",
+"`  c #D9D8D8",
+"'  c #D9D9DA",
+"]  c #DCDADA",
+"[  c gray87",
+"{  c #E0D6CB",
+"}  c #E0DEDE",
+"|  c #E0E1E1",
+" . c #E3E1E3",
+".. c #E3E2E2",
+"X. c #E4E2E2",
+"o. c #E7E6E7",
+"O. c #EFEFEF",
+"+. c #F1F1F1",
+"@. c #F1F2F2",
+"#. c gray95",
+"$. c #F3F3F3",
+"%. c #F7F3F0",
+"&. c #F7F7F6",
+"*. c gray97",
+"=. c #F9F7F4",
+"-. c #FBFBFB",
+";. c #FDFDFD",
+":. c #FFFFFD",
+">. c #FEFEFE",
+",. c white",
+"<. c None",
+/* pixels */
+"<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.",
+"<.<.<.<.<.<.<.<.<.<.<.<.o.] F <.",
+"8 w <.<.<.<.<.<.<.<.<...} G S <.",
+"& % { : W 2 V 2 g 5 _ ..G C K <.",
+"<.- ,.,.&.=.$.%.$.E X.z n G I <.",
+"<.( ,.,.-.&.$.$.k # b $ p P c <.",
+"<.; ,.,.,.,.-.` r   o u l r <.<.",
+"<.( ,.,.,.,.O.S M y . X e <.<.<.",
+"<.; ,.,.,.-./ U G C + O <.<.<.<.",
+"<.~ ,.,.-...' T i @ ! V <.<.<.<.",
+"<.; ,.,./ T d a [ ,.,.2 <.<.<.<.",
+"<.( ,.L a l O.,.,.,.,.n <.<.<.<.",
+"<.2 Y x &.,.,.,.,.,.,.2 <.<.<.<.",
+"<.Q ,.,.,.,.,.,.,.,.,.v <.<.<.<.",
+"0 7 E - ~ : B 3 f 2 j 9 w <.<.<.",
+"& & <.<.<.<.<.<.<.<.<.& & <.<.<."
+};
diff --git a/mgllab/xpm/transform-move.xpm b/mgllab/xpm/transform-move.xpm
new file mode 100644 (file)
index 0000000..38c0952
--- /dev/null
@@ -0,0 +1,86 @@
+/* XPM */
+static const char *transform_move_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 64 1 ",
+"  c #0C0D0C",
+". c #121312",
+"X c #191A19",
+"o c #242525",
+"O c #2D2D2D",
+"+ c #2F302F",
+"@ c #333332",
+"# c #343534",
+"$ c #3A3A3A",
+"% c #3E3F3E",
+"& c #3F403F",
+"* c #444544",
+"= c #464845",
+"- c #474847",
+"; c #4F514E",
+": c gray32",
+"> c #5A5A5A",
+", c #5C5D5C",
+"< c #5F615E",
+"1 c #646564",
+"2 c #656764",
+"3 c #666765",
+"4 c #686868",
+"5 c #696B69",
+"6 c #6C6E6C",
+"7 c #717270",
+"8 c #727272",
+"9 c #797B78",
+"0 c #7E7F7C",
+"q c #828281",
+"w c #888A87",
+"e c #8A8B8A",
+"r c #8B8D89",
+"t c #8B8C8A",
+"y c #9D9F9C",
+"u c #A0A19F",
+"i c #A3A5A2",
+"p c #A5A6A4",
+"a c #A5A7A4",
+"s c #ACAEAA",
+"d c #B8B9B7",
+"f c #B9BBB7",
+"g c #BABBB8",
+"h c #BEC0BC",
+"j c #C3C5C2",
+"k c #C4C6C2",
+"l c #CACCC8",
+"z c #CED0CB",
+"x c #D3D5D2",
+"c c #D8DAD7",
+"v c #DCDDDA",
+"b c #DCDDDB",
+"n c #DFE1DD",
+"m c #E0E2DE",
+"M c #E0E3DE",
+"N c #E8ECE5",
+"B c #E9ECE6",
+"V c #E9EDE6",
+"C c #ECEFE8",
+"Z c #EEF1EB",
+"A c #F2F5EF",
+"S c #F3F6EF",
+"D c #F6F9F4",
+"F c None",
+/* pixels */
+"FFFFFFFFFFFFFFFF",
+"FFFFFFF28FFFFFFF",
+"FFFFFFFhnOFFFFFF",
+"FFFFFF0CVpFFFFFF",
+"FFFFFF=fc2FFFFFF",
+"FFFFFFF@-FFFFFFF",
+"FF.t5FFFFFF*p&FF",
+"F>kDb*F2iFFfAMe ",
+"F2lZx%F6sFFyAzqF",
+"FFXt<FFFFFF#w+FF",
+"FFFFFFF$:FFFFFFF",
+"FFFFFF;jM8FFFFFF",
+"FFFFFF9VVuFFFFFF",
+"FFFFFFFgboFFFFFF",
+"FFFFFFF,4FFFFFFF",
+"FFFFFFFFFFFFFFFF"
+};
diff --git a/mgllab/xpm/transform-rotate.xpm b/mgllab/xpm/transform-rotate.xpm
new file mode 100644 (file)
index 0000000..e0bc67a
--- /dev/null
@@ -0,0 +1,41 @@
+/* XPM */
+static const char *transform_rotate_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 19 1 ",
+"  c #4D308B",
+". c #563B91",
+"X c #583D92",
+"o c #5D4395",
+"O c #5E4397",
+"+ c #604796",
+"@ c #624898",
+"# c #654B9C",
+"$ c #674E9D",
+"% c #6C53A1",
+"& c #6F56A3",
+"* c #7159A4",
+"= c #735BA6",
+"- c #765EA8",
+"; c #7861A9",
+": c #7D66AD",
+"> c #8069AF",
+", c #826CB0",
+"< c None",
+/* pixels */
+"<<<<<<<<<<<<<<<<",
+"<<<<<<:*$<<<<<<<",
+"<<<<<>-%@++<<<<<",
+"<<<<,;&#O++++<<<",
+"<<<<<*$OX+++++<<",
+"<<<<<<<. <<+++<<",
+"<<<<<<<<<<<++++<",
+"<<<<<<<<<<<<+++<",
+"<<<<<<<<<<<<+++<",
+"<<<<<<<<<<<<+++<",
+"<<<<<<<<<<<++++<",
+"<<<<<<<<<<<+++<<",
+"<<<<++++++++++<<",
+"<<<++++++++++<<<",
+"<<<<<++++++<<<<<",
+"<<<<<<<<<<<<<<<<"
+};
diff --git a/mgllab/xpm/transform-scale.xpm b/mgllab/xpm/transform-scale.xpm
new file mode 100644 (file)
index 0000000..6c90eb0
--- /dev/null
@@ -0,0 +1,80 @@
+/* XPM */
+static const char *transform_scale_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 58 1 ",
+"  c #0A68EE",
+". c #136FEF",
+"X c #146EEE",
+"o c #1F76F0",
+"O c #1271FF",
+"+ c #1371FF",
+"@ c #2077EF",
+"# c #307FF0",
+"$ c #2F80EF",
+"% c #3F88EE",
+"& c #2F80F0",
+"* c #7193C6",
+"= c #609EF5",
+"- c #64A2FF",
+"; c #65A2FF",
+": c #77ACF7",
+"> c #9B9CA3",
+", c #A0A1A7",
+"< c #A4A5AB",
+"1 c #A4A5AC",
+"2 c #AAABB0",
+"3 c #AFB1B4",
+"4 c #AFB1B6",
+"5 c #88A0C7",
+"6 c #92A7C5",
+"7 c #BABBC1",
+"8 c #8FBBF9",
+"9 c #A5C9F9",
+"0 c #B3D1FA",
+"q c #BCD6F9",
+"w c #C4C5CB",
+"e c #DBE6F6",
+"r c #D6E4F8",
+"t c #D1E3FC",
+"y c #D8E7FD",
+"u c #DEEBFC",
+"i c #E4E4E4",
+"p c #E7E7E7",
+"a c #EAEAEA",
+"s c gray92",
+"d c gray93",
+"f c #EEEEEE",
+"g c #EFEFEF",
+"h c #E3E9F2",
+"j c #E1EAF7",
+"k c #E5ECF5",
+"l c #E2ECFA",
+"z c #E4EEFC",
+"x c gray94",
+"c c gray95",
+"v c #F3F3F3",
+"b c #F4F4F4",
+"n c gray96",
+"m c #F6F6F7",
+"M c #FDFDFD",
+"N c #FEFEFE",
+"B c white",
+"V c None",
+/* pixels */
+";;VVVVVVVVVVV;;V",
+"++7*1*,*2*V*V++V",
+"Vwggaaapp3VVVVVV",
+"V*mqhgggv3VVV*VV",
+"VwBl0kvvm3VVVVVV",
+"V*BBl9jmg3VVV*VV",
+"VwBBBu8ev3VVVVVV",
+"V*BBBBy:r3VVV*VV",
+"VwBBBBBt=6V&VVVV",
+"V*731>,<5%#@V*VV",
+"VVVVVVVVV&oXVVVV",
+"V*VVVVVV$@. V*VV",
+"VVVVVVVVVVVVVVVV",
+";-V*V*V*V*V*V;;V",
+"++VVVVVVVVVVV++V",
+"VVVVVVVVVVVVVVVV"
+};
diff --git a/mgllab/xpm/udav.xpm b/mgllab/xpm/udav.xpm
new file mode 100644 (file)
index 0000000..714a7b3
--- /dev/null
@@ -0,0 +1,416 @@
+/* XPM */
+static const char *udav_xpm[]={
+"64 64 349 2",
+"Qt c None",
+"#n c #000080",
+"#h c #010180",
+"#y c #010181",
+"#s c #020281",
+"#c c #020282",
+"dg c #030382",
+".8 c #030383",
+"#r c #040483",
+"#m c #040484",
+"#g c #050584",
+"#M c #050585",
+"#q c #060685",
+"a. c #060686",
+"#p c #070786",
+"ck c #070787",
+"aj c #080887",
+"bm c #080888",
+"aK c #090988",
+"a4 c #090989",
+"aJ c #0a0a89",
+"## c #0a0a8a",
+"#G c #0b0b8a",
+"cx c #0b0b8b",
+"b7 c #0c0c8b",
+"#z c #0c0c8c",
+"b6 c #0d0d8c",
+"b8 c #0d0d8d",
+"#l c #0e0e8d",
+"cj c #0e0e8e",
+"b5 c #0f0f8e",
+"#S c #0f0f8f",
+"ci c #10108f",
+"bE c #101090",
+"b4 c #111190",
+"c2 c #111191",
+"#W c #121291",
+"b9 c #121292",
+"#b c #131392",
+"b3 c #131393",
+"ak c #141493",
+"aD c #141494",
+"bG c #151594",
+"aq c #151595",
+"bF c #161695",
+"#i c #161696",
+"aE c #171796",
+"ae c #171797",
+".5 c #181897",
+"cq c #181898",
+"#L c #191998",
+"bU c #191999",
+"b2 c #1a1a99",
+"aL c #1a1a9a",
+"ds c #1b1b9a",
+"#A c #1b1b9b",
+"#k c #1c1c9b",
+"#f c #1c1c9c",
+"cG c #1d1d9c",
+"bM c #1d1d9d",
+"bN c #1e1e9d",
+"ch c #1e1e9e",
+"bL c #1f1f9e",
+"b1 c #1f1f9f",
+"#j c #20209f",
+"bO c #2020a0",
+"cS c #2121a0",
+"bY c #2121a1",
+"db c #2222a1",
+"bK c #2222a2",
+"bn c #2323a2",
+"a# c #2323a3",
+"bH c #2424a4",
+"bJ c #2525a4",
+"a3 c #2525a5",
+"#o c #2626a5",
+"df c #2626a6",
+"#. c #2727a6",
+"bP c #2727a7",
+"ai c #2828a7",
+"cF c #2828a8",
+"cf c #2929a9",
+"b0 c #2a2aa9",
+"#x c #2a2aaa",
+".7 c #2b2baa",
+"bI c #2b2bab",
+"cy c #2c2cab",
+"a5 c #2c2cac",
+"aI c #2d2dac",
+"#d c #2d2dad",
+"cp c #2e2ead",
+"bo c #2e2eae",
+"ap c #2f2fae",
+"#1 c #3030b0",
+"cg c #3131b1",
+"bZ c #3232b1",
+"de c #3333b2",
+"dw c #3333b3",
+"bQ c #3434b4",
+"bp c #3535b5",
+"c3 c #3636b5",
+"#R c #3636b6",
+"cC c #3737b7",
+"aC c #3838b7",
+"#t c #3838b8",
+"#T c #3939b8",
+"#F c #3939b9",
+"bq c #3a3ab9",
+"#6 c #3a3aba",
+"aM c #3c3cbb",
+"#B c #3d3dbc",
+"cr c #3d3dbd",
+"#N c #3e3ebd",
+"dA c #3e3ebe",
+"ar c #3f3fbe",
+"bA c #3f3fbf",
+"bR c #4040c0",
+"bS c #4141c0",
+"dh c #4141c1",
+"ce c #4242c1",
+"da c #4343c3",
+"br c #4444c3",
+"#X c #4545c4",
+"a6 c #4545c5",
+"cM c #4646c5",
+"bw c #4646c6",
+"#e c #4747c6",
+"bs c #4747c7",
+"bv c #4848c7",
+"aB c #4848c8",
+"bt c #4949c8",
+"bu c #4949c9",
+"bx c #4a4ac9",
+"as c #4a4aca",
+"cs c #4b4bca",
+"ct c #4b4bcb",
+"#u c #4c4ccb",
+"bl c #4c4ccc",
+"dz c #5050cf",
+"c6 c #5151d0",
+"a7 c #5151d1",
+"by c #5252d1",
+"#H c #5353d2",
+"dx c #5454d3",
+"d# c #5454d4",
+"at c #5555d5",
+"aA c #5656d5",
+"cw c #5656d6",
+"dy c #5757d6",
+"bz c #5858d8",
+"#a c #5959d9",
+"cE c #5a5ad9",
+"cL c #5b5bdb",
+"a8 c #5c5cdb",
+"aN c #5c5cdc",
+".6 c #5d5ddd",
+"c5 c #5e5edd",
+"bk c #5e5ede",
+"dt c #5f5fde",
+"cT c #6060df",
+"al c #6262e1",
+"au c #6262e2",
+"az c #6464e4",
+"af c #6565e4",
+"cD c #6565e5",
+"#2 c #6666e6",
+"d. c #6767e7",
+"co c #6868e7",
+".9 c #6868e8",
+"av c #6969e8",
+"cN c #6a6aea",
+"a2 c #6b6bea",
+"c. c #6b6beb",
+"dk c #6c6ceb",
+"aO c #6c6cec",
+"ay c #6d6dec",
+"ad c #6e6eee",
+"ax c #6f6fef",
+"bD c #7070f0",
+"#w c #7171f0",
+"aw c #7171f1",
+"cu c #7272f1",
+"c7 c #7272f2",
+"a9 c #7373f2",
+"aF c #7373f3",
+"dn c #7474f4",
+"b. c #7878f7",
+"#C c #7979f8",
+".4 c #7979f9",
+"aP c #7a7af9",
+"aa c #7b7bfa",
+"b# c #7c7cfb",
+"cd c #7e7efd",
+"bX c #7f7ffe",
+".3 c #800000",
+".1 c #800101",
+"ba c #8080ff",
+".2 c #810101",
+".X c #810202",
+"dp c #8181ff",
+".W c #820202",
+".Y c #820303",
+"#5 c #8282ff",
+".Z c #830303",
+"aH c #8383ff",
+".R c #840505",
+"#v c #8484ff",
+".S c #850606",
+"bb c #8585ff",
+".T c #860707",
+"#K c #8686ff",
+".U c #870808",
+".V c #880808",
+"aQ c #8888ff",
+".Q c #890a0a",
+"dr c #8989ff",
+".K c #8a0a0a",
+"cz c #8a8aff",
+".j c #8b0b0b",
+"cK c #8b8bff",
+"bc c #8c8cff",
+"cU c #8d8dff",
+".B c #8e0e0e",
+".P c #8e0f0f",
+"ao c #8e8eff",
+".L c #8f0f0f",
+"cH c #9090ff",
+"bd c #9292ff",
+".C c #931414",
+"aR c #9393ff",
+".O c #941414",
+"#D c #9494ff",
+"#O c #9595ff",
+"cV c #9696ff",
+".M c #981818",
+"#E c #9898ff",
+".c c #991a1a",
+"cO c #9999ff",
+".N c #9a1b1b",
+".s c #9b1b1b",
+".J c #9d1e1e",
+"be c #9d9dff",
+"aS c #9e9eff",
+"dd c #9f9fff",
+"c8 c #a1a1ff",
+".D c #a32424",
+"#7 c #a3a3ff",
+"#I c #a5a5ff",
+".r c #a72828",
+"aT c #a7a7ff",
+"do c #a8a8ff",
+"cn c #a9a9ff",
+".# c #ab2c2c",
+"c9 c #ababff",
+".A c #ac2c2c",
+"cW c #adadff",
+"#Y c #aeaeff",
+".I c #af2f2f",
+"du c #b0b0ff",
+"#0 c #b1b1ff",
+"c4 c #b2b2ff",
+"bf c #b3b3ff",
+".E c #b43535",
+"cA c #b4b4ff",
+"#Q c #b5b5ff",
+"dv c #b6b6ff",
+"cl c #b7b7ff",
+"cX c #b8b8ff",
+"aU c #b9b9ff",
+"cc c #babaff",
+".i c #bc3c3c",
+"bW c #bcbcff",
+"dm c #bdbdff",
+".H c #be3f3f",
+"aZ c #bebeff",
+"bB c #bfbfff",
+"aV c #c0c0ff",
+".b c #c14141",
+".t c #c14242",
+"bg c #c1c1ff",
+"#V c #c2c2ff",
+".F c #c34343",
+"#9 c #c3c3ff",
+"cY c #c4c4ff",
+"#J c #c5c5ff",
+"cP c #c6c6ff",
+"aW c #c7c7ff",
+"aY c #c8c8ff",
+".a c #c94949",
+"bC c #c9c9ff",
+".k c #ca4a4a",
+"c1 c #cacaff",
+".G c #cb4b4b",
+"aX c #cbcbff",
+"di c #ccccff",
+"dj c #cdcdff",
+"bh c #ceceff",
+"a1 c #d0d0ff",
+"c# c #d1d1ff",
+"c0 c #d2d2ff",
+"cR c #d3d3ff",
+".z c #d45555",
+"cZ c #d4d4ff",
+"bT c #d6d6ff",
+"dl c #d8d8ff",
+"#3 c #dadaff",
+"am c #dbdbff",
+"bi c #dcdcff",
+"ag c #ddddff",
+"#P c #dfdfff",
+"cI c #e1e1ff",
+"bV c #e4e4ff",
+".q c #e66666",
+"dc c #e6e6ff",
+"aG c #e7e7ff",
+".d c #e86969",
+"cb c #e8e8ff",
+"cJ c #eaeaff",
+"ab c #ececff",
+".u c #ed6d6d",
+"bj c #ededff",
+"cB c #efefff",
+"#U c #f0f0ff",
+"cQ c #f1f1ff",
+"cv c #f2f2ff",
+"dq c #f4f4ff",
+"cm c #f5f5ff",
+"ca c #f6f6ff",
+"a0 c #f7f7ff",
+"an c #f9f9ff",
+"ah c #fafaff",
+"#Z c #fbfbff",
+"ac c #fcfcff",
+"#8 c #fdfdff",
+"#4 c #fefeff",
+".y c #ff7f7f",
+".h c #ff8686",
+".v c #ff9292",
+".l c #ff9595",
+".x c #ff9d9d",
+".w c #ffa5a5",
+".p c #ffb0b0",
+".e c #ffb3b3",
+".g c #ffbfbf",
+".f c #ffcece",
+".m c #ffd9d9",
+".o c #ffe8e8",
+".n c #fff8f8",
+".0 c #ffff00",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.a.b.cQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.c.d.e.f.g.h.iQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.j.k.l.m.n.o.p.q.rQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.s.t.u.v.w.x.y.z.A.BQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.C.D.E.F.G.a.H.I.J.BQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.K.L.C.M.N.N.M.O.P.QQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.R.S.T.U.V.V.V.U.T.SQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.W.X.W.W.W.W.Y.Y.Z.RQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0.1.1.1.1.1.1.2.W.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0.0.0.0.3.3.3.3.3.2.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0.0.0.0.0.0.4.5.2.0.0.0.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0.0.0.0.0.0.0.6.7.8.0.0.0.0.0.0.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0.0.0.0.0.0.0.9#..8.0.0.0.0.0.0.0.0.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0.0.0.0.0###a#b#c.0.0.0.0.0.0.0.0.0.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0.0.0.0#d#e#f#g#h.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0.0#i#j#k#l#m#h#n#o.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0#p#q#r#s#n#n#m#t#u#v#w#x.0.0.0.0.0.0.0.0.0.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0.0.0#y#h#n#m#r#q#z#A#B#C#D#E#F.0.0.0.0.0.0.0.0.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0.0.0.0#r#s#h#h#h#y#r#G#j#H#I#J#K#L.0.0.0.0.0.0.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0.0.0.0.0.0.0.0#n#n#n#y#M#b#N#O#P#Q#R.0.0.0.0.0.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0.0.0.0.0.0.0.0.0.0.0#h#n#h#r#S#T#E#U#V#N.0.0.0.0.0.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0#h#h#r#W#X#Y#Z#0#1.0.0.0.0.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0#y#q#k#2#3#4#5.5.0.0.0.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0#c#z#6#7#8#9#X#q.0.0.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0a.a#aaabacadae.0.0.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0#m.5afagah#Kai.0.0.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0.0.0.0.0.0.0#gaj.0.0.0.0.0.0.0.0.0akalamanaoapaj.0.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0a.aqa#aparasatauavadawaxayazaAaBaCa#aDaEaFaGanaHaIaJ.0.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtaKaL#xaM#uaNaOaPaQaRaSaT#0aUaVaWaXaXaYaZ#Y#E#.aSa0a1a2a3a4.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQt###fa5#Ta6a7a8afaOa9b.b#babbbcbdbeaTbfbgbhbiaGbjbk#3#Z#IblaLajbm.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtaDbnbobpbqarbrbsbtbuaBbvbw#e#ebx#ubybzaladaaao#7bAbB#8bCbDapbEa.aObqbF.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtbGbH#dbobI#x.7a5a5#xaibJbK#jbLbMbNbNbObnbP#dbQbRbSaZ#4bTbbarbUa4#ZbVbWbXbr#LQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQt#SbYapbZb0b1b2b2aLbUaEb3b4b5b6b7#G#####Gb7b8#Sb9c.bT#4c#bbbrbL#z#q#Pca#8cbcccdcebFQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQt#icf#taMcgchcicj#Scjb7a4ck#q#g#m#r.8.8.8.8#rblclca#ZaUaF#NbMb8a.#MaQ#0amcmah#Pcncocpa4QtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQt#Gcq.7crcsctcra3b6aJbma.#m.8#c#s#y#y#y#hbJcu#Vcvcvcaaocw#1.5cx#q#rcybSalczcA#PcacBaYaQa6aEQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQt###ka#cCctaNcDazcEbt#tcFch.5cGb0bRazcHbBcIbjbVcJcKcLaCbLbEbm#m.8##bE#AaIcMcNcOcPcbcQcR#EatcSQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtajcj#L#dcCcscTcu#5cUcVbe#IcWcXcYbhcZc0c1cRcUaycsbZbNc2aJ#M.8#ca..8#q##b9bLc3aAbXc4biab#3#7c5#o#pQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQt#qaKb8bGchbSaBc6cE#2c7bX#KbccVc8c9#Qd.d#da#1db#i#laK#M.8#s#sa.#h#y#c#r#pb8cqb0btaF#7a1dccZdda8#o#MQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQt#g#g#paJb8b9.5chbJbI#1c3cC#t#Rde#ddf#jcqb9b6aK#q#r#c#s#y#y.0#h#n#n#h#ydg#M##ak#odhc.dddi#PdjcVd#dbQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQt.8.8#m#M#paK###zcj#SbEbEbE#S#lb7aJaj#q#m.8#c#s#y#h#h#s.0.0.0Qt#m#h#h#y#c#maKb9bndhdkbeaXdldm#vbw#LQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQt#c#c#cdgdg.8#r#m#m#m#m#m#r.8dg#c#s#y#h#h#h#n#h#y.0.0QtQtQtQtQtQtQt#y#y#s#maK#ba3brdndodia1aU#Obyb4QtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQt#s#y#y#y#y#y#y#y#y#y#h#h#h#h#n#n#n#n#n#n#yQtQtQtQtQtQtQtQtQtQtQtQtQt#y#c#maJaDbIa7dpaZdqaha1drbAb3QtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtdg#y#h#h#n#n#n#n#n#n#n#n#n#n#n#n#hdgQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#s#c#Mcxdsc3dtaodudvaScudhdsQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtdg#y#h#h#h#n#n#n#h#y#cQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtdg#pbEb1dwbwdxdydzdA#xaEQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#maJb5bGdsbLbOchaLakb8ckQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#q#qckaKaJ####a4bm#p#pQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#m#c#cdgdgdg.8.8.8#rQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#y#h#h#h#h#h#y#s#rQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#h#n#n#n#n#h#cQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#h#h#yQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt",
+"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt"};
diff --git a/mgllab/xpm/unused/smth.xpm b/mgllab/xpm/unused/smth.xpm
new file mode 100644 (file)
index 0000000..a2b9d46
--- /dev/null
@@ -0,0 +1,22 @@
+/* XPM */
+static const char * smth_xpm[] = {
+"16 16 3 1",
+"      c None",
+".     c #000000",
+"+     c #FF0000",
+"                ",
+"                ",
+"                ",
+"                ",
+"    .           ",
+"    .           ",
+"   . .    .     ",
+"   . .    ..    ",
+"  +++.   . .    ",
+" +.  ++  +++.   ",
+"  .   .++   ++  ",
+" .    . .    .+ ",
+" .    . .     . ",
+"       .        ",
+"       .        ",
+"                "};
diff --git a/mgllab/xpm/unused/sum.xpm b/mgllab/xpm/unused/sum.xpm
new file mode 100644 (file)
index 0000000..fc017ac
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * sum_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"                ",
+"   ..........   ",
+"   .        .   ",
+"    .       .   ",
+"     .          ",
+"      .         ",
+"       .        ",
+"        ..      ",
+"       .        ",
+"      .         ",
+"     .          ",
+"    .       .   ",
+"   .        .   ",
+"   ..........   ",
+"                "};
diff --git a/mgllab/xpm/unused/swap.xpm b/mgllab/xpm/unused/swap.xpm
new file mode 100644 (file)
index 0000000..6ad367c
--- /dev/null
@@ -0,0 +1,23 @@
+/* XPM */
+static const char * swap_xpm[] = {
+"16 16 4 1",
+"      c None",
+".     c #0000FF",
+"+     c #000000",
+"@     c #FF0000",
+"                ",
+"  .          .. ",
+"   .        .   ",
+"    .      .    ",
+"    .      .    ",
+"     ......     ",
+"   +         +  ",
+"  +           + ",
+"  +           + ",
+"  + +       + + ",
+"   ++  @@@  ++  ",
+"  +++ @   @ +++ ",
+"     @     @    ",
+"     @     @    ",
+"  @@@       @@@ ",
+"                "};
diff --git a/mgllab/xpm/up_1.xpm b/mgllab/xpm/up_1.xpm
new file mode 100644 (file)
index 0000000..472b450
--- /dev/null
@@ -0,0 +1,22 @@
+/* XPM */
+static const char * up_1_xpm[] = {
+"16 16 3 1",
+".     c None",
+"+     c #7F0000",
+"@     c #FF0000",
+"................",
+"................",
+"........+.......",
+".......+@+......",
+"......+@@@+.....",
+".....+@@@@@+....",
+"....+@@@@@@@+...",
+"...+@@@@@@@@@+..",
+"..++++@@@@@++++.",
+".....+@@@@@+....",
+".....+@@@@@+....",
+".....+@@@@@+....",
+".....+@@@@@+....",
+".....+@@@@@+....",
+".....+++++++....",
+"................"};
diff --git a/mgllab/xpm/update.xpm b/mgllab/xpm/update.xpm
new file mode 100644 (file)
index 0000000..5ee1dd6
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char *update_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #00007F",
+"                ",
+"                ",
+"      ....      ",
+"     .    .     ",
+"    .   .....   ",
+"    .    ...    ",
+"          .     ",
+"                ",
+"                ",
+"     .          ",
+"    ...    .    ",
+"   .....   .    ",
+"     .    .     ",
+"      ....      ",
+"                ",
+"                "};
diff --git a/mgllab/xpm/vect.xpm b/mgllab/xpm/vect.xpm
new file mode 100644 (file)
index 0000000..7d91322
--- /dev/null
@@ -0,0 +1,60 @@
+/* XPM */
+static const char * vect_xpm[] = {
+"16 16 41 1",
+"      c None",
+".     c #B3FF00",
+"+     c #AEF900",
+"@     c #FBF400",
+"#     c #FEF700",
+"$     c #FFDA00",
+"%     c #AFFB00",
+"&     c #FDF600",
+"*     c #FDF500",
+"=     c #FD9600",
+"-     c #FD9000",
+";     c #FA8F00",
+">     c #FEAB00",
+",     c #FD9500",
+"'     c #FB9400",
+")     c #FE9100",
+"!     c #FBAA00",
+"~     c #FCA900",
+"{     c #FF9700",
+"]     c #FF9200",
+"^     c #FDA900",
+"/     c #FDAB00",
+"(     c #FB9D00",
+"_     c #FC0B00",
+":     c #FF0A00",
+"<     c #FF4400",
+"[     c #FB4200",
+"}     c #FC9E00",
+"|     c #FE9F00",
+"1     c #FD4400",
+"2     c #FC4400",
+"3     c #FFA000",
+"4     c #FB1600",
+"5     c #FCAD00",
+"6     c #D00000",
+"7     c #D20000",
+"8     c #FD1500",
+"9     c #FA1500",
+"0     c #FEAF00",
+"a     c #D10000",
+"b     c #FDAE00",
+" .+    @#     $ ",
+" %     &@     $ ",
+".      &        ",
+"      *         ",
+"  =     -;     >",
+" ,'     )     !~",
+"{      ]      ^ ",
+"      ]      /  ",
+"               (",
+" _:     <[    }|",
+" _     12     3 ",
+"      <      |  ",
+"                ",
+"         4     5",
+" 67     89    50",
+"a     8      b  "};
diff --git a/mgllab/xpm/view-filter.xpm b/mgllab/xpm/view-filter.xpm
new file mode 100644 (file)
index 0000000..de41124
--- /dev/null
@@ -0,0 +1,64 @@
+/* XPM */
+static const char *view_filter_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 42 1 ",
+"  c #1E1E1E",
+". c #282828",
+"X c #353535",
+"o c gray28",
+"O c gray34",
+"+ c #5D5D5D",
+"@ c #606060",
+"# c #646464",
+"$ c #656565",
+"% c #686868",
+"& c #6D6D6D",
+"* c #6F6F6F",
+"= c gray44",
+"- c #717171",
+"; c gray57",
+": c #9F9F9F",
+"> c #A4A4A4",
+", c #ACACAC",
+"< c #B2B2B2",
+"1 c gray73",
+"2 c #BBBBBB",
+"3 c gray74",
+"4 c gray77",
+"5 c #CACACA",
+"6 c gray80",
+"7 c gray84",
+"8 c gray87",
+"9 c #E1E1E1",
+"0 c #E6E6E6",
+"q c gray91",
+"w c #E9E9E9",
+"e c #EFEFEF",
+"r c gray94",
+"t c #F1F1F1",
+"y c gray95",
+"u c #F3F3F3",
+"i c #F4F4F4",
+"p c #F6F6F6",
+"a c #F8F8F8",
+"s c #F9F9F9",
+"d c gray98",
+"f c None",
+/* pixels */
+"fffO*-**#Offffff",
+"ff#233333fffffff",
+"ff%,;*+. Xofffff",
+"fff:39ppwfffffff",
+"ffff<5aayfffffff",
+"ffff+2yaefffffff",
+"fffff@7y0fffffff",
+"ffffff-08fffffff",
+"fffffffy4fffffff",
+"fffffffy6fffffff",
+"fffffffp6fffffff",
+"fffffffy6fffffff",
+"fffffffy6fffffff",
+"fffffffy6fffffff",
+"fffffffw>fffffff",
+"ffffffffffffffff"
+};
diff --git a/mgllab/xpm/view-fullscreen.xpm b/mgllab/xpm/view-fullscreen.xpm
new file mode 100644 (file)
index 0000000..d899ac9
--- /dev/null
@@ -0,0 +1,63 @@
+/* XPM */
+static const char *view_fullscreen_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 41 1 ",
+"  c #A40000",
+". c #B93C3C",
+"X c #BA3E3E",
+"o c #BC4343",
+"O c #BD4646",
+"+ c #C15252",
+"@ c #C55D5D",
+"# c #C55E5E",
+"$ c #C65E5E",
+"% c #C66060",
+"& c #C86464",
+"* c #C96767",
+"= c #D89393",
+"- c #DA9797",
+"; c #DA9898",
+": c #DB9999",
+"> c #DC9C9C",
+", c #DC9D9D",
+"< c #DC9E9E",
+"1 c #DD9F9F",
+"2 c #DDA0A0",
+"3 c #DEA1A1",
+"4 c #DEA2A2",
+"5 c #DFA5A5",
+"6 c #E0A8A8",
+"7 c #CFCFD1",
+"8 c #DEDEE0",
+"9 c #F5E4E4",
+"0 c #F6E5E5",
+"q c #F6E6E6",
+"w c #F6E7E7",
+"e c #F7E7E7",
+"r c #F7E8E8",
+"t c #F7E9E9",
+"y c #F8EAEA",
+"u c #F3F3F4",
+"i c #FEFCFC",
+"p c #FEFDFD",
+"a c #FEFEFE",
+"s c white",
+"d c None",
+/* pixels */
+"dddddddddddddddd",
+"duuuuuuuuuuuuuud",
+"d88888888888888d",
+"d77777777777777d",
+"dssssssssssssssd",
+"ds.@2ssssss<@.sd",
+"ds@ <ssssss< %sd",
+"ds2<+ysssse+<2sd",
+"dssseesssseesssd",
+"dsssressss9ysssd",
+"ds5;Orssss9+;6sd",
+"ds* ;ssssss= *sd",
+"dso@2ssssss<@Osd",
+"dssssssssssssssd",
+"dddddddddddddddd",
+"dddddddddddddddd"
+};
diff --git a/mgllab/xpm/view-grid.xpm b/mgllab/xpm/view-grid.xpm
new file mode 100644 (file)
index 0000000..db7228f
--- /dev/null
@@ -0,0 +1,124 @@
+/* XPM */
+static const char *view_grid_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 102 2 ",
+"   c #0060FF",
+".  c #0061FF",
+"X  c #0062FF",
+"o  c #AAC7E9",
+"O  c #AECBEC",
+"+  c #B0CEEE",
+"@  c #B2CFEF",
+"#  c #B3D0F0",
+"$  c #B7D4F3",
+"%  c #B7D4F4",
+"&  c #B8D5F5",
+"*  c #BBD7F8",
+"=  c #BDDAF9",
+"-  c #BDD9FA",
+";  c #BEDAFB",
+":  c #E1E0DC",
+">  c #DFDFE0",
+",  c #C1DDFD",
+"<  c #DCE6F1",
+"1  c #DFE8F3",
+"2  c #D1EFFF",
+"3  c #D2EFFF",
+"4  c #D3F0FF",
+"5  c #E0E1E2",
+"6  c #E6E7E7",
+"7  c #E8E5E3",
+"8  c #ECE7E2",
+"9  c #EAE8E4",
+"0  c #EBE8E6",
+"q  c #ECEAE6",
+"w  c #E7E8E8",
+"e  c #EDEBE8",
+"r  c #EEEDE8",
+"t  c #ECECEC",
+"y  c gray93",
+"u  c #EFEEEC",
+"i  c #EEEFEF",
+"p  c #F3F0E9",
+"a  c #F6F1EB",
+"s  c #F3F0EC",
+"d  c #F3F0ED",
+"f  c #F5F2EE",
+"g  c #F6F2EF",
+"h  c #F6F3EF",
+"j  c #FAF6EF",
+"k  c #E1EBF5",
+"l  c #E2EBF4",
+"z  c #E3EDF6",
+"x  c #E2EDF7",
+"c  c #E3EDF7",
+"v  c #E4EDF6",
+"b  c #E4EDF7",
+"n  c #E5EEF7",
+"m  c #E5EEF8",
+"M  c #E6EEF8",
+"N  c #E6EFF9",
+"B  c #E7EFFA",
+"V  c #E7F0FA",
+"C  c #E8F1FB",
+"Z  c #E9F1FB",
+"A  c #E9F2FC",
+"S  c #EAF3FC",
+"D  c #EAF3FD",
+"F  c #EBF3FD",
+"G  c #EBF4FE",
+"H  c #ECF4FE",
+"J  c gray95",
+"K  c #F6F3F0",
+"L  c #F4F3F3",
+"P  c #F6F4F0",
+"I  c #F5F4F2",
+"U  c #F6F5F3",
+"Y  c #F4F4F4",
+"T  c #F4F5F5",
+"R  c #FBF5F0",
+"E  c #FFF8F3",
+"W  c #FBF8F4",
+"Q  c #FAF8F6",
+"!  c #FCF9F5",
+"~  c #FDFBF6",
+"^  c #FEFAF6",
+"/  c #FFFAF6",
+"(  c #FEFBF6",
+")  c #FEFCF7",
+"_  c #F3FFFF",
+"`  c #F4FFFF",
+"'  c #F9F8F8",
+"]  c #FBFAFA",
+"[  c #FBFBFB",
+"{  c #FFFFF8",
+"}  c #FFFFF9",
+"|  c #FDFCFA",
+" . c #FFFEFA",
+".. c #FFFFFB",
+"X. c #FAFFFF",
+"o. c #FFFFFC",
+"O. c #FEFEFD",
+"+. c #FFFEFD",
+"@. c #FFFFFD",
+"#. c #FFFFFE",
+"$. c white",
+"%. c None",
+/* pixels */
+"%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.",
+"%.%.$.$.` $.$.$.` $.$.$.` $.%.%.",
+"%.%.$.: o > > 7 O 6 6 e + $.%.%.",
+"%.%.$.8 1 e q g c g d R v $.%.%.",
+"%.%.` < X l + c X v % B X X.%.%.",
+"%.%.$.9 l u u g B L J R B $.%.%.",
+"%.%.$.9 # u u g % L Y ( * $.%.%.",
+"%.%.$.p c P L E V ( ( { A $.%.%.",
+"%.%._ l X B % B X A - A X X.%.%.",
+"%.%.$.s v Y Y ( A { ] { A $.%.%.",
+"%.%.$.s % Y Y { - ] ] $., $.%.%.",
+"%.%.$.j B ( ( { A $.$.{ H $.%.%.",
+"%.%._ v X A - A X A , H X X.%.%.",
+"%.%.$.P B Q ' { F { $.$.A $.%.%.",
+"%.%.$.$.4 $.$.$.2 $.$.$.2 $.%.%.",
+"%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%."
+};
diff --git a/mgllab/xpm/view-group.xpm b/mgllab/xpm/view-group.xpm
new file mode 100644 (file)
index 0000000..b256f34
--- /dev/null
@@ -0,0 +1,51 @@
+/* XPM */
+static const char *view_group_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 29 1 ",
+"  c #005CC6",
+". c #0050CC",
+"X c #0052CF",
+"o c #0260DF",
+"O c #4A83BE",
+"+ c #4686CF",
+"@ c #5191DC",
+"# c #5192DC",
+"$ c #7DA5CD",
+"% c #78A4D2",
+"& c #8FB9EA",
+"* c #B9CEE2",
+"= c #C9C9CB",
+"- c #C9C9CC",
+"; c #CFCFD1",
+": c #D0D0D1",
+"> c #D3D3D5",
+", c #D4D4D5",
+"< c #DEDEDF",
+"1 c #DFDFE1",
+"2 c gray90",
+"3 c #E6E6E6",
+"4 c #E8E8EB",
+"5 c #EFEFEF",
+"6 c #F4F4F4",
+"7 c #FAFBFA",
+"8 c #FBFBFB",
+"9 c white",
+"0 c None",
+/* pixels */
+"0000000000000000",
+"0999999999999990",
+"0411111111111140",
+"0>=----------=>0",
+"0999999999999990",
+"096,;::::::;,690",
+"09<7999999997<90",
+"0929%*$99%*$9290",
+"0959O+ 99O+ 9590",
+"0979Xo.99XoX9790",
+"0999999999999990",
+"096,;::::::;,690",
+"0929999999997290",
+"0999#&#999999990",
+"0000000000000000",
+"0000000000000000"
+};
diff --git a/mgllab/xpm/view-refresh.xpm b/mgllab/xpm/view-refresh.xpm
new file mode 100644 (file)
index 0000000..22fbc9a
--- /dev/null
@@ -0,0 +1,116 @@
+/* XPM */
+static const char *view_refresh_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 94 2 ",
+"   c #3465A4",
+".  c #3565A4",
+"X  c #3566A4",
+"o  c #3566A5",
+"O  c #3667A5",
+"+  c #3767A5",
+"@  c #3767A6",
+"#  c #3768A5",
+"$  c #3768A6",
+"%  c #3868A6",
+"&  c #3869A6",
+"*  c #3969A6",
+"=  c #3969A7",
+"-  c #3A69A7",
+";  c #3A6AA6",
+":  c #3A6AA7",
+">  c #3B6BA7",
+",  c #3C6BA8",
+"<  c #3C6BA9",
+"1  c #3C6CA9",
+"2  c #3D6DA9",
+"3  c #4170AB",
+"4  c #4371AB",
+"5  c #4774AD",
+"6  c #4B77AF",
+"7  c #4C77AF",
+"8  c #4C78AF",
+"9  c #4C78B0",
+"0  c #4D79B0",
+"q  c #4E7AB1",
+"w  c #4F7CB6",
+"e  c #537FB7",
+"r  c #5580B5",
+"t  c #5B84B7",
+"y  c #5D85B7",
+"u  c #5F87B9",
+"i  c #6188B9",
+"p  c #6890C0",
+"a  c #6990C0",
+"s  c #6D94C2",
+"d  c #6891C7",
+"f  c #6C95C9",
+"g  c #7298C5",
+"h  c #82A5CE",
+"j  c #84A6CE",
+"k  c #88A7CE",
+"l  c #88ABD2",
+"z  c #8AACD3",
+"x  c #8FACD0",
+"c  c #8CADD3",
+"v  c #8FADD2",
+"b  c #8EAED3",
+"n  c #8FB0D3",
+"m  c #93B1D4",
+"M  c #95B2D4",
+"N  c #9CB7D7",
+"B  c #97B6D8",
+"V  c #99B9DB",
+"C  c #9DBDDC",
+"Z  c #A1BBD9",
+"A  c #A1BEDD",
+"S  c #A0BEDE",
+"D  c #A8C1DE",
+"F  c #A8C2DF",
+"G  c #B0C9E3",
+"H  c #B4CAE3",
+"J  c #B4CBE5",
+"K  c #BCD1E7",
+"L  c #BFD2E7",
+"P  c #BFD3E9",
+"I  c #C1D2E6",
+"U  c #C7D7E9",
+"Y  c #C4D7EB",
+"T  c #C6D8EB",
+"R  c #C8D8EA",
+"E  c #C9D9EA",
+"W  c #CDDBEB",
+"Q  c #C9DAEC",
+"!  c #CCDCED",
+"~  c #CCDDEE",
+"^  c #D5E2F0",
+"/  c #D8E4F1",
+"(  c #DBE6F2",
+")  c #DDE8F3",
+"_  c #E0E9F4",
+"`  c #E2EBF5",
+"'  c #E3ECF5",
+"]  c #E4ECF5",
+"[  c #E4EDF5",
+"{  c #E5EDF5",
+"}  c #E5EDF6",
+"|  c #E6EEF6",
+" . c #E7EEF6",
+".. c None",
+/* pixels */
+"........% % % % , ..............",
+"......% a n F F m u % ......O ..",
+"....% c C A J P ~ ^ L 0 # 4   ..",
+"..% a g 1 # % y Z / / ) k E % ..",
+"..% 4 1 % ......% i W ` | | % ..",
+"..O % d % ..........  U T ' % ..",
+"..O ..............% x | / | , ..",
+"................  O 6 8 8 8 O ..",
+"..        O   O ................",
+"..  | ' ` N O ..............O ..",
+"..O | U E   ..........O f r   ..",
+"..O | ` | I 0 % ......< w % # ..",
+"..% / M ` ) ! c 9 O % % 1 0 : ..",
+"..O y O 0 J Q K G A z h b % ....",
+"..  O ....% r h B V z s % ......",
+"..O ..........: # O : : ........"
+};
diff --git a/mgllab/xpm/weather-clear.xpm b/mgllab/xpm/weather-clear.xpm
new file mode 100644 (file)
index 0000000..2e6676a
--- /dev/null
@@ -0,0 +1,101 @@
+/* XPM */
+static const char *weather_clear_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 79 1 ",
+"  c #E69A0E",
+". c #E7A003",
+"X c #E7A203",
+"o c #E7A407",
+"O c #E8A707",
+"+ c #E8A108",
+"@ c #E9A508",
+"# c #E9A409",
+"$ c #EBA40B",
+"% c #EAA70B",
+"& c #ECA80C",
+"* c #EDAC0E",
+"= c #ECB206",
+"- c #ECB306",
+"; c #ECB507",
+": c #ECB60E",
+"> c #EDB80B",
+", c #ECAA10",
+"< c #EDAB13",
+"1 c #E9AD11",
+"2 c #ECB618",
+"3 c #F0B414",
+"4 c #F3B518",
+"5 c #F5BA19",
+"6 c #F5BE1A",
+"7 c #E8A620",
+"8 c #F0B625",
+"9 c #F1B931",
+"0 c #F0C30D",
+"q c #F0C40D",
+"w c #F0C615",
+"e c #F7C119",
+"r c #F7C318",
+"t c #F8C11A",
+"y c #F4D218",
+"u c #F5D91C",
+"i c #F6DB1C",
+"p c #F6DB22",
+"a c #F2CC3D",
+"s c #F5D63C",
+"d c #F7E021",
+"f c #F8E121",
+"g c #FAEB2E",
+"h c #FAEC2C",
+"j c #FBED31",
+"k c #FBF031",
+"l c #FCF236",
+"z c #FCF337",
+"x c #FDF63F",
+"c c #EBB044",
+"v c #F0BC4B",
+"b c #F0BD4F",
+"n c #EDBC59",
+"m c #F3D042",
+"M c #F7DE45",
+"N c #F3CF5B",
+"B c #F4D55D",
+"V c #F9E74E",
+"C c #FAEC4B",
+"Z c #FDF942",
+"A c #F8E250",
+"S c #FAEA50",
+"D c #FBEE52",
+"F c #FBEE53",
+"G c #F9E85D",
+"H c #FBF054",
+"J c #F7DF63",
+"K c #F4D27E",
+"L c #F5D77F",
+"P c #F6DB7D",
+"I c #F6DC7D",
+"U c #F8E265",
+"Y c #F9E668",
+"T c #F9E769",
+"R c #FDF772",
+"E c #FDF875",
+"W c #FDF696",
+"Q c #FDF79B",
+"! c None",
+/* pixels */
+"!!!!!!!!!!!!!!!!",
+"!!!!!!!!!!!!!!!!",
+"!!!!!!!!!!!!!!!!",
+"!!!!!!8vb9!!!!!!",
+"!!!!tcKPKWn5!!!!",
+"!!!! NJYJJJ<!!!!",
+"!!!4.sVDAAM:*!!!",
+"!!!$=ugllgd0$!!!",
+"!!!&=ihZZkdq%!!!",
+"!!!t.yCREDp;3!!!",
+"!!!!+>AWQGwo!!!!",
+"!!!!!O1am2o!!!!!",
+"!!!!!!r<,e!!!!!!",
+"!!!!!!!!!!!!!!!!",
+"!!!!!!!!!!!!!!!!",
+"!!!!!!!!!!!!!!!!"
+};
diff --git a/mgllab/xpm/weather-clear_old.xpm b/mgllab/xpm/weather-clear_old.xpm
new file mode 100644 (file)
index 0000000..d56582a
--- /dev/null
@@ -0,0 +1,98 @@
+/* XPM */
+static const char *weather_clear_old_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 76 1 ",
+"  c #FCAF3E",
+". c #FBB13E",
+"X c #FBB13F",
+"o c #FCB03E",
+"O c #FCB13E",
+"+ c #FCB23E",
+"@ c #FCB33E",
+"# c #FCB23F",
+"$ c #FCB33F",
+"% c #FAB43F",
+"& c #FBB43F",
+"* c #FCB43F",
+"= c #FAB545",
+"- c #FBB94A",
+"; c #FCB953",
+": c #FBBA57",
+"> c #FCBC57",
+", c #FBBD5B",
+"< c #FBD349",
+"1 c #FCD549",
+"2 c #FCE34E",
+"3 c #FCE956",
+"4 c #FCEA57",
+"5 c #FCE459",
+"6 c #FCE55D",
+"7 c #FCE959",
+"8 c #FCEA5A",
+"9 c #FCC66D",
+"0 c #FCD964",
+"q c #FBDB6C",
+"w c #FCC470",
+"e c #FCC570",
+"r c #FCEB65",
+"t c #FCE768",
+"y c #FCEC68",
+"u c #FCE86E",
+"i c #FCED71",
+"p c #FCCC82",
+"a c #FDCD83",
+"s c #FCCD84",
+"d c #FCEF81",
+"f c #FCEF82",
+"g c #FCEF84",
+"h c #FCEF87",
+"j c #FDF089",
+"k c #FDF08B",
+"l c #FDF08C",
+"z c #FDEAAD",
+"x c #FDF3A1",
+"c c #FDF0A2",
+"v c #FDF3A2",
+"b c #FDF1AA",
+"n c #FCF4AB",
+"m c #FDF4AC",
+"M c #FCF4AD",
+"N c #FDF4AE",
+"B c #FDECB4",
+"V c #FDE6BF",
+"C c #FDF4B0",
+"Z c #FDF5B1",
+"A c #FDF6BE",
+"S c #FDE6C1",
+"D c #FEF8CE",
+"F c #FEF9CF",
+"G c #FEF8D0",
+"H c #FEF9D0",
+"J c #FEF9DF",
+"K c #FEFAE3",
+"L c #FEF8E7",
+"P c #FEF9E7",
+"I c #FEFCEF",
+"U c #FEFCF0",
+"Y c #FEFDF0",
+"T c #FEFCF1",
+"R c #FEFEFB",
+"E c None",
+/* pixels */
+"EEEEEEEEEEEEEEEE",
+"EEEEEEEOOEEEEEEE",
+"EEEEEEE+OEEEEEEE",
+"EEE OEaaw;EOOEEE",
+"EEEO9VPIJz;=OEEE",
+"EEEESRIFCMc=EEEE",
+"EEEaPTIFMjh0OEEE",
+"EOOsTGGAcdyt+OOE",
+"EOOwKCMcji85+OOE",
+"EEE>BMldi84<+EEE",
+"EEEE,bgr442%EEEE",
+"EEEO=-qt61**OEEE",
+"EEEOOEO=+*EOOEEE",
+"EEEEEEEO+EEEEEEE",
+"EEEEEEEO EEEEEEE",
+"EEEEEEEEEEEEEEEE"
+};
diff --git a/mgllab/xpm/weather-clouds.xpm b/mgllab/xpm/weather-clouds.xpm
new file mode 100644 (file)
index 0000000..f5e98eb
--- /dev/null
@@ -0,0 +1,125 @@
+/* XPM */
+static const char *weather_clouds_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 103 2 ",
+"   c #E3960F",
+".  c #E49A0E",
+"X  c #E5A000",
+"o  c #ECA90D",
+"O  c #ECB200",
+"+  c #EEAE13",
+"@  c #F1B210",
+"#  c #F5B715",
+"$  c #EBBC21",
+"%  c #EEB12A",
+"&  c #F7BC24",
+"*  c #FAE318",
+"=  c #FEF21E",
+"-  c #E7D529",
+";  c #EAD636",
+":  c #F8E136",
+">  c #F2ED37",
+",  c #F7E03B",
+"<  c #DAB043",
+"1  c #E9B24E",
+"2  c #EBB55A",
+"3  c #FCEF4B",
+"4  c #FBED4C",
+"5  c #FCF14C",
+"6  c #E9E359",
+"7  c #EAE25F",
+"8  c #DEC57E",
+"9  c #F5D765",
+"0  c #F5D961",
+"q  c #F9E767",
+"w  c #F9E668",
+"e  c #F9E969",
+"r  c #B3B7BB",
+"t  c #B6B9BC",
+"y  c #BCBDBD",
+"u  c #BCBCBE",
+"i  c #F3D38E",
+"p  c #F4D793",
+"a  c #F5DE92",
+"s  c #C0C1C1",
+"d  c #C1C1C1",
+"f  c #C2C2C3",
+"g  c #C4C4C3",
+"h  c #C2C3C4",
+"j  c #C7C7C6",
+"k  c #C6C7C8",
+"l  c #C7C8C8",
+"z  c #C9C9CA",
+"x  c #CCCCCD",
+"c  c #CACCD0",
+"v  c #CDCED1",
+"b  c #CCCFD9",
+"n  c #CFD0D0",
+"m  c #D2D1D2",
+"M  c #D1D2D2",
+"N  c #D3D4D2",
+"B  c #D5D5D4",
+"V  c #D4D4D5",
+"C  c #D4D5D5",
+"Z  c #D5D7D7",
+"A  c #D5D7D9",
+"S  c #D5D8D9",
+"D  c #D7D8DA",
+"F  c #D8D9D9",
+"G  c gray85",
+"H  c #D9D9DA",
+"J  c #DBDADA",
+"K  c #DADADB",
+"L  c #DCDDDB",
+"P  c #DBDBDC",
+"I  c #D9D9DE",
+"U  c #DDDDDE",
+"Y  c #DFDFDE",
+"T  c #DEDFDF",
+"R  c #E0DFDF",
+"E  c #E0E0DF",
+"W  c #CBD1E1",
+"Q  c #D5D9E7",
+"!  c #D9DDE4",
+"~  c #DDDEE4",
+"^  c #DFE1EC",
+"/  c gray88",
+"(  c #E1E1E1",
+")  c #E4E4E3",
+"_  c #E0E3E5",
+"`  c #E5E5E4",
+"'  c #E4E4E5",
+"]  c #E4E4E6",
+"[  c #E7E7E7",
+"{  c #E8E7E7",
+"}  c #E4E5E8",
+"|  c #E7E7E8",
+" . c #E0E3EE",
+".. c #EAEAE9",
+"X. c #EBE9EA",
+"o. c #EBEBEA",
+"O. c #EAEAEB",
+"+. c #ECECEC",
+"@. c #E2E3F4",
+"#. c #EDECF1",
+"$. c #EAE9F4",
+"%. c gray94",
+"&. c None",
+/* pixels */
+"&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.",
+"&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.",
+"&.&.&.&.&.&.&.&.+ % @ &.&.&.&.&.",
+"&.&.&.&.&.&.# 2 p a i 1 &.&.&.&.",
+"&.&.&.&.&.&.  0 w e w 9 . &.&.&.",
+"&.&.&.&.! _ 8 : 5 5 4 , X & &.&.",
+"&.T H ' O.]  .- 6 > = * O o &.&.",
+"/ D A D | O.I ~ @. .7 ; < $ &.&.",
+"&.) +.E [ ../ E R +.$.Q W c &.&.",
+"&.C H ] %.D m P R | E H B B b &.",
+"&.&.z / ..` m H T m m H L C v &.",
+"&.&.&.x l g j f k f u f s u t t ",
+"&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.",
+"&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.",
+"&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.",
+"&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&."
+};
diff --git a/mgllab/xpm/window.xpm b/mgllab/xpm/window.xpm
new file mode 100644 (file)
index 0000000..28ac182
--- /dev/null
@@ -0,0 +1,29 @@
+/* XPM */\r
+static const char * window_xpm[] = {\r
+"16 16 10 1",\r
+"      c None",\r
+".     c #000000",\r
+"+     c #333377",\r
+"@     c #FFFFFF",\r
+"#     c #777777",\r
+"$     c #00007F",\r
+"%     c #4444FF",\r
+"&     c #FF0000",\r
+"*     c #007F00",\r
+"=     c #7F0000",\r
+"                ",\r
+"                ",\r
+"..............  ",\r
+".++++++++++++.  ",\r
+".@@@@@#@@@@@@.  ",\r
+".@$.............",\r
+".@@.%%%%%%%%%%%.",\r
+".@$.@@@@@#@@@@@.",\r
+".@@.@$$@@#@@@@@.",\r
+".@$.@@@@@#@@@@@.",\r
+".@@.@$&*@#@@@@@.",\r
+"....@@@@@#@@@@@.",\r
+"   .@$&=@#@@@@@.",\r
+"   .@@@@@#@@@@@.",\r
+"   .............",\r
+"                "};\r
diff --git a/mgllab/xpm/wire.xpm b/mgllab/xpm/wire.xpm
new file mode 100644 (file)
index 0000000..b67d50b
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static const char * wire_xpm[] = {
+"16 16 2 1",
+"      c None",
+".     c #000000",
+"                ",
+"                ",
+"                ",
+"     .    .     ",
+"     .    .     ",
+"     .    .     ",
+"  ............  ",
+"     .    .     ",
+"     .    .     ",
+"     .    .     ",
+"     .    .     ",
+"  ............  ",
+"     .    .     ",
+"     .    .     ",
+"     .    .     ",
+"                "};
diff --git a/mgllab/xpm/zoom-draw.xpm b/mgllab/xpm/zoom-draw.xpm
new file mode 100644 (file)
index 0000000..c151ca1
--- /dev/null
@@ -0,0 +1,167 @@
+/* XPM */
+static const char *zoom_draw_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 145 2 ",
+"   c #5D6973",
+".  c #626A6F",
+"X  c #686968",
+"o  c #696D6B",
+"O  c #71797E",
+"+  c #6B7682",
+"@  c #757D85",
+"#  c #4E7DB9",
+"$  c #547DB1",
+"%  c #75808C",
+"&  c #7688A1",
+"*  c #7F90A5",
+"=  c #638CC1",
+"-  c #868681",
+";  c #858683",
+":  c #898986",
+">  c #8F908E",
+",  c #808A96",
+"<  c #92979C",
+"1  c #9B9C9A",
+"2  c #9E9E9C",
+"3  c #8394A8",
+"4  c #8296B0",
+"5  c #8D9CB1",
+"6  c #849ABA",
+"7  c #9EA2A8",
+"8  c #9FA9B8",
+"9  c #98AABE",
+"0  c #A6A6A4",
+"q  c #ABACAB",
+"w  c #A3AAB3",
+"e  c #ABAEB1",
+"r  c #ACAFB1",
+"t  c #A0ABB8",
+"y  c #B1B1B1",
+"u  c #BBB9B7",
+"i  c #B3B6B8",
+"p  c #BEC0BE",
+"a  c #8DA7C7",
+"s  c #90A9CA",
+"d  c #B2BAC5",
+"f  c #A0BED7",
+"g  c #A2BFD6",
+"h  c #A6C3D7",
+"j  c #AAC6DA",
+"k  c #AEC8DD",
+"l  c #B4C6E1",
+"z  c #B0C9E2",
+"x  c #B4CBE6",
+"c  c #B8D3EC",
+"v  c #C4C4C1",
+"b  c gray78",
+"n  c #CBCAC7",
+"m  c #CCCCC8",
+"M  c #CDCCCD",
+"N  c #D2D0CD",
+"B  c #C9D2DF",
+"V  c #D1D2D2",
+"C  c #DBD9D3",
+"Z  c #DDDCD7",
+"A  c #E0DFDE",
+"S  c #DFE0DF",
+"D  c #C3D1E4",
+"F  c #C3DBF6",
+"G  c #C2DDFB",
+"H  c #C1DEFA",
+"J  c #C8DEF8",
+"K  c #D9E1E7",
+"L  c #C9E0F6",
+"P  c #C9E1F9",
+"I  c #CFE2F8",
+"U  c #CFE3F9",
+"Y  c #CFE3FB",
+"T  c #CAE4FB",
+"R  c #CFE5F9",
+"E  c #CCE3FC",
+"W  c #CDE7FC",
+"Q  c #CFE7FC",
+"!  c #D0E3F3",
+"~  c #DDE7F7",
+"^  c #D3E6FA",
+"/  c #D0E6FC",
+"(  c #D5E8FB",
+")  c #D6E8FA",
+"_  c #D9EAFA",
+"`  c #DBEAFA",
+"'  c #DDEBFC",
+"]  c #E3E3E2",
+"[  c #E5E5E4",
+"{  c #E8E9E8",
+"}  c gray92",
+"|  c #EEECEC",
+" . c #EEEDED",
+".. c #EFEFEF",
+"X. c #F2EFEF",
+"o. c #F3F2ED",
+"O. c #E1EEFE",
+"+. c #E0F3F9",
+"@. c #E1F3FA",
+"#. c #E5F5FB",
+"$. c #E2F3FF",
+"%. c #E6F7FF",
+"&. c #ECF1F8",
+"*. c #EBFAFB",
+"=. c #ECFBFB",
+"-. c #EFFBFB",
+";. c #EBF8FF",
+":. c #EAFAFF",
+">. c #EEFAFC",
+",. c #F1F0F0",
+"<. c #F1F1F1",
+"1. c gray95",
+"2. c #F3F2F2",
+"3. c #F6F6F6",
+"4. c #F8F7F7",
+"5. c #FAF9F7",
+"6. c #F1F9FA",
+"7. c #F0FAFA",
+"8. c #F0FAFB",
+"9. c #F3FAFB",
+"0. c #F6F9F9",
+"q. c #F5FAFA",
+"w. c #F4FBFA",
+"e. c #F7FAFA",
+"r. c #F6FBFB",
+"t. c #F0FBFC",
+"y. c #F1FBFC",
+"u. c #F3FAFC",
+"i. c #F2F8FF",
+"p. c #F5FBFC",
+"a. c #F7FBFC",
+"s. c #F0FDFF",
+"d. c #F2FEFF",
+"f. c #F7FFFF",
+"g. c #F9F9F9",
+"h. c #FAF9F9",
+"j. c #F8FBFB",
+"k. c gray98",
+"l. c #FCFBFB",
+"z. c #F8FFFF",
+"x. c #FBFFFF",
+"c. c #FCFFFF",
+"v. c #FDFFFF",
+"b. c white",
+"n. c None",
+/* pixels */
+"n.n.n.n.n.A e 7 i v n.n.n.n.n.n.",
+"n.b.b.5.w d &.i.B t e n.n.n.n.n.",
+"n.b.c 5 O._ _ ) ) I D < n.n.n.n.",
+"n.b.t I / / W W P H ~ 6 m n.n.n.",
+"n.o.s x z k j h h f K a , n.n.n.",
+"n.Z = ' ;.f.x.b.x.x.;.E * n.n.n.",
+"n.N # P @.>.8.9.8.>.=./ 3 n.n.n.",
+"n.C $ P #.t.t.a.9.8.>.( % n.n.n.",
+"n.4.& J +.8.w.k.k.9.8.F : n.n.n.",
+"n.b.9 l L >.8.9.k.k.$.@ 2.n.n.n.",
+"n.b.n 0 3 G %.s.s.! O 2 { n.n.n.",
+"n.n.n.b.u o   + . - } V q n.n.n.",
+"n.n.n.b.k.b.k.,.b.k.3.M S 2 n.n.",
+"n.n.n.b.,.,.,.X.| | | | b [ > n.",
+"n.n.n.b.b.b.b.b.b.b.b.b.b.X ] - ",
+"n.n.n.n.n.n.n.n.n.n.n.n.n.n.y p "
+};
diff --git a/mgllab/xpm/zoom-in.xpm b/mgllab/xpm/zoom-in.xpm
new file mode 100644 (file)
index 0000000..7cf298a
--- /dev/null
@@ -0,0 +1,124 @@
+/* XPM */
+static const char *zoom_in_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 102 2 ",
+"   c #223449",
+".  c #314156",
+"X  c #3B5373",
+"o  c #3C5270",
+"O  c #3B5575",
+"+  c #5B5D5A",
+"@  c #5E5F5A",
+"#  c #475E7B",
+"$  c #5D6871",
+"%  c #64696B",
+"&  c #646C73",
+"*  c #65717E",
+"=  c #7F7F7B",
+"-  c #4F6683",
+";  c #5C799D",
+":  c #687C93",
+">  c #78848E",
+",  c #6E8096",
+"<  c #7F8D9D",
+"1  c #5D84BC",
+"2  c #6782A7",
+"3  c #6784A5",
+"4  c #7F8FA5",
+"5  c #718DAC",
+"6  c #738EAC",
+"7  c #6C8DBC",
+"8  c #718CB0",
+"9  c #718DB5",
+"0  c #7C95B3",
+"q  c #7BAEE6",
+"w  c #7FB1EB",
+"e  c #8F908B",
+"r  c #8F918E",
+"t  c #8D959E",
+"y  c #9C9D9A",
+"u  c gray61",
+"i  c #979CA2",
+"p  c #929CA8",
+"a  c #9CA6B4",
+"s  c #9AA6B9",
+"d  c #98A8BE",
+"f  c #A1A5AA",
+"g  c #AAABA9",
+"h  c #A9AEB7",
+"j  c #AFB2B5",
+"k  c #A7B1BD",
+"l  c #B8B7B2",
+"z  c #B3B6B9",
+"x  c #B6B9BB",
+"c  c #BBBBBA",
+"v  c #C3C1BE",
+"b  c #C5C4BF",
+"n  c #94A8C0",
+"m  c #B4B9C0",
+"M  c #A2B8D7",
+"N  c #ABBDD3",
+"B  c #8FBEEE",
+"V  c #92B9E8",
+"C  c #A8CEEF",
+"Z  c #AFD3F8",
+"A  c #B9DBF6",
+"S  c #C8C8C8",
+"D  c #CDCDCA",
+"F  c #CCCDCC",
+"G  c #D2D3D2",
+"H  c #D9DAD9",
+"J  c #DCDDDC",
+"K  c #CDD7E5",
+"L  c #C6D4E9",
+"P  c #C5D5EB",
+"I  c #C1D7F3",
+"U  c #C8DAF2",
+"Y  c #C2E4F7",
+"T  c #D0E1F5",
+"R  c #DCE6F3",
+"E  c #D9E6F6",
+"W  c #DAE7F7",
+"Q  c #D8E9F9",
+"!  c #DEEBF9",
+"~  c #D1F0FF",
+"^  c #D9F0FF",
+"/  c #DFF2FF",
+"(  c #E9E9E7",
+")  c #ECEBE9",
+"_  c #E0E7F0",
+"`  c #E3ECF8",
+"'  c #E8F6FF",
+"]  c #E9F6FF",
+"[  c #EBF6FF",
+"{  c #E7FFFF",
+"}  c #EFF8FF",
+"|  c #EAFCFF",
+" . c #EDFFFF",
+".. c #EEFFFF",
+"X. c #F0FEFF",
+"o. c #F1FFFF",
+"O. c #F3FFFF",
+"+. c #FAFFFF",
+"@. c #FDFFFF",
+"#. c #FEFFFF",
+"$. c white",
+"%. c None",
+/* pixels */
+"%.%.%.%.( z f j D %.%.%.%.%.%.%.",
+"%.%.) h k _ +.K s i %.%.%.%.%.%.",
+"%.%.a R ` X.o ] E P t %.%.%.%.%.",
+"%.m L E ! ] 0 ] Q T M x %.%.%.%.",
+"%.d U / | $.5 %...} A t %.%.%.%.",
+"b 7 ^ . - # n X O   ~ 2 %.%.%.%.",
+"l 1 C { ..$.5 %...O.Y 8 %.%.%.%.",
+"%.9 q %.%.%.3 %.%.%.%., %.%.%.%.",
+"%.p V %.%.%.; %.%.%.Z % %.%.%.%.",
+"%.v N B %.%.$.%.%.%.< %.%.%.%.%.",
+"%.%.e : w %.%.%.A > = %.%.%.%.%.",
+"%.%.%.%.+ $ * & @ %.S c %.%.%.%.",
+"%.%.%.%.%.%.%.%.%.%.%.G g %.%.%.",
+"%.%.%.%.%.%.%.%.%.%.%.%.H y %.%.",
+"%.%.%.%.%.%.%.%.%.%.%.%.%.J r %.",
+"%.%.%.%.%.%.%.%.%.%.%.%.%.u F %."
+};
diff --git a/mgllab/xpm/zoom-original.xpm b/mgllab/xpm/zoom-original.xpm
new file mode 100644 (file)
index 0000000..3d3473f
--- /dev/null
@@ -0,0 +1,117 @@
+/* XPM */
+static const char *zoom_original_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 95 2 ",
+"   c #324866",
+".  c #334968",
+"X  c #354A69",
+"o  c #3D526F",
+"O  c #5B5C58",
+"+  c #5D5E58",
+"@  c #5D6770",
+"#  c #64696A",
+"$  c #636B72",
+"%  c #64707D",
+"&  c #7E7E79",
+"*  c #5B769A",
+"=  c #5D799D",
+"-  c #5F799F",
+";  c #5E7A9F",
+":  c #667B92",
+">  c #617C9F",
+",  c #647FA4",
+"<  c #75818D",
+"1  c #6E8096",
+"2  c #7D8C9C",
+"3  c #5C84BC",
+"4  c #6682A6",
+"5  c #6782A8",
+"6  c #6A84A8",
+"7  c #7F8FA4",
+"8  c #7E99A8",
+"9  c #6F8BB4",
+"0  c #6A8ABB",
+"q  c #728EB2",
+"w  c #76AEED",
+"e  c #7CB0E8",
+"r  c #92928C",
+"t  c #8C949D",
+"y  c #919390",
+"u  c gray61",
+"i  c #9E9F9C",
+"p  c #969BA1",
+"a  c #939CA8",
+"s  c #89A0B4",
+"d  c #97A3B7",
+"f  c #9AA4B3",
+"g  c #95A6BC",
+"h  c #A1A5AA",
+"j  c #ADAEAB",
+"k  c #A8ADB6",
+"l  c #A3AEBA",
+"z  c #AFB2B5",
+"x  c #B8B7B2",
+"c  c #B3B6B9",
+"v  c #B9BBBD",
+"b  c #BFBFBE",
+"n  c #C5C4BF",
+"m  c #B5BAC0",
+"M  c #A0B7D8",
+"N  c #91B9E9",
+"B  c #AEC0D6",
+"V  c #A4CBF2",
+"C  c #B0D5FD",
+"Z  c #C9C7C3",
+"A  c #CDCDCA",
+"S  c #CCCDCC",
+"D  c #CDCDCD",
+"F  c #D8D9D8",
+"G  c #DFE0DF",
+"H  c #CFD9E6",
+"J  c #C6D4EA",
+"K  c #C6D7ED",
+"L  c #C3DAF7",
+"P  c #C4DAF6",
+"I  c #CCDEF5",
+"U  c #D1E2F6",
+"Y  c #DAE7F7",
+"T  c #DDE8F5",
+"R  c #DBE8F9",
+"E  c #E2E3E2",
+"W  c #E9E9E7",
+"Q  c #E2E9F1",
+"!  c #E3EDF9",
+"~  c #E1ECFA",
+"^  c #E2EFFB",
+"/  c #E4EDF9",
+"(  c #E4EEF9",
+")  c #E0F0FA",
+"_  c #E2F0FB",
+"`  c #E7F9FF",
+"'  c #E9FAFF",
+"]  c #ECF9FF",
+"[  c #F4F3F0",
+"{  c #F3F9FF",
+"}  c #F5FFFF",
+"|  c #FAFFFF",
+" . c #FEFFFF",
+".. c white",
+"X. c None",
+/* pixels */
+"X.X.X.X.W c h z A X.X.X.X.X.X.X.",
+"X.X.[ k l Q { H d p X.X.X.X.X.X.",
+"X.X.f T / / / ~ R K t X.X.X.X.X.",
+"X.m J Y ] ^ ) ) ' U M v X.X.X.X.",
+"X.g I ' . | |  .X } P 7 X.X.X.X.",
+"n 0 L s 6 X.o 8 4 X.V 5 X.X.X.X.",
+"x 3 X. .= X. . .= X.X.q X.X.X.X.",
+"X.9 e X.> X.  X.4 X.X.1 X.X.X.X.",
+"X.a N X.* X. .X.= X.C # X.X.X.X.",
+"X.Z B X. .X.X.X. .X.2 X.X.X.X.X.",
+"X.X.r : w X.X.X.X.< & X.X.X.X.X.",
+"X.X.X.X.+ @ % $ + X.D b X.X.X.X.",
+"X.X.X.X.X.X.X.X.X.X.X.F j X.X.X.",
+"X.X.X.X.X.X.X.X.X.X.X.X.E i X.X.",
+"X.X.X.X.X.X.X.X.X.X.X.X.X.E y X.",
+"X.X.X.X.X.X.X.X.X.X.X.X.X.u D X."
+};
diff --git a/mgllab/xpm/zoom-out.xpm b/mgllab/xpm/zoom-out.xpm
new file mode 100644 (file)
index 0000000..726983a
--- /dev/null
@@ -0,0 +1,123 @@
+/* XPM */
+static const char *zoom_out_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 101 2 ",
+"   c #1A2B41",
+".  c #26364D",
+"X  c #324D6F",
+"o  c #375171",
+"O  c #3F5776",
+"+  c #5B5B55",
+"@  c #5D5D59",
+"#  c #5B5E5C",
+"$  c #445B7A",
+"%  c #485F7E",
+"&  c #5F6974",
+"*  c #636A6F",
+"=  c #636F7B",
+"-  c #64717D",
+";  c #6D757A",
+":  c #61748F",
+">  c #707981",
+",  c #667891",
+"<  c #6780A1",
+"1  c #4F81C6",
+"2  c #5F88C1",
+"3  c #698FC7",
+"4  c #848582",
+"5  c #8A8B87",
+"6  c #8C8C8A",
+"7  c #8E8F8C",
+"8  c #848E99",
+"9  c #959A9F",
+"0  c #989898",
+"q  c #999A98",
+"w  c #8E9AAD",
+"e  c #9A9EA2",
+"r  c #8A9BB2",
+"t  c #939EB2",
+"y  c #9CA4AF",
+"u  c #AEACA5",
+"i  c #A1A5AB",
+"p  c #A9AAA8",
+"a  c #A6AEBA",
+"s  c #ACB0B4",
+"d  c gray70",
+"f  c #B6B5B3",
+"g  c #B6B9BA",
+"h  c #BEBFBC",
+"j  c #C2C3BF",
+"k  c #8DA3C3",
+"l  c #92A7C5",
+"z  c #ACB5C2",
+"x  c #A3BADA",
+"c  c #B6C7DF",
+"v  c #A0C3EF",
+"b  c #ADC9EF",
+"n  c #B1D0EC",
+"m  c #A3C6F0",
+"M  c #AFD5F4",
+"N  c #ABD3F8",
+"B  c #CACAC7",
+"V  c #CCCBC8",
+"C  c #CCCCC8",
+"Z  c #D5D3CD",
+"A  c #C3CDDC",
+"S  c #D7D7D7",
+"D  c #CADCF3",
+"F  c #CFE1F5",
+"G  c #C1E4FA",
+"H  c #CAE9FF",
+"J  c #CDEEFF",
+"K  c #D7E4F7",
+"L  c #DAE7F6",
+"P  c #D6E7F8",
+"I  c #DCE9F9",
+"U  c #DEECFA",
+"Y  c #DFEEFA",
+"T  c #E1E2E1",
+"R  c gray89",
+"E  c #E7E7E3",
+"W  c #E6E6E4",
+"Q  c #ECEBE9",
+"!  c #E0EBF9",
+"~  c #E3EDF9",
+"^  c #E2EFFA",
+"/  c #E5EDF9",
+"(  c #E5EEF9",
+")  c #E2F1FB",
+"_  c #E0F7FF",
+"`  c #E5F7FF",
+"'  c #EAF1F9",
+"]  c #E9F2FD",
+"[  c #EFFFFF",
+"{  c #F0F5FF",
+"}  c azure",
+"|  c #F1FFFF",
+" . c #F4FFFF",
+".. c #F5FFFF",
+"X. c #F6FFFF",
+"o. c #F7FFFF",
+"O. c #F8FFFF",
+"+. c #F9FFFF",
+"@. c #FAFFFF",
+"#. c #FDFFFF",
+"$. c None",
+/* pixels */
+"$.$.$.$.$.T s i g V $.$.$.$.$.$.",
+"$.$.$.Q y z ' { A t e $.$.$.$.$.",
+"$.$.E w ] / / / ! U c 9 $.$.$.$.",
+"$.$.a K L U ) ) Y P D k C $.$.$.",
+"$.Z l D ` } O.#.O.} ..b 8 $.$.$.",
+"$.j 3 _ . % $ O o X   J : $.$.$.",
+"$.f 1 M [ ....O.O.O.O.G , $.$.$.",
+"$.u 2 $.$.$.$.$.$.$.$.N - $.$.$.",
+"$.$.r v $.$.$.$.$.$.$.m @ $.$.$.",
+"$.$.B x $.$.$.$.$.$.H > $.$.$.$.",
+"$.$.$.6 < $.$.$.$.n ; 5 $.$.$.$.",
+"$.$.$.$.$.# & - * + $.S p $.$.$.",
+"$.$.$.$.$.$.$.$.$.$.$.$.R q $.$.",
+"$.$.$.$.$.$.$.$.$.$.$.$.$.W 7 $.",
+"$.$.$.$.$.$.$.$.$.$.$.$.$.q T 4 ",
+"$.$.$.$.$.$.$.$.$.$.$.$.$.$.d h "
+};
diff --git a/mgllab/xpm/zoom_1.xpm b/mgllab/xpm/zoom_1.xpm
new file mode 100644 (file)
index 0000000..c6015ea
--- /dev/null
@@ -0,0 +1,22 @@
+/* XPM */
+static const char * zoom_1_xpm[] = {
+"16 16 3 1",
+".     c None",
+"+     c #7F0000",
+"@     c #FF0000",
+"................",
+"................",
+"......++++......",
+"......+@@+......",
+"......+@@+......",
+"......+@@+......",
+"......+@@+......",
+".++++++@@++++++.",
+".+@@@@@@@@@@@@+.",
+".+@@@@@@@@@@@@+.",
+".++++++@@++++++.",
+"......+@@+......",
+"......+@@+......",
+"......+@@+......",
+"......+@@+......",
+"......++++......"};
diff --git a/mgllab/xpm/zoom_in.xpm b/mgllab/xpm/zoom_in.xpm
new file mode 100644 (file)
index 0000000..22e285b
--- /dev/null
@@ -0,0 +1,124 @@
+/* XPM */
+static const char * zoom_in_xpm[] = {
+"16 16 105 2",
+"      c None",
+".     c #878B87",
+"+     c #868C8A",
+"@     c #888B89",
+"#     c #ACB6BF",
+"$     c #CDD6DD",
+"%     c #E4E7E9",
+"&     c #929594",
+"*     c #CFD8E0",
+"=     c #D3DDE5",
+"-     c #A4BFDC",
+";     c #99B9DA",
+">     c #9AB9DA",
+",     c #A4BFDD",
+"'     c #CFDAE5",
+")     c #B4C9DF",
+"!     c #9DBDDD",
+"~     c #B5CDE6",
+"{     c #5C84B8",
+"]     c #5B84B8",
+"^     c #B0CAE4",
+"/     c #9ABADD",
+"(     c #98B9DC",
+"_     c #BCD1E8",
+":     c #5F87B9",
+"<     c #FFFFFF",
+"[     c #5A84B7",
+"}     c #ABC6E2",
+"|     c #91B4DA",
+"1     c #868C8B",
+"2     c #9DBBDA",
+"3     c #B6CDE6",
+"4     c #5D85B8",
+"5     c #5E86B8",
+"6     c #5982B7",
+"7     c #5781B6",
+"8     c #9FBDDE",
+"9     c #9EBBDA",
+"0     c #878B88",
+"a     c #8EB2D6",
+"b     c #5983B7",
+"c     c #507DB4",
+"d     c #86ACD4",
+"e     c #89AED4",
+"f     c #4E7BB3",
+"g     c #4A78B2",
+"h     c #878C8B",
+"i     c #CFD8DE",
+"j     c #A7C1DD",
+"k     c #86ADD6",
+"l     c #4F7CB3",
+"m     c #89AED6",
+"n     c #A9C3DE",
+"o     c #D0D8DE",
+"p     c #888B87",
+"q     c #B1BAC1",
+"r     c #D9E1E8",
+"s     c #94B6DA",
+"t     c #96B7DB",
+"u     c #527EB5",
+"v     c #537EB5",
+"w     c #97B8DB",
+"x     c #DAE2E8",
+"y     c #B2BBC1",
+"z     c #8A8C8A",
+"A     c #D7DDE2",
+"B     c #CAD8E6",
+"C     c #A4C0DF",
+"D     c #A6C2E0",
+"E     c #A7C3E1",
+"F     c #D8DEE3",
+"G     c #949895",
+"H     c #DADFE3",
+"I     c #E1E6EA",
+"J     c #C7D7E8",
+"K     c #BDD2E6",
+"L     c #BED2E6",
+"M     c #C8D8E8",
+"N     c #DFE5EA",
+"O     c #DBE0E4",
+"P     c #959896",
+"Q     c #9DA09B",
+"R     c #60625F",
+"S     c #8A8D8A",
+"T     c #BCC1C4",
+"U     c #DCE0E2",
+"V     c #E9EBEB",
+"W     c #BDC2C5",
+"X     c #898C88",
+"Y     c #878A84",
+"Z     c #B9BCB6",
+"`     c #BDBFBC",
+" .    c #61635F",
+"..    c #8A8C88",
+"+.    c #8D918D",
+"@.    c #8B8D89",
+"#.    c #8E918D",
+"$.    c #575955",
+"%.    c #7A7B78",
+"&.    c #B7B8B6",
+"*.    c #595B57",
+"=.    c #555753",
+"-.    c #767873",
+";.    c #A0A29F",
+">.    c #565854",
+"        . + . . + .             ",
+"      @ # $ % % $ # @           ",
+"    & * = - ; > , ' * &         ",
+"  @ * ) ! ~ { ] ^ / ) * @       ",
+". # ' ( _ : < < [ } | ' # .     ",
+"1 $ 2 3 4 5 < < 6 7 8 9 $ +     ",
+"0 % a b < < < < < < c d % .     ",
+"0 % e f < < < < < < g e % .     ",
+"h i j k f f < < l f m n o h     ",
+"p q r s t u < < v ( w x y p     ",
+"  z A B C D 7 7 E D B F .       ",
+"    G H I J K L M N O P Q R     ",
+"      S T U V V U W X Y Z `  .  ",
+"        ..+.@.@.#...  $.%.Y &.*.",
+"                        =.-.;.*.",
+"                          =.>.  "};
diff --git a/mgllab/xpm/zoom_out.xpm b/mgllab/xpm/zoom_out.xpm
new file mode 100644 (file)
index 0000000..82b040e
--- /dev/null
@@ -0,0 +1,130 @@
+/* XPM */
+static const char * zoom_out_xpm[] = {
+"16 16 111 2",
+"      c None",
+".     c #878B87",
+"+     c #868C8A",
+"@     c #888B89",
+"#     c #ACB6BF",
+"$     c #CDD6DD",
+"%     c #E4E7E9",
+"&     c #929594",
+"*     c #CFD8E0",
+"=     c #D3DDE5",
+"-     c #A4BFDC",
+";     c #99B9DA",
+">     c #9AB9DA",
+",     c #A4BFDD",
+"'     c #CFDAE5",
+")     c #B4C9DF",
+"!     c #9DBDDD",
+"~     c #B5CDE6",
+"{     c #5C84B8",
+"]     c #5B84B8",
+"^     c #B0CAE4",
+"/     c #9ABADD",
+"(     c #98B9DC",
+"_     c #BCD1E8",
+":     c #5F87B9",
+"<     c #FFFFFF",
+"[     c #5A84B7",
+"}     c #ABC6E2",
+"|     c #91B4DA",
+"1     c #868C8B",
+"2     c #9DBBDA",
+"3     c #B6CDE6",
+"4     c #5D85B8",
+"5     c #5982B7",
+"6     c #A7C3E1",
+"7     c #9FBDDE",
+"8     c #9EBBDA",
+"9     c #878B88",
+"0     c #8EB2D6",
+"a     c #5A83B7",
+"b     c #5681B6",
+"c     c #9EBDDE",
+"d     c #86ACD4",
+"e     c #89AED4",
+"f     c #8AAFD7",
+"g     c #94B6DB",
+"h     c #547FB5",
+"i     c #507DB4",
+"j     c #85ACD5",
+"k     c #7BA5D2",
+"l     c #878C8B",
+"m     c #CFD8DE",
+"n     c #A7C1DD",
+"o     c #86ADD6",
+"p     c #89AED6",
+"q     c #4E7BB3",
+"r     c #4F7CB3",
+"s     c #8BB0D7",
+"t     c #A9C3DE",
+"u     c #D0D8DE",
+"v     c #888B87",
+"w     c #B1BAC1",
+"x     c #D9E1E8",
+"y     c #94B6DA",
+"z     c #96B7DB",
+"A     c #527EB5",
+"B     c #537EB5",
+"C     c #97B8DB",
+"D     c #DAE2E8",
+"E     c #B2BBC1",
+"F     c #8A8C8A",
+"G     c #D7DDE2",
+"H     c #CAD8E6",
+"I     c #A4C0DF",
+"J     c #A6C2E0",
+"K     c #5781B6",
+"L     c #D8DEE3",
+"M     c #949895",
+"N     c #DADFE3",
+"O     c #E1E6EA",
+"P     c #C7D7E8",
+"Q     c #BDD2E6",
+"R     c #BED2E6",
+"S     c #C8D8E8",
+"T     c #DFE5EA",
+"U     c #DBE0E4",
+"V     c #959896",
+"W     c #9DA09B",
+"X     c #60625F",
+"Y     c #8A8D8A",
+"Z     c #BCC1C4",
+"`     c #DCE0E2",
+" .    c #E9EBEB",
+"..    c #BDC2C5",
+"+.    c #898C88",
+"@.    c #878A84",
+"#.    c #B9BCB6",
+"$.    c #BDBFBC",
+"%.    c #61635F",
+"&.    c #8A8C88",
+"*.    c #8D918D",
+"=.    c #8B8D89",
+"-.    c #8E918D",
+";.    c #575955",
+">.    c #7A7B78",
+",.    c #B7B8B6",
+"'.    c #595B57",
+").    c #555753",
+"!.    c #767873",
+"~.    c #A0A29F",
+"{.    c #565854",
+"        . + . . + .             ",
+"      @ # $ % % $ # @           ",
+"    & * = - ; > , ' * &         ",
+"  @ * ) ! ~ { ] ^ / ) * @       ",
+". # ' ( _ : < < [ } | ' # .     ",
+"1 $ 2 3 4 < < < 5 6 7 8 $ +     ",
+"9 % 0 ^ [ a < < b c | d % .     ",
+"9 % e f g h < < i j k e % .     ",
+"l m n o p q < < r s p t u l     ",
+"v w x y z A < < B ( C D E v     ",
+"  F G H I J K K 6 J H L .       ",
+"    M N O P Q R S T U V W X     ",
+"      Y Z `  . .` ..+.@.#.$.%.  ",
+"        &.*.=.=.-.&.  ;.>.@.,.'.",
+"                        ).!.~.'.",
+"                          ).{.  "};
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})")
diff --git a/scripts/CMakeLists.txt b/scripts/CMakeLists.txt
new file mode 100644 (file)
index 0000000..4f1a80c
--- /dev/null
@@ -0,0 +1,33 @@
+if(enable-dep-dll)
+       if(enable-qt5)
+               find_package(Qt5Gui QUIET)
+               if(Qt5Gui_FOUND)
+                       get_target_property(mgl_qt_loc Qt5::QWindowsIntegrationPlugin LOCATION)
+               endif(Qt5Gui_FOUND)
+       endif(enable-qt5)
+
+       install(CODE "SET(mgl_qt_loc \"${mgl_qt_loc}\")")
+       install(CODE "SET(CMAKE_INSTALL_PREFIX \"${CMAKE_INSTALL_PREFIX}\")")
+       install(SCRIPT install-deps.cmake)
+endif(enable-dep-dll)
+
+if(WIN32)
+   set(dest ${CMAKE_INSTALL_PREFIX})
+#      install(FILES ${CMAKE_SOURCE_DIR}/scripts/FindMathGL2.cmake DESTINATION ${CMAKE_INSTALL_PREFIX} RENAME mathgl2-config.cmake)
+else(WIN32)
+   set(dest ${MathGL_INSTALL_LIB_DIR}/cmake/mathgl2/)
+#      install(FILES ${CMAKE_SOURCE_DIR}/scripts/FindMathGL2.cmake DESTINATION ${MathGL_INSTALL_LIB_DIR}/cmake/mathgl2/ RENAME mathgl2-config.cmake)
+endif(WIN32)
+
+#export(TARGETS MathGLTargets FILE "${PROJECT_BINARY_DIR}/MathGL2Targets.cmake")
+export(PACKAGE MathGL2)
+
+configure_file(MathGLConfig.cmake.in "${MathGL2_BINARY_DIR}/MathGL2Config.cmake" @ONLY)
+configure_file(MathGLConfigVersion.cmake.in "${MathGL2_BINARY_DIR}/MathGL2ConfigVersion.cmake" @ONLY)
+
+install(FILES
+       "${MathGL2_BINARY_DIR}/MathGL2Config.cmake"
+       "${MathGL2_BINARY_DIR}/MathGL2ConfigVersion.cmake"
+       DESTINATION "${MathGL_INSTALL_CMAKE_DIR}" COMPONENT dev)
+
+install(EXPORT MathGLTargets DESTINATION "${MathGL_INSTALL_CMAKE_DIR}" COMPONENT dev)
diff --git a/scripts/CodeCoverage.cmake b/scripts/CodeCoverage.cmake
new file mode 100644 (file)
index 0000000..8971d78
--- /dev/null
@@ -0,0 +1,234 @@
+# Copyright (c) 2012 - 2017, Lars Bilke
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without modification,
+# are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright notice, this
+#    list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright notice,
+#    this list of conditions and the following disclaimer in the documentation
+#    and/or other materials provided with the distribution.
+#
+# 3. Neither the name of the copyright holder nor the names of its contributors
+#    may be used to endorse or promote products derived from this software without
+#    specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# CHANGES:
+#
+# 2012-01-31, Lars Bilke
+# - Enable Code Coverage
+#
+# 2013-09-17, Joakim Söderberg
+# - Added support for Clang.
+# - Some additional usage instructions.
+#
+# 2016-02-03, Lars Bilke
+# - Refactored functions to use named parameters
+#
+# 2017-06-02, Lars Bilke
+# - Merged with modified version from github.com/ufz/ogs
+#
+#
+# USAGE:
+#
+# 1. Copy this file into your cmake modules path.
+#
+# 2. Add the following line to your CMakeLists.txt:
+#      include(CodeCoverage)
+#
+# 3. Append necessary compiler flags:
+#      APPEND_COVERAGE_COMPILER_FLAGS()
+#
+# 4. If you need to exclude additional directories from the report, specify them
+#    using the COVERAGE_EXCLUDES variable before calling SETUP_TARGET_FOR_COVERAGE.
+#    Example:
+#      set(COVERAGE_EXCLUDES 'dir1/*' 'dir2/*')
+#
+# 5. Use the functions described below to create a custom make target which
+#    runs your test executable and produces a code coverage report.
+#
+# 6. Build a Debug build:
+#      cmake -DCMAKE_BUILD_TYPE=Debug ..
+#      make
+#      make my_coverage_target
+#
+
+include(CMakeParseArguments)
+
+# Check prereqs
+find_program( GCOV_PATH gcov )
+find_program( LCOV_PATH lcov )
+find_program( GENHTML_PATH genhtml )
+find_program( GCOVR_PATH gcovr PATHS ${CMAKE_SOURCE_DIR}/scripts/test)
+find_program( SIMPLE_PYTHON_EXECUTABLE python )
+
+if(NOT GCOV_PATH)
+    message(FATAL_ERROR "gcov not found! Aborting...")
+endif() # NOT GCOV_PATH
+
+if("${CMAKE_CXX_COMPILER_ID}" MATCHES "(Apple)?[Cc]lang")
+    if("${CMAKE_CXX_COMPILER_VERSION}" VERSION_LESS 3)
+        message(FATAL_ERROR "Clang version must be 3.0.0 or greater! Aborting...")
+    endif()
+elseif(NOT CMAKE_COMPILER_IS_GNUCXX)
+    message(FATAL_ERROR "Compiler is not GNU gcc! Aborting...")
+endif()
+
+set(COVERAGE_COMPILER_FLAGS "-g -O0 --coverage -fprofile-arcs -ftest-coverage"
+    CACHE INTERNAL "")
+
+set(CMAKE_CXX_FLAGS_COVERAGE
+    ${COVERAGE_COMPILER_FLAGS}
+    CACHE STRING "Flags used by the C++ compiler during coverage builds."
+    FORCE )
+set(CMAKE_C_FLAGS_COVERAGE
+    ${COVERAGE_COMPILER_FLAGS}
+    CACHE STRING "Flags used by the C compiler during coverage builds."
+    FORCE )
+set(CMAKE_EXE_LINKER_FLAGS_COVERAGE
+    ""
+    CACHE STRING "Flags used for linking binaries during coverage builds."
+    FORCE )
+set(CMAKE_SHARED_LINKER_FLAGS_COVERAGE
+    ""
+    CACHE STRING "Flags used by the shared libraries linker during coverage builds."
+    FORCE )
+mark_as_advanced(
+    CMAKE_CXX_FLAGS_COVERAGE
+    CMAKE_C_FLAGS_COVERAGE
+    CMAKE_EXE_LINKER_FLAGS_COVERAGE
+    CMAKE_SHARED_LINKER_FLAGS_COVERAGE )
+
+if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
+    message(WARNING "Code coverage results with an optimised (non-Debug) build may be misleading")
+endif() # NOT CMAKE_BUILD_TYPE STREQUAL "Debug"
+
+if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
+    link_libraries(gcov)
+else()
+    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage")
+endif()
+
+# Defines a target for running and collection code coverage information
+# Builds dependencies, runs the given executable and outputs reports.
+# NOTE! The executable should always have a ZERO as exit code otherwise
+# the coverage generation will not complete.
+#
+# SETUP_TARGET_FOR_COVERAGE(
+#     NAME testrunner_coverage                    # New target name
+#     EXECUTABLE testrunner -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR
+#     DEPENDENCIES testrunner                     # Dependencies to build first
+# )
+function(SETUP_TARGET_FOR_COVERAGE)
+
+    set(options NONE)
+    set(oneValueArgs NAME)
+    set(multiValueArgs EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES)
+    cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
+
+    if(NOT LCOV_PATH)
+        message(FATAL_ERROR "lcov not found! Aborting...")
+    endif() # NOT LCOV_PATH
+
+    if(NOT GENHTML_PATH)
+        message(FATAL_ERROR "genhtml not found! Aborting...")
+    endif() # NOT GENHTML_PATH
+
+    # Setup target
+    add_custom_target(${Coverage_NAME}
+
+        # Cleanup lcov
+        COMMAND ${LCOV_PATH} --directory . --zerocounters
+
+        # Run tests
+        COMMAND ${Coverage_EXECUTABLE}
+
+        # Capturing lcov counters and generating report
+        COMMAND ${LCOV_PATH} --directory . --capture --output-file ${Coverage_NAME}.info
+        COMMAND ${LCOV_PATH} --remove ${Coverage_NAME}.info ${COVERAGE_EXCLUDES} --output-file ${Coverage_NAME}.info.cleaned
+        COMMAND ${GENHTML_PATH} -o ${Coverage_NAME} ${Coverage_NAME}.info.cleaned
+        COMMAND ${CMAKE_COMMAND} -E remove ${Coverage_NAME}.info ${Coverage_NAME}.info.cleaned
+
+        WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
+        DEPENDS ${Coverage_DEPENDENCIES}
+        COMMENT "Resetting code coverage counters to zero.\nProcessing code coverage counters and generating report."
+    )
+
+    # Show info where to find the report
+    add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
+        COMMAND ;
+        COMMENT "Open ./${Coverage_NAME}/index.html in your browser to view the coverage report."
+    )
+
+endfunction() # SETUP_TARGET_FOR_COVERAGE
+
+# Defines a target for running and collection code coverage information
+# Builds dependencies, runs the given executable and outputs reports.
+# NOTE! The executable should always have a ZERO as exit code otherwise
+# the coverage generation will not complete.
+#
+# SETUP_TARGET_FOR_COVERAGE_COBERTURA(
+#     NAME ctest_coverage                    # New target name
+#     EXECUTABLE ctest -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR
+#     DEPENDENCIES executable_target         # Dependencies to build first
+# )
+function(SETUP_TARGET_FOR_COVERAGE_COBERTURA)
+
+    set(options NONE)
+    set(oneValueArgs NAME)
+    set(multiValueArgs EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES)
+    cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
+
+    if(NOT SIMPLE_PYTHON_EXECUTABLE)
+        message(FATAL_ERROR "python not found! Aborting...")
+    endif() # NOT SIMPLE_PYTHON_EXECUTABLE
+
+    if(NOT GCOVR_PATH)
+        message(FATAL_ERROR "gcovr not found! Aborting...")
+    endif() # NOT GCOVR_PATH
+
+    # Combine excludes to several -e arguments
+    set(COBERTURA_EXCLUDES "")
+    foreach(EXCLUDE ${COVERAGE_EXCLUDES})
+        set(COBERTURA_EXCLUDES "-e ${EXCLUDE} ${COBERTURA_EXCLUDES}")
+    endforeach()
+
+    add_custom_target(${Coverage_NAME}
+
+        # Run tests
+        ${Coverage_EXECUTABLE}
+
+        # Running gcovr
+        COMMAND ${GCOVR_PATH} -x -r ${CMAKE_SOURCE_DIR} ${COBERTURA_EXCLUDES}
+            -o ${Coverage_NAME}.xml
+        WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
+        DEPENDS ${Coverage_DEPENDENCIES}
+        COMMENT "Running gcovr to produce Cobertura code coverage report."
+    )
+
+    # Show info where to find the report
+    add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
+        COMMAND ;
+        COMMENT "Cobertura code coverage report saved in ${Coverage_NAME}.xml."
+    )
+
+endfunction() # SETUP_TARGET_FOR_COVERAGE_COBERTURA
+
+function(APPEND_COVERAGE_COMPILER_FLAGS)
+    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE)
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE)
+    message(STATUS "Appending code coverage compiler flags: ${COVERAGE_COMPILER_FLAGS}")
+endfunction() # APPEND_COVERAGE_COMPILER_FLAGS
diff --git a/scripts/FindMathGL2.cmake b/scripts/FindMathGL2.cmake
new file mode 100644 (file)
index 0000000..2003379
--- /dev/null
@@ -0,0 +1,148 @@
+# - 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 REQUIRED Qt)           - v.2.1 + Qt interface, required
+#  find_package(MathGL2 2.1 REQUIRED)                  - v.2.1 (no interfaces), required
+#  find_package(MathGL2 COMPONENTS Qt WX)      - v.2.0 + Qt and WX 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 REQUIRED FLTK)
+#   include_directories(${MATHGL2_INCLUDE_DIRS})
+#   add_executable(myexe main.cpp)
+#   target_link_libraries(myexe ${MATHGL2_LIBRARIES} ${MATHGL2_FLTK_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)
+       if(${_component} STREQUAL "qt4" OR ${_component} STREQUAL "qt5")
+               FIND_PATH(MATHGL2_${_COMPONENT}_INCLUDE_DIR
+                                       NAMES mgl2/qt.h
+                                       PATHS ${MATHGL2_INCLUDE_DIR} NO_DEFAULT_PATH)
+       else(${_component} STREQUAL "qt4" OR ${_component} STREQUAL "qt5")
+               FIND_PATH(MATHGL2_${_COMPONENT}_INCLUDE_DIR
+                               NAMES mgl2/${_component}.h
+                               PATHS ${MATHGL2_INCLUDE_DIR} NO_DEFAULT_PATH)
+       endif(${_component} STREQUAL "qt4" OR ${_component} STREQUAL "qt5")
+       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 MATHGL2_VERSION_STRING)
diff --git a/scripts/MathGLConfig.cmake.in b/scripts/MathGLConfig.cmake.in
new file mode 100644 (file)
index 0000000..79ac30a
--- /dev/null
@@ -0,0 +1,18 @@
+# - Config file for the MathGL package
+# It defines the following variables
+set(MathGL2_INCLUDE_DIRS "@MathGL_INSTALL_INCLUDE_DIR@")
+set(MathGL2_LIBRARIES_DIRS "@MathGL_INSTALL_LIB_DIR@")
+set(MathGL2_HAVE_QT5 "@enable-qt5@")
+set(MathGL2_HAVE_QT4 "@enable-qt4@")
+set(MathGL2_HAVE_WX "@enable-wx@")
+set(MathGL2_HAVE_FLTK "@enable-fltk@")
+set(MathGL2_HAVE_GLUT "@enable-glut@")
+
+# Compute paths
+get_filename_component(MathGL2_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
+
+# Our library dependencies (contains definitions for IMPORTED targets)
+if(NOT TARGET mgl AND NOT MathGL_BINARY_DIR)
+  include("${MathGL2_CMAKE_DIR}/MathGLTargets.cmake")
+endif()
diff --git a/scripts/MathGLConfigVersion.cmake.in b/scripts/MathGLConfigVersion.cmake.in
new file mode 100644 (file)
index 0000000..ef66b05
--- /dev/null
@@ -0,0 +1,11 @@
+set(PACKAGE_VERSION "@MathGL_VERSION@")
+# Check whether the requested PACKAGE_FIND_VERSION is compatible
+if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}")
+  set(PACKAGE_VERSION_COMPATIBLE FALSE)
+else()
+  set(PACKAGE_VERSION_COMPATIBLE TRUE)
+  if ("${PACKAGE_VERSION}" VERSION_EQUAL "${PACKAGE_FIND_VERSION}")
+    set(PACKAGE_VERSION_EXACT TRUE)
+  endif()
+endif()
diff --git a/scripts/install-deps.cmake b/scripts/install-deps.cmake
new file mode 100644 (file)
index 0000000..9bab2f7
--- /dev/null
@@ -0,0 +1,36 @@
+include(GetPrerequisites)
+
+message("\nInstalling depended libraries to ${CMAKE_INSTALL_PREFIX}/bin:\n")
+
+file(GLOB_RECURSE exe_list "${CMAKE_INSTALL_PREFIX}/*.exe")
+file(GLOB_RECURSE dll_list "${CMAKE_INSTALL_PREFIX}/*.dll")
+
+if(NOT (exe_list OR dll_list))
+       message("Exe and dll files not found, cannot generate dependency list")
+       return()
+endif(NOT (exe_list OR dll_list))
+
+set(mgl_all_dep)
+foreach(exe_file ${exe_list} ${dll_list})
+       get_prerequisites(${exe_file} DEPENDENCIES 1 1 "" "${CMAKE_INSTALL_PREFIX}/bin")
+       foreach(DEPENDENCY_FILE ${DEPENDENCIES})
+               gp_resolve_item("${exe_file}" "${DEPENDENCY_FILE}" "" "${CMAKE_INSTALL_PREFIX}/bin" resolved_file)
+               if(NOT resolved_file MATCHES ".*libmgl.*")
+                       list(APPEND mgl_all_dep ${resolved_file})
+               endif(NOT resolved_file MATCHES ".*libmgl.*")
+       endforeach(DEPENDENCY_FILE ${DEPENDENCIES})
+endforeach(exe_file ${exe_list})
+
+list(REMOVE_DUPLICATES mgl_all_dep)
+list(SORT mgl_all_dep)
+
+foreach(dll_file ${mgl_all_dep})
+       message("Installing: ${dll_file}")
+endforeach(dll_file ${mgl_all_dep})
+
+file(COPY ${mgl_all_dep} DESTINATION "${CMAKE_INSTALL_PREFIX}/bin")
+
+if(mgl_qt_loc)
+       message("Installing: ${mgl_qt_loc}")
+       file(COPY ${mgl_qt_loc} DESTINATION "${CMAKE_INSTALL_PREFIX}/bin/plugins/platforms")
+endif(mgl_qt_loc)
diff --git a/scripts/qt4.cmake b/scripts/qt4.cmake
new file mode 100644 (file)
index 0000000..c38c7da
--- /dev/null
@@ -0,0 +1,14 @@
+set(MGL_HAVE_QT4 1)
+set(MGL_QT4_LIBS_FIND QtCore QtGui QtOpenGL)
+set(MGL_QT4_LIBS_FIND_JSON QtNetwork QtWebKit)
+
+FIND_PACKAGE(Qt4 4.8 REQUIRED ${MGL_QT4_LIBS_FIND})
+
+set(CMAKE_AUTOMOC ON)
+set(CMAKE_AUTOUIC ON)
+set(CMAKE_INCLUDE_CURRENT_DIR ON)
+
+set(MGL_QT4_LIBS)
+foreach(mgl_qt4_lib ${MGL_QT4_LIBS_FIND})
+       set(MGL_QT4_LIBS ${MGL_QT4_LIBS} Qt4::${mgl_qt4_lib})
+endforeach(mgl_qt4_lib)
diff --git a/scripts/qt5.cmake b/scripts/qt5.cmake
new file mode 100644 (file)
index 0000000..ceec34a
--- /dev/null
@@ -0,0 +1,22 @@
+set(MGL_HAVE_QT5 1)
+
+macro(find_qt5_libs qt5_lib_req qt5_lib_add)
+       foreach(mgl_qt5_lib ${ARGN})
+               find_package(Qt5${mgl_qt5_lib} QUIET)
+               if(NOT Qt5${mgl_qt5_lib}_FOUND)
+                       if(${qt5_lib_req})
+                               message(SEND_ERROR "Couldn't find Qt5 ${mgl_qt5_lib} library.")
+                       endif(${qt5_lib_req})
+               else(NOT Qt5${mgl_qt5_lib}_FOUND)
+                       if(${qt5_lib_add})
+                               set(MGL_QT5_LIBS ${MGL_QT5_LIBS} Qt5::${mgl_qt5_lib})
+                       endif(${qt5_lib_add})
+               endif(NOT Qt5${mgl_qt5_lib}_FOUND)
+       endforeach(mgl_qt5_lib)
+endmacro(find_qt5_libs qt5_lib_req)
+
+find_qt5_libs(ON ON Core Gui Widgets PrintSupport OpenGL)
+
+set(CMAKE_AUTOMOC ON)
+set(CMAKE_AUTOUIC ON)
+set(CMAKE_INCLUDE_CURRENT_DIR ON)
index ea538cc4d27831fb91be3b9e4027f387ec06382c..39d3ad54b727f4e901d2099b40e9d7b251512f89 100644 (file)
@@ -2,18 +2,19 @@ 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
+       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
@@ -23,7 +24,10 @@ ${MathGL_BINARY_DIR}/include/mgl2/dllexport.h        cont.hpp
 #      tex_table.cc     def_font.cc
 )
 
-add_definitions(-DMGL_SRC)
+if(MSVC)
+       add_definitions(-DMGL_LIB_MSVC)
+endif(MSVC)
+
 if(MGL_HAVE_GSL2)
        add_definitions(-DMGL_HAVE_GSL2)
 endif(MGL_HAVE_GSL2)
@@ -49,6 +53,8 @@ generate_export_header(mgl EXPORT_FILE_NAME ../include/mgl2/dllexport.h)
 target_link_libraries(mgl ${MGL_DEP_LIBS})
 target_link_libraries(mgl-static ${MGL_DEP_LIBS})
 
+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} )
@@ -56,4 +62,4 @@ if(MGL_HAVE_MPI)
        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 3a726d1f80fbd4c4dc7b811eaaa1681aef7c7cc4..82d231cab4aeced1a346c8229f26ef54bc5b882f 100644 (file)
@@ -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);
 }
 //-----------------------------------------------------------------------------
@@ -205,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];
@@ -214,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 a3cd0b2aa6208cbe95892394cfd3a061123f0973..c0bacd7c5f866169ff4f55131c98b96382bdc78b 100644 (file)
@@ -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)
@@ -76,7 +70,7 @@ void mglCanvas::SetTickLen(mreal tlen, mreal stt)
 void mglCanvas::SetTicks(char dir, mreal d, int ns, mreal org, const wchar_t *lbl)
 {
        if(!strchr("xyzca",dir))        return;
-       mglAxis &aa = (dir=='x' ? ax : (dir=='y' ? ay : (dir=='z' ? az : ac)));
+       mglAxis &aa = GetAxis(dir);
 
        if(aa.f==1)     aa.t.clear();
        aa.d=d; aa.f=0; aa.ns=ns;       aa.o=org;
@@ -88,8 +82,8 @@ void mglCanvas::SetTicks(char dir, mreal d, int ns, mreal org, const wchar_t *lb
 void mglCanvas::AddTick(char dir, double v, const wchar_t *lbl)
 {
        if(!strchr("xyzca",dir))        return;
-       mglAxis &aa = (dir=='x' ? ax : (dir=='y' ? ay : (dir=='z' ? az : ac)));
-       bool ff = (dir=='x' ? fx : (dir=='y' ? fy : (dir=='z' ? fz : fa)));
+       mglAxis &aa = GetAxis(dir);
+       bool ff = GetFormula(dir);
 
        UpdateAxis();   AdjustTicks(aa,ff);
        if(!v || !lbl || !lbl[0])       {       aa.f = 0;       return; }
@@ -103,15 +97,15 @@ void mglCanvas::AddTick(char dir, double v, const char *lbl)
 void mglCanvas::SetTicksVal(char dir, HCDT v, const wchar_t *lbl, bool add)
 {
        if(!strchr("xyzca",dir))        return;
-       mglAxis &aa = (dir=='x' ? ax : (dir=='y' ? ay : (dir=='z' ? az : ac)));
-       bool ff = (dir=='x' ? fx : (dir=='y' ? fy : (dir=='z' ? fz : fa)));
+       mglAxis &aa = GetAxis(dir);
+       bool ff = GetFormula(dir);
 
        if(add) {       UpdateAxis();   AdjustTicks(aa,ff);     }
        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);
@@ -153,22 +147,22 @@ void mglCanvas::SetTicksVal(char dir, const char *lbl, bool add)
 void mglCanvas::SetTicksVal(char dir, HCDT v, const wchar_t **lbl, bool add)
 {
        if(!strchr("xyzca",dir))        return;
-       mglAxis &aa = (dir=='x' ? ax : (dir=='y' ? ay : (dir=='z' ? az : ac)));
-       bool ff = (dir=='x' ? fx : (dir=='y' ? fy : (dir=='z' ? fz : fa)));
+       mglAxis &aa = GetAxis(dir);
+       bool ff = GetFormula(dir);
 
        if(add) {       UpdateAxis();   AdjustTicks(aa,ff);     }
        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)
 {
        if(!strchr("xyzca",dir))        return;
-       mglAxis &aa = (dir=='x' ? ax : (dir=='y' ? ay : (dir=='z' ? az : ac)));
-       bool ff = (dir=='x' ? fx : (dir=='y' ? fy : (dir=='z' ? fz : fa)));
+       mglAxis &aa = GetAxis(dir);
+       bool ff = GetFormula(dir);
 
        aa.txt.clear();
        if(add) {       UpdateAxis();   AdjustTicks(aa,ff);     }
@@ -180,7 +174,7 @@ void mglCanvas::SetTicksVal(char dir, HCDT v, const char **lbl, bool add)
 void mglCanvas::SetTickTempl(char dir, const wchar_t *t)
 {
        if(!strchr("xyzca",dir))        return;
-       mglAxis &aa = (dir=='x' ? ax : (dir=='y' ? ay : (dir=='z' ? az : ac)));
+       mglAxis &aa = GetAxis(dir);
 
        if(aa.f==1)     aa.f = 0;       // remove time ticks
        if(!t || !t[0]) aa.t.clear();   else aa.t=t;
@@ -189,14 +183,14 @@ void mglCanvas::SetTickTempl(char dir, const wchar_t *t)
 void mglCanvas::SetTickTempl(char dir, const char *t)
 {
        if(!strchr("xyzca",dir))        return;
-       mglAxis &aa = (dir=='x' ? ax : (dir=='y' ? ay : (dir=='z' ? az : ac)));
+       mglAxis &aa = GetAxis(dir);
 
        if(aa.f==1)     aa.f = 0;       // remove time ticks
        if(!t || !t[0]) aa.t.clear();
        else    MGL_TO_WCS(t,aa.t=wcs);
 }
 //-----------------------------------------------------------------------------
-MGL_NO_EXPORT double mgl_adj_val(double v,mreal *ds=0)
+static double mgl_adj_val(double v,mreal *ds=0)
 {
        double n = floor(log10(v)), s;
        v = floor(v*pow(10.,-n));       n = pow(10.,n);
@@ -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))
@@ -312,7 +312,7 @@ void mglCanvas::AdjustTicks(mglAxis &aa, bool ff)
        LabelTicks(aa);
 }
 //-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgl_tick_ext(mreal a, mreal b, wchar_t s[32], mreal &v)
+static int mgl_tick_ext(mreal a, mreal b, wchar_t s[32], mreal &v)
 {
        int kind = 0;
        if(fabs(a-b)<=0.01*fabs(a))
@@ -353,7 +353,7 @@ int MGL_NO_EXPORT mgl_tick_ext(mreal a, mreal b, wchar_t s[32], mreal &v)
        return kind;
 }
 //-----------------------------------------------------------------------------
-std::wstring MGL_NO_EXPORT mgl_format(mreal v1, mreal v2, bool zero)
+/*static std::wstring mgl_format(mreal v1, mreal v2, bool zero)
 {
        v1=fabs(v1);    v2=fabs(v2);    if(v1>v2)       v2=v1;
        wchar_t str[5]=L"%.3g";
@@ -363,9 +363,9 @@ std::wstring MGL_NO_EXPORT mgl_format(mreal v1, mreal v2, bool zero)
        else if(zero)
        {       str[2] = '0'+prec;      str[3]='f';     }
        return str;
-}
+}*/
 //-----------------------------------------------------------------------------
-std::wstring MGL_NO_EXPORT mgl_tick_text(mreal z, mreal z0, mreal d, mreal v, int kind, const std::wstring &fact, mreal step, const char *stl)
+static std::wstring mgl_tick_text(mreal z, mreal z0, mreal d, mreal v, int kind, const std::wstring &fact, mreal step, const char *stl)
 {
        std::wstring str;
        bool ff = step>0 && !fact.empty();// && mgl_wcslen(str)+fact.length()<62;
@@ -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,27 +519,34 @@ 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);
 
-       long k1,k2;
-       bool have_color=mgl_have_color(stl);
-       bool dif_color = !have_color && aa.dv==0 && strcmp(TickStl,SubTStl);
-       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
+       bool have_color=mgl_have_color(stl);
+       bool dif_color = !have_color && aa.dv==0 && strcmp(TickStl,SubTStl);
+       long kq = AllocPnts(31);
+       if(text&2)      // line throw point (0,0,0)
        {
-               p = o + d*(aa.v1+(aa.v2-aa.v1)*i/30.);
-               k2 = k1;        k1 = AddPnt(&B, p,CDef,q,-1,3);
-               line_plot(k2,k1);
+               SetPenPal("k:");
+#pragma omp parallel for
+               for(long i=0;i<31;i++)
+                       AddPntQ(kq+i, &B, d*(aa.v1+(aa.v2-aa.v1)*i/30.), CDef,q,-1,3);
+               curve_plot(31,kq);
        }
+       SetPenPal(have_color ? stl:AxisStl);
+
+       kq = AllocPnts(31);
+#pragma omp parallel for
+       for(long i=0;i<31;i++)
+               AddPntQ(kq+i, &B, o + d*(aa.v1+(aa.v2-aa.v1)*i/30.), CDef,q,-1,3);
+       curve_plot(31,kq);
        if(arr)
        {
                p = o + d*(aa.v1+(aa.v2-aa.v1)*1.05);
-               k2 = k1;        k1 = AddPnt(&B, p,CDef,q,-1,3);
-               line_plot(k1,k2);       arrow_plot(k1,k2,arr);
+               long k1 = AddPnt(&B, p,CDef,q,-1,3);
+               line_plot(k1,kq+30);    arrow_plot(k1,kq+30,arr);
        }
 
-       k2 = aa.txt.size();
+       long k2 = aa.txt.size();
        mreal v, u, v0 = mgl_isnan(aa.o) ? aa.v0 : aa.o;
        if(*TickStl && !have_color)     SetPenPal(TickStl);
        if(k2>0)        for(long i=0;i<k2;i++)
@@ -564,7 +572,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,13 +592,15 @@ 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];
-       long *kk=new long[n];
+       mreal *w=new mreal[n], wsp = 2*TextWidth(" ",FontDef,-1);
+       long *kk=new long[n], kq = AllocPnts(n);
+#pragma omp parallel for
        for(long i=0;i<n;i++)   // fill base label properties
        {
                w[i] = TextWidth(aa.txt[i].text.c_str(),FontDef,-1);
-               kk[i] = AddPnt(M, o+d*aa.txt[i].val,-1,d,0,7);
+               AddPntQ(kq+i, M, o+d*aa.txt[i].val,-1,d,0,7);
        }
+       for(long i=0;i<n;i++)   kk[i] = kq+i;
        mreal c=INFINITY, l=0, h = TextHeight(FontDef,-1);      // find sizes
        for(long i=0;i<n-1;i++)
        {
@@ -599,7 +609,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 +624,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 +636,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)
@@ -650,7 +663,7 @@ void mglCanvas::DrawLabels(mglAxis &aa, bool inv, const mglMatrix *M)
                if(get(MGL_NO_ORIGIN) && v==aa.v0)      continue;
                if(v>aa.v1 && v<aa.v2 && i%k!=0)        continue;
                char pos[4]={up[i],':',align[i],0};
-               text_plot(kk[i], aa.txt[i].text.c_str(), pos, -1, aa.sh+0.1,CDef);
+               text_plot(kk[i], aa.txt[i].text.c_str(), pos, -1, aa.sh+0.05,CDef);
        }
        delete []w;     delete []kk;    delete []align; delete []up;
 }
@@ -689,8 +702,8 @@ void mglCanvas::tick_draw(mglPoint o, mglPoint d1, mglPoint d2, int f)
 
        ScalePoint(&B,o, d1, false);    d1.Normalize();
        ScalePoint(&B,p, d2, false);    d2.Normalize();
-       long k2 = AddPnt(&B, p, CDef, mglPoint(NAN), 0, 0);
        long k1 = AddPnt(&B, p+d1*v, CDef, mglPoint(NAN), 0, 0);
+       long k2 = AddPnt(&B, p, CDef, mglPoint(NAN), 0, 0);
        long k3 = AddPnt(&B, p+d2*v, CDef, mglPoint(NAN), 0, 0);
        line_plot(k1,k2);       line_plot(k2,k3);
 }
@@ -710,28 +723,20 @@ void mglCanvas::Grid(const char *dir, const char *pen, const char *opt)
        EndGroup();
 }
 //-----------------------------------------------------------------------------
-void MGL_NO_EXPORT mgl_drw_grid(HMGL gr, double val, const mglPoint &d, const mglPoint &oa, const mglPoint &ob, const mglPoint &da1, const mglPoint &db1, const mglPoint &da2, const mglPoint &db2)
+static void mgl_drw_grid(HMGL gr, double val, const mglPoint &d, const mglPoint &oa, const mglPoint &ob, const mglPoint &da1, const mglPoint &db1, const mglPoint &da2, const mglPoint &db2)
 {
-       gr->Reserve(62);
-       mglPoint q,p;
-       q = oa+d*val;   p = q+da1;      // lines along 'a'
-       long k1 = gr->AddPnt(p), k2;
-       for(long j=1;j<31;j++)
-       {
-               mreal v = j/30.;
-               p = q+da1*(1-v)+da2*v;
-               k2 = k1;        k1 = gr->AddPnt(p);
-               gr->line_plot(k2,k1);
-       }
-       q = ob+d*val;   p = q+db1;      // lines along 'b'
-       k1 = gr->AddPnt(p);
-       for(long j=1;j<31;j++)
-       {
-               mreal v = j/30.;
-               p = q+db1*(1-v)+db2*v;
-               k2 = k1;        k1 = gr->AddPnt(p);
-               gr->line_plot(k2,k1);
-       }
+       mglPoint q(oa+d*val);   // lines along 'a'
+       long kq = gr->AllocPnts(31);
+#pragma omp parallel for
+       for(long i=0;i<31;i++)
+       {       mreal v=i/30.;  gr->AddPntQ(kq+i,q+da1*(1-v)+da2*v);    }
+       gr->curve_plot(31,kq);
+       q = ob+d*val;           // lines along 'b'
+       kq = gr->AllocPnts(31);
+#pragma omp parallel for
+       for(long i=0;i<31;i++)
+       {       mreal v = i/30.;        gr->AddPntQ(kq+i,q+db1*(1-v)+db2*v);    }
+       gr->curve_plot(31,kq);
 }
 void mglCanvas::DrawGrid(mglAxis &aa, bool at_tick)
 {
@@ -790,6 +795,7 @@ void mglCanvas::Label(char dir, const char *str, mreal pos, const char *opt)
 void mglCanvas::Labelw(char dir, const wchar_t *text, mreal pos, const char *opt)
 {
        mreal shift =  SaveState(opt), t=0;     if(mgl_isnan(shift))    shift=0;
+       shift -= 0.1;
        mglPoint p,q;
        mglAxis *aa=0;
 
@@ -848,8 +854,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 +864,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 +881,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
        {
@@ -926,27 +933,24 @@ void mglCanvas::Box(const char *col, bool ticks)
                                        else    {       color[0]=col[i];        color[1]=0;     break;  }
                                }
                        }
-                       long *pos = new long[3*31*31];
                        SetPenPal(color);
                        mreal dx = (Max.x-Min.x)/30, dy = (Max.y-Min.y)/30, dz = (Max.z-Min.z)/30;
+                       long kq = AllocPnts(3*31*31);
+#pragma omp parallel for collapse(2)
                        for(long i=0;i<31;i++)  for(long j=0;j<31;j++)
                        {
-                               register 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));
+                               long i0=kq+3*(i+31*j);
+                               AddPntQ(i0,  mglPoint(oo[im].x,Min.y+dy*i,Min.z+dz*j));
+                               AddPntQ(i0+1,mglPoint(Min.x+dx*i,oo[im].y,Min.z+dz*j));
+                               AddPntQ(i0+2,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);
-                               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]);
+                               long i0=kq+3*(i+31*j);
+                               quad_plot(i0,  i0+3,i0+93,i0+96);
+                               quad_plot(i0+1,i0+4,i0+94,i0+97);
+                               quad_plot(i0+2,i0+5,i0+95,i0+98);
                        }
-                       delete []pos;
-//                     mgl_facex(this, oo[im].x, Min.y, Min.z, Max.y-Min.y, Max.z-Min.z, color,0,0);
-//                     mgl_facey(this, Min.x, oo[im].y, Min.z, Max.x-Min.x, Max.z-Min.z, color,0,0);
-//                     mgl_facez(this, Min.x, Min.y, oo[im].z, Max.x-Min.x, Max.y-Min.y, color,0,0);
                }
        }
        EndGroup();
@@ -1072,7 +1076,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 +1084,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);
                        }
@@ -1103,7 +1107,11 @@ void mglCanvas::colorbar(HCDT vv, const mreal *c, int where, mreal x, mreal y, m
                        case 3: p1.y = y;       p2.y = y+0.1*h; break;
                        default:p1.x = x-0.1*w; p2.x = x;       break;
                }
-               line_plot(AddPnt(&M, p1), AddPnt(&M, p2));
+               mglPoint p3(0.75*p1.x+0.25*p2.x, 0.75*p1.y+0.25*p2.y, s3);
+               mglPoint p4(0.25*p1.x+0.75*p2.x, 0.25*p1.y+0.75*p2.y, s3);
+//             line_plot(AddPnt(&M, p1), AddPnt(&M, p2));
+               line_plot(AddPnt(&M, p1), AddPnt(&M, p3));
+               line_plot(AddPnt(&M, p4), AddPnt(&M, p2));
        }
        ac.dir.Set(ss*w,ss*h,0);        ac.a.Set(0,0,0);
        ac.org.Set(w+x,h+y,s3+1);       ac.b.Set(0,0,0);
index b26dc84ff80dcee2d24660941942fbfbc674da51..b8b009369e91857813916da197e3c2bb7e090e96 100644 (file)
 #include <omp.h>\r
 #endif\r
 \r
+//-----------------------------------------------------------------------------\r
+static unsigned mgl_pb=0;\r
+unsigned MGL_EXPORT mgl_bsize(unsigned bsize)\r
+{\r
+       if(!mgl_pb)     mgl_pb = (bsize>0 && bsize<100)?bsize:16;\r
+       return mgl_pb;\r
+}\r
+unsigned MGL_EXPORT mgl_bsize_(unsigned *bsize)\r
+{      return mgl_bsize(*bsize);       }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_mutex_unlock(void *mutex)\r
 {\r
@@ -64,15 +73,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
@@ -82,6 +91,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
@@ -104,8 +114,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
@@ -150,7 +160,7 @@ 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
@@ -212,27 +222,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
@@ -246,7 +256,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
@@ -255,7 +265,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
@@ -266,7 +276,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
@@ -290,20 +300,83 @@ 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
+long mglBase::PushPnts(size_t num, const mglPnt *qq)\r
+{\r
+       long k;\r
+#pragma omp critical(pnt)\r
+       MGL_PUSHs({k=Pnt.size();Pnt.push_back(num,qq);},mutexPnt);\r
+       return k;\r
+}\r
+//-----------------------------------------------------------------------------\r
+long mglBase::AllocPnts(size_t num)\r
+{\r
+       long k;\r
+#pragma omp critical(pnt)\r
+       MGL_PUSHs({k=Pnt.allocate(num);},mutexPnt);\r
+       return k;\r
+}\r
+//-----------------------------------------------------------------------------\r
 void inline mgl_put_inbox(mreal a1, mreal a2, mreal &a)\r
 {\r
        if(a1<a2)       {       if(a<a1)        a=a1;   if(a>a2)        a=a2;   }\r
        else            {       if(a<a2)        a=a2;   if(a>a1)        a=a1;   }\r
 }\r
-void MGL_NO_EXPORT mgl_coor_box(HMGL gr, mglPoint &p)\r
+static void mgl_coor_box(HMGL gr, mglPoint &p)\r
 {\r
        mgl_put_inbox(gr->Min.x, gr->Max.x, p.x);\r
        mgl_put_inbox(gr->Min.y, gr->Max.y, p.y);\r
        mgl_put_inbox(gr->Min.z, gr->Max.z, p.z);\r
 }\r
 long mglBase::AddPnt(const mglMatrix *mat, mglPoint p, mreal c, mglPoint n, mreal a, int scl)\r
+{\r
+       mglPnt q;\r
+       if(!AddPntQ(q,mat,p,c,n,a,scl)) return -1;\r
+       long k;\r
+#pragma omp critical(pnt)\r
+       {k=Pnt.size();  MGL_PUSH(Pnt,q,mutexPnt);}      return k;\r
+}\r
+bool mglBase::AddPntQ(mglPnt &q, const mglMatrix *mat, mglPoint p, mreal c, mglPoint n, mreal a, int scl)\r
 {\r
        // scl=0 -- no scaling\r
        // scl&1 -- usual scaling\r
@@ -311,22 +384,21 @@ long mglBase::AddPnt(const mglMatrix *mat, mglPoint p, mreal c, mglPoint n, mrea
        // scl&4 -- disable NAN for normales if no light\r
        // scl&8 -- bypass palette for enabling alpha\r
        // scl&16 -- put points inside axis range\r
-       if(mgl_isnan(c) || mgl_isnan(a))        return -1;\r
+       if(mgl_isnan(c) || mgl_isnan(a))        {       q.x=NAN;        return false;   }\r
        bool norefr = mgl_isnan(n.x) && mgl_isnan(n.y) && !mgl_isnan(n.z);\r
        if(scl>0)\r
        {\r
                if(scl&16)      mgl_coor_box(this, p);\r
                ScalePoint(mat,p,n,!(scl&2));\r
        }\r
-       if(mgl_isnan(p.x))      return -1;\r
+       if(mgl_isnan(p.x))      {       q.x=NAN;        return false;   }\r
        a = (a>=0 && a<=1) ? a : AlphaDef;\r
        c = (c>=0) ? c:CDef;\r
 \r
-       mglPnt q;\r
        if(get(MGL_REDUCEACC))\r
        {\r
                q.x=q.xx=int(p.x*10)*0.1;       q.y=q.yy=int(p.y*10)*0.1;       q.z=q.zz=int(p.z*10)*0.1;\r
-               q.c=int(c*100)*0.01;    q.t=q.ta=int(a*100)*0.01;\r
+               q.c=int(c*100)*0.01;            q.ta=int(a*100)*0.01;\r
                q.u=mgl_isnum(n.x)?int(n.x*100)*0.01:NAN;\r
                q.v=mgl_isnum(n.y)?int(n.y*100)*0.01:NAN;\r
                q.w=mgl_isnum(n.z)?int(n.z*100)*0.01:NAN;\r
@@ -334,9 +406,9 @@ long mglBase::AddPnt(const mglMatrix *mat, mglPoint p, mreal c, mglPoint n, mrea
        else\r
        {\r
                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
+               q.c=c;  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
@@ -349,40 +421,52 @@ long mglBase::AddPnt(const mglMatrix *mat, mglPoint p, mreal c, mglPoint n, mrea
        // add gap for texture coordinates for compatibility with OpenGL\r
        const mreal gap = 0./MGL_TEXTURE_COLOURS;\r
        q.c = ci+(q.c-ci)*(1-2*gap)+gap;\r
-       q.t = q.t*(1-2*gap)+gap;\r
-       q.ta = q.t;\r
+       q.ta = q.ta*(1-2*gap)+gap;\r
 \r
        if(scl&8 && scl>0)      q.a=a;  // bypass palette for enabling alpha in Error()\r
        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?-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
+       q.sub=mat->norot?-1*(int)Sub.size():Sub.size()-1;\r
+       return true;\r
 }\r
 //-----------------------------------------------------------------------------\r
 long mglBase::CopyNtoC(long from, mreal c)\r
 {\r
-       if(from<0)      return -1;\r
-       mglPnt p=Pnt[from];\r
-       if(mgl_isnum(c))        {       p.c=c;  p.t=1;  Txt[long(c)].GetC(c,0,p);       p.a=1;  }\r
+       mglPnt q;\r
+       if(!CopyNtoC(q,from,c)) return -1;\r
        long k;\r
 #pragma omp critical(pnt)\r
-       {k=Pnt.size();  MGL_PUSH(Pnt,p,mutexPnt);}      return k;\r
+       {k=Pnt.size();  MGL_PUSH(Pnt,q,mutexPnt);}      return k;\r
+}\r
+//-----------------------------------------------------------------------------\r
+bool mglBase::CopyNtoC(mglPnt &q, long from, mreal c)\r
+{\r
+       if(from<0)      return false;\r
+       q = Pnt[from];\r
+       if(mgl_isnum(c))        {       q.c=c;  q.ta=1; Txt[long(c)].GetC(c,0,q);       q.a=1;  }\r
+       else    q.x = NAN;\r
+       return mgl_isnum(q.x);\r
 }\r
 //-----------------------------------------------------------------------------\r
 long mglBase::CopyProj(long from, mglPoint p, mglPoint n, short sub)\r
 {\r
-       if(from<0)      return -1;\r
-       mglPnt q=Pnt[from];     q.sub = sub;\r
-       q.x=q.xx=p.x;   q.y=q.yy=p.y;   q.z=q.zz=p.z;\r
-       q.u = n.x;              q.v = n.y;              q.w = n.z;\r
+       mglPnt q;\r
+       if(!CopyProj(q,from,p,n,sub))   return -1;\r
        long k;\r
 #pragma omp critical(pnt)\r
        {k=Pnt.size();  MGL_PUSH(Pnt,q,mutexPnt);}      return k;\r
 }\r
 //-----------------------------------------------------------------------------\r
+bool mglBase::CopyProj(mglPnt &q, long from, mglPoint p, mglPoint n, short sub)\r
+{\r
+       if(from<0)      return false;\r
+       q=Pnt[from];    q.sub = sub;\r
+       q.x=q.xx=p.x;   q.y=q.yy=p.y;   q.z=q.zz=p.z;\r
+       q.u = n.x;              q.v = n.y;              q.w = n.z;\r
+       return mgl_isnum(q.x);\r
+}\r
+//-----------------------------------------------------------------------------\r
 void mglBase::Reserve(long n)\r
 {\r
        if(TernAxis&12) n*=4;\r
@@ -402,12 +486,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
@@ -426,30 +508,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
@@ -537,17 +617,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
@@ -802,8 +882,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
@@ -867,8 +949,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
@@ -907,22 +992,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;    Clear();\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
@@ -932,28 +1026,30 @@ void mglTexture::Set(const char *s, int smooth, mreal alpha)
        }\r
        if(n<=0)        return;\r
        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
+       c0 = new mglColor[2*n]; // Colors itself\r
+       val = new float[n];\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
-                       {       c[2*n].Set(s[i],(s[i+1]-'0')/5.f);      i++;    }\r
-                       else    c[2*n].Set(s[i]);       // usual color\r
-                       val[n]=-1;      c[2*n].a = -1;  n++;\r
+                       {       c0[2*n].Set(s[i],(s[i+1]-'0')/5.f);     i++;    }\r
+                       else    c0[2*n].Set(s[i]);      // usual color\r
+                       val[n]=-1;      c0[2*n].a = -1; n++;\r
                }\r
                if(s[i]=='x' && i>0 && s[i-1]=='{' && j<1)      // {xRRGGBB,val} format, where val in [0,1]\r
                {\r
                        uint32_t id = strtoul(s+1+i,0,16);\r
-                       if(memchr(s+i+1,'}',8) || memchr(s+i+1,',',8))  c[2*n].a = -1;\r
-                       else    {       c[2*n].a = (id%256)/255.;       id /= 256;      }\r
-                       c[2*n].b = (id%256)/255.;       id /= 256;\r
-                       c[2*n].g = (id%256)/255.;       id /= 256;\r
-                       c[2*n].r = (id%256)/255.;\r
+                       if(memchr(s+i+1,'}',8) || memchr(s+i+1,',',8))  c0[2*n].a = -1;\r
+                       else    {       c0[2*n].a = (id%256)/255.;      id /= 256;      }\r
+                       c0[2*n].b = (id%256)/255.;      id /= 256;\r
+                       c0[2*n].g = (id%256)/255.;      id /= 256;\r
+                       c0[2*n].r = (id%256)/255.;\r
                        while(strchr("0123456789abcdefABCDEFx",s[i]))   i++;\r
                        val[n]=-1;      n++;    i--;\r
                }\r
@@ -965,19 +1061,19 @@ void mglTexture::Set(const char *s, int smooth, mreal alpha)
        }\r
        for(long i=0;i<n;i++)   // default texture\r
        {\r
-               if(c[2*i].a<0)  c[2*i].a=alpha;\r
-               c[2*i+1]=c[2*i];\r
-               if(man) c[2*i].a=0;\r
+               if(c0[2*i].a<0) c0[2*i].a=alpha;\r
+               c0[2*i+1]=c0[2*i];\r
+               if(man) c0[2*i].a=0;\r
        }\r
        if(map && sm && n>1)            // map texture\r
        {\r
                if(n==2)\r
-               {       c[1]=c[2];      c[2]=c[0];      c[0]=BC;        c[3]=c[1]+c[2]; }\r
+               {       c0[1]=c0[2];    c0[2]=c0[0];    c0[0]=BC;       c0[3]=c0[1]+c0[2];      }\r
                else if(n==3)\r
-               {       c[1]=c[2];      c[2]=c[0];      c[0]=BC;        c[3]=c[4];      n=2;}\r
+               {       c0[1]=c0[2];    c0[2]=c0[0];    c0[0]=BC;       c0[3]=c0[4];    n=2;}\r
                else\r
-               {       c[1]=c[4];      c[3]=c[6];      n=2;    }\r
-               c[0].a = c[1].a = c[2].a = c[3].a = alpha;\r
+               {       c0[1]=c0[4];    c0[3]=c0[6];    n=2;    }\r
+               c0[0].a = c0[1].a = c0[2].a = c0[3].a = alpha;\r
                val[0]=val[1]=-1;\r
        }\r
        // TODO if(!sm && n==1) then try to find color in palette ???\r
@@ -988,10 +1084,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
@@ -1000,30 +1096,29 @@ 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
-               col[2*i] = c[j];        col[2*i+1] = c[j+1];\r
+               long j = 2*long(v*i);   //u-=j;\r
+               col[2*i] = c0[j];       col[2*i+1] = c0[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
                        v2 = i1<n?1/(val[i1]-val[i1-1]):0;\r
                        j=i1-1; u=(i/255.-val[j])*v2;\r
-                       col[2*i] = c[2*j]*(1-u)+c[2*j+2]*u;\r
-                       col[2*i+1]=c[2*j+1]*(1-u)+c[2*j+3]*u;\r
+                       col[2*i] = c0[2*j]*(1-u)+c0[2*j+2]*u;\r
+                       col[2*i+1]=c0[2*j+1]*(1-u)+c0[2*j+3]*u;\r
                }\r
                else\r
-               {       col[2*i] = c[2*n-2];col[2*i+1] = c[2*n-1];      }\r
+               {       col[2*i] = c0[2*n-2];col[2*i+1] = c0[2*n-1];    }\r
        }\r
-       delete []c;     delete []val;\r
 }\r
 //-----------------------------------------------------------------------------\r
 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
@@ -1031,7 +1126,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
@@ -1110,7 +1205,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
@@ -1139,7 +1234,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
@@ -1155,7 +1251,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
@@ -1164,11 +1261,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
@@ -1176,22 +1275,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
@@ -1206,7 +1306,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
@@ -1374,7 +1475,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
@@ -1398,7 +1499,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
@@ -1417,7 +1518,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
@@ -1437,7 +1538,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
@@ -1459,20 +1560,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
@@ -1482,8 +1583,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
@@ -1501,11 +1600,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
@@ -1536,3 +1637,48 @@ void mglBase::ClearPrmInd()
        {       if(PrmInd)      delete []PrmInd;        PrmInd=NULL;    }\r
 }\r
 //-----------------------------------------------------------------------------\r
+void mglBase::curve_plot(size_t num, size_t k0, size_t step)\r
+{\r
+       // exclude straight-line parts\r
+       if(get(MGL_FULL_CURV))  for(size_t i=0;i+1<num;i++)\r
+               line_plot(k0+i*step,k0+(i+1)*step);\r
+       else    for(size_t i=0;i+1<num;i++)\r
+       {\r
+               const mglPoint p1(GetPntP(k0+i*step)), ps(GetPntP(k0+(i+1)*step));\r
+               if(mgl_isnan(p1.x) || mgl_isnan(ps.x))  continue;\r
+               const mglColor c1(GetPntC(k0+i*step));\r
+               // remove duplicates\r
+               for(;i+1<num;i++)\r
+               {\r
+                       size_t ii = k0+(i+1)*step;\r
+                       const mglPoint pp(GetPntP(ii));\r
+                       if(p1!=pp || mgl_isnan(pp.x))   break;\r
+               }\r
+               if(i+1>=num)    break;\r
+\r
+               float t1=-100, t2=100;          // XY angle boundary\r
+               float rg1=-100, rg2=100;        // RG angle boundary\r
+               float gb1=-100, gb2=100;        // GB angle boundary\r
+               size_t k;\r
+               for(k=i+1;k<num;k++)\r
+               {\r
+                       const mglPoint p2(GetPntP(k0+k*step)-p1);\r
+                       if(mgl_isnan(p2.x))     break;\r
+                       float dd=p2.x*p2.x+p2.y*p2.y+p2.z*p2.z;\r
+                       if(dd<=0)       continue;       // the same point (micro-loop? :) )\r
+                       float t = atan2(p2.y,p2.x), d = atan(0.03/dd);\r
+                       if(t1 > t+d || t2 < t-d)        break;          // too curved\r
+                       const mglColor c2(GetPntC(k0+(k-1)*step)-c1);   dd = c2.NormS();\r
+                       if(dd>0)        // color are different\r
+                       {\r
+                               float rg = atan2(c2.r,c2.g), gb = atan2(c2.g,c2.b);     d = atan(1e-4/dd);\r
+                               if(rg1 > rg+d || rg2 < rg-d || gb1 > gb+d || gb2 < gb-d)        break;          // too curved\r
+                               rg1 = rg1<rg-d?rg-d:rg1;        rg2 = rg2>rg+d?rg+d:rg2;        // new RG range\r
+                               gb1 = gb1<gb-d?gb-d:gb1;        gb2 = gb2>gb+d?gb+d:gb2;        // new GB range\r
+                       }\r
+                       t1 = t1<t-d?t-d:t1;     t2 = t2>t+d?t+d:t2;     // new range\r
+               }\r
+               k--;    line_plot(k0+i*step,k0+k*step); i = k-1;\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
index 148d0688b14c95d8510f050e345ffa877bbd761f..89a44d13b5133675fae53cf17a32d85f5814b8b1 100644 (file)
@@ -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
@@ -202,6 +202,7 @@ void MGL_EXPORT mgl_set_tick_rotate_(uintptr_t *gr,int *enable){    _GR_->SetTickRo
 void MGL_EXPORT mgl_set_tick_skip_(uintptr_t *gr, int *enable) {       _GR_->SetTickSkip(*enable);     }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_set_rotated_text(HMGL gr, int enable)      {       gr->SetRotatedText(enable);     }\r
+void MGL_EXPORT mgl_set_scale_text(HMGL gr, int enable)                {       gr->set(!enable, MGL_NO_SCALE_REL);     }\r
 void MGL_EXPORT mgl_set_mark_size(HMGL gr, double size)                {       gr->SetMarkSize(size);  }\r
 void MGL_EXPORT mgl_set_arrow_size(HMGL gr, double size)       {       gr->SetArrowSize(size); }\r
 void MGL_EXPORT mgl_set_font_size(HMGL gr, double size)                {       gr->SetFontSize(size);  }\r
@@ -210,9 +211,11 @@ 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
+void MGL_EXPORT mgl_set_rotated_text_(uintptr_t *gr, int *enable)      {       _GR_->SetRotatedText(*enable);  }\r
+void MGL_EXPORT mgl_set_scale_text_(uintptr_t *gr, int *enable)        {       mgl_set_scale_text(_GR_,*enable);       }\r
 void MGL_EXPORT mgl_set_mark_size_(uintptr_t *gr, mreal *size)         {       _GR_->SetMarkSize(*size);       }\r
 void MGL_EXPORT mgl_set_arrow_size_(uintptr_t *gr, mreal *size)        {       _GR_->SetArrowSize(*size);      }\r
 void MGL_EXPORT mgl_set_font_size_(uintptr_t *gr, mreal *size)         {       _GR_->SetFontSize(*size);       }\r
@@ -226,6 +229,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 +265,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 8374232088e4e2a055a8e2e6c284e8b71a1fa254..c007513300905e70393d767afcdfdbb122ec1cab 100644 (file)
@@ -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
@@ -247,7 +247,7 @@ GifFileType *gif;*/
        SetPenPal("k-1");               Alpha(false);\r
        stack.clear();  Restore();      DefColor('k');\r
        SetPlotFactor(0);       Sub.clear();\r
-       InPlot(0,1,0,1,false);\r
+       InPlot(0,1,0,1,false);  clr(MGL_FULL_CURV);\r
        SetTickLen(0);  SetCut(true);\r
        AdjustTicks("xyzc",true);       Clf('w');\r
 \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(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, 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, 16);\r
+       }\r
 }\r
 //-----------------------------------------------------------------------------\r
 #define MGL_TRIG_PLOT  if(Quality&MGL_DRAW_LMEM)       \\r
@@ -391,12 +402,12 @@ void mglCanvas::line_plot(long p1, long p2)
                                                        a.m=mask;       a.angl=MaskAn;  a.w = pw;       add_prim(a);}\r
 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 +418,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(SamePnt(p1,p2))      {       trig_plot(p4,p2,p3);    return; }\r
+       if(SamePnt(p2,p4))      {       trig_plot(p1,p4,p3);    return; }\r
+       if(SamePnt(p1,p3))      {       trig_plot(p1,p2,p4);    return; }\r
+       if(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
@@ -470,7 +481,7 @@ pthread_mutex_lock(&mutexPtx);
                }\r
 \r
                int align;\r
-               mreal col1=col, col2=col;\r
+               float col1=col, col2=col;\r
                if(mglGetStyle(font,0,&align))\r
                {\r
                        col1 = AddTexture(font);\r
@@ -502,17 +513,17 @@ pthread_mutex_lock(&mutexPtx);
                        add_prim(a);\r
                }\r
 \r
-               q.c=col1;       q.t=0;  Txt[long(col1)].GetC(col1,0,q);\r
-               q.u = q.v = NAN;        q.a=q.t=q.ta=1;\r
-               memset(Bt.b,0,9*sizeof(mreal));\r
+               q.c=col1;       q.ta=0; Txt[long(col1)].GetC(col1,0,q);\r
+               q.u = q.v = NAN;        q.a=q.ta=1;\r
+               memset(Bt.b,0,9*sizeof(float));\r
                Bt.b[0] = Bt.b[4] = Bt.b[8] = fscl;\r
-               register mreal opf = Bt.pf;\r
+               float 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
                        long k1,k2,k3,k4;       mglPnt pt;      mglPoint pp;\r
                        w = fnt->Width(text,font);      h = fnt->Height(font);\r
-                       mreal d=-w*align/2.-h*0.2;      w+=h*0.4;\r
+                       float d=-w*align/2.-h*0.2;      w+=h*0.4;\r
                        pt = q; pp.Set(d,-h*0.4);               PostScale(&Bt,pp);\r
                        pt.x=pt.xx=pp.x;        pt.y=pt.yy=pp.y;\r
 #pragma omp critical(pnt)\r
@@ -568,6 +579,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 || mgl_isnan(Pnt[p1].x))        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 +620,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
@@ -632,7 +669,7 @@ void mglCanvas::InPlot(mglMatrix &M,mreal x1,mreal x2,mreal y1,mreal y2, bool re
        }\r
        inW=M.b[0];     inH=M.b[4];     ZMin=1;\r
        inX=Width*x1;   inY=Height*y1;\r
-       font_factor = M.b[0] < M.b[4] ? M.b[0] : M.b[4];\r
+       if(!rel || !get(MGL_NO_SCALE_REL))      font_factor = M.b[0] < M.b[4] ? M.b[0] : M.b[4];\r
 \r
        mglBlock p;     p.AmbBr = AmbBr;        p.DifBr = DifBr;        p.B = M;\r
        for(int i=0;i<10;i++)   p.light[i] = light[i];\r
@@ -667,8 +704,8 @@ void mglCanvas::Rotate(mreal tetz,mreal tetx,mreal tety)
        B.Rotate(tetz,tetx,tety);\r
        if(get(MGL_AUTO_FACTOR))\r
        {\r
-               mreal w=(fabs(B.b[3])+fabs(B.b[4])+fabs(B.b[5]))/B1.b[4];\r
-               mreal h=(fabs(B.b[0])+fabs(B.b[1])+fabs(B.b[2]))/B1.b[0];\r
+               float w=(fabs(B.b[3])+fabs(B.b[4])+fabs(B.b[5]))/B1.b[4];\r
+               float h=(fabs(B.b[0])+fabs(B.b[1])+fabs(B.b[2]))/B1.b[0];\r
                B.pf = 1.55+0.6147*(w<h ? (h-1):(w-1));\r
        }\r
        size_t n = Sub.size();  if(n>0) Sub[n-1].B = B;\r
@@ -679,12 +716,12 @@ void mglMatrix::Rotate(mreal tetz,mreal tetx,mreal tety)
 //     RotateN(TetX,1.,0.,0.);\r
 //     RotateN(TetY,0.,1.,0.);\r
 //     RotateN(TetZ,0.,0.,1.);\r
-       mreal R[9], O[9];\r
-       mreal cx=cos(tetx*M_PI/180), sx=-sin(tetx*M_PI/180), cy=cos(tety*M_PI/180), sy=-sin(tety*M_PI/180), cz=cos(tetz*M_PI/180), sz=-sin(tetz*M_PI/180);\r
+       float R[9], O[9];\r
+       float cx=cos(tetx*M_PI/180), sx=-sin(tetx*M_PI/180), cy=cos(tety*M_PI/180), sy=-sin(tety*M_PI/180), cz=cos(tetz*M_PI/180), sz=-sin(tetz*M_PI/180);\r
        R[0] = cx*cy;                   R[1] = -cy*sx;                  R[2] = sy;\r
        R[3] = cx*sy*sz+cz*sx;  R[4] = cx*cz-sx*sy*sz;  R[5] =-cy*sz;\r
        R[6] = sx*sz-cx*cz*sy;  R[7] = cx*sz+cz*sx*sy;  R[8] = cy*cz;\r
-       memcpy(O,b,9*sizeof(mreal));\r
+       memcpy(O,b,9*sizeof(float));\r
        b[0] = R[0]*O[0] + R[3]*O[1] + R[6]*O[2];\r
        b[1] = R[1]*O[0] + R[4]*O[1] + R[7]*O[2];\r
        b[2] = R[2]*O[0] + R[5]*O[1] + R[8]*O[2];\r
@@ -701,21 +738,21 @@ void mglCanvas::RotateN(mreal Tet,mreal x,mreal y,mreal z)
        B.RotateN(Tet,x,y,z);\r
        if(get(MGL_AUTO_FACTOR))\r
        {\r
-               mreal w=(fabs(B.b[3])+fabs(B.b[4])+fabs(B.b[5]))/B1.b[4];\r
-               mreal h=(fabs(B.b[0])+fabs(B.b[1])+fabs(B.b[2]))/B1.b[0];\r
+               float w=(fabs(B.b[3])+fabs(B.b[4])+fabs(B.b[5]))/B1.b[4];\r
+               float h=(fabs(B.b[0])+fabs(B.b[1])+fabs(B.b[2]))/B1.b[0];\r
                B.pf = 1.55+0.6147*(w<h ? (h-1):(w-1));\r
        }\r
        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
-       memcpy(R,b,9*sizeof(mreal));\r
+       float 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(float));\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
        b[2] = T[2]*R[0] + T[5]*R[1] + T[8]*R[2];\r
@@ -759,11 +796,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 = inH*dx;    Ay = inW*dy*fy; Az = sqrt(inW*inH)*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
@@ -777,8 +814,8 @@ void mglCanvas::Aspect(mreal Ax,mreal Ay,mreal Az)
 //-----------------------------------------------------------------------------\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
+       float Fx=1+fabs(Sx)*inH/inW, Fy=1+fabs(Sy)*inW/inH;\r
+       const float R[6]={B.b[0],B.b[1],B.b[2],B.b[3],B.b[4],B.b[5]};\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
@@ -836,7 +873,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
@@ -850,7 +887,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
@@ -872,17 +910,19 @@ 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
        // add '+' sign if required\r
        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
+       {       for(size_t i=le+1;i>0;i--)      se[i]=se[i-1];\r
+               for(size_t i=lf+1;i>0;i--)      sf[i]=sf[i-1];\r
+               se[0] = sf[0] = '+';    }\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
@@ -930,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
@@ -986,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
@@ -1014,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
@@ -1079,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
@@ -1106,8 +1145,8 @@ void mglCanvas::Title(const wchar_t *title,const char *stl,mreal size)
        int align;\r
        bool box=mglchr(stl,'#'), col = mglGetStyle(stl,0,&align);\r
        align = align&3;\r
-       mreal y=inY+inH-h;\r
-       mglPoint p(inX + inW*align/2.,y,3*Depth),q(NAN,NAN,NAN);\r
+       mreal y=inY+inH-h, zpos = 0;//3*Depth;\r
+       mglPoint p(inX + inW*align/2.,y,zpos),q(NAN,NAN,NAN);\r
        mglMatrix M=B;  M.norot=true;\r
        if(title)       text_plot(AddPnt(&M,p,-1,q,-1,0),title,stl,size);\r
        if(box) //      draw boungind box\r
@@ -1116,10 +1155,10 @@ void mglCanvas::Title(const wchar_t *title,const char *stl,mreal size)
                if((Flag&3)==2 && !col) {       mreal cc=c1;    c2=c1;  c1=cc;  }\r
                else if((Flag&3)==2)    c1=AddTexture('k');\r
                long k1,k2,k3,k4;\r
-               k1=AddPnt(&M,mglPoint(inX,y-h*0.4,3*Depth),c1,q,-1,0);\r
-               k2=AddPnt(&M,mglPoint(inX+inW,y-h*0.4,3*Depth),c1,q,-1,0);\r
-               k3=AddPnt(&M,mglPoint(inX,y+h,3*Depth),c1,q,-1,0);\r
-               k4=AddPnt(&M,mglPoint(inX+inW,y+h,3*Depth),c1,q,-1,0);\r
+               k1=AddPnt(&M,mglPoint(inX,y-h*0.4,zpos),c1,q,-1,0);\r
+               k2=AddPnt(&M,mglPoint(inX+inW,y-h*0.4,zpos),c1,q,-1,0);\r
+               k3=AddPnt(&M,mglPoint(inX,y+h,zpos),c1,q,-1,0);\r
+               k4=AddPnt(&M,mglPoint(inX+inW,y+h,zpos),c1,q,-1,0);\r
                quad_plot(k1,k2,k3,k4);\r
                k1=CopyNtoC(k1,c2);     k2=CopyNtoC(k2,c2);\r
                k3=CopyNtoC(k3,c2);     k4=CopyNtoC(k4,c2);\r
@@ -1138,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
@@ -1176,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(&mutexStk);\r
+       stack.pop_back();\r
+       pthread_mutex_unlock(&mutexStk);\r
+#else\r
+#pragma omp critical(stk)\r
+       stack.pop_back();\r
+#endif\r
+}\r
index 6d7cbb7ccf8c85b3023514b7976e5e753746b273..cc851c15582c05a375344b189a2188d2456573c2 100644 (file)
@@ -123,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
@@ -145,15 +149,15 @@ 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
@@ -232,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
@@ -301,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
@@ -383,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
@@ -488,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 891482b22d2b1e87e3168770979850e133bb0cd9..4450a24bf913544a484bc879d597204cae1f15b6 100644 (file)
@@ -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
@@ -94,7 +92,7 @@ mdual MGL_EXPORT_CONST mgl_expi(dual a)
        return r.real()+r.imag()*mgl_I;\r
 }\r
 //-----------------------------------------------------------------------------\r
-MGL_NO_EXPORT void *mgl_csmth_x(void *par)\r
+static void *mgl_csmth_x(void *par)\r
 {\r
        mglThreadC *t=(mglThreadC *)par;\r
        long nx=t->p[0], kind=t->p[2];\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,14 +116,14 @@ 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
                }\r
        return 0;\r
 }\r
-MGL_NO_EXPORT void *mgl_csmth_y(void *par)\r
+static void *mgl_csmth_y(void *par)\r
 {\r
        mglThreadC *t=(mglThreadC *)par;\r
        long nx=t->p[0],ny=t->p[1], kind=t->p[2];\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,17 +147,17 @@ 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
                }\r
        return 0;\r
 }\r
-MGL_NO_EXPORT void *mgl_csmth_z(void *par)\r
+static 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
@@ -239,7 +237,7 @@ void MGL_EXPORT mgl_datac_smooth_(uintptr_t *d, const char *dir, mreal *delta,in
 {      char *s=new char[l+1];  memcpy(s,dir,l);        s[l]=0;\r
        mgl_datac_smooth(_DC_,s,*delta);                delete []s;     }\r
 //-----------------------------------------------------------------------------\r
-MGL_NO_EXPORT void *mgl_ccsum_z(void *par)\r
+static void *mgl_ccsum_z(void *par)\r
 {\r
        mglThreadC *t=(mglThreadC *)par;\r
        long nz=t->p[2], nn=t->n;\r
@@ -255,7 +253,7 @@ MGL_NO_EXPORT void *mgl_ccsum_z(void *par)
        }\r
        return 0;\r
 }\r
-MGL_NO_EXPORT void *mgl_ccsum_y(void *par)\r
+static void *mgl_ccsum_y(void *par)\r
 {\r
        mglThreadC *t=(mglThreadC *)par;\r
        long nx=t->p[0], ny=t->p[1], nn=t->n;\r
@@ -266,12 +264,12 @@ 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
 }\r
-MGL_NO_EXPORT void *mgl_ccsum_x(void *par)\r
+static void *mgl_ccsum_x(void *par)\r
 {\r
        mglThreadC *t=(mglThreadC *)par;\r
        long nx=t->p[0], nn=t->n;\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
@@ -315,7 +313,7 @@ void MGL_EXPORT mgl_datac_cumsum_(uintptr_t *d, const char *dir,int l)
 {      char *s=new char[l+1];  memcpy(s,dir,l);        s[l]=0;\r
        mgl_datac_cumsum(_DC_,s);       delete []s;     }\r
 //-----------------------------------------------------------------------------\r
-MGL_NO_EXPORT void *mgl_cint_z(void *par)\r
+static void *mgl_cint_z(void *par)\r
 {\r
        mglThreadC *t=(mglThreadC *)par;\r
        long nz=t->p[2], nn=t->n;\r
@@ -331,7 +329,7 @@ MGL_NO_EXPORT void *mgl_cint_z(void *par)
        }\r
        return 0;\r
 }\r
-MGL_NO_EXPORT void *mgl_cint_y(void *par)\r
+static void *mgl_cint_y(void *par)\r
 {\r
        mglThreadC *t=(mglThreadC *)par;\r
        long nx=t->p[0], ny=t->p[1], nn=t->n;\r
@@ -342,12 +340,12 @@ 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
 }\r
-MGL_NO_EXPORT void *mgl_cint_x(void *par)\r
+static void *mgl_cint_x(void *par)\r
 {\r
        mglThreadC *t=(mglThreadC *)par;\r
        long nx=t->p[0], nn=t->n;\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
@@ -391,7 +389,7 @@ void MGL_EXPORT mgl_datac_integral_(uintptr_t *d, const char *dir,int l)
 {      char *s=new char[l+1];  memcpy(s,dir,l);        s[l]=0;\r
        mgl_datac_integral(_DC_,s);     delete []s;     }\r
 //-----------------------------------------------------------------------------\r
-MGL_NO_EXPORT void *mgl_cdif_z(void *par)\r
+static void *mgl_cdif_z(void *par)\r
 {\r
        mglThreadC *t=(mglThreadC *)par;\r
        long nz=t->p[2], nn=t->n;\r
@@ -408,7 +406,7 @@ MGL_NO_EXPORT void *mgl_cdif_z(void *par)
        }\r
        return 0;\r
 }\r
-MGL_NO_EXPORT void *mgl_cdif_y(void *par)\r
+static void *mgl_cdif_y(void *par)\r
 {\r
        mglThreadC *t=(mglThreadC *)par;\r
        long nx=t->p[0], ny=t->p[1], nn=t->n;\r
@@ -419,14 +417,14 @@ 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
        }\r
        return 0;\r
 }\r
-MGL_NO_EXPORT void *mgl_cdif_x(void *par)\r
+static void *mgl_cdif_x(void *par)\r
 {\r
        mglThreadC *t=(mglThreadC *)par;\r
        long nx=t->p[0], nn=t->n;\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
@@ -471,7 +469,7 @@ void MGL_EXPORT mgl_datac_diff_(uintptr_t *d, const char *dir,int l)
 {      char *s=new char[l+1];  memcpy(s,dir,l);        s[l]=0;\r
        mgl_datac_diff(_DC_,s); delete []s;     }\r
 //-----------------------------------------------------------------------------\r
-MGL_NO_EXPORT void *mgl_cdif2_z(void *par)\r
+static void *mgl_cdif2_z(void *par)\r
 {\r
        mglThreadC *t=(mglThreadC *)par;\r
        long nz=t->p[2], nn=t->n;\r
@@ -487,7 +485,7 @@ MGL_NO_EXPORT void *mgl_cdif2_z(void *par)
        }\r
        return 0;\r
 }\r
-MGL_NO_EXPORT void *mgl_cdif2_y(void *par)\r
+static void *mgl_cdif2_y(void *par)\r
 {\r
        mglThreadC *t=(mglThreadC *)par;\r
        long nx=t->p[0], ny=t->p[1], nn=t->n;\r
@@ -498,12 +496,12 @@ 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
 }\r
-MGL_NO_EXPORT void *mgl_cdif2_x(void *par)\r
+static void *mgl_cdif2_x(void *par)\r
 {\r
        mglThreadC *t=(mglThreadC *)par;\r
        long nx=t->p[0], nn=t->n;\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
@@ -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
@@ -1054,7 +1069,7 @@ void MGL_EXPORT mgl_datac_put_dat_(uintptr_t *d, uintptr_t *val, int *i, int *j,
 void MGL_EXPORT mgl_difr_grid(dual *a,int n,int step,dual q,int Border,dual *tmp,int kk);\r
 void MGL_EXPORT mgl_difr_axial(dual *a,int n,int step,dual q,int Border,dual *tmp,int kk, double di);\r
 //-----------------------------------------------------------------------------\r
-MGL_NO_EXPORT void *mgl_difr(void *par)\r
+static void *mgl_difr(void *par)\r
 {\r
 #if !defined(_MSC_VER) // MSVC produce internal compiler error on this code\r
        mglThreadC *t=(mglThreadC *)par;\r
@@ -1085,25 +1100,29 @@ 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 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
-       bool axial = mglchr(how,'r')||mglchr(how,'r');\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;     p[2]=0;\r
-               mglStartThreadC(mgl_difr,0,nx*ny,0,&qq,0,p);\r
+               mglStartThreadC(mgl_difr,0,nx*ny,d->a,&qq,0,p);\r
        }\r
        if(mglchr(how,'y') && ny>1 && !axial)\r
        {\r
                p[0]=ny;        p[1]=nx;        p[2]=0;\r
-               mglStartThreadC(mgl_difr,0,nx*nz,0,&qq,0,p);\r
+               mglStartThreadC(mgl_difr,0,nx*nz,d->a,&qq,0,p);\r
        }\r
        if(mglchr(how,'x') && nx>1 && !axial)\r
        {\r
                p[0]=nx;        p[1]=1; p[2]=0;\r
-               mglStartThreadC(mgl_difr,0,ny*nz,0,&qq,0,p);\r
+               mglStartThreadC(mgl_difr,0,ny*nz,d->a,&qq,0,p);\r
        }\r
        if(axial && nx>1)\r
        {\r
@@ -1150,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
@@ -1193,7 +1212,7 @@ 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
+               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
@@ -1222,8 +1241,8 @@ void MGL_EXPORT mgl_datac_refill_xy(HADT dat, HCDT xdat, HCDT ydat, HCDT vdat, m
                        long yy1 = long(mgl_min( mgl_min(vy0,vy1), mgl_min(vy2,vy3) ));\r
                        long xx2 = long(mgl_max( mgl_max(vx0,vx1), mgl_max(vx2,vx3) ));\r
                        long yy2 = long(mgl_max( mgl_max(vy0,vy1), mgl_max(vy2,vy3) ));\r
-                       xx1=mgl_max(xx1,0);     xx2=mgl_min(xx2,nx-1);\r
-                       yy1=mgl_max(yy1,0);     yy2=mgl_min(yy2,ny-1);\r
+                       xx1=mgl_imax(xx1,0);    xx2=mgl_imin(xx2,nx-1);\r
+                       yy1=mgl_imax(yy1,0);    yy2=mgl_imin(yy2,ny-1);\r
                        if(xx1>xx2 || yy1>yy2)  continue;\r
 \r
                        mreal d1x = vx1-vx0, d1y = vy1-vy0;\r
@@ -1270,7 +1289,7 @@ void MGL_EXPORT mgl_datac_refill_xy(HADT dat, HCDT xdat, HCDT ydat, HCDT vdat, m
                for(long j=0;j<ny;j++)  for(long i=0;i<nx;i++)\r
                {\r
                        dual d = mgl_datac_spline(vdat,u.a[i],v.a[j],0);\r
-                       register long i0=i+nx*j;\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
@@ -1279,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
@@ -1323,3 +1343,195 @@ void MGL_EXPORT mgl_datac_refill_xyz(HADT dat, HCDT xdat, HCDT ydat, HCDT zdat,
        }\r
 }\r
 //-----------------------------------------------------------------------------\r
+static 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
+static 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
+static 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 3c3af89a584b803f591fd234161cdd5e9e075cd3..dd8aed8d8328ea45a27b12cafcaf4c431fd1bbc3 100644 (file)
@@ -22,6 +22,7 @@
 #include "mgl2/evalc.h"\r
 #include "mgl2/thread.h"\r
 #include "interp.hpp"\r
+void MGL_NO_EXPORT mgl_txt_funcC(const mreal *x, mreal *dx, void *par);\r
 HADT MGL_NO_EXPORT mglFormulaCalcC(const char *str, const std::vector<mglDataA*> &head);\r
 //-----------------------------------------------------------------------------\r
 HADT MGL_EXPORT mgl_datac_trace(HCDT d)\r
@@ -110,51 +111,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
@@ -188,7 +191,7 @@ uintptr_t MGL_EXPORT mgl_datac_subdata_(uintptr_t *d, int *xx,int *yy,int *zz)
 uintptr_t MGL_EXPORT mgl_datac_subdata_ext_(uintptr_t *d, uintptr_t *xx, uintptr_t *yy, uintptr_t *zz)\r
 {      return uintptr_t(mgl_datac_subdata_ext(_DC_,_DA_(xx),_DA_(yy),_DA_(zz)));       }\r
 //-----------------------------------------------------------------------------\r
-MGL_NO_EXPORT void *mgl_cresize(void *par)\r
+static void *mgl_cresize(void *par)\r
 {\r
        mglThreadC *t=(mglThreadC *)par;\r
        long nx=t->p[0]+0.1, ny=t->p[1]+0.1;\r
@@ -201,7 +204,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 +213,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
@@ -262,7 +265,7 @@ HADT MGL_EXPORT mgl_datac_combine(HCDT d1, HCDT d2)
 uintptr_t MGL_EXPORT mgl_datac_combine_(uintptr_t *a, uintptr_t *b)\r
 {      return uintptr_t(mgl_datac_combine(_DA_(a),_DA_(b)));   }\r
 //-----------------------------------------------------------------------------\r
-MGL_NO_EXPORT void *mgl_sumc_z(void *par)\r
+static void *mgl_sumc_z(void *par)\r
 {\r
        mglThreadC *t=(mglThreadC *)par;\r
        long nz=t->p[2], nn=t->n;\r
@@ -279,7 +282,7 @@ MGL_NO_EXPORT void *mgl_sumc_z(void *par)
        }\r
        return 0;\r
 }\r
-MGL_NO_EXPORT void *mgl_sumc_y(void *par)\r
+static void *mgl_sumc_y(void *par)\r
 {\r
        mglThreadC *t=(mglThreadC *)par;\r
        long nx=t->p[0], ny=t->p[1], nn=t->n;\r
@@ -290,13 +293,13 @@ 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
        return 0;\r
 }\r
-MGL_NO_EXPORT void *mgl_sumc_x(void *par)\r
+static void *mgl_sumc_x(void *par)\r
 {\r
        mglThreadC *t=(mglThreadC *)par;\r
        long nx=t->p[0], nn=t->n;\r
@@ -307,7 +310,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
@@ -355,10 +358,10 @@ HADT MGL_EXPORT mgl_datac_momentum(HCDT dat, char dir, const char *how)
 {\r
        if(!how || !(*how) || !strchr("xyz",dir))       return 0;\r
        long nx=dat->GetNx(),ny=dat->GetNy(),nz=dat->GetNz();\r
-       mglDataV x(nx,ny,nz, 0,1,'x');  x.s=L"x";\r
-       mglDataV y(nx,ny,nz, 0,1,'y');  y.s=L"y";\r
-       mglDataV z(nx,ny,nz, 0,1,'z');  z.s=L"z";\r
-       mglDataC u(dat);        u.s=L"u";       // NOTE slow !!!\r
+       mglDataV x(nx,ny,nz, 0,1,'x');  x.Name(L"x");\r
+       mglDataV y(nx,ny,nz, 0,1,'y');  y.Name(L"y");\r
+       mglDataV z(nx,ny,nz, 0,1,'z');  z.Name(L"z");\r
+       mglDataC u(dat);        u.Name(L"u");   // NOTE slow !!!\r
        std::vector<mglDataA*> list;\r
        list.push_back(&x);     list.push_back(&y);     list.push_back(&z);     list.push_back(&u);\r
        HADT res=mglFormulaCalcC(how,list), b=0;\r
@@ -452,24 +455,18 @@ uintptr_t MGL_EXPORT mgl_datac_evaluate_(uintptr_t *d, uintptr_t *idat, uintptr_
 //-----------------------------------------------------------------------------\r
 HADT MGL_EXPORT mgl_datac_column(HCDT dat, const char *eq)\r
 {\r
-       const mglData *dd=dynamic_cast<const mglData *>(dat);\r
        std::vector<mglDataA*> list;\r
-       if(dd && dd->id.length()>0)     for(size_t i=0;i<dd->id.length();i++)\r
-       {\r
-               mglDataT *col = new mglDataT(*dat);\r
-               col->SetInd(i,dd->id[i]);\r
-               list.push_back(col);\r
-       }\r
-       const mglDataC *dc=dynamic_cast<const mglDataC *>(dat);\r
-       if(dc && dc->id.length()>0)     for(size_t i=0;i<dc->id.length();i++)\r
+       const char *id = dat->GetColumnId();\r
+       size_t len = strlen(id);\r
+       for(size_t i=0;i<len;i++)\r
        {\r
                mglDataT *col = new mglDataT(*dat);\r
-               col->SetInd(i,dc->id[i]);\r
+               col->SetInd(i,id[i]);\r
                list.push_back(col);\r
        }\r
        if(list.size()==0)      return 0;       // no named columns\r
        mglDataV *t = new mglDataV(dat->GetNy(),dat->GetNz());\r
-       t->s=L"#$mgl";  list.push_back(t);\r
+       t->Name(L"#$mgl");      list.push_back(t);\r
        HADT r = mglFormulaCalcC(eq,list);\r
        for(size_t i=0;i<list.size();i++)       delete list[i];\r
        return r;\r
@@ -624,3 +621,105 @@ 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
+HADT MGL_EXPORT mgl_find_roots_txt_c(const char *func, const char *vars, HCDT ini)\r
+{\r
+       if(!vars || !(*vars) || !func || !ini)  return 0;\r
+       mglEqTxT par;\r
+       par.var=vars;   par.FillCmplx(func);\r
+       size_t n = par.str.size();\r
+       if(ini->GetNx()!=long(n))       return 0;\r
+       mreal *xx = new mreal[2*n];\r
+       mglDataC *res = new mglDataC(ini);\r
+       for(long j=0;j<ini->GetNy()*ini->GetNz();j++)\r
+       {\r
+               for(size_t i=0;i<n;i++)\r
+               {       dual c = ini->vcthr(i+n*j);     xx[2*i] = real(c);      xx[2*i+1] = imag(c);    }\r
+               bool ok=mgl_find_roots(2*n,mgl_txt_funcC,xx,&par);\r
+               for(size_t i=0;i<n;i++) res->a[i+n*j] = ok?dual(xx[2*i],xx[2*i+1]):NAN;\r
+       }\r
+       delete []xx;    return res;\r
+}\r
+uintptr_t MGL_EXPORT mgl_find_roots_txt_c_(const char *func, const char *vars, uintptr_t *ini,int l,int m)\r
+{      char *s=new char[l+1];  memcpy(s,func,l);       s[l]=0;\r
+       char *v=new char[m+1];  memcpy(v,vars,m);       v[m]=0;\r
+       uintptr_t r = uintptr_t(mgl_find_roots_txt_c(s,v,_DA_(ini)));\r
+       delete []s;     delete []v;     return r;       }\r
+//-----------------------------------------------------------------------------\r
index 26d3eb984084f7f0dcc9162bbb65656b02c86d4d..0080a2a84fd159d4f6fb2c82554cb47606d41bdb 100644 (file)
@@ -51,45 +51,71 @@ 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
-void mglFromStr(HADT d,char *buf,long NX,long NY,long NZ)      // TODO: add multithreading read\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)\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
+       while(*buf && *buf<=' ')        buf++;\r
        lines.push_back(buf);\r
        for(char *s=buf; *s; s++)       if(isn(*s))\r
        {       lines.push_back(s+1);   *s = 0; s++;    }\r
        numbs.resize(lines.size());\r
        long nl = long(lines.size());\r
-//#pragma omp parallel for\r
+#pragma omp parallel for\r
        for(long k=0;k<nl;k++)\r
        {\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
+                               std::string id;\r
+                               if(j<nb-1 && b[j+1]=='#')       for(long i=j+2;i<nb;i++)\r
+                                       if(b[i]>='a' && b[i]<='z')      id.push_back(b[i]);\r
+                               d->SetColumnId(id.c_str());\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 +123,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 +147,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 +156,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 +180,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
@@ -231,33 +227,26 @@ void MGL_EXPORT mgl_datac_rearrange(HADT d, long mx,long my,long mz)
 void MGL_EXPORT mgl_datac_rearrange_(uintptr_t *d, int *mx, int *my, int *mz)\r
 {      mgl_datac_rearrange(_DC_,*mx,*my,*mz);  }\r
 //-----------------------------------------------------------------------------\r
-void MGL_EXPORT mgl_datac_set_id(HADT d, const char *ids)      {       d->id = ids;    }\r
-void MGL_EXPORT mgl_datac_set_id_(uintptr_t *d, const char *eq,int l)\r
-{      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)\r
+               {\r
+                       std::string id = dc->GetColumnId();\r
+                       if(!id.empty()) out += "## "+id+'\n';\r
+               }\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 +255,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 +281,19 @@ 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
+       char *buf = mgl_read_gz(fp), *tbuf=buf;\r
+       while(*buf && *buf<=' ')        buf++;  // remove leading spaces\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 +302,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 +314,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 +326,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(tbuf);     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
@@ -348,7 +337,7 @@ void MGL_EXPORT mgl_datac_create(HADT d,long mx,long my,long mz)
        d->nx = mx>0 ? mx:1;    d->ny = my>0 ? my:1;    d->nz = mz>0 ? mz:1;\r
        if(d->a && !d->link)    delete [](d->a);\r
        d->a = new dual[d->nx*d->ny*d->nz];\r
-       d->id.clear();  d->link=false;\r
+       d->NewId();     d->link=false;\r
        memset(d->a,0,d->nx*d->ny*d->nz*sizeof(dual));\r
 }\r
 void MGL_EXPORT mgl_datac_create_(uintptr_t *d, int *nx,int *ny,int *nz)\r
@@ -366,13 +355,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 +369,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,16 +414,17 @@ 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
        int r = mgl_datac_read_mat(_DC_,s,*dim);        delete []s;     return r;       }\r
 //-----------------------------------------------------------------------------\r
-MGL_NO_EXPORT void *mgl_cfill_x(void *par)\r
+static void *mgl_cfill_x(void *par)\r
 {\r
        mglThreadC *t=(mglThreadC *)par;\r
        long nx=t->p[0],ny=t->p[1];\r
@@ -473,9 +461,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
@@ -593,7 +584,7 @@ void MGL_EXPORT mgl_datac_transpose_(uintptr_t *d, const char *dim,int l)
 {      char *s=new char[l+1];  memcpy(s,dim,l);        s[l]=0;\r
        mgl_datac_transpose(_DC_,s);    delete []s;     }\r
 //-----------------------------------------------------------------------------\r
-MGL_NO_EXPORT void *mgl_cmodify(void *par)\r
+static void *mgl_cmodify(void *par)\r
 {\r
        mglThreadC *t=(mglThreadC *)par;\r
        const mglFormulaC *f = (const mglFormulaC *)(t->v);\r
@@ -607,7 +598,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
@@ -634,26 +625,26 @@ void MGL_EXPORT mgl_datac_modify_(uintptr_t *d, const char *eq,int *dim,int l)
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_datac_modify_vw(HADT d, const char *eq,HCDT vdat,HCDT wdat)\r
 {\r
-       std::wstring s = d->s;  d->s = L"u";\r
-       mglDataV x(d->nx,d->ny,d->nz, 0,1,'x'); x.s=L"x";\r
-       mglDataV y(d->nx,d->ny,d->nz, 0,1,'y'); y.s=L"y";\r
-       mglDataV z(d->nx,d->ny,d->nz, 0,1,'z'); z.s=L"z";\r
-       mglDataV i(d->nx,d->ny,d->nz, 0,d->nx-1,'x');   i.s=L"i";\r
-       mglDataV j(d->nx,d->ny,d->nz, 0,d->ny-1,'y');   j.s=L"j";\r
-       mglDataV k(d->nx,d->ny,d->nz, 0,d->nz-1,'z');   k.s=L"k";\r
-       mglDataV r(d->nx,d->ny,d->nz);  r.s=L"#$mgl";\r
-       mglData v(vdat), w(wdat);       v.s = L"v";     w.s = L"w";\r
+       std::wstring s = d->Name();     d->Name(L"u");\r
+       mglDataV x(d->nx,d->ny,d->nz, 0,1,'x'); x.Name(L"x");\r
+       mglDataV y(d->nx,d->ny,d->nz, 0,1,'y'); y.Name(L"y");\r
+       mglDataV z(d->nx,d->ny,d->nz, 0,1,'z'); z.Name(L"z");\r
+       mglDataV i(d->nx,d->ny,d->nz, 0,d->nx-1,'x');   i.Name(L"i");\r
+       mglDataV j(d->nx,d->ny,d->nz, 0,d->ny-1,'y');   j.Name(L"j");\r
+       mglDataV k(d->nx,d->ny,d->nz, 0,d->nz-1,'z');   k.Name(L"k");\r
+       mglDataV r(d->nx,d->ny,d->nz);  r.Name(L"#$mgl");\r
+       mglData v(vdat), w(wdat);       v.Name(L"v");   w.Name(L"w");\r
        std::vector<mglDataA*> list;\r
        list.push_back(&x);     list.push_back(&y);     list.push_back(&z);     list.push_back(d);\r
        list.push_back(&v);     list.push_back(&w);     list.push_back(&r);\r
        list.push_back(&i);     list.push_back(&j);     list.push_back(&k);\r
-       d->Move(mglFormulaCalcC(eq,list));      d->s = s;\r
+       d->Move(mglFormulaCalcC(eq,list));      d->Name(s.c_str());\r
 }\r
 void MGL_EXPORT mgl_datac_modify_vw_(uintptr_t *d, const char *eq, uintptr_t *v, uintptr_t *w,int l)\r
 {      char *s=new char[l+1];  memcpy(s,eq,l); s[l]=0;\r
        mgl_datac_modify_vw(_DC_,s,_DA_(v),_DA_(w));    delete []s;     }\r
 //-----------------------------------------------------------------------------\r
-bool MGL_NO_EXPORT mgl_add_file(long &kx,long &ky, long &kz, dual *&b, mglDataC *d,bool as_slice)\r
+static bool mgl_add_file(long &kx,long &ky, long &kz, dual *&b, mglDataC *d,bool as_slice)\r
 {\r
        if(as_slice && d->nz==1)\r
        {\r
@@ -702,7 +693,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 +704,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 +728,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 +737,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 +840,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 +879,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 +917,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
index e98984c736a97ad0db4ddbd6b02aa08206e3228c..692eb28c8fa61203615c88dea7e139e77c39e47c 100644 (file)
@@ -44,32 +44,34 @@ 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, g = 1.1*h;\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
+       qa.push_back(q+l*g);    qb.push_back(q-l*h);\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
+               {       qa.push_back(q+l*g);    qa.push_back(q+t*g);    qb.push_back(q-(l+t)*(h/tt));   }\r
                else if(tet<0)\r
-               {       qb.push_back(q-l*h);    qb.push_back(q-t*h);    qa.push_back(q+(l+t)*(h/tt));   }\r
+               {       qb.push_back(q-l*h);    qb.push_back(q-t*h);    qa.push_back(q+(l+t)*(g/tt));   }\r
                else\r
-               {       qa.push_back(q+l*h);    qb.push_back(q-l*h);    }\r
+               {       qa.push_back(q+l*g);    qb.push_back(q-l*h);    }\r
        }\r
        if(pos>0)       qa=qb;\r
        // adjust text direction\r
@@ -77,32 +79,33 @@ void MGL_NO_EXPORT mgl_string_curve(mglBase *gr,long f,long ,const long *ff,cons
        const char *ffont=mglchr(font,':');\r
        char *fnt = new char[strlen(font)+5];\r
        if(ffont) strcpy(fnt,ffont);    else *fnt=0;\r
-       if(qa[0].x>qa[1].x)\r
+/*     if(qa[0].x>qa[1].x)\r
        {\r
                if(align==0){   strcat(fnt,":R");       align=2;        }\r
                else if(align==1)       rev = true;\r
                else            {       strcat(fnt,":L");       align=0;        }\r
-       }\r
+       }*/\r
        if(mglchr(font,'T'))    strcat(fnt,":T");\r
        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;\r
+               p = pt[j];      w *= 1.03;\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 +114,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
@@ -127,14 +130,15 @@ void MGL_EXPORT mgl_textw_xyz(HMGL gr, HCDT x, HCDT y, HCDT z,const wchar_t *tex
        gr->SaveState(opt);\r
        static int cgid=1;      gr->StartGroup("TextC",cgid++);\r
 \r
+       long kq = gr->AllocPnts(n);\r
        long *nn = new long[n], *ff = new long[n];\r
+#pragma omp parallel for\r
        for(long i=0;i<n;i++)\r
-               ff[i] = gr->AddPnt(mglPoint(x->v(i),y->v(i),z->v(i)),-1);\r
-       for(long i=1;i<n;i++)   nn[i-1] = i;\r
+       {       ff[i] = kq+i;   nn[i] = i+1;\r
+               gr->AddPntQ(kq+i,mglPoint(x->v(i),y->v(i),z->v(i)),-1); }\r
        nn[n-1]=-1;\r
        mgl_string_curve(gr,0,n,ff,nn,text,font,-1);\r
-       gr->EndGroup();\r
-       delete []ff;    delete []nn;\r
+       delete []ff;    delete []nn;    gr->EndGroup();\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_textw_xy(HMGL gr, HCDT x, HCDT y, const wchar_t *text, const char *font, const char *opt)\r
@@ -203,8 +207,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 +247,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 +260,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 +294,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 +315,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
@@ -341,22 +351,28 @@ void MGL_NO_EXPORT mgl_draw_curvs(HMGL gr, mreal val, mreal c, int text, const s
                mglprintf(wcs,64,L"%4.3g",val);\r
                mreal del = 2*gr->TextWidth(wcs,"",-0.5);\r
                // find width and height of drawing area\r
-               mreal ar=gr->GetRatio(), w=gr->FontFactor(), h;\r
-               if(del<w/5)     del = w/5;\r
-               if(ar<1) h=w/ar;        else {  h=w;    w*=ar;  }\r
-               long m=long(2*w/del)+1, n=long(2*h/del)+1;\r
+               mreal ar=gr->GetRatio(), w=gr->GetWidth(), h = gr->GetHeight();\r
+               ar = (ar>1?1/ar:1)*gr->FontFactor();\r
+               if(del<ar/2)    del = ar/2;\r
+\r
+               long m=long(2*w/del)+3, n=long(2*h/del)+3;\r
                long *oo=new long[n*m];\r
                mreal *rr=new mreal[n*m];\r
-               for(long i=0;i<n*m;i++) {       oo[i]=-1;       rr[i]=del*del/4;        }\r
+               for(long i=0;i<n*m;i++) {       oo[i]=-1;       rr[i]=del*del;  }\r
+               int ii1 = (1664525*pc+1013904223)&0xffff, ii2 = (1664525*ii1+1013904223)&0xffff;\r
+               mreal x0 = (del*ii1)/0xffff, y0 = (del*ii2)/0xffff;\r
                for(long k=0;k<pc;k++)  // print label several times if possible\r
                {\r
                        if(nn[k]<0)     continue;\r
-                       mglPoint t = gr->GetPntP(ff[k]);\r
-                       long i = long(t.x/del); t.x -= i*del;\r
-                       long j = long(t.y/del); t.y -= j*del;\r
-                       if(i<0 || i>=m || j<0 || j>=n)  continue;       // never should be here!\r
-                       mreal xx = t.x*t.x+t.y*t.y;     i += m*j;\r
-                       if(rr[i]>xx)    {       rr[i]=xx;       oo[i]=k;        }\r
+                       const mglPoint t = gr->GetPntP(ff[k]);\r
+                       mreal tx = t.x+x0, ty = t.y+y0;         // quasi-random shift\r
+                       long i = long(tx/del);  tx -= i*del;\r
+                       long j = long(ty/del);  ty -= j*del;\r
+                       if(i>=0 && i<m && j>=0 && j<n)\r
+                       {\r
+                               tx = tx*tx+ty*ty;       i += m*j;\r
+                               if(rr[i]>tx)    {       rr[i]=tx;       oo[i]=k;        }\r
+                       }\r
                }\r
                for(long i=0;i<n*m;i++) if(oo[i]>=0)\r
                        mgl_string_curve(gr,oo[i],pc,ff,nn,wcs,text==1?"t:C":"T:C",-0.5);\r
@@ -414,7 +430,7 @@ void MGL_EXPORT mgl_cont_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const c
 #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
@@ -426,7 +442,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
@@ -435,24 +451,92 @@ void MGL_EXPORT mgl_cont_val(HMGL gr, HCDT v, HCDT z, const char *sch, const cha
        mgl_cont_xy_val(gr,v,&x,&y,z,sch,0);\r
 }\r
 //-----------------------------------------------------------------------------\r
+#define norm(x,y)      ((x)*(x)+(y)*(y))\r
+std::vector<mreal> MGL_NO_EXPORT mgl_find_saddle_val(HCDT z)\r
+{\r
+       long nx=z->GetNx(), ny=z->GetNy();\r
+       std::vector<mreal> v;\r
+       for(long i=1;i<nx-1;i++)\r
+       {\r
+               mreal dd=z->vthr(i), x1=z->vthr(i+1), x2=z->vthr(i-1), dp=z->vthr(i+nx);\r
+               if(dd<=x1 && dd<=x2 && dd>=dp)  v.push_back(z->vthr(i));\r
+               if(dd>=x1 && dd>=x2 && dd<=dp)  v.push_back(z->vthr(i));\r
+               long i0 = i+nx*(ny-1);\r
+               dd=z->vthr(i0); x1=z->vthr(i0+1);       x2=z->vthr(i0-1);       dp=z->vthr(i0-nx);\r
+               if(dd<=x1 && dd<=x2 && dd>=dp)  v.push_back(z->vthr(i0));\r
+               if(dd>=x1 && dd>=x2 && dd<=dp)  v.push_back(z->vthr(i0));\r
+       }\r
+       for(long j=1;j<ny-1;j++)\r
+       {\r
+               long i0 = nx*j;\r
+               mreal dd=z->vthr(i0), dp=z->vthr(i0+1), y1=z->vthr(i0+nx), y2=z->vthr(i0-nx);\r
+               if(dd<=dp && dd>=y1 && dd>=y2)  v.push_back(z->vthr(i0));\r
+               if(dd>=dp && dd<=y1 && dd<=y2)  v.push_back(z->vthr(i0));\r
+               i0 = nx*j+nx-1;\r
+               dd=z->vthr(i0); dp=z->vthr(i0-1);       y1=z->vthr(i0+nx);      y2=z->vthr(i0-nx);\r
+               if(dd<=dp && dd>=y1 && dd>=y2)  v.push_back(z->vthr(i0));\r
+               if(dd>=dp && dd<=y1 && dd<=y2)  v.push_back(z->vthr(i0));\r
+       }\r
+       for(long j=1;j<ny-1;j++)        for(long i=1;i<nx-1;i++)\r
+       {\r
+               long i0 = i+nx*j;       bool ok=false;\r
+               mreal dd=z->vthr(i0),x1=z->vthr(i0+1),x2=z->vthr(i0-1),y1=z->vthr(i0+nx),y2=z->vthr(i0-nx);\r
+               if(dd<=x1 && dd<=x2 && dd>=y1 && dd>=y2)        ok=true;\r
+               if(dd>=x1 && dd>=x2 && dd<=y1 && dd<=y2)        ok=true;\r
+               x1=z->vthr(i0+1+nx);    x2=z->vthr(i0-1-nx);\r
+               y1=z->vthr(i0-1+nx);    y2=z->vthr(i0+1-nx);\r
+               if(dd<=x1 && dd<=x2 && dd>=y1 && dd>=y2)        ok=true;\r
+               if(dd>=x1 && dd>=x2 && dd<=y1 && dd<=y2)        ok=true;\r
+               if(ok)  v.push_back(z->vthr(i0));\r
+       }\r
+       return v;\r
+}\r
 void MGL_EXPORT mgl_cont_xy(HMGL gr, HCDT x, HCDT y, HCDT z, 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_cont_xy_val(gr,&v,x,y,z,sch,0);\r
+       if(mglchr(sch,'.'))\r
+       {\r
+               mglDataS v;     v.dat = mgl_find_saddle_val(z);\r
+               if(v.dat.size()>0)\r
+               {\r
+                       std::sort( v.dat.begin(), v.dat.end() );\r
+                       v.dat.erase( std::unique( v.dat.begin(), v.dat.end() ), v.dat.end() );\r
+                       mgl_cont_xy_val(gr,&v,x,y,z,sch,0);\r
+               }\r
+               else    gr->SetWarn(mglWarnCnt,"Cont");\r
+       }\r
+       else\r
+       {\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_cont_xy_val(gr,&v,x,y,z,sch,0);\r
+       }\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_cont(HMGL gr, HCDT z, 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_cont_val(gr,&v,z,sch,0);\r
+       if(mglchr(sch,'.'))\r
+       {\r
+               mglDataS v;     v.dat = mgl_find_saddle_val(z);\r
+               if(v.dat.size()>0)\r
+               {\r
+                       std::sort( v.dat.begin(), v.dat.end() );\r
+                       v.dat.erase( std::unique( v.dat.begin(), v.dat.end() ), v.dat.end() );\r
+                       mgl_cont_val(gr,&v,z,sch,0);\r
+               }\r
+               else    gr->SetWarn(mglWarnCnt,"Cont");\r
+       }\r
+       else\r
+       {\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_cont_val(gr,&v,z,sch,0);\r
+       }\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_cont_xy_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *a, const char *sch, const char *opt,int l,int lo)\r
@@ -480,7 +564,7 @@ mgl_cont(_GR_, _DA_(a), s, o);      delete []o;     delete []s;     }
 //     ContF series\r
 //\r
 //-----------------------------------------------------------------------------\r
-long MGL_NO_EXPORT mgl_add_pnt(HMGL gr, mreal d, HCDT x, HCDT y, HCDT z, long i1, long j1, long i2, long j2, mreal c, bool edge)\r
+long static mgl_add_pnt(HMGL gr, mreal d, HCDT x, HCDT y, HCDT z, long i1, long j1, long i2, long j2, mreal c, bool edge)\r
 {\r
        long res=-1;\r
        if(edge || (d>0 && d<1))\r
@@ -499,7 +583,7 @@ long MGL_NO_EXPORT mgl_add_pnt(HMGL gr, mreal d, HCDT x, HCDT y, HCDT z, long i1
        return res;\r
 }\r
 //-----------------------------------------------------------------------------\r
-void MGL_NO_EXPORT mgl_add_range(HMGL gr, HCDT a, HCDT x, HCDT y, HCDT z, long i1, long j1, long di, long dj, mreal c, long &u1, long &u2, long ak, mreal v1, mreal v2)\r
+void static mgl_add_range(HMGL gr, HCDT a, HCDT x, HCDT y, HCDT z, long i1, long j1, long di, long dj, mreal c, long &u1, long &u2, long ak, mreal v1, mreal v2)\r
 {\r
        long i2=i1+di, j2=j1+dj;\r
        mreal f1 = a->v(i1,j1,ak),      f2 = a->v(i2,j2,ak), d1, d2;\r
@@ -511,7 +595,7 @@ void MGL_NO_EXPORT mgl_add_range(HMGL gr, HCDT a, HCDT x, HCDT y, HCDT z, long i
        if(u1<0)        {       u1=u2;  u2=-1;  }\r
 }\r
 //-----------------------------------------------------------------------------\r
-void MGL_NO_EXPORT mgl_add_edges(HMGL gr, HCDT a, HCDT x, HCDT y, HCDT z, long i1, long j1, long di, long dj, mreal c, long &u1, long &u2, long ak, mreal v1, mreal v2)\r
+void static mgl_add_edges(HMGL gr, HCDT a, HCDT x, HCDT y, HCDT z, long i1, long j1, long di, long dj, mreal c, long &u1, long &u2, long ak, mreal v1, mreal v2)\r
 {\r
        long i2=i1+di, j2=j1+dj;\r
        u1 = u2 = -1;\r
@@ -552,12 +636,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
@@ -640,12 +730,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
@@ -683,7 +777,7 @@ void MGL_EXPORT mgl_contf_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const
 #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
@@ -695,7 +789,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
@@ -745,10 +839,74 @@ 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
-int MGL_NO_EXPORT mgl_get_ncol(const char *sch, char *res)\r
+int static mgl_get_ncol(const char *sch, char *res)\r
 {\r
        long j=0;\r
        if(sch) for(long i=0;sch[i]&&sch[i]!=':';i++)   if(strchr(MGL_COLORS,sch[i]))\r
@@ -784,7 +942,7 @@ void MGL_EXPORT mgl_contd_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const
 #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
@@ -796,7 +954,7 @@ void MGL_EXPORT mgl_contd_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const
 //-----------------------------------------------------------------------------\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
@@ -893,7 +1051,7 @@ void MGL_EXPORT mgl_contv_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const
 #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
                mglDataV zz(n, m);      zz.Fill(z0,z0);\r
@@ -908,7 +1066,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
@@ -966,7 +1124,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
@@ -985,7 +1143,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
@@ -995,7 +1153,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
@@ -1005,7 +1163,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
@@ -1020,7 +1178,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
@@ -1031,7 +1189,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
@@ -1042,7 +1200,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
@@ -1072,7 +1230,7 @@ void MGL_EXPORT mgl_cont3_xyz_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, HCDT
 #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
@@ -1237,7 +1395,7 @@ void MGL_EXPORT mgl_contf3_xyz_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, HCDT
 #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
@@ -1304,44 +1462,50 @@ long MGL_LOCAL_PURE mgl_find_prev(long i, long pc, long *nn)
        for(long k=0;k<pc;k++)  if(nn[k]==i)    return k;\r
        return -1;\r
 }\r
-void MGL_NO_EXPORT mgl_axial_plot(mglBase *gr,long pc, mglPoint *ff, long *nn,char dir,mreal cc,int wire)\r
+void static mgl_axial_plot(mglBase *gr,long pc, mglPoint *ff, long *nn,char dir,mreal cc,int wire)\r
 {\r
-       mglPoint a(0,0,1),b,c,p,q1,q2;\r
+       mglPoint a(0,0,1),b,c,q1,q2;\r
        if(dir=='x')    a.Set(1,0,0);\r
        if(dir=='y')    a.Set(0,1,0);\r
        b = !a; c = a^b;\r
 \r
-       long p1,p2,p3,p4;\r
        gr->Reserve(pc*82);\r
        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
-               p = a*ff[i].y + c*ff[i].x;\r
-               p1 = wire ? gr->AddPnt(p,cc) : gr->AddPnt(p,cc,(a*q1.y + c*q1.x)^b);\r
-               p = a*ff[nn[i]].y + c*ff[nn[i]].x;\r
-               p2 = wire ? gr->AddPnt(p,cc) : gr->AddPnt(p,cc,(a*q2.y + c*q2.x)^b);\r
-               if(wire==1)     gr->line_plot(p1,p2);\r
-               else if(wire)   {       gr->mark_plot(p1,'.');  gr->mark_plot(p2,'.');  }\r
-\r
-               for(long j=1;j<41;j++)\r
+               long kq = gr->AllocPnts(41*2);\r
+#pragma omp parallel for\r
+               for(long j=0;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
-                       p = a*ff[nn[i]].y + b*(si*ff[nn[i]].x) +  c*(co*ff[nn[i]].x);\r
-                       p2 = wire ?     gr->AddPnt(p,cc) : gr->AddPnt(p,cc,(a*q2.y + b*(si*q2.x) +  c*(co*q2.x))^(b*co-c*si));\r
-                       if(wire==1)\r
-                       {       gr->line_plot(p1,p2);   gr->line_plot(p1,p3);\r
-                       gr->line_plot(p4,p2);   gr->line_plot(p4,p3);   }\r
-                       else if(wire)   {       gr->mark_plot(p1,'.');  gr->mark_plot(p2,'.');  }\r
-                       else    gr->quad_plot(p3,p4,p1,p2);\r
+                       mglPoint p1 = a*ff[i].y + b*(si*ff[i].x) +  c*(co*ff[i].x);\r
+                       mglPoint p2 = a*ff[nn[i]].y + b*(si*ff[nn[i]].x) +  c*(co*ff[nn[i]].x);\r
+                       if(wire)\r
+                       {       gr->AddPntQ(kq+2*j,p1,cc);      gr->AddPntQ(kq+2*j+1,p2,cc);    }\r
+                       else\r
+                       {\r
+                               gr->AddPntQ(kq+2*j, p1,cc,(a*q1.y + b*(si*q1.x) +  c*(co*q1.x))^(b*co-c*si));\r
+                               gr->AddPntQ(kq+2*j+1,p2,cc,(a*q2.y + b*(si*q2.x) +  c*(co*q2.x))^(b*co-c*si));\r
+                       }\r
                }\r
+               if(wire==1)\r
+               {\r
+                       gr->line_plot(kq,kq+1);\r
+                       for(long j=1;j<41;j++)\r
+                       {\r
+                               gr->line_plot(kq+2*j,kq+2*j+1);         gr->line_plot(kq+2*j,kq+2*j-2);\r
+                               gr->line_plot(kq+2*j-1,kq+2*j+1);       gr->line_plot(kq+2*j-1,kq+2*j-2);\r
+                       }\r
+               }\r
+               else if(wire)   for(long j=0;j<41;j++)\r
+               {       gr->mark_plot(kq+2*j,'.');      gr->mark_plot(kq+2*j+1,'.');    }\r
+               else    for(long j=1;j<41;j++)\r
+               {       long i0 = kq+2*j;       gr->quad_plot(i0-2,i0-1,i0,i0+1);       }\r
        }\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -1363,7 +1527,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
@@ -1379,7 +1543,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
@@ -1412,7 +1576,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
@@ -1462,8 +1626,8 @@ void MGL_EXPORT mgl_axial_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const
 #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
@@ -1471,7 +1635,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 c9ed9658a46af25b712984b2457426429f88dbbb..c3ba949399a976aa49fa4394e449dd0d4dfc7c1d 100644 (file)
@@ -44,32 +44,43 @@ void MGL_EXPORT mgl_triplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCD
        if(nc!=n && nc>=m)      // colors per triangle\r
        {\r
                mglPoint p1,p2,p3,q;\r
-               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
+               long kq = gr->AllocPnts(m*3);\r
+#pragma omp parallel for\r
+               for(long i=0;i<m;i++)\r
                {\r
-                       register 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
-                       p2.Set(x->v(k2), y->v(k2), z->v(k2));\r
-                       register 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
-                       k2 = gr->AddPnt(p2,gr->GetC(ss,a->v(k2)),q);\r
-                       k3 = gr->AddPnt(p3,gr->GetC(ss,a->v(k3)),q);\r
-                       gr->trig_plot(k1,k2,k3);\r
+                       if(nums->v(0,i)>=0 && nums->v(1,i)>=0 && nums->v(2,i)>=0)\r
+                       {\r
+                               long k1 = long(nums->v(0,i)+0.5);\r
+                               mglPoint p1(x->v(k1), y->v(k1), z->v(k1));\r
+                               long k2 = long(nums->v(1,i)+0.5);\r
+                               mglPoint p2(x->v(k2), y->v(k2), z->v(k2));\r
+                               long k3 = long(nums->v(2,i)+0.5);\r
+                               mglPoint p3(x->v(k3), y->v(k3), z->v(k3));\r
+                               mglPoint q(wire ? mglPoint(NAN,NAN) : (p2-p1) ^ (p3-p1));\r
+                               mreal cc = a->v(i);\r
+                               gr->AddPntQ(kq+3*i,p1,gr->GetC(ss,cc),q);\r
+                               gr->AddPntQ(kq+3*i+1,p2,gr->GetC(ss,cc),q);\r
+                               gr->AddPntQ(kq+3*i+2,p3,gr->GetC(ss,cc),q);\r
+                       }\r
+                       else\r
+                       {       gr->SetPntOff(kq+3*i);  gr->SetPntOff(kq+3*i+1);        gr->SetPntOff(kq+3*i+2);        }\r
                }\r
+               if(wire)        for(long i=0;i<m;i++)\r
+               {\r
+                       gr->line_plot(kq+3*i,kq+3*i+1);\r
+                       gr->line_plot(kq+3*i+1,kq+3*i+2);\r
+                       gr->line_plot(kq+3*i+2,kq+3*i);\r
+               }\r
+               else    for(long i=0;i<m;i++)   gr->trig_plot(kq+3*i,kq+3*i+1,kq+3*i+2);\r
        }\r
        else if(nc>=n)          // colors per point\r
        {\r
-               gr->Reserve(n);\r
-               long *kk = new long[n];\r
                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
@@ -81,21 +92,23 @@ void MGL_EXPORT mgl_triplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCD
                        }\r
                        else    pp[k1]=pp[k2]=pp[k3]=mglPoint(NAN,NAN);\r
                }\r
+               long kq = gr->AllocPnts(n);\r
+#pragma omp parallel for\r
                for(long i=0;i<n;i++)   // add points\r
-                       kk[i] = gr->AddPnt(mglPoint(x->v(i), y->v(i), z->v(i)), gr->GetC(ss,a->v(i)), pp[i]);\r
+                       gr->AddPntQ(kq+i, 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
-                               gr->line_plot(kk[k3],kk[k2]);\r
+                               gr->line_plot(kq+k1,kq+k2);     gr->line_plot(kq+k1,kq+k3);\r
+                               gr->line_plot(kq+k3,kq+k2);\r
                        }\r
-                       else    gr->trig_plot(kk[k1],kk[k2],kk[k3]);\r
+                       else    gr->trig_plot(kq+k1,kq+k2,kq+k3);\r
                }\r
-               delete []kk;    delete []pp;\r
+               delete []pp;\r
        }\r
        gr->EndGroup();\r
 }\r
@@ -146,39 +159,54 @@ void MGL_EXPORT mgl_quadplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HC
        bool wire = mglchr(sch,'#');\r
        if(nc!=n && nc>=m)      // colors per triangle\r
        {\r
-               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
+               long kq = gr->AllocPnts(m*4);\r
+#pragma omp parallel for\r
+               for(long i=0;i<m;i++)\r
                {\r
-                       register 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
-                       p2.Set(x->v(k2), y->v(k2), z->v(k2));\r
-                       register 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
-                       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
-                       k2 = gr->AddPnt(p2,gr->GetC(ss,a->v(k2)),q);\r
-                       k3 = gr->AddPnt(p3,gr->GetC(ss,a->v(k3)),q);\r
-                       k4 = gr->AddPnt(p4,gr->GetC(ss,a->v(k4)),q);\r
-                       gr->quad_plot(k1,k2,k3,k4);\r
+                       if(nums->v(0,i)>=0 && nums->v(1,i)>=0 && nums->v(2,i)>=0 && nums->v(3,i)>=0)\r
+                       {\r
+                               long k1 = long(nums->v(0,i)+0.5);\r
+                               p1.Set(x->v(k1), y->v(k1), z->v(k1));\r
+                               long k2 = long(nums->v(1,i)+0.5);\r
+                               p2.Set(x->v(k2), y->v(k2), z->v(k2));\r
+                               long k3 = long(nums->v(2,i)+0.5);\r
+                               p3.Set(x->v(k3), y->v(k3), z->v(k3));\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
+                               mreal cc = a->v(i);\r
+                               gr->AddPntQ(kq+4*i,p1,gr->GetC(ss,cc),q);\r
+                               gr->AddPntQ(kq+4*i+1,p2,gr->GetC(ss,cc),q);\r
+                               gr->AddPntQ(kq+4*i+2,p3,gr->GetC(ss,cc),q);\r
+                               gr->AddPntQ(kq+4*i+3,p4,gr->GetC(ss,cc),q);\r
+                       }\r
+                       else\r
+                       {       gr->SetPntOff(kq+4*i);          gr->SetPntOff(kq+4*i+1);\r
+                               gr->SetPntOff(kq+4*i+1);        gr->SetPntOff(kq+4*i+3);        }\r
                }\r
+               if(wire)        for(long i=0;i<m;i++)\r
+               {\r
+                       gr->line_plot(kq+3*i,kq+3*i+1);\r
+                       gr->line_plot(kq+3*i+1,kq+3*i+2);\r
+                       gr->line_plot(kq+3*i+2,kq+3*i);\r
+               }\r
+               else    for(long i=0;i<m;i++)\r
+                       gr->quad_plot(kq+4*i,kq+4*i+1,kq+4*i+2,kq+4*i+3);\r
+\r
        }\r
        else if(nc>=n)          // colors per point\r
        {\r
-               gr->Reserve(n);\r
                long *kk = new long[n];\r
                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
@@ -191,20 +219,22 @@ void MGL_EXPORT mgl_quadplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HC
                                pp[k1] += q1;   pp[k2] += q2;   pp[k3] += q3;   pp[k4] += q4;\r
                        }\r
                }\r
+               long kq = gr->AllocPnts(n);\r
+#pragma omp parallel for\r
                for(long i=0;i<n;i++)   // add points\r
-                       kk[i] = gr->AddPnt(mglPoint(x->v(i), y->v(i), z->v(i)),gr->GetC(ss,a->v(i)), pp[i]);\r
+                       gr->AddPntQ(kq+i, 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
-                               gr->line_plot(kk[k4],kk[k2]);   gr->line_plot(kk[k4],kk[k3]);\r
+                               gr->line_plot(kq+k1,kq+k2);     gr->line_plot(kq+k1,kq+k3);\r
+                               gr->line_plot(kq+k4,kq+k2);     gr->line_plot(kq+k4,kq+k3);\r
                        }\r
-                       else    gr->quad_plot(kk[k1],kk[k2],kk[k3],kk[k4]);\r
+                       else    gr->quad_plot(kq+k1,kq+k2,kq+k3,kq+k4);\r
                }\r
                delete []kk;    delete []pp;\r
        }\r
@@ -252,8 +282,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
@@ -437,12 +467,14 @@ void MGL_EXPORT mgl_dots_ca(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, HCDT a, con
        if(mk==0)       mk='.';\r
        gr->Reserve(n);\r
 \r
+       long kq = gr->AllocPnts(n);\r
+#pragma omp parallel for\r
        for(long i=0;i<n;i+=d)\r
        {\r
                mglPoint p(x->vthr(i),y->vthr(i),z->vthr(i));\r
-               long pp = gr->AddPnt(p,gr->GetC(ss,c->vthr(i)),mglPoint(NAN),a?gr->GetA(a->vthr(i)):-1);\r
-               gr->mark_plot(pp, mk);\r
+               gr->AddPntQ(kq+i,p,gr->GetC(ss,c->vthr(i)),mglPoint(NAN),a?gr->GetA(a->vthr(i)):-1);\r
        }\r
+       for(long i=0;i<n;i+=d)  gr->mark_plot(kq+i, mk);\r
        gr->EndGroup();\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -503,9 +535,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 +586,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
@@ -577,7 +611,7 @@ uintptr_t MGL_EXPORT mgl_triangulation_2d_(uintptr_t *x, uintptr_t *y)
 //     DataGrid\r
 //\r
 //-----------------------------------------------------------------------------\r
-MGL_NO_EXPORT void *mgl_grid_t(void *par)\r
+static void *mgl_grid_t(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        long nx=t->p[0],ny=t->p[1];\r
@@ -589,7 +623,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 +642,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
@@ -629,9 +662,10 @@ void MGL_EXPORT mgl_data_grid_xy(HMDT d, HCDT xdat, HCDT ydat, HCDT zdat, mreal
        if((n<3) || (ydat->GetNN()!=n) || (zdat->GetNN()!=n))   return;\r
 \r
        mglData *nums = mgl_triangulation_2d(xdat,ydat);\r
+       if(!nums)       return;\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
@@ -680,7 +714,7 @@ void MGL_EXPORT mgl_crust_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t
        char *o=new char[lo+1]; memcpy(o,opt,lo);       o[lo]=0;\r
        mgl_crust(_GR_, _DA_(x),_DA_(y),_DA_(z),s, o);  delete []o;     delete []s;     }\r
 //-----------------------------------------------------------------------------\r
-long MGL_NO_EXPORT mgl_insert_trig(long i1,long i2,long i3,long **n)\r
+long static mgl_insert_trig(long i1,long i2,long i3,long **n)\r
 {\r
        static long Cur=0,Max=0;\r
        if(i1<0 || i2<0 || i3<0)        return Cur;\r
@@ -697,11 +731,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
@@ -711,7 +744,7 @@ long MGL_NO_EXPORT mgl_insert_trig(long i1,long i2,long i3,long **n)
        Cur++;  return Cur;\r
 }\r
 //-----------------------------------------------------------------------------\r
-long MGL_NO_EXPORT mgl_get_next(long k1,long n,long *,long *set,mglPoint *qq)\r
+long static mgl_get_next(long k1,long n,long *,long *set,mglPoint *qq)\r
 {\r
        long i,j=-1;\r
        mreal r,rm=FLT_MAX;\r
@@ -726,39 +759,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
        const int nnum=100;\r
-       long *ind, *set, ii;    // indexes of "close" points, flag that it was added and its number\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,nnum*sizeof(long));\r
-               for(ii=0,j=0;j<n;j++)   // find close vertexes\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
index 6263d232385de913b980f0df69ff06bdd76bc22c..8ec1a3a7c3012aebae8951c9c04aac96441c0b59 100644 (file)
@@ -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
@@ -153,7 +151,7 @@ double mgl_get_time_(const char *time, const char *fmt,int l,int m)
        char *f=new char[m+1];  memcpy(f,fmt,m);        f[m]=0;\r
        double t=mgl_get_time(s,f);     delete []s;     delete []f;     return t;       }\r
 //-----------------------------------------------------------------------------\r
-MGL_NO_EXPORT void *mgl_smth_x(void *par)\r
+static void *mgl_smth_x(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        long nx=t->p[0], kind=t->p[2];\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
@@ -193,7 +191,7 @@ MGL_NO_EXPORT void *mgl_smth_x(void *par)
                }\r
                return 0;\r
 }\r
-MGL_NO_EXPORT void *mgl_smth_y(void *par)\r
+static void *mgl_smth_y(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        long nx=t->p[0],ny=t->p[1], kind=t->p[2];\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
@@ -233,10 +231,10 @@ MGL_NO_EXPORT void *mgl_smth_y(void *par)
                }\r
                return 0;\r
 }\r
-MGL_NO_EXPORT void *mgl_smth_z(void *par)\r
+static 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
@@ -325,7 +323,7 @@ void MGL_EXPORT mgl_data_smooth_(uintptr_t *d, const char *dir, mreal *delta,int
 {      char *s=new char[l+1];  memcpy(s,dir,l);        s[l]=0;\r
        mgl_data_smooth(_DT_,s,*delta);         delete []s;     }\r
 //-----------------------------------------------------------------------------\r
-MGL_NO_EXPORT void *mgl_csum_z(void *par)\r
+static void *mgl_csum_z(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        long nz=t->p[2], nn=t->n;\r
@@ -341,7 +339,7 @@ MGL_NO_EXPORT void *mgl_csum_z(void *par)
        }\r
        return 0;\r
 }\r
-MGL_NO_EXPORT void *mgl_csum_y(void *par)\r
+static void *mgl_csum_y(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        long nx=t->p[0], ny=t->p[1], nn=t->n;\r
@@ -352,12 +350,12 @@ 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
 }\r
-MGL_NO_EXPORT void *mgl_csum_x(void *par)\r
+static void *mgl_csum_x(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        long nx=t->p[0], nn=t->n;\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
@@ -401,7 +399,7 @@ void MGL_EXPORT mgl_data_cumsum_(uintptr_t *d, const char *dir,int l)
 {      char *s=new char[l+1];  memcpy(s,dir,l);        s[l]=0;\r
        mgl_data_cumsum(_DT_,s);        delete []s;     }\r
 //-----------------------------------------------------------------------------\r
-MGL_NO_EXPORT void *mgl_int_z(void *par)\r
+static void *mgl_int_z(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        long nz=t->p[2], nn=t->n;\r
@@ -417,7 +415,7 @@ MGL_NO_EXPORT void *mgl_int_z(void *par)
        }\r
        return 0;\r
 }\r
-MGL_NO_EXPORT void *mgl_int_y(void *par)\r
+static void *mgl_int_y(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        long nx=t->p[0], ny=t->p[1], nn=t->n;\r
@@ -428,12 +426,12 @@ 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
 }\r
-MGL_NO_EXPORT void *mgl_int_x(void *par)\r
+static void *mgl_int_x(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        long nx=t->p[0], nn=t->n;\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
@@ -477,7 +475,7 @@ void MGL_EXPORT mgl_data_integral_(uintptr_t *d, const char *dir,int l)
 {      char *s=new char[l+1];  memcpy(s,dir,l);        s[l]=0;\r
        mgl_data_integral(_DT_,s);      delete []s;     }\r
 //-----------------------------------------------------------------------------\r
-MGL_NO_EXPORT void *mgl_dif_z(void *par)\r
+static void *mgl_dif_z(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        long nz=t->p[2], nn=t->n;\r
@@ -494,7 +492,7 @@ MGL_NO_EXPORT void *mgl_dif_z(void *par)
        }\r
        return 0;\r
 }\r
-MGL_NO_EXPORT void *mgl_dif_y(void *par)\r
+static void *mgl_dif_y(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        long nx=t->p[0], ny=t->p[1], nn=t->n;\r
@@ -505,14 +503,14 @@ 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
        }\r
        return 0;\r
 }\r
-MGL_NO_EXPORT void *mgl_dif_x(void *par)\r
+static void *mgl_dif_x(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        long nx=t->p[0], nn=t->n;\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
@@ -557,7 +555,7 @@ void MGL_EXPORT mgl_data_diff_(uintptr_t *d, const char *dir,int l)
 {      char *s=new char[l+1];  memcpy(s,dir,l);        s[l]=0;\r
        mgl_data_diff(_DT_,s);  delete []s;     }\r
 //-----------------------------------------------------------------------------\r
-MGL_NO_EXPORT void *mgl_dif2_z(void *par)\r
+static void *mgl_dif2_z(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        long nz=t->p[2], nn=t->n;\r
@@ -573,7 +571,7 @@ MGL_NO_EXPORT void *mgl_dif2_z(void *par)
        }\r
        return 0;\r
 }\r
-MGL_NO_EXPORT void *mgl_dif2_y(void *par)\r
+static void *mgl_dif2_y(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        long nx=t->p[0], ny=t->p[1], nn=t->n;\r
@@ -584,12 +582,12 @@ 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
 }\r
-MGL_NO_EXPORT void *mgl_dif2_x(void *par)\r
+static void *mgl_dif2_x(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        long nx=t->p[0], nn=t->n;\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
@@ -751,7 +749,7 @@ void MGL_EXPORT mgl_data_clean(HMDT d, long id)
 }\r
 void MGL_EXPORT mgl_data_clean_(uintptr_t *d, int *id) {       mgl_data_clean(_DT_,*id);       }\r
 //-----------------------------------------------------------------------------\r
-MGL_NO_EXPORT void *mgl_solve_x(void *par)\r
+static void *mgl_solve_x(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        HCDT d=(HCDT)t->v;\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
@@ -798,7 +796,7 @@ MGL_NO_EXPORT void *mgl_solve_x(void *par)
        }\r
        return 0;\r
 }\r
-MGL_NO_EXPORT void *mgl_solve_y(void *par)\r
+static void *mgl_solve_y(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        HCDT d=(HCDT)t->v;\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
@@ -845,7 +843,7 @@ MGL_NO_EXPORT void *mgl_solve_y(void *par)
        }\r
        return 0;\r
 }\r
-MGL_NO_EXPORT void *mgl_solve_z(void *par)\r
+static void *mgl_solve_z(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        HCDT d=(HCDT)t->v;\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 static 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
@@ -1462,13 +1532,12 @@ void MGL_EXPORT mgl_data_delete_(uintptr_t *d, const char *dir, int *at, int *nu
 {      mgl_data_delete(_DT_,*dir,*at,*num);    }\r
 //-----------------------------------------------------------------------------\r
 #define omod(x,y)      (y)*((x)>0?int((x)/(y)+0.5):int((x)/(y)-0.5))\r
-void MGL_NO_EXPORT mgl_omod(mreal *a, mreal da, int nx, int n)\r
+void static 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,13 +1546,13 @@ 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
 }\r
 //-----------------------------------------------------------------------------\r
-MGL_NO_EXPORT void *mgl_sew_z(void *par)\r
+static void *mgl_sew_z(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        long nz=t->p[2], nn=t->n;\r
@@ -1493,7 +1562,7 @@ MGL_NO_EXPORT void *mgl_sew_z(void *par)
        for(long i=t->id;i<nn;i+=mglNumThr)     mgl_omod(t->a+i, t->b[0], nz, nn);\r
        return 0;\r
 }\r
-MGL_NO_EXPORT void *mgl_sew_y(void *par)\r
+static void *mgl_sew_y(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        long nx=t->p[0], ny=t->p[1], nn=t->n;\r
@@ -1503,7 +1572,7 @@ MGL_NO_EXPORT void *mgl_sew_y(void *par)
        for(long i=t->id;i<nn;i+=mglNumThr)     mgl_omod(t->a+(i%nx)+nx*ny*(i/nx), t->b[0], ny, nx);\r
        return 0;\r
 }\r
-MGL_NO_EXPORT void *mgl_sew_x(void *par)\r
+static void *mgl_sew_x(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        long nx=t->p[0], nn=t->n;\r
@@ -1529,7 +1598,7 @@ 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
@@ -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
@@ -1672,7 +1741,7 @@ void MGL_EXPORT mgl_data_put_val_(uintptr_t *d, mreal *val, int *i, int *j, int
 void MGL_EXPORT mgl_data_put_dat_(uintptr_t *d, uintptr_t *val, int *i, int *j, int *k)\r
 {      mgl_data_put_dat(_DT_,_DA_(val), *i,*j,*k);     }\r
 //-----------------------------------------------------------------------------\r
-MGL_NO_EXPORT void *mgl_diff_3(void *par)\r
+static void *mgl_diff_3(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        long nx=t->p[0], ny=t->p[1], nz=t->p[2], nn=t->n, n2=nx*ny;\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
@@ -1752,10 +1821,10 @@ MGL_NO_EXPORT void *mgl_diff_3(void *par)
        }\r
        return 0;\r
 }\r
-MGL_NO_EXPORT void *mgl_diff_2(void *par)\r
+static 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
@@ -1805,7 +1874,7 @@ MGL_NO_EXPORT void *mgl_diff_2(void *par)
        }\r
        return 0;\r
 }\r
-MGL_NO_EXPORT void *mgl_diff_1(void *par)\r
+static void *mgl_diff_1(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        long nx=t->p[0], nn=t->n, same=t->p[1];\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
@@ -1990,8 +2059,8 @@ void MGL_EXPORT mgl_data_refill_xy(HMDT dat, HCDT xdat, HCDT ydat, HCDT vdat, mr
                        long yy1 = long(mgl_min( mgl_min(vy0,vy1), mgl_min(vy2,vy3) ));\r
                        long xx2 = long(mgl_max( mgl_max(vx0,vx1), mgl_max(vx2,vx3) ));\r
                        long yy2 = long(mgl_max( mgl_max(vy0,vy1), mgl_max(vy2,vy3) ));\r
-                       xx1=mgl_max(xx1,0);     xx2=mgl_min(xx2,nx-1);\r
-                       yy1=mgl_max(yy1,0);     yy2=mgl_min(yy2,ny-1);\r
+                       xx1=mgl_imax(xx1,0);    xx2=mgl_imin(xx2,nx-1);\r
+                       yy1=mgl_imax(yy1,0);    yy2=mgl_imin(yy2,ny-1);\r
                        if(xx1>xx2 || yy1>yy2)  continue;\r
 \r
                        mreal d1x = vx1-vx0, d1y = vy1-vy0;\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
@@ -2160,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 static 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 56eab8a4a4744f17143b54b1905701682737b5a8..6bc2d23805ee2f846c98e0107f7d2e1c6bec795f 100644 (file)
@@ -21,6 +21,8 @@
 #include "mgl2/data.h"\r
 #include "mgl2/eval.h"\r
 #include "mgl2/thread.h"\r
+#include "interp.hpp"\r
+void MGL_NO_EXPORT mgl_txt_func(const mreal *x, mreal *dx, void *par);\r
 HMDT MGL_NO_EXPORT mglFormulaCalc(const char *str, const std::vector<mglDataA*> &head);\r
 //-----------------------------------------------------------------------------\r
 HMDT MGL_EXPORT mgl_data_trace(HCDT d)\r
@@ -95,35 +97,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
@@ -152,7 +156,7 @@ uintptr_t MGL_EXPORT mgl_data_subdata_(uintptr_t *d, int *xx,int *yy,int *zz)
 uintptr_t MGL_EXPORT mgl_data_subdata_ext_(uintptr_t *d, uintptr_t *xx, uintptr_t *yy, uintptr_t *zz)\r
 {      return uintptr_t(mgl_data_subdata_ext(_DT_,_DA_(xx),_DA_(yy),_DA_(zz)));        }\r
 //-----------------------------------------------------------------------------\r
-MGL_NO_EXPORT void *mgl_resize(void *par)\r
+static void *mgl_resize(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        long nx=t->p[0]+0.1, ny=t->p[1]+0.1;\r
@@ -164,14 +168,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
@@ -207,7 +211,7 @@ HMDT MGL_EXPORT mgl_data_combine(HCDT d1, HCDT d2)
 uintptr_t MGL_EXPORT mgl_data_combine_(uintptr_t *a, uintptr_t *b)\r
 {      return uintptr_t(mgl_data_combine(_DA_(a),_DA_(b)));    }\r
 //-----------------------------------------------------------------------------\r
-MGL_NO_EXPORT void *mgl_sum_z(void *par)\r
+static void *mgl_sum_z(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        long nz=t->p[2], nn=t->n;\r
@@ -224,7 +228,7 @@ MGL_NO_EXPORT void *mgl_sum_z(void *par)
        }\r
        return 0;\r
 }\r
-MGL_NO_EXPORT void *mgl_sum_y(void *par)\r
+static void *mgl_sum_y(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        long nx=t->p[0], ny=t->p[1], nn=t->n;\r
@@ -235,13 +239,13 @@ 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
        return 0;\r
 }\r
-MGL_NO_EXPORT void *mgl_sum_x(void *par)\r
+static void *mgl_sum_x(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        long nx=t->p[0], nn=t->n;\r
@@ -252,7 +256,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
@@ -296,7 +300,7 @@ uintptr_t MGL_EXPORT mgl_data_sum_(uintptr_t *d, const char *dir,int l)
 {      char *s=new char[l+1];  memcpy(s,dir,l);        s[l]=0;\r
        uintptr_t r=uintptr_t(mgl_data_sum(_DT_,s));    delete []s;     return r;       }\r
 //-----------------------------------------------------------------------------\r
-MGL_NO_EXPORT void *mgl_max_z(void *par)\r
+static void *mgl_max_z(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        long nz=t->p[2], nn=t->n;\r
@@ -312,7 +316,7 @@ MGL_NO_EXPORT void *mgl_max_z(void *par)
        }\r
        return 0;\r
 }\r
-MGL_NO_EXPORT void *mgl_max_y(void *par)\r
+static void *mgl_max_y(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        long nx=t->p[0], ny=t->p[1], nn=t->n;\r
@@ -323,12 +327,12 @@ 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
 }\r
-MGL_NO_EXPORT void *mgl_max_x(void *par)\r
+static void *mgl_max_x(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        long nx=t->p[0], nn=t->n;\r
@@ -339,7 +343,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
@@ -382,7 +386,7 @@ uintptr_t MGL_EXPORT mgl_data_max_dir_(uintptr_t *d, const char *dir,int l)
 {      char *s=new char[l+1];  memcpy(s,dir,l);        s[l]=0;\r
        uintptr_t r=uintptr_t(mgl_data_max_dir(_DT_,s));        delete []s;     return r;       }\r
 //-----------------------------------------------------------------------------\r
-MGL_NO_EXPORT void *mgl_min_z(void *par)\r
+static void *mgl_min_z(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        long nz=t->p[2], nn=t->n;\r
@@ -398,7 +402,7 @@ MGL_NO_EXPORT void *mgl_min_z(void *par)
        }\r
        return 0;\r
 }\r
-MGL_NO_EXPORT void *mgl_min_y(void *par)\r
+static void *mgl_min_y(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        long nx=t->p[0], ny=t->p[1], nn=t->n;\r
@@ -409,12 +413,12 @@ 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
 }\r
-MGL_NO_EXPORT void *mgl_min_x(void *par)\r
+static void *mgl_min_x(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        long nx=t->p[0], nn=t->n;\r
@@ -425,7 +429,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
@@ -472,10 +476,10 @@ HMDT MGL_EXPORT mgl_data_momentum(HCDT dat, char dir, const char *how)
 {\r
        if(!how || !(*how) || !strchr("xyz",dir))       return 0;\r
        long nx=dat->GetNx(),ny=dat->GetNy(),nz=dat->GetNz();\r
-       mglDataV x(nx,ny,nz, 0,1,'x');  x.s=L"x";\r
-       mglDataV y(nx,ny,nz, 0,1,'y');  y.s=L"y";\r
-       mglDataV z(nx,ny,nz, 0,1,'z');  z.s=L"z";\r
-       mglData u(dat); u.s=L"u";       // NOTE slow !!!\r
+       mglDataV x(nx,ny,nz, 0,1,'x');  x.Name(L"x");\r
+       mglDataV y(nx,ny,nz, 0,1,'y');  y.Name(L"y");\r
+       mglDataV z(nx,ny,nz, 0,1,'z');  z.Name(L"z");\r
+       mglData u(dat); u.Name(L"u");   // NOTE slow !!!\r
        std::vector<mglDataA*> list;\r
        list.push_back(&x);     list.push_back(&y);     list.push_back(&z);     list.push_back(&u);\r
        HMDT res=mglFormulaCalc(how,list), b=0;\r
@@ -486,10 +490,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
@@ -501,10 +505,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
@@ -517,10 +521,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
@@ -657,7 +661,7 @@ void MGL_EXPORT mgl_data_div_num_(uintptr_t *d, mreal *b)           {       mgl_data_div_num(_D
 void MGL_EXPORT mgl_data_add_num_(uintptr_t *d, mreal *b)              {       mgl_data_add_num(_DT_, *b);     }\r
 void MGL_EXPORT mgl_data_sub_num_(uintptr_t *d, mreal *b)              {       mgl_data_sub_num(_DT_, *b);     }\r
 //-----------------------------------------------------------------------------\r
-void MGL_NO_EXPORT mgl_hist_p(mglThreadD *t,mreal *a)\r
+void static mgl_hist_p(mglThreadD *t,mreal *a)\r
 {\r
        long n=t[0].p[0];\r
        memset(a,0,n*sizeof(mreal));\r
@@ -671,7 +675,7 @@ void MGL_NO_EXPORT mgl_hist_p(mglThreadD *t,mreal *a)
                delete []b;\r
        }\r
 }\r
-MGL_NO_EXPORT void *mgl_hist_1(void *par)\r
+static void *mgl_hist_1(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        long nn=t->n, n = t->p[0];\r
@@ -684,7 +688,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
@@ -693,7 +697,7 @@ MGL_NO_EXPORT void *mgl_hist_1(void *par)
        }\r
        t->a = b;       return 0;\r
 }\r
-MGL_NO_EXPORT void *mgl_hist_2(void *par)\r
+static void *mgl_hist_2(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        long nn=t->n, n = t->p[0];\r
@@ -708,11 +712,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
@@ -771,6 +775,85 @@ void MGL_EXPORT mgl_data_sort(HMDT dat, long idx, long idy)
 void MGL_EXPORT mgl_data_sort_(uintptr_t *d, int *idx, int *idy)\r
 {      mgl_data_sort(_DT_,*idx,*idy);  }\r
 //-----------------------------------------------------------------------------\r
+//\r
+//     Find roots series\r
+//\r
+//\r
+//-----------------------------------------------------------------------------\r
+#if MGL_HAVE_GSL\r
+#include <gsl/gsl_multiroots.h>\r
+struct mglRoots\r
+{\r
+       mreal *x, *f;\r
+       size_t n;\r
+       void (*func)(const mreal *x, mreal *f, void *par);\r
+       void *par;\r
+};\r
+int static mgl_root(const gsl_vector *x, void *params, gsl_vector *f)\r
+{\r
+       mglRoots *p = (mglRoots *)params;\r
+       for(size_t i=0;i<p->n;i++)      p->x[i] = gsl_vector_get (x, i);\r
+       p->func(p->x,p->f,p->par);\r
+       bool ok = true;\r
+       for(size_t i=0;i<p->n;i++)\r
+       {       gsl_vector_set (f, i, p->f[i]);\r
+               if(mgl_isbad(p->f[i]))  ok=false;       }\r
+       return ok?GSL_SUCCESS:GSL_FAILURE;\r
+}\r
+bool MGL_EXPORT mgl_find_roots(size_t n, void (*func)(const mreal *x, mreal *f, void *par), mreal *x0, void *par)\r
+{\r
+       for(size_t i=0;i<n;i++) if(mgl_isbad(x0[i]))    return false;\r
+       mglRoots pp;\r
+       pp.x=x0;        pp.func=func;   pp.n=n; pp.par=par;\r
+       mreal *y = new mreal[n];        pp.f=y;\r
+\r
+       gsl_multiroot_function f = {&mgl_root, n, &pp};\r
+       gsl_vector *x = gsl_vector_alloc(n);\r
+       for(size_t i=0;i<n;i++) gsl_vector_set(x, i, x0[i]);\r
+\r
+       gsl_multiroot_fsolver *s = gsl_multiroot_fsolver_alloc(gsl_multiroot_fsolver_hybrids, n);\r
+       gsl_multiroot_fsolver_set(s, &f, x);\r
+\r
+       int status = GSL_CONTINUE;\r
+       for(size_t i=0;i<1000 && status==GSL_CONTINUE;i++)\r
+       {\r
+         status = gsl_multiroot_fsolver_iterate(s);\r
+         if(status)    break;\r
+         status = gsl_multiroot_test_residual(s->f, 1e-7);\r
+       }\r
+       for(size_t i=0;i<n;i++) x0[i] = gsl_vector_get(s->x, i);\r
+       gsl_multiroot_fsolver_free(s);\r
+       gsl_vector_free(x);     delete []y;\r
+       return status==GSL_SUCCESS;\r
+}\r
+#else\r
+bool MGL_EXPORT mgl_find_roots(size_t , void (*)(const mreal *, mreal *, void *), mreal *, void *)\r
+{      return false;   }\r
+#endif // MGL_HAVE_GSL\r
+//-----------------------------------------------------------------------------\r
+HMDT MGL_EXPORT mgl_find_roots_txt(const char *func, const char *vars, HCDT ini)\r
+{\r
+       if(!vars || !(*vars) || !func || !ini)  return 0;\r
+       mglEqTxT par;\r
+       par.var=vars;   par.FillReal(func);\r
+       size_t n = par.str.size();\r
+       if(ini->GetNx()!=n)     return 0;\r
+       mreal *xx = new mreal[n];\r
+       mglData *res = new mglData(ini);\r
+       for(long j=0;j<ini->GetNy()*ini->GetNz();j++)\r
+       {\r
+               for(size_t i=0;i<n;i++) xx[i] = ini->vthr(i+n*j);\r
+               bool ok=mgl_find_roots(n,mgl_txt_func,xx,&par);\r
+               for(size_t i=0;i<n;i++) res->a[i+n*j] = ok?xx[i]:NAN;\r
+       }\r
+       delete []xx;    return res;\r
+}\r
+uintptr_t MGL_EXPORT mgl_find_roots_txt_(const char *func, const char *vars, uintptr_t *ini,int l,int m)\r
+{      char *s=new char[l+1];  memcpy(s,func,l);       s[l]=0;\r
+       char *v=new char[m+1];  memcpy(v,vars,m);       v[m]=0;\r
+       uintptr_t r = uintptr_t(mgl_find_roots_txt(s,v,_DA_(ini)));\r
+       delete []s;     delete []v;     return r;       }\r
+//-----------------------------------------------------------------------------\r
 mreal MGL_EXPORT mgl_find_root(mreal (*func)(mreal x, void *par), mreal x0, void *par)\r
 {\r
        mreal x1=x0+1e-2*(x0?x0:1), f0=func(x0,par), f1=func(x1,par), x, f;\r
@@ -792,10 +875,10 @@ mreal MGL_EXPORT mgl_find_root(mreal (*func)(mreal x, void *par), mreal x0, void
 }\r
 //-----------------------------------------------------------------------------\r
 struct MGL_NO_EXPORT mglFuncV  {       mglFormula *eq; char var;       };\r
-mreal MGL_NO_EXPORT mgl_funcv(mreal v, void *par)\r
+mreal static 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
@@ -829,7 +912,7 @@ mreal MGL_EXPORT mgl_find_root_txt_(const char *func, mreal *ini, const char *va
        mreal r = mgl_find_root_txt(s,*ini,*var);\r
        delete []s;     return r;       }\r
 //-----------------------------------------------------------------------------\r
-MGL_NO_EXPORT void *mgl_pulse_z(void *par)\r
+static void *mgl_pulse_z(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        long nz=t->p[2], nn=t->n;\r
@@ -842,23 +925,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
@@ -869,7 +952,7 @@ MGL_NO_EXPORT void *mgl_pulse_z(void *par)
        }\r
        return 0;\r
 }\r
-MGL_NO_EXPORT void *mgl_pulse_y(void *par)\r
+static void *mgl_pulse_y(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        long nx=t->p[0], ny=t->p[1], nn=t->n;\r
@@ -883,23 +966,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
@@ -910,7 +993,7 @@ MGL_NO_EXPORT void *mgl_pulse_y(void *par)
        }\r
        return 0;\r
 }\r
-MGL_NO_EXPORT void *mgl_pulse_x(void *par)\r
+static void *mgl_pulse_x(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        long nx=t->p[0], nn=t->n;\r
@@ -923,23 +1006,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
@@ -990,3 +1073,81 @@ HMDT MGL_EXPORT mgl_data_pulse(HCDT dat, char dir)
 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 4fbc2f422d82240f87ea6ffb8790108ee35a3392..066335f82735417a67297841296884e7652ce09e 100644 (file)
@@ -84,20 +84,20 @@ void MGL_EXPORT mgl_data_fill_eq(HMGL gr, HMDT d, const char *eq, HCDT vdat, HCD
        if(vdat && vdat->GetNN()!=d->GetNN())   return; // incompatible dimensions
        if(wdat && wdat->GetNN()!=d->GetNN())   return;
        gr->SaveState(opt);
-       std::wstring s = d->s;  d->s = L"u";
-       mglDataV x(d->nx,d->ny,d->nz, gr->Min.x,gr->Max.x,'x'); x.s=L"x";
-       mglDataV y(d->nx,d->ny,d->nz, gr->Min.y,gr->Max.y,'y'); y.s=L"y";
-       mglDataV z(d->nx,d->ny,d->nz, gr->Min.z,gr->Max.z,'z'); z.s=L"z";
-       mglDataV i(d->nx,d->ny,d->nz, 0,d->nx-1,'x');   i.s=L"i";
-       mglDataV j(d->nx,d->ny,d->nz, 0,d->ny-1,'y');   j.s=L"j";
-       mglDataV k(d->nx,d->ny,d->nz, 0,d->nz-1,'z');   k.s=L"k";
-       mglDataV r(d->nx,d->ny,d->nz);  r.s=L"#$mgl";
-       mglData v(vdat), w(wdat);       v.s = L"v";     w.s = L"w";
+       std::wstring s = d->Name();     d->Name(L"u");
+       mglDataV x(d->nx,d->ny,d->nz, gr->Min.x,gr->Max.x,'x'); x.Name(L"x");
+       mglDataV y(d->nx,d->ny,d->nz, gr->Min.y,gr->Max.y,'y'); y.Name(L"y");
+       mglDataV z(d->nx,d->ny,d->nz, gr->Min.z,gr->Max.z,'z'); z.Name(L"z");
+       mglDataV i(d->nx,d->ny,d->nz, 0,d->nx-1,'x');   i.Name(L"i");
+       mglDataV j(d->nx,d->ny,d->nz, 0,d->ny-1,'y');   j.Name(L"j");
+       mglDataV k(d->nx,d->ny,d->nz, 0,d->nz-1,'z');   k.Name(L"k");
+       mglDataV r(d->nx,d->ny,d->nz);  r.Name(L"#$mgl");
+       mglData v(vdat), w(wdat);       v.Name(L"v");   w.Name(L"w");
        std::vector<mglDataA*> list;
        list.push_back(&x);     list.push_back(&y);     list.push_back(&z);     list.push_back(&r);
        list.push_back(d);      list.push_back(&v);     list.push_back(&w);
        list.push_back(&i);     list.push_back(&j);     list.push_back(&k);
-       d->Move(mglFormulaCalc(eq,list));       d->s = s;       gr->LoadState();
+       d->Move(mglFormulaCalc(eq,list));       d->Name(s.c_str());     gr->LoadState();
 }
 void MGL_EXPORT mgl_data_fill_eq_(uintptr_t *gr, uintptr_t *d, const char *eq, uintptr_t *v, uintptr_t *w, const char *opt,int l,int lo)
 {      char *s=new char[l+1];  memcpy(s,eq,l); s[l]=0;
@@ -109,20 +109,20 @@ void MGL_EXPORT mgl_datac_fill_eq(HMGL gr, HADT d, const char *eq, HCDT vdat, HC
        if(vdat && vdat->GetNN()!=d->GetNN())   return; // incompatible dimensions
        if(wdat && wdat->GetNN()!=d->GetNN())   return;
        gr->SaveState(opt);
-       std::wstring s = d->s;  d->s = L"u";
-       mglDataV x(d->nx,d->ny,d->nz, gr->Min.x,gr->Max.x,'x'); x.s=L"x";
-       mglDataV y(d->nx,d->ny,d->nz, gr->Min.y,gr->Max.y,'y'); y.s=L"y";
-       mglDataV z(d->nx,d->ny,d->nz, gr->Min.z,gr->Max.z,'z'); z.s=L"z";
-       mglDataV i(d->nx,d->ny,d->nz, 0,d->nx-1,'x');   i.s=L"i";
-       mglDataV j(d->nx,d->ny,d->nz, 0,d->ny-1,'y');   j.s=L"j";
-       mglDataV k(d->nx,d->ny,d->nz, 0,d->nz-1,'z');   k.s=L"k";
-       mglDataV r(d->nx,d->ny,d->nz);  r.s=L"#$mgl";
-       mglData v(vdat), w(wdat);       v.s = L"v";     w.s = L"w";
+       std::wstring s = d->Name();     d->Name(L"u");
+       mglDataV x(d->nx,d->ny,d->nz, gr->Min.x,gr->Max.x,'x'); x.Name(L"x");
+       mglDataV y(d->nx,d->ny,d->nz, gr->Min.y,gr->Max.y,'y'); y.Name(L"y");
+       mglDataV z(d->nx,d->ny,d->nz, gr->Min.z,gr->Max.z,'z'); z.Name(L"z");
+       mglDataV i(d->nx,d->ny,d->nz, 0,d->nx-1,'x');   i.Name(L"i");
+       mglDataV j(d->nx,d->ny,d->nz, 0,d->ny-1,'y');   j.Name(L"j");
+       mglDataV k(d->nx,d->ny,d->nz, 0,d->nz-1,'z');   k.Name(L"k");
+       mglDataV r(d->nx,d->ny,d->nz);  r.Name(L"#$mgl");
+       mglData v(vdat), w(wdat);       v.Name(L"v");   w.Name(L"w");
        std::vector<mglDataA*> list;
        list.push_back(&x);     list.push_back(&y);     list.push_back(&z);     list.push_back(&r);
        list.push_back(d);      list.push_back(&v);     list.push_back(&w);
        list.push_back(&i);     list.push_back(&j);     list.push_back(&k);
-       d->Move(mglFormulaCalcC(eq,list));      d->s = s;       gr->LoadState();
+       d->Move(mglFormulaCalcC(eq,list));      d->Name(s.c_str());     gr->LoadState();
 }
 void MGL_EXPORT mgl_datac_fill_eq_(uintptr_t *gr, uintptr_t *d, const char *eq, uintptr_t *v, uintptr_t *w, const char *opt,int l,int lo)
 {      char *s=new char[l+1];  memcpy(s,eq,l); s[l]=0;
index b109d300b19c7554a8e7e13ab39d801f1ec98ae8..c60b7261aa0ff89230f517ef5717515988a9afb1 100644 (file)
@@ -35,7 +35,7 @@
 #endif\r
 #if MGL_HAVE_HDF4\r
 #define intf hdf4_intf\r
-#include <hdf/mfhdf.h>\r
+#include <mfhdf.h>\r
 #undef intf\r
 #endif\r
 \r
@@ -61,9 +61,10 @@ 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
+       while(*buf && *buf<=' ')        buf++;\r
        lines.push_back(buf);\r
        for(char *s=buf; *s; s++)       if(isn(*s))\r
        {       lines.push_back(s+1);   *s = 0; s++;    }\r
@@ -74,36 +75,28 @@ 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
+                               std::string id;\r
+                               if(j<nb-1 && b[j+1]=='#')       for(long i=j+2;i<nb;i++)\r
+                                       if(b[i]>='a' && b[i]<='z')      id.push_back(b[i]);\r
+                               d->SetColumnId(id.c_str());\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 +124,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
@@ -271,39 +264,79 @@ void MGL_EXPORT mgl_data_rearrange(HMDT d, long mx,long my,long mz)
 void MGL_EXPORT mgl_data_rearrange_(uintptr_t *d, int *mx, int *my, int *mz)\r
 {      mgl_data_rearrange(_DT_,*mx,*my,*mz);   }\r
 //-----------------------------------------------------------------------------\r
-void MGL_EXPORT mgl_data_set_id(HMDT d, const char *ids)       {       d->id = ids;    }\r
+MGL_EXPORT const char *mgl_data_get_id(HCDT d) {       return d->id.s; }\r
+void MGL_EXPORT mgl_data_set_id(mglDataA *d, const char *ids)  {       d->id = ids;    }\r
 void MGL_EXPORT mgl_data_set_id_(uintptr_t *d, const char *eq,int l)\r
 {      char *s=new char[l+1];  memcpy(s,eq,l); s[l]=0;\r
        mgl_data_set_id(_DT_, s);       delete []s;     }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_data_set_name_w(mglDataA *dat, const wchar_t *name)\r
 {      dat->s = name;  }\r
+MGL_EXPORT const wchar_t *mgl_data_get_name_w(HCDT dat)\r
+{      return dat->s.w;        }\r
 void MGL_EXPORT mgl_data_set_name(mglDataA *dat, const char *name)\r
-{      MGL_TO_WCS(name,dat->s = wcs);  }\r
+{      MGL_TO_WCS(name,dat->Name(wcs));        }\r
 void MGL_EXPORT mgl_data_set_name_(uintptr_t *d, const char *name,int l)\r
 {      char *s=new char[l+1];  memcpy(s,name,l);       s[l]=0;\r
        mgl_data_set_name(_DT_,s);              delete []s;     }\r
 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
+               std::string id = d->GetColumnId();\r
+               if(!id.empty()) out += "## "+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 +344,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 +369,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 +381,26 @@ 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
+       char *buf = mgl_read_gz(fp), *tbuf=buf;\r
+       while(*buf && *buf<=' ')        buf++;  // remove leading spaces\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 +412,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(tbuf);     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,7 +448,7 @@ 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
        size_t len = strs[0].length();\r
@@ -436,7 +466,7 @@ int MGL_EXPORT mgl_data_scan_file(HMDT d,const char *fname, const char *templ)
        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
@@ -450,7 +480,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
@@ -462,7 +492,7 @@ void MGL_EXPORT mgl_data_create(HMDT d,long mx,long my,long mz)
        d->nx = mx>0 ? mx:1;    d->ny = my>0 ? my:1;    d->nz = mz>0 ? mz:1;\r
        if(d->a && !d->link)    delete [](d->a);\r
        d->a = new mreal[d->nx*d->ny*d->nz];\r
-       d->id.clear();  d->link=false;\r
+       d->NewId();     d->link=false;\r
        memset(d->a,0,d->nx*d->ny*d->nz*sizeof(mreal));\r
 }\r
 void MGL_EXPORT mgl_data_create_(uintptr_t *d, int *nx,int *ny,int *nz)\r
@@ -480,13 +510,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
@@ -494,9 +524,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
@@ -507,25 +537,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
@@ -537,7 +569,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
@@ -545,7 +578,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
@@ -557,10 +590,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
@@ -574,10 +607,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
@@ -591,10 +624,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
@@ -608,10 +641,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
@@ -625,12 +658,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
@@ -649,12 +682,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
@@ -667,6 +700,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
@@ -795,9 +866,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
@@ -871,8 +945,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
@@ -907,6 +980,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
@@ -915,7 +989,7 @@ void MGL_EXPORT mgl_data_transpose_(uintptr_t *d, const char *dim,int l)
 {      char *s=new char[l+1];  memcpy(s,dim,l);        s[l]=0;\r
        mgl_data_transpose(_DT_,s);     delete []s;     }\r
 //-----------------------------------------------------------------------------\r
-MGL_NO_EXPORT void *mgl_modify(void *par)\r
+static void *mgl_modify(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        const mglFormula *f = (const mglFormula *)(t->v);\r
@@ -928,7 +1002,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
@@ -956,20 +1030,20 @@ void MGL_EXPORT mgl_data_modify_(uintptr_t *d, const char *eq,int *dim,int l)
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_data_modify_vw(HMDT d, const char *eq,HCDT vdat,HCDT wdat)\r
 {\r
-       std::wstring s = d->s;  d->s = L"u";\r
-       mglDataV x(d->nx,d->ny,d->nz, 0,1,'x'); x.s=L"x";\r
-       mglDataV y(d->nx,d->ny,d->nz, 0,1,'y'); y.s=L"y";\r
-       mglDataV z(d->nx,d->ny,d->nz, 0,1,'z'); z.s=L"z";\r
-       mglDataV i(d->nx,d->ny,d->nz, 0,d->nx-1,'x');   i.s=L"i";\r
-       mglDataV j(d->nx,d->ny,d->nz, 0,d->ny-1,'y');   j.s=L"j";\r
-       mglDataV k(d->nx,d->ny,d->nz, 0,d->nz-1,'z');   k.s=L"k";\r
-       mglDataV r(d->nx,d->ny,d->nz);  r.s=L"#$mgl";\r
-       mglData v(vdat), w(wdat);       v.s = L"v";     w.s = L"w";\r
+       std::wstring s=d->Name();       d->Name(L"u");\r
+       mglDataV x(d->nx,d->ny,d->nz, 0,1,'x'); x.Name(L"x");\r
+       mglDataV y(d->nx,d->ny,d->nz, 0,1,'y'); y.Name(L"y");\r
+       mglDataV z(d->nx,d->ny,d->nz, 0,1,'z'); z.Name(L"z");\r
+       mglDataV i(d->nx,d->ny,d->nz, 0,d->nx-1,'x');   i.Name(L"i");\r
+       mglDataV j(d->nx,d->ny,d->nz, 0,d->ny-1,'y');   j.Name(L"j");\r
+       mglDataV k(d->nx,d->ny,d->nz, 0,d->nz-1,'z');   k.Name(L"k");\r
+       mglDataV r(d->nx,d->ny,d->nz);  r.Name(L"#$mgl");\r
+       mglData v(vdat), w(wdat);       v.Name(L"v");   w.Name(L"w");\r
        std::vector<mglDataA*> list;\r
        list.push_back(&x);     list.push_back(&y);     list.push_back(&z);     list.push_back(d);\r
        list.push_back(&v);     list.push_back(&w);     list.push_back(&r);\r
        list.push_back(&i);     list.push_back(&j);     list.push_back(&k);\r
-       d->Move(mglFormulaCalc(eq,list));       d->s = s;\r
+       d->Move(mglFormulaCalc(eq,list));       d->Name(s.c_str());\r
 }\r
 void MGL_EXPORT mgl_data_modify_vw_(uintptr_t *d, const char *eq, uintptr_t *v, uintptr_t *w,int l)\r
 {      char *s=new char[l+1];  memcpy(s,eq,l); s[l]=0;\r
@@ -979,7 +1053,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
@@ -1011,11 +1085,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
@@ -1048,17 +1122,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
@@ -1070,42 +1144,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
@@ -1116,7 +1205,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
@@ -1168,7 +1257,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
@@ -1179,11 +1268,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
@@ -1204,7 +1293,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
@@ -1213,14 +1302,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
@@ -1229,24 +1318,18 @@ int MGL_EXPORT mgl_data_read_all_(uintptr_t *d, const char *fname, int *as_slice
 //-----------------------------------------------------------------------------\r
 HMDT MGL_EXPORT mgl_data_column(HCDT dat, const char *eq)\r
 {\r
-       const mglData *dd=dynamic_cast<const mglData *>(dat);\r
        std::vector<mglDataA*> list;\r
-       if(dd && dd->id.length()>0)     for(size_t i=0;i<dd->id.length();i++)\r
+       const char *id = dat->GetColumnId();\r
+       size_t len = strlen(id);\r
+       for(size_t i=0;i<len;i++)\r
        {\r
                mglDataT *col = new mglDataT(*dat);\r
-               col->SetInd(i,dd->id[i]);\r
-               list.push_back(col);\r
-       }\r
-       const mglDataC *dc=dynamic_cast<const mglDataC *>(dat);\r
-       if(dc && dc->id.length()>0)     for(size_t i=0;i<dc->id.length();i++)\r
-       {\r
-               mglDataT *col = new mglDataT(*dat);\r
-               col->SetInd(i,dc->id[i]);\r
+               col->SetInd(i,id[i]);\r
                list.push_back(col);\r
        }\r
        if(list.size()==0)      return 0;       // no named columns\r
        mglDataV *t = new mglDataV(dat->GetNy(),dat->GetNz());\r
-       t->s=L"#$mgl";  list.push_back(t);\r
+       t->Name(L"#$mgl");      list.push_back(t);\r
        HMDT r = mglFormulaCalc(eq,list);\r
        for(size_t i=0;i<list.size();i++)       delete list[i];\r
        return r;\r
@@ -1260,10 +1343,93 @@ void MGL_EXPORT mgl_data_limit(HMDT d, mreal v)
 {\r
        long n = d->GetNN();\r
        mreal *a = d->a;\r
-       #pragma omp parallel for\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
+void MGL_EXPORT mgl_data_coil(HMDT d, mreal v1, mreal v2, int sep)\r
+{\r
+       long n = d->GetNN();\r
+       if(mgl_isnan(v2))       v2=-v1;\r
+       if(v2<v1)       {       mreal tmp=v1;   v1=v2;  v2=tmp; }\r
+       mreal *a = d->a, dv = v2-v1;\r
+       if(dv==0)       return;\r
+       long *kk=new long[n];\r
+#pragma omp parallel for\r
+       for(long i=0;i<n;i++)\r
+       {\r
+               kk[i] = mgl_int((a[i]-v1)/dv-0.5);\r
+               a[i] -= kk[i]*dv;\r
+       }\r
+       if(sep)\r
+       {\r
+#pragma omp parallel for\r
+               for(long i=1;i<n;i++)   if(kk[i]!=kk[i-1])      a[i] = NAN;\r
+       }\r
+       delete []kk;\r
+}\r
+void MGL_EXPORT mgl_data_coil_(uintptr_t *d, mreal *v1, mreal *v2, int *sep)\r
+{      mgl_data_coil(_DT_, *v1, *v2, *sep);    }\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 b4a8bb39f4f51c3ccdc8daa2f4550dd637de43dd..7457d432a45e201b76d122de683aab8f68b5a340 100644 (file)
 #include <jpeglib.h>\r
 #endif\r
 //-----------------------------------------------------------------------------\r
-size_t MGL_LOCAL_PURE mgl_col_dif(unsigned char *c1,unsigned char *c2,bool sum)\r
+unsigned MGL_LOCAL_PURE mgl_col_dif(unsigned char *c1,unsigned char *c2)\r
 {\r
-       size_t res,d1=labs(long(c1[0])-long(c2[0])),\r
-               d2=labs(long(c1[1])-long(c2[1])),d3=labs(long(c1[2])-long(c2[2]));\r
-       if(sum) res = d1+d2+d3;\r
-       else    res = mgl_max(d1,mgl_max(d2,d3));\r
-       return res;\r
+       unsigned d1=abs(int(c1[0])-c2[0]), d2=abs(int(c1[1])-c2[1]), d3=abs(int(c1[2])-c2[2]);\r
+       d2 = d2>d3?d2:d3;       d2 = d2>d1?d2:d1;       return d2;\r
 }\r
 //-----------------------------------------------------------------------------\r
 MGL_NO_EXPORT unsigned char *mgl_create_scheme(const char *scheme,long &num)\r
@@ -45,13 +42,13 @@ 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
-       for(size_t i=0;i<np-1;i++)      nc+=mgl_col_dif(cc+3*i,cc+3*i+3,false);\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);\r
        c = new unsigned char[3*nc+3];\r
        size_t pos=0;\r
        for(size_t i=0;i<np-1;i++)\r
        {\r
-               size_t dd=mgl_col_dif(cc+3*i,cc+3*i+3,false);\r
+               size_t dd=mgl_col_dif(cc+3*i,cc+3*i+3);\r
                for(size_t j=0;j<dd;j++)\r
                {\r
                        c1 = c+3*(pos+j);       c2 = cc+3*i;\r
@@ -61,10 +58,8 @@ MGL_NO_EXPORT unsigned char *mgl_create_scheme(const char *scheme,long &num)
                }\r
                pos += dd;\r
        }\r
-       memcpy(c+3*nc-3,cc+3*np-3,3);\r
-       delete []cc;\r
-       num=nc;\r
-       return c;\r
+       memcpy(c+3*nc-3,cc+3*np-3,3);   delete []cc;\r
+       num=nc; return c;\r
 }\r
 //-----------------------------------------------------------------------------\r
 bool MGL_NO_EXPORT mgl_read_image(unsigned char **g, int &w, int &h, const char *fname)\r
@@ -119,7 +114,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 +154,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
@@ -179,11 +174,16 @@ void MGL_EXPORT mgl_data_import(HMDT d, const char *fname, const char *scheme,mr
 #pragma omp parallel for collapse(2)\r
                for(long i=0;i<h;i++)   for(long j=0;j<w;j++)\r
                {\r
-                       size_t pos=0,mval=256;\r
+                       unsigned pos=0,mval=256*256;\r
+                       const unsigned char *c2=g+4*w*(d->ny-i-1)+4*j;\r
                        for(long k=0;k<num;k++)\r
                        {\r
-                               size_t val = mgl_col_dif(c+3*k,g+4*w*(d->ny-i-1)+4*j,true);\r
-                               if(val==0)      {       pos=k;  break;  }\r
+                               const unsigned char *c1=c+3*k;\r
+//                             unsigned val=abs(int(c1[0])-c2[0])+abs(int(c1[1])-c2[1])+abs(int(c1[2])-c2[2]);\r
+                               unsigned val=(int(c1[0])-c2[0])*(int(c1[0])-c2[0]) + \r
+                                       (int(c1[1])-c2[1])*(int(c1[1])-c2[1]) + \r
+                                       (int(c1[2])-c2[2])*(int(c1[2])-c2[2]);\r
+                               if(val==0)              {       pos=k;  break;  }\r
                                if(val<mval)    {       pos=k;  mval=val;       }\r
                        }\r
                        d->a[j+d->nx*i] = v1 + pos*(v2-v1)/num;\r
@@ -198,7 +198,7 @@ int MGL_NO_EXPORT mgl_bmp_save(const char *fname, int w, int h, unsigned char **
 int MGL_NO_EXPORT mgl_tga_save(const char *fname, int w, int h, unsigned char **p);\r
 int MGL_NO_EXPORT mgl_jpeg_save(const char *fname, int w, int h, unsigned char **p);\r
 int MGL_NO_EXPORT mgl_bps_save(const char *fname, int w, int h, unsigned char **p);\r
-void MGL_EXPORT mgl_data_export(HCDT dd, const char *fname, const char *scheme,mreal v1,mreal v2,long ns)\r
+void MGL_EXPORT mgl_data_export(HCDT dd, const char *fname, const char *scheme, double v1, double v2, long ns)\r
 {\r
        long nx=dd->GetNx(), ny=dd->GetNy(), nz=dd->GetNz();\r
        if(v1>v2)       return;\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 a4cb5430323cbe63bc0a50950e9a0fa192bf2b6c..149b3c86107ad2d37f74f14cab2b6408d7f11624 100644 (file)
@@ -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
@@ -243,10 +243,12 @@ mglFormula::mglFormula(const char *string)
                Right=new mglFormula(str+n+1);\r
                delete []str;   return;\r
        }\r
-       n=mglFindInText(str,"*/");                              // high priority -- multiplications\r
+       n=mglFindInText(str,"*/%");                             // high priority -- multiplications\r
        if(n>=0)\r
        {\r
-               if(str[n]=='*') Kod=EQ_MUL; else Kod=EQ_DIV;\r
+               if(str[n]=='*') Kod=EQ_MUL;\r
+               else if(str[n]=='/') Kod=EQ_DIV;\r
+               else    Kod=EQ_MOD;\r
                str[n]=0;\r
                Left=new mglFormula(str);\r
                Right=new mglFormula(str+n+1);\r
@@ -276,7 +278,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
@@ -417,7 +419,8 @@ mreal mglFormula::Calc(mreal x,mreal y,mreal t,mreal u) const
        a1['x'-'a'] = a1['r'-'a'] = x;\r
        a1['y'-'a'] = a1['n'-'a'] = a1['v'-'a'] = y;\r
        a1['z'-'a'] = a1['t'-'a'] = t;\r
-       return CalcIn(a1);\r
+       mreal b = CalcIn(a1);\r
+       return mgl_isfin(b) ? b : NAN;\r
 }\r
 //-----------------------------------------------------------------------------\r
 // evaluate formula for 'x'='r', 'y'='n', 't'='z', 'u'='a', 'v'='b', 'w'='c' variables\r
@@ -431,14 +434,16 @@ mreal mglFormula::Calc(mreal x,mreal y,mreal t,mreal u,mreal v,mreal w) const
        a1['x'-'a'] = a1['r'-'a'] = x;\r
        a1['y'-'a'] = a1['n'-'a'] = y;\r
        a1['z'-'a'] = a1['t'-'a'] = t;\r
-       return CalcIn(a1);\r
+       mreal b = CalcIn(a1);\r
+       return mgl_isfin(b) ? b : NAN;\r
 }\r
 //-----------------------------------------------------------------------------\r
 // evaluate formula for arbitrary set of variables\r
 mreal mglFormula::Calc(const mreal var[MGL_VS]) const\r
 {\r
        Error=0;\r
-       return CalcIn(var);\r
+       mreal b = CalcIn(var);\r
+       return mgl_isfin(b) ? b : NAN;\r
 }\r
 //-----------------------------------------------------------------------------\r
 // evaluate formula for 'x'='r', 'y'='n'='v', 't'='z', 'u'='a' variables\r
@@ -450,7 +455,8 @@ mreal mglFormula::CalcD(char diff,mreal x,mreal y,mreal t,mreal u) const
        a1['x'-'a'] = a1['r'-'a'] = x;\r
        a1['y'-'a'] = a1['n'-'a'] = a1['v'-'a'] = y;\r
        a1['z'-'a'] = a1['t'-'a'] = t;\r
-       return CalcDIn(diff-'a', a1);\r
+       mreal b = CalcDIn(diff-'a', a1);\r
+       return mgl_isfin(b) ? b : NAN;\r
 }\r
 //-----------------------------------------------------------------------------\r
 // evaluate formula for 'x'='r', 'y'='n', 't'='z', 'u'='a', 'v'='b', 'w'='c' variables\r
@@ -464,14 +470,16 @@ mreal mglFormula::CalcD(char diff,mreal x,mreal y,mreal t,mreal u,mreal v,mreal
        a1['x'-'a'] = a1['r'-'a'] = x;\r
        a1['y'-'a'] = a1['n'-'a'] = y;\r
        a1['z'-'a'] = a1['t'-'a'] = t;\r
-       return CalcDIn(diff-'a', a1);\r
+       mreal b = CalcDIn(diff-'a', a1);\r
+       return mgl_isfin(b) ? b : NAN;\r
 }\r
 //-----------------------------------------------------------------------------\r
 // evaluate derivate of formula respect to 'diff' variable for arbitrary set of other variables\r
 mreal mglFormula::CalcD(const mreal var[MGL_VS], char diff) const\r
 {\r
        Error=0;\r
-       return CalcDIn(diff-'a', var);\r
+       mreal b = CalcDIn(diff-'a', var);\r
+       return mgl_isfin(b) ? b : NAN;\r
 }\r
 //-----------------------------------------------------------------------------\r
 double MGL_LOCAL_CONST cand(double a,double b) {return a&&b?1:0;}\r
@@ -555,18 +563,14 @@ mreal mglFormula::CalcIn(const mreal *a1) const
                {\r
                        // try to bypass calc b if a==0\r
                        if(a==0 && z2[Kod-EQ_LT]!=3)    return z2[Kod-EQ_LT];\r
-                       double b = Right->CalcIn(a1);\r
-                       b = mgl_isfin(b) ? f2[Kod-EQ_LT](a,b):NAN;\r
-                       return mgl_isfin(b) ? b : NAN;\r
+                       return Right?f2[Kod-EQ_LT](a, Right->CalcIn(a1)):NAN;\r
                }\r
-               else if(Kod<EQ_SN)\r
-               {       a = f1[Kod-EQ_SIN](a);  return mgl_isfin(a)?a:NAN;      }\r
+               else if(Kod<EQ_SN)      return f1[Kod-EQ_SIN](a);\r
 #if MGL_HAVE_GSL\r
                else if(Kod<=EQ_DC)\r
                {\r
-                       double sn=0,cn=0,dn=0,b = Right->CalcIn(a1);\r
-                       if(mgl_isbad(b))        return NAN;\r
-                       gsl_sf_elljac_e(a,b, &sn, &cn, &dn);\r
+                       double sn=0, cn=0, dn=0;\r
+                       gsl_sf_elljac_e(a,Right->CalcIn(a1), &sn, &cn, &dn);\r
                        switch(Kod)\r
                        {\r
                        case EQ_SN:             return sn;\r
@@ -664,23 +668,24 @@ static const func_1 f11[EQ_SN-EQ_SIN] = {cos,cos_d,tan_d,asin_d,acos_d,atan_d,co
 // evaluation of derivative of embedded (included) expressions\r
 mreal mglFormula::CalcDIn(int id, const mreal *a1) const\r
 {\r
-       if(Kod<EQ_LT)   return (Kod==EQ_A && id==(int)Res)?1:0;\r
-\r
+       if(Kod==EQ_A && id==(int)Res)   return 1;\r
+       else if(Kod<EQ_LT)      return 0;\r
        double a = Left->CalcIn(a1), d = Left->CalcDIn(id,a1);\r
        if(mgl_isfin(a) && mgl_isfin(d))\r
        {\r
                if(Kod<EQ_SIN)\r
                {\r
-                       double b = Right->CalcIn(a1), c = Right->CalcDIn(id,a1);\r
-                       b = mgl_isfin(b) ? (d?f21[Kod-EQ_LT](a,b)*d:0) + (c?f22[Kod-EQ_LT](a,b)*c:0) : NAN;\r
-                       return mgl_isfin(b) ? b : NAN;\r
+                       double b = Right?Right->CalcIn(a1):NAN;\r
+                       double c = Right?Right->CalcDIn(id,a1):NAN;\r
+//                     return mgl_isfin(b) ? (f21[Kod-EQ_LT](a,b)*d + f22[Kod-EQ_LT](a,b)*c) : NAN;\r
+                       return mgl_isfin(b) ? (d?f21[Kod-EQ_LT](a,b)*d:0) + (c?f22[Kod-EQ_LT](a,b)*c:0) : NAN;\r
                }\r
-               else if(Kod<EQ_SN)\r
-               {       a = (d?f11[Kod-EQ_SIN](a)*d:0); return mgl_isfin(a)?a:NAN;      }\r
+//             else if(Kod<EQ_SN)      return f11[Kod-EQ_SIN](a)*d;\r
+               else if(Kod<EQ_SN)      return d?f11[Kod-EQ_SIN](a)*d:0;\r
 #if MGL_HAVE_GSL\r
                else if(Kod<=EQ_DC)\r
                {\r
-                       double sn=0,cn=0,dn=0,b = Right->CalcIn(a1);\r
+                       double sn=0, cn=0, dn=0, b = Right->CalcIn(a1);\r
                        if(mgl_isbad(b))        return NAN;\r
                        gsl_sf_elljac_e(a,b, &sn, &cn, &dn);\r
                        switch(Kod)     // At this moment parse only differentiation or argument NOT mu !!!\r
@@ -707,8 +712,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 +723,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 e703e06057fd943338c07281b7268d5dd9368c06..9534178aaf4202dc8db77b98aa3288bb8739e853 100644 (file)
@@ -18,6 +18,7 @@
  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *\r
  ***************************************************************************/\r
 #include <time.h>\r
+#include "mgl2/data_cf.h"\r
 #include "mgl2/datac_cf.h"\r
 #include "mgl2/evalc.h"\r
 #if MGL_HAVE_GSL\r
@@ -37,25 +38,27 @@ 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
@@ -69,7 +72,7 @@ EQ_LAST               // id of last entry
 //-----------------------------------------------------------------------------\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
@@ -142,16 +145,16 @@ mglFormulaC::mglFormulaC(const char *string)
 //             Left = Right = 0;\r
                if(str[1]==0 && str[0]>='a' && str[0]<='z')     // available variables\r
                {       Kod=EQ_A;       Res = str[0]-'a';       }\r
-               else if(!strcmp(str,"rnd")) Kod=EQ_RND;\r
-               else if(!strcmp(str,"pi")) Res=M_PI;\r
-               else if(!strcmp(str,"inf")) Res=INFINITY;\r
-               else if(str[0]=='i')    Res = dual(0,str[1]>' '?atof(str+1):1);\r
-               else Res=atof(str);                                     // this is number\r
+               else if(!strcmp(str,"rnd"))     Kod=EQ_RND;\r
+               else if(!strcmp(str,"pi"))      Res=M_PI;\r
+               else if(!strcmp(str,"inf"))     Res=INFINITY;\r
+               else if(str[0]=='i')    Res = dual(0,atof(str+1));\r
+               else    Res = (str[len-1]=='i') ? dual(0,atof(str)) : atof(str);\r
        }\r
        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
@@ -179,6 +182,8 @@ mglFormulaC::mglFormulaC(const char *string)
                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
@@ -203,7 +208,8 @@ dual mglFormulaC::Calc(dual x,dual y,dual t,dual u) const
        a1['y'-'a'] = a1['n'-'a'] = a1['v'-'a'] = y;\r
        a1['z'-'a'] = a1['t'-'a'] = t;\r
        a1['i'-'a'] = dual(0,1);\r
-       return CalcIn(a1);\r
+       dual b = CalcIn(a1);\r
+       return mgl_isfin(b) ? b : NAN;\r
 }\r
 //-----------------------------------------------------------------------------\r
 // evaluate formula for 'x'='r', 'y'='n', 't'='z', 'u'='a', 'v'='b', 'w'='c' variables\r
@@ -218,14 +224,16 @@ dual mglFormulaC::Calc(dual x,dual y,dual t,dual u,dual v,dual w) const
        a1['y'-'a'] = a1['n'-'a'] = y;\r
        a1['z'-'a'] = a1['t'-'a'] = t;\r
        a1['i'-'a'] = dual(0,1);\r
-       return CalcIn(a1);\r
+       dual b = CalcIn(a1);\r
+       return mgl_isfin(b) ? b : NAN;\r
 }\r
 //-----------------------------------------------------------------------------\r
 // evaluate formula for arbitrary set of variables\r
 dual mglFormulaC::Calc(const dual var[MGL_VS]) const\r
 {\r
        Error=0;\r
-       return CalcIn(var);\r
+       dual b = CalcIn(var);\r
+       return mgl_isfin(b) ? b : NAN;\r
 }\r
 //-----------------------------------------------------------------------------\r
 dual MGL_LOCAL_CONST ceqc(dual a,dual b)       {return a==b?1:0;}\r
@@ -238,10 +246,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
@@ -267,28 +277,25 @@ dual MGL_LOCAL_CONST normc(dual x)        {       return norm(x); }
 //-----------------------------------------------------------------------------\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,realc,imagc,normc};\r
 // evaluation of embedded (included) expressions\r
 dual mglFormulaC::CalcIn(const dual *a1) const\r
 {\r
-//     if(Error)       return 0;\r
-       if(Kod==EQ_A)   return a1[(int)Res.real()];\r
-       if(Kod==EQ_RND) return mgl_rnd();\r
-       if(Kod==EQ_NUM) return Res;\r
+       if(Kod<EQ_LT)\r
+       {\r
+               if(Kod==EQ_RND) return mgl_rnd();\r
+               else    return (Kod==EQ_A) ? a1[int(Res.real())] : Res;\r
+       }\r
 \r
        dual a = Left->CalcIn(a1);\r
        if(mgl_isfin(a))\r
        {\r
                if(Kod<EQ_SIN)\r
-               {\r
-                       dual b = Right->CalcIn(a1);\r
-                       b = mgl_isfin(b)?f2[Kod-EQ_LT](a,b):NAN;\r
-                       return mgl_isfin(b)?b:NAN;\r
-               }\r
+                       return Right?f2[Kod-EQ_LT](a,Right->CalcIn(a1)):NAN;\r
                else\r
-               {       a = f1[Kod-EQ_SIN](a);  return mgl_isfin(a)?a:NAN;      }\r
+                       return f1[Kod-EQ_SIN](a);\r
        }\r
        return NAN;\r
 }\r
index df9fb00342c3996536f70ddd952ce9cc5e7f3712..99ae92343b5a1e061431be11311b3d5b8c95e7ae 100644 (file)
@@ -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
@@ -259,7 +260,7 @@ HADT mglApplyOperDivC(std::wstring a1, std::wstring a2, mglParser *arg, const st
 //-----------------------------------------------------------------------------
 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++;
@@ -269,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++;
@@ -305,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,17 +315,39 @@ void MGL_EXPORT mgl_wcstombs(char *dst, const wchar_t *src, int size)
 MGL_LOCAL_PURE const mglDataA *FindVar(const std::vector<mglDataA*> &head, const std::wstring &name)
 {
        for(size_t i=0;i<head.size();i++)
-               if(head[i] && head[i]->s==name) return head[i];
+               if(head[i] && head[i]->Name()==name)    return head[i];
        return 0;
 }
 //-----------------------------------------------------------------------------
 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.
@@ -336,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; }
@@ -391,9 +418,11 @@ HMDT MGL_NO_EXPORT mglFormulaCalc(std::wstring str, mglParser *arg, const std::v
        n=mglFindInText(str,"+-");      // normal priority -- additions
        if(n>=0 && (n<2 || str[n-1]!='e' || (str[n-2]!='.' && !isdigit(str[n-2])) ))
                return str[n]=='+'? mglApplyOperAdd(str.substr(0,n),str.substr(n+1),arg, head) : mglApplyOperSub(str.substr(0,n),str.substr(n+1),arg, head);
-       n=mglFindInText(str,"*/");      // high priority -- multiplications
+       n=mglFindInText(str,"*/%");     // high priority -- multiplications
        if(n>=0)
-               return str[n]=='*'? mglApplyOperMul(str.substr(0,n),str.substr(n+1),arg, head) : mglApplyOperDiv(str.substr(0,n),str.substr(n+1),arg, head);
+               return str[n]=='*'? mglApplyOperMul(str.substr(0,n),str.substr(n+1),arg, head) : 
+                       (str[n]=='/'? mglApplyOperDiv(str.substr(0,n),str.substr(n+1),arg, head) :
+                               mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, fmod));
        n=mglFindInText(str,"@");       // high priority -- combine
        if(n>=0)
        {
@@ -401,7 +430,7 @@ HMDT MGL_NO_EXPORT mglFormulaCalc(std::wstring str, mglParser *arg, const std::v
                HMDT a2 = mglFormulaCalc(str.substr(n+1),arg, head);
                HMDT res = mgl_data_combine(a1,a2);
                mgl_delete_data(a1);    mgl_delete_data(a2);
-               return res;
+               return res?res:new mglData;
        }
        n=mglFindInText(str,"^");       // highest priority -- power
        if(n>=0)        return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, ipw);
@@ -456,9 +485,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')
                {
@@ -477,6 +512,11 @@ HMDT MGL_NO_EXPORT mglFormulaCalc(std::wstring str, mglParser *arg, const std::v
                if(mgl_isfin(v))
                {       HMDT res = new mglData; res->a[0]=v;    return res;     }
        }
+       if(str[0]=='`')
+       {
+               HMDT res = mglFormulaCalc(str.substr(1), arg, head);
+               res->Transpose();       return res;
+       }
        for(n=0;n<len;n++)      if(str[n]=='(') break;
        if(n>=len)              // this is number or variable
        {
@@ -508,8 +548,16 @@ HMDT MGL_NO_EXPORT mglFormulaCalc(std::wstring str, mglParser *arg, const std::v
                std::wstring nm = str.substr(0,n);
                str = str.substr(n+1,len-n-2);  len -= n+2;
                HCDT v = FindVar(head, nm);
+               HMDT tmp = 0;
 //             mglVar *v = arg->FindVar(nm.c_str());
                if(!v && !nm.compare(0,7,L"jacobi_"))   nm = nm.substr(7);
+               if(!v && nm.empty())    
+               {
+                       long m=mglFindInText(str,")");
+                       if(m>1)
+                       {       nm = str.substr(0,m);   str = str.substr(m+2);
+                               tmp = mglFormulaCalc(nm,arg,head);      v = tmp;        }
+               }
                n = mglFindInText(str,",");
                if(v)   // subdata
                {
@@ -518,7 +566,8 @@ HMDT MGL_NO_EXPORT mglFormulaCalc(std::wstring str, mglParser *arg, const std::v
                                char *buf = new char[len];
                                mgl_wcstombs(buf, str.substr(1).c_str(), len-1);        buf[len-1]=0;
                                HMDT res = mgl_data_column(v,buf);
-                               delete []buf;   return res;
+                               if(tmp) mgl_delete_data(tmp);
+                               delete []buf;   return res?res:new mglData;
                        }
                        else
                        {
@@ -541,9 +590,11 @@ HMDT MGL_NO_EXPORT mglFormulaCalc(std::wstring str, mglParser *arg, const std::v
                                }
                                else    a1 = mglFormulaCalc(str, arg, head);
                                HMDT res = mgl_data_subdata_ext(v,a1,a2,a3);
+                               if(tmp) mgl_delete_data(tmp);
                                mgl_delete_data(a1);    mgl_delete_data(a2);
-                               mgl_delete_data(a3);    return res;
+                               mgl_delete_data(a3);    return res?res:new mglData;
                        }
+                       if(tmp) mgl_delete_data(tmp);
                }
                else if(nm[0]=='a')     // function
                {
@@ -679,7 +730,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);
@@ -730,9 +782,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); }
@@ -767,6 +821,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; }
@@ -792,8 +850,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);
@@ -807,8 +866,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
@@ -827,7 +887,7 @@ HADT MGL_NO_EXPORT mglFormulaCalcC(std::wstring str, mglParser *arg, const std::
                HADT a2 = mglFormulaCalcC(str.substr(n+1),arg, head);
                HADT res = mgl_datac_combine(a1,a2);
                mgl_delete_datac(a1);   mgl_delete_datac(a2);
-               return res;
+               return res?res:new mglDataC;
        }
        n=mglFindInText(str,"^");                               // highest priority -- power
        if(n>=0)
@@ -882,9 +942,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')
                {
@@ -902,6 +962,11 @@ HADT MGL_NO_EXPORT mglFormulaCalcC(std::wstring str, mglParser *arg, const std::
                if(mgl_isfin(v))
                {       HADT res = new mglDataC;        res->a[0]=v;    return res;     }
        }
+       if(str[0]=='`')
+       {
+               HADT res = mglFormulaCalcC(str.substr(1), arg, head);
+               res->Transpose();       return res;
+       }
        for(n=0;n<len;n++)      if(str[n]=='(') break;
        if(n>=len)              // this is number or variable
        {
@@ -924,7 +989,7 @@ HADT MGL_NO_EXPORT mglFormulaCalcC(std::wstring str, mglParser *arg, const std::
                        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
-                               res->a[0] = dual(0,str[1]>' '?wcstod(str.c_str()+1,0):1);
+                               res->a[0] = dual(0,(str[1]>='0' && str[1]<='9')?wcstod(str.c_str()+1,0):1);
                        else if(!str.compare(L"pi"))    res->a[0] = M_PI;
                        else if(ch==':')        res->a[0] = -1;
                        else if(!str.compare(L"nan"))   res->a[0] = NAN;
@@ -937,8 +1002,16 @@ HADT MGL_NO_EXPORT mglFormulaCalcC(std::wstring str, mglParser *arg, const std::
                std::wstring nm = str.substr(0,n);
                str = str.substr(n+1,len-n-2);  len -= n+2;
                HCDT v = FindVar(head, nm);
+               HADT tmp = 0;
 //             mglVar *v = arg->FindVar(nm.c_str());
                if(!v && !nm.compare(0,7,L"jacobi_"))   nm = nm.substr(7);
+               if(!v && nm.empty())    
+               {
+                       long m=mglFindInText(nm,")");
+                       if(m>1)
+                       {       nm = str.substr(0,m);   str = str.substr(m+2);
+                               tmp = mglFormulaCalcC(nm,arg,head);     v = tmp;        }
+               }
                n = mglFindInText(str,",");
                if(v)   // subdata
                {
@@ -947,7 +1020,8 @@ HADT MGL_NO_EXPORT mglFormulaCalcC(std::wstring str, mglParser *arg, const std::
                                char *buf = new char[len];
                                mgl_wcstombs(buf, str.substr(1).c_str(), len-1);        buf[len-1]=0;
                                HADT res = mgl_datac_column(v,buf);
-                               delete []buf;   return res;
+                               if(tmp) mgl_delete_datac(tmp);
+                               delete []buf;   return res?res:new mglDataC;
                        }
                        else
                        {
@@ -970,9 +1044,11 @@ HADT MGL_NO_EXPORT mglFormulaCalcC(std::wstring str, mglParser *arg, const std::
                                }
                                else    a1 = mglFormulaCalc(str, arg, head);
                                HADT res = mgl_datac_subdata_ext(v,a1,a2,a3);
+                               if(tmp) mgl_delete_datac(tmp);
                                mgl_delete_data(a1);    mgl_delete_data(a2);
-                               mgl_delete_data(a3);    return res;
+                               mgl_delete_data(a3);    return res?res:new mglDataC;
                        }
+                               if(tmp) mgl_delete_datac(tmp);
                }
                else if(nm[0]=='a')     // function
                {
@@ -990,6 +1066,8 @@ HADT MGL_NO_EXPORT mglFormulaCalcC(std::wstring str, mglParser *arg, const std::
                        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')
@@ -1012,7 +1090,10 @@ 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);
diff --git a/src/exec.cpp b/src/exec.cpp
deleted file mode 100644 (file)
index c561826..0000000
+++ /dev/null
@@ -1,3798 +0,0 @@
-/***************************************************************************
- * exec.cpp is part of Math Graphic Library
- * 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       *
- *   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_gray(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(k[0]==0)     gr->Gray(true);
-       else if(!strcmp(k,"n")) gr->Gray(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_shear(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"nn"))     gr->Shear(a[0].v, a[1].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 *)
-{
-       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_setsizescl(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"n"))      gr->SetSizeScl(a[0].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 *, 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_shearplot(mglGraph *gr, long , mglArg *a, const char *k, const char *)
-{
-       int res=0;
-       if(!strcmp(k,"nnnn"))   gr->ShearPlot(mgl_int(a[0].v), mgl_int(a[1].v), a[2].v, a[3].v);
-       else if(!strcmp(k,"nnnnnn"))    gr->ShearPlot(mgl_int(a[0].v), mgl_int(a[1].v), a[2].v, a[3].v, a[4].v, a[5].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_limit(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->Limit(a[1].v);
-       else if(c && !strcmp(k,"dn"))   c->Limit(a[1].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;      buf = new char[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());
-                       delete []buf;   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);     delete []buf;   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());
-                       delete []buf;   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);     delete []buf;   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();        delete []buf;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_scanfile(mglGraph *, 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_tridmat(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       mglData *d = dynamic_cast<mglData *>(a[0].d);
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(c && !strcmp(k,"ddddds"))
-               *c = mglTridMatC(*(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), a[5].s.c_str());
-       else if(d && !strcmp(k,"ddddds"))
-               *d = mglTridMat(*(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), a[5].s.c_str());
-       else res = 1;   return res;
-}
-//-----------------------------------------------------------------------------
-int MGL_NO_EXPORT mgls_diffract(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
-{
-       int res=0;
-       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
-       if(c && !strcmp(k,"dsn"))       c->Diffraction(a[1].s.c_str(), a[2].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_flame2d(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, "dddn")) fx->Set(mglFlame2d(*(a[1].d), *(a[2].d), mgl_int(a[3].v)));
-       else if (!strcmp(k, "ddddn") && fy)
-       {
-               mglData f(mglFlame2d(*(a[2].d), *(a[3].d), mgl_int(a[4].v)));
-               fx->Set(f.SubData(0));  fy->Set(f.SubData(1));
-       }
-       else if (!strcmp(k, "dddnn"))   fx->Set(mglFlame2d(*(a[1].d), *(a[2].d), mgl_int(a[3].v), mgl_int(a[4].v)));
-       else if (!strcmp(k, "ddddnn") && fy)
-       {
-               mglData f(mglFlame2d(*(a[2].d), *(a[3].d), mgl_int(a[4].v), mgl_int(a[5].v)));
-               fx->Set(f.SubData(0));  fy->Set(f.SubData(1));
-       }
-       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;
-}
-//-----------------------------------------------------------------------------
-int mgls_ifsfile(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, "dssn")) f->Set(mglIFSfile(a[1].s.c_str(), a[2].s.c_str(), mgl_int(a[3].v)));
-       else if (!strcmp(k, "dssnn"))   f->Set(mglIFSfile(a[1].s.c_str(), a[2].s.c_str(), mgl_int(a[3].v), mgl_int(a[4].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 quasi-optical 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 entries","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},
-       {"diffract","Step for pulse diffraction","diffract Res 'how' q", mgls_diffract ,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},
-       {"flame2d", "Computes the flame fractal", "flame2d F A B n [skip]|Fx Fy A B n [skip]", mgls_flame2d, 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},
-       {"gray","Switch on/off gray-scale mode","gray [val]", mgls_gray ,2},
-       {"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},
-       {"ifsfile", "Computes the attractor of an IFS with parameters from *.ifs file", "ifsfile F 'fname' 'name' n [skip]", mgls_ifsfile, 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},
-       {"limit","Limit data to be inside [-v,v]","limit Dat v", mgls_limit ,16},
-       {"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 plot 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' [rewrite]", mgls_savehdf ,3},
-       {"scanfile","Get formated data from file","scanfile Dat 'fname 'templ'", mgls_scanfile ,4},
-       {"setsize","Set picture size","setsize width height", mgls_setsize ,2},
-       {"setsizescl","Set scaling factor for further setsize","setsizescl val", mgls_setsizescl ,2},
-       {"sew","Remove jump into the data, like phase jumps","sew Dat ['dir' da]", mgls_sew ,16},
-       {"shear","Shear plot","shear valx valy", mgls_shear ,5},
-       {"shearplot","Set position of plot inside cell of sheared stick", "shearplot num ind sx sy [xd yd]", mgls_shearplot ,5},
-       {"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 rotated 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},
-       {"tridmat","Solve tridiagonal matrix","tridmat Res A B C D 'how'", mgls_tridmat ,4},
-       {"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},
-       {"variant","Select variant of plot style(s)","variant var", 0, 6},
-       {"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}};
-//-----------------------------------------------------------------------------
diff --git a/src/exec_dat.cpp b/src/exec_dat.cpp
new file mode 100644 (file)
index 0000000..6958f2c
--- /dev/null
@@ -0,0 +1,1730 @@
+/***************************************************************************
+ * exec_dat.cpp is part of Math Graphic Library
+ * 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       *
+ *   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 static 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 static mgls_apde(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.s, *(a[3].d), *(a[4].d), 0.1,100,opt);
+               else if(!strcmp(k,"ddsddn"))
+                       r = gr->APDEc(a[2].s.s, *(a[3].d), *(a[4].d), a[5].v,100,opt);
+               else if(!strcmp(k,"ddsddnn"))
+                       r = gr->APDEc(a[2].s.s, *(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.s, *(a[2].d), *(a[3].d), 0.1,100,opt);
+               else if(!strcmp(k,"dsddn"))
+                       *d = gr->APDE(a[1].s.s, *(a[2].d), *(a[3].d), a[4].v,100,opt);
+               else if(!strcmp(k,"dsddnn"))
+                       *d = gr->APDE(a[1].s.s, *(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.s, *(a[2].d), *(a[3].d), 0.1,100,opt);
+               else if(!strcmp(k,"dsddn"))
+                       *c = gr->APDEc(a[1].s.s, *(a[2].d), *(a[3].d), a[4].v,100,opt);
+               else if(!strcmp(k,"dsddnn"))
+                       *c = gr->APDEc(a[1].s.s, *(a[2].d), *(a[3].d), a[4].v,a[5].v,opt);
+               else res = 1;
+       }
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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 static mgls_coil(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,"dnn"))               d->Coil(a[1].v, a[2].v);
+       else if(d && !strcmp(k,"dnnn")) d->Coil(a[1].v, a[2].v, a[3].v);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s));
+       else if(c && !strcmp(k,"dds"))  *c = mglDataC(true,mgl_datac_column(a[1].d,a[2].s.s));
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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 static 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.s); }
+       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 if(!strcmp(k,"ds") && gr->pr)
+               d->Set(mgl_parser_find_var(gr->pr, a[1].s.s));
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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,"dds"))       *d = mglData(true,mgl_data_correl(a[1].d, a[1].d, a[2].s.s));
+       else if(d && !strcmp(k,"ddds")) *d = mglData(true,mgl_data_correl(a[1].d, a[2].d, a[3].s.s));
+       else if(c && !strcmp(k,"dds"))  *c = mglDataC(true,mgl_datac_correl(a[1].d, a[1].d, a[2].s.s));
+       else if(c && !strcmp(k,"ddds")) *c = mglDataC(true,mgl_datac_correl(a[1].d, a[2].d, a[3].s.s));
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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);
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && !strcmp(k,"ds"))        d->CosFFT(a[1].s.s);
+       else if(c && !strcmp(k,"ds"))   d->CosFFT(a[1].s.s);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s[0]);
+       else if(d && !strcmp(k,"ds"))   d->Crop(a[1].s.s);
+       else if(c && !strcmp(k,"dnns")) c->Crop(mgl_int(a[1].v),mgl_int(a[2].v),a[3].s.s[0]);
+       else if(c && !strcmp(k,"ds"))   c->Crop(a[1].s.s);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s);
+       else if(c && !strcmp(k,"ds"))   c->CumSum(a[1].s.s);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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 static mgls_datas(mglGraph *gr, long , mglArg *a, const char *k, const char *)
+{
+       int res=0;
+       if(!strcmp(k,"s"))
+       {
+               char *buf=new char[1024];
+               long n=mgl_datas_hdf(a[0].s.s,buf,1024);
+               if(n<0)
+               {
+                       delete []buf;   buf=new char[-n];
+                       mgl_datas_hdf(a[0].s.s,buf,-n);
+               }
+               gr->SetWarn(-1,buf);
+               delete []buf;
+       }
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static mgls_delete(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((!strcmp(k,"d") || !strcmp(k,"s")) && gr->pr)
+               mgl_parser_del_var(gr->pr, a[0].s.s);
+       else if(d && !strcmp(k,"ds"))   d->Delete(a[1].s.s[0]);
+       else if(d && !strcmp(k,"dsn"))  d->Delete(a[1].s.s[0], mgl_int(a[2].v));
+       else if(d && !strcmp(k,"dsnn")) d->Delete(a[1].s.s[0], mgl_int(a[2].v), mgl_int(a[3].v));
+       else if(c && !strcmp(k,"ds"))   c->Delete(a[1].s.s[0]);
+       else if(c && !strcmp(k,"dsn"))  c->Delete(a[1].s.s[0], mgl_int(a[2].v));
+       else if(c && !strcmp(k,"dsnn")) c->Delete(a[1].s.s[0], mgl_int(a[2].v), mgl_int(a[3].v));
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static mgls_detect(mglGraph *, long, mglArg *a, const char *k, const char *)
+{
+       mglData *r = dynamic_cast<mglData*>(a[0].d);
+       int res = 0;
+       if(r && !strcmp(k, "ddnn"))     r->Set(mglDetect(*(a[1].d), a[2].v, a[3].v));
+       else if(r && !strcmp(k, "ddnnn"))       r->Set(mglDetect(*(a[1].d), a[2].v, a[3].v, a[4].v));
+       else if(r && !strcmp(k, "ddnnnn"))      r->Set(mglDetect(*(a[1].d), a[2].v, a[3].v, a[4].v, a[5].v));
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s);
+       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.s);
+//     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 static 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.s);
+       else if(c && !strcmp(k,"ds"))   c->Diff2(a[1].s.s);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static mgls_diffract(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
+{
+       int res=0;
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(c && !strcmp(k,"dsn"))       c->Diffraction(a[1].s.s, a[2].v);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static mgls_dilate(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,"d")) d->Dilate();
+       else if(d && !strcmp(k,"dn"))   d->Dilate(a[1].v);
+       else if(d && !strcmp(k,"dnn"))  d->Dilate(a[1].v, a[2].v);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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 static 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 static 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);
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && !strcmp(k,"d")) d->Envelop();
+       else if(d && !strcmp(k,"ds"))   d->Envelop(a[1].s.s[0]);
+       else if(c && !strcmp(k,"d"))    c->Envelop();
+       else if(c && !strcmp(k,"ds"))   c->Envelop(a[1].s.s[0]);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static mgls_erode(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,"d")) d->Erode();
+       else if(d && !strcmp(k,"dn"))   d->Erode(a[1].v);
+       else if(d && !strcmp(k,"dnn"))  d->Erode(a[1].v, a[2].v);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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 static 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.s, a[2].s.s);
+       else if(!strcmp(k,"dssnn"))     a[0].d->Export(a[1].s.s, a[2].s.s, a[3].v,a[4].v);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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 static 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.s[0]);
+               else if(!strcmp(k,"ds"))        gr->Fill(*d,a[1].s.s,opt);
+               else if(!strcmp(k,"dsd"))       gr->Fill(*d,a[1].s.s, *(a[2].d),opt);
+               else if(!strcmp(k,"dsdd"))      gr->Fill(*d,a[1].s.s, *(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.s[0]);
+               else if(!strcmp(k,"ds"))        gr->Fill(*c,a[1].s.s,opt);
+               else if(!strcmp(k,"dsd"))       gr->Fill(*c,a[1].s.s, *(a[2].d),opt);
+               else if(!strcmp(k,"dsdd"))      gr->Fill(*c,a[1].s.s, *(a[2].d), *(a[3].d),opt);
+               else res = 1;
+       }
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s, a[6].s.s, *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.s, a[6].s.s,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.s, a[5].s.s, *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.s, a[5].s.s,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.s, a[4].s.s, *i,opt);
+               else    res = 1;
+       }
+       else if(!strcmp(k,"dddss"))
+               *d = gr->Fit(*(a[1].d), *(a[2].d), a[3].s.s, a[4].s.s,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.s, a[3].s.s, *i,opt);
+               else    res = 1;
+       }
+       else if(!strcmp(k,"ddss"))
+               *d = gr->Fit(*(a[1].d), a[2].s.s, a[3].s.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s, a[7].s.s, *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.s, a[7].s.s,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.s, a[6].s.s, *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.s, a[6].s.s,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.s, a[5].s.s, *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.s, a[5].s.s,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.s, a[4].s.s, *i,opt);
+               else    res = 1;
+       }
+       else if(!strcmp(k,"dddss"))
+               *d = gr->FitS(*(a[1].d), *(a[2].d), a[3].s.s, a[4].s.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s);
+       else if(!strcmp(k,"ds") && c)           c->FFT(a[1].s.s);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static mgls_gspline(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(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 static 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.s);
+       else if(c && !strcmp(k,"ds"))   c->Hankel(a[1].s.s);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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 static mgls_idset(mglGraph *, long , mglArg *a, const char *k, const char *)
+{
+       int res=0;
+       if(k[0]=='d' && a[0].d->temp)   return 5;
+       if(!strcmp(k,"ds"))     a[0].d->SetColumnId(a[1].s.s);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s, a[2].s.s);
+       else if(!strcmp(k,"dssnn"))     d->Import(a[1].s.s, a[2].s.s, a[3].v,a[4].v);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s);
+       else if(!strcmp(k,"n")) gr->SetWarn(-1,("value = "+mgl_str_num(a[0].v)).c_str());
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s[0]);
+       else if(d && !strcmp(k,"dsn"))  d->Insert(a[1].s.s[0], mgl_int(a[2].v));
+       else if(d && !strcmp(k,"dsnn")) d->Insert(a[1].s.s[0], mgl_int(a[2].v), mgl_int(a[3].v));
+       else if(c && !strcmp(k,"ds"))   c->Insert(a[1].s.s[0]);
+       else if(c && !strcmp(k,"dsn"))  c->Insert(a[1].s.s[0], mgl_int(a[2].v));
+       else if(c && !strcmp(k,"dsnn")) c->Insert(a[1].s.s[0], mgl_int(a[2].v), mgl_int(a[3].v));
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s);
+       else if(c && !strcmp(k,"ds"))   c->Integral(a[1].s.s);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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 static 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 static mgls_limit(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->Limit(a[1].v);
+       else if(c && !strcmp(k,"dn"))   c->Limit(a[1].v);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s));
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s));
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s);
+       else if(c && !strcmp(k,"ds"))   c->Mirror(a[1].s.s);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s);
+       else if(d && !strcmp(k,"dsn"))  d->Modify(a[1].s.s, mgl_int(a[2].v));
+       else if(d && !strcmp(k,"dsd"))  d->Modify(a[1].s.s,*(a[2].d));
+       else if(d && !strcmp(k,"dsdd")) d->Modify(a[1].s.s,*(a[2].d),*(a[3].d));
+       else if(c && !strcmp(k,"ds"))   c->Modify(a[1].s.s);
+       else if(c && !strcmp(k,"dsn"))  c->Modify(a[1].s.s, mgl_int(a[2].v));
+       else if(c && !strcmp(k,"dsd"))  c->Modify(a[1].s.s,*(a[2].d));
+       else if(c && !strcmp(k,"dsdd")) c->Modify(a[1].s.s,*(a[2].d),*(a[3].d));
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s));
+       else if(d && !strcmp(k,"ddss")) *d = mglData(true,mgl_data_momentum(a[1].d,a[3].s.s[0], a[2].s.s));
+       else if(c && !strcmp(k,"dds"))  *c = mglDataC(true,mgl_datac_momentum(a[1].d,'z', a[2].s.s));
+       else if(c && !strcmp(k,"ddss")) *c = mglDataC(true,mgl_datac_momentum(a[1].d,a[3].s.s[0], a[2].s.s));
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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 static 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.s,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.s,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.s,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.s,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.s,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.s,opt);       }
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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 static 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.s[0]);
+       else if(!strcmp(k,"dnnsn"))     d->NormSl(a[1].v, a[2].v, a[3].s.s[0],a[4].v);
+       else if(!strcmp(k,"dnnsnn"))d->NormSl(a[1].v, a[2].v, a[3].s.s[0],a[4].v,a[5].v);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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);
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d)
+       {
+               if(!strcmp(k,"dssd"))
+                       *d = mglODE(a[1].s.s, a[2].s.s, *(a[3].d));
+               else if(!strcmp(k,"dssdnn"))
+                       *d = mglODE(a[1].s.s, a[2].s.s, *(a[3].d), a[4].v, a[5].v);
+       }
+       else if(c)
+       {
+               if(!strcmp(k,"dssd"))
+                       *c = mglODEc(a[1].s.s, a[2].s.s, *(a[3].d));
+               else if(!strcmp(k,"dssdnn"))
+                       *c = mglODEc(a[1].s.s, a[2].s.s, *(a[3].d), a[4].v, a[5].v);
+       }
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static mgls_openhdf(mglGraph *gr, long , mglArg *a, const char *k, const char *)
+{
+       int res=0;
+       if(!strcmp(k,"s") && gr->pr)    mgl_parser_openhdf(gr->pr, a[0].s.s);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s, *(a[3].d), *(a[4].d), 0.1,100,opt);
+               else if(!strcmp(k,"ddsddn"))
+                       r = gr->PDEc(a[2].s.s, *(a[3].d), *(a[4].d), a[5].v,100,opt);
+               else if(!strcmp(k,"ddsddnn"))
+                       r = gr->PDEc(a[2].s.s, *(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.s, *(a[2].d), *(a[3].d), 0.1,100,opt);
+               else if(!strcmp(k,"dsddn"))
+                       *d = gr->PDE(a[1].s.s, *(a[2].d), *(a[3].d), a[4].v,100,opt);
+               else if(!strcmp(k,"dsddnn"))
+                       *d = gr->PDE(a[1].s.s, *(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.s, *(a[2].d), *(a[3].d), 0.1,100,opt);
+               else if(!strcmp(k,"dsddn"))
+                       *c = gr->PDEc(a[1].s.s, *(a[2].d), *(a[3].d), a[4].v,100,opt);
+               else if(!strcmp(k,"dsddnn"))
+                       *c = gr->PDEc(a[1].s.s, *(a[2].d), *(a[3].d), a[4].v,a[5].v,opt);
+               else res = 1;
+       }
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static mgls_print(mglGraph *, 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.s);
+       else if(!strcmp(k,"n")) printf("value = %g\n",a[0].v);
+       else res = 1;
+       fflush(stdout); return res;
+}
+//-----------------------------------------------------------------------------
+int static mgls_progress(mglGraph *gr, long , mglArg *a, const char *k, const char *)
+{
+       int res=0;
+       if(!strcmp(k,"nn") && mgl_progress_func)
+               mgl_progress_func(mgl_int(a[0].v), mgl_int(a[1].v), gr->Self());
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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 static 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 static 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.s);
+       else if(!strcmp(k,"nnss"))      gr->PutsFit(mglPoint(a[0].v,a[1].v), a[2].s.s,a[3].s.s);
+       else if(!strcmp(k,"nnssn"))     gr->PutsFit(mglPoint(a[0].v,a[1].v), a[2].s.s,a[3].s.s,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.s);
+       else if(!strcmp(k,"nnnss"))     gr->PutsFit(mglPoint(a[0].v,a[1].v,a[2].v), a[3].s.s,a[4].s.s);
+       else if(!strcmp(k,"nnnssn"))gr->PutsFit(mglPoint(a[0].v,a[1].v,a[2].v), a[3].s.s,a[4].s.s,a[5].v);
+       else res = 1;
+       gr->Self()->LoadState();        return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s, 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.s, 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.s, 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.s, 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.s, 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.s, 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.s, 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.s, 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.s, 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.s, 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.s, 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.s, 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 static 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.s, 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.s, 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.s, 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.s, 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.s, 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.s, 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.s, 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.s, 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.s, 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.s, 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.s, 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.s, 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 static 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.s, mglPoint(a[2].v, a[3].v), mglPoint(a[4].v, a[5].v));
+       else if(!strcmp(k,"dsnnnnnn"))
+               *d = mglRay(a[1].s.s, 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.s, 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.s, 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 static 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.s);
+               else if(!strcmp(k,"dsn"))       rr=c->Read(a[1].s.s, mgl_int(a[2].v));
+               else if(!strcmp(k,"dsnn"))      rr=c->Read(a[1].s.s, mgl_int(a[2].v),mgl_int(a[3].v));
+               else if(!strcmp(k,"dsnnn"))     rr=c->Read(a[1].s.s, 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.s);
+               else if(!strcmp(k+3,"n"))       rr=r.Read(a[2].s.s, mgl_int(a[3].v));
+               else if(!strcmp(k+3,"nn"))      rr=r.Read(a[2].s.s, mgl_int(a[3].v),mgl_int(a[4].v));
+               else if(!strcmp(k+3,"nnn"))     rr=r.Read(a[2].s.s, 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.s);
+               else if(!strcmp(k,"dsn"))       rr=d->Read(a[1].s.s, mgl_int(a[2].v));
+               else if(!strcmp(k,"dsnn"))      rr=d->Read(a[1].s.s, mgl_int(a[2].v),mgl_int(a[3].v));
+               else if(!strcmp(k,"dsnnn"))     rr=d->Read(a[1].s.s, 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 static 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.s);
+       else if(d && !strcmp(k,"dsn"))          rr=d->ReadAll(a[1].s.s, a[2].v);
+       else if(d && !strcmp(k,"dsnn"))         rr=d->ReadRange(a[1].s.s, a[2].v, a[3].v);
+       else if(d && !strcmp(k,"dsnnn"))        rr=d->ReadRange(a[1].s.s, a[2].v, a[3].v, a[4].v);
+       else if(d && !strcmp(k,"dsnnnn"))       rr=d->ReadRange(a[1].s.s, a[2].v, a[3].v, a[4].v, a[5].v);
+       else if(c && !strcmp(k,"ds"))           rr=c->ReadAll(a[1].s.s);
+       else if(c && !strcmp(k,"dsn"))          rr=c->ReadAll(a[1].s.s, a[2].v);
+       else if(c && !strcmp(k,"dsnn"))         rr=c->ReadRange(a[1].s.s, a[2].v, a[3].v);
+       else if(c && !strcmp(k,"dsnnn"))        rr=c->ReadRange(a[1].s.s, a[2].v, a[3].v, a[4].v);
+       else if(c && !strcmp(k,"dsnnnn"))       rr=c->ReadRange(a[1].s.s, a[2].v, a[3].v, a[4].v, a[5].v);
+       else res = 1;
+       if(!rr) gr->SetWarn(mglWarnFile,"ReadAll");
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s, a[2].s.s);
+       else if(c && !strcmp(k,"dss"))  c->ReadHDF(a[1].s.s, a[2].s.s);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s);
+       else if(d && !strcmp(k,"dsn"))  rr=d->ReadMat(a[1].s.s, mgl_int(a[2].v));
+       else if(c && !strcmp(k,"ds"))   rr=c->ReadMat(a[1].s.s);
+       else if(c && !strcmp(k,"dsn"))  rr=c->ReadMat(a[1].s.s, mgl_int(a[2].v));
+       else res = 1;
+       if(!rr) gr->SetWarn(mglWarnFile,"ReadMat");
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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 static 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 static 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 static mgls_rkstep(mglGraph *gr, long , mglArg *a, const char *k, const char *)
+{
+       int res=0;
+       if(!strcmp(k,"ss") && gr->pr)
+               mgl_rk_step_w(gr->pr, a[0].s.w, a[1].s.w, 1);
+       else if(!strcmp(k,"ssn") && gr->pr)
+               mgl_rk_step_w(gr->pr, a[0].s.w, a[1].s.w, a[2].v);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s[0], mgl_int(a[2].v));
+       else if(c && !strcmp(k,"dsn"))  c->Roll(a[1].s.s[0], mgl_int(a[2].v));
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s, a[2].d, a[3].s[0]));
+       else if(!strcmp(k,"dsns"))
+               d->a[0] = mgl_find_root_txt(a[1].s.s, a[2].v, a[3].s[0]);
+       else if(!strcmp(k,"dsd"))
+               *d = mglData(true,mgl_data_roots(a[1].s.s, a[2].d, 'x'));
+       else if(!strcmp(k,"dsn"))
+               d->a[0] = mgl_find_root_txt(a[1].s.s, a[2].v, 'x');
+       else if(!strcmp(k,"dssd"))
+               *d = mglData(true,mgl_find_roots_txt(a[1].s.s, a[2].s.s, a[3].d));
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s);
+       else if(!strcmp(k,"ss"))
+       {
+               FILE *fp = fopen(a[1].s.s,"a");
+               size_t pos;     std::string s=a[0].s.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.s,a[2].s.s);
+               size_t pos;     std::string s=a[0].s.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 static 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.s, a[2].s.s);
+       else if(!strcmp(k,"dssn"))      a[0].d->SaveHDF(a[1].s.s, a[2].s.s,mgl_int(a[3].v));
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static mgls_scanfile(mglGraph *, 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.s, a[2].s.s);
+       }
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static mgls_section(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,"dddsn"))
+                       *d = mglData(true,mgl_data_section(a[1].d, a[2].d, a[3].s[0], a[4].v));
+               else if(!strcmp(k,"ddds"))
+                       *d = mglData(true,mgl_data_section(a[1].d, a[2].d, a[3].s[0], NAN));
+               else if(!strcmp(k,"ddd"))
+                       *d = mglData(true,mgl_data_section(a[1].d, a[2].d, 'y', NAN));
+               else if(!strcmp(k,"ddnsn"))
+                       *d = mglData(true,mgl_data_section_val(a[1].d, mgl_int(a[2].v), a[3].s[0], a[4].v));
+               else if(!strcmp(k,"ddns"))
+                       *d = mglData(true,mgl_data_section_val(a[1].d, mgl_int(a[2].v), a[3].s[0], NAN));
+               else if(!strcmp(k,"ddn"))
+                       *d = mglData(true,mgl_data_section_val(a[1].d, mgl_int(a[2].v), 'y', NAN));
+               else res = 1;
+       }
+       else if(c)
+       {
+               if(!strcmp(k,"dddsn"))
+                       *d = mglDataC(true,mgl_datac_section(a[1].d, a[2].d, a[3].s[0], a[4].v));
+               else if(!strcmp(k,"ddds"))
+                       *d = mglDataC(true,mgl_datac_section(a[1].d, a[2].d, a[3].s[0], NAN));
+               else if(!strcmp(k,"ddd"))
+                       *d = mglDataC(true,mgl_datac_section(a[1].d, a[2].d, 'y', NAN));
+               else if(!strcmp(k,"ddnsn"))
+                       *d = mglDataC(true,mgl_datac_section_val(a[1].d, mgl_int(a[2].v), a[3].s[0], a[4].v));
+               else if(!strcmp(k,"ddns"))
+                       *d = mglDataC(true,mgl_datac_section_val(a[1].d, mgl_int(a[2].v), a[3].s[0], NAN));
+               else if(!strcmp(k,"ddn"))
+                       *d = mglDataC(true,mgl_datac_section_val(a[1].d, mgl_int(a[2].v), 'y', NAN));
+               else res = 1;
+       }
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s);
+       else if(!strcmp(k,"dsn"))       d->Sew(a[1].s.s, a[2].v);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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);
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(d && !strcmp(k,"ds"))        d->SinFFT(a[1].s.s);
+       else if(d && !strcmp(k,"ds"))   c->SinFFT(a[1].s.s);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s);
+       else if(c && !strcmp(k,"d"))    c->Smooth();
+       else if(c && !strcmp(k,"ds"))   c->Smooth(a[1].s.s);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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 static 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 static 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 static 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.s[0]);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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 static 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 static 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.s));
+       else if(c && !strcmp(k,"dds"))  *c = mglDataC(true,mgl_datac_sum(a[1].d,a[2].s.s));
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s);
+       else if(c && !strcmp(k,"ds"))   c->Swap(a[1].s.s);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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 static 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.s);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s);
+       else if(c && !strcmp(k,"d"))    c->Transpose();
+       else if(c && !strcmp(k,"ds"))   c->Transpose(a[1].s.s);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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 static mgls_tridmat(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
+{
+       int res=0;
+       mglData *d = dynamic_cast<mglData *>(a[0].d);
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(c && !strcmp(k,"ddddds"))
+               *c = mglTridMatC(*(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), a[5].s.s);
+       else if(d && !strcmp(k,"ddddds"))
+               *d = mglTridMat(*(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), a[5].s.s);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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 static 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);
+       mglDataC *c = dynamic_cast<mglDataC *>(a[0].d);
+       if(!strcmp(k,"dsn") && d)       d->Wavelet(a[1].s.s, mgl_int(a[2].v));
+       else if(!strcmp(k,"dsn") && c)  c->Wavelet(a[1].s.s, mgl_int(a[2].v));
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+mglCommand mgls_dat_cmd[] = {
+       {"addto",_("Add data or number"),"addto Var Dat|Var num", mgls_addto ,3},
+       {"apde",_("Solve PDE using advanced method (X-Y only)"),"apde Res 'ham' IniRe IniIm [dz k0]", mgls_apde ,4},
+       {"clean",_("Remove duplicate rows"),"clean Dat id", mgls_clean ,3},
+       {"coil",_("Project periodical data in [v1,v2]"),"coil Dat v1 v2 [sep]", mgls_coil ,16},
+       {"column",_("Get data column filled by formula on column ids"),"column Res Dat 'eq'", mgls_column ,4},
+       {"combine",_("Direct multiplication of arrays"), "combine Res Adat Bdat", mgls_combine ,4},
+       {"copy",_("Copy data from another variable"),"copy Dat1 Dat2 ['eq']|ReDat ImDat Cdat|Dat val|Dat 'name'", mgls_copy ,4},
+       {"correl",_("Find correlation between data arrays"), "correl Res Adat Bdat 'dir'|Res Adat 'dir'", mgls_correl ,4},
+       {"cosfft",_("Cos-Fourier transform at some direction"),"cosfft Dat 'dir'", mgls_cosfft ,16},
+       {"crop",_("Crop edge of data"),"crop Dat n1 n2 'dir'|Dat 'how'", mgls_crop ,16},
+       {"cumsum",_("Cumulative summation along direction(s)"),"cumsum Dat 'dir'", mgls_cumsum ,16},
+       {"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},
+       {"delete",_("Delete data or slice of data"),"delete Dat|'Dat'|Dat 'dir' [pos=0 num=1]", mgls_delete ,3},
+       {"detect",_("Detect curves for maximums of data array"), "detect Res Dat lvl dj [di min_len]", mgls_detect, 4},
+       {"diff",_("Numerically differentiate data"),"diff Var 'dir'|Var Dir Const1 [Const2]", mgls_diff ,16},
+       {"diff2",_("Numerically double differentiate data"),"diff2 Var 'dir'", mgls_diff2 ,16},
+       {"diffract",_("Step for pulse diffraction"),"diffract Res 'how' q", mgls_diffract ,16},
+       {"dilate",_("Dilate data larger val"),"dilate Dat [val step]", mgls_dilate ,3},
+       {"divto",_("Divide by data or number"),"divto Var Dat|Var num", mgls_divto ,3},
+       {"echo",_("Print content of the data"),"echo Dat", mgls_echo ,3},
+       {"envelop",_("Find envelop for the data"),"envelop Dat ['dir']", mgls_envelop ,16},
+       {"erode",_("Erode data larger val"),"erode Dat [val step]", mgls_erode ,3},
+       {"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 file"),"export Dat 'fname' 'sch' [v1 v2]", mgls_export ,3},
+       {"extend",_("Extend data array"),"extend Dat dim1 [dim2]", mgls_extend ,3},
+       {"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},
+       {"fourier",_("In-place Fourier transform"),"fourier ReDat ImDat 'dir'|Cmplx 'dir'", mgls_fourier , 16},
+       {"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]|Res Xdat Dat|Res Xdat Ydat Dat|Res Xdat Ydat Zdat Dat", mgls_hist ,4},
+       {"idset",_("Set column id for data"),"idset Dat 'ids'", mgls_idset ,3},
+       {"import",_("Import data from PNG file"),"import Dat 'fname' 'scheme' [v1 v2]", mgls_import ,4},
+       {"info",_("Print message or information about the data"),"info Dat|'message'|const", mgls_info ,3},
+       {"insert",_("Insert slice of data"),"insert Dat 'dir' [pos=0 num=1]", mgls_insert ,3},
+       {"integrate",_("Integrate data along direction(s)"),"integrate Dat 'dir'", mgls_integrate ,16},
+       {"jacobian",_("Get Jacobian"),"jacobian Res Xdat Ydat [Zdat]", mgls_jacobian ,4},
+       {"join",_("Join data arrays"),"join Dat Add1 ...", mgls_join ,3},
+       {"limit",_("Limit data to be inside [-v,v]"),"limit Dat v", mgls_limit ,16},
+       {"max",_("Find maximal value over direction"),"max Res Dat 'dir'", mgls_max ,4},
+       {"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},
+       {"multo",_("Multiply by data or number"),"multo Var Dat|Var num", mgls_multo ,3},
+       {"new",_("Create new data"),"new Dat nx ['eq']|Dat nx ny ['eq']|Dat nx ny nz ['eq']", mgls_new ,4},
+       {"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},
+       {"openhdf",_("Open all data arrays from HDF file"),"openhdf 'fname'", mgls_openhdf ,3},
+       {"pde",_("Solve PDE"),"pde Res 'ham' IniRe IniIm [dz k0]", mgls_pde ,4},
+       {"print",_("Immediately print the message"),"print 'message'|Dat|const", mgls_print ,3},
+       {"progress",_("Immediately display the progress of calculation"),"progress value maximal", mgls_progress ,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},
+       {"ray",_("Solve Hamiltonian ODE (find GO ray or trajectory)"),"ray Res 'ham' x0 y0 z0 px0 py0 pz0 [dt=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]|Dat 'templ' from to [step slice]", mgls_readall ,4},
+       {"readhdf",_("Read data with name 'id' from HDF 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},
+       {"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},
+       {"resize",_("Resize data array"),"resize Res Dat mx [my mz]", mgls_resize ,4},
+       {"rkstep",_("Perform Runge-Kutta step"),"rkstep 'Diff1;Diff2;...' 'Var1;Var2;...' [dt]", mgls_rkstep, 6},
+       {"roll",_("Roll data along direction(s)"),"roll Dat 'dir' num", mgls_roll ,16},
+       {"roots",_("Find roots using data as initial values"), "roots Res 'func' Ini ['var']|Res 'func' ini ['var']|Res 'func' 'vars' Ini", mgls_roots ,4},
+       {"save",_("Save data to file"),"save Dat 'file'|'str' 'file' ['how']", mgls_save ,3},
+       {"savehdf",_("Save data to HDF5 file"),"savehdf Dat 'file' 'id' [rewrite]", mgls_savehdf ,3},
+       {"scanfile",_("Get formated data from file"),"scanfile Dat 'fname 'templ'", mgls_scanfile ,4},
+       {"section",_("Extract sub-array between values"),"section Res Dat id ['dir' val]|Res Dat Ids ['dir' val]", mgls_section ,4},
+       {"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 ['how']", 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},
+       {"squeeze",_("Squeeze data"),"squeeze Dat kx [ky kz smooth]", mgls_squeeze ,3},
+       {"stfad",_("Do STFA transform"),"stfad Res Real Imag dn ['dir']", mgls_stfad ,4},
+       {"subdata",_("Extract sub-array"),"subdata Res Dat ix [iy iz]|Res Dat Xdat [Ydat Zdat]", mgls_subdata ,4},
+       {"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},
+       {"swap",_("Swap data (useful after Fourier transform)"),"swap Dat 'dir'", mgls_swap ,16},
+       {"trace",_("Get trace of array"),"trace Res Dat", mgls_trace ,4},
+       {"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},
+       {"triangulate",_("Find triangles of randomly placed points"),"triangulate Res Xdat Ydat|Res Xdat Ydat Zdat", mgls_triangulate ,4},
+       {"tridmat",_("Solve tridiagonal matrix"),"tridmat Res A B C D 'how'", mgls_tridmat ,4},
+       {"var",_("Create new 1D data and fill it in range"),"var Dat nx x1 [x2]", mgls_var ,4},
+       {"wavelet",_("Wavelet transform at some direction"),"wavelet Dat 'dir' k", mgls_wavelet ,16},
+{"","","",NULL,0}};
+//-----------------------------------------------------------------------------
diff --git a/src/exec_gr.cpp b/src/exec_gr.cpp
new file mode 100644 (file)
index 0000000..24fadfd
--- /dev/null
@@ -0,0 +1,1210 @@
+/***************************************************************************
+ * exec_1d.cpp is part of Math Graphic Library
+ * 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       *
+ *   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);
+//-----------------------------------------------------------------------------
+//     1D
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,opt);
+       else if(!strcmp(k,"ns"))        gr->Bifurcation(a[0].v,a[1].s.s,"",opt);
+       else if(!strcmp(k,"nss"))       gr->Bifurcation(a[0].v,a[1].s.s,a[2].s.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,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.s,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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static mgls_iris(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
+{
+       int res=0;
+       if(!strcmp(k,"ds"))     gr->Iris(*(a[0].d),a[1].s.w,"",opt);
+       else if(!strcmp(k,"dss"))       gr->Iris(*(a[0].d),a[1].s.w,a[2].s.s,opt);
+       else if(!strcmp(k,"dds"))       gr->Iris(*(a[0].d),*(a[1].d),a[2].s.w,"",opt);
+       else if(!strcmp(k,"ddss"))      gr->Iris(*(a[0].d),*(a[1].d),a[2].s.w,a[3].s.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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].s.w, "",opt);
+       else if(!strcmp(k,"dss"))       gr->Label(*(a[0].d), a[1].s.w, a[2].s.s,opt);
+       else if(!strcmp(k,"dds"))       gr->Label(*(a[0].d), *(a[1].d), a[2].s.w, "",opt);
+       else if(!strcmp(k,"ddss"))      gr->Label(*(a[0].d), *(a[1].d), a[2].s.w, a[3].s.s,opt);
+       else if(!strcmp(k,"ddds"))      gr->Label(*(a[0].d), *(a[1].d), *(a[2].d), a[3].s.w, "",opt);
+       else if(!strcmp(k,"dddss"))     gr->Label(*(a[0].d), *(a[1].d), *(a[2].d), a[3].s.w, a[4].s.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,opt);
+       else if(!strcmp(k,"ns"))        gr->Lamerey(a[0].v,a[1].s.s,"",opt);
+       else if(!strcmp(k,"nss"))       gr->Lamerey(a[0].v,a[1].s.s,a[2].s.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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].s.w, "#|",opt);
+       else if(!strcmp(k,"dss"))       gr->Table(*(a[0].d), a[1].s.w, a[2].s.s,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].s.w, "#|",opt);
+       else if(!strcmp(k,"nndss"))     gr->Table(a[0].v, a[1].v, *(a[2].d), a[3].s.w, a[4].s.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,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.s,opt);
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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].s.w,"",opt);
+       else if(!strcmp(k,"dss"))       gr->TextMark(*(a[0].d),a[1].s.w,a[2].s.s,opt);
+       else if(!strcmp(k,"dds"))       gr->TextMark(*(a[0].d),*(a[1].d),a[2].s.w,"",opt);
+       else if(!strcmp(k,"ddss"))      gr->TextMark(*(a[0].d),*(a[1].d),a[2].s.w,a[3].s.s,opt);
+       else if(!strcmp(k,"ddds"))      gr->TextMark(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.w,"",opt);
+       else if(!strcmp(k,"dddss"))     gr->TextMark(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.w,a[4].s.s,opt);
+       else if(!strcmp(k,"dddds"))     gr->TextMark(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.w,"",opt);
+       else if(!strcmp(k,"ddddss"))gr->TextMark(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.w,a[5].s.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,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.s,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.s,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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+//     2D
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static mgls_beltc(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
+{
+       int res=0;
+       if(!strcmp(k,"dd"))     gr->BeltC(*(a[0].d),*(a[1].d),"",opt);
+       else if(!strcmp(k,"dds"))       gr->BeltC(*(a[0].d),*(a[1].d),a[2].s.s,opt);
+       else if(!strcmp(k,"dddd"))      gr->BeltC(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),"",opt);
+       else if(!strcmp(k,"dddds"))     gr->BeltC(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static mgls_contp(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
+{
+       int res=0;
+       if(!strcmp(k,"dddd"))   gr->ContP(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), "",opt);
+       else if(!strcmp(k,"dddds"))     gr->ContP(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), a[4].s.s,opt);
+       else if(!strcmp(k,"ddddd"))     gr->ContP(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), "",opt);
+       else if(!strcmp(k,"ddddds"))    gr->ContP(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), a[5].s.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,opt);
+       else if(!strcmp(k,"dddd"))      gr->Tile(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), "",opt);
+       else if(!strcmp(k,"dddds"))     gr->Tile(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), a[4].s.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,opt);
+       else if(!strcmp(k,"ddddd"))     gr->TileS(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),"",opt);
+       else if(!strcmp(k,"ddddds"))    gr->TileS(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),a[5].s.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+//     3D
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,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.s,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.s,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.s,mgl_int(a[7].v));
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s, -1,opt);
+       else if(!strcmp(k,"dsn"))       gr->Cont3(*(a[0].d), a[1].s.s, 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.s,-1,opt);
+       else if(!strcmp(k,"ddsn"))      gr->Cont3(*(a[0].d), *(a[1].d), a[2].s.s,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.s,-1,opt);
+       else if(!strcmp(k,"ddddsn"))    gr->Cont3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), a[4].s.s,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.s,-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.s,mgl_int(a[6].v),opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s, -1,opt);
+       else if(!strcmp(k,"dsn"))       gr->ContF3(*(a[0].d), a[1].s.s, 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.s,-1,opt);
+       else if(!strcmp(k,"ddsn"))      gr->ContF3(*(a[0].d), *(a[1].d), a[2].s.s,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.s,-1,opt);
+       else if(!strcmp(k,"ddddsn"))    gr->ContF3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), a[4].s.s,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.s,-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.s,mgl_int(a[6].v),opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,NAN,opt);
+       else if(!strcmp(k,"dsn"))       gr->ContX(*(a[0].d),a[1].s.s,a[2].v,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,NAN,opt);
+       else if(!strcmp(k,"dsn"))       gr->ContFX(*(a[0].d),a[1].s.s,a[2].v,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,NAN,opt);
+       else if(!strcmp(k,"dsn"))       gr->ContY(*(a[0].d),a[1].s.s,a[2].v,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,NAN,opt);
+       else if(!strcmp(k,"dsn"))       gr->ContFY(*(a[0].d),a[1].s.s,a[2].v,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,NAN,opt);
+       else if(!strcmp(k,"dsn"))       gr->ContZ(*(a[0].d),a[1].s.s,a[2].v,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,NAN,opt);
+       else if(!strcmp(k,"dsn"))       gr->ContFZ(*(a[0].d),a[1].s.s,a[2].v,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,-1,opt);
+       else if(!strcmp(k,"dsn"))       gr->Dens3(*(a[0].d),a[1].s.s,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.s,-1,opt);
+       else if(!strcmp(k,"ddddsn"))    gr->Dens3(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.s,mgl_int(a[5].v),opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,NAN,opt);
+       else if(!strcmp(k,"dsn"))       gr->DensX(*(a[0].d),a[1].s.s,a[2].v,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,NAN,opt);
+       else if(!strcmp(k,"dsn"))       gr->DensY(*(a[0].d),a[1].s.s,a[2].v,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,NAN,opt);
+       else if(!strcmp(k,"dsn"))       gr->DensZ(*(a[0].d),a[1].s.s,a[2].v,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,-1,opt);
+       else if(!strcmp(k,"dsn"))       gr->Grid3(*(a[0].d),a[1].s.s,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.s,-1,opt);
+       else if(!strcmp(k,"ddddsn"))gr->Grid3(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.s,mgl_int(a[5].v),opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+//     Vect
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,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.s,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.s,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.s,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.s,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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static mgls_flow3(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
+{
+       int res=0;
+       if(!strcmp(k,"ddd"))    gr->Flow3(*(a[0].d),*(a[1].d),*(a[2].d),"",-1,opt);
+       else if(!strcmp(k,"ddds"))      gr->Flow3(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.s,-1,opt);
+       else if(!strcmp(k,"dddsn"))     gr->Flow3(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.s,a[4].v,opt);
+       else if(!strcmp(k,"dddddd"))
+               gr->Flow3(*(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->Flow3(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d),a[6].s.s,-1,opt);
+       else if(!strcmp(k,"ddddddsn"))
+               gr->Flow3(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d),a[6].s.s,a[7].v,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,0.05,opt);
+       else if(!strcmp(k,"ddsn"))      gr->Pipe(*(a[0].d),*(a[1].d),a[2].s.s,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.s,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.s,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.s,0.05,opt);
+       else if(!strcmp(k,"dddsn"))
+               gr->Pipe(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.s,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.s,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.s,a[7].v,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,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.s,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.s,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.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,-1,opt);
+       else if(!strcmp(k,"dddsn"))
+               gr->Vect3(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.s,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.s,-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.s,a[7].v,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+mglCommand mgls_grf_cmd[] = {
+       {"area",_("Draw area plot for 1D data"),"area Ydat ['fmt']|Xdat Ydat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_area ,7},
+       {"axial",_("Draw surfaces of contour lines rotation"),"axial Zdat ['fmt' num]|Xdat Ydat Zdat ['fmt' num]", mgls_axial ,8},
+       {"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},
+       {"beam",_("Draw quasi-optical beam"),"beam Ray G1 G2 Adat r ['sch' flag num]|val Ray G1 G2 Adat r ['sch' flag num]", mgls_beam ,9},
+       {"belt",_("Draw belts"),"belt Zdat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_belt ,8},
+       {"beltc",_("Draw belts colored by other data"),"beltc Zdat Cdat ['fmt']|Xdat Ydat Zdat Cdat ['fmt']", mgls_beltc ,8},
+       {"bifurcation",_("Draw Bifurcation diagram"),"bifurcation dx Func ['fmt']|dx 'func' ['fmt']", mgls_bifurcation,13},
+       {"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},
+       {"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},
+       {"cloud",_("Draw cloud"),"cloud Adat ['fmt']|Xdat Ydat Zdat Adat ['fmt']", mgls_cloud ,9},
+       {"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},
+       {"contp",_("Draw contour lines on parametric surface"),"contp Xdat Ydat Zdat Adat ['fmt' num zpos]|Vdat Xdat Ydat Zdat Adat ['fmt' zpos]", mgls_contp ,8},
+       {"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},
+       {"crust",_("Draw reconstructed surface for arbitrary data points"),"crust Xdat Ydat Zdat ['fmt']", mgls_crust ,0},
+       {"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},
+       {"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},
+       {"error",_("Draw error boxes"),"error Ydat Yerr ['fmt']|Xdat Ydat Yerr ['fmt']|Xdat Ydat Xerr Yerr ['fmt']", mgls_error ,7},
+       {"fall",_("Draw waterfalls"),"fall Zdat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_fall ,8},
+       {"flow",_("Draw flow threads for vector field"),"flow Udat Vdat ['fmt']|Xdat Ydat Udat Vdat ['fmt']|Udat Vdat Wdat ['fmt']|Xdat Ydat Zdat Udat Vdat Wdat ['fmt']|\
+       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},
+       {"flow3",_("Draw flow threads from plain for vector field"),"flow3 Udat Udat Vdat Wdat ['fmt' num]|Xdat Ydat Zdat Udat Vdat Wdat ['fmt' num]", mgls_flow3 ,11},
+       {"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},
+       {"grid2",_("Draw grid for data array(s)"),"grid2 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},
+       {"iris",_("Draw Iris plots"),"iris Dats 'ids' ['fmt']|Dats Ranges 'ids' ['fmt']", mgls_iris,13},
+       {"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},
+       {"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},
+       {"mesh",_("Draw mesh surface"),"mesh Zdat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_mesh ,8},
+       {"ohlc",_("Draw Open-High-Low-Close (OHLC) diagram"),"ohlc Odat Hdat Ldat Cdat ['fmt']|Xdat Odat Hdat Ldat Cdat ['fmt']", mgls_ohlc ,7},
+       {"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},
+       {"pmap",_("Draw Poincare map"),"pmap Ydat Rdat ['fmt']|Xdat Ydat Rdat ['fmt']|Xdat Ydat Zdat Rdat ['fmt']", mgls_pmap ,7},
+       {"quadplot",_("Draw surface of quadrangles"),"quadplot Idat Xdat Ydat ['fmt']|Idat Xdat Ydat Zdat ['fmt']|Idat Xdat Ydat Zdat Cdat ['fmt'] ", mgls_quadplot ,0},
+       {"radar",_("Draw radar chart"),"radar Rdat ['fmt']", mgls_radar ,7},
+       {"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},
+       {"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},
+       {"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},
+       {"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},
+       {"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},
+       {"tile",_("Draw horizontal tiles"),"tile Zdat ['fmt']|Xdat Ydat Zdat ['fmt']|Xdat Ydat Zdat Cdat ['fmt']", mgls_tile ,8},
+       {"tiles",_("Draw horizontal tiles with variable size"),"tiles Zdat Rdat ['fmt']|Xdat Ydat Zdat Rdat ['fmt']|Xdat Ydat Zdat Rdat Cdat ['fmt']", mgls_tiles ,10},
+       {"torus",_("Draw surface of curve rotation"),"torus Rdat ['fmt']|Zdat Rdat ['fmt']", mgls_torus ,7},
+       {"traj",_("Draw vectors along a curve"),"traj Xdat Ydat Udat Vdat ['fmt' len]|Xdat Ydat Zdat Udat Vdat Wdat ['fmt' len]", mgls_traj ,11},
+       {"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},
+       {"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},
+{"","","",NULL,0}};
+//-----------------------------------------------------------------------------
diff --git a/src/exec_prm.cpp b/src/exec_prm.cpp
new file mode 100644 (file)
index 0000000..b2d953a
--- /dev/null
@@ -0,0 +1,654 @@
+/***************************************************************************
+ * exec_2d.cpp is part of Math Graphic Library
+ * 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       *
+ *   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 static 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.s);
+       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.s);
+       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.s);
+       else res = 1;
+       gr->Self()->LoadState();        return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s, "",opt);
+       else if(!strcmp(k,"ss"))        gr->Axis(a[0].s.s, a[1].s.s,opt);
+       else if(!strcmp(k,"sss"))       gr->SetFunc(a[0].s.s,a[1].s.s,a[2].s.s,"");
+       else if(!strcmp(k,"ssss"))      gr->SetFunc(a[0].s.s,a[1].s.s,a[2].s.s,a[3].s.s);
+       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 static mgls_background(mglGraph *gr, long , mglArg *a, const char *k, const char *)
+{
+       int res=0;
+       if(!strcmp(k,"s"))      gr->LoadBackground(a[0].s.s);
+       else if(!strcmp(k,"sn"))        gr->LoadBackground(a[0].s.s,a[1].v);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s);
+       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.s);
+       else res = 1;
+       gr->Self()->LoadState();        return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s);
+       else if(!strcmp(k,"sn"))        gr->Box(a[0].s.s, a[1].v);
+       else res = 1;
+       gr->Self()->LoadState();        return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s);
+       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.s);
+       else res = 1;
+       gr->Self()->LoadState();        return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s);
+       else if(!strcmp(k,"d"))         gr->Colorbar(*(a[0].d));
+       else if(!strcmp(k,"ds"))        gr->Colorbar(*(a[0].d), a[1].s.s);
+       else if(!strcmp(k,"snn"))       gr->Colorbar(a[0].s.s, a[1].v, a[2].v);
+       else if(!strcmp(k,"snnn"))      gr->Colorbar(a[0].s.s, a[1].v, a[2].v, a[3].v,1);
+       else if(!strcmp(k,"snnnn"))     gr->Colorbar(a[0].s.s, 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.s, a[2].v, a[3].v);
+       else if(!strcmp(k,"dsnnn"))     gr->Colorbar(*(a[0].d), a[1].s.s, a[2].v, a[3].v, a[4].v,1);
+       else if(!strcmp(k,"dsnnnn"))
+               gr->Colorbar(*(a[0].d), a[1].s.s, a[2].v, a[3].v, a[4].v,a[5].v);
+       else res = 1;
+       gr->Self()->LoadState();        return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s);
+       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.s);
+       else res = 1;
+       gr->Self()->LoadState();        return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s);
+       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.s);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s);
+       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.s, 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.s, 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.s);
+       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.s, 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.s, a[8].v, a[9].v);
+       else res = 1;
+       gr->Self()->LoadState();        return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s);
+       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.s);
+       else res = 1;
+       gr->Self()->LoadState();        return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s);
+       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.s);
+       else res = 1;
+       gr->Self()->LoadState();        return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s);
+       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.s);
+       else res = 1;
+       gr->Self()->LoadState();        return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s);
+       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.s,a[6].v,a[7].v);
+       else res = 1;
+       gr->Self()->LoadState();        return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s);
+       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.s,a[6].v,a[7].v);
+       else res = 1;
+       gr->Self()->LoadState();        return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s);
+       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.s,a[6].v,a[7].v);
+       else res = 1;
+       gr->Self()->LoadState();        return res;
+}
+//-----------------------------------------------------------------------------
+int static mgls_fgets(mglGraph *gr, long , mglArg *a, const char *k, const char *opt)
+{
+       int res=0;      gr->Self()->SaveState(opt);
+       char *buf;      buf = new char[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.s,"rt");
+               if(!fp)
+               {
+                       gr->SetWarn(mglWarnOpen,a[2].s.s);
+                       delete []buf;   return res;
+}
+               for(i=0;i<n;i++)        if(!fgets(buf,4096,fp)) continue;
+               memset(buf,0,4096);
+               if(!fgets(buf,4096,fp))
+               {
+                       gr->SetWarn(mglWarnOpen,(std::string(a[2].s.s)+" - line "+mgl_str_num(n)).c_str());
+                       fclose(fp);     delete []buf;   return res;
+               }
+               fclose(fp);
+               gr->Puts(mglPoint(a[0].v,a[1].v,NAN),buf, (k[4]=='s')?a[4].s.s:"", 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.s,"rt");
+               if(!fp)
+               {
+                       gr->SetWarn(mglWarnOpen,a[3].s.s);
+                       delete []buf;   return res;
+               }
+               for(i=0;i<n;i++)        if(!fgets(buf,4096,fp)) continue;
+               memset(buf,0,4096);
+               if(!fgets(buf,4096,fp))
+               {
+                       gr->SetWarn(mglWarnOpen,(std::string(a[3].s.s)+" - line "+mgl_str_num(n)).c_str());
+                       fclose(fp);     delete []buf;   return res;
+               }
+               fclose(fp);
+               gr->Puts(mglPoint(a[0].v,a[1].v,a[2].v),buf, (k[5]=='s')?a[5].s.s:"", k[6]=='n'?a[6].v:-1);
+       }
+       else res = 1;
+       gr->Self()->LoadState();        delete []buf;   return res;
+}
+//-----------------------------------------------------------------------------
+int static mgls_flame2d(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, "dddn")) fx->Set(mglFlame2d(*(a[1].d), *(a[2].d), mgl_int(a[3].v)));
+       else if (!strcmp(k, "ddddn") && fy)
+       {
+               mglData f(mglFlame2d(*(a[2].d), *(a[3].d), mgl_int(a[4].v)));
+               fx->Set(f.SubData(0));  fy->Set(f.SubData(1));
+       }
+       else if (!strcmp(k, "dddnn"))   fx->Set(mglFlame2d(*(a[1].d), *(a[2].d), mgl_int(a[3].v), mgl_int(a[4].v)));
+       else if (!strcmp(k, "ddddnn") && fy)
+       {
+               mglData f(mglFlame2d(*(a[2].d), *(a[3].d), mgl_int(a[4].v), mgl_int(a[5].v)));
+               fx->Set(f.SubData(0));  fy->Set(f.SubData(1));
+       }
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s, "",opt);
+       else if(!strcmp(k,"ss"))        gr->FPlot(a[0].s.s, a[1].s.s,opt);
+       else if(!strcmp(k,"sss"))       gr->FPlot(a[0].s.s, a[1].s.s, a[2].s.s, "",opt);
+       else if(!strcmp(k,"ssss"))      gr->FPlot(a[0].s.s, a[1].s.s, a[2].s.s, a[3].s.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s, "",opt);
+       else if(!strcmp(k,"ss"))        gr->FSurf(a[0].s.s, a[1].s.s,opt);
+       else if(!strcmp(k,"sss"))       gr->FSurf(a[0].s.s, a[1].s.s, a[2].s.s, "",opt);
+       else if(!strcmp(k,"ssss"))      gr->FSurf(a[0].s.s, a[1].s.s, a[2].s.s, a[3].s.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s, "B",opt);
+       else if(!strcmp(k,"ss"))gr->Grid(a[0].s.s, a[1].s.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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 static 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;
+}
+//-----------------------------------------------------------------------------
+int static mgls_ifsfile(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, "dssn")) f->Set(mglIFSfile(a[1].s.s, a[2].s.s, mgl_int(a[3].v)));
+       else if (!strcmp(k, "dssnn"))   f->Set(mglIFSfile(a[1].s.s, a[2].s.s, mgl_int(a[3].v), mgl_int(a[4].v)));
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s, 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.s, opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s);
+       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.s);
+       else res = 1;
+       gr->Self()->LoadState();        return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s,false,opt);
+       else if(!strcmp(k,"sn"))        gr->Logo(a[0].s.s,mgl_int(a[1].v),opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s);
+       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.s);
+       else res = 1;
+       gr->Self()->LoadState();        return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s);
+       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.s : 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.s : 0);
+       }
+       else res = 1;
+       gr->Self()->LoadState();        return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s);
+       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.s);
+       else res = 1;
+       gr->Self()->LoadState();        return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s);
+       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.s);
+       else res = 1;
+       gr->Self()->LoadState();        return res;
+}
+//-----------------------------------------------------------------------------
+int static mgls_symbol(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->Symbol(mglPoint(a[0].v,a[1].v,NAN),a[2].s[0]);
+               else if(!strcmp(k,"nnss"))      gr->Symbol(mglPoint(a[0].v,a[1].v,NAN),a[2].s[0], a[3].s.s);
+               else if(!strcmp(k,"nnssn"))     gr->Symbol(mglPoint(a[0].v,a[1].v,NAN),a[2].s[0], a[3].s.s,a[4].v);
+               else if(!strcmp(k,"nnns"))      gr->Symbol(mglPoint(a[0].v,a[1].v,a[2].v),a[3].s[0]);
+               else if(!strcmp(k,"nnnss"))     gr->Symbol(mglPoint(a[0].v,a[1].v,a[2].v),a[3].s[0], a[4].s.s);
+               else if(!strcmp(k,"nnnssn"))gr->Symbol(mglPoint(a[0].v,a[1].v,a[2].v),a[3].s[0], a[4].s.s,a[5].v);
+               else if(!strcmp(k,"nnnns"))             gr->Symbol(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v), a[4].s[0]);
+               else if(!strcmp(k,"nnnnss"))    gr->Symbol(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v), a[4].s[0], a[5].s.s);
+               else if(!strcmp(k,"nnnnssn"))   gr->Symbol(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v), a[4].s[0], a[5].s.s,a[6].v);
+               else if(!strcmp(k,"nnnnnns"))   gr->Symbol(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v), a[6].s[0]);
+               else if(!strcmp(k,"nnnnnnss"))  gr->Symbol(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v), a[6].s[0], a[7].s.s);
+               else if(!strcmp(k,"nnnnnnssn")) gr->Symbol(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v), a[6].s[0], a[7].s.s,a[8].v);
+               else    res=1;
+               gr->Self()->LoadState();
+       }
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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].s.w);
+               else if(!strcmp(k,"nnss"))      gr->Putsw(mglPoint(a[0].v,a[1].v,NAN),a[2].s.w, a[3].s.s);
+               else if(!strcmp(k,"nnssn"))     gr->Putsw(mglPoint(a[0].v,a[1].v,NAN),a[2].s.w, a[3].s.s,a[4].v);
+               else if(!strcmp(k,"nnns"))              gr->Putsw(mglPoint(a[0].v,a[1].v,a[2].v),a[3].s.w);
+               else if(!strcmp(k,"nnnss"))             gr->Putsw(mglPoint(a[0].v,a[1].v,a[2].v),a[3].s.w, a[4].s.s);
+               else if(!strcmp(k,"nnnssn"))    gr->Putsw(mglPoint(a[0].v,a[1].v,a[2].v),a[3].s.w, a[4].s.s,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].s.w);
+               else if(!strcmp(k,"nnnnss"))    gr->Putsw(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v), a[4].s.w, a[5].s.s);
+               else if(!strcmp(k,"nnnnssn"))   gr->Putsw(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v), a[4].s.w, a[5].s.s,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].s.w);
+               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].s.w, a[7].s.s);
+               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].s.w, a[7].s.s,a[8].v);
+               else    res=1;
+               gr->Self()->LoadState();
+       }
+       else if(!strcmp(k,"ds"))        gr->Text(*(a[0].d),a[1].s.w,"",opt);
+       else if(!strcmp(k,"dss"))       gr->Text(*(a[0].d),a[1].s.w,a[2].s.s,opt);
+       else if(!strcmp(k,"dds"))       gr->Text(*(a[0].d),*(a[1].d),a[2].s.w,"",opt);
+       else if(!strcmp(k,"ddss"))      gr->Text(*(a[0].d),*(a[1].d),a[2].s.w,a[3].s.s,opt);
+       else if(!strcmp(k,"ddds"))      gr->Text(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.w,"",opt);
+       else if(!strcmp(k,"dddss"))     gr->Text(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.w,a[4].s.s,opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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].s.w);
+       else if(!strcmp(k,"ss"))        gr->Title(a[0].s.w, a[1].s.s);
+       else if(!strcmp(k,"ssn"))       gr->Title(a[0].s.w, a[1].s.s,a[2].v);
+       else res = 1;
+       gr->Self()->LoadState();        return res;
+}
+//-----------------------------------------------------------------------------
+int static 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].s.w, 1, opt);
+       else if(!strcmp(k,"sn"))        gr->Label('t', a[0].s.w, a[1].v, opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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].s.w, 1, opt);
+       else if(!strcmp(k,"sn"))        gr->Label('x', a[0].s.w, a[1].v, opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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].s.w, 1, opt);
+       else if(!strcmp(k,"sn"))        gr->Label('y', a[0].s.w, a[1].v, opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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].s.w, 1, opt);
+       else if(!strcmp(k,"sn"))        gr->Label('z', a[0].s.w, a[1].v, opt);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+mglCommand mgls_prm_cmd[] = {
+       {"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},
+       {"axis",_("Setup or draw axis"),"axis ['dir' 'fmt']|'fx' 'fy' 'fz' ['fc']|how", mgls_axis ,12},
+       {"background",_("Load image for background"),"background 'fname' [alpha]", mgls_background ,12},
+       {"ball",_("Draw point (ball)"),"ball posx posy ['fmt']|posx posy posz ['fmt']", mgls_ball ,13},
+       {"box",_("Draw bounding box"),"box ['fmt' ticks]", mgls_box ,12},
+       {"circle",_("Draw circle"),"circle x y r ['fmt']|x y z r ['fmt']", mgls_circle ,13},
+       {"colorbar",_("Draw colorbar"),"colorbar ['fmt']|Vdat ['fmt']|'sch' x y [w h]|Vdat 'sch' x y [w h]", mgls_colorbar ,12},
+       {"cone",_("Draw cone"),"cone x1 y1 z1 x2 y2 z2 r1 [r2 'fmt' edge]", mgls_cone ,13},
+       {"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},
+       {"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},
+       {"ellipse",_("Draw ellipse"),"ellipse x1 y1 x2 y2 r ['fmt']|x1 y1 z1 x2 y2 z2 r ['fmt']", mgls_ellipse ,13},
+       {"errbox",_("Draw error box"),"errbox x y ex ey ['fmt']|x y z ex ey ez ['fmt']", mgls_errbox ,13},
+       {"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},
+       {"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},
+       {"fgets",_("Print string from file"),"fgets x y z 'fname' [pos 'fmt' size]|x y z 'fname' [pos 'fmt' size]", mgls_fgets ,15},
+       {"flame2d",_("Computes the flame fractal"), "flame2d F A B n [skip]|Fx Fy A B n [skip]", mgls_flame2d, 4},
+       {"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},
+       {"grid",_("Draw grid"),"grid ['dir' 'fmt']", mgls_grid ,12},
+       {"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},
+       {"ifsfile",_("Computes the attractor of an IFS with parameters from *.ifs file"), "ifsfile F 'fname' 'name' n [skip]", mgls_ifsfile, 4},
+       {"legend",_("Draw legend"),"legend [pos 'fmt']|x y ['fmt']", mgls_legend ,15},
+       {"line",_("Draw line"),"line x1 y1 x2 y2 ['fmt']|x1 y1 z1 x2 y2 z2 ['fmt']", mgls_line ,13},
+       {"logo",_("Draw bitmap (logo) along axis range"),"logo 'fname' [smooth]", mgls_logo ,13},
+       {"polygon",_("Draw polygon"),"polygon x1 y1 x2 y2 num ['fmt']|x1 y1 z1 x2 y2 z2 num ['fmt']", mgls_polygon ,13},
+       {"rect",_("Draw rectangle"),"rect x1 y1 x2 y2 ['fmt']|x1 y1 z1 x2 y2 z2 ['fmt']", mgls_rect ,13},
+       {"rhomb",_("Draw rhombus"),"rhomb x1 y1 x2 y2 r ['fmt']|x1 y1 z1 x2 y2 z2 r ['fmt']", mgls_rhomb ,13},
+       {"sphere",_("Draw sphere"),"sphere x0 y0 r ['fmt']|x0 y0 z0 r ['fmt']", mgls_sphere ,13},
+       {"symbol",_("Draw user-defined symbol at given position and direction"),"symbol x y 'id' ['fmt' size]|x y z 'id' ['fmt' size]|x y dx dy 'id' ['fmt' size]|x y z dx dy dz 'id' ['fmt' size]", mgls_symbol ,15},
+       {"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']|Xdat Ydat 'txt' ['font']|Xdat Ydat Zdat 'txt' ['font']", mgls_text ,15},
+       {"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},
+       {"xlabel",_("Draw label for x-axis"),"xlabel 'txt' [pos]", mgls_xlabel ,12},
+       {"ylabel",_("Draw label for y-axis"),"ylabel 'txt' [pos]", mgls_ylabel,12},
+       {"zlabel",_("Draw label for z-axis"),"zlabel 'txt' [pos]", mgls_zlabel,12},
+{"","","",NULL,0}};
+//-----------------------------------------------------------------------------
diff --git a/src/exec_set.cpp b/src/exec_set.cpp
new file mode 100644 (file)
index 0000000..b6c23c3
--- /dev/null
@@ -0,0 +1,849 @@
+/***************************************************************************
+ * exec_set.cpp is part of Math Graphic Library
+ * 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       *
+ *   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"
+//#pragma GCC diagnostic ignored "-Wmisleading-indentation"
+wchar_t *mgl_str_copy(const char *s);
+//-----------------------------------------------------------------------------
+int static mgls_addlegend(mglGraph *gr, long , mglArg *a, const char *k, const char *)
+{
+       int res=0;
+       if(!strcmp(k,"ss"))     gr->AddLegend(a[0].s.w,a[1].s.s);
+       else    res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static mgls_addsymbol(mglGraph *gr, long , mglArg *a, const char *k, const char *)
+{
+       int res=0;
+       if(!strcmp(k,"sdd"))    gr->DefineSymbol(a[0].s[0],*(a[1].d),*(a[2].d));
+       else    res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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 static 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 static 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 static 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 static 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 static 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 static 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.s);
+       else if(!strcmp(k,"ss"))        gr->SetAxisStl(a[0].s.s, a[1].s.s);
+       else if(!strcmp(k,"sss"))       gr->SetAxisStl(a[0].s.s, a[1].s.s, a[2].s.s);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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 static mgls_bbox(mglGraph *gr, long , mglArg *a, const char *k, const char *)
+{
+       int res=0;
+       if(!strcmp(k,"nn") && a[1].v>=0 && a[0].v>=0)
+               gr->SetBBox(mgl_int(a[0].v), mgl_int(a[1].v));
+       else if(!strcmp(k,"nnnn"))
+               gr->SetBBox(mgl_int(a[0].v), mgl_int(a[1].v), mgl_int(a[2].v), mgl_int(a[3].v));
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static mgls_chdir(mglGraph *gr, long , mglArg *a, const char *k, const char *)
+{
+       int res=0;
+       if(!strcmp(k,"s"))
+       {       if(chdir(a[0].s.s))     gr->SetWarn(mglWarnFile,"chdir");       }
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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 static 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.s);
+       else if(!strcmp(k,"nnn"))       gr->Clf(a[0].v,a[1].v,a[2].v);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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 static 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 static mgls_ctick(mglGraph *gr, long , mglArg *a, const char *k, const char *)
+{
+       int res=0;
+       if(!strcmp(k,"s"))      gr->SetTickTempl('c',a[0].s.w);
+       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].s.w);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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 static 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 static 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 static 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 static mgls_font(mglGraph *gr, long , mglArg *a, const char *k, const char *)
+{
+       int res=0;
+       if(!strcmp(k,"s"))      gr->SetFontDef(a[0].s.s);
+       else if(!strcmp(k,"sn"))
+       {       gr->SetFontDef(a[0].s.s);       gr->SetFontSize(a[1].v);        }
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static mgls_gray(mglGraph *gr, long , mglArg *a, const char *k, const char *)
+{
+       int res=0;
+       if(k[0]==0)     gr->Gray(true);
+       else if(!strcmp(k,"n")) gr->Gray(a[0].v!=0);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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 static 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 static 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 static 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.s[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.s[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.s[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.s[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.s[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.s[0],a[8].v,a[9].v);
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static mgls_load(mglGraph *gr, long , mglArg *a, const char *k, const char *)
+{
+       int res=0;
+       if(!strcmp(k,"s") && gr->pr)    mgl_parser_load(gr->pr, a[0].s.s);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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 static 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.s);
+       else if(!strcmp(k,"n"))         gr->SetMaskAngle(mgl_int(a[0].v));
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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 static 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.s);
+       else if(!strcmp(k,"nnnnnsnn"))
+               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.s, a[6].v,a[7].v);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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 static 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 static mgls_palette(mglGraph *gr, long , mglArg *a, const char *k, const char *)
+{
+       int res=0;
+       if(!strcmp(k,"s"))      gr->SetPalette(a[0].s.s);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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 static 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 static mgls_plotid(mglGraph *gr, long , mglArg *a, const char *k, const char *)
+{
+       int res=0;
+       if(!strcmp(k,"s"))      gr->SetPlotId(a[1].s.s);
+       else  res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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 static 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 static mgls_rasterize(mglGraph *gr, long , mglArg *, const char *, const char *)
+{
+       gr->Rasterize();        return 0;
+}
+//-----------------------------------------------------------------------------
+int static 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 static 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 static 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 static mgls_scaletext(mglGraph *gr, long , mglArg *a, const char *k, const char *)
+{
+       int res=0;
+       if(!strcmp(k,"n"))      gr->SetScaleText(a[0].v!=0);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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 static mgls_setsizescl(mglGraph *gr, long , mglArg *a, const char *k, const char *)
+{
+       int res=0;
+       if(!strcmp(k,"n"))      gr->SetSizeScl(a[0].v);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static mgls_setup(mglGraph *gr, long , mglArg *a, const char *k, const char *)
+{
+       int res=0;
+       if(!strcmp(k,"nn"))     gr->SetFlagAdv(mgl_int(a[0].v), mgl_int(a[1].v));
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static mgls_shear(mglGraph *gr, long , mglArg *a, const char *k, const char *)
+{
+       int res=0;
+       if(!strcmp(k,"nn"))     gr->Shear(a[0].v, a[1].v);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static mgls_shearplot(mglGraph *gr, long , mglArg *a, const char *k, const char *)
+{
+       int res=0;
+       if(!strcmp(k,"nnnn"))   gr->ShearPlot(mgl_int(a[0].v), mgl_int(a[1].v), a[2].v, a[3].v);
+       else if(!strcmp(k,"nnnnnn"))    gr->ShearPlot(mgl_int(a[0].v), mgl_int(a[1].v), a[2].v, a[3].v, a[4].v, a[5].v);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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 static 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.s);
+       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.s, a[4].v,a[5].v);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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 static 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 static 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 static 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.s);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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 static 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 static mgls_variant(mglGraph *gr, long , mglArg *a, const char *k, const char *)
+{
+       int res=0;
+       if(!strcmp(k,"n") && gr->pr)    mgl_parser_variant(gr->pr, a[0].v);
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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.s)?1:0;
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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 static 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.s, "MathGL");
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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 static 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].s.w);
+       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].s.w);
+       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].s.w);
+       else if(!strcmp(k,"s"))         gr->SetTickTempl('x',a[0].s.w);
+       else if(!strcmp(k,"ds"))        gr->SetTicksVal('x', *(a[0].d), a[1].s.w);
+       else if(!strcmp(k,"dsn"))       gr->SetTicksVal('x', *(a[0].d), a[1].s.w, a[2].v);
+       else if(!strncmp(k,"ns",2))
+       {
+               std::wstring s;
+               std::vector<mreal> v;
+               for(long i=0;i<n/2;i++)
+               {
+                       if(a[2*i].type==2 && a[2*i+1].type==1)
+                       {       v.push_back(a[2*i].v);  s += std::wstring(a[2*i+1].s.w)+L"\n";  }
+                       else    break;
+               }
+               gr->SetTicksVal('x',mglDataS(v),s.c_str(),v.size()==1?true:false);
+       }
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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 static 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].s.w);
+       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].s.w);
+       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].s.w);
+       else if(!strcmp(k,"s"))         gr->SetTickTempl('y',a[0].s.w);
+       else if(!strcmp(k,"ds"))        gr->SetTicksVal('y', *(a[0].d), a[1].s.w);
+       else if(!strcmp(k,"dsn"))       gr->SetTicksVal('y', *(a[0].d), a[1].s.w, a[2].v);
+       else if(!strncmp(k,"ns",2))
+       {
+               std::wstring s;
+               std::vector<mreal> v;
+               for(long i=0;i<n/2;i++)
+               {
+                       if(a[2*i].type==2 && a[2*i+1].type==1)
+                       {       v.push_back(a[2*i].v);  s += std::wstring(a[2*i+1].s.w)+L"\n";  }
+                       else    break;
+               }
+               gr->SetTicksVal('y',mglDataS(v),s.c_str(),v.size()==1?true:false);
+       }
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+int static 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 static 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 static 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 static 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].s.w);
+       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].s.w);
+       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].s.w);
+       else if(!strcmp(k,"s"))         gr->SetTickTempl('z',a[0].s.w);
+       else if(!strcmp(k,"ds"))        gr->SetTicksVal('z', *(a[0].d), a[1].s.w);
+       else if(!strcmp(k,"dsn"))       gr->SetTicksVal('z', *(a[0].d), a[1].s.w, a[2].v);
+       else if(!strncmp(k,"ns",2))
+       {
+               std::wstring s;
+               std::vector<mreal> v;
+               for(long i=0;i<n/2;i++)
+               {
+                       if(a[2*i].type==2 && a[2*i+1].type==1)
+                       {       v.push_back(a[2*i].v);  s += std::wstring(a[2*i+1].s.w)+L"\n";  }
+                       else    break;
+               }
+               gr->SetTicksVal('z',mglDataS(v),s.c_str(),v.size()==1?true:false);
+       }
+       else res = 1;
+       return res;
+}
+//-----------------------------------------------------------------------------
+mglCommand mgls_set_cmd[] = {
+       {"addlegend",_("Add legend entry"),"addlegend 'txt' 'fmt'", mgls_addlegend,15},
+       {"addsymbol",_("Add user-defined symbol"),"addsymbol 'id' Xdat Ydat", mgls_addsymbol,15},
+       {"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},
+       {"arrowsize",_("Set size of arrows"),"arrowsize val", mgls_arrowsize ,2},
+       {"aspect",_("Set aspect ration"),"aspect valx valy [valz]", mgls_aspect ,5},
+       {"attachlight",_("Attach light settings to inplot"),"attachlight val", mgls_attachlight ,2},
+       {"axisstl",_("Set axis and tick style"),"axisstl 'stl' ['tick' 'sub']", mgls_axisstl ,14},
+       {"barwidth",_("Set default bars width"),"barwidth val", mgls_barwidth ,2},
+       {"bbox",_("Set bounding box for 2d export"),"bbox x1 y1 [x2 y2]", mgls_bbox ,2},
+       {"chdir",_("Change current directory"),"chdir 'path'", mgls_chdir ,2},
+       {"clearlegend",_("Clear legend entries"),"clearlegend", mgls_clearlegend ,15},
+       {"clf",_("Clear picture"),"clf|'col'|r g b", mgls_clf ,12},
+       {"columnplot",_("Set position of plot inside cell of column"), "columnplot num ind [d]", mgls_columnplot ,5},
+       {"crange",_("Set color range"),"crange Dat [add]|c1 c2 [add]", mgls_crange ,14},
+       {"ctick",_("Set ticks for colorbar"),"ctick 'tmpl'|dc ['factor']", mgls_ctick ,14},
+       {"cut",_("Setup plot points cutting"),"cut val|x1 y1 z1 x2 y2 z2|'cond'", mgls_cut ,2},
+       {"diffuse",_("Set diffusive light brightness"),"diffuse val", mgls_diffuse ,2},
+       {"drawreg",_("Set draw region for quality&4"),"drawreg|nx ny m", mgls_drawreg ,2},
+       {"facenum",_("Set number of visible faces"),"facenum val", mgls_facenum ,2},
+       {"fog",_("Switch on/off fog"),"fog val [dz]", mgls_fog ,2},
+       {"font",_("Setup font"),"font 'fmt' [size]", mgls_font ,15},
+       {"gray",_("Switch on/off gray-scale mode"),"gray [val]", mgls_gray ,2},
+       {"gridplot",_("Set position of plot inside cell of matrix"), "gridplot nx ny ind [d]", mgls_gridplot ,5},
+       {"inplot",_("Set arbitrary position of plot in picture"),"x1 x2 y1 y2 [rel]", mgls_inplot ,5},
+       {"legendmarks",_("Set number of marks in the legend"),"legendmarks val", mgls_legendmarks ,15},
+       {"light",_("Setup light"),"light [val]|num val|num xpos ypos zpos ['fmt' br ap]|num xpos ypos zpos px py pz ['fmt' br ap]", mgls_light ,2},
+       {"load",_("Load commands from external DLL"),"load 'fname'", mgls_load, 6},
+       {"loadfont",_("Load fontfaces"),"loadfont ['face']", mgls_loadfont ,15},
+       {"marksize",_("Set size of markers"),"marksize val", mgls_marksize ,2},
+       {"mask",_("Set brush for given mask id"),"mask 'id' 'val'|'id' val|angle", mgls_mask ,2},
+       {"meshnum",_("Set number of lines in mesh/fall/vect and so on"),"meshnum val", mgls_meshnum ,2},
+       {"multiplot",_("Set position of plot block in matrix"),"multiplot m n pos dx dy 'style' [sx sy]", mgls_multiplot ,5},
+       {"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},
+       {"pendelta",_("Set size of semi-transparent area around line"),"pendelta val", mgls_pendelta ,2},
+       {"perspective",_("Set perspective"),"perspective val", mgls_perspective ,2},
+       {"plotid",_("Set default filename"),"plotid 'name'", mgls_plotid ,2},
+       {"quality",_("Set plot quality"),"quality [val]", mgls_quality ,2},
+       {"ranges",_("Set axis ranges"),"ranges x1 x2 y1 y2 [z1 z2]|Xdat Ydat [Zdat Cdat]", mgls_ranges ,14},
+       {"rasterize",_("Rasterize plot and save to background"),"rasterize", mgls_rasterize ,12},
+       {"reset",_("Reset settings and clear picture"),"reset", mgls_reset ,12},
+       {"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},
+       {"scaletext",_("Set scale text in relative subplots too"),"scaletext val", mgls_scaletext ,15},
+       {"setsize",_("Set picture size"),"setsize width height", mgls_setsize ,2},
+       {"setsizescl",_("Set scaling factor for further setsize"),"setsizescl val", mgls_setsizescl ,2},
+       {"setup",_("Set bit-flags (for advanced users only)"),"setup val flag", mgls_setup ,2},
+       {"shear",_("Shear plot"),"shear valx valy", mgls_shear ,5},
+       {"shearplot",_("Set position of plot inside cell of sheared stick"), "shearplot num ind sx sy [xd yd]", mgls_shearplot ,5},
+       {"stickplot",_("Set position of plot inside cell of rotated stick"), "stickplot num ind tet phi", mgls_stickplot ,5},
+       {"subplot",_("Set position of plot as cell of matrix"),"subplot m n pos ['style' dx dy]", mgls_subplot ,5},
+       {"ternary",_("Switch on/off to use ternary axis"),"ternary val", mgls_ternary ,14},
+       {"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},
+       {"transptype",_("Set type transparency"),"transptype val", mgls_transptype ,2},
+       {"tuneticks",_("Set ticks tuning"),"tuneticks val [pos]", mgls_tuneticks ,14},
+       {"variant",_("Select variant of plot style(s)"),"variant var", mgls_variant, 6},
+       {"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},
+       {"write",_("Write current image to graphical file"),"write ['fname']", mgls_write ,2},
+       {"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},
+       {"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},
+       {"zoom",_("Zoom plot region"),"zoom x1 x2 y1 y2", mgls_zoom,5},
+       {"zoomaxis",_("Zoom axis range"),"zoomaxis x1 x2|x1 y1 x2 y2|x1 y1 z1 x2 y2 z2|x1 y1 z1 c1 x2 y2 z2 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 9125501b519281e4de3683a0b257ec57ba81a135..f26fb9456da6ff1396e51fde668df942ecc4600b 100644 (file)
@@ -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;
@@ -616,33 +611,39 @@ void MGL_EXPORT mgl_write_frame_(uintptr_t *gr, const char *fname,const char *de
 #endif
 void MGL_EXPORT mgl_show_image(HMGL gr, const char *viewer, int keep)
 {
-       char fname[128], *cmd = new char [128];
-       snprintf(fname,128,"%s.png", tmpnam(NULL));     fname[127]=0;
+       static size_t counter=size_t(0xffffffff*mgl_rnd());
+       char *fname = new char[256], *cmd = new char [288];
+#if defined(_MSC_VER)
+       snprintf(fname,128,"%s.png", tmpnam(NULL));
+#else
+       snprintf(fname,256,"%s/mathgl%lu.png", P_tmpdir, counter);
+#endif
+       fname[255]=0;   counter++;
        mgl_write_png_solid(gr,fname,"MathGL ShowImage file");
        if(!viewer || !viewer[0])
                viewer = MGL_DEF_VIEWER;
 #ifdef WIN32
                if(keep)
                {
-                       snprintf(cmd,128,"%s %s &", viewer,fname);      cmd[127]=0;
-                       if(system(cmd)==-1)     printf("Error to call external viewer\n");
+                       snprintf(cmd,288,"%s %s &", viewer,fname);      cmd[287]=0;
+                       if(system(cmd)==-1)     printf(_("Error to call external viewer\n"));
                        Sleep(2000);
-                       snprintf(cmd,128,"del %s", fname);
+                       snprintf(cmd,288,"del %s", fname);
                }
-               else    snprintf(cmd,128,"%s %s; del %s", viewer,fname,fname);
+               else    snprintf(cmd,288,"%s %s; del %s", viewer,fname,fname);
 #else
                if(keep)
                {
-                       snprintf(cmd,128,"%s %s &", viewer,fname);      cmd[127]=0;
-                       if(system(cmd)==-1)     printf("Error to call external viewer\n");
+                       snprintf(cmd,288,"%s %s &", viewer,fname);      cmd[287]=0;
+                       if(system(cmd)==-1)     printf(_("Error to call external viewer\n"));
                        sleep(2);
-                       snprintf(cmd,128,"rm %s", fname);
+                       snprintf(cmd,288,"rm %s", fname);
                }
-               else    snprintf(cmd,128,"%s %s; rm %s", viewer,fname,fname);
+               else    snprintf(cmd,288,"%s %s; rm %s", viewer,fname,fname);
 #endif
-               cmd[127] = 0;
-               if(system(cmd)==-1)     printf("Error to call external viewer\n");
-               delete []cmd;
+               cmd[287] = 0;
+               if(system(cmd)==-1)     printf(_("Error to call external viewer\n"));
+               delete []cmd;   delete []fname;
 }
 void MGL_EXPORT mgl_show_image_(uintptr_t *gr, const char *viewer, int *keep, int l)
 {      char *s=new char[l+1];  memcpy(s,viewer,l);     s[l]=0;
index ce368a3c7f63c076b63f24df03fcf533664f38bc..555cb36b1ff04c12466e3ff5839fb5c8c6491228 100644 (file)
@@ -28,9 +28,8 @@
 #define _Gr_   ((mglCanvas *)(gr))
 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 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;
@@ -41,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();
 }
 //-----------------------------------------------------------------------------
@@ -60,7 +58,7 @@ bool MGL_LOCAL_PURE mgl_is_same(HMGL gr, long i, mreal wp,uint32_t cp, int st)
        return (cp==_Gr_->GetPrmCol(i));
 }
 //-----------------------------------------------------------------------------
-std::vector<long> MGL_NO_EXPORT put_line(HMGL gr, long i, mreal wp, uint32_t cp,int st)
+std::vector<long> static put_line(HMGL gr, long i, mreal wp, uint32_t cp,int st)
 {
        std::vector<long> ids;
        long n1=gr->GetPrm(i).n1, n2=gr->GetPrm(i).n2;
@@ -124,20 +122,19 @@ std::vector<long> MGL_NO_EXPORT put_line(HMGL gr, long i, mreal wp, uint32_t cp,
 //-----------------------------------------------------------------------------
 //put_desc(fp,"%c%c%c_%04x {", "np %d %d mt %d %d ll %d %d ll cp fill\n",
 //"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)
+void static 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
@@ -175,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;
@@ -185,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");
@@ -207,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;       }
@@ -246,7 +254,7 @@ void MGL_EXPORT mgl_write_eps(HMGL gr, const char *fname,const char *descr)
        if(m_P) mgl_printf(fp, gz, "/m_P {m_p 0 sm rm m_s} def\n");
        if(m_X) mgl_printf(fp, gz, "/m_X {m_x ss sm rm m_s} def\n");
        //      if(m_C) mgl_printf(fp, gz, "/m_C {m_c m_o} def\n");
-       mgl_printf(fp, gz, "1 setlinecap\n1 setlinejoin\n\n");  // manual setting round line cap
+       mgl_printf(fp, gz, "0 setlinecap\n1 setlinejoin\n\n");  // manual setting round line cap
 
        // Write background image first
        const unsigned char *img = mgl_get_background(gr);
@@ -256,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");
@@ -275,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
@@ -287,7 +296,8 @@ void MGL_EXPORT mgl_write_eps(HMGL gr, const char *fname,const char *descr)
                if(q.type==0)   // mark
                {
                        mreal x0 = p1.x,y0 = p1.y;
-                       snprintf(str,256,"%.2g lw %.2g %.2g %.2g rgb ", 50*q.s*q.w>1?50*q.s*q.w:1, cp.r[0]/255.,cp.r[1]/255.,cp.r[2]/255.);
+//                     snprintf(str,256,"%.2g lw %.2g %.2g %.2g rgb ", 50*q.s*q.w>1?50*q.s*q.w:1, cp.r[0]/255.,cp.r[1]/255.,cp.r[2]/255.);
+                       snprintf(str,256,"%.2g lw %.2g %.2g %.2g rgb ", q.w>1?q.w:1, cp.r[0]/255.,cp.r[1]/255.,cp.r[2]/255.);
                        str[255]=0;     wp=1;   // NOTE: this may renew line style if a mark inside!
                        if(q.s!=qs_old)
                        {
@@ -325,12 +335,14 @@ void MGL_EXPORT mgl_write_eps(HMGL gr, const char *fname,const char *descr)
                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
                {
@@ -340,7 +352,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,' ');
@@ -368,7 +380,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;
@@ -391,11 +403,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);
@@ -432,14 +448,14 @@ void MGL_EXPORT mgl_write_svg(HMGL gr, const char *fname,const char *descr)
 
 
        // currentColor -> inherit ???
-       mgl_printf(fp, gz, "<g fill=\"none\" stroke=\"none\" stroke-width=\"0.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n");
+       mgl_printf(fp, gz, "<g fill=\"none\" stroke=\"none\" stroke-width=\"0.5\" stroke-linecap=\"butt\" 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
@@ -447,13 +463,14 @@ 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))
                                mgl_printf(fp, gz, "<g fill=\"#%02x%02x%02x\">\n", int(cp.r[0]),int(cp.r[1]),int(cp.r[2]));
                        else
-                               mgl_printf(fp, gz, "<g stroke=\"#%02x%02x%02x\"  stroke-width=\"%g\">\n", int(cp.r[0]),int(cp.r[1]),int(cp.r[2]), 50*q.s*q.w>1?50*q.s*q.w:1);
+                               mgl_printf(fp, gz, "<g stroke=\"#%02x%02x%02x\"  stroke-width=\"%g\">\n", int(cp.r[0]),int(cp.r[1]),int(cp.r[2]), q.w>1?q.w:1);
+//                             mgl_printf(fp, gz, "<g stroke=\"#%02x%02x%02x\"  stroke-width=\"%g\">\n", int(cp.r[0]),int(cp.r[1]),int(cp.r[2]), 50*q.s*q.w>1?50*q.s*q.w:1);
                        switch(q.n4)
                        {
                        case 'P':
@@ -509,7 +526,8 @@ void MGL_EXPORT mgl_write_svg(HMGL gr, const char *fname,const char *descr)
                        if(q.n3)
                        {
                                mgl_printf(fp, gz, " stroke-dasharray=\"%s\"", mgl_get_dash(q.n3,q.w,','));
-                               mgl_printf(fp, gz, " stroke-dashoffset=\"%g\"", q.s*q.w);
+//                             mgl_printf(fp, gz, " stroke-dashoffset=\"%g\"", q.s*q.w);
+                               mgl_printf(fp, gz, " stroke-dashoffset=\"%g\"", q.w);
                        }
                        if(q.w>1)       mgl_printf(fp, gz, " stroke-width=\"%g\"", q.w);
                        wp = q.w>1  ? q.w:1;    st = q.n3;
@@ -517,8 +535,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");
                }
@@ -526,13 +543,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)
                {
@@ -541,7 +558,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
@@ -552,7 +569,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
@@ -562,7 +579,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);     }
@@ -578,9 +595,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");
@@ -674,7 +691,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
@@ -683,7 +700,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 e9cdf3d85ffb23ad676b953f219cb64581ad88da..58360e97f92e33c2a1704662a071b00d498eb112 100644 (file)
@@ -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,14 +634,14 @@ 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
        for(size_t i=0;i<Pnt.size();i++)\r
        {\r
                const mglPnt &q=Pnt[i];\r
-               fprintf(fp,"%.4g\t%.4g\t%.4g\t%.4g\t%.4g\t%.4g\t%.4g\t%.4g\t%.4g\t%.4g\t%.4g\t%.4g\t%.4g\n", q.xx, q.yy, q.zz, q.c, q.t, q.ta, q.u, q.v, q.w, q.r, q.g, q.b, q.a);\r
+               fprintf(fp,"%.4g\t%.4g\t%.4g\t%.4g\t%.4g\t%.4g\t%.4g\t%.4g\t%.4g\t%.4g\t%.4g\t%.4g\t%.4g\n", q.xx, q.yy, q.zz, q.c, q.ta, q.ta, q.u, q.v, q.w, q.r, q.g, q.b, q.a);\r
        }\r
        fprintf(fp,"# Primitives: type n1 n2 n3 n4 id s w p\n");\r
        for(size_t i=0;i<Prm.size();i++)\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
@@ -710,11 +710,11 @@ bool mglCanvas::ImportMGLD(const char *fname, bool add)
 #pragma omp critical\r
        {\r
                Pnt.reserve(n); Prm.reserve(m); Txt.reserve(l); Glf.reserve(k);\r
-               mglPnt p;\r
+               mglPnt p;       float tmp;\r
                for(unsigned long i=0;i<n;i++)\r
                {\r
                        do {    if(!fgets(buf,512,fp))  *buf=0; mgl_strtrim(buf);       } while(*buf=='#');\r
-                       sscanf(buf,"%g%g%g%g%g%g%g%g%g%g%g%g%g", &p.xx, &p.yy, &p.zz, &p.c, &p.t, &p.ta, &p.u, &p.v, &p.w, &p.r, &p.g, &p.b, &p.a);\r
+                       sscanf(buf,"%g%g%g%g%g%g%g%g%g%g%g%g%g", &p.xx, &p.yy, &p.zz, &p.c, &tmp, &p.ta, &p.u, &p.v, &p.w, &p.r, &p.g, &p.b, &p.a);\r
                        // rescale to current image size\r
                        p.xx *= Width/double(w);        p.yy *= Height/double(h);       p.zz *= Depth/double(d);\r
                        Pnt.push_back(p);\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
@@ -1017,30 +1016,39 @@ void MGL_EXPORT mgl_write_xgl_(uintptr_t *gr, const char *fname,const char *desc
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_x3d_mdef(HMGL gr, void *fp, bool gz)\r
 {\r
-       bool m_p=false,m_x=false,m_d=false,m_v=false,m_t=false,\r
+/*     bool m_p=false,m_x=false,m_d=false,m_v=false,m_t=false,\r
        m_s=false,m_a=false,m_o=false,m_T=false,\r
        m_V=false,m_S=false,m_D=false,m_Y=false,m_l=false,\r
        m_L=false,m_r=false,m_R=false,m_X=false,m_P=false;\r
        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
        if(m_p) mgl_printf(fp, gz, "<ProtoDeclare name='m_p'><ProtoInterface/>\n<ProtoBody>"\r
                "<LineSet vertexCount='0,1,2,3'>\n<Coordinate point='-1 0 0, 1 0 0, 0 -1 0, 0 1 0'/>"\r
-               "\n</LineSet></ProtoBody></ProtoDeclare>\n");\r
+               "\n</LineSet></ProtoBody></ProtoDeclare>\n");*/\r
        /*if(m_x)       mgl_printf(fp, gz, "/m_x {sm sm rm s2 s2 rl 0 sm 2 mul rm sm 2 mul s2 rl d0} def\n");   // TODO\r
         *      if(m_s) mgl_printf(fp, gz, "/m_s {sm sm rm 0 s2 rl s2 0 rl 0 sm 2 mul rl cp d0} def\n");\r
         *      if(m_d) mgl_printf(fp, gz, "/m_d {sm 0 rm ss ss rl ss sm rl sm sm rl cp d0} def\n");\r
@@ -1060,7 +1068,7 @@ void MGL_EXPORT mgl_x3d_mdef(HMGL gr, void *fp, bool gz)
         *      if(m_P) mgl_printf(fp, gz, "/m_P {m_p 0 sm rm m_s} def\n");\r
         *      if(m_X) mgl_printf(fp, gz, "/m_X {m_x ss sm rm m_s} def\n");*/\r
        //      if(m_C) mgl_printf(fp, gz, "/m_C {m_c m_o} def\n");\r
-       mgl_printf(fp, gz, "\n");\r
+//     mgl_printf(fp, gz, "\n");\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_x3d_prim(const mglPrim &q, const mglPnt &p, const long *pnt, void *fp,bool gz, mreal size)\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
@@ -1187,7 +1195,7 @@ void MGL_EXPORT mgl_write_x3d(HMGL gr, const char *fname,const char *descr)
        delete []ng;\r
 \r
        // primitive definition in groups\r
-       long npnt = gr->GetPntNum(), k;\r
+       long npnt = gr->GetPntNum();\r
        long *pnt=new long[npnt];\r
        mglPrim q;\r
        for(size_t i=0;i<gr->Grp.size();i++)\r
@@ -1196,7 +1204,7 @@ void MGL_EXPORT mgl_write_x3d(HMGL gr, const char *fname,const char *descr)
                std::vector<long> &p = gr->Grp[i].p;\r
 \r
                // define coordinates, colors and so on\r
-               long line=-1, face=-1, other=-1;        k=0;\r
+               long line=-1, face=-1, other=-1;\r
                for(size_t j=0;j<p.size();j++)  // find points for this group\r
                {\r
                        const mglPrim &q=gr->GetPrm(p[j],false);\r
index e05ec0e2b9a67e07569b83f34c272ee03c25fe1c..7e839aded707e73ae8292a87d5d1452b59901aa6 100644 (file)
@@ -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,22 +129,22 @@ 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
 }
 //-----------------------------------------------------------------------------
-MGL_NO_EXPORT void* mgl_fftx(void *par)
+static void* mgl_fftx(void *par)
 {
        mglThreadT *t=(mglThreadT *)par;
        long nx=t->p[0];
@@ -161,7 +160,7 @@ MGL_NO_EXPORT void* mgl_fftx(void *par)
        }
        return 0;
 }
-MGL_NO_EXPORT void* mgl_ffty(void *par)
+static void* mgl_ffty(void *par)
 {
        mglThreadT *t=(mglThreadT *)par;
        long nx=t->p[0],ny=t->p[1];
@@ -177,7 +176,7 @@ MGL_NO_EXPORT void* mgl_ffty(void *par)
        }
        return 0;
 }
-MGL_NO_EXPORT void* mgl_fftz(void *par)
+static void* mgl_fftz(void *par)
 {
        mglThreadT *t=(mglThreadT *)par;
        long nx=t->p[0],ny=t->p[1],nz=t->p[2];
@@ -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,15 +278,15 @@ 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];    }
        delete []a;
 }
 //-----------------------------------------------------------------------------
-MGL_NO_EXPORT void* mgl_envx(void *par)
+static void* mgl_envx(void *par)
 {
        mglThreadT *t=(mglThreadT *)par;
        long nx=t->p[0];
@@ -307,7 +310,7 @@ MGL_NO_EXPORT void* mgl_envx(void *par)
        }
        return 0;
 }
-MGL_NO_EXPORT void* mgl_envy(void *par)
+static void* mgl_envy(void *par)
 {
        mglThreadT *t=(mglThreadT *)par;
        long nx=t->p[0],ny=t->p[1];
@@ -331,7 +334,7 @@ MGL_NO_EXPORT void* mgl_envy(void *par)
        }
        return 0;
 }
-MGL_NO_EXPORT void* mgl_envz(void *par)
+static void* mgl_envz(void *par)
 {
        mglThreadT *t=(mglThreadT *)par;
        long nx=t->p[0],ny=t->p[1],nz=t->p[2],k=nx*ny;
@@ -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,11 +388,23 @@ 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);
 }
 //-----------------------------------------------------------------------------
-MGL_NO_EXPORT void* mgl_stfa1(void *par)
+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]);
+}
+//-----------------------------------------------------------------------------
+static void* mgl_stfa1(void *par)
 {
        mglThreadT *t=(mglThreadT *)par;
        long mx=t->p[0],mz=t->p[2],dn=t->p[3],dd=dn/2,ny=t->p[4];
@@ -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;
@@ -425,7 +442,7 @@ MGL_NO_EXPORT void* mgl_stfa1(void *par)
        }
        return 0;
 }
-MGL_NO_EXPORT void* mgl_stfa2(void *par)
+static void* mgl_stfa2(void *par)
 {
        mglThreadT *t=(mglThreadT *)par;
        long mx=t->p[0],my=t->p[1],dn=t->p[3],dd=dn/2,nx=t->p[4];
@@ -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;
@@ -490,7 +507,7 @@ HMDT MGL_EXPORT mgl_data_stfa(HCDT re, HCDT im, long dn, char dir)
        return d;
 }
 //-----------------------------------------------------------------------------
-MGL_NO_EXPORT void* mgl_sinx(void *par)
+static void* mgl_sinx(void *par)
 {
        mglThreadT *t=(mglThreadT *)par;
        long nx=t->p[0];
@@ -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
@@ -519,7 +536,7 @@ MGL_NO_EXPORT void* mgl_sinx(void *par)
        }
        return 0;
 }
-MGL_NO_EXPORT void* mgl_siny(void *par)
+static void* mgl_siny(void *par)
 {
        mglThreadT *t=(mglThreadT *)par;
        long nx=t->p[0],ny=t->p[1];
@@ -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
@@ -548,7 +565,7 @@ MGL_NO_EXPORT void* mgl_siny(void *par)
        }
        return 0;
 }
-MGL_NO_EXPORT void* mgl_sinz(void *par)
+static void* mgl_sinz(void *par)
 {
        mglThreadT *t=(mglThreadT *)par;
        long nx=t->p[0],ny=t->p[1],nz=t->p[2],k=nx*ny;
@@ -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,11 +625,24 @@ 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);
 }
 //-----------------------------------------------------------------------------
-MGL_NO_EXPORT void* mgl_cosx(void *par)
+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]);
+}
+//-----------------------------------------------------------------------------
+static void* mgl_cosx(void *par)
 {
        mglThreadT *t=(mglThreadT *)par;
        long nx=t->p[0],nn=nx-1;
@@ -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;
@@ -647,7 +679,7 @@ MGL_NO_EXPORT void* mgl_cosx(void *par)
        }
        return 0;
 }
-MGL_NO_EXPORT void* mgl_cosy(void *par)
+static void* mgl_cosy(void *par)
 {
        mglThreadT *t=(mglThreadT *)par;
        long nx=t->p[0],ny=t->p[1],nn=ny-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;
@@ -684,7 +716,7 @@ MGL_NO_EXPORT void* mgl_cosy(void *par)
        }
        return 0;
 }
-MGL_NO_EXPORT void* mgl_cosz(void *par)
+static void* mgl_cosz(void *par)
 {
        mglThreadT *t=(mglThreadT *)par;
        long nx=t->p[0],ny=t->p[1],nz=t->p[2],k=nx*ny,nn=nz-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,9 +881,11 @@ 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)
+static void* mgl_chnkx(void *par)
 {
        mglThreadT *t=(mglThreadT *)par;
        long nx=t->p[0];
@@ -862,7 +911,7 @@ MGL_NO_EXPORT void* mgl_chnkx(void *par)
        }
        return 0;
 }
-MGL_NO_EXPORT void* mgl_chnky(void *par)
+static void* mgl_chnky(void *par)
 {
        mglThreadT *t=(mglThreadT *)par;
        long nx=t->p[0],ny=t->p[1];
@@ -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)]);
@@ -889,7 +938,7 @@ MGL_NO_EXPORT void* mgl_chnky(void *par)
        }
        return 0;
 }
-MGL_NO_EXPORT void* mgl_chnkz(void *par)
+static void* mgl_chnkz(void *par)
 {
        mglThreadT *t=(mglThreadT *)par;
        long k=t->p[0]*t->p[1],nz=t->p[2];
@@ -956,7 +1005,7 @@ void MGL_EXPORT mgl_datac_hankel_(uintptr_t *d, const char *dir,int l)
        mgl_datac_hankel(_DC_,s);       delete []s;     }
 //-----------------------------------------------------------------------------
 #if MGL_HAVE_GSL
-MGL_NO_EXPORT void* mgl_hnkx(void *par)
+static void* mgl_hnkx(void *par)
 {
        mglThreadT *t=(mglThreadT *)par;
        long nx=t->p[0];
@@ -980,7 +1029,7 @@ MGL_NO_EXPORT void* mgl_hnkx(void *par)
        }
        return 0;
 }
-MGL_NO_EXPORT void* mgl_hnky(void *par)
+static void* mgl_hnky(void *par)
 {
        mglThreadT *t=(mglThreadT *)par;
        long nx=t->p[0],ny=t->p[1];
@@ -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;
@@ -1005,7 +1054,7 @@ MGL_NO_EXPORT void* mgl_hnky(void *par)
        }
        return 0;
 }
-MGL_NO_EXPORT void* mgl_hnkz(void *par)
+static void* mgl_hnkz(void *par)
 {
        mglThreadT *t=(mglThreadT *)par;
        long k=t->p[0]*t->p[1],nz=t->p[2];
@@ -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)
+static 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 3cb6630ade5fd425c6635cc38a609fdb116aae94..3c889f33d3ebce4819212fb0830aecd2e3aa8999 100644 (file)
@@ -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
@@ -77,7 +77,7 @@ int   mgl_fit__f (const gsl_vector *x, void *data, gsl_vector *f)
        mglDataV *var = new mglDataV[fd->m];\r
        std::vector<mglDataA*> list;\r
        for(long i=0;i<fd->m;i++)\r
-       {       var[i].s=fd->var[i];    var[i].Fill(gsl_vector_get(x,i));       list.push_back(var+i);  }\r
+       {       var[i].s = fd->var[i];  var[i].Fill(gsl_vector_get(x,i));       list.push_back(var+i);  }\r
        if(fd->x)       list.push_back(fd->x);\r
        if(fd->y)       list.push_back(fd->y);\r
        if(fd->z)       list.push_back(fd->z);\r
@@ -94,13 +94,13 @@ int mgl_fit__f (const gsl_vector *x, void *data, gsl_vector *f)
        return GSL_SUCCESS;\r
 }\r
 //-----------------------------------------------------------------------------\r
-int MGL_NO_EXPORT mgl_fit__df (const gsl_vector * x, void *data, gsl_matrix * J)\r
+int static mgl_fit__df (const gsl_vector * x, void *data, gsl_matrix * J)\r
 {\r
        mglFitData *fd = (mglFitData *)data;\r
        mglDataV *var = new mglDataV[fd->m];\r
        std::vector<mglDataA*> list;\r
        for(long i=0;i<fd->m;i++)\r
-       {       var[i].s=fd->var[i];    var[i].Fill(gsl_vector_get(x,i));       list.push_back(var+i);  }\r
+       {       var[i].s = fd->var[i];  var[i].Fill(gsl_vector_get(x,i));       list.push_back(var+i);  }\r
        if(fd->x)       list.push_back(fd->x);\r
        if(fd->y)       list.push_back(fd->y);\r
        if(fd->z)       list.push_back(fd->z);\r
@@ -125,13 +125,13 @@ int MGL_NO_EXPORT mgl_fit__df (const gsl_vector * x, void *data, gsl_matrix * J)
        return GSL_SUCCESS;\r
 }\r
 //-----------------------------------------------------------------------------\r
-int MGL_NO_EXPORT mgl_fit__fdf (const gsl_vector * x, void *data, gsl_vector * f, gsl_matrix * J)\r
+int static mgl_fit__fdf (const gsl_vector * x, void *data, gsl_vector * f, gsl_matrix * J)\r
 {\r
        mglFitData *fd = (mglFitData *)data;\r
        mglDataV *var = new mglDataV[fd->m];\r
        std::vector<mglDataA*> list;\r
        for(long i=0;i<fd->m;i++)\r
-       {       var[i].s=fd->var[i];    var[i].Fill(gsl_vector_get(x,i));       list.push_back(var+i);  }\r
+       {       var[i].s = fd->var[i];  var[i].Fill(gsl_vector_get(x,i));       list.push_back(var+i);  }\r
        if(fd->x)       list.push_back(fd->x);\r
        if(fd->y)       list.push_back(fd->y);\r
        if(fd->z)       list.push_back(fd->z);\r
@@ -166,14 +166,14 @@ int MGL_NO_EXPORT mgl_fit__fdf (const gsl_vector * x, void *data, gsl_vector * f
 #endif\r
 //-----------------------------------------------------------------------------\r
 /// GSL based fitting procedure for formula/arguments specified by string\r
-mreal MGL_NO_EXPORT mgl_fit_base(mglFitData &fd, mreal *ini)\r
+mreal static 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
@@ -296,15 +296,15 @@ HMDT MGL_EXPORT mgl_fit_ys(HMGL gr, HCDT y, HCDT s, const char *eq, const char *
        return mgl_fit_xys(gr,&x,y,s,eq,var,ini,0);\r
 }\r
 //-----------------------------------------------------------------------------\r
-void MGL_NO_EXPORT mgl_fill_fit(HMGL gr, mglData &fit, mglData &in, mglFitData &fd, const char *var, long nx, long ny, long nz, long k)\r
+void static mgl_fill_fit(HMGL gr, mglData &fit, mglData &in, mglFitData &fd, const char *var, long nx, long ny, long nz, long k)\r
 {\r
        mglDataV *vv = new mglDataV[fd.m];\r
        std::vector<mglDataA*> list;\r
        for(long i=0;i<fd.m;i++)\r
-       {       vv[i].s=var[i]; vv[i].Fill(in.a[i]);    list.push_back(vv+i);   }\r
-       mglDataV x(nx,ny,nz, gr->Min.x,gr->Max.x,'x');  x.s = L"x";     list.push_back(&x);\r
-       mglDataV y(nx,ny,nz, gr->Min.y,gr->Max.y,'y');  y.s = L"y";     list.push_back(&y);\r
-       mglDataV z(nx,ny,nz, gr->Min.z,gr->Max.z,'z');  z.s = L"z";     list.push_back(&z);\r
+       {       vv[i].s = var[i];       vv[i].Fill(in.a[i]);    list.push_back(vv+i);   }\r
+       mglDataV x(nx,ny,nz, gr->Min.x,gr->Max.x,'x');  x.Name(L"x");   list.push_back(&x);\r
+       mglDataV y(nx,ny,nz, gr->Min.y,gr->Max.y,'y');  y.Name(L"y");   list.push_back(&y);\r
+       mglDataV z(nx,ny,nz, gr->Min.z,gr->Max.z,'z');  z.Name(L"z");   list.push_back(&z);\r
        HMDT res = mglFormulaCalc(fd.eq, list);\r
        long nn = nx*ny*nz;\r
        memcpy(fit.a+k*nn,res->a,nn*sizeof(mreal));\r
@@ -325,7 +325,7 @@ HMDT MGL_EXPORT mgl_fit_xys(HMGL gr, HCDT xx, HCDT yy, HCDT ss, const char *eq,
        if(!var || *var==0)\r
        {       gr->SetWarn(mglWarnNull,"Fit[S]");      return 0;       }\r
 \r
-       mglData x(xx), y(yy), s(ss);    x.s=L"x";\r
+       mglData x(xx), y(yy), s(ss);    x.Name(L"x");\r
        long mm = yy->GetNy()*yy->GetNz();\r
 #pragma omp parallel for\r
        for(long i=0;i<m;i++)   if(mgl_isnan(x.a[i]))\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
@@ -367,12 +368,12 @@ HMDT MGL_EXPORT mgl_fit_xyzs(HMGL gr, HCDT xx, HCDT yy, HCDT zz, HCDT ss, const
        if(!var || *var==0)\r
        {       gr->SetWarn(mglWarnNull,"Fit[S]");      return 0;       }\r
 \r
-       mglData x(m, n), y(m, n), z(zz), s(ss); x.s=L"x";       y.s=L"y";\r
+       mglData x(m, n), y(m, n), z(zz), s(ss); x.Name(L"x");   y.Name(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
@@ -414,11 +415,11 @@ HMDT MGL_EXPORT mgl_fit_xyzas(HMGL gr, HCDT xx, HCDT yy, HCDT zz, HCDT aa, HCDT
        {       gr->SetWarn(mglWarnNull,"Fit[S]");      return 0;       }\r
 \r
        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
+       x.Name(L"x");   y.Name(L"y");   z.Name(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 de68ad617d7223f2960db42feee1d01f89402925..444f67b2923807f54de1caf4d47a986846741504 100644 (file)
 #include <locale.h>\r
 #include <ctype.h>\r
 #include <wctype.h>\r
+#ifdef WIN32\r
+#include <io.h>\r
+#include <direct.h>\r
+#else\r
+#include <unistd.h>\r
+#endif\r
 \r
 #if !defined(__BORLANDC__) || (__CODEGEARC__ >=  0x0630)\r
 #include <algorithm>\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
@@ -65,7 +78,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
@@ -126,19 +139,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
@@ -204,7 +217,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
@@ -216,7 +229,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
@@ -234,25 +247,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
@@ -261,9 +268,10 @@ unsigned mglFont::Parse(const wchar_t *s) const
        else if(!wcscmp(s,L"underset")) res = unsigned(-9);\r
        else if(!wcscmp(s,L"stackr"))   res = unsigned(-10);\r
        else if(!wcscmp(s,L"stackl"))   res = unsigned(-11);\r
-       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"sub"))              res = unsigned(-9);     //unsigned(-12);\r
+       else if(!wcscmp(s,L"sup"))              res = unsigned(-8);     //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
@@ -285,9 +293,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
@@ -296,10 +304,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
@@ -328,12 +336,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
@@ -344,7 +351,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
@@ -405,28 +412,28 @@ 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
+               else if(s==unsigned(-9))        // underset or sub\r
                {\r
                        ww = get_ptr(i, str, &b1, &b2, w1, w2, ff, ff/4, 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-150*ff/fact[a], ff/4, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol,ccol);\r
+                       Puts(b2, x+(ww-w2)/2, yy-175*ff/fact[a], ff/3, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol,ccol);\r
                        if(gr && !(style&0x10)) // add under-/over- line now\r
                                draw_ouline(st,x,y,f,fact[a],ww,ccol);\r
                        MGL_CLEAR_STYLE\r
                }\r
-               else if(s==unsigned(-8))        // overset\r
+               else if(s==unsigned(-8))        // overset or sup\r
                {\r
                        ww = get_ptr(i, str, &b1, &b2, w1, w2, ff, ff/4, 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+375*ff/fact[a], ff/4, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol,ccol);\r
+                       Puts(b2, x+(ww-w2)/2, yy+400*ff/fact[a], ff/3, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol,ccol);\r
                        if(gr && !(style&0x10)) // add under-/over- line now\r
                                draw_ouline(st,x,y,f,fact[a],ww,ccol);\r
                        MGL_CLEAR_STYLE\r
                }\r
-               else if(s==unsigned(-12))       // sub\r
+/*             else if(s==unsigned(-12))       // sub  // NOTE: unused because is the same as \underset now\r
                {\r
                        ww = get_ptr(i, str, &b1, &b2, w1, w2, ff, ff/4, st);\r
                        Puts(b1, x+(ww-w1)/2, yy, ff, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol,ccol);\r
@@ -434,8 +441,8 @@ float mglFont::Puts(const unsigned *text, float x,float y,float f,int style,floa
                        if(gr && !(style&0x10)) // add under-/over- line now\r
                                draw_ouline(st,x,y,f,fact[a],ww,ccol);\r
                        MGL_CLEAR_STYLE\r
-               }\r
-               else if(s==unsigned(-13))       // sup\r
+               }*/\r
+/*             else if(s==unsigned(-13))       // sup  // NOTE: unused because is the same as \overset now\r
                {\r
                        ww = get_ptr(i, str, &b1, &b2, w1, w2, ff, ff/4, st);\r
                        Puts(b1, x+(ww-w1)/2, yy, ff, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol,ccol);\r
@@ -443,7 +450,7 @@ float mglFont::Puts(const unsigned *text, float x,float y,float f,int style,floa
                        if(gr && !(style&0x10)) // add under-/over- line now\r
                                draw_ouline(st,x,y,f,fact[a],ww,ccol);\r
                        MGL_CLEAR_STYLE\r
-               }\r
+               }*/\r
                else if(s==unsigned(-11))       // stackl\r
                {\r
                        ww = get_ptr(i, str, &b1, &b2, w1, w2, ff*0.45, ff*0.45, st);\r
@@ -475,7 +482,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
@@ -520,7 +539,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
@@ -530,7 +550,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
@@ -542,9 +562,9 @@ float mglFont::Puts(const unsigned *text, float x,float y,float f,int style,floa
                        ss = (s/MGL_FONT_UPPER)%4;\r
                        if(ss)\r
                        {\r
-                               if(ss==1)               {       ff *=0.6;       yy += 200*ff/fact[a];   }       // =  500*0.4\r
-                               else if(ss==2)  {       ff *=0.6;       yy -=  80*ff/fact[a];   }       // = -500*0.16\r
-                               else if(ss==3)  {       ff *=0.8;       yy +=  0*60*ff/fact[a]; }       // =  500*0.12\r
+                               if(ss==1)               {       ff *=0.6;       yy += 250*ff/fact[a];   }       // =  500*0.4\r
+                               else if(ss==2)  {       ff *=0.6;       yy -=  130*ff/fact[a];  }       // = -500*0.16\r
+                               else if(ss==3)  {       ff *=0.6;       yy +=  60*ff/fact[a];   }       // =  500*0.12\r
                        }\r
                }\r
                x += ww;        w += ww;\r
@@ -722,10 +742,10 @@ bool mglFont::LoadBin(const char *base, const char *path)
 //-----------------------------------------------------------------------------\r
 bool mglFont::Load(const char *base, const char *path)\r
 {\r
-//     base = 0;\r
-       char *buf=0,sep='/';\r
 #ifdef WIN32\r
-       sep='\\';\r
+       char *buf=0, sep='\\';\r
+#else\r
+       char *buf=0, sep='/';\r
 #endif\r
        char str[256];\r
        std::string loc = setlocale(LC_NUMERIC,"C");\r
@@ -750,7 +770,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
@@ -867,12 +888,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
+void static mgl_init()\r
 {\r
+       mgl_textdomain(NULL,"");\r
 #if MGL_HAVE_PTHREAD\r
        pthread_mutex_init(&mutexRnd,0);\r
 #endif\r
@@ -909,7 +931,7 @@ void mglFont::Copy(mglFont *f)
 #pragma omp critical(font)\r
        {       if(Buf) delete []Buf;   Buf=0;  }\r
        // copy scale factors\r
-       memcpy(fact,f->fact,4*sizeof(float));\r
+       fact[0]=f->fact[0];     fact[1]=f->fact[1];     fact[2]=f->fact[2];     fact[3]=f->fact[3];\r
        // copy symbols descriptions\r
        numb = f->numb; Buf = new short[numb];  memcpy(Buf, f->Buf, numb*sizeof(short));\r
        // copy symbol parameters\r
@@ -928,7 +950,52 @@ long MGL_EXPORT mgl_check_tex_table()
                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
+               {       printf(_("Bad '%ls' at %zu\n"),mgl_tex_symb[i].tex,i);  res = 1+i;      }\r
        }\r
        return res;\r
-}
\ No newline at end of file
+}\r
+//---------------------------------------------------------------------------\r
+bool static 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 4be00b84bd8924666ec994a799053747cf138feb..7cc9431445e3fc000d49b2ca9a3c87c53530f2ea 100644 (file)
@@ -1,21 +1,21 @@
 /***************************************************************************
-*pixel.cpp is part of Math Graphic Library
-*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       *
-*  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.             *
+ * fractal.cpp is part of Math Graphic Library
+ * 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       *
+ *   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.             *
  ***************************************************************************/
 #include "mgl2/other.h"
 #include "mgl2/data.h"
@@ -25,7 +25,7 @@ MGL_NO_EXPORT char *mgl_read_gz(gzFile fp);
 //     IFS series
 //
 //-----------------------------------------------------------------------------
-void MGL_NO_EXPORT mgl_ifs_2d_point(HCDT A, mreal& x, mreal& y, mreal amax)
+void static mgl_ifs_2d_point(HCDT A, mreal& x, mreal& y, mreal amax)
 {
        long i, n=A->GetNy();
        mreal r = amax*mgl_rnd(), sum_prob = 0, x1;
@@ -43,7 +43,7 @@ HMDT MGL_EXPORT mgl_data_ifs_2d(HCDT A, long n, long skip)
        mreal amax=0;
        for(long i=0; i<A->GetNy(); i++)        amax += A->v(6,i);
        if(amax<=0)     return 0;
-       
+
        mglData *f = new mglData(2,n);
        mreal x = 0, y = 0;
        for(long i=0; i<skip; i++)      mgl_ifs_2d_point(A, x, y,amax);
@@ -57,14 +57,14 @@ HMDT MGL_EXPORT mgl_data_ifs_2d(HCDT A, long n, long skip)
 uintptr_t MGL_EXPORT mgl_data_ifs_2d_(uintptr_t *d, long *n, long *skip)
 {      return uintptr_t(mgl_data_ifs_2d(_DT_,*n,*skip));       }
 //-----------------------------------------------------------------------------
-void MGL_NO_EXPORT mgl_ifs_3d_point(HCDT A, mreal& x, mreal& y, mreal& z, mreal amax)
+void static mgl_ifs_3d_point(HCDT A, mreal& x, mreal& y, mreal& z, mreal amax)
 {
        int i, n=A->GetNy();
        mreal r = amax*mgl_rnd(), sum_prob = 0, x1, y1;
        for (i=0; i<n; i++)
        {
                sum_prob += A->v(12,i);
-               if(r < sum_prob)  break;
+               if(r<sum_prob)  break;
        }
        x1= A->v(0,i)*x + A->v(1,i)*y + A->v(2,i)*z + A->v(9,i);
        y1= A->v(3,i)*x + A->v(4,i)*y + A->v(5,i)*z + A->v(10,i);
@@ -77,7 +77,7 @@ HMDT MGL_EXPORT mgl_data_ifs_3d(HCDT A, long n, long skip)
        mreal amax = 0;
        for(int i=0; i<A->GetNy(); i++) amax += A->v(12,i);
        if(amax <= 0) return 0;
-       
+
        mglData *f = new mglData(3,n);
        mreal x = 0, y = 0, z = 0;
        for(long i=0; i<skip; i++)      mgl_ifs_3d_point(A, x, y, z, amax);
@@ -105,7 +105,7 @@ HMDT MGL_EXPORT mgl_data_ifs_file(const char *fname, const char *name, long n, l
        e = strstr(s,"(3D)");   if(e && e<p)    ext3d = true;
        e = strstr(s,"(3d)");   if(e && e<p)    ext3d = true;
        e = strchr(p,'}');
-       
+
        std::vector<mreal> nums;
        for(size_t i=0;p[i] && p+i<e;i++)
        {
@@ -140,138 +140,138 @@ uintptr_t mgl_data_ifs_file_(const char *fname, const char *name, long *n, long
 //     Functions for flame fractal
 //
 //-----------------------------------------------------------------------------
-void MGL_NO_EXPORT mgl_linear_var0(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_linear_var0(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {      xNew += par[0]*x;       yNew += par[0]*y;       }
-void MGL_NO_EXPORT mgl_sinusoidal_var1(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_sinusoidal_var1(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {      xNew += par[0]*sin(x);  yNew += par[0]*sin(y);  }
-void MGL_NO_EXPORT mgl_spherical_var2(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_spherical_var2(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {      mreal c1 = par[0]/(x*x+y*y);    xNew += c1*x;   yNew += c1*y;   }
-void MGL_NO_EXPORT mgl_swirl_var3(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_swirl_var3(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
-       mreal r2=x*x+y*y, c1=sin(r2), c2=cos(r2);       
+       mreal r2=x*x+y*y, c1=sin(r2), c2=cos(r2);
        xNew += par[0]*(x*c1 - y*c2);
        yNew += par[0]*(x*c2 + y*c1);
 }
-void MGL_NO_EXPORT mgl_horseshoe_var4(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_horseshoe_var4(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
-       mreal c1 = par[0]/hypot(x,y);   
+       mreal c1 = par[0]/hypot(x,y);
        xNew += c1*(x*x-y*y);
        yNew += 2*c1*x*y;
 }
-void MGL_NO_EXPORT mgl_polar_var5(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_polar_var5(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
        xNew += par[0]*atan2(x,y)/M_PI;
        yNew += par[0]*(hypot(x,y)-1);
 }
-void MGL_NO_EXPORT mgl_handkerchief_var6(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_handkerchief_var6(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
        mreal r=hypot(x,y), t=atan2(x,y), c1=par[0]*r;
        xNew += c1*sin(t+r);    yNew += c1*cos(t-r);
 }
-void MGL_NO_EXPORT mgl_heart_var7(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_heart_var7(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
        mreal r=hypot(x,y), c1=par[0]*r, c2=atan2(x,y)*r;
-       xNew +=  c1*sin(c2);    yNew += -c1*cos(c2);
+       xNew +=  c1*sin(c2);    yNew -= c1*cos(c2);
 }
-void MGL_NO_EXPORT mgl_disc_var8(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_disc_var8(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
        mreal c1=par[0]*atan2(x,y)/M_PI, c2=M_PI*hypot(x,y);
        xNew += c1*sin(c2);             yNew += c1*cos(c2);
 }
-void MGL_NO_EXPORT mgl_spiral_var9(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_spiral_var9(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
        mreal r=hypot(x,y), t=atan2(x,y), c1=par[0]/r;
        xNew += c1*(cos(t)+sin(r));
        yNew += c1*(sin(t)-cos(r));
 }
-void MGL_NO_EXPORT mgl_hyperbolic_var10(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_hyperbolic_var10(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
        mreal r=hypot(x,y), t=atan2(x,y);
        xNew += par[0]*sin(t)/r;
        yNew += par[0]*r*cos(t);
 }
-void MGL_NO_EXPORT mgl_diamond_var11(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_diamond_var11(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
        mreal r=hypot(x,y), t=atan2(x,y);
        xNew += par[0]*sin(t)*cos(r);
        yNew += par[0]*cos(t)*sin(r);
 }
-void MGL_NO_EXPORT mgl_ex_var12(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_ex_var12(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
        mreal r=hypot(x,y), t=atan2(x,y), c1=par[0]*r;
-       mreal c2=mgl_ipow(sin(t+r),3), c3 = mgl_ipow(cos(t-r), 3);      
+       mreal c2=mgl_ipow(sin(t+r),3), c3 = mgl_ipow(cos(t-r), 3);
        xNew += c1*(c2 + c3);   yNew += c1*(c2 - c3);
 }
-void MGL_NO_EXPORT mgl_julia_var13(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_julia_var13(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
        mreal c1=par[0]*sqrt(hypot(x,y)), c2=atan2(x,y)/2, c3=(rand()%2)*M_PI;
        xNew += c1*cos(c2+c3);  yNew += c1*sin(c2+c3);
 }
-void MGL_NO_EXPORT mgl_bent_var14(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_bent_var14(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
-       if (x>=0 && y>=0)
+       if(x>=0 && y>=0)
        {       xNew += par[0]*x;       yNew += par[0]*y;       }
-       else if (x<0 && y>=0)
+       else if(x<0 && y>=0)
        {       xNew += par[0]*2*x;     yNew += par[0]*y;       }
-       else if (x>=0 && x<0)
+       else if(x>=0 && y<0)
        {       xNew += par[0]*x;       yNew += par[0]*y/2;     }
        else
        {       xNew += par[0]*2*x;     yNew += par[0]*y/2;     }
 }
-void MGL_NO_EXPORT mgl_waves_var15(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_waves_var15(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {      // NOTE: par[1]=b[i], par[2]=1/c[i]^2, par[3]=e[i], par[4]=1/f[i]^2
        xNew += par[0]*(x + par[1]*sin(y*par[2]));
        yNew += par[0]*(y + par[3]*sin(x*par[4]));
 }
-void MGL_NO_EXPORT mgl_fisheye_var16(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_fisheye_var16(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
        mreal c1 = par[0]*2/(hypot(x,y) + 1);
        xNew += c1*y;   yNew += c1*x;
 }
-void MGL_NO_EXPORT mgl_popcorn_var17(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_popcorn_var17(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {      // NOTE: par[1]=c[i], par[2]=f[i]
        xNew += par[0]*(x + par[1]*sin(tan(3*y)));
        yNew += par[0]*(y + par[2]*sin(tan(3*x)));
 }
-void MGL_NO_EXPORT mgl_exponential_var18(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_exponential_var18(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
        mreal c1=par[0]*exp(x-1);
        xNew += c1*cos(M_PI*y); yNew += c1*sin(M_PI*y);
 }
-void MGL_NO_EXPORT mgl_power_var19(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_power_var19(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
        mreal t=atan2(x,y), c1=par[0]*pow(hypot(x,y), sin(t));
        xNew += c1*cos(t);      yNew += c1*sin(t);
 }
-void MGL_NO_EXPORT mgl_cosine_var20(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_cosine_var20(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
-       xNew +=  par[0]*cos(M_PI*x)*cosh(y);
-       yNew += -par[0]*sin(M_PI*x)*sinh(y);
+       xNew += par[0]*cos(M_PI*x)*cosh(y);
+       yNew -= par[0]*sin(M_PI*x)*sinh(y);
 }
-void MGL_NO_EXPORT mgl_rings_var21(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_rings_var21(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {      // NOTE: par[1]=c[i]^2
        mreal t=atan2(x,y), r=hypot(x,y), c1=par[0]*(fmod(r+par[1],2*par[1])-par[1]+r*(1-par[1])); // convert to int?
        xNew += c1*cos(t);      yNew += c1*sin(t);
 }
-void MGL_NO_EXPORT mgl_fan_var22(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_fan_var22(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {      // NOTE: par[1]=c[i]^2, par[2]=f[i]
        mreal t=atan2(x,y), c1=par[0]*hypot(x,y), c2;
        c2 = fmod(t+par[2], M_PI*par[1]); // convert to int?
-       if (c2 > M_PI/2*par[1])    c2 = t - M_PI/2*par[1];
-       else    c2 += t;
+       if(c2>M_PI_2*par[1])    c2 = t - M_PI_2*par[1];
+       else    c2 += t;
        xNew += c1*cos(c2);     yNew += c1*sin(c2);
 }
-void MGL_NO_EXPORT mgl_blob_var23(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_blob_var23(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
        mreal t=atan2(x,y), c1=par[0]*hypot(x,y)*(par[2]+(par[1]-par[2])/2*(sin(par[3]*t)));
        xNew += c1*cos(t);      yNew += c1*sin(t);
 }
-void MGL_NO_EXPORT mgl_pdj_var24(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_pdj_var24(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
        xNew += par[0]*(sin(par[1]*y) - cos(par[2]*x));
        yNew += par[0]*(sin(par[3]*x) - cos(par[4]*y));
 }
-void MGL_NO_EXPORT mgl_fan2_var25(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_fan2_var25(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
        mreal t=atan2(x,y), c1, c2;
        c1 = M_PI*par[1]*par[1];
@@ -280,132 +280,519 @@ void MGL_NO_EXPORT mgl_fan2_var25(mreal &xNew, mreal &yNew, mreal x, mreal y, co
        c1 = par[0]*hypot(x,y);
        xNew += c1*sin(c2);     yNew += c1*cos(c2);
 }
-void MGL_NO_EXPORT mgl_rings2_var26(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_rings2_var26(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
        mreal r=hypot(x,y), t=atan2(x,y), c1=par[1]*par[1];
        c1 = par[0]*(r - 2*c1*int((r+c1)/(2*c1)) + r*(1-c1));
        xNew += c1*cos(t);      yNew += c1*sin(t);
 }
-void MGL_NO_EXPORT mgl_eyefish_var27(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_eyefish_var27(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
        mreal c1 = par[0]*2/(hypot(x,y)+1);
        xNew += c1*x;           yNew += c1*y;
 }
-void MGL_NO_EXPORT mgl_bubble_var28(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_bubble_var28(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
        mreal c1 = par[0]*4/(x*x+y*y+4);
        xNew += c1*x;           yNew += c1*y;
 }
-void MGL_NO_EXPORT mgl_cylinder_var29(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_cylinder_var29(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {      xNew += par[0]*sin(x);  yNew += par[0]*y;       }
-void MGL_NO_EXPORT mgl_perspective_var30(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_perspective_var30(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
        mreal c1 = par[0]*par[2]/(par[2]-y*sin(par[1]));
        xNew += c1*x;   yNew += c1*y*cos(par[1]);
 }
-void MGL_NO_EXPORT mgl_noise_var31(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_noise_var31(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
        mreal c1=par[0]*mgl_rnd(), c2=2*M_PI*mgl_rnd();
        xNew += c1*x*cos(c2);   yNew += c1*y*sin(c2);
 }
-void MGL_NO_EXPORT mgl_juliaN_var32(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_juliaN_var32(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
        mreal c1=int(fabs(par[1])*mgl_rnd()), c2;
        c2 = (atan2(y,x) + 2*M_PI*c1)/par[1];
        c1 = par[0]*pow(hypot(x,y), par[2]/par[1]);
        xNew += c1*cos(c2);     yNew += c1*sin(c2);
 }
-void MGL_NO_EXPORT mgl_juliaScope_var33(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_juliaScope_var33(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
        mreal c1=int(fabs(par[1])*mgl_rnd()), c2;
        c2 = ((2*(rand()%2)-1)*atan2(y,x) + 2*M_PI*c1)/par[1];
        c1 = par[0]*pow(hypot(x,y), par[2]/par[1]);
        xNew += c1*cos(c2);     yNew += c1*sin(c2);
 }
-void MGL_NO_EXPORT mgl_blur_var34(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_blur_var34(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
        mreal c1=par[0]*mgl_rnd(), c2=2*M_PI*mgl_rnd();
        xNew += c1*cos(c2);     yNew += c1*sin(c2);
 }
-void MGL_NO_EXPORT mgl_gaussian_var35(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_gaussian_var35(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
        mreal c1=par[0]*(4*mgl_rnd()-2), c2=2*M_PI*mgl_rnd();
        xNew += c1*cos(c2);     yNew += c1*sin(c2);
 }
-void MGL_NO_EXPORT mgl_radialBlur_var36(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_radialBlur_var36(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
-       mreal r=hypot(x,y), c1=par[1]*M_PI/2, c2=par[0]*(4*mgl_rnd()-2), c3;
+       mreal r=hypot(x,y), c1=par[1]*M_PI_2, c2=par[0]*(4*mgl_rnd()-2), c3;
        c3 = c2*cos(c1) - 1;    c2 = atan2(y,x) + c2 *sin(c1);
        xNew += r*cos(c2) + c3*x;       yNew += r*sin(c2) + c3*y;
 }
-void MGL_NO_EXPORT mgl_pie_var37(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_pie_var37(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
        mreal c1=int(mgl_rnd()*par[1] + 0.5), c2;
        c2 = par[2] + 2*M_PI/par[1]*(c1 + mgl_rnd()*par[3]);
        c1 = par[0]*mgl_rnd();
        xNew += c1*cos(c2);     yNew += c1*sin(c2);
 }
-void MGL_NO_EXPORT mgl_ngon_var38(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_ngon_var38(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
        mreal c1=2*M_PI/par[2], c2;
        c2 = atan2(y,x) - c1*floor(atan2(y,x)/c1);
-       if (c2 <= c1/2)    c2 -= c1;
+       if(c2 <= c1/2)  c2 -= c1;
        c1 = par[0]*(par[3]*(1/cos(c2) - 1) + par[4])/pow(hypot(x,y), par[1]);
-       xNew += c1*x;           yNew += c1*y;
+       xNew += c1*x;   yNew += c1*y;
 }
-void MGL_NO_EXPORT mgl_curl_var39(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_curl_var39(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
        mreal c1=1 + par[1]*x + par[2]*(x*x - y*y);
        mreal c2 = par[1]*y + 2*par[2]*x*y;
        mreal c3 = par[0]/(c1*c1 + c2*c2);
-       
-       xNew += c3*(c1*x + c2*y);       yNew += c3*(c1*y - c2*y);
+       xNew += c3*(c1*x + c2*y);       yNew += c3*(c1*x - c2*y);
 }
-void MGL_NO_EXPORT mgl_rectangles_var40(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_rectangles_var40(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
        xNew += par[0]*((2*floor(x/par[1]) + 1)*par[1] - x);
        yNew += par[0]*((2*floor(y/par[2]) + 1)*par[2] - y);
 }
-void MGL_NO_EXPORT mgl_arch_var41(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_arch_var41(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
        mreal c1=mgl_rnd()*M_PI*par[0], c2=sin(c1);
        xNew += par[0]*c2;      yNew += par[0]*c2*c2/cos(c1);
 }
-void MGL_NO_EXPORT mgl_tangent_var42(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_tangent_var42(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {      xNew += par[0]*sin(x)/cos(y);   yNew += par[0]*tan(y);  }
-void MGL_NO_EXPORT mgl_square_var43(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_square_var43(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
        xNew += par[0]*(mgl_rnd() - 0.5);
        yNew += par[0]*(mgl_rnd() - 0.5);
 }
-void MGL_NO_EXPORT mgl_rays_var43(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
-{
-       mreal c1 = par[0]*par[0]*tan(mgl_rnd()*M_PI*par[0])/(x*x+y*y);
-       xNew += c1*cos(x);      yNew += c1*sin(y);
-}
-void MGL_NO_EXPORT mgl_blade_var44(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_blade_var44(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
        mreal c1=par[0]*x, c2=mgl_rnd()*hypot(x,y)*par[0];
        xNew += c1*(cos(c2) + sin(c2)); // TODO check use of c2
        yNew += c1*(cos(c2) - sin(c2));
 }
-void MGL_NO_EXPORT mgl_secant_var45(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_secant_var45(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {      xNew += par[0]*x;       yNew += 1/cos(par[0]*hypot(x,y));       }
-void MGL_NO_EXPORT mgl_twintrian_var47(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_rays_var46(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal c1 = par[0]*par[0]*tan(mgl_rnd()*M_PI*par[0])/(x*x+y*y);
+       xNew += c1*cos(x);      yNew += c1*sin(y);
+}
+void static mgl_twintrian_var47(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
        mreal c1=par[0]*x, c2, c3;
        c2 = mgl_rnd()*hypot(x,y)*par[0];
        c3 = log10(sin(c2)*sin(c2)) + cos(c2);
        xNew += c1*c3;  yNew += c1*(c3 - M_PI*sin(c2));
 }
-void MGL_NO_EXPORT mgl_cross_var48(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+void static mgl_cross_var48(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
 {
        mreal c1 = par[0]/fabs(x*x - y*y);
        xNew += c1*x;   yNew += c1*y;
 }
+void static mgl_disc2_var49(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal c1 = cos(par[2])-1, c2 = sin(par[2]), c3;
+       if(par[2]>2*M_PI)
+       {
+               c3 = 1+par[2]-2*M_PI;
+               c1 *= c3;   c2 *= c3;
+       }
+       else if(par[2]<-2*M_PI)
+       {
+               c3 = 1+par[2]+2*M_PI;
+               c1 *= c3;   c2 *= c3;
+       }
+       c3 = par[1]*M_PI*(x+y);
+       mreal a = par[0]*atan2(x,y)/M_PI;
+       xNew += a*(c1+sin(c3)); yNew += a*(c2+cos(c3));
+}
+void static mgl_supershape_var50(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal c1 = par[2]/4*atan2(y,x)+M_PI_4, r = hypot(x,y);
+       c1 = pow(fabs(sin(c1)), par[5])+pow(fabs(cos(c1)), par[4]);
+       c1 = par[0]*((par[1]*mgl_rnd()+(1-par[1])*r)-par[6])*pow(c1, -1.0/par[3])/r;
+       xNew += c1*x;   yNew += c1*y;
+}
+void static mgl_flower_var51(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal c1 = par[0]*(mgl_rnd()-par[2])*cos(par[1]*atan2(y,x))/hypot(x,y);
+       xNew += c1*x;   yNew += c1*y;
+}
+void static mgl_conic_var52(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal c1 = x/hypot(x,y);
+       c1 = par[0]*(mgl_rnd()-par[2])*par[1]/(1+par[1]*c1)/hypot(x,y);
+       xNew += c1*x;   yNew += c1*y;
+}
+void static mgl_parabola_var53(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal c1 = hypot(x,y), c2;
+       c2 = cos(c1);   c1 = sin(c1);
+       xNew += par[0]*par[1]*c1*c1 *mgl_rnd();
+       yNew += par[0]*par[2]*c2*mgl_rnd();
+}
+void static mgl_bent2_var54(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal c1 = par[0]*x, c2 = par[0]*y;
+       if(x<0.0)       c1 *= par[1];
+       if(y<0.0)       c2 *= par[2];
+       xNew += c1;             yNew += c2;
+}
+void static mgl_bipolar_var55(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal c1 = 0.5*atan2(2*y, x*x+y*y-1)-M_PI_2*par[1], c2, c3, c4;
+       if(c1>M_PI_2)   c1 = -M_PI_2+fmod(c1+M_PI_2, M_PI);
+       else if(y<-M_PI_2)   c1 = M_PI_2-fmod(M_PI_2-y, M_PI);
+       c2 = par[0]*M_2_PI;
+       c3 = x*x+y*y+1; c4 = 2*x;
+       xNew += 0.25*c2*log((c3+c4)/(c3-c4));   yNew += c1*c2;
+}
+void static mgl_boarders_var56(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal c1 = round(x), c2 = round(y), c3, c4;
+       c3 = x-c1;      c4 = y-c2;
+       if(mgl_rnd()>=0.75)
+       {
+               xNew += par[0]*(c1+0.5*c3);
+               yNew += par[0]*(c2+0.5*c4);
+       }
+       else
+       {
+               if(fabs(c3)>=fabs(c4))
+               {
+                       if(c3>=0)
+                       {
+                               xNew += par[0]*(c1+0.5*c3+0.25);
+                               yNew += par[0]*(c2+0.5*c4+0.25*c4/c3);
+                       }
+                       else
+                       {
+                               xNew += par[0]*(c1+0.5*c3-0.25);
+                               yNew += par[0]*(c2+0.5*c4-0.25*c4/c3);
+                       }
+               }
+               else
+               {
+                       if(c4>=0)
+                       {
+                               xNew += par[0]*(c2+0.5*c4+0.25);
+                               yNew += par[0]*(c1+0.5*c3+0.25*c3/c4);
+                       }
+                       else
+                       {
+                               xNew += par[0]*(c2+0.5*c4-0.25);
+                               yNew += par[0]*(c1+0.5*c3-0.25*c3/c4);
+                       }
+               }
+       }
+}
+void static mgl_butterfly_var57(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal c1 = 4/sqrt(3*M_PI)*par[0], c2 = 2*y; // replace 4/sqrt(3*M_PI) for the result?
+       c1 *= sqrt(fabs(x*y)/(x*x+c2*c2));
+       xNew += c1*x; yNew += c1*c2;
+}
+void static mgl_cell_var58(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal c1=floor(x/par[1]), c2=floor(y/par[1]), c3=x-c1*par[1], c4=y-c2*par[1];
+       if(c2>=0)
+       {
+               if(c1>=0)       {       c1 *= 2;        c2 *= 2;        }
+               else            {       c1=-2*c1-1;     c2 *= 2;        }
+       }
+       else
+       {
+               if(c1>=0)       {       c1 *= 2;        c2=-2*c2-1;     }
+               else            {       c1=-2*c1-1;     c2=-2*c2-1;     }
+       }
+       xNew += par[0]*(par[1]*c1+c3);
+       yNew += par[0]*(par[1]*c2+c4);
+}
+void static mgl_cpow_var59(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal c1 = atan2(y, x), c2, c3, c4, c5;
+       c2 = par[1]/par[3];
+       c3 = par[2]/par[3];
+       c4 = 0.5*log(x*x+y*y);
+       c5 = c1*c2+c3*c4+2*M_PI/par[3]*floor(par[3]*mgl_rnd());
+       c1 = par[0]*exp(c2*c4-c1*c3);
+       c2 = cos(c5);
+       c3 = sin(c5);
+       xNew += c1*c2;  yNew += c1*c3;
+}
+void static mgl_curve_var60(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       xNew += par[0]*(x+par[1]*exp(-(y*y)/(par[3]*par[3])));
+       yNew += par[0]*(y+par[2]*exp(-(x*x)/(par[4]*par[4])));
+}
+void static mgl_edisc_var61(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal c1 = x*x+y*y+1, c2,c3,c4,c5;
+       c2 = 2*x;
+       c3 = sqrt(c1-c2);
+       c1 = sqrt(c1+c2);
+       c1 = (c1+c3)*0.5;
+       c2 = log(c1+sqrt(c1-1));
+       c3 = -acos(x/c1);
+       c1 = par[0]/11.57034632;
+       c4 = cos(c2)*cosh(c3);
+       c5 = sin(c2)*sinh(c3);
+       xNew += c1*c4;  yNew += c1*c5;
+}
+void static mgl_elliptic_var62(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal c1 = x*x+y*y+1, c2, c3, c4, c5;
+       c2 = 2*x;
+       c2 = 0.5*(sqrt(c1+c2)+sqrt(c1-c2));
+       c3 = x/c2;
+       c4 = 1-c3*c3;
+       c5 = c2-1;
+       c1 = par[0]/M_PI_2;
+       if(c4<0)        c4 = 0;
+       else    c4 = sqrt(c4);
+       if(c5<0)        c5 = 0;
+       else    c5 = sqrt(c5);
+       xNew += c1*atan2(c3, c4);
+       if(y>0) yNew += c1*log(c2+c5);
+       else    yNew -= c1*log(c2+c5);
+}
+void static mgl_escher_var63(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal c1 = 0.5*(1+cos(par[1])), c2 = 0.5*sin(par[1]), c3, c4, c5;
+       c3 = 0.5*log(x*x+y*y);  c4 = atan2(y, x);
+       c5 = c1*c4+c2*c3;               c1 = par[0]*exp(c1*c3-c2*c4);
+       xNew += c1*cos(c5);     yNew += c1*sin(c5);
+}
+void static mgl_foci_var64(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal c1=0.5*exp(x), c2=0.25/c1, c3=par[0]/(c1+c2-cos(y));      // TODO Check this!!!
+       xNew += c1*(c2-c3);     yNew += c1*sin(y);
+}
+void static mgl_lazySusan_var65(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal c1 = hypot(x, y), c2;
+       if(c1<par[0])
+       {
+               c2 = atan2(y+par[5], x-par[4])+par[1]+par[3]*(par[0]-c1);
+               c1 *= par[0];
+               xNew += c1*cos(c2)+par[4];
+               yNew += c1*sin(c2)-par[5];
+       }
+       else
+       {
+               c1 = par[0]*(1+par[2]/c1);
+               xNew += c1*(x-par[4])+par[4];
+               yNew += c1*(y+par[5])-par[5];
+       }
+}
+void static mgl_loonie_var66(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal c1 = x*x+y*y, c2 = par[0]*par[0];
+       if(c1<c2)
+       {
+               c1 = par[0]*sqrt(c2/c1-1);
+               xNew += c1*x;   yNew += c1*y;
+       }
+       else    {       xNew += par[0]*x;       yNew += par[0]*y;       }
+}
+void static mgl_preBlur_var67(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal c1 = par[0]*(mgl_rnd()+mgl_rnd()+mgl_rnd()+mgl_rnd()-2), c2;
+       c2 = 2*mgl_rnd()*M_PI;
+       x += c1*cos(c2);        y += c1*sin(c2); // NOTE: This changes the original coordinates, not the new ones
+}
+void static mgl_modulus_var68(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       if(x>par[1])    xNew += par[0]*(-par[1]+fmod(x-par[1], 2*par[1]));
+       else if(x<par[1])       xNew += par[0]*(par[1]-fmod(par[1]-x, 2*par[1]));
+       else    xNew += par[0]*x;
+       if(y>par[2])    yNew += par[0]*(-par[2]+fmod(y+par[2], 2*par[2]));
+       else if(y<par[2])       yNew += par[0]*(par[2]-fmod(par[2]-y, 2*par[2]));
+       else    yNew += par[0]*y;
+}
+void static mgl_oscope_var69(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal c1 = par[3]*exp(-fabs(x)*par[4])*cos(2*M_PI*par[2]*x)+par[1];
+       if(fabs(y) <= c1)
+       {       xNew += par[0]*x;       yNew -= par[0]*y;       }
+       else
+       {       xNew += par[0]*x;       yNew += par[0]*y;       }
+}
+void static mgl_polar2_var70(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal t = atan2(x, y);
+       xNew += par[0]*t*t;     yNew += par[0]*t/2*log(x*x+y*y);
+}
+void static mgl_popcorn2_var71(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       xNew += par[0]*(x+par[1]*sin(tan(par[3]*y)));
+       yNew += par[0]*(y+par[2]*sin(tan(par[3]*x)));
+}
+void static mgl_scry_var72(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal c1 = 1/(hypot(x, y)*(x*x+y*y+1/par[0]));
+       xNew += c1*x;   yNew += c1*y;
+}
+void static mgl_separation_var73(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       if(x>0) xNew += par[0]*(sqrt(x*x+par[1]*par[1])-x*par[2]);
+       else    xNew -= par[0]*(sqrt(x*x+par[1]*par[1])+x*par[2]);
+       if(y>0) yNew += par[0]*(sqrt(y*y+par[3]*par[3])-y*par[4]);
+       else    yNew -= par[0]*(sqrt(y*y+par[3]*par[3])+y*par[4]);
+}
+void static mgl_split_var74(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       if(cos(M_PI*x*par[1])>=0)       xNew += par[0]*y;
+       else    xNew -= par[0]*y;
+       if(cos(M_PI*y*par[2])>=0)       yNew += par[0]*x;
+       else    yNew -= par[0]*x;
+}
+void static mgl_splits_var75(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       if(x>=0)        xNew+= par[0]*(x+par[1]);
+       else    xNew += par[0]*(x-par[1]);
+       if(y>=0)        yNew += par[0]*(y+par[2]);
+       else    yNew += par[0]*(y-par[2]);
+}
+void static mgl_stripes_var76(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal c1 = floor(x+0.5), c2 = x-c1;
+       xNew += par[0]*(c2*(1-par[1])+c1);
+       yNew += par[0]*(y+c2*c2*par[2]);
+}
+void static mgl_wedge_var77(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal c1 = hypot(x, y), c2, c3, c4;
+       c2 = atan2(y, x)+par[4]*c1;
+       c3 = 1-0.5*M_1_PI*par[1]*par[3];
+       c4 = floor(0.5*M_1_PI*(par[2]*c2+M_PI));
+       c2 = c2*c3+c4*par[1];
+       c1 = par[0]*(c1+par[2]);
+       xNew += c1*cos(c2);     yNew += c1*sin(c2);
+}
+void static mgl_wedgeJulia_var78(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal c1 = int(fabs(par[3])*mgl_rnd()), c2;
+       c1 = (atan2(y, x)+2*M_PI*c1)/par[3];
+       c2 = floor(0.5*M_1_PI*(par[2]*c1+M_PI));
+       c2 = c1*(1-0.5*M_1_PI*par[1]*par[2]+c1*par[1]); // TODO Check this!!!
+       c1 = par[0]*pow(x*x +y*y, par[4]/(2*par[3]));
+       xNew += c1*cos(c2);     yNew += c1*sin(c2);
+}
+void static mgl_wedgeSph_var79(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal c1 = 1/hypot(x, y), c2, c3, c4;
+       c2 = atan2(y, x)+par[4]*c1;
+       c3 = 1-0.5*M_1_PI*par[1]*par[2];
+       c4 = floor(0.5*M_1_PI*(par[2]*c2+M_PI));
+       c2 = c2*c3+c4*par[1];
+       c1 = par[0]*(c1+par[3]);
+       xNew += c1*cos(c2);     yNew += c1*sin(c2);
+}
+void static mgl_whorl_var80(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal c1 = hypot(x, y), c2;
+       if(c1<par[0])   c2 = atan2(y, x)+par[1]/(par[0]-c1);
+       else    c2 = atan2(y, x)+par[2]/(par[0]-c1);
+       c1 *= par[0];
+       xNew += c1*cos(c2);     yNew += c1*sin(c2);
+}
+void static mgl_waves2_var81(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       xNew += par[0]*(x+par[2]*sin(y*par[1]));
+       yNew += par[0]*(y+par[4]*sin(x*par[3]));
+}
+void static mgl_exp_var82(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal c1 = par[0]*exp(x);
+       xNew += c1*cos(y);      yNew += c1*sin(y);
+}
+void static mgl_log_var83(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       xNew += par[0]*0.5*log(x*x+y*y);        yNew += par[0]*atan2(y, x);
+}
+void static mgl_sin_var84(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       xNew += par[0]*sin(x)*cosh(y);  yNew += par[0]*cos(x)*sinh(y);
+}
+void static mgl_cos_var85(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       xNew += par[0]*cos(x)*cosh(y);  yNew -= par[0]*sin(x)*sinh(y);
+}
+void static mgl_tan_var86(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal c1 = par[0]/(cos(2*x)+cosh(2*y));
+       xNew += c1*sin(2*x);    yNew += c1*sinh(2*y);
+}
+void static mgl_sec_var87(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal c1 = 2*par[0]/(cos(2*x)+cosh(2*y));
+       xNew += c1*cos(x)*cosh(y);      yNew += c1*sin(x)*sinh(y);
+}
+void static mgl_csc_var88(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal c1 = 2*par[0]/(cosh(2*y)-cos(2*x));
+       xNew += c1*sin(x)*cosh(y);      yNew -= c1*cos(x)*sinh(y);
+}
+void static mgl_cot_var89(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal c1 = par[0]/(cosh(2*y)-cos(2*x));
+       xNew += c1*sin(2*x);    yNew -= c1*sinh(2*y);
+}
+void static mgl_sinh_var90(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{      xNew += par[0]*sinh(x)*cos(y);  yNew += par[0]*cosh(y)*sin(y);  }
+void static mgl_cosh_var91(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{      xNew += par[0]*cosh(x)*cos(y);  yNew += par[0]*sinh(x)*sin(y);  }
+void static mgl_tanh_var92(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal c1 = par[0]/(cos(2*y)+cosh(2*x));
+       xNew += c1*sinh(2*x);   yNew += c1*sin(2*y);
+}
+void static mgl_sech_var93(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal c1 = 2*par[0]/(cos(2*y)+cosh(2*x));
+       xNew += c1*cos(y)*cosh(x);      yNew -= c1*sin(y)*sinh(x);
+}
+void static mgl_csch_var94(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal c1 = 2*par[0]/(cosh(2*x)-cos(2*y));
+       xNew += c1*sinh(x)*cos(y);      yNew -= c1*cosh(x)*sin(y);
+}
+void static mgl_coth_var95(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal c1 = par[0]/(cosh(2*x)-cos(2*y));
+       xNew += c1*sinh(2*x);   yNew += c1*sin(2*y);
+}
+void static mgl_auger_var96(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal c1 = sin(par[3]*y), c2 = sin(par[3]*x);
+       c1 = x+par[2]*(par[4]*c1/2+fabs(x)*c1);
+       c2 = y+par[2]*(par[4]*c2/2+fabs(y)*c2);
+       xNew += par[0]*(x+par[1]*(c1-x));       yNew += par[0]*c2;
+}
+void static mgl_flux_var97(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par)
+{
+       mreal c1 = x+par[0], c2 = x-par[0], c3;
+       c3 = 0.5*(atan2(y, c2)-atan2(y, c1));
+       c1 = par[0]*(2+par[1])*sqrt(sqrt(y*y+c1*c1)/sqrt(y*y-c2*c2));
+       xNew += c1*cos(c3);     yNew += c1*sin(c3);
+}
 //-----------------------------------------------------------------------------
 typedef void (*flame_func)(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par);
-MGL_NO_EXPORT flame_func ffunc[mglFlameLAST] = {
+static flame_func ffunc[mglFlame2dLAST] = {
        mgl_linear_var0,        mgl_sinusoidal_var1,    mgl_spherical_var2,     mgl_swirl_var3,         mgl_horseshoe_var4,
        mgl_polar_var5,         mgl_handkerchief_var6,  mgl_heart_var7,         mgl_disc_var8,          mgl_spiral_var9,
        mgl_hyperbolic_var10,   mgl_diamond_var11,      mgl_ex_var12,           mgl_julia_var13,        mgl_bent_var14,
@@ -414,10 +801,20 @@ MGL_NO_EXPORT flame_func ffunc[mglFlameLAST] = {
        mgl_fan2_var25,                 mgl_rings2_var26,       mgl_eyefish_var27,      mgl_bubble_var28,       mgl_cylinder_var29,
        mgl_perspective_var30,  mgl_noise_var31,        mgl_juliaN_var32,       mgl_juliaScope_var33,   mgl_blur_var34,
        mgl_gaussian_var35,     mgl_radialBlur_var36,   mgl_pie_var37,          mgl_ngon_var38,         mgl_curl_var39,
-       mgl_rectangles_var40,   mgl_arch_var41,         mgl_tangent_var42,      mgl_square_var43,       mgl_rays_var43,
-       mgl_blade_var44,                mgl_secant_var45,       mgl_twintrian_var47,mgl_cross_var48     };
+       mgl_rectangles_var40,   mgl_arch_var41,         mgl_tangent_var42,      mgl_square_var43,       mgl_blade_var44,
+       mgl_secant_var45,               mgl_rays_var46,         mgl_twintrian_var47,mgl_cross_var48,    mgl_disc2_var49,
+       mgl_supershape_var50,   mgl_flower_var51,       mgl_conic_var52,        mgl_parabola_var53,     mgl_bent2_var54,
+       mgl_bipolar_var55,              mgl_boarders_var56,     mgl_butterfly_var57,mgl_cell_var58,             mgl_cpow_var59,
+       mgl_curve_var60,                mgl_edisc_var61,        mgl_elliptic_var62,     mgl_escher_var63,       mgl_foci_var64,
+       mgl_lazySusan_var65,    mgl_loonie_var66,       mgl_preBlur_var67,      mgl_modulus_var68,      mgl_oscope_var69,
+       mgl_polar2_var70,               mgl_popcorn2_var71,     mgl_scry_var72,         mgl_separation_var73,   mgl_split_var74,
+       mgl_splits_var75,               mgl_stripes_var76,      mgl_wedge_var77,        mgl_wedgeJulia_var78,   mgl_wedgeSph_var79,
+       mgl_whorl_var80,                mgl_waves2_var81,       mgl_exp_var82,          mgl_log_var83,          mgl_sin_var84,
+       mgl_cos_var85,                  mgl_tan_var86,          mgl_sec_var87,          mgl_csc_var88,          mgl_cot_var89,
+       mgl_sinh_var90,                 mgl_cosh_var91,         mgl_tanh_var92,         mgl_sech_var93,         mgl_csch_var94,
+       mgl_coth_var95,                 mgl_auger_var96,        mgl_flux_var97};
 //-----------------------------------------------------------------------------
-long MGL_NO_EXPORT mgl_flame_2d_point(HCDT A, HCDT F, mreal& x, mreal& y, mreal amax)
+long static mgl_flame_2d_point(HCDT A, HCDT F, mreal& x, mreal& y, mreal amax)
 {
        long i, n=A->GetNy(), m=F->GetNy(), last_func=0, l=F->GetNx();
        l = l>6?6:l;
@@ -427,15 +824,15 @@ long MGL_NO_EXPORT mgl_flame_2d_point(HCDT A, HCDT F, mreal& x, mreal& y, mreal
                sum_prob += A->v(6,i);
                if(r<sum_prob)  break;
        }
-       x1 = A->v(0,i)*x + A->v(1,i)*y + A->v(4,i);
-       y1 = A->v(2,i)*x + A->v(3,i)*y + A->v(5,i);
+       x1 = A->v(0,i)*x+A->v(1,i)*y+A->v(4,i);
+       y1 = A->v(2,i)*x+A->v(3,i)*y+A->v(5,i);
        x = y = 0;
        for(long j=0;j<m;j++)
        {
                int v=int(F->v(0,j,i)+0.5);
                mreal par[5] = {F->v(1,j,i),0,0,0,0};
                for(int k=2;k<l;k++)    par[k-1]=F->v(k,j,i);
-               if(v<0 || v>=mglFlameLAST)      {       v=0;    par[0]=1;       }
+               if(v<0 || v>=mglFlame2dLAST)    {       v=0;    par[0]=1;       }
                ffunc[v](x,y,x1,y1,par);        last_func=v;
        }
        return last_func;
@@ -447,7 +844,7 @@ HMDT MGL_EXPORT mgl_data_flame_2d(HCDT A, HCDT F, long n, long skip)
        mreal amax=0;
        for(long i=0; i<A->GetNy(); i++)        amax += A->v(6,i);
        if(amax<=0)     return 0;
-       
+
        mglData *f = new mglData(3,n);
        mreal x = 0, y = 0;
        for(long i=0; i<skip; i++)      mgl_flame_2d_point(A, F, x, y,amax);
index 61b2a33162f2d96f684333629773c54db3006dbb..211201caa496d170209c9fc97112920b1673f920 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;
 }
 //-----------------------------------------------------------------------------
@@ -249,3 +250,43 @@ template <class Treal> void mgl_gspline_init(long n, const mreal *x, const Treal
        delete []a;     delete []b;
 }
 //-----------------------------------------------------------------------------
+struct mglEqTxT\r
+{\r
+       std::vector<std::string> str;\r
+       HAEX *eqC;\r
+       HMEX *eqR;\r
+       const char *var;\r
+\r
+       mglEqTxT(const char *vars=0):eqC(0),eqR(0),var(vars)    {}\r
+       ~mglEqTxT()\r
+       {\r
+               if(eqR) {       for(size_t i=0;i<str.size();i++)        mgl_delete_expr(eqR[i]);        delete []eqR;   }\r
+               if(eqC) {       for(size_t i=0;i<str.size();i++)        mgl_delete_cexpr(eqC[i]);       delete []eqC;   }\r
+       }\r
+       void FillStr(const char *eqs)\r
+       {\r
+               const char *f=eqs;\r
+               while(1)\r
+               {\r
+                       const char *g = strchr(f,';');\r
+                       if(g)   str.push_back(std::string(f,g-f));\r
+                       else    {       str.push_back(f);       break;  }\r
+                       f = g+1;\r
+               }\r
+       }\r
+       void FillReal(const char *eqs)\r
+       {\r
+               FillStr(eqs);   size_t n = str.size();\r
+               if(n==0)        return;\r
+               eqR = new HMEX[n];\r
+               for(size_t i=0;i<n;i++) eqR[i] = mgl_create_expr(str[i].c_str());\r
+       }\r
+       void FillCmplx(const char *eqs)\r
+       {\r
+               FillStr(eqs);   size_t n = str.size();\r
+               if(n==0)        return;\r
+               eqC = new HAEX[n];\r
+               for(size_t i=0;i<n;i++) eqC[i] = mgl_create_cexpr(str[i].c_str());\r
+       }\r
+};\r
+//-----------------------------------------------------------------------------\r
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 1fae550168bd3ba3494585e495a5feb12ce21029..93a0231e146fed0113d50a2579271fbdc1d0d686 100644 (file)
@@ -49,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
@@ -68,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
@@ -82,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
@@ -113,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
@@ -145,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
@@ -167,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
@@ -183,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
@@ -211,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
@@ -228,7 +225,7 @@ struct ObjXYZs {
                        return point_index;\r
                }\r
        }\r
-  \r
+\r
 };\r
 \r
 struct ObjTriangle {\r
@@ -257,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
@@ -284,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
@@ -300,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
@@ -359,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
@@ -398,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
@@ -415,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
@@ -427,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..3f1b15c86130dab894036cb9a9ffa28bd666bd74 100644 (file)
@@ -17,7 +17,8 @@ HMGL MGL_EXPORT mgl_create_graph_gl()
 uintptr_t MGL_EXPORT mgl_create_graph_gl_()\r
 {      return uintptr_t(new mglCanvasGL);      }\r
 //-----------------------------------------------------------------------------\r
-mglCanvasGL::mglCanvasGL() : mglCanvas(1,1)    {       Clf();  Zoom(0,0,1,1);  }\r
+mglCanvasGL::mglCanvasGL() : mglCanvas(1,1)\r
+{      Clf();  Zoom(0,0,1,1);  set(MGL_FULL_CURV);     }\r
 //-----------------------------------------------------------------------------\r
 mglCanvasGL::~mglCanvasGL(){}\r
 //-----------------------------------------------------------------------------\r
@@ -46,6 +47,16 @@ void mglCanvasGL::Finish()
 #define MGL_GL_TYPE    GL_FLOAT\r
 #endif\r
 \r
+       // Try to add smoothing\r
+       glEnable(GL_LINE_SMOOTH);\r
+       glEnable(GL_POLYGON_SMOOTH);\r
+       glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);\r
+       glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);\r
+       glEnable(GL_BLEND);\r
+       if((Flag&3)==1) glBlendFunc(GL_DST_COLOR, GL_ZERO);\r
+       else if((Flag&3)==2) glBlendFunc(GL_SRC_ALPHA, GL_ONE);\r
+       else glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);\r
+\r
        if(Prm.size()>0)\r
        {\r
                PreparePrim(0);\r
@@ -62,18 +73,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
@@ -98,7 +110,7 @@ bool mglCanvasGL::Alpha(bool enable)
                clr(MGL_ENABLE_ALPHA);\r
                glEnable(GL_DEPTH_TEST);\r
                glDisable(GL_ALPHA_TEST);\r
-               glDisable(GL_BLEND);\r
+//             glDisable(GL_BLEND);\r
        }\r
        return mglCanvas::Alpha(enable);\r
 }\r
@@ -106,7 +118,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 +138,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 +146,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 +228,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 +235,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,9 +455,9 @@ 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
+                               if(cs[3])       pnt_plot(x,y,q.z+1,cs,d->ObjId);\r
                        }*/\r
                case 'o':\r
                        for(long i=0;i<=20;i++) // TODO copy from mark_pix()?!\r
@@ -467,3 +478,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 ed9bf22c0f3b6e55dcb9ae2ae29a8fdd06850802..e235c8f48fb4f4a60d4063fbda2185477faa0b9d 100644 (file)
@@ -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, mglDataV &xx, mglDataV &yy, mglDataV &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 static 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, mglDataV &xx, mglDat
        return a;\r
 }\r
 //-----------------------------------------------------------------------------\r
-HCDT MGL_NO_EXPORT fill_slice_y(HMGL gr, double sv, HCDT a, mglDataV &xx, mglDataV &yy, mglDataV &zz, mglData &aa)\r
+HCDT static 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, mglDataV &xx, mglDat
        return a;\r
 }\r
 //-----------------------------------------------------------------------------\r
-HCDT MGL_NO_EXPORT fill_slice_z(HMGL gr, double sv, HCDT a, mglDataV &xx, mglDataV &yy, mglDataV &zz, mglData &aa)\r
+HCDT static 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
@@ -105,7 +107,7 @@ void MGL_EXPORT mgl_dens_x(HMGL gr, HCDT a, const char *sch, double sv, const ch
        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
@@ -117,7 +119,7 @@ void MGL_EXPORT mgl_dens_y(HMGL gr, HCDT a, const char *sch, double sv, const ch
        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
@@ -129,7 +131,7 @@ void MGL_EXPORT mgl_dens_z(HMGL gr, HCDT a, const char *sch, double sv, const ch
        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
@@ -174,7 +176,7 @@ void MGL_EXPORT mgl_cont_x_val(HMGL gr, HCDT v, HCDT a, const char *sch, double
 #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
@@ -200,7 +202,7 @@ void MGL_EXPORT mgl_cont_y_val(HMGL gr, HCDT v, HCDT a, const char *sch, double
 #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
@@ -226,7 +228,7 @@ void MGL_EXPORT mgl_cont_z_val(HMGL gr, HCDT v, HCDT a, const char *sch, double
 #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
@@ -309,7 +311,7 @@ void MGL_EXPORT mgl_contf_x_val(HMGL gr, HCDT v, HCDT a, const char *sch, double
 #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
@@ -330,7 +332,7 @@ void MGL_EXPORT mgl_contf_y_val(HMGL gr, HCDT v, HCDT a, const char *sch, double
 #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
@@ -351,7 +353,7 @@ void MGL_EXPORT mgl_contf_z_val(HMGL gr, HCDT v, HCDT a, const char *sch, double
 #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 35a560fdb5877d0a98238381aac6755789ff0347..0ca62207791d8eb382919d28611de979eb8ecb89 100644 (file)
 #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; }
 //-----------------------------------------------------------------------------
+void MGL_EXPORT mgl_progress_txt(int value, int maximal, HMGL)
+{
+       static int prev = 0;
+       if(value<=0 || value>=maximal)  {       printf("\n");   value=0;        }
+       else    for(int i=prev;i<value;i++)     printf("#");
+       prev = value;   fflush(stdout);
+}
+MGL_EXPORT void (*mgl_progress_func)(int value, int maximal, HMGL)=mgl_progress_txt;
+void MGL_EXPORT mgl_progress(int value, int maximal, HMGL gr)
+{      mgl_progress_func(value, maximal, gr);  }
+//-----------------------------------------------------------------------------
 mglFunc::mglFunc(long p, const wchar_t *f)
 {
        pos = p;        func = f;
        size_t i;
        for(i=0;(isalnum(f[i]) || f[i]=='_');i++);
-       narg = wcstol(f+i+1,0,0);       func = func.substr(0,i);
+       narg = wcstol(f+i+1,0,0);       func.crop(0,i);
        if(narg<0 || narg>9)    narg=0;
 }
 //-----------------------------------------------------------------------------
-long mglParser::IsFunc(const std::wstring &name, int *na)
+long mglParser::IsFunc(const wchar_t *name, int *na)
 {
        for(size_t i=0;i<func.size();i++)
        {
@@ -54,26 +101,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());
@@ -94,62 +134,92 @@ const mglCommand *mglParser::FindCommand(const char *com) const
 //-----------------------------------------------------------------------------
 const mglCommand *mglParser::FindCommand(const wchar_t *com) const
 {
-       size_t s = 15<mgl_wcslen(com)?15:mgl_wcslen(com);
-       char cmd[16];   wcstombs(cmd,com,s+1);  cmd[s]=0;
+       char cmd[33]="";
+       size_t s = wcstombs(0,com,0);   // NOTE: command name should be less than 32
+       if(s<32)        {       wcstombs(cmd,com,s+1);  cmd[s]=0;       }
        return FindCommand(cmd);
 }
 //-----------------------------------------------------------------------------
 // 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 i;
        const char *id="dsn";
        std::string k;
-       for(i=0;i<n;i++)
-       {
-               k += id[a[i].type];
-               size_t len = wcstombs(NULL,a[i].w.c_str(),0)+1;
-               char *buf = new char[len];      memset(buf,0,len);
-               wcstombs(buf,a[i].w.c_str(),len);
-               a[i].s = buf;   delete []buf;
-       }
+       for(long i=0;i<n;i++)   k += id[a[i].type];
        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;      Variant = 0;
-       Skip=Stop=for_br=false;
-       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;
+       Skip=Stop=false;        StarObhID = 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);
@@ -160,7 +230,7 @@ mglParser::mglParser(bool setsize)
 //-----------------------------------------------------------------------------
 mglParser::~mglParser()
 {
-       DeleteAll();    delete []fval;
+       DeleteAll();
        for(size_t i=0;i<NumList.size();i++)    // force delete built-in variables
                if(NumList[i])  delete NumList[i];
        NumList.clear();
@@ -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]);
@@ -242,7 +312,8 @@ mglDataA *mglParser::FindVar(const wchar_t *name)
 {
        if(name[0]=='!')        name = name+1;  // ignore complex prefix
        for(size_t i=0;i<DataList.size();i++)
-               if(DataList[i] && DataList[i]->s==name) return DataList[i];
+               if(DataList[i] && !wcscmp(DataList[i]->Name(),name))
+                       return DataList[i];
        return 0;
 }
 //-----------------------------------------------------------------------------
@@ -250,9 +321,9 @@ mglDataA *mglParser::AddVar(const wchar_t *name)
 {      // TODO add list of forbidden names (like function names)
        mglDataA *d=FindVar(name);
        if(name[0]=='!' && dynamic_cast<mglDataC*>(d)==0)
-       {       d = new mglDataC;       d->s=(name+1);  DataList.push_back(d);  }
+       {       d = new mglDataC;       d->Name(name+1);        DataList.push_back(d);  }
        else if(!d)
-       {       d = new mglData;        d->s = name;    DataList.push_back(d);  }
+       {       d = new mglData;        d->Name(name);  DataList.push_back(d);  }
        return d;
 }
 //-----------------------------------------------------------------------------
@@ -272,7 +343,7 @@ mglNum *mglParser::AddNum(const wchar_t *name)
 //-----------------------------------------------------------------------------
 int MGL_LOCAL_PURE mglFindArg(const std::wstring &str)
 {
-       register long l=0,k=0;
+       long l=0,k=0;
        const size_t s=str.length();
        for(size_t i=0;i<s;i++)
        {
@@ -288,14 +359,10 @@ int MGL_LOCAL_PURE mglFindArg(const std::wstring &str)
        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;
@@ -319,52 +386,93 @@ void mglParser::FillArg(mglGraph *gr, int k, std::wstring *arg, mglArg *a)
                else if(str[0]=='\'')   // this is string (simplest case)
                {
                        a[n-1].type = 1;
-                       std::wstring &w=str,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(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(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(str[i]=='+' && str[i-1]=='\'')
+                                       {       op=3;   ii=i+1; }
+                                       else if(str[i]==',' && str[i+1]=='!')
+                                       {
+                                               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(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=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].s += s[i].c_str();
+                               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].s += 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].s += buf;        delete d;
+                               }
+                               else if(id[i]==3)
+                               {
+                                       HMDT d = mglFormulaCalc(s[i], this, DataList);
+                                       a[n-1].s[a[n-1].s.length()-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].s.length()))   a[n-1].s = a[n-1].s[v];
+                                       else    a[n-1].s = L"";
                                }
-                               else    a[n-1].w += w[i];
                        }
                }
                else if(str[0]=='{')
                {       // this is temp data
                        mglData *u=new mglData;
                        std::wstring s = str.substr(1,str.length()-2);
-                       a[n-1].w = u->s = L"/*"+s+L"*/";
-                       a[n-1].type = 0;
+                       a[n-1].s = L"/*"+s+L"*/";
+                       a[n-1].type = 0;        u->Name(a[n-1].s.w);
                        ParseDat(gr, s, *u);    a[n-1].d = u;
                        u->temp=true;   DataList.push_back(u);
                }
                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;  }
+               {       a[n-1].type=0;  a[n-1].d=v;     a[n-1].s=v->Name();     }
                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;        }
+               {       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].s = f->s;        }
                else if(str[0]=='!')    // complex array is asked
                {       // parse all numbers and formulas by unified way
                        HADT d = mglFormulaCalcC(str.substr(1), this, DataList);
@@ -378,7 +486,7 @@ void mglParser::FillArg(mglGraph *gr, int k, std::wstring *arg, mglArg *a)
                        }
                        else
                        {
-                               a[n-1].w = L"/*"+str+L"*/";
+                               a[n-1].s = L"/*"+str+L"*/";
                                d->temp=true;   DataList.push_back(d);
                                a[n-1].type = 0;        a[n-1].d = d;
                        }
@@ -396,7 +504,7 @@ void mglParser::FillArg(mglGraph *gr, int k, std::wstring *arg, mglArg *a)
                        }
                        else
                        {
-                               a[n-1].w = L"/*"+str+L"*/";
+                               a[n-1].s = L"/*"+str+L"*/";
                                d->temp=true;   DataList.push_back(d);
                                a[n-1].type = 0;        a[n-1].d = d;
                        }
@@ -408,9 +516,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;
@@ -485,8 +591,8 @@ void mglParser::PutArg(std::wstring &str, bool def)
        while(pos<str.length())
        {
                wchar_t ch = str[pos+1];
-               if(ch>='0' && ch<='9')  str.replace(pos,2,par[ch-'0']);
-               else if(ch>='a' && ch<='z')     str.replace(pos,2,par[ch-'a'+10]);
+               if(ch>='0' && ch<='9')  str.replace(pos,2,par[ch-'0'].w);
+               else if(ch>='a' && ch<='z')     str.replace(pos,2,par[ch-'a'+10].w);
                else if(ch=='$')        str.replace(pos,2,L"\uffff");
                else str.replace(pos,1,L"\uffff");
                pos = str.find('$',def?10:0);
@@ -508,7 +614,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);
@@ -525,8 +634,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;
                }
@@ -564,8 +672,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] = ' ';
@@ -573,23 +680,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();
+       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
@@ -597,8 +692,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)
                {
@@ -644,13 +741,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)
@@ -666,56 +756,36 @@ 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"variant"))
-               {
-                       int res=1;
-                       if(k==2 && a[0].type==2)        {       SetVariant(a[0].v);     res=0;  }
-                       delete []a;     return res;
-               }
                if(!arg[0].compare(L"call"))
                {
                        n = 1;
                        if(a[0].type==1)
                        {
                                int na=0;
-                               a[0].s.assign(a[0].w.begin(),a[0].w.end());
-                               n=-IsFunc(a[0].w.c_str(),&na);
+                               n=-IsFunc(a[0].s.w,&na);
                                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].s.w,k-2,na);
                                        buf[63]=0;      gr->SetWarn(-1,buf);    n = 1;
                                }
                                else if(n)
                                {
-                                       mglFnStack fn;                  fn.pos = pos;
+                                       mglFnStack fn;                  fn.pos = pos;   fn.stk = stack.size();
                                        for(int i=0;i<10;i++)   {       fn.par[i] = par[i];     par[i]=L"";     }
                                        for(int i=1;i<k-1;i++)  AddParam(i,arg[i+1].c_str());
                                        fn_stack.push_back(fn); n--;
                                }
                                else if(AllowFileIO)    // disable external scripts if AllowFileIO=false
                                {
-                                       FILE *fp = fopen(a[0].s.c_str(),"rt");
+                                       FILE *fp = fopen(a[0].s.s,"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].w);
                                                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].w);
                                                DataList.swap(prs->DataList);   NumList.swap(prs->NumList);
                                                prs->Cmd=0;     delete prs;     fclose(fp);
                                        }
@@ -724,6 +794,32 @@ int mglParser::Parse(mglGraph *gr, std::wstring str, long pos)
                        }
                        delete []a;     return n;
                }
+               if(!arg[0].compare(L"if") && k>3 && !arg[2].compare(L"then"))
+               {
+                       bool cond=false;        n=0;
+                       if(a[0].type==2)        cond = (a[0].v!=0);
+                       else if(a[0].type==0)
+                       {       cond = a[0].d->FindAny((m>1 && a[1].type==1) ? a[1].s.s:"u");   }
+                       if(cond)
+                       {       // alocate new arrays and execute the command itself
+                               n = FlowExec(gr, arg[3].c_str(),k-4,a+3);
+                               if(!n && !skip())
+                               {
+                                       n = PreExec(gr, k-4, &(arg[3]), a+3);
+                                       if(n>0) n--;
+                                       else if(!arg[3].compare(L"setsize") && !AllowSetSize)   n = 2;
+                                       else    n = Exec(gr, arg[3].c_str(),k-4,a+3, k>3?arg[4]:L"", opt.c_str());
+                               }
+                               else    n = skip()?0:n-1;
+                       }
+                       delete []a;     DeleteTemp();   return n;
+               }
+               if(!arg[0].compare(L"do"))
+               {
+                       mglPosStack st(MGL_ST_LOOP);
+                       st.pos = pos;   st.par = -1;    st.ind = -1;
+                       stack.push_back(st);    delete []a;     return n;
+               }
                if(!arg[0].compare(L"for"))
                {
                        if(k<2) {       delete []a;     return 1;       }
@@ -732,34 +828,30 @@ int mglParser::Parse(mglGraph *gr, std::wstring str, long pos)
                        int r = ch-'0';
                        if(ch>='a' && ch<='z')  r = 10+ch-'a';
 //                     int r = int(a[0].v);
+                       mglPosStack st(MGL_ST_LOOP);
                        if(arg[1][1]==0 && (r>=0 && r<40))
                        {
-                               if(a[1].type==0)
-                               {
-                                       n=0;            fval[r] = *(a[1].d);
-                                       fval[r].nx *= fval[r].ny*fval[r].nz;
-                               }
+                               if(a[1].type==0)        {       st.v = *(a[1].d);       n=0;    }
                                else if(a[1].type==2 && a[2].type==2 && a[2].v>a[1].v)
                                {
                                        mreal step = a[3].type==2?a[3].v:1;
                                        mm = int(step>0 ? (a[2].v-a[1].v)/step : 0);
-                                       if(mm>0)
+                                       if(mm>=0)
                                        {
-                                               n=0;    fval[r].Create(mm+1);
-                                               for(int ii=0;ii<mm+1;ii++)
-                                                       fval[r].a[ii] = a[1].v + step*ii;
+                                               n=0;    st.v.Create(mm+1);
+                                               for(int ii=0;ii<mm+1;ii++)      st.v.a[ii] = a[1].v + step*ii;
                                        }
                                }
                                if(n==0)
                                {
-                                       for(int i=39;i>0;i--)
-                                       {       for_stack[i]=for_stack[i-1];    if_for[i]=if_for[i-1];  }
-                                       for_stack[0] = r+1;             fval[r].nz = pos;       if_for[0]=if_pos;
-                                       wchar_t buf[32];                mglprintf(buf,32,L"%g",fval[r].a[0]);
-                                       AddParam(r, buf);       fval[r].ny = 1;
+                                       st.pos = pos;   st.par = r;     st.ind = 1;
+                                       st.v.nx *= st.v.ny*st.v.nz;     st.v.ny=st.v.nz=1;
+                                       wchar_t buf[32];        mglprintf(buf,32,L"%g",st.v.a[0]);
+                                       AddParam(r, buf);
                                }
                        }
-                       delete []a;     return n;
+                       if(n)   st.state = MGL_ST_BREAK;
+                       stack.push_back(st);    delete []a;     return n;
                }
                // alocate new arrays and execute the command itself
                n = PreExec(gr, k, &(arg[0]), a);
@@ -768,10 +860,7 @@ int mglParser::Parse(mglGraph *gr, std::wstring str, long pos)
                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
-       for(size_t i=0;i<DataList.size();i++)   if(DataList[i] && DataList[i]->temp)
-       {       mglDataA *u=DataList[i];        DataList[i]=0;  delete u;       }
-       return n;
+       DeleteTemp();   return n;
 }
 //-----------------------------------------------------------------------------
 // return values: 0 - OK, 1 - wrong arguments, 2 - wrong command, 3 - string too long, 4 -- unclosed string
@@ -788,7 +877,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
@@ -798,11 +887,7 @@ int mglParser::ParseDat(mglGraph *gr, std::wstring str, mglData &res)
                int i;
                std::string kk;
                const char *id="dsn";
-               for(i=0;i<k;i++)
-               {
-                       kk += id[a[i].type];
-                       a[i].s.assign(a[i].w.begin(),a[i].w.end());
-               }
+               for(i=0;i<k;i++)        kk += id[a[i].type];
                const mglCommand *rts=FindCommand(arg[0].c_str());
                if(!rts || rts->type!=4)        n = 2;
                else n = rts->exec(gr, k, a, kk.c_str(), 0);
@@ -826,88 +911,127 @@ int mglParser::FlowExec(mglGraph *, const std::wstring &com, long m, mglArg *a)
        }
        else if(!Skip && !com.compare(L"if"))
        {
-               int cond;
-               if(a[0].type==2)
-               {       n = 0;  cond = (a[0].v!=0)?3:0; }
-               else if(a[0].type==0)
+               bool cond=0;    n=1;
+               if(m>2 && a[1].type==0 && !wcscmp(a[1].d->Name(),L"then"))
+               {       n = -1; a[1].d->temp=true;      }       // NOTE: ugly hack :(
+               else if(a[0].type==2)
+               {       n = 0;  cond = (a[0].v!=0);     }
+               else    n = TestCond(m, a[0], a[1], cond);
+               if(n==0)
+               {       mglPosStack st(cond?MGL_ST_TRUE:MGL_ST_FALSE);  stack.push_back(st);    }
+       }
+       else if(!Skip && !com.compare(L"while"))
+       {
+               n=1;    if(stack.size())
                {
-                       n = 0;  a[1].s.assign(a[1].w.begin(),a[1].w.end());
-                       cond = a[0].d->FindAny((m>1 && a[1].type==1) ? a[1].s.c_str():"u")?3:0;
+                       mglPosStack &st = stack.back();
+                       if(st.state==MGL_ST_LOOP)
+                       {
+                               bool cond = false;
+                               n = TestCond(m, a[0], a[1], cond);
+                               if(cond)
+                               {
+                                       if(st.ind<0)    n = -st.pos-1;  // do-while loop
+                                       else if(st.ind<st.v.GetNN())    // next iteration
+                                       {
+                                               wchar_t buf[32];        mglprintf(buf,32,L"%g",st.v.a[st.ind]);
+                                               AddParam(st.par, buf);  st.ind++;       n = -st.pos-1;
+                                       }
+                                       else    stack.pop_back();       // finish
+                               }
+                               else    stack.pop_back();
+                       }
+                       else if(st.state==MGL_ST_BREAK)
+                       {       stack.pop_back();       n=0;    }
                }
-               else n = 1;
-               if(n==0)
-               {       if_stack[if_pos] = cond;        if_pos = if_pos<39 ? if_pos+1 : 39;     }
        }
        else if(!Skip && !com.compare(L"endif"))
-       {       if_pos = if_pos>0 ? if_pos-1 : 0;       n = 0;  }
+       {
+               if(stack.size() && stack.back().state<MGL_ST_LOOP)
+               {       stack.pop_back();       n=0;    }
+               else    n = 1;
+       }
        else if(!Skip && !com.compare(L"else"))
        {
-               if(if_pos>0)
-               {       n=0; if_stack[if_pos-1] = (if_stack[if_pos-1]&2)?2:3;   }
-               else n = 1;
+               n=1;    if(stack.size())
+               {
+                       mglPosStack &st = stack.back();
+                       if(st.state<MGL_ST_LOOP)        n=0;
+                       if(st.state==MGL_ST_TRUE)       st.state = MGL_ST_DONE;
+                       if(st.state==MGL_ST_FALSE)      st.state = MGL_ST_TRUE;
+               }
        }
        else if(!Skip && !com.compare(L"elseif"))
        {
-               int cond;
-               if(if_pos<1 || m<1)     n = 1;
-               else if(if_stack[if_pos-1]&2)   {       n = 0;  cond = 2;       }
-               else if(a[0].type==2)
-               {       n = 0;  cond = (a[0].v!=0)?3:0; }
-               else if(a[0].type==0)
+               n=1;    if(stack.size())
                {
-                       n = 0;  a[1].s.assign(a[1].w.begin(),a[1].w.end());
-                       cond = a[0].d->FindAny((m>1 && a[1].type==1) ? a[1].s.c_str():"u")?3:0;
+                       mglPosStack &st = stack.back();
+                       if(st.state<MGL_ST_LOOP)        n=0;
+                       if(st.state==MGL_ST_TRUE)       st.state = MGL_ST_DONE;
+                       if(st.state==MGL_ST_FALSE)
+                       {
+                               bool cond=false;
+                               n = TestCond(m, a[0], a[1], cond);
+                               if(cond)        st.state = MGL_ST_TRUE;
+                       }
                }
-               else n = 1;
-               if(n==0)        if_stack[if_pos-1] = cond;
        }
        else if(!ifskip() && !Skip && !com.compare(L"break"))
        {
-               if(if_pos==if_for[0])   if_pos = if_pos>0 ? if_pos-1 : 0;
-       }
-       else if(!skip() && !com.compare(L"return"))
-       {
-               if(fn_stack.size()<1)   return 2;
-               const mglFnStack &fn=fn_stack.back();
-               for(int i=0;i<10;i++)   par[i]=fn.par[i];
-               n = -fn.pos-1;  fn_stack.pop_back();
+               bool nf=true;
+               size_t nn = stack.size();
+               if(nn)  for(size_t i=nn;i>0;i--)
+                       if(stack[i-1].state==MGL_ST_LOOP)
+                       {       nf=false;       stack[i-1].state=MGL_ST_BREAK;  break;  }
+               n = nf?1:0;
        }
        else if(!ifskip() && !Skip && !com.compare(L"next"))
        {
-               if(if_pos==if_for[0])   if_pos = if_pos>0 ? if_pos-1 : 0;
-               int r = for_stack[0]-1;
-               n = for_stack[0] ? 0:1;
-               if(for_stack[0])
+               n=1;
+               if(stack.size())
                {
-                       if(fval[r].ny<fval[r].nx && !for_br)
+                       mglPosStack &st = stack.back();
+                       if(st.state==MGL_ST_LOOP)
                        {
-                               wchar_t buf[32];                mglprintf(buf,32,L"%g",fval[r].a[fval[r].ny]);
-                               AddParam(r, buf);       fval[r].ny += 1;
-                               n = -fval[r].nz-1;
-                       }
-                       else
-                       {
-                               for(int i=0;i<39;i++)
-                               {       for_stack[i]=for_stack[i+1];    if_for[i]=if_for[i+1];  }
-                               for_stack[39] = 0;      for_br=false;
+                               if(st.ind<0)    n = -st.pos-1;  // do-while loop
+                               else if(st.ind<st.v.GetNN())    // next iteration
+                               {
+                                       wchar_t buf[32];        mglprintf(buf,32,L"%g",st.v.a[st.ind]);
+                                       AddParam(st.par, buf);  st.ind++;       n = -st.pos-1;
+                               }
+                               else    {       stack.pop_back();       n=0;    }       // finish
                        }
+                       else if(st.state==MGL_ST_BREAK)
+                       {       stack.pop_back();       n=0;    }
                }
        }
        else if(!ifskip() && !Skip && !com.compare(L"continue"))
        {
-               if(if_pos==if_for[0])   if_pos = if_pos>0 ? if_pos-1 : 0;
-               int r = for_stack[0]-1;
-               n = for_stack[0] ? 0:1;
-               if(for_stack[0])
+               bool nf=true;
+               size_t nn = stack.size();
+               if(nn)  for(size_t i=nn;i>0;i--)
                {
-                       if(fval[r].ny<fval[r].nx)
+                       mglPosStack &st = stack[i-1];
+                       if(st.state==MGL_ST_LOOP)
                        {
-                               wchar_t buf[32];                mglprintf(buf,32,L"%g",fval[r].a[fval[r].ny]);
-                               AddParam(r, buf);       fval[r].ny += 1;
-                               n = -fval[r].nz-1;
+                               if(st.ind<0)    n = -st.pos-1;  // do-while loop
+                               else if(st.ind<st.v.GetNN())    // next iteration
+                               {
+                                       wchar_t buf[32];        mglprintf(buf,32,L"%g",st.v.a[st.ind]);
+                                       AddParam(st.par, buf);  st.ind++;       n = -st.pos-1;
+                               }
+                               else    {       st.state = MGL_ST_BREAK;        n=0;    }       // finish
+                               nf=false;       stack.resize(i);        break;
                        }
-                       else    for_br = true;
                }
+               if(nf)  n=1;
+       }
+       else if(!skip() && !com.compare(L"return"))
+       {
+               if(fn_stack.size()<1)   return 2;
+               const mglFnStack &fn=fn_stack.back();
+               for(int i=0;i<10;i++)   par[i]=fn.par[i];
+               n = -fn.pos-1;  fn_stack.pop_back();
        }
        return n+1;
 }
@@ -927,27 +1051,27 @@ void mglParser::Execute(mglGraph *gr, int n, const wchar_t **text)
        if(n<1 || text==0)      return;
        long res=0;
        char buf[64];
-       for_br=Skip=false;      if_pos=0;       ScanFunc(0);    fn_stack.clear();
+       Skip=false;     ScanFunc(0);    fn_stack.clear();       stack.clear();
        for(long i=0;i<n;i++)   ScanFunc(text[i]);
        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)
@@ -991,23 +1115,23 @@ void mglParser::DeleteVar(const char *name)
 //-----------------------------------------------------------------------------
 void mglParser::DeleteVar(const wchar_t *name)
 {
-       for(size_t i=0;i<DataList.size();i++)   if(DataList[i] && DataList[i]->s==name)
-       {       mglDataA *u=DataList[i];        DataList[i]=0;  delete u;       }
+       for(size_t i=0;i<DataList.size();i++)
+               if(DataList[i] && !wcscmp(DataList[i]->Name(),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;   }
@@ -1078,6 +1202,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)
 {
@@ -1102,7 +1234,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;       }
@@ -1130,22 +1262,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)
@@ -1330,3 +1452,50 @@ void MGL_EXPORT mgl_rk_step_(uintptr_t *p, const char *eqs, const char *vars, do
 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},
+       {"do",_("Begin of do-while loop"),"do", 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},
+       {"while",_("Condition of do-while loop"),"while val|Dat ['cond']", 0, 6},
+{"","","",NULL,0}};
+//-----------------------------------------------------------------------------
index 637f01472ebf4356ed3150169d217bf24c9ca69f..c766bfd703ab078a2067c3d151c29848a84f7351 100644 (file)
@@ -22,6 +22,7 @@
 #include "mgl2/eval.h"\r
 #include "mgl2/thread.h"\r
 #include "mgl2/base.h"\r
+#include "interp.hpp"\r
 const double GAMMA=0.1;        ///< value for damping\r
 HADT MGL_NO_EXPORT mglFormulaCalcC(const char *str, const std::vector<mglDataA*> &head);\r
 //-----------------------------------------------------------------------------\r
@@ -29,7 +30,7 @@ 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
+void static mgl_operator_exp(long n, const 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
@@ -37,144 +38,135 @@ void MGL_NO_EXPORT mgl_operator_exp(long n, dual *h, dual *a, dual *f)
        for(long j=0;j<n;j++)\r
        {\r
                long jp = (j+1)%n;\r
-               mreal h1=real(h[n*j]), h2=real(h[n-1+n*j]);\r
-               mreal g1=(h1+real(h[n*jp]))/2, g2=(h2+real(h[n-1+n*jp]))/2;\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(dual(0,h1+i*k1));\r
-                       f[2*j+1] += a[i]*exp(dual(0,g1+i*k2));\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
-                       mreal hh = real(h[i-i1+n*j]);\r
-                       f[2*j] += a[i]*exp(dual(0,hh+i*k1));\r
-                       f[2*j+1] += a[i]*exp(dual(0,(hh+real(h[i-i1+n*jp]))/2+i*k2));\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(dual(0,h2+i*k1));\r
-                       f[2*j+1] += a[i]*exp(dual(0,g2+i*k2));\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
-               register long ii=i-i1;\r
-               if(ii<0)        ii=0;   if(ii>n-1)      ii=n-1;\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 = real(h[ii+n*j]), g1 = (h1+real(h[ii+n*((j+1)%n)]))/2;\r
-                       a[i] += f[2*j]*exp(dual(0,h1-kk*j));\r
-                       a[i] += f[2*j+1]*exp(dual(0,g1-kk*(j+0.5)));\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_hrm(long n, dual *h, dual *a, dual *f, dual *g, dual *o)\r
+void static mgl_operator_lin(long n, mreal *h, dual *a, dual *f, dual *g, dual *o, const dual *iexp)\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
+#pragma omp parallel for\r
        for(long j=0;j<n;j++)\r
        {\r
                long jp = (j+1)%n;\r
-               mreal h1=real(h[n*j]), h2=real(h[n-1+n*j]);\r
-               mreal g1=h1+real(h[n*jp])/2., g2=h2+real(h[n-1+n*jp])/2.;\r
-               mreal k1=M_PI*2*j/n, k2 = M_PI*(2*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
+               const dual *ie1=iexp+4*n*j, *ie2=iexp+2*n*(2*j+1);\r
                for(long i=0;i<i1;i++)\r
                {\r
-                       dual e1=exp(dual(0,i*k1)), e2=exp(dual(0,i*k2));\r
+                       dual e1=ie1[i], e2=ie2[i];\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 = real(h[i-i1+n*j]);\r
-                       mreal gg = hh+real(h[i-i1+n*jp])/2.;\r
-                       dual e1=exp(dual(0,i*k1)), e2=exp(dual(0,i*k2));\r
+                       mreal hh = tanh(h[i-i1+n*j]);\r
+                       mreal gg = (hh+tanh(h[i-i1+n*jp]))/2;\r
+                       dual e1=ie1[i], e2=ie2[i];\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
+                       dual e1=ie1[i], e2=ie2[i];\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
+#pragma omp parallel for\r
        for(long i=0;i<2*n;i++)\r
        {\r
-               register long ii=i-i1;\r
-               if(ii<0)        ii=0;   if(ii>n-1)      ii=n-1;\r
-               double kk=M_PI*2*i/n;\r
+               long ii=i-i1;\r
+               if(ii<0)        ii=0;\r
+               if(ii>n-1)      ii=n-1;\r
+               const dual *ie1=iexp+2*n*i;\r
+//             double kk=M_PI*2*i/n;\r
                for(long j=0;j<n;j++)\r
                {\r
-                       mreal h1 = real(h[ii+n*j]);\r
-                       mreal g1 = h1+real(h[ii+n*((j+1)%n)])/2.;\r
-                       dual e1=exp(dual(0,-j*kk)), e2=exp(dual(0,-kk*(j+0.5)));\r
+                       mreal h1 = tanh(h[ii+n*j]);\r
+                       mreal g1 = (h1+tanh(h[ii+n*((j+1)%n)]))/2;\r
+                       dual e1=conj(ie1[2*j]), e2=conj(ie1[2*j+1]);\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
-inline dual isqrt(dual a)\r
-{      mreal b=imag(a);        return b>=0?dual(sqrt(b),0):dual(0,sqrt(-b));   }\r
-void MGL_NO_EXPORT mgl_operator_lin(long n, dual *h, dual *a, dual *f, dual *g, dual *o)\r
+HADT static mgl_apde_calc_ham(HMDT hs, bool old, const char *func, std::vector<mglDataA*> list, const mreal dd)\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
+       HADT ham = mglFormulaCalcC(func, list); mgl_datac_mul_num(ham,dd);\r
+       const long nx = ham->nx;\r
+       if(old)\r
        {\r
-               long jp = (j+1)%n;\r
-               dual h1=tanh(isqrt(h[n*j])), h2=tanh(isqrt(h[n-1+n*j]));\r
-               dual g1=tanh(h1+isqrt(h[n*jp]))/2., g2=tanh(h2+isqrt(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
-                       dual hh = tanh(isqrt(h[i-i1+n*j]));\r
-                       dual gg = tanh(hh+isqrt(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
+               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
-                       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
+                       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
-       memset(o,0,2*n*sizeof(dual));\r
-#pragma omp parallel for\r
-       for(long i=0;i<2*n;i++)\r
+       else\r
        {\r
-               register long ii=i-i1;\r
-               if(ii<0)        ii=0;   if(ii>n-1)      ii=n-1;\r
-               double kk=M_PI*2*i/n;\r
-               for(long j=0;j<n;j++)\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 h1 = tanh(isqrt(h[ii+n*j]));\r
-                       dual g1 = tanh(h1+isqrt(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
+                       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
@@ -187,10 +179,12 @@ HADT MGL_EXPORT mgl_pde_adv_c(HMGL gr, const char *func, HCDT ini_re, HCDT ini_i
        if(ini_im->GetNx() != nx)               {       gr->SetWarn(mglWarnDim,"PDE");  return 0;       }       // Wrong dimensions\r
 \r
        mglDataC *res=new mglDataC(nx, nt);\r
-       mglDataC u(nx); u.s = L"u";\r
+       mglData hIm(nx,nx);     // for advanced damping calculation\r
+       mglDataC u(nx); u.Name(L"u");\r
        mglDataV x(nx,nx), y(nx,nx), r(nx,nx);\r
-       mglDataW p(nx,nx);      p.s = L"p";\r
-       x.s = L"x";     y.s = L"y";     r.s=L"#$mgl";\r
+       mglDataW p(nx,nx);      p.Name(L"p");\r
+       bool old = func[0]==';';        if(old) func=func+1;\r
+       x.Name(L"x");   y.Name(L"y");   r.Name(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
        std::vector<mglDataA*> list;\r
@@ -210,23 +204,26 @@ HADT MGL_EXPORT mgl_pde_adv_c(HMGL gr, const char *func, HCDT ini_re, HCDT ini_i
        }\r
        bool have_y = mglchr(func,'y');\r
        HADT ham;\r
-       if(!have_y)\r
-       {       ham = mglFormulaCalcC(func, list);      mgl_datac_mul_num(ham,dd);      }\r
+       if(!have_y)             ham = mgl_apde_calc_ham(&hIm, old, func, list, dd);\r
+       dual *iexp = new dual[4*nx*nx];\r
+#pragma omp parallel for collapse(2)\r
+       for(long j=0;j<2*nx;j++)        for(long i=0;i<2*nx;i++)\r
+               iexp[i+2*nx*j] = exp(dual(0,(M_PI*i*j)/nx));\r
        for(long k=0;k<nt;k++)\r
        {\r
                memcpy(u.a,a+nx/2,nx*sizeof(dual));\r
                memcpy(res->a+k*nx,a+nx/2,nx*sizeof(dual));\r
                if(have_y)\r
-               {       y.Fill(k*dt);   ham = mglFormulaCalcC(func, list);      mgl_datac_mul_num(ham,dd);      }\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,ham->a,a,f,g,s);\r
-               mgl_operator_lin(nx,ham->a,s,f,g,s);\r
+               mgl_operator_lin(nx,hIm.a,a,f,g,s,iexp);\r
+               mgl_operator_lin(nx,hIm.a,s,f,g,s,iexp);\r
 #pragma omp parallel for\r
                for(long i=0;i<2*nx;i++)\r
-                       a[i] = (a[i]-s[i]/mreal(8*nx*nx))*exp(-dmp[i]*dt)/mreal(2*nx);\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
+       delete []a;     delete []f;     delete []dmp;   delete []iexp;\r
        if(!have_y)     delete ham;\r
        gr->LoadState();        return res;\r
 }\r
@@ -249,55 +246,6 @@ uintptr_t MGL_EXPORT mgl_pde_adv_(uintptr_t* gr, const char *ham, uintptr_t* ini
        uintptr_t res = uintptr_t(mgl_pde_adv(_GR_, s, _DA_(ini_re), _DA_(ini_im), *dz, *k0, o));\r
        delete []o;     delete []s;     return res;     }\r
 //-----------------------------------------------------------------------------\r
-/*HADT MGL_EXPORT mgl_pde_adv_3d_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
-       mglPoint Min=gr->Min, Max=gr->Max;\r
-       long nx=ini_re->GetNx(), ny=ini_re->GetNy(), nz = long((Max.z-Min.z)/dz)+1;\r
-       if(nx<2 || nz<2 || Max.x==Min.x)                        // Too small data\r
-       {       gr->SetWarn(mglWarnLow,"PDE");  return 0;       }\r
-       if(ini_im->GetNx()*ini_im->GetNy() != nx*ny)// Wrong dimensions\r
-       {       gr->SetWarn(mglWarnDim,"PDE");  return 0;       }\r
-       mglDataC *res=new mglDataC(nz, nx, ny);\r
-\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";     z.s = L"z";     r.s=L"#$mgl";\r
-       //z.Fill(f->zz);\r
-       mreal dx = (Max.x-Min.x)/(nx-1), dy = ny>1?(Max.y-Min.y)/(ny-1):0;\r
-       mreal dp = M_PI/(Max.x-Min.x), dq = M_PI/(Max.y-Min.y);\r
-       double dd = k0*dz;\r
-       x.Fill(Min.x,Max.x,'x');        p.Freq(dp/k0,'x');\r
-       y.Fill(Min.y,Max.y,'y');        q.Freq(dq/k0,'y');\r
-\r
-       ddual *a = new ddual[4*nx*ny];  // Add "damping" area\r
-       ddual *f = new ddual[4*nx*ny];  // Effective "spectrum"\r
-       memset(a,0,4*nx*ny*sizeof(ddual));\r
-       memset(f,0,4*nx*ny*sizeof(ddual));\r
-#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
-               a[i0] = dual(ini_re->v(i,j), ini_im->v(i,j));\r
-               res->a[nz*(i+nx*j)] = a[i0];\r
-       }\r
-       double *dmp = new double[4*nx*ny];\r
-       memset(dmp,0,4*nx*ny*sizeof(double));\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
-               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
-               if(j>3*ny/2)    dmp[i0] += gamma*mgl_ipow((j-3*ny/2-1)/(ny/2.),2);\r
-       }\r
-       ddual *Hdat = new ddual[nx*nx*ny*ny];\r
-       for(long k=1;k<nz;k++)\r
-       {\r
-       }\r
-}*/\r
-//-----------------------------------------------------------------------------\r
 //\r
 //             Simplified PDE series\r
 //\r
@@ -310,15 +258,15 @@ struct mgl_pde_ham
        double xx,yy,xs,ys,dx,dy,dq,dp,zz;\r
        double dd;\r
 };\r
-void MGL_NO_EXPORT mgl_pde_hprep(const mgl_pde_ham *f)\r
+void static mgl_pde_hprep(const mgl_pde_ham *f)\r
 {\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
-       z.s = L"z";     z.Fill(f->zz);\r
+       x.Name(L"x");   y.Name(L"y");   p.Name(L"p");   q.Name(L"q");   r.Name(L"#$mgl");\r
+       z.Name(L"z");   z.Fill(f->zz);\r
        dual dd(0,f->dd);\r
-       mglData u(nx,ny);       u.s = L"u";\r
+       mglData u(nx,ny);       u.Name(L"u");\r
 #pragma omp parallel for\r
        for(long i=0;i<nx*ny;i++)       u.a[i] = abs(f->a[i]);\r
        std::vector<mglDataA*> list;\r
@@ -355,7 +303,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
@@ -378,14 +326,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
@@ -418,22 +366,22 @@ 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
                else\r
 #pragma omp parallel for\r
                        for(long i=0;i<4*nx*ny;i++)     huv[i] -= hh0;\r
-                       // solve equation\r
+               // solve equation\r
                if(ny>1)\r
 #pragma omp parallel\r
                {\r
                        void *wsx = mgl_fft_alloc_thr(2*nx), *wsy = mgl_fft_alloc_thr(2*ny);\r
 #pragma omp for\r
-                       for(long i=0;i<4*nx*ny;i++)     a[i] *= exp(hxy[i])*exp(-double(dmp[i]*dz));\r
+                       for(long i=0;i<4*nx*ny;i++)     a[i] *= exp(hxy[i]-double(dmp[i]*dz));\r
 #pragma omp for\r
                        for(long i=0;i<2*ny;i++)        mgl_fft((double *)(a+i*2*nx), 1, 2*nx, wtx, wsx, false);\r
 #pragma omp for\r
@@ -455,7 +403,7 @@ HADT MGL_EXPORT mgl_pde_solve_c(HMGL gr, const char *ham, HCDT ini_re, HCDT ini_
                {\r
                        void *wsx = mgl_fft_alloc_thr(2*nx);\r
 #pragma omp for\r
-                       for(long i=0;i<4*nx*ny;i++)     a[i] *= exp(hxy[i])*exp(-double(dmp[i]*dz));\r
+                       for(long i=0;i<4*nx*ny;i++)     a[i] *= exp(hxy[i]-double(dmp[i]*dz));\r
 #pragma omp for\r
                        for(long i=0;i<2*ny;i++)        mgl_fft((double *)(a+i*2*nx), 1, 2*nx, wtx, wsx, false);\r
 #pragma omp for\r
@@ -465,7 +413,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
@@ -498,40 +446,65 @@ uintptr_t MGL_EXPORT mgl_pde_solve_(uintptr_t* gr, const char *ham, uintptr_t* i
 //             ODE series\r
 //\r
 //-----------------------------------------------------------------------------\r
-struct mglOdeTxt       {       long n; HMEX *eq;       const char *var;        };\r
 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
-       for(long i=0;i<p->n;i++)\r
+       mglEqTxT *p=(mglEqTxT *)par;\r
+       mreal vars[MGL_VS];\r
+       size_t n = p->str.size();\r
+       for(size_t i=0;i<n;i++)\r
        {       char ch = p->var[i];    if(ch>='a' && ch<='z')  vars[ch-'a']=x[i];      }\r
 #pragma omp parallel for\r
-       for(long i=0;i<p->n;i++)\r
-               dx[i] = mgl_expr_eval_v(p->eq[i], vars);\r
+       for(long i=0;i<long(n);i++)\r
+               dx[i] = mgl_expr_eval_v(p->eqR[i], vars);\r
 }\r
 HMDT MGL_EXPORT mgl_ode_solve_str(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
-       mglOdeTxt par;  par.var=var;\r
-       par.n = strlen(var);\r
-       par.eq = new HMEX[par.n];\r
-       char *buf = new char[len+1], *f=buf, *g=f;      memcpy(buf,func,len+1);\r
-       mreal *xx = new mreal[par.n];\r
-       for(long i=0;i<par.n;i++)\r
+       mglEqTxT par;\r
+       par.var=var;    par.FillReal(func);\r
+       size_t n = par.str.size();\r
+       mreal *xx = new mreal[n];\r
+       for(size_t i=0;i<n;i++) xx[i] = x0?x0->vthr(i):0;\r
+       HMDT res = mgl_ode_solve_ex(mgl_txt_func,n,xx,dt,tmax,&par,NULL);\r
+       delete []xx;    return res;\r
+}\r
+//-----------------------------------------------------------------------------\r
+void MGL_NO_EXPORT mgl_txt_funcC(const mreal *x, mreal *dx, void *par)\r
+{\r
+       mglEqTxT *p=(mglEqTxT *)par;\r
+       dual vars[MGL_VS];\r
+       size_t n = p->str.size();\r
+       for(size_t i=0;i<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<long(n);i++)\r
        {\r
-               xx[i] = x0?x0->vthr(i):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_expr(f);\r
-               f = g;\r
+               dual r = mgl_cexpr_eval_v(p->eqC[i], vars);\r
+               dx[2*i] = real(r);      dx[2*i+1] = imag(r);\r
        }\r
-       HMDT res = mgl_ode_solve_ex(mgl_txt_func,par.n,xx,dt,tmax,&par,NULL);\r
-       for(long i=0;i<par.n;i++)       mgl_delete_expr(par.eq[i]);\r
-       delete []par.eq;        delete []buf;   delete []xx;\r
-       return res;\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
+       mglEqTxT par;   par.var=var;\r
+       par.var=var;    par.FillCmplx(func);\r
+       size_t n = par.str.size();\r
+       mreal *xx = new mreal[2*n];\r
+       const mglDataC *c = dynamic_cast<const mglDataC *>(x0);\r
+       for(size_t i=0;i<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
+       }\r
+       HMDT res = mgl_ode_solve_ex(mgl_txt_funcC,2*n,xx,dt,tmax,&par,NULL);\r
+       delete []xx;\r
+       const long nn=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
@@ -540,24 +513,27 @@ HMDT MGL_EXPORT mgl_ode_solve_ex(void (*func)(const mreal *x, mreal *dx, void *p
        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
+       bool good=true;\r
+       long k;\r
+       for(k=1;k<nt && good;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++)\r
+               {       res->a[i+n*k] = x[i];   if(mgl_isbad(x[i]))     good=false;     }\r
        }\r
        delete []x;     delete []k1;    delete []k2;    delete []k3;    delete []v;\r
+       res->Crop(0,k,'y');\r
        return res;\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -565,7 +541,7 @@ HMDT MGL_EXPORT mgl_ode_solve_ex(void (*func)(const mreal *x, mreal *dx, void *p
 //             Common functions for quasioptical calculations\r
 //\r
 //-----------------------------------------------------------------------------\r
-void MGL_NO_EXPORT mgl_ray3d(const mreal *in, mreal *out, void *par)\r
+void static mgl_ray3d(const mreal *in, mreal *out, void *par)\r
 {\r
        mglFormula *eqs = (mglFormula *)par;\r
        const char *v="xyzpqvt";\r
@@ -598,10 +574,9 @@ struct mgl_ap
        mgl_ap()        {       memset(this,0,sizeof(mgl_ap));  }\r
 };\r
 //-----------------------------------------------------------------------------\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
+void static 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
@@ -665,7 +640,7 @@ struct mgl_qo2d_ham
        void *par;\r
 };\r
 //-----------------------------------------------------------------------------\r
-MGL_NO_EXPORT void *mgl_qo2d_hprep(void *par)\r
+static void *mgl_qo2d_hprep(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        mgl_qo2d_ham *f = (mgl_qo2d_ham *)t->v;\r
@@ -679,9 +654,9 @@ MGL_NO_EXPORT void *mgl_qo2d_hprep(void *par)
        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
@@ -711,7 +686,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
@@ -728,7 +703,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
@@ -777,7 +752,7 @@ HMDT MGL_EXPORT mgl_qo2d_func(ddual (*ham)(mreal u, mreal x, mreal y, mreal px,
        HMDT out = mgl_datac_abs(res);  delete res;     return out;\r
 }\r
 //-----------------------------------------------------------------------------\r
-ddual MGL_NO_EXPORT mgl_ham2d(mreal u, mreal x, mreal y, mreal px, mreal py, void *par)\r
+ddual static mgl_ham2d(mreal u, mreal x, mreal y, mreal px, mreal py, void *par)\r
 {\r
        mglFormula *h = (mglFormula *)par;\r
        mreal var[MGL_VS];      memset(var,0,MGL_VS*sizeof(mreal));\r
@@ -818,7 +793,7 @@ struct mgl_qo3d_ham
        void *par;\r
 };\r
 //-----------------------------------------------------------------------------\r
-MGL_NO_EXPORT void *mgl_qo3d_hprep(void *par)\r
+static void *mgl_qo3d_hprep(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        mgl_qo3d_ham *f = (mgl_qo3d_ham *)t->v;\r
@@ -830,11 +805,11 @@ MGL_NO_EXPORT void *mgl_qo3d_hprep(void *par)
 #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
@@ -853,7 +828,7 @@ MGL_NO_EXPORT void *mgl_qo3d_hprep(void *par)
        return 0;\r
 }\r
 //-----------------------------------------------------------------------------\r
-MGL_NO_EXPORT void *mgl_qo3d_post(void *par)\r
+static void *mgl_qo3d_post(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        mgl_qo3d_ham *f = (mgl_qo3d_ham *)t->v;\r
@@ -863,7 +838,7 @@ MGL_NO_EXPORT void *mgl_qo3d_post(void *par)
 #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
@@ -897,7 +872,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
@@ -923,7 +898,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
@@ -1000,7 +975,7 @@ HMDT MGL_EXPORT mgl_qo3d_func(ddual (*ham)(mreal u, mreal x, mreal y, mreal z, m
        HMDT out = mgl_datac_abs(res);  delete res;     return out;\r
 }\r
 //-----------------------------------------------------------------------------\r
-ddual MGL_NO_EXPORT mgl_ham3d(mreal u, mreal x, mreal y, mreal z, mreal px, mreal py, mreal pz, void *par)\r
+ddual static mgl_ham3d(mreal u, mreal x, mreal y, mreal z, mreal px, mreal py, mreal pz, void *par)\r
 {\r
        mglFormula *h = (mglFormula *)par;\r
        mreal var[MGL_VS];      memset(var,0,MGL_VS*sizeof(mreal));\r
@@ -1030,7 +1005,7 @@ uintptr_t MGL_EXPORT mgl_qo3d_solve_(const char *ham, uintptr_t* ini_re, uintptr
 //             mglJacobian series\r
 //\r
 //-----------------------------------------------------------------------------\r
-MGL_NO_EXPORT void *mgl_jacob2(void *par)\r
+static void *mgl_jacob2(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        const long nx=t->p[0], ny=t->p[1];\r
@@ -1041,12 +1016,12 @@ 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
@@ -1067,17 +1042,17 @@ 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
 }\r
 //-----------------------------------------------------------------------------\r
-MGL_NO_EXPORT void *mgl_jacob3(void *par)\r
+static void *mgl_jacob3(void *par)\r
 {\r
        mglThreadD *t=(mglThreadD *)par;\r
        const long nx=t->p[0], ny=t->p[1], nz=t->p[2];\r
@@ -1088,16 +1063,16 @@ 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
@@ -1120,17 +1095,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
@@ -1146,7 +1121,7 @@ uintptr_t MGL_EXPORT mgl_jacobian_3d_(uintptr_t* x, uintptr_t* y, uintptr_t* z)
 //     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
+void static 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
@@ -1154,7 +1129,7 @@ void MGL_NO_EXPORT mgl_progonka_sr(HCDT A, HCDT B, HCDT C, HCDT D, mreal *dat, l
        aa[0] = -c0/b0; bb[0] = d0/b0;\r
        for(long i=1;i<n;i++)\r
        {\r
-               register long ii=i0+di*i, dd=id+di*i, tt = id+di*((i+1)%n);\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
@@ -1163,7 +1138,7 @@ void MGL_NO_EXPORT mgl_progonka_sr(HCDT A, HCDT B, HCDT C, HCDT D, mreal *dat, l
        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
+void static 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
@@ -1171,7 +1146,7 @@ void MGL_NO_EXPORT mgl_progonka_pr(HCDT A, HCDT B, HCDT C, HCDT D, mreal *dat, l
        aa[0] =-c0/b0;  bb[0] = d0/b0;  gg[0] =-a0/b0;\r
        for(long i=1;i<n;i++)\r
        {\r
-               register long ii=i0+di*i, il=id+di*((i+1)%n), dd=id+di*i;\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
@@ -1188,7 +1163,7 @@ void MGL_NO_EXPORT mgl_progonka_pr(HCDT A, HCDT B, HCDT C, HCDT D, mreal *dat, l
        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
+void static 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
@@ -1205,7 +1180,7 @@ void MGL_NO_EXPORT mgl_progonka_hr(HCDT A, HCDT B, HCDT C, HCDT D, mreal *dat, l
                aa[0] = -c0/b0; bb[0] = d0/b0;\r
                for(long i=1;i<=j;i++)\r
                {\r
-                       register long ii=i0+j+di*i, dd=id+j+di*i;\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
@@ -1221,7 +1196,7 @@ void MGL_NO_EXPORT mgl_progonka_hr(HCDT A, HCDT B, HCDT C, HCDT D, mreal *dat, l
                aa[0] = -c0/b0; bb[0] = d0/b0;\r
                for(long i=1;i<=j;i++)\r
                {\r
-                       register long ii=i1+j1-di*i, dd=d1+j1-di*i;\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
@@ -1306,68 +1281,68 @@ uintptr_t MGL_EXPORT mgl_data_tridmat_(uintptr_t *A, uintptr_t *B, uintptr_t *C,
        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
+void static 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 = (2.-b0)*d0-c0*D->vcthr(id+di);\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
-               register long ii=i0+di*i, dd=id+di*i, tt = id+di*((i+1)%n);\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)+(2.-b)*D->vcthr(dd)-c*D->vcthr(tt):D->vcthr(dd);\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
+void static 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))+(2.-b0)*d0-c0*D->vcthr(id+di);\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
-               register long ii=i0+di*i, il=id+di*((i+1)%n), dd=id+di*i;\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)+(2.-b)*D->vcthr(dd)-c*D->vcthr(il):D->vcthr(dd);\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]/(1.-gg[n-1]), Q=aa[n-1]/(1.-gg[n-1]);\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]/(1.-aa[0]);\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
+void static 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?(2.-b0):1.);\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?(2.-b0):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 = (2.-b0)*d0-c0*D->vcthr(id+j+di);\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
-                       register long ii=i0+j+di*i, dd=id+j+di*i;\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)+(2.-b)*D->vcthr(dd)-c*D->vcthr(dd+di):D->vcthr(dd);\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
@@ -1377,13 +1352,13 @@ void MGL_NO_EXPORT mgl_progonka_hc(HCDT A, HCDT B, HCDT C, HCDT D, dual *dat, lo
                // 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 = (2.-b0)*d0-c0*D->vcthr(d1+j1-di);\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
-                       register long ii=i1+j1-di*i, dd=d1+j1-di*i;\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)+(2.-b)*D->vcthr(dd)-c*D->vcthr(dd-di):D->vcthr(dd);\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
index 60ded14bb4fe499516a9d0f14f57357591c7fbad..ba0223ae7a9973b0dd31260c8276ed6a8f28af1b 100644 (file)
 #include <omp.h>\r
 #endif\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((omp_lock_t*)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((omp_lock_t*)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((omp_lock_t*)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((omp_lock_t*)lockClf);\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
@@ -368,10 +32,10 @@ void mglCanvas::pxl_combine(long id, long n, const void *)
 #endif\r
        for(long i=id;i<n;i+=mglNumThr)\r
        {\r
-               unsigned char *cc = C+12*i, c[4];\r
-               memcpy(c,GB+4*i,4);     // memcpy(c,BDef,4);\r
-               combine(c,cc+8);        combine(c,cc+4);\r
-               combine(c,cc);          memcpy(G4+4*i,c,4);\r
+               unsigned char *cc = C+12*i, c[4], *b=GB+4*i, *g=G4+4*i;\r
+               c[0]=b[0];      c[1]=b[1];      c[2]=b[2];      c[3]=b[3];\r
+               combine(c,cc+8);        combine(c,cc+4);        combine(c,cc);\r
+               g[0]=c[0];      g[1]=c[1];      g[2]=c[2];      g[3]=c[3];\r
        }\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -380,7 +44,9 @@ void mglCanvas::pxl_memcpy(long id, long n, const void *)
 #if !MGL_HAVE_PTHREAD\r
 #pragma omp parallel for\r
 #endif\r
-       for(long i=id;i<n;i+=mglNumThr) memcpy(G4+4*i,C+12*i,4);\r
+       for(long i=id;i<n;i+=mglNumThr)\r
+       {       unsigned char *g=G4+4*i, *c=C+12*i;\r
+               g[0]=c[0];      g[1]=c[1];      g[2]=c[2];      g[3]=c[3];      }\r
 }\r
 //-----------------------------------------------------------------------------\r
 void mglCanvas::pxl_backgr(long id, long n, const void *)\r
@@ -389,13 +55,14 @@ void mglCanvas::pxl_backgr(long id, long n, const void *)
 #pragma omp parallel for\r
 #endif\r
        for(long i=id;i<n;i+=mglNumThr)\r
-       {       unsigned char c[4];     memcpy(c,GB+4*i,4);     combine(c,G4+4*i);      memcpy(G+3*i,c,3);      }\r
+       {       unsigned char *b=GB+4*i, c[4]={b[0],b[1],b[2],b[3]}, *g=G+3*i;\r
+               combine(c,G4+4*i);      g[0]=c[0];      g[1]=c[1];      g[2]=c[2];      }\r
 }\r
 //-----------------------------------------------------------------------------\r
 void mglCanvas::pxl_transform(long id, long n, const void *)\r
 {\r
-       const mreal *b = Bp.b;\r
-       const mreal dx = -Bp.x*Width/2, dy = -Bp.y*Height/2, dz = Depth/2.;\r
+       const float *b = Bp.b;\r
+       const float dx = -Bp.x*Width/2, dy = -Bp.y*Height/2, dz = Depth/2.;\r
 #if !MGL_HAVE_PTHREAD\r
 #pragma omp parallel for\r
 #endif\r
@@ -404,11 +71,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
@@ -428,49 +95,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
@@ -482,157 +113,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
@@ -640,8 +172,8 @@ void mglCanvas::pxl_primpx(long id, long n, const void *)   // NOTE this variant i
 //-----------------------------------------------------------------------------\r
 void mglCanvas::pxl_dotsdr(long id, long n, const void *)\r
 {\r
-       const mreal *b = Bp.b;\r
-       const mreal dx = -Bp.x*Width/2, dy = -Bp.y*Height/2, dz = Depth/2.;\r
+       const float *b = Bp.b;\r
+       const float dx = -Bp.x*Width/2, dy = -Bp.y*Height/2, dz = Depth/2.;\r
 #if !MGL_HAVE_PTHREAD\r
 #pragma omp parallel for\r
 #endif\r
@@ -650,118 +182,23 @@ 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
+               unsigned char *c = C+12*i0;\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
+               {       Z[3*i0]=z;      c[0]=r[0];      c[1]=r[1];      c[2]=r[2];      c[3]=r[3];      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((omp_lock_t*)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((omp_lock_t*)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
@@ -771,7 +208,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
@@ -782,25 +219,26 @@ 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
        {\r
                long i0=x+Width*(Height-1-y);\r
                unsigned char *cc = C+12*i0, c[4];\r
-               memcpy(c,ci,4);\r
+               c[0]=ci[0];     c[1]=ci[1];     c[2]=ci[2];     c[3]=ci[3];\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
+               {\r
+                       if(cc[3]<ci[3])\r
+                       {       cc[0]=c[0];     cc[1]=c[1];     cc[2]=c[2];     cc[3]=c[3];     }\r
+                       return;\r
+               }\r
                if(zf<0)        // add fog\r
                {\r
                        int d = int(255.f-255.f*exp(5.f*zf));\r
@@ -815,79 +253,94 @@ void mglCanvas::pnt_plot(long x,long y,mreal z,const unsigned char ci[4], int ob
                                zz[2] = zz[1];  combine(cc+8,cc+4);\r
                                if(z>=zz[0])\r
                                {       zz[1] = zz[0];  zz[0] = z;      OI[i0]=obj_id;\r
-                                       memcpy(cc+4,cc,4);      memcpy(cc,c,4);         }\r
-                               else    {       zz[1] = z;      memcpy(cc+4,c,4);       }\r
+                                       cc[4]=cc[0];    cc[0]=c[0];     cc[5]=cc[1];    cc[1]=c[1];\r
+                                       cc[6]=cc[2];    cc[2]=c[2];     cc[7]=cc[3];    cc[3]=c[3];     }\r
+                               else\r
+                               {       zz[1] = z;      cc[4]=c[0];     cc[5]=c[1];     cc[6]=c[2];     cc[7]=c[3];     }\r
                        }\r
                        else\r
                        {\r
                                if(z>=zz[2])    // shift point on slice down and paste new point\r
                                {       zz[2] = z;      combine(cc+8,c);        }\r
                                else            // point below the background\r
-                               {       combine(c,cc+8);        memcpy(cc+8,c,4);       }\r
+                               {       combine(c,cc+8);        cc[8]=c[0];     cc[9]=c[1];     cc[10]=c[2];cc[11]=c[3];        }\r
                        }\r
                }\r
                if(Quality&MGL_DRAW_FAST)\r
                {\r
                        if(z>=zz[0])    // point upper the background\r
                        {       zz[0]=z;        combine(cc,c);  OI[i0]=obj_id;  }\r
+                       else\r
+                       {       combine(c,cc);  cc[6]=cc[2];    cc[2]=c[2];     cc[7]=cc[3];    cc[3]=c[3];     }\r
                }\r
                else\r
                {\r
                        if(z>=zz[0])    // point upper the background\r
-                       {       zz[0]=z;        memcpy(cc,c,4);         OI[i0]=obj_id;  }\r
+                       {       zz[0]=z;        cc[0]=c[0];     cc[1]=c[1];     cc[2]=c[2];     cc[3]=c[3];     OI[i0]=obj_id;  }\r
                }\r
        }\r
 }\r
 //-----------------------------------------------------------------------------\r
-unsigned char* mglCanvas::col2int(const mglPnt &p,unsigned char *r, int obj_id) const\r
+inline float mexp(float x)     //      exp(-x) ~ 1/(1+x+x^2/2+x^3/4+x^5/40)\r
+{      return 1.f/(1.f+x*(1.f+x*x/2.f));       }\r
+//{    return 1/(1+x*(1+x/2*(1+x/2*(1+x*x/10))));      }\r
+//{    return exp(-x); }\r
+void mglCanvas::col2int(const mglPnt &p,unsigned char *r, int obj_id) const\r
 {\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
-       const size_t nl = p.sub>=0?p.sub:1-p.sub;\r
+       if(p.a<=0)      {       r[0]=r[1]=r[2]=r[3]=0;  return; }\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
        dif = glob?DifBr:Sub[nl].DifBr;\r
+       const mglLight *gll = glob?light:Sub[nl].light;\r
 \r
        if(mgl_isnum(p.u+p.v+p.w))\r
        {\r
-               float d0,d1,d2,nn;\r
                for(long i=0;i<10;i++)\r
                {\r
-                       const mglLight &ll=glob?light[i]:Sub[nl].light[i];\r
+                       const mglLight &ll=gll[i];\r
                        if(!ll.n)       continue;\r
                        if(mgl_isnan(ll.q.x))           // source at infinity\r
                        {\r
-                               nn = 2*(p.u*ll.p.x+p.v*ll.p.y+p.w*ll.p.z) / (p.u*p.u+p.v*p.v+p.w*p.w+1e-6);\r
-                               d0 = ll.p.x - p.u*nn;\r
-                               d1 = ll.p.y - p.v*nn;\r
-                               d2 = ll.p.z - p.w*nn;\r
-                               nn = 1 + d2/sqrt(d0*d0+d1*d1+d2*d2+1e-6);\r
+                               const mglPoint &lp = ll.p;\r
+                               float nn = 2*(p.u*lp.x+p.v*lp.y+p.w*lp.z) / (p.u*p.u+p.v*p.v+p.w*p.w+1e-6f);\r
+                               float d0 = lp.x - p.u*nn;\r
+                               float d1 = lp.y - p.v*nn;\r
+                               float d2 = lp.z - p.w*nn;\r
+                               nn = 1 + d2/sqrt(d0*d0+d1*d1+d2*d2+1e-6f);\r
 \r
-                               nn = exp(-ll.a*nn)*ll.b*2;\r
-                               b0 += nn*ll.c.r;\r
-                               b1 += nn*ll.c.g;\r
-                               b2 += nn*ll.c.b;\r
+//                             nn = exp(-ll.a*nn)*ll.b*2;\r
+                               nn = mexp(ll.a*nn)*ll.b*2.f;\r
+                               const mglColor &lc = ll.c;\r
+                               b0 += nn*lc.r;\r
+                               b1 += nn*lc.g;\r
+                               b2 += nn*lc.b;\r
                        }\r
                        else            // diffuse and specular light\r
                        {\r
-                               d0 = ll.q.x-p.x;        // direction to light source\r
-                               d1 = ll.q.y-p.y;\r
-                               d2 = ll.q.z-p.z;\r
-                               nn = 1+(d0*ll.p.x+d1*ll.p.y+d2*ll.p.z)/sqrt(d0*d0+d1*d1+d2*d2+1e-6);\r
-                               float bb = exp(-3*ll.a*nn);     nn = bb*dif*2;\r
-                               ar += nn*ll.c.r;\r
-                               ag += nn*ll.c.g;\r
-                               ab += nn*ll.c.b;\r
+                               const mglPoint &lp=ll.p, &lq=ll.q;\r
+                               float d0 = lq.x-p.x;    // direction to light source\r
+                               float d1 = lq.y-p.y;\r
+                               float d2 = lq.z-p.z;\r
+                               float nn = 1+(d0*lp.x+d1*lp.y+d2*lp.z)/sqrt(d0*d0+d1*d1+d2*d2+1e-6f);\r
+//                             float bb = exp(-3*ll.a*nn);     nn = bb*dif*2;\r
+                               float bb = mexp(3*ll.a*nn);     nn = bb*dif*2;\r
+                               const mglColor &lc = ll.c;\r
+                               ar += nn*lc.r;\r
+                               ag += nn*lc.g;\r
+                               ab += nn*lc.b;\r
 \r
-                               nn = 2*(p.u*d0+p.v*d1+p.w*d2) / (p.u*p.u+p.v*p.v+p.w*p.w+1e-6);\r
+                               nn = 2*(p.u*d0+p.v*d1+p.w*d2) / (p.u*p.u+p.v*p.v+p.w*p.w+1e-6f);\r
                                d0 -= p.u*nn;   d1 -= p.v*nn;   d2 -= p.w*nn;\r
-                               nn = 1 + d2/sqrt(d0*d0+d1*d1+d2*d2+1e-6);\r
+                               nn = 1 + d2/sqrt(d0*d0+d1*d1+d2*d2+1e-6f);\r
 \r
-                               nn = exp(-ll.a*nn)*bb*ll.b*2;\r
-                               b0 += nn*ll.c.r;\r
-                               b1 += nn*ll.c.g;\r
-                               b2 += nn*ll.c.b;\r
+//                             nn = exp(-ll.a*nn)*bb*ll.b*2;\r
+                               nn = mexp(ll.a*nn)*bb*ll.b*2.f;\r
+                               b0 += nn*lc.r;\r
+                               b1 += nn*lc.g;\r
+                               b2 += nn*lc.b;\r
                        }\r
                }\r
                b0 += (ar>1 ? 1:ar)*p.r;        // diffuse light\r
@@ -906,7 +359,7 @@ unsigned char* mglCanvas::col2int(const mglPnt &p,unsigned char *r, int obj_id)
        r[2] = (unsigned char)(255*b2);\r
 //     r[3] = get(MGL_ENABLE_ALPHA) ? (unsigned char)(255*p.a) : 255;\r
        r[3] = (unsigned char)((Quality&MGL_DRAW_NORM)?255*p.a:255);\r
-       return r;\r
+//     return r;\r
 }\r
 //-----------------------------------------------------------------------------\r
 /// color mixing: color c1 is under color c2 !!!\r
@@ -914,10 +367,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
+               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
@@ -932,7 +385,7 @@ 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
+                       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
@@ -941,24 +394,12 @@ void mglCanvas::combine(unsigned char *c1, const unsigned char *c2) const
        }\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
@@ -985,9 +426,9 @@ void mglCanvas::quad_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3,
        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,d->x1);   x2=mgl_min(x2,d->x2);\r
-       y1=mgl_max(y1,d->y1);   y2=mgl_min(y2,d->y2);\r
-//     if(x1>x2 || y1>y2)      return;\r
+       x1=mgl_imax(x1,d->x1);  x2=mgl_imin(x2,d->x2);\r
+       y1=mgl_imax(y1,d->y1);  y2=mgl_imin(y2,d->y2);\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
@@ -1001,19 +442,25 @@ void mglCanvas::quad_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3,
        const int oi = d->ObjId, ang=d->angle;\r
        const mreal pw = d->PenWidth;\r
        const uint64_t pd = d->PDef;\r
+       \r
+       mglPnt tmp(p1+d1+d2+d3), pp(p1);\r
+       if(mgl_isnan(tmp.u) && mgl_isnum(tmp.v))\r
+       {       pp.u = nr.x;    pp.v = nr.y;    pp.w = nr.z;\r
+               d1.u=d1.v=d1.w=d2.u=d2.v=d2.w=d3.u=d3.v=d3.w=0; }\r
+       \r
        for(long j=y1;j<=y2;j++)        for(long i=x1;i<=x2;i++)\r
        {\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
@@ -1022,58 +469,13 @@ void mglCanvas::quad_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3,
                                        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
-                               mglPnt p(p1+d1*u+d2*v+d3*(u*v));\r
-                               if(mgl_isnan(p.u) && mgl_isnum(p.v))\r
-                               {       p.u = nr.x;     p.v = nr.y;     p.w = nr.z;     }\r
-                               pnt_plot(i,j,p.z,col2int(p,r,oi),oi);\r
+                               mglPnt p(pp+d1*u+d2*v+d3*(u*v));        col2int(p,r,oi);\r
+                               if(r[3])        pnt_plot(i,j,p.z,r,oi);\r
                        }\r
                }\r
        }\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
@@ -1083,7 +485,7 @@ void mglCanvas::trig_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3,
        {       fast_draw(p1,p2,d);     fast_draw(p1,p3,d);     fast_draw(p2,p3,d);     return; }\r
        unsigned char r[4];\r
        long y1,x1,y2,x2;\r
-       const mglPnt d1(p2-p1), d2(p3-p1);\r
+       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;         // points lies on the same line\r
@@ -1096,7 +498,7 @@ void mglCanvas::trig_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3,
        y2 = long(mgl_max(p1.y>p2.y?p1.y:p2.y, p3.y));\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
-//     if(x1>x2 || y1>y2)      return;\r
+       if(x1>x2 || y1>y2)      return;\r
        // default normale\r
        const 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
        const float x0 = p1.x, y0 = p1.y;\r
@@ -1105,56 +507,42 @@ void mglCanvas::trig_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3,
        const int oi = d->ObjId, ang=d->angle;\r
        const mreal pw = d->PenWidth;\r
        const uint64_t pd = d->PDef;\r
+\r
+       mglPnt tp(p1+d1+d2), pp(p1);\r
+       if(mgl_isnan(tp.u) && mgl_isnum(tp.v))\r
+       {       pp.u = nr.x;    pp.v = nr.y;    pp.w = nr.z;\r
+               d1.u=d1.v=d1.w=d2.u=d2.v=d2.w=0;        }\r
+\r
        if(Quality&MGL_DRAW_NORM)       for(long j=y1;j<=y2;j++)        for(long i=x1;i<=x2;i++)\r
        {\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
-                       {       p.u = nr.x;     p.v = nr.y;     p.w = nr.z;     }\r
-                       pnt_plot(i,j,p.z+dz,col2int(p,r,oi),oi);\r
+                       mglPnt p(pp+d1*u+d2*v); col2int(p,r,oi);\r
+                       if(r[3])        pnt_plot(i,j,p.z+dz,r,oi);\r
                }\r
        }\r
        else\r
        {\r
                col2int(p1,r,oi);\r
-               float zz = p1.z+dz;\r
-               for(long j=y1;j<=y2;j++)        for(long i=x1;i<=x2;i++)\r
+               float zz = p1.z+dz, dz1=d1.z, dz2=d2.z;\r
+               if(r[3])        for(long j=y1;j<=y2;j++)        for(long i=x1;i<=x2;i++)\r
                {\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
+                               pnt_plot(i,j,zz+dz1*u+dz2*v,r,oi);\r
                        }\r
                }\r
        }\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
@@ -1174,31 +562,30 @@ void mglCanvas::line_draw(const mglPnt &p1, const mglPnt &p2, const mglDrawReg *
        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
        const float dd = hypot(d.x, d.y);\r
-//     if(x1>x2 || y1>y2 || dd<1e-5)   return;\r
-       if(dd<1e-5)     return;\r
+       if(x1>x2 || y1>y2 || dd<1e-5)   return;\r
 \r
        const float dxv = d.y/dd, dyv =-d.x/dd;\r
        const float dxu = d.x/dd, dyu = d.y/dd;\r
 \r
        const uint64_t pd = dr->PDef;\r
-       const mreal pp = dr->pPos;\r
+       const mreal pp = dr->pPos, V = (pw-1)*(pw-1)/4, S = (1-pw)/2;\r
        if(hor) for(long i=x1;i<=x2;i++)\r
        {\r
                y1 = int(p1.y+d.y*(i-p1.x)/d.x - pw - 10/dpw);\r
                y2 = int(p1.y+d.y*(i-p1.x)/d.x + pw + 10/dpw);\r
                y1=y1>dr->y1?y1:dr->y1; y2=y2<dr->y2?y2:dr->y2;\r
-               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
-                       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 & ((uint64_t)1<<long(fmod(pp+u/pw/1.5, 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
+                       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 += 16*u*u;    u=0;    }\r
+                       else if(u>dd)   {       v += 16*(u-dd)*(u-dd);  u=dd;   }\r
+                       if( pd & ((uint64_t)1<<(long(pp+u/pw)%16)) )\r
+                       {\r
+                               mglPnt p(p1+d*(u/dd));  col2int(p,r,oi);\r
+                               r[3] = v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
+                               if(r[3])        pnt_plot(i,j,p.z+dz,r,oi);\r
+                       }\r
                }\r
        }\r
        else    for(long j=y1;j<=y2;j++)\r
@@ -1206,28 +593,29 @@ void mglCanvas::line_draw(const mglPnt &p1, const mglPnt &p2, const mglDrawReg *
                x1 = int(p1.x+d.x*(j-p1.y)/d.y - pw - 10/dpw);\r
                x2 = int(p1.x+d.x*(j-p1.y)/d.y + pw + 10/dpw);\r
                x1=x1>dr->x1?x1:dr->x1; x2=x2<dr->x2?x2:dr->x2;\r
-               if(x1>x2)       continue;\r
-\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
-                       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 & ((uint64_t)1<<long(fmod(pp+u/pw/1.5, 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
+                       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 += 16*u*u;    u=0;    }\r
+                       else if(u>dd)   {       v += 16*(u-dd)*(u-dd);  u=dd;   }\r
+                       if( pd & ((uint64_t)1<<(long(pp+u/pw)%16)) )\r
+                       {\r
+                               mglPnt p(p1+d*(u/dd));  col2int(p,r,oi);\r
+                               r[3] = v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
+                               if(r[3])        pnt_plot(i,j,p.z+dz,r,oi);\r
+                       }\r
                }\r
        }\r
 }\r
 //-----------------------------------------------------------------------------\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
+       unsigned char *cc = C+12*i0;\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
+       {       Z[3*i0]=z;              OI[i0]=obj_id;\r
+               cc[0]=ci[0];    cc[1]=ci[1];    cc[2]=ci[2];    cc[3]=ci[3];    }\r
 }\r
 //-----------------------------------------------------------------------------\r
 void mglCanvas::fast_draw(const mglPnt &p1, const mglPnt &p2, const mglDrawReg *dr)\r
@@ -1249,38 +637,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 & ( (uint64_t)1<<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,35 +660,24 @@ void mglCanvas::pnt_draw(const mglPnt &p, const mglDrawReg *dr)
        const long s = long(pw+10/dpw+fabs(pw));\r
        const long i1=mgl_max(-s,dr->x1-p.x),i2=mgl_min(s,dr->x2-p.x);\r
        const long j1=mgl_max(-s,dr->y1-p.y),j2=mgl_min(s,dr->y2-p.y);\r
+       const mreal V = (pw-1)*(pw-1)/4, S = (1-pw)/2;\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
-               if(v>1+(pw-1)*(pw-1)/4) continue;\r
-               pnt_plot(p.x+i,p.y+j,p.z,cs,oi);\r
+               float v = i*i+j*j;\r
+               if(v>1+V)       continue;\r
+               if(cs[3])       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
-               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
+               float v = i*i+j*j;\r
+               cs[3] = v<V ? cc : mgl_sline(cc,dpw*(sqrt(v)+S));\r
+               if(cs[3])       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
@@ -1328,41 +685,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
+                       if(cs[3])       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
@@ -1371,8 +725,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
@@ -1386,27 +740,27 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
                                u = fabs(dx)-ss;        v = dy*dy+(u<0?0:u*u);\r
                                sum += v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
                                sum = sum>255?255:sum;  cs[3] = ca*sum/255;\r
-                               pnt_plot(i,j,q.z+1,cs,oi);\r
+                               if(cs[3])       pnt_plot(i,j,q.z+1,cs,oi);\r
                        }\r
                        break;\r
                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
                                sum += v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
                                sum = sum>255?255:sum;  cs[3] = ca*sum/255;\r
-                               pnt_plot(i,j,q.z+1,cs,oi);\r
+                               if(cs[3])       pnt_plot(i,j,q.z+1,cs,oi);\r
                        }\r
                        break;\r
                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
@@ -1422,38 +776,38 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
                                sum += v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
 \r
                                sum = sum>255?255:sum;  cs[3] = ca*sum/255;\r
-                               pnt_plot(i,j,q.z+1,cs,oi);\r
+                               if(cs[3])       pnt_plot(i,j,q.z+1,cs,oi);\r
                        }\r
                        break;\r
                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
                                sum += v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
                                sum = sum>255?255:sum;  cs[3] = ca*sum/255;\r
-                               pnt_plot(i,j,q.z+1,cs,oi);\r
+                               if(cs[3])       pnt_plot(i,j,q.z+1,cs,oi);\r
                        }\r
                        break;\r
                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
+                               if(cs[3])       pnt_plot(i,j,q.z+1,cs,oi);\r
                        }\r
                        break;\r
                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
@@ -1463,25 +817,25 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
                                u = fabs(dx)-ss;        v = (dy+ss)*(dy+ss)+(u<0?0:u*u);\r
                                sum += v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
                                sum = sum>255?255:sum;  cs[3] = ca*sum/255;\r
-                               pnt_plot(i,j,q.z+1,cs,oi);\r
+                               if(cs[3])       pnt_plot(i,j,q.z+1,cs,oi);\r
                        }\r
                        break;\r
                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
+                               if(cs[3])       pnt_plot(i,j,q.z+1,cs,oi);\r
                        }\r
                        break;\r
                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
@@ -1491,14 +845,14 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
                                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
                                sum = sum>255?255:sum;  cs[3] = ca*sum/255;\r
-                               pnt_plot(i,j,q.z+1,cs,oi);\r
+                               if(cs[3])       pnt_plot(i,j,q.z+1,cs,oi);\r
                        }\r
                        break;\r
                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
@@ -1506,14 +860,14 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
                                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
                                sum += v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
                                sum = sum>255?255:sum;  cs[3] = ca*sum/255;\r
-                               pnt_plot(i,j,q.z+1,cs,oi);\r
+                               if(cs[3])       pnt_plot(i,j,q.z+1,cs,oi);\r
                        }\r
                        break;\r
                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
@@ -1521,18 +875,18 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
                                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
                                sum += v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
                                sum = sum>255?255:sum;  cs[3] = ca*sum/255;\r
-                               pnt_plot(i,j,q.z+1,cs,oi);\r
+                               if(cs[3])       pnt_plot(i,j,q.z+1,cs,oi);\r
                        }\r
                        break;\r
                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
@@ -1541,14 +895,14 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
                                        sum += v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
                                        sum = sum>255?255:sum;  cs[3] = ca*sum/255;\r
                                }\r
-                               pnt_plot(i,j,q.z+1,cs,oi);\r
+                               if(cs[3])       pnt_plot(i,j,q.z+1,cs,oi);\r
                        }\r
                        break;\r
                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
@@ -1556,18 +910,18 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
                                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
                                sum += v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
                                sum = sum>255?255:sum;  cs[3] = ca*sum/255;\r
-                               pnt_plot(i,j,q.z+1,cs,oi);\r
+                               if(cs[3])       pnt_plot(i,j,q.z+1,cs,oi);\r
                        }\r
                        break;\r
                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
@@ -1576,14 +930,14 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
                                        sum += v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
                                        sum = sum>255?255:sum;  cs[3] = ca*sum/255;\r
                                }\r
-                               pnt_plot(i,j,q.z+1,cs,oi);\r
+                               if(cs[3])       pnt_plot(i,j,q.z+1,cs,oi);\r
                        }\r
                        break;\r
                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
@@ -1591,18 +945,18 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
                                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
                                sum += v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
                                sum = sum>255?255:sum;  cs[3] = ca*sum/255;\r
-                               pnt_plot(i,j,q.z+1,cs,oi);\r
+                               if(cs[3])       pnt_plot(i,j,q.z+1,cs,oi);\r
                        }\r
                        break;\r
                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
@@ -1611,14 +965,14 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
                                        sum += v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
                                        sum = sum>255?255:sum;  cs[3] = ca*sum/255;\r
                                }\r
-                               pnt_plot(i,j,q.z+1,cs,oi);\r
+                               if(cs[3])       pnt_plot(i,j,q.z+1,cs,oi);\r
                        }\r
                        break;\r
                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
@@ -1626,18 +980,18 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
                                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
                                sum += v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
                                sum = sum>255?255:sum;  cs[3] = ca*sum/255;\r
-                               pnt_plot(i,j,q.z+1,cs,oi);\r
+                               if(cs[3])       pnt_plot(i,j,q.z+1,cs,oi);\r
                        }\r
                        break;\r
                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
@@ -1646,14 +1000,14 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
                                        sum += v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
                                        sum = sum>255?255:sum;  cs[3] = ca*sum/255;\r
                                }\r
-                               pnt_plot(i,j,q.z+1,cs,oi);\r
+                               if(cs[3])       pnt_plot(i,j,q.z+1,cs,oi);\r
                        }\r
                        break;\r
                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
@@ -1661,189 +1015,39 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d)
                                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
                                sum += v<V ? 255 : mgl_sline(255,dpw*(sqrt(v)+S));\r
                                sum = sum>255?255:sum;  cs[3] = ca*sum/255;\r
-                               pnt_plot(i,j,q.z+1,cs,oi);\r
+                               if(cs[3])       pnt_plot(i,j,q.z+1,cs,oi);\r
                        }\r
                        break;\r
                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
+                               if(cs[3])       pnt_plot(i,j,q.z+1,cs,oi);\r
                        }\r
                        break;\r
                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
+                               if(cs[3])       pnt_plot(i,j,q.z+1,cs,oi);\r
                        }\r
                        break;\r
                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
-                               pnt_plot(i,j,q.z+1,cs,oi);\r
-                       }\r
-                       break;\r
-               }\r
-       }\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
+                               if(cs[3])       pnt_plot(i,j,q.z+1,cs,oi);\r
                        }\r
                        break;\r
                }\r
@@ -1862,8 +1066,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
@@ -1882,199 +1086,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 static 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
+       if(r[3])        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
 \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
+       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
-       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
@@ -2196,10 +1417,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
@@ -2215,3 +1435,83 @@ 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
+       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_imax(x1,0);      x2=mgl_imin(x2,Width);\r
+       y1=mgl_imax(y1,0);      y2=mgl_imin(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
+       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
diff --git a/src/pixel_gen.cpp b/src/pixel_gen.cpp
new file mode 100644 (file)
index 0000000..8d8aed1
--- /dev/null
@@ -0,0 +1,586 @@
+/***************************************************************************\r
+ * pixel.cpp is part of Math Graphic Library\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
+ *   published by the Free Software Foundation; either version 3 of the    *\r
+ *   License, or (at your option) any later version.                       *\r
+ *                                                                         *\r
+ *   This program is distributed in the hope that it will be useful,       *\r
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *\r
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *\r
+ *   GNU General Public License for more details.                          *\r
+ *                                                                         *\r
+ *   You should have received a copy of the GNU Library General Public     *\r
+ *   License along with this program; if not, write to the                 *\r
+ *   Free Software Foundation, Inc.,                                       *\r
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *\r
+ ***************************************************************************/\r
+#include <algorithm>\r
+#include "mgl2/canvas.h"\r
+#include "mgl2/thread.h"\r
+#if MGL_HAVE_OMP\r
+#include <omp.h>\r
+#endif\r
+\r
+//-----------------------------------------------------------------------------\r
+#if MGL_HAVE_PTHREAD\r
+static void *mgl_canvas_thr(void *par)\r
+{      mglThreadG *t=(mglThreadG *)par;        (t->gr->*(t->f))(t->id, t->n, t->p);    return NULL;    }\r
+#endif\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::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((omp_lock_t*)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++)\r
+       {       unsigned char *b=GB+4*i;\r
+               b[0]=BDef[0];   b[1]=BDef[1];   b[2]=BDef[2];   b[3]=BDef[3];   }\r
+#if MGL_HAVE_PTHREAD\r
+       pthread_mutex_unlock(&mutexClf);\r
+#elif MGL_HAVE_OMP\r
+       omp_unset_lock((omp_lock_t*)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((omp_lock_t*)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((omp_lock_t*)lockClf);\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
+                       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
+       float f = 1./(2*M->pf),x=p.x,y=p.y,z=p.z;\r
+       const float *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
+       float nx=n.x, ny=n.y, nz=n.z;\r
+       const float *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 float 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 float *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 float s3 = 2*B.pf;\r
+       mglPoint p;\r
+\r
+       const float W=Width/2, H=Height/2, D=Depth/2;\r
+       const float *b=B.b,*d=Bp.b;\r
+       float 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 float c0 = b[6]*d[2]+b[3]*d[1]+b[0]*d[0];\r
+       const float c1 = b[7]*d[2]+b[4]*d[1]+b[1]*d[0];\r
+       const float c2 = b[8]*d[2]+b[5]*d[1]+b[2]*d[0];\r
+       float 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 float c3 = b[6]*d[5]+b[3]*d[4]+b[0]*d[3];\r
+       const float c4 = b[7]*d[5]+b[4]*d[4]+b[1]*d[3];\r
+       const float c5 = b[8]*d[5]+b[5]*d[4]+b[2]*d[3];\r
+       float 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 float c6 = b[6]*d[8]+b[3]*d[7]+b[0]*d[6];\r
+       const float c7 = b[7]*d[8]+b[4]*d[7]+b[1]*d[6];\r
+       const float 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
+               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 float xx = ps.x-cx, yy = ps.y-cy, zz = ps.z-cz;\r
+       const float 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
+               float 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 static 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 static 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
+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
+HMGL mgl_qsort_gr=0;\r
+MGL_NO_EXPORT int mgl_type_prior[8]={1,2,4,5, 0,3,0, 7};\r
+int mglBase::PrmCmp(size_t i, size_t j) const\r
+{\r
+       if(i>=Prm.size() || j>=Prm.size())\r
+               return 0;\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
+       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 size_t *)i), *((const size_t *)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
+                       size_t n = Prm.size();\r
+                       PrmInd = new size_t[n];\r
+                       for(size_t i=0;i<n;i++) PrmInd[i]=i;\r
+                       qsort(PrmInd,n,sizeof(size_t),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::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((omp_lock_t*)lockClf);\r
+#endif\r
+       size_t n=Width*Height;\r
+       if(Quality!=MGL_DRAW_DOTS)\r
+       {\r
+               if((Quality&MGL_DRAW_LMEM) || ( Bp!=bp && !(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;  clr(MGL_FINISHED);\r
+                               mglStartThread(&mglCanvas::pxl_primdr,this,Prm.size());\r
+                       }\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
+               }\r
+       }\r
+       else\r
+       {\r
+               mglStartThread(&mglCanvas::pxl_dotsdr,this,Pnt.size());\r
+               mglStartThread(&mglCanvas::pxl_memcpy,this,n);\r
+       }\r
+       int x2 = BBoxX2<0?Width:BBoxX2, y2 = BBoxY2<0?Height:BBoxY2;\r
+       if(BBoxX1>=0 && BBoxX1<x2 && BBoxY1>=0 && BBoxY1<y2)\r
+       {\r
+               unsigned char ff[8]={255,255,255,255, 0,0,0,255}, *g1 = G4+BBoxX1*4-4;\r
+               int ww = 8*Width;\r
+               if(BBoxX1>0)    for(long i=0;i<Height/2-1;i++)\r
+               {       unsigned char *g=g1+ww*i;\r
+                       g[0]=ff[0];     g[1]=ff[1];     g[2]=ff[2];     g[3]=ff[3];\r
+                       g[4]=ff[4];     g[5]=ff[5];     g[6]=ff[6];     g[7]=ff[7];     }\r
+               g1 = G4+x2*4;\r
+               if(x2<Width)    for(long i=0;i<Height/2-1;i++)\r
+               {       unsigned char *g=g1+ww*i;\r
+                       g[0]=ff[0];     g[1]=ff[1];     g[2]=ff[2];     g[3]=ff[3];\r
+                       g[4]=ff[4];     g[5]=ff[5];     g[6]=ff[6];     g[7]=ff[7];     }\r
+               g1 = G4+(BBoxY1-1)*4*Width;\r
+               if(BBoxY1>0)    for(long i=0;i<Width/2-1;i++)\r
+               {       unsigned char *g=g1+8*i;\r
+                       g[0]=ff[0];     g[1]=ff[1];     g[2]=ff[2];     g[3]=ff[3];\r
+                       g[4]=ff[4];     g[5]=ff[5];     g[6]=ff[6];     g[7]=ff[7];     }\r
+               g1 = G4+y2*4*Width;\r
+               if(y2<Height)   for(long i=0;i<Width/2-1;i++)\r
+               {       unsigned char *g=g1+8*i;\r
+                       g[0]=ff[0];     g[1]=ff[1];     g[2]=ff[2];     g[3]=ff[3];\r
+                       g[4]=ff[4];     g[5]=ff[5];     g[6]=ff[6];     g[7]=ff[7];     }\r
+       }\r
+       mglStartThread(&mglCanvas::pxl_backgr,this,n);\r
+       if(Quality!=MGL_DRAW_DOTS)      set(MGL_FINISHED);\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((omp_lock_t*)lockClf);\r
+#endif\r
+}\r
+//-----------------------------------------------------------------------------\r
+void mglCanvas::ClfZB(bool force)\r
+{\r
+       if(!force && (Quality&MGL_DRAW_LMEM))   return;\r
+       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++)\r
+       {       unsigned char *b=GB+4*i;\r
+               b[0]=BDef[0];   b[1]=BDef[1];   b[2]=BDef[2];   b[3]=BDef[3];   }\r
+}\r
+//-----------------------------------------------------------------------------\r
+void mglCanvas::Combine(const mglCanvas *gr)\r
+{\r
+       if(!gr || Width!=gr->Width || Height!=gr->Height)       return; // wrong sizes\r
+       mglStartThread(&mglCanvas::pxl_other,this,Width*Height,gr);\r
+}\r
+//-----------------------------------------------------------------------------\r
+unsigned char **mglCanvas::GetRGBLines(long &w, long &h, unsigned char *&f, bool alpha)\r
+{\r
+       unsigned char **p;\r
+       Finish();\r
+       long c = alpha?4:3, d = c*Width;\r
+       unsigned char *gg = (alpha?G4:G);\r
+       int x2 = BBoxX2<0?Width:BBoxX2, y2 = BBoxY2<0?Height:BBoxY2;\r
+       if(BBoxX1>=0 && BBoxX1<x2 && BBoxY1>=0 && BBoxY1<y2)\r
+       {\r
+               gg += c*BBoxX1 + d*BBoxY1;\r
+               w = x2-BBoxX1;  h = y2-BBoxY1;\r
+       }\r
+       else    {       w = Width;      h = Height;     }\r
+       p = (unsigned char **)malloc(h * sizeof(unsigned char *));\r
+       for(long j=0;j<h;j++)   p[j] = gg + d*j;\r
+       f = 0;  return p;\r
+}\r
+//-----------------------------------------------------------------------------\r
diff --git a/src/pixel_pix.cpp b/src/pixel_pix.cpp
new file mode 100644 (file)
index 0000000..1157acd
--- /dev/null
@@ -0,0 +1,398 @@
+/***************************************************************************\r
+ * pixel_bit.cpp is part of Math Graphic Library\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
+ *   published by the Free Software Foundation; either version 3 of the    *\r
+ *   License, or (at your option) any later version.                       *\r
+ *                                                                         *\r
+ *   This program is distributed in the hope that it will be useful,       *\r
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *\r
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *\r
+ *   GNU General Public License for more details.                          *\r
+ *                                                                         *\r
+ *   You should have received a copy of the GNU Library General Public     *\r
+ *   License along with this program; if not, write to the                 *\r
+ *   Free Software Foundation, Inc.,                                       *\r
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *\r
+ ***************************************************************************/\r
+#include <algorithm>\r
+#include "mgl2/canvas.h"\r
+#include "mgl2/thread.h"\r
+#if MGL_HAVE_OMP\r
+#include <omp.h>\r
+#endif\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
+               long i=ii%Width, j=ii/Width;\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
+                       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
+                       }\r
+               }\r
+       }\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
+       float dd = d1.x*d2.y-d1.y*d2.x;\r
+       float dsx =-4*(d2.y*d3.x - d2.x*d3.y)*d1.y;\r
+       float dsy = 4*(d2.y*d3.x - d2.x*d3.y)*d1.x;\r
+       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
+       float qu = d3.x*yy - d3.y*xx + dd + s, u=-1;\r
+       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];     col2int(p,r,d->ObjId);\r
+       if(r[3])        pnt_plot(i,j,p.z,r,d->ObjId);\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
+       float dd = d2.x*d1.y - d1.x*d2.y;\r
+       if(fabs(dd)<1e-5)       return;         // points lies on the same line\r
+       float dyv =-d1.x/dd, dxv = d1.y/dd, dyu = d2.x/dd, dxu =-d2.y/dd;\r
+       float xx = (i-p1.x), yy = (j-p1.y);\r
+       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
+       if(r[3])        pnt_plot(i,j,p.z,col2int(p,r,d->ObjId),d->ObjId);\r
+}\r
+//-----------------------------------------------------------------------------\r
+void mglCanvas::line_pix(long i, long j, const mglPnt &p1, const mglPnt &p2, const mglDrawReg *dr)\r
+{\r
+       float xx = (i-p1.x), yy = (j-p1.y);\r
+       mglPnt d(p2-p1);\r
+       float dd = hypot(d.x, d.y);\r
+       float dxv = d.y/dd, dyv =-d.x/dd, dxu = d.x/dd, dyu = d.y/dd;\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
+       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 & ( (uint64_t)1<<long(fmod(dr->pPos+u/pw, 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
+       float dz = Width>2 ? 1 : 1e-5*Width;            // provide additional height to be well visible on the surfaces\r
+       if(r[3])        pnt_plot(i,j,p.z+dz,r,dr->ObjId);\r
+}\r
+//-----------------------------------------------------------------------------\r
+void mglCanvas::pnt_pix(long i, long j, const mglPnt &p, const mglDrawReg *dr)\r
+{\r
+       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
+       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
+       if(cs[3])       pnt_plot(i,j,p.z,cs,dr->ObjId);\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
+                               float xx = (i-q.x), yy = (j-q.y);\r
+                               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 && cs[3])  pnt_plot(i,j,q.z+dz,cs,d->ObjId);\r
+                       }\r
+               case 'o':\r
+                       {\r
+                               float pw=d->PenWidth;\r
+                               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
+                               float dz = Width>2 ? 1 : 1e-5*Width;            // provide additional height to be well visible on the surfaces\r
+                               if(cs[3])       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
+                               float pw=d->PenWidth;\r
+                               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
+                               float dz = Width>2 ? 1 : 1e-5*Width;            // provide additional height to be well visible on the surfaces\r
+                               if(cs[3])       pnt_plot(i,j,q.z+dz,cs,d->ObjId);\r
+                       }\r
+                       break;\r
+               }\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
+       {\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
+       }\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
+       }\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
+       {\r
+               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
+       }\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
+{\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
+       {\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
+               }\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
+               }\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
+{\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
+\r
+       if(solid)       quad_pix(i,j,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
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
index 30dc6bc1146f0a2f4819f18ef574d2f87ffa2ea7..f28819ec80c84fb9827c03b2fdc5cbafe7000c58 100644 (file)
@@ -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
 void MGL_EXPORT mgl_fplot(HMGL gr, const char *eqY, const char *pen, const char *opt)\r
 {\r
        if(eqY==0 || eqY[0]==0) return;         // nothing to plot\r
-       mreal r = gr->SaveState(opt);\r
+       double 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
+       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
+               double 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
+               {       double 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
+               double 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
+               {       double 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
+               double 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
+               {       double 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
+       double 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
+                       double xs=(x[i]+x[i-1])/2;\r
+                       double 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
+       double 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
+               double 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
+       double 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
+                       double ts=(t[i]+t[i-1])/2;\r
+                       double xs=(x[i]+x[i-1])/2, xr=ex->Calc(0,0,ts);\r
+                       double ys=(y[i]+y[i-1])/2, yr=ey->Calc(0,0,ts);\r
+                       double 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
@@ -159,15 +156,15 @@ void MGL_EXPORT mgl_radar(HMGL gr, HCDT a, const char *pen, const char *opt)
        long n = a->GetNx(), ny=a->GetNy();\r
        if(n<2) {       gr->SetWarn(mglWarnLow,"Radar");        return; }\r
        mglData x(n+1,ny), y(n+1,ny);\r
-       mreal m=a->Minimal(), r=gr->SaveState(opt);\r
+       double m=a->Minimal(), r=gr->SaveState(opt);\r
        if(mgl_isnan(r) || r<0) r = m<0 ? -m:0;\r
-       mreal *co=new mreal[2*n];\r
+       double *co=new double[2*n];\r
        for(long i=0;i<n;i++)   {       co[i]=cos(2*i*M_PI/n);  co[i+n]=sin(2*i*M_PI/n);        }\r
        for(long j=0;j<ny;j++)\r
        {\r
                for(long i=0;i<n;i++)\r
                {\r
-                       register mreal v = a->v(i,j);\r
+                       double 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,45 +209,52 @@ 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
+       gr->SaveState(opt);     gr->SetPenPal(pen,&pal);\r
+       long kq = gr->AllocPnts(8*n);\r
        bool sh = mglchr(pen,'!');\r
        bool wire = mglchr(pen,'#');\r
 \r
-       mreal dv=nx>n?1:0;\r
+       double dv=nx>n?1:0;\r
        if(mglchr(pen,'<'))     dv = 1;\r
        if(mglchr(pen,'^'))     dv = 0;\r
-       if(mglchr(pen,'>'))     dv = -1;\r
-       mreal zm = gr->AdjustZMin();\r
-       mreal c1,c2;    c2=c1=gr->NextColor(pal);\r
+       if(mglchr(pen,'>'))     dv =-1;\r
+       double zm = gr->AdjustZMin();\r
+       double c1=gr->NextColor(pal), c2=c1;\r
        bool col2 = (gr->GetNumPal(pal)==2 && !sh);\r
        if(col2)        c2 = gr->NextColor(pal);\r
+#pragma omp parallel for\r
        for(long i=0;i<n;i++)\r
        {\r
-               mreal m1=v1->v(i),      m2 = v2->v(i),  xx = x->v(i);\r
-               mreal d = i<nx-1 ? x->v(i+1)-xx : xx-x->v(i-1), c;\r
-               mreal x1 = xx + d/2*(dv-gr->BarWidth);\r
-               mreal x2 = x1 + gr->BarWidth*d; xx = (x1+x2)/2;\r
+               double m1=v1->v(i),     m2 = v2->v(i),  xx = x->v(i);\r
+               double d = i<nx-1 ? x->v(i+1)-xx : xx-x->v(i-1), c;\r
+               double x1 = xx + d/2*(dv-gr->BarWidth);\r
+               double x2 = x1 + gr->BarWidth*d;        xx = (x1+x2)/2;\r
                if(sh)  c = gr->NextColor(pal,i);\r
                else if(wire)   c = (i>0 && m2>v2->v(i-1))?c2:c1;\r
                else    c = (m1>m2)?c1:c2;\r
-               long n1 = gr->AddPnt(mglPoint(xx,y1->v(i),zm),c);\r
-               long n2 = gr->AddPnt(mglPoint(xx,m1,zm),c);\r
-               gr->line_plot(n1,n2);\r
-               long n3 = gr->AddPnt(mglPoint(xx,y2->v(i),zm),c);\r
-               long n4 = gr->AddPnt(mglPoint(xx,m2,zm),c);\r
-               gr->line_plot(n3,n4);\r
-\r
-               n1 = gr->AddPnt(mglPoint(x1,m1,zm),c);\r
-               n2 = gr->AddPnt(mglPoint(x2,m1,zm),c);\r
-               n3 = gr->AddPnt(mglPoint(x1,m2,zm),c);\r
-               n4 = gr->AddPnt(mglPoint(x2,m2,zm),c);\r
-               gr->line_plot(n1,n2);   gr->line_plot(n1,n3);\r
-               gr->line_plot(n4,n2);   gr->line_plot(n4,n3);\r
-               if(m1>m2 || (col2 && !wire))    gr->quad_plot(n1,n2,n3,n4);\r
+               long iq = kq+8*i;\r
+               gr->AddPntQ(iq,mglPoint(xx,y1->v(i),zm),c);\r
+               gr->AddPntQ(iq+1,mglPoint(xx,m1,zm),c);\r
+               gr->AddPntQ(iq+2,mglPoint(xx,y2->v(i),zm),c);\r
+               gr->AddPntQ(iq+3,mglPoint(xx,m2,zm),c);\r
+               gr->AddPntQ(iq+4,mglPoint(x1,m1,zm),c);\r
+               gr->AddPntQ(iq+5,mglPoint(x2,m1,zm),c);\r
+               gr->AddPntQ(iq+6,mglPoint(x1,m2,zm),c);\r
+               gr->AddPntQ(iq+7,mglPoint(x2,m2,zm),c);\r
+       }\r
+       for(long i=0;i<n;i++)\r
+       {\r
+               long iq = kq+8*i;\r
+               gr->line_plot(iq,  iq+1);       gr->line_plot(iq+2,iq+3);\r
+               gr->line_plot(iq+4,iq+5);       gr->line_plot(iq+4,iq+6);\r
+               gr->line_plot(iq+7,iq+5);       gr->line_plot(iq+7,iq+6);\r
+               if(v1->v(i)>v2->v(i) || (col2 && !wire))        gr->quad_plot(iq+4,iq+5,iq+6,iq+7);\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 +293,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> static 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
+               double 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
+               double 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> static 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 +354,31 @@ 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');\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 kq = gr->AllocPnts(num);\r
+#pragma omp parallel for\r
+               for(msize i=0;i<num;i++)\r
+               {       double c = sh ? gr->NextColor(pal,i):gr->CDef;\r
+                       gr->AddPntQ(kq+i, pp[i].p, c);  }\r
+               if(mk)  for(size_t i=0;i<num;i+=dx)\r
+                       if(pp[i].orig)  gr->mark_plot(kq+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
-                       {\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
-                       }\r
+                       gr->arrow_plot(kq,kq+1,gr->Arrow1);\r
+                       gr->arrow_plot(kq+num-1,kq+num-2,gr->Arrow2);\r
                }\r
+               gr->curve_plot(num, kq);\r
        }\r
        gr->EndGroup();\r
 }\r
@@ -368,7 +392,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 +429,31 @@ 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');\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 kq = gr->AllocPnts(num);\r
+#pragma omp parallel for\r
+               for(msize i=0;i<num;i++)\r
+               {       gr->AddPntQ(kq+i,pp[i].p, gr->GetC(ss,pp[i].p.c));      }\r
+               if(mk)  for(size_t i=0;i<num;i+=dx)\r
+                       if(pp[i].orig)  gr->mark_plot(kq+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
-                       {\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
-                       }\r
+                       gr->arrow_plot(kq,kq+1,gr->Arrow1);\r
+                       gr->arrow_plot(kq+num-1,kq+num-2,gr->Arrow2);\r
                }\r
+               gr->curve_plot(num, kq);\r
        }\r
        gr->EndGroup();\r
 }\r
@@ -460,7 +467,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,37 +502,42 @@ 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
+       double z0=gr->GetOrgZ('x');\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
+               double 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
+               mglPoint nn(pp[0].p.y-pp[1].p.y, pp[1].p.x-pp[0].p.x);\r
+               long kq = gr->AllocPnts(2*np);\r
+#pragma omp parallel for\r
+               for(msize 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
+                       double cc=gr->NextColor(pal,i);\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
+                       gr->AddPntQ(kq+2*i,pp[i].p, sh?cc:c1,nn,-1,27); pp[i].p.z = z0;\r
+                       gr->AddPntQ(kq+2*i+1,pp[i].p, sh?cc:c2,nn,-1,27);\r
+               }\r
+               for(size_t i=1;i<np;i++)\r
+               {\r
+                       long iq = kq+2*i;\r
+                       if(gr->SamePnt(iq,iq-2) || gr->SamePnt(iq+1,iq-1))      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
+                               gr->line_plot(iq,iq+1); gr->line_plot(iq-1,iq+1);\r
+                               gr->line_plot(iq,iq-2); gr->line_plot(iq-1,iq-2);\r
                        }\r
-                       else    gr->quad_plot(n1,n2,n3,n4);\r
+                       else    gr->quad_plot(iq,iq+1,iq-2,iq-1);\r
                }\r
        }\r
        gr->EndGroup();\r
@@ -538,38 +550,43 @@ void MGL_EXPORT mgl_area_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char
 \r
        gr->SaveState(opt);\r
        static int cgid=1;      gr->StartGroup("Curve",cgid++);\r
-       mreal zm = gr->AdjustZMin();\r
-       mreal y0=gr->GetOrgY('x');\r
-       mreal c1,c2;\r
+       double zm = gr->AdjustZMin();\r
+       double y0=gr->GetOrgY('x');\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
+               double 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
+               double z0 = zm + (m-1-j)*(gr->Max.z-zm)/m;\r
+\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 kq = gr->AllocPnts(2*np);\r
+#pragma omp parallel for\r
+               for(msize 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
+                       double cc=gr->NextColor(pal,i);\r
+                       gr->AddPntQ(kq+2*i,pp[i].p, sh?cc:c1,nn,-1,27); pp[i].p.y = y0;\r
+                       gr->AddPntQ(kq+2*i+1,pp[i].p, sh?cc:c2,nn,-1,27);\r
+               }\r
+               if(wire)        gr->line_plot(kq,kq+1);\r
+               for(size_t i=1;i<np;i++)\r
+               {\r
+                       long iq = kq+2*i;\r
+                       if(gr->SamePnt(iq,iq-2) || gr->SamePnt(iq+1,iq-1))      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
+                               gr->line_plot(iq,iq+1); gr->line_plot(iq-1,iq+1);\r
+                               gr->line_plot(iq,iq-2);\r
                        }\r
-                       else    gr->quad_plot(n1,n2,n3,n4);\r
+                       else    gr->quad_plot(iq,iq+1,iq-2,iq-1);\r
                }\r
        }\r
        gr->EndGroup();\r
@@ -601,12 +618,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> static 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
+               double 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
+               double 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
+               double 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<double> 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> static 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
@@ -615,31 +690,56 @@ void MGL_EXPORT mgl_region_3d(HMGL gr, HCDT x1, HCDT y1, HCDT z1, HCDT x2, HCDT
 \r
        gr->SaveState(opt);\r
        static int cgid=1;      gr->StartGroup("Region",cgid++);\r
-       mreal c1,c2;\r
        mglPoint nn(0,0,1);\r
-       mreal zm = gr->AdjustZMin();\r
+       double 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
        {\r
                if(gr->NeedStop())      break;\r
-               c2=c1=gr->NextColor(pal);\r
+               double c1=gr->NextColor(pal), c2=c1;\r
                if(gr->GetNumPal(pal)==2*m && !sh)      c2=gr->NextColor(pal);\r
                long mx = j<x1->GetNy() ? j:0, my = j<y1->GetNy() ? j:0;\r
                long mz = (zhave && j<z1->GetNy()) ? j:0;\r
-               mreal z0 = zm + (m-1-j)*(gr->Max.z-zm)/m;\r
+               double 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
+               size_t np = pp.size();\r
+               long kq = gr->AllocPnts(2*np);\r
+#pragma omp parallel for\r
+               for(msize 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
+                       double cc=gr->NextColor(pal,i);\r
+                       gr->AddPntQ(kq+2*i,pp[i].p1, sh?cc:c1,nn,-1,27);\r
+                       gr->AddPntQ(kq+2*i+1,pp[i].p2, sh?cc:c2,nn,-1,27);\r
+               }\r
+               if(wire)        gr->line_plot(kq,kq+1);\r
+               for(size_t i=1;i<np;i++)\r
+               {\r
+                       long iq = kq+2*i;\r
+                       if(gr->SamePnt(iq,iq-2) || gr->SamePnt(iq+1,iq-1))      continue;\r
+                       if(wire)\r
+                       {\r
+                               gr->line_plot(iq,iq+1); gr->line_plot(iq-1,iq+1);\r
+                               gr->line_plot(iq,iq-2);\r
+                       }\r
+                       else    gr->quad_plot(iq,iq+1,iq-2,iq-1);\r
                }\r
        }\r
        gr->EndGroup();\r
@@ -653,34 +753,66 @@ void MGL_EXPORT mgl_region_xy(HMGL gr, HCDT x, HCDT y1, HCDT y2, const char *pen
 \r
        gr->SaveState(opt);\r
        static int cgid=1;      gr->StartGroup("Region",cgid++);\r
-       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
+       double 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,'!'), 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
+               double 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;\r
-               mreal z0 = zm + (m-1-j)*(gr->Max.z-zm)/m;\r
+               double 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
+               size_t np = pp.size();\r
+               long kq = gr->AllocPnts(2*np);\r
+#pragma omp parallel for\r
+               for(msize i=0;i<np;i++)\r
+               {\r
+                       double cc=gr->NextColor(pal,i);\r
+                       gr->AddPntQ(kq+2*i,pp[i].p1, sh?cc:c1,nn,-1,27);\r
+                       gr->AddPntQ(kq+2*i+1,pp[i].p2, sh?cc:c2,nn,-1,27);\r
+               }\r
+               if(wire)        gr->line_plot(kq,kq+1);\r
+               for(size_t i=1;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
-                       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
+                       long iq = kq+2*i;\r
+                       if(gr->SamePnt(iq,iq-2) || gr->SamePnt(iq+1,iq-1))      continue;\r
+                       if(wire)\r
+                       {\r
+                               gr->line_plot(iq,iq+1);\r
+                               gr->line_plot(iq-1,iq+1);\r
+                               gr->line_plot(iq,iq-2);\r
+                       }\r
+                       else if(!inside)        gr->quad_plot(iq,iq+1,iq-2,iq-1);\r
+                       else\r
+                       {\r
+                               const mglPointB &a=pp[i-1], &b=pp[i];\r
+                               if(a.p1.y<=a.p2.y && b.p1.y<=b.p2.y)\r
+                                       gr->quad_plot(iq,iq+1,iq-2,iq-1);\r
+                               else if(a.p1.y<=a.p2.y)\r
+                               {\r
+                                       double cc=gr->NextColor(pal,i);\r
+                                       double dd = (a.p1.y-a.p2.y)/(b.p2.y-b.p1.y-a.p2.y+a.p1.y);\r
+                                       long ns = gr->AddPnt(b.p1*dd+a.p1*(1-dd), sh?cc:c1,nn,-1,27);\r
+                                       gr->trig_plot(iq-2,iq-1,ns);\r
+                               }\r
+                               else if(b.p1.y<=b.p2.y)\r
+                               {\r
+                                       double cc=gr->NextColor(pal,i);\r
+                                       double dd = (a.p1.y-a.p2.y)/(b.p2.y-b.p1.y-a.p2.y+a.p1.y);\r
+                                       long ns = gr->AddPnt(b.p1*dd+a.p1*(1-dd), sh?cc:c1,nn,-1,27);\r
+                                       gr->trig_plot(iq,iq+1,ns);\r
+                               }\r
+                       }\r
                }\r
        }\r
        gr->EndGroup();\r
@@ -723,28 +855,31 @@ 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
                long mx = j<x->GetNy() ? j:0, my = j<y->GetNy() ? j:0, mz = j<z->GetNy() ? j:0;\r
                gr->NextColor(pal);\r
-               long n1 = gr->AddPnt(mglPoint(x->v(0,mx), y->v(0,my), z->v(0,mz)));\r
-               if(mk)  gr->mark_plot(n1,mk);\r
+               long kq = gr->AllocPnts(2*n);   gr->SetPntOff(kq);\r
+               gr->AddPntQ(kq+1,mglPoint(x->v(0,mx), y->v(0,my), z->v(0,mz)));\r
+               if(mk)  gr->mark_plot(kq+1,mk);\r
+#pragma omp parallel for\r
+               for(long i=1;i<n;i++)\r
+               {\r
+                       mglPoint p(x->v(i,mx), y->v(i,my), z->v(i-1,mz));\r
+                       double c = sh ? gr->NextColor(pal,i):gr->CDef;\r
+                       gr->AddPntQ(kq+2*i,p,c);\r
+                       p.z = z->v(i,mz);       gr->AddPntQ(kq+2*i+1,p,c);\r
+               }\r
                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
-                       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
-                       gr->line_plot(n1,n2);\r
-                       if(i==n-1)      gr->arrow_plot(n1,n2,gr->Arrow2);\r
+                       long iq = kq+2*i;\r
+                       gr->line_plot(iq,iq-1); gr->line_plot(iq,iq+1);\r
+                       if(mk && i%dx==0)       gr->mark_plot(iq+1,mk);\r
                }\r
+               gr->arrow_plot(kq+1,kq+2,gr->Arrow2);\r
+               gr->arrow_plot(kq+2*n-1,kq+2*n-2,gr->Arrow2);\r
        }\r
        gr->EndGroup();\r
 }\r
@@ -760,41 +895,45 @@ void MGL_EXPORT mgl_step_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char
        bool sh = mglchr(pen,'!');\r
        bool same = x->GetNx()==n;\r
 \r
-       mreal zVal =gr->AdjustZMin();\r
+       double 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
-               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
+\r
+               long kq = gr->AllocPnts(2*n);   gr->SetPntOff(kq);\r
+               gr->AddPntQ(kq+1,mglPoint(x->v(0,mx), y->v(0,my), zVal));\r
+               if(same && mk)  gr->mark_plot(kq+1,mk);\r
+#pragma omp parallel for\r
                for(long i=1;i<n;i++)\r
                {\r
-                       long n2 = n1;   // horizontal\r
-                       xx = x->v(i,mx);\r
-                       p.Set(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
-                       gr->line_plot(n1,n2);\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)  gr->mark_plot(nn,mk);\r
+                       mglPoint p(x->v(i,mx), y->v(i-1,my), zVal);\r
+                       double c = sh ? gr->NextColor(pal,i):gr->CDef;\r
+                       gr->AddPntQ(kq+2*i,p,c);\r
+                       p.y = y->v(i,my);       gr->AddPntQ(kq+2*i+1,p,c);\r
                }\r
-               if(!same)\r
+               for(long i=1;i<n;i++)\r
                {\r
-                       p.Set(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
+                       long iq = kq+2*i;\r
+                       gr->line_plot(iq,iq-1); gr->line_plot(iq,iq+1);\r
+                       if(same && mk && i%dx==0)       gr->mark_plot(iq+1,mk);\r
+               }\r
+               gr->arrow_plot(kq+1,kq+2,gr->Arrow2);\r
+               gr->arrow_plot(kq+2*n-1,kq+2*n-2,gr->Arrow2);\r
+               if(!same && mk)\r
+               {\r
+                       kq = gr->AllocPnts(1+(n-1)/dx);\r
+#pragma omp parallel for\r
+                       for(long i=0;i<n;i+=dx)\r
+                       {\r
+                               mglPoint p((x->v(i,mx)+x->v(i+1,mx))/2, y->v(i,my), zVal);\r
+                               double c = sh ? gr->NextColor(pal,i):gr->CDef;\r
+                               gr->AddPntQ(kq+i,p,c);\r
+                       }\r
+                       for(long i=0;i<n;i+=dx) gr->mark_plot(kq+i,mk);\r
                }\r
        }\r
        gr->EndGroup();\r
@@ -836,20 +975,25 @@ void MGL_EXPORT mgl_stem_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c
        m = x->GetNy() > y->GetNy() ? x->GetNy() : y->GetNy();  m = z->GetNy() > m ? z->GetNy() : m;\r
        bool sh = mglchr(pen,'!');\r
 \r
-       mreal z0=gr->GetOrgZ('x');\r
+       double z0=gr->GetOrgZ('x');\r
        char mk=gr->SetPenPal(pen,&pal);        gr->Reserve(2*n*m);\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
+               long kq = gr->AllocPnts(2*n);\r
+#pragma omp parallel for\r
+               for(long i=0;i<n;i++)\r
+               {\r
+                       double c = sh ? gr->NextColor(pal,i):gr->CDef;\r
+                       gr->AddPntQ(kq+2*i,mglPoint(x->v(i,mx), y->v(i,my), z->v(i,mz)),c);\r
+                       gr->AddPntQ(kq+2*i+1,mglPoint(x->v(i,mx), y->v(i,my), z0),c);\r
+               }\r
                for(long i=0;i<n;i++)\r
                {\r
-                       mreal c = sh ? gr->NextColor(pal,i):gr->CDef;\r
-                       long n1 = gr->AddPnt(mglPoint(x->v(i,mx), y->v(i,my), z->v(i,mz)),c);\r
-                       if(mk)  gr->mark_plot(n1,mk);\r
-                       long n2 = gr->AddPnt(mglPoint(x->v(i,mx), y->v(i,my), z0),c);\r
-                       gr->line_plot(n1,n2);\r
+                       long iq = kq+2*i;       gr->line_plot(iq,iq+1);\r
+                       if(mk)  gr->mark_plot(iq,mk);\r
                }\r
        }\r
        gr->EndGroup();\r
@@ -865,21 +1009,25 @@ void MGL_EXPORT mgl_stem_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
-       mreal zVal = gr->AdjustZMin(), y0=gr->GetOrgY('x');\r
+       double zVal = gr->AdjustZMin(), y0=gr->GetOrgY('x');\r
        char mk=gr->SetPenPal(pen,&pal);        gr->Reserve(2*n*m);\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 kq = gr->AllocPnts(2*n);\r
+#pragma omp parallel for\r
                for(long i=0;i<n;i++)\r
                {\r
-                       mreal vv = x->v(i,mx);\r
-                       mreal c = sh ? gr->NextColor(pal,i):gr->CDef;\r
-                       long n1 = gr->AddPnt(mglPoint(vv, y->v(i,my), zVal),c);\r
-                       if(mk)  gr->mark_plot(n1,mk);\r
-                       long n2 = gr->AddPnt(mglPoint(vv, y0, zVal),c);\r
-                       gr->line_plot(n1,n2);\r
+                       double c = sh ? gr->NextColor(pal,i):gr->CDef;\r
+                       gr->AddPntQ(kq+2*i,mglPoint(x->v(i,mx), y->v(i,my), zVal),c);\r
+                       gr->AddPntQ(kq+2*i+1,mglPoint(x->v(i,mx), y0, zVal),c);\r
+               }\r
+               for(long i=0;i<n;i++)\r
+               {\r
+                       long iq = kq+2*i;       gr->line_plot(iq,iq+1);\r
+                       if(mk)  gr->mark_plot(iq,mk);\r
                }\r
        }\r
        gr->EndGroup();\r
@@ -920,59 +1068,80 @@ void MGL_EXPORT mgl_bars_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c
        static int cgid=1;      gr->StartGroup("Bars3",cgid++);\r
        m = x->GetNy() > y->GetNy() ? x->GetNy() : y->GetNy();\r
        m = z->GetNy() > m ? z->GetNy() : m;\r
-       bool sh = mglchr(pen,'!');\r
+       const 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
-       mreal *dd=new mreal[n], z0,zp,dv=nx>n?1:0;\r
+       double *dd=new double[n], *zp=0, dv=nx>n?1:0;\r
        if(mglchr(pen,'<'))     dv = 1;\r
        if(mglchr(pen,'^'))     dv = 0;\r
        if(mglchr(pen,'>'))     dv = -1;\r
-       memset(dd,0,n*sizeof(mreal));\r
+       memset(dd,0,n*sizeof(double));\r
+       if(fall)        zp = new double[n];\r
+\r
+       double 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
+                       double 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
        {\r
                if(gr->NeedStop())      break;\r
-               c2=c1=gr->NextColor(pal);\r
+               double 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
-               zp = z0 = gr->GetOrgZ('x');\r
+               const long mx = j<x->GetNy() ? j:0, my = j<y->GetNy() ? j:0, mz = j<z->GetNy() ? j:0;\r
+               const double z0 = gr->GetOrgZ('x');\r
+               if(fall)\r
+               {       zp[0]=z0;       for(long i=0;i<n-1;i++) zp[i+1] = zp[i]+z->v(i,mz);     }\r
+\r
+               const long kq = gr->AllocPnts(4*n);\r
+#pragma omp parallel for\r
                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
+                       double vv = x->v(i,mx), dx = i<nx-1 ? x->v(i+1,mx)-vv : vv-x->v(i-1,mx), dy, zz;\r
+                       double x1 = vv + dx/2*(dv-gr->BarWidth), x2 = x1 + gr->BarWidth*dx;\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
+                       {       double ff = dc/hypot(dx,dy);    dx *= ff;       dy *= ff;       }\r
+                       double y1 = vv + dy/2*(dv-gr->BarWidth), y2 = y1 + gr->BarWidth*dy;\r
                        vv = zz = z->v(i,mz);\r
+                       double zt = z0;\r
                        if(!above)\r
                        {\r
                                x2 = (x2-x1)/m;         x1 += j*x2;             x2 += x1;\r
                                y2 = (y2-y1)/m;         y1 += j*y2;             y2 += y1;\r
+                               if(fall)        {       zt = zp[i];     zz += zp[i];    }\r
                        }\r
                        else\r
-                       {       z0 = gr->GetOrgZ('x') + dd[i];  dd[i] += zz;    zz += z0;       }\r
-                       if(fall)        {       z0 = zp;        zz += z0;       zp = zz;        }\r
+                       {       zt = gr->GetOrgZ('x') + dd[i];  dd[i] += zz;    zz += zt;       }\r
 \r
-                       mreal c = vv<0 ? c1 : c2;\r
+                       double c = !sh ? (vv<0 ? c1 : c2) : gr->NextColor(pal,i);\r
                        mglPoint nn(-y->dvx(i,my),x->dvx(i,mx));\r
-                       long n1 = gr->AddPnt(mglPoint(x1,y1,zz),c,nn);\r
-                       long n2 = gr->AddPnt(mglPoint(x1,y1,z0),c,nn);\r
-                       long n3 = gr->AddPnt(mglPoint(x2,y2,z0),c,nn);\r
-                       long n4 = gr->AddPnt(mglPoint(x2,y2,zz),c,nn);\r
+                       gr->AddPntQ(kq+4*i,mglPoint(x1,y1,zz),c,nn);\r
+                       gr->AddPntQ(kq+4*i+1,mglPoint(x1,y1,zt),c,nn);\r
+                       gr->AddPntQ(kq+4*i+2,mglPoint(x2,y2,zt),c,nn);\r
+                       gr->AddPntQ(kq+4*i+3,mglPoint(x2,y2,zz),c,nn);\r
+               }\r
+               for(long i=0;i<n;i++)\r
+               {\r
+                       long iq = kq+4*i;\r
                        if(wire)\r
-                       {\r
-                               gr->line_plot(n1,n2);   gr->line_plot(n1,n4);\r
-                               gr->line_plot(n3,n2);   gr->line_plot(n3,n4);\r
-                       }\r
-                       else    gr->quad_plot(n1,n2,n4,n3);\r
+                       {       gr->line_plot(iq,iq+1);         gr->line_plot(iq,iq+3);\r
+                               gr->line_plot(iq+2,iq+1);       gr->line_plot(iq+2,iq+3);       }\r
+                       else    gr->quad_plot(iq,iq+1,iq+3,iq+2);\r
                }\r
        }\r
-       gr->EndGroup(); delete []dd;\r
+       gr->EndGroup(); delete []dd;    if(fall)        delete []zp;\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_bars_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char *opt)\r
@@ -985,52 +1154,74 @@ 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
-       mreal *dd=new mreal[n], y0,yp,dv=nx>n?1:0;\r
+       double *dd=new double[n], dv=nx>n?1:0, *yp=0;\r
+       memset(dd,0,n*sizeof(double));\r
        if(mglchr(pen,'<'))     dv = 1;\r
        if(mglchr(pen,'^'))     dv = 0;\r
        if(mglchr(pen,'>'))     dv = -1;\r
-       mreal zm = gr->AdjustZMin();\r
-       memset(dd,0,n*sizeof(mreal));\r
+       const double zm = gr->AdjustZMin();\r
+       if(fall)        yp = new double[n];\r
+\r
+       double 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
+                       double 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
        {\r
                if(gr->NeedStop())      break;\r
-               c2=c1=gr->NextColor(pal);\r
+               double 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
-               yp = y0 = gr->GetOrgY('x');\r
+               const long mx = j<x->GetNy() ? j:0, my = j<y->GetNy() ? j:0;\r
+               const double y0 = gr->GetOrgY('x');\r
+               if(fall)\r
+               {       yp[0]=y0;       for(long i=0;i<n-1;i++) yp[i+1] = yp[i]+y->v(i,my);     }\r
+\r
+               const long kq = gr->AllocPnts(4*n);\r
+#pragma omp parallel for\r
                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), yy;\r
-                       mreal x1 = vv + d/2*(dv-gr->BarWidth), x2 = x1 + gr->BarWidth*d;\r
+                       double 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
+                       double x1 = vv + d/2*(dv-gr->BarWidth), x2 = x1 + gr->BarWidth*d;\r
                        vv = yy = y->v(i,my);\r
+                       double yt = y0;\r
                        if(!above)\r
-                       {       x2 = (x2-x1)/m;         x1 += j*x2;             x2 += x1;       }\r
-                       else\r
-                       {       y0 = gr->GetOrgY('x') + dd[i];  dd[i] += yy;    yy += y0;       }\r
-                       if(fall)        {       y0 = yp;        yy += y0;       yp = yy;        }\r
-\r
-                       mreal c = vv<0 ? c1 : c2;\r
-                       long n1 = gr->AddPnt(mglPoint(x1,yy,zm),c);\r
-                       long n2 = gr->AddPnt(mglPoint(x1,y0,zm),c);\r
-                       long n3 = gr->AddPnt(mglPoint(x2,y0,zm),c);\r
-                       long n4 = gr->AddPnt(mglPoint(x2,yy,zm),c);\r
-                       if(wire)\r
                        {\r
-                               gr->line_plot(n1,n2);   gr->line_plot(n1,n4);\r
-                               gr->line_plot(n3,n2);   gr->line_plot(n3,n4);\r
+                               x2 = (x2-x1)/m;         x1 += j*x2;             x2 += x1;\r
+                               if(fall)        {       yt = yp[i];     yy += yp[i];    }\r
                        }\r
-                       else    gr->quad_plot(n1,n2,n4,n3);\r
+                       else\r
+                       {       yt = y0 + dd[i];        dd[i] += yy;    yy += yt;       }\r
+\r
+                       double c = !sh ? (vv<0 ? c1 : c2) : gr->NextColor(pal,i);\r
+                       gr->AddPntQ(kq+4*i,mglPoint(x1,yy,zm),c);\r
+                       gr->AddPntQ(kq+4*i+1,mglPoint(x1,yt,zm),c);\r
+                       gr->AddPntQ(kq+4*i+2,mglPoint(x2,yt,zm),c);\r
+                       gr->AddPntQ(kq+4*i+3,mglPoint(x2,yy,zm),c);\r
+               }\r
+               for(long i=0;i<n;i++)\r
+               {\r
+                       long iq = kq+4*i;\r
+                       if(wire)\r
+                       {       gr->line_plot(iq,iq+1);         gr->line_plot(iq,iq+3);\r
+                               gr->line_plot(iq+2,iq+1);       gr->line_plot(iq+2,iq+3);       }\r
+                       else    gr->quad_plot(iq,iq+1,iq+3,iq+2);\r
                }\r
        }\r
-       gr->EndGroup(); delete []dd;\r
+       gr->EndGroup(); delete []dd;    if(fall)        delete []yp;\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_bars(HMGL gr, HCDT y, const char *pen, const char *opt)\r
@@ -1069,51 +1260,74 @@ 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
+       double *dd=new double[n], *xp=0,dv=ny>n?1:0;\r
        if(mglchr(pen,'<'))     dv = 1;\r
        if(mglchr(pen,'^'))     dv = 0;\r
        if(mglchr(pen,'>'))     dv = -1;\r
-       mreal zm = gr->AdjustZMin();\r
-       memset(dd,0,n*sizeof(mreal));\r
+       const double zm = gr->AdjustZMin();\r
+       memset(dd,0,n*sizeof(double));\r
+       if(fall)        xp = new double[n];\r
+\r
+       double 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
+                       double 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
        {\r
                if(gr->NeedStop())      break;\r
-               mreal c1,c2;    c2=c1=gr->NextColor(pal);\r
+               double c1=gr->NextColor(pal), c2=c1;\r
                if(gr->GetNumPal(pal)==2*m && !sh)      c2 = gr->NextColor(pal);\r
-               long mx = j<v->GetNy() ? j:0, my = j<y->GetNy() ? j:0;\r
-               xp = x0 = gr->GetOrgX('y');\r
+               const long mx = j<v->GetNy() ? j:0, my = j<y->GetNy() ? j:0;\r
+               const double x0 = gr->GetOrgX('y');\r
+               if(fall)\r
+               {       xp[0]=x0;       for(long i=0;i<n-1;i++) xp[i+1] = xp[i]+v->v(i,mx);     }\r
+\r
+               const long kq = gr->AllocPnts(4*n);\r
+#pragma omp parallel for\r
                for(long i=0;i<n;i++)\r
                {\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
-                       mreal y1 = vv + d/2*(dv-gr->BarWidth), y2 = y1 + gr->BarWidth*d;\r
+                       double 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
+                       double y1 = vv + d/2*(dv-gr->BarWidth), y2 = y1 + gr->BarWidth*d;\r
                        vv = xx = v->v(i,mx);\r
+                       double xt = x0;\r
                        if(!above)\r
-                       {       y2 = (y2-y1)/m;         y1 += j*y2;             y2 += y1;       }\r
-                       else\r
-                       {       x0 = gr->GetOrgX('y') + dd[i];  dd[i] += xx;    xx += x0;       }\r
-                       if(fall)        {       x0 = xp;        xx += x0;       xp = xx;        }\r
-\r
-                       mreal c = vv<0 ? c1 : c2;\r
-                       long n1 = gr->AddPnt(mglPoint(xx,y1,zm),c);\r
-                       long n2 = gr->AddPnt(mglPoint(xx,y2,zm),c);\r
-                       long n3 = gr->AddPnt(mglPoint(x0,y2,zm),c);\r
-                       long n4 = gr->AddPnt(mglPoint(x0,y1,zm),c);\r
-                       if(wire)\r
                        {\r
-                               gr->line_plot(n1,n2);   gr->line_plot(n1,n4);\r
-                               gr->line_plot(n3,n2);   gr->line_plot(n3,n4);\r
+                               y2 = (y2-y1)/m;         y1 += j*y2;             y2 += y1;\r
+                               if(fall)        {       xt = xp[i];     xx += xp[i];    }\r
                        }\r
-                       else    gr->quad_plot(n1,n2,n4,n3);\r
+                       else\r
+                       {       xt = x0 + dd[i];        dd[i] += xx;    xx += xt;       }\r
+\r
+                       double c = !sh ? (vv<0 ? c1 : c2) : gr->NextColor(pal,i);\r
+                       gr->AddPntQ(kq+4*i,mglPoint(xx,y1,zm),c);\r
+                       gr->AddPntQ(kq+4*i+1,mglPoint(xx,y2,zm),c);\r
+                       gr->AddPntQ(kq+4*i+2,mglPoint(xt,y2,zm),c);\r
+                       gr->AddPntQ(kq+4*i+3,mglPoint(xt,y1,zm),c);\r
+               }\r
+               for(long i=0;i<n;i++)\r
+               {\r
+                       long iq = kq+4*i;\r
+                       if(wire)\r
+                       {       gr->line_plot(iq,iq+1);         gr->line_plot(iq,iq+3);\r
+                               gr->line_plot(iq+2,iq+1);       gr->line_plot(iq+2,iq+3);       }\r
+                       else    gr->quad_plot(iq,iq+1,iq+3,iq+2);\r
                }\r
        }\r
-       gr->EndGroup(); delete []dd;\r
+       gr->EndGroup(); delete []dd;    if(fall)        delete []xp;\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_barh(HMGL gr, HCDT v,      const char *pen, const char *opt)\r
@@ -1144,11 +1358,11 @@ void MGL_EXPORT mgl_ohlc_x(HMGL gr, HCDT x, HCDT open, HCDT high, HCDT low, HCDT
        {       gr->SetWarn(mglWarnDim,"OHLC"); return; }\r
        gr->SaveState(opt);\r
        static int cgid=1;      gr->StartGroup("OHLC",cgid++);\r
-       mreal dv=nx>n?1:0;\r
+       double dv=nx>n?1:0;\r
        if(mglchr(pen,'<'))     dv = 1;\r
        if(mglchr(pen,'^'))     dv = 0;\r
        if(mglchr(pen,'>'))     dv = -1;\r
-       mreal zVal = gr->AdjustZMin();\r
+       double zVal = gr->AdjustZMin();\r
        bool sh = mglchr(pen,'!');\r
 \r
        long pal;\r
@@ -1156,30 +1370,35 @@ void MGL_EXPORT mgl_ohlc_x(HMGL gr, HCDT x, HCDT open, HCDT high, HCDT low, HCDT
        for(long j=0;j<m;j++)\r
        {\r
                if(gr->NeedStop())      break;\r
-               mreal c1,c2;    c2=c1=gr->NextColor(pal);\r
+               double c1=gr->NextColor(pal), c2=c1;\r
                if(gr->GetNumPal(pal)==2*m && !sh)      c2 = gr->NextColor(pal);\r
                mx = j<x->GetNy() ? j:0;\r
+\r
+               const long kq = gr->AllocPnts(6*n);\r
+#pragma omp parallel for\r
                for(long i=0;i<n;i++)\r
                {\r
-                       mreal dd,vv,x1,x2;\r
+                       double dd,vv,x1,x2;\r
                        vv = x->v(i,mx);        dd = i<nx-1 ? x->v(i+1)-vv : vv-x->v(i-1);\r
                        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
 \r
                        dd = close->v(i,j);\r
-                       mreal c = (i==0 || dd>=close->v(i-1,j)) ? c1:c2;\r
-                       n1=gr->AddPnt(mglPoint(vv,dd,zVal),c);\r
-                       n2=gr->AddPnt(mglPoint(x2,dd,zVal),c);\r
-                       gr->line_plot(n1,n2);\r
+                       double c = !sh? ((i==0 || dd>=close->v(i-1,j)) ? c1:c2) : gr->NextColor(pal,i);\r
+                       gr->AddPntQ(kq+6*i,mglPoint(vv,dd,zVal),c);\r
+                       gr->AddPntQ(kq+6*i+1,mglPoint(x2,dd,zVal),c);\r
                        dd = open->v(i,j);\r
-                       n1=gr->AddPnt(mglPoint(x1,dd,zVal),c);\r
-                       n2=gr->AddPnt(mglPoint(vv,dd,zVal),c);\r
-                       gr->line_plot(n1,n2);\r
-                       n1=gr->AddPnt(mglPoint(vv,low->v(i,j),zVal),c);\r
-                       n2=gr->AddPnt(mglPoint(vv,high->v(i,j),zVal),c);\r
-                       gr->line_plot(n1,n2);\r
+                       gr->AddPntQ(kq+6*i+2,mglPoint(x1,dd,zVal),c);\r
+                       gr->AddPntQ(kq+6*i+3,mglPoint(vv,dd,zVal),c);\r
+                       gr->AddPntQ(kq+6*i+4,mglPoint(vv,low->v(i,j),zVal),c);\r
+                       gr->AddPntQ(kq+6*i+5,mglPoint(vv,high->v(i,j),zVal),c);\r
+               }\r
+               for(long i=0;i<n;i++)\r
+               {\r
+                       long iq = kq+6*i;\r
+                       gr->line_plot(iq,iq+1);\r
+                       gr->line_plot(iq+2,iq+3);\r
+                       gr->line_plot(iq+4,iq+5);\r
                }\r
        }\r
        gr->EndGroup();\r
@@ -1207,10 +1426,10 @@ void MGL_EXPORT mgl_ohlc_(uintptr_t *gr, uintptr_t *open, uintptr_t *high, uintp
 //\r
 //-----------------------------------------------------------------------------\r
 double sgn(double a);\r
-int MGL_NO_EXPORT mgl_cmp_flt(const void *a, const void *b)\r
+int static mgl_cmp_flt(const void *a, const void *b)\r
 {\r
-       const mreal *aa = (const mreal *)a;\r
-       const mreal *bb = (const mreal *)b;\r
+       const double *aa = (const double *)a;\r
+       const double *bb = (const double *)b;\r
        return int(sgn(*aa-*bb));\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -1220,23 +1439,22 @@ void MGL_EXPORT mgl_boxplot_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const c
        if(nx<n || nx<2 || m<2) {       gr->SetWarn(mglWarnDim,"BoxPlot");      return; }\r
        gr->SaveState(opt);\r
        static int cgid=1;      gr->StartGroup("BoxPlot",cgid++);\r
-       mreal *b = new mreal[5*n], x1, x2, dd, dv=nx>n?1:0;\r
+       double *b = new double[5*n], dv=nx>n?1:0;\r
        if(mglchr(pen,'<'))     dv = 1;\r
        if(mglchr(pen,'^'))     dv = 0;\r
        if(mglchr(pen,'>'))     dv = -1;\r
-       mreal zVal = gr->AdjustZMin(), vv;\r
+       double zVal = gr->AdjustZMin();\r
        bool sh = mglchr(pen,'!');\r
-       mreal *d = new mreal[m];\r
+       double *d = new double[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
+                       double vv = y->v(i,j);\r
                        if(mgl_isnum(vv))       {       d[mm]=vv;       mm++;   }\r
                }\r
-//                     if(m==0)        {       b[i]=NAN;       break;  }\r
-               qsort(d, mm, sizeof(mreal), mgl_cmp_flt);\r
+               qsort(d, mm, sizeof(double), mgl_cmp_flt);\r
                b[i] = d[0];    b[i+4*n] = d[mm-1];             k = mm/4;\r
                b[i+n] = (mm%4) ? d[k] : (d[k]+d[k-1])/2.;\r
                b[i+2*n] = (mm%2) ? d[mm/2] : (d[mm/2]+d[mm/2-1])/2.;\r
@@ -1245,46 +1463,41 @@ void MGL_EXPORT mgl_boxplot_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const c
        delete []d;\r
 \r
        long pal;\r
-       gr->SetPenPal(pen,&pal);        gr->NextColor(pal);     gr->Reserve(18*n);\r
+       gr->SetPenPal(pen,&pal);        gr->NextColor(pal);\r
+\r
+       const long kq = gr->AllocPnts(18*n);\r
+#pragma omp parallel for\r
        for(long i=0;i<n;i++)\r
        {\r
-               vv = x->v(i);\r
-               dd = i<nx-1 ? x->v(i+1)-vv : vv-x->v(i-1);\r
-               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
-\r
-               n1=gr->AddPnt(mglPoint(x1,b[i],zVal),c);        // horizontal lines\r
-               n2=gr->AddPnt(mglPoint(x2,b[i],zVal),c);\r
-               gr->line_plot(n1,n2);\r
-               n1=gr->AddPnt(mglPoint(x1,b[i+n],zVal),c);\r
-               n2=gr->AddPnt(mglPoint(x2,b[i+n],zVal),c);\r
-               gr->line_plot(n1,n2);\r
-               n1=gr->AddPnt(mglPoint(x1,b[i+2*n],zVal),c);\r
-               n2=gr->AddPnt(mglPoint(x2,b[i+2*n],zVal),c);\r
-               gr->line_plot(n1,n2);\r
-               n1=gr->AddPnt(mglPoint(x1,b[i+3*n],zVal),c);\r
-               n2=gr->AddPnt(mglPoint(x2,b[i+3*n],zVal),c);\r
-               gr->line_plot(n1,n2);\r
-               n1=gr->AddPnt(mglPoint(x1,b[i+4*n],zVal),c);\r
-               n2=gr->AddPnt(mglPoint(x2,b[i+4*n],zVal),c);\r
-               gr->line_plot(n1,n2);\r
-\r
-               //vertical lines\r
-               n1=gr->AddPnt(mglPoint(x1,b[i+n],zVal),c);\r
-               n2=gr->AddPnt(mglPoint(x1,b[i+3*n],zVal),c);\r
-               gr->line_plot(n1,n2);\r
-               n1=gr->AddPnt(mglPoint(x2,b[i+n],zVal),c);\r
-               n2=gr->AddPnt(mglPoint(x2,b[i+3*n],zVal),c);\r
-               gr->line_plot(n1,n2);\r
-               n1=gr->AddPnt(mglPoint((x1+x2)/2,b[i],zVal),c);\r
-               n2=gr->AddPnt(mglPoint((x1+x2)/2,b[i+n],zVal),c);\r
-               gr->line_plot(n1,n2);\r
-               n1=gr->AddPnt(mglPoint((x1+x2)/2,b[i+3*n],zVal),c);\r
-               n2=gr->AddPnt(mglPoint((x1+x2)/2,b[i+4*n],zVal),c);\r
-               gr->line_plot(n1,n2);\r
+               const double vv = x->v(i);\r
+               const double dd = i<nx-1 ? x->v(i+1)-vv : vv-x->v(i-1);\r
+               const double x1 = vv + dd/2*(dv-gr->BarWidth);\r
+               const double x2 = x1 + gr->BarWidth*dd;\r
+               const double c = sh ? gr->NextColor(pal,i):gr->CDef;\r
+               const long iq = kq+18*i;\r
+\r
+               gr->AddPntQ(iq,mglPoint(x1,b[i],zVal),c);       // horizontal lines\r
+               gr->AddPntQ(iq+1,mglPoint(x2,b[i],zVal),c);\r
+               gr->AddPntQ(iq+2,mglPoint(x1,b[i+n],zVal),c);\r
+               gr->AddPntQ(iq+3,mglPoint(x2,b[i+n],zVal),c);\r
+               gr->AddPntQ(iq+4,mglPoint(x1,b[i+2*n],zVal),c);\r
+               gr->AddPntQ(iq+5,mglPoint(x2,b[i+2*n],zVal),c);\r
+               gr->AddPntQ(iq+6,mglPoint(x1,b[i+3*n],zVal),c);\r
+               gr->AddPntQ(iq+7,mglPoint(x2,b[i+3*n],zVal),c);\r
+               gr->AddPntQ(iq+8,mglPoint(x1,b[i+4*n],zVal),c);\r
+               gr->AddPntQ(iq+9,mglPoint(x2,b[i+4*n],zVal),c);\r
+\r
+               gr->AddPntQ(iq+10,mglPoint(x1,b[i+n],zVal),c);  //vertical lines\r
+               gr->AddPntQ(iq+11,mglPoint(x1,b[i+3*n],zVal),c);\r
+               gr->AddPntQ(iq+12,mglPoint(x2,b[i+n],zVal),c);\r
+               gr->AddPntQ(iq+13,mglPoint(x2,b[i+3*n],zVal),c);\r
+               gr->AddPntQ(iq+14,mglPoint((x1+x2)/2,b[i],zVal),c);\r
+               gr->AddPntQ(iq+15,mglPoint((x1+x2)/2,b[i+n],zVal),c);\r
+               gr->AddPntQ(iq+16,mglPoint((x1+x2)/2,b[i+3*n],zVal),c);\r
+               gr->AddPntQ(iq+17,mglPoint((x1+x2)/2,b[i+4*n],zVal),c);\r
        }\r
+       for(long i=0;i<n;i++)   for(long j=0;j<9;j++)\r
+               gr->line_plot(kq+18*i+2*j, kq+18*i+2*j+1);\r
        delete []b;     gr->EndGroup();\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -1323,7 +1536,7 @@ void MGL_EXPORT mgl_error_exy(HMGL gr, HCDT x, HCDT y, HCDT ex, HCDT ey, const c
 \r
        bool ma = mglchr(pen,'@');\r
        char mk = gr->SetPenPal(pen,&pal);\r
-       mreal zVal=gr->AdjustZMin();\r
+       double zVal=gr->AdjustZMin();\r
        gr->Reserve(5*n*m);\r
        if(ma && (mk==0 || !strchr("PXsSdD+xoOC",mk) )) mk = 'S';\r
        gr->ResetMask();\r
@@ -1336,100 +1549,146 @@ void MGL_EXPORT mgl_error_exy(HMGL gr, HCDT x, HCDT y, HCDT ex, HCDT ey, const c
                gr->NextColor(pal);\r
                if(ma)\r
                {\r
-                       if(strchr("PXsS",mk))   for(long i=0;i<n;i++)   // boundary of square\r
+                       if(strchr("PXsS",mk))   // boundary of square\r
                        {\r
-                               mreal vx=x->v(i,mx), ve=ex->v(i,m1), vy=y->v(i,my), vf=ey->v(i,m2);\r
-                               mreal c = sh ? gr->NextColor(pal,i):gr->CDef;\r
-                               long n1 = gr->AddPnt(mglPoint(vx-ve, vy+vf, zVal),c,q,-1,27);\r
-                               long n2 = gr->AddPnt(mglPoint(vx-ve, vy-vf, zVal),c,q,-1,27);\r
-                               long n3 = gr->AddPnt(mglPoint(vx+ve, vy+vf, zVal),c,q,-1,27);\r
-                               long n4 = gr->AddPnt(mglPoint(vx+ve, vy-vf, zVal),c,q,-1,27);\r
-                               gr->line_plot(n1,n2);   gr->line_plot(n1,n3);\r
-                               gr->line_plot(n4,n2);   gr->line_plot(n4,n3);\r
+                               const long kq = gr->AllocPnts(4*n);\r
+#pragma omp parallel for\r
+                               for(long i=0;i<n;i++)\r
+                               {\r
+                                       double vx=x->v(i,mx), ve=ex->v(i,m1), vy=y->v(i,my), vf=ey->v(i,m2);\r
+                                       double c = sh ? gr->NextColor(pal,i):gr->CDef;\r
+                                       gr->AddPntQ(kq+4*i,mglPoint(vx-ve, vy+vf, zVal),c,q,-1,27);\r
+                                       gr->AddPntQ(kq+4*i+1,mglPoint(vx-ve, vy-vf, zVal),c,q,-1,27);\r
+                                       gr->AddPntQ(kq+4*i+2,mglPoint(vx+ve, vy+vf, zVal),c,q,-1,27);\r
+                                       gr->AddPntQ(kq+4*i+3,mglPoint(vx+ve, vy-vf, zVal),c,q,-1,27);\r
+                               }\r
+                               for(long i=0;i<n;i++)\r
+                               {\r
+                                       long iq = kq+4*i;\r
+                                       gr->line_plot(iq,iq+1);         gr->line_plot(iq,iq+2);\r
+                                       gr->line_plot(iq+3,iq+1);       gr->line_plot(iq+3,iq+2);\r
+                               }\r
                        }\r
-                       if(strchr("dD",mk))     for(long i=0;i<n;i++)   // boundary of rhomb\r
+                       if(strchr("dD",mk))\r
                        {\r
-                               mreal vx=x->v(i,mx), ve=ex->v(i,m1), vy=y->v(i,my), vf=ey->v(i,m2);\r
-                               mreal c = sh ? gr->NextColor(pal,i):gr->CDef;\r
-                               long n1 = gr->AddPnt(mglPoint(vx, vy+vf, zVal),c,q,-1,27);\r
-                               long n2 = gr->AddPnt(mglPoint(vx-ve, vy, zVal),c,q,-1,27);\r
-                               long n3 = gr->AddPnt(mglPoint(vx, vy-vf, zVal),c,q,-1,27);\r
-                               long n4 = gr->AddPnt(mglPoint(vx+ve, vy, zVal),c,q,-1,27);\r
-                               gr->line_plot(n1,n2);   gr->line_plot(n2,n3);\r
-                               gr->line_plot(n3,n4);   gr->line_plot(n4,n1);\r
+                               const long kq = gr->AllocPnts(4*n);\r
+#pragma omp parallel for\r
+                               for(long i=0;i<n;i++)   // boundary of rhomb\r
+                               {\r
+                                       double vx=x->v(i,mx), ve=ex->v(i,m1), vy=y->v(i,my), vf=ey->v(i,m2);\r
+                                       double c = sh ? gr->NextColor(pal,i):gr->CDef;\r
+                                       gr->AddPntQ(kq+4*i,mglPoint(vx, vy+vf, zVal),c,q,-1,27);\r
+                                       gr->AddPntQ(kq+4*i+1,mglPoint(vx-ve, vy, zVal),c,q,-1,27);\r
+                                       gr->AddPntQ(kq+4*i+2,mglPoint(vx, vy-vf, zVal),c,q,-1,27);\r
+                                       gr->AddPntQ(kq+4*i+3,mglPoint(vx+ve, vy, zVal),c,q,-1,27);\r
+                               }\r
+                               for(long i=0;i<n;i++)\r
+                               {\r
+                                       long iq = kq+4*i;\r
+                                       gr->line_plot(iq,iq+1);         gr->line_plot(iq+1,iq+2);\r
+                                       gr->line_plot(iq+2,iq+3);       gr->line_plot(iq+3,iq);\r
+                               }\r
                        }\r
-                       if(strchr("oOC",mk))    for(long i=0;i<n;i++)   // circle\r
+                       if(strchr("oOC",mk))\r
                        {\r
-                               mreal vx=x->v(i,mx), ve=ex->v(i,m1), vy=y->v(i,my), vf=ey->v(i,m2);\r
-                               mreal c = sh ? gr->NextColor(pal,i):gr->CDef;\r
-                               long n1,n2,k;\r
-                               for(k=0,n2=-1;k<=40;k++)\r
+                               const long kq = gr->AllocPnts(40*n);\r
+#pragma omp parallel for\r
+                               for(long i=0;i<n;i++)   // circle\r
                                {\r
-                                       n1 = n2;\r
-                                       n2 = gr->AddPnt(mglPoint(vx+ve*mgl_cos[(18*k)%360],\r
-                                                       vy+vf*mgl_cos[(270+18*k)%360], zVal),c,q,-1,27);\r
-                                       if(k>0) gr->line_plot(n1,n2);\r
+                                       double vx=x->v(i,mx), ve=ex->v(i,m1), vy=y->v(i,my), vf=ey->v(i,m2);\r
+                                       double c = sh ? gr->NextColor(pal,i):gr->CDef;\r
+                                       for(long k=0;k<40;k++)\r
+                                               gr->AddPntQ(kq+40*i+k,mglPoint(vx+ve*mgl_cos[(18*k)%360],\r
+                                                               vy+vf*mgl_cos[(270+18*k)%360], zVal),c,q,-1,27);\r
+                               }\r
+                               for(long i=0;i<n;i++)   // circle\r
+                               {\r
+                                       long iq = kq+40*i;      gr->line_plot(iq+39,iq);\r
+                                       for(long k=1;k<40;k++)  gr->line_plot(iq+k-1,iq+k);\r
                                }\r
                        }\r
+                       long kq;\r
                        switch(mk)\r
                        {\r
                        case 'P':       case '+':\r
+                               kq = gr->AllocPnts(4*n);\r
+#pragma omp parallel for\r
                                for(long i=0;i<n;i++)\r
                                {\r
-                                       mreal vx=x->v(i,mx), ve=ex->v(i,m1), vy=y->v(i,my), vf=ey->v(i,m2);\r
-                                       mreal c = sh ? gr->NextColor(pal,i):gr->CDef;\r
-                                       long n1 = gr->AddPnt(mglPoint(vx, vy+vf, zVal),c,q,-1,27);\r
-                                       long n2 = gr->AddPnt(mglPoint(vx-ve, vy, zVal),c,q,-1,27);\r
-                                       long n3 = gr->AddPnt(mglPoint(vx, vy-vf, zVal),c,q,-1,27);\r
-                                       long n4 = gr->AddPnt(mglPoint(vx+ve, vy, zVal),c,q,-1,27);\r
-                                       gr->line_plot(n1,n3);   gr->line_plot(n2,n4);\r
+                                       double vx=x->v(i,mx), ve=ex->v(i,m1), vy=y->v(i,my), vf=ey->v(i,m2);\r
+                                       double c = sh ? gr->NextColor(pal,i):gr->CDef;\r
+                                       gr->AddPntQ(kq+4*i,mglPoint(vx, vy+vf, zVal),c,q,-1,27);\r
+                                       gr->AddPntQ(kq+4*i+1,mglPoint(vx-ve, vy, zVal),c,q,-1,27);\r
+                                       gr->AddPntQ(kq+4*i+2,mglPoint(vx, vy-vf, zVal),c,q,-1,27);\r
+                                       gr->AddPntQ(kq+4*i+3,mglPoint(vx+ve, vy, zVal),c,q,-1,27);\r
+                               }\r
+                               for(long i=0;i<n;i++)\r
+                               {       long iq = kq+4*i;\r
+                                       gr->line_plot(iq,iq+2); gr->line_plot(iq+1,iq+3);\r
                                }       break;\r
                        case 'X':       case 'x':\r
+                               kq = gr->AllocPnts(4*n);\r
+#pragma omp parallel for\r
                                for(long i=0;i<n;i++)\r
                                {\r
-                                       mreal vx=x->v(i,mx), ve=ex->v(i,m1), vy=y->v(i,my), vf=ey->v(i,m2);\r
-                                       mreal c = sh ? gr->NextColor(pal,i):gr->CDef;\r
-                                       long n1 = gr->AddPnt(mglPoint(vx-ve, vy+vf, zVal),c,q,-1,27);\r
-                                       long n2 = gr->AddPnt(mglPoint(vx-ve, vy-vf, zVal),c,q,-1,27);\r
-                                       long n3 = gr->AddPnt(mglPoint(vx+ve, vy+vf, zVal),c,q,-1,27);\r
-                                       long n4 = gr->AddPnt(mglPoint(vx+ve, vy-vf, zVal),c,q,-1,27);\r
-                                       gr->line_plot(n1,n4);   gr->line_plot(n2,n3);\r
+                                       double vx=x->v(i,mx), ve=ex->v(i,m1), vy=y->v(i,my), vf=ey->v(i,m2);\r
+                                       double c = sh ? gr->NextColor(pal,i):gr->CDef;\r
+                                       gr->AddPntQ(kq+4*i,mglPoint(vx-ve, vy+vf, zVal),c,q,-1,27);\r
+                                       gr->AddPntQ(kq+4*i+1,mglPoint(vx-ve, vy-vf, zVal),c,q,-1,27);\r
+                                       gr->AddPntQ(kq+4*i+2,mglPoint(vx+ve, vy+vf, zVal),c,q,-1,27);\r
+                                       gr->AddPntQ(kq+4*i+3,mglPoint(vx+ve, vy-vf, zVal),c,q,-1,27);\r
+                               }\r
+                               for(long i=0;i<n;i++)\r
+                               {       long iq = kq+4*i;\r
+                                       gr->line_plot(iq,iq+3); gr->line_plot(iq+1,iq+2);\r
                                }       break;\r
                        case 'S':\r
+                               kq = gr->AllocPnts(4*n);\r
+#pragma omp parallel for\r
                                for(long i=0;i<n;i++)\r
                                {\r
-                                       mreal vx=x->v(i,mx), ve=ex->v(i,m1), vy=y->v(i,my), vf=ey->v(i,m2);\r
-                                       mreal c = sh ? gr->NextColor(pal,i):gr->CDef;\r
-                                       long n1 = gr->AddPnt(mglPoint(vx-ve, vy+vf, zVal),c,q,-1,27);\r
-                                       long n2 = gr->AddPnt(mglPoint(vx-ve, vy-vf, zVal),c,q,-1,27);\r
-                                       long n3 = gr->AddPnt(mglPoint(vx+ve, vy+vf, zVal),c,q,-1,27);\r
-                                       long n4 = gr->AddPnt(mglPoint(vx+ve, vy-vf, zVal),c,q,-1,27);\r
-                                       gr->quad_plot(n1,n2,n3,n4);\r
-                               }       break;\r
+                                       double vx=x->v(i,mx), ve=ex->v(i,m1), vy=y->v(i,my), vf=ey->v(i,m2);\r
+                                       double c = sh ? gr->NextColor(pal,i):gr->CDef;\r
+                                       gr->AddPntQ(kq+4*i,mglPoint(vx-ve, vy+vf, zVal),c,q,-1,27);\r
+                                       gr->AddPntQ(kq+4*i+1,mglPoint(vx-ve, vy-vf, zVal),c,q,-1,27);\r
+                                       gr->AddPntQ(kq+4*i+2,mglPoint(vx+ve, vy+vf, zVal),c,q,-1,27);\r
+                                       gr->AddPntQ(kq+4*i+3,mglPoint(vx+ve, vy-vf, zVal),c,q,-1,27);\r
+                               }\r
+                               for(long i=0;i<n;i++)\r
+                               {       long iq = kq+4*i;       gr->quad_plot(iq,iq+1,iq+2,iq+3);       }\r
+                               break;\r
                        case 'D':\r
+                               kq = gr->AllocPnts(4*n);\r
+#pragma omp parallel for\r
                                for(long i=0;i<n;i++)\r
                                {\r
-                                       mreal vx=x->v(i,mx), ve=ex->v(i,m1), vy=y->v(i,my), vf=ey->v(i,m2);\r
-                                       mreal c = sh ? gr->NextColor(pal,i):gr->CDef;\r
-                                       long n1 = gr->AddPnt(mglPoint(vx, vy+vf, zVal),c,q,-1,27);\r
-                                       long n2 = gr->AddPnt(mglPoint(vx-ve, vy, zVal),c,q,-1,27);\r
-                                       long n3 = gr->AddPnt(mglPoint(vx, vy-vf, zVal),c,q,-1,27);\r
-                                       long n4 = gr->AddPnt(mglPoint(vx+ve, vy, zVal),c,q,-1,27);\r
-                                       gr->quad_plot(n1,n4,n2,n3);\r
-                               }       break;\r
-                       case 'O':\r
+                                       double vx=x->v(i,mx), ve=ex->v(i,m1), vy=y->v(i,my), vf=ey->v(i,m2);\r
+                                       double c = sh ? gr->NextColor(pal,i):gr->CDef;\r
+                                       gr->AddPntQ(kq+4*i,mglPoint(vx, vy+vf, zVal),c,q,-1,27);\r
+                                       gr->AddPntQ(kq+4*i+1,mglPoint(vx-ve, vy, zVal),c,q,-1,27);\r
+                                       gr->AddPntQ(kq+4*i+2,mglPoint(vx, vy-vf, zVal),c,q,-1,27);\r
+                                       gr->AddPntQ(kq+4*i+3,mglPoint(vx+ve, vy, zVal),c,q,-1,27);\r
+                               }\r
                                for(long i=0;i<n;i++)\r
+                               {       long iq = kq+4*i;       gr->quad_plot(iq,iq+3,iq+1,iq+2);       }\r
+                               break;\r
+                       case 'O':\r
+                               kq = gr->AllocPnts(41*n);\r
+#pragma omp parallel for\r
+                               for(long i=0;i<n;i++)   // circle\r
                                {\r
-                                       mreal vx=x->v(i,mx), ve=ex->v(i,m1), vy=y->v(i,my), vf=ey->v(i,m2);\r
-                                       mreal c = sh ? gr->NextColor(pal,i):gr->CDef;\r
-                                       long n1, n2, n3 = gr->AddPnt(mglPoint(vx,vy,zVal),c),k;\r
-                                       for(k=0,n2=-1;k<=40;k++)\r
-                                       {\r
-                                               n1 = n2;\r
-                                               n2 = gr->AddPnt(mglPoint(vx+ve*mgl_cos[(18*k)%360],\r
+                                       double vx=x->v(i,mx), ve=ex->v(i,m1), vy=y->v(i,my), vf=ey->v(i,m2);\r
+                                       double c = sh ? gr->NextColor(pal,i):gr->CDef;\r
+                                       long iq = kq+41*i+1;\r
+                                       gr->AddPntQ(iq-1,mglPoint(vx,vy,zVal),c);\r
+                                       for(long k=0;k<40;k++)\r
+                                               gr->AddPntQ(iq+k,mglPoint(vx+ve*mgl_cos[(18*k)%360],\r
                                                                vy+vf*mgl_cos[(270+18*k)%360], zVal),c,q,-1,27);\r
-                                               if(k>0) gr->trig_plot(n1,n2,n3);\r
-                                       }\r
+                               }\r
+                               for(long i=0;i<n;i++)   // circle\r
+                               {\r
+                                       long iq = kq+41*i+1;    gr->trig_plot(iq-1,iq+39,iq);\r
+                                       for(long k=1;k<40;k++)  gr->trig_plot(iq-1,iq+k-1,iq+k);\r
                                }       break;\r
                        case 'C':\r
                                for(long i=0;i<n;i++)\r
@@ -1439,19 +1698,29 @@ void MGL_EXPORT mgl_error_exy(HMGL gr, HCDT x, HCDT y, HCDT ex, HCDT ey, const c
                                }\r
                        }\r
                }\r
-               else    for(long i=0;i<n;i++)\r
+               else\r
                {\r
-                       mreal vx=x->v(i,mx), ve=ex->v(i,m1), vy=y->v(i,my), vf=ey->v(i,m2);\r
-                       mreal c = sh ? gr->NextColor(pal,i):gr->CDef;\r
-                       if(mk)  gr->mark_plot(gr->AddPnt(mglPoint(vx,vy,zVal),c), mk);\r
-\r
-                       long n1 = gr->AddPnt(mglPoint(vx, vy+vf, zVal),c,q,-1,27);\r
-                       long n2 = gr->AddPnt(mglPoint(vx, vy-vf, zVal),c,q,-1,27);\r
-                       gr->line_plot(n1,n2);   gr->arrow_plot(n1,n2,'I');      gr->arrow_plot(n2,n1,'I');\r
-\r
-                       n1 = gr->AddPnt(mglPoint(vx+ve, vy, zVal),-1,q,c,27);\r
-                       n2 = gr->AddPnt(mglPoint(vx-ve, vy, zVal),-1,q,c,27);\r
-                       gr->line_plot(n1,n2);   gr->arrow_plot(n1,n2,'I');      gr->arrow_plot(n2,n1,'I');\r
+                       const long nq = mk?5:4, kq = gr->AllocPnts(nq*n);\r
+#pragma omp parallel for\r
+                       for(long i=0;i<n;i++)\r
+                       {\r
+                               double vx=x->v(i,mx), ve=ex->v(i,m1), vy=y->v(i,my), vf=ey->v(i,m2);\r
+                               double c = sh ? gr->NextColor(pal,i):gr->CDef;\r
+                               long iq = kq + nq*i;\r
+                               gr->AddPntQ(iq,mglPoint(vx, vy+vf, zVal),c,q,-1,27);\r
+                               gr->AddPntQ(iq+1,mglPoint(vx, vy-vf, zVal),c,q,-1,27);\r
+                               gr->AddPntQ(iq+2,mglPoint(vx+ve, vy, zVal),-1,q,c,27);\r
+                               gr->AddPntQ(iq+3,mglPoint(vx-ve, vy, zVal),-1,q,c,27);\r
+                               if(mk)  gr->AddPntQ(iq+4,mglPoint(vx,vy,zVal),c);\r
+                       }\r
+                       for(long i=0;i<n;i++)\r
+                       {\r
+                               long iq = kq + nq*i;\r
+                               if(mk)  gr->mark_plot(iq+4, mk);\r
+                               gr->line_plot(iq,iq+1);                 gr->line_plot(iq+2,iq+3);\r
+                               gr->arrow_plot(iq,iq+1,'I');    gr->arrow_plot(iq+1,iq,'I');\r
+                               gr->arrow_plot(iq+2,iq+3,'I');  gr->arrow_plot(iq+3,iq+2,'I');\r
+                       }\r
                }\r
        }\r
        gr->EndGroup();\r
@@ -1492,40 +1761,38 @@ void MGL_EXPORT mgl_error_exy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintpt
 //             Chart series\r
 //\r
 //-----------------------------------------------------------------------------\r
-void face_plot(mglBase *gr, mglPoint o, mglPoint d1, mglPoint d2, mreal c, bool wire)\r
+void face_plot(mglBase *gr, mglPoint o, mglPoint d1, mglPoint d2, double c, bool wire)\r
 {\r
        const int num=10;\r
        mglPoint nn=d1^d2;\r
        d1 = d1/num;    d2 = d2/num;\r
-       long n=num+1, *id=new long[n*n];\r
-       gr->Reserve(n*n);\r
+       const long n=num+1, kq = gr->AllocPnts(n*n);\r
+#pragma omp parallel for\r
        for(long j=0;j<n;j++)   for(long i=0;i<n;i++)\r
-               id[i+n*j] = gr->AddPnt(o+d1*i+d2*j,c,nn);\r
+               gr->AddPntQ(kq+i+n*j,o+d1*i+d2*j,c,nn);\r
        for(long j=0;j<num;j++) for(long i=0;i<num;i++)\r
-       {\r
-               long *ii = id+i+n*j;\r
-               gr->quad_plot(ii[0],ii[1],ii[n],ii[n+1]);\r
-       }\r
+       {       long ii = kq+i+n*j;     gr->quad_plot(ii,ii+1,ii+n,ii+n+1);     }\r
        if(wire)\r
        {\r
-               gr->Reserve(4*n);       gr->SetPenPal("k-");\r
-               long *jj=id+n+1;\r
-               jj[0] = jj[1] = gr->CopyNtoC(id[0],gr->CDef);\r
-               jj[2] = jj[3] = gr->CopyNtoC(id[n*n-1],gr->CDef);\r
-               for(long i=1;i<n;i++)\r
+               gr->SetPenPal("k-");\r
+               const long jq = gr->AllocPnts(4*n);\r
+#pragma omp parallel for\r
+               for(long i=0;i<n;i++)\r
+               {\r
+                       gr->CopyNtoC(jq+4*i,kq+i,gr->CDef);\r
+                       gr->CopyNtoC(jq+4*i+1,kq+n*i,gr->CDef);\r
+                       gr->CopyNtoC(jq+4*i+2,kq+n*n-1-i,gr->CDef);\r
+                       gr->CopyNtoC(jq+4*i+3,kq+n*n-1-n*i,gr->CDef);\r
+               }\r
+               for(long i=0;i<num;i++)\r
                {\r
-                       memcpy(jj+4,jj,4*sizeof(long));\r
-                       jj[0] = gr->CopyNtoC(id[i],gr->CDef);\r
-                       jj[1] = gr->CopyNtoC(id[n*i],gr->CDef);\r
-                       jj[2] = gr->CopyNtoC(id[n*n-1-i],gr->CDef);\r
-                       jj[3] = gr->CopyNtoC(id[n*n-1-n*i],gr->CDef);\r
-                       gr->line_plot(jj[4],jj[0]);\r
-                       gr->line_plot(jj[5],jj[1]);\r
-                       gr->line_plot(jj[6],jj[2]);\r
-                       gr->line_plot(jj[7],jj[3]);\r
+                       long jj = jq+4*i;\r
+                       gr->line_plot(jj+4,jj);\r
+                       gr->line_plot(jj+5,jj+1);\r
+                       gr->line_plot(jj+6,jj+2);\r
+                       gr->line_plot(jj+7,jj+3);\r
                }\r
        }\r
-       delete []id;\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_chart(HMGL gr, HCDT a, const char *cols, const char *opt)\r
@@ -1534,18 +1801,18 @@ 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
-       mreal *c = new mreal[len+1],cc;\r
+       double *c = new double[len+1],cc;\r
        long nc=0;                      // number of colors\r
        for(i=0;i<len;i++)\r
                if(strchr(MGL_COLORS,cols[i]) || cols[i]==' ')\r
                {       c[nc]=gr->AddTexture(cols[i]);  nc++;   }\r
        // NOTE: nc>0 since j>0 or MGL_DEF_PAL is not empty\r
 \r
-       mreal dy = (gr->Max.y-gr->Min.y)/a->GetNy(), dx, ss, cs, x1, y1, dz=gr->Max.z-gr->Min.z, vv;\r
+       double dy = (gr->Max.y-gr->Min.y)/a->GetNy(), dx, ss, cs, x1, y1, dz=gr->Max.z-gr->Min.z, vv;\r
        mglPoint d1,d2,o;\r
 \r
        for(j=0;j<a->GetNy();j++)\r
@@ -1597,17 +1864,21 @@ 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
+               const long kq = gr->AllocPnts(n);\r
+#pragma omp parallel for\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
+                       double c = sh ? gr->NextColor(pal,i):gr->CDef;\r
+                       gr->AddPntQ(kq+i,mglPoint(x->v(i,mx),y->v(i,my),z->v(i,mz)),c);\r
                }\r
+               for(long i=0;i<n;i+=dx)         gr->mark_plot(kq+i, mk, fabs(r->v(i,mr)));\r
        }\r
        gr->EndGroup();\r
 }\r
@@ -1621,7 +1892,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
@@ -1653,7 +1924,7 @@ void MGL_EXPORT mgl_tube_xyzr(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT r, const cha
        long m,n=y->GetNx(),pal;\r
        if(mgl_check_dim1(gr,x,y,z,r,"Tube"))   return;\r
 \r
-       gr->SaveState(opt);\r
+       mreal rnum = gr->SaveState(opt);\r
        static int cgid=1;      gr->StartGroup("Tube",cgid++);\r
        m = x->GetNy() > y->GetNy() ? x->GetNy() : y->GetNy();\r
        m = z->GetNy() > m ? z->GetNy() : m;\r
@@ -1661,39 +1932,42 @@ void MGL_EXPORT mgl_tube_xyzr(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT r, const cha
        bool sh = mglchr(pen,'!');\r
        bool wire = mglchr(pen,'#');\r
 \r
-       int num=!(gr->GetQuality()&3)?13:25;\r
-       gr->SetPenPal(pen,&pal);\r
-       gr->Reserve(n*m*num);\r
-       mglPoint p,l,t,u,q,d;\r
-       long *nn=new long[2*num];\r
-       memset(nn,-1,2*num*sizeof(long));\r
+       int num = rnum>2?rnum:!(gr->GetQuality()&3)?13:25;\r
+       gr->SetPenPal(pen,&pal);        gr->Reserve(n*m*num);\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
+               const long mx = j<x->GetNy() ? j:0, my = j<y->GetNy() ? j:0;\r
+               const long mz = j<z->GetNy() ? j:0, mr = j<r->GetNy() ? j:0;\r
+               const long kq = gr->AllocPnts(n*num);\r
+#pragma omp parallel for collapse(2)\r
+               for(long i=0;i<n;i++)   for(long k=0;k<num;k++)\r
                {\r
-                       l.Set(x->dvx(i,mx),y->dvx(i,my),z->dvx(i,mz));\r
-                       t = !l;         t.Normalize();  u = t^l;        u.Normalize();\r
-                       q.Set(x->v(i,mx),y->v(i,my),z->v(i,mz));\r
-                       mreal rr=r->v(i,mr), dr=r->dvx(i,mr);\r
-                       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
-                               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
-                               if(i*k>0 && !wire)      gr->quad_plot(nn[k],nn[k-1],nn[k+num],nn[k+num-1]);\r
-                               if(i*k>0 && wire && k%4==0)     gr->line_plot(nn[k],nn[k+num]);\r
-                               if(k>0 && wire)         gr->line_plot(nn[k],nn[k-1]);\r
-                       }\r
+                       const mglPoint l(x->dvx(i,mx),y->dvx(i,my),z->dvx(i,mz));\r
+                       mglPoint t(!l);         t.Normalize();\r
+                       mglPoint u(t^l);        u.Normalize();\r
+                       const mglPoint q(x->v(i,mx),y->v(i,my),z->v(i,mz));\r
+                       const double rr=r->v(i,mr), dr=r->dvx(i,mr);\r
+                       const double c = sh ? gr->NextColor(pal,i):gr->CDef;\r
+\r
+                       const int kk = k*360/(num-1);\r
+                       const float  co = mgl_cos[kk%360], si = mgl_cos[(270+kk)%360];\r
+                       const mglPoint p(q + t*(rr*co) + u*(rr*si));\r
+                       const mglPoint d((t*si - u*co)^(l + t*(dr*co) + u*(dr*si)));\r
+                       gr->AddPntQ(kq+num*i+k, p,c,wire?mglPoint(NAN,NAN):d,-1,3);\r
+               }\r
+               if(!wire)       for(long i=1;i<n;i++)   for(long k=1;k<num;k++)\r
+               {       long jj=kq+num*i+k;     gr->quad_plot(jj,jj-1,jj-num,jj-num-1); }\r
+               if(wire)\r
+               {\r
+                       for(long i=1;i<n;i++)   for(long k=0;k<num;k+=4)\r
+                       {       long jj=kq+num*i+k;     gr->line_plot(jj,jj-num);       }\r
+                       for(long i=0;i<n;i++)   for(long k=1;k<num;k++)\r
+                       {       long jj=kq+num*i+k;     gr->line_plot(jj,jj-1);         }\r
                }\r
        }\r
-       delete []nn;    gr->EndGroup();\r
+       gr->EndGroup();\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_tube_xyr(HMGL gr, HCDT x, HCDT y, HCDT r, const char *pen, const char *opt)\r
@@ -1705,7 +1979,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
@@ -1715,7 +1989,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
@@ -1726,7 +2000,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
@@ -1783,59 +2057,69 @@ void MGL_EXPORT mgl_tape_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c
        if(mgl_check_dim1(gr,x,y,z,0,"Tape"))   return;\r
 \r
        static int cgid=1;      gr->StartGroup("Tape",cgid++);\r
-       mreal ll, rr = gr->SaveState(opt);\r
+       double rr = gr->SaveState(opt);\r
        if(rr==0 || mgl_isnan(rr))      rr = mgl_norm(gr->Max-gr->Min)*gr->BarWidth/25;\r
        m = x->GetNy() > y->GetNy() ? x->GetNy() : y->GetNy();  m = z->GetNy() > m ? z->GetNy() : m;\r
        gr->SetPenPal(pen,&pal);        gr->Reserve(4*n*m);\r
-       mglPoint p1,p2,q1,q2,l,nn,qn(NAN,NAN);\r
-       long n1=-1,n2=-1,n3=-1,n4=-1, m1=-1,m2=-1,m3=-1,m4=-1;\r
+       mglPoint qn(NAN,NAN);\r
        bool sh = mglchr(pen,'!'), xo = mglchr(pen,'x'), zo = mglchr(pen,'z'), wire = mglchr(pen,'#');\r
        if(!xo && !zo)  xo = zo = true;\r
-       mreal c1,c2;\r
+       int nv = xo && zo ? 4:2;\r
 \r
        for(long j=0;j<m;j++)\r
        {\r
                if(gr->NeedStop())      break;\r
-               c2=c1=gr->NextColor(pal);\r
+               double 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
+               const long kq = gr->AllocPnts(nv*n);\r
+// TODO: use AddPntQ() -- problem is vector q1\r
                // initial values for normales\r
-               p2.Set(x->v(0,mx), y->v(0,my), z->v(0,mz));\r
-               l.Set(x->v(1,mx)-p2.x, y->v(1,my)-p2.y, z->v(1,mz)-p2.z);       l /= mgl_norm(l);\r
-               q1.Set(-l.y,l.x,0);     ll = mgl_norm(q1);\r
+               mglPoint p2(x->v(0,mx), y->v(0,my), z->v(0,mz));\r
+               mglPoint l(x->v(1,mx)-p2.x, y->v(1,my)-p2.y, z->v(1,mz)-p2.z);  l /= mgl_norm(l);\r
+               mglPoint q1(-l.y,l.x,0);\r
+               double ll = mgl_norm(q1);\r
                if(ll)  q1 /= ll;       else    q1.Set(0,1,0);\r
-               q2 = (q1^l);\r
-               if(p2>gr->Min && p2<gr->Max)\r
+               mglPoint q2(q1^l);\r
+               if(xo&&zo)\r
                {\r
-                       if(xo)  {       n1 = gr->AddPnt(p2,c1,q2,-1,3); n2 = gr->AddPnt(p2+rr*q1,c1,q2,-1,3);   }\r
-                       if(zo)  {       n3 = gr->AddPnt(p2,c2,q1,-1,3); n4 = gr->AddPnt(p2+rr*q2,c2,q1,-1,3);   }\r
+                       gr->AddPntQ(kq,p2,c1,q2,-1,3);          gr->AddPntQ(kq+1,p2+rr*q1,c1,q2,-1,3);\r
+                       gr->AddPntQ(kq+2,p2,c2,q1,-1,3);        gr->AddPntQ(kq+3,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
+               else if(xo)     {       gr->AddPntQ(kq,p2,c1,q2,-1,3);  gr->AddPntQ(kq+1,p2+rr*q1,c1,q2,-1,3);  }\r
+               else            {       gr->AddPntQ(kq,p2,c2,q1,-1,3);  gr->AddPntQ(kq+1,p2+rr*q2,c2,q1,-1,3);  }\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
+                       mglPoint p1 = p2;\r
+                       p2.Set(x->v(i,mx), y->v(i,my), z->v(i,mz));\r
                        l = p2-p1;              l /= mgl_norm(l);\r
-                       q1 -= l*(l*q1); q1/= mgl_norm(q1);      q2 = (q1^l);\r
-                       m1 = n1;        m2 = n2;        m3 = n3;        m4 = n4;\r
-                       if(sh)  c2=c1=gr->NextColor(pal,i);\r
-                       if(p2>gr->Min && p2<gr->Max)\r
+                       q1 -= l*(l*q1); q1/= mgl_norm(q1);\r
+                       q2 = (q1^l);    // NOTE: not thread safe!!!\r
+\r
+                       if(sh)  c2=c1=gr->NextColor(pal,i);     // NOTE: not thread safe\r
+                       long iq = kq+nv*i;\r
+                       if(xo&&zo)\r
                        {\r
-                               if(xo)\r
-                               {\r
-                                       n1 = gr->AddPnt(p2,c1,wire?qn:q2,-1,3);\r
-                                       n2 = gr->AddPnt(p2+rr*q1,c1,wire?qn:q2,-1,3);\r
-                                       if(wire)        gr->line_plot(m2,n2);\r
-                                       else            gr->quad_plot(n1,n2,m1,m2);\r
-                               }\r
-                               if(zo)\r
-                               {\r
-                                       n3 = gr->AddPnt(p2,c2,wire?qn:q1,-1,3);\r
-                                       n4 = gr->AddPnt(p2+rr*q2,c2,wire?qn:q1,-1,3);\r
-                                       if(wire)        gr->line_plot(m4,n4);\r
-                                       else            gr->quad_plot(n3,n4,m3,m4);\r
-                               }\r
+                               gr->AddPntQ(iq,p2,c1,q2,-1,3);          gr->AddPntQ(iq+1,p2+rr*q1,c1,q2,-1,3);\r
+                               gr->AddPntQ(iq+2,p2,c2,q1,-1,3);        gr->AddPntQ(iq+3,p2+rr*q2,c2,q1,-1,3);\r
                        }\r
+                       else if(xo)     {       gr->AddPntQ(iq,p2,c1,q2,-1,3);  gr->AddPntQ(iq+1,p2+rr*q1,c1,q2,-1,3);  }\r
+                       else            {       gr->AddPntQ(iq,p2,c2,q1,-1,3);  gr->AddPntQ(iq+1,p2+rr*q2,c2,q1,-1,3);  }\r
+               }\r
+               if(wire)\r
+               {\r
+                       if(xo&&zo)      for(long i=1;i<n;i++)\r
+                       {       long iq = kq+nv*i+1;    gr->line_plot(iq-nv,iq);        gr->line_plot(iq-nv+2,iq+2);    }\r
+                       else    for(long i=1;i<n;i++)\r
+                       {       long iq = kq+nv*i+1;    gr->line_plot(iq-nv,iq);        }\r
+               }\r
+               else\r
+               {\r
+                       if(xo&&zo)      for(long i=1;i<n;i++)\r
+                       {       long iq = kq+nv*i;\r
+                               gr->quad_plot(iq,iq+1,iq-nv,iq-nv+1);   gr->quad_plot(iq+2,iq+3,iq-nv+2,iq-nv+3);       }\r
+                       else    for(long i=1;i<n;i++)\r
+                       {       long iq = kq+nv*i;      gr->quad_plot(iq,iq+1,iq-nv,iq-nv+1);   }\r
                }\r
        }\r
        gr->EndGroup();\r
@@ -1850,7 +2134,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
@@ -1895,13 +2179,13 @@ void MGL_EXPORT mgl_pmap_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT r, const char
                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-1;i++)\r
+               for(long i=0;i<n-1;i++) // NOTE: AddPntQ() is useless due to rare points\r
                {\r
-                       mreal r1=r->v(i,mr), r2 = r->v(i+1,mr);\r
+                       double r1=r->v(i,mr), r2 = r->v(i+1,mr);\r
                        if(r1==0)       gr->mark_plot(gr->AddPnt(mglPoint(x->v(i,mx),y->v(i,my),z->v(i,mz))), mk);\r
                        if(r1*r2<0)\r
                        {\r
-                               mreal d = r1/(r1-r2);\r
+                               double d = r1/(r1-r2);\r
                                mglPoint p(x->v(i,mx)*(1-d)+x->v(i+1,mx)*d, y->v(i,my)*(1-d)+y->v(i+1,my)*d, z->v(i,mz)*(1-d)+d*z->v(i+1,mz));\r
                                gr->mark_plot(gr->AddPnt(p), mk);\r
                        }\r
@@ -1919,7 +2203,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 e93dc02958ea2af47234936fcc035f498c48549d..49f742cdddc08b93aebea09b8aed47c78ad7637b 100644 (file)
 //-----------------------------------------------------------------------------\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 b090f8aef91b24fb0398163c974da5bb70d800fd..d9f758959687e5344e4cebf327f06d187f997170 100644 (file)
@@ -67,7 +67,7 @@ using std::string;
 using namespace std;
 
 // Map [0,1] to [0,255]
-inline uint8_t byte(double r) 
+inline uint8_t toByte(double r) 
 {
   if(r < 0.0) r=0.0;
   else if(r > 1.0) r=1.0;
@@ -440,9 +440,9 @@ void oPRCFile::doGroup(PRCgroup& group)
               }
               if(!same_color && i>0)
               {
-                tess->rgba_vertices.push_back(byte(lit->color.red));
-                tess->rgba_vertices.push_back(byte(lit->color.green));
-                tess->rgba_vertices.push_back(byte(lit->color.blue));
+                tess->rgba_vertices.push_back(toByte(lit->color.red));
+                tess->rgba_vertices.push_back(toByte(lit->color.green));
+                tess->rgba_vertices.push_back(toByte(lit->color.blue));
               }
             }
           }
@@ -584,23 +584,23 @@ void oPRCFile::doGroup(PRCgroup& group)
           triangles++;
           if(!same_colour)
           {
-            tessFace->rgba_vertices.push_back(byte(C[1].R));
-            tessFace->rgba_vertices.push_back(byte(C[1].G));
-            tessFace->rgba_vertices.push_back(byte(C[1].B));
+            tessFace->rgba_vertices.push_back(toByte(C[1].R));
+            tessFace->rgba_vertices.push_back(toByte(C[1].G));
+            tessFace->rgba_vertices.push_back(toByte(C[1].B));
             if(tessFace->is_rgba)
-              tessFace->rgba_vertices.push_back(byte(C[1].A));
+              tessFace->rgba_vertices.push_back(toByte(C[1].A));
             
-            tessFace->rgba_vertices.push_back(byte(C[2].R));
-            tessFace->rgba_vertices.push_back(byte(C[2].G));
-            tessFace->rgba_vertices.push_back(byte(C[2].B));
+            tessFace->rgba_vertices.push_back(toByte(C[2].R));
+            tessFace->rgba_vertices.push_back(toByte(C[2].G));
+            tessFace->rgba_vertices.push_back(toByte(C[2].B));
             if(tessFace->is_rgba)
-              tessFace->rgba_vertices.push_back(byte(C[2].A));
+              tessFace->rgba_vertices.push_back(toByte(C[2].A));
             
-            tessFace->rgba_vertices.push_back(byte(C[3].R));
-            tessFace->rgba_vertices.push_back(byte(C[3].G));
-            tessFace->rgba_vertices.push_back(byte(C[3].B));
+            tessFace->rgba_vertices.push_back(toByte(C[3].R));
+            tessFace->rgba_vertices.push_back(toByte(C[3].G));
+            tessFace->rgba_vertices.push_back(toByte(C[3].B));
             if(tessFace->is_rgba)
-              tessFace->rgba_vertices.push_back(byte(C[3].A));
+              tessFace->rgba_vertices.push_back(toByte(C[3].A));
           }
         }
         else
@@ -611,23 +611,23 @@ void oPRCFile::doGroup(PRCgroup& group)
           triangles++;
           if(!same_colour)
           {
-            tessFace->rgba_vertices.push_back(byte(C[0].R));
-            tessFace->rgba_vertices.push_back(byte(C[0].G));
-            tessFace->rgba_vertices.push_back(byte(C[0].B));
+            tessFace->rgba_vertices.push_back(toByte(C[0].R));
+            tessFace->rgba_vertices.push_back(toByte(C[0].G));
+            tessFace->rgba_vertices.push_back(toByte(C[0].B));
             if(tessFace->is_rgba)
-              tessFace->rgba_vertices.push_back(byte(C[0].A));
+              tessFace->rgba_vertices.push_back(toByte(C[0].A));
             
-            tessFace->rgba_vertices.push_back(byte(C[2].R));
-            tessFace->rgba_vertices.push_back(byte(C[2].G));
-            tessFace->rgba_vertices.push_back(byte(C[2].B));
+            tessFace->rgba_vertices.push_back(toByte(C[2].R));
+            tessFace->rgba_vertices.push_back(toByte(C[2].G));
+            tessFace->rgba_vertices.push_back(toByte(C[2].B));
             if(tessFace->is_rgba)
-              tessFace->rgba_vertices.push_back(byte(C[2].A));
+              tessFace->rgba_vertices.push_back(toByte(C[2].A));
             
-            tessFace->rgba_vertices.push_back(byte(C[3].R));
-            tessFace->rgba_vertices.push_back(byte(C[3].G));
-            tessFace->rgba_vertices.push_back(byte(C[3].B));
+            tessFace->rgba_vertices.push_back(toByte(C[3].R));
+            tessFace->rgba_vertices.push_back(toByte(C[3].G));
+            tessFace->rgba_vertices.push_back(toByte(C[3].B));
             if(tessFace->is_rgba)
-              tessFace->rgba_vertices.push_back(byte(C[3].A));
+              tessFace->rgba_vertices.push_back(toByte(C[3].A));
           }
           tess->triangulated_index.push_back(vertex_indices[3]);
           tess->triangulated_index.push_back(vertex_indices[1]);
@@ -635,23 +635,23 @@ void oPRCFile::doGroup(PRCgroup& group)
           triangles++;
           if(!same_colour)
           {
-            tessFace->rgba_vertices.push_back(byte(C[3].R));
-            tessFace->rgba_vertices.push_back(byte(C[3].G));
-            tessFace->rgba_vertices.push_back(byte(C[3].B));
+            tessFace->rgba_vertices.push_back(toByte(C[3].R));
+            tessFace->rgba_vertices.push_back(toByte(C[3].G));
+            tessFace->rgba_vertices.push_back(toByte(C[3].B));
             if(tessFace->is_rgba)
-              tessFace->rgba_vertices.push_back(byte(C[3].A));
+              tessFace->rgba_vertices.push_back(toByte(C[3].A));
           
-            tessFace->rgba_vertices.push_back(byte(C[1].R));
-            tessFace->rgba_vertices.push_back(byte(C[1].G));
-            tessFace->rgba_vertices.push_back(byte(C[1].B));
+            tessFace->rgba_vertices.push_back(toByte(C[1].R));
+            tessFace->rgba_vertices.push_back(toByte(C[1].G));
+            tessFace->rgba_vertices.push_back(toByte(C[1].B));
             if(tessFace->is_rgba)
-              tessFace->rgba_vertices.push_back(byte(C[1].A));
+              tessFace->rgba_vertices.push_back(toByte(C[1].A));
           
-            tessFace->rgba_vertices.push_back(byte(C[0].R));
-            tessFace->rgba_vertices.push_back(byte(C[0].G));
-            tessFace->rgba_vertices.push_back(byte(C[0].B));
+            tessFace->rgba_vertices.push_back(toByte(C[0].R));
+            tessFace->rgba_vertices.push_back(toByte(C[0].G));
+            tessFace->rgba_vertices.push_back(toByte(C[0].B));
             if(tessFace->is_rgba)
-              tessFace->rgba_vertices.push_back(byte(C[0].A));
+              tessFace->rgba_vertices.push_back(toByte(C[0].A));
           }
         }
       }
@@ -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);
@@ -1624,21 +1624,21 @@ uint32_t oPRCFile::createTriangleMesh(uint32_t nP, const double P[][3], uint32_t
     tessFace->rgba_vertices.reserve((tessFace->is_rgba?4:3)*3*nI);
     for(uint32_t i=0; i<nI; i++)
     {
-       tessFace->rgba_vertices.push_back(byte(C[CI[i][0]].R));
-       tessFace->rgba_vertices.push_back(byte(C[CI[i][0]].G));
-       tessFace->rgba_vertices.push_back(byte(C[CI[i][0]].B));
+       tessFace->rgba_vertices.push_back(toByte(C[CI[i][0]].R));
+       tessFace->rgba_vertices.push_back(toByte(C[CI[i][0]].G));
+       tessFace->rgba_vertices.push_back(toByte(C[CI[i][0]].B));
        if(tessFace->is_rgba)
-       tessFace->rgba_vertices.push_back(byte(C[CI[i][0]].A));
-       tessFace->rgba_vertices.push_back(byte(C[CI[i][1]].R));
-       tessFace->rgba_vertices.push_back(byte(C[CI[i][1]].G));
-       tessFace->rgba_vertices.push_back(byte(C[CI[i][1]].B));
+       tessFace->rgba_vertices.push_back(toByte(C[CI[i][0]].A));
+       tessFace->rgba_vertices.push_back(toByte(C[CI[i][1]].R));
+       tessFace->rgba_vertices.push_back(toByte(C[CI[i][1]].G));
+       tessFace->rgba_vertices.push_back(toByte(C[CI[i][1]].B));
        if(tessFace->is_rgba)
-       tessFace->rgba_vertices.push_back(byte(C[CI[i][1]].A));
-       tessFace->rgba_vertices.push_back(byte(C[CI[i][2]].R));
-       tessFace->rgba_vertices.push_back(byte(C[CI[i][2]].G));
-       tessFace->rgba_vertices.push_back(byte(C[CI[i][2]].B));
+       tessFace->rgba_vertices.push_back(toByte(C[CI[i][1]].A));
+       tessFace->rgba_vertices.push_back(toByte(C[CI[i][2]].R));
+       tessFace->rgba_vertices.push_back(toByte(C[CI[i][2]].G));
+       tessFace->rgba_vertices.push_back(toByte(C[CI[i][2]].B));
        if(tessFace->is_rgba)
-       tessFace->rgba_vertices.push_back(byte(C[CI[i][2]].A));
+       tessFace->rgba_vertices.push_back(toByte(C[CI[i][2]].A));
     }
   }
   tess->addTessFace(tessFace);
@@ -1768,37 +1768,37 @@ uint32_t oPRCFile::createQuadMesh(uint32_t nP, const double P[][3], uint32_t nI,
     for(uint32_t i=0; i<nI; i++)
     {
        // first triangle
-       tessFace->rgba_vertices.push_back(byte(C[CI[i][0]].R));
-       tessFace->rgba_vertices.push_back(byte(C[CI[i][0]].G));
-       tessFace->rgba_vertices.push_back(byte(C[CI[i][0]].B));
+       tessFace->rgba_vertices.push_back(toByte(C[CI[i][0]].R));
+       tessFace->rgba_vertices.push_back(toByte(C[CI[i][0]].G));
+       tessFace->rgba_vertices.push_back(toByte(C[CI[i][0]].B));
        if(tessFace->is_rgba)
-       tessFace->rgba_vertices.push_back(byte(C[CI[i][0]].A));
-       tessFace->rgba_vertices.push_back(byte(C[CI[i][1]].R));
-       tessFace->rgba_vertices.push_back(byte(C[CI[i][1]].G));
-       tessFace->rgba_vertices.push_back(byte(C[CI[i][1]].B));
+       tessFace->rgba_vertices.push_back(toByte(C[CI[i][0]].A));
+       tessFace->rgba_vertices.push_back(toByte(C[CI[i][1]].R));
+       tessFace->rgba_vertices.push_back(toByte(C[CI[i][1]].G));
+       tessFace->rgba_vertices.push_back(toByte(C[CI[i][1]].B));
        if(tessFace->is_rgba)
-       tessFace->rgba_vertices.push_back(byte(C[CI[i][1]].A));
-       tessFace->rgba_vertices.push_back(byte(C[CI[i][3]].R));
-       tessFace->rgba_vertices.push_back(byte(C[CI[i][3]].G));
-       tessFace->rgba_vertices.push_back(byte(C[CI[i][3]].B));
+       tessFace->rgba_vertices.push_back(toByte(C[CI[i][1]].A));
+       tessFace->rgba_vertices.push_back(toByte(C[CI[i][3]].R));
+       tessFace->rgba_vertices.push_back(toByte(C[CI[i][3]].G));
+       tessFace->rgba_vertices.push_back(toByte(C[CI[i][3]].B));
        if(tessFace->is_rgba)
-       tessFace->rgba_vertices.push_back(byte(C[CI[i][3]].A));
+       tessFace->rgba_vertices.push_back(toByte(C[CI[i][3]].A));
        // second triangle
-       tessFace->rgba_vertices.push_back(byte(C[CI[i][1]].R));
-       tessFace->rgba_vertices.push_back(byte(C[CI[i][1]].G));
-       tessFace->rgba_vertices.push_back(byte(C[CI[i][1]].B));
+       tessFace->rgba_vertices.push_back(toByte(C[CI[i][1]].R));
+       tessFace->rgba_vertices.push_back(toByte(C[CI[i][1]].G));
+       tessFace->rgba_vertices.push_back(toByte(C[CI[i][1]].B));
        if(tessFace->is_rgba)
-       tessFace->rgba_vertices.push_back(byte(C[CI[i][1]].A));
-       tessFace->rgba_vertices.push_back(byte(C[CI[i][2]].R));
-       tessFace->rgba_vertices.push_back(byte(C[CI[i][2]].G));
-       tessFace->rgba_vertices.push_back(byte(C[CI[i][2]].B));
+       tessFace->rgba_vertices.push_back(toByte(C[CI[i][1]].A));
+       tessFace->rgba_vertices.push_back(toByte(C[CI[i][2]].R));
+       tessFace->rgba_vertices.push_back(toByte(C[CI[i][2]].G));
+       tessFace->rgba_vertices.push_back(toByte(C[CI[i][2]].B));
        if(tessFace->is_rgba)
-       tessFace->rgba_vertices.push_back(byte(C[CI[i][2]].A));
-       tessFace->rgba_vertices.push_back(byte(C[CI[i][3]].R));
-       tessFace->rgba_vertices.push_back(byte(C[CI[i][3]].G));
-       tessFace->rgba_vertices.push_back(byte(C[CI[i][3]].B));
+       tessFace->rgba_vertices.push_back(toByte(C[CI[i][2]].A));
+       tessFace->rgba_vertices.push_back(toByte(C[CI[i][3]].R));
+       tessFace->rgba_vertices.push_back(toByte(C[CI[i][3]].G));
+       tessFace->rgba_vertices.push_back(toByte(C[CI[i][3]].B));
        if(tessFace->is_rgba)
-       tessFace->rgba_vertices.push_back(byte(C[CI[i][3]].A));
+       tessFace->rgba_vertices.push_back(toByte(C[CI[i][3]].A));
     }
   }
   tess->addTessFace(tessFace);
@@ -1886,11 +1886,11 @@ uint32_t oPRCFile::createLines(uint32_t nP, const double P[][3], uint32_t nI, co
     tess->rgba_vertices.reserve((tess->is_rgba?4:3)*nCI);
     for(uint32_t i=0; i<nCI; i++)
     {
-       tess->rgba_vertices.push_back(byte(C[CI[i]].R));
-       tess->rgba_vertices.push_back(byte(C[CI[i]].G));
-       tess->rgba_vertices.push_back(byte(C[CI[i]].B));
+       tess->rgba_vertices.push_back(toByte(C[CI[i]].R));
+       tess->rgba_vertices.push_back(toByte(C[CI[i]].G));
+       tess->rgba_vertices.push_back(toByte(C[CI[i]].B));
        if(tess->is_rgba)
-       tess->rgba_vertices.push_back(byte(C[CI[i]].A));
+       tess->rgba_vertices.push_back(toByte(C[CI[i]].A));
     }
   }
   const uint32_t tess_index = add3DWireTess(tess);
@@ -1934,22 +1934,22 @@ uint32_t oPRCFile::createSegments(uint32_t nP, const double P[][3], uint32_t nI,
     for(uint32_t i=0; i<nI; i++)
     {
       if (segment_color) {
-        tess->rgba_vertices.push_back(byte(0.5*C[CI[i][0]].R+0.5*C[CI[i][1]].R));
-        tess->rgba_vertices.push_back(byte(0.5*C[CI[i][0]].G+0.5*C[CI[i][1]].G));
-        tess->rgba_vertices.push_back(byte(0.5*C[CI[i][0]].B+0.5*C[CI[i][1]].B));
+        tess->rgba_vertices.push_back(toByte(0.5*C[CI[i][0]].R+0.5*C[CI[i][1]].R));
+        tess->rgba_vertices.push_back(toByte(0.5*C[CI[i][0]].G+0.5*C[CI[i][1]].G));
+        tess->rgba_vertices.push_back(toByte(0.5*C[CI[i][0]].B+0.5*C[CI[i][1]].B));
         if(tess->is_rgba)
-          tess->rgba_vertices.push_back(byte(0.5*C[CI[i][0]].A+0.5*C[CI[i][1]].A));
+          tess->rgba_vertices.push_back(toByte(0.5*C[CI[i][0]].A+0.5*C[CI[i][1]].A));
       } else {
-        tess->rgba_vertices.push_back(byte(C[CI[i][0]].R));
-        tess->rgba_vertices.push_back(byte(C[CI[i][0]].G));
-        tess->rgba_vertices.push_back(byte(C[CI[i][0]].B));
+        tess->rgba_vertices.push_back(toByte(C[CI[i][0]].R));
+        tess->rgba_vertices.push_back(toByte(C[CI[i][0]].G));
+        tess->rgba_vertices.push_back(toByte(C[CI[i][0]].B));
         if(tess->is_rgba)
-          tess->rgba_vertices.push_back(byte(C[CI[i][0]].A));
-        tess->rgba_vertices.push_back(byte(C[CI[i][1]].R));
-        tess->rgba_vertices.push_back(byte(C[CI[i][1]].G));
-        tess->rgba_vertices.push_back(byte(C[CI[i][1]].B));
+          tess->rgba_vertices.push_back(toByte(C[CI[i][0]].A));
+        tess->rgba_vertices.push_back(toByte(C[CI[i][1]].R));
+        tess->rgba_vertices.push_back(toByte(C[CI[i][1]].G));
+        tess->rgba_vertices.push_back(toByte(C[CI[i][1]].B));
         if(tess->is_rgba)
-          tess->rgba_vertices.push_back(byte(C[CI[i][1]].A));
+          tess->rgba_vertices.push_back(toByte(C[CI[i][1]].A));
       }
     }
   }
index 59457b14e5a26597d3338fea844afa9e3d7b9f29..f09b55e570e146ea40b66d033ff1b856b2fc7d40 100644 (file)
@@ -1091,8 +1091,8 @@ public:
 class PRCBoundingBox
 {
 public:
-  PRCBoundingBox() : min(0.0,0.0,0.0), max(0.0,0.0,0.0) {}
-  PRCBoundingBox(const PRCVector3d &m, const PRCVector3d& M) : min(m),max(M) {}
+  PRCBoundingBox()     {min=PRCVector3d(0.0,0.0,0.0); max=PRCVector3d(0.0,0.0,0.0);}
+  PRCBoundingBox(const PRCVector3d &m, const PRCVector3d& M) {min=PRCVector3d(m); max=PRCVector3d(M);}
   void serializeBoundingBox(PRCbitStream &pbs);
   PRCVector3d min;
   PRCVector3d max;
@@ -1109,8 +1109,8 @@ public:
 class PRCInterval
 {
 public:
-  PRCInterval() : min(0), max(0) {}
-  PRCInterval(double m, double M) : min(m), max(M) {}
+  PRCInterval() { min=max=0;}
+  PRCInterval(double m, double M) {min=m;max=M;}
   void serializeInterval(PRCbitStream &pbs);
   double min;
   double max;
index efec6be15c7905517022ac1ef04308b6d61b045e..a812afeecb675606e6bda1c6aa721bbbebf2375b 100644 (file)
@@ -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
@@ -57,22 +59,19 @@ void MGL_EXPORT mgl_line(HMGL gr, double x1, double y1, double z1, double x2, do
 {\r
        static int cgid=1;      gr->StartGroup("Line",cgid++);\r
        if(mgl_isnan(z1) || mgl_isnan(z2))      z1=z2=2*gr->Max.z-gr->Min.z;\r
-       mglPoint p1(x1,y1,z1), p2(x2,y2,z2), p=p1,nn(NAN);\r
+       const mglPoint p1(x1,y1,z1), p2(x2,y2,z2), nn(NAN);\r
        gr->SetPenPal(pen);\r
        n = (n<2) ? 2 : n;\r
 \r
-       gr->Reserve(n);\r
-       long k1 = gr->AddPnt(p,gr->CDef,nn,-1,3);       gr->AddActive(k1);\r
-       for(long i=1;i<n;i++)\r
-       {\r
-               mreal s = i/mreal(n-1); p = p1*(1-s)+p2*s;\r
-               long k2 = k1;\r
-               k1 = gr->AddPnt(p,gr->CDef,nn,-1,3);\r
-               gr->line_plot(k2,k1);\r
-               if(i==1)        gr->arrow_plot(k2,k1,gr->Arrow1);\r
-               if(i==n-1)      gr->arrow_plot(k1,k2,gr->Arrow2);\r
-       }\r
-       gr->AddActive(k1,1);    gr->EndGroup();\r
+       const long kq = gr->AllocPnts(n);\r
+#pragma omp parallel for\r
+       for(long i=0;i<n;i++)\r
+       {       mreal s=i/mreal(n-1);   gr->AddPntQ(kq+i,p1*(1-s)+p2*s,gr->CDef,nn,-1,3);       }\r
+       gr->curve_plot(n,kq);\r
+       gr->arrow_plot(kq,kq+1,gr->Arrow1);\r
+       gr->arrow_plot(kq+n-1,kq+n-2,gr->Arrow2);\r
+       gr->AddActive(kq);      gr->AddActive(kq+n-1,1);\r
+       gr->EndGroup();\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_line_(uintptr_t *gr, mreal *x1, mreal *y1, mreal *z1, mreal *x2, mreal *y2, mreal *z2, const char *pen,int *n,int l)\r
@@ -85,25 +84,21 @@ void MGL_EXPORT mgl_curve(HMGL gr, double x1, double y1, double z1, double dx1,
        if(mgl_isnan(z1) || mgl_isnan(z2))      z1=z2=2*gr->Max.z-gr->Min.z;\r
        const mglPoint p1(x1,y1,z1), p2(x2,y2,z2),nn(NAN);\r
        const mglPoint d1(3*dx1,3*dy1,3*dz1), d2(3*dx2,3*dy2,3*dz2);    // NOTE use d->3*d to be exact as Bezier curve\r
-       mglPoint a,b,p=p1;\r
-       a = 3*(p2-p1)-d2-2*d1;  b = d1+d2-2*(p2-p1);\r
+       const mglPoint a(3*(p2-p1)-d2-2*d1),b(d1+d2-2*(p2-p1));\r
        n = (n<2) ? 2 : n;\r
        gr->SetPenPal(pen);\r
 \r
-       gr->Reserve(n);\r
-       long k1=gr->AddPnt(p,gr->CDef,nn,-1,3); gr->AddActive(k1);\r
-       for(long i=1;i<n;i++)\r
-       {\r
-               mreal s = i/(n-1.);     p = p1+s*(d1+s*(a+s*b));\r
-               long k2 = k1;\r
-               k1 = gr->AddPnt(p,gr->CDef,nn,-1,3);\r
-               gr->line_plot(k2,k1);\r
-               if(i==1)        gr->arrow_plot(k2,k1,gr->Arrow1);\r
-               if(i==n-1)      gr->arrow_plot(k1,k2,gr->Arrow2);\r
-       }\r
+       const long kq = gr->AllocPnts(n);\r
+#pragma omp parallel for\r
+       for(long i=0;i<n;i++)\r
+       {       mreal s=i/mreal(n-1);   gr->AddPntQ(kq+i,p1+s*d1+(s*s)*a+(s*s*s)*b,gr->CDef,nn,-1,3);   }\r
+       gr->curve_plot(n,kq);\r
+       gr->arrow_plot(kq,kq+1,gr->Arrow1);\r
+       gr->arrow_plot(kq+n-1,kq+n-2,gr->Arrow2);\r
+       gr->AddActive(kq);      gr->AddActive(kq+n-1,1);\r
        gr->AddActive(gr->AddPnt(p1+d1/3,gr->CDef,nn,-1,3),1);\r
        gr->AddActive(gr->AddPnt(p2-d2/3,gr->CDef,nn,-1,3),3);\r
-       gr->AddActive(k1,2);    gr->EndGroup();\r
+       gr->EndGroup();\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_curve_(uintptr_t* gr, mreal *x1, mreal *y1, mreal *z1, mreal *dx1, mreal *dy1, mreal *dz1, mreal *x2, mreal *y2, mreal *z2, mreal *dx2, mreal *dy2, mreal *dz2, const char *pen,int *n, int l)\r
@@ -148,8 +143,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
@@ -187,8 +184,7 @@ void MGL_EXPORT mgl_facez(HMGL gr, double x0, double y0, double z0, double wx, d
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_facex_(uintptr_t* gr, mreal *x0, mreal *y0, mreal *z0, mreal *wy, mreal *wz, const char *stl, mreal *dx, mreal *dy, int l)\r
 {      char *s=new char[l+1];  memcpy(s,stl,l);        s[l]=0;\r
-       mgl_facex(_GR_, *x0,*y0,*z0,*wy,*wz,s,*dx,*dy); delete []s;\r
-}\r
+       mgl_facex(_GR_, *x0,*y0,*z0,*wy,*wz,s,*dx,*dy); delete []s;     }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_facey_(uintptr_t* gr, mreal *x0, mreal *y0, mreal *z0, mreal *wx, mreal *wz, const char *stl, mreal *dx, mreal *dy, int l)\r
 {      char *s=new char[l+1];  memcpy(s,stl,l);        s[l]=0;\r
@@ -212,14 +208,14 @@ void MGL_EXPORT mgl_cone(HMGL gr, double x1, double y1, double z1, double x2, do
        if(r1==0 && r2==0)      return;\r
 \r
        static int cgid=1;      gr->StartGroup("Cone",cgid++);\r
-       mglPoint p1(x1,y1,z1), p2(x2,y2,z2), p,q(NAN,NAN),t(NAN,NAN), d=p2-p1,a,b;\r
+       mglPoint p1(x1,y1,z1), p2(x2,y2,z2), p,qn(NAN,NAN),t(NAN,NAN), d=p2-p1,a,b;\r
        a=!d;   a.Normalize();          b=d^a;  b.Normalize();\r
        mreal c1,c2,dr=r2-r1;\r
        const char *s;\r
        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
@@ -238,33 +234,45 @@ void MGL_EXPORT mgl_cone(HMGL gr, double x1, double y1, double z1, double x2, do
        else if(mglchr(stl,'8'))        n=4;\r
        bool refr = n>6;\r
        if(refr)        t=d;\r
-\r
+       const long nq = (edge && !wire)?4:2;\r
+       const long kq = gr->AllocPnts(nq*(2*n+1));\r
+       int sq = wire?3:11;\r
+#pragma omp parallel for\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
-               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
-               if(edge && !wire)       kk[i+82] = gr->AddPnt(p,c1,t,-1,3);\r
-               p = p2+(r2*co)*a+(r2*si)*b;\r
-               kk[i+2*n+1] = gr->AddPnt(p,c2,q,-1,3);\r
-               if(edge && !wire)       kk[i+123] = gr->AddPnt(p,c2,t,-1,3);\r
+               int f = n!=4?(2*i+1)*90/n:45*i;\r
+               double co = mgl_cos[f%360], si = mgl_cos[(f+270)%360];\r
+               mglPoint p = p1+(r1*co)*a+(r1*si)*b;\r
+               mglPoint q = (si*a-co*b)^(d + (dr*co)*a + (dr*si)*b);\r
+               long iq = kq+nq*i;\r
+               gr->AddPntQ(iq,p,c1,refr?q:qn,-1,sq);\r
+               mglPoint s = p2+(r2*co)*a+(r2*si)*b;\r
+               gr->AddPntQ(iq+1,s,c2,refr?q:qn,-1,sq);\r
+               if(edge && !wire)\r
+               {\r
+                       gr->AddPntQ(iq+2,p,c1,t,-1,3);\r
+                       gr->AddPntQ(iq+3,s,c2,t,-1,3);\r
+               }\r
        }\r
-       if(wire)        for(long i=0;i<2*n;i++)\r
+       if(wire)\r
        {\r
-               gr->line_plot(kk[i],kk[i+1]);\r
-               gr->line_plot(kk[i],kk[i+2*n+1]);\r
-               gr->line_plot(kk[i+2*n+2],kk[i+1]);\r
-               gr->line_plot(kk[i+2*n+2],kk[i+2*n+1]);\r
+               gr->line_plot(kq,kq+1);\r
+               for(long i=1;i<2*n+1;i++)\r
+               {\r
+                       long iq = kq+nq*i;\r
+                       gr->line_plot(iq,iq-nq);\r
+                       gr->line_plot(iq+1,iq-nq+1);\r
+                       gr->line_plot(iq,iq+1);\r
+               }\r
        }\r
        else    for(long i=0;i<2*n;i++)\r
        {\r
-               gr->quad_plot(kk[i],kk[i+1],kk[i+2*n+1],kk[i+2*n+2]);\r
+               long iq = kq+nq*i;\r
+               gr->quad_plot(iq,iq+nq,iq+1,iq+nq+1);\r
                if(edge)\r
                {\r
-                       gr->trig_plot(k1,kk[i+82],kk[i+83]);\r
-                       gr->trig_plot(k2,kk[i+123],kk[i+124]);\r
+                       gr->trig_plot(k1,iq+2,iq+2+nq);\r
+                       gr->trig_plot(k2,iq+3,iq+3+nq);\r
                }\r
        }\r
        gr->EndGroup(); delete []kk;\r
@@ -275,7 +283,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,66 +375,70 @@ 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
 {\r
        if(n<3) return;\r
-       long pal=0, n0,n1,n2,np,k1=-1,kp=-1;\r
+       long pal=0, n0;\r
        static int cgid=1;      gr->StartGroup("Polygon",cgid++);\r
        gr->SetPenPal(stl,&pal);\r
        mreal c=gr->NextColor(pal);\r
        mreal k=(gr->GetNumPal(pal)>1)?gr->NextColor(pal):gr->AddTexture('k');\r
        bool fill = !mglchr(stl,'#'), box = mglchr(stl,'@') || !fill;\r
        if(!fill)       k=c;\r
-       gr->Reserve(box?2*n+1:n+1);\r
+       gr->Reserve(box?2*n+3:n+2);\r
        if(mgl_isnan(z1) || mgl_isnan(z2))      z1=z2=2*gr->Max.z-gr->Min.z;\r
        mglPoint p1(x1,y1,z1), p2(x2,y2,z2), d=p2-p1, u=!d, p,qq;\r
-       n0 = gr->AddPnt(p1,c,qq,-1,11);\r
-       u = (d.norm()/u.norm())*u;\r
-       n1 = np = gr->AddPnt(p2,c,qq,-1,11);\r
-       gr->AddActive(n0,0);    gr->AddActive(n1,1);\r
-       if(box) k1 = kp = gr->CopyNtoC(n1,k);\r
-       for(long i=1;i<n;i++)\r
+       n0 = gr->AddPnt(p1,c,qq,-1,11);         u = (d.norm()/u.norm())*u;\r
+       long kq=-5;\r
+       if(fill)\r
        {\r
-               p = p1+d*cos(2*M_PI*i/n)+u*sin(2*M_PI*i/n);\r
-               n2 = gr->AddPnt(p,c,qq,-1,11);\r
-               if(fill)        gr->trig_plot(n0,n1,n2);\r
-               if(box)\r
+               kq=gr->AllocPnts(n+1);\r
+#pragma omp parallel for\r
+               for(long i=0;i<=n;i++)\r
                {\r
-                       long kk = gr->CopyNtoC(n2,k);\r
-                       gr->line_plot(k1, kk);  k1 = kk;\r
+                       mglPoint p = p1+d*cos(2*M_PI*i/n)+u*sin(2*M_PI*i/n);\r
+                       gr->AddPntQ(kq+i,p,c,qq,-1,11);\r
                }\r
-               n1 = n2;\r
+               for(long i=0;i<n;i++)   gr->trig_plot(n0,kq+i,kq+i+1);\r
        }\r
-       if(fill)        gr->trig_plot(n0,n2,np);\r
-       if(box)         gr->line_plot(k1, kp);\r
-       gr->EndGroup();\r
+       if(box)\r
+       {\r
+               kq=gr->AllocPnts(n+1);\r
+#pragma omp parallel for\r
+               for(long i=0;i<=n;i++)\r
+               {\r
+                       mglPoint p = p1+d*cos(2*M_PI*i/n)+u*sin(2*M_PI*i/n);\r
+                       gr->AddPntQ(kq+i,p,k,qq,-1,11);\r
+               }\r
+               for(long i=0;i<n;i++)   gr->line_plot(kq+i,kq+i+1);\r
+       }\r
+       gr->AddActive(n0,0);    gr->AddActive(kq,1);    gr->EndGroup();\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_arc_ext(HMGL gr, double x0, double y0, double z0, double xr, double yr, double zr, double x1, double y1, double z1, double a, const char* stl)\r
 {\r
-       long pal=0, n = long(fabs(a)/9+1.5);    a *= M_PI/180;\r
+       long pal=0, n = long(fabs(a)/3+1.5);    a *= M_PI/180;\r
        static int cgid=1;      gr->StartGroup("Arc",cgid++);\r
        gr->SetPenPal(stl,&pal);\r
        mreal c=gr->NextColor(pal);\r
        gr->Reserve(n+2);\r
        if(mgl_isnan(z0) || mgl_isnan(z1))      z0=z1=2*gr->Max.z-gr->Min.z;\r
-       mglPoint p0(x0,y0,z0), p1(x1,y1,z1), d=p1-p0, u(mglPoint(xr,yr,zr)^d), p,qq;\r
+       mglPoint p0(x0,y0,z0), p1(x1,y1,z1), d=p1-p0, u(mglPoint(xr,yr,zr)^d), qq(NAN);\r
        if(u.norm()==0) return; // wrong vector orientation\r
        u = (d.norm()/u.norm())*u;\r
        gr->AddActive(gr->AddPnt(p0,gr->CDef,qq,-1,3),0);\r
-       long n1 = gr->AddPnt(p1,c,qq,-1,11);    gr->AddActive(n1,1);\r
-       for(long i=1;i<n;i++)\r
-       {\r
-               p = p0+d*cos(a*i/(n-1))+u*sin(a*i/(n-1));\r
-               long n2 = gr->AddPnt(p,c,qq,-1,11);\r
-               if(i==1)        gr->arrow_plot(n1,n2,gr->Arrow1);\r
-               if(i==n-1)      {       gr->arrow_plot(n2,n1,gr->Arrow2);       gr->AddActive(n2,2);    }\r
-               gr->line_plot(n1,n2);   n1 = n2;\r
-       }\r
-       gr->EndGroup();\r
+\r
+       const long kq = gr->AllocPnts(n);\r
+#pragma omp parallel for\r
+       for(long i=0;i<n;i++)\r
+       {       mreal s=a*i/mreal(n-1); gr->AddPntQ(kq+i,p0+d*cos(s)+u*sin(s),c,qq,-1,11);      }\r
+       gr->curve_plot(n,kq);\r
+       gr->arrow_plot(kq,kq+1,gr->Arrow1);\r
+       gr->arrow_plot(kq+n-1,kq+n-2,gr->Arrow2);\r
+       gr->AddActive(kq);      gr->AddActive(kq+n-1,1);        gr->EndGroup();\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_arc(HMGL gr, double x0, double y0, double x1, double y1, double a, const char* stl)\r
@@ -451,7 +463,7 @@ void MGL_EXPORT mgl_arc_(uintptr_t* gr, mreal *x0, mreal *y0, mreal *x1, mreal *
 void MGL_EXPORT mgl_ellipse(HMGL gr, double x1, double y1, double z1, double x2, double y2, double z2, double r, const char *stl)\r
 {\r
        const int n = 41;\r
-       long pal=0,n0,n1=-1,m1=-1;\r
+       long pal=0,n0;\r
        static int cgid=1;      gr->StartGroup("Ellipse",cgid++);\r
        gr->SetPenPal(stl,&pal);\r
        mreal c=gr->NextColor(pal), d;\r
@@ -469,25 +481,37 @@ void MGL_EXPORT mgl_ellipse(HMGL gr, double x1, double y1, double z1, double x2,
        // central point first\r
        n0 = gr->AddPnt(p1,c,q,-1,11);  gr->AddActive(n0);\r
        gr->AddActive(gr->AddPnt(p2,c,q,-1,11),1);\r
-       for(long i=0;i<n;i++)\r
+       long iq=-5;\r
+       if(fill)\r
        {\r
-               register 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
-               long m2 = m1;   m1 = gr->CopyNtoC(n1,k);\r
-               if(i>0)\r
+               const long kq = gr->AllocPnts(n);       iq = kq+n/4;\r
+#pragma omp parallel for\r
+               for(long i=0;i<n;i++)\r
                {\r
-                       if(fill)        gr->trig_plot(n0,n1,n2);\r
-                       if(box) gr->line_plot(m1,m2);\r
+                       long t=i*360/(n-1);\r
+                       mglPoint p = s+v*mgl_cos[t%360]+u*mgl_cos[(270+t)%360];\r
+                       gr->AddPntQ(kq+i,p,c,q,-1,11);\r
                }\r
+               for(long i=1;i<n;i++)   gr->trig_plot(n0,kq+i-1,kq+i);\r
        }\r
-       gr->EndGroup();\r
+       if(box)\r
+       {\r
+               const long kq = gr->AllocPnts(n);       iq = kq+n/4;\r
+#pragma omp parallel for\r
+               for(long i=0;i<n;i++)\r
+               {\r
+                       long t=i*360/(n-1);\r
+                       mglPoint p = s+v*mgl_cos[t%360]+u*mgl_cos[(270+t)%360];\r
+                       gr->AddPntQ(kq+i,p,k,q,-1,11);\r
+               }\r
+               for(long i=1;i<n;i++)   gr->line_plot(kq+i-1,kq+i);\r
+       }\r
+       gr->AddActive(iq,2);    gr->EndGroup();\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_rhomb(HMGL gr, double x1, double y1, double z1, double x2, double y2, double z2, double r, const char *stl)\r
 {\r
-       long pal=0, n1,n2,n3,n4;\r
+       long pal=0;\r
        static int cgid=1;      gr->StartGroup("Rhomb",cgid++);\r
        gr->SetPenPal(stl,&pal);\r
        mreal c=gr->NextColor(pal);\r
@@ -499,17 +523,27 @@ void MGL_EXPORT mgl_rhomb(HMGL gr, double x1, double y1, double z1, double x2, d
        if(mgl_isnan(z1) || mgl_isnan(z2))      z1=z2=2*gr->Max.z-gr->Min.z;\r
        mglPoint p1(x1,y1,z1), p2(x2,y2,z2), u=!(p1-p2), p, s,qq;\r
        u = (r/u.norm())*u;     s = (p1+p2)/2.;\r
-       p = p1;         n1 = gr->AddPnt(p,c,qq,-1,11);\r
-       p = s+u;        n2 = gr->AddPnt(p,b==c?c:k,qq,-1,11);\r
-       p = p2;         n3 = gr->AddPnt(p,b,qq,-1,11);\r
-       p = s-u;        n4 = gr->AddPnt(p,b==c?c:k,qq,-1,11);\r
-       gr->AddActive(n1,0);    gr->AddActive(n2,2);    gr->AddActive(n3,1);\r
-       if(fill)        gr->quad_plot(n1,n2,n4,n3);\r
-       n1 = gr->CopyNtoC(n1,k);        n2 = gr->CopyNtoC(n2,k);\r
-       n3 = gr->CopyNtoC(n3,k);        n4 = gr->CopyNtoC(n4,k);\r
+       long kq=-5;\r
+       if(fill)\r
+       {\r
+               kq = gr->AllocPnts(4);\r
+               gr->AddPntQ(kq,p1,c,qq,-1,11);\r
+               gr->AddPntQ(kq+1,s+u,b==c?c:k,qq,-1,11);\r
+               gr->AddPntQ(kq+2,p2,b,qq,-1,11);\r
+               gr->AddPntQ(kq+3,s-u,b==c?c:k,qq,-1,11);\r
+               gr->quad_plot(kq,kq+1,kq+3,kq+2);\r
+       }\r
        if(box)\r
-       {       gr->line_plot(n1,n2);   gr->line_plot(n2,n3);\r
-               gr->line_plot(n3,n4);   gr->line_plot(n4,n1);   }\r
+       {\r
+               kq = gr->AllocPnts(4);\r
+               gr->AddPntQ(kq,p1,k,qq,-1,11);\r
+               gr->AddPntQ(kq+1,s+u,k,qq,-1,11);\r
+               gr->AddPntQ(kq+2,p2,k,qq,-1,11);\r
+               gr->AddPntQ(kq+3,s-u,k,qq,-1,11);\r
+               gr->line_plot(kq,kq+1); gr->line_plot(kq+1,kq+2);\r
+               gr->line_plot(kq+3,kq); gr->line_plot(kq+3,kq+2);\r
+       }\r
+       gr->AddActive(kq,0);    gr->AddActive(kq+1,2);  gr->AddActive(kq+2,1);\r
        gr->EndGroup();\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -534,39 +568,35 @@ void MGL_EXPORT mgl_sphere_(uintptr_t* gr, mreal *x, mreal *y, mreal *z, mreal *
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_drop(HMGL gr, mglPoint p, mglPoint q, double r, double c, double sh, double a)\r
 {\r
-       mglPoint p1,p2,pp,qq;\r
+       mglPoint p1,p2;\r
        if(q.norm()==0) {       q.Set(1,0,0);   sh=0;   }\r
        q.Normalize();  p1 = !q;        p2 = q^p1;      r /= 2;\r
 \r
        static int cgid=1;      gr->StartGroup("Drop",cgid++);\r
        const int m=12, n=2*m+1;\r
-       gr->Reserve(n*m);\r
-       long *nn=new long[2*n],n1,n2;\r
-       mreal x,y,z,rr,dr;\r
-\r
-       z = r*(1+sh)*(1+sh);    n1 = gr->AddPnt(p + q*z,c,q,-1,3);\r
-       z = r*(1+sh)*(sh-1);    n2 = gr->AddPnt(p + q*z,c,q,-1,3);\r
+//     long n1 = gr->AddPnt(p + q*r*(1+sh)*(1+sh),c,q,-1,3);\r
+//     long n2 = gr->AddPnt(p + q*r*(1+sh)*(sh-1),c,q,-1,3);\r
 \r
-       for(long i=0;i<=m;i++)  for(long j=0;j<n;j++)   // NOTE use prev.points => not for omp\r
+       const long kq = gr->AllocPnts((m+1)*n);\r
+#pragma omp parallel for\r
+       for(long i=0;i<=m;i++)  for(long j=0;j<n;j++)\r
        {\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
-                       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
-                       z = r*(1+sh)*(co+sh);\r
-                       pp = p + p1*x + p2*y + q*z;\r
-                       qq = (p1*sv-p2*cv)^(p1*(dr*cv) + p2*(dr*sv) - q*(r*(1+sh)*si));\r
-                       nn[j+n]=nn[j];  nn[j]=gr->AddPnt(pp,c,qq,-1,3);\r
-               }\r
-               else if(i==0)   nn[j] = n1;\r
-               else if(i==m)   {       nn[j+n]=nn[j];  nn[j]=n2;       }\r
-               if(i*j>0)       gr->quad_plot(nn[j-1], nn[j], nn[j+n-1], nn[j+n]);\r
+               int u=i*180/m, v=180*j/m+202;\r
+               double co=mgl_cos[u%360], si=mgl_cos[(u+270)%360];\r
+               double cv=mgl_cos[v%360], sv=mgl_cos[(v+270)%360];\r
+               double rr = r*a*si*(1.+sh*co)/(1+sh);\r
+               double dr = r*a/(1+sh)*(co*(1.+sh*co) - sh*si*si);\r
+               double x = rr*cv, y = rr*sv, z = r*(1+sh)*(co+sh);\r
+               mglPoint pp = p + p1*x + p2*y + q*z;\r
+               mglPoint qq = (p1*sv-p2*cv)^(p1*(dr*cv) + p2*(dr*sv) - q*(r*(1+sh)*si));\r
+               gr->AddPntQ(kq+j+n*i,pp,c,qq,-1,11);\r
+       }\r
+       for(long i=0;i<m;i++)   for(long j=1;j<n;j++)   // NOTE use prev.points => not for omp\r
+       {\r
+               long iq = kq+j+n*i;\r
+               gr->quad_plot(iq-1,iq, iq+n-1,iq+n);\r
        }\r
-       delete []nn;    gr->EndGroup();\r
+       gr->EndGroup();\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_drop(HMGL gr, double x1, double y1, double z1, double x2, double y2, double z2, double r, const char *stl, double sh, double a)\r
@@ -596,11 +626,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 +642,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 +675,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 +732,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 +747,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 +780,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 +805,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 +814,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 +887,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 +916,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
@@ -914,38 +986,37 @@ void MGL_EXPORT mgl_logo(HMGL gr, long w, long h, const unsigned char *rgba, int
        mreal z = gr->SaveState(opt);\r
        if(mgl_isnan(z))        z = gr->Min.z;\r
        mreal x1 = gr->Min.x, y1 = gr->Min.y, dx, dy;\r
-       if(!smooth || w<2 || h<2)\r
+       if(!smooth || w==1 || h==1)\r
        {\r
-               dx = (gr->Max.x-x1)/w;  dy = (gr->Max.y-y1)/h;\r
+               dx = (gr->Max.x-x1)/(w==1?1:(w-1));     dy = (gr->Max.y-y1)/(h==1?1:(h-1));\r
                gr->Reserve(4*(w+1)*(h+1));\r
+               const long kq = gr->AllocPnts(4*w*h);\r
+#pragma omp parallel for\r
                for(long j=0;j<h;j++)   for(long i=0;i<w;i++)\r
                {\r
-                       long i0 = 4*(i+w*(h-1-j)), k1,k2,k3,k4;\r
+                       long i0 = 4*(i+w*(h-1-j)), iq = kq+4*(i+w*j);\r
                        mglColor c(rgba[i0]/255.,rgba[i0+1]/255.,rgba[i0+2]/255.);\r
-                       k1 = gr->AddPnt(mglPoint(x1+dx*i,y1+dy*j,z),0); gr->SetRGBA(k1,c);\r
-                       k2 = gr->AddPnt(mglPoint(x1+dx*(i+1),y1+dy*j,z),0);     gr->SetRGBA(k2,c);\r
-                       k3 = gr->AddPnt(mglPoint(x1+dx*i,y1+dy*(j+1),z),0);     gr->SetRGBA(k3,c);\r
-                       k4 = gr->AddPnt(mglPoint(x1+dx*(i+1),y1+dy*(j+1),z),0); gr->SetRGBA(k4,c);\r
-                       gr->quad_plot(k1,k2,k3,k4);\r
+                       gr->AddPntQ(iq,mglPoint(x1+dx*i,y1+dy*j,z),0);                  gr->SetRGBA(iq,c);\r
+                       gr->AddPntQ(iq+1,mglPoint(x1+dx*(i+1),y1+dy*j,z),0);    gr->SetRGBA(iq+1,c);\r
+                       gr->AddPntQ(iq+2,mglPoint(x1+dx*i,y1+dy*(j+1),z),0);    gr->SetRGBA(iq+2,c);\r
+                       gr->AddPntQ(iq+3,mglPoint(x1+dx*(i+1),y1+dy*(j+1),z),0);gr->SetRGBA(iq+3,c);\r
                }\r
+               for(long j=0;j<h*w;j++)\r
+               {       long iq=kq+4*j; gr->quad_plot(iq,iq+1,iq+2,iq+3);       }\r
        }\r
        else\r
        {\r
                dx = (gr->Max.x-x1)/(w-1);      dy = (gr->Max.y-y1)/(h-1);\r
-               gr->Reserve(w*h);\r
-               long *pos = new long[w*h];\r
+               const long kq = gr->AllocPnts(w*h);\r
+#pragma omp parallel for\r
                for(long j=0;j<h;j++)   for(long i=0;i<w;i++)\r
                {\r
-                       long i0 = 4*(i+w*(h-1-j)), i1 = i+w*j;\r
-                       pos[i1] = gr->AddPnt(mglPoint(x1+dx*i,y1+dy*j,z),0);\r
-                       gr->SetRGBA(pos[i1],mglColor(rgba[i0]/255.,rgba[i0+1]/255.,rgba[i0+2]/255.));\r
+                       long i0 = 4*(i+w*(h-1-j)), iq = kq+i+w*j;\r
+                       gr->AddPntQ(iq,mglPoint(x1+dx*i,y1+dy*j,z),0);\r
+                       gr->SetRGBA(iq,mglColor(rgba[i0]/255.,rgba[i0+1]/255.,rgba[i0+2]/255.));\r
                }\r
                for(long j=0;j<h-1;j++) for(long i=0;i<w-1;i++)\r
-               {\r
-                       long i1 = i+w*j;\r
-                       gr->quad_plot(pos[i1],pos[i1+1],pos[i1+w],pos[i1+1+w]);\r
-               }\r
-               delete []pos;\r
+               {       long iq=kq+i+w*j;       gr->quad_plot(iq,iq+1,iq+w,iq+w+1);     }\r
        }\r
        gr->EndGroup();\r
 }\r
@@ -996,7 +1067,7 @@ void MGL_EXPORT mgl_lamerey(HMGL gr, double x0, double (*f)(double,void *), void
 }\r
 //-----------------------------------------------------------------------------\r
 struct mglDatSpl       {       HCDT d; double x0,dx;   double y0,dy;   };\r
-double MGL_NO_EXPORT func_dat(double x, void *p)\r
+double static func_dat(double x, void *p)\r
 {      mglDatSpl *s = (mglDatSpl *)p;  return s->d->value((x-s->x0)*s->dx);    }\r
 void MGL_EXPORT mgl_lamerey_dat(HMGL gr, double x0, HCDT f, const char *stl, const char *opt)\r
 {\r
@@ -1006,7 +1077,7 @@ void MGL_EXPORT mgl_lamerey_dat(HMGL gr, double x0, HCDT f, const char *stl, con
        mgl_lamerey(gr,x0,func_dat,&s,stl,buf);\r
 }\r
 //-----------------------------------------------------------------------------\r
-double MGL_NO_EXPORT func_str(double x, void *p)\r
+double static func_str(double x, void *p)\r
 {      HMEX s = (HMEX)p;       return mgl_expr_eval(s,x,0,0);  }\r
 void MGL_EXPORT mgl_lamerey_str(HMGL gr, double x0, const char *f, const char *stl, const char *opt)\r
 {\r
@@ -1047,7 +1118,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 +1129,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
@@ -1072,7 +1143,7 @@ void MGL_EXPORT mgl_bifurcation(HMGL gr, double dx, double (*f)(double,double,vo
        gr->EndGroup(); delete []v1;    delete []v2;\r
 }\r
 //-----------------------------------------------------------------------------\r
-double MGL_NO_EXPORT bif_dat(double x, double y, void *p)\r
+double static bif_dat(double x, double y, void *p)\r
 {      mglDatSpl *s = (mglDatSpl *)p;  return s->d->value((x-s->x0)*s->dx, (y-s->y0)*s->dy);   }\r
 void MGL_EXPORT mgl_bifurcation_dat(HMGL gr, double dx, HCDT f, const char *stl, const char *opt)\r
 {\r
@@ -1086,7 +1157,7 @@ void MGL_EXPORT mgl_bifurcation_dat(HMGL gr, double dx, HCDT f, const char *stl,
        mgl_bifurcation(gr,dx,bif_dat,&s,stl,buf);\r
 }\r
 //-----------------------------------------------------------------------------\r
-double MGL_NO_EXPORT bif_str(double x, double y, void *p)\r
+double static bif_str(double x, double y, void *p)\r
 {      HMEX s = (HMEX)p;       return mgl_expr_eval(s,x,y,0);  }\r
 void MGL_EXPORT mgl_bifurcation_str(HMGL gr, double dx, const char *f, const char *stl, const char *opt)\r
 {\r
@@ -1106,3 +1177,115 @@ 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(); // 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 = new HMDT[m];        //      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
+       for(long i=0;i<m;i++)   delete dat[i];\r
+       delete []strs;  delete []dat;\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 70bc15dbab54e2c030d5d3b056635dd4a47fc467..8f1567e1c070491013cace8afd78d3b7f12567bd 100644 (file)
 #include "mgl2/eval.h"\r
 #include "mgl2/base.h"\r
 //-----------------------------------------------------------------------------\r
-void MGL_NO_EXPORT mgl_mesh_plot(mglBase *gr, long *pos, long n, long m, int how)\r
+void static mgl_mesh_plot(mglBase *gr, long kq, long n, long m, int how)\r
 {\r
        int d = gr->MeshNum>0 ? gr->MeshNum+1 : n*m, dx = n>d?n/d:1, dy = m>d?m/d:1;\r
        // 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++)\r
+               {       long iq=kq+i+n*j;       if(gr->ValidPnt(iq) && gr->ValidPnt(iq+1))      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
-                       gr->line_plot(pos[n*j+i],pos[n*j+i+s]);\r
-\r
+               gr->curve_plot(1+(n-1)/s,kq+n*j,s);\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++)\r
+               {       long iq=kq+i+n*j;       if(gr->ValidPnt(iq) && gr->ValidPnt(iq+n))      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
-                       gr->line_plot(pos[n*j+i],pos[n*j+i+s*n]);\r
+               gr->curve_plot(1+(m-1)/s,kq+i,n*s);\r
        }\r
 }\r
 //-----------------------------------------------------------------------------\r
-void MGL_NO_EXPORT mgl_surf_plot(mglBase *gr, long *pos, long n, long m)\r
+void static mgl_surf_plot(mglBase *gr, long kq, long n, long m)\r
 {\r
        long s=0;\r
        for(long j=0;j<m-1;j++) for(long i=0;i<n-1;i++)\r
-               if(pos[n*j+i]>=0 && pos[n*j+i+1]>=0 && pos[n*j+i+n]>=0 && pos[n*j+i+n+1]>=0)\r
-                       s++;\r
+       {       long iq = kq+i+n*j;\r
+               if(gr->ValidPnt(iq) && gr->ValidPnt(iq+1) && gr->ValidPnt(iq+n) && gr->ValidPnt(iq+n+1))\r
+                       s++;    }\r
        long dx=1,dy=1;\r
        if(gr->FaceNum && s>gr->FaceNum*gr->FaceNum)\r
        {\r
@@ -59,7 +59,7 @@ void MGL_NO_EXPORT mgl_surf_plot(mglBase *gr, long *pos, long n, long m)
                dx = ns>d?ns/d:1;               dy = ms>d?ms/d:1;\r
        }\r
        for(long j=0;j<m-dy;j+=dy)      for(long i=0;i<n-dx;i+=dx)\r
-               gr->quad_plot(pos[n*j+i],pos[n*j+i+dx],pos[n*j+i+n*dy],pos[n*j+i+n*dy+dx]);\r
+       {       long iq = kq+i+n*j;     gr->quad_plot(iq,iq+dx,iq+n*dy,iq+n*dy+dx);     }\r
 }\r
 //-----------------------------------------------------------------------------\r
 //\r
@@ -74,9 +74,9 @@ void MGL_EXPORT mgl_fsurf(HMGL gr, const char *eqZ, const char *sch, const char
        mreal r = gr->SaveState(opt);\r
        long n = (mgl_isnan(r) || r<=0) ? 100:long(r+0.5);\r
        mglData z(n,n);\r
-       mglDataV x(n,n,1, gr->Min.x,gr->Max.x,'x');     x.s=L"x";\r
-       mglDataV y(n,n,1, gr->Min.y,gr->Max.y,'y');     y.s=L"y";\r
-       mglDataV t(n,n);        t.s=L"#$mgl";\r
+       mglDataV x(n,n,1, gr->Min.x,gr->Max.x,'x');     x.Name(L"x");\r
+       mglDataV y(n,n,1, gr->Min.y,gr->Max.y,'y');     y.Name(L"y");\r
+       mglDataV t(n,n);        t.Name(L"#$mgl");\r
        std::vector<mglDataA*> list;\r
        list.push_back(&x);     list.push_back(&y);     list.push_back(&t);\r
        z.Move(mglFormulaCalc(eqZ,list));\r
@@ -89,9 +89,9 @@ void MGL_EXPORT mgl_fsurf_xyz(HMGL gr, const char *eqX, const char *eqY, const c
        mreal r = gr->SaveState(opt);\r
        long n = (mgl_isnan(r) || r<=0) ? 100:long(r+0.5);\r
        mglData z(n,n), x(n,n), y(n,n);\r
-       mglDataV u(n,n,1, 0,1,'x');     u.s=L"u";\r
-       mglDataV v(n,n,1, 0,1,'y');     v.s=L"v";\r
-       mglDataV t(n,n);        t.s=L"#$mgl";\r
+       mglDataV u(n,n,1, 0,1,'x');     u.Name(L"u");\r
+       mglDataV v(n,n,1, 0,1,'y');     v.Name(L"v");\r
+       mglDataV t(n,n);        t.Name(L"#$mgl");\r
        std::vector<mglDataA*> list;\r
        list.push_back(&u);     list.push_back(&v);     list.push_back(&t);\r
        x.Move(mglFormulaCalc(eqX,list));\r
@@ -130,20 +130,21 @@ void MGL_EXPORT mgl_mesh_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co
        static int cgid=1;      gr->StartGroup("Mesh",cgid++);\r
        gr->SetPenPal(sch,0,false);\r
        long ss = gr->AddTexture(sch);\r
-       long *pos = new long[n*m];      memset(pos,-1L,n*m*sizeof(long));\r
        gr->Reserve(n*m*z->GetNz());\r
 \r
        for(long k=0;k<z->GetNz();k++)\r
        {\r
                if(gr->NeedStop())      break;\r
+               const long kq = gr->AllocPnts(n*m);\r
+#pragma omp parallel for collapse(2)\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
-                       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
+                       double zz = z->v(i,j,k);\r
+                       gr->AddPntQ(kq+i+n*j, 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
+               mgl_mesh_plot(gr,kq,n,m,3);\r
        }\r
-       delete []pos;   gr->EndGroup();\r
+       gr->EndGroup();\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_mesh(HMGL gr, HCDT z, const char *sch, const char *opt)\r
@@ -178,20 +179,21 @@ void MGL_EXPORT mgl_fall_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co
        static int cgid=1;      gr->StartGroup("Fall",cgid++);\r
        gr->SetPenPal(sch,0,false);\r
        long ss = gr->AddTexture(sch);\r
-       long *pos = new long[n*m];\r
        gr->Reserve(n*m*z->GetNz());\r
 \r
        for(long k=0;k<z->GetNz();k++)\r
        {\r
                if(gr->NeedStop())      break;\r
+               const long kq = gr->AllocPnts(n*m);\r
+#pragma omp parallel for collapse(2)\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
-                       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
+                       double zz = z->v(i,j,k);\r
+                       gr->AddPntQ(kq+i+n*j, 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
+               mgl_mesh_plot(gr,kq,n,m, (mglchr(sch,'x')) ? 2:1);\r
        }\r
-       delete []pos;   gr->EndGroup();\r
+       gr->EndGroup();\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_fall(HMGL gr, HCDT z, const char *sch, const char *opt)\r
@@ -224,20 +226,21 @@ void MGL_EXPORT mgl_grid_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co
 \r
        gr->SaveState(opt);\r
        static int cgid=1;      gr->StartGroup("Grid",cgid++);\r
-       mreal   zVal = gr->Min.z;\r
+       double zVal = gr->Min.z;\r
        gr->SetPenPal(sch?sch:"k-");\r
-       long *pos = new long[n*m];\r
        gr->Reserve(n*m*z->GetNz());\r
 \r
        for(long k=0;k<z->GetNz();k++)\r
        {\r
                if(gr->NeedStop())      break;\r
                if(z->GetNz()>1)        zVal = gr->Min.z+(gr->Max.z-gr->Min.z)*mreal(k)/(z->GetNz()-1);\r
+               const long kq = gr->AllocPnts(n*m);\r
+#pragma omp parallel for collapse(2)\r
                for(long j=0;j<m;j++)   for(long i=0;i<n;i++)\r
-                       pos[i+n*j] = gr->AddPnt(mglPoint(GetX(x,i,j,k).x, GetY(y,i,j,k).x, zVal),gr->CDef);\r
-               mgl_mesh_plot(gr,pos,n,m,3);\r
+                       gr->AddPntQ(kq+i+n*j,mglPoint(GetX(x,i,j,k).x, GetY(y,i,j,k).x, zVal),gr->CDef);\r
+               mgl_mesh_plot(gr,kq,n,m,3);\r
        }\r
-       delete []pos;   gr->EndGroup();\r
+       gr->EndGroup();\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_grid(HMGL gr, HCDT z,const char *sch, const char *opt)\r
@@ -267,39 +270,49 @@ void MGL_NO_EXPORT mgl_surf_gen(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, HCDT a,
 {\r
        long n=z->GetNx(),m=z->GetNy();\r
        long ss = gr->AddTexture(sch);\r
-       long *pos = new long[n*m];\r
        bool wire = (mglchr(sch,'#'));\r
        gr->Reserve((n+1)*(m+1)*z->GetNz()*(wire?2:1));\r
 \r
-       mglPoint q,s,xx,yy;\r
        for(long k=0;k<z->GetNz();k++)\r
        {\r
                if(gr->NeedStop())      break;\r
-               if(a)   for(long j=0;j<m;j++)   for(long i=0;i<n;i++)\r
+               const long kq = gr->AllocPnts(n*m);\r
+               if(a)\r
                {\r
-                       xx = GetX(x,i,j,k);             yy = GetY(y,i,j,k);\r
-                       q.Set(xx.y, yy.y, z->dvx(i,j,k));\r
-                       s.Set(xx.z, yy.z, z->dvy(i,j,k));\r
-                       pos[i+n*j] = gr->AddPnt(mglPoint(xx.x, yy.x, z->v(i,j,k)), gr->GetC(ss,c->v(i,j,k)), q^s, gr->GetA(a->v(i,j,k)));\r
+#pragma omp parallel for collapse(2)\r
+                       for(long j=0;j<m;j++)   for(long i=0;i<n;i++)\r
+                       {\r
+                               mglPoint xx=GetX(x,i,j,k), yy=GetY(y,i,j,k);\r
+                               mglPoint q(xx.y, yy.y, z->dvx(i,j,k));\r
+                               mglPoint s(xx.z, yy.z, z->dvy(i,j,k));\r
+                               gr->AddPntQ(kq+i+n*j,mglPoint(xx.x, yy.x, z->v(i,j,k)),\r
+                                       gr->GetC(ss,c->v(i,j,k)), q^s, gr->GetA(a->v(i,j,k)));\r
+                       }\r
                }\r
-               else    for(long j=0;j<m;j++)   for(long i=0;i<n;i++)\r
+               else\r
                {\r
-                       xx = GetX(x,i,j,k);             yy = GetY(y,i,j,k);\r
-                       q.Set(xx.y, yy.y, z->dvx(i,j,k));\r
-                       s.Set(xx.z, yy.z, z->dvy(i,j,k));\r
-                       pos[i+n*j] = gr->AddPnt(mglPoint(xx.x, yy.x, z->v(i,j,k)), gr->GetC(ss,c->v(i,j,k)), q^s);\r
+#pragma omp parallel for collapse(2)\r
+                       for(long j=0;j<m;j++)   for(long i=0;i<n;i++)\r
+                       {\r
+                               mglPoint xx=GetX(x,i,j,k), yy=GetY(y,i,j,k);\r
+                               mglPoint q(xx.y, yy.y, z->dvx(i,j,k));\r
+                               mglPoint s(xx.z, yy.z, z->dvy(i,j,k));\r
+                               gr->AddPntQ(kq+i+n*j,mglPoint(xx.x, yy.x, z->v(i,j,k)), gr->GetC(ss,c->v(i,j,k)), q^s);\r
+                       }\r
                }\r
                if(sch && mglchr(sch,'.'))\r
-                       for(long i=0;i<n*m;i++) gr->mark_plot(pos[i],'.');\r
-               else    mgl_surf_plot(gr,pos,n,m);\r
+                       for(long i=0;i<n*m;i++) gr->mark_plot(kq+i,'.');\r
+               else    mgl_surf_plot(gr,kq,n,m);\r
                if(wire)\r
                {\r
                        gr->SetPenPal("k-");\r
-                       for(long i=0;i<n*m;i++) pos[i] = gr->CopyNtoC(pos[i],gr->CDef);\r
-                       mgl_mesh_plot(gr,pos,n,m,3);\r
+                       const long nq = gr->AllocPnts(n*m);\r
+#pragma omp parallel for\r
+                       for(long i=0;i<n*m;i++) gr->CopyNtoC(nq+i,kq+i,gr->CDef);\r
+                       mgl_mesh_plot(gr,nq,n,m,3);\r
                }\r
        }\r
-       delete []pos;   gr->EndGroup();\r
+       gr->EndGroup();\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_surf_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt)\r
@@ -428,63 +441,70 @@ 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
        int d = gr->MeshNum>0 ? gr->MeshNum+1 : n*m, dx = n>d?n/d:1, dy = m>d?m/d:1;\r
        long ss = gr->AddTexture(sch);\r
-       long *pos = new long[2*(n>m?n:m)];\r
        gr->Reserve(2*n*m*z->GetNz());\r
        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
                if(how) for(long i=0;i<n-dx;i+=dx)\r
                {\r
+                       const long kq = gr->AllocPnts(2*m);\r
+#pragma omp parallel for\r
                        for(long j=0;j<m;j++)\r
                        {\r
-                               xx = GetX(x,i,j,k);             yy = GetY(y,i,j,k);\r
-                               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
-                               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
+                               mglPoint xx=GetX(x,i,j,k), yy=GetY(y,i,j,k);\r
+                               mglPoint p1(xx.x, yy.x, z->v(i,j,k));\r
+                               mglPoint s(xx.z, yy.z, z->dvy(i,j,k));\r
+                               mglPoint q(xx.y, yy.y, 0);      s = q^s;\r
+                               double cc = gr->GetC(ss,c->v(i,j,dk*k));\r
+                               mglPoint p2(GetX(x,i+dx,j,k).x,GetY(y,i+dx,j,k).x,p1.z);\r
+                               gr->AddPntQ(kq+2*j,p1,cc,s);\r
+                               gr->AddPntQ(kq+2*j+1,p2,cc,s);\r
                        }\r
-                       mgl_surf_plot(gr,pos,2,m);\r
+                       mgl_surf_plot(gr,kq,2,m);\r
                }\r
                else    for(long j=0;j<m-dy;j+=dy)\r
                {\r
+                       const long kq = gr->AllocPnts(2*n);\r
+#pragma omp parallel for\r
                        for(long i=0;i<n;i++)   // ñîçäàåì ìàññèâ òî÷åê\r
                        {\r
-                               xx = GetX(x,i,j,k);             yy = GetY(y,i,j,k);\r
-                               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
-                               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
+                               mglPoint xx=GetX(x,i,j,k), yy=GetY(y,i,j,k);\r
+                               mglPoint p1(xx.x, yy.x, z->v(i,j,k));\r
+                               mglPoint q(xx.y, yy.y, z->dvx(i,j,k));\r
+                               mglPoint s(xx.z, yy.z, 0);      s = q^s;\r
+                               double cc = gr->GetC(ss,c->v(i,j,dk*k));\r
+                               mglPoint p2(GetX(x,i,j+dy,k).x,GetY(y,i,j+dy,k).x,p1.z);\r
+                               gr->AddPntQ(kq+2*i,p1,cc,s);\r
+                               gr->AddPntQ(kq+2*i+1,p2,cc,s);\r
                        }\r
-                       mgl_surf_plot(gr,pos,2,n);\r
+                       mgl_surf_plot(gr,kq,2,n);\r
                }\r
        }\r
-       delete []pos; gr->EndGroup();\r
+       gr->EndGroup();\r
 }\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 +517,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 +589,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
@@ -572,69 +602,83 @@ void MGL_EXPORT mgl_boxs_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co
        bool full = mglchr(sch,'@');\r
        gr->Reserve(8*n*m*z->GetNz());\r
 \r
-       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
+       mglPoint t(wire||full?NAN:0,0,1);\r
+       double z0=gr->GetOrgZ('x');\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
+               const long ni=1+(n-1)/dx, mi=1+(m-1)/dy;\r
+               const long kq = gr->AllocPnts(8*ni*mi);\r
+#pragma omp parallel for collapse(2)\r
+               for(long dj=0;dj<mi;dj++)       for(long di=0;di<ni;di++)\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
-                       x1 = i<lx-dx ? GetX(x,i+dx,j,k).x:NAN;\r
-                       y1 = i<lx-dx ? GetY(y,i+dx,j,k).x:NAN;\r
-                       x2 = j<ly-dy ? GetX(x,i,j+dy,k).x:NAN;\r
-                       y2 = j<ly-dy ? GetY(y,i,j+dy,k).x:NAN;\r
-                       x3 = i<lx-dx && j<ly-dy ? GetX(x,i+dx,j+dy,k).x:NAN;\r
-                       y3 = i<lx-dx && j<ly-dy ? GetY(y,i+dx,j+dy,k).x:NAN;\r
-                       z1 = i<n-dx?z->v(i+dx,j,k):NAN;\r
-                       z2 = j<m-dy?z->v(i,j+dy,k):NAN;\r
-                       q.Set(xx.y,yy.y,0);\r
-                       s.Set(xx.z,yy.z,0);\r
-                       p1.Set(xx.x,yy.x,zz);   k1 = gr->AddPnt(p1,c,t);\r
-                       p2.Set(x1,y1,zz);               k2 = gr->AddPnt(p2,c,t);\r
-                       p3.Set(x2,y2,zz);               k3 = gr->AddPnt(p3,c,t);\r
-                       p4.Set(x3,y3,zz);               k4 = gr->AddPnt(p4,c,t);\r
-                       if(wire)\r
+                       long i = di*dx, j = dj*dy;\r
+                       double zz = z->v(i,j,k), c  = gr->GetC(ss,zz);\r
+                       mglPoint xx=GetX(x,i,j,k), yy = GetY(y,i,j,k);\r
+                       double x1 = i<lx-dx ? GetX(x,i+dx,j,k).x:NAN;\r
+                       double y1 = i<lx-dx ? GetY(y,i+dx,j,k).x:NAN;\r
+                       double x2 = j<ly-dy ? GetX(x,i,j+dy,k).x:NAN;\r
+                       double y2 = j<ly-dy ? GetY(y,i,j+dy,k).x:NAN;\r
+                       double x3 = i<lx-dx && j<ly-dy ? GetX(x,i+dx,j+dy,k).x:NAN;\r
+                       double y3 = i<lx-dx && j<ly-dy ? GetY(y,i+dx,j+dy,k).x:NAN;\r
+                       double z1 = i<n-dx?z->v(i+dx,j,k):NAN;\r
+                       double z2 = j<m-dy?z->v(i,j+dy,k):NAN;\r
+                       mglPoint q(xx.y,yy.y,0);\r
+                       mglPoint s(xx.z,yy.z,0);\r
+                       long iq = kq+8*(di+ni*dj);\r
+                       gr->AddPntQ(iq,mglPoint(xx.x,yy.x,zz),c,t);\r
+                       gr->AddPntQ(iq+1,mglPoint(x1,y1,zz),c,t);\r
+                       gr->AddPntQ(iq+2,mglPoint(x2,y2,zz),c,t);\r
+                       gr->AddPntQ(iq+3,mglPoint(x3,y3,zz),c,t);\r
+\r
+                       if(full)\r
                        {\r
-                               gr->line_plot(k1,k2);   gr->line_plot(k1,k3);\r
-                               gr->line_plot(k4,k2);   gr->line_plot(k4,k3);\r
+                               gr->AddPntQ(iq+4,mglPoint(xx.x,yy.x,z0),c,t);\r
+                               gr->AddPntQ(iq+5,mglPoint(x1,y1,z0),c,t);\r
+                               gr->AddPntQ(iq+6,mglPoint(x2,y2,z0),c,t);\r
+                               gr->AddPntQ(iq+7,mglPoint(x3,y3,z0),c,t);\r
                        }\r
-                       else    gr->quad_plot(k1,k2,k3,k4);\r
+                       else\r
+                       {\r
+                               gr->AddPntQ(iq+4,mglPoint(x1,y1,z1),c,wire?t:q);\r
+                               gr->AddPntQ(iq+5,mglPoint(x3,y3,z1),c,wire?t:q);\r
+                               gr->AddPntQ(iq+6,mglPoint(x2,y2,z2),c,wire?t:s);\r
+                               gr->AddPntQ(iq+7,mglPoint(x3,y3,z2),c,wire?t:s);\r
+                       }\r
+               }\r
+               if(wire)        for(long dj=0;dj<mi;dj++)       for(long di=0;di<ni;di++)\r
+               {\r
+                       long iq = kq+8*(di+ni*dj);\r
+                       gr->line_plot(iq,iq+1);         gr->line_plot(iq,iq+2);\r
+                       gr->line_plot(iq+3,iq+1);       gr->line_plot(iq+3,iq+2);\r
 \r
                        if(full)\r
                        {\r
-                               p1.Set(xx.x,yy.x,z0);   k5 = gr->AddPnt(p1,c,t);\r
-                               p2.Set(x1,y1,z0);               k6 = gr->AddPnt(p2,c,t);\r
-                               p3.Set(x2,y2,z0);               k7 = gr->AddPnt(p3,c,t);\r
-                               p4.Set(x3,y3,z0);               k8 = gr->AddPnt(p4,c,t);\r
-                               if(wire)\r
-                               {\r
-                                       gr->line_plot(k5,k6);   gr->line_plot(k5,k7);\r
-                                       gr->line_plot(k8,k6);   gr->line_plot(k8,k7);\r
-                                       gr->line_plot(k1,k5);   gr->line_plot(k3,k7);\r
-                                       gr->line_plot(k2,k6);   gr->line_plot(k4,k8);\r
-                               }\r
-                               else\r
-                               {\r
-                                       gr->quad_plot(k1,k2,k5,k6);     gr->quad_plot(k1,k3,k5,k7);\r
-                                       gr->quad_plot(k4,k2,k8,k6);     gr->quad_plot(k4,k3,k8,k7);\r
-                                       gr->quad_plot(k5,k6,k7,k8);\r
-                               }\r
+                               gr->line_plot(iq+4,iq+5);       gr->line_plot(iq+4,iq+6);\r
+                               gr->line_plot(iq+7,iq+5);       gr->line_plot(iq+7,iq+6);\r
+                               gr->line_plot(iq,iq+4);         gr->line_plot(iq+2,iq+6);\r
+                               gr->line_plot(iq+1,iq+5);       gr->line_plot(iq+3,iq+7);\r
+                       }\r
+                       else\r
+                       {\r
+                               gr->line_plot(iq+1,iq+4);       gr->line_plot(iq+5,iq+4);\r
+                               gr->line_plot(iq+5,iq+3);       gr->line_plot(iq+2,iq+6);\r
+                               gr->line_plot(iq+3,iq+7);       gr->line_plot(iq+6,iq+7);\r
+                       }\r
+               }\r
+               else    for(long dj=0;dj<mi;dj++)       for(long di=0;di<ni;di++)\r
+               {\r
+                       long iq = kq+8*(di+ni*dj);\r
+                       gr->quad_plot(iq,iq+1,iq+2,iq+3);\r
+                       if(full)\r
+                       {\r
+                               gr->quad_plot(iq,iq+1,iq+4,iq+5);       gr->quad_plot(iq,iq+2,iq+4,iq+6);\r
+                               gr->quad_plot(iq+3,iq+1,iq+7,iq+5);     gr->quad_plot(iq+3,iq+2,iq+7,iq+6);\r
+                               gr->quad_plot(iq+4,iq+5,iq+6,iq+7);\r
                        }\r
                        else\r
                        {\r
-                               p3.Set(x1,y1,z1);               k5 = gr->AddPnt(p3,c,wire?t:q);\r
-                               p4.Set(x3,y3,z1);               k6 = gr->AddPnt(p4,c,wire?t:q);\r
-                               if(wire)\r
-                               {       gr->line_plot(k2,k5);   gr->line_plot(k6,k5);   gr->line_plot(k6,k4);   }\r
-                               else    gr->quad_plot(k2,k4,k5,k6);\r
-                               p3.Set(x2,y2,z2);               k7 = gr->AddPnt(p3,c,wire?t:s);\r
-                               p4.Set(x3,y3,z2);               k8 = gr->AddPnt(p4,c,wire?t:s);\r
-                               if(wire)\r
-                               {       gr->line_plot(k3,k7);   gr->line_plot(k4,k8);   gr->line_plot(k7,k8);   }\r
-                               else    gr->quad_plot(k3,k4,k7,k8);\r
+                               gr->quad_plot(iq+1,iq+3,iq+4,iq+5);     gr->quad_plot(iq+2,iq+3,iq+6,iq+7);\r
                        }\r
                }\r
        }\r
@@ -664,10 +708,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 +720,98 @@ 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
+       const long ni=1+(n-1)/dx, mi=1+(m-1)/dy;\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
-               {\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
-                       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
-                       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
-                       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
-                       gr->quad_plot(k1,k2,k3,k4);\r
-               }\r
+               const long kq = gr->AllocPnts(4*ni*mi);\r
+               if(alongX)\r
+#pragma omp parallel for collapse(2)\r
+                       for(long dj=0;dj<mi;dj++)       for(long di=0;di<ni;di++)\r
+                       {\r
+                               long i = di*dx, j = dj*dy, iq = kq+4*(di+ni*dj);\r
+                               double zz = z->v(i,j,k), cc = gr->GetC(ss,c->v(i,j,k));\r
+                               double xx = GetX(x,i,j,k).x, yy = GetY(y,i,j,k).x;\r
+                               gr->AddPntQ(iq,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
+                               gr->AddPntQ(iq+1,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
+                               gr->AddPntQ(iq+2,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
+                               gr->AddPntQ(iq+3,mglPoint(xx,yy,zz),cc,s);\r
+                       }\r
+               else if(alongY)\r
+#pragma omp parallel for collapse(2)\r
+                       for(long dj=0;dj<mi;dj++)       for(long di=0;di<ni;di++)\r
+                       {\r
+                               long i = di*dx, j = dj*dy, iq = kq+4*(di+ni*dj);\r
+                               double zz = z->v(i,j,k), cc = gr->GetC(ss,c->v(i,j,k));\r
+                               double xx = GetX(x,i,j,k).x, yy = GetY(y,i,j,k).x;\r
+                               gr->AddPntQ(iq,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
+                               gr->AddPntQ(iq+1,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
+                               gr->AddPntQ(iq+2,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
+                               gr->AddPntQ(iq+3,mglPoint(xx,yy,zz),cc,s);\r
+                       }\r
+               else\r
+#pragma omp parallel for collapse(2)\r
+                       for(long dj=0;dj<mi;dj++)       for(long di=0;di<ni;di++)\r
+                       {\r
+                               long i = di*dx, j = dj*dy, iq = kq+4*(di+ni*dj);\r
+                               double zz = z->v(i,j,k), cc = gr->GetC(ss,c->v(i,j,k));\r
+                               double xx = GetX(x,i,j,k).x, yy = GetY(y,i,j,k).x;\r
+                               gr->AddPntQ(iq,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
+                               gr->AddPntQ(iq+1,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
+                               gr->AddPntQ(iq+2,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
+                               gr->AddPntQ(iq+3,mglPoint(xx,yy,zz),cc,s);\r
+                       }\r
+               for(long i=0;i<ni*mi;i++)\r
+               {       long iq=kq+4*i; gr->quad_plot(iq,iq+1,iq+2,iq+3);       }\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 +820,112 @@ 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
+       const long ni=1+(n-1)/dx, mi=1+(m-1)/dy;\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
-               {\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
-\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 && 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
+               const long kq = gr->AllocPnts(4*ni*mi);\r
+               if(alongX)\r
+#pragma omp parallel for collapse(2)\r
+                       for(long dj=0;dj<mi;dj++)       for(long di=0;di<ni;di++)\r
+                       {\r
+                               long i = di*dx, j = dj*dy, iq = kq+4*(di+ni*dj);\r
+                               double xx = GetX(x,i,j,k).x, cc = gr->GetC(sc,c->v(i,j,k));\r
+                               double ss = (1-gr->GetA(s->v(i,j,k)))/2, sm = 1-ss;\r
+                               double x1 = z->v(i,j,k), y1 = GetY(y,i,j,k).x;\r
+                               double x2=NAN,x3=NAN,x4=NAN,y2=NAN,y3=NAN,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
-                       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
-                       gr->quad_plot(k1,k2,k3,k4);\r
-               }\r
+                               gr->AddPntQ(iq,mglPoint(xx, y1+y2*ss+y4*ss+y3*ss*ss, x1+x2*ss+x4*ss+x3*ss*ss),cc,t);\r
+                               gr->AddPntQ(iq+1,mglPoint(xx, y1+y2*sm+y4*ss+y3*ss*sm, x1+x2*sm+x4*ss+x3*ss*sm),cc,t);\r
+                               gr->AddPntQ(iq+2,mglPoint(xx, y1+y2*ss+y4*sm+y3*ss*sm, x1+x2*ss+x4*sm+x3*ss*sm),cc,t);\r
+                               gr->AddPntQ(iq+3,mglPoint(xx, y1+y2*sm+y4*sm+y3*sm*sm, x1+x2*sm+x4*sm+x3*sm*sm),cc,t);\r
+                       }\r
+               else if(alongY)\r
+#pragma omp parallel for collapse(2)\r
+                       for(long dj=0;dj<mi;dj++)       for(long di=0;di<ni;di++)\r
+                       {\r
+                               long i = di*dx, j = dj*dy, iq = kq+4*(di+ni*dj);\r
+                               double yy = GetY(y,i,j,k).x, cc = gr->GetC(sc,c->v(i,j,k));\r
+                               double ss = (1-gr->GetA(s->v(i,j,k)))/2, sm = 1-ss;\r
+                               double x1 = GetX(x,i,j,k).x, y1 = z->v(i,j,k);\r
+                               double x2=NAN,x3=NAN,x4=NAN,y2=NAN,y3=NAN,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
+                               gr->AddPntQ(iq,mglPoint(x1+x2*ss+x4*ss+x3*ss*ss, yy, y1+y2*ss+y4*ss+y3*ss*ss),cc,t);\r
+                               gr->AddPntQ(iq+1,mglPoint(x1+x2*sm+x4*ss+x3*ss*sm, yy, y1+y2*sm+y4*ss+y3*ss*sm),cc,t);\r
+                               gr->AddPntQ(iq+2,mglPoint(x1+x2*ss+x4*sm+x3*ss*sm, yy, y1+y2*ss+y4*sm+y3*ss*sm),cc,t);\r
+                               gr->AddPntQ(iq+3,mglPoint(x1+x2*sm+x4*sm+x3*sm*sm, yy, y1+y2*sm+y4*sm+y3*sm*sm),cc,t);\r
+                       }\r
+               else\r
+#pragma omp parallel for collapse(2)\r
+                       for(long dj=0;dj<mi;dj++)       for(long di=0;di<ni;di++)\r
+                       {\r
+                               long i = di*dx, j = dj*dy, iq = kq+4*(di+ni*dj);\r
+                               double zz = z->v(i,j,k), cc = gr->GetC(sc,c->v(i,j,k));\r
+                               double ss = (1-gr->GetA(s->v(i,j,k)))/2, sm = 1-ss;\r
+                               double x1 = GetX(x,i,j,k).x, y1 = GetY(y,i,j,k).x;\r
+                               double x2=NAN,x3=NAN,x4=NAN,y2=NAN,y3=NAN,y4=NAN;\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;    y3 = GetY(y,i+dx,j+dy,k).x-y2-y4-y1;    }\r
+                               gr->AddPntQ(iq,mglPoint(x1+x2*ss+x4*ss+x3*ss*ss, y1+y2*ss+y4*ss+y3*ss*ss, zz),cc,t);\r
+                               gr->AddPntQ(iq+1,mglPoint(x1+x2*sm+x4*ss+x3*ss*sm, y1+y2*sm+y4*ss+y3*ss*sm, zz),cc,t);\r
+                               gr->AddPntQ(iq+2,mglPoint(x1+x2*ss+x4*sm+x3*ss*sm, y1+y2*ss+y4*sm+y3*ss*sm, zz),cc,t);\r
+                               gr->AddPntQ(iq+3,mglPoint(x1+x2*sm+x4*sm+x3*sm*sm, y1+y2*sm+y4*sm+y3*sm*sm, zz),cc,t);\r
+                       }\r
+               for(long i=0;i<ni*mi;i++)\r
+               {       long iq=kq+4*i; gr->quad_plot(iq,iq+1,iq+2,iq+3);       }\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
@@ -801,22 +945,21 @@ void MGL_EXPORT mgl_map_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char
 \r
        long ss = gr->AddTexture(mgl_have_color(sch)?sch:"rgb",2);\r
        long s = nboth ?1:n;\r
-\r
        mglPoint t(NAN);\r
-       long *pos = new long[n*m];\r
        gr->Reserve(n*m);\r
 \r
+       const long kq = gr->AllocPnts(n*m);\r
 #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,14 +971,16 @@ 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
-               pos[i+n*j] = gr->AddPnt(mglPoint(ax->v(i,j), ay->v(i,j), xdx),gr->GetC(ss,xx,false),t,yy);\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
+               gr->AddPntQ(kq+i+n*j,mglPoint(ax->v(i,j), ay->v(i,j), xdx),gr->GetC(ss,xx,false),t,yy);\r
        }\r
        if(sch && mglchr(sch,'.'))\r
-               for(long i=0;i<n*m;i++) gr->mark_plot(pos[i],'.');\r
-       else    mgl_surf_plot(gr,pos,n,m);\r
-       delete []pos;   gr->EndGroup();\r
+               for(long i=0;i<n*m;i++) gr->mark_plot(kq+i,'.');\r
+       else    mgl_surf_plot(gr,kq,n,m);\r
+       gr->EndGroup();\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_map(HMGL gr, HCDT ax, HCDT ay, const char *sch, const char *opt)\r
index ae98f7c6e6346d5266d784c47fc40fe950b30669..0fc793afe53cfb049aa3d511c8d455a93c443a18 100644 (file)
@@ -17,6 +17,9 @@
  *   Free Software Foundation, Inc.,                                       *\r
  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *\r
  ***************************************************************************/\r
+#include "mgl2/prim.h"\r
+\r
+\r
 #include "mgl2/vect.h"\r
 #include "mgl2/eval.h"\r
 #include "mgl2/data.h"\r
@@ -32,38 +35,35 @@ void MGL_EXPORT mgl_traj_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay,
        if(mgl_check_dim1(gr,x,z,y,ax,"Traj"))  return;\r
        if(mgl_check_dim1(gr,ax,az,ay,0,"Traj"))        return;\r
 \r
-       mreal len=gr->SaveState(opt);   if(mgl_isnan(len))      len = 0;\r
+       double len=gr->SaveState(opt);  if(mgl_isnan(len))      len = 0;\r
        static int cgid=1;      gr->StartGroup("Traj",cgid++);\r
+       double fact = gr->size_opt<0 ? -gr->size_opt:1;\r
 \r
        // find maximum\r
        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
+       double asize = gr->GetArrowSize();\r
        gr->SetPenPal(sch,&pal);        gr->Reserve(4*n*m);\r
 \r
-       mglPoint p1,p2;\r
-/*     for(j=0;j<m;j++)        for(i=0;i<n;i++)        // find maximal amplitude of vector field\r
-       {\r
-               mx = j<ax->GetNy() ? j:0;       my = j<ay->GetNy() ? j:0;       mz = j<az->GetNy() ? j:0;\r
-               da = sqrt(ax->v(i,mx)*ax->v(i,mx)+ay->v(i,my)*ay->v(i,my)+az->v(i,mz)*az->v(i,mz));\r
-               xm = xm>da ? xm : da;\r
-       }\r
-       xm = 1./(xm ? sqrt(xm):1);*/\r
        for(long j=0;j<m;j++) // start prepare arrows\r
        {\r
                if(gr->NeedStop())      break;\r
                gr->NextColor(pal);\r
                long nx = j<x->GetNy() ? j:0, ny = j<y->GetNy() ? j:0, nz = j<z->GetNy() ? j:0;\r
                long mx = j<ax->GetNy() ? j:0,my = j<ay->GetNy() ? j:0,mz = j<az->GetNy() ? j:0;\r
+               const long kq = gr->AllocPnts(2*n);\r
+#pragma omp parallel for\r
                for(long i=0;i<n;i++)\r
                {\r
-                       p1.Set(x->v(i,nx), y->v(i,ny), z->v(i,nz));\r
-                       p2.Set(ax->v(i,mx),ay->v(i,my),az->v(i,mz));\r
-                       mreal dd = p2.norm();\r
+                       mglPoint p1(x->v(i,nx), y->v(i,ny), z->v(i,nz));\r
+                       mglPoint p2(ax->v(i,mx),ay->v(i,my),az->v(i,mz));\r
+                       double dd = p2.norm();\r
                        if(len==0)\r
                        {\r
-                               register mreal dx,dy,dz;\r
+                               double 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
@@ -71,8 +71,10 @@ void MGL_EXPORT mgl_traj_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay,
                                dd = dd ? sqrt(dx*dx+dy*dy+dz*dz)/dd : 0;\r
                        }\r
                        else dd = len;\r
-                       gr->vect_plot(gr->AddPnt(p1), gr->AddPnt(p1+dd*p2,-1,mglPoint(NAN),-1,2),gr->GetArrowSize());\r
+                       gr->AddPntQ(kq+2*i,p1);\r
+                       gr->AddPntQ(kq+2*i+1,p1+(fact*dd)*p2,-1,mglPoint(NAN),-1,2);\r
                }\r
+               for(long i=0;i<n;i++)   gr->vect_plot(kq+2*i, kq+2*i+1, asize);\r
        }\r
        gr->EndGroup();\r
 }\r
@@ -106,33 +108,31 @@ void MGL_EXPORT mgl_vect_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const cha
 \r
        gr->SaveState(opt);\r
        static int cgid=1;      gr->StartGroup("Vect",cgid++);\r
-       bool dot = sch && mglchr(sch,'.');\r
-       bool fix = mglchr(sch,'f');\r
-       bool end = mglchr(sch,'>');\r
-       bool beg = mglchr(sch,'<');\r
-       bool grd = mglchr(sch,'=');\r
+       bool dot = mglchr(sch,'.');\r
+       bool fix = mglchr(sch,'f'), end = mglchr(sch,'>');\r
+       bool beg = mglchr(sch,'<'), grd = mglchr(sch,'=');\r
+       double fact = gr->size_opt<0 ? -gr->size_opt:1;\r
 \r
+       gr->SetPenPal("-");\r
        long ss = gr->AddTexture(sch);\r
-       gr->Reserve(4*n*m);\r
-       mreal   zVal = gr->Min.z;\r
+       double zVal = gr->Min.z, asize = gr->GetArrowSize();\r
 \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
+       double xm=0,cm=0,ca=0;\r
+       double dm=(fabs(gr->Max.c)+fabs(gr->Min.c))*1e-5;\r
        // use whole array for determining maximal vectors length\r
-       mglPoint p1,p2,v,d;\r
-\r
-#pragma omp parallel private(p1,p2,v,d)\r
+#pragma omp parallel\r
        {\r
-               mreal xm1=0,cm1=0,xx,c1,c2;\r
+               double xm1=0,cm1=0,xx,c1,c2;\r
 #pragma omp for nowait collapse(3) reduction(+:ca)\r
                for(long k=0;k<l;k++)   for(long j=0;j<m;j+=ty) for(long i=0;i<n;i+=tx)\r
                {\r
-                       d.Set(GetX(x,i,j,k).x, GetY(y,i,j,k).x);\r
-                       v.Set(ax->v(i,j,k),ay->v(i,j,k));\r
+                       mglPoint d(GetX(x,i,j,k).x, GetY(y,i,j,k).x),p1;\r
+                       mglPoint v(ax->v(i,j,k),ay->v(i,j,k));\r
                        c1 = v.norm();  xm1 = xm1<c1 ? c1:xm1;  // handle NAN values\r
                        p1 = i<n-1 ? mglPoint(GetX(x,i+tx,j,k).x, GetY(y,i+tx,j,k).x)-d : d-mglPoint(GetX(x,i-tx,j,k).x, GetY(y,i-tx,j,k).x);\r
                        c1 = fabs(v*p1);        xx = p1.norm(); c1 *= xx?1/(xx*xx):0;\r
@@ -144,31 +144,37 @@ void MGL_EXPORT mgl_vect_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const cha
                {cm = cm<cm1 ? cm1:cm;  xm = xm<xm1 ? xm1:xm;}\r
        }\r
        ca /= (n*m*l)/(tx*ty);\r
-       xm = xm?1./xm:0;        cm = cm?1./cm:0;\r
+       xm = xm?1./xm:0;        cm = cm?fact/cm:0;\r
 \r
        for(long k=0;k<l;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 j=0;j<m;j+=ty) for(long i=0;i<n;i+=tx)\r
+               if(ax->GetNz()>1)       zVal = gr->Min.z+k*(gr->Max.z-gr->Min.z)/(ax->GetNz()-1);\r
+               const long ni = 1+((n-1)/tx), nj = 1+((m-1)/ty);\r
+               const long kq = gr->AllocPnts(2*ni*nj);\r
+#pragma omp parallel for collapse(2)\r
+               for(long j=0;j<nj;j++)  for(long i=0;i<ni;i++)\r
                {\r
-                       d.Set(GetX(x,i,j,k).x, GetY(y,i,j,k).x, zVal);\r
-                       v.Set(ax->v(i,j,k),ay->v(i,j,k));\r
-                       mreal dd = v.norm(), c1, c2;\r
+                       mglPoint d(GetX(x,i*tx,j*ty,k).x, GetY(y,i*tx,j*ty,k).x, zVal),p1,p2;\r
+                       mglPoint v(ax->v(i*tx,j*ty,k),ay->v(i*tx,j*ty,k));\r
+                       double dd = v.norm(), c1, c2;\r
                        v *= cm*(fix?(dd>dm ? 1./dd : 0) : xm);\r
 \r
                        if(end)         {       p1 = d-v;       p2 = d; }\r
-                       else if(beg)    {       p1 = d; p2 = d+v;       }\r
+                       else if(beg){   p1 = d; p2 = d+v;       }\r
                        else            {       p1=d-v/2.;      p2=d+v/2.;      }\r
                        if(grd) {       c1=gr->GetC(ss,dd*xm-0.5,false);        c2=gr->GetC(ss,dd*xm,false);}\r
                        else    c1 = c2 = gr->GetC(ss,dd*xm,false);\r
-                       long n1=gr->AddPnt(p1,c1),      n2=gr->AddPnt(p2,c2);\r
-                       // allow vectors outside bounding box\r
-                       if(n1<0 && n2>=0)       n1=gr->AddPnt(p1,c1,mglPoint(NAN),-1,2);\r
-                       if(n2<0 && n1>=0)       n2=gr->AddPnt(p2,c2,mglPoint(NAN),-1,2);\r
-                       if(dot) {       gr->line_plot(n1,n2);   gr->mark_plot(n1,'.');  }\r
-                       else    gr->vect_plot(n1,n2,gr->GetArrowSize());\r
+                       long iq = kq+2*(i+ni*j);\r
+                       bool r1=gr->AddPntQ(iq,p1,c1);\r
+                       bool r2=gr->AddPntQ(iq+1,p2,c2);\r
+                       if(!r1 && r2)   gr->AddPntQ(iq,p1,c1,mglPoint(NAN),-1,2);\r
+                       if(!r2 && r1)   gr->AddPntQ(iq+1,p2,c2,mglPoint(NAN),-1,2);\r
                }\r
+               if(dot) for(long i=0;i<ni*nj;i++)\r
+               {       long iq=kq+2*i; gr->line_plot(iq,iq+1); gr->mark_plot(iq,'.');  }\r
+               else    for(long i=0;i<ni*nj;i++)\r
+               {       long iq=kq+2*i; gr->vect_plot(iq,iq+1,asize);   }\r
        }\r
        gr->EndGroup();\r
 }\r
@@ -199,37 +205,37 @@ 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
        static int cgid=1;      gr->StartGroup("Vect_3d",cgid++);\r
-       bool dot = mglchr(sch,'.');\r
-       bool fix = mglchr(sch,'f');\r
-       bool end = mglchr(sch,'>');\r
-       bool beg = mglchr(sch,'<');\r
+       bool dot = mglchr(sch,'.'), fix = mglchr(sch,'f');\r
+       bool end = mglchr(sch,'>'), beg = mglchr(sch,'<');\r
        bool grd = mglchr(sch,'=');\r
+       double fact = gr->size_opt<0 ? -gr->size_opt:1;\r
 \r
+       gr->SetPenPal("-");\r
        long ss = gr->AddTexture(sch);\r
        gr->Reserve(2*n*m*l);\r
        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
+       double xm=0,cm=0,ca=0, asize = gr->GetArrowSize();\r
+       double dm=(fabs(gr->Max.c)+fabs(gr->Min.c))*1e-5;\r
        // use whole array for determining maximal vectors length\r
-       mglPoint p1,p2, v, d;\r
-\r
-#pragma omp parallel private(p1,p2,v,d)\r
+#pragma omp parallel\r
        {\r
-               mreal c1,c2,c3, xm1=0,cm1=0,xx;\r
+               double c1,c2,c3, xm1=0,cm1=0,xx;\r
 #pragma omp for nowait collapse(3) reduction(+:ca)\r
                for(long k=0;k<l;k+=tz) for(long i=0;i<n;i+=tx) for(long j=0;j<m;j+=ty)\r
                {\r
-                       d.Set(GetX(x,i,j,k).x, GetY(y,i,j,k).x, GetZ(z,i,j,k).x);\r
-                       v.Set(ax->v(i,j,k),ay->v(i,j,k),az->v(i,j,k));\r
+                       mglPoint d(GetX(x,i,j,k).x, GetY(y,i,j,k).x, GetZ(z,i,j,k).x);\r
+                       mglPoint v(ax->v(i,j,k),ay->v(i,j,k),az->v(i,j,k)),p1;\r
                        c1 = v.norm();  xm1 = xm1<c1 ? c1:xm1;  // handle NAN values\r
                        p1 = i<n-1 ? mglPoint(GetX(x,i+tx,j,k).x, GetY(y,i+tx,j,k).x, GetZ(z,i+tx,j,k).x)-d : d-mglPoint(GetX(x,i-tx,j,k).x, GetY(y,i-tx,j,k).x, GetZ(z,i-tx,j,k).x);\r
                        c1 = fabs(v*p1);        xx = p1.norm(); c1 *= xx?1/(xx*xx):0;\r
@@ -243,32 +249,35 @@ 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
-       xm = xm?1./xm:0;        cm = cm?1./cm:0;\r
+       ca /= double(n*m*l)/double(tx*ty*tz);\r
+       xm = xm?1./xm:0;        cm = cm?fact/cm:0;\r
 \r
-       for(long k=0;k<l;k+=tz)\r
+       const long ni = 1+((n-1)/tx), nj = 1+((m-1)/ty), nk = 1+((l-1)/tz);\r
+       const long kq = gr->AllocPnts(2*ni*nj*nk);\r
+#pragma omp parallel for collapse(3)\r
+       for(long k=0;k<nk;k++)  for(long j=0;j<nj;j++)  for(long i=0;i<ni;i++)\r
        {\r
-               if(gr->NeedStop())      break;\r
-               for(long i=0;i<n;i+=tx) for(long j=0;j<m;j+=ty)\r
-               {\r
-                       d.Set(GetX(x,i,j,k).x, GetY(y,i,j,k).x, GetZ(z,i,j,k).x);\r
-                       v.Set(ax->v(i,j,k),ay->v(i,j,k),az->v(i,j,k));\r
-                       mreal dd = v.norm(),c1,c2;\r
-                       v *= cm*(fix?(dd>dm ? 1./dd : 0) : xm);\r
+               long ii=i*tx,ij=j*ty,ik=k*tz;\r
+               mglPoint d(GetX(x,ii,ij,ik).x, GetY(y,ii,ij,ik).x, GetZ(z,ii,ij,ik).x);\r
+               mglPoint v(ax->v(ii,ij,ik),ay->v(ii,ij,ik),az->v(ii,ij,ik)), p1, p2;\r
+               double dd = v.norm(),c1,c2;\r
+               v *= cm*(fix?(dd>dm ? 1./dd : 0) : xm);\r
 \r
-                       if(end)         {       p1 = d-v;       p2 = d; }\r
-                       else if(beg)    {       p1 = d; p2 = d+v;       }\r
-                       else            {       p1=d-v/2.;      p2=d+v/2.;      }\r
-                       if(grd) {       c1=gr->GetC(ss,dd*xm-0.5,false);        c2=gr->GetC(ss,dd*xm,false);    }\r
-                       else    c1 = c2 = gr->GetC(ss,dd*xm,false);\r
-                       long n1=gr->AddPnt(p1,c1),      n2=gr->AddPnt(p2,c2);\r
-                       // allow vectors outside bounding box\r
-                       if(n1<0 && n2>=0)       n1=gr->AddPnt(p1,c1,mglPoint(NAN),-1,2);\r
-                       if(n2<0 && n1>=0)       n2=gr->AddPnt(p2,c2,mglPoint(NAN),-1,2);\r
-                       if(dot) {       gr->line_plot(n1,n2);   gr->mark_plot(n1,'.');  }\r
-                       else    gr->vect_plot(n1,n2,gr->GetArrowSize());\r
-               }\r
+               if(end)         {       p1 = d-v;       p2 = d; }\r
+               else if(beg){   p1 = d; p2 = d+v;       }\r
+               else            {       p1=d-v/2.;      p2=d+v/2.;      }\r
+               if(grd) {       c1=gr->GetC(ss,dd*xm-0.5,false);        c2=gr->GetC(ss,dd*xm,false);    }\r
+               else    c1 = c2 = gr->GetC(ss,dd*xm,false);\r
+               long iq = kq+2*(i+ni*(j+nj*k));\r
+               bool r1=gr->AddPntQ(iq,p1,c1);\r
+               bool r2=gr->AddPntQ(iq+1,p2,c2);\r
+               if(!r1 && r2)   gr->AddPntQ(iq,p1,c1,mglPoint(NAN),-1,2);\r
+               if(!r2 && r1)   gr->AddPntQ(iq+1,p2,c2,mglPoint(NAN),-1,2);\r
        }\r
+       if(dot) for(long i=0;i<ni*nj*nk;i++)\r
+       {       long iq=kq+2*i; gr->line_plot(iq,iq+1); gr->mark_plot(iq,'.');  }\r
+       else    for(long i=0;i<ni*nj*nk;i++)\r
+       {       long iq=kq+2*i; gr->vect_plot(iq,iq+1,asize);   }\r
        gr->EndGroup();\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -299,7 +308,7 @@ void MGL_EXPORT mgl_vect_3d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, uintpt
 //-----------------------------------------------------------------------------\r
 struct _mgl_vec_slice  {       mglData x,y,z,ax,ay,az; };\r
 //-----------------------------------------------------------------------------\r
-void MGL_NO_EXPORT mgl_get_slice(_mgl_vec_slice &s, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, char dir, mreal d, bool both)\r
+void static mgl_get_slice(_mgl_vec_slice &s, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, char dir, mreal d, bool both)\r
 {\r
        long n=ax->GetNx(),m=ax->GetNy(),l=ax->GetNz(), nx=1,ny=1,p;\r
 \r
@@ -319,7 +328,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 +340,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 +352,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 +369,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 +382,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 +395,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
@@ -407,32 +416,34 @@ void MGL_EXPORT mgl_vect3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay,
        if(mglchr(sch,'x'))     dir='x';\r
        if(mglchr(sch,'z'))     dir='z';\r
 \r
-       bool dot = mglchr(sch,'.');\r
-       bool fix = mglchr(sch,'f');\r
-       bool end = mglchr(sch,'>');\r
-       bool beg = mglchr(sch,'<');\r
+       bool dot = mglchr(sch,'.'), fix = mglchr(sch,'f');\r
+       bool end = mglchr(sch,'>'), beg = mglchr(sch,'<');\r
        bool grd = mglchr(sch,'=');\r
+       gr->SetPenPal("-");\r
        long ss = gr->AddTexture(sch);\r
+       double fact = gr->size_opt<0 ? -gr->size_opt:1;\r
 \r
        _mgl_vec_slice s;\r
        mgl_get_slice(s,x,y,z,ax,ay,az,dir,sVal,both);\r
 \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
-       mreal xm=0,cm=0,ca=0;\r
-       mreal dm=(fabs(gr->Max.c)+fabs(gr->Min.c))*1e-5;\r
+       if(tx<1)        tx=1;\r
+       if(ty<1)        ty=1;\r
+       double xm=0,cm=0,ca=0, asize = gr->GetArrowSize();\r
+       double dm=(fabs(gr->Max.c)+fabs(gr->Min.c))*1e-5;\r
        // use whole array for determining maximal vectors length\r
-       mglPoint p1,p2, v, d=(gr->Max-gr->Min)/mglPoint(1./ax->GetNx(),1./ax->GetNy(),1./ax->GetNz());\r
+       mglPoint d=(gr->Max-gr->Min)/mglPoint(1./ax->GetNx(),1./ax->GetNy(),1./ax->GetNz());\r
 \r
        long tn=ty*n;\r
-#pragma omp parallel private(p1,p2,v)\r
+#pragma omp parallel\r
        {\r
-               mreal xm1=0,cm1=0, xx,yy,zz, c1,c2;\r
+               double xm1=0,cm1=0, xx,yy,zz, c1,c2;\r
+               mglPoint p1, p2, v;\r
 #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,29 +458,36 @@ 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
-       xm = xm?1./xm:0;        cm = cm?1./cm:0;\r
+       ca /= mreal(n*m)/mreal(tx*ty);\r
+       xm = xm?1./xm:0;        cm = cm?fact/cm:0;\r
 \r
-       for(long i=0;i<n;i+=tx) for(long j=0;j<m;j+=ty)\r
+       const long ni = 1+((n-1)/tx), nj = 1+((m-1)/ty);\r
+       const long kq = gr->AllocPnts(2*ni*nj);\r
+#pragma omp parallel for collapse(2)\r
+       for(long j=0;j<nj;j++)  for(long i=0;i<ni;i++)\r
        {\r
-               register 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
+               long i0 = i*tx+n*j*ty;\r
+               mglPoint d(s.x.a[i0], s.y.a[i0], s.z.a[i0]), p1, p2;\r
+               mglPoint v(s.ax.a[i0], s.ay.a[i0], s.az.a[i0]);\r
+               double dd = v.norm(),c1,c2;\r
                v *= cm*(fix?(dd>dm ? 1./dd : 0) : xm);\r
 \r
                if(end)         {       p1 = d-v;       p2 = d; }\r
-               else if(beg)    {       p1 = d; p2 = d+v;       }\r
+               else if(beg){   p1 = d; p2 = d+v;       }\r
                else            {       p1=d-v/2.;      p2=d+v/2.;      }\r
                if(grd) {       c1=gr->GetC(ss,dd*xm-0.5,false);        c2=gr->GetC(ss,dd*xm,false);}\r
                else    c1 = c2 = gr->GetC(ss,dd*xm,false);\r
-               long n1=gr->AddPnt(p1,c1),      n2=gr->AddPnt(p2,c2);\r
-               // allow vectors outside bounding box\r
-               if(n1<0 && n2>=0)       n1=gr->AddPnt(p1,c1,mglPoint(NAN),-1,2);\r
-               if(n2<0 && n1>=0)       n2=gr->AddPnt(p2,c2,mglPoint(NAN),-1,2);\r
-               if(dot) {       gr->line_plot(n1,n2);   gr->mark_plot(n1,'.');  }\r
-               else    gr->vect_plot(n1,n2,gr->GetArrowSize());\r
+\r
+               long iq = kq+2*(i+ni*j);\r
+               bool r1=gr->AddPntQ(iq,p1,c1);\r
+               bool r2=gr->AddPntQ(iq+1,p2,c2);\r
+               if(!r1 && r2)   gr->AddPntQ(iq,p1,c1,mglPoint(NAN),-1,2);\r
+               if(!r2 && r1)   gr->AddPntQ(iq+1,p2,c2,mglPoint(NAN),-1,2);\r
        }\r
+       if(dot) for(long i=0;i<ni*nj;i++)\r
+       {       long iq=kq+2*i; gr->line_plot(iq,iq+1); gr->mark_plot(iq,'.');  }\r
+       else    for(long i=0;i<ni*nj;i++)\r
+       {       long iq=kq+2*i; gr->vect_plot(iq,iq+1,asize);   }\r
        gr->EndGroup();\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -498,7 +516,7 @@ 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, HCDT x, HCDT y, HCDT ax, HCDT ay, long ss, bool vv)\r
+void static 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->GetNx()+ax->GetNy());\r
        bool nboth = x->GetNx()*x->GetNy()!=ax->GetNx()*ax->GetNy() || y->GetNx()*y->GetNy()!=ax->GetNx()*ax->GetNy();\r
@@ -544,7 +562,7 @@ void MGL_NO_EXPORT flow(mglBase *gr, double zVal, double u, double v, HCDT x, HC
        } while(!end);\r
        else do{\r
                mglPoint dif;\r
-               register mreal xu,xv,yu,yv,det,xx,yy;\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
@@ -583,18 +601,15 @@ void MGL_NO_EXPORT flow(mglBase *gr, double zVal, double u, double v, HCDT x, HC
        } while(!end);\r
        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
-               for(long i=1;i<k;i++)\r
-               {\r
-                       long jj=j;      j = gr->AddPnt(pp[i],pp[i].c);\r
-                       if(vv && i%a==0)\r
-                       {\r
-                               if(dt<0)        gr->vect_plot(j,jj,a/3);\r
-                               else            gr->vect_plot(jj,j,a/3);\r
-                       }\r
-                       else    gr->line_plot(jj,j);\r
-               }\r
+               long a=long(0.3*gr->GetArrowSize()/fabs(dt));\r
+               const long kq = gr->AllocPnts(k);\r
+//#pragma omp parallel for // NOTE: parallel is used in above function\r
+               for(long i=0;i<k;i++)   gr->AddPntQ(kq+i,pp[i],pp[i].c);\r
+               gr->curve_plot(k,kq);\r
+               if(vv && dt<0)  for(long i=a;i<k;i+=a)\r
+                       gr->vect_plot(kq+i,kq+i-1,a/3.);\r
+               if(vv && dt>0)  for(long i=a;i<k;i+=a)\r
+                       gr->vect_plot(kq+i-1,kq+i,a/3.);\r
        }\r
        delete []pp;\r
 }\r
@@ -607,6 +622,7 @@ void MGL_EXPORT mgl_flow_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const cha
        long num = mgl_isnan(r)?5:long(r+0.5);\r
        static int cgid=1;      gr->StartGroup("Flow",cgid++);\r
 \r
+       gr->SetPenPal("-");\r
        long ss = gr->AddTexture(sch);\r
        bool vv = mglchr(sch,'v');\r
        // allocate memory\r
@@ -614,7 +630,57 @@ void MGL_EXPORT mgl_flow_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const cha
        bool cnt=!mglchr(sch,'#');\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
+       long nx=ax->GetNx(), ny=ax->GetNy();\r
+       if(mglchr(sch,'.'))\r
+       {\r
+               mglData a(nx,ny);\r
+               r = mgl_isnan(r)?0.5:r;\r
+               const mreal di = 1/mreal(nx-1), dj = 1/mreal(ny-1), ds=r*di, dt=r*dj;\r
+#pragma omp parallel for\r
+               for(long i=0;i<nx*ny;i++)\r
+                       a.a[i] = ax->vthr(i)*ax->vthr(i)+ay->vthr(i)*ay->vthr(i);\r
+#pragma omp parallel for collapse(2)\r
+               for(long j=1;j<ny-1;j++)        for(long i=1;i<nx-1;i++)\r
+               {\r
+                       long i0 = i+nx*j;       mreal v0 = a.a[i0];\r
+                       if(v0<=a.a[i0-1-nx] && v0<=a.a[i0-nx] && v0<=a.a[i0+1-nx] && v0<=a.a[i0-1] && v0<=a.a[i0+1] && v0<=a.a[i0-1+nx] && v0<=a.a[i0+nx] && v0<=a.a[i0+1+nx])\r
+#pragma omp critical(flow)\r
+                       {\r
+                               mreal s = i*di, t = j*dj;\r
+                               u.push_back(s+ds);      v.push_back(t+dt);\r
+                               u.push_back(-s-ds);     v.push_back(-t-dt);\r
+                               u.push_back(s-ds);      v.push_back(t-dt);\r
+                               u.push_back(-s+ds);     v.push_back(-t+dt);\r
+//mgl_mark(gr,x->v(i),y->v(j),0,"b.");\r
+                       }\r
+/*                     {\r
+                               if((ax->vthr(i0-1+nx)-ay->vthr(i0-1+nx))*(ax->vthr(i0+1-nx)-ay->vthr(i0+1-nx))<=0 &&\r
+                               (ax->vthr(i0-1-nx)+ay->vthr(i0-1-nx))*(ax->vthr(i0+1+nx)+ay->vthr(i0+1+nx))<=0)\r
+//                             && (ax->vthr(i0-1)*ay->vthr(i0-nx)<0 || ax->vthr(i0+1)*ay->vthr(i0+ny)<0))\r
+#pragma omp critical(flow)\r
+                               {\r
+                                       mreal s = i*di, t = j*dj;\r
+                                       u.push_back(s+ds);      v.push_back(t+dt);\r
+                                       u.push_back(-s-ds);     v.push_back(-t-dt);\r
+                                       u.push_back(s-ds);      v.push_back(t-dt);\r
+                                       u.push_back(-s+ds);     v.push_back(-t+dt);\r
+mgl_mark(gr,x->v(i),y->v(j),0,"b.");\r
+                               }\r
+                               else if(ax->vthr(i0-1)*ax->vthr(i0+1)<=0 && ay->vthr(i0-nx)*ay->vthr(i0+nx)<=0)\r
+//                             && (ax->vthr(i0-1)*ay->vthr(i0-nx)<0 || ax->vthr(i0+1)*ay->vthr(i0+ny)<0))\r
+#pragma omp critical(flow)\r
+                               {\r
+                                       mreal s = i*di, t = j*dj;\r
+                                       u.push_back(s+ds);      v.push_back(t);\r
+                                       u.push_back(-s-ds);     v.push_back(-t);\r
+                                       u.push_back(s-ds);      v.push_back(t);\r
+                                       u.push_back(-s+ds);     v.push_back(-t);\r
+mgl_mark(gr,x->v(i),y->v(j),0,"r.");\r
+                               }\r
+                       }*/\r
+               }\r
+       }\r
+       else 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
@@ -681,15 +747,24 @@ void MGL_EXPORT mgl_flowp_xy(HMGL gr, double x0, double y0, double z0, HCDT x, H
        gr->SaveState(opt);\r
        static int cgid=1;      gr->StartGroup("FlowP",cgid++);\r
 \r
+       gr->SetPenPal("-");\r
        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
+       if(nboth)\r
+       {\r
+               mreal dx=INFINITY, dy=INFINITY;\r
+               for(long i=0;i<n;i++)   for(long j=0;j<m;j++)   // first find closest\r
+               {       mreal d = fabs(x->v(i)-x0);     if(d<dx)        {       i0=i;   dx=d;   }       }\r
+               for(long i=0;i<n;i++)   for(long j=0;j<m;j++)   // first find closest\r
+               {       mreal d = fabs(y->v(j)-y0);     if(d<dy)        {       j0=j;   dy=d;   }       }\r
+               dm = hypot(dx,dy);\r
+       }\r
+       else    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 = 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
@@ -707,7 +782,7 @@ 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
@@ -795,7 +870,7 @@ void flow(mglBase *gr, double u, double v, double w, HCDT x, HCDT y, HCDT z, HCD
        } 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
+               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
@@ -849,9 +924,9 @@ void flow(mglBase *gr, double u, double v, double w, HCDT x, HCDT y, HCDT z, HCD
                // condition of end\r
                end = end || k>=n || u<0 || v<0 || u>1 || v>1 || w<0 || w>1;\r
        } while(!end);\r
-       if(k>1)\r
+       if(k>1) // TODO exclude AddPnt() and use curve_plot()!!!\r
        {\r
-               long j,a=long(gr->GetArrowSize()/fabs(dt));\r
+               long j,a=long(0.3*gr->GetArrowSize()/fabs(dt));\r
                mreal rr = mgl_anorm(gr->Max-gr->Min)*gr->BarWidth/25, ll;\r
                mglPoint q1,q2,l;\r
                long n1=-1,n2=-1,n3=-1,n4=-1;\r
@@ -876,56 +951,130 @@ void flow(mglBase *gr, double u, double v, double w, HCDT x, HCDT y, HCDT z, HCD
                        q1 -= l*(l*q1); q1/= mgl_anorm(q1);     q2 = q1^l;\r
                        long m1 = n1, m2 = n2, m3 = n3, m4 = n4;\r
                        if(xo)\r
-                       {       n1 = gr->AddPnt(pp[i],-1,q2);   n2 = gr->AddPnt(pp[i]+rr*q1,-1,q2);     gr->quad_plot(n1,n2,m1,m2);     }\r
+                       {       n1 = gr->AddPnt(pp[i],pp[i].c,q2);      n2 = gr->AddPnt(pp[i]+rr*q1,pp[i].c,q2);        gr->quad_plot(n1,n2,m1,m2);     }\r
                        if(zo)\r
-                       {       n3 = gr->AddPnt(pp[i],-1,q1);   n4 = gr->AddPnt(pp[i]+rr*q2,-1,q1);     gr->quad_plot(n3,n4,m3,m4);     }\r
+                       {       n3 = gr->AddPnt(pp[i],pp[i].c,q1);      n4 = gr->AddPnt(pp[i]+rr*q2,pp[i].c,q1);        gr->quad_plot(n3,n4,m3,m4);     }\r
                }\r
+               /*      TODO    long a=long(0.3*gr->GetArrowSize()/fabs(dt));\r
+               gr->Reserve(k);\r
+               long *nn = new long[k];\r
+               for(long i=0;i<k;i++)   nn[i] = gr->AddPnt(pp[i],pp[i].c);\r
+               gr->curve_plot(k,nn);\r
+               if(vv && dt<0)  for(long i=a;i<k;i+=a)\r
+                       gr->vect_plot(nn[i],nn[i-1],a/3.);\r
+               if(vv && dt>0)  for(long i=a;i<k;i+=a)\r
+                       gr->vect_plot(nn[i-1],nn[i],a/3.);\r
+               delete []nn;*/\r
        }\r
        delete []pp;\r
 }\r
 //-----------------------------------------------------------------------------\r
-void MGL_EXPORT mgl_flow_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt)\r
+void MGL_EXPORT mgl_flow3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, double sVal, const char *opt)\r
 {\r
        if(mgl_check_vec3(gr,x,y,z,ax,ay,az,"Flow3"))   return;\r
+       mreal r = gr->SaveState(opt);\r
+       long num = mgl_isnan(r)?5:long(r+0.5);\r
+       static int cgid=1;      gr->StartGroup("Flow3",cgid++);\r
+       char dir='y';\r
+       if(mglchr(sch,'x'))     dir='x';\r
+       if(mglchr(sch,'z'))     dir='z';\r
+\r
+       gr->SetPenPal("-");\r
+       long ss = gr->AddTexture(sch);\r
+       bool vv = mglchr(sch,'v'), tt = mglchr(sch,'t');\r
+       std::vector<mglPoint> u;\r
+       const double f = 1./(num+1);\r
+\r
+       if(dir=='x')\r
+       {\r
+               long n = ax->GetNx()-1;\r
+               sVal = (sVal<0 || sVal>n) ? 0.5 : sVal/n;\r
+               for(long j=0;j<num;j++) for(long i=0;i<num;i++)\r
+               {\r
+                       u.push_back(mglPoint(sVal,f*(i+1),f*(j+1)));\r
+                       u.push_back(mglPoint(-sVal,-f*(i+1),-f*(j+1)));\r
+               }\r
+       }\r
+       else if(dir=='y')\r
+       {\r
+               long n = ax->GetNy()-1;\r
+               sVal = (sVal<0 || sVal>n) ? 0.5 : sVal/n;\r
+               for(long j=0;j<num;j++) for(long i=0;i<num;i++)\r
+               {\r
+                       u.push_back(mglPoint(f*(i+1),sVal,f*(j+1)));\r
+                       u.push_back(mglPoint(-f*(i+1),-sVal,-f*(j+1)));\r
+               }\r
+       }\r
+       else if(dir=='z')\r
+       {\r
+               long n = ax->GetNy()-1;\r
+               sVal = (sVal<0 || sVal>n) ? 0.5 : sVal/n;\r
+               for(long j=0;j<num;j++) for(long i=0;i<num;i++)\r
+               {\r
+                       u.push_back(mglPoint(f*(i+1),f*(j+1),sVal));\r
+                       u.push_back(mglPoint(-f*(i+1),-f*(j+1),-sVal));\r
+               }\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].x, u[i].y, u[i].z, x, y, z, ax, ay, az, ss,vv,tt,tt);\r
+       gr->EndGroup();\r
+}\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_flow3(HMGL gr, HCDT ax, HCDT ay, HCDT az, const char *sch, double sVal, const char *opt)\r
+{\r
+       gr->SaveState(opt);\r
+       mglDataV x(ax->GetNx()), y(ax->GetNy()),z(ax->GetNz());\r
+       x.Fill(gr->Min.x,gr->Max.x);\r
+       y.Fill(gr->Min.y,gr->Max.y);\r
+       z.Fill(gr->Min.z,gr->Max.z);\r
+       mgl_flow3_xyz(gr,&x,&y,&z,ax,ay,az,sch,sVal,0);\r
+}\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_flow3_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, double *sVal, 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_flow3_xyz(_GR_, _DA_(x), _DA_(y), _DA_(z), _DA_(ax), _DA_(ay), _DA_(az), s, *sVal, o);      delete []o;     delete []s;     }\r
+void MGL_EXPORT mgl_flow3_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, double *sVal, 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_flow3(_GR_, _DA_(ax), _DA_(ay), _DA_(az), s, *sVal, o);     delete []o;     delete []s;     }\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_flow_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt)\r
+{\r
+       if(mgl_check_vec3(gr,x,y,z,ax,ay,az,"Flow3d"))  return;\r
 \r
        mreal r = gr->SaveState(opt);\r
        long num = mgl_isnan(r)?3:long(r+0.5);\r
-       static int cgid=1;      gr->StartGroup("Flow3",cgid++);\r
+       static int cgid=1;      gr->StartGroup("Flow3d",cgid++);\r
        bool cnt=!mglchr(sch,'#');\r
+       gr->SetPenPal("-");\r
        long ss = gr->AddTexture(sch);\r
        bool vv = mglchr(sch,'v'), xo = mglchr(sch,'x'), zo = mglchr(sch,'z');\r
 \r
-       std::vector<mreal> u, v, w;\r
+       std::vector<mglPoint> u;\r
        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(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
+               u.push_back(mglPoint(t,s,0));   u.push_back(mglPoint(-t,-s,0));\r
+               u.push_back(mglPoint(t,s,1));   u.push_back(mglPoint(-t,-s,-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
+               u.push_back(mglPoint(t,0,s));   u.push_back(mglPoint(-t,0,-s));\r
+               u.push_back(mglPoint(t,1,s));   u.push_back(mglPoint(-t,-1,-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
+               u.push_back(mglPoint(0,s,t));   u.push_back(mglPoint(0,-s,-t));\r
+               u.push_back(mglPoint(1,s,t));   u.push_back(mglPoint(-1,-s,-t));\r
                if(cnt)\r
                {\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
+                       u.push_back(mglPoint(t,s,0.5)); u.push_back(mglPoint(-t,-s,-0.5));\r
+                       u.push_back(mglPoint(t,0.5,s)); u.push_back(mglPoint(-t,-0.5,-s));\r
+                       u.push_back(mglPoint(0.5,s,t)); u.push_back(mglPoint(-0.5,-s,-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
+               flow(gr, u[i].x, u[i].y, u[i].z, x, y, z, ax, ay, az,ss,vv,xo,zo);\r
        gr->EndGroup();\r
 }\r
 //-----------------------------------------------------------------------------\r
@@ -958,28 +1107,37 @@ void MGL_EXPORT mgl_flowp_xyz(HMGL gr, double x0, double y0, double z0, HCDT x,
 \r
        gr->SaveState(opt);\r
        static int cgid=1;      gr->StartGroup("FlowP3",cgid++);\r
+       gr->SetPenPal("-");\r
        long ss = gr->AddTexture(sch);\r
        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
+       if(nboth)       // 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 dx=INFINITY, dy=INFINITY, dz=INFINITY;\r
+               for(long i=0;i<n;i++)\r
+               {       mreal d = fabs(x->v(i)-p.x);    if(d<dx)        {       i0=i;   dx=d;   }       }\r
+               dm = INFINITY;\r
+               for(long j=0;j<m;j++)\r
+               {       mreal d = fabs(y->v(j)-p.y);    if(d<dy)        {       j0=j;   dy=d;   }       }\r
+               dm = INFINITY;\r
+               for(long k=0;k<l;k++)\r
+               {       mreal d = fabs(z->v(k)-p.z);    if(d<dz)        {       k0=k;   dz=d;   }       }\r
+               dm = sqrt(dx*dx+dy*dy+dz*dz);\r
+       }\r
+       else    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
+               mreal 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
+               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
        {       u=i0/mreal(n);  v=j0/mreal(m);  w=k0/mreal(l);  }\r
        else\r
        {\r
-               mreal dxu,dxv,dxw,dyu,dyv,dyw,dzu,dzv,dzw;\r
+               mreal dxu,dxv,dxw,dyu,dyv,dyw,dzu,dzv,dzw, dx,dy,dz;\r
                if(nboth)\r
                {\r
                        dx = x->v(i0)-p.x;      dy = y->v(j0)-p.y;      dz = z->v(k0)-p.z;\r
@@ -992,7 +1150,7 @@ 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
@@ -1037,7 +1195,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
@@ -1054,7 +1212,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
@@ -1088,7 +1246,7 @@ 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, HCDT x, HCDT y, HCDT ax, HCDT ay, double r0,long sc)\r
+void static 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->GetNx()+ax->GetNy());\r
        bool nboth = x->GetNx()*x->GetNy()!=ax->GetNx()*ax->GetNy() || y->GetNx()*y->GetNy()!=ax->GetNx()*ax->GetNy();\r
@@ -1098,8 +1256,8 @@ void MGL_NO_EXPORT flowr(mglBase *gr, double zVal, double u, double v, HCDT x, H
        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->GetNx(),ax->GetNy());\r
 \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
+       double 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
+       double 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
@@ -1137,7 +1295,7 @@ void MGL_NO_EXPORT flowr(mglBase *gr, double zVal, double u, double v, HCDT x, H
        } while(!end);\r
        else do{\r
                mglPoint dif;\r
-               register mreal xu,xv,yu,yv,det,xx,yy;\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
@@ -1178,39 +1336,37 @@ void MGL_NO_EXPORT flowr(mglBase *gr, double zVal, double u, double v, HCDT x, H
        } while(!end);\r
        if(k>1)\r
        {\r
-               int num=!(gr->GetQuality()&3)?13:25;\r
-               long *id=new long[2*num];\r
-               mglPoint p,l=pp[1]-pp[0],t,q,d;\r
-               t = !l; t.Normalize();  q = t^l;        q.Normalize();\r
-               mreal rr=pp[0].c,dr=l.c;\r
-               gr->Reserve(num*k);\r
+               const int num=!(gr->GetQuality()&3)?13:25;\r
+               mglPoint l=pp[1]-pp[0],t=!l,q=t^l;\r
+               t.Normalize();  q.Normalize();\r
+               double rr=pp[0].c,dr=l.c;\r
 \r
+               const long kq = gr->AllocPnts(num*k);\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
-                       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
+                       int fi=j*360/(num-1);\r
+                       float co = mgl_cos[fi%360], si = mgl_cos[(270+fi)%360];\r
+                       mglPoint p = pp[0] + t*(rr*co) + q*(rr*si);\r
+                       mglPoint d = (t*si - q*co)^(l + t*(dr*co) + q*(dr*si));\r
+                       gr->AddPntQ(kq+j,p,cc[0],d);\r
                }\r
                for(long i=1;i<k;i++)\r
                {\r
-                       if(i<k-1)       l = pp[i+1]-pp[i-1];\r
-                       else    l = pp[i]-pp[i-1];\r
-                       t = !l; t.Normalize();  q = t^l;        q.Normalize();\r
-                       rr=pp[i].c;     dr=l.c;\r
-                       memcpy(id+num,id,num*sizeof(long));\r
+                       mglPoint l = pp[i]-pp[i-1];\r
+                       mglPoint t = !l;        t.Normalize();\r
+                       mglPoint q = t^l;       q.Normalize();\r
+                       double rr=pp[i].c;      dr=l.c;\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
-                               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
-                               if(j>0) gr->quad_plot(id[j-1],id[j],id[j+num-1],id[j+num]);\r
+                               int fi=j*360/(num-1);\r
+                               float co = mgl_cos[fi%360], si = mgl_cos[(270+fi)%360];\r
+                               mglPoint p = pp[i] + t*(rr*co) + q*(rr*si);\r
+                               mglPoint d = (t*si - q*co)^(l + t*(dr*co) + q*(dr*si));\r
+                               gr->AddPntQ(kq+i*num+j,p,cc[i],d);\r
                        }\r
                }\r
-               delete []id;\r
+               for(long i=1;i<k;i++)   for(long j=1;j<num;j++)\r
+               {       long iq=kq+j+i*num;     gr->quad_plot(iq-1,iq,iq-num-1,iq-num); }\r
        }\r
        delete []pp;    delete []cc;\r
 }\r
@@ -1302,8 +1458,8 @@ void flowr(mglBase *gr, double u, double v, double w, HCDT x, HCDT y, HCDT z, HC
 \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
+       double dt = 0.2/nn, e,f,g,ee[4],ff[4],gg[4],h,s=2,u1,v1,w1,acc=dt/20;\r
+       double ss = 16./mgl_ipow(gr->Max.c - gr->Min.c,2);\r
 \r
        if(u<0 || v<0 || w<0)\r
        {       dt = -dt;       u = -u; v = -v; w = -w; s *= -1;}\r
@@ -1350,7 +1506,7 @@ void flowr(mglBase *gr, double u, double v, double w, HCDT x, HCDT y, HCDT z, HC
        } 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
+               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
@@ -1407,39 +1563,36 @@ void flowr(mglBase *gr, double u, double v, double w, HCDT x, HCDT y, HCDT z, HC
        } while(!end);\r
        if(k>1)\r
        {\r
-               const int num=24;\r
-               long *id=new long[2*num];\r
-               mglPoint p,l=pp[1]-pp[0],t,q,d;\r
-               t = !l; t.Normalize();  q = t^l;        q.Normalize();\r
-               mreal rr=pp[0].c,dr=l.c;\r
-               gr->Reserve(num*k);\r
-\r
+               const int num=!(gr->GetQuality()&3)?13:25;\r
+               mglPoint l=pp[1]-pp[0],t=!l,q=t^l,p,d;\r
+               t.Normalize();  q.Normalize();\r
+               double rr=pp[0].c,dr=l.c;\r
+               long kq = gr->AllocPnts(num*k);\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
+                       gr->AddPntQ(kq+j,p,cc[0],d);\r
                }\r
                for(long i=1;i<k;i++)\r
                {\r
-                       if(i<k-1)       l = pp[i+1]-pp[i-1];\r
-                       else    l = pp[i]-pp[i-1];\r
-                       t = !l; t.Normalize();  q = t^l;        q.Normalize();\r
-                       rr=pp[i].c;     dr=l.c;\r
-                       memcpy(id+num,id,num*sizeof(long));\r
+                       l = pp[i]-pp[i-1];\r
+                       t = !l; t.Normalize();\r
+                       q = t^l;        q.Normalize();\r
+                       double rr=pp[i].c;      dr=l.c;\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
-                               if(j>0) gr->quad_plot(id[j-1],id[j],id[j+num-1],id[j+num]);\r
+                               gr->AddPntQ(kq+i*num+j,p,cc[i],d);\r
                        }\r
                }\r
-               delete []id;\r
+               for(long i=1;i<k;i++)   for(long j=1;j<num;j++)\r
+               {       long iq=kq+j+i*num;     gr->quad_plot(iq-1,iq,iq-num-1,iq-num); }\r
        }\r
        delete []pp;    delete []cc;\r
 }\r
index f34bb688604cad142e9d94d00843e3eba115cde8..728483150714fd43733e06ec04a76a10b3eaa0bf 100644 (file)
@@ -48,39 +48,36 @@ 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
        // x, y, z -- have the same size as a\r
        n /= tx;        m /= ty;        l /= tz;\r
-       long *pos=new long[n*m*l];\r
        gr->Reserve(n*m*l);\r
        mglPoint q(NAN);\r
-       for(long k=0;k<l;k++)\r
+       const long kq = gr->AllocPnts(n*m*l),nm=n*m;\r
+#pragma omp parallel for\r
+       for(long k=0;k<l;k++)   for(long j=0;j<m;j++)   for(long i=0;i<n;i++)\r
        {\r
-               if(gr->NeedStop())      break;\r
-               for(long j=0;j<m;j++)   for(long i=0;i<n;i++)\r
-               {\r
-                       mglPoint p = nboth ? mglPoint(x->v(i*tx),y->v(j*ty),z->v(k*tz)) : mglPoint(x->v(i*tx,j*ty,k*tz),y->v(i*tx,j*ty,k*tz),z->v(i*tx,j*ty,k*tz));\r
-                       mreal aa = gr->GetA(a->v(i*tx,j*ty,k*tz));\r
-                       mreal bb = inv ? (1-aa)*(1-aa)*alpha : aa*aa*alpha;\r
-                       pos[i+n*(j+m*k)] = gr->AddPnt(p,gr->GetC(ss,aa,false),q,bb);\r
-               }\r
+               mglPoint p = nboth ? mglPoint(x->v(i*tx),y->v(j*ty),z->v(k*tz)) : mglPoint(x->v(i*tx,j*ty,k*tz),y->v(i*tx,j*ty,k*tz),z->v(i*tx,j*ty,k*tz));\r
+               mreal aa = gr->GetA(a->v(i*tx,j*ty,k*tz));\r
+               mreal bb = inv ? (1-aa)*(1-aa)*alpha : aa*aa*alpha;\r
+               gr->AddPntQ(kq+i+n*(j+m*k), p,gr->GetC(ss,aa,false),q,bb);\r
        }\r
-       if(dot) for(long i=0;i<n*m*l;i++)       gr->mark_plot(pos[i],'.');\r
+       if(dot) for(long i=0;i<n*m*l;i++)       gr->mark_plot(kq+i,'.');\r
        else    for(long k=0;k<l;k++)\r
        {\r
                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
-                       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
+                       long i0 = kq+i+n*(j+m*k);\r
+                       if(i<n-1 && j<m-1)      gr->quad_plot(i0,i0+1,i0+n, i0+n+1);\r
+                       if(i<n-1 && k<l-1)      gr->quad_plot(i0,i0+1,i0+nm,i0+nm+1);\r
+                       if(k<l-1 && j<m-1)      gr->quad_plot(i0,i0+n,i0+nm,i0+n+nm);\r
                }\r
        }\r
-       delete []pos;   gr->EndGroup();\r
+       gr->EndGroup();\r
 }\r
 //-----------------------------------------------------------------------------\r
 void MGL_EXPORT mgl_cloud(HMGL gr, HCDT a, const char *sch, const char *opt)\r
@@ -107,7 +104,7 @@ 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
+mreal static 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
@@ -122,12 +119,11 @@ mreal MGL_NO_EXPORT mgl_get_norm(mreal x, mreal d1, mreal d2, mreal d3)
        }\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
+mglPoint static 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
@@ -137,14 +133,14 @@ mglPoint MGL_NO_EXPORT mgl_normal_3d(HCDT a, mglPoint p, bool inv, long n,long m
        return inv ? mglPoint(nx,ny,nz) : mglPoint(-nx,-ny,-nz);\r
 }\r
 //-----------------------------------------------------------------------------\r
-mreal MGL_NO_EXPORT mgl_normal_1d(HCDT a, mreal x, long n)\r
+mreal static mgl_normal_1d(HCDT a, mreal x, long n)\r
 {\r
-       register long i=long(x);\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
+mglPoint static mgl_find_norm(bool nboth, HCDT x, HCDT y, HCDT z, HCDT a, mglPoint u, bool inv, long n,long m,long l)\r
 {\r
        mglPoint s = mgl_normal_3d(a,u,inv,n,m,l), t, q;\r
        if(nboth)\r
@@ -162,7 +158,7 @@ mglPoint MGL_NO_EXPORT mgl_find_norm(bool nboth, HCDT x, HCDT y, HCDT z, HCDT a,
        return q;\r
 }\r
 //-----------------------------------------------------------------------------\r
-inline mreal MGL_NO_EXPORT mgl_cos_pp(const mglPoint *kk,long i0,long i1,long i2)\r
+inline mreal static mgl_cos_pp(const mglPoint *kk,long i0,long i1,long i2)\r
 {\r
        mglPoint dp1 = kk[i1]-kk[i0], dp2 = kk[i2]-kk[i0];\r
        mreal p1=dp1*dp1,p2=dp2*dp2,pc=dp1*dp2;\r
@@ -177,9 +173,10 @@ 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,ni = 0,ii,jj;\r
                // find ID of points of Surf3 intersection with cell i0\r
-               memset(id,-1,12*sizeof(long));  long ni = 0;\r
+               for(int i=0;i<12;i++)   id[i]=-1;\r
+//             memset(id,-1,12*sizeof(long));  long ni = 0;\r
                if(kx1[i0]>=0)          id[ni++] = kx1[i0];\r
                if(ky1[i0]>=0)          id[ni++] = ky1[i0];\r
                if(kx1[i0+n]>=0)        id[ni++] = kx1[i0+n];\r
@@ -199,7 +196,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
@@ -211,7 +208,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
@@ -219,13 +216,13 @@ void MGL_EXPORT mgl_surf3_plot(HMGL gr, long n,long m,long *kx1,long *kx2,long *
                // select the same orientation of all triangles of the surface\r
                us[0] = us[jj] = 1;\r
                // find all triangles\r
-               for(k=2;k<ni;k++)\r
+               for(long k=2;k<ni;k++)\r
                {\r
                        // find closest point in sence cosine of angle\r
                        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
@@ -248,7 +245,7 @@ void MGL_EXPORT mgl_surf3_plot(HMGL gr, long n,long m,long *kx1,long *kx2,long *
        }\r
 }\r
 //-----------------------------------------------------------------------------\r
-void MGL_NO_EXPORT mgl_surf3ca_gen(HMGL gr, double val, HCDT x, HCDT y, HCDT z, HCDT a, HCDT c, HCDT b, const char *sch)\r
+void static mgl_surf3ca_gen(HMGL gr, double val, HCDT x, HCDT y, HCDT z, HCDT a, HCDT c, HCDT b, const char *sch)\r
 {\r
        long n=a->GetNx(),m=a->GetNy(),l=a->GetNz();\r
        bool nboth = mgl_isnboth(x,y,z,a);\r
@@ -273,7 +270,7 @@ 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
@@ -296,39 +293,60 @@ void MGL_NO_EXPORT mgl_surf3ca_gen(HMGL gr, double val, HCDT x, HCDT y, HCDT z,
                        }\r
                }\r
                mreal cv=gr->GetC(ss,val);\r
-               if(b && c)      for(size_t i=kk1;i<kk.size();i++)\r
+               if(b && c)\r
                {\r
-                       mglPoint &u = kk[i];\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
+                       const long kq = gr->AllocPnts(kk.size());\r
+#pragma omp parallel for\r
+                       for(msize i=kk1;i<kk.size();i++)\r
+                       {\r
+                               mglPoint &u = kk[i];\r
+                               double cc = c->linear(u.x,u.y,u.z), bb = b->linear(u.x,u.y,u.z);\r
+                               gr->AddPntQ(kq+i,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,cc), mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l), gr->GetA(bb));\r
+                               u.c = kq+i;\r
+                       }\r
                }\r
-               else if(c)      for(size_t i=kk1;i<kk.size();i++)\r
+               else if(c)\r
                {\r
-                       mglPoint &u = kk[i];\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
+                       const long kq = gr->AllocPnts(kk.size());\r
+#pragma omp parallel for\r
+                       for(msize i=kk1;i<kk.size();i++)\r
+                       {\r
+                               mglPoint &u = kk[i];\r
+                               double cc = c->linear(u.x,u.y,u.z);\r
+                               gr->AddPntQ(kq+i,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,cc), mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l));\r
+                               u.c = kq+i;\r
+                       }\r
                }\r
-               else if(b)      for(size_t i=kk1;i<kk.size();i++)\r
+               else if(b)\r
                {\r
-                       mglPoint &u = kk[i];\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
+                       const long kq = gr->AllocPnts(kk.size());\r
+#pragma omp parallel for\r
+                       for(msize i=kk1;i<kk.size();i++)\r
+                       {\r
+                               mglPoint &u = kk[i];\r
+                               double bb = b->linear(u.x,u.y,u.z);\r
+                               gr->AddPntQ(kq+i,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), gr->GetA(bb));\r
+                               u.c = kq+i;\r
+                       }\r
                }\r
-               else    for(size_t i=kk1;i<kk.size();i++)\r
+               else\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
+                       const long kq = gr->AllocPnts(kk.size());\r
+#pragma omp parallel for\r
+                       for(msize i=kk1;i<kk.size();i++)\r
+                       {\r
+                               mglPoint &u = kk[i];\r
+                               gr->AddPntQ(kq+i,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
+                               u.c = kq+i;\r
+                       }\r
                }\r
 \r
                if(k>0) mgl_surf3_plot(gr,n,m,kx1,kx2,ky1,ky2,kz,kk,wire);\r
@@ -633,31 +651,29 @@ void MGL_EXPORT mgl_beam_val(HMGL gr, double val, HCDT tr, HCDT g1, HCDT g2, HCD
                        mreal asum=0, amax=0;\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
                        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)    for(long j=0;j<m;j++)   for(long k=0;k<l;k++)\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
-                       register long i0 = j+m*(k+l*i);\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 j=0;j<m;j++)   for(long k=0;k<l;k++)\r
+               else    for(long k=0;k<l;k++)   for(long j=0;j<m;j++)\r
                {\r
-                       register long i0 = j+m*(k+l*i);\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;j++)   for(long k=0;k<l;k++)\r
-               {\r
-                       register long i0 = j+m*(k+l*i);\r
-                       x.a[i0] = hypot(x.a[i0],y.a[i0]);\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 ca5b9b9991d9fca41222ad9d0a8d7fb746fccf35..abe6201bd4ba6fc2b7db20a7217d226f60cd8b4d 100644 (file)
@@ -22,7 +22,7 @@
 mglCanvasWnd::mglCanvasWnd() : mglCanvas()\r
 {\r
        Setup();        LoadFunc=0;     FuncPar=0;      DrawFunc=0;     ClickFunc=0;\r
-       GG = 0;         NumFig = 0;     CurFig = -1;\r
+       GG = 0;         NumFig = 0;     CurFig=-1;      PropFunc=0;     PropPar=0;\r
 #if MGL_HAVE_PTHR_WIDGET\r
        mutex=0;\r
 #endif\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
@@ -90,7 +90,7 @@ void mglCanvasWnd::SetDrawFunc(int (*draw)(mglBase *gr, void *p), void *par, voi
        {\r
                ResetFrames();\r
                if(get(MGL_CLF_ON_UPD)) DefaultPlotParam();\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
@@ -121,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
@@ -134,8 +134,14 @@ void mglCanvasWnd::ReLoad()
        }\r
 }\r
 //-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_prop_func(char id, const char *val, void *p)\r
+{      mglCanvasWnd *g = (mglCanvasWnd *)(p);  if(g)   g->SetParam(id, val);   }\r
+void MGL_EXPORT mgl_wnd_make_dialog(HMGL gr, const char *ids, char const * const *args, const char *title)\r
+{      mglCanvasWnd *g = dynamic_cast<mglCanvasWnd *>(gr);     if(g)   g->MakeDialog(ids, args, title);        }\r
 void MGL_EXPORT mgl_wnd_set_func(HMGL gr, int (*draw)(HMGL gr, void *p), void *par, void (*reload)(void *p))\r
 {      mglCanvasWnd *g = dynamic_cast<mglCanvasWnd *>(gr);     if(g)   g->SetDrawFunc(draw, par, reload);      }\r
+void MGL_EXPORT mgl_wnd_set_prop(HMGL gr, void (*prop)(char id, const char *val, void *p), void *par)\r
+{      mglCanvasWnd *g = dynamic_cast<mglCanvasWnd *>(gr);     if(g)   g->SetPropFunc(prop, par);      }\r
 void MGL_EXPORT mgl_wnd_toggle_alpha(HMGL gr)\r
 {      mglCanvasWnd *g = dynamic_cast<mglCanvasWnd *>(gr);     if(g)   g->ToggleAlpha();       }\r
 void MGL_EXPORT mgl_wnd_toggle_light(HMGL gr)\r
@@ -233,6 +239,8 @@ void MGL_EXPORT mgl_reload_class(void *p)
 {      mglDraw *dr = (mglDraw *)p;     if(dr)  dr->Reload();   }\r
 void MGL_EXPORT mgl_click_class(void *p)\r
 {      mglDraw *dr = (mglDraw *)p;     if(dr)  dr->Click();            }\r
+void MGL_EXPORT mgl_prop_class(char id, const char *val, void *p)\r
+{      mglDraw *dr = (mglDraw *)p;     if(dr)  dr->Param(id,val);      }\r
 //-----------------------------------------------------------------------------\r
 typedef int (*draw_func)(mglGraph *gr);\r
 int MGL_EXPORT mgl_draw_graph(HMGL gr, void *p)\r
@@ -251,3 +259,64 @@ MGL_EXPORT void *mgl_draw_calc(void *p)
        return 0;\r
 }\r
 //-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_parse_comments(const char *text, double &a1, double &a2, double &da, std::vector<std::string> &anim, std::string &ids, std::vector<std::string> &par)\r
+{\r
+       a1=0;   a2=0;   da=1;\r
+       const char *str = strstr(text, "##c");\r
+       if(str) // this is animation loop\r
+       {\r
+               int res=sscanf(str+3, "%lg%lg%lg", &a1, &a2, &da);\r
+               da = res<3?1:da;\r
+               if(res>2 && da*(a2-a1)>0)\r
+               {\r
+                       for(double a=a1;da*(a2-a)>=0;a+=da)\r
+                       {\r
+                               char buf[128];  snprintf(buf,128,"%g",a);\r
+                               anim.push_back(buf);\r
+                       }\r
+                       return;\r
+               }\r
+       }\r
+       str = strstr(text, "##a");\r
+       while(str)\r
+       {\r
+               str += 3;\r
+               while(*str>0 && *str<=' ' && *str!='\n')        str++;\r
+               if(*str>' ')\r
+               {\r
+                       size_t j=0;     while(str[j]>' ')       j++;\r
+                       std::string val(str,j);\r
+                       anim.push_back(val);\r
+               }\r
+               str = strstr(str, "##a");\r
+       }\r
+       str = strstr(text, "##d");      // custom dialog\r
+       while(str)\r
+       {\r
+               str = strchr(str,'$');\r
+               if(str)\r
+               {\r
+                       char id = str[1];       str += 2;\r
+                       while(*str>0 && *str<=' ' && *str!='\n')        str++;\r
+                       if(*str>' ')\r
+                       {\r
+                               long j=0;       while(str[j]!='\n')     j++;\r
+                               while(str[j-1]<=' ')    j--;\r
+                               \r
+                               ids.push_back(id);\r
+                               std::string val(str,j);\r
+                               par.push_back(val);\r
+                       }\r
+               }\r
+               str = strstr(str, "##d");\r
+       }\r
+}\r
+//-----------------------------------------------------------------------------\r
+void MGL_EXPORT mgl_parse_animation(const char *text, std::vector<std::string> &anim)\r
+{\r
+       std::string ids;\r
+       std::vector<std::string> par;\r
+       double a1, a2, da;\r
+       mgl_parse_comments(text, a1, a2, da, anim, ids, par);\r
+}\r
+//-----------------------------------------------------------------------------\r
index 97819deb827b7cfd0e6d51b25bf8a0a2c3d4bc79..048f016a78cea15cd8fe5a886c1b3c1caed76d1b 100644 (file)
@@ -1,17 +1,9 @@
-configure_file(${MathGL_SOURCE_DIR}/texinfo/version.texi.in ${MathGL_BINARY_DIR}/texinfo/version.texi)
-
-set(MGL_EXTRA light pendelta)
-set(MGL_PNG alpha area aspect axial axis barh bars belt boxplot
-       box boxs candle chart cloud colorbar combined cones conta contd
-       contfa contf contf_xyz cont contv cont_xyz curvcoor cut dat_diff
-       dat_extra densa dens dens_xyz dew dots error error2 fall fit flow fonts
-       fog grad hist inplot label legend loglog map mark mesh mirror
-       molecule parser pde pipe plot primitives projection qo2d radar region schemes
-       several_light solve stem step stereo stfa style surf3a surf3c surf3ca surf3
-       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 )
+configure_file(${MathGL2_SOURCE_DIR}/texinfo/version.texi.in ${MathGL2_BINARY_DIR}/texinfo/version.texi)
+
+#set(MGL_EXTRA light pendelta)
+set(MGL_EXTRA )
+set(MGL_PNG_ONLY quality0 quality1 quality2 quality4 quality5 quality6 quality8 pendelta fexport) 
+set(MGL_PNG 3wave alpha apde area aspect axial axis barh bars belt bifurcation box boxplot boxs candle chart cloud colorbar combined cones cont cont_xyz cont3 contd contf contf_xyz contf3 contv correl curvcoor cut dat_diff dat_extra data1 data2 dens dens_xyz dens3 detect dew diffract dilate dots earth error error2 export fall fit flame2d flow flow3 fog fonts grad hist ifs2d ifs3d indirect inplot iris label lamerey legend light loglog map mark mask mesh mirror molecule ode ohlc param1 param2 param3 paramv parser pde pipe plot pmap primitives projection projection5 pulse qo2d radar refill region scanfile schemes section several_light solve stem step stereo stfa style surf surf3 surf3a surf3c surf3ca surfa surfc surfca table tape tens ternary text text2 textmark ticks tile tiles torus traj triangulation triplot tube type0 type1 type2 vect vect3 venn )
 set(MGL_PNG_N )
 set(MGL_PNG_S )
 set(MGL_PNG_J )
@@ -26,6 +18,16 @@ 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)
+file(COPY ${CMAKE_SOURCE_DIR}/examples/samples.cpp DESTINATION ${MGL_OUT})
+file(COPY ${CMAKE_SOURCE_DIR}/examples/wnd_samples.cpp DESTINATION ${MGL_OUT})
 
 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
@@ -34,7 +36,21 @@ foreach(SAMPLE ${UDAV_IMG})
        file(COPY ${MGL_TEX}/udav/${SAMPLE} DESTINATION ${MGL_OUT}/udav/)
 endforeach(SAMPLE)
 
-foreach(SAMPLE ${MGL_PNG})
+add_custom_command(OUTPUT ${MGL_OUT}/samples.texi
+       COMMAND mgl_example -texi
+       DEPENDS mgl_example
+       WORKING_DIRECTORY ${MGL_OUT} )
+#add_custom_command(OUTPUT ${MGL_OUT}/time.texi
+#      COMMAND mgl_example -time
+#      DEPENDS mgl_example
+#      WORKING_DIRECTORY ${MGL_OUT} )
+#add_custom_command(OUTPUT ${MGL_OUT}/time_big.texi
+#      COMMAND mgl_example -time -big
+#      DEPENDS mgl_example
+#      WORKING_DIRECTORY ${MGL_OUT} )
+
+
+foreach(SAMPLE ${MGL_PNG_ONLY})
        set(MGL_PNG_N ${MGL_PNG_N} ${MGL_OUT}/png/${SAMPLE}.png)
        add_custom_command(OUTPUT ${MGL_OUT}/png/${SAMPLE}.png
                COMMAND mgl_example -kind=${SAMPLE}
@@ -45,22 +61,34 @@ 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}
+endforeach(SAMPLE)
+
+foreach(SAMPLE ${MGL_PNG})
+       set(MGL_PNG_N ${MGL_PNG_N} ${MGL_OUT}/png/${SAMPLE}.png)
+       add_custom_command(OUTPUT ${MGL_OUT}/png/${SAMPLE}.png
+               COMMAND mgl_example -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}
+               WORKING_DIRECTORY ${MGL_OUT}/png )
+       set(MGL_PNG_S ${MGL_PNG_S} ${MGL_OUT}/small/${SAMPLE}-sm.png)
+       add_custom_command(OUTPUT ${MGL_OUT}/small/${SAMPLE}-sm.png
+               COMMAND mgl_example -kind=${SAMPLE} -mini
                DEPENDS mgl_example
-               WORKING_DIRECTORY ${MGL_OUT}/pdf )
-endif(MGL_HAVE_DOC_PRC)
+               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)
 endforeach(SAMPLE)
 
 foreach(SAMPLE ${MGL_EXTRA})
@@ -76,8 +104,9 @@ 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 )
+# NOTE: direct generation of time*.texi is too slow :(
+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 ${MGL_OUT}/samples.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 ${MGL_OUT}/samples.texi )
 
 add_custom_command(OUTPUT ${MGL_OUT}/mathgl_en.info
        COMMAND ${findmi} ${MGL_TEX}/mathgl_en.texi
@@ -97,6 +126,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 +140,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 c766a1f46b8e8fef26a6ccd424f98facea703db7..4b63d2686f717d5c7e2287e9212e36e2063af26b 100644 (file)
@@ -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}).
 
@@ -198,9 +201,9 @@ MathGL have the fast variant of textual formula evaluation
 @ifclear UDAV
 (@pxref{Evaluate expression})
 @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.
+. There are a lot of functions and operators available. The operators are: @samp{+} -- addition, @samp{-} -- subtraction, @samp{*} -- multiplication, @samp{/} -- division, @samp{%} -- modulo, @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 8252f9e66e3c02b495fd46b014420f29621f8a59..ba72042125471b8609c79ccc3c92136f3b255e99 100644 (file)
@@ -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.}
@@ -196,9 +199,9 @@ MathGL имеет быстрый парсер текстовых формул
 @ifclear UDAV
 (@pxref{Evaluate expression})
 @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{+} -- сложение, @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 ec36cfb90bcb4fd8d0b2a8c082447474be190e06..312cca08d5af993be4969c368ac7815b855af986 100644 (file)
@@ -90,6 +90,46 @@ Functions and variables in this group influences on overall graphics appearance.
 Restore initial values for all of parameters and clear the image.
 @end deftypefn
 
+@anchor{setup}
+@deftypefn {MGL command} {} setup @code{val flag}
+@ifclear UDAV
+@deftypefnx {Method on @code{mglGraph}} @code{void} SetFlagAdv (@code{int} val, @code{uint32_t} flag)
+@deftypefnx {C function} @code{void} mgl_set_flag (@code{HMGL} gr, @code{int} val, @code{uint32_t} flag)
+@end ifclear
+Sets the value of internal binary @var{flag} to @var{val}. The list of flags can be found at @url{https://sourceforge.net/p/mathgl/code/HEAD/tree/mathgl-2x/include/mgl2/define.h#l267, define.h}. The current list of flags are: 
+@verbatim
+#define MGL_ENABLE_CUT         0x00000004      ///< Flag which determines how points outside bounding box are drown.
+#define MGL_ENABLE_RTEXT       0x00000008      ///< Use text rotation along axis
+#define MGL_AUTO_FACTOR                0x00000010      ///< Enable autochange PlotFactor
+#define MGL_ENABLE_ALPHA       0x00000020      ///< Flag that Alpha is used
+#define MGL_ENABLE_LIGHT       0x00000040      ///< Flag of using lightning
+#define MGL_TICKS_ROTATE       0x00000080      ///< Allow ticks rotation
+#define MGL_TICKS_SKIP         0x00000100      ///< Allow ticks rotation
+#define MGL_DISABLE_SCALE      0x00000200      ///< Temporary flag for disable scaling (used for axis)
+#define MGL_FINISHED           0x00000400      ///< Flag that final picture (i.e. mglCanvas::G) is ready
+#define MGL_USE_GMTIME         0x00000800      ///< Use gmtime instead of localtime
+#define MGL_SHOW_POS           0x00001000      ///< Switch to show or not mouse click position
+#define MGL_CLF_ON_UPD         0x00002000      ///< Clear plot before Update()
+#define MGL_NOSUBTICKS         0x00004000      ///< Disable subticks drawing (for bounding box)
+#define MGL_LOCAL_LIGHT                0x00008000      ///< Keep light sources for each inplot
+#define MGL_VECT_FRAME         0x00010000      ///< Use DrwDat to remember all data of frames
+#define MGL_REDUCEACC          0x00020000      ///< Reduce accuracy of points (to reduce size of output files)
+#define MGL_PREFERVC           0x00040000      ///< Prefer vertex color instead of texture if output format supports
+#define MGL_ONESIDED           0x00080000      ///< Render only front side of surfaces if output format supports (for debugging)
+#define MGL_NO_ORIGIN          0x00100000      ///< Don't draw tick labels at axis origin
+#define MGL_GRAY_MODE          0x00200000      ///< Convert all colors to gray ones
+#define MGL_FULL_CURV          0x00400000      ///< Disable omitting points in straight-line part(s)
+#define MGL_NO_SCALE_REL       0x00800000      ///< Disable font scaling in relative inplots
+@end verbatim
+@end deftypefn
+
+@ifclear UDAV
+@deftypefn {C function} @code{void} mgl_bsize (@code{unsigned} bsize)
+Set buffer size for number of primitives as (1<<bsize)^2. I.e. as 10^12 for bsize=20 or 4*10^9 for bsize=16 (default). NOTE: you set it only once before any plotting. The current value is returned.
+@end deftypefn
+@end ifclear
+
+
 @menu
 * Transparency::
 * Lighting::
@@ -187,7 +227,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 +334,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}
@@ -404,6 +444,15 @@ Font style for text and labels (see text). Initial style is 'fnt'=':rC' give Rom
 Sets to use or not text rotation.
 @end deftypefn
 
+@anchor{scaletext}
+@deftypefn {MGL command} {} scaletext @code{val}
+@ifclear UDAV
+@deftypefnx {Method on @code{mglGraph}} @code{void} SetScaleText (@code{bool} val)
+@deftypefnx {C function} @code{void} mgl_set_scale_text (@code{HMGL} gr, @code{int} val)
+@end ifclear
+Sets to scale text in relative @ref{inplot} (including @ref{columnplot}, @ref{gridplot}, @ref{stickplot}, @ref{shearplot}) or not.
+@end deftypefn
+
 @anchor{loadfont}
 @deftypefn {MGL command} {} loadfont ['name'='']
 @ifclear UDAV
@@ -434,11 +483,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.
@@ -489,7 +533,7 @@ Sets RGB values for color with given @var{id}. This is global setting which infl
 
 
 @anchor{gray}
-@deftypefn {MGL command} {} gray @code{val}
+@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)
@@ -507,6 +551,7 @@ Sets the gray-scale mode on/off.
 
 @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)
@@ -619,7 +664,6 @@ Get warning message(s) for global scope.
 
 @end ifclear
 
-
 @c ==================================================================
 @external{}
 @node Stop drawing, , Error handling, Graphics setup
@@ -720,19 +764,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}
@@ -783,7 +829,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}
@@ -842,10 +918,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)
@@ -872,7 +948,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
@@ -880,7 +956,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
 
@@ -898,7 +974,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)
@@ -996,13 +1072,13 @@ The line style of axis (@var{stl}), ticks (@var{tck}) and subticks (@var{sub}).
 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,
@@ -1015,16 +1091,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,
@@ -1034,6 +1110,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
 
@@ -1212,7 +1289,7 @@ Sets size of picture in pixels. This function @strong{should be} called before a
 @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}.
+Set factor for width and height in all further calls of @ref{setsize}. This command is @strong{obsolete} since v.2.4.2.
 @end deftypefn
 
 @anchor{quality}
@@ -1283,6 +1360,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})
@@ -1596,6 +1683,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)
@@ -1681,7 +1769,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}
@@ -1862,6 +1950,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
@@ -1894,7 +2012,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}]
@@ -1905,7 +2023,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}
@@ -1963,6 +2081,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;
@@ -2003,7 +2122,7 @@ color scheme (see @ref{Color scheme});
 @deftypefnx {Method on @code{mglGraph}} @code{void} Colorbar (@code{const mglDataA &}v, @code{const char *}sch=@code{""})
 @deftypefnx {C function} @code{void} mgl_colorbar_val (@code{HMGL} gr, @code{HCDT} v, @code{const char *}sch)
 @end ifclear
-The same as previous but with sharp colors @var{sch} (current palette if @code{sch=""}) for values @var{v}. @sref{ContD sample}
+The same as previous but with sharp colors @var{sch} (current palette if @code{sch=""}) for values @var{v}. @sref{contd sample}
 @end deftypefn
 
 @deftypefn {MGL command} {} colorbar 'sch' @code{x y [w=1 h=1]}
@@ -2019,7 +2138,7 @@ The same as first one but at arbitrary position of subplot @{@var{x}, @var{y}@}
 @deftypefnx {Method on @code{mglGraph}} @code{void} Colorbar (@code{const mglDataA &}v, @code{const char *}sch, @code{mreal} x, @code{mreal} y, @code{mreal} w=@code{1}, @code{mreal} h=@code{1})
 @deftypefnx {C function} @code{void} mgl_colorbar_val_ext (@code{HMGL} gr, @code{HCDT} v, @code{const char *}sch, @code{mreal} x, @code{mreal} y, @code{mreal} w, @code{mreal} h)
 @end ifclear
-The same as previous but with sharp colors @var{sch} (current palette if @code{sch=""}) for values @var{v}. @sref{ContD sample}
+The same as previous but with sharp colors @var{sch} (current palette if @code{sch=""}) for values @var{v}. @sref{contd sample}
 @end deftypefn
 
 @anchor{grid}
@@ -2035,7 +2154,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}
@@ -2069,7 +2188,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;
@@ -2160,7 +2279,7 @@ Set the number of marks in the legend. By default 1 mark is used.
 
 These functions perform plotting of 1D data. 1D means that data depended from only 1 parameter like parametric curve @{x[i],y[i],z[i]@}, i=1...n. By default (if absent) values of @var{x}[i] are equidistantly distributed in axis range, and @var{z}[i] equal to minimal z-axis value. The plots are drawn for each row if one of the data is the matrix. By any case the sizes of 1st dimension @strong{must be equal} for all arrays @code{x.nx=y.nx=z.nx}.
 
-String @var{pen} specifies the color and style of line and marks (see @ref{Line styles}). By default (@code{pen=""}) solid line with color from palette is used (see @ref{Palette and colors}). Symbol @samp{!} set to use new color from palette for each point (not for each curve, as default). String @var{opt} contain command options (see @ref{Command options}). @sref{1D samples}
+String @var{pen} specifies the color and style of line and marks (see @ref{Line styles}). By default (@code{pen=""}) solid line with color from palette is used (see @ref{Palette and colors}). Symbol @samp{!} set to use new color from palette for each point (not for each curve, as default). String @var{opt} contain command options (see @ref{Command options}).
 
 @anchor{plot}
 @deftypefn {MGL command} {} plot ydat ['stl'='']
@@ -2174,7 +2293,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}
@@ -2183,7 +2302,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}
@@ -2198,7 +2317,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}
@@ -2213,7 +2332,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}
@@ -2228,7 +2347,7 @@ These functions draw continuous lines between points @{@var{x}[i], @var{y}[i], @
 @deftypefnx {C function} @code{void} mgl_tape_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_tape_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 tapes of normals for curve between points @{@var{x}[i], @var{y}[i], @var{z}[i]@}. Initial tape(s) was selected in x-y plane (for @samp{x} in @var{pen}) and/or y-z plane (for @samp{x} in @var{pen}). The width of tape is proportional to @ref{barwidth} and can be changed by option @code{value}. See also @ref{plot}, @ref{flow}, @ref{barwidth}. @sref{Tape sample}
+These functions draw tapes of normals for curve between points @{@var{x}[i], @var{y}[i], @var{z}[i]@}. Initial tape(s) was selected in x-y plane (for @samp{x} in @var{pen}) and/or y-z plane (for @samp{x} in @var{pen}). The width of tape is proportional to @ref{barwidth} and can be changed by option @code{value}. See also @ref{plot}, @ref{flow}, @ref{barwidth}. @sref{tape sample}
 @end deftypefn
 
 @anchor{area}
@@ -2243,7 +2362,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}
@@ -2260,7 +2379,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}
@@ -2275,7 +2394,7 @@ These functions fill area between 2 curves. Dimensions of arrays @var{y1} and @v
 @deftypefnx {C function} @code{void} mgl_stem_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_stem_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 lines from points to axis plane. See also @ref{area}, @ref{bars}, @ref{plot}, @ref{mark}. @sref{Stem sample}
+These functions draw vertical lines from points to axis plane. See also @ref{area}, @ref{bars}, @ref{plot}, @ref{mark}. @sref{stem sample}
 @end deftypefn
 
 @anchor{bars}
@@ -2290,7 +2409,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}
@@ -2302,7 +2432,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}
@@ -2330,7 +2471,7 @@ These functions draw cones from points to axis plane. If string contain symbol @
 @item
 @samp{<}, @samp{^} or @samp{>} for aligning boxes left, right or centering them at its x-coordinates.
 @end itemize
-See also @ref{bars}, @ref{cone}, @ref{barwidth}. @sref{Cones sample}
+See also @ref{bars}, @ref{cone}, @ref{barwidth}. @sref{cones sample}
 @end deftypefn
 
 
@@ -2341,7 +2482,7 @@ See also @ref{bars}, @ref{cone}, @ref{barwidth}. @sref{Cones sample}
 @deftypefnx {Method on @code{mglGraph}} @code{void} Chart (@code{const mglDataA &}a, @code{const char *}col=@code{""}, @code{const char *}opt=@code{""})
 @deftypefnx {C function} @code{void} mgl_chart (@code{HMGL} gr, @code{HCDT} a, @code{const char *}col, @code{const char *}opt)
 @end ifclear
-The function draws colored stripes (boxes) for data in array @var{a}. The number of stripes is equal to the number of rows in @var{a} (equal to @var{a.ny}). The color of each next stripe is cyclically changed from colors specified in string @var{col} or in palette Pal (see @ref{Palette and colors}). Spaces in colors denote transparent ``color'' (i.e. corresponding stripe(s) are not drawn). The stripe width is proportional to value of element in @var{a}. Chart is plotted only for data with non-negative elements. If string @var{col} have symbol @samp{#} then black border lines are drawn. The most nice form the chart have in 3d (after rotation of coordinates) or in cylindrical coordinates (becomes so called Pie chart). @sref{Chart sample}
+The function draws colored stripes (boxes) for data in array @var{a}. The number of stripes is equal to the number of rows in @var{a} (equal to @var{a.ny}). The color of each next stripe is cyclically changed from colors specified in string @var{col} or in palette Pal (see @ref{Palette and colors}). Spaces in colors denote transparent ``color'' (i.e. corresponding stripe(s) are not drawn). The stripe width is proportional to value of element in @var{a}. Chart is plotted only for data with non-negative elements. If string @var{col} have symbol @samp{#} then black border lines are drawn. The most nice form the chart have in 3d (after rotation of coordinates) or in cylindrical coordinates (becomes so called Pie chart). @sref{chart sample}
 @end deftypefn
 
 @anchor{boxplot}
@@ -2353,7 +2494,7 @@ The function draws colored stripes (boxes) for data in array @var{a}. The number
 @deftypefnx {C function} @code{void} mgl_boxplot (@code{HMGL} gr, @code{HCDT} a, @code{const char *}pen, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_boxplot_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} a, @code{const char *}pen, @code{const char *}opt)
 @end ifclear
-These functions draw boxplot (also known as a box-and-whisker diagram) at points @var{x}[i]. This is five-number summaries of data @var{a}[i,j] (minimum, lower quartile (Q1), median (Q2), upper quartile (Q3) and maximum) along second (j-th) direction. If @var{pen} contain @samp{<}, @samp{^} or @samp{>} then boxes will be aligned left, right or centered at its x-coordinates. See also @ref{plot}, @ref{error}, @ref{bars}, @ref{barwidth}. @sref{BoxPlot sample}
+These functions draw boxplot (also known as a box-and-whisker diagram) at points @var{x}[i]. This is five-number summaries of data @var{a}[i,j] (minimum, lower quartile (Q1), median (Q2), upper quartile (Q3) and maximum) along second (j-th) direction. If @var{pen} contain @samp{<}, @samp{^} or @samp{>} then boxes will be aligned left, right or centered at its x-coordinates. See also @ref{plot}, @ref{error}, @ref{bars}, @ref{barwidth}. @sref{boxplot sample}
 @end deftypefn
 
 @anchor{candle}
@@ -2372,7 +2513,7 @@ These functions draw boxplot (also known as a box-and-whisker diagram) at points
 @deftypefnx {C function} @code{void} mgl_candle_yv (@code{HMGL} gr, @code{HCDT} v1, @code{HCDT} v2, @code{HCDT} y1, @code{HCDT} y2, @code{const char *}pen, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_candle_xyv (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} v1, @code{HCDT} v2, @code{HCDT} y1, @code{HCDT} y2, @code{const char *}pen, @code{const char *}opt)
 @end ifclear
-These functions draw candlestick chart at points @var{x}[i]. This is a combination of a line-chart and a bar-chart, in that each bar represents the range of price movement over a given time interval. Wire (or white) candle correspond to price growth @var{v1}[i]<@var{v2}[i], opposite case -- solid (or dark) candle. You can give different colors for growth and decrease values if number of specified colors is equal to 2. If @var{pen} contain @samp{#} then the wire candle will be used even for 2-color scheme. "Shadows" show the minimal @var{y1} and maximal @var{y2} prices. If @var{v2} is absent then it is determined as @var{v2}[i]=@var{v1}[i+1]. See also @ref{plot}, @ref{bars}, @ref{ohlc}, @ref{barwidth}. @sref{Candle sample}
+These functions draw candlestick chart at points @var{x}[i]. This is a combination of a line-chart and a bar-chart, in that each bar represents the range of price movement over a given time interval. Wire (or white) candle correspond to price growth @var{v1}[i]<@var{v2}[i], opposite case -- solid (or dark) candle. You can give different colors for growth and decrease values if number of specified colors is equal to 2. If @var{pen} contain @samp{#} then the wire candle will be used even for 2-color scheme. "Shadows" show the minimal @var{y1} and maximal @var{y2} prices. If @var{v2} is absent then it is determined as @var{v2}[i]=@var{v1}[i+1]. See also @ref{plot}, @ref{bars}, @ref{ohlc}, @ref{barwidth}. @sref{candle sample}
 @end deftypefn
 
 @anchor{ohlc}
@@ -2384,7 +2525,7 @@ These functions draw candlestick chart at points @var{x}[i]. This is a combinati
 @deftypefnx {C function} @code{void} mgl_ohlc (@code{HMGL} gr, @code{HCDT} o, @code{HCDT} h, @code{HCDT} l, @code{HCDT} c, @code{const char *}pen, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_ohlc_x (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} o, @code{HCDT} h, @code{HCDT} l, @code{HCDT} c, @code{const char *}pen, @code{const char *}opt)
 @end ifclear
-These functions draw Open-High-Low-Close diagram. This diagram show vertical line for between maximal(high @var{h}) and minimal(low @var{l}) values, as well as horizontal lines before/after vertical line for initial(open @var{o})/final(close @var{c}) values of some process (usually price). You can give different colors for up and down values (when closing values higher or not as in previous point) if number of specified colors is equal to 2*number of curves. See also @ref{candle}, @ref{plot}, @ref{barwidth}. @sref{OHLC sample}
+These functions draw Open-High-Low-Close diagram. This diagram show vertical line for between maximal(high @var{h}) and minimal(low @var{l}) values, as well as horizontal lines before/after vertical line for initial(open @var{o})/final(close @var{c}) values of some process (usually price). You can give different colors for up and down values (when closing values higher or not as in previous point) if number of specified colors is equal to 2*number of curves. See also @ref{candle}, @ref{plot}, @ref{barwidth}. @sref{ohlc sample}
 @end deftypefn
 
 
@@ -2400,7 +2541,7 @@ These functions draw Open-High-Low-Close diagram. This diagram show vertical lin
 @deftypefnx {C function} @code{void} mgl_error_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ey, @code{const char *}pen, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_error_exy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ex, @code{HCDT} ey, @code{const char *}pen, @code{const char *}opt)
 @end ifclear
-These functions draw error boxes @{@var{ex}[i], @var{ey}[i]@} at points @{@var{x}[i], @var{y}[i]@}. This can be useful, for example, in experimental points, or to show numeric error or some estimations and so on. If string @var{pen} contain symbol @samp{@@} than large semitransparent mark is used instead of error box. See also @ref{plot}, @ref{mark}. @sref{Error sample}
+These functions draw error boxes @{@var{ex}[i], @var{ey}[i]@} at points @{@var{x}[i], @var{y}[i]@}. This can be useful, for example, in experimental points, or to show numeric error or some estimations and so on. If string @var{pen} contain symbol @samp{@@} than large semitransparent mark is used instead of error box. See also @ref{plot}, @ref{mark}. @sref{error sample}
 @end deftypefn
 
 @anchor{mark}
@@ -2415,7 +2556,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}
@@ -2441,7 +2582,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}
@@ -2464,7 +2605,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;
@@ -2472,7 +2613,7 @@ These functions draw string @var{txt} at points @{@var{x}[i], @var{y}[i], @var{z
 @item @samp{-} for printing usual @samp{-};
 @item @samp{0123456789} for precision at printing numbers.
 @end itemize
-See also @ref{plot}, @ref{mark}, @ref{textmark}, @ref{table}. @sref{Label sample}
+See also @ref{plot}, @ref{mark}, @ref{textmark}, @ref{table}. @sref{label sample}
 @end deftypefn
 
 @anchor{table}
@@ -2488,7 +2629,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;
@@ -2499,7 +2640,23 @@ These functions draw table with values of @var{val} and captions from string @va
 @item @samp{-} for printing usual @samp{-};
 @item @samp{0123456789} for precision at printing numbers.
 @end itemize
-Option @code{value} set the width of the table (default is 1). See also @ref{plot}, @ref{label}. @sref{Table sample}
+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}
@@ -2523,7 +2680,7 @@ Option @code{value} set the width of the table (default is 1). See also @ref{plo
 @deftypefnx {C function} @code{void} mgl_tube_xyzr (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} r, @code{const char *}pen, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_tube_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{mreal} r, @code{const char *}pen, @code{const char *}opt)
 @end ifclear
-These functions draw the tube with variable radius @var{r}[i] along the curve between points @{@var{x}[i], @var{y}[i], @var{z}[i]@}. See also @ref{plot}. @sref{Tube sample}
+These functions draw the tube with variable radius @var{r}[i] along the curve between points @{@var{x}[i], @var{y}[i], @var{z}[i]@}. Option @code{value} set the number of segments at cross-section (default is 25). See also @ref{plot}. @sref{tube sample}
 @end deftypefn
 
 @anchor{torus}
@@ -2532,7 +2689,7 @@ These functions draw the tube with variable radius @var{r}[i] along the curve be
 @deftypefnx {Method on @code{mglGraph}} @code{void} Torus (@code{const mglDataA &}r, @code{const mglDataA &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""})
 @deftypefnx {C function} @code{void} mgl_torus (@code{HMGL} gr, @code{HCDT} r, @code{HCDT} z, @code{const char *}pen, @code{const char *}opt)
 @end ifclear
-These functions draw surface which is result of curve @{@var{r}, @var{z}@} rotation around axis. If string @var{pen} contain symbols @samp{x} or @samp{z} then rotation axis will be set to specified direction (default is @samp{y}). If string @var{pen} have symbol @samp{#} then wire plot is produced. If string @var{pen} have symbol @samp{.} then plot by dots is produced. See also @ref{plot}, @ref{axial}. @sref{Torus sample}
+These functions draw surface which is result of curve @{@var{r}, @var{z}@} rotation around axis. If string @var{pen} contain symbols @samp{x} or @samp{z} then rotation axis will be set to specified direction (default is @samp{y}). If string @var{pen} have symbol @samp{#} then wire plot is produced. If string @var{pen} have symbol @samp{.} then plot by dots is produced. See also @ref{plot}, @ref{axial}. @sref{torus sample}
 @end deftypefn
 
 @anchor{lamerey}
@@ -2544,7 +2701,7 @@ These functions draw surface which is result of curve @{@var{r}, @var{z}@} rotat
 @deftypefnx {C function} @code{void} mgl_lamerey_dat (@code{HMGL} gr, @code{double} x0, @code{HCDT} y, @code{const char *}stl, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_lamerey_str (@code{HMGL} gr, @code{double} x0, @code{const char *}y, @code{const char *}stl, @code{const char *}opt)
 @end ifclear
-These functions draw Lamerey diagram for mapping x_new = y(x_old) starting from point @var{x0}. String @var{stl} may contain line style, symbol @samp{v} for drawing arrows, symbol @samp{~} for disabling first segment. Option @code{value} set the number of segments to be drawn (default is 20). See also @ref{plot}, @ref{fplot}, @ref{bifurcation}, @ref{pmap}. @sref{Lamerey sample}
+These functions draw Lamerey diagram for mapping x_new = y(x_old) starting from point @var{x0}. String @var{stl} may contain line style, symbol @samp{v} for drawing arrows, symbol @samp{~} for disabling first segment. Option @code{value} set the number of segments to be drawn (default is 20). See also @ref{plot}, @ref{fplot}, @ref{bifurcation}, @ref{pmap}. @sref{lamerey sample}
 @end deftypefn
 
 @anchor{bifurcation}
@@ -2556,7 +2713,7 @@ These functions draw Lamerey diagram for mapping x_new = y(x_old) starting from
 @deftypefnx {C function} @code{void} mgl_bifurcation_dat (@code{HMGL} gr, @code{double} dx, @code{HCDT} y, @code{const char *}stl, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_bifurcation_str (@code{HMGL} gr, @code{double} dx, @code{const char *}y, @code{const char *}stl, @code{const char *}opt)
 @end ifclear
-These functions draw bifurcation diagram for mapping x_new = y(x_old). Parameter @var{dx} set the accuracy along x-direction. String @var{stl} set color. Option @code{value} set the number of stationary points (default is 1024). See also @ref{plot}, @ref{fplot}, @ref{lamerey}. @sref{Bifurcation sample}
+These functions draw bifurcation diagram for mapping x_new = y(x_old). Parameter @var{dx} set the accuracy along x-direction. String @var{stl} set color. Option @code{value} set the number of stationary points (default is 1024). See also @ref{plot}, @ref{fplot}, @ref{lamerey}. @sref{bifurcation sample}
 @end deftypefn
 
 @anchor{pmap}
@@ -2571,7 +2728,7 @@ These functions draw bifurcation diagram for mapping x_new = y(x_old). Parameter
 @deftypefnx {C function} @code{void} mgl_pmap_xy (@code{HMGL} gr, @code{HCDT} x, @code{HMDT} y, @code{HCDT} s, @code{const char *}stl, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_pmap_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HMDT} y, @code{HCDT} z, @code{HCDT} s, @code{const char *}stl, @code{const char *}opt)
 @end ifclear
-These functions draw Poincare map for curve @{@var{x}, @var{y}, @var{z}@} at surface @var{s}=0. Basically, it show intersections of the curve and the surface. String @var{stl} set the style of marks. See also @ref{plot}, @ref{mark}, @ref{lamerey}. @sref{Pmap sample}
+These functions draw Poincare map for curve @{@var{x}, @var{y}, @var{z}@} at surface @var{s}=0. Basically, it show intersections of the curve and the surface. String @var{stl} set the style of marks. See also @ref{plot}, @ref{mark}, @ref{lamerey}. @sref{pmap sample}
 @end deftypefn
 
 
@@ -2594,7 +2751,7 @@ These functions draw Poincare map for curve @{@var{x}, @var{y}, @var{z}@} at sur
 @cindex Grad
 @cindex Grid
 
-These functions perform plotting of 2D data. 2D means that data depend from 2 independent parameters like matrix @math{f(x_i,y_j), i=1...n, j=1...m}.  By default (if absent) values of @var{x}, @var{y} are equidistantly distributed in axis range. The plots are drawn for each z slice of the data. The minor dimensions of arrays @var{x}, @var{y}, @var{z} should be equal @code{x.nx=z.nx && y.nx=z.ny} or @code{x.nx=y.nx=z.nx && x.ny=y.ny=z.ny}. Arrays @var{x} and @var{y} can be vectors (not matrices as @var{z}). String @var{sch} sets the color scheme (see @ref{Color scheme}) for plot. String @var{opt} contain command options (see @ref{Command options}). @sref{2D samples}
+These functions perform plotting of 2D data. 2D means that data depend from 2 independent parameters like matrix @math{f(x_i,y_j), i=1...n, j=1...m}.  By default (if absent) values of @var{x}, @var{y} are equidistantly distributed in axis range. The plots are drawn for each z slice of the data. The minor dimensions of arrays @var{x}, @var{y}, @var{z} should be equal @code{x.nx=z.nx && y.nx=z.ny} or @code{x.nx=y.nx=z.nx && x.ny=y.ny=z.ny}. Arrays @var{x} and @var{y} can be vectors (not matrices as @var{z}). String @var{sch} sets the color scheme (see @ref{Color scheme}) for plot. String @var{opt} contain command options (see @ref{Command options}).
 
 @anchor{surf}
 @deftypefn {MGL command} {} surf zdat ['sch'='']
@@ -2605,7 +2762,7 @@ These functions perform plotting of 2D data. 2D means that data depend from 2 in
 @deftypefnx {C function} @code{void} mgl_surf (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_surf_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 surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[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. See also @ref{mesh}, @ref{dens}, @ref{belt}, @ref{tile}, @ref{boxs}, @ref{surfc}, @ref{surfa}. @sref{Surf sample}
+The function draws surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[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. See also @ref{mesh}, @ref{dens}, @ref{belt}, @ref{tile}, @ref{boxs}, @ref{surfc}, @ref{surfa}. @sref{surf sample}
 @end deftypefn
 
 @anchor{mesh}
@@ -2617,7 +2774,7 @@ The function draws surface specified parametrically @{@var{x}[i,j], @var{y}[i,j]
 @deftypefnx {C function} @code{void} mgl_mesh (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_mesh_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 mesh lines for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. See also @ref{surf}, @ref{fall}, @ref{meshnum}, @ref{cont}, @ref{tens}. @sref{Mesh sample}
+The function draws mesh lines for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. See also @ref{surf}, @ref{fall}, @ref{meshnum}, @ref{cont}, @ref{tens}. @sref{mesh sample}
 @end deftypefn
 
 @anchor{fall}
@@ -2629,7 +2786,7 @@ The function draws mesh lines for surface specified parametrically @{@var{x}[i,j
 @deftypefnx {C function} @code{void} mgl_fall (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_fall_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 fall lines for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. This plot can be used for plotting several curves shifted in depth one from another. If @var{sch} contain @samp{x} then lines are drawn along x-direction else (by default) lines are drawn along y-direction. See also @ref{belt}, @ref{mesh}, @ref{tens}, @ref{meshnum}. @sref{Fall sample}
+The function draws fall lines for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. This plot can be used for plotting several curves shifted in depth one from another. If @var{sch} contain @samp{x} then lines are drawn along x-direction else (by default) lines are drawn along y-direction. See also @ref{belt}, @ref{mesh}, @ref{tens}, @ref{meshnum}. @sref{fall sample}
 @end deftypefn
 
 @anchor{belt}
@@ -2641,7 +2798,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}
@@ -2653,19 +2810,22 @@ The function draws belts for surface specified parametrically @{@var{x}[i,j], @v
 @deftypefnx {C function} @code{void} mgl_boxs (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_boxs_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 vertical boxes for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. Symbol @samp{@@} in @var{sch} set to draw filled boxes. See also @ref{surf}, @ref{dens}, @ref{tile}, @ref{step}. @sref{Boxs sample}
+The function draws vertical boxes for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. Symbol @samp{@@} in @var{sch} set to draw filled boxes. See also @ref{surf}, @ref{dens}, @ref{tile}, @ref{step}. @sref{boxs sample}
 @end deftypefn
 
 @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}
@@ -2677,7 +2837,7 @@ The function draws horizontal tiles for surface specified parametrically @{@var{
 @deftypefnx {C function} @code{void} mgl_dens (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_dens_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 density plot for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} at @var{z} equal to minimal z-axis value. 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. See also @ref{surf}, @ref{cont}, @ref{contf}, @ref{boxs}, @ref{tile}, @code{dens[xyz]}. @sref{Dens sample}
+The function draws density plot for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} at @var{z} equal to minimal z-axis value. 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. See also @ref{surf}, @ref{cont}, @ref{contf}, @ref{boxs}, @ref{tile}, @code{dens[xyz]}. @sref{dens sample}
 @end deftypefn
 
 @anchor{cont}
@@ -2686,10 +2846,10 @@ 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}
+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}
 @end deftypefn
 
 @deftypefn {MGL command} {} cont zdat ['sch'='']
@@ -2700,7 +2860,7 @@ The function draws contour lines for surface specified parametrically @{@var{x}[
 @deftypefnx {C function} @code{void} mgl_cont (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_cont_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @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).
+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). If string @var{sch} contain symbol @samp{.} then only contours at levels with saddle points will be drawn.
 @end deftypefn
 
 @anchor{contf}
@@ -2712,7 +2872,7 @@ The same as previous with vector @var{v} of @var{num}-th elements equidistantly
 @deftypefnx {C function} @code{void} mgl_contf_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_contf_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 solid (or filled) 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} (must be @code{v.nx>2}). See also @ref{dens}, @ref{cont}, @ref{contd}, @code{contf[xyz]}. @sref{ContF sample}
+The function draws solid (or filled) 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} (must be @code{v.nx>2}). See also @ref{dens}, @ref{cont}, @ref{contd}, @code{contf[xyz]}. @sref{contf sample}
 @end deftypefn
 
 @deftypefn {MGL command} {} contf zdat ['sch'='']
@@ -2735,7 +2895,7 @@ The same as previous with vector @var{v} of @var{num}-th elements equidistantly
 @deftypefnx {C function} @code{void} mgl_contd_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_contd_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 solid (or filled) 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{_}) with manual colors. Contours are plotted for @var{z}[i,j]=@var{v}[k] where @var{v}[k] are values of data array @var{v} (must be @code{v.nx>2}). String @var{sch} sets the contour colors: the color of k-th contour is determined by character @code{sch[k%strlen(sch)]}. See also @ref{dens}, @ref{cont}, @ref{contf}. @sref{ContD sample}
+The function draws solid (or filled) 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{_}) with manual colors. Contours are plotted for @var{z}[i,j]=@var{v}[k] where @var{v}[k] are values of data array @var{v} (must be @code{v.nx>2}). String @var{sch} sets the contour colors: the color of k-th contour is determined by character @code{sch[k%strlen(sch)]}. See also @ref{dens}, @ref{cont}, @ref{contf}. @sref{contd sample}
 @end deftypefn
 
 @deftypefn {MGL command} {} contd zdat ['sch'='']
@@ -2749,6 +2909,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{contp 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'='']
@@ -2758,7 +2936,7 @@ The same as previous with vector @var{v} of @var{num}-th elements equidistantly
 @deftypefnx {C function} @code{void} mgl_contv_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_contv_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 vertical cylinder (tube) at 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}. See also @ref{cont}, @ref{contf}. @sref{ContV sample}
+The function draws vertical cylinder (tube) at 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}. See also @ref{cont}, @ref{contf}. @sref{contv sample}
 @end deftypefn
 
 @deftypefn {MGL command} {} contv zdat ['sch'='']
@@ -2781,7 +2959,7 @@ The same as previous with vector @var{v} of @var{num}-th elements equidistantly
 @deftypefnx {C function} @code{void} mgl_axial_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_axial_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 surface which is result of contour plot rotation for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. 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{#} then wire plot is produced. If string @var{sch} have symbol @samp{.} then plot by dots is produced. If string contain symbols @samp{x} or @samp{z} then rotation axis will be set to specified direction (default is @samp{y}). See also @ref{cont}, @ref{contf}, @ref{torus}, @ref{surf3}. @sref{Axial sample}
+The function draws surface which is result of contour plot rotation for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. 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{#} then wire plot is produced. If string @var{sch} have symbol @samp{.} then plot by dots is produced. If string contain symbols @samp{x} or @samp{z} then rotation axis will be set to specified direction (default is @samp{y}). See also @ref{cont}, @ref{contf}, @ref{torus}, @ref{surf3}. @sref{axial sample}
 @end deftypefn
 
 @deftypefn {MGL command} {} axial zdat ['sch'='']
@@ -2821,7 +2999,7 @@ The function draws grid lines for density plot of surface specified parametrical
 @cindex Cloud
 @cindex Beam
 
-These functions perform plotting of 3D data. 3D means that data depend from 3 independent parameters like matrix @math{f(x_i,y_j,z_k), i=1...n, j=1...m, k=1...l}. By default (if absent) values of @var{x}, @var{y}, @var{z} are equidistantly distributed in axis range. The minor dimensions of arrays @var{x}, @var{y}, @var{z}, @var{a} should be equal @code{x.nx=a.nx && y.nx=a.ny && z.nz=a.nz} or @code{x.nx=y.nx=z.nx=a.nx && x.ny=y.ny=z.ny=a.ny && x.nz=y.nz=z.nz=a.nz}. Arrays @var{x}, @var{y} and @var{z} can be vectors (not matrices as @var{a}). String @var{sch} sets the color scheme (see @ref{Color scheme}) for plot. String @var{opt} contain command options (see @ref{Command options}). @sref{3D samples}
+These functions perform plotting of 3D data. 3D means that data depend from 3 independent parameters like matrix @math{f(x_i,y_j,z_k), i=1...n, j=1...m, k=1...l}. By default (if absent) values of @var{x}, @var{y}, @var{z} are equidistantly distributed in axis range. The minor dimensions of arrays @var{x}, @var{y}, @var{z}, @var{a} should be equal @code{x.nx=a.nx && y.nx=a.ny && z.nz=a.nz} or @code{x.nx=y.nx=z.nx=a.nx && x.ny=y.ny=z.ny=a.ny && x.nz=y.nz=z.nz=a.nz}. Arrays @var{x}, @var{y} and @var{z} can be vectors (not matrices as @var{a}). String @var{sch} sets the color scheme (see @ref{Color scheme}) for plot. String @var{opt} contain command options (see @ref{Command options}).
 
 @anchor{surf3}
 @deftypefn {MGL command} {} surf3 adat @code{val} ['sch'='']
@@ -2832,7 +3010,7 @@ These functions perform plotting of 3D data. 3D means that data depend from 3 in
 @deftypefnx {C function} @code{void} mgl_surf3_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_surf3_xyz_val (@code{HMGL} gr, @code{mreal} val, @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 isosurface plot for 3d array specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) at @var{a}(x,y,z)=@var{val}. If string contain @samp{#} then wire plot is produced. If string @var{sch} have symbol @samp{.} then plot by dots is produced. Note, that there is possibility of incorrect plotting due to uncertainty of cross-section defining if there are two or more isosurface intersections inside one cell. See also @ref{cloud}, @ref{dens3}, @ref{surf3c}, @ref{surf3a}, @ref{axial}. @sref{Surf3 sample}
+The function draws isosurface plot for 3d array specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) at @var{a}(x,y,z)=@var{val}. If string contain @samp{#} then wire plot is produced. If string @var{sch} have symbol @samp{.} then plot by dots is produced. Note, that there is possibility of incorrect plotting due to uncertainty of cross-section defining if there are two or more isosurface intersections inside one cell. See also @ref{cloud}, @ref{dens3}, @ref{surf3c}, @ref{surf3a}, @ref{axial}. @sref{surf3 sample}
 @end deftypefn
 
 @deftypefn {MGL command} {} surf3 adat ['sch'='']
@@ -2855,7 +3033,7 @@ Draws @var{num}-th uniformly distributed in color range isosurfaces for 3d data.
 @deftypefnx {C function} @code{void} mgl_cloud (@code{HMGL} gr, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_cloud_xyz (@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 function draws cloud plot for 3d data specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]). This plot is a set of cubes with color and transparency proportional to value of @var{a}. The resulting plot is like cloud -- low value is transparent but higher ones are not. The number of plotting cells depend on @ref{meshnum}. If string @var{sch} contain symbol @samp{.} then lower quality plot will produced with much low memory usage. If string @var{sch} contain symbol @samp{i} then transparency will be inversed, i.e. higher become transparent and lower become not transparent. See also @ref{surf3}, @ref{meshnum}. @sref{Cloud sample}
+The function draws cloud plot for 3d data specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]). This plot is a set of cubes with color and transparency proportional to value of @var{a}. The resulting plot is like cloud -- low value is transparent but higher ones are not. The number of plotting cells depend on @ref{meshnum}. If string @var{sch} contain symbol @samp{.} then lower quality plot will produced with much low memory usage. If string @var{sch} contain symbol @samp{i} then transparency will be inversed, i.e. higher become transparent and lower become not transparent. See also @ref{surf3}, @ref{meshnum}. @sref{cloud sample}
 @end deftypefn
 
 @anchor{dens3}
@@ -2867,7 +3045,7 @@ The function draws cloud plot for 3d data specified parametrically @var{a}[i,j,k
 @deftypefnx {C function} @code{void} mgl_dens3 (@code{HMGL} gr, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_dens3_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt)
 @end ifclear
-The function draws density plot for 3d data specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]). Density is plotted at slice @var{sVal} in direction @{@samp{x}, @samp{y}, @samp{z}@} if @var{sch} contain corresponding symbol (by default, @samp{y} direction is used). If string @var{stl} have symbol @samp{#} then grid lines are drawn. See also @ref{cont3}, @ref{contf3}, @ref{dens}, @ref{grid3}. @sref{Dens3 sample}
+The function draws density plot for 3d data specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]). Density is plotted at slice @var{sVal} in direction @{@samp{x}, @samp{y}, @samp{z}@} if @var{sch} contain corresponding symbol (by default, @samp{y} direction is used). If string @var{stl} have symbol @samp{#} then grid lines are drawn. See also @ref{cont3}, @ref{contf3}, @ref{dens}, @ref{grid3}. @sref{dens3 sample}
 @end deftypefn
 
 @anchor{cont3}
@@ -2879,7 +3057,7 @@ The function draws density plot for 3d data specified parametrically @var{a}[i,j
 @deftypefnx {C function} @code{void} mgl_cont3_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_cont3_xyz_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt)
 @end ifclear
-The function draws contour plot for 3d data specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]). Contours are plotted for values specified in array @var{v} at slice @var{sVal} in direction @{@samp{x}, @samp{y}, @samp{z}@} if @var{sch} contain corresponding symbol (by default, @samp{y} direction is used). If string @var{sch} have symbol @samp{#} then grid lines are drawn. If string @var{sch} have symbol @samp{t} or @samp{T} then contour labels will be drawn below (or above) the contours. See also @ref{dens3}, @ref{contf3}, @ref{cont}, @ref{grid3}. @sref{Cont3 sample}
+The function draws contour plot for 3d data specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]). Contours are plotted for values specified in array @var{v} at slice @var{sVal} in direction @{@samp{x}, @samp{y}, @samp{z}@} if @var{sch} contain corresponding symbol (by default, @samp{y} direction is used). If string @var{sch} have symbol @samp{#} then grid lines are drawn. If string @var{sch} have symbol @samp{t} or @samp{T} then contour labels will be drawn below (or above) the contours. See also @ref{dens3}, @ref{contf3}, @ref{cont}, @ref{grid3}. @sref{cont3 sample}
 @end deftypefn
 
 @deftypefn {MGL command} {} cont3 adat ['sch'='' @code{sval=-1}]
@@ -2902,7 +3080,7 @@ The same as previous with vector @var{v} of @var{num}-th elements equidistantly
 @deftypefnx {C function} @code{void} mgl_contf3_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_contf3_xyz_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt)
 @end ifclear
-The function draws solid (or filled) contour plot for 3d data specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]). Contours are plotted for values specified in array @var{v} at slice @var{sVal} in direction @{@samp{x}, @samp{y}, @samp{z}@} if @var{sch} contain corresponding symbol (by default, @samp{y} direction is used). If string @var{sch} have symbol @samp{#} then grid lines are drawn. See also @ref{dens3}, @ref{cont3}, @ref{contf}, @ref{grid3}. @sref{ContF3 sample}
+The function draws solid (or filled) contour plot for 3d data specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]). Contours are plotted for values specified in array @var{v} at slice @var{sVal} in direction @{@samp{x}, @samp{y}, @samp{z}@} if @var{sch} contain corresponding symbol (by default, @samp{y} direction is used). If string @var{sch} have symbol @samp{#} then grid lines are drawn. See also @ref{dens3}, @ref{cont3}, @ref{contf}, @ref{grid3}. @sref{contf3 sample}
 @end deftypefn
 
 @deftypefn {MGL command} {} contf3 adat ['sch'='' @code{sval=-1}]
@@ -2964,9 +3142,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'='']
@@ -2976,7 +3169,7 @@ The function draws surface specified parametrically @{@var{x}[i,j], @var{y}[i,j]
 @deftypefnx {C function} @code{void} mgl_surf3c_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_surf3c_xyz_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt)
 @end ifclear
-The function draws isosurface plot for 3d array specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) at @var{a}(x,y,z)=@var{val}. It is mostly the same as @ref{surf3} function but the color of isosurface depends on values of array @var{c}. If string @var{sch} contain @samp{#} then wire plot is produced. If string @var{sch} have symbol @samp{.} then plot by dots is produced. See also @ref{surf3}, @ref{surfc}, @ref{surf3a}, @ref{surf3ca}. @sref{Surf3C sample}
+The function draws isosurface plot for 3d array specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) at @var{a}(x,y,z)=@var{val}. It is mostly the same as @ref{surf3} function but the color of isosurface depends on values of array @var{c}. If string @var{sch} contain @samp{#} then wire plot is produced. If string @var{sch} have symbol @samp{.} then plot by dots is produced. See also @ref{surf3}, @ref{surfc}, @ref{surf3a}, @ref{surf3ca}. @sref{surf3c sample}
 @end deftypefn
 
 @deftypefn {MGL command} {} surf3c adat cdat ['sch'='']
@@ -3000,7 +3193,7 @@ Draws @var{num}-th uniformly distributed in color range isosurfaces for 3d data.
 @deftypefnx {C function} @code{void} mgl_surfa (@code{HMGL} gr, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_surfa_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 transparent 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{surfc}, @ref{surfca}, @ref{surf3a}. @sref{SurfA sample}
+The function draws surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} and transparent 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{surfc}, @ref{surfca}, @ref{surf3a}. @sref{surfa sample}
 @end deftypefn
 
 @anchor{surf3a}
@@ -3012,7 +3205,7 @@ The function draws surface specified parametrically @{@var{x}[i,j], @var{y}[i,j]
 @deftypefnx {C function} @code{void} mgl_surf3a_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_surf3a_xyz_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt)
 @end ifclear
-The function draws isosurface plot for 3d array specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) at @var{a}(x,y,z)=@var{val}. It is mostly the same as @ref{surf3} function but the transparency of isosurface depends on values of array @var{c}. If string @var{sch} contain @samp{#} then wire plot is produced. If string @var{sch} have symbol @samp{.} then plot by dots is produced. See also @ref{surf3}, @ref{surfc}, @ref{surf3a}, @ref{surf3ca}. @sref{Surf3A sample}
+The function draws isosurface plot for 3d array specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) at @var{a}(x,y,z)=@var{val}. It is mostly the same as @ref{surf3} function but the transparency of isosurface depends on values of array @var{c}. If string @var{sch} contain @samp{#} then wire plot is produced. If string @var{sch} have symbol @samp{.} then plot by dots is produced. See also @ref{surf3}, @ref{surfc}, @ref{surf3a}, @ref{surf3ca}. @sref{surf3a sample}
 @end deftypefn
 
 @deftypefn {MGL command} {} surf3a adat cdat ['sch'='']
@@ -3037,7 +3230,7 @@ Draws @var{num}-th uniformly distributed in color range isosurfaces for 3d data.
 @deftypefnx {C function} @code{void} mgl_surfca (@code{HMGL} gr, @code{HCDT} z, @code{HCDT} c, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_surfca_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{HCDT} a, @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]@}, color it by matrix @var{c}[i,j] and transparent it by matrix @var{a}[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. Note, you can use @ref{map}-like coloring if use @samp{%} in color scheme. See also @ref{surf}, @ref{surfc}, @ref{surfa}, @ref{surf3ca}. @sref{SurfCA sample}
+The function draws surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}, color it by matrix @var{c}[i,j] and transparent it by matrix @var{a}[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. Note, you can use @ref{map}-like coloring if use @samp{%} in color scheme. See also @ref{surf}, @ref{surfc}, @ref{surfa}, @ref{surf3ca}. @sref{surfca sample}
 @end deftypefn
 
 @anchor{surf3ca}
@@ -3049,7 +3242,7 @@ The function draws surface specified parametrically @{@var{x}[i,j], @var{y}[i,j]
 @deftypefnx {C function} @code{void} mgl_surf3ca_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} a, @code{HCDT} c, @code{HCDT} b, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_surf3ca_xyz_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{HCDT} c, @code{HCDT} b,@code{const char *}sch, @code{const char *}opt)
 @end ifclear
-The function draws isosurface plot for 3d array specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) at @var{a}(x,y,z)=@var{val}. It is mostly the same as @ref{surf3} function but the color and the transparency of isosurface depends on values of array @var{c} and @var{b} correspondingly. If string @var{sch} contain @samp{#} then wire plot is produced. If string @var{sch} have symbol @samp{.} then plot by dots is produced. Note, you can use @ref{map}-like coloring if use @samp{%} in color scheme. See also @ref{surf3}, @ref{surfca}, @ref{surf3c}, @ref{surf3a}. @sref{Surf3CA sample}
+The function draws isosurface plot for 3d array specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) at @var{a}(x,y,z)=@var{val}. It is mostly the same as @ref{surf3} function but the color and the transparency of isosurface depends on values of array @var{c} and @var{b} correspondingly. If string @var{sch} contain @samp{#} then wire plot is produced. If string @var{sch} have symbol @samp{.} then plot by dots is produced. Note, you can use @ref{map}-like coloring if use @samp{%} in color scheme. See also @ref{surf3}, @ref{surfca}, @ref{surf3c}, @ref{surf3a}. @sref{surf3ca sample}
 @end deftypefn
 
 @deftypefn {MGL command} {} surf3ca adat cdat bdat ['sch'='']
@@ -3066,13 +3259,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}
@@ -3096,7 +3292,7 @@ The function draws mapping plot for matrices @{@var{ax}, @var{ay} @} which param
 @deftypefnx {C function} @code{void} mgl_stfa (@code{HMGL} gr, @code{HCDT} re, @code{HCDT} im, @code{int} dn, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_stfa_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} re, @code{HCDT} im, @code{int} dn, @code{const char *}sch, @code{const char *}opt)
 @end ifclear
-Draws spectrogram of complex array @var{re}+i*@var{im} for Fourier size of @var{dn} points at plane @var{z} equal to minimal z-axis value. For example in 1D case, result is density plot of data @math{res[i,j]=|\sum_d^dn exp(I*j*d)*(re[i*dn+d]+I*im[i*dn+d])|/dn} with size @{int(nx/dn), dn, ny@}. At this array @var{re}, @var{im} parametrically depend on coordinates @var{x}, @var{y}. The size of @var{re} and @var{im} must be the same. The minor dimensions of arrays @var{x}, @var{y}, @var{re} should be equal. Arrays @var{x}, @var{y} can be vectors (not matrix as @var{re}).  @sref{STFA sample}
+Draws spectrogram of complex array @var{re}+i*@var{im} for Fourier size of @var{dn} points at plane @var{z} equal to minimal z-axis value. For example in 1D case, result is density plot of data @math{res[i,j]=|\sum_d^dn exp(I*j*d)*(re[i*dn+d]+I*im[i*dn+d])|/dn} with size @{int(nx/dn), dn, ny@}. At this array @var{re}, @var{im} parametrically depend on coordinates @var{x}, @var{y}. The size of @var{re} and @var{im} must be the same. The minor dimensions of arrays @var{x}, @var{y}, @var{re} should be equal. Arrays @var{x}, @var{y} can be vectors (not matrix as @var{re}).  @sref{stfa sample}
 @end deftypefn
 
 
@@ -3123,7 +3319,7 @@ These functions perform plotting of 2D and 3D vector fields. There are 5 general
 @deftypefnx {C function} @code{void} mgl_traj_xyz (@code{HMGL} gr, @code{HCDT}x, @code{HCDT}y, @code{HCDT}z, @code{HCDT}ax, @code{HCDT}ay, @code{HCDT}az, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_traj_xy (@code{HMGL} gr, @code{HCDT}x, @code{HCDT}y, @code{HCDT}ax, @code{HCDT}ay, @code{const char *}sch, @code{const char *}opt)
 @end ifclear
-The function draws vectors @{@var{ax}, @var{ay}, @var{az}@} along a curve @{@var{x}, @var{y}, @var{z}@}. The length of arrows are proportional to @math{\sqrt@{ax^2+ay^2+az^2@}}. String @var{pen} specifies the color (see @ref{Line styles}). By default (@code{pen=""}) color from palette is used (see @ref{Palette and colors}). Option @code{value} set the vector length factor (if non-zero) or vector length to be proportional the distance between curve points (if @code{value=0}). The minor sizes of all arrays must be equal and large 2. The plots are drawn for each row if one of the data is the matrix. See also @ref{vect}. @sref{Traj sample}
+The function draws vectors @{@var{ax}, @var{ay}, @var{az}@} along a curve @{@var{x}, @var{y}, @var{z}@}. The length of arrows are proportional to @math{\sqrt@{ax^2+ay^2+az^2@}}. String @var{pen} specifies the color (see @ref{Line styles}). By default (@code{pen=""}) color from palette is used (see @ref{Palette and colors}). Option @code{value} set the vector length factor (if non-zero) or vector length to be proportional the distance between curve points (if @code{value=0}). The minor sizes of all arrays must be equal and large 2. The plots are drawn for each row if one of the data is the matrix. See also @ref{vect}. @sref{traj sample}
 @end deftypefn
 
 @anchor{vect}
@@ -3146,7 +3342,7 @@ The function draws plane vector field plot for the field @{@var{ax}, @var{ay}@}
 @item
 @samp{=} for enabling color gradient along arrows.
 @end itemize
-See also @ref{flow}, @ref{dew}. @sref{Vect sample}
+See also @ref{flow}, @ref{dew}. @sref{vect sample}
 @end deftypefn
 
 @deftypefn {MGL command} {} vect udat vdat wdat ['sch'='']
@@ -3180,7 +3376,7 @@ The function draws 3D vector field plot for the field @{@var{ax}, @var{ay}, @var
 @item
 @samp{=} for enabling color gradient along arrows.
 @end itemize
-See also @ref{vect}, @ref{flow}, @ref{dew}. @sref{Vect3 sample}
+See also @ref{vect}, @ref{flow}, @ref{dew}. @sref{vect3 sample}
 @end deftypefn
 
 @anchor{dew}
@@ -3192,7 +3388,7 @@ See also @ref{vect}, @ref{flow}, @ref{dew}. @sref{Vect3 sample}
 @deftypefnx {C function} @code{void} mgl_dew (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_dew_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt)
 @end ifclear
-The function draws dew-drops for plane vector field @{@var{ax}, @var{ay}@} depending parametrically on coordinates @var{x}, @var{y} at level @var{z} equal to minimal z-axis value. Note that this is very expensive plot in memory usage and creation time! The color of drops is proportional to @math{\sqrt@{ax^2+ay^2@}}. The number of drops depend on @ref{meshnum}. See also @ref{vect}. @sref{Dew sample}
+The function draws dew-drops for plane vector field @{@var{ax}, @var{ay}@} depending parametrically on coordinates @var{x}, @var{y} at level @var{z} equal to minimal z-axis value. Note that this is very expensive plot in memory usage and creation time! The color of drops is proportional to @math{\sqrt@{ax^2+ay^2@}}. The number of drops depend on @ref{meshnum}. See also @ref{vect}. @sref{dew sample}
 @end deftypefn
 
 @anchor{flow}
@@ -3204,20 +3400,22 @@ The function draws dew-drops for plane vector field @{@var{ax}, @var{ay}@} depen
 @deftypefnx {C function} @code{void} mgl_flow_2d (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_flow_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt)
 @end ifclear
-The function draws flow threads for the plane vector field @{@var{ax}, @var{ay}@} parametrically depending on coordinates @var{x}, @var{y} at level @var{z} equal to minimal z-axis value. Number of threads is proportional to @code{value} option (default is 5). String @var{sch} may contain:
+The function draws flow threads for the plane vector field @{@var{ax}, @var{ay}@} parametrically depending on coordinates @var{x}, @var{y} at level @var{z} equal to minimal z-axis value. Option @code{value} set the approximate number of threads (default is 5), or accuracy for stationary points (if style @samp{.} is used) . String @var{sch} may contain:
 @itemize @bullet
 @item
 color scheme -- up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);
 @item
 @samp{#} for starting threads from edges only;
 @item
+@samp{.} for drawing separatrices only (flow threads to/from stationary points).
+@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.
 @end itemize
-See also @ref{pipe}, @ref{vect}, @ref{tape}, @ref{barwidth}. @sref{Flow sample}
+See also @ref{pipe}, @ref{vect}, @ref{tape}, @ref{flow3}, @ref{barwidth}. @sref{flow sample}
 @end deftypefn
 
 @deftypefn {MGL command} {} flow udat vdat wdat ['sch'='']
@@ -3253,6 +3451,30 @@ The same as first one (@ref{flow}) but draws single flow thread starting from po
 This is 3D version of the previous functions.
 @end deftypefn
 
+@anchor{flow3}
+@deftypefn {MGL command} {} flow3 udat vdat wdat ['sch'='']
+@deftypefnx {MGL command} {} flow3 xdat ydat zdat udat vdat ['sch'='']
+@ifclear UDAV
+@deftypefnx {Method on @code{mglGraph}} @code{void} Flow3 (@code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{double} sVal=@code{-1}, @code{const char *}opt=@code{""})
+@deftypefnx {Method on @code{mglGraph}} @code{void} Flow3 (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{double} sVal=@code{-1}, @code{const char *}opt=@code{""})
+@deftypefnx {C function} @code{void} mgl_flow3 (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{HCDT} az, @code{const char *}sch, @code{double} sVal, @code{const char *}opt)
+@deftypefnx {C function} @code{void} mgl_flow3_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} ax, @code{HCDT} ay, @code{HCDT} az, @code{const char *}sch, @code{double} sVal, @code{const char *}opt)
+@end ifclear
+The function draws flow threads for the 3D vector field @{@var{ax}, @var{ay}, @var{az}@} parametrically depending on coordinates @var{x}, @var{y}, @var{z}. Flow threads starts from given plane. Option @code{value} set the approximate number of threads (default is 5). String @var{sch} may contain:
+@itemize @bullet
+@item
+color scheme -- up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);
+@item
+@samp{x}, @samp{z} for normal of starting plane (default is y-direction);
+@item
+@samp{v} for drawing arrows on the threads;
+@item
+@samp{t} for drawing tapes of normals in x-y and y-z planes.
+@end itemize
+See also @ref{flow}, @ref{pipe}, @ref{vect}. @sref{flow3 sample}
+@end deftypefn
+
+
 @anchor{grad}
 @deftypefn {MGL command} {} grad pdat ['sch'='']
 @deftypefnx {MGL command} {} grad xdat ydat pdat ['sch'='']
@@ -3277,7 +3499,7 @@ The function draws gradient lines for scalar field @var{phi}[i,j] (or @var{phi}[
 @deftypefnx {C function} @code{void} mgl_pipe_2d (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{mreal} r0, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_pipe_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{mreal} r0, @code{const char *}opt)
 @end ifclear
-The function draws flow pipes for the plane vector field @{@var{ax}, @var{ay}@} parametrically depending on coordinates @var{x}, @var{y} at level @var{z} equal to minimal z-axis value. Number of pipes is proportional to @code{value} option (default is 5). If @samp{#} symbol is specified then pipes start only from edges of axis range. The color of lines is proportional to @math{\sqrt@{ax^2+ay^2@}}. Warm color corresponds to normal flow (like attractor). Cold one corresponds to inverse flow (like source). Parameter @var{r0} set the base pipe radius. If @var{r0}<0 or symbol @samp{i} is specified then pipe radius is inverse proportional to amplitude. The vector field is plotted for each z slice of @var{ax}, @var{ay}. See also @ref{flow}, @ref{vect}. @sref{Pipe sample}
+The function draws flow pipes for the plane vector field @{@var{ax}, @var{ay}@} parametrically depending on coordinates @var{x}, @var{y} at level @var{z} equal to minimal z-axis value. Number of pipes is proportional to @code{value} option (default is 5). If @samp{#} symbol is specified then pipes start only from edges of axis range. The color of lines is proportional to @math{\sqrt@{ax^2+ay^2@}}. Warm color corresponds to normal flow (like attractor). Cold one corresponds to inverse flow (like source). Parameter @var{r0} set the base pipe radius. If @var{r0}<0 or symbol @samp{i} is specified then pipe radius is inverse proportional to amplitude. The vector field is plotted for each z slice of @var{ax}, @var{ay}. See also @ref{flow}, @ref{vect}. @sref{pipe sample}
 @end deftypefn
 
 @deftypefn {MGL command} {} pipe udat vdat wdat ['sch'='' @code{r0=0.05}]
@@ -3322,7 +3544,7 @@ These functions perform miscellaneous plotting. There is unstructured data point
 @deftypefnx {C function} @code{void} mgl_dens_y (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_dens_z (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt)
 @end ifclear
-These plotting functions draw density plot in x, y, or z plain. If @var{a} is a tensor (3-dimensional data) then interpolation to a given @var{sVal} is performed. These functions are useful for creating projections of the 3D data array to the bounding box. See also @ref{ContXYZ}, @ref{ContFXYZ}, @ref{dens}, @ref{Data manipulation}. @sref{Dens projection sample}
+These plotting functions draw density plot in x, y, or z plain. If @var{a} is a tensor (3-dimensional data) then interpolation to a given @var{sVal} is performed. These functions are useful for creating projections of the 3D data array to the bounding box. See also @ref{ContXYZ}, @ref{ContFXYZ}, @ref{dens}, @ref{Data manipulation}. @sref{dens_xyz sample}
 @end deftypefn
 
 @anchor{contz} @anchor{conty} @anchor{contx} @anchor{ContXYZ}
@@ -3337,7 +3559,7 @@ These plotting functions draw density plot in x, y, or z plain. If @var{a} is a
 @deftypefnx {C function} @code{void} mgl_cont_y (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_cont_z (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt)
 @end ifclear
-These plotting functions draw contour lines in x, y, or z plain. If @var{a} is a tensor (3-dimensional data) then interpolation to a given @var{sVal} is performed. These functions are useful for creating projections of the 3D data array to the bounding box. Option @code{value} set the number of contours. See also @ref{ContFXYZ}, @ref{DensXYZ}, @ref{cont}, @ref{Data manipulation}. @sref{Cont projection sample}
+These plotting functions draw contour lines in x, y, or z plain. If @var{a} is a tensor (3-dimensional data) then interpolation to a given @var{sVal} is performed. These functions are useful for creating projections of the 3D data array to the bounding box. Option @code{value} set the number of contours. See also @ref{ContFXYZ}, @ref{DensXYZ}, @ref{cont}, @ref{Data manipulation}. @sref{cont_xyz sample}
 @end deftypefn
 
 @ifclear UDAV
@@ -3363,7 +3585,7 @@ The same as previous with manual contour levels.
 @deftypefnx {C function} @code{void} mgl_contf_y (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_contf_z (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt)
 @end ifclear
-These plotting functions draw solid contours in x, y, or z plain. If @var{a} is a tensor (3-dimensional data) then interpolation to a given @var{sVal} is performed. These functions are useful for creating projections of the 3D data array to the bounding box. Option @code{value} set the number of contours. See also @ref{ContFXYZ}, @ref{DensXYZ}, @ref{cont}, @ref{Data manipulation}. @sref{ContF projection sample}
+These plotting functions draw solid contours in x, y, or z plain. If @var{a} is a tensor (3-dimensional data) then interpolation to a given @var{sVal} is performed. These functions are useful for creating projections of the 3D data array to the bounding box. Option @code{value} set the number of contours. See also @ref{ContFXYZ}, @ref{DensXYZ}, @ref{cont}, @ref{Data manipulation}. @sref{contf_xyz sample}
 @end deftypefn
 
 @ifclear UDAV
@@ -3423,7 +3645,7 @@ Draws command parametrical surface @{@samp{x(u,v)}, @samp{y(u,v)}, @samp{z(u,v)}
 @deftypefnx {C function} @code{void} mgl_triplot_xyz (@code{HMGL} gr, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_triplot_xyzc (@code{HMGL} gr, @code{HCDT} id, @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 the surface of triangles. Triangle vertexes are set by indexes @var{id} of data points @{@var{x}[i], @var{y}[i], @var{z}[i]@}. String @var{sch} sets the color scheme. If string contain @samp{#} then wire plot is produced. First dimensions of @var{id} must be 3 or greater. Arrays @var{x}, @var{y}, @var{z} must have equal sizes. Parameter @var{c} set the colors of triangles (if @var{id}.ny=@var{c}.nx) or colors of vertexes (if @var{x}.nx=@var{c}.nx). See also @ref{dots}, @ref{crust}, @ref{quadplot}, @ref{triangulation}. @sref{TriPlot and QuadPlot}
+The function draws the surface of triangles. Triangle vertexes are set by indexes @var{id} of data points @{@var{x}[i], @var{y}[i], @var{z}[i]@}. String @var{sch} sets the color scheme. If string contain @samp{#} then wire plot is produced. First dimensions of @var{id} must be 3 or greater. Arrays @var{x}, @var{y}, @var{z} must have equal sizes. Parameter @var{c} set the colors of triangles (if @var{id}.ny=@var{c}.nx) or colors of vertexes (if @var{x}.nx=@var{c}.nx). See also @ref{dots}, @ref{crust}, @ref{quadplot}, @ref{triangulation}. @sref{triplot sample}
 @end deftypefn
 
 @anchor{tricont}
@@ -3455,7 +3677,7 @@ The function draws contour lines for surface of triangles at @var{z}=@var{v}[k]
 @deftypefnx {C function} @code{void} mgl_quadplot_xyz (@code{HMGL} gr, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_quadplot_xyzc (@code{HMGL} gr, @code{HCDT} id, @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 the surface of quadrangles. Quadrangles vertexes are set by indexes @var{id} of data points @{@var{x}[i], @var{y}[i], @var{z}[i]@}. String @var{sch} sets the color scheme. If string contain @samp{#} then wire plot is produced. First dimensions of @var{id} must be 4 or greater. Arrays @var{x}, @var{y}, @var{z} must have equal sizes. Parameter @var{c} set the colors of quadrangles (if @var{id}.ny=@var{c}.nx) or colors of vertexes (if @var{x}.nx=@var{c}.nx). See also @ref{triplot}. @sref{TriPlot and QuadPlot}
+The function draws the surface of quadrangles. Quadrangles vertexes are set by indexes @var{id} of data points @{@var{x}[i], @var{y}[i], @var{z}[i]@}. String @var{sch} sets the color scheme. If string contain @samp{#} then wire plot is produced. First dimensions of @var{id} must be 4 or greater. Arrays @var{x}, @var{y}, @var{z} must have equal sizes. Parameter @var{c} set the colors of quadrangles (if @var{id}.ny=@var{c}.nx) or colors of vertexes (if @var{x}.nx=@var{c}.nx). See also @ref{triplot}. @sref{triplot sample}
 @end deftypefn
 
 @anchor{dots}
@@ -3469,7 +3691,7 @@ The function draws the surface of quadrangles. Quadrangles vertexes are set by i
 @deftypefnx {C function} @code{void} mgl_dots_a (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {C function} @code{void} mgl_dots_ca (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt)
 @end ifclear
-The function draws the arbitrary placed points @{@var{x}[i], @var{y}[i], @var{z}[i]@}. String @var{sch} sets the color scheme and kind of marks. If arrays @var{c}, @var{a} are specified then they define colors and transparencies of dots. You can use @ref{tens} plot with style @samp{ .} to draw non-transparent dots with specified colors. Arrays @var{x}, @var{y}, @var{z}, @var{a} must have equal sizes. See also @ref{crust}, @ref{tens}, @ref{mark}, @ref{plot}. @sref{Dots sample}
+The function draws the arbitrary placed points @{@var{x}[i], @var{y}[i], @var{z}[i]@}. String @var{sch} sets the color scheme and kind of marks. If arrays @var{c}, @var{a} are specified then they define colors and transparencies of dots. You can use @ref{tens} plot with style @samp{ .} to draw non-transparent dots with specified colors. Arrays @var{x}, @var{y}, @var{z}, @var{a} must have equal sizes. See also @ref{crust}, @ref{tens}, @ref{mark}, @ref{plot}. @sref{dots sample}
 @end deftypefn
 
 @anchor{crust}
@@ -3478,7 +3700,7 @@ The function draws the arbitrary placed points @{@var{x}[i], @var{y}[i], @var{z}
 @deftypefnx {Method on @code{mglGraph}} @code{void} Crust (@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_crust (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
 @end ifclear
-The function reconstruct and draws the surface for arbitrary placed points @{@var{x}[i], @var{y}[i], @var{z}[i]@}. String @var{sch} sets the color scheme. If string contain @samp{#} then wire plot is produced. Arrays @var{x}, @var{y}, @var{z} must have equal sizes. See also @ref{dots}, @ref{triplot}. @c @sref{Crust sample}
+The function reconstruct and draws the surface for arbitrary placed points @{@var{x}[i], @var{y}[i], @var{z}[i]@}. String @var{sch} sets the color scheme. If string contain @samp{#} then wire plot is produced. Arrays @var{x}, @var{y}, @var{z} must have equal sizes. See also @ref{dots}, @ref{triplot}. @c @sref{crust sample}
 @end deftypefn
 
 @c ##################################################################
index 70aaae2fdd0f8c213906536e1b05cfda76260c67..7f0e0b0a69b2dc51abd5829f50837c2a00f1f6e7 100644 (file)
@@ -90,6 +90,45 @@ MGL не требует создания данного типа объекто
 Устанавливает все настройки по умолчанию и очищает рисунок.
 @end deftypefn
 
+@anchor{setup}
+@deftypefn {Команда MGL} {} setup @code{val flag}
+@ifclear UDAV
+@deftypefnx {Метод класса @code{mglGraph}} @code{void} SetFlagAdv (@code{int} val, @code{uint32_t} flag)
+@deftypefnx {Функция С} @code{void} mgl_set_flag (@code{HMGL} gr, @code{int} val, @code{uint32_t} flag)
+@end ifclear
+Устанавливает значение бинарного флага @var{flag} в @var{val}. Список флагов можно найти в @url{https://sourceforge.net/p/mathgl/code/HEAD/tree/mathgl-2x/include/mgl2/define.h#l267, define.h}. Текущий список флагов: 
+@verbatim
+#define MGL_ENABLE_CUT         0x00000004      ///< Определяет способ рисования точек вне диапазона осей координат
+#define MGL_ENABLE_RTEXT       0x00000008      ///< Использовать вращение текста
+#define MGL_AUTO_FACTOR                0x00000010      ///< Разрешить автоматическое масштабирование графика
+#define MGL_ENABLE_ALPHA       0x00000020      ///< Использовать прозрачность
+#define MGL_ENABLE_LIGHT       0x00000040      ///< Использовать освещение
+#define MGL_TICKS_ROTATE       0x00000080      ///< Разрешить вращение меток осей
+#define MGL_TICKS_SKIP         0x00000100      ///< Разрешить пропуск меток осей
+#define MGL_DISABLE_SCALE      0x00000200      ///< Временный флаг, запрещающий изменение размеров
+#define MGL_FINISHED           0x00000400      ///< Флаг готовности окончательной картинки (т.е. mglCanvas::G)
+#define MGL_USE_GMTIME         0x00000800      ///< Использовать gmtime вместо localtime
+#define MGL_SHOW_POS           0x00001000      ///< Включить показ координат щелчка мыши
+#define MGL_CLF_ON_UPD         0x00002000      ///< Очищать график перед Update()
+#define MGL_NOSUBTICKS         0x00004000      ///< Запретить рисование subticks для bounding box
+#define MGL_LOCAL_LIGHT                0x00008000      ///< Сохранять источники освещения в каждом inplot
+#define MGL_VECT_FRAME         0x00010000      ///< Использовать DrwDat для сохранения всех данных в кадрах
+#define MGL_REDUCEACC          0x00020000      ///< Сокращать точность вывода точек (для уменьшения размера выходных файлов)
+#define MGL_PREFERVC           0x00040000      ///< Предпочитать цвета вершин вместо текстур если выходной формат поддерживает
+#define MGL_ONESIDED           0x00080000      ///< Выводить только переднюю сторону поверхностей если выходной формат поддерживает
+#define MGL_NO_ORIGIN          0x00100000      ///< Не рисовать метки в точке пересечения осей
+#define MGL_GRAY_MODE          0x00200000      ///< Преобразовать все цвета в оттенки серого
+#define MGL_FULL_CURV          0x00400000      ///< Запретить пропуск точек на прямолинейных участках
+#define MGL_NO_SCALE_REL       0x00800000      ///< Запретить изменение размера текста в относительных inplots
+@end verbatim
+@end deftypefn
+
+@ifclear UDAV
+@deftypefn {Функция С} @code{void} mgl_bsize (@code{unsigned} bsize)
+Задает размер буфера под примитивы как (1<<bsize)^2. Т.е. как 10^12 для bsize=20 или 4*10^9 для bsize=16 (по умолчанию). ВАЖНО: можно устанавливать только один раз вначале, до построения графиков. Возвращает текущее значение.
+@end deftypefn
+@end ifclear
+
 @menu
 * Transparency::
 * Lighting::
@@ -142,7 +181,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 +224,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 +333,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}
@@ -395,6 +443,15 @@ MGL не требует создания данного типа объекто
 Включает/выключает вращение меток и подписей осей координат вдоль оси.
 @end deftypefn
 
+@anchor{scaletext}
+@deftypefn {Команда MGL} {} scaletext @code{val}
+@ifclear UDAV
+@deftypefnx {Метод класса @code{mglGraph}} @code{void} SetScaleText (@code{bool} val)
+@deftypefnx {Функция С} @code{void} mgl_set_scale_text (@code{HMGL} gr, @code{int} val)
+@end ifclear
+Включает/выключает масштабирование текста в относительных @ref{inplot}-ах (в том числе @ref{columnplot}, @ref{gridplot}, @ref{stickplot}, @ref{shearplot}).
+@end deftypefn
+
 @anchor{loadfont}
 @deftypefn {Команда MGL} {} loadfont ['name'='']
 @ifclear UDAV
@@ -474,7 +531,7 @@ MGL не требует создания данного типа объекто
 @end ifclear
 
 @anchor{gray}
-@deftypefn {Команда MGL} {} gray @code{val}
+@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)
@@ -492,6 +549,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)
@@ -704,13 +762,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)
@@ -753,7 +814,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)
@@ -766,7 +827,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}
@@ -825,10 +916,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)
@@ -855,7 +946,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
@@ -881,7 +972,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)
@@ -978,22 +1069,48 @@ Ternary -- специальный тип графика для 3 зависим
 Эти функции контролируют где и как график будет расположен. Существует определенный порядок вызова этих функций для лучшего вида графика. Вначале должны вызываться функции @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}
@@ -1023,7 +1140,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}
@@ -1239,6 +1356,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})
@@ -1553,6 +1679,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)
@@ -1739,7 +1866,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}
@@ -1787,6 +1914,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
@@ -1887,6 +2045,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;
@@ -1926,7 +2085,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Метод класса @code{mglGraph}} @code{void} Colorbar (@code{const mglDataA &}v, @code{const char *}sch=@code{""})
 @deftypefnx {Функция С} @code{void} mgl_colorbar_val (@code{HMGL} gr, @code{HCDT} v, @code{const char *}sch)
 @end ifclear
-Аналогично предыдущему, но для цветовой схемы без сглаживания с заданными значениями @var{v}. @sref{ContD sample}
+Аналогично предыдущему, но для цветовой схемы без сглаживания с заданными значениями @var{v}. @sref{contd sample}
 @end deftypefn
 
 @deftypefn {Команда MGL} {} colorbar 'sch' @code{x y [w=1 h=1]}
@@ -1942,7 +2101,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Метод класса @code{mglGraph}} @code{void} Colorbar (@code{const mglDataA &}v, @code{const char *}sch, @code{mreal} x, @code{mreal} y, @code{mreal} w=@code{1}, @code{mreal} h=@code{1})
 @deftypefnx {Функция С} @code{void} mgl_colorbar_val_ext (@code{HMGL} gr, @code{HCDT} v, @code{const char *}sch, @code{mreal} x, @code{mreal} y, @code{mreal} w, @code{mreal} h)
 @end ifclear
-Аналогично предыдущему, но для цветовой схемы @var{sch} без сглаживания с заданными значениями @var{v}. @sref{ContD sample}
+Аналогично предыдущему, но для цветовой схемы @var{sch} без сглаживания с заданными значениями @var{v}. @sref{contd sample}
 @end deftypefn
 
 @anchor{grid}
@@ -1958,7 +2117,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{@@}, то рисуются закрашенные задние грани. При этом первый цвет используется для граней (по умолчанию светло жёлтый), а последний для рёбер и меток.
@@ -1992,7 +2151,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'='#']
@@ -2000,7 +2174,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'='#']
@@ -2008,7 +2182,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}
@@ -2068,7 +2242,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 
 Эти функции строят графики для одномерных (1D) массивов. Одномерными считаются массивы, зависящие только от одного параметра (индекса) подобно кривой в параметрической форме @{x(i),y(i),z(i)@}, i=1...n. По умолчанию (если отсутствуют) значения @var{x}[i] равно распределены в диапазоне оси х, и @var{z}[i] равно минимальному значению оси z. Графики рисуются для каждой строки массива данных если он двумерный. Размер по 1-ой координате @strong{должен быть одинаков} для всех массивов @code{x.nx=y.nx=z.nx}.
 
-Строка @var{pen} задает цвет и стиль линии и маркеров (см. @ref{Line styles}). По умолчанию (@code{pen=""}) рисуется сплошная линия с текущим цветом из палитры (см. @ref{Palette and colors}). Символ @samp{!} в строке задает использование нового цвета из палитры для каждой точки данных (не для всей кривой, как по умолчанию). Строка @var{opt} задает опции графика (см. @ref{Command options}). @sref{1D samples}
+Строка @var{pen} задает цвет и стиль линии и маркеров (см. @ref{Line styles}). По умолчанию (@code{pen=""}) рисуется сплошная линия с текущим цветом из палитры (см. @ref{Palette and colors}). Символ @samp{!} в строке задает использование нового цвета из палитры для каждой точки данных (не для всей кривой, как по умолчанию). Строка @var{opt} задает опции графика (см. @ref{Command options}).
 
 @anchor{plot}
 @deftypefn {Команда MGL} {} plot ydat ['stl'='']
@@ -2082,7 +2256,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}
@@ -2091,7 +2265,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}
@@ -2106,7 +2280,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}
@@ -2121,7 +2295,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}
@@ -2136,7 +2310,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_tape_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_tape_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}pen, @code{const char *}opt)
 @end ifclear
-Функции рисуют ленты, которые вращаются вокруг кривой @{@var{x}[i], @var{y}[i], @var{z}[i]@} как её нормали. Начальная лента(ы) выбираются в плоскости x-y (для @samp{x} в @var{pen}) и/или y-z (для @samp{x} в @var{pen}). Ширина лент пропорциональна @ref{barwidth}, а также может быть изменена опцией @code{value}. См. также @ref{plot}, @ref{flow}, @ref{barwidth}. @sref{Tape sample}
+Функции рисуют ленты, которые вращаются вокруг кривой @{@var{x}[i], @var{y}[i], @var{z}[i]@} как её нормали. Начальная лента(ы) выбираются в плоскости x-y (для @samp{x} в @var{pen}) и/или y-z (для @samp{x} в @var{pen}). Ширина лент пропорциональна @ref{barwidth}, а также может быть изменена опцией @code{value}. См. также @ref{plot}, @ref{flow}, @ref{barwidth}. @sref{tape sample}
 @end deftypefn
 
 @anchor{area}
@@ -2151,7 +2325,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
-ФÑ\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. Ð¡Ð¼. Ñ\82акже @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}
@@ -2168,7 +2342,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
-ФÑ\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. Ð¡Ð¼. Ñ\82акже @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}
@@ -2183,7 +2357,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_stem_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_stem_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}pen, @code{const char *}opt)
 @end ifclear
-Функции рисуют вертикальные линии из точек до плоскости осей координат. См. также @ref{area}, @ref{bars}, @ref{plot}, @ref{mark}. @sref{Stem sample}
+Функции рисуют вертикальные линии из точек до плоскости осей координат. См. также @ref{area}, @ref{bars}, @ref{plot}, @ref{mark}. @sref{stem sample}
 @end deftypefn
 
 @anchor{bars}
@@ -2198,7 +2372,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}
@@ -2210,7 +2395,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}
@@ -2238,7 +2434,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @item
 @samp{<}, @samp{^} или @samp{>} для выравнивания конусов влево, вправо или по центру относительно их координат.
 @end itemize
-См. также @ref{bars}, @ref{cone}, @ref{barwidth}. @sref{Cones sample}
+См. также @ref{bars}, @ref{cone}, @ref{barwidth}. @sref{cones sample}
 @end deftypefn
 
 
@@ -2249,7 +2445,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Метод класса @code{mglGraph}} @code{void} Chart (@code{const mglDataA &}a, @code{const char *}col=@code{""}, @code{const char *}opt=@code{""})
 @deftypefnx {Функция С} @code{void} mgl_chart (@code{HMGL} gr, @code{HCDT} a, @code{const char *}col, @code{const char *}opt)
 @end ifclear
-Рисует цветные полосы (пояса) для массива данных @var{a}. Число полос равно числу строк @var{a} (равно @var{a.ny}). Цвет полос поочерёдно меняется из цветов указанных в @var{col} или в палитре (см. @ref{Palette and colors}). Пробел в цветах соответствует прозрачному "цвету", т.е. если @var{col} содержит пробел(ы), то соответствующая полоса не рисуется. Ширина полосы пропорциональна значению элемента в @var{a}. График строится только для массивов не содержащих отрицательных значений. Если строка @var{col} содержит @samp{#}, то рисуется также чёрная граница полос. График выглядит лучше в (после вращения системы координат) и/или в полярной системе координат (становится Pie chart). @sref{Chart sample}
+Рисует цветные полосы (пояса) для массива данных @var{a}. Число полос равно числу строк @var{a} (равно @var{a.ny}). Цвет полос поочерёдно меняется из цветов указанных в @var{col} или в палитре (см. @ref{Palette and colors}). Пробел в цветах соответствует прозрачному "цвету", т.е. если @var{col} содержит пробел(ы), то соответствующая полоса не рисуется. Ширина полосы пропорциональна значению элемента в @var{a}. График строится только для массивов не содержащих отрицательных значений. Если строка @var{col} содержит @samp{#}, то рисуется также чёрная граница полос. График выглядит лучше в (после вращения системы координат) и/или в полярной системе координат (становится Pie chart). @sref{chart sample}
 @end deftypefn
 
 @anchor{boxplot}
@@ -2261,7 +2457,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_boxplot (@code{HMGL} gr, @code{HCDT} a, @code{const char *}pen, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_boxplot_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} a, @code{const char *}pen, @code{const char *}opt)
 @end ifclear
-Функции рисуют boxplot (называемый также как box-and-whisker diagram или как "ящик с усами") в точках @var{x}[i] на плоскости @var{z} = @var{zVal} (по умолчанию @var{z} равно минимальному значению оси z). Это график, компактно изображающий распределение вероятностей @var{a}[i,j] (минимум, нижний квартиль (Q1), медиана (Q2), верхний квартиль (Q3) и максимум) вдоль второго (j-го) направления. Если @var{pen} содержит @samp{<}, @samp{^} или @samp{>}, то полоски будут выровнены влево, вправо или центрированы относительно их координат. См. также @ref{plot}, @ref{error}, @ref{bars}, @ref{barwidth}. @sref{BoxPlot sample}
+Функции рисуют boxplot (называемый также как box-and-whisker diagram или как "ящик с усами") в точках @var{x}[i] на плоскости @var{z} = @var{zVal} (по умолчанию @var{z} равно минимальному значению оси z). Это график, компактно изображающий распределение вероятностей @var{a}[i,j] (минимум, нижний квартиль (Q1), медиана (Q2), верхний квартиль (Q3) и максимум) вдоль второго (j-го) направления. Если @var{pen} содержит @samp{<}, @samp{^} или @samp{>}, то полоски будут выровнены влево, вправо или центрированы относительно их координат. См. также @ref{plot}, @ref{error}, @ref{bars}, @ref{barwidth}. @sref{boxplot sample}
 @end deftypefn
 
 @anchor{candle}
@@ -2280,7 +2476,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_candle_yv (@code{HMGL} gr, @code{HCDT} v1, @code{HCDT} v2, @code{HCDT} y1, @code{HCDT} y2, @code{const char *}pen, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_candle_xyv (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} v1, @code{HCDT} v2, @code{HCDT} y1, @code{HCDT} y2, @code{const char *}pen, @code{const char *}opt)
 @end ifclear
-Функции рисуют candlestick chart в точках @var{x}[i]. Этот график показывает прямоугольником ("свечой") диапазон изменения величины. Прозрачная (белая) свеча соответствует росту величины @var{v1}[i]<@var{v2}[i], чёрная -- уменьшению. "Тени" показывают минимальное @var{y1} и максимальное @var{y2} значения. Если @var{v2} отсутствует, то он определяется как @var{v2}[i]=@var{v1}[i+1]. Можно использовать разные цвета для растущих и падающих дней если число указанных цветов равно удвоенному числу кривых для построения. Если @var{pen} содержит @samp{#}, то прозрачная свеча будет использована и при 2-цветной схеме. См. также @ref{plot}, @ref{bars}, @ref{ohlc}, @ref{barwidth}. @sref{Candle sample}
+Функции рисуют candlestick chart в точках @var{x}[i]. Этот график показывает прямоугольником ("свечой") диапазон изменения величины. Прозрачная (белая) свеча соответствует росту величины @var{v1}[i]<@var{v2}[i], чёрная -- уменьшению. "Тени" показывают минимальное @var{y1} и максимальное @var{y2} значения. Если @var{v2} отсутствует, то он определяется как @var{v2}[i]=@var{v1}[i+1]. Можно использовать разные цвета для растущих и падающих дней если число указанных цветов равно удвоенному числу кривых для построения. Если @var{pen} содержит @samp{#}, то прозрачная свеча будет использована и при 2-цветной схеме. См. также @ref{plot}, @ref{bars}, @ref{ohlc}, @ref{barwidth}. @sref{candle sample}
 @end deftypefn
 
 @anchor{ohlc}
@@ -2292,7 +2488,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_ohlc (@code{HMGL} gr, @code{HCDT} o, @code{HCDT} h, @code{HCDT} l, @code{HCDT} c, @code{const char *}pen, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_ohlc_x (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} o, @code{HCDT} h, @code{HCDT} l, @code{HCDT} c, @code{const char *}pen, @code{const char *}opt)
 @end ifclear
-Функции рисуют Open-High-Low-Close диаграмму. Этот график содержит вертикальные линии между максимальным @var{h} и минимальным @var{l} значениями, и горизонтальные линии перед/после вертикальной линии для начального @var{o} и конечного @var{c} значений процесса (обычно цены). Можно использовать разные цвета для растущих и падающих дней если число указанных цветов равно удвоенному числу кривых для построения. См. также @ref{candle}, @ref{plot}, @ref{barwidth}. @sref{OHLC sample}
+Функции рисуют Open-High-Low-Close диаграмму. Этот график содержит вертикальные линии между максимальным @var{h} и минимальным @var{l} значениями, и горизонтальные линии перед/после вертикальной линии для начального @var{o} и конечного @var{c} значений процесса (обычно цены). Можно использовать разные цвета для растущих и падающих дней если число указанных цветов равно удвоенному числу кривых для построения. См. также @ref{candle}, @ref{plot}, @ref{barwidth}. @sref{ohlc sample}
 @end deftypefn
 
 
@@ -2308,7 +2504,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_error_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ey, @code{const char *}pen, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_error_exy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ex, @code{HCDT} ey, @code{const char *}pen, @code{const char *}opt)
 @end ifclear
-Функции рисуют размер ошибки @{@var{ex}[i], @var{ey}[i]@} в точках @{@var{x}[i], @var{y}[i]@} на плоскости @var{z} = @var{zVal} (по умолчанию @var{z} равно минимальному значению оси z). Такой график полезен для отображения ошибки эксперимента, вычислений и пр. Если @var{pen} содержит @samp{@@}, то будут использованы большие полупрозрачные маркеры. См. также @ref{plot}, @ref{mark}. @sref{Error sample}
+Функции рисуют размер ошибки @{@var{ex}[i], @var{ey}[i]@} в точках @{@var{x}[i], @var{y}[i]@} на плоскости @var{z} = @var{zVal} (по умолчанию @var{z} равно минимальному значению оси z). Такой график полезен для отображения ошибки эксперимента, вычислений и пр. Если @var{pen} содержит @samp{@@}, то будут использованы большие полупрозрачные маркеры. См. также @ref{plot}, @ref{mark}. @sref{error sample}
 @end deftypefn
 
 @anchor{mark}
@@ -2323,7 +2519,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}
@@ -2349,7 +2545,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}
@@ -2372,7 +2568,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;
@@ -2380,7 +2576,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @item @samp{-} для вывода обычного @samp{-};
 @item @samp{0123456789} для задания точности при выводе чисел.
 @end itemize
-См. также @ref{plot}, @ref{mark}, @ref{textmark}, @ref{table}. @sref{Label sample}
+См. также @ref{plot}, @ref{mark}, @ref{textmark}, @ref{table}. @sref{label sample}
 @end deftypefn
 
 @anchor{table}
@@ -2396,7 +2592,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});
@@ -2407,7 +2603,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}
@@ -2431,7 +2643,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_tube_xyzr (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} r, @code{const char *}pen, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_tube_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{mreal} r, @code{const char *}pen, @code{const char *}opt)
 @end ifclear
-ФÑ\83нкÑ\86ии Ñ\80иÑ\81Ñ\83Ñ\8eÑ\82 Ñ\82Ñ\80Ñ\83бÑ\83 Ñ\80адиÑ\83Ñ\81а @var{r}[i] Ð²Ð´Ð¾Ð»Ñ\8c ÐºÑ\80ивой Ð¼ÐµÐ¶Ð´Ñ\83 Ñ\82оÑ\87ками @{@var{x}[i], @var{y}[i], @var{z}[i]@}. Ð¡Ð¼. Ñ\82акже @ref{plot}. @sref{Tube sample}
+ФÑ\83нкÑ\86ии Ñ\80иÑ\81Ñ\83Ñ\8eÑ\82 Ñ\82Ñ\80Ñ\83бÑ\83 Ñ\80адиÑ\83Ñ\81а @var{r}[i] Ð²Ð´Ð¾Ð»Ñ\8c ÐºÑ\80ивой Ð¼ÐµÐ¶Ð´Ñ\83 Ñ\82оÑ\87ками @{@var{x}[i], @var{y}[i], @var{z}[i]@}. Ð\9eпÑ\86иÑ\8f @code{value} Ñ\87иÑ\81ло Ñ\81егменÑ\82ов Ð² Ð¿Ð¾Ð¿ÐµÑ\80еÑ\87ном Ñ\81еÑ\87ении (по Ñ\83молÑ\87аниÑ\8e 25). Ð¡Ð¼. Ñ\82акже @ref{plot}. @sref{tube sample}
 @end deftypefn
 
 @anchor{torus}
@@ -2440,7 +2652,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Метод класса @code{mglGraph}} @code{void} Torus (@code{const mglDataA &}r, @code{const mglDataA &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""})
 @deftypefnx {Функция С} @code{void} mgl_torus (@code{HMGL} gr, @code{HCDT} r, @code{HCDT} z, @code{const char *}pen, @code{const char *}opt)
 @end ifclear
-Функции рисуют поверхность вращения кривой @{@var{r}, @var{z}@} относительно оси. Если строка @var{pen} содержит @samp{x} или @samp{z}, то ось вращения будет выбрана в указанном направлении (по умолчанию вдоль оси y). Если @var{sch} содержит @samp{#}, то рисуется сетчатая поверхность. Если @var{sch} содержит @samp{.}, то рисуется поверхность из точек. См. также @ref{plot}, @ref{axial}. @sref{Torus sample}
+Функции рисуют поверхность вращения кривой @{@var{r}, @var{z}@} относительно оси. Если строка @var{pen} содержит @samp{x} или @samp{z}, то ось вращения будет выбрана в указанном направлении (по умолчанию вдоль оси y). Если @var{sch} содержит @samp{#}, то рисуется сетчатая поверхность. Если @var{sch} содержит @samp{.}, то рисуется поверхность из точек. См. также @ref{plot}, @ref{axial}. @sref{torus sample}
 @end deftypefn
 
 
@@ -2454,7 +2666,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_lamerey_dat (@code{HMGL} gr, @code{double} x0, @code{HCDT} y, @code{const char *}stl, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_lamerey_str (@code{HMGL} gr, @code{double} x0, @code{const char *}y, @code{const char *}stl, @code{const char *}opt)
 @end ifclear
-Функции рисуют диаграмму Ламерея для точечного отображения x_new = y(x_old) начиная с точки @var{x0}. Строка @var{stl} может содержать стиль линии, символ @samp{v} для стрелок, символ @samp{~} для исключения первого сегмента. Опция @code{value} задает число сегментов для рисования (по умолчанию 20). См. также @ref{plot}, @ref{fplot}, @ref{bifurcation}, @ref{pmap}. @sref{Lamerey sample}
+Функции рисуют диаграмму Ламерея для точечного отображения x_new = y(x_old) начиная с точки @var{x0}. Строка @var{stl} может содержать стиль линии, символ @samp{v} для стрелок, символ @samp{~} для исключения первого сегмента. Опция @code{value} задает число сегментов для рисования (по умолчанию 20). См. также @ref{plot}, @ref{fplot}, @ref{bifurcation}, @ref{pmap}. @sref{lamerey sample}
 @end deftypefn
 
 @anchor{bifurcation}
@@ -2466,7 +2678,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_bifurcation_dat (@code{HMGL} gr, @code{double} dx, @code{HCDT} y, @code{const char *}stl, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_bifurcation_str (@code{HMGL} gr, @code{double} dx, @code{const char *}y, @code{const char *}stl, @code{const char *}opt)
 @end ifclear
-Функции рисуют бифуркационную диаграмму (диаграмму удвоения периода) для точечного отображения x_new = y(x_old). Параметр @var{dx} задает точность по оси x. Строка @var{stl} задает цвет. Опция @code{value} задает число учитываемых стационарных точек (по умолчанию 1024). См. также @ref{plot}, @ref{fplot}, @ref{lamerey}. @sref{Bifurcation sample}
+Функции рисуют бифуркационную диаграмму (диаграмму удвоения периода) для точечного отображения x_new = y(x_old). Параметр @var{dx} задает точность по оси x. Строка @var{stl} задает цвет. Опция @code{value} задает число учитываемых стационарных точек (по умолчанию 1024). См. также @ref{plot}, @ref{fplot}, @ref{lamerey}. @sref{bifurcation sample}
 @end deftypefn
 
 @anchor{pmap}
@@ -2481,7 +2693,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_pmap_xy (@code{HMGL} gr, @code{HCDT} x, @code{HMDT} y, @code{HCDT} s, @code{const char *}stl, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_pmap_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HMDT} y, @code{HCDT} z, @code{HCDT} s, @code{const char *}stl, @code{const char *}opt)
 @end ifclear
-Функции рисуют отображение Пуанкаре для кривой @{@var{x}, @var{y}, @var{z}@} при условии @var{s}=0. Проще говоря, рисуются точки пересечения кривой и поверхности. Строка @var{stl} задает стиль маркеров. См. также @ref{plot}, @ref{mark}, @ref{lamerey}. @sref{Pmap sample}
+Функции рисуют отображение Пуанкаре для кривой @{@var{x}, @var{y}, @var{z}@} при условии @var{s}=0. Проще говоря, рисуются точки пересечения кривой и поверхности. Строка @var{stl} задает стиль маркеров. См. также @ref{plot}, @ref{mark}, @ref{lamerey}. @sref{pmap sample}
 @end deftypefn
 
 
@@ -2504,7 +2716,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @cindex Grad
 @cindex Grid
 
-Эти функции строят графики для двумерных (2D) массивов. Двумерными считаются массивы, зависящие только от двух параметров (индексов) подобно матрице @math{f(x_i,y_j), i=1...n, j=1...m}. По умолчанию (если отсутствуют) значения @var{x}, @var{y} равно распределены в диапазоне осей координат. Младшие размерности массивов @var{x}, @var{y}, @var{z} должны быть одинаковы @code{x.nx=z.nx && y.nx=z.ny} или @code{x.nx=y.nx=z.nx && x.ny=y.ny=z.ny}. Массивы @var{x} и @var{y} могут быть векторами (не матрицами как @var{z}). График строится для каждого z среза данных. Строка @var{sch} задает цветовую схему (см. @ref{Color scheme}). Строка @var{opt} задает опции графика (см. @ref{Command options}). @sref{2D samples}
+Эти функции строят графики для двумерных (2D) массивов. Двумерными считаются массивы, зависящие только от двух параметров (индексов) подобно матрице @math{f(x_i,y_j), i=1...n, j=1...m}. По умолчанию (если отсутствуют) значения @var{x}, @var{y} равно распределены в диапазоне осей координат. Младшие размерности массивов @var{x}, @var{y}, @var{z} должны быть одинаковы @code{x.nx=z.nx && y.nx=z.ny} или @code{x.nx=y.nx=z.nx && x.ny=y.ny=z.ny}. Массивы @var{x} и @var{y} могут быть векторами (не матрицами как @var{z}). График строится для каждого z среза данных. Строка @var{sch} задает цветовую схему (см. @ref{Color scheme}). Строка @var{opt} задает опции графика (см. @ref{Command options}).
 
 @anchor{surf}
 @deftypefn {Команда MGL} {} surf zdat ['sch'='']
@@ -2515,7 +2727,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_surf (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_surf_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{sch} содержит @samp{#}, то рисуется сетка на поверхности. Если @var{sch} содержит @samp{.}, то рисуется поверхность из точек. См. также @ref{mesh}, @ref{dens}, @ref{belt}, @ref{tile}, @ref{boxs}, @ref{surfc}, @ref{surfa}. @sref{Surf sample}
+Рисует параметрически заданную поверхность @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. Если @var{sch} содержит @samp{#}, то рисуется сетка на поверхности. Если @var{sch} содержит @samp{.}, то рисуется поверхность из точек. См. также @ref{mesh}, @ref{dens}, @ref{belt}, @ref{tile}, @ref{boxs}, @ref{surfc}, @ref{surfa}. @sref{surf sample}
 @end deftypefn
 
 @anchor{mesh}
@@ -2527,7 +2739,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_mesh (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_mesh_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]@}. См. также @ref{surf}, @ref{fall}, @ref{meshnum}, @ref{cont}, @ref{tens}. @sref{Mesh sample}
+Рисует сетчатую поверхность, заданную параметрически @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. См. также @ref{surf}, @ref{fall}, @ref{meshnum}, @ref{cont}, @ref{tens}. @sref{mesh sample}
 @end deftypefn
 
 @anchor{fall}
@@ -2539,7 +2751,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_fall (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_fall_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{sch} содержит @samp{x}, то линии рисуются вдоль оси x, иначе (по умолчанию) вдоль оси y. См. также @ref{belt}, @ref{mesh}, @ref{tens}, @ref{meshnum}. @sref{Fall sample}
+Рисует водопад для параметрически заданной поверхности @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. График удобен для построения нескольких кривых, сдвинутых вглубь друг относительно друга. Если @var{sch} содержит @samp{x}, то линии рисуются вдоль оси x, иначе (по умолчанию) вдоль оси y. См. также @ref{belt}, @ref{mesh}, @ref{tens}, @ref{meshnum}. @sref{fall sample}
 @end deftypefn
 
 @anchor{belt}
@@ -2551,7 +2763,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}
@@ -2563,19 +2775,22 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_boxs (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_boxs_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]@}. См. также @ref{surf}, @ref{dens}, @ref{tile}, @ref{step}. @sref{Boxs sample}
+Рисует вертикальные ящики для параметрически заданной поверхности @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. См. также @ref{surf}, @ref{dens}, @ref{tile}, @ref{step}. @sref{boxs sample}
 @end deftypefn
 
 @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}
@@ -2587,7 +2802,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_dens (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_dens_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{z} равном минимальному значению оси z. Если @var{sch} содержит @samp{#}, то рисуется сетка. Если @var{sch} содержит @samp{.}, то рисуется поверхность из точек. См. также @ref{surf}, @ref{cont}, @ref{contf}, @ref{boxs}, @ref{tile}, @code{dens[xyz]}. @sref{Dens sample}
+Рисует график плотности для параметрически заданной поверхности @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} при @var{z} равном минимальному значению оси z. Если @var{sch} содержит @samp{#}, то рисуется сетка. Если @var{sch} содержит @samp{.}, то рисуется поверхность из точек. См. также @ref{surf}, @ref{cont}, @ref{contf}, @ref{boxs}, @ref{tile}, @code{dens[xyz]}. @sref{dens sample}
 @end deftypefn
 
 @anchor{cont}
@@ -2599,7 +2814,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_cont__val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {Функция С} @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
-Рисует линии уровня для параметрически заданной поверхности @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} при @var{z=v}[k] или при @var{z}  равном минимальному значению оси z если @var{sch} содержит @samp{_}. Линии уровня рисуются для @var{z}[i,j]=@var{v}[k]. Если @var{sch} содержит @samp{t} или @samp{T}, то значения @var{v}[k] будут выведены вдоль контуров над (или под) кривой. См. также @ref{dens}, @ref{contf}, @ref{contd}, @ref{axial}, @code{cont[xyz]}. @sref{Cont sample}
+Рисует линии уровня для параметрически заданной поверхности @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} при @var{z=v}[k] или при @var{z}  равном минимальному значению оси z если @var{sch} содержит @samp{_}. Линии уровня рисуются для @var{z}[i,j]=@var{v}[k]. Если @var{sch} содержит @samp{t} или @samp{T}, то значения @var{v}[k] будут выведены вдоль контуров над (или под) кривой. См. также @ref{dens}, @ref{contf}, @ref{contd}, @ref{axial}, @code{cont[xyz]}. @sref{cont sample}
 @end deftypefn
 
 @deftypefn {Команда MGL} {} cont zdat ['sch'='']
@@ -2610,7 +2825,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_cont (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_cont_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
 @end ifclear
-Как предыдущий с вектором @var{v} из @var{num} элементов равно распределенных в диапазоне изменения цвета. Здесь @var{num} равен значению параметра @code{value} в опциях @var{opt} (по умолчанию 7).
+Как предыдущий с вектором @var{v} из @var{num} элементов равно распределенных в диапазоне изменения цвета. Здесь @var{num} равен значению параметра @code{value} в опциях @var{opt} (по умолчанию 7). Если @var{sch} содержит @samp{.}, то будут строится только контуры по уровням седловых точек.
 @end deftypefn
 
 @anchor{contf}
@@ -2622,7 +2837,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_contf_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_contf_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
-Рисует закрашенные линии (контуры) уровня для параметрически заданной поверхности @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} при @var{z=v}[k] или при @var{z}  равном минимальному значению оси z если @var{sch} содержит @samp{_}. Линии уровня рисуются для @var{z}[i,j]=@var{v}[k]. См. также @ref{dens}, @ref{cont}, @ref{contd}, @code{contf[xyz]}. @sref{ContF sample}
+Рисует закрашенные линии (контуры) уровня для параметрически заданной поверхности @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} при @var{z=v}[k] или при @var{z}  равном минимальному значению оси z если @var{sch} содержит @samp{_}. Линии уровня рисуются для @var{z}[i,j]=@var{v}[k]. См. также @ref{dens}, @ref{cont}, @ref{contd}, @code{contf[xyz]}. @sref{contf sample}
 @end deftypefn
 
 @deftypefn {Команда MGL} {} contf zdat ['sch'='']
@@ -2645,7 +2860,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_contd_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_contd_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
-Рисует закрашенные линии (контуры) уровня для параметрически заданной поверхности @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} при @var{z=v}[k] или при @var{z}  равном минимальному значению оси z если @var{sch} содержит @samp{_}. Линии уровня рисуются для @var{z}[i,j]=@var{v}[k]. Строка @var{sch} задает цвета контуров: цвет k-го контура определяется как k-ый цвет строки. См. также @ref{dens}, @ref{cont}, @ref{contf}. @sref{ContD sample}
+Рисует закрашенные линии (контуры) уровня для параметрически заданной поверхности @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} при @var{z=v}[k] или при @var{z}  равном минимальному значению оси z если @var{sch} содержит @samp{_}. Линии уровня рисуются для @var{z}[i,j]=@var{v}[k]. Строка @var{sch} задает цвета контуров: цвет k-го контура определяется как k-ый цвет строки. См. также @ref{dens}, @ref{cont}, @ref{contf}. @sref{contd sample}
 @end deftypefn
 
 @deftypefn {Команда MGL} {} contd zdat ['sch'='']
@@ -2659,6 +2874,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{contp 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'='']
@@ -2668,7 +2901,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_contv_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_contv_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
-Рисует вертикальные цилиндры от линий уровня для параметрически заданной поверхности @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} при @var{z}=@var{v}[k] или при @var{z}  равном минимальному значению оси z если @var{sch} содержит @samp{_}. Линии уровня рисуются для @var{z}[i,j]=@var{v}[k]. См. также @ref{cont}, @ref{contf}. @sref{ContV sample}
+Рисует вертикальные цилиндры от линий уровня для параметрически заданной поверхности @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} при @var{z}=@var{v}[k] или при @var{z}  равном минимальному значению оси z если @var{sch} содержит @samp{_}. Линии уровня рисуются для @var{z}[i,j]=@var{v}[k]. См. также @ref{cont}, @ref{contf}. @sref{contv sample}
 @end deftypefn
 
 @deftypefn {Команда MGL} {} contv zdat ['sch'='']
@@ -2691,7 +2924,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_axial_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_axial_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
-Рисует поверхность вращения линии уровня для параметрически заданной поверхности @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. Линии уровня рисуются для @var{z}[i,j]=@var{v}[k]. Если @var{sch} содержит @samp{#}, то рисуется сетчатая поверхность. Если @var{sch} содержит @samp{.}, то рисуется поверхность из точек. Если строка содержит символы @samp{x} или @samp{z}, то ось вращения устанавливается в указанное направление (по умолчанию вдоль @samp{y}). См. также @ref{cont}, @ref{contf}, @ref{torus}, @ref{surf3}. @sref{Axial sample}
+Рисует поверхность вращения линии уровня для параметрически заданной поверхности @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. Линии уровня рисуются для @var{z}[i,j]=@var{v}[k]. Если @var{sch} содержит @samp{#}, то рисуется сетчатая поверхность. Если @var{sch} содержит @samp{.}, то рисуется поверхность из точек. Если строка содержит символы @samp{x} или @samp{z}, то ось вращения устанавливается в указанное направление (по умолчанию вдоль @samp{y}). См. также @ref{cont}, @ref{contf}, @ref{torus}, @ref{surf3}. @sref{axial sample}
 @end deftypefn
 
 @deftypefn {Команда MGL} {} axial zdat ['sch'='']
@@ -2731,7 +2964,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @cindex Cloud
 @cindex Beam
 
-Эти функции строят графики для трехмерных (3D) массивов. Трёхмерными считаются массивы, зависящие от трёх параметров (индексов) подобно матрице @math{f(x_i,y_j,z_k), i=1...n, j=1...m, k=1...l}. По умолчанию (если отсутствуют) значения @var{x}, @var{y}, @var{z} равно распределены в диапазоне осей координат. Младшие размерности массивов @var{x}, @var{y}, @var{z} должны быть одинаковы @code{x.nx=a.nx && y.nx=a.ny && z.nz=a.nz} или @code{x.nx=y.nx=z.nx=a.nx && x.ny=y.ny=z.ny=a.ny && x.nz=y.nz=z.nz=a.nz}. Массивы @var{x}, @var{y} и @var{z} могут быть векторами (не матрицами как @var{a}). Строка @var{sch} задает цветовую схему (см. @ref{Color scheme}). Строка @var{opt} задает опции графика (см. @ref{Command options}). @sref{3D samples}
+Эти функции строят графики для трехмерных (3D) массивов. Трёхмерными считаются массивы, зависящие от трёх параметров (индексов) подобно матрице @math{f(x_i,y_j,z_k), i=1...n, j=1...m, k=1...l}. По умолчанию (если отсутствуют) значения @var{x}, @var{y}, @var{z} равно распределены в диапазоне осей координат. Младшие размерности массивов @var{x}, @var{y}, @var{z} должны быть одинаковы @code{x.nx=a.nx && y.nx=a.ny && z.nz=a.nz} или @code{x.nx=y.nx=z.nx=a.nx && x.ny=y.ny=z.ny=a.ny && x.nz=y.nz=z.nz=a.nz}. Массивы @var{x}, @var{y} и @var{z} могут быть векторами (не матрицами как @var{a}). Строка @var{sch} задает цветовую схему (см. @ref{Color scheme}). Строка @var{opt} задает опции графика (см. @ref{Command options}).
 
 
 @anchor{surf3}
@@ -2743,7 +2976,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_surf3_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_surf3_xyz_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt)
 @end ifclear
-Рисует поверхность уровня для 3d массива, заданного параметрически @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) при @var{a}(x,y,z)=@var{val}. Если @var{sch} содержит @samp{#}, то рисуется сетчатая поверхность. Если @var{sch} содержит @samp{.}, то рисуется поверхность из точек. Замечу, что возможно некорректная отрисовка граней вследствие неопределённости построения сечения если поверхность пересекает ячейку данных 2 и более раз. См. также @ref{cloud}, @ref{dens3}, @ref{surf3c}, @ref{surf3a}, @ref{axial}. @sref{Surf3 sample}
+Рисует поверхность уровня для 3d массива, заданного параметрически @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) при @var{a}(x,y,z)=@var{val}. Если @var{sch} содержит @samp{#}, то рисуется сетчатая поверхность. Если @var{sch} содержит @samp{.}, то рисуется поверхность из точек. Замечу, что возможно некорректная отрисовка граней вследствие неопределённости построения сечения если поверхность пересекает ячейку данных 2 и более раз. См. также @ref{cloud}, @ref{dens3}, @ref{surf3c}, @ref{surf3a}, @ref{axial}. @sref{surf3 sample}
 @end deftypefn
 
 @deftypefn {Команда MGL} {} surf3 adat ['sch'='']
@@ -2766,7 +2999,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_cloud (@code{HMGL} gr, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_cloud_xyz (@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
-Рисует облачный график для 3d массива, заданного параметрически @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]). График состоит из кубиков с цветом и прозрачностью пропорциональной значениям @var{a}. Результат похож на облако -- малые значения прозрачны, а большие нет. Число кубиков зависит от @ref{meshnum}. Если @var{sch} содержит @samp{.}, то будет построен график более низкого качества, но с заметно меньшим использованием памяти. Если @var{sch} содержит @samp{i}, то прозрачность будет инвертирована, т.е. области с более высокими значениями будут более прозрачны, а с более низким -- менее прозрачны. См. также @ref{surf3}, @ref{meshnum}. @sref{Cloud sample}
+Рисует облачный график для 3d массива, заданного параметрически @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]). График состоит из кубиков с цветом и прозрачностью пропорциональной значениям @var{a}. Результат похож на облако -- малые значения прозрачны, а большие нет. Число кубиков зависит от @ref{meshnum}. Если @var{sch} содержит @samp{.}, то будет построен график более низкого качества, но с заметно меньшим использованием памяти. Если @var{sch} содержит @samp{i}, то прозрачность будет инвертирована, т.е. области с более высокими значениями будут более прозрачны, а с более низким -- менее прозрачны. См. также @ref{surf3}, @ref{meshnum}. @sref{cloud sample}
 @end deftypefn
 
 @anchor{dens3}
@@ -2778,7 +3011,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_dens3 (@code{HMGL} gr, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_dens3_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt)
 @end ifclear
-Рисует график плотности для 3d массива, заданного параметрически @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]). График рисуется на срезе @var{sVal} в направлении @{@samp{x}, @samp{y}, @samp{z}@}, указанном в строке @var{sch} (по умолчанию, в напралении @samp{y}). Если @var{sch} содержит @samp{#}, то на срезе рисуется сетка. См. также @ref{cont3}, @ref{contf3}, @ref{dens}, @ref{grid3}. @sref{Dens3 sample}
+Рисует график плотности для 3d массива, заданного параметрически @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]). График рисуется на срезе @var{sVal} в направлении @{@samp{x}, @samp{y}, @samp{z}@}, указанном в строке @var{sch} (по умолчанию, в напралении @samp{y}). Если @var{sch} содержит @samp{#}, то на срезе рисуется сетка. См. также @ref{cont3}, @ref{contf3}, @ref{dens}, @ref{grid3}. @sref{dens3 sample}
 @end deftypefn
 
 @anchor{cont3}
@@ -2790,7 +3023,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_cont3_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_cont3_xyz_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt)
 @end ifclear
-Рисует линии уровня для 3d массива, заданного параметрически @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]). Линии рисуются для значений из массива @var{v} на срезе @var{sVal} в направлении @{@samp{x}, @samp{y}, @samp{z}@}, указанном в строке @var{sch} (по умолчанию, в напралении @samp{y}). Если @var{sch} содержит @samp{#}, то на срезе рисуется сетка. Если @var{sch} содержит @samp{t} или @samp{T}, то значения @var{v}[k] будут выведены вдоль контуров над (или под) кривой. См. также @ref{dens3}, @ref{contf3}, @ref{cont}, @ref{grid3}. @sref{Cont3 sample}
+Рисует линии уровня для 3d массива, заданного параметрически @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]). Линии рисуются для значений из массива @var{v} на срезе @var{sVal} в направлении @{@samp{x}, @samp{y}, @samp{z}@}, указанном в строке @var{sch} (по умолчанию, в напралении @samp{y}). Если @var{sch} содержит @samp{#}, то на срезе рисуется сетка. Если @var{sch} содержит @samp{t} или @samp{T}, то значения @var{v}[k] будут выведены вдоль контуров над (или под) кривой. См. также @ref{dens3}, @ref{contf3}, @ref{cont}, @ref{grid3}. @sref{cont3 sample}
 @end deftypefn
 
 @deftypefn {Команда MGL} {} cont3 adat ['sch'='' @code{sval=-1}]
@@ -2813,7 +3046,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_contf3_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_contf3_xyz_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt)
 @end ifclear
-Рисует закрашенные линии (контуры) уровня для 3d массива, заданного параметрически @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]). Линии рисуются для значений из массива @var{v} на срезе @var{sVal} в направлении @{@samp{x}, @samp{y}, @samp{z}@}, указанном в строке @var{sch} (по умолчанию, в напралении @samp{y}). Если @var{sch} содержит @samp{#}, то на срезе рисуется сетка. См. также @ref{dens3}, @ref{cont3}, @ref{contf}, @ref{grid3}. @sref{ContF3 sample}
+Рисует закрашенные линии (контуры) уровня для 3d массива, заданного параметрически @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]). Линии рисуются для значений из массива @var{v} на срезе @var{sVal} в направлении @{@samp{x}, @samp{y}, @samp{z}@}, указанном в строке @var{sch} (по умолчанию, в напралении @samp{y}). Если @var{sch} содержит @samp{#}, то на срезе рисуется сетка. См. также @ref{dens3}, @ref{cont3}, @ref{contf}, @ref{grid3}. @sref{contf3 sample}
 @end deftypefn
 
 @deftypefn {Команда MGL} {} contf3 adat ['sch'='' @code{sval=-1}]
@@ -2876,9 +3109,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{beltc sample}
 @end deftypefn
 
+
 @anchor{surf3c}
 @deftypefn {Команда MGL} {} surf3c adat cdat @code{val} ['sch'='']
 @deftypefnx {Команда MGL} {} surf3c xdat ydat zdat adat cdat @code{val} ['sch'='']
@@ -2888,7 +3135,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_surf3c_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_surf3c_xyz_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt)
 @end ifclear
-Рисует поверхность уровня для 3d массива, заданного параметрически @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) при @var{a}(x,y,z)=@var{val}. Аналогично @ref{surf3}, но цвет задается массивом @var{c}. Если @var{sch} содержит @samp{#}, то рисуется сетчатая поверхность. Если @var{sch} содержит @samp{.}, то рисуется поверхность из точек. См. также @ref{surf3}, @ref{surfc}, @ref{surf3a}. @sref{Surf3C sample}
+Рисует поверхность уровня для 3d массива, заданного параметрически @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) при @var{a}(x,y,z)=@var{val}. Аналогично @ref{surf3}, но цвет задается массивом @var{c}. Если @var{sch} содержит @samp{#}, то рисуется сетчатая поверхность. Если @var{sch} содержит @samp{.}, то рисуется поверхность из точек. См. также @ref{surf3}, @ref{surfc}, @ref{surf3a}. @sref{surf3c sample}
 @end deftypefn
 
 @deftypefn {Команда MGL} {} surf3c adat cdat ['sch'='']
@@ -2912,7 +3159,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_surfa (@code{HMGL} gr, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_surfa_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{surfc}, @ref{surf3a}. @sref{SurfA 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{surfc}, @ref{surf3a}. @sref{surfa sample}
 @end deftypefn
 
 @anchor{surf3a}
@@ -2924,7 +3171,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_surf3a_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_surf3a_xyz_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt)
 @end ifclear
-Рисует поверхность уровня для 3d массива, заданного параметрически @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) при @var{a}(x,y,z)=@var{val}. Аналогично @ref{surf3}, но прозрачность задается массивом @var{c}. Если @var{sch} содержит @samp{#}, то рисуется сетчатая поверхность. Если @var{sch} содержит @samp{.}, то рисуется поверхность из точек. См. также @ref{surf3}, @ref{surfc}, @ref{surf3a}. @sref{Surf3A sample}
+Рисует поверхность уровня для 3d массива, заданного параметрически @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) при @var{a}(x,y,z)=@var{val}. Аналогично @ref{surf3}, но прозрачность задается массивом @var{c}. Если @var{sch} содержит @samp{#}, то рисуется сетчатая поверхность. Если @var{sch} содержит @samp{.}, то рисуется поверхность из точек. См. также @ref{surf3}, @ref{surfc}, @ref{surf3a}. @sref{surf3a sample}
 @end deftypefn
 
 @deftypefn {Команда MGL} {} surf3a adat cdat ['sch'='']
@@ -2949,7 +3196,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_surfca (@code{HMGL} gr, @code{HCDT} z, @code{HCDT} c, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_surfca_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @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{c}[i,j] и @var{a}[i,j] соответственно. Если @var{sch} содержит @samp{#}, то на поверхности рисуется сетка. Если @var{sch} содержит @samp{.}, то рисуется поверхность из точек. Размерность массивов @var{z} и @var{c} должна быть одинакова. График строится для каждого z среза данных. См. также @ref{surf}, @ref{surfc}, @ref{surfa}, @ref{surf3ca}. @sref{SurfCA sample}
+Рисует параметрически заданную поверхность @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} с цветом и прозрачностью, заданными массивами @var{c}[i,j] и @var{a}[i,j] соответственно. Если @var{sch} содержит @samp{#}, то на поверхности рисуется сетка. Если @var{sch} содержит @samp{.}, то рисуется поверхность из точек. Размерность массивов @var{z} и @var{c} должна быть одинакова. График строится для каждого z среза данных. См. также @ref{surf}, @ref{surfc}, @ref{surfa}, @ref{surf3ca}. @sref{surfca sample}
 @end deftypefn
 
 @anchor{surf3ca}
@@ -2961,7 +3208,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_surf3ca_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} a, @code{HCDT} c, @code{HCDT} b, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_surf3ca_xyz_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{HCDT} c, @code{HCDT} b, @code{const char *}sch, @code{const char *}opt)
 @end ifclear
-Рисует поверхность уровня для 3d массива, заданного параметрически @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) при @var{a}(x,y,z)=@var{val}. Аналогично @ref{surf3}, но цвет и прозрачность задается массивами @var{c} и @var{b} соответственно. Если @var{sch} содержит @samp{#}, то рисуется сетчатая поверхность. Если @var{sch} содержит @samp{.}, то рисуется поверхность из точек. См. также @ref{surf3}, @ref{surfc}, @ref{surf3a}. @sref{Surf3A sample}
+Рисует поверхность уровня для 3d массива, заданного параметрически @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) при @var{a}(x,y,z)=@var{val}. Аналогично @ref{surf3}, но цвет и прозрачность задается массивами @var{c} и @var{b} соответственно. Если @var{sch} содержит @samp{#}, то рисуется сетчатая поверхность. Если @var{sch} содержит @samp{.}, то рисуется поверхность из точек. См. также @ref{surf3}, @ref{surfc}, @ref{surf3a}. @sref{surf3a sample}
 @end deftypefn
 
 @deftypefn {Команда MGL} {} surf3ca adat cdat ['sch'='']
@@ -2979,13 +3226,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}
@@ -3009,7 +3259,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_stfa (@code{HMGL} gr, @code{HCDT} re, @code{HCDT} im, @code{int} dn, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_stfa_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} re, @code{HCDT} im, @code{int} dn, @code{const char *}sch, @code{const char *}opt)
 @end ifclear
-Рисует спектрограмму комплексного массива @var{re}+i*@var{im} для Фурье размером @var{dn} точек в плоскости @var{z} равно минимальному значению оси z. Параметр @var{dn} -- любое чётное число. Например в 1D случае, результатом будет график плотности от массива @math{res[i,j]=|\sum_d^dn exp(I*j*d)*(re[i*dn+d]+I*im[i*dn+d])|/dn} размером @{int(nx/dn), dn, ny@}. Массивы @var{re}, @var{im} параметрически зависят от координат @var{x}, @var{y}. Все размеры массивов @var{re} и @var{im} должны быть одинаковы. Младшие размерности массивов @var{x}, @var{y}, @var{re} должны быть одинаковы. Массивы @var{x} и @var{y} могут быть векторами (не матрицами как @var{re}). @sref{STFA sample}
+Рисует спектрограмму комплексного массива @var{re}+i*@var{im} для Фурье размером @var{dn} точек в плоскости @var{z} равно минимальному значению оси z. Параметр @var{dn} -- любое чётное число. Например в 1D случае, результатом будет график плотности от массива @math{res[i,j]=|\sum_d^dn exp(I*j*d)*(re[i*dn+d]+I*im[i*dn+d])|/dn} размером @{int(nx/dn), dn, ny@}. Массивы @var{re}, @var{im} параметрически зависят от координат @var{x}, @var{y}. Все размеры массивов @var{re} и @var{im} должны быть одинаковы. Младшие размерности массивов @var{x}, @var{y}, @var{re} должны быть одинаковы. Массивы @var{x} и @var{y} могут быть векторами (не матрицами как @var{re}). @sref{stfa sample}
 @end deftypefn
 
 
@@ -3036,7 +3286,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_traj_xyz (@code{HMGL} gr, @code{HCDT}x, @code{HCDT}y, @code{HCDT}z, @code{HCDT}ax, @code{HCDT}ay, @code{HCDT}az, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_traj_xy (@code{HMGL} gr, @code{HCDT}x, @code{HCDT}y, @code{HCDT}ax, @code{HCDT}ay, @code{const char *}sch, @code{const char *}opt)
 @end ifclear
-Рисует вектора @{@var{ax}, @var{ay}, @var{az}@} вдоль кривой @{@var{x}, @var{y}, @var{z}@}. Длина векторов пропорциональна @math{\sqrt@{ax^2+ay^2+az^2@}}. Строка @var{pen} задает цвет (см. @ref{Line styles}). По умолчанию (@code{pen=""}) используется текущий цвет из палитры (см. @ref{Palette and colors}). Опция @code{value} задает фактор длины векторов (если не нуль) или выбирать длину пропорционально расстоянию между точками кривой (если @code{value=0}). Размер по 1-му индексу должен быть 2 или больше. График рисуется для каждой строки если один из массивов матрица. См. также @ref{vect}. @sref{Traj sample}
+Рисует вектора @{@var{ax}, @var{ay}, @var{az}@} вдоль кривой @{@var{x}, @var{y}, @var{z}@}. Длина векторов пропорциональна @math{\sqrt@{ax^2+ay^2+az^2@}}. Строка @var{pen} задает цвет (см. @ref{Line styles}). По умолчанию (@code{pen=""}) используется текущий цвет из палитры (см. @ref{Palette and colors}). Опция @code{value} задает фактор длины векторов (если не нуль) или выбирать длину пропорционально расстоянию между точками кривой (если @code{value=0}). Размер по 1-му индексу должен быть 2 или больше. График рисуется для каждой строки если один из массивов матрица. См. также @ref{vect}. @sref{traj sample}
 @end deftypefn
 
 @anchor{vect}
@@ -3059,7 +3309,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @item
 @samp{=} для использования градиента цвета вдоль стрелок.
 @end itemize
-См. также @ref{flow}, @ref{dew}. @sref{Vect sample}
+См. также @ref{flow}, @ref{dew}. @sref{vect sample}
 @end deftypefn
 
 @deftypefn {Команда MGL} {} vect udat vdat wdat ['sch'='']
@@ -3093,7 +3343,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @item
 @samp{=} для использования градиента цвета вдоль стрелок.
 @end itemize
-См. также @ref{vect}, @ref{flow}, @ref{dew}. @sref{Vect sample}
+См. также @ref{vect}, @ref{flow}, @ref{dew}. @sref{vect sample}
 @end deftypefn
 
 @anchor{dew}
@@ -3105,7 +3355,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_dew (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_dew_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt)
 @end ifclear
-Рисует капли для векторного поля @{@var{ax}, @var{ay}@}, параметрически зависящего от координат @var{x}, @var{y} при @var{z} равном минимальному значению оси z. Замечу, что график требует много памяти и процессорного времени для своего создания! Цвет капель пропорционален @math{\sqrt@{ax^2+ay^2@}}. Число капель определяется @ref{meshnum}. См. также @ref{vect}. @sref{Dew sample}
+Рисует капли для векторного поля @{@var{ax}, @var{ay}@}, параметрически зависящего от координат @var{x}, @var{y} при @var{z} равном минимальному значению оси z. Замечу, что график требует много памяти и процессорного времени для своего создания! Цвет капель пропорционален @math{\sqrt@{ax^2+ay^2@}}. Число капель определяется @ref{meshnum}. См. также @ref{vect}. @sref{dew sample}
 @end deftypefn
 
 @anchor{flow}
@@ -3124,13 +3374,15 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @item
 @samp{#} для использования нитей, начинающихся только на границе;
 @item
+@samp{.} для рисования сепаратрис (нитей из/в стационарных точек).
+@item
 @samp{*} для использования нитей, начинающихся с двумерной сетки внутри данных;
 @item
 @samp{v} для рисования стрелок на нитях;
 @item
 @samp{x}, @samp{z} для рисования лент нормалей, начинающихся в плоскостях x-y и y-z соответственно.
 @end itemize
-См. также @ref{pipe}, @ref{vect}, @ref{tape}, @ref{barwidth}. @sref{Flow sample}
+См. также @ref{pipe}, @ref{vect}, @ref{tape}, @ref{flow3}, @ref{barwidth}. @sref{flow sample}
 @end deftypefn
 
 @deftypefn {Команда MGL} {} flow udat vdat wdat ['sch'='']
@@ -3166,6 +3418,30 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 Это 3d версия графика.
 @end deftypefn
 
+@anchor{flow3}
+@deftypefn {MGL command} {} flow3 udat vdat wdat ['sch'='']
+@deftypefnx {MGL command} {} flow3 xdat ydat zdat udat vdat ['sch'='']
+@ifclear UDAV
+@deftypefnx {Method on @code{mglGraph}} @code{void} Flow3 (@code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{double} sVal=@code{-1}, @code{const char *}opt=@code{""})
+@deftypefnx {Method on @code{mglGraph}} @code{void} Flow3 (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{double} sVal=@code{-1}, @code{const char *}opt=@code{""})
+@deftypefnx {C function} @code{void} mgl_flow3 (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{HCDT} az, @code{const char *}sch, @code{double} sVal, @code{const char *}opt)
+@deftypefnx {C function} @code{void} mgl_flow3_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} ax, @code{HCDT} ay, @code{HCDT} az, @code{const char *}sch, @code{double} sVal, @code{const char *}opt)
+@end ifclear
+The function draws flow threads for the 3D vector field @{@var{ax}, @var{ay}, @var{az}@} parametrically depending on coordinates @var{x}, @var{y}, @var{z}. Flow threads starts from given plane. Option @code{value} set the approximate number of threads (default is 5). String @var{sch} may contain:
+@itemize @bullet
+@item
+color scheme -- up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source);
+@item
+@samp{x}, @samp{z} for normal of starting plane (default is y-direction);
+@item
+@samp{v} for drawing arrows on the threads;
+@item
+@samp{t} for drawing tapes of normals in x-y and y-z planes.
+@end itemize
+See also @ref{flow}, @ref{pipe}, @ref{vect}. @sref{flow3 sample}
+@end deftypefn
+
+
 @anchor{grad}
 @deftypefn {Команда MGL} {} grad pdat ['sch'='']
 @deftypefnx {Команда MGL} {} grad xdat ydat pdat ['sch'='']
@@ -3190,7 +3466,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_pipe_2d (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{mreal} r0, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_pipe_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{mreal} r0, @code{const char *}opt)
 @end ifclear
-Рисует трубки тока для векторного поля @{@var{ax}, @var{ay}@}, параметрически зависящего от координат @var{x}, @var{y} на плоскости при @var{z} равном минимальному значению оси z. Число трубок пропорционально значению опции @code{value}. Цвет и радиус трубок пропорционален @math{\sqrt@{ax^2+ay^2@}}. Тёплые цвета соответствуют нормальному току (типа стока). Холодные цвета соответствуют обратному току (типа источника). Параметр @var{r0} задает радиус трубок. При @var{r0}<0 радиус трубок обратно пропорционален их амплитуде. См. также @ref{flow}, @ref{vect}. @sref{Pipe sample}
+Рисует трубки тока для векторного поля @{@var{ax}, @var{ay}@}, параметрически зависящего от координат @var{x}, @var{y} на плоскости при @var{z} равном минимальному значению оси z. Число трубок пропорционально значению опции @code{value}. Цвет и радиус трубок пропорционален @math{\sqrt@{ax^2+ay^2@}}. Тёплые цвета соответствуют нормальному току (типа стока). Холодные цвета соответствуют обратному току (типа источника). Параметр @var{r0} задает радиус трубок. При @var{r0}<0 радиус трубок обратно пропорционален их амплитуде. См. также @ref{flow}, @ref{vect}. @sref{pipe sample}
 @end deftypefn
 
 @deftypefn {Команда MGL} {} pipe udat vdat wdat ['sch'='' @code{r0=0.05}]
@@ -3235,7 +3511,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_dens_y (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_dens_z (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt)
 @end ifclear
-Эти функции рисуют график плотности на x, y или z плоскостях. Если @var{a} -- 3d массив, то выполняется интерполяция к заданному срезу @var{sVal}. Функции полезны для создания проекций 3D массивов на оси координат. См. также @ref{ContXYZ}, @ref{ContFXYZ}, @ref{dens}, @ref{Data manipulation}. @sref{Dens projection sample}
+Эти функции рисуют график плотности на x, y или z плоскостях. Если @var{a} -- 3d массив, то выполняется интерполяция к заданному срезу @var{sVal}. Функции полезны для создания проекций 3D массивов на оси координат. См. также @ref{ContXYZ}, @ref{ContFXYZ}, @ref{dens}, @ref{Data manipulation}. @sref{dens_xyz sample}
 @end deftypefn
 
 @anchor{contz} @anchor{conty} @anchor{contx} @anchor{ContXYZ}
@@ -3250,7 +3526,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_cont_y (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_cont_z (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt)
 @end ifclear
-Эти функции рисуют линии уровня на x, y или z плоскостях. Если @var{a} -- 3d массив, то выполняется интерполяция к заданному срезу @var{sVal}. Опция @code{value} задает число контуров. Функции полезны для создания проекций 3D массивов на оси координат. См. также @ref{ContFXYZ}, @ref{DensXYZ}, @ref{cont}, @ref{Data manipulation}. @sref{Cont projection sample}
+Эти функции рисуют линии уровня на x, y или z плоскостях. Если @var{a} -- 3d массив, то выполняется интерполяция к заданному срезу @var{sVal}. Опция @code{value} задает число контуров. Функции полезны для создания проекций 3D массивов на оси координат. См. также @ref{ContFXYZ}, @ref{DensXYZ}, @ref{cont}, @ref{Data manipulation}. @sref{cont_xyz sample}
 @end deftypefn
 
 @ifclear UDAV
@@ -3276,7 +3552,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_contf_y (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_contf_z (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt)
 @end ifclear
-Эти функции рисуют закрашенные контуры уровня на x, y или z плоскостях. Если @var{a} -- 3d массив, то выполняется интерполяция к заданному срезу @var{sVal}. Опция @code{value} задает число контуров. Функции полезны для создания проекций 3D массивов на оси координат. См. также @ref{ContFXYZ}, @ref{DensXYZ}, @ref{cont}, @ref{Data manipulation}. @sref{ContF projection sample}
+Эти функции рисуют закрашенные контуры уровня на x, y или z плоскостях. Если @var{a} -- 3d массив, то выполняется интерполяция к заданному срезу @var{sVal}. Опция @code{value} задает число контуров. Функции полезны для создания проекций 3D массивов на оси координат. См. также @ref{ContFXYZ}, @ref{DensXYZ}, @ref{cont}, @ref{Data manipulation}. @sref{contf_xyz sample}
 @end deftypefn
 
 @ifclear UDAV
@@ -3336,7 +3612,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_triplot_xyz (@code{HMGL} gr, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_triplot_xyzc (@code{HMGL} gr, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt)
 @end ifclear
-Рисует поверхность из треугольников. Вершины треугольников задаются индексами @var{id} в массиве точек @{@var{x}[i], @var{y}[i], @var{z}[i]@}. Строка @var{sch} задает цветовую схему. Если строка содержит @samp{#}, то рисуется сетчатая поверхность. Размер по 1-му индексу массива @var{id} должен быть 3 или больше. Массивы @var{x}, @var{y}, @var{z} должны иметь одинаковые размеры. Массив @var{c} задает цвет треугольников (если @var{id}.ny=@var{c}.nx) или цвет вершин (если @var{x}.nx=@var{c}.nx). См. также @ref{dots}, @ref{crust}, @ref{quadplot}, @ref{triangulation}. @sref{TriPlot and QuadPlot}
+Рисует поверхность из треугольников. Вершины треугольников задаются индексами @var{id} в массиве точек @{@var{x}[i], @var{y}[i], @var{z}[i]@}. Строка @var{sch} задает цветовую схему. Если строка содержит @samp{#}, то рисуется сетчатая поверхность. Размер по 1-му индексу массива @var{id} должен быть 3 или больше. Массивы @var{x}, @var{y}, @var{z} должны иметь одинаковые размеры. Массив @var{c} задает цвет треугольников (если @var{id}.ny=@var{c}.nx) или цвет вершин (если @var{x}.nx=@var{c}.nx). См. также @ref{dots}, @ref{crust}, @ref{quadplot}, @ref{triangulation}. @sref{triplot sample}
 @end deftypefn
 
 @anchor{tricont}
@@ -3368,7 +3644,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_quadplot_xyz (@code{HMGL} gr, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_quadplot_xyzc (@code{HMGL} gr, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt)
 @end ifclear
-Рисует поверхность из четырёхугольников. Вершины четырёхугольников задаются индексами @var{id} в массиве точек @{@var{x}[i], @var{y}[i], @var{z}[i]@}. Строка @var{sch} задает цветовую схему. Если строка содержит @samp{#}, то рисуется сетчатая поверхность. Размер по 1-му индексу массива @var{id} должен быть 4 или больше. Массивы @var{x}, @var{y}, @var{z} должны иметь одинаковые размеры. Массив @var{c} задает цвет четырёхугольников (если @var{id}.ny=@var{c}.nx) или цвет вершин (если @var{x}.nx=@var{c}.nx). См. также @ref{triplot}. @sref{TriPlot and QuadPlot}
+Рисует поверхность из четырёхугольников. Вершины четырёхугольников задаются индексами @var{id} в массиве точек @{@var{x}[i], @var{y}[i], @var{z}[i]@}. Строка @var{sch} задает цветовую схему. Если строка содержит @samp{#}, то рисуется сетчатая поверхность. Размер по 1-му индексу массива @var{id} должен быть 4 или больше. Массивы @var{x}, @var{y}, @var{z} должны иметь одинаковые размеры. Массив @var{c} задает цвет четырёхугольников (если @var{id}.ny=@var{c}.nx) или цвет вершин (если @var{x}.nx=@var{c}.nx). См. также @ref{triplot}. @sref{triplot sample}
 @end deftypefn
 
 @anchor{dots}
@@ -3382,7 +3658,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Функция С} @code{void} mgl_dots_a (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt)
 @deftypefnx {Функция С} @code{void} mgl_dots_ca (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt)
 @end ifclear
-Рисует произвольно расположенные точки @{@var{x}[i], @var{y}[i], @var{z}[i]@}. Строка @var{sch} задает цветовую схему и тип маркеров. Если определёны массивы @var{c}, @var{a} то они задают цвет и прозрачность точек соответственно. Непрозрачные точки с заданным цветом можно нарисовать с помощью @ref{tens}, используя стиль @samp{ .}. Массивы @var{x}, @var{y}, @var{z}, @var{a} должны иметь одинаковые размеры. См. также @ref{crust}, @ref{tens}, @ref{mark}, @ref{plot}. @sref{Dots sample}
+Рисует произвольно расположенные точки @{@var{x}[i], @var{y}[i], @var{z}[i]@}. Строка @var{sch} задает цветовую схему и тип маркеров. Если определёны массивы @var{c}, @var{a} то они задают цвет и прозрачность точек соответственно. Непрозрачные точки с заданным цветом можно нарисовать с помощью @ref{tens}, используя стиль @samp{ .}. Массивы @var{x}, @var{y}, @var{z}, @var{a} должны иметь одинаковые размеры. См. также @ref{crust}, @ref{tens}, @ref{mark}, @ref{plot}. @sref{dots sample}
 @end deftypefn
 
 @anchor{crust}
@@ -3391,7 +3667,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command
 @deftypefnx {Метод класса @code{mglGraph}} @code{void} Crust (@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_crust (@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], @var{y}[i], @var{z}[i]@}. Опция @var{value} задает радиус ошибки (увеличите для удаления дыр). Строка @var{sch} задает цветовую схему. Если строка содержит @samp{#}, то рисуется сетчатая поверхность. Массивы @var{x}, @var{y}, @var{z} должны иметь одинаковые размеры. См. также @ref{dots}, @ref{triplot}. @c @sref{Crust sample}
+Реконструирует и рисует поверхность по произвольно расположенным точкам @{@var{x}[i], @var{y}[i], @var{z}[i]@}. Опция @var{value} задает радиус ошибки (увеличите для удаления дыр). Строка @var{sch} задает цветовую схему. Если строка содержит @samp{#}, то рисуется сетчатая поверхность. Массивы @var{x}, @var{y}, @var{z} должны иметь одинаковые размеры. См. также @ref{dots}, @ref{triplot}. @c @sref{crust sample}
 @end deftypefn
 
 @c ##################################################################
index e5def93acb6822f5bdb6af39075be1494f94d8a4..236e2acf5ff5e3b0445e23bbb092f95659813250 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,25 @@ 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
 
+@deftypefn {MGL command} {} roots @sc{res} 'funcs' 'vars' ini
+@ifclear UDAV
+@deftypefnx {Method on @code{mglData}} @code{mglData} MultiRoots (@code{const char *}funcs, @code{const char *}vars) @code{const}
+@deftypefnx {Method on @code{mglDataC}} @code{mglDataC} MultiRoots (@code{const char *}funcs, @code{const char *}vars) @code{const}
+@deftypefnx {C function} @code{HMDT} mgl_find_roots_txt (@code{const char *}func, @code{const char *}vars, @code{HCDT} ini)
+@deftypefnx {C function} @code{HADT} mgl_find_roots_txt_c (@code{const char *}func, @code{const char *}vars, @code{HCDT} ini)
+@end ifclear
+Find roots of system of equations 'funcs'=0 for variables @var{vars} with initial guesses @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 +1079,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 +1193,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
 
@@ -1158,7 +1251,6 @@ Calculates one step of diffraction by finite-difference method with parameter @v
 @end itemize
 @end deftypefn
 
-
 @anchor{norm}
 @deftypefn {MGL command} {} norm dat @code{v1 v2 [sym=off dim=0]}
 @ifclear UDAV
@@ -1171,10 +1263,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
@@ -1194,6 +1286,35 @@ Normalizes data slice-by-slice along direction @var{dir} the data in slices to r
 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{coil}
+@deftypefn {MGL command} {} coil dat @code{v1 v2 [sep=on]}
+@ifclear UDAV
+@deftypefnx {Method on @code{mglData}} @code{void} Coil (@code{mreal} v1, @code{mreal} v2, @code{bool} sep=@code{true})
+@deftypefnx {C function} @code{void} mgl_data_coil (@code{HMDT} dat, @code{mreal} v1, @code{mreal} v2, @code{int} sep)
+@end ifclear
+Project the periodical data to range [@var{v1},@var{v2}] (like @code{mod()} function). Separate branches by @code{NAN} if @var{sep}=@code{true}.
+@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
@@ -1297,6 +1418,15 @@ The same as @ref{info} but immediately print to stdout.
 Prints all values of the data array @var{dat} as message.
 @end deftypefn
 
+@anchor{progress}
+@deftypefn {MGL command} {} progress @code{val max}
+@ifclear UDAV
+@deftypefnx {Method on @code{mglGraph}} @code{void} Progress (@code{int} val, @code{int} max)
+@deftypefnx {C function} @code{void} mgl_progress (@code{int} val, @code{int} max)
+@end ifclear
+Display progress of something as filled horizontal bar with relative length @var{val}/@var{max}. Note, it work now only in console and in FLTK-based applications, including @code{mgllab} and @code{mglview}.
+@end deftypefn
+
 
 @cindex GetNx
 @cindex GetNy
@@ -1365,6 +1495,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}
@@ -1559,9 +1706,11 @@ 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}
@@ -1573,6 +1722,16 @@ Does Fourier transform of complex data @var{re}+i*@var{im} in directions @var{di
 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{triangulate}
+@deftypefn {MGL command} {} triangulate dat xdat ydat
+@ifclear UDAV
+@deftypefnx {Global function} @code{mglData} mglTriangulation (@code{const mglDataA &}x, @code{const mglDataA &}y)
+@deftypefnx {C function} @code{void} mgl_triangulation_2d (@code{HCDT} x, @code{HCDT} y)
+@end ifclear
+Do Delone triangulation for 2d points and return result suitable for @ref{triplot} and @ref{tricont}. @sref{Making regular data}
+@end deftypefn
+
+
 @anchor{tridmat}
 @deftypefn {MGL command} {} tridmat @sc{res adat bdat cdat ddat} 'how'
 @ifclear UDAV
@@ -1604,9 +1763,21 @@ Data dimensions of arrays @var{A}, @var{B}, @var{C} should be equal. Also their
 @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
@@ -1620,11 +1791,13 @@ 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
-Solves ODE equations dx/dt = df(x). The functions @var{df} can be specified as string of ';'-separated textual formulas (argument @var{var} set the character ids of variables x[i]) or as callback function, which fill @code{dx} array for give @code{x}'s. Parameters @var{ini}, @var{dt}, @var{tmax} set initial values, time step and maximal time of the calculation. Result is data array with dimensions @{@var{n} * int(@var{tmax}/@var{dt}+1)@}.
+Solves ODE equations dx/dt = df(x). The functions @var{df} can be specified as string of ';'-separated textual formulas (argument @var{var} set the character ids of variables x[i]) or as callback function, which fill @code{dx} array for give @code{x}'s. Parameters @var{ini}, @var{dt}, @var{tmax} set initial values, time step and maximal time of the calculation. Function stop execution if @code{NAN} or @code{INF} values appears. Result is data array with dimensions @{@var{n} * @var{Nt}@}, where @var{Nt} <= int(@var{tmax}/@var{dt}+1)
 @end deftypefn
 
 @anchor{qo2d}
@@ -1712,7 +1885,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. See also @ref{ifs3d}, @ref{flame2d}. @sref{ifs2d sample}
 @end deftypefn
 
 @anchor{ifs3d}
@@ -1725,9 +1898,9 @@ 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{IFS sample}
+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. See also @ref{ifs2d}. @sref{ifs3d sample}
 @end deftypefn
 
 @anchor{ifsfile}
@@ -1738,7 +1911,7 @@ Value @code{dat[12,i]} is used as weight factor for i-th row of matrix @var{dat}
 @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.
+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. See also @ref{ifs2d}, @ref{ifs3d}.
 
 @verbatim
  binary
@@ -1758,6 +1931,42 @@ IFS file may contain several records. Each record contain the name of fractal (@
 @end verbatim
 @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. See also @ref{ifs2d}, @ref{ifs3d}. @sref{flame2d sample}
+@end deftypefn
+
 
 @c ------------------------------------------------------------------
 @external{}
@@ -1882,7 +2091,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)
@@ -1896,6 +2104,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 225bf120259fbc387fbd8000fbf78e3d276629fa..4383d6e760d39f91b8f7beb0b3107b425dc70ee5 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
@@ -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})
@@ -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,25 @@ Allocate memory and set data from variable argument list of @emph{double} values
 Возвращает массив корней уравнения 'func'=0 для переменной @var{var} с начальными положениями @var{ini}. Функция возвращает NULL или пустой массив если данные не могут быть созданы при данных значениях аргументов.
 @end deftypefn
 
+@deftypefn {Команда MGL} {} roots @sc{res} 'funcs' 'vars' ini
+@ifclear UDAV
+@deftypefnx {Метод класса @code{mglData}} @code{mglData} MultiRoots (@code{const char *}funcs, @code{const char *}vars) @code{const}
+@deftypefnx {Метод класса @code{mglDataC}} @code{mglDataC} MultiRoots (@code{const char *}funcs, @code{const char *}vars) @code{const}
+@deftypefnx {Функция С} @code{HMDT} mgl_find_roots_txt (@code{const char *}func, @code{const char *}vars, @code{HCDT} ini)
+@deftypefnx {Функция С} @code{HADT} mgl_find_roots_txt_c (@code{const char *}func, @code{const char *}vars, @code{HCDT} ini)
+@end ifclear
+Возвращает массив корней системы уравнений 'funcs'=0 для переменных @var{vars} с начальными значениями @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 +1065,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 +1179,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}
@@ -1156,8 +1249,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
@@ -1179,6 +1272,33 @@ These functions change the data in some direction like differentiations, integra
 Ограничивает амплитуду данных диапазоном [-@var{val},@var{val}]. При этом сохраняется исходный знак (фаза для комплексных чисел). Эквивалентно операции @code{a[i] *= abs(a[i])<val?1.:val/abs(a[i]);}.
 @end deftypefn
 
+@anchor{coil}
+@deftypefn {Команда MGL} {} coil dat @code{v1 v2 [sep=on]}
+@ifclear UDAV
+@deftypefnx {Метод класса @code{mglData}} @code{void} Coil (@code{mreal} v1, @code{mreal} v2, @code{bool} sep=@code{true})
+@deftypefnx {Функция С} @code{void} mgl_data_coil (@code{HMDT} dat, @code{mreal} v1, @code{mreal} v2, @code{int} sep)
+@end ifclear
+Проецирует периодические данные на диапазон [@var{v1},@var{v2}] (аналогично функции @code{mod()}). Разделяет ветки по значениям равным @code{NAN} если @var{sep}=@code{true}.
+@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
@@ -1283,6 +1403,15 @@ These functions change the data in some direction like differentiations, integra
 Печатает все значения массива @var{dat} как сообщение.
 @end deftypefn
 
+@anchor{progress}
+@deftypefn {Команда MGL} {} progress @code{val max}
+@ifclear UDAV
+@deftypefnx {Метод класса @code{mglGraph}} @code{void} Progress (@code{int} val, @code{int} max)
+@deftypefnx {Функция С} @code{void} mgl_progress (@code{int} val, @code{int} max)
+@end ifclear
+Отображает прогресс чего-либо как заполненную полоску с относительной длиной @var{val}/@var{max}. На данный момент работает только в консоли и основанных на FLTK программах, включая @code{mgllab} и @code{mglview}.
+@end deftypefn
+
 
 @cindex GetNx
 @cindex GetNy
@@ -1350,6 +1479,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}
@@ -1525,7 +1670,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{ } -- нет преобразования.
@@ -1534,7 +1679,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} комплексных чисел.
@@ -1544,26 +1689,38 @@ 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{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{triangulate}
+@deftypefn {Команда MGL} {} triangulate dat xdat ydat
+@ifclear UDAV
+@deftypefnx {Общая функция} @code{mglData} mglTriangulation (@code{const mglDataA &}x, @code{const mglDataA &}y)
+@deftypefnx {Функция С} @code{void} mgl_triangulation_2d (@code{HCDT} x, @code{HCDT} y)
+@end ifclear
+Выполняет триангуляцию Делоне для точек на плоскости и возвращает массив, пригодный для @ref{triplot} и @ref{tricont}. @sref{Making regular data}
+@end deftypefn
+
 @anchor{tridmat}
 @deftypefn {Команда MGL} {} 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 {Общая функция} @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
@@ -1584,16 +1741,29 @@ These functions change the data in some direction like differentiations, integra
 @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) @}.
@@ -1602,21 +1772,23 @@ 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
-РеÑ\88аеÑ\82 Ñ\81иÑ\81Ñ\82емÑ\83 Ð¾Ð±Ñ\8bкновеннÑ\8bÑ\85 Ð´Ð¸Ñ\84Ñ\84еÑ\80енÑ\86иалÑ\8cнÑ\8bÑ\85 Ñ\83Ñ\80авнений dx/dt = df(x). Ð¤Ñ\83нкÑ\86ии @var{df} Ð¼Ð¾Ð³Ñ\83Ñ\82 Ð±Ñ\8bÑ\82Ñ\8c Ð·Ð°Ð´Ð°Ð½Ð½Ñ\8b Ñ\81Ñ\82Ñ\80окой Ñ\81 Ñ\80азделеннÑ\8bми ';' Ñ\84оÑ\80мÑ\83лами (аÑ\80гÑ\83менÑ\82 @var{var} Ð·Ð°Ð´Ð°ÐµÑ\82 Ñ\81имволÑ\8b Ð´Ð»Ñ\8f Ð¿ÐµÑ\80еменнÑ\8bÑ\85 x[i]) Ð¸Ð»Ð¸ Ñ\83казаÑ\82елем Ð½Ð° Ñ\84Ñ\83нкÑ\86иÑ\8e, ÐºÐ¾Ñ\82оÑ\80аÑ\8f Ð·Ð°Ð¿Ð¾Ð»Ð½Ñ\8fеÑ\82 @code{dx} Ð¿Ð¾ Ð·Ð°Ð´Ð°Ð½Ð½Ñ\8bм Ð·Ð½Ð°Ñ\87ениÑ\8fм @code{x}. Ð\9fаÑ\80амеÑ\82Ñ\80Ñ\8b @var{ini}, @var{dt}, @var{tmax} Ð·Ð°Ð´Ð°Ñ\8eÑ\82 Ð½Ð°Ñ\87алÑ\8cнÑ\8bе Ð·Ð½Ð°Ñ\87ениÑ\8f, Ñ\88аг Ð¸ Ð¼Ð°ÐºÑ\81ималÑ\8cное Ð²Ñ\80емÑ\8f Ð¸Ð½Ñ\82егÑ\80иÑ\80ованиÑ\8f. Ð ÐµÐ·Ñ\83лÑ\8cÑ\82аÑ\82 -- Ð¼Ð°Ñ\81Ñ\81ив Ñ\81 Ñ\80азмеÑ\80ом @{@var{n} * int(@var{tmax}/@var{dt}+1)@}.
+РеÑ\88аеÑ\82 Ñ\81иÑ\81Ñ\82емÑ\83 Ð¾Ð±Ñ\8bкновеннÑ\8bÑ\85 Ð´Ð¸Ñ\84Ñ\84еÑ\80енÑ\86иалÑ\8cнÑ\8bÑ\85 Ñ\83Ñ\80авнений dx/dt = df(x). Ð¤Ñ\83нкÑ\86ии @var{df} Ð¼Ð¾Ð³Ñ\83Ñ\82 Ð±Ñ\8bÑ\82Ñ\8c Ð·Ð°Ð´Ð°Ð½Ð½Ñ\8b Ñ\81Ñ\82Ñ\80окой Ñ\81 Ñ\80азделеннÑ\8bми ';' Ñ\84оÑ\80мÑ\83лами (аÑ\80гÑ\83менÑ\82 @var{var} Ð·Ð°Ð´Ð°ÐµÑ\82 Ñ\81имволÑ\8b Ð´Ð»Ñ\8f Ð¿ÐµÑ\80еменнÑ\8bÑ\85 x[i]) Ð¸Ð»Ð¸ Ñ\83казаÑ\82елем Ð½Ð° Ñ\84Ñ\83нкÑ\86иÑ\8e, ÐºÐ¾Ñ\82оÑ\80аÑ\8f Ð·Ð°Ð¿Ð¾Ð»Ð½Ñ\8fеÑ\82 @code{dx} Ð¿Ð¾ Ð·Ð°Ð´Ð°Ð½Ð½Ñ\8bм Ð·Ð½Ð°Ñ\87ениÑ\8fм @code{x}. Ð\9fаÑ\80амеÑ\82Ñ\80Ñ\8b @var{ini}, @var{dt}, @var{tmax} Ð·Ð°Ð´Ð°Ñ\8eÑ\82 Ð½Ð°Ñ\87алÑ\8cнÑ\8bе Ð·Ð½Ð°Ñ\87ениÑ\8f, Ñ\88аг Ð¸ Ð¼Ð°ÐºÑ\81ималÑ\8cное Ð²Ñ\80емÑ\8f Ð¸Ð½Ñ\82егÑ\80иÑ\80ованиÑ\8f. Ð¤Ñ\83нкÑ\86иÑ\8f Ð¾Ð±Ñ\80Ñ\8bваеÑ\82 Ñ\80аÑ\81Ñ\87еÑ\82 Ð¿Ñ\80и Ð¿Ð¾Ñ\8fвлении Ð·Ð½Ð°Ñ\87ений @code{NAN} Ð¸Ð»Ð¸ @code{INF}. Ð ÐµÐ·Ñ\83лÑ\8cÑ\82аÑ\82 -- Ð¼Ð°Ñ\81Ñ\81ив Ñ\80азмеÑ\80ом @{@var{n} * @var{Nt}@}, Ð³Ð´Ðµ @var{Nt} <= int(@var{tmax}/@var{dt}+1).
 @end deftypefn
 
 @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)
@@ -1628,10 +1800,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)
@@ -1643,8 +1815,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
@@ -1655,8 +1827,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
@@ -1666,15 +1838,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()}).
@@ -1685,7 +1857,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} используется для генерации в соответствии с формулами
@@ -1693,33 +1865,33 @@ 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. См. также @ref{ifs3d}, @ref{flame2d}. @sref{ifs2d 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[6,i]} -- весовой коэффициент для i-ой строки матрицы @var{dat}. Первые @var{skip} итераций будут опущены. Массив @var{dat} должен иметь размер по x больше или равный 13. @sref{IFS sample}
+Значение @code{dat[12,i]} -- весовой коэффициент для i-ой строки матрицы @var{dat}. Первые @var{skip} итераций будут опущены. Массив @var{dat} должен иметь размер по x больше или равный 13. См. также @ref{ifs2d}. @sref{ifs3d sample}
 @end deftypefn
 
 @anchor{ifsfile}
 @deftypefn {Команда MGL} {} 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 {Общая функция} @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 фрактал.
+Файл IFS может содержать несколько записей. Каждая запись содержит имя фрактала (@samp{binary} в примере ниже) и тело в фигурных скобках @{@} с параметрами фрактала. Символ @samp{;} начинает комментарий. Если имя содержит @samp{(3D)} или @samp{(3d)}, то определен 3d IFS фрактал. Пример содержит два фрактала: @samp{binary} -- обычный 2d фрактал, и @samp{3dfern (3D)} -- 3d фрактал. См. также @ref{ifs2d}, @ref{ifs3d}.
 
 @verbatim
  binary
@@ -1739,6 +1911,45 @@ z[i+1] = dat[6,i]*x[i] + dat[7,i]*y[i] + dat[8,i]*z[i] + dat[10,i];
 @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 больше или равный 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. См. также @ref{ifs2d}, @ref{ifs3d}. @sref{flame2d sample}
+@end deftypefn
+
+
+
 @c ------------------------------------------------------------------
 @external{}
 @node Evaluate expression, Special data classes, Global functions, Data processing
@@ -1872,6 +2083,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 4cf17a00ba3c9d1b93b84004e05475f0fb5725ce..d0163b2715269999a41c38b53393d92b673be280 100644 (file)
@@ -48,6 +48,7 @@ This file documents the Mathematical Graphic Library (MathGL), a collection of c
 * MGL scripts::
 * UDAV::
 * Other classes::
+* All samples::
 * Symbols and hot-keys::
 * File formats::
 * TeX-like symbols::
@@ -71,42 +72,12 @@ This file documents the Mathematical Graphic Library (MathGL), a collection of c
 <tr><td><img src="http://groups.google.com/intl/en/images/logos/groups_logo_sm.gif" height=25 width=117 alt="Google Groups"></td></tr>
 <tr><td style="padding-left: 5px;font-size: 110%"> <a target=_blank href="http://groups.google.com/group/mathgl"><b>MathGL</b></a> </td></tr>
 </table>
-
-<hr style="width: 100%; height: 1px;">
-<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
-<!-- 160x600, Vertical -->
-<ins class="adsbygoogle"
-     style="display:inline-block;width:160px;height:600px"
-     data-ad-client="ca-pub-1128070552722622"
-     data-ad-slot="2695178987"></ins>
-<script>
-(adsbygoogle = window.adsbygoogle || []).push({});
-</script>
 </nav>
 @end html
 @end macro
 
 @macro external {}
 @html
-<br><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
-<!-- Ref 728x15 -->
-<ins class="adsbygoogle"
-     style="display:inline-block;width:728px;height:15px"
-     data-ad-client="ca-pub-1128070552722622"
-     data-ad-slot="7008431385"></ins>
-<script>
-(adsbygoogle = window.adsbygoogle || []).push({});
-</script><br>
-@comment
-<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
-<!-- 728x90, Horizontal -->
-<ins class="adsbygoogle"
-     style="display:inline-block;width:728px;height:90px"
-     data-ad-client="ca-pub-1128070552722622"
-     data-ad-slot="9958083480"></ins>
-<script>
-(adsbygoogle = window.adsbygoogle || []).push({});
-</script><br/>
 <footer>
 <!--LiveInternet counter--><script type="text/javascript"><!--
 document.write("<a href='http://www.liveinternet.ru/click' "+
@@ -129,17 +100,17 @@ screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+
 @end macro
 
 @macro fig {fname,text}
-@center @image{../\fname\, 11cm, , \text\, png}
+@center @image{../\fname\.png, 11cm, , \text\, png}
 @end macro
 @macro pfig {fname,text}
-@center @uref{../pdf/\fname\.pdf, @image{../png/\fname\, 11cm, , \text\, png}}
+@center @uref{../pdf/\fname\.pdf, @image{../png/\fname\.png, 11cm, , \text\, png}}
 @c @center @image{../png/\fname\, 11cm, , \text\. See also @uref{../pdf/\fname\.pdf, 3D PDF} sample, .png}
 @end macro
 @macro ufig {fname,width,text}
-@center @image{../udav/\fname\, \width\cm, , \text\, png}
+@center @image{../udav/\fname\.png, \width\cm, , \text\, png}
 @end macro
 @macro sfig {plot,text}
-@ref{\text\, @image{../small/\plot\-sm,3cm, , , png}}
+@ref{\text\, @image{../small/\plot\-sm.png,3cm, , , png}}
 @end macro
 
 
@@ -174,10 +145,13 @@ screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+
 @node UDAV, Other classes, MGL scripts, Top
 @include udav_en.texi
 
-@node Other classes, Symbols and hot-keys, UDAV, Top
+@node Other classes, All samples, UDAV, Top
 @include other_en.texi
 
-@node Symbols and hot-keys, File formats, Other classes, Top
+@node All samples, Symbols and hot-keys, Other classes, Top
+@include samples.texi
+
+@node Symbols and hot-keys, File formats, All samples, Top
 @appendix Symbols and hot-keys
 @include symbols_en.texi
 
index a1309b89c183490d6911dbf7d799d132bcc3ca6d..f6e84c178cc37644d42b851e3713653c5994d83d 100644 (file)
@@ -51,6 +51,7 @@ This file documents the Mathematical Graphic Library (MathGL), a collection of c
 * MGL scripts::
 * UDAV ::
 * Other classes::
+* All samples::
 * Symbols and hot-keys::
 * File formats::
 * TeX-like symbols::
@@ -74,42 +75,12 @@ This file documents the Mathematical Graphic Library (MathGL), a collection of c
 <tr><td><img src="http://groups.google.com/intl/en/images/logos/groups_logo_sm.gif" height=25 width=117 alt="Google Groups"></td></tr>
 <tr><td style="padding-left: 5px;font-size: 110%"> <a target=_blank href="http://groups.google.com/group/mathgl"><b>MathGL</b></a> </td></tr>
 </table>
-
-<hr style="width: 100%; height: 1px;">
-<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
-<!-- 160x600, Vertical -->
-<ins class="adsbygoogle"
-     style="display:inline-block;width:160px;height:600px"
-     data-ad-client="ca-pub-1128070552722622"
-     data-ad-slot="2695178987"></ins>
-<script>
-(adsbygoogle = window.adsbygoogle || []).push({});
-</script>
 </nav>
 @end html
 @end macro
 
 @macro external {}
 @html
-<br><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
-<!-- Ref 728x15 -->
-<ins class="adsbygoogle"
-     style="display:inline-block;width:728px;height:15px"
-     data-ad-client="ca-pub-1128070552722622"
-     data-ad-slot="7008431385"></ins>
-<script>
-(adsbygoogle = window.adsbygoogle || []).push({});
-</script><br>
-@comment
-<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
-<!-- 728x90, Horizontal -->
-<ins class="adsbygoogle"
-     style="display:inline-block;width:728px;height:90px"
-     data-ad-client="ca-pub-1128070552722622"
-     data-ad-slot="9958083480"></ins>
-<script>
-(adsbygoogle = window.adsbygoogle || []).push({});
-</script><br/>
 <footer>
 <!--LiveInternet counter--><script type="text/javascript"><!--
 document.write("<a href='http://www.liveinternet.ru/click' "+
@@ -176,10 +147,13 @@ screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+
 @node UDAV, Other classes, MGL scripts, Top
 @include udav_ru.texi
 
-@node Other classes, Symbols and hot-keys, UDAV, Top
+@node Other classes, All samples, UDAV, Top
 @include other_ru.texi
 
-@node Symbols and hot-keys, File formats, Other classes, Top
+@node All samples, Symbols and hot-keys, Other classes, Top
+@include samples.texi
+
+@node Symbols and hot-keys, File formats, All samples, Top
 @appendix Symbols and hot-keys
 @include symbols_ru.texi
 
index d9baf5f4619116152d4f051aec55eb7a72ea21cd..8c1ad3e0032eb7bd9ecfd554062cfc17500e67c6 100644 (file)
@@ -4,53 +4,11 @@
 
 This chapter contain information about basic and advanced MathGL, hints and samples for all types of graphics. I recommend you read first 2 sections one after another and at least look on @ref{Hints} section. Also I recommend you to look at @ref{General concepts} and @ref{FAQ}.
 
-Most of sample scripts placed below use a set of functions for preparing the data.
-@verbatim
-func '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
-new x1 50 'x'
-new x2 50 '0.05-0.03*cos(pi*x)'
-new y1 50 '0.5-0.3*cos(pi*x)'
-new y2 50 '-0.3*sin(pi*x)'
-return
-
-func '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))'
-return
-
-func 'prepare3d'
-new c 61 50 40 '-2*(x^2+y^2+z^4-z^2)+0.2'
-new d 61 50 40 '1-2*tanh((x+y)*(x+y))'
-return
-
-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 verbatim
-Basically, you can put this text after the script. Note, that you need to terminate main script by @ref{stop} command before defining a function.
-
 @menu
 * Basic usage::
 * Advanced usage::
 * Data handling::
 * Data plotting::
-* 1D samples::
-* 2D samples::
-* 3D samples::
-* Vector field samples::
 * Hints::
 * FAQ::
 @end menu
@@ -752,7 +710,7 @@ plot v1 u2 'r2v':line 0.5 0.7 0.5 0.85 'rA'
 
 @c ------------------------------------------------------------------
 @external{}
-@node Data plotting, 1D samples, Data handling, Examples
+@node Data plotting, Hints, Data handling, Examples
 @section Data plotting
 @nav{}
 
@@ -842,1823 +800,335 @@ dens a1:box
 @end verbatim
 
 Drawing of other 2D plots is analogous. The only peculiarity is the usage of flag @samp{#}. By default this flag switches on the drawing of a grid on plot (@ref{grid} or @ref{mesh} for plots in plain or in volume). However, for isosurfaces (including surfaces of rotation @ref{axial}) this flag switches the  face drawing off and figure becomes wired.
+
 @c ------------------------------------------------------------------
 @external{}
-@node 1D samples, 2D samples, Data plotting, Examples
-@section 1D samples
+@node Hints, FAQ, Data plotting, Examples
+@section Hints
 @nav{}
 
-This section is devoted to visualization of 1D data arrays. 1D means the data which depend on single index (parameter) like curve in parametric form @{x(i),y(i),z(i)@}, i=1...n. Most of samples will use the same data for plotting. So, I put its initialization in separate function
-@verbatim
-func '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
-new x1 50 'x'
-new x2 50 '0.05-0.03*cos(pi*x)'
-new y1 50 '0.5-0.3*cos(pi*x)'
-new y2 50 '-0.3*sin(pi*x)'
-return
-@end verbatim
-Basically, you can put this text after the script. Note, that you need to terminate main script by @ref{stop} command before defining a function.
+In this section I've included some small hints and advices for the improving of the quality of plots and for the demonstration of some non-trivial features of MathGL library. In contrast to previous examples I showed mostly the idea but not the whole drawing function.
 
 @menu
-* Plot sample::
-* Radar sample::
-* Step sample::
-* Tens sample::
-* Area sample::
-* Region sample::
-* Stem sample::
-* Bars sample::
-* Barh sample::
-* Cones sample::
-* Chart sample::
-* BoxPlot sample::
-* Candle sample::
-* OHLC sample::
-* Error sample::
-* Mark sample::
-* TextMark sample::
-* Label sample::
-* Table sample::
-* Tube sample::
-* Tape sample::
-* Torus sample::
-* Lamerey sample::
-* Bifurcation sample::
-* Pmap sample::
+* ``Compound'' graphics::
+* Transparency and lighting::
+* Types of transparency::
+* Axis projection::
+* Adding fog::
+* Lighting sample::
+* Using primitives::
+* STFA sample::
+* Mapping visualization::
+* Data interpolation::
+* Making regular data::
+* Making histogram::
+* Nonlinear fitting hints::
+* PDE solving hints::
+* Drawing phase plain::
+* Pulse properties::
+* Using MGL parser::
+* Using options::
+* ``Templates''::
+* Stereo image::
+* Reduce memory usage::
+* Saving and scanning file::
+* Mixing bitmap and vector output::
 @end menu
 
-
 @c ------------------------------------------------------------------
 @external{}
-@node Plot sample, Radar sample, , 1D samples
-@subsection Plot sample
+@node ``Compound'' graphics, Transparency and lighting, , Hints
+@subsection ``Compound'' graphics
 @nav{}
 
-Command @ref{plot} is most standard way to visualize 1D data array. By default, @code{Plot} use colors from palette. However, you can specify manual color/palette, and even set to use new color for each points by using @samp{!} style. Another feature is @samp{ } style which draw only markers without line between points. The sample code is:
+As I noted above, MathGL functions (except the special one, like Clf()) do  not erase the previous plotting but just add the new one. It allows one to draw ``compound'' plots easily. For example, popular Matlab command @code{surfc} can be emulated in MathGL by 2 calls:
 @verbatim
-call 'prepare1d'
-subplot 2 2 0 '':title 'Plot plot (default)':box
-plot y
-
-subplot 2 2 2 '':title ''!' style; 'rgb' palette':box
-plot y 'o!rgb'
-
-subplot 2 2 3 '':title 'just markers':box
-plot y ' +'
-
-new yc 30 'sin(pi*x)':new xc 30 'cos(pi*x)':new z 30 'x'
-subplot 2 2 1:title '3d variant':rotate 50 60:box
-plot xc yc z 'rs'
+  Surf(a);
+  Cont(a, "_");     // draw contours at bottom
 @end verbatim
+Here @var{a} is 2-dimensional data for the plotting, @code{-1} is the value of z-coordinate at which the contour should be plotted (at the bottom in this example). Analogously, one can draw density plot instead of contour lines and so on.
 
-@pfig{plot, Example of Plot()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Radar sample, Step sample, Plot sample, 1D samples
-@subsection Radar sample
-@nav{}
-
-Command @ref{radar} plot is variant of @code{Plot} one, which make plot in polar coordinates and draw radial rays in point directions. If you just need a plot in polar coordinates then I recommend to use @ref{Curvilinear coordinates} or @code{Plot} in parabolic form with @code{x=r*cos(fi); y=r*sin(fi);}. The sample code is:
+Another nice plot is contour lines plotted directly on the surface:
+@verbatim
+  Light(true);       // switch on light for the surface
+  Surf(a, "BbcyrR"); // select 'jet' colormap for the surface
+  Cont(a, "y");      // and yellow color for contours
+@end verbatim
+The possible difficulties arise in black&white case, when the color of the surface can be close to the color of a contour line. In that case I may suggest the following code:
 @verbatim
-new yr 10 3 '0.4*sin(pi*(x+1.5+y/2)+0.1*rnd)'
-subplot 1 1 0 '':title 'Radar plot (with grid, "\#")'
-radar yr '#'
+  Light(true);   // switch on light for the surface
+  Surf(a, "kw"); // select 'gray' colormap for the surface
+  CAxis(-1,0);   // first draw for darker surface colors
+  Cont(a, "w");  // white contours
+  CAxis(0,1);    // now draw for brighter surface colors
+  Cont(a, "k");  // black contours
+  CAxis(-1,1);   // return color range to original state
 @end verbatim
+The idea is to divide the color range on 2 parts (dark and bright) and to select the contrasting color for contour lines for each of part.
 
-@pfig{radar, Example of Radar()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Step sample, Tens sample, Radar sample, 1D samples
-@subsection Step sample
-@nav{}
+Similarly, one can plot flow thread over density plot of vector field amplitude (this is another amusing plot from Matlab) and so on. The list of compound graphics can be prolonged but I hope that the general idea is clear.
 
-Command @ref{step} plot data as stairs. It have the same options as @code{Plot}. The sample code is:
+Just for illustration I put here following sample code:
 @verbatim
-call 'prepare1d'
-origin 0 0 0:subplot 2 2 0 '':title 'Step plot (default)':box
-step y
+call 'prepare2v'
+call 'prepare3d'
+new v 10:fill v -0.5 1:copy d sqrt(a^2+b^2)
+subplot 2 2 0:title 'Surf + Cont':rotate 50 60:light on:box
+surf a:cont a 'y'
 
-new yc 30 'sin(pi*x)':new xc 30 'cos(pi*x)':new z 30 'x'
-subplot 2 2 1:title '3d variant':rotate 50 60:box
-step xc yc z 'r'
+subplot 2 2 1 '':title 'Flow + Dens':light off:box
+flow a b 'br':dens d
+
+subplot 2 2 2:title 'Mesh + Cont':rotate 50 60:box
+mesh a:cont a '_'
 
-subplot 2 2 2 '':title '"!" style':box
-step y 's!rgb'
+subplot 2 2 3:title 'Surf3 + ContF3':rotate 50 60:light on
+box:contf3 v c 'z' 0:contf3 v c 'x':contf3 v c
+cut 0 -1 -1 1 0 1.1
+contf3 v c 'z' c.nz-1:surf3 c -0.5
 @end verbatim
 
-@pfig{step, Example of Step()}
+@pfig{combined, Example of ``combined'' plots}
 
 @c ------------------------------------------------------------------
 @external{}
-@node Tens sample, Area sample, Step sample, 1D samples
-@subsection Tens sample
+@node Transparency and lighting, Types of transparency, ``Compound'' graphics, Hints
+@subsection Transparency and lighting
 @nav{}
 
-Command @ref{tens} is variant of @ref{plot} with smooth coloring along the curves. At this, color is determined as for surfaces (see @ref{Color scheme}). The sample code is:
+Here I want to show how transparency and lighting both and separately change the look of a surface. So, there is code and picture for that:
 @verbatim
-call 'prepare1d'
-subplot 2 2 0 '':title 'Tens plot (default)':box
-tens y(:,0) y(:,1)
+call 'prepare2d'
+subplot 2 2 0:title 'default':rotate 50 60:box
+surf a
+
+subplot 2 2 1:title 'light on':rotate 50 60:box
+light on:surf a
 
-subplot 2 2 2 '':title ' style':box
-tens y(:,0) y(:,1) 'o '
+subplot 2 2 3:title 'light on; alpha on':rotate 50 60:box
+alpha on:surf a
 
-new yc 30 'sin(pi*x)':new xc 30 'cos(pi*x)':new z 30 'x'
-subplot 2 2 1:title '3d variant':rotate 50 60:box
-tens xc yc z z 's'
+subplot 2 2 2:title 'alpha on':rotate 50 60:box
+light off:surf a
 @end verbatim
 
-@pfig{tens, Example of Tens()}
+@pfig{alpha, Example of transparency and lightings}
 
 @c ------------------------------------------------------------------
 @external{}
-@node Area sample, Region sample, Tens sample, 1D samples
-@subsection Area sample
+@node Types of transparency, Axis projection, Transparency and lighting, Hints
+@subsection Types of transparency
 @nav{}
 
-Command @ref{area} fill the area between curve and axis plane. It support gradient filling if 2 colors per curve is specified. The sample code is:
-@verbatim
-call 'prepare1d'
-origin 0 0 0
-subplot 2 2 0 '':title 'Area plot (default)':box
-area y
+MathGL library has advanced features for setting and handling the surface transparency. The simplest way to add transparency is the using of command @ref{alpha}. As a result, all further surfaces (and isosurfaces, density plots and so on) become transparent. However, their  look can be additionally improved.
+
+The value of transparency can be different from surface to surface. To do it just use @code{SetAlphaDef} before the drawing of the surface, or use option @code{alpha} (see @ref{Command options}). If its value is close to 0 then the surface becomes more and more transparent. Contrary, if its value is close to 1 then the surface becomes practically non-transparent.
 
-subplot 2 2 1 '':title '2 colors':box
-area y 'cbgGyr'
+Also you can change the way how the light goes through overlapped surfaces. The function @code{SetTranspType} defines it. By default the usual transparency is used (@samp{0}) -- surfaces below is less visible than the upper ones. A ``glass-like'' transparency (@samp{1}) has a different look -- each surface just decreases the background light (the surfaces are commutable in this case).
 
-subplot 2 2 2 '':title '"!" style':box
-area y '!'
+A ``neon-like'' transparency (@samp{2}) has more interesting look. In this case a surface is the light source (like a lamp on the dark background) and just adds some intensity to the color. At this, the library sets automatically the black color for the background and changes the default line color to white.
 
-new yc 30 'sin(pi*x)':new xc 30 'cos(pi*x)':new z 30 'x'
-subplot 2 2 3:title '3d variant':rotate 50 60:box
-area xc yc z 'r':area xc -yc z 'b#'
+As example I shall show several plots for different types of transparency. The code is the same except the values of @code{SetTranspType} function:
+@verbatim
+call 'prepare2d'
+alpha on:light on
+transptype 0:clf
+subplot 2 2 0:rotate 50 60:surf a:box
+subplot 2 2 1:rotate 50 60:dens a:box
+subplot 2 2 2:rotate 50 60:cont a:box
+subplot 2 2 3:rotate 50 60:axial a:box
 @end verbatim
 
-@pfig{area, Example of Area()}
+@pfig{type0, Example of @code{SetTranspType(0)}.}
+@pfig{type1, Example of @code{SetTranspType(1)}.}
+@pfig{type2, Example of @code{SetTranspType(2)}.}
+
 
 @c ------------------------------------------------------------------
 @external{}
-@node Region sample, Stem sample, Area sample, 1D samples
-@subsection Region sample
+@node Axis projection, Adding fog, Ternary axis, Hints
+@subsection Axis projection
 @nav{}
 
-Command @ref{region} fill the area between 2 curves. It support gradient filling if 2 colors per curve is specified. Also it can fill only the region y1<y<y2 if style @samp{i} is used. The sample code is:
+You can easily make 3D plot and draw its x-,y-,z-projections (like in CAD) by using @ref{ternary} function with arguments: 4 for Cartesian, 5 for Ternary and 6 for Quaternary coordinates. The sample code is:
 @verbatim
-call 'prepare1d'
-copy y1 y(:,1):copy y2 y(:,2)
-
-subplot 2 2 0 '':title 'Region plot (default)':box
-region y1 y2:plot y1 'k2':plot y2 'k2'
-
-subplot 2 2 1 '':title '2 colors':box
-region y1 y2 'yr':plot y1 'k2':plot y2 'k2'
-
-subplot 2 2 2 '':title '"i" style':box
-region y1 y2 'ir':plot y1 'k2':plot y2 'k2'
+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
 
-subplot 2 2 3 '^_':title '3d variant':rotate 40 60:box
-new x1 100 'sin(pi*x)':new y1 100 'cos(pi*x)':new z 100 'x'
-new x2 100 'sin(pi*x+pi/3)':new y2 100 'cos(pi*x+pi/3)'
-plot x1 y1 z 'r2':plot x2 y2 z 'b2'
-region x1 y1 z x2 y2 z 'cmy!'
+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 verbatim
 
-@pfig{region, Example of Region()}
+@pfig{projection, Example of axis projections}
 
 @c ------------------------------------------------------------------
 @external{}
-@node Stem sample, Bars sample, Region sample, 1D samples
-@subsection Stem sample
+@node Adding fog, Lighting sample, Axis projection, Hints
+@subsection Adding fog
 @nav{}
 
-Command @ref{stem} draw vertical bars. It is most attractive if markers are drawn too. The sample code is:
+MathGL can add a fog to the image. Its switching on is rather simple -- just use @ref{fog} function. There is the only feature -- fog is applied for whole image. Not to particular subplot. The sample code is:
 @verbatim
-call 'prepare1d'
-origin 0 0 0:subplot 2 2 0 '':title 'Stem plot (default)':box
-stem y
-
-new yc 30 'sin(pi*x)':new xc 30 'cos(pi*x)':new z 30 'x'
-subplot 2 2 1:title '3d variant':rotate 50 60:box
-stem xc yc z 'rx'
-
-subplot 2 2 2 '':title '"!" style':box
-stem y 'o!rgb'
+call 'prepare2d'
+title 'Fog sample':rotate 50 60:light on
+fog 1
+box:surf a:cont a 'y'
 @end verbatim
 
-@pfig{stem, Example of Stem()}
+@pfig{fog, Example of @code{Fog()}.}
 
 @c ------------------------------------------------------------------
 @external{}
-@node Bars sample, Barh sample, Stem sample, 1D samples
-@subsection Bars sample
+@node Lighting sample, Using primitives, Adding fog, Hints
+@subsection Lighting sample
 @nav{}
 
-Command @ref{bars} draw vertical bars. It have a lot of options: bar-above-bar (@samp{a} style), fall like (@samp{f} style), 2 colors for positive and negative values, wired bars (@samp{#} style), 3D variant. The sample code is:
+In contrast to the most of other programs, MathGL supports several (up to 10) light sources. Moreover, the color each of them can be different: white (this is usual), yellow, red, cyan, green and so on. The use of several light sources may be interesting for the highlighting of some peculiarities of the plot or just to make an amusing picture. Note, each light source can be switched on/off individually. The sample code is:
 @verbatim
-new ys 10 3 '0.8*sin(pi*(x+y/4+1.25))+0.2*rnd':origin 0 0 0
-subplot 3 2 0 '':title 'Bars plot (default)':box
-bars ys
+call 'prepare2d'
+title 'Several light sources':rotate 50 60:light on
+light 1 0 1 0 'c':light 2 1 0 0 'y':light 3 0 -1 0 'm'
+box:surf a 'h'
+@end verbatim
 
-subplot 3 2 1 '':title '2 colors':box
-bars ys 'cbgGyr'
+@pfig{several_light, Example of several light sources.}
 
-subplot 3 2 4 '':title '"\#" style':box
-bars ys '#'
+Additionally, you can use local light sources and set to use @ref{diffuse} reflection instead of specular one (by default) or both kinds. Note, I use @ref{attachlight} command to keep light settings relative to subplot.
+@verbatim
+light on: attachlight on
+call 'prepare2d'
+subplot 2 2 0:title 'Default':rotate 50 60:box:surf a
+line -1 -0.7 1.7 -1 -0.7 0.7 'BA'
 
-new yc 30 'sin(pi*x)':new xc 30 'cos(pi*x)':new z 30 'x'
-subplot 3 2 5:title '3d variant':rotate 50 60:box
-bars xc yc z 'r'
+subplot 2 2 1:title 'Local':rotate 50 60
+light 0 1 0 1 -2 -1 -1
+line 1 0 1 -1 -1 0 'BAO':box:surf a
 
-subplot 3 2 2 '':title '"a" style':ranges -1 1 -3 3:box
-bars ys 'a'
+subplot 2 2 2:title 'no diffuse':rotate 50 60
+diffuse 0
+line 1 0 1 -1 -1 0 'BAO':box:surf a
 
-subplot 3 2 3 '':title '"f" style':box
-bars ys 'f'
+subplot 2 2 3:title 'diffusive only':rotate 50 60
+diffuse 0.5:light 0 1 0 1 -2 -1 -1 'w' 0
+line 1 0 1 -1 -1 0 'BAO':box:surf a
 @end verbatim
 
-@pfig{bars, Example of Bars()}
+@pfig{light, Example of different types of lighting.}
 
 @c ------------------------------------------------------------------
 @external{}
-@node Barh sample, Cones sample, Bars sample, 1D samples
-@subsection Barh sample
+@node Using primitives, STFA sample, Lighting sample, Hints
+@subsection Using primitives
 @nav{}
 
-Command @ref{barh} is the similar to @code{Bars} but draw horizontal bars. The sample code is:
+MathGL provide a set of functions for drawing primitives (see @ref{Primitives}). Primitives are low level object, which used by most of plotting functions. Picture below demonstrate some of commonly used primitives.
 @verbatim
-new ys 10 3 '0.8*sin(pi*(x+y/4+1.25))+0.2*rnd':origin 0 0 0
-subplot 2 2 0 '':title 'Barh plot (default)':box
-barh ys
+subplot 2 2 0 '':title 'Line, Curve, Rhomb, Ellipse' '' -1.5
+line -1 -1 -0.5 1 'qAI'
+curve -0.6 -1 1 1 0 1 1 1 'rA'
+ball 0 -0.5 '*':ball 1 -0.1 '*'
+rhomb 0 0.4 1 0.9 0.2 'b#'
+rhomb 0 0 1 0.4 0.2 'cg@'
+ellipse 0 -0.5 1 -0.1 0.2 'u#'
+ellipse 0 -1 1 -0.6 0.2 'm@'
 
-subplot 2 2 1 '':title '2 colors':box
-barh ys 'cbgGyr'
+light on
+subplot 2 2 1:title 'Face[xyz]':rotate 50 60:box
+facex 1 0 -1 1 1 'r':facey -1 -1 -1 1 1 'g':facez 1 -1 -1 -1 1 'b'
+face -1 -1 1 -1 1 1 1 -1 0 1 1 1 'bmgr'
 
-ranges -3 3 -1 1:subplot 2 2 2 '':title '"a" style':box:barh ys 'a'
-subplot 2 2 3 '': title '"f" style':box
-barh ys 'f'
-@end verbatim
+subplot 2 2 3 '':title 'Cone'
+cone -0.7 -0.3 0 -0.7 0.7 0.5 0.2 0.1 'b':text -0.7 -0.7 'no edges\n(default)'
+cone 0 -0.3 0 0 0.7 0.5 0.2 0.1 'g@':text 0 -0.7 'with edges\n('\@' style)'
+cone 0.7 -0.3 0 0.7 0.7 0.5 0.2 0.1 'ry':text 0.7 -0.7 '"arrow" with\n{}gradient'
 
-@pfig{barh, Example of Barh()}
+subplot 2 2 2 '':title 'Sphere and Drop'
+line -0.9 0 1 0.9 0 1
+text -0.9 -0.7 'sh=0':drop -0.9 0 0 1 0.5 'r' 0:ball -0.9 0 1 'k'
+text -0.3 -0.7 'sh=0.33':drop -0.3 0 0 1 0.5 'r' 0.33:ball -0.3 0 1 'k'
+text 0.3 -0.7 'sh=0.67':drop 0.3 0 0 1 0.5 'r' 0.67:ball 0.3 0 1 'k'
+text 0.9 -0.7 'sh=1':drop 0.9 0 0 1 0.5 'r' 1:ball 0.9 0 1 'k'
+@end verbatim
 
-@c ------------------------------------------------------------------
-@external{}
-@node Cones sample, Chart sample, Bars sample, 1D samples
-@subsection Cones sample
-@nav{}
+@pfig{primitives, Primitives in MathGL.}
 
-Command @ref{cones} is similar to @code{Bars} but draw cones. The sample code is:
+Generally, you can create arbitrary new kind of plot using primitives. For example, MathGL don't provide any special functions for drawing molecules. However, you can do it using only one type of primitives @ref{drop}. The sample code is:
 @verbatim
-new ys 10 3 '0.8*sin(pi*(x+y/4+1.25))+0.2*rnd'
-origin 0 0 0:light on
-subplot 3 2 0:title 'Cones plot':rotate 50 60:box
-cones ys
+alpha on:light on
+subplot 2 2 0 '':title 'Methane, CH_4':rotate 60 120
+sphere 0 0 0 0.25 'k':drop 0 0 0 0 0 1 0.35 'h' 1 2:sphere 0 0 0.7 0.25 'g'
+drop 0 0 0 -0.94 0 -0.33 0.35 'h' 1 2:sphere -0.66 0 -0.23 0.25 'g'
+drop 0 0 0 0.47 0.82 -0.33 0.35 'h' 1 2:sphere 0.33 0.57 -0.23 0.25 'g'
+drop 0 0 0 0.47 -0.82 -0.33 0.35 'h' 1 2:sphere 0.33 -0.57 -0.23 0.25 'g'
 
-subplot 3 2 1:title '2 colors':rotate 50 60:box
-cones ys 'cbgGyr'
+subplot 2 2 1 '':title 'Water, H{_2}O':rotate 60 100
+sphere 0 0 0 0.25 'r':drop 0 0 0 0.3 0.5 0 0.3 'm' 1 2:sphere 0.3 0.5 0 0.25 'g'
+drop 0 0 0 0.3 -0.5 0 0.3 'm' 1 2:sphere 0.3 -0.5 0 0.25 'g'
 
-subplot 3 2 2:title '"\#" style':rotate 50 60:box
-cones ys '#'
+subplot 2 2 2 '':title 'Oxygen, O_2':rotate 60 120
+drop 0 0.5 0 0 -0.3 0 0.3 'm' 1 2:sphere 0 0.5 0 0.25 'r'
+drop 0 -0.5 0 0 0.3 0 0.3 'm' 1 2:sphere 0 -0.5 0 0.25 'r'
 
-subplot 3 2 3:title '"a" style':rotate 50 60:zrange -2 2:box
-cones ys 'a'
+subplot 2 2 3 '':title 'Ammonia, NH_3':rotate 60 120
+sphere 0 0 0 0.25 'b':drop 0 0 0 0.33 0.57 0 0.32 'n' 1 2
+sphere 0.33 0.57 0 0.25 'g':drop 0 0 0 0.33 -0.57 0 0.32 'n' 1 2
+sphere 0.33 -0.57 0 0.25 'g':drop 0 0 0 -0.65 0 0 0.32 'n' 1 2
+sphere -0.65 0 0 0.25 'g'
+@end verbatim
 
-subplot 3 2 4:title '"t" style':rotate 50 60:box
-cones ys 't'
+@pfig{molecule, Example of molecules drawing.}
 
-subplot 3 2 5:title '"4" style':rotate 50 60:box
-cones ys '4'
+Moreover, some of special plots can be more easily produced by primitives rather than by specialized function. For example, Venn diagram can be produced by @code{Error} plot:
+@verbatim
+list x -0.3 0 0.3:list y 0.3 -0.3 0.3:list e 0.7 0.7 0.7
+title 'Venn-like diagram':alpha on
+error x y e e '!rgb@#o'
+@end verbatim
+You see that you have to specify and fill 3 data arrays. The same picture can be produced by just 3 calls of @ref{circle} function:
+@verbatim
+title 'Venn-like diagram':alpha on
+circle -0.3 0.3 0.7 'rr@'
+circle 0 -0.3 0.7 'gg@'
+circle 0.3 0.3 0.7 'bb@'
 @end verbatim
+Of course, the first variant is more suitable if you need to plot a lot of circles. But for few ones the usage of primitives looks easy.
 
-@pfig{cones, Example of Cones()}
+@pfig{venn, Example of Venn diagram.}
 
 @c ------------------------------------------------------------------
 @external{}
-@node Chart sample, BoxPlot sample, Cones sample, 1D samples
-@subsection Chart sample
+@node STFA sample, Mapping visualization, Using primitives, Hints
+@subsection STFA sample
 @nav{}
 
-Command @ref{chart} draw colored boxes with width proportional to data values. Use @samp{ } for empty box. Plot looks most attractive in polar coordinates -- well known pie chart. The sample code is:
-@verbatim
-new ch 7 2 'rnd+0.1':light on
-subplot 2 2 0:title 'Chart plot (default)':rotate 50 60:box
-chart ch
+Short-time Fourier Analysis (@ref{stfa}) is one of informative method for analyzing long rapidly oscillating 1D data arrays. It is used to determine the sinusoidal frequency and phase content of local sections of a signal as it changes over time.
 
-subplot 2 2 1:title '"\#" style':rotate 50 60:box
-chart ch '#'
+MathGL can find and draw STFA result. Just to show this feature I give following sample. Initial data arrays is 1D arrays with step-like frequency. Exactly this you can see at bottom on the STFA plot. The sample code is:
+@verbatim
+new a 2000:new b 2000
+fill a 'cos(50*pi*x)*(x<-.5)+cos(100*pi*x)*(x<0)*(x>-.5)+\
+cos(200*pi*x)*(x<.5)*(x>0)+cos(400*pi*x)*(x>.5)'
 
-subplot 2 2 2:title 'Pie chart; " " color':rotate 50 60:
-axis '(y+1)/2*cos(pi*x)' '(y+1)/2*sin(pi*x)' '':box
-chart ch 'bgr cmy#'
+subplot 1 2 0 '<_':title 'Initial signal'
+plot a:axis:xlabel '\i t'
 
-subplot 2 2 3:title 'Ring chart; " " color':rotate 50 60:
-axis '(y+2)/3*cos(pi*x)' '(y+2)/3*sin(pi*x)' '':box
-chart ch 'bgr cmy#'
+subplot 1 2 1 '<_':title 'STFA plot'
+stfa a b 64:axis:ylabel '\omega' 0:xlabel '\i t'
 @end verbatim
 
-@pfig{chart, Example of Chart()}
+@pfig{stfa, Example of STFA().}
 
 @c ------------------------------------------------------------------
 @external{}
-@node BoxPlot sample, Candle sample, Chart sample, 1D samples
-@subsection BoxPlot sample
-@nav{}
-
-Command @ref{boxplot} draw box-and-whisker diagram. The sample code is:
-@verbatim
-new a 10 7 '(2*rnd-1)^3/2'
-subplot 1 1 0 '':title 'Boxplot plot':box
-boxplot a
-@end verbatim
-
-@pfig{boxplot, Example of BoxPlot()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Candle sample, OHLC sample, BoxPlot sample, 1D samples
-@subsection Candle sample
-@nav{}
-
-Command @ref{candle} draw candlestick chart. This is a combination of a line-chart and a bar-chart, in that each bar represents the range of price movement over a given time interval. The sample code is:
-@verbatim
-new y 30 'sin(pi*x/2)^2':copy y1 y/2:copy y2 (y+1)/2
-subplot 1 1 0 '':title 'Candle plot (default)':yrange 0 1:box
-candle y y1 y2
-@end verbatim
-
-@pfig{candle, Example of Candle()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node OHLC sample, Error sample, Candle sample, 1D samples
-@subsection OHLC sample
-@nav{}
-
-Command @ref{ohlc} draw Open-High-Low-Close diagram. This diagram show vertical line for between maximal(high) and minimal(low) values, as well as horizontal lines before/after vertical line for initial(open)/final(close) values of some process. The sample code is:
-@verbatim
-new o 10 '0.5*sin(pi*x)'
-new c 10 '0.5*sin(pi*(x+2/9))'
-new l 10 '0.3*rnd-0.8'
-new h 10 '0.3*rnd+0.5'
-subplot 1 1 0 '':title 'OHLC plot':box
-ohlc o h l c
-@end verbatim
-
-@pfig{ohlc, Example of OHLC()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Error sample, Mark sample, OHLC sample, 1D samples
-@subsection Error sample
-@nav{}
-
-Command @ref{error} draw error boxes around the points. You can draw default boxes or semi-transparent symbol (like marker, see @ref{Line styles}). Also you can set individual color for each box. The sample code is:
-@verbatim
-call 'prepare1d'
-new y 50 '0.7*sin(pi*x-pi) + 0.5*cos(3*pi*(x+1)/2) + 0.2*sin(pi*(x+1)/2)'
-new x0 10 'x + 0.1*rnd-0.05':new ex 10 '0.1':new ey 10 '0.2'
-new y0 10 '0.7*sin(pi*x-pi) + 0.5*cos(3*pi*(x+1)/2) + 0.2*sin(pi*(x+1)/2) + 0.2*rnd-0.1'
-
-subplot 2 2 0 '':title 'Error plot (default)':box:plot y
-error x0 y0 ex ey 'k'
-
-subplot 2 2 1 '':title '"!" style; no e_x':box:plot y
-error x0 y0 ey 'o!rgb'
-
-subplot 2 2 2 '':title '"\@" style':box:plot y
-error x0 y0 ex ey '@'; alpha 0.5
-
-subplot 2 2 3:title '3d variant':rotate 50 60:axis
-for $1 0 9
-  errbox 2*rnd-1 2*rnd-1 2*rnd-1 0.2 0.2 0.2 'bo'
-next
-@end verbatim
-
-@pfig{error, Example of Error()}
-
-Additionally, you can use solid large "marks" instead of error boxes by selecting proper style.
-@verbatim
-new x0 10 'rnd':new ex 10 '0.1'
-new y0 10 'rnd':new ey 10 '0.1'
-ranges 0 1 0 1
-subplot 4 3 0 '':box:error x0 y0 ex ey '#+@'
-subplot 4 3 1 '':box:error x0 y0 ex ey '#x@'
-subplot 4 3 2 '':box:error x0 y0 ex ey '#s@'; alpha 0.5
-subplot 4 3 3 '':box:error x0 y0 ex ey 's@'
-subplot 4 3 4 '':box:error x0 y0 ex ey 'd@'
-subplot 4 3 5 '':box:error x0 y0 ex ey '#d@'; alpha 0.5
-subplot 4 3 6 '':box:error x0 y0 ex ey '+@'
-subplot 4 3 7 '':box:error x0 y0 ex ey 'x@'
-subplot 4 3 8 '':box:error x0 y0 ex ey 'o@'
-subplot 4 3 9 '':box:error x0 y0 ex ey '#o@'; alpha 0.5
-subplot 4 3 10 '':box:error x0 y0 ex ey '#.@'
-subplot 4 3 11 '':box:error x0 y0 ex ey; alpha 0.5
-@end verbatim
-
-@pfig{error2, Example of Error() with marks}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Mark sample, TextMark sample, Error sample, 1D samples
-@subsection Mark sample
-@nav{}
-
-Command @ref{mark} draw markers at points. It is mostly the same as @code{Plot} but marker size can be variable. The sample code is:
-@verbatim
-call 'prepare1d'
-subplot 1 1 0 '':title 'Mark plot (default)':box
-mark y y1 's'
-@end verbatim
-
-@pfig{mark, Example of Mark()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node TextMark sample, Label sample, Mark sample, 1D samples
-@subsection TextMark sample
-@nav{}
-
-Command @ref{textmark} like @code{Mark} but draw text instead of markers. The sample code is:
-@verbatim
-call 'prepare1d'
-subplot 1 1 0 '':title 'TextMark plot (default)':box
-textmark y y1 '\gamma' 'r'
-@end verbatim
-
-@pfig{textmark, Example of TextMark()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Label sample, Table sample, TextMark sample, 1D samples
-@subsection Label sample
-@nav{}
-
-Command @ref{label} print text at data points. The string may contain @samp{%x}, @samp{%y}, @samp{%z} for x-, y-, z-coordinates of points, @samp{%n} for point index. The sample code is:
-@verbatim
-new ys 10 '0.2*rnd-0.8*sin(pi*x)'
-subplot 1 1 0 '':title 'Label plot':box
-plot ys ' *':label ys 'y=%y'
-@end verbatim
-
-@pfig{label, Example of Label()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Table sample, Tube sample, Label sample, 1D samples
-@subsection Table sample
-@nav{}
-
-Command @ref{table} draw table with data values. The sample code is:
-@verbatim
-new ys 10 3 '0.8*sin(pi*(x+y/4+1.25))+0.2*rnd'
-subplot 2 2 0:title 'Table sample':box
-table ys 'y_1\n{}y_2\n{}y_3'
-
-subplot 2 2 1:title 'no borders, colored'
-table ys 'y_1\n{}y_2\n{}y_3' 'r|'
-
-subplot 2 2 2:title 'no font decrease'
-table ys 'y_1\n{}y_2\n{}y_3' '#'
-
-subplot 2 2 3:title 'manual width and position':box
-table 0.5 0.95 ys 'y_1\n{}y_2\n{}y_3' '#';value 0.7
-@end verbatim
-
-@pfig{table, Example of Table()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Tube sample, Tape sample, Table sample, 1D samples
-@subsection Tube sample
-@nav{}
-
-Command @ref{tube} draw tube with variable radius. The sample code is:
-@verbatim
-light on:call 'prepare1d'
-new yc 50 'sin(pi*x)':new xc 50 'cos(pi*x)':new z 50 'x':divto y1 20
-
-subplot 2 2 0 '':title 'Tube plot (default)':box
-tube y 0.05
-
-subplot 2 2 1 '':title 'variable radius':box
-tube y y1
-
-subplot 2 2 2 '':title '"\#" style':box
-tube y 0.05 '#'
-
-subplot 2 2 3:title '3d variant':rotate 50 60:box
-tube xc yc z y2 'r'
-@end verbatim
-
-@pfig{tube, Example of Tube()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Tape sample, Torus sample, Tube sample, 1D samples
-@subsection Tape sample
-@nav{}
-
-Command @ref{tape} draw tapes which rotate around the curve as normal and binormal. The sample code is:
-@verbatim
-call 'prepare1d'
-new yc 50 'sin(pi*x)':new xc 50 'cos(pi*x)':new z 50 'x'
-
-subplot 2 2 0 '':title 'Tape plot (default)':box
-tape y:plot y 'k'
-
-subplot 2 2 1:title '3d variant, 2 colors':rotate 50 60:light on:box
-plot xc yc z 'k':tape xc yc z 'rg'
-
-subplot 2 2 2:title '3d variant, x only':rotate 50 60:box
-plot xc yc z 'k':tape xc yc z 'xr':tape xc yc z 'xr#'
-
-subplot 2 2 3:title '3d variant, z only':rotate 50 60:box
-plot xc yc z 'k':tape xc yc z 'zg':tape xc yc z 'zg#'
-@end verbatim
-
-@pfig{tape, Example of Tape()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Torus sample, Lamerey sample, Tape sample, 1D samples
-@subsection Torus sample
-@nav{}
-
-Command @ref{torus} draw surface of the curve rotation. The sample code is:
-@verbatim
-call 'prepare1d'
-subplot 2 2 0:title 'Torus plot (default)':light on:rotate 50 60:box
-torus y1 y2
-
-subplot 2 2 1:title '"x" style':light on:rotate 50 60:box
-torus y1 y2 'x'
-
-subplot 2 2 2:title '"z" style':light on:rotate 50 60:box
-torus y1 y2 'z'
-
-subplot 2 2 3:title '"\#" style':light on:rotate 50 60:box
-torus y1 y2 '#'
-@end verbatim
-
-@pfig{torus, Example of Torus()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Lamerey sample, Bifurcation sample, Torus sample, 1D samples
-@subsection Lamerey sample
-@nav{}
-
-Function @ref{lamerey} draw Lamerey diagram. The sample code is:
-@verbatim
-subplot 1 1 0 '<_':title 'Lamerey sample'
-axis:xlabel '\i x':ylabel '\bar{\i x} = 2 \i{x}'
-fplot 'x' 'k='
-fplot '2*x' 'b'
-
-lamerey 0.00097 '2*x' 'rv~';size 2
-lamerey -0.00097 '2*x' 'rv~';size 2
-@end verbatim
-
-@pfig{lamerey, Example of Lamerey()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Bifurcation sample, Pmap sample, Lamerey sample, 1D samples
-@subsection Bifurcation sample
-@nav{}
-
-Function @ref{bifurcation} draw Bifurcation diagram for logistic map. The sample code is:
-@verbatim
-subplot 1 1 0 '<_':title 'Bifurcation sample'
-ranges 0 4 0 1:axis
-bifurcation 0.005 'x*y*(1-y)' 'r'
-@end verbatim
-
-@pfig{bifurcation, Example of Bifurcation()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Pmap sample, , Bifurcation sample, 1D samples
-@subsection Pmap sample
-@nav{}
-
-Function @ref{pmap} draw Poincare map -- show intersections of the curve and the surface. The sample code is:
-@verbatim
-subplot 1 1 0 '<_^':title 'Poincare map sample'
-ode r 'cos(y)+sin(z);cos(z)+sin(x);cos(x)+sin(y)' 'xyz' [0.1,0,0] 0.1 100
-rotate 40 60:copy x r(0):copy y r(1):copy z r(2)
-ranges x y z
-axis:plot x y z 'b':fsurf '0'
-xlabel '\i x' 0:ylabel '\i y' 0:zlabel '\i z'
-
-pmap x y z z 'b#o'
-@end verbatim
-
-@pfig{pmap, Example of Pmap()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node 2D samples, 3D samples, 1D samples, Examples
-@section 2D samples
-@nav{}
-
-This section is devoted to visualization of 2D data arrays. 2D means the data which depend on 2 indexes (parameters) like matrix z(i,j)=z(x(i),y(j)), i=1...n, j=1...m or in parametric form @{x(i,j),y(i,j),z(i,j)@}. Most of samples will use the same data for plotting. So, I put its initialization in separate function
-@verbatim
-func '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))'
-return
-@end verbatim
-Basically, you can put this text after the script. Note, that you need to terminate main script by @ref{stop} command before defining a function.
-
-@menu
-* Surf sample::
-* SurfC sample::
-* SurfA sample::
-* SurfCA sample::
-* Mesh sample::
-* Fall sample::
-* Belt sample::
-* Boxs sample::
-* Tile sample::
-* TileS sample::
-* Dens sample::
-* Cont sample::
-* ContF sample::
-* ContD sample::
-* ContV sample::
-* Axial sample::
-* Grad sample::
-@end menu
-
-@c ------------------------------------------------------------------
-@external{}
-@node Surf sample, SurfC sample, , 2D samples
-@subsection Surf sample
-@nav{}
-
-Command @ref{surf} is most standard way to visualize 2D data array. @code{Surf} use color scheme for coloring (see @ref{Color scheme}). You can use @samp{#} style for drawing black meshes on the surface. The sample code is:
-@verbatim
-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 '"." style':rotate 50 60:box
-surf 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 verbatim
-
-@pfig{surf, Example of Surf()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node SurfC sample, SurfA sample, Surf sample, 2D samples
-@subsection SurfC sample
-@nav{}
-
-Command @ref{surfc} is similar to @ref{surf} but its coloring is determined by another data. The sample code is:
-@verbatim
-call 'prepare2d'
-title 'SurfC plot':rotate 50 60:light on:box
-surfc a b
-@end verbatim
-
-@pfig{surfc, Example of SurfC()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node SurfA sample, SurfCA sample, SurfC sample, 2D samples
-@subsection SurfA sample
-@nav{}
-
-Command @ref{surfa} is similar to @ref{surf} but its transparency is determined by another data. The sample code is:
-@verbatim
-call 'prepare2d'
-title 'SurfA plot':rotate 50 60:light on:alpha on:box
-surfa a b
-@end verbatim
-
-@pfig{surfa, Example of SurfA()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node SurfCA sample, Mesh sample, SurfA sample, 2D samples
-@subsection SurfCA sample
-@nav{}
-
-Command @ref{surfca} is similar to @ref{surf} but its color and transparency is determined by another data. The sample code is:
-@verbatim
-call 'prepare2d'
-title 'SurfCA plot':rotate 50 60:light on:alpha on:box
-surfa a b a
-@end verbatim
-
-@pfig{surfca, Example of SurfCA()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Mesh sample, Fall sample, SurfCA sample, 2D samples
-@subsection Mesh sample
-@nav{}
-
-Command @ref{mesh} draw wired surface. You can use @ref{meshnum} for changing number of lines to be drawn. The sample code is:
-@verbatim
-call 'prepare2d'
-title 'Mesh plot':rotate 50 60:box
-mesh a
-@end verbatim
-
-@pfig{mesh, Example of Mesh()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Fall sample, Belt sample, Mesh sample, 2D samples
-@subsection Fall sample
-@nav{}
-
-Command @ref{fall} draw waterfall surface. You can use @ref{meshnum} for changing number of lines to be drawn. Also you can use @samp{x} style for drawing lines in other direction. The sample code is:
-@verbatim
-call 'prepare2d'
-title 'Fall plot':rotate 50 60:box
-fall a
-@end verbatim
-
-@pfig{fall, Example of Fall()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Belt sample, Boxs sample, Fall sample, 2D samples
-@subsection Belt sample
-@nav{}
-
-Command @ref{belt} draw surface by belts. You can use @samp{x} style for drawing lines in other direction. The sample code is:
-@verbatim
-call 'prepare2d'
-title 'Belt plot':rotate 50 60:box
-belt a
-@end verbatim
-
-@pfig{belt, Example of Belt()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Boxs sample, Tile sample, Fall sample, 2D samples
-@subsection Boxs sample
-@nav{}
-
-Command @ref{boxs} draw surface by boxes. You can use @samp{#} for drawing wire plot. The sample code is:
-@verbatim
-call 'prepare2d'
-origin 0 0 0
-subplot 2 2 0:title 'Boxs plot (default)':rotate 40 60:light on:box
-boxs a
-
-subplot 2 2 1:title '"\@" style':rotate 50 60:box
-boxs a '@'
-
-subplot 2 2 2:title '"\#" style':rotate 50 60:box
-boxs a '#'
-
-subplot 2 2 3:title 'compare with Tile':rotate 50 60:box
-tile a
-@end verbatim
-
-@pfig{boxs, Example of Boxs()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Tile sample, TileS sample, Boxs sample, 2D samples
-@subsection Tile sample
-@nav{}
-
-Command @ref{tile} draw surface by tiles. The sample code is:
-@verbatim
-call 'prepare2d'
-subplot 1 1 0 '':title 'Tiles plot':box
-tile a
-@end verbatim
-
-@pfig{tile, Example of Tile()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node TileS sample, Dens sample, Tile sample, 2D samples
-@subsection TileS sample
-@nav{}
-
-Command @ref{tiles} is similar to @ref{tile} but tile sizes is determined by another data. This allows one to simulate transparency of the plot. The sample code is:
-@verbatim
-call 'prepare2d'
-subplot 1 1 0 '':title 'Tiles plot':box
-tiles a b
-@end verbatim
-
-@pfig{tiles, Example of TileS()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Dens sample, Cont sample, TileS sample, 2D samples
-@subsection Dens sample
-@nav{}
-
-Command @ref{dens} draw density plot for surface. The sample code is:
-@verbatim
-call 'prepare2d'
-subplot 2 2 0 '':title 'Dens plot (default)':box
-dens a
-
-subplot 2 2 1:title '3d variant':rotate 50 60:box
-dens a
-
-subplot 2 2 2 '':title '"\#" style; meshnum 10':box
-dens a '#'; meshnum 10
-
-new a1 30 40 3 '0.6*sin(2*pi*x+pi*(z+1)/2)*sin(3*pi*y+pi*z) +\
- 0.4*cos(3*pi*(x*y)+pi*(z+1)^2/2)'
-subplot 2 2 3:title 'several slices':rotate 50 60:box
-dens a1
-@end verbatim
-
-@pfig{dens, Example of Dens()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Cont sample, ContF sample, Dens sample, 2D samples
-@subsection Cont sample
-@nav{}
-
-Command @ref{cont} draw contour lines for surface. You can select automatic (default) or manual levels for contours, print contour labels, draw it on the surface (default) or at plane (as @code{Dens}). The sample code is:
-@verbatim
-call 'prepare2d'
-list v -0.5 -0.15 0 0.15 0.5
-subplot 2 2 0:title 'Cont plot (default)':rotate 50 60:box
-cont a
-
-subplot 2 2 1:title 'manual levels':rotate 50 60:box
-cont v a
-
-subplot 2 2 2:title '"\_" style':rotate 50 60:box
-cont a '_'
-
-subplot 2 2 3 '':title '"t" style':box
-cont a 't'
-@end verbatim
-
-@pfig{cont, Example of Cont()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node ContF sample, ContD sample, Cont sample, 2D samples
-@subsection ContF sample
-@nav{}
-
-Command @ref{contf} draw filled contours.  You can select automatic (default) or manual levels for contours. The sample code is:
-@verbatim
-call 'prepare2d'
-list v -0.5 -0.15 0 0.15 0.5
-subplot 2 2 0:title 'ContF plot (default)':rotate 50 60:box
-contf a
-
-subplot 2 2 1:title 'manual levels':rotate 50 60:box
-contf v a
-
-subplot 2 2 2:title '"\_" style':rotate 50 60:box
-contf a '_'
-
-new a1 30 40 3 '0.6*sin(2*pi*x+pi*(z+1)/2)*sin(3*pi*y+pi*z) +\
- 0.4*cos(3*pi*(x*y)+pi*(z+1)^2/2)'
-subplot 2 2 3:title 'several slices':rotate 50 60:box
-contf a1
-@end verbatim
-
-@pfig{contf, Example of ContF()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node ContD sample, ContV sample, ContF sample, 2D samples
-@subsection ContD sample
-@nav{}
-
-Command @ref{contd} is similar to @code{ContF} but with manual contour colors. The sample code is:
-@verbatim
-call 'prepare2d'
-list v -0.5 -0.15 0 0.15 0.5
-subplot 2 2 0:title 'ContD plot (default)':rotate 50 60:box
-contd a
-
-subplot 2 2 1:title 'manual levels':rotate 50 60:box
-contd v a
-
-subplot 2 2 2:title '"\_" style':rotate 50 60:box
-contd a '_'
-
-new a1 30 40 3 '0.6*sin(2*pi*x+pi*(z+1)/2)*sin(3*pi*y+pi*z) +\
- 0.4*cos(3*pi*(x*y)+pi*(z+1)^2/2)'
-subplot 2 2 3:title 'several slices':rotate 50 60:box
-contd a1
-@end verbatim
-
-@pfig{contd, Example of ContD()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node ContV sample, Axial sample, ContD sample, 2D samples
-@subsection ContV sample
-@nav{}
-
-Command @ref{contv} draw vertical cylinders (belts) at contour lines. The sample code is:
-@verbatim
-call 'prepare2d'
-list v -0.5 -0.15 0 0.15 0.5
-subplot 2 2 0:title 'ContV plot (default)':rotate 50 60:box
-contv a
-
-subplot 2 2 1:title 'manual levels':rotate 50 60:box
-contv v a
-
-subplot 2 2 2:title '"\_" style':rotate 50 60:box
-contv a '_'
-
-subplot 2 2 3:title 'ContV and ContF':rotate 50 60:light on:box
-contv a:contf a:cont a 'k'
-@end verbatim
-
-@pfig{contv, Example of ContV()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Axial sample, Grad sample, ContV sample, 2D samples
-@subsection Axial sample
-@nav{}
-
-Command @ref{axial} draw surfaces of rotation for contour lines. You can draw wire surfaces (@samp{#} style) or ones rotated in other directions (@samp{x}, @samp{z} styles). The sample code is:
-@verbatim
-light on:alpha on:call 'prepare2d'
-subplot 2 2 0:title 'Axial plot (default)':rotate 50 60:box
-axial a
-
-subplot 2 2 1:title '"x" style;\".\" style':light on:rotate 50 60:box
-axial a 'x.'
-
-subplot 2 2 2:title '"z" style':light on:rotate 50 60:box
-axial a 'z'
-
-subplot 2 2 3:title '"\#" style':light on:rotate 50 60:box
-axial a '#'
-@end verbatim
-
-@pfig{axial, Example of Axial()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Grad sample, , Axial sample, 2D samples
-@subsection Grad sample
-@nav{}
-
-Command @ref{grad} draw gradient lines for matrix. The sample code is:
-@verbatim
-call 'prepare2d'
-subplot 1 1 0 '':title 'Grad plot':box
-grad a:dens a '{u8}w{q8}'
-@end verbatim
-
-@pfig{grad, Example of Grad()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node 3D samples, Vector field samples, 2D samples, Examples
-@section 3D samples
-@nav{}
-
-This section is devoted to visualization of 3D data arrays. 3D means the data which depend on 3 indexes (parameters) like tensor a(i,j,k)=a(x(i),y(j),x(k)), i=1...n, j=1...m, k=1...l or in parametric form @{x(i,j,k),y(i,j,k),z(i,j,k),a(i,j,k)@}. Most of samples will use the same data for plotting. So, I put its initialization in separate function
-@verbatim
-func 'prepare3d'
-new c 61 50 40 '-2*(x^2+y^2+z^4-z^2)+0.2'
-new d 61 50 40 '1-2*tanh((x+y)*(x+y))'
-return
-@end verbatim
-Basically, you can put this text after the script. Note, that you need to terminate main script by @ref{stop} command before defining a function.
-
-@menu
-* Surf3 sample::
-* Surf3C sample::
-* Surf3A sample::
-* Surf3CA sample::
-* Cloud sample::
-* Dens3 sample::
-* Cont3 sample::
-* ContF3 sample::
-* Dens projection sample::
-* Cont projection sample::
-* ContF projection sample::
-* TriPlot and QuadPlot::
-* Dots sample::
-* IFS sample::
-@end menu
-
-@c ------------------------------------------------------------------
-@external{}
-@node Surf3 sample, Surf3C sample, , 3D samples
-@subsection Surf3 sample
-@nav{}
-
-Command @ref{surf3} is one of most suitable (for my opinion) functions to visualize 3D data. It draw the isosurface(s) -- surface(s) of constant amplitude (3D analogue of contour lines). You can draw wired isosurfaces if specify @samp{#} style. The sample code is:
-@verbatim
-call 'prepare3d'
-light on:alpha on
-subplot 2 2 0:title 'Surf3 plot':rotate 50 60:box
-surf3 c
-
-subplot 2 2 1:title '"\#" style':rotate 50 60:box
-surf3 c '#'
-
-subplot 2 2 2:title '"." style':rotate 50 60:box
-surf3 c '.'
-@end verbatim
-
-@pfig{surf3, Example of Surf3()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Surf3C sample, Surf3A sample, Surf3 sample, 3D samples
-@subsection Surf3C sample
-@nav{}
-
-Command @ref{surf3c} is similar to @ref{surf3} but its coloring is determined by another data. The sample code is:
-@verbatim
-call 'prepare3d'
-title 'Surf3C plot':rotate 50 60:light on:alpha on:box
-surf3c c d
-@end verbatim
-
-@pfig{surf3c, Example of Surf3C()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Surf3A sample, Surf3CA sample, Surf3C sample, 3D samples
-@subsection Surf3A sample
-@nav{}
-
-Command @ref{surf3a} is similar to @ref{surf3} but its transparency is determined by another data. The sample code is:
-@verbatim
-call 'prepare3d'
-title 'Surf3A plot':rotate 50 60:light on:alpha on:box
-surf3a c d
-@end verbatim
-
-@pfig{surf3a, Example of Surf3A()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Surf3CA sample, Cloud sample, Surf3A sample, 3D samples
-@subsection Surf3CA sample
-@nav{}
-
-Command @ref{surf3ca} is similar to @ref{surf3} but its color and transparency is determined by another data. The sample code is:
-@verbatim
-call 'prepare3d'
-title 'Surf3CA plot':rotate 50 60:light on:alpha on:box
-surf3a c d c
-@end verbatim
-
-@pfig{surf3ca, Example of Surf3CA()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Cloud sample, Dens3 sample, Surf3CA sample, 3D samples
-@subsection Cloud sample
-@nav{}
-
-Command @ref{cloud} draw cloud-like object which is less transparent for higher data values. Similar plot can be created using many (about 10-20) @code{Surf3A(a,a)} isosurfaces. The sample code is:
-@verbatim
-call 'prepare3d'
-subplot 2 2 0:title 'Cloud plot':rotate 50 60:alpha on:box
-cloud c 'wyrRk'
-
-subplot 2 2 1:title '"i" style':rotate 50 60:box
-cloud c 'iwyrRk'
-
-subplot 2 2 2:title '"." style':rotate 50 60:box
-cloud c '.wyrRk'
-
-subplot 2 2 3:title 'meshnum 10':rotate 50 60:box
-cloud c 'wyrRk'; meshnum 10
-@end verbatim
-
-@pfig{cloud, Example of Cloud()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Dens3 sample, Cont3 sample, Cloud sample, 3D samples
-@subsection Dens3 sample
-@nav{}
-
-Command @ref{dens3} draw just usual density plot but at slices of 3D data. The sample code is:
-@verbatim
-call 'prepare3d'
-title 'Dens3 sample':rotate 50 60:alpha on:alphadef 0.7
-origin 0 0 0:box:axis '_xyz'
-dens3 c 'x':dens3 c ':y':dens3 c 'z'
-@end verbatim
-
-@pfig{densa, Example of Dens3()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Cont3 sample, ContF3 sample, Dens3 sample, 3D samples
-@subsection Cont3 sample
-@nav{}
-
-Command @ref{cont3} draw just usual contour lines but at slices of 3D data. The sample code is:
-@verbatim
-call 'prepare3d'
-title 'Cont3 sample':rotate 50 60:box
-cont3 c 'x':cont3 c:cont3 c 'z'
-@end verbatim
-
-@pfig{conta, Example of Cont3()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node ContF3 sample, Dens projection sample, Cont3 sample, 3D samples
-@subsection ContF3 sample
-@nav{}
-
-Command @ref{contf3} draw just usual filled contours but at slices of 3D data. The sample code is:
-@verbatim
-call 'prepare3d'
-title 'Cont3 sample':rotate 50 60:box:light on
-contf3 c 'x':contf3 c:contf3 c 'z'
-cont3 c 'xk':cont3 c 'k':cont3 c 'zk'
-@end verbatim
-
-@pfig{contfa, Example of ContF3()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Dens projection sample, Cont projection sample, ContF3 sample, 3D samples
-@subsection Dens projection sample
-@nav{}
-
-Functions @ref{densz}, @ref{densy}, @ref{densx} draw density plot on plane perpendicular to corresponding axis. One of possible application is drawing projections of 3D field. The sample code is:
-@verbatim
-call 'prepare3d'
-title 'Dens[XYZ] sample':rotate 50 60:box
-densx {sum c 'x'} '' -1
-densy {sum c 'y'} '' 1
-densz {sum c 'z'} '' -1
-@end verbatim
-
-@pfig{dens_xyz, Example of DensX() DensY() DensZ()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Cont projection sample, ContF projection sample, Dens projection sample, 3D samples
-@subsection Cont projection sample
-@nav{}
-
-Functions @ref{contz}, @ref{conty}, @ref{contx} draw contour lines on plane perpendicular to corresponding axis. One of possible application is drawing projections of 3D field. The sample code is:
-@verbatim
-call 'prepare3d'
-title 'Cont[XYZ] sample':rotate 50 60:box
-contx {sum c 'x'} '' -1
-conty {sum c 'y'} '' 1
-contz {sum c 'z'} '' -1
-@end verbatim
-
-@pfig{cont_xyz, Example of ContX() ContY() ContZ()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node ContF projection sample, TriPlot and QuadPlot, Cont projection sample, 3D samples
-@subsection ContF projection sample
-@nav{}
-
-Functions @ref{contfz}, @ref{contfy}, @ref{contfx} draw filled contours on plane perpendicular to corresponding axis. One of possible application is drawing projections of 3D field. The sample code is:
-@verbatim
-call 'prepare3d'
-title 'ContF[XYZ] sample':rotate 50 60:box
-contfx {sum c 'x'} '' -1
-contfy {sum c 'y'} '' 1
-contfz {sum c 'z'} '' -1
-@end verbatim
-
-@pfig{contf_xyz, Example of ContFX() ContFY() ContFZ()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node TriPlot and QuadPlot, Dots sample, ContF projection sample, 3D samples
-@subsection TriPlot and QuadPlot
-@nav{}
-
-Command @ref{triplot} and @ref{quadplot} draw set of triangles (or quadrangles for @code{QuadPlot}) for irregular data arrays. Note, that you have to provide not only vertexes, but also the indexes of triangles or quadrangles. I.e. perform triangulation by some other library. The sample code is:
-@verbatim
-list q 0 1 2 3 | 4 5 6 7 | 0 2 4 6 | 1 3 5 7 | 0 4 1 5 | 2 6 3 7
-list xq -1 1 -1 1 -1 1 -1 1
-list yq -1 -1 1 1 -1 -1 1 1
-list zq -1 -1 -1 -1 1 1 1 1
-light on
-subplot 2 2 0:title 'QuadPlot sample':rotate 50 60
-quadplot q xq yq zq 'yr'
-quadplot q xq yq zq '#k'
-
-subplot 2 2 2:title 'QuadPlot coloring':rotate 50 60
-quadplot q xq yq zq yq 'yr'
-quadplot q xq yq zq '#k'
-
-list t 0 1 2 | 0 1 3 | 0 2 3 | 1 2 3
-list xt -1 1 0 0
-list yt -1 -1 1 0
-list zt -1 -1 -1 1
-subplot 2 2 1:title 'TriPlot sample':rotate 50 60
-triplot t xt yt zt 'b'
-triplot t xt yt zt '#k'
-
-subplot 2 2 3:title 'TriPlot coloring':rotate 50 60
-triplot t xt yt zt yt 'cb'
-triplot t xt yt zt '#k'
-tricont t xt yt zt 'B'
-@end verbatim
-
-@pfig{triplot, Example of TriPlot() and QuadPlot()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Dots sample, IFS sample, TriPlot and QuadPlot, 3D samples
-@subsection Dots sample
-@nav{}
-
-Command @ref{dots} is another way to draw irregular points. @code{Dots} use color scheme for coloring (see @ref{Color scheme}). The sample code is:
-@verbatim
-new t 2000 'pi*(rnd-0.5)':new f 2000 '2*pi*rnd'
-copy x 0.9*cos(t)*cos(f):copy y 0.9*cos(t)*sin(f):copy z 0.6*sin(t):copy c cos(2*t)
-subplot 2 2 0:title 'Dots sample':rotate 50 60
-box:dots x y z
-alpha on
-subplot 2 2 1:title 'add transparency':rotate 50 60
-box:dots x y z c
-subplot 2 2 2:title 'add colorings':rotate 50 60
-box:dots x y z x c
-subplot 2 2 3:title 'Only coloring':rotate 50 60
-box:tens x y z x ' .'
-@end verbatim
-
-@pfig{dots, Example of Dots()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node IFS sample, , Dots sample, 3D samples
-@subsection IFS 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:
-@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]
-ifs2d fx fy A 100000
-subplot 1 1 0 '<_':title 'IFS 2d sample'
-ranges fx fy:axis
-plot fx fy 'r#o ';size 0.05
-@end verbatim
-
-@pfig{ifs2d, Example of IFS fractal (2d case).}
-
-@verbatim
-list A [0,0,0,0,.18,0,0,0,0,0,0,0,.01] [.85,0,0,0,.85,.1,0,-0.1,0.85,0,1.6,0,.85]\
-        [.2,-.2,0,.2,.2,0,0,0,0.3,0,0.8,0,.07] [-.2,.2,0,.2,.2,0,0,0,0.3,0,0.8,0,.07]
-ifs3d f A 100000
-title 'IFS 3d sample':rotate 50 60
-ranges f(0) f(1) f(2):axis:box
-dots f(0) f(1) f(2) 'G#o';size 0.05
-@end verbatim
-
-@pfig{ifs3d, Example of IFS fractal (3d case).}
-
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Vector field samples, Hints, 3D samples, Examples
-@section Vector field samples
-@nav{}
-
-Vector field visualization (especially in 3d case) is more or less complex task. MathGL provides 3 general types of plots: vector field itself (@code{Vect}), flow threads (@code{Flow}), and flow pipes with radius proportional to field amplitude (@code{Pipe}).
-
-However, the plot may look tangly -- there are too many overlapping lines. I may suggest 2 ways to solve this problem. The first one is to change @code{SetMeshNum} for decreasing the number of hachures. The second way is to use the flow thread chart @code{Flow}, or possible many flow thread from manual position (@code{FlowP}). Unfortunately, I don't know any other methods to visualize 3d vector field. If you know any, e-mail me and I shall add it to MathGL.
-
-Most of samples will use the same data for plotting. So, I put its initialization in separate function
-@verbatim
-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 verbatim
-Basically, you can put this text after the script. Note, that you need to terminate main script by @ref{stop} command before defining a function.
-
-@menu
-* Vect sample::
-* Vect3 sample::
-* Traj sample::
-* Flow sample::
-* Pipe sample::
-* Dew sample::
-@end menu
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Vect sample, Vect3 sample, , Vector field samples
-@subsection Vect sample
-@nav{}
-
-Command @ref{vect} is most standard way to visualize vector fields -- it draw a lot of arrows or hachures for each data cell. It have a lot of options which can be seen on the figure (and in the sample code). @code{Vect} use color scheme for coloring (see @ref{Color scheme}). The sample code is:
-@verbatim
-call 'prepare2v'
-subplot 3 2 0 '':title 'Vect plot (default)':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
-@end verbatim
-
-@pfig{vect, Example of Vect()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Vect3 sample, Traj sample, Vect sample, Vector field samples
-@subsection Vect3 sample
-@nav{}
-
-Command @ref{vect3} draw just usual vector field plot but at slices of 3D data. The sample code is:
-@verbatim
-origin 0 0 0:call 'prepare3v'
-subplot 2 1 0:title 'Vect3 sample':rotate 50 60
-box:axis '_xyz'
-vect3 ex ey ez 'x':vect3 ex ey ez:vect3 ex ey ez 'z'
-
-subplot 2 1 1:title '"f" style':rotate 50 60
-box:axis '_xyz'
-vect3 ex ey ez 'fx':vect3 ex ey ez 'f':vect3 ex ey ez 'fz'
-grid3 ex 'Wx':grid3 ex 'W':grid3 ex 'Wz'
-@end verbatim
-
-@pfig{vecta, Example of Vect3()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Traj sample, Flow sample, Vect3 sample, Vector field samples
-@subsection Traj sample
-@nav{}
-
-Command @ref{traj} is 1D analogue of @code{Vect}. It draw vectors from specified points. The sample code is:
-@verbatim
-call 'prepare1d'
-subplot 1 1 0 '':title 'Traj plot':box
-plot x1 y:traj x1 y y1 y2
-@end verbatim
-
-@pfig{traj, Example of Traj()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Flow sample, Pipe sample, Traj sample, Vector field samples
-@subsection Flow sample
-@nav{}
-
-Command @ref{flow} is another standard way to visualize vector fields -- it draw lines (threads) which is tangent to local vector field direction. MathGL draw threads from edges of bounding box and from central slices. Sometimes it is not most appropriate variant -- you may want to use @code{FlowP} to specify manual position of threads. @code{Flow} use color scheme for coloring (see @ref{Color scheme}). At this warm color corresponds to normal flow (like attractor), cold one corresponds to inverse flow (like source). The sample code is:
-@verbatim
-call 'prepare2v'
-subplot 2 2 0 '':title 'Flow plot (default)':box
-flow a b
-
-subplot 2 2 1 '':title '"v" style':box
-flow a b 'v'
-
-subplot 2 2 2 '':title 'from edges only':box
-flow a b '#'
-
-call 'prepare3v'
-subplot 2 2 3:title '3d variant':rotate 50 60:box
-flow ex ey ez
-@end verbatim
-
-@pfig{flow, Example of Flow()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Pipe sample, Dew sample, Flow sample, Vector field samples
-@subsection Pipe sample
-@nav{}
-
-Command @ref{pipe} is similar to @ref{flow} but draw pipes (tubes) which radius is proportional to the amplitude of vector field. @code{Pipe} use color scheme for coloring (see @ref{Color scheme}). At this warm color corresponds to normal flow (like attractor), cold one corresponds to inverse flow (like source). The sample code is:
-@verbatim
-call 'prepare2v'
-subplot 2 2 0 '':title 'Pipe plot (default)':light on:box
-pipe a b
-
-subplot 2 2 1 '':title '"i" style':box
-pipe a b 'i'
-
-subplot 2 2 2 '':title 'from edges only':box
-pipe a b '#'
-
-call 'prepare3v'
-subplot 2 2 3:title '3d variant':rotate 50 60:box
-pipe ex ey ez '' 0.1
-@end verbatim
-
-@pfig{pipe, Example of Pipe()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Dew sample, , Pipe sample, Vector field samples
-@subsection Dew sample
-@nav{}
-
-Command @ref{dew} is similar to @code{Vect} but use drops instead of arrows. The sample code is:
-@verbatim
-call 'prepare2v'
-subplot 1 1 0 '':title 'Dew plot':light on:box
-dew a b
-@end verbatim
-
-@pfig{dew, Example of Dew()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Hints, FAQ, Vector field samples, Examples
-@section Hints
-@nav{}
-
-In this section I've included some small hints and advices for the improving of the quality of plots and for the demonstration of some non-trivial features of MathGL library. In contrast to previous examples I showed mostly the idea but not the whole drawing function.
-
-@menu
-* ``Compound'' graphics::
-* Transparency and lighting::
-* Types of transparency::
-* Axis projection::
-* Adding fog::
-* Lighting sample::
-* Using primitives::
-* STFA sample::
-* Mapping visualization::
-* Data interpolation::
-* Making regular data::
-* Making histogram::
-* Nonlinear fitting hints::
-* PDE solving hints::
-* Drawing phase plain::
-* Pulse properties::
-* Using MGL parser::
-* Using options::
-* ``Templates''::
-* Stereo image::
-* Reduce memory usage::
-* Saving and scanning file::
-@end menu
-
-@c ------------------------------------------------------------------
-@external{}
-@node ``Compound'' graphics, Transparency and lighting, , Hints
-@subsection ``Compound'' graphics
-@nav{}
-
-As I noted above, MathGL functions (except the special one, like Clf()) do  not erase the previous plotting but just add the new one. It allows one to draw ``compound'' plots easily. For example, popular Matlab command @code{surfc} can be emulated in MathGL by 2 calls:
-@verbatim
-  Surf(a);
-  Cont(a, "_");     // draw contours at bottom
-@end verbatim
-Here @var{a} is 2-dimensional data for the plotting, @code{-1} is the value of z-coordinate at which the contour should be plotted (at the bottom in this example). Analogously, one can draw density plot instead of contour lines and so on.
-
-Another nice plot is contour lines plotted directly on the surface:
-@verbatim
-  Light(true);       // switch on light for the surface
-  Surf(a, "BbcyrR"); // select 'jet' colormap for the surface
-  Cont(a, "y");      // and yellow color for contours
-@end verbatim
-The possible difficulties arise in black&white case, when the color of the surface can be close to the color of a contour line. In that case I may suggest the following code:
-@verbatim
-  Light(true);   // switch on light for the surface
-  Surf(a, "kw"); // select 'gray' colormap for the surface
-  CAxis(-1,0);   // first draw for darker surface colors
-  Cont(a, "w");  // white contours
-  CAxis(0,1);    // now draw for brighter surface colors
-  Cont(a, "k");  // black contours
-  CAxis(-1,1);   // return color range to original state
-@end verbatim
-The idea is to divide the color range on 2 parts (dark and bright) and to select the contrasting color for contour lines for each of part.
-
-Similarly, one can plot flow thread over density plot of vector field amplitude (this is another amusing plot from Matlab) and so on. The list of compound graphics can be prolonged but I hope that the general idea is clear.
-
-Just for illustration I put here following sample code:
-@verbatim
-call 'prepare2v'
-call 'prepare3d'
-new v 10:fill v -0.5 1:copy d sqrt(a^2+b^2)
-subplot 2 2 0:title 'Surf + Cont':rotate 50 60:light on:box
-surf a:cont a 'y'
-
-subplot 2 2 1 '':title 'Flow + Dens':light off:box
-flow a b 'br':dens d
-
-subplot 2 2 2:title 'Mesh + Cont':rotate 50 60:box
-mesh a:cont a '_'
-
-subplot 2 2 3:title 'Surf3 + ContF3':rotate 50 60:light on
-box:contf3 v c 'z' 0:contf3 v c 'x':contf3 v c
-cut 0 -1 -1 1 0 1.1
-contf3 v c 'z' c.nz-1:surf3 c -0.5
-@end verbatim
-
-@pfig{combined, Example of ``combined'' plots}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Transparency and lighting, Types of transparency, ``Compound'' graphics, Hints
-@subsection Transparency and lighting
-@nav{}
-
-Here I want to show how transparency and lighting both and separately change the look of a surface. So, there is code and picture for that:
-@verbatim
-call 'prepare2d'
-subplot 2 2 0:title 'default':rotate 50 60:box
-surf a
-
-subplot 2 2 1:title 'light on':rotate 50 60:box
-light on:surf a
-
-subplot 2 2 3:title 'light on; alpha on':rotate 50 60:box
-alpha on:surf a
-
-subplot 2 2 2:title 'alpha on':rotate 50 60:box
-light off:surf a
-@end verbatim
-
-@pfig{alpha, Example of transparency and lightings}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Types of transparency, Axis projection, Transparency and lighting, Hints
-@subsection Types of transparency
-@nav{}
-
-MathGL library has advanced features for setting and handling the surface transparency. The simplest way to add transparency is the using of command @ref{alpha}. As a result, all further surfaces (and isosurfaces, density plots and so on) become transparent. However, their  look can be additionally improved.
-
-The value of transparency can be different from surface to surface. To do it just use @code{SetAlphaDef} before the drawing of the surface, or use option @code{alpha} (see @ref{Command options}). If its value is close to 0 then the surface becomes more and more transparent. Contrary, if its value is close to 1 then the surface becomes practically non-transparent.
-
-Also you can change the way how the light goes through overlapped surfaces. The function @code{SetTranspType} defines it. By default the usual transparency is used (@samp{0}) -- surfaces below is less visible than the upper ones. A ``glass-like'' transparency (@samp{1}) has a different look -- each surface just decreases the background light (the surfaces are commutable in this case).
-
-A ``neon-like'' transparency (@samp{2}) has more interesting look. In this case a surface is the light source (like a lamp on the dark background) and just adds some intensity to the color. At this, the library sets automatically the black color for the background and changes the default line color to white.
-
-As example I shall show several plots for different types of transparency. The code is the same except the values of @code{SetTranspType} function:
-@verbatim
-call 'prepare2d'
-alpha on:light on
-transptype 0:clf
-subplot 2 2 0:rotate 50 60:surf a:box
-subplot 2 2 1:rotate 50 60:dens a:box
-subplot 2 2 2:rotate 50 60:cont a:box
-subplot 2 2 3:rotate 50 60:axial a:box
-@end verbatim
-
-@pfig{type0, Example of @code{SetTranspType(0)}.}
-@pfig{type1, Example of @code{SetTranspType(1)}.}
-@pfig{type2, Example of @code{SetTranspType(2)}.}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Axis projection, Adding fog, Ternary axis, Hints
-@subsection Axis projection
-@nav{}
-
-You can easily make 3D plot and draw its x-,y-,z-projections (like in CAD) by using @ref{ternary} function with arguments: 4 for Cartesian, 5 for Ternary and 6 for Quaternary coordinates. The sample code is:
-@verbatim
-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 verbatim
-
-@pfig{projection, Example of axis projections}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Adding fog, Lighting sample, Axis projection, Hints
-@subsection Adding fog
-@nav{}
-
-MathGL can add a fog to the image. Its switching on is rather simple -- just use @ref{fog} function. There is the only feature -- fog is applied for whole image. Not to particular subplot. The sample code is:
-@verbatim
-call 'prepare2d'
-title 'Fog sample':rotate 50 60:light on
-fog 1
-box:surf a:cont a 'y'
-@end verbatim
-
-@pfig{fog, Example of @code{Fog()}.}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Lighting sample, Using primitives, Adding fog, Hints
-@subsection Lighting sample
-@nav{}
-
-In contrast to the most of other programs, MathGL supports several (up to 10) light sources. Moreover, the color each of them can be different: white (this is usual), yellow, red, cyan, green and so on. The use of several light sources may be interesting for the highlighting of some peculiarities of the plot or just to make an amusing picture. Note, each light source can be switched on/off individually. The sample code is:
-@verbatim
-call 'prepare2d'
-title 'Several light sources':rotate 50 60:light on
-light 1 0 1 0 'c':light 2 1 0 0 'y':light 3 0 -1 0 'm'
-box:surf a 'h'
-@end verbatim
-
-@pfig{several_light, Example of several light sources.}
-
-Additionally, you can use local light sources and set to use @ref{diffuse} reflection instead of specular one (by default) or both kinds. Note, I use @ref{attachlight} command to keep light settings relative to subplot.
-@verbatim
-light on: attachlight on
-call 'prepare2d'
-subplot 2 2 0:title 'Default':rotate 50 60:box:surf a
-line -1 -0.7 1.7 -1 -0.7 0.7 'BA'
-
-subplot 2 2 1:title 'Local':rotate 50 60
-light 0 1 0 1 -2 -1 -1
-line 1 0 1 -1 -1 0 'BAO':box:surf a
-
-subplot 2 2 2:title 'no diffuse':rotate 50 60
-diffuse 0
-line 1 0 1 -1 -1 0 'BAO':box:surf a
-
-subplot 2 2 3:title 'diffusive only':rotate 50 60
-diffuse 0.5:light 0 1 0 1 -2 -1 -1 'w' 0
-line 1 0 1 -1 -1 0 'BAO':box:surf a
-@end verbatim
-
-@pfig{light, Example of different types of lighting.}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Using primitives, STFA sample, Lighting sample, Hints
-@subsection Using primitives
-@nav{}
-
-MathGL provide a set of functions for drawing primitives (see @ref{Primitives}). Primitives are low level object, which used by most of plotting functions. Picture below demonstrate some of commonly used primitives.
-@verbatim
-subplot 2 2 0 '':title 'Line, Curve, Rhomb, Ellipse' '' -1.5
-line -1 -1 -0.5 1 'qAI'
-curve -0.6 -1 1 1 0 1 1 1 'rA'
-ball 0 -0.5 '*':ball 1 -0.1 '*'
-rhomb 0 0.4 1 0.9 0.2 'b#'
-rhomb 0 0 1 0.4 0.2 'cg@'
-ellipse 0 -0.5 1 -0.1 0.2 'u#'
-ellipse 0 -1 1 -0.6 0.2 'm@'
-
-light on
-subplot 2 2 1:title 'Face[xyz]':rotate 50 60:box
-facex 1 0 -1 1 1 'r':facey -1 -1 -1 1 1 'g':facez 1 -1 -1 -1 1 'b'
-face -1 -1 1 -1 1 1 1 -1 0 1 1 1 'bmgr'
-
-subplot 2 2 3 '':title 'Cone'
-cone -0.7 -0.3 0 -0.7 0.7 0.5 0.2 0.1 'b':text -0.7 -0.7 'no edges\n(default)'
-cone 0 -0.3 0 0 0.7 0.5 0.2 0.1 'g@':text 0 -0.7 'with edges\n('\@' style)'
-cone 0.7 -0.3 0 0.7 0.7 0.5 0.2 0.1 'ry':text 0.7 -0.7 '"arrow" with\n{}gradient'
-
-subplot 2 2 2 '':title 'Sphere and Drop'
-line -0.9 0 1 0.9 0 1
-text -0.9 -0.7 'sh=0':drop -0.9 0 0 1 0.5 'r' 0:ball -0.9 0 1 'k'
-text -0.3 -0.7 'sh=0.33':drop -0.3 0 0 1 0.5 'r' 0.33:ball -0.3 0 1 'k'
-text 0.3 -0.7 'sh=0.67':drop 0.3 0 0 1 0.5 'r' 0.67:ball 0.3 0 1 'k'
-text 0.9 -0.7 'sh=1':drop 0.9 0 0 1 0.5 'r' 1:ball 0.9 0 1 'k'
-@end verbatim
-
-@pfig{primitives, Primitives in MathGL.}
-
-Generally, you can create arbitrary new kind of plot using primitives. For example, MathGL don't provide any special functions for drawing molecules. However, you can do it using only one type of primitives @ref{drop}. The sample code is:
-@verbatim
-alpha on:light on
-subplot 2 2 0 '':title 'Methane, CH_4':rotate 60 120
-sphere 0 0 0 0.25 'k':drop 0 0 0 0 0 1 0.35 'h' 1 2:sphere 0 0 0.7 0.25 'g'
-drop 0 0 0 -0.94 0 -0.33 0.35 'h' 1 2:sphere -0.66 0 -0.23 0.25 'g'
-drop 0 0 0 0.47 0.82 -0.33 0.35 'h' 1 2:sphere 0.33 0.57 -0.23 0.25 'g'
-drop 0 0 0 0.47 -0.82 -0.33 0.35 'h' 1 2:sphere 0.33 -0.57 -0.23 0.25 'g'
-
-subplot 2 2 1 '':title 'Water, H{_2}O':rotate 60 100
-sphere 0 0 0 0.25 'r':drop 0 0 0 0.3 0.5 0 0.3 'm' 1 2:sphere 0.3 0.5 0 0.25 'g'
-drop 0 0 0 0.3 -0.5 0 0.3 'm' 1 2:sphere 0.3 -0.5 0 0.25 'g'
-
-subplot 2 2 2 '':title 'Oxygen, O_2':rotate 60 120
-drop 0 0.5 0 0 -0.3 0 0.3 'm' 1 2:sphere 0 0.5 0 0.25 'r'
-drop 0 -0.5 0 0 0.3 0 0.3 'm' 1 2:sphere 0 -0.5 0 0.25 'r'
-
-subplot 2 2 3 '':title 'Ammonia, NH_3':rotate 60 120
-sphere 0 0 0 0.25 'b':drop 0 0 0 0.33 0.57 0 0.32 'n' 1 2
-sphere 0.33 0.57 0 0.25 'g':drop 0 0 0 0.33 -0.57 0 0.32 'n' 1 2
-sphere 0.33 -0.57 0 0.25 'g':drop 0 0 0 -0.65 0 0 0.32 'n' 1 2
-sphere -0.65 0 0 0.25 'g'
-@end verbatim
-
-@pfig{molecule, Example of molecules drawing.}
-
-Moreover, some of special plots can be more easily produced by primitives rather than by specialized function. For example, Venn diagram can be produced by @code{Error} plot:
-@verbatim
-list x -0.3 0 0.3:list y 0.3 -0.3 0.3:list e 0.7 0.7 0.7
-title 'Venn-like diagram':alpha on
-error x y e e '!rgb@#o'
-@end verbatim
-You see that you have to specify and fill 3 data arrays. The same picture can be produced by just 3 calls of @ref{circle} function:
-@verbatim
-title 'Venn-like diagram':alpha on
-circle -0.3 0.3 0.7 'rr@'
-circle 0 -0.3 0.7 'gg@'
-circle 0.3 0.3 0.7 'bb@'
-@end verbatim
-Of course, the first variant is more suitable if you need to plot a lot of circles. But for few ones the usage of primitives looks easy.
-
-@pfig{venn, Example of Venn diagram.}
-
-@c ------------------------------------------------------------------
-@external{}
-@node STFA sample, Mapping visualization, Using primitives, Hints
-@subsection STFA sample
-@nav{}
-
-Short-time Fourier Analysis (@ref{stfa}) is one of informative method for analyzing long rapidly oscillating 1D data arrays. It is used to determine the sinusoidal frequency and phase content of local sections of a signal as it changes over time.
-
-MathGL can find and draw STFA result. Just to show this feature I give following sample. Initial data arrays is 1D arrays with step-like frequency. Exactly this you can see at bottom on the STFA plot. The sample code is:
-@verbatim
-new a 2000:new b 2000
-fill a 'cos(50*pi*x)*(x<-.5)+cos(100*pi*x)*(x<0)*(x>-.5)+\
-cos(200*pi*x)*(x<.5)*(x>0)+cos(400*pi*x)*(x>.5)'
-
-subplot 1 2 0 '<_':title 'Initial signal'
-plot a:axis:xlabel '\i t'
-
-subplot 1 2 1 '<_':title 'STFA plot'
-stfa a b 64:axis:ylabel '\omega' 0:xlabel '\i t'
-@end verbatim
-
-@pfig{stfa, Example of STFA().}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Mapping visualization, Data interpolation, STFA sample, Hints
-@subsection Mapping visualization
+@node Mapping visualization, Data interpolation, STFA sample, Hints
+@subsection Mapping visualization
 @nav{}
 
 Sometime ago I worked with mapping and have a question about its visualization. Let me remember you that mapping is some transformation rule for one set of number to another one. The 1d mapping is just an ordinary function -- it takes a number and transforms it to another one. The 2d mapping (which I used) is a pair of functions which take 2 numbers and transform them to another 2 ones. Except general plots (like @ref{surfc}, @ref{surfa}) there is a special plot -- Arnold diagram. It shows the area which is the result of mapping of some initial area (usually square).
@@ -2857,7 +1327,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
@@ -2875,6 +1345,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{}
@@ -3072,7 +1562,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{}
 
@@ -3103,6 +1593,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 eb0924e9f56dbe7e863baff81dd5a4270f96ebb2..17e728e816deb161573ef3b652e51758c03f3d44 100644 (file)
@@ -4,53 +4,11 @@
 
 This chapter contain information about basic and advanced MathGL, hints and samples for all types of graphics. I recommend you read first 2 sections one after another and at least look on @ref{Hints} section. Also I recommend you to look at @ref{General concepts} and @ref{FAQ}.
 
-Most of sample scripts placed below use a set of functions for preparing the data.
-@verbatim
-func '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
-new x1 50 'x'
-new x2 50 '0.05-0.03*cos(pi*x)'
-new y1 50 '0.5-0.3*cos(pi*x)'
-new y2 50 '-0.3*sin(pi*x)'
-return
-
-func '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))'
-return
-
-func 'prepare3d'
-new c 61 50 40 '-2*(x^2+y^2+z^4-z^2)+0.2'
-new d 61 50 40 '1-2*tanh((x+y)*(x+y))'
-return
-
-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 verbatim
-Basically, you can put this text after the script. Note, that you need to terminate main script by @ref{stop} command before defining a function.
-
 @menu
 * Basic usage::
 * Advanced usage::
 * Data handling::
 * Data plotting::
-* 1D samples::
-* 2D samples::
-* 3D samples::
-* Vector field samples::
 * Hints::
 * FAQ::
 @end menu
@@ -752,7 +710,7 @@ plot v1 u2 'r2v':line 0.5 0.7 0.5 0.85 'rA'
 
 @c ------------------------------------------------------------------
 @external{}
-@node Data plotting, 1D samples, Data handling, Examples
+@node Data plotting, Hints, Data handling, Examples
 @section Data plotting
 @nav{}
 
@@ -842,1823 +800,335 @@ dens a1:box
 @end verbatim
 
 Drawing of other 2D plots is analogous. The only peculiarity is the usage of flag @samp{#}. By default this flag switches on the drawing of a grid on plot (@ref{grid} or @ref{mesh} for plots in plain or in volume). However, for isosurfaces (including surfaces of rotation @ref{axial}) this flag switches the  face drawing off and figure becomes wired.
+
 @c ------------------------------------------------------------------
 @external{}
-@node 1D samples, 2D samples, Data plotting, Examples
-@section 1D samples
+@node Hints, FAQ, Data plotting, Examples
+@section Hints
 @nav{}
 
-This section is devoted to visualization of 1D data arrays. 1D means the data which depend on single index (parameter) like curve in parametric form @{x(i),y(i),z(i)@}, i=1...n. Most of samples will use the same data for plotting. So, I put its initialization in separate function
-@verbatim
-func '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
-new x1 50 'x'
-new x2 50 '0.05-0.03*cos(pi*x)'
-new y1 50 '0.5-0.3*cos(pi*x)'
-new y2 50 '-0.3*sin(pi*x)'
-return
-@end verbatim
-Basically, you can put this text after the script. Note, that you need to terminate main script by @ref{stop} command before defining a function.
+In this section I've included some small hints and advices for the improving of the quality of plots and for the demonstration of some non-trivial features of MathGL library. In contrast to previous examples I showed mostly the idea but not the whole drawing function.
 
 @menu
-* Plot sample::
-* Radar sample::
-* Step sample::
-* Tens sample::
-* Area sample::
-* Region sample::
-* Stem sample::
-* Bars sample::
-* Barh sample::
-* Cones sample::
-* Chart sample::
-* BoxPlot sample::
-* Candle sample::
-* OHLC sample::
-* Error sample::
-* Mark sample::
-* TextMark sample::
-* Label sample::
-* Table sample::
-* Tube sample::
-* Tape sample::
-* Torus sample::
-* Lamerey sample::
-* Bifurcation sample::
-* Pmap sample::
+* ``Compound'' graphics::
+* Transparency and lighting::
+* Types of transparency::
+* Axis projection::
+* Adding fog::
+* Lighting sample::
+* Using primitives::
+* STFA sample::
+* Mapping visualization::
+* Data interpolation::
+* Making regular data::
+* Making histogram::
+* Nonlinear fitting hints::
+* PDE solving hints::
+* Drawing phase plain::
+* Pulse properties::
+* Using MGL parser::
+* Using options::
+* ``Templates''::
+* Stereo image::
+* Reduce memory usage::
+* Saving and scanning file::
+* Mixing bitmap and vector output::
 @end menu
 
-
 @c ------------------------------------------------------------------
 @external{}
-@node Plot sample, Radar sample, , 1D samples
-@subsection Plot sample
+@node ``Compound'' graphics, Transparency and lighting, , Hints
+@subsection ``Compound'' graphics
 @nav{}
 
-Command @ref{plot} is most standard way to visualize 1D data array. By default, @code{Plot} use colors from palette. However, you can specify manual color/palette, and even set to use new color for each points by using @samp{!} style. Another feature is @samp{ } style which draw only markers without line between points. The sample code is:
+As I noted above, MathGL functions (except the special one, like Clf()) do  not erase the previous plotting but just add the new one. It allows one to draw ``compound'' plots easily. For example, popular Matlab command @code{surfc} can be emulated in MathGL by 2 calls:
 @verbatim
-call 'prepare1d'
-subplot 2 2 0 '':title 'Plot plot (default)':box
-plot y
-
-subplot 2 2 2 '':title ''!' style; 'rgb' palette':box
-plot y 'o!rgb'
-
-subplot 2 2 3 '':title 'just markers':box
-plot y ' +'
-
-new yc 30 'sin(pi*x)':new xc 30 'cos(pi*x)':new z 30 'x'
-subplot 2 2 1:title '3d variant':rotate 50 60:box
-plot xc yc z 'rs'
+  Surf(a);
+  Cont(a, "_");     // draw contours at bottom
 @end verbatim
+Here @var{a} is 2-dimensional data for the plotting, @code{-1} is the value of z-coordinate at which the contour should be plotted (at the bottom in this example). Analogously, one can draw density plot instead of contour lines and so on.
 
-@pfig{plot, Example of Plot()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Radar sample, Step sample, Plot sample, 1D samples
-@subsection Radar sample
-@nav{}
-
-Command @ref{radar} plot is variant of @code{Plot} one, which make plot in polar coordinates and draw radial rays in point directions. If you just need a plot in polar coordinates then I recommend to use @ref{Curvilinear coordinates} or @code{Plot} in parabolic form with @code{x=r*cos(fi); y=r*sin(fi);}. The sample code is:
+Another nice plot is contour lines plotted directly on the surface:
+@verbatim
+  Light(true);       // switch on light for the surface
+  Surf(a, "BbcyrR"); // select 'jet' colormap for the surface
+  Cont(a, "y");      // and yellow color for contours
+@end verbatim
+The possible difficulties arise in black&white case, when the color of the surface can be close to the color of a contour line. In that case I may suggest the following code:
 @verbatim
-new yr 10 3 '0.4*sin(pi*(x+1.5+y/2)+0.1*rnd)'
-subplot 1 1 0 '':title 'Radar plot (with grid, "\#")'
-radar yr '#'
+  Light(true);   // switch on light for the surface
+  Surf(a, "kw"); // select 'gray' colormap for the surface
+  CAxis(-1,0);   // first draw for darker surface colors
+  Cont(a, "w");  // white contours
+  CAxis(0,1);    // now draw for brighter surface colors
+  Cont(a, "k");  // black contours
+  CAxis(-1,1);   // return color range to original state
 @end verbatim
+The idea is to divide the color range on 2 parts (dark and bright) and to select the contrasting color for contour lines for each of part.
 
-@pfig{radar, Example of Radar()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Step sample, Tens sample, Radar sample, 1D samples
-@subsection Step sample
-@nav{}
+Similarly, one can plot flow thread over density plot of vector field amplitude (this is another amusing plot from Matlab) and so on. The list of compound graphics can be prolonged but I hope that the general idea is clear.
 
-Command @ref{step} plot data as stairs. It have the same options as @code{Plot}. The sample code is:
+Just for illustration I put here following sample code:
 @verbatim
-call 'prepare1d'
-origin 0 0 0:subplot 2 2 0 '':title 'Step plot (default)':box
-step y
+call 'prepare2v'
+call 'prepare3d'
+new v 10:fill v -0.5 1:copy d sqrt(a^2+b^2)
+subplot 2 2 0:title 'Surf + Cont':rotate 50 60:light on:box
+surf a:cont a 'y'
 
-new yc 30 'sin(pi*x)':new xc 30 'cos(pi*x)':new z 30 'x'
-subplot 2 2 1:title '3d variant':rotate 50 60:box
-step xc yc z 'r'
+subplot 2 2 1 '':title 'Flow + Dens':light off:box
+flow a b 'br':dens d
+
+subplot 2 2 2:title 'Mesh + Cont':rotate 50 60:box
+mesh a:cont a '_'
 
-subplot 2 2 2 '':title '"!" style':box
-step y 's!rgb'
+subplot 2 2 3:title 'Surf3 + ContF3':rotate 50 60:light on
+box:contf3 v c 'z' 0:contf3 v c 'x':contf3 v c
+cut 0 -1 -1 1 0 1.1
+contf3 v c 'z' c.nz-1:surf3 c -0.5
 @end verbatim
 
-@pfig{step, Example of Step()}
+@pfig{combined, Example of ``combined'' plots}
 
 @c ------------------------------------------------------------------
 @external{}
-@node Tens sample, Area sample, Step sample, 1D samples
-@subsection Tens sample
+@node Transparency and lighting, Types of transparency, ``Compound'' graphics, Hints
+@subsection Transparency and lighting
 @nav{}
 
-Command @ref{tens} is variant of @ref{plot} with smooth coloring along the curves. At this, color is determined as for surfaces (see @ref{Color scheme}). The sample code is:
+Here I want to show how transparency and lighting both and separately change the look of a surface. So, there is code and picture for that:
 @verbatim
-call 'prepare1d'
-subplot 2 2 0 '':title 'Tens plot (default)':box
-tens y(:,0) y(:,1)
+call 'prepare2d'
+subplot 2 2 0:title 'default':rotate 50 60:box
+surf a
+
+subplot 2 2 1:title 'light on':rotate 50 60:box
+light on:surf a
 
-subplot 2 2 2 '':title ' style':box
-tens y(:,0) y(:,1) 'o '
+subplot 2 2 3:title 'light on; alpha on':rotate 50 60:box
+alpha on:surf a
 
-new yc 30 'sin(pi*x)':new xc 30 'cos(pi*x)':new z 30 'x'
-subplot 2 2 1:title '3d variant':rotate 50 60:box
-tens xc yc z z 's'
+subplot 2 2 2:title 'alpha on':rotate 50 60:box
+light off:surf a
 @end verbatim
 
-@pfig{tens, Example of Tens()}
+@pfig{alpha, Example of transparency and lightings}
 
 @c ------------------------------------------------------------------
 @external{}
-@node Area sample, Region sample, Tens sample, 1D samples
-@subsection Area sample
+@node Types of transparency, Axis projection, Transparency and lighting, Hints
+@subsection Types of transparency
 @nav{}
 
-Command @ref{area} fill the area between curve and axis plane. It support gradient filling if 2 colors per curve is specified. The sample code is:
-@verbatim
-call 'prepare1d'
-origin 0 0 0
-subplot 2 2 0 '':title 'Area plot (default)':box
-area y
+MathGL library has advanced features for setting and handling the surface transparency. The simplest way to add transparency is the using of command @ref{alpha}. As a result, all further surfaces (and isosurfaces, density plots and so on) become transparent. However, their  look can be additionally improved.
+
+The value of transparency can be different from surface to surface. To do it just use @code{SetAlphaDef} before the drawing of the surface, or use option @code{alpha} (see @ref{Command options}). If its value is close to 0 then the surface becomes more and more transparent. Contrary, if its value is close to 1 then the surface becomes practically non-transparent.
 
-subplot 2 2 1 '':title '2 colors':box
-area y 'cbgGyr'
+Also you can change the way how the light goes through overlapped surfaces. The function @code{SetTranspType} defines it. By default the usual transparency is used (@samp{0}) -- surfaces below is less visible than the upper ones. A ``glass-like'' transparency (@samp{1}) has a different look -- each surface just decreases the background light (the surfaces are commutable in this case).
 
-subplot 2 2 2 '':title '"!" style':box
-area y '!'
+A ``neon-like'' transparency (@samp{2}) has more interesting look. In this case a surface is the light source (like a lamp on the dark background) and just adds some intensity to the color. At this, the library sets automatically the black color for the background and changes the default line color to white.
 
-new yc 30 'sin(pi*x)':new xc 30 'cos(pi*x)':new z 30 'x'
-subplot 2 2 3:title '3d variant':rotate 50 60:box
-area xc yc z 'r':area xc -yc z 'b#'
+As example I shall show several plots for different types of transparency. The code is the same except the values of @code{SetTranspType} function:
+@verbatim
+call 'prepare2d'
+alpha on:light on
+transptype 0:clf
+subplot 2 2 0:rotate 50 60:surf a:box
+subplot 2 2 1:rotate 50 60:dens a:box
+subplot 2 2 2:rotate 50 60:cont a:box
+subplot 2 2 3:rotate 50 60:axial a:box
 @end verbatim
 
-@pfig{area, Example of Area()}
+@pfig{type0, Example of @code{SetTranspType(0)}.}
+@pfig{type1, Example of @code{SetTranspType(1)}.}
+@pfig{type2, Example of @code{SetTranspType(2)}.}
+
 
 @c ------------------------------------------------------------------
 @external{}
-@node Region sample, Stem sample, Area sample, 1D samples
-@subsection Region sample
+@node Axis projection, Adding fog, Ternary axis, Hints
+@subsection Axis projection
 @nav{}
 
-Command @ref{region} fill the area between 2 curves. It support gradient filling if 2 colors per curve is specified. Also it can fill only the region y1<y<y2 if style @samp{i} is used. The sample code is:
+You can easily make 3D plot and draw its x-,y-,z-projections (like in CAD) by using @ref{ternary} function with arguments: 4 for Cartesian, 5 for Ternary and 6 for Quaternary coordinates. The sample code is:
 @verbatim
-call 'prepare1d'
-copy y1 y(:,1):copy y2 y(:,2)
-
-subplot 2 2 0 '':title 'Region plot (default)':box
-region y1 y2:plot y1 'k2':plot y2 'k2'
-
-subplot 2 2 1 '':title '2 colors':box
-region y1 y2 'yr':plot y1 'k2':plot y2 'k2'
-
-subplot 2 2 2 '':title '"i" style':box
-region y1 y2 'ir':plot y1 'k2':plot y2 'k2'
+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
 
-subplot 2 2 3 '^_':title '3d variant':rotate 40 60:box
-new x1 100 'sin(pi*x)':new y1 100 'cos(pi*x)':new z 100 'x'
-new x2 100 'sin(pi*x+pi/3)':new y2 100 'cos(pi*x+pi/3)'
-plot x1 y1 z 'r2':plot x2 y2 z 'b2'
-region x1 y1 z x2 y2 z 'cmy!'
+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 verbatim
 
-@pfig{region, Example of Region()}
+@pfig{projection, Example of axis projections}
 
 @c ------------------------------------------------------------------
 @external{}
-@node Stem sample, Bars sample, Region sample, 1D samples
-@subsection Stem sample
+@node Adding fog, Lighting sample, Axis projection, Hints
+@subsection Adding fog
 @nav{}
 
-Command @ref{stem} draw vertical bars. It is most attractive if markers are drawn too. The sample code is:
+MathGL can add a fog to the image. Its switching on is rather simple -- just use @ref{fog} function. There is the only feature -- fog is applied for whole image. Not to particular subplot. The sample code is:
 @verbatim
-call 'prepare1d'
-origin 0 0 0:subplot 2 2 0 '':title 'Stem plot (default)':box
-stem y
-
-new yc 30 'sin(pi*x)':new xc 30 'cos(pi*x)':new z 30 'x'
-subplot 2 2 1:title '3d variant':rotate 50 60:box
-stem xc yc z 'rx'
-
-subplot 2 2 2 '':title '"!" style':box
-stem y 'o!rgb'
+call 'prepare2d'
+title 'Fog sample':rotate 50 60:light on
+fog 1
+box:surf a:cont a 'y'
 @end verbatim
 
-@pfig{stem, Example of Stem()}
+@pfig{fog, Example of @code{Fog()}.}
 
 @c ------------------------------------------------------------------
 @external{}
-@node Bars sample, Barh sample, Stem sample, 1D samples
-@subsection Bars sample
+@node Lighting sample, Using primitives, Adding fog, Hints
+@subsection Lighting sample
 @nav{}
 
-Command @ref{bars} draw vertical bars. It have a lot of options: bar-above-bar (@samp{a} style), fall like (@samp{f} style), 2 colors for positive and negative values, wired bars (@samp{#} style), 3D variant. The sample code is:
+In contrast to the most of other programs, MathGL supports several (up to 10) light sources. Moreover, the color each of them can be different: white (this is usual), yellow, red, cyan, green and so on. The use of several light sources may be interesting for the highlighting of some peculiarities of the plot or just to make an amusing picture. Note, each light source can be switched on/off individually. The sample code is:
 @verbatim
-new ys 10 3 '0.8*sin(pi*(x+y/4+1.25))+0.2*rnd':origin 0 0 0
-subplot 3 2 0 '':title 'Bars plot (default)':box
-bars ys
+call 'prepare2d'
+title 'Several light sources':rotate 50 60:light on
+light 1 0 1 0 'c':light 2 1 0 0 'y':light 3 0 -1 0 'm'
+box:surf a 'h'
+@end verbatim
 
-subplot 3 2 1 '':title '2 colors':box
-bars ys 'cbgGyr'
+@pfig{several_light, Example of several light sources.}
 
-subplot 3 2 4 '':title '"\#" style':box
-bars ys '#'
+Additionally, you can use local light sources and set to use @ref{diffuse} reflection instead of specular one (by default) or both kinds. Note, I use @ref{attachlight} command to keep light settings relative to subplot.
+@verbatim
+light on: attachlight on
+call 'prepare2d'
+subplot 2 2 0:title 'Default':rotate 50 60:box:surf a
+line -1 -0.7 1.7 -1 -0.7 0.7 'BA'
 
-new yc 30 'sin(pi*x)':new xc 30 'cos(pi*x)':new z 30 'x'
-subplot 3 2 5:title '3d variant':rotate 50 60:box
-bars xc yc z 'r'
+subplot 2 2 1:title 'Local':rotate 50 60
+light 0 1 0 1 -2 -1 -1
+line 1 0 1 -1 -1 0 'BAO':box:surf a
 
-subplot 3 2 2 '':title '"a" style':ranges -1 1 -3 3:box
-bars ys 'a'
+subplot 2 2 2:title 'no diffuse':rotate 50 60
+diffuse 0
+line 1 0 1 -1 -1 0 'BAO':box:surf a
 
-subplot 3 2 3 '':title '"f" style':box
-bars ys 'f'
+subplot 2 2 3:title 'diffusive only':rotate 50 60
+diffuse 0.5:light 0 1 0 1 -2 -1 -1 'w' 0
+line 1 0 1 -1 -1 0 'BAO':box:surf a
 @end verbatim
 
-@pfig{bars, Example of Bars()}
+@pfig{light, Example of different types of lighting.}
 
 @c ------------------------------------------------------------------
 @external{}
-@node Barh sample, Cones sample, Bars sample, 1D samples
-@subsection Barh sample
+@node Using primitives, STFA sample, Lighting sample, Hints
+@subsection Using primitives
 @nav{}
 
-Command @ref{barh} is the similar to @code{Bars} but draw horizontal bars. The sample code is:
+MathGL provide a set of functions for drawing primitives (see @ref{Primitives}). Primitives are low level object, which used by most of plotting functions. Picture below demonstrate some of commonly used primitives.
 @verbatim
-new ys 10 3 '0.8*sin(pi*(x+y/4+1.25))+0.2*rnd':origin 0 0 0
-subplot 2 2 0 '':title 'Barh plot (default)':box
-barh ys
+subplot 2 2 0 '':title 'Line, Curve, Rhomb, Ellipse' '' -1.5
+line -1 -1 -0.5 1 'qAI'
+curve -0.6 -1 1 1 0 1 1 1 'rA'
+ball 0 -0.5 '*':ball 1 -0.1 '*'
+rhomb 0 0.4 1 0.9 0.2 'b#'
+rhomb 0 0 1 0.4 0.2 'cg@'
+ellipse 0 -0.5 1 -0.1 0.2 'u#'
+ellipse 0 -1 1 -0.6 0.2 'm@'
 
-subplot 2 2 1 '':title '2 colors':box
-barh ys 'cbgGyr'
+light on
+subplot 2 2 1:title 'Face[xyz]':rotate 50 60:box
+facex 1 0 -1 1 1 'r':facey -1 -1 -1 1 1 'g':facez 1 -1 -1 -1 1 'b'
+face -1 -1 1 -1 1 1 1 -1 0 1 1 1 'bmgr'
 
-ranges -3 3 -1 1:subplot 2 2 2 '':title '"a" style':box:barh ys 'a'
-subplot 2 2 3 '': title '"f" style':box
-barh ys 'f'
-@end verbatim
+subplot 2 2 3 '':title 'Cone'
+cone -0.7 -0.3 0 -0.7 0.7 0.5 0.2 0.1 'b':text -0.7 -0.7 'no edges\n(default)'
+cone 0 -0.3 0 0 0.7 0.5 0.2 0.1 'g@':text 0 -0.7 'with edges\n('\@' style)'
+cone 0.7 -0.3 0 0.7 0.7 0.5 0.2 0.1 'ry':text 0.7 -0.7 '"arrow" with\n{}gradient'
 
-@pfig{barh, Example of Barh()}
+subplot 2 2 2 '':title 'Sphere and Drop'
+line -0.9 0 1 0.9 0 1
+text -0.9 -0.7 'sh=0':drop -0.9 0 0 1 0.5 'r' 0:ball -0.9 0 1 'k'
+text -0.3 -0.7 'sh=0.33':drop -0.3 0 0 1 0.5 'r' 0.33:ball -0.3 0 1 'k'
+text 0.3 -0.7 'sh=0.67':drop 0.3 0 0 1 0.5 'r' 0.67:ball 0.3 0 1 'k'
+text 0.9 -0.7 'sh=1':drop 0.9 0 0 1 0.5 'r' 1:ball 0.9 0 1 'k'
+@end verbatim
 
-@c ------------------------------------------------------------------
-@external{}
-@node Cones sample, Chart sample, Bars sample, 1D samples
-@subsection Cones sample
-@nav{}
+@pfig{primitives, Primitives in MathGL.}
 
-Command @ref{cones} is similar to @code{Bars} but draw cones. The sample code is:
+Generally, you can create arbitrary new kind of plot using primitives. For example, MathGL don't provide any special functions for drawing molecules. However, you can do it using only one type of primitives @ref{drop}. The sample code is:
 @verbatim
-new ys 10 3 '0.8*sin(pi*(x+y/4+1.25))+0.2*rnd'
-origin 0 0 0:light on
-subplot 3 2 0:title 'Cones plot':rotate 50 60:box
-cones ys
+alpha on:light on
+subplot 2 2 0 '':title 'Methane, CH_4':rotate 60 120
+sphere 0 0 0 0.25 'k':drop 0 0 0 0 0 1 0.35 'h' 1 2:sphere 0 0 0.7 0.25 'g'
+drop 0 0 0 -0.94 0 -0.33 0.35 'h' 1 2:sphere -0.66 0 -0.23 0.25 'g'
+drop 0 0 0 0.47 0.82 -0.33 0.35 'h' 1 2:sphere 0.33 0.57 -0.23 0.25 'g'
+drop 0 0 0 0.47 -0.82 -0.33 0.35 'h' 1 2:sphere 0.33 -0.57 -0.23 0.25 'g'
 
-subplot 3 2 1:title '2 colors':rotate 50 60:box
-cones ys 'cbgGyr'
+subplot 2 2 1 '':title 'Water, H{_2}O':rotate 60 100
+sphere 0 0 0 0.25 'r':drop 0 0 0 0.3 0.5 0 0.3 'm' 1 2:sphere 0.3 0.5 0 0.25 'g'
+drop 0 0 0 0.3 -0.5 0 0.3 'm' 1 2:sphere 0.3 -0.5 0 0.25 'g'
 
-subplot 3 2 2:title '"\#" style':rotate 50 60:box
-cones ys '#'
+subplot 2 2 2 '':title 'Oxygen, O_2':rotate 60 120
+drop 0 0.5 0 0 -0.3 0 0.3 'm' 1 2:sphere 0 0.5 0 0.25 'r'
+drop 0 -0.5 0 0 0.3 0 0.3 'm' 1 2:sphere 0 -0.5 0 0.25 'r'
 
-subplot 3 2 3:title '"a" style':rotate 50 60:zrange -2 2:box
-cones ys 'a'
+subplot 2 2 3 '':title 'Ammonia, NH_3':rotate 60 120
+sphere 0 0 0 0.25 'b':drop 0 0 0 0.33 0.57 0 0.32 'n' 1 2
+sphere 0.33 0.57 0 0.25 'g':drop 0 0 0 0.33 -0.57 0 0.32 'n' 1 2
+sphere 0.33 -0.57 0 0.25 'g':drop 0 0 0 -0.65 0 0 0.32 'n' 1 2
+sphere -0.65 0 0 0.25 'g'
+@end verbatim
 
-subplot 3 2 4:title '"t" style':rotate 50 60:box
-cones ys 't'
+@pfig{molecule, Example of molecules drawing.}
 
-subplot 3 2 5:title '"4" style':rotate 50 60:box
-cones ys '4'
+Moreover, some of special plots can be more easily produced by primitives rather than by specialized function. For example, Venn diagram can be produced by @code{Error} plot:
+@verbatim
+list x -0.3 0 0.3:list y 0.3 -0.3 0.3:list e 0.7 0.7 0.7
+title 'Venn-like diagram':alpha on
+error x y e e '!rgb@#o'
+@end verbatim
+You see that you have to specify and fill 3 data arrays. The same picture can be produced by just 3 calls of @ref{circle} function:
+@verbatim
+title 'Venn-like diagram':alpha on
+circle -0.3 0.3 0.7 'rr@'
+circle 0 -0.3 0.7 'gg@'
+circle 0.3 0.3 0.7 'bb@'
 @end verbatim
+Of course, the first variant is more suitable if you need to plot a lot of circles. But for few ones the usage of primitives looks easy.
 
-@pfig{cones, Example of Cones()}
+@pfig{venn, Example of Venn diagram.}
 
 @c ------------------------------------------------------------------
 @external{}
-@node Chart sample, BoxPlot sample, Cones sample, 1D samples
-@subsection Chart sample
+@node STFA sample, Mapping visualization, Using primitives, Hints
+@subsection STFA sample
 @nav{}
 
-Command @ref{chart} draw colored boxes with width proportional to data values. Use @samp{ } for empty box. Plot looks most attractive in polar coordinates -- well known pie chart. The sample code is:
-@verbatim
-new ch 7 2 'rnd+0.1':light on
-subplot 2 2 0:title 'Chart plot (default)':rotate 50 60:box
-chart ch
+Short-time Fourier Analysis (@ref{stfa}) is one of informative method for analyzing long rapidly oscillating 1D data arrays. It is used to determine the sinusoidal frequency and phase content of local sections of a signal as it changes over time.
 
-subplot 2 2 1:title '"\#" style':rotate 50 60:box
-chart ch '#'
+MathGL can find and draw STFA result. Just to show this feature I give following sample. Initial data arrays is 1D arrays with step-like frequency. Exactly this you can see at bottom on the STFA plot. The sample code is:
+@verbatim
+new a 2000:new b 2000
+fill a 'cos(50*pi*x)*(x<-.5)+cos(100*pi*x)*(x<0)*(x>-.5)+\
+cos(200*pi*x)*(x<.5)*(x>0)+cos(400*pi*x)*(x>.5)'
 
-subplot 2 2 2:title 'Pie chart; " " color':rotate 50 60:
-axis '(y+1)/2*cos(pi*x)' '(y+1)/2*sin(pi*x)' '':box
-chart ch 'bgr cmy#'
+subplot 1 2 0 '<_':title 'Initial signal'
+plot a:axis:xlabel '\i t'
 
-subplot 2 2 3:title 'Ring chart; " " color':rotate 50 60:
-axis '(y+2)/3*cos(pi*x)' '(y+2)/3*sin(pi*x)' '':box
-chart ch 'bgr cmy#'
+subplot 1 2 1 '<_':title 'STFA plot'
+stfa a b 64:axis:ylabel '\omega' 0:xlabel '\i t'
 @end verbatim
 
-@pfig{chart, Example of Chart()}
+@pfig{stfa, Example of STFA().}
 
 @c ------------------------------------------------------------------
 @external{}
-@node BoxPlot sample, Candle sample, Chart sample, 1D samples
-@subsection BoxPlot sample
-@nav{}
-
-Command @ref{boxplot} draw box-and-whisker diagram. The sample code is:
-@verbatim
-new a 10 7 '(2*rnd-1)^3/2'
-subplot 1 1 0 '':title 'Boxplot plot':box
-boxplot a
-@end verbatim
-
-@pfig{boxplot, Example of BoxPlot()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Candle sample, OHLC sample, BoxPlot sample, 1D samples
-@subsection Candle sample
-@nav{}
-
-Command @ref{candle} draw candlestick chart. This is a combination of a line-chart and a bar-chart, in that each bar represents the range of price movement over a given time interval. The sample code is:
-@verbatim
-new y 30 'sin(pi*x/2)^2':copy y1 y/2:copy y2 (y+1)/2
-subplot 1 1 0 '':title 'Candle plot (default)':yrange 0 1:box
-candle y y1 y2
-@end verbatim
-
-@pfig{candle, Example of Candle()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node OHLC sample, Error sample, Candle sample, 1D samples
-@subsection OHLC sample
-@nav{}
-
-Command @ref{ohlc} draw Open-High-Low-Close diagram. This diagram show vertical line for between maximal(high) and minimal(low) values, as well as horizontal lines before/after vertical line for initial(open)/final(close) values of some process. The sample code is:
-@verbatim
-new o 10 '0.5*sin(pi*x)'
-new c 10 '0.5*sin(pi*(x+2/9))'
-new l 10 '0.3*rnd-0.8'
-new h 10 '0.3*rnd+0.5'
-subplot 1 1 0 '':title 'OHLC plot':box
-ohlc o h l c
-@end verbatim
-
-@pfig{ohlc, Example of OHLC()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Error sample, Mark sample, OHLC sample, 1D samples
-@subsection Error sample
-@nav{}
-
-Command @ref{error} draw error boxes around the points. You can draw default boxes or semi-transparent symbol (like marker, see @ref{Line styles}). Also you can set individual color for each box. The sample code is:
-@verbatim
-call 'prepare1d'
-new y 50 '0.7*sin(pi*x-pi) + 0.5*cos(3*pi*(x+1)/2) + 0.2*sin(pi*(x+1)/2)'
-new x0 10 'x + 0.1*rnd-0.05':new ex 10 '0.1':new ey 10 '0.2'
-new y0 10 '0.7*sin(pi*x-pi) + 0.5*cos(3*pi*(x+1)/2) + 0.2*sin(pi*(x+1)/2) + 0.2*rnd-0.1'
-
-subplot 2 2 0 '':title 'Error plot (default)':box:plot y
-error x0 y0 ex ey 'k'
-
-subplot 2 2 1 '':title '"!" style; no e_x':box:plot y
-error x0 y0 ey 'o!rgb'
-
-subplot 2 2 2 '':title '"\@" style':box:plot y
-error x0 y0 ex ey '@'; alpha 0.5
-
-subplot 2 2 3:title '3d variant':rotate 50 60:axis
-for $1 0 9
-  errbox 2*rnd-1 2*rnd-1 2*rnd-1 0.2 0.2 0.2 'bo'
-next
-@end verbatim
-
-@pfig{error, Example of Error()}
-
-Additionally, you can use solid large "marks" instead of error boxes by selecting proper style.
-@verbatim
-new x0 10 'rnd':new ex 10 '0.1'
-new y0 10 'rnd':new ey 10 '0.1'
-ranges 0 1 0 1
-subplot 4 3 0 '':box:error x0 y0 ex ey '#+@'
-subplot 4 3 1 '':box:error x0 y0 ex ey '#x@'
-subplot 4 3 2 '':box:error x0 y0 ex ey '#s@'; alpha 0.5
-subplot 4 3 3 '':box:error x0 y0 ex ey 's@'
-subplot 4 3 4 '':box:error x0 y0 ex ey 'd@'
-subplot 4 3 5 '':box:error x0 y0 ex ey '#d@'; alpha 0.5
-subplot 4 3 6 '':box:error x0 y0 ex ey '+@'
-subplot 4 3 7 '':box:error x0 y0 ex ey 'x@'
-subplot 4 3 8 '':box:error x0 y0 ex ey 'o@'
-subplot 4 3 9 '':box:error x0 y0 ex ey '#o@'; alpha 0.5
-subplot 4 3 10 '':box:error x0 y0 ex ey '#.@'
-subplot 4 3 11 '':box:error x0 y0 ex ey; alpha 0.5
-@end verbatim
-
-@pfig{error2, Example of Error() with marks}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Mark sample, TextMark sample, Error sample, 1D samples
-@subsection Mark sample
-@nav{}
-
-Command @ref{mark} draw markers at points. It is mostly the same as @code{Plot} but marker size can be variable. The sample code is:
-@verbatim
-call 'prepare1d'
-subplot 1 1 0 '':title 'Mark plot (default)':box
-mark y y1 's'
-@end verbatim
-
-@pfig{mark, Example of Mark()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node TextMark sample, Label sample, Mark sample, 1D samples
-@subsection TextMark sample
-@nav{}
-
-Command @ref{textmark} like @code{Mark} but draw text instead of markers. The sample code is:
-@verbatim
-call 'prepare1d'
-subplot 1 1 0 '':title 'TextMark plot (default)':box
-textmark y y1 '\gamma' 'r'
-@end verbatim
-
-@pfig{textmark, Example of TextMark()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Label sample, Table sample, TextMark sample, 1D samples
-@subsection Label sample
-@nav{}
-
-Command @ref{label} print text at data points. The string may contain @samp{%x}, @samp{%y}, @samp{%z} for x-, y-, z-coordinates of points, @samp{%n} for point index. The sample code is:
-@verbatim
-new ys 10 '0.2*rnd-0.8*sin(pi*x)'
-subplot 1 1 0 '':title 'Label plot':box
-plot ys ' *':label ys 'y=%y'
-@end verbatim
-
-@pfig{label, Example of Label()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Table sample, Tube sample, Label sample, 1D samples
-@subsection Table sample
-@nav{}
-
-Command @ref{table} draw table with data values. The sample code is:
-@verbatim
-new ys 10 3 '0.8*sin(pi*(x+y/4+1.25))+0.2*rnd'
-subplot 2 2 0:title 'Table sample':box
-table ys 'y_1\n{}y_2\n{}y_3'
-
-subplot 2 2 1:title 'no borders, colored'
-table ys 'y_1\n{}y_2\n{}y_3' 'r|'
-
-subplot 2 2 2:title 'no font decrease'
-table ys 'y_1\n{}y_2\n{}y_3' '#'
-
-subplot 2 2 3:title 'manual width and position':box
-table 0.5 0.95 ys 'y_1\n{}y_2\n{}y_3' '#';value 0.7
-@end verbatim
-
-@pfig{table, Example of Table()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Tube sample, Tape sample, Table sample, 1D samples
-@subsection Tube sample
-@nav{}
-
-Command @ref{tube} draw tube with variable radius. The sample code is:
-@verbatim
-light on:call 'prepare1d'
-new yc 50 'sin(pi*x)':new xc 50 'cos(pi*x)':new z 50 'x':divto y1 20
-
-subplot 2 2 0 '':title 'Tube plot (default)':box
-tube y 0.05
-
-subplot 2 2 1 '':title 'variable radius':box
-tube y y1
-
-subplot 2 2 2 '':title '"\#" style':box
-tube y 0.05 '#'
-
-subplot 2 2 3:title '3d variant':rotate 50 60:box
-tube xc yc z y2 'r'
-@end verbatim
-
-@pfig{tube, Example of Tube()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Tape sample, Torus sample, Tube sample, 1D samples
-@subsection Tape sample
-@nav{}
-
-Command @ref{tape} draw tapes which rotate around the curve as normal and binormal. The sample code is:
-@verbatim
-call 'prepare1d'
-new yc 50 'sin(pi*x)':new xc 50 'cos(pi*x)':new z 50 'x'
-
-subplot 2 2 0 '':title 'Tape plot (default)':box
-tape y:plot y 'k'
-
-subplot 2 2 1:title '3d variant, 2 colors':rotate 50 60:light on:box
-plot xc yc z 'k':tape xc yc z 'rg'
-
-subplot 2 2 2:title '3d variant, x only':rotate 50 60:box
-plot xc yc z 'k':tape xc yc z 'xr':tape xc yc z 'xr#'
-
-subplot 2 2 3:title '3d variant, z only':rotate 50 60:box
-plot xc yc z 'k':tape xc yc z 'zg':tape xc yc z 'zg#'
-@end verbatim
-
-@pfig{tape, Example of Tape()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Torus sample, Lamerey sample, Tape sample, 1D samples
-@subsection Torus sample
-@nav{}
-
-Command @ref{torus} draw surface of the curve rotation. The sample code is:
-@verbatim
-call 'prepare1d'
-subplot 2 2 0:title 'Torus plot (default)':light on:rotate 50 60:box
-torus y1 y2
-
-subplot 2 2 1:title '"x" style':light on:rotate 50 60:box
-torus y1 y2 'x'
-
-subplot 2 2 2:title '"z" style':light on:rotate 50 60:box
-torus y1 y2 'z'
-
-subplot 2 2 3:title '"\#" style':light on:rotate 50 60:box
-torus y1 y2 '#'
-@end verbatim
-
-@pfig{torus, Example of Torus()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Lamerey sample, Bifurcation sample, Torus sample, 1D samples
-@subsection Lamerey sample
-@nav{}
-
-Function @ref{lamerey} draw Lamerey diagram. The sample code is:
-@verbatim
-subplot 1 1 0 '<_':title 'Lamerey sample'
-axis:xlabel '\i x':ylabel '\bar{\i x} = 2 \i{x}'
-fplot 'x' 'k='
-fplot '2*x' 'b'
-
-lamerey 0.00097 '2*x' 'rv~';size 2
-lamerey -0.00097 '2*x' 'rv~';size 2
-@end verbatim
-
-@pfig{lamerey, Example of Lamerey()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Bifurcation sample, Pmap sample, Lamerey sample, 1D samples
-@subsection Bifurcation sample
-@nav{}
-
-Function @ref{bifurcation} draw Bifurcation diagram for logistic map. The sample code is:
-@verbatim
-subplot 1 1 0 '<_':title 'Bifurcation sample'
-ranges 0 4 0 1:axis
-bifurcation 0.005 'x*y*(1-y)' 'r'
-@end verbatim
-
-@pfig{bifurcation, Example of Bifurcation()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Pmap sample, , Bifurcation sample, 1D samples
-@subsection Pmap sample
-@nav{}
-
-Function @ref{pmap} draw Poincare map -- show intersections of the curve and the surface. The sample code is:
-@verbatim
-subplot 1 1 0 '<_^':title 'Poincare map sample'
-ode r 'cos(y)+sin(z);cos(z)+sin(x);cos(x)+sin(y)' 'xyz' [0.1,0,0] 0.1 100
-rotate 40 60:copy x r(0):copy y r(1):copy z r(2)
-ranges x y z
-axis:plot x y z 'b':fsurf '0'
-xlabel '\i x' 0:ylabel '\i y' 0:zlabel '\i z'
-
-pmap x y z z 'b#o'
-@end verbatim
-
-@pfig{pmap, Example of Pmap()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node 2D samples, 3D samples, 1D samples, Examples
-@section 2D samples
-@nav{}
-
-This section is devoted to visualization of 2D data arrays. 2D means the data which depend on 2 indexes (parameters) like matrix z(i,j)=z(x(i),y(j)), i=1...n, j=1...m or in parametric form @{x(i,j),y(i,j),z(i,j)@}. Most of samples will use the same data for plotting. So, I put its initialization in separate function
-@verbatim
-func '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))'
-return
-@end verbatim
-Basically, you can put this text after the script. Note, that you need to terminate main script by @ref{stop} command before defining a function.
-
-@menu
-* Surf sample::
-* SurfC sample::
-* SurfA sample::
-* SurfCA sample::
-* Mesh sample::
-* Fall sample::
-* Belt sample::
-* Boxs sample::
-* Tile sample::
-* TileS sample::
-* Dens sample::
-* Cont sample::
-* ContF sample::
-* ContD sample::
-* ContV sample::
-* Axial sample::
-* Grad sample::
-@end menu
-
-@c ------------------------------------------------------------------
-@external{}
-@node Surf sample, SurfC sample, , 2D samples
-@subsection Surf sample
-@nav{}
-
-Command @ref{surf} is most standard way to visualize 2D data array. @code{Surf} use color scheme for coloring (see @ref{Color scheme}). You can use @samp{#} style for drawing black meshes on the surface. The sample code is:
-@verbatim
-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 '"." style':rotate 50 60:box
-surf 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 verbatim
-
-@pfig{surf, Example of Surf()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node SurfC sample, SurfA sample, Surf sample, 2D samples
-@subsection SurfC sample
-@nav{}
-
-Command @ref{surfc} is similar to @ref{surf} but its coloring is determined by another data. The sample code is:
-@verbatim
-call 'prepare2d'
-title 'SurfC plot':rotate 50 60:light on:box
-surfc a b
-@end verbatim
-
-@pfig{surfc, Example of SurfC()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node SurfA sample, SurfCA sample, SurfC sample, 2D samples
-@subsection SurfA sample
-@nav{}
-
-Command @ref{surfa} is similar to @ref{surf} but its transparency is determined by another data. The sample code is:
-@verbatim
-call 'prepare2d'
-title 'SurfA plot':rotate 50 60:light on:alpha on:box
-surfa a b
-@end verbatim
-
-@pfig{surfa, Example of SurfA()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node SurfCA sample, Mesh sample, SurfA sample, 2D samples
-@subsection SurfCA sample
-@nav{}
-
-Command @ref{surfca} is similar to @ref{surf} but its color and transparency is determined by another data. The sample code is:
-@verbatim
-call 'prepare2d'
-title 'SurfCA plot':rotate 50 60:light on:alpha on:box
-surfa a b a
-@end verbatim
-
-@pfig{surfca, Example of SurfCA()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Mesh sample, Fall sample, SurfCA sample, 2D samples
-@subsection Mesh sample
-@nav{}
-
-Command @ref{mesh} draw wired surface. You can use @ref{meshnum} for changing number of lines to be drawn. The sample code is:
-@verbatim
-call 'prepare2d'
-title 'Mesh plot':rotate 50 60:box
-mesh a
-@end verbatim
-
-@pfig{mesh, Example of Mesh()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Fall sample, Belt sample, Mesh sample, 2D samples
-@subsection Fall sample
-@nav{}
-
-Command @ref{fall} draw waterfall surface. You can use @ref{meshnum} for changing number of lines to be drawn. Also you can use @samp{x} style for drawing lines in other direction. The sample code is:
-@verbatim
-call 'prepare2d'
-title 'Fall plot':rotate 50 60:box
-fall a
-@end verbatim
-
-@pfig{fall, Example of Fall()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Belt sample, Boxs sample, Fall sample, 2D samples
-@subsection Belt sample
-@nav{}
-
-Command @ref{belt} draw surface by belts. You can use @samp{x} style for drawing lines in other direction. The sample code is:
-@verbatim
-call 'prepare2d'
-title 'Belt plot':rotate 50 60:box
-belt a
-@end verbatim
-
-@pfig{belt, Example of Belt()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Boxs sample, Tile sample, Fall sample, 2D samples
-@subsection Boxs sample
-@nav{}
-
-Command @ref{boxs} draw surface by boxes. You can use @samp{#} for drawing wire plot. The sample code is:
-@verbatim
-call 'prepare2d'
-origin 0 0 0
-subplot 2 2 0:title 'Boxs plot (default)':rotate 40 60:light on:box
-boxs a
-
-subplot 2 2 1:title '"\@" style':rotate 50 60:box
-boxs a '@'
-
-subplot 2 2 2:title '"\#" style':rotate 50 60:box
-boxs a '#'
-
-subplot 2 2 3:title 'compare with Tile':rotate 50 60:box
-tile a
-@end verbatim
-
-@pfig{boxs, Example of Boxs()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Tile sample, TileS sample, Boxs sample, 2D samples
-@subsection Tile sample
-@nav{}
-
-Command @ref{tile} draw surface by tiles. The sample code is:
-@verbatim
-call 'prepare2d'
-subplot 1 1 0 '':title 'Tiles plot':box
-tile a
-@end verbatim
-
-@pfig{tile, Example of Tile()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node TileS sample, Dens sample, Tile sample, 2D samples
-@subsection TileS sample
-@nav{}
-
-Command @ref{tiles} is similar to @ref{tile} but tile sizes is determined by another data. This allows one to simulate transparency of the plot. The sample code is:
-@verbatim
-call 'prepare2d'
-subplot 1 1 0 '':title 'Tiles plot':box
-tiles a b
-@end verbatim
-
-@pfig{tiles, Example of TileS()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Dens sample, Cont sample, TileS sample, 2D samples
-@subsection Dens sample
-@nav{}
-
-Command @ref{dens} draw density plot for surface. The sample code is:
-@verbatim
-call 'prepare2d'
-subplot 2 2 0 '':title 'Dens plot (default)':box
-dens a
-
-subplot 2 2 1:title '3d variant':rotate 50 60:box
-dens a
-
-subplot 2 2 2 '':title '"\#" style; meshnum 10':box
-dens a '#'; meshnum 10
-
-new a1 30 40 3 '0.6*sin(2*pi*x+pi*(z+1)/2)*sin(3*pi*y+pi*z) +\
- 0.4*cos(3*pi*(x*y)+pi*(z+1)^2/2)'
-subplot 2 2 3:title 'several slices':rotate 50 60:box
-dens a1
-@end verbatim
-
-@pfig{dens, Example of Dens()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Cont sample, ContF sample, Dens sample, 2D samples
-@subsection Cont sample
-@nav{}
-
-Command @ref{cont} draw contour lines for surface. You can select automatic (default) or manual levels for contours, print contour labels, draw it on the surface (default) or at plane (as @code{Dens}). The sample code is:
-@verbatim
-call 'prepare2d'
-list v -0.5 -0.15 0 0.15 0.5
-subplot 2 2 0:title 'Cont plot (default)':rotate 50 60:box
-cont a
-
-subplot 2 2 1:title 'manual levels':rotate 50 60:box
-cont v a
-
-subplot 2 2 2:title '"\_" style':rotate 50 60:box
-cont a '_'
-
-subplot 2 2 3 '':title '"t" style':box
-cont a 't'
-@end verbatim
-
-@pfig{cont, Example of Cont()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node ContF sample, ContD sample, Cont sample, 2D samples
-@subsection ContF sample
-@nav{}
-
-Command @ref{contf} draw filled contours.  You can select automatic (default) or manual levels for contours. The sample code is:
-@verbatim
-call 'prepare2d'
-list v -0.5 -0.15 0 0.15 0.5
-subplot 2 2 0:title 'ContF plot (default)':rotate 50 60:box
-contf a
-
-subplot 2 2 1:title 'manual levels':rotate 50 60:box
-contf v a
-
-subplot 2 2 2:title '"\_" style':rotate 50 60:box
-contf a '_'
-
-new a1 30 40 3 '0.6*sin(2*pi*x+pi*(z+1)/2)*sin(3*pi*y+pi*z) +\
- 0.4*cos(3*pi*(x*y)+pi*(z+1)^2/2)'
-subplot 2 2 3:title 'several slices':rotate 50 60:box
-contf a1
-@end verbatim
-
-@pfig{contf, Example of ContF()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node ContD sample, ContV sample, ContF sample, 2D samples
-@subsection ContD sample
-@nav{}
-
-Command @ref{contd} is similar to @code{ContF} but with manual contour colors. The sample code is:
-@verbatim
-call 'prepare2d'
-list v -0.5 -0.15 0 0.15 0.5
-subplot 2 2 0:title 'ContD plot (default)':rotate 50 60:box
-contd a
-
-subplot 2 2 1:title 'manual levels':rotate 50 60:box
-contd v a
-
-subplot 2 2 2:title '"\_" style':rotate 50 60:box
-contd a '_'
-
-new a1 30 40 3 '0.6*sin(2*pi*x+pi*(z+1)/2)*sin(3*pi*y+pi*z) +\
- 0.4*cos(3*pi*(x*y)+pi*(z+1)^2/2)'
-subplot 2 2 3:title 'several slices':rotate 50 60:box
-contd a1
-@end verbatim
-
-@pfig{contd, Example of ContD()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node ContV sample, Axial sample, ContD sample, 2D samples
-@subsection ContV sample
-@nav{}
-
-Command @ref{contv} draw vertical cylinders (belts) at contour lines. The sample code is:
-@verbatim
-call 'prepare2d'
-list v -0.5 -0.15 0 0.15 0.5
-subplot 2 2 0:title 'ContV plot (default)':rotate 50 60:box
-contv a
-
-subplot 2 2 1:title 'manual levels':rotate 50 60:box
-contv v a
-
-subplot 2 2 2:title '"\_" style':rotate 50 60:box
-contv a '_'
-
-subplot 2 2 3:title 'ContV and ContF':rotate 50 60:light on:box
-contv a:contf a:cont a 'k'
-@end verbatim
-
-@pfig{contv, Example of ContV()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Axial sample, Grad sample, ContV sample, 2D samples
-@subsection Axial sample
-@nav{}
-
-Command @ref{axial} draw surfaces of rotation for contour lines. You can draw wire surfaces (@samp{#} style) or ones rotated in other directions (@samp{x}, @samp{z} styles). The sample code is:
-@verbatim
-light on:alpha on:call 'prepare2d'
-subplot 2 2 0:title 'Axial plot (default)':rotate 50 60:box
-axial a
-
-subplot 2 2 1:title '"x" style;\".\" style':light on:rotate 50 60:box
-axial a 'x.'
-
-subplot 2 2 2:title '"z" style':light on:rotate 50 60:box
-axial a 'z'
-
-subplot 2 2 3:title '"\#" style':light on:rotate 50 60:box
-axial a '#'
-@end verbatim
-
-@pfig{axial, Example of Axial()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Grad sample, , Axial sample, 2D samples
-@subsection Grad sample
-@nav{}
-
-Command @ref{grad} draw gradient lines for matrix. The sample code is:
-@verbatim
-call 'prepare2d'
-subplot 1 1 0 '':title 'Grad plot':box
-grad a:dens a '{u8}w{q8}'
-@end verbatim
-
-@pfig{grad, Example of Grad()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node 3D samples, Vector field samples, 2D samples, Examples
-@section 3D samples
-@nav{}
-
-This section is devoted to visualization of 3D data arrays. 3D means the data which depend on 3 indexes (parameters) like tensor a(i,j,k)=a(x(i),y(j),x(k)), i=1...n, j=1...m, k=1...l or in parametric form @{x(i,j,k),y(i,j,k),z(i,j,k),a(i,j,k)@}. Most of samples will use the same data for plotting. So, I put its initialization in separate function
-@verbatim
-func 'prepare3d'
-new c 61 50 40 '-2*(x^2+y^2+z^4-z^2)+0.2'
-new d 61 50 40 '1-2*tanh((x+y)*(x+y))'
-return
-@end verbatim
-Basically, you can put this text after the script. Note, that you need to terminate main script by @ref{stop} command before defining a function.
-
-@menu
-* Surf3 sample::
-* Surf3C sample::
-* Surf3A sample::
-* Surf3CA sample::
-* Cloud sample::
-* Dens3 sample::
-* Cont3 sample::
-* ContF3 sample::
-* Dens projection sample::
-* Cont projection sample::
-* ContF projection sample::
-* TriPlot and QuadPlot::
-* Dots sample::
-* IFS sample::
-@end menu
-
-@c ------------------------------------------------------------------
-@external{}
-@node Surf3 sample, Surf3C sample, , 3D samples
-@subsection Surf3 sample
-@nav{}
-
-Command @ref{surf3} is one of most suitable (for my opinion) functions to visualize 3D data. It draw the isosurface(s) -- surface(s) of constant amplitude (3D analogue of contour lines). You can draw wired isosurfaces if specify @samp{#} style. The sample code is:
-@verbatim
-call 'prepare3d'
-light on:alpha on
-subplot 2 2 0:title 'Surf3 plot':rotate 50 60:box
-surf3 c
-
-subplot 2 2 1:title '"\#" style':rotate 50 60:box
-surf3 c '#'
-
-subplot 2 2 2:title '"." style':rotate 50 60:box
-surf3 c '.'
-@end verbatim
-
-@pfig{surf3, Example of Surf3()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Surf3C sample, Surf3A sample, Surf3 sample, 3D samples
-@subsection Surf3C sample
-@nav{}
-
-Command @ref{surf3c} is similar to @ref{surf3} but its coloring is determined by another data. The sample code is:
-@verbatim
-call 'prepare3d'
-title 'Surf3C plot':rotate 50 60:light on:alpha on:box
-surf3c c d
-@end verbatim
-
-@pfig{surf3c, Example of Surf3C()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Surf3A sample, Surf3CA sample, Surf3C sample, 3D samples
-@subsection Surf3A sample
-@nav{}
-
-Command @ref{surf3a} is similar to @ref{surf3} but its transparency is determined by another data. The sample code is:
-@verbatim
-call 'prepare3d'
-title 'Surf3A plot':rotate 50 60:light on:alpha on:box
-surf3a c d
-@end verbatim
-
-@pfig{surf3a, Example of Surf3A()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Surf3CA sample, Cloud sample, Surf3A sample, 3D samples
-@subsection Surf3CA sample
-@nav{}
-
-Command @ref{surf3ca} is similar to @ref{surf3} but its color and transparency is determined by another data. The sample code is:
-@verbatim
-call 'prepare3d'
-title 'Surf3CA plot':rotate 50 60:light on:alpha on:box
-surf3a c d c
-@end verbatim
-
-@pfig{surf3ca, Example of Surf3CA()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Cloud sample, Dens3 sample, Surf3CA sample, 3D samples
-@subsection Cloud sample
-@nav{}
-
-Command @ref{cloud} draw cloud-like object which is less transparent for higher data values. Similar plot can be created using many (about 10-20) @code{Surf3A(a,a)} isosurfaces. The sample code is:
-@verbatim
-call 'prepare3d'
-subplot 2 2 0:title 'Cloud plot':rotate 50 60:alpha on:box
-cloud c 'wyrRk'
-
-subplot 2 2 1:title '"i" style':rotate 50 60:box
-cloud c 'iwyrRk'
-
-subplot 2 2 2:title '"." style':rotate 50 60:box
-cloud c '.wyrRk'
-
-subplot 2 2 3:title 'meshnum 10':rotate 50 60:box
-cloud c 'wyrRk'; meshnum 10
-@end verbatim
-
-@pfig{cloud, Example of Cloud()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Dens3 sample, Cont3 sample, Cloud sample, 3D samples
-@subsection Dens3 sample
-@nav{}
-
-Command @ref{dens3} draw just usual density plot but at slices of 3D data. The sample code is:
-@verbatim
-call 'prepare3d'
-title 'Dens3 sample':rotate 50 60:alpha on:alphadef 0.7
-origin 0 0 0:box:axis '_xyz'
-dens3 c 'x':dens3 c ':y':dens3 c 'z'
-@end verbatim
-
-@pfig{densa, Example of Dens3()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Cont3 sample, ContF3 sample, Dens3 sample, 3D samples
-@subsection Cont3 sample
-@nav{}
-
-Command @ref{cont3} draw just usual contour lines but at slices of 3D data. The sample code is:
-@verbatim
-call 'prepare3d'
-title 'Cont3 sample':rotate 50 60:box
-cont3 c 'x':cont3 c:cont3 c 'z'
-@end verbatim
-
-@pfig{conta, Example of Cont3()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node ContF3 sample, Dens projection sample, Cont3 sample, 3D samples
-@subsection ContF3 sample
-@nav{}
-
-Command @ref{contf3} draw just usual filled contours but at slices of 3D data. The sample code is:
-@verbatim
-call 'prepare3d'
-title 'Cont3 sample':rotate 50 60:box:light on
-contf3 c 'x':contf3 c:contf3 c 'z'
-cont3 c 'xk':cont3 c 'k':cont3 c 'zk'
-@end verbatim
-
-@pfig{contfa, Example of ContF3()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Dens projection sample, Cont projection sample, ContF3 sample, 3D samples
-@subsection Dens projection sample
-@nav{}
-
-Functions @ref{densz}, @ref{densy}, @ref{densx} draw density plot on plane perpendicular to corresponding axis. One of possible application is drawing projections of 3D field. The sample code is:
-@verbatim
-call 'prepare3d'
-title 'Dens[XYZ] sample':rotate 50 60:box
-densx {sum c 'x'} '' -1
-densy {sum c 'y'} '' 1
-densz {sum c 'z'} '' -1
-@end verbatim
-
-@pfig{dens_xyz, Example of DensX() DensY() DensZ()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Cont projection sample, ContF projection sample, Dens projection sample, 3D samples
-@subsection Cont projection sample
-@nav{}
-
-Functions @ref{contz}, @ref{conty}, @ref{contx} draw contour lines on plane perpendicular to corresponding axis. One of possible application is drawing projections of 3D field. The sample code is:
-@verbatim
-call 'prepare3d'
-title 'Cont[XYZ] sample':rotate 50 60:box
-contx {sum c 'x'} '' -1
-conty {sum c 'y'} '' 1
-contz {sum c 'z'} '' -1
-@end verbatim
-
-@pfig{cont_xyz, Example of ContX() ContY() ContZ()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node ContF projection sample, TriPlot and QuadPlot, Cont projection sample, 3D samples
-@subsection ContF projection sample
-@nav{}
-
-Functions @ref{contfz}, @ref{contfy}, @ref{contfx} draw filled contours on plane perpendicular to corresponding axis. One of possible application is drawing projections of 3D field. The sample code is:
-@verbatim
-call 'prepare3d'
-title 'ContF[XYZ] sample':rotate 50 60:box
-contfx {sum c 'x'} '' -1
-contfy {sum c 'y'} '' 1
-contfz {sum c 'z'} '' -1
-@end verbatim
-
-@pfig{contf_xyz, Example of ContFX() ContFY() ContFZ()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node TriPlot and QuadPlot, Dots sample, ContF projection sample, 3D samples
-@subsection TriPlot and QuadPlot
-@nav{}
-
-Command @ref{triplot} and @ref{quadplot} draw set of triangles (or quadrangles for @code{QuadPlot}) for irregular data arrays. Note, that you have to provide not only vertexes, but also the indexes of triangles or quadrangles. I.e. perform triangulation by some other library. The sample code is:
-@verbatim
-list q 0 1 2 3 | 4 5 6 7 | 0 2 4 6 | 1 3 5 7 | 0 4 1 5 | 2 6 3 7
-list xq -1 1 -1 1 -1 1 -1 1
-list yq -1 -1 1 1 -1 -1 1 1
-list zq -1 -1 -1 -1 1 1 1 1
-light on
-subplot 2 2 0:title 'QuadPlot sample':rotate 50 60
-quadplot q xq yq zq 'yr'
-quadplot q xq yq zq '#k'
-
-subplot 2 2 2:title 'QuadPlot coloring':rotate 50 60
-quadplot q xq yq zq yq 'yr'
-quadplot q xq yq zq '#k'
-
-list t 0 1 2 | 0 1 3 | 0 2 3 | 1 2 3
-list xt -1 1 0 0
-list yt -1 -1 1 0
-list zt -1 -1 -1 1
-subplot 2 2 1:title 'TriPlot sample':rotate 50 60
-triplot t xt yt zt 'b'
-triplot t xt yt zt '#k'
-
-subplot 2 2 3:title 'TriPlot coloring':rotate 50 60
-triplot t xt yt zt yt 'cb'
-triplot t xt yt zt '#k'
-tricont t xt yt zt 'B'
-@end verbatim
-
-@pfig{triplot, Example of TriPlot() and QuadPlot()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Dots sample, IFS sample, TriPlot and QuadPlot, 3D samples
-@subsection Dots sample
-@nav{}
-
-Command @ref{dots} is another way to draw irregular points. @code{Dots} use color scheme for coloring (see @ref{Color scheme}). The sample code is:
-@verbatim
-new t 2000 'pi*(rnd-0.5)':new f 2000 '2*pi*rnd'
-copy x 0.9*cos(t)*cos(f):copy y 0.9*cos(t)*sin(f):copy z 0.6*sin(t):copy c cos(2*t)
-subplot 2 2 0:title 'Dots sample':rotate 50 60
-box:dots x y z
-alpha on
-subplot 2 2 1:title 'add transparency':rotate 50 60
-box:dots x y z c
-subplot 2 2 2:title 'add colorings':rotate 50 60
-box:dots x y z x c
-subplot 2 2 3:title 'Only coloring':rotate 50 60
-box:tens x y z x ' .'
-@end verbatim
-
-@pfig{dots, Example of Dots()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node IFS sample, , Dots sample, 3D samples
-@subsection IFS 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:
-@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]
-ifs2d fx fy A 100000
-subplot 1 1 0 '<_':title 'IFS 2d sample'
-ranges fx fy:axis
-plot fx fy 'r#o ';size 0.05
-@end verbatim
-
-@pfig{ifs2d, Example of IFS fractal (2d case).}
-
-@verbatim
-list A [0,0,0,0,.18,0,0,0,0,0,0,0,.01] [.85,0,0,0,.85,.1,0,-0.1,0.85,0,1.6,0,.85]\
-        [.2,-.2,0,.2,.2,0,0,0,0.3,0,0.8,0,.07] [-.2,.2,0,.2,.2,0,0,0,0.3,0,0.8,0,.07]
-ifs3d f A 100000
-title 'IFS 3d sample':rotate 50 60
-ranges f(0) f(1) f(2):axis:box
-dots f(0) f(1) f(2) 'G#o';size 0.05
-@end verbatim
-
-@pfig{ifs3d, Example of IFS fractal (3d case).}
-
-
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Vector field samples, Hints, 3D samples, Examples
-@section Vector field samples
-@nav{}
-
-Vector field visualization (especially in 3d case) is more or less complex task. MathGL provides 3 general types of plots: vector field itself (@code{Vect}), flow threads (@code{Flow}), and flow pipes with radius proportional to field amplitude (@code{Pipe}).
-
-However, the plot may look tangly -- there are too many overlapping lines. I may suggest 2 ways to solve this problem. The first one is to change @code{SetMeshNum} for decreasing the number of hachures. The second way is to use the flow thread chart @code{Flow}, or possible many flow thread from manual position (@code{FlowP}). Unfortunately, I don't know any other methods to visualize 3d vector field. If you know any, e-mail me and I shall add it to MathGL.
-
-Most of samples will use the same data for plotting. So, I put its initialization in separate function
-@verbatim
-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 verbatim
-Basically, you can put this text after the script. Note, that you need to terminate main script by @ref{stop} command before defining a function.
-
-@menu
-* Vect sample::
-* Vect3 sample::
-* Traj sample::
-* Flow sample::
-* Pipe sample::
-* Dew sample::
-@end menu
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Vect sample, Vect3 sample, , Vector field samples
-@subsection Vect sample
-@nav{}
-
-Command @ref{vect} is most standard way to visualize vector fields -- it draw a lot of arrows or hachures for each data cell. It have a lot of options which can be seen on the figure (and in the sample code). @code{Vect} use color scheme for coloring (see @ref{Color scheme}). The sample code is:
-@verbatim
-call 'prepare2v'
-subplot 3 2 0 '':title 'Vect plot (default)':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
-@end verbatim
-
-@pfig{vect, Example of Vect()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Vect3 sample, Traj sample, Vect sample, Vector field samples
-@subsection Vect3 sample
-@nav{}
-
-Command @ref{vect3} draw just usual vector field plot but at slices of 3D data. The sample code is:
-@verbatim
-origin 0 0 0:call 'prepare3v'
-subplot 2 1 0:title 'Vect3 sample':rotate 50 60
-box:axis '_xyz'
-vect3 ex ey ez 'x':vect3 ex ey ez:vect3 ex ey ez 'z'
-
-subplot 2 1 1:title '"f" style':rotate 50 60
-box:axis '_xyz'
-vect3 ex ey ez 'fx':vect3 ex ey ez 'f':vect3 ex ey ez 'fz'
-grid3 ex 'Wx':grid3 ex 'W':grid3 ex 'Wz'
-@end verbatim
-
-@pfig{vecta, Example of Vect3()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Traj sample, Flow sample, Vect3 sample, Vector field samples
-@subsection Traj sample
-@nav{}
-
-Command @ref{traj} is 1D analogue of @code{Vect}. It draw vectors from specified points. The sample code is:
-@verbatim
-call 'prepare1d'
-subplot 1 1 0 '':title 'Traj plot':box
-plot x1 y:traj x1 y y1 y2
-@end verbatim
-
-@pfig{traj, Example of Traj()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Flow sample, Pipe sample, Traj sample, Vector field samples
-@subsection Flow sample
-@nav{}
-
-Command @ref{flow} is another standard way to visualize vector fields -- it draw lines (threads) which is tangent to local vector field direction. MathGL draw threads from edges of bounding box and from central slices. Sometimes it is not most appropriate variant -- you may want to use @code{FlowP} to specify manual position of threads. @code{Flow} use color scheme for coloring (see @ref{Color scheme}). At this warm color corresponds to normal flow (like attractor), cold one corresponds to inverse flow (like source). The sample code is:
-@verbatim
-call 'prepare2v'
-subplot 2 2 0 '':title 'Flow plot (default)':box
-flow a b
-
-subplot 2 2 1 '':title '"v" style':box
-flow a b 'v'
-
-subplot 2 2 2 '':title 'from edges only':box
-flow a b '#'
-
-call 'prepare3v'
-subplot 2 2 3:title '3d variant':rotate 50 60:box
-flow ex ey ez
-@end verbatim
-
-@pfig{flow, Example of Flow()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Pipe sample, Dew sample, Flow sample, Vector field samples
-@subsection Pipe sample
-@nav{}
-
-Command @ref{pipe} is similar to @ref{flow} but draw pipes (tubes) which radius is proportional to the amplitude of vector field. @code{Pipe} use color scheme for coloring (see @ref{Color scheme}). At this warm color corresponds to normal flow (like attractor), cold one corresponds to inverse flow (like source). The sample code is:
-@verbatim
-call 'prepare2v'
-subplot 2 2 0 '':title 'Pipe plot (default)':light on:box
-pipe a b
-
-subplot 2 2 1 '':title '"i" style':box
-pipe a b 'i'
-
-subplot 2 2 2 '':title 'from edges only':box
-pipe a b '#'
-
-call 'prepare3v'
-subplot 2 2 3:title '3d variant':rotate 50 60:box
-pipe ex ey ez '' 0.1
-@end verbatim
-
-@pfig{pipe, Example of Pipe()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Dew sample, , Pipe sample, Vector field samples
-@subsection Dew sample
-@nav{}
-
-Command @ref{dew} is similar to @code{Vect} but use drops instead of arrows. The sample code is:
-@verbatim
-call 'prepare2v'
-subplot 1 1 0 '':title 'Dew plot':light on:box
-dew a b
-@end verbatim
-
-@pfig{dew, Example of Dew()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Hints, FAQ, Vector field samples, Examples
-@section Hints
-@nav{}
-
-In this section I've included some small hints and advices for the improving of the quality of plots and for the demonstration of some non-trivial features of MathGL library. In contrast to previous examples I showed mostly the idea but not the whole drawing function.
-
-@menu
-* ``Compound'' graphics::
-* Transparency and lighting::
-* Types of transparency::
-* Axis projection::
-* Adding fog::
-* Lighting sample::
-* Using primitives::
-* STFA sample::
-* Mapping visualization::
-* Data interpolation::
-* Making regular data::
-* Making histogram::
-* Nonlinear fitting hints::
-* PDE solving hints::
-* Drawing phase plain::
-* Pulse properties::
-* Using MGL parser::
-* Using options::
-* ``Templates''::
-* Stereo image::
-* Reduce memory usage::
-* Saving and scanning file::
-@end menu
-
-@c ------------------------------------------------------------------
-@external{}
-@node ``Compound'' graphics, Transparency and lighting, , Hints
-@subsection ``Compound'' graphics
-@nav{}
-
-As I noted above, MathGL functions (except the special one, like Clf()) do  not erase the previous plotting but just add the new one. It allows one to draw ``compound'' plots easily. For example, popular Matlab command @code{surfc} can be emulated in MathGL by 2 calls:
-@verbatim
-  Surf(a);
-  Cont(a, "_");     // draw contours at bottom
-@end verbatim
-Here @var{a} is 2-dimensional data for the plotting, @code{-1} is the value of z-coordinate at which the contour should be plotted (at the bottom in this example). Analogously, one can draw density plot instead of contour lines and so on.
-
-Another nice plot is contour lines plotted directly on the surface:
-@verbatim
-  Light(true);       // switch on light for the surface
-  Surf(a, "BbcyrR"); // select 'jet' colormap for the surface
-  Cont(a, "y");      // and yellow color for contours
-@end verbatim
-The possible difficulties arise in black&white case, when the color of the surface can be close to the color of a contour line. In that case I may suggest the following code:
-@verbatim
-  Light(true);   // switch on light for the surface
-  Surf(a, "kw"); // select 'gray' colormap for the surface
-  CAxis(-1,0);   // first draw for darker surface colors
-  Cont(a, "w");  // white contours
-  CAxis(0,1);    // now draw for brighter surface colors
-  Cont(a, "k");  // black contours
-  CAxis(-1,1);   // return color range to original state
-@end verbatim
-The idea is to divide the color range on 2 parts (dark and bright) and to select the contrasting color for contour lines for each of part.
-
-Similarly, one can plot flow thread over density plot of vector field amplitude (this is another amusing plot from Matlab) and so on. The list of compound graphics can be prolonged but I hope that the general idea is clear.
-
-Just for illustration I put here following sample code:
-@verbatim
-call 'prepare2v'
-call 'prepare3d'
-new v 10:fill v -0.5 1:copy d sqrt(a^2+b^2)
-subplot 2 2 0:title 'Surf + Cont':rotate 50 60:light on:box
-surf a:cont a 'y'
-
-subplot 2 2 1 '':title 'Flow + Dens':light off:box
-flow a b 'br':dens d
-
-subplot 2 2 2:title 'Mesh + Cont':rotate 50 60:box
-mesh a:cont a '_'
-
-subplot 2 2 3:title 'Surf3 + ContF3':rotate 50 60:light on
-box:contf3 v c 'z' 0:contf3 v c 'x':contf3 v c
-cut 0 -1 -1 1 0 1.1
-contf3 v c 'z' c.nz-1:surf3 c -0.5
-@end verbatim
-
-@pfig{combined, Example of ``combined'' plots}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Transparency and lighting, Types of transparency, ``Compound'' graphics, Hints
-@subsection Transparency and lighting
-@nav{}
-
-Here I want to show how transparency and lighting both and separately change the look of a surface. So, there is code and picture for that:
-@verbatim
-call 'prepare2d'
-subplot 2 2 0:title 'default':rotate 50 60:box
-surf a
-
-subplot 2 2 1:title 'light on':rotate 50 60:box
-light on:surf a
-
-subplot 2 2 3:title 'light on; alpha on':rotate 50 60:box
-alpha on:surf a
-
-subplot 2 2 2:title 'alpha on':rotate 50 60:box
-light off:surf a
-@end verbatim
-
-@pfig{alpha, Example of transparency and lightings}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Types of transparency, Axis projection, Transparency and lighting, Hints
-@subsection Types of transparency
-@nav{}
-
-MathGL library has advanced features for setting and handling the surface transparency. The simplest way to add transparency is the using of command @ref{alpha}. As a result, all further surfaces (and isosurfaces, density plots and so on) become transparent. However, their  look can be additionally improved.
-
-The value of transparency can be different from surface to surface. To do it just use @code{SetAlphaDef} before the drawing of the surface, or use option @code{alpha} (see @ref{Command options}). If its value is close to 0 then the surface becomes more and more transparent. Contrary, if its value is close to 1 then the surface becomes practically non-transparent.
-
-Also you can change the way how the light goes through overlapped surfaces. The function @code{SetTranspType} defines it. By default the usual transparency is used (@samp{0}) -- surfaces below is less visible than the upper ones. A ``glass-like'' transparency (@samp{1}) has a different look -- each surface just decreases the background light (the surfaces are commutable in this case).
-
-A ``neon-like'' transparency (@samp{2}) has more interesting look. In this case a surface is the light source (like a lamp on the dark background) and just adds some intensity to the color. At this, the library sets automatically the black color for the background and changes the default line color to white.
-
-As example I shall show several plots for different types of transparency. The code is the same except the values of @code{SetTranspType} function:
-@verbatim
-call 'prepare2d'
-alpha on:light on
-transptype 0:clf
-subplot 2 2 0:rotate 50 60:surf a:box
-subplot 2 2 1:rotate 50 60:dens a:box
-subplot 2 2 2:rotate 50 60:cont a:box
-subplot 2 2 3:rotate 50 60:axial a:box
-@end verbatim
-
-@pfig{type0, Example of @code{SetTranspType(0)}.}
-@pfig{type1, Example of @code{SetTranspType(1)}.}
-@pfig{type2, Example of @code{SetTranspType(2)}.}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Axis projection, Adding fog, Ternary axis, Hints
-@subsection Axis projection
-@nav{}
-
-You can easily make 3D plot and draw its x-,y-,z-projections (like in CAD) by using @ref{ternary} function with arguments: 4 for Cartesian, 5 for Ternary and 6 for Quaternary coordinates. The sample code is:
-@verbatim
-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 verbatim
-
-@pfig{projection, Example of axis projections}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Adding fog, Lighting sample, Axis projection, Hints
-@subsection Adding fog
-@nav{}
-
-MathGL can add a fog to the image. Its switching on is rather simple -- just use @ref{fog} function. There is the only feature -- fog is applied for whole image. Not to particular subplot. The sample code is:
-@verbatim
-call 'prepare2d'
-title 'Fog sample':rotate 50 60:light on
-fog 1
-box:surf a:cont a 'y'
-@end verbatim
-
-@pfig{fog, Example of @code{Fog()}.}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Lighting sample, Using primitives, Adding fog, Hints
-@subsection Lighting sample
-@nav{}
-
-In contrast to the most of other programs, MathGL supports several (up to 10) light sources. Moreover, the color each of them can be different: white (this is usual), yellow, red, cyan, green and so on. The use of several light sources may be interesting for the highlighting of some peculiarities of the plot or just to make an amusing picture. Note, each light source can be switched on/off individually. The sample code is:
-@verbatim
-call 'prepare2d'
-title 'Several light sources':rotate 50 60:light on
-light 1 0 1 0 'c':light 2 1 0 0 'y':light 3 0 -1 0 'm'
-box:surf a 'h'
-@end verbatim
-
-@pfig{several_light, Example of several light sources.}
-
-Additionally, you can use local light sources and set to use @ref{diffuse} reflection instead of specular one (by default) or both kinds. Note, I use @ref{attachlight} command to keep light settings relative to subplot.
-@verbatim
-light on: attachlight on
-call 'prepare2d'
-subplot 2 2 0:title 'Default':rotate 50 60:box:surf a
-line -1 -0.7 1.7 -1 -0.7 0.7 'BA'
-
-subplot 2 2 1:title 'Local':rotate 50 60
-light 0 1 0 1 -2 -1 -1
-line 1 0 1 -1 -1 0 'BAO':box:surf a
-
-subplot 2 2 2:title 'no diffuse':rotate 50 60
-diffuse 0
-line 1 0 1 -1 -1 0 'BAO':box:surf a
-
-subplot 2 2 3:title 'diffusive only':rotate 50 60
-diffuse 0.5:light 0 1 0 1 -2 -1 -1 'w' 0
-line 1 0 1 -1 -1 0 'BAO':box:surf a
-@end verbatim
-
-@pfig{light, Example of different types of lighting.}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Using primitives, STFA sample, Lighting sample, Hints
-@subsection Using primitives
-@nav{}
-
-MathGL provide a set of functions for drawing primitives (see @ref{Primitives}). Primitives are low level object, which used by most of plotting functions. Picture below demonstrate some of commonly used primitives.
-@verbatim
-subplot 2 2 0 '':title 'Line, Curve, Rhomb, Ellipse' '' -1.5
-line -1 -1 -0.5 1 'qAI'
-curve -0.6 -1 1 1 0 1 1 1 'rA'
-ball 0 -0.5 '*':ball 1 -0.1 '*'
-rhomb 0 0.4 1 0.9 0.2 'b#'
-rhomb 0 0 1 0.4 0.2 'cg@'
-ellipse 0 -0.5 1 -0.1 0.2 'u#'
-ellipse 0 -1 1 -0.6 0.2 'm@'
-
-light on
-subplot 2 2 1:title 'Face[xyz]':rotate 50 60:box
-facex 1 0 -1 1 1 'r':facey -1 -1 -1 1 1 'g':facez 1 -1 -1 -1 1 'b'
-face -1 -1 1 -1 1 1 1 -1 0 1 1 1 'bmgr'
-
-subplot 2 2 3 '':title 'Cone'
-cone -0.7 -0.3 0 -0.7 0.7 0.5 0.2 0.1 'b':text -0.7 -0.7 'no edges\n(default)'
-cone 0 -0.3 0 0 0.7 0.5 0.2 0.1 'g@':text 0 -0.7 'with edges\n('\@' style)'
-cone 0.7 -0.3 0 0.7 0.7 0.5 0.2 0.1 'ry':text 0.7 -0.7 '"arrow" with\n{}gradient'
-
-subplot 2 2 2 '':title 'Sphere and Drop'
-line -0.9 0 1 0.9 0 1
-text -0.9 -0.7 'sh=0':drop -0.9 0 0 1 0.5 'r' 0:ball -0.9 0 1 'k'
-text -0.3 -0.7 'sh=0.33':drop -0.3 0 0 1 0.5 'r' 0.33:ball -0.3 0 1 'k'
-text 0.3 -0.7 'sh=0.67':drop 0.3 0 0 1 0.5 'r' 0.67:ball 0.3 0 1 'k'
-text 0.9 -0.7 'sh=1':drop 0.9 0 0 1 0.5 'r' 1:ball 0.9 0 1 'k'
-@end verbatim
-
-@pfig{primitives, Primitives in MathGL.}
-
-Generally, you can create arbitrary new kind of plot using primitives. For example, MathGL don't provide any special functions for drawing molecules. However, you can do it using only one type of primitives @ref{drop}. The sample code is:
-@verbatim
-alpha on:light on
-subplot 2 2 0 '':title 'Methane, CH_4':rotate 60 120
-sphere 0 0 0 0.25 'k':drop 0 0 0 0 0 1 0.35 'h' 1 2:sphere 0 0 0.7 0.25 'g'
-drop 0 0 0 -0.94 0 -0.33 0.35 'h' 1 2:sphere -0.66 0 -0.23 0.25 'g'
-drop 0 0 0 0.47 0.82 -0.33 0.35 'h' 1 2:sphere 0.33 0.57 -0.23 0.25 'g'
-drop 0 0 0 0.47 -0.82 -0.33 0.35 'h' 1 2:sphere 0.33 -0.57 -0.23 0.25 'g'
-
-subplot 2 2 1 '':title 'Water, H{_2}O':rotate 60 100
-sphere 0 0 0 0.25 'r':drop 0 0 0 0.3 0.5 0 0.3 'm' 1 2:sphere 0.3 0.5 0 0.25 'g'
-drop 0 0 0 0.3 -0.5 0 0.3 'm' 1 2:sphere 0.3 -0.5 0 0.25 'g'
-
-subplot 2 2 2 '':title 'Oxygen, O_2':rotate 60 120
-drop 0 0.5 0 0 -0.3 0 0.3 'm' 1 2:sphere 0 0.5 0 0.25 'r'
-drop 0 -0.5 0 0 0.3 0 0.3 'm' 1 2:sphere 0 -0.5 0 0.25 'r'
-
-subplot 2 2 3 '':title 'Ammonia, NH_3':rotate 60 120
-sphere 0 0 0 0.25 'b':drop 0 0 0 0.33 0.57 0 0.32 'n' 1 2
-sphere 0.33 0.57 0 0.25 'g':drop 0 0 0 0.33 -0.57 0 0.32 'n' 1 2
-sphere 0.33 -0.57 0 0.25 'g':drop 0 0 0 -0.65 0 0 0.32 'n' 1 2
-sphere -0.65 0 0 0.25 'g'
-@end verbatim
-
-@pfig{molecule, Example of molecules drawing.}
-
-Moreover, some of special plots can be more easily produced by primitives rather than by specialized function. For example, Venn diagram can be produced by @code{Error} plot:
-@verbatim
-list x -0.3 0 0.3:list y 0.3 -0.3 0.3:list e 0.7 0.7 0.7
-title 'Venn-like diagram':alpha on
-error x y e e '!rgb@#o'
-@end verbatim
-You see that you have to specify and fill 3 data arrays. The same picture can be produced by just 3 calls of @ref{circle} function:
-@verbatim
-title 'Venn-like diagram':alpha on
-circle -0.3 0.3 0.7 'rr@'
-circle 0 -0.3 0.7 'gg@'
-circle 0.3 0.3 0.7 'bb@'
-@end verbatim
-Of course, the first variant is more suitable if you need to plot a lot of circles. But for few ones the usage of primitives looks easy.
-
-@pfig{venn, Example of Venn diagram.}
-
-@c ------------------------------------------------------------------
-@external{}
-@node STFA sample, Mapping visualization, Using primitives, Hints
-@subsection STFA sample
-@nav{}
-
-Short-time Fourier Analysis (@ref{stfa}) is one of informative method for analyzing long rapidly oscillating 1D data arrays. It is used to determine the sinusoidal frequency and phase content of local sections of a signal as it changes over time.
-
-MathGL can find and draw STFA result. Just to show this feature I give following sample. Initial data arrays is 1D arrays with step-like frequency. Exactly this you can see at bottom on the STFA plot. The sample code is:
-@verbatim
-new a 2000:new b 2000
-fill a 'cos(50*pi*x)*(x<-.5)+cos(100*pi*x)*(x<0)*(x>-.5)+\
-cos(200*pi*x)*(x<.5)*(x>0)+cos(400*pi*x)*(x>.5)'
-
-subplot 1 2 0 '<_':title 'Initial signal'
-plot a:axis:xlabel '\i t'
-
-subplot 1 2 1 '<_':title 'STFA plot'
-stfa a b 64:axis:ylabel '\omega' 0:xlabel '\i t'
-@end verbatim
-
-@pfig{stfa, Example of STFA().}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Mapping visualization, Data interpolation, STFA sample, Hints
-@subsection Mapping visualization
+@node Mapping visualization, Data interpolation, STFA sample, Hints
+@subsection Mapping visualization
 @nav{}
 
 Sometime ago I worked with mapping and have a question about its visualization. Let me remember you that mapping is some transformation rule for one set of number to another one. The 1d mapping is just an ordinary function -- it takes a number and transforms it to another one. The 2d mapping (which I used) is a pair of functions which take 2 numbers and transform them to another 2 ones. Except general plots (like @ref{surfc}, @ref{surfa}) there is a special plot -- Arnold diagram. It shows the area which is the result of mapping of some initial area (usually square).
@@ -2857,7 +1327,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
@@ -2875,6 +1345,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{}
@@ -3074,7 +1565,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{}
 
@@ -3105,6 +1596,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 d49f53b8e2fd86debb60e63433d0a402bc99b042..8e72960480a53b8480e25de8e6dbb233e9452c10 100644 (file)
@@ -56,10 +56,6 @@ and so on.
 * Advanced usage::
 * Data handling::
 * Data plotting::
-* 1D samples::
-* 2D samples::
-* 3D samples::
-* Vector field samples::
 * Hints::
 * FAQ::
 @end menu
@@ -136,8 +132,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
@@ -1427,7 +1424,7 @@ int sample(mglGraph *gr)
 
 @c ------------------------------------------------------------------
 @external{}
-@node Data plotting, 1D samples, Data handling, Examples
+@node Data plotting, Hints, Data handling, Examples
 @section Data plotting
 @nav{}
 
@@ -1549,1932 +1546,7 @@ int sample(mglGraph *gr)
 
 @c ------------------------------------------------------------------
 @external{}
-@node 1D samples, 2D samples, Data plotting, Examples
-@section 1D samples
-@nav{}
-
-This section is devoted to visualization of 1D data arrays. 1D means the data which depend on single index (parameter) like curve in parametric form @{x(i),y(i),z(i)@}, i=1...n. Most of samples will use the same data for plotting. So, I put its initialization in separate function
-@verbatim
-void mgls_prepare1d(mglData *y, mglData *y1=0, mglData *y2=0, mglData *x1=0, mglData *x2=0)
-{
-  register long i,n=50;
-  if(y) y->Create(n,3);
-  if(x1)  x1->Create(n);    if(x2)  x2->Create(n);
-  if(y1)  y1->Create(n);    if(y2)  y2->Create(n);
-  mreal xx;
-  for(i=0;i<n;i++)
-  {
-    xx = i/(n-1.);
-    if(y)
-    {
-      y->a[i] = 0.7*sin(2*M_PI*xx) + 0.5*cos(3*M_PI*xx) + 0.2*sin(M_PI*xx);
-      y->a[i+n] = sin(2*M_PI*xx);
-      y->a[i+2*n] = cos(2*M_PI*xx);
-    }
-    if(y1)  y1->a[i] = 0.5+0.3*cos(2*M_PI*xx);
-    if(y2)  y2->a[i] = 0.3*sin(2*M_PI*xx);
-    if(x1)  x1->a[i] = xx*2-1;
-    if(x2)  x2->a[i] = 0.05+0.03*cos(2*M_PI*xx);
-  }
-}
-@end verbatim
-or using C functions
-@verbatim
-void mgls_prepare1d(HMDT y, HMDT y1=0, HMDT y2=0, HMDT x1=0, HMDT x2=0)
-{
-  register long i,n=50;
-  if(y)   mgl_data_create(y,n,3,1);
-  if(x1)  mgl_data_create(x1,n,1,1);
-  if(x2)  mgl_data_create(x2,n,1,1);
-  if(y1)  mgl_data_create(y1,n,1,1);
-  if(y2)  mgl_data_create(y2,n,1,1);
-  mreal xx;
-  for(i=0;i<n;i++)
-  {
-    xx = i/(n-1.);
-    if(y)
-    {
-      mgl_data_set_value(y, 0.7*sin(2*M_PI*xx) + 0.5*cos(3*M_PI*xx) + 0.2*sin(M_PI*xx), i,0,0);
-      mgl_data_set_value(y, sin(2*M_PI*xx), i,1,0);
-      mgl_data_set_value(y, cos(2*M_PI*xx), i,2,0);
-    }
-    if(y1)  mgl_data_set_value(y1, 0.5+0.3*cos(2*M_PI*xx), i,0,0);
-    if(y2)  mgl_data_set_value(y2, 0.3*sin(2*M_PI*xx), i,0,0);
-    if(x1)  mgl_data_set_value(x1, xx*2-1, i,0,0);
-    if(x2)  mgl_data_set_value(x2, 0.05+0.03*cos(2*M_PI*xx), i,0,0);
-  }
-}
-@end verbatim
-
-@menu
-* Plot sample::
-* Radar sample::
-* Step sample::
-* Tens sample::
-* Area sample::
-* Region sample::
-* Stem sample::
-* Bars sample::
-* Barh sample::
-* Cones sample::
-* Chart sample::
-* BoxPlot sample::
-* Candle sample::
-* OHLC sample::
-* Error sample::
-* Mark sample::
-* TextMark sample::
-* Label sample::
-* Table sample::
-* Tube sample::
-* Tape sample::
-* Torus sample::
-* Lamerey sample::
-* Bifurcation sample::
-* Pmap sample::
-@end menu
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Plot sample, Radar sample, , 1D samples
-@subsection Plot sample
-@nav{}
-
-Function @ref{plot} is most standard way to visualize 1D data array. By default, @code{Plot} use colors from palette. However, you can specify manual color/palette, and even set to use new color for each points by using @samp{!} style. Another feature is @samp{ } style which draw only markers without line between points. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData y;  mgls_prepare1d(&y); gr->SetOrigin(0,0,0);
-  gr->SubPlot(2,2,0,"");  gr->Title("Plot plot (default)");
-  gr->Box();  gr->Plot(y);
-
-  gr->SubPlot(2,2,2,"");  gr->Title("'!' style; 'rgb' palette");
-  gr->Box();  gr->Plot(y,"o!rgb");
-
-  gr->SubPlot(2,2,3,"");  gr->Title("just markers");
-  gr->Box();  gr->Plot(y," +");
-
-  gr->SubPlot(2,2,1); gr->Title("3d variant");
-  gr->Rotate(50,60);  gr->Box();
-  mglData yc(30), xc(30), z(30);  z.Modify("2*x-1");
-  yc.Modify("sin(pi*(2*x-1))"); xc.Modify("cos(pi*2*x-pi)");
-  gr->Plot(xc,yc,z,"rs");
-  return 0;
-}
-@end verbatim
-
-@pfig{plot, Example of Plot()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Radar sample, Step sample, Plot sample, 1D samples
-@subsection Radar sample
-@nav{}
-
-Function @ref{radar} plot is variant of @code{Plot} one, which make plot in polar coordinates and draw radial rays in point directions. If you just need a plot in polar coordinates then I recommend to use @ref{Curvilinear coordinates} or @code{Plot} in parabolic form with @code{x=r*cos(fi); y=r*sin(fi);}. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData yr(10,3); yr.Modify("0.4*sin(pi*(2*x+y))+0.1*rnd");
-  gr->SubPlot(1,1,0,"");  gr->Title("Radar plot (with grid, '\\#')");
-  gr->Radar(yr,"#");
-  return 0;
-}
-@end verbatim
-
-@pfig{radar, Example of Radar()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Step sample, Tens sample, Radar sample, 1D samples
-@subsection Step sample
-@nav{}
-
-Function @ref{step} plot data as stairs. It have the same options as @code{Plot}. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData y;  mgls_prepare1d(&y); gr->SetOrigin(0,0,0);
-  mglData yc(30), xc(30), z(30);  z.Modify("2*x-1");
-  yc.Modify("sin(pi*(2*x-1))"); xc.Modify("cos(pi*2*x-pi)");
-
-  gr->SubPlot(2,2,0,"");  gr->Title("Step plot (default)");
-  gr->Box();  gr->Step(y);
-
-  gr->SubPlot(2,2,1); gr->Title("3d variant");  gr->Rotate(50,60);
-  gr->Box();  gr->Step(xc,yc,z,"r");
-
-  gr->SubPlot(2,2,2,"");  gr->Title("'!' style");
-  gr->Box();  gr->Step(y,"s!rgb");
-  return 0;
-}
-@end verbatim
-
-@pfig{step, Example of Step()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Tens sample, Area sample, Step sample, 1D samples
-@subsection Tens sample
-@nav{}
-
-Function @ref{tens} is variant of @ref{plot} with smooth coloring along the curves. At this, color is determined as for surfaces (see @ref{Color scheme}). The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData y;  mgls_prepare1d(&y); gr->SetOrigin(0,0,0);
-  gr->SubPlot(2,2,0,"");  gr->Title("Tens plot (default)");
-  gr->Box();  gr->Tens(y.SubData(-1,0), y.SubData(-1,1));
-
-  gr->SubPlot(2,2,2,"");  gr->Title("' ' style");
-  gr->Box();  gr->Tens(y.SubData(-1,0), y.SubData(-1,1),"o ");
-
-  gr->SubPlot(2,2,1); gr->Title("3d variant");  gr->Rotate(50,60);  gr->Box();
-  mglData yc(30), xc(30), z(30);  z.Modify("2*x-1");
-  yc.Modify("sin(pi*(2*x-1))"); xc.Modify("cos(pi*2*x-pi)");
-  gr->Tens(xc,yc,z,z,"s");
-  return 0;
-}
-@end verbatim
-
-@pfig{tens, Example of Tens()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Area sample, Region sample, Tens sample, 1D samples
-@subsection Area sample
-@nav{}
-
-Function @ref{area} fill the area between curve and axis plane. It support gradient filling if 2 colors per curve is specified. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData y;  mgls_prepare1d(&y); gr->SetOrigin(0,0,0);
-  gr->SubPlot(2,2,0,"");  gr->Title("Area plot (default)");
-  gr->Box();  gr->Area(y);
-
-  gr->SubPlot(2,2,1,"");  gr->Title("2 colors");
-  gr->Box();  gr->Area(y,"cbgGyr");
-
-  gr->SubPlot(2,2,2,"");  gr->Title("'!' style");
-  gr->Box();  gr->Area(y,"!");
-
-  gr->SubPlot(2,2,3); gr->Title("3d variant");
-  gr->Rotate(50,60);  gr->Box();
-  mglData yc(30), xc(30), z(30);  z.Modify("2*x-1");
-  yc.Modify("sin(pi*(2*x-1))"); xc.Modify("cos(pi*2*x-pi)");
-  gr->Area(xc,yc,z,"r");
-  yc.Modify("-sin(pi*(2*x-1))");  gr->Area(xc,yc,z,"b#");
-  return 0;
-}
-@end verbatim
-
-@pfig{area, Example of Area()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Region sample, Stem sample, Area sample, 1D samples
-@subsection Region sample
-@nav{}
-
-Function @ref{region} fill the area between 2 curves. It support gradient filling if 2 colors per curve is specified. Also it can fill only the region y1<y<y2 if style @samp{i} is used. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData y;  mgls_prepare1d(&y);
-  mglData y1 = y.SubData(-1,1), y2 = y.SubData(-1,2);  gr->SetOrigin(0,0,0);
-
-  gr->SubPlot(2,2,0,"");  gr->Title("Region plot (default)"); gr->Box();
-  gr->Region(y1,y2);  gr->Plot(y1,"k2");  gr->Plot(y2,"k2");
-
-  gr->SubPlot(2,2,1,"");  gr->Title("2 colors");  gr->Box();
-  gr->Region(y1,y2,"yr"); gr->Plot(y1,"k2");  gr->Plot(y2,"k2");
-
-  gr->SubPlot(2,2,2,"");  gr->Title("'i' style");  gr->Box();
-  gr->Region(y1,y2,"ir"); gr->Plot(y1,"k2");  gr->Plot(y2,"k2");
-
-  gr->SubPlot(2,2,3,"^_");  gr->Title("3d variant");  gr->Rotate(40,60);  gr->Box();
-  gr->Fill(y1,"cos(pi*x)"); gr->Fill(y2,"cos(pi*x+pi/3)");
-  mglData x1(y1.nx), x2(y1.nx), z(y1.nx);
-  gr->Fill(x1,"sin(pi*x)"); gr->Fill(x2,"sin(pi*x+pi/3)");  gr->Fill(z,"x");
-  gr->Plot(x1,y1,z,"r2");   gr->Plot(x2,y2,z,"b2");
-  gr->Region(x1,y1,z,x2,y2,z,"cmy!");
-  return 0;
-}
-@end verbatim
-
-@pfig{region, Example of Region()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Stem sample, Bars sample, Region sample, 1D samples
-@subsection Stem sample
-@nav{}
-
-Function @ref{stem} draw vertical bars. It is most attractive if markers are drawn too. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData y;  mgls_prepare1d(&y); gr->SetOrigin(0,0,0);
-  mglData yc(30), xc(30), z(30);  z.Modify("2*x-1");
-  yc.Modify("sin(pi*(2*x-1))"); xc.Modify("cos(pi*2*x-pi)");
-  gr->SubPlot(2,2,0,"");  gr->Title("Stem plot (default)");
-  gr->Box();  gr->Stem(y);
-
-  gr->SubPlot(2,2,1); gr->Title("3d variant");  gr->Rotate(50,60);
-  gr->Box();  gr->Stem(xc,yc,z,"rx");
-
-  gr->SubPlot(2,2,2,"");  gr->Title("'!' style");
-  gr->Box();  gr->Stem(y,"o!rgb");
-  return 0;
-}
-@end verbatim
-
-@pfig{stem, Example of Stem()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Bars sample, Barh sample, Stem sample, 1D samples
-@subsection Bars sample
-@nav{}
-
-Function @ref{bars} draw vertical bars. It have a lot of options: bar-above-bar (@samp{a} style), fall like (@samp{f} style), 2 colors for positive and negative values, wired bars (@samp{#} style), 3D variant. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData ys(10,3); ys.Modify("0.8*sin(pi*(2*x+y/2))+0.2*rnd");
-  gr->SetOrigin(0,0,0);
-  gr->SubPlot(3,2,0,"");  gr->Title("Bars plot (default)");
-  gr->Box();  gr->Bars(ys);
-
-  gr->SubPlot(3,2,1,"");  gr->Title("2 colors");
-  gr->Box();  gr->Bars(ys,"cbgGyr");
-
-  gr->SubPlot(3,2,4,"");  gr->Title("'\\#' style");
-  gr->Box();  gr->Bars(ys,"#");
-
-  gr->SubPlot(3,2,5); gr->Title("3d variant");
-  gr->Rotate(50,60);  gr->Box();
-  mglData yc(30), xc(30), z(30);  z.Modify("2*x-1");
-  yc.Modify("sin(pi*(2*x-1))"); xc.Modify("cos(pi*2*x-pi)");
-  gr->Bars(xc,yc,z,"r");
-
-  gr->SetRanges(-1,1,-3,3);
-  gr->SubPlot(3,2,2,"");  gr->Title("'a' style");
-  gr->Box();  gr->Bars(ys,"a");
-
-  gr->SubPlot(3,2,3,"");  gr->Title("'f' style");
-  gr->Box();  gr->Bars(ys,"f");
-  return 0;
-}
-@end verbatim
-
-@pfig{bars, Example of Bars()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Barh sample, Cones sample, Bars sample, 1D samples
-@subsection Barh sample
-@nav{}
-
-Function @ref{barh} is the similar to @code{Bars} but draw horizontal bars. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData ys(10,3); ys.Modify("0.8*sin(pi*(2*x+y/2))+0.2*rnd");
-  gr->SetOrigin(0,0,0);
-  gr->SubPlot(2,2,0,"");  gr->Title("Barh plot (default)");
-  gr->Box();  gr->Barh(ys);
-
-  gr->SubPlot(2,2,1,"");  gr->Title("2 colors");
-  gr->Box();  gr->Barh(ys,"cbgGyr");
-
-  gr->SetRanges(-3,3,-1,1);
-  gr->SubPlot(2,2,2,"");  gr->Title("'a' style");
-  gr->Box();  gr->Barh(ys,"a");
-
-  gr->SubPlot(2,2,3,"");  gr->Title("'f' style");
-  gr->Box();  gr->Barh(ys,"f");
-  return 0;
-}
-@end verbatim
-
-@pfig{barh, Example of Barh()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Cones sample, Chart sample, Barh sample, 1D samples
-@subsection Cones sample
-@nav{}
-
-Function @ref{cones} is similar to @code{Bars} but draw cones. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData ys(10,3);   ys.Modify("0.8*sin(pi*(2*x+y/2))+0.2*rnd");
-  gr->Light(true);    gr->SetOrigin(0,0,0);
-  gr->SubPlot(3,2,0); gr->Title("Cones plot");
-  gr->Rotate(50,60);  gr->Box();  gr->Cones(ys);
-
-  gr->SubPlot(3,2,1); gr->Title("2 colors");
-  gr->Rotate(50,60);  gr->Box();  gr->Cones(ys,"cbgGyr");
-
-  gr->SubPlot(3,2,2); gr->Title("'#' style");
-  gr->Rotate(50,60);  gr->Box();  gr->Cones(ys,"#");
-
-  gr->SubPlot(3,2,3); gr->Title("'a' style");
-  gr->SetRange('z',-2,2); // increase range since summation can exceed [-1,1]
-  gr->Rotate(50,60);  gr->Box();  gr->Cones(ys,"a");
-
-  gr->SubPlot(3,2,4); gr->Title("'t' style");
-  gr->Rotate(50,60);  gr->Box();  gr->Cones(ys,"t");
-
-  gr->SubPlot(3,2,5); gr->Title("'4' style");
-  gr->Rotate(50,60);  gr->Box();  gr->Cones(ys,"4");
-  return 0;
-}
-@end verbatim
-
-@pfig{cones, Example of Cones()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Chart sample, BoxPlot sample, Cones sample, 1D samples
-@subsection Chart sample
-@nav{}
-
-Function @ref{chart} draw colored boxes with width proportional to data values. Use @samp{ } for empty box. Plot looks most attractive in polar coordinates -- well known pie chart. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData ch(7,2);  for(int i=0;i<7*2;i++)  ch.a[i]=mgl_rnd()+0.1;
-  gr->SubPlot(2,2,0); gr->Title("Chart plot (default)");
-  gr->Light(true);  gr->Rotate(50,60);  gr->Box();  gr->Chart(ch);
-
-  gr->SubPlot(2,2,1); gr->Title("'\\#' style");
-  gr->Rotate(50,60);  gr->Box();  gr->Chart(ch,"#");
-
-  gr->SubPlot(2,2,2); gr->Title("Pie chart; ' ' color");
-  gr->SetFunc("(y+1)/2*cos(pi*x)","(y+1)/2*sin(pi*x)","");
-  gr->Rotate(50,60);  gr->Box();  gr->Chart(ch,"bgr cmy#");
-
-  gr->SubPlot(2,2,3); gr->Title("Ring chart; ' ' color");
-  gr->SetFunc("(y+2)/3*cos(pi*x)","(y+2)/3*sin(pi*x)","");
-  gr->Rotate(50,60);  gr->Box();  gr->Chart(ch,"bgr cmy#");
-  return 0;
-}
-@end verbatim
-
-@pfig{chart, Example of Chart()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node BoxPlot sample, Candle sample, Chart sample, 1D samples
-@subsection BoxPlot sample
-@nav{}
-
-Function @ref{boxplot} draw box-and-whisker diagram. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a(10,7);  a.Modify("(2*rnd-1)^3/2");
-  gr->SubPlot(1,1,0,"");  gr->Title("Boxplot plot");
-  gr->Box();  gr->BoxPlot(a);
-  return 0;
-}
-@end verbatim
-
-@pfig{boxplot, Example of BoxPlot()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Candle sample, OHLC sample, BoxPlot sample, 1D samples
-@subsection Candle sample
-@nav{}
-
-Function @ref{candle} draw candlestick chart. This is a combination of a line-chart and a bar-chart, in that each bar represents the range of price movement over a given time interval. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData y(30);  gr->Fill(y,"sin(pi*x/2)^2");
-  mglData y1(30); gr->Fill(y1,"v/2",y);
-  mglData y2(30); gr->Fill(y2,"(1+v)/2",y);
-  gr->SubPlot(1,1,0,"");  gr->Title("Candle plot (default)");
-  gr->SetRange('y',0,1);  gr->Box();  gr->Candle(y,y1,y2);
-  return 0;
-}
-@end verbatim
-
-@pfig{candle, Example of Candle()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node OHLC sample, Error sample, Candle sample, 1D samples
-@subsection OHLC sample
-@nav{}
-
-Function @ref{ohlc} draw Open-High-Low-Close diagram. This diagram show vertical line for between maximal(high) and minimal(low) values, as well as horizontal lines before/after vertical line for initial(open)/final(close) values of some process. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData o(10), h(10), l(10), c(10);
-  gr->Fill(o,"0.5*sin(pi*x)");  gr->Fill(c,"0.5*sin(pi*(x+2/9))");
-  gr->Fill(l,"0.3*rnd-0.8");    gr->Fill(h,"0.3*rnd+0.5");
-  gr->SubPlot(1,1,0,"");  gr->Title("OHLC plot");
-  gr->Box();  gr->OHLC(o,h,l,c);
-  return 0;
-}
-@end verbatim
-
-@pfig{ohlc, Example of OHLC()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Error sample, Mark sample, OHLC sample, 1D samples
-@subsection Error sample
-@nav{}
-
-Function @ref{error} draw error boxes around the points. You can draw default boxes or semi-transparent symbol (like marker, see @ref{Line styles}). Also you can set individual color for each box. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData y;  mgls_prepare1d(&y);
-  mglData x0(10), y0(10), ex0(10), ey0(10);
-  mreal x;
-  for(int i=0;i<10;i++)
-  {
-    x = i/9.;
-    x0.a[i] = 2*x-1 + 0.1*mgl_rnd()-0.05;
-    y0.a[i] = 0.7*sin(2*M_PI*x)+0.5*cos(3*M_PI*x)+0.2*sin(M_PI*x)+0.2*mgl_rnd()-0.1;
-    ey0.a[i]=0.2; ex0.a[i]=0.1;
-  }
-
-  gr->SubPlot(2,2,0,"");  gr->Title("Error plot (default)");
-  gr->Box();  gr->Plot(y.SubData(-1,0));  gr->Error(x0,y0,ex0,ey0,"ko");
-
-  gr->SubPlot(2,2,1,"");  gr->Title("'!' style; no e_x");
-  gr->Box();  gr->Plot(y.SubData(-1,0));  gr->Error(x0,y0,ey0,"o!rgb");
-
-  gr->SubPlot(2,2,2,"");  gr->Title("'\\@' style");
-  gr->Box();  gr->Plot(y.SubData(-1,0));  gr->Error(x0,y0,ex0,ey0,"@","alpha 0.5");
-
-  gr->SubPlot(2,2,3); gr->Title("3d variant");  gr->Rotate(50,60);
-  for(int i=0;i<10;i++)
-    gr->Error(mglPoint(2*mgl_rnd()-1,2*mgl_rnd()-1,2*mgl_rnd()-1),
-              mglPoint(0.2,0.2,0.2),"bo");
-  gr->Axis();
-  return 0;
-}
-@end verbatim
-
-@pfig{error, Example of Error()}
-
-Additionally, you can use solid large "marks" instead of error boxes by selecting proper style.
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData x0(10), y0(10), ex(10), ey(10);
-  for(int i=0;i<10;i++)
-  {  x0.a[i] = mgl_rnd(); y0.a[i] = mgl_rnd(); ey.a[i] = ex.a[i] = 0.1; }
-  gr->SetRanges(0,1,0,1); gr->Alpha(true);
-  gr->SubPlot(4,3,0,"");  gr->Box(); gr->Error(x0,y0,ex,ey,"#+@");
-  gr->SubPlot(4,3,1,"");  gr->Box(); gr->Error(x0,y0,ex,ey,"#x@");
-  gr->SubPlot(4,3,2,"");  gr->Box(); gr->Error(x0,y0,ex,ey,"#s@","alpha 0.5");
-  gr->SubPlot(4,3,3,"");  gr->Box(); gr->Error(x0,y0,ex,ey,"s@");
-  gr->SubPlot(4,3,4,"");  gr->Box(); gr->Error(x0,y0,ex,ey,"d@");
-  gr->SubPlot(4,3,5,"");  gr->Box(); gr->Error(x0,y0,ex,ey,"#d@","alpha 0.5");
-  gr->SubPlot(4,3,6,"");  gr->Box(); gr->Error(x0,y0,ex,ey,"+@");
-  gr->SubPlot(4,3,7,"");  gr->Box(); gr->Error(x0,y0,ex,ey,"x@");
-  gr->SubPlot(4,3,8,"");  gr->Box(); gr->Error(x0,y0,ex,ey,"o@");
-  gr->SubPlot(4,3,9,"");  gr->Box(); gr->Error(x0,y0,ex,ey,"#o@","alpha 0.5");
-  gr->SubPlot(4,3,10,""); gr->Box(); gr->Error(x0,y0,ex,ey,"#.@");
-  gr->SubPlot(4,3,11,""); gr->Box(); gr->Error(x0,y0,ex,ey);
-}
-@end verbatim
-
-@pfig{error2, Example of Error() with marks}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Mark sample, TextMark sample, Error sample, 1D samples
-@subsection Mark sample
-@nav{}
-
-Function @ref{mark} draw markers at points. It is mostly the same as @code{Plot} but marker size can be variable. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData y,y1; mgls_prepare1d(&y,&y1);
-  gr->SubPlot(1,1,0,"");  gr->Title("Mark plot (default)");
-  gr->Box();  gr->Mark(y,y1,"s");
-  return 0;
-}
-@end verbatim
-
-@pfig{mark, Example of Mark()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node TextMark sample, Label sample, Mark sample, 1D samples
-@subsection TextMark sample
-@nav{}
-
-Function @ref{textmark} like @code{Mark} but draw text instead of markers. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData y,y1; mgls_prepare1d(&y,&y1);
-  gr->SubPlot(1,1,0,"");  gr->Title("TextMark plot (default)");
-  gr->Box();  gr->TextMark(y,y1,"\\gamma","r");
-  return 0;
-}
-@end verbatim
-
-@pfig{textmark, Example of TextMark()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Label sample, Table sample, TextMark sample, 1D samples
-@subsection Label sample
-@nav{}
-
-Function @ref{label} print text at data points. The string may contain @samp{%x}, @samp{%y}, @samp{%z} for x-, y-, z-coordinates of points, @samp{%n} for point index. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData ys(10); ys.Modify("0.8*sin(pi*2*x)+0.2*rnd");
-  gr->SubPlot(1,1,0,"");  gr->Title("Label plot");
-  gr->Box();  gr->Plot(ys," *");  gr->Label(ys,"y=%y");
-  return 0;
-}
-@end verbatim
-
-@pfig{label, Example of Label()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Table sample, Tube sample, Label sample, 1D samples
-@subsection Table sample
-@nav{}
-
-Function @ref{table} draw table with data values. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData ys(10,3); ys.Modify("0.8*sin(pi*(2*x+y/2))+0.2*rnd");
-  gr->SubPlot(2,2,0);  gr->Title("Table plot");
-  gr->Table(ys,"y_1\ny_2\ny_3");   gr->Box();
-  gr->SubPlot(2,2,1);  gr->Title("no borders, colored");
-  gr->Table(ys,"y_1\ny_2\ny_3","r|");
-  gr->SubPlot(2,2,2);  gr->Title("no font decrease");
-  gr->Table(ys,"y_1\ny_2\ny_3","#");
-  gr->SubPlot(2,2,3);  gr->Title("manual width, position");
-  gr->Table(0.5, 0.95, ys,"y_1\ny_2\ny_3","#", "value 0.7");  gr->Box();
-  return 0;
-}
-@end verbatim
-
-@pfig{table, Example of Table()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Tube sample, Tape sample, Table sample, 1D samples
-@subsection Tube sample
-@nav{}
-
-Function @ref{tube} draw tube with variable radius. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData y,y1,y2;  mgls_prepare1d(&y,&y1,&y2); y1/=20;
-  gr->SubPlot(2,2,0,"");  gr->Title("Tube plot (default)");
-  gr->Light(true);  gr->Box();  gr->Tube(y,0.05);
-
-  gr->SubPlot(2,2,1,"");  gr->Title("variable radius");
-  gr->Box();  gr->Tube(y,y1);
-
-  gr->SubPlot(2,2,2,"");  gr->Title("'\\#' style");
-  gr->Box();  gr->Tube(y,0.05,"#");
-  mglData yc(50), xc(50), z(50);  z.Modify("2*x-1");
-  yc.Modify("sin(pi*(2*x-1))"); xc.Modify("cos(pi*2*x-pi)");
-
-  gr->SubPlot(2,2,3); gr->Title("3d variant");  gr->Rotate(50,60);
-  gr->Box();  gr->Tube(xc,yc,z,y2,"r");
-  return 0;
-}
-@end verbatim
-
-@pfig{tube, Example of Tube()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Tape sample, Torus sample, Tube sample, 1D samples
-@subsection Tape sample
-@nav{}
-
-Function @ref{tape} draw tapes which rotate around the curve as normal and binormal. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData y;  mgls_prepare1d(&y);
-  mglData xc(50), yc(50), z(50);
-  yc.Modify("sin(pi*(2*x-1))");
-  xc.Modify("cos(pi*2*x-pi)");  z.Fill(-1,1);
-  gr->SubPlot(2,2,0,"");  gr->Title("Tape plot (default)");
-  gr->Box();  gr->Tape(y);  gr->Plot(y,"k");
-
-  gr->SubPlot(2,2,1); gr->Title("3d variant, 2 colors");
-  gr->Rotate(50,60);  gr->Light(true);
-  gr->Box();  gr->Plot(xc,yc,z,"k");  gr->Tape(xc,yc,z,"rg");
-
-  gr->SubPlot(2,2,2); gr->Title("3d variant, x only");  gr->Rotate(50,60);
-  gr->Box();  gr->Plot(xc,yc,z,"k");
-  gr->Tape(xc,yc,z,"xr"); gr->Tape(xc,yc,z,"xr#");
-
-  gr->SubPlot(2,2,3); gr->Title("3d variant, z only");  gr->Rotate(50,60);
-  gr->Box();  gr->Plot(xc,yc,z,"k");
-  gr->Tape(xc,yc,z,"zg"); gr->Tape(xc,yc,z,"zg#");
-  return 0;
-}
-@end verbatim
-
-@pfig{tape, Example of Tape()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Torus sample, Lamerey sample, Tape sample, 1D samples
-@subsection Torus sample
-@nav{}
-
-Function @ref{torus} draw surface of the curve rotation. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData y1,y2;  mgls_prepare1d(0,&y1,&y2);
-  gr->SubPlot(2,2,0); gr->Title("Torus plot (default)");
-  gr->Light(true);  gr->Rotate(50,60);  gr->Box();  gr->Torus(y1,y2);
-  if(mini)  return;
-
-  gr->SubPlot(2,2,1); gr->Title("'x' style"); gr->Rotate(50,60);
-  gr->Box();  gr->Torus(y1,y2,"x");
-
-  gr->SubPlot(2,2,2); gr->Title("'z' style"); gr->Rotate(50,60);
-  gr->Box();  gr->Torus(y1,y2,"z");
-
-  gr->SubPlot(2,2,3); gr->Title("'\\#' style"); gr->Rotate(50,60);
-  gr->Box();  gr->Torus(y1,y2,"#");
-  return 0;
-}
-@end verbatim
-
-@pfig{torus, Example of Torus()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Lamerey sample, Bifurcation sample, Torus sample, 1D samples
-@subsection Lamerey sample
-@nav{}
-
-Function @ref{lamerey} draw Lamerey diagram. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  gr->SubPlot(1,1,0,"<_");
-  gr->Title("Lamerey sample");
-  gr->Axis(); gr->Label('x',"\\i x");
-  gr->Label('y',"\\bar{\\i x} = 2 \\i{x}");
-  gr->FPlot("x","k=");  gr->FPlot("2*x","b");
-  gr->Lamerey( 0.00097,"2*x","rv~");
-  gr->Lamerey(-0.00097,"2*x","rv~");
-}
-@end verbatim
-
-@pfig{lamerey, Example of Lamerey()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Bifurcation sample, Pmap sample, Lamerey sample, 1D samples
-@subsection Bifurcation sample
-@nav{}
-
-Function @ref{bifurcation} draw Bifurcation diagram for logistic map. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  gr->SubPlot(1,1,0,"<_");
-  gr->Title("Bifurcation sample");
-  gr->SetRanges(0,4,0,1);   gr->Axis();
-  gr->Bifurcation(0.005,"x*y*(1-y)","r");
-}
-@end verbatim
-
-@pfig{bifurcation, Example of Bifurcation()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Pmap sample, , Bifurcation sample, 1D samples
-@subsection Pmap sample
-@nav{}
-
-Function @ref{pmap} draw Poincare map -- show intersections of the curve and the surface. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  gr->SubPlot(1,1,0,"<_^");
-  gr->Title("Poincare map sample");
-  mglData ini(3);      ini[0]=0.1;
-  mglData r(mglODE("cos(y)+sin(z);cos(z)+sin(x);cos(x)+sin(y)","xyz",ini,0.1,100));
-  mglData x(r.SubData(0)),y(r.SubData(1)), z(r.SubData(2));
-  gr->Rotate(40,60);  gr->SetRanges(x,y,z);
-  gr->Axis(); gr->FSurf("0"); gr->Plot(x,y,z,"b");
-  gr->Label('x',"\\i x",0);   gr->Label('y',"\\i y",0);   gr->Label('z',"\\i z",0);
-  gr->Pmap(x,y,z,z, "b#o");
-}
-@end verbatim
-
-@pfig{pmap, Example of Pmap()}
-
-
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node 2D samples, 3D samples, 1D samples, Examples
-@section 2D samples
-@nav{}
-
-This section is devoted to visualization of 2D data arrays. 2D means the data which depend on 2 indexes (parameters) like matrix z(i,j)=z(x(i),y(j)), i=1...n, j=1...m or in parametric form @{x(i,j),y(i,j),z(i,j)@}. Most of samples will use the same data for plotting. So, I put its initialization in separate function
-@verbatim
-void mgls_prepare2d(mglData *a, mglData *b=0, mglData *v=0)
-{
-  register long i,j,n=50,m=40,i0;
-  if(a) a->Create(n,m);   if(b) b->Create(n,m);
-  if(v) { v->Create(9); v->Fill(-1,1);  }
-  mreal x,y;
-  for(i=0;i<n;i++)  for(j=0;j<m;j++)
-  {
-    x = i/(n-1.); y = j/(m-1.); i0 = i+n*j;
-    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);
-    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);
-  }
-}
-@end verbatim
-or using C functions
-@verbatim
-void mgls_prepare2d(HMDT a, HMDT b=0, HMDT v=0)
-{
-  register long i,j,n=50,m=40,i0;
-  if(a) mgl_data_create(a,n,m,1);
-  if(b) mgl_data_create(b,n,m,1);
-  if(v) { mgl_data_create(v,9,1,1); mgl_data_fill(v,-1,1,'x');  }
-  mreal x,y;
-  for(i=0;i<n;i++)  for(j=0;j<m;j++)
-  {
-    x = i/(n-1.); y = j/(m-1.); i0 = i+n*j;
-    if(a) mgl_data_set_value(a, 0.6*sin(2*M_PI*x)*sin(3*M_PI*y)+0.4*cos(3*M_PI*x*y), i,j,0);
-    if(b) mgl_data_set_value(b, 0.6*cos(2*M_PI*x)*cos(3*M_PI*y)+0.4*cos(3*M_PI*x*y), i,j,0);
-  }
-}
-@end verbatim
-
-@menu
-* Surf sample::
-* SurfC sample::
-* SurfA sample::
-* SurfCA sample::
-* Mesh sample::
-* Fall sample::
-* Belt sample::
-* Boxs sample::
-* Tile sample::
-* TileS sample::
-* Dens sample::
-* Cont sample::
-* ContF sample::
-* ContD sample::
-* ContV sample::
-* Axial sample::
-* Grad sample::
-@end menu
-
-@c ------------------------------------------------------------------
-@external{}
-@node Surf sample, SurfC sample, , 2D samples
-@subsection Surf sample
-@nav{}
-
-Function @ref{surf} is most standard way to visualize 2D data array. @code{Surf} use color scheme for coloring (see @ref{Color scheme}). You can use @samp{#} style for drawing black meshes on the surface. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a;  mgls_prepare2d(&a);
-  gr->SubPlot(2,2,0); gr->Title("Surf plot (default)");
-  gr->Light(true);  gr->Rotate(50,60);  gr->Box();  gr->Surf(a);
-
-  gr->SubPlot(2,2,1); gr->Title("'\\#' style; meshnum 10");
-  gr->Rotate(50,60);  gr->Box();  gr->Surf(a,"#","meshnum 10");
-
-  gr->SubPlot(2,2,2); gr->Title("'.' style");
-  gr->Rotate(50,60);  gr->Box();  gr->Surf(a,".");
-
-  gr->SubPlot(2,2,3); gr->Title("parametric form");
-  mglData x(50,40),y(50,40),z(50,40);
-  gr->Fill(x,"0.8*sin(pi*x)*sin(pi*(y+1)/2)");
-  gr->Fill(y,"0.8*cos(pi*x)*sin(pi*(y+1)/2)");
-  gr->Fill(z,"0.8*cos(pi*(y+1)/2)");
-  gr->Rotate(50,60);  gr->Box();  gr->Surf(x,y,z,"BbwrR");
-  return 0;
-}
-@end verbatim
-
-@pfig{surf, Example of Surf()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node SurfC sample, SurfA sample, Surf sample, 2D samples
-@subsection SurfC sample
-@nav{}
-
-Function @ref{surfc} is similar to @ref{surf} but its coloring is determined by another data. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a,b;  mgls_prepare2d(&a,&b);
-  gr->Title("SurfC plot");  gr->Rotate(50,60);
-  gr->Light(true);  gr->Box();  gr->SurfC(a,b);
-  return 0;
-}
-@end verbatim
-
-@pfig{surfc, Example of SurfC()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node SurfA sample, SurfCA sample, SurfC sample, 2D samples
-@subsection SurfA sample
-@nav{}
-
-Function @ref{surfa} is similar to @ref{surf} but its transparency is determined by another data. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a,b;  mgls_prepare2d(&a,&b);
-  gr->Title("SurfA plot");  gr->Rotate(50,60);
-  gr->Alpha(true);  gr->Light(true);
-  gr->Box();  gr->SurfA(a,b);
-  return 0;
-}
-@end verbatim
-
-@pfig{surfa, Example of SurfA()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node SurfCA sample, Mesh sample, SurfA sample, 2D samples
-@subsection SurfCA sample
-@nav{}
-
-Function @ref{surfca} is similar to @ref{surf} but its color and transparency is determined by another data. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a,b;  mgls_prepare2d(&a,&b);
-  gr->Title("SurfCA plot");  gr->Rotate(50,60);
-  gr->Alpha(true);  gr->Light(true);
-  gr->Box();  gr->SurfCA(a,b,a);
-  return 0;
-}
-@end verbatim
-
-@pfig{surfca, Example of SurfCA()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Mesh sample, Fall sample, SurfCA sample, 2D samples
-@subsection Mesh sample
-@nav{}
-
-Function @ref{mesh} draw wired surface. You can use @ref{meshnum} for changing number of lines to be drawn. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a;  mgls_prepare2d(&a);
-  gr->Title("Mesh plot"); gr->Rotate(50,60);
-  gr->Box();  gr->Mesh(a);
-  return 0;
-}
-@end verbatim
-
-@pfig{mesh, Example of Mesh()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Fall sample, Belt sample, Mesh sample, 2D samples
-@subsection Fall sample
-@nav{}
-
-Function @ref{fall} draw waterfall surface. You can use @ref{meshnum} for changing number of lines to be drawn. Also you can use @samp{x} style for drawing lines in other direction. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a;  mgls_prepare2d(&a);
-  gr->Title("Fall plot"); gr->Rotate(50,60);
-  gr->Box();  gr->Fall(a);
-  return 0;
-}
-@end verbatim
-
-@pfig{fall, Example of Fall()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Belt sample, Boxs sample, Fall sample, 2D samples
-@subsection Belt sample
-@nav{}
-
-Function @ref{belt} draw surface by belts. You can use @samp{x} style for drawing lines in other direction. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a;  mgls_prepare2d(&a);
-  gr->Title("Belt plot"); gr->Rotate(50,60);
-  gr->Box();  gr->Belt(a);
-  return 0;
-}
-@end verbatim
-
-@pfig{belt, Example of Belt()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Boxs sample, Tile sample, Belt sample, 2D samples
-@subsection Boxs sample
-@nav{}
-
-Function @ref{boxs} draw surface by boxes. You can use @samp{#} for drawing wire plot. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a;  mgls_prepare2d(&a);
-  gr->SetOrigin(0,0,0); gr->Light(true);
-  gr->SubPlot(2,2,0);  gr->Title("Boxs plot (default)");
-  gr->Rotate(40,60);  gr->Box();  gr->Boxs(a);
-
-  gr->SubPlot(2,2,1); gr->Title("'\\@' style");
-  gr->Rotate(50,60);  gr->Box();  gr->Boxs(a,"@");
-
-  gr->SubPlot(2,2,2); gr->Title("'\\#' style");
-  gr->Rotate(50,60);  gr->Box();  gr->Boxs(a,"#");
-
-  gr->SubPlot(2,2,3); gr->Title("compare with Tile");
-  gr->Rotate(50,60);  gr->Box();  gr->Tile(a);
-  return 0;
-}
-@end verbatim
-
-@pfig{boxs, Example of Boxs()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Tile sample, TileS sample, Boxs sample, 2D samples
-@subsection Tile sample
-@nav{}
-
-Function @ref{tile} draw surface by tiles. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a;  mgls_prepare2d(&a);
-  gr->Title("Tile plot");
-  gr->Rotate(40,60);  gr->Box();  gr->Tile(a);
-  return 0;
-}
-@end verbatim
-
-@pfig{tile, Example of Tile()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node TileS sample, Dens sample, Tile sample, 2D samples
-@subsection TileS sample
-@nav{}
-
-Function @ref{tiles} is similar to @ref{tile} but tile sizes is determined by another data. This allows one to simulate transparency of the plot. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a,b;  mgls_prepare2d(&a,&b);
-  gr->SubPlot(1,1,0,""); gr->Title("TileS plot");
-  gr->Box();  gr->TileS(a,b);
-  return 0;
-}
-@end verbatim
-
-@pfig{tiles, Example of TileS()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Dens sample, Cont sample, TileS sample, 2D samples
-@subsection Dens sample
-@nav{}
-
-Function @ref{dens} draw density plot for surface. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a,a1(30,40,3);  mgls_prepare2d(&a);
-  gr->Fill(a1,"0.6*sin(2*pi*x+pi*(z+1)/2)*sin(3*pi*y+pi*z) + 0.4*cos(3*pi*(x*y)+pi*(z+1)^2/2)");
-  gr->SubPlot(2,2,0,""); gr->Title("Dens plot (default)");
-  gr->Box();  gr->Dens(a);
-
-  gr->SubPlot(2,2,1); gr->Title("3d variant");
-  gr->Rotate(50,60);  gr->Box();  gr->Dens(a);
-
-  gr->SubPlot(2,2,2,"");  gr->Title("'\\#' style; meshnum 10");
-  gr->Box();  gr->Dens(a,"#","meshnum 10");
-
-  gr->SubPlot(2,2,3); gr->Title("several slices");
-  gr->Rotate(50,60);    gr->Box();  gr->Dens(a1);
-  return 0;
-}
-@end verbatim
-
-@pfig{dens, Example of Dens()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Cont sample, ContF sample, Dens sample, 2D samples
-@subsection Cont sample
-@nav{}
-
-Function @ref{cont} draw contour lines for surface. You can select automatic (default) or manual levels for contours, print contour labels, draw it on the surface (default) or at plane (as @code{Dens}). The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a,v(5); mgls_prepare2d(&a); v.a[0]=-0.5;  v.a[1]=-0.15; v.a[2]=0; v.a[3]=0.15;  v.a[4]=0.5;
-  gr->SubPlot(2,2,0); gr->Title("Cont plot (default)");
-  gr->Rotate(50,60);  gr->Box();  gr->Cont(a);
-
-  gr->SubPlot(2,2,1); gr->Title("manual levels");
-  gr->Rotate(50,60);  gr->Box();  gr->Cont(v,a);
-
-  gr->SubPlot(2,2,2); gr->Title("'\\_' style");
-  gr->Rotate(50,60);  gr->Box();  gr->Cont(a,"_");
-
-  gr->SubPlot(2,2,3,"");  gr->Title("'t' style");
-  gr->Box();  gr->Cont(a,"t");
-  return 0;
-}
-@end verbatim
-
-@pfig{cont, Example of Cont()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node ContF sample, ContD sample, Cont sample, 2D samples
-@subsection ContF sample
-@nav{}
-
-Function @ref{contf} draw filled contours.  You can select automatic (default) or manual levels for contours. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a,v(5),a1(30,40,3); mgls_prepare2d(&a); v.a[0]=-0.5;
-  v.a[1]=-0.15; v.a[2]=0; v.a[3]=0.15;  v.a[4]=0.5;
-  gr->SubPlot(2,2,0); gr->Title("ContF plot (default)");
-  gr->Rotate(50,60);  gr->Box();  gr->ContF(a);
-
-  gr->SubPlot(2,2,1); gr->Title("manual levels");
-  gr->Rotate(50,60);  gr->Box();  gr->ContF(v,a);
-
-  gr->SubPlot(2,2,2); gr->Title("'\\_' style");
-  gr->Rotate(50,60);  gr->Box();  gr->ContF(a,"_");
-
-  gr->Fill(a1,"0.6*sin(2*pi*x+pi*(z+1)/2)*sin(3*pi*y+pi*z) +
-               0.4*cos(3*pi*(x*y)+pi*(z+1)^2/2)");
-  gr->SubPlot(2,2,3); gr->Title("several slices");
-  gr->Rotate(50,60);  gr->Box();  gr->ContF(a1);
-  return 0;
-}
-@end verbatim
-
-@pfig{contf, Example of ContF()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node ContD sample, ContV sample, ContF sample, 2D samples
-@subsection ContD sample
-@nav{}
-
-Function @ref{contd} is similar to @code{ContF} but with manual contour colors. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a,v(5),a1(30,40,3); mgls_prepare2d(&a); v.a[0]=-0.5;
-  v.a[1]=-0.15; v.a[2]=0; v.a[3]=0.15;  v.a[4]=0.5;
-  gr->SubPlot(2,2,0); gr->Title("ContD plot (default)");
-  gr->Rotate(50,60);  gr->Box();  gr->ContD(a);
-
-  gr->SubPlot(2,2,1); gr->Title("manual levels");
-  gr->Rotate(50,60);  gr->Box();  gr->ContD(v,a);
-
-  gr->SubPlot(2,2,2); gr->Title("'\\_' style");
-  gr->Rotate(50,60);  gr->Box();  gr->ContD(a,"_");
-
-  gr->Fill(a1,"0.6*sin(2*pi*x+pi*(z+1)/2)*sin(3*pi*y+pi*z) + 0.4*cos(3*pi*(x*y)+pi*(z+1)^2/2)");
-  gr->SubPlot(2,2,3); gr->Title("several slices");
-  gr->Rotate(50,60);  gr->Box();  gr->ContD(a1);
-  return 0;
-}
-@end verbatim
-
-@pfig{contd, Example of ContD()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node ContV sample, Axial sample, ContD sample, 2D samples
-@subsection ContV sample
-@nav{}
-
-Function @ref{contv} draw vertical cylinders (belts) at contour lines. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a,v(5); mgls_prepare2d(&a); v.a[0]=-0.5;
-  v.a[1]=-0.15; v.a[2]=0; v.a[3]=0.15;  v.a[4]=0.5;
-  gr->SubPlot(2,2,0); gr->Title("ContV plot (default)");
-  gr->Rotate(50,60);  gr->Box();  gr->ContV(a);
-
-  gr->SubPlot(2,2,1); gr->Title("manual levels");
-  gr->Rotate(50,60);  gr->Box();  gr->ContV(v,a);
-
-  gr->SubPlot(2,2,2); gr->Title("'\\_' style");
-  gr->Rotate(50,60);  gr->Box();  gr->ContV(a,"_");
-
-  gr->SubPlot(2,2,3); gr->Title("ContV and ContF");
-  gr->Rotate(50,60);  gr->Box();  gr->Light(true);
-  gr->ContV(a); gr->ContF(a); gr->Cont(a,"k");
-  return 0;
-}
-@end verbatim
-
-@pfig{contv, Example of ContV()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Axial sample, Grad sample, ContV sample, 2D samples
-@subsection Axial sample
-@nav{}
-
-Function @ref{axial} draw surfaces of rotation for contour lines. You can draw wire surfaces (@samp{#} style) or ones rotated in other directions (@samp{x}, @samp{z} styles). The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a;  mgls_prepare2d(&a);
-  gr->SubPlot(2,2,0); gr->Title("Axial plot (default)");
-  gr->Light(true);  gr->Alpha(true);  gr->Rotate(50,60);
-  gr->Box();  gr->Axial(a);
-
-  gr->SubPlot(2,2,1); gr->Title("'x' style;'.' style"); gr->Rotate(50,60);
-  gr->Box();  gr->Axial(a,"x.");
-
-  gr->SubPlot(2,2,2); gr->Title("'z' style"); gr->Rotate(50,60);
-  gr->Box();  gr->Axial(a,"z");
-
-  gr->SubPlot(2,2,3); gr->Title("'\\#' style"); gr->Rotate(50,60);
-  gr->Box();  gr->Axial(a,"#");
-  return 0;
-}
-@end verbatim
-
-@pfig{axial, Example of Axial()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Grad sample, , Axial sample, 2D samples
-@subsection Grad sample
-@nav{}
-
-Function @ref{grad} draw gradient lines for matrix. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a;  mgls_prepare2d(&a);
-  gr->SubPlot(1,1,0,""); gr->Title("Grad plot");
-  gr->Box();  gr->Grad(a);  gr->Dens(a,"{u8}w{q8}");
-  return 0;
-}
-@end verbatim
-
-@pfig{grad, Example of Grad()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node 3D samples, Vector field samples, 2D samples, Examples
-@section 3D samples
-@nav{}
-
-This section is devoted to visualization of 3D data arrays. 3D means the data which depend on 3 indexes (parameters) like tensor a(i,j,k)=a(x(i),y(j),x(k)), i=1...n, j=1...m, k=1...l or in parametric form @{x(i,j,k),y(i,j,k),z(i,j,k),a(i,j,k)@}. Most of samples will use the same data for plotting. So, I put its initialization in separate function
-@verbatim
-void mgls_prepare3d(mglData *a, mglData *b=0)
-{
-  register long i,j,k,n=61,m=50,l=40,i0;
-  if(a) a->Create(n,m,l);   if(b) b->Create(n,m,l);
-  mreal x,y,z;
-  for(i=0;i<n;i++)  for(j=0;j<m;j++)  for(k=0;k<l;k++)
-  {
-    x=2*i/(n-1.)-1; y=2*j/(m-1.)-1; z=2*k/(l-1.)-1; i0 = i+n*(j+m*k);
-    if(a) a->a[i0] = -2*(x*x + y*y + z*z*z*z - z*z - 0.1);
-    if(b) b->a[i0] = 1-2*tanh((x+y)*(x+y));
-  }
-}
-@end verbatim
-or using C functions
-@verbatim
-void mgls_prepare3d(HMDT a, HMDT b=0)
-{
-  register long i,j,k,n=61,m=50,l=40,i0;
-  if(a) mgl_data_create(a,n,m,l);
-  if(b) mgl_data_create(b,n,m,l);
-  mreal x,y,z;
-  for(i=0;i<n;i++)  for(j=0;j<m;j++)  for(k=0;k<l;k++)
-  {
-    x=2*i/(n-1.)-1; y=2*j/(m-1.)-1; z=2*k/(l-1.)-1; i0 = i+n*(j+m*k);
-    if(a) mgl_data_set_value(a, -2*(x*x + y*y + z*z*z*z - z*z - 0.1), i,j,k);
-    if(b) mgl_data_set_value(b, 1-2*tanh((x+y)*(x+y)), i,j,k);
-  }
-}
-@end verbatim
-
-@menu
-* Surf3 sample::
-* Surf3C sample::
-* Surf3A sample::
-* Surf3CA sample::
-* Cloud sample::
-* Dens3 sample::
-* Cont3 sample::
-* ContF3 sample::
-* Dens projection sample::
-* Cont projection sample::
-* ContF projection sample::
-* TriPlot and QuadPlot::
-* Dots sample::
-* IFS sample::
-@end menu
-
-@c ------------------------------------------------------------------
-@external{}
-@node Surf3 sample, Surf3C sample, , 3D samples
-@subsection Surf3 sample
-@nav{}
-
-Function @ref{surf3} is one of most suitable (for my opinion) functions to visualize 3D data. It draw the isosurface(s) -- surface(s) of constant amplitude (3D analogue of contour lines). You can draw wired isosurfaces if specify @samp{#} style. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData c;  mgls_prepare3d(&c);
-  gr->Light(true);    gr->Alpha(true);
-  gr->SubPlot(2,2,0); gr->Title("Surf3 plot (default)");
-  gr->Rotate(50,60);  gr->Box();  gr->Surf3(c);
-
-  gr->SubPlot(2,2,1); gr->Title("'\\#' style");
-  gr->Rotate(50,60);  gr->Box();  gr->Surf3(c,"#");
-
-  gr->SubPlot(2,2,2); gr->Title("'.' style");
-  gr->Rotate(50,60);  gr->Box();  gr->Surf3(c,".");
-  return 0;
-}
-@end verbatim
-
-@pfig{surf3, Example of Surf3()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Surf3C sample, Surf3A sample, Surf3 sample, 3D samples
-@subsection Surf3C sample
-@nav{}
-
-Function @ref{surf3c} is similar to @ref{surf3} but its coloring is determined by another data. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData c,d;  mgls_prepare3d(&c,&d);
-  gr->Title("Surf3C plot"); gr->Rotate(50,60);
-  gr->Light(true);  gr->Alpha(true);
-  gr->Box();  gr->Surf3C(c,d);
-  return 0;
-}
-@end verbatim
-
-@pfig{surf3c, Example of Surf3C()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Surf3A sample, Surf3CA sample, Surf3C sample, 3D samples
-@subsection Surf3A sample
-@nav{}
-
-Function @ref{surf3a} is similar to @ref{surf3} but its transparency is determined by another data. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData c,d;  mgls_prepare3d(&c,&d);
-  gr->Title("Surf3A plot"); gr->Rotate(50,60);
-  gr->Light(true);  gr->Alpha(true);
-  gr->Box();  gr->Surf3A(c,d);
-  return 0;
-}
-@end verbatim
-
-@pfig{surf3a, Example of Surf3A()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Surf3CA sample, Cloud sample, Surf3A sample, 3D samples
-@subsection Surf3CA sample
-@nav{}
-
-Function @ref{surf3ca} is similar to @ref{surf3} but its color and transparency is determined by another data. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData c,d;  mgls_prepare3d(&c,&d);
-  gr->Title("Surf3CA plot"); gr->Rotate(50,60);
-  gr->Light(true);  gr->Alpha(true);
-  gr->Box();  gr->Surf3CA(c,d,c);
-  return 0;
-}
-@end verbatim
-
-@pfig{surf3ca, Example of Surf3CA()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Cloud sample, Dens3 sample, Surf3CA sample, 3D samples
-@subsection Cloud sample
-@nav{}
-
-Function @ref{cloud} draw cloud-like object which is less transparent for higher data values. Similar plot can be created using many (about 10-20) @code{Surf3A(a,a)} isosurfaces. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData c;  mgls_prepare3d(&c);
-  gr->SubPlot(2,2,0); gr->Title("Cloud plot");
-  gr->Rotate(50,60);  gr->Alpha(true);
-  gr->Box();  gr->Cloud(c,"wyrRk");
-
-  gr->SubPlot(2,2,1); gr->Title("'i' style");
-  gr->Rotate(50,60);  gr->Box();  gr->Cloud(c,"iwyrRk");
-
-  gr->SubPlot(2,2,2); gr->Title("'.' style");
-  gr->Rotate(50,60);  gr->Box();  gr->Cloud(c,".wyrRk");
-
-  gr->SubPlot(2,2,3); gr->Title("meshnum 10");
-  gr->Rotate(50,60);  gr->Box();  gr->Cloud(c,"wyrRk","meshnum 10");
-  return 0;
-}
-@end verbatim
-
-@pfig{cloud, Example of Cloud()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Dens3 sample, Cont3 sample, Cloud sample, 3D samples
-@subsection Dens3 sample
-@nav{}
-
-Function @ref{dens3} draw just usual density plot but at slices of 3D data. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData c;  mgls_prepare3d(&c);
-  gr->Title("Dens3 sample");  gr->Rotate(50,60);
-  gr->Alpha(true);  gr->SetAlphaDef(0.7);
-  gr->SetOrigin(0,0,0); gr->Axis("_xyz"); gr->Box();
-  gr->Dens3(c,"x"); gr->Dens3(c); gr->Dens3(c,"z");
-  return 0;
-}
-@end verbatim
-
-@pfig{densa, Example of Dens3()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Cont3 sample, ContF3 sample, Dens3 sample, 3D samples
-@subsection Cont3 sample
-@nav{}
-
-Function @ref{cont3} draw just usual contour lines but at slices of 3D data. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData c;  mgls_prepare3d(&c);
-  gr->Title("Cont3 sample");  gr->Rotate(50,60);
-  gr->Alpha(true);  gr->SetAlphaDef(0.7);
-  gr->SetOrigin(0,0,0); gr->Axis("_xyz"); gr->Box();
-  gr->Cont3(c,"x"); gr->Cont3(c); gr->Cont3(c,"z");
-  return 0;
-}
-@end verbatim
-
-@pfig{conta, Example of Cont3()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node ContF3 sample, Dens projection sample, Cont3 sample, 3D samples
-@subsection ContF3 sample
-@nav{}
-
-Function @ref{contf3} draw just usual filled contours but at slices of 3D data. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData c;  mgls_prepare3d(&c);
-  gr->Title("ContF3 sample");  gr->Rotate(50,60);
-  gr->Alpha(true);  gr->SetAlphaDef(0.7);
-  gr->SetOrigin(0,0,0); gr->Axis("_xyz"); gr->Box();
-  gr->ContF3(c,"x");  gr->ContF3(c);    gr->ContF3(c,"z");
-  gr->Cont3(c,"kx");  gr->Cont3(c,"k"); gr->Cont3(c,"kz");
-  return 0;
-}
-@end verbatim
-
-@pfig{contfa, Example of ContF3()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Dens projection sample, Cont projection sample, ContF3 sample, 3D samples
-@subsection Dens projection sample
-@nav{}
-
-Functions @ref{densz}, @ref{densy}, @ref{densx} draw density plot on plane perpendicular to corresponding axis. One of possible application is drawing projections of 3D field. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData c;  mgls_prepare3d(&c);
-  gr->Title("Dens[XYZ] sample");  gr->Rotate(50,60);
-  gr->Box();  gr->DensX(c.Sum("x"),0,-1);
-  gr->DensY(c.Sum("y"),0,1);  gr->DensZ(c.Sum("z"),0,-1);
-  return 0;
-}
-@end verbatim
-
-@pfig{dens_xyz, Example of DensX() DensY() DensZ()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Cont projection sample, ContF projection sample, Dens projection sample, 3D samples
-@subsection Cont projection sample
-@nav{}
-
-Functions @ref{contz}, @ref{conty}, @ref{contx} draw contour lines on plane perpendicular to corresponding axis. One of possible application is drawing projections of 3D field. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData c;  mgls_prepare3d(&c);
-  gr->Title("Cont[XYZ] sample");  gr->Rotate(50,60);
-  gr->Box();  gr->ContX(c.Sum("x"),"",-1);
-  gr->ContY(c.Sum("y"),"",1); gr->ContZ(c.Sum("z"),"",-1);
-  return 0;
-}
-@end verbatim
-
-@pfig{cont_xyz, Example of ContX() ContY() ContZ()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node ContF projection sample, TriPlot and QuadPlot, Cont projection sample, 3D samples
-@subsection ContF projection sample
-@nav{}
-
-Functions @ref{contfz}, @ref{contfy}, @ref{contfx}, draw filled contours on plane perpendicular to corresponding axis. One of possible application is drawing projections of 3D field. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData c;  mgls_prepare3d(&c);
-  gr->Title("Cont[XYZ] sample");  gr->Rotate(50,60);
-  gr->Box();  gr->ContFX(c.Sum("x"),"",-1);
-  gr->ContFY(c.Sum("y"),"",1);  gr->ContFZ(c.Sum("z"),"",-1);
-  return 0;
-}
-@end verbatim
-
-@pfig{contf_xyz, Example of ContFX() ContFY() ContFZ()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node TriPlot and QuadPlot, Dots sample, ContF projection sample, 3D samples
-@subsection TriPlot and QuadPlot
-@nav{}
-
-Function @ref{triplot} and @ref{quadplot} draw set of triangles (or quadrangles for @code{QuadPlot}) for irregular data arrays. Note, that you have to provide not only vertexes, but also the indexes of triangles or quadrangles. I.e. perform triangulation by some other library. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mreal q[] = {0,1,2,3, 4,5,6,7, 0,2,4,6, 1,3,5,7, 0,4,1,5, 2,6,3,7};
-  mreal xc[] = {-1,1,-1,1,-1,1,-1,1}, yc[] = {-1,-1,1,1,-1,-1,1,1}, zc[] = {-1,-1,-1,-1,1,1,1,1};
-  mglData qq(6,4,q), xx(8,xc), yy(8,yc), zz(8,zc);
-  gr->Light(true);  //gr->Alpha(true);
-  gr->SubPlot(2,2,0); gr->Title("QuadPlot sample"); gr->Rotate(50,60);
-  gr->QuadPlot(qq,xx,yy,zz,"yr");
-  gr->QuadPlot(qq,xx,yy,zz,"k#");
-  gr->SubPlot(2,2,2); gr->Title("QuadPlot coloring"); gr->Rotate(50,60);
-  gr->QuadPlot(qq,xx,yy,zz,yy,"yr");
-  gr->QuadPlot(qq,xx,yy,zz,"k#");
-
-  mreal t[] = {0,1,2, 0,1,3, 0,2,3, 1,2,3};
-  mreal xt[] = {-1,1,0,0}, yt[] = {-1,-1,1,0}, zt[] = {-1,-1,-1,1};
-  mglData tt(4,3,t), uu(4,xt), vv(4,yt), ww(4,zt);
-  gr->SubPlot(2,2,1); gr->Title("TriPlot sample");  gr->Rotate(50,60);
-  gr->TriPlot(tt,uu,vv,ww,"b");
-  gr->TriPlot(tt,uu,vv,ww,"k#");
-  gr->SubPlot(2,2,3); gr->Title("TriPlot coloring");  gr->Rotate(50,60);
-  gr->TriPlot(tt,uu,vv,ww,vv,"cb");
-  gr->TriPlot(tt,uu,vv,ww,"k#");
-  gr->TriCont(tt,uu,vv,ww,"B");
-  return 0;
-}
-@end verbatim
-
-@pfig{triplot, Example of TriPlot() and QuadPlot()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Dots sample, IFS sample, TriPlot and QuadPlot, 3D samples
-@subsection Dots sample
-@nav{}
-
-Function @ref{dots} is another way to draw irregular points. @code{Dots} use color scheme for coloring (see @ref{Color scheme}). The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  int i, n=2000;
-  mglData x(n),y(n),z(n),c(n);
-  for(i=0;i<n;i++)
-  {
-    mreal t=M_PI*(mgl_rnd()-0.5), f=2*M_PI*mgl_rnd();
-    x.a[i] = 0.9*cos(t)*cos(f);
-    y.a[i] = 0.9*cos(t)*sin(f);
-    z.a[i] = 0.6*sin(t);
-    c.a[i] = cos(2*t);
-  }
-  gr->SubPlot(2,2,0); gr->Title("Dots sample");  gr->Rotate(50,60);
-  gr->Box();  gr->Dots(x,y,z);
-  gr->Alpha(true);
-  gr->SubPlot(2,2,1); gr->Title("add transparency"); gr->Rotate(50,60);
-  gr->Box();  gr->Dots(x,y,z,c);
-  gr->SubPlot(2,2,2); gr->Title("add coloring"); gr->Rotate(50,60);
-  gr->Box();  gr->Dots(x,y,z,x,c);
-  gr->SubPlot(2,2,3); gr->Title("Only coloring");gr->Rotate(50,60);
-  gr->Box();  gr->Tens(x,y,z,x," .");
-  return 0;
-}
-@end verbatim
-
-@pfig{dots, Example of Dots()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node IFS sample, , Dots sample, 3D samples
-@subsection IFS 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:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData A;
-  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);
-  mglData f(mglIFS2d(A,100000));
-  gr->SubPlot(1,1,0,"<_");
-  gr->Title("IFS 2d sample");
-  gr->SetRanges(f.SubData(0), f.SubData(1));
-  gr->Axis(); gr->Plot(f.SubData(0), f.SubData(1),"r#o ","size 0.05");
-}
-@end verbatim
-
-@pfig{ifs2d, Example of IFS fractal (2d case).}
-
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData A;
-  A.SetList(52, 0.,0.,0.,0.,.18,0.,0.,0.,0.,0.,0.,0.,.01, .85,0.,0.,0.,.85,.1,0.,-0.1,0.85,0.,1.6,0.,.85,
-                .2,-.2,0.,.2,.2,0.,0.,0.,0.3,0.,0.8,0.,.07, -.2,.2,0.,.2,.2,0.,0.,0.,0.3,0.,0.8,0.,.07);
-  A.Rearrange(13);
-  mglData f(mglIFS3d(A,100000));
-  gr->Title("IFS 3d sample");
-  gr->SetRanges(f.SubData(0), f.SubData(1), f.SubData(2));
-  gr->Rotate(50,60);  gr->Axis(); gr->Box();
-  gr->Dots(f.SubData(0), f.SubData(1), f.SubData(2),"G#o","size 0.05");
-}
-@end verbatim
-
-@pfig{ifs3d, Example of IFS fractal (3d case).}
-
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Vector field samples, Hints, 3D samples, Examples
-@section Vector field samples
-@nav{}
-
-Vector field visualization (especially in 3d case) is more or less complex task. MathGL provides 3 general types of plots: vector field itself (@code{Vect}), flow threads (@code{Flow}), and flow pipes with radius proportional to field amplitude (@code{Pipe}).
-
-However, the plot may look tangly -- there are too many overlapping lines. I may suggest 2 ways to solve this problem. The first one is to change @code{SetMeshNum} for decreasing the number of hachures. The second way is to use the flow thread chart @code{Flow}, or possible many flow thread from manual position (@code{FlowP}). Unfortunately, I don't know any other methods to visualize 3d vector field. If you know any, e-mail me and I shall add it to MathGL.
-
-Most of samples will use the same data for plotting. So, I put its initialization in separate function
-@verbatim
-void mgls_prepare2v(mglData *a, mglData *b)
-{
-  register long i,j,n=20,m=30,i0;
-  if(a) a->Create(n,m);   if(b) b->Create(n,m);
-  mreal x,y;
-  for(i=0;i<n;i++)  for(j=0;j<m;j++)
-  {
-    x=i/(n-1.); y=j/(m-1.); i0 = i+n*j;
-    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);
-    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);
-  }
-}
-void mgls_prepare3v(mglData *ex, mglData *ey, mglData *ez)
-{
-  register long i,j,k,n=10,i0;
-  if(!ex || !ey || !ez) return;
-  ex->Create(n,n,n);  ey->Create(n,n,n);  ez->Create(n,n,n);
-  mreal x,y,z, r1,r2;
-  for(i=0;i<n;i++)  for(j=0;j<n;j++)  for(k=0;k<n;k++)
-  {
-    x=2*i/(n-1.)-1; y=2*j/(n-1.)-1; z=2*k/(n-1.)-1; i0 = i+n*(j+k*n);
-    r1 = pow(x*x+y*y+(z-0.3)*(z-0.3)+0.03,1.5);
-    r2 = pow(x*x+y*y+(z+0.3)*(z+0.3)+0.03,1.5);
-    ex->a[i0]=0.2*x/r1 - 0.2*x/r2;
-    ey->a[i0]=0.2*y/r1 - 0.2*y/r2;
-    ez->a[i0]=0.2*(z-0.3)/r1 - 0.2*(z+0.3)/r2;
-  }
-}
-@end verbatim
-or using C functions
-@verbatim
-void mgls_prepare2v(HMDT a, HMDT b)
-{
-  register long i,j,n=20,m=30,i0;
-  if(a) mgl_data_create(a,n,m,1);
-  if(b) mgl_data_create(b,n,m,1);
-  mreal x,y;
-  for(i=0;i<n;i++)  for(j=0;j<m;j++)
-  {
-    x=i/(n-1.); y=j/(m-1.); i0 = i+n*j;
-    if(a) mgl_data_set_value(a, 0.6*sin(2*M_PI*x)*sin(3*M_PI*y)+0.4*cos(3*M_PI*x*y), i,j,0);
-    if(b) mgl_data_set_value(b, 0.6*cos(2*M_PI*x)*cos(3*M_PI*y)+0.4*cos(3*M_PI*x*y), i,j,0);
-  }
-}
-void mgls_prepare3v(HMDT ex, HMDT ey, HMDT ez)
-{
-  register long i,j,k,n=10,i0;
-  if(!ex || !ey || !ez) return;
-  mgl_data_create(ex,n,n,n);
-  mgl_data_create(ey,n,n,n);
-  mgl_data_create(ez,n,n,n);
-  mreal x,y,z, r1,r2;
-  for(i=0;i<n;i++)  for(j=0;j<n;j++)  for(k=0;k<n;k++)
-  {
-    x=2*i/(n-1.)-1; y=2*j/(n-1.)-1; z=2*k/(n-1.)-1; i0 = i+n*(j+k*n);
-    r1 = pow(x*x+y*y+(z-0.3)*(z-0.3)+0.03,1.5);
-    r2 = pow(x*x+y*y+(z+0.3)*(z+0.3)+0.03,1.5);
-    mgl_data_set_value(ex, 0.2*x/r1 - 0.2*x/r2, i,j,k);
-    mgl_data_set_value(ey, 0.2*y/r1 - 0.2*y/r2, i,j,k);
-    mgl_data_set_value(ez, 0.2*(z-0.3)/r1 - 0.2*(z+0.3)/r2, i,j,k);
-  }
-}
-@end verbatim
-
-@menu
-* Vect sample::
-* Vect3 sample::
-* Traj sample::
-* Flow sample::
-* Pipe sample::
-* Dew sample::
-@end menu
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Vect sample, Vect3 sample, , Vector field samples
-@subsection Vect sample
-@nav{}
-
-Function @ref{vect} is most standard way to visualize vector fields -- it draw a lot of arrows or hachures for each data cell. It have a lot of options which can be seen on the figure (and in the sample code). @code{Vect} use color scheme for coloring (see @ref{Color scheme}). The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a,b;  mgls_prepare2v(&a,&b);
-  gr->SubPlot(3,2,0,""); gr->Title("Vect plot (default)");
-  gr->Box();  gr->Vect(a,b);
-
-  gr->SubPlot(3,2,1,"");  gr->Title("'.' style; '=' style");
-  gr->Box();  gr->Vect(a,b,"=.");
-
-  gr->SubPlot(3,2,2,"");  gr->Title("'f' style");
-  gr->Box();  gr->Vect(a,b,"f");
-
-  gr->SubPlot(3,2,3,"");  gr->Title("'>' style");
-  gr->Box();  gr->Vect(a,b,">");
-
-  gr->SubPlot(3,2,4,"");  gr->Title("'<' style");
-  gr->Box();  gr->Vect(a,b,"<");
-
-  mglData ex,ey,ez; mgls_prepare3v(&ex,&ey,&ez);
-  gr->SubPlot(3,2,5); gr->Title("3d variant");  gr->Rotate(50,60);
-  gr->Box();  gr->Vect(ex,ey,ez);
-  return 0;
-}
-@end verbatim
-
-@pfig{vect, Example of Vect()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Vect3 sample, Traj sample, Vect sample, Vector field samples
-@subsection Vect3 sample
-@nav{}
-
-Function @ref{vect3} draw just usual vector field plot but at slices of 3D data. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData ex,ey,ez; mgls_prepare3v(&ex,&ey,&ez);
-  gr->SubPlot(2,1,0); gr->Title("Vect3 sample");    gr->SetOrigin(0,0,0);
-  gr->Rotate(50,60);    gr->Axis("_xyz");   gr->Box();
-  gr->Vect3(ex,ey,ez,"x");  gr->Vect3(ex,ey,ez);    gr->Vect3(ex,ey,ez,"z");
-
-  gr->SubPlot(2,1,1);   gr->Title("'f' style");
-  gr->Rotate(50,60);    gr->Axis("_xyz");   gr->Box();
-  gr->Vect3(ex,ey,ez,"fx"); gr->Vect3(ex,ey,ez,"f");gr->Vect3(ex,ey,ez,"fz");
-  gr->Grid3(ex,"Wx");   gr->Grid3(ex,"W");  gr->Grid3(ex,"Wz");
-  return 0;
-}
-@end verbatim
-
-@pfig{vecta, Example of Vect3()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Traj sample, Flow sample, Vect3 sample, Vector field samples
-@subsection Traj sample
-@nav{}
-
-Function @ref{traj} is 1D analogue of @code{Vect}. It draw vectors from specified points. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData x,y,y1,y2;  mgls_prepare1d(&y,&y1,&y2,&x);
-  gr->SubPlot(1,1,0,""); gr->Title("Traj plot");
-  gr->Box();  gr->Plot(x,y);  gr->Traj(x,y,y1,y2);
-  return 0;
-}
-@end verbatim
-
-@pfig{traj, Example of Traj()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Flow sample, Pipe sample, Traj sample, Vector field samples
-@subsection Flow sample
-@nav{}
-
-Function @ref{flow} is another standard way to visualize vector fields -- it draw lines (threads) which is tangent to local vector field direction. MathGL draw threads from edges of bounding box and from central slices. Sometimes it is not most appropriate variant -- you may want to use @code{FlowP} to specify manual position of threads. @code{Flow} use color scheme for coloring (see @ref{Color scheme}). At this warm color corresponds to normal flow (like attractor), cold one corresponds to inverse flow (like source). The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a,b;  mgls_prepare2v(&a,&b);
-  gr->SubPlot(2,2,0,""); gr->Title("Flow plot (default)");
-  gr->Box();  gr->Flow(a,b);
-
-  gr->SubPlot(2,2,1,"");  gr->Title("'v' style");
-  gr->Box();  gr->Flow(a,b,"v");
-
-  gr->SubPlot(2,2,2,"");  gr->Title("'\\#' style");
-  gr->Box();  gr->Flow(a,b,"#");
-
-  mglData ex,ey,ez; mgls_prepare3v(&ex,&ey,&ez);
-  gr->SubPlot(2,2,3); gr->Title("3d variant");  gr->Rotate(50,60);
-  gr->Box();  gr->Flow(ex,ey,ez);
-  return 0;
-}
-@end verbatim
-
-@pfig{flow, Example of Flow()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Pipe sample, Dew sample, Flow sample, Vector field samples
-@subsection Pipe sample
-@nav{}
-
-Function @ref{pipe} is similar to @ref{flow} but draw pipes (tubes) which radius is proportional to the amplitude of vector field. @code{Pipe} use color scheme for coloring (see @ref{Color scheme}). At this warm color corresponds to normal flow (like attractor), cold one corresponds to inverse flow (like source). The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a,b;  mgls_prepare2v(&a,&b);
-  gr->SubPlot(2,2,0,""); gr->Title("Pipe plot (default)");
-  gr->Light(true);  gr->Box();  gr->Pipe(a,b);
-
-  gr->SubPlot(2,2,1,"");  gr->Title("'i' style");
-  gr->Box();  gr->Pipe(a,b,"i");
-
-  gr->SubPlot(2,2,2,"");  gr->Title("'\\#' style");
-  gr->Box();  gr->Pipe(a,b,"#");
-
-  mglData ex,ey,ez; mgls_prepare3v(&ex,&ey,&ez);
-  gr->SubPlot(2,2,3); gr->Title("3d variant");  gr->Rotate(50,60);
-  gr->Box();  gr->Pipe(ex,ey,ez,"",0.1);
-  return 0;
-}
-@end verbatim
-
-@pfig{pipe, Example of Pipe()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Dew sample, , Pipe sample, Vector field samples
-@subsection Dew sample
-@nav{}
-
-Function @ref{dew} is similar to @code{Vect} but use drops instead of arrows. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a,b;  mgls_prepare2v(&a,&b);
-  gr->SubPlot(1,1,0,""); gr->Title("Dew plot");
-  gr->Box();  gr->Light(true);  gr->Dew(a,b);
-  return 0;
-}
-@end verbatim
-
-@pfig{dew, Example of Dew()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Hints, FAQ, Vector field samples, Examples
+@node Hints, FAQ, Data plotting, Examples
 @section Hints
 @nav{}
 
@@ -3503,6 +1575,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 ------------------------------------------------------------------
@@ -4121,7 +2194,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
@@ -4148,6 +2221,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{}
@@ -4397,7 +2494,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{}
 
@@ -4430,6 +2527,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 8e42004b4a05dde30f80dd3388b0fd819568aefd..e57118606c77f259763156cfdcacece7b2a853e2 100644 (file)
@@ -55,10 +55,6 @@ call mgl_delete_graph(gr);
 * Advanced usage::
 * Data handling::
 * Data plotting::
-* 1D samples::
-* 2D samples::
-* 3D samples::
-* Vector field samples::
 * Hints::
 * FAQ::
 @end menu
@@ -134,8 +130,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
@@ -1416,7 +1413,7 @@ int sample(mglGraph *gr)
 
 @c ------------------------------------------------------------------
 @external{}
-@node Data plotting, 1D samples, Data handling, Examples
+@node Data plotting, Hints, Data handling, Examples
 @section Data plotting
 @nav{}
 
@@ -1538,1928 +1535,7 @@ int sample(mglGraph *gr)
 
 @c ------------------------------------------------------------------
 @external{}
-@node 1D samples, 2D samples, Data plotting, Examples
-@section 1D samples
-@nav{}
-
-This section is devoted to visualization of 1D data arrays. 1D means the data which depend on single index (parameter) like curve in parametric form @{x(i),y(i),z(i)@}, i=1...n. Most of samples will use the same data for plotting. So, I put its initialization in separate function
-@verbatim
-void mgls_prepare1d(mglData *y, mglData *y1=0, mglData *y2=0, mglData *x1=0, mglData *x2=0)
-{
-  register long i,n=50;
-  if(y) y->Create(n,3);
-  if(x1)  x1->Create(n);    if(x2)  x2->Create(n);
-  if(y1)  y1->Create(n);    if(y2)  y2->Create(n);
-  mreal xx;
-  for(i=0;i<n;i++)
-  {
-    xx = i/(n-1.);
-    if(y)
-    {
-      y->a[i] = 0.7*sin(2*M_PI*xx) + 0.5*cos(3*M_PI*xx) + 0.2*sin(M_PI*xx);
-      y->a[i+n] = sin(2*M_PI*xx);
-      y->a[i+2*n] = cos(2*M_PI*xx);
-    }
-    if(y1)  y1->a[i] = 0.5+0.3*cos(2*M_PI*xx);
-    if(y2)  y2->a[i] = 0.3*sin(2*M_PI*xx);
-    if(x1)  x1->a[i] = xx*2-1;
-    if(x2)  x2->a[i] = 0.05+0.03*cos(2*M_PI*xx);
-  }
-}
-@end verbatim
-or using C functions
-@verbatim
-void mgls_prepare1d(HMDT y, HMDT y1=0, HMDT y2=0, HMDT x1=0, HMDT x2=0)
-{
-  register long i,n=50;
-  if(y)   mgl_data_create(y,n,3,1);
-  if(x1)  mgl_data_create(x1,n,1,1);
-  if(x2)  mgl_data_create(x2,n,1,1);
-  if(y1)  mgl_data_create(y1,n,1,1);
-  if(y2)  mgl_data_create(y2,n,1,1);
-  mreal xx;
-  for(i=0;i<n;i++)
-  {
-    xx = i/(n-1.);
-    if(y)
-    {
-      mgl_data_set_value(y, 0.7*sin(2*M_PI*xx) + 0.5*cos(3*M_PI*xx) + 0.2*sin(M_PI*xx), i,0,0);
-      mgl_data_set_value(y, sin(2*M_PI*xx), i,1,0);
-      mgl_data_set_value(y, cos(2*M_PI*xx), i,2,0);
-    }
-    if(y1)  mgl_data_set_value(y1, 0.5+0.3*cos(2*M_PI*xx), i,0,0);
-    if(y2)  mgl_data_set_value(y2, 0.3*sin(2*M_PI*xx), i,0,0);
-    if(x1)  mgl_data_set_value(x1, xx*2-1, i,0,0);
-    if(x2)  mgl_data_set_value(x2, 0.05+0.03*cos(2*M_PI*xx), i,0,0);
-  }
-}
-@end verbatim
-
-@menu
-* Plot sample::
-* Radar sample::
-* Step sample::
-* Tens sample::
-* Area sample::
-* Region sample::
-* Stem sample::
-* Bars sample::
-* Barh sample::
-* Cones sample::
-* Chart sample::
-* BoxPlot sample::
-* Candle sample::
-* OHLC sample::
-* Error sample::
-* Mark sample::
-* TextMark sample::
-* Label sample::
-* Table sample::
-* Tube sample::
-* Tape sample::
-* Torus sample::
-* Lamerey sample::
-* Bifurcation sample::
-* Pmap sample::
-@end menu
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Plot sample, Radar sample, , 1D samples
-@subsection Plot sample
-@nav{}
-
-Function @ref{plot} is most standard way to visualize 1D data array. By default, @code{Plot} use colors from palette. However, you can specify manual color/palette, and even set to use new color for each points by using @samp{!} style. Another feature is @samp{ } style which draw only markers without line between points. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData y;  mgls_prepare1d(&y); gr->SetOrigin(0,0,0);
-  gr->SubPlot(2,2,0,"");  gr->Title("Plot plot (default)");
-  gr->Box();  gr->Plot(y);
-
-  gr->SubPlot(2,2,2,"");  gr->Title("'!' style; 'rgb' palette");
-  gr->Box();  gr->Plot(y,"o!rgb");
-
-  gr->SubPlot(2,2,3,"");  gr->Title("just markers");
-  gr->Box();  gr->Plot(y," +");
-
-  gr->SubPlot(2,2,1); gr->Title("3d variant");
-  gr->Rotate(50,60);  gr->Box();
-  mglData yc(30), xc(30), z(30);  z.Modify("2*x-1");
-  yc.Modify("sin(pi*(2*x-1))"); xc.Modify("cos(pi*2*x-pi)");
-  gr->Plot(xc,yc,z,"rs");
-  return 0;
-}
-@end verbatim
-
-@pfig{plot, Example of Plot()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Radar sample, Step sample, Plot sample, 1D samples
-@subsection Radar sample
-@nav{}
-
-Function @ref{radar} plot is variant of @code{Plot} one, which make plot in polar coordinates and draw radial rays in point directions. If you just need a plot in polar coordinates then I recommend to use @ref{Curvilinear coordinates} or @code{Plot} in parabolic form with @code{x=r*cos(fi); y=r*sin(fi);}. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData yr(10,3); yr.Modify("0.4*sin(pi*(2*x+y))+0.1*rnd");
-  gr->SubPlot(1,1,0,"");  gr->Title("Radar plot (with grid, '\\#')");
-  gr->Radar(yr,"#");
-  return 0;
-}
-@end verbatim
-
-@pfig{radar, Example of Radar()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Step sample, Tens sample, Radar sample, 1D samples
-@subsection Step sample
-@nav{}
-
-Function @ref{step} plot data as stairs. It have the same options as @code{Plot}. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData y;  mgls_prepare1d(&y); gr->SetOrigin(0,0,0);
-  mglData yc(30), xc(30), z(30);  z.Modify("2*x-1");
-  yc.Modify("sin(pi*(2*x-1))"); xc.Modify("cos(pi*2*x-pi)");
-
-  gr->SubPlot(2,2,0,"");  gr->Title("Step plot (default)");
-  gr->Box();  gr->Step(y);
-
-  gr->SubPlot(2,2,1); gr->Title("3d variant");  gr->Rotate(50,60);
-  gr->Box();  gr->Step(xc,yc,z,"r");
-
-  gr->SubPlot(2,2,2,"");  gr->Title("'!' style");
-  gr->Box();  gr->Step(y,"s!rgb");
-  return 0;
-}
-@end verbatim
-
-@pfig{step, Example of Step()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Tens sample, Area sample, Step sample, 1D samples
-@subsection Tens sample
-@nav{}
-
-Function @ref{tens} is variant of @ref{plot} with smooth coloring along the curves. At this, color is determined as for surfaces (see @ref{Color scheme}). The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData y;  mgls_prepare1d(&y); gr->SetOrigin(0,0,0);
-  gr->SubPlot(2,2,0,"");  gr->Title("Tens plot (default)");
-  gr->Box();  gr->Tens(y.SubData(-1,0), y.SubData(-1,1));
-
-  gr->SubPlot(2,2,2,"");  gr->Title("' ' style");
-  gr->Box();  gr->Tens(y.SubData(-1,0), y.SubData(-1,1),"o ");
-
-  gr->SubPlot(2,2,1); gr->Title("3d variant");  gr->Rotate(50,60);  gr->Box();
-  mglData yc(30), xc(30), z(30);  z.Modify("2*x-1");
-  yc.Modify("sin(pi*(2*x-1))"); xc.Modify("cos(pi*2*x-pi)");
-  gr->Tens(xc,yc,z,z,"s");
-  return 0;
-}
-@end verbatim
-
-@pfig{tens, Example of Tens()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Area sample, Region sample, Tens sample, 1D samples
-@subsection Area sample
-@nav{}
-
-Function @ref{area} fill the area between curve and axis plane. It support gradient filling if 2 colors per curve is specified. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData y;  mgls_prepare1d(&y); gr->SetOrigin(0,0,0);
-  gr->SubPlot(2,2,0,"");  gr->Title("Area plot (default)");
-  gr->Box();  gr->Area(y);
-
-  gr->SubPlot(2,2,1,"");  gr->Title("2 colors");
-  gr->Box();  gr->Area(y,"cbgGyr");
-
-  gr->SubPlot(2,2,2,"");  gr->Title("'!' style");
-  gr->Box();  gr->Area(y,"!");
-
-  gr->SubPlot(2,2,3); gr->Title("3d variant");
-  gr->Rotate(50,60);  gr->Box();
-  mglData yc(30), xc(30), z(30);  z.Modify("2*x-1");
-  yc.Modify("sin(pi*(2*x-1))"); xc.Modify("cos(pi*2*x-pi)");
-  gr->Area(xc,yc,z,"r");
-  yc.Modify("-sin(pi*(2*x-1))");  gr->Area(xc,yc,z,"b#");
-  return 0;
-}
-@end verbatim
-
-@pfig{area, Example of Area()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Region sample, Stem sample, Area sample, 1D samples
-@subsection Region sample
-@nav{}
-
-Function @ref{region} fill the area between 2 curves. It support gradient filling if 2 colors per curve is specified. Also it can fill only the region y1<y<y2 if style @samp{i} is used. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData y;  mgls_prepare1d(&y);
-  mglData y1 = y.SubData(-1,1), y2 = y.SubData(-1,2);  gr->SetOrigin(0,0,0);
-
-  gr->SubPlot(2,2,0,"");  gr->Title("Region plot (default)"); gr->Box();
-  gr->Region(y1,y2);  gr->Plot(y1,"k2");  gr->Plot(y2,"k2");
-
-  gr->SubPlot(2,2,1,"");  gr->Title("2 colors");  gr->Box();
-  gr->Region(y1,y2,"yr"); gr->Plot(y1,"k2");  gr->Plot(y2,"k2");
-
-  gr->SubPlot(2,2,2,"");  gr->Title("'i' style");  gr->Box();
-  gr->Region(y1,y2,"ir"); gr->Plot(y1,"k2");  gr->Plot(y2,"k2");
-
-  gr->SubPlot(2,2,3,"^_");  gr->Title("3d variant");  gr->Rotate(40,60);  gr->Box();
-  gr->Fill(y1,"cos(pi*x)"); gr->Fill(y2,"cos(pi*x+pi/3)");
-  mglData x1(y1.nx), x2(y1.nx), z(y1.nx);
-  gr->Fill(x1,"sin(pi*x)"); gr->Fill(x2,"sin(pi*x+pi/3)");  gr->Fill(z,"x");
-  gr->Plot(x1,y1,z,"r2");   gr->Plot(x2,y2,z,"b2");
-  gr->Region(x1,y1,z,x2,y2,z,"cmy!");
-  return 0;
-}
-@end verbatim
-
-@pfig{region, Example of Region()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Stem sample, Bars sample, Region sample, 1D samples
-@subsection Stem sample
-@nav{}
-
-Function @ref{stem} draw vertical bars. It is most attractive if markers are drawn too. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData y;  mgls_prepare1d(&y); gr->SetOrigin(0,0,0);
-  mglData yc(30), xc(30), z(30);  z.Modify("2*x-1");
-  yc.Modify("sin(pi*(2*x-1))"); xc.Modify("cos(pi*2*x-pi)");
-  gr->SubPlot(2,2,0,"");  gr->Title("Stem plot (default)");
-  gr->Box();  gr->Stem(y);
-
-  gr->SubPlot(2,2,1); gr->Title("3d variant");  gr->Rotate(50,60);
-  gr->Box();  gr->Stem(xc,yc,z,"rx");
-
-  gr->SubPlot(2,2,2,"");  gr->Title("'!' style");
-  gr->Box();  gr->Stem(y,"o!rgb");
-  return 0;
-}
-@end verbatim
-
-@pfig{stem, Example of Stem()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Bars sample, Barh sample, Stem sample, 1D samples
-@subsection Bars sample
-@nav{}
-
-Function @ref{bars} draw vertical bars. It have a lot of options: bar-above-bar (@samp{a} style), fall like (@samp{f} style), 2 colors for positive and negative values, wired bars (@samp{#} style), 3D variant. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData ys(10,3); ys.Modify("0.8*sin(pi*(2*x+y/2))+0.2*rnd");
-  gr->SetOrigin(0,0,0);
-  gr->SubPlot(3,2,0,"");  gr->Title("Bars plot (default)");
-  gr->Box();  gr->Bars(ys);
-
-  gr->SubPlot(3,2,1,"");  gr->Title("2 colors");
-  gr->Box();  gr->Bars(ys,"cbgGyr");
-
-  gr->SubPlot(3,2,4,"");  gr->Title("'\\#' style");
-  gr->Box();  gr->Bars(ys,"#");
-
-  gr->SubPlot(3,2,5); gr->Title("3d variant");
-  gr->Rotate(50,60);  gr->Box();
-  mglData yc(30), xc(30), z(30);  z.Modify("2*x-1");
-  yc.Modify("sin(pi*(2*x-1))"); xc.Modify("cos(pi*2*x-pi)");
-  gr->Bars(xc,yc,z,"r");
-
-  gr->SetRanges(-1,1,-3,3);
-  gr->SubPlot(3,2,2,"");  gr->Title("'a' style");
-  gr->Box();  gr->Bars(ys,"a");
-
-  gr->SubPlot(3,2,3,"");  gr->Title("'f' style");
-  gr->Box();  gr->Bars(ys,"f");
-  return 0;
-}
-@end verbatim
-
-@pfig{bars, Example of Bars()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Barh sample, Cones sample, Bars sample, 1D samples
-@subsection Barh sample
-@nav{}
-
-Function @ref{barh} is the similar to @code{Bars} but draw horizontal bars. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData ys(10,3); ys.Modify("0.8*sin(pi*(2*x+y/2))+0.2*rnd");
-  gr->SetOrigin(0,0,0);
-  gr->SubPlot(2,2,0,"");  gr->Title("Barh plot (default)");
-  gr->Box();  gr->Barh(ys);
-
-  gr->SubPlot(2,2,1,"");  gr->Title("2 colors");
-  gr->Box();  gr->Barh(ys,"cbgGyr");
-
-  gr->SetRanges(-3,3,-1,1);
-  gr->SubPlot(2,2,2,"");  gr->Title("'a' style");
-  gr->Box();  gr->Barh(ys,"a");
-
-  gr->SubPlot(2,2,3,"");  gr->Title("'f' style");
-  gr->Box();  gr->Barh(ys,"f");
-  return 0;
-}
-@end verbatim
-
-@pfig{barh, Example of Barh()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Cones sample, Chart sample, Barh sample, 1D samples
-@subsection Cones sample
-@nav{}
-
-Function @ref{cones} is similar to @code{Bars} but draw cones. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData ys(10,3);   ys.Modify("0.8*sin(pi*(2*x+y/2))+0.2*rnd");
-  gr->Light(true);    gr->SetOrigin(0,0,0);
-  gr->SubPlot(3,2,0); gr->Title("Cones plot");
-  gr->Rotate(50,60);  gr->Box();  gr->Cones(ys);
-
-  gr->SubPlot(3,2,1); gr->Title("2 colors");
-  gr->Rotate(50,60);  gr->Box();  gr->Cones(ys,"cbgGyr");
-
-  gr->SubPlot(3,2,2); gr->Title("'#' style");
-  gr->Rotate(50,60);  gr->Box();  gr->Cones(ys,"#");
-
-  gr->SubPlot(3,2,3); gr->Title("'a' style");
-  gr->SetRange('z',-2,2); // increase range since summation can exceed [-1,1]
-  gr->Rotate(50,60);  gr->Box();  gr->Cones(ys,"a");
-
-  gr->SubPlot(3,2,4); gr->Title("'t' style");
-  gr->Rotate(50,60);  gr->Box();  gr->Cones(ys,"t");
-
-  gr->SubPlot(3,2,5); gr->Title("'4' style");
-  gr->Rotate(50,60);  gr->Box();  gr->Cones(ys,"4");
-  return 0;
-}
-@end verbatim
-
-@pfig{cones, Example of Cones()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Chart sample, BoxPlot sample, Cones sample, 1D samples
-@subsection Chart sample
-@nav{}
-
-Function @ref{chart} draw colored boxes with width proportional to data values. Use @samp{ } for empty box. Plot looks most attractive in polar coordinates -- well known pie chart. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData ch(7,2);  for(int i=0;i<7*2;i++)  ch.a[i]=mgl_rnd()+0.1;
-  gr->SubPlot(2,2,0); gr->Title("Chart plot (default)");
-  gr->Light(true);  gr->Rotate(50,60);  gr->Box();  gr->Chart(ch);
-
-  gr->SubPlot(2,2,1); gr->Title("'\\#' style");
-  gr->Rotate(50,60);  gr->Box();  gr->Chart(ch,"#");
-
-  gr->SubPlot(2,2,2); gr->Title("Pie chart; ' ' color");
-  gr->SetFunc("(y+1)/2*cos(pi*x)","(y+1)/2*sin(pi*x)","");
-  gr->Rotate(50,60);  gr->Box();  gr->Chart(ch,"bgr cmy#");
-
-  gr->SubPlot(2,2,3); gr->Title("Ring chart; ' ' color");
-  gr->SetFunc("(y+2)/3*cos(pi*x)","(y+2)/3*sin(pi*x)","");
-  gr->Rotate(50,60);  gr->Box();  gr->Chart(ch,"bgr cmy#");
-  return 0;
-}
-@end verbatim
-
-@pfig{chart, Example of Chart()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node BoxPlot sample, Candle sample, Chart sample, 1D samples
-@subsection BoxPlot sample
-@nav{}
-
-Function @ref{boxplot} draw box-and-whisker diagram. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a(10,7);  a.Modify("(2*rnd-1)^3/2");
-  gr->SubPlot(1,1,0,"");  gr->Title("Boxplot plot");
-  gr->Box();  gr->BoxPlot(a);
-  return 0;
-}
-@end verbatim
-
-@pfig{boxplot, Example of BoxPlot()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Candle sample, OHLC sample, BoxPlot sample, 1D samples
-@subsection Candle sample
-@nav{}
-
-Function @ref{candle} draw candlestick chart. This is a combination of a line-chart and a bar-chart, in that each bar represents the range of price movement over a given time interval. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData y(30);  gr->Fill(y,"sin(pi*x/2)^2");
-  mglData y1(30); gr->Fill(y1,"v/2",y);
-  mglData y2(30); gr->Fill(y2,"(1+v)/2",y);
-  gr->SubPlot(1,1,0,"");  gr->Title("Candle plot (default)");
-  gr->SetRange('y',0,1);  gr->Box();  gr->Candle(y,y1,y2);
-  return 0;
-}
-@end verbatim
-
-@pfig{candle, Example of Candle()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node OHLC sample, Error sample, Candle sample, 1D samples
-@subsection OHLC sample
-@nav{}
-
-Function @ref{ohlc} draw Open-High-Low-Close diagram. This diagram show vertical line for between maximal(high) and minimal(low) values, as well as horizontal lines before/after vertical line for initial(open)/final(close) values of some process. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData o(10), h(10), l(10), c(10);
-  gr->Fill(o,"0.5*sin(pi*x)");  gr->Fill(c,"0.5*sin(pi*(x+2/9))");
-  gr->Fill(l,"0.3*rnd-0.8");    gr->Fill(h,"0.3*rnd+0.5");
-  gr->SubPlot(1,1,0,"");  gr->Title("OHLC plot");
-  gr->Box();  gr->OHLC(o,h,l,c);
-  return 0;
-}
-@end verbatim
-
-@pfig{ohlc, Example of OHLC()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Error sample, Mark sample, OHLC sample, 1D samples
-@subsection Error sample
-@nav{}
-
-Function @ref{error} draw error boxes around the points. You can draw default boxes or semi-transparent symbol (like marker, see @ref{Line styles}). Also you can set individual color for each box. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData y;  mgls_prepare1d(&y);
-  mglData x0(10), y0(10), ex0(10), ey0(10);
-  mreal x;
-  for(int i=0;i<10;i++)
-  {
-    x = i/9.;
-    x0.a[i] = 2*x-1 + 0.1*mgl_rnd()-0.05;
-    y0.a[i] = 0.7*sin(2*M_PI*x)+0.5*cos(3*M_PI*x)+0.2*sin(M_PI*x)+0.2*mgl_rnd()-0.1;
-    ey0.a[i]=0.2; ex0.a[i]=0.1;
-  }
-
-  gr->SubPlot(2,2,0,"");  gr->Title("Error plot (default)");
-  gr->Box();  gr->Plot(y.SubData(-1,0));  gr->Error(x0,y0,ex0,ey0,"ko");
-
-  gr->SubPlot(2,2,1,"");  gr->Title("'!' style; no e_x");
-  gr->Box();  gr->Plot(y.SubData(-1,0));  gr->Error(x0,y0,ey0,"o!rgb");
-
-  gr->SubPlot(2,2,2,"");  gr->Title("'\\@' style");
-  gr->Box();  gr->Plot(y.SubData(-1,0));  gr->Error(x0,y0,ex0,ey0,"@","alpha 0.5");
-
-  gr->SubPlot(2,2,3); gr->Title("3d variant");  gr->Rotate(50,60);
-  for(int i=0;i<10;i++)
-    gr->Error(mglPoint(2*mgl_rnd()-1,2*mgl_rnd()-1,2*mgl_rnd()-1),
-              mglPoint(0.2,0.2,0.2),"bo");
-  gr->Axis();
-  return 0;
-}
-@end verbatim
-
-@pfig{error, Example of Error()}
-
-Additionally, you can use solid large "marks" instead of error boxes by selecting proper style.
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData x0(10), y0(10), ex(10), ey(10);
-  for(int i=0;i<10;i++)
-  {  x0.a[i] = mgl_rnd(); y0.a[i] = mgl_rnd(); ey.a[i] = ex.a[i] = 0.1; }
-  gr->SetRanges(0,1,0,1); gr->Alpha(true);
-  gr->SubPlot(4,3,0,"");  gr->Box(); gr->Error(x0,y0,ex,ey,"#+@");
-  gr->SubPlot(4,3,1,"");  gr->Box(); gr->Error(x0,y0,ex,ey,"#x@");
-  gr->SubPlot(4,3,2,"");  gr->Box(); gr->Error(x0,y0,ex,ey,"#s@","alpha 0.5");
-  gr->SubPlot(4,3,3,"");  gr->Box(); gr->Error(x0,y0,ex,ey,"s@");
-  gr->SubPlot(4,3,4,"");  gr->Box(); gr->Error(x0,y0,ex,ey,"d@");
-  gr->SubPlot(4,3,5,"");  gr->Box(); gr->Error(x0,y0,ex,ey,"#d@","alpha 0.5");
-  gr->SubPlot(4,3,6,"");  gr->Box(); gr->Error(x0,y0,ex,ey,"+@");
-  gr->SubPlot(4,3,7,"");  gr->Box(); gr->Error(x0,y0,ex,ey,"x@");
-  gr->SubPlot(4,3,8,"");  gr->Box(); gr->Error(x0,y0,ex,ey,"o@");
-  gr->SubPlot(4,3,9,"");  gr->Box(); gr->Error(x0,y0,ex,ey,"#o@","alpha 0.5");
-  gr->SubPlot(4,3,10,""); gr->Box(); gr->Error(x0,y0,ex,ey,"#.@");
-  gr->SubPlot(4,3,11,""); gr->Box(); gr->Error(x0,y0,ex,ey);
-}
-@end verbatim
-
-@pfig{error2, Example of Error() with marks}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Mark sample, TextMark sample, Error sample, 1D samples
-@subsection Mark sample
-@nav{}
-
-Function @ref{mark} draw markers at points. It is mostly the same as @code{Plot} but marker size can be variable. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData y,y1; mgls_prepare1d(&y,&y1);
-  gr->SubPlot(1,1,0,"");  gr->Title("Mark plot (default)");
-  gr->Box();  gr->Mark(y,y1,"s");
-  return 0;
-}
-@end verbatim
-
-@pfig{mark, Example of Mark()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node TextMark sample, Label sample, Mark sample, 1D samples
-@subsection TextMark sample
-@nav{}
-
-Function @ref{textmark} like @code{Mark} but draw text instead of markers. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData y,y1; mgls_prepare1d(&y,&y1);
-  gr->SubPlot(1,1,0,"");  gr->Title("TextMark plot (default)");
-  gr->Box();  gr->TextMark(y,y1,"\\gamma","r");
-  return 0;
-}
-@end verbatim
-
-@pfig{textmark, Example of TextMark()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Label sample, Table sample, TextMark sample, 1D samples
-@subsection Label sample
-@nav{}
-
-Function @ref{label} print text at data points. The string may contain @samp{%x}, @samp{%y}, @samp{%z} for x-, y-, z-coordinates of points, @samp{%n} for point index. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData ys(10); ys.Modify("0.8*sin(pi*2*x)+0.2*rnd");
-  gr->SubPlot(1,1,0,"");  gr->Title("Label plot");
-  gr->Box();  gr->Plot(ys," *");  gr->Label(ys,"y=%y");
-  return 0;
-}
-@end verbatim
-
-@pfig{label, Example of Label()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Table sample, Tube sample, Label sample, 1D samples
-@subsection Table sample
-@nav{}
-
-Function @ref{table} draw table with data values. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData ys(10,3); ys.Modify("0.8*sin(pi*(2*x+y/2))+0.2*rnd");
-  gr->SubPlot(2,2,0);  gr->Title("Table plot");
-  gr->Table(ys,"y_1\ny_2\ny_3");   gr->Box();
-  gr->SubPlot(2,2,1);  gr->Title("no borders, colored");
-  gr->Table(ys,"y_1\ny_2\ny_3","r|");
-  gr->SubPlot(2,2,2);  gr->Title("no font decrease");
-  gr->Table(ys,"y_1\ny_2\ny_3","#");
-  gr->SubPlot(2,2,3);  gr->Title("manual width, position");
-  gr->Table(0.5, 0.95, ys,"y_1\ny_2\ny_3","#", "value 0.7");  gr->Box();
-  return 0;
-}
-@end verbatim
-
-@pfig{table, Example of Table()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Tube sample, Tape sample, Table sample, 1D samples
-@subsection Tube sample
-@nav{}
-
-Function @ref{tube} draw tube with variable radius. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData y,y1,y2;  mgls_prepare1d(&y,&y1,&y2); y1/=20;
-  gr->SubPlot(2,2,0,"");  gr->Title("Tube plot (default)");
-  gr->Light(true);  gr->Box();  gr->Tube(y,0.05);
-
-  gr->SubPlot(2,2,1,"");  gr->Title("variable radius");
-  gr->Box();  gr->Tube(y,y1);
-
-  gr->SubPlot(2,2,2,"");  gr->Title("'\\#' style");
-  gr->Box();  gr->Tube(y,0.05,"#");
-  mglData yc(50), xc(50), z(50);  z.Modify("2*x-1");
-  yc.Modify("sin(pi*(2*x-1))"); xc.Modify("cos(pi*2*x-pi)");
-
-  gr->SubPlot(2,2,3); gr->Title("3d variant");  gr->Rotate(50,60);
-  gr->Box();  gr->Tube(xc,yc,z,y2,"r");
-  return 0;
-}
-@end verbatim
-
-@pfig{tube, Example of Tube()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Tape sample, Torus sample, Tube sample, 1D samples
-@subsection Tape sample
-@nav{}
-
-Function @ref{tape} draw tapes which rotate around the curve as normal and binormal. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData y;  mgls_prepare1d(&y);
-  mglData xc(50), yc(50), z(50);
-  yc.Modify("sin(pi*(2*x-1))");
-  xc.Modify("cos(pi*2*x-pi)");  z.Fill(-1,1);
-  gr->SubPlot(2,2,0,"");  gr->Title("Tape plot (default)");
-  gr->Box();  gr->Tape(y);  gr->Plot(y,"k");
-
-  gr->SubPlot(2,2,1); gr->Title("3d variant, 2 colors");
-  gr->Rotate(50,60);  gr->Light(true);
-  gr->Box();  gr->Plot(xc,yc,z,"k");  gr->Tape(xc,yc,z,"rg");
-
-  gr->SubPlot(2,2,2); gr->Title("3d variant, x only");  gr->Rotate(50,60);
-  gr->Box();  gr->Plot(xc,yc,z,"k");
-  gr->Tape(xc,yc,z,"xr"); gr->Tape(xc,yc,z,"xr#");
-
-  gr->SubPlot(2,2,3); gr->Title("3d variant, z only");  gr->Rotate(50,60);
-  gr->Box();  gr->Plot(xc,yc,z,"k");
-  gr->Tape(xc,yc,z,"zg"); gr->Tape(xc,yc,z,"zg#");
-  return 0;
-}
-@end verbatim
-
-@pfig{tape, Example of Tape()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Torus sample, Lamerey sample, Tape sample, 1D samples
-@subsection Torus sample
-@nav{}
-
-Function @ref{torus} draw surface of the curve rotation. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData y1,y2;  mgls_prepare1d(0,&y1,&y2);
-  gr->SubPlot(2,2,0); gr->Title("Torus plot (default)");
-  gr->Light(true);  gr->Rotate(50,60);  gr->Box();  gr->Torus(y1,y2);
-  if(mini)  return;
-
-  gr->SubPlot(2,2,1); gr->Title("'x' style"); gr->Rotate(50,60);
-  gr->Box();  gr->Torus(y1,y2,"x");
-
-  gr->SubPlot(2,2,2); gr->Title("'z' style"); gr->Rotate(50,60);
-  gr->Box();  gr->Torus(y1,y2,"z");
-
-  gr->SubPlot(2,2,3); gr->Title("'\\#' style"); gr->Rotate(50,60);
-  gr->Box();  gr->Torus(y1,y2,"#");
-  return 0;
-}
-@end verbatim
-
-@pfig{torus, Example of Torus()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Lamerey sample, Bifurcation sample, Torus sample, 1D samples
-@subsection Lamerey sample
-@nav{}
-
-Function @ref{lamerey} draw Lamerey diagram. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  gr->SubPlot(1,1,0,"<_");
-  gr->Title("Lamerey sample");
-  gr->Axis(); gr->Label('x',"\\i x");
-  gr->Label('y',"\\bar{\\i x} = 2 \\i{x}");
-  gr->FPlot("x","k=");  gr->FPlot("2*x","b");
-  gr->Lamerey( 0.00097,"2*x","rv~");
-  gr->Lamerey(-0.00097,"2*x","rv~");
-}
-@end verbatim
-
-@pfig{lamerey, Example of Lamerey()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Bifurcation sample, Pmap sample, Lamerey sample, 1D samples
-@subsection Bifurcation sample
-@nav{}
-
-Function @ref{bifurcation} draw Bifurcation diagram for logistic map. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  gr->SubPlot(1,1,0,"<_");
-  gr->Title("Bifurcation sample");
-  gr->SetRanges(0,4,0,1);   gr->Axis();
-  gr->Bifurcation(0.005,"x*y*(1-y)","r");
-}
-@end verbatim
-
-@pfig{bifurcation, Example of Bifurcation()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Pmap sample, , Bifurcation sample, 1D samples
-@subsection Pmap sample
-@nav{}
-
-Function @ref{pmap} draw Poincare map -- show intersections of the curve and the surface. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  gr->SubPlot(1,1,0,"<_^");
-  gr->Title("Poincare map sample");
-  mglData ini(3);      ini[0]=0.1;
-  mglData r(mglODE("cos(y)+sin(z);cos(z)+sin(x);cos(x)+sin(y)","xyz",ini,0.1,100));
-  mglData x(r.SubData(0)),y(r.SubData(1)), z(r.SubData(2));
-  gr->Rotate(40,60);  gr->SetRanges(x,y,z);
-  gr->Axis(); gr->FSurf("0"); gr->Plot(x,y,z,"b");
-  gr->Label('x',"\\i x",0);   gr->Label('y',"\\i y",0);   gr->Label('z',"\\i z",0);
-  gr->Pmap(x,y,z,z, "b#o");
-}
-@end verbatim
-
-@pfig{pmap, Example of Pmap()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node 2D samples, 3D samples, 1D samples, Examples
-@section 2D samples
-@nav{}
-
-This section is devoted to visualization of 2D data arrays. 2D means the data which depend on 2 indexes (parameters) like matrix z(i,j)=z(x(i),y(j)), i=1...n, j=1...m or in parametric form @{x(i,j),y(i,j),z(i,j)@}. Most of samples will use the same data for plotting. So, I put its initialization in separate function
-@verbatim
-void mgls_prepare2d(mglData *a, mglData *b=0, mglData *v=0)
-{
-  register long i,j,n=50,m=40,i0;
-  if(a) a->Create(n,m);   if(b) b->Create(n,m);
-  if(v) { v->Create(9); v->Fill(-1,1);  }
-  mreal x,y;
-  for(i=0;i<n;i++)  for(j=0;j<m;j++)
-  {
-    x = i/(n-1.); y = j/(m-1.); i0 = i+n*j;
-    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);
-    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);
-  }
-}
-@end verbatim
-or using C functions
-@verbatim
-void mgls_prepare2d(HMDT a, HMDT b=0, HMDT v=0)
-{
-  register long i,j,n=50,m=40,i0;
-  if(a) mgl_data_create(a,n,m,1);
-  if(b) mgl_data_create(b,n,m,1);
-  if(v) { mgl_data_create(v,9,1,1); mgl_data_fill(v,-1,1,'x');  }
-  mreal x,y;
-  for(i=0;i<n;i++)  for(j=0;j<m;j++)
-  {
-    x = i/(n-1.); y = j/(m-1.); i0 = i+n*j;
-    if(a) mgl_data_set_value(a, 0.6*sin(2*M_PI*x)*sin(3*M_PI*y)+0.4*cos(3*M_PI*x*y), i,j,0);
-    if(b) mgl_data_set_value(b, 0.6*cos(2*M_PI*x)*cos(3*M_PI*y)+0.4*cos(3*M_PI*x*y), i,j,0);
-  }
-}
-@end verbatim
-
-@menu
-* Surf sample::
-* SurfC sample::
-* SurfA sample::
-* SurfCA sample::
-* Mesh sample::
-* Fall sample::
-* Belt sample::
-* Boxs sample::
-* Tile sample::
-* TileS sample::
-* Dens sample::
-* Cont sample::
-* ContF sample::
-* ContD sample::
-* ContV sample::
-* Axial sample::
-* Grad sample::
-@end menu
-
-@c ------------------------------------------------------------------
-@external{}
-@node Surf sample, SurfC sample, , 2D samples
-@subsection Surf sample
-@nav{}
-
-Function @ref{surf} is most standard way to visualize 2D data array. @code{Surf} use color scheme for coloring (see @ref{Color scheme}). You can use @samp{#} style for drawing black meshes on the surface. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a;  mgls_prepare2d(&a);
-  gr->SubPlot(2,2,0); gr->Title("Surf plot (default)");
-  gr->Light(true);  gr->Rotate(50,60);  gr->Box();  gr->Surf(a);
-
-  gr->SubPlot(2,2,1); gr->Title("'\\#' style; meshnum 10");
-  gr->Rotate(50,60);  gr->Box();  gr->Surf(a,"#","meshnum 10");
-
-  gr->SubPlot(2,2,2); gr->Title("'.' style");
-  gr->Rotate(50,60);  gr->Box();  gr->Surf(a,".");
-
-  gr->SubPlot(2,2,3); gr->Title("parametric form");
-  mglData x(50,40),y(50,40),z(50,40);
-  gr->Fill(x,"0.8*sin(pi*x)*sin(pi*(y+1)/2)");
-  gr->Fill(y,"0.8*cos(pi*x)*sin(pi*(y+1)/2)");
-  gr->Fill(z,"0.8*cos(pi*(y+1)/2)");
-  gr->Rotate(50,60);  gr->Box();  gr->Surf(x,y,z,"BbwrR");
-  return 0;
-}
-@end verbatim
-
-@pfig{surf, Example of Surf()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node SurfC sample, SurfA sample, Surf sample, 2D samples
-@subsection SurfC sample
-@nav{}
-
-Function @ref{surfc} is similar to @ref{surf} but its coloring is determined by another data. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a,b;  mgls_prepare2d(&a,&b);
-  gr->Title("SurfC plot");  gr->Rotate(50,60);
-  gr->Light(true);  gr->Box();  gr->SurfC(a,b);
-  return 0;
-}
-@end verbatim
-
-@pfig{surfc, Example of SurfC()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node SurfA sample, SurfCA sample, SurfC sample, 2D samples
-@subsection SurfA sample
-@nav{}
-
-Function @ref{surfa} is similar to @ref{surf} but its transparency is determined by another data. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a,b;  mgls_prepare2d(&a,&b);
-  gr->Title("SurfA plot");  gr->Rotate(50,60);
-  gr->Alpha(true);  gr->Light(true);
-  gr->Box();  gr->SurfA(a,b);
-  return 0;
-}
-@end verbatim
-
-@pfig{surfa, Example of SurfA()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node SurfCA sample, Mesh sample, SurfA sample, 2D samples
-@subsection SurfCA sample
-@nav{}
-
-Function @ref{surfca} is similar to @ref{surf} but its color and transparency is determined by another data. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a,b;  mgls_prepare2d(&a,&b);
-  gr->Title("SurfCA plot");  gr->Rotate(50,60);
-  gr->Alpha(true);  gr->Light(true);
-  gr->Box();  gr->SurfCA(a,b,a);
-  return 0;
-}
-@end verbatim
-
-@pfig{surfca, Example of SurfCA()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Mesh sample, Fall sample, SurfCA sample, 2D samples
-@subsection Mesh sample
-@nav{}
-
-Function @ref{mesh} draw wired surface. You can use @ref{meshnum} for changing number of lines to be drawn. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a;  mgls_prepare2d(&a);
-  gr->Title("Mesh plot"); gr->Rotate(50,60);
-  gr->Box();  gr->Mesh(a);
-  return 0;
-}
-@end verbatim
-
-@pfig{mesh, Example of Mesh()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Fall sample, Belt sample, Mesh sample, 2D samples
-@subsection Fall sample
-@nav{}
-
-Function @ref{fall} draw waterfall surface. You can use @ref{meshnum} for changing number of lines to be drawn. Also you can use @samp{x} style for drawing lines in other direction. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a;  mgls_prepare2d(&a);
-  gr->Title("Fall plot"); gr->Rotate(50,60);
-  gr->Box();  gr->Fall(a);
-  return 0;
-}
-@end verbatim
-
-@pfig{fall, Example of Fall()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Belt sample, Boxs sample, Fall sample, 2D samples
-@subsection Belt sample
-@nav{}
-
-Function @ref{belt} draw surface by belts. You can use @samp{x} style for drawing lines in other direction. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a;  mgls_prepare2d(&a);
-  gr->Title("Belt plot"); gr->Rotate(50,60);
-  gr->Box();  gr->Belt(a);
-  return 0;
-}
-@end verbatim
-
-@pfig{belt, Example of Belt()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Boxs sample, Tile sample, Belt sample, 2D samples
-@subsection Boxs sample
-@nav{}
-
-Function @ref{boxs} draw surface by boxes. You can use @samp{#} for drawing wire plot. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a;  mgls_prepare2d(&a);
-  gr->SetOrigin(0,0,0); gr->Light(true);
-  gr->SubPlot(2,2,0);  gr->Title("Boxs plot (default)");
-  gr->Rotate(40,60);  gr->Box();  gr->Boxs(a);
-
-  gr->SubPlot(2,2,1); gr->Title("'\\@' style");
-  gr->Rotate(50,60);  gr->Box();  gr->Boxs(a,"@");
-
-  gr->SubPlot(2,2,2); gr->Title("'\\#' style");
-  gr->Rotate(50,60);  gr->Box();  gr->Boxs(a,"#");
-
-  gr->SubPlot(2,2,3); gr->Title("compare with Tile");
-  gr->Rotate(50,60);  gr->Box();  gr->Tile(a);
-  return 0;
-}
-@end verbatim
-
-@pfig{boxs, Example of Boxs()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Tile sample, TileS sample, Boxs sample, 2D samples
-@subsection Tile sample
-@nav{}
-
-Function @ref{tile} draw surface by tiles. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a;  mgls_prepare2d(&a);
-  gr->Title("Tile plot");
-  gr->Rotate(40,60);  gr->Box();  gr->Tile(a);
-  return 0;
-}
-@end verbatim
-
-@pfig{tile, Example of Tile()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node TileS sample, Dens sample, Tile sample, 2D samples
-@subsection TileS sample
-@nav{}
-
-Function @ref{tiles} is similar to @code{Tile} but tile sizes is determined by another data. This allows one to simulate transparency of the plot. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a,b;  mgls_prepare2d(&a,&b);
-  gr->SubPlot(1,1,0,""); gr->Title("TileS plot");
-  gr->Box();  gr->TileS(a,b);
-  return 0;
-}
-@end verbatim
-
-@pfig{tiles, Example of TileS()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Dens sample, Cont sample, TileS sample, 2D samples
-@subsection Dens sample
-@nav{}
-
-Function @ref{dens} draw density plot for surface. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a,a1(30,40,3);  mgls_prepare2d(&a);
-  gr->Fill(a1,"0.6*sin(2*pi*x+pi*(z+1)/2)*sin(3*pi*y+pi*z) + 0.4*cos(3*pi*(x*y)+pi*(z+1)^2/2)");
-  gr->SubPlot(2,2,0,""); gr->Title("Dens plot (default)");
-  gr->Box();  gr->Dens(a);
-
-  gr->SubPlot(2,2,1); gr->Title("3d variant");
-  gr->Rotate(50,60);  gr->Box();  gr->Dens(a);
-
-  gr->SubPlot(2,2,2,"");  gr->Title("'\\#' style; meshnum 10");
-  gr->Box();  gr->Dens(a,"#","meshnum 10");
-
-  gr->SubPlot(2,2,3); gr->Title("several slices");
-  gr->Rotate(50,60);    gr->Box();  gr->Dens(a1);
-  return 0;
-}
-@end verbatim
-
-@pfig{dens, Example of Dens()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Cont sample, ContF sample, Dens sample, 2D samples
-@subsection Cont sample
-@nav{}
-
-Function @ref{cont} draw contour lines for surface. You can select automatic (default) or manual levels for contours, print contour labels, draw it on the surface (default) or at plane (as @code{Dens}). The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a,v(5); mgls_prepare2d(&a); v.a[0]=-0.5;  v.a[1]=-0.15; v.a[2]=0; v.a[3]=0.15;  v.a[4]=0.5;
-  gr->SubPlot(2,2,0); gr->Title("Cont plot (default)");
-  gr->Rotate(50,60);  gr->Box();  gr->Cont(a);
-
-  gr->SubPlot(2,2,1); gr->Title("manual levels");
-  gr->Rotate(50,60);  gr->Box();  gr->Cont(v,a);
-
-  gr->SubPlot(2,2,2); gr->Title("'\\_' style");
-  gr->Rotate(50,60);  gr->Box();  gr->Cont(a,"_");
-
-  gr->SubPlot(2,2,3,"");  gr->Title("'t' style");
-  gr->Box();  gr->Cont(a,"t");
-  return 0;
-}
-@end verbatim
-
-@pfig{cont, Example of Cont()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node ContF sample, ContD sample, Cont sample, 2D samples
-@subsection ContF sample
-@nav{}
-
-Function @ref{contf} draw filled contours.  You can select automatic (default) or manual levels for contours. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a,v(5),a1(30,40,3); mgls_prepare2d(&a); v.a[0]=-0.5;
-  v.a[1]=-0.15; v.a[2]=0; v.a[3]=0.15;  v.a[4]=0.5;
-  gr->SubPlot(2,2,0); gr->Title("ContF plot (default)");
-  gr->Rotate(50,60);  gr->Box();  gr->ContF(a);
-
-  gr->SubPlot(2,2,1); gr->Title("manual levels");
-  gr->Rotate(50,60);  gr->Box();  gr->ContF(v,a);
-
-  gr->SubPlot(2,2,2); gr->Title("'\\_' style");
-  gr->Rotate(50,60);  gr->Box();  gr->ContF(a,"_");
-
-  gr->Fill(a1,"0.6*sin(2*pi*x+pi*(z+1)/2)*sin(3*pi*y+pi*z) +
-               0.4*cos(3*pi*(x*y)+pi*(z+1)^2/2)");
-  gr->SubPlot(2,2,3); gr->Title("several slices");
-  gr->Rotate(50,60);  gr->Box();  gr->ContF(a1);
-  return 0;
-}
-@end verbatim
-
-@pfig{contf, Example of ContF()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node ContD sample, ContV sample, ContF sample, 2D samples
-@subsection ContD sample
-@nav{}
-
-Function @ref{contd} is similar to @code{ContF} but with manual contour colors. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a,v(5),a1(30,40,3); mgls_prepare2d(&a); v.a[0]=-0.5;
-  v.a[1]=-0.15; v.a[2]=0; v.a[3]=0.15;  v.a[4]=0.5;
-  gr->SubPlot(2,2,0); gr->Title("ContD plot (default)");
-  gr->Rotate(50,60);  gr->Box();  gr->ContD(a);
-
-  gr->SubPlot(2,2,1); gr->Title("manual levels");
-  gr->Rotate(50,60);  gr->Box();  gr->ContD(v,a);
-
-  gr->SubPlot(2,2,2); gr->Title("'\\_' style");
-  gr->Rotate(50,60);  gr->Box();  gr->ContD(a,"_");
-
-  gr->Fill(a1,"0.6*sin(2*pi*x+pi*(z+1)/2)*sin(3*pi*y+pi*z) + 0.4*cos(3*pi*(x*y)+pi*(z+1)^2/2)");
-  gr->SubPlot(2,2,3); gr->Title("several slices");
-  gr->Rotate(50,60);  gr->Box();  gr->ContD(a1);
-  return 0;
-}
-@end verbatim
-
-@pfig{contd, Example of ContD()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node ContV sample, Axial sample, ContD sample, 2D samples
-@subsection ContV sample
-@nav{}
-
-Function @ref{contv} draw vertical cylinders (belts) at contour lines. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a,v(5); mgls_prepare2d(&a); v.a[0]=-0.5;
-  v.a[1]=-0.15; v.a[2]=0; v.a[3]=0.15;  v.a[4]=0.5;
-  gr->SubPlot(2,2,0); gr->Title("ContV plot (default)");
-  gr->Rotate(50,60);  gr->Box();  gr->ContV(a);
-
-  gr->SubPlot(2,2,1); gr->Title("manual levels");
-  gr->Rotate(50,60);  gr->Box();  gr->ContV(v,a);
-
-  gr->SubPlot(2,2,2); gr->Title("'\\_' style");
-  gr->Rotate(50,60);  gr->Box();  gr->ContV(a,"_");
-
-  gr->SubPlot(2,2,3); gr->Title("ContV and ContF");
-  gr->Rotate(50,60);  gr->Box();  gr->Light(true);
-  gr->ContV(a); gr->ContF(a); gr->Cont(a,"k");
-  return 0;
-}
-@end verbatim
-
-@pfig{contv, Example of ContV()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Axial sample, Grad sample, ContV sample, 2D samples
-@subsection Axial sample
-@nav{}
-
-Function @ref{axial} draw surfaces of rotation for contour lines. You can draw wire surfaces (@samp{#} style) or ones rotated in other directions (@samp{x}, @samp{z} styles). The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a;  mgls_prepare2d(&a);
-  gr->SubPlot(2,2,0); gr->Title("Axial plot (default)");
-  gr->Light(true);  gr->Alpha(true);  gr->Rotate(50,60);
-  gr->Box();  gr->Axial(a);
-
-  gr->SubPlot(2,2,1); gr->Title("'x' style;'.' style"); gr->Rotate(50,60);
-  gr->Box();  gr->Axial(a,"x.");
-
-  gr->SubPlot(2,2,2); gr->Title("'z' style"); gr->Rotate(50,60);
-  gr->Box();  gr->Axial(a,"z");
-
-  gr->SubPlot(2,2,3); gr->Title("'\\#' style"); gr->Rotate(50,60);
-  gr->Box();  gr->Axial(a,"#");
-  return 0;
-}
-@end verbatim
-
-@pfig{axial, Example of Axial()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Grad sample, , Axial sample, 2D samples
-@subsection Grad sample
-@nav{}
-
-Function @ref{grad} draw gradient lines for matrix. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a;  mgls_prepare2d(&a);
-  gr->SubPlot(1,1,0,""); gr->Title("Grad plot");
-  gr->Box();  gr->Grad(a);  gr->Dens(a,"{u8}w{q8}");
-  return 0;
-}
-@end verbatim
-
-@pfig{grad, Example of Grad()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node 3D samples, Vector field samples, 2D samples, Examples
-@section 3D samples
-@nav{}
-
-This section is devoted to visualization of 3D data arrays. 3D means the data which depend on 3 indexes (parameters) like tensor a(i,j,k)=a(x(i),y(j),x(k)), i=1...n, j=1...m, k=1...l or in parametric form @{x(i,j,k),y(i,j,k),z(i,j,k),a(i,j,k)@}. Most of samples will use the same data for plotting. So, I put its initialization in separate function
-@verbatim
-void mgls_prepare3d(mglData *a, mglData *b=0)
-{
-  register long i,j,k,n=61,m=50,l=40,i0;
-  if(a) a->Create(n,m,l);   if(b) b->Create(n,m,l);
-  mreal x,y,z;
-  for(i=0;i<n;i++)  for(j=0;j<m;j++)  for(k=0;k<l;k++)
-  {
-    x=2*i/(n-1.)-1; y=2*j/(m-1.)-1; z=2*k/(l-1.)-1; i0 = i+n*(j+m*k);
-    if(a) a->a[i0] = -2*(x*x + y*y + z*z*z*z - z*z - 0.1);
-    if(b) b->a[i0] = 1-2*tanh((x+y)*(x+y));
-  }
-}
-@end verbatim
-or using C functions
-@verbatim
-void mgls_prepare3d(HMDT a, HMDT b=0)
-{
-  register long i,j,k,n=61,m=50,l=40,i0;
-  if(a) mgl_data_create(a,n,m,l);
-  if(b) mgl_data_create(b,n,m,l);
-  mreal x,y,z;
-  for(i=0;i<n;i++)  for(j=0;j<m;j++)  for(k=0;k<l;k++)
-  {
-    x=2*i/(n-1.)-1; y=2*j/(m-1.)-1; z=2*k/(l-1.)-1; i0 = i+n*(j+m*k);
-    if(a) mgl_data_set_value(a, -2*(x*x + y*y + z*z*z*z - z*z - 0.1), i,j,k);
-    if(b) mgl_data_set_value(b, 1-2*tanh((x+y)*(x+y)), i,j,k);
-  }
-}
-@end verbatim
-
-@menu
-* Surf3 sample::
-* Surf3C sample::
-* Surf3A sample::
-* Surf3CA sample::
-* Cloud sample::
-* Dens3 sample::
-* Cont3 sample::
-* ContF3 sample::
-* Dens projection sample::
-* Cont projection sample::
-* ContF projection sample::
-* TriPlot and QuadPlot::
-* Dots sample::
-* IFS sample::
-@end menu
-
-@c ------------------------------------------------------------------
-@external{}
-@node Surf3 sample, Surf3C sample, , 3D samples
-@subsection Surf3 sample
-@nav{}
-
-Function @ref{surf3} is one of most suitable (for my opinion) functions to visualize 3D data. It draw the isosurface(s) -- surface(s) of constant amplitude (3D analogue of contour lines). You can draw wired isosurfaces if specify @samp{#} style. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData c;  mgls_prepare3d(&c);
-  gr->Light(true);    gr->Alpha(true);
-  gr->SubPlot(2,2,0); gr->Title("Surf3 plot (default)");
-  gr->Rotate(50,60);  gr->Box();  gr->Surf3(c);
-
-  gr->SubPlot(2,2,1); gr->Title("'\\#' style");
-  gr->Rotate(50,60);  gr->Box();  gr->Surf3(c,"#");
-
-  gr->SubPlot(2,2,2); gr->Title("'.' style");
-  gr->Rotate(50,60);  gr->Box();  gr->Surf3(c,".");
-  return 0;
-}
-@end verbatim
-
-@pfig{surf3, Example of Surf3()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Surf3C sample, Surf3A sample, Surf3 sample, 3D samples
-@subsection Surf3C sample
-@nav{}
-
-Function @ref{surf3c} is similar to @ref{surf3} but its coloring is determined by another data. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData c,d;  mgls_prepare3d(&c,&d);
-  gr->Title("Surf3C plot"); gr->Rotate(50,60);
-  gr->Light(true);  gr->Alpha(true);
-  gr->Box();  gr->Surf3C(c,d);
-  return 0;
-}
-@end verbatim
-
-@pfig{surf3c, Example of Surf3C()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Surf3A sample, Surf3CA sample, Surf3C sample, 3D samples
-@subsection Surf3A sample
-@nav{}
-
-Function @ref{surf3a} is similar to @ref{surf3} but its transparency is determined by another data. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData c,d;  mgls_prepare3d(&c,&d);
-  gr->Title("Surf3A plot"); gr->Rotate(50,60);
-  gr->Light(true);  gr->Alpha(true);
-  gr->Box();  gr->Surf3A(c,d);
-  return 0;
-}
-@end verbatim
-
-@pfig{surf3a, Example of Surf3A()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Surf3CA sample, Cloud sample, Surf3A sample, 3D samples
-@subsection Surf3CA sample
-@nav{}
-
-Function @ref{surf3ca} is similar to @ref{surf3} but its color and transparency is determined by another data. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData c,d;  mgls_prepare3d(&c,&d);
-  gr->Title("Surf3CA plot"); gr->Rotate(50,60);
-  gr->Light(true);  gr->Alpha(true);
-  gr->Box();  gr->Surf3CA(c,d,c);
-  return 0;
-}
-@end verbatim
-
-@pfig{surf3ca, Example of Surf3CA()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Cloud sample, Dens3 sample, Surf3CA sample, 3D samples
-@subsection Cloud sample
-@nav{}
-
-Function @ref{cloud} draw cloud-like object which is less transparent for higher data values. Similar plot can be created using many (about 10-20) @code{Surf3A(a,a)} isosurfaces. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData c;  mgls_prepare3d(&c);
-  gr->SubPlot(2,2,0); gr->Title("Cloud plot");
-  gr->Rotate(50,60);  gr->Alpha(true);
-  gr->Box();  gr->Cloud(c,"wyrRk");
-
-  gr->SubPlot(2,2,1); gr->Title("'i' style");
-  gr->Rotate(50,60);  gr->Box();  gr->Cloud(c,"iwyrRk");
-
-  gr->SubPlot(2,2,2); gr->Title("'.' style");
-  gr->Rotate(50,60);  gr->Box();  gr->Cloud(c,".wyrRk");
-
-  gr->SubPlot(2,2,3); gr->Title("meshnum 10");
-  gr->Rotate(50,60);  gr->Box();  gr->Cloud(c,"wyrRk","meshnum 10");
-  return 0;
-}
-@end verbatim
-
-@pfig{cloud, Example of Cloud()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Dens3 sample, Cont3 sample, Cloud sample, 3D samples
-@subsection Dens3 sample
-@nav{}
-
-Function @ref{dens3} draw just usual density plot but at slices of 3D data. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData c;  mgls_prepare3d(&c);
-  gr->Title("Dens3 sample");  gr->Rotate(50,60);
-  gr->Alpha(true);  gr->SetAlphaDef(0.7);
-  gr->SetOrigin(0,0,0); gr->Axis("_xyz"); gr->Box();
-  gr->Dens3(c,"x"); gr->Dens3(c); gr->Dens3(c,"z");
-  return 0;
-}
-@end verbatim
-
-@pfig{densa, Example of Dens3()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Cont3 sample, ContF3 sample, Dens3 sample, 3D samples
-@subsection Cont3 sample
-@nav{}
-
-Function @ref{cont3} draw just usual contour lines but at slices of 3D data. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData c;  mgls_prepare3d(&c);
-  gr->Title("Cont3 sample");  gr->Rotate(50,60);
-  gr->Alpha(true);  gr->SetAlphaDef(0.7);
-  gr->SetOrigin(0,0,0); gr->Axis("_xyz"); gr->Box();
-  gr->Cont3(c,"x"); gr->Cont3(c); gr->Cont3(c,"z");
-  return 0;
-}
-@end verbatim
-
-@pfig{conta, Example of Cont3()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node ContF3 sample, Dens projection sample, Cont3 sample, 3D samples
-@subsection ContF3 sample
-@nav{}
-
-Function @ref{contf3} draw just usual filled contours but at slices of 3D data. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData c;  mgls_prepare3d(&c);
-  gr->Title("ContF3 sample");  gr->Rotate(50,60);
-  gr->Alpha(true);  gr->SetAlphaDef(0.7);
-  gr->SetOrigin(0,0,0); gr->Axis("_xyz"); gr->Box();
-  gr->ContF3(c,"x");  gr->ContF3(c);    gr->ContF3(c,"z");
-  gr->Cont3(c,"kx");  gr->Cont3(c,"k"); gr->Cont3(c,"kz");
-  return 0;
-}
-@end verbatim
-
-@pfig{contfa, Example of ContF3()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Dens projection sample, Cont projection sample, ContF3 sample, 3D samples
-@subsection Dens projection sample
-@nav{}
-
-Functions @ref{densz}, @ref{densy}, @ref{densx} draw density plot on plane perpendicular to corresponding axis. One of possible application is drawing projections of 3D field. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData c;  mgls_prepare3d(&c);
-  gr->Title("Dens[XYZ] sample");  gr->Rotate(50,60);
-  gr->Box();  gr->DensX(c.Sum("x"),0,-1);
-  gr->DensY(c.Sum("y"),0,1);  gr->DensZ(c.Sum("z"),0,-1);
-  return 0;
-}
-@end verbatim
-
-@pfig{dens_xyz, Example of DensX() DensY() DensZ()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Cont projection sample, ContF projection sample, Dens projection sample, 3D samples
-@subsection Cont projection sample
-@nav{}
-
-Functions @ref{contz}, @ref{conty}, @ref{contx} draw contour lines on plane perpendicular to corresponding axis. One of possible application is drawing projections of 3D field. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData c;  mgls_prepare3d(&c);
-  gr->Title("Cont[XYZ] sample");  gr->Rotate(50,60);
-  gr->Box();  gr->ContX(c.Sum("x"),"",-1);
-  gr->ContY(c.Sum("y"),"",1); gr->ContZ(c.Sum("z"),"",-1);
-  return 0;
-}
-@end verbatim
-
-@pfig{cont_xyz, Example of ContX() ContY() ContZ()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node ContF projection sample, TriPlot and QuadPlot, Cont projection sample, 3D samples
-@subsection ContF projection sample
-@nav{}
-
-Functions @ref{contfz}, @ref{contfy}, @ref{contfx} draw filled contours on plane perpendicular to corresponding axis. One of possible application is drawing projections of 3D field. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData c;  mgls_prepare3d(&c);
-  gr->Title("Cont[XYZ] sample");  gr->Rotate(50,60);
-  gr->Box();  gr->ContFX(c.Sum("x"),"",-1);
-  gr->ContFY(c.Sum("y"),"",1);  gr->ContFZ(c.Sum("z"),"",-1);
-  return 0;
-}
-@end verbatim
-
-@pfig{contf_xyz, Example of ContFX() ContFY() ContFZ()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node TriPlot and QuadPlot, Dots sample, ContF projection sample, 3D samples
-@subsection TriPlot and QuadPlot
-@nav{}
-
-Function @ref{triplot} and @ref{quadplot} draw set of triangles (or quadrangles for @code{QuadPlot}) for irregular data arrays. Note, that you have to provide not only vertexes, but also the indexes of triangles or quadrangles. I.e. perform triangulation by some other library. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mreal q[] = {0,1,2,3, 4,5,6,7, 0,2,4,6, 1,3,5,7, 0,4,1,5, 2,6,3,7};
-  mreal xc[] = {-1,1,-1,1,-1,1,-1,1}, yc[] = {-1,-1,1,1,-1,-1,1,1}, zc[] = {-1,-1,-1,-1,1,1,1,1};
-  mglData qq(6,4,q), xx(8,xc), yy(8,yc), zz(8,zc);
-  gr->Light(true);  //gr->Alpha(true);
-  gr->SubPlot(2,2,0); gr->Title("QuadPlot sample"); gr->Rotate(50,60);
-  gr->QuadPlot(qq,xx,yy,zz,"yr");
-  gr->QuadPlot(qq,xx,yy,zz,"k#");
-  gr->SubPlot(2,2,2); gr->Title("QuadPlot coloring"); gr->Rotate(50,60);
-  gr->QuadPlot(qq,xx,yy,zz,yy,"yr");
-  gr->QuadPlot(qq,xx,yy,zz,"k#");
-
-  mreal t[] = {0,1,2, 0,1,3, 0,2,3, 1,2,3};
-  mreal xt[] = {-1,1,0,0}, yt[] = {-1,-1,1,0}, zt[] = {-1,-1,-1,1};
-  mglData tt(4,3,t), uu(4,xt), vv(4,yt), ww(4,zt);
-  gr->SubPlot(2,2,1); gr->Title("TriPlot sample");  gr->Rotate(50,60);
-  gr->TriPlot(tt,uu,vv,ww,"b");
-  gr->TriPlot(tt,uu,vv,ww,"k#");
-  gr->SubPlot(2,2,3); gr->Title("TriPlot coloring");  gr->Rotate(50,60);
-  gr->TriPlot(tt,uu,vv,ww,vv,"cb");
-  gr->TriPlot(tt,uu,vv,ww,"k#");
-  gr->TriCont(tt,uu,vv,ww,"B");
-  return 0;
-}
-@end verbatim
-
-@pfig{triplot, Example of TriPlot() and QuadPlot()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Dots sample, IFS sample, TriPlot and QuadPlot, 3D samples
-@subsection Dots sample
-@nav{}
-
-Function @ref{dots} is another way to draw irregular points. @code{Dots} use color scheme for coloring (see @ref{Color scheme}). The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  int i, n=2000;
-  mglData x(n),y(n),z(n),c(n);
-  for(i=0;i<n;i++)
-  {
-    mreal t=M_PI*(mgl_rnd()-0.5), f=2*M_PI*mgl_rnd();
-    x.a[i] = 0.9*cos(t)*cos(f);
-    y.a[i] = 0.9*cos(t)*sin(f);
-    z.a[i] = 0.6*sin(t);
-    c.a[i] = cos(2*t);
-  }
-  gr->SubPlot(2,2,0); gr->Title("Dots sample");  gr->Rotate(50,60);
-  gr->Box();  gr->Dots(x,y,z);
-  gr->Alpha(true);
-  gr->SubPlot(2,2,1); gr->Title("add transparency"); gr->Rotate(50,60);
-  gr->Box();  gr->Dots(x,y,z,c);
-  gr->SubPlot(2,2,2); gr->Title("add coloring"); gr->Rotate(50,60);
-  gr->Box();  gr->Dots(x,y,z,x,c);
-  gr->SubPlot(2,2,3); gr->Title("Only coloring");gr->Rotate(50,60);
-  gr->Box();  gr->Tens(x,y,z,x," .");
-  return 0;
-}
-@end verbatim
-
-@pfig{dots, Example of Dots()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node IFS sample, , Dots sample, 3D samples
-@subsection IFS 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:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData A;
-  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);
-  mglData f(mglIFS2d(A,100000));
-  gr->SubPlot(1,1,0,"<_");
-  gr->Title("IFS 2d sample");
-  gr->SetRanges(f.SubData(0), f.SubData(1));
-  gr->Axis(); gr->Plot(f.SubData(0), f.SubData(1),"r#o ","size 0.05");
-}
-@end verbatim
-
-@pfig{ifs2d, Example of IFS fractal (2d case).}
-
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData A;
-  A.SetList(52, 0.,0.,0.,0.,.18,0.,0.,0.,0.,0.,0.,0.,.01, .85,0.,0.,0.,.85,.1,0.,-0.1,0.85,0.,1.6,0.,.85,
-                .2,-.2,0.,.2,.2,0.,0.,0.,0.3,0.,0.8,0.,.07, -.2,.2,0.,.2,.2,0.,0.,0.,0.3,0.,0.8,0.,.07);
-  A.Rearrange(13);
-  mglData f(mglIFS3d(A,100000));
-  gr->Title("IFS 3d sample");
-  gr->SetRanges(f.SubData(0), f.SubData(1), f.SubData(2));
-  gr->Rotate(50,60);  gr->Axis(); gr->Box();
-  gr->Dots(f.SubData(0), f.SubData(1), f.SubData(2),"G#o","size 0.05");
-}
-@end verbatim
-
-@pfig{ifs3d, Example of IFS fractal (3d case).}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Vector field samples, Hints, 3D samples, Examples
-@section Vector field samples
-@nav{}
-
-Vector field visualization (especially in 3d case) is more or less complex task. MathGL provides 3 general types of plots: vector field itself (@code{Vect}), flow threads (@code{Flow}), and flow pipes with radius proportional to field amplitude (@code{Pipe}).
-
-However, the plot may look tangly -- there are too many overlapping lines. I may suggest 2 ways to solve this problem. The first one is to change @code{SetMeshNum} for decreasing the number of hachures. The second way is to use the flow thread chart @code{Flow}, or possible many flow thread from manual position (@code{FlowP}). Unfortunately, I don't know any other methods to visualize 3d vector field. If you know any, e-mail me and I shall add it to MathGL.
-
-Most of samples will use the same data for plotting. So, I put its initialization in separate function
-@verbatim
-void mgls_prepare2v(mglData *a, mglData *b)
-{
-  register long i,j,n=20,m=30,i0;
-  if(a) a->Create(n,m);   if(b) b->Create(n,m);
-  mreal x,y;
-  for(i=0;i<n;i++)  for(j=0;j<m;j++)
-  {
-    x=i/(n-1.); y=j/(m-1.); i0 = i+n*j;
-    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);
-    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);
-  }
-}
-void mgls_prepare3v(mglData *ex, mglData *ey, mglData *ez)
-{
-  register long i,j,k,n=10,i0;
-  if(!ex || !ey || !ez) return;
-  ex->Create(n,n,n);  ey->Create(n,n,n);  ez->Create(n,n,n);
-  mreal x,y,z, r1,r2;
-  for(i=0;i<n;i++)  for(j=0;j<n;j++)  for(k=0;k<n;k++)
-  {
-    x=2*i/(n-1.)-1; y=2*j/(n-1.)-1; z=2*k/(n-1.)-1; i0 = i+n*(j+k*n);
-    r1 = pow(x*x+y*y+(z-0.3)*(z-0.3)+0.03,1.5);
-    r2 = pow(x*x+y*y+(z+0.3)*(z+0.3)+0.03,1.5);
-    ex->a[i0]=0.2*x/r1 - 0.2*x/r2;
-    ey->a[i0]=0.2*y/r1 - 0.2*y/r2;
-    ez->a[i0]=0.2*(z-0.3)/r1 - 0.2*(z+0.3)/r2;
-  }
-}
-@end verbatim
-or using C functions
-@verbatim
-void mgls_prepare2v(HMDT a, HMDT b)
-{
-  register long i,j,n=20,m=30,i0;
-  if(a) mgl_data_create(a,n,m,1);
-  if(b) mgl_data_create(b,n,m,1);
-  mreal x,y;
-  for(i=0;i<n;i++)  for(j=0;j<m;j++)
-  {
-    x=i/(n-1.); y=j/(m-1.); i0 = i+n*j;
-    if(a) mgl_data_set_value(a, 0.6*sin(2*M_PI*x)*sin(3*M_PI*y)+0.4*cos(3*M_PI*x*y), i,j,0);
-    if(b) mgl_data_set_value(b, 0.6*cos(2*M_PI*x)*cos(3*M_PI*y)+0.4*cos(3*M_PI*x*y), i,j,0);
-  }
-}
-void mgls_prepare3v(HMDT ex, HMDT ey, HMDT ez)
-{
-  register long i,j,k,n=10,i0;
-  if(!ex || !ey || !ez) return;
-  mgl_data_create(ex,n,n,n);
-  mgl_data_create(ey,n,n,n);
-  mgl_data_create(ez,n,n,n);
-  mreal x,y,z, r1,r2;
-  for(i=0;i<n;i++)  for(j=0;j<n;j++)  for(k=0;k<n;k++)
-  {
-    x=2*i/(n-1.)-1; y=2*j/(n-1.)-1; z=2*k/(n-1.)-1; i0 = i+n*(j+k*n);
-    r1 = pow(x*x+y*y+(z-0.3)*(z-0.3)+0.03,1.5);
-    r2 = pow(x*x+y*y+(z+0.3)*(z+0.3)+0.03,1.5);
-    mgl_data_set_value(ex, 0.2*x/r1 - 0.2*x/r2, i,j,k);
-    mgl_data_set_value(ey, 0.2*y/r1 - 0.2*y/r2, i,j,k);
-    mgl_data_set_value(ez, 0.2*(z-0.3)/r1 - 0.2*(z+0.3)/r2, i,j,k);
-  }
-}
-@end verbatim
-
-@menu
-* Vect sample::
-* Vect3 sample::
-* Traj sample::
-* Flow sample::
-* Pipe sample::
-* Dew sample::
-@end menu
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Vect sample, Vect3 sample, , Vector field samples
-@subsection Vect sample
-@nav{}
-
-Function @ref{vect} is most standard way to visualize vector fields -- it draw a lot of arrows or hachures for each data cell. It have a lot of options which can be seen on the figure (and in the sample code). @code{Vect} use color scheme for coloring (see @ref{Color scheme}). The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a,b;  mgls_prepare2v(&a,&b);
-  gr->SubPlot(3,2,0,""); gr->Title("Vect plot (default)");
-  gr->Box();  gr->Vect(a,b);
-
-  gr->SubPlot(3,2,1,"");  gr->Title("'.' style; '=' style");
-  gr->Box();  gr->Vect(a,b,"=.");
-
-  gr->SubPlot(3,2,2,"");  gr->Title("'f' style");
-  gr->Box();  gr->Vect(a,b,"f");
-
-  gr->SubPlot(3,2,3,"");  gr->Title("'>' style");
-  gr->Box();  gr->Vect(a,b,">");
-
-  gr->SubPlot(3,2,4,"");  gr->Title("'<' style");
-  gr->Box();  gr->Vect(a,b,"<");
-
-  mglData ex,ey,ez; mgls_prepare3v(&ex,&ey,&ez);
-  gr->SubPlot(3,2,5); gr->Title("3d variant");  gr->Rotate(50,60);
-  gr->Box();  gr->Vect(ex,ey,ez);
-  return 0;
-}
-@end verbatim
-
-@pfig{vect, Example of Vect()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Vect3 sample, Traj sample, Vect sample, Vector field samples
-@subsection Vect3 sample
-@nav{}
-
-Function @ref{vect3} draw just usual vector field plot but at slices of 3D data. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData ex,ey,ez; mgls_prepare3v(&ex,&ey,&ez);
-  gr->SubPlot(2,1,0); gr->Title("Vect3 sample");    gr->SetOrigin(0,0,0);
-  gr->Rotate(50,60);    gr->Axis("_xyz");   gr->Box();
-  gr->Vect3(ex,ey,ez,"x");  gr->Vect3(ex,ey,ez);    gr->Vect3(ex,ey,ez,"z");
-
-  gr->SubPlot(2,1,1);   gr->Title("'f' style");
-  gr->Rotate(50,60);    gr->Axis("_xyz");   gr->Box();
-  gr->Vect3(ex,ey,ez,"fx"); gr->Vect3(ex,ey,ez,"f");gr->Vect3(ex,ey,ez,"fz");
-  gr->Grid3(ex,"Wx");   gr->Grid3(ex,"W");  gr->Grid3(ex,"Wz");
-  return 0;
-}
-@end verbatim
-
-@pfig{vecta, Example of Vect3()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Traj sample, Flow sample, Vect3 sample, Vector field samples
-@subsection Traj sample
-@nav{}
-
-Function @ref{traj} is 1D analogue of @code{Vect}. It draw vectors from specified points. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData x,y,y1,y2;  mgls_prepare1d(&y,&y1,&y2,&x);
-  gr->SubPlot(1,1,0,""); gr->Title("Traj plot");
-  gr->Box();  gr->Plot(x,y);  gr->Traj(x,y,y1,y2);
-  return 0;
-}
-@end verbatim
-
-@pfig{traj, Example of Traj()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Flow sample, Pipe sample, Traj sample, Vector field samples
-@subsection Flow sample
-@nav{}
-
-Function @ref{flow} is another standard way to visualize vector fields -- it draw lines (threads) which is tangent to local vector field direction. MathGL draw threads from edges of bounding box and from central slices. Sometimes it is not most appropriate variant -- you may want to use @code{FlowP} to specify manual position of threads. @code{Flow} use color scheme for coloring (see @ref{Color scheme}). At this warm color corresponds to normal flow (like attractor), cold one corresponds to inverse flow (like source). The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a,b;  mgls_prepare2v(&a,&b);
-  gr->SubPlot(2,2,0,""); gr->Title("Flow plot (default)");
-  gr->Box();  gr->Flow(a,b);
-
-  gr->SubPlot(2,2,1,"");  gr->Title("'v' style");
-  gr->Box();  gr->Flow(a,b,"v");
-
-  gr->SubPlot(2,2,2,"");  gr->Title("'\\#' style");
-  gr->Box();  gr->Flow(a,b,"#");
-
-  mglData ex,ey,ez; mgls_prepare3v(&ex,&ey,&ez);
-  gr->SubPlot(2,2,3); gr->Title("3d variant");  gr->Rotate(50,60);
-  gr->Box();  gr->Flow(ex,ey,ez);
-  return 0;
-}
-@end verbatim
-
-@pfig{flow, Example of Flow()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Pipe sample, Dew sample, Flow sample, Vector field samples
-@subsection Pipe sample
-@nav{}
-
-Function @ref{pipe} is similar to @ref{flow} but draw pipes (tubes) which radius is proportional to the amplitude of vector field. @code{Pipe} use color scheme for coloring (see @ref{Color scheme}). At this warm color corresponds to normal flow (like attractor), cold one corresponds to inverse flow (like source). The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a,b;  mgls_prepare2v(&a,&b);
-  gr->SubPlot(2,2,0,""); gr->Title("Pipe plot (default)");
-  gr->Light(true);  gr->Box();  gr->Pipe(a,b);
-
-  gr->SubPlot(2,2,1,"");  gr->Title("'i' style");
-  gr->Box();  gr->Pipe(a,b,"i");
-
-  gr->SubPlot(2,2,2,"");  gr->Title("'\\#' style");
-  gr->Box();  gr->Pipe(a,b,"#");
-
-  mglData ex,ey,ez; mgls_prepare3v(&ex,&ey,&ez);
-  gr->SubPlot(2,2,3); gr->Title("3d variant");  gr->Rotate(50,60);
-  gr->Box();  gr->Pipe(ex,ey,ez,"",0.1);
-  return 0;
-}
-@end verbatim
-
-@pfig{pipe, Example of Pipe()}
-
-@c ------------------------------------------------------------------
-@external{}
-@node Dew sample, , Pipe sample, Vector field samples
-@subsection Dew sample
-@nav{}
-
-Function @ref{dew} is similar to @code{Vect} but use drops instead of arrows. The sample code is:
-@verbatim
-int sample(mglGraph *gr)
-{
-  mglData a,b;  mgls_prepare2v(&a,&b);
-  gr->SubPlot(1,1,0,""); gr->Title("Dew plot");
-  gr->Box();  gr->Light(true);  gr->Dew(a,b);
-  return 0;
-}
-@end verbatim
-
-@pfig{dew, Example of Dew()}
-
-
-@c ------------------------------------------------------------------
-@external{}
-@node Hints, FAQ, Vector field samples, Examples
+@node Hints, FAQ, Data plotting, Examples
 @section Hints
 @nav{}
 
@@ -3488,6 +1564,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 ------------------------------------------------------------------
@@ -4104,7 +2181,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
@@ -4131,6 +2208,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{}
@@ -4377,7 +2479,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{}
 
@@ -4409,6 +2511,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 63e269af966b3424ea93971d71e470635f620529..dbfde7322d75f134204932e31dc4323c3d5180b1 100644 (file)
@@ -50,6 +50,7 @@ This file documents the Mathematical Graphic Library (MathGL), a collection of c
 * MGL scripts::
 * UDAV::
 * Other classes::
+* All samples::
 * Symbols and hot-keys::
 * File formats::
 @ifhtml
@@ -104,10 +105,13 @@ This file documents the Mathematical Graphic Library (MathGL), a collection of c
 @node UDAV, Other classes, MGL scripts, Top
 @include udav_en.texi
 
-@node Other classes, Symbols and hot-keys, UDAV, Top
+@node Other classes, All samples, UDAV, Top
 @include other_en.texi
 
-@node Symbols and hot-keys, File formats, Other classes, Top
+@node All samples, Symbols and hot-keys, Other classes, Top
+@include samples.texi
+
+@node Symbols and hot-keys, File formats, All samples, Top
 @appendix Symbols and hot-keys
 @include symbols_en.texi
 
index 078911f8a76d8a573bb33f527066adc7dd8f2ed7..fe27816bedfcabff33e1b1432199d9b95165fe69 100644 (file)
@@ -50,6 +50,7 @@
 * MGL scripts::
 * UDAV::
 * Other classes::
+* All samples::
 * Symbols and hot-keys::
 * File formats::
 @ifhtml
 @node UDAV, Other classes, MGL scripts, Top
 @include udav_ru.texi
 
-@node Other classes, Symbols and hot-keys, UDAV, Top
-@include other_ru.texi
+@node Other classes, All samples, UDAV, Top
+@include other_en.texi
 
-@node Symbols and hot-keys, File formats, Other classes, Top
+@node All samples, Symbols and hot-keys, Other classes, Top
+@include samples.texi
+
+@node Symbols and hot-keys, File formats, All samples, Top
 @appendix Symbols and hot-keys
 @include symbols_ru.texi
 
index 78d32bca4fd907097718c8c13c43cfeafadcee64..2e02d9b21e96e2e517ef2a803aa39bd099df3f76 100644 (file)
@@ -47,6 +47,7 @@ This file documents the MGL script language. It corresponds to release @value{VE
 * MathGL core::
 * Data processing::
 * Examples::
+* All samples::
 * Symbols and hot-keys::
 * Copying This Manual::
 * Index::
@@ -82,10 +83,13 @@ This file documents the MGL script language. It corresponds to release @value{VE
 @node Data processing, Examples, MathGL core, Top
 @include data_en.texi
 
-@node Examples, Symbols and hot-keys, Data processing, Top
+@node Examples, All samples, Data processing, Top
 @include ex_mgl_en.texi
 
-@node Symbols and hot-keys, Copying This Manual, Examples, Top
+@node All samples, Symbols and hot-keys, Examples, Top
+@include samples.texi
+
+@node Symbols and hot-keys, Copying This Manual, All samples, Top
 @appendix Symbols and hot-keys
 @include symbols_en.texi
 
index 3246535703358e9c8e26a0b423bfcca32b1301f8..6f770acf6d3075497362bb2578b12076b01b52ff 100644 (file)
@@ -47,6 +47,7 @@
 * MathGL core::
 * Data processing::
 * Examples::
+* All samples::
 * Symbols and hot-keys::
 * Copying This Manual::
 * Index::
 @node Data processing, Examples, MathGL core, Top
 @include data_ru.texi
 
-@node Examples, Symbols and hot-keys, Data processing, Top
+@node Examples, All samples, Data processing, Top
 @include ex_mgl_ru.texi
 
-@node Symbols and hot-keys, Copying This Manual, Examples, Top
+@node All samples, Symbols and hot-keys, Examples, Top
+@include samples.texi
+
+@node Symbols and hot-keys, Copying This Manual, All samples, Top
 @appendix Symbols and hot-keys
 @include symbols_ru.texi
 
index fa03fd7617c7b39bd2d7e8190ad1cd72c2886e4b..223233441ce7c05e0e3716d0fdba23e56dc6433e 100644 (file)
@@ -11,6 +11,7 @@ MathGL library supports the simplest scripts for data handling and plotting. The
 @menu
 * MGL definition::
 * Program flow commands::
+* Special commentaries::
 * LaTeX package::
 @ifclear UDAV
 * mglParse class::
@@ -31,7 +32,12 @@ If string contain references to external parameters (substrings @samp{$0}, @samp
 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:
@@ -43,7 +49,7 @@ sub-arrays (like in @ref{subdata} command) as command argument. For example, @co
 any column combinations defined by formulas, like @code{a('n*w^2/exp(t)')} if names for data columns was specified (by @ref{idset} command or in the file at string started with @code{##}).
 
 @item
-any expression (without spaces) of existed variables produce temporary variable. For example, @samp{sqrt(dat(:,5)+1)} will produce temporary variable with data values equal to @code{tmp[i,j] = sqrt(dat[i,5,j]+1)}.
+any expression (without spaces) of existed variables produce temporary variable. For example, @samp{sqrt(dat(:,5)+1)} will produce temporary variable with data values equal to @code{tmp[i,j] = sqrt(dat[i,5,j]+1)}. At this symbol @samp{`} will return transposed data array: both @samp{`sqrt(dat(:,5)+1)} and @samp{sqrt(`dat(:,5)+1)} will produce temporary variable with data values equal to @code{tmp[i,j] = sqrt(dat[j,5,i]+1)}.
 
 @item
 temporary variable of higher dimensions by help of []. For example, @samp{[1,2,3]} will produce a temporary vector of 3 elements @{1, 2, 3@}; @samp{[[11,12],[21,22]]} will produce matrix 2*2 and so on. Here you can join even an arrays of the same dimensions by construction like @samp{[v1,v2,...,vn]}.
@@ -54,7 +60,7 @@ 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}).
 
@@ -70,7 +76,7 @@ fplot 'x^3' 'b'?'r|'
 
 @c ------------------------------------------------------------------
 @external{}
-@node Program flow commands, LaTeX package, MGL definition, MGL scripts
+@node Program flow commands, Special commentaries, MGL definition, MGL scripts
 @section Program flow commands
 @nav{}
 
@@ -137,21 +143,24 @@ Load additional MGL command from external module (DLL or .so), located in file @
 
 
 @cindex if
-@anchor{if}
-@deftypefn {MGL command} {} if dat 'cond'
-Starts block which will be executed if @var{dat} satisfy to @var{cond}.
+@anchor{if} @anchor{then}
+@deftypefn {MGL command} {} if @code{val} @strong{then} @code{CMD}
+Executes command @code{CMD} only if @code{val} is nonzero.
 @end deftypefn
 @deftypefn {MGL command} {} if @code{val}
 Starts block which will be executed if @code{val} is nonzero.
 @end deftypefn
+@deftypefn {MGL command} {} if dat 'cond'
+Starts block which will be executed if @var{dat} satisfy to @var{cond}.
+@end deftypefn
 @cindex elseif
 @anchor{elseif}
-@deftypefn {MGL command} {} elseif dat 'cond'
-Starts block which will be executed if previous @code{if} or @code{elseif} is false and @var{dat} satisfy to @var{cond}.
-@end deftypefn
 @deftypefn {MGL command} {} elseif @code{val}
 Starts block which will be executed if previous @code{if} or @code{elseif} is false and @code{val} is nonzero.
 @end deftypefn
+@deftypefn {MGL command} {} elseif dat 'cond'
+Starts block which will be executed if previous @code{if} or @code{elseif} is false and @var{dat} satisfy to @var{cond}.
+@end deftypefn
 @cindex else
 @anchor{else}
 @deftypefn {MGL command} {} else
@@ -166,15 +175,29 @@ Finishes @code{if/elseif/else} block.
 @cindex for
 @anchor{for}
 @deftypefn {MGL command} {} for $N @code{v1 v2 [dv=1]}
-Starts cycle with $@var{N}-th argument changing from @var{v1} to @var{v2} with the step @var{dv}. Here @var{N} is digit (0...9) or alpha (a...z).
+Starts loop with $@var{N}-th argument changing from @var{v1} to @var{v2} with the step @var{dv}. Here @var{N} is digit (0...9) or alpha (a...z).
 @end deftypefn
 @deftypefn {MGL command} {} for $N dat
-Starts cycle with $@var{N}-th argument changing for @var{dat} values. Here @var{N} is digit (0...9) or alpha (a...z).
+Starts loop with $@var{N}-th argument changing for @var{dat} values. Here @var{N} is digit (0...9) or alpha (a...z).
 @end deftypefn
 @cindex next
 @anchor{next}
 @deftypefn {MGL command} {} next
-Finishes @code{for} cycle.
+Finishes @code{for} loop.
+@end deftypefn
+
+@cindex do
+@anchor{do}
+@deftypefn {MGL command} {} do
+Starts infinite loop.
+@end deftypefn
+@cindex while
+@anchor{while}
+@deftypefn {MGL command} {} while @code{val}
+Continue loop iterations if @var{val} is nonzero, or finishes loop otherwise.
+@end deftypefn
+@deftypefn {MGL command} {} while dat 'cond'
+Continue loop iterations if @var{dat} satisfy to @var{cond}, or finishes loop otherwise.
 @end deftypefn
 
 @cindex once
@@ -201,13 +224,66 @@ Set variant of argument(s) separated by @samp{?} symbol to be used in further co
 Make one step for ordinary differential equation(s) @{var1' = eq1, ... @} with time-step @var{dt}. Here variable(s) @samp{var1}, ... are the ones, defined in MGL script previously. The Runge-Kutta 4-th order method is used for solution.
 @end deftypefn
 
+
+@c ------------------------------------------------------------------
+@external{}
+@node Special commentaries, LaTeX package, Program flow commands, MGL scripts
+@section Special commentaries
+@nav{}
+
+There are number of special commentaries for MGL script, which set some global behavior (like, animation, dialog for parameters and so on). All these special commentaries starts with double sign @code{##}. Let consider them.
+
+@table @samp
+@item @strong{##c} @code{v1 v2 [dv=1]}
+Sets the parameter for animation loop relative to variable @code{$0}. Here @var{v1} and @var{v2} are initial and final values, @var{dv} is the increment.
+
+@item @strong{##a} val
+Adds the parameter @var{val} to the list of animation relative to variable @code{$0}. You can use it several times (one parameter per line) or combine it with animation loop @strong{##c}.
+
+@item @strong{##d} $I kind|label|par1|par2|...
+Creates custom dialog for changing plot properties. Each line adds one widget to the dialog. Here @var{$I} is id ($0,$1...$9,$a,$b...$z), @var{label} is the label of widget, @var{kind} is the kind of the widget:
+@itemize @bullet
+@item
+       'e' for editor or input line (parameter is initial value) , 
+@item
+       'v' for spinner or counter (parameters are "ini|min|max|step|big_step"), 
+@item
+       's' for slider (parameters are "ini|min|max|step"), 
+@item
+       'b' for check box (parameter is "ini"; also understand "on"=1), 
+@item
+       'c' for choice (parameters are possible choices).
+@end itemize
+Now, it work in FLTK-based @code{mgllab} and @code{mglview} only.
+
+@ifclear UDAV
+You can make custom dialog in C/C++ code too by using one of following functions.
+
+@deftypefn {Method on @code{mglWnd}} @code{void} MakeDialog (@code{const char *}ids, @code{char const * const *}args, @code{const char *}title)
+@deftypefnx{Method on @code{mglWnd}} @code{void} MakeDialog (@code{const std::string &}ids, @code{const std::vector<std::string> &}args, @code{const char *}title)
+@deftypefnx {C function} @code{void} mgl_wnd_make_dialog (@code{HMGL} gr, @code{const char *}ids, @code{char const * const *}args, @code{const char *}title)
+Makes custom dialog for parameters ids of element properties defined by args.
+@end deftypefn
+
+At this you need to provide callback function for setting up properties. You can do it by overloading @code{Param()} function of @code{mglDraw} class or set it manually.
+
+@deftypefn {Method on @code{mglDraw}} @code{void} Param (@code{char} id, @code{const char *} val)
+@deftypefnx{Method on @code{mglWnd}} @code{void} SetPropFunc (@code{void (*}prop@code{)(char id, const char *val, void *p)}, @code{void *}par=@code{NULL})
+@deftypefnx {C function} @code{void} mgl_wnd_set_prop (@code{void (*}prop@code{)(char id, const char *val, void *p)}, @code{void *}par)
+Set callback function for properties setup.
+@end deftypefn
+
+@end ifclear
+
+@end table
+
 @c ------------------------------------------------------------------
 @external{}
 @ifclear UDAV
-@node LaTeX package, mglParse class, Program flow commands, MGL scripts
+@node LaTeX package, mglParse class, Special commentaries, MGL scripts
 @end ifclear
 @ifset UDAV
-@node LaTeX package, , Program flow commands, MGL scripts
+@node LaTeX package, , Special commentaries, MGL scripts
 @end ifset
 @section LaTeX package
 @nav{}
@@ -216,7 +292,7 @@ There is LaTeX package @code{mgltex} (was made by Diego Sejas Viscarra) which al
 
 For using this package you need to specify @code{--shell-escape} option for @emph{latex/pdflatex} or manually run @emph{mglconv} tool with produced MGL scripts for generation of images. Don't forgot to run @emph{latex/pdflatex} second time to insert generated images into the output document. Also you need to run @emph{pdflatex} third time to update converted from EPS images if you are using vector EPS output (default).
 
-The package may have following options: @code{draft}, @code{final} --- the same as in the @emph{graphicx} package; @code{on}, @code{off} --- to activate/deactivate the creation of scripts and graphics; @code{comments}, @code{nocomments} --- to make visible/invisible commentaries contained inside @code{mglcomment} environments; @code{jpg}, @code{jpeg}, @code{png} --- to export graphics as JPEG/PNG images; @code{eps}, @code{epsz} --- to export to uncompressed/compressed EPS format as primitives; @code{bps}, @code{bpsz} --- to export to uncompressed/compressed EPS format as bitmap (doesn't work with @emph{pdflatex}); @code{pdf} --- to export to 3D PDF; @code{tex} --- to export to @emph{LaTeX/tikz} document.
+The package may have following options: @code{draft}, @code{final} --- the same as in the @emph{graphicx} package; @code{on}, @code{off} --- to activate/deactivate the creation of scripts and graphics; @code{commentaries}, @code{nocommentaries} --- to make visible/invisible commentaries contained inside @code{mglcomment} environments; @code{jpg}, @code{jpeg}, @code{png} --- to export graphics as JPEG/PNG images; @code{eps}, @code{epsz} --- to export to uncompressed/compressed EPS format as primitives; @code{bps}, @code{bpsz} --- to export to uncompressed/compressed EPS format as bitmap (doesn't work with @emph{pdflatex}); @code{pdf} --- to export to 3D PDF; @code{tex} --- to export to @emph{LaTeX/tikz} document.
 
 The package defines the following environments:
 @table @samp
@@ -267,7 +343,7 @@ An example of usage of @samp{mgl} environment would be:
 @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, after the @ref{stop} command, which is also written automatically. The warning is produced if 2 or more function with the same name is defined.
 @item mglcomment
-       Is used to contain multiline commentaries. This commentaries will be visible/invisible in the output document, depending on the use of the package options @code{comments} and @code{nocomments} (see above), or the @code{\mglcomments} and @code{\mglnocomments} commands (see bellow).
+       Is used to contain multiline commentaries. This commentaries will be visible/invisible in the output document, depending on the use of the package options @code{commentaries} and @code{nocommentaries} (see above), or the @code{\mglcommentaries} and @code{\mglnocommentaries} commands (see bellow).
 @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 @samp{\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 @samp{\mglplot} command to use the corresponding block of code automatically (see below).
 @end table
@@ -410,6 +486,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)
@@ -448,10 +529,14 @@ 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=@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 f03006ae18ed455ff68210812bb60bda48ed6c3e..15c2fd185bef6119b0c46002ef978520f722ea6a 100644 (file)
@@ -11,6 +11,7 @@ MathGL имеет встроенный скриптовый язык MGL для
 @menu
 * MGL definition::
 * Program flow commands::
+* Special commentaries::
 * LaTeX package::
 @ifclear UDAV
 * mglParse class::
@@ -31,7 +32,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}. 
@@ -44,7 +50,7 @@ MathGL имеет встроенный скриптовый язык MGL для
 произвольные комбинации столбцов данных (например, @code{a('n*w^2/exp(t)')}), если столбцы данных были именованы командой @ref{idset} или в файле данных (в строке начинающейся с @code{##}).
 
 @item
-произвольное выражение из существующих переменных и констант. Например, @samp{sqrt(dat(:,5)+1)} даст временный массив данных с элементами равными @code{tmp[i,j] = sqrt(dat[i,5,j]+1)}.
+произвольное выражение из существующих переменных и констант. Например, @samp{sqrt(dat(:,5)+1)} даст временный массив данных с элементами равными @code{tmp[i,j] = sqrt(dat[i,5,j]+1)}. При этом символ @samp{`} возвращает транспонированный массив: @samp{`sqrt(dat(:,5)+1)} и @samp{sqrt(`dat(:,5)+1)} оба дадут временный массив данных с элементами равными @code{tmp[i,j] = sqrt(dat[j,5,i]+1)}.
 
 @item
 массивы с элементами заданными в квадратных скобках [], разделенные @samp{,}. При этом внутри выражения не должно быть пробелов! Например, @samp{[1,2,3]} даст временный массив из 3 элементов @{1, 2, 3@}; @samp{[[11,12],[21,22]]} даст матрицу 2*2 и т.д. Элементами такой конструкции могут быть и массивы если их размерности одинаковые, например @samp{[v1,v2,...,vn]}.
@@ -55,7 +61,7 @@ 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}).
 
@@ -68,13 +74,9 @@ variant 1
 fplot 'x^3' 'b'?'r|'
 @end verbatim
 
-
-
-@c TODO Translate it!
-
 @c ------------------------------------------------------------------
 @external{}
-@node Program flow commands, LaTeX package, MGL definition, MGL scripts
+@node Program flow commands, Special commentaries, MGL definition, MGL scripts
 @section Управление ходом выполнения
 @nav{}
 
@@ -143,13 +145,16 @@ fplot 'x^3' 'b'?'r|'
 
 
 @cindex if
-@anchor{if}
-@deftypefn {Команда MGL} {} if dat 'cond'
\9dаÑ\87инаеÑ\82 Ð±Ð»Ð¾Ðº ÐºÐ¾Ð¼Ð°Ð½Ð´, Ð²Ñ\8bполнÑ\8fемÑ\8bй ÐµÑ\81ли ÐºÐ°Ð¶Ð´Ñ\8bй Ñ\8dлеменÑ\82 @var{dat} Ñ\83довлеÑ\82воÑ\80Ñ\8fеÑ\82 Ñ\83Ñ\81ловиÑ\8e @var{cond}.
+@anchor{if} @anchor{then}
+@deftypefn {Команда MGL} {} if @code{val} @strong{then} @code{CMD}
\92Ñ\8bполнÑ\8fеÑ\82 ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ\83 @code{CMD} Ñ\82олÑ\8cко ÐµÑ\81ли @code{val} Ð½Ðµ Ð½Ð¾Ð»Ñ\8c.
 @end deftypefn
 @deftypefn {Команда MGL} {} if @code{val}
 Начинает блок команд, выполняемый если @code{val} не ноль.
 @end deftypefn
+@deftypefn {Команда MGL} {} if dat 'cond'
+Начинает блок команд, выполняемый если каждый элемент @var{dat} удовлетворяет условию @var{cond}.
+@end deftypefn
 @cindex elseif
 @anchor{elseif}
 @deftypefn {Команда MGL} {} elseif dat 'cond'
@@ -183,6 +188,20 @@ fplot 'x^3' 'b'?'r|'
 Заканчивает блок цикла @code{for}.
 @end deftypefn
 
+@cindex do
+@anchor{do}
+@deftypefn {Команда MGL} {} do
+Начинает бесконечный цикл.
+@end deftypefn
+@cindex while
+@anchor{while}
+@deftypefn {Команда MGL} {} while @code{val}
+Переходит к следующей итерации цикла если @var{val} не ноль, в противном случае заканчивает цикл.
+@end deftypefn
+@deftypefn {Команда MGL} {} while dat 'cond'
+Переходит к следующей итерации цикла если @var{dat} удовлетворяет условию @var{cond}, в противном случае заканчивает цикл.
+@end deftypefn
+
 @cindex once
 @anchor{once}
 @deftypefn {Команда MGL} {} once @code{val}
@@ -194,15 +213,12 @@ fplot 'x^3' 'b'?'r|'
 Останавливает выполнение скрипта.
 @end deftypefn
 
-
 @cindex variant
 @anchor{variant}
 @deftypefn {Команда MGL} {} variant @code{val}
 Задает вариант аргумента(ов), разделенных символом @samp{?}, для всех последующих комманд.
 @end deftypefn
 
-
-
 @cindex rkstep
 @anchor{rkstep}
 @deftypefn {Команда MGL} {} rkstep eq1;... var1;... [@code{dt=1}]
@@ -212,13 +228,65 @@ fplot 'x^3' 'b'?'r|'
 
 @c TODO Translate it!
 
+@c ------------------------------------------------------------------
+@external{}
+@node Special commentaries, LaTeX package, Program flow commands, MGL scripts
+@section Специальные комментарии
+@nav{}
+
+There are number of special commentaries for MGL script, which set some global behavior (like, animation, dialog for parameters and so on). All these special commentaries starts with double sign @code{##}. Let consider them.
+
+@table @samp
+@item @strong{##c} @code{v1 v2 [dv=1]}
+Sets the parameter for animation loop relative to variable @code{$0}. Here @var{v1} and @var{v2} are initial and final values, @var{dv} is the increment.
+
+@item @strong{##a} val
+Adds the parameter @var{val} to the list of animation relative to variable @code{$0}. You can use it several times (one parameter per line) or combine it with animation loop @strong{##c}.
+
+@item @strong{##d} $I kind|label|par1|par2|...
+Creates custom dialog for changing plot properties. Each line adds one widget to the dialog. Here @var{$I} is id ($0,$1...$9,$a,$b...$z), @var{label} is the label of widget, @var{kind} is the kind of the widget:
+@itemize @bullet
+@item
+       'e' for editor or input line (parameter is initial value) , 
+@item
+       'v' for spinner or counter (parameters are "ini|min|max|step|big_step"), 
+@item
+       's' for slider (parameters are "ini|min|max|step"), 
+@item
+       'b' for check box (parameter is "ini"; also understand "on"=1), 
+@item
+       'c' for choice (parameters are possible choices).
+@end itemize
+Now, it work in FLTK-based @code{mgllab} and @code{mglview} only.
+
+@ifclear UDAV
+You can make custom dialog in C/C++ code too by using one of following functions.
+
+@deftypefn {Method on @code{mglWnd}} @code{void} MakeDialog (@code{const char *}ids, @code{char const * const *}args, @code{const char *}title)
+@deftypefnx{Method on @code{mglWnd}} @code{void} MakeDialog (@code{const std::string &}ids, @code{const std::vector<std::string> &}args, @code{const char *}title)
+@deftypefnx {C function} @code{void} mgl_wnd_make_dialog (@code{HMGL} gr, @code{const char *}ids, @code{char const * const *}args, @code{const char *}title)
+Makes custom dialog for parameters ids of element properties defined by args.
+@end deftypefn
+
+At this you need to provide callback function for setting up properties. You can do it by overloading @code{Param()} function of @code{mglDraw} class or set it manually.
+
+@deftypefn {Method on @code{mglDraw}} @code{void} Param (@code{char} id, @code{const char *} val)
+@deftypefnx{Method on @code{mglWnd}} @code{void} SetPropFunc (@code{void (*}prop@code{)(char id, const char *val, void *p)}, @code{void *}par=@code{NULL})
+@deftypefnx {C function} @code{void} mgl_wnd_set_prop (@code{void (*}prop@code{)(char id, const char *val, void *p)}, @code{void *}par)
+Set callback function for properties setup.
+@end deftypefn
+
+@end ifclear
+
+@end table
+
 @c ------------------------------------------------------------------
 @external{}
 @ifclear UDAV
-@node LaTeX package, mglParse class, Program flow commands, MGL scripts
+@node LaTeX package, mglParse class, Special commentaries, MGL scripts
 @end ifclear
 @ifset UDAV
-@node LaTeX package, , Program flow commands, MGL scripts
+@node LaTeX package, , Special commentaries, MGL scripts
 @end ifset
 @section LaTeX package
 @nav{}
@@ -227,7 +295,7 @@ There is LaTeX package @code{mgltex} (was made by Diego Sejas Viscarra) which al
 
 For using this package you need to specify @code{--shell-escape} option for @emph{latex/pdflatex} or manually run @emph{mglconv} tool with produced MGL scripts for generation of images. Don't forgot to run @emph{latex/pdflatex} second time to insert generated images into the output document. Also you need to run @emph{pdflatex} third time to update converted from EPS images if you are using vector EPS output (default).
 
-The package may have following options: @code{draft}, @code{final} --- the same as in the @emph{graphicx} package; @code{on}, @code{off} --- to activate/deactivate the creation of scripts and graphics; @code{comments}, @code{nocomments} --- to make visible/invisible commentaries contained inside @code{mglcomment} environments; @code{jpg}, @code{jpeg}, @code{png} --- to export graphics as JPEG/PNG images; @code{eps}, @code{epsz} --- to export to uncompressed/compressed EPS format as primitives; @code{bps}, @code{bpsz} --- to export to uncompressed/compressed EPS format as bitmap (doesn't work with @emph{pdflatex}); @code{pdf} --- to export to 3D PDF; @code{tex} --- to export to @emph{LaTeX/tikz} document.
+The package may have following options: @code{draft}, @code{final} --- the same as in the @emph{graphicx} package; @code{on}, @code{off} --- to activate/deactivate the creation of scripts and graphics; @code{commentaries}, @code{nocommentaries} --- to make visible/invisible commentaries contained inside @code{mglcomment} environments; @code{jpg}, @code{jpeg}, @code{png} --- to export graphics as JPEG/PNG images; @code{eps}, @code{epsz} --- to export to uncompressed/compressed EPS format as primitives; @code{bps}, @code{bpsz} --- to export to uncompressed/compressed EPS format as bitmap (doesn't work with @emph{pdflatex}); @code{pdf} --- to export to 3D PDF; @code{tex} --- to export to @emph{LaTeX/tikz} document.
 
 The package defines the following environments:
 @table @samp
@@ -278,7 +346,7 @@ An example of usage of @samp{mgl} environment would be:
 @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, after the @ref{stop} command, which is also written automatically. The warning is produced if 2 or more function with the same name is defined.
 @item mglcomment
-       Is used to contain multiline commentaries. This commentaries will be visible/invisible in the output document, depending on the use of the package options @code{comments} and @code{nocomments} (see above), or the @code{\mglcomments} and @code{\mglnocomments} commands (see bellow).
+       Is used to contain multiline commentaries. This commentaries will be visible/invisible in the output document, depending on the use of the package options @code{commentaries} and @code{nocommentaries} (see above), or the @code{\mglcommentaries} and @code{\mglnocommentaries} commands (see bellow).
 @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 @samp{\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 @samp{\mglplot} command to use the corresponding block of code automatically (see below).
 @end table
@@ -422,6 +490,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)
@@ -464,6 +537,11 @@ As an additional feature, when an image is not found or cannot be included, inst
 Задает вариант аргумента(ов), разделенных символом @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)
index 16be5545591d5dc5c7e7be15bf223d507cff2a85..0c15b23722d899fafb56256e0e4ff3924a7b69bb 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};
 
@@ -54,11 +54,15 @@ start comment in @ref{MGL scripts} or in @ref{Command options}.
 denote parameter of @ref{MGL scripts}.
 
 @item %
-set color scheme along 2 coordinates @ref{Color scheme}.
+set color scheme along 2 coordinates @ref{Color scheme};
+
+operation in @ref{Textual formulas}.
 
 @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}.
 
@@ -81,10 +85,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});
@@ -116,6 +124,8 @@ stop color scheme parsing (see @ref{Color scheme});
 
 range operation in @ref{MGL scripts};
 
+style for @ref{axis};
+
 separator of commands in @ref{MGL scripts}.
 
 @item ;
@@ -123,7 +133,11 @@ line dashing style (see @ref{Line styles});
 
 one of mask for face filling (see @ref{Color scheme});
 
-start 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});
@@ -217,7 +231,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});
@@ -245,6 +261,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
@@ -272,6 +290,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
@@ -314,6 +334,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
@@ -353,7 +375,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});
@@ -485,12 +507,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
@@ -499,7 +524,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 16be5545591d5dc5c7e7be15bf223d507cff2a85..0c15b23722d899fafb56256e0e4ff3924a7b69bb 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};
 
@@ -54,11 +54,15 @@ start comment in @ref{MGL scripts} or in @ref{Command options}.
 denote parameter of @ref{MGL scripts}.
 
 @item %
-set color scheme along 2 coordinates @ref{Color scheme}.
+set color scheme along 2 coordinates @ref{Color scheme};
+
+operation in @ref{Textual formulas}.
 
 @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}.
 
@@ -81,10 +85,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});
@@ -116,6 +124,8 @@ stop color scheme parsing (see @ref{Color scheme});
 
 range operation in @ref{MGL scripts};
 
+style for @ref{axis};
+
 separator of commands in @ref{MGL scripts}.
 
 @item ;
@@ -123,7 +133,11 @@ line dashing style (see @ref{Line styles});
 
 one of mask for face filling (see @ref{Color scheme});
 
-start 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});
@@ -217,7 +231,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});
@@ -245,6 +261,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
@@ -272,6 +290,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
@@ -314,6 +334,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
@@ -353,7 +375,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});
@@ -485,12 +507,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
@@ -499,7 +524,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..a39ca5c22e2a3838751e672a94d010bacb01cd0c 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.0322 @tab 0.0627 @tab 0.0721 @tab 0.0425 @tab 0.11 @tab 0.136 @tab 0.0271
+@item alpha @tab 0.0892 @tab 0.108 @tab 0.113 @tab 0.0473 @tab 0.124 @tab 0.145 @tab 0.0297
+@item apde @tab 48.2 @tab 47.4 @tab 47.6 @tab 47.4 @tab 47.8 @tab 48.4 @tab 47.9
+@item area @tab 0.0376 @tab 0.0728 @tab 0.0752 @tab 0.033 @tab 0.141 @tab 0.165 @tab 0.0186
+@item aspect @tab 0.0442 @tab 0.0572 @tab 0.0551 @tab 0.031 @tab 0.0999 @tab 0.103 @tab 0.0146
+@item axial @tab 0.639 @tab 0.917 @tab 0.926 @tab 0.195 @tab 0.525 @tab 0.552 @tab 0.119
+@item axis @tab 0.0683 @tab 0.107 @tab 0.108 @tab 0.0466 @tab 0.196 @tab 0.202 @tab 0.0169
+@item barh @tab 0.0285 @tab 0.0547 @tab 0.0603 @tab 0.0292 @tab 0.101 @tab 0.115 @tab 0.0114
+@item bars @tab 0.0414 @tab 0.0703 @tab 0.0843 @tab 0.1 @tab 0.185 @tab 0.184 @tab 0.0295
+@item belt @tab 0.0286 @tab 0.0532 @tab 0.0577 @tab 0.0384 @tab 0.0735 @tab 0.1 @tab 0.0131
+@item bifurcation @tab 0.589 @tab 0.635 @tab 0.609 @tab 0.531 @tab 0.572 @tab 0.579 @tab 0.512
+@item box @tab 0.0682 @tab 0.0805 @tab 0.0828 @tab 0.0314 @tab 0.124 @tab 0.121 @tab 0.0169
+@item boxplot @tab 0.0102 @tab 0.0317 @tab 0.0347 @tab 0.02 @tab 0.0499 @tab 0.0554 @tab 0.0167
+@item boxs @tab 0.239 @tab 0.363 @tab 0.4 @tab 0.0798 @tab 0.216 @tab 0.234 @tab 0.0721
+@item candle @tab 0.0286 @tab 0.0549 @tab 0.053 @tab 0.0263 @tab 0.0483 @tab 0.0564 @tab 0.0109
+@item chart @tab 0.416 @tab 0.613 @tab 0.707 @tab 0.26 @tab 1.07 @tab 1.59 @tab 0.191
+@item cloud @tab 0.0312 @tab 4.15 @tab 4.11 @tab 0.0306 @tab 0.715 @tab 0.924 @tab 0.0168
+@item colorbar @tab 0.108 @tab 0.172 @tab 0.177 @tab 0.0787 @tab 0.258 @tab 0.266 @tab 0.0452
+@item combined @tab 0.36 @tab 0.336 @tab 0.332 @tab 0.198 @tab 0.316 @tab 0.33 @tab 0.196
+@item cones @tab 0.145 @tab 0.139 @tab 0.14 @tab 0.0937 @tab 0.248 @tab 0.276 @tab 0.0363
+@item cont @tab 0.0987 @tab 0.141 @tab 0.141 @tab 0.0585 @tab 0.207 @tab 0.194 @tab 0.0455
+@item cont3 @tab 0.0323 @tab 0.058 @tab 0.0587 @tab 0.0304 @tab 0.0726 @tab 0.0837 @tab 0.0162
+@item cont_xyz @tab 0.0417 @tab 0.0585 @tab 0.0612 @tab 0.0417 @tab 0.0833 @tab 0.0845 @tab 0.0294
+@item contd @tab 0.191 @tab 0.245 @tab 0.236 @tab 0.104 @tab 0.189 @tab 0.201 @tab 0.0902
+@item contf @tab 0.162 @tab 0.179 @tab 0.182 @tab 0.0789 @tab 0.166 @tab 0.177 @tab 0.067
+@item contf3 @tab 0.123 @tab 0.12 @tab 0.134 @tab 0.065 @tab 0.123 @tab 0.155 @tab 0.0538
+@item contf_xyz @tab 0.0751 @tab 0.0922 @tab 0.111 @tab 0.0756 @tab 0.0879 @tab 0.0956 @tab 0.0462
+@item contv @tab 0.0947 @tab 0.123 @tab 0.136 @tab 0.0757 @tab 0.163 @tab 0.18 @tab 0.0469
+@item correl @tab 0.0339 @tab 0.0629 @tab 0.0599 @tab 0.0288 @tab 0.115 @tab 0.138 @tab 0.0165
+@item curvcoor @tab 0.112 @tab 0.164 @tab 0.171 @tab 0.0864 @tab 0.296 @tab 0.298 @tab 0.0739
+@item cut @tab 0.695 @tab 0.465 @tab 0.484 @tab 0.303 @tab 0.385 @tab 0.371 @tab 0.316
+@item dat_diff @tab 0.0457 @tab 0.079 @tab 0.0825 @tab 0.0346 @tab 0.136 @tab 0.158 @tab 0.0186
+@item dat_extra @tab 0.175 @tab 0.181 @tab 0.173 @tab 0.0877 @tab 0.163 @tab 0.173 @tab 0.0463
+@item data1 @tab 2.39 @tab 1.76 @tab 1.75 @tab 1.33 @tab 1.38 @tab 1.37 @tab 1.4
+@item data2 @tab 1.42 @tab 1.26 @tab 1.28 @tab 1.17 @tab 1.24 @tab 1.29 @tab 1.14
+@item dens @tab 0.0867 @tab 0.122 @tab 0.131 @tab 0.0615 @tab 0.145 @tab 0.168 @tab 0.032
+@item dens3 @tab 0.0722 @tab 0.0769 @tab 0.0937 @tab 0.0437 @tab 0.0947 @tab 0.151 @tab 0.0797
+@item dens_xyz @tab 0.0599 @tab 0.0875 @tab 0.0961 @tab 0.0463 @tab 0.089 @tab 0.0897 @tab 0.0315
+@item detect @tab 0.133 @tab 0.151 @tab 0.176 @tab 0.0861 @tab 0.116 @tab 0.138 @tab 0.0721
+@item dew @tab 1.48 @tab 1.07 @tab 0.971 @tab 0.473 @tab 0.537 @tab 0.416 @tab 0.195
+@item diffract @tab 0.0878 @tab 0.127 @tab 0.139 @tab 0.0607 @tab 0.219 @tab 0.237 @tab 0.0274
+@item dilate @tab 0.0778 @tab 0.128 @tab 0.138 @tab 0.0592 @tab 0.242 @tab 0.232 @tab 0.0298
+@item dots @tab 0.0685 @tab 0.1 @tab 0.101 @tab 0.0694 @tab 0.134 @tab 0.129 @tab 0.0261
+@item earth @tab 0.0147 @tab 0.033 @tab 0.0218 @tab 0.0168 @tab 0.0168 @tab 0.0191 @tab 0.00177
+@item error @tab 0.0312 @tab 0.0707 @tab 0.0709 @tab 0.0288 @tab 0.135 @tab 0.137 @tab 0.016
+@item error2 @tab 0.0581 @tab 0.0964 @tab 0.0958 @tab 0.0595 @tab 0.173 @tab 0.187 @tab 0.0444
+@item export @tab 0.116 @tab 0.158 @tab 0.167 @tab 0.0799 @tab 0.132 @tab 0.133 @tab 0.0685
+@item fall @tab 0.035 @tab 0.051 @tab 0.0577 @tab 0.018 @tab 0.0585 @tab 0.0709 @tab 0.0142
+@item fexport @tab 1.52 @tab 1.76 @tab 1.78 @tab 0.278 @tab 0.604 @tab 0.606 @tab 1.35
+@item fit @tab 0.0371 @tab 0.0653 @tab 0.0666 @tab 0.0277 @tab 0.081 @tab 0.0837 @tab 0.014
+@item flame2d @tab 5.37 @tab 5.54 @tab 5.5 @tab 3.04 @tab 3.21 @tab 3.09 @tab 1.13
+@item flow @tab 0.368 @tab 0.451 @tab 0.444 @tab 0.36 @tab 0.5 @tab 0.48 @tab 0.352
+@item fog @tab 0.0406 @tab 0.0645 @tab 0.0688 @tab 0.0379 @tab 0.0793 @tab 0.0894 @tab 0.0156
+@item fonts @tab 0.0477 @tab 0.0926 @tab 0.112 @tab 0.0347 @tab 0.0518 @tab 0.0519 @tab 0.0413
+@item grad @tab 0.0607 @tab 0.104 @tab 0.129 @tab 0.0715 @tab 0.103 @tab 0.12 @tab 0.0633
+@item hist @tab 0.125 @tab 0.148 @tab 0.159 @tab 0.0919 @tab 0.116 @tab 0.129 @tab 0.0372
+@item ifs2d @tab 0.594 @tab 0.623 @tab 0.62 @tab 0.315 @tab 0.349 @tab 0.33 @tab 0.109
+@item ifs3d @tab 0.787 @tab 0.777 @tab 0.784 @tab 0.294 @tab 0.353 @tab 0.366 @tab 0.117
+@item indirect @tab 0.0286 @tab 0.0517 @tab 0.0543 @tab 0.031 @tab 0.0612 @tab 0.104 @tab 0.0144
+@item inplot @tab 0.0687 @tab 0.0979 @tab 0.0993 @tab 0.0622 @tab 0.181 @tab 0.195 @tab 0.0444
+@item iris @tab 0.00846 @tab 0.025 @tab 0.0198 @tab 0.00349 @tab 0.0172 @tab 0.0182 @tab 0.0018
+@item label @tab 0.0285 @tab 0.045 @tab 0.058 @tab 0.0267 @tab 0.0525 @tab 0.0618 @tab 0.014
+@item lamerey @tab 0.0305 @tab 0.0372 @tab 0.0455 @tab 0.019 @tab 0.0604 @tab 0.0633 @tab 0.0024
+@item legend @tab 0.0764 @tab 0.202 @tab 0.207 @tab 0.0455 @tab 0.138 @tab 0.148 @tab 0.0162
+@item light @tab 0.0903 @tab 0.129 @tab 0.122 @tab 0.0573 @tab 0.132 @tab 0.144 @tab 0.021
+@item loglog @tab 0.103 @tab 0.168 @tab 0.16 @tab 0.0806 @tab 0.228 @tab 0.235 @tab 0.0802
+@item map @tab 0.0303 @tab 0.0653 @tab 0.0721 @tab 0.0337 @tab 0.0821 @tab 0.0866 @tab 0.015
+@item mark @tab 0.0191 @tab 0.0324 @tab 0.0368 @tab 0.0261 @tab 0.0533 @tab 0.045 @tab 0.0072
+@item mask @tab 0.0442 @tab 0.0964 @tab 0.101 @tab 0.0343 @tab 0.205 @tab 0.211 @tab 0.0115
+@item mesh @tab 0.034 @tab 0.0774 @tab 0.0682 @tab 0.0192 @tab 0.0765 @tab 0.0742 @tab 0.0145
+@item mirror @tab 0.092 @tab 0.128 @tab 0.142 @tab 0.0607 @tab 0.174 @tab 0.176 @tab 0.0312
+@item molecule @tab 0.0827 @tab 0.0842 @tab 0.0859 @tab 0.0443 @tab 0.0997 @tab 0.146 @tab 0.0115
+@item ode @tab 0.149 @tab 0.202 @tab 0.202 @tab 0.147 @tab 0.282 @tab 0.316 @tab 0.133
+@item ohlc @tab 0.0059 @tab 0.0278 @tab 0.0271 @tab 0.0152 @tab 0.0517 @tab 0.045 @tab 0.0152
+@item param1 @tab 0.161 @tab 0.252 @tab 0.26 @tab 0.0941 @tab 0.301 @tab 0.341 @tab 0.0466
+@item param2 @tab 0.535 @tab 0.58 @tab 0.539 @tab 0.26 @tab 0.452 @tab 0.475 @tab 0.189
+@item param3 @tab 1.75 @tab 2.37 @tab 2.32 @tab 0.677 @tab 0.899 @tab 0.907 @tab 0.758
+@item paramv @tab 1.21 @tab 1.39 @tab 1.36 @tab 0.788 @tab 0.974 @tab 0.968 @tab 0.69
+@item parser @tab 0.0346 @tab 0.0582 @tab 0.0687 @tab 0.0317 @tab 0.108 @tab 0.11 @tab 0.0275
+@item pde @tab 0.329 @tab 0.358 @tab 0.373 @tab 0.272 @tab 0.311 @tab 0.364 @tab 0.264
+@item pendelta @tab 0.0653 @tab 0.0525 @tab 0.0648 @tab 0.0517 @tab 0.0531 @tab 0.0522 @tab 0.0653
+@item pipe @tab 0.598 @tab 0.737 @tab 0.738 @tab 0.382 @tab 0.493 @tab 0.505 @tab 0.34
+@item plot @tab 0.0397 @tab 0.0642 @tab 0.114 @tab 0.0444 @tab 0.123 @tab 0.118 @tab 0.0194
+@item pmap @tab 0.0913 @tab 0.115 @tab 0.125 @tab 0.0572 @tab 0.0999 @tab 0.113 @tab 0.0469
+@item primitives @tab 0.0581 @tab 0.108 @tab 0.128 @tab 0.0649 @tab 0.181 @tab 0.21 @tab 0.00928
+@item projection @tab 0.13 @tab 0.264 @tab 0.286 @tab 0.0704 @tab 0.351 @tab 0.349 @tab 0.0683
+@item projection5 @tab 0.117 @tab 0.207 @tab 0.215 @tab 0.0717 @tab 0.3 @tab 0.312 @tab 0.0437
+@item pulse @tab 0.0273 @tab 0.0395 @tab 0.0413 @tab 0.0183 @tab 0.0576 @tab 0.0635 @tab 0.0023
+@item qo2d @tab 0.218 @tab 0.246 @tab 0.274 @tab 0.198 @tab 0.243 @tab 0.255 @tab 0.177
+@item quality0 @tab 0.0859 @tab 0.0902 @tab 0.087 @tab 0.0808 @tab 0.0808 @tab 0.0823 @tab 0.0796
+@item quality1 @tab 0.189 @tab 0.166 @tab 0.171 @tab 0.175 @tab 0.17 @tab 0.173 @tab 0.166
+@item quality2 @tab 0.183 @tab 0.183 @tab 0.175 @tab 0.172 @tab 0.171 @tab 0.183 @tab 0.184
+@item quality4 @tab 0.082 @tab 0.0713 @tab 0.0728 @tab 0.0636 @tab 0.0843 @tab 0.0651 @tab 0.0592
+@item quality5 @tab 0.366 @tab 0.359 @tab 0.363 @tab 0.366 @tab 0.354 @tab 0.356 @tab 0.357
+@item quality6 @tab 0.373 @tab 0.367 @tab 0.365 @tab 0.366 @tab 0.368 @tab 0.383 @tab 0.366
+@item quality8 @tab 0.0193 @tab 0.019 @tab 0.0289 @tab 0.0298 @tab 0.0165 @tab 0.0244 @tab 0.0229
+@item radar @tab 0.0193 @tab 0.0369 @tab 0.0545 @tab 0.0158 @tab 0.0525 @tab 0.0532 @tab 0.0115
+@item refill @tab 0.153 @tab 0.168 @tab 0.166 @tab 0.0746 @tab 0.239 @tab 0.258 @tab 0.0467
+@item region @tab 0.0396 @tab 0.0723 @tab 0.0859 @tab 0.0342 @tab 0.133 @tab 0.159 @tab 0.017
+@item scanfile @tab 0.0315 @tab 0.036 @tab 0.0497 @tab 0.0169 @tab 0.0486 @tab 0.053 @tab 0.014
+@item schemes @tab 0.0703 @tab 0.114 @tab 0.117 @tab 0.062 @tab 0.204 @tab 0.21 @tab 0.019
+@item section @tab 0.0294 @tab 0.0483 @tab 0.054 @tab 0.0221 @tab 0.0804 @tab 0.0821 @tab 0.00568
+@item several_light @tab 0.0441 @tab 0.0541 @tab 0.0701 @tab 0.0299 @tab 0.0602 @tab 0.0815 @tab 0.0117
+@item solve @tab 0.0461 @tab 0.109 @tab 0.105 @tab 0.0462 @tab 0.18 @tab 0.191 @tab 0.0184
+@item stem @tab 0.0418 @tab 0.0599 @tab 0.0591 @tab 0.0308 @tab 0.126 @tab 0.139 @tab 0.015
+@item step @tab 0.0399 @tab 0.0614 @tab 0.0554 @tab 0.0315 @tab 0.0958 @tab 0.113 @tab 0.0145
+@item stereo @tab 0.0569 @tab 0.0652 @tab 0.0811 @tab 0.031 @tab 0.0807 @tab 0.093 @tab 0.0163
+@item stfa @tab 0.0425 @tab 0.117 @tab 0.111 @tab 0.0416 @tab 0.115 @tab 0.121 @tab 0.0157
+@item style @tab 0.0892 @tab 0.197 @tab 0.204 @tab 0.0596 @tab 0.349 @tab 0.369 @tab 0.0158
+@item surf @tab 0.109 @tab 0.133 @tab 0.157 @tab 0.0657 @tab 0.16 @tab 0.158 @tab 0.0315
+@item surf3 @tab 1.79 @tab 2.6 @tab 2.57 @tab 0.949 @tab 2.36 @tab 2.44 @tab 0.625
+@item surf3a @tab 0.431 @tab 0.281 @tab 0.297 @tab 0.176 @tab 0.235 @tab 0.252 @tab 0.178
+@item surf3c @tab 0.423 @tab 0.285 @tab 0.301 @tab 0.175 @tab 0.202 @tab 0.265 @tab 0.177
+@item surf3ca @tab 0.428 @tab 0.303 @tab 0.31 @tab 0.176 @tab 0.203 @tab 0.265 @tab 0.19
+@item surfa @tab 0.0409 @tab 0.0577 @tab 0.0714 @tab 0.0265 @tab 0.062 @tab 0.0725 @tab 0.0154
+@item surfc @tab 0.0422 @tab 0.0453 @tab 0.058 @tab 0.0282 @tab 0.0628 @tab 0.0749 @tab 0.0161
+@item surfca @tab 0.0416 @tab 0.0598 @tab 0.058 @tab 0.0254 @tab 0.0541 @tab 0.0671 @tab 0.015
+@item table @tab 0.103 @tab 0.213 @tab 0.214 @tab 0.0484 @tab 0.112 @tab 0.117 @tab 0.0156
+@item tape @tab 0.0409 @tab 0.0784 @tab 0.0836 @tab 0.0347 @tab 0.124 @tab 0.138 @tab 0.0164
+@item tens @tab 0.0329 @tab 0.0485 @tab 0.0441 @tab 0.0279 @tab 0.0805 @tab 0.0757 @tab 0.00561
+@item ternary @tab 0.104 @tab 0.218 @tab 0.214 @tab 0.0634 @tab 0.393 @tab 0.425 @tab 0.0352
+@item text @tab 0.0827 @tab 0.156 @tab 0.15 @tab 0.0261 @tab 0.114 @tab 0.127 @tab 0.015
+@item text2 @tab 0.0719 @tab 0.12 @tab 0.131 @tab 0.115 @tab 0.129 @tab 0.137 @tab 0.016
+@item textmark @tab 0.0403 @tab 0.0749 @tab 0.0788 @tab 0.0223 @tab 0.0607 @tab 0.0653 @tab 0.014
+@item ticks @tab 0.0868 @tab 0.193 @tab 0.195 @tab 0.0611 @tab 0.259 @tab 0.249 @tab 0.0275
+@item tile @tab 0.0349 @tab 0.0444 @tab 0.0597 @tab 0.0308 @tab 0.0546 @tab 0.0547 @tab 0.0111
+@item tiles @tab 0.0393 @tab 0.0585 @tab 0.0534 @tab 0.0205 @tab 0.0648 @tab 0.0597 @tab 0.0174
+@item torus @tab 0.114 @tab 0.197 @tab 0.193 @tab 0.0713 @tab 0.394 @tab 0.457 @tab 0.0306
+@item traj @tab 0.0251 @tab 0.0413 @tab 0.043 @tab 0.0178 @tab 0.0628 @tab 0.0968 @tab 0.0129
+@item triangulation @tab 0.0328 @tab 0.0659 @tab 0.0792 @tab 0.0319 @tab 0.0966 @tab 0.0888 @tab 0.0155
+@item triplot @tab 0.0302 @tab 0.0705 @tab 0.102 @tab 0.0198 @tab 0.0973 @tab 0.127 @tab 0.0143
+@item tube @tab 0.077 @tab 0.143 @tab 0.192 @tab 0.0593 @tab 0.191 @tab 0.21 @tab 0.0197
+@item type0 @tab 0.177 @tab 0.172 @tab 0.198 @tab 0.0673 @tab 0.141 @tab 0.2 @tab 0.0576
+@item type1 @tab 0.174 @tab 0.173 @tab 0.2 @tab 0.0648 @tab 0.153 @tab 0.17 @tab 0.0571
+@item type2 @tab 0.188 @tab 0.198 @tab 0.197 @tab 0.0773 @tab 0.186 @tab 0.193 @tab 0.0647
+@item vect @tab 0.129 @tab 0.336 @tab 0.194 @tab 0.0608 @tab 0.174 @tab 0.177 @tab 0.043
+@item vect3 @tab 0.0317 @tab 0.0781 @tab 0.0869 @tab 0.0366 @tab 0.155 @tab 0.159 @tab 0.0174
+@item venn @tab 0.0153 @tab 0.0503 @tab 0.0787 @tab 0.0115 @tab 0.0665 @tab 0.075 @tab 0.00249
 @end multitable
index 5a2b9f8cef0ed73168ce43f51404b3342c1091cb..208e989d627f5c082d9d00bb071bcc3be0f576a9 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.0763 @tab 0.134 @tab 0.157 @tab 0.0764 @tab 0.198 @tab 0.207 @tab 0.0598
+@item alpha @tab 0.111 @tab 0.176 @tab 0.254 @tab 0.104 @tab 0.244 @tab 0.272 @tab 0.0591
+@item apde @tab 48 @tab 47.6 @tab 47.5 @tab 47.1 @tab 47.2 @tab 47.7 @tab 47
+@item area @tab 0.0783 @tab 0.169 @tab 0.245 @tab 0.107 @tab 0.277 @tab 0.335 @tab 0.0408
+@item aspect @tab 0.0622 @tab 0.105 @tab 0.129 @tab 0.0638 @tab 0.185 @tab 0.234 @tab 0.0478
+@item axial @tab 0.681 @tab 1.38 @tab 1.61 @tab 0.297 @tab 0.878 @tab 1.12 @tab 0.141
+@item axis @tab 0.0863 @tab 0.153 @tab 0.17 @tab 0.0773 @tab 0.274 @tab 0.297 @tab 0.0479
+@item barh @tab 0.0631 @tab 0.118 @tab 0.134 @tab 0.0661 @tab 0.218 @tab 0.259 @tab 0.049
+@item bars @tab 0.0654 @tab 0.126 @tab 0.153 @tab 0.0803 @tab 0.28 @tab 0.318 @tab 0.0479
+@item belt @tab 0.0624 @tab 0.11 @tab 0.133 @tab 0.0614 @tab 0.228 @tab 0.354 @tab 0.0454
+@item bifurcation @tab 0.604 @tab 0.696 @tab 0.758 @tab 0.602 @tab 0.656 @tab 0.692 @tab 0.572
+@item box @tab 0.081 @tab 0.152 @tab 0.211 @tab 0.0754 @tab 0.204 @tab 0.238 @tab 0.0516
+@item boxplot @tab 0.0458 @tab 0.072 @tab 0.108 @tab 0.0493 @tab 0.106 @tab 0.12 @tab 0.0329
+@item boxs @tab 0.276 @tab 0.623 @tab 0.823 @tab 0.131 @tab 0.387 @tab 0.52 @tab 0.0935
+@item candle @tab 0.0566 @tab 0.1 @tab 0.113 @tab 0.059 @tab 0.126 @tab 0.154 @tab 0.0435
+@item chart @tab 0.46 @tab 1.08 @tab 1.78 @tab 0.377 @tab 2.57 @tab 3.84 @tab 0.19
+@item cloud @tab 0.0618 @tab 5.78 @tab 6.76 @tab 0.061 @tab 1.49 @tab 2.72 @tab 0.0441
+@item colorbar @tab 0.144 @tab 0.259 @tab 0.297 @tab 0.142 @tab 0.383 @tab 0.455 @tab 0.075
+@item combined @tab 0.429 @tab 0.457 @tab 0.556 @tab 0.286 @tab 0.474 @tab 0.564 @tab 0.245
+@item cones @tab 0.17 @tab 0.226 @tab 0.272 @tab 0.157 @tab 0.521 @tab 0.667 @tab 0.0624
+@item cont @tab 0.0989 @tab 0.193 @tab 0.235 @tab 0.0952 @tab 0.285 @tab 0.304 @tab 0.0637
+@item cont3 @tab 0.0645 @tab 0.11 @tab 0.122 @tab 0.0629 @tab 0.13 @tab 0.152 @tab 0.0479
+@item cont_xyz @tab 0.0676 @tab 0.105 @tab 0.129 @tab 0.0628 @tab 0.134 @tab 0.148 @tab 0.0523
+@item contd @tab 0.237 @tab 0.307 @tab 0.368 @tab 0.151 @tab 0.294 @tab 0.346 @tab 0.106
+@item contf @tab 0.193 @tab 0.262 @tab 0.305 @tab 0.136 @tab 0.274 @tab 0.322 @tab 0.0921
+@item contf3 @tab 0.169 @tab 0.206 @tab 0.3 @tab 0.117 @tab 0.232 @tab 0.353 @tab 0.0796
+@item contf_xyz @tab 0.118 @tab 0.18 @tab 0.206 @tab 0.103 @tab 0.177 @tab 0.231 @tab 0.0661
+@item contv @tab 0.131 @tab 0.226 @tab 0.259 @tab 0.114 @tab 0.282 @tab 0.334 @tab 0.0753
+@item correl @tab 0.0578 @tab 0.108 @tab 0.115 @tab 0.0616 @tab 0.193 @tab 0.216 @tab 0.0463
+@item curvcoor @tab 0.125 @tab 0.203 @tab 0.219 @tab 0.12 @tab 0.454 @tab 0.504 @tab 0.0933
+@item cut @tab 0.768 @tab 0.661 @tab 0.73 @tab 0.43 @tab 0.53 @tab 0.669 @tab 0.431
+@item dat_diff @tab 0.0922 @tab 0.151 @tab 0.193 @tab 0.092 @tab 0.235 @tab 0.274 @tab 0.0439
+@item dat_extra @tab 0.202 @tab 0.236 @tab 0.263 @tab 0.132 @tab 0.254 @tab 0.292 @tab 0.0747
+@item data1 @tab 2.62 @tab 2.07 @tab 2.14 @tab 1.43 @tab 1.69 @tab 1.83 @tab 1.56
+@item data2 @tab 1.51 @tab 1.41 @tab 1.49 @tab 1.22 @tab 1.43 @tab 1.44 @tab 1.24
+@item dens @tab 0.115 @tab 0.236 @tab 0.32 @tab 0.134 @tab 0.271 @tab 0.327 @tab 0.0746
+@item dens3 @tab 0.101 @tab 0.154 @tab 0.214 @tab 0.0981 @tab 0.173 @tab 0.244 @tab 0.0429
+@item dens_xyz @tab 0.102 @tab 0.179 @tab 0.242 @tab 0.119 @tab 0.164 @tab 0.22 @tab 0.0495
+@item detect @tab 0.17 @tab 0.283 @tab 0.357 @tab 0.129 @tab 0.217 @tab 0.293 @tab 0.0927
+@item dew @tab 1.63 @tab 1.1 @tab 1.19 @tab 0.557 @tab 0.797 @tab 0.881 @tab 0.288
+@item diffract @tab 0.0961 @tab 0.253 @tab 0.346 @tab 0.114 @tab 0.382 @tab 0.43 @tab 0.0508
+@item dilate @tab 0.098 @tab 0.231 @tab 0.259 @tab 0.101 @tab 0.347 @tab 0.404 @tab 0.0539
+@item dots @tab 0.0986 @tab 0.139 @tab 0.167 @tab 0.106 @tab 0.24 @tab 0.221 @tab 0.223
+@item earth @tab 0.0455 @tab 0.0532 @tab 0.0659 @tab 0.0448 @tab 0.0404 @tab 0.0592 @tab 0.0294
+@item error @tab 0.0764 @tab 0.128 @tab 0.134 @tab 0.0758 @tab 0.203 @tab 0.227 @tab 0.076
+@item error2 @tab 0.0739 @tab 0.166 @tab 0.188 @tab 0.0934 @tab 0.374 @tab 0.416 @tab 0.0608
+@item export @tab 0.177 @tab 0.273 @tab 0.382 @tab 0.131 @tab 0.244 @tab 0.312 @tab 0.0968
+@item fall @tab 0.0481 @tab 0.127 @tab 0.114 @tab 0.051 @tab 0.115 @tab 0.125 @tab 0.0442
+@item fexport @tab 2.33 @tab 2.69 @tab 2.81 @tab 1.12 @tab 1.43 @tab 1.52 @tab 2.19
+@item fit @tab 0.072 @tab 0.112 @tab 0.121 @tab 0.0657 @tab 0.154 @tab 0.166 @tab 0.0442
+@item flame2d @tab 6.16 @tab 6.34 @tab 6.31 @tab 3.71 @tab 3.91 @tab 3.75 @tab 1.26
+@item flow @tab 0.43 @tab 0.529 @tab 0.557 @tab 0.403 @tab 0.582 @tab 0.599 @tab 0.372
+@item fog @tab 0.0651 @tab 0.146 @tab 0.209 @tab 0.07 @tab 0.172 @tab 0.242 @tab 0.0466
+@item fonts @tab 0.0842 @tab 0.13 @tab 0.135 @tab 0.0669 @tab 0.0969 @tab 0.0965 @tab 0.0696
+@item grad @tab 0.111 @tab 0.223 @tab 0.318 @tab 0.133 @tab 0.216 @tab 0.284 @tab 0.0783
+@item hist @tab 0.185 @tab 0.227 @tab 0.25 @tab 0.136 @tab 0.234 @tab 0.253 @tab 0.0632
+@item ifs2d @tab 0.7 @tab 0.777 @tab 0.762 @tab 0.396 @tab 0.457 @tab 0.443 @tab 0.133
+@item ifs3d @tab 0.827 @tab 0.835 @tab 0.893 @tab 0.369 @tab 0.45 @tab 0.484 @tab 0.127
+@item indirect @tab 0.0579 @tab 0.0904 @tab 0.116 @tab 0.0599 @tab 0.128 @tab 0.152 @tab 0.0316
+@item inplot @tab 0.0931 @tab 0.151 @tab 0.19 @tab 0.107 @tab 0.32 @tab 0.329 @tab 0.0601
+@item iris @tab 0.0446 @tab 0.0544 @tab 0.0751 @tab 0.0468 @tab 0.0457 @tab 0.0578 @tab 0.0371
+@item label @tab 0.0484 @tab 0.0879 @tab 0.105 @tab 0.0601 @tab 0.112 @tab 0.164 @tab 0.078
+@item lamerey @tab 0.0723 @tab 0.0728 @tab 0.0978 @tab 0.0611 @tab 0.104 @tab 0.154 @tab 0.0522
+@item legend @tab 0.123 @tab 0.282 @tab 0.3 @tab 0.0796 @tab 0.232 @tab 0.311 @tab 0.041
+@item light @tab 0.12 @tab 0.186 @tab 0.448 @tab 0.104 @tab 0.22 @tab 0.417 @tab 0.0528
+@item loglog @tab 0.136 @tab 0.252 @tab 0.252 @tab 0.125 @tab 0.405 @tab 0.481 @tab 0.0956
+@item map @tab 0.0768 @tab 0.157 @tab 0.195 @tab 0.0734 @tab 0.168 @tab 0.232 @tab 0.0471
+@item mark @tab 0.0659 @tab 0.0909 @tab 0.0881 @tab 0.0718 @tab 0.239 @tab 0.151 @tab 0.0372
+@item mask @tab 0.0878 @tab 0.207 @tab 0.326 @tab 0.0944 @tab 0.279 @tab 0.347 @tab 0.0511
+@item mesh @tab 0.0719 @tab 0.131 @tab 0.163 @tab 0.0683 @tab 0.147 @tab 0.181 @tab 0.0418
+@item mirror @tab 0.135 @tab 0.217 @tab 0.259 @tab 0.105 @tab 0.296 @tab 0.308 @tab 0.0548
+@item molecule @tab 0.0979 @tab 0.146 @tab 0.237 @tab 0.0953 @tab 0.241 @tab 0.361 @tab 0.044
+@item ode @tab 0.193 @tab 0.28 @tab 0.29 @tab 0.191 @tab 0.419 @tab 0.436 @tab 0.163
+@item ohlc @tab 0.0482 @tab 0.071 @tab 0.0936 @tab 0.0574 @tab 0.109 @tab 0.121 @tab 0.0447
+@item param1 @tab 0.186 @tab 0.348 @tab 0.424 @tab 0.15 @tab 0.545 @tab 0.845 @tab 0.0861
+@item param2 @tab 0.57 @tab 0.732 @tab 0.806 @tab 0.313 @tab 0.698 @tab 0.827 @tab 0.23
+@item param3 @tab 1.91 @tab 2.56 @tab 2.93 @tab 0.767 @tab 1.17 @tab 1.58 @tab 0.844
+@item paramv @tab 1.29 @tab 1.55 @tab 1.5 @tab 0.816 @tab 1.12 @tab 1.11 @tab 0.718
+@item parser @tab 0.0631 @tab 0.112 @tab 0.14 @tab 0.0643 @tab 0.209 @tab 0.232 @tab 0.0467
+@item pde @tab 0.37 @tab 0.511 @tab 0.554 @tab 0.318 @tab 0.429 @tab 0.455 @tab 0.284
+@item pendelta @tab 0.108 @tab 0.115 @tab 0.102 @tab 0.108 @tab 0.115 @tab 0.104 @tab 0.105
+@item pipe @tab 0.661 @tab 0.922 @tab 1.04 @tab 0.414 @tab 0.669 @tab 0.828 @tab 0.36
+@item plot @tab 0.0961 @tab 0.116 @tab 0.142 @tab 0.0932 @tab 0.22 @tab 0.237 @tab 0.0457
+@item pmap @tab 0.137 @tab 0.184 @tab 0.216 @tab 0.0994 @tab 0.165 @tab 0.21 @tab 0.0737
+@item primitives @tab 0.0978 @tab 0.191 @tab 0.289 @tab 0.0971 @tab 0.304 @tab 0.353 @tab 0.0386
+@item projection @tab 0.166 @tab 0.403 @tab 0.484 @tab 0.124 @tab 0.578 @tab 0.626 @tab 0.078
+@item projection5 @tab 0.149 @tab 0.323 @tab 0.36 @tab 0.117 @tab 0.496 @tab 0.546 @tab 0.0722
+@item pulse @tab 0.0488 @tab 0.0751 @tab 0.0911 @tab 0.0503 @tab 0.112 @tab 0.13 @tab 0.0347
+@item qo2d @tab 0.252 @tab 0.389 @tab 0.455 @tab 0.244 @tab 0.354 @tab 0.414 @tab 0.208
+@item quality0 @tab 0.112 @tab 0.112 @tab 0.119 @tab 0.119 @tab 0.11 @tab 0.123 @tab 0.114
+@item quality1 @tab 0.239 @tab 0.254 @tab 0.24 @tab 0.24 @tab 0.252 @tab 0.26 @tab 0.232
+@item quality2 @tab 0.276 @tab 0.273 @tab 0.272 @tab 0.277 @tab 0.275 @tab 0.274 @tab 0.278
+@item quality4 @tab 0.107 @tab 0.104 @tab 0.103 @tab 0.104 @tab 0.104 @tab 0.112 @tab 0.107
+@item quality5 @tab 0.455 @tab 0.448 @tab 0.46 @tab 0.466 @tab 0.45 @tab 0.45 @tab 0.456
+@item quality6 @tab 0.489 @tab 0.478 @tab 0.48 @tab 0.489 @tab 0.48 @tab 0.479 @tab 0.492
+@item quality8 @tab 0.0575 @tab 0.0467 @tab 0.0453 @tab 0.0439 @tab 0.047 @tab 0.0462 @tab 0.0486
+@item radar @tab 0.058 @tab 0.0675 @tab 0.0872 @tab 0.07 @tab 0.0969 @tab 0.123 @tab 0.0284
+@item refill @tab 0.186 @tab 0.232 @tab 0.278 @tab 0.129 @tab 0.356 @tab 0.389 @tab 0.07
+@item region @tab 0.0706 @tab 0.166 @tab 0.21 @tab 0.0803 @tab 0.274 @tab 0.3 @tab 0.0442
+@item scanfile @tab 0.0563 @tab 0.0769 @tab 0.0884 @tab 0.0469 @tab 0.0891 @tab 0.106 @tab 0.0341
+@item schemes @tab 0.121 @tab 0.227 @tab 0.283 @tab 0.189 @tab 0.284 @tab 0.338 @tab 0.0454
+@item section @tab 0.0593 @tab 0.0948 @tab 0.0974 @tab 0.0622 @tab 0.159 @tab 0.175 @tab 0.0417
+@item several_light @tab 0.076 @tab 0.109 @tab 0.244 @tab 0.0697 @tab 0.123 @tab 0.246 @tab 0.0442
+@item solve @tab 0.0925 @tab 0.188 @tab 0.195 @tab 0.108 @tab 0.344 @tab 0.334 @tab 0.0485
+@item stem @tab 0.0633 @tab 0.129 @tab 0.145 @tab 0.0827 @tab 0.203 @tab 0.212 @tab 0.0407
+@item step @tab 0.0632 @tab 0.102 @tab 0.114 @tab 0.112 @tab 0.183 @tab 0.194 @tab 0.0447
+@item stereo @tab 0.0901 @tab 0.126 @tab 0.206 @tab 0.0807 @tab 0.151 @tab 0.237 @tab 0.0441
+@item stfa @tab 0.0925 @tab 0.245 @tab 0.291 @tab 0.0801 @tab 0.214 @tab 0.299 @tab 0.0438
+@item style @tab 0.114 @tab 0.271 @tab 0.321 @tab 0.102 @tab 0.44 @tab 0.468 @tab 0.0451
+@item surf @tab 0.149 @tab 0.241 @tab 0.303 @tab 0.12 @tab 0.24 @tab 0.319 @tab 0.0498
+@item surf3 @tab 2.01 @tab 3.41 @tab 3.44 @tab 1.41 @tab 3.34 @tab 3.33 @tab 0.667
+@item surf3a @tab 0.514 @tab 0.397 @tab 0.537 @tab 0.24 @tab 0.397 @tab 0.74 @tab 0.205
+@item surf3c @tab 0.482 @tab 0.4 @tab 0.533 @tab 0.235 @tab 0.423 @tab 0.728 @tab 0.208
+@item surf3ca @tab 0.494 @tab 0.401 @tab 0.536 @tab 0.26 @tab 0.402 @tab 0.709 @tab 0.243
+@item surfa @tab 0.0643 @tab 0.105 @tab 0.181 @tab 0.0572 @tab 0.122 @tab 0.192 @tab 0.0456
+@item surfc @tab 0.0644 @tab 0.111 @tab 0.184 @tab 0.0609 @tab 0.128 @tab 0.199 @tab 0.0399
+@item surfca @tab 0.0645 @tab 0.106 @tab 0.181 @tab 0.0696 @tab 0.128 @tab 0.201 @tab 0.044
+@item table @tab 0.128 @tab 0.263 @tab 0.29 @tab 0.0813 @tab 0.176 @tab 0.197 @tab 0.0481
+@item tape @tab 0.0779 @tab 0.143 @tab 0.167 @tab 0.0788 @tab 0.224 @tab 0.242 @tab 0.0463
+@item tens @tab 0.0605 @tab 0.0956 @tab 0.0935 @tab 0.0699 @tab 0.146 @tab 0.162 @tab 0.046
+@item ternary @tab 0.13 @tab 0.334 @tab 0.357 @tab 0.116 @tab 0.589 @tab 0.65 @tab 0.061
+@item text @tab 0.11 @tab 0.214 @tab 0.225 @tab 0.0678 @tab 0.172 @tab 0.19 @tab 0.0438
+@item text2 @tab 0.0809 @tab 0.175 @tab 0.189 @tab 0.0797 @tab 0.22 @tab 0.235 @tab 0.0425
+@item textmark @tab 0.0742 @tab 0.129 @tab 0.14 @tab 0.0574 @tab 0.126 @tab 0.143 @tab 0.0438
+@item ticks @tab 0.126 @tab 0.252 @tab 0.274 @tab 0.111 @tab 0.329 @tab 0.359 @tab 0.0488
+@item tile @tab 0.062 @tab 0.091 @tab 0.135 @tab 0.0605 @tab 0.11 @tab 0.156 @tab 0.0613
+@item tiles @tab 0.06 @tab 0.119 @tab 0.158 @tab 0.0604 @tab 0.129 @tab 0.163 @tab 0.0466
+@item torus @tab 0.148 @tab 0.277 @tab 0.391 @tab 0.121 @tab 0.817 @tab 1.19 @tab 0.0653
+@item traj @tab 0.0476 @tab 0.0899 @tab 0.108 @tab 0.0559 @tab 0.153 @tab 0.162 @tab 0.0336
+@item triangulation @tab 0.0622 @tab 0.159 @tab 0.218 @tab 0.0667 @tab 0.173 @tab 0.244 @tab 0.0451
+@item triplot @tab 0.0494 @tab 0.181 @tab 0.371 @tab 0.0608 @tab 0.181 @tab 0.32 @tab 0.0308
+@item tube @tab 0.108 @tab 0.286 @tab 0.373 @tab 0.104 @tab 0.311 @tab 0.379 @tab 0.0493
+@item type0 @tab 0.238 @tab 0.326 @tab 0.5 @tab 0.144 @tab 0.314 @tab 0.479 @tab 0.108
+@item type1 @tab 0.237 @tab 0.34 @tab 0.531 @tab 0.137 @tab 0.317 @tab 0.5 @tab 0.102
+@item type2 @tab 0.243 @tab 0.335 @tab 0.509 @tab 0.148 @tab 0.317 @tab 0.484 @tab 0.115
+@item vect @tab 0.11 @tab 0.248 @tab 0.328 @tab 0.127 @tab 0.354 @tab 0.325 @tab 0.0732
+@item vect3 @tab 0.0692 @tab 0.153 @tab 0.173 @tab 0.0884 @tab 0.526 @tab 0.366 @tab 0.0356
+@item venn @tab 0.0494 @tab 0.194 @tab 0.289 @tab 0.0664 @tab 0.158 @tab 0.236 @tab 0.044
 @end multitable
index 150c2723042eed0b3179ffc5047e69d7927675b6..a97f4770abb2559305b7e530914eb168db0a6258 100644 (file)
@@ -1,4 +1,4 @@
-@set VERSION ${MathGL_VERSION_MAJOR}.${MathGL_VERSION_MINOR}
+@set VERSION ${MathGL_VERSION_MAJOR}.${MathGL_VERSION_MINOR}.${MathGL_PATCH_VERSION}
 @set MINVER 
-@set MINVER .1
+@c @set MINVER .1
 @set NIGHT ${MGL_NIGHT}
index 5a71907b5aa0b869e4cfb1b341abcd0233f138e3..f8c5d807f31472b79d1ca46d81a6e29c378f4c8e 100644 (file)
@@ -1,16 +1,19 @@
-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
-2.3.1 Released 21 October 2014
-2.3 Released 7 August 2014
-2.2.2.1 Released 19 March 2014
-2.2.2 Released 10 March 2014
-2.2.1 Released 22 January 2014
-2.2 Released 11 November 2013
-2.1.3.1 Released 8 May 2013
-2.1.3 Released 2 May 2013
+2.4.2  Released 21 March 2018
+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
+2.3.1  Released 21 October 2014
+2.3    Released 7 August 2014
+2.2.2.1        Released 19 March 2014
+2.2.2  Released 10 March 2014
+2.2.1  Released 22 January 2014
+2.2    Released 11 November 2013
+2.1.3.1        Released 8 May 2013
+2.1.3  Released 2 May 2013
 2.1.2  Released 28 January 2013
 2.1.1  Released 24 December 2012
 2.1    Released 13 December 2012
index 62510b160986b1ccd9f35a29986fe3dc1bffd3a4..9f85a00a34de322e827b10aade3d5453665f0717 100644 (file)
@@ -53,13 +53,11 @@ Generally, MathGL is GPL library. However, you can use LGPL license for MathGL c
 @strong{Latest news}
 @itemize
 
-@item @strong{20 June 2016.}
-New version (v.@value{VERSION}@value{MINVER}) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are compatibility changes and bugfixes. @strong{NOTE}: there is incompatible change -- the library libmgl-qt is removed. You need to use libmgl-qt4 or libmgl-qt5 explicitly to reduce the possible error of wrong Qt libs linking.
+@item @strong{21 March 2018.}
+New version (v.2.4.2) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There area custom dialog for FLTK widgets (see @ref{Special commentaries}); display of execution @ref{progress}; new plots @ref{contp}, @ref{flow3}; style of plots @ref{cont}, @ref{flow}, @ref{tube}; change drawing for @ref{axis}, @ref{colorbar}; data handling (@ref{coil}) and setup (@ref{scaletext}, @ref{setup}) functions; modulo operation @samp{@code{%}} in formulas; automatic omit points for all curves; new section @ref{All samples} of documentation; speeding up and bugfixes.
 
-@item @emph{16 May 2016.}
-New version (v.2.3.5) 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 @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}.
@@ -79,299 +77,113 @@ Javascript interface was developed with support of @url{http://www.datadvance.ne
 
 @itemize
 
-@item @strong{20 June 2016.}
-New version (v.2.3.5.1) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are compatibility changes and bugfixes. @strong{INCOMPATIBLE}: the library libmgl-qt is removed. You need to use libmgl-qt4 or libmgl-qt5 explicitly to reduce the possible error of wrong Qt libs linking.
-
-@item @strong{16 May 2016.}
-New version (v.2.3.5) 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{21 March 2018.}
+New version (v.2.4.2) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released.
 @itemize @bullet
-@item Update @ref{LaTeX package} (thanks to Diego Sejas Viscarra)
 
-@itemize @bullet
-@item
-@code{\MGL@@codes}: Bugfix: category code for tabulators is changed too
-@item
-@code{\MGL@@quality}: 9 is accepted as quality value now
-@item
-@code{\MGL@@scale}: Now accepts any positive value
-@item
-@code{\MGL@@test@@switch}: New command to verify and validate switching arguments
-@item
-@code{\mglTeX}: Add a small negative space in the logo, between the "mgl" and "TEX"
-@item
-@code{\mglTeX}: Declared now as robust command
-@item
-@code{\mglcomments}: Now accepts arguments 0 (equivalent to @code{off}) and 1 (equivalent to @code{on}), besides the usual @code{off} and @code{on}
-@item
-@code{\mglgraphics}: New command options: @code{gray, mglscale, quality, variant}
-@item
-@code{\mglname}: Now writes the MGL code line @samp{setsize 600 400} to the main script
-@item
-@code{\mglplot}: Added @code{\bgroup} and @code{\egroup} in order to keep changes private
-@item
-New command options: @code{gray, mglscale, quality, variant}
-@item
-@code{\mglsettings}: Added options @code{gray} and @code{variant}
-@item
-Now calls the @code{\mglswitch} and @code{\mglcomments} commands for the switch and comments options, respectively
-@item
-@code{\mglswitch}: Now accepts arguments 0 (equivalent to @code{off}) and 1 (equivalent to @code{on}), besides the usual @code{off} and @code{on}
-@item
-mglTeX now depends on the ifpdf package
-@item
-Change definition of @code{\mglcommentname} from MGL comment to mglTEX comment
-@item
-Introduce the concept of global, local and private settings in the documentation
-@item
-New commands: @code{\mglgray} (to activate/deactivate) gray-scale mode locally, and @code{\mglvariant} (to set variant of arguments in MGL scripts locally)
-@item
-New package option @code{9q} for setting quality to 9 (for testing purposes of the author)
-@item
-New package options @code{0v, 1v, 2v} to select variant of arguments in MGL scripts
-@item
-New package options @code{gray, color} to activate/deactivate gray-scale mode for graphics
-@item
-Remove the @code{\MGL@@setkeys} command, since it isn’t needed as first thought
-@item
-Rename @code{\MGL@@document@@scripts} to @code{\MGL@@doc@@scripts}
-@item
-Rename @code{\MGL@@script@@name} to @code{\MGL@@script}
-@item
-Rename command @code{\MGL@@graph@@ext} to @code{\MGL@@imgext}
-@item
-Rename command @code{\mglcommonscriptname} to @code{\mglsetupscriptname}
-@item
-Rename environment @code{mglcommon} to @code{mglsetupscript} (@code{mglcommon} is still available, but deprecated)
-@item
-Rename family @code{MGL@@keys} as @code{MGL@@gr@@keys} for consistency
-@item
-Reorganize and update documentation
-@item
-Some minor bugfixes
-@item
-The MGL code line @samp{setsize 600 400} is now automatically written to the main script in order for the scaling options and commands to work
-@item
-@code{mgl}: New environment options: gray, mglscale, quality, variant
-@item
-@code{\mglcode}: New environment options: gray, mglscale, quality, variant
-@end itemize
-
-@item
-Add MGL command @ref{variant} to select proper variant of arguments (like @samp{var1?var2?var3?...}) in MGL commands.
-@item
-Remove limitation of maximal number (was 1000) of arguments for MGL commands. This is actual for 'list' command.
-@item
-Add mglWnd::Widget() for accessing widget which is used for drawing.
-@item
-Add @ref{gray} for producing gray-scaled image.
-@item
-Add MGL command @ref{setsizescl} for scaling all further @ref{setsize}.
-@item
-Add @ref{shear} for shearing plot.
-@item
-Add @ref{shearplot} for placing plots side-by-side with some shearing.
-@item
-Add @ref{limit} for limit maximal absolute value of data.
-@item
-Add @ref{tridmat} for tridiagonal matrix algorithm.
-@item
-Add MGL command @ref{diffract} for single step diffraction calculation.
-@item
-Add @ref{ifsfile} for reading IFS fractal parameters from *.ifs file.
-@item
-Add style @samp{*} for 2d versions of @ref{flow} to draw threads from points inside axis range.
-@item
-Add @samp{norm()} to the list of known functions
-@item
-Compatibility changes for MS VisualStudio, MacOS, Win64.
-@item
-Bugfix for legend export into EPS and SVG.
-@item
-Bugfix for importing data from std::vector.
-@item
-Improve Surf3*() drawing.
-@item
-Force NAN if divided by 0 in formulas.
-@item
-Option "-S" of mglconv now perform scaling in any cases
-@end itemize
+@item Add custom dialog for FLTK widgets. This can be constructed from C/C++ code, or from MGL script using @ref{Special commentaries}.
+@item Add @ref{progress} for displaying the progress of execution (by '#' symbols in console, or by progress-bar widget).
 
-@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 Add @ref{contp} for contour lines on parametrically specified surface.
+@item Add @ref{flow3} for flow threads of 3D vector field, which start from the plain.
+@item Add variant of @ref{flow} for drawing a flow thread, starting from specified point.
+@item Add @ref{scaletext} for disabling text size scaling in relative @ref{inplot}-s (like @ref{columnplot}, ...).
+@item Add @ref{setup} for setting all low-level flags.
 
-@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{coil} for projecting periodical data.
+@item Add modulo operation @samp{@code{%}} (@code{x%y=fmod(x,y)}) to the list of known operations in real-valued formulas.
 
-@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 style @samp{.} for @ref{cont} to draw contour lines from saddle points.
+@item Add style @samp{.} for @ref{flow} to draw flow thread from saddle points.
+@item Add option @code{value} in @ref{tube} for setting number of edges manually.
+@item Crop output of @ref{ode} if NAN or INFINITY value occurs.
+@item Remove style @samp{~} for @ref{plot} and @ref{tens}. Now, all curves try to omit points.
+@item Add setup flag @code{MGL_FULL_CURV} which disable omitting points of curve.
 
-@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 Shift axis labels closer to @ref{axis}.
+@item Change size of LaTeX-like commands @code{\sup, \sub} to be the same as @code{\overset, \underset}.
+@item Change ticks drawing in @ref{colorbar}.
 
-@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.
-@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 section @ref{All samples} of documentation with large set of samples for most of MathGL features.
+@item Samples in documentation are generated automatically now (from @code{sample.cpp}).
+@item @strong{INCOMPATIBLE:} Make obsolete MGL command @ref{setsizescl}. At this, the similar C/C++/Fortran/... functions still working.
+@item Bugfixes.
 
-@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 @strong{20 July 2017.}
+New version (v.2.4.1) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released.
+@itemize @bullet
 
-@item Add move constructor(s) if compiler support C++11 rvalues.
+@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 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.
 @end itemize
 
-@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 @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 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
+@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.
 
+@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.
@@ -407,19 +219,19 @@ New version (v.2.3) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is
 MathGL can plot a wide range of graphics. It includes:
 @itemize @bullet
 @item
-one-dimensional: Plot, Area, Bars, Step, Stem, Torus, Chart, Error, Tube, Mark, (@ref{1D plotting});
+one-dimensional: @ref{plot}, @ref{area}, @ref{bars}, @ref{step}, @ref{stem}, @ref{torus}, @ref{chart}, @ref{error}, @ref{tube}, @ref{mark}, (@ref{1D plotting});
 
 @item
-two-dimensional plots: Mesh, Surf, Dens, Cont, ContF, Boxs, Axial, Fall, Belt, Tile, including surfaces transparent (SurfA) or colored (SurfC) by another data (@ref{2D plotting});
+two-dimensional plots: @ref{mesh}, @ref{surf}, @ref{dens}, @ref{cont}, @ref{contf}, @ref{boxs}, @ref{axial}, @ref{fall}, @ref{belt}, @ref{tile}, including surfaces transparent (@ref{surfa}) or colored (@ref{surfc}) by another data (@ref{2D plotting});
 
 @item
-three-dimensional plots: Surf3, Dens3, Cont3, ContF3, Cloud-like, including isosurfaces transparent (Surf3A) or colored (Surf3C) by another data (@ref{3D plotting});
+three-dimensional plots: @ref{surf3}, @ref{dens3}, @ref{cont3}, @ref{contf3}, @ref{cloud}-like, including isosurfaces transparent (@ref{surf3a}) or colored (@ref{surf3c}) by another data (@ref{3D plotting});
 
 @item
-vector fields plots: vector fields Vect, Vect3 and Traj, flow threads Flow, flow pipes Pipe, mapping chart Map, and so on (@ref{Vector fields});
+vector fields plots: vector fields @ref{vect}, @ref{vect3} and @ref{traj}, @ref{flow} threads, flow @ref{pipe}, @ref{map} chart, and so on (@ref{Vector fields});
 
 @item
-and so on. See also @ref{Extra samples}.
+and so on. See also @ref{All samples}.
 @end itemize
 
 In fact, I created the functions for drawing of all the types of scientific plots that I know. The list of plots is growing; if you need some special type of a plot then please email me @email{mathgl.abalakin@@gmail.com, e-mail} and it will appear in the new version.
@@ -438,125 +250,7 @@ There is fast evaluation of a textual mathematical expression. It is based on st
 @section Pictures
 @nav{}
 
-There are samples for @ref{1D data plotting, 1D arrays}, @ref{2D data plotting, 2D arrays}, @ref{3D data plotting, 3D arrays}, @ref{Vector fields plotting} and some @ref{Extra samples}.
-
-@anchor{1D data plotting}
-@subheading Examples of graphics for 1d arrays
-
-@sfig{plot, Plot sample}
-@sfig{radar, Radar sample}
-@sfig{step, Step sample}
-@sfig{tens, Tens sample}
-
-@sfig{area, Area sample}
-@sfig{region,Region sample}
-@sfig{stem, Stem sample}
-@sfig{torus,Torus sample}
-
-@sfig{bars, Bars sample}
-@sfig{barh, Barh sample}
-@sfig{cones,Cones sample}
-@sfig{chart,Chart sample}
-
-@sfig{boxplot,BoxPlot sample}
-@sfig{candle, Candle sample}
-@sfig{tube, Tube sample}
-@sfig{tape, Tape sample}
-
-@sfig{error,Error sample}
-@sfig{mark, Mark sample}
-@sfig{textmark, TextMark sample}
-@sfig{label,Label sample}
-
-@anchor{2D data plotting}
-@subheading Examples of graphics for 2d arrays
-
-@sfig{surf, Surf sample}
-@sfig{surfc,SurfC sample}
-@sfig{surfa,SurfA sample}
-@sfig{mesh, Mesh sample}
-
-@sfig{fall, Fall sample}
-@sfig{belt, Belt sample}
-@sfig{boxs, Boxs sample}
-@sfig{axial,Axial sample}
-
-@sfig{dens, Dens sample}
-@sfig{tile, Tile sample}
-@sfig{tiles,TileS sample}
-@sfig{grad, Grad sample}
-
-@sfig{cont, Cont sample}
-@sfig{contf,ContF sample}
-@sfig{contd,ContD sample}
-@sfig{contv,ContV sample}
-
-@anchor{3D data plotting}
-@subheading Examples of graphics for 3d arrays
-
-@sfig{surf3, Surf3 sample}
-@sfig{surf3c,Surf3C sample}
-@sfig{surf3a,Surf3A sample}
-@sfig{cloud, Cloud sample}
-
-@sfig{densa, Dens3 sample}
-@sfig{conta, Cont3 sample}
-@sfig{contfa,ContF3 sample}
-@sfig{dots,  Dots sample}
-
-@sfig{dens_xyz, Dens projection sample}
-@sfig{cont_xyz, Cont projection sample}
-@sfig{contf_xyz,ContF projection sample}
-@sfig{triplot, TriPlot and QuadPlot}
-
-@anchor{Vector fields plotting}
-@subheading Examples of graphics for vector fields
-
-@sfig{vect, Vect sample}
-@sfig{vecta,Vect3 sample}
-@sfig{flow, Flow sample}
-@sfig{pipe, Pipe sample}
-
-@sfig{traj, Traj sample}
-@sfig{dew, Dew sample}
-
-@anchor{Extra samples}
-@subheading Examples of additional features
-
-@sfig{inplot, Subplots}
-@sfig{axis, Axis and ticks}
-@sfig{ticks, Axis and ticks}
-@sfig{loglog, Axis and ticks}
-
-@sfig{curvcoor, Curvilinear coordinates}
-@sfig{colorbar, Colorbars}
-@sfig{box, Bounding box}
-@sfig{ternary, Ternary axis}
-
-@sfig{text, Text features}
-@sfig{legend, Legend sample}
-@sfig{cut, Cutting sample}
-@sfig{alpha, Transparency and lighting}
-
-@sfig{type0, Types of transparency}
-@sfig{type1, Types of transparency}
-@sfig{type2, Types of transparency}
-@sfig{fog, Adding fog}
-
-@sfig{combined, ``Compound'' graphics}
-@sfig{several_light, Lighting sample}
-@sfig{stereo, Stereo image}
-@sfig{primitives, Using primitives}
-
-@sfig{stfa, STFA sample}
-@sfig{dat_diff, Change data}
-@sfig{dat_extra, Change data}
-@sfig{map, Mapping visualization}
-
-@sfig{hist, Making histogram}
-@sfig{fit, Nonlinear fitting hints}
-@sfig{pde, PDE solving hints}
-@sfig{parser, Using MGL parser}
+@include samples_list.texi
 
 @external{}
 
@@ -571,20 +265,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 f53e3f926e036a646ef381e208556bba285e532f..9f85a00a34de322e827b10aade3d5453665f0717 100644 (file)
@@ -52,12 +52,12 @@ Generally, MathGL is GPL library. However, you can use LGPL license for MathGL c
 
 @strong{Latest news}
 @itemize
-@item @strong{20 June 2016.}
-New version (v.@value{VERSION}@value{MINVER}) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are compatibility changes and bugfixes. @strong{NOTE}: there is incompatible change -- the library libmgl-qt is removed. You need to use libmgl-qt4 or libmgl-qt5 explicitly to reduce the possible error of wrong Qt libs linking.
-@item @emph{16 May 2016.}
-New version (v.2.3.5) 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{21 March 2018.}
+New version (v.2.4.2) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There area custom dialog for FLTK widgets (see @ref{Special commentaries}); display of execution @ref{progress}; new plots @ref{contp}, @ref{flow3}; style of plots @ref{cont}, @ref{flow}, @ref{tube}; change drawing for @ref{axis}, @ref{colorbar}; data handling (@ref{coil}) and setup (@ref{scaletext}, @ref{setup}) functions; modulo operation @samp{@code{%}} in formulas; automatic omit points for all curves; new section @ref{All samples} of documentation; speeding up and bugfixes.
+
+@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}.
@@ -77,299 +77,113 @@ Javascript interface was developed with support of @url{http://www.datadvance.ne
 
 @itemize
 
-@item @strong{20 June 2016.}
-New version (v.2.3.5.1) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are compatibility changes and bugfixes. @strong{INCOMPATIBLE}: the library libmgl-qt is removed. You need to use libmgl-qt4 or libmgl-qt5 explicitly to reduce the possible error of wrong Qt libs linking.
-
-@item @strong{16 May 2016.}
-New version (v.2.3.5) 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 @strong{21 March 2018.}
+New version (v.2.4.2) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released.
 @itemize @bullet
-@item
-@code{\MGL@@codes}: Bugfix: category code for tabulators is changed too
-@item
-@code{\MGL@@quality}: 9 is accepted as quality value now
-@item
-@code{\MGL@@scale}: Now accepts any positive value
-@item
-@code{\MGL@@test@@switch}: New command to verify and validate switching arguments
-@item
-@code{\mglTeX}: Add a small negative space in the logo, between the "mgl" and "TEX"
-@item
-@code{\mglTeX}: Declared now as robust command
-@item
-@code{\mglcomments}: Now accepts arguments 0 (equivalent to @code{off}) and 1 (equivalent to @code{on}), besides the usual @code{off} and @code{on}
-@item
-@code{\mglgraphics}: New command options: @code{gray, mglscale, quality, variant}
-@item
-@code{\mglname}: Now writes the MGL code line @samp{setsize 600 400} to the main script
-@item
-@code{\mglplot}: Added @code{\bgroup} and @code{\egroup} in order to keep changes private
-@item
-New command options: @code{gray, mglscale, quality, variant}
-@item
-@code{\mglsettings}: Added options @code{gray} and @code{variant}
-@item
-Now calls the @code{\mglswitch} and @code{\mglcomments} commands for the switch and comments options, respectively
-@item
-@code{\mglswitch}: Now accepts arguments 0 (equivalent to @code{off}) and 1 (equivalent to @code{on}), besides the usual @code{off} and @code{on}
-@item
-mglTeX now depends on the ifpdf package
-@item
-Change definition of @code{\mglcommentname} from MGL comment to mglTEX comment
-@item
-Introduce the concept of global, local and private settings in the documentation
-@item
-New commands: @code{\mglgray} (to activate/deactivate) gray-scale mode locally, and @code{\mglvariant} (to set variant of arguments in MGL scripts locally)
-@item
-New package option @code{9q} for setting quality to 9 (for testing purposes of the author)
-@item
-New package options @code{0v, 1v, 2v} to select variant of arguments in MGL scripts
-@item
-New package options @code{gray, color} to activate/deactivate gray-scale mode for graphics
-@item
-Remove the @code{\MGL@@setkeys} command, since it isn’t needed as first thought
-@item
-Rename @code{\MGL@@document@@scripts} to @code{\MGL@@doc@@scripts}
-@item
-Rename @code{\MGL@@script@@name} to @code{\MGL@@script}
-@item
-Rename command @code{\MGL@@graph@@ext} to @code{\MGL@@imgext}
-@item
-Rename command @code{\mglcommonscriptname} to @code{\mglsetupscriptname}
-@item
-Rename environment @code{mglcommon} to @code{mglsetupscript} (@code{mglcommon} is still available, but deprecated)
-@item
-Rename family @code{MGL@@keys} as @code{MGL@@gr@@keys} for consistency
-@item
-Reorganize and update documentation
-@item
-Some minor bugfixes
-@item
-The MGL code line @samp{setsize 600 400} is now automatically written to the main script in order for the scaling options and commands to work
-@item
-@code{mgl}: New environment options: gray, mglscale, quality, variant
-@item
-@code{\mglcode}: New environment options: gray, mglscale, quality, variant
-@end itemize
 
-@item
-Add MGL command @ref{variant} to select proper variant of arguments (like @samp{var1?var2?var3?...}) in MGL commands.
-@item
-Remove limitation of maximal number (was 1000) of arguments for MGL commands. This is actual for 'list' command.
-@item
-Add mglWnd::Widget() for accessing widget which is used for drawing.
-@item
-Add @ref{gray} for producing gray-scaled image.
-@item
-Add MGL command @ref{setsizescl} for scaling all further @ref{setsize}.
-@item
-Add @ref{shear} for shearing plot.
-@item
-Add @ref{shearplot} for placing plots side-by-side with some shearing.
-@item
-Add @ref{limit} for limit maximal absolute value of data.
-@item
-Add @ref{tridmat} for tridiagonal matrix algorithm.
-@item
-Add MGL command @ref{diffract} for single step diffraction calculation.
-@item
-Add @ref{ifsfile} for reading IFS fractal parameters from *.ifs file.
-@item
-Add style @samp{*} for 2d versions of @ref{flow} to draw threads from points inside axis range.
-@item
-Add @samp{norm()} to the list of known functions
-@item
-Compatibility changes for MS VisualStudio, MacOS, Win64.
-@item
-Bugfix for legend export into EPS and SVG.
-@item
-Bugfix for importing data from std::vector.
-@item
-Improve Surf3*() drawing.
-@item
-Force NAN if divided by 0 in formulas.
-@item
-Option "-S" of mglconv now perform scaling in any cases
-@end itemize
+@item Add custom dialog for FLTK widgets. This can be constructed from C/C++ code, or from MGL script using @ref{Special commentaries}.
+@item Add @ref{progress} for displaying the progress of execution (by '#' symbols in console, or by progress-bar widget).
 
-@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 Add @ref{contp} for contour lines on parametrically specified surface.
+@item Add @ref{flow3} for flow threads of 3D vector field, which start from the plain.
+@item Add variant of @ref{flow} for drawing a flow thread, starting from specified point.
+@item Add @ref{scaletext} for disabling text size scaling in relative @ref{inplot}-s (like @ref{columnplot}, ...).
+@item Add @ref{setup} for setting all low-level flags.
 
-@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{coil} for projecting periodical data.
+@item Add modulo operation @samp{@code{%}} (@code{x%y=fmod(x,y)}) to the list of known operations in real-valued formulas.
 
-@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 style @samp{.} for @ref{cont} to draw contour lines from saddle points.
+@item Add style @samp{.} for @ref{flow} to draw flow thread from saddle points.
+@item Add option @code{value} in @ref{tube} for setting number of edges manually.
+@item Crop output of @ref{ode} if NAN or INFINITY value occurs.
+@item Remove style @samp{~} for @ref{plot} and @ref{tens}. Now, all curves try to omit points.
+@item Add setup flag @code{MGL_FULL_CURV} which disable omitting points of curve.
 
-@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 Shift axis labels closer to @ref{axis}.
+@item Change size of LaTeX-like commands @code{\sup, \sub} to be the same as @code{\overset, \underset}.
+@item Change ticks drawing in @ref{colorbar}.
 
-@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.
-@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 section @ref{All samples} of documentation with large set of samples for most of MathGL features.
+@item Samples in documentation are generated automatically now (from @code{sample.cpp}).
+@item @strong{INCOMPATIBLE:} Make obsolete MGL command @ref{setsizescl}. At this, the similar C/C++/Fortran/... functions still working.
+@item Bugfixes.
 
-@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 @strong{20 July 2017.}
+New version (v.2.4.1) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released.
+@itemize @bullet
 
-@item Add move constructor(s) if compiler support C++11 rvalues.
+@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 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.
 @end itemize
 
-@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 @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 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
+@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.
 
+@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.
@@ -405,19 +219,19 @@ New version (v.2.3) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is
 MathGL can plot a wide range of graphics. It includes:
 @itemize @bullet
 @item
-one-dimensional: Plot, Area, Bars, Step, Stem, Torus, Chart, Error, Tube, Mark, (@ref{1D plotting});
+one-dimensional: @ref{plot}, @ref{area}, @ref{bars}, @ref{step}, @ref{stem}, @ref{torus}, @ref{chart}, @ref{error}, @ref{tube}, @ref{mark}, (@ref{1D plotting});
 
 @item
-two-dimensional plots: Mesh, Surf, Dens, Cont, ContF, Boxs, Axial, Fall, Belt, Tile, including surfaces transparent (SurfA) or colored (SurfC) by another data (@ref{2D plotting});
+two-dimensional plots: @ref{mesh}, @ref{surf}, @ref{dens}, @ref{cont}, @ref{contf}, @ref{boxs}, @ref{axial}, @ref{fall}, @ref{belt}, @ref{tile}, including surfaces transparent (@ref{surfa}) or colored (@ref{surfc}) by another data (@ref{2D plotting});
 
 @item
-three-dimensional plots: Surf3, Dens3, Cont3, ContF3, Cloud-like, including isosurfaces transparent (Surf3A) or colored (Surf3C) by another data (@ref{3D plotting});
+three-dimensional plots: @ref{surf3}, @ref{dens3}, @ref{cont3}, @ref{contf3}, @ref{cloud}-like, including isosurfaces transparent (@ref{surf3a}) or colored (@ref{surf3c}) by another data (@ref{3D plotting});
 
 @item
-vector fields plots: vector fields Vect, Vect3 and Traj, flow threads Flow, flow pipes Pipe, mapping chart Map, and so on (@ref{Vector fields});
+vector fields plots: vector fields @ref{vect}, @ref{vect3} and @ref{traj}, @ref{flow} threads, flow @ref{pipe}, @ref{map} chart, and so on (@ref{Vector fields});
 
 @item
-and so on. See also @ref{Extra samples}.
+and so on. See also @ref{All samples}.
 @end itemize
 
 In fact, I created the functions for drawing of all the types of scientific plots that I know. The list of plots is growing; if you need some special type of a plot then please email me @email{mathgl.abalakin@@gmail.com, e-mail} and it will appear in the new version.
@@ -436,125 +250,7 @@ There is fast evaluation of a textual mathematical expression. It is based on st
 @section Pictures
 @nav{}
 
-There are samples for @ref{1D data plotting, 1D arrays}, @ref{2D data plotting, 2D arrays}, @ref{3D data plotting, 3D arrays}, @ref{Vector fields plotting} and some @ref{Extra samples}.
-
-@anchor{1D data plotting}
-@subheading Examples of graphics for 1d arrays
-
-@sfig{plot, Plot sample}
-@sfig{radar, Radar sample}
-@sfig{step, Step sample}
-@sfig{tens, Tens sample}
-
-@sfig{area, Area sample}
-@sfig{region,Region sample}
-@sfig{stem, Stem sample}
-@sfig{torus,Torus sample}
-
-@sfig{bars, Bars sample}
-@sfig{barh, Barh sample}
-@sfig{cones,Cones sample}
-@sfig{chart,Chart sample}
-
-@sfig{boxplot,BoxPlot sample}
-@sfig{candle, Candle sample}
-@sfig{tube, Tube sample}
-@sfig{tape, Tape sample}
-
-@sfig{error,Error sample}
-@sfig{mark, Mark sample}
-@sfig{textmark, TextMark sample}
-@sfig{label,Label sample}
-
-@anchor{2D data plotting}
-@subheading Examples of graphics for 2d arrays
-
-@sfig{surf, Surf sample}
-@sfig{surfc,SurfC sample}
-@sfig{surfa,SurfA sample}
-@sfig{mesh, Mesh sample}
-
-@sfig{fall, Fall sample}
-@sfig{belt, Belt sample}
-@sfig{boxs, Boxs sample}
-@sfig{axial,Axial sample}
-
-@sfig{dens, Dens sample}
-@sfig{tile, Tile sample}
-@sfig{tiles,TileS sample}
-@sfig{grad, Grad sample}
-
-@sfig{cont, Cont sample}
-@sfig{contf,ContF sample}
-@sfig{contd,ContD sample}
-@sfig{contv,ContV sample}
-
-@anchor{3D data plotting}
-@subheading Examples of graphics for 3d arrays
-
-@sfig{surf3, Surf3 sample}
-@sfig{surf3c,Surf3C sample}
-@sfig{surf3a,Surf3A sample}
-@sfig{cloud, Cloud sample}
-
-@sfig{densa, Dens3 sample}
-@sfig{conta, Cont3 sample}
-@sfig{contfa,ContF3 sample}
-@sfig{dots,  Dots sample}
-
-@sfig{dens_xyz, Dens projection sample}
-@sfig{cont_xyz, Cont projection sample}
-@sfig{contf_xyz,ContF projection sample}
-@sfig{triplot, TriPlot and QuadPlot}
-
-@anchor{Vector fields plotting}
-@subheading Examples of graphics for vector fields
-
-@sfig{vect, Vect sample}
-@sfig{vecta,Vect3 sample}
-@sfig{flow, Flow sample}
-@sfig{pipe, Pipe sample}
-
-@sfig{traj, Traj sample}
-@sfig{dew, Dew sample}
-
-@anchor{Extra samples}
-@subheading Examples of additional features
-
-@sfig{inplot, Subplots}
-@sfig{axis, Axis and ticks}
-@sfig{ticks, Axis and ticks}
-@sfig{loglog, Axis and ticks}
-
-@sfig{curvcoor, Curvilinear coordinates}
-@sfig{colorbar, Colorbars}
-@sfig{box, Bounding box}
-@sfig{ternary, Ternary axis}
-
-@sfig{text, Text features}
-@sfig{legend, Legend sample}
-@sfig{cut, Cutting sample}
-@sfig{alpha, Transparency and lighting}
-
-@sfig{type0, Types of transparency}
-@sfig{type1, Types of transparency}
-@sfig{type2, Types of transparency}
-@sfig{fog, Adding fog}
-
-@sfig{combined, ``Compound'' graphics}
-@sfig{several_light, Lighting sample}
-@sfig{stereo, Stereo image}
-@sfig{primitives, Using primitives}
-
-@sfig{stfa, STFA sample}
-@sfig{dat_diff, Change data}
-@sfig{dat_extra, Change data}
-@sfig{map, Mapping visualization}
-
-@sfig{hist, Making histogram}
-@sfig{fit, Nonlinear fitting hints}
-@sfig{pde, PDE solving hints}
-@sfig{parser, Using MGL parser}
+@include samples_list.texi
 
 @external{}
 
@@ -569,20 +265,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 79cb4b49aef276d96e2696c63ff9d25e163e6536..0414293fc905118a224e4b5ec355ed32f3c130a7 100644 (file)
@@ -236,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.}
 
@@ -245,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
@@ -278,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 7f08187e517c1d8a06f6a738e070d8b33f5484d5..ac1fe0abc1652a2fe1d8fe7d8f8dd3b179cfbed6 100644 (file)
@@ -236,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.}
 
@@ -245,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
@@ -276,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 c86c56f0f426903d924ac7e46e79c2730cc0cf34..7a1cd3212642c8b6c6ef492233d6b4eab981cd35 100644 (file)
--- a/todo.txt
+++ b/todo.txt
@@ -2,55 +2,42 @@
 
 ============= FAR FUTURE ================
 
-1. GTK window/widgets ???
-2. Export to COLLADA !!!
-3. Export to X3D !!!
+1. Export to COLLADA or X3D !!!
+2. Read DICOM, MAT, WFM files
+
+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. как делать анимацию (кадры) для мышиной версии ... список кадров, кнопки добавить в кадры + вставить из кадра
 
-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);
+11. Parallel drawing in QMathGL (looks to complicated -- FLTK is better!)
+12. \overline{\overline{a}} ???
+13. Use arrow_plot_3d ???
 
-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. Quality=3 for mirror+shadows? Couldn't be in bitmap only mode
+4. "latex on" option ?!?
 
-17. Speed up QMathGL + option to whole redraw instead of view
+5. Custom dialog in QMathGL
+6. Add "text3d x y z lx ly lz nx ny nz 'txt' ['stl'='' depth=0.1 depth2=nan]"
+7. Mask in EPS/SVG
+8. Animation in UDAV from ##c, ##a + remove old entries at "Put to script" (the same in mgllab)
 
 ZZ. Update *.i for new functions {before release!!!}
 
+curve_draw: step?, bifurcation?, flow3d
 
 ============= DOCUMENTATION =============
 
@@ -59,38 +46,99 @@ B. Add chapter with real samples
 C. Translate to Russian everything
 D. Docs about JS interface
 
-1. Update Qt and UDAV figures
-2. Sample about PDE -- add 'tridmat' + 'diffract'
-3. Replace mgl-qt!!!
-4. Step_xy() now can have x.nx>y.nx -- same as Bars()
-5. Docs about 'flame2d'
+0. Update Qt and UDAV figures
+1. Update installation (dll from mgl_script + Qt plugins/ + Win10)
+
+2. Add more samples:
+       * Example of 'contp', 'flowp'
+       * Example of frame manipulation
+       * Example of 'title' style '#'
+       * Example of 'triplot'+'quadplot' with colors per-face
+       * Example of 'tricontv'
+       * Example of 'grad_xyz'
+       * Example of 'flow', 'pipe' style '*'.
+       * Example of 'fsurf'
+       * Example of 'tile','tiles' styles 'x', 'z'
+       * Example of 'lamerey' style '~'
+       * Example of 'iris', extended
+       * Example of wired 'area' and 'region' (2d case), 'region' with !z1||!z2 (?!?)
+       * Example of 'step' with markers; 'barh', 'bars' (3d) style 'F'
+       * Example of CalcXYZ()
+       * Example of 'clf' with color, 'rasterize', 'loadbackground', 'logo'
+       * Example of 'pde' in 3d, and 'qo3d'
+       * Example of 'tridmat' in all 5 modes, and for real numbers too.
+       * Example of "data" creation {'list', 'def*','ask','{OP DAT}'}
+       * Example of 'rk_step'
+       * Example of 'openhdf'
+       * Extend examples of 'fit' and 'hist' in multi-dimension case.
+       * Example of complex 'hankel' for PDE solving
+       * Example of 'wavelet'
+       * Example of time-values in formulas (like hh-mm-ss_DD.MM.YYYY or hh-mm-ss or DD.MM.YYYY)
+       * Example of Step, Bars for x.nx = y.nx+1
+       * Example of `dat <==> Transpose(dat).
+       * Example of 'coil'
+       * Example of 'roots'
+       * Example of custom dialog
+       * Example of 'progress'
+       
+3. Docs about mgllab (overview, dialogs, ...)
+
+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
+* 1d view -- over longer size + y-size for current slice only
+* info about used memory for graphics
+* abort saving shouldn't switch off "modified" flag (check!)
+* "debug" mode?!? or breakpoints?!
+* something strange with highlighting
+* collect mouse clicks to draw line(s) and save it into data
+* select 'bbox' by mouse
+* dialog to visual construct "custom dialog" + read/add "##d" to the end of file.
+
+X. Own file-chooser dialog -- separate path and fname fields + add sorting by date|size
+Y. Window with Zoom/Hidden ???
+Z. Flat toolbuttons ???
+
+
 
 ============= 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 ???)
+13. Substitute correct name for font files in PropDlg
+* "debug" mode?!? or breakpoints?!
+* collect mouse clicks to draw line(s) and save it into data
 
 ============= 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)").
 7. Use Hershey as built-in font ??? -- for smaller size only
diff --git a/translations/mathgl_en.mo b/translations/mathgl_en.mo
new file mode 100644 (file)
index 0000000..c1f2e9a
Binary files /dev/null and b/translations/mathgl_en.mo differ
diff --git a/translations/mathgl_es.mo b/translations/mathgl_es.mo
new file mode 100644 (file)
index 0000000..14482bf
Binary files /dev/null and b/translations/mathgl_es.mo differ
diff --git a/translations/mathgl_ru.mo b/translations/mathgl_ru.mo
new file mode 100644 (file)
index 0000000..044b77d
Binary files /dev/null and b/translations/mathgl_ru.mo differ
index 8ed4e9adfc3621d21d709cb09efaf57d697c3809..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
@@ -19,10 +19,10 @@ if(WIN32)
 endif(WIN32)
 
 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})
@@ -33,13 +33,16 @@ else(enable-qt5)
        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 0637591dbf5774b0d28dbc3d56dc230fa77ea0ae..60f7c98b8fa7383387863cd33d0486842328ca56 100644 (file)
@@ -21,9 +21,7 @@
 #define ANIMPARAM_H
 //-----------------------------------------------------------------------------
 #include <QDialog>
-#if defined(_MSC_VER)
-#include <mgl2/define.h>
-#endif
+#include "mgl2/define.h"
 //-----------------------------------------------------------------------------
 class QLineEdit;
 class QTextEdit;
index aa20c484145605136f92739bf45d48af41277189..9f1171163a67aac53684211c1c35cd4cc46466da 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);
 }
@@ -71,19 +71,19 @@ ArgsDialog::~ArgsDialog()   {}
 //-----------------------------------------------------------------------------
 void ArgsDialog::putArguments()
 {
-       int len=0, i, j, n;
-       for(i=0;i<10;i++)
+       int len=0;
+       for(int i=0;i<10;i++)
                        if(a[i]->text().length()>len)
                                len = a[i]->text().length();
        wchar_t *str = new wchar_t[len+2];
-       QString s;
-       for(i=0;i<10;i++)
+       for(int i=0;i<10;i++)
        {
-               s = a[i]->text();       n = s.length();
+               QString s = a[i]->text();
+               int j, n = s.length();
                for(j=0;j<n;j++)        str[j] = (s[j]).unicode();
                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 eec9d767d7e833aa1b9e51e18155615755829a05..c199541789de237bd935dd0befaba6a472fcd471 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);
@@ -84,8 +85,7 @@ void DatPanel::refresh()
        if(ny!=var->GetNy())    {       ny = var->GetNy();      tab->setRowCount(ny);   rc=true;        }
        if(kz>=var->GetNz())    {       kz = 0; emit sliceChanged(0);   }
        if(nz!=var->GetNz())    {       nz = var->GetNz();      emit nzChanged(nz);             }
-       const mglData *dd = dynamic_cast<const mglData *>(var); if(dd)  id = QString(dd->id.c_str());
-       const mglDataC *dc = dynamic_cast<const mglDataC *>(var);       if(dc)  id = QString(dc->id.c_str());
+       id = QString(var->GetColumnId());
        if(nz==1 && ny>1 && !id.isEmpty())
        {
                QStringList head;
@@ -98,7 +98,6 @@ void DatPanel::refresh()
                }
                tab->setHorizontalHeaderLabels(head);
        }
-       long m=var->s.length();
        QString s,d;
        if(rc)
        {
@@ -130,8 +129,10 @@ void DatPanel::refresh()
                tab->item(j,i)->setText(s);
        }
        infoDlg->allowRefresh=true;     infoDlg->refresh();
+       const wchar_t *vs = var->Name();
+       long m=wcslen(vs);
        QChar *ss = new QChar[m+1];
-       for(long i=0;i<m;i++)   ss[i] = var->s[i];
+       for(long i=0;i<m;i++)   ss[i] = vs[i];
        s = QString(ss, m);     delete []ss;
        d.sprintf("%d * %d * %d", nx, ny, nz);
        ready = true;
@@ -145,11 +146,11 @@ void DatPanel::setVar(mglDataA *v)
        nx = ny = nz = kz = 0;
        if(v)
        {
-               QString s = QString::fromWCharArray(v->s.c_str());
+               QString s = QString::fromWCharArray(v->Name());
                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.toLocal8Bit().constData());  //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,20 +245,20 @@ 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);
+               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::fromWCharArray(var->s.c_str()), &ok);
+               QString s = QInputDialog::getText(this, _("UDAV - Save to HDF"), _("Enter data name"), QLineEdit::Normal, QString::fromWCharArray(var->Name()), &ok);
                if(ok)  var->SaveHDF(fn.toLocal8Bit().constData(), s.toLocal8Bit().constData());
        }
        else    var->Save(fn.toLocal8Bit().constData());
@@ -265,20 +267,20 @@ void DatPanel::save()
 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);
+               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::fromWCharArray(var->s.c_str()), &ok);
+               QString s = QInputDialog::getText(this, _("UDAV - Read from HDF"), _("Enter data name"), QLineEdit::Normal, QString::fromWCharArray(var->Name()), &ok);
                if(ok)  d->ReadHDF(fn.toLocal8Bit().constData(), s.toLocal8Bit().constData());
        }
        else    d->Read(fn.toLocal8Bit().constData());
@@ -288,11 +290,10 @@ void DatPanel::load()
 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 3rd 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,19 +447,19 @@ 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();
@@ -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::fromWCharArray(var->s.c_str());
+       QString self = QString::fromWCharArray(var->Name());
        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;
@@ -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::fromWCharArray(var->s.c_str());
+       QString self = QString::fromWCharArray(var->Name());
        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)
@@ -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::fromWCharArray(var->s.c_str()); }
+QString DatPanel::dataName()   {       return QString::fromWCharArray(var->Name());    }
 //-----------------------------------------------------------------------------
index af3f0f4d6c224b2b3dbf70c3b43e6435c6361801..431020dbf527c25195361df680ac20339e39da8a 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::fromWCharArray(v->s.c_str()));
+               if(v)   name->addItem(QString::fromWCharArray(v->Name()));
        }
 }
 //-----------------------------------------------------------------------------
@@ -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 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 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 bb67fe0aecaf0aa050eb1886600ac78ff37b79a7..2ef75ea89dee247ad2edde893f3a1dbb0c207112 100644 (file)
 //-----------------------------------------------------------------------------
 HintDialog::HintDialog(QWidget *parent) : QDialog(parent)
 {
-       hints.append(tr("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(tr("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(tr("You may quickly draw the data from file. Just use: udav 'filename.dat' in command line."));
-       hints.append(tr("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(tr("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(tr("You can setup colors for script highlighting in Property dialog. Just select menu item 'Settings/Properties'."));
-       hints.append(tr("You can save the parameter of animation inside MGL script by using comment started from '##a ' or '##c ' for loops."));
-       hints.append(tr("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(tr("You can put several plots in the same image by help of commands 'subplot' or 'inplot'."));
-       hints.append(tr("All indexes (of data arrays, subplots and so on) are always start from 0."));
-       hints.append(tr("You can edit MGL file in any text editor. Also you can run it in console by help of commands: mglconv, mglview."));
-       hints.append(tr("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(tr("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(tr("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(tr("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(tr("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(tr("You can easily insert file or folder names, last fitted formula or numerical value of selection by using menu Edit|Insert."));
-       hints.append(tr("The special dialog (Edit|Insert|New Command) help you select the command, fill its arguments and put it into the script."));
-       hints.append(tr("You can put several plotting commands in the same line or in separate function, for highlighting all of them simultaneously."));
+       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 fadae24c108eb5a4aa03ef3209e45999e32dded2..ff511ba6aa452550573e6a8a70995a2334ad3ecd 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::fromWCharArray(var->s.c_str());
+       name = QString::fromWCharArray(var->Name());
        sub = "(:,:,"+QString::number(kz)+")\n";
        int i = kind->currentIndex();
        if(i<1) text = "yrange "+name+"\nplot "+name + sub;
index fa1db0e12d705d8f9e2cbd74de954b933b877ac7..246bf15bb83839c8e2af4b55600aa180785fcf5b 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,8 +81,8 @@ 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.toLocal8Bit().constData());
        QWidget *t;
@@ -110,15 +111,15 @@ void MemPanel::delData()
        int     n = tab->currentRow();
        if(n<0) n = 0;
        mglDataA *v = parser.FindVar(tab->item(n,0)->text().toLocal8Bit().constData());
-       if(!v && v->o)  ((QWidget *)v->o)->close();
+       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();
 }
@@ -131,8 +132,8 @@ void MemPanel::infoData()
        mglDataA *v = parser.FindVar(tab->item(n,0)->text().toLocal8Bit().constData());
        if(!v)  return;
        infoDlg->setVar(v);
-       QString s = QString::fromWCharArray(v->s.c_str());
-       infoDlg->setWindowTitle(s + tr(" - UDAV preview"));
+       QString s = QString::fromWCharArray(v->Name());
+       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::fromWCharArray(v->s.c_str());
+               s = QString::fromWCharArray(v->Name());
                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 39e295b56cb322d17154b506d44b00b9eaea27a5..a2ea68d21748e2e7448dfc71f1f1157a1edf4727 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,7 +244,7 @@ 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
@@ -280,15 +280,13 @@ void NewCmdDialog::kindChanged(int s)
 //return;
        args->setRowCount(nn);  args->setColumnCount(2);
        QTableWidgetItem *it;
-       QString a;
        QFont f;
-       bool optional;
        for(int i=0;i<nn;i++)
        {
                it = new QTableWidgetItem;      args->setItem(i,0,it);
                it = new QTableWidgetItem;      args->setItem(i,1,it);
-               a = argn[s].at(i);
-               optional = (a[0]=='_' || a[0]=='+');    if(optional)    a=a.mid(1);
+               QString a = argn[s].at(i);
+               bool optional = (a[0]=='_' || a[0]=='+');       if(optional)    a=a.mid(1);
                f.setItalic(a[0].isUpper());    f.setBold(!optional);
                args->item(i,0)->setText(a);    args->item(i,0)->setFont(f);
                args->item(i,0)->setFlags(Qt::ItemIsEnabled);
@@ -307,7 +305,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();
@@ -321,12 +319,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);
        }
 }
@@ -335,12 +333,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'");
@@ -353,8 +351,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;
@@ -366,24 +364,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 961d47ea4ea112a4b8ad73ae7206344a5b4ff60e..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);
@@ -121,27 +121,27 @@ void DataOpenDialog::prepareResult()
        int dd=0;
        if(rA->isChecked())     //      auto sizes
        {
-               setlocale(LC_NUMERIC, "C");     v->Read(file.toLocal8Bit().constData());        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.toLocal8Bit().constData(),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.toLocal8Bit().constData());     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.toLocal8Bit().constData(),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);
@@ -174,6 +174,6 @@ void DataOpenDialog::setFile(const QString &fname)
 {
        file=fname;
        mglData d(file.toLocal8Bit().constData());
-       rA->setText(tr("Auto detect data sizes (%1 x %2 x %3)").arg(d.nx).arg(d.ny).arg(d.nz));
+       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 3aa0eba48439723fe133cf86e065b23018236747..8495f9bc8f976d4f65cadc1fcdffbd539b42107d 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 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 d98c7c54b3fe2134cbdaa32a390189144282b8fb..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
@@ -488,8 +489,8 @@ 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.toLocal8Bit().constData());\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 07ddedfa86cdb196dc868f390e96f741d21f9a6d..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);
index 416732764042ad5dfefa99111fb3c7ddaf441e20..bab19e5ea4798d1f44352759a3a3414d2d7bd023 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::fromLatin1(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::fromWCharArray(v->s.c_str());
+               if(v && wcslen(v->Name())>2)    vars<<QString::fromWCharArray(v->Name());
        }
        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;
 }
 //-----------------------------------------------------------------------------
@@ -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)
@@ -362,7 +362,7 @@ void TextPanel::saveHDF5(const QString &fileName)
        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
@@ -387,7 +387,7 @@ void TextPanel::saveHDF5(const QString &fileName)
                const mglData *v = dynamic_cast<const mglData *>(parser.GetVar(i));
                mglData tmp;
                if(!v)  {       tmp.Set(parser.GetVar(i));      v = &tmp;       }
-               wcstombs(name,v->s.c_str(),v->s.length()+1);
+               wcstombs(name,v->Name(),wcslen(v->Name())+1);
                if(v->nz==1 && v->ny == 1)
                {       rank = 1;       dims[0] = v->nx;        }
                else if(v->nz==1)
@@ -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 f885946a5e75a98a23de2e424443504a5ccb1757..4405b0334727172f661c5342b2877dbe7ef7a598 100644 (file)
@@ -36,6 +36,7 @@
 #include <QTranslator>
 #include <QMimeData>
 #include <QUrl>
+#include <QFileInfo>
 //-----------------------------------------------------------------------------
 #include <mgl2/qmathgl.h>
 #include "udav_wnd.h"
@@ -91,31 +92,43 @@ void mgl_ask_qt(const wchar_t *quest, wchar_t *res);
 //-----------------------------------------------------------------------------
 int main(int argc, char **argv)
 {
-       mgl_suppress_warn(true);
-       QCoreApplication::setAttribute(Qt::AA_X11InitThreads);
-#ifdef WIN32
-       char buf[512];  getcwd(buf,500);        strcat(buf,"\\plugins\\");
-       QCoreApplication::addLibraryPath(buf);
-       QCoreApplication::addLibraryPath("c:\\plugins\\");
-#endif
-       mgl_ask_func = mgl_ask_qt;
-       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();
+       
+       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
+       QCoreApplication::addLibraryPath("c:/plugins/");
+       QCoreApplication::addLibraryPath(QFileInfo(QString::fromLocal8Bit(argv[0])).absolutePath().append("/plugins/"));
+#endif
+       mgl_ask_func = mgl_ask_qt;
+       QApplication a(argc, argv);
+       QTranslator translator;
+//QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
+#if defined(WIN32)
+       if(pathHelp.isEmpty())  pathHelp = a.applicationDirPath()+"\\";
+#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,9 +431,8 @@ 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);
 
@@ -429,7 +441,7 @@ void MainWindow::editPosChanged()
        const char *desc = parser.CmdDesc(ctext);
        const char *form = parser.CmdFormat(ctext);
        if(form)        setStatus(QString(desc)+": "+QString(form));
-       else    setStatus(tr("Not recognized"));
+       else    setStatus(_("Not recognized"));
 }
 //-----------------------------------------------------------------------------
 void MainWindow::setEditPos(bool bottom)
@@ -439,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()
 {
@@ -545,17 +557,17 @@ void MainWindow::setCurrentFile(const QString &fileName)
        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());
        }
 }
 //-----------------------------------------------------------------------------
@@ -564,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;
@@ -606,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;
@@ -618,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)
@@ -654,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();
@@ -671,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 b3c6932333abfd81778d239042a7de3d11f2e7d7..688e1b1ee67abe537900ec15d8a3b04316c4822c 100644 (file)
@@ -9,29 +9,46 @@ 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${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${link_type} ${getopt_lib-static} ${MGL_QT5_LIBS})
-       else(enable-qt5)
-               include(../cmake-qt4.txt)
-               target_link_libraries(mglview mgl-qt4${link_type} ${getopt_lib-static} ${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 ea72b90138b68968094e5241f9f89f907b170db9..73b44d8293ec596298beeb4b649cfbaba7a970ac 100644 (file)
@@ -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;
+       mgl_ask_func = 0;       mgl_progress_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 f9dd48011f4ac3c295bd91f5adae62f15d2c6c51..ba8d77850978e771bc81c39c20c2b382854ac9a7 100644 (file)
 #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
@@ -45,7 +44,6 @@ int main(int argc, char *argv[])
                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
@@ -55,7 +53,8 @@ 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
@@ -80,10 +79,10 @@ 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
@@ -98,19 +97,18 @@ int main(int argc, char *argv[])
                                "\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
index 4f8204f9b50344fa30192c06b4e7294e9400c7d8..149303fbbb8308a6481dc548db6754bdc536a4d3 100644 (file)
 #include <getopt.h>
 
 #include "mgl2/mgl.h"
-#include "mgl2/qt.h"
-#include "mgl2/parser.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;
+std::vector<std::string> anim;
 mglParse p(true);
+void prop_func(char id, const char *val, void *)
+{      p.AddParam(id<='9' ? id-'0' : id-'a'+10, val);  }
 //-----------------------------------------------------------------------------
 int show(mglGraph *gr)
 {
+       if(anim.size()>0)
+       {
+               for(size_t i=0;i<anim.size();i++)
+               {
+                       gr->NewFrame();
+                       p.AddParam(0,anim[i].c_str());
+                       p.Execute(gr,str.c_str());
+                       gr->EndFrame();
+               }
+               return gr->GetNumFrame();
+       }
        p.Execute(gr,str.c_str());
        printf("%s\n",gr->Message());
        return 0;
@@ -36,6 +55,7 @@ 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;
@@ -45,7 +65,6 @@ int main(int argc, char **argv)
                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,13 +75,14 @@ int main(int argc, char **argv)
                }
                else if(ch=='v')        p.SetVariant(atoi(optarg));
                else if(ch=='g')        gray= atoi(optarg);
-               else if(ch=='L')        setlocale(LC_CTYPE, 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"
@@ -70,37 +90,52 @@ int main(int argc, char **argv)
                                "\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;  }
        }
 
+       std::string ids;
+       std::vector<std::string> par;
        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)
                {
                        wchar_t ch;
-                       while(!feof(fp) && size_t(ch=fgetwc(fp))!=WEOF) str.push_back(ch);
+                       std::string text;
+                       while(!feof(fp) && size_t(ch=fgetwc(fp))!=WEOF)
+                       {       str.push_back(ch);      text.push_back(ch);     }
                        fclose(fp);
+
+                       double a1, a2, da;
+                       mgl_parse_comments(text.c_str(), a1, a2, da, anim, ids, par);
+//                     if(!ids.empty())        dr->gr->dialog(ids,par);
                }
                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;
+       mgl_progress_func = mgl_progress_fltk;
+       mglFLTK gr(mgld?NULL:show, *iname?iname:"mglview");
+#else
        mgl_ask_func = mgl_ask_qt;
        mglQT gr(mgld?NULL:show, *iname?iname:"mglview");
+#endif
+       gr.SetPropFunc(prop_func,NULL);
+       gr.MakeDialog(ids, par);
        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());
@@ -108,8 +143,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 f08f4493d1ceb83da919cd525c052de66ab5b1b7..a9e126995259a6c759093c76413c2a8d112306fc 100644 (file)
@@ -1,7 +1,11 @@
 include(GenerateExportHeader)
 
+if(MSVC)
+       add_definitions(-DMGL_LIB_MSVC)
+endif(MSVC)
+
 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})
@@ -25,3 +29,5 @@ 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 b09372881f4ed5107fb431cb5cb2fdd75f2cbbb6..611878859061d499b7cb80930de637f43ae6d06c 100644 (file)
 #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 <FL/Fl_Value_Slider.H>
+#include <FL/Fl_Input.H>
+#include <FL/Fl_Choice.H>
+#include <FL/Fl_Check_Button.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).*/
@@ -88,11 +59,13 @@ using mglCanvasWnd::Window;
        void Adjust();                  ///< Adjust size of bitmap to window size
        void GotoFrame(int d);  ///< Show arbitrary frame (use relative step)
        void Animation();       ///< Run animation (I'm too lasy to change it)
+       void MakeDialog(const char *ids, char const * const *args, const char *title="")
+       {       if(GetNumFig()==1)      mgl->dialog(ids,args,title);    }
 };
 //-----------------------------------------------------------------------------
 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 +81,39 @@ 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;
+#if (MGL_HAVE_PTHREAD|MGL_HAVE_PTHR_WIDGET)
+       thr=0;
+#endif
 }
 //-----------------------------------------------------------------------------
 Fl_MathGL::~Fl_MathGL()        {       if(mgl_use_graph(gr,-1)<1)      mgl_delete_graph(gr);   }
@@ -133,47 +131,67 @@ void Fl_MathGL::set_graph(HMGL GR)
        gr->SetEventFunc(mgl_fltk_event_func, NULL);
 }
 //-----------------------------------------------------------------------------
+void Fl_MathGL::refresh()      {       img = mgl_get_rgb(gr);  redraw();       }
+//-----------------------------------------------------------------------------
 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);
+               fl_color(FL_BLACK);             fl_draw(mouse_pos,40,70);
+               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)
        {
@@ -183,10 +201,40 @@ void Fl_MathGL::update()
                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();
+}
+//-----------------------------------------------------------------------------
+static 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)
@@ -194,105 +242,224 @@ 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)
                {
-                       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);
+                       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)
+               {
+                       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;
+                               snprintf(mouse_pos,128,"x=%g, y=%g, z=%g",p.x,p.y,p.z);
+                               mouse_pos[127]=0;       draw();
+                       }
+                       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++)
+                       {
+                               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(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=='s')
+                       // 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")
                        {
-                               tet -= 10;
-                               if(tet_val)     tet_val->value(tet);
-                               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=='a')
+                       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=='d')
+                       else if(arg[0]=="rhomb" || arg[0]=="ellipse")
                        {
-                               phi -= 10;
-                               if(phi_val)     phi_val->value(phi);
-                               update();       return 1;
+                               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=='x')
+                       else if(arg[0]=="arc")
                        {
-                               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 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->PrevFrame(); 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=='.')
+                       else if(p.n==3)
                        {
-                               mglCanvasFL *g=dynamic_cast<mglCanvasFL *>(gr);
-                               if(g && g->mgl->FMGL==this)
-                               {       g->NextFrame(); return 1;       }
-                               else    return 0;
+                               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);
                        }
-                       if(key=='r')
-                       {       flag = (flag&2) + ((~(flag&1))&1);      update();       return 1;       }
-                       if(key=='f')
-                       {       flag = (flag&1) + ((~(flag&2))&2);      update();       return 1;       }
+                       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();
@@ -306,14 +473,21 @@ 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;
+/*     else if(code==FL_MOVE && mgl_get_flag(gr,MGL_SHOW_POS))
+       {
+               mglPoint p = gr->CalcXYZ(x0-x(), y0-y());
+               snprintf(mouse_pos,128,"x=%g, y=%g, z=%g",p.x,p.y,p.z);
+               mouse_pos[127]=0;       draw();
+               return 1;
+       }*/
+       return 0;
 }
 //-----------------------------------------------------------------------------
 //
@@ -325,7 +499,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();
        }
@@ -337,7 +511,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();
        }
@@ -363,21 +537,21 @@ void Fl_MGLView::exec_pause()
 #endif
 }
 //-----------------------------------------------------------------------------
-void MGL_NO_EXPORT mgl_pause_cb(Fl_Widget*, void* v)
+void static mgl_pause_cb(Fl_Widget*, void* v)
 {      if(v)   ((Fl_MGLView*)v)->toggle_pause();       }
 //-----------------------------------------------------------------------------
-void MGL_NO_EXPORT mgl_grid_cb(Fl_Widget*, void* v)
+void static mgl_grid_cb(Fl_Widget*, void* v)
 {      if(v)   ((Fl_MGLView*)v)->toggle_grid();        }
 //-----------------------------------------------------------------------------
-void MGL_NO_EXPORT mgl_alpha_cb(Fl_Widget*, void* v)
+void static mgl_alpha_cb(Fl_Widget*, void* v)
 {      if(v)   ((Fl_MGLView*)v)->toggle_alpha();       }
 void mglCanvasFL::ToggleAlpha()        {       mgl->toggle_alpha();    }
 //-----------------------------------------------------------------------------
-void MGL_NO_EXPORT mgl_light_cb(Fl_Widget*, void* v)
+void static mgl_light_cb(Fl_Widget*, void* v)
 {      if(v)   ((Fl_MGLView*)v)->toggle_light();       }
 void mglCanvasFL::ToggleLight()        {       mgl->toggle_light();    }
 //-----------------------------------------------------------------------------
-void MGL_NO_EXPORT mgl_norm_cb(Fl_Widget*, void* v)
+void static mgl_norm_cb(Fl_Widget*, void* v)
 {
        Fl_MGLView *e = (Fl_MGLView*)v; if(!e)  return;
        e->setoff_rotate();                     e->setoff_zoom();
@@ -387,14 +561,14 @@ void MGL_NO_EXPORT mgl_norm_cb(Fl_Widget*, void* v)
 }
 void mglCanvasFL::ToggleNo()   {       mgl_norm_cb(0,mgl);     }
 //-----------------------------------------------------------------------------
-void MGL_NO_EXPORT mgl_zoom_cb(Fl_Widget*, void* v)
+void static mgl_zoom_cb(Fl_Widget*, void* v)
 {
        Fl_MGLView *e = (Fl_MGLView*)v; if(!e)  return;
        e->setoff_rotate();     e->toggle_zoom();
 }
 void mglCanvasFL::ToggleZoom() {       mgl_zoom_cb(0,mgl);     }
 //-----------------------------------------------------------------------------
-void MGL_NO_EXPORT mgl_rotate_cb(Fl_Widget*, void* v)
+void static mgl_rotate_cb(Fl_Widget*, void* v)
 {
        Fl_MGLView *e = (Fl_MGLView*)v; if(!e)  return;
        e->setoff_zoom();       e->toggle_rotate();
@@ -403,92 +577,109 @@ 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)
+void static mgl_draw_cb(Fl_Widget*, void* v)
 {      if(v)   ((Fl_MGLView*)v)->update();     }
 void mglCanvasFL::Update()             {       mgl->update();  Wnd->show();    }
 //-----------------------------------------------------------------------------
-void MGL_NO_EXPORT mgl_export_png_cb(Fl_Widget*, void* v)
+static 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 static 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)
+void static 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)
+void static 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)
+void static 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)
+void static 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)
+void static 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_prc_cb(Fl_Widget*, void* v)
+void static mgl_export_gif_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("*.gif");
+       if(fname)       mgl_write_gif(_FGR_,fname,0);
 }
 //-----------------------------------------------------------------------------
-void MGL_NO_EXPORT mgl_export_tex_cb(Fl_Widget*, void* v)
+void static mgl_export_bmp_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("*.bmp");
+       if(fname)       mgl_write_bmp(_FGR_,fname,0);
 }
 //-----------------------------------------------------------------------------
-void MGL_NO_EXPORT mgl_export_obj_cb(Fl_Widget*, void* v)
+void static mgl_export_prc_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("*.prc");
+       if(fname)       mgl_write_prc(_FGR_,fname,0,1);
 }
 //-----------------------------------------------------------------------------
-void MGL_NO_EXPORT mgl_export_off_cb(Fl_Widget*, void* v)
+void static mgl_export_tex_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("*.tex");
+       if(fname)       mgl_write_tex(_FGR_,fname,0);
 }
 //-----------------------------------------------------------------------------
-void MGL_NO_EXPORT mgl_export_stl_cb(Fl_Widget*, void* v)
+void static mgl_export_obj_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("*.obj");
+       if(fname)       mgl_write_obj(_FGR_,fname,0,1);
 }
 //-----------------------------------------------------------------------------
-void MGL_NO_EXPORT mgl_su_cb(Fl_Widget*, void* v)
+void static mgl_export_off_cb(Fl_Widget*, void* v)
+{
+       const char *fname = mgl_save_name("*.off");
+       if(fname)       mgl_write_off(_FGR_,fname,0,0);
+}
+//-----------------------------------------------------------------------------
+void static mgl_export_stl_cb(Fl_Widget*, void* v)
+{
+       const char *fname = mgl_save_name("*.stl");
+       if(fname)       mgl_write_stl(_FGR_,fname,0);
+}
+//-----------------------------------------------------------------------------
+void static mgl_export_xyz_cb(Fl_Widget*, void* v)
+{
+       const char *fname = mgl_save_name("*.xyz");
+       if(fname)       mgl_write_xyz(_FGR_,fname,0);
+}
+//-----------------------------------------------------------------------------
+void static mgl_su_cb(Fl_Widget*, void* v)
 {
        Fl_MGLView *e = (Fl_MGLView*)v; if(!e)  return;
        mreal x1,x2,y1,y2,d;
@@ -497,7 +688,7 @@ void MGL_NO_EXPORT mgl_su_cb(Fl_Widget*, void* v)
        e->FMGL->set_zoom(x1,y1,x2,y2);
 }
 //-----------------------------------------------------------------------------
-void MGL_NO_EXPORT mgl_sd_cb(Fl_Widget*, void* v)
+void static mgl_sd_cb(Fl_Widget*, void* v)
 {
        Fl_MGLView *e = (Fl_MGLView*)v; if(!e)  return;
        mreal x1,x2,y1,y2,d;
@@ -506,7 +697,7 @@ void MGL_NO_EXPORT mgl_sd_cb(Fl_Widget*, void* v)
        e->FMGL->set_zoom(x1,y1,x2,y2);
 }
 //-----------------------------------------------------------------------------
-void MGL_NO_EXPORT mgl_sr_cb(Fl_Widget*, void* v)
+void static mgl_sr_cb(Fl_Widget*, void* v)
 {
        Fl_MGLView *e = (Fl_MGLView*)v; if(!e)  return;
        mreal x1,x2,y1,y2,d;
@@ -515,7 +706,7 @@ void MGL_NO_EXPORT mgl_sr_cb(Fl_Widget*, void* v)
        e->FMGL->set_zoom(x1,y1,x2,y2);
 }
 //-----------------------------------------------------------------------------
-void MGL_NO_EXPORT mgl_sl_cb(Fl_Widget*, void* v)
+void static mgl_sl_cb(Fl_Widget*, void* v)
 {
        Fl_MGLView *e = (Fl_MGLView*)v; if(!e)  return;
        mreal x1,x2,y1,y2,d;
@@ -524,7 +715,7 @@ void MGL_NO_EXPORT mgl_sl_cb(Fl_Widget*, void* v)
        e->FMGL->set_zoom(x1,y1,x2,y2);
 }
 //-----------------------------------------------------------------------------
-void MGL_NO_EXPORT mgl_sz_cb(Fl_Widget*, void* v)
+void static mgl_sz_cb(Fl_Widget*, void* v)
 {
        Fl_MGLView *e = (Fl_MGLView*)v; if(!e)  return;
        mreal x1,x2,y1,y2,d;
@@ -534,7 +725,7 @@ void MGL_NO_EXPORT mgl_sz_cb(Fl_Widget*, void* v)
        e->FMGL->set_zoom(x1,y1,x2,y2);
 }
 //-----------------------------------------------------------------------------
-void MGL_NO_EXPORT mgl_so_cb(Fl_Widget*, void* v)
+void static mgl_so_cb(Fl_Widget*, void* v)
 {
        Fl_MGLView *e = (Fl_MGLView*)v; if(!e)  return;
        mreal x1,x2,y1,y2,d;
@@ -544,22 +735,25 @@ void MGL_NO_EXPORT mgl_so_cb(Fl_Widget*, void* v)
        e->FMGL->set_zoom(x1,y1,x2,y2);
 }
 //-----------------------------------------------------------------------------
-void MGL_NO_EXPORT mgl_adjust_cb(Fl_Widget*, void*v)
+void static mgl_dialog_cb(Fl_Widget*, void*v)
+{      Fl_MGLView *e = (Fl_MGLView*)v; if(e)   e->dlg_show();  }
+//-----------------------------------------------------------------------------
+void static mgl_adjust_cb(Fl_Widget*, void*v)
 {      Fl_MGLView *e = (Fl_MGLView*)v; if(e)   e->adjust();    }
 void mglCanvasFL::Adjust()     {       mgl_adjust_cb(0,mgl);   }
 //-----------------------------------------------------------------------------
-void MGL_NO_EXPORT mgl_oncemore_cb(Fl_Widget*, void*v)
+void static mgl_oncemore_cb(Fl_Widget*, void*v)
 {      Fl_MGLView *e = (Fl_MGLView*)v; if(e && e->reload)      e->reload(e->par);      }
 //-----------------------------------------------------------------------------
-void MGL_NO_EXPORT mgl_quit_cb(Fl_Widget*, void*)      {       Fl::first_window()->hide();     }
+//void static mgl_quit_cb(Fl_Widget*, void*)   {       Fl::first_window()->hide();     }
 //-----------------------------------------------------------------------------
-void MGL_NO_EXPORT mgl_snext_cb(Fl_Widget*, void* v)
+void static mgl_snext_cb(Fl_Widget*, void* v)
 {      Fl_MGLView *e = (Fl_MGLView*)v; if(e && e->next)        e->next(e->par);        }
 //-----------------------------------------------------------------------------
-void MGL_NO_EXPORT mgl_sprev_cb(Fl_Widget*, void* v)
+void static mgl_sprev_cb(Fl_Widget*, void* v)
 {      Fl_MGLView *e = (Fl_MGLView*)v; if(e && e->prev)        e->prev(e->par);        }
 //-----------------------------------------------------------------------------
-void MGL_NO_EXPORT mgl_time_cb(void *v)
+void static mgl_time_cb(void *v)
 {
        Fl_MGLView *e = (Fl_MGLView*)v;
        if(!e || !e->is_sshow() || !e->next || !e->delay)       return;
@@ -567,7 +761,7 @@ void MGL_NO_EXPORT mgl_time_cb(void *v)
        Fl::repeat_timeout(e->delay(e->par), mgl_time_cb, v);
 }
 //-----------------------------------------------------------------------------
-void MGL_NO_EXPORT mgl_sshow_cb(Fl_Widget *, void *v)
+void static mgl_sshow_cb(Fl_Widget *, void *v)
 {
        Fl_MGLView *e = (Fl_MGLView*)v;
        if(!e || !e->delay || !e->next) return;
@@ -577,117 +771,174 @@ void MGL_NO_EXPORT mgl_sshow_cb(Fl_Widget *, void *v)
 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 }
+void static mgl_stop_cb(Fl_Widget*, void* v)
+{
+       Fl_MGLView *e = (Fl_MGLView*)v;
+       if(e)   e->FMGL->stop();
+}
+//-----------------------------------------------------------------------------
+void static mgl_fl_next(void *v)       {       ((mglCanvasWnd*)v)->NextFrame();        }       ///< Callback function for next frame
+void static mgl_fl_prev(void *v)       {       ((mglCanvasWnd*)v)->PrevFrame();        }       ///< Callback function for prev frame
+void static 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,ww,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)"));
-       g->end();       g->resizable(0);
+       phi->tooltip(_("Phi angle (rotate in x*y plane)"));
+       progress = new Fl_Progress(485,0,ww-490,30);
+       g->end();       g->resizable(progress);
 
-       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);
+       g = new Fl_Group(0,0,30,315);
+       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);
 
+       o = new Fl_Button(1, 265, 25, 25);              o->tooltip(_("Show custom dialog for plot setup"));
+       o->image(img_form);     o->callback(mgl_dialog_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 = new Fl_Button(1, 290, 25, 25);       pause_bt->type(FL_TOGGLE_BUTTON);
+       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->tet_val = tet;    FMGL->phi_val = phi;
        FMGL->set_popup(pop_graph,FMGL,this);
-       scroll->end();  resizable(scroll);      end();
+       mglCanvasFL *gr = new mglCanvasFL;      gr->mgl = this;
+       FMGL->set_graph(gr);
+       scroll->end();  resizable(scroll);      end();  par=0;
+       dlg_wnd = NULL; dlg_done = false;
+}
+Fl_MGLView::~Fl_MGLView()
+{
+       delete dlg_wnd;
+       for(size_t i=0;i<strs.size();i++)       free(strs[i]);
+       strs.clear();   
 }
-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)
@@ -695,53 +946,73 @@ void mglCanvasFL::GotoFrame(int d)
        int f = GetCurFig()+d;
        if(f>=GetNumFig())      f = 0;
        if(f<0) f = GetNumFig()-1;
-       if(GetNumFig()>0 && d)  {       SetCurFig(f);   mgl->FMGL->redraw();    }
+       if(GetNumFig()>0 && d)  {       SetCurFig(f);   mgl->FMGL->refresh();   }
 }
 //-----------------------------------------------------------------------------
-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)
 {
        static bool first=true;
+
+       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]);
+
        if(first)       {       Fl::lock();     first=false;    }
 
        SetDrawFunc(draw, par, reload);
        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);
 
@@ -749,6 +1020,7 @@ void mglCanvasFL::Window(int argc, char **argv, int (*draw)(mglBase *gr, void *p
        mgl->prev = mgl_fl_prev;        mgl->delay= mgl_fl_delay;
        mgl->FMGL->set_graph(this);
        mgl->FMGL->set_draw(draw, par);
+       mgl->FMGL->set_prop(mgl_prop_func, this);
 
        Wnd->end();
        Wnd->resizable(mgl);
@@ -770,6 +1042,7 @@ 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)
@@ -787,7 +1060,7 @@ uintptr_t MGL_EXPORT mgl_create_graph_fltk_(const char *title, int l)
 }
 int MGL_EXPORT mgl_fltk_run_() {       return mgl_fltk_run();  }
 //-----------------------------------------------------------------------------
-MGL_NO_EXPORT void *mgl_fltk_tmp(void *)
+static void *mgl_fltk_tmp(void *)
 {      mgl_fltk_run(); return 0;       }
 //-----------------------------------------------------------------------------
 int MGL_EXPORT mgl_fltk_thr()          // NOTE: Qt couldn't be running in non-primary thread
@@ -800,3 +1073,134 @@ int MGL_EXPORT mgl_fltk_thr()            // NOTE: Qt couldn't be running in non-primary th
        return 0;       // stupid, but I don't want keep result returned by Fl::Run()
 }
 //-----------------------------------------------------------------------------
+//
+//             Custom dialog
+//
+//-----------------------------------------------------------------------------
+static void mgl_upd_vals(Fl_Widget *, void *p) {       ((Fl_MGLView *)p)->get_values();        }
+//-----------------------------------------------------------------------------
+static void mgl_dlg_hide(Fl_Widget *, void *p) {       ((Fl_MGLView *)p)->dlg_hide();  }
+//-----------------------------------------------------------------------------
+void Fl_MGLView::dlg_window(const char *title)
+{
+       if(!title || *title==0) title = "MGL dialog";
+       if(!dlg_wnd)    delete dlg_wnd;
+       dlg_wnd = new Fl_Double_Window(210,50,title);
+//     else
+//     {       dlg_wnd->hide();        dlg_wnd->label(title);
+//             dlg_wnd->clear();       dlg_wnd->begin();       }
+       for(size_t i=0;i<strs.size();i++)       free(strs[i]);
+       strs.clear();   dlg_ind = 0;
+}
+//-----------------------------------------------------------------------------
+void Fl_MGLView::dlg_finish()
+{
+       if(!dlg_wnd)    dlg_window();
+       if(!dlg_done)
+       {
+               Fl_Button *b;   dlg_wnd->size(210,dlg_ind*45+50);
+               b = new Fl_Button(5, 20+45*dlg_ind, 80, 25, _("Close"));
+               b->callback(mgl_dlg_hide,this);
+               b = new Fl_Button(125, 20+45*dlg_ind, 80, 25, _("Update"));
+               b->callback(mgl_upd_vals,this);
+               dlg_wnd->end(); dlg_done=true;
+       }
+}
+//-----------------------------------------------------------------------------
+void Fl_MGLView::get_values()
+{
+       if(!dlg_wnd || !dlg_done)       return;
+       for(unsigned i=0;i<dlg_ids.size();i++)
+       {
+               std::string s;
+               Fl_Widget *w=dlg_wdgt[i];
+               switch(dlg_kind[i])
+               {
+               case 'e':       //      input
+               {       Fl_Input* o = (Fl_Input*)w;     s = o->value(); break;  }
+               case 'v':       // spinner|counter
+               case 's':       // slider
+               {       Fl_Valuator* o = (Fl_Valuator*)w;
+                       double v = o->value();  char buf[32];
+                       sprintf(buf,"%g",v);    s = buf;        break;  }
+               case 'b':       // check_box
+               {       Fl_Check_Button* o = (Fl_Check_Button*)w;       s = o->value()?"1":"0"; break;  }
+               case 'c':       // choice
+               {       Fl_Choice* o = (Fl_Choice*)w;   s = o->text();  break;  }
+               }
+               FMGL->set_param(dlg_ids[i], s.c_str());
+       }
+       FMGL->update();
+}
+//-----------------------------------------------------------------------------
+void Fl_MGLView::add_widget(char id, const char *args)
+{
+       static std::vector<std::string> buf;
+       if(!dlg_wnd)    dlg_window();
+       if(args[1]!='|')        return; // wrong format
+       char type = *args;
+       if(!strchr("esvbc",type))       return;
+       args += 2;
+       Fl_Widget *w=NULL;
+       char *lbl=0;
+       for(size_t i=0;args[i];i++)     if(args[i]=='|')        // find label
+       {       lbl = (char*)malloc(i); lbl[i]=0;
+               for(size_t j=0;j<i;j++) lbl[j] = args[j];
+               args += i;      break;  }
+       if(!lbl)
+       {       lbl = (char*)malloc(3); lbl[0]='$';     lbl[1]=id;      lbl[2]=0;       }
+       else    args++;
+       strs.push_back(lbl);    dlg_wnd->size(210,dlg_ind*45+50);
+       switch(type)
+       {
+       case 'e':       //      input
+       {       Fl_Input* o = new Fl_Input(5, 20+45*dlg_ind, 200, 25, lbl);     w=o;
+               o->align(Fl_Align(FL_ALIGN_TOP_LEFT));  o->value(args);
+               break;  }
+       case 'v':       // spinner|counter
+       {       Fl_Counter* o = new Fl_Counter(5, 20+45*dlg_ind, 200, 25, lbl); w=o;
+               o->align(Fl_Align(FL_ALIGN_TOP_LEFT));  o->type(FL_SIMPLE_COUNTER);
+               float v=0,v1=-1,v2=1,s1=1;
+               sscanf(args,"%g|%g|%g|%g",&v,&v1,&v2,&s1);
+               o->step(s1);    o->bounds(v1,v2);       o->value(v);
+               break;  }
+       case 's':       // slider
+       {       Fl_Slider* o = new Fl_Value_Slider(5, 20+45*dlg_ind, 200, 25, lbl);     w=o;
+               o->align(Fl_Align(FL_ALIGN_TOP_LEFT));  o->type(FL_HORIZONTAL);
+               float v=0,v1=-1,v2=1,s=0;
+               sscanf(args,"%g|%g|%g|%g",&v,&v1,&v2,&s);
+               o->step(s);     o->bounds(v1,v2);       o->value(v);
+               break;  }
+       case 'b':       // check_box
+       {       Fl_Check_Button* o = new Fl_Check_Button(5, 10+45*dlg_ind, 200, 25, lbl);       w=o;
+               int v = atoi(args);     o->value(v!=0 || !strcmp(args,"on"));
+               break;  }
+       case 'c':       // choice
+       {       Fl_Choice* o = new Fl_Choice(5, 20+45*dlg_ind, 200, 25, lbl);   w=o;
+               lbl = (char*)malloc(strlen(args)+1);
+               strcpy(lbl,args);       strs.push_back(lbl);
+               o->align(Fl_Align(FL_ALIGN_TOP_LEFT));
+               o->add(lbl);    o->value(0);
+               break;  }
+       }
+       if(w)
+       {       const char *tip = _("This is for parameter ");
+               lbl = (char*)malloc(strlen(tip)+2);
+               sprintf(lbl,"%s%c",tip,id);     strs.push_back(lbl);    w->tooltip(lbl);
+               dlg_ind++;      dlg_done=false; w->callback(mgl_upd_vals, this);
+               dlg_wdgt.push_back(w);  dlg_ids.push_back(id);  dlg_kind.push_back(type);       }
+}
+//-----------------------------------------------------------------------------
+void Fl_MGLView::set_progress(int value, int maximal)
+{
+       progress->maximum(maximal);
+       progress->value(value);
+       Fl::awake();
+}
+//-----------------------------------------------------------------------------
+void MGL_EXPORT mgl_progress_fltk(int value, int maximal, HMGL gr)
+{
+       mglCanvasFL *g = dynamic_cast<mglCanvasFL *>(gr);
+       if(g && g->mgl) g->mgl->set_progress(value,maximal);
+}
+//-----------------------------------------------------------------------------
index 4298fc93b1235943c1c606910814bdb898b27281..92b9da7ea4d9a08fc65703bbbbb49255d5350fd6 100644 (file)
@@ -96,23 +96,18 @@ void _mgl_key_up(unsigned char ch,int ,int )
        if(!_mgl_glwnd) return;\r
        static bool Alpha=false;\r
        static bool Light=false;\r
-       static mreal rL=3,tL=0,pL=0;\r
+       static double rL=3,tL=0,pL=0;\r
 \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
diff --git a/widgets/image.cpp b/widgets/image.cpp
new file mode 100644 (file)
index 0000000..b36bacc
--- /dev/null
@@ -0,0 +1,2971 @@
+/* image.cpp is part of UDAV
+ * 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
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include "mgl2/define.h"
+#include "image.h"
+
+static const unsigned char idata_load[] =
+{0,0,0,0,0,0,0,3,0,0,0,73,0,0,0,75,0,0,0,75,0,0,0,75,0,0,0,75,0,0,0,75,0,0,
+0,61,9,9,9,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,84,127,181,201,
+40,76,118,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,232,231,231,255,42,42,41,150,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,84,127,181,0,74,115,167,255,81,114,155,255,255,255,255,
+255,246,246,246,255,248,248,248,255,249,248,248,255,245,244,244,255,235,235,235,
+255,196,196,196,254,255,255,254,255,59,81,106,255,81,126,184,255,84,131,188,255,
+84,129,187,255,88,135,194,213,0,0,0,0,61,100,146,255,74,106,144,255,255,255,
+255,255,248,248,248,255,248,248,248,255,249,249,249,255,246,246,246,255,239,238,
+238,255,160,160,160,255,255,255,255,255,228,225,222,255,78,97,119,255,120,162,
+215,255,124,169,225,255,73,118,173,255,0,0,0,0,47,82,122,255,62,94,135,255,255,
+255,255,255,248,247,247,255,249,249,249,255,249,249,249,255,247,247,247,255,242,
+242,242,255,154,154,154,255,255,255,255,255,241,239,239,255,225,221,219,255,55,
+79,109,255,104,148,205,255,48,82,123,255,0,0,0,0,43,75,113,255,47,82,122,255,
+255,255,255,255,248,247,247,255,249,249,249,255,249,249,249,255,248,248,248,255,
+245,245,245,255,161,160,160,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,252,250,255,70,93,121,255,42,75,115,255,0,0,0,0,37,70,106,255,33,67,109,255,
+255,255,255,255,247,247,247,255,248,248,248,255,250,249,249,255,251,251,250,255,
+250,249,249,255,235,235,235,255,184,184,184,255,180,179,179,255,173,172,172,255,
+178,176,176,255,244,242,240,255,14,42,74,255,0,0,0,0,34,65,100,255,17,52,94,255,
+255,255,255,255,248,248,248,255,251,250,250,255,250,249,250,255,223,225,229,255,
+207,211,216,255,206,210,214,255,204,207,213,255,201,205,209,255,198,200,206,255,
+193,196,202,255,224,226,229,255,0,20,49,255,0,0,0,0,24,57,91,255,0,30,69,255,
+232,232,234,255,206,209,213,255,208,210,214,255,181,187,195,255,135,162,190,255,
+167,205,235,255,168,205,234,255,169,205,235,255,168,205,235,255,168,205,235,255,
+168,205,235,255,170,206,235,255,188,224,252,255,147,177,203,186,79,118,159,255,
+188,224,251,255,167,204,234,255,166,203,233,255,166,204,234,255,168,206,235,255,
+170,206,234,255,133,171,218,255,130,166,215,255,128,166,215,255,127,166,215,255,
+130,166,215,255,128,166,215,255,128,166,215,255,135,173,225,255,72,93,120,255,
+80,121,169,255,131,169,220,255,124,163,214,255,125,163,214,255,125,163,214,255,
+126,163,214,255,126,163,214,255,129,166,216,255,128,167,216,255,128,167,216,255,
+128,167,216,255,130,167,216,255,129,167,216,255,129,167,216,255,135,174,225,255,
+73,95,123,255,81,122,170,255,138,174,224,255,131,169,219,255,131,169,219,255,
+134,169,219,255,131,169,219,255,135,169,219,255,133,169,219,255,132,169,219,255,
+131,169,219,255,134,169,219,255,131,169,219,255,134,169,219,255,132,169,218,255,
+137,177,228,255,74,95,124,255,57,103,155,255,64,118,180,255,63,116,176,255,63,
+116,176,255,63,116,176,255,63,116,176,255,64,116,176,255,63,116,176,255,64,116,
+176,255,63,116,176,255,63,116,176,255,63,116,176,255,63,116,176,255,63,116,176,
+255,67,122,185,255,39,68,102,255,88,127,173,255,135,173,223,255,132,169,218,255,
+133,169,218,255,134,169,218,255,133,169,218,255,132,169,218,255,132,169,218,255,
+133,169,218,255,134,169,218,255,133,169,218,255,131,169,218,255,133,169,218,255,
+132,169,218,255,138,176,227,255,80,100,129,255,74,117,166,185,129,168,221,255,
+125,163,216,255,126,164,216,255,124,163,216,255,120,163,217,255,124,163,217,255,
+126,164,217,255,126,164,217,255,126,163,217,255,121,163,217,255,122,163,216,255,
+126,164,216,255,126,163,216,255,129,169,224,255,69,95,128,175,0,24,56,65,0,19,
+51,122,0,20,51,123,0,19,50,124,0,19,50,125,0,19,49,126,0,19,49,127,0,18,48,129,
+0,18,48,129,0,18,49,127,0,19,49,126,0,19,50,125,0,19,50,124,0,20,51,123,0,19,
+51,122,0,27,61,66};
+MGL_EXPORT Fl_RGB_Image img_load(idata_load, 16, 16, 4, 0);
+
+static const unsigned char idata_save[] =
+{108,133,119,124,77,121,145,126,56,103,139,111,56,103,139,140,56,103,139,
+212,56,103,139,255,61,105,138,248,74,113,128,229,88,120,122,133,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66,112,146,94,98,150,187,126,129,173,
+209,93,177,206,230,205,208,223,239,255,197,219,236,255,155,194,223,255,104,139,
+160,253,67,110,136,253,106,127,90,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,107,127,136,150,102,113,115,255,98,112,117,255,74,109,133,255,65,116,
+154,255,68,120,159,255,158,191,217,255,193,217,235,255,81,134,175,255,78,106,
+125,255,110,112,107,255,110,112,107,255,110,112,107,255,110,112,107,255,110,112,
+107,255,110,112,107,128,107,113,110,255,226,230,221,255,255,255,255,255,221,225,
+214,255,201,214,221,255,110,153,182,255,56,103,139,255,171,203,226,255,146,183,
+211,255,84,125,155,255,213,223,229,255,255,255,255,255,255,255,255,255,255,255,
+255,255,244,244,244,255,110,112,107,255,114,117,107,255,253,253,253,255,238,238,
+238,255,237,237,237,255,223,226,222,255,119,152,176,255,56,103,139,255,121,167,
+202,255,143,179,206,255,61,107,142,255,172,188,195,255,237,237,238,255,237,238,
+238,255,237,238,237,255,243,244,243,255,110,112,107,255,110,112,107,255,252,251,
+252,255,235,236,236,255,56,103,139,255,56,103,139,255,56,103,139,255,56,103,139,
+255,121,167,202,255,88,146,189,255,56,103,139,255,56,103,139,255,56,103,139,255,
+56,103,139,255,236,236,236,255,243,243,243,255,110,112,107,255,110,112,107,255,
+250,250,250,255,233,233,234,255,202,207,196,255,56,103,139,255,152,191,220,255,
+113,159,191,255,113,159,191,255,113,159,191,255,115,159,192,255,150,187,216,255,
+56,103,139,255,149,169,175,255,234,233,234,255,242,242,242,255,110,112,107,255,
+110,112,107,255,249,249,249,255,250,250,250,255,228,228,228,255,197,203,191,255,
+56,103,139,255,152,191,220,255,115,159,192,255,115,159,192,255,171,200,223,255,
+56,103,139,255,146,166,172,255,228,228,228,255,244,244,244,255,241,241,241,255,
+110,112,107,255,110,112,107,255,249,249,249,255,238,238,238,255,250,250,250,255,
+228,228,228,255,197,203,191,255,56,103,139,255,172,203,227,255,152,191,220,255,
+59,107,143,255,146,166,172,255,228,228,228,255,250,250,250,255,238,238,238,255,
+241,241,241,255,110,112,107,255,110,112,107,255,247,247,247,255,227,227,227,255,
+238,238,238,255,250,250,250,255,250,250,250,255,206,212,200,255,63,108,142,255,
+56,103,139,255,154,174,180,255,250,250,250,255,252,252,252,255,238,238,238,255,
+227,227,227,255,240,240,240,255,110,112,107,255,110,112,107,255,254,254,254,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,244,244,244,255,244,244,244,255,235,235,235,255,
+235,235,235,255,227,227,227,255,240,240,240,255,110,112,107,255,110,112,107,255,
+206,206,206,255,201,201,201,255,201,201,201,255,201,201,201,255,201,201,201,255,
+197,197,197,255,201,201,201,255,201,201,201,255,197,197,197,255,197,197,197,255,
+197,197,197,255,197,197,197,255,197,197,197,255,214,214,214,255,110,112,107,255,
+110,112,107,255,206,206,206,255,197,197,197,255,159,159,159,255,175,175,175,255,
+188,188,188,255,196,196,196,255,200,200,200,255,208,208,208,255,169,169,169,255,
+210,210,210,255,169,169,169,255,210,210,210,255,185,185,185,255,202,202,202,255,
+110,112,107,255,110,112,107,255,205,205,205,255,195,195,195,255,170,170,169,255,
+180,180,180,255,194,194,194,255,196,196,196,255,200,200,200,255,203,203,203,255,
+168,167,168,255,209,209,209,255,168,167,167,255,209,209,209,255,183,182,182,255,
+202,202,202,255,110,112,107,255,110,112,107,255,221,221,221,255,220,220,220,255,
+220,220,220,255,220,220,220,255,213,213,213,255,213,213,213,255,207,207,207,255,
+207,207,207,255,207,207,207,255,207,207,207,255,207,207,207,255,207,207,207,255,
+207,207,207,255,202,202,202,255,110,112,107,255,110,112,107,128,110,112,107,255,
+110,112,107,255,110,112,107,255,110,112,107,255,110,112,107,255,110,112,107,255,
+110,112,107,255,110,112,107,255,110,112,107,255,110,112,107,255,110,112,107,255,
+110,112,107,255,110,112,107,255,110,112,107,255,110,112,107,128};
+MGL_EXPORT Fl_RGB_Image img_save(idata_save, 16, 16, 4, 0);
+
+static const unsigned char idata_calc[] =
+{255,255,255,0,255,255,255,0,0,0,0,7,69,69,69,138,121,121,121,185,124,124,
+124,187,122,122,122,188,121,121,121,187,118,118,118,187,118,118,118,187,118,118,
+118,186,119,119,119,185,77,77,77,136,0,0,0,3,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,0,0,0,81,206,206,206,255,119,119,119,255,114,115,113,
+255,116,118,116,255,117,119,116,255,116,118,116,255,104,106,103,255,73,75,72,
+255,77,77,76,255,195,195,195,255,0,0,0,66,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,0,0,0,96,211,211,211,255,105,105,105,255,192,204,183,255,
+189,202,181,255,191,203,183,255,179,194,169,255,157,173,146,255,155,171,144,255,
+103,105,101,255,195,195,195,255,0,0,0,81,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,0,0,0,96,206,206,206,255,75,75,75,255,77,77,77,255,66,67,66,
+255,54,55,54,255,49,50,49,255,49,50,49,255,60,60,60,255,61,61,61,255,190,190,
+190,255,0,0,0,81,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,0,0,0,
+96,224,224,224,255,196,196,196,255,200,200,200,255,198,198,198,255,193,193,193,
+255,193,193,193,255,193,193,193,255,194,194,194,255,199,199,199,255,228,228,228,
+255,0,0,0,82,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,0,0,0,96,
+223,223,223,255,62,62,62,255,62,62,62,255,238,238,238,255,62,62,62,255,59,59,59,
+255,224,224,224,255,62,62,62,255,62,62,62,255,234,234,234,255,0,0,0,82,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,0,0,0,96,219,219,219,255,237,
+237,237,255,242,242,242,255,235,235,235,255,231,231,231,255,231,231,231,255,231,
+231,231,255,234,234,234,255,240,240,240,255,232,232,232,255,0,0,0,83,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,0,0,0,96,215,215,215,255,62,62,
+62,255,62,62,62,255,230,230,230,255,61,61,61,255,59,59,59,255,219,219,219,255,
+62,62,62,255,62,62,62,255,229,229,229,255,0,0,0,83,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,0,0,0,96,212,212,212,255,234,234,234,255,238,238,
+238,255,227,227,227,255,226,226,226,255,226,226,226,255,226,226,226,255,232,232,
+232,255,236,236,236,255,227,227,227,255,0,0,0,83,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,0,0,0,96,209,209,209,255,62,62,62,255,62,62,62,255,
+224,224,224,255,61,61,61,255,59,59,59,255,216,216,216,255,62,62,62,255,62,62,62,
+255,225,225,225,255,0,0,0,83,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,0,0,0,96,207,207,207,255,231,231,231,255,225,225,225,255,222,222,222,255,
+222,222,222,255,222,222,222,255,223,223,223,255,229,229,229,255,232,232,232,255,
+223,223,223,255,0,0,0,83,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,
+0,0,0,0,96,204,204,204,255,62,62,62,255,62,62,62,255,219,219,219,255,62,62,62,
+255,60,60,60,255,213,213,213,255,65,65,65,255,65,65,65,255,220,220,220,255,0,0,
+0,83,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,0,0,0,96,202,202,
+202,255,218,218,218,255,213,213,213,255,217,217,217,255,213,213,213,255,211,211,
+211,255,220,220,220,255,54,54,54,255,56,56,56,255,218,218,218,255,0,0,0,83,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,0,0,0,96,200,200,200,255,61,
+61,61,255,61,61,61,255,215,215,215,255,61,61,61,255,60,60,60,255,212,212,212,
+255,49,49,49,255,49,49,49,255,216,216,216,255,0,0,0,83,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,0,0,0,91,184,184,184,255,213,213,213,255,213,
+213,213,255,213,213,213,255,213,213,213,255,214,214,214,255,217,217,217,255,223,
+223,223,255,223,223,223,255,204,204,204,255,0,0,0,79,255,255,255,0,255,255,255,
+0,255,255,255,0,255,255,255,0,0,0,0,21,71,71,71,224,101,101,101,243,101,101,
+101,243,101,101,101,243,101,101,101,243,102,102,102,243,105,105,105,243,109,109,
+109,244,108,108,108,244,71,71,71,226,0,0,0,12,255,255,255,0,255,255,255,0};
+MGL_EXPORT Fl_RGB_Image img_calc(idata_calc, 16, 16, 4, 0);
+
+static const unsigned char idata_undo[] =
+{166,127,0,27,166,127,0,33,255,255,255,0,255,255,255,0,166,127,0,34,169,131,
+2,129,180,146,16,192,195,169,53,239,200,173,68,243,183,147,25,198,167,129,1,
+136,166,127,0,43,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,173,
+138,12,220,185,156,29,245,166,127,0,85,168,131,2,108,196,169,36,247,235,211,84,
+255,243,222,100,255,249,236,113,255,249,236,114,255,244,223,105,255,238,209,89,
+255,200,163,33,245,168,128,1,126,166,127,0,4,255,255,255,0,255,255,255,0,176,
+145,13,243,241,217,103,255,197,172,39,249,221,197,72,250,245,223,103,255,247,
+229,103,255,247,229,103,255,247,229,103,255,247,229,103,255,247,229,103,255,247,
+229,103,255,245,224,105,255,224,185,63,249,170,131,3,205,166,127,0,6,255,255,
+255,0,176,145,13,243,243,217,105,255,243,217,105,255,243,220,104,255,243,219,
+102,255,243,218,101,255,239,204,95,255,232,183,62,255,232,183,58,255,238,200,84,
+255,243,217,102,255,243,217,101,255,243,218,104,255,201,162,53,249,166,127,1,
+137,255,255,255,0,176,145,13,244,238,209,100,255,239,211,99,255,239,212,99,255,
+235,205,85,255,222,170,33,255,213,156,14,255,200,150,20,254,197,144,25,254,205,
+136,6,255,226,162,39,255,238,202,92,255,239,204,95,255,234,198,91,255,158,120,
+18,246,166,127,0,55,177,145,13,244,235,203,93,255,235,207,92,255,233,206,86,
+255,218,179,22,255,195,157,17,254,149,120,13,246,163,125,2,177,160,123,3,166,
+133,103,8,247,153,101,5,249,224,156,31,250,236,193,86,253,236,193,85,255,174,
+136,51,254,165,126,0,149,176,144,13,244,227,187,64,255,230,200,80,255,231,207,
+78,255,225,201,46,255,215,186,17,255,171,137,14,244,166,127,0,81,255,255,255,0,
+166,127,0,21,165,126,6,243,202,132,3,214,227,167,51,227,232,180,72,243,195,147,
+54,254,156,118,3,212,169,133,5,239,194,156,22,248,196,159,23,253,202,170,38,
+253,208,178,40,254,213,185,32,254,209,178,24,252,169,130,3,232,166,127,0,42,255,
+255,255,0,168,129,1,156,197,139,7,202,222,150,26,174,228,168,57,197,214,157,52,
+223,140,104,3,250,166,127,0,60,166,127,0,180,166,127,0,252,166,127,0,255,166,
+127,1,255,166,127,0,255,166,127,0,255,166,127,0,233,166,127,0,42,255,255,255,0,
+168,128,1,159,193,136,6,184,219,139,4,137,220,143,11,159,199,130,8,184,142,105,
+2,249,255,255,255,0,255,255,255,0,255,255,255,0,199,129,3,1,201,132,4,5,141,
+117,22,3,255,255,255,0,255,255,255,0,255,255,255,0,166,127,0,27,173,133,4,239,
+208,142,8,108,218,137,0,111,218,137,0,123,162,107,3,171,159,120,1,204,255,255,
+255,0,255,255,255,0,255,255,255,0,218,141,4,1,217,148,9,6,174,132,20,5,145,126,
+26,1,166,127,0,17,166,127,0,152,167,128,1,235,185,143,8,146,216,150,11,73,217,
+143,5,84,218,137,0,95,151,107,4,168,166,127,0,146,255,255,255,0,255,255,255,0,
+255,255,255,0,217,148,9,1,215,156,16,1,255,255,255,0,206,165,29,1,184,152,28,4,
+177,143,15,19,202,163,29,22,214,164,23,42,215,158,17,52,216,150,11,60,196,135,7,
+73,158,119,2,235,166,127,0,51,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,214,162,22,1,255,255,255,0,255,255,255,0,211,181,37,1,211,181,38,4,
+212,178,35,10,213,172,30,26,214,165,23,32,215,155,17,29,165,124,5,115,166,127,0,
+106,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,209,192,46,1,210,187,42,4,
+211,179,36,12,215,171,32,11,201,149,24,12,163,109,5,2,255,255,255,0,255,255,255,
+0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,215,188,46,1,213,167,25,2,
+220,162,23,1,213,128,0,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,
+0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0};
+MGL_EXPORT Fl_RGB_Image img_undo(idata_undo, 16, 16, 4, 0);
+
+static const unsigned char idata_redo[] =
+{255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,0,140,0,37,1,141,1,
+128,7,145,4,189,8,145,6,238,10,146,9,240,15,149,11,193,3,142,2,123,0,140,0,29,
+255,255,255,0,255,255,255,0,0,140,0,27,0,140,0,25,255,255,255,0,255,255,255,0,0,
+140,0,2,1,141,1,118,4,144,3,245,50,174,41,255,88,196,72,255,134,219,110,255,133,
+219,110,255,93,198,78,255,53,174,43,255,5,144,3,247,5,142,3,102,0,140,0,78,2,
+142,2,244,3,142,2,219,255,255,255,0,0,140,0,5,1,141,1,198,23,156,17,248,114,215,
+94,255,127,223,103,255,127,223,103,255,127,223,103,255,127,223,103,255,127,223,
+103,255,127,223,103,255,105,208,88,255,20,154,15,251,4,143,2,249,92,198,76,255,
+2,141,1,244,255,255,255,0,0,140,0,131,20,152,16,248,103,214,88,255,101,212,85,
+255,102,212,86,255,85,207,73,255,58,198,49,255,60,200,52,255,94,210,84,255,100,
+211,84,255,101,212,85,255,102,212,86,255,102,210,88,255,101,209,87,255,2,141,1,
+244,0,140,0,51,2,141,2,245,72,194,63,255,77,203,67,255,76,203,67,255,35,190,32,
+255,15,176,10,255,16,159,9,254,24,164,17,254,20,181,13,255,20,185,18,255,64,199,
+55,255,77,203,67,255,77,203,67,255,80,202,70,255,2,141,1,244,0,140,0,147,25,
+153,22,254,56,196,51,255,56,196,51,255,24,187,23,255,14,151,10,253,2,139,1,246,
+2,140,1,173,1,140,1,184,2,140,1,244,25,161,16,253,5,181,5,255,51,193,46,255,
+56,196,51,255,62,195,54,255,1,141,1,244,1,140,1,207,32,166,27,253,38,189,36,
+248,30,187,29,236,18,173,13,221,1,140,1,244,0,140,0,26,255,255,255,0,0,140,0,78,
+3,141,1,244,23,175,15,255,18,184,17,255,35,188,34,255,38,189,36,255,39,189,34,
+255,1,141,1,244,0,140,0,249,29,180,25,215,22,185,22,196,11,181,11,178,13,153,8,
+203,1,141,0,159,255,255,255,0,0,140,0,42,0,140,0,234,57,189,33,250,50,188,32,
+254,54,186,36,254,54,184,37,253,51,182,31,253,50,178,29,249,1,140,0,240,0,140,0,
+249,15,175,10,176,3,181,3,156,1,180,1,141,11,151,6,184,1,141,0,159,255,255,255,
+0,0,140,0,45,0,140,0,237,0,140,0,255,0,140,0,255,0,138,0,248,0,134,0,234,0,
+131,0,220,0,127,0,204,0,124,0,104,0,140,0,204,17,157,9,164,0,180,0,121,0,180,0,
+108,23,174,12,107,1,134,1,219,0,129,0,21,255,255,255,0,255,255,255,0,255,255,
+255,0,67,170,35,4,41,186,21,5,32,183,16,1,255,255,255,0,255,255,255,0,255,255,
+255,0,0,124,0,111,16,138,10,149,0,180,0,90,0,180,0,80,10,182,5,69,28,146,15,101,
+3,107,2,104,0,100,0,59,0,96,0,8,67,172,36,1,62,183,33,5,27,187,14,8,18,184,9,
+1,255,255,255,0,255,255,255,0,255,255,255,0,0,98,0,18,11,111,6,96,19,173,12,
+67,8,182,4,55,21,185,11,47,33,188,17,38,66,200,37,16,56,188,31,9,59,183,31,5,
+67,196,36,1,255,255,255,0,41,190,22,2,30,187,16,1,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,0,153,0,0,49,165,28,37,19,186,10,34,30,187,16,28,44,
+191,23,22,56,194,30,8,65,196,35,4,70,198,37,2,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,12,140,6,2,58,183,32,15,54,195,29,14,52,193,28,10,67,197,35,3,79,
+200,42,1,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,0,191,0,0,54,196,29,2,39,190,20,2,86,206,46,1,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0};
+MGL_EXPORT Fl_RGB_Image img_redo(idata_redo, 16, 16, 4, 0);
+
+static const unsigned char idata_copy[] =
+{0,0,0,18,0,0,0,75,0,0,0,76,0,0,0,76,0,0,0,76,0,0,0,76,0,0,0,76,0,0,0,76,0,
+0,0,76,0,0,0,76,0,0,0,75,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,76,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+0,0,0,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,77,255,255,255,255,234,235,235,
+255,236,237,237,255,238,238,238,255,239,240,240,255,240,241,241,255,241,242,242,
+255,242,242,242,255,242,242,242,255,255,255,255,255,0,0,0,78,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,77,255,255,255,255,237,238,238,255,239,240,240,255,226,
+226,226,255,176,176,176,255,176,176,176,255,176,177,177,255,177,177,177,255,177,
+177,177,255,184,184,184,255,0,0,0,128,0,0,0,71,0,0,0,71,0,0,0,70,0,0,0,16,0,0,0,
+77,255,255,255,255,240,240,240,255,242,243,243,255,177,177,177,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,72,0,
+0,0,77,255,255,255,255,243,243,243,255,245,245,245,255,177,178,178,255,255,
+255,255,255,235,236,236,255,238,238,238,255,240,240,240,255,242,242,242,255,243,
+244,244,255,244,245,245,255,245,245,245,255,245,245,245,255,255,255,255,255,0,0,
+0,74,0,0,0,77,255,255,255,255,245,245,245,255,248,248,248,255,179,179,179,255,
+255,255,255,255,238,238,238,255,240,241,241,255,243,243,243,255,245,245,245,255,
+246,246,246,255,247,248,248,255,248,248,248,255,248,248,248,255,255,255,255,255,
+0,0,0,74,0,0,0,77,255,255,255,255,247,247,247,255,250,250,250,255,180,180,180,
+255,255,255,255,255,240,240,240,255,243,243,243,255,245,246,246,255,248,248,248,
+255,249,249,249,255,250,250,250,255,250,250,250,255,250,250,250,255,255,255,255,
+255,0,0,0,74,0,0,0,77,255,255,255,255,249,249,249,255,251,251,251,255,181,181,
+181,255,255,255,255,255,242,242,242,255,245,245,245,255,248,248,248,255,250,250,
+250,255,251,251,251,255,251,251,251,255,252,252,252,255,252,252,252,255,255,255,
+255,255,0,0,0,74,0,0,0,77,255,255,255,255,250,250,250,255,251,251,251,255,181,
+181,181,255,255,255,255,255,244,244,244,255,247,247,247,255,250,250,250,255,251,
+251,251,255,252,252,252,255,252,252,252,255,253,253,253,255,253,253,253,255,255,
+255,255,255,0,0,0,74,0,0,0,77,255,255,255,255,250,250,250,255,252,252,252,255,
+181,181,181,255,255,255,255,255,245,246,246,255,249,249,249,255,251,251,251,255,
+252,252,252,255,248,248,248,255,228,228,228,255,234,234,233,255,243,243,243,255,
+241,243,244,254,0,0,0,70,0,0,0,75,251,251,251,254,255,255,255,255,255,255,255,
+255,183,183,183,255,255,255,255,255,247,247,247,255,250,250,250,255,251,251,251,
+255,253,253,253,255,228,228,228,255,254,254,254,255,254,254,254,255,244,244,243,
+255,111,111,111,185,0,0,0,20,0,0,0,20,0,0,0,93,0,0,0,98,0,0,0,98,0,0,0,142,255,
+255,255,255,248,248,248,255,250,250,250,255,252,252,252,255,253,253,253,255,231,
+232,231,255,254,254,254,255,243,243,243,255,108,109,108,203,0,0,0,52,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,255,255,255,255,249,249,249,255,251,
+251,251,255,252,252,252,255,254,254,254,255,234,235,234,255,243,243,243,255,115,
+115,114,208,0,0,0,78,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,
+251,251,251,254,255,255,255,255,255,255,255,255,255,255,255,255,250,252,253,255,
+230,234,235,255,121,122,121,206,0,0,0,71,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,87,0,0,0,91,0,0,0,91,0,0,0,91,0,0,0,91,0,0,0,
+90,0,0,0,40,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0};
+MGL_EXPORT Fl_RGB_Image img_copy(idata_copy, 16, 16, 4, 0);
+
+static const unsigned char idata_paste[] =
+{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74,227,227,227,255,218,218,218,255,218,218,
+218,255,230,230,230,255,0,0,0,79,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,37,37,37,65,58,58,58,248,12,12,12,255,213,213,213,255,133,133,133,
+254,255,255,255,255,255,255,255,255,132,132,132,254,213,213,213,255,7,7,7,255,
+59,59,59,244,43,43,43,69,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,35,35,35,233,75,75,75,
+254,20,20,20,255,255,255,255,255,243,243,243,255,236,236,236,255,236,236,236,
+255,243,243,243,255,255,255,255,255,31,31,31,255,74,74,74,254,37,37,37,249,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,35,35,35,255,38,38,38,255,204,204,204,255,175,175,
+175,255,176,176,176,255,176,176,176,255,176,176,176,255,176,176,176,255,176,176,
+176,255,206,206,206,255,26,26,26,255,34,34,34,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,34,34,34,255,34,34,34,255,255,255,255,255,243,243,243,255,245,245,245,255,
+246,246,246,255,228,228,228,255,182,182,182,255,182,182,182,255,205,205,205,255,
+7,7,7,255,17,17,17,255,0,0,0,97,0,0,0,106,0,0,0,106,1,1,1,66,31,31,31,255,37,
+37,37,255,255,255,255,255,240,240,240,255,242,242,242,255,243,243,243,255,174,
+174,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,254,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,111,30,30,30,
+255,37,37,37,255,255,255,255,255,241,241,241,255,243,243,243,255,245,245,245,
+255,176,176,176,255,255,255,255,255,221,222,223,255,226,227,227,255,229,230,231,
+255,232,233,233,255,234,235,235,255,235,236,236,255,248,249,249,255,0,0,0,111,
+27,27,27,255,38,38,38,255,255,255,255,255,241,241,241,255,244,244,244,255,245,
+245,245,255,177,177,177,255,255,255,255,255,227,229,229,255,233,234,234,255,236,
+237,237,255,238,239,239,255,240,241,241,255,241,242,242,255,255,255,255,255,0,0,
+0,111,23,23,23,255,38,38,38,255,255,255,255,255,243,243,243,255,244,244,244,
+255,246,246,246,255,179,179,179,255,255,255,255,255,233,234,234,255,237,238,238,
+255,240,241,241,255,243,243,243,255,245,245,245,255,246,246,246,255,255,255,255,
+255,0,0,0,111,22,22,22,255,37,37,37,255,255,255,255,255,243,243,243,255,245,245,
+245,255,248,248,248,255,181,181,181,255,255,255,255,255,237,237,237,255,241,241,
+241,255,244,244,244,255,247,247,247,255,249,249,249,255,250,250,250,255,255,255,
+255,255,0,0,0,111,24,24,24,255,36,36,36,255,255,255,255,255,244,244,244,255,246,
+246,246,255,249,249,249,255,182,182,182,255,255,255,255,255,240,241,241,255,244,
+245,245,255,248,248,248,255,251,251,251,255,253,253,253,255,254,254,254,255,255,
+255,255,255,0,0,0,111,28,28,28,255,33,33,33,255,255,255,255,255,243,243,243,255,
+246,246,246,255,250,250,250,255,183,183,183,255,255,255,255,255,242,243,243,255,
+247,247,247,255,225,225,225,255,179,180,179,255,179,179,179,255,184,184,184,255,
+218,218,218,255,0,0,0,112,35,35,35,255,30,30,30,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,197,197,197,255,255,255,255,255,244,245,245,
+255,250,250,250,255,222,222,222,255,202,202,202,255,255,255,255,254,255,255,255,
+255,102,103,102,225,0,0,0,49,39,39,39,255,57,57,57,255,49,49,49,255,62,62,62,
+255,69,69,69,255,73,73,73,255,40,40,40,255,255,255,255,255,246,246,246,255,251,
+251,251,255,220,220,221,255,200,200,200,255,252,252,251,255,76,77,76,216,0,0,0,
+49,0,0,0,0,104,109,109,247,46,46,46,255,50,50,50,255,49,49,49,255,48,48,48,255,
+49,49,49,255,22,22,22,255,255,255,255,255,255,255,255,255,255,255,255,255,227,
+229,229,255,187,187,187,255,53,53,53,215,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,0,0,0,111,0,0,0,110,0,0,0,110,0,0,
+0,110,0,0,0,110,0,0,0,29,0,0,0,0,0,0,0,0,0,0,0,0};
+MGL_EXPORT Fl_RGB_Image img_paste(idata_paste, 16, 16, 4, 0);
+
+static const unsigned char idata_find[] =
+{255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,0,0,0,98,0,0,0,204,0,0,0,129,255,255,255,0,
+255,255,255,0,0,0,0,129,0,0,0,204,0,0,0,98,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,0,0,0,25,31,31,31,
+252,106,106,106,255,36,36,36,255,0,0,0,41,0,0,0,38,36,36,36,255,106,106,106,255,
+31,31,31,252,0,0,0,25,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,0,0,0,71,0,0,0,209,44,44,44,255,45,45,45,255,22,22,22,255,18,18,
+18,246,18,18,18,246,22,22,22,255,43,43,43,255,44,44,44,255,0,0,0,209,0,0,0,71,
+255,255,255,0,255,255,255,0,255,255,255,0,0,0,0,36,27,27,27,251,115,115,115,255,
+43,43,43,255,74,74,74,255,23,23,23,255,105,105,105,255,86,86,86,255,23,23,23,
+255,74,74,74,255,43,43,43,255,115,115,115,255,27,27,27,251,0,0,0,36,255,255,255,
+0,255,255,255,0,0,0,0,165,54,54,54,255,77,77,77,255,105,105,105,255,50,50,50,
+255,78,78,78,255,19,19,19,255,1,1,1,255,77,77,77,255,50,50,50,255,105,105,105,
+255,77,77,77,255,54,54,54,255,0,0,0,165,255,255,255,0,0,0,0,71,21,21,21,255,104,
+104,104,255,129,126,125,255,120,120,120,255,35,35,35,255,39,39,39,255,24,24,24,
+255,24,24,24,255,39,39,39,255,35,35,35,255,120,120,120,255,129,126,125,255,104,
+104,104,255,21,21,21,255,0,0,0,71,0,0,0,190,85,83,82,255,54,42,36,255,56,40,31,
+255,89,72,61,255,114,112,111,255,28,28,28,255,40,40,40,255,40,40,40,255,27,27,
+27,255,114,112,111,255,89,72,61,255,56,40,31,255,54,42,36,255,85,83,82,255,0,0,
+0,190,10,10,10,236,60,48,40,255,83,51,28,255,144,97,61,255,135,91,59,255,104,
+88,77,255,23,23,23,255,1,1,1,207,1,1,1,207,23,23,23,255,104,88,77,255,132,87,
+52,255,145,98,63,255,83,51,28,255,57,44,37,255,4,4,4,235,0,0,0,237,54,40,31,
+255,72,33,0,255,134,67,11,255,144,73,11,255,118,98,82,255,14,14,14,246,0,0,0,19,
+0,0,0,19,14,14,14,246,118,98,82,255,144,73,11,255,132,64,7,255,78,41,9,255,54,
+40,30,255,0,0,0,237,0,0,0,142,38,37,35,255,105,87,70,255,149,114,84,255,171,
+145,122,255,69,66,64,255,0,0,0,147,255,255,255,0,255,255,255,0,0,0,0,147,69,66,
+64,255,171,145,122,255,149,114,84,255,105,87,70,255,38,37,35,255,0,0,0,142,0,0,
+0,8,0,0,0,152,17,17,17,243,52,50,49,255,11,11,11,244,0,0,0,157,0,0,0,10,255,
+255,255,0,255,255,255,0,0,0,0,10,0,0,0,157,11,11,11,244,52,50,49,255,16,16,16,
+243,0,0,0,152,0,0,0,8,255,255,255,0,255,255,255,0,0,0,0,1,0,0,0,20,0,0,0,1,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+0,0,0,1,0,0,0,20,0,0,0,1,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0};
+MGL_EXPORT Fl_RGB_Image img_find(idata_find, 16, 16, 4, 0);
+
+static const unsigned char idata_prop[] =
+{0,0,0,0,153,153,153,172,129,129,129,255,129,129,129,255,129,129,129,255,
+129,129,129,255,129,129,129,255,129,129,129,255,129,129,129,255,129,129,129,255,
+129,129,129,255,129,129,129,255,129,129,129,255,129,129,129,255,129,129,129,86,
+0,0,0,0,0,0,0,0,129,129,129,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,129,129,129,
+255,0,0,0,0,0,0,0,0,129,129,129,255,255,255,255,255,236,236,236,255,234,234,234,
+255,234,234,234,255,235,235,235,255,235,235,235,255,235,235,235,255,236,236,236,
+255,236,236,236,255,237,237,237,255,240,240,240,255,255,255,255,255,129,129,129,
+255,0,0,0,0,0,0,0,0,129,129,129,255,255,255,255,255,234,234,234,255,196,196,196,
+255,197,197,197,255,197,197,197,255,198,198,198,255,198,198,198,255,198,198,198,
+255,198,198,198,255,199,199,199,255,240,240,240,255,255,255,255,255,129,129,129,
+255,0,0,0,0,0,0,0,0,129,129,129,255,255,255,255,255,234,234,234,255,235,235,235,
+255,235,235,235,255,105,105,105,255,105,105,105,255,105,105,105,255,210,210,210,
+255,237,237,237,255,238,238,238,255,240,240,240,255,255,255,255,255,129,129,129,
+255,0,0,0,0,0,0,0,0,129,129,129,255,255,255,255,255,235,235,235,255,197,197,197,
+255,198,198,198,255,176,176,176,255,88,88,88,255,88,88,88,255,88,88,88,255,198,
+198,198,255,199,199,199,255,240,240,240,255,255,255,255,255,129,129,129,255,0,0,
+0,0,0,0,0,0,129,129,129,255,255,255,255,255,235,235,235,255,105,105,105,255,
+210,210,210,255,236,236,236,255,210,210,210,255,105,105,105,255,105,105,102,255,
+236,236,236,255,238,238,238,255,240,240,240,255,255,255,255,255,129,129,129,255,
+0,0,0,0,0,0,0,0,129,129,129,255,255,255,255,255,235,235,235,255,88,88,88,255,
+88,88,88,255,176,176,176,255,88,88,88,255,106,106,106,255,106,106,106,255,210,
+210,204,255,238,238,238,255,240,240,240,255,255,255,255,255,129,129,129,255,0,0,
+0,0,0,0,0,0,129,129,129,255,255,255,255,255,236,236,236,255,105,105,105,255,
+105,105,105,255,105,105,105,255,106,106,106,255,106,106,106,255,106,106,106,255,
+106,106,106,255,214,214,214,255,240,240,240,255,255,255,255,255,129,129,129,255,
+0,0,0,0,0,0,0,0,129,129,129,255,255,255,255,255,236,236,236,255,176,176,176,
+255,88,88,88,255,88,88,88,255,88,88,88,255,88,88,88,255,89,89,89,255,98,98,98,
+255,108,108,108,255,220,220,220,255,255,255,255,255,129,129,129,255,0,0,0,0,0,0,
+0,0,129,129,129,255,255,255,255,255,236,236,236,255,237,237,237,255,238,238,
+238,255,238,238,238,255,239,239,239,255,212,212,212,255,119,119,119,255,133,133,
+133,255,144,144,144,255,157,157,157,255,255,255,255,255,129,129,129,255,0,0,0,0,
+0,0,0,0,129,129,129,255,255,255,255,255,237,237,237,255,198,198,198,255,199,
+199,199,255,199,199,199,255,200,200,200,255,200,200,200,255,181,181,181,255,146,
+146,146,255,158,158,158,255,171,171,171,255,255,255,255,255,129,129,129,255,0,0,
+0,0,0,0,0,0,129,129,129,255,255,255,255,255,237,237,237,255,237,237,237,255,
+238,238,238,255,239,239,239,255,239,239,239,255,240,240,240,255,240,240,240,255,
+224,224,224,255,173,173,173,255,186,186,186,255,255,255,255,255,129,129,129,255,
+0,0,0,0,0,0,0,0,129,129,129,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,129,129,129,
+255,0,0,0,0,0,0,0,0,149,149,149,180,129,129,129,255,129,129,129,255,129,129,129,
+255,129,129,129,255,129,129,129,255,129,129,129,255,129,129,129,255,129,129,129,
+255,129,129,129,255,129,129,129,255,129,129,129,255,129,129,129,255,149,149,149,
+168,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+MGL_EXPORT Fl_RGB_Image img_prop(idata_prop, 16, 16, 4, 0);
+
+static const unsigned char idata_alpha[] =
+{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,71,101,107,40,57,81,85,160,58,81,
+85,153,58,81,85,153,56,79,84,160,81,111,117,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,76,106,113,219,104,146,156,254,184,
+255,255,255,177,249,255,255,177,249,255,255,183,255,255,255,107,147,156,254,17,
+63,74,171,0,0,0,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,54,76,81,75,124,173,
+185,255,180,252,255,254,132,186,200,255,81,88,91,255,120,136,140,255,121,137,
+141,255,77,77,77,255,23,176,214,254,44,224,255,255,29,153,184,250,9,48,57,62,0,
+0,0,4,0,0,0,0,0,0,0,8,31,40,43,141,161,226,243,253,171,240,255,255,172,242,
+255,255,101,129,135,255,225,255,255,255,215,248,255,255,215,249,255,255,215,247,
+255,255,66,132,148,255,40,214,255,255,42,214,255,255,38,195,234,250,26,136,162,
+186,0,0,0,12,0,0,0,10,52,105,116,225,123,184,198,254,159,222,238,255,151,212,
+227,255,194,226,233,255,214,248,255,255,215,248,255,255,215,248,255,255,214,248,
+255,255,197,230,237,255,45,183,218,255,42,209,251,255,35,191,230,254,11,106,129,
+249,0,44,55,38,0,0,0,0,6,20,24,74,66,176,204,255,77,176,200,254,58,87,92,255,
+123,135,138,255,125,138,142,255,125,138,142,255,125,138,142,255,125,138,142,255,
+125,138,141,255,59,74,78,255,5,134,165,255,0,190,237,255,0,90,112,172,6,0,0,0,0,
+0,0,0,0,0,0,0,49,127,147,138,86,223,255,255,71,174,199,255,122,221,246,255,
+129,236,255,255,129,236,255,255,129,236,255,255,129,236,255,255,132,240,255,255,
+47,126,144,255,0,219,255,255,0,148,185,255,0,0,0,19,0,0,0,0,0,0,0,0,38,99,115,
+0,0,0,0,16,63,164,188,232,76,197,228,254,114,209,231,255,127,228,254,255,128,
+229,255,255,128,229,255,255,128,229,255,255,120,209,232,255,14,171,209,255,0,
+187,234,255,0,86,107,86,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,38,44,111,81,
+212,244,255,58,120,136,254,133,238,255,255,127,228,254,255,128,229,255,255,128,
+229,255,255,96,192,216,255,0,183,230,255,0,150,187,215,0,0,0,15,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,81,213,245,0,0,0,0,0,33,87,100,194,63,167,192,255,112,198,220,
+255,128,229,255,255,128,229,255,255,131,236,255,255,55,133,153,254,0,177,222,
+255,0,0,0,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,23,27,23,
+74,197,228,243,68,123,137,254,130,232,255,255,128,229,255,255,132,228,253,255,
+0,118,150,255,0,85,106,181,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,10,26,30,130,79,197,226,255,117,209,232,255,129,231,255,
+255,89,139,152,254,0,177,223,244,0,0,0,27,0,56,71,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,35,92,105,241,107,196,218,255,130,
+230,255,254,20,128,153,255,0,40,48,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,55,64,49,44,91,101,251,116,
+214,240,255,7,79,97,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,19,53,63,182,103,184,201,251,
+6,0,0,26,0,63,79,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,25,28,144,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+MGL_EXPORT Fl_RGB_Image img_alpha(idata_alpha, 16, 16, 4, 0);
+
+static const unsigned char idata_light[] =
+{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,36,0,242,236,7,1,
+252,199,57,2,204,204,0,0,248,246,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,230,7,2,0,0,0,0,254,201,68,7,253,218,31,9,
+253,207,49,17,255,200,59,4,251,234,19,12,255,230,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,255,246,0,0,255,204,38,1,254,218,34,13,253,207,37,19,
+254,199,43,40,253,204,30,62,253,203,33,68,254,200,42,51,253,220,20,23,253,199,
+68,8,255,200,69,4,252,214,35,1,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,250,203,62,
+3,251,213,35,18,254,196,48,44,253,204,26,107,240,182,37,162,240,188,75,212,
+240,189,79,211,241,185,49,188,250,198,22,99,254,199,36,38,254,204,57,27,251,215,
+38,7,255,247,0,0,0,0,0,0,0,0,0,0,255,248,0,1,254,238,15,10,254,198,50,48,248,
+193,26,135,235,176,68,232,244,210,126,255,246,219,125,255,246,220,125,255,245,
+215,127,255,237,188,89,239,245,186,25,153,254,203,41,62,251,228,20,15,248,240,0,
+2,0,0,0,0,0,0,0,0,255,197,62,3,254,193,54,14,254,207,22,81,230,154,14,226,243,
+207,91,255,247,223,99,255,249,230,104,255,249,231,105,255,248,226,101,255,244,
+213,93,255,232,166,32,242,250,205,15,97,252,226,9,17,252,220,39,13,249,247,6,1,
+255,255,64,0,253,201,67,6,254,195,55,43,243,181,24,155,231,160,3,255,245,214,60,
+255,249,231,78,255,251,238,82,255,251,238,83,255,250,234,80,255,247,222,69,255,
+236,182,14,255,237,172,14,182,254,195,52,63,254,198,69,18,253,197,51,2,255,255,
+0,0,253,225,22,5,253,206,30,39,235,164,11,174,236,178,6,255,245,217,28,255,
+250,235,46,255,252,242,54,255,252,243,55,255,251,237,49,255,247,224,33,255,240,
+195,13,255,233,164,9,205,254,198,39,54,251,196,58,3,255,0,0,0,252,196,86,1,253,
+198,66,13,254,202,43,50,236,168,12,172,236,179,6,255,246,219,28,255,250,236,44,
+255,253,246,63,255,253,249,66,255,251,240,49,255,248,225,33,255,240,196,13,255,
+234,167,11,206,253,194,46,65,253,187,70,17,251,181,61,3,255,255,0,1,252,233,18,
+9,253,210,41,40,247,193,25,144,231,162,3,253,244,210,24,255,250,236,75,255,
+253,247,114,255,253,248,117,255,251,240,84,255,246,219,34,255,236,181,7,255,240,
+180,20,176,254,211,37,68,253,223,35,20,253,248,0,3,248,248,3,1,253,225,30,13,
+254,206,48,21,254,199,36,63,232,161,8,194,237,184,11,255,248,226,80,255,253,246,
+150,255,253,247,155,255,249,232,93,255,240,198,21,255,231,164,7,222,253,202,31,
+97,253,205,50,39,252,218,41,16,248,235,15,3,0,0,0,0,255,128,0,0,254,201,66,3,
+254,194,51,21,252,198,39,114,233,165,8,195,233,173,17,253,242,204,61,255,243,
+208,66,255,236,182,24,254,232,167,7,213,250,192,36,123,254,191,58,51,252,212,42,
+6,251,229,23,7,255,255,0,0,0,0,0,0,0,0,0,0,255,203,80,2,254,204,61,24,253,208,
+39,28,254,205,32,72,247,195,24,131,237,171,19,171,236,170,16,166,245,190,26,
+154,254,204,36,103,255,192,53,35,254,195,68,20,253,196,65,7,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,255,204,82,0,255,236,19,2,253,218,40,6,252,221,28,20,254,200,54,
+47,254,193,56,45,254,191,46,35,254,206,49,57,253,206,44,36,254,216,46,15,255,
+186,57,2,255,219,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,236,
+13,3,251,231,17,8,254,198,66,7,254,198,74,9,255,188,53,2,254,223,34,17,250,214,
+41,12,252,233,28,6,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,251,243,0,1,255,210,78,1,255,170,85,0,0,0,0,0,247,238,5,2,255,
+255,0,0,255,255,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+MGL_EXPORT Fl_RGB_Image img_light(idata_light, 16, 16, 4, 0);
+
+static const unsigned char idata_grid[] =
+{0,0,0,0,21,21,21,11,0,0,0,51,0,0,0,50,0,0,0,50,0,0,0,50,0,0,0,50,0,0,0,50,
+0,0,0,50,0,0,0,50,0,0,0,50,0,0,0,50,0,0,0,50,0,0,0,51,21,21,21,11,0,0,0,0,0,0,
+0,0,0,0,0,63,255,255,255,255,255,255,255,255,244,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,244,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,244,255,255,255,255,255,255,255,0,0,0,63,0,0,0,0,0,0,0,0,0,0,0,
+62,255,255,255,255,225,224,220,255,170,199,233,255,223,223,224,255,224,225,226,
+255,232,229,227,255,174,203,236,255,230,231,231,255,231,232,232,255,238,237,232,
+255,176,206,238,255,255,255,255,255,0,0,0,62,0,0,0,0,0,0,0,0,0,0,0,62,255,255,
+255,255,236,231,226,255,223,232,243,255,237,235,232,255,236,234,230,255,246,241,
+235,255,226,237,247,255,245,242,238,255,243,240,237,255,251,245,240,255,228,237,
+246,255,255,255,255,255,0,0,0,62,0,0,0,0,0,0,0,0,0,0,0,61,244,255,255,255,220,
+230,241,255,0,98,255,255,226,235,244,255,178,207,239,255,227,237,246,255,0,98,
+255,255,229,238,247,255,183,212,243,255,230,238,248,255,0,97,255,255,250,255,
+255,255,0,0,0,62,0,0,0,0,0,0,0,0,0,0,0,61,255,255,255,255,235,232,230,255,226,
+235,244,255,239,238,236,255,237,237,237,255,246,243,239,255,229,238,248,255,245,
+244,242,255,242,242,242,255,251,248,244,255,231,240,250,255,255,255,255,255,0,0,
+0,62,0,0,0,0,0,0,0,0,0,0,0,61,255,255,255,255,234,232,228,255,179,208,240,255,
+236,236,236,255,238,239,239,255,246,242,239,255,184,213,245,255,244,243,243,255,
+244,244,244,255,252,249,245,255,187,215,248,255,255,255,255,255,0,0,0,62,0,0,0,
+0,0,0,0,0,0,0,0,61,255,255,255,255,243,240,233,255,227,237,247,255,246,244,
+240,255,246,243,240,255,255,248,243,255,231,240,250,255,254,250,246,255,254,251,
+246,255,255,255,248,255,233,242,252,255,255,255,255,255,0,0,0,62,0,0,0,0,0,0,0,
+0,0,0,0,61,244,255,255,255,225,235,245,255,0,98,255,255,230,238,248,255,184,
+213,245,255,231,240,250,255,0,97,255,255,233,242,252,255,189,217,250,255,234,
+243,252,255,0,96,255,255,250,255,255,255,0,0,0,62,0,0,0,0,0,0,0,0,0,0,0,61,255,
+255,255,255,243,240,236,255,229,238,248,255,246,245,243,255,244,244,244,255,255,
+250,246,255,233,242,252,255,253,252,250,255,251,250,250,255,255,255,251,255,235,
+243,253,255,255,255,255,255,0,0,0,62,0,0,0,0,0,0,0,0,0,0,0,61,255,255,255,255,
+243,240,236,255,183,212,244,255,244,243,243,255,244,245,245,255,254,252,247,255,
+190,218,251,255,251,250,250,255,251,251,251,255,255,255,252,255,193,221,253,255,
+255,255,255,255,0,0,0,62,0,0,0,0,0,0,0,0,0,0,0,61,255,255,255,255,250,246,239,
+255,230,239,249,255,252,249,245,255,253,251,246,255,255,255,249,255,234,243,253,
+255,255,255,251,255,255,255,252,255,255,255,253,255,236,244,254,255,255,255,255,
+255,0,0,0,62,0,0,0,0,0,0,0,0,0,0,0,61,243,255,255,255,228,237,247,255,0,97,255,
+255,232,241,251,255,189,218,249,255,234,243,252,255,0,96,255,255,235,244,254,
+255,193,221,253,255,236,244,254,255,0,96,255,255,250,255,255,255,0,0,0,62,0,0,0,
+0,0,0,0,0,0,0,0,61,255,255,255,255,246,244,240,255,231,239,250,255,250,248,
+246,255,249,248,248,255,255,254,250,255,235,243,253,255,255,254,253,255,254,254,
+253,255,255,255,254,255,233,241,251,255,255,255,255,255,0,0,0,62,0,0,0,0,0,0,0,
+0,0,0,0,62,255,255,255,255,255,255,255,255,211,240,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,210,239,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,209,239,255,255,255,255,255,255,0,0,0,63,0,0,0,0,0,0,0,0,16,16,
+16,15,0,0,0,64,0,0,0,62,0,0,0,62,0,0,0,62,0,0,0,62,0,0,0,62,0,0,0,62,0,0,0,62,
+0,0,0,62,0,0,0,61,0,0,0,61,0,0,0,62,16,16,16,13,0,0,0,0};
+MGL_EXPORT Fl_RGB_Image img_grid(idata_grid, 16, 16, 4, 0);
+
+static const unsigned char idata_move[] =
+{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,6,5,0,8,9,8,1,10,11,10,0,7,7,7,67,7,7,7,
+89,13,14,13,0,10,10,10,2,8,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,1,2,1,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,4,100,101,100,206,114,114,114,
+243,0,0,0,30,0,0,0,0,0,0,0,1,1,1,1,0,2,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,42,43,42,0,45,46,45,2,21,22,22,0,12,12,12,113,190,192,188,255,223,225,
+221,255,45,45,45,170,220,221,220,0,251,253,250,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,33,35,33,0,21,22,21,0,0,0,0,3,0,0,0,0,0,0,0,35,126,127,124,239,236,
+239,232,254,233,237,230,249,165,166,164,255,0,0,0,95,0,0,0,0,20,21,19,5,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,51,50,2,17,18,17,2,0,0,0,0,0,0,0,64,70,72,
+69,235,185,187,183,253,216,218,215,255,102,103,101,241,13,14,13,106,23,24,23,0,
+33,35,33,2,87,87,87,1,13,13,13,2,39,40,39,0,16,17,16,1,41,42,41,2,10,10,10,0,4,
+4,4,61,7,7,7,93,0,0,0,0,0,0,0,11,51,51,50,145,71,72,71,172,0,0,0,24,0,0,0,0,
+11,11,11,69,12,12,12,114,0,0,0,1,0,0,0,0,19,19,19,2,0,0,0,0,0,0,0,8,18,19,18,
+133,139,140,138,253,105,107,105,235,0,0,0,26,0,0,0,0,0,0,0,37,0,0,0,73,181,183,
+179,3,255,255,255,0,68,69,68,187,165,167,164,255,63,64,63,195,0,0,0,45,0,0,0,0,
+0,0,0,57,90,90,90,219,196,198,194,255,246,249,244,250,220,221,219,255,68,69,
+68,179,0,0,0,17,101,103,100,228,163,165,162,255,22,23,22,112,18,19,19,112,184,
+185,183,255,242,245,239,248,224,227,222,255,138,139,138,252,12,13,12,131,0,0,0,
+67,100,101,100,229,202,204,200,255,238,241,235,251,211,213,210,255,62,63,62,
+181,0,0,0,20,108,110,108,231,172,174,170,255,24,25,24,119,2,3,2,93,157,159,156,
+255,243,246,239,251,206,208,203,255,130,130,129,237,12,13,12,112,0,0,0,0,0,0,0,
+11,25,26,25,132,139,141,137,248,95,97,94,242,0,0,0,33,0,0,0,0,0,0,0,47,0,0,0,
+88,94,96,93,4,251,255,248,0,52,53,52,183,136,138,135,255,47,48,47,155,0,0,0,23,
+0,0,0,0,16,16,16,1,38,38,38,2,10,11,10,0,4,5,4,49,8,8,8,96,0,0,0,0,0,0,0,19,
+58,58,58,160,82,82,82,186,0,0,0,34,0,0,0,0,4,5,4,54,2,2,2,65,8,8,8,0,60,61,60,
+1,33,34,33,2,0,0,0,0,0,0,0,0,64,65,64,2,20,21,20,2,0,0,0,0,0,0,0,69,79,81,78,
+246,195,197,194,254,224,226,222,254,113,114,112,251,13,14,13,116,24,25,24,0,45,
+47,45,2,78,79,78,2,0,0,0,1,0,0,0,0,98,104,97,0,29,31,29,0,21,22,21,0,0,0,0,3,0,
+0,0,0,0,0,0,28,121,123,120,232,233,236,230,255,232,236,229,249,160,161,159,
+255,0,0,0,85,0,0,0,0,8,9,8,4,24,26,24,0,59,63,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,32,33,32,0,33,34,33,2,6,7,7,0,3,3,3,104,186,187,184,255,220,221,218,255,
+36,37,37,160,132,133,132,0,160,162,160,1,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,1,2,1,0,18,23,18,0,0,0,0,0,255,255,255,0,0,0,0,0,92,93,92,199,
+104,104,104,237,0,0,0,23,0,0,0,0,0,0,0,1,0,0,0,0,3,4,3,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,4,4,4,1,4,5,4,0,3,3,3,56,3,3,3,75,6,6,6,0,4,
+5,4,1,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+MGL_EXPORT Fl_RGB_Image img_move(idata_move, 16, 16, 4, 0);
+
+static const unsigned char idata_orig[] =
+{0,0,0,0,0,0,0,0,0,0,0,0,236,236,236,46,233,233,231,171,179,182,185,231,161,
+165,170,246,175,178,181,222,205,205,202,157,197,196,195,24,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,244,243,240,135,168,173,182,255,
+163,174,186,237,226,233,241,240,243,249,255,238,207,217,230,233,151,163,183,231,
+150,155,161,255,177,178,173,90,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+236,236,232,112,154,164,179,245,221,232,245,232,228,237,249,225,228,238,249,219,
+227,237,249,215,225,236,250,213,219,232,249,214,198,215,237,219,140,148,157,251,
+175,175,172,64,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,205,208,208,5,181,186,192,
+252,198,212,234,222,218,231,247,211,236,249,255,195,226,239,251,190,226,240,251,
+183,224,240,250,180,231,249,255,176,209,226,246,196,160,183,216,207,185,187,189,
+233,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,207,207,204,101,149,166,188,229,204,222,245,
+204,233,250,255,177,51,73,104,255,250,255,255,147,250,255,255,135,255,255,255,
+128,53,74,105,255,245,255,255,181,196,218,246,189,127,143,164,231,124,125,119,
+55,0,0,0,0,0,0,0,0,0,0,0,0,197,196,191,156,106,138,187,195,195,218,247,178,137,
+160,180,184,106,132,168,245,255,255,255,101,61,82,111,232,126,153,168,129,102,
+130,166,239,216,255,255,87,164,203,242,139,103,130,168,201,106,107,99,110,0,0,0,
+0,0,0,0,0,0,0,0,0,184,183,178,158,92,132,188,184,114,169,230,125,254,255,255,
+176,93,121,157,238,211,255,255,31,255,255,255,141,255,255,255,148,94,122,159,
+236,214,255,255,47,161,209,245,111,114,142,178,197,93,92,84,113,0,0,0,0,0,0,0,0,
+0,0,0,0,169,169,164,112,111,139,180,203,124,176,232,133,173,243,255,68,97,124,
+159,244,255,255,255,19,50,72,102,219,0,0,0,0,100,127,164,243,227,255,255,39,182,
+222,249,119,110,128,150,221,81,83,77,61,0,0,0,0,0,0,0,0,0,0,0,0,137,138,137,13,
+147,156,168,248,145,185,233,163,179,235,255,87,91,118,154,248,243,255,255,18,
+255,255,255,151,0,0,0,0,95,121,159,247,244,255,255,51,176,213,253,146,100,105,
+106,239,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,199,195,136,174,192,214,223,
+135,187,239,125,255,255,255,168,179,245,251,38,176,249,255,14,0,136,184,1,255,
+255,255,158,214,244,255,119,125,140,156,225,78,78,72,84,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,136,137,134,0,0,0,0,0,146,146,140,170,102,123,146,221,118,174,237,128,
+179,231,255,91,215,255,255,75,225,255,255,86,186,221,251,127,117,129,141,231,
+126,126,121,235,121,123,120,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,117,118,
+115,0,0,0,0,0,101,102,96,76,91,92,88,207,93,103,112,245,100,112,125,233,99,107,
+114,246,93,94,88,193,56,57,51,39,205,205,205,208,191,191,190,255,104,107,102,89,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,87,89,83,0,0,0,0,0,0,0,0,0,85,
+87,83,11,0,0,0,0,0,0,0,0,122,123,122,0,87,87,87,36,216,217,216,255,173,174,171,
+255,93,94,91,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,115,115,115,69,223,224,223,255,158,
+159,156,255,72,74,71,23,102,104,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,134,134,110,226,227,
+226,255,145,147,144,237,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,156,156,156,142,204,
+205,204,241,56,59,55,9};
+MGL_EXPORT Fl_RGB_Image img_orig(idata_orig, 16, 16, 4, 0);
+
+static const unsigned char idata_update[] =
+{255,255,255,0,255,255,255,0,255,255,255,0,52,101,164,29,58,105,167,159,58,
+106,167,222,54,103,165,246,57,105,167,229,58,106,167,188,52,101,164,83,52,101,
+164,5,255,255,255,0,255,255,255,0,255,255,255,0,52,101,164,121,52,101,164,16,
+255,255,255,0,255,255,255,0,53,101,164,80,56,104,166,246,104,144,192,250,143,
+176,211,255,168,194,223,255,168,193,222,255,147,177,212,255,95,135,185,244,55,
+103,165,240,52,101,164,88,255,255,255,0,53,102,164,102,52,101,164,255,52,101,
+164,15,255,255,255,0,52,101,164,41,57,105,166,245,140,173,211,255,157,189,220,
+255,161,190,221,255,180,203,229,255,191,211,233,255,204,221,238,255,213,226,240,
+255,191,210,231,255,75,119,175,245,54,103,165,192,67,113,171,247,53,102,164,252,
+52,101,164,14,255,255,255,0,57,105,167,155,105,144,192,253,114,152,197,255,60,
+107,168,255,53,102,164,255,58,106,167,252,93,133,183,243,161,187,217,254,216,
+228,241,255,219,230,242,255,221,232,243,255,136,167,206,253,200,216,234,255,58,
+106,167,249,52,101,164,13,255,255,255,0,56,104,166,243,65,112,171,255,60,108,
+169,254,58,106,167,245,52,101,164,117,52,101,164,25,52,101,164,69,56,105,166,
+205,97,136,185,245,205,219,235,255,226,235,245,255,230,238,246,255,230,238,246,
+255,58,106,167,250,52,101,164,11,255,255,255,0,53,101,164,254,58,106,167,251,
+104,145,199,157,55,103,165,230,52,101,164,35,255,255,255,0,255,255,255,0,255,
+255,255,0,52,101,164,96,53,102,164,255,199,215,233,255,198,216,235,255,227,236,
+245,255,58,106,166,250,52,101,164,10,255,255,255,0,52,101,164,252,76,121,179,
+126,118,157,207,43,87,131,187,19,52,101,164,2,255,255,255,0,255,255,255,0,52,
+101,164,4,56,104,166,196,143,172,208,250,231,238,246,255,219,230,242,255,230,
+238,246,255,58,106,166,251,52,101,164,9,255,255,255,0,52,101,164,13,255,255,255,
+0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,52,
+101,164,160,52,101,164,255,71,116,173,248,76,119,175,247,76,119,175,247,76,120,
+175,247,52,101,164,255,52,101,164,8,255,255,255,0,52,101,164,249,52,101,164,254,
+52,101,164,254,52,101,164,253,52,101,164,252,52,101,164,251,52,101,164,185,52,
+101,164,29,52,101,164,24,52,101,164,24,52,101,164,24,52,101,164,24,52,101,164,
+24,52,101,164,28,255,255,255,0,255,255,255,0,52,101,164,252,229,237,245,255,
+229,237,246,255,228,236,245,255,156,183,215,253,55,104,166,224,52,101,164,16,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,126,164,213,26,114,153,
+205,57,52,101,164,252,52,101,164,12,255,255,255,0,53,102,164,252,230,238,246,
+255,196,215,235,255,201,217,234,255,52,101,164,254,52,101,164,106,255,255,255,0,
+255,255,255,0,255,255,255,0,52,101,164,11,53,102,165,233,108,149,201,141,83,127,
+183,194,52,101,164,255,52,101,164,5,255,255,255,0,55,103,165,253,230,238,246,
+255,227,236,245,255,228,237,245,255,193,210,230,255,77,121,176,245,56,105,166,
+202,52,101,164,54,255,255,255,0,52,101,164,106,60,107,169,237,79,124,182,255,58,
+106,167,254,55,104,165,250,255,255,255,0,255,255,255,0,56,104,166,253,216,228,
+241,255,149,178,212,254,224,233,244,255,221,232,243,255,204,220,237,255,143,173,
+210,254,76,120,176,245,53,102,165,251,57,105,166,255,57,105,166,254,61,109,169,
+255,76,120,176,255,58,106,167,168,255,255,255,0,255,255,255,0,55,103,165,254,91,
+132,183,247,54,103,165,212,78,122,177,244,180,202,227,255,201,218,236,255,188,
+209,231,255,176,201,227,255,160,190,222,255,136,171,210,255,130,165,206,255,142,
+174,211,255,56,104,166,245,52,101,164,42,255,255,255,0,255,255,255,0,52,101,164,
+255,54,103,165,147,255,255,255,0,52,101,164,84,55,103,166,238,85,128,181,243,
+132,166,206,255,151,182,216,255,153,185,219,255,138,172,211,255,109,148,194,252,
+56,104,166,246,53,102,164,91,255,255,255,0,255,255,255,0,255,255,255,0,52,101,
+164,162,52,101,164,1,255,255,255,0,255,255,255,0,52,101,164,5,52,101,164,83,58,
+106,167,190,56,105,166,233,53,102,164,250,58,106,167,228,59,107,167,170,52,101,
+164,36,255,255,255,0,255,255,255,0,255,255,255,0};
+MGL_EXPORT Fl_RGB_Image img_update(idata_update, 16, 16, 4, 0);
+
+static const unsigned char idata_stop[] =
+{255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,222,0,0,46,205,0,0,214,211,36,
+36,225,218,72,72,230,223,95,95,233,218,72,72,230,212,32,32,217,222,0,0,46,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,222,0,0,46,201,30,30,243,226,164,163,255,233,182,181,255,234,183,
+183,255,234,185,185,255,233,181,180,255,227,167,167,255,201,30,30,243,222,0,0,
+46,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,222,0,
+0,46,193,28,27,243,224,154,154,255,230,143,142,255,229,140,139,255,229,136,
+135,255,227,133,132,255,225,128,127,255,222,126,125,255,221,144,144,255,193,27,
+26,243,222,0,0,46,255,255,255,0,255,255,255,0,255,255,255,0,222,0,0,46,189,24,
+23,244,224,157,155,255,227,134,133,255,231,140,139,255,232,137,136,255,230,122,
+121,255,230,119,118,255,229,126,125,255,226,125,124,255,220,109,108,255,223,147,
+145,255,190,24,24,244,222,0,0,46,255,255,255,0,255,255,255,0,189,4,4,215,221,
+149,146,255,226,126,125,255,230,132,131,255,251,232,232,255,251,230,229,255,233,
+120,118,255,233,116,114,255,250,226,226,255,251,230,230,255,226,110,108,255,218,
+96,94,255,222,148,144,255,189,4,4,215,255,255,255,0,255,255,255,0,180,0,0,224,
+209,95,90,255,225,111,110,255,231,117,116,255,251,226,226,255,255,255,255,255,
+251,227,226,255,250,226,225,255,255,255,255,255,250,223,222,255,229,93,91,255,
+222,79,77,255,211,93,88,255,180,0,0,224,255,255,255,0,255,255,255,0,174,0,0,225,
+209,85,78,255,227,97,95,255,234,94,92,255,233,103,100,255,250,225,224,255,255,
+255,255,255,255,255,255,255,250,226,225,255,235,114,112,255,237,122,120,255,235,
+122,120,255,215,96,89,255,174,0,0,225,255,255,255,0,255,255,255,0,170,0,0,226,
+191,26,13,255,216,30,26,255,224,41,37,255,227,71,67,255,249,222,221,255,255,255,
+255,255,255,255,255,255,249,221,220,255,224,66,62,255,220,18,13,255,217,5,0,255,
+199,14,0,255,170,0,0,226,255,255,255,0,255,255,255,0,164,0,0,226,190,16,0,255,
+216,5,0,255,219,26,21,255,248,211,210,255,255,255,255,255,247,211,210,255,247,
+211,210,255,255,255,255,255,247,211,210,255,218,27,21,255,218,5,0,255,201,17,0,
+255,164,0,0,226,255,255,255,0,255,255,255,0,163,0,0,219,181,19,0,255,216,5,0,
+255,219,26,21,255,248,211,210,255,248,211,210,255,218,27,21,255,216,25,19,255,
+247,208,207,255,249,214,213,255,217,27,21,255,218,5,0,255,187,20,0,255,163,0,0,
+219,255,255,255,0,255,255,255,0,206,0,0,47,145,5,0,246,191,18,0,255,218,5,0,255,
+220,27,21,255,220,27,21,255,224,7,0,255,225,7,0,255,220,25,18,255,220,28,23,255,
+220,6,0,255,192,18,0,255,145,5,0,246,206,0,0,47,255,255,255,0,255,255,255,0,255,
+255,255,0,206,0,0,47,140,6,0,246,191,20,0,255,220,6,0,255,221,6,0,255,223,7,0,
+255,224,7,0,255,223,7,0,255,221,6,0,255,193,22,1,255,140,6,0,246,206,0,0,47,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,206,0,0,47,
+137,6,0,246,176,4,0,255,203,16,11,255,208,24,19,255,211,28,23,255,208,24,19,255,
+188,24,20,255,137,6,0,246,206,0,0,47,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,206,0,0,47,149,0,0,222,
+154,23,23,231,162,41,41,233,164,47,47,233,162,41,41,233,158,20,20,224,206,0,0,
+47,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0};
+MGL_EXPORT Fl_RGB_Image img_stop(idata_stop, 16, 16, 4, 0);
+
+static const unsigned char idata_insert[] =
+{0,0,0,0,78,143,204,170,73,141,199,255,73,141,199,255,73,141,199,255,73,141,
+199,255,73,141,199,255,73,141,199,255,73,141,199,255,73,141,199,255,73,141,199,
+255,73,141,199,255,73,141,199,255,73,141,199,255,78,143,204,170,0,0,0,0,0,0,0,0,
+73,141,199,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,75,144,203,255,0,0,0,0,0,0,0,0,
+73,141,199,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,254,254,254,255,75,144,203,255,0,0,0,0,0,0,0,0,
+73,141,199,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,75,144,203,255,75,144,203,255,75,144,203,255,75,144,203,255,75,
+144,203,255,255,255,255,255,254,254,254,255,75,144,203,255,0,0,0,0,0,0,0,0,73,
+141,199,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,250,191,186,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,254,254,254,255,75,144,203,255,0,0,0,0,0,0,0,0,73,
+141,199,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,162,35,32,255,249,183,179,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,75,144,203,255,0,0,0,0,0,0,0,0,73,
+141,199,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,162,35,32,255,146,27,24,255,249,181,177,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,75,144,203,255,0,0,0,0,0,0,0,0,73,141,
+199,255,252,210,210,255,244,154,154,255,230,118,116,255,213,86,83,255,190,57,54,
+255,162,35,32,255,146,27,24,255,146,27,24,255,248,179,176,255,255,255,255,255,
+255,255,255,255,255,255,255,255,75,144,203,255,0,0,0,0,0,0,0,0,73,141,199,255,
+252,210,210,255,244,154,152,255,230,118,116,255,212,85,82,255,190,57,54,255,162,
+35,32,255,146,27,24,255,146,27,24,255,146,27,24,255,248,178,174,255,255,255,
+255,255,254,254,254,255,75,144,203,255,0,0,0,0,0,0,0,0,73,141,199,255,252,210,
+210,255,243,157,153,255,230,117,114,255,212,85,82,255,190,57,54,255,162,35,32,
+255,146,27,24,255,146,27,24,255,146,27,24,255,146,27,24,255,248,176,172,255,254,
+254,254,255,75,144,203,255,0,0,0,0,0,0,0,0,73,141,199,255,252,210,210,255,243,
+155,151,255,230,119,114,255,211,86,83,255,190,57,54,255,162,35,32,255,146,27,24,
+255,146,27,24,255,146,27,24,255,248,174,170,255,255,255,255,255,254,254,254,255,
+75,144,203,255,0,0,0,0,0,0,0,0,73,141,199,255,252,210,210,255,243,151,149,255,
+229,116,113,255,211,84,81,255,190,57,54,255,162,35,32,255,146,27,24,255,146,27,
+24,255,248,174,172,255,255,255,255,255,255,255,255,255,255,255,255,255,75,144,
+203,255,0,0,0,0,0,0,0,0,73,141,199,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,162,35,32,255,146,27,24,255,248,177,172,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,75,144,203,
+255,0,0,0,0,0,0,0,0,73,141,199,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,162,35,32,255,248,177,172,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,75,144,203,
+255,0,0,0,0,0,0,0,0,73,141,199,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,251,202,199,255,254,254,254,255,254,254,254,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,75,144,203,
+255,0,0,0,0,0,0,0,0,78,143,204,170,75,144,203,255,75,144,203,255,75,144,203,255,
+75,144,203,255,75,144,203,255,75,144,203,255,75,144,203,255,75,144,203,255,75,
+144,203,255,75,144,203,255,75,144,203,255,75,144,203,255,76,142,204,170,0,0,0,0};
+MGL_EXPORT Fl_RGB_Image img_insert(idata_insert, 16, 16, 4, 0);
+
+static const unsigned char idata_print[] =
+{255,255,255,0,255,255,255,0,255,255,255,0,0,0,0,10,0,0,0,28,0,0,0,28,0,0,0,
+28,0,0,0,28,0,0,0,28,0,0,0,28,0,0,0,28,0,0,0,28,0,0,0,11,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,0,0,0,79,170,170,
+170,192,171,171,171,191,171,171,171,191,171,171,171,191,171,171,171,191,171,171,
+171,191,171,171,171,191,170,170,170,192,0,0,0,78,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,0,0,0,93,253,253,253,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,0,0,0,93,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,0,0,0,93,245,245,246,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,0,0,0,93,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,136,136,136,232,229,229,232,255,
+243,243,244,255,251,251,251,255,255,255,255,255,255,255,255,255,255,255,255,255,
+251,251,251,255,243,243,244,255,136,136,136,232,255,255,255,0,255,255,255,0,255,
+255,255,0,136,136,136,53,136,136,136,255,147,147,147,255,145,145,145,255,211,
+211,215,255,225,225,228,255,235,235,237,255,241,241,242,255,243,243,244,255,241,
+241,242,255,235,235,237,255,225,225,228,255,145,145,145,255,164,164,164,255,147,
+147,147,255,136,136,136,53,136,136,136,159,145,145,145,255,164,164,164,255,135,
+135,135,255,189,189,194,255,203,203,207,255,214,214,217,255,220,220,223,255,222,
+222,225,255,220,220,223,255,214,214,217,255,203,203,207,255,136,136,136,255,183,
+183,183,255,164,164,164,255,145,145,145,159,180,180,180,227,239,239,239,255,239,
+239,239,255,116,116,116,255,91,91,91,255,91,91,91,255,89,89,89,255,87,87,87,255,
+87,87,87,255,89,89,89,255,91,91,91,255,91,91,91,255,119,119,119,255,239,239,
+239,255,239,239,239,255,180,180,180,227,183,183,183,231,248,248,248,255,248,248,
+248,255,116,116,116,255,78,78,78,255,78,78,78,255,96,96,96,255,98,98,98,255,98,
+98,98,255,96,96,96,255,78,78,78,255,78,78,78,255,119,119,119,255,248,248,248,
+255,248,248,248,255,183,183,183,231,169,169,169,246,202,202,202,255,202,202,202,
+255,172,172,172,255,175,175,175,255,175,175,175,255,156,156,156,255,149,149,149,
+255,149,149,149,255,156,156,156,255,175,175,175,255,175,175,175,255,172,172,172,
+255,202,202,202,255,202,202,202,255,169,169,169,246,174,174,174,231,229,229,229,
+255,226,226,226,255,197,197,197,255,193,193,193,255,192,192,192,255,191,191,191,
+255,190,190,190,255,190,190,190,255,191,191,191,255,192,192,192,255,193,193,193,
+255,197,197,197,255,226,226,226,255,193,193,193,255,174,174,174,231,164,164,164,
+231,204,204,204,255,153,153,153,255,9,9,9,255,7,7,7,255,7,7,7,255,7,7,7,255,7,7,
+7,255,7,7,7,255,7,7,7,255,7,7,7,255,7,7,7,255,9,9,9,255,153,153,153,255,178,
+178,177,255,164,164,164,231,136,136,136,223,136,136,136,255,100,100,100,255,90,
+90,90,255,102,102,106,255,173,173,179,255,182,182,188,255,188,188,193,255,190,
+190,195,255,188,188,193,255,182,182,188,255,110,110,113,255,90,90,90,255,100,
+100,100,255,136,136,136,255,136,136,136,223,255,255,255,0,255,255,255,0,255,255,
+255,0,121,121,121,255,158,158,161,255,216,216,219,255,226,226,228,255,231,231,
+233,255,233,233,235,255,231,231,233,255,226,226,228,255,169,169,171,255,121,121,
+121,255,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,122,122,122,255,222,222,224,255,245,245,246,255,252,252,253,255,
+255,255,255,255,255,255,255,255,255,255,255,255,252,252,253,255,235,235,236,255,
+122,122,122,255,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,0,0,0,32,0,0,0,83,0,0,0,83,0,0,0,83,0,0,0,83,0,0,0,83,0,0,0,
+83,0,0,0,83,0,0,0,83,0,0,0,32,255,255,255,0,255,255,255,0,255,255,255,0};
+MGL_EXPORT Fl_RGB_Image img_print(idata_print, 16, 16, 4, 0);
+
+static const unsigned char idata_goL[] =
+{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,90,167,0,37,89,164,90,36,86,161,125,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,37,87,161,14,35,82,153,164,32,77,144,255,31,74,138,255,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+38,89,165,55,34,82,152,221,71,111,161,255,150,183,211,255,24,58,108,255,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,89,166,2,
+37,88,164,121,41,89,161,250,111,148,188,255,173,205,227,255,174,205,227,255,18,
+43,82,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,
+89,165,27,37,87,163,189,60,106,170,255,140,173,206,255,162,193,218,255,163,194,
+219,255,163,195,220,255,12,30,58,255,14,36,68,255,17,44,84,255,21,54,103,255,22,
+57,110,255,20,54,105,240,0,0,0,0,0,0,0,0,37,88,163,78,38,88,161,235,86,126,177,
+255,143,175,203,255,149,180,208,255,152,183,212,255,154,185,214,255,154,186,215,
+255,154,186,215,255,153,184,213,255,150,181,210,255,145,176,204,255,139,169,196,
+255,18,49,96,255,0,0,0,0,35,84,157,145,44,90,156,254,102,136,175,255,128,159,
+189,255,134,166,197,255,139,171,203,255,143,176,208,255,146,179,212,255,148,181,
+213,255,148,181,213,255,146,179,212,255,142,174,207,255,130,162,196,255,90,122,
+162,255,15,45,88,255,0,0,0,0,33,79,147,145,40,81,141,254,85,117,157,255,108,139,
+175,255,122,154,189,255,130,163,199,255,136,169,206,255,139,173,209,255,138,172,
+210,255,133,167,208,255,122,157,202,255,103,140,189,255,76,113,166,255,55,89,
+140,255,13,40,80,255,0,0,0,0,0,0,0,0,28,68,127,76,26,63,119,234,39,74,126,255,
+68,104,157,255,84,121,175,255,95,133,187,255,104,141,194,255,109,146,199,255,
+111,148,201,255,108,145,199,255,100,137,191,255,83,121,175,255,58,93,145,255,10,
+35,72,255,0,0,0,0,0,0,0,0,0,0,0,0,23,57,108,24,21,53,101,184,32,64,112,255,78,
+114,167,255,100,137,191,255,111,148,201,255,119,155,208,255,6,16,32,255,7,21,41,
+255,8,26,53,255,10,32,65,255,10,34,69,255,8,31,64,240,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,18,49,93,1,17,46,88,114,20,46,86,248,71,103,149,255,116,153,205,255,128,
+163,215,255,7,20,40,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,38,74,48,11,32,64,214,49,74,110,255,122,
+155,204,255,7,23,46,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,31,62,10,9,28,56,152,7,26,52,255,7,
+24,50,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,26,54,78,7,27,55,160,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0};
+MGL_EXPORT Fl_RGB_Image img_goL(idata_goL, 16, 16, 4, 0);
+
+static const unsigned char idata_goU[] =
+{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,85,159,133,33,
+80,149,130,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,88,164,72,50,96,162,254,46,88,147,253,
+28,68,129,68,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,38,89,166,23,38,87,161,232,138,172,202,255,136,169,198,
+255,27,65,121,230,23,58,111,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,39,91,169,1,37,88,163,183,89,127,174,255,152,183,205,
+255,152,183,205,255,86,118,156,255,21,54,103,178,18,48,92,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,89,165,113,54,99,163,255,135,
+166,192,255,139,168,194,255,138,168,194,255,135,164,190,255,45,76,118,255,18,46,
+89,108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,88,164,49,38,
+87,158,248,110,142,178,255,128,158,188,255,130,160,189,255,129,160,189,255,126,
+156,186,255,110,140,171,255,22,50,90,246,15,40,79,44,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,33,77,143,13,30,72,135,218,74,110,154,255,117,148,182,255,121,
+152,187,255,123,154,189,255,123,154,189,255,120,151,186,255,115,146,180,255,75,
+104,140,255,14,39,76,210,12,36,72,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,63,116,
+164,42,74,119,255,102,135,172,255,111,144,182,255,117,150,189,255,120,153,192,
+255,118,152,192,255,104,138,182,255,83,117,164,255,56,89,139,255,21,49,89,255,
+11,34,68,144,0,0,0,0,0,0,0,0,0,0,0,0,25,60,111,85,21,48,90,255,56,87,130,255,
+80,115,163,255,89,125,176,255,96,132,184,255,98,135,188,255,95,132,187,255,90,
+127,182,255,79,116,170,255,64,100,152,255,42,75,123,255,9,32,65,254,7,29,60,68,
+0,0,0,0,0,0,0,0,22,53,99,118,16,39,73,255,12,27,50,255,8,18,32,255,7,12,20,
+255,103,140,194,255,110,146,200,255,111,148,200,255,105,142,195,255,16,40,74,
+255,14,40,77,255,12,37,73,255,8,30,62,255,8,29,59,152,0,0,0,0,0,0,0,0,25,60,111,
+0,21,52,97,18,18,44,83,20,15,38,72,21,4,10,20,255,115,151,204,255,125,161,213,
+255,127,163,214,255,118,154,207,255,11,33,66,255,12,35,71,13,10,35,69,12,8,29,
+62,12,8,29,60,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,24,47,255,
+122,158,210,255,138,173,224,255,143,178,228,255,129,165,216,255,11,34,68,255,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+14,37,71,255,122,158,210,255,141,176,226,255,150,184,234,255,130,166,216,255,
+11,36,72,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,18,48,93,255,110,146,200,255,124,160,212,255,127,163,215,255,
+114,151,204,255,10,34,69,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,54,104,242,21,54,101,255,19,50,94,255,18,45,
+86,255,15,40,77,255,8,31,64,242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,51,99,6,17,47,93,12,15,42,84,12,11,38,76,
+12,9,33,68,12,8,30,62,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+MGL_EXPORT Fl_RGB_Image img_goU(idata_goU, 16, 16, 4, 0);
+
+static const unsigned char idata_zoomIn[] =
+{0,0,0,0,0,0,0,0,0,0,0,0,236,236,236,46,233,233,231,171,179,182,185,231,161,
+165,170,246,175,178,181,222,205,205,202,157,197,196,195,24,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,236,235,233,135,169,174,183,255,
+167,177,189,237,224,231,240,240,250,255,255,236,205,215,229,233,154,166,185,231,
+151,156,162,255,172,173,169,90,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+228,228,225,112,156,166,180,245,220,230,243,232,227,236,248,225,239,248,255,217,
+60,82,112,255,235,246,255,211,218,231,247,214,197,213,235,219,141,149,158,251,
+171,171,169,64,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,205,208,208,5,180,185,192,
+252,198,212,233,222,217,230,246,211,222,235,249,200,233,246,255,187,124,149,179,
+240,232,246,255,177,216,233,249,183,208,225,245,196,162,184,215,207,182,185,187,
+233,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,207,207,204,101,152,168,190,229,200,218,242,
+203,223,242,255,180,234,252,255,162,255,255,255,141,115,142,172,231,255,255,255,
+126,237,255,255,136,240,254,255,181,193,215,243,188,127,143,165,231,120,121,116,
+55,0,0,0,0,0,0,0,0,0,0,0,0,197,196,191,156,108,141,188,194,217,240,255,196,49,
+65,86,233,79,102,131,209,71,94,123,201,148,168,192,255,59,83,115,189,59,85,117,
+187,34,52,73,216,209,240,255,164,103,130,167,199,104,105,98,110,0,0,0,0,0,0,0,0,
+0,0,0,0,184,183,178,158,93,132,188,183,168,206,239,161,231,255,255,162,238,
+255,255,146,253,255,255,131,113,141,172,229,255,255,255,126,241,255,255,135,243,
+255,255,142,194,228,247,146,113,140,176,195,91,91,84,113,0,0,0,0,0,0,0,0,0,0,0,
+0,169,169,164,112,113,141,181,203,123,174,230,131,160,220,245,79,182,245,251,
+48,224,255,255,25,103,132,165,210,255,255,255,11,187,246,252,29,184,246,252,45,
+179,219,246,116,110,128,150,221,79,81,76,61,0,0,0,0,0,0,0,0,0,0,0,0,137,138,137,
+13,146,156,168,248,146,185,232,163,166,216,245,97,189,247,252,54,239,255,255,
+26,92,121,157,205,255,255,255,5,199,248,253,24,209,251,253,63,175,211,248,146,
+100,105,107,239,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,195,193,190,136,171,189,
+211,223,143,190,238,130,179,236,249,70,160,240,249,29,254,255,255,255,0,0,0,0,
+227,253,254,49,214,242,255,125,127,141,157,225,78,79,74,84,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,136,137,134,0,0,0,0,0,143,144,139,170,104,124,147,221,127,177,235,
+134,177,228,255,92,198,248,255,59,219,252,255,86,185,219,246,133,120,132,142,
+231,127,127,123,235,120,122,119,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,117,
+118,115,0,0,0,0,0,99,100,95,76,91,93,90,207,93,104,113,245,101,113,126,233,100,
+108,115,246,94,95,90,193,60,62,56,39,200,200,200,208,187,187,186,255,104,106,
+102,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,87,89,83,0,0,0,0,0,0,0,0,
+0,82,84,80,11,0,0,0,0,0,0,0,0,122,123,122,0,89,89,89,36,210,211,210,255,170,
+171,169,255,93,94,91,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,114,114,114,69,217,218,217,
+255,156,157,154,255,73,75,72,23,102,104,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,132,132,110,
+220,221,220,255,143,145,142,237,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,156,156,156,
+142,204,205,204,241,56,59,55,9};
+MGL_EXPORT Fl_RGB_Image img_zoomIn(idata_zoomIn, 16, 16, 4, 0);
+
+static const unsigned char idata_zoomOut[] =
+{0,0,0,0,0,0,0,0,227,228,227,0,0,0,0,0,238,237,235,74,225,226,225,185,172,
+176,180,237,161,165,171,245,182,185,186,214,204,203,200,139,194,196,195,7,255,
+255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,221,221,220,0,0,0,0,0,236,235,
+233,181,156,164,175,249,172,181,194,237,234,241,249,240,240,245,255,238,195,205,
+220,231,147,158,178,233,154,158,162,248,170,171,168,52,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,231,231,227,167,142,154,173,234,233,242,253,232,229,
+237,249,224,229,238,249,219,227,237,249,215,224,235,249,214,220,233,249,215,182,
+199,223,219,149,154,159,252,150,152,148,24,143,145,142,0,0,0,0,0,0,0,0,0,204,
+204,203,0,219,219,217,44,166,174,186,251,215,228,247,222,218,231,246,209,222,
+236,250,198,226,239,250,189,226,241,251,183,223,238,250,180,214,231,248,184,207,
+225,245,199,141,163,195,211,204,204,200,189,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,213,
+211,205,152,146,167,197,217,202,220,243,199,229,247,255,177,240,255,255,159,249,
+255,255,144,253,255,255,135,250,255,255,132,241,255,255,142,244,255,255,188,173,
+201,239,183,132,142,153,249,0,4,0,6,0,0,0,0,0,0,0,0,0,0,0,0,194,195,191,208,105,
+143,199,184,224,247,255,193,38,54,77,231,72,95,126,208,68,91,122,204,63,87,118,
+199,55,81,113,192,50,77,111,186,26,43,65,219,205,238,255,168,97,116,143,223,105,
+106,100,59,0,0,0,0,0,0,0,0,0,0,0,0,182,181,179,209,79,129,198,166,175,213,244,
+155,239,255,255,159,245,255,255,144,246,255,255,135,247,255,255,131,248,255,255,
+132,247,255,255,136,247,255,255,145,193,228,250,156,102,120,145,220,91,92,86,61,
+0,0,0,0,0,0,0,0,0,0,0,0,174,172,165,165,95,136,193,182,127,180,234,122,166,
+228,247,71,182,244,252,47,184,246,252,33,185,246,252,23,185,246,252,22,185,246,
+252,31,183,246,252,50,171,211,248,132,99,111,123,244,73,75,71,9,0,0,0,0,0,0,0,0,
+165,166,164,0,157,156,153,60,138,155,178,231,160,195,239,157,168,223,246,85,191,
+247,252,51,196,247,252,34,203,249,254,20,204,250,253,15,198,248,253,28,214,251,
+253,77,163,198,240,162,93,93,89,203,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,202,
+202,199,190,163,186,218,205,142,193,239,117,186,244,252,63,195,248,253,40,202,
+249,254,19,225,252,255,9,232,255,255,62,202,233,255,136,112,121,129,242,77,78,
+74,38,85,87,83,0,0,0,0,0,0,0,0,0,0,0,0,0,139,140,138,0,0,0,0,0,140,140,138,208,
+103,128,161,202,135,190,249,123,186,235,255,86,216,255,255,74,219,253,255,91,
+177,208,236,147,109,117,122,244,138,139,135,198,110,112,108,67,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,119,121,118,0,0,0,0,0,101,101,94,106,91,94,92,220,95,
+105,116,243,100,113,125,234,99,106,111,244,91,91,85,175,0,0,0,15,215,215,215,
+255,169,170,168,255,88,90,84,44,155,157,158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,84,86,81,10,0,0,0,0,0,0,0,0,0,0,0,0,120,120,120,
+78,227,227,227,255,153,154,152,252,64,65,61,18,101,103,99,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+138,138,138,121,230,230,228,255,142,143,140,233,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,152,152,152,166,225,226,225,255,132,133,130,190,153,154,151,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,93,
+93,93,0,0,0,0,0,179,179,179,185,190,191,188,206};
+MGL_EXPORT Fl_RGB_Image img_zoomOut(idata_zoomOut, 16, 16, 4, 0);
+
+static const unsigned char idata_goD[] =
+{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,34,82,153,1,34,82,154,226,34,81,152,243,33,80,151,243,33,79,149,243,
+32,78,147,243,31,77,144,223,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,32,78,146,2,32,78,145,255,133,162,188,255,134,163,189,
+255,135,164,190,255,135,164,190,255,29,72,135,253,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,72,136,2,29,72,135,255,125,154,
+180,255,126,155,181,255,126,156,182,255,127,156,182,255,26,66,126,253,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,67,127,2,26,
+66,126,255,110,139,167,255,111,140,168,255,112,141,169,255,112,141,169,255,23,
+61,116,253,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,23,60,115,2,23,60,114,255,95,124,155,255,96,125,155,255,97,126,156,255,98,
+126,156,255,21,55,107,253,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,59,
+113,116,22,57,110,243,21,55,105,244,20,53,102,244,20,52,101,255,82,111,145,255,
+85,114,147,255,86,115,148,255,85,114,147,255,18,50,97,255,17,49,95,243,17,48,
+93,243,16,46,91,243,15,45,89,146,0,0,0,0,0,0,0,0,20,53,103,96,18,50,97,255,52,
+81,120,255,65,94,131,255,74,104,141,255,83,114,151,255,88,118,156,255,89,120,
+158,255,87,118,155,255,80,110,147,255,68,98,135,255,46,75,114,255,13,41,82,255,
+13,41,82,81,0,0,0,0,0,0,0,0,17,48,93,0,15,43,85,175,27,54,94,255,56,87,130,255,
+71,104,148,255,81,115,161,255,87,121,168,255,85,120,167,255,76,111,159,255,59,
+93,142,255,38,70,119,255,17,45,87,255,11,36,73,156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,13,38,75,19,11,34,68,228,37,68,112,255,68,104,156,255,83,120,175,255,92,
+129,184,255,93,131,185,255,86,124,178,255,73,110,163,255,44,75,122,255,9,32,65,
+217,9,33,67,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,29,59,65,12,32,60,253,
+76,112,163,255,102,140,194,255,115,152,204,255,117,154,206,255,108,144,198,255,
+84,120,172,255,14,36,68,250,8,30,62,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,5,19,39,136,30,50,78,255,114,151,203,255,136,171,222,255,140,
+175,226,255,122,158,210,255,36,57,88,255,6,23,48,122,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,18,39,6,4,14,29,203,68,92,128,255,131,
+167,218,255,137,172,223,255,75,99,135,255,4,15,31,194,6,21,44,3,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,13,27,38,7,14,24,
+243,84,116,162,255,86,118,164,255,7,14,23,240,4,13,27,32,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,9,19,97,
+15,25,39,255,14,23,37,255,2,9,17,91,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,11,24,164,3,
+11,24,160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+MGL_EXPORT Fl_RGB_Image img_goD(idata_goD, 16, 16, 4, 0);
+
+static const unsigned char idata_goR[] =
+{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,255,255,255,3,193,207,228,170,41,92,167,88,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,44,85,146,255,67,107,165,255,35,82,153,164,37,87,162,14,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,24,59,111,255,185,213,231,255,135,167,200,255,49,93,158,220,37,89,
+165,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,18,45,84,255,166,196,218,255,160,191,215,255,151,181,
+209,255,75,118,176,250,37,88,164,120,38,90,167,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,78,104,142,240,22,57,110,255,21,56,107,255,18,46,89,255,15,38,72,255,13,32,
+61,255,150,180,208,255,147,178,207,255,145,176,205,255,144,174,202,255,101,138,
+184,255,43,92,165,189,37,88,165,26,0,0,0,0,0,0,0,0,0,0,0,0,19,50,97,255,138,164,
+190,255,135,164,193,255,138,168,199,255,139,170,202,255,139,171,203,255,138,170,
+204,255,137,169,202,255,134,166,199,255,130,162,194,255,125,156,188,255,110,143,
+180,255,56,101,166,235,37,88,163,78,0,0,0,0,0,0,0,0,20,49,92,255,110,140,173,
+255,116,148,184,255,124,157,194,255,128,162,200,255,131,165,203,255,131,165,203,
+255,129,162,201,255,125,158,196,255,119,152,190,255,113,145,182,255,107,137,173,
+255,87,116,154,255,39,79,139,254,35,84,157,143,0,0,0,0,20,48,87,255,81,113,156,
+255,99,133,177,255,111,146,191,255,117,152,198,255,119,154,200,255,117,153,199,
+255,112,148,195,255,104,140,189,255,92,128,177,255,76,111,160,255,53,88,138,255,
+43,76,125,255,31,68,125,254,33,79,147,143,223,255,255,0,23,50,85,255,62,99,147,
+255,85,124,176,255,100,141,193,255,110,150,200,255,114,153,203,255,109,146,199,
+255,104,141,195,255,95,133,187,255,84,122,176,255,73,110,162,255,58,94,143,255,
+31,67,121,234,28,68,128,77,0,0,0,0,204,235,247,12,41,65,94,237,11,35,70,255,11,
+34,68,255,10,29,56,255,8,23,43,255,16,33,48,255,120,157,208,255,112,149,202,
+255,101,139,192,255,92,133,185,255,54,90,137,255,23,55,104,186,23,58,109,25,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,39,59,255,128,
+166,216,255,118,156,208,255,96,139,185,255,35,66,106,249,18,46,89,116,19,49,95,
+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,
+46,69,255,129,179,225,255,77,117,155,255,17,39,71,216,14,37,73,50,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,225,245,
+255,2,30,63,87,255,24,48,76,255,9,27,55,154,10,32,62,11,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,154,240,255,3,
+36,71,96,158,7,26,54,78,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+MGL_EXPORT Fl_RGB_Image img_goR(idata_goR, 16, 16, 4, 0);
+
+static const unsigned char idata_next[] =
+{255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,0,0,0,1,0,78,0,135,0,68,0,18,255,255,255,0,0,0,0,1,0,78,0,135,0,66,0,18,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,0,80,0,9,60,115,60,255,44,104,
+44,238,0,76,0,52,0,80,0,9,69,129,69,255,51,113,51,237,0,72,0,50,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,0,80,0,9,57,117,57,255,112,166,112,254,61,124,61,249,0,79,0,
+104,64,130,64,255,131,193,131,254,69,131,69,249,0,78,0,96,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,0,
+80,0,9,45,117,45,255,88,150,88,255,93,159,93,255,73,144,73,252,57,133,57,255,
+107,178,107,255,112,181,112,255,82,148,82,252,8,84,8,154,0,128,0,1,255,255,255,
+0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,0,80,0,9,35,119,35,
+255,64,136,64,255,68,148,68,255,73,156,73,255,78,163,78,255,82,167,82,255,87,
+169,87,255,91,169,91,255,80,153,80,252,15,95,15,203,0,68,0,18,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,0,80,0,9,27,123,27,255,39,127,39,255,43,
+141,43,255,48,151,48,255,52,158,52,255,58,162,58,255,62,163,62,255,67,160,67,
+255,71,156,71,255,70,146,70,252,22,105,23,235,0,82,0,50,255,255,255,0,255,255,
+255,0,255,255,255,0,0,80,0,9,19,125,19,255,17,121,17,255,21,137,21,255,24,150,
+24,255,27,157,27,255,31,161,31,255,37,161,37,255,43,156,43,255,48,149,48,255,
+52,139,52,255,58,131,58,254,31,110,31,249,0,89,0,82,255,255,255,0,255,255,255,
+0,0,80,0,9,9,128,10,255,0,123,0,255,0,140,0,255,0,154,0,255,0,163,0,255,0,163,
+0,255,0,157,0,255,0,144,0,255,1,128,1,255,1,111,1,255,3,92,3,254,13,101,14,
+248,0,94,3,85,255,255,255,0,255,255,255,0,0,80,0,9,12,135,13,255,0,133,0,255,0,
+153,0,255,0,171,0,255,0,183,0,255,0,184,0,255,0,174,0,255,0,157,0,255,0,138,0,
+255,9,123,9,251,14,118,16,237,0,97,5,54,255,255,255,0,255,255,255,0,255,255,255,
+0,0,80,0,9,15,139,17,255,0,137,0,255,0,160,0,255,0,182,0,255,7,202,7,255,0,
+204,0,255,0,187,0,255,0,165,0,255,16,148,17,251,13,127,15,212,0,113,0,20,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,0,80,0,9,19,141,21,255,0,
+135,0,255,0,158,0,255,0,165,2,252,23,182,25,255,0,208,0,255,1,186,1,255,25,162,
+27,252,9,130,12,167,0,128,0,1,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,0,80,0,9,22,139,24,255,6,130,6,254,0,146,2,250,0,133,2,
+119,22,170,24,255,7,184,7,254,30,163,31,251,2,128,4,111,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,0,
+80,0,9,40,148,43,255,24,150,28,242,0,134,4,61,0,80,0,9,40,164,43,255,26,156,30,
+242,0,128,4,58,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,0,0,0,1,3,148,6,147,0,130,0,21,
+255,255,255,0,0,0,0,1,3,142,6,147,0,130,0,21,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0};
+MGL_EXPORT Fl_RGB_Image img_next(idata_next, 16, 16, 4, 0);
+
+static const unsigned char idata_play[] =
+{255,0,255,0,255,0,255,0,133,38,131,129,129,181,127,231,127,231,129,181,131,
+129,133,38,255,0,255,0,255,0,255,0,255,0,255,0,127,1,125,113,121,246,114,255,
+116,255,127,255,127,255,116,255,114,255,121,246,125,113,127,1,255,0,255,0,255,0,
+122,1,121,182,111,255,119,255,186,255,208,255,217,255,219,255,212,255,186,255,
+118,255,111,255,121,182,122,1,255,0,255,0,115,113,107,255,142,255,211,255,232,
+255,239,255,242,255,243,255,241,255,234,255,221,255,141,255,107,255,115,113,255,
+0,113,38,108,246,115,255,213,255,237,255,246,255,178,255,242,255,253,255,252,
+255,250,255,241,255,226,255,116,255,108,246,113,38,106,129,97,255,190,255,236,
+255,246,255,253,255,141,255,134,255,207,255,255,255,255,255,252,255,241,255,208,
+255,97,255,106,128,101,181,102,255,206,255,241,255,252,255,255,255,125,255,102,
+255,88,255,143,255,242,255,255,255,250,255,233,255,104,255,101,181,96,231,115,
+255,208,255,239,255,252,255,255,255,102,255,81,255,64,255,64,255,94,255,204,255,
+252,255,239,255,123,255,96,231,93,231,114,255,213,255,241,255,253,255,255,255,
+54,255,23,255,7,255,37,255,83,255,203,255,253,255,241,255,124,255,93,231,91,
+181,96,255,208,255,239,255,252,255,255,255,59,255,33,255,24,255,114,255,240,255,
+255,255,252,255,239,255,100,255,91,181,91,129,84,255,184,255,233,255,250,255,
+255,255,74,255,72,255,187,255,255,255,255,255,255,255,250,255,219,255,84,255,91,
+128,89,38,85,246,103,255,221,255,241,255,252,255,148,255,241,255,255,255,255,
+255,255,255,252,255,241,255,115,255,85,246,89,38,255,0,86,113,80,255,134,255,
+226,255,241,255,250,255,252,255,253,255,252,255,250,255,241,255,154,255,80,255,
+86,113,255,0,255,0,87,1,86,182,79,255,104,255,208,255,233,255,239,255,241,255,
+239,255,219,255,114,255,79,255,86,182,87,1,255,0,255,0,255,0,86,1,84,113,82,246,
+79,255,93,255,118,255,120,255,95,255,79,255,82,246,84,113,86,1,255,0,255,0,255,
+0,255,0,255,0,255,0,85,38,84,129,82,181,81,231,81,231,82,181,84,129,85,38,255,
+0,255,0,255,0,255,0};
+MGL_EXPORT Fl_RGB_Image img_play(idata_play, 16, 16, 2, 0);
+
+static const unsigned char idata_prev[] =
+{255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,0,66,0,18,0,78,0,135,0,0,0,1,255,255,255,0,0,68,0,18,0,
+78,0,135,0,0,0,1,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,0,72,0,50,51,113,51,237,69,
+129,69,255,0,80,0,9,0,76,0,52,44,106,44,238,60,116,60,255,0,80,0,9,255,255,255,
+0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,0,78,0,96,69,130,69,249,131,192,131,254,64,130,64,255,0,79,0,104,61,
+126,61,249,112,170,112,254,57,121,57,255,0,80,0,9,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,0,128,0,1,8,84,8,154,82,144,82,252,
+112,179,112,255,107,177,107,255,57,133,57,255,73,145,73,252,93,163,93,255,88,
+155,88,255,45,121,45,255,0,80,0,9,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,0,68,0,18,15,92,15,203,80,147,80,252,91,164,91,255,87,165,87,255,82,
+165,82,255,78,164,78,255,73,159,73,255,68,153,68,255,64,144,64,255,35,125,35,
+255,0,80,0,9,255,255,255,0,255,255,255,0,255,255,255,0,0,82,0,50,22,101,23,235,
+70,135,70,252,71,148,71,255,67,153,67,255,62,157,62,255,58,159,58,255,52,159,
+52,255,48,155,48,255,43,148,43,255,39,137,39,255,27,129,27,255,0,80,0,9,255,
+255,255,0,255,255,255,0,0,89,0,82,31,103,31,249,58,119,58,254,52,127,52,255,48,
+136,48,255,43,146,43,255,37,152,37,255,31,157,31,255,27,158,27,255,24,155,24,
+255,21,147,21,255,17,134,17,255,19,133,19,255,0,80,0,9,255,255,255,0,255,255,
+255,0,0,94,3,85,13,92,14,248,3,71,3,254,1,91,1,255,1,110,1,255,0,127,0,255,0,
+144,0,255,0,157,0,255,0,163,0,255,0,163,0,255,0,154,0,255,0,140,0,255,9,137,10,
+255,0,80,0,9,255,255,255,0,255,255,255,0,255,255,255,0,0,97,5,54,14,112,16,237,
+9,104,9,251,0,117,0,255,0,138,0,255,0,157,0,255,0,174,0,255,0,184,0,255,0,183,
+0,255,0,171,0,255,0,153,0,255,12,146,13,255,0,80,0,9,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,0,113,0,20,13,125,15,212,16,130,17,251,0,143,
+0,255,0,165,0,255,0,187,0,255,7,205,7,255,0,201,0,255,0,182,0,255,0,160,0,255,
+15,150,17,255,0,80,0,9,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,0,128,0,1,9,130,12,167,25,151,27,252,1,164,1,255,0,186,0,255,23,
+184,25,255,0,179,2,252,0,181,0,255,0,158,0,255,19,152,21,255,0,80,0,9,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,2,128,4,111,30,157,31,251,7,173,7,254,22,171,24,255,0,133,2,119,0,154,
+2,250,6,151,6,254,22,149,24,255,0,80,0,9,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,0,
+128,4,58,26,154,30,242,41,165,44,255,0,80,0,9,0,134,4,61,24,155,28,242,41,156,
+44,255,0,80,0,9,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,0,130,0,21,3,
+142,6,147,0,0,0,1,255,255,255,0,0,130,0,21,3,148,6,147,0,0,0,1,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0};
+MGL_EXPORT Fl_RGB_Image img_prev(idata_prev, 16, 16, 4, 0);
+
+static const unsigned char idata_plot[] =
+{0,0,0,0,121,121,121,78,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,121,121,39,
+123,123,123,157,125,125,125,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,126,180,255,69,133,185,255,48,0,0,0,0,121,121,
+121,118,123,123,123,157,125,125,125,118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,103,165,254,25,110,169,250,168,120,175,251,220,131,
+183,255,50,0,0,0,0,0,0,0,0,125,125,125,157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,156,251,75,96,160,249,234,107,167,250,133,116,
+174,255,9,0,0,0,0,0,0,0,0,0,0,0,0,127,127,127,157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,77,150,252,7,83,152,248,224,92,158,251,64,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,126,126,126,157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,73,145,247,109,79,149,248,178,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,120,120,120,157,125,125,125,217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,184,42,77,62,184,38,78,51,59,140,249,11,68,142,247,230,76,149,252,47,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,126,126,126,157,0,0,0,0,0,0,0,0,184,
+43,74,3,181,42,76,128,180,39,79,233,180,35,84,224,66,125,230,135,63,141,248,
+167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,125,125,157,0,0,
+0,0,182,43,73,24,180,41,75,189,180,39,80,189,181,38,83,24,183,33,94,154,131,
+70,156,251,58,140,250,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,
+120,120,157,122,124,123,217,181,40,71,52,181,42,76,229,181,40,81,128,184,38,84,
+3,0,0,0,0,52,117,233,133,167,38,124,254,185,25,119,69,0,0,0,0,0,0,0,0,0,0,0,0,
+188,14,158,56,189,13,162,42,0,0,0,0,0,0,0,0,123,125,124,157,182,39,76,48,184,39,
+80,62,0,0,0,0,0,0,0,0,28,119,245,23,35,124,247,236,141,55,157,99,184,23,130,
+224,185,21,138,14,0,0,0,0,186,14,158,65,185,13,160,233,189,12,165,53,0,0,0,0,0,
+0,0,0,124,124,123,157,0,0,0,0,0,0,0,0,8,107,246,28,13,108,243,121,24,114,242,
+218,32,121,245,139,0,0,0,0,184,20,139,153,183,17,144,153,183,13,156,64,185,12,
+161,233,187,11,166,62,0,0,0,0,0,0,0,0,120,120,120,157,125,124,122,217,6,105,246,
+49,9,105,243,184,9,105,243,236,11,106,243,152,20,114,245,57,29,121,250,0,0,0,0,
+0,188,18,150,14,183,14,154,224,184,12,162,235,186,10,166,63,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,124,123,121,157,4,103,244,47,6,103,242,88,6,104,244,9,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,8,163,51,186,7,166,56,0,0,0,0,123,125,123,
+118,125,125,125,39,0,0,0,0,0,0,0,0,127,126,125,157,125,124,122,157,125,123,120,
+157,125,124,122,217,126,125,124,157,126,126,126,157,125,125,125,217,126,126,126,
+157,124,126,124,157,122,124,122,217,123,125,123,157,123,125,123,157,123,123,123,
+157,123,123,123,157,121,121,121,78,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,120,120,
+157,0,0,0,0,0,0,0,0,120,120,120,157,0,0,0,0,0,0,0,0,120,120,120,157,0,0,0,0,0,0,
+0,0,121,121,121,118,121,121,121,39,0,0,0,0};
+MGL_EXPORT Fl_RGB_Image img_plot(idata_plot, 16, 16, 4, 0);
+
+static const unsigned char idata_system[] =
+{103,98,38,0,103,98,38,93,104,99,38,255,104,99,38,255,104,99,38,255,104,99,
+38,255,104,99,38,255,104,99,38,255,104,99,38,255,104,99,38,255,104,99,38,255,
+104,99,38,255,104,99,38,255,104,99,38,255,103,98,38,93,103,98,38,0,103,98,38,93,
+104,99,38,255,233,209,166,255,228,204,158,255,227,204,158,255,227,203,157,255,
+227,203,157,255,227,203,157,255,227,203,157,255,227,203,157,255,227,203,157,255,
+227,203,157,255,227,203,157,255,228,204,159,255,104,99,38,255,103,98,38,93,104,
+99,38,255,221,197,150,255,223,199,150,255,223,199,150,255,223,199,150,255,223,
+199,150,255,223,199,150,255,223,199,150,255,227,192,130,255,223,198,150,255,223,
+198,150,255,223,198,150,255,223,198,150,255,223,198,150,255,226,191,130,255,104,
+99,38,255,104,99,38,255,221,197,150,255,126,105,32,255,104,99,38,255,104,99,38,
+255,104,99,38,255,104,99,38,255,104,99,38,255,104,99,38,255,104,99,38,255,104,
+99,38,255,104,99,38,255,104,99,38,255,126,105,32,255,221,197,150,255,104,99,38,
+255,104,99,38,255,221,197,150,255,104,99,38,255,193,125,17,255,193,125,17,255,
+193,125,17,255,193,125,17,255,193,125,17,255,193,125,17,255,193,125,17,255,193,
+125,17,255,193,125,17,255,193,125,17,255,104,99,38,255,213,188,136,255,108,103,
+43,255,104,99,38,255,221,197,150,255,104,99,38,255,193,125,17,255,193,125,17,
+255,193,125,17,255,193,125,17,255,193,125,17,255,193,125,17,255,193,125,17,255,
+193,125,17,255,193,125,17,255,193,125,17,255,104,99,38,255,215,191,140,255,108,
+103,43,255,104,99,38,255,221,197,150,255,104,99,38,255,193,125,17,255,193,125,
+17,255,193,125,17,255,193,125,17,255,104,99,38,255,104,99,38,255,193,125,17,
+255,193,125,17,255,193,125,17,255,193,125,17,255,104,99,38,255,215,191,140,255,
+108,103,43,255,104,99,38,255,221,197,150,255,126,105,32,255,104,99,38,255,104,
+99,38,255,104,99,38,255,104,99,38,255,104,99,38,255,104,99,38,255,104,99,38,
+255,104,99,38,255,104,99,38,255,104,99,38,255,115,102,34,255,213,188,136,255,
+104,99,38,255,104,99,38,255,221,197,150,255,193,125,17,255,193,125,17,255,193,
+125,17,255,193,125,17,255,193,125,17,255,193,125,17,255,193,125,17,255,193,125,
+17,255,193,125,17,255,193,125,17,255,193,125,17,255,193,125,17,255,213,188,136,
+255,104,99,38,255,104,99,38,255,215,191,140,255,126,105,32,255,104,99,38,255,
+104,99,38,255,104,99,38,255,104,99,38,255,104,99,38,255,104,99,38,255,104,99,38,
+255,104,99,38,255,104,99,38,255,104,99,38,255,126,105,32,255,213,188,136,255,
+104,99,38,255,104,99,38,255,215,191,140,255,104,99,38,255,193,125,17,255,193,
+125,17,255,193,125,17,255,193,125,17,255,193,125,17,255,193,125,17,255,193,125,
+17,255,193,125,17,255,193,125,17,255,193,125,17,255,104,99,38,255,210,186,133,
+255,104,99,38,255,104,99,38,255,215,191,140,255,104,99,38,255,193,125,17,255,
+193,125,17,255,193,125,17,255,193,125,17,255,193,125,17,255,193,125,17,255,193,
+125,17,255,193,125,17,255,193,125,17,255,193,125,17,255,104,99,38,255,210,186,
+133,255,104,99,38,255,104,99,38,255,213,188,136,255,104,99,38,255,193,125,17,
+255,193,125,17,255,193,125,17,255,193,125,17,255,104,99,38,255,104,99,38,255,
+193,125,17,255,193,125,17,255,193,125,17,255,193,125,17,255,104,99,38,255,210,
+186,133,255,104,99,38,255,104,99,38,255,213,188,136,255,126,105,32,255,104,99,
+38,255,104,99,38,255,104,99,38,255,104,99,38,255,104,99,38,255,104,99,38,255,
+104,99,38,255,104,99,38,255,104,99,38,255,104,99,38,255,104,99,38,255,210,186,
+133,255,104,99,38,255,104,99,38,255,219,182,118,255,210,186,133,255,210,186,133,
+255,210,186,133,255,210,186,133,255,208,183,130,255,210,186,133,255,208,183,130,
+255,208,183,130,255,208,183,130,255,208,183,130,255,210,186,133,255,208,183,130,
+255,210,186,133,255,104,99,38,255,95,91,41,141,104,99,38,255,108,103,43,255,108,
+103,43,255,108,103,43,255,108,103,43,255,108,103,43,255,108,103,43,255,104,99,
+38,255,104,99,38,255,104,99,38,255,104,99,38,255,104,99,38,255,104,99,38,255,
+104,99,38,255,104,99,38,255};
+MGL_EXPORT Fl_RGB_Image img_system(idata_system, 16, 16, 4, 0);
+
+static const unsigned char idata_info[] =
+{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,75,119,134,58,74,119,225,56,73,
+120,252,56,74,121,253,58,75,119,227,61,76,118,141,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,73,119,33,59,76,120,226,164,173,195,255,
+237,239,244,255,252,252,253,255,247,249,251,255,226,231,239,255,154,165,190,255,
+62,78,121,233,61,77,118,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,60,
+77,120,230,208,213,224,255,245,248,250,213,232,239,244,170,226,234,243,164,217,
+227,238,168,211,223,235,178,216,226,237,217,185,196,214,255,65,81,123,240,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,77,118,142,164,173,195,255,245,248,250,
+214,239,243,247,160,244,247,250,159,235,240,246,162,223,232,242,166,212,224,237,
+170,194,211,228,167,197,213,229,211,141,156,184,255,67,81,119,162,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,64,80,122,237,237,239,244,255,232,239,245,172,243,247,250,
+159,250,252,253,157,236,241,247,161,223,231,242,164,208,221,235,164,193,210,228,
+165,120,157,196,138,197,210,225,255,70,85,127,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,57,74,121,253,250,251,253,255,224,233,242,165,238,243,248,178,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,193,204,215,193,89,136,185,
+123,206,219,233,255,57,75,122,254,97,100,113,2,0,0,0,0,0,0,0,0,0,0,0,0,58,75,
+122,254,244,247,250,255,214,225,237,167,222,231,241,167,255,255,255,255,235,240,
+245,201,224,230,236,204,210,218,226,200,145,174,205,145,83,130,182,125,201,214,
+231,255,57,75,122,254,97,100,113,11,0,0,0,0,0,0,0,0,0,0,0,0,69,84,126,244,224,
+229,237,255,203,217,232,173,200,215,232,158,255,255,255,255,192,208,227,151,181,
+202,224,150,157,185,214,144,92,137,186,123,96,142,188,140,181,199,219,255,72,88,
+131,249,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74,87,122,186,152,164,189,255,212,224,
+236,215,166,190,216,147,255,255,255,255,165,190,216,148,135,168,204,135,91,137,
+185,122,75,126,178,128,170,193,217,214,126,145,177,255,84,96,131,215,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,97,100,113,10,71,87,128,247,183,194,213,255,195,211,228,
+211,119,157,197,138,255,255,255,255,82,129,181,126,94,141,186,141,169,192,217,
+214,155,174,200,255,73,89,133,250,97,100,113,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,79,88,115,77,71,87,128,249,140,155,184,255,194,208,224,255,204,217,
+232,255,199,214,229,255,181,198,218,255,126,144,178,255,74,90,134,251,89,98,124,
+106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,97,100,113,19,88,99,
+131,221,75,91,131,252,166,172,152,255,167,173,152,255,171,177,152,255,94,104,
+128,243,97,100,113,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,89,89,66,12,94,94,62,255,235,237,193,255,245,248,202,255,221,
+223,171,255,94,94,62,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,89,89,66,7,94,94,62,255,128,128,92,255,168,170,132,
+255,138,139,102,255,94,94,62,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,94,94,62,255,227,230,186,254,243,
+246,201,255,211,213,176,254,94,94,62,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,94,94,62,76,57,57,54,165,70,
+70,70,236,48,48,48,169,94,94,62,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+MGL_EXPORT Fl_RGB_Image img_info(idata_info, 16, 16, 4, 0);
+
+static const unsigned char idata_help[] =
+{0,0,0,0,141,143,138,137,137,139,134,252,136,138,133,255,136,138,133,255,
+136,138,133,255,136,138,133,255,136,138,133,255,136,138,133,255,136,138,133,255,
+136,138,133,255,136,138,133,255,136,138,133,255,137,139,134,252,143,145,140,137,
+0,0,0,0,0,0,0,0,137,139,134,252,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,138,140,135,
+252,0,0,0,0,0,0,0,0,136,138,133,255,255,255,255,255,222,225,219,255,192,195,188,
+255,186,189,182,255,186,189,182,255,186,189,182,255,186,189,182,255,186,189,182,
+255,186,189,182,255,194,196,190,255,234,236,232,255,255,255,255,255,136,138,133,
+255,0,0,0,0,0,0,0,0,136,138,133,255,255,255,255,255,223,226,220,255,227,229,224,
+255,230,233,228,255,234,236,232,255,237,238,235,255,239,240,237,255,240,241,239,
+255,240,241,238,255,238,240,237,255,236,237,234,255,255,255,255,255,136,138,133,
+255,0,0,0,0,0,0,0,0,136,138,133,255,255,255,255,255,224,227,221,255,228,230,225,
+255,197,171,168,255,163,122,119,255,141,143,138,255,141,143,138,255,164,126,123,
+255,202,177,174,255,240,241,239,255,237,239,236,255,255,255,255,255,136,138,133,
+255,0,0,0,0,0,0,0,0,136,138,133,255,255,255,255,255,225,227,222,255,177,121,119,
+255,163,40,39,255,214,147,146,255,238,238,236,255,238,238,237,255,215,156,155,
+255,165,41,39,255,181,125,123,255,239,240,237,255,255,255,255,255,136,138,133,
+255,0,0,0,0,0,0,0,0,136,138,133,255,255,255,255,255,198,171,168,255,163,40,39,
+255,240,134,134,255,235,87,87,255,186,166,162,255,186,166,162,255,235,92,92,255,
+240,159,159,255,166,42,41,255,208,180,178,255,255,255,255,255,136,138,133,255,0,
+0,0,0,0,0,0,0,136,138,133,255,255,255,255,255,162,131,127,255,215,143,142,255,
+236,87,87,255,171,16,16,255,185,147,144,255,185,147,144,255,171,16,16,255,237,
+95,95,255,219,164,162,255,166,130,126,255,255,255,255,255,136,138,133,255,0,0,
+0,0,0,0,0,0,136,138,133,255,255,255,255,255,141,143,138,255,240,240,238,255,
+186,169,166,255,182,136,133,255,244,245,243,255,248,248,247,255,189,152,150,255,
+187,166,163,255,242,242,241,255,141,143,138,255,255,255,255,255,136,138,133,255,
+0,0,0,0,0,0,0,0,136,138,133,255,255,255,255,255,141,143,138,255,242,242,241,
+255,186,168,165,255,183,150,147,255,244,245,243,255,248,249,248,255,186,141,139,
+255,188,174,171,255,245,245,244,255,141,143,138,255,255,255,255,255,136,138,133,
+255,0,0,0,0,0,0,0,0,136,138,133,255,255,255,255,255,164,127,123,255,224,147,146,
+255,236,140,140,255,162,27,27,255,184,148,144,255,186,150,148,255,161,28,27,255,
+237,167,167,255,227,158,157,255,166,132,129,255,255,255,255,255,136,138,133,255,
+0,0,0,0,0,0,0,0,136,138,133,255,255,255,255,255,198,172,168,255,178,28,28,255,
+246,144,144,255,238,152,151,255,191,174,171,255,192,175,172,255,239,178,177,255,
+249,177,177,255,179,32,32,255,208,181,179,255,255,255,255,255,136,138,133,255,0,
+0,0,0,0,0,0,0,136,138,133,255,255,255,255,255,226,229,224,255,178,119,116,255,
+179,34,33,255,230,170,169,255,248,248,248,255,250,250,249,255,234,184,183,255,
+181,38,38,255,183,123,121,255,242,243,240,255,255,255,255,255,136,138,133,255,0,
+0,0,0,0,0,0,0,136,138,133,255,255,255,255,255,226,228,223,255,230,232,228,255,
+197,173,169,255,164,124,121,255,141,143,138,255,141,143,138,255,165,123,120,255,
+205,179,177,255,244,245,243,255,241,242,240,255,255,255,255,255,136,138,133,255,
+0,0,0,0,0,0,0,0,137,139,134,252,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,138,140,135,
+252,0,0,0,0,0,0,0,0,141,143,138,137,137,139,134,252,136,138,133,255,136,138,133,
+255,136,138,133,255,136,138,133,255,136,138,133,255,136,138,133,255,136,138,133,
+255,136,138,133,255,136,138,133,255,136,138,133,255,137,139,134,252,143,145,140,
+137,0,0,0,0};
+MGL_EXPORT Fl_RGB_Image img_help(idata_help, 16, 16, 4, 0);
+
+static const unsigned char idata_delete[] =
+{0,0,0,0,0,0,0,0,0,0,0,0,46,52,54,17,46,52,54,75,46,52,54,255,46,52,54,255,
+46,52,54,255,46,52,54,255,46,52,54,255,46,52,54,255,46,52,54,62,46,52,54,33,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,52,54,58,46,52,54,255,100,105,106,
+255,144,152,148,255,233,234,227,255,238,239,236,255,239,240,238,255,210,213,211,
+255,191,193,193,255,151,154,155,255,46,52,54,255,46,52,54,75,0,0,0,0,0,0,0,0,0,
+0,0,0,46,52,54,62,66,71,73,255,217,219,214,255,199,202,196,255,110,118,114,
+255,66,71,69,255,36,39,39,255,49,52,50,255,122,131,126,255,179,184,179,255,203,
+206,203,255,203,207,203,255,46,52,54,255,46,52,54,33,0,0,0,0,0,0,0,0,46,52,54,
+255,214,217,211,255,210,213,205,255,218,220,214,255,174,179,173,255,92,99,98,
+255,53,57,57,255,55,58,56,255,88,94,91,255,141,148,143,255,170,175,167,255,210,
+214,210,255,181,186,181,255,46,52,54,255,0,0,0,0,0,0,0,0,46,52,54,255,229,229,
+225,255,240,240,237,255,236,237,233,255,227,229,224,255,221,222,217,255,203,206,
+199,255,182,187,179,255,162,168,160,255,179,184,176,255,186,191,183,255,171,176,
+168,255,203,206,205,255,46,52,54,255,0,0,0,0,0,0,0,0,46,52,54,255,224,226,226,
+255,230,230,221,255,244,244,239,255,244,243,241,255,244,244,241,255,243,244,240,
+255,240,240,235,255,229,230,224,255,214,217,210,255,145,152,148,255,139,143,141,
+255,137,141,141,255,46,52,54,255,0,0,0,0,0,0,0,0,46,52,54,194,154,156,156,255,
+194,197,196,255,188,192,191,255,217,219,210,255,223,224,216,255,217,219,212,255,
+204,208,207,255,132,140,137,255,150,156,153,255,134,137,138,255,83,88,90,255,46,
+52,54,255,46,52,54,130,0,0,0,0,0,0,0,0,46,52,54,68,46,52,54,255,90,95,96,255,
+139,143,143,255,173,175,176,255,228,229,229,255,227,229,229,255,227,229,228,255,
+161,164,164,255,104,109,110,255,60,64,65,255,76,80,82,255,46,52,54,255,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,46,52,54,255,107,113,113,255,50,56,56,255,46,52,52,
+255,43,49,50,255,43,49,51,255,41,46,48,255,40,45,47,255,39,44,46,255,57,61,60,
+255,147,149,148,255,46,52,54,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,52,54,255,
+175,181,179,255,176,182,180,255,105,112,110,255,151,159,155,255,106,113,109,255,
+57,62,59,255,95,103,100,255,51,55,52,255,97,104,102,255,152,155,153,255,46,52,
+54,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,52,54,255,183,187,187,255,213,216,
+214,255,129,138,136,255,209,212,210,255,126,135,133,255,81,87,86,255,137,146,
+144,255,67,72,68,255,110,119,116,255,160,163,161,255,46,52,54,255,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,46,52,54,255,183,187,187,255,214,217,215,255,133,141,138,
+255,216,219,216,255,162,168,163,255,85,91,89,255,151,158,156,255,69,75,71,255,
+111,120,117,255,160,163,161,255,46,52,54,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,
+52,54,255,183,187,187,255,212,215,213,255,131,140,137,255,216,219,215,255,162,
+168,163,255,85,91,89,255,151,158,156,255,69,75,71,255,110,119,116,255,155,157,
+155,255,46,52,54,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,52,54,255,175,177,176,
+255,204,207,207,255,185,187,187,255,221,223,220,255,162,168,163,255,85,91,89,
+255,160,167,164,255,135,139,136,255,146,149,149,255,114,115,115,255,46,52,54,
+255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,52,54,75,46,52,54,255,87,92,94,255,155,
+156,155,255,213,216,215,255,207,210,208,255,191,192,191,255,190,193,191,255,135,
+135,135,255,84,89,90,255,46,52,54,255,46,52,54,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,46,52,54,78,46,52,54,187,46,52,54,230,46,52,54,255,46,52,54,
+255,46,52,54,230,46,52,54,187,46,52,54,68,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+MGL_EXPORT Fl_RGB_Image img_delete(idata_delete, 16, 16, 4, 0);
+
+static const unsigned char idata_objectU[] =
+{255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,186,186,190,173,179,179,184,191,172,172,178,191,166,166,170,191,159,159,
+164,191,151,151,156,191,143,143,147,191,134,134,138,191,125,125,130,191,116,116,
+121,173,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,186,186,190,191,229,229,229,254,230,230,230,255,231,231,231,255,
+232,232,232,255,233,233,233,255,234,234,234,255,239,239,239,255,243,243,243,254,
+117,117,120,191,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,186,186,190,191,238,238,238,255,231,231,231,255,229,229,229,
+255,231,231,231,255,235,235,235,255,240,240,240,255,243,243,243,255,245,245,245,
+255,117,117,120,191,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,186,186,190,191,249,249,249,255,243,243,243,255,237,237,
+237,255,234,234,234,255,236,236,236,255,239,239,239,255,241,241,241,255,242,242,
+242,255,117,117,120,191,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,186,186,190,191,255,255,255,255,253,253,253,255,246,
+246,246,255,241,241,241,255,237,237,237,255,236,236,236,255,237,237,237,255,232,
+232,232,255,124,124,127,239,143,143,147,191,134,134,138,191,125,125,130,191,116,
+116,121,173,255,255,255,0,255,255,255,0,186,186,190,191,255,255,255,255,255,255,
+255,255,255,255,255,255,250,250,250,255,245,245,245,255,239,239,239,255,230,230,
+230,255,229,229,229,255,131,140,153,255,172,206,252,255,158,197,253,255,138,185,
+254,255,117,117,120,191,255,255,255,0,255,255,255,0,186,186,190,191,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,254,255,247,247,247,
+255,241,241,241,255,234,234,234,255,126,137,153,255,136,183,255,255,129,179,255,
+255,128,179,255,255,117,117,120,191,255,255,255,0,255,255,255,0,186,186,190,191,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,252,252,252,255,245,245,245,255,122,134,154,255,134,182,255,255,
+132,181,255,255,133,182,255,255,117,117,120,191,255,255,255,0,255,255,255,0,186,
+186,190,191,254,254,254,254,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,253,253,253,255,123,134,154,255,137,
+184,255,255,141,186,254,255,167,203,252,255,117,117,120,191,255,255,255,0,255,
+255,255,0,186,186,190,173,179,179,184,191,172,172,178,191,166,166,170,191,167,
+167,172,239,145,158,181,255,140,152,174,255,134,146,167,255,129,140,161,255,125,
+139,164,255,150,191,254,255,169,203,252,255,172,205,252,255,117,117,120,191,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+200,200,204,191,128,179,255,255,131,180,255,255,134,182,255,255,138,184,255,255,
+156,195,253,255,170,204,252,255,171,205,252,255,172,206,252,255,117,117,120,191,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,200,200,204,191,128,179,255,255,129,180,255,255,146,190,254,255,167,203,
+252,255,171,205,252,255,171,205,252,255,172,205,252,255,173,206,252,255,117,117,
+120,191,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,200,200,204,191,141,187,254,255,165,201,253,255,173,206,252,255,
+172,206,252,255,172,206,252,255,172,206,252,255,173,206,252,255,173,205,250,254,
+117,117,120,191,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,200,200,205,173,190,190,194,191,180,180,186,191,170,170,175,
+191,160,160,166,191,151,151,156,191,143,143,147,191,134,134,138,191,125,125,130,
+191,116,116,121,173,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0};
+MGL_EXPORT Fl_RGB_Image img_objectU(idata_objectU, 16, 16, 4, 0);
+
+static const unsigned char idata_objectD[] =
+{255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,186,186,190,173,179,179,184,191,172,172,178,191,166,166,170,191,159,159,
+164,191,151,151,156,191,143,143,147,191,134,134,138,191,125,125,130,191,116,116,
+121,173,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,186,186,190,191,229,229,229,254,230,230,230,255,231,231,231,255,
+232,232,232,255,233,233,233,255,234,234,234,255,239,239,239,255,243,243,243,254,
+117,117,120,191,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,186,186,190,191,238,238,238,255,231,231,231,255,229,229,229,
+255,231,231,231,255,235,235,235,255,240,240,240,255,243,243,243,255,245,245,245,
+255,117,117,120,191,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,186,186,190,191,249,249,249,255,243,243,243,255,237,237,
+237,255,234,234,234,255,236,236,236,255,239,239,239,255,241,241,241,255,242,242,
+242,255,117,117,120,191,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,186,186,190,191,255,255,255,255,253,253,253,255,246,
+246,246,255,213,213,216,255,201,201,204,255,194,194,198,255,186,186,190,255,178,
+178,182,255,144,144,149,239,143,143,147,191,134,134,138,191,125,125,130,191,116,
+116,121,173,255,255,255,0,255,255,255,0,186,186,190,191,255,255,255,255,255,255,
+255,255,255,255,255,255,213,213,216,255,174,206,251,255,173,206,252,255,173,206,
+252,255,173,206,252,255,173,206,252,255,172,206,252,255,158,197,253,255,138,185,
+254,255,117,117,120,191,255,255,255,0,255,255,255,0,186,186,190,191,255,255,255,
+255,255,255,255,255,255,255,255,255,214,214,217,255,173,206,252,255,173,206,252,
+255,172,206,252,255,165,201,253,255,153,194,253,255,136,183,255,255,129,179,255,
+255,128,179,255,255,117,117,120,191,255,255,255,0,255,255,255,0,186,186,190,191,
+255,255,255,255,255,255,255,255,255,255,255,255,214,214,217,255,149,192,254,255,
+139,185,254,255,134,182,255,255,134,182,255,255,135,183,255,255,134,182,255,255,
+132,181,255,255,133,182,255,255,117,117,120,191,255,255,255,0,255,255,255,0,186,
+186,190,191,254,254,254,254,255,255,255,255,255,255,255,255,214,214,217,255,128,
+179,255,255,131,180,255,255,134,182,255,255,137,184,255,255,139,185,255,255,137,
+184,255,255,141,186,254,255,167,203,252,255,117,117,120,191,255,255,255,0,255,
+255,255,0,186,186,190,173,179,179,184,191,172,172,178,191,166,166,170,191,192,
+192,196,239,128,179,255,255,131,181,255,255,135,183,255,255,139,185,255,255,143,
+188,255,255,150,191,254,255,169,203,252,255,172,205,252,255,117,117,120,191,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+200,200,204,191,128,179,255,255,131,180,255,255,134,182,255,255,138,184,255,255,
+156,195,253,255,170,204,252,255,171,205,252,255,172,206,252,255,117,117,120,191,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,200,200,204,191,128,179,255,255,129,180,255,255,146,190,254,255,167,203,
+252,255,171,205,252,255,171,205,252,255,172,205,252,255,173,206,252,255,117,117,
+120,191,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,200,200,204,191,141,187,254,255,165,201,253,255,173,206,252,255,
+172,206,252,255,172,206,252,255,172,206,252,255,173,206,252,255,173,205,250,254,
+117,117,120,191,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,200,200,205,173,190,190,194,191,180,180,186,191,170,170,175,
+191,160,160,166,191,151,151,156,191,143,143,147,191,134,134,138,191,125,125,130,
+191,116,116,121,173,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0};
+MGL_EXPORT Fl_RGB_Image img_objectD(idata_objectD, 16, 16, 4, 0);
+
+static const unsigned char idata_layer[] =
+{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+255,255,255,0,0,0,0,0,149,149,149,35,153,153,153,100,160,160,160,88,114,114,114,
+12,0,0,0,0,226,226,226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,61,61,61,8,135,135,135,184,111,111,111,255,87,87,87,255,97,97,97,
+255,125,125,125,255,142,142,142,141,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,101,101,101,10,118,118,118,233,57,57,57,153,13,13,
+13,67,1,1,1,37,13,13,13,65,52,52,52,143,91,91,91,251,145,145,145,205,0,0,0,1,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,101,101,101,175,0,0,0,31,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,68,68,68,172,143,143,143,204,0,0,0,
+0,126,126,126,0,0,0,0,0,0,0,0,0,0,0,0,0,66,66,66,80,0,0,0,10,0,0,0,0,0,0,0,0,
+0,0,0,0,49,49,49,32,60,60,60,35,0,0,0,0,0,0,0,0,0,0,0,0,61,61,61,120,136,136,
+136,145,0,0,0,0,2,2,2,0,0,0,0,0,19,19,19,1,65,65,65,11,0,0,0,0,0,0,0,0,119,119,
+119,116,115,114,114,240,106,106,106,255,110,108,108,255,119,119,119,243,126,126,
+126,119,0,0,0,0,0,0,0,0,79,79,79,122,104,104,104,56,0,0,0,0,0,0,0,0,0,0,0,0,255,
+255,255,0,0,0,0,12,128,128,128,205,87,87,87,255,99,102,108,254,128,139,157,255,
+118,127,143,255,86,86,88,254,108,108,108,255,134,133,133,209,18,18,18,16,0,0,0,
+0,72,72,72,116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,132,132,132,222,100,100,100,
+255,195,198,202,255,177,209,247,255,156,209,245,255,156,192,240,255,173,204,238,
+255,96,102,116,255,106,106,106,254,139,139,139,232,41,41,41,19,0,0,0,2,70,70,70,
+51,0,0,0,0,0,0,0,0,138,138,138,191,110,110,110,255,223,223,222,255,172,189,218,
+255,130,182,240,255,172,184,182,255,123,133,134,255,114,175,210,255,119,137,171,
+255,208,206,205,255,114,114,114,254,146,146,146,224,0,0,0,8,68,68,68,5,0,0,0,0,
+0,0,0,0,120,120,120,213,149,149,149,254,240,238,238,255,160,181,211,255,56,
+124,169,255,110,102,99,255,72,58,55,255,50,166,206,255,113,147,182,255,226,224,
+224,255,208,208,208,255,126,126,126,255,150,150,150,186,0,0,0,0,0,0,0,0,102,102,
+102,0,50,50,50,39,114,114,114,255,210,210,209,254,170,180,199,255,81,181,236,
+255,19,73,80,255,14,86,100,255,68,177,226,255,91,120,150,255,244,242,240,255,
+234,234,234,255,192,192,192,255,140,140,140,255,139,139,139,112,0,0,0,0,0,0,0,0,
+74,74,74,0,52,52,52,49,109,109,108,237,200,199,198,255,88,124,174,254,62,143,
+220,255,49,119,189,255,68,128,177,255,142,149,162,255,238,238,236,255,230,230,
+230,255,210,210,210,255,155,155,155,254,153,153,153,255,0,0,0,2,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,6,78,78,77,126,132,134,137,237,90,111,144,255,65,92,135,255,136,
+146,163,254,244,243,241,255,236,236,236,255,216,216,216,255,167,167,167,255,141,
+141,141,239,78,78,78,59,26,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,80,77,72,58,214,210,206,124,199,199,197,163,170,170,170,178,140,140,140,
+175,109,109,109,153,92,92,92,91,0,0,0,4,141,141,141,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+MGL_EXPORT Fl_RGB_Image img_layer(idata_layer, 16, 16, 4, 0);
+
+static const unsigned char idata_new[] =
+{0,0,0,16,0,0,0,58,0,0,0,58,0,0,0,58,0,0,0,58,0,0,0,58,0,0,0,58,0,0,0,58,0,
+0,0,58,0,0,0,58,0,117,0,136,41,168,41,231,91,195,91,249,42,170,42,226,0,159,0,
+104,255,255,255,0,0,0,0,58,234,234,234,255,232,233,233,255,234,235,235,255,236,
+237,237,255,237,238,238,255,238,239,239,255,239,240,240,255,240,241,241,255,143,
+207,143,255,54,191,54,255,120,213,120,255,255,255,255,255,122,213,120,255,53,
+192,53,253,0,157,0,103,0,0,0,58,232,233,234,255,232,233,233,255,234,235,235,255,
+236,237,237,255,237,238,238,255,238,239,239,255,239,240,240,255,240,241,241,255,
+33,166,33,255,29,182,29,255,63,180,41,255,255,255,255,255,90,188,41,255,51,188,
+29,255,0,155,0,220,0,0,0,58,235,236,236,255,235,236,236,255,236,237,237,255,
+238,239,239,255,239,240,240,255,241,241,241,255,242,242,242,255,243,243,243,255,
+9,149,9,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,0,147,0,246,0,0,0,58,237,238,238,255,237,237,237,255,238,239,
+239,255,240,241,241,255,242,242,242,255,243,244,244,255,245,245,245,255,246,246,
+246,255,33,180,33,255,3,160,0,255,52,160,0,255,255,255,255,255,100,176,0,255,50,
+175,0,255,0,168,0,220,0,0,0,58,238,239,239,255,238,239,239,255,240,241,241,255,
+242,243,243,255,244,244,244,255,246,246,246,255,247,247,247,255,248,248,248,255,
+149,221,149,255,2,173,2,255,26,163,0,255,255,255,255,255,54,176,0,255,3,173,0,
+253,0,178,0,102,0,0,0,58,240,241,241,255,240,241,241,255,242,243,243,255,244,
+245,245,255,246,246,246,255,248,248,248,255,249,249,249,255,250,250,250,255,250,
+250,250,255,149,223,149,255,35,196,35,255,10,175,10,255,0,179,0,227,0,184,0,102,
+255,255,255,0,0,0,0,58,242,242,242,255,242,242,242,255,244,244,244,255,246,246,
+246,255,248,248,248,255,250,250,250,255,250,250,250,255,251,251,251,255,251,251,
+251,255,252,252,252,255,252,252,252,255,252,252,252,255,0,0,0,58,255,255,255,0,
+255,255,255,0,0,0,0,58,243,244,244,255,243,244,244,255,246,246,246,255,248,248,
+248,255,250,250,250,255,251,251,251,255,251,251,251,255,252,252,252,255,252,252,
+252,255,253,253,253,255,253,253,253,255,253,253,253,255,0,0,0,58,255,255,255,0,
+255,255,255,0,0,0,0,58,244,244,244,255,245,245,245,255,247,247,247,255,250,250,
+250,255,250,250,250,255,251,251,251,255,252,252,252,255,253,253,253,255,253,253,
+253,255,254,254,254,255,254,254,254,255,254,254,254,255,0,0,0,58,255,255,255,0,
+255,255,255,0,0,0,0,58,244,245,245,255,246,246,246,255,249,249,249,255,250,250,
+250,255,251,251,251,255,252,252,252,255,253,253,253,255,254,254,254,255,254,254,
+254,255,252,252,252,255,250,250,250,255,239,239,240,254,0,0,0,53,255,255,255,0,
+255,255,255,0,0,0,0,58,245,246,246,255,247,247,247,255,250,250,250,255,251,251,
+251,255,252,252,252,255,253,253,253,255,254,254,254,255,254,254,254,255,224,224,
+224,255,198,198,198,255,206,207,207,255,132,134,136,199,0,0,0,5,255,255,255,0,
+255,255,255,0,0,0,0,58,246,246,246,255,248,248,248,255,250,250,250,255,251,251,
+251,255,252,252,252,255,253,253,253,255,254,254,254,255,251,251,251,255,196,196,
+196,255,253,253,253,255,128,133,133,213,0,0,0,10,255,255,255,0,255,255,255,0,
+255,255,255,0,0,0,0,58,246,247,247,255,248,248,248,255,250,250,250,255,251,251,
+251,255,252,252,252,255,253,253,253,255,254,254,254,255,244,244,244,255,204,204,
+204,255,126,131,131,213,0,0,0,18,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,0,0,0,57,246,247,247,254,249,249,249,255,251,251,251,255,251,251,251,
+255,252,252,252,255,253,253,253,255,255,255,255,255,233,233,234,254,126,129,129,
+199,0,0,0,10,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,0,0,0,7,0,0,0,57,0,0,0,58,0,0,0,58,0,0,0,58,0,0,0,58,0,0,0,58,0,0,0,58,0,
+0,0,53,0,0,0,5,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0};
+MGL_EXPORT Fl_RGB_Image img_new(idata_new, 16, 16, 4, 0);
+
+static const unsigned char idata_clear[] =
+{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+183,165,137,107,182,156,121,213,76,67,57,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,179,158,
+125,207,200,175,140,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,193,179,155,54,185,160,124,
+255,197,175,145,66,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,141,120,95,18,171,155,130,188,185,159,123,
+219,99,88,74,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,83,68,52,3,146,127,102,126,172,144,110,255,151,127,99,
+177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,141,117,85,19,173,147,110,203,184,157,119,255,159,133,103,255,154,
+108,86,184,174,0,0,4,0,0,0,0,0,0,0,0,174,1,1,24,178,58,58,68,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,43,43,0,0,159,132,95,185,192,165,127,255,179,155,119,
+255,172,138,98,255,182,130,102,246,185,43,39,152,154,0,0,4,160,0,0,25,199,64,59,
+194,223,110,105,224,172,13,10,83,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,122,98,87,
+173,145,107,255,183,155,116,255,179,148,109,255,170,136,94,255,180,121,94,245,
+216,104,100,226,138,35,30,160,171,55,49,196,221,103,102,226,222,107,104,226,178,
+40,36,158,0,0,0,0,0,0,0,0,0,0,0,0,130,104,71,12,141,113,78,221,163,141,110,255,
+165,142,110,255,165,131,91,255,167,134,93,255,175,96,71,239,203,67,65,226,198,
+75,70,226,206,79,76,226,206,89,85,226,171,33,26,167,154,0,0,9,0,0,0,0,0,0,0,0,
+0,0,0,0,151,119,79,166,161,132,92,255,175,145,105,255,155,127,90,255,145,117,
+85,255,141,117,86,255,143,66,50,134,182,44,31,226,189,18,18,226,189,24,23,226,
+166,32,19,210,144,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,160,126,82,117,155,124,83,255,
+179,145,101,255,163,129,90,255,154,122,82,255,168,131,87,255,160,129,88,255,163,
+44,30,217,206,16,10,227,192,22,15,227,203,9,7,226,204,20,13,226,153,23,17,152,
+131,0,0,4,0,0,0,0,158,124,80,88,180,143,93,251,157,123,84,255,168,132,89,255,
+176,138,93,255,161,125,81,255,178,142,94,255,164,129,87,254,217,46,32,233,208,
+47,35,232,108,49,36,187,132,45,36,211,231,10,9,226,224,23,19,226,163,51,49,147,
+127,98,65,50,170,135,87,204,143,112,72,255,187,148,99,254,179,136,92,255,167,
+132,86,255,186,145,94,255,178,142,92,255,181,137,92,252,206,76,58,235,137,65,49,
+191,162,119,81,52,114,53,36,55,159,41,38,206,216,42,39,226,142,23,21,102,169,
+135,94,36,170,135,88,202,188,143,98,254,190,145,97,254,187,144,95,252,181,144,
+93,255,197,153,97,255,184,145,94,255,189,150,100,209,149,80,54,153,166,123,83,
+53,176,141,95,15,183,144,96,2,148,35,35,37,140,15,15,87,0,0,0,0,171,140,94,10,
+169,137,91,68,170,136,91,151,176,136,92,185,180,143,93,214,186,148,95,242,184,
+142,90,254,184,140,93,247,178,143,96,149,175,140,97,24,170,136,98,4,85,85,85,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,180,143,94,3,179,141,95,10,176,139,96,
+24,175,140,94,53,170,137,92,94,159,125,81,129,183,140,93,120,146,119,84,58,170,
+170,85,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+MGL_EXPORT Fl_RGB_Image img_clear(idata_clear, 16, 16, 4, 0);
+
+static const unsigned char idata_plus[] =
+{255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,124,
+201,112,164,64,177,40,247,67,180,39,237,161,217,144,149,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,87,184,72,254,
+160,217,142,255,154,214,134,255,107,195,82,251,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,36,161,19,255,158,222,
+134,255,161,223,138,255,66,179,38,255,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,31,159,16,255,145,215,124,255,
+146,217,126,255,60,176,35,255,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,1,255,255,255,4,255,
+255,255,0,255,255,255,0,255,255,255,0,27,156,14,255,131,209,115,255,132,209,116,
+255,55,172,32,255,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,4,255,
+255,255,1,255,255,255,0,255,255,255,0,98,182,98,136,65,168,65,251,6,143,4,255,
+12,146,8,255,18,150,11,255,23,153,13,255,121,204,107,255,123,205,108,255,48,
+169,27,255,55,173,30,255,64,178,35,255,73,184,40,255,124,205,97,251,154,219,128,
+136,255,255,255,0,255,255,255,0,4,134,4,236,104,186,99,255,104,189,96,255,103,
+192,94,255,104,194,95,255,109,197,97,255,99,195,83,255,101,196,84,255,117,200,
+100,255,119,202,104,255,126,202,116,255,107,191,101,255,93,181,83,255,88,192,49,
+236,255,255,255,0,255,255,255,0,0,130,0,236,70,167,66,255,74,173,70,255,79,181,
+73,255,93,188,85,255,98,190,86,255,87,187,71,255,90,189,71,255,106,195,89,255,
+96,189,79,255,57,170,44,255,42,161,35,255,59,167,48,255,79,187,42,236,255,255,
+255,0,255,255,255,0,0,128,0,106,0,131,0,250,0,135,0,255,0,139,0,255,5,143,2,255,
+11,146,5,255,67,177,46,255,78,183,52,255,32,159,17,255,40,164,21,255,47,168,25,
+255,55,173,29,255,64,179,34,250,75,183,38,106,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,7,144,4,255,
+69,179,45,255,86,189,53,255,28,156,14,255,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,4,142,2,255,64,176,40,255,
+88,190,53,255,23,154,12,255,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,1,140,0,255,42,164,25,255,63,177,38,255,
+19,151,10,255,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,128,2,31,152,16,254,14,147,8,255,25,153,20,255,31,147,25,251,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,86,171,29,160,14,147,8,247,51,163,50,239,45,145,39,125,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0};
+MGL_EXPORT Fl_RGB_Image img_plus(idata_plus, 16, 16, 4, 0);
+
+static const unsigned char idata_minus[] =
+{255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,1,255,255,255,4,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,4,255,255,255,1,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,199,100,100,132,191,65,65,250,176,0,0,255,183,0,0,
+255,190,0,0,255,196,0,0,255,203,0,0,255,210,0,0,255,216,0,0,255,223,0,0,255,236,
+65,65,251,246,98,98,136,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,
+0,161,4,4,228,204,103,103,255,207,90,90,255,215,90,90,255,220,90,90,255,225,
+90,90,255,228,90,90,255,228,90,90,255,226,100,100,255,209,87,87,255,199,69,69,
+255,234,4,4,236,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,155,0,0,
+228,193,82,82,255,200,77,77,255,210,81,81,255,217,80,80,255,222,77,77,255,225,
+73,73,255,223,73,73,255,208,40,40,255,190,28,28,255,190,34,34,255,229,0,0,236,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,150,0,0,100,158,0,0,249,
+165,0,0,255,171,0,0,255,178,0,0,255,185,0,0,255,191,0,0,255,198,0,0,255,205,0,0,
+255,211,0,0,255,218,0,0,250,226,0,0,106,255,255,255,0,255,255,255,0,255,255,255,
+0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0};
+MGL_EXPORT Fl_RGB_Image img_minus(idata_minus, 16, 16, 4, 0);
+
+static const unsigned char idata_udav[] =
+{255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,0,1,255,255,0,1,255,255,0,1,255,255,0,1,255,
+255,0,1,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,0,1,255,255,0,1,255,255,0,2,255,
+255,0,3,255,255,0,3,255,255,0,3,255,255,0,3,255,255,0,4,255,255,0,4,255,255,0,4,
+255,255,0,3,255,255,0,3,255,255,0,2,255,255,0,2,255,255,0,1,255,255,0,1,255,255,
+0,1,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,0,1,255,255,0,1,255,
+255,0,2,255,255,0,3,255,255,0,4,255,255,0,5,255,255,0,6,255,255,0,7,255,255,0,7,
+255,255,0,8,255,255,0,8,255,255,0,8,255,255,0,8,255,255,0,9,255,255,0,8,255,255,
+0,7,255,255,0,6,255,255,0,6,255,255,0,5,255,255,0,4,255,255,0,3,255,255,0,2,
+255,255,0,1,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,
+0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,0,1,255,255,0,3,255,255,0,4,255,255,0,5,255,255,0,7,
+255,255,0,8,255,255,0,9,255,255,0,11,255,255,0,13,255,255,0,13,255,255,0,13,255,
+255,0,14,255,255,0,14,255,255,0,15,255,255,0,15,255,255,0,14,255,255,0,13,255,
+255,0,12,255,255,0,11,255,255,0,10,255,255,0,9,255,255,0,7,255,255,0,5,255,255,
+0,4,255,255,0,3,255,255,0,1,255,255,0,1,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,0,1,255,255,0,3,
+255,255,0,4,255,255,0,7,255,255,0,9,255,255,0,10,255,255,0,12,255,255,0,14,255,
+255,0,16,255,255,0,18,255,255,0,20,255,255,0,20,255,255,0,21,255,255,0,21,255,
+255,0,22,255,255,0,22,255,255,0,22,255,255,0,21,255,255,0,20,255,255,0,18,255,
+255,0,17,255,255,0,16,255,255,0,15,255,255,0,12,255,255,0,10,255,255,0,8,255,
+255,0,6,255,255,0,4,255,255,0,3,255,255,0,2,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,0,1,255,255,0,3,255,255,0,4,255,255,0,6,255,255,0,9,255,
+255,0,11,255,255,0,14,255,255,0,17,255,255,0,19,255,255,0,21,255,255,0,23,255,
+255,0,25,255,255,0,28,255,255,0,29,255,255,0,29,255,255,0,30,255,255,0,30,255,
+255,0,31,255,255,0,31,255,255,0,29,255,255,0,28,255,255,0,26,255,255,0,25,255,
+255,0,24,255,255,0,22,255,255,0,19,255,255,0,16,255,255,0,14,255,255,0,11,255,
+255,0,9,255,255,0,7,255,255,0,4,255,255,0,3,255,255,0,1,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,0,2,
+255,255,0,4,255,255,0,6,255,255,0,8,255,255,0,11,255,255,0,14,255,255,0,17,255,
+255,0,21,255,255,0,24,255,255,0,27,255,255,0,29,255,255,0,31,255,255,0,34,255,
+255,0,36,255,255,0,38,255,255,0,38,255,255,0,39,255,255,0,40,255,255,0,40,255,
+255,0,40,255,255,0,39,255,255,0,37,255,255,0,35,255,255,0,34,255,255,0,32,255,
+255,0,30,255,255,0,26,255,255,0,23,255,255,0,20,255,255,0,17,255,255,0,15,255,
+255,0,12,255,255,0,8,255,255,0,6,255,255,0,3,255,255,0,2,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,0,1,255,255,0,2,255,255,0,4,255,255,0,8,255,255,
+0,11,255,255,0,14,255,255,0,17,255,255,0,21,255,255,0,24,255,255,0,28,255,255,
+0,33,255,255,0,35,255,255,0,38,255,255,0,41,255,255,0,43,255,255,0,46,255,255,
+0,48,255,255,0,49,255,255,0,49,171,44,44,255,201,73,73,255,193,65,65,255,153,
+26,26,255,255,255,0,47,255,255,0,45,255,255,0,44,255,255,0,42,255,255,0,38,255,
+255,0,35,255,255,0,31,255,255,0,28,255,255,0,25,255,255,0,22,255,255,0,17,255,
+255,0,14,255,255,0,10,255,255,0,7,255,255,0,4,255,255,0,2,255,255,0,1,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,0,1,255,255,0,3,255,255,0,5,255,255,0,8,255,255,0,12,255,255,0,16,255,255,0,
+20,255,255,0,24,255,255,0,28,255,255,0,32,255,255,0,36,255,255,0,41,255,255,0,
+45,255,255,0,48,255,255,0,51,255,255,0,54,255,255,0,56,255,255,0,59,153,26,26,
+255,232,105,105,255,255,179,179,255,255,206,206,255,255,191,191,255,255,134,134,
+255,188,60,60,255,255,255,0,56,255,255,0,54,255,255,0,52,255,255,0,48,255,255,0,
+44,255,255,0,40,255,255,0,37,255,255,0,33,255,255,0,29,255,255,0,24,255,255,0,
+19,255,255,0,15,255,255,0,12,255,255,0,8,255,255,0,6,255,255,0,3,255,255,0,1,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,0,1,255,255,0,3,
+255,255,0,6,255,255,0,9,255,255,0,13,255,255,0,17,255,255,0,22,255,255,0,27,255,
+255,0,32,255,255,0,36,255,255,0,41,255,255,0,45,255,255,0,50,255,255,0,55,255,
+255,0,58,255,255,0,61,255,255,0,64,255,255,0,67,139,11,11,255,202,74,74,255,255,
+149,149,255,255,217,217,255,255,248,248,255,255,232,232,255,255,176,176,255,230,
+102,102,255,167,40,40,255,255,255,0,65,255,255,0,62,255,255,0,58,255,255,0,54,
+255,255,0,50,255,255,0,46,255,255,0,42,255,255,0,36,255,255,0,31,255,255,0,26,
+255,255,0,21,255,255,0,17,255,255,0,13,255,255,0,9,255,255,0,6,255,255,0,3,255,
+255,0,1,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,0,1,255,255,0,3,255,255,0,6,255,
+255,0,9,255,255,0,13,255,255,0,18,255,255,0,23,255,255,0,29,255,255,0,34,255,
+255,0,40,255,255,0,45,255,255,0,50,255,255,0,55,255,255,0,60,255,255,0,65,255,
+255,0,69,255,255,0,72,255,255,0,76,255,255,0,79,155,27,27,255,193,66,66,255,237,
+109,109,255,255,146,146,255,255,165,165,255,255,157,157,255,255,127,127,255,212,
+85,85,255,172,44,44,255,142,14,14,255,255,255,0,73,255,255,0,69,255,255,0,64,
+255,255,0,60,255,255,0,56,255,255,0,51,255,255,0,45,255,255,0,39,255,255,0,33,
+255,255,0,28,255,255,0,24,255,255,0,19,255,255,0,14,255,255,0,9,255,255,0,6,255,
+255,0,3,255,255,0,1,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,0,1,255,255,0,3,255,255,0,6,255,255,0,10,255,255,0,
+14,255,255,0,19,255,255,0,24,255,255,0,30,255,255,0,35,255,255,0,42,255,255,0,
+49,255,255,0,54,255,255,0,59,255,255,0,65,255,255,0,70,255,255,0,76,255,255,0,
+81,255,255,0,84,255,255,0,87,255,255,0,91,147,20,20,255,163,36,36,255,180,53,
+53,255,195,67,67,255,203,75,75,255,201,73,73,255,190,63,63,255,175,47,47,255,
+157,30,30,255,142,14,14,255,255,255,0,84,255,255,0,80,255,255,0,75,255,255,0,71,
+255,255,0,66,255,255,0,60,255,255,0,53,255,255,0,47,255,255,0,42,255,255,0,36,
+255,255,0,31,255,255,0,24,255,255,0,19,255,255,0,14,255,255,0,9,255,255,0,5,255,
+255,0,3,255,255,0,1,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,0,2,255,255,0,5,255,255,0,9,255,255,0,14,255,255,0,20,255,255,0,
+25,255,255,0,31,255,255,0,37,255,255,0,43,255,255,0,50,255,255,0,57,255,255,0,
+64,255,255,0,70,255,255,0,75,255,255,0,81,255,255,0,86,255,255,0,92,255,255,0,
+96,255,255,0,99,255,255,0,102,138,10,10,255,143,15,15,255,147,20,20,255,152,24,
+24,255,154,27,27,255,154,27,27,255,152,24,24,255,148,20,20,255,142,15,15,255,
+137,10,10,255,255,255,0,95,255,255,0,91,255,255,0,86,255,255,0,82,255,255,0,76,
+255,255,0,69,255,255,0,63,255,255,0,56,255,255,0,50,255,255,0,44,255,255,0,37,
+255,255,0,31,255,255,0,24,255,255,0,18,255,255,0,13,255,255,0,9,255,255,0,5,255,
+255,0,3,255,255,0,1,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,0,2,255,255,0,4,
+255,255,0,8,255,255,0,13,255,255,0,18,255,255,0,24,255,255,0,32,255,255,0,38,
+255,255,0,44,255,255,0,51,255,255,0,58,255,255,0,66,255,255,0,73,255,255,0,80,
+255,255,0,86,255,255,0,92,255,255,0,97,255,255,0,103,255,255,0,108,255,255,0,
+111,255,255,0,114,132,5,5,255,133,6,6,255,134,7,7,255,135,8,8,255,136,8,8,255,
+136,8,8,255,136,8,8,255,135,8,8,255,134,7,7,255,133,6,6,255,255,255,0,107,255,
+255,0,102,255,255,0,98,255,255,0,93,255,255,0,86,255,255,0,79,255,255,0,72,255,
+255,0,66,255,255,0,59,255,255,0,52,255,255,0,44,255,255,0,37,255,255,0,30,255,
+255,0,24,255,255,0,18,255,255,0,13,255,255,0,9,255,255,0,5,255,255,0,2,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,0,1,255,255,0,4,255,255,0,7,255,255,0,12,255,255,0,17,255,
+255,0,23,255,255,0,30,255,255,0,37,255,255,0,45,255,255,0,52,255,255,0,60,255,
+255,0,67,255,255,0,75,255,255,0,82,255,255,0,90,255,255,0,97,255,255,0,102,255,
+255,0,108,255,255,0,114,255,255,0,120,255,255,0,123,255,255,0,126,130,2,2,255,
+129,2,2,255,130,2,2,255,130,2,2,255,130,2,2,255,130,2,2,255,130,3,3,255,130,3,3,
+255,131,3,3,255,132,5,5,255,255,255,0,119,255,255,0,114,255,255,0,109,255,255,0,
+103,255,255,0,96,255,255,0,89,255,255,0,82,255,255,0,75,255,255,0,68,255,255,0,
+60,255,255,0,52,255,255,0,44,255,255,0,37,255,255,0,30,255,255,0,24,255,255,0,
+18,255,255,0,12,255,255,0,7,255,255,0,3,255,255,0,1,255,255,255,0,255,255,255,
+0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,0,1,255,255,0,3,255,
+255,0,6,255,255,0,10,255,255,0,15,255,255,0,21,255,255,0,28,255,255,0,35,255,
+255,0,43,255,255,0,52,255,255,0,61,255,255,0,68,255,255,0,76,255,255,0,84,255,
+255,0,92,255,255,0,100,255,255,0,108,255,255,0,113,255,255,0,119,255,255,0,125,
+255,255,0,131,255,255,0,135,255,255,0,138,255,255,0,142,128,1,1,255,128,1,1,255,
+128,1,1,255,128,1,1,255,128,1,1,255,128,1,1,255,129,1,1,255,130,2,2,255,255,255,
+0,135,255,255,0,130,255,255,0,125,255,255,0,120,255,255,0,113,255,255,0,106,
+255,255,0,99,255,255,0,92,255,255,0,85,255,255,0,76,255,255,0,67,255,255,0,59,
+255,255,0,51,255,255,0,43,255,255,0,36,255,255,0,29,255,255,0,22,255,255,0,16,
+255,255,0,10,255,255,0,6,255,255,0,2,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,0,2,255,255,0,4,255,255,0,9,255,255,0,
+14,255,255,0,20,255,255,0,26,255,255,0,34,255,255,0,41,255,255,0,50,255,255,0,
+58,255,255,0,68,255,255,0,77,255,255,0,85,255,255,0,93,255,255,0,101,255,255,0,
+109,255,255,0,117,255,255,0,124,255,255,0,130,255,255,0,136,255,255,0,142,255,
+255,0,147,255,255,0,150,255,255,0,153,255,255,0,156,128,0,0,255,128,0,0,255,128,
+0,0,255,128,0,0,255,128,0,0,255,129,1,1,255,255,255,0,150,255,255,0,146,255,
+255,0,141,255,255,0,137,255,255,0,130,255,255,0,123,255,255,0,116,255,255,0,110,
+255,255,0,102,255,255,0,93,255,255,0,84,255,255,0,76,255,255,0,67,255,255,0,59,
+255,255,0,51,255,255,0,43,255,255,0,34,255,255,0,26,255,255,0,19,255,255,0,13,
+255,255,0,8,255,255,0,4,255,255,0,1,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,0,3,255,255,0,7,255,255,0,11,255,255,0,18,255,255,0,
+25,255,255,0,32,255,255,0,40,255,255,0,48,255,255,0,56,255,255,0,65,255,255,0,
+75,255,255,0,84,255,255,0,94,255,255,0,102,255,255,0,110,255,255,0,119,255,255,
+0,127,255,255,0,135,255,255,0,141,255,255,0,147,255,255,0,152,255,255,0,158,
+255,255,0,161,255,255,0,164,255,255,0,167,255,255,0,169,121,121,249,255,24,24,
+151,255,129,1,1,255,255,255,0,167,255,255,0,165,255,255,0,161,255,255,0,157,255,
+255,0,153,255,255,0,147,255,255,0,141,255,255,0,134,255,255,0,127,255,255,0,120,
+255,255,0,111,255,255,0,102,255,255,0,93,255,255,0,84,255,255,0,75,255,255,0,67,
+255,255,0,57,255,255,0,48,255,255,0,39,255,255,0,31,255,255,0,23,255,255,0,17,
+255,255,0,11,255,255,0,7,255,255,0,3,255,255,0,1,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,0,1,255,255,0,4,255,255,0,9,255,255,0,14,255,255,0,21,255,255,0,
+28,255,255,0,37,255,255,0,46,255,255,0,54,255,255,0,63,255,255,0,72,255,255,0,
+82,255,255,0,92,255,255,0,101,255,255,0,111,255,255,0,120,255,255,0,128,255,
+255,0,136,255,255,0,144,255,255,0,152,255,255,0,157,255,255,0,163,255,255,0,168,
+255,255,0,172,255,255,0,175,255,255,0,178,93,93,221,255,43,43,170,255,3,3,131,
+255,255,255,0,180,255,255,0,178,255,255,0,176,255,255,0,172,255,255,0,168,255,
+255,0,164,255,255,0,157,255,255,0,151,255,255,0,144,255,255,0,137,255,255,0,128,
+255,255,0,119,255,255,0,110,255,255,0,101,255,255,0,92,255,255,0,83,255,255,0,
+73,255,255,0,63,255,255,0,53,255,255,0,44,255,255,0,36,255,255,0,28,255,255,0,
+21,255,255,0,14,255,255,0,9,255,255,0,5,255,255,0,2,255,255,255,0,255,255,255,
+0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,0,3,255,255,0,6,255,255,0,11,255,255,0,17,255,255,0,24,255,
+255,0,32,255,255,0,41,255,255,0,50,255,255,0,60,255,255,0,70,255,255,0,80,255,
+255,0,89,255,255,0,99,255,255,0,109,255,255,0,119,255,255,0,129,255,255,0,137,
+255,255,0,145,255,255,0,153,255,255,0,161,255,255,0,167,255,255,0,173,255,255,0,
+178,255,255,0,183,255,255,0,186,104,104,232,255,39,39,166,255,3,3,131,255,255,
+255,0,192,255,255,0,190,255,255,0,188,255,255,0,186,255,255,0,182,255,255,0,178,
+255,255,0,173,255,255,0,167,255,255,0,160,255,255,0,154,255,255,0,146,255,255,0,
+137,255,255,0,128,255,255,0,119,255,255,0,110,255,255,0,100,255,255,0,90,255,
+255,0,79,255,255,0,69,255,255,0,59,255,255,0,50,255,255,0,41,255,255,0,33,255,
+255,0,25,255,255,0,18,255,255,0,12,255,255,0,7,255,255,0,3,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,0,1,255,255,0,4,255,255,0,8,255,255,0,14,255,255,0,20,255,255,0,28,255,
+255,0,36,255,255,0,45,255,255,0,55,255,255,0,65,255,255,0,76,255,255,0,87,255,
+255,0,97,255,255,0,107,255,255,0,116,255,255,0,126,255,255,0,136,255,255,0,146,
+255,255,0,154,255,255,0,162,255,255,0,169,255,255,0,177,255,255,0,182,255,255,0,
+187,10,10,138,255,89,89,217,255,19,19,146,255,2,2,130,255,255,255,0,201,255,255,
+0,201,255,255,0,200,255,255,0,198,255,255,0,196,255,255,0,192,255,255,0,188,
+255,255,0,182,255,255,0,176,255,255,0,170,255,255,0,162,255,255,0,154,255,255,0,
+145,255,255,0,136,255,255,0,127,255,255,0,117,255,255,0,106,255,255,0,96,255,
+255,0,85,255,255,0,75,255,255,0,65,255,255,0,55,255,255,0,46,255,255,0,37,255,
+255,0,29,255,255,0,21,255,255,0,14,255,255,0,8,255,255,0,4,255,255,0,1,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,0,2,255,255,0,6,255,255,0,11,255,255,0,16,255,255,0,24,255,255,0,32,255,255,
+0,40,255,255,0,50,255,255,0,60,255,255,0,70,255,255,0,81,255,255,0,92,255,255,
+0,103,255,255,0,114,255,255,0,124,255,255,0,134,255,255,0,144,255,255,0,153,
+255,255,0,163,255,255,0,171,255,255,0,178,255,255,0,185,45,45,173,255,71,71,198,
+255,28,28,156,255,5,5,132,255,1,1,128,255,255,255,0,210,255,255,0,210,255,255,0,
+211,255,255,0,209,255,255,0,208,255,255,0,205,255,255,0,201,255,255,0,197,255,
+255,0,191,255,255,0,185,255,255,0,178,255,255,0,170,255,255,0,162,255,255,0,153,
+255,255,0,145,255,255,0,134,255,255,0,124,255,255,0,113,255,255,0,102,255,255,0,
+92,255,255,0,81,255,255,0,71,255,255,0,61,255,255,0,51,255,255,0,41,255,255,0,
+32,255,255,0,23,255,255,0,16,255,255,0,10,255,255,0,5,255,255,0,2,255,255,255,
+0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,0,3,255,255,0,7,255,255,0,13,255,255,0,20,255,255,0,27,255,255,0,35,255,255,
+0,45,255,255,0,54,255,255,0,64,255,255,0,75,255,255,0,86,255,255,0,97,255,255,
+0,108,255,255,0,120,255,255,0,131,255,255,0,141,255,255,0,151,255,255,0,160,
+255,255,0,169,22,22,150,255,32,32,159,255,28,28,155,255,14,14,141,255,4,4,132,
+255,1,1,128,255,0,0,128,255,38,38,165,255,255,255,0,218,255,255,0,219,255,255,0,
+219,255,255,0,218,255,255,0,216,255,255,0,213,255,255,0,210,255,255,0,205,255,
+255,0,199,255,255,0,193,255,255,0,186,255,255,0,178,255,255,0,170,255,255,0,161,
+255,255,0,151,255,255,0,140,255,255,0,130,255,255,0,119,255,255,0,109,255,255,0,
+98,255,255,0,87,255,255,0,76,255,255,0,65,255,255,0,54,255,255,0,44,255,255,0,
+34,255,255,0,26,255,255,0,18,255,255,0,12,255,255,0,7,255,255,0,3,255,255,255,
+0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,0,1,255,255,
+0,4,255,255,0,8,255,255,0,14,255,255,0,21,255,255,0,30,255,255,0,39,255,255,0,
+49,255,255,0,59,255,255,0,69,255,255,0,80,255,255,0,91,255,255,0,102,255,255,0,
+114,255,255,0,125,255,255,0,136,255,255,0,147,255,255,0,158,255,255,0,167,7,7,
+134,255,6,6,133,255,4,4,131,255,2,2,129,255,0,0,128,255,0,0,128,255,4,4,132,255,
+56,56,184,255,76,76,203,255,132,132,255,255,113,113,240,255,42,42,170,255,255,
+255,0,225,255,255,0,223,255,255,0,221,255,255,0,217,255,255,0,212,255,255,0,207,
+255,255,0,200,255,255,0,193,255,255,0,185,255,255,0,176,255,255,0,167,255,255,0,
+157,255,255,0,147,255,255,0,136,255,255,0,126,255,255,0,115,255,255,0,103,255,
+255,0,91,255,255,0,80,255,255,0,68,255,255,0,58,255,255,0,47,255,255,0,38,255,
+255,0,29,255,255,0,21,255,255,0,14,255,255,0,8,255,255,0,4,255,255,0,1,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,0,1,255,255,0,4,255,255,
+0,9,255,255,0,15,255,255,0,23,255,255,0,31,255,255,0,41,255,255,0,51,255,255,
+0,62,255,255,0,73,255,255,0,85,255,255,0,96,255,255,0,108,255,255,0,119,255,
+255,0,130,255,255,0,141,255,255,0,152,255,255,0,163,255,255,0,173,255,255,0,183,
+1,1,129,255,1,1,128,255,0,0,128,255,4,4,132,255,4,4,131,255,6,6,133,255,12,12,
+140,255,27,27,155,255,61,61,188,255,121,121,248,255,148,148,255,255,152,152,255,
+255,57,57,185,255,255,255,0,227,255,255,0,223,255,255,0,219,255,255,0,213,255,
+255,0,206,255,255,0,200,255,255,0,191,255,255,0,182,255,255,0,173,255,255,0,163,
+255,255,0,153,255,255,0,142,255,255,0,130,255,255,0,119,255,255,0,107,255,255,0,
+95,255,255,0,83,255,255,0,72,255,255,0,61,255,255,0,51,255,255,0,41,255,255,0,
+32,255,255,0,23,255,255,0,16,255,255,0,10,255,255,0,5,255,255,0,2,255,255,255,
+0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,0,2,255,255,0,6,255,255,0,
+11,255,255,0,17,255,255,0,25,255,255,0,33,255,255,0,43,255,255,0,53,255,255,0,
+64,255,255,0,76,255,255,0,88,255,255,0,100,255,255,0,112,255,255,0,124,255,255,
+0,135,255,255,0,146,255,255,0,157,255,255,0,168,255,255,0,178,255,255,0,188,
+255,255,0,197,4,4,131,255,2,2,129,255,1,1,128,255,1,1,128,255,1,1,128,255,1,1,
+129,255,4,4,131,255,11,11,138,255,32,32,159,255,83,83,210,255,165,165,255,255,
+197,197,255,255,134,134,255,255,25,25,152,255,255,255,0,224,255,255,0,219,255,
+255,0,212,255,255,0,204,255,255,0,196,255,255,0,188,255,255,0,178,255,255,0,168,
+255,255,0,157,255,255,0,146,255,255,0,134,255,255,0,123,255,255,0,111,255,255,0,
+99,255,255,0,87,255,255,0,76,255,255,0,65,255,255,0,54,255,255,0,44,255,255,0,
+35,255,255,0,26,255,255,0,18,255,255,0,11,255,255,0,6,255,255,0,2,255,255,255,
+0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,0,3,255,255,0,7,255,255,0,
+12,255,255,0,19,255,255,0,27,255,255,0,35,255,255,0,45,255,255,0,56,255,255,0,
+67,255,255,0,78,255,255,0,90,255,255,0,102,255,255,0,114,255,255,0,127,255,255,
+0,139,255,255,0,150,255,255,0,162,255,255,0,172,255,255,0,182,255,255,0,192,
+255,255,0,201,255,255,0,209,255,255,0,217,255,255,0,223,255,255,0,229,0,0,128,
+255,0,0,128,255,0,0,128,255,1,1,129,255,5,5,133,255,19,19,146,255,62,62,189,255,
+149,149,255,255,223,223,255,255,181,181,255,255,54,54,182,255,255,255,0,223,255,
+255,0,217,255,255,0,209,255,255,0,201,255,255,0,192,255,255,0,182,255,255,0,172,
+255,255,0,161,255,255,0,150,255,255,0,138,255,255,0,127,255,255,0,115,255,255,0,
+103,255,255,0,91,255,255,0,80,255,255,0,68,255,255,0,57,255,255,0,46,255,255,0,
+36,255,255,0,27,255,255,0,19,255,255,0,12,255,255,0,6,255,255,0,2,255,255,255,
+0,255,255,255,0,255,255,255,0,255,255,0,1,255,255,0,3,255,255,0,8,255,255,0,
+13,255,255,0,20,255,255,0,28,255,255,0,38,255,255,0,47,255,255,0,58,255,255,0,
+69,255,255,0,81,255,255,0,93,255,255,0,105,255,255,0,117,255,255,0,129,255,255,
+0,141,255,255,0,153,255,255,0,164,255,255,0,175,255,255,0,186,255,255,0,196,
+255,255,0,205,255,255,0,213,255,255,0,220,255,255,0,227,255,255,0,233,255,255,0,
+238,255,255,0,242,1,1,128,255,0,0,128,255,1,1,128,255,4,4,131,255,15,15,143,255,
+57,57,184,255,152,152,255,255,240,240,255,255,194,194,255,255,62,62,189,255,
+255,255,0,221,255,255,0,213,255,255,0,204,255,255,0,195,255,255,0,186,255,255,0,
+175,255,255,0,165,255,255,0,154,255,255,0,142,255,255,0,130,255,255,0,118,255,
+255,0,105,255,255,0,93,255,255,0,81,255,255,0,69,255,255,0,58,255,255,0,47,255,
+255,0,37,255,255,0,28,255,255,0,20,255,255,0,13,255,255,0,7,255,255,0,3,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,0,1,255,255,0,3,255,255,0,8,255,255,0,
+14,255,255,0,21,255,255,0,30,255,255,0,39,255,255,0,50,255,255,0,61,255,255,0,
+72,255,255,0,84,255,255,0,95,255,255,0,108,255,255,0,120,255,255,0,132,255,255,
+0,144,255,255,0,155,255,255,0,167,255,255,0,178,255,255,0,188,255,255,0,198,
+255,255,0,207,255,255,0,216,255,255,0,224,255,255,0,230,255,255,0,236,255,255,0,
+241,255,255,0,245,255,255,0,248,255,255,0,250,1,1,128,255,1,1,128,255,4,4,131,
+255,18,18,145,255,69,69,196,255,174,174,255,255,251,251,255,255,177,177,255,255,
+48,48,176,255,255,255,0,216,255,255,0,207,255,255,0,199,255,255,0,189,255,255,
+0,178,255,255,0,167,255,255,0,156,255,255,0,144,255,255,0,131,255,255,0,119,
+255,255,0,107,255,255,0,94,255,255,0,82,255,255,0,70,255,255,0,59,255,255,0,48,
+255,255,0,38,255,255,0,29,255,255,0,20,255,255,0,13,255,255,0,7,255,255,0,3,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,0,1,255,255,0,3,255,255,0,8,255,
+255,0,14,255,255,0,21,255,255,0,30,255,255,0,39,255,255,0,50,255,255,0,61,255,
+255,0,72,255,255,0,84,255,255,0,96,255,255,0,109,255,255,0,121,255,255,0,134,
+255,255,0,146,255,255,0,158,255,255,0,169,255,255,0,180,255,255,0,190,255,255,0,
+200,255,255,0,209,255,255,0,218,255,255,0,225,255,255,0,232,255,255,0,238,255,
+255,0,243,255,255,0,247,255,255,0,250,255,255,0,252,255,255,0,253,255,255,0,253,
+1,1,129,255,6,6,133,255,28,28,155,255,102,102,230,255,218,218,255,255,254,254,
+255,255,130,130,255,255,24,24,151,255,255,255,0,209,255,255,0,200,255,255,0,190,
+255,255,0,179,255,255,0,168,255,255,0,157,255,255,0,145,255,255,0,133,255,255,0,
+121,255,255,0,108,255,255,0,96,255,255,0,84,255,255,0,72,255,255,0,60,255,255,0,
+49,255,255,0,39,255,255,0,30,255,255,0,21,255,255,0,14,255,255,0,8,255,255,0,3,
+255,255,0,1,255,255,255,0,255,255,255,0,255,255,0,1,255,255,0,3,255,255,0,8,255,
+255,0,14,255,255,0,21,255,255,0,30,255,255,0,39,255,255,0,50,255,255,0,61,255,
+255,0,72,255,255,0,84,255,255,0,96,255,255,0,109,255,255,0,121,255,255,0,134,
+255,255,0,146,255,255,0,158,255,255,0,169,255,255,0,180,255,255,0,191,255,255,0,
+201,255,255,0,210,255,255,0,219,255,255,0,226,255,255,0,233,255,255,0,239,255,
+255,0,244,255,255,0,248,255,255,0,251,255,255,0,253,255,255,0,255,255,255,0,255,
+255,255,0,253,2,2,130,255,12,12,140,255,58,58,186,255,163,163,255,255,253,253,
+255,255,195,195,255,255,69,69,196,255,6,6,133,255,255,255,0,201,255,255,0,191,
+255,255,0,181,255,255,0,170,255,255,0,158,255,255,0,146,255,255,0,134,255,255,0,
+122,255,255,0,109,255,255,0,97,255,255,0,85,255,255,0,73,255,255,0,61,255,255,0,
+51,255,255,0,40,255,255,0,31,255,255,0,22,255,255,0,15,255,255,0,9,255,255,0,4,
+255,255,0,1,255,255,255,0,255,255,255,0,255,255,0,1,255,255,0,3,255,255,0,8,255,
+255,0,14,255,255,0,21,255,255,0,30,255,255,0,39,255,255,0,50,255,255,0,61,255,
+255,0,72,255,255,0,84,255,255,0,96,255,255,0,109,255,255,0,121,255,255,0,134,
+255,255,0,146,255,255,0,158,255,255,0,169,255,255,0,180,255,255,0,191,255,255,0,
+201,255,255,0,210,255,255,0,219,255,255,0,226,255,255,0,233,255,255,0,239,255,
+255,0,244,255,255,0,248,255,255,0,251,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,253,255,255,0,251,6,6,134,255,35,35,163,255,123,123,250,255,236,236,
+255,255,252,252,255,255,110,110,238,255,23,23,151,255,255,255,0,201,255,255,0,
+191,255,255,0,181,255,255,0,170,255,255,0,158,255,255,0,146,255,255,0,134,255,
+255,0,122,255,255,0,109,255,255,0,97,255,255,0,85,255,255,0,73,255,255,0,61,255,
+255,0,50,255,255,0,40,255,255,0,31,255,255,0,22,255,255,0,15,255,255,0,9,255,
+255,0,4,255,255,0,1,255,255,255,0,255,255,255,0,255,255,0,1,255,255,0,3,255,255,
+0,8,255,255,0,14,255,255,0,21,255,255,0,30,255,255,0,39,255,255,0,50,255,255,
+0,61,255,255,0,72,255,255,0,84,255,255,0,96,255,255,0,109,255,255,0,121,255,
+255,0,134,255,255,0,146,255,255,0,158,255,255,0,169,255,255,0,180,255,255,0,190,
+255,255,0,200,255,255,0,209,255,255,0,218,255,255,0,225,255,255,0,232,255,255,0,
+238,255,255,0,243,255,255,0,247,255,255,0,250,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,252,255,255,0,250,4,4,132,255,24,24,151,255,101,101,228,255,
+221,221,255,255,250,250,255,255,134,134,255,255,40,40,167,255,255,255,0,200,255,
+255,0,190,255,255,0,179,255,255,0,168,255,255,0,157,255,255,0,145,255,255,0,133,
+255,255,0,120,255,255,0,108,255,255,0,96,255,255,0,84,255,255,0,72,255,255,0,60,
+255,255,0,49,255,255,0,39,255,255,0,30,255,255,0,21,255,255,0,14,255,255,0,8,
+255,255,0,3,255,255,0,1,255,255,255,0,255,255,255,0,255,255,0,1,255,255,0,3,255,
+255,0,8,255,255,0,14,255,255,0,21,255,255,0,30,255,255,0,39,255,255,0,50,255,
+255,0,60,255,255,0,72,255,255,0,83,255,255,0,95,255,255,0,108,255,255,0,120,255,
+255,0,132,255,255,0,144,255,255,0,155,255,255,0,167,255,255,0,178,255,255,0,188,
+255,255,0,198,255,255,0,207,255,255,0,216,255,255,0,224,5,5,132,255,8,8,135,255,
+255,255,0,241,255,255,0,245,255,255,0,248,255,255,0,250,255,255,0,251,255,255,0,
+251,255,255,0,250,255,255,0,248,255,255,0,245,20,20,147,255,98,98,225,255,219,
+219,255,255,249,249,255,255,142,142,255,255,47,47,174,255,8,8,135,255,255,255,0,
+189,255,255,0,178,255,255,0,167,255,255,0,156,255,255,0,144,255,255,0,131,255,
+255,0,119,255,255,0,107,255,255,0,94,255,255,0,82,255,255,0,70,255,255,0,59,255,
+255,0,48,255,255,0,38,255,255,0,29,255,255,0,20,255,255,0,13,255,255,0,7,255,
+255,0,3,255,255,255,0,255,255,255,0,255,255,255,0,255,255,0,1,255,255,0,3,255,
+255,0,8,255,255,0,13,255,255,0,20,255,255,0,28,255,255,0,38,255,255,0,47,255,
+255,0,58,255,255,0,69,255,255,0,81,255,255,0,93,255,255,0,105,255,255,0,117,255,
+255,0,129,255,255,0,141,6,6,134,255,21,21,149,255,35,35,163,255,47,47,174,255,
+63,63,190,255,74,74,202,255,85,85,213,255,98,98,226,255,105,105,232,255,110,
+110,238,255,113,113,241,255,111,111,239,255,109,109,236,255,100,100,228,255,86,
+86,213,255,72,72,200,255,56,56,183,255,35,35,163,255,20,20,148,255,23,23,150,
+255,115,115,243,255,231,231,255,255,249,249,255,255,131,131,255,255,45,45,172,
+255,10,10,137,255,255,255,0,186,255,255,0,175,255,255,0,165,255,255,0,153,255,
+255,0,142,255,255,0,130,255,255,0,118,255,255,0,105,255,255,0,93,255,255,0,81,
+255,255,0,69,255,255,0,58,255,255,0,47,255,255,0,37,255,255,0,28,255,255,0,20,
+255,255,0,13,255,255,0,7,255,255,0,3,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,0,3,255,255,0,7,255,255,0,12,255,255,0,19,255,255,0,26,
+255,255,0,35,255,255,0,45,255,255,0,56,255,255,0,67,255,255,0,78,255,255,0,90,
+255,255,0,102,9,9,136,255,26,26,154,255,42,42,170,255,60,60,187,255,76,76,203,
+255,92,92,220,255,108,108,236,255,122,122,249,255,136,136,255,255,147,147,255,
+255,158,158,255,255,167,167,255,255,177,177,255,255,185,185,255,255,192,192,255,
+255,199,199,255,255,203,203,255,255,203,203,255,255,200,200,255,255,190,190,255,
+255,174,174,255,255,152,152,255,255,39,39,166,255,158,158,255,255,247,247,255,
+255,208,208,255,255,107,107,234,255,37,37,165,255,9,9,137,255,255,255,0,182,255,
+255,0,172,255,255,0,161,255,255,0,150,255,255,0,138,255,255,0,126,255,255,0,115,
+255,255,0,103,255,255,0,91,255,255,0,80,255,255,0,68,255,255,0,57,255,255,0,46,
+255,255,0,36,255,255,0,27,255,255,0,19,255,255,0,12,255,255,0,6,255,255,0,2,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,0,2,255,255,0,5,255,
+255,0,11,255,255,0,17,255,255,0,25,255,255,0,33,255,255,0,43,255,255,0,53,255,
+255,0,64,255,255,0,76,10,10,138,255,28,28,156,255,44,44,172,255,57,57,184,255,
+69,69,197,255,81,81,209,255,92,92,219,255,101,101,228,255,108,108,236,255,115,
+115,242,255,120,120,247,255,124,124,251,255,128,128,255,255,133,133,255,255,140,
+140,255,255,146,146,255,255,157,157,255,255,167,167,255,255,179,179,255,255,193,
+193,255,255,206,206,255,255,220,220,255,255,231,231,255,255,237,237,255,255,94,
+94,222,255,218,218,255,255,251,251,255,255,165,165,255,255,76,76,204,255,26,26,
+154,255,8,8,135,255,8,8,136,255,255,255,0,168,255,255,0,157,255,255,0,146,255,
+255,0,134,255,255,0,123,255,255,0,111,255,255,0,99,255,255,0,87,255,255,0,76,
+255,255,0,65,255,255,0,54,255,255,0,44,255,255,0,35,255,255,0,26,255,255,0,18,
+255,255,0,11,255,255,0,6,255,255,0,2,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,0,1,255,255,0,4,255,255,0,9,255,255,0,15,255,255,0,23,255,
+255,0,31,255,255,0,41,255,255,0,51,255,255,0,62,20,20,148,255,35,35,162,255,46,
+46,174,255,53,53,181,255,58,58,185,255,63,63,190,255,68,68,195,255,71,71,199,
+255,73,73,200,255,73,73,201,255,72,72,200,255,72,72,199,255,70,70,198,255,71,71,
+198,255,71,71,198,255,74,74,201,255,76,76,203,255,82,82,209,255,88,88,216,255,
+98,98,225,255,110,110,238,255,123,123,250,255,142,142,255,255,163,163,255,255,
+63,63,191,255,191,191,255,255,253,253,255,255,201,201,255,255,112,112,240,255,
+47,47,174,255,16,16,144,255,6,6,134,255,108,108,236,255,58,58,185,255,22,22,
+149,255,255,255,0,142,255,255,0,130,255,255,0,119,255,255,0,107,255,255,0,95,
+255,255,0,83,255,255,0,72,255,255,0,61,255,255,0,51,255,255,0,41,255,255,0,32,
+255,255,0,23,255,255,0,16,255,255,0,10,255,255,0,5,255,255,0,2,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,0,1,255,255,0,4,255,255,0,8,
+255,255,0,14,255,255,0,21,255,255,0,29,255,255,0,39,255,255,0,49,21,21,148,255,
+36,36,164,255,45,45,173,255,46,46,174,255,43,43,171,255,42,42,170,255,43,43,
+170,255,44,44,172,255,44,44,172,255,42,42,170,255,40,40,167,255,37,37,164,255,
+34,34,162,255,32,32,159,255,31,31,158,255,29,29,157,255,30,30,157,255,30,30,
+157,255,32,32,160,255,35,35,162,255,39,39,167,255,45,45,173,255,52,52,180,255,
+64,64,192,255,65,65,192,255,190,190,255,255,254,254,255,255,214,214,255,255,
+133,133,255,255,63,63,190,255,25,25,153,255,9,9,137,255,251,251,255,255,228,228,
+255,255,188,188,255,255,127,127,254,255,68,68,195,255,25,25,152,255,255,255,0,
+115,255,255,0,103,255,255,0,91,255,255,0,80,255,255,0,68,255,255,0,57,255,255,0,
+47,255,255,0,38,255,255,0,29,255,255,0,21,255,255,0,14,255,255,0,8,255,255,0,4,
+255,255,0,1,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,
+0,255,255,0,3,255,255,0,7,255,255,0,13,255,255,0,20,255,255,0,27,255,255,0,35,
+15,15,143,255,33,33,161,255,47,47,174,255,50,50,177,255,42,42,169,255,31,31,
+159,255,26,26,153,255,26,26,153,255,26,26,154,255,25,25,153,255,23,23,150,255,
+19,19,147,255,17,17,144,255,15,15,142,255,13,13,140,255,12,12,139,255,11,11,
+138,255,10,10,138,255,10,10,138,255,11,11,138,255,12,12,139,255,13,13,141,255,
+15,15,143,255,18,18,146,255,107,107,235,255,214,214,255,255,254,254,255,255,
+209,209,255,255,133,133,255,255,68,68,195,255,31,31,158,255,12,12,140,255,6,6,
+133,255,223,223,255,255,246,246,255,255,253,253,255,255,232,232,255,255,186,186,
+255,255,126,126,253,255,66,66,193,255,22,22,149,255,255,255,0,87,255,255,0,76,
+255,255,0,65,255,255,0,54,255,255,0,44,255,255,0,34,255,255,0,26,255,255,0,18,
+255,255,0,12,255,255,0,7,255,255,0,3,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,0,2,255,255,0,6,255,255,0,11,
+255,255,0,16,255,255,0,23,255,255,0,31,22,22,150,255,41,41,169,255,56,56,184,
+255,60,60,187,255,49,49,177,255,30,30,158,255,16,16,143,255,14,14,142,255,15,15,
+143,255,14,14,142,255,12,12,139,255,9,9,137,255,7,7,135,255,6,6,133,255,5,5,132,
+255,4,4,132,255,4,4,131,255,3,3,131,255,3,3,131,255,3,3,131,255,3,3,131,255,4,4,
+131,255,76,76,204,255,183,183,255,255,246,246,255,255,251,251,255,255,185,185,
+255,255,115,115,243,255,62,62,189,255,29,29,157,255,13,13,141,255,6,6,134,255,5,
+5,133,255,136,136,255,255,177,177,255,255,219,219,255,255,245,245,255,255,250,
+250,255,255,223,223,255,255,169,169,255,255,104,104,231,255,46,46,173,255,9,9,
+137,255,255,255,0,61,255,255,0,51,255,255,0,41,255,255,0,32,255,255,0,23,255,
+255,0,16,255,255,0,10,255,255,0,5,255,255,0,2,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,0,1,255,255,0,4,255,
+255,0,8,255,255,0,14,255,255,0,20,11,11,138,255,24,24,152,255,43,43,170,255,61,
+61,189,255,75,75,202,255,75,75,203,255,61,61,189,255,37,37,165,255,13,13,140,
+255,10,10,137,255,8,8,136,255,6,6,134,255,4,4,132,255,3,3,131,255,2,2,130,255,2,
+2,129,255,1,1,129,255,1,1,129,255,1,1,129,255,1,1,128,255,37,37,164,255,114,
+114,241,255,194,194,255,255,242,242,255,255,242,242,255,255,246,246,255,255,142,
+142,255,255,86,86,214,255,48,48,176,255,24,24,151,255,11,11,139,255,6,6,133,255,
+4,4,131,255,44,44,171,255,65,65,192,255,98,98,225,255,138,138,255,255,180,180,
+255,255,223,223,255,255,246,246,255,255,239,239,255,255,200,200,255,255,136,136,
+255,255,69,69,197,255,23,23,150,255,255,255,0,46,255,255,0,37,255,255,0,29,255,
+255,0,21,255,255,0,14,255,255,0,8,255,255,0,4,255,255,0,1,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,0,3,255,255,0,6,255,255,0,11,255,255,0,17,10,10,138,255,28,28,155,255,35,35,
+163,255,55,55,183,255,75,75,203,255,92,92,220,255,101,101,229,255,100,100,228,
+255,90,90,217,255,73,73,200,255,56,56,184,255,40,40,168,255,30,30,158,255,24,24,
+151,255,29,29,156,255,42,42,169,255,64,64,192,255,100,100,228,255,144,144,255,
+255,191,191,255,255,225,225,255,255,237,237,255,255,228,228,255,255,234,234,255,
+255,139,139,255,255,91,91,219,255,56,56,183,255,31,31,158,255,16,16,144,255,8,8,
+136,255,4,4,132,255,3,3,131,255,10,10,138,255,16,16,144,255,27,27,155,255,45,45,
+172,255,70,70,197,255,106,106,234,255,153,153,255,255,198,198,255,255,232,232,
+255,255,241,241,255,255,211,211,255,255,152,152,255,255,85,85,213,255,33,33,160,
+255,255,255,0,32,255,255,0,25,255,255,0,18,255,255,0,12,255,255,0,7,255,255,0,3,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,0,1,255,255,0,4,255,255,0,9,255,255,0,
+14,8,8,135,255,14,14,142,255,25,25,152,255,45,45,173,255,55,55,183,255,75,75,
+202,255,96,96,223,255,114,114,241,255,130,130,255,255,141,141,255,255,150,150,
+255,255,157,157,255,255,165,165,255,255,173,173,255,255,184,184,255,255,196,196,
+255,255,206,206,255,255,212,212,255,255,210,210,255,255,202,202,255,255,211,211,
+255,255,141,141,255,255,109,109,236,255,75,75,202,255,50,50,177,255,30,30,157,
+255,17,17,145,255,10,10,137,255,5,5,133,255,3,3,131,255,2,2,130,255,6,6,134,255,
+3,3,131,255,6,6,133,255,10,10,138,255,18,18,146,255,31,31,158,255,54,54,181,
+255,86,86,213,255,127,127,254,255,178,178,255,255,220,220,255,255,236,236,255,
+255,218,218,255,255,163,163,255,255,94,94,221,255,38,38,165,255,7,7,134,255,255,
+255,0,14,255,255,0,9,255,255,0,5,255,255,0,2,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,0,3,255,255,0,6,255,255,0,11,6,6,133,255,9,9,136,255,13,
+13,141,255,21,21,148,255,30,30,158,255,65,65,192,255,72,72,200,255,81,81,208,
+255,90,90,217,255,102,102,230,255,114,114,242,255,127,127,254,255,134,134,255,
+255,140,140,255,255,150,150,255,255,161,161,255,255,171,171,255,255,181,181,255,
+255,103,103,231,255,84,84,212,255,67,67,195,255,48,48,176,255,34,34,161,255,22,
+22,150,255,14,14,141,255,9,9,136,255,5,5,133,255,3,3,131,255,2,2,129,255,2,2,
+129,255,6,6,134,255,1,1,128,255,1,1,129,255,2,2,130,255,4,4,131,255,7,7,134,255,
+13,13,141,255,24,24,152,255,42,42,169,255,73,73,200,255,115,115,243,255,163,
+163,255,255,208,208,255,255,230,230,255,255,212,212,255,255,159,159,255,255,92,
+92,219,255,38,38,165,255,5,5,133,255,255,255,0,6,255,255,0,3,255,255,0,1,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,0,1,255,255,0,4,255,255,0,9,5,
+5,132,255,5,5,132,255,7,7,134,255,10,10,137,255,13,13,141,255,18,18,146,255,
+24,24,151,255,30,30,158,255,37,37,164,255,43,43,171,255,48,48,176,255,54,54,
+181,255,55,55,183,255,56,56,184,255,54,54,182,255,51,51,178,255,45,45,173,255,
+38,38,166,255,32,32,159,255,24,24,152,255,18,18,146,255,13,13,140,255,9,9,136,
+255,6,6,133,255,4,4,131,255,2,2,130,255,2,2,129,255,1,1,129,255,1,1,129,255,255,
+255,0,146,1,1,128,255,0,0,128,255,0,0,128,255,1,1,128,255,1,1,129,255,3,3,130,
+255,5,5,133,255,10,10,138,255,20,20,147,255,38,38,165,255,65,65,193,255,107,107,
+235,255,159,159,255,255,204,204,255,255,223,223,255,255,205,205,255,255,150,150,
+255,255,84,84,212,255,34,34,161,255,255,255,0,4,255,255,0,1,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,0,3,255,255,0,6,
+255,255,0,10,3,3,131,255,3,3,131,255,4,4,132,255,5,5,133,255,7,7,134,255,9,9,
+136,255,10,10,138,255,12,12,140,255,14,14,142,255,15,15,143,255,16,16,144,255,
+16,16,144,255,16,16,144,255,15,15,143,255,14,14,141,255,12,12,139,255,10,10,
+137,255,8,8,135,255,6,6,133,255,4,4,132,255,3,3,131,255,2,2,130,255,2,2,129,255,
+1,1,129,255,1,1,128,255,1,1,128,255,2,2,129,255,255,255,0,139,255,255,0,134,
+255,255,0,130,255,255,0,125,4,4,132,255,1,1,128,255,1,1,128,255,1,1,129,255,2,2,
+130,255,4,4,132,255,9,9,136,255,18,18,146,255,35,35,162,255,65,65,193,255,108,
+108,235,255,157,157,255,255,203,203,255,255,216,216,255,255,189,189,255,255,132,
+132,255,255,70,70,198,255,25,25,152,255,255,255,255,0,255,255,255,0,255,255,255,
+0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,0,1,255,255,0,3,255,
+255,0,7,255,255,0,11,2,2,130,255,2,2,130,255,2,2,130,255,3,3,130,255,3,3,130,
+255,3,3,131,255,4,4,131,255,4,4,132,255,4,4,132,255,4,4,132,255,4,4,132,255,4,4,
+132,255,4,4,131,255,3,3,131,255,3,3,130,255,2,2,130,255,2,2,129,255,1,1,129,255,
+1,1,128,255,1,1,128,255,1,1,128,255,0,0,128,255,1,1,128,255,1,1,129,255,255,
+255,0,131,255,255,0,129,255,255,0,127,255,255,0,123,255,255,0,118,255,255,0,114,
+255,255,0,109,255,255,0,103,255,255,0,96,1,1,129,255,1,1,129,255,2,2,129,255,4,
+4,132,255,9,9,136,255,19,19,146,255,37,37,165,255,68,68,195,255,116,116,244,
+255,168,168,255,255,204,204,255,255,208,208,255,255,185,185,255,255,149,149,255,
+255,82,82,209,255,17,17,144,255,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,0,2,255,255,0,4,255,255,0,8,
+255,255,0,13,2,2,129,255,1,1,129,255,1,1,129,255,1,1,129,255,1,1,129,255,1,1,
+129,255,1,1,129,255,1,1,129,255,1,1,129,255,1,1,129,255,1,1,128,255,1,1,128,255,
+1,1,128,255,1,1,128,255,0,0,128,255,0,0,128,255,0,0,128,255,0,0,128,255,0,0,
+128,255,0,0,128,255,1,1,129,255,255,255,0,122,255,255,0,121,255,255,0,119,255,
+255,0,117,255,255,0,115,255,255,0,111,255,255,0,107,255,255,0,102,255,255,0,97,
+255,255,0,92,255,255,0,85,255,255,0,79,255,255,0,72,1,1,129,255,2,2,130,255,4,4,
+132,255,10,10,137,255,20,20,148,255,43,43,171,255,81,81,209,255,129,129,255,255,
+190,190,255,255,244,244,255,255,250,250,255,255,208,208,255,255,137,137,255,255,
+63,63,191,255,19,19,147,255,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,0,2,255,255,0,5,255,255,0,9,255,
+255,0,14,3,3,130,255,1,1,129,255,1,1,128,255,1,1,128,255,0,0,128,255,0,0,128,
+255,0,0,128,255,0,0,128,255,0,0,128,255,0,0,128,255,0,0,128,255,0,0,128,255,0,0,
+128,255,0,0,128,255,0,0,128,255,0,0,128,255,1,1,128,255,3,3,130,255,255,255,0,
+108,255,255,0,109,255,255,0,109,255,255,0,109,255,255,0,107,255,255,0,105,255,
+255,0,103,255,255,0,100,255,255,0,95,255,255,0,91,255,255,0,86,255,255,0,82,255,
+255,0,76,255,255,0,69,255,255,0,62,255,255,0,56,2,2,129,255,2,2,130,255,5,5,133,
+255,11,11,139,255,27,27,154,255,54,54,181,255,95,95,222,255,142,142,255,255,176,
+176,255,255,182,182,255,255,158,158,255,255,114,114,241,255,65,65,193,255,27,27,
+154,255,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,0,1,255,255,0,3,255,255,0,6,255,255,0,10,255,255,0,
+14,255,255,0,19,255,255,0,24,3,3,130,255,1,1,129,255,1,1,128,255,1,1,128,255,1,
+1,128,255,0,0,128,255,0,0,128,255,0,0,128,255,1,1,128,255,1,1,129,255,2,2,130,
+255,255,255,0,87,255,255,0,90,255,255,0,93,255,255,0,95,255,255,0,96,255,255,0,
+96,255,255,0,97,255,255,0,96,255,255,0,94,255,255,0,92,255,255,0,90,255,255,0,
+88,255,255,0,84,255,255,0,79,255,255,0,75,255,255,0,70,255,255,0,66,255,255,0,
+59,255,255,0,53,255,255,0,47,255,255,0,41,255,255,0,36,3,3,130,255,7,7,134,255,
+16,16,144,255,31,31,159,255,51,51,179,255,70,70,198,255,84,84,211,255,87,87,
+214,255,80,80,207,255,62,62,190,255,42,42,170,255,23,23,150,255,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,0,1,255,255,0,3,255,255,0,6,255,255,0,9,255,255,0,13,255,255,
+0,18,255,255,0,23,255,255,0,28,255,255,0,34,255,255,0,40,255,255,0,45,255,255,
+0,50,255,255,0,55,255,255,0,60,255,255,0,65,255,255,0,69,255,255,0,72,255,255,
+0,75,255,255,0,79,255,255,0,82,255,255,0,83,255,255,0,83,255,255,0,84,255,255,
+0,85,255,255,0,84,255,255,0,82,255,255,0,80,255,255,0,78,255,255,0,77,255,255,
+0,73,255,255,0,68,255,255,0,64,255,255,0,60,255,255,0,56,255,255,0,50,255,255,
+0,44,255,255,0,39,255,255,0,33,255,255,0,28,255,255,0,23,4,4,132,255,10,10,
+137,255,15,15,142,255,21,21,148,255,27,27,154,255,31,31,158,255,32,32,160,255,
+30,30,158,255,26,26,154,255,20,20,147,255,13,13,141,255,7,7,135,255,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,0,1,255,255,0,3,255,255,0,5,255,255,0,9,255,255,0,13,255,
+255,0,17,255,255,0,22,255,255,0,27,255,255,0,31,255,255,0,36,255,255,0,40,255,
+255,0,45,255,255,0,50,255,255,0,55,255,255,0,58,255,255,0,61,255,255,0,64,255,
+255,0,67,255,255,0,70,255,255,0,71,255,255,0,71,255,255,0,72,255,255,0,73,255,
+255,0,72,255,255,0,71,255,255,0,69,255,255,0,67,255,255,0,65,255,255,0,62,255,
+255,0,58,255,255,0,54,255,255,0,50,255,255,0,46,255,255,0,42,255,255,0,36,255,
+255,0,31,255,255,0,26,255,255,0,21,255,255,0,17,255,255,0,13,6,6,133,255,6,6,
+133,255,7,7,135,255,9,9,136,255,10,10,137,255,10,10,138,255,10,10,138,255,9,9,
+137,255,8,8,136,255,7,7,134,255,7,7,134,255,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,0,1,255,255,0,3,255,255,0,5,255,255,0,8,255,255,0,12,255,255,0,16,255,
+255,0,20,255,255,0,24,255,255,0,28,255,255,0,32,255,255,0,36,255,255,0,41,255,
+255,0,45,255,255,0,47,255,255,0,50,255,255,0,53,255,255,0,56,255,255,0,59,255,
+255,0,59,255,255,0,60,255,255,0,61,255,255,0,61,255,255,0,61,255,255,0,59,255,
+255,0,57,255,255,0,56,255,255,0,54,255,255,0,52,255,255,0,48,255,255,0,44,255,
+255,0,40,255,255,0,36,255,255,0,33,255,255,0,28,255,255,0,24,255,255,0,19,255,
+255,0,15,255,255,0,11,255,255,0,8,4,4,132,255,2,2,130,255,2,2,130,255,3,3,130,
+255,3,3,130,255,3,3,130,255,3,3,131,255,3,3,131,255,3,3,131,255,4,4,131,255,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,0,1,255,
+255,0,2,255,255,0,4,255,255,0,8,255,255,0,11,255,255,0,14,255,255,0,17,255,255,
+0,20,255,255,0,24,255,255,0,28,255,255,0,32,255,255,0,35,255,255,0,38,255,255,
+0,40,255,255,0,43,255,255,0,46,255,255,0,48,255,255,0,48,255,255,0,49,255,255,
+0,50,255,255,0,50,255,255,0,50,255,255,0,48,255,255,0,47,255,255,0,45,255,255,
+0,43,255,255,0,42,255,255,0,38,255,255,0,34,255,255,0,31,255,255,0,28,255,255,
+0,24,255,255,0,22,255,255,0,17,255,255,0,13,255,255,0,10,255,255,0,7,255,255,
+0,4,255,255,0,2,1,1,129,255,1,1,128,255,1,1,128,255,1,1,128,255,1,1,128,255,1,
+1,128,255,1,1,129,255,2,2,129,255,4,4,131,255,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,0,2,255,
+255,0,4,255,255,0,6,255,255,0,8,255,255,0,11,255,255,0,14,255,255,0,17,255,255,
+0,21,255,255,0,24,255,255,0,26,255,255,0,29,255,255,0,31,255,255,0,34,255,255,
+0,36,255,255,0,38,255,255,0,38,255,255,0,39,255,255,0,39,255,255,0,40,255,255,
+0,40,255,255,0,38,255,255,0,37,255,255,0,35,255,255,0,34,255,255,0,32,255,255,
+0,29,255,255,0,26,255,255,0,23,255,255,0,20,255,255,0,17,255,255,0,15,255,255,
+0,12,255,255,0,8,255,255,0,6,255,255,0,3,255,255,0,2,255,255,255,0,255,255,
+255,0,1,1,128,255,0,0,128,255,0,0,128,255,0,0,128,255,0,0,128,255,1,1,128,255,2,
+2,130,255,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,
+0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,0,1,255,255,0,3,
+255,255,0,4,255,255,0,6,255,255,0,9,255,255,0,11,255,255,0,14,255,255,0,16,255,
+255,0,19,255,255,0,21,255,255,0,23,255,255,0,25,255,255,0,27,255,255,0,28,255,
+255,0,29,255,255,0,29,255,255,0,30,255,255,0,30,255,255,0,31,255,255,0,29,255,
+255,0,28,255,255,0,26,255,255,0,25,255,255,0,23,255,255,0,22,255,255,0,19,255,
+255,0,16,255,255,0,13,255,255,0,11,255,255,0,9,255,255,0,7,255,255,0,4,255,255,
+0,2,255,255,0,1,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,1,1,128,255,1,1,128,255,1,1,129,255,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,0,1,
+255,255,0,3,255,255,0,4,255,255,0,6,255,255,0,9,255,255,0,10,255,255,0,12,255,
+255,0,14,255,255,0,15,255,255,0,17,255,255,0,19,255,255,0,20,255,255,0,20,255,
+255,0,21,255,255,0,21,255,255,0,22,255,255,0,22,255,255,0,21,255,255,0,20,255,
+255,0,18,255,255,0,17,255,255,0,16,255,255,0,15,255,255,0,12,255,255,0,10,255,
+255,0,8,255,255,0,6,255,255,0,4,255,255,0,3,255,255,0,2,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,0,1,255,255,0,3,255,255,0,4,255,255,0,5,255,255,0,7,255,255,0,8,
+255,255,0,9,255,255,0,11,255,255,0,13,255,255,0,13,255,255,0,13,255,255,0,14,
+255,255,0,14,255,255,0,14,255,255,0,15,255,255,0,14,255,255,0,13,255,255,0,12,
+255,255,0,11,255,255,0,9,255,255,0,9,255,255,0,7,255,255,0,5,255,255,0,4,255,
+255,0,2,255,255,0,1,255,255,0,1,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,0,1,255,255,0,2,255,255,0,3,255,255,0,4,255,255,
+0,5,255,255,0,6,255,255,0,7,255,255,0,7,255,255,0,7,255,255,0,8,255,255,0,8,
+255,255,0,8,255,255,0,9,255,255,0,8,255,255,0,7,255,255,0,6,255,255,0,5,255,255,
+0,5,255,255,0,4,255,255,0,3,255,255,0,2,255,255,0,1,255,255,255,0,255,255,255,
+0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,0,1,255,255,0,1,255,
+255,0,2,255,255,0,3,255,255,0,3,255,255,0,3,255,255,0,3,255,255,0,3,255,255,0,4,
+255,255,0,4,255,255,0,3,255,255,0,3,255,255,0,2,255,255,0,2,255,255,0,1,255,255,
+0,1,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,0,1,255,255,0,1,255,255,
+0,1,255,255,0,1,255,255,0,1,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0};
+MGL_EXPORT Fl_RGB_Image img_udav(idata_udav, 64, 64, 4, 0);
+
+static const unsigned char idata_fname[] =
+{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,84,127,180,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,137,0,83,64,180,65,216,91,195,91,253,64,180,65,217,0,137,0,83,0,0,
+0,0,84,127,181,201,81,128,183,255,81,127,183,255,82,127,183,255,82,126,184,
+255,86,132,187,212,0,0,0,0,0,0,0,0,0,0,0,0,0,146,0,80,69,198,69,255,135,219,120,
+254,255,255,255,255,135,220,120,254,69,198,69,255,0,140,0,83,73,114,166,255,143,
+185,239,255,142,182,234,255,144,184,235,255,147,187,239,255,75,121,177,254,81,
+127,183,255,81,128,185,255,88,125,200,255,1,154,14,255,45,182,26,254,61,170,0,
+255,255,255,255,255,61,170,0,255,45,182,26,254,0,158,0,216,61,99,146,255,134,
+175,225,255,86,140,205,255,88,140,207,255,121,163,216,255,138,175,224,255,136,
+175,225,255,135,175,225,255,145,174,246,255,0,136,0,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,139,0,253,47,81,122,
+255,119,162,214,255,82,131,194,255,85,133,194,255,82,132,194,255,79,127,191,255,
+58,106,163,255,46,91,147,255,51,87,160,255,0,160,0,255,0,151,0,255,11,134,0,
+255,255,255,255,255,11,134,0,255,0,151,0,255,0,172,0,215,32,61,96,255,73,112,
+159,255,39,83,138,255,42,85,139,255,42,85,140,255,34,76,127,255,109,143,177,255,
+190,221,244,255,191,219,246,255,124,206,162,255,0,176,0,255,0,151,0,255,255,255,
+255,255,0,151,0,255,0,178,0,255,84,180,114,194,84,121,159,255,199,228,248,255,
+186,218,241,255,188,220,242,255,188,220,242,255,187,219,243,255,180,212,237,255,
+142,177,220,255,137,173,219,255,145,173,229,255,95,185,150,255,5,183,12,255,0,
+158,0,255,6,184,12,255,101,193,159,255,80,97,126,255,83,124,169,255,139,176,223,
+255,135,170,217,255,135,170,217,255,134,170,217,255,134,170,217,255,136,171,218,
+255,135,174,218,255,140,174,218,255,139,174,219,255,140,174,223,255,149,173,236,
+255,153,173,242,255,149,173,235,255,147,181,232,255,78,99,125,255,82,123,170,
+255,141,177,223,255,135,172,218,255,135,172,218,255,137,172,218,255,134,172,218,
+255,135,172,218,255,135,172,218,255,134,172,218,255,138,172,218,255,134,172,218,
+255,135,172,218,255,135,172,218,255,135,172,217,255,140,179,228,255,78,98,125,
+255,81,122,170,255,137,175,222,255,132,170,217,255,133,170,217,255,131,170,217,
+255,133,170,217,255,131,169,217,255,132,170,217,255,133,170,217,255,132,170,217,
+255,131,170,217,255,133,170,217,255,132,170,217,255,132,169,217,255,139,177,227,
+255,74,97,124,255,80,121,169,255,135,172,221,255,128,167,216,255,129,167,216,
+255,129,167,216,255,130,167,216,255,129,167,216,255,130,167,216,255,128,167,216,
+255,128,167,216,255,128,167,216,255,130,167,216,255,129,167,216,255,129,167,216,
+255,135,174,225,255,73,95,123,255,81,122,170,255,137,174,224,255,131,169,219,
+255,131,169,219,255,134,169,219,255,133,169,219,255,135,169,219,255,133,169,219,
+255,132,169,219,255,133,169,219,255,134,169,219,255,132,169,219,255,134,169,219,
+255,132,169,218,255,137,177,228,255,75,95,124,255,57,103,155,255,64,118,180,255,
+63,116,176,255,63,116,176,255,63,116,176,255,62,116,176,255,64,116,176,255,63,
+116,176,255,64,116,176,255,63,116,176,255,63,116,176,255,63,116,176,255,63,116,
+176,255,63,116,176,255,67,122,185,255,39,68,102,255,88,127,173,255,135,173,223,
+255,132,169,218,255,133,169,218,255,134,169,218,255,133,169,218,255,132,169,218,
+255,132,169,218,255,133,169,218,255,134,169,218,255,133,169,218,255,131,169,218,
+255,133,169,218,255,132,169,218,255,138,176,227,255,80,100,129,255,74,117,167,
+185,129,168,221,255,125,163,217,255,126,164,217,255,124,163,217,255,120,163,217,
+255,125,163,217,255,126,164,217,255,126,164,217,255,126,163,217,255,121,163,217,
+255,122,163,217,255,126,164,217,255,126,163,216,255,129,169,224,255,70,95,128,
+174,0,22,53,68,0,18,48,129,0,18,48,130,0,17,47,132,0,18,47,133,0,17,46,134,0,17,
+46,136,0,17,46,137,0,16,45,137,0,17,46,136,0,17,46,134,0,17,47,133,0,17,47,132,
+0,18,48,130,0,17,48,129,0,25,58,69};
+MGL_EXPORT Fl_RGB_Image img_fname(idata_fname, 16, 16, 4, 0);
+
+static const unsigned char idata_curve[] =
+{255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,117,171,247,9,117,171,247,113,117,171,247,175,117,171,247,221,117,171,
+247,207,117,171,247,173,117,171,247,78,255,255,255,0,255,255,255,0,255,255,255,
+0,246,0,0,162,246,0,0,169,255,255,255,0,255,255,255,0,255,255,255,0,102,162,
+246,68,102,162,246,223,102,162,246,163,102,162,246,83,102,162,246,32,102,162,
+246,44,102,162,246,89,102,162,246,214,102,162,246,185,102,162,246,17,255,255,
+255,0,246,0,0,178,215,0,16,213,0,0,116,11,255,255,255,0,87,153,245,37,87,153,
+245,234,87,153,245,63,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,87,153,245,5,87,153,245,159,87,153,245,156,255,255,255,0,255,255,
+255,0,0,0,121,21,6,0,127,131,255,255,255,0,72,143,244,151,72,143,244,128,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,72,143,244,13,5,7,53,255,5,7,53,255,255,255,255,0,255,255,255,0,
+255,255,255,0,7,0,126,71,53,125,234,172,57,134,242,87,255,255,255,0,255,255,255,
+0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,5,7,53,255,5,7,53,255,255,255,255,0,255,255,255,0,255,255,255,0,11,0,
+122,23,16,34,157,198,43,124,240,169,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,19,
+76,202,12,235,5,11,253,244,1,2,250,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,244,
+1,2,250,246,0,0,255,8,68,193,20,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,8,95,229,
+160,9,84,217,164,0,0,128,10,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,9,104,239,14,8,94,228,227,6,
+17,145,175,0,0,128,10,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,9,104,239,89,9,92,226,190,11,0,
+122,23,0,0,128,10,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,9,104,239,44,9,104,239,216,11,0,122,23,5,0,127,147,
+0,0,128,10,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,
+255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,9,104,239,106,9,104,239,174,255,255,255,0,12,0,128,22,215,0,17,199,
+246,0,0,188,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,
+0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,9,104,239,87,9,104,
+239,230,9,104,239,48,255,255,255,0,255,255,255,0,246,0,0,188,246,0,0,203,255,0,
+0,1,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,9,5,
+53,255,9,5,53,255,9,104,239,223,9,104,239,224,9,104,239,43,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,0,0,1,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,9,5,53,255,9,5,53,255,9,104,
+239,36,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,
+255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0};
+MGL_EXPORT Fl_RGB_Image img_curve(idata_curve, 16, 16, 4, 0);
+
+static const unsigned char idata_svn[] =
+{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,248,248,93,250,250,250,167,251,251,251,
+212,252,252,252,235,252,252,252,239,252,252,252,224,250,250,250,189,249,249,249,
+129,248,248,248,29,0,0,0,0,239,239,239,0,0,0,0,0,0,0,0,0,0,0,0,0,235,235,235,74,
+238,238,238,253,242,242,242,255,244,244,244,254,247,247,247,255,249,249,249,255,
+249,249,249,255,248,248,248,255,246,246,246,255,243,243,243,255,240,240,240,255,
+237,237,237,170,0,0,0,0,225,225,225,0,125,125,125,0,222,222,222,41,226,226,226,
+255,226,226,226,254,230,230,230,255,238,238,238,255,240,240,240,255,242,242,242,
+255,243,243,243,255,242,242,242,255,239,239,239,255,235,235,235,255,229,229,229,
+255,225,225,225,255,225,225,225,165,0,0,0,0,0,0,0,0,196,196,196,112,212,212,212,
+255,210,210,210,255,217,217,217,255,223,223,223,255,226,226,226,255,228,228,228,
+255,229,229,229,255,227,227,227,255,225,225,225,255,221,221,221,255,213,213,213,
+255,212,212,212,255,204,204,204,233,0,0,0,0,0,0,0,0,150,150,150,116,178,178,178,
+255,198,198,198,255,196,196,196,255,196,196,196,255,200,200,200,255,202,202,202,
+255,202,202,202,255,202,202,202,255,198,198,198,255,197,197,197,255,198,198,198,
+255,191,191,191,255,155,155,155,237,0,0,0,0,0,0,0,0,136,136,136,116,135,135,135,
+255,180,180,180,255,194,194,194,255,195,195,195,255,196,196,196,255,196,196,196,
+255,197,197,197,255,197,197,197,255,197,197,197,255,192,192,192,255,188,188,188,
+255,173,173,173,255,113,113,113,236,0,0,0,0,0,0,0,0,147,147,147,118,118,118,118,
+255,115,115,115,255,163,163,163,255,225,225,225,255,206,206,206,255,212,211,212,
+255,214,214,214,255,204,204,204,255,221,221,221,255,209,209,209,255,105,105,105,
+255,125,125,125,255,135,135,135,239,0,0,0,0,0,0,0,0,140,140,140,114,131,131,131,
+255,151,151,151,255,130,130,130,255,170,170,170,255,154,158,163,255,94,118,155,
+255,99,122,159,255,122,139,165,255,166,166,165,255,144,144,144,255,133,133,133,
+255,167,167,167,255,113,113,113,235,0,0,0,0,0,0,0,0,141,141,141,119,125,125,125,
+255,111,111,111,255,152,152,152,255,231,231,231,255,100,123,156,255,152,178,196,
+255,144,171,192,255,75,110,153,255,229,227,223,255,208,208,208,255,98,98,98,255,
+127,127,127,255,134,134,134,239,0,0,0,0,0,0,0,0,94,94,94,47,125,125,125,255,157,
+156,155,254,80,101,133,255,114,139,176,255,61,102,165,255,101,128,156,255,98,
+127,157,255,66,107,164,255,116,140,177,255,84,108,145,255,123,129,138,255,165,
+165,165,255,89,89,89,168,0,0,0,0,0,0,0,0,0,0,0,0,71,71,71,80,113,112,111,249,42,
+62,92,255,73,100,133,254,84,112,146,255,85,116,155,255,86,118,158,255,84,114,
+152,255,79,107,140,255,69,93,126,255,87,93,102,255,106,106,106,171,0,0,0,0,61,
+61,61,0,0,0,0,0,59,59,59,0,0,0,0,0,0,0,0,1,68,68,69,92,28,53,86,243,74,108,157,
+254,92,125,175,255,98,132,180,255,91,124,171,255,69,98,141,255,15,30,52,173,55,
+53,49,35,0,0,0,0,61,61,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,59,59,0,0,0,0,0,
+0,13,40,56,65,98,140,255,106,143,196,255,112,149,202,255,102,140,195,254,26,
+47,75,216,0,0,0,0,77,77,82,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,7,23,42,143,123,161,207,255,144,179,230,254,65,93,122,
+255,0,0,5,19,7,24,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,6,22,45,0,0,0,0,0,32,53,68,222,112,154,190,255,0,0,0,87,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,2,10,21,0,0,0,0,27,28,53,60,157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0};
+MGL_EXPORT Fl_RGB_Image img_svn(idata_svn, 16, 16, 4, 0);
+
+static const unsigned char idata_adjust[] =
+{0,0,0,24,0,0,0,51,0,0,0,51,0,0,0,51,0,0,0,51,0,0,0,51,0,0,0,51,0,0,0,51,0,
+0,0,51,0,0,0,51,0,0,0,51,0,0,0,51,0,0,0,51,0,0,0,51,0,0,0,51,0,0,0,24,0,0,0,
+51,243,243,244,255,243,243,244,255,243,243,244,255,243,243,244,255,243,243,244,
+255,243,243,244,255,243,243,244,255,243,243,244,255,243,243,244,255,243,243,244,
+255,243,243,244,255,243,243,244,255,243,243,244,255,243,243,244,255,0,0,0,51,0,
+0,0,51,222,222,224,255,222,222,224,255,222,222,224,255,222,222,224,255,222,
+222,224,255,222,222,224,255,222,222,224,255,222,222,224,255,222,222,224,255,222,
+222,224,255,222,222,224,255,222,222,224,255,222,222,224,255,222,222,224,255,0,0,
+0,51,0,0,0,51,207,207,209,255,207,207,209,255,207,207,209,255,207,207,209,255,
+207,207,209,255,207,207,209,255,207,207,209,255,207,207,209,255,207,207,209,255,
+207,207,209,255,207,207,209,255,207,207,209,255,207,207,209,255,207,207,209,255,
+0,0,0,51,0,0,0,51,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,0,0,0,51,0,0,0,51,255,255,255,255,185,60,60,255,198,94,94,255,222,161,161,
+255,254,254,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,254,253,253,255,221,160,160,255,197,94,94,255,186,62,62,255,255,255,255,255,
+0,0,0,51,0,0,0,51,255,255,255,255,197,93,93,255,164,0,0,255,221,159,159,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,220,156,156,255,164,0,0,255,198,96,96,255,255,255,255,255,0,0,0,
+51,0,0,0,51,255,255,255,255,221,160,160,255,220,158,158,255,193,82,82,255,247,
+231,231,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,246,
+230,230,255,193,82,82,255,220,157,157,255,222,162,162,255,255,255,255,255,0,0,0,
+51,0,0,0,51,255,255,255,255,254,253,253,255,255,255,255,255,246,231,231,255,
+247,233,233,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+247,232,232,255,247,232,232,255,255,255,255,255,254,253,253,255,255,255,255,255,
+0,0,0,51,0,0,0,51,255,255,255,255,254,253,253,255,255,255,255,255,247,233,233,
+255,246,229,229,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,245,228,228,255,248,234,234,255,255,255,255,255,254,253,253,255,255,255,255,
+255,0,0,0,51,0,0,0,51,255,255,255,255,223,165,165,255,219,153,153,255,193,82,82,
+255,246,229,229,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,245,228,228,255,193,82,82,255,218,152,152,255,224,168,168,255,255,255,255,
+255,0,0,0,51,0,0,0,51,255,255,255,255,200,100,100,255,164,0,0,255,218,151,151,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,216,147,147,255,164,0,0,255,201,103,103,255,255,255,255,255,
+0,0,0,51,0,0,0,51,255,255,255,255,188,67,67,255,198,94,94,255,221,160,160,255,
+254,253,253,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+254,252,252,255,221,159,159,255,197,94,94,255,189,70,70,255,255,255,255,255,0,0,
+0,51,0,0,0,51,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+0,0,0,51,0,0,0,24,0,0,0,51,0,0,0,51,0,0,0,51,0,0,0,51,0,0,0,51,0,0,0,51,0,0,0,
+51,0,0,0,51,0,0,0,51,0,0,0,51,0,0,0,51,0,0,0,51,0,0,0,51,0,0,0,51,0,0,0,24,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+MGL_EXPORT Fl_RGB_Image img_adjust(idata_adjust, 16, 16, 4, 0);
+
+static const unsigned char idata_reload[] =
+{255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,0,77,0,35,0,79,0,
+126,3,91,3,192,36,118,36,241,55,130,55,243,22,104,22,201,0,80,0,133,0,77,0,36,
+255,255,255,0,255,255,255,0,0,77,0,28,0,77,0,32,255,255,255,0,255,255,255,0,0,
+77,0,2,0,78,0,115,19,112,19,247,94,165,94,255,121,186,121,255,146,206,146,255,
+149,208,149,255,134,193,134,255,99,168,99,255,18,110,18,247,0,79,0,122,0,77,0,
+69,15,104,14,242,8,89,7,234,255,255,255,0,0,77,0,2,2,84,1,193,59,140,57,250,
+124,189,124,255,126,195,126,255,126,195,126,255,126,195,126,255,126,195,126,255,
+126,195,126,255,126,195,126,255,123,189,123,255,65,143,63,250,18,114,15,251,115,
+182,114,255,4,95,2,255,255,255,255,0,1,79,0,116,50,124,45,250,112,180,112,255,
+109,179,109,255,110,179,110,255,91,160,91,255,64,135,64,255,65,134,65,255,100,
+163,100,255,109,179,109,255,109,179,109,255,111,180,111,255,111,178,111,255,113,
+181,113,255,6,95,3,255,0,77,0,39,21,101,16,247,87,156,87,255,93,164,93,255,90,
+160,90,255,40,111,40,255,3,78,2,255,10,75,7,255,19,81,16,255,5,79,3,255,22,106,
+22,255,76,157,76,255,93,171,93,255,93,170,93,255,96,169,96,255,8,96,5,255,1,78,
+0,132,48,116,44,254,76,148,76,255,76,148,76,255,31,104,31,255,10,82,5,254,14,
+86,7,248,4,80,2,180,3,79,2,177,13,81,7,248,6,98,3,254,6,125,6,255,68,167,68,
+255,76,166,76,255,77,160,77,255,11,97,6,255,8,88,5,197,47,113,44,255,58,132,58,
+255,44,117,44,255,4,76,2,255,14,86,7,245,0,77,0,36,255,255,255,0,0,77,0,49,13,
+82,7,246,5,143,4,255,28,174,28,255,55,178,55,255,59,166,59,255,44,143,44,255,
+12,95,6,254,13,95,7,245,39,110,39,255,43,117,43,255,21,97,21,255,7,73,4,255,3,
+80,2,176,255,255,255,0,255,255,255,0,12,86,8,69,18,100,10,255,18,160,16,255,24,
+151,21,255,24,136,21,255,11,113,8,255,10,102,6,255,6,87,3,182,10,91,5,250,8,80,
+8,255,8,84,8,255,3,91,3,255,8,86,4,255,2,80,1,185,255,255,255,0,255,255,255,0,
+255,255,255,0,0,77,0,8,0,77,0,23,5,77,3,24,5,78,2,21,3,79,1,18,0,78,0,13,255,
+255,255,0,4,84,2,196,8,70,4,255,0,89,0,255,0,110,0,255,7,120,4,255,9,88,4,247,0,
+77,0,39,255,255,255,0,255,255,255,0,0,77,0,34,2,78,1,185,6,123,4,44,2,126,0,25,
+8,108,4,13,13,92,7,5,255,255,255,0,0,78,0,122,12,76,7,254,0,107,0,255,0,130,0,
+255,5,143,2,255,26,134,7,254,10,92,6,244,1,78,0,169,1,79,1,170,7,83,4,244,22,
+112,12,189,18,151,10,108,11,146,5,76,3,141,1,50,11,100,6,26,0,96,0,0,0,77,0,41,
+9,85,5,247,9,118,5,255,3,142,1,255,13,147,7,255,24,154,13,255,43,158,23,255,
+38,139,20,254,41,139,21,254,50,163,25,250,40,164,21,220,32,159,17,175,22,153,
+11,134,17,140,9,103,8,101,4,32,255,255,255,0,255,255,255,0,0,77,0,116,19,101,
+10,250,11,146,6,255,22,153,11,255,35,161,18,255,47,168,24,255,49,177,26,255,44,
+185,23,255,44,184,23,255,51,174,27,255,44,166,23,217,37,159,21,174,10,94,6,220,
+0,77,0,64,255,255,255,0,255,255,255,0,0,77,0,1,0,77,0,184,27,112,14,248,38,
+155,20,255,43,166,23,255,48,179,25,255,35,199,18,255,27,211,14,255,28,209,15,
+255,38,195,20,255,58,170,30,252,28,115,15,238,0,78,0,178,0,77,0,1,255,255,255,0,
+255,255,255,0,255,255,255,0,0,77,0,1,0,77,0,109,13,95,8,244,22,129,12,253,49,
+169,26,255,41,207,22,255,30,226,16,255,33,198,18,255,13,143,7,254,10,89,5,244,0,
+77,0,122,0,77,0,6,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0,255,255,255,0,0,77,0,31,0,77,0,127,0,77,0,186,3,79,1,237,2,78,1,238,0,
+77,0,192,0,77,0,133,0,77,0,29,255,255,255,0,255,255,255,0,255,255,255,0,255,
+255,255,0};
+MGL_EXPORT Fl_RGB_Image img_reload(idata_reload, 16, 16, 4, 0);
+
+static const unsigned char idata_zoom12[] =
+{0,0,0,0,230,230,229,0,0,0,0,0,238,238,236,104,214,215,215,199,168,171,176,
+241,162,165,170,242,191,193,193,202,202,202,199,115,0,0,0,0,177,178,176,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,223,224,223,0,232,233,234,9,218,219,219,220,
+152,161,173,243,185,193,205,238,239,245,254,240,235,242,252,236,180,192,210,230,
+144,155,172,237,164,166,166,230,165,166,165,20,158,159,157,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,215,214,215,218,150,164,184,229,235,244,254,231,229,238,
+248,223,228,238,249,218,226,237,249,214,221,233,248,213,220,232,249,216,161,177,
+202,221,157,160,160,234,0,0,0,0,131,133,130,0,0,0,0,0,0,0,0,0,0,0,0,0,217,216,
+214,104,156,169,187,237,220,232,249,220,234,246,255,202,223,236,250,197,226,240,
+250,187,226,241,251,182,237,253,255,174,226,244,255,180,207,224,247,203,139,157,
+183,222,210,209,204,131,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,195,196,196,198,156,177,
+211,210,223,241,255,190,43,64,93,255,243,255,255,156,246,255,255,141,253,255,
+255,133,51,70,100,255,58,79,111,255,255,255,255,184,138,173,219,182,142,146,147,
+231,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,161,169,177,239,145,180,228,181,135,159,183,
+195,108,135,170,246,255,255,255,110,70,90,116,229,249,255,255,86,255,255,255,
+165,255,255,255,145,58,79,109,255,152,198,251,142,102,112,123,251,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,154,162,171,240,92,146,215,153,237,255,255,187,96,124,159,
+240,210,255,255,41,255,255,255,162,171,255,255,23,187,202,211,173,63,84,116,255,
+122,161,179,108,153,198,246,137,99,110,121,248,78,80,75,3,0,0,0,0,0,0,0,0,0,0,0,
+0,159,162,162,207,94,143,209,164,137,198,248,101,100,127,161,244,220,255,255,
+40,255,255,255,16,255,255,255,15,67,87,114,255,0,0,0,0,240,255,255,52,158,199,
+245,148,96,101,103,235,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,165,164,159,120,126,153,
+189,204,172,212,249,137,94,120,157,247,255,255,255,25,91,109,132,255,255,255,
+255,1,92,115,137,67,67,89,120,255,63,85,114,255,152,181,216,176,85,85,78,145,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199,201,201,235,147,179,222,182,239,255,
+255,184,163,239,248,45,255,255,255,155,148,227,237,8,255,255,255,4,255,255,255,
+167,249,255,255,197,96,102,104,236,75,78,77,4,85,87,83,0,0,0,0,0,0,0,0,0,0,0,0,
+0,165,166,164,0,121,125,121,21,129,133,133,235,100,134,179,177,146,202,254,
+114,187,239,255,75,218,255,255,75,213,248,255,98,158,185,211,160,104,108,110,
+253,146,148,144,169,90,92,89,41,111,112,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+121,122,119,0,0,0,0,0,98,97,90,136,90,96,96,231,95,107,119,240,100,112,123,236,
+99,104,107,237,87,86,80,150,73,74,73,33,229,228,228,255,148,149,146,245,38,41,
+35,10,98,100,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,83,
+84,80,4,80,82,78,6,0,0,0,0,0,0,0,0,0,0,0,0,143,143,143,140,231,232,231,255,136,
+137,134,223,0,0,0,0,91,93,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,91,91,91,0,0,0,0,0,158,158,158,183,223,224,
+223,255,126,127,124,192,0,0,0,0,85,85,81,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,101,101,101,0,0,0,0,0,174,175,174,
+215,209,211,209,255,120,121,118,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,111,112,111,0,0,0,0,6,197,
+198,197,221,175,176,174,159,0,0,0,0};
+MGL_EXPORT Fl_RGB_Image img_zoom12(idata_zoom12, 16, 16, 4, 0);
+
+static const unsigned char idata_zoom21[] =
+{0,0,0,0,0,0,0,0,0,0,0,0,233,235,234,13,238,238,236,148,192,194,197,221,162,
+166,171,246,168,171,175,233,203,203,200,178,198,198,196,59,0,0,0,0,168,169,167,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,238,237,236,69,189,192,197,
+255,159,168,181,238,210,218,227,239,243,248,255,239,221,229,241,234,161,174,192,
+229,143,151,163,250,177,176,171,159,0,0,0,0,148,149,147,0,0,0,0,0,0,0,0,0,0,0,0,
+0,214,214,213,0,226,227,226,42,181,187,193,255,196,207,224,231,230,239,250,
+227,228,238,250,221,227,237,249,216,226,236,250,213,221,232,247,214,215,228,248,
+218,132,146,164,234,174,174,170,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,206,
+207,207,213,167,184,207,223,228,241,255,211,234,247,255,198,224,238,251,193,227,
+240,251,185,225,240,250,181,219,236,250,182,225,243,255,186,196,216,241,208,165,
+174,185,250,117,118,115,22,0,0,0,0,0,0,0,0,0,0,0,0,202,201,200,27,158,167,182,
+249,215,233,255,205,50,70,97,255,56,79,110,255,255,255,255,141,231,249,252,145,
+247,255,255,132,254,255,255,130,44,64,93,255,229,245,255,192,111,139,176,202,
+157,156,151,129,0,0,0,0,0,0,0,0,0,0,0,0,196,196,191,85,124,146,178,219,177,204,
+240,180,249,255,255,206,255,255,255,179,57,78,110,255,255,255,255,90,69,89,116,
+221,115,146,162,123,107,134,168,239,190,227,254,123,107,150,207,170,110,109,101,
+185,0,0,0,0,0,0,0,0,0,0,0,0,183,183,178,88,121,144,177,215,113,167,231,135,181,
+199,212,194,60,81,112,255,123,155,172,98,184,255,255,30,254,255,255,153,255,255,
+255,149,95,123,158,236,180,238,255,81,123,165,221,165,101,100,92,187,0,0,0,0,0,
+0,0,0,0,0,0,0,169,170,167,38,132,148,168,236,125,178,242,135,66,84,108,255,
+255,255,255,22,255,255,255,27,193,243,249,34,255,255,255,6,255,255,255,14,101,
+127,162,243,204,252,255,84,131,160,198,186,84,84,76,135,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,162,165,164,227,123,165,219,171,127,161,191,142,65,85,116,255,67,87,
+117,255,0,0,0,0,94,112,135,255,0,0,0,0,93,121,157,245,211,245,255,119,109,121,
+135,238,80,81,76,33,85,87,83,0,0,0,0,0,0,0,0,0,169,172,169,0,177,178,174,60,189,
+196,207,249,142,188,242,144,251,255,255,166,255,255,255,153,129,225,238,14,255,
+255,255,141,200,242,247,19,255,255,255,186,145,171,201,184,88,88,81,162,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,154,153,148,97,109,121,133,242,107,
+157,215,146,159,215,255,93,206,249,255,77,218,255,255,72,198,235,255,117,132,
+150,169,200,119,120,116,255,126,128,125,117,0,0,0,0,85,86,82,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,100,101,95,36,93,94,88,183,91,99,106,243,100,111,124,
+234,101,110,119,244,98,100,97,215,78,78,73,90,181,182,181,130,222,222,221,255,
+119,120,118,168,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,92,94,90,0,0,0,
+0,0,0,0,0,0,84,86,82,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,187,188,187,232,202,
+203,202,255,112,113,109,123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,118,118,118,0,55,55,55,17,200,201,
+200,251,183,184,182,255,102,103,100,79,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,192,192,0,96,96,
+96,43,211,211,211,255,166,167,166,255,94,96,91,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+119,120,119,75,214,215,214,249,143,145,142,61};
+MGL_EXPORT Fl_RGB_Image img_zoom21(idata_zoom21, 16, 16, 4, 0);
+
+static const unsigned char idata_pause[] =
+{255,0,255,0,255,0,255,0,133,38,131,129,129,181,127,231,127,231,129,181,131,
+129,133,38,255,0,255,0,255,0,255,0,255,0,255,0,127,1,125,113,121,246,114,255,
+116,255,127,255,127,255,116,255,114,255,121,246,125,113,127,1,255,0,255,0,255,0,
+122,1,121,182,111,255,119,255,186,255,208,255,217,255,219,255,212,255,186,255,
+118,255,111,255,121,182,122,1,255,0,255,0,115,113,107,255,142,255,211,255,232,
+255,239,255,242,255,243,255,241,255,234,255,221,255,141,255,107,255,115,113,255,
+0,113,38,108,246,115,255,213,255,237,255,246,255,251,255,253,255,253,255,252,
+255,250,255,241,255,226,255,116,255,108,246,113,38,106,129,97,255,190,255,236,
+255,246,255,152,255,133,255,255,255,255,255,119,255,97,255,252,255,241,255,208,
+255,97,255,106,128,101,181,102,255,206,255,241,255,252,255,146,255,108,255,255,
+255,255,255,111,255,64,255,255,255,250,255,233,255,104,255,101,181,96,231,115,
+255,208,255,239,255,252,255,119,255,75,255,255,255,255,255,96,255,34,255,255,
+255,252,255,239,255,123,255,96,231,93,231,114,255,213,255,241,255,253,255,77,
+255,0,255,255,255,255,255,77,255,0,255,255,255,253,255,241,255,124,255,93,231,
+91,181,96,255,208,255,239,255,252,255,82,255,27,255,255,255,255,255,82,255,27,
+255,255,255,252,255,239,255,100,255,91,181,91,129,84,255,184,255,233,255,250,
+255,94,255,54,255,255,255,255,255,94,255,54,255,255,255,250,255,219,255,84,255,
+91,128,89,38,85,246,103,255,221,255,241,255,252,255,255,255,255,255,255,255,
+255,255,255,255,252,255,241,255,115,255,85,246,89,38,255,0,86,113,80,255,134,
+255,226,255,241,255,250,255,252,255,253,255,252,255,250,255,241,255,154,255,80,
+255,86,113,255,0,255,0,87,1,86,182,79,255,104,255,208,255,233,255,239,255,241,
+255,239,255,219,255,114,255,79,255,86,182,87,1,255,0,255,0,255,0,86,1,84,113,82,
+246,79,255,93,255,118,255,120,255,95,255,79,255,82,246,84,113,86,1,255,0,255,0,
+255,0,255,0,255,0,255,0,85,38,84,129,82,181,81,231,81,231,82,181,84,129,85,38,
+255,0,255,0,255,0,255,0};
+MGL_EXPORT Fl_RGB_Image img_pause(idata_pause, 16, 16, 2, 0);
+
+static const unsigned char idata_icons[] =
+{0,0,0,0,0,0,0,1,0,0,0,10,0,0,0,16,0,0,0,17,0,0,0,17,0,0,0,17,0,0,0,17,0,0,
+0,17,0,0,0,17,0,0,0,17,0,0,0,17,0,0,0,17,0,0,0,16,0,0,0,10,0,0,0,1,0,0,0,0,0,
+0,0,19,245,245,245,214,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,243,243,243,208,0,0,0,19,0,0,0,1,0,
+0,0,45,255,255,255,255,229,229,230,255,163,178,201,255,165,180,202,255,233,
+233,233,255,248,248,248,255,249,249,249,255,250,250,250,255,236,236,236,255,197,
+164,195,255,198,166,196,255,237,236,237,255,251,251,251,251,0,0,0,45,0,0,0,1,0,
+0,0,49,255,255,255,255,133,153,182,255,90,186,232,255,90,186,231,255,141,160,
+186,255,250,250,250,255,250,250,250,255,250,250,250,255,178,135,177,255,228,107,
+231,255,228,108,231,255,182,142,181,255,251,251,251,251,0,0,0,49,0,0,0,1,0,0,0,
+50,255,255,255,255,120,144,172,255,81,211,245,255,81,212,245,255,126,150,174,
+255,250,250,250,255,250,250,250,255,250,250,250,255,169,123,169,255,242,133,246,
+255,242,134,246,255,171,129,172,255,251,251,251,252,0,0,0,50,0,0,0,1,0,0,0,50,
+255,255,255,255,208,208,208,255,113,146,165,255,114,147,165,255,209,209,209,255,
+250,250,250,255,250,250,250,255,250,250,250,255,209,209,209,255,163,121,165,255,
+164,122,165,255,209,209,209,255,251,251,251,252,0,0,0,50,0,0,0,1,0,0,0,50,255,
+255,255,255,250,250,250,255,250,250,250,255,250,250,250,255,250,250,250,255,250,
+250,250,255,250,250,250,255,250,250,250,255,250,250,250,255,250,250,250,255,250,
+250,250,255,250,250,250,255,251,251,251,252,0,0,0,50,0,0,0,1,0,0,0,50,255,255,
+255,255,250,250,250,255,250,250,250,255,250,250,250,255,250,250,250,255,250,250,
+250,255,250,250,250,255,250,250,250,255,250,250,250,255,250,250,250,255,250,250,
+250,255,249,249,249,255,251,251,251,252,0,0,0,50,0,0,0,1,0,0,0,50,255,255,255,
+255,250,250,250,255,250,250,250,255,250,250,250,255,250,250,250,255,250,250,250,
+255,250,250,250,255,250,250,250,255,250,250,250,255,249,249,249,255,246,246,246,
+255,244,244,244,255,251,251,251,252,0,0,0,50,0,0,0,1,0,0,0,50,255,255,255,255,
+236,236,236,255,182,199,164,255,183,200,166,255,236,236,236,255,250,250,250,255,
+250,250,250,255,250,250,250,255,233,233,232,255,189,192,158,255,190,193,160,255,
+228,228,228,255,251,251,251,252,0,0,0,50,0,0,0,1,0,0,0,50,255,255,255,255,157,
+180,134,255,158,231,91,255,158,231,91,255,162,184,140,255,250,250,250,255,249,
+249,249,255,246,246,246,255,171,175,132,255,227,233,108,255,227,233,108,255,175,
+179,138,255,251,251,251,252,0,0,0,50,0,0,0,1,0,0,0,50,255,255,255,255,145,171,
+120,255,168,245,99,255,168,245,100,255,149,173,126,255,250,250,250,255,247,247,
+247,255,242,242,242,255,163,167,122,255,245,244,133,255,245,244,133,255,166,169,
+127,255,251,251,251,252,0,0,0,50,0,0,0,1,0,0,0,49,255,255,255,255,209,209,209,
+255,138,165,114,255,139,165,116,255,209,209,209,255,249,249,249,255,244,244,244,
+255,241,241,241,255,203,203,203,255,160,163,122,255,160,162,123,255,198,198,198,
+255,251,251,251,251,0,0,0,49,0,0,0,0,0,0,0,40,223,223,223,226,249,249,249,253,
+249,249,249,253,249,249,249,253,249,249,249,253,249,249,249,253,249,249,249,253,
+249,249,249,253,249,249,249,253,249,249,249,253,249,249,249,253,249,249,249,253,
+218,218,218,223,0,0,0,40,0,0,0,0,0,0,0,11,0,0,0,67,0,0,0,102,0,0,0,104,0,0,0,
+104,0,0,0,104,0,0,0,104,0,0,0,104,0,0,0,104,0,0,0,104,0,0,0,104,0,0,0,104,0,0,0,
+102,0,0,0,67,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,5,0,0,0,6,0,0,0,6,0,0,0,6,0,
+0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,5,0,0,0,3,0,0,0,0};
+MGL_EXPORT Fl_RGB_Image img_icons(idata_icons, 16, 16, 4, 0);
+
+static const unsigned char idata_form[] =
+{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,23,0,0,0,41,0,
+0,0,41,0,0,0,41,0,0,0,41,0,0,0,41,0,0,0,41,0,0,0,41,0,0,0,41,0,0,0,41,0,0,0,
+41,0,0,0,41,0,0,0,41,0,0,0,41,0,0,0,41,9,9,9,23,0,0,0,40,255,255,255,255,253,
+253,253,255,253,253,253,255,253,253,253,255,253,253,253,255,253,253,253,255,253,
+253,253,255,253,253,253,255,255,255,255,255,203,203,205,255,193,193,195,255,255,
+255,255,255,203,203,205,255,202,202,204,255,0,0,0,40,0,0,0,40,231,231,233,255,
+225,225,226,255,225,225,226,255,225,225,226,255,225,225,226,255,225,225,226,255,
+225,225,226,255,225,225,226,255,228,228,230,255,155,155,159,255,153,153,158,255,
+233,233,234,255,155,155,159,255,163,163,167,255,0,0,0,40,0,0,0,40,216,216,218,
+255,210,210,212,255,210,210,212,255,210,210,212,255,210,210,212,255,212,212,214,
+255,212,212,214,255,212,212,214,255,213,213,215,255,216,216,218,255,216,216,218,
+255,213,213,215,255,216,216,218,255,221,221,224,255,0,0,0,40,0,0,0,40,208,208,
+210,255,211,211,213,255,211,211,213,255,211,211,213,255,205,205,207,255,163,163,
+164,255,159,159,160,255,160,160,161,255,160,160,161,255,160,160,161,255,160,160,
+161,255,160,160,161,255,160,160,161,255,165,165,166,255,0,0,0,40,0,0,0,40,216,
+216,219,255,57,57,57,255,66,66,65,255,57,57,57,255,214,214,216,255,160,160,161,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,40,0,0,0,40,208,208,
+210,255,211,211,214,255,211,211,213,255,211,211,214,255,205,205,207,255,157,157,
+158,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,40,0,0,0,40,208,
+208,210,255,203,203,205,255,203,203,205,255,203,203,205,255,202,202,204,255,207,
+207,210,255,201,201,203,255,201,201,204,255,201,201,204,255,201,201,204,255,201,
+201,204,255,201,201,204,255,201,201,204,255,207,207,209,255,0,0,0,40,0,0,0,40,
+208,208,210,255,211,211,214,255,211,211,213,255,211,211,214,255,205,205,207,255,
+163,163,164,255,160,160,161,255,160,160,161,255,160,160,161,255,160,160,161,255,
+160,160,161,255,160,160,161,255,160,160,161,255,165,165,166,255,0,0,0,40,0,0,0,
+40,216,216,219,255,57,57,57,255,66,66,65,255,57,57,57,255,214,214,216,255,160,
+160,161,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,40,0,0,0,40,
+208,208,210,255,211,211,214,255,211,211,213,255,211,211,214,255,205,205,207,255,
+160,160,161,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,40,0,0,0,
+40,208,208,210,255,203,203,205,255,203,203,205,255,203,203,205,255,205,205,207,
+255,157,157,158,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,40,0,
+0,0,39,214,214,216,255,209,209,211,255,209,209,211,255,209,209,211,255,209,
+209,211,255,211,211,214,255,206,206,208,255,205,205,207,255,205,205,207,255,205,
+205,207,255,205,205,207,255,205,205,207,255,205,205,207,255,209,209,213,255,0,0,
+0,39,6,6,6,32,0,0,0,60,0,0,0,60,0,0,0,60,0,0,0,60,0,0,0,60,0,0,0,60,0,0,0,60,
+0,0,0,60,0,0,0,60,0,0,0,60,0,0,0,60,0,0,0,60,0,0,0,60,0,0,0,60,6,6,6,32,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+MGL_EXPORT Fl_RGB_Image img_form(idata_form, 16, 16, 4, 0);
diff --git a/widgets/image.h b/widgets/image.h
new file mode 100644 (file)
index 0000000..05aa089
--- /dev/null
@@ -0,0 +1,73 @@
+/* image.h is part of UDAV
+ * 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
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+//-----------------------------------------------------------------------------
+#ifndef IMAGE_H
+#define IMAGE_H
+//-----------------------------------------------------------------------------
+#include <Fl/Fl_RGB_Image.H>
+
+extern MGL_EXPORT Fl_RGB_Image img_load;
+extern MGL_EXPORT Fl_RGB_Image img_save;
+extern MGL_EXPORT Fl_RGB_Image img_calc;
+extern MGL_EXPORT Fl_RGB_Image img_undo;
+extern MGL_EXPORT Fl_RGB_Image img_redo;
+extern MGL_EXPORT Fl_RGB_Image img_copy;
+extern MGL_EXPORT Fl_RGB_Image img_paste;
+extern MGL_EXPORT Fl_RGB_Image img_find;
+extern MGL_EXPORT Fl_RGB_Image img_prop;
+extern MGL_EXPORT Fl_RGB_Image img_alpha;
+extern MGL_EXPORT Fl_RGB_Image img_light;
+extern MGL_EXPORT Fl_RGB_Image img_grid;
+extern MGL_EXPORT Fl_RGB_Image img_move;
+extern MGL_EXPORT Fl_RGB_Image img_orig;
+extern MGL_EXPORT Fl_RGB_Image img_update;
+extern MGL_EXPORT Fl_RGB_Image img_stop;
+extern MGL_EXPORT Fl_RGB_Image img_insert;
+extern MGL_EXPORT Fl_RGB_Image img_print;
+extern MGL_EXPORT Fl_RGB_Image img_goL;
+extern MGL_EXPORT Fl_RGB_Image img_goU;
+extern MGL_EXPORT Fl_RGB_Image img_zoomIn;
+extern MGL_EXPORT Fl_RGB_Image img_zoomOut;
+extern MGL_EXPORT Fl_RGB_Image img_goD;
+extern MGL_EXPORT Fl_RGB_Image img_goR;
+extern MGL_EXPORT Fl_RGB_Image img_next;
+extern MGL_EXPORT Fl_RGB_Image img_play;
+extern MGL_EXPORT Fl_RGB_Image img_prev;
+extern MGL_EXPORT Fl_RGB_Image img_plot;
+extern MGL_EXPORT Fl_RGB_Image img_system;
+extern MGL_EXPORT Fl_RGB_Image img_info;
+extern MGL_EXPORT Fl_RGB_Image img_help;
+extern MGL_EXPORT Fl_RGB_Image img_delete;
+extern MGL_EXPORT Fl_RGB_Image img_objectU;
+extern MGL_EXPORT Fl_RGB_Image img_objectD;
+extern MGL_EXPORT Fl_RGB_Image img_layer;
+extern MGL_EXPORT Fl_RGB_Image img_new;
+extern MGL_EXPORT Fl_RGB_Image img_clear;
+extern MGL_EXPORT Fl_RGB_Image img_plus;
+extern MGL_EXPORT Fl_RGB_Image img_minus;
+extern MGL_EXPORT Fl_RGB_Image img_udav;
+extern MGL_EXPORT Fl_RGB_Image img_fname;
+extern MGL_EXPORT Fl_RGB_Image img_curve;
+extern MGL_EXPORT Fl_RGB_Image img_svn;
+extern MGL_EXPORT Fl_RGB_Image img_adjust;
+extern MGL_EXPORT Fl_RGB_Image img_reload;
+extern MGL_EXPORT Fl_RGB_Image img_zoom12;
+extern MGL_EXPORT Fl_RGB_Image img_zoom21;
+extern MGL_EXPORT Fl_RGB_Image img_pause;
+extern MGL_EXPORT Fl_RGB_Image img_icons;
+extern MGL_EXPORT Fl_RGB_Image img_form;
+#endif
index b7b2f6c376dfe70b6a41446b4d6689df5a8fbbc9..a1de8f9570311de2ae65bd98fb68fa60b90fd4ad 100644 (file)
@@ -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)
 //-----------------------------------------------------------------------------
@@ -71,6 +72,8 @@ using mglCanvasWnd::Window;
        void Adjust();          ///< Adjust size of bitmap to window size
        void GotoFrame(int d);  ///< Show arbitrary frame (use relative step)
        void Animation();               ///< Run slideshow (animation) of frames
+       void MakeDialog(const char *ids, char const * const *args, const char *title=""){}      // TODO
+
 
 protected:
        QScrollArea *scroll;    ///< Scrolling area
@@ -99,8 +102,9 @@ 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;
+       setMinimumSize(gr->GetWidth(),gr->GetHeight());
+       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 +136,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);
 }
 //-----------------------------------------------------------------------------
@@ -154,6 +158,7 @@ void QMathGL::setGraph(HMGL GR)     ///< Set grapher object
        if(mgl_use_graph(gr,-1)<1)      mgl_delete_graph(gr);
        gr=gg;  mgl_use_graph(gg,1);
        gr->SetEventFunc(mgl_qt_event_func, NULL);
+       setMinimumSize(gr->GetWidth(),gr->GetHeight());
 }
 //-----------------------------------------------------------------------------
 void QMathGL::paintEvent(QPaintEvent *)
@@ -166,9 +171,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 +183,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,13 +329,14 @@ 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, "");
+               setlocale(LC_NUMERIC, loc.c_str());
                gr->AskStop(false);
+               setMinimumSize(gr->GetWidth(),gr->GetHeight());
        }
        else if(mgl_get_num_frame(gr)>0)
        {
@@ -358,7 +364,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));
@@ -368,7 +374,7 @@ void QMathGL::drawPrim()
                QString tst = primitives.section('\n',i,i);
                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()
@@ -474,8 +480,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();
                }
@@ -486,7 +494,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();
                }
@@ -520,14 +529,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; }
@@ -610,6 +617,13 @@ void QMathGL::mouseMoveEvent(QMouseEvent *ev)
                        refresh();      x0 = xe;        y0 = ye;
                }
        }
+/*     else if(mgl_get_flag(gr,MGL_SHOW_POS) && !(ev->button()&Qt::LeftButton))
+       {
+               mglPoint p = gr->CalcXYZ(ev->x(), ev->y(), true);
+               if(mgl_isnan(p.x))      mousePos = "";
+               else    mousePos.sprintf("x=%g, y=%g, z=%g",p.x,p.y,p.z);
+               emit posChanged(mousePos);
+       }*/
        ev->accept();
 }
 //-----------------------------------------------------------------------------
@@ -675,7 +689,7 @@ 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").toLocal8Bit().constData(), appName.toLocal8Bit().constData());
@@ -687,7 +701,7 @@ 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").toLocal8Bit().constData(), appName.toLocal8Bit().constData());
@@ -699,7 +713,7 @@ 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").toLocal8Bit().constData(), appName.toLocal8Bit().constData());
@@ -711,7 +725,7 @@ 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").toLocal8Bit().constData(), appName.toLocal8Bit().constData());
@@ -723,154 +737,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").toLocal8Bit().constData(), appName.toLocal8Bit().constData());
-               setlocale(LC_NUMERIC, "");
-       }
 }
 //-----------------------------------------------------------------------------
 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").toLocal8Bit().constData(), appName.toLocal8Bit().constData());
-               setlocale(LC_NUMERIC, "");
-       }
 }
 //-----------------------------------------------------------------------------
 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").toLocal8Bit().constData(), appName.toLocal8Bit().constData());
-               setlocale(LC_NUMERIC, "");
-       }
 }
 //-----------------------------------------------------------------------------
 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").toLocal8Bit().constData(), appName.toLocal8Bit().constData());
-               setlocale(LC_NUMERIC, "");
-       }
 }
 //-----------------------------------------------------------------------------
 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").toLocal8Bit().constData(), appName.toLocal8Bit().constData());
-               setlocale(LC_NUMERIC, "");
-       }
 }
 //-----------------------------------------------------------------------------
 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").toLocal8Bit().constData(), appName.toLocal8Bit().constData(),0);
-               setlocale(LC_NUMERIC, "");
-       }
 }
 //-----------------------------------------------------------------------------
 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").toLocal8Bit().constData(), appName.toLocal8Bit().constData(),1);
-               setlocale(LC_NUMERIC, "");
-       }
 }
 //-----------------------------------------------------------------------------
 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").toLocal8Bit().constData(), appName.toLocal8Bit().constData());
-               setlocale(LC_NUMERIC, "");
-       }
 }
 //-----------------------------------------------------------------------------
 /*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").toLocal8Bit().constData(), appName.toLocal8Bit().constData());
-               setlocale(LC_NUMERIC, "");
-       }
 }*/
 //-----------------------------------------------------------------------------
 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").toLocal8Bit().constData(), appName.toLocal8Bit().constData());
-               setlocale(LC_NUMERIC, "");
-       }
 }
 //-----------------------------------------------------------------------------
 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").toLocal8Bit().constData(), appName.toLocal8Bit().constData(),1);
-               setlocale(LC_NUMERIC, "");
-       }
 }
 //-----------------------------------------------------------------------------
 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").toLocal8Bit().constData(), appName.toLocal8Bit().constData());
-               setlocale(LC_NUMERIC, "");
-       }
 }
 //-----------------------------------------------------------------------------
 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];
@@ -897,16 +863,17 @@ void QMathGL::setSize(int w, int h)
 {
        resize(w, h);
        if(w!=pic.width() || h!=pic.height())   // update only when image size is changed
-       {       mgl_set_size(gr,w,h);   update();       }
+       {       mgl_set_size(gr,w,h);   update();
+               setMinimumSize(gr->GetWidth(),gr->GetHeight()); }
 }
 //-----------------------------------------------------------------------------
 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()
 {
@@ -918,7 +885,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;
@@ -978,7 +946,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();      }
 }
@@ -987,7 +955,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();      }
 }
@@ -1099,7 +1067,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;
@@ -1109,135 +1076,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);
 
@@ -1246,82 +1213,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 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;
 }
 //-----------------------------------------------------------------------------
index df45e98e274b6193d9b0052fad28d8573a702f75..5ed58685fd434d620393443d6516fae3af9889ae 100644 (file)
@@ -1,7 +1,7 @@
 include(GenerateExportHeader)
 
 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})
        target_link_libraries(mgl-qt4 mgl ${MGL_QT4_LIBS})
@@ -13,7 +13,7 @@ if(enable-qt4)
        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})
                target_link_libraries(mgl-wnd mgl ${FLTK_LIBRARIES} ${MGL_QT4_LIBS})
index aa70337fc9826bc430c60b73849071e72849bee6..5c5bbd79d9499ba46460f2c7fd032dd65a49fa3a 100644 (file)
@@ -1,7 +1,7 @@
 include(GenerateExportHeader)
 
 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})
        target_link_libraries(mgl-qt5 mgl ${MGL_QT5_LIBS})
@@ -12,7 +12,7 @@ if(enable-qt5)
                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})
                target_link_libraries(mgl-wnd mgl ${FLTK_LIBRARIES} ${MGL_QT5_LIBS})
index 99a2c8686993a3347deb50950a94db5d5083378f..2a3988ef94226b1a7e225ef20927959b973cd336 100644 (file)
@@ -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
@@ -279,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
@@ -290,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
@@ -351,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
@@ -363,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
@@ -375,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