summaryrefslogtreecommitdiff
path: root/Build
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2019-01-10 18:49:48 +0000
committerKarl Berry <karl@freefriends.org>2019-01-10 18:49:48 +0000
commit8d656f7b22badc7a1e4e48811521048ef3df7101 (patch)
tree207c9332ac340eef8b84e90d67a0f0c6a734e547 /Build
parentc75ad7aa4d5821b7c4034c949a5ed2401e589bea (diff)
asy 2.47 sources
git-svn-id: svn://tug.org/texlive/trunk@49658 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build')
-rw-r--r--Build/source/utils/README2
-rw-r--r--Build/source/utils/asymptote/ChangeLog2460
-rwxr-xr-xBuild/source/utils/asymptote/GUI/CubicBezier.py104
-rw-r--r--Build/source/utils/asymptote/GUI/CustMatTransform.py102
-rw-r--r--Build/source/utils/asymptote/GUI/DebugFlags.py6
-rw-r--r--Build/source/utils/asymptote/GUI/GuidesManager.py52
-rw-r--r--Build/source/utils/asymptote/GUI/InplaceAddObj.py356
-rw-r--r--Build/source/utils/asymptote/GUI/PrimitiveShape.py66
-rw-r--r--Build/source/utils/asymptote/GUI/SetCustomAnchor.py44
-rwxr-xr-xBuild/source/utils/asymptote/GUI/UndoRedoStack.py217
-rw-r--r--Build/source/utils/asymptote/GUI/Widg_addLabel.py96
-rw-r--r--Build/source/utils/asymptote/GUI/Widg_addPolyOpt.py31
-rw-r--r--Build/source/utils/asymptote/GUI/Widg_editBezier.py53
-rw-r--r--Build/source/utils/asymptote/GUI/Window1.py1890
-rw-r--r--Build/source/utils/asymptote/GUI/__init__.py1
-rw-r--r--Build/source/utils/asymptote/GUI/configs/__init__.py1
-rw-r--r--Build/source/utils/asymptote/GUI/configs/xasyconfig.cson57
-rw-r--r--Build/source/utils/asymptote/GUI/configs/xasykeymap.cson24
-rw-r--r--Build/source/utils/asymptote/GUI/icon-list.txt1
-rw-r--r--Build/source/utils/asymptote/GUI/icons_rc.py2680
-rw-r--r--Build/source/utils/asymptote/GUI/labelEditor.py154
-rw-r--r--Build/source/utils/asymptote/GUI/locale/th/LC_MESSAGES/base.po24
-rw-r--r--Build/source/utils/asymptote/GUI/pyUIClass/custMatTransform.py173
-rw-r--r--Build/source/utils/asymptote/GUI/pyUIClass/labelTextEditor.py119
-rw-r--r--Build/source/utils/asymptote/GUI/pyUIClass/setCustomAnchor.py55
-rw-r--r--Build/source/utils/asymptote/GUI/pyUIClass/widg_addLabel.py140
-rw-r--r--Build/source/utils/asymptote/GUI/pyUIClass/widg_addPolyOpt.py48
-rw-r--r--Build/source/utils/asymptote/GUI/pyUIClass/widg_editBezier.py94
-rw-r--r--Build/source/utils/asymptote/GUI/pyUIClass/widgetPointEditor.py96
-rw-r--r--Build/source/utils/asymptote/GUI/pyUIClass/window1.py930
-rw-r--r--Build/source/utils/asymptote/GUI/requirements.txt4
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons.qrc45
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/anchor.svg1
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/android-arrow-back.svg11
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/android-arrow-forward.svg11
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/android-camera.svg12
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/android-close.svg12
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/android-color-palette.svg17
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/android-delete.svg10
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/android-done.svg13
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/android-expand.svg12
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/android-folder-open.svg10
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/android-hand.svg15
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/android-locate.svg16
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/android-radio-button-off.svg12
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/android-radio-button-on.svg13
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/android-refresh.svg11
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/arrow-move.svg8
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/arrow-resize.svg8
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/bucket.asy28
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/bucket.svg14
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/center.asy9
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/center.svg11
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/centerorigin.asy7
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/centerorigin.svg14
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/check.svg9
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/chevron-with-circle-left.svg11
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/chevron-with-circle-right.svg11
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/circle.svg9
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/close-round.svg9
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/closedcurve.asy7
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/closedcurve.svg20
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/closedpolygon.asy7
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/closedpolygon.svg20
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/code.svg13
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/edit.svg13
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/eye.svg15
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/filledbucket.svg17
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/grid.svg32
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/magnifying-glass.svg11
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/opencurve.asy7
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/opencurve.svg20
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/openpolygon.asy7
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/openpolygon.svg20
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/plus-round.svg9
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/save.svg8
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/social-python.svg21
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/subdirectory-left.svg1
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/text.svg3
-rw-r--r--Build/source/utils/asymptote/GUI/res/icons/triangle-stroked-15.svg12
-rw-r--r--Build/source/utils/asymptote/GUI/setup.py13
-rw-r--r--Build/source/utils/asymptote/GUI/windows/custMatTransform.ui356
-rw-r--r--Build/source/utils/asymptote/GUI/windows/labelTextEditor.ui230
-rw-r--r--Build/source/utils/asymptote/GUI/windows/setCustomAnchor.ui109
-rw-r--r--Build/source/utils/asymptote/GUI/windows/widg_addLabel.ui287
-rw-r--r--Build/source/utils/asymptote/GUI/windows/widg_addPolyOpt.ui91
-rw-r--r--Build/source/utils/asymptote/GUI/windows/widg_editBezier.ui170
-rw-r--r--Build/source/utils/asymptote/GUI/windows/widgetPointEditor.ui150
-rw-r--r--Build/source/utils/asymptote/GUI/windows/window1.ui2000
-rwxr-xr-xBuild/source/utils/asymptote/GUI/xasy.py48
-rwxr-xr-xBuild/source/utils/asymptote/GUI/xasy2asy.py2111
-rwxr-xr-xBuild/source/utils/asymptote/GUI/xasyActions.py391
-rw-r--r--Build/source/utils/asymptote/GUI/xasyArgs.py23
-rwxr-xr-xBuild/source/utils/asymptote/GUI/xasyBezierEditor.py213
-rw-r--r--Build/source/utils/asymptote/GUI/xasyBezierInterface.py375
-rwxr-xr-xBuild/source/utils/asymptote/GUI/xasyCodeEditor.py47
-rwxr-xr-xBuild/source/utils/asymptote/GUI/xasyColorPicker.py240
-rw-r--r--Build/source/utils/asymptote/GUI/xasyExample.asy63
-rwxr-xr-xBuild/source/utils/asymptote/GUI/xasyFile.py364
-rwxr-xr-xBuild/source/utils/asymptote/GUI/xasyGUIIcons.py92
-rwxr-xr-xBuild/source/utils/asymptote/GUI/xasyMainWin.py1748
-rwxr-xr-xBuild/source/utils/asymptote/GUI/xasyOptions.py254
-rwxr-xr-xBuild/source/utils/asymptote/GUI/xasyOptionsDialog.py234
-rw-r--r--Build/source/utils/asymptote/GUI/xasyStrings.py23
-rw-r--r--Build/source/utils/asymptote/GUI/xasySvg.py22
-rw-r--r--Build/source/utils/asymptote/GUI/xasyTransform.py24
-rw-r--r--Build/source/utils/asymptote/GUI/xasyUtils.py50
-rw-r--r--Build/source/utils/asymptote/GUI/xasyValidator.py13
-rw-r--r--Build/source/utils/asymptote/Makefile.in42
-rw-r--r--Build/source/utils/asymptote/Pipfile11
-rw-r--r--Build/source/utils/asymptote/README18
-rw-r--r--Build/source/utils/asymptote/ReleaseNotes25
-rw-r--r--Build/source/utils/asymptote/arrayop.h14
-rw-r--r--Build/source/utils/asymptote/asy-keywords.el8
-rw-r--r--Build/source/utils/asymptote/asy.list1443
-rw-r--r--Build/source/utils/asymptote/asymptote.nsi7
-rw-r--r--Build/source/utils/asymptote/asymptote.spec8
-rw-r--r--Build/source/utils/asymptote/base/animation.asy4
-rwxr-xr-xBuild/source/utils/asymptote/base/asymptote.py10
-rw-r--r--Build/source/utils/asymptote/base/bsp.asy26
-rw-r--r--Build/source/utils/asymptote/base/plain.asy12
-rw-r--r--Build/source/utils/asymptote/base/plain_Label.asy13
-rw-r--r--Build/source/utils/asymptote/base/plain_boxes.asy4
-rw-r--r--Build/source/utils/asymptote/base/plain_constants.asy3
-rw-r--r--Build/source/utils/asymptote/base/plain_pens.asy8
-rw-r--r--Build/source/utils/asymptote/base/plain_picture.asy92
-rw-r--r--Build/source/utils/asymptote/base/plain_scaling.asy36
-rw-r--r--Build/source/utils/asymptote/base/plain_shipout.asy49
-rw-r--r--Build/source/utils/asymptote/base/plain_xasy.asy132
-rw-r--r--Build/source/utils/asymptote/base/rational.asy5
-rw-r--r--Build/source/utils/asymptote/base/rationalSimplex.asy280
-rw-r--r--Build/source/utils/asymptote/base/simplex.asy463
-rw-r--r--Build/source/utils/asymptote/base/slide.asy2
-rw-r--r--Build/source/utils/asymptote/base/three.asy7
-rwxr-xr-xBuild/source/utils/asymptote/build-scripts/build-asymptote2
-rwxr-xr-xBuild/source/utils/asymptote/build-scripts/build-asymptote.dos4
-rw-r--r--Build/source/utils/asymptote/builtin.cc3
-rw-r--r--Build/source/utils/asymptote/builtin.symbols.h91
-rwxr-xr-xBuild/source/utils/asymptote/config.guess122
-rw-r--r--Build/source/utils/asymptote/config.h.in2
-rwxr-xr-xBuild/source/utils/asymptote/config.sub2464
-rwxr-xr-xBuild/source/utils/asymptote/configure25
-rw-r--r--Build/source/utils/asymptote/configure.ac11
-rw-r--r--Build/source/utils/asymptote/doc/CAD.pdfbin66745 -> 67482 bytes
-rw-r--r--Build/source/utils/asymptote/doc/FAQ/asy-faq.info2
-rw-r--r--Build/source/utils/asymptote/doc/TeXShopAndAsymptote.pdfbin31943 -> 31439 bytes
-rw-r--r--Build/source/utils/asymptote/doc/asy-latex.pdfbin194542 -> 194542 bytes
-rw-r--r--Build/source/utils/asymptote/doc/asy.13
-rw-r--r--Build/source/utils/asymptote/doc/asyRefCard.pdfbin54839 -> 53548 bytes
-rw-r--r--Build/source/utils/asymptote/doc/asymptote.pdfbin1288356 -> 1289364 bytes
-rw-r--r--Build/source/utils/asymptote/doc/asymptote.texi75
-rw-r--r--Build/source/utils/asymptote/doc/planes.asy1
-rw-r--r--Build/source/utils/asymptote/doc/png/asymptote.info673
-rw-r--r--Build/source/utils/asymptote/drawclipbegin.h8
-rw-r--r--Build/source/utils/asymptote/drawelement.h10
-rw-r--r--Build/source/utils/asymptote/drawfill.cc18
-rw-r--r--Build/source/utils/asymptote/drawfill.h55
-rw-r--r--Build/source/utils/asymptote/drawimage.h27
-rw-r--r--Build/source/utils/asymptote/drawlabel.cc4
-rw-r--r--Build/source/utils/asymptote/drawlabel.h14
-rw-r--r--Build/source/utils/asymptote/drawlayer.h1
-rw-r--r--Build/source/utils/asymptote/drawpath.cc4
-rw-r--r--Build/source/utils/asymptote/drawpath.h3
-rw-r--r--Build/source/utils/asymptote/drawpath3.h17
-rw-r--r--Build/source/utils/asymptote/drawsurface.cc2
-rw-r--r--Build/source/utils/asymptote/drawsurface.h23
-rw-r--r--Build/source/utils/asymptote/errormsg.h6
-rw-r--r--Build/source/utils/asymptote/examples/p-orbital.asy2
-rw-r--r--Build/source/utils/asymptote/examples/slope.asy83
-rw-r--r--Build/source/utils/asymptote/exp.cc24
-rw-r--r--Build/source/utils/asymptote/fileio.h8
-rw-r--r--Build/source/utils/asymptote/glrender.cc2
-rw-r--r--Build/source/utils/asymptote/gsl.symbols.h394
-rw-r--r--Build/source/utils/asymptote/interact.cc1
-rw-r--r--Build/source/utils/asymptote/main.cc60
-rw-r--r--Build/source/utils/asymptote/memory.h2
-rw-r--r--Build/source/utils/asymptote/parser.cc44
-rw-r--r--Build/source/utils/asymptote/picture.cc131
-rw-r--r--Build/source/utils/asymptote/picture.h14
-rw-r--r--Build/source/utils/asymptote/pipestream.cc8
-rw-r--r--Build/source/utils/asymptote/process.cc38
-rw-r--r--Build/source/utils/asymptote/process.h13
-rw-r--r--Build/source/utils/asymptote/psfile.cc9
-rw-r--r--Build/source/utils/asymptote/psfile.h2
-rw-r--r--Build/source/utils/asymptote/revision.cc2
-rw-r--r--Build/source/utils/asymptote/runarray.cc250
-rw-r--r--Build/source/utils/asymptote/runarray.in5
-rw-r--r--Build/source/utils/asymptote/runarray.symbols.h61
-rw-r--r--Build/source/utils/asymptote/runbacktrace.symbols.h16
-rw-r--r--Build/source/utils/asymptote/runfile.symbols.h42
-rw-r--r--Build/source/utils/asymptote/runhistory.symbols.h22
-rw-r--r--Build/source/utils/asymptote/runlabel.symbols.h27
-rw-r--r--Build/source/utils/asymptote/runmath.symbols.h57
-rw-r--r--Build/source/utils/asymptote/runpair.symbols.h54
-rw-r--r--Build/source/utils/asymptote/runpath.symbols.h71
-rw-r--r--Build/source/utils/asymptote/runpath3d.symbols.h60
-rw-r--r--Build/source/utils/asymptote/runpicture.cc715
-rw-r--r--Build/source/utils/asymptote/runpicture.in264
-rw-r--r--Build/source/utils/asymptote/runpicture.symbols.h139
-rw-r--r--Build/source/utils/asymptote/runstring.symbols.h39
-rw-r--r--Build/source/utils/asymptote/runsystem.symbols.h40
-rw-r--r--Build/source/utils/asymptote/runtime.cc1069
-rw-r--r--Build/source/utils/asymptote/runtime.in26
-rw-r--r--Build/source/utils/asymptote/runtime.symbols.h113
-rw-r--r--Build/source/utils/asymptote/runtriple.symbols.h44
-rw-r--r--Build/source/utils/asymptote/settings.cc8
-rw-r--r--Build/source/utils/asymptote/stack.cc6
-rw-r--r--Build/source/utils/asymptote/types.symbols.h51
-rw-r--r--Build/source/utils/asymptote/vm.h1
209 files changed, 20884 insertions, 9978 deletions
diff --git a/Build/source/utils/README b/Build/source/utils/README
index 17442ebea3d..bf56d4fb6c4 100644
--- a/Build/source/utils/README
+++ b/Build/source/utils/README
@@ -4,7 +4,7 @@ Public domain. Originally written 2005 by Karl Berry.
Extra utilities we (optionally) compile for TeX Live.
See comments in ../texk/README.
-asymptote 2.44 - checked 8apr18
+asymptote 2.47 - checked 10jan19
update to TL from CTAN, to include prebuilt doc.
see http://tug.org/texlive/build.html#asymptote
and tlpkg/bin/tl-update-asy
diff --git a/Build/source/utils/asymptote/ChangeLog b/Build/source/utils/asymptote/ChangeLog
index 40756b2a7b0..dae875b195f 100644
--- a/Build/source/utils/asymptote/ChangeLog
+++ b/Build/source/utils/asymptote/ChangeLog
@@ -1,3 +1,2172 @@
+commit 67f0c4b2d24adc346d7b616b13298903433c5910
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Jul 30 23:23:47 2018 +0200
+
+ Minor optimization.
+
+commit 541b4014c2ad7fd63d845c3ffb6a33a6459c12eb
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Jul 30 23:07:55 2018 +0200
+
+ Fix scaling (allow second variable in Simplex method to be negative).
+
+commit 28bc9c75a1393cceb0cb719881804615ec09f05f
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Jul 30 11:23:04 2018 +0200
+
+ Generate EPS only for single-page documents.
+
+commit 89d2c88c2945096e5d765e3d9fe76163f8f553e2
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Jul 30 10:02:53 2018 +0200
+
+ Remove .vscode from releases.
+
+commit 39454327d81d169aa48fc25f6397afa0bba83be4
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Jul 30 09:57:43 2018 +0200
+
+ Remove unused files.
+
+commit 2157692a4b640473b188cdee545a431fea67e15b
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Jul 30 05:42:26 2018 +0200
+
+ Fix uptodate flag; remove spurious directory.
+
+commit aba57e58c0292a3298bc132298671814aeb67fc4
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Jul 30 04:42:23 2018 +0200
+
+ Fix URL in README.
+
+commit fa2aa36e9cea341aad6ab0e3bf49db93001069c5
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Jul 30 04:33:10 2018 +0200
+
+ Fix bsp module.
+
+commit 22d2b8d37da35bf1d0d6a1ddf75e1db32885ede0
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Jul 29 13:22:04 2018 -0600
+
+ Increment version to 2.47.
+
+commit 4eee33bc01e444c03242eefbce091bed40d3f835
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Jul 29 11:29:27 2018 -0600
+
+ Fix relative alignment under picture rotation.
+
+commit 9edc023b2c37d0ea50972c1ab784ee9e1e100d55
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Jul 29 01:42:29 2018 -0600
+
+ Fix commit 451a260ae50d02867c1e54726a68d8af2c55761d.
+
+commit 451a260ae50d02867c1e54726a68d8af2c55761d
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Jul 28 09:35:16 2018 -0600
+
+ Fix shipout issues.
+
+commit ae6d9d312ab21212216960f56122ffe8e0c7fa2a
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Jul 28 06:24:46 2018 -0600
+
+ Account for pen width in bbox.
+
+commit 3ea27282e2a79139cd5600ee31b8e1b451eb2d03
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Jul 27 02:02:17 2018 -0600
+
+ Don't use defaultGhostscriptLibrary location in MSWindows registry since TeXLive dvisvgm requires 32-bit version, even on 64-bit platforms.
+
+commit 3b49296799c14832747db90150d23067f946683a
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Jul 21 18:00:11 2018 -0600
+
+ Increment version to 2.46.
+
+commit 19dd6cc8027597d5e2ca25b07db2851d9771f03c
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Jul 21 15:37:27 2018 -0600
+
+ Revert "Update path."
+
+ This reverts commit f63df996a86c935c51e09c47fe9c0aa2a8d7dc2d.
+
+commit f63df996a86c935c51e09c47fe9c0aa2a8d7dc2d
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Jul 20 23:09:03 2018 -0600
+
+ Update path.
+
+commit 1734e7af6a018f27240fddd4e7bf14f569a09522
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Jul 20 21:33:54 2018 -0600
+
+ Improve error message when rsvg-convert is missing.
+
+commit abd6347aea2faaa2862e3ebe34c7f85dd820c77d
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Jul 19 15:10:59 2018 -0600
+
+ Remove obsolete uuid code.
+
+commit b46eed584fea0e625f2cde3dab23c2522d3d2486
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Jul 19 15:09:10 2018 -0600
+
+ Fix saveLocation.
+
+commit 87c39ea72263c68d5548da4941eda639f37fce22
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu Jul 19 14:59:32 2018 -0600
+
+ Use class instead of instance on item not existing.
+
+commit 721cc5cc84abe2351211262670f5091e66f33b7c
+Merge: ec53a266 5f95aa82
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu Jul 19 14:56:15 2018 -0600
+
+ Merge branch 'master' of github.com:vectorgraphics/asymptote
+
+commit ec53a266a170edcd94c8a070f4d5b4a028eba964
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu Jul 19 14:56:11 2018 -0600
+
+ Revert venn.
+
+commit b88d3d9df356db299150e59d4ee0ef0f5adf82bb
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu Jul 19 14:55:10 2018 -0600
+
+ Fix script not updating.
+
+commit 5f95aa8246f7976dfc17a522b66da4a4179833c1
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Jul 19 14:52:25 2018 -0600
+
+ Simplify build script.
+
+commit 779b1b60d7b7fcfa35d48a946fa421db1be54a82
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu Jul 19 14:37:25 2018 -0600
+
+ Only write transformation if the rest of transf is not Id.
+
+commit 63f054012ad1716c8c0de04521ac0e66b81afadb
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Jul 19 14:28:51 2018 -0600
+
+ Remove 'x' key prefix.
+
+commit 0e351c95efca60034ec5d9397ab7924bf415f6ca
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Jul 19 14:13:42 2018 -0600
+
+ Don't apply xmap without an explicit corresponding key.
+
+commit a7026b70bb0793696075d53f1a0dd683073acf82
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Jul 19 14:01:43 2018 -0600
+
+ Update xasy documentation.
+
+commit 7e9954d1ab1043f03b5082266b1cef7a44091c89
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu Jul 19 13:58:41 2018 -0600
+
+ Fix zooming sign inversion.
+
+commit bd333b65cf24379797188e00c961cda229727e0e
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu Jul 19 13:39:10 2018 -0600
+
+ Add zooming on arrow keys.
+
+commit 183b47c0f305f829cacaff28222bd1cf40523130
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu Jul 19 13:10:15 2018 -0600
+
+ Hook up/down to selection.
+
+commit 7a49eda58677c8d26fa8efbd8f946d80ac560c1a
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Jul 18 14:58:59 2018 -0600
+
+ Transform directly from asy to image coordinates.
+
+commit 65f66b98a91f4dff78c1f6e769005c20b53e926c
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Mon Jul 16 15:01:00 2018 -0600
+
+ Disable fill on open curve.
+
+commit 98d364235fdf5073c1dcf2f51c478f21e492de56
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Mon Jul 16 14:26:53 2018 -0600
+
+ Fix repeated asyfying.
+
+commit 0ad7327a11094d336057f6d21d99e1385e685c6c
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Sun Jul 15 22:30:36 2018 -0600
+
+ Fix line shift by xmap.
+
+commit 360e165e00f0c304600a2371af6b5ffefeff89f8
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Sun Jul 15 21:00:02 2018 -0600
+
+ Revert venn.
+
+commit 42b192057a798825b8e1f5cf0939072cb4f2c116
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Sun Jul 15 20:58:31 2018 -0600
+
+ Only do change of basis if transform is not Id.
+
+commit ef89f277409805f8a7e65ba7b735b9ddb9bee93d
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Sun Jul 15 20:49:13 2018 -0600
+
+ Fix transf on different basis.
+
+commit 76d1e66db7ecc1a550c73326b4ea34e65a2e4630
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Sun Jul 15 20:40:36 2018 -0600
+
+ Fix key load bug.
+
+commit 574c0d96364ccbea81810fcda44cff5b68a35dc6
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Sun Jul 15 20:23:50 2018 -0600
+
+ Fix add label not working.
+
+commit 7d6cff54d91e978bd700188d09af2e3da1d66ead
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Sun Jul 15 17:20:15 2018 -0600
+
+ Force cleanup asy.
+
+commit 815e72d73eaa2af714ce157dc8cbc3363ad92cd5
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Sun Jul 15 17:14:41 2018 -0600
+
+ Fix duplicate key problem.
+
+commit b85a7d3b9e8ab18806ceb0ef39cc4f983a55f348
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Jul 15 14:28:34 2018 -0600
+
+ Fix array bounds.
+
+commit 2c15d93e8ca19ea73ed1fb4186b3b3fc93520050
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Jul 15 14:28:16 2018 -0600
+
+ Remove duplicate option.
+
+commit a070e8a6f9e3a3bef91a09fb0b9e192541a2a6bb
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Jul 15 12:33:42 2018 -0600
+
+ Force dvisvgm to be silent.
+
+commit a8a7fea89b9ad8f7dbd02dac898301cfb0592257
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Jul 14 11:31:58 2018 -0600
+
+ Don't resize 3D pictures.
+
+commit c928c92f88c8b3b0942dc9c12bc8244233045e11
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Jul 14 10:38:34 2018 -0600
+
+ Finish xasy port to MSDOS.
+
+commit cd700b4bb9db2b80f77aae8a316a99dd3476c7b4
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Jul 14 10:38:06 2018 -0600
+
+ Redirect cerr to cout again when outpipe=2.
+
+commit f0bc292dd796329fdd39679b1852a6bff1159335
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Jul 14 10:34:17 2018 -0600
+
+ Fix segmentation fault.
+
+commit e1f68286465d275a5677860950e266288ade44a1
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Jul 12 15:13:59 2018 -0600
+
+ Port xasy to MSDOS.
+
+commit 7133ef53816e97ddb3b8e0870ffbfba9b95423b7
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed Jul 11 17:05:36 2018 -0600
+
+ Enable cycle control points.
+
+commit 1c444f8695301ae16bd8beb20778bd7fc14cc9cf
+Merge: 92d1e727 93a679de
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Jul 11 16:13:33 2018 -0600
+
+ Merge branch 'master' of github.com:vectorgraphics/asymptote
+
+commit 93a679de2f2902618546bf86884217c4e8da9041
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed Jul 11 16:13:20 2018 -0600
+
+ Set line width inversely proportional to mag.
+
+commit 92d1e7272842f751bd3952f13efb365e2d100121
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Jul 11 16:12:30 2018 -0600
+
+ Rename config files and commandPalette default keymap.
+
+commit cc93cbe1e79774062ab9fd741469c41e39600959
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed Jul 11 16:04:13 2018 -0600
+
+ Correctly fixes scaling with zoom.
+
+commit afad348e03eaf2e73cd606e4f008d7316bc52627
+Merge: 7f2a28a6 ad6faf30
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed Jul 11 16:02:35 2018 -0600
+
+ Merge branch 'master' of github.com:vectorgraphics/asymptote
+
+commit 7f2a28a6042a401e314b2d865a16d03f02e91687
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed Jul 11 16:02:32 2018 -0600
+
+ Make selection scale with magnification.
+
+commit ad6faf30e81d3ea2f58c92536b967f8d7491c4e8
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Jul 11 15:55:52 2018 -0600
+
+ Fix spelling.
+
+commit 1f383b4b5301c358b4867b692a26a2c3076e6268
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed Jul 11 15:51:31 2018 -0600
+
+ Fix typo again.
+
+commit 893f7fc2ee2e044395ead6215e1e53f195c8d82a
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed Jul 11 15:51:20 2018 -0600
+
+ Fix spelling error.
+
+commit 38f428fa9fe837bca5a00df56b94dbf2f842c235
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed Jul 11 15:49:34 2018 -0600
+
+ Make filename a little more clear.
+
+commit a3f98621376f1c45988dff32191e6da5ad1b53b7
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed Jul 11 15:37:32 2018 -0600
+
+ Fix segfault again (?).
+
+commit ecb5b2db65438e7ba9c626014925ac291f5c1941
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed Jul 11 15:33:59 2018 -0600
+
+ Fix segfault (?).
+
+commit ab12f523ac4e6e52e312cd66e9f869c762779e46
+Merge: 2d24c9aa feefafd6
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed Jul 11 15:29:04 2018 -0600
+
+ Merge in changes.
+
+commit feefafd64fdd5abdff99fdbdad523a1687ca34f1
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Jul 11 13:55:32 2018 -0600
+
+ Fix asymptote.spec.
+
+commit 935f81064cf10fa83ad49303b0d74ad50cf9856b
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Jul 11 13:49:33 2018 -0600
+
+ Fix asymptote.spec.
+
+commit e65e004ca8c75e168c6c1ac3a44c609a34754f73
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Jul 11 13:45:59 2018 -0600
+
+ Use install-notexhash for building RPMs.
+
+commit bb1cf672f4d99dc1ecdad8826adefd916f1cc9f7
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Jul 11 12:09:12 2018 -0600
+
+ Clean up icons; fix installation problems; port asymptote.py to Python 3.
+
+commit 2d24c9aadb12e6a35e7a840b07f20ced68c8e4a6
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Tue Jul 10 14:34:39 2018 -0600
+
+ Remove even more unnessecary code.
+
+commit 3cd990f8d5f9bea582c34cb36eaf8da538046ab0
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Tue Jul 10 14:19:08 2018 -0600
+
+ Generate -- instead of.. when using polygon.
+
+commit 7edcc2f34fcb7551d23a272d7f1bd0b03d940ee7
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Jul 10 00:56:06 2018 -0600
+
+ Fix duplicate QPainter warning.
+
+commit d1dfb2a8af1c4c5a186a5e622cdc2e2fd9c0b90e
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Jul 9 17:29:42 2018 -0600
+
+ Reset fileChanged on erase.
+
+commit bff496158e93e677e7839e056f5da52129e11e55
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Mon Jul 9 17:19:43 2018 -0600
+
+ Add check before reopening file.
+
+commit 2ecb76750fe0ebc120684a076ac3a5b4ab9ce810
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Jul 8 21:32:22 2018 -0600
+
+ Fix asymptote.spec.
+
+commit d67ec7242352fd97059022795846394ae36f5cbf
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Jul 8 21:09:06 2018 -0600
+
+ Specify python3 explicitly.
+
+commit a2f95654b4deb7cbf779e8068090f201aa3468b5
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Jul 8 20:46:48 2018 -0600
+
+ Read in xasy version.
+
+commit 94d4cd52647d433b1d13e5a96641c89f07203ebe
+Merge: de430749 770eea72
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Jul 8 17:06:00 2018 -0600
+
+ Merge branch 'qthup'.
+
+commit 770eea7237d039ee13b9f4b5adaa4a61e8e9297f
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Jul 8 15:27:45 2018 -0600
+
+ Erase canvas before opening new file.
+
+commit 6dba36575965266b3783f5a2bde8f5a65ab32451
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Sun Jul 8 13:06:47 2018 -0600
+
+ Automatically determine recomputation mode.
+
+commit 869d617084192cf799f0ec033b9ea31f74d6e07a
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Sun Jul 8 12:59:14 2018 -0600
+
+ Preserve Edit Bezier Mode.
+
+commit e8bc45d003f489ccc50fc4461aa19d56da314421
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Sun Jul 8 12:55:02 2018 -0600
+
+ Update .gitignore
+
+commit eed85abcd5e3c2347d4ad1ab86a3d8e550cd3f72
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Jul 8 12:40:09 2018 -0600
+
+ Improve informational messages.
+
+commit d5de0e972bf7242d2572c2a5a7ff0ded40f85a1e
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Jul 8 11:08:24 2018 -0600
+
+ Remove unused code.
+
+commit 63be5fe78ea461d3350277799528a78d01069189
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Jul 8 11:01:25 2018 -0600
+
+ Standardize labels.
+
+commit 618439764c892c9b9b3b0ecbfc52358d3e0a2646
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Jul 8 02:39:58 2018 -0600
+
+ Add missing actions; remove obsolete code; adjust layout.
+
+commit c2a3daa2e8a95ce104f7a8d828a4237274bd0188
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Jul 8 00:11:27 2018 -0600
+
+ Add remaining icons.
+
+commit 2f894a654d48bf5479331dfb7b176605b8df0eb5
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Jul 7 17:30:04 2018 -0600
+
+ Add fill bucket icons.
+
+commit ae34291ff7f91f19a5b29e8d145600096c1d186f
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Jul 7 10:49:30 2018 -0600
+
+ Rerender only when dpi exceeds previous maximum dpi.
+
+commit 326766200c3deffe4392d737a92dadbf9591b0d3
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Jul 6 16:38:38 2018 -0600
+
+ Fix clip flag.
+
+commit 1797d5f89eaa554d94d34d908e86858ae0d0fdb9
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Jul 6 16:29:02 2018 -0600
+
+ Make rsvg-convert read directly from file.
+
+commit 4fdad9b276f93f32164d1ff4da30164720e97b11
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Jul 6 15:54:11 2018 -0600
+
+ Remove unused code.
+
+commit cde402ba0d3a491f235b75390fa6232d019eaada
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Fri Jul 6 15:47:13 2018 -0600
+
+ Switch from cairo to rsvg.
+
+commit 365189781fe14a3b74662a24d7c37424648893f2
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Fri Jul 6 15:16:39 2018 -0600
+
+ Reset current position when click.
+
+commit 8d89b3ad95c45507ab958eee08e50cb7a71d6de1
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Fri Jul 6 14:25:35 2018 -0600
+
+ Add more icons.
+
+commit e52e4040874c315a50baeaee22858527197e758e
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu Jul 5 21:02:59 2018 -0600
+
+ Fix recenter not recognizing magnification.
+
+commit 54ad8477ed4821a59a8cd08eac741554152f124e
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu Jul 5 20:53:48 2018 -0600
+
+ Fix zooming transform.
+
+commit 9f52c34396577ced844734728ac67278ea2dd21e
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Jul 5 17:18:41 2018 -0600
+
+ Fix tooltips.
+
+commit c961cabc5ec05e7b0475d54557f298feae6b8dca
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu Jul 5 17:00:26 2018 -0600
+
+ Remove add widget upon addmode deletion.
+
+commit 8543e26542f78f2d334b0eb6580d80cca3bca45e
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu Jul 5 16:55:29 2018 -0600
+
+ Add remaining icons.
+
+commit 2ac5c23f2e1b32103ab49eae7b6797aaa5017512
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu Jul 5 15:32:49 2018 -0600
+
+ Enable pan-sensitive zooming.
+
+commit bf3cc0b9f763f4bf40cdc569db4d61d3f96a4f35
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu Jul 5 14:51:07 2018 -0600
+
+ Enables math mode detection in label.
+
+commit b8c2663e0fa1f0b0dc4c6cf41aec6af7aa9cc89e
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu Jul 5 14:34:54 2018 -0600
+
+ Add centering pan.
+
+commit 388907330408dae455768900739219e4a9b3b42f
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu Jul 5 13:48:16 2018 -0600
+
+ Add svg files.
+
+commit 7e9efcd61dcbe7cd0f45f437610e376fa9b4e2f3
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Jul 4 19:36:24 2018 -0600
+
+ Add index entries integral and integration.
+
+commit 405ee9a7bc6eb61e0268fc23177eacbcf6563154
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Tue Jul 3 23:40:02 2018 -0600
+
+ Enable centering pan option.
+
+commit 046b50a837798f4fa406adb434e2794f5c260a5f
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Tue Jul 3 23:33:57 2018 -0600
+
+ Add fuzz to small bounding boxes.
+
+commit 15e7d80a69049825de0a8e0c5f88e0aac2076462
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Tue Jul 3 23:24:57 2018 -0600
+
+ Copy text to advanced editor.
+
+commit ddc3fd7c15507fa42a9aea8ef0ea4a5d95776b6c
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Jul 3 16:40:36 2018 -0600
+
+ Improve and enable Cairo clip-path bug workaround.
+
+commit af49fa9dd676f2453ed65aefe6fa6106eab2de9e
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Tue Jul 3 15:08:38 2018 -0600
+
+ Round points to 10e6 precision.
+
+commit a1086f1f2141a0ed5ca1ee23c0c982cca50d0a50
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Tue Jul 3 14:58:15 2018 -0600
+
+ Add fontsize for label.
+
+commit ccc3b79d26559b18d86a95e5bcf02478c1051f33
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Tue Jul 3 14:24:51 2018 -0600
+
+ Enable removal of unneeded clips.
+
+commit b6a25e25e9f586a39d9af6b287b0373a4b703dd1
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Tue Jul 3 14:01:18 2018 -0600
+
+ Remove unnessecary braces from label editor.
+
+commit b0b8525c6e71cb2643e0c3a96aaea35f2df6ed1d
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Tue Jul 3 13:57:46 2018 -0600
+
+ Improve scaling on small labels.
+
+commit d21d7c005dee4968a3af58a1de68bb26e0e4ead6
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Mon Jul 2 15:21:02 2018 -0600
+
+ Only insert non-identity keys.
+
+commit bd259097ea0c45835110d7d627a0eea174c0d38a
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Mon Jul 2 14:59:31 2018 -0600
+
+ Fix label location and more QoL improvments.
+
+commit a8c22de51d598fff1b008b8b89ae702d8e0dfd15
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Jul 2 11:35:44 2018 -0600
+
+ Switch xmap to asy coordinates.
+
+commit 9ec81262cff36972c91e523dfdc0fdc5a529e3c5
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Jul 2 08:52:24 2018 -0600
+
+ Fix comment.
+
+commit 5a0588a23082a406cd718a71c6267d78cb9b4a0b
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Jul 1 21:33:03 2018 -0600
+
+ Fix missing KEYs.
+
+commit 89ecbf116ccee69453179cdab48b0b633a5ff8bb
+Merge: 4463b94c 67c86cd4
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Jul 1 19:08:33 2018 -0600
+
+ Merge branch 'qthup' of github.com:vectorgraphics/asymptote into qthup
+
+commit 4463b94c5c887de3f8c1f269c33d2bc60dfa1979
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Jul 1 17:12:32 2018 -0600
+
+ Resize to initial xasy transform.
+
+commit 67c86cd4113f13b275c87d890f5ab48f457808a7
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Sun Jul 1 14:11:25 2018 -0600
+
+ Should fix key not writing.
+
+commit 716f8065bfb6d5ce0f0b52f3956df0f92787bb99
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Jul 1 10:38:24 2018 -0600
+
+ Make SaveAs default to current directory. Add Save action.
+
+commit 9763a3e172d35b1cb7c093695fcaededd29ca391
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Jul 1 10:38:24 2018 -0600
+
+ Make SaveAs default to current directory. Add Save action.
+
+commit 7a2ff7f7017abf753579216bfa1ecd4b429e6576
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Jul 1 02:52:17 2018 -0600
+
+ Handle empty objects.
+
+commit 1f35ec3deb126f3e3d4e4b7bbea823336ecd958e
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Jul 1 02:43:25 2018 -0600
+
+ Remove obsolete redirection.
+
+commit 81d9ab652ce2eb7fb052d0a96f9ea63acc55d21a
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Jul 1 02:39:26 2018 -0600
+
+ Update bsp.
+
+commit 44ba3d7a149ff97144335ef13a53741a51107272
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Jul 1 02:30:33 2018 -0600
+
+ Handle null simplex problems.
+
+commit 943110ab88bb0af227c85cc906777908876888c0
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Sat Jun 30 21:10:45 2018 -0600
+
+ More QoL fixes.
+
+commit 6701d59cda39aba6ac5e228401e31b8e2879ab91
+Author: Supakorn Rassameemasmuang <mistersupakorn@gmail.com>
+Date: Sat Jun 30 21:07:07 2018 -0600
+
+ Delete Icon
+
+commit 5077b81969160b377b0af26f711350531ef19edf
+Author: Supakorn Rassameemasmuang <mistersupakorn@gmail.com>
+Date: Sat Jun 30 21:06:59 2018 -0600
+
+ Delete Icon
+
+commit 97f26873569db365d0f9e5127d362580bbcdabb3
+Author: Supakorn Rassameemasmuang <mistersupakorn@gmail.com>
+Date: Sat Jun 30 21:06:50 2018 -0600
+
+ Delete Icon
+
+commit be93a35d25f89a4ca801527912a6b21bb24759bb
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Jun 30 20:16:41 2018 -0600
+
+ Suppress dvisvgm warnings; use dvisvgm --pdf when available.
+
+commit 3bbab66ea27fe2aeecca64b53abd150ab787dee1
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Jun 30 18:22:54 2018 -0600
+
+ Use direct conversion to svg for proper bounding box.
+
+commit 92d74369e228512b2270616f79562741856e0b85
+Merge: ea4fed15 25fab655
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Jun 30 15:42:20 2018 -0600
+
+ Merge branch 'qthup' of github.com:vectorgraphics/asymptote into qthup
+
+commit 25fab655437d0128451bae9506d15052fb9a2394
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Sat Jun 30 14:39:58 2018 -0600
+
+ Enable right clicking for ending curve.
+
+commit c911d8acd1eb4bb21c452838f3ee7249c80b0e63
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Sat Jun 30 13:53:16 2018 -0600
+
+ Fix Undo/Redo buttons not consistent.
+
+commit 11ba4c2c0bcd2938aea757afc10ea5056745f2e4
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Sat Jun 30 13:48:32 2018 -0600
+
+ Update mouse coordinate label unconditionally.
+
+commit f92a2da0266970f12e785e07f27a4add2f067850
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Sat Jun 30 13:45:06 2018 -0600
+
+ Hide anchor when not using custom anchor.
+
+commit ea4fed159acd44095bce42fc306e64550a42eac6
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Jun 30 12:30:59 2018 -0600
+
+ Remove obsolete code.
+
+commit bdb83475c13af0e41909f97af0389148757558b0
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Jun 30 09:46:40 2018 -0600
+
+ Rename _fout to _outpipe and move declaration to plain_shipout.asy.
+
+commit 2d49cb19dbbbd5cac38260a32c2df75cd4d2fd10
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Fri Jun 29 22:21:51 2018 -0600
+
+ Fix bezier edit not resetting.
+
+commit ede9f4906ed0c82e39833f9d57562c3c9c8b6d25
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Fri Jun 29 22:08:11 2018 -0600
+
+ Save file with asy coords.
+
+commit 79c2ce6d847f470760faa70fd5a2e211dcfd5033
+Merge: f0d35d4f 731251c7
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Fri Jun 29 21:57:28 2018 -0600
+
+ Merge branch 'qthup' of github.com:vectorgraphics/asymptote into qthup
+
+commit 731251c7301c1f65f4daa50e75e69aec75a150a1
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Jun 29 18:32:13 2018 -0600
+
+ Use ctrl-D to terminate xasy-to-asy communication.
+
+commit f0d35d4fbbf46572baf776b2667e7856c87c8d25
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Fri Jun 29 17:39:53 2018 -0600
+
+ Fix key count missing.
+
+commit 14a9a432836617d7282cd6f4aff7b7bb883d35dd
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Fri Jun 29 17:35:49 2018 -0600
+
+ Other QoL improvements.
+
+commit a8c22c228fdd82347c55a260b38a56ca97d26159
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Fri Jun 29 17:12:35 2018 -0600
+
+ Save file as asy coords instead of postscript.
+
+commit 21981780fa0e5237b1b92b7ec39ac8da8f8711ea
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Thu Jun 28 15:45:55 2018 -0600
+
+ Add option for editing settings.
+
+commit 00347340d591d11e386bf42eadc3496b5d5b2b53
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Thu Jun 28 15:06:10 2018 -0600
+
+ Add experimental antialiasing (may not work at all).
+
+commit 36df0f26c942fa3aa994541b6e6c0fdc2748eef0
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Thu Jun 28 14:33:37 2018 -0600
+
+ Add legacy xasy bezier mode.
+
+commit 905f58f2c64703371a72641d78465179671c919a
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Thu Jun 28 14:07:24 2018 -0600
+
+ Fix cairo dpi bug.
+
+commit f2601b75e126b6ee659b75cdd78f12d369d51b7a
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Thu Jun 28 13:53:02 2018 -0600
+
+ Make the default linewidth 0.5.
+
+commit de430749dfa385b81ad457ed8a3390dad28cf952
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Jun 28 12:46:35 2018 -0600
+
+ Avoid modifying input arrays in rationalSimplex.asy.
+
+commit 06aee1b86106f39835889a72a2248ab7c02d3cd7
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Jun 28 12:45:39 2018 -0600
+
+ Overload operator !=.
+
+commit 1e39a91779ea25645acb1f6fc20f2b1480e5c8e7
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Jun 28 11:22:33 2018 -0600
+
+ Avoid modifying input arrays.
+
+commit ee333cb2e837962b26305dc9e65e306e232c9d3f
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Wed Jun 27 17:30:26 2018 -0600
+
+ Add workaround for bounding box flip.
+
+commit 6e91ddbe19f4b01649b33dfb4a05c36e029f57a6
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Wed Jun 27 17:20:51 2018 -0600
+
+ Change clip detection to asy.
+
+commit 1dedb3885815058ee3067f6402529b6b93a4e0a7
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Jun 27 16:57:25 2018 -0600
+
+ Detect clip; invert images.
+
+commit 1b55335147fc4eebe9676c864c9e5e2937c57d67
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Wed Jun 27 16:28:25 2018 -0600
+
+ Enable DPI checking for magnification.
+
+commit bfbfafbc406d8e93166468f1058e57a8a7891086
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Wed Jun 27 13:14:17 2018 -0600
+
+ Add custom dpi support.
+
+commit b1d540c919da0ec7cb53616e22f84f3de723f997
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Wed Jun 27 12:43:26 2018 -0600
+
+ Add temporary workaround for svg noclip.
+
+commit 6c12f7777edb0a2064ae206ea37661461e96a0ec
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Wed Jun 27 02:08:51 2018 -0600
+
+ Remove debug messages.
+
+commit 999210c14c41ba6737ea31fa03a7c7e003940997
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Wed Jun 27 02:07:47 2018 -0600
+
+ Add svg support dependent on QtSvg.
+
+commit 19efab230370f14552d1d17930dd33373f59220d
+Merge: 96031ea2 50fb809f
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Jun 27 00:19:54 2018 -0600
+
+ Merge branch 'master' into qthup.
+
+commit 50fb809fdaf2383385f09884174262964a046156
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Jun 27 00:17:35 2018 -0600
+
+ Use system ghostscript library by default for dvisvgm.
+
+commit 96031ea2614dee2a470525ba87d921fbe0291056
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Jun 26 17:56:19 2018 -0600
+
+ Deconstruct to svg format.
+
+commit f07fc294bfcf278d72c4cbe14ee95b9c13e22768
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Tue Jun 26 15:23:09 2018 -0600
+
+ Add scrolling functionality.
+
+commit c27d0994645a395185aad3cdeb85579e830f45c0
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Tue Jun 26 13:50:31 2018 -0600
+
+ Terminate asy on exit.
+
+commit e1f540d4a86fc432b091cff538703a4e2d1eb180
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Mon Jun 25 17:37:55 2018 -0600
+
+ No longer uses asy for zoom.
+
+commit a13447f744ec9677e62e5ec09626ec84865068c8
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Mon Jun 25 16:49:42 2018 -0600
+
+ Fix Custom Anchor inconsistency.
+
+commit 91c0c648ea8e2384be530380836edd6a0fc563ae
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Mon Jun 25 14:37:10 2018 -0600
+
+ Add undo for object creation.
+
+commit 4fe6ebb5f7b263aa97358a11d9f24d5f0c6432ac
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Mon Jun 25 12:52:11 2018 -0600
+
+ Add Scale mode to bezier editing.
+
+commit 0c1a59da64db42d1d961210f9e464cab24ebd6b9
+Merge: 4b55a597 cf2e8c9d
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Mon Jun 25 12:12:57 2018 -0600
+
+ Merge branch 'qthup' of github.com:vectorgraphics/asymptote into qthup
+
+commit 4b55a597110461af90b9082a8e1a1caa1dd40b7b
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Mon Jun 25 12:12:54 2018 -0600
+
+ More QoL improvements for bezier editor.
+
+commit db447ef6ae109bd7c6f3f6b8c74d0513fec7969d
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Mon Jun 25 12:12:43 2018 -0600
+
+ Simplify string management.
+
+commit cf2e8c9df1b1665b48b85815028b8990d2cc97f3
+Merge: 5e612b5d b757219e
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Jun 25 11:19:56 2018 -0600
+
+ Merge branch 'qthup' of github.com:vectorgraphics/asymptote into qthup
+
+commit 5e612b5dc66928fa4c9f5152e3a47d3544ed1196
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Jun 25 11:19:51 2018 -0600
+
+ Remove unused prompt.
+
+commit b757219e235127134448516c47ad3104e86dc100
+Merge: f01a9f11 aa4ee7b7
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Mon Jun 25 11:03:26 2018 -0600
+
+ Merge branch 'qthup' of github.com:vectorgraphics/asymptote into qthup.
+
+commit f01a9f11564532c05d21ac131d4ada7bfff723e1
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Mon Jun 25 11:00:26 2018 -0600
+
+ Change spacing to one for each object.
+
+commit aa4ee7b78186e49b35a3a1ed0417f2695be88c1a
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Sat Jun 23 16:11:02 2018 -0600
+
+ Delete unneeded files.
+
+commit bf52e9ef5c6b2d2bfc34b7f4a3d86d9e4895a6b5
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Sat Jun 23 16:10:54 2018 -0600
+
+ Add early bezier editing mode button.
+
+commit 92c3d17e2a059014ddb13ce8ef50a626f396bfe7
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Sat Jun 23 16:10:25 2018 -0600
+
+ Add setup.py file.
+
+commit 068d75ce11365caf064cc5e2c8a76e7a3c7a15bf
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Sat Jun 23 15:24:24 2018 -0600
+
+ Edit some build files.
+
+commit 8f7217ac8df4d721127b6f7487874396f5843c6f
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Sat Jun 23 15:24:15 2018 -0600
+
+ Add icon files for easier editing.
+
+commit e70d99640450c984344c605a35dae157a58ed264
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Jun 23 01:33:36 2018 -0600
+
+ Remove bounding box in example until xasy support is implemented.
+
+commit 3abe5e672a6f9255f382a09b16ed1ee29769ccdd
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Jun 23 01:21:36 2018 -0600
+
+ Detect xasy with settings.xasy; reinstate bounding box in example.
+
+commit 401cf60f89dcddfb6993f7bd25a86b144ec5f3ad
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Jun 23 00:33:18 2018 -0600
+
+ Replace restricted simplex method with general simplex solver.
+
+commit 77c3c2bbc8496a1b53bf3b0e5af27501be05b50c
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Jun 22 16:48:33 2018 -0600
+
+ Fix xasy mode and keys.
+
+commit 0e31fa8c29737941d559bf4e42162212f5f85bb5
+Merge: 10d30131 60a35767
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Jun 22 15:04:58 2018 -0600
+
+ Merge branch 'master' into qthup.
+
+commit 5ff20563472ab9361826bea32cd4a2635a346550
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Jun 22 14:53:17 2018 -0600
+
+ Force make clean to remove GSL symbols.
+
+commit 10d30131851c3e8936f4c0fe62097d6dccaa3b64
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Fri Jun 22 13:59:59 2018 -0600
+
+ Allow for new key replacement.
+
+commit febc76cb94e3de54b8f3d01da29f6eb71bf76e25
+Merge: 8aeec7ce 69aaf4fc
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Jun 22 11:36:36 2018 -0600
+
+ Merge branch 'qthup' of github.com:vectorgraphics/asymptote into qthup
+
+commit 8aeec7ce7debb2469d2e21efd237123e9943c3b6
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Jun 22 11:09:14 2018 -0600
+
+ Implement interactive xasy mode.
+
+commit 728f50856129f4cdcc8f2d30b253aeee243ed6ac
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Jun 22 08:31:54 2018 -0600
+
+ Test new xasy mode.
+
+commit 69aaf4fca1d01254a43d78b9bed4755990c052a7
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Thu Jun 21 22:47:48 2018 -0600
+
+ Add more bezier editing features.
+
+commit a890ec75dd31b8aacc4adcea8f138fafe0b9d504
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Thu Jun 21 16:51:19 2018 -0600
+
+ Add control point editing.
+
+commit 7ce567731e2eab843ef2ea5789435d82dc65c69c
+Author: Supakorn <rassamee@ualberta.ca>
+Date: Thu Jun 21 16:26:57 2018 -0600
+
+ Allow saving of edited beziers.
+
+commit 60a35767c5becaf6f8a5fcd72584a9d3d316b028
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Jun 21 00:42:08 2018 -0600
+
+ Force dvips to respect EPS requirements.
+
+commit d36d513b7e060ad476208f2ab9552b4323c45a05
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed Jun 20 15:49:30 2018 -0600
+
+ Add early bezier editing.
+
+commit b2c25d8ae46ce3ccf9c5e9689dc682ec647780ab
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Jun 19 13:13:49 2018 -0600
+
+ Update keydata.
+
+commit c6b4d4b1ef81305d4973e3848673f2a77e476c4c
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Jun 19 11:20:11 2018 -0600
+
+ Add a flag to identify a user-specified key.
+
+commit 88de674b7daeb9efc3e59a1300e4cd3928f22ceb
+Merge: 3040e29d 74393725
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Jun 18 23:41:42 2018 -0600
+
+ Merge branch 'qthup' of github.com:vectorgraphics/asymptote into qthup
+
+commit 743937250a7c67dc414ddbd60ee8e2f59c62147d
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Jun 18 23:41:30 2018 -0600
+
+ Revert to using interactive mode for xasy.
+
+commit 0f044019bdc7c7947c6f58db9ba7d34703c49048
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Mon Jun 18 23:24:59 2018 -0600
+
+ Remove unnessecary icon residues.
+
+commit 3040e29d15c97e526faeba5bbbad00f1ec436c17
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon Jun 18 17:05:05 2018 -0600
+
+ Revert "Remove obsolete code."
+
+ This reverts commit 28e91cfec416a135e1a9ba5a32486507e59bf5ec.
+
+commit 97ab025569e6cc765d7c4f88a96e49f2628d2930
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Mon Jun 18 15:21:37 2018 -0600
+
+ Unify asymptote process.
+
+commit 5e2123d1358e2e34a3149d3d281365c2e43c8dec
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Mon Jun 18 13:37:01 2018 -0600
+
+ Add initial bezier curve detailed view.
+
+commit c049ce0c2f21c4c9eb86ffaa7bb5b6b163cbc0a8
+Merge: e4a169a5 9d0f460a
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Mon Jun 18 12:50:47 2018 -0600
+
+ Merge branch 'qthup' of github.com:vectorgraphics/asymptote into qthup
+
+commit e4a169a5a79b7e6499b61ecc852551246a38869e
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Mon Jun 18 12:45:44 2018 -0600
+
+ Fix moveMove.
+
+commit 9d0f460a251cbad4a2a5ebebf33ebc68633ffcac
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Jun 15 18:25:34 2018 -0600
+
+ Fix mouse interaction.
+
+commit 3f6584a1fe2f71c754f2e5b8f34f1f2db9b81f24
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Fri Jun 15 16:44:55 2018 -0600
+
+ Minor type hinting.
+
+commit 91410b0bb179411ca1245f3f82056f1b4e3eae0f
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Fri Jun 15 16:18:28 2018 -0600
+
+ Move export option to menu.
+
+commit 8be30f41855c222604a20e771b16d737e907c279
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Fri Jun 15 15:02:19 2018 -0600
+
+ Set fill to disable open buttons.
+
+commit 8369f1d2552ca0739444b071804c55d4930d497b
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Fri Jun 15 14:55:46 2018 -0600
+
+ Add More modes.
+
+commit 2feb57922220320c2167f42cb6194b6fb4daaea6
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Fri Jun 15 14:21:27 2018 -0600
+
+ Fix labels adding.
+
+commit fa522058317c2a685b4983dc243319c6a87b33a5
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Fri Jun 15 13:33:47 2018 -0600
+
+ Fix anchor not updating.
+
+commit 1fc16f12cabf5a3cec16a6899676b5fd1ead61f0
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu Jun 14 17:52:09 2018 -0600
+
+ Add custom anchor.
+
+commit bbfb89044d5e4b2e8d5d86e1bddac594e35e72ad
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu Jun 14 17:04:12 2018 -0600
+
+ Check for mouse down first.
+
+commit 6fb39b6dac1ea61f053d98273cf1dd11e984f74a
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu Jun 14 16:53:04 2018 -0600
+
+ Add hover delete.
+
+commit c106bffce3b1c034a251b6a53745b16ddb7bc431
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu Jun 14 16:46:27 2018 -0600
+
+ Add hover deletion.
+
+commit 2cffe89eaff1b30b797dac3e267b65c60cca94c8
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu Jun 14 16:34:51 2018 -0600
+
+ Even more xasy changes.
+
+commit ad33e4b69f848af0e4cbaaacfe81b9006a3fd5cb
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu Jun 14 15:44:47 2018 -0600
+
+ Recompute control points for all nodes.
+
+commit 01ac796f6a9ff2ae89622e3faa050c8bcb386549
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu Jun 14 14:04:53 2018 -0600
+
+ Other minor bug changes.
+
+commit eeba4902c2fc1425351d6a53bd129c67c616fb6c
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu Jun 14 13:39:15 2018 -0600
+
+ Add more anchor mode.
+
+commit 6df104d6060fe5400e9d7618462026f11767bbd8
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed Jun 13 18:13:56 2018 -0600
+
+ Add support for hard deletion undo.
+
+commit 100ac43d7b9d762e7c5f2b732f7fb47529e666b2
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed Jun 13 16:57:17 2018 -0600
+
+ Remove closed path option.
+
+commit 0c2b40391218e0923f145d50aacc834fd575fde5
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed Jun 13 16:45:00 2018 -0600
+
+ Add some bezier keymaps.
+
+commit d6c70960f272c439d6f8e2220e12756194878875
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed Jun 13 15:55:39 2018 -0600
+
+ Make code objects a little more informative.
+
+commit 86b8a207600a33d509002f6cae016e5551316e53
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed Jun 13 15:42:35 2018 -0600
+
+ Update Editor argument system.
+
+commit ddb1a2c604eacd69509685e228d4e487ffe48a4e
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed Jun 13 15:05:20 2018 -0600
+
+ Restore venn.
+
+commit c74ca307377f24073973137830bfbb064125ee67
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed Jun 13 15:05:00 2018 -0600
+
+ Put back shipout.
+
+commit 19e31f55e7f12bcee0b584d21d47e3e4b3e52243
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed Jun 13 15:04:22 2018 -0600
+
+ Change arguments to old xasy.
+
+commit c8d73f5f33c4c94ccee4397a876906c8eb1558cf
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed Jun 13 14:52:33 2018 -0600
+
+ Bind delete to delete object.
+
+commit b9f5e41419d978c5084870beed3efa21a2a9e09d
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed Jun 13 14:43:10 2018 -0600
+
+ Update .gitignore
+
+commit 9d59dca9b470251e336d63f6df7fa7a2d64603f9
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed Jun 13 14:42:26 2018 -0600
+
+ Revamp options system.
+
+commit c2827f039043d9077aed43d15604d451a0f79b81
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Tue Jun 12 22:51:09 2018 -0600
+
+ Change deletion mode.
+
+commit bd6d4cf68a80d4e335274b2caa32f7045f7591c0
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Jun 12 16:59:37 2018 -0600
+
+ Omit deleted objects on deconstruction.
+
+commit 8fcb2b769bf595380360ad7a3aebe1680da53ef1
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue Jun 12 15:37:58 2018 -0600
+
+ Ignore EINTR on read from pipe.
+
+commit 97f7d0ca87d4d2db1c522a59532cc2b0f7758630
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Mon Jun 11 18:16:23 2018 -0600
+
+ Optimize deletion and options.
+
+commit 5a7a08e173fff7a77727aa3236b323a5069c2af3
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Mon Jun 11 16:39:36 2018 -0600
+
+ Add CSON support and basic deletion.
+
+commit c639a6b9b0142e5bea61d087a9c22a7eb38bb335
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Jun 9 13:33:22 2018 -0600
+
+ Update three and slide modules.
+
+commit ae8f7b0bc3a001fb6dc8a72598f4342979117eb8
+Merge: 6cb432ef de2c27e0
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Jun 8 22:23:39 2018 -0600
+
+ Merge branch 'qthup' of github.com:vectorgraphics/asymptote into qthup
+
+commit 6cb432ef307bb52184196bc95a386f960a392aa5
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Jun 8 22:23:32 2018 -0600
+
+ Rename map to xmap.
+
+commit de2c27e042780e860e4848995241484b2c255602
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Fri Jun 8 22:15:53 2018 -0600
+
+ Allow for top-layer draw for selected objects.
+
+commit 55b9c779cf36d7757eb145f2028bb8c328a4ce1e
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Fri Jun 8 17:25:34 2018 -0600
+
+ Add map/xmap switching and key counter.
+
+commit f54e57e5b8a05da8ddfa1b5a8eb4aa1f939768f9
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Fri Jun 8 16:42:57 2018 -0600
+
+ Add mouse wheel selection modifying.
+
+commit 01db5e39b2969fb10142a3b9b9e90c1a9f8826d5
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Jun 8 15:15:10 2018 -0600
+
+ Add identity and zero transform constants.
+
+commit 9b065e65c5b42b9fb0aba00ff2874e92d2ae368f
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Jun 8 14:38:16 2018 -0600
+
+ Implement RGB(int,int,int) function.
+
+commit e3dc24a6810bf35c7a5ae1fb176961b873ed92fd
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Jun 7 21:42:37 2018 -0600
+
+ Renenable object deletion.
+
+commit 018e17a2e1caeec6552eefd94737b1e24715ee5f
+Merge: 7b06be2c 594473ef
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Jun 7 21:20:50 2018 -0600
+
+ Merge branch 'qthup' of github.com:vectorgraphics/asymptote into qthup.
+
+commit 7b06be2c7e0334081b5540e80e29248afa81cfd3
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu Jun 7 21:20:44 2018 -0600
+
+ Support bbox in xasy mode again.
+
+commit 594473ef65e616be969e0e212f7c24b201c9aec2
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu Jun 7 14:28:38 2018 -0600
+
+ Remove writing of identity transformations.
+
+commit dab676e5a6d8182e8958e8d705ce01f90d542d6f
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Jun 6 21:03:56 2018 -0600
+
+ Fix KEY order.
+
+commit b2197a0e1c094e16b7d06c5cd1492b5898af57ac
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Jun 6 19:16:34 2018 -0600
+
+ Remove unwanted spaces.
+
+commit 7cef83b715c5dca65178b6f64c717a066c45f981
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed Jun 6 16:25:50 2018 -0600
+
+ Cleanup code and add terminal option.
+
+commit 027cfb6ebdeeb4af66567a06d2490ce3ae506d27
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed Jun 6 15:42:35 2018 -0600
+
+ Change mapping behavior when save.
+
+commit 356ec304168863f178e37314cbcca272d8eb3f0e
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Jun 6 14:21:32 2018 -0600
+
+ Add default transform to map.
+
+commit 9f4c4c60239faa7da04fa177f5dd5e3ec97974a5
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Jun 6 14:04:12 2018 -0600
+
+ Draw xasy objects onto currentpicture in PostScript coordinates.
+
+commit 0645b41d5f88085b16f0ba1814e85dd60dce445c
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Jun 6 11:04:22 2018 -0600
+
+ Draw xasy objects on a separate frame.
+
+commit 8b006fb0b29c6a9da2ac0bc53c03fdd51223f634
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Tue Jun 5 17:14:43 2018 -0600
+
+ Add support for exporting files and other changes.
+
+commit 30bd410fad4be3b71ab26e4eddbc64f39b49773f
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Mon Jun 4 17:26:19 2018 -0600
+
+ Add early magnification support.
+
+commit 41613fa98512a44487c6b5ac687b88f3852e9102
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Mon Jun 4 13:44:57 2018 -0600
+
+ Fix selection issue.
+
+commit 3d1ca05ccaaf934a42df038e5b8c5ab098a299b8
+Merge: cf276195 93f367bb
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Mon Jun 4 13:32:05 2018 -0600
+
+ Merge branch 'qthup' of github.com:vectorgraphics/asymptote into qthup
+
+commit cf27619534b2f5eec07fda1ec58110ea2d8c11a9
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Mon Jun 4 13:31:04 2018 -0600
+
+ Move transforms to dict[list] model.
+
+commit 93f367bba491d01706e656821ccb748067ad2773
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Jun 3 20:32:07 2018 -0600
+
+ Finish passing KEY to transformed elements.
+
+commit 34ce667325ce323de441d0bea58b47c0f05751d2
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu May 31 19:31:45 2018 -0600
+
+ Show key in status bar message (for debug).
+
+commit 75397a5488c0ec3de9d9d24f75e8479b91cc3a14
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu May 31 19:28:01 2018 -0600
+
+ Groups objects with the same key.
+
+commit 761e3f3275da938a83c7c2ff4c6cd164dd47b134
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu May 31 17:50:19 2018 -0600
+
+ Begin passing KEY to transformed elements.
+
+commit 221fda26e204542d88a2df73f4392adbaec29f54
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu May 31 16:49:38 2018 -0600
+
+ Fix tuple loading of xasy2asy.
+
+commit 771bd937375c8a6888873c0acb68b337bea744f9
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu May 31 14:44:31 2018 -0600
+
+ Add more functionality for toggle visibility, code adding.
+
+commit 308fceb60033262814b6fa843a46f3580f2a4d02
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed May 30 17:27:51 2018 -0600
+
+ Add functionality for delete, change order.
+
+commit 0a05fccf9e9035568247d3e628d373d9b245ccc0
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed May 30 16:45:42 2018 -0600
+
+ Update add bezier mode and file loading.
+
+commit 0b08348102fd6be4c4a2b62945b17c46aeb5f978
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue May 29 13:13:07 2018 -0600
+
+ Add key support on asy side.
+
+commit aed03a1f8db344aa133b3abd7a7d6a386e6f31f3
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Tue May 29 11:17:10 2018 -0600
+
+ Add more bezier options.
+
+commit d10a4f89efc4c3a7cf2552425a19cb62a1861491
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Mon May 28 16:00:55 2018 -0600
+
+ Add in-place bezier curve interface.
+
+commit 90f82d4a91d7eabf3e13bd034a95df14cfd85fa9
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Mon May 28 15:32:19 2018 -0600
+
+ Update .gitignore.
+
+commit 99155d3edc967ce06cfbd7c6c8d892502b2eee82
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Mon May 28 12:52:57 2018 -0600
+
+ Add filling to circles and polygons.
+
+commit d04cac4bf67abb52bde752204d76cecec1f3a422
+Merge: c489474d 560f683d
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Fri May 25 18:52:52 2018 -0600
+
+ Merge branch 'qthup' of github.com:vectorgraphics/asymptote into qthup
+
+commit c489474da753207bad06b414df2a36d41efa62c3
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Fri May 25 18:52:39 2018 -0600
+
+ Modify xasyFillShape for qt.
+
+commit 560f683d7d089a25ea21bb9b240f7cb34650d878
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri May 25 17:12:47 2018 -0600
+
+ Remove obsolete code.
+
+commit 17c40ba170f7c359fd6ae3943b6d2a17b4baffd6
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Fri May 25 14:44:52 2018 -0600
+
+ Fix add shape transform bug.
+
+commit ac69fc4d0deab73dbfeef21fb88a6e0007b2fec1
+Merge: baf37589 f01b1baf
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri May 25 14:24:58 2018 -0600
+
+ Merge branch 'master' into qthup.
+
+commit f01b1baf546ed20bf49e5fd56aac4b43b4a1a5e7
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri May 25 14:24:19 2018 -0600
+
+ Fix quiet flag.
+
+commit baf37589eed095c896099e7cd51e4dfdc1c916a2
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri May 25 04:27:17 2018 -0600
+
+ Fix outpipe communication by turning off quiet mode.
+
+commit 4deafa3b4a9368d2a8463917eb009bd29b5d5658
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu May 24 18:09:46 2018 -0600
+
+ Handshake via pipe.
+
+commit 5016356832b2b5939bd45711ae48b95113f27489
+Author: John Bowman <bowman@ualberta.ca>
+Date: Thu May 24 16:58:31 2018 -0600
+
+ Clean up initial hand shake.
+
+commit f78ac62b79949992271c7f893f559ce4b7b77f39
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu May 24 15:38:44 2018 -0600
+
+ Change drawing backend to use ordered lists.
+
+commit 4f947b99fe88f5e0fc2fed4b42d73a5f914c2a7e
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed May 23 15:06:54 2018 -0600
+
+ Manually add back labelEditor changes.
+
+commit 0bd402f7ffc30fc1f3dd4979965ced0b36c29499
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed May 23 14:22:59 2018 -0600
+
+ Manually merge back xasy2asy.py.
+
+commit 5caafee6c63ee66473663038ed2bea655dc304b3
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed May 23 14:02:22 2018 -0600
+
+ Add back xasyUtils.py.
+
+commit fe3482ec33738e7f6d89fda409082d05f6b585cc
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed May 23 12:58:33 2018 -0600
+
+ Get xasy to wait for asy to start.
+
+commit 82cb3f48c6ed3c81af5d62e870adbc6cda27e9d5
+Merge: fb2bd13e 4425e5c5
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed May 23 11:22:07 2018 -0600
+
+ Merge branch 'master' into qthup.
+
+commit fb2bd13e326e9a040bc578b533a36f23b64ed33c
+Author: John Bowman <bowman@ualberta.ca>
+Date: Mon May 21 15:09:11 2018 -0600
+
+ Remove obsolete code.
+
+commit 2d72f98a9316dc49cd55737e8a9b23fc91d5736d
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun May 20 22:27:42 2018 -0600
+
+ Implement xasyKEY for 3D objects.
+
+commit b137bfb6c542ecc1d0341475511e02b8a67849ff
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun May 20 22:17:09 2018 -0600
+
+ Fix key generation.
+
+commit b3e1dc3c0d5fe2bd19936fe1f25e815c0203d2ba
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun May 20 10:57:05 2018 -0600
+
+ Simplify code.
+
+commit 4425e5c5aca12f87fc3f90151913733f8b771834
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat May 19 23:44:45 2018 -0600
+
+ Transition from rpc to tirpc library.
+
+commit 1c46c6547e63006cfaa49ad9b70846a12b44ea8e
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat May 19 11:36:12 2018 -0600
+
+ Inhibit exit on pipe EOF only when inpipe is specified (for xasy).
+
+commit 28e91cfec416a135e1a9ba5a32486507e59bf5ec
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat May 19 11:26:34 2018 -0600
+
+ Remove obsolete code.
+
+commit a0b453d97991205a8b9a78b0f44b2aa9c10c63b8
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat May 19 06:00:26 2018 -0600
+
+ Simplify code.
+
+commit 697537dee813ce9523382e4b44a6941b7d55f091
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat May 19 05:57:49 2018 -0600
+
+ Use SIGHUP to signal EOF.
+
+commit 8c982663371957021be663d6796bbf0db52317c0
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri May 18 23:48:49 2018 -0600
+
+ Use a direct pipe read for xasy instead of interactive mode.
+
+commit 6082601320a25abd0a9976550707b9eaf67cf9c6
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Fri May 18 13:48:29 2018 -0600
+
+ Preserve pan translation in resize.
+
+commit df4c903e109a9ef2a812605526bb93d118921f03
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Fri May 18 12:30:34 2018 -0600
+
+ Allow for flexible resizing.
+
+commit a05bdea1a260b0fe86c46e55731ed561d7f6eaae
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu May 17 19:27:54 2018 -0600
+
+ Fix a critical output dir bug.
+
+commit ff19d78558783ec53ac2ba2aaacd0d3916866dbc
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu May 17 17:19:33 2018 -0600
+
+ Add early label editor preview.
+
+commit 442a81ca4147a98535507b097e38bc587bb34ce4
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu May 17 12:46:59 2018 -0600
+
+ Migrate asymptote process engine to a contained class.
+
+commit 6a6bb0e1126dd02ac45603a75db1f642570d7c48
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu May 17 12:18:01 2018 -0600
+
+ Add early translation foundation.
+
+commit 0971e4dd2d12705bf92adff52e326246fa65a4cf
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed May 16 15:27:07 2018 -0600
+
+ Fix align mode in label widget.
+
+commit f698e26621b500d06d46731dc8c9865b06a247c2
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed May 16 14:50:17 2018 -0600
+
+ Add advanced label editor.
+
+commit d03660d2fbcff4dc1ed48b99ea1353db2c3e1db3
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Tue May 15 17:34:23 2018 -0600
+
+ Optimize string concatenation to use mutable string.
+
+commit 46b7b040f0a0d00f99da26718f7d3cc797826e05
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Tue May 15 16:09:59 2018 -0600
+
+ Add early label adding.
+
+commit d0860eb41adf13170079ae0f60da21f9f0ea58e4
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Tue May 15 14:34:03 2018 -0600
+
+ Add test label support.
+
+commit 14e8314dd7425874f36780e4109626cec2589b72
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Mon May 14 18:56:13 2018 -0600
+
+ Early migration to key-based transform (incomplete).
+
+commit cb034388031e39a6e7aeb07f31fb8744a5406b74
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Fri May 11 16:15:10 2018 -0600
+
+ Add argument support.
+
+commit 37f670816e7fc8ba23ea041d7ce18ebf16d35d8f
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri May 11 14:43:37 2018 -0600
+
+ Disable startScript and endScript.
+
+commit 436b50fe3b73a5191f0679a9666d899da35697d2
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri May 11 14:41:26 2018 -0600
+
+ Revert test code.
+
+commit 4acdd9ab9a524ec148c7fa8d75edf3652f354de4
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Fri May 11 13:51:41 2018 -0600
+
+ Update .gitignore.
+
+commit 05287cec1a12e77fd35a58a7dc534798add32735
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Fri May 11 13:51:06 2018 -0600
+
+ Remove asydev.
+
+commit 872ceac1642c01f3fe9370170bdaee654c1113cc
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Fri May 11 13:50:15 2018 -0600
+
+ Update .gitignore.
+
+commit de30993530af475d8fde3484d5bbe4f7c1dce339
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri May 11 13:42:44 2018 -0600
+
+ Remove unwanted file.
+
+commit 198d8589a70618071340969ae76d0c2c9534ea12
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri May 11 00:38:26 2018 -0600
+
+ Simplify code; move global variables to processDataStruct.
+
+commit f718e5eaaeca1a0938068b0dcfc97af2bc5cc912
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu May 10 16:52:51 2018 -0600
+
+ Adding some testing flags.
+
+commit fae1d6192b61f3c5a2e5dca553d5b45dd240e030
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu May 10 16:03:15 2018 -0600
+
+ Add preliminary trasnform migration to key.
+
+commit f0d593d9953ee3fa69f3fee6a2336a56a5cd02e9
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu May 10 15:21:01 2018 -0600
+
+ Add basic key recognition.
+
+commit 9ebbcfaa7cc3f57d18432ef11c6746569f057754
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed May 9 19:19:01 2018 -0600
+
+ Write KEY to outpipe.
+
+commit db66c57b242c83541abea7eb0201f87d13a648dc
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed May 9 17:34:09 2018 -0600
+
+ Add preliminary key support (Still a hot mess...)
+
+commit c46f5b3886e0285a5eb535ffa2d3ebf44644dd89
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed May 9 14:44:05 2018 -0600
+
+ Add virtual KEY argument to all functions for xasy.
+
+commit 0103b665ebdca12c348886c18eafd751fe6901b4
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Mon May 7 16:35:13 2018 -0600
+
+ More Quality of life improvements for color dialog.
+
+commit 345ba41986af818577cf60dc61e8aeb26a35bc1b
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Mon May 7 15:30:11 2018 -0600
+
+ Update gitignore.
+
+commit 67cbfd41508f79b79a91f2fca693e1ec5cdd95e0
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Mon May 7 15:19:20 2018 -0600
+
+ Add pen support.
+
+commit ab412a711d8836fb47399fd4380665288502de8f
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Mon May 7 14:52:21 2018 -0600
+
+ Add color support.
+
+commit b52cf9dc210c9d48fd1d20182d667a11dc013c47
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Mon May 7 13:26:33 2018 -0600
+
+ Fix inscribed polygon mode.
+
+commit d86e0ad3ec666f2d0516b97d72c0b5e7710dd3ca
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Fri May 4 18:24:35 2018 -0600
+
+ Add preliminary options for Polygon adding.
+
+commit 234483ccc8a13b8d318b7d09c3e38dfe353f696f
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Fri May 4 15:27:08 2018 -0600
+
+ Update UI for more options.
+
+commit 82cdb14e492e428b3e83c3aa489a448f31a8a746
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Fri May 4 14:56:44 2018 -0600
+
+ Add in-place preliminary polygon adding.
+
+commit 51bd11364219e7503622704ae297e3f7f0643cac
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu May 3 16:39:23 2018 -0600
+
+ Add interface for polygon adding.
+
+commit 3b1f8f08d7404b2143015468b0b0bcdd51bae93b
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu May 3 15:38:11 2018 -0600
+
+ Add preliminary in-screen object creation.
+
+commit 003d2fa4b41bb1c12c9de1503083267395d4ff5e
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed May 2 16:25:43 2018 -0600
+
+ Add exscribed (right word?) polygon handling
+
+commit 27470ffb04cc5b446e906e327dab976713c94309
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed May 2 15:43:09 2018 -0600
+
+ Add support for primtive polygons.
+
+commit 34a182db3e5f611f794319ef6c2485594f3487a6
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed May 2 15:10:29 2018 -0600
+
+ Add adding circles.
+
+commit 8258bb93752a2d888e583f307d13bb4ef727aee6
+Merge: 7c18f2ea d09e7fce
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed May 2 08:28:05 2018 -0600
+
+ Merge pull request #70 from rgxgr/patch-1
+
+ Correct words order to avoid confusing
+
+commit d09e7fce20722e2e7d65692b915c4cef9a33bb2c
+Author: rgxgr <33611071+rgxgr@users.noreply.github.com>
+Date: Wed May 2 20:08:14 2018 +0800
+
+ Correct words order to avoid confusing
+
+commit 7f758672b3c9d39707379d030f9d8c7bc33a48cc
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Tue May 1 17:09:33 2018 -0600
+
+ Merge settings management into original Shardt code.
+
+commit b9754484ce5ef55fb9415731512362615a431778
+Merge: 75b22704 7c18f2ea
+Author: John Bowman <bowman@ualberta.ca>
+Date: Tue May 1 12:03:43 2018 -0600
+
+ Merge branch 'master' into qt.
+
+commit 7c18f2ea15c289fbdd6e4f91c69110f5a0c159b8
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Apr 28 12:08:11 2018 -0600
+
+ Rename i386 to i386_32 to give preference to 64-bit binary.
+
+commit 9079934b3424157942736bbe1a15afd1dbf5836c
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Apr 28 11:39:48 2018 -0600
+
+ Do not modify system path.
+
+commit 799bf2dfc67869606056633c3a8ce4313b45d058
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Apr 28 11:10:47 2018 -0600
+
+ Revert "Workaround NSIS EnvVarUpdate bug that truncates long paths."
+
+ This reverts commit 8e932eb10a822d4e927b3b9dbecb313e135ee267.
+
+commit 8e932eb10a822d4e927b3b9dbecb313e135ee267
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Apr 27 16:22:08 2018 -0600
+
+ Workaround NSIS EnvVarUpdate bug that truncates long paths.
+
+commit 21e497260a55dbe4e4b111198aa26115564669ce
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Apr 14 08:31:47 2018 -0600
+
+ Fix sort.
+
+commit 2bfec3147f4308fa6e206ec624574e3156f43fd2
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Apr 13 10:11:31 2018 -0600
+
+ Add option to use unstable sort in favour of less(T i, T j) ordering.
+
+commit 20ff31c0444c901c2b0486127f3c4df2b9832df8
+Merge: 1a50ee63 2fd03c66
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Apr 11 17:51:11 2018 -0600
+
+ Merge branch 'master' of github.com:vectorgraphics/asymptote
+
+commit 1a50ee634cb58dbb4d9395ba90d7a795e63512d1
+Author: John Bowman <bowman@ualberta.ca>
+Date: Wed Apr 11 17:49:52 2018 -0600
+
+ Update README
+
+commit 2fd03c6695627387db19f993ac93e926b9b63eb7
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Apr 8 12:26:42 2018 -0600
+
+ Fix uninitialized counter.
+
+commit 4d0771442074af020b7fc929e929629e0bcbbdee
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Apr 7 23:51:06 2018 -0600
+
+ Increment version to 2.45.
+
commit 878f944b9ee540c77c83f2cc61d6a97c22298553
Author: John Bowman <bowman@ualberta.ca>
Date: Sat Apr 7 20:56:45 2018 -0600
@@ -334,6 +2503,48 @@ Date: Thu Jan 4 22:30:21 2018 -0700
Update CYGWIN port for 64-bit build.
+commit 75b227048bf39a8f2bd9288d1a4e076119d0e612
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Thu Jan 4 15:07:17 2018 -0700
+
+ Add Polar Grid Form.
+
+commit 77ba04a37dd8affd267a267df256326fb42f6f1b
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Tue Jan 2 15:03:01 2018 -0700
+
+ Add basic guide drawing system.
+
+commit 109a43611f3e2f9da5f5dae5502d8a5b8b299a6a
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Fri Dec 29 21:10:25 2017 -0700
+
+ Add basic grid snapping.
+
+commit aefccb8c568f772feb2bc59f009da9da3e8a3ff3
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Fri Dec 29 16:13:31 2017 -0700
+
+ Add basic grid toggling
+
+commit 0fa0e5ca0c3709c3d3e0722c35ae45a412ea10d4
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed Dec 27 16:53:51 2017 -0700
+
+ Add basic grid rendering.
+
+commit 6f6b6b1f7ef8393096a57c8c0b370275c11b2270
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Wed Dec 27 15:22:28 2017 -0700
+
+ Update deletion of Bezier points.
+
+commit 187e6113e92669d0cb724971694eaa8d7768178e
+Author: Supakorn Rassameemasmuang <rassamee@ualberta.ca>
+Date: Fri Dec 22 21:44:13 2017 -0700
+
+ Fix rotationBug - xasy2 now checks if custom anchor is defined or not.
+
commit 005aef0a8c45c8625910363e1159fedcd9fa31b6
Author: John Bowman <bowman@ualberta.ca>
Date: Mon Dec 18 14:51:43 2017 -0700
@@ -450,18 +2661,267 @@ Date: Fri Sep 22 15:20:17 2017 -0600
Implement findall.
+commit 1d87c4b421c6e1950280eb26681ad229fe98313c
+Author: Supakorn Rassameemasmuang <mistersupakorn@gmail.com>
+Date: Mon Sep 4 16:23:21 2017 -0600
+
+ Add preliminary keymap & settings support.
+
+commit 8e8a2349800a1d245779e023ecc5ede7da38b239
+Merge: c4aa7ded e9584ed2
+Author: Supakorn Rassameemasmuang <mistersupakorn@gmail.com>
+Date: Fri Sep 1 15:28:23 2017 -0600
+
+ Merge branch 'qt' of github.com:vectorgraphics/asymptote into qt
+
+commit c4aa7dedffc4a7782a75416c787dc7f607a308ea
+Author: Supakorn Rassameemasmuang <mistersupakorn@gmail.com>
+Date: Fri Sep 1 15:28:18 2017 -0600
+
+ Fix Beizer -> Bezier spelling
+
+commit e9584ed2fbaa6ba2bbf98fe78166c4e91a139da4
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Sep 1 15:27:42 2017 -0600
+
+ Update Makefile.
+
+commit e76d689c599a22a4441ae7111164bae7ac8f4f60
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Sep 1 15:27:11 2017 -0600
+
+ Update GUI.
+
+commit c5e57f4d961d136c4b547ea63026795790bd125e
+Merge: 355f99d4 15fe0eb7
+Author: Supakorn Rassameemasmuang <mistersupakorn@gmail.com>
+Date: Fri Sep 1 15:26:49 2017 -0600
+
+ Merge branch 'qt' of github.com:vectorgraphics/asymptote into qt
+
+commit 355f99d469f725e0086313bb27ab66b66d4d48cd
+Author: Supakorn Rassameemasmuang <mistersupakorn@gmail.com>
+Date: Fri Sep 1 15:26:43 2017 -0600
+
+ Fix merge conflict.
+
+commit 15fe0eb716b5f0d92ab8fe7063ca55124a623260
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Sep 1 15:16:29 2017 -0600
+
+ Update.
+
+commit 65e540f590ae0a9b552d31fec8eef5980e0f59c9
+Merge: 7be28a23 093568e2
+Author: Supakorn Rassameemasmuang <mistersupakorn@gmail.com>
+Date: Fri Sep 1 15:09:10 2017 -0600
+
+ Fix merge conflict.
+
+commit 7be28a23c991a0356792adf6304a5e58e0d8f492
+Author: Supakorn Rassameemasmuang <mistersupakorn@gmail.com>
+Date: Fri Sep 1 15:06:29 2017 -0600
+
+ Add Point Editor.
+
+commit 093568e25e61c860b896497264b19ea4f078c0ac
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Sep 1 15:04:39 2017 -0600
+
+ Fix spelling.
+
+commit fa2c10cf89b3b2564ee53bc48d46dd6919ba6105
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Sep 1 14:33:27 2017 -0600
+
+ Remove obsolete file.
+
+commit 7404f0bca98908521bccdfe9fe5fc84582869deb
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Sep 1 14:31:47 2017 -0600
+
+ Add ui entry.
+
+commit 0ea7b7aca30f5f0b2e0c17bac97093c797ff3397
+Author: Supakorn Rassameemasmuang <mistersupakorn@gmail.com>
+Date: Tue Aug 29 13:00:50 2017 -0600
+
+ Add Beizer Curve Editor.
+
+commit 8fde617cc64cdfe44f61e6cc5ef6197ef2cc633c
+Merge: d664d887 f1092a70
+Author: Supakorn Rassameemasmuang <mistersupakorn@gmail.com>
+Date: Tue Aug 29 13:00:01 2017 -0600
+
+ Merge remote-tracking branch 'origin/qt' into qt
+
+commit d664d887042bdbf4fd0a38d34834c6d4282acfd3
+Author: Supakorn Rassameemasmuang <mistersupakorn@gmail.com>
+Date: Tue Aug 29 12:59:42 2017 -0600
+
+ Add undo/redo stack.
+
+commit f1092a70a211994ddf6bafe488427628e71341a0
+Merge: 1ed21e9e 1eafa765
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Aug 26 23:39:00 2017 -0600
+
+ Merge branch 'qt' of github.com:vectorgraphics/asymptote into qt
+
+commit 1ed21e9e55effe8fb917d4a3c9903f07cdd6e228
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sat Aug 26 23:38:43 2017 -0600
+
+ Add pyUIClass support to Makefile.
+
+commit 1eafa765e69ddb869237532ec7e9e828b30993c6
+Author: Supakorn Rassameemasmuang <mistersupakorn@gmail.com>
+Date: Sat Aug 26 23:14:43 2017 -0600
+
+ Add Custom Anchor dialog.
+
+commit d4e29b99c50c481bd67a46de08da95598730c72f
+Author: Supakorn Rassameemasmuang <mistersupakorn@gmail.com>
+Date: Sat Aug 26 23:13:24 2017 -0600
+
+ Add panning, added screen transformation layer, custom commands
+ input dialog.
+
+commit ade0b6c36cbca1bce9bfc51edefc7657e46d31c6
+Author: Supakorn Rassameemasmuang <mistersupakorn@gmail.com>
+Date: Fri Aug 25 12:58:54 2017 -0600
+
+ De-Asyfy transformation, fix local coordinates (temporary),
+ updated matrix dialog.
+
+commit 477fdd587d86bb57d8a8080a5a89401f80e6e128
+Author: Supakorn Rassameemasmuang <mistersupakorn@gmail.com>
+Date: Wed Aug 23 14:16:58 2017 -0600
+
+ Add icon resource files, Matrix Transform Dialog.
+
+commit c460dce5689f9c992e0a80b150b2c67238a39c2e
+Author: Supakorn Rassameemasmuang <mistersupakorn@gmail.com>
+Date: Tue Aug 22 17:10:59 2017 -0600
+
+ Add quick rendering, toggling of grids, more tooltips.
+
+commit 64d74954ef499b36329c5fb958dab4a38c932b52
+Author: Supakorn Rassameemasmuang <mistersupakorn@gmail.com>
+Date: Tue Aug 22 15:54:52 2017 -0600
+
+ Add custom Transformation.
+
+commit 2f9674524c1d2231b58252b4daafd14aee478b27
+Author: Supakorn Rassameemasmuang <mistersupakorn@gmail.com>
+Date: Mon Aug 21 16:45:27 2017 -0600
+
+ Fix translation & Update README.
+
+commit fd330a08614549c1497bd969f230837abcec8d7e
+Author: Supakorn Rassameemasmuang <mistersupakorn@gmail.com>
+Date: Mon Aug 21 16:40:56 2017 -0600
+
+ Transition to final UI, add basic translation, scaling, rotation.
+
+commit ab2c346a05cd13fcc6e5c36ec2e9b0a100779e23
+Author: Supakorn Rassameemasmuang <mistersupakorn@gmail.com>
+Date: Sat Aug 19 16:40:07 2017 -0600
+
+ Move to new, Final User interface.
+
+commit efc9a0013f20fcc39872bbf42b8b1cbdbec91d35
+Author: Supakorn Rassameemasmuang <mistersupakorn@gmail.com>
+Date: Sat Aug 19 15:32:34 2017 -0600
+
+ Temporarily remove preCanvasPixmap (as mainCanvas
+ transparency is not wokring for some reason), add grid outline.
+
+commit 8988458f8d4f14bfb7b5e85074e7dd18d90fdc31
+Author: Supakorn Rassameemasmuang <mistersupakorn@gmail.com>
+Date: Fri Aug 18 21:32:58 2017 -0600
+
+ Add mouse detection, drag translation & deferred buffers.
+
commit f7231be3e560fa40f43e298e4b69b5c03ca0a141
Author: John Bowman <bowman@ualberta.ca>
Date: Fri Aug 18 14:31:44 2017 -0600
Remove redundant vbox.
+commit 7c5ba009606fe64da1757bdfebed51f0776a9941
+Author: Supakorn Rassameemasmuang <mistersupakorn@gmail.com>
+Date: Wed Aug 16 15:42:29 2017 -0600
+
+ Change PIL to QImage.
+
+commit b69b6093485c4b42f03c26134099f54f02b497f8
+Author: Supakorn Rassameemasmuang <mistersupakorn@gmail.com>
+Date: Tue Aug 15 14:42:19 2017 -0600
+
+ Rename xasyQt to xasy and original xasy to xasyTk.
+
+commit 52b8a33a6129219acb608abcc36248f27596965e
+Merge: fd134d02 67fe29eb
+Author: Supakorn Rassameemasmuang <mistersupakorn@gmail.com>
+Date: Tue Aug 15 14:40:50 2017 -0600
+
+ Merge branch 'qt' of github.com:vectorgraphics/asymptote into qt
+
+commit fd134d02224c30893fc99a993643b641a6025999
+Author: Supakorn Rassameemasmuang <mistersupakorn@gmail.com>
+Date: Tue Aug 15 14:40:44 2017 -0600
+
+ added final ui draft
+
+commit 27beaff43db806d9169f27ad0e10dd41f2a61299
+Author: Supakorn Rassameemasmuang <mistersupakorn@gmail.com>
+Date: Mon Aug 14 01:00:36 2017 -0600
+
+ Add generalized Affine Transform.
+
+commit 67fe29eb902d87a6f34b6fbdd01c2a302a6b028c
+Author: John Bowman <bowman@ualberta.ca>
+Date: Sun Aug 13 21:51:17 2017 -0600
+
+ Fix xasyQt.
+
+commit c66360fc91837ac6b226ccef33c5bb95bff31bc3
+Author: Supakorn Rassameemasmuang <mistersupakorn@gmail.com>
+Date: Sun Aug 13 16:31:59 2017 -0600
+
+ Refractor to have the raw image flipped (for native asy coordinates).
+
+commit ad49f711ce684ef85b260cb02c0f51b0558e55ec
+Author: Supakorn Rassameemasmuang <mistersupakorn@gmail.com>
+Date: Sun Aug 13 15:56:30 2017 -0600
+
+ Add rotation and translation.
+
+commit 81434d3f20caec72ebad1ac758958c3ca2d13481
+Author: Supakorn Rassameemasmuang <mistersupakorn@gmail.com>
+Date: Wed Aug 9 00:11:55 2017 -0600
+
+ Update .gitignore and move generated files to a separate folder
+
+commit 03617244274132af1cad89cf8c3b1617cd2d1f91
+Author: Supakorn Rassameemasmuang <mistersupakorn@gmail.com>
+Date: Tue Aug 8 16:06:18 2017 -0600
+
+ Add initial qt xasy.
+
commit 84f4ea3ff0a564698282af8eeb1afae14907e2fe
Author: John Bowman <bowman@ualberta.ca>
Date: Fri Aug 4 15:33:03 2017 -0600
Improve equation support in module slide.
+commit da7e0f8adee99fadb59623bc3065acae4c523e9b
+Author: John Bowman <bowman@ualberta.ca>
+Date: Fri Aug 4 16:25:15 2017 -0600
+
+ Test of Qt5.
+
commit 1b9692fae4a4f7bd58ea09f37178f7ed598f277d
Author: John Bowman <bowman@ualberta.ca>
Date: Tue Jun 13 15:40:12 2017 -0600
diff --git a/Build/source/utils/asymptote/GUI/CubicBezier.py b/Build/source/utils/asymptote/GUI/CubicBezier.py
deleted file mode 100755
index 2eb62577b0a..00000000000
--- a/Build/source/utils/asymptote/GUI/CubicBezier.py
+++ /dev/null
@@ -1,104 +0,0 @@
-#!/usr/bin/env python
-###########################################################################
-#
-# Convert a Bezier curve to a polyline
-#
-# Once Tk supports "RawCurves" this will not be needed.
-#
-#
-# Author: Orest Shardt
-# Created: June 29, 2007
-#
-###########################################################################
-import math
-
-def norm(vector):
- """Return the norm of a vector"""
- return math.sqrt(vector[0]**2+vector[1]**2)
-
-def splitLine(end0,end1,t):
- """Split a line at the distance t, with t in (0,1)"""
- return (end0[0]+t*(end1[0]-end0[0]),end0[1]+t*(end1[1]-end0[1]))
-
-def splitBezier(node0,control0,control1,node1,t):
- """Find the nodes and control points for the segments of a Bezier curve split at t"""
- a = splitLine(node0,control0,t)
- b = splitLine(control0,control1,t)
- c = splitLine(control1,node1,t)
- d = splitLine(a,b,t)
- e = splitLine(b,c,t)
- f = splitLine(d,e,t)#this is the point on the curve at t
- return ([node0,a,d,f],[f,e,c,node1])
-
-def BezierWidth(node0,control0,control1,node1):
- """Compute the distance of the control points from the node-node axis"""
- deltax = node1[0] - node0[0]
- deltay = node1[1] - node0[1]
- length = norm((deltax,deltay))
- if length == 0:
- y1 = control0[1]-node0[1]
- y2 = control1[1]-node0[1]
- else:
- cosine = deltax/length
- sine = deltay/length
- y1 = cosine*(control0[1]-node0[1])-sine*(control0[0]-node0[0])
- y2 = cosine*(control1[1]-node0[1])-sine*(control1[0]-node0[0])
- if y1*y2 >= 0:
- #same sign
- return max(abs(y1),abs(y2))
- else:
- #opposite sign
- return abs(y1)+abs(y2)
-
-#If the above algorithm fails, this one will work, but it is far from elegant
-#def computeIntermediates(steps,node0,control0,control1,node1):
- #pointList = []
- #for a in range(0,100,100/steps)+[100]:
- #t = a/100.0
- #t1 = 1-t
- #x = node0[0]*t1**3+3*control0[0]*t*t1**2+3*control1[0]*t**2*t1+node1[0]*t**3
- #y = node0[1]*t1**3+3*control0[1]*t*t1**2+3*control1[1]*t**2*t1+node1[1]*t**3
- #pointList.append((x,y))
- #return pointList
-#def makeBezier(steps,node0,control0,control1,node1):
- #if len(node0)!=2 or len(control0)!=2 or len(control1)!=2 or len(node1)!=2:
- #return -1
- #else:
- #return [node0]+computeIntermediates(steps,node0,control0,control1,node1)+[node1]
-
-def makeBezierIntermediates(node0,control0,control1,node1,epsilon):
- """Find the points, excluding node0, to be used as the line segment endpoints"""
- if(BezierWidth(node0,control0,control1,node1) <= epsilon):
- return [node1]
- else:
- splitUp = splitBezier(node0,control0,control1,node1,0.5)
- return makeBezierIntermediates(*splitUp[0]+[epsilon])+makeBezierIntermediates(*splitUp[1]+[epsilon])
-
-def makeBezier(node0,control0,control1,node1,epsilon=1):
- """Return the vertices to be used in the polyline representation of a Bezier curve"""
- return [node0]+makeBezierIntermediates(node0,control0,control1,node1,epsilon)
-
-if __name__ == '__main__':
- pointList = makeBezier((-80,0),(-150,40),(150,120),(80,0),0.5)
- from timeit import Timer
- t = Timer('makeBezier((-80,0),(-40,-40),(40,120),(80,0),1)','from __main__ import makeBezier')
- print (pointList)
- print (len(pointList))
- iterations = 1000
- time = t.timeit(iterations)
- print ("{:d} iterations took {:f} seconds ({:f} ms for each).".format(iterations,time,1000.0*time/iterations))
- points = []
- for point in pointList:
- points.append(point[0])
- points.append(-point[1])
- if sys.version_info >= (3, 0):
- from tkinter import *
- else:
- from Tkinter import *
- root = Tk()
- canv = Canvas(root,scrollregion=(-100,-100,100,100))
- canv.pack()
- canv.create_line(points)
- for point in pointList:
- canv.create_oval(point[0],-point[1],point[0],-point[1],fill='red',outline='red')
- root.mainloop()
diff --git a/Build/source/utils/asymptote/GUI/CustMatTransform.py b/Build/source/utils/asymptote/GUI/CustMatTransform.py
new file mode 100644
index 00000000000..563907fc502
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/CustMatTransform.py
@@ -0,0 +1,102 @@
+#!/usr/bin/env python3
+
+import PyQt5.QtWidgets as Qw
+import PyQt5.QtGui as Qg
+import PyQt5.QtCore as Qc
+import numpy as np
+import xasy2asy as x2a
+from pyUIClass.custMatTransform import Ui_Dialog
+
+
+class CustMatTransform(Qw.QDialog):
+ def __init__(self):
+ super().__init__()
+ self.ui = Ui_Dialog()
+ self.ui.setupUi(self)
+
+ self.ui.btnAccept.clicked.connect(self.accept)
+ self.ui.btnCancel.clicked.connect(self.reject)
+ self.ui.btnReset.clicked.connect(self.resetDialog)
+
+ self.mainTransformation = Qg.QTransform()
+ self.mainTransformation.scale(1, -1)
+
+ self.matrixLineInputs = [
+ self.ui.lineMat00, self.ui.lineMat01, self.ui.lineMatTx,
+ self.ui.lineMat10, self.ui.lineMat11, self.ui.lineMatTy]
+
+ validator = Qg.QDoubleValidator()
+ for lineInput in self.matrixLineInputs:
+ lineInput.setValidator(validator)
+ lineInput.textChanged.connect(self.handleUpdateText)
+
+ def show(self):
+ super().show()
+ self.createCanvas()
+ self.updatePreview()
+
+ def createCanvas(self):
+ self.canvSize = self.ui.imgPreview.size()
+ self.previewPixmap = Qg.QPixmap(self.canvSize)
+ tx, ty = self.canvSize.width() / 2, self.canvSize.height() / 2
+ self.mainTransformation.translate(tx, -ty)
+
+ def handleUpdateText(self, text):
+ if str(text) not in {'.', '-', '.-', '-.'} and str(text):
+ self.updatePreview()
+ self.ui.btnAccept.setEnabled(True)
+ else:
+ self.previewPixmap.fill()
+ self.ui.imgPreview.setPixmap(self.previewPixmap)
+ self.ui.btnAccept.setEnabled(False)
+
+ def updatePreview(self):
+ self.previewPixmap.fill()
+ canvas = Qg.QPainter(self.previewPixmap)
+ if not canvas.isActive():
+ return
+ canvas.setTransform(self.mainTransformation)
+
+ canvas.save()
+ canvas.setPen(Qc.Qt.lightGray)
+ self.drawBasicGrid(canvas)
+ transform = x2a.asyTransform.fromNumpyMatrix(self.getTransformationMatrix())
+ canvTransform = transform.toQTransform()
+ canvas.setTransform(canvTransform, True)
+
+ canvas.setPen(Qc.Qt.black)
+
+ if canvTransform.isInvertible():
+ self.drawBasicGrid(canvas, False)
+
+ if canvTransform.determinant() <= 0:
+ canvas.setPen(Qc.Qt.red)
+
+ canvas.drawRect(Qc.QRect(Qc.QPoint(0, 0), Qc.QSize(20, 20)))
+
+ self.ui.imgPreview.setPixmap(self.previewPixmap)
+
+ def resetDialog(self):
+ self.ui.lineMatTx.setText('0')
+ self.ui.lineMatTx.setText('0')
+
+ self.ui.lineMat00.setText('1')
+ self.ui.lineMat01.setText('0')
+ self.ui.lineMat10.setText('0')
+ self.ui.lineMat11.setText('1')
+
+ def drawBasicGrid(self, canvas, grid=True):
+ canvas.drawLine(Qc.QLine(-9999, 0, 9999, 0))
+ canvas.drawLine(Qc.QLine(0, -9999, 0, 9999))
+
+ fromIter, toIter = -7, 7
+ gridSize = 20
+ if grid:
+ for iterIndex in range(fromIter, toIter + 1):
+ canvas.drawLine(Qc.QLine(-9999, iterIndex * gridSize, 9999, iterIndex * gridSize))
+ canvas.drawLine(Qc.QLine(iterIndex * gridSize, -9999, iterIndex * gridSize, 9999))
+
+ def getTransformationMatrix(self):
+ rawMatrixNum = [float(lineInput.text()) for lineInput in self.matrixLineInputs]
+ rawMatrixNum.extend([0, 0, 1])
+ return np.matrix(rawMatrixNum).reshape((3, 3))
diff --git a/Build/source/utils/asymptote/GUI/DebugFlags.py b/Build/source/utils/asymptote/GUI/DebugFlags.py
new file mode 100644
index 00000000000..8a7eb4b282e
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/DebugFlags.py
@@ -0,0 +1,6 @@
+#!/usr/bin/env python3
+
+keepFiles = False
+printFoutTranscript = False
+printDeconstTranscript = False
+forceRasterizationSVG = False
diff --git a/Build/source/utils/asymptote/GUI/GuidesManager.py b/Build/source/utils/asymptote/GUI/GuidesManager.py
new file mode 100644
index 00000000000..5467843377a
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/GuidesManager.py
@@ -0,0 +1,52 @@
+#!/usr/bin/env python3
+import PyQt5.QtWidgets as Qw
+import PyQt5.QtGui as Qg
+import PyQt5.QtCore as Qc
+import numpy as np
+
+class Guide:
+ def __init__(self, pen=None):
+ if pen is None:
+ pen = Qg.QPen()
+ assert isinstance(pen, Qg.QPen)
+ self.pen = pen
+
+ def drawShape(self, pen):
+ assert isinstance(pen, Qg.QPainter)
+ pen.save()
+ pen.setPen(self.pen)
+
+class LineGuide(Guide):
+ def __init__(self, origin, direction, pen=None):
+ super().__init__(pen)
+ self.origin = origin
+ self.direction = direction
+
+ def drawShape(self, pen):
+ super().drawShape(pen)
+ p1 = self.origin + (9999 * Qc.QPointF(np.cos(self.direction), np.sin(self.direction)))
+ p2 = self.origin - (9999 * Qc.QPointF(np.cos(self.direction), np.sin(self.direction)))
+ pen.drawLine(Qc.QLineF(p1, p2))
+ pen.restore()
+
+class ArcGuide(Guide):
+ @classmethod
+ def radTo16Deg(cls, radians):
+ return int(round(np.rad2deg(radians) * 16))
+
+ def __init__(self, center=None, radius=1, startAng=0, endAng=(2*np.pi), pen=None):
+ if center is None:
+ center = Qc.QPointF(0, 0)
+ super().__init__(pen)
+ self.center = center
+ self.radius = int(radius)
+ self.startAng = startAng
+ self.endAng = endAng
+
+ def drawShape(self, pen):
+ super().drawShape(pen)
+ assert isinstance(pen, Qg.QPainter)
+ x, y = int(round(self.center.x())), int(round(self.center.y()))
+ pen.drawArc(x - self.radius, y - self.radius, 2 * self.radius, 2 * self.radius, ArcGuide.radTo16Deg(self.startAng),
+ -ArcGuide.radTo16Deg(self.endAng - self.startAng))
+ pen.restore()
diff --git a/Build/source/utils/asymptote/GUI/InplaceAddObj.py b/Build/source/utils/asymptote/GUI/InplaceAddObj.py
new file mode 100644
index 00000000000..132969dad19
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/InplaceAddObj.py
@@ -0,0 +1,356 @@
+#!/usr/bin/env python3
+
+import PyQt5.QtCore as Qc
+import PyQt5.QtGui as Qg
+import xasy2asy as x2a
+
+import PrimitiveShape
+import math
+
+import Widg_addPolyOpt
+import Widg_addLabel
+
+
+class InplaceObjProcess(Qc.QObject):
+ objectCreated = Qc.pyqtSignal(Qc.QObject)
+ objectUpdated = Qc.pyqtSignal()
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self._active = False
+ pass
+
+ @property
+ def active(self):
+ return self._active
+
+ def mouseDown(self, pos, info, mouseEvent: Qg.QMouseEvent=None):
+ raise NotImplementedError
+
+ def mouseMove(self, pos, event: Qg.QMouseEvent):
+ raise NotImplementedError
+
+ def mouseRelease(self):
+ raise NotImplementedError
+
+ def forceFinalize(self):
+ raise NotImplementedError
+
+ def getPreview(self):
+ return None
+
+ def getObject(self):
+ raise NotImplementedError
+
+ def getXasyObject(self):
+ raise NotImplementedError
+
+ def postDrawPreview(self, canvas: Qg.QPainter):
+ pass
+
+ def createOptWidget(self, info):
+ return None
+
+
+class AddCircle(InplaceObjProcess):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self.center = Qc.QPointF(0, 0)
+ self.radius = 0
+
+ def mouseDown(self, pos, info, mouseEvent: Qg.QMouseEvent=None):
+ x, y = PrimitiveShape.PrimitiveShape.pos_to_tuple(pos)
+ self.radius = 0
+ self.center.setX(x)
+ self.center.setY(y)
+ self.fill = info['fill']
+ self._active = True
+
+ def mouseMove(self, pos, event):
+ self.radius = PrimitiveShape.PrimitiveShape.euclideanNorm(pos, self.center)
+
+ def mouseRelease(self):
+ self.objectCreated.emit(self.getXasyObject())
+ self._active = False
+
+ def getPreview(self):
+ x, y = PrimitiveShape.PrimitiveShape.pos_to_tuple(self.center)
+ boundRect = Qc.QRectF(x - self.radius, y - self.radius, 2 * self.radius, 2 * self.radius)
+ # because the internal image is flipped...
+ newPath = Qg.QPainterPath()
+ newPath.addEllipse(boundRect)
+ # newPath.addRect(boundRect)
+ return newPath
+
+ def getObject(self):
+ return PrimitiveShape.PrimitiveShape.circle(self.center, self.radius)
+
+ def getXasyObject(self):
+ if self.fill:
+ newObj = x2a.xasyFilledShape(self.getObject(), None)
+ else:
+ newObj = x2a.xasyShape(self.getObject(), None)
+ return newObj
+
+ def forceFinalize(self):
+ self.mouseRelease()
+
+
+class AddLabel(InplaceObjProcess):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self.alignMode = None
+ self.opt = None
+ self.text = None
+ self.anchor = Qc.QPointF(0, 0)
+ self._active = False
+
+ def createOptWidget(self, info):
+ self.opt = Widg_addLabel.Widg_addLabel(info)
+ return self.opt
+
+ def getPreview(self):
+ return None
+
+ def mouseRelease(self):
+ self.objectCreated.emit(self.getXasyObject())
+ self._active = False
+
+ def mouseMove(self, pos, event):
+ x, y = PrimitiveShape.PrimitiveShape.pos_to_tuple(pos)
+ self.anchor.setX(x)
+ self.anchor.setY(y)
+
+ def mouseDown(self, pos, info, mouseEvent: Qg.QMouseEvent=None):
+ if self.opt is not None:
+ self.text = self.opt.labelText
+ x, y = PrimitiveShape.PrimitiveShape.pos_to_tuple(pos)
+ self.anchor.setX(x)
+ self.anchor.setY(y)
+
+ self.alignMode = info['align']
+ self.fontSize = info['fontSize']
+ self._active = True
+
+ def getObject(self):
+ finalTuple = PrimitiveShape.PrimitiveShape.pos_to_tuple(self.anchor)
+ return {'txt': self.text, 'align': str(self.alignMode), 'anchor': finalTuple}
+
+ def getXasyObject(self):
+ text = self.text
+ align = str(self.alignMode)
+ anchor = PrimitiveShape.PrimitiveShape.pos_to_tuple(self.anchor)
+ newLabel = x2a.xasyText(text=text, location=anchor, pen=None,
+ align=align, asyengine=None, fontsize=self.fontSize)
+ newLabel.asyfied = False
+ return newLabel
+
+ def forceFinalize(self):
+ self.mouseRelease()
+
+
+class AddBezierShape(InplaceObjProcess):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self.asyengine = None
+ self.basePath = None
+ self.basePathPreview = None
+ self.closedPath = None
+ self.info = None
+ self.fill = False
+ self.opt = None
+
+ # list of "committed" points with Linkage information.
+ # Linkmode should be to the last point.
+ # (x, y, linkmode), (u, v, lm2) <==> (x, y) <=lm2=> (u, v)
+ self.pointsList = []
+ self.currentPoint = Qc.QPointF(0, 0)
+ self.pendingPoint = None
+ self.useLegacy = False
+
+ def mouseDown(self, pos, info, mouseEvent: Qg.QMouseEvent=None):
+ x, y = PrimitiveShape.PrimitiveShape.pos_to_tuple(pos)
+ self.currentPoint.setX(x)
+ self.currentPoint.setY(y)
+ self.info = info
+
+ if not self._active:
+ self._active = True
+ self.fill = info['fill']
+ self.asyengine = info['asyengine']
+ self.closedPath = info['closedPath']
+ self.useBezierBase = info['useBezier']
+ self.useLegacy = self.info['options']['useLegacyDrawMode']
+ self.pointsList.clear()
+ self.pointsList.append((x, y, None))
+ else:
+ # see http://doc.qt.io/archives/qt-4.8/qt.html#MouseButton-enum
+ if (int(mouseEvent.buttons()) if mouseEvent is not None else 0) & 0x2 and self.useLegacy:
+ self.forceFinalize()
+
+ def _getLinkType(self):
+ if self.info['useBezier']:
+ return '..'
+ else:
+ return '--'
+
+ def mouseMove(self, pos, event):
+ # in postscript coords.
+ if self._active:
+ x, y = PrimitiveShape.PrimitiveShape.pos_to_tuple(pos)
+
+ if self.useLegacy or int(event.buttons()) != 0:
+ self.currentPoint.setX(x)
+ self.currentPoint.setY(y)
+ else:
+ self.forceFinalize()
+
+
+ def createOptWidget(self, info):
+ return None
+ # self.opt = Widg_addBezierInPlace.Widg_addBezierInplace(info)
+ # return self.opt
+
+ def finalizeClosure(self):
+ if self.active:
+ self.closedPath = True
+ self.forceFinalize()
+
+ def mouseRelease(self):
+ x, y = self.currentPoint.x(), self.currentPoint.y()
+ self.pointsList.append((x, y, self._getLinkType()))
+ # self.updateBasePath()
+
+ def updateBasePath(self):
+ self.basePath = x2a.asyPath(asyengine=self.asyengine, forceCurve=self.useBezierBase)
+ newNode = [(x, y) for x, y, _ in self.pointsList]
+ newLink = [lnk for *args, lnk in self.pointsList[1:]]
+ if self.useLegacy:
+ newNode += [(self.currentPoint.x(), self.currentPoint.y())]
+ newLink += [self._getLinkType()]
+ if self.closedPath:
+ newNode.append('cycle')
+ newLink.append(self._getLinkType())
+ self.basePath.initFromNodeList(newNode, newLink)
+
+ if self.useBezierBase:
+ self.basePath.computeControls()
+
+ def updateBasePathPreview(self):
+ self.basePathPreview = x2a.asyPath(
+ asyengine=self.asyengine, forceCurve=self.useBezierBase)
+ newNode = [(x, y) for x, y, _ in self.pointsList] + [(self.currentPoint.x(), self.currentPoint.y())]
+ newLink = [lnk for *args, lnk in self.pointsList[1:]] + [self._getLinkType()]
+ if self.closedPath:
+ newNode.append('cycle')
+ newLink.append(self._getLinkType())
+ self.basePathPreview.initFromNodeList(newNode, newLink)
+
+ if self.useBezierBase:
+ self.basePathPreview.computeControls()
+
+ def forceFinalize(self):
+ self.updateBasePath()
+ self._active = False
+ self.pointsList.clear()
+ self.objectCreated.emit(self.getXasyObject())
+ self.basePath = None
+
+ def getObject(self):
+ if self.basePath is None:
+ raise RuntimeError('BasePath is None')
+ self.basePath.asyengine = self.asyengine
+ return self.basePath
+
+ def getPreview(self):
+ if self._active:
+ if self.pointsList:
+ self.updateBasePathPreview()
+ newPath = self.basePathPreview.toQPainterPath()
+ return newPath
+
+ def getXasyObject(self):
+ if self.fill:
+ return x2a.xasyFilledShape(self.getObject(), None)
+ else:
+ return x2a.xasyShape(self.getObject(), None)
+
+
+class AddPoly(InplaceObjProcess):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self.center = Qc.QPointF(0, 0)
+ self.currPos = Qc.QPointF(0, 0)
+ self.sides = None
+ self.inscribed = None
+ self.centermode = None
+ self.asyengine = None
+ self.fill = None
+ self.opt = None
+
+ def mouseDown(self, pos, info, mouseEvent: Qg.QMouseEvent=None):
+ self._active = True
+ self.sides = info['sides']
+ self.inscribed = info['inscribed']
+ self.centermode = info['centermode']
+ self.fill = info['fill']
+
+
+ x, y = PrimitiveShape.PrimitiveShape.pos_to_tuple(pos)
+ self.center.setX(x)
+ self.center.setY(y)
+ self.currPos = Qc.QPointF(self.center)
+
+ def mouseMove(self, pos, event):
+ x, y = PrimitiveShape.PrimitiveShape.pos_to_tuple(pos)
+ self.currPos.setX(x)
+ self.currPos.setY(y)
+
+ def mouseRelease(self):
+ if self.active:
+ self.objectCreated.emit(self.getXasyObject())
+ self._active = False
+
+ def forceFinalize(self):
+ self.mouseRelease()
+
+ def getObject(self):
+ if self.inscribed:
+ return PrimitiveShape.PrimitiveShape.inscribedRegPolygon(self.sides, self.center, self._rad(),
+ self._angle())
+ else:
+ return PrimitiveShape.PrimitiveShape.exscribedRegPolygon(self.sides, self.center, self._rad(),
+ self._angle())
+
+ def getPreview(self):
+ if self.inscribed:
+ poly = PrimitiveShape.PrimitiveShape.inscribedRegPolygon(self.sides, self.center, self._rad(),
+ self._angle(), qpoly=True)
+ else:
+ poly = PrimitiveShape.PrimitiveShape.exscribedRegPolygon(self.sides, self.center, self._rad(),
+ self._angle(), qpoly=True)
+ newPath = Qg.QPainterPath()
+ newPath.addPolygon(poly)
+ return newPath
+
+ def createOptWidget(self, info):
+ self.opt = Widg_addPolyOpt.Widg_addPolyOpt(info)
+ return self.opt
+
+ def _rad(self):
+ return PrimitiveShape.PrimitiveShape.euclideanNorm(self.currPos, self.center)
+
+ def _angle(self):
+ dist_x = self.currPos.x() - self.center.x()
+ dist_y = self.currPos.y() - self.center.y()
+ if dist_x == 0 and dist_y == 0:
+ return 0
+ else:
+ return math.atan2(dist_y, dist_x)
+
+ def getXasyObject(self):
+ if self.fill:
+ newObj = x2a.xasyFilledShape(self.getObject(), None)
+ else:
+ newObj = x2a.xasyShape(self.getObject(), None)
+ return newObj
diff --git a/Build/source/utils/asymptote/GUI/PrimitiveShape.py b/Build/source/utils/asymptote/GUI/PrimitiveShape.py
new file mode 100644
index 00000000000..c75e014079f
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/PrimitiveShape.py
@@ -0,0 +1,66 @@
+#!/usr/bin/env python3
+
+import xasy2asy as x2a
+import numpy as np
+import math
+import PyQt5.QtCore as Qc
+import PyQt5.QtGui as Qg
+
+
+class PrimitiveShape:
+ # The magic number.
+ # see https://www.desmos.com/calculator/lw6j7khikj for unitcircle
+ # optimal_ctl_pt = 0.5447
+
+ @staticmethod
+ def pos_to_tuple(pos):
+ if isinstance(pos, tuple) or isinstance(pos, np.ndarray):
+ return pos
+ elif isinstance(pos, Qc.QPoint) or isinstance(pos, Qc.QPointF):
+ return pos.x(), pos.y()
+ else:
+ raise TypeError("Position must be a valid type!")
+
+ @staticmethod
+ def euclideanNorm(p1, p2):
+ x1, y1 = PrimitiveShape.pos_to_tuple(p1)
+ x2, y2 = PrimitiveShape.pos_to_tuple(p2)
+
+ normSq = ((x1 - x2) ** 2) + ((y1 - y2) ** 2)
+ return math.sqrt(normSq)
+
+ @classmethod
+ def circle(cls, position, radius):
+ pos_x, pos_y = PrimitiveShape.pos_to_tuple(position)
+ newCircle = x2a.asyPath()
+ ptsList = [(pos_x + radius, pos_y), (pos_x, pos_y + radius), (pos_x - radius, pos_y), (pos_x, pos_y - radius),
+ 'cycle']
+ # cycle doesn't work for now.
+ lkList = ['..', '..', '..', '..']
+ newCircle.initFromNodeList(ptsList, lkList)
+ return newCircle
+
+ @classmethod
+ def inscribedRegPolygon(cls, sides, position, radius, starting_rad, qpoly=False):
+ pos_x, pos_y = PrimitiveShape.pos_to_tuple(position)
+ lkList = ['--'] * sides
+ ptsList = []
+ for ang in np.linspace(starting_rad, starting_rad + math.tau, sides, endpoint=False):
+ ptsList.append((pos_x + radius * math.cos(ang), pos_y + radius * math.sin(ang)))
+
+ if qpoly:
+ ptsList.append((pos_x + radius * math.cos(starting_rad), pos_y + radius * math.sin(starting_rad)))
+ qpoints = [Qc.QPointF(x, y) for (x, y) in ptsList]
+ return Qg.QPolygonF(qpoints)
+ else:
+ ptsList.append('cycle')
+ newPoly = x2a.asyPath()
+ newPoly.initFromNodeList(ptsList, lkList)
+ return newPoly
+
+ @classmethod
+ def exscribedRegPolygon(cls, sides, position, length, starting_rad, qpoly=False):
+ ang = math.tau/sides
+ # see notes
+ adjusted_radius = length / math.cos(ang/2)
+ return cls.inscribedRegPolygon(sides, position, adjusted_radius, starting_rad - ang/2, qpoly)
diff --git a/Build/source/utils/asymptote/GUI/SetCustomAnchor.py b/Build/source/utils/asymptote/GUI/SetCustomAnchor.py
new file mode 100644
index 00000000000..ad5925cddb4
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/SetCustomAnchor.py
@@ -0,0 +1,44 @@
+#!/usr/bin/env python3
+
+import PyQt5.QtWidgets as Qw
+import PyQt5.QtGui as Qg
+import PyQt5.QtCore as Qc
+from pyUIClass.setCustomAnchor import Ui_Dialog
+
+
+class CustomAnchorDialog(Qw.QDialog):
+
+ def __init__(self):
+ super().__init__()
+ self.ui = Ui_Dialog()
+ self.ui.setupUi(self)
+ self.ui.buttonBox.button(Qw.QDialogButtonBox.Reset).clicked.connect(self.resetDialog)
+
+ validator = Qg.QDoubleValidator()
+
+ self.ui.lineEditX.setValidator(validator)
+ self.ui.lineEditY.setValidator(validator)
+
+ self.ui.lineEditX.textChanged.connect(self.checkTextChanged)
+ self.ui.lineEditY.textChanged.connect(self.checkTextChanged)
+
+ def checkTextChanged(self, text):
+ if str(text) not in {'.', '-', '.-', '-.'} and str(text):
+ self.ui.buttonBox.button(Qw.QDialogButtonBox.Ok).setEnabled(True)
+ else:
+ self.ui.buttonBox.button(Qw.QDialogButtonBox.Ok).setEnabled(False)
+
+ def getPoint(self):
+ xPoint = float(self.ui.lineEditX.text())
+ yPoint = float(self.ui.lineEditY.text())
+
+ return Qc.QPointF(xPoint, yPoint)
+
+ def handleBtnBoxClick(self, button):
+ assert isinstance(button, Qw.QAbstractButton)
+ if button.text() == 'Reset':
+ self.resetDialog()
+
+ def resetDialog(self):
+ self.ui.lineEditX.setText('0')
+ self.ui.lineEditY.setText('0')
diff --git a/Build/source/utils/asymptote/GUI/UndoRedoStack.py b/Build/source/utils/asymptote/GUI/UndoRedoStack.py
index 779d0330a81..7285b15ff2f 100755
--- a/Build/source/utils/asymptote/GUI/UndoRedoStack.py
+++ b/Build/source/utils/asymptote/GUI/UndoRedoStack.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
###########################################################################
#
# UndoRedoStack implements the usual undo/redo capabilities of a GUI
@@ -8,110 +8,125 @@
#
###########################################################################
+
class action:
- def __init__(self,act,inv):
- self.act = act
- self.inv = inv
- def undo(self):
- #print ("Undo:",self)
- self.inv()
- def redo(self):
- #print ("Redo:",self)
- self.act()
- def __str__(self):
- return "A generic action"
+ def __init__(self, actions):
+ act, inv = actions
+ self.act = act
+ self.inv = inv
+
+ def undo(self):
+ # print ("Undo:",self)
+ self.inv()
+
+ def redo(self):
+ # print ("Redo:",self)
+ self.act()
+
+ def __str__(self):
+ return "A generic action"
+
class beginActionGroup:
- pass
+ pass
+
class endActionGroup:
- pass
+ pass
+
class actionStack:
- def __init__(self):
- self.clear()
-
- def add(self,action):
- self.undoStack.append(action)
- #print ("Added",action)
- self.redoStack = []
-
- def undo(self):
- if len(self.undoStack) > 0:
- op = self.undoStack.pop()
- if op is beginActionGroup:
- level = 1
- self.redoStack.append(endActionGroup)
- while level > 0:
- op=self.undoStack.pop()
- if op is endActionGroup:
- level -= 1
- self.redoStack.append(beginActionGroup)
- elif op is beginActionGroup:
- level += 1
- self.redoStack.append(endActionGroup)
- else:
- op.undo()
- self.redoStack.append(op)
- elif op is endActionGroup:
- raise Exception("endActionGroup without previous beginActionGroup")
- else:
- self.redoStack.append(op)
- op.undo()
- #print ("undid",op)
- else:
- pass #print ("nothing to undo")
-
- def redo(self):
- if len(self.redoStack) > 0:
- op = self.redoStack.pop()
- if op is beginActionGroup:
- level = 1
- self.undoStack.append(endActionGroup)
- while level > 0:
- op = self.redoStack.pop()
- if op is endActionGroup:
- level -= 1
- self.undoStack.append(beginActionGroup)
- elif op is beginActionGroup:
- level += 1
- self.undoStack.append(endActionGroup)
- else:
- op.redo()
- self.undoStack.append(op)
- elif op is endActionGroup:
- raise Exception("endActionGroup without previous beginActionGroup")
- else:
- self.undoStack.append(op)
- op.redo()
- #print ("redid",op)
- else:
- pass #print ("nothing to redo")
-
- def setCommitLevel(self):
- self.commitLevel = len(self.undoStack)
-
- def changesMade(self):
- if len(self.undoStack) != self.commitLevel:
- return True
- else:
- return False
-
- def clear(self):
- self.redoStack = []
- self.undoStack = []
- self.commitLevel = 0
-
-if __name__=='__main__':
- import sys
- def opq():
- print ("action1")
- def unopq():
- print ("inverse1")
- q = action(opq,unopq)
- w = action(lambda:sys.stdout.write("action2\n"),lambda:sys.stdout.write("inverse2\n"))
- e = action(lambda:sys.stdout.write("action3\n"),lambda:sys.stdout.write("inverse3\n"))
- s = actionStack()
- s.add(q)
- s.add(w)
- s.add(e)
+ def __init__(self):
+ self.clear()
+
+ def add(self, action):
+ self.undoStack.append(action)
+ # print ("Added",action)
+ self.redoStack = []
+
+ def undo(self):
+ if len(self.undoStack) > 0:
+ op = self.undoStack.pop()
+ if op is beginActionGroup:
+ level = 1
+ self.redoStack.append(endActionGroup)
+ while level > 0:
+ op = self.undoStack.pop()
+ if op is endActionGroup:
+ level -= 1
+ self.redoStack.append(beginActionGroup)
+ elif op is beginActionGroup:
+ level += 1
+ self.redoStack.append(endActionGroup)
+ else:
+ op.undo()
+ self.redoStack.append(op)
+ elif op is endActionGroup:
+ raise Exception("endActionGroup without previous beginActionGroup")
+ else:
+ self.redoStack.append(op)
+ op.undo()
+ # print ("undid",op)
+ else:
+ pass # print ("nothing to undo")
+
+ def redo(self):
+ if len(self.redoStack) > 0:
+ op = self.redoStack.pop()
+ if op is beginActionGroup:
+ level = 1
+ self.undoStack.append(endActionGroup)
+ while level > 0:
+ op = self.redoStack.pop()
+ if op is endActionGroup:
+ level -= 1
+ self.undoStack.append(beginActionGroup)
+ elif op is beginActionGroup:
+ level += 1
+ self.undoStack.append(endActionGroup)
+ else:
+ op.redo()
+ self.undoStack.append(op)
+ elif op is endActionGroup:
+ raise Exception("endActionGroup without previous beginActionGroup")
+ else:
+ self.undoStack.append(op)
+ op.redo()
+ # print ("redid",op)
+ else:
+ pass # print ("nothing to redo")
+
+ def setCommitLevel(self):
+ self.commitLevel = len(self.undoStack)
+
+ def changesMade(self):
+ if len(self.undoStack) != self.commitLevel:
+ return True
+ else:
+ return False
+
+ def clear(self):
+ self.redoStack = []
+ self.undoStack = []
+ self.commitLevel = 0
+
+
+if __name__ == '__main__':
+ import sys
+
+
+ def opq():
+ print("action1")
+
+
+ def unopq():
+ print("inverse1")
+
+
+ q = action(opq, unopq)
+ w = action(lambda: sys.stdout.write("action2\n"), lambda: sys.stdout.write("inverse2\n"))
+ e = action(lambda: sys.stdout.write("action3\n"), lambda: sys.stdout.write("inverse3\n"))
+ s = actionStack()
+ s.add(q)
+ s.add(w)
+ s.add(e)
diff --git a/Build/source/utils/asymptote/GUI/Widg_addLabel.py b/Build/source/utils/asymptote/GUI/Widg_addLabel.py
new file mode 100644
index 00000000000..776d3e02df9
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/Widg_addLabel.py
@@ -0,0 +1,96 @@
+#!/usr/bin/env python3
+
+from pyUIClass.widg_addLabel import Ui_Form
+import PyQt5.QtWidgets as Qw
+import PyQt5.QtGui as Qg
+
+import labelEditor
+import xasyUtils as xu
+
+
+class Widg_addLabel(Qw.QWidget):
+ def __init__(self, info):
+ super().__init__()
+ self.ui = Ui_Form()
+ self.info = info
+ self.ui.setupUi(self)
+ self.setFixedSize(self.size())
+
+ if 'alignIndex' not in self.info.keys():
+ self.info['alignIndex'] = 0
+
+ if 'shift_x' not in self.info.keys():
+ self.info['shift_x'] = None
+
+ if 'shift_y' not in self.info.keys():
+ self.info['shift_y'] = None
+
+ if 'align' not in self.info.keys():
+ self.info['align'] = (0, 0)
+
+ if self.info['shift_x'] is not None:
+ self.ui.txtShiftX.setText(str(self.info['shift_x']))
+
+ if self.info['shift_y'] is not None:
+ self.ui.txtShiftY.setText(str(self.info['shift_y']))
+
+
+ self.ui.cmbFontSize.setCurrentText(str(self.info['fontSize']) if self.info['fontSize'] is not None else '-')
+ self.ui.cmbAlign.setCurrentIndex(self.info['alignIndex'])
+
+ validator = Qg.QDoubleValidator()
+
+ self.ui.txtShiftX.setValidator(validator)
+ self.ui.txtShiftY.setValidator(validator)
+ self.ui.cmbFontSize.setValidator(validator)
+
+ self.ui.cmbAlign.currentTextChanged.connect(self.updateCheck)
+ self.ui.cmbAlign.currentIndexChanged.connect(self.cmbIndexUpdate)
+ self.ui.txtShiftX.textEdited.connect(self.shftXUpdate)
+ self.ui.txtShiftY.textEdited.connect(self.shftYUpdate)
+ self.ui.btnAdvancedEdit.clicked.connect(self.btnAdvancedEditClicked)
+ self.ui.cmbFontSize.currentTextChanged.connect(self.cmbFontSizeTextChanged)
+
+ self.updateCheck(self.ui.cmbAlign.currentText())
+
+ def cmbFontSizeTextChanged(self, text: str):
+ tryParseVal = xu.tryParse(text, float)
+ self.info['fontSize'] = tryParseVal
+
+ def btnAdvancedEditClicked(self):
+ advancedEditDialog = labelEditor.labelEditor(self.ui.txtLabelText.text())
+ advancedEditDialog.show()
+ result = advancedEditDialog.exec_()
+ if result == Qw.QDialog.Accepted:
+ self.ui.txtLabelText.setText(advancedEditDialog.getText())
+
+ @property
+ def labelText(self):
+ return self.ui.txtLabelText.text()
+
+ def updateCheck(self, a0):
+ self.ui.txtShiftX.setEnabled(a0 == 'Custom')
+ self.ui.txtShiftY.setEnabled(a0 == 'Custom')
+
+ def shftXUpdate(self, text):
+ if text:
+ self.info['shift_x'] = float(text)
+ self.updateAlign()
+
+ def shftYUpdate(self, text):
+ if text:
+ self.info['shift_y'] = float(text)
+ self.updateAlign()
+
+ def updateAlign(self):
+ index = self.ui.cmbAlign.currentIndex()
+ self.info['alignIndex'] = index
+ if self.ui.cmbAlign.currentText() == 'Custom':
+ self.info['align'] = (self.info['shift_x'], self.info['shift_y'])
+ elif self.ui.cmbAlign.currentText() == 'None':
+ self.info['align'] = (0, 0)
+ else:
+ self.info['align'] = self.ui.cmbAlign.currentText()
+
+ def cmbIndexUpdate(self, index):
+ self.updateAlign()
diff --git a/Build/source/utils/asymptote/GUI/Widg_addPolyOpt.py b/Build/source/utils/asymptote/GUI/Widg_addPolyOpt.py
new file mode 100644
index 00000000000..b9b9a77f7a1
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/Widg_addPolyOpt.py
@@ -0,0 +1,31 @@
+#!/usr/bin/env python3
+
+from pyUIClass.widg_addPolyOpt import Ui_Form
+import PyQt5.QtWidgets as Qw
+import PyQt5.QtGui as Qg
+import PyQt5.QtCore as Qc
+
+import sys
+
+
+class Widg_addPolyOpt(Qw.QWidget):
+ def __init__(self, info):
+ super().__init__()
+ self.ui = Ui_Form()
+ self.info = info
+ self.ui.setupUi(self)
+ self.setFixedSize(self.size())
+
+ self.ui.chkInscribed.setChecked(self.info['inscribed'])
+ self.ui.txtSides.setText(str(self.info['sides']))
+ self.ui.txtSides.setValidator(Qg.QIntValidator())
+
+ self.ui.chkInscribed.stateChanged.connect(self.chkInscribedUpdate)
+ self.ui.txtSides.textChanged.connect(self.txtSidesUpdate)
+
+ def chkInscribedUpdate(self, checked):
+ self.info['inscribed'] = checked
+
+ def txtSidesUpdate(self, text):
+ if text:
+ self.info['sides'] = int(text)
diff --git a/Build/source/utils/asymptote/GUI/Widg_editBezier.py b/Build/source/utils/asymptote/GUI/Widg_editBezier.py
new file mode 100644
index 00000000000..3a3cbab94ab
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/Widg_editBezier.py
@@ -0,0 +1,53 @@
+#!/usr/bin/env python3
+
+from pyUIClass.widg_editBezier import Ui_Form
+
+import PyQt5.QtCore as Qc
+import PyQt5.QtWidgets as Qw
+import PyQt5.QtGui as Qg
+
+class LockMode:
+ noLock = 0
+ angleLock = 1
+ angleAndScaleLock = 2
+
+class Widg_editBezier(Qw.QWidget):
+ def __init__(self, info: dict, enableCurveFeatures: bool=True):
+ super().__init__()
+ self.ui = Ui_Form()
+ self.ui.setupUi(self)
+ self.info = info
+
+ self.ui.chkRecompute.setChecked(self.info['autoRecompute'])
+ self.ui.cmbLockMode.setCurrentIndex(self.info['editBezierlockMode'])
+
+ self.ui.cmbLockMode.currentIndexChanged[int].connect(self.cmbLockIndexChange)
+ self.ui.chkRecompute.stateChanged.connect(self.chkRecomputeChanged)
+
+ self.disableOnAutoRecompute = {self.ui.cmbLockMode, self.ui.btnForceRecompute}
+ self.curveBtnsOnly = {self.ui.cmbLockMode, self.ui.btnForceRecompute, self.ui.chkRecompute}
+
+ for elem in self.curveBtnsOnly:
+ elem.setEnabled(enableCurveFeatures)
+
+ @property
+ def autoRecompute(self) -> bool:
+ return self.ui.chkRecompute.isChecked()
+
+ @property
+ def lockMode(self) -> int:
+ return self.ui.cmbLockMode.currentIndex()
+
+ @Qc.pyqtSlot(int)
+ def cmbLockIndexChange(self, index: int):
+ self.info['editBezierlockMode'] = index
+
+ @Qc.pyqtSlot(int)
+ def chkRecomputeChanged(self, checked: int):
+ isChecked = (checked == 2)
+ for obj in self.disableOnAutoRecompute:
+ obj.setEnabled(not checked)
+ self.info['autoRecompute'] = checked
+
+ if isChecked:
+ self.ui.btnForceRecompute.clicked.emit()
diff --git a/Build/source/utils/asymptote/GUI/Window1.py b/Build/source/utils/asymptote/GUI/Window1.py
new file mode 100644
index 00000000000..8497b27e5cf
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/Window1.py
@@ -0,0 +1,1890 @@
+#!/usr/bin/env python3
+
+from pyUIClass.window1 import Ui_MainWindow
+
+import PyQt5.QtWidgets as Qw
+import PyQt5.QtGui as Qg
+import PyQt5.QtCore as Qc
+import xasyVersion
+
+import numpy as np
+import os
+import json
+import io
+import pathlib
+import webbrowser
+import subprocess
+import tempfile
+import datetime
+import string
+import atexit
+
+import xasyUtils as xu
+import xasy2asy as x2a
+import xasyFile as xf
+import xasyOptions as xo
+import UndoRedoStack as Urs
+import xasyArgs as xa
+import xasyBezierInterface as xbi
+from xasyTransform import xasyTransform as xT
+import xasyStrings as xs
+
+import PrimitiveShape
+import InplaceAddObj
+
+import CustMatTransform
+import SetCustomAnchor
+import GuidesManager
+
+
+class ActionChanges:
+ pass
+
+
+# State Invariance: When ActionChanges is at the top, all state of the program & file
+# is exactly like what it was the event right after that ActionChanges was created.
+
+class TransformationChanges(ActionChanges):
+ def __init__(self, objIndex, transformation, isLocal=False):
+ self.objIndex = objIndex
+ self.transformation = transformation
+ self.isLocal = isLocal
+
+
+class ObjCreationChanges(ActionChanges):
+ def __init__(self, obj):
+ self.object = obj
+
+class HardDeletionChanges(ActionChanges):
+ def __init__(self, obj, pos):
+ self.item = obj
+ self.objIndex = pos
+
+class AnchorMode:
+ origin = 0
+ center = 1
+ topLeft = 2
+ topRight = 3
+ bottomRight = 4
+ bottomLeft = 5
+ customAnchor = 6
+
+
+class GridMode:
+ cartesian = 0
+ polar = 1
+
+
+class SelectionMode:
+ select = 0
+ pan = 1
+ translate = 2
+ rotate = 3
+ scale = 4
+ delete = 5
+ setAnchor = 6
+ selectEdit = 7
+
+class AddObjectMode:
+ Circle = 0
+ Arc = 1
+ Polygon = 2
+
+class MainWindow1(Qw.QMainWindow):
+ defaultFrameStyle = """
+ QFrame{{
+ padding: 4.0;
+ border-radius: 3.0;
+ background: rgb({0}, {1}, {2})
+ }}
+ """
+
+ def __init__(self):
+ super().__init__()
+ self.ui = Ui_MainWindow()
+ self.ui.setupUi(self)
+
+ self.settings = xo.BasicConfigs.defaultOpt
+ self.keyMaps = xo.BasicConfigs.keymaps
+
+ self.raw_args = Qc.QCoreApplication.arguments()
+ self.args = xa.parseArgs(self.raw_args)
+
+ self.strings = xs.xasyString(self.args.language)
+ self.asy2psmap = x2a.identity()
+
+ if self.settings['asyBaseLocation'] is not None:
+ os.environ['ASYMPTOTE_DIR'] = self.settings['asyBaseLocation']
+
+ if self.args.asypath is not None:
+ asyPath = self.args.asypath
+ else:
+ asyPath = self.settings['asyPath']
+
+ self.asyPath = asyPath
+ self.asyEngine = x2a.AsymptoteEngine(self.asyPath)
+
+ try:
+ self.asyEngine.start()
+ finally:
+ atexit.register(self.asyEngine.cleanup)
+
+ # For initialization purposes
+ self.canvSize = Qc.QSize()
+ self.filename = None
+ self.currDir = None
+ self.mainCanvas = None
+ self.dpi = 300
+ self.canvasPixmap = None
+
+ # Actions
+ # <editor-fold> Connecting Actions
+ self.ui.txtLineWidth.setValidator(Qg.QDoubleValidator())
+
+ self.connectActions()
+ self.connectButtons()
+
+ self.ui.txtLineWidth.returnPressed.connect(self.btnTerminalCommandOnClick)
+ # </editor-fold>
+
+ # Base Transformations
+
+ self.mainTransformation = Qg.QTransform()
+ self.mainTransformation.scale(1, 1)
+ self.localTransform = Qg.QTransform()
+ self.screenTransformation = Qg.QTransform()
+ self.panTranslation = Qg.QTransform()
+
+ # Internal Settings
+ self.magnification = self.args.mag
+ self.inMidTransformation = False
+ self.addMode = None
+ self.currentlySelectedObj = {'key': None, 'allSameKey': set(), 'selectedIndex': None, 'keyIndex': None}
+ self.pendingSelectedObjList = []
+ self.pendingSelectedObjIndex = -1
+
+ self.savedMousePosition = None
+ self.currentBoundingBox = None
+ self.selectionDelta = None
+ self.newTransform = None
+ self.origBboxTransform = None
+ self.deltaAngle = 0
+ self.scaleFactor = 1
+ self.panOffset = [0, 0]
+
+ super().setMouseTracking(True)
+ # setMouseTracking(True)
+
+ self.undoRedoStack = Urs.actionStack()
+
+ self.lockX = False
+ self.lockY = False
+ self.anchorMode = AnchorMode.center
+ self.currentAnchor = Qc.QPointF(0, 0)
+ self.customAnchor = None
+ self.useGlobalCoords = True
+ self.drawAxes = True
+ self.drawGrid = False
+ self.gridSnap = False # TODO: for now. turn it on later
+
+ self.fileChanged = False
+
+ self.terminalPythonMode = self.ui.btnTogglePython.isChecked()
+
+ self.savedWindowMousePos = None
+
+ self.finalPixmap = None
+ self.preCanvasPixmap = None
+ self.postCanvasPixmap = None
+ self.previewCurve = None
+ self.mouseDown = False
+
+ self.globalObjectCounter = 0
+
+ self.fileItems = []
+ self.drawObjects = []
+ self.xasyDrawObj = {'drawDict': self.drawObjects}
+
+ self.modeButtons = {
+ self.ui.btnTranslate, self.ui.btnRotate, self.ui.btnScale, # self.ui.btnSelect,
+ self.ui.btnPan, self.ui.btnDeleteMode, self.ui.btnAnchor,
+ self.ui.btnSelectEdit
+ }
+
+ self.objButtons = {self.ui.btnCustTransform, self.ui.actionTransform, self.ui.btnSendForwards,
+ self.ui.btnSendBackwards, self.ui.btnToggleVisible
+ }
+
+ self.globalTransformOnlyButtons = (self.ui.comboAnchor, self.ui.btnAnchor)
+
+ self.ui.txtTerminalPrompt.setFont(Qg.QFont(self.settings['terminalFont']))
+
+ self.currAddOptionsWgt = None
+ self.currAddOptions = {
+ 'options': self.settings,
+ 'inscribed': True,
+ 'sides': 3,
+ 'centermode': True,
+ 'fontSize': None,
+ 'asyengine': self.asyEngine,
+ 'fill': self.ui.btnFill.isChecked(),
+ 'closedPath': False,
+ 'useBezier': True,
+ 'magnification': self.magnification,
+ 'editBezierlockMode': xbi.Web.LockMode.angleLock,
+ 'autoRecompute': False
+ }
+
+
+ self.currentModeStack = [SelectionMode.translate]
+ self.drawGridMode = GridMode.cartesian
+ self.setAllInSetEnabled(self.objButtons, False)
+ self._currentPen = x2a.asyPen()
+ self.currentGuides = []
+ self.selectAsGroup = self.settings['groupObjDefault']
+
+ # commands switchboard
+ self.commandsFunc = {
+ 'quit': Qc.QCoreApplication.quit,
+ 'undo': self.btnUndoOnClick,
+ 'redo': self.btnRedoOnClick,
+ 'manual': self.actionManual,
+ 'about': self.actionAbout,
+ 'loadFile': self.btnLoadFileonClick,
+ 'save': self.actionSave,
+ 'saveAs': self.actionSaveAs,
+ 'transform': self.btnCustTransformOnClick,
+ 'commandPalette': self.enterCustomCommand,
+ 'clearGuide': self.clearGuides,
+ 'finalizeAddObj': self.finalizeAddObj,
+ 'finalizeCurve': self.finalizeCurve,
+ 'finalizeCurveClosed': self.finalizeCurveClosed,
+ 'setMag': self.setMagPrompt,
+ 'deleteObject': self.btnSelectiveDeleteOnClick,
+ 'anchorMode': self.switchToAnchorMode,
+ 'moveUp': lambda: self.arrowButtons(0, 1, False),
+ 'moveDown': lambda: self.arrowButtons(0, -1, False),
+
+ 'scrollLeft': lambda: self.arrowButtons(-1, 0, True),
+ 'scrollRight': lambda: self.arrowButtons(1, 0, True),
+ 'scrollUp': lambda: self.arrowButtons(0, 1, True),
+ 'scrollDown': lambda: self.arrowButtons(0, -1, True),
+
+ 'zoomIn': lambda: self.arrowButtons(0, 1, False, True),
+ 'zoomOut': lambda: self.arrowButtons(0, -1, False, True)
+ }
+
+ self.hiddenKeys = set()
+
+ # Coordinates Label
+
+ self.coordLabel = Qw.QLabel(self.ui.statusbar)
+ self.ui.statusbar.addPermanentWidget(self.coordLabel)
+
+ # Settings Initialization
+ # from xasyoptions config file
+ self.loadKeyMaps()
+ self.setupXasyOptions()
+
+ self.colorDialog = Qw.QColorDialog(x2a.asyPen.convertToQColor(self._currentPen.color), self)
+ self.initPenInterface()
+
+ def arrowButtons(self, x:int , y:int, shift: bool=False, ctrl: bool=False):
+ "x, y indicates update button orientation on the cartesian plane."
+ if not (shift or ctrl):
+ self.changeSelection(y)
+ elif not (shift and ctrl):
+ self.mouseWheel(30*x, 30*y)
+ self.quickUpdate()
+
+ def cleanup(self):
+ self.asyengine.cleanup()
+
+ def getScrsTransform(self):
+ # pipeline:
+ # assuming origin <==> top left
+ # (Pan) * (Translate) * (Flip the images) * (Zoom) * (Obj transform) * (Base Information)
+
+ # pipeline --> let x, y be the postscript point
+ # p = (mx + cx + panoffset, -ny + cy + panoffset)
+ cx, cy = self.canvSize.width() / 2, self.canvSize.height() / 2
+
+ newTransf = Qg.QTransform()
+ newTransf.translate(*self.panOffset)
+ newTransf.translate(cx, cy)
+ newTransf.scale(1, 1)
+ newTransf.scale(self.magnification, self.magnification)
+
+ return newTransf
+
+ def finalizeCurve(self):
+ if self.addMode is not None:
+ if self.addMode.active and isinstance(self.addMode, InplaceAddObj.AddBezierShape):
+ self.addMode.forceFinalize()
+ self.fileChanged = True
+
+ def finalizeCurveClosed(self):
+ if self.addMode is not None:
+ if self.addMode.active and isinstance(self.addMode, InplaceAddObj.AddBezierShape):
+ self.addMode.finalizeClosure()
+ self.fileChanged = True
+
+ def getAllBoundingBox(self) -> Qc.QRectF:
+ newRect = Qc.QRectF()
+ for majitem in self.drawObjects:
+ for minitem in majitem:
+ newRect = newRect.united(minitem.boundingBox)
+ return newRect
+
+ def finalizeAddObj(self):
+ if self.addMode is not None:
+ if self.addMode.active:
+ self.addMode.forceFinalize()
+ self.fileChanged = True
+
+ def openAndReloadSettings(self):
+ settingsFile = self.settings.settingsFileLocation()
+ subprocess.run(args=self.getExternalEditor(asypath=settingsFile))
+ self.settings.load()
+ self.quickUpdate()
+
+ def setMagPrompt(self):
+ commandText, result = Qw.QInputDialog.getText(self, '', 'Enter magnification:')
+ if result:
+ self.magnification = float(commandText)
+ self.currAddOptions['magnification'] = self.magnification
+ self.quickUpdate()
+
+ def btnTogglePythonOnClick(self, checked):
+ self.terminalPythonMode = checked
+
+ def internationalize(self):
+ self.ui.btnRotate.setToolTip(self.strings.rotate)
+
+ def handleArguments(self):
+ if self.args.filename is not None:
+ self.loadFile(self.args.filename)
+ else:
+ self.initializeEmptyFile()
+
+ if self.args.language != 'en':
+ self.internationalize()
+
+ def initPenInterface(self):
+ self.ui.txtLineWidth.setText(str(self._currentPen.width))
+ self.updateFrameDispColor()
+
+ def updateFrameDispColor(self):
+ r, g, b = [int(x * 255) for x in self._currentPen.color]
+ self.ui.frameCurrColor.setStyleSheet(MainWindow1.defaultFrameStyle.format(r, g, b))
+
+ def initDebug(self):
+ debugFunc = {
+ }
+ self.commandsFunc = {**self.commandsFunc, **debugFunc}
+
+ def dbgRecomputeCtrl(self):
+ if isinstance(self.addMode, xbi.InteractiveBezierEditor):
+ self.addMode.recalculateCtrls()
+ self.quickUpdate()
+
+ def objectUpdated(self):
+ self.removeAddMode()
+ self.clearSelection()
+ self.asyfyCanvas()
+
+ def connectActions(self):
+ self.ui.actionQuit.triggered.connect(lambda: self.execCustomCommand('quit'))
+ self.ui.actionUndo.triggered.connect(lambda: self.execCustomCommand('undo'))
+ self.ui.actionRedo.triggered.connect(lambda: self.execCustomCommand('redo'))
+ self.ui.actionTransform.triggered.connect(lambda: self.execCustomCommand('transform'))
+
+ self.ui.actionOpen.triggered.connect(self.actionOpen)
+ self.ui.actionSave.triggered.connect(self.actionSave)
+ self.ui.actionSaveAs.triggered.connect(self.actionSaveAs)
+ self.ui.actionManual.triggered.connect(self.actionManual)
+ self.ui.actionAbout.triggered.connect(self.actionAbout)
+ self.ui.actionSettings.triggered.connect(self.openAndReloadSettings)
+ self.ui.actionEnterCommand.triggered.connect(self.enterCustomCommand)
+ self.ui.actionExportAsymptote.triggered.connect(self.btnExportAsyOnClick)
+
+ def setupXasyOptions(self):
+ if self.settings['debugMode']:
+ self.initDebug()
+ newColor = Qg.QColor(self.settings['defaultPenColor'])
+ newWidth = self.settings['defaultPenWidth']
+
+ self._currentPen.setColorFromQColor(newColor)
+ self._currentPen.setWidth(newWidth)
+
+ def connectButtons(self):
+ # Button initialization
+ self.ui.btnUndo.clicked.connect(self.btnUndoOnClick)
+ self.ui.btnRedo.clicked.connect(self.btnRedoOnClick)
+ self.ui.btnLoadFile.clicked.connect(self.btnLoadFileonClick)
+ self.ui.btnSave.clicked.connect(self.btnSaveonClick)
+ self.ui.btnQuickScreenshot.clicked.connect(self.btnQuickScreenshotOnClick)
+
+ # self.ui.btnExportAsy.clicked.connect(self.btnExportAsyOnClick)
+
+ self.ui.btnDrawAxes.clicked.connect(self.btnDrawAxesOnClick)
+# self.ui.btnAsyfy.clicked.connect(lambda: self.asyfyCanvas(True))
+ self.ui.btnSetZoom.clicked.connect(self.setMagPrompt)
+ self.ui.btnResetPan.clicked.connect(self.resetPan)
+ self.ui.btnPanCenter.clicked.connect(self.btnPanCenterOnClick)
+
+ self.ui.btnTranslate.clicked.connect(self.btnTranslateonClick)
+ self.ui.btnRotate.clicked.connect(self.btnRotateOnClick)
+ self.ui.btnScale.clicked.connect(self.btnScaleOnClick)
+ # self.ui.btnSelect.clicked.connect(self.btnSelectOnClick)
+ self.ui.btnPan.clicked.connect(self.btnPanOnClick)
+
+ # self.ui.btnDebug.clicked.connect(self.pauseBtnOnClick)
+ self.ui.btnAlignX.clicked.connect(self.btnAlignXOnClick)
+ self.ui.btnAlignY.clicked.connect(self.btnAlignYOnClick)
+ self.ui.comboAnchor.currentIndexChanged.connect(self.handleAnchorComboIndex)
+ self.ui.btnCustTransform.clicked.connect(self.btnCustTransformOnClick)
+ self.ui.btnViewCode.clicked.connect(self.btnLoadEditorOnClick)
+
+ self.ui.btnAnchor.clicked.connect(self.btnAnchorModeOnClick)
+
+ self.ui.btnSelectColor.clicked.connect(self.btnColorSelectOnClick)
+ self.ui.txtLineWidth.textEdited.connect(self.txtLineWithEdited)
+
+ # self.ui.btnCreateCurve.clicked.connect(self.btnCreateCurveOnClick)
+ self.ui.btnDrawGrid.clicked.connect(self.btnDrawGridOnClick)
+
+ self.ui.btnAddCircle.clicked.connect(self.btnAddCircleOnClick)
+ self.ui.btnAddPoly.clicked.connect(self.btnAddPolyOnClick)
+ self.ui.btnAddLabel.clicked.connect(self.btnAddLabelOnClick)
+ # self.ui.btnAddBezierInplace.clicked.connect(self.btnAddBezierInplaceOnClick)
+ self.ui.btnClosedCurve.clicked.connect(self.btnAddClosedCurveOnClick)
+ self.ui.btnOpenCurve.clicked.connect(self.btnAddOpenCurveOnClick)
+ self.ui.btnClosedPoly.clicked.connect(self.btnAddClosedLineOnClick)
+ self.ui.btnOpenPoly.clicked.connect(self.btnAddOpenLineOnClick)
+
+ self.ui.btnFill.clicked.connect(self.btnFillOnClick)
+
+ self.ui.btnSendBackwards.clicked.connect(self.btnSendBackwardsOnClick)
+ self.ui.btnSendForwards.clicked.connect(self.btnSendForwardsOnClick)
+ # self.ui.btnDelete.clicked.connect(self.btnSelectiveDeleteOnClick)
+ self.ui.btnDeleteMode.clicked.connect(self.btnDeleteModeOnClick)
+ # self.ui.btnSoftDelete.clicked.connect(self.btnSoftDeleteOnClick)
+ self.ui.btnToggleVisible.clicked.connect(self.btnSetVisibilityOnClick)
+
+ self.ui.btnEnterCommand.clicked.connect(self.btnTerminalCommandOnClick)
+ self.ui.btnTogglePython.clicked.connect(self.btnTogglePythonOnClick)
+ self.ui.btnSelectEdit.clicked.connect(self.btnSelectEditOnClick)
+
+ def btnDeleteModeOnClick(self):
+ self.currentModeStack = [SelectionMode.delete]
+ self.ui.statusbar.showMessage('Delete Mode')
+ self.clearSelection()
+ self.updateChecks()
+
+ def btnTerminalCommandOnClick(self):
+ if self.terminalPythonMode:
+ exec(self.ui.txtTerminalPrompt.text())
+ self.fileChanged = True
+ else:
+ pass
+ # TODO: How to handle this case?
+ # Like AutoCAD?
+ self.ui.txtTerminalPrompt.clear()
+
+ def btnFillOnClick(self, checked):
+ self.currAddOptions['fill'] = checked
+ self.ui.btnOpenCurve.setEnabled(not checked)
+ self.ui.btnOpenPoly.setEnabled(not checked)
+
+ def btnSelectEditOnClick(self):
+ self.ui.statusbar.showMessage('Edit mode')
+ self.currentModeStack = [SelectionMode.selectEdit]
+ self.updateChecks()
+
+ @property
+ def currentPen(self):
+ return x2a.asyPen.fromAsyPen(self._currentPen)
+ pass
+ def debug(self):
+ print('Put a breakpoint here.')
+
+ def execPythonCmd(self):
+ commandText, result = Qw.QInputDialog.getText(self, '', 'enter python cmd')
+ if result:
+ exec(commandText)
+
+ def deleteAddOptions(self):
+ if self.currAddOptionsWgt is not None:
+ self.currAddOptionsWgt.hide()
+ self.ui.addOptionLayout.removeWidget(self.currAddOptionsWgt)
+ self.currAddOptionsWgt = None
+
+ def updateOptionWidget(self):
+ try:
+ self.addMode.objectCreated.disconnect()
+ except Exception:
+ pass
+
+ self.currentModeStack[-1] = None
+ self.addMode.objectCreated.connect(self.addInPlace)
+ self.updateModeBtnsOnly()
+
+
+ self.deleteAddOptions()
+
+ self.currAddOptionsWgt = self.addMode.createOptWidget(self.currAddOptions)
+ if self.currAddOptionsWgt is not None:
+ self.ui.addOptionLayout.addWidget(self.currAddOptionsWgt)
+
+ def addInPlace(self, obj):
+ obj.asyengine = self.asyEngine
+ obj.pen = self.currentPen
+ obj.onCanvas = self.xasyDrawObj
+ obj.setKey(str(self.globalObjectCounter))
+ self.globalObjectCounter = self.globalObjectCounter + 1
+
+ self.fileItems.append(obj)
+ self.fileChanged = True
+ self.addObjCreationUrs(obj)
+ self.asyfyCanvas()
+
+ def addObjCreationUrs(self, obj):
+ newAction = self.createAction(ObjCreationChanges(obj))
+ self.undoRedoStack.add(newAction)
+ self.checkUndoRedoButtons()
+
+ def clearGuides(self):
+ self.currentGuides.clear()
+ self.quickUpdate()
+
+ def btnAddCircleOnClick(self):
+ self.addMode = InplaceAddObj.AddCircle(self)
+ self.ui.statusbar.showMessage('')
+ self.updateOptionWidget()
+
+ LegacyHint='Click and drag to draw; right click or space bar to finalize'
+ Hint='Click and drag to draw; release and click in place to add node; continue dragging'
+ HintClose=' or c to close.'
+
+ def drawHint(self):
+ if self.settings['useLegacyDrawMode']:
+ self.ui.statusbar.showMessage(self.LegacyHint+'.')
+ else:
+ self.ui.statusbar.showMessage(self.Hint+'.')
+
+ def drawHintOpen(self):
+ if self.settings['useLegacyDrawMode']:
+ self.ui.statusbar.showMessage(self.LegacyHint+self.HintClose)
+ else:
+ self.ui.statusbar.showMessage(self.Hint+self.HintClose)
+
+ def btnAddBezierInplaceOnClick(self):
+ self.addMode = InplaceAddObj.AddBezierShape(self)
+ self.updateOptionWidget()
+
+ def btnAddOpenLineOnClick(self):
+ self.currAddOptions['useBezier'] = False
+ self.currAddOptions['closedPath'] = False
+ self.drawHintOpen()
+ self.btnAddBezierInplaceOnClick()
+
+ def btnAddClosedLineOnClick(self):
+ self.currAddOptions['useBezier'] = False
+ self.currAddOptions['closedPath'] = True
+ self.drawHint()
+ self.btnAddBezierInplaceOnClick()
+
+ def btnAddOpenCurveOnClick(self):
+ self.currAddOptions['useBezier'] = True
+ self.currAddOptions['closedPath'] = False
+ self.drawHintOpen()
+ self.btnAddBezierInplaceOnClick()
+
+ def btnAddClosedCurveOnClick(self):
+ self.currAddOptions['useBezier'] = True
+ self.currAddOptions['closedPath'] = True
+ self.drawHint()
+ self.btnAddBezierInplaceOnClick()
+
+ def btnAddPolyOnClick(self):
+ self.addMode = InplaceAddObj.AddPoly(self)
+ self.ui.statusbar.showMessage('')
+ self.updateOptionWidget()
+
+ def btnAddLabelOnClick(self):
+ self.addMode = InplaceAddObj.AddLabel(self)
+ self.ui.statusbar.showMessage('')
+ self.updateOptionWidget()
+
+ def updateCurve(self, valid, newCurve):
+ self.previewCurve = newCurve
+ self.quickUpdate()
+
+ def addTransformationChanges(self, objIndex, transform, isLocal=False):
+ self.undoRedoStack.add(self.createAction(TransformationChanges(objIndex,
+ transform, isLocal)))
+ self.checkUndoRedoButtons()
+
+ def btnSendForwardsOnClick(self):
+ if self.currentlySelectedObj['selectedIndex'] is not None:
+ maj, minor = self.currentlySelectedObj['selectedIndex']
+ selectedObj = self.drawObjects[maj][minor]
+ index = self.fileItems.index(selectedObj.parent())
+
+ self.clearSelection()
+ if index == len(self.fileItems) - 1:
+ return
+ else:
+ self.fileItems[index], self.fileItems[index + 1] = self.fileItems[index + 1], self.fileItems[index]
+ self.asyfyCanvas()
+
+ def btnSelectiveDeleteOnClick(self):
+ if self.currentlySelectedObj['selectedIndex'] is not None:
+ maj, minor = self.currentlySelectedObj['selectedIndex']
+ selectedObj = self.drawObjects[maj][minor]
+
+ parent = selectedObj.parent()
+
+ if isinstance(parent, x2a.xasyScript):
+ self.hiddenKeys.add((selectedObj.key, selectedObj.keyIndex))
+ self.softDeleteObj((maj, minor))
+ else:
+ index = self.fileItems.index(selectedObj.parent())
+
+ self.undoRedoStack.add(self.createAction(
+ HardDeletionChanges(selectedObj.parent(), index)
+ ))
+ self.checkUndoRedoButtons()
+
+ self.fileItems.remove(selectedObj.parent())
+
+ self.fileChanged = True
+ self.clearSelection()
+ self.asyfyCanvas()
+ else:
+ result = self.selectOnHover()
+ if result:
+ self.btnSelectiveDeleteOnClick()
+
+ def btnSetVisibilityOnClick(self):
+ if self.currentlySelectedObj['selectedIndex'] is not None:
+ maj, minor = self.currentlySelectedObj['selectedIndex']
+ selectedObj = self.drawObjects[maj][minor]
+
+ self.hiddenKeys.symmetric_difference_update({(selectedObj.key, selectedObj.keyIndex)})
+ self.clearSelection()
+ self.quickUpdate()
+
+ def btnSendBackwardsOnClick(self):
+ if self.currentlySelectedObj['selectedIndex'] is not None:
+ maj, minor = self.currentlySelectedObj['selectedIndex']
+ selectedObj = self.drawObjects[maj][minor]
+ index = self.fileItems.index(selectedObj.parent())
+
+ self.clearSelection()
+ if index == 0:
+ return
+ else:
+ self.fileItems[index], self.fileItems[index - 1] = self.fileItems[index - 1], self.fileItems[index]
+ self.asyfyCanvas()
+
+
+ def btnUndoOnClick(self):
+ self.undoRedoStack.undo()
+ self.checkUndoRedoButtons()
+
+ def btnRedoOnClick(self):
+ self.undoRedoStack.redo()
+ self.checkUndoRedoButtons()
+
+ def checkUndoRedoButtons(self):
+ self.ui.btnUndo.setEnabled(self.undoRedoStack.changesMade())
+ self.ui.actionUndo.setEnabled(self.undoRedoStack.changesMade())
+
+ self.ui.btnRedo.setEnabled(len(self.undoRedoStack.redoStack) > 0)
+ self.ui.actionRedo.setEnabled(len(self.undoRedoStack.redoStack) > 0)
+
+ def handleUndoChanges(self, change):
+ assert isinstance(change, ActionChanges)
+ if isinstance(change, TransformationChanges):
+ self.transformObject(change.objIndex, change.transformation.inverted(), change.isLocal)
+ elif isinstance(change, ObjCreationChanges):
+ self.fileItems.pop()
+ elif isinstance(change, HardDeletionChanges):
+ self.fileItems.insert(change.objIndex, change.item)
+ self.asyfyCanvas()
+
+ def handleRedoChanges(self, change):
+ assert isinstance(change, ActionChanges)
+ if isinstance(change, TransformationChanges):
+ self.transformObject(
+ change.objIndex, change.transformation, change.isLocal)
+ elif isinstance(change, ObjCreationChanges):
+ self.fileItems.append(change.object)
+ elif isinstance(change, HardDeletionChanges):
+ self.fileItems.remove(change.item)
+ self.asyfyCanvas()
+
+ # is this a "pythonic" way?
+ def createAction(self, changes):
+ def _change():
+ return self.handleRedoChanges(changes)
+
+ def _undoChange():
+ return self.handleUndoChanges(changes)
+
+ return Urs.action((_change, _undoChange))
+
+ def execCustomCommand(self, command):
+ if command in self.commandsFunc:
+ self.commandsFunc[command]()
+ else:
+ self.ui.statusbar.showMessage('Command {0} not found'.format(command))
+
+ def enterCustomCommand(self):
+ commandText, result = Qw.QInputDialog.getText(self, 'Enter Custom Command', 'Enter Custom Command')
+ if result:
+ self.execCustomCommand(commandText)
+
+ def addItemFromPath(self, path):
+ newItem = x2a.xasyShape(path, self.asyEngine, pen=self.currentPen)
+ self.fileItems.append(newItem)
+ self.fileChanged = True
+ self.asyfyCanvas()
+
+ def actionManual(self):
+ asyManualURL = 'http://asymptote.sourceforge.net/asymptote.pdf'
+ webbrowser.open_new(asyManualURL)
+
+ def actionAbout(self):
+ Qw.QMessageBox.about(self,"xasy","This is xasy "+xasyVersion.xasyVersion+"; a graphical front end to the Asymptote vector graphics language: http://asymptote.sourceforge.net/")
+
+ def btnExportAsyOnClick(self):
+ diag = Qw.QFileDialog(self)
+ diag.setAcceptMode(Qw.QFileDialog.AcceptSave)
+
+ formatId = {
+ 'pdf': {
+ 'name': 'PDF Files',
+ 'ext': ['*.pdf']
+ },
+ 'svg': {
+ 'name': 'Scalable Vector Graphics',
+ 'ext': ['*.svg']
+ },
+ 'eps': {
+ 'name': 'Postscript Files',
+ 'ext': ['*.eps']
+ },
+ 'png': {
+ 'name': 'Portable Network Graphics',
+ 'ext': ['*.png']
+ },
+ '*': {
+ 'name': 'Any Files',
+ 'ext': ['*.*']
+ }
+ }
+
+ formats = ['pdf', 'svg', 'eps', 'png', '*']
+
+ formatText = ';;'.join('{0:s} ({1:s})'.format(formatId[form]['name'], ' '.join(formatId[form]['ext']))
+ for form in formats)
+
+ if self.currDir is not None:
+ diag.setDirectory(self.currDir)
+ rawFile = os.path.splitext(os.path.basename(self.filename))[0] + '.pdf'
+ diag.selectFile(rawFile)
+
+ diag.setNameFilter(formatText)
+ diag.show()
+ result = diag.exec_()
+
+ if result != diag.Accepted:
+ return
+
+ finalFiles = diag.selectedFiles()
+
+ with io.StringIO() as finalCode:
+ xf.saveFile(finalCode, self.fileItems, self.asy2psmap)
+ finalString = finalCode.getvalue()
+
+ for file in finalFiles:
+ ext = os.path.splitext(file)
+ if len(ext) < 2:
+ ext = 'pdf'
+ else:
+ ext = ext[1][1:]
+
+ with subprocess.Popen(args=[self.asyPath, '-f{0}'.format(ext), '-o{0}'.format(file), '-'], encoding='utf-8',
+ stdin=subprocess.PIPE) as asy:
+ print('test:', finalString)
+ asy.stdin.write(finalString)
+ asy.stdin.close()
+ asy.wait(timeout=35)
+
+
+ def loadKeyMaps(self):
+ """Inverts the mapping of the key
+ Input map is in format 'Action' : 'Key Sequence' """
+ for action, key in self.keyMaps.options.items():
+ shortcut = Qw.QShortcut(self)
+ shortcut.setKey(Qg.QKeySequence(key))
+
+ # hate doing this, but python doesn't have explicit way to pass a
+ # string to a lambda without an identifier
+ # attached to it.
+ exec('shortcut.activated.connect(lambda: self.execCustomCommand("{0}"))'.format(action),
+ {'self': self, 'shortcut': shortcut})
+
+ def initializeButtons(self):
+ self.ui.btnDrawAxes.setChecked(self.settings['defaultShowAxes'])
+ self.btnDrawAxesOnClick(self.settings['defaultShowAxes'])
+
+ self.ui.btnDrawGrid.setChecked(self.settings['defaultShowGrid'])
+ self.btnDrawGridOnClick(self.settings['defaultShowGrid'])
+
+ def erase(self):
+ self.fileItems.clear()
+ self.fileChanged = False
+
+ def actionOpen(self):
+ if self.fileChanged:
+ save="Save current file?"
+ reply=Qw.QMessageBox.question(self,'Message',save,Qw.QMessageBox.Yes,
+ Qw.QMessageBox.No)
+ if reply == Qw.QMessageBox.Yes:
+ self.actionSave()
+
+ filename = Qw.QFileDialog.getOpenFileName(self, 'Open Asymptote File','', '*.asy')
+ if filename[0]:
+ self.loadFile(filename[0])
+
+ def actionSave(self):
+ if self.filename is None:
+ self.actionSaveAs()
+ else:
+ saveFile = io.open(self.filename, 'w')
+ xf.saveFile(saveFile, self.fileItems, self.asy2psmap)
+ saveFile.close()
+ self.updateScript()
+
+ def updateScript(self):
+ for item in self.fileItems:
+ if isinstance(item, x2a.xasyScript):
+ if item.updatedCode:
+ item.setScript(item.updatedCode)
+ item.updatedCode = None
+
+ def actionSaveAs(self):
+ saveLocation = Qw.QFileDialog.getSaveFileName(self, 'Save File')[0]
+ if saveLocation:
+ saveFile = io.open(saveLocation, 'w')
+ xf.saveFile(saveFile, self.fileItems, self.asy2psmap)
+ saveFile.close()
+ self.filename = saveLocation
+ self.updateScript()
+
+
+ def btnQuickScreenshotOnClick(self):
+ saveLocation = Qw.QFileDialog.getSaveFileName(self, 'Save Screenshot','')
+ if saveLocation[0]:
+ self.ui.imgLabel.pixmap().save(saveLocation[0])
+
+ def btnLoadFileonClick(self):
+ self.actionOpen()
+
+ def btnSaveonClick(self):
+ self.actionSave()
+
+ @Qc.pyqtSlot(int)
+ def handleAnchorComboIndex(self, index: int):
+ self.anchorMode = index
+ if self.anchorMode == AnchorMode.customAnchor:
+ if self.customAnchor is not None:
+ self.anchorMode = AnchorMode.customAnchor
+ else:
+ self.ui.comboAnchor.setCurrentIndex(AnchorMode.center)
+ self.anchorMode = AnchorMode.center
+ self.quickUpdate()
+ def btnColorSelectOnClick(self):
+ self.colorDialog.show()
+ result = self.colorDialog.exec()
+ if result == Qw.QDialog.Accepted:
+ self._currentPen.setColorFromQColor(self.colorDialog.selectedColor())
+ self.updateFrameDispColor()
+
+ def txtLineWithEdited(self, text):
+ new_val = xu.tryParse(text, float)
+ if new_val is not None:
+ if new_val > 0:
+ self._currentPen.setWidth(new_val)
+
+ def isReady(self):
+ return self.mainCanvas is not None
+
+ def resizeEvent(self, resizeEvent):
+ # super().resizeEvent(resizeEvent)
+ assert isinstance(resizeEvent, Qg.QResizeEvent)
+
+ if self.isReady():
+ if self.mainCanvas.isActive():
+ self.mainCanvas.end()
+ self.canvSize = self.ui.imgFrame.size()
+ self.ui.imgFrame.setSizePolicy(Qw.QSizePolicy.Ignored, Qw.QSizePolicy.Ignored)
+ self.canvasPixmap = Qg.QPixmap(self.canvSize)
+ # self.canvasPixmap.setDevicePixelRatio(3)
+ self.postCanvasPixmap = Qg.QPixmap(self.canvSize)
+
+ self.quickUpdate()
+
+ def show(self):
+ super().show()
+ self.createMainCanvas() # somehow, the coordinates doesn't get updated until after showing.
+ self.initializeButtons()
+ self.postShow()
+
+ def postShow(self):
+ self.handleArguments()
+
+ def roundPositionSnap(self, oldPoint):
+ minorGridSize = self.settings['gridMajorAxesSpacing'] / (self.settings['gridMinorAxesCount'] + 1)
+ if isinstance(oldPoint, list) or isinstance(oldPoint, tuple):
+ return [round(val / minorGridSize) * minorGridSize for val in oldPoint]
+ elif isinstance(oldPoint, Qc.QPoint) or isinstance(oldPoint, Qc.QPointF):
+ x, y = oldPoint.x(), oldPoint.y()
+ x = round(x / minorGridSize) * minorGridSize
+ y = round(y / minorGridSize) * minorGridSize
+ return Qc.QPointF(x, y)
+ else:
+ raise Exception
+
+ def getAsyCoordinates(self):
+ canvasPosOrig = self.getCanvasCoordinates()
+ return canvasPosOrig, canvasPosOrig
+
+ def mouseMoveEvent(self, mouseEvent: Qg.QMouseEvent): # TODO: Actually refine grid snapping...
+ if not self.ui.imgLabel.underMouse() and not self.mouseDown:
+ return
+
+ self.updateMouseCoordLabel()
+ asyPos, canvasPos = self.getAsyCoordinates()
+
+ # add mode
+ if self.addMode is not None:
+ if self.addMode.active:
+ self.addMode.mouseMove(asyPos, mouseEvent)
+ self.quickUpdate()
+ return
+
+ # pan mode
+ if self.currentModeStack[-1] == SelectionMode.pan and int(mouseEvent.buttons()) and self.savedWindowMousePos is not None:
+ mousePos = self.getWindowCoordinates()
+ newPos = mousePos - self.savedWindowMousePos
+
+ tx, ty = newPos.x(), newPos.y()
+
+ if self.lockX:
+ tx = 0
+ if self.lockY:
+ ty = 0
+
+ self.panOffset[0] += tx
+ self.panOffset[1] += ty
+
+ self.savedWindowMousePos = self.getWindowCoordinates()
+ self.quickUpdate()
+ return
+
+ # otherwise, in transformation
+ if self.inMidTransformation:
+ if self.currentModeStack[-1] == SelectionMode.translate:
+ newPos = canvasPos - self.savedMousePosition
+ if self.gridSnap:
+ newPos = self.roundPositionSnap(newPos) # actually round to the nearest minor grid afterwards...
+
+ self.tx, self.ty = newPos.x(), newPos.y()
+
+ if self.lockX:
+ self.tx = 0
+ if self.lockY:
+ self.ty = 0
+ self.newTransform = Qg.QTransform.fromTranslate(self.tx, self.ty)
+
+ elif self.currentModeStack[-1] == SelectionMode.rotate:
+ if self.gridSnap:
+ canvasPos = self.roundPositionSnap(canvasPos)
+
+ adjustedSavedMousePos = self.savedMousePosition - self.currentAnchor
+ adjustedCanvasCoords = canvasPos - self.currentAnchor
+
+ origAngle = np.arctan2(adjustedSavedMousePos.y(), adjustedSavedMousePos.x())
+ newAng = np.arctan2(adjustedCanvasCoords.y(), adjustedCanvasCoords.x())
+ self.deltaAngle = newAng - origAngle
+ self.newTransform = xT.makeRotTransform(self.deltaAngle, self.currentAnchor).toQTransform()
+
+ elif self.currentModeStack[-1] == SelectionMode.scale:
+ if self.gridSnap:
+ canvasPos = self.roundPositionSnap(canvasPos)
+ x, y = int(round(canvasPos.x())), int(round(canvasPos.y())) # otherwise it crashes...
+ canvasPos = Qc.QPoint(x, y)
+
+ originalDeltaPts = self.savedMousePosition - self.currentAnchor
+ scaleFactor = Qc.QPointF.dotProduct(canvasPos - self.currentAnchor, originalDeltaPts) /\
+ (xu.twonorm((originalDeltaPts.x(), originalDeltaPts.y())) ** 2)
+ if not self.lockX:
+ self.scaleFactorX = scaleFactor
+ else:
+ self.scaleFactorX = 1
+
+ if not self.lockY:
+ self.scaleFactorY = scaleFactor
+ else:
+ self.scaleFactorY = 1
+
+ self.newTransform = xT.makeScaleTransform(self.scaleFactorX, self.scaleFactorY, self.currentAnchor).\
+ toQTransform()
+
+ self.quickUpdate()
+ return
+
+ # otherwise, select a candinate for selection
+
+ if self.currentlySelectedObj['selectedIndex'] is None:
+ selectedIndex, selKeyList = self.selectObject()
+ if selectedIndex is not None:
+ if self.pendingSelectedObjList != selKeyList:
+ self.pendingSelectedObjList = selKeyList
+ self.pendingSelectedObjIndex = -1
+ else:
+ self.pendingSelectedObjList.clear()
+ self.pendingSelectedObjIndex = -1
+ self.quickUpdate()
+ return
+
+
+ def mouseReleaseEvent(self, mouseEvent):
+ assert isinstance(mouseEvent, Qg.QMouseEvent)
+ if not self.mouseDown:
+ return
+
+ self.mouseDown = False
+ if self.addMode is not None:
+ self.addMode.mouseRelease()
+ if self.inMidTransformation:
+ self.clearSelection()
+ self.inMidTransformation = False
+ self.quickUpdate()
+
+ def clearSelection(self):
+ if self.currentlySelectedObj['selectedIndex'] is not None:
+ self.releaseTransform()
+ self.setAllInSetEnabled(self.objButtons, False)
+ self.currentlySelectedObj['selectedIndex'] = None
+ self.currentlySelectedObj['key'] = None
+
+ self.currentlySelectedObj['allSameKey'].clear()
+ self.newTransform = Qg.QTransform()
+ self.currentBoundingBox = None
+ self.quickUpdate()
+
+ def changeSelection(self, offset):
+ if self.pendingSelectedObjList:
+ if offset > 0:
+ if self.pendingSelectedObjIndex + offset <= -1:
+ self.pendingSelectedObjIndex = self.pendingSelectedObjIndex + offset
+ else:
+ if self.pendingSelectedObjIndex + offset >= -len(self.pendingSelectedObjList):
+ self.pendingSelectedObjIndex = self.pendingSelectedObjIndex + offset
+
+ def mouseWheel(self, rawAngleX: float, rawAngle: float, defaultModifiers: int=0):
+ keyModifiers = int(Qw.QApplication.keyboardModifiers())
+ keyModifiers = keyModifiers | defaultModifiers
+ if keyModifiers & int(Qc.Qt.ControlModifier):
+ oldMag = self.magnification
+
+ cx, cy = self.canvSize.width() / 2, self.canvSize.height() / 2
+ centerPoint = Qc.QPointF(cx, cy) * self.getScrsTransform().inverted()[0]
+
+ self.magnification += (rawAngle/100)
+
+ if self.magnification < self.settings['minimumMagnification']:
+ self.magnification = self.settings['minimumMagnification']
+ elif self.magnification > self.settings['maximumMagnification']:
+ self.magnification = self.settings['maximumMagnification']
+
+ # set the new pan. Let c be the fixed point (center point),
+ # Let m the old mag, n the new mag
+
+ # find t2 such that
+ # mc + t1 = nc + t2 ==> t2 = (m - n)c + t1
+
+ centerPoint = (oldMag - self.magnification) * centerPoint
+
+ self.panOffset = [
+ self.panOffset[0] + centerPoint.x(),
+ self.panOffset[1] + centerPoint.y()
+ ]
+
+ self.currAddOptions['magnification'] = self.magnification
+
+ if self.addMode is xbi.InteractiveBezierEditor:
+ self.addMode.setSelectionBoundaries()
+
+ elif keyModifiers & (int(Qc.Qt.ShiftModifier) | int(Qc.Qt.AltModifier)):
+ self.panOffset[1] += rawAngle/1
+ self.panOffset[0] -= rawAngleX/1
+ # handle scrolling
+ else:
+ # process selection layer change
+ if rawAngle >= 15:
+ self.changeSelection(1)
+ elif rawAngle <= -15:
+ self.changeSelection(-1)
+ self.quickUpdate()
+
+ def wheelEvent(self, event: Qg.QWheelEvent):
+ rawAngle = event.angleDelta().y() / 8
+ rawAngleX = event.angleDelta().x() / 8
+ self.mouseWheel(rawAngleX, rawAngle)
+
+ def selectOnHover(self):
+ """Returns True if selection happened, False otherwise.
+ """
+ if self.pendingSelectedObjList:
+ selectedIndex = self.pendingSelectedObjList[self.pendingSelectedObjIndex]
+ self.pendingSelectedObjList.clear()
+
+ maj, minor = selectedIndex
+
+ self.currentlySelectedObj['selectedIndex'] = selectedIndex
+ self.currentlySelectedObj['key'], self.currentlySelectedObj['allSameKey'] = self.selectObjectSet(
+ )
+
+ self.currentBoundingBox = self.drawObjects[maj][minor].boundingBox
+
+ if self.selectAsGroup:
+ for selItems in self.currentlySelectedObj['allSameKey']:
+ obj = self.drawObjects[selItems[0]][selItems[1]]
+ self.currentBoundingBox = self.currentBoundingBox.united(obj.boundingBox)
+
+ self.origBboxTransform = self.drawObjects[maj][minor].transform.toQTransform()
+ self.newTransform = Qg.QTransform()
+ return True
+ else:
+ return False
+
+ def mousePressEvent(self, mouseEvent: Qg.QMouseEvent):
+ # we make an exception for bezier curve
+ bezierException = False
+ if self.addMode is not None:
+ if self.addMode.active and isinstance(self.addMode, InplaceAddObj.AddBezierShape):
+ bezierException = True
+
+ if not self.ui.imgLabel.underMouse() and not bezierException:
+ return
+
+ self.mouseDown = True
+ asyPos, self.savedMousePosition = self.getAsyCoordinates()
+
+ if self.addMode is not None:
+ self.addMode.mouseDown(asyPos, self.currAddOptions, mouseEvent)
+ elif self.currentModeStack[-1] == SelectionMode.pan:
+ self.savedWindowMousePos = self.getWindowCoordinates()
+ elif self.currentModeStack[-1] == SelectionMode.setAnchor:
+ self.customAnchor = self.savedMousePosition
+ self.currentModeStack.pop()
+
+ self.anchorMode = AnchorMode.customAnchor
+ self.ui.comboAnchor.setCurrentIndex(AnchorMode.customAnchor)
+ self.updateChecks()
+ self.quickUpdate()
+ elif self.inMidTransformation:
+ pass
+ elif self.pendingSelectedObjList:
+ self.selectOnHover()
+
+ if self.currentModeStack[-1] in {SelectionMode.translate, SelectionMode.rotate, SelectionMode.scale}:
+ self.setAllInSetEnabled(self.objButtons, False)
+ self.inMidTransformation = True
+ self.setAnchor()
+ elif self.currentModeStack[-1] == SelectionMode.delete:
+ self.btnSelectiveDeleteOnClick()
+ elif self.currentModeStack[-1] == SelectionMode.selectEdit:
+ self.setupSelectEdit()
+ else:
+ self.setAllInSetEnabled(self.objButtons, True)
+ self.inMidTransformation = False
+ self.setAnchor()
+
+ else:
+ self.setAllInSetEnabled(self.objButtons, False)
+ self.currentBoundingBox = None
+ self.inMidTransformation = False
+ self.clearSelection()
+
+ self.quickUpdate()
+
+ def removeAddMode(self):
+ self.addMode = None
+ self.deleteAddOptions()
+
+ def editFinalized(self):
+ self.addMode.forceFinalize()
+ self.removeAddMode()
+ self.fileChanged = True
+ self.quickUpdate()
+
+ def editRejected(self):
+ self.addMode.resetObj()
+ self.editFinalized()
+
+ def setupSelectEdit(self):
+ """For Select-Edit mode. For now, if the object selected is a bezier curve, opens up a bezier editor"""
+ maj, minor = self.currentlySelectedObj['selectedIndex']
+ obj = self.fileItems[maj]
+ if isinstance(obj, x2a.xasyDrawnItem):
+ # bezier path
+ self.addMode = xbi.InteractiveBezierEditor(self, obj, self.currAddOptions)
+ self.addMode.objectUpdated.connect(self.objectUpdated)
+ self.addMode.editAccepted.connect(self.editFinalized)
+ self.addMode.editRejected.connect(self.editRejected)
+ self.updateOptionWidget()
+ self.currentModeStack[-1] = SelectionMode.selectEdit
+ self.fileChanged = True
+ else:
+ self.clearSelection()
+ self.quickUpdate()
+
+ def setAnchor(self):
+ if self.anchorMode == AnchorMode.center:
+ self.currentAnchor = self.currentBoundingBox.center()
+ elif self.anchorMode == AnchorMode.topLeft:
+ self.currentAnchor = self.currentBoundingBox.bottomLeft() # due to internal image being flipped
+ elif self.anchorMode == AnchorMode.topRight:
+ self.currentAnchor = self.currentBoundingBox.bottomRight()
+ elif self.anchorMode == AnchorMode.bottomLeft:
+ self.currentAnchor = self.currentBoundingBox.topLeft()
+ elif self.anchorMode == AnchorMode.bottomRight:
+ self.currentAnchor = self.currentBoundingBox.topRight()
+ elif self.anchorMode == AnchorMode.customAnchor:
+ self.currentAnchor = self.customAnchor
+ else:
+ self.currentAnchor = Qc.QPointF(0, 0)
+
+ if self.anchorMode != AnchorMode.origin:
+ pass
+ # TODO: Record base points/bbox before hand and use that for
+ # anchor?
+ # adjTransform =
+ # self.drawObjects[selectedIndex].transform.toQTransform()
+ # self.currentAnchor = adjTransform.map(self.currentAnchor)
+
+
+ def releaseTransform(self):
+ if self.newTransform.isIdentity():
+ return
+ newTransform = x2a.asyTransform.fromQTransform(self.newTransform)
+ objKey = self.currentlySelectedObj['selectedIndex']
+ self.addTransformationChanges(objKey, newTransform, not self.useGlobalCoords)
+ self.transformObject(objKey, newTransform, not self.useGlobalCoords)
+
+ def adjustTransform(self, appendTransform):
+ self.screenTransformation = self.screenTransformation * appendTransform
+
+ def createMainCanvas(self):
+ self.canvSize = self.ui.imgFrame.size()
+ self.ui.imgFrame.setSizePolicy(Qw.QSizePolicy.Ignored, Qw.QSizePolicy.Ignored)
+ x, y = self.canvSize.width() / 2, self.canvSize.height() / 2
+
+ self.canvasPixmap = Qg.QPixmap(self.canvSize)
+ self.canvasPixmap.fill()
+
+ self.finalPixmap = Qg.QPixmap(self.canvSize)
+
+ self.preCanvasPixmap = Qg.QPixmap(self.canvSize)
+ self.postCanvasPixmap = Qg.QPixmap(self.canvSize)
+
+ self.mainCanvas = Qg.QPainter(self.canvasPixmap)
+ self.mainCanvas.setRenderHint(Qg.QPainter.Antialiasing)
+ self.mainCanvas.setRenderHint(Qg.QPainter.SmoothPixmapTransform)
+ self.mainCanvas.setRenderHint(Qg.QPainter.HighQualityAntialiasing)
+ self.xasyDrawObj['canvas'] = self.mainCanvas
+
+ self.mainTransformation = Qg.QTransform()
+ self.mainTransformation.scale(1, 1)
+ self.mainTransformation.translate(x, y)
+
+ self.mainCanvas.setTransform(self.getScrsTransform(), True)
+
+ self.ui.imgLabel.setPixmap(self.canvasPixmap)
+
+ def resetPan(self):
+ self.panOffset = [0, 0]
+ self.quickUpdate()
+
+ def btnPanCenterOnClick(self):
+ newCenter = self.getAllBoundingBox().center()
+
+ # adjust to new magnification
+ # technically, doable through getscrstransform()
+ # and subtract pan offset and center points
+ # but it's much more work...
+ newCenter = self.magnification * newCenter
+ self.panOffset = [-newCenter.x(), newCenter.y()]
+
+ self.quickUpdate()
+
+ def selectObject(self):
+ if not self.ui.imgLabel.underMouse():
+ return None, []
+ canvasCoords = self.getCanvasCoordinates()
+ highestDrawPriority = -np.inf
+ collidedObjKey = None
+ rawObjNumList = []
+ for objKeyMaj in range(len(self.drawObjects)):
+ for objKeyMin in range(len(self.drawObjects[objKeyMaj])):
+ obj = self.drawObjects[objKeyMaj][objKeyMin]
+ if obj.collide(canvasCoords) and (obj.key, obj.keyIndex) not in self.hiddenKeys:
+ rawObjNumList.append(((objKeyMaj, objKeyMin), obj.drawOrder))
+ if obj.drawOrder > highestDrawPriority:
+ collidedObjKey = (objKeyMaj, objKeyMin)
+ if collidedObjKey is not None:
+ rawKey = self.drawObjects[collidedObjKey[0]][collidedObjKey[1]].key
+# self.ui.statusbar.showMessage('Collide with {0}, Key is {1}'.format(str(collidedObjKey), rawKey), 2500)
+ self.ui.statusbar.showMessage('Key: {0}'.format(rawKey), 2500)
+ return collidedObjKey, [rawObj[0] for rawObj in sorted(rawObjNumList, key=lambda ordobj: ordobj[1])]
+ else:
+ return None, []
+
+ def selectObjectSet(self):
+ objKey = self.currentlySelectedObj['selectedIndex']
+ if objKey is None:
+ return set()
+ assert isinstance(objKey, (tuple, list)) and len(objKey) == 2
+ rawObj = self.drawObjects[objKey[0]][objKey[1]]
+ rawKey = rawObj.key
+ rawSet = {objKey}
+ for objKeyMaj in range(len(self.drawObjects)):
+ for objKeyMin in range(len(self.drawObjects[objKeyMaj])):
+ obj = self.drawObjects[objKeyMaj][objKeyMin]
+ if obj.key == rawKey:
+ rawSet.add((objKeyMaj, objKeyMin))
+ return rawKey, rawSet
+
+ def getCanvasCoordinates(self):
+ # assert self.ui.imgLabel.underMouse()
+ uiPos = self.mapFromGlobal(Qg.QCursor.pos())
+ canvasPos = self.ui.imgLabel.mapFrom(self, uiPos)
+
+ # Issue: For magnification, should xasy treats this at xasy level, or asy level?
+ return canvasPos * self.getScrsTransform().inverted()[0]
+
+ def getWindowCoordinates(self):
+ # assert self.ui.imgLabel.underMouse()
+ return self.mapFromGlobal(Qg.QCursor.pos())
+
+ def refreshCanvas(self):
+ if self.mainCanvas.isActive():
+ self.mainCanvas.end()
+ self.mainCanvas.begin(self.canvasPixmap)
+ self.mainCanvas.setTransform(self.getScrsTransform())
+
+ def asyfyCanvas(self, force=False):
+ self.drawObjects = []
+ self.populateCanvasWithItems(force)
+ self.quickUpdate()
+ if self.currentModeStack[-1] == SelectionMode.translate:
+ self.ui.statusbar.showMessage(self.strings.asyfyComplete)
+
+ def updateMouseCoordLabel(self):
+ *args, canvasPos = self.getAsyCoordinates()
+ nx, ny = self.asy2psmap.inverted() * (canvasPos.x(), canvasPos.y())
+ self.coordLabel.setText('{0:.2f}, {1:.2f} '.format(nx, ny))
+
+ def quickUpdate(self):
+ self.updateMouseCoordLabel()
+ self.refreshCanvas()
+
+ self.preDraw(self.mainCanvas)
+ self.quickDraw()
+
+ self.mainCanvas.end()
+ self.postDraw()
+ self.updateScreen()
+
+ def quickDraw(self):
+ assert self.isReady()
+ dpi = self.magnification * self.dpi
+ activeItem = None
+ for majorItem in self.drawObjects:
+ for item in majorItem:
+ # hidden objects - toggleable
+ if (item.key, item.keyIndex) in self.hiddenKeys:
+ continue
+ isSelected = item.key == self.currentlySelectedObj['key']
+ if not self.selectAsGroup and isSelected and self.currentlySelectedObj['selectedIndex'] is not None:
+ maj, min_ = self.currentlySelectedObj['selectedIndex']
+ isSelected = isSelected and item is self.drawObjects[maj][min_]
+ if isSelected and self.settings['enableImmediatePreview']:
+ activeItem = item
+ if self.useGlobalCoords:
+ item.draw(self.newTransform, canvas=self.mainCanvas, dpi=dpi)
+ else:
+ item.draw(self.newTransform, applyReverse=True, canvas=self.mainCanvas, dpi=dpi)
+ else:
+ item.draw(canvas=self.mainCanvas, dpi=dpi)
+
+ if self.settings['drawSelectedOnTop']:
+ if self.pendingSelectedObjList:
+ maj, minor = self.pendingSelectedObjList[self.pendingSelectedObjIndex]
+ self.drawObjects[maj][minor].draw(canvas=self.mainCanvas, dpi=dpi)
+ # and apply the preview too...
+ elif activeItem is not None:
+ if self.useGlobalCoords:
+ activeItem.draw(self.newTransform, canvas=self.mainCanvas, dpi=dpi)
+ else:
+ activeItem.draw(self.newTransform, applyReverse=True, canvas=self.mainCanvas, dpi=dpi)
+ activeItem = None
+
+ def updateScreen(self):
+ self.finalPixmap = Qg.QPixmap(self.canvSize)
+ self.finalPixmap.fill(Qc.Qt.black)
+ with Qg.QPainter(self.finalPixmap) as finalPainter:
+ drawPoint = Qc.QPoint(0, 0)
+ # finalPainter.drawPixmap(drawPoint, self.preCanvasPixmap)
+ finalPainter.drawPixmap(drawPoint, self.canvasPixmap)
+ finalPainter.drawPixmap(drawPoint, self.postCanvasPixmap)
+ self.ui.imgLabel.setPixmap(self.finalPixmap)
+
+ def drawCartesianGrid(self, preCanvas):
+ majorGrid = self.settings['gridMajorAxesSpacing'] * self.asy2psmap.xx
+ minorGridCount = self.settings['gridMinorAxesCount']
+
+ majorGridCol = Qg.QColor(self.settings['gridMajorAxesColor'])
+ minorGridCol = Qg.QColor(self.settings['gridMinorAxesColor'])
+
+ panX, panY = self.panOffset
+
+ x_range = (self.canvSize.width() / 2 + (2 * abs(panX)))/self.magnification
+ y_range = (self.canvSize.height() / 2 + (2 * abs(panY)))/self.magnification
+
+ for x in np.arange(0, 2 * x_range + 1, majorGrid): # have to do
+ # this in two stages...
+ preCanvas.setPen(minorGridCol)
+ for xMinor in range(1, minorGridCount + 1):
+ xCoord = x + ((xMinor / (minorGridCount + 1)) * majorGrid)
+ preCanvas.drawLine(Qc.QLine(xCoord, -9999, xCoord, 9999))
+ preCanvas.drawLine(Qc.QLine(-xCoord, -9999, -xCoord, 9999))
+
+ for y in np.arange(0, 2 * y_range + 1, majorGrid):
+ preCanvas.setPen(minorGridCol)
+ for yMinor in range(1, minorGridCount + 1):
+ yCoord = y + ((yMinor / (minorGridCount + 1)) * majorGrid)
+ preCanvas.drawLine(Qc.QLine(-9999, yCoord, 9999, yCoord))
+ preCanvas.drawLine(Qc.QLine(-9999, -yCoord, 9999, -yCoord))
+
+ preCanvas.setPen(majorGridCol)
+ preCanvas.drawLine(Qc.QLine(-9999, y, 9999, y))
+ preCanvas.drawLine(Qc.QLine(-9999, -y, 9999, -y))
+
+ for x in np.arange(0, 2 * x_range + 1, majorGrid):
+ preCanvas.setPen(majorGridCol)
+ preCanvas.drawLine(Qc.QLine(x, -9999, x, 9999))
+ preCanvas.drawLine(Qc.QLine(-x, -9999, -x, 9999))
+
+ def drawPolarGrid(self, preCanvas):
+ center = Qc.QPointF(0, 0)
+ majorGridCol = Qg.QColor(self.settings['gridMajorAxesColor'])
+ minorGridCol = Qg.QColor(self.settings['gridMinorAxesColor'])
+ majorGrid = self.settings['gridMajorAxesSpacing']
+ minorGridCount = self.settings['gridMinorAxesCount']
+
+ majorAxisAng = (np.pi/4) # 45 degrees - for now.
+ minorAxisCount = 2 # 15 degrees each
+
+ subRadiusSize = int(round((majorGrid / (minorGridCount + 1))))
+ subAngleSize = majorAxisAng / (minorAxisCount + 1)
+
+ for radius in range(majorGrid, 9999 + 1, majorGrid):
+ preCanvas.setPen(majorGridCol)
+ preCanvas.drawEllipse(center, radius, radius)
+
+ preCanvas.setPen(minorGridCol)
+
+ for minorRing in range(minorGridCount):
+ subRadius = round(radius - (subRadiusSize * (minorRing + 1)))
+ preCanvas.drawEllipse(center, subRadius, subRadius)
+
+ currAng = majorAxisAng
+ while currAng <= (2 * np.pi):
+ preCanvas.setPen(majorGridCol)
+ p1 = center + (9999 * Qc.QPointF(np.cos(currAng), np.sin(currAng)))
+ preCanvas.drawLine(Qc.QLineF(center, p1))
+
+ preCanvas.setPen(minorGridCol)
+ for minorAngLine in range(minorAxisCount):
+ newAng = currAng - (subAngleSize * (minorAngLine + 1))
+ p1 = center + (9999 * Qc.QPointF(np.cos(newAng), np.sin(newAng)))
+ preCanvas.drawLine(Qc.QLineF(center, p1))
+
+ currAng = currAng + majorAxisAng
+
+ def preDraw(self, painter):
+ # self.preCanvasPixmap.fill(Qc.Qt.white)
+ self.canvasPixmap.fill()
+ preCanvas = painter
+
+ # preCanvas = Qg.QPainter(self.preCanvasPixmap)
+ preCanvas.setTransform(self.getScrsTransform())
+
+ if self.drawAxes:
+ preCanvas.setPen(Qc.Qt.gray)
+ preCanvas.drawLine(Qc.QLine(-9999, 0, 9999, 0))
+ preCanvas.drawLine(Qc.QLine(0, -9999, 0, 9999))
+
+ if self.drawGrid:
+ if self.drawGridMode == GridMode.cartesian:
+ self.drawCartesianGrid(painter)
+ elif self.drawGridMode == GridMode.polar:
+ self.drawPolarGrid(painter)
+
+ if self.currentGuides:
+ for guide in self.currentGuides:
+ guide.drawShape(preCanvas)
+ # preCanvas.end()
+
+ def drawAddModePreview(self, painter):
+ if self.addMode is not None:
+ if self.addMode.active:
+ # Preview Object
+ if self.addMode.getPreview() is not None:
+ painter.setPen(self.currentPen.toQPen())
+ painter.drawPath(self.addMode.getPreview())
+ self.addMode.postDrawPreview(painter)
+
+
+ def drawTransformPreview(self, painter):
+ if self.currentBoundingBox is not None and self.currentlySelectedObj['selectedIndex'] is not None:
+ painter.save()
+ maj, minor = self.currentlySelectedObj['selectedIndex']
+ selObj = self.drawObjects[maj][minor]
+ if not self.useGlobalCoords:
+ painter.save()
+ painter.setTransform(
+ selObj.transform.toQTransform(), True)
+ # painter.setTransform(selObj.baseTransform.toQTransform(), True)
+ painter.setPen(Qc.Qt.gray)
+ painter.drawLine(Qc.QLine(-9999, 0, 9999, 0))
+ painter.drawLine(Qc.QLine(0, -9999, 0, 9999))
+ painter.setPen(Qc.Qt.black)
+ painter.restore()
+
+ painter.setTransform(selObj.getInteriorScrTransform(
+ self.newTransform).toQTransform(), True)
+ painter.drawRect(selObj.localBoundingBox)
+ else:
+ painter.setTransform(self.newTransform, True)
+ painter.drawRect(self.currentBoundingBox)
+ painter.restore()
+
+ def postDraw(self):
+ self.postCanvasPixmap.fill(Qc.Qt.transparent)
+ with Qg.QPainter(self.postCanvasPixmap) as postCanvas:
+ postCanvas.setRenderHints(self.mainCanvas.renderHints())
+ postCanvas.setTransform(self.getScrsTransform())
+
+ self.drawTransformPreview(postCanvas)
+
+ if self.pendingSelectedObjList:
+ maj, minor = self.pendingSelectedObjList[self.pendingSelectedObjIndex]
+ postCanvas.drawRect(self.drawObjects[maj][minor].boundingBox)
+
+ self.drawAddModePreview(postCanvas)
+
+ if self.customAnchor is not None and self.anchorMode == AnchorMode.customAnchor:
+ self.drawAnchorCursor(postCanvas)
+
+ # postCanvas.drawRect(self.getAllBoundingBox())
+
+ def drawAnchorCursor(self, painter):
+ painter.drawEllipse(self.customAnchor, 6, 6)
+ newCirclePath = Qg.QPainterPath()
+ newCirclePath.addEllipse(self.customAnchor, 2, 2)
+
+ painter.fillPath(newCirclePath, Qg.QColor.fromRgb(0, 0, 0))
+
+ def updateModeBtnsOnly(self):
+ if self.currentModeStack[-1] == SelectionMode.translate:
+ activeBtn = self.ui.btnTranslate
+ elif self.currentModeStack[-1] == SelectionMode.rotate:
+ activeBtn = self.ui.btnRotate
+ elif self.currentModeStack[-1] == SelectionMode.scale:
+ activeBtn = self.ui.btnScale
+ elif self.currentModeStack[-1] == SelectionMode.pan:
+ activeBtn = self.ui.btnPan
+ elif self.currentModeStack[-1] == SelectionMode.setAnchor:
+ activeBtn = self.ui.btnAnchor
+ elif self.currentModeStack[-1] == SelectionMode.delete:
+ activeBtn = self.ui.btnDeleteMode
+ elif self.currentModeStack[-1] == SelectionMode.selectEdit:
+ activeBtn = self.ui.btnSelectEdit
+ else:
+ activeBtn = None
+
+
+ disableFill = isinstance(self.addMode, InplaceAddObj.AddBezierShape) and not self.currAddOptions['closedPath']
+ self.ui.btnFill.setEnabled(not disableFill)
+ if disableFill and self.ui.btnFill.isEnabled():
+ self.ui.btnFill.setChecked(not disableFill)
+
+
+ for button in self.modeButtons:
+ button.setChecked(button is activeBtn)
+
+ def updateChecks(self):
+ self.removeAddMode()
+ self.updateModeBtnsOnly()
+ self.quickUpdate()
+
+ def btnAlignXOnClick(self, checked):
+ self.lockY = checked
+ if self.lockX:
+ self.lockX = False
+ self.ui.btnAlignY.setChecked(False)
+
+ def btnAlignYOnClick(self, checked):
+ self.lockX = checked
+ if self.lockY:
+ self.lockY = False
+ self.ui.btnAlignX.setChecked(False)
+
+ def btnAnchorModeOnClick(self):
+ if self.currentModeStack[-1] != SelectionMode.setAnchor:
+ self.currentModeStack.append(SelectionMode.setAnchor)
+ self.updateChecks()
+
+ def switchToAnchorMode(self):
+ if self.currentModeStack[-1] != SelectionMode.setAnchor:
+ self.currentModeStack.append(SelectionMode.setAnchor)
+ self.updateChecks()
+
+ def btnTranslateonClick(self):
+ self.currentModeStack = [SelectionMode.translate]
+ self.ui.statusbar.showMessage('Translate mode')
+ self.clearSelection()
+ self.updateChecks()
+
+ def btnRotateOnClick(self):
+ self.currentModeStack = [SelectionMode.rotate]
+ self.ui.statusbar.showMessage('Rotate mode')
+ self.clearSelection()
+ self.updateChecks()
+
+ def btnScaleOnClick(self):
+ self.currentModeStack = [SelectionMode.scale]
+ self.ui.statusbar.showMessage('Scale mode')
+ self.clearSelection()
+ self.updateChecks()
+
+ def btnPanOnClick(self):
+ self.currentModeStack = [SelectionMode.pan]
+ self.ui.statusbar.showMessage('Pan mode')
+ self.clearSelection()
+ self.updateChecks()
+
+ def btnWorldCoordsOnClick(self, checked):
+ self.useGlobalCoords = checked
+ if not self.useGlobalCoords:
+ self.ui.comboAnchor.setCurrentIndex(AnchorMode.origin)
+ self.setAllInSetEnabled(self.globalTransformOnlyButtons, checked)
+
+ def setAllInSetEnabled(self, widgetSet, enabled):
+ for widget in widgetSet:
+ widget.setEnabled(enabled)
+
+ def btnDrawAxesOnClick(self, checked):
+ self.drawAxes = checked
+ self.quickUpdate()
+
+ def btnDrawGridOnClick(self, checked):
+ self.drawGrid = checked
+ self.quickUpdate()
+
+ def btnCustTransformOnClick(self):
+ matrixDialog = CustMatTransform.CustMatTransform()
+ matrixDialog.show()
+ result = matrixDialog.exec_()
+ if result == Qw.QDialog.Accepted:
+ objKey = self.currentlySelectedObj['selectedIndex']
+ self.transformObject(objKey,
+ matrixDialog.getTransformationMatrix(), not
+ self.useGlobalCoords)
+
+ # for now, unless we update the bouding box transformation.
+ self.clearSelection()
+ self.quickUpdate()
+
+ def btnLoadEditorOnClick(self):
+ if self.fileChanged:
+ save = "Save current file?"
+ reply = Qw.QMessageBox.question(self, 'Message', save, Qw.QMessageBox.Yes,
+ Qw.QMessageBox.No)
+ if reply == Qw.QMessageBox.Yes:
+ self.actionSave()
+
+ rawExternalEditor = self.settings['externalEditor']
+ rawExtEditorArgs = self.settings['externalEditorArgs']
+ execEditor = [rawExternalEditor]
+
+ for arg in rawExtEditorArgs:
+ execEditor.append(string.Template(
+ arg).substitute(asypath=(self.filename)))
+
+ subprocess.Popen(args=execEditor)
+
+ def btnAddCodeOnClick(self):
+ header = """
+// xasy object created at $time
+// Object Number: $uid
+// This header is automatically generated by xasy.
+// Your code here
+"""
+ header = string.Template(header).substitute(time=str(datetime.datetime.now()), uid=str(self.globalObjectCounter))
+
+ with tempfile.TemporaryDirectory() as tmpdir:
+ newPath = os.path.join(tmpdir, 'tmpcode.asy')
+ f = io.open(newPath, 'w')
+ f.write(header)
+ f.close()
+
+ subprocess.run(args=self.getExternalEditor(asypath=newPath))
+
+ f = io.open(newPath, 'r')
+ newItem = x2a.xasyScript(engine=self.asyEngine, canvas=self.xasyDrawObj)
+ newItem.setScript(f.read())
+ f.close()
+
+ # newItem.replaceKey(str(self.globalObjectCounter) + ':')
+ self.fileItems.append(newItem)
+ self.addObjCreationUrs(newItem)
+ self.asyfyCanvas()
+
+ self.globalObjectCounter = self.globalObjectCounter + 1
+ def softDeleteObj(self, objKey):
+ maj, minor = objKey
+ drawObj = self.drawObjects[maj][minor]
+ item = drawObj.originalObj
+ key = drawObj.key
+ keyIndex = drawObj.keyIndex
+
+
+ item.transfKeymap[key][keyIndex].deleted = True
+ # item.asyfied = False
+
+ def getSelectedObjInfo(self, objIndex):
+ maj, minor = objIndex
+ drawObj = self.drawObjects[maj][minor]
+ item = drawObj.originalObj
+ key = drawObj.key
+ keyIndex = drawObj.keyIndex
+
+ return item, key, keyIndex
+
+ def transformObjKey(self, item, key, keyIndex, transform, applyFirst=False, drawObj=None):
+ if isinstance(transform, np.ndarray):
+ obj_transform = x2a.asyTransform.fromNumpyMatrix(transform)
+ elif isinstance(transform, Qg.QTransform):
+ assert transform.isAffine()
+ obj_transform = x2a.asyTransform.fromQTransform(transform)
+ else:
+ obj_transform = transform
+
+ scr_transform = obj_transform
+
+ if not applyFirst:
+ item.transfKeymap[key][keyIndex] = obj_transform * \
+ item.transfKeymap[key][keyIndex]
+ if drawObj is not None:
+ drawObj.transform = scr_transform * drawObj.transform
+ else:
+ item.transfKeymap[key][keyIndex] = item.transfKeymap[key][keyIndex] * obj_transform
+ if drawObj is not None:
+ drawObj.transform = drawObj.transform * scr_transform
+
+ if self.selectAsGroup:
+ for (maj2, min2) in self.currentlySelectedObj['allSameKey']:
+ if (maj2, min2) == (maj, minor):
+ continue
+ obj = self.drawObjects[maj2][min2]
+ newIndex = obj.keyIndex
+ if not applyFirst:
+ item.transfKeymap[key][newIndex] = obj_transform * \
+ item.transfKeymap[key][newIndex]
+ obj.transform = scr_transform * obj.transform
+ else:
+ item.transfKeymap[key][newIndex] = item.transfKeymap[key][newIndex] * obj_transform
+ obj.transform = obj.transform * scr_transform
+
+ self.fileChanged = True
+ self.quickUpdate()
+
+ def transformObject(self, objKey, transform, applyFirst=False):
+ maj, minor = objKey
+ drawObj = self.drawObjects[maj][minor]
+ item, key, keyIndex = self.getSelectedObjInfo(objKey)
+ self.transformObjKey(item, key, keyIndex, transform, applyFirst, drawObj)
+
+ def initializeEmptyFile(self):
+ pass
+
+ def getExternalEditor(self, **kwargs) -> str:
+ rawExternalEditor = self.settings['externalEditor']
+ rawExtEditorArgs = self.settings['externalEditorArgs']
+ execEditor = [rawExternalEditor]
+
+ for arg in rawExtEditorArgs:
+ execEditor.append(string.Template(arg).substitute(**kwargs))
+
+ return execEditor
+
+
+ def loadFile(self, name):
+ filename = os.path.abspath(name)
+ if not os.path.isfile(filename):
+ filename = filename + '.asy'
+
+ if not os.path.isfile(filename):
+ self.ui.statusbar.showMessage('File {0} not found'.format(filename))
+ return
+
+ self.ui.statusbar.showMessage('Load {0}'.format(filename))
+ self.filename = filename
+ self.currDir = os.path.dirname(self.filename)
+
+ self.erase()
+
+ f = open(self.filename, 'rt')
+ try:
+ rawFileStr = f.read()
+ except IOError:
+ Qw.QMessageBox.critical(self, self.strings.fileOpenFailed, self.strings.fileOpenFailedText)
+ else:
+ rawText, transfDict, maxKey = xf.extractTransformsFromFile(rawFileStr)
+ item = x2a.xasyScript(canvas=self.xasyDrawObj, engine=self.asyEngine, transfKeyMap=transfDict)
+
+ item.setScript(rawText)
+ self.fileItems.append(item)
+ self.asyfyCanvas(True)
+
+ maxKey2 = item.getMaxKeyCounter()
+ self.asy2psmap = item.asy2psmap
+ self.globalObjectCounter = max(maxKey + 1, maxKey2)
+ finally:
+ f.close()
+
+ def populateCanvasWithItems(self, forceUpdate=False):
+ self.itemCount = 0
+ for item in self.fileItems:
+ self.drawObjects.append(item.generateDrawObjects(forceUpdate))
diff --git a/Build/source/utils/asymptote/GUI/__init__.py b/Build/source/utils/asymptote/GUI/__init__.py
new file mode 100644
index 00000000000..5f7ce86af66
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/__init__.py
@@ -0,0 +1 @@
+#!/usr/bin/env python3 \ No newline at end of file
diff --git a/Build/source/utils/asymptote/GUI/configs/__init__.py b/Build/source/utils/asymptote/GUI/configs/__init__.py
new file mode 100644
index 00000000000..5f7ce86af66
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/configs/__init__.py
@@ -0,0 +1 @@
+#!/usr/bin/env python3 \ No newline at end of file
diff --git a/Build/source/utils/asymptote/GUI/configs/xasyconfig.cson b/Build/source/utils/asymptote/GUI/configs/xasyconfig.cson
new file mode 100644
index 00000000000..01aaf66c74b
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/configs/xasyconfig.cson
@@ -0,0 +1,57 @@
+# Default Options for xasy
+
+# External editor. $asypath will be replaced by the current file.
+externalEditor: "emacs"
+externalEditorArgs: ["$asypath"]
+
+# Path to Asymptote executable
+asyPath: "asy"
+
+# Overwrites the ASYMPTOTE_DIR Environment variable if set. Otherwise, leaves asymptote to decide.
+asyBaseLocation: null
+
+# Show Debugging Information
+showDebug: false
+
+# Default Pen Options
+defaultPenOptions: ""
+
+# Default Pen Color
+defaultPenColor: "#000000"
+
+#
+defaultPenWidth: 0.5
+useLegacyDrawMode: false
+enableImmediatePreview: true
+useDegrees: false
+groupObjDefault: false
+
+#
+terminalFont: "Courier"
+terminalFontSize: 9
+
+#
+defaultShowAxes: true
+defaultShowGrid: false
+defaultGridSnap: false
+
+# Draw Selected Objects on top of the frame
+drawSelectedOnTop: true
+
+# Grid Settings
+
+gridMajorAxesColor: "#858585"
+gridMinorAxesColor: "#dddddd"
+gridMajorAxesSpacing: 5
+gridMinorAxesCount: 9
+
+# Magnification Settings
+minimumMagnification: 0.01
+maximumMagnification: 100
+
+# Debug Mode
+debugMode: true
+
+# Settings Override for Windows
+windows:
+ externalEditor: "notepad.exe"
diff --git a/Build/source/utils/asymptote/GUI/configs/xasykeymap.cson b/Build/source/utils/asymptote/GUI/configs/xasykeymap.cson
new file mode 100644
index 00000000000..7ab1b34a2fd
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/configs/xasykeymap.cson
@@ -0,0 +1,24 @@
+# Default Keymaps for xasy
+
+commandPalette: "Ctrl+P"
+quit: "Ctrl+Q"
+deleteObject: "Del"
+
+finalizeCurve: "Space"
+finalizeCurveClosed: "c"
+
+anchorMode: "Ctrl+A"
+
+undo: 'Ctrl+Z'
+redo: 'Ctrl+Y'
+
+moveUp: 'Up'
+moveDown: 'Down'
+
+scrollUp: 'Shift+Up'
+scrollDown: 'Shift+Down'
+scrollLeft: 'Shift+Left'
+scrollRight: 'Shift+Right'
+
+zoomIn: 'Ctrl+Up'
+zoomOut: 'Ctrl+Down' \ No newline at end of file
diff --git a/Build/source/utils/asymptote/GUI/icon-list.txt b/Build/source/utils/asymptote/GUI/icon-list.txt
new file mode 100644
index 00000000000..29e301cfd64
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/icon-list.txt
@@ -0,0 +1 @@
+https://superdevresources.com/free-svg-icons/ \ No newline at end of file
diff --git a/Build/source/utils/asymptote/GUI/icons_rc.py b/Build/source/utils/asymptote/GUI/icons_rc.py
new file mode 100644
index 00000000000..c2c877a6bb0
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/icons_rc.py
@@ -0,0 +1,2680 @@
+# -*- coding: utf-8 -*-
+
+# Resource object code
+#
+# Created by: The Resource Compiler for PyQt5 (Qt v5.10.1)
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore
+
+qt_resource_data = b"\
+\x00\x00\x04\x10\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\
+\x30\x27\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x27\x55\x54\x46\
+\x2d\x38\x27\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x54\x68\x69\x73\x20\
+\x66\x69\x6c\x65\x20\x77\x61\x73\x20\x67\x65\x6e\x65\x72\x61\x74\
+\x65\x64\x20\x62\x79\x20\x64\x76\x69\x73\x76\x67\x6d\x20\x32\x2e\
+\x34\x20\x2d\x2d\x3e\x0a\x3c\x73\x76\x67\x20\x68\x65\x69\x67\x68\
+\x74\x3d\x27\x31\x38\x2e\x37\x35\x70\x74\x27\x20\x76\x65\x72\x73\
+\x69\x6f\x6e\x3d\x27\x31\x2e\x31\x27\x20\x76\x69\x65\x77\x42\x6f\
+\x78\x3d\x27\x35\x36\x2e\x34\x30\x39\x34\x20\x35\x33\x2e\x38\x35\
+\x38\x33\x20\x31\x38\x2e\x37\x35\x20\x31\x38\x2e\x37\x35\x27\x20\
+\x77\x69\x64\x74\x68\x3d\x27\x31\x38\x2e\x37\x35\x70\x74\x27\x20\
+\x78\x6d\x6c\x6e\x73\x3d\x27\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\
+\x67\x27\x20\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x27\
+\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
+\x67\x2f\x31\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x27\x3e\x0a\x3c\
+\x67\x20\x69\x64\x3d\x27\x70\x61\x67\x65\x31\x27\x3e\x0a\x3c\x67\
+\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\
+\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\x30\x20\
+\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x35\x2e\x37\x38\x34\x34\
+\x20\x36\x33\x2e\x32\x33\x33\x33\x29\x27\x3e\x0a\x3c\x70\x61\x74\
+\x68\x20\x64\x3d\x27\x4d\x20\x2d\x38\x2e\x36\x35\x37\x33\x34\x20\
+\x38\x2e\x36\x35\x37\x33\x34\x4c\x20\x38\x2e\x36\x35\x37\x33\x34\
+\x20\x38\x2e\x36\x35\x37\x33\x34\x4c\x20\x38\x2e\x36\x35\x37\x33\
+\x34\x20\x2d\x38\x2e\x36\x35\x37\x33\x34\x4c\x20\x2d\x38\x2e\x36\
+\x35\x37\x33\x34\x20\x2d\x38\x2e\x36\x35\x37\x33\x34\x4c\x20\x2d\
+\x38\x2e\x36\x35\x37\x33\x34\x20\x38\x2e\x36\x35\x37\x33\x34\x5a\
+\x27\x20\x66\x69\x6c\x6c\x3d\x27\x6e\x6f\x6e\x65\x27\x20\x73\x74\
+\x72\x6f\x6b\x65\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x20\x73\
+\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3d\x27\x72\
+\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\
+\x65\x6a\x6f\x69\x6e\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\
+\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\x3d\
+\x27\x31\x30\x2e\x30\x33\x37\x35\x27\x20\x73\x74\x72\x6f\x6b\x65\
+\x2d\x77\x69\x64\x74\x68\x3d\x27\x31\x2e\x35\x30\x35\x36\x32\x27\
+\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\
+\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\
+\x39\x36\x32\x36\x34\x20\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\
+\x36\x34\x20\x36\x35\x2e\x37\x38\x34\x34\x20\x36\x33\x2e\x32\x33\
+\x33\x33\x29\x27\x3e\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x27\x4d\
+\x20\x2d\x38\x2e\x36\x35\x37\x33\x34\x20\x2d\x30\x4c\x20\x38\x2e\
+\x36\x35\x37\x33\x34\x20\x30\x27\x20\x66\x69\x6c\x6c\x3d\x27\x6e\
+\x6f\x6e\x65\x27\x20\x73\x74\x72\x6f\x6b\x65\x3d\x27\x23\x30\x30\
+\x30\x30\x30\x30\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\
+\x65\x63\x61\x70\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\
+\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x6a\x6f\x69\x6e\x3d\x27\x72\x6f\
+\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\
+\x72\x6c\x69\x6d\x69\x74\x3d\x27\x31\x30\x2e\x30\x33\x37\x35\x27\
+\x20\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3d\x27\x31\
+\x2e\x35\x30\x35\x36\x32\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\
+\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\
+\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\x30\
+\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x35\x2e\x37\x38\x34\
+\x34\x20\x36\x33\x2e\x32\x33\x33\x33\x29\x27\x3e\x0a\x3c\x70\x61\
+\x74\x68\x20\x64\x3d\x27\x4d\x20\x30\x20\x38\x2e\x36\x35\x37\x33\
+\x34\x4c\x20\x30\x20\x2d\x38\x2e\x36\x35\x37\x33\x34\x27\x20\x66\
+\x69\x6c\x6c\x3d\x27\x6e\x6f\x6e\x65\x27\x20\x73\x74\x72\x6f\x6b\
+\x65\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x20\x73\x74\x72\x6f\
+\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3d\x27\x72\x6f\x75\x6e\
+\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x6a\x6f\
+\x69\x6e\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\
+\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\x3d\x27\x31\x30\
+\x2e\x30\x33\x37\x35\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\
+\x64\x74\x68\x3d\x27\x31\x2e\x35\x30\x35\x36\x32\x27\x2f\x3e\x0a\
+\x3c\x2f\x67\x3e\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\
+\x00\x00\x02\xc9\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
+\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
+\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x73\
+\x74\x79\x6c\x65\x3d\x22\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\
+\x6b\x67\x72\x6f\x75\x6e\x64\x3a\x6e\x65\x77\x20\x30\x20\x30\x20\
+\x35\x31\x32\x20\x35\x31\x32\x3b\x22\x20\x78\x6d\x6c\x3a\x73\x70\
+\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\
+\x0a\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x20\x70\x6f\x69\x6e\x74\x73\
+\x3d\x22\x34\x38\x30\x2c\x32\x35\x36\x20\x33\x38\x34\x2c\x31\x36\
+\x30\x20\x33\x38\x34\x2c\x32\x33\x36\x20\x32\x37\x36\x2c\x32\x33\
+\x36\x20\x32\x37\x36\x2c\x31\x32\x38\x20\x33\x35\x32\x2c\x31\x32\
+\x38\x20\x32\x35\x36\x2c\x33\x32\x20\x31\x36\x30\x2c\x31\x32\x38\
+\x20\x32\x33\x36\x2c\x31\x32\x38\x20\x32\x33\x36\x2c\x32\x33\x36\
+\x20\x31\x32\x38\x2c\x32\x33\x36\x20\x31\x32\x38\x2c\x31\x36\x30\
+\x20\x33\x32\x2c\x32\x35\x36\x20\x31\x32\x38\x2c\x33\x35\x32\x20\
+\x0d\x0a\x09\x31\x32\x38\x2c\x32\x37\x36\x20\x32\x33\x36\x2c\x32\
+\x37\x36\x20\x32\x33\x36\x2c\x33\x38\x34\x20\x31\x36\x30\x2c\x33\
+\x38\x34\x20\x32\x35\x36\x2c\x34\x38\x30\x20\x33\x35\x32\x2c\x33\
+\x38\x34\x20\x32\x37\x35\x2e\x38\x2c\x33\x38\x34\x20\x32\x37\x35\
+\x2e\x34\x2c\x32\x37\x35\x2e\x35\x20\x33\x38\x34\x2c\x32\x37\x35\
+\x2e\x38\x20\x33\x38\x34\x2c\x33\x35\x32\x20\x22\x2f\x3e\x0d\x0a\
+\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\x03\x93\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x38\x2e\x31\x2e\x30\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x4d\x61\x67\x6e\x69\x66\x79\x69\x6e\x67\x5f\x67\x6c\x61\
+\x73\x73\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\
+\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\
+\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\
+\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\
+\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x79\x3d\x22\
+\x30\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\
+\x30\x20\x32\x30\x20\x32\x30\x22\x20\x65\x6e\x61\x62\x6c\x65\x2d\
+\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\x6e\x65\x77\x20\
+\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x20\x78\x6d\x6c\x3a\x73\
+\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\
+\x0d\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x31\x37\x2e\x35\
+\x34\x35\x2c\x31\x35\x2e\x34\x36\x37\x6c\x2d\x33\x2e\x37\x37\x39\
+\x2d\x33\x2e\x37\x37\x39\x63\x30\x2e\x35\x37\x2d\x30\x2e\x39\x33\
+\x35\x2c\x30\x2e\x38\x39\x38\x2d\x32\x2e\x30\x33\x35\x2c\x30\x2e\
+\x38\x39\x38\x2d\x33\x2e\x32\x31\x63\x30\x2d\x33\x2e\x34\x31\x37\
+\x2d\x32\x2e\x39\x36\x31\x2d\x36\x2e\x33\x37\x37\x2d\x36\x2e\x33\
+\x37\x38\x2d\x36\x2e\x33\x37\x37\x0d\x0a\x09\x43\x34\x2e\x38\x36\
+\x39\x2c\x32\x2e\x31\x2c\x32\x2e\x31\x2c\x34\x2e\x38\x37\x2c\x32\
+\x2e\x31\x2c\x38\x2e\x32\x38\x37\x63\x30\x2c\x33\x2e\x34\x31\x36\
+\x2c\x32\x2e\x39\x36\x31\x2c\x36\x2e\x33\x37\x37\x2c\x36\x2e\x33\
+\x37\x37\x2c\x36\x2e\x33\x37\x37\x63\x31\x2e\x31\x33\x37\x2c\x30\
+\x2c\x32\x2e\x32\x2d\x30\x2e\x33\x30\x39\x2c\x33\x2e\x31\x31\x35\
+\x2d\x30\x2e\x38\x34\x34\x6c\x33\x2e\x37\x39\x39\x2c\x33\x2e\x38\
+\x30\x31\x0d\x0a\x09\x63\x30\x2e\x33\x37\x32\x2c\x30\x2e\x33\x37\
+\x31\x2c\x30\x2e\x39\x37\x35\x2c\x30\x2e\x33\x37\x31\x2c\x31\x2e\
+\x33\x34\x36\x2c\x30\x6c\x30\x2e\x39\x34\x33\x2d\x30\x2e\x39\x34\
+\x33\x43\x31\x38\x2e\x30\x35\x31\x2c\x31\x36\x2e\x33\x30\x37\x2c\
+\x31\x37\x2e\x39\x31\x36\x2c\x31\x35\x2e\x38\x33\x38\x2c\x31\x37\
+\x2e\x35\x34\x35\x2c\x31\x35\x2e\x34\x36\x37\x7a\x20\x4d\x34\x2e\
+\x30\x30\x34\x2c\x38\x2e\x32\x38\x37\x0d\x0a\x09\x63\x30\x2d\x32\
+\x2e\x33\x36\x36\x2c\x31\x2e\x39\x31\x37\x2d\x34\x2e\x32\x38\x33\
+\x2c\x34\x2e\x32\x38\x32\x2d\x34\x2e\x32\x38\x33\x63\x32\x2e\x33\
+\x36\x36\x2c\x30\x2c\x34\x2e\x34\x37\x34\x2c\x32\x2e\x31\x30\x37\
+\x2c\x34\x2e\x34\x37\x34\x2c\x34\x2e\x34\x37\x34\x63\x30\x2c\x32\
+\x2e\x33\x36\x35\x2d\x31\x2e\x39\x31\x38\x2c\x34\x2e\x32\x38\x33\
+\x2d\x34\x2e\x32\x38\x33\x2c\x34\x2e\x32\x38\x33\x0d\x0a\x09\x43\
+\x36\x2e\x31\x31\x31\x2c\x31\x32\x2e\x37\x36\x2c\x34\x2e\x30\x30\
+\x34\x2c\x31\x30\x2e\x36\x35\x32\x2c\x34\x2e\x30\x30\x34\x2c\x38\
+\x2e\x32\x38\x37\x7a\x22\x2f\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\
+\x0d\x0a\
+\x00\x00\x03\x46\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
+\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
+\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x73\
+\x74\x79\x6c\x65\x3d\x22\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\
+\x6b\x67\x72\x6f\x75\x6e\x64\x3a\x6e\x65\x77\x20\x30\x20\x30\x20\
+\x35\x31\x32\x20\x35\x31\x32\x3b\x22\x20\x78\x6d\x6c\x3a\x73\x70\
+\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\
+\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\x33\x37\x2e\x35\
+\x2c\x33\x38\x36\x2e\x36\x4c\x33\x30\x36\x2e\x39\x2c\x32\x35\x36\
+\x6c\x31\x33\x30\x2e\x36\x2d\x31\x33\x30\x2e\x36\x63\x31\x34\x2e\
+\x31\x2d\x31\x34\x2e\x31\x2c\x31\x34\x2e\x31\x2d\x33\x36\x2e\x38\
+\x2c\x30\x2d\x35\x30\x2e\x39\x63\x2d\x31\x34\x2e\x31\x2d\x31\x34\
+\x2e\x31\x2d\x33\x36\x2e\x38\x2d\x31\x34\x2e\x31\x2d\x35\x30\x2e\
+\x39\x2c\x30\x4c\x32\x35\x36\x2c\x32\x30\x35\x2e\x31\x4c\x31\x32\
+\x35\x2e\x34\x2c\x37\x34\x2e\x35\x0d\x0a\x09\x63\x2d\x31\x34\x2e\
+\x31\x2d\x31\x34\x2e\x31\x2d\x33\x36\x2e\x38\x2d\x31\x34\x2e\x31\
+\x2d\x35\x30\x2e\x39\x2c\x30\x63\x2d\x31\x34\x2e\x31\x2c\x31\x34\
+\x2e\x31\x2d\x31\x34\x2e\x31\x2c\x33\x36\x2e\x38\x2c\x30\x2c\x35\
+\x30\x2e\x39\x4c\x32\x30\x35\x2e\x31\x2c\x32\x35\x36\x4c\x37\x34\
+\x2e\x35\x2c\x33\x38\x36\x2e\x36\x63\x2d\x31\x34\x2e\x31\x2c\x31\
+\x34\x2e\x31\x2d\x31\x34\x2e\x31\x2c\x33\x36\x2e\x38\x2c\x30\x2c\
+\x35\x30\x2e\x39\x0d\x0a\x09\x63\x31\x34\x2e\x31\x2c\x31\x34\x2e\
+\x31\x2c\x33\x36\x2e\x38\x2c\x31\x34\x2e\x31\x2c\x35\x30\x2e\x39\
+\x2c\x30\x4c\x32\x35\x36\x2c\x33\x30\x36\x2e\x39\x6c\x31\x33\x30\
+\x2e\x36\x2c\x31\x33\x30\x2e\x36\x63\x31\x34\x2e\x31\x2c\x31\x34\
+\x2e\x31\x2c\x33\x36\x2e\x38\x2c\x31\x34\x2e\x31\x2c\x35\x30\x2e\
+\x39\x2c\x30\x43\x34\x35\x31\x2e\x35\x2c\x34\x32\x33\x2e\x34\x2c\
+\x34\x35\x31\x2e\x35\x2c\x34\x30\x30\x2e\x36\x2c\x34\x33\x37\x2e\
+\x35\x2c\x33\x38\x36\x2e\x36\x7a\x22\x2f\x3e\x0d\x0a\x3c\x2f\x73\
+\x76\x67\x3e\x0d\x0a\
+\x00\x00\x00\xdd\
+\x3c\
+\x73\x76\x67\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\
+\x30\x2f\x73\x76\x67\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x38\x22\
+\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x38\x22\x20\x76\x69\x65\x77\
+\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x38\x20\x38\x22\x3e\x0a\x20\
+\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x30\x20\x30\x76\x32\
+\x68\x2e\x35\x63\x30\x2d\x2e\x35\x35\x2e\x34\x35\x2d\x31\x20\x31\
+\x2d\x31\x68\x31\x2e\x35\x76\x35\x2e\x35\x63\x30\x20\x2e\x32\x38\
+\x2d\x2e\x32\x32\x2e\x35\x2d\x2e\x35\x2e\x35\x68\x2d\x2e\x35\x76\
+\x31\x68\x34\x76\x2d\x31\x68\x2d\x2e\x35\x63\x2d\x2e\x32\x38\x20\
+\x30\x2d\x2e\x35\x2d\x2e\x32\x32\x2d\x2e\x35\x2d\x2e\x35\x76\x2d\
+\x35\x2e\x35\x68\x31\x2e\x35\x63\x2e\x35\x35\x20\x30\x20\x31\x20\
+\x2e\x34\x35\x20\x31\x20\x31\x68\x2e\x35\x76\x2d\x32\x68\x2d\x38\
+\x7a\x22\x20\x2f\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\
+\x00\x00\x02\x7f\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
+\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
+\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x73\
+\x74\x79\x6c\x65\x3d\x22\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\
+\x6b\x67\x72\x6f\x75\x6e\x64\x3a\x6e\x65\x77\x20\x30\x20\x30\x20\
+\x35\x31\x32\x20\x35\x31\x32\x3b\x22\x20\x78\x6d\x6c\x3a\x73\x70\
+\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\
+\x0a\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x20\x70\x6f\x69\x6e\x74\x73\
+\x3d\x22\x32\x38\x38\x2c\x39\x36\x20\x33\x33\x37\x2e\x39\x2c\x31\
+\x34\x35\x2e\x39\x20\x32\x37\x34\x2c\x32\x30\x39\x2e\x37\x20\x32\
+\x37\x34\x2c\x32\x30\x39\x2e\x37\x20\x31\x34\x35\x2e\x39\x2c\x33\
+\x33\x37\x2e\x39\x20\x39\x36\x2c\x32\x38\x38\x20\x39\x36\x2c\x34\
+\x31\x36\x20\x32\x32\x34\x2c\x34\x31\x36\x20\x31\x37\x34\x2e\x31\
+\x2c\x33\x36\x36\x2e\x31\x20\x33\x35\x37\x2e\x34\x2c\x31\x38\x32\
+\x2e\x39\x20\x33\x36\x36\x2e\x31\x2c\x31\x37\x34\x2e\x31\x20\x0d\
+\x0a\x09\x34\x31\x36\x2c\x32\x32\x34\x20\x34\x31\x36\x2c\x39\x36\
+\x20\x22\x2f\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\x04\x22\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\
+\x30\x27\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x27\x55\x54\x46\
+\x2d\x38\x27\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x54\x68\x69\x73\x20\
+\x66\x69\x6c\x65\x20\x77\x61\x73\x20\x67\x65\x6e\x65\x72\x61\x74\
+\x65\x64\x20\x62\x79\x20\x64\x76\x69\x73\x76\x67\x6d\x20\x32\x2e\
+\x34\x20\x2d\x2d\x3e\x0a\x3c\x73\x76\x67\x20\x68\x65\x69\x67\x68\
+\x74\x3d\x27\x32\x34\x70\x74\x27\x20\x76\x65\x72\x73\x69\x6f\x6e\
+\x3d\x27\x31\x2e\x31\x27\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x27\
+\x35\x36\x2e\x34\x30\x39\x34\x20\x35\x33\x2e\x38\x35\x38\x33\x20\
+\x32\x34\x20\x32\x34\x27\x20\x77\x69\x64\x74\x68\x3d\x27\x32\x34\
+\x70\x74\x27\x20\x78\x6d\x6c\x6e\x73\x3d\x27\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\
+\x30\x2f\x73\x76\x67\x27\x20\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\
+\x6e\x6b\x3d\x27\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\
+\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\
+\x27\x3e\x0a\x3c\x67\x20\x69\x64\x3d\x27\x70\x61\x67\x65\x31\x27\
+\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\
+\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\
+\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\x2e\
+\x37\x36\x35\x35\x20\x36\x38\x2e\x38\x35\x38\x33\x29\x27\x3e\x0a\
+\x3c\x70\x61\x74\x68\x20\x64\x3d\x27\x4d\x20\x2d\x39\x2e\x33\x39\
+\x31\x31\x38\x20\x2d\x30\x4c\x20\x2d\x36\x2e\x36\x34\x30\x35\x37\
+\x20\x2d\x31\x32\x2e\x30\x34\x35\x4c\x20\x38\x2e\x36\x37\x36\x33\
+\x32\x20\x2d\x36\x2e\x35\x31\x38\x37\x31\x4c\x20\x33\x2e\x33\x32\
+\x30\x32\x38\x20\x36\x2e\x30\x32\x32\x35\x27\x20\x66\x69\x6c\x6c\
+\x3d\x27\x6e\x6f\x6e\x65\x27\x20\x73\x74\x72\x6f\x6b\x65\x3d\x27\
+\x23\x30\x30\x30\x30\x30\x30\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\
+\x6c\x69\x6e\x65\x63\x61\x70\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\
+\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x6a\x6f\x69\x6e\x3d\
+\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6d\
+\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\x3d\x27\x31\x30\x2e\x30\x33\
+\x37\x35\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\
+\x3d\x27\x31\x2e\x37\x35\x36\x35\x36\x27\x2f\x3e\x0a\x3c\x2f\x67\
+\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\
+\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\
+\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\x2e\
+\x37\x36\x35\x35\x20\x36\x38\x2e\x38\x35\x38\x33\x29\x27\x3e\x0a\
+\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x2d\x39\x2e\x33\
+\x39\x31\x31\x38\x27\x20\x63\x79\x3d\x27\x2d\x30\x27\x20\x72\x3d\
+\x27\x33\x2e\x30\x31\x31\x32\x35\x27\x20\x66\x69\x6c\x6c\x3d\x27\
+\x23\x30\x30\x30\x30\x30\x30\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\
+\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\
+\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\
+\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\x2e\x37\x36\
+\x35\x35\x20\x36\x38\x2e\x38\x35\x38\x33\x29\x27\x3e\x0a\x3c\x63\
+\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x2d\x36\x2e\x36\x34\x30\
+\x35\x37\x27\x20\x63\x79\x3d\x27\x2d\x31\x32\x2e\x30\x34\x35\x27\
+\x20\x72\x3d\x27\x33\x2e\x30\x31\x31\x32\x35\x27\x20\x66\x69\x6c\
+\x6c\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x2f\x3e\x0a\x3c\x2f\
+\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\
+\x27\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\
+\x20\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\
+\x2e\x37\x36\x35\x35\x20\x36\x38\x2e\x38\x35\x38\x33\x29\x27\x3e\
+\x0a\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x38\x2e\x36\
+\x37\x36\x33\x32\x27\x20\x63\x79\x3d\x27\x2d\x36\x2e\x35\x31\x38\
+\x37\x31\x27\x20\x72\x3d\x27\x33\x2e\x30\x31\x31\x32\x35\x27\x20\
+\x66\x69\x6c\x6c\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x2f\x3e\
+\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\
+\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\
+\x32\x36\x34\x20\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\
+\x20\x36\x38\x2e\x37\x36\x35\x35\x20\x36\x38\x2e\x38\x35\x38\x33\
+\x29\x27\x3e\x0a\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\
+\x33\x2e\x33\x32\x30\x32\x38\x27\x20\x63\x79\x3d\x27\x36\x2e\x30\
+\x32\x32\x35\x27\x20\x72\x3d\x27\x33\x2e\x30\x31\x31\x32\x35\x27\
+\x20\x66\x69\x6c\x6c\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x2f\
+\x3e\x0a\x3c\x2f\x67\x3e\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\
+\x3e\
+\x00\x00\x03\xb5\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x38\x2e\x31\x2e\x31\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x43\x68\x65\x76\x72\x6f\x6e\x5f\x63\x69\x72\x63\x6c\x65\
+\x64\x5f\x72\x69\x67\x68\x74\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\
+\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
+\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\
+\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\
+\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\
+\x78\x6c\x69\x6e\x6b\x22\x0d\x0a\x09\x20\x78\x3d\x22\x30\x70\x78\
+\x22\x20\x79\x3d\x22\x30\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\
+\x78\x3d\x22\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x20\x65\x6e\
+\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\
+\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x20\
+\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\
+\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\
+\x4d\x31\x31\x2c\x31\x30\x4c\x38\x2e\x36\x39\x38\x2c\x37\x2e\x34\
+\x39\x34\x63\x2d\x30\x2e\x31\x39\x36\x2d\x30\x2e\x31\x39\x38\x2d\
+\x30\x2e\x31\x39\x36\x2d\x30\x2e\x35\x31\x39\x2c\x30\x2d\x30\x2e\
+\x37\x31\x38\x63\x30\x2e\x31\x39\x36\x2d\x30\x2e\x31\x39\x37\x2c\
+\x30\x2e\x35\x31\x35\x2d\x30\x2e\x31\x39\x37\x2c\x30\x2e\x37\x31\
+\x2c\x30\x6c\x32\x2e\x38\x30\x37\x2c\x32\x2e\x38\x36\x34\x0d\x0a\
+\x09\x63\x30\x2e\x31\x39\x36\x2c\x30\x2e\x31\x39\x39\x2c\x30\x2e\
+\x31\x39\x36\x2c\x30\x2e\x35\x32\x2c\x30\x2c\x30\x2e\x37\x31\x37\
+\x6c\x2d\x32\x2e\x38\x30\x37\x2c\x32\x2e\x38\x36\x34\x63\x2d\x30\
+\x2e\x31\x39\x35\x2c\x30\x2e\x31\x39\x39\x2d\x30\x2e\x35\x31\x34\
+\x2c\x30\x2e\x31\x39\x38\x2d\x30\x2e\x37\x31\x2c\x30\x63\x2d\x30\
+\x2e\x31\x39\x36\x2d\x30\x2e\x31\x39\x37\x2d\x30\x2e\x31\x39\x36\
+\x2d\x30\x2e\x35\x31\x38\x2c\x30\x2d\x30\x2e\x37\x31\x37\x4c\x31\
+\x31\x2c\x31\x30\x7a\x20\x4d\x31\x30\x2c\x30\x2e\x34\x0d\x0a\x09\
+\x63\x35\x2e\x33\x30\x32\x2c\x30\x2c\x39\x2e\x36\x2c\x34\x2e\x32\
+\x39\x38\x2c\x39\x2e\x36\x2c\x39\x2e\x36\x63\x30\x2c\x35\x2e\x33\
+\x30\x33\x2d\x34\x2e\x32\x39\x38\x2c\x39\x2e\x36\x2d\x39\x2e\x36\
+\x2c\x39\x2e\x36\x53\x30\x2e\x34\x2c\x31\x35\x2e\x33\x30\x33\x2c\
+\x30\x2e\x34\x2c\x31\x30\x43\x30\x2e\x34\x2c\x34\x2e\x36\x39\x38\
+\x2c\x34\x2e\x36\x39\x38\x2c\x30\x2e\x34\x2c\x31\x30\x2c\x30\x2e\
+\x34\x7a\x20\x4d\x31\x30\x2c\x31\x38\x2e\x33\x35\x34\x0d\x0a\x09\
+\x63\x34\x2e\x36\x31\x33\x2c\x30\x2c\x38\x2e\x33\x35\x34\x2d\x33\
+\x2e\x37\x34\x2c\x38\x2e\x33\x35\x34\x2d\x38\x2e\x33\x35\x34\x63\
+\x30\x2d\x34\x2e\x36\x31\x34\x2d\x33\x2e\x37\x34\x31\x2d\x38\x2e\
+\x33\x35\x34\x2d\x38\x2e\x33\x35\x34\x2d\x38\x2e\x33\x35\x34\x63\
+\x2d\x34\x2e\x36\x31\x35\x2c\x30\x2d\x38\x2e\x33\x35\x34\x2c\x33\
+\x2e\x37\x34\x2d\x38\x2e\x33\x35\x34\x2c\x38\x2e\x33\x35\x34\x0d\
+\x0a\x09\x43\x31\x2e\x36\x34\x35\x2c\x31\x34\x2e\x36\x31\x34\x2c\
+\x35\x2e\x33\x38\x35\x2c\x31\x38\x2e\x33\x35\x34\x2c\x31\x30\x2c\
+\x31\x38\x2e\x33\x35\x34\x7a\x22\x2f\x3e\x0d\x0a\x3c\x2f\x73\x76\
+\x67\x3e\x0d\x0a\
+\x00\x00\x02\x79\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
+\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
+\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
+\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
+\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
+\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
+\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x69\x64\x3d\
+\x22\x49\x63\x6f\x6e\x5f\x31\x5f\x22\x3e\x0d\x0a\x09\x3c\x67\x3e\
+\x0d\x0a\x09\x09\x3c\x67\x3e\x0d\x0a\x09\x09\x09\x3c\x70\x6f\x6c\
+\x79\x67\x6f\x6e\x20\x70\x6f\x69\x6e\x74\x73\x3d\x22\x31\x38\x36\
+\x2e\x33\x30\x31\x2c\x33\x33\x39\x2e\x38\x39\x33\x20\x39\x36\x2c\
+\x32\x34\x39\x2e\x34\x36\x31\x20\x36\x34\x2c\x32\x37\x39\x2e\x39\
+\x36\x38\x20\x31\x38\x36\x2e\x33\x30\x31\x2c\x34\x30\x32\x20\x34\
+\x34\x38\x2c\x31\x34\x30\x2e\x35\x30\x36\x20\x34\x31\x36\x2c\x31\
+\x31\x30\x20\x09\x09\x09\x22\x2f\x3e\x0d\x0a\x09\x09\x3c\x2f\x67\
+\x3e\x0d\x0a\x09\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\
+\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\x04\x79\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x38\x2e\x31\x2e\x30\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x43\x6f\x64\x65\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\
+\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\
+\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\
+\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\
+\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\x79\x3d\
+\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x20\x65\x6e\x61\
+\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\
+\x6e\x65\x77\x20\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x20\x78\
+\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\
+\x76\x65\x22\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\
+\x35\x2e\x37\x31\x39\x2c\x31\x34\x2e\x37\x35\x63\x2d\x30\x2e\x32\
+\x33\x36\x2c\x30\x2d\x30\x2e\x34\x37\x34\x2d\x30\x2e\x30\x38\x33\
+\x2d\x30\x2e\x36\x36\x34\x2d\x30\x2e\x32\x35\x32\x4c\x2d\x30\x2e\
+\x30\x30\x35\x2c\x31\x30\x6c\x35\x2e\x33\x34\x31\x2d\x34\x2e\x37\
+\x34\x38\x43\x35\x2e\x37\x34\x38\x2c\x34\x2e\x38\x38\x37\x2c\x36\
+\x2e\x33\x38\x2c\x34\x2e\x39\x32\x32\x2c\x36\x2e\x37\x34\x37\x2c\
+\x35\x2e\x33\x33\x35\x0d\x0a\x09\x63\x30\x2e\x33\x36\x37\x2c\x30\
+\x2e\x34\x31\x33\x2c\x30\x2e\x33\x33\x2c\x31\x2e\x30\x34\x35\x2d\
+\x30\x2e\x30\x38\x33\x2c\x31\x2e\x34\x31\x32\x4c\x33\x2e\x30\x30\
+\x35\x2c\x31\x30\x6c\x33\x2e\x33\x37\x38\x2c\x33\x2e\x30\x30\x32\
+\x63\x30\x2e\x34\x31\x33\x2c\x30\x2e\x33\x36\x37\x2c\x30\x2e\x34\
+\x35\x2c\x30\x2e\x39\x39\x39\x2c\x30\x2e\x30\x38\x33\x2c\x31\x2e\
+\x34\x31\x32\x0d\x0a\x09\x43\x36\x2e\x32\x36\x39\x2c\x31\x34\x2e\
+\x36\x33\x37\x2c\x35\x2e\x39\x39\x34\x2c\x31\x34\x2e\x37\x35\x2c\
+\x35\x2e\x37\x31\x39\x2c\x31\x34\x2e\x37\x35\x7a\x20\x4d\x31\x34\
+\x2e\x36\x36\x34\x2c\x31\x34\x2e\x37\x34\x38\x4c\x32\x30\x2e\x30\
+\x30\x35\x2c\x31\x30\x6c\x2d\x35\x2e\x30\x36\x2d\x34\x2e\x34\x39\
+\x38\x63\x2d\x30\x2e\x34\x31\x33\x2d\x30\x2e\x33\x36\x37\x2d\x31\
+\x2e\x30\x34\x35\x2d\x30\x2e\x33\x33\x2d\x31\x2e\x34\x31\x31\x2c\
+\x30\x2e\x30\x38\x33\x0d\x0a\x09\x63\x2d\x30\x2e\x33\x36\x37\x2c\
+\x30\x2e\x34\x31\x33\x2d\x30\x2e\x33\x33\x2c\x31\x2e\x30\x34\x35\
+\x2c\x30\x2e\x30\x38\x33\x2c\x31\x2e\x34\x31\x32\x4c\x31\x36\x2e\
+\x39\x39\x35\x2c\x31\x30\x6c\x2d\x33\x2e\x36\x35\x39\x2c\x33\x2e\
+\x32\x35\x32\x63\x2d\x30\x2e\x34\x31\x33\x2c\x30\x2e\x33\x36\x37\
+\x2d\x30\x2e\x34\x35\x2c\x30\x2e\x39\x39\x39\x2d\x30\x2e\x30\x38\
+\x33\x2c\x31\x2e\x34\x31\x32\x43\x31\x33\x2e\x34\x35\x2c\x31\x34\
+\x2e\x38\x38\x37\x2c\x31\x33\x2e\x37\x32\x35\x2c\x31\x35\x2c\x31\
+\x34\x2c\x31\x35\x0d\x0a\x09\x43\x31\x34\x2e\x32\x33\x36\x2c\x31\
+\x35\x2c\x31\x34\x2e\x34\x37\x34\x2c\x31\x34\x2e\x39\x31\x37\x2c\
+\x31\x34\x2e\x36\x36\x34\x2c\x31\x34\x2e\x37\x34\x38\x7a\x20\x4d\
+\x39\x2e\x39\x38\x36\x2c\x31\x36\x2e\x31\x36\x35\x6c\x32\x2d\x31\
+\x32\x63\x30\x2e\x30\x39\x31\x2d\x30\x2e\x35\x34\x35\x2d\x30\x2e\
+\x32\x37\x37\x2d\x31\x2e\x30\x36\x2d\x30\x2e\x38\x32\x32\x2d\x31\
+\x2e\x31\x35\x31\x0d\x0a\x09\x63\x2d\x30\x2e\x35\x34\x37\x2d\x30\
+\x2e\x30\x39\x32\x2d\x31\x2e\x30\x36\x31\x2c\x30\x2e\x32\x37\x37\
+\x2d\x31\x2e\x31\x35\x2c\x30\x2e\x38\x32\x32\x6c\x2d\x32\x2c\x31\
+\x32\x63\x2d\x30\x2e\x30\x39\x31\x2c\x30\x2e\x35\x34\x35\x2c\x30\
+\x2e\x32\x37\x37\x2c\x31\x2e\x30\x36\x2c\x30\x2e\x38\x32\x32\x2c\
+\x31\x2e\x31\x35\x31\x43\x38\x2e\x38\x39\x32\x2c\x31\x36\x2e\x39\
+\x39\x36\x2c\x38\x2e\x39\x34\x36\x2c\x31\x37\x2c\x39\x2e\x30\x30\
+\x31\x2c\x31\x37\x0d\x0a\x09\x43\x39\x2e\x34\x38\x31\x2c\x31\x37\
+\x2c\x39\x2e\x39\x30\x35\x2c\x31\x36\x2e\x36\x35\x33\x2c\x39\x2e\
+\x39\x38\x36\x2c\x31\x36\x2e\x31\x36\x35\x7a\x22\x2f\x3e\x0d\x0a\
+\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\x04\x30\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\
+\x30\x27\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x27\x55\x54\x46\
+\x2d\x38\x27\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x54\x68\x69\x73\x20\
+\x66\x69\x6c\x65\x20\x77\x61\x73\x20\x67\x65\x6e\x65\x72\x61\x74\
+\x65\x64\x20\x62\x79\x20\x64\x76\x69\x73\x76\x67\x6d\x20\x32\x2e\
+\x34\x20\x2d\x2d\x3e\x0a\x3c\x73\x76\x67\x20\x68\x65\x69\x67\x68\
+\x74\x3d\x27\x32\x34\x70\x74\x27\x20\x76\x65\x72\x73\x69\x6f\x6e\
+\x3d\x27\x31\x2e\x31\x27\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x27\
+\x35\x36\x2e\x34\x30\x39\x34\x20\x35\x33\x2e\x38\x35\x38\x33\x20\
+\x32\x34\x20\x32\x34\x27\x20\x77\x69\x64\x74\x68\x3d\x27\x32\x34\
+\x70\x74\x27\x20\x78\x6d\x6c\x6e\x73\x3d\x27\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\
+\x30\x2f\x73\x76\x67\x27\x20\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\
+\x6e\x6b\x3d\x27\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\
+\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\
+\x27\x3e\x0a\x3c\x67\x20\x69\x64\x3d\x27\x70\x61\x67\x65\x31\x27\
+\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\
+\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\
+\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\x2e\
+\x37\x36\x35\x35\x20\x36\x38\x2e\x38\x35\x38\x33\x29\x27\x3e\x0a\
+\x3c\x70\x61\x74\x68\x20\x64\x3d\x27\x4d\x20\x2d\x39\x2e\x33\x39\
+\x31\x31\x38\x20\x2d\x30\x4c\x20\x2d\x36\x2e\x36\x34\x30\x35\x37\
+\x20\x2d\x31\x32\x2e\x30\x34\x35\x4c\x20\x38\x2e\x36\x37\x36\x33\
+\x32\x20\x2d\x36\x2e\x35\x31\x38\x37\x31\x4c\x20\x33\x2e\x33\x32\
+\x30\x32\x38\x20\x36\x2e\x30\x32\x32\x35\x4c\x20\x2d\x39\x2e\x33\
+\x39\x31\x31\x38\x20\x2d\x30\x5a\x27\x20\x66\x69\x6c\x6c\x3d\x27\
+\x6e\x6f\x6e\x65\x27\x20\x73\x74\x72\x6f\x6b\x65\x3d\x27\x23\x30\
+\x30\x30\x30\x30\x30\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\
+\x6e\x65\x63\x61\x70\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\
+\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x6a\x6f\x69\x6e\x3d\x27\x72\
+\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\
+\x65\x72\x6c\x69\x6d\x69\x74\x3d\x27\x31\x30\x2e\x30\x33\x37\x35\
+\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3d\x27\
+\x31\x2e\x37\x35\x36\x35\x36\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\
+\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\
+\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\
+\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\x2e\x37\x36\
+\x35\x35\x20\x36\x38\x2e\x38\x35\x38\x33\x29\x27\x3e\x0a\x3c\x63\
+\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x2d\x39\x2e\x33\x39\x31\
+\x31\x38\x27\x20\x63\x79\x3d\x27\x2d\x30\x27\x20\x72\x3d\x27\x33\
+\x2e\x30\x31\x31\x32\x35\x27\x20\x66\x69\x6c\x6c\x3d\x27\x23\x30\
+\x30\x30\x30\x30\x30\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\
+\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\
+\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\x30\x20\
+\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\x2e\x37\x36\x35\x35\
+\x20\x36\x38\x2e\x38\x35\x38\x33\x29\x27\x3e\x0a\x3c\x63\x69\x72\
+\x63\x6c\x65\x20\x63\x78\x3d\x27\x2d\x36\x2e\x36\x34\x30\x35\x37\
+\x27\x20\x63\x79\x3d\x27\x2d\x31\x32\x2e\x30\x34\x35\x27\x20\x72\
+\x3d\x27\x33\x2e\x30\x31\x31\x32\x35\x27\x20\x66\x69\x6c\x6c\x3d\
+\x27\x23\x30\x30\x30\x30\x30\x30\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\
+\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\
+\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\
+\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\x2e\x37\
+\x36\x35\x35\x20\x36\x38\x2e\x38\x35\x38\x33\x29\x27\x3e\x0a\x3c\
+\x63\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x38\x2e\x36\x37\x36\
+\x33\x32\x27\x20\x63\x79\x3d\x27\x2d\x36\x2e\x35\x31\x38\x37\x31\
+\x27\x20\x72\x3d\x27\x33\x2e\x30\x31\x31\x32\x35\x27\x20\x66\x69\
+\x6c\x6c\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x2f\x3e\x0a\x3c\
+\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\
+\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\
+\x34\x20\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\
+\x38\x2e\x37\x36\x35\x35\x20\x36\x38\x2e\x38\x35\x38\x33\x29\x27\
+\x3e\x0a\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x33\x2e\
+\x33\x32\x30\x32\x38\x27\x20\x63\x79\x3d\x27\x36\x2e\x30\x32\x32\
+\x35\x27\x20\x72\x3d\x27\x33\x2e\x30\x31\x31\x32\x35\x27\x20\x66\
+\x69\x6c\x6c\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x2f\x3e\x0a\
+\x3c\x2f\x67\x3e\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\
+\x00\x00\x07\x80\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
+\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
+\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
+\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
+\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
+\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
+\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x09\
+\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x31\x39\x33\x2e\x34\x36\
+\x2c\x32\x34\x39\x2e\x30\x35\x36\x63\x33\x2e\x37\x32\x33\x2d\x30\
+\x2e\x36\x37\x2c\x37\x2e\x35\x38\x39\x2d\x31\x2e\x30\x34\x31\x2c\
+\x31\x31\x2e\x35\x38\x36\x2d\x31\x2e\x30\x34\x31\x4c\x32\x30\x31\
+\x2e\x39\x32\x34\x2c\x32\x34\x38\x68\x31\x30\x33\x2e\x38\x32\x33\
+\x63\x34\x2e\x35\x30\x33\x2c\x30\x2c\x38\x2e\x38\x30\x36\x2d\x30\
+\x2e\x36\x31\x37\x2c\x31\x32\x2e\x39\x30\x38\x2d\x31\x2e\x37\x35\
+\x34\x0d\x0a\x09\x09\x63\x31\x39\x2e\x33\x37\x2d\x35\x2e\x33\x36\
+\x33\x2c\x33\x33\x2e\x33\x34\x35\x2d\x32\x32\x2e\x35\x33\x37\x2c\
+\x33\x33\x2e\x33\x34\x35\x2d\x34\x33\x2e\x36\x36\x33\x76\x2d\x33\
+\x30\x2e\x38\x32\x32\x76\x2d\x35\x36\x2e\x34\x30\x32\x63\x30\x2d\
+\x32\x34\x2e\x38\x33\x32\x2d\x32\x31\x2e\x31\x35\x2d\x34\x33\x2e\
+\x34\x38\x34\x2d\x34\x36\x2e\x32\x38\x39\x2d\x34\x37\x2e\x36\x30\
+\x36\x0d\x0a\x09\x09\x63\x2d\x31\x35\x2e\x39\x33\x31\x2d\x32\x2e\
+\x36\x32\x34\x2d\x33\x39\x2e\x32\x35\x38\x2d\x33\x2e\x38\x32\x37\
+\x2d\x35\x35\x2e\x30\x38\x39\x2d\x33\x2e\x37\x34\x39\x63\x2d\x31\
+\x35\x2e\x38\x32\x39\x2c\x30\x2e\x30\x38\x36\x2d\x33\x30\x2e\x39\
+\x38\x31\x2c\x31\x2e\x34\x30\x34\x2d\x34\x34\x2e\x32\x37\x37\x2c\
+\x33\x2e\x37\x34\x39\x43\x31\x36\x37\x2e\x31\x34\x33\x2c\x37\x34\
+\x2e\x35\x37\x36\x2c\x31\x36\x30\x2c\x38\x38\x2e\x39\x32\x38\x2c\
+\x31\x36\x30\x2c\x31\x31\x35\x2e\x33\x35\x39\x56\x31\x34\x34\x68\
+\x39\x36\x0d\x0a\x09\x09\x76\x31\x36\x48\x31\x32\x38\x2e\x38\x32\
+\x63\x2d\x33\x35\x2e\x36\x32\x38\x2c\x30\x2d\x36\x34\x2e\x35\x33\
+\x38\x2c\x34\x32\x2e\x35\x37\x31\x2d\x36\x34\x2e\x38\x31\x33\x2c\
+\x39\x35\x2e\x32\x34\x32\x43\x36\x34\x2e\x30\x30\x35\x2c\x32\x35\
+\x35\x2e\x34\x39\x35\x2c\x36\x34\x2c\x32\x35\x35\x2e\x37\x34\x37\
+\x2c\x36\x34\x2c\x32\x35\x36\x63\x30\x2c\x39\x2e\x35\x32\x33\x2c\
+\x30\x2e\x39\x34\x2c\x31\x38\x2e\x37\x32\x2c\x32\x2e\x36\x38\x35\
+\x2c\x32\x37\x2e\x34\x30\x34\x0d\x0a\x09\x09\x43\x37\x34\x2e\x36\
+\x34\x38\x2c\x33\x32\x33\x2e\x30\x37\x2c\x39\x39\x2e\x34\x35\x31\
+\x2c\x33\x35\x32\x2c\x31\x32\x38\x2e\x38\x32\x2c\x33\x35\x32\x48\
+\x31\x34\x34\x76\x2d\x32\x2e\x36\x36\x32\x76\x2d\x34\x33\x2e\x32\
+\x37\x33\x43\x31\x34\x34\x2c\x32\x37\x39\x2e\x32\x33\x38\x2c\x31\
+\x36\x34\x2e\x31\x34\x36\x2c\x32\x35\x34\x2e\x33\x33\x32\x2c\x31\
+\x39\x33\x2e\x34\x36\x2c\x32\x34\x39\x2e\x30\x35\x36\x7a\x20\x4d\
+\x32\x30\x33\x2e\x36\x35\x36\x2c\x31\x32\x37\x2e\x30\x30\x32\x0d\
+\x0a\x09\x09\x63\x2d\x39\x2e\x35\x39\x32\x2c\x30\x2d\x31\x37\x2e\
+\x33\x38\x34\x2d\x37\x2e\x37\x38\x35\x2d\x31\x37\x2e\x33\x38\x34\
+\x2d\x31\x37\x2e\x34\x30\x33\x63\x30\x2d\x39\x2e\x36\x36\x34\x2c\
+\x37\x2e\x37\x37\x34\x2d\x31\x37\x2e\x35\x32\x2c\x31\x37\x2e\x33\
+\x38\x34\x2d\x31\x37\x2e\x35\x32\x63\x39\x2e\x35\x37\x34\x2c\x30\
+\x2c\x31\x37\x2e\x33\x39\x39\x2c\x37\x2e\x38\x35\x35\x2c\x31\x37\
+\x2e\x33\x39\x39\x2c\x31\x37\x2e\x35\x32\x0d\x0a\x09\x09\x43\x32\
+\x32\x31\x2e\x30\x35\x36\x2c\x31\x31\x39\x2e\x32\x31\x37\x2c\x32\
+\x31\x33\x2e\x32\x34\x36\x2c\x31\x32\x37\x2e\x30\x30\x32\x2c\x32\
+\x30\x33\x2e\x36\x35\x36\x2c\x31\x32\x37\x2e\x30\x30\x32\x7a\x22\
+\x2f\x3e\x0d\x0a\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\
+\x34\x33\x2e\x39\x35\x31\x2c\x32\x32\x32\x2e\x35\x34\x33\x43\x34\
+\x33\x34\x2e\x37\x38\x2c\x31\x38\x36\x2e\x30\x32\x31\x2c\x34\x31\
+\x31\x2e\x30\x33\x33\x2c\x31\x36\x30\x2c\x33\x38\x33\x2e\x31\x38\
+\x2c\x31\x36\x30\x48\x33\x36\x38\x76\x32\x2e\x36\x32\x36\x76\x33\
+\x38\x2e\x30\x34\x36\x63\x30\x2c\x33\x33\x2e\x39\x31\x35\x2d\x32\
+\x32\x2e\x32\x38\x36\x2c\x35\x38\x2e\x34\x37\x34\x2d\x34\x39\x2e\
+\x34\x38\x39\x2c\x36\x32\x2e\x36\x38\x31\x0d\x0a\x09\x09\x63\x2d\
+\x32\x2e\x37\x33\x37\x2c\x30\x2e\x34\x32\x34\x2d\x35\x2e\x34\x38\
+\x33\x2c\x30\x2e\x36\x34\x36\x2d\x38\x2e\x33\x30\x31\x2c\x30\x2e\
+\x36\x34\x36\x48\x32\x30\x36\x2e\x33\x35\x31\x63\x2d\x34\x2e\x35\
+\x31\x38\x2c\x30\x2d\x38\x2e\x39\x30\x34\x2c\x30\x2e\x35\x38\x34\
+\x2d\x31\x33\x2e\x30\x34\x39\x2c\x31\x2e\x36\x37\x32\x43\x31\x37\
+\x34\x2e\x31\x38\x2c\x32\x37\x30\x2e\x36\x38\x39\x2c\x31\x36\x30\
+\x2c\x32\x38\x36\x2e\x36\x2c\x31\x36\x30\x2c\x33\x30\x37\x2e\x32\
+\x33\x36\x76\x33\x32\x2e\x39\x32\x32\x0d\x0a\x09\x09\x76\x35\x34\
+\x2e\x33\x30\x35\x63\x30\x2c\x32\x34\x2e\x38\x33\x32\x2c\x32\x34\
+\x2e\x39\x37\x37\x2c\x33\x39\x2e\x34\x32\x36\x2c\x34\x39\x2e\x34\
+\x38\x31\x2c\x34\x36\x2e\x35\x35\x31\x63\x32\x39\x2e\x33\x32\x37\
+\x2c\x38\x2e\x35\x33\x31\x2c\x36\x31\x2e\x32\x36\x37\x2c\x31\x30\
+\x2e\x30\x36\x38\x2c\x39\x36\x2e\x33\x36\x36\x2c\x30\x43\x33\x32\
+\x39\x2e\x31\x35\x2c\x34\x33\x34\x2e\x33\x35\x34\x2c\x33\x35\x32\
+\x2c\x34\x32\x30\x2e\x38\x39\x33\x2c\x33\x35\x32\x2c\x33\x39\x34\
+\x2e\x34\x36\x33\x56\x33\x36\x38\x0d\x0a\x09\x09\x68\x2d\x39\x36\
+\x76\x2d\x31\x36\x68\x31\x32\x37\x2e\x31\x38\x63\x32\x35\x2e\x32\
+\x34\x2c\x30\x2c\x34\x37\x2e\x31\x30\x37\x2d\x32\x31\x2e\x33\x36\
+\x35\x2c\x35\x37\x2e\x38\x31\x34\x2d\x35\x32\x2e\x35\x34\x39\x43\
+\x34\x34\x35\x2e\x34\x37\x34\x2c\x32\x38\x36\x2e\x34\x30\x34\x2c\
+\x34\x34\x38\x2c\x32\x37\x31\x2e\x36\x34\x31\x2c\x34\x34\x38\x2c\
+\x32\x35\x36\x0d\x0a\x09\x09\x43\x34\x34\x38\x2c\x32\x34\x34\x2e\
+\x32\x33\x32\x2c\x34\x34\x36\x2e\x35\x36\x37\x2c\x32\x33\x32\x2e\
+\x39\x36\x32\x2c\x34\x34\x33\x2e\x39\x35\x31\x2c\x32\x32\x32\x2e\
+\x35\x34\x33\x7a\x20\x4d\x33\x30\x37\x2e\x38\x36\x37\x2c\x33\x38\
+\x32\x2e\x38\x32\x63\x39\x2e\x35\x39\x2c\x30\x2c\x31\x37\x2e\x33\
+\x38\x31\x2c\x37\x2e\x37\x38\x35\x2c\x31\x37\x2e\x33\x38\x31\x2c\
+\x31\x37\x2e\x34\x0d\x0a\x09\x09\x63\x30\x2c\x39\x2e\x36\x35\x2d\
+\x37\x2e\x37\x39\x31\x2c\x31\x37\x2e\x35\x32\x31\x2d\x31\x37\x2e\
+\x33\x38\x31\x2c\x31\x37\x2e\x35\x32\x31\x63\x2d\x39\x2e\x35\x37\
+\x37\x2c\x30\x2d\x31\x37\x2e\x33\x39\x39\x2d\x37\x2e\x38\x37\x31\
+\x2d\x31\x37\x2e\x33\x39\x39\x2d\x31\x37\x2e\x35\x32\x31\x43\x32\
+\x39\x30\x2e\x34\x36\x38\x2c\x33\x39\x30\x2e\x35\x39\x2c\x32\x39\
+\x38\x2e\x32\x37\x34\x2c\x33\x38\x32\x2e\x38\x32\x2c\x33\x30\x37\
+\x2e\x38\x36\x37\x2c\x33\x38\x32\x2e\x38\x32\x7a\x22\x2f\x3e\x0d\
+\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\x05\x27\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
+\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
+\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
+\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
+\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
+\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
+\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x69\x64\x3d\
+\x22\x49\x63\x6f\x6e\x5f\x31\x32\x5f\x22\x3e\x0d\x0a\x09\x3c\x67\
+\x3e\x0d\x0a\x09\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x32\
+\x35\x36\x2c\x36\x34\x43\x31\x35\x30\x2e\x34\x30\x31\x2c\x36\x34\
+\x2c\x36\x34\x2c\x31\x35\x30\x2e\x34\x30\x31\x2c\x36\x34\x2c\x32\
+\x35\x36\x63\x30\x2c\x31\x30\x35\x2e\x36\x30\x34\x2c\x38\x36\x2e\
+\x34\x30\x31\x2c\x31\x39\x32\x2c\x31\x39\x32\x2c\x31\x39\x32\x63\
+\x31\x38\x2e\x31\x33\x36\x2c\x30\x2c\x33\x32\x2d\x31\x33\x2e\x38\
+\x36\x34\x2c\x33\x32\x2d\x33\x32\x0d\x0a\x09\x09\x09\x63\x30\x2d\
+\x38\x2e\x35\x33\x31\x2d\x33\x2e\x31\x39\x38\x2d\x31\x36\x2d\x38\
+\x2e\x35\x33\x31\x2d\x32\x31\x2e\x33\x33\x33\x63\x2d\x35\x2e\x33\
+\x33\x33\x2d\x35\x2e\x33\x33\x34\x2d\x38\x2e\x35\x33\x31\x2d\x31\
+\x32\x2e\x38\x30\x33\x2d\x38\x2e\x35\x33\x31\x2d\x32\x31\x2e\x33\
+\x33\x34\x63\x30\x2d\x31\x38\x2e\x31\x33\x35\x2c\x31\x33\x2e\x38\
+\x36\x34\x2d\x33\x32\x2c\x33\x32\x2d\x33\x32\x68\x33\x38\x2e\x33\
+\x39\x36\x0d\x0a\x09\x09\x09\x63\x35\x38\x2e\x36\x36\x37\x2c\x30\
+\x2c\x31\x30\x36\x2e\x36\x36\x37\x2d\x34\x38\x2c\x31\x30\x36\x2e\
+\x36\x36\x37\x2d\x31\x30\x36\x2e\x36\x36\x36\x43\x34\x34\x38\x2c\
+\x31\x34\x30\x2e\x38\x30\x32\x2c\x33\x36\x31\x2e\x36\x30\x34\x2c\
+\x36\x34\x2c\x32\x35\x36\x2c\x36\x34\x7a\x20\x4d\x31\x33\x38\x2e\
+\x36\x36\x37\x2c\x32\x35\x36\x63\x2d\x31\x38\x2e\x31\x33\x36\x2c\
+\x30\x2d\x33\x32\x2d\x31\x33\x2e\x38\x36\x34\x2d\x33\x32\x2d\x33\
+\x32\x73\x31\x33\x2e\x38\x36\x34\x2d\x33\x32\x2c\x33\x32\x2d\x33\
+\x32\x0d\x0a\x09\x09\x09\x63\x31\x38\x2e\x31\x33\x35\x2c\x30\x2c\
+\x33\x32\x2c\x31\x33\x2e\x38\x36\x34\x2c\x33\x32\x2c\x33\x32\x53\
+\x31\x35\x36\x2e\x38\x30\x32\x2c\x32\x35\x36\x2c\x31\x33\x38\x2e\
+\x36\x36\x37\x2c\x32\x35\x36\x7a\x20\x4d\x32\x30\x32\x2e\x36\x36\
+\x37\x2c\x31\x37\x30\x2e\x36\x36\x37\x63\x2d\x31\x38\x2e\x31\x33\
+\x36\x2c\x30\x2d\x33\x32\x2d\x31\x33\x2e\x38\x36\x35\x2d\x33\x32\
+\x2d\x33\x32\x63\x30\x2d\x31\x38\x2e\x31\x33\x36\x2c\x31\x33\x2e\
+\x38\x36\x34\x2d\x33\x32\x2c\x33\x32\x2d\x33\x32\x0d\x0a\x09\x09\
+\x09\x63\x31\x38\x2e\x31\x33\x35\x2c\x30\x2c\x33\x32\x2c\x31\x33\
+\x2e\x38\x36\x34\x2c\x33\x32\x2c\x33\x32\x43\x32\x33\x34\x2e\x36\
+\x36\x37\x2c\x31\x35\x36\x2e\x38\x30\x32\x2c\x32\x32\x30\x2e\x38\
+\x30\x32\x2c\x31\x37\x30\x2e\x36\x36\x37\x2c\x32\x30\x32\x2e\x36\
+\x36\x37\x2c\x31\x37\x30\x2e\x36\x36\x37\x7a\x20\x4d\x33\x30\x39\
+\x2e\x33\x33\x33\x2c\x31\x37\x30\x2e\x36\x36\x37\x63\x2d\x31\x38\
+\x2e\x31\x33\x35\x2c\x30\x2d\x33\x32\x2d\x31\x33\x2e\x38\x36\x35\
+\x2d\x33\x32\x2d\x33\x32\x0d\x0a\x09\x09\x09\x63\x30\x2d\x31\x38\
+\x2e\x31\x33\x36\x2c\x31\x33\x2e\x38\x36\x35\x2d\x33\x32\x2c\x33\
+\x32\x2d\x33\x32\x63\x31\x38\x2e\x31\x33\x36\x2c\x30\x2c\x33\x32\
+\x2c\x31\x33\x2e\x38\x36\x34\x2c\x33\x32\x2c\x33\x32\x43\x33\x34\
+\x31\x2e\x33\x33\x33\x2c\x31\x35\x36\x2e\x38\x30\x32\x2c\x33\x32\
+\x37\x2e\x34\x36\x39\x2c\x31\x37\x30\x2e\x36\x36\x37\x2c\x33\x30\
+\x39\x2e\x33\x33\x33\x2c\x31\x37\x30\x2e\x36\x36\x37\x7a\x20\x4d\
+\x33\x37\x33\x2e\x33\x33\x33\x2c\x32\x35\x36\x0d\x0a\x09\x09\x09\
+\x63\x2d\x31\x38\x2e\x31\x33\x35\x2c\x30\x2d\x33\x32\x2d\x31\x33\
+\x2e\x38\x36\x34\x2d\x33\x32\x2d\x33\x32\x73\x31\x33\x2e\x38\x36\
+\x35\x2d\x33\x32\x2c\x33\x32\x2d\x33\x32\x63\x31\x38\x2e\x31\x33\
+\x36\x2c\x30\x2c\x33\x32\x2c\x31\x33\x2e\x38\x36\x34\x2c\x33\x32\
+\x2c\x33\x32\x53\x33\x39\x31\x2e\x34\x36\x39\x2c\x32\x35\x36\x2c\
+\x33\x37\x33\x2e\x33\x33\x33\x2c\x32\x35\x36\x7a\x22\x2f\x3e\x0d\
+\x0a\x09\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\
+\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\x02\xa2\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
+\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
+\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
+\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
+\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
+\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
+\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x09\
+\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x31\x32\x38\x2c\x34\x30\
+\x35\x2e\x34\x32\x39\x43\x31\x32\x38\x2c\x34\x32\x38\x2e\x38\x34\
+\x36\x2c\x31\x34\x37\x2e\x31\x39\x38\x2c\x34\x34\x38\x2c\x31\x37\
+\x30\x2e\x36\x36\x37\x2c\x34\x34\x38\x68\x31\x37\x30\x2e\x36\x36\
+\x37\x43\x33\x36\x34\x2e\x38\x30\x32\x2c\x34\x34\x38\x2c\x33\x38\
+\x34\x2c\x34\x32\x38\x2e\x38\x34\x36\x2c\x33\x38\x34\x2c\x34\x30\
+\x35\x2e\x34\x32\x39\x56\x31\x36\x30\x48\x31\x32\x38\x56\x34\x30\
+\x35\x2e\x34\x32\x39\x7a\x20\x4d\x34\x31\x36\x2c\x39\x36\x0d\x0a\
+\x09\x09\x68\x2d\x38\x30\x6c\x2d\x32\x36\x2e\x37\x38\x35\x2d\x33\
+\x32\x48\x32\x30\x32\x2e\x37\x38\x36\x4c\x31\x37\x36\x2c\x39\x36\
+\x48\x39\x36\x76\x33\x32\x68\x33\x32\x30\x56\x39\x36\x7a\x22\x2f\
+\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\
+\x0a\
+\x00\x00\x03\x22\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
+\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
+\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
+\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
+\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
+\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
+\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x09\
+\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x22\x32\x35\x36\x22\
+\x20\x63\x79\x3d\x22\x32\x38\x30\x22\x20\x72\x3d\x22\x36\x33\x22\
+\x2f\x3e\x0d\x0a\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\
+\x34\x30\x2c\x39\x36\x68\x2d\x38\x38\x6c\x2d\x33\x32\x2d\x33\x32\
+\x48\x31\x39\x32\x6c\x2d\x33\x32\x2c\x33\x32\x48\x37\x32\x63\x2d\
+\x32\x32\x2e\x30\x39\x32\x2c\x30\x2d\x34\x30\x2c\x31\x37\x2e\x39\
+\x30\x38\x2d\x34\x30\x2c\x34\x30\x76\x32\x37\x32\x63\x30\x2c\x32\
+\x32\x2e\x30\x39\x32\x2c\x31\x37\x2e\x39\x30\x38\x2c\x34\x30\x2c\
+\x34\x30\x2c\x34\x30\x68\x33\x36\x38\x63\x32\x32\x2e\x30\x39\x32\
+\x2c\x30\x2c\x34\x30\x2d\x31\x37\x2e\x39\x30\x38\x2c\x34\x30\x2d\
+\x34\x30\x0d\x0a\x09\x09\x56\x31\x33\x36\x43\x34\x38\x30\x2c\x31\
+\x31\x33\x2e\x39\x30\x38\x2c\x34\x36\x32\x2e\x30\x39\x32\x2c\x39\
+\x36\x2c\x34\x34\x30\x2c\x39\x36\x7a\x20\x4d\x32\x35\x36\x2c\x33\
+\x39\x32\x63\x2d\x36\x31\x2e\x38\x35\x35\x2c\x30\x2d\x31\x31\x32\
+\x2d\x35\x30\x2e\x31\x34\x35\x2d\x31\x31\x32\x2d\x31\x31\x32\x73\
+\x35\x30\x2e\x31\x34\x35\x2d\x31\x31\x32\x2c\x31\x31\x32\x2d\x31\
+\x31\x32\x73\x31\x31\x32\x2c\x35\x30\x2e\x31\x34\x35\x2c\x31\x31\
+\x32\x2c\x31\x31\x32\x0d\x0a\x09\x09\x53\x33\x31\x37\x2e\x38\x35\
+\x35\x2c\x33\x39\x32\x2c\x32\x35\x36\x2c\x33\x39\x32\x7a\x22\x2f\
+\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\
+\x0a\
+\x00\x00\x02\x7d\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
+\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
+\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
+\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
+\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
+\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
+\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x69\x64\x3d\
+\x22\x49\x63\x6f\x6e\x5f\x38\x5f\x22\x3e\x0d\x0a\x09\x3c\x67\x3e\
+\x0d\x0a\x09\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x38\x35\
+\x2c\x32\x37\x37\x2e\x33\x37\x35\x68\x32\x35\x39\x2e\x37\x30\x34\
+\x4c\x32\x32\x35\x2e\x30\x30\x32\x2c\x33\x39\x37\x2e\x30\x37\x37\
+\x4c\x32\x35\x36\x2c\x34\x32\x37\x6c\x31\x37\x31\x2d\x31\x37\x31\
+\x4c\x32\x35\x36\x2c\x38\x35\x6c\x2d\x32\x39\x2e\x39\x32\x32\x2c\
+\x32\x39\x2e\x39\x32\x34\x6c\x31\x31\x38\x2e\x36\x32\x36\x2c\x31\
+\x31\x39\x2e\x37\x30\x31\x48\x38\x35\x56\x32\x37\x37\x2e\x33\x37\
+\x35\x7a\x22\x2f\x3e\x0d\x0a\x09\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\
+\x67\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\x05\xb7\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\
+\x30\x27\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x27\x55\x54\x46\
+\x2d\x38\x27\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x54\x68\x69\x73\x20\
+\x66\x69\x6c\x65\x20\x77\x61\x73\x20\x67\x65\x6e\x65\x72\x61\x74\
+\x65\x64\x20\x62\x79\x20\x64\x76\x69\x73\x76\x67\x6d\x20\x32\x2e\
+\x34\x20\x2d\x2d\x3e\x0a\x3c\x73\x76\x67\x20\x68\x65\x69\x67\x68\
+\x74\x3d\x27\x32\x34\x70\x74\x27\x20\x76\x65\x72\x73\x69\x6f\x6e\
+\x3d\x27\x31\x2e\x31\x27\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x27\
+\x35\x36\x2e\x34\x30\x39\x34\x20\x35\x33\x2e\x38\x35\x38\x33\x20\
+\x31\x38\x2e\x34\x33\x37\x35\x20\x32\x34\x27\x20\x77\x69\x64\x74\
+\x68\x3d\x27\x31\x38\x2e\x34\x33\x37\x35\x70\x74\x27\x20\x78\x6d\
+\x6c\x6e\x73\x3d\x27\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\
+\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x27\
+\x20\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x27\x68\x74\
+\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\
+\x31\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x27\x3e\x0a\x3c\x67\x20\
+\x69\x64\x3d\x27\x70\x61\x67\x65\x31\x27\x3e\x0a\x3c\x67\x20\x74\
+\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\
+\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\x30\x20\x30\x2e\
+\x39\x39\x36\x32\x36\x34\x20\x36\x35\x2e\x36\x32\x38\x32\x20\x37\
+\x34\x2e\x32\x30\x32\x29\x27\x3e\x0a\x3c\x70\x61\x74\x68\x20\x64\
+\x3d\x27\x4d\x20\x38\x2e\x33\x37\x35\x30\x34\x20\x2d\x31\x31\x2e\
+\x31\x36\x36\x37\x43\x20\x38\x2e\x33\x37\x35\x30\x34\x20\x2d\x31\
+\x32\x2e\x37\x30\x38\x35\x20\x34\x2e\x36\x32\x35\x34\x31\x20\x2d\
+\x31\x33\x2e\x39\x35\x38\x34\x20\x30\x20\x2d\x31\x33\x2e\x39\x35\
+\x38\x34\x43\x20\x2d\x34\x2e\x36\x32\x35\x34\x31\x20\x2d\x31\x33\
+\x2e\x39\x35\x38\x34\x20\x2d\x38\x2e\x33\x37\x35\x30\x34\x20\x2d\
+\x31\x32\x2e\x37\x30\x38\x35\x20\x2d\x38\x2e\x33\x37\x35\x30\x34\
+\x20\x2d\x31\x31\x2e\x31\x36\x36\x37\x43\x20\x2d\x38\x2e\x33\x37\
+\x35\x30\x34\x20\x2d\x39\x2e\x36\x32\x34\x39\x32\x20\x2d\x34\x2e\
+\x36\x32\x35\x34\x31\x20\x2d\x38\x2e\x33\x37\x35\x30\x34\x20\x30\
+\x20\x2d\x38\x2e\x33\x37\x35\x30\x34\x43\x20\x34\x2e\x36\x32\x35\
+\x34\x31\x20\x2d\x38\x2e\x33\x37\x35\x30\x34\x20\x38\x2e\x33\x37\
+\x35\x30\x34\x20\x2d\x39\x2e\x36\x32\x34\x39\x32\x20\x38\x2e\x33\
+\x37\x35\x30\x34\x20\x2d\x31\x31\x2e\x31\x36\x36\x37\x5a\x27\x20\
+\x66\x69\x6c\x6c\x3d\x27\x6e\x6f\x6e\x65\x27\x20\x73\x74\x72\x6f\
+\x6b\x65\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x20\x73\x74\x72\
+\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3d\x27\x72\x6f\x75\
+\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x6a\
+\x6f\x69\x6e\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\
+\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\x3d\x27\x31\
+\x30\x2e\x30\x33\x37\x35\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x77\
+\x69\x64\x74\x68\x3d\x27\x31\x2e\x37\x35\x36\x35\x36\x27\x2f\x3e\
+\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\
+\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\
+\x32\x36\x34\x20\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\
+\x20\x36\x35\x2e\x36\x32\x38\x32\x20\x37\x34\x2e\x32\x30\x32\x29\
+\x27\x3e\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x27\x4d\x20\x2d\x38\
+\x2e\x33\x37\x35\x30\x34\x20\x2d\x31\x31\x2e\x31\x36\x36\x37\x4c\
+\x20\x2d\x38\x2e\x33\x37\x35\x30\x34\x20\x2d\x30\x4c\x20\x2d\x38\
+\x2e\x33\x37\x35\x30\x34\x20\x2d\x31\x2e\x38\x35\x39\x36\x33\x65\
+\x2d\x31\x35\x43\x20\x2d\x38\x2e\x33\x37\x35\x30\x34\x20\x2d\x31\
+\x2e\x32\x33\x39\x37\x35\x65\x2d\x31\x35\x20\x2d\x38\x2e\x33\x37\
+\x35\x30\x34\x20\x2d\x36\x2e\x31\x39\x38\x37\x37\x65\x2d\x31\x36\
+\x20\x2d\x38\x2e\x33\x37\x35\x30\x34\x20\x2d\x30\x43\x20\x2d\x38\
+\x2e\x33\x37\x35\x30\x34\x20\x31\x2e\x35\x34\x31\x38\x20\x2d\x34\
+\x2e\x36\x32\x35\x34\x31\x20\x32\x2e\x37\x39\x31\x36\x38\x20\x30\
+\x20\x32\x2e\x37\x39\x31\x36\x38\x43\x20\x34\x2e\x36\x32\x35\x34\
+\x31\x20\x32\x2e\x37\x39\x31\x36\x38\x20\x38\x2e\x33\x37\x35\x30\
+\x34\x20\x31\x2e\x35\x34\x31\x38\x20\x38\x2e\x33\x37\x35\x30\x34\
+\x20\x30\x4c\x20\x38\x2e\x33\x37\x35\x30\x34\x20\x30\x4c\x20\x38\
+\x2e\x33\x37\x35\x30\x34\x20\x2d\x31\x31\x2e\x31\x36\x36\x37\x27\
+\x20\x66\x69\x6c\x6c\x3d\x27\x6e\x6f\x6e\x65\x27\x20\x73\x74\x72\
+\x6f\x6b\x65\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x20\x73\x74\
+\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3d\x27\x72\x6f\
+\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\
+\x6a\x6f\x69\x6e\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\
+\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\x3d\x27\
+\x31\x30\x2e\x30\x33\x37\x35\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\
+\x77\x69\x64\x74\x68\x3d\x27\x31\x2e\x37\x35\x36\x35\x36\x27\x2f\
+\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\
+\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\
+\x36\x32\x36\x34\x20\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\
+\x34\x20\x36\x35\x2e\x36\x32\x38\x32\x20\x37\x34\x2e\x32\x30\x32\
+\x29\x27\x3e\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x27\x4d\x20\x38\
+\x2e\x33\x37\x35\x30\x34\x20\x2d\x31\x31\x2e\x31\x36\x36\x37\x43\
+\x20\x38\x2e\x33\x37\x35\x30\x34\x20\x2d\x31\x35\x2e\x37\x39\x32\
+\x31\x20\x34\x2e\x36\x32\x35\x34\x31\x20\x2d\x31\x39\x2e\x35\x34\
+\x31\x38\x20\x30\x20\x2d\x31\x39\x2e\x35\x34\x31\x38\x43\x20\x2d\
+\x34\x2e\x36\x32\x35\x34\x31\x20\x2d\x31\x39\x2e\x35\x34\x31\x38\
+\x20\x2d\x38\x2e\x33\x37\x35\x30\x34\x20\x2d\x31\x35\x2e\x37\x39\
+\x32\x31\x20\x2d\x38\x2e\x33\x37\x35\x30\x34\x20\x2d\x31\x31\x2e\
+\x31\x36\x36\x37\x27\x20\x66\x69\x6c\x6c\x3d\x27\x6e\x6f\x6e\x65\
+\x27\x20\x73\x74\x72\x6f\x6b\x65\x3d\x27\x23\x30\x30\x30\x30\x30\
+\x30\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\
+\x70\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\
+\x2d\x6c\x69\x6e\x65\x6a\x6f\x69\x6e\x3d\x27\x72\x6f\x75\x6e\x64\
+\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\
+\x6d\x69\x74\x3d\x27\x31\x30\x2e\x30\x33\x37\x35\x27\x20\x73\x74\
+\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3d\x27\x31\x2e\x37\x35\
+\x36\x35\x36\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x3c\x2f\x67\x3e\x0a\
+\x3c\x2f\x73\x76\x67\x3e\
+\x00\x00\x03\x26\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
+\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
+\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
+\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
+\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
+\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
+\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x09\
+\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x32\x35\x36\x2c\x33\x38\
+\x38\x63\x2d\x37\x32\x2e\x35\x39\x37\x2c\x30\x2d\x31\x33\x32\x2d\
+\x35\x39\x2e\x34\x30\x35\x2d\x31\x33\x32\x2d\x31\x33\x32\x63\x30\
+\x2d\x37\x32\x2e\x36\x30\x31\x2c\x35\x39\x2e\x34\x30\x33\x2d\x31\
+\x33\x32\x2c\x31\x33\x32\x2d\x31\x33\x32\x63\x33\x36\x2e\x33\x2c\
+\x30\x2c\x36\x39\x2e\x32\x39\x39\x2c\x31\x35\x2e\x34\x2c\x39\x32\
+\x2e\x34\x30\x36\x2c\x33\x39\x2e\x36\x30\x31\x4c\x32\x37\x38\x2c\
+\x32\x33\x34\x68\x31\x35\x34\x56\x38\x30\x0d\x0a\x09\x09\x6c\x2d\
+\x35\x31\x2e\x36\x39\x38\x2c\x35\x31\x2e\x37\x30\x32\x43\x33\x34\
+\x38\x2e\x34\x30\x36\x2c\x39\x39\x2e\x37\x39\x38\x2c\x33\x30\x34\
+\x2e\x34\x30\x36\x2c\x38\x30\x2c\x32\x35\x36\x2c\x38\x30\x63\x2d\
+\x39\x36\x2e\x37\x39\x37\x2c\x30\x2d\x31\x37\x36\x2c\x37\x39\x2e\
+\x32\x30\x33\x2d\x31\x37\x36\x2c\x31\x37\x36\x73\x37\x38\x2e\x30\
+\x39\x34\x2c\x31\x37\x36\x2c\x31\x37\x36\x2c\x31\x37\x36\x0d\x0a\
+\x09\x09\x63\x38\x31\x2e\x30\x34\x35\x2c\x30\x2c\x31\x34\x38\x2e\
+\x32\x38\x37\x2d\x35\x34\x2e\x31\x33\x34\x2c\x31\x36\x39\x2e\x34\
+\x30\x31\x2d\x31\x32\x38\x48\x33\x37\x38\x2e\x38\x35\x43\x33\x36\
+\x30\x2e\x31\x30\x35\x2c\x33\x35\x33\x2e\x35\x36\x31\x2c\x33\x31\
+\x31\x2e\x37\x31\x32\x2c\x33\x38\x38\x2c\x32\x35\x36\x2c\x33\x38\
+\x38\x7a\x22\x2f\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\
+\x76\x67\x3e\x0d\x0a\
+\x00\x00\x03\x0c\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x38\x2e\x31\x2e\x30\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x43\x68\x65\x63\x6b\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\
+\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
+\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\
+\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\
+\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\
+\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\x79\
+\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x76\x69\x65\x77\x42\x6f\
+\x78\x3d\x22\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x20\x65\x6e\
+\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\
+\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x20\
+\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\
+\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\
+\x4d\x38\x2e\x32\x39\x34\x2c\x31\x36\x2e\x39\x39\x38\x63\x2d\x30\
+\x2e\x34\x33\x35\x2c\x30\x2d\x30\x2e\x38\x34\x37\x2d\x30\x2e\x32\
+\x30\x33\x2d\x31\x2e\x31\x31\x31\x2d\x30\x2e\x35\x35\x33\x4c\x33\
+\x2e\x36\x31\x2c\x31\x31\x2e\x37\x32\x34\x63\x2d\x30\x2e\x34\x36\
+\x35\x2d\x30\x2e\x36\x31\x33\x2d\x30\x2e\x33\x34\x34\x2d\x31\x2e\
+\x34\x38\x36\x2c\x30\x2e\x32\x37\x2d\x31\x2e\x39\x35\x31\x0d\x0a\
+\x09\x63\x30\x2e\x36\x31\x35\x2d\x30\x2e\x34\x36\x37\x2c\x31\x2e\
+\x34\x38\x38\x2d\x30\x2e\x33\x34\x34\x2c\x31\x2e\x39\x35\x33\x2c\
+\x30\x2e\x32\x37\x6c\x32\x2e\x33\x35\x31\x2c\x33\x2e\x31\x30\x34\
+\x6c\x35\x2e\x39\x31\x31\x2d\x39\x2e\x34\x39\x32\x63\x30\x2e\x34\
+\x30\x37\x2d\x30\x2e\x36\x35\x32\x2c\x31\x2e\x32\x36\x37\x2d\x30\
+\x2e\x38\x35\x32\x2c\x31\x2e\x39\x32\x31\x2d\x30\x2e\x34\x34\x35\
+\x0d\x0a\x09\x63\x30\x2e\x36\x35\x33\x2c\x30\x2e\x34\x30\x36\x2c\
+\x30\x2e\x38\x35\x34\x2c\x31\x2e\x32\x36\x36\x2c\x30\x2e\x34\x34\
+\x36\x2c\x31\x2e\x39\x32\x4c\x39\x2e\x34\x37\x38\x2c\x31\x36\x2e\
+\x33\x34\x63\x2d\x30\x2e\x32\x34\x32\x2c\x30\x2e\x33\x39\x31\x2d\
+\x30\x2e\x36\x36\x31\x2c\x30\x2e\x36\x33\x35\x2d\x31\x2e\x31\x32\
+\x2c\x30\x2e\x36\x35\x36\x43\x38\x2e\x33\x33\x36\x2c\x31\x36\x2e\
+\x39\x39\x38\x2c\x38\x2e\x33\x31\x36\x2c\x31\x36\x2e\x39\x39\x38\
+\x2c\x38\x2e\x32\x39\x34\x2c\x31\x36\x2e\x39\x39\x38\x7a\x22\x2f\
+\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\x02\xfc\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
+\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
+\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
+\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
+\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
+\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
+\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x69\x64\x3d\
+\x22\x49\x63\x6f\x6e\x5f\x32\x30\x5f\x22\x3e\x0d\x0a\x09\x3c\x67\
+\x3e\x0d\x0a\x09\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x32\
+\x35\x36\x2c\x34\x38\x43\x31\x34\x31\x2e\x36\x30\x31\x2c\x34\x38\
+\x2c\x34\x38\x2c\x31\x34\x31\x2e\x36\x30\x31\x2c\x34\x38\x2c\x32\
+\x35\x36\x73\x39\x33\x2e\x36\x30\x31\x2c\x32\x30\x38\x2c\x32\x30\
+\x38\x2c\x32\x30\x38\x73\x32\x30\x38\x2d\x39\x33\x2e\x36\x30\x31\
+\x2c\x32\x30\x38\x2d\x32\x30\x38\x53\x33\x37\x30\x2e\x33\x39\x39\
+\x2c\x34\x38\x2c\x32\x35\x36\x2c\x34\x38\x7a\x20\x4d\x32\x35\x36\
+\x2c\x34\x32\x32\x2e\x33\x39\x39\x0d\x0a\x09\x09\x09\x63\x2d\x39\
+\x31\x2e\x35\x31\x38\x2c\x30\x2d\x31\x36\x36\x2e\x33\x39\x39\x2d\
+\x37\x34\x2e\x38\x38\x32\x2d\x31\x36\x36\x2e\x33\x39\x39\x2d\x31\
+\x36\x36\x2e\x33\x39\x39\x53\x31\x36\x34\x2e\x34\x38\x32\x2c\x38\
+\x39\x2e\x36\x2c\x32\x35\x36\x2c\x38\x39\x2e\x36\x53\x34\x32\x32\
+\x2e\x34\x2c\x31\x36\x34\x2e\x34\x38\x32\x2c\x34\x32\x32\x2e\x34\
+\x2c\x32\x35\x36\x53\x33\x34\x37\x2e\x35\x31\x38\x2c\x34\x32\x32\
+\x2e\x33\x39\x39\x2c\x32\x35\x36\x2c\x34\x32\x32\x2e\x33\x39\x39\
+\x7a\x22\x2f\x3e\x0d\x0a\x09\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x67\
+\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\x03\x4c\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
+\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
+\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
+\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
+\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
+\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
+\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x69\x64\x3d\
+\x22\x49\x63\x6f\x6e\x5f\x32\x31\x5f\x22\x3e\x0d\x0a\x09\x3c\x67\
+\x3e\x0d\x0a\x09\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x32\
+\x35\x36\x2c\x31\x35\x32\x63\x2d\x35\x37\x2e\x32\x2c\x30\x2d\x31\
+\x30\x34\x2c\x34\x36\x2e\x38\x2d\x31\x30\x34\x2c\x31\x30\x34\x73\
+\x34\x36\x2e\x38\x2c\x31\x30\x34\x2c\x31\x30\x34\x2c\x31\x30\x34\
+\x73\x31\x30\x34\x2d\x34\x36\x2e\x38\x2c\x31\x30\x34\x2d\x31\x30\
+\x34\x53\x33\x31\x33\x2e\x32\x2c\x31\x35\x32\x2c\x32\x35\x36\x2c\
+\x31\x35\x32\x7a\x20\x4d\x32\x35\x36\x2c\x34\x38\x0d\x0a\x09\x09\
+\x09\x43\x31\x34\x31\x2e\x36\x30\x31\x2c\x34\x38\x2c\x34\x38\x2c\
+\x31\x34\x31\x2e\x36\x30\x31\x2c\x34\x38\x2c\x32\x35\x36\x73\x39\
+\x33\x2e\x36\x30\x31\x2c\x32\x30\x38\x2c\x32\x30\x38\x2c\x32\x30\
+\x38\x73\x32\x30\x38\x2d\x39\x33\x2e\x36\x30\x31\x2c\x32\x30\x38\
+\x2d\x32\x30\x38\x53\x33\x37\x30\x2e\x33\x39\x39\x2c\x34\x38\x2c\
+\x32\x35\x36\x2c\x34\x38\x7a\x20\x4d\x32\x35\x36\x2c\x34\x32\x32\
+\x2e\x34\x0d\x0a\x09\x09\x09\x63\x2d\x39\x31\x2e\x35\x31\x38\x2c\
+\x30\x2d\x31\x36\x36\x2e\x34\x2d\x37\x34\x2e\x38\x38\x33\x2d\x31\
+\x36\x36\x2e\x34\x2d\x31\x36\x36\x2e\x34\x53\x31\x36\x34\x2e\x34\
+\x38\x32\x2c\x38\x39\x2e\x36\x2c\x32\x35\x36\x2c\x38\x39\x2e\x36\
+\x53\x34\x32\x32\x2e\x34\x2c\x31\x36\x34\x2e\x34\x38\x32\x2c\x34\
+\x32\x32\x2e\x34\x2c\x32\x35\x36\x53\x33\x34\x37\x2e\x35\x31\x38\
+\x2c\x34\x32\x32\x2e\x34\x2c\x32\x35\x36\x2c\x34\x32\x32\x2e\x34\
+\x7a\x22\x2f\x3e\x0d\x0a\x09\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x67\
+\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\x04\x64\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
+\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
+\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
+\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
+\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
+\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
+\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x69\x64\x3d\
+\x22\x49\x63\x6f\x6e\x22\x3e\x0d\x0a\x09\x3c\x67\x3e\x0d\x0a\x09\
+\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x32\x35\x36\x2c\x31\
+\x37\x36\x63\x2d\x34\x34\x2e\x30\x30\x34\x2c\x30\x2d\x38\x30\x2e\
+\x30\x30\x31\x2c\x33\x36\x2d\x38\x30\x2e\x30\x30\x31\x2c\x38\x30\
+\x63\x30\x2c\x34\x34\x2e\x30\x30\x34\x2c\x33\x35\x2e\x39\x39\x37\
+\x2c\x38\x30\x2c\x38\x30\x2e\x30\x30\x31\x2c\x38\x30\x63\x34\x34\
+\x2e\x30\x30\x35\x2c\x30\x2c\x37\x39\x2e\x39\x39\x39\x2d\x33\x35\
+\x2e\x39\x39\x36\x2c\x37\x39\x2e\x39\x39\x39\x2d\x38\x30\x0d\x0a\
+\x09\x09\x09\x43\x33\x33\x35\x2e\x39\x39\x39\x2c\x32\x31\x32\x2c\
+\x33\x30\x30\x2e\x30\x30\x35\x2c\x31\x37\x36\x2c\x32\x35\x36\x2c\
+\x31\x37\x36\x7a\x20\x4d\x34\x34\x36\x2e\x39\x33\x38\x2c\x32\x33\
+\x34\x2e\x36\x36\x37\x63\x2d\x39\x2e\x36\x30\x35\x2d\x38\x38\x2e\
+\x35\x33\x31\x2d\x38\x31\x2e\x30\x37\x34\x2d\x31\x36\x30\x2d\x31\
+\x36\x39\x2e\x36\x30\x35\x2d\x31\x36\x39\x2e\x35\x39\x39\x56\x33\
+\x32\x68\x2d\x34\x32\x2e\x36\x36\x36\x76\x33\x33\x2e\x30\x36\x37\
+\x0d\x0a\x09\x09\x09\x63\x2d\x38\x38\x2e\x35\x33\x31\x2c\x39\x2e\
+\x35\x39\x39\x2d\x31\x36\x30\x2c\x38\x31\x2e\x30\x36\x38\x2d\x31\
+\x36\x39\x2e\x36\x30\x34\x2c\x31\x36\x39\x2e\x35\x39\x39\x48\x33\
+\x32\x76\x34\x32\x2e\x36\x36\x37\x68\x33\x33\x2e\x30\x36\x32\x63\
+\x39\x2e\x36\x30\x34\x2c\x38\x38\x2e\x35\x33\x31\x2c\x38\x31\x2e\
+\x30\x37\x32\x2c\x31\x36\x30\x2c\x31\x36\x39\x2e\x36\x30\x34\x2c\
+\x31\x36\x39\x2e\x36\x30\x34\x56\x34\x38\x30\x68\x34\x32\x2e\x36\
+\x36\x36\x76\x2d\x33\x33\x2e\x30\x36\x32\x0d\x0a\x09\x09\x09\x63\
+\x38\x38\x2e\x35\x33\x31\x2d\x39\x2e\x36\x30\x34\x2c\x31\x36\x30\
+\x2d\x38\x31\x2e\x30\x37\x33\x2c\x31\x36\x39\x2e\x36\x30\x35\x2d\
+\x31\x36\x39\x2e\x36\x30\x34\x48\x34\x38\x30\x76\x2d\x34\x32\x2e\
+\x36\x36\x37\x48\x34\x34\x36\x2e\x39\x33\x38\x7a\x20\x4d\x32\x35\
+\x36\x2c\x34\x30\x35\x2e\x33\x33\x33\x63\x2d\x38\x32\x2e\x31\x33\
+\x37\x2c\x30\x2d\x31\x34\x39\x2e\x33\x33\x34\x2d\x36\x37\x2e\x31\
+\x39\x38\x2d\x31\x34\x39\x2e\x33\x33\x34\x2d\x31\x34\x39\x2e\x33\
+\x33\x33\x0d\x0a\x09\x09\x09\x63\x30\x2d\x38\x32\x2e\x31\x33\x36\
+\x2c\x36\x37\x2e\x31\x39\x37\x2d\x31\x34\x39\x2e\x33\x33\x33\x2c\
+\x31\x34\x39\x2e\x33\x33\x34\x2d\x31\x34\x39\x2e\x33\x33\x33\x63\
+\x38\x32\x2e\x31\x33\x35\x2c\x30\x2c\x31\x34\x39\x2e\x33\x33\x32\
+\x2c\x36\x37\x2e\x31\x39\x38\x2c\x31\x34\x39\x2e\x33\x33\x32\x2c\
+\x31\x34\x39\x2e\x33\x33\x33\x43\x34\x30\x35\x2e\x33\x33\x32\x2c\
+\x33\x33\x38\x2e\x31\x33\x35\x2c\x33\x33\x38\x2e\x31\x33\x35\x2c\
+\x34\x30\x35\x2e\x33\x33\x33\x2c\x32\x35\x36\x2c\x34\x30\x35\x2e\
+\x33\x33\x33\x7a\x0d\x0a\x09\x09\x09\x22\x2f\x3e\x0d\x0a\x09\x3c\
+\x2f\x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\
+\x3e\x0d\x0a\
+\x00\x00\x03\x36\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
+\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
+\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
+\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
+\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
+\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
+\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x09\
+\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x20\x70\x6f\x69\x6e\x74\x73\x3d\
+\x22\x33\x39\x36\x2e\x37\x39\x35\x2c\x33\x39\x36\x2e\x38\x20\x33\
+\x32\x30\x2c\x33\x39\x36\x2e\x38\x20\x33\x32\x30\x2c\x34\x34\x38\
+\x20\x34\x34\x38\x2c\x34\x34\x38\x20\x34\x34\x38\x2c\x33\x32\x30\
+\x20\x33\x39\x36\x2e\x37\x39\x35\x2c\x33\x32\x30\x20\x09\x22\x2f\
+\x3e\x0d\x0a\x09\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x20\x70\x6f\x69\
+\x6e\x74\x73\x3d\x22\x33\x39\x36\x2e\x38\x2c\x31\x31\x35\x2e\x32\
+\x30\x35\x20\x33\x39\x36\x2e\x38\x2c\x31\x39\x32\x20\x34\x34\x38\
+\x2c\x31\x39\x32\x20\x34\x34\x38\x2c\x36\x34\x20\x33\x32\x30\x2c\
+\x36\x34\x20\x33\x32\x30\x2c\x31\x31\x35\x2e\x32\x30\x35\x20\x09\
+\x22\x2f\x3e\x0d\x0a\x09\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x20\x70\
+\x6f\x69\x6e\x74\x73\x3d\x22\x31\x31\x35\x2e\x32\x30\x35\x2c\x31\
+\x31\x35\x2e\x32\x20\x31\x39\x32\x2c\x31\x31\x35\x2e\x32\x20\x31\
+\x39\x32\x2c\x36\x34\x20\x36\x34\x2c\x36\x34\x20\x36\x34\x2c\x31\
+\x39\x32\x20\x31\x31\x35\x2e\x32\x30\x35\x2c\x31\x39\x32\x20\x09\
+\x22\x2f\x3e\x0d\x0a\x09\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x20\x70\
+\x6f\x69\x6e\x74\x73\x3d\x22\x31\x31\x35\x2e\x32\x2c\x33\x39\x36\
+\x2e\x37\x39\x35\x20\x31\x31\x35\x2e\x32\x2c\x33\x32\x30\x20\x36\
+\x34\x2c\x33\x32\x30\x20\x36\x34\x2c\x34\x34\x38\x20\x31\x39\x32\
+\x2c\x34\x34\x38\x20\x31\x39\x32\x2c\x33\x39\x36\x2e\x37\x39\x35\
+\x20\x09\x22\x2f\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\
+\x76\x67\x3e\x0d\x0a\
+\x00\x00\x02\xf7\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
+\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
+\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x73\
+\x74\x79\x6c\x65\x3d\x22\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\
+\x6b\x67\x72\x6f\x75\x6e\x64\x3a\x6e\x65\x77\x20\x30\x20\x30\x20\
+\x35\x31\x32\x20\x35\x31\x32\x3b\x22\x20\x78\x6d\x6c\x3a\x73\x70\
+\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\
+\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\x31\x37\x2e\x34\
+\x2c\x32\x32\x34\x48\x32\x38\x38\x56\x39\x34\x2e\x36\x63\x30\x2d\
+\x31\x36\x2e\x39\x2d\x31\x34\x2e\x33\x2d\x33\x30\x2e\x36\x2d\x33\
+\x32\x2d\x33\x30\x2e\x36\x63\x2d\x31\x37\x2e\x37\x2c\x30\x2d\x33\
+\x32\x2c\x31\x33\x2e\x37\x2d\x33\x32\x2c\x33\x30\x2e\x36\x56\x32\
+\x32\x34\x48\x39\x34\x2e\x36\x43\x37\x37\x2e\x37\x2c\x32\x32\x34\
+\x2c\x36\x34\x2c\x32\x33\x38\x2e\x33\x2c\x36\x34\x2c\x32\x35\x36\
+\x0d\x0a\x09\x63\x30\x2c\x31\x37\x2e\x37\x2c\x31\x33\x2e\x37\x2c\
+\x33\x32\x2c\x33\x30\x2e\x36\x2c\x33\x32\x48\x32\x32\x34\x76\x31\
+\x32\x39\x2e\x34\x63\x30\x2c\x31\x36\x2e\x39\x2c\x31\x34\x2e\x33\
+\x2c\x33\x30\x2e\x36\x2c\x33\x32\x2c\x33\x30\x2e\x36\x63\x31\x37\
+\x2e\x37\x2c\x30\x2c\x33\x32\x2d\x31\x33\x2e\x37\x2c\x33\x32\x2d\
+\x33\x30\x2e\x36\x56\x32\x38\x38\x68\x31\x32\x39\x2e\x34\x63\x31\
+\x36\x2e\x39\x2c\x30\x2c\x33\x30\x2e\x36\x2d\x31\x34\x2e\x33\x2c\
+\x33\x30\x2e\x36\x2d\x33\x32\x0d\x0a\x09\x43\x34\x34\x38\x2c\x32\
+\x33\x38\x2e\x33\x2c\x34\x33\x34\x2e\x33\x2c\x32\x32\x34\x2c\x34\
+\x31\x37\x2e\x34\x2c\x32\x32\x34\x7a\x22\x2f\x3e\x0d\x0a\x3c\x2f\
+\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\x03\x52\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
+\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
+\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
+\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
+\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
+\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
+\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\
+\x64\x3d\x22\x4d\x34\x33\x37\x2e\x33\x33\x34\x2c\x31\x34\x34\x48\
+\x32\x35\x36\x2e\x30\x30\x36\x6c\x2d\x34\x32\x2e\x36\x36\x38\x2d\
+\x34\x38\x48\x37\x34\x2e\x36\x36\x36\x43\x35\x31\x2e\x31\x39\x37\
+\x2c\x39\x36\x2c\x33\x32\x2c\x31\x31\x35\x2e\x31\x39\x38\x2c\x33\
+\x32\x2c\x31\x33\x38\x2e\x36\x36\x37\x76\x32\x33\x34\x2e\x36\x36\
+\x36\x43\x33\x32\x2c\x33\x39\x36\x2e\x38\x30\x32\x2c\x35\x31\x2e\
+\x31\x39\x37\x2c\x34\x31\x36\x2c\x37\x34\x2e\x36\x36\x36\x2c\x34\
+\x31\x36\x68\x33\x36\x32\x2e\x36\x36\x38\x0d\x0a\x09\x43\x34\x36\
+\x30\x2e\x38\x30\x33\x2c\x34\x31\x36\x2c\x34\x38\x30\x2c\x33\x39\
+\x36\x2e\x38\x30\x32\x2c\x34\x38\x30\x2c\x33\x37\x33\x2e\x33\x33\
+\x33\x56\x31\x38\x36\x2e\x36\x36\x37\x43\x34\x38\x30\x2c\x31\x36\
+\x33\x2e\x31\x39\x38\x2c\x34\x36\x30\x2e\x38\x30\x33\x2c\x31\x34\
+\x34\x2c\x34\x33\x37\x2e\x33\x33\x34\x2c\x31\x34\x34\x7a\x20\x4d\
+\x34\x34\x38\x2c\x33\x37\x33\x2e\x33\x33\x33\x0d\x0a\x09\x63\x30\
+\x2c\x35\x2e\x37\x38\x32\x2d\x34\x2e\x38\x38\x35\x2c\x31\x30\x2e\
+\x36\x36\x37\x2d\x31\x30\x2e\x36\x36\x36\x2c\x31\x30\x2e\x36\x36\
+\x37\x48\x37\x34\x2e\x36\x36\x36\x43\x36\x38\x2e\x38\x38\x34\x2c\
+\x33\x38\x34\x2c\x36\x34\x2c\x33\x37\x39\x2e\x31\x31\x35\x2c\x36\
+\x34\x2c\x33\x37\x33\x2e\x33\x33\x33\x56\x31\x37\x36\x68\x33\x37\
+\x33\x2e\x33\x33\x34\x63\x35\x2e\x37\x38\x31\x2c\x30\x2c\x31\x30\
+\x2e\x36\x36\x36\x2c\x34\x2e\x38\x38\x35\x2c\x31\x30\x2e\x36\x36\
+\x36\x2c\x31\x30\x2e\x36\x36\x37\x0d\x0a\x09\x56\x33\x37\x33\x2e\
+\x33\x33\x33\x7a\x22\x2f\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\
+\x0a\
+\x00\x00\x05\xca\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
+\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
+\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
+\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
+\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
+\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
+\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\
+\x64\x3d\x22\x4d\x34\x35\x30\x2e\x36\x37\x39\x2c\x32\x37\x33\x2e\
+\x35\x63\x2d\x31\x34\x2e\x35\x38\x35\x2d\x31\x34\x2e\x35\x37\x37\
+\x2d\x33\x36\x2e\x30\x35\x34\x2d\x31\x35\x2e\x38\x39\x2d\x35\x30\
+\x2e\x36\x33\x39\x2d\x31\x2e\x33\x31\x32\x6c\x2d\x34\x31\x2e\x36\
+\x38\x37\x2c\x34\x31\x2e\x36\x36\x34\x63\x2d\x31\x30\x2e\x38\x35\
+\x32\x2c\x31\x30\x2e\x38\x33\x36\x2d\x32\x33\x2e\x39\x33\x2c\x31\
+\x30\x2e\x38\x35\x39\x2d\x33\x31\x2e\x35\x36\x34\x2c\x31\x2e\x38\
+\x35\x32\x0d\x0a\x09\x63\x2d\x35\x2e\x30\x35\x37\x2d\x35\x2e\x39\
+\x36\x38\x2d\x33\x2e\x30\x36\x31\x2d\x32\x34\x2e\x33\x37\x34\x2d\
+\x31\x2e\x36\x34\x34\x2d\x33\x36\x2e\x30\x34\x39\x6c\x32\x30\x2e\
+\x39\x30\x37\x2d\x31\x37\x31\x2e\x38\x34\x39\x63\x31\x2e\x38\x36\
+\x37\x2d\x31\x35\x2e\x33\x35\x33\x2d\x39\x2e\x30\x37\x2d\x33\x30\
+\x2e\x31\x38\x35\x2d\x32\x34\x2e\x34\x33\x2d\x33\x32\x2e\x30\x35\
+\x31\x0d\x0a\x09\x63\x2d\x31\x35\x2e\x33\x35\x38\x2d\x31\x2e\x38\
+\x36\x37\x2d\x32\x39\x2e\x33\x32\x32\x2c\x39\x2e\x39\x33\x39\x2d\
+\x33\x31\x2e\x31\x39\x31\x2c\x32\x35\x2e\x32\x38\x39\x4c\x32\x36\
+\x37\x2e\x33\x37\x2c\x32\x33\x36\x2e\x30\x32\x31\x63\x2d\x31\x2e\
+\x32\x30\x35\x2c\x33\x2e\x33\x35\x38\x2d\x33\x2e\x37\x39\x2c\x33\
+\x2e\x39\x33\x38\x2d\x34\x2e\x30\x38\x31\x2d\x30\x2e\x35\x38\x32\
+\x4c\x32\x35\x35\x2e\x34\x34\x2c\x36\x30\x0d\x0a\x09\x63\x30\x2d\
+\x31\x35\x2e\x34\x36\x35\x2d\x31\x32\x2e\x35\x34\x32\x2d\x32\x38\
+\x2d\x32\x38\x2e\x30\x31\x34\x2d\x32\x38\x63\x2d\x31\x35\x2e\x34\
+\x37\x33\x2c\x30\x2d\x32\x38\x2e\x30\x31\x35\x2c\x31\x32\x2e\x35\
+\x33\x35\x2d\x32\x38\x2e\x30\x31\x35\x2c\x32\x38\x6c\x2d\x30\x2e\
+\x35\x35\x32\x2c\x31\x37\x36\x2e\x37\x35\x32\x63\x30\x2e\x31\x34\
+\x36\x2c\x32\x2e\x30\x34\x2d\x31\x2e\x36\x30\x34\x2c\x32\x2e\x36\
+\x32\x34\x2d\x31\x2e\x39\x32\x2c\x30\x2e\x32\x39\x34\x4c\x31\x37\
+\x32\x2e\x30\x31\x36\x2c\x39\x39\x2e\x30\x37\x37\x0d\x0a\x09\x63\
+\x2d\x32\x2e\x37\x35\x2d\x31\x35\x2e\x32\x31\x39\x2d\x31\x37\x2e\
+\x33\x32\x33\x2d\x32\x36\x2e\x32\x30\x33\x2d\x33\x32\x2e\x35\x34\
+\x38\x2d\x32\x33\x2e\x34\x35\x33\x63\x2d\x31\x35\x2e\x32\x32\x37\
+\x2c\x32\x2e\x37\x34\x38\x2d\x32\x35\x2e\x33\x33\x39\x2c\x31\x38\
+\x2e\x31\x38\x37\x2d\x32\x32\x2e\x35\x39\x31\x2c\x33\x33\x2e\x34\
+\x30\x33\x6c\x32\x32\x2e\x31\x39\x33\x2c\x31\x36\x31\x2e\x34\x35\
+\x35\x0d\x0a\x09\x63\x30\x2e\x30\x32\x33\x2c\x32\x2e\x38\x37\x32\
+\x2d\x30\x2e\x39\x34\x31\x2c\x34\x2e\x35\x31\x33\x2d\x32\x2e\x33\
+\x30\x38\x2c\x30\x2e\x38\x33\x31\x6c\x2d\x33\x33\x2e\x31\x30\x39\
+\x2d\x38\x38\x2e\x35\x31\x37\x63\x2d\x35\x2e\x31\x38\x2d\x31\x34\
+\x2e\x35\x37\x32\x2d\x32\x31\x2e\x31\x39\x36\x2d\x32\x33\x2e\x30\
+\x36\x35\x2d\x33\x35\x2e\x37\x37\x36\x2d\x31\x37\x2e\x38\x38\x39\
+\x0d\x0a\x09\x63\x2d\x31\x34\x2e\x35\x37\x39\x2c\x35\x2e\x31\x37\
+\x37\x2d\x32\x32\x2e\x32\x30\x31\x2c\x32\x32\x2e\x30\x36\x31\x2d\
+\x31\x37\x2e\x30\x32\x33\x2c\x33\x36\x2e\x36\x33\x31\x6c\x35\x38\
+\x2e\x30\x34\x32\x2c\x31\x38\x39\x2e\x36\x32\x35\x63\x30\x2e\x33\
+\x30\x33\x2c\x31\x2e\x30\x34\x36\x2c\x30\x2e\x36\x32\x34\x2c\x32\
+\x2e\x30\x38\x35\x2c\x30\x2e\x39\x35\x33\x2c\x33\x2e\x31\x31\x38\
+\x6c\x30\x2e\x31\x32\x31\x2c\x30\x2e\x33\x39\x0d\x0a\x09\x63\x30\
+\x2e\x30\x31\x31\x2c\x30\x2e\x30\x33\x31\x2c\x30\x2e\x30\x32\x35\
+\x2c\x30\x2e\x30\x35\x38\x2c\x30\x2e\x30\x33\x35\x2c\x30\x2e\x30\
+\x38\x38\x43\x31\x32\x36\x2e\x30\x37\x39\x2c\x34\x34\x34\x2e\x32\
+\x33\x33\x2c\x31\x37\x32\x2e\x35\x37\x2c\x34\x38\x30\x2c\x32\x32\
+\x37\x2e\x34\x32\x37\x2c\x34\x38\x30\x63\x33\x35\x2e\x31\x31\x36\
+\x2c\x30\x2c\x37\x31\x2e\x35\x39\x31\x2d\x31\x32\x2e\x33\x37\x38\
+\x2c\x39\x39\x2e\x33\x35\x37\x2d\x33\x33\x2e\x36\x37\x32\x0d\x0a\
+\x09\x63\x30\x2e\x30\x30\x31\x2c\x30\x2c\x30\x2e\x30\x30\x33\x2d\
+\x30\x2e\x30\x30\x32\x2c\x30\x2e\x30\x30\x33\x2d\x30\x2e\x30\x30\
+\x32\x63\x32\x39\x2e\x39\x39\x2d\x31\x38\x2e\x30\x35\x31\x2c\x31\
+\x32\x36\x2e\x30\x37\x31\x2d\x31\x32\x31\x2e\x33\x34\x37\x2c\x31\
+\x32\x36\x2e\x30\x37\x31\x2d\x31\x32\x31\x2e\x33\x34\x37\x43\x34\
+\x36\x37\x2e\x34\x34\x35\x2c\x33\x31\x30\x2e\x34\x30\x32\x2c\x34\
+\x36\x35\x2e\x32\x36\x36\x2c\x32\x38\x38\x2e\x30\x38\x2c\x34\x35\
+\x30\x2e\x36\x37\x39\x2c\x32\x37\x33\x2e\x35\x7a\x22\x2f\x3e\x0d\
+\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\x04\xbd\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\
+\x30\x27\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x27\x55\x54\x46\
+\x2d\x38\x27\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x54\x68\x69\x73\x20\
+\x66\x69\x6c\x65\x20\x77\x61\x73\x20\x67\x65\x6e\x65\x72\x61\x74\
+\x65\x64\x20\x62\x79\x20\x64\x76\x69\x73\x76\x67\x6d\x20\x32\x2e\
+\x34\x20\x2d\x2d\x3e\x0a\x3c\x73\x76\x67\x20\x68\x65\x69\x67\x68\
+\x74\x3d\x27\x32\x34\x70\x74\x27\x20\x76\x65\x72\x73\x69\x6f\x6e\
+\x3d\x27\x31\x2e\x31\x27\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x27\
+\x35\x36\x2e\x34\x30\x39\x34\x20\x35\x33\x2e\x38\x35\x38\x33\x20\
+\x32\x34\x20\x32\x34\x27\x20\x77\x69\x64\x74\x68\x3d\x27\x32\x34\
+\x70\x74\x27\x20\x78\x6d\x6c\x6e\x73\x3d\x27\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\
+\x30\x2f\x73\x76\x67\x27\x20\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\
+\x6e\x6b\x3d\x27\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\
+\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\
+\x27\x3e\x0a\x3c\x67\x20\x69\x64\x3d\x27\x70\x61\x67\x65\x31\x27\
+\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\
+\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\
+\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\x2e\
+\x37\x36\x35\x35\x20\x36\x39\x2e\x37\x36\x38\x38\x29\x27\x3e\x0a\
+\x3c\x70\x61\x74\x68\x20\x64\x3d\x27\x4d\x20\x2d\x39\x2e\x33\x39\
+\x31\x31\x38\x20\x2d\x30\x43\x20\x2d\x39\x2e\x39\x36\x38\x36\x31\
+\x20\x2d\x33\x2e\x38\x33\x30\x30\x34\x20\x2d\x38\x2e\x35\x35\x37\
+\x30\x36\x20\x2d\x37\x2e\x35\x31\x39\x34\x34\x20\x2d\x36\x2e\x36\
+\x34\x30\x35\x37\x20\x2d\x31\x30\x2e\x32\x31\x37\x31\x43\x20\x2d\
+\x30\x2e\x34\x39\x31\x30\x38\x39\x20\x2d\x31\x38\x2e\x38\x37\x33\
+\x33\x20\x38\x2e\x33\x35\x36\x37\x36\x20\x2d\x31\x35\x2e\x31\x39\
+\x30\x36\x20\x38\x2e\x36\x37\x36\x33\x32\x20\x2d\x35\x2e\x35\x32\
+\x39\x34\x38\x43\x20\x38\x2e\x38\x33\x36\x20\x2d\x30\x2e\x37\x30\
+\x32\x30\x30\x38\x20\x36\x2e\x32\x33\x39\x36\x38\x20\x32\x2e\x39\
+\x34\x32\x30\x37\x20\x33\x2e\x33\x32\x30\x32\x38\x20\x35\x2e\x31\
+\x30\x38\x35\x37\x43\x20\x2d\x31\x2e\x39\x36\x38\x39\x31\x20\x39\
+\x2e\x30\x33\x33\x37\x31\x20\x2d\x38\x2e\x32\x36\x38\x39\x35\x20\
+\x37\x2e\x34\x34\x33\x37\x20\x2d\x39\x2e\x33\x39\x31\x31\x38\x20\
+\x2d\x30\x5a\x27\x20\x66\x69\x6c\x6c\x3d\x27\x6e\x6f\x6e\x65\x27\
+\x20\x73\x74\x72\x6f\x6b\x65\x3d\x27\x23\x30\x30\x30\x30\x30\x30\
+\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\
+\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\
+\x6c\x69\x6e\x65\x6a\x6f\x69\x6e\x3d\x27\x72\x6f\x75\x6e\x64\x27\
+\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\
+\x69\x74\x3d\x27\x31\x30\x2e\x30\x33\x37\x35\x27\x20\x73\x74\x72\
+\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3d\x27\x31\x2e\x37\x35\x36\
+\x35\x36\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\
+\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\
+\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\x30\x20\x30\x2e\x39\
+\x39\x36\x32\x36\x34\x20\x36\x38\x2e\x37\x36\x35\x35\x20\x36\x39\
+\x2e\x37\x36\x38\x38\x29\x27\x3e\x0a\x3c\x63\x69\x72\x63\x6c\x65\
+\x20\x63\x78\x3d\x27\x2d\x39\x2e\x33\x39\x31\x31\x38\x27\x20\x63\
+\x79\x3d\x27\x2d\x30\x27\x20\x72\x3d\x27\x33\x2e\x30\x31\x31\x32\
+\x35\x27\x20\x66\x69\x6c\x6c\x3d\x27\x23\x30\x30\x30\x30\x30\x30\
+\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\
+\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\
+\x39\x39\x36\x32\x36\x34\x20\x30\x20\x30\x20\x30\x2e\x39\x39\x36\
+\x32\x36\x34\x20\x36\x38\x2e\x37\x36\x35\x35\x20\x36\x39\x2e\x37\
+\x36\x38\x38\x29\x27\x3e\x0a\x3c\x63\x69\x72\x63\x6c\x65\x20\x63\
+\x78\x3d\x27\x2d\x36\x2e\x36\x34\x30\x35\x37\x27\x20\x63\x79\x3d\
+\x27\x2d\x31\x30\x2e\x32\x31\x37\x31\x27\x20\x72\x3d\x27\x33\x2e\
+\x30\x31\x31\x32\x35\x27\x20\x66\x69\x6c\x6c\x3d\x27\x23\x30\x30\
+\x30\x30\x30\x30\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\
+\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\
+\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\x30\x20\x30\
+\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\x2e\x37\x36\x35\x35\x20\
+\x36\x39\x2e\x37\x36\x38\x38\x29\x27\x3e\x0a\x3c\x63\x69\x72\x63\
+\x6c\x65\x20\x63\x78\x3d\x27\x38\x2e\x36\x37\x36\x33\x32\x27\x20\
+\x63\x79\x3d\x27\x2d\x35\x2e\x35\x32\x39\x34\x38\x27\x20\x72\x3d\
+\x27\x33\x2e\x30\x31\x31\x32\x35\x27\x20\x66\x69\x6c\x6c\x3d\x27\
+\x23\x30\x30\x30\x30\x30\x30\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\
+\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\
+\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\
+\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\x2e\x37\x36\
+\x35\x35\x20\x36\x39\x2e\x37\x36\x38\x38\x29\x27\x3e\x0a\x3c\x63\
+\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x33\x2e\x33\x32\x30\x32\
+\x38\x27\x20\x63\x79\x3d\x27\x35\x2e\x31\x30\x38\x35\x37\x27\x20\
+\x72\x3d\x27\x33\x2e\x30\x31\x31\x32\x35\x27\x20\x66\x69\x6c\x6c\
+\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x2f\x3e\x0a\x3c\x2f\x67\
+\x3e\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\
+\x00\x00\x04\xca\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\x72\
+\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\x75\
+\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x39\x2e\x32\x2e\x31\x2c\x20\
+\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\x2d\
+\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\x6e\
+\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\x20\
+\x20\x2d\x2d\x3e\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\
+\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\
+\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\
+\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\
+\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\
+\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\
+\x31\x2e\x64\x74\x64\x22\x3e\x0a\x3c\x73\x76\x67\x20\x76\x65\x72\
+\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x0a\x09\x20\x69\x64\x3d\
+\x22\x73\x76\x67\x34\x36\x31\x39\x22\x20\x69\x6e\x6b\x73\x63\x61\
+\x70\x65\x3a\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x30\x2e\x39\x31\
+\x2b\x64\x65\x76\x65\x6c\x2b\x6f\x73\x78\x6d\x65\x6e\x75\x20\x72\
+\x31\x32\x39\x31\x31\x22\x20\x73\x6f\x64\x69\x70\x6f\x64\x69\x3a\
+\x64\x6f\x63\x6e\x61\x6d\x65\x3d\x22\x74\x72\x69\x61\x6e\x67\x6c\
+\x65\x2d\x73\x74\x72\x6f\x6b\x65\x64\x2d\x31\x35\x2e\x73\x76\x67\
+\x22\x20\x78\x6d\x6c\x6e\x73\x3a\x63\x63\x3d\x22\x68\x74\x74\x70\
+\x3a\x2f\x2f\x63\x72\x65\x61\x74\x69\x76\x65\x63\x6f\x6d\x6d\x6f\
+\x6e\x73\x2e\x6f\x72\x67\x2f\x6e\x73\x23\x22\x20\x78\x6d\x6c\x6e\
+\x73\x3a\x64\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x70\x75\x72\
+\x6c\x2e\x6f\x72\x67\x2f\x64\x63\x2f\x65\x6c\x65\x6d\x65\x6e\x74\
+\x73\x2f\x31\x2e\x31\x2f\x22\x20\x78\x6d\x6c\x6e\x73\x3a\x69\x6e\
+\x6b\x73\x63\x61\x70\x65\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\
+\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\x72\x67\x2f\
+\x6e\x61\x6d\x65\x73\x70\x61\x63\x65\x73\x2f\x69\x6e\x6b\x73\x63\
+\x61\x70\x65\x22\x20\x78\x6d\x6c\x6e\x73\x3a\x72\x64\x66\x3d\x22\
+\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
+\x67\x2f\x31\x39\x39\x39\x2f\x30\x32\x2f\x32\x32\x2d\x72\x64\x66\
+\x2d\x73\x79\x6e\x74\x61\x78\x2d\x6e\x73\x23\x22\x20\x78\x6d\x6c\
+\x6e\x73\x3a\x73\x6f\x64\x69\x70\x6f\x64\x69\x3d\x22\x68\x74\x74\
+\x70\x3a\x2f\x2f\x73\x6f\x64\x69\x70\x6f\x64\x69\x2e\x73\x6f\x75\
+\x72\x63\x65\x66\x6f\x72\x67\x65\x2e\x6e\x65\x74\x2f\x44\x54\x44\
+\x2f\x73\x6f\x64\x69\x70\x6f\x64\x69\x2d\x30\x2e\x64\x74\x64\x22\
+\x20\x78\x6d\x6c\x6e\x73\x3a\x73\x76\x67\x3d\x22\x68\x74\x74\x70\
+\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\
+\x30\x30\x2f\x73\x76\x67\x22\x0a\x09\x20\x78\x6d\x6c\x6e\x73\x3d\
+\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\
+\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\
+\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\
+\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\
+\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\
+\x79\x3d\x22\x30\x70\x78\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x31\
+\x35\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x31\x35\x70\
+\x78\x22\x0a\x09\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\
+\x30\x20\x31\x35\x20\x31\x35\x22\x20\x73\x74\x79\x6c\x65\x3d\x22\
+\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\
+\x64\x3a\x6e\x65\x77\x20\x30\x20\x30\x20\x31\x35\x20\x31\x35\x3b\
+\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\
+\x73\x65\x72\x76\x65\x22\x3e\x0a\x3c\x70\x61\x74\x68\x20\x69\x64\
+\x3d\x22\x72\x65\x63\x74\x33\x33\x33\x38\x22\x20\x69\x6e\x6b\x73\
+\x63\x61\x70\x65\x3a\x63\x6f\x6e\x6e\x65\x63\x74\x6f\x72\x2d\x63\
+\x75\x72\x76\x61\x74\x75\x72\x65\x3d\x22\x30\x22\x20\x73\x6f\x64\
+\x69\x70\x6f\x64\x69\x3a\x6e\x6f\x64\x65\x74\x79\x70\x65\x73\x3d\
+\x22\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x22\x20\x64\
+\x3d\x22\x4d\x37\x2e\x35\x32\x34\x33\x2c\x31\x2e\x35\x30\x30\x34\
+\x0a\x09\x43\x37\x2e\x32\x34\x32\x39\x2c\x31\x2e\x34\x39\x31\x33\
+\x2c\x36\x2e\x39\x37\x38\x37\x2c\x31\x2e\x36\x34\x32\x33\x2c\x36\
+\x2e\x38\x33\x33\x36\x2c\x31\x2e\x38\x39\x35\x32\x6c\x2d\x35\x2e\
+\x35\x2c\x39\x2e\x38\x36\x39\x32\x43\x31\x2e\x30\x32\x31\x38\x2c\
+\x31\x32\x2e\x33\x30\x37\x38\x2c\x31\x2e\x33\x39\x35\x2c\x31\x32\
+\x2e\x39\x39\x39\x39\x2c\x32\x2c\x31\x33\x68\x31\x31\x0a\x09\x63\
+\x30\x2e\x36\x30\x35\x2d\x30\x2e\x30\x30\x30\x31\x2c\x30\x2e\x39\
+\x37\x38\x32\x2d\x30\x2e\x36\x39\x32\x32\x2c\x30\x2e\x36\x36\x36\
+\x34\x2d\x31\x2e\x32\x33\x35\x35\x6c\x2d\x35\x2e\x35\x2d\x39\x2e\
+\x38\x36\x39\x32\x43\x38\x2e\x30\x33\x30\x32\x2c\x31\x2e\x36\x35\
+\x37\x39\x2c\x37\x2e\x37\x38\x38\x34\x2c\x31\x2e\x35\x30\x39\x32\
+\x2c\x37\x2e\x35\x32\x34\x33\x2c\x31\x2e\x35\x30\x30\x34\x7a\x20\
+\x4d\x37\x2e\x35\x2c\x33\x2e\x38\x39\x39\x33\x6c\x34\x2e\x31\x32\
+\x36\x37\x2c\x37\x2e\x34\x37\x30\x34\x0a\x09\x48\x33\x2e\x33\x37\
+\x33\x33\x4c\x37\x2e\x35\x2c\x33\x2e\x38\x39\x39\x33\x7a\x22\x2f\
+\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\x0a\
+\x00\x00\x04\x8d\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\
+\x30\x27\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x27\x55\x54\x46\
+\x2d\x38\x27\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x54\x68\x69\x73\x20\
+\x66\x69\x6c\x65\x20\x77\x61\x73\x20\x67\x65\x6e\x65\x72\x61\x74\
+\x65\x64\x20\x62\x79\x20\x64\x76\x69\x73\x76\x67\x6d\x20\x32\x2e\
+\x34\x20\x2d\x2d\x3e\x0a\x3c\x73\x76\x67\x20\x68\x65\x69\x67\x68\
+\x74\x3d\x27\x32\x34\x70\x74\x27\x20\x76\x65\x72\x73\x69\x6f\x6e\
+\x3d\x27\x31\x2e\x31\x27\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x27\
+\x35\x36\x2e\x34\x30\x39\x34\x20\x35\x33\x2e\x38\x35\x38\x33\x20\
+\x32\x34\x20\x32\x34\x27\x20\x77\x69\x64\x74\x68\x3d\x27\x32\x34\
+\x70\x74\x27\x20\x78\x6d\x6c\x6e\x73\x3d\x27\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\
+\x30\x2f\x73\x76\x67\x27\x20\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\
+\x6e\x6b\x3d\x27\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\
+\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\
+\x27\x3e\x0a\x3c\x67\x20\x69\x64\x3d\x27\x70\x61\x67\x65\x31\x27\
+\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\
+\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\
+\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\x2e\
+\x37\x36\x35\x35\x20\x36\x39\x2e\x38\x31\x32\x33\x29\x27\x3e\x0a\
+\x3c\x70\x61\x74\x68\x20\x64\x3d\x27\x4d\x20\x2d\x39\x2e\x33\x39\
+\x31\x31\x38\x20\x2d\x30\x43\x20\x2d\x39\x2e\x33\x32\x32\x35\x37\
+\x20\x2d\x33\x2e\x37\x37\x37\x38\x33\x20\x2d\x38\x2e\x33\x34\x33\
+\x32\x34\x20\x2d\x37\x2e\x33\x38\x34\x34\x34\x20\x2d\x36\x2e\x36\
+\x34\x30\x35\x37\x20\x2d\x31\x30\x2e\x31\x32\x39\x38\x43\x20\x2d\
+\x31\x2e\x32\x36\x32\x31\x39\x20\x2d\x31\x38\x2e\x38\x30\x31\x37\
+\x20\x37\x2e\x36\x38\x39\x37\x31\x20\x2d\x31\x35\x2e\x35\x33\x35\
+\x31\x20\x38\x2e\x36\x37\x36\x33\x32\x20\x2d\x35\x2e\x34\x38\x32\
+\x32\x43\x20\x39\x2e\x31\x38\x36\x37\x39\x20\x2d\x30\x2e\x32\x38\
+\x30\x38\x37\x37\x20\x36\x2e\x37\x34\x39\x33\x37\x20\x34\x2e\x35\
+\x31\x38\x38\x37\x20\x33\x2e\x33\x32\x30\x32\x38\x20\x35\x2e\x30\
+\x36\x34\x38\x39\x27\x20\x66\x69\x6c\x6c\x3d\x27\x6e\x6f\x6e\x65\
+\x27\x20\x73\x74\x72\x6f\x6b\x65\x3d\x27\x23\x30\x30\x30\x30\x30\
+\x30\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\
+\x70\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\
+\x2d\x6c\x69\x6e\x65\x6a\x6f\x69\x6e\x3d\x27\x72\x6f\x75\x6e\x64\
+\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\
+\x6d\x69\x74\x3d\x27\x31\x30\x2e\x30\x33\x37\x35\x27\x20\x73\x74\
+\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3d\x27\x31\x2e\x37\x35\
+\x36\x35\x36\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\
+\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\
+\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\x30\x20\x30\x2e\
+\x39\x39\x36\x32\x36\x34\x20\x36\x38\x2e\x37\x36\x35\x35\x20\x36\
+\x39\x2e\x38\x31\x32\x33\x29\x27\x3e\x0a\x3c\x63\x69\x72\x63\x6c\
+\x65\x20\x63\x78\x3d\x27\x2d\x39\x2e\x33\x39\x31\x31\x38\x27\x20\
+\x63\x79\x3d\x27\x2d\x30\x27\x20\x72\x3d\x27\x33\x2e\x30\x31\x31\
+\x32\x35\x27\x20\x66\x69\x6c\x6c\x3d\x27\x23\x30\x30\x30\x30\x30\
+\x30\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\
+\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x30\
+\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\x30\x20\x30\x2e\x39\x39\
+\x36\x32\x36\x34\x20\x36\x38\x2e\x37\x36\x35\x35\x20\x36\x39\x2e\
+\x38\x31\x32\x33\x29\x27\x3e\x0a\x3c\x63\x69\x72\x63\x6c\x65\x20\
+\x63\x78\x3d\x27\x2d\x36\x2e\x36\x34\x30\x35\x37\x27\x20\x63\x79\
+\x3d\x27\x2d\x31\x30\x2e\x31\x32\x39\x38\x27\x20\x72\x3d\x27\x33\
+\x2e\x30\x31\x31\x32\x35\x27\x20\x66\x69\x6c\x6c\x3d\x27\x23\x30\
+\x30\x30\x30\x30\x30\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\
+\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\
+\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\x30\x20\
+\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\x2e\x37\x36\x35\x35\
+\x20\x36\x39\x2e\x38\x31\x32\x33\x29\x27\x3e\x0a\x3c\x63\x69\x72\
+\x63\x6c\x65\x20\x63\x78\x3d\x27\x38\x2e\x36\x37\x36\x33\x32\x27\
+\x20\x63\x79\x3d\x27\x2d\x35\x2e\x34\x38\x32\x32\x27\x20\x72\x3d\
+\x27\x33\x2e\x30\x31\x31\x32\x35\x27\x20\x66\x69\x6c\x6c\x3d\x27\
+\x23\x30\x30\x30\x30\x30\x30\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\
+\x3c\x67\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\
+\x74\x72\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\
+\x30\x20\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x38\x2e\x37\x36\
+\x35\x35\x20\x36\x39\x2e\x38\x31\x32\x33\x29\x27\x3e\x0a\x3c\x63\
+\x69\x72\x63\x6c\x65\x20\x63\x78\x3d\x27\x33\x2e\x33\x32\x30\x32\
+\x38\x27\x20\x63\x79\x3d\x27\x35\x2e\x30\x36\x34\x38\x39\x27\x20\
+\x72\x3d\x27\x33\x2e\x30\x31\x31\x32\x35\x27\x20\x66\x69\x6c\x6c\
+\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x2f\x3e\x0a\x3c\x2f\x67\
+\x3e\x3c\x2f\x67\x3e\x0a\x3c\x2f\x73\x76\x67\x3e\
+\x00\x00\x03\xeb\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
+\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
+\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x73\
+\x74\x79\x6c\x65\x3d\x22\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\
+\x6b\x67\x72\x6f\x75\x6e\x64\x3a\x6e\x65\x77\x20\x30\x20\x30\x20\
+\x35\x31\x32\x20\x35\x31\x32\x3b\x22\x20\x78\x6d\x6c\x3a\x73\x70\
+\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\
+\x0a\x3c\x67\x3e\x0d\x0a\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\
+\x4d\x32\x35\x36\x2c\x31\x32\x38\x63\x2d\x38\x31\x2e\x39\x2c\x30\
+\x2d\x31\x34\x35\x2e\x37\x2c\x34\x38\x2e\x38\x2d\x32\x32\x34\x2c\
+\x31\x32\x38\x63\x36\x37\x2e\x34\x2c\x36\x37\x2e\x37\x2c\x31\x32\
+\x34\x2c\x31\x32\x38\x2c\x32\x32\x34\x2c\x31\x32\x38\x63\x39\x39\
+\x2e\x39\x2c\x30\x2c\x31\x37\x33\x2e\x34\x2d\x37\x36\x2e\x34\x2c\
+\x32\x32\x34\x2d\x31\x32\x36\x2e\x36\x0d\x0a\x09\x09\x43\x34\x32\
+\x38\x2e\x32\x2c\x31\x39\x38\x2e\x36\x2c\x33\x35\x34\x2e\x38\x2c\
+\x31\x32\x38\x2c\x32\x35\x36\x2c\x31\x32\x38\x7a\x20\x4d\x32\x35\
+\x36\x2c\x33\x34\x37\x2e\x33\x63\x2d\x34\x39\x2e\x34\x2c\x30\x2d\
+\x38\x39\x2e\x36\x2d\x34\x31\x2d\x38\x39\x2e\x36\x2d\x39\x31\x2e\
+\x33\x63\x30\x2d\x35\x30\x2e\x34\x2c\x34\x30\x2e\x32\x2d\x39\x31\
+\x2e\x33\x2c\x38\x39\x2e\x36\x2d\x39\x31\x2e\x33\x73\x38\x39\x2e\
+\x36\x2c\x34\x31\x2c\x38\x39\x2e\x36\x2c\x39\x31\x2e\x33\x0d\x0a\
+\x09\x09\x43\x33\x34\x35\x2e\x36\x2c\x33\x30\x36\x2e\x34\x2c\x33\
+\x30\x35\x2e\x34\x2c\x33\x34\x37\x2e\x33\x2c\x32\x35\x36\x2c\x33\
+\x34\x37\x2e\x33\x7a\x22\x2f\x3e\x0d\x0a\x09\x3c\x67\x3e\x0d\x0a\
+\x09\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x32\x35\x36\x2c\
+\x32\x32\x34\x63\x30\x2d\x37\x2e\x39\x2c\x32\x2e\x39\x2d\x31\x35\
+\x2e\x31\x2c\x37\x2e\x36\x2d\x32\x30\x2e\x37\x63\x2d\x32\x2e\x35\
+\x2d\x30\x2e\x34\x2d\x35\x2d\x30\x2e\x36\x2d\x37\x2e\x36\x2d\x30\
+\x2e\x36\x63\x2d\x32\x38\x2e\x38\x2c\x30\x2d\x35\x32\x2e\x33\x2c\
+\x32\x33\x2e\x39\x2d\x35\x32\x2e\x33\x2c\x35\x33\x2e\x33\x63\x30\
+\x2c\x32\x39\x2e\x34\x2c\x32\x33\x2e\x35\x2c\x35\x33\x2e\x33\x2c\
+\x35\x32\x2e\x33\x2c\x35\x33\x2e\x33\x0d\x0a\x09\x09\x09\x73\x35\
+\x32\x2e\x33\x2d\x32\x33\x2e\x39\x2c\x35\x32\x2e\x33\x2d\x35\x33\
+\x2e\x33\x63\x30\x2d\x32\x2e\x33\x2d\x30\x2e\x32\x2d\x34\x2e\x36\
+\x2d\x30\x2e\x34\x2d\x36\x2e\x39\x63\x2d\x35\x2e\x35\x2c\x34\x2e\
+\x33\x2d\x31\x32\x2e\x33\x2c\x36\x2e\x39\x2d\x31\x39\x2e\x38\x2c\
+\x36\x2e\x39\x43\x32\x37\x30\x2e\x33\x2c\x32\x35\x36\x2c\x32\x35\
+\x36\x2c\x32\x34\x31\x2e\x37\x2c\x32\x35\x36\x2c\x32\x32\x34\x7a\
+\x22\x2f\x3e\x0d\x0a\x09\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\
+\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\x03\x6c\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
+\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
+\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
+\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
+\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
+\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
+\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x09\
+\x0d\x0a\x09\x09\x3c\x72\x65\x63\x74\x20\x78\x3d\x22\x31\x37\x38\
+\x2e\x38\x34\x36\x22\x20\x79\x3d\x22\x39\x32\x2e\x30\x38\x37\x22\
+\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x22\x6d\x61\x74\x72\
+\x69\x78\x28\x2d\x30\x2e\x37\x30\x37\x31\x20\x2d\x30\x2e\x37\x30\
+\x37\x31\x20\x30\x2e\x37\x30\x37\x31\x20\x2d\x30\x2e\x37\x30\x37\
+\x31\x20\x32\x32\x34\x2e\x33\x34\x37\x36\x20\x36\x33\x31\x2e\x31\
+\x34\x39\x38\x29\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x31\x32\x38\
+\x2e\x30\x38\x35\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x33\x35\
+\x34\x2e\x30\x34\x39\x22\x2f\x3e\x0d\x0a\x09\x3c\x70\x61\x74\x68\
+\x20\x64\x3d\x22\x4d\x34\x37\x31\x2e\x37\x32\x33\x2c\x38\x38\x2e\
+\x33\x39\x33\x6c\x2d\x34\x38\x2e\x31\x31\x35\x2d\x34\x38\x2e\x31\
+\x31\x34\x63\x2d\x31\x31\x2e\x37\x32\x33\x2d\x31\x31\x2e\x37\x32\
+\x34\x2d\x33\x31\x2e\x35\x35\x38\x2d\x31\x30\x2e\x38\x39\x36\x2d\
+\x34\x34\x2e\x33\x30\x34\x2c\x31\x2e\x38\x35\x6c\x2d\x34\x35\x2e\
+\x32\x30\x32\x2c\x34\x35\x2e\x32\x30\x33\x6c\x39\x30\x2e\x35\x36\
+\x39\x2c\x39\x30\x2e\x35\x36\x38\x6c\x34\x35\x2e\x32\x30\x32\x2d\
+\x34\x35\x2e\x32\x30\x32\x0d\x0a\x09\x09\x43\x34\x38\x32\x2e\x36\
+\x31\x36\x2c\x31\x31\x39\x2e\x39\x35\x32\x2c\x34\x38\x33\x2e\x34\
+\x34\x35\x2c\x31\x30\x30\x2e\x31\x31\x36\x2c\x34\x37\x31\x2e\x37\
+\x32\x33\x2c\x38\x38\x2e\x33\x39\x33\x7a\x22\x2f\x3e\x0d\x0a\x09\
+\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x20\x70\x6f\x69\x6e\x74\x73\x3d\
+\x22\x36\x34\x2e\x30\x32\x31\x2c\x33\x36\x33\x2e\x32\x35\x32\x20\
+\x33\x32\x2c\x34\x38\x30\x20\x31\x34\x38\x2e\x37\x33\x37\x2c\x34\
+\x34\x37\x2e\x39\x37\x39\x20\x09\x22\x2f\x3e\x0d\x0a\x3c\x2f\x67\
+\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\x02\x7d\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
+\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
+\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
+\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
+\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
+\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
+\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x69\x64\x3d\
+\x22\x49\x63\x6f\x6e\x5f\x38\x5f\x22\x3e\x0d\x0a\x09\x3c\x67\x3e\
+\x0d\x0a\x09\x09\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\x32\
+\x37\x2c\x32\x33\x34\x2e\x36\x32\x35\x48\x31\x36\x37\x2e\x32\x39\
+\x36\x6c\x31\x31\x39\x2e\x37\x30\x32\x2d\x31\x31\x39\x2e\x37\x30\
+\x32\x4c\x32\x35\x36\x2c\x38\x35\x4c\x38\x35\x2c\x32\x35\x36\x6c\
+\x31\x37\x31\x2c\x31\x37\x31\x6c\x32\x39\x2e\x39\x32\x32\x2d\x32\
+\x39\x2e\x39\x32\x34\x4c\x31\x36\x37\x2e\x32\x39\x36\x2c\x32\x37\
+\x37\x2e\x33\x37\x35\x48\x34\x32\x37\x56\x32\x33\x34\x2e\x36\x32\
+\x35\x7a\x22\x2f\x3e\x0d\x0a\x09\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\
+\x67\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\x03\xc4\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x38\x2e\x31\x2e\x31\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x43\x68\x65\x76\x72\x6f\x6e\x5f\x63\x69\x72\x63\x6c\x65\
+\x64\x5f\x6c\x65\x66\x74\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\
+\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\
+\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\
+\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\
+\x6c\x69\x6e\x6b\x22\x0d\x0a\x09\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x20\x65\x6e\x61\
+\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\
+\x6e\x65\x77\x20\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x20\x78\
+\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\
+\x76\x65\x22\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\
+\x31\x31\x2e\x33\x30\x32\x2c\x36\x2e\x37\x37\x36\x63\x2d\x30\x2e\
+\x31\x39\x36\x2d\x30\x2e\x31\x39\x37\x2d\x30\x2e\x35\x31\x35\x2d\
+\x30\x2e\x31\x39\x37\x2d\x30\x2e\x37\x31\x2c\x30\x4c\x37\x2e\x37\
+\x38\x35\x2c\x39\x2e\x36\x34\x31\x63\x2d\x30\x2e\x31\x39\x36\x2c\
+\x30\x2e\x31\x39\x39\x2d\x30\x2e\x31\x39\x36\x2c\x30\x2e\x35\x32\
+\x2c\x30\x2c\x30\x2e\x37\x31\x37\x6c\x32\x2e\x38\x30\x37\x2c\x32\
+\x2e\x38\x36\x34\x0d\x0a\x09\x63\x30\x2e\x31\x39\x35\x2c\x30\x2e\
+\x31\x39\x39\x2c\x30\x2e\x35\x31\x34\x2c\x30\x2e\x31\x39\x38\x2c\
+\x30\x2e\x37\x31\x2c\x30\x63\x30\x2e\x31\x39\x36\x2d\x30\x2e\x31\
+\x39\x37\x2c\x30\x2e\x31\x39\x36\x2d\x30\x2e\x35\x31\x38\x2c\x30\
+\x2d\x30\x2e\x37\x31\x37\x4c\x39\x2c\x31\x30\x6c\x32\x2e\x33\x30\
+\x32\x2d\x32\x2e\x35\x30\x36\x43\x31\x31\x2e\x34\x39\x38\x2c\x37\
+\x2e\x32\x39\x36\x2c\x31\x31\x2e\x34\x39\x38\x2c\x36\x2e\x39\x37\
+\x36\x2c\x31\x31\x2e\x33\x30\x32\x2c\x36\x2e\x37\x37\x36\x7a\x0d\
+\x0a\x09\x20\x4d\x31\x30\x2c\x30\x2e\x34\x63\x2d\x35\x2e\x33\x30\
+\x32\x2c\x30\x2d\x39\x2e\x36\x2c\x34\x2e\x32\x39\x38\x2d\x39\x2e\
+\x36\x2c\x39\x2e\x36\x63\x30\x2c\x35\x2e\x33\x30\x33\x2c\x34\x2e\
+\x32\x39\x38\x2c\x39\x2e\x36\x2c\x39\x2e\x36\x2c\x39\x2e\x36\x73\
+\x39\x2e\x36\x2d\x34\x2e\x32\x39\x37\x2c\x39\x2e\x36\x2d\x39\x2e\
+\x36\x43\x31\x39\x2e\x36\x2c\x34\x2e\x36\x39\x38\x2c\x31\x35\x2e\
+\x33\x30\x32\x2c\x30\x2e\x34\x2c\x31\x30\x2c\x30\x2e\x34\x7a\x20\
+\x4d\x31\x30\x2c\x31\x38\x2e\x33\x35\x34\x0d\x0a\x09\x63\x2d\x34\
+\x2e\x36\x31\x35\x2c\x30\x2d\x38\x2e\x33\x35\x34\x2d\x33\x2e\x37\
+\x34\x2d\x38\x2e\x33\x35\x34\x2d\x38\x2e\x33\x35\x34\x63\x30\x2d\
+\x34\x2e\x36\x31\x34\x2c\x33\x2e\x37\x33\x39\x2d\x38\x2e\x33\x35\
+\x34\x2c\x38\x2e\x33\x35\x34\x2d\x38\x2e\x33\x35\x34\x63\x34\x2e\
+\x36\x31\x33\x2c\x30\x2c\x38\x2e\x33\x35\x34\x2c\x33\x2e\x37\x34\
+\x2c\x38\x2e\x33\x35\x34\x2c\x38\x2e\x33\x35\x34\x0d\x0a\x09\x43\
+\x31\x38\x2e\x33\x35\x34\x2c\x31\x34\x2e\x36\x31\x34\x2c\x31\x34\
+\x2e\x36\x31\x33\x2c\x31\x38\x2e\x33\x35\x34\x2c\x31\x30\x2c\x31\
+\x38\x2e\x33\x35\x34\x7a\x22\x2f\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\
+\x3e\x0d\x0a\
+\x00\x00\x00\x6c\
+\x3c\
+\x73\x76\x67\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\
+\x30\x2f\x73\x76\x67\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\
+\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x3e\x3c\x70\x61\x74\x68\
+\x20\x64\x3d\x22\x4d\x31\x38\x20\x31\x32\x76\x31\x48\x38\x76\x35\
+\x6c\x2d\x36\x2d\x36\x20\x36\x2d\x36\x76\x35\x68\x38\x56\x32\x68\
+\x32\x7a\x22\x2f\x3e\x3c\x2f\x73\x76\x67\x3e\
+\x00\x00\x02\xb7\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x36\x2e\x32\x2e\x31\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x4c\x61\x79\x65\x72\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\
+\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\
+\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\
+\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\
+\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x77\x69\x64\x74\
+\x68\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x68\x65\x69\x67\x68\x74\
+\x3d\x22\x35\x31\x32\x70\x78\x22\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\x32\x22\x20\x65\
+\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
+\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x35\x31\x32\x20\x35\x31\
+\x32\x22\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\
+\x65\x73\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x20\x69\x64\x3d\
+\x22\x49\x63\x6f\x6e\x5f\x35\x5f\x22\x3e\x0d\x0a\x09\x3c\x67\x3e\
+\x0d\x0a\x09\x09\x3c\x70\x6f\x6c\x79\x67\x6f\x6e\x20\x70\x6f\x69\
+\x6e\x74\x73\x3d\x22\x34\x30\x35\x2c\x31\x33\x36\x2e\x37\x39\x38\
+\x20\x33\x37\x35\x2e\x32\x30\x32\x2c\x31\x30\x37\x20\x32\x35\x36\
+\x2c\x32\x32\x36\x2e\x32\x30\x32\x20\x31\x33\x36\x2e\x37\x39\x38\
+\x2c\x31\x30\x37\x20\x31\x30\x37\x2c\x31\x33\x36\x2e\x37\x39\x38\
+\x20\x32\x32\x36\x2e\x32\x30\x32\x2c\x32\x35\x36\x20\x31\x30\x37\
+\x2c\x33\x37\x35\x2e\x32\x30\x32\x20\x31\x33\x36\x2e\x37\x39\x38\
+\x2c\x34\x30\x35\x20\x32\x35\x36\x2c\x32\x38\x35\x2e\x37\x39\x38\
+\x20\x0d\x0a\x09\x09\x09\x33\x37\x35\x2e\x32\x30\x32\x2c\x34\x30\
+\x35\x20\x34\x30\x35\x2c\x33\x37\x35\x2e\x32\x30\x32\x20\x32\x38\
+\x35\x2e\x37\x39\x38\x2c\x32\x35\x36\x20\x09\x09\x22\x2f\x3e\x0d\
+\x0a\x09\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\
+\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\x01\xdd\
+\x00\
+\x00\x06\xe4\x78\x9c\xcd\x54\x4d\x6f\x9b\x40\x10\x3d\x13\x29\xff\
+\x61\xba\xb7\x4a\xec\x17\xc4\xd4\xa6\xa6\x51\xfd\x21\xcb\x52\x9a\
+\x58\x6a\xea\xaa\xa7\x0a\xc3\x16\x50\x28\x20\x58\xc0\xce\xaf\xef\
+\xee\x92\x54\x51\x95\xfa\x18\xfb\xb0\x33\xda\x79\x6f\xde\xbc\x65\
+\x24\xa6\xd7\xfb\xdf\x39\x74\xa2\x6e\xb2\xb2\x08\x10\x27\x0c\x81\
+\x28\xa2\x32\xce\x8a\x24\x40\xad\xfc\x85\xc7\xe8\xfa\xd3\xe5\xc5\
+\xf4\x1d\xc6\xb0\x12\x85\xa8\x43\x59\xd6\x3e\x7c\x8e\xcb\x9d\x80\
+\x75\x9e\xb7\x8d\x34\x25\xe0\x1e\x71\x08\xb7\xe1\xeb\x76\x05\xcb\
+\x7d\x55\xd6\x12\x36\x79\x9b\xe0\x75\x01\xc4\x14\xb7\xc3\x10\x1f\
+\x3c\xc2\x18\xcc\xda\x2c\x8f\x81\xbd\x07\xc0\xd8\xe8\x2f\xee\xe6\
+\xf7\x3f\x36\x4b\x68\xba\x04\x36\xdf\x66\x37\xeb\x39\x20\x4c\xe9\
+\x77\x77\x4e\xe9\xe2\x7e\x61\x24\x38\xe1\x94\x2e\x6f\x11\xa0\x54\
+\xca\xca\xa7\xb4\xef\x7b\xd2\xbb\xa4\xac\x13\xba\xaa\xc3\x2a\xcd\
+\xa2\x86\x2a\x22\xd5\x44\xd5\x44\x95\x18\xe7\x24\x96\x31\xd2\x33\
+\xb4\xf4\x8b\xa7\x72\x04\x59\x1c\xa0\x9b\xf0\x20\xea\x9f\xea\xa2\
+\xbe\x44\xd1\x04\xaf\x48\x3b\x8c\x31\x2d\xf5\x44\xf1\xf7\x79\x56\
+\x3c\xbc\x46\xe4\x93\xc9\x84\x1a\x54\x51\x03\xc4\xaa\x3d\x82\xc3\
+\x90\x2f\x2f\x2c\xe8\xb3\x58\xa6\x01\x1a\x71\x47\x03\xa9\xc8\x92\
+\x54\xfe\xbd\x76\x99\xe8\x67\xa5\xee\x02\x06\xaa\xa6\x0f\x82\x46\
+\x1e\x72\x11\x20\x51\x84\xbb\x5c\xe0\x5d\x18\x3d\x24\x75\xd9\x16\
+\xb1\x5f\x88\x1e\x5e\x30\x3f\x1a\x6f\x7e\x53\x85\x91\xa2\x57\xb5\
+\x68\x44\xdd\x09\xf3\xea\x44\x05\x6b\x88\xd6\xb4\x0a\x65\x0a\xea\
+\xd1\x5f\xb8\xc7\x6c\x3e\x72\x89\x1b\x31\xdb\x25\x1f\xb0\x6b\x7b\
+\x2a\xaa\xa3\x73\x8a\x47\x8c\x8c\x22\xac\x00\x9b\xe9\x22\x76\xf1\
+\x13\xdc\x0d\x10\x33\x98\xfb\xdc\xa0\x73\x6a\x00\xd3\xa2\x4b\xb6\
+\x51\xd4\x67\x6b\xe6\x3c\xea\x4f\x60\x59\xf4\x1f\x1f\xce\x78\x7c\
+\x16\x3e\xae\xb8\x77\x3a\x1f\x53\xfa\xff\x25\x39\x63\xfe\x26\xa6\
+\xcc\x9c\x23\x4b\x3a\x07\x1f\x7a\x49\x27\xf3\x71\x6c\x49\x57\x6c\
+\xf2\x26\xa6\xcc\x9c\x23\x4b\x3a\x07\x1f\x7a\x49\x27\xf3\x31\x2c\
+\xe9\x39\xaa\x7f\xb6\xca\x7f\x00\x99\x18\x96\x19\
+\x00\x00\x02\x20\
+\x00\
+\x00\x07\x7f\x78\x9c\xdd\x55\x3b\x6f\xdb\x30\x10\xde\xfb\x2b\xae\
+\xe8\xc0\x76\x20\x45\x52\x24\x45\x06\x51\x02\xd4\x40\xa7\x74\x4b\
+\x96\x6e\x6a\xcc\x48\x6c\x6c\xc9\x90\x54\xcb\xfd\xf7\x3d\xc5\xd6\
+\xc3\x56\xd0\x29\x43\x11\x69\xd0\x3d\x78\x77\xdf\x7d\xc7\x83\xae\
+\x6f\x0f\xdb\x0d\xec\x7d\xdd\x84\xaa\x4c\x89\x60\x9c\x80\x2f\x1f\
+\xab\x75\x28\xf3\x94\x3c\xdc\x7f\xa3\x96\xdc\xde\x7c\xb8\xfe\x48\
+\x29\xdc\x17\xa1\x81\xa7\xb0\xf1\xd0\x65\x0d\xe4\xbe\xf4\x75\xd6\
+\xfa\x35\xfc\xfc\x03\xeb\x7d\x68\xf6\xf9\x16\x24\x53\x40\x29\x9e\
+\x47\x0d\x0a\x1f\xf2\xa2\x4d\x89\x54\xbb\x96\xcc\x6b\x08\xd4\x82\
+\xef\xbe\x56\x87\x94\x68\xc3\x14\x77\x0a\x74\xcc\xac\xb6\x31\x08\
+\xcb\x54\x9c\x68\x90\x8a\x40\x17\xd6\x6d\x81\x01\x47\x53\x9f\x04\
+\xc1\x96\x4d\x4a\x8a\xb6\xdd\x5d\x45\x51\xd7\x75\xac\x8b\x59\x55\
+\xe7\x91\xe4\x9c\x47\x58\xf4\x74\xe4\xea\xb0\x09\xe5\xf3\x6b\x07\
+\x85\x73\x2e\x7a\xf1\x12\x84\x99\x43\x58\xa7\x64\x97\xe5\x5e\x1c\
+\xd5\xb6\xce\xca\xe6\xa9\xaa\xb7\x29\xd9\x66\x6d\x1d\x0e\x9f\x39\
+\x73\xce\x48\xa3\x80\xf7\xef\xa0\x18\xcd\x8c\xb4\x12\x12\xc5\x24\
+\x97\x5f\xfa\xe0\x5d\xd6\x16\x80\xd9\xbe\x03\xb5\x0c\xf1\x72\xa4\
+\x42\x33\x2e\x35\x97\x77\x33\x13\x9f\x2b\x02\x9b\x76\x26\xf6\x54\
+\xe8\xd5\x99\x59\xc6\x2e\xd1\xbd\x79\x66\x35\x4c\x38\x9b\x24\x68\
+\x35\xf3\x7c\xb3\x40\xc1\xb4\x12\x16\xa8\x42\x70\x28\xe1\x38\x12\
+\x27\x8c\x45\xe0\x27\x69\x05\x97\xae\x8b\xd0\x41\x45\x94\xaf\x88\
+\x53\x3f\x13\x54\xce\x38\x62\x9f\x74\x4c\xe4\x30\xd1\x50\x87\x0a\
+\xc9\xac\x12\x09\x62\x18\xc4\xd5\x04\x70\xf4\xd2\x45\x02\x7a\x5e\
+\xe2\x6e\xc9\xea\x0f\xd2\xdf\xc6\x4d\x4a\x3e\x59\xde\xbf\x24\xc2\
+\x29\x44\xf9\xdb\xcd\x71\x8e\x49\x18\x93\xcc\xdb\x44\xfe\xb8\xd5\
+\xb3\x36\x63\xe6\xb4\x55\x2f\x6d\x1e\xc5\xb3\x36\x4f\x5e\xba\x48\
+\x40\x97\x45\x26\x93\xc3\x78\xe5\xe4\x2c\xd1\x38\x94\x51\x9c\x46\
+\x3a\x3a\x17\xf1\x97\x35\x46\xe6\xca\xaa\xf4\x04\x9a\xb6\xae\x9e\
+\x3d\xf2\xc8\x5f\x9e\xc1\x40\x71\x4b\xfc\x63\xb6\x4b\x49\x5d\xfd\
+\x2e\xd7\x67\xe6\x5f\x55\x28\x2f\xed\xdb\xd0\xfa\x7a\x13\xf0\x83\
+\x3b\x8b\x33\xc3\x9a\xa3\x6f\x58\x65\x96\x68\xa3\xcd\x9b\x4f\x6a\
+\xc1\xe2\xbb\xd9\xb8\x53\x3f\xef\x6d\x60\xff\x5a\x2d\x8d\x44\x49\
+\x31\x5b\x2d\x77\x64\x8a\x8f\xe2\xd9\x6a\x9d\xbc\x74\x91\x60\x71\
+\x29\xfe\x13\x12\x8f\x44\xf6\x7f\xab\x9b\xbf\x3f\x45\xd8\x3d\
+\x00\x00\x01\x20\
+\x3c\
+\x73\x76\x67\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\
+\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\
+\x30\x2f\x73\x76\x67\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\
+\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x3e\x3c\x70\x61\x74\x68\
+\x20\x64\x3d\x22\x4d\x34\x2e\x33\x34\x20\x31\x35\x2e\x36\x36\x41\
+\x37\x2e\x39\x37\x20\x37\x2e\x39\x37\x20\x30\x20\x30\x20\x30\x20\
+\x39\x20\x31\x37\x2e\x39\x34\x56\x31\x30\x48\x35\x56\x38\x68\x34\
+\x56\x35\x2e\x38\x33\x61\x33\x20\x33\x20\x30\x20\x31\x20\x31\x20\
+\x32\x20\x30\x56\x38\x68\x34\x76\x32\x68\x2d\x34\x76\x37\x2e\x39\
+\x34\x61\x37\x2e\x39\x37\x20\x37\x2e\x39\x37\x20\x30\x20\x30\x20\
+\x30\x20\x34\x2e\x36\x36\x2d\x32\x2e\x32\x38\x6c\x2d\x31\x2e\x34\
+\x32\x2d\x31\x2e\x34\x32\x68\x35\x2e\x36\x36\x6c\x2d\x32\x2e\x38\
+\x33\x20\x32\x2e\x38\x33\x61\x31\x30\x20\x31\x30\x20\x30\x20\x30\
+\x20\x31\x2d\x31\x34\x2e\x31\x34\x20\x30\x4c\x2e\x31\x20\x31\x34\
+\x2e\x32\x34\x68\x35\x2e\x36\x36\x6c\x2d\x31\x2e\x34\x32\x20\x31\
+\x2e\x34\x32\x7a\x4d\x31\x30\x20\x34\x61\x31\x20\x31\x20\x30\x20\
+\x31\x20\x30\x20\x30\x2d\x32\x20\x31\x20\x31\x20\x30\x20\x30\x20\
+\x30\x20\x30\x20\x32\x7a\x22\x2f\x3e\x3c\x2f\x73\x76\x67\x3e\
+\x00\x00\x02\x6c\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x38\x2e\x31\x2e\x31\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x53\x61\x76\x65\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\
+\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\
+\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\x6e\x73\
+\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\
+\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\
+\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\x79\x3d\
+\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x76\x69\x65\x77\x42\x6f\x78\
+\x3d\x22\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x20\x65\x6e\x61\
+\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3d\x22\
+\x6e\x65\x77\x20\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x20\x78\
+\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\
+\x76\x65\x22\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\
+\x31\x35\x2e\x31\x37\x33\x2c\x32\x48\x34\x43\x32\x2e\x38\x39\x39\
+\x2c\x32\x2c\x32\x2c\x32\x2e\x39\x2c\x32\x2c\x34\x76\x31\x32\x63\
+\x30\x2c\x31\x2e\x31\x2c\x30\x2e\x38\x39\x39\x2c\x32\x2c\x32\x2c\
+\x32\x68\x31\x32\x63\x31\x2e\x31\x30\x31\x2c\x30\x2c\x32\x2d\x30\
+\x2e\x39\x2c\x32\x2d\x32\x56\x35\x2e\x31\x32\x37\x4c\x31\x35\x2e\
+\x31\x37\x33\x2c\x32\x7a\x20\x4d\x31\x34\x2c\x38\x63\x30\x2c\x30\
+\x2e\x35\x34\x39\x2d\x30\x2e\x34\x35\x2c\x31\x2d\x31\x2c\x31\x48\
+\x37\x0d\x0a\x09\x43\x36\x2e\x34\x35\x2c\x39\x2c\x36\x2c\x38\x2e\
+\x35\x34\x39\x2c\x36\x2c\x38\x56\x33\x68\x38\x56\x38\x7a\x20\x4d\
+\x31\x33\x2c\x34\x68\x2d\x32\x76\x34\x68\x32\x56\x34\x7a\x22\x2f\
+\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\x02\xbd\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x75\x74\x66\
+\x2d\x38\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\x20\x47\x65\x6e\x65\
+\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\x65\x20\x49\x6c\x6c\
+\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x38\x2e\x31\x2e\x30\x2c\
+\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\x20\x50\x6c\x75\x67\
+\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\x65\x72\x73\x69\x6f\
+\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\x6c\x64\x20\x30\x29\
+\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\
+\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\
+\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\
+\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\
+\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\
+\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\
+\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\x64\
+\x3d\x22\x43\x69\x72\x63\x6c\x65\x22\x20\x78\x6d\x6c\x6e\x73\x3d\
+\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\
+\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\x6c\
+\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\
+\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\
+\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\x20\
+\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x76\x69\x65\x77\x42\
+\x6f\x78\x3d\x22\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\x20\x65\
+\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\
+\x3d\x22\x6e\x65\x77\x20\x30\x20\x30\x20\x32\x30\x20\x32\x30\x22\
+\x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\
+\x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\
+\x22\x4d\x31\x30\x2c\x30\x2e\x34\x43\x34\x2e\x36\x39\x38\x2c\x30\
+\x2e\x34\x2c\x30\x2e\x34\x2c\x34\x2e\x36\x39\x38\x2c\x30\x2e\x34\
+\x2c\x31\x30\x43\x30\x2e\x34\x2c\x31\x35\x2e\x33\x30\x32\x2c\x34\
+\x2e\x36\x39\x38\x2c\x31\x39\x2e\x36\x2c\x31\x30\x2c\x31\x39\x2e\
+\x36\x63\x35\x2e\x33\x30\x31\x2c\x30\x2c\x39\x2e\x36\x2d\x34\x2e\
+\x32\x39\x38\x2c\x39\x2e\x36\x2d\x39\x2e\x36\x30\x31\x0d\x0a\x09\
+\x43\x31\x39\x2e\x36\x2c\x34\x2e\x36\x39\x38\x2c\x31\x35\x2e\x33\
+\x30\x31\x2c\x30\x2e\x34\x2c\x31\x30\x2c\x30\x2e\x34\x7a\x20\x4d\
+\x31\x30\x2c\x31\x37\x2e\x35\x39\x39\x63\x2d\x34\x2e\x31\x39\x37\
+\x2c\x30\x2d\x37\x2e\x36\x2d\x33\x2e\x34\x30\x32\x2d\x37\x2e\x36\
+\x2d\x37\x2e\x36\x53\x35\x2e\x38\x30\x32\x2c\x32\x2e\x34\x2c\x31\
+\x30\x2c\x32\x2e\x34\x63\x34\x2e\x31\x39\x37\x2c\x30\x2c\x37\x2e\
+\x36\x30\x31\x2c\x33\x2e\x34\x30\x32\x2c\x37\x2e\x36\x30\x31\x2c\
+\x37\x2e\x36\x0d\x0a\x09\x53\x31\x34\x2e\x31\x39\x37\x2c\x31\x37\
+\x2e\x35\x39\x39\x2c\x31\x30\x2c\x31\x37\x2e\x35\x39\x39\x7a\x22\
+\x2f\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\
+\x00\x00\x03\x65\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x27\x31\x2e\
+\x30\x27\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x27\x55\x54\x46\
+\x2d\x38\x27\x3f\x3e\x0a\x3c\x21\x2d\x2d\x20\x54\x68\x69\x73\x20\
+\x66\x69\x6c\x65\x20\x77\x61\x73\x20\x67\x65\x6e\x65\x72\x61\x74\
+\x65\x64\x20\x62\x79\x20\x64\x76\x69\x73\x76\x67\x6d\x20\x32\x2e\
+\x34\x20\x2d\x2d\x3e\x0a\x3c\x73\x76\x67\x20\x68\x65\x69\x67\x68\
+\x74\x3d\x27\x31\x38\x2e\x37\x35\x70\x74\x27\x20\x76\x65\x72\x73\
+\x69\x6f\x6e\x3d\x27\x31\x2e\x31\x27\x20\x76\x69\x65\x77\x42\x6f\
+\x78\x3d\x27\x35\x36\x2e\x34\x30\x39\x34\x20\x35\x33\x2e\x38\x35\
+\x38\x33\x20\x31\x38\x2e\x37\x35\x20\x31\x38\x2e\x37\x35\x27\x20\
+\x77\x69\x64\x74\x68\x3d\x27\x31\x38\x2e\x37\x35\x70\x74\x27\x20\
+\x78\x6d\x6c\x6e\x73\x3d\x27\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
+\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\
+\x67\x27\x20\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x27\
+\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\
+\x67\x2f\x31\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x27\x3e\x0a\x3c\
+\x67\x20\x69\x64\x3d\x27\x70\x61\x67\x65\x31\x27\x3e\x0a\x3c\x67\
+\x20\x74\x72\x61\x6e\x73\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\
+\x69\x78\x28\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x30\x20\x30\x20\
+\x30\x2e\x39\x39\x36\x32\x36\x34\x20\x36\x35\x2e\x37\x38\x34\x34\
+\x20\x36\x33\x2e\x32\x33\x33\x33\x29\x27\x3e\x0a\x3c\x70\x61\x74\
+\x68\x20\x64\x3d\x27\x4d\x20\x2d\x38\x2e\x36\x35\x37\x33\x34\x20\
+\x38\x2e\x36\x35\x37\x33\x34\x4c\x20\x38\x2e\x36\x35\x37\x33\x34\
+\x20\x38\x2e\x36\x35\x37\x33\x34\x4c\x20\x38\x2e\x36\x35\x37\x33\
+\x34\x20\x2d\x38\x2e\x36\x35\x37\x33\x34\x4c\x20\x2d\x38\x2e\x36\
+\x35\x37\x33\x34\x20\x2d\x38\x2e\x36\x35\x37\x33\x34\x4c\x20\x2d\
+\x38\x2e\x36\x35\x37\x33\x34\x20\x38\x2e\x36\x35\x37\x33\x34\x5a\
+\x27\x20\x66\x69\x6c\x6c\x3d\x27\x6e\x6f\x6e\x65\x27\x20\x73\x74\
+\x72\x6f\x6b\x65\x3d\x27\x23\x30\x30\x30\x30\x30\x30\x27\x20\x73\
+\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3d\x27\x72\
+\x6f\x75\x6e\x64\x27\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\
+\x65\x6a\x6f\x69\x6e\x3d\x27\x72\x6f\x75\x6e\x64\x27\x20\x73\x74\
+\x72\x6f\x6b\x65\x2d\x6d\x69\x74\x65\x72\x6c\x69\x6d\x69\x74\x3d\
+\x27\x31\x30\x2e\x30\x33\x37\x35\x27\x20\x73\x74\x72\x6f\x6b\x65\
+\x2d\x77\x69\x64\x74\x68\x3d\x27\x31\x2e\x35\x30\x35\x36\x32\x27\
+\x2f\x3e\x0a\x3c\x2f\x67\x3e\x0a\x3c\x67\x20\x74\x72\x61\x6e\x73\
+\x66\x6f\x72\x6d\x3d\x27\x6d\x61\x74\x72\x69\x78\x28\x30\x2e\x39\
+\x39\x36\x32\x36\x34\x20\x30\x20\x30\x20\x30\x2e\x39\x39\x36\x32\
+\x36\x34\x20\x36\x35\x2e\x37\x38\x34\x34\x20\x36\x33\x2e\x32\x33\
+\x33\x33\x29\x27\x3e\x0a\x3c\x70\x61\x74\x68\x20\x64\x3d\x27\x4d\
+\x20\x34\x2e\x33\x32\x38\x36\x37\x20\x30\x43\x20\x34\x2e\x33\x32\
+\x38\x36\x37\x20\x2d\x32\x2e\x33\x39\x30\x36\x36\x20\x32\x2e\x33\
+\x39\x30\x36\x36\x20\x2d\x34\x2e\x33\x32\x38\x36\x37\x20\x30\x20\
+\x2d\x34\x2e\x33\x32\x38\x36\x37\x43\x20\x2d\x32\x2e\x33\x39\x30\
+\x36\x36\x20\x2d\x34\x2e\x33\x32\x38\x36\x37\x20\x2d\x34\x2e\x33\
+\x32\x38\x36\x37\x20\x2d\x32\x2e\x33\x39\x30\x36\x36\x20\x2d\x34\
+\x2e\x33\x32\x38\x36\x37\x20\x2d\x30\x43\x20\x2d\x34\x2e\x33\x32\
+\x38\x36\x37\x20\x32\x2e\x33\x39\x30\x36\x36\x20\x2d\x32\x2e\x33\
+\x39\x30\x36\x36\x20\x34\x2e\x33\x32\x38\x36\x37\x20\x30\x20\x34\
+\x2e\x33\x32\x38\x36\x37\x43\x20\x32\x2e\x33\x39\x30\x36\x36\x20\
+\x34\x2e\x33\x32\x38\x36\x37\x20\x34\x2e\x33\x32\x38\x36\x37\x20\
+\x32\x2e\x33\x39\x30\x36\x36\x20\x34\x2e\x33\x32\x38\x36\x37\x20\
+\x30\x5a\x27\x20\x66\x69\x6c\x6c\x3d\x27\x23\x30\x30\x30\x30\x30\
+\x30\x27\x2f\x3e\x0a\x3c\x2f\x67\x3e\x3c\x2f\x67\x3e\x0a\x3c\x2f\
+\x73\x76\x67\x3e\
+"
+
+qt_resource_name = b"\
+\x00\x05\
+\x00\x6f\xa6\x53\
+\x00\x69\
+\x00\x63\x00\x6f\x00\x6e\x00\x73\
+\x00\x10\
+\x08\x89\xfa\x47\
+\x00\x63\
+\x00\x65\x00\x6e\x00\x74\x00\x65\x00\x72\x00\x6f\x00\x72\x00\x69\x00\x67\x00\x69\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x0e\
+\x05\xed\x38\x67\
+\x00\x61\
+\x00\x72\x00\x72\x00\x6f\x00\x77\x00\x2d\x00\x6d\x00\x6f\x00\x76\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x14\
+\x0f\xa5\xe0\xc7\
+\x00\x6d\
+\x00\x61\x00\x67\x00\x6e\x00\x69\x00\x66\x00\x79\x00\x69\x00\x6e\x00\x67\x00\x2d\x00\x67\x00\x6c\x00\x61\x00\x73\x00\x73\x00\x2e\
+\x00\x73\x00\x76\x00\x67\
+\x00\x0f\
+\x09\x76\x60\xc7\
+\x00\x63\
+\x00\x6c\x00\x6f\x00\x73\x00\x65\x00\x2d\x00\x72\x00\x6f\x00\x75\x00\x6e\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x08\
+\x0c\xf7\x55\x87\
+\x00\x74\
+\x00\x65\x00\x78\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x10\
+\x0c\x57\x65\x47\
+\x00\x61\
+\x00\x72\x00\x72\x00\x6f\x00\x77\x00\x2d\x00\x72\x00\x65\x00\x73\x00\x69\x00\x7a\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x0f\
+\x07\x0e\xc4\x87\
+\x00\x6f\
+\x00\x70\x00\x65\x00\x6e\x00\x70\x00\x6f\x00\x6c\x00\x79\x00\x67\x00\x6f\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x1d\
+\x06\xec\xf4\xc7\
+\x00\x63\
+\x00\x68\x00\x65\x00\x76\x00\x72\x00\x6f\x00\x6e\x00\x2d\x00\x77\x00\x69\x00\x74\x00\x68\x00\x2d\x00\x63\x00\x69\x00\x72\x00\x63\
+\x00\x6c\x00\x65\x00\x2d\x00\x72\x00\x69\x00\x67\x00\x68\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x10\
+\x08\xe4\xaf\x47\
+\x00\x61\
+\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x64\x00\x6f\x00\x6e\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x08\
+\x05\xa8\x57\x87\
+\x00\x63\
+\x00\x6f\x00\x64\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x11\
+\x0c\xa7\xc7\x47\
+\x00\x63\
+\x00\x6c\x00\x6f\x00\x73\x00\x65\x00\x64\x00\x70\x00\x6f\x00\x6c\x00\x79\x00\x67\x00\x6f\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\
+\
+\x00\x11\
+\x01\x60\xbc\x47\
+\x00\x73\
+\x00\x6f\x00\x63\x00\x69\x00\x61\x00\x6c\x00\x2d\x00\x70\x00\x79\x00\x74\x00\x68\x00\x6f\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\
+\
+\x00\x19\
+\x0f\xef\x7b\xe7\
+\x00\x61\
+\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x63\x00\x6f\x00\x6c\x00\x6f\x00\x72\x00\x2d\x00\x70\x00\x61\x00\x6c\
+\x00\x65\x00\x74\x00\x74\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x12\
+\x08\x55\xef\xc7\
+\x00\x61\
+\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x64\x00\x65\x00\x6c\x00\x65\x00\x74\x00\x65\x00\x2e\x00\x73\x00\x76\
+\x00\x67\
+\x00\x12\
+\x08\x79\x97\xe7\
+\x00\x61\
+\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x63\x00\x61\x00\x6d\x00\x65\x00\x72\x00\x61\x00\x2e\x00\x73\x00\x76\
+\x00\x67\
+\x00\x19\
+\x0a\x43\x45\xc7\
+\x00\x61\
+\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x61\x00\x72\x00\x72\x00\x6f\x00\x77\x00\x2d\x00\x66\x00\x6f\x00\x72\
+\x00\x77\x00\x61\x00\x72\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x0a\
+\x01\xca\x6d\x87\
+\x00\x62\
+\x00\x75\x00\x63\x00\x6b\x00\x65\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x13\
+\x03\x24\x75\x47\
+\x00\x61\
+\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x72\x00\x65\x00\x66\x00\x72\x00\x65\x00\x73\x00\x68\x00\x2e\x00\x73\
+\x00\x76\x00\x67\
+\x00\x09\
+\x0b\x9e\x89\x07\
+\x00\x63\
+\x00\x68\x00\x65\x00\x63\x00\x6b\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x1c\
+\x08\x8a\x79\x07\
+\x00\x61\
+\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x72\x00\x61\x00\x64\x00\x69\x00\x6f\x00\x2d\x00\x62\x00\x75\x00\x74\
+\x00\x74\x00\x6f\x00\x6e\x00\x2d\x00\x6f\x00\x66\x00\x66\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x1b\
+\x0e\xb5\x68\xe7\
+\x00\x61\
+\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x72\x00\x61\x00\x64\x00\x69\x00\x6f\x00\x2d\x00\x62\x00\x75\x00\x74\
+\x00\x74\x00\x6f\x00\x6e\x00\x2d\x00\x6f\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x12\
+\x0c\x5e\xd4\xa7\
+\x00\x61\
+\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x6c\x00\x6f\x00\x63\x00\x61\x00\x74\x00\x65\x00\x2e\x00\x73\x00\x76\
+\x00\x67\
+\x00\x12\
+\x04\xb2\x21\x47\
+\x00\x61\
+\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x65\x00\x78\x00\x70\x00\x61\x00\x6e\x00\x64\x00\x2e\x00\x73\x00\x76\
+\x00\x67\
+\x00\x0e\
+\x0f\xcb\xd5\xc7\
+\x00\x70\
+\x00\x6c\x00\x75\x00\x73\x00\x2d\x00\x72\x00\x6f\x00\x75\x00\x6e\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x17\
+\x07\x87\x48\x27\
+\x00\x61\
+\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x66\x00\x6f\x00\x6c\x00\x64\x00\x65\x00\x72\x00\x2d\x00\x6f\x00\x70\
+\x00\x65\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x10\
+\x06\xe3\xaf\xe7\
+\x00\x61\
+\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x68\x00\x61\x00\x6e\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x0f\
+\x04\xf2\xa7\x87\
+\x00\x63\
+\x00\x6c\x00\x6f\x00\x73\x00\x65\x00\x64\x00\x63\x00\x75\x00\x72\x00\x76\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x17\
+\x06\xc6\x02\xa7\
+\x00\x74\
+\x00\x72\x00\x69\x00\x61\x00\x6e\x00\x67\x00\x6c\x00\x65\x00\x2d\x00\x73\x00\x74\x00\x72\x00\x6f\x00\x6b\x00\x65\x00\x64\x00\x2d\
+\x00\x31\x00\x35\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x0d\
+\x05\x20\xce\x87\
+\x00\x6f\
+\x00\x70\x00\x65\x00\x6e\x00\x63\x00\x75\x00\x72\x00\x76\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x07\
+\x0c\xf8\x5a\x07\
+\x00\x65\
+\x00\x79\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x08\
+\x0b\x07\x57\xa7\
+\x00\x65\
+\x00\x64\x00\x69\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x16\
+\x01\xfb\x76\x27\
+\x00\x61\
+\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x61\x00\x72\x00\x72\x00\x6f\x00\x77\x00\x2d\x00\x62\x00\x61\x00\x63\
+\x00\x6b\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x1c\
+\x04\x66\xe1\x67\
+\x00\x63\
+\x00\x68\x00\x65\x00\x76\x00\x72\x00\x6f\x00\x6e\x00\x2d\x00\x77\x00\x69\x00\x74\x00\x68\x00\x2d\x00\x63\x00\x69\x00\x72\x00\x63\
+\x00\x6c\x00\x65\x00\x2d\x00\x6c\x00\x65\x00\x66\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x15\
+\x0f\xc4\x59\xe7\
+\x00\x73\
+\x00\x75\x00\x62\x00\x64\x00\x69\x00\x72\x00\x65\x00\x63\x00\x74\x00\x6f\x00\x72\x00\x79\x00\x2d\x00\x6c\x00\x65\x00\x66\x00\x74\
+\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x11\
+\x0c\xdb\x38\xe7\
+\x00\x61\
+\x00\x6e\x00\x64\x00\x72\x00\x6f\x00\x69\x00\x64\x00\x2d\x00\x63\x00\x6c\x00\x6f\x00\x73\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
+\
+\x00\x08\
+\x08\xf7\x57\x07\
+\x00\x67\
+\x00\x72\x00\x69\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x10\
+\x04\xa9\x22\xc7\
+\x00\x66\
+\x00\x69\x00\x6c\x00\x6c\x00\x65\x00\x64\x00\x62\x00\x75\x00\x63\x00\x6b\x00\x65\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x0a\
+\x0f\x68\x53\xe7\
+\x00\x61\
+\x00\x6e\x00\x63\x00\x68\x00\x6f\x00\x72\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x08\
+\x08\xc8\x55\xe7\
+\x00\x73\
+\x00\x61\x00\x76\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x0a\
+\x0a\x2d\x1b\xc7\
+\x00\x63\
+\x00\x69\x00\x72\x00\x63\x00\x6c\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\
+\x00\x0a\
+\x0a\xc8\x62\x67\
+\x00\x63\
+\x00\x65\x00\x6e\x00\x74\x00\x65\x00\x72\x00\x2e\x00\x73\x00\x76\x00\x67\
+"
+
+qt_resource_struct_v1 = b"\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x29\x00\x00\x00\x02\
+\x00\x00\x01\xae\x00\x00\x00\x00\x00\x01\x00\x00\x24\x33\
+\x00\x00\x02\x9a\x00\x00\x00\x00\x00\x01\x00\x00\x39\x2f\
+\x00\x00\x04\xe4\x00\x00\x00\x00\x00\x01\x00\x00\x74\xb4\
+\x00\x00\x02\xb4\x00\x00\x00\x00\x00\x01\x00\x00\x3e\xea\
+\x00\x00\x05\x16\x00\x00\x00\x00\x00\x01\x00\x00\x77\x35\
+\x00\x00\x05\xc2\x00\x01\x00\x00\x00\x01\x00\x00\x80\x09\
+\x00\x00\x03\x9c\x00\x00\x00\x00\x00\x01\x00\x00\x4f\xdc\
+\x00\x00\x04\x42\x00\x00\x00\x00\x00\x01\x00\x00\x5f\x35\
+\x00\x00\x04\x9a\x00\x00\x00\x00\x00\x01\x00\x00\x68\xc4\
+\x00\x00\x01\x70\x00\x00\x00\x00\x00\x01\x00\x00\x1b\x82\
+\x00\x00\x00\x36\x00\x00\x00\x00\x00\x01\x00\x00\x04\x14\
+\x00\x00\x04\x66\x00\x00\x00\x00\x00\x01\x00\x00\x63\xf6\
+\x00\x00\x04\x1c\x00\x00\x00\x00\x00\x01\x00\x00\x59\x67\
+\x00\x00\x01\x0a\x00\x00\x00\x00\x00\x01\x00\x00\x15\x4c\
+\x00\x00\x00\xe6\x00\x00\x00\x00\x00\x01\x00\x00\x11\x26\
+\x00\x00\x03\xe8\x00\x00\x00\x00\x00\x01\x00\x00\x56\x11\
+\x00\x00\x02\x0e\x00\x00\x00\x00\x00\x01\x00\x00\x30\xe2\
+\x00\x00\x02\x38\x00\x00\x00\x00\x00\x01\x00\x00\x33\x88\
+\x00\x00\x00\x10\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+\x00\x00\x02\xf8\x00\x00\x00\x00\x00\x01\x00\x00\x45\x24\
+\x00\x00\x06\x02\x00\x00\x00\x00\x00\x01\x00\x00\x83\x51\
+\x00\x00\x01\x4a\x00\x00\x00\x00\x00\x01\x00\x00\x19\x05\
+\x00\x00\x05\xac\x00\x01\x00\x00\x00\x01\x00\x00\x7e\x28\
+\x00\x00\x00\x86\x00\x00\x00\x00\x00\x01\x00\x00\x0a\x78\
+\x00\x00\x06\x18\x00\x00\x00\x00\x00\x01\x00\x00\x85\xc1\
+\x00\x00\x02\x62\x00\x00\x00\x00\x00\x01\x00\x00\x36\xae\
+\x00\x00\x06\x32\x00\x00\x00\x00\x00\x01\x00\x00\x88\x82\
+\x00\x00\x04\xce\x00\x00\x00\x00\x00\x01\x00\x00\x71\x44\
+\x00\x00\x02\xe0\x00\x00\x00\x00\x00\x01\x00\x00\x42\x14\
+\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x01\x00\x00\x0e\xa3\
+\x00\x00\x03\x72\x00\x00\x00\x00\x00\x01\x00\x00\x4b\x74\
+\x00\x00\x01\x86\x00\x00\x00\x00\x00\x01\x00\x00\x1f\xff\
+\x00\x00\x05\x84\x00\x00\x00\x00\x00\x01\x00\x00\x7b\x6d\
+\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x01\x00\x00\x0d\xc2\
+\x00\x00\x04\xba\x00\x00\x00\x00\x00\x01\x00\x00\x6d\x55\
+\x00\x00\x03\x36\x00\x00\x00\x00\x00\x01\x00\x00\x48\x24\
+\x00\x00\x05\xe8\x00\x00\x00\x00\x00\x01\x00\x00\x82\x2d\
+\x00\x00\x00\x58\x00\x00\x00\x00\x00\x01\x00\x00\x06\xe1\
+\x00\x00\x05\x54\x00\x00\x00\x00\x00\x01\x00\x00\x7a\xfd\
+\x00\x00\x03\xc6\x00\x00\x00\x00\x00\x01\x00\x00\x53\x16\
+\x00\x00\x01\xd6\x00\x00\x00\x00\x00\x01\x00\x00\x2b\xb7\
+"
+
+qt_resource_struct_v2 = b"\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x29\x00\x00\x00\x02\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x01\xae\x00\x00\x00\x00\x00\x01\x00\x00\x24\x33\
+\x00\x00\x01\x64\xed\x16\x26\xd7\
+\x00\x00\x02\x9a\x00\x00\x00\x00\x00\x01\x00\x00\x39\x2f\
+\x00\x00\x01\x64\xed\x16\x26\xd6\
+\x00\x00\x04\xe4\x00\x00\x00\x00\x00\x01\x00\x00\x74\xb4\
+\x00\x00\x01\x64\xed\x16\x26\xd6\
+\x00\x00\x02\xb4\x00\x00\x00\x00\x00\x01\x00\x00\x3e\xea\
+\x00\x00\x01\x64\xed\x16\x26\xd6\
+\x00\x00\x05\x16\x00\x00\x00\x00\x00\x01\x00\x00\x77\x35\
+\x00\x00\x01\x64\xed\x16\x26\xd7\
+\x00\x00\x05\xc2\x00\x01\x00\x00\x00\x01\x00\x00\x80\x09\
+\x00\x00\x01\x64\xed\x16\x26\xd7\
+\x00\x00\x03\x9c\x00\x00\x00\x00\x00\x01\x00\x00\x4f\xdc\
+\x00\x00\x01\x64\xed\x16\x26\xd6\
+\x00\x00\x04\x42\x00\x00\x00\x00\x00\x01\x00\x00\x5f\x35\
+\x00\x00\x01\x64\xed\x16\x26\xd7\
+\x00\x00\x04\x9a\x00\x00\x00\x00\x00\x01\x00\x00\x68\xc4\
+\x00\x00\x01\x64\xed\x16\x26\xd7\
+\x00\x00\x01\x70\x00\x00\x00\x00\x00\x01\x00\x00\x1b\x82\
+\x00\x00\x01\x64\xed\x16\x26\xd7\
+\x00\x00\x00\x36\x00\x00\x00\x00\x00\x01\x00\x00\x04\x14\
+\x00\x00\x01\x64\xed\x16\x26\xd6\
+\x00\x00\x04\x66\x00\x00\x00\x00\x00\x01\x00\x00\x63\xf6\
+\x00\x00\x01\x64\xed\x16\x26\xd7\
+\x00\x00\x04\x1c\x00\x00\x00\x00\x00\x01\x00\x00\x59\x67\
+\x00\x00\x01\x64\xed\x16\x26\xd6\
+\x00\x00\x01\x0a\x00\x00\x00\x00\x00\x01\x00\x00\x15\x4c\
+\x00\x00\x01\x64\xed\x16\x26\xd7\
+\x00\x00\x00\xe6\x00\x00\x00\x00\x00\x01\x00\x00\x11\x26\
+\x00\x00\x01\x64\xed\x16\x26\xd7\
+\x00\x00\x03\xe8\x00\x00\x00\x00\x00\x01\x00\x00\x56\x11\
+\x00\x00\x01\x64\xed\x16\x26\xd6\
+\x00\x00\x02\x0e\x00\x00\x00\x00\x00\x01\x00\x00\x30\xe2\
+\x00\x00\x01\x64\xed\x16\x26\xd6\
+\x00\x00\x02\x38\x00\x00\x00\x00\x00\x01\x00\x00\x33\x88\
+\x00\x00\x01\x64\xed\x16\x26\xd6\
+\x00\x00\x00\x10\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+\x00\x00\x01\x64\xed\x16\x26\xd7\
+\x00\x00\x02\xf8\x00\x00\x00\x00\x00\x01\x00\x00\x45\x24\
+\x00\x00\x01\x64\xed\x16\x26\xd6\
+\x00\x00\x06\x02\x00\x00\x00\x00\x00\x01\x00\x00\x83\x51\
+\x00\x00\x01\x64\xed\x16\x26\xd7\
+\x00\x00\x01\x4a\x00\x00\x00\x00\x00\x01\x00\x00\x19\x05\
+\x00\x00\x01\x64\xed\x16\x26\xd6\
+\x00\x00\x05\xac\x00\x01\x00\x00\x00\x01\x00\x00\x7e\x28\
+\x00\x00\x01\x64\xed\x16\x26\xd7\
+\x00\x00\x00\x86\x00\x00\x00\x00\x00\x01\x00\x00\x0a\x78\
+\x00\x00\x01\x64\xed\x16\x26\xd7\
+\x00\x00\x06\x18\x00\x00\x00\x00\x00\x01\x00\x00\x85\xc1\
+\x00\x00\x01\x64\xed\x16\x26\xd7\
+\x00\x00\x02\x62\x00\x00\x00\x00\x00\x01\x00\x00\x36\xae\
+\x00\x00\x01\x64\xed\x16\x26\xd6\
+\x00\x00\x06\x32\x00\x00\x00\x00\x00\x01\x00\x00\x88\x82\
+\x00\x00\x01\x64\xed\x16\x26\xd6\
+\x00\x00\x04\xce\x00\x00\x00\x00\x00\x01\x00\x00\x71\x44\
+\x00\x00\x01\x64\xed\x16\x26\xd7\
+\x00\x00\x02\xe0\x00\x00\x00\x00\x00\x01\x00\x00\x42\x14\
+\x00\x00\x01\x64\xed\x16\x26\xd7\
+\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x01\x00\x00\x0e\xa3\
+\x00\x00\x01\x64\xed\x16\x26\xd6\
+\x00\x00\x03\x72\x00\x00\x00\x00\x00\x01\x00\x00\x4b\x74\
+\x00\x00\x01\x64\xed\x16\x26\xd6\
+\x00\x00\x01\x86\x00\x00\x00\x00\x00\x01\x00\x00\x1f\xff\
+\x00\x00\x01\x64\xed\x16\x26\xd7\
+\x00\x00\x05\x84\x00\x00\x00\x00\x00\x01\x00\x00\x7b\x6d\
+\x00\x00\x01\x64\xed\x16\x26\xd6\
+\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x01\x00\x00\x0d\xc2\
+\x00\x00\x01\x64\xed\x16\x26\xd7\
+\x00\x00\x04\xba\x00\x00\x00\x00\x00\x01\x00\x00\x6d\x55\
+\x00\x00\x01\x64\xed\x16\x26\xd7\
+\x00\x00\x03\x36\x00\x00\x00\x00\x00\x01\x00\x00\x48\x24\
+\x00\x00\x01\x64\xed\x16\x26\xd6\
+\x00\x00\x05\xe8\x00\x00\x00\x00\x00\x01\x00\x00\x82\x2d\
+\x00\x00\x01\x64\xed\x16\x26\xd6\
+\x00\x00\x00\x58\x00\x00\x00\x00\x00\x01\x00\x00\x06\xe1\
+\x00\x00\x01\x64\xed\x16\x26\xd7\
+\x00\x00\x05\x54\x00\x00\x00\x00\x00\x01\x00\x00\x7a\xfd\
+\x00\x00\x01\x64\xed\x16\x26\xd7\
+\x00\x00\x03\xc6\x00\x00\x00\x00\x00\x01\x00\x00\x53\x16\
+\x00\x00\x01\x64\xed\x16\x26\xd7\
+\x00\x00\x01\xd6\x00\x00\x00\x00\x00\x01\x00\x00\x2b\xb7\
+\x00\x00\x01\x64\xed\x16\x26\xd6\
+"
+
+qt_version = QtCore.qVersion().split('.')
+if qt_version < ['5', '8', '0']:
+ rcc_version = 1
+ qt_resource_struct = qt_resource_struct_v1
+else:
+ rcc_version = 2
+ qt_resource_struct = qt_resource_struct_v2
+
+def qInitResources():
+ QtCore.qRegisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+def qCleanupResources():
+ QtCore.qUnregisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+qInitResources()
diff --git a/Build/source/utils/asymptote/GUI/labelEditor.py b/Build/source/utils/asymptote/GUI/labelEditor.py
new file mode 100644
index 00000000000..76bc8d7d0a1
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/labelEditor.py
@@ -0,0 +1,154 @@
+#!/usr/bin/env python3
+
+from pyUIClass.labelTextEditor import Ui_Dialog
+import PyQt5.QtWidgets as Qw
+import PyQt5.QtSvg as Qs
+import PyQt5.QtGui as Qg
+import PyQt5.QtCore as Qc
+import xasyArgs as xa
+import xasy2asy as x2a
+import subprocess
+import xasyOptions as xo
+import xasyUtils as xu
+import tempfile
+import uuid
+import os
+import io
+
+
+class labelEditor(Qw.QDialog):
+ def __init__(self, text=''):
+ super().__init__()
+ self.ui = Ui_Dialog()
+ self.ui.setupUi(self)
+
+ self.ui.btnAccept.clicked.connect(self.accept)
+ self.ui.btnCancel.clicked.connect(self.reject)
+ self.ui.chkMathMode.stateChanged.connect(self.chkMathModeChecked)
+ self.ui.btnPreview.clicked.connect(self.btnPreviewOnClick)
+ self.ui.btnGetText.clicked.connect(self.btnGetTextOnClick)
+
+ self.svgPreview = None
+ self.initializeText(text)
+
+ def initializeText(self, text: str):
+ if text[0] == '$' and text[-1] == '$':
+ self.ui.chkMathMode.setChecked(True)
+ text = text.strip('$')
+
+ if text.startswith('\\displaystyle{'):
+ self.ui.cmbMathStyle.setCurrentText('Display Style')
+ text = text.rstrip('}')
+ text = text.replace('\\displaystyle{', '', 1)
+ elif text.startswith('\\scriptstyle{'):
+ self.ui.cmbMathStyle.setCurrentText('Script Style')
+ text = text.rstrip('}')
+ text = text.replace('\\scriptstyle{', '', 1)
+
+ self.ui.txtLabelEdit.setPlainText(text)
+
+ def chkMathModeChecked(self, checked):
+ self.ui.cmbMathStyle.setEnabled(checked)
+
+ def getText(self):
+ rawText = self.ui.txtLabelEdit.toPlainText()
+ rawText.replace('\n', ' ')
+ if self.ui.chkMathMode.isChecked():
+ prefix = ''
+ suffix = ''
+ if self.ui.cmbMathStyle.currentText() == 'Display Style':
+ prefix = '\\displaystyle{'
+ suffix = '}'
+ elif self.ui.cmbMathStyle.currentText() == 'Script Style':
+ prefix = '\\scriptstyle{'
+ suffix = '}'
+ return '${0}{1}{2}$'.format(prefix, rawText, suffix)
+ else:
+ return rawText
+
+ def btnPreviewOnClick(self):
+ path = xa.getArgs().asypath
+ if path is None:
+ opt = xo.xasyOptions().load()
+ path = opt['asyPath']
+
+ asyInput = """
+ frame f;
+ label(f, "{0}");
+ write(min(f), newl);
+ write(max(f), newl);
+ shipout(f);
+ """
+
+ self.svgPreview = Qs.QSvgRenderer()
+ with tempfile.TemporaryDirectory(prefix='xasylbl_') as tmpdir:
+ id = str(uuid.uuid4())
+ tmpFile = os.path.join(tmpdir, 'lbl-{0}.svg'.format(id))
+
+ with subprocess.Popen(args=[path, '-fsvg', '-o', tmpFile, '-'], encoding='utf-8', stdin=subprocess.PIPE,
+ stdout=subprocess.PIPE) as asy:
+ asy.stdin.write(asyInput.format(self.getText()))
+ asy.stdin.close()
+ out = asy.stdout.read()
+
+ raw_array = out.splitlines()
+
+ bounds_1, bounds_2 = [val.strip() for val in raw_array]
+
+ min_bounds = xu.listize(bounds_1, (float, float))
+ max_bounds = xu.listize(bounds_2, (float, float))
+
+ new_rect = self.processBounds(min_bounds, max_bounds)
+ self.svgPreview.load(tmpFile)
+
+
+
+ self.drawPreview(new_rect)
+
+ def drawPreview(self, naturalBounds):
+ img = Qg.QPixmap(self.ui.lblLabelPreview.size())
+ img.fill(Qg.QColor.fromRgbF(1, 1, 1, 1))
+ if self.svgPreview is None:
+ pass
+ else:
+ with Qg.QPainter(img) as pnt:
+ scale_ratio = self.getIdealScaleRatio(naturalBounds, self.ui.lblLabelPreview.rect())
+
+ pnt.translate(self.ui.lblLabelPreview.rect().center())
+ pnt.scale(scale_ratio, scale_ratio)
+ self.svgPreview.render(pnt, naturalBounds)
+ self.ui.lblLabelPreview.setPixmap(img)
+
+
+ def getIdealScaleRatio(self, rect, boundsRect):
+ assert isinstance(rect, (Qc.QRect, Qc.QRectF))
+ assert isinstance(rect, (Qc.QRect, Qc.QRectF))
+
+ magic_ratio = 0.50
+ idealRatioHeight = (magic_ratio * boundsRect.height()) / rect.height()
+ magicRatioWidth = 0.50
+
+ if idealRatioHeight * rect.width() > magicRatioWidth * boundsRect.width():
+ idealRatioWidth = (magicRatioWidth * boundsRect.width()) / rect.width()
+ idealRatio = min(idealRatioHeight, idealRatioWidth)
+ else:
+ idealRatio = idealRatioHeight
+ return idealRatio
+
+ def processBounds(self, minPt, maxPt):
+ p1x, p1y = minPt
+ p2x, p2y = maxPt
+
+ minPt = Qc.QPointF(p1x, p1y)
+ maxPt = Qc.QPointF(p2x, p2y)
+
+ newRect = Qc.QRectF(minPt, maxPt)
+ return newRect
+
+
+ def btnGetTextOnClick(self):
+ msgbox = Qw.QMessageBox()
+ msgbox.setText('Text Preview:\n' + self.getText())
+ msgbox.setWindowTitle('Text preview')
+ msgbox.show()
+ return msgbox.exec_()
diff --git a/Build/source/utils/asymptote/GUI/locale/th/LC_MESSAGES/base.po b/Build/source/utils/asymptote/GUI/locale/th/LC_MESSAGES/base.po
new file mode 100644
index 00000000000..507fd335610
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/locale/th/LC_MESSAGES/base.po
@@ -0,0 +1,24 @@
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Supakorn Rassameemasmuang, 2018.
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-05-16 17:07-0600\n"
+"PO-Revision-Date: 2018-05-16 17:20-0700\n"
+"Last-Translator: Supakorn Rassameemasmuang <rassamee@ualberta.ca>\n"
+"Language-Team: English <kde-i18n-doc@kde.org>\n"
+"Language: th\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Lokalize 2.0\n"
+
+#: xasyStrings.py:10
+msgid "Rotate"
+msgstr "หมุน"
+
+
diff --git a/Build/source/utils/asymptote/GUI/pyUIClass/custMatTransform.py b/Build/source/utils/asymptote/GUI/pyUIClass/custMatTransform.py
new file mode 100644
index 00000000000..71dc6be2d21
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/pyUIClass/custMatTransform.py
@@ -0,0 +1,173 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'GUI/windows/custMatTransform.ui'
+#
+# Created by: PyQt5 UI code generator 5.10
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+class Ui_Dialog(object):
+ def setupUi(self, Dialog):
+ Dialog.setObjectName("Dialog")
+ Dialog.resize(500, 320)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(Dialog.sizePolicy().hasHeightForWidth())
+ Dialog.setSizePolicy(sizePolicy)
+ Dialog.setMinimumSize(QtCore.QSize(500, 320))
+ Dialog.setMaximumSize(QtCore.QSize(500, 320))
+ Dialog.setMouseTracking(False)
+ icon = QtGui.QIcon()
+ icon.addPixmap(QtGui.QPixmap(":/icons/android-expand.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ Dialog.setWindowIcon(icon)
+ Dialog.setSizeGripEnabled(True)
+ Dialog.setModal(False)
+ self.centralFrame = QtWidgets.QFrame(Dialog)
+ self.centralFrame.setGeometry(QtCore.QRect(20, 20, 461, 271))
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.centralFrame.sizePolicy().hasHeightForWidth())
+ self.centralFrame.setSizePolicy(sizePolicy)
+ self.centralFrame.setBaseSize(QtCore.QSize(0, 0))
+ self.centralFrame.setObjectName("centralFrame")
+ self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.centralFrame)
+ self.verticalLayout_3.setSpacing(4)
+ self.verticalLayout_3.setObjectName("verticalLayout_3")
+ self.horizontalLayout = QtWidgets.QHBoxLayout()
+ self.horizontalLayout.setObjectName("horizontalLayout")
+ self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
+ self.horizontalLayout_3.setObjectName("horizontalLayout_3")
+ self.verticalLayout = QtWidgets.QVBoxLayout()
+ self.verticalLayout.setObjectName("verticalLayout")
+ self.label = QtWidgets.QLabel(self.centralFrame)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth())
+ self.label.setSizePolicy(sizePolicy)
+ self.label.setObjectName("label")
+ self.verticalLayout.addWidget(self.label)
+ self.gridFrame = QtWidgets.QFrame(self.centralFrame)
+ self.gridFrame.setFrameShape(QtWidgets.QFrame.Box)
+ self.gridFrame.setObjectName("gridFrame")
+ self.gridLayout = QtWidgets.QGridLayout(self.gridFrame)
+ self.gridLayout.setObjectName("gridLayout")
+ self.lineMat00 = QtWidgets.QLineEdit(self.gridFrame)
+ self.lineMat00.setMaximumSize(QtCore.QSize(70, 16777215))
+ self.lineMat00.setObjectName("lineMat00")
+ self.gridLayout.addWidget(self.lineMat00, 1, 0, 1, 1)
+ self.lineMat11 = QtWidgets.QLineEdit(self.gridFrame)
+ self.lineMat11.setMaximumSize(QtCore.QSize(70, 16777215))
+ self.lineMat11.setObjectName("lineMat11")
+ self.gridLayout.addWidget(self.lineMat11, 2, 1, 1, 1)
+ self.lineMat10 = QtWidgets.QLineEdit(self.gridFrame)
+ self.lineMat10.setMaximumSize(QtCore.QSize(70, 16777215))
+ self.lineMat10.setObjectName("lineMat10")
+ self.gridLayout.addWidget(self.lineMat10, 2, 0, 1, 1)
+ self.lineMat01 = QtWidgets.QLineEdit(self.gridFrame)
+ self.lineMat01.setMaximumSize(QtCore.QSize(70, 16777215))
+ self.lineMat01.setObjectName("lineMat01")
+ self.gridLayout.addWidget(self.lineMat01, 1, 1, 1, 1)
+ self.verticalLayout.addWidget(self.gridFrame)
+ self.horizontalLayout_3.addLayout(self.verticalLayout)
+ spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+ self.horizontalLayout_3.addItem(spacerItem)
+ self.verticalLayout_4 = QtWidgets.QVBoxLayout()
+ self.verticalLayout_4.setObjectName("verticalLayout_4")
+ self.label_3 = QtWidgets.QLabel(self.centralFrame)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.label_3.sizePolicy().hasHeightForWidth())
+ self.label_3.setSizePolicy(sizePolicy)
+ self.label_3.setObjectName("label_3")
+ self.verticalLayout_4.addWidget(self.label_3)
+ self.gridFrame_2 = QtWidgets.QFrame(self.centralFrame)
+ self.gridFrame_2.setFrameShape(QtWidgets.QFrame.Box)
+ self.gridFrame_2.setObjectName("gridFrame_2")
+ self.gridLayout_2 = QtWidgets.QGridLayout(self.gridFrame_2)
+ self.gridLayout_2.setObjectName("gridLayout_2")
+ self.lineMatTy = QtWidgets.QLineEdit(self.gridFrame_2)
+ self.lineMatTy.setMaximumSize(QtCore.QSize(70, 16777215))
+ self.lineMatTy.setObjectName("lineMatTy")
+ self.gridLayout_2.addWidget(self.lineMatTy, 2, 1, 1, 1)
+ self.lineMatTx = QtWidgets.QLineEdit(self.gridFrame_2)
+ self.lineMatTx.setMaximumSize(QtCore.QSize(70, 16777215))
+ self.lineMatTx.setObjectName("lineMatTx")
+ self.gridLayout_2.addWidget(self.lineMatTx, 1, 1, 1, 1)
+ self.verticalLayout_4.addWidget(self.gridFrame_2)
+ self.horizontalLayout_3.addLayout(self.verticalLayout_4)
+ self.horizontalLayout.addLayout(self.horizontalLayout_3)
+ spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+ self.horizontalLayout.addItem(spacerItem1)
+ self.verticalLayout_2 = QtWidgets.QVBoxLayout()
+ self.verticalLayout_2.setObjectName("verticalLayout_2")
+ self.label_2 = QtWidgets.QLabel(self.centralFrame)
+ self.label_2.setObjectName("label_2")
+ self.verticalLayout_2.addWidget(self.label_2)
+ self.imgPreview = QtWidgets.QLabel(self.centralFrame)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.imgPreview.sizePolicy().hasHeightForWidth())
+ self.imgPreview.setSizePolicy(sizePolicy)
+ self.imgPreview.setMinimumSize(QtCore.QSize(150, 150))
+ self.imgPreview.setBaseSize(QtCore.QSize(300, 300))
+ self.imgPreview.setFrameShape(QtWidgets.QFrame.Box)
+ self.imgPreview.setText("")
+ self.imgPreview.setObjectName("imgPreview")
+ self.verticalLayout_2.addWidget(self.imgPreview)
+ self.horizontalLayout.addLayout(self.verticalLayout_2)
+ self.verticalLayout_3.addLayout(self.horizontalLayout)
+ self.lblAnchor = QtWidgets.QLabel(self.centralFrame)
+ self.lblAnchor.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.lblAnchor.setObjectName("lblAnchor")
+ self.verticalLayout_3.addWidget(self.lblAnchor)
+ self.lblCoordsMode = QtWidgets.QLabel(self.centralFrame)
+ self.lblCoordsMode.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.lblCoordsMode.setObjectName("lblCoordsMode")
+ self.verticalLayout_3.addWidget(self.lblCoordsMode)
+ spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+ self.verticalLayout_3.addItem(spacerItem2)
+ self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
+ self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+ spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+ self.horizontalLayout_2.addItem(spacerItem3)
+ self.btnReset = QtWidgets.QPushButton(self.centralFrame)
+ self.btnReset.setObjectName("btnReset")
+ self.horizontalLayout_2.addWidget(self.btnReset)
+ self.btnCancel = QtWidgets.QPushButton(self.centralFrame)
+ self.btnCancel.setObjectName("btnCancel")
+ self.horizontalLayout_2.addWidget(self.btnCancel)
+ self.btnAccept = QtWidgets.QPushButton(self.centralFrame)
+ self.btnAccept.setObjectName("btnAccept")
+ self.horizontalLayout_2.addWidget(self.btnAccept)
+ self.verticalLayout_3.addLayout(self.horizontalLayout_2)
+
+ self.retranslateUi(Dialog)
+ QtCore.QMetaObject.connectSlotsByName(Dialog)
+
+ def retranslateUi(self, Dialog):
+ _translate = QtCore.QCoreApplication.translate
+ Dialog.setWindowTitle(_translate("Dialog", "Set Custom Transformation"))
+ self.label.setText(_translate("Dialog", "Transformation Matrix"))
+ self.lineMat00.setText(_translate("Dialog", "1"))
+ self.lineMat11.setText(_translate("Dialog", "1"))
+ self.lineMat10.setText(_translate("Dialog", "0"))
+ self.lineMat01.setText(_translate("Dialog", "0"))
+ self.label_3.setText(_translate("Dialog", "Translation"))
+ self.lineMatTy.setText(_translate("Dialog", "0"))
+ self.lineMatTx.setText(_translate("Dialog", "0"))
+ self.label_2.setText(_translate("Dialog", "Preview:"))
+ self.imgPreview.setToolTip(_translate("Dialog", "Shows a red square if transformation determinant is negative."))
+ self.lblAnchor.setText(_translate("Dialog", "Anchor: Top Left"))
+ self.lblCoordsMode.setText(_translate("Dialog", "Coordinates: Global"))
+ self.btnReset.setText(_translate("Dialog", "Reset"))
+ self.btnCancel.setText(_translate("Dialog", "Cancel"))
+ self.btnAccept.setText(_translate("Dialog", "Accept"))
+
+import icons_rc
diff --git a/Build/source/utils/asymptote/GUI/pyUIClass/labelTextEditor.py b/Build/source/utils/asymptote/GUI/pyUIClass/labelTextEditor.py
new file mode 100644
index 00000000000..25bfc30cc13
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/pyUIClass/labelTextEditor.py
@@ -0,0 +1,119 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'GUI/windows/labelTextEditor.ui'
+#
+# Created by: PyQt5 UI code generator 5.10
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+class Ui_Dialog(object):
+ def setupUi(self, Dialog):
+ Dialog.setObjectName("Dialog")
+ Dialog.resize(473, 424)
+ self.verticalLayout = QtWidgets.QVBoxLayout(Dialog)
+ self.verticalLayout.setObjectName("verticalLayout")
+ self.frame = QtWidgets.QFrame(Dialog)
+ self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
+ self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
+ self.frame.setObjectName("frame")
+ self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.frame)
+ self.verticalLayout_3.setObjectName("verticalLayout_3")
+ self.gridLayout = QtWidgets.QGridLayout()
+ self.gridLayout.setContentsMargins(-1, 0, -1, -1)
+ self.gridLayout.setObjectName("gridLayout")
+ spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+ self.gridLayout.addItem(spacerItem, 0, 2, 1, 1)
+ self.chkMathMode = QtWidgets.QCheckBox(self.frame)
+ self.chkMathMode.setObjectName("chkMathMode")
+ self.gridLayout.addWidget(self.chkMathMode, 0, 0, 1, 1)
+ self.cmbMathStyle = QtWidgets.QComboBox(self.frame)
+ self.cmbMathStyle.setEnabled(False)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.cmbMathStyle.sizePolicy().hasHeightForWidth())
+ self.cmbMathStyle.setSizePolicy(sizePolicy)
+ self.cmbMathStyle.setMinimumSize(QtCore.QSize(100, 0))
+ self.cmbMathStyle.setObjectName("cmbMathStyle")
+ self.cmbMathStyle.addItem("")
+ self.cmbMathStyle.addItem("")
+ self.cmbMathStyle.addItem("")
+ self.gridLayout.addWidget(self.cmbMathStyle, 0, 1, 1, 1)
+ self.verticalLayout_3.addLayout(self.gridLayout)
+ self.verticalLayout_2 = QtWidgets.QVBoxLayout()
+ self.verticalLayout_2.setObjectName("verticalLayout_2")
+ self.txtLabelEdit = QtWidgets.QPlainTextEdit(self.frame)
+ self.txtLabelEdit.setObjectName("txtLabelEdit")
+ self.verticalLayout_2.addWidget(self.txtLabelEdit)
+ self.verticalLayout_3.addLayout(self.verticalLayout_2)
+ self.verticalLayout_4 = QtWidgets.QVBoxLayout()
+ self.verticalLayout_4.setContentsMargins(-1, 0, -1, -1)
+ self.verticalLayout_4.setObjectName("verticalLayout_4")
+ self.label = QtWidgets.QLabel(self.frame)
+ self.label.setObjectName("label")
+ self.verticalLayout_4.addWidget(self.label)
+ self.lblLabelPreview = QtWidgets.QLabel(self.frame)
+ self.lblLabelPreview.setMinimumSize(QtCore.QSize(0, 100))
+ self.lblLabelPreview.setFrameShape(QtWidgets.QFrame.Box)
+ self.lblLabelPreview.setText("")
+ self.lblLabelPreview.setObjectName("lblLabelPreview")
+ self.verticalLayout_4.addWidget(self.lblLabelPreview)
+ self.verticalLayout_3.addLayout(self.verticalLayout_4)
+ self.horizontalLayout = QtWidgets.QHBoxLayout()
+ self.horizontalLayout.setObjectName("horizontalLayout")
+ spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+ self.horizontalLayout.addItem(spacerItem1)
+ self.btnGetText = QtWidgets.QPushButton(self.frame)
+ self.btnGetText.setMaximumSize(QtCore.QSize(32, 32))
+ self.btnGetText.setText("")
+ icon = QtGui.QIcon()
+ icon.addPixmap(QtGui.QPixmap(":/icons/text.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnGetText.setIcon(icon)
+ self.btnGetText.setFlat(True)
+ self.btnGetText.setObjectName("btnGetText")
+ self.horizontalLayout.addWidget(self.btnGetText)
+ self.btnPreview = QtWidgets.QPushButton(self.frame)
+ self.btnPreview.setMaximumSize(QtCore.QSize(32, 32))
+ self.btnPreview.setText("")
+ icon1 = QtGui.QIcon()
+ icon1.addPixmap(QtGui.QPixmap(":/icons/eye.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnPreview.setIcon(icon1)
+ self.btnPreview.setFlat(True)
+ self.btnPreview.setObjectName("btnPreview")
+ self.horizontalLayout.addWidget(self.btnPreview)
+ self.btnCancel = QtWidgets.QPushButton(self.frame)
+ self.btnCancel.setMaximumSize(QtCore.QSize(32, 32))
+ self.btnCancel.setText("")
+ icon2 = QtGui.QIcon()
+ icon2.addPixmap(QtGui.QPixmap(":/icons/android-close.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnCancel.setIcon(icon2)
+ self.btnCancel.setFlat(True)
+ self.btnCancel.setObjectName("btnCancel")
+ self.horizontalLayout.addWidget(self.btnCancel)
+ self.btnAccept = QtWidgets.QPushButton(self.frame)
+ self.btnAccept.setMaximumSize(QtCore.QSize(32, 32))
+ self.btnAccept.setText("")
+ icon3 = QtGui.QIcon()
+ icon3.addPixmap(QtGui.QPixmap(":/icons/android-done.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnAccept.setIcon(icon3)
+ self.btnAccept.setFlat(True)
+ self.btnAccept.setObjectName("btnAccept")
+ self.horizontalLayout.addWidget(self.btnAccept)
+ self.verticalLayout_3.addLayout(self.horizontalLayout)
+ self.verticalLayout.addWidget(self.frame)
+
+ self.retranslateUi(Dialog)
+ QtCore.QMetaObject.connectSlotsByName(Dialog)
+
+ def retranslateUi(self, Dialog):
+ _translate = QtCore.QCoreApplication.translate
+ Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
+ self.chkMathMode.setText(_translate("Dialog", "Math Mode"))
+ self.cmbMathStyle.setItemText(0, _translate("Dialog", "Inline Style"))
+ self.cmbMathStyle.setItemText(1, _translate("Dialog", "Display Style"))
+ self.cmbMathStyle.setItemText(2, _translate("Dialog", "Script Style"))
+ self.label.setText(_translate("Dialog", "Preview"))
+
+import icons_rc
diff --git a/Build/source/utils/asymptote/GUI/pyUIClass/setCustomAnchor.py b/Build/source/utils/asymptote/GUI/pyUIClass/setCustomAnchor.py
new file mode 100644
index 00000000000..e1637173fc3
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/pyUIClass/setCustomAnchor.py
@@ -0,0 +1,55 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'GUI/windows/setCustomAnchor.ui'
+#
+# Created by: PyQt5 UI code generator 5.10
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+class Ui_Dialog(object):
+ def setupUi(self, Dialog):
+ Dialog.setObjectName("Dialog")
+ Dialog.resize(245, 161)
+ self.verticalLayoutWidget = QtWidgets.QWidget(Dialog)
+ self.verticalLayoutWidget.setGeometry(QtCore.QRect(20, 20, 201, 121))
+ self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
+ self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
+ self.verticalLayout.setContentsMargins(0, 0, 0, 0)
+ self.verticalLayout.setObjectName("verticalLayout")
+ self.formLayout = QtWidgets.QFormLayout()
+ self.formLayout.setFieldGrowthPolicy(QtWidgets.QFormLayout.AllNonFixedFieldsGrow)
+ self.formLayout.setObjectName("formLayout")
+ self.label = QtWidgets.QLabel(self.verticalLayoutWidget)
+ self.label.setObjectName("label")
+ self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label)
+ self.lineEditX = QtWidgets.QLineEdit(self.verticalLayoutWidget)
+ self.lineEditX.setObjectName("lineEditX")
+ self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.lineEditX)
+ self.label_2 = QtWidgets.QLabel(self.verticalLayoutWidget)
+ self.label_2.setObjectName("label_2")
+ self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_2)
+ self.lineEditY = QtWidgets.QLineEdit(self.verticalLayoutWidget)
+ self.lineEditY.setObjectName("lineEditY")
+ self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.lineEditY)
+ self.verticalLayout.addLayout(self.formLayout)
+ self.buttonBox = QtWidgets.QDialogButtonBox(self.verticalLayoutWidget)
+ self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
+ self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok|QtWidgets.QDialogButtonBox.Reset)
+ self.buttonBox.setObjectName("buttonBox")
+ self.verticalLayout.addWidget(self.buttonBox)
+
+ self.retranslateUi(Dialog)
+ self.buttonBox.accepted.connect(Dialog.accept)
+ self.buttonBox.rejected.connect(Dialog.reject)
+ QtCore.QMetaObject.connectSlotsByName(Dialog)
+
+ def retranslateUi(self, Dialog):
+ _translate = QtCore.QCoreApplication.translate
+ Dialog.setWindowTitle(_translate("Dialog", "Set Custom Anchor"))
+ self.label.setText(_translate("Dialog", "X:"))
+ self.lineEditX.setText(_translate("Dialog", "0"))
+ self.label_2.setText(_translate("Dialog", "Y:"))
+ self.lineEditY.setText(_translate("Dialog", "0"))
+
diff --git a/Build/source/utils/asymptote/GUI/pyUIClass/widg_addLabel.py b/Build/source/utils/asymptote/GUI/pyUIClass/widg_addLabel.py
new file mode 100644
index 00000000000..f7c7a0c5ae5
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/pyUIClass/widg_addLabel.py
@@ -0,0 +1,140 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'GUI/windows/widg_addLabel.ui'
+#
+# Created by: PyQt5 UI code generator 5.10
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+class Ui_Form(object):
+ def setupUi(self, Form):
+ Form.setObjectName("Form")
+ Form.setWindowModality(QtCore.Qt.NonModal)
+ Form.resize(599, 35)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(Form.sizePolicy().hasHeightForWidth())
+ Form.setSizePolicy(sizePolicy)
+ Form.setMinimumSize(QtCore.QSize(0, 35))
+ Form.setMaximumSize(QtCore.QSize(16777215, 35))
+ self.horizontalLayout_2 = QtWidgets.QHBoxLayout(Form)
+ self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
+ self.horizontalLayout_2.setSpacing(0)
+ self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+ self.horizontalLayout = QtWidgets.QHBoxLayout()
+ self.horizontalLayout.setObjectName("horizontalLayout")
+ self.txtLabelText = QtWidgets.QLineEdit(Form)
+ self.txtLabelText.setObjectName("txtLabelText")
+ self.horizontalLayout.addWidget(self.txtLabelText)
+ self.btnAdvancedEdit = QtWidgets.QPushButton(Form)
+ self.btnAdvancedEdit.setMaximumSize(QtCore.QSize(25, 25))
+ self.btnAdvancedEdit.setText("")
+ icon = QtGui.QIcon()
+ icon.addPixmap(QtGui.QPixmap(":/icons/edit.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnAdvancedEdit.setIcon(icon)
+ self.btnAdvancedEdit.setFlat(True)
+ self.btnAdvancedEdit.setObjectName("btnAdvancedEdit")
+ self.horizontalLayout.addWidget(self.btnAdvancedEdit)
+ self.label = QtWidgets.QLabel(Form)
+ self.label.setObjectName("label")
+ self.horizontalLayout.addWidget(self.label)
+ self.cmbAlign = QtWidgets.QComboBox(Form)
+ self.cmbAlign.setObjectName("cmbAlign")
+ self.cmbAlign.addItem("")
+ self.cmbAlign.addItem("")
+ self.cmbAlign.addItem("")
+ self.cmbAlign.addItem("")
+ self.cmbAlign.addItem("")
+ self.cmbAlign.addItem("")
+ self.cmbAlign.addItem("")
+ self.cmbAlign.addItem("")
+ self.cmbAlign.addItem("")
+ self.cmbAlign.addItem("")
+ self.horizontalLayout.addWidget(self.cmbAlign)
+ self.label_3 = QtWidgets.QLabel(Form)
+ self.label_3.setObjectName("label_3")
+ self.horizontalLayout.addWidget(self.label_3)
+ self.cmbFontSize = QtWidgets.QComboBox(Form)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.cmbFontSize.sizePolicy().hasHeightForWidth())
+ self.cmbFontSize.setSizePolicy(sizePolicy)
+ self.cmbFontSize.setEditable(True)
+ self.cmbFontSize.setObjectName("cmbFontSize")
+ self.cmbFontSize.addItem("")
+ self.cmbFontSize.addItem("")
+ self.cmbFontSize.addItem("")
+ self.cmbFontSize.addItem("")
+ self.cmbFontSize.addItem("")
+ self.cmbFontSize.addItem("")
+ self.cmbFontSize.addItem("")
+ self.cmbFontSize.addItem("")
+ self.cmbFontSize.addItem("")
+ self.cmbFontSize.addItem("")
+ self.cmbFontSize.addItem("")
+ self.horizontalLayout.addWidget(self.cmbFontSize)
+ self.label_2 = QtWidgets.QLabel(Form)
+ self.label_2.setObjectName("label_2")
+ self.horizontalLayout.addWidget(self.label_2)
+ self.txtShiftX = QtWidgets.QLineEdit(Form)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.txtShiftX.sizePolicy().hasHeightForWidth())
+ self.txtShiftX.setSizePolicy(sizePolicy)
+ self.txtShiftX.setMaximumSize(QtCore.QSize(50, 16777215))
+ self.txtShiftX.setObjectName("txtShiftX")
+ self.horizontalLayout.addWidget(self.txtShiftX)
+ self.txtShiftY = QtWidgets.QLineEdit(Form)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.txtShiftY.sizePolicy().hasHeightForWidth())
+ self.txtShiftY.setSizePolicy(sizePolicy)
+ self.txtShiftY.setMaximumSize(QtCore.QSize(50, 16777215))
+ self.txtShiftY.setObjectName("txtShiftY")
+ self.horizontalLayout.addWidget(self.txtShiftY)
+ spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+ self.horizontalLayout.addItem(spacerItem)
+ self.horizontalLayout_2.addLayout(self.horizontalLayout)
+
+ self.retranslateUi(Form)
+ QtCore.QMetaObject.connectSlotsByName(Form)
+
+ def retranslateUi(self, Form):
+ _translate = QtCore.QCoreApplication.translate
+ Form.setWindowTitle(_translate("Form", "Form"))
+ self.txtLabelText.setToolTip(_translate("Form", "Number of Sides"))
+ self.txtLabelText.setPlaceholderText(_translate("Form", "Text"))
+ self.label.setText(_translate("Form", "Align"))
+ self.cmbAlign.setItemText(0, _translate("Form", "Center"))
+ self.cmbAlign.setItemText(1, _translate("Form", "N"))
+ self.cmbAlign.setItemText(2, _translate("Form", "E"))
+ self.cmbAlign.setItemText(3, _translate("Form", "W"))
+ self.cmbAlign.setItemText(4, _translate("Form", "S"))
+ self.cmbAlign.setItemText(5, _translate("Form", "NW"))
+ self.cmbAlign.setItemText(6, _translate("Form", "NE"))
+ self.cmbAlign.setItemText(7, _translate("Form", "SW"))
+ self.cmbAlign.setItemText(8, _translate("Form", "SE"))
+ self.cmbAlign.setItemText(9, _translate("Form", "Custom"))
+ self.label_3.setText(_translate("Form", "Font Size"))
+ self.cmbFontSize.setItemText(0, _translate("Form", "-"))
+ self.cmbFontSize.setItemText(1, _translate("Form", "8"))
+ self.cmbFontSize.setItemText(2, _translate("Form", "9"))
+ self.cmbFontSize.setItemText(3, _translate("Form", "10"))
+ self.cmbFontSize.setItemText(4, _translate("Form", "11"))
+ self.cmbFontSize.setItemText(5, _translate("Form", "12"))
+ self.cmbFontSize.setItemText(6, _translate("Form", "14"))
+ self.cmbFontSize.setItemText(7, _translate("Form", "18"))
+ self.cmbFontSize.setItemText(8, _translate("Form", "24"))
+ self.cmbFontSize.setItemText(9, _translate("Form", "48"))
+ self.cmbFontSize.setItemText(10, _translate("Form", "72"))
+ self.label_2.setText(_translate("Form", "Custom Align"))
+ self.txtShiftX.setPlaceholderText(_translate("Form", "Shift X"))
+ self.txtShiftY.setPlaceholderText(_translate("Form", "Shift Y"))
+
+import icons_rc
diff --git a/Build/source/utils/asymptote/GUI/pyUIClass/widg_addPolyOpt.py b/Build/source/utils/asymptote/GUI/pyUIClass/widg_addPolyOpt.py
new file mode 100644
index 00000000000..a9cc20ba106
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/pyUIClass/widg_addPolyOpt.py
@@ -0,0 +1,48 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'GUI/windows/widg_addPolyOpt.ui'
+#
+# Created by: PyQt5 UI code generator 5.10
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+class Ui_Form(object):
+ def setupUi(self, Form):
+ Form.setObjectName("Form")
+ Form.setWindowModality(QtCore.Qt.NonModal)
+ Form.resize(326, 35)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(Form.sizePolicy().hasHeightForWidth())
+ Form.setSizePolicy(sizePolicy)
+ Form.setMinimumSize(QtCore.QSize(0, 35))
+ Form.setMaximumSize(QtCore.QSize(16777215, 35))
+ self.horizontalLayout_2 = QtWidgets.QHBoxLayout(Form)
+ self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
+ self.horizontalLayout_2.setSpacing(0)
+ self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+ self.horizontalLayout = QtWidgets.QHBoxLayout()
+ self.horizontalLayout.setObjectName("horizontalLayout")
+ self.chkInscribed = QtWidgets.QCheckBox(Form)
+ self.chkInscribed.setObjectName("chkInscribed")
+ self.horizontalLayout.addWidget(self.chkInscribed)
+ self.txtSides = QtWidgets.QLineEdit(Form)
+ self.txtSides.setObjectName("txtSides")
+ self.horizontalLayout.addWidget(self.txtSides)
+ spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+ self.horizontalLayout.addItem(spacerItem)
+ self.horizontalLayout_2.addLayout(self.horizontalLayout)
+
+ self.retranslateUi(Form)
+ QtCore.QMetaObject.connectSlotsByName(Form)
+
+ def retranslateUi(self, Form):
+ _translate = QtCore.QCoreApplication.translate
+ Form.setWindowTitle(_translate("Form", "Form"))
+ self.chkInscribed.setText(_translate("Form", "Start at Vertex"))
+ self.txtSides.setToolTip(_translate("Form", "Number of Sides"))
+ self.txtSides.setPlaceholderText(_translate("Form", "Sides"))
+
diff --git a/Build/source/utils/asymptote/GUI/pyUIClass/widg_editBezier.py b/Build/source/utils/asymptote/GUI/pyUIClass/widg_editBezier.py
new file mode 100644
index 00000000000..1379e68ab70
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/pyUIClass/widg_editBezier.py
@@ -0,0 +1,94 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'GUI/windows/widg_editBezier.ui'
+#
+# Created by: PyQt5 UI code generator 5.10
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+class Ui_Form(object):
+ def setupUi(self, Form):
+ Form.setObjectName("Form")
+ Form.setWindowModality(QtCore.Qt.NonModal)
+ Form.resize(692, 35)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(Form.sizePolicy().hasHeightForWidth())
+ Form.setSizePolicy(sizePolicy)
+ Form.setMinimumSize(QtCore.QSize(0, 35))
+ Form.setMaximumSize(QtCore.QSize(16777215, 35))
+ self.horizontalLayout_2 = QtWidgets.QHBoxLayout(Form)
+ self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
+ self.horizontalLayout_2.setSpacing(0)
+ self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+ self.horizontalLayout = QtWidgets.QHBoxLayout()
+ self.horizontalLayout.setObjectName("horizontalLayout")
+ self.cmbLockMode = QtWidgets.QComboBox(Form)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.cmbLockMode.sizePolicy().hasHeightForWidth())
+ self.cmbLockMode.setSizePolicy(sizePolicy)
+ self.cmbLockMode.setObjectName("cmbLockMode")
+ self.cmbLockMode.addItem("")
+ self.cmbLockMode.addItem("")
+ self.cmbLockMode.addItem("")
+ self.horizontalLayout.addWidget(self.cmbLockMode)
+ spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+ self.horizontalLayout.addItem(spacerItem)
+ self.chkRecompute = QtWidgets.QCheckBox(Form)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.chkRecompute.sizePolicy().hasHeightForWidth())
+ self.chkRecompute.setSizePolicy(sizePolicy)
+ self.chkRecompute.setObjectName("chkRecompute")
+ self.horizontalLayout.addWidget(self.chkRecompute)
+ self.btnForceRecompute = QtWidgets.QPushButton(Form)
+ self.btnForceRecompute.setObjectName("btnForceRecompute")
+ self.horizontalLayout.addWidget(self.btnForceRecompute)
+ self.btnOk = QtWidgets.QPushButton(Form)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnOk.sizePolicy().hasHeightForWidth())
+ self.btnOk.setSizePolicy(sizePolicy)
+ self.btnOk.setMaximumSize(QtCore.QSize(25, 25))
+ icon = QtGui.QIcon()
+ icon.addPixmap(QtGui.QPixmap(":/icons/check.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnOk.setIcon(icon)
+ self.btnOk.setFlat(True)
+ self.btnOk.setObjectName("btnOk")
+ self.horizontalLayout.addWidget(self.btnOk)
+ self.btnCancel = QtWidgets.QPushButton(Form)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnCancel.sizePolicy().hasHeightForWidth())
+ self.btnCancel.setSizePolicy(sizePolicy)
+ self.btnCancel.setMaximumSize(QtCore.QSize(25, 25))
+ icon1 = QtGui.QIcon()
+ icon1.addPixmap(QtGui.QPixmap(":/icons/close-round.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnCancel.setIcon(icon1)
+ self.btnCancel.setFlat(True)
+ self.btnCancel.setObjectName("btnCancel")
+ self.horizontalLayout.addWidget(self.btnCancel)
+ self.horizontalLayout_2.addLayout(self.horizontalLayout)
+
+ self.retranslateUi(Form)
+ self.cmbLockMode.setCurrentIndex(1)
+ QtCore.QMetaObject.connectSlotsByName(Form)
+
+ def retranslateUi(self, Form):
+ _translate = QtCore.QCoreApplication.translate
+ Form.setWindowTitle(_translate("Form", "Form"))
+ self.cmbLockMode.setItemText(0, _translate("Form", "No Lock"))
+ self.cmbLockMode.setItemText(1, _translate("Form", "Lock Angle"))
+ self.cmbLockMode.setItemText(2, _translate("Form", "Lock Angle & Scale"))
+ self.chkRecompute.setText(_translate("Form", "Recompute Path"))
+ self.btnForceRecompute.setText(_translate("Form", "Recompute Once"))
+
+import icons_rc
diff --git a/Build/source/utils/asymptote/GUI/pyUIClass/widgetPointEditor.py b/Build/source/utils/asymptote/GUI/pyUIClass/widgetPointEditor.py
new file mode 100644
index 00000000000..5e2ffc0b531
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/pyUIClass/widgetPointEditor.py
@@ -0,0 +1,96 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'GUI/windows/widgetPointEditor.ui'
+#
+# Created by: PyQt5 UI code generator 5.10
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+class Ui_Form(object):
+ def setupUi(self, Form):
+ Form.setObjectName("Form")
+ Form.resize(324, 67)
+ self.verticalLayout = QtWidgets.QVBoxLayout(Form)
+ self.verticalLayout.setObjectName("verticalLayout")
+ self.nameLabel = QtWidgets.QLabel(Form)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.nameLabel.sizePolicy().hasHeightForWidth())
+ self.nameLabel.setSizePolicy(sizePolicy)
+ self.nameLabel.setObjectName("nameLabel")
+ self.verticalLayout.addWidget(self.nameLabel)
+ self.horizontalLayout = QtWidgets.QHBoxLayout()
+ self.horizontalLayout.setObjectName("horizontalLayout")
+ self.lineXorA = QtWidgets.QLineEdit(Form)
+ self.lineXorA.setEnabled(False)
+ self.lineXorA.setReadOnly(False)
+ self.lineXorA.setObjectName("lineXorA")
+ self.horizontalLayout.addWidget(self.lineXorA)
+ self.lineYorM = QtWidgets.QLineEdit(Form)
+ self.lineYorM.setEnabled(False)
+ self.lineYorM.setAutoFillBackground(False)
+ self.lineYorM.setReadOnly(False)
+ self.lineYorM.setObjectName("lineYorM")
+ self.horizontalLayout.addWidget(self.lineYorM)
+ self.btnRelative = QtWidgets.QPushButton(Form)
+ self.btnRelative.setEnabled(False)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnRelative.sizePolicy().hasHeightForWidth())
+ self.btnRelative.setSizePolicy(sizePolicy)
+ self.btnRelative.setText("")
+ icon = QtGui.QIcon()
+ icon.addPixmap(QtGui.QPixmap(":/icons/android-locate.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnRelative.setIcon(icon)
+ self.btnRelative.setCheckable(True)
+ self.btnRelative.setFlat(False)
+ self.btnRelative.setObjectName("btnRelative")
+ self.horizontalLayout.addWidget(self.btnRelative)
+ self.btnPolar = QtWidgets.QPushButton(Form)
+ self.btnPolar.setEnabled(False)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnPolar.sizePolicy().hasHeightForWidth())
+ self.btnPolar.setSizePolicy(sizePolicy)
+ self.btnPolar.setText("")
+ icon1 = QtGui.QIcon()
+ icon1.addPixmap(QtGui.QPixmap(":/icons/android-radio-button-off.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnPolar.setIcon(icon1)
+ self.btnPolar.setCheckable(True)
+ self.btnPolar.setFlat(False)
+ self.btnPolar.setObjectName("btnPolar")
+ self.horizontalLayout.addWidget(self.btnPolar)
+ self.btnManualAdj = QtWidgets.QPushButton(Form)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnManualAdj.sizePolicy().hasHeightForWidth())
+ self.btnManualAdj.setSizePolicy(sizePolicy)
+ self.btnManualAdj.setText("")
+ icon2 = QtGui.QIcon()
+ icon2.addPixmap(QtGui.QPixmap(":/icons/edit.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnManualAdj.setIcon(icon2)
+ self.btnManualAdj.setCheckable(True)
+ self.btnManualAdj.setFlat(False)
+ self.btnManualAdj.setObjectName("btnManualAdj")
+ self.horizontalLayout.addWidget(self.btnManualAdj)
+ self.verticalLayout.addLayout(self.horizontalLayout)
+
+ self.retranslateUi(Form)
+ QtCore.QMetaObject.connectSlotsByName(Form)
+
+ def retranslateUi(self, Form):
+ _translate = QtCore.QCoreApplication.translate
+ Form.setWindowTitle(_translate("Form", "Form"))
+ self.nameLabel.setText(_translate("Form", "Left Control Point"))
+ self.lineXorA.setToolTip(_translate("Form", "X"))
+ self.lineXorA.setPlaceholderText(_translate("Form", "X"))
+ self.lineYorM.setToolTip(_translate("Form", "X"))
+ self.lineYorM.setPlaceholderText(_translate("Form", "Y"))
+
+import icons_rc
diff --git a/Build/source/utils/asymptote/GUI/pyUIClass/window1.py b/Build/source/utils/asymptote/GUI/pyUIClass/window1.py
new file mode 100644
index 00000000000..24f30dce850
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/pyUIClass/window1.py
@@ -0,0 +1,930 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'GUI/windows/window1.ui'
+#
+# Created by: PyQt5 UI code generator 5.10
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+class Ui_MainWindow(object):
+ def setupUi(self, MainWindow):
+ MainWindow.setObjectName("MainWindow")
+ MainWindow.resize(1030, 768)
+ self.centralwidget = QtWidgets.QWidget(MainWindow)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.centralwidget.sizePolicy().hasHeightForWidth())
+ self.centralwidget.setSizePolicy(sizePolicy)
+ self.centralwidget.setMouseTracking(True)
+ self.centralwidget.setObjectName("centralwidget")
+ self.horizontalLayout_4 = QtWidgets.QHBoxLayout(self.centralwidget)
+ self.horizontalLayout_4.setContentsMargins(0, 0, 0, 0)
+ self.horizontalLayout_4.setSpacing(0)
+ self.horizontalLayout_4.setObjectName("horizontalLayout_4")
+ self.mainWidget = QtWidgets.QWidget(self.centralwidget)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.mainWidget.sizePolicy().hasHeightForWidth())
+ self.mainWidget.setSizePolicy(sizePolicy)
+ self.mainWidget.setMouseTracking(True)
+ self.mainWidget.setObjectName("mainWidget")
+ self.verticalLayout = QtWidgets.QVBoxLayout(self.mainWidget)
+ self.verticalLayout.setContentsMargins(2, 2, 2, 2)
+ self.verticalLayout.setSpacing(4)
+ self.verticalLayout.setObjectName("verticalLayout")
+ self.menuFrame = QtWidgets.QFrame(self.mainWidget)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.menuFrame.sizePolicy().hasHeightForWidth())
+ self.menuFrame.setSizePolicy(sizePolicy)
+ self.menuFrame.setFrameShape(QtWidgets.QFrame.NoFrame)
+ self.menuFrame.setObjectName("menuFrame")
+ self.horizontalLayout = QtWidgets.QHBoxLayout(self.menuFrame)
+ self.horizontalLayout.setSizeConstraint(QtWidgets.QLayout.SetMinimumSize)
+ self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
+ self.horizontalLayout.setSpacing(4)
+ self.horizontalLayout.setObjectName("horizontalLayout")
+ self.btnUndo = QtWidgets.QPushButton(self.menuFrame)
+ self.btnUndo.setEnabled(False)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnUndo.sizePolicy().hasHeightForWidth())
+ self.btnUndo.setSizePolicy(sizePolicy)
+ self.btnUndo.setMaximumSize(QtCore.QSize(25, 25))
+ self.btnUndo.setBaseSize(QtCore.QSize(32, 32))
+ self.btnUndo.setText("")
+ icon = QtGui.QIcon()
+ icon.addPixmap(QtGui.QPixmap(":/icons/android-arrow-back.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnUndo.setIcon(icon)
+ self.btnUndo.setIconSize(QtCore.QSize(16, 16))
+ self.btnUndo.setFlat(True)
+ self.btnUndo.setObjectName("btnUndo")
+ self.horizontalLayout.addWidget(self.btnUndo)
+ self.btnRedo = QtWidgets.QPushButton(self.menuFrame)
+ self.btnRedo.setEnabled(False)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnRedo.sizePolicy().hasHeightForWidth())
+ self.btnRedo.setSizePolicy(sizePolicy)
+ self.btnRedo.setMaximumSize(QtCore.QSize(25, 25))
+ self.btnRedo.setBaseSize(QtCore.QSize(32, 32))
+ self.btnRedo.setText("")
+ icon1 = QtGui.QIcon()
+ icon1.addPixmap(QtGui.QPixmap(":/icons/android-arrow-forward.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnRedo.setIcon(icon1)
+ self.btnRedo.setFlat(True)
+ self.btnRedo.setObjectName("btnRedo")
+ self.horizontalLayout.addWidget(self.btnRedo)
+ self.btnLoadFile = QtWidgets.QPushButton(self.menuFrame)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnLoadFile.sizePolicy().hasHeightForWidth())
+ self.btnLoadFile.setSizePolicy(sizePolicy)
+ self.btnLoadFile.setMaximumSize(QtCore.QSize(25, 25))
+ self.btnLoadFile.setBaseSize(QtCore.QSize(32, 32))
+ self.btnLoadFile.setText("")
+ icon2 = QtGui.QIcon()
+ icon2.addPixmap(QtGui.QPixmap(":/icons/android-folder-open.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnLoadFile.setIcon(icon2)
+ self.btnLoadFile.setFlat(True)
+ self.btnLoadFile.setObjectName("btnLoadFile")
+ self.horizontalLayout.addWidget(self.btnLoadFile)
+ self.btnSave = QtWidgets.QPushButton(self.menuFrame)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnSave.sizePolicy().hasHeightForWidth())
+ self.btnSave.setSizePolicy(sizePolicy)
+ self.btnSave.setMaximumSize(QtCore.QSize(25, 25))
+ self.btnSave.setBaseSize(QtCore.QSize(32, 32))
+ self.btnSave.setText("")
+ icon3 = QtGui.QIcon()
+ icon3.addPixmap(QtGui.QPixmap(":/icons/save.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnSave.setIcon(icon3)
+ self.btnSave.setFlat(True)
+ self.btnSave.setObjectName("btnSave")
+ self.horizontalLayout.addWidget(self.btnSave)
+ self.btnViewCode = QtWidgets.QPushButton(self.menuFrame)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnViewCode.sizePolicy().hasHeightForWidth())
+ self.btnViewCode.setSizePolicy(sizePolicy)
+ self.btnViewCode.setMaximumSize(QtCore.QSize(25, 25))
+ self.btnViewCode.setBaseSize(QtCore.QSize(32, 32))
+ self.btnViewCode.setText("")
+ icon4 = QtGui.QIcon()
+ icon4.addPixmap(QtGui.QPixmap(":/icons/code.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnViewCode.setIcon(icon4)
+ self.btnViewCode.setFlat(True)
+ self.btnViewCode.setObjectName("btnViewCode")
+ self.horizontalLayout.addWidget(self.btnViewCode)
+ self.btnQuickScreenshot = QtWidgets.QPushButton(self.menuFrame)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnQuickScreenshot.sizePolicy().hasHeightForWidth())
+ self.btnQuickScreenshot.setSizePolicy(sizePolicy)
+ self.btnQuickScreenshot.setMaximumSize(QtCore.QSize(25, 25))
+ self.btnQuickScreenshot.setBaseSize(QtCore.QSize(32, 32))
+ self.btnQuickScreenshot.setText("")
+ icon5 = QtGui.QIcon()
+ icon5.addPixmap(QtGui.QPixmap(":/icons/android-camera.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnQuickScreenshot.setIcon(icon5)
+ self.btnQuickScreenshot.setFlat(True)
+ self.btnQuickScreenshot.setObjectName("btnQuickScreenshot")
+ self.horizontalLayout.addWidget(self.btnQuickScreenshot)
+ spacerItem = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
+ self.horizontalLayout.addItem(spacerItem)
+ self.btnDrawAxes = QtWidgets.QPushButton(self.menuFrame)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnDrawAxes.sizePolicy().hasHeightForWidth())
+ self.btnDrawAxes.setSizePolicy(sizePolicy)
+ self.btnDrawAxes.setMaximumSize(QtCore.QSize(25, 25))
+ self.btnDrawAxes.setBaseSize(QtCore.QSize(32, 32))
+ font = QtGui.QFont()
+ font.setFamily("Roboto")
+ font.setBold(True)
+ font.setWeight(75)
+ self.btnDrawAxes.setFont(font)
+ self.btnDrawAxes.setText("")
+ icon6 = QtGui.QIcon()
+ icon6.addPixmap(QtGui.QPixmap(":/icons/plus-round.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnDrawAxes.setIcon(icon6)
+ self.btnDrawAxes.setCheckable(True)
+ self.btnDrawAxes.setChecked(True)
+ self.btnDrawAxes.setFlat(True)
+ self.btnDrawAxes.setObjectName("btnDrawAxes")
+ self.horizontalLayout.addWidget(self.btnDrawAxes)
+ self.btnDrawGrid = QtWidgets.QPushButton(self.menuFrame)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnDrawGrid.sizePolicy().hasHeightForWidth())
+ self.btnDrawGrid.setSizePolicy(sizePolicy)
+ self.btnDrawGrid.setMaximumSize(QtCore.QSize(25, 25))
+ self.btnDrawGrid.setBaseSize(QtCore.QSize(32, 32))
+ font = QtGui.QFont()
+ font.setFamily("Roboto")
+ font.setBold(True)
+ font.setWeight(75)
+ self.btnDrawGrid.setFont(font)
+ self.btnDrawGrid.setText("")
+ icon7 = QtGui.QIcon()
+ icon7.addPixmap(QtGui.QPixmap(":/icons/grid.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnDrawGrid.setIcon(icon7)
+ self.btnDrawGrid.setCheckable(True)
+ self.btnDrawGrid.setChecked(False)
+ self.btnDrawGrid.setFlat(True)
+ self.btnDrawGrid.setObjectName("btnDrawGrid")
+ self.horizontalLayout.addWidget(self.btnDrawGrid)
+ self.btnSetZoom = QtWidgets.QPushButton(self.menuFrame)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnSetZoom.sizePolicy().hasHeightForWidth())
+ self.btnSetZoom.setSizePolicy(sizePolicy)
+ self.btnSetZoom.setMaximumSize(QtCore.QSize(25, 25))
+ self.btnSetZoom.setBaseSize(QtCore.QSize(32, 32))
+ self.btnSetZoom.setText("")
+ icon8 = QtGui.QIcon()
+ icon8.addPixmap(QtGui.QPixmap(":/icons/magnifying-glass.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnSetZoom.setIcon(icon8)
+ self.btnSetZoom.setFlat(True)
+ self.btnSetZoom.setObjectName("btnSetZoom")
+ self.horizontalLayout.addWidget(self.btnSetZoom)
+ self.btnPanCenter = QtWidgets.QPushButton(self.menuFrame)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnPanCenter.sizePolicy().hasHeightForWidth())
+ self.btnPanCenter.setSizePolicy(sizePolicy)
+ self.btnPanCenter.setMaximumSize(QtCore.QSize(25, 25))
+ self.btnPanCenter.setBaseSize(QtCore.QSize(32, 32))
+ self.btnPanCenter.setText("")
+ icon9 = QtGui.QIcon()
+ icon9.addPixmap(QtGui.QPixmap(":/icons/center.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnPanCenter.setIcon(icon9)
+ self.btnPanCenter.setFlat(True)
+ self.btnPanCenter.setObjectName("btnPanCenter")
+ self.horizontalLayout.addWidget(self.btnPanCenter)
+ self.btnResetPan = QtWidgets.QPushButton(self.menuFrame)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnResetPan.sizePolicy().hasHeightForWidth())
+ self.btnResetPan.setSizePolicy(sizePolicy)
+ self.btnResetPan.setMaximumSize(QtCore.QSize(25, 25))
+ self.btnResetPan.setBaseSize(QtCore.QSize(32, 32))
+ self.btnResetPan.setText("")
+ icon10 = QtGui.QIcon()
+ icon10.addPixmap(QtGui.QPixmap(":/icons/centerorigin.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnResetPan.setIcon(icon10)
+ self.btnResetPan.setFlat(True)
+ self.btnResetPan.setObjectName("btnResetPan")
+ self.horizontalLayout.addWidget(self.btnResetPan)
+ self.btnAlignX = QtWidgets.QPushButton(self.menuFrame)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnAlignX.sizePolicy().hasHeightForWidth())
+ self.btnAlignX.setSizePolicy(sizePolicy)
+ self.btnAlignX.setMaximumSize(QtCore.QSize(25, 25))
+ self.btnAlignX.setBaseSize(QtCore.QSize(32, 32))
+ font = QtGui.QFont()
+ font.setFamily("Roboto")
+ font.setBold(True)
+ font.setWeight(75)
+ self.btnAlignX.setFont(font)
+ self.btnAlignX.setCheckable(True)
+ self.btnAlignX.setFlat(True)
+ self.btnAlignX.setObjectName("btnAlignX")
+ self.horizontalLayout.addWidget(self.btnAlignX)
+ self.btnAlignY = QtWidgets.QPushButton(self.menuFrame)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnAlignY.sizePolicy().hasHeightForWidth())
+ self.btnAlignY.setSizePolicy(sizePolicy)
+ self.btnAlignY.setMaximumSize(QtCore.QSize(25, 25))
+ self.btnAlignY.setBaseSize(QtCore.QSize(32, 32))
+ font = QtGui.QFont()
+ font.setBold(True)
+ font.setWeight(75)
+ self.btnAlignY.setFont(font)
+ self.btnAlignY.setCheckable(True)
+ self.btnAlignY.setFlat(True)
+ self.btnAlignY.setObjectName("btnAlignY")
+ self.horizontalLayout.addWidget(self.btnAlignY)
+ spacerItem1 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
+ self.horizontalLayout.addItem(spacerItem1)
+ self.btnSelectEdit = QtWidgets.QPushButton(self.menuFrame)
+ self.btnSelectEdit.setEnabled(True)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnSelectEdit.sizePolicy().hasHeightForWidth())
+ self.btnSelectEdit.setSizePolicy(sizePolicy)
+ self.btnSelectEdit.setMaximumSize(QtCore.QSize(25, 25))
+ self.btnSelectEdit.setText("")
+ icon11 = QtGui.QIcon()
+ icon11.addPixmap(QtGui.QPixmap(":/icons/edit.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnSelectEdit.setIcon(icon11)
+ self.btnSelectEdit.setFlat(True)
+ self.btnSelectEdit.setObjectName("btnSelectEdit")
+ self.horizontalLayout.addWidget(self.btnSelectEdit)
+ self.btnDeleteMode = QtWidgets.QPushButton(self.menuFrame)
+ self.btnDeleteMode.setEnabled(True)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnDeleteMode.sizePolicy().hasHeightForWidth())
+ self.btnDeleteMode.setSizePolicy(sizePolicy)
+ self.btnDeleteMode.setMaximumSize(QtCore.QSize(25, 25))
+ self.btnDeleteMode.setBaseSize(QtCore.QSize(32, 32))
+ self.btnDeleteMode.setText("")
+ icon12 = QtGui.QIcon()
+ icon12.addPixmap(QtGui.QPixmap(":/icons/android-delete.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnDeleteMode.setIcon(icon12)
+ self.btnDeleteMode.setCheckable(False)
+ self.btnDeleteMode.setFlat(True)
+ self.btnDeleteMode.setObjectName("btnDeleteMode")
+ self.horizontalLayout.addWidget(self.btnDeleteMode)
+ spacerItem2 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
+ self.horizontalLayout.addItem(spacerItem2)
+ self.btnPan = QtWidgets.QPushButton(self.menuFrame)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnPan.sizePolicy().hasHeightForWidth())
+ self.btnPan.setSizePolicy(sizePolicy)
+ self.btnPan.setMaximumSize(QtCore.QSize(25, 25))
+ self.btnPan.setBaseSize(QtCore.QSize(32, 32))
+ self.btnPan.setText("")
+ icon13 = QtGui.QIcon()
+ icon13.addPixmap(QtGui.QPixmap(":/icons/android-hand.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnPan.setIcon(icon13)
+ self.btnPan.setCheckable(True)
+ self.btnPan.setFlat(True)
+ self.btnPan.setObjectName("btnPan")
+ self.horizontalLayout.addWidget(self.btnPan)
+ self.btnTranslate = QtWidgets.QPushButton(self.menuFrame)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnTranslate.sizePolicy().hasHeightForWidth())
+ self.btnTranslate.setSizePolicy(sizePolicy)
+ self.btnTranslate.setMaximumSize(QtCore.QSize(25, 25))
+ self.btnTranslate.setBaseSize(QtCore.QSize(32, 32))
+ self.btnTranslate.setText("")
+ icon14 = QtGui.QIcon()
+ icon14.addPixmap(QtGui.QPixmap(":/icons/arrow-move.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnTranslate.setIcon(icon14)
+ self.btnTranslate.setCheckable(True)
+ self.btnTranslate.setChecked(True)
+ self.btnTranslate.setFlat(True)
+ self.btnTranslate.setObjectName("btnTranslate")
+ self.horizontalLayout.addWidget(self.btnTranslate)
+ self.btnScale = QtWidgets.QPushButton(self.menuFrame)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnScale.sizePolicy().hasHeightForWidth())
+ self.btnScale.setSizePolicy(sizePolicy)
+ self.btnScale.setMaximumSize(QtCore.QSize(25, 25))
+ self.btnScale.setBaseSize(QtCore.QSize(32, 32))
+ self.btnScale.setText("")
+ icon15 = QtGui.QIcon()
+ icon15.addPixmap(QtGui.QPixmap(":/icons/arrow-resize.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnScale.setIcon(icon15)
+ self.btnScale.setCheckable(True)
+ self.btnScale.setFlat(True)
+ self.btnScale.setObjectName("btnScale")
+ self.horizontalLayout.addWidget(self.btnScale)
+ self.btnRotate = QtWidgets.QPushButton(self.menuFrame)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnRotate.sizePolicy().hasHeightForWidth())
+ self.btnRotate.setSizePolicy(sizePolicy)
+ self.btnRotate.setMaximumSize(QtCore.QSize(25, 25))
+ self.btnRotate.setBaseSize(QtCore.QSize(32, 32))
+ self.btnRotate.setText("")
+ icon16 = QtGui.QIcon()
+ icon16.addPixmap(QtGui.QPixmap(":/icons/android-refresh.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnRotate.setIcon(icon16)
+ self.btnRotate.setCheckable(True)
+ self.btnRotate.setFlat(True)
+ self.btnRotate.setObjectName("btnRotate")
+ self.horizontalLayout.addWidget(self.btnRotate)
+ spacerItem3 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
+ self.horizontalLayout.addItem(spacerItem3)
+ self.btnAnchor = QtWidgets.QPushButton(self.menuFrame)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnAnchor.sizePolicy().hasHeightForWidth())
+ self.btnAnchor.setSizePolicy(sizePolicy)
+ self.btnAnchor.setMaximumSize(QtCore.QSize(25, 25))
+ self.btnAnchor.setBaseSize(QtCore.QSize(32, 32))
+ self.btnAnchor.setText("")
+ icon17 = QtGui.QIcon()
+ icon17.addPixmap(QtGui.QPixmap(":/icons/anchor.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnAnchor.setIcon(icon17)
+ self.btnAnchor.setCheckable(True)
+ self.btnAnchor.setChecked(False)
+ self.btnAnchor.setFlat(True)
+ self.btnAnchor.setObjectName("btnAnchor")
+ self.horizontalLayout.addWidget(self.btnAnchor)
+ self.comboAnchor = QtWidgets.QComboBox(self.menuFrame)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Maximum)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.comboAnchor.sizePolicy().hasHeightForWidth())
+ self.comboAnchor.setSizePolicy(sizePolicy)
+ self.comboAnchor.setMinimumSize(QtCore.QSize(127, 0))
+ self.comboAnchor.setMaximumSize(QtCore.QSize(127, 25))
+ self.comboAnchor.setLayoutDirection(QtCore.Qt.LeftToRight)
+ self.comboAnchor.setEditable(False)
+ self.comboAnchor.setInsertPolicy(QtWidgets.QComboBox.InsertAtCurrent)
+ self.comboAnchor.setSizeAdjustPolicy(QtWidgets.QComboBox.AdjustToContentsOnFirstShow)
+ self.comboAnchor.setIconSize(QtCore.QSize(0, 0))
+ self.comboAnchor.setDuplicatesEnabled(False)
+ self.comboAnchor.setFrame(False)
+ self.comboAnchor.setModelColumn(0)
+ self.comboAnchor.setObjectName("comboAnchor")
+ self.comboAnchor.addItem("")
+ self.comboAnchor.addItem("")
+ self.comboAnchor.addItem("")
+ self.comboAnchor.addItem("")
+ self.comboAnchor.addItem("")
+ self.comboAnchor.addItem("")
+ self.comboAnchor.addItem("")
+ self.horizontalLayout.addWidget(self.comboAnchor)
+ self.btnToggleVisible = QtWidgets.QPushButton(self.menuFrame)
+ self.btnToggleVisible.setEnabled(False)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnToggleVisible.sizePolicy().hasHeightForWidth())
+ self.btnToggleVisible.setSizePolicy(sizePolicy)
+ self.btnToggleVisible.setMaximumSize(QtCore.QSize(25, 25))
+ self.btnToggleVisible.setBaseSize(QtCore.QSize(32, 32))
+ self.btnToggleVisible.setText("")
+ icon18 = QtGui.QIcon()
+ icon18.addPixmap(QtGui.QPixmap(":/icons/eye.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnToggleVisible.setIcon(icon18)
+ self.btnToggleVisible.setCheckable(False)
+ self.btnToggleVisible.setFlat(True)
+ self.btnToggleVisible.setObjectName("btnToggleVisible")
+ self.horizontalLayout.addWidget(self.btnToggleVisible)
+ self.btnCustTransform = QtWidgets.QPushButton(self.menuFrame)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnCustTransform.sizePolicy().hasHeightForWidth())
+ self.btnCustTransform.setSizePolicy(sizePolicy)
+ self.btnCustTransform.setMaximumSize(QtCore.QSize(25, 25))
+ self.btnCustTransform.setBaseSize(QtCore.QSize(32, 32))
+ self.btnCustTransform.setText("")
+ icon19 = QtGui.QIcon()
+ icon19.addPixmap(QtGui.QPixmap(":/icons/android-expand.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnCustTransform.setIcon(icon19)
+ self.btnCustTransform.setFlat(True)
+ self.btnCustTransform.setObjectName("btnCustTransform")
+ self.horizontalLayout.addWidget(self.btnCustTransform)
+ self.btnSendBackwards = QtWidgets.QPushButton(self.menuFrame)
+ self.btnSendBackwards.setEnabled(False)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnSendBackwards.sizePolicy().hasHeightForWidth())
+ self.btnSendBackwards.setSizePolicy(sizePolicy)
+ self.btnSendBackwards.setMaximumSize(QtCore.QSize(25, 25))
+ self.btnSendBackwards.setBaseSize(QtCore.QSize(32, 32))
+ self.btnSendBackwards.setText("")
+ icon20 = QtGui.QIcon()
+ icon20.addPixmap(QtGui.QPixmap(":/icons/chevron-with-circle-left.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnSendBackwards.setIcon(icon20)
+ self.btnSendBackwards.setFlat(True)
+ self.btnSendBackwards.setObjectName("btnSendBackwards")
+ self.horizontalLayout.addWidget(self.btnSendBackwards)
+ self.btnSendForwards = QtWidgets.QPushButton(self.menuFrame)
+ self.btnSendForwards.setEnabled(False)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnSendForwards.sizePolicy().hasHeightForWidth())
+ self.btnSendForwards.setSizePolicy(sizePolicy)
+ self.btnSendForwards.setMaximumSize(QtCore.QSize(25, 25))
+ self.btnSendForwards.setBaseSize(QtCore.QSize(32, 32))
+ self.btnSendForwards.setText("")
+ icon21 = QtGui.QIcon()
+ icon21.addPixmap(QtGui.QPixmap(":/icons/chevron-with-circle-right.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnSendForwards.setIcon(icon21)
+ self.btnSendForwards.setFlat(True)
+ self.btnSendForwards.setObjectName("btnSendForwards")
+ self.horizontalLayout.addWidget(self.btnSendForwards)
+ spacerItem4 = QtWidgets.QSpacerItem(40, 25, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum)
+ self.horizontalLayout.addItem(spacerItem4)
+ self.btnUndo.raise_()
+ self.btnRedo.raise_()
+ self.btnLoadFile.raise_()
+ self.btnSave.raise_()
+ self.btnViewCode.raise_()
+ self.btnQuickScreenshot.raise_()
+ self.btnDrawAxes.raise_()
+ self.btnDrawGrid.raise_()
+ self.btnSetZoom.raise_()
+ self.btnPanCenter.raise_()
+ self.btnResetPan.raise_()
+ self.btnAlignX.raise_()
+ self.btnAlignY.raise_()
+ self.btnPan.raise_()
+ self.btnTranslate.raise_()
+ self.btnScale.raise_()
+ self.btnCustTransform.raise_()
+ self.btnSendBackwards.raise_()
+ self.btnSendForwards.raise_()
+ self.comboAnchor.raise_()
+ self.btnToggleVisible.raise_()
+ self.btnAnchor.raise_()
+ self.btnRotate.raise_()
+ self.btnSelectEdit.raise_()
+ self.btnDeleteMode.raise_()
+ self.verticalLayout.addWidget(self.menuFrame)
+ self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
+ self.horizontalLayout_2.setSpacing(4)
+ self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+ self.verticalLayout_2 = QtWidgets.QVBoxLayout()
+ self.verticalLayout_2.setSpacing(3)
+ self.verticalLayout_2.setObjectName("verticalLayout_2")
+ self.addOption = QtWidgets.QHBoxLayout()
+ self.addOption.setSizeConstraint(QtWidgets.QLayout.SetDefaultConstraint)
+ self.addOption.setContentsMargins(6, -1, -1, 0)
+ self.addOption.setSpacing(6)
+ self.addOption.setObjectName("addOption")
+ self.btnFill = QtWidgets.QPushButton(self.mainWidget)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnFill.sizePolicy().hasHeightForWidth())
+ self.btnFill.setSizePolicy(sizePolicy)
+ self.btnFill.setMaximumSize(QtCore.QSize(32, 32))
+ self.btnFill.setBaseSize(QtCore.QSize(32, 32))
+ self.btnFill.setAutoFillBackground(False)
+ self.btnFill.setStyleSheet("")
+ self.btnFill.setText("")
+ icon22 = QtGui.QIcon()
+ icon22.addPixmap(QtGui.QPixmap(":/icons/bucket.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ icon22.addPixmap(QtGui.QPixmap(":/icons/filledbucket.svg"), QtGui.QIcon.Normal, QtGui.QIcon.On)
+ self.btnFill.setIcon(icon22)
+ self.btnFill.setCheckable(True)
+ self.btnFill.setDefault(False)
+ self.btnFill.setFlat(True)
+ self.btnFill.setObjectName("btnFill")
+ self.addOption.addWidget(self.btnFill)
+ self.addOptionLayout = QtWidgets.QGridLayout()
+ self.addOptionLayout.setSpacing(6)
+ self.addOptionLayout.setObjectName("addOptionLayout")
+ self.addOption.addLayout(self.addOptionLayout)
+ spacerItem5 = QtWidgets.QSpacerItem(40, 35, QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Minimum)
+ self.addOption.addItem(spacerItem5)
+ self.label = QtWidgets.QLabel(self.mainWidget)
+ self.label.setObjectName("label")
+ self.addOption.addWidget(self.label)
+ self.txtLineWidth = QtWidgets.QLineEdit(self.mainWidget)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.txtLineWidth.sizePolicy().hasHeightForWidth())
+ self.txtLineWidth.setSizePolicy(sizePolicy)
+ self.txtLineWidth.setMaximumSize(QtCore.QSize(75, 16777215))
+ self.txtLineWidth.setObjectName("txtLineWidth")
+ self.addOption.addWidget(self.txtLineWidth)
+ self.frameCurrColor = QtWidgets.QFrame(self.mainWidget)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.frameCurrColor.sizePolicy().hasHeightForWidth())
+ self.frameCurrColor.setSizePolicy(sizePolicy)
+ self.frameCurrColor.setMinimumSize(QtCore.QSize(15, 15))
+ self.frameCurrColor.setAutoFillBackground(False)
+ self.frameCurrColor.setStyleSheet("QFrame{ \n"
+"padding: 4.0;\n"
+"border-radius: 3.0; \n"
+"background: rgb(0, 0, 0)\n"
+"}")
+ self.frameCurrColor.setFrameShape(QtWidgets.QFrame.StyledPanel)
+ self.frameCurrColor.setFrameShadow(QtWidgets.QFrame.Sunken)
+ self.frameCurrColor.setObjectName("frameCurrColor")
+ self.addOption.addWidget(self.frameCurrColor)
+ self.btnSelectColor = QtWidgets.QPushButton(self.mainWidget)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnSelectColor.sizePolicy().hasHeightForWidth())
+ self.btnSelectColor.setSizePolicy(sizePolicy)
+ self.btnSelectColor.setMaximumSize(QtCore.QSize(25, 25))
+ self.btnSelectColor.setBaseSize(QtCore.QSize(32, 32))
+ self.btnSelectColor.setAutoFillBackground(False)
+ self.btnSelectColor.setStyleSheet("")
+ self.btnSelectColor.setText("")
+ icon23 = QtGui.QIcon()
+ icon23.addPixmap(QtGui.QPixmap(":/icons/android-color-palette.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnSelectColor.setIcon(icon23)
+ self.btnSelectColor.setDefault(False)
+ self.btnSelectColor.setFlat(True)
+ self.btnSelectColor.setObjectName("btnSelectColor")
+ self.addOption.addWidget(self.btnSelectColor)
+ self.verticalLayout_2.addLayout(self.addOption)
+ self.horizontalLayout_7 = QtWidgets.QHBoxLayout()
+ self.horizontalLayout_7.setContentsMargins(-1, 6, -1, -1)
+ self.horizontalLayout_7.setSpacing(6)
+ self.horizontalLayout_7.setObjectName("horizontalLayout_7")
+ self.formFrame = QtWidgets.QFrame(self.mainWidget)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.formFrame.sizePolicy().hasHeightForWidth())
+ self.formFrame.setSizePolicy(sizePolicy)
+ self.formFrame.setFrameShape(QtWidgets.QFrame.NoFrame)
+ self.formFrame.setFrameShadow(QtWidgets.QFrame.Plain)
+ self.formFrame.setLineWidth(0)
+ self.formFrame.setObjectName("formFrame")
+ self.formLayout = QtWidgets.QFormLayout(self.formFrame)
+ self.formLayout.setContentsMargins(0, 0, 0, 0)
+ self.formLayout.setSpacing(0)
+ self.formLayout.setObjectName("formLayout")
+ self.btnOpenPoly = QtWidgets.QPushButton(self.formFrame)
+ self.btnOpenPoly.setEnabled(True)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnOpenPoly.sizePolicy().hasHeightForWidth())
+ self.btnOpenPoly.setSizePolicy(sizePolicy)
+ self.btnOpenPoly.setMaximumSize(QtCore.QSize(32, 32))
+ self.btnOpenPoly.setText("")
+ icon24 = QtGui.QIcon()
+ icon24.addPixmap(QtGui.QPixmap(":/icons/openpolygon.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnOpenPoly.setIcon(icon24)
+ self.btnOpenPoly.setFlat(True)
+ self.btnOpenPoly.setObjectName("btnOpenPoly")
+ self.formLayout.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.btnOpenPoly)
+ self.btnClosedPoly = QtWidgets.QPushButton(self.formFrame)
+ self.btnClosedPoly.setEnabled(True)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnClosedPoly.sizePolicy().hasHeightForWidth())
+ self.btnClosedPoly.setSizePolicy(sizePolicy)
+ self.btnClosedPoly.setMaximumSize(QtCore.QSize(32, 32))
+ self.btnClosedPoly.setText("")
+ icon25 = QtGui.QIcon()
+ icon25.addPixmap(QtGui.QPixmap(":/icons/closedpolygon.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnClosedPoly.setIcon(icon25)
+ self.btnClosedPoly.setFlat(True)
+ self.btnClosedPoly.setObjectName("btnClosedPoly")
+ self.formLayout.setWidget(5, QtWidgets.QFormLayout.LabelRole, self.btnClosedPoly)
+ self.btnOpenCurve = QtWidgets.QPushButton(self.formFrame)
+ self.btnOpenCurve.setEnabled(True)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnOpenCurve.sizePolicy().hasHeightForWidth())
+ self.btnOpenCurve.setSizePolicy(sizePolicy)
+ self.btnOpenCurve.setMaximumSize(QtCore.QSize(32, 32))
+ self.btnOpenCurve.setText("")
+ icon26 = QtGui.QIcon()
+ icon26.addPixmap(QtGui.QPixmap(":/icons/opencurve.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnOpenCurve.setIcon(icon26)
+ self.btnOpenCurve.setFlat(True)
+ self.btnOpenCurve.setObjectName("btnOpenCurve")
+ self.formLayout.setWidget(6, QtWidgets.QFormLayout.LabelRole, self.btnOpenCurve)
+ self.btnClosedCurve = QtWidgets.QPushButton(self.formFrame)
+ self.btnClosedCurve.setEnabled(True)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnClosedCurve.sizePolicy().hasHeightForWidth())
+ self.btnClosedCurve.setSizePolicy(sizePolicy)
+ self.btnClosedCurve.setMaximumSize(QtCore.QSize(32, 32))
+ self.btnClosedCurve.setText("")
+ icon27 = QtGui.QIcon()
+ icon27.addPixmap(QtGui.QPixmap(":/icons/closedcurve.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnClosedCurve.setIcon(icon27)
+ self.btnClosedCurve.setFlat(True)
+ self.btnClosedCurve.setObjectName("btnClosedCurve")
+ self.formLayout.setWidget(7, QtWidgets.QFormLayout.LabelRole, self.btnClosedCurve)
+ self.btnAddPoly = QtWidgets.QPushButton(self.formFrame)
+ self.btnAddPoly.setEnabled(True)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnAddPoly.sizePolicy().hasHeightForWidth())
+ self.btnAddPoly.setSizePolicy(sizePolicy)
+ self.btnAddPoly.setMaximumSize(QtCore.QSize(32, 32))
+ self.btnAddPoly.setText("")
+ icon28 = QtGui.QIcon()
+ icon28.addPixmap(QtGui.QPixmap(":/icons/triangle-stroked-15.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnAddPoly.setIcon(icon28)
+ self.btnAddPoly.setFlat(True)
+ self.btnAddPoly.setObjectName("btnAddPoly")
+ self.formLayout.setWidget(8, QtWidgets.QFormLayout.LabelRole, self.btnAddPoly)
+ self.btnAddCircle = QtWidgets.QPushButton(self.formFrame)
+ self.btnAddCircle.setEnabled(True)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnAddCircle.sizePolicy().hasHeightForWidth())
+ self.btnAddCircle.setSizePolicy(sizePolicy)
+ self.btnAddCircle.setMaximumSize(QtCore.QSize(32, 32))
+ self.btnAddCircle.setText("")
+ icon29 = QtGui.QIcon()
+ icon29.addPixmap(QtGui.QPixmap(":/icons/circle.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnAddCircle.setIcon(icon29)
+ self.btnAddCircle.setFlat(True)
+ self.btnAddCircle.setObjectName("btnAddCircle")
+ self.formLayout.setWidget(10, QtWidgets.QFormLayout.LabelRole, self.btnAddCircle)
+ self.btnAddLabel = QtWidgets.QPushButton(self.formFrame)
+ self.btnAddLabel.setEnabled(True)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnAddLabel.sizePolicy().hasHeightForWidth())
+ self.btnAddLabel.setSizePolicy(sizePolicy)
+ self.btnAddLabel.setMaximumSize(QtCore.QSize(32, 32))
+ self.btnAddLabel.setText("")
+ icon30 = QtGui.QIcon()
+ icon30.addPixmap(QtGui.QPixmap(":/icons/text.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnAddLabel.setIcon(icon30)
+ self.btnAddLabel.setFlat(True)
+ self.btnAddLabel.setObjectName("btnAddLabel")
+ self.formLayout.setWidget(11, QtWidgets.QFormLayout.LabelRole, self.btnAddLabel)
+ self.horizontalLayout_7.addWidget(self.formFrame)
+ self.imgFrame = QtWidgets.QFrame(self.mainWidget)
+ self.imgFrame.setMinimumSize(QtCore.QSize(0, 6))
+ self.imgFrame.setMouseTracking(True)
+ self.imgFrame.setFrameShape(QtWidgets.QFrame.NoFrame)
+ self.imgFrame.setFrameShadow(QtWidgets.QFrame.Raised)
+ self.imgFrame.setObjectName("imgFrame")
+ self.gridLayout = QtWidgets.QGridLayout(self.imgFrame)
+ self.gridLayout.setContentsMargins(0, 0, 0, 0)
+ self.gridLayout.setSpacing(0)
+ self.gridLayout.setObjectName("gridLayout")
+ self.imgLabel = QtWidgets.QLabel(self.imgFrame)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.imgLabel.sizePolicy().hasHeightForWidth())
+ self.imgLabel.setSizePolicy(sizePolicy)
+ self.imgLabel.setMouseTracking(True)
+ self.imgLabel.setFrameShape(QtWidgets.QFrame.Panel)
+ self.imgLabel.setText("")
+ self.imgLabel.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
+ self.imgLabel.setObjectName("imgLabel")
+ self.gridLayout.addWidget(self.imgLabel, 0, 1, 1, 1)
+ self.horizontalLayout_7.addWidget(self.imgFrame)
+ self.verticalLayout_2.addLayout(self.horizontalLayout_7)
+ self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
+ self.horizontalLayout_3.setSizeConstraint(QtWidgets.QLayout.SetDefaultConstraint)
+ self.horizontalLayout_3.setContentsMargins(-1, 0, -1, -1)
+ self.horizontalLayout_3.setSpacing(0)
+ self.horizontalLayout_3.setObjectName("horizontalLayout_3")
+ self.btnTogglePython = QtWidgets.QPushButton(self.mainWidget)
+ self.btnTogglePython.setEnabled(True)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnTogglePython.sizePolicy().hasHeightForWidth())
+ self.btnTogglePython.setSizePolicy(sizePolicy)
+ self.btnTogglePython.setText("")
+ icon31 = QtGui.QIcon()
+ icon31.addPixmap(QtGui.QPixmap(":/icons/social-python.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnTogglePython.setIcon(icon31)
+ self.btnTogglePython.setIconSize(QtCore.QSize(16, 16))
+ self.btnTogglePython.setCheckable(True)
+ self.btnTogglePython.setFlat(True)
+ self.btnTogglePython.setObjectName("btnTogglePython")
+ self.horizontalLayout_3.addWidget(self.btnTogglePython)
+ self.txtTerminalPrompt = QtWidgets.QLineEdit(self.mainWidget)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.txtTerminalPrompt.sizePolicy().hasHeightForWidth())
+ self.txtTerminalPrompt.setSizePolicy(sizePolicy)
+ self.txtTerminalPrompt.setObjectName("txtTerminalPrompt")
+ self.horizontalLayout_3.addWidget(self.txtTerminalPrompt)
+ self.btnEnterCommand = QtWidgets.QPushButton(self.mainWidget)
+ self.btnEnterCommand.setEnabled(True)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.btnEnterCommand.sizePolicy().hasHeightForWidth())
+ self.btnEnterCommand.setSizePolicy(sizePolicy)
+ self.btnEnterCommand.setText("")
+ icon32 = QtGui.QIcon()
+ icon32.addPixmap(QtGui.QPixmap(":/icons/subdirectory-left.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.btnEnterCommand.setIcon(icon32)
+ self.btnEnterCommand.setFlat(True)
+ self.btnEnterCommand.setObjectName("btnEnterCommand")
+ self.horizontalLayout_3.addWidget(self.btnEnterCommand)
+ self.verticalLayout_2.addLayout(self.horizontalLayout_3)
+ self.horizontalLayout_2.addLayout(self.verticalLayout_2)
+ self.verticalLayout.addLayout(self.horizontalLayout_2)
+ self.horizontalLayout_4.addWidget(self.mainWidget)
+ MainWindow.setCentralWidget(self.centralwidget)
+ self.menubar = QtWidgets.QMenuBar(MainWindow)
+ self.menubar.setGeometry(QtCore.QRect(0, 0, 1030, 28))
+ self.menubar.setObjectName("menubar")
+ self.menuFIle = QtWidgets.QMenu(self.menubar)
+ self.menuFIle.setObjectName("menuFIle")
+ self.menuEdit = QtWidgets.QMenu(self.menubar)
+ self.menuEdit.setObjectName("menuEdit")
+ self.menuOptions = QtWidgets.QMenu(self.menubar)
+ self.menuOptions.setObjectName("menuOptions")
+ self.menuHelp = QtWidgets.QMenu(self.menubar)
+ self.menuHelp.setObjectName("menuHelp")
+ self.menuTools = QtWidgets.QMenu(self.menubar)
+ self.menuTools.setObjectName("menuTools")
+ MainWindow.setMenuBar(self.menubar)
+ self.statusbar = QtWidgets.QStatusBar(MainWindow)
+ self.statusbar.setSizeGripEnabled(False)
+ self.statusbar.setObjectName("statusbar")
+ MainWindow.setStatusBar(self.statusbar)
+ self.actionAbout = QtWidgets.QAction(MainWindow)
+ self.actionAbout.setObjectName("actionAbout")
+ self.actionManual = QtWidgets.QAction(MainWindow)
+ self.actionManual.setObjectName("actionManual")
+ self.actionSettings = QtWidgets.QAction(MainWindow)
+ self.actionSettings.setObjectName("actionSettings")
+ self.actionPause = QtWidgets.QAction(MainWindow)
+ self.actionPause.setObjectName("actionPause")
+ self.actionSaveAs = QtWidgets.QAction(MainWindow)
+ self.actionSaveAs.setObjectName("actionSaveAs")
+ self.actionEnterCommand = QtWidgets.QAction(MainWindow)
+ self.actionEnterCommand.setObjectName("actionEnterCommand")
+ self.actionQuit = QtWidgets.QAction(MainWindow)
+ self.actionQuit.setObjectName("actionQuit")
+ self.actionUndo = QtWidgets.QAction(MainWindow)
+ self.actionUndo.setEnabled(False)
+ self.actionUndo.setObjectName("actionUndo")
+ self.actionRedo = QtWidgets.QAction(MainWindow)
+ self.actionRedo.setEnabled(False)
+ self.actionRedo.setObjectName("actionRedo")
+ self.actionShow_Grid = QtWidgets.QAction(MainWindow)
+ self.actionShow_Grid.setObjectName("actionShow_Grid")
+ self.actionShow_Local_Grid = QtWidgets.QAction(MainWindow)
+ self.actionShow_Local_Grid.setObjectName("actionShow_Local_Grid")
+ self.actionTransform = QtWidgets.QAction(MainWindow)
+ self.actionTransform.setObjectName("actionTransform")
+ self.actionExportAsymptote = QtWidgets.QAction(MainWindow)
+ self.actionExportAsymptote.setObjectName("actionExportAsymptote")
+ self.actionSave = QtWidgets.QAction(MainWindow)
+ self.actionSave.setObjectName("actionSave")
+ self.actionOpen = QtWidgets.QAction(MainWindow)
+ self.actionOpen.setObjectName("actionOpen")
+ self.menuFIle.addAction(self.actionOpen)
+ self.menuFIle.addAction(self.actionSave)
+ self.menuFIle.addAction(self.actionSaveAs)
+ self.menuFIle.addAction(self.actionExportAsymptote)
+ self.menuFIle.addSeparator()
+ self.menuFIle.addAction(self.actionQuit)
+ self.menuEdit.addAction(self.actionUndo)
+ self.menuEdit.addAction(self.actionRedo)
+ self.menuEdit.addSeparator()
+ self.menuOptions.addAction(self.actionSettings)
+ self.menuHelp.addAction(self.actionManual)
+ self.menuHelp.addAction(self.actionAbout)
+ self.menuTools.addAction(self.actionEnterCommand)
+ self.menubar.addAction(self.menuFIle.menuAction())
+ self.menubar.addAction(self.menuEdit.menuAction())
+ self.menubar.addAction(self.menuOptions.menuAction())
+ self.menubar.addAction(self.menuTools.menuAction())
+ self.menubar.addAction(self.menuHelp.menuAction())
+
+ self.retranslateUi(MainWindow)
+ self.comboAnchor.setCurrentIndex(0)
+ QtCore.QMetaObject.connectSlotsByName(MainWindow)
+
+ def retranslateUi(self, MainWindow):
+ _translate = QtCore.QCoreApplication.translate
+ MainWindow.setWindowTitle(_translate("MainWindow", "xasy"))
+ self.btnUndo.setToolTip(_translate("MainWindow", "Undo"))
+ self.btnRedo.setToolTip(_translate("MainWindow", "Redo"))
+ self.btnLoadFile.setToolTip(_translate("MainWindow", "<html><head/><body><p>Open file</p></body></html>"))
+ self.btnSave.setToolTip(_translate("MainWindow", "<html><head/><body><p>Save file</p></body></html>"))
+ self.btnViewCode.setToolTip(_translate("MainWindow", "<html><head/><body><p>Edit code</p></body></html>"))
+ self.btnQuickScreenshot.setToolTip(_translate("MainWindow", "<html><head/><body><p>Screenshot</p></body></html>"))
+ self.btnDrawAxes.setToolTip(_translate("MainWindow", "<html><head/><body><p>Toggle display axes</p></body></html>"))
+ self.btnDrawGrid.setToolTip(_translate("MainWindow", "<html><head/><body><p>Toggle grid</p></body></html>"))
+ self.btnSetZoom.setToolTip(_translate("MainWindow", "Synchronize with Asymptote"))
+ self.btnPanCenter.setToolTip(_translate("MainWindow", "<html><head/><body><p>Center</p></body></html>"))
+ self.btnResetPan.setToolTip(_translate("MainWindow", "<html><head/><body><p>Center about origin</p></body></html>"))
+ self.btnAlignX.setToolTip(_translate("MainWindow", "<html><head/><body><p>Lock transform to X axis</p></body></html>"))
+ self.btnAlignX.setText(_translate("MainWindow", "X"))
+ self.btnAlignY.setToolTip(_translate("MainWindow", "<html><head/><body><p>Lock transform to Y axis</p></body></html>"))
+ self.btnAlignY.setText(_translate("MainWindow", "Y"))
+ self.btnSelectEdit.setToolTip(_translate("MainWindow", "<html><head/><body><p>Bézier editor</p></body></html>"))
+ self.btnDeleteMode.setToolTip(_translate("MainWindow", "<html><head/><body><p>Delete</p></body></html>"))
+ self.btnPan.setToolTip(_translate("MainWindow", "Pan"))
+ self.btnTranslate.setToolTip(_translate("MainWindow", "Translate"))
+ self.btnScale.setToolTip(_translate("MainWindow", "Scale"))
+ self.btnRotate.setToolTip(_translate("MainWindow", "Rotate"))
+ self.btnAnchor.setToolTip(_translate("MainWindow", "<html><head/><body><p>Set custom anchor</p></body></html>"))
+ self.comboAnchor.setToolTip(_translate("MainWindow", "<html><head/><body><p>Anchor</p></body></html>"))
+ self.comboAnchor.setCurrentText(_translate("MainWindow", "Origin"))
+ self.comboAnchor.setItemText(0, _translate("MainWindow", "Origin"))
+ self.comboAnchor.setItemText(1, _translate("MainWindow", "Center"))
+ self.comboAnchor.setItemText(2, _translate("MainWindow", "Top Left"))
+ self.comboAnchor.setItemText(3, _translate("MainWindow", "Top Right"))
+ self.comboAnchor.setItemText(4, _translate("MainWindow", "Bottom Right"))
+ self.comboAnchor.setItemText(5, _translate("MainWindow", "Bottom Left"))
+ self.comboAnchor.setItemText(6, _translate("MainWindow", "Custom"))
+ self.btnCustTransform.setToolTip(_translate("MainWindow", "<html><head/><body><p><br/></p></body></html>"))
+ self.btnSendBackwards.setToolTip(_translate("MainWindow", "<html><head/><body><p><br/></p></body></html>"))
+ self.btnSendForwards.setToolTip(_translate("MainWindow", "Translate"))
+ self.btnFill.setToolTip(_translate("MainWindow", "<html><head/><body><p>Toggle fill/outline</p></body></html>"))
+ self.label.setText(_translate("MainWindow", "Line Width:"))
+ self.txtLineWidth.setToolTip(_translate("MainWindow", "<html><head/><body><p>Current pen width</p></body></html>"))
+ self.frameCurrColor.setToolTip(_translate("MainWindow", "<html><head/><body><p>Current pen color</p></body></html>"))
+ self.btnSelectColor.setToolTip(_translate("MainWindow", "<html><head/><body><p>Set color</p></body></html>"))
+ self.btnOpenPoly.setToolTip(_translate("MainWindow", "<html><head/><body><p>Open polygon</p></body></html>"))
+ self.btnClosedPoly.setToolTip(_translate("MainWindow", "<html><head/><body><p>Closed polygon</p></body></html>"))
+ self.btnOpenCurve.setToolTip(_translate("MainWindow", "<html><head/><body><p>Open Bézier curve</p></body></html>"))
+ self.btnClosedCurve.setToolTip(_translate("MainWindow", "<html><head/><body><p>Closed Bézier curve</p></body></html>"))
+ self.btnAddPoly.setToolTip(_translate("MainWindow", "<html><head/><body><p>Regular polygon</p></body></html>"))
+ self.btnAddCircle.setToolTip(_translate("MainWindow", "<html><head/><body><p>Circle</p></body></html>"))
+ self.btnAddLabel.setToolTip(_translate("MainWindow", "<html><head/><body><p>Text</p></body></html>"))
+ self.menuFIle.setTitle(_translate("MainWindow", "&File"))
+ self.menuEdit.setTitle(_translate("MainWindow", "&Edit"))
+ self.menuOptions.setTitle(_translate("MainWindow", "Optio&ns"))
+ self.menuHelp.setTitle(_translate("MainWindow", "&Help"))
+ self.menuTools.setTitle(_translate("MainWindow", "&Tools"))
+ self.actionAbout.setText(_translate("MainWindow", "&About"))
+ self.actionManual.setText(_translate("MainWindow", "&Manual"))
+ self.actionSettings.setText(_translate("MainWindow", "&Settings"))
+ self.actionPause.setText(_translate("MainWindow", "Pause "))
+ self.actionSaveAs.setText(_translate("MainWindow", "&Save As"))
+ self.actionEnterCommand.setText(_translate("MainWindow", "&Enter Command"))
+ self.actionQuit.setText(_translate("MainWindow", "&Quit"))
+ self.actionUndo.setText(_translate("MainWindow", "&Undo"))
+ self.actionRedo.setText(_translate("MainWindow", "&Redo"))
+ self.actionShow_Grid.setText(_translate("MainWindow", "&Show Grid"))
+ self.actionShow_Local_Grid.setText(_translate("MainWindow", "Show &Local Grid"))
+ self.actionTransform.setText(_translate("MainWindow", "&Transform"))
+ self.actionExportAsymptote.setText(_translate("MainWindow", "Export"))
+ self.actionSave.setText(_translate("MainWindow", "Save"))
+ self.actionOpen.setText(_translate("MainWindow", "Open"))
+
+import icons_rc
diff --git a/Build/source/utils/asymptote/GUI/requirements.txt b/Build/source/utils/asymptote/GUI/requirements.txt
new file mode 100644
index 00000000000..47966fe275d
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/requirements.txt
@@ -0,0 +1,4 @@
+numpy==1.11.0
+cson==0.7
+PyQt5==5.11
+rsvg-convert==2.42.3
diff --git a/Build/source/utils/asymptote/GUI/res/icons.qrc b/Build/source/utils/asymptote/GUI/res/icons.qrc
new file mode 100644
index 00000000000..50928ef9b74
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons.qrc
@@ -0,0 +1,45 @@
+<RCC>
+ <qresource prefix="">
+ <file>icons/android-arrow-back.svg</file>
+ <file>icons/android-arrow-forward.svg</file>
+ <file>icons/android-folder-open.svg</file>
+ <file>icons/save.svg</file>
+ <file>icons/code.svg</file>
+ <file>icons/android-camera.svg</file>
+ <file>icons/plus-round.svg</file>
+ <file>icons/grid.svg</file>
+ <file>icons/magnifying-glass.svg</file>
+ <file>icons/center.svg</file>
+ <file>icons/centerorigin.svg</file>
+ <file>icons/edit.svg</file>
+ <file>icons/android-delete.svg</file>
+ <file>icons/android-hand.svg</file>
+ <file>icons/arrow-move.svg</file>
+ <file>icons/arrow-resize.svg</file>
+ <file>icons/android-refresh.svg</file>
+ <file>icons/anchor.svg</file>
+ <file>icons/eye.svg</file>
+ <file>icons/android-expand.svg</file>
+ <file>icons/chevron-with-circle-left.svg</file>
+ <file>icons/chevron-with-circle-right.svg</file>
+ <file>icons/bucket.svg</file>
+ <file>icons/filledbucket.svg</file>
+ <file>icons/android-color-palette.svg</file>
+ <file>icons/openpolygon.svg</file>
+ <file>icons/closedpolygon.svg</file>
+ <file>icons/opencurve.svg</file>
+ <file>icons/closedcurve.svg</file>
+ <file>icons/triangle-stroked-15.svg</file>
+ <file>icons/circle.svg</file>
+ <file>icons/text.svg</file>
+ <file>icons/social-python.svg</file>
+ <file>icons/subdirectory-left.svg</file>
+ <file>icons/android-done.svg</file>
+ <file>icons/android-close.svg</file>
+ <file>icons/check.svg</file>
+ <file>icons/android-radio-button-on.svg</file>
+ <file>icons/android-radio-button-off.svg</file>
+ <file>icons/android-locate.svg</file>
+ <file>icons/close-round.svg</file>
+ </qresource>
+</RCC>
diff --git a/Build/source/utils/asymptote/GUI/res/icons/anchor.svg b/Build/source/utils/asymptote/GUI/res/icons/anchor.svg
new file mode 100644
index 00000000000..886aadebf94
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/anchor.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M4.34 15.66A7.97 7.97 0 0 0 9 17.94V10H5V8h4V5.83a3 3 0 1 1 2 0V8h4v2h-4v7.94a7.97 7.97 0 0 0 4.66-2.28l-1.42-1.42h5.66l-2.83 2.83a10 10 0 0 1-14.14 0L.1 14.24h5.66l-1.42 1.42zM10 4a1 1 0 1 0 0-2 1 1 0 0 0 0 2z"/></svg> \ No newline at end of file
diff --git a/Build/source/utils/asymptote/GUI/res/icons/android-arrow-back.svg b/Build/source/utils/asymptote/GUI/res/icons/android-arrow-back.svg
new file mode 100644
index 00000000000..79cfe814a1b
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/android-arrow-back.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="512px" height="512px" viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
+<g id="Icon_8_">
+ <g>
+ <path d="M427,234.625H167.296l119.702-119.702L256,85L85,256l171,171l29.922-29.924L167.296,277.375H427V234.625z"/>
+ </g>
+</g>
+</svg>
diff --git a/Build/source/utils/asymptote/GUI/res/icons/android-arrow-forward.svg b/Build/source/utils/asymptote/GUI/res/icons/android-arrow-forward.svg
new file mode 100644
index 00000000000..d63794dcc0a
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/android-arrow-forward.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="512px" height="512px" viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
+<g id="Icon_8_">
+ <g>
+ <path d="M85,277.375h259.704L225.002,397.077L256,427l171-171L256,85l-29.922,29.924l118.626,119.701H85V277.375z"/>
+ </g>
+</g>
+</svg>
diff --git a/Build/source/utils/asymptote/GUI/res/icons/android-camera.svg b/Build/source/utils/asymptote/GUI/res/icons/android-camera.svg
new file mode 100644
index 00000000000..73aeaabe49c
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/android-camera.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="512px" height="512px" viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
+<g>
+ <circle cx="256" cy="280" r="63"/>
+ <path d="M440,96h-88l-32-32H192l-32,32H72c-22.092,0-40,17.908-40,40v272c0,22.092,17.908,40,40,40h368c22.092,0,40-17.908,40-40
+ V136C480,113.908,462.092,96,440,96z M256,392c-61.855,0-112-50.145-112-112s50.145-112,112-112s112,50.145,112,112
+ S317.855,392,256,392z"/>
+</g>
+</svg>
diff --git a/Build/source/utils/asymptote/GUI/res/icons/android-close.svg b/Build/source/utils/asymptote/GUI/res/icons/android-close.svg
new file mode 100644
index 00000000000..aee0f9f630e
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/android-close.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="512px" height="512px" viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
+<g id="Icon_5_">
+ <g>
+ <polygon points="405,136.798 375.202,107 256,226.202 136.798,107 107,136.798 226.202,256 107,375.202 136.798,405 256,285.798
+ 375.202,405 405,375.202 285.798,256 "/>
+ </g>
+</g>
+</svg>
diff --git a/Build/source/utils/asymptote/GUI/res/icons/android-color-palette.svg b/Build/source/utils/asymptote/GUI/res/icons/android-color-palette.svg
new file mode 100644
index 00000000000..d700fe6b9d2
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/android-color-palette.svg
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="512px" height="512px" viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
+<g id="Icon_12_">
+ <g>
+ <path d="M256,64C150.401,64,64,150.401,64,256c0,105.604,86.401,192,192,192c18.136,0,32-13.864,32-32
+ c0-8.531-3.198-16-8.531-21.333c-5.333-5.334-8.531-12.803-8.531-21.334c0-18.135,13.864-32,32-32h38.396
+ c58.667,0,106.667-48,106.667-106.666C448,140.802,361.604,64,256,64z M138.667,256c-18.136,0-32-13.864-32-32s13.864-32,32-32
+ c18.135,0,32,13.864,32,32S156.802,256,138.667,256z M202.667,170.667c-18.136,0-32-13.865-32-32c0-18.136,13.864-32,32-32
+ c18.135,0,32,13.864,32,32C234.667,156.802,220.802,170.667,202.667,170.667z M309.333,170.667c-18.135,0-32-13.865-32-32
+ c0-18.136,13.865-32,32-32c18.136,0,32,13.864,32,32C341.333,156.802,327.469,170.667,309.333,170.667z M373.333,256
+ c-18.135,0-32-13.864-32-32s13.865-32,32-32c18.136,0,32,13.864,32,32S391.469,256,373.333,256z"/>
+ </g>
+</g>
+</svg>
diff --git a/Build/source/utils/asymptote/GUI/res/icons/android-delete.svg b/Build/source/utils/asymptote/GUI/res/icons/android-delete.svg
new file mode 100644
index 00000000000..49cfa5ade43
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/android-delete.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="512px" height="512px" viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
+<g>
+ <path d="M128,405.429C128,428.846,147.198,448,170.667,448h170.667C364.802,448,384,428.846,384,405.429V160H128V405.429z M416,96
+ h-80l-26.785-32H202.786L176,96H96v32h320V96z"/>
+</g>
+</svg>
diff --git a/Build/source/utils/asymptote/GUI/res/icons/android-done.svg b/Build/source/utils/asymptote/GUI/res/icons/android-done.svg
new file mode 100644
index 00000000000..4bcb946f058
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/android-done.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="512px" height="512px" viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
+<g id="Icon_1_">
+ <g>
+ <g>
+ <polygon points="186.301,339.893 96,249.461 64,279.968 186.301,402 448,140.506 416,110 "/>
+ </g>
+ </g>
+</g>
+</svg>
diff --git a/Build/source/utils/asymptote/GUI/res/icons/android-expand.svg b/Build/source/utils/asymptote/GUI/res/icons/android-expand.svg
new file mode 100644
index 00000000000..51be003c07a
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/android-expand.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="512px" height="512px" viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
+<g>
+ <polygon points="396.795,396.8 320,396.8 320,448 448,448 448,320 396.795,320 "/>
+ <polygon points="396.8,115.205 396.8,192 448,192 448,64 320,64 320,115.205 "/>
+ <polygon points="115.205,115.2 192,115.2 192,64 64,64 64,192 115.205,192 "/>
+ <polygon points="115.2,396.795 115.2,320 64,320 64,448 192,448 192,396.795 "/>
+</g>
+</svg>
diff --git a/Build/source/utils/asymptote/GUI/res/icons/android-folder-open.svg b/Build/source/utils/asymptote/GUI/res/icons/android-folder-open.svg
new file mode 100644
index 00000000000..fa77fea2154
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/android-folder-open.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="512px" height="512px" viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
+<path d="M437.334,144H256.006l-42.668-48H74.666C51.197,96,32,115.198,32,138.667v234.666C32,396.802,51.197,416,74.666,416h362.668
+ C460.803,416,480,396.802,480,373.333V186.667C480,163.198,460.803,144,437.334,144z M448,373.333
+ c0,5.782-4.885,10.667-10.666,10.667H74.666C68.884,384,64,379.115,64,373.333V176h373.334c5.781,0,10.666,4.885,10.666,10.667
+ V373.333z"/>
+</svg>
diff --git a/Build/source/utils/asymptote/GUI/res/icons/android-hand.svg b/Build/source/utils/asymptote/GUI/res/icons/android-hand.svg
new file mode 100644
index 00000000000..5035d875be1
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/android-hand.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="512px" height="512px" viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
+<path d="M450.679,273.5c-14.585-14.577-36.054-15.89-50.639-1.312l-41.687,41.664c-10.852,10.836-23.93,10.859-31.564,1.852
+ c-5.057-5.968-3.061-24.374-1.644-36.049l20.907-171.849c1.867-15.353-9.07-30.185-24.43-32.051
+ c-15.358-1.867-29.322,9.939-31.191,25.289L267.37,236.021c-1.205,3.358-3.79,3.938-4.081-0.582L255.44,60
+ c0-15.465-12.542-28-28.014-28c-15.473,0-28.015,12.535-28.015,28l-0.552,176.752c0.146,2.04-1.604,2.624-1.92,0.294L172.016,99.077
+ c-2.75-15.219-17.323-26.203-32.548-23.453c-15.227,2.748-25.339,18.187-22.591,33.403l22.193,161.455
+ c0.023,2.872-0.941,4.513-2.308,0.831l-33.109-88.517c-5.18-14.572-21.196-23.065-35.776-17.889
+ c-14.579,5.177-22.201,22.061-17.023,36.631l58.042,189.625c0.303,1.046,0.624,2.085,0.953,3.118l0.121,0.39
+ c0.011,0.031,0.025,0.058,0.035,0.088C126.079,444.233,172.57,480,227.427,480c35.116,0,71.591-12.378,99.357-33.672
+ c0.001,0,0.003-0.002,0.003-0.002c29.99-18.051,126.071-121.347,126.071-121.347C467.445,310.402,465.266,288.08,450.679,273.5z"/>
+</svg>
diff --git a/Build/source/utils/asymptote/GUI/res/icons/android-locate.svg b/Build/source/utils/asymptote/GUI/res/icons/android-locate.svg
new file mode 100644
index 00000000000..e2dd098cbd3
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/android-locate.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="512px" height="512px" viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
+<g id="Icon">
+ <g>
+ <path d="M256,176c-44.004,0-80.001,36-80.001,80c0,44.004,35.997,80,80.001,80c44.005,0,79.999-35.996,79.999-80
+ C335.999,212,300.005,176,256,176z M446.938,234.667c-9.605-88.531-81.074-160-169.605-169.599V32h-42.666v33.067
+ c-88.531,9.599-160,81.068-169.604,169.599H32v42.667h33.062c9.604,88.531,81.072,160,169.604,169.604V480h42.666v-33.062
+ c88.531-9.604,160-81.073,169.605-169.604H480v-42.667H446.938z M256,405.333c-82.137,0-149.334-67.198-149.334-149.333
+ c0-82.136,67.197-149.333,149.334-149.333c82.135,0,149.332,67.198,149.332,149.333C405.332,338.135,338.135,405.333,256,405.333z
+ "/>
+ </g>
+</g>
+</svg>
diff --git a/Build/source/utils/asymptote/GUI/res/icons/android-radio-button-off.svg b/Build/source/utils/asymptote/GUI/res/icons/android-radio-button-off.svg
new file mode 100644
index 00000000000..d36fa657c03
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/android-radio-button-off.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="512px" height="512px" viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
+<g id="Icon_20_">
+ <g>
+ <path d="M256,48C141.601,48,48,141.601,48,256s93.601,208,208,208s208-93.601,208-208S370.399,48,256,48z M256,422.399
+ c-91.518,0-166.399-74.882-166.399-166.399S164.482,89.6,256,89.6S422.4,164.482,422.4,256S347.518,422.399,256,422.399z"/>
+ </g>
+</g>
+</svg>
diff --git a/Build/source/utils/asymptote/GUI/res/icons/android-radio-button-on.svg b/Build/source/utils/asymptote/GUI/res/icons/android-radio-button-on.svg
new file mode 100644
index 00000000000..1f7f54c0f24
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/android-radio-button-on.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="512px" height="512px" viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
+<g id="Icon_21_">
+ <g>
+ <path d="M256,152c-57.2,0-104,46.8-104,104s46.8,104,104,104s104-46.8,104-104S313.2,152,256,152z M256,48
+ C141.601,48,48,141.601,48,256s93.601,208,208,208s208-93.601,208-208S370.399,48,256,48z M256,422.4
+ c-91.518,0-166.4-74.883-166.4-166.4S164.482,89.6,256,89.6S422.4,164.482,422.4,256S347.518,422.4,256,422.4z"/>
+ </g>
+</g>
+</svg>
diff --git a/Build/source/utils/asymptote/GUI/res/icons/android-refresh.svg b/Build/source/utils/asymptote/GUI/res/icons/android-refresh.svg
new file mode 100644
index 00000000000..066f7d22c6b
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/android-refresh.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="512px" height="512px" viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
+<g>
+ <path d="M256,388c-72.597,0-132-59.405-132-132c0-72.601,59.403-132,132-132c36.3,0,69.299,15.4,92.406,39.601L278,234h154V80
+ l-51.698,51.702C348.406,99.798,304.406,80,256,80c-96.797,0-176,79.203-176,176s78.094,176,176,176
+ c81.045,0,148.287-54.134,169.401-128H378.85C360.105,353.561,311.712,388,256,388z"/>
+</g>
+</svg>
diff --git a/Build/source/utils/asymptote/GUI/res/icons/arrow-move.svg b/Build/source/utils/asymptote/GUI/res/icons/arrow-move.svg
new file mode 100644
index 00000000000..1d4263f45a2
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/arrow-move.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="512px" height="512px" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
+<polygon points="480,256 384,160 384,236 276,236 276,128 352,128 256,32 160,128 236,128 236,236 128,236 128,160 32,256 128,352
+ 128,276 236,276 236,384 160,384 256,480 352,384 275.8,384 275.4,275.5 384,275.8 384,352 "/>
+</svg>
diff --git a/Build/source/utils/asymptote/GUI/res/icons/arrow-resize.svg b/Build/source/utils/asymptote/GUI/res/icons/arrow-resize.svg
new file mode 100644
index 00000000000..a9c3b3cc140
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/arrow-resize.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="512px" height="512px" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
+<polygon points="288,96 337.9,145.9 274,209.7 274,209.7 145.9,337.9 96,288 96,416 224,416 174.1,366.1 357.4,182.9 366.1,174.1
+ 416,224 416,96 "/>
+</svg>
diff --git a/Build/source/utils/asymptote/GUI/res/icons/bucket.asy b/Build/source/utils/asymptote/GUI/res/icons/bucket.asy
new file mode 100644
index 00000000000..e6468b3f067
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/bucket.asy
@@ -0,0 +1,28 @@
+// Empty bucket: asy bucket -f svg
+// Filled bucket: asy bucket -f svg -u fill=true -o filledbucket
+
+real pixel=1inch/96;
+size(32*pixel);
+defaultpen(1.75bp);
+
+real h=4;
+real r=3;
+path left=(-r,h)--(-r,0);
+path right=(r,0)--(r,h);
+path bottom=xscale(r)*arc(0,1,180,360);
+
+real H=0.9h;
+path Left=(-r,H/2)--(-r,0);
+path Right=(r,0)--(r,H/2);
+
+bool fill=false; // Set to true for filled bucket.
+usersetting();
+
+if(fill)
+ fill(Left--bottom--Right--shift(0,H)*xscale(r)*arc(0,1,0,180)--cycle,gray);
+
+
+draw(shift(0,h)*xscale(r)*unitcircle);
+draw(left--bottom--right);
+draw(shift(0,h)*scale(r)*arc(0,1,0,180));
+
diff --git a/Build/source/utils/asymptote/GUI/res/icons/bucket.svg b/Build/source/utils/asymptote/GUI/res/icons/bucket.svg
new file mode 100644
index 00000000000..8898aba6091
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/bucket.svg
@@ -0,0 +1,14 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- This file was generated by dvisvgm 2.4 -->
+<svg height='24pt' version='1.1' viewBox='56.4094 53.8583 18.4375 24' width='18.4375pt' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'>
+<g id='page1'>
+<g transform='matrix(0.996264 0 0 0.996264 65.6282 74.202)'>
+<path d='M 8.37504 -11.1667C 8.37504 -12.7085 4.62541 -13.9584 0 -13.9584C -4.62541 -13.9584 -8.37504 -12.7085 -8.37504 -11.1667C -8.37504 -9.62492 -4.62541 -8.37504 0 -8.37504C 4.62541 -8.37504 8.37504 -9.62492 8.37504 -11.1667Z' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='1.75656'/>
+</g>
+<g transform='matrix(0.996264 0 0 0.996264 65.6282 74.202)'>
+<path d='M -8.37504 -11.1667L -8.37504 -0L -8.37504 -1.85963e-15C -8.37504 -1.23975e-15 -8.37504 -6.19877e-16 -8.37504 -0C -8.37504 1.5418 -4.62541 2.79168 0 2.79168C 4.62541 2.79168 8.37504 1.5418 8.37504 0L 8.37504 0L 8.37504 -11.1667' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='1.75656'/>
+</g>
+<g transform='matrix(0.996264 0 0 0.996264 65.6282 74.202)'>
+<path d='M 8.37504 -11.1667C 8.37504 -15.7921 4.62541 -19.5418 0 -19.5418C -4.62541 -19.5418 -8.37504 -15.7921 -8.37504 -11.1667' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='1.75656'/>
+</g></g>
+</svg> \ No newline at end of file
diff --git a/Build/source/utils/asymptote/GUI/res/icons/center.asy b/Build/source/utils/asymptote/GUI/res/icons/center.asy
new file mode 100644
index 00000000000..8db11ef08a9
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/center.asy
@@ -0,0 +1,9 @@
+// Empty bucket: asy bucket -f svg
+// Filled bucket: asy bucket -f svg -u fill=true -o filledbucket
+
+real pixel=1inch/96;
+size(25*pixel);
+defaultpen(1.5bp);
+
+draw(scale(2)*shift(-0.5,-0.5)*unitsquare);
+fill(scale(0.5)*unitcircle);
diff --git a/Build/source/utils/asymptote/GUI/res/icons/center.svg b/Build/source/utils/asymptote/GUI/res/icons/center.svg
new file mode 100644
index 00000000000..15b77f5a644
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/center.svg
@@ -0,0 +1,11 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- This file was generated by dvisvgm 2.4 -->
+<svg height='18.75pt' version='1.1' viewBox='56.4094 53.8583 18.75 18.75' width='18.75pt' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'>
+<g id='page1'>
+<g transform='matrix(0.996264 0 0 0.996264 65.7844 63.2333)'>
+<path d='M -8.65734 8.65734L 8.65734 8.65734L 8.65734 -8.65734L -8.65734 -8.65734L -8.65734 8.65734Z' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='1.50562'/>
+</g>
+<g transform='matrix(0.996264 0 0 0.996264 65.7844 63.2333)'>
+<path d='M 4.32867 0C 4.32867 -2.39066 2.39066 -4.32867 0 -4.32867C -2.39066 -4.32867 -4.32867 -2.39066 -4.32867 -0C -4.32867 2.39066 -2.39066 4.32867 0 4.32867C 2.39066 4.32867 4.32867 2.39066 4.32867 0Z' fill='#000000'/>
+</g></g>
+</svg> \ No newline at end of file
diff --git a/Build/source/utils/asymptote/GUI/res/icons/centerorigin.asy b/Build/source/utils/asymptote/GUI/res/icons/centerorigin.asy
new file mode 100644
index 00000000000..b1df599d387
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/centerorigin.asy
@@ -0,0 +1,7 @@
+real pixel=1inch/96;
+size(25*pixel);
+defaultpen(1.5bp);
+
+draw(scale(2)*shift(-0.5,-0.5)*unitsquare);
+draw((-1,0)--(1,0));
+draw((0,-1)--(0,1));
diff --git a/Build/source/utils/asymptote/GUI/res/icons/centerorigin.svg b/Build/source/utils/asymptote/GUI/res/icons/centerorigin.svg
new file mode 100644
index 00000000000..253ba7789f3
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/centerorigin.svg
@@ -0,0 +1,14 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- This file was generated by dvisvgm 2.4 -->
+<svg height='18.75pt' version='1.1' viewBox='56.4094 53.8583 18.75 18.75' width='18.75pt' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'>
+<g id='page1'>
+<g transform='matrix(0.996264 0 0 0.996264 65.7844 63.2333)'>
+<path d='M -8.65734 8.65734L 8.65734 8.65734L 8.65734 -8.65734L -8.65734 -8.65734L -8.65734 8.65734Z' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='1.50562'/>
+</g>
+<g transform='matrix(0.996264 0 0 0.996264 65.7844 63.2333)'>
+<path d='M -8.65734 -0L 8.65734 0' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='1.50562'/>
+</g>
+<g transform='matrix(0.996264 0 0 0.996264 65.7844 63.2333)'>
+<path d='M 0 8.65734L 0 -8.65734' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='1.50562'/>
+</g></g>
+</svg> \ No newline at end of file
diff --git a/Build/source/utils/asymptote/GUI/res/icons/check.svg b/Build/source/utils/asymptote/GUI/res/icons/check.svg
new file mode 100644
index 00000000000..08ee56d87de
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/check.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Check" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 20 20" enable-background="new 0 0 20 20" xml:space="preserve">
+<path d="M8.294,16.998c-0.435,0-0.847-0.203-1.111-0.553L3.61,11.724c-0.465-0.613-0.344-1.486,0.27-1.951
+ c0.615-0.467,1.488-0.344,1.953,0.27l2.351,3.104l5.911-9.492c0.407-0.652,1.267-0.852,1.921-0.445
+ c0.653,0.406,0.854,1.266,0.446,1.92L9.478,16.34c-0.242,0.391-0.661,0.635-1.12,0.656C8.336,16.998,8.316,16.998,8.294,16.998z"/>
+</svg>
diff --git a/Build/source/utils/asymptote/GUI/res/icons/chevron-with-circle-left.svg b/Build/source/utils/asymptote/GUI/res/icons/chevron-with-circle-left.svg
new file mode 100644
index 00000000000..57d5c5b2574
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/chevron-with-circle-left.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Chevron_circled_left" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+ x="0px" y="0px" viewBox="0 0 20 20" enable-background="new 0 0 20 20" xml:space="preserve">
+<path d="M11.302,6.776c-0.196-0.197-0.515-0.197-0.71,0L7.785,9.641c-0.196,0.199-0.196,0.52,0,0.717l2.807,2.864
+ c0.195,0.199,0.514,0.198,0.71,0c0.196-0.197,0.196-0.518,0-0.717L9,10l2.302-2.506C11.498,7.296,11.498,6.976,11.302,6.776z
+ M10,0.4c-5.302,0-9.6,4.298-9.6,9.6c0,5.303,4.298,9.6,9.6,9.6s9.6-4.297,9.6-9.6C19.6,4.698,15.302,0.4,10,0.4z M10,18.354
+ c-4.615,0-8.354-3.74-8.354-8.354c0-4.614,3.739-8.354,8.354-8.354c4.613,0,8.354,3.74,8.354,8.354
+ C18.354,14.614,14.613,18.354,10,18.354z"/>
+</svg>
diff --git a/Build/source/utils/asymptote/GUI/res/icons/chevron-with-circle-right.svg b/Build/source/utils/asymptote/GUI/res/icons/chevron-with-circle-right.svg
new file mode 100644
index 00000000000..a48f0376a06
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/chevron-with-circle-right.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Chevron_circled_right" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+ x="0px" y="0px" viewBox="0 0 20 20" enable-background="new 0 0 20 20" xml:space="preserve">
+<path d="M11,10L8.698,7.494c-0.196-0.198-0.196-0.519,0-0.718c0.196-0.197,0.515-0.197,0.71,0l2.807,2.864
+ c0.196,0.199,0.196,0.52,0,0.717l-2.807,2.864c-0.195,0.199-0.514,0.198-0.71,0c-0.196-0.197-0.196-0.518,0-0.717L11,10z M10,0.4
+ c5.302,0,9.6,4.298,9.6,9.6c0,5.303-4.298,9.6-9.6,9.6S0.4,15.303,0.4,10C0.4,4.698,4.698,0.4,10,0.4z M10,18.354
+ c4.613,0,8.354-3.74,8.354-8.354c0-4.614-3.741-8.354-8.354-8.354c-4.615,0-8.354,3.74-8.354,8.354
+ C1.645,14.614,5.385,18.354,10,18.354z"/>
+</svg>
diff --git a/Build/source/utils/asymptote/GUI/res/icons/circle.svg b/Build/source/utils/asymptote/GUI/res/icons/circle.svg
new file mode 100644
index 00000000000..b841c238db5
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/circle.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Circle" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 20 20" enable-background="new 0 0 20 20" xml:space="preserve">
+<path d="M10,0.4C4.698,0.4,0.4,4.698,0.4,10C0.4,15.302,4.698,19.6,10,19.6c5.301,0,9.6-4.298,9.6-9.601
+ C19.6,4.698,15.301,0.4,10,0.4z M10,17.599c-4.197,0-7.6-3.402-7.6-7.6S5.802,2.4,10,2.4c4.197,0,7.601,3.402,7.601,7.6
+ S14.197,17.599,10,17.599z"/>
+</svg>
diff --git a/Build/source/utils/asymptote/GUI/res/icons/close-round.svg b/Build/source/utils/asymptote/GUI/res/icons/close-round.svg
new file mode 100644
index 00000000000..d8b5554c5c1
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/close-round.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="512px" height="512px" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
+<path d="M437.5,386.6L306.9,256l130.6-130.6c14.1-14.1,14.1-36.8,0-50.9c-14.1-14.1-36.8-14.1-50.9,0L256,205.1L125.4,74.5
+ c-14.1-14.1-36.8-14.1-50.9,0c-14.1,14.1-14.1,36.8,0,50.9L205.1,256L74.5,386.6c-14.1,14.1-14.1,36.8,0,50.9
+ c14.1,14.1,36.8,14.1,50.9,0L256,306.9l130.6,130.6c14.1,14.1,36.8,14.1,50.9,0C451.5,423.4,451.5,400.6,437.5,386.6z"/>
+</svg>
diff --git a/Build/source/utils/asymptote/GUI/res/icons/closedcurve.asy b/Build/source/utils/asymptote/GUI/res/icons/closedcurve.asy
new file mode 100644
index 00000000000..64068079983
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/closedcurve.asy
@@ -0,0 +1,7 @@
+real pixel=1inch/96;
+size(32*pixel,IgnoreAspect);
+defaultpen(1.75bp);
+
+path p=W..NW..ENE..0.5*SE..cycle;
+draw(p);
+dot(p,linewidth(8pixel));
diff --git a/Build/source/utils/asymptote/GUI/res/icons/closedcurve.svg b/Build/source/utils/asymptote/GUI/res/icons/closedcurve.svg
new file mode 100644
index 00000000000..946ef84df7a
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/closedcurve.svg
@@ -0,0 +1,20 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- This file was generated by dvisvgm 2.4 -->
+<svg height='24pt' version='1.1' viewBox='56.4094 53.8583 24 24' width='24pt' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'>
+<g id='page1'>
+<g transform='matrix(0.996264 0 0 0.996264 68.7655 69.7688)'>
+<path d='M -9.39118 -0C -9.96861 -3.83004 -8.55706 -7.51944 -6.64057 -10.2171C -0.491089 -18.8733 8.35676 -15.1906 8.67632 -5.52948C 8.836 -0.702008 6.23968 2.94207 3.32028 5.10857C -1.96891 9.03371 -8.26895 7.4437 -9.39118 -0Z' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='1.75656'/>
+</g>
+<g transform='matrix(0.996264 0 0 0.996264 68.7655 69.7688)'>
+<circle cx='-9.39118' cy='-0' r='3.01125' fill='#000000'/>
+</g>
+<g transform='matrix(0.996264 0 0 0.996264 68.7655 69.7688)'>
+<circle cx='-6.64057' cy='-10.2171' r='3.01125' fill='#000000'/>
+</g>
+<g transform='matrix(0.996264 0 0 0.996264 68.7655 69.7688)'>
+<circle cx='8.67632' cy='-5.52948' r='3.01125' fill='#000000'/>
+</g>
+<g transform='matrix(0.996264 0 0 0.996264 68.7655 69.7688)'>
+<circle cx='3.32028' cy='5.10857' r='3.01125' fill='#000000'/>
+</g></g>
+</svg> \ No newline at end of file
diff --git a/Build/source/utils/asymptote/GUI/res/icons/closedpolygon.asy b/Build/source/utils/asymptote/GUI/res/icons/closedpolygon.asy
new file mode 100644
index 00000000000..9e4719a36b0
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/closedpolygon.asy
@@ -0,0 +1,7 @@
+real pixel=1inch/96;
+size(32*pixel,IgnoreAspect);
+defaultpen(1.75bp);
+
+path p=W--NW--ENE--0.5*SE--cycle;
+draw(p);
+dot(p,linewidth(8pixel));
diff --git a/Build/source/utils/asymptote/GUI/res/icons/closedpolygon.svg b/Build/source/utils/asymptote/GUI/res/icons/closedpolygon.svg
new file mode 100644
index 00000000000..432195d706a
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/closedpolygon.svg
@@ -0,0 +1,20 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- This file was generated by dvisvgm 2.4 -->
+<svg height='24pt' version='1.1' viewBox='56.4094 53.8583 24 24' width='24pt' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'>
+<g id='page1'>
+<g transform='matrix(0.996264 0 0 0.996264 68.7655 68.8583)'>
+<path d='M -9.39118 -0L -6.64057 -12.045L 8.67632 -6.51871L 3.32028 6.0225L -9.39118 -0Z' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='1.75656'/>
+</g>
+<g transform='matrix(0.996264 0 0 0.996264 68.7655 68.8583)'>
+<circle cx='-9.39118' cy='-0' r='3.01125' fill='#000000'/>
+</g>
+<g transform='matrix(0.996264 0 0 0.996264 68.7655 68.8583)'>
+<circle cx='-6.64057' cy='-12.045' r='3.01125' fill='#000000'/>
+</g>
+<g transform='matrix(0.996264 0 0 0.996264 68.7655 68.8583)'>
+<circle cx='8.67632' cy='-6.51871' r='3.01125' fill='#000000'/>
+</g>
+<g transform='matrix(0.996264 0 0 0.996264 68.7655 68.8583)'>
+<circle cx='3.32028' cy='6.0225' r='3.01125' fill='#000000'/>
+</g></g>
+</svg> \ No newline at end of file
diff --git a/Build/source/utils/asymptote/GUI/res/icons/code.svg b/Build/source/utils/asymptote/GUI/res/icons/code.svg
new file mode 100644
index 00000000000..33a99fd5d72
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/code.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Code" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 20 20" enable-background="new 0 0 20 20" xml:space="preserve">
+<path d="M5.719,14.75c-0.236,0-0.474-0.083-0.664-0.252L-0.005,10l5.341-4.748C5.748,4.887,6.38,4.922,6.747,5.335
+ c0.367,0.413,0.33,1.045-0.083,1.412L3.005,10l3.378,3.002c0.413,0.367,0.45,0.999,0.083,1.412
+ C6.269,14.637,5.994,14.75,5.719,14.75z M14.664,14.748L20.005,10l-5.06-4.498c-0.413-0.367-1.045-0.33-1.411,0.083
+ c-0.367,0.413-0.33,1.045,0.083,1.412L16.995,10l-3.659,3.252c-0.413,0.367-0.45,0.999-0.083,1.412C13.45,14.887,13.725,15,14,15
+ C14.236,15,14.474,14.917,14.664,14.748z M9.986,16.165l2-12c0.091-0.545-0.277-1.06-0.822-1.151
+ c-0.547-0.092-1.061,0.277-1.15,0.822l-2,12c-0.091,0.545,0.277,1.06,0.822,1.151C8.892,16.996,8.946,17,9.001,17
+ C9.481,17,9.905,16.653,9.986,16.165z"/>
+</svg>
diff --git a/Build/source/utils/asymptote/GUI/res/icons/edit.svg b/Build/source/utils/asymptote/GUI/res/icons/edit.svg
new file mode 100644
index 00000000000..a0be3454e12
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/edit.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="512px" height="512px" viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
+<g>
+
+ <rect x="178.846" y="92.087" transform="matrix(-0.7071 -0.7071 0.7071 -0.7071 224.3476 631.1498)" width="128.085" height="354.049"/>
+ <path d="M471.723,88.393l-48.115-48.114c-11.723-11.724-31.558-10.896-44.304,1.85l-45.202,45.203l90.569,90.568l45.202-45.202
+ C482.616,119.952,483.445,100.116,471.723,88.393z"/>
+ <polygon points="64.021,363.252 32,480 148.737,447.979 "/>
+</g>
+</svg>
diff --git a/Build/source/utils/asymptote/GUI/res/icons/eye.svg b/Build/source/utils/asymptote/GUI/res/icons/eye.svg
new file mode 100644
index 00000000000..6b64633fce1
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/eye.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="512px" height="512px" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
+<g>
+ <path d="M256,128c-81.9,0-145.7,48.8-224,128c67.4,67.7,124,128,224,128c99.9,0,173.4-76.4,224-126.6
+ C428.2,198.6,354.8,128,256,128z M256,347.3c-49.4,0-89.6-41-89.6-91.3c0-50.4,40.2-91.3,89.6-91.3s89.6,41,89.6,91.3
+ C345.6,306.4,305.4,347.3,256,347.3z"/>
+ <g>
+ <path d="M256,224c0-7.9,2.9-15.1,7.6-20.7c-2.5-0.4-5-0.6-7.6-0.6c-28.8,0-52.3,23.9-52.3,53.3c0,29.4,23.5,53.3,52.3,53.3
+ s52.3-23.9,52.3-53.3c0-2.3-0.2-4.6-0.4-6.9c-5.5,4.3-12.3,6.9-19.8,6.9C270.3,256,256,241.7,256,224z"/>
+ </g>
+</g>
+</svg>
diff --git a/Build/source/utils/asymptote/GUI/res/icons/filledbucket.svg b/Build/source/utils/asymptote/GUI/res/icons/filledbucket.svg
new file mode 100644
index 00000000000..e768fa3d1c6
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/filledbucket.svg
@@ -0,0 +1,17 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- This file was generated by dvisvgm 2.4 -->
+<svg height='24pt' version='1.1' viewBox='56.4094 53.8583 18.4375 24' width='18.4375pt' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'>
+<g id='page1'>
+<g transform='matrix(0.996264 0 0 0.996264 65.6282 74.202)'>
+<path d='M -8.37504 -5.02502L -8.37504 -0L -8.37504 -1.85963e-15C -8.37504 -1.23975e-15 -8.37504 -6.19877e-16 -8.37504 -0C -8.37504 1.5418 -4.62541 2.79168 0 2.79168C 4.62541 2.79168 8.37504 1.5418 8.37504 0L 8.37504 0L 8.37504 -5.02502L 8.37504 -10.05C 8.37504 -11.5918 4.62541 -12.8417 0 -12.8417C -4.62541 -12.8417 -8.37504 -11.5918 -8.37504 -10.05L -8.37504 -5.02502Z' fill='#808080'/>
+</g>
+<g transform='matrix(0.996264 0 0 0.996264 65.6282 74.202)'>
+<path d='M 8.37504 -11.1667C 8.37504 -12.7085 4.62541 -13.9584 0 -13.9584C -4.62541 -13.9584 -8.37504 -12.7085 -8.37504 -11.1667C -8.37504 -9.62492 -4.62541 -8.37504 0 -8.37504C 4.62541 -8.37504 8.37504 -9.62492 8.37504 -11.1667Z' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='1.75656'/>
+</g>
+<g transform='matrix(0.996264 0 0 0.996264 65.6282 74.202)'>
+<path d='M -8.37504 -11.1667L -8.37504 -0L -8.37504 -1.85963e-15C -8.37504 -1.23975e-15 -8.37504 -6.19877e-16 -8.37504 -0C -8.37504 1.5418 -4.62541 2.79168 0 2.79168C 4.62541 2.79168 8.37504 1.5418 8.37504 0L 8.37504 0L 8.37504 -11.1667' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='1.75656'/>
+</g>
+<g transform='matrix(0.996264 0 0 0.996264 65.6282 74.202)'>
+<path d='M 8.37504 -11.1667C 8.37504 -15.7921 4.62541 -19.5418 0 -19.5418C -4.62541 -19.5418 -8.37504 -15.7921 -8.37504 -11.1667' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='1.75656'/>
+</g></g>
+</svg> \ No newline at end of file
diff --git a/Build/source/utils/asymptote/GUI/res/icons/grid.svg b/Build/source/utils/asymptote/GUI/res/icons/grid.svg
new file mode 100644
index 00000000000..456e5011317
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/grid.svg
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="512px" height="512px" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
+<g>
+ <g>
+ <path d="M160,153.3c0,3.7-3,6.7-6.7,6.7h-50.5c-3.7,0-6.7-3-6.7-6.7v-50.5c0-3.7,3-6.7,6.7-6.7h50.5c3.7,0,6.7,3,6.7,6.7V153.3z"
+ />
+ <path d="M288,153.3c0,3.7-3,6.7-6.7,6.7h-50.5c-3.7,0-6.7-3-6.7-6.7v-50.5c0-3.7,3-6.7,6.7-6.7h50.5c3.7,0,6.7,3,6.7,6.7V153.3z"
+ />
+ <path d="M416,153.3c0,3.7-3,6.7-6.7,6.7h-50.5c-3.7,0-6.7-3-6.7-6.7v-50.5c0-3.7,3-6.7,6.7-6.7h50.5c3.7,0,6.7,3,6.7,6.7V153.3z"
+ />
+ </g>
+ <g>
+ <path d="M160,281.3c0,3.7-3,6.7-6.7,6.7h-50.5c-3.7,0-6.7-3-6.7-6.7v-50.5c0-3.7,3-6.7,6.7-6.7h50.5c3.7,0,6.7,3,6.7,6.7V281.3z"
+ />
+ <path d="M288,281.3c0,3.7-3,6.7-6.7,6.7h-50.5c-3.7,0-6.7-3-6.7-6.7v-50.5c0-3.7,3-6.7,6.7-6.7h50.5c3.7,0,6.7,3,6.7,6.7V281.3z"
+ />
+ <path d="M416,281.3c0,3.7-3,6.7-6.7,6.7h-50.5c-3.7,0-6.7-3-6.7-6.7v-50.5c0-3.7,3-6.7,6.7-6.7h50.5c3.7,0,6.7,3,6.7,6.7V281.3z"
+ />
+ </g>
+ <g>
+ <path d="M160,409.3c0,3.7-3,6.7-6.7,6.7h-50.5c-3.7,0-6.7-3-6.7-6.7v-50.5c0-3.7,3-6.7,6.7-6.7h50.5c3.7,0,6.7,3,6.7,6.7V409.3z"
+ />
+ <path d="M288,409.3c0,3.7-3,6.7-6.7,6.7h-50.5c-3.7,0-6.7-3-6.7-6.7v-50.5c0-3.7,3-6.7,6.7-6.7h50.5c3.7,0,6.7,3,6.7,6.7V409.3z"
+ />
+ <path d="M416,409.3c0,3.7-3,6.7-6.7,6.7h-50.5c-3.7,0-6.7-3-6.7-6.7v-50.5c0-3.7,3-6.7,6.7-6.7h50.5c3.7,0,6.7,3,6.7,6.7V409.3z"
+ />
+ </g>
+</g>
+</svg>
diff --git a/Build/source/utils/asymptote/GUI/res/icons/magnifying-glass.svg b/Build/source/utils/asymptote/GUI/res/icons/magnifying-glass.svg
new file mode 100644
index 00000000000..f82283d618a
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/magnifying-glass.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Magnifying_glass" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
+ y="0px" viewBox="0 0 20 20" enable-background="new 0 0 20 20" xml:space="preserve">
+<path d="M17.545,15.467l-3.779-3.779c0.57-0.935,0.898-2.035,0.898-3.21c0-3.417-2.961-6.377-6.378-6.377
+ C4.869,2.1,2.1,4.87,2.1,8.287c0,3.416,2.961,6.377,6.377,6.377c1.137,0,2.2-0.309,3.115-0.844l3.799,3.801
+ c0.372,0.371,0.975,0.371,1.346,0l0.943-0.943C18.051,16.307,17.916,15.838,17.545,15.467z M4.004,8.287
+ c0-2.366,1.917-4.283,4.282-4.283c2.366,0,4.474,2.107,4.474,4.474c0,2.365-1.918,4.283-4.283,4.283
+ C6.111,12.76,4.004,10.652,4.004,8.287z"/>
+</svg>
diff --git a/Build/source/utils/asymptote/GUI/res/icons/opencurve.asy b/Build/source/utils/asymptote/GUI/res/icons/opencurve.asy
new file mode 100644
index 00000000000..885128358a0
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/opencurve.asy
@@ -0,0 +1,7 @@
+real pixel=1inch/96;
+size(32*pixel,IgnoreAspect);
+defaultpen(1.75bp);
+
+path p=W..NW..ENE..0.5*SE;
+draw(p);
+dot(p,linewidth(8pixel));
diff --git a/Build/source/utils/asymptote/GUI/res/icons/opencurve.svg b/Build/source/utils/asymptote/GUI/res/icons/opencurve.svg
new file mode 100644
index 00000000000..5086ab071b6
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/opencurve.svg
@@ -0,0 +1,20 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- This file was generated by dvisvgm 2.4 -->
+<svg height='24pt' version='1.1' viewBox='56.4094 53.8583 24 24' width='24pt' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'>
+<g id='page1'>
+<g transform='matrix(0.996264 0 0 0.996264 68.7655 69.8123)'>
+<path d='M -9.39118 -0C -9.32257 -3.77783 -8.34324 -7.38444 -6.64057 -10.1298C -1.26219 -18.8017 7.68971 -15.5351 8.67632 -5.4822C 9.18679 -0.280877 6.74937 4.51887 3.32028 5.06489' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='1.75656'/>
+</g>
+<g transform='matrix(0.996264 0 0 0.996264 68.7655 69.8123)'>
+<circle cx='-9.39118' cy='-0' r='3.01125' fill='#000000'/>
+</g>
+<g transform='matrix(0.996264 0 0 0.996264 68.7655 69.8123)'>
+<circle cx='-6.64057' cy='-10.1298' r='3.01125' fill='#000000'/>
+</g>
+<g transform='matrix(0.996264 0 0 0.996264 68.7655 69.8123)'>
+<circle cx='8.67632' cy='-5.4822' r='3.01125' fill='#000000'/>
+</g>
+<g transform='matrix(0.996264 0 0 0.996264 68.7655 69.8123)'>
+<circle cx='3.32028' cy='5.06489' r='3.01125' fill='#000000'/>
+</g></g>
+</svg> \ No newline at end of file
diff --git a/Build/source/utils/asymptote/GUI/res/icons/openpolygon.asy b/Build/source/utils/asymptote/GUI/res/icons/openpolygon.asy
new file mode 100644
index 00000000000..19f4d5cb036
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/openpolygon.asy
@@ -0,0 +1,7 @@
+real pixel=1inch/96;
+size(32*pixel,IgnoreAspect);
+defaultpen(1.75bp);
+
+path p=W--NW--ENE--0.5*SE;
+draw(p);
+dot(p,linewidth(8pixel));
diff --git a/Build/source/utils/asymptote/GUI/res/icons/openpolygon.svg b/Build/source/utils/asymptote/GUI/res/icons/openpolygon.svg
new file mode 100644
index 00000000000..a07a63abd7d
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/openpolygon.svg
@@ -0,0 +1,20 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- This file was generated by dvisvgm 2.4 -->
+<svg height='24pt' version='1.1' viewBox='56.4094 53.8583 24 24' width='24pt' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'>
+<g id='page1'>
+<g transform='matrix(0.996264 0 0 0.996264 68.7655 68.8583)'>
+<path d='M -9.39118 -0L -6.64057 -12.045L 8.67632 -6.51871L 3.32028 6.0225' fill='none' stroke='#000000' stroke-linecap='round' stroke-linejoin='round' stroke-miterlimit='10.0375' stroke-width='1.75656'/>
+</g>
+<g transform='matrix(0.996264 0 0 0.996264 68.7655 68.8583)'>
+<circle cx='-9.39118' cy='-0' r='3.01125' fill='#000000'/>
+</g>
+<g transform='matrix(0.996264 0 0 0.996264 68.7655 68.8583)'>
+<circle cx='-6.64057' cy='-12.045' r='3.01125' fill='#000000'/>
+</g>
+<g transform='matrix(0.996264 0 0 0.996264 68.7655 68.8583)'>
+<circle cx='8.67632' cy='-6.51871' r='3.01125' fill='#000000'/>
+</g>
+<g transform='matrix(0.996264 0 0 0.996264 68.7655 68.8583)'>
+<circle cx='3.32028' cy='6.0225' r='3.01125' fill='#000000'/>
+</g></g>
+</svg> \ No newline at end of file
diff --git a/Build/source/utils/asymptote/GUI/res/icons/plus-round.svg b/Build/source/utils/asymptote/GUI/res/icons/plus-round.svg
new file mode 100644
index 00000000000..465d937802b
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/plus-round.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="512px" height="512px" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
+<path d="M417.4,224H288V94.6c0-16.9-14.3-30.6-32-30.6c-17.7,0-32,13.7-32,30.6V224H94.6C77.7,224,64,238.3,64,256
+ c0,17.7,13.7,32,30.6,32H224v129.4c0,16.9,14.3,30.6,32,30.6c17.7,0,32-13.7,32-30.6V288h129.4c16.9,0,30.6-14.3,30.6-32
+ C448,238.3,434.3,224,417.4,224z"/>
+</svg>
diff --git a/Build/source/utils/asymptote/GUI/res/icons/save.svg b/Build/source/utils/asymptote/GUI/res/icons/save.svg
new file mode 100644
index 00000000000..2d2823d3919
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/save.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Save" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 20 20" enable-background="new 0 0 20 20" xml:space="preserve">
+<path d="M15.173,2H4C2.899,2,2,2.9,2,4v12c0,1.1,0.899,2,2,2h12c1.101,0,2-0.9,2-2V5.127L15.173,2z M14,8c0,0.549-0.45,1-1,1H7
+ C6.45,9,6,8.549,6,8V3h8V8z M13,4h-2v4h2V4z"/>
+</svg>
diff --git a/Build/source/utils/asymptote/GUI/res/icons/social-python.svg b/Build/source/utils/asymptote/GUI/res/icons/social-python.svg
new file mode 100644
index 00000000000..35fcdde7c10
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/social-python.svg
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="512px" height="512px" viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
+<g>
+ <path d="M193.46,249.056c3.723-0.67,7.589-1.041,11.586-1.041L201.924,248h103.823c4.503,0,8.806-0.617,12.908-1.754
+ c19.37-5.363,33.345-22.537,33.345-43.663v-30.822v-56.402c0-24.832-21.15-43.484-46.289-47.606
+ c-15.931-2.624-39.258-3.827-55.089-3.749c-15.829,0.086-30.981,1.404-44.277,3.749C167.143,74.576,160,88.928,160,115.359V144h96
+ v16H128.82c-35.628,0-64.538,42.571-64.813,95.242C64.005,255.495,64,255.747,64,256c0,9.523,0.94,18.72,2.685,27.404
+ C74.648,323.07,99.451,352,128.82,352H144v-2.662v-43.273C144,279.238,164.146,254.332,193.46,249.056z M203.656,127.002
+ c-9.592,0-17.384-7.785-17.384-17.403c0-9.664,7.774-17.52,17.384-17.52c9.574,0,17.399,7.855,17.399,17.52
+ C221.056,119.217,213.246,127.002,203.656,127.002z"/>
+ <path d="M443.951,222.543C434.78,186.021,411.033,160,383.18,160H368v2.626v38.046c0,33.915-22.286,58.474-49.489,62.681
+ c-2.737,0.424-5.483,0.646-8.301,0.646H206.351c-4.518,0-8.904,0.584-13.049,1.672C174.18,270.689,160,286.6,160,307.236v32.922
+ v54.305c0,24.832,24.977,39.426,49.481,46.551c29.327,8.531,61.267,10.068,96.366,0C329.15,434.354,352,420.893,352,394.463V368
+ h-96v-16h127.18c25.24,0,47.107-21.365,57.814-52.549C445.474,286.404,448,271.641,448,256
+ C448,244.232,446.567,232.962,443.951,222.543z M307.867,382.82c9.59,0,17.381,7.785,17.381,17.4
+ c0,9.65-7.791,17.521-17.381,17.521c-9.577,0-17.399-7.871-17.399-17.521C290.468,390.59,298.274,382.82,307.867,382.82z"/>
+</g>
+</svg>
diff --git a/Build/source/utils/asymptote/GUI/res/icons/subdirectory-left.svg b/Build/source/utils/asymptote/GUI/res/icons/subdirectory-left.svg
new file mode 100644
index 00000000000..bbbf3336529
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/subdirectory-left.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M18 12v1H8v5l-6-6 6-6v5h8V2h2z"/></svg> \ No newline at end of file
diff --git a/Build/source/utils/asymptote/GUI/res/icons/text.svg b/Build/source/utils/asymptote/GUI/res/icons/text.svg
new file mode 100644
index 00000000000..7a4ffb4c0d2
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/text.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 8 8">
+ <path d="M0 0v2h.5c0-.55.45-1 1-1h1.5v5.5c0 .28-.22.5-.5.5h-.5v1h4v-1h-.5c-.28 0-.5-.22-.5-.5v-5.5h1.5c.55 0 1 .45 1 1h.5v-2h-8z" />
+</svg> \ No newline at end of file
diff --git a/Build/source/utils/asymptote/GUI/res/icons/triangle-stroked-15.svg b/Build/source/utils/asymptote/GUI/res/icons/triangle-stroked-15.svg
new file mode 100644
index 00000000000..c87ff1d223c
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/res/icons/triangle-stroked-15.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1"
+ id="svg4619" inkscape:version="0.91+devel+osxmenu r12911" sodipodi:docname="triangle-stroked-15.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="15px" height="15px"
+ viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve">
+<path id="rect3338" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccccccc" d="M7.5243,1.5004
+ C7.2429,1.4913,6.9787,1.6423,6.8336,1.8952l-5.5,9.8692C1.0218,12.3078,1.395,12.9999,2,13h11
+ c0.605-0.0001,0.9782-0.6922,0.6664-1.2355l-5.5-9.8692C8.0302,1.6579,7.7884,1.5092,7.5243,1.5004z M7.5,3.8993l4.1267,7.4704
+ H3.3733L7.5,3.8993z"/>
+</svg>
diff --git a/Build/source/utils/asymptote/GUI/setup.py b/Build/source/utils/asymptote/GUI/setup.py
new file mode 100644
index 00000000000..d6a4c0d6a78
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/setup.py
@@ -0,0 +1,13 @@
+#!/usr/bin/env python3
+
+import xasyVersion
+from setuptools import setup
+
+setup(
+ name="xasy",
+ version=xasyVersion.xasyVersion,
+ author="Supakorn Rassameemasmuang, Orest Shardt, and John C. Bowman",
+ description="User interface for Asymptote, a vector graphics language",
+ url="http://asymptote.sourceforge.net",
+ download_url="https://sourceforge.net/projects/asymptote/"
+)
diff --git a/Build/source/utils/asymptote/GUI/windows/custMatTransform.ui b/Build/source/utils/asymptote/GUI/windows/custMatTransform.ui
new file mode 100644
index 00000000000..4612f277c94
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/windows/custMatTransform.ui
@@ -0,0 +1,356 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Dialog</class>
+ <widget class="QDialog" name="Dialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>500</width>
+ <height>320</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>500</width>
+ <height>320</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>500</width>
+ <height>320</height>
+ </size>
+ </property>
+ <property name="mouseTracking">
+ <bool>false</bool>
+ </property>
+ <property name="windowTitle">
+ <string>Set Custom Transformation</string>
+ </property>
+ <property name="windowIcon">
+ <iconset resource="../res/icons.qrc">
+ <normaloff>:/icons/android-expand.svg</normaloff>:/icons/android-expand.svg</iconset>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>true</bool>
+ </property>
+ <property name="modal">
+ <bool>false</bool>
+ </property>
+ <widget class="QFrame" name="centralFrame">
+ <property name="geometry">
+ <rect>
+ <x>20</x>
+ <y>20</y>
+ <width>461</width>
+ <height>271</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="baseSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <property name="spacing">
+ <number>4</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Transformation Matrix</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QFrame" name="gridFrame">
+ <property name="frameShape">
+ <enum>QFrame::Box</enum>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="1" column="0">
+ <widget class="QLineEdit" name="lineMat00">
+ <property name="maximumSize">
+ <size>
+ <width>70</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>1</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLineEdit" name="lineMat11">
+ <property name="maximumSize">
+ <size>
+ <width>70</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>1</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLineEdit" name="lineMat10">
+ <property name="maximumSize">
+ <size>
+ <width>70</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>0</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLineEdit" name="lineMat01">
+ <property name="maximumSize">
+ <size>
+ <width>70</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>0</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout_4">
+ <item>
+ <widget class="QLabel" name="label_3">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Translation</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QFrame" name="gridFrame_2">
+ <property name="frameShape">
+ <enum>QFrame::Box</enum>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_2">
+ <item row="2" column="1">
+ <widget class="QLineEdit" name="lineMatTy">
+ <property name="maximumSize">
+ <size>
+ <width>70</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>0</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLineEdit" name="lineMatTx">
+ <property name="maximumSize">
+ <size>
+ <width>70</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>0</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>Preview:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="imgPreview">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>150</width>
+ <height>150</height>
+ </size>
+ </property>
+ <property name="baseSize">
+ <size>
+ <width>300</width>
+ <height>300</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>Shows a red square if transformation determinant is negative.</string>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QLabel" name="lblAnchor">
+ <property name="text">
+ <string>Anchor: Top Left</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="lblCoordsMode">
+ <property name="text">
+ <string>Coordinates: Global</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnReset">
+ <property name="text">
+ <string>Reset</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnCancel">
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnAccept">
+ <property name="text">
+ <string>Accept</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ <resources>
+ <include location="../res/icons.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/Build/source/utils/asymptote/GUI/windows/labelTextEditor.ui b/Build/source/utils/asymptote/GUI/windows/labelTextEditor.ui
new file mode 100644
index 00000000000..06cd31bd1ae
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/windows/labelTextEditor.ui
@@ -0,0 +1,230 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Dialog</class>
+ <widget class="QDialog" name="Dialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>473</width>
+ <height>424</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Dialog</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QFrame" name="frame">
+ <property name="frameShape">
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <item>
+ <layout class="QGridLayout" name="gridLayout">
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <item row="0" column="2">
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="0" column="0">
+ <widget class="QCheckBox" name="chkMathMode">
+ <property name="text">
+ <string>Math Mode</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QComboBox" name="cmbMathStyle">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>0</height>
+ </size>
+ </property>
+ <item>
+ <property name="text">
+ <string>Inline Style</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Display Style</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Script Style</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QPlainTextEdit" name="txtLabelEdit"/>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout_4">
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Preview</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="lblLabelPreview">
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>100</height>
+ </size>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnGetText">
+ <property name="maximumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset resource="../res/icons.qrc">
+ <normaloff>:/icons/text.svg</normaloff>:/icons/text.svg</iconset>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnPreview">
+ <property name="maximumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset resource="../res/icons.qrc">
+ <normaloff>:/icons/eye.svg</normaloff>:/icons/eye.svg</iconset>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnCancel">
+ <property name="maximumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset resource="../res/icons.qrc">
+ <normaloff>:/icons/android-close.svg</normaloff>:/icons/android-close.svg</iconset>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnAccept">
+ <property name="maximumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset resource="../res/icons.qrc">
+ <normaloff>:/icons/android-done.svg</normaloff>:/icons/android-done.svg</iconset>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources>
+ <include location="../res/icons.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/Build/source/utils/asymptote/GUI/windows/setCustomAnchor.ui b/Build/source/utils/asymptote/GUI/windows/setCustomAnchor.ui
new file mode 100644
index 00000000000..5a4b14676e6
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/windows/setCustomAnchor.ui
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Dialog</class>
+ <widget class="QDialog" name="Dialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>245</width>
+ <height>161</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Set Custom Anchor</string>
+ </property>
+ <widget class="QWidget" name="verticalLayoutWidget">
+ <property name="geometry">
+ <rect>
+ <x>20</x>
+ <y>20</y>
+ <width>201</width>
+ <height>121</height>
+ </rect>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <layout class="QFormLayout" name="formLayout">
+ <property name="fieldGrowthPolicy">
+ <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
+ </property>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>X:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLineEdit" name="lineEditX">
+ <property name="text">
+ <string>0</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>Y:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLineEdit" name="lineEditY">
+ <property name="text">
+ <string>0</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::Reset</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>Dialog</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>248</x>
+ <y>254</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>157</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>Dialog</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>316</x>
+ <y>260</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>286</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/Build/source/utils/asymptote/GUI/windows/widg_addLabel.ui b/Build/source/utils/asymptote/GUI/windows/widg_addLabel.ui
new file mode 100644
index 00000000000..40bc4ddc602
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/windows/widg_addLabel.ui
@@ -0,0 +1,287 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Form</class>
+ <widget class="QWidget" name="Form">
+ <property name="windowModality">
+ <enum>Qt::NonModal</enum>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>599</width>
+ <height>35</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>35</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16777215</width>
+ <height>35</height>
+ </size>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QLineEdit" name="txtLabelText">
+ <property name="toolTip">
+ <string>Number of Sides</string>
+ </property>
+ <property name="placeholderText">
+ <string>Text</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnAdvancedEdit">
+ <property name="maximumSize">
+ <size>
+ <width>25</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/icons/edit.svg</normaloff>:/icons/edit.svg</iconset>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Align</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="cmbAlign">
+ <item>
+ <property name="text">
+ <string>Center</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>N</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>E</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>W</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>S</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>NW</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>NE</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>SW</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>SE</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Custom</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_3">
+ <property name="text">
+ <string>Font Size</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="cmbFontSize">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="editable">
+ <bool>true</bool>
+ </property>
+ <item>
+ <property name="text">
+ <string>-</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>8</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>9</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>10</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>11</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>12</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>14</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>18</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>24</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>48</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>72</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>Custom Align</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="txtShiftX">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>50</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="placeholderText">
+ <string>Shift X</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="txtShiftY">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>50</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="placeholderText">
+ <string>Shift Y</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <resources>
+ <include location="../res/icons.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/Build/source/utils/asymptote/GUI/windows/widg_addPolyOpt.ui b/Build/source/utils/asymptote/GUI/windows/widg_addPolyOpt.ui
new file mode 100644
index 00000000000..b8bde4236a9
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/windows/widg_addPolyOpt.ui
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Form</class>
+ <widget class="QWidget" name="Form">
+ <property name="windowModality">
+ <enum>Qt::NonModal</enum>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>326</width>
+ <height>35</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>35</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16777215</width>
+ <height>35</height>
+ </size>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QCheckBox" name="chkInscribed">
+ <property name="text">
+ <string>Start at Vertex</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="txtSides">
+ <property name="toolTip">
+ <string>Number of Sides</string>
+ </property>
+ <property name="placeholderText">
+ <string>Sides</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/Build/source/utils/asymptote/GUI/windows/widg_editBezier.ui b/Build/source/utils/asymptote/GUI/windows/widg_editBezier.ui
new file mode 100644
index 00000000000..cca3aaaa2d9
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/windows/widg_editBezier.ui
@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Form</class>
+ <widget class="QWidget" name="Form">
+ <property name="windowModality">
+ <enum>Qt::NonModal</enum>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>692</width>
+ <height>35</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>35</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16777215</width>
+ <height>35</height>
+ </size>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QComboBox" name="cmbLockMode">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="currentIndex">
+ <number>1</number>
+ </property>
+ <item>
+ <property name="text">
+ <string>No Lock</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Lock Angle</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Lock Angle &amp; Scale</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="chkRecompute">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Recompute Path</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnForceRecompute">
+ <property name="text">
+ <string>Recompute Once</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnOk">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>25</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="icon">
+ <iconset resource="../res/icons.qrc">
+ <normaloff>:/icons/check.svg</normaloff>:/icons/check.svg</iconset>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnCancel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>25</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="icon">
+ <iconset resource="../res/icons.qrc">
+ <normaloff>:/icons/close-round.svg</normaloff>:/icons/close-round.svg</iconset>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <resources>
+ <include location="../res/icons.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/Build/source/utils/asymptote/GUI/windows/widgetPointEditor.ui b/Build/source/utils/asymptote/GUI/windows/widgetPointEditor.ui
new file mode 100644
index 00000000000..c3e486ad5a6
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/windows/widgetPointEditor.ui
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Form</class>
+ <widget class="QWidget" name="Form">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>324</width>
+ <height>67</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QLabel" name="nameLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Left Control Point</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QLineEdit" name="lineXorA">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="toolTip">
+ <string>X</string>
+ </property>
+ <property name="readOnly">
+ <bool>false</bool>
+ </property>
+ <property name="placeholderText">
+ <string>X</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="lineYorM">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="toolTip">
+ <string>X</string>
+ </property>
+ <property name="autoFillBackground">
+ <bool>false</bool>
+ </property>
+ <property name="readOnly">
+ <bool>false</bool>
+ </property>
+ <property name="placeholderText">
+ <string>Y</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnRelative">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset resource="../res/icons.qrc">
+ <normaloff>:/icons/android-locate.svg</normaloff>:/icons/android-locate.svg</iconset>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="flat">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnPolar">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset resource="../res/icons.qrc">
+ <normaloff>:/icons/android-radio-button-off.svg</normaloff>:/icons/android-radio-button-off.svg</iconset>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="flat">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnManualAdj">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset resource="../res/icons.qrc">
+ <normaloff>:/icons/edit.svg</normaloff>:/icons/edit.svg</iconset>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="flat">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <resources>
+ <include location="../res/icons.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/Build/source/utils/asymptote/GUI/windows/window1.ui b/Build/source/utils/asymptote/GUI/windows/window1.ui
new file mode 100644
index 00000000000..bbe474bab17
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/windows/window1.ui
@@ -0,0 +1,2000 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>1030</width>
+ <height>768</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>xasy</string>
+ </property>
+ <widget class="QWidget" name="centralwidget">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="mouseTracking">
+ <bool>true</bool>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_4">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QWidget" name="mainWidget" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="mouseTracking">
+ <bool>true</bool>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <property name="spacing">
+ <number>4</number>
+ </property>
+ <property name="leftMargin">
+ <number>2</number>
+ </property>
+ <property name="topMargin">
+ <number>2</number>
+ </property>
+ <property name="rightMargin">
+ <number>2</number>
+ </property>
+ <property name="bottomMargin">
+ <number>2</number>
+ </property>
+ <item>
+ <widget class="QFrame" name="menuFrame">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="spacing">
+ <number>4</number>
+ </property>
+ <property name="sizeConstraint">
+ <enum>QLayout::SetMinimumSize</enum>
+ </property>
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QPushButton" name="btnUndo">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>25</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="baseSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>Undo</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/icons/android-arrow-back.svg</normaloff>:/icons/android-arrow-back.svg</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnRedo">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>25</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="baseSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>Redo</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/icons/android-arrow-forward.svg</normaloff>:/icons/android-arrow-forward.svg</iconset>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnLoadFile">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>25</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="baseSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Open file&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/icons/android-folder-open.svg</normaloff>:/icons/android-folder-open.svg</iconset>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnSave">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>25</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="baseSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Save file&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/icons/save.svg</normaloff>:/icons/save.svg</iconset>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnViewCode">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>25</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="baseSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Edit code&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/icons/code.svg</normaloff>:/icons/code.svg</iconset>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnQuickScreenshot">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>25</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="baseSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Screenshot&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/icons/android-camera.svg</normaloff>:/icons/android-camera.svg</iconset>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Minimum</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnDrawAxes">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>25</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="baseSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="font">
+ <font>
+ <family>Roboto</family>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="toolTip">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Toggle display axes&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/icons/plus-round.svg</normaloff>:/icons/plus-round.svg</iconset>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnDrawGrid">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>25</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="baseSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="font">
+ <font>
+ <family>Roboto</family>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="toolTip">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Toggle grid&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/icons/grid.svg</normaloff>:/icons/grid.svg</iconset>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="checked">
+ <bool>false</bool>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnSetZoom">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>25</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="baseSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>Synchronize with Asymptote</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/icons/magnifying-glass.svg</normaloff>:/icons/magnifying-glass.svg</iconset>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnPanCenter">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>25</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="baseSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Center&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/icons/center.svg</normaloff>:/icons/center.svg</iconset>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnResetPan">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>25</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="baseSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Center about origin&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/icons/centerorigin.svg</normaloff>:/icons/centerorigin.svg</iconset>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnAlignX">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>25</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="baseSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="font">
+ <font>
+ <family>Roboto</family>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="toolTip">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Lock transform to X axis&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string>X</string>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnAlignY">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>25</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="baseSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="toolTip">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Lock transform to Y axis&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string>Y</string>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_6">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Minimum</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnSelectEdit">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>25</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Bézier editor&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/icons/edit.svg</normaloff>:/icons/edit.svg</iconset>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnDeleteMode">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>25</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="baseSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Delete&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/icons/android-delete.svg</normaloff>:/icons/android-delete.svg</iconset>
+ </property>
+ <property name="checkable">
+ <bool>false</bool>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_5">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Minimum</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnPan">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>25</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="baseSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>Pan</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/icons/android-hand.svg</normaloff>:/icons/android-hand.svg</iconset>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnTranslate">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>25</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="baseSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>Translate</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/icons/arrow-move.svg</normaloff>:/icons/arrow-move.svg</iconset>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnScale">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>25</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="baseSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>Scale</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/icons/arrow-resize.svg</normaloff>:/icons/arrow-resize.svg</iconset>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnRotate">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>25</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="baseSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>Rotate</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/icons/android-refresh.svg</normaloff>:/icons/android-refresh.svg</iconset>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_4">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Minimum</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnAnchor">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>25</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="baseSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Set custom anchor&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/icons/anchor.svg</normaloff>:/icons/anchor.svg</iconset>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="checked">
+ <bool>false</bool>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="comboAnchor">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>127</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>127</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Anchor&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="layoutDirection">
+ <enum>Qt::LeftToRight</enum>
+ </property>
+ <property name="editable">
+ <bool>false</bool>
+ </property>
+ <property name="currentText">
+ <string>Origin</string>
+ </property>
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <property name="insertPolicy">
+ <enum>QComboBox::InsertAtCurrent</enum>
+ </property>
+ <property name="sizeAdjustPolicy">
+ <enum>QComboBox::AdjustToContentsOnFirstShow</enum>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="duplicatesEnabled">
+ <bool>false</bool>
+ </property>
+ <property name="frame">
+ <bool>false</bool>
+ </property>
+ <property name="modelColumn">
+ <number>0</number>
+ </property>
+ <item>
+ <property name="text">
+ <string>Origin</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Center</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Top Left</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Top Right</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Bottom Right</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Bottom Left</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Custom</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnToggleVisible">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>25</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="baseSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/icons/eye.svg</normaloff>:/icons/eye.svg</iconset>
+ </property>
+ <property name="checkable">
+ <bool>false</bool>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnCustTransform">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>25</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="baseSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/icons/android-expand.svg</normaloff>:/icons/android-expand.svg</iconset>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnSendBackwards">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>25</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="baseSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/icons/chevron-with-circle-left.svg</normaloff>:/icons/chevron-with-circle-left.svg</iconset>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnSendForwards">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>25</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="baseSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>Translate</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/icons/chevron-with-circle-right.svg</normaloff>:/icons/chevron-with-circle-right.svg</iconset>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>25</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ <zorder>btnUndo</zorder>
+ <zorder>btnRedo</zorder>
+ <zorder>btnLoadFile</zorder>
+ <zorder>btnSave</zorder>
+ <zorder>btnViewCode</zorder>
+ <zorder>btnQuickScreenshot</zorder>
+ <zorder>btnDrawAxes</zorder>
+ <zorder>btnDrawGrid</zorder>
+ <zorder>btnSetZoom</zorder>
+ <zorder>btnPanCenter</zorder>
+ <zorder>btnResetPan</zorder>
+ <zorder>btnAlignX</zorder>
+ <zorder>btnAlignY</zorder>
+ <zorder>btnPan</zorder>
+ <zorder>btnTranslate</zorder>
+ <zorder>btnScale</zorder>
+ <zorder>btnCustTransform</zorder>
+ <zorder>btnSendBackwards</zorder>
+ <zorder>btnSendForwards</zorder>
+ <zorder>comboAnchor</zorder>
+ <zorder>btnToggleVisible</zorder>
+ <zorder>btnAnchor</zorder>
+ <zorder>btnRotate</zorder>
+ <zorder>btnSelectEdit</zorder>
+ <zorder>btnDeleteMode</zorder>
+ <zorder>horizontalSpacer_4</zorder>
+ <zorder>horizontalSpacer_5</zorder>
+ <zorder>horizontalSpacer_6</zorder>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <property name="spacing">
+ <number>4</number>
+ </property>
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <property name="spacing">
+ <number>3</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" name="addOption">
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <property name="sizeConstraint">
+ <enum>QLayout::SetDefaultConstraint</enum>
+ </property>
+ <property name="leftMargin">
+ <number>6</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QPushButton" name="btnFill">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="baseSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Toggle fill/outline&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="autoFillBackground">
+ <bool>false</bool>
+ </property>
+ <property name="styleSheet">
+ <string notr="true"/>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/icons/bucket.svg</normaloff>
+ <normalon>:/icons/filledbucket.svg</normalon>:/icons/bucket.svg</iconset>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>false</bool>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QGridLayout" name="addOptionLayout"/>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_7">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::MinimumExpanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>35</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Line Width:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="txtLineWidth">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>75</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Current pen width&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QFrame" name="frameCurrColor">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>15</width>
+ <height>15</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Current pen color&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="autoFillBackground">
+ <bool>false</bool>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">QFrame{
+padding: 4.0;
+border-radius: 3.0;
+background: rgb(0, 0, 0)
+}</string>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Sunken</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnSelectColor">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>25</width>
+ <height>25</height>
+ </size>
+ </property>
+ <property name="baseSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Set color&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="autoFillBackground">
+ <bool>false</bool>
+ </property>
+ <property name="styleSheet">
+ <string notr="true"/>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/icons/android-color-palette.svg</normaloff>:/icons/android-color-palette.svg</iconset>
+ </property>
+ <property name="default">
+ <bool>false</bool>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_7">
+ <property name="topMargin">
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QFrame" name="formFrame">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth">
+ <number>0</number>
+ </property>
+ <layout class="QFormLayout" name="formLayout">
+ <property name="horizontalSpacing">
+ <number>0</number>
+ </property>
+ <property name="verticalSpacing">
+ <number>0</number>
+ </property>
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item row="4" column="0">
+ <widget class="QPushButton" name="btnOpenPoly">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Open polygon&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/icons/openpolygon.svg</normaloff>:/icons/openpolygon.svg</iconset>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0">
+ <widget class="QPushButton" name="btnClosedPoly">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Closed polygon&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/icons/closedpolygon.svg</normaloff>:/icons/closedpolygon.svg</iconset>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="0">
+ <widget class="QPushButton" name="btnOpenCurve">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Open Bézier curve&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/icons/opencurve.svg</normaloff>:/icons/opencurve.svg</iconset>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="0">
+ <widget class="QPushButton" name="btnClosedCurve">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Closed Bézier curve&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/icons/closedcurve.svg</normaloff>:/icons/closedcurve.svg</iconset>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="0">
+ <widget class="QPushButton" name="btnAddPoly">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Regular polygon&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/icons/triangle-stroked-15.svg</normaloff>:/icons/triangle-stroked-15.svg</iconset>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="10" column="0">
+ <widget class="QPushButton" name="btnAddCircle">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Circle&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/icons/circle.svg</normaloff>:/icons/circle.svg</iconset>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="11" column="0">
+ <widget class="QPushButton" name="btnAddLabel">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Text&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/icons/text.svg</normaloff>:/icons/text.svg</iconset>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QFrame" name="imgFrame">
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>6</height>
+ </size>
+ </property>
+ <property name="mouseTracking">
+ <bool>true</bool>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <item row="0" column="1">
+ <widget class="QLabel" name="imgLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="mouseTracking">
+ <bool>true</bool>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <property name="sizeConstraint">
+ <enum>QLayout::SetDefaultConstraint</enum>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QPushButton" name="btnTogglePython">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/icons/social-python.svg</normaloff>:/icons/social-python.svg</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="txtTerminalPrompt">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="btnEnterCommand">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/icons/subdirectory-left.svg</normaloff>:/icons/subdirectory-left.svg</iconset>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QMenuBar" name="menubar">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>1030</width>
+ <height>28</height>
+ </rect>
+ </property>
+ <widget class="QMenu" name="menuFIle">
+ <property name="title">
+ <string>&amp;File</string>
+ </property>
+ <addaction name="actionOpen"/>
+ <addaction name="actionSave"/>
+ <addaction name="actionSaveAs"/>
+ <addaction name="actionExportAsymptote"/>
+ <addaction name="separator"/>
+ <addaction name="actionQuit"/>
+ </widget>
+ <widget class="QMenu" name="menuEdit">
+ <property name="title">
+ <string>&amp;Edit</string>
+ </property>
+ <addaction name="actionUndo"/>
+ <addaction name="actionRedo"/>
+ <addaction name="separator"/>
+ </widget>
+ <widget class="QMenu" name="menuOptions">
+ <property name="title">
+ <string>Optio&amp;ns</string>
+ </property>
+ <addaction name="actionSettings"/>
+ </widget>
+ <widget class="QMenu" name="menuHelp">
+ <property name="title">
+ <string>&amp;Help</string>
+ </property>
+ <addaction name="actionManual"/>
+ <addaction name="actionAbout"/>
+ </widget>
+ <widget class="QMenu" name="menuTools">
+ <property name="title">
+ <string>&amp;Tools</string>
+ </property>
+ <addaction name="actionEnterCommand"/>
+ </widget>
+ <addaction name="menuFIle"/>
+ <addaction name="menuEdit"/>
+ <addaction name="menuOptions"/>
+ <addaction name="menuTools"/>
+ <addaction name="menuHelp"/>
+ </widget>
+ <widget class="QStatusBar" name="statusbar">
+ <property name="sizeGripEnabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <action name="actionAbout">
+ <property name="text">
+ <string>&amp;About</string>
+ </property>
+ </action>
+ <action name="actionManual">
+ <property name="text">
+ <string>&amp;Manual</string>
+ </property>
+ </action>
+ <action name="actionSettings">
+ <property name="text">
+ <string>&amp;Settings</string>
+ </property>
+ </action>
+ <action name="actionPause">
+ <property name="text">
+ <string>Pause </string>
+ </property>
+ </action>
+ <action name="actionSaveAs">
+ <property name="text">
+ <string>&amp;Save As</string>
+ </property>
+ </action>
+ <action name="actionEnterCommand">
+ <property name="text">
+ <string>&amp;Enter Command</string>
+ </property>
+ </action>
+ <action name="actionQuit">
+ <property name="text">
+ <string>&amp;Quit</string>
+ </property>
+ </action>
+ <action name="actionUndo">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>&amp;Undo</string>
+ </property>
+ </action>
+ <action name="actionRedo">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>&amp;Redo</string>
+ </property>
+ </action>
+ <action name="actionShow_Grid">
+ <property name="text">
+ <string>&amp;Show Grid</string>
+ </property>
+ </action>
+ <action name="actionShow_Local_Grid">
+ <property name="text">
+ <string>Show &amp;Local Grid</string>
+ </property>
+ </action>
+ <action name="actionTransform">
+ <property name="text">
+ <string>&amp;Transform</string>
+ </property>
+ </action>
+ <action name="actionExportAsymptote">
+ <property name="text">
+ <string>Export</string>
+ </property>
+ </action>
+ <action name="actionSave">
+ <property name="text">
+ <string>Save</string>
+ </property>
+ </action>
+ <action name="actionOpen">
+ <property name="text">
+ <string>Open</string>
+ </property>
+ </action>
+ </widget>
+ <layoutdefault spacing="6" margin="9"/>
+ <resources>
+ <include location="../res/icons.qrc"/>
+ </resources>
+ <connections/>
+ <designerdata>
+ <property name="gridDeltaX">
+ <number>10</number>
+ </property>
+ <property name="gridDeltaY">
+ <number>10</number>
+ </property>
+ <property name="gridSnapX">
+ <bool>true</bool>
+ </property>
+ <property name="gridSnapY">
+ <bool>true</bool>
+ </property>
+ <property name="gridVisible">
+ <bool>true</bool>
+ </property>
+ </designerdata>
+</ui>
diff --git a/Build/source/utils/asymptote/GUI/xasy.py b/Build/source/utils/asymptote/GUI/xasy.py
index f160404c19a..7e38f73a2aa 100755
--- a/Build/source/utils/asymptote/GUI/xasy.py
+++ b/Build/source/utils/asymptote/GUI/xasy.py
@@ -1,38 +1,16 @@
-#!/usr/bin/env python
-###########################################################################
-#
-# xasy implements a graphical interface for Asymptote.
-#
-#
-# Author: Orest Shardt
-# Created: June 29, 2007
-#
-############################################################################
+#!/usr/bin/env python3
-import getopt,sys,signal
-import xasyMainWin
-if sys.version_info >= (3, 0):
- from tkinter import *
-else:
- from Tkinter import *
+import sys
+import PyQt5.QtWidgets as Qw
+from Window1 import MainWindow1
-signal.signal(signal.SIGINT,signal.SIG_IGN)
-root = Tk()
-mag = 1.0
-try:
- opts,args = getopt.getopt(sys.argv[1:],"x:")
- if(len(opts)>=1):
- mag = float(opts[0][1])
-except:
- print ("Invalid arguments.")
- print ("Usage: xasy.py [-x magnification] [filename]")
- sys.exit(1)
-if(mag <= 0.0):
- print ("Magnification must be positive.")
- sys.exit(1)
-if(len(args)>=1):
- app = xasyMainWin.xasyMainWin(root,args[0],mag)
-else:
- app = xasyMainWin.xasyMainWin(root,magnification=mag)
-root.mainloop()
+def main(args):
+ qtApp = Qw.QApplication(args)
+ mainWin1 = MainWindow1()
+ mainWin1.show()
+ return qtApp.exec_()
+
+
+if __name__ == '__main__':
+ sys.exit(main(sys.argv) or 0)
diff --git a/Build/source/utils/asymptote/GUI/xasy2asy.py b/Build/source/utils/asymptote/GUI/xasy2asy.py
index 06c0dbd7f54..2df6c3417a0 100755
--- a/Build/source/utils/asymptote/GUI/xasy2asy.py
+++ b/Build/source/utils/asymptote/GUI/xasy2asy.py
@@ -1,766 +1,1407 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
+
###########################################################################
#
# xasy2asy provides a Python interface to Asymptote
#
#
-# Author: Orest Shardt
-# Created: June 29, 2007
+# Authors: Orest Shardt, Supakorn Rassameemasmuang, and John C. Bowman
#
###########################################################################
-import sys,os,signal,threading
-from subprocess import *
-from string import *
-import xasyOptions
-from tempfile import mkdtemp
-
-if sys.version_info >= (3, 0):
- from tkinter import *
- import queue
-else:
- from Tkinter import *
- import Queue as queue
-
-# PIL support is now mandatory due to rotations
-try:
- from PIL import ImageTk
- from PIL import Image
-except:
- pass
-
-import CubicBezier
-
-quickAsyFailed = True
-global AsyTempDir
-
-console=None
-
-def startQuickAsy():
- global quickAsy
- global quickAsyFailed
- global AsyTempDir
- global fout,fin
- if quickAsyRunning():
- return
- try:
- fout.close()
- quickAsy.wait()
- except:
- pass
- try:
- quickAsyFailed = False
- if os.name == "nt":
- AsyTempDir=mkdtemp(prefix="asy_", dir="./")
- else:
- AsyTempDir=mkdtemp(prefix="asy_")+os.sep
- if sys.platform[:3] == 'win':
- quickAsy=Popen([xasyOptions.options['asyPath'],"-noV","-multiline","-q",
- "-o"+AsyTempDir,"-inpipe=0","-outpipe=2"],stdin=PIPE,
- stderr=PIPE,universal_newlines=True)
- fout=quickAsy.stdin
- fin=quickAsy.stderr
- else:
- (rx,wx) = os.pipe()
- (ra,wa) = os.pipe()
- if sys.version_info >= (3, 4):
- os.set_inheritable(rx, True)
- os.set_inheritable(wx, True)
- os.set_inheritable(ra, True)
- os.set_inheritable(wa, True)
- quickAsy=Popen([xasyOptions.options['asyPath'],"-noV","-multiline","-q",
- "-o"+AsyTempDir,"-inpipe="+str(rx),"-outpipe="+str(wa)],
- close_fds=False)
- fout=os.fdopen(wx,'w')
- fin=os.fdopen(ra,'r')
- if quickAsy.returncode != None:
- quickAsyFailed = True
- except:
- quickAsyFailed = True
-
-def stopQuickAsy():
- if quickAsyRunning():
- fout.write("exit;\n");
-
-def getAsyTempDir():
- return AsyTempDir
-
-def quickAsyRunning():
- if quickAsyFailed or quickAsy.returncode != None:
- return False
- else:
- return True
-
-def asyExecute(command):
- if not quickAsyRunning():
- startQuickAsy()
- fout.write(command)
-
-def closeConsole(event):
- global console
- console = None
-
-def consoleOutput(line):
- global console
- global ctl
- if console == None:
- ctl=Toplevel()
- ctl.title("Asymptote Console")
- ctl.bind("<Destroy>",closeConsole)
- yscrollbar=Scrollbar(ctl)
- yscrollbar.pack(side=RIGHT,fill=Y)
- console=Text(ctl,yscrollcommand=yscrollbar.set)
- console.pack()
- yscrollbar.config(command=console.yview)
- console.insert(END,line)
- ctl.lift()
-
-class asyTransform:
- """A python implementation of an asy transform"""
- def __init__(self,initTuple,delete=False):
- """Initialize the transform with a 6 entry tuple"""
- if type(initTuple) == type((0,)) and len(initTuple) == 6:
- self.t = initTuple
- self.x,self.y,self.xx,self.xy,self.yx,self.yy = initTuple
- self.deleted = delete
- else:
- raise Exception("Illegal initializer for asyTransform")
-
- def getCode(self):
- """Obtain the asy code that represents this transform"""
- if self.deleted:
- return str(self.t) + ", false"
- else:
- return str(self.t)
-
- def scale(self,s):
- return asyTransform((0,0,s,0,0,s))*self
-
- def __str__(self):
- """Equivalent functionality to getCode(). It allows the expression str(asyTransform) to be meaningful."""
- return self.getCode()
-
- def __mul__(self,other):
- """Define multiplication of transforms as composition."""
- if type(other)==type((0,)):
- if len(other) == 6:
- return self*asyTransform(other)
- elif len(other) == 2:
- return ((self.t[0]+self.t[2]*other[0]+self.t[3]*other[1]),(self.t[1]+self.t[4]*other[0]+self.t[5]*other[1]))
- else:
- raise Exception("Illegal multiplier of {:s}".format(str(type(other))))
- elif isinstance(other,asyTransform):
- result = asyTransform((0,0,0,0,0,0))
- result.x = self.x+self.xx*other.x+self.xy*other.y
- result.y = self.y+self.yx*other.x+self.yy*other.y
- result.xx = self.xx*other.xx+self.xy*other.yx
- result.xy = self.xx*other.xy+self.xy*other.yy
- result.yx = self.yx*other.xx+self.yy*other.yx
- result.yy = self.yx*other.xy+self.yy*other.yy
- result.t = (result.x,result.y,result.xx,result.xy,result.yx,result.yy)
- return result
- else:
- raise Exception("Illegal multiplier of {:s}".format(str(type(other))))
+
+import PyQt5.QtWidgets as Qw
+import PyQt5.QtGui as Qg
+import PyQt5.QtCore as Qc
+import PyQt5.QtSvg as Qs
+
+import numpy as np
+
+import sys
+import os
+import signal
+import threading
+import string
+import subprocess
+import tempfile
+import re
+import shutil
+import copy
+import queue
+import io
+import atexit
+import DebugFlags
+
+import xasyUtils as xu
+import xasyArgs as xa
+import xasyOptions as xo
+import xasySvg as xs
+
+class AsymptoteEngine:
+ xasy=chr(4)+"\n"
+
+ def __init__(self, path=None, keepFiles=DebugFlags.keepFiles, keepDefaultArgs=True):
+ if path is None:
+ path = xa.getArgs().asypath
+ if path is None:
+ opt = xo.BasicConfigs.defaultOpt
+ opt.load()
+ path = opt['asyPath']
+
+ if sys.platform[:3] == 'win':
+ rx = 0 # stdin
+ wa = 2 # stderr
+ else:
+ rx, wx = os.pipe()
+ ra, wa = os.pipe()
+ os.set_inheritable(rx, True)
+ os.set_inheritable(wx, True)
+ os.set_inheritable(ra, True)
+ os.set_inheritable(wa, True)
+ self.ostream = os.fdopen(wx, 'w')
+ self.istream = os.fdopen(ra, 'r')
+
+ self.keepFiles = keepFiles
+ if sys.platform[:3] == 'win':
+ self.tmpdir = tempfile.mkdtemp(prefix='xasyData_',dir='./')+'/'
+ else:
+ self.tmpdir = tempfile.mkdtemp(prefix='xasyData_')+os.sep
+
+ self.args=['-xasy', '-noV', '-q', '-inpipe=' + str(rx), '-outpipe=' + str(wa), '-o', self.tmpdir]
+
+ self.asyPath = path
+ self.asyProcess = None
+
+ def start(self):
+ try:
+ if sys.platform[:3] == 'win':
+ self.asyProcess = subprocess.Popen([self.asyPath] + self.args,
+ stdin=subprocess.PIPE, stderr=subprocess.PIPE,
+ universal_newlines=True)
+ self.ostream = self.asyProcess.stdin
+ self.istream = self.asyProcess.stderr
+ else:
+ self.asyProcess = subprocess.Popen([self.asyPath] + self.args,close_fds=False)
+ finally:
+ atexit.register(self.cleanup)
+
+ def wait(self):
+ if self.asyProcess.returncode is not None:
+ return
+ else:
+ return self.asyProcess.wait()
+
+ def __enter__(self):
+ self.start()
+ return self
+
+ def __exit__(self, exc_type, exc_val, exc_tb):
+ self.stop()
+ self.wait()
+
+ @property
+ def tempDirName(self):
+ return self.tmpdir
+
+ def startThenStop(self):
+ self.start()
+ self.stop()
+ self.wait()
+
+ @property
+ def active(self):
+ if self.asyProcess is None:
+ return False
+ return self.asyProcess.returncode is None
+
+ def stop(self):
+ if self.active:
+ self.asyProcess.kill()
+
+ def cleanup(self):
+ self.stop()
+ if self.asyProcess is not None:
+ self.asyProcess.wait()
+ if not self.keepFiles:
+ if os.path.isdir(self.tempDirName + os.sep):
+ shutil.rmtree(self.tempDirName, ignore_errors=True)
+
+class asyTransform(Qc.QObject):
+ """A python implementation of an asy transform"""
+
+ def __init__(self, initTuple, delete=False):
+ """Initialize the transform with a 6 entry tuple"""
+ super().__init__()
+ if isinstance(initTuple, (tuple, list)) and len(initTuple) == 6:
+ self.t = initTuple
+ self.x, self.y, self.xx, self.xy, self.yx, self.yy = initTuple
+ self._deleted = delete
+ else:
+ raise TypeError("Illegal initializer for asyTransform")
+
+ @property
+ def deleted(self):
+ return self._deleted
+
+ @deleted.setter
+ def deleted(self, value):
+ self._deleted = value
+
+ @classmethod
+ def zero(cls):
+ return asyTransform((0, 0, 0, 0, 0, 0))
+
+ @classmethod
+ def fromQTransform(cls, transform: Qg.QTransform):
+ tx, ty = transform.dx(), transform.dy()
+ xx, xy, yx, yy = transform.m11(), transform.m21(), transform.m12(), transform.m22()
+
+ return asyTransform((tx, ty, xx, xy, yx, yy))
+
+ @classmethod
+ def fromNumpyMatrix(cls, transform: np.ndarray):
+ assert transform.shape == (3, 3)
+
+ tx = transform[0, 2]
+ ty = transform[1, 2]
+
+ xx, xy, yx, yy = transform[0:2, 0:2].ravel().tolist()[0]
+
+ return asyTransform((tx, ty, xx, xy, yx, yy))
+
+ def getRawCode(self):
+ return xu.tuple2StrWOspaces(self.t)
+
+ def getCode(self, asy2psmap=None):
+ """Obtain the asy code that represents this transform"""
+ if asy2psmap is None:
+ asy2psmap = asyTransform((0, 0, 1, 0, 0, 1))
+ if self.deleted:
+ return 'zeroTransform'
+ else:
+ return (asy2psmap.inverted() * self * asy2psmap).getRawCode()
+
+ def scale(self, s):
+ return asyTransform((0, 0, s, 0, 0, s)) * self
+
+ def toQTransform(self):
+ return Qg.QTransform(self.xx, self.yx, self.xy, self.yy, self.x, self.y)
+
+ def __str__(self):
+ """Equivalent functionality to getCode(). It allows the expression str(asyTransform) to be meaningful."""
+ return self.getCode()
+
+ def isIdentity(self):
+ return self == identity()
+
+ def inverted(self):
+ return asyTransform.fromQTransform(self.toQTransform().inverted()[0])
+
+ def __eq__(self, other):
+ return list(self.t) == list(other.t)
+
+ def __mul__(self, other):
+ """Define multiplication of transforms as composition."""
+ if isinstance(other, tuple):
+ if len(other) == 6:
+ return self * asyTransform(other)
+ elif len(other) == 2:
+ return ((self.t[0] + self.t[2] * other[0] + self.t[3] * other[1]),
+ (self.t[1] + self.t[4] * other[0] + self.t[5] * other[1]))
+ else:
+ raise Exception("Illegal multiplier of {:s}".format(str(type(other))))
+ elif isinstance(other, asyTransform):
+ result = asyTransform((0, 0, 0, 0, 0, 0))
+ result.x = self.x + self.xx * other.x + self.xy * other.y
+ result.y = self.y + self.yx * other.x + self.yy * other.y
+ result.xx = self.xx * other.xx + self.xy * other.yx
+ result.xy = self.xx * other.xy + self.xy * other.yy
+ result.yx = self.yx * other.xx + self.yy * other.yx
+ result.yy = self.yx * other.xy + self.yy * other.yy
+ result.t = (result.x, result.y, result.xx, result.xy, result.yx, result.yy)
+ return result
+ elif isinstance(other, str):
+ if other != 'cycle':
+ raise TypeError
+ else:
+ return 'cycle'
+ else:
+ raise TypeError("Illegal multiplier of {:s}".format(str(type(other))))
+
def identity():
- return asyTransform((0,0,1,0,0,1))
+ return asyTransform((0, 0, 1, 0, 0, 1))
+
+def yflip():
+ return asyTransform((0, 0, 1, 0, 0, -1))
-class asyObj:
- """A base class for asy objects: an item represented by asymptote code."""
- def __init__(self):
- """Initialize the object"""
- self.asyCode = ""
+class asyObj(Qc.QObject):
+ """A base class for asy objects: an item represented by asymptote code."""
+ def __init__(self):
+ """Initialize the object"""
+ super().__init__()
+ self.asyCode = ''
- def updateCode(self,mag=1.0):
- """Update the object's code: should be overriden."""
- pass
+ def updateCode(self, ps2asymap=identity()):
+ """Update the object's code: should be overriden."""
+ raise NotImplementedError
+
+ def getCode(self, ps2asymap=identity()):
+ """Return the code describing the object"""
+ self.updateCode(ps2asymap)
+ return self.asyCode
- def getCode(self):
- """Return the code describing the object"""
- self.updateCode()
- return self.asyCode
class asyPen(asyObj):
- """A python wrapper for an asymptote pen"""
- def __init__(self,color=(0,0,0),width=0.5,options=""):
- """Initialize the pen"""
- asyObj.__init__(self)
- self.options=options
- self.width=width
- self.setColor(color)
- self.updateCode()
- if options != "":
- self.computeColor()
-
- def updateCode(self,mag=1.0):
- """Generate the pen's code"""
- self.asyCode = "rgb({:g},{:g},{:g})+{:s}".format(self.color[0], self.color[1], self.color[2],str(self.width))
- if len(self.options) > 0:
- self.asyCode += "+"+self.options
-
- def setWidth(self,newWidth):
- """Set the pen's width"""
- self.width=newWidth
- self.updateCode()
-
- def setColor(self,color):
- """Set the pen's color"""
- if type(color) == type((1,)) and len(color) == 3:
- self.color = color
- else:
- self.color = "(0,0,0)"
- self.updateCode()
-
- def computeColor(self):
- """Find out the color of an arbitrary asymptote pen."""
- fout.write("pen p="+self.getCode()+';\n')
- fout.write("file fout=output(mode='pipe');\n")
- fout.write("write(fout,colorspace(p),newl);\n")
- fout.write("write(fout,colors(p));\n")
- fout.write("flush(fout);\n")
- fout.flush()
- colorspace = fin.readline()
- if colorspace.find("cmyk") != -1:
- lines = fin.readline()+fin.readline()+fin.readline()+fin.readline()
- parts = lines.split()
- c,m,y,k = eval(parts[0]),eval(parts[1]),eval(parts[2]),eval(parts[3])
- k = 1-k
- r,g,b = ((1-c)*k,(1-m)*k,(1-y)*k)
- elif colorspace.find("rgb") != -1:
- lines = fin.readline()+fin.readline()+fin.readline()
- parts = lines.split()
- r,g,b = eval(parts[0]),eval(parts[1]),eval(parts[2])
- elif colorspace.find("gray") != -1:
- lines = fin.readline()
- parts = lines.split()
- r = g = b = eval(parts[0])
- self.color = (r,g,b)
-
- def tkColor(self):
- """Return the tk version of the pen's color"""
- self.computeColor()
- return '#{}'.format("".join(["{:02x}".format(min(int(256*a),255)) for a in self.color]))
+ """A python wrapper for an asymptote pen"""
+ @staticmethod
+ def getColorFromQColor(color):
+ return color.redF(), color.greenF(), color.blueF()
+
+ @staticmethod
+ def convertToQColor(color):
+ r, g, b = color
+ return Qg.QColor.fromRgbF(r, g, b)
+
+ @classmethod
+ def fromAsyPen(cls, pen):
+ assert isinstance(pen, cls)
+ return cls(asyengine=pen._asyengine, color=pen.color, width=pen.width, pen_options=pen.options)
+
+ def __init__(self, asyengine=None, color=(0, 0, 0), width=0.5, pen_options=""):
+ """Initialize the pen"""
+ asyObj.__init__(self)
+ self.color = (0, 0, 0)
+ self.options = pen_options
+ self.width = width
+ self._asyengine = asyengine
+ self._deferAsyfy = False
+ if pen_options:
+ self._deferAsyfy = True
+ self.updateCode()
+ self.setColor(color)
+
+ @property
+ def asyEngine(self):
+ return self._asyengine
+
+ @asyEngine.setter
+ def asyEngine(self, value):
+ self._asyengine = value
+
+ def updateCode(self, asy2psmap=identity()):
+ """Generate the pen's code"""
+ if self._deferAsyfy:
+ self.computeColor()
+ self.asyCode = 'rgb({:g},{:g},{:g})+{:s}'.format(self.color[0], self.color[1], self.color[2], str(self.width))
+ if len(self.options) > 0:
+ self.asyCode = self.asyCode + '+' + self.options
+
+ def setWidth(self, newWidth):
+ """Set the pen's width"""
+ self.width = newWidth
+ self.updateCode()
+
+ def setColor(self, color):
+ """Set the pen's color"""
+ if isinstance(color, tuple) and len(color) == 3:
+ self.color = color
+ else:
+ self.color = (0, 0, 0)
+ self.updateCode()
+
+ def setColorFromQColor(self, color):
+ self.setColor(asyPen.getColorFromQColor(color))
+
+ def computeColor(self):
+ """Find out the color of an arbitrary asymptote pen."""
+ assert isinstance(self.asyEngine, AsymptoteEngine)
+ assert self.asyEngine.active
+
+ fout = self.asyEngine.ostream
+ fin = self.asyEngine.istream
+
+ fout.write("pen p=" + self.getCode() + ';\n')
+ fout.write("write(_outpipe,colorspace(p),newl);\n")
+ fout.write("write(_outpipe,colors(p));\n")
+ fout.write("flush(_outpipe);\n")
+ fout.write(self.asyEngine.xasy)
+ fout.flush()
+
+ colorspace = fin.readline()
+ if colorspace.find("cmyk") != -1:
+ lines = fin.readline() + fin.readline() + fin.readline() + fin.readline()
+ parts = lines.split()
+ c, m, y, k = eval(parts[0]), eval(parts[1]), eval(parts[2]), eval(parts[3])
+ k = 1 - k
+ r, g, b = ((1 - c) * k, (1 - m) * k, (1 - y) * k)
+ elif colorspace.find("rgb") != -1:
+ lines = fin.readline() + fin.readline() + fin.readline()
+ parts = lines.split()
+ r, g, b = eval(parts[0]), eval(parts[1]), eval(parts[2])
+ elif colorspace.find("gray") != -1:
+ lines = fin.readline()
+ parts = lines.split()
+ r = g = b = eval(parts[0])
+ else:
+ raise ChildProcessError('Asymptote error.')
+ self.color = (r, g, b)
+ self._deferAsyfy = False
+
+ def tkColor(self):
+ """Return the tk version of the pen's color"""
+ self.computeColor()
+ return '#{}'.format("".join(["{:02x}".format(min(int(256 * a), 255)) for a in self.color]))
+
+ def toQPen(self):
+ if self._deferAsyfy:
+ self.computeColor()
+ newPen = Qg.QPen()
+ newPen.setColor(asyPen.convertToQColor(self.color))
+ newPen.setWidthF(self.width)
+
+ return newPen
+
class asyPath(asyObj):
- """A python wrapper for an asymptote path"""
- def __init__(self):
- """Initialize the path to be an empty path: a path with no nodes, control points, or links."""
- asyObj.__init__(self)
- self.nodeSet = []
- self.linkSet = []
- self.controlSet = []
- self.computed = False
-
- def initFromNodeList(self,nodeSet,linkSet):
- """Initialize the path from a set of nodes and link types, "--", "..", or "::" """
- if len(nodeSet)>0:
- self.nodeSet = nodeSet[:]
- self.linkSet = linkSet[:]
- self.computed = False
-
- def initFromControls(self,nodeSet,controlSet):
- """Initialize the path from nodes and control points"""
- self.controlSet = controlSet[:]
- self.nodeSet = nodeSet[:]
- self.computed = True
-
- def makeNodeStr(self,node):
- """Represent a node as a string"""
- if node == 'cycle':
- return node
- else:
- return "("+str(node[0])+","+str(node[1])+")"
-
- def updateCode(self,mag=1.0):
- """Generate the code describing the path"""
- if not self.computed:
- count = 0
- #this string concatenation could be optimised
- self.asyCode = self.makeNodeStr(self.nodeSet[0])
- for node in self.nodeSet[1:]:
- self.asyCode += self.linkSet[count]+self.makeNodeStr(node)
- count += 1
- else:
- count = 0
- #this string concatenation could be optimised
- self.asyCode = self.makeNodeStr(self.nodeSet[0])
- for node in self.nodeSet[1:]:
- self.asyCode += "..controls"
- self.asyCode += self.makeNodeStr(self.controlSet[count][0])
- self.asyCode += "and"
- self.asyCode += self.makeNodeStr(self.controlSet[count][1])
- self.asyCode += ".." + self.makeNodeStr(node) + "\n"
- count += 1
-
- def getNode(self,index):
- """Return the requested node"""
- return self.nodeSet[index]
-
- def getLink(self,index):
- """Return the requested link"""
- return self.linkSet[index]
-
- def setNode(self,index,newNode):
- """Set a node to a new position"""
- self.nodeSet[index] = newNode
-
- def moveNode(self,index,offset):
- """Translate a node"""
- if self.nodeSet[index] != "cycle":
- self.nodeSet[index] = (self.nodeSet[index][0]+offset[0],self.nodeSet[1]+offset[1])
-
- def setLink(self,index,ltype):
- """Change the specified link"""
- self.linkSet[index] = ltype
-
- def addNode(self,point,ltype):
- """Add a node to the end of a path"""
- self.nodeSet.append(point)
- if len(self.nodeSet) != 1:
- self.linkSet.append(ltype)
- if self.computed:
- self.computeControls()
-
- def insertNode(self,index,point,ltype=".."):
- """Insert a node, and its corresponding link, at the given index"""
- self.nodeSet.insert(index,point)
- self.linkSet.insert(index,ltype)
- if self.computed:
- self.computeControls()
-
- def setControl(self,index,position):
- """Set a control point to a new position"""
- self.controlSet[index] = position
-
- def moveControl(self,index,offset):
- """Translate a control point"""
- self.controlSet[index] = (self.controlSet[index][0]+offset[0],self.controlSet[index][1]+offset[1])
-
- def computeControls(self):
- """Evaluate the code of the path to obtain its control points"""
- fout.write("file fout=output(mode='pipe');\n")
- fout.write("path p="+self.getCode()+';\n')
- fout.write("write(fout,length(p),newl);\n")
- fout.write("write(fout,unstraighten(p),endl);\n")
- fout.flush()
- lengthStr = fin.readline()
- pathSegments = eval(lengthStr.split()[-1])
- pathStrLines = []
- for i in range(pathSegments+1):
- line=fin.readline()
- line=line.replace("\n","")
- pathStrLines.append(line)
- oneLiner = "".join(pathStrLines).replace(" ", "")
- splitList = oneLiner.split("..")
- nodes = [a for a in splitList if a.find("controls")==-1]
- self.nodeSet = []
- for a in nodes:
- if a == 'cycle':
- self.nodeSet.append(a)
- else:
- self.nodeSet.append(eval(a))
- controls = [a.replace("controls","").split("and") for a in splitList if a.find("controls") != -1]
- self.controlSet = [[eval(a[0]),eval(a[1])] for a in controls]
- self.computed = True
+ """A python wrapper for an asymptote path"""
+
+ def __init__(self, asyengine: AsymptoteEngine=None, forceCurve=False):
+ """Initialize the path to be an empty path: a path with no nodes, control points, or links."""
+ super().__init__()
+ self.nodeSet = []
+ self.linkSet = []
+ self.forceCurve = forceCurve
+ self.controlSet = []
+ self.computed = False
+ self.asyengine = asyengine
+
+ @classmethod
+ def fromPath(cls, oldPath):
+ newObj = asyPath(None)
+ newObj.nodeSet = copy.copy(oldPath.nodeSet)
+ newObj.linkSet = copy.copy(oldPath.linkSet)
+ newObj.controlSet = copy.deepcopy(oldPath.controlSet)
+ newObj.computed = oldPath.computed
+ newObj.asyengine = oldPath.asyengine
+
+ return newObj
+
+ @classmethod
+ def fromBezierPoints(cls, pointList: list, engine=None):
+ if not pointList:
+ return None
+ assert isinstance(pointList[0], BezierCurveEditor.BezierPoint)
+ nodeList = []
+ controlList = []
+ for point in pointList:
+ nodeList.append(BezierCurveEditor.QPoint2Tuple(point.point))
+ if point.rCtrlPoint is not None: # first
+ controlList.append([BezierCurveEditor.QPoint2Tuple(point.rCtrlPoint)])
+ if point.lCtrlPoint is not None: # last
+ controlList[-1].append(BezierCurveEditor.QPoint2Tuple(point.lCtrlPoint))
+ newPath = asyPath(asyengine=engine)
+ newPath.initFromControls(nodeList, controlList)
+ return newPath
+
+ def setInfo(self, path):
+ self.nodeSet = copy.copy(path.nodeSet)
+ self.linkSet = copy.copy(path.linkSet)
+ self.controlSet = copy.deepcopy(path.controlSet)
+ self.computed = path.computed
+
+ @property
+ def isEmpty(self):
+ return len(self.nodeSet) == 0
+
+ @property
+ def isDrawable(self):
+ return len(self.nodeSet) >= 2
+
+ def toQPainterPath(self) -> Qg.QPainterPath:
+ return self.toQPainterPathCurve() if self.containsCurve else self.toQPainterPathLine()
+
+ def toQPainterPathLine(self):
+ baseX, baseY = self.nodeSet[0]
+ painterPath = Qg.QPainterPath(Qc.QPointF(baseX, baseY))
+
+ for pointIndex in range(1, len(self.nodeSet)):
+ node = self.nodeSet[pointIndex]
+ if self.nodeSet[pointIndex] == 'cycle':
+ node = self.nodeSet[0]
+
+ painterPath.lineTo(*node)
+
+ return painterPath
+
+
+ def toQPainterPathCurve(self):
+ if not self.computed:
+ self.computeControls()
+
+ baseX, baseY = self.nodeSet[0]
+ painterPath = Qg.QPainterPath(Qc.QPointF(baseX, baseY))
+
+ for pointIndex in range(1, len(self.nodeSet)):
+ node = self.nodeSet[pointIndex]
+ if self.nodeSet[pointIndex] == 'cycle':
+ node = self.nodeSet[0]
+ endPoint = Qc.QPointF(node[0], node[1])
+ ctrlPoint1 = Qc.QPointF(self.controlSet[pointIndex-1][0][0], self.controlSet[pointIndex-1][0][1])
+ ctrlPoint2 = Qc.QPointF(self.controlSet[pointIndex-1][1][0], self.controlSet[pointIndex-1][1][1])
+
+ painterPath.cubicTo(ctrlPoint1, ctrlPoint2, endPoint)
+ return painterPath
+
+ def initFromNodeList(self, nodeSet, linkSet):
+ """Initialize the path from a set of nodes and link types, "--", "..", or "::" """
+ if len(nodeSet) > 0:
+ self.nodeSet = nodeSet[:]
+ self.linkSet = linkSet[:]
+ self.computed = False
+
+ def initFromControls(self, nodeSet, controlSet):
+ """Initialize the path from nodes and control points"""
+ self.controlSet = controlSet[:]
+ self.nodeSet = nodeSet[:]
+ self.computed = True
+
+ def makeNodeStr(self, node):
+ """Represent a node as a string"""
+ if node == 'cycle':
+ return node
+ else:
+ # if really want to, disable this rounding
+ # shouldn't be to much of a problem since 10e-6 is quite small...
+ return '({:.6g},{:.6g})'.format(node[0], node[1])
+
+ def updateCode(self, ps2asymap=identity()):
+ """Generate the code describing the path"""
+ # currently at postscript. Convert to asy
+ asy2psmap = ps2asymap.inverted()
+ with io.StringIO() as rawAsyCode:
+ count = 0
+ rawAsyCode.write(self.makeNodeStr(asy2psmap * self.nodeSet[0]))
+ for node in self.nodeSet[1:]:
+ if not self.computed or count >= len(self.controlSet):
+ rawAsyCode.write(self.linkSet[count])
+ rawAsyCode.write(self.makeNodeStr(asy2psmap * node))
+ else:
+ rawAsyCode.write('..controls ')
+ rawAsyCode.write(self.makeNodeStr(asy2psmap * self.controlSet[count][0]))
+ rawAsyCode.write(' and ')
+ rawAsyCode.write(self.makeNodeStr(asy2psmap * self.controlSet[count][1]))
+ rawAsyCode.write(".." + self.makeNodeStr(asy2psmap * node))
+ count = count + 1
+ self.asyCode = rawAsyCode.getvalue()
+
+ @property
+ def containsCurve(self):
+ return '..' in self.linkSet or self.forceCurve
+
+ def getNode(self, index):
+ """Return the requested node"""
+ return self.nodeSet[index]
+
+ def getLink(self, index):
+ """Return the requested link"""
+ return self.linkSet[index]
+
+ def setNode(self, index, newNode):
+ """Set a node to a new position"""
+ self.nodeSet[index] = newNode
+
+ def moveNode(self, index, offset):
+ """Translate a node"""
+ if self.nodeSet[index] != "cycle":
+ self.nodeSet[index] = (self.nodeSet[index][0] + offset[0], self.nodeSet[index][1] + offset[1])
+
+ def setLink(self, index, ltype):
+ """Change the specified link"""
+ self.linkSet[index] = ltype
+
+ def addNode(self, point, ltype):
+ """Add a node to the end of a path"""
+ self.nodeSet.append(point)
+ if len(self.nodeSet) != 1:
+ self.linkSet.append(ltype)
+ if self.computed:
+ self.computeControls()
+
+ def insertNode(self, index, point, ltype=".."):
+ """Insert a node, and its corresponding link, at the given index"""
+ self.nodeSet.insert(index, point)
+ self.linkSet.insert(index, ltype)
+ if self.computed:
+ self.computeControls()
+
+ def setControl(self, index, position):
+ """Set a control point to a new position"""
+ self.controlSet[index] = position
+
+ def popNode(self):
+ if len(self.controlSet) == len(self.nodeSet):
+ self.controlSet.pop()
+ self.nodeSet.pop()
+ self.linkSet.pop()
+
+ def moveControl(self, index, offset):
+ """Translate a control point"""
+ self.controlSet[index] = (self.controlSet[index][0] + offset[0], self.controlSet[index][1] + offset[1])
+
+ def computeControls(self):
+ """Evaluate the code of the path to obtain its control points"""
+ # For now, if no asymptote process is given spawns a new one.
+ # Only happens if asyengine is None.
+ if self.asyengine is not None:
+ assert isinstance(self.asyengine, AsymptoteEngine)
+ assert self.asyengine.active
+ asy = self.asyengine
+ startUp = False
+ else:
+ startUp = True
+ asy = AsymptoteEngine()
+ asy.start()
+
+ fout = asy.ostream
+ fin = asy.istream
+
+ fout.write("path p=" + self.getCode() + ';\n')
+ fout.write("write(_outpipe,length(p),newl);\n")
+ fout.write("write(_outpipe,unstraighten(p),endl);\n")
+ fout.write(asy.xasy)
+ fout.flush()
+
+ lengthStr = fin.readline()
+ pathSegments = eval(lengthStr.split()[-1])
+ pathStrLines = []
+ for i in range(pathSegments + 1):
+ line = fin.readline()
+ line = line.replace("\n", "")
+ pathStrLines.append(line)
+ oneLiner = "".join(pathStrLines).replace(" ", "")
+ splitList = oneLiner.split("..")
+ nodes = [a for a in splitList if a.find("controls") == -1]
+ self.nodeSet = []
+ for a in nodes:
+ if a == 'cycle':
+ self.nodeSet.append(a)
+ else:
+ self.nodeSet.append(eval(a))
+ controls = [a.replace("controls", "").split("and") for a in splitList if a.find("controls") != -1]
+ self.controlSet = [[eval(a[0]), eval(a[1])] for a in controls]
+ self.computed = True
+
+ if startUp:
+ asy.stop()
class asyLabel(asyObj):
- """A python wrapper for an asy label"""
- def __init__(self,text="",location=(0,0),pen=asyPen()):
- """Initialize the label with the given test, location, and pen"""
- asyObj.__init__(self)
- self.text = text
- self.location = location
- self.pen = pen
-
- def updateCode(self,mag=1.0):
- """Generate the code describing the label"""
- self.asyCode = "Label(\""+self.text+"\","+str((self.location[0],self.location[1]))+","+self.pen.getCode()+",align=SE)"
-
- def setText(self,text):
- """Set the label's text"""
- self.text = text
- self.updateCode()
-
- def setPen(self,pen):
- """Set the label's pen"""
- self.pen = pen
- self.updateCode()
-
- def moveTo(self,newl):
- """Translate the label's location"""
- self.location = newl
+ """A python wrapper for an asy label"""
+
+ def __init__(self, text="", location=(0, 0), pen=None, align=None, fontSize:int=None):
+ """Initialize the label with the given test, location, and pen"""
+ asyObj.__init__(self)
+ self.align = align
+ self.pen = pen
+ self.fontSize = fontSize
+ if align is None:
+ self.align = 'SE'
+ if pen is None:
+ self.pen = asyPen()
+ self.text = text
+ self.location = location
+
+ def updateCode(self, asy2psmap=identity()):
+ """Generate the code describing the label"""
+ newLoc = asy2psmap.inverted() * self.location
+ locStr = xu.tuple2StrWOspaces(newLoc)
+ self.asyCode = 'Label("{0}",{1},p={2}{4},align={3})'.format(self.text, locStr, self.pen.getCode(), self.align,
+ self.getFontSizeText())
+
+ def getFontSizeText(self):
+ if self.fontSize is not None:
+ return '+fontsize({:.6g})'.format(self.fontSize)
+ else:
+ return ''
+
+ def setText(self, text):
+ """Set the label's text"""
+ self.text = text
+ self.updateCode()
+
+ def setPen(self, pen):
+ """Set the label's pen"""
+ self.pen = pen
+ self.updateCode()
+
+ def moveTo(self, newl):
+ """Translate the label's location"""
+ self.location = newl
+
class asyImage:
- """A structure containing an image and its format, bbox, and IDTag"""
- def __init__(self,image,format,bbox):
- self.image = image
- self.format = format
- self.bbox = bbox
- self.IDTag = None
-
-class xasyItem:
- """A base class for items in the xasy GUI"""
- def __init__(self,canvas=None):
- """Initialize the item to an empty item"""
- self.transform = [identity()]
- self.asyCode = ""
- self.imageList = []
- self.IDTag = None
- self.asyfied = False
- self.onCanvas = canvas
-
- def updateCode(self,mag=1.0):
- """Update the item's code: to be overriden"""
- pass
-
- def getCode(self):
- """Return the code describing the item"""
- self.updateCode()
- return self.asyCode
-
- def handleImageReception(self,file,format,bbox,count):
- """Receive an image from an asy deconstruction. It replaces the default in asyProcess."""
- image = Image.open(file)
- self.imageList.append(asyImage(image,format,bbox))
- if self.onCanvas != None:
- self.imageList[-1].itk = ImageTk.PhotoImage(image)
- self.imageList[-1].originalImage = image.copy()
- self.imageList[-1].originalImage.theta = 0.0
- self.imageList[-1].originalImage.bbox = bbox
- if count >= len(self.transform) or self.transform[count].deleted == False:
- self.imageList[-1].IDTag = self.onCanvas.create_image(bbox[0],-bbox[3],anchor=NW,tags=("image"),image=self.imageList[-1].itk)
- self.onCanvas.update()
-
- def asyfy(self,mag=1.0):
- self.removeFromCanvas()
- self.imageList = []
- self.imageHandleQueue = queue.Queue()
- worker = threading.Thread(target=self.asyfyThread,args=(mag,))
- worker.start()
- item = self.imageHandleQueue.get()
- if console != None:
- console.delete(1.0,END)
- while item != (None,) and item[0] != "ERROR":
- if(item[0] == "OUTPUT"):
- consoleOutput(item[1])
- else:
- self.handleImageReception(*item)
- try:
- os.remove(item[0])
- except:
- pass
- item = self.imageHandleQueue.get()
- #self.imageHandleQueue.task_done()
- worker.join()
-
- def asyfyThread(self,mag=1.0):
- """Convert the item to a list of images by deconstructing this item's code"""
- fout.write("reset;\n")
- fout.write("initXasyMode();\n")
- fout.write("atexit(null);\n")
- for line in self.getCode().splitlines():
- fout.write(line+"\n");
- fout.write("deconstruct({:f});\n".format(mag))
- fout.flush()
- maxargs = int(fin.readline().split()[0])
- boxes=[]
- batch=0
- n=0
- text = fin.readline()
- # template=AsyTempDir+"%d_%d.%s"
- fileformat = "png"
- def render():
- for i in range(len(boxes)):
- l,b,r,t = [float(a) for a in boxes[i].split()]
- name="{:s}{:d}_{:d}.{:s}".format(AsyTempDir,batch,i+1,fileformat)
- self.imageHandleQueue.put((name,fileformat,(l,b,r,t),i))
- while text != "Done\n" and text != "Error\n":
- boxes.append(text)
- text = fin.readline()
- n += 1
- if n >= maxargs:
- render()
- boxes=[]
- batch += 1
- n=0
- if text == "Error\n":
- self.imageHandleQueue.put(("ERROR",fin.readline()))
- else:
- render()
- self.imageHandleQueue.put((None,))
- self.asyfied = True
-
- def drawOnCanvas(self,canvas,mag,forceAddition=False):
- pass
- def removeFromCanvas(self):
- pass
+ """A structure containing an image and its format, bbox, and IDTag"""
+ def __init__(self, image, format, bbox, transfKey=None, keyIndex=0):
+ self.image = image
+ self.format = format
+ self.bbox = bbox
+ self.IDTag = None
+ self.key = transfKey
+ self.keyIndex = keyIndex
+
+class xasyItem(Qc.QObject):
+ """A base class for items in the xasy GUI"""
+ mapString = 'xmap'
+ setKeyFormatStr = string.Template('$map("{:s}",{:s});').substitute(map=mapString)
+ setKeyAloneFormatStr = string.Template('$map("{:s}");').substitute(map=mapString)
+ resizeComment="// Resize to initial xasy transform"
+ asySize=""
+ def __init__(self, canvas=None, asyengine=None):
+ """Initialize the item to an empty item"""
+ super().__init__()
+ self.transfKeymap = {} # the new keymap.
+ # should be a dictionary to a list...
+ self.asyCode = ''
+ self.imageList = []
+ self.IDTag = None
+ self.asyfied = False
+ self.onCanvas = canvas
+ self.keyBuffer = None
+ self._asyengine = asyengine
+ self.drawObjects = []
+ self.drawObjectsMap = {}
+ self.setKeyed = True
+ self.unsetKeys = set()
+ self.userKeys = set()
+ self.lineOffset = 0
+ self.imageHandleQueue = queue.Queue()
+
+ def updateCode(self, ps2asymap=identity()):
+ """Update the item's code: to be overriden"""
+ with io.StringIO() as rawCode:
+ transfCode = self.getTransformCode()
+ objCode = self.getObjectCode()
+
+ rawCode.write(transfCode)
+ rawCode.write(objCode)
+ self.asyCode = rawCode.getvalue()
+
+ return len(transfCode.splitlines()), len(objCode.splitlines())
+
+ @property
+ def asyengine(self):
+ return self._asyengine
+
+ @asyengine.setter
+ def asyengine(self, value):
+ self._asyengine = value
+
+ def getCode(self, ps2asymap=identity()):
+ """Return the code describing the item"""
+ self.updateCode(ps2asymap)
+ return self.asyCode
+
+ def getTransformCode(self, asy2psmap=identity()):
+ raise NotImplementedError
+
+ def getObjectCode(self, asy2psmap=identity()):
+ raise NotImplementedError
+
+ def generateDrawObjects(self):
+ raise NotImplementedError
+
+ def handleImageReception(self, file, fileformat, bbox, count, key=None, localCount=0, containsClip=False):
+ """Receive an image from an asy deconstruction. It replaces the default n asyProcess."""
+ # image = Image.open(file).transpose(Image.FLIP_TOP_BOTTOM)
+ if fileformat == 'png':
+ image = Qg.QImage(file)
+ elif fileformat == 'svg':
+ if containsClip:
+ image = xs.SvgObject(file)
+ else:
+ image = Qs.QSvgRenderer(file)
+ assert image.isValid()
+ else:
+ raise Exception('Format not supported!')
+ self.imageList.append(asyImage(image, fileformat, bbox, transfKey=key, keyIndex=localCount))
+ if self.onCanvas is not None:
+ # self.imageList[-1].iqt = ImageTk.PhotoImage(image)
+ currImage = self.imageList[-1]
+ currImage.iqt = image
+ currImage.originalImage = image
+ currImage.originalImage.theta = 0.0
+ currImage.originalImage.bbox = list(bbox)
+ currImage.performCanvasTransform = False
+
+ # handle this case if transform is not in the map yet.
+ # if deleted - set transform to 0, 0, 0, 0, 0
+ transfExists = key in self.transfKeymap.keys()
+ if transfExists:
+ transfExists = localCount <= len(self.transfKeymap[key]) - 1
+ if transfExists:
+ validKey = not self.transfKeymap[key][localCount].deleted
+ else:
+ validKey = False
+
+ if (not transfExists) or validKey:
+ currImage.IDTag = str(file)
+ newDrawObj = DrawObject(currImage.iqt, self.onCanvas['canvas'], transform=identity(),
+ btmRightanchor=Qc.QPointF(bbox[0], bbox[2]), drawOrder=-1, key=key,
+ parentObj=self, keyIndex=localCount)
+ newDrawObj.setBoundingBoxPs(bbox)
+ newDrawObj.setParent(self)
+
+ self.drawObjects.append(newDrawObj)
+
+ if key not in self.drawObjectsMap.keys():
+ self.drawObjectsMap[key] = [newDrawObj]
+ else:
+ self.drawObjectsMap[key].append(newDrawObj)
+ return containsClip
+ def asyfy(self, force=False):
+ if self.asyengine is None:
+ return 1
+ if self.asyfied and not force:
+ return
+
+ self.drawObjects = []
+ self.drawObjectsMap.clear()
+ assert isinstance(self.asyengine, AsymptoteEngine)
+ self.imageList = []
+
+ self.unsetKeys.clear()
+ self.userKeys.clear()
+
+ self.imageHandleQueue = queue.Queue()
+ worker = threading.Thread(target=self.asyfyThread, args=[])
+ worker.start()
+ item = self.imageHandleQueue.get()
+ while item != (None,) and item[0] != "ERROR":
+ if item[0] == "OUTPUT":
+ print(item[1])
+ else:
+ keepFile = self.handleImageReception(*item)
+ if not DebugFlags.keepFiles and not keepFile:
+ try:
+ os.remove(item[0])
+ pass
+ except OSError:
+ pass
+ finally:
+ pass
+ item = self.imageHandleQueue.get()
+ # self.imageHandleQueue.task_done()
+ worker.join()
+
+ def asyfyThread(self):
+ """Convert the item to a list of images by deconstructing this item's code"""
+ assert self.asyengine.active
+
+ fout = self.asyengine.ostream
+ fin = self.asyengine.istream
+
+ self.lineOffset = len(self.getTransformCode().splitlines())
+
+ fout.write("reset\n")
+ fout.flush();
+ for line in self.getCode().splitlines():
+ if DebugFlags.printDeconstTranscript:
+ print('fout:', line)
+ fout.write(line+"\n")
+ fout.write(self.asySize)
+ fout.write("deconstruct();\n")
+ fout.write('write(_outpipe,yscale(-1)*currentpicture.calculateTransform(),endl);\n')
+ fout.write(self.asyengine.xasy)
+ fout.flush()
+
+ imageInfos = [] # of (box, key)
+ n = 0
+
+ keyCounts = {}
+
+ def render():
+ for i in range(len(imageInfos)):
+ box, key, localCount, useClip = imageInfos[i]
+ l, b, r, t = [float(a) for a in box.split()]
+ name = "{:s}_{:d}.{:s}".format(self.asyengine.tempDirName, i, fileformat)
+
+ self.imageHandleQueue.put((name, fileformat, (l, -t, r, -b), i, key, localCount, useClip))
+
+ # key first, box second.
+ # if key is "Done"
+ raw_text = fin.readline()
+ text = ""
+ if DebugFlags.printDeconstTranscript:
+ print(raw_text.strip())
+
+ # template=AsyTempDir+"%d_%d.%s"
+ fileformat = 'svg'
+
+ while raw_text != "Done\n" and raw_text != "Error\n":
+# print(raw_text)
+ text = fin.readline() # the actual bounding box.
+ # print('TESTING:', text)
+ keydata = raw_text.strip().replace('KEY=', '', 1) # key
+
+ clipflag = keydata[-1] == '1'
+ userkey = keydata[-2] == '1'
+ keydata = keydata[:-3]
+
+ if not userkey:
+ self.unsetKeys.add(keydata) # the line and column to replace.
+ else:
+ self.userKeys.add(keydata)
+
+# print(line, col)
+
+ if keydata not in keyCounts.keys():
+ keyCounts[keydata] = 0
+
+ imageInfos.append((text, keydata, keyCounts[keydata], clipflag)) # key-data pair
+
+ # for the next item
+ keyCounts[keydata] += 1
+
+ raw_text = fin.readline()
+
+ if DebugFlags.printDeconstTranscript:
+ print(text.rstrip())
+ print(raw_text.rstrip())
+
+ n += 1
+
+ if text == "Error\n":
+ self.imageHandleQueue.put(("ERROR", fin.readline()))
+ else:
+ render()
+
+ self.asy2psmap = asyTransform(xu.listize(fin.readline().rstrip(),float))
+ self.imageHandleQueue.put((None,))
+ self.asyfied = True
class xasyDrawnItem(xasyItem):
- """A base class for GUI items was drawn by the user. It combines a path, a pen, and a transform."""
- def __init__(self,path,pen = asyPen(),transform = identity()):
- """Initialize the item with a path, pen, and transform"""
- xasyItem.__init__(self)
- self.path = path
- self.pen = pen
- self.transform = [transform]
-
- def appendPoint(self,point,link=None):
- """Append a point to the path. If the path is cyclic, add this point before the 'cycle' node."""
- if self.path.nodeSet[-1] == 'cycle':
- self.path.nodeSet[-1] = point
- self.path.nodeSet.append('cycle')
- else:
- self.path.nodeSet.append(point)
- self.path.computed = False
- if len(self.path.nodeSet) > 1 and link != None:
- self.path.linkSet.append(link)
-
- def clearTransform(self):
- """Reset the item's transform"""
- self.transform = [identity()]
-
- def removeLastPoint(self):
- """Remove the last point in the path. If the path is cyclic, remove the node before the 'cycle' node."""
- if self.path.nodeSet[-1] == 'cycle':
- del self.path.nodeSet[-2]
- else:
- del self.path.nodeSet[-1]
- del self.path.linkSet[-1]
- self.path.computed = False
-
- def setLastPoint(self,point):
- """Modify the last point in the path. If the path is cyclic, modify the node before the 'cycle' node."""
- if self.path.nodeSet[-1] == 'cycle':
- self.path.nodeSet[-2] = point
- else:
- self.path.nodeSet[-1] = point
- self.path.computed = False
+ """A base class for GUI items was drawn by the user. It combines a path, a pen, and a transform."""
+
+ def __init__(self, path, engine, pen=None, transform=identity(), key=None):
+ """Initialize the item with a path, pen, and transform"""
+ super().__init__(canvas=None, asyengine=engine)
+ if pen is None:
+ pen = asyPen()
+ self.path = path
+ self.path.asyengine = engine
+ self.asyfied = True
+ self.pen = pen
+ self._asyengine = engine
+ self.rawIdentifier = ''
+ self.transfKey = key
+ self.transfKeymap = {self.transfKey: [transform]}
+
+ @property
+ def asyengine(self):
+ return self._asyengine
+
+ @asyengine.setter
+ def asyengine(self, value: AsymptoteEngine):
+ self._asyengine = value
+ self.path.asyengine = value
+
+ def setKey(self, newKey=None):
+ transform = self.transfKeymap[self.transfKey][0]
+
+ self.transfKey = newKey
+ self.transfKeymap = {self.transfKey: [transform]}
+
+ def generateDrawObjects(self, forceUpdate=False):
+ raise NotImplementedError
+
+ def appendPoint(self, point, link=None):
+ """Append a point to the path. If the path is cyclic, add this point before the 'cycle' node."""
+ if self.path.nodeSet[-1] == 'cycle':
+ self.path.nodeSet[-1] = point
+ self.path.nodeSet.append('cycle')
+ else:
+ self.path.nodeSet.append(point)
+ self.path.computed = False
+ self.asyfied = False
+ if len(self.path.nodeSet) > 1 and link is not None:
+ self.path.linkSet.append(link)
+
+ def clearTransform(self):
+ """Reset the item's transform"""
+ self.transform = [identity()]
+ self.asyfied = False
+
+ def removeLastPoint(self):
+ """Remove the last point in the path. If the path is cyclic, remove the node before the 'cycle' node."""
+ if self.path.nodeSet[-1] == 'cycle':
+ del self.path.nodeSet[-2]
+ else:
+ del self.path.nodeSet[-1]
+ del self.path.linkSet[-1]
+ self.path.computed = False
+ self.asyfied = False
+
+ def setLastPoint(self, point):
+ """Modify the last point in the path. If the path is cyclic, modify the node before the 'cycle' node."""
+ if self.path.nodeSet[-1] == 'cycle':
+ self.path.nodeSet[-2] = point
+ else:
+ self.path.nodeSet[-1] = point
+ self.path.computed = False
+ self.asyfied = False
+
class xasyShape(xasyDrawnItem):
- """An outlined shape drawn on the GUI"""
- def __init__(self,path,pen=asyPen(),transform=identity()):
- """Initialize the shape with a path, pen, and transform"""
- xasyDrawnItem.__init__(self,path,pen,transform)
-
- def updateCode(self,mag=1.0):
- """Generate the code to describe this shape"""
- self.asyCode = "xformStack.push("+self.transform[0].getCode()+");\n"
- self.asyCode += "draw("+self.path.getCode()+","+self.pen.getCode()+");"
-
- def removeFromCanvas(self,canvas):
- """Remove the shape's depiction from a tk canvas"""
- if self.IDTag != None:
- canvas.delete(self.IDTag)
-
- def drawOnCanvas(self,canvas,mag,asyFy=False,forceAddition=False):
- """Add this shape to a tk canvas"""
- if not asyFy:
- if self.IDTag == None or forceAddition:
- #add ourselves to the canvas
- self.path.computeControls()
- self.IDTag = canvas.create_line(0,0,0,0,tags=("drawn","xasyShape"),fill=self.pen.tkColor(),width=self.pen.width*mag)
- self.drawOnCanvas(canvas,mag)
- else:
- self.path.computeControls()
- pointSet = []
- previousNode = self.path.nodeSet[0]
- nodeCount = 0
- if len(self.path.nodeSet) == 0:
- pointSet = [0,0,0,0]
- elif len(self.path.nodeSet) == 1:
- if self.path.nodeSet[-1] != 'cycle':
- p = self.transform[0]*(self.path.nodeSet[0][0],self.path.nodeSet[0][1])
- pointSet = [p[0],-p[1],p[0],-p[1],p[0],-p[1]]
- else:
- pointSet = [0,0,0,0]
+ """An outlined shape drawn on the GUI"""
+ def __init__(self, path, asyengine, pen=None, transform=identity()):
+ """Initialize the shape with a path, pen, and transform"""
+ super().__init__(path=path, engine=asyengine, pen=pen, transform=transform)
+
+ def getObjectCode(self, asy2psmap=identity()):
+ return 'draw(KEY="{0}",{1},{2});'.format(self.transfKey, self.path.getCode(asy2psmap), self.pen.getCode())+'\n\n'
+
+ def getTransformCode(self, asy2psmap=identity()):
+ transf = self.transfKeymap[self.transfKey][0]
+ if transf == identity():
+ return ''
else:
- for node in self.path.nodeSet[1:]:
- if node == 'cycle':
- node = self.path.nodeSet[0]
- transform = self.transform[0].scale(mag)
- points = CubicBezier.makeBezier(transform*previousNode,transform*self.path.controlSet[nodeCount][0],transform*self.path.controlSet[nodeCount][1],transform*node)
- for point in points:
- pointSet += [point[0],-point[1]]
- nodeCount += 1
- previousNode = node
- canvas.coords(self.IDTag,*pointSet)
- canvas.itemconfigure(self.IDTag,fill=self.pen.tkColor(),width=self.pen.width*mag)
- else:
- #first asyfy then add an image list
- pass
-
- def __str__(self):
- """Create a string describing this shape"""
- return "xasyShape code:{:s}".format("\n\t".join(self.getCode().splitlines()))
+ return xasyItem.setKeyFormatStr.format(self.transfKey, transf.getCode(asy2psmap))+'\n'
+
+ def generateDrawObjects(self, forceUpdate=False):
+ if self.path.containsCurve:
+ self.path.computeControls()
+ transf = self.transfKeymap[self.transfKey][0]
+
+ newObj = DrawObject(self.path.toQPainterPath(), None, drawOrder=0, transform=transf, pen=self.pen,
+ key=self.transfKey)
+ newObj.originalObj = self
+ newObj.setParent(self)
+ return [newObj]
+
+ def __str__(self):
+ """Create a string describing this shape"""
+ return "xasyShape code:{:s}".format("\n\t".join(self.getCode().splitlines()))
+
class xasyFilledShape(xasyShape):
- """A filled shape drawn on the GUI"""
- def __init__(self,path,pen=asyPen(),transform=identity()):
- """Initialize this shape with a path, pen, and transform"""
- if path.nodeSet[-1] != 'cycle':
- raise Exception("Filled paths must be cyclic")
- xasyShape.__init__(self,path,pen,transform)
-
- def updateCode(self,mag=1.0):
- """Generate the code describing this shape"""
- self.asyCode = "xformStack.push("+self.transform[0].getCode()+");\n"
- self.asyCode += "fill("+self.path.getCode()+","+self.pen.getCode()+");"
-
- def removeFromCanvas(self,canvas):
- """Remove this shape's depiction from a tk canvas"""
- if self.IDTag != None:
- canvas.delete(self.IDTag)
-
- def drawOnCanvas(self,canvas,mag,asyFy=False,forceAddition=False):
- """Add this shape to a tk canvas"""
- if not asyFy:
- if self.IDTag == None or forceAddition:
- #add ourselves to the canvas
- self.path.computeControls()
- self.IDTag = canvas.create_polygon(0,0,0,0,0,0,tags=("drawn","xasyFilledShape"),fill=self.pen.tkColor(),outline=self.pen.tkColor(),width=1*mag)
- self.drawOnCanvas(canvas,mag)
- else:
- self.path.computeControls()
- pointSet = []
- previousNode = self.path.nodeSet[0]
- nodeCount = 0
- if len(self.path.nodeSet) == 0:
- pointSet = [0,0,0,0,0,0]
- elif len(self.path.nodeSet) == 1:
- if self.path.nodeSet[-1] != 'cycle':
- p = self.transform[0]*(self.path.nodeSet[0][0],self.path.nodeSet[0][1])
- pointSet = [p[0],-p[1],p[0],-p[1],p[0],-p[1]]
- else:
- pointSet = [0,0,0,0,0,0]
- elif len(self.path.nodeSet) == 2:
- if self.path.nodeSet[-1] != 'cycle':
- p = self.transform[0].scale(mag)*(self.path.nodeSet[0][0],self.path.nodeSet[0][1])
- p2 = self.transform[0].scale(mag)*(self.path.nodeSet[1][0],self.path.nodeSet[1][1])
- pointSet = [p[0],-p[1],p2[0],-p2[1],p[0],-p[1]]
- else:
- pointSet = [0,0,0,0,0,0]
- else:
- for node in self.path.nodeSet[1:]:
- if node == 'cycle':
- node = self.path.nodeSet[0]
- transform = self.transform[0].scale(mag)
- points = CubicBezier.makeBezier(transform*previousNode,transform*self.path.controlSet[nodeCount][0],transform*self.path.controlSet[nodeCount][1],transform*node)
- for point in points:
- pointSet += [point[0],-point[1]]
- nodeCount += 1
- previousNode = node
- canvas.coords(self.IDTag,*pointSet)
- canvas.itemconfigure(self.IDTag,fill=self.pen.tkColor(),outline=self.pen.tkColor(),width=1*mag)
- else:
- #first asyfy then add an image list
- pass
-
- def __str__(self):
- """Return a string describing this shape"""
- return "xasyFilledShape code:{:s}".format("\n\t".join(self.getCode().splitlines()))
+ """A filled shape drawn on the GUI"""
+
+ def __init__(self, path, asyengine, pen=None, transform=identity()):
+ """Initialize this shape with a path, pen, and transform"""
+ if path.nodeSet[-1] != 'cycle':
+ raise Exception("Filled paths must be cyclic")
+ super().__init__(path, asyengine, pen, transform)
+
+ def getObjectCode(self, asy2psmap=identity()):
+ return 'fill(KEY="{0}",{1},{2});'.format(self.transfKey, self.path.getCode(asy2psmap), self.pen.getCode())+'\n\n'
+
+ def generateDrawObjects(self, forceUpdate=False):
+ if self.path.containsCurve:
+ self.path.computeControls()
+ newObj = DrawObject(self.path.toQPainterPath(), None, drawOrder=0, transform=self.transfKeymap[self.transfKey][0],
+ pen=self.pen, key=self.transfKey, fill=True)
+ newObj.originalObj = self
+ newObj.setParent(self)
+ return [newObj]
+
+ def __str__(self):
+ """Return a string describing this shape"""
+ return "xasyFilledShape code:{:s}".format("\n\t".join(self.getCode().splitlines()))
+
class xasyText(xasyItem):
- """Text created by the GUI"""
- def __init__(self,text,location,pen=asyPen(),transform=identity()):
- """Initialize this item with text, a location, pen, and transform"""
- xasyItem.__init__(self)
- self.label=asyLabel(text,location,pen)
- self.transform = [transform]
- self.onCanvas = None
-
- def updateCode(self,mag=1.0):
- """Generate the code describing this object"""
- self.asyCode = "xformStack.push("+self.transform[0].getCode()+");\n"
- self.asyCode += "label("+self.label.getCode()+");"
-
- def removeFromCanvas(self):
- """Removes the label's images from a tk canvas"""
- if self.onCanvas == None:
- return
- for image in self.imageList:
- if image.IDTag != None:
- self.onCanvas.delete(image.IDTag)
-
- def drawOnCanvas(self,canvas,mag,asyFy=True,forceAddition=False):
- """Adds the label's images to a tk canvas"""
- if self.onCanvas == None:
- self.onCanvas = canvas
- elif self.onCanvas != canvas:
- raise Exception("Error: item cannot be added to more than one canvas")
- self.asyfy(mag)
-
- def __str__(self):
- return "xasyText code:{:s}".format("\n\t".join(self.getCode().splitlines()))
+ """Text created by the GUI"""
+
+ def __init__(self, text, location, asyengine, pen=None, transform=yflip(), key=None, align=None, fontsize:int=None):
+ """Initialize this item with text, a location, pen, and transform"""
+ super().__init__(asyengine=asyengine)
+ if pen is None:
+ pen = asyPen(asyengine=asyengine)
+ if pen.asyEngine is None:
+ pen.asyEngine = asyengine
+ self.label = asyLabel(text, location, pen, align, fontSize=fontsize)
+ # self.transform = [transform]
+ self.transfKey = key
+ self.transfKeymap = {self.transfKey: [transform]}
+ self.asyfied = False
+ self.onCanvas = None
+
+ def setKey(self, newKey=None):
+ transform = self.transfKeymap[self.transfKey][0]
+
+ self.transfKey = newKey
+ self.transfKeymap = {self.transfKey: [transform]}
+
+ def getTransformCode(self, asy2psmap=yflip()):
+ transf = self.transfKeymap[self.transfKey][0]
+ if transf == yflip():
+ # return xasyItem.setKeyAloneFormatStr.format(self.transfKey)
+ return ''
+ else:
+ return xasyItem.setKeyFormatStr.format(self.transfKey, transf.getCode(asy2psmap))+"\n"
+
+ def getObjectCode(self, asy2psmap=yflip()):
+ return 'label(KEY="{0}",{1});'.format(self.transfKey, self.label.getCode(asy2psmap))+'\n'
+
+ def generateDrawObjects(self, forceUpdate=False):
+ self.asyfy(forceUpdate)
+ return self.drawObjects
+
+ def getBoundingBox(self):
+ self.asyfy()
+ return self.imageList[0].bbox
+
+ def __str__(self):
+ return "xasyText code:{:s}".format("\n\t".join(self.getCode().splitlines()))
+
class xasyScript(xasyItem):
- """A set of images create from asymptote code. It is always deconstructed."""
- def __init__(self,canvas,script="",transforms=[]):
- """Initialize this script item"""
- xasyItem.__init__(self,canvas)
- self.transform = transforms[:]
- self.script = script
-
- def clearTransform(self):
- """Reset the transforms for each of the deconstructed images"""
- self.transform = [identity() for im in self.imageList]
-
- def updateCode(self,mag=1.0):
- """Generate the code describing this script"""
- self.asyCode = "";
- if len(self.transform) > 0:
- self.asyCode = "xformStack.add("
- isFirst = True
- count = 0
- for xform in self.transform:
- if not isFirst:
- self.asyCode+=",\n"
- self.asyCode += "indexedTransform({:d},{:s})".format(count,str(xform))
- isFirst = False
- count += 1
- self.asyCode += ");\n"
- self.asyCode += "startScript(); {\n"
- self.asyCode += self.script.replace("\t"," ")
- self.asyCode = self.asyCode.rstrip()
- self.asyCode += "\n} endScript();\n"
-
- def setScript(self,script):
- """Sets the content of the script item."""
- self.script = script
- self.updateCode()
-
- def removeFromCanvas(self):
- """Removes the script's images from a tk canvas"""
- if self.onCanvas == None:
- return
- for image in self.imageList:
- if image.IDTag != None:
- self.onCanvas.delete(image.IDTag)
-
- def asyfy(self,mag):
- """Generate the list of images described by this object and adjust the length of the transform list."""
- xasyItem.asyfy(self,mag)
- while len(self.imageList) > len(self.transform):
- self.transform.append(identity())
- while len(self.imageList) < len(self.transform):
- self.transform.pop()
- self.updateCode()
-
- def drawOnCanvas(self,canvas,mag,asyFy=True,forceAddition=False):
- """Adds the script's images to a tk canvas"""
- if self.onCanvas == None:
- self.onCanvas = canvas
- elif self.onCanvas != canvas:
- raise Exception("Error: item cannot be added to more than one canvas")
- self.asyfy(mag)
-
- def __str__(self):
- """Return a string describing this script"""
- retVal = "xasyScript\n\tTransforms:\n"
- for xform in self.transform:
- retVal += "\t"+str(xform)+"\n"
- retVal += "\tCode Ommitted"
- return retVal
-
-if __name__=='__main__':
- root = Tk()
- t=xasyText("test",(0,0))
- t.asyfy()
+ """A set of images create from asymptote code. It is always deconstructed."""
+
+ def __init__(self, canvas, engine, script="", transforms=None, transfKeyMap=None):
+ """Initialize this script item"""
+ super().__init__(canvas, asyengine=engine)
+ if transfKeyMap is not None:
+ self.transfKeymap = transfKeyMap
+ else:
+ self.transfKeymap = {}
+
+ self.script = script
+ self.key2imagemap = {}
+ self.namedUnsetKeys = {}
+ self.keyPrefix = ''
+ self.scriptAsyfied = False
+ self.updatedPrefix = True
+
+ def clearTransform(self):
+ """Reset the transforms for each of the deconstructed images"""
+ # self.transform = [identity()] * len(self.imageList)
+ keyCount = {}
+
+ for im in self.imageList:
+ if im.key not in keyCount.keys():
+ keyCount[im.key] = 1
+ else:
+ keyCount[im.key] += 1
+
+ for key in keyCount:
+ self.transfKeymap[key] = [identity()] * keyCount[key]
+
+ def getMaxKeyCounter(self):
+ maxCounter = -1
+ for key in self.transfKeymap:
+ testNum = re.match(r'^x(\d+)$', key)
+ if testNum is not None:
+ maxCounter = max(maxCounter, int(testNum.group(1)))
+ return maxCounter + 1
+
+ def getTransformCode(self, asy2psmap=identity()):
+ with io.StringIO() as rawAsyCode:
+ if self.transfKeymap:
+ for key in self.transfKeymap.keys():
+ val = self.transfKeymap[key]
+
+ writeval = list(reversed(val))
+ # need to map all transforms in a list if there is any non-identity
+ # unfortunately, have to check all transformations in the list.
+ while not all(checktransf == identity() for checktransf in writeval) and writeval:
+ transf = writeval.pop()
+ if transf.deleted:
+ rawAsyCode.write(xasyItem.setKeyFormatStr.format(key, transf.getCode(asy2psmap)) + '\n//')
+ if transf == identity() and not transf.deleted:
+ rawAsyCode.write(xasyItem.setKeyAloneFormatStr.format(key))
+ else:
+ rawAsyCode.write(xasyItem.setKeyFormatStr.format(key, transf.getCode(asy2psmap)))
+ rawAsyCode.write('\n')
+ result = rawAsyCode.getvalue()
+ return result
+
+ def findNonIdKeys(self):
+ return {key for key in self.transfKeymap if not all(transf == identity() for transf in self.transfKeymap[key]) }
+
+ def getObjectCode(self, asy2psmap=identity()):
+ numeric=r'([-+]?(?:(?:\d*\.\d+)|(?:\d+\.?)))'
+ rSize=re.compile("size\(\("+numeric+","+numeric+","+numeric+","
+ +numeric+","+numeric+","+numeric+"\)\); "+
+ self.resizeComment)
+
+ newScript = self.getReplacedKeysCode(self.findNonIdKeys())
+ with io.StringIO() as rawAsyCode:
+ for line in newScript.splitlines():
+ if(rSize.match(line)):
+ self.asySize=line.rstrip()+'\n'
+ else:
+ raw_line = line.rstrip().replace('\t', ' ' * 4)
+ rawAsyCode.write(raw_line + '\n')
+
+ self.updatedCode = rawAsyCode.getvalue()
+ return self.updatedCode
+
+ def setScript(self, script):
+ """Sets the content of the script item."""
+ self.script = script
+ self.updateCode()
+
+ def setKeyPrefix(self, newPrefix=''):
+ self.keyPrefix = newPrefix
+ self.updatedPrefix = False
+
+ def getReplacedKeysCode(self, key2replace: set=None) -> str:
+ keylist = {}
+ prefix = ''
+
+ key2replaceSet = self.unsetKeys if key2replace is None else \
+ self.unsetKeys & key2replace
+
+ linenum2key = {}
+
+ if not self.updatedPrefix:
+ prefix = self.keyPrefix
+
+ for key in key2replaceSet:
+ actualkey = key
+
+ key = key.split(':')[0]
+ raw_parsed = xu.tryParseKey(key)
+ assert raw_parsed is not None
+ line, col = [int(val) for val in raw_parsed.groups()]
+ if line not in keylist:
+ keylist[line] = set()
+ keylist[line].add(col)
+ linenum2key[(line, col)] = actualkey
+ self.unsetKeys.discard(key)
+
+
+ raw_code_lines = self.script.splitlines()
+ with io.StringIO() as raw_str:
+ for i_0 in range(len(raw_code_lines)):
+ i = i_0 + self.lineOffset
+ curr_str = raw_code_lines[i_0]
+ if i + 1 in keylist.keys():
+ # this case, we have a key.
+ with io.StringIO() as raw_line:
+ for j in range(len(curr_str)):
+ raw_line.write(curr_str[j])
+ if j + 1 in keylist[i + 1]:
+ # at this point, replace keys with xkey
+ raw_line.write('KEY="{0:s}",'.format(linenum2key[(i + 1, j + 1)]))
+ self.userKeys.add(linenum2key[(i + 1, j + 1)])
+ curr_str = raw_line.getvalue()
+ # else, skip and just write the line.
+ raw_str.write(curr_str + '\n')
+ return raw_str.getvalue()
+
+ def getUnusedKey(self, oldkey) -> str:
+ baseCounter = 0
+ newKey = oldkey
+ while newKey in self.userKeys:
+ newKey = oldkey + ':' + str(baseCounter)
+ baseCounter += 1
+ return newKey
+
+ def asyfy(self, keyOnly=False):
+ """Generate the list of images described by this object and adjust the length of the transform list."""
+ super().asyfy()
+
+ # Id --> Transf --> asy-fied --> Transf
+ # Transf should keep the original, raw transformation
+ # but for all new drawn objects - assign Id as transform.
+
+ if self.scriptAsyfied:
+ return
+
+ keyCount = {}
+ settedKey = {}
+
+ for im in self.imageList:
+ if im.key in self.unsetKeys and im.key not in settedKey.keys():
+ oldkey = im.key
+ self.unsetKeys.remove(im.key)
+ im.key = self.getUnusedKey(im.key)
+ self.unsetKeys.add(im.key)
+
+ for drawobj in self.drawObjectsMap[oldkey]:
+ drawobj.key = im.key
+
+ self.drawObjectsMap[im.key] = self.drawObjectsMap[oldkey]
+ self.drawObjectsMap.pop(oldkey)
+
+ settedKey[oldkey] = im.key
+ elif im.key in settedKey.keys():
+ im.key = settedKey[im.key]
+
+ if im.key not in keyCount.keys():
+ keyCount[im.key] = 1
+ else:
+ keyCount[im.key] += 1
+
+ if im.key not in self.key2imagemap.keys():
+ self.key2imagemap[im.key] = [im]
+ else:
+ self.key2imagemap[im.key].append(im)
+
+
+
+ for key in keyCount:
+ if key not in self.transfKeymap.keys():
+ self.transfKeymap[key] = [identity()] * keyCount[key]
+ else:
+ while len(self.transfKeymap[key]) < keyCount[key]:
+ self.transfKeymap[key].append(identity())
+
+ # while len(self.transfKeymap[key]) > keyCount[key]:
+ # self.transfKeymap[key].pop()
+
+ # change of basis
+ for keylist in self.transfKeymap.values():
+ for i in range(len(keylist)):
+ if keylist[i] != identity():
+ keylist[i] = self.asy2psmap * keylist[i] * self.asy2psmap.inverted()
+
+ self.updateCode()
+ self.scriptAsyfied = True
+
+ def generateDrawObjects(self, forceUpdate=False):
+ self.asyfy(forceUpdate)
+ return self.drawObjects
+
+ def __str__(self):
+ """Return a string describing this script"""
+ retVal = "xasyScript\n\tTransforms:\n"
+ for xform in self.transform:
+ retVal += "\t" + str(xform) + "\n"
+ retVal += "\tCode Ommitted"
+ return retVal
+
+
+class DrawObject(Qc.QObject):
+ def __init__(self, drawObject, mainCanvas=None, transform=identity(), btmRightanchor=Qc.QPointF(0, 0),
+ drawOrder=(-1, -1), pen=None, key=None, parentObj=None, fill=False, keyIndex=0):
+ super().__init__()
+ self.drawObject = drawObject
+ self.mainCanvas = mainCanvas
+ self.pTransform = transform
+ self.baseTransform = transform
+ self.drawOrder = drawOrder
+ self.btmRightAnchor = btmRightanchor
+ self.originalObj = parentObj
+ self.explicitBoundingBox = None
+ self.useCanvasTransformation = False
+ self.key = key
+ self.cachedSvgImg = None
+ self.cachedDPI = None
+ self.maxDPI=0
+ self.keyIndex = keyIndex
+ self.pen = pen
+ self.fill = fill
+
+ def getInteriorScrTransform(self, transform):
+ """Generates the transform with Interior transform applied beforehand."""
+ if isinstance(transform, Qg.QTransform):
+ transform = asyTransform.fromQTransform(transform)
+ return self.transform * transform * self.baseTransform.inverted()
+
+ @property
+ def transform(self):
+ return self.pTransform
+
+ @transform.setter
+ def transform(self, value):
+ self.pTransform = value
+
+ def setBoundingBoxPs(self, bbox):
+ l, b, r, t = bbox
+ self.explicitBoundingBox = Qc.QRectF(Qc.QPointF(l, b), Qc.QPointF(r, t))
+ # self.explicitBoundingBox = Qc.QRectF(0, 0, 100, 100)
+
+ @property
+ def boundingBox(self):
+ if self.explicitBoundingBox is not None:
+ testBbox = self.explicitBoundingBox
+ else:
+ if isinstance(self.drawObject, Qg.QImage):
+ testBbox = self.drawObject.rect()
+ testBbox.moveTo(self.btmRightAnchor.toPoint())
+ elif isinstance(self.drawObject, Qg.QPainterPath):
+ testBbox = self.baseTransform.toQTransform().mapRect(self.drawObject.boundingRect())
+ else:
+ raise TypeError('drawObject is not a valid type!')
+ pointList = [self.getScreenTransform().toQTransform().map(point) for point in [
+ testBbox.topLeft(), testBbox.topRight(), testBbox.bottomLeft(), testBbox.bottomRight()
+ ]]
+ return Qg.QPolygonF(pointList).boundingRect()
+
+ @property
+ def localBoundingBox(self):
+ testBbox = self.drawObject.rect()
+ testBbox.moveTo(self.btmRightAnchor.toPoint())
+ return testBbox
+
+ def getScreenTransform(self):
+ scrTransf = self.baseTransform.toQTransform().inverted()[0] * self.pTransform.toQTransform()
+ return asyTransform.fromQTransform(scrTransf)
+
+ def draw(self, additionalTransformation=None, applyReverse=False, canvas: Qg.QPainter=None, dpi=300):
+ if canvas is None:
+ canvas = self.mainCanvas
+ if additionalTransformation is None:
+ additionalTransformation = Qg.QTransform()
+
+ assert canvas.isActive()
+
+ canvas.save()
+ if self.pen:
+ oldPen = Qg.QPen(canvas.pen())
+ canvas.setPen(self.pen.toQPen())
+ else:
+ oldPen = Qg.QPen()
+
+ if not applyReverse:
+ canvas.setTransform(additionalTransformation, True)
+ canvas.setTransform(self.transform.toQTransform(), True)
+ else:
+ canvas.setTransform(self.transform.toQTransform(), True)
+ canvas.setTransform(additionalTransformation, True)
+
+ canvas.setTransform(self.baseTransform.toQTransform().inverted()[0], True)
+
+ if isinstance(self.drawObject, Qg.QImage):
+ canvas.drawImage(self.explicitBoundingBox, self.drawObject)
+ elif isinstance(self.drawObject, xs.SvgObject):
+ threshold = 1.44
+
+ if self.cachedDPI is None or self.cachedSvgImg is None \
+ or dpi > self.maxDPI*threshold:
+ self.cachedDPI = dpi
+ self.maxDPI=max(self.maxDPI,dpi)
+ self.cachedSvgImg = self.drawObject.render(dpi)
+
+ canvas.drawImage(self.explicitBoundingBox, self.cachedSvgImg)
+ elif isinstance(self.drawObject, Qs.QSvgRenderer):
+ self.drawObject.render(canvas, self.explicitBoundingBox)
+ elif isinstance(self.drawObject, Qg.QPainterPath):
+ path = self.baseTransform.toQTransform().map(self.drawObject)
+ if self.fill:
+ if self.pen:
+ brush = self.pen.toQPen().brush()
+ else:
+ brush = Qg.QBrush()
+ canvas.fillPath(path, brush)
+ else:
+ canvas.drawPath(path)
+
+ if self.pen:
+ canvas.setPen(oldPen)
+ canvas.restore()
+
+ def collide(self, coords, canvasCoordinates=True):
+ # modify these values to grow/shrink the fuzz.
+ fuzzTolerance = 1
+ marginGrowth = 1
+ leftMargin = marginGrowth if self.boundingBox.width() < fuzzTolerance else 0
+ topMargin = marginGrowth if self.boundingBox.height() < fuzzTolerance else 0
+
+ newMargin = Qc.QMarginsF(leftMargin, topMargin, leftMargin, topMargin)
+ return self.boundingBox.marginsAdded(newMargin).contains(coords)
+
+ def getID(self):
+ return self.originalObj
diff --git a/Build/source/utils/asymptote/GUI/xasyActions.py b/Build/source/utils/asymptote/GUI/xasyActions.py
deleted file mode 100755
index 95411c5d9a4..00000000000
--- a/Build/source/utils/asymptote/GUI/xasyActions.py
+++ /dev/null
@@ -1,391 +0,0 @@
-#!/usr/bin/env python
-###########################################################################
-#
-# xasyActions implements the possible actions and their inverses
-# for the undo/redo stack in xasy
-#
-# Author: Orest Shardt
-# Created: July 23, 2007
-#
-###########################################################################
-import math
-import sys
-import UndoRedoStack
-import xasy2asy
-if sys.version_info >= (3, 0):
- from tkinter import *
-else:
- from Tkinter import *
-
-class translationAction(UndoRedoStack.action):
- def __init__(self,owner,itemList,indexList,translation):
- self.translation = translation
- self.owner = owner
- self.itemList = itemList
- self.indexList = indexList
- UndoRedoStack.action.__init__(self,self.transF,self.unTransF)
-
- def transF(self):
- mag = self.owner.magnification
- for i in range(len(self.itemList)):
- for index in self.indexList[i]:
- self.owner.translateSomething(-1,(self.translation[0]/mag,self.translation[1]/mag),self.itemList[i],index)
- if index==None:
- index = 0
- try:
- self.owner.mainCanvas.move(self.itemList[i].imageList[index].IDTag,self.translation[0]*mag,-self.translation[1]*mag)
- except:
- self.owner.mainCanvas.move(self.itemList[i].IDTag,self.translation[0]*mag,-self.translation[1]*mag)
- self.owner.updateSelection()
- self.owner.updateCanvasSize()
-
- def unTransF(self):
- mag = self.owner.magnification
- for i in range(len(self.itemList)):
- for index in self.indexList[i]:
- self.owner.translateSomething(-1,(-self.translation[0]/mag,-self.translation[1]/mag),self.itemList[i],index)
- try:
- self.owner.mainCanvas.move(self.itemList[i].imageList[index].IDTag,-self.translation[0]*mag,self.translation[1]*mag)
- except:
- self.owner.mainCanvas.move(self.itemList[i].IDTag,-self.translation[0]*mag,self.translation[1]*mag)
- self.owner.updateSelection()
- self.owner.updateCanvasSize()
-
- def __str__(self):
- return "Translation of "+str(self.itemList)+str(self.indexList)+" by "+str(self.translation)
-
-class rotationAction(UndoRedoStack.action):
- def __init__(self,owner,itemList,indexList,angle,origin):
- self.owner = owner
- self.itemList = itemList
- self.indexList = indexList
- self.angle = angle
- self.origin = origin
- UndoRedoStack.action.__init__(self,self.rotF,self.unRotF)
-
- def rotF(self):
- for i in range(len(self.itemList)):
- for index in self.indexList[i]:
- self.owner.rotateSomething(-1,self.angle,self.origin,self.itemList[i],index)
- for item in self.itemList:
- item.drawOnCanvas(self.owner.mainCanvas,self.owner.magnification)
- self.owner.bindItemEvents(item)
- self.owner.updateSelection()
- self.owner.updateCanvasSize()
-
- def unRotF(self):
- for i in range(len(self.itemList)):
- for index in self.indexList[i]:
- self.owner.rotateSomething(-1,-self.angle,self.origin,self.itemList[i],index)
- for item in self.itemList:
- item.drawOnCanvas(self.owner.mainCanvas,self.owner.magnification)
- self.owner.bindItemEvents(item)
- self.owner.updateSelection()
- self.owner.updateCanvasSize()
-
- def __str__(self):
- return "Rotation of "+str(self.itemList)+str(self.indexList)+" by "+"%.3f"%(self.angle*180.0/math.pi)+" about "+str(self.origin)
-
-class addLabelAction(UndoRedoStack.action):
- def __init__(self,owner,label):
- self.owner = owner
- self.label = label
- UndoRedoStack.action.__init__(self,self.addF,self.unAddF)
-
- def addF(self):
- self.owner.addItemToFile(self.label)
- self.label.drawOnCanvas(self.owner.mainCanvas,self.owner.magnification)
- self.owner.bindItemEvents(self.label)
-
- def unAddF(self):
- self.label.removeFromCanvas()
- del self.owner.fileItems[-1]
- self.owner.propList.delete(0)
- self.owner.clearSelection()
-
- def __str__(self):
- return "Addition of a label"
-
-class deleteLabelAction(UndoRedoStack.action):
- def __init__(self,owner,label,index):
- self.owner = owner
- self.label = label
- self.index = index
- UndoRedoStack.action.__init__(self,self.delF,self.unDelF)
-
- def delF(self):
- self.owner.fileItems[self.index].removeFromCanvas()
- self.owner.propList.delete(len(self.owner.fileItems)-self.index-1)
- del self.owner.fileItems[self.index]
-
- def unDelF(self):
- self.owner.fileItems.insert(self.index,self.label)
- self.owner.fileItems[self.index].drawOnCanvas(self.owner.mainCanvas,self.owner.magnification)
- self.owner.propList.insert(len(self.owner.fileItems)-self.index-1,self.owner.describeItem(self.label))
- self.owner.bindItemEvents(self.label)
-
- def __str__(self):
- return "Deletion of a label"
-
-class editLabelTextAction(UndoRedoStack.action):
- def __init__(self,owner,label,newText,oldText):
- self.owner = owner
- self.label = label
- self.newText = newText
- self.oldText = oldText
- UndoRedoStack.action.__init__(self,self.modT,self.unModT)
-
- def modT(self):
- self.label.label.setText(self.newText)
- self.label.drawOnCanvas(self.owner.mainCanvas,self.owner.magnification)
- self.owner.bindItemEvents(self.label)
-
- def unModT(self):
- self.label.label.setText(self.oldText)
- self.label.drawOnCanvas(self.owner.mainCanvas,self.owner.magnification)
- self.owner.bindItemEvents(self.label)
-
- def __str__(self):
- return "Editing a label's text"
-
-class editLabelPenAction(UndoRedoStack.action):
- def __init__(self,owner,oldPen,newPen,index):
- self.owner = owner
- self.newPen = newPen
- self.oldPen = oldPen
- self.index = index
- UndoRedoStack.action.__init__(self,self.editF,self.unEditF)
-
- def editF(self):
- self.owner.fileItems[self.index].removeFromCanvas()
- self.owner.fileItems[self.index].label.pen = self.newPen
- self.owner.fileItems[self.index].drawOnCanvas(self.owner.mainCanvas,self.owner.magnification)
- self.owner.bindItemEvents(self.owner.fileItems[self.index])
-
- def unEditF(self):
- self.owner.fileItems[self.index].removeFromCanvas()
- self.owner.fileItems[self.index].label.pen = self.oldPen
- self.owner.fileItems[self.index].drawOnCanvas(self.owner.mainCanvas,self.owner.magnification)
- self.owner.bindItemEvents(self.owner.fileItems[self.index])
-
- def __str__(self):
- return "Changing a label's pen"
-
-class addScriptAction(UndoRedoStack.action):
- def __init__(self,owner,script):
- self.owner = owner
- self.script = script
- UndoRedoStack.action.__init__(self,self.addF,self.unAddF)
-
- def addF(self):
- self.owner.addItemToFile(self.script)
- self.script.drawOnCanvas(self.owner.mainCanvas,self.owner.magnification)
- self.owner.bindItemEvents(self.script)
-
- def unAddF(self):
- self.script.removeFromCanvas()
- del self.owner.fileItems[-1]
- self.owner.propList.delete(0)
- self.owner.clearSelection()
-
- def __str__(self):
- return "Addition of a script"
-
-class deleteScriptAction(UndoRedoStack.action):
- def __init__(self,owner,script,index):
- self.owner = owner
- self.script = script
- self.index = index
- UndoRedoStack.action.__init__(self,self.delF,self.unDelF)
-
- def delF(self):
- self.owner.fileItems[self.index].removeFromCanvas()
- self.owner.propList.delete(len(self.owner.fileItems)-self.index-1)
- del self.owner.fileItems[self.index]
-
- def unDelF(self):
- self.owner.fileItems.insert(self.index,self.script)
- self.owner.fileItems[self.index].drawOnCanvas(self.owner.mainCanvas,self.owner.magnification)
- self.owner.propList.insert(len(self.owner.fileItems)-self.index-1,self.owner.describeItem(self.script))
- self.owner.bindItemEvents(self.script)
-
- def __str__(self):
- return "Deletion of a script"
-
-class deleteScriptItemAction(UndoRedoStack.action):
- def __init__(self,owner,script,indices,oldTransforms):
- self.owner = owner
- self.script = script
- self.indices = indices[:]
- UndoRedoStack.action.__init__(self,self.delI,self.unDelI)
- def delI(self):
- for index in self.indices:
- self.script.transform[index].deleted = True
- self.owner.mainCanvas.delete(self.script.imageList[index].IDTag)
-
- def unDelI(self):
- for i in range(len(self.indices)):
- index = self.indices[i]
- self.script.transform[index].deleted = False
- bbox = self.script.imageList[index].originalImage.bbox
- self.script.imageList[index].IDTag = self.owner.mainCanvas.create_image(bbox[0],-bbox[3],anchor=NW,tags=("image"),image=self.script.imageList[index].itk)
- self.owner.bindEvents(self.script.imageList[index].IDTag)
- self.owner.resetStacking()
-
- def __str__(self):
- return "Deletion of item "+str(self.indices)+" in "+str(self.script)
-
-class editScriptAction(UndoRedoStack.action):
- def __init__(self,owner,script,newText,oldText):
- self.owner = owner
- self.script = script
- self.newText = newText
- self.oldText = oldText
- UndoRedoStack.action.__init__(self,self.modS,self.unModS)
-
- def modS(self):
- self.script.setScript(self.newText)
- self.script.drawOnCanvas(self.owner.mainCanvas,self.owner.magnification)
- self.owner.bindItemEvents(self.script)
-
- def unModS(self):
- self.script.setScript(self.oldText)
- self.script.drawOnCanvas(self.owner.mainCanvas,self.owner.magnification)
- self.owner.bindItemEvents(self.script)
-
- def __str__(self):
- return "Modification of a script"
-
-class clearItemTransformsAction(UndoRedoStack.action):
- def __init__(self,owner,item,oldTransforms):
- self.owner = owner
- self.item = item
- self.oldTransforms = oldTransforms
- UndoRedoStack.action.__init__(self,self.clearF,self.unClearF)
-
- def clearF(self):
- for i in range(len(self.oldTransforms)):
- self.item.transform[i] = xasy2asy.identity()
- self.item.drawOnCanvas(self.owner.mainCanvas,self.owner.magnification)
-
- def unClearF(self):
- for i in range(len(self.oldTransforms)):
- self.item.transform[i] = self.oldTransforms[i]
- self.item.drawOnCanvas(self.owner.mainCanvas,self.owner.magnification)
-
- def __str__(self):
- return "Clear the transforms of "+str(self.item)+" from "+str(self.oldTransforms)
-
-class itemRaiseAction(UndoRedoStack.action):
- def __init__(self,owner,items,oldPositions):
- self.owner = owner
- self.items = items[:]
- self.oldPositions = oldPositions[:]
- UndoRedoStack.action.__init__(self,self.raiseI,self.unRaiseI)
-
- def raiseI(self):
- for item in self.items:
- self.owner.raiseSomething(item)
-
- def unRaiseI(self):
- length = len(self.owner.fileItems)
- indices = self.oldPositions[:]
- indices = [length-i-1 for i in indices]
- indices.reverse()
- for index in indices:
- for i in range(index):
- self.owner.raiseSomething(self.owner.fileItems[length-index-1])
-
- def __str__(self):
- return "Raise items "+str(self.items)+" from positions "+str(self.oldPositions)
-
-class itemLowerAction(UndoRedoStack.action):
- def __init__(self,owner,items,oldPositions):
- self.owner = owner
- self.items = items[:]
- self.oldPositions = oldPositions[:]
- UndoRedoStack.action.__init__(self,self.lowerI,self.unLowerI)
-
- def lowerI(self):
- for item in self.items:
- self.owner.lowerSomething(item)
-
- def unLowerI(self):
- indices = self.oldPositions[:]
- indices.reverse()
- for index in indices:
- for i in range(index):
- self.owner.lowerSomething(self.owner.fileItems[index])
-
- def __str__(self):
- return "Lower items "+str(self.items)+" from positions "+str(self.oldPositions)
-
-class addDrawnItemAction(UndoRedoStack.action):
- def __init__(self,owner,item):
- self.owner = owner
- self.item = item
- UndoRedoStack.action.__init__(self,self.drawF,self.unDrawF)
-
- def drawF(self):
- self.owner.addItemToFile(self.item)
- self.item.drawOnCanvas(self.owner.mainCanvas,self.owner.magnification,forceAddition=True)
- self.owner.bindItemEvents(self.item)
-
- def unDrawF(self):
- self.item.removeFromCanvas(self.owner.mainCanvas)
- del self.owner.fileItems[-1]
- self.owner.propList.delete(0)
- self.owner.clearSelection()
-
- def __str__(self):
- return "Drawing of an item"
-
-class deleteDrawnItemAction(UndoRedoStack.action):
- def __init__(self,owner,item,index):
- self.owner = owner
- self.item = item
- self.index = index
- UndoRedoStack.action.__init__(self,self.delF,self.unDelF)
-
- def delF(self):
- self.owner.fileItems[self.index].removeFromCanvas(self.owner.mainCanvas)
- self.owner.propList.delete(len(self.owner.fileItems)-self.index-1)
- del self.owner.fileItems[self.index]
-
- def unDelF(self):
- self.owner.fileItems.insert(self.index,self.item)
- self.owner.fileItems[self.index].drawOnCanvas(self.owner.mainCanvas,self.owner.magnification,forceAddition=True)
- self.owner.propList.insert(len(self.owner.fileItems)-self.index-1,self.owner.describeItem(self.item))
- self.owner.bindItemEvents(self.item)
-
- def __str__(self):
- return "Deletion of a drawn item"
-
-class editDrawnItemAction(UndoRedoStack.action):
- def __init__(self,owner,oldItem,newItem,index):
- self.owner = owner
- self.oldItem = oldItem
- self.newItem = newItem
- self.index = index
- UndoRedoStack.action.__init__(self,self.editF,self.unEditF)
-
- def editF(self):
- self.owner.fileItems[self.index].removeFromCanvas(self.owner.mainCanvas)
- self.owner.fileItems[self.index].path = self.newItem.path
- self.owner.fileItems[self.index].pen = self.newItem.pen
- self.owner.fileItems[self.index].transform = self.newItem.transform
- self.owner.fileItems[self.index].IDTag = self.newItem.IDTag
- self.owner.fileItems[self.index].drawOnCanvas(self.owner.mainCanvas,self.owner.magnification,forceAddition=True)
- self.owner.bindItemEvents(self.owner.fileItems[self.index])
-
- def unEditF(self):
- self.owner.fileItems[self.index].removeFromCanvas(self.owner.mainCanvas)
- self.owner.fileItems[self.index].path = self.oldItem.path
- self.owner.fileItems[self.index].pen = self.oldItem.pen
- self.owner.fileItems[self.index].transform = self.oldItem.transform
- self.owner.fileItems[self.index].IDTag = self.oldItem.IDTag
- self.owner.fileItems[self.index].drawOnCanvas(self.owner.mainCanvas,self.owner.magnification,forceAddition=True)
- self.owner.bindItemEvents(self.owner.fileItems[self.index])
-
- def __str__(self):
- return "Modification of a drawn item"
diff --git a/Build/source/utils/asymptote/GUI/xasyArgs.py b/Build/source/utils/asymptote/GUI/xasyArgs.py
new file mode 100644
index 00000000000..045f4bc6692
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/xasyArgs.py
@@ -0,0 +1,23 @@
+#!/usr/bin/env python3
+import argparse
+import xasyVersion
+import PyQt5.QtCore as Qc
+# Add arguments here.
+
+
+def parseArgs(args):
+ parser = argparse.ArgumentParser(args)
+ parser.add_argument('-p', '--asypath', help='Custom Asymptote asy executable')
+ parser.add_argument('-v', '--version', help='Version number', action='version',
+ version='xasy v{0}'.format(xasyVersion.xasyVersion))
+ parser.add_argument('-l', '--language', help='language')
+ parser.add_argument('-x', '--mag', help='Magnification. Defaults to 1', default=1, type=float)
+
+ parser.add_argument(
+ 'filename', help='Filename to load. If empty, initializes empty xasy canvas.', nargs='?', default=None)
+
+ return parser.parse_args()
+
+
+def getArgs():
+ return parseArgs(Qc.QCoreApplication.arguments())
diff --git a/Build/source/utils/asymptote/GUI/xasyBezierEditor.py b/Build/source/utils/asymptote/GUI/xasyBezierEditor.py
deleted file mode 100755
index 75ddeafa2d2..00000000000
--- a/Build/source/utils/asymptote/GUI/xasyBezierEditor.py
+++ /dev/null
@@ -1,213 +0,0 @@
-#!/usr/bin/env python
-###########################################################################
-#
-# xasyBezierEditor implements the ability to graphically edit the location
-# of the nodes and control points of a bezier curve.
-#
-#
-# Author: Orest Shardt
-# Created: June 29, 2007
-#
-###########################################################################
-
-import math
-import sys
-from CubicBezier import *
-import xasy2asy
-
-if sys.version_info >= (3, 0):
- from tkinter import *
-else:
- from Tkinter import *
-
-class node:
- def __init__(self,precontrol,node,postcontrol,uid,isTied = True):
- self.node = node
- self.precontrol = precontrol
- self.postcontrol = postcontrol
- self.isTied = isTied
- self.uid = uid
- self.nodeID = self.precontrolID = self.prelineID = self.postcontrolID = self.postlineID = None
-
- def shiftNode(self,delta):
- self.node = (self.node[0]+delta[0],self.node[1]+delta[1])
- if self.precontrol != None:
- self.precontrol = (self.precontrol[0]+delta[0],self.precontrol[1]+delta[1])
- if self.postcontrol != None:
- self.postcontrol = (self.postcontrol[0]+delta[0],self.postcontrol[1]+delta[1])
-
- def shiftPrecontrol(self,delta):
- self.precontrol = (self.precontrol[0]+delta[0],self.precontrol[1]+delta[1])
- if self.isTied and self.postcontrol != None:
- self.rotatePostControl(self.precontrol)
-
- def shiftPostcontrol(self,delta):
- self.postcontrol = (self.postcontrol[0]+delta[0],self.postcontrol[1]+delta[1])
- if self.isTied and self.precontrol != None:
- self.rotatePrecontrol(self.postcontrol)
-
- def rotatePrecontrol(self,after):
- vx,vy = after[0]-self.node[0],after[1]-self.node[1]
- l = norm((vx,vy))
- if l == 0:
- return
- m = norm((self.precontrol[0]-self.node[0],self.precontrol[1]-self.node[1]))
- vx = -m*vx/l
- vy = -m*vy/l
- self.precontrol = self.node[0]+vx,self.node[1]+vy
-
- def rotatePostControl(self,after):
- vx,vy = after[0]-self.node[0],after[1]-self.node[1]
- l = norm((vx,vy))
- if l == 0:
- return
- m = norm((self.postcontrol[0]-self.node[0],self.postcontrol[1]-self.node[1]))
- vx = -m*vx/l
- vy = -m*vy/l
- self.postcontrol = self.node[0]+vx,self.node[1]+vy
-
- def draw(self,canvas):
- width = 3
- if self.precontrol != None:
- if self.prelineID == None:
- self.prelineID = canvas.create_line(self.precontrol[0],-self.precontrol[1],self.node[0],-self.node[1],tags=("preline",self.uid))
- else:
- canvas.coords(self.prelineID,self.precontrol[0],-self.precontrol[1],self.node[0],-self.node[1])
- if self.precontrolID == None:
- self.precontrolID = canvas.create_oval(self.precontrol[0]-width,-self.precontrol[1]-width,self.precontrol[0]+width,-self.precontrol[1]+width,
- fill="red",outline="black",tags=("precontrol",self.uid))
- else:
- canvas.coords(self.precontrolID,self.precontrol[0]-width,-self.precontrol[1]-width,self.precontrol[0]+width,-self.precontrol[1]+width)
- if self.postcontrol != None:
- if self.postlineID == None:
- self.postlineID = canvas.create_line(self.postcontrol[0],-self.postcontrol[1],self.node[0],-self.node[1],tags=("postline",self.uid))
- else:
- canvas.coords(self.postlineID,self.postcontrol[0],-self.postcontrol[1],self.node[0],-self.node[1])
- if self.postcontrolID == None:
- self.postcontrolID = canvas.create_oval(self.postcontrol[0]-width,-self.postcontrol[1]-width,self.postcontrol[0]+width,-self.postcontrol[1]+width,
- fill="red",outline="black",tags=("postcontrol",self.uid))
- else:
- canvas.coords(self.postcontrolID,self.postcontrol[0]-width,-self.postcontrol[1]-width,self.postcontrol[0]+width,-self.postcontrol[1]+width)
- if self.isTied:
- color = "blue"
- else:
- color = "green"
- if self.nodeID == None:
- self.nodeID = canvas.create_oval(self.node[0]-width,-self.node[1]-width,self.node[0]+width,-self.node[1]+width,
- fill=color,outline="black",tags=("node",self.uid))
- else:
- canvas.coords(self.nodeID,self.node[0]-width,-self.node[1]-width,self.node[0]+width,-self.node[1]+width)
- canvas.itemconfigure(self.nodeID,fill=color)
-
-class xasyBezierEditor:
- def __init__(self,parent,shape,canvas):
- self.parent = parent
- self.shape = shape
- self.transform = self.shape.transform[0]
- self.path = self.shape.path
- self.canvas = canvas
- self.modified = False
- self.path.computeControls()
- isCyclic = self.path.nodeSet[-1] == 'cycle'
- segments = len(self.path.controlSet)
- self.nodeList = []
- for i in range(segments):
- if i == 0:
- node0 = self.transform*self.path.nodeSet[i]
- control = self.transform*self.path.controlSet[i][0]
- self.nodeList.append(node(None,node0,control,len(self.nodeList)))
- else:
- node0 = self.transform*self.path.nodeSet[i]
- precontrol = self.transform*self.path.controlSet[i-1][1]
- postcontrol = self.transform*self.path.controlSet[i][0]
- self.nodeList.append(node(precontrol,node0,postcontrol,len(self.nodeList)))
- if not isCyclic:
- node0 = self.transform*self.path.nodeSet[-1]
- precontrol = self.transform*self.path.controlSet[-1][1]
- self.nodeList.append(node(precontrol,node0,None,len(self.nodeList)))
- else:
- self.nodeList[0].precontrol = self.transform*self.path.controlSet[-1][1]
- self.showControls()
- self.bindNodeEvents()
- self.bindControlEvents()
-
- def showControls(self):
- for n in self.nodeList:
- n.draw(self.canvas)
- self.bindNodeEvents()
- self.bindControlEvents()
- self.parent.updateCanvasSize()
-
- def bindNodeEvents(self):
- self.canvas.tag_bind("node","<B1-Motion>",self.nodeDrag)
- self.canvas.tag_bind("node","<Button-1>",self.buttonDown)
- self.canvas.tag_bind("node","<Double-Button-1>",self.toggleNode)
-
- def unbindNodeEvents(self):
- self.canvas.tag_unbind("node","<B1-Motion>")
- self.canvas.tag_unbind("node","<Button-1>")
- self.canvas.tag_unbind("node","<Double-Button-1>")
-
- def bindControlEvents(self):
- self.canvas.tag_bind("precontrol || postcontrol","<B1-Motion>",self.controlDrag)
- self.canvas.tag_bind("precontrol || postcontrol","<Button-1>",self.buttonDown)
-
- def unbindControlEvents(self):
- self.canvas.tag_unbind("precontrol || postcontrol","<B1-Motion>")
- self.canvas.tag_unbind("precontrol || postcontrol","<Button-1>")
-
- def buttonDown(self,event):
- self.parent.freeMouseDown = False
- self.startx,self.starty = event.x,event.y
-
- def toggleNode(self,event):
- self.parent.freeMouseDown = False
- tags = self.canvas.gettags(CURRENT)
- obj = tags[0]
- uid = int(tags[1])
- self.nodeList[uid].isTied = not self.nodeList[uid].isTied
- self.showControls()
-
- def nodeDrag(self,event):
- self.parent.freeMouseDown = False
- deltax = event.x-self.startx
- deltay = event.y-self.starty
- tags = self.canvas.gettags(CURRENT)
- obj = tags[0]
- uid = int(tags[1])
- self.nodeList[uid].shiftNode((deltax,-deltay))
- self.startx,self.starty = event.x,event.y
- self.applyChanges()
- self.showControls()
- self.shape.drawOnCanvas(self.canvas,self.parent.magnification)
-
- def controlDrag(self,event):
- self.parent.freeMouseDown = False
- deltax = event.x-self.startx
- deltay = event.y-self.starty
- tags = self.canvas.gettags(CURRENT)
- obj = tags[0]
- uid = int(tags[1])
- if obj == "precontrol":
- self.nodeList[uid].shiftPrecontrol((deltax,-deltay))
- elif obj == "postcontrol":
- self.nodeList[uid].shiftPostcontrol((deltax,-deltay))
- self.startx,self.starty = event.x,event.y
- self.applyChanges()
- self.showControls()
- self.shape.drawOnCanvas(self.canvas,self.parent.magnification)
-
- def applyChanges(self):
- self.modified = True
- self.shape.transform[0] = xasy2asy.asyTransform((0,0,1,0,0,1))
- for i in range(len(self.nodeList)):
- self.path.nodeSet[i] = self.nodeList[i].node
- if self.nodeList[i].postcontrol != None:
- self.path.controlSet[i][0] = self.nodeList[i].postcontrol
- if self.nodeList[i].precontrol != None:
- self.path.controlSet[i-1][1] = self.nodeList[i].precontrol
-
- def endEdit(self):
- self.unbindNodeEvents()
- self.unbindControlEvents()
- self.canvas.delete("node || precontrol || postcontrol || preline || postline")
diff --git a/Build/source/utils/asymptote/GUI/xasyBezierInterface.py b/Build/source/utils/asymptote/GUI/xasyBezierInterface.py
new file mode 100644
index 00000000000..0a5c689bffe
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/xasyBezierInterface.py
@@ -0,0 +1,375 @@
+#!/usr/bin/env python3
+
+import xasy2asy as x2a
+import xasyUtils as xu
+
+import PyQt5.QtCore as Qc
+import PyQt5.QtGui as Qg
+import PyQt5.QtWidgets as Qw
+
+import Widg_editBezier as Web
+
+import InplaceAddObj
+
+import math
+
+class CurrentlySelctedType:
+ none = -1
+ node = 0
+ ctrlPoint = 1
+
+class InteractiveBezierEditor(InplaceAddObj.InplaceObjProcess):
+ editAccepted = Qc.pyqtSignal()
+ editRejected = Qc.pyqtSignal()
+
+ def __init__(self, parent: Qc.QObject, obj: x2a.xasyDrawnItem, info: dict={}):
+ super().__init__(parent)
+ self.info = info
+ self.asyPathBackup = x2a.asyPath.fromPath(obj.path)
+ self.asyPath = obj.path
+ self.curveMode = self.asyPath.containsCurve
+ assert isinstance(self.asyPath, x2a.asyPath)
+ self.transf = obj.transfKeymap[obj.transfKey][0]
+ self._active = True
+
+ self.currentSelMode = None
+ # (Node index, Node subindex for )
+ self.currentSelIndex = (None, 0)
+
+ self.nodeSelRects = []
+ self.ctrlSelRects = []
+
+ self.setSelectionBoundaries()
+
+ self.lastSelPoint = None
+ self.preCtrlOffset = None
+ self.postCtrlOffset = None
+ self.inTransformMode = False
+
+ self.opt = None
+
+ self.prosectiveNodes = []
+ self.prospectiveCtrlPts = []
+
+ def setSelectionBoundaries(self):
+ self.nodeSelRects = self.handleNodeSelectionBounds()
+
+ if self.curveMode:
+ self.ctrlSelRects = self.handleCtrlSelectionBoundaries()
+
+ def handleNodeSelectionBounds(self):
+ nodeSelectionBoundaries = []
+
+ for node in self.asyPath.nodeSet:
+ if node == 'cycle':
+ nodeSelectionBoundaries.append(None)
+ continue
+
+ selEpsilon = 6/self.info['magnification']
+ newRect = Qc.QRect(0, 0, 2 * selEpsilon, 2 * selEpsilon)
+ x, y = self.transf * node
+ x = int(round(x))
+ y = int(round(y))
+ newRect.moveCenter(Qc.QPoint(x, y))
+
+ nodeSelectionBoundaries.append(newRect)
+
+ return nodeSelectionBoundaries
+
+ def handleCtrlSelectionBoundaries(self):
+ ctrlPointSelBoundaries = []
+
+ for nodes in self.asyPath.controlSet:
+ nodea, nodeb = nodes
+
+ selEpsilon = 6/self.info['magnification']
+
+ newRect = Qc.QRect(0, 0, 2 * selEpsilon, 2 * selEpsilon)
+ newRectb = Qc.QRect(0, 0, 2 * selEpsilon, 2 * selEpsilon)
+
+ x, y = self.transf * nodea
+ x2, y2 = self.transf * nodeb
+
+ x = int(round(x))
+ y = int(round(y))
+
+ x2 = int(round(x2))
+ y2 = int(round(y2))
+
+ newRect.moveCenter(Qc.QPoint(x, y))
+ newRectb.moveCenter(Qc.QPoint(x2, y2))
+
+ ctrlPointSelBoundaries.append((newRect, newRectb))
+
+ return ctrlPointSelBoundaries
+
+ def postDrawPreview(self, canvas: Qg.QPainter):
+ assert canvas.isActive()
+
+ dashedPen = Qg.QPen(Qc.Qt.DashLine)
+ dashedPen.setWidthF(1/self.info['magnification'])
+ # draw the base points
+ canvas.save()
+ canvas.setWorldTransform(self.transf.toQTransform(), True)
+
+ epsilonSize = 6/self.info['magnification']
+
+ if self.info['autoRecompute'] or not self.curveMode:
+ ctrlPtsColor = 'gray'
+ else:
+ ctrlPtsColor = 'red'
+
+ canvas.setPen(dashedPen)
+
+ canvas.drawPath(self.asyPath.toQPainterPath())
+
+ nodePen = Qg.QPen(Qg.QColor('blue'))
+ nodePen.setWidthF(1/self.info['magnification'])
+
+ ctlPtsPen = Qg.QPen(Qg.QColor(ctrlPtsColor))
+ ctlPtsPen.setWidthF(1/self.info['magnification'])
+
+ for index in range(len(self.asyPath.nodeSet)):
+ point = self.asyPath.nodeSet[index]
+
+ if point != 'cycle':
+ basePoint = Qc.QPointF(point[0], point[1])
+ canvas.setPen(nodePen)
+ canvas.drawEllipse(basePoint, epsilonSize, epsilonSize)
+ else:
+ point = self.asyPath.nodeSet[0]
+ basePoint = Qc.QPointF(point[0], point[1])
+ if self.curveMode:
+ if index != 0:
+ canvas.setPen(ctlPtsPen)
+ postCtrolSet = self.asyPath.controlSet[index - 1][1]
+ postCtrlPoint = Qc.QPointF(postCtrolSet[0], postCtrolSet[1])
+ canvas.drawEllipse(postCtrlPoint, epsilonSize, epsilonSize)
+
+ canvas.setPen(dashedPen)
+ canvas.drawLine(basePoint, postCtrlPoint)
+
+ if index != len(self.asyPath.nodeSet) - 1:
+ canvas.setPen(ctlPtsPen)
+ preCtrlSet = self.asyPath.controlSet[index][0]
+ preCtrlPoint = Qc.QPointF(preCtrlSet[0], preCtrlSet[1])
+ canvas.drawEllipse(preCtrlPoint, epsilonSize, epsilonSize)
+
+ canvas.setPen(dashedPen)
+ canvas.drawLine(basePoint, preCtrlPoint)
+
+ canvas.restore()
+
+ def getPreAndPostCtrlPts(self, index):
+ isCycle = self.asyPath.nodeSet[-1] == 'cycle'
+
+ if index == 0 and not isCycle:
+ preCtrl = None
+ else:
+ preCtrl = self.asyPath.controlSet[index - 1][1]
+
+ if index == len(self.asyPath.nodeSet) - 1 and not isCycle:
+ postCtrl = None
+ else:
+ postCtrl = self.asyPath.controlSet[index % (len(self.asyPath.nodeSet) - 1)][0]
+
+ return preCtrl, postCtrl
+
+ def findLinkingNode(self, index, subindex):
+ """index and subindex are of the control points list."""
+ if subindex == 0:
+ return index
+ else:
+ if self.asyPath.nodeSet[index + 1] == 'cycle':
+ return 0
+ else:
+ return index + 1
+
+ def resetObj(self):
+ self.asyPath.setInfo(self.asyPathBackup)
+ self.setSelectionBoundaries()
+
+ def mouseDown(self, pos, info, mouseEvent: Qg.QMouseEvent=None):
+ self.lastSelPoint = pos
+ if self.inTransformMode:
+ return
+
+ if self.prosectiveNodes and not self.inTransformMode:
+ self.currentSelMode = CurrentlySelctedType.node
+ self.currentSelIndex = (self.prosectiveNodes[0], 0)
+ self.inTransformMode = True
+ self.parentNodeIndex = self.currentSelIndex[0]
+ elif self.prospectiveCtrlPts and not self.inTransformMode:
+ self.currentSelMode = CurrentlySelctedType.ctrlPoint
+ self.currentSelIndex = self.prospectiveCtrlPts[0]
+ self.inTransformMode = True
+ self.parentNodeIndex = self.findLinkingNode(*self.currentSelIndex)
+
+ if self.inTransformMode:
+ parentNode = self.asyPath.nodeSet[self.parentNodeIndex]
+
+ # find the offset of each control point to the node
+ if not self.curveMode:
+ return
+
+ preCtrl, postCtrl = self.getPreAndPostCtrlPts(self.parentNodeIndex)
+
+ if parentNode == 'cycle':
+ parentNode = self.asyPath.nodeSet[0]
+ self.parentNodeIndex = 0
+
+ if preCtrl is not None:
+ self.preCtrlOffset = xu.funcOnList(
+ preCtrl, parentNode, lambda a, b: a - b)
+ else:
+ self.preCtrlOffset = None
+
+ if postCtrl is not None:
+ self.postCtrlOffset = xu.funcOnList(
+ postCtrl, parentNode, lambda a, b: a - b)
+ else:
+ self.postCtrlOffset = None
+
+ def mouseMove(self, pos, event: Qg.QMouseEvent):
+ if self.currentSelMode is None and not self.inTransformMode:
+ # in this case, search for prosective nodes.
+ prospectiveNodes = []
+ prospectiveCtrlpts = []
+
+ for i in range(len(self.nodeSelRects)):
+ rect = self.nodeSelRects[i]
+ if rect is None:
+ continue
+ if rect.contains(pos):
+ prospectiveNodes.append(i)
+
+ self.prosectiveNodes = prospectiveNodes
+
+ if not self.info['autoRecompute'] and self.curveMode:
+ for i in range(len(self.ctrlSelRects)):
+ recta, rectb = self.ctrlSelRects[i]
+
+ if recta.contains(pos):
+ prospectiveCtrlpts.append((i, 0))
+
+ if rectb.contains(pos):
+ prospectiveCtrlpts.append((i, 1))
+
+ self.prospectiveCtrlPts = prospectiveCtrlpts
+ else:
+ self.prospectiveCtrlPts = []
+
+
+ if self.inTransformMode:
+ index, subindex = self.currentSelIndex
+ deltaPos = pos - self.lastSelPoint
+ newNode = (pos.x(), pos.y())
+ if self.currentSelMode == CurrentlySelctedType.node:
+ # static throughout the moving
+ if self.asyPath.nodeSet[index] == 'cycle':
+ return
+
+ self.asyPath.setNode(index, newNode)
+ # if also move node:
+
+ if self.curveMode:
+ checkPre, checkPost = self.getPreAndPostCtrlPts(index)
+
+ if 1 == 1: # TODO: Replace this with an option to also move control pts.
+ if checkPre is not None:
+ self.asyPath.controlSet[index - 1][1] = xu.funcOnList(
+ newNode, self.preCtrlOffset, lambda a, b: a + b
+ )
+ if checkPost is not None:
+ self.asyPath.controlSet[index][0] = xu.funcOnList(
+ newNode, self.postCtrlOffset, lambda a, b: a + b
+ )
+
+ if self.info['autoRecompute']:
+ self.quickRecalculateCtrls()
+
+
+ elif self.currentSelMode == CurrentlySelctedType.ctrlPoint and self.curveMode:
+ self.asyPath.controlSet[index][subindex] = newNode
+ parentNode = self.asyPath.nodeSet[self.parentNodeIndex]
+
+ if parentNode == 'cycle':
+ parentNode = self.asyPath.nodeSet[0]
+ isCycle = True
+ else:
+ isCycle = False
+
+ if self.parentNodeIndex == 0 and self.asyPath.nodeSet[-1] == 'cycle':
+ isCycle = True
+
+ rawNewNode = xu.funcOnList(newNode, parentNode, lambda a, b: a - b)
+ rawAngle = math.atan2(rawNewNode[1], rawNewNode[0])
+ newNorm = xu.twonorm(rawNewNode)
+
+
+ if self.info['editBezierlockMode'] >= Web.LockMode.angleLock:
+ otherIndex = 1 - subindex # 1 if 0, 0 otherwise.
+ if otherIndex == 0:
+ if index < (len(self.asyPath.controlSet) - 1) or isCycle:
+ newIndex = 0 if isCycle else index + 1
+
+ oldOtherCtrlPnt = xu.funcOnList(
+ self.asyPath.controlSet[newIndex][0], parentNode, lambda a, b: a - b)
+
+ if self.info['editBezierlockMode'] >= Web.LockMode.angleAndScaleLock:
+ rawNorm = newNorm
+ else:
+ rawNorm = xu.twonorm(oldOtherCtrlPnt)
+
+ newPnt = (rawNorm * math.cos(rawAngle + math.pi),
+ rawNorm * math.sin(rawAngle + math.pi))
+
+ self.asyPath.controlSet[newIndex][0] = xu.funcOnList(
+ newPnt, parentNode, lambda a, b: a + b)
+ else:
+ if index > 0 or isCycle:
+ newIndex = -1 if isCycle else index - 1
+ oldOtherCtrlPnt = xu.funcOnList(
+ self.asyPath.controlSet[newIndex][1], parentNode, lambda a, b: a - b)
+
+ if self.info['editBezierlockMode'] >= Web.LockMode.angleAndScaleLock:
+ rawNorm = newNorm
+ else:
+ rawNorm = xu.twonorm(oldOtherCtrlPnt)
+
+ newPnt = (rawNorm * math.cos(rawAngle + math.pi),
+ rawNorm * math.sin(rawAngle + math.pi))
+ self.asyPath.controlSet[newIndex][1] = xu.funcOnList(
+ newPnt, parentNode, lambda a, b: a + b)
+
+ def recalculateCtrls(self):
+ self.quickRecalculateCtrls()
+ self.setSelectionBoundaries()
+
+ def quickRecalculateCtrls(self):
+ self.asyPath.controlSet.clear()
+ self.asyPath.computeControls()
+
+ def mouseRelease(self):
+ if self.inTransformMode:
+ self.inTransformMode = False
+ self.currentSelMode = None
+
+ self.setSelectionBoundaries()
+
+ def forceFinalize(self):
+ self.objectUpdated.emit()
+
+ def createOptWidget(self, info):
+ self.opt = Web.Widg_editBezier(self.info, self.curveMode)
+ self.opt.ui.btnOk.clicked.connect(self.editAccepted)
+ self.opt.ui.btnCancel.clicked.connect(self.editRejected)
+ self.opt.ui.btnForceRecompute.clicked.connect(self.recalculateCtrls)
+
+ return self.opt
+
+ def getObject(self):
+ pass
+
+ def getXasyObject(self):
+ pass
diff --git a/Build/source/utils/asymptote/GUI/xasyCodeEditor.py b/Build/source/utils/asymptote/GUI/xasyCodeEditor.py
deleted file mode 100755
index 8f3de4034fe..00000000000
--- a/Build/source/utils/asymptote/GUI/xasyCodeEditor.py
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/usr/bin/env python
-###########################################################################
-#
-# xasyCodeEditor implements a simple text editor for Asymptote scripts in
-# xasy.
-#
-#
-# Author: Orest Shardt
-# Created: June 29, 2007
-#
-############################################################################
-
-from subprocess import call
-from tempfile import mkstemp
-from os import remove
-from os import fdopen
-from os import path
-import xasyOptions
-
-def getText(text=""):
- """Launch the external editor"""
- temp = mkstemp()
- tempf = fdopen(temp[0],"w")
- tempf.write(text)
- tempf.close()
- try:
- cmdpath,cmd = path.split(path.expandvars(xasyOptions.options['externalEditor']))
- split_cmd = cmd.split()
- cmdpart = [path.join(cmdpath,split_cmd[0])]
- argpart = split_cmd[1:]+[temp[1]]
- arglist = cmdpart+argpart
- call(arglist)
- except Exception as e:
- raise Exception('Error launching external editor.')
-
- try:
- tempf = open(temp[1],"r")
- text = tempf.read()
- tempf.close()
- remove(temp[1])
- except Exception as e:
- raise Exception('Error reading from external editor.')
- return text
-
-if __name__ == '__main__':
- #run a test
- print (getText("Here is some text to edit"))
diff --git a/Build/source/utils/asymptote/GUI/xasyColorPicker.py b/Build/source/utils/asymptote/GUI/xasyColorPicker.py
deleted file mode 100755
index 217835bdbb0..00000000000
--- a/Build/source/utils/asymptote/GUI/xasyColorPicker.py
+++ /dev/null
@@ -1,240 +0,0 @@
-#!/usr/bin/env python
-###########################################################################
-#
-# xasyColorPicker implements a dialog that allows a user to choose a color
-# from those already defined in Asymptote or a custom RGB color.
-#
-#
-# Author: Orest Shardt
-# Created: June 29, 2007
-#
-############################################################################
-
-import sys
-
-if sys.version_info >= (3, 0):
- from tkinter import *
- from tkinter import colorchooser
-else:
- from Tkinter import *
- import tkColorChooser as colorchooser
-
-asyColors = { "black":(0,0,0),
- "white":(1,1,1),
- "gray":(0.5,0.5,0.5),
- "red":(1,0,0),
- "green":(0,1,0),
- "blue":(0,0,1),
- "cmyk":(1,1,1),
- "Cyan":(0,1,1),
- "Magenta":(1,0,1),
- "Yellow":(1,1,0),
- "Black":(0,0,0),
- "cyan":(0,1,1),
- "magenta":(1,0,1),
- "yellow":(1,1,0),
- "palered":(1,0.75,0.75),
- "palegreen":(0.75,1,0.75),
- "paleblue":(0.75,0.75,1),
- "palecyan":(0.75,1,1),
- "palemagenta":(1,0.75,1),
- "paleyellow":(1,1,0.75),
- "palegray":(0.95,0.95,0.95),
- "lightred":(1,0.5,0.5),
- "lightgreen":(0.5,1,0.5),
- "lightblue":(0.5,0.5,1),
- "lightcyan":(0.5,1,1),
- "lightmagenta":(1,0.5,1),
- "lightyellow":(1,1,0.5),
- "lightgray":(0.9,0.9,0.9),
- "mediumred":(1,0.25,0.25),
- "mediumgreen":(0.25,1,0.25),
- "mediumblue":(0.25,0.25,1),
- "mediumcyan":(0.25,1,1),
- "mediummagenta":(1,0.25,1),
- "mediumyellow":(1,1,0.25),
- "mediumgray":(0.75,0.75,0.75),
- "heavyred":(0.75,0,0),
- "heavygreen":(0,0.75,0),
- "heavyblue":(0,0,0.75),
- "heavycyan":(0,0.75,0.75),
- "heavymagenta":(0.75,0,0.75),
- "lightolive":(0.75,0.75,0),
- "heavygray":(0.25,0.25,0.25),
- "deepred":(0.5,0,0),
- "deepgreen":(0,0.5,0),
- "deepblue":(0,0,0.5),
- "deepcyan":(0,0.5,0.5),
- "deepmagenta":(0.5,0,0.5),
- "olive":(0.5,0.5,0),
- "deepgray":(0.1,0.1,0.1),
- "darkred":(0.25,0,0),
- "darkgreen":(0,0.25,0),
- "darkblue":(0,0,0.25),
- "darkcyan":(0,0.25,0.25),
- "darkmagenta":(0.25,0,0.25),
- "darkolive":(0.25,0.25,0),
- "darkgray":(0.05,0.05,0.05),
- "orange":(1,0.5,0),
- "fuchsia":(1,0,0.5),
- "chartreuse":(0.5,1,0),
- "springgreen":(0,1,0.5),
- "purple":(0.5,0,1),
- "royalblue":(0,0.5,1)
- }
-colorLayout = [['palered',
- 'lightred',
- 'mediumred',
- 'red',
- 'heavyred',
- 'deepred',
- 'darkred',
- 'palegreen',
- 'lightgreen',
- 'mediumgreen',
- 'green',
- 'heavygreen',
- 'deepgreen',
- 'darkgreen',
- 'paleblue',
- 'lightblue',
- 'mediumblue',
- 'blue',
- 'heavyblue',
- 'deepblue',
- 'darkblue'],
- ['palecyan',
- 'lightcyan',
- 'heavycyan',
- 'deepcyan',
- 'darkcyan',
- 'palemagenta',
- 'lightmagenta',
- 'mediummagenta',
- 'magenta',
- 'heavymagenta',
- 'deepmagenta',
- 'darkmagenta',
- 'yellow',
- 'lightyellow',
- 'mediumyellow',
- 'yellow',
- 'lightolive',
- 'olive',
- 'darkolive',
- 'palegray',
- 'lightgray',
- 'mediumgray',
- 'gray',
- 'heavygray',
- 'deepgray',
- 'darkgray'],
- ['black',
- 'white',
- 'orange',
- 'fuchsia',
- 'chartreuse',
- 'springgreen',
- 'purple',
- 'royalblue',
- 'Cyan',
- 'Magenta',
- 'Yellow',
- 'Black']]
-
-def makeRGBfromTkColor(tkColor):
- """Convert a Tk color of the form #rrggbb to an asy rgb color"""
- r = int('0x'+tkColor[1:3],16)
- g = int('0x'+tkColor[3:5],16)
- b = int('0x'+tkColor[5:7],16)
- r /= 255.0
- g /= 255.0
- b /= 255.0
- return (r,g,b)
-
-def RGBreal255(rgb):
- """Convert an RGB color from 0-1 to 0-255"""
- return [min(int(256*a),255) for a in rgb]
-
-def RGB255hex(rgb):
- """Make a color in the form #rrggbb in hex from r,g,b in 0-255"""
- return "#{}".format("".join(["{:02x}".format(a) for a in rgb]))
-
-class xasyColorDlg(Toplevel):
- """A dialog for choosing an asymptote color. It displays the usual asy presets and allows custom rgb colors"""
- def __init__(self,master=None,color=(0,0,0)):
- Toplevel.__init__(self,master,width=500,height=500)
- self.resizable(False,False)
- self.parent = master
- self.title("Color Picker")
- self.transient(master)
- self.focus_set()
- self.wait_visibility()
- self.grab_set()
- self.color = self.oldColor = color
- cwidth = 120
- rheight = 20
- self.pframe=Frame(self,bd=0)
- self.pframe.rowconfigure(0,weight=1)
- self.pframe.columnconfigure(0,weight=1)
- Label(self.pframe,text="Color Presets").grid(row=0,column=0)
- self.colScroll = Scrollbar(self.pframe,orient=VERTICAL)
- self.colorList = Canvas(self.pframe, width=cwidth*len(colorLayout), scrollregion=(0,0,20+cwidth*len(colorLayout),20+rheight*max([len(i) for i in colorLayout])),yscrollcommand=self.colScroll.set,relief=FLAT)
- self.colScroll.config(command=self.colorList.yview)
- self.colScroll.grid(row=1,column=1,sticky=N+S)
- self.colorList.grid(row=1,column=0,sticky=W)
- ccount = 0
- for column in colorLayout:
- rcount = 0
- for name in column:
- self.colorList.create_rectangle(10+cwidth*ccount,10+rheight*rcount,cwidth*ccount+25,rheight*rcount+25,tags=(name,"preset"),fill=RGB255hex(RGBreal255(asyColors[name])))
- self.colorList.create_text(cwidth*ccount+30,10+rheight*rcount,text=name,anchor=NW,tags=(name,"preset"),fill="black",activefill=RGB255hex(RGBreal255(asyColors[name])))
- rcount += 1
- ccount += 1
- self.colorList.tag_bind("preset","<Button-1>",self.setColorEvt)
- Button(self,text="Custom color...",command=self.getCustom).grid(row=2,column=0,sticky=W,padx=5,pady=5)
- self.colDisp = Canvas(self,width=200,height=20,background=RGB255hex(RGBreal255(self.color)),relief=SUNKEN, bd=3)
- self.colDisp.grid(row=2,column=1,columnspan=2)
- self.rowconfigure(3,minsize=10)
- self.columnconfigure(0,weight=1)
- self.columnconfigure(1,weight=1)
- self.columnconfigure(2,weight=1)
- Button(self,text="OK",default=ACTIVE,command=self.destroy).grid(row=4,column=1,sticky=E+W,padx=5,pady=5)
- Button(self,text="Cancel",command=self.cancel).grid(row=4,column=2,sticky=E+W,padx=5,pady=5)
- self.pframe.grid(row=1,column=0,columnspan=3,padx=10,pady=10)
- self.bind("<Return>",self.closeUp)
- self.setColor(color)
- def closeUp(self,event):
- """Close the dialog forcibly"""
- self.destroy()
- def getCustom(self):
- """Request a custom RGB color using a colorchooser"""
- result=colorchooser.askcolor(initialcolor=RGB255hex(RGBreal255(self.color)),title="Custom Color",parent=self)
- if result != (None,None):
- self.setColor((result[0][0]/255.0,result[0][1]/255.0,result[0][2]/255.0))
- def cancel(self):
- """Respond to the user pressing cancel"""
- self.color = self.oldColor
- self.destroy()
- def setColor(self,color):
- """Save the color and update the color display"""
- self.color = color
- self.colDisp.configure(background=RGB255hex(RGBreal255(self.color)))
- def setColorEvt(self,event):
- """Respond to the user clicking a color from the palette"""
- self.setColor(asyColors[self.colorList.gettags(CURRENT)[0]])
- def getColor(self,initialColor=(0,0,0)):
- """Use this method to prompt for a color. It returns the new color or the old color if the user cancelled the operation.
-
- e.g:
- print (xasyColorDlg(Tk()).getColor((1,1,0)))
- """
- self.setColor(initialColor)
- self.oldColor = initialColor
- self.wait_window(self)
- return self.color
-
-if __name__ == '__main__':
- root = Tk()
- Button(root,text="Pick Color",command=lambda:xasyColorDlg(root).getColor()).pack()
- root.mainloop()
diff --git a/Build/source/utils/asymptote/GUI/xasyExample.asy b/Build/source/utils/asymptote/GUI/xasyExample.asy
deleted file mode 100644
index c251d45acb4..00000000000
--- a/Build/source/utils/asymptote/GUI/xasyExample.asy
+++ /dev/null
@@ -1,63 +0,0 @@
-initXasyMode();
-// This file was generated by xasy. It may be edited manually, however, a strict
-// syntax must be followed. It is advised that manually scripted items be added
-// in the form of a script either by using xasy or by mimicking the format of an
-// xasy-generated script item.
-// Please consult the documentation or the examples provided for details.
-xformStack.add(indexedTransform(0,(0, 0, 1, 0, 0, 1)),
-indexedTransform(1,(0, 0, 1, 0, 0, 1)),
-indexedTransform(2,(0, 0, 1, 0, 0, 1)),
-indexedTransform(3,(0, 0, 1, 0, 0, 1)),
-indexedTransform(4,(0, 0, 1, 0, 0, 1)),
-indexedTransform(5,(0, 0, 1, 0, 0, 1)),
-indexedTransform(6,(0, 0, 1, 0, 0, 1)),
-indexedTransform(7,(0, 0, 1, 0, 0, 1)),
-indexedTransform(8,(0, 0, 1, 0, 0, 1)),
-indexedTransform(9,(0, 0, 1, 0, 0, 1)),
-indexedTransform(10,(0, 0, 1, 0, 0, 1)),
-indexedTransform(11,(0, 0, 1, 0, 0, 1)),
-indexedTransform(12,(0, 0, 1, 0, 0, 1)));
-startScript(); {
-size(0,150);
-
-pen colour1=red;
-pen colour2=green;
-
-pair z0=(0,0);
-pair z1=(-1,0);
-pair z2=(1,0);
-real r=1.5;
-guide c1=circle(z1,r);
-guide c2=circle(z2,r);
-fill(c1,colour1);
-fill(c2,colour2);
-
-picture intersection;
-fill(intersection,c1,colour1+colour2);
-clip(intersection,c2);
-
-add(intersection);
-
-draw(c1);
-draw(c2);
-
-label("$A$",z1);
-label("$B$",z2);
-
-pair z=(0,-2);
-real m=3;
-margin BigMargin=Margin(0,m*dot(unit(z1-z),unit(z0-z)));
-
-draw(Label("$A\cap B$",0),conj(z)--z0,Arrow,BigMargin);
-draw(Label("$A\cup B$",0),z--z0,Arrow,BigMargin);
-draw(z--z1,Arrow,Margin(0,m));
-draw(z--z2,Arrow,Margin(0,m));
-} endScript();
-
-
-xformStack.push((-28.0, 7.0, 1, 0, 0, 1));
-label(Label("A Venn Diagram",(-79.0, 91.0),rgb(0,0,0)+0.5,align=SE));
-
-// This is the end of the file
-exitXasyMode();
-
diff --git a/Build/source/utils/asymptote/GUI/xasyFile.py b/Build/source/utils/asymptote/GUI/xasyFile.py
index 7516fc7d3b5..eee6d69a856 100755
--- a/Build/source/utils/asymptote/GUI/xasyFile.py
+++ b/Build/source/utils/asymptote/GUI/xasyFile.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
###########################################################################
#
# xasyFile implements the loading, parsing, and saving of an xasy file.
@@ -10,306 +10,74 @@
############################################################################
from string import *
-from xasy2asy import *
+import xasy2asy as x2a
+import io
import re
-class xasyParseError(Exception):
- """A parsing error"""
- pass
-
-class xasyFileError(Exception):
- """An i/o error or other error not related to parsing"""
- pass
-
-def parseFile(inFile):
- """Parse a file returning a list of xasyItems"""
- lines = inFile.read()
- lines = lines.splitlines()
- #lines = [line for line in lines.splitlines() if not line.startswith("//")]
- result = []
- if lines[0] != "initXasyMode();":
- raise xasyFileError("Invalid file format: First line must be \"initXasyMode();\"")
- lines.pop(0)
- lineCount = 2
- lineNum = len(lines)
- while lineNum > 0:
- line = lines[0]
- lines.pop(0)
- if not line.isspace() and len(line)>0:
- try:
- #print ("Line {:d}: {:s}".format(lineCount,line))
- lineResult = parseLine(line.strip(),lines)
- except:
- raise xasyParseError("Parsing error: line {:d} in {:s}\n{:s}".format(lineCount,inFile.name,line))
-
- if lineResult != None:
- result.append(lineResult)
- #print ("\tproduced: {:s}".format(str(lineResult)))
- lineCount += lineNum-len(lines)
- lineNum = len(lines)
- return result
-
-transformPrefix = "xformStack"
-scriptPrefix = "startScript(); {"
-scriptSuffix = "} endScript();"
-def extractScript(lines):
- """Find the code belonging to a script item"""
- theScript = ""
- line = lines.pop(0)
- level = 1
- while level > 0:
- check = line.lstrip()
- while check.endswith(scriptSuffix):
- level -= 1
- line = line[:len(line)-len(scriptSuffix)]
- check = line.lstrip()
- if check.startswith(scriptPrefix):
- level += 1
- theScript += line + "\n"
- if level > 0:
- line = lines.pop(0)
-
- global pendingTransformsD
- ts = pendingTransformsD[:]
- pendingTransformsD = []
- return xasyScript(None,script=theScript,transforms=ts[:])
-
-pendingTransforms = []
-pendingTransformsD = []
-def addTransform(index,t,active=1):
- """Place a transform in the list of transforms, expanding the list as needed"""
- while len(pendingTransformsD) < index+1:
- pendingTransformsD.append(identity())
- deleted = int(active==0)
- pendingTransformsD[index]=asyTransform(t,deleted)
-
-def parseIndexedTransforms(args):
- """Parse a list of indexedTransforms, adding them to the current list of transforms"""
- global pendingTransformsD
- pendingTransformsD = []
- args = args.replace("indexedTransform","")
- false = 0
- tList = [eval(a) for a in ")?(".join(args.split("),(")).split("?")]
- for a in tList:
- addTransform(*a)
-
-def parseTransformExpression(line):
- """Parse statements related to the xformStack
-
- Syntax:
- xformStack.push(transform)
- e.g.: xformStack.push((0,0,1,0,0,1)); //the identity
- xformStack.add(indexedTransform(index,transform)[,...])
- e.g.: xformStack.add(indexedTransform(1,(0,0,1,0,0,1));
- """
- global pendingTransforms
- stackCmd = line[len(transformPrefix)+1:line.find("(")]
- if line[-2:] != ");":
- raise xasyParseError("Invalid syntax")
- args = line[line.find("(")+1:-2]
- if stackCmd == "push":
- t = asyTransform(eval(args))
- pendingTransforms.append(t)
- elif stackCmd == "add":
- parseIndexedTransforms(args)
- else:
- raise xasyParseError("Invalid transform stack command.")
- return None
-
-def parseLabel(line):
- """Parse an asy Label statement, returning an xasyText item"""
- if not (line.startswith("Label(") and line.endswith(",align=SE)")):
- raise xasyParseError("Invalid syntax")
- args = line[6:-1]
- loc2 = args.rfind(",align=SE")
- loc1 = args.rfind(",",0,loc2-1)
- loc = args.rfind(",(",0,loc1-1)
- if loc < 2:
- raise xasyParseError("Invalid syntax")
- text = args[1:loc-1]
- location = eval(args[loc+1:args.find("),",loc)+1])
- pen = args[loc:loc2]
- pen = pen[pen.find(",")+1:]
- pen = pen[pen.find(",")+1:]
- pen = pen[pen.find(",")+1:]
- global pendingTransforms
- return xasyText(text,location,parsePen(pen),pendingTransforms.pop())
-
-def parseLabelCommand(line):
- """Parse a label command returning an xasyText object
-
- Syntax:
- label(Label(text,location,pen,align=SE));
- e.g.: label(Label("Hello world!",(0,0),rgb(0,0,0)+0.5,align=SE));
- """
- if line[-2:] != ");":
- raise xasyParseError("Invalid syntax")
- arguments = line[6:-2]
- return parseLabel(arguments)
-def parseDrawCommand(line):
- """Parse a draw command returning an xasyShape object
-
- Syntax:
- draw(path,pen);
- e.g.: draw((0,0)..controls(0.33,0.33)and(0.66,0.66)..(1,1),rgb(1,0,1)+1.5);
- """
- if line[-2:] != ");":
- raise xasyParseError("Invalid syntax")
- args = line[5:-2]
- loc = args.rfind(",rgb")
- path = args[:loc]
- pen = args[loc+1:]
- global pendingTransforms
- return xasyShape(parsePathExpression(path),parsePen(pen),pendingTransforms.pop())
+class xasyParseError(Exception):
+ """A parsing error"""
+ pass
-def parseFillCommand(line):
- """Parse a fill command returning an xasyFilledShape object
-
- Syntax:
- fill(cyclic path,pen);
- e.g.: fill((0,0)..controls(0.33,0.33)and(0.66,0.66)..(1,1)..controls(0.66,0)and(0.33,0)..cycle,rgb(1,0,1)+1.5);
- """
- if line[-2:] != ");":
- raise xasyParseError("Invalid syntax")
- args = line[5:-2]
- loc = args.rfind(",rgb")
- path = args[:loc]
- pen = args[loc+1:]
- global pendingTransforms
- return xasyFilledShape(parsePathExpression(path),parsePen(pen),pendingTransforms.pop())
-def parsePen(pen):
- """Parse a pen expression returning an asyPen
-
- Syntax:
- color+width[+options]
- e.g.: rgb(0,0,0)+1.5+evenodd
- e.g.: rgb(0,1,0)+1.23
- """
- try:
- tokens = pen.split("+")
- color = eval(tokens[0][3:])
- width = float(tokens[1])
- if len(tokens)>2:
- options = "+".join(tokens[2:])
+class xasyFileError(Exception):
+ """An i/o error or other error not related to parsing"""
+ pass
+
+
+def extractTransform(line):
+ """Returns key and the new transform."""
+ # see https://regex101.com/r/6DqkRJ/4 for info
+ mapString = x2a.xasyItem.mapString
+ testMatch = re.match(
+ r'^{0:s}\s*\(\s*\"([^\"]+)\"\s*,\s*\(([-\d, .]+)\)\s*\)'.format(mapString), line.strip())
+ if testMatch is None:
+ mapOnlyMatch = re.match(r'^{0:s}\s*\(\s *\"([^\"]+)\"\s*\)'.format(mapString), line.strip())
+ if mapOnlyMatch is None:
+ return None
+ else:
+ key = mapOnlyMatch.group(1)
+ return key, x2a.identity()
else:
- options = ""
- return asyPen(color,width,options)
- except:
- raise xasyParseError("Invalid pen")
-
-def parsePathExpression(expr):
- """Parse an asy path returning an asyPath()"""
- result = asyPath()
- expr = "".join(expr.split())
- #print (expr)
- if expr.find("controls") != -1:
- #parse a path with control points
- tokens = expr.split("..")
- nodes = [a for a in tokens if not a.startswith("controls")]
- for a in range(len(nodes)):
- if nodes[a] != "cycle":
- nodes[a] = eval(nodes[a])
- controls = [[eval(b) for b in a.replace("controls", "").split("and")] for a in tokens if a.startswith("controls")]
- result.initFromControls(nodes, controls)
- else:
- #parse a path without control points
- tokens = re.split(r"(::|--|\.\.)",expr)
- linkSet = re.findall("::|--|\.\.",expr)
- nodeSet = [a for a in tokens if not re.match(r"::|--|\.\.",a)]
- #print (nodeSet)
- for a in range(len(nodeSet)):
- if nodeSet[a] != "cycle":
- nodeSet[a] = eval(nodeSet[a])
- #print (nodeSet)
- result.initFromNodeList(nodeSet, linkSet)
- return result
-
-def takeUntilSemicolon(line,lines):
- """Read and concatenate lines until the collected lines end with a semicolon"""
- data = line
- while not data.endswith(";"):
- newline = lines.pop(0)
- data += newline
- return data
-
-def parseLine(line,lines):
- """Parse a line of the file"""
- if len(line)==0 or line.isspace() or line.startswith("//"):
- return None
- elif line.startswith(scriptPrefix):
- return extractScript(lines)
- elif line.startswith(transformPrefix):
- return parseTransformExpression(takeUntilSemicolon(line,lines))
- elif line.startswith("label("):
- return parseLabelCommand(takeUntilSemicolon(line,lines))
- elif line.startswith("draw("):
- return parseDrawCommand(takeUntilSemicolon(line,lines))
- elif line.startswith("fill("):
- return parseFillCommand(takeUntilSemicolon(line,lines))
- elif line.startswith("exitXasyMode();"):
- return None
- raise Exception("Could not parse the line")
-
-fileHeader = """initXasyMode();
-// This file was generated by xasy. It may be edited manually, however, a strict
-// syntax must be followed. It is advised that manually scripted items be added
-// in the form of a script either by using xasy or by mimicking the format of an
-// xasy-generated script item.
-// Please consult the documentation or the examples provided for details.
-"""
-
-fileFooter = """// This is the end of the file
-exitXasyMode();
-
-"""
-
-def saveFile(file,xasyItems):
- """Write a list of xasyItems to a file"""
- file.write(fileHeader)
- for item in xasyItems:
- file.write(item.getCode()+"\n\n")
- file.write(fileFooter)
-
-if __name__ == '__main__':
- root = Tk()
- try:
- name = raw_input("enter file name (\"../../xasyTest.asy\"):")
- if name == '':
- name = "../../xasyTest.asy"
- f = open(name,"rt")
- except:
- print ("Could not open file.")
- asy.quit()
- sys.exit(1)
-
- fileItems = []
- try:
- fileItems = parseFile(f)
- res = [str(a) for a in fileItems]
- print ("----------------------------------")
- print ("Objects in {:s}".format(f.name))
- print ("----------------------------------")
- for a in res:
- print (a)
- print ("----------------------------------")
- print ("successful parse")
- f.close()
- except:
- f.close()
- print ("parse failed")
- raise
-
- print ("making a file")
- f = open("testfile.asy","wt")
- saveFile(f,fileItems)
- f.close()
- root.configure(width=500,height=500)
- root.title("Results")
- canv = Canvas(root,width=500,height=500)
- canv.pack()
- for i in fileItems[1].imageList:
- canv.create_image(250+i.bbox[0],250-i.bbox[3],anchor = NW, image=i.image)
- Button(root,image=i.image).pack(side=LEFT)
- root.mainloop()
+ key = testMatch.group(1)
+ rawStr = testMatch.group(2)
+ rawStrArray = rawStr.split(',')
+
+ if len(rawStrArray) != 6:
+ return None
+ transf = [float(val.strip()) for val in rawStrArray]
+ return key, x2a.asyTransform(transf)
+
+
+def extractTransformsFromFile(fileStr):
+ transfDict = {}
+ maxItemCount = 0
+ with io.StringIO() as rawCode:
+ for line in fileStr.splitlines():
+ test_transf = extractTransform(line.rstrip())
+ if test_transf is None:
+ rawCode.write(line + '\n')
+ else:
+ key, transf = test_transf
+ if key not in transfDict.keys():
+ transfDict[key] = []
+ transfDict[key].append(transf)
+
+ # see https://regex101.com/r/RgeBVc/2 for regex
+
+ testNum = re.match(r'^x(\d+)($|:.*$)', key)
+ if testNum is not None:
+ maxItemCount = max(maxItemCount, int(testNum.group(1)))
+ final_str = rawCode.getvalue()
+ return final_str, transfDict, maxItemCount
+
+
+def saveFile(file, xasyItems, asy2psmap):
+ """Write a list of xasyItems to a file"""
+ for item in xasyItems:
+ file.write(item.getTransformCode(asy2psmap))
+
+ for item in xasyItems:
+ file.write(item.getObjectCode(asy2psmap))
+
+ file.write('size('+str(asy2psmap*x2a.yflip())+'); '+ x2a.xasyItem.resizeComment+'\n')
diff --git a/Build/source/utils/asymptote/GUI/xasyGUIIcons.py b/Build/source/utils/asymptote/GUI/xasyGUIIcons.py
deleted file mode 100755
index 7f07d5748d7..00000000000
--- a/Build/source/utils/asymptote/GUI/xasyGUIIcons.py
+++ /dev/null
@@ -1,92 +0,0 @@
-#!/usr/bin/env python
-##################################################################
-# This file stores the icons used by the xasy GUI
-#
-# About images and base64
-#
-# Suppose you have image.gif and want to create a base64
-# string. This can be accomplished using:
-#
-# import base64
-# base64.encodestring(open("image.gif","rb").read())
-#
-# The resulting output, including the enclosing single quotes,
-# is the base64 encoding of the image and can be used in the
-# dictionary below.
-#
-#
-# Suppose you have a base64 string, b64str, and want to create
-# an image. This can be accomplished using:
-#
-# import base64
-# open("image.gif","w").write(base64.decodestring(b64str))
-#
-#
-# Author: Orest Shardt
-# Created: June 29, 2007
-#
-##################################################################
-import base64
-import os
-#toolbar icon image data in base64 eliminates need to worry about files
-#these are the base64 encodings of the content of the directory xasy3Imgs
-iconB64 = {
-'lower': 'R0lGODlhGAAYAPEBAAAAAP///8zMzAAAACH5BAEAAAIALAAAAAAYABgAAAItlI+py+0Po5yUgosz\nrrybK2giqADed6LHKCZm+p7xx2Zuqsqr95KcJpv9cJUCADs=\n',
-'rotate': 'R0lGODlhGAAYAPAAAAAAAAAAACH5BAEAAAEALAAAAAAYABgAAAI7jI8JkO231mux1mkistL1zX0Q\ng2Fi6aGmurKp+8KKrJB0Zt+nzOQw6XPZgqjczuQ7eohKEDKoUYWIgQIAOw==\n',
-'raise': 'R0lGODlhGAAYAPEBAAAAAP///8zMzAAAACH5BAEAAAIALAAAAAAYABgAAAIwlI+pywgND3ixzVvZ\nNDSn3nlKKH7fhaZmObKtk8Yh6dKlLcfC5vZ1jvIJh8SikVUAADs=\n',
-'fillPoly': 'R0lGODlhGAAYAPEAAAAAAIOBgwAAAAAAACH5BAEAAAIALAAAAAAYABgAAAJGlI+py+0PEYgNBDCp\nDPxqY3UcRoViRzrmKWbLyqIMHI9vHbsbfuoHjfOBcrlbT0ATIo+gldKpMD1lL8vUo5oqS9vS5wsp\nAAA7\n',
-'move': 'R0lGODlhGAAYAIABAAAAAP///yH5BAEAAAEALAAAAAAYABgAAAI4jI+py+0I3gNUNhqtwlVD7m3h\nkoVdUJ4MaKTYysVymbDoYcM4Tmv9eAO2cp6YEKUavY5BpvMZKgAAOw==\n',
-'drawBezi': 'R0lGODlhGAAYAPEBAAAAAP///6usrQAAACH5BAEAAAIALAAAAAAYABgAAAI6lI+py+0AnYRUKhox\nsFvUFDXdM4LWUaKnEaorhqSX1noPmMquWJukzpr0YitRcfE5oobFpPIJjUoZBQA7\n',
-'vertiMove': 'R0lGODlhGAAYAIABAAAAAP///yH5BAEAAAEALAAAAAAYABgAAAIsjI+py+0I3gNUNhqtwlVD7m3h\nko2QmZRooKKt+Y5xOFtc7dwrtrLd3gsKTQUAOw==\n',
-'horizMove': 'R0lGODlhGAAYAIABAAAAAP///yH5BAEAAAEALAAAAAAYABgAAAIljI+py+0Po5y02oshAGu/7Skg\n143mSYpgGTYt8mbyTNf2jedWAQA7\n',
-'fillEllip': 'R0lGODlhGAAYAPECAAAAAIOBg////6usrSH5BAEAAAMALAAAAAAYABgAAAJAnI+py+0PowS0gkmD\n3qE6wIXctYDi2SkmepLGyrYHHIcuXW93Lr+86BrgakHfrzjjIRGVFgVjWUqm1Kr1ijUUAAA7\n',
-'text': 'R0lGODlhGAAYAIABAAAAAP///yH5BAEAAAEALAAAAAAYABgAAAI+jI+py+0Po5x0AgSu1SZvHnhS\nBnpio5Ukt2Idm3bysYrnddLwy+czH0rhFDkbTigj6UzKl68CjUqn1Ko1UAAAOw==\n',
-'drawPoly': 'R0lGODlhGAAYAPAAAAAAAAAAACH5BAEAAAEALAAAAAAYABgAAAI4jI+py+0PEYhtgkmlzgFL/4DJ\nFULiVi4ns66smrUxrMj1fdqHR+60kfPdgCwLzbWTIU1LE+cJKQAAOw==\n',
-'drawLines': 'R0lGODlhGAAYAPEBAAAAAP///6usrQAAACH5BAEAAAIALAAAAAAYABgAAAI3lI+py+0AnYRAPmoZ\njvlwX3Vh8j2XUIIWNXoZS3ZoO8soSK+4fRuYnQPyFEHhcHecFV+ppDNRAAA7\n',
-'drawShape': 'R0lGODlhGAAYAPAAAAAAAAAAACH5BAEAAAEALAAAAAAYABgAAAI5jI+pywffIjQzIrCwdXnTplmh\nMoKmKIHVeZXp5cFcPH+0HbjbqKN17OoxgrTeKiOkPHjH3fIGjS4KADs=\n',
-'drawEllip': 'R0lGODlhGAAYAPEBAAAAAP///6usrQAAACH5BAEAAAIALAAAAAAYABgAAAIylI+py+0PowS0gklX\ndRd29XmgdIQh+Z1TSSJpyxpqZMLqzOB4sgsbmKFZgrCi8YhMNgoAOw==\n',
-'select': 'R0lGODlhGAAYAPIDAAAAAICAgMDAwP///6usrQAAAAAAAAAAACH5BAEAAAQALAAAAAAYABgAAANH\nSLrc/mvA6YCkGIiLIQhb54Gh2HwkZxKo4KoiSpam7L6rfdNZ4M+C3I+0Ush8wSLKCFIyPsnisyld\nAD7VabR6DWSt37BYmgAAOw==\n',
-'fillShape': 'R0lGODlhGAAYAPEAAAAAAIOBgwAAAAAAACH5BAEAAAIALAAAAAAYABgAAAJHlI+pywff4gsUxgSo\nrhflzXXCB4YXWQIiCqpnubnLw8KyU8Omket77wvcgD4ZUTcMIj3KlOLYejY1N8/R0qChaCIrtgsO\nRwoAOw==\n',
-'asy': 'R0lGODlhGAAYAIABAP8AAAAAACH5BAEKAAEALAIAAwAUABIAAAImjI+py+0AHINy0ZouNjBurmGd\nt40fFT4j2aydGqaBq8jvxH46UwAAOw==\n'
-}
-
-def createGIF(key):
- """Create a gif file from the data in the iconB64 list of icons"""
- if key not in iconB64.keys():
- print ("Error: {:s} not found in icon list.".format(key))
- print ("Available icons:",iconB64.keys())
- else:
- print ("Generating {:s}.gif".format(key))
- open("{:s}.gif".format(key),"w").write(base64.decodestring(iconB64[key]))
-
-def createGIFs():
- """Create the files for all the icons in iconB64"""
- for name in iconB64.keys():
- createGIF(name)
-
-def createStrFromGif(gifFile):
- """Create the base64 representation of a file"""
- return base64.encodestring(gifFile.read())
-
-if __name__=='__main__':
- print ("Testing the xasyGUIIcons module.")
- print ("Generating all the GIFs:")
- createGIFs()
- print ("Checking consistency of all icons in iconB64")
- allpassed = True
- for icon in iconB64.keys():
- print ("Checking {:s}".format(icon))
- if createStrFromGif(open("{:s}.gif".format(icon),"rb")) == iconB64[icon]:
- print ("\tPassed.")
- else:
- print ("\tFailed.")
- allpassed= False
- if allpassed:
- print ("All files succeeded.")
- s = raw_input("Delete generated files? (y/n)")
- if s == "y":
- for name in iconB64.keys():
- print ("Deleting {:s}.gif".format(name))
- os.unlink(name+".gif")
- print ("\tdone")
- print ("Done")
diff --git a/Build/source/utils/asymptote/GUI/xasyMainWin.py b/Build/source/utils/asymptote/GUI/xasyMainWin.py
deleted file mode 100755
index b0549e72f9c..00000000000
--- a/Build/source/utils/asymptote/GUI/xasyMainWin.py
+++ /dev/null
@@ -1,1748 +0,0 @@
-#!/usr/bin/env python
-###########################################################################
-#
-# xasyMainWin implements the functionality of the GUI. It depends on
-# xasy2asy for its interaction with Asymptote.
-#
-#
-# Author: Orest Shardt
-# Created: June 29, 2007
-#
-###########################################################################
-
-import os
-import sys
-from string import *
-import subprocess
-import math
-import copy
-
-if sys.version_info >= (3, 0):
- # python3
- from tkinter import *
- from tkinter import filedialog, messagebox, simpledialog
-else:
- # python2
- # from Tkinter import *
- import tkFileDialog as filedialog
- import tkMessageBox as messagebox
- import tkSimpleDialog as simpledialog
-
-import threading
-import time
-
-from xasyVersion import xasyVersion
-import xasyCodeEditor
-from xasy2asy import *
-import xasyFile
-import xasyOptions
-import xasyOptionsDialog
-import CubicBezier
-from xasyBezierEditor import xasyBezierEditor
-from xasyGUIIcons import iconB64
-from xasyColorPicker import *
-
-from UndoRedoStack import *
-from xasyActions import *
-
-import string
-
-try:
- from PIL import ImageTk
- from PIL import Image
- PILAvailable = True
-except:
- PILAvailable = False
-
-class xasyMainWin:
- def __init__(self,master,file=None,magnification=1.0):
- self.opLock = threading.Lock()
- self.parent = master
- self.magnification = magnification
- self.previousZoom = self.magnification
- self.magList = [0.1,0.25,1.0/3,0.5,1,2,3,4,5,10]
- self.bindGlobalEvents()
- self.createWidgets()
- self.resetGUI()
- site=""
- if not PILAvailable:
- messagebox.showerror("Failed Dependencies","An error occurred loading the required PIL library. Please install Pillow from http://pypi.python.org/pypi/Pillow")
- self.parent.destroy()
- sys.exit(1)
- if file != None:
- self.loadFile(file)
- self.parent.after(100,self.tickHandler)
-
- def testOrAcquireLock(self):
- val = self.opLock.acquire(False)
- if val:
- self.closeDisplayLock()
- return val
-
- def acquireLock(self):
- self.closeDisplayLock()
- self.opLock.acquire()
-
- def releaseLock(self):
- self.opLock.release()
- self.openDisplayLock()
-
- def tickHandler(self):
- self.tickCount += 1
- self.mainCanvas.itemconfigure("outlineBox",dashoffset=self.tickCount%9)
- self.parent.after(100,self.tickHandler)
-
- def closeDisplayLock(self):
- self.status.config(text="Busy")
- self.parent.update_idletasks()
-
- def openDisplayLock(self):
- self.status.config(text="Ready")
-
- def bindGlobalEvents(self):
- #global bindings
- self.parent.bind_all("<Control-z>",lambda q:self.editUndoCmd())# z -> no shift
- self.parent.bind_all("<Control-Z>",lambda q:self.editRedoCmd())# Z -> with shift
- self.parent.bind_all("<Control-o>",lambda q:self.fileOpenCmd())
- self.parent.bind_all("<Control-n>",lambda q:self.fileNewCmd())
- self.parent.bind_all("<Control-s>",lambda q:self.fileSaveCmd())
- self.parent.bind_all("<Control-q>",lambda q:self.fileExitCmd())
- self.parent.bind_all("<F1>",lambda q:self.helpHelpCmd())
-
- def unbindGlobalEvents(self):
- #global bindings
- self.parent.unbind("<Control-z>")
- self.parent.unbind("<Control-Z>")
- self.parent.unbind("<Control-o>")
- self.parent.unbind("<Control-n>")
- self.parent.unbind("<Control-s>")
- self.parent.unbind("<Control-q>")
- self.parent.unbind("<F1>")
-
- def createWidgets(self):
- #first some configuration
- self.parent.geometry("800x600")
- self.parent.title("Xasy")
- self.parent.resizable(True,True)
-
- #try to capture the closing of the window
- #find a better way to do this since the widgets may
- #already be destroyed when this is called
- self.parent.protocol("WM_DELETE_WINDOW",self.canQuit)
-
- #the main menu
- self.mainMenu = Menu(self.parent)
- self.parent.config(menu=self.mainMenu)
-
- #the file menu
- self.fileMenu = Menu(self.mainMenu,tearoff=0)
- self.fileMenu.add_command(label="New",command=self.fileNewCmd,accelerator="Ctrl+N",underline=0)
- self.fileMenu.add_command(label="Open",command=self.fileOpenCmd,accelerator="Ctrl+O",underline=0)
- self.fileMenu.add_separator()
- self.fileMenu.add_command(label="Save",command=self.fileSaveCmd,accelerator="Ctrl+S",underline=0)
- self.fileMenu.add_command(label="Save As",command=self.fileSaveAsCmd,underline=5)
- self.fileMenu.add_separator()
-
- #an export menu
- self.exportMenu = Menu(self.fileMenu,tearoff=0)
- self.exportMenu.add_command(label="EPS...",command=self.exportEPS,underline=0)
- self.exportMenu.add_command(label="PDF...",command=self.exportPDF,underline=0)
- self.exportMenu.add_command(label="GIF...",command=self.exportGIF,underline=0)
- self.exportMenu.add_command(label="PNG...",command=self.exportPNG,underline=1)
- self.exportMenu.add_command(label="SVG...",command=self.exportSVG,underline=0)
- self.fileMenu.add_cascade(label="Export",menu=self.exportMenu,underline=1)
- self.fileMenu.add_separator()
-
- self.fileMenu.add_command(label="Quit",command=self.fileExitCmd,accelerator="Ctrl+Q",underline=0)
-
- self.mainMenu.add_cascade(label="File",menu=self.fileMenu,underline=0)
-
- #the edit menu
- self.editMenu = Menu(self.mainMenu,tearoff=0)
- self.editMenu.add_command(label="Undo",command=self.editUndoCmd,accelerator="Ctrl+Z",underline=0)
- self.editMenu.add_command(label="Redo",command=self.editRedoCmd,accelerator="Shift+Ctrl+Z",underline=0)
- self.mainMenu.add_cascade(label="Edit",menu=self.editMenu,underline=0)
-
- #the tools menu
- self.toolsMenu = Menu(self.mainMenu,tearoff=0)
- self.mainMenu.add_cascade(label="Tools",menu=self.toolsMenu,underline=0)
-
- #the options menu
- self.optionsMenu = Menu(self.toolsMenu,tearoff=0)
- self.toolsMenu.add_cascade(label="Options",menu=self.optionsMenu,underline=0)
- self.optionsMenu.add_command(label="Edit...",command=self.editOptions,underline=0)
- self.optionsMenu.add_command(label="Reset defaults",command=self.resetOptions,underline=6)
-
- #the help menu
- self.helpMenu = Menu(self.mainMenu,tearoff=0)
- self.helpMenu.add_command(label="Help",command=self.helpHelpCmd,state=DISABLED,accelerator="F1",underline=0)
- self.helpMenu.add_command(label="Asymptote Documentation",command=self.helpAsyDocCmd,underline=10)
- self.helpMenu.add_separator()
- self.helpMenu.add_command(label="About xasy",command=self.helpAboutCmd,underline=0)
- self.mainMenu.add_cascade(label="Help",menu=self.helpMenu,underline=0)
-
- #status bar
- self.statusBar = Frame(self.parent,relief=FLAT)
-
- self.magVal = DoubleVar()
- self.magVal.set(round(100*self.magnification,1))
- self.magVal.trace('w',self.zoomViewCmd)
- zoomList = self.magList
- if self.magnification not in zoomList:
- zoomList.append(self.magnification)
- zoomList.sort()
- zoomList = [round(100*i,1) for i in zoomList]
- self.zoomMenu = OptionMenu(self.statusBar,self.magVal,*zoomList)
- self.zoomMenu.pack(side=RIGHT)
- Label(self.statusBar,text="Zoom:",anchor=E,width=7).pack(side=RIGHT)
-
- self.coords = Label(self.statusBar,text="(0,0)",relief=SUNKEN,anchor=W)
- self.coords.pack(side=RIGHT,anchor=S)
- self.status = Label(self.statusBar,text="Ready",relief=SUNKEN,anchor=W)
- self.status.pack(side=RIGHT,fill=X,expand=1,anchor=SW)
- self.statusBar.pack(side=BOTTOM,fill=X)
-
- #toolbar for transformation, drawing, and adjustment commands
- self.toolBar = Frame(self.parent,relief=FLAT,borderwidth=3)
-
- #let's load some images
- self.toolIcons = {}
- for x in iconB64.keys():
- self.toolIcons[x] = PhotoImage(data=iconB64[x])
-
- self.transformLbl = Label(self.toolBar,text="",anchor=W)
- self.transformLbl.grid(row=0,column=0,columnspan=2,sticky=W)
- self.toolSelectButton = Button(self.toolBar,command=self.toolSelectCmd,image=self.toolIcons["select"])
- self.toolSelectButton.grid(row=1,column=0,sticky=N+S+E+W)
- self.toolMoveButton = Button(self.toolBar,command=self.toolMoveCmd,image=self.toolIcons["move"])
- self.toolMoveButton.grid(row=2,column=0,sticky=N+S+E+W)
- self.toolRotateButton = Button(self.toolBar,command=self.toolRotateCmd,image=self.toolIcons["rotate"])
- self.toolRotateButton.grid(row=2,column=1,sticky=N+S+E+W)
- self.toolVertiMoveButton = Button(self.toolBar,command=self.toolVertiMoveCmd,image=self.toolIcons["vertiMove"])
- self.toolVertiMoveButton.grid(row=3,column=0,sticky=N+S+E+W)
- self.toolHorizMoveButton = Button(self.toolBar,command=self.toolHorizMoveCmd,image=self.toolIcons["horizMove"])
- self.toolHorizMoveButton.grid(row=3,column=1,sticky=N+S+E+W)
-
- self.drawLbl = Label(self.toolBar,text="",anchor=W)
- self.drawLbl.grid(row=4,column=0,columnspan=2,sticky=W)
- self.toolDrawLinesButton = Button(self.toolBar,command=self.toolDrawLinesCmd,image=self.toolIcons["drawLines"])
- self.toolDrawLinesButton.grid(row=5,column=0,sticky=N+S+E+W)
- self.toolDrawBeziButton = Button(self.toolBar,command=self.toolDrawBeziCmd,image=self.toolIcons["drawBezi"])
- self.toolDrawBeziButton.grid(row=5,column=1,sticky=N+S+E+W)
- self.toolDrawPolyButton = Button(self.toolBar,command=self.toolDrawPolyCmd,image=self.toolIcons["drawPoly"])
- self.toolDrawPolyButton.grid(row=6,column=0,sticky=N+S+E+W)
- self.toolFillPolyButton = Button(self.toolBar,command=self.toolFillPolyCmd,image=self.toolIcons["fillPoly"])
- self.toolFillPolyButton.grid(row=6,column=1,sticky=N+S+E+W)
- self.toolDrawEllipButton = Button(self.toolBar,command=self.toolDrawEllipCmd,image=self.toolIcons["drawEllip"],state=DISABLED,relief=FLAT)
- #self.toolDrawEllipButton.grid(row=7,column=0,sticky=N+S+E+W)
- self.toolFillEllipButton = Button(self.toolBar,command=self.toolFillEllipCmd,image=self.toolIcons["fillEllip"],state=DISABLED,relief=FLAT)
- #self.toolFillEllipButton.grid(row=7,column=1,sticky=N+S+E+W)
- self.toolDrawShapeButton = Button(self.toolBar,command=self.toolDrawShapeCmd,image=self.toolIcons["drawShape"])
- self.toolDrawShapeButton.grid(row=8,column=0,sticky=N+S+E+W)
- self.toolFillShapeButton = Button(self.toolBar,command=self.toolFillShapeCmd,image=self.toolIcons["fillShape"])
- self.toolFillShapeButton.grid(row=8,column=1,sticky=N+S+E+W)
- self.toolTextButton = Button(self.toolBar,command=self.toolTextCmd,image=self.toolIcons["text"])
- self.toolTextButton.grid(row=9,column=0,sticky=N+S+E+W)
- self.toolAsyButton = Button(self.toolBar,command=self.toolAsyCmd,image=self.toolIcons["asy"])
- self.toolAsyButton.grid(row=9,column=1,sticky=N+S+E+W)
-
- self.adjLbl = Label(self.toolBar,text="",anchor=W)
- self.adjLbl.grid(row=10,column=0,columnspan=2,sticky=W)
- self.toolRaiseButton = Button(self.toolBar,command=self.toolRaiseCmd,image=self.toolIcons["raise"])
- self.toolRaiseButton.grid(row=11,column=0,sticky=N+S+E+W)
- self.toolLowerButton = Button(self.toolBar,command=self.toolLowerCmd,image=self.toolIcons["lower"])
- self.toolLowerButton.grid(row=11,column=1,sticky=N+S+E+W)
-
- self.toolBar.pack(side=LEFT,anchor=NW)
-
- #documentation for the tool bar buttons
- self.toolDocs = {
- self.toolSelectButton : "Click an item to select it. Control-Click will select/deselect additional items. Use mouse scroller (or Up/Down keys) to raise/lower highlighted items.",
- self.toolMoveButton : "Drag a selected item.",
- self.toolHorizMoveButton : "Drag a selected item. Only horizontal translation will be applied.",
- self.toolVertiMoveButton : "Drag a selected item. Only vertical translation will be applied.",
- self.toolRotateButton : "Drag a selected item to rotate it.",
- self.toolDrawLinesButton : "Click to draw line segments. Double click to place last point.",
- self.toolDrawBeziButton : "Click to place points. Double click to place last point.",
- self.toolDrawPolyButton : "Click to place vertices. Double click to place last point.",
- self.toolFillPolyButton : "Click to place vertices. Double click to place last point.",
- self.toolDrawEllipButton : "(UNIMPLEMENTED)Click to place center. Move mouse to achieve correct shape and double click.",
- self.toolFillEllipButton : "(UNIMPLEMENTED)Click to place center. Move mouse to achieve correct shape and double click.",
- self.toolDrawShapeButton : "Click to place points. Double click to place last point.",
- self.toolFillShapeButton : "Click to place points. Double click to place last point.",
- self.toolTextButton : "Click location of top left label position and enter text in dialog.",
- self.toolRaiseButton : "Raise selected items to top.",
- self.toolLowerButton : "Lower selected items to bottom.",
- self.toolAsyButton : "Insert/Edit Asymptote code."
- }
-
- #Current pen settings
- self.optionsBar = Frame(self.parent,height=100,relief=FLAT,borderwidth=3)
- self.penDisp = Canvas(self.optionsBar,width=100,height=25,bg="white",relief=SUNKEN,borderwidth=3)
- self.penDisp.grid(row=0,column=0,padx=3,pady=3)
- self.penDisp.create_line(10,25,30,10,60,20,80,10,smooth=True,tags="penDisp")
- self.penDisp.create_text(100,30,text="x1",tags="penMag",anchor=SE,font=("times","8"))
- self.penColButton = Button(self.optionsBar,text="Color...",width=5,command=self.setPenColCmd,relief=FLAT)
- self.penColButton.grid(row=0,column=1,padx=3,pady=3)
- Label(self.optionsBar,text="Width",anchor=E).grid(row=0,column=2)
- self.penWidthEntry = Entry(self.optionsBar,width=5)
- self.penWidthEntry.bind("<KeyRelease>",self.penWidthChanged)
- self.penWidthEntry.bind("<FocusOut>",self.applyPenWidthEvt)
- self.penWidthEntry.bind("<Return>",self.applyPenWidthEvt)
- self.penWidthEntry.grid(row=0,column=3)
- Label(self.optionsBar,text="Options",anchor=E).grid(row=0,column=4)
- self.penOptEntry = Entry(self.optionsBar)
- self.penOptEntry.bind("<FocusOut>",self.applyPenOptEvt)
- self.penOptEntry.bind("<Return>",self.applyPenOptEvt)
- self.penOptEntry.grid(row=0,column=5)
- self.optionsBar.pack(side=BOTTOM,anchor=NW)
-
- #a paned window for the canvas and propert explorer
- self.windowPane = PanedWindow(self.parent)
-
- #a property explorer
- self.propFrame = Frame(self.parent)
- self.propFrame.rowconfigure(1,weight=1)
- self.propFrame.columnconfigure(0,weight=1)
- Label(self.propFrame,text="Item List").grid(row=0,column=0,columnspan=2)
- self.itemScroll = Scrollbar(self.propFrame,orient=VERTICAL)
- self.propList = Listbox(self.propFrame, yscrollcommand=self.itemScroll.set)
- self.itemScroll.config(command=self.propList.yview)
- self.itemScroll.grid(row=1,column=1,sticky=N+S)
- self.propList.grid(row=1,column=0,sticky=N+S+E+W)
- self.propList.bind("<Double-Button-1>",self.propSelect)
- self.propList.bind("<Button-3>",self.itemPropMenuPopup)
-
- #the canvas's frame
- self.canvFrame = Frame(self.parent,relief=FLAT,borderwidth=0)
- self.canvFrame.rowconfigure(0,weight=1)
- self.canvFrame.columnconfigure(0,weight=1)
- self.canvVScroll = Scrollbar(self.canvFrame,orient=VERTICAL)
- self.canvHScroll = Scrollbar(self.canvFrame,orient=HORIZONTAL)
- self.canvHScroll.grid(row=1,column=0,sticky=E+W)
- self.canvVScroll.grid(row=0,column=1,sticky=N+S)
-
- #add the frames to the window pane
- self.windowPane.pack(side=RIGHT,fill=BOTH,expand=True)
- self.windowPane.add(self.canvFrame)
- self.windowPane.add(self.propFrame)
- self.windowPane.paneconfigure(self.propFrame,minsize=50,sticky=N+S+E+W)
- self.windowPane.bind("<Double-Button-1>",self.togglePaneEvt)
-
- #the highly important canvas!
- self.mainCanvas = Canvas(self.canvFrame,relief=SUNKEN,background="white",borderwidth=3,
- highlightthickness=0,closeenough=1.0,yscrollcommand=self.canvVScroll.set,
- xscrollcommand=self.canvHScroll.set)
- self.mainCanvas.grid(row=0,column=0,sticky=N+S+E+W)
-
- self.canvVScroll.config(command=self.mainCanvas.yview)
- self.canvHScroll.config(command=self.mainCanvas.xview)
-
- self.mainCanvas.bind("<Motion>",self.canvMotion)
- self.mainCanvas.bind("<Button-1>",self.canvLeftDown)
- self.mainCanvas.bind("<Double-Button-1>",self.endDraw)
- self.mainCanvas.bind("<ButtonRelease-1>",self.canvLeftUp)
- self.mainCanvas.bind("<B1-Motion>",self.canvDrag)
-
- self.mainCanvas.bind("<Enter>",self.canvEnter)
- self.mainCanvas.bind("<Leave>",self.canvLeave)
- self.mainCanvas.bind("<Delete>",self.itemDelete)
- #self.mainCanvas.bind("<Button-3>",self.canvRightDown)
- #self.mainCanvas.bind("<ButtonRelease-3>",self.canvRightUp)
- self.mainCanvas.bind("<Button-4>",self.itemRaise)
- self.mainCanvas.bind("<Button-5>",self.itemLower)
- self.mainCanvas.bind("<Up>",self.itemRaise)
- self.mainCanvas.bind("<Down>",self.itemLower)
- self.mainCanvas.bind("<Configure>",self.configEvt)
-
- def foregroundPenColor(self,hex):
- hex = hex[1:]
- rgb = max(hex[0:2], hex[2:4], hex[4:6])
- if(rgb >= "80"):
- return "black"
- else:
- return "white"
-
- def resetGUI(self):
- #set up the main window
- self.filename = None
- self.fileToOpen = None
- self.retitle()
-
- #set up the paned window
- self.paneVisible = True
-
- #setup the pen entries
- self.pendingPenWidthChange = None
- self.pendingPenOptChange = None
-
- #load one-time configs
- xasyOptions.load()
- self.tkPenColor = xasyOptions.options['defPenColor']
- self.penColor = makeRGBfromTkColor(self.tkPenColor)
- self.penColButton.config(activebackground=self.tkPenColor,
- activeforeground=self.foregroundPenColor(self.tkPenColor))
- self.penWidth = xasyOptions.options['defPenWidth']
- self.penWidthEntry.select_range(0,END)
- self.penWidthEntry.delete(0,END)
- self.penWidthEntry.insert(END,str(self.penWidth))
- self.penOptions = xasyOptions.options['defPenOptions']
- self.penOptEntry.select_range(0,END)
- self.penOptEntry.delete(0,END)
- self.penOptEntry.insert(END,str(self.penOptions))
- self.showCurrentPen()
-
- #load modifiable configs
- self.applyOptions()
-
- #set up editing
- self.editor = None
-
- #set up drawing
- self.pathInProgress = asyPath()
- self.currentIDTag = -1
- self.inDrawingMode = False
- self.freeMouseDown = True
- self.dragSelecting = False
- self.itemsBeingRotated = []
- self.inRotatingMode = False
-
- #set up the toolbar
- try:
- self.updateSelectedButton(self.toolSelectButton)
- except:
- self.selectedButton = self.toolSelectButton
- self.updateSelectedButton(self.toolSelectButton)
-
- #set up the canvas
- self.mainCanvas.delete(ALL)
- self.mainCanvas.create_rectangle(0,0,0,0,tags="outlineBox",width=0,outline="#801111",dash=(3,6))
- self.backColor = "white" #in future, load this from an options file. Or, should this really be an option?
- self.mainCanvas.configure(background=self.backColor)
-
- #set up the xasy item list
- self.fileItems = []
- self.propList.delete(0,END)
- self.updateCanvasSize()
-
- #setup timer
- self.tickCount = 0
-
- #setup undo/redo!
- self.undoRedoStack = actionStack()
- self.amDragging = False
-
- def retitle(self):
- if self.filename == None:
- self.parent.title("Xasy - New File")
- else:
- name = os.path.abspath(self.filename)
- name = os.path.basename(name)
- self.parent.title("Xasy - %s"%name)
-
- def applyOptions(self):
- self.gridcolor = xasyOptions.options['gridColor']
- self.tickcolor = xasyOptions.options['tickColor']
- self.axiscolor = xasyOptions.options['axesColor']
- self.gridVisible = xasyOptions.options['showGrid']
- self.gridxspace = xasyOptions.options['gridX']
- self.gridyspace = xasyOptions.options['gridY']
- self.axesVisible = xasyOptions.options['showAxes']
- self.axisxspace = xasyOptions.options['axisX']
- self.axisyspace = xasyOptions.options['axisY']
- self.updateCanvasSize()
- #test the asyProcess
- startQuickAsy()
- if not quickAsyRunning():
- if messagebox.askyesno("Xasy Error","Asymptote could not be executed.\r\nTry to find Asymptote automatically?"):
- xasyOptions.setAsyPathFromWindowsRegistry()
- xasyOptions.save()
- startQuickAsy()
- while not quickAsyRunning():
- if messagebox.askyesno("Xasy Error","Asymptote could not be executed.\r\nEdit settings?"):
- xasyOptionsDialog.xasyOptionsDlg(self.parent)
- xasyOptions.save()
- startQuickAsy()
- else:
- self.parent.destroy()
- sys.exit(1)
-
- def drawGrid(self):
- self.mainCanvas.delete("grid")
- if not self.gridVisible:
- return
- left,top,right,bottom = [int(float(a)) for a in self.mainCanvas.cget("scrollregion").split()]
- gridyspace = int(self.magnification*self.gridyspace)
- gridxspace = int(self.magnification*self.gridxspace)
- if gridxspace >= 3 and gridyspace >= 3:
- for i in range(0,right,gridxspace):
- self.mainCanvas.create_line(i,top,i,bottom,tags=("grid","vertical"),fill=self.gridcolor)
- for i in range(-gridxspace,left,-gridxspace):
- self.mainCanvas.create_line(i,top,i,bottom,tags=("grid","vertical"),fill=self.gridcolor)
- for i in range(-gridyspace,top,-gridyspace):
- self.mainCanvas.create_line(left,i,right,i,tags=("grid","horizontal"),fill=self.gridcolor)
- for i in range(0,bottom,gridyspace):
- self.mainCanvas.create_line(left,i,right,i,tags=("grid","horizontal"),fill=self.gridcolor)
- self.mainCanvas.tag_lower("grid")
-
- def drawAxes(self):
- self.mainCanvas.delete("axes")
- if not self.axesVisible:
- return
- left,top,right,bottom = [int(float(a)) for a in self.mainCanvas.cget("scrollregion").split()]
- self.mainCanvas.create_line(0,top,0,bottom,tags=("axes","yaxis"),fill=self.axiscolor)
- self.mainCanvas.create_line(left,0,right,0,tags=("axes","xaxis"),fill=self.axiscolor)
- axisxspace = int(self.magnification*self.axisxspace)
- axisyspace = int(self.magnification*self.axisyspace)
- if axisxspace >= 3 and axisyspace >= 3:
- for i in range(axisxspace,right,axisxspace):
- self.mainCanvas.create_line(i,-5,i,5,tags=("axes","xaxis-ticks"),fill=self.tickcolor)
- for i in range(-axisxspace,left,-axisxspace):
- self.mainCanvas.create_line(i,-5,i,5,tags=("axes","xaxis-ticks"),fill=self.tickcolor)
- for i in range(-axisyspace,top,-axisyspace):
- self.mainCanvas.create_line(-5,i,5,i,tags=("axes","yaxis-ticks"),fill=self.tickcolor)
- for i in range(axisyspace,bottom,axisyspace):
- self.mainCanvas.create_line(-5,i,5,i,tags=("axes","yaxis-ticks"),fill=self.tickcolor)
- self.mainCanvas.tag_lower("axes")
-
- def updateCanvasSize(self,left=-200,top=-200,right=200,bottom=200):
- self.parent.update_idletasks()
- bbox = self.mainCanvas.bbox("drawn || image || node || precontrol || postcontrol")
- if bbox == None:
- bbox = (0,0,0,0)
- #(topleft, bottomright)
- left = min(bbox[0],left)
- top = min(bbox[1],top)
- right = max(bbox[2],right)
- bottom = max(bbox[3],bottom)
- w,h = self.mainCanvas.winfo_width(),self.mainCanvas.winfo_height()
- if right-left < w:
- extraw = w-(right-left)
- right += extraw//2
- left -= extraw//2
- if bottom-top < h:
- extrah = h-(bottom-top)
- bottom += extrah//2
- top -= extrah//2
- self.mainCanvas.config(scrollregion=(left,top,right,bottom))
- #self.mainCanvas.xview(MOVETO,float(split(self.mainCanvas["scrollregion"])[0]))
- #self.mainCanvas.yview(MOVETO,float(split(self.mainCanvas["scrollregion"])[1]))
- #self.mainCanvas.xview(MOVETO,(left+right)/2)
- #self.mainCanvas.yview(MOVETO,(top+bottom)/2)
- self.drawAxes()
- self.drawGrid()
-
- def bindEvents(self,tagorID):
- if tagorID == None:
- return
- self.mainCanvas.tag_bind(tagorID,"<Control-Button-1>",self.itemToggleSelect)
- self.mainCanvas.tag_bind(tagorID,"<Button-1>",self.itemSelect)
- self.mainCanvas.tag_bind(tagorID,"<ButtonRelease-1>",self.itemMouseUp)
- self.mainCanvas.tag_bind(tagorID,"<Double-Button-1>",self.itemEditEvt)
- self.mainCanvas.tag_bind(tagorID,"<B1-Motion>",self.itemDrag)
- self.mainCanvas.tag_bind(tagorID,"<Delete>",self.itemDelete)
- self.mainCanvas.tag_bind(tagorID,"<Enter>",self.itemHighlight)
- self.mainCanvas.tag_bind(tagorID,"<Button-3>",self.itemCanvasMenuPopup)
-
- def bindItemEvents(self,item):
- if item == None:
- return
- if isinstance(item,xasyScript) or isinstance(item,xasyText):
- for image in item.imageList:
- self.bindEvents(image.IDTag)
- else:
- self.bindEvents(item.IDTag)
-
- def canQuit(self,force=False):
- #print ("Quitting")
- if not force and not self.testOrAcquireLock():
- return
- try:
- self.releaseLock()
- except:
- pass
- if self.undoRedoStack.changesMade():
- result = messagebox._show("xasy","File has been modified.\nSave changes?",icon=messagebox.QUESTION,type=messagebox.YESNOCANCEL)
- if str(result) == messagebox.CANCEL:
- return
- elif result == messagebox.YES:
- self.fileSaveCmd()
- try:
- os.rmdir(getAsyTempDir())
- except:
- pass
-
- stopQuickAsy()
- self.parent.destroy()
-
- def openFile(self,name):
- if(not self.testOrAcquireLock()):
- return
- self.releaseLock() #release the lock for loadFile
- self.resetGUI()
- self.loadFile(name)
-
- def loadFile(self,name):
- self.status.config(text="Loading "+name)
- self.filename = os.path.abspath(name)
- startQuickAsy()
- self.retitle()
- try:
- try:
- f = open(self.filename,'rt')
- except:
- if self.filename[-4:] == ".asy":
- raise
- else:
- f = open(self.filename+".asy",'rt')
- self.filename += ".asy"
- self.retitle()
- self.fileItems = xasyFile.parseFile(f)
- f.close()
- except IOError:
- messagebox.showerror("File Opening Failed.","File could not be opened.")
- self.fileItems = []
- except:
- self.fileItems = []
- self.autoMakeScript = True
- if self.autoMakeScript or messagebox.askyesno("Error Opening File", "File was not recognized as an xasy file.\nLoad as a script item?"):
- try:
- item = xasyScript(self.mainCanvas)
- f.seek(0)
- item.setScript(f.read())
- self.addItemToFile(item)
- except:
- messagebox.showerror("File Opening Failed.","Could not load as a script item.")
- self.fileItems = []
- self.populateCanvasWithItems()
- self.populatePropertyList()
- self.updateCanvasSize()
-
- def populateCanvasWithItems(self):
- if(not self.testOrAcquireLock()):
- return
- self.mainCanvas.delete("drawn || image")
- self.itemCount = 0
- for item in self.fileItems:
- item.drawOnCanvas(self.mainCanvas,self.magnification,forceAddition=True)
- self.bindItemEvents(item)
- self.releaseLock()
-
- def propListCountItem(self,item):
- plist = self.propList.get(0,END)
- count = 1
- for text in plist:
- if text.startswith(item):
- count += 1
- return count
-
- def describeItem(self,item):
- if isinstance(item,xasyScript):
- return "Code Module "+str(self.propListCountItem("Code Module"))
- elif isinstance(item,xasyText):
- return "Text Label "+str(self.propListCountItem("Text Label"))
- elif isinstance(item,xasyFilledShape):
- return "Filled Shape "+str(self.propListCountItem("Filled Shape"))
- elif isinstance(item,xasyShape):
- return "Outline "+str(self.propListCountItem("Outline"))
- else:
- return "If this happened, the program is corrupt!"
-
- def populatePropertyList(self):
- self.propList.delete(0,END)
- for item in self.fileItems:
- self.propList.insert(0,self.describeItem(item))
-
- def saveFile(self,name):
- if(not self.testOrAcquireLock()):
- return
- f = open(name,"wt")
- xasyFile.saveFile(f,self.fileItems)
- f.close()
- self.undoRedoStack.setCommitLevel()
- self.retitle()
- self.releaseLock()
-
- #menu commands
- def fileNewCmd(self):
- if(not self.testOrAcquireLock()):
- return
- self.releaseLock()
- #print ("Create New File")
- if self.undoRedoStack.changesMade():
- result = messagebox._show("xasy","File has been modified.\nSave changes?",icon=messagebox.QUESTION,type=messagebox.YESNOCANCEL)
- if str(result) == messagebox.CANCEL:
- return
- elif result == messagebox.YES:
- self.fileSaveCmd()
- self.resetGUI()
-
- def fileOpenCmd(self):
- if(not self.testOrAcquireLock()):
- return
- self.releaseLock()
- #print ("Open a file")
- if self.undoRedoStack.changesMade():
- result = messagebox._show("xasy","File has been modified.\nSave changes?",icon=messagebox.QUESTION,type=messagebox.YESNOCANCEL)
- if str(result) == messagebox.CANCEL:
- return
- elif result == messagebox.YES:
- self.fileSaveCmd()
- filename=filedialog.askopenfilename(filetypes=[("asy files","*.asy"),("All files","*")],title="Open File",parent=self.parent)
- if type(filename) != type((0,)) and filename != None and filename != '':
- self.filename = filename
- self.openFile(self.filename)
-
- def fileSaveCmd(self):
- #print ("Save current file")
- if(not self.testOrAcquireLock()):
- return
- self.releaseLock()
- if self.filename == None:
- filename=filedialog.asksaveasfilename(defaultextension=".asy",filetypes=[("asy files","*.asy")],initialfile="newDrawing.asy",parent=self.parent,title="Save File")
- if type(filename) != type((0,)) and filename != None and filename != '':
- self.filename = filename
- if self.filename != None:
- self.saveFile(self.filename)
-
- def fileSaveAsCmd(self):
- if(not self.testOrAcquireLock()):
- return
- self.releaseLock()
- #print ("Save current file as")
- filename=filedialog.asksaveasfilename(defaultextension=".asy",filetypes=[("asy files","*.asy")],initialfile="newDrawing.asy",parent=self.parent,title="Save File")
- if type(filename) != type((0,)) and filename != None and filename != '':
- self.filename = filename
- self.saveFile(self.filename)
-
- #export the file
- def exportEPS(self):
- self.exportFile(self.filename,"eps")
-
- def exportPDF(self):
- self.exportFile(self.filename,"pdf")
-
- def exportGIF(self):
- self.exportFile(self.filename,"gif")
-
- def exportPNG(self):
- self.exportFile(self.filename,"png")
-
- def exportSVG(self):
- self.exportFile(self.filename,"svg")
-
- def exportFile(self,inFile, outFormat):
- if(not self.testOrAcquireLock()):
- return
- self.releaseLock()
- if inFile == None:
- if messagebox.askyesno("xasy","File has not been saved.\nSave?"):
- self.fileSaveAsCmd()
- inFile = self.filename
- else:
- return
- elif self.undoRedoStack.changesMade():
- choice = messagebox._show("xasy","File has been modified.\nOnly saved changes can be exported.\nDo you want to save changes?",icon=messagebox.QUESTION,type=messagebox.YESNOCANCEL)
- choice = str(choice)
- if choice != messagebox.YES:
- return
- else:
- self.fileSaveCmd()
- name = os.path.splitext(os.path.basename(self.filename))[0]+'.'+outFormat
- outfilename = filedialog.asksaveasfilename(defaultextension = '.'+outFormat,filetypes=[(outFormat+" files","*."+outFormat)],initialfile=name,parent=self.parent,title="Choose output file")
- if type(outfilename)==type((0,)) or not outfilename or outfilename == '':
- return
- fullname = os.path.abspath(outfilename)
- outName = os.path.basename(outfilename)
- command=[xasyOptions.options['asyPath'],"-f"+outFormat,"-o"+fullname,inFile]
- saver = subprocess.Popen(command,stdin=PIPE,stdout=PIPE,stderr=PIPE)
- saver.wait()
- if saver.returncode != 0:
- messagebox.showerror("Export Error","Export Error:\n"+saver.stdout.read()+saver.stderr.read())
- self.status.config(text="Error exporting file")
- else:
- self.status.config(text="File exported successfully")
-
- def fileExitCmd(self):
- #print ("Exit xasy")
- self.canQuit()
-
- def editUndoCmd(self):
- if not self.editor == None:
- return
- if(not self.testOrAcquireLock()):
- return
- self.undoOperation()
- self.releaseLock()
-
- def editRedoCmd(self):
- if not self.editor == None:
- return
- if(not self.testOrAcquireLock()):
- return
- self.redoOperation()
- self.releaseLock()
-
- def helpHelpCmd(self):
- print ("Get help on xasy")
-
- def helpAsyDocCmd(self):
- #print ("Open documentation about Asymptote")
- asyExecute("help;\n")
-
- def helpAboutCmd(self):
- messagebox.showinfo("About xasy","A graphical interface for Asymptote "+xasyVersion)
-
- def updateSelectedButton(self,newB):
- if(not self.testOrAcquireLock()):
- return
- self.releaseLock()
- #disable switching modes during an incomplete drawing operation
- if self.inDrawingMode:
- return
- self.selectedButton.config(relief = RAISED)
- if newB == self.toolSelectButton or self.selectedButton == self.toolSelectButton:
- self.mainCanvas.delete("highlightBox")
- if self.editor != None:
- self.editor.endEdit()
- if self.editor.modified:
- self.undoRedoStack.add(editDrawnItemAction(self,self.itemBeingEdited,copy.deepcopy(self.editor.shape),self.fileItems.index(self.editor.shape)))
- if newB not in (self.toolSelectButton,self.toolMoveButton,self.toolHorizMoveButton,self.toolVertiMoveButton,self.toolRotateButton):
- self.clearSelection()
- self.selectedButton = newB
- self.selectedButton.config(relief = SUNKEN)
- self.status.config(text=self.toolDocs[newB])
-
- #toolbar commands
- def toolSelectCmd(self):
- self.updateSelectedButton(self.toolSelectButton)
- def toolMoveCmd(self):
- self.updateSelectedButton(self.toolMoveButton)
- def toolRotateCmd(self):
- self.updateSelectedButton(self.toolRotateButton)
- def toolVertiMoveCmd(self):
- self.updateSelectedButton(self.toolVertiMoveButton)
- def toolHorizMoveCmd(self):
- self.updateSelectedButton(self.toolHorizMoveButton)
- def toolDrawLinesCmd(self):
- self.updateSelectedButton(self.toolDrawLinesButton)
- def toolDrawBeziCmd(self):
- self.updateSelectedButton(self.toolDrawBeziButton)
- def toolDrawPolyCmd(self):
- self.updateSelectedButton(self.toolDrawPolyButton)
- def toolFillPolyCmd(self):
- self.updateSelectedButton(self.toolFillPolyButton)
- def toolDrawEllipCmd(self):
- self.updateSelectedButton(self.toolDrawEllipButton)
- def toolFillEllipCmd(self):
- self.updateSelectedButton(self.toolFillEllipButton)
- def toolDrawShapeCmd(self):
- self.updateSelectedButton(self.toolDrawShapeButton)
- def toolFillShapeCmd(self):
- self.updateSelectedButton(self.toolFillShapeButton)
- def toolTextCmd(self):
- self.updateSelectedButton(self.toolTextButton)
- def toolAsyCmd(self):
- # ignore the command if we are too busy to process it
- if not self.testOrAcquireLock():
- return
- self.updateSelectedButton(self.toolSelectButton)
- self.clearSelection()
- self.clearHighlight()
- self.unbindGlobalEvents()
- try:
- self.getNewText("// enter your code here")
- except Exception as e:
- messagebox.showerror('xasy Error',e.message)
- else:
- self.addItemToFile(xasyScript(self.mainCanvas))
- text = self.newText
- self.undoRedoStack.add(addScriptAction(self,self.fileItems[-1]))
- self.fileItems[-1].setScript(text)
- self.fileItems[-1].drawOnCanvas(self.mainCanvas,self.magnification)
- self.bindItemEvents(self.fileItems[-1])
- self.bindGlobalEvents()
- self.releaseLock()
- def toolRaiseCmd(self):
- if(not self.testOrAcquireLock()):
- return
- self.releaseLock()
- if not self.inDrawingMode and self.editor == None:
- itemList = []
- indexList = []
- for ID in self.mainCanvas.find_withtag("selectedItem"):
- item = self.findItem(ID)
- if item not in itemList:
- itemList.append(item)
- indexList.append(self.fileItems.index(item))
- self.raiseSomething(item)
- self.undoRedoStack.add(itemRaiseAction(self,itemList,indexList))
- def toolLowerCmd(self):
- if(not self.testOrAcquireLock()):
- return
- self.releaseLock()
- if not self.inDrawingMode and self.editor == None:
- itemList = []
- indexList = []
- for ID in self.mainCanvas.find_withtag("selectedItem"):
- item = self.findItem(ID)
- if item not in itemList:
- itemList.append(item)
- indexList.append(self.fileItems.index(item))
- self.lowerSomething(item)
- self.undoRedoStack.add(itemLowerAction(self,itemList,indexList))
- def itemRaise(self,event):
- self.mainCanvas.tag_raise(CURRENT)
- def itemLower(self,event):
- self.mainCanvas.tag_lower(CURRENT)
-
- #options bar commands
- def setPenColCmd(self):
- if not self.testOrAcquireLock():
- return
- old = self.penColor
- self.penColor = xasyColorDlg(self.parent).getColor(self.penColor)
- if self.penColor != old:
- self.tkPenColor = RGB255hex(RGBreal255(self.penColor))
- self.penColButton.config(activebackground=self.tkPenColor,
- activeforeground=self.foregroundPenColor(self.tkPenColor))
- self.showCurrentPen()
- self.releaseLock()
-
- def clearSelection(self):
- self.hideSelectionBox()
- self.mainCanvas.dtag("selectedItem","selectedItem")
-
- def hideSelectionBox(self):
- self.mainCanvas.itemconfigure("outlineBox",width=1,outline=self.backColor)
- self.mainCanvas.tag_lower("outlineBox")
- self.mainCanvas.coords("outlineBox",self.mainCanvas.bbox(ALL))
-
- def showSelectionBox(self):
- self.mainCanvas.itemconfigure("outlineBox",width=2,outline="#801111")
- self.mainCanvas.tag_raise("outlineBox")
-
- def setSelection(self,what):
- self.mainCanvas.addtag_withtag("selectedItem",what)
- self.updateSelection()
- if self.selectedButton == self.toolSelectButton and len(self.mainCanvas.find_withtag("selectedItem")) > 0:
- self.updateSelectedButton(self.toolMoveButton)
-
- def unSelect(self,what):
- self.mainCanvas.dtag(what,"selectedItem")
- self.updateSelection()
-
- def updateSelection(self):
- self.clearHighlight()
- theBbox = self.mainCanvas.bbox("selectedItem")
- if theBbox != None:
- theBbox = (theBbox[0]-2,theBbox[1]-2,theBbox[2]+2,theBbox[3]+2)
- self.mainCanvas.coords("outlineBox",theBbox)
- self.showSelectionBox()
- else:
- self.clearSelection()
-
- #event handlers
- def updateZoom(self):
- self.zoomMenu.config(state=DISABLED)
- self.magnification = self.magVal.get()/100.0
- if self.magnification != self.previousZoom:
- self.populateCanvasWithItems()
- self.updateCanvasSize()
- self.updateSelection()
- self.drawAxes()
- self.drawGrid()
- self.previousZoom = self.magnification
- self.zoomMenu.config(state=NORMAL)
-
- def zoomViewCmd(self,*args):
- magnification = self.magVal.get()/100.0
- self.updateZoom();
-
- def selectItem(self,item):
- self.clearSelection()
- if isinstance(item,xasyScript) or isinstance(item,xasyText):
- for image in item.imageList:
- self.setSelection(image.IDTag)
- else:
- self.setSelection(item.IDTag)
-
- def propSelect(self,event):
- items = [int(a) for a in self.propList.curselection()]
- if len(items)>0:
- try:
- self.selectItem(self.fileItems[len(self.fileItems)-items[0]-1])
- except:
- raise
-
- def findItem(self,ID):
- for item in self.fileItems:
- if isinstance(item,xasyScript) or isinstance(item,xasyText):
- for image in item.imageList:
- if image.IDTag == ID:
- return item
- else:
- if item.IDTag == ID:
- return item
- raise Exception("Illegal operation: Item with matching ID could not be found.")
-
- def findItemImageIndex(self,item,ID):
- count = 0
- for image in item.imageList:
- if image.IDTag == ID:
- return count
- else:
- count += 1
- raise Exception("Illegal operation: Image with matching ID could not be found.")
- return None
-
- def raiseSomething(self,item,force=False):
- if self.fileItems[-1] != item or force:
- index = len(self.fileItems)-self.fileItems.index(item)-1
- text = self.propList.get(index)
- self.propList.delete(index)
- self.propList.insert(0,text)
- for i in range(self.fileItems.index(item),len(self.fileItems)-1):
- self.fileItems[i] = self.fileItems[i+1]
- self.fileItems[-1] = item
- if isinstance(item,xasyScript) or isinstance(item,xasyText):
- for im in item.imageList:
- if im.IDTag != None:
- self.mainCanvas.tag_raise(im.IDTag)
- else:
- if item.IDTag != None:
- self.mainCanvas.tag_raise(item.IDTag)
-
- def lowerSomething(self,item):
- if self.fileItems[0] != item:
- index = len(self.fileItems)-self.fileItems.index(item)-1
- text = self.propList.get(index)
- self.propList.delete(index)
- self.propList.insert(END,text)
- indices = range(self.fileItems.index(item))
- indices.reverse()
- for i in indices:
- self.fileItems[i+1] = self.fileItems[i]
- self.fileItems[0] = item
- if isinstance(item,xasyScript) or isinstance(item,xasyText):
- item.imageList.reverse()
- for im in item.imageList:
- if im.IDTag != None:
- self.mainCanvas.tag_lower(im.IDTag)
- item.imageList.reverse()
- else:
- if item.IDTag != None:
- self.mainCanvas.tag_lower(item.IDTag)
- self.mainCanvas.tag_lower("axes || grid")
-
- def translateSomething(self,ID,translation,specificItem=None,specificIndex=None):
- transform = asyTransform((translation[0],translation[1],1,0,0,1))
- if ID == -1:
- item = specificItem
- else:
- item = self.findItem(ID)
- if isinstance(item,xasyText) or isinstance(item,xasyScript):
- if ID == -1:
- index = specificIndex
- else:
- index = self.findItemImageIndex(item,ID)
- try:
- original = item.transform[index]
- except:
- original = identity()
- item.transform[index] = transform*original
- bbox = item.imageList[index].originalImage.bbox
- item.imageList[index].originalImage.bbox = bbox[0]+translation[0],bbox[1]+translation[1],bbox[2]+translation[0],bbox[3]+translation[1]
- else:
- item.transform = [transform*item.transform[0]]
-
- def makeRotationMatrix(self,theta,origin):
- rotMat = (math.cos(theta),-math.sin(theta),math.sin(theta),math.cos(theta))
- shift = asyTransform((0,0,1-rotMat[0],-rotMat[1],-rotMat[2],1-rotMat[3]))*origin
- return asyTransform((shift[0],shift[1],rotMat[0],rotMat[1],rotMat[2],rotMat[3]))
-
- def rotateSomething(self,ID,theta,origin,specificItem=None,specificIndex=None):
- #print ("Rotating by {} around {}".format(theta*180.0/math.pi,origin))
- rotMat = self.makeRotationMatrix(theta,(origin[0]/self.magnification,origin[1]/self.magnification))
- #print (rotMat)
- if ID == -1:
- item = specificItem
- else:
- item = self.findItem(ID)
- if isinstance(item,xasyText) or isinstance(item,xasyScript):
- #transform the image
- if ID == -1:
- index = specificIndex
- else:
- index = self.findItemImageIndex(item,ID)
- try:
- original = item.transform[index]
- except:
- original = identity()
- oldBbox = item.imageList[index].originalImage.bbox
- oldBbox = (oldBbox[0],-oldBbox[1],oldBbox[2],-oldBbox[3])
- item.transform[index] = rotMat*item.transform[index]
- item.transform[index] = rotMat*original
- item.imageList[index].originalImage.theta += theta
- item.imageList[index].image = item.imageList[index].originalImage.rotate(item.imageList[index].originalImage.theta*180.0/math.pi,expand=True,resample=Image.BICUBIC)
- item.imageList[index].itk = ImageTk.PhotoImage(item.imageList[index].image)
- self.mainCanvas.itemconfigure(ID,image=item.imageList[index].itk)
- #the image has been rotated in place
- #now, compensate for any resizing and shift to the correct location
- #
- # p0 --- p1 p1
- # | | ---> / \
- # p2 --- p3 p0 p3
- # \ /
- # p2
- #
- rotMat2 = self.makeRotationMatrix(item.imageList[index].originalImage.theta,origin)
- p0 = rotMat2*(oldBbox[0],-oldBbox[3])#switch to usual coordinates
- p1 = rotMat2*(oldBbox[2],-oldBbox[3])
- p2 = rotMat2*(oldBbox[0],-oldBbox[1])
- p3 = rotMat2*(oldBbox[2],-oldBbox[1])
- newTopLeft = (min(p0[0],p1[0],p2[0],p3[0]),-max(p0[1],p1[1],p2[1],p3[1]))#switch back to screen coords
- shift = (newTopLeft[0]-oldBbox[0],newTopLeft[1]-oldBbox[3])
- #print (theta*180.0/math.pi,origin,oldBbox,newTopLeft,shift)
- #print (item.imageList[index].originalImage.size)
- #print (item.imageList[index].image.size)
- #print
- self.mainCanvas.coords(ID,oldBbox[0]+shift[0],oldBbox[3]+shift[1])
- else:
- #transform each point of the object
- xform = rotMat*item.transform[0]
- item.transform = [identity()]
- for i in range(len(item.path.nodeSet)):
- if item.path.nodeSet[i] != 'cycle':
- item.path.nodeSet[i] = xform*item.path.nodeSet[i]
- for i in range(len(item.path.controlSet)):
- item.path.controlSet[i][0] = xform*item.path.controlSet[i][0]
- item.path.controlSet[i][1] = xform*item.path.controlSet[i][1]
- item.drawOnCanvas(self.mainCanvas,self.magnification)
-
- def deleteItem(self,item):
- if isinstance(item,xasyScript) or isinstance(item,xasyText):
- if isinstance(item,xasyScript):
- self.undoRedoStack.add(deleteScriptAction(self,item,self.fileItems.index(item)))
- else:
- self.undoRedoStack.add(deleteLabelAction(self,item,self.fileItems.index(item)))
- for image in item.imageList:
- self.mainCanvas.delete(image.IDTag)
- else:
- if isinstance(item,xasyDrawnItem):
- self.undoRedoStack.add(deleteDrawnItemAction(self,item,self.fileItems.index(item)))
- self.mainCanvas.delete(item.IDTag)
- self.fileItems.remove(item)
- self.populatePropertyList()
- self.clearSelection()
-
- def deleteSomething(self,ID):
- self.clearSelection()
- self.clearHighlight()
- if self.editor != None:
- self.editor.endEdit()
- if self.editor.modified:
- self.undoRedoStack.add(editDrawnItemAction(self,self.itemBeingEdited,copy.deepcopy(self.editor.shape),self.fileItems.index(self.editor.shape)))
- item = self.findItem(ID)
- #save an event on the undoredo stack
- if isinstance(item,xasyScript):
- index = self.findItemImageIndex(item,ID)
- item.transform[index].deleted = True
- else:
- if isinstance(item,xasyText):
- self.undoRedoStack.add(deleteLabelAction(self,item,self.fileItems.index(item)))
- elif isinstance(item,xasyDrawnItem):
- self.undoRedoStack.add(deleteDrawnItemAction(self,item,self.fileItems.index(item)))
- self.fileItems.remove(item)
- self.mainCanvas.delete(ID)
- self.populatePropertyList()
-
- def scriptEditThread(self,oldText):
- try:
- self.newText = xasyCodeEditor.getText(oldText)
- except:
- self.newText = -1
-
- def getNewText(self,oldText):
- editThread = threading.Thread(target=self.scriptEditThread,args=(oldText,))
- editThread.start()
- while editThread.isAlive():
- time.sleep(0.05)
- self.parent.update()
- editThread.join()
- if type(self.newText)==type(-1):
- self.newText = ''
- raise Exception('Error launching external editor. Please check xasy options.')
-
- def itemEdit(self,item):
- # are we too busy?
- if not self.testOrAcquireLock():
- return
- self.updateSelectedButton(self.toolSelectButton)
- if isinstance(item,xasyScript):
- self.unbindGlobalEvents()
- oldText = item.script
- try:
- self.getNewText(oldText)
- except Exception as e:
- messagebox.showerror('xasy Error',e.message)
- else:
- if self.newText != oldText:
- self.undoRedoStack.add(editScriptAction(self,item,self.newText,oldText))
- item.setScript(self.newText)
- item.drawOnCanvas(self.mainCanvas,self.magnification)
- self.bindItemEvents(item)
- self.bindGlobalEvents()
- elif isinstance(item,xasyText):
- theText = simpledialog.askstring(title="Xasy - Text",prompt="Enter text to display:",initialvalue=item.label.text,parent=self.parent)
- if theText != None and theText != "":
- self.undoRedoStack.add(editLabelTextAction(self,item,theText,item.label.text))
- item.label.text = theText
- item.drawOnCanvas(self.mainCanvas,self.magnification)
- self.bindItemEvents(item)
- elif isinstance(item,xasyShape):
- self.clearSelection()
- self.clearHighlight()
- self.itemBeingEdited = copy.deepcopy(item)
- self.editor = xasyBezierEditor(self,item,self.mainCanvas)
- self.updateSelection()
- self.releaseLock()
-
- def itemEditEvt(self,event):
- if not self.inDrawingMode:
- ID = self.mainCanvas.find_withtag(CURRENT)[0]
- item = self.findItem(ID)
- self.itemEdit(item)
-
- def itemDrag(self,event):
- x0,y0 = self.mainCanvas.canvasx(event.x),self.mainCanvas.canvasy(event.y)
- x = x0/self.magnification
- y = y0/self.magnification
- if self.selectedButton not in [self.toolMoveButton,self.toolVertiMoveButton,self.toolHorizMoveButton]:
- return
- if "selectedItem" in self.mainCanvas.gettags(CURRENT):
- self.amDragging = True
- for ID in self.mainCanvas.find_withtag("selectedItem"):
- transform = identity()
- if self.selectedButton == self.toolMoveButton:
- translation = (x0-self.dragStartx,-(y0-self.dragStarty))
- elif self.selectedButton == self.toolVertiMoveButton:
- translation = (0,-(y0-self.dragStarty))
- elif self.selectedButton == self.toolHorizMoveButton:
- translation = (x0-self.dragStartx,0)
- self.translateSomething(ID,(translation[0]/self.magnification,translation[1]/self.magnification))
- self.mainCanvas.move(ID,translation[0],-translation[1])
- self.updateSelection()
- self.updateCanvasSize()
- self.distanceDragged = (self.distanceDragged[0]+translation[0],self.distanceDragged[1]-translation[1])
- self.dragStartx,self.dragStarty = x0,y0
-
- def itemMouseUp(self,event):
- self.freeMouseDown = True
- if self.amDragging:
- IDList = self.mainCanvas.find_withtag("selectedItem")
- itemList = []
- indexList = []
- for ID in IDList:
- item = self.findItem(ID)
- if item not in itemList:
- itemList.append(item)
- try:
- indexList.append([self.findItemImageIndex(item,ID)])
- except:
- indexList.append([None])
- else:
- indexList[itemList.index(item)].append(self.findItemImageIndex(item,ID))
- self.undoRedoStack.add(translationAction(self,itemList,indexList,(self.distanceDragged[0],-self.distanceDragged[1])))
- self.amDragging = False
-
- def itemSelect(self,event):
- x0,y0 = self.mainCanvas.canvasx(event.x),self.mainCanvas.canvasy(event.y)
- x = x0/self.magnification
- y = y0/self.magnification
- self.dragStartx,self.dragStarty = x0,y0
- self.distanceDragged = (0,0)
- if self.selectedButton in [self.toolSelectButton,self.toolMoveButton,self.toolVertiMoveButton,self.toolHorizMoveButton,self.toolRotateButton]:
- self.freeMouseDown = False
- if self.selectedButton == self.toolSelectButton or (len(self.mainCanvas.find_withtag("selectedItem"))<=1 and self.selectedButton in [self.toolMoveButton,self.toolVertiMoveButton,self.toolHorizMoveButton,self.toolRotateButton]):
- self.clearSelection()
- self.setSelection(CURRENT)
-
- def itemToggleSelect(self,event):
- #print ("control click")
- x0,y0 = self.mainCanvas.canvasx(event.x),self.mainCanvas.canvasy(event.y)
- x = x0/self.magnification
- y = y0/self.magnification
- if self.selectedButton in [self.toolSelectButton,self.toolMoveButton,self.toolVertiMoveButton,self.toolHorizMoveButton,self.toolRotateButton]:
- self.freeMouseDown = False
- self.dragStartx,self.dragStarty = x0,y0
- if "selectedItem" in self.mainCanvas.gettags(CURRENT):
- self.unSelect(CURRENT)
- else:
- self.setSelection(CURRENT)
-
- def itemDelete(self,event):
- if(not self.testOrAcquireLock()):
- return
- itemList = []
- self.undoRedoStack.add(endActionGroup)
- for ID in self.mainCanvas.find_withtag("selectedItem"):
- item = self.findItem(ID)
- if isinstance(item,xasyScript):
- index = self.findItemImageIndex(item,ID)
- if item not in itemList:
- itemList.append([item,[index],[item.transform[index]]])
- else:
- x = None
- for i in itemList:
- if i[0] == item:
- x = i
- x[1].append(index)
- x[2].append(item.transform[index])
- self.deleteSomething(ID)
- for entry in itemList:
- self.undoRedoStack.add(deleteScriptItemAction(self,entry[0],entry[1],entry[2]))
- self.undoRedoStack.add(beginActionGroup)
- self.clearSelection()
- self.releaseLock()
-
- def itemMotion(self,event):
- pass
-
- def itemHighlight(self,event):
- if self.selectedButton in [self.toolSelectButton] and self.editor == None:
- box = self.mainCanvas.bbox(CURRENT)
- box = (box[0]-2,box[1]-2,box[2]+2,box[3]+2)
- if len(self.mainCanvas.find_withtag("highlightBox"))==0:
- self.mainCanvas.create_rectangle(box,tags="highlightBox",width=2,outline="red")
- else:
- self.mainCanvas.tag_raise("highlightBox")
- self.mainCanvas.coords("highlightBox",*box)
- self.mainCanvas.tag_bind("highlightBox","<Leave>",self.itemUnHighlight)
-
- def itemUnHighlight(self,event):
- self.clearHighlight()
-
- def clearHighlight(self):
- self.mainCanvas.delete("highlightBox")
-
- def itemLeftDown(self,event):
- pass
-
- def itemLeftUp(self,event):
- pass
-
- def itemRightDown(self,event):
- pass
-
- def itemRightUp(self,event):
- pass
-
- def canvMotion(self,event):
- self.coords.config(
- text="(%.3f,%.3f)"%(self.mainCanvas.canvasx(event.x)/self.magnification,-self.mainCanvas.canvasy(event.y)/self.magnification)
- )
-
- def addItemToFile(self,item):
- self.fileItems.append(item)
- self.propList.insert(0,self.describeItem(item))
- self.updateCanvasSize()
-
- def startDraw(self,event):
- # don't start if we can't finish
- if not self.testOrAcquireLock() and not self.inDrawingMode:
- return
- x0,y0 = self.mainCanvas.canvasx(event.x),self.mainCanvas.canvasy(event.y)
- x = x0/self.magnification
- y = y0/self.magnification
- #self.mainCanvas.create_oval(x,y,x,y,width=5)
- if self.selectedButton == self.toolDrawEllipButton:
- pass
- elif self.selectedButton == self.toolFillEllipButton:
- pass
- elif self.selectedButton == self.toolTextButton:
- theText = simpledialog.askstring(title="Xasy - Text",prompt="Enter text to display:",initialvalue="",parent=self.parent)
- if theText != None and theText != "":
- theItem = xasyText(theText,(x,-y),asyPen(self.penColor,self.penWidth,self.penOptions))
- theItem.drawOnCanvas(self.mainCanvas,self.magnification)
- self.bindItemEvents(theItem)
- self.addItemToFile(theItem)
- self.undoRedoStack.add(addLabelAction(self,theItem))
- self.releaseLock()
- self.updateSelectedButton(self.toolSelectButton)
- elif self.selectedButton in [self.toolDrawLinesButton,self.toolDrawBeziButton,self.toolDrawPolyButton,self.toolDrawShapeButton,self.toolFillPolyButton,self.toolFillShapeButton]:
- self.inDrawingMode = True
- try:
- if len(self.itemBeingDrawn.path.nodeSet) == 0:
- raise Exception
- else:
- if self.selectedButton in [self.toolDrawLinesButton,self.toolDrawPolyButton,self.toolFillPolyButton]:
- self.itemBeingDrawn.appendPoint((x,-y),'--')
- else:#drawBezi,drawShape,fillShape
- self.itemBeingDrawn.appendPoint((x,-y),'..')
- except:
- path = asyPath()
- if self.selectedButton == self.toolDrawLinesButton:
- path.initFromNodeList([(x,-y),(x,-y)],['--'])
- elif self.selectedButton == self.toolDrawBeziButton:
- path.initFromNodeList([(x,-y),(x,-y)],['..'])
- elif self.selectedButton == self.toolDrawPolyButton or self.selectedButton == self.toolFillPolyButton:
- path.initFromNodeList([(x,-y),(x,-y),'cycle'],['--','--'])
- elif self.selectedButton == self.toolDrawShapeButton or self.selectedButton == self.toolFillShapeButton:
- path.initFromNodeList([(x,-y),(x,-y),'cycle'],['..','..'])
- if self.selectedButton in [self.toolDrawLinesButton,self.toolDrawBeziButton,self.toolDrawPolyButton,self.toolDrawShapeButton]:
- self.itemBeingDrawn = xasyShape(path,pen=asyPen(self.penColor,self.penWidth,self.penOptions))
- else:
- if self.penOptions.find("fillrule") != -1 or self.penOptions.find("evenodd") != -1 or self.penOptions.find("zerowinding") != -1:
- options = self.penOptions
- else:
- options = "evenodd"
- self.itemBeingDrawn = xasyFilledShape(path,pen=asyPen(self.penColor,self.penWidth,options))
- self.itemBeingDrawn.drawOnCanvas(self.mainCanvas,self.magnification)
- self.bindItemEvents(self.itemBeingDrawn)
- self.mainCanvas.bind("<Motion>",self.extendDraw)
-
- def extendDraw(self,event):
- x0,y0 = self.mainCanvas.canvasx(event.x),self.mainCanvas.canvasy(event.y)
- x = x0/self.magnification
- y = y0/self.magnification
- tags = self.mainCanvas.gettags("itemBeingDrawn")
- self.itemBeingDrawn.setLastPoint((x,-y))
- self.itemBeingDrawn.drawOnCanvas(self.mainCanvas,self.magnification)
- self.canvMotion(event)
-
- def endDraw(self,event):
- if not self.inDrawingMode or self.itemBeingDrawn == None:
- return
- x0,y0 = self.mainCanvas.canvasx(event.x),self.mainCanvas.canvasy(event.y)
- x = x0/self.magnification
- y = y0/self.magnification
- #if self.selectedButton in [self.toolDrawLinesButton,self.toolDrawPolyButton,self.toolFillPolyButton]:
- #self.itemBeingDrawn.appendPoint((x,-y),'--')
- #else:
- #self.itemBeingDrawn.appendPoint((x,-y),'..')
-
- #only needed for certain key bindings when startDraw is triggered right before an endDraw
- #e.g.: single click: startDraw, double click: endDraw
- self.itemBeingDrawn.removeLastPoint()
- self.itemBeingDrawn.setLastPoint((x,-y))
- self.itemBeingDrawn.drawOnCanvas(self.mainCanvas,self.magnification)
- self.addItemToFile(self.itemBeingDrawn)
- self.undoRedoStack.add(addDrawnItemAction(self,self.itemBeingDrawn))
- self.itemBeingDrawn = None
- self.mainCanvas.dtag("itemBeingDrawn","itemBeingDrawn")
- self.mainCanvas.bind("<Motion>",self.canvMotion)
- self.inDrawingMode = False
- self.releaseLock()
-
- def canvLeftDown(self,event):
- #print ("Left Mouse Down")
- self.selectDragStart = (self.mainCanvas.canvasx(event.x),self.mainCanvas.canvasy(event.y))
- theBbox = self.mainCanvas.bbox("selectedItem")
- if theBbox != None:
- self.selectBboxMidpoint = (theBbox[0]+theBbox[2])/2.0,-(theBbox[1]+theBbox[3])/2.0
- if self.freeMouseDown and self.editor != None:
- self.editor.endEdit()
- if self.editor.modified:
- self.undoRedoStack.add(editDrawnItemAction(self,self.itemBeingEdited,copy.deepcopy(self.editor.shape),self.fileItems.index(self.editor.shape)))
- self.editor = None
- elif self.selectedButton in (self.toolSelectButton,self.toolMoveButton,self.toolVertiMoveButton,self.toolHorizMoveButton,self.toolRotateButton):
- if self.freeMouseDown:
- self.clearSelection()
- self.dragSelecting = False
- else:
- self.startDraw(event)
-
- def canvLeftUp(self,event):
- #print ("Left Mouse Up")
- # if we're busy, ignore it
- if not self.testOrAcquireLock():
- return
- self.freeMouseDown = True
- if self.inRotatingMode:
- for item in self.itemsBeingRotated:
- item.drawOnCanvas(self.mainCanvas,self.magnification)
- self.bindItemEvents(item)
- self.updateSelection()
- self.itemsBeingRotated = []
- self.inRotatingMode = False
- if self.dragSelecting:
- self.hideSelectionBox()
- self.dragSelecting = False
- self.mainCanvas.addtag_enclosed("enclosed",self.selectDragStart[0],self.selectDragStart[1],self.mainCanvas.canvasx(event.x),self.mainCanvas.canvasy(event.y))
- for item in self.mainCanvas.find_withtag("enclosed"):
- tags = self.mainCanvas.gettags(item)
- if "drawn" not in tags and "image" not in tags:
- self.mainCanvas.dtag(item,"enclosed")
- self.mainCanvas.addtag_withtag("selectedItem","enclosed")
- self.mainCanvas.dtag("enclosed","enclosed")
- if self.selectedButton == self.toolSelectButton and len(self.mainCanvas.find_withtag("selectedItem")) > 0:
- self.updateSelectedButton(self.toolMoveButton)
- self.updateSelection()
- self.releaseLock()
-
- def canvDrag(self,event):
- x0,y0 = self.mainCanvas.canvasx(event.x),self.mainCanvas.canvasy(event.y)
- x = x0/self.magnification
- y = y0/self.magnification
- if self.selectedButton == self.toolSelectButton and self.editor == None:
- self.mainCanvas.coords("outlineBox",self.selectDragStart[0],self.selectDragStart[1],x0,y0)
- self.showSelectionBox()
- self.dragSelecting = True
- elif self.selectedButton == self.toolRotateButton and self.editor == None:
- bbox = self.mainCanvas.bbox("selectedItem")
- if bbox != None:
- p1 = self.selectDragStart[0]-self.selectBboxMidpoint[0],-self.selectDragStart[1]-self.selectBboxMidpoint[1]
- mp1 = math.sqrt(p1[0]**2+p1[1]**2)
- p2 = x0-self.selectBboxMidpoint[0],-y0-self.selectBboxMidpoint[1]
- mp2 = math.sqrt(p2[0]**2+p2[1]**2)
- if mp1 != 0:
- t1 = math.acos(p1[0]/mp1)
- if p1[1] < 0:
- t1 *= -1
- else:
- t1 = 0
- if mp2 != 0:
- t2 = math.acos(p2[0]/mp2)
- if p2[1] < 0:
- t2 *= -1
- else:
- t2 = 0
- theta = t2-t1
- self.selectDragStart = x0,y0
- self.itemsBeingRotated = []
- for ID in self.mainCanvas.find_withtag("selectedItem"):
- self.rotateSomething(ID,theta,self.selectBboxMidpoint)
- item = self.findItem(ID)
- if not item in self.itemsBeingRotated:
- self.itemsBeingRotated.append(item)
- self.updateSelection()
- self.updateCanvasSize()
- if not self.inRotatingMode:
- self.currentRotationAngle = theta
- IDList = self.mainCanvas.find_withtag("selectedItem")
- itemList = []
- indexList = []
- for ID in IDList:
- item = self.findItem(ID)
- if item not in itemList:
- itemList.append(item)
- try:
- indexList.append([self.findItemImageIndex(item,ID)])
- except:
- indexList.append([None])
- else:
- indexList[itemList.index(item)].append(self.findItemImageIndex(item,ID))
- self.undoRedoStack.add(rotationAction(self,itemList,indexList,self.currentRotationAngle,self.selectBboxMidpoint))
- self.inRotatingMode = True
- else:
- self.currentRotationAngle += theta
- self.undoRedoStack.undoStack[-1].angle = self.currentRotationAngle
-
- def canvEnter(self,event):
- self.freeMouseDown = True
- event.widget.focus_set()
-
- def canvLeave(self,event):
- self.freeMouseDown = False
-
- def canvRightDown(self,event):
- pass
- #print ("Right Mouse Down")
-
- def canvRightUp(self,event):
- pass
- #print ("Right Mouse Up")
-
- def configEvt(self,event):
- self.updateCanvasSize()
- self.sizePane()
-
- def sizePane(self):
- width = self.windowPane.winfo_width()-10
- cwidth = min(int(0.87*self.windowPane.winfo_width()),width-75)
- if self.paneVisible:
- self.windowPane.paneconfigure(self.canvFrame,minsize=cwidth)
- else:
- self.windowPane.paneconfigure(self.canvFrame,minsize=width)
- self.windowPane.paneconfigure(self.propFrame,minsize=75)
-
- def togglePaneEvt(self,event):
- self.paneVisible = not self.paneVisible
- self.sizePane()
-
- def popupDelete(self):
- self.deleteItem(self.itemPopupMenu.item)
-
- def popupEdit(self):
- self.itemEdit(self.itemPopupMenu.item)
-
- def popupViewCode(self):
- messagebox.showinfo("Item Code",self.itemPopupMenu.item.getCode())
-
- def popupClearTransform(self):
- self.undoRedoStack.add(clearItemTransformsAction(self,self.itemPopupMenu.item,copy.deepcopy(self.itemPopupMenu.item.transform)))
- if isinstance(self.itemPopupMenu.item,xasyScript) or isinstance(self.itemPopupMenu.item,xasyText):
- for i in range(len(self.itemPopupMenu.item.transform)):
- self.itemPopupMenu.item.transform[i] = identity()
- else:
- self.itemPopupMenu.item.transform = [identity()]
- self.popupRedrawItem()
-
- def popupRedrawItem(self):
- if not self.testOrAcquireLock():
- return
- self.clearSelection()
- self.clearHighlight()
- self.itemPopupMenu.item.drawOnCanvas(self.mainCanvas,self.magnification)
- self.bindItemEvents(self.itemPopupMenu.item)
- self.updateCanvasSize()
- self.releaseLock()
-
- def hidePopupMenu(self):
- try:
- self.itemPopupMenu.unpost()
- except:
- pass
-
- def itemMenuPopup(self,parent,item,x,y):
- self.hidePopupMenu()
- self.itemPopupMenu = Menu(parent,tearoff=False)
- self.itemPopupMenu.add_command(label="Edit",command=self.popupEdit)
- self.itemPopupMenu.add_command(label="Clear Transforms",command=self.popupClearTransform)
- self.itemPopupMenu.add_command(label="Redraw",command=self.popupRedrawItem)
- self.itemPopupMenu.add_command(label="View code",command=self.popupViewCode)
- self.itemPopupMenu.add_separator()
- self.itemPopupMenu.add_command(label="Delete",command=self.popupDelete)
- self.itemPopupMenu.item = item
- #self.itemPopupMenu.bind("<Leave>",lambda a:self.itemPopupMenu.unpost())
- #self.itemPopupMenu.bind("<FocusOut>",lambda a:self.itemPopupMenu.unpost())
- self.itemPopupMenu.post(x,y)
-
- def itemPropMenuPopup(self,event):
- try:
- item = self.fileItems[len(self.fileItems)-int(self.propList.curselection()[0])-1]
- self.itemMenuPopup(self.propList,item,event.x_root,event.y_root)
- except:
- pass
-
- def itemCanvasMenuPopup(self,event):
- if self.selectedButton in (self.toolSelectButton,self.toolMoveButton,self.toolVertiMoveButton,self.toolHorizMoveButton,self.toolRotateButton):
- try:
- item = self.findItem(self.mainCanvas.find_withtag(CURRENT)[0])
- except:
- item = None
- if item != None:
- self.itemMenuPopup(self.mainCanvas,item,event.x_root,event.y_root)
-
- def editOptions(self):
- if(not self.testOrAcquireLock()):
- return
- self.releaseLock()
- xasyOptionsDialog.xasyOptionsDlg(self.parent)
- self.applyOptions()
-
- def resetOptions(self):
- xasyOptions.setDefaults()
- self.applyOptions()
-
- def applyPenWidth(self):
- self.pendingPenWidthChange = None
- if self.validatePenWidth():
- old = self.penWidth
- self.penWidth = float(self.penWidthEntry.get())
- if old != self.penWidth:
- self.showCurrentPen()
-
- def validatePenWidth(self):
- text = self.penWidthEntry.get()
- try:
- width = float(text)
- if width <= 0:
- return False
- else:
- return True
- except:
- return False
-
- def showCurrentPen(self):
- mag = 1
- width = self.penWidth
- while width > 10:
- width /= 2
- mag *= 2
- self.penDisp.itemconfigure("penDisp",width=width,fill=self.tkPenColor)
- self.penDisp.itemconfigure("penMag",text="x%d"%mag)
- #apply the new pen to any selected items
- IDs = self.mainCanvas.find_withtag("selectedItem")
- madeAChange = False
- for ID in IDs:
- item = self.findItem(ID)
- if not isinstance(item,xasyScript):
- if not madeAChange:
- self.undoRedoStack.add(endActionGroup)
- madeAChange = True
- if isinstance(item,xasyText):
- temp = item.label.pen
- item.label.pen = asyPen(self.penColor,self.penWidth,self.penOptions)
- item.drawOnCanvas(self.mainCanvas,self.magnification)
- self.bindItemEvents(item)
- self.setSelection(item.imageList[0].IDTag)
- self.undoRedoStack.add(editLabelPenAction(self,temp,asyPen(self.penColor,self.penWidth,self.penOptions),self.fileItems.index(item)))
- else:
- temp = copy.deepcopy(item)
- item.pen = asyPen(self.penColor,self.penWidth,self.penOptions)
- item.drawOnCanvas(self.mainCanvas,self.magnification)
- self.undoRedoStack.add(editDrawnItemAction(self,temp,copy.deepcopy(item),self.fileItems.index(item)))
- if madeAChange:
- self.undoRedoStack.add(beginActionGroup)
-
- def applyPenWidthEvt(self,event):
- if not self.testOrAcquireLock():
- return
- self.applyPenWidth()
- self.releaseLock()
-
- def penWidthChanged(self,event):
- if self.pendingPenWidthChange is not None:
- self.penWidthEntry.after_cancel(self.pendingPenWidthChange)
- self.pendingPenWidthChange = self.penWidthEntry.after(1000,self.applyPenWidth)
-
- def applyPenOptEvt(self,event):
- if not self.testOrAcquireLock():
- return
- self.applyPenOpt()
- self.releaseLock()
-
- def validatePenOpt(self):
- try:
- penTest = asyPen(self.penColor,self.penWidth,self.penOptEntry.get())
- return True
- except:
- self.penOptEntry.select_range(0,END)
- self.penOptEntry.delete(0,END)
- self.penOptEntry.insert(END,"Invalid Pen Options")
- self.penOptEntry.after(5000,self.clearInvalidOptEntry)
- self.penOptions = ""
- return False
-
- def clearInvalidOptEntry(self):
- self.penOptEntry.select_range(0,END)
- self.penOptEntry.delete(0,END)
-
- def applyPenOpt(self):
- if self.validatePenOpt():
- old = self.penOptions
- self.penOptions = self.penOptEntry.get()
- if old != self.penOptions:
- self.showCurrentPen()
-
- def undoOperation(self):
- self.undoRedoStack.undo()
-
- def redoOperation(self):
- self.undoRedoStack.redo()
-
- def resetStacking(self):
- for item in self.fileItems:
- self.raiseSomething(item,force=True)
diff --git a/Build/source/utils/asymptote/GUI/xasyOptions.py b/Build/source/utils/asymptote/GUI/xasyOptions.py
index 927490b77aa..8f023b2eeb4 100755
--- a/Build/source/utils/asymptote/GUI/xasyOptions.py
+++ b/Build/source/utils/asymptote/GUI/xasyOptions.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
###########################################################################
#
# xasyOptions provides a mechanism for storing and restoring a user's
@@ -10,117 +10,149 @@
#
###########################################################################
-import pickle
-import sys,os
-import errno
-
-defaultOptions = {
- 'asyPath':'asy',
- 'showDebug':False,
- 'showGrid':False,
- 'gridX':10,
- 'gridY':10,
- 'gridColor':'#eeeeee',
- 'showAxes':True,
- 'axisX':10,
- 'axisY':10,
- 'axesColor':'#cccccc',
- 'tickColor':'#eeeeee',
- 'defPenOptions':'',
- 'defPenColor':'#000000',
- 'defPenWidth':1.0,
- 'externalEditor':''
- }
-
-if sys.platform[:3] == "win":
- defaultOptions['externalEditor'] = "%PROGRAMFILES%\Windows NT\Accessories\wordpad.exe"
-else:
- defaultOptions['externalEditor'] = "emacs"
-
-
-options = defaultOptions.copy()
-
-def settingsFileLocation():
- folder = ""
- try:
- folder = os.path.expanduser("~/.asy/")
- except:
+import json
+import sys
+import io
+import os
+import platform
+import shutil
+
+import configs
+
+try:
+ import cson
+except ModuleNotFoundError:
+ cson = None
+
+try:
pass
- return os.path.normcase(os.path.join(folder,"xasy.conf"))
+# import yaml
+except ModuleNotFoundError:
+ yaml = None
+
+class xasyOptions:
+ def defaultOptions(self):
+ if self._defaultOptions is None:
+ f = io.open(self._defualtOptLocation)
+ try:
+ opt = cson.loads(f.read())
+ finally:
+ f.close()
+ self._defaultOptions = opt
+ return self._defaultOptions
+
+ def overrideSettings(self):
+ settingsName = platform.system()
+
+ if settingsName not in self.options:
+ return
+
+ for key in self.options[settingsName]:
+ self.options[key] = self.options[settingsName][key]
+
+
+ def settingsFileLocation(self):
+ folder = os.path.expanduser("~/.asy/")
+
+ searchOrder = ['.cson', '.yaml', '.json', '']
+
+ searchIndex = 0
+ found = False
+ currentFile = ''
+ while searchIndex < len(searchOrder) and not found:
+ currentFile = os.path.join(folder, self.configName + searchOrder[searchIndex])
+ if os.path.isfile(currentFile):
+ found = True
+ searchIndex += 1
+
+ if found:
+ return os.path.normcase(currentFile)
+ else:
+ return os.path.normcase(os.path.join(folder, self.configName + '.cson'))
+ def __init__(self, configName, defaultConfigLocation):
+ self.configName = configName
+ self.defaultConfigName = defaultConfigLocation
+
+ self._defaultOptions = None
+ self._defualtOptLocation = os.path.join(defaultConfigLocation)
+
+ self.options = self.defaultOptions()
+ self.load()
+
+ def __getitem__(self, item):
+ return self.options[item]
+
+ def __setitem__(self, key, value):
+ self.options[key] = value
+
+ def load(self):
+ fileName = self.settingsFileLocation()
+ if not os.path.exists(fileName):
+ # make folder
+ thedir = os.path.dirname(fileName)
+ if not os.path.exists(thedir):
+ os.makedirs(thedir)
+ if not os.path.isdir(thedir):
+ raise Exception("Configuration folder path does not point to a folder")
+ self.setDefaults()
+ f = io.open(fileName, 'r')
+ try:
+ ext = os.path.splitext(fileName)[1]
+ if ext == '.cson':
+ if cson is None:
+ raise ModuleNotFoundError
+ newOptions = cson.loads(f.read())
+ elif ext in {'.yml', '.yaml'}:
+ if yaml is None:
+ raise ModuleNotFoundError
+ newOptions = yaml.load(f)
+ else:
+ newOptions = json.loads(f.read())
+ except (IOError, ModuleNotFoundError):
+ self.setDefaults()
+ else:
+ for key in self.options.keys():
+ if key in newOptions:
+ assert isinstance(newOptions[key], type(self.options[key]))
+ else:
+ newOptions[key] = self.options[key]
+ self.options = newOptions
+ finally:
+ f.close()
+
+ def setDefaults(self):
+ self.options = self.defaultOptions()
+ if sys.platform[:3] == 'win': # for windows, wince, win32, etc
+ # setAsyPathFromWindowsRegistry()
+ pass
+ folder = os.path.expanduser("~/.asy/")
+ defaultPath = os.path.join(folder, self.configName + '.cson')
+ shutil.copy2(self._defualtOptLocation, defaultPath)
+
+
+# TODO: Figure out how to merge this back.
+"""
def setAsyPathFromWindowsRegistry():
- try:
- import _winreg as registry
- #test both registry locations
- try:
- key = registry.OpenKey(registry.HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\Asymptote")
- options['asyPath'] = registry.QueryValueEx(key,"Path")[0]+"\\asy.exe"
- registry.CloseKey(key)
- except:
- key = registry.OpenKey(registry.HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Asymptote")
- options['asyPath'] = registry.QueryValueEx(key,"InstallLocation")[0]+"\\asy.exe"
- registry.CloseKey(key)
- except:
- #looks like asy is not installed or this isn't Windows
- pass
+ if os.name == 'nt':
+ import _winreg as registry
+ # test both registry locations
+ try:
+ key = registry.OpenKey(registry.HKEY_LOCAL_MACHINE,
+ "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\Asymptote")
+ options['asyPath'] = registry.QueryValueEx(key, "Path")[0] + "\\asy.exe"
+ registry.CloseKey(key)
+ except:
+ key = registry.OpenKey(registry.HKEY_LOCAL_MACHINE,
+ "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Asymptote")
+ options['asyPath'] = registry.QueryValueEx(key, "InstallLocation")[0] + "\\asy.exe"
+ registry.CloseKey(key)
+"""
+
-def setDefaults():
- global options
- options = defaultOptions.copy()
- if sys.platform[:3] == 'win': #for windows, wince, win32, etc
- setAsyPathFromWindowsRegistry()
- save()
-
-def load():
- global options
- fileName = settingsFileLocation()
- if not os.path.exists(fileName):
- #make folder
- thedir = os.path.dirname(fileName)
- if not os.path.exists(thedir):
- try:
- os.makedirs(thedir)
- except:
- raise Exception("Could not create configuration folder")
- if not os.path.isdir(thedir):
- raise Exception("Configuration folder path does not point to a folder")
- setDefaults()
- try:
- f = open(fileName,"rb")
- newOptions = pickle.load(f)
- for key in options.keys():
- if type(newOptions[key]) != type(options[key]):
- raise Exception("Bad type for entry in xasy settings")
- options = newOptions
- except:
- setDefaults()
-
-def save():
- global options
- fileName = settingsFileLocation()
- try:
- f = open(fileName,"wb")
- pickle.dump(options,f)
- f.close()
- except:
- raise Exception("Error saving preferences")
-
-load()
-
-if __name__=='__main__':
- print (settingsFileLocation())
- print ("Current content")
- load()
- print ("Setting defaults")
- setDefaults()
- save()
- load()
- options['showAxes'] = options['showGrid'] = False
- save()
- print ("Set to False")
- load()
- options['showAxes'] = options['showGrid'] = True
- save()
- print ("Set to True")
- load()
- print (options)
+class BasicConfigs:
+ _configPath = list(configs.__path__)[0]
+ defaultOpt = xasyOptions(
+ 'xasyconfig', os.path.join(_configPath, 'xasyconfig.cson'))
+ keymaps = xasyOptions('xasykeymap', os.path.join(
+ _configPath, 'xasykeymap.cson'))
diff --git a/Build/source/utils/asymptote/GUI/xasyOptionsDialog.py b/Build/source/utils/asymptote/GUI/xasyOptionsDialog.py
deleted file mode 100755
index 271070ea457..00000000000
--- a/Build/source/utils/asymptote/GUI/xasyOptionsDialog.py
+++ /dev/null
@@ -1,234 +0,0 @@
-#!/usr/bin/env python
-###########################################################################
-#
-# xasyOptionsDialog implements a dialog window to allow users to edit
-# their preferences and specify program options
-#
-#
-# Author: Orest Shardt
-# Created: June 29, 2007
-#
-###########################################################################
-
-import os
-import sys
-import xasyOptions
-import xasyColorPicker
-
-if sys.version_info >= (3, 0):
- from tkinter import *
- from tkinter import simpledialog, messagebox, filedialog
-else:
- # python2
- from Tkinter import *
- import tkSimpleDialog as simpledialog
- import tkMessageBox as messagebox
- import tkFileDialog as filedialog
- # import tkColorChooser as colorchooser
-
-class xasyOptionsDlg(simpledialog.Dialog):
- """A dialog to interact with users about their preferred settings"""
- def __init__(self,master=None):
- simpledialog.Dialog.__init__(self,master,"xasy Options")
-
- def body(self,master):
- optFrame = Frame(master)
- optFrame.grid(row=0,column=0,sticky=N+S+E+W)
-
- asyGrp = LabelFrame(optFrame,text="Asymptote",padx=5,pady=5)
- asyGrp.grid(row=0,column=0,sticky=E+W)
- asyGrp.rowconfigure(0,weight=1)
- asyGrp.rowconfigure(1,weight=1)
- asyGrp.columnconfigure(0,weight=1)
- asyGrp.columnconfigure(0,weight=2)
- Label(asyGrp,text="Command").grid(row=0,column=0,sticky=W)
- self.ap = Entry(asyGrp)
- self.ap.insert(END,xasyOptions.options['asyPath'])
- self.ap.grid(row=0,column=1,sticky=E+W)
- Button(asyGrp,text="...",command=self.findAsyPath).grid(row=0,column=2,sticky=E+W)
- self.showDebug = BooleanVar()
- self.showDebug.set(xasyOptions.options['showDebug'])
- self.sd = Checkbutton(asyGrp,text="Show debugging info in console",var=self.showDebug)
- self.sd.grid(row=1,column=0,columnspan=2,sticky=W)
-
- editGrp = LabelFrame(optFrame,text="External Editor",padx=5,pady=5)
- editGrp.grid(row=1,column=0,sticky=E+W)
- editGrp.rowconfigure(0,weight=1)
- editGrp.rowconfigure(1,weight=1)
- editGrp.columnconfigure(0,weight=1)
- editGrp.columnconfigure(0,weight=2)
- Label(editGrp,text="Program").grid(row=0,column=0,sticky=W)
- self.ee = Entry(editGrp)
- self.ee.insert(END,xasyOptions.options['externalEditor'])
- self.ee.grid(row=0,column=1,sticky=E+W)
- Button(editGrp,text="...",command=self.findEEPath).grid(row=0,column=2,sticky=E+W)
-
- penGrp = LabelFrame(optFrame,text="Default Pen",padx=5,pady=5)
- penGrp.grid(row=2,column=0,sticky=E+W)
- penGrp.rowconfigure(0,weight=1)
- penGrp.rowconfigure(1,weight=1)
- penGrp.rowconfigure(2,weight=1)
- penGrp.columnconfigure(1,weight=1)
- Label(penGrp,text="Color").grid(row=0,column=0,sticky=E)
- self.pc = xasyOptions.options['defPenColor']
- Button(penGrp,text="Change",command=self.changePenColor).grid(row=0,column=1,sticky=W)
- Label(penGrp,text="Width").grid(row=1,column=0,sticky=E)
- self.pw = Entry(penGrp)
- self.pw.insert(END,str(xasyOptions.options['defPenWidth']))
- self.pw.grid(row=1,column=1,sticky=E+W)
- Label(penGrp,text="Options").grid(row=2,column=0,sticky=E)
- self.po = Entry(penGrp)
- self.po.insert(END,xasyOptions.options['defPenOptions'])
- self.po.grid(row=2,column=1,sticky=E+W)
-
- dispGrp = LabelFrame(optFrame,text="Display Options",padx=5,pady=5)
- dispGrp.grid(row=3,column=0,sticky=E+W)
- dispGrp.rowconfigure(0,weight=1)
- dispGrp.rowconfigure(1,weight=1)
- dispGrp.rowconfigure(2,weight=1)
- dispGrp.rowconfigure(3,weight=1)
- dispGrp.columnconfigure(0,weight=1)
- dispGrp.columnconfigure(1,weight=1)
- dispGrp.columnconfigure(2,weight=1)
- self.showAxes = BooleanVar()
- self.showAxes.set(xasyOptions.options['showAxes'])
- self.sa = Checkbutton(dispGrp,text="Show Axes",var=self.showAxes)
- self.sa.grid(row=0,column=0,sticky=W)
- self.ac = xasyOptions.options['axesColor']
- Button(dispGrp,text="Color...",command=self.changeAxesColor).grid(row=1,column=0)
- Label(dispGrp,text="x").grid(row=0,column=1,padx=5,sticky=E)
- self.axs = Entry(dispGrp,width=6)
- self.axs.insert(END,xasyOptions.options['axisX'])
- self.axs.grid(row=0,column=2,sticky=W+E)
- Label(dispGrp,text="y").grid(row=1,column=1,padx=5,sticky=E)
- self.ays = Entry(dispGrp,width=6)
- self.ays.insert(END,xasyOptions.options['axisY'])
- self.ays.grid(row=1,column=2,sticky=W+E)
-
- self.showGrid = BooleanVar()
- self.showGrid.set(xasyOptions.options['showGrid'])
- self.sg = Checkbutton(dispGrp,text="Show Grid",var=self.showGrid)
- self.sg.grid(row=4,column=0,sticky=W)
- self.gc = xasyOptions.options['gridColor']
- Button(dispGrp,text="Color...",command=self.changeGridColor).grid(row=3,column=0)
- Label(dispGrp,text="x").grid(row=2,column=1,padx=5,sticky=E)
- self.gxs = Entry(dispGrp,width=6)
- self.gxs.insert(END,xasyOptions.options['gridX'])
- self.gxs.grid(row=2,column=2,sticky=W+E)
- Label(dispGrp,text="y").grid(row=3,column=1,padx=5,sticky=E)
- self.gys = Entry(dispGrp,width=6)
- self.gys.insert(END,xasyOptions.options['gridY'])
- self.gys.grid(row=3,column=2,sticky=W+E)
-
- def findEEPath(self):
- if sys.platform[:3] == 'win': #for windows, wince, win32, etc
- file=filedialog.askopenfile(filetypes=[("Programs","*.exe"),("All files","*")],title="Choose External Editor",parent=self)
- else:
- file=filedialog.askopenfile(filetypes=[("All files","*")],title="Choose External Editor",parent=self)
- if file != None:
- name = os.path.abspath(file.name)
- file.close()
- self.ee.delete(0,END)
- self.ee.insert(END,name)
- self.validate()
-
- def findAsyPath(self):
- if sys.platform[:3] == 'win': #for windows, wince, win32, etc
- file=filedialog.askopenfile(filetypes=[("Programs","*.exe"),("All files","*")],title="Find Asymptote Executable",parent=self)
- else:
- file=filedialog.askopenfile(filetypes=[("All files","*")],title="Find Asymptote Executable",parent=self)
- if file != None:
- name = os.path.abspath(file.name)
- file.close()
- self.ap.delete(0,END)
- self.ap.insert(END,name)
- self.validate()
-
- def getAColor(self,color):
- result = xasyColorPicker.xasyColorDlg(self).getColor(xasyColorPicker.makeRGBfromTkColor(color))
- return xasyColorPicker.RGB255hex(xasyColorPicker.RGBreal255(result))
-
- def changeAxesColor(self):
- self.ac = self.getAColor(self.ac)
-
- def changeGridColor(self):
- self.gc = self.getAColor(self.gc)
-
- def changePenColor(self):
- self.pc = self.getAColor(self.pc)
-
- def apply(self):
- xasyOptions.options['externalEditor'] = self.ee.get()
- xasyOptions.options['asyPath'] = self.ap.get()
- xasyOptions.options['showDebug'] = bool(self.showDebug.get())
-
- xasyOptions.options['defPenColor'] = self.pc
- xasyOptions.options['defPenWidth'] = float(self.pw.get())
- xasyOptions.options['defPenOptions'] = self.po.get()
-
- xasyOptions.options['showAxes'] = bool(self.showAxes.get())
- xasyOptions.options['axesColor'] = self.ac
- xasyOptions.options['tickColor'] = self.ac
- xasyOptions.options['axisX'] = int(self.axs.get())
- xasyOptions.options['axisY'] = int(self.ays.get())
- xasyOptions.options['showGrid'] = bool(self.showGrid.get())
- xasyOptions.options['gridColor'] = self.gc
- xasyOptions.options['gridX'] = int(self.gxs.get())
- xasyOptions.options['gridY'] = int(self.gys.get())
- xasyOptions.save()
-
- def validateAColor(self,color):
- hexdigits = '0123456789abcdef'
- if len(self.pc) != 7 or self.pc[0] != '#' or sum([1 for a in self.pc[1:] if a in hexdigits]) != 6:
- return False
- else:
- return True
-
- def validate(self):
- """Validate the data entered into the dialog"""
- #validate the color
- hexdigits = '0123456789abcdef'
- if not self.validateAColor(self.pc):
- messagebox.showerror("xasy Options","Invalid pen color.\r\n"+self.pc,parent=self)
- return False
- #validate the width
- try:
- test = float(self.pw.get())
- except:
- messagebox.showerror("xasy Options","Pen width must be a number.",parent=self)
- return False
-
- #validate the options
- #nothing to do
-
- #validate the axis spacing
- try:
- test = int(self.axs.get())
- test = int(self.ays.get())
- except:
- messagebox.showerror("xasy Options","Axes' x- and y-spacing must be numbers.",parent=self)
- return False
-
- #validate the grid spacing
- try:
- test = int(self.gxs.get())
- test = int(self.gys.get())
- except:
- messagebox.showerror("xasy Options","Grid's x- and y-spacing must be numbers.",parent=self)
- return False
-
- if not self.validateAColor(self.ac):
- messagebox.showerror("xasy Options","Invalid axis color.\r\n"+self.ac,parent=self)
- return False
-
- if not self.validateAColor(self.gc):
- messagebox.showerror("xasy Options","Invalid grid color.\r\n"+self.gc,parent=self)
- return False
-
- return True
-
-if __name__ == '__main__':
- root = Tk()
- xasyOptions.load()
- d = xasyOptionsDlg(root)
- print (d.result)
diff --git a/Build/source/utils/asymptote/GUI/xasyStrings.py b/Build/source/utils/asymptote/GUI/xasyStrings.py
new file mode 100644
index 00000000000..53f83a64f14
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/xasyStrings.py
@@ -0,0 +1,23 @@
+#!/usr/bin/env python3
+
+import gettext
+
+p = property
+
+class xasyString:
+ def __init__(self, lang=None):
+ s = self
+ if lang is None:
+ _ = lambda x: x
+ else:
+ lng = gettext.translation('base', localedir='GUI/locale', languages=[lang])
+ lng.install()
+ _ = lng.gettext
+
+ s.rotate = _('Rotate')
+ s.scale = _('Scale')
+ s.translate = _('Translate')
+
+ s.fileOpenFailed = _('File Opening Failed.')
+ s.fileOpenFailedText = _('File could not be opened.')
+ s.asyfyComplete = _('Ready.')
diff --git a/Build/source/utils/asymptote/GUI/xasySvg.py b/Build/source/utils/asymptote/GUI/xasySvg.py
new file mode 100644
index 00000000000..a5325f9bdd6
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/xasySvg.py
@@ -0,0 +1,22 @@
+#!/usr/bin/env python3
+
+import PyQt5.QtGui as Qg
+import PyQt5.QtWidgets as Qw
+import io
+import subprocess
+import sys
+
+class SvgObject():
+ def __init__(self, file: str):
+ self.file=file
+
+ def render(self, dpi:int) -> Qg.QImage:
+ try:
+ rawDataProc = subprocess.Popen(['rsvg-convert', '--dpi-x', str(dpi),
+ '--dpi-y', str(dpi), self.file],
+ stdout=subprocess.PIPE)
+ except:
+ Qw.QMessageBox.about(None,'rsvg-convert missing','Please install rsvg-convert version >= 2.40 in your path.')
+ sys.exit(-1)
+
+ return Qg.QImage.fromData(rawDataProc.stdout.read(), 'PNG')
diff --git a/Build/source/utils/asymptote/GUI/xasyTransform.py b/Build/source/utils/asymptote/GUI/xasyTransform.py
new file mode 100644
index 00000000000..928e9011f0a
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/xasyTransform.py
@@ -0,0 +1,24 @@
+#!/usr/bin/env python3
+import xasy2asy as x2a
+import PyQt5.QtGui as Qg
+import PyQt5.QtCore as Qc
+import numpy as np
+import math
+
+
+class xasyTransform:
+ @classmethod
+ def makeRotTransform(cls, theta, origin):
+ if isinstance(origin, Qc.QPointF) or isinstance(origin, Qc.QPoint):
+ origin = (origin.x(), origin.y())
+ rotMat = (math.cos(theta), -math.sin(theta), math.sin(theta), math.cos(theta))
+ shift = x2a.asyTransform((0, 0, 1 - rotMat[0], -rotMat[1], -rotMat[2], 1 - rotMat[3])) * origin
+ return x2a.asyTransform((shift[0], shift[1], rotMat[0], rotMat[1], rotMat[2], rotMat[3]))
+
+ @classmethod
+ def makeScaleTransform(cls, sx, sy, origin):
+ if isinstance(origin, Qc.QPointF) or isinstance(origin, Qc.QPoint):
+ origin = (origin.x(), origin.y())
+ shiftMat = x2a.asyTransform((0, 0, 1 - sx, 0, 0, 1 - sy)) * origin
+ return x2a.asyTransform((shiftMat[0], shiftMat[1], sx, 0, 0, sy))
+
diff --git a/Build/source/utils/asymptote/GUI/xasyUtils.py b/Build/source/utils/asymptote/GUI/xasyUtils.py
new file mode 100644
index 00000000000..255e8b6addc
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/xasyUtils.py
@@ -0,0 +1,50 @@
+#!/usr/bin/env python3
+
+import re
+import typing as ty
+import math
+import itertools
+
+def tuple2StrWOspaces(val: tuple) -> str:
+ newStr = ','.join(['{:.6g}'.format(value) for value in val])
+ return '({0})'.format(newStr)
+
+def tryParse(val, typ=float):
+ try:
+ return typ(val)
+ except ValueError:
+ return None
+
+def funcOnList(list1: ty.Union[ty.List, ty.Tuple], list2: ty.Union[ty.List, ty.Tuple], func: ty.Callable) -> tuple:
+ """Returns [f(x[i], y[i]) : i in 1, ..., n - 1] in order with f as func
+ and x and y as list1 and 2. """
+
+ assert len(list1) == len(list2)
+ return tuple([func(list1[i], list2[i]) for i in range(len(list1))])
+
+
+def listize(str, typ, delim='()') -> list:
+ str = str.strip(delim)
+ raw_elem = str.split(',')
+ final_list = []
+ if isinstance(typ, (list, tuple)):
+ for i in range(len(raw_elem)):
+ if i < len(typ):
+ curr_typ = typ[i]
+ else:
+ curr_typ = typ[-1]
+ final_list.append(curr_typ(raw_elem[i].strip()))
+ else:
+ for elem in raw_elem:
+ final_list.append(typ(elem.strip()))
+ return final_list
+
+def twonorm(vec: ty.Iterable[ty.Union[float, int]]) -> float:
+ rawSquared = sum(map(lambda x: x*x, vec))
+ return math.sqrt(rawSquared)
+
+def tryParseKey(raw_key):
+ """Returns None if raw key is not in #.# format"""
+ # See https://regex101.com/r/6G9MZD/1/
+ # for the regex data
+ return re.fullmatch(r'^(\d+)\.(\d+)$', raw_key)
diff --git a/Build/source/utils/asymptote/GUI/xasyValidator.py b/Build/source/utils/asymptote/GUI/xasyValidator.py
new file mode 100644
index 00000000000..264e105441d
--- /dev/null
+++ b/Build/source/utils/asymptote/GUI/xasyValidator.py
@@ -0,0 +1,13 @@
+#!/usr/bin/env python3
+
+def validateFloat(text):
+ try:
+ float(text)
+ return True
+ except ValueError:
+ return False
+
+
+if __name__ == '__main__':
+ assert validateFloat('0.5')
+ assert not validateFloat('.-')
diff --git a/Build/source/utils/asymptote/Makefile.in b/Build/source/utils/asymptote/Makefile.in
index fb02d79e3eb..437026673c0 100644
--- a/Build/source/utils/asymptote/Makefile.in
+++ b/Build/source/utils/asymptote/Makefile.in
@@ -21,6 +21,8 @@ PERL = perl
SHAREDLIBS = $(filter-out -lGL -lGLU -lglut -pthread $(GCLIBS), $(LIBS))
vpath %.cc prc
+vpath %.ui GUI/windows
+vpath %.py GUI/pyUIClass
CAMP = camperror path drawpath drawlabel picture psfile texfile util settings \
guide flatguide knot drawfill path3 drawpath3 drawsurface \
@@ -45,12 +47,13 @@ COREFILES = $(CAMP) $(SYMBOL_FILES) env genv stm dec errormsg \
FILES = $(COREFILES) main
-SYMBOLSH = opsymbols.h allsymbols.h
+SYMBOLSH = opsymbols.h allsymbols.h $(SYMBOL_FILES:=.symbols.h)
DIST = camp.tab.h camp.tab.cc lex.yy.cc runtime.cc keywords.cc \
asy-keywords.el $(RUNTIME_FILES:=.cc) $(RUNTIME_FILES:=.h) asy.list \
- $(SYMBOLSH) $(SYMBOL_FILES:=.symbols.h)
+ $(SYMBOLSH)
NAME = asy
XNAME = x$(NAME)
+UIFILES = $(wildcard GUI/windows/*.ui)
CLEAN = camp.output base/version.asy doc/version.texi \
GUI/xasyVersion.py $(XNAME) doc/asy-latex.pdf $(SYMBOLSH)
EXTRA = asy-mode.el asy-init.el asy.vim asy_filetype.vim asy-kate.sh \
@@ -58,7 +61,7 @@ EXTRA = asy-mode.el asy-init.el asy.vim asy_filetype.vim asy-kate.sh \
EXEXTRA = piicon.eps *.views *.dat *.bib
DOCEXTRA = *.asy *.csv *.dat latexusage.tex externalprc.tex pixel.pdf
KEYWORDS = base $(ASYMPTOTE_SITEDIR)
-LATEXFILES = asymptote.sty asycolors.sty ocg.sty latexmkrc
+LATEXFILES = asymptote.sty asycolors.sty ocg.sty latexmkrc
CONTEXTFILES = colo-asy.tex
ASY = ./asy -dir base -config "" -render=0
@@ -107,6 +110,7 @@ endif
export prefix docdir exampledir mandir infodir INSTALL MAKE DESTDIR TEXI2DVI
asy: version
+ -pyrcc5 GUI/res/icons.qrc -o GUI/icons_rc.py
if test -n "$(MSDOS)"; then \
$(CXX) $(OPTS) -o $(NAME) $(FILES:=.o) revision.o asy.o $(DOSLIBS); \
else \
@@ -114,7 +118,7 @@ asy: version
$(CXX) $(OPTS) -o $(NAME) $(FILES:=.o) revision.o $(LIBS); \
fi
-version: $(GCLIB) $(FILES:=.o)
+version: $(GCLIB) $(FILES:=.o) $(UIFILES:.ui=.py)
if test ! -s revision.cc -o "$(revision)" != "$(last)"; then \
echo $(REVISION)\"$(revision)\"\; > revision.cc; \
fi
@@ -124,7 +128,7 @@ version: $(GCLIB) $(FILES:=.o)
echo @set VERSION $(revision) > doc/version.texi
echo @set Datadir @datadir@ >> doc/version.texi
- echo "#!/usr/bin/env python" > GUI/xasyVersion.py
+ echo "#!/usr/bin/env python3" > GUI/xasyVersion.py
echo xasyVersion = \"$(revision)\" >> GUI/xasyVersion.py
if test -n "$(MSDOS)"; then \
@@ -221,7 +225,9 @@ asy-keywords.el: asy
grep -v three_\* | grep -v featpost3D | xargs $(ASY) -l >> asy.list
$(PERL) ./asy-list.pl asy.list $(revision)
-install: asy-keywords.el install-texhash install-man
+install-notexhash: asy-keywords.el install-asy install-man
+
+install: install-notexhash install-texhash
install-all: install install-html
@@ -231,14 +237,19 @@ install-texhash: install-asy
fi
install-asy: asy sty
- ${INSTALL} -d $(bindir) $(asydir) $(GUIdir) $(exampledir) \
- $(animationsdir)
+ ${INSTALL} -d $(bindir) $(asydir) $(exampledir) $(animationsdir)
+ ${INSTALL} -d $(GUIdir) $(GUIdir)/pyUIClass $(GUIdir)/configs \
+ $(GUIdir)/res $(GUIdir)/res/icons
-${INSTALL} -d $(latexdir)
-${INSTALL} -d $(contextdir)
${INSTALL} -p -m 755 $(NAME) $(bindir)
${INSTALL} -p -m 644 base/*.asy $(addprefix base/,$(EXTRA)) \
asy-keywords.el $(asydir)
${INSTALL} -p -m 755 GUI/*.py $(GUIdir)
+ ${INSTALL} -p -m 644 GUI/pyUIClass/*.py $(GUIdir)/pyUIClass
+ ${INSTALL} -p -m 644 GUI/configs/*.cson $(GUIdir)/configs
+ ${INSTALL} -p -m 644 GUI/res/icons.qrc $(GUIdir)/res
+ ${INSTALL} -p -m 644 GUI/res/icons/*.svg $(GUIdir)/res/icons
ln -sf @datadir@/asymptote/GUI/xasy.py $(bindir)/$(XNAME)
${INSTALL} -p -m 644 examples/*.asy $(addprefix examples/,$(EXEXTRA)) \
doc/extra/*.asy $(addprefix doc/,$(DOCEXTRA)) $(exampledir)
@@ -276,7 +287,7 @@ uninstall-asy:
-rmdir $(contextdir)
-cd $(bindir) && rm -f $(NAME) $(XNAME)
-uninstall-man:
+uninstall-man:
cd doc && $(MAKE) uninstall
uninstall-docdir:
@@ -316,22 +327,24 @@ check-all: asy FORCE
./wce
$(MAKE) -C tests all
-.SUFFIXES: .c .cc .o .d
-.cc.o:
+.SUFFIXES: .c .cc .o .d .ui .py
+%.o: %.cc
$(CXX) $(OPTS) $(INCL) -o $@ -c $<
-.cc.d:
+%.d: %.cc
@echo Creating $@; \
rm -f $@; \
${CXX} $(MAKEDEPEND) $(INCL) $(MDOPTS) $< > $@.$$$$ 2>/dev/null && \
sed 's,\($*\)\.o[ :]*,\1.o \1.pic.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
-.c.d:
+%.d: %.c
@echo Creating $@; \
rm -f $@; \
${CC} $(MAKEDEPEND) $(INCL) $(MDOPTS) $< > $@.$$$$ 2>/dev/null && \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
-
+%.py: %.ui
+ mkdir -p GUI/pyUIClass
+ -pyuic5 -o GUI/pyUIClass/$(notdir $@) $<
# Compile for the shared library. OpenGL must be disabled as it causes
# crashes inside a shared library.
%.pic.o: %.cc
@@ -351,4 +364,3 @@ Makefile: Makefile.in config.status
config.status: configure
./config.status --recheck
-
diff --git a/Build/source/utils/asymptote/Pipfile b/Build/source/utils/asymptote/Pipfile
new file mode 100644
index 00000000000..7a9e19a0f6b
--- /dev/null
+++ b/Build/source/utils/asymptote/Pipfile
@@ -0,0 +1,11 @@
+[[source]]
+url = "https://pypi.org/simple"
+verify_ssl = true
+name = "pypi"
+
+[packages]
+
+[dev-packages]
+
+[requires]
+python_version = "3.6"
diff --git a/Build/source/utils/asymptote/README b/Build/source/utils/asymptote/README
index d64637a9c46..8fc96cb80c8 100644
--- a/Build/source/utils/asymptote/README
+++ b/Build/source/utils/asymptote/README
@@ -47,8 +47,22 @@ the GNU Scientific Library, GNU Readline library, and other GPL
libraries. This version of Asymptote also ships with the dll libraries
noted below.
-The source code for the 2.7.0 cygwin1.dll is available under the GPL license:
-https://cygwin.com/snapshots/x86/cygwin-20170203-src.tar.xz
+The source code for the x86_64 2.9.0-3 cygwin1.dll is available under the
+GPL license:
+https://cygwin.com/snapshots/x86_64/cygwin-20170823-src.tar.xz
+
+The source code for the i386 2.10.0-1 cygwin1.dll is available under the
+GPL license:
+https://cygwin.com/snapshots/x86/cygwin-20171219-src.tar.xz
The source code for freeglut.dll is available under the X-Consortium license:
http://prdownloads.sourceforge.net/freeglut/freeglut-2.8.1.tar.gz
+
+Source for various icons is available under the MIT license from
+https://github.com/driftyco/ionicons/archive/v2.0.1.zip
+https://github.com/iconic/open-iconic/archive/master.zip
+under the CC-BY-SA 4.0 license:
+http://www.entypo.com/
+and under a CC license:
+http://www.zondicons.com/zondicons.zip
+ \ No newline at end of file
diff --git a/Build/source/utils/asymptote/ReleaseNotes b/Build/source/utils/asymptote/ReleaseNotes
index 33983b81a6a..b36a9067b6c 100644
--- a/Build/source/utils/asymptote/ReleaseNotes
+++ b/Build/source/utils/asymptote/ReleaseNotes
@@ -1,3 +1,28 @@
+Release Notes for Version 2.47
+
+Further shipout and scaling problems were fixed. Unused files were removed.
+Multiple-page documents now produce PS instead of EPS output.
+
+Release Notes for Version 2.46
+
+The pen width is now accounted for in the bbox function. The relative
+alignment of a label to a path now transforms correctly with picture
+rotation. Various shipout issues were fixed. The ghostscript library
+location from the MSWindows registry is now ignored for compatibility
+with TeXLive.
+
+Release Notes for Version 2.45
+
+The xasy graphical front end for Asymptote has been rewritten to
+support code reordering, using Qt5 and scalable vector graphics.
+An uninitialized counter was fixed. A stable=true option was added to sort.
+The restricted simplex method has been replaced by a complete simplex
+solver that handles general size constraints. The rpc library has been
+replaced by the tirpc library. The dvips utility is forced to respect
+EPS requirements again. The system ghostscript library is now used by
+default for dvisvgm. Make clean now removes GSL symbols. The MSWindows
+system path is no longer modified by the installer. A CLZ bug was fixed.
+
Release Notes for Version 2.44
Floating point exceptions are masked again under CYGWIN, pending strtod bug fix
diff --git a/Build/source/utils/asymptote/arrayop.h b/Build/source/utils/asymptote/arrayop.h
index a4d2abdad83..f63d8ae099b 100644
--- a/Build/source/utils/asymptote/arrayop.h
+++ b/Build/source/utils/asymptote/arrayop.h
@@ -355,7 +355,7 @@ void writeArray(vm::stack *s)
vm::item it=pop(s);
bool defaultfile=isdefault(it);
camp::ofile *f=defaultfile ? &camp::Stdout : vm::get<camp::ofile*>(it);
- if(!f->enabled()) return;
+ if(!f->isOpen() || !f->enabled()) return;
size_t asize=checkArray(a);
size_t Asize=checkArray(A);
@@ -407,11 +407,13 @@ template<class T>
void writeArray2(vm::stack *s)
{
array *a=pop<array*>(s);
- camp::file *f=pop<camp::file*>(s,&camp::Stdout);
+ vm::item it=pop(s);
+ bool defaultfile=isdefault(it);
+ camp::ofile *f=defaultfile ? &camp::Stdout : vm::get<camp::ofile*>(it);
+ if(!f->isOpen() || !f->enabled()) return;
size_t size=checkArray(a);
if(f->Standard()) interact::lines=0;
- else if(!f->isOpen()) return;
try {
for(size_t i=0; i < size; i++) {
@@ -437,11 +439,13 @@ template<class T>
void writeArray3(vm::stack *s)
{
array *a=pop<array*>(s);
- camp::file *f=pop<camp::file*>(s,&camp::Stdout);
+ vm::item it=pop(s);
+ bool defaultfile=isdefault(it);
+ camp::ofile *f=defaultfile ? &camp::Stdout : vm::get<camp::ofile*>(it);
+ if(!f->isOpen() || !f->enabled()) return;
size_t size=checkArray(a);
if(f->Standard()) interact::lines=0;
- else if(!f->isOpen()) return;
try {
for(size_t i=0; i < size;) {
diff --git a/Build/source/utils/asymptote/asy-keywords.el b/Build/source/utils/asymptote/asy-keywords.el
index b77e5cda967..4607bf1fe1c 100644
--- a/Build/source/utils/asymptote/asy-keywords.el
+++ b/Build/source/utils/asymptote/asy-keywords.el
@@ -2,16 +2,16 @@
;; This file is automatically generated by asy-list.pl.
;; Changes will be overwritten.
;;
-(defvar asy-keywords-version "2.44")
+(defvar asy-keywords-version "2.47")
(defvar asy-keyword-name '(
and controls tension atleast curl if else while for do return break continue struct typedef new access import unravel from include quote static public private restricted this explicit true false null cycle newframe operator ))
(defvar asy-type-name '(
-Braid FitResult Label Legend Solution TreeNode abscissa arc arrowhead binarytree binarytreeNode block bool bool3 bounds bqe circle conic coord coordsys cputime ellipse evaluatedpoint file filltype frame grid3 guide horner hsv hyperbola indexedTransform int inversion key light line linefit marginT marker mass object pair parabola patch path path3 pen picture point position positionedvector projection rational real revolution scaleT scientific segment side slice solution splitface string surface tensionSpecifier ticklocate ticksgridT tickvalues transform transformation tree triangle trilinear triple vector vertex void ))
+Braid FitResult Label Legend Solution TreeNode abscissa arc arrowhead binarytree binarytreeNode block bool bool3 bounds bqe circle conic coord coordsys cputime ellipse evaluatedpoint file filltype frame grid3 guide horner hsv hyperbola int inversion key light line linefit marginT marker mass node object pair parabola patch path path3 pen picture point position positionedvector projection rational real revolution scaleT scientific segment side simplex slice solution splitface string surface tensionSpecifier ticklocate ticksgridT tickvalues transform transformation tree triangle trilinear triple vector vertex void ))
(defvar asy-function-name '(
-AND Arc ArcArrow ArcArrows Arrow Arrows AtA Automatic AvantGarde B03 B13 B23 B33 BBox BWRainbow BWRainbow2 Bar Bars BeginArcArrow BeginArrow BeginBar BeginDotMargin BeginMargin BeginPenMargin Blank Bookman Bottom BottomTop Bounds Break Broken BrokenLog CLZ CTZ Ceil Circle CircleBarIntervalMarker Cos Courier CrossIntervalMarker DOSendl DOSnewl DefaultFormat DefaultLogFormat Degrees Dir DotMargin DotMargins Dotted Draw Drawline Embed EndArcArrow EndArrow EndBar EndDotMargin EndMargin EndPenMargin Fill FillDraw Floor Format Full Gaussian Gaussrand Gaussrandpair Gradient Grayscale Helvetica Hermite HookHead InOutTicks InTicks Jn Label Landscape Left LeftRight LeftTicks Legend Linear Log LogFormat Margin Margins Mark MidArcArrow MidArrow NOT NewCenturySchoolBook NoBox NoMargin NoModifier NoTicks NoTicks3 NoZero NoZeroFormat None OR OmitFormat OmitTick OmitTickInterval OmitTickIntervals OutTicks Ox Oy Palatino PaletteTicks Pen PenMargin PenMargins Pentype Portrait RadialShade RadialShadeDraw Rainbow Range Relative Right RightTicks Rotate Round SQR Scale ScaleX ScaleY ScaleZ Seascape Shift Sin Slant Spline StickIntervalMarker Straight Symbol Tan TeXify Ticks Ticks3 TildeIntervalMarker TimesRoman Top TrueMargin UnFill UpsideDown Wheel X XEquals XOR XY XYEquals XYZero XYgrid XZEquals XZZero XZero XZgrid Y YEquals YXgrid YZ YZEquals YZZero YZero YZgrid Yn Z ZX ZXgrid ZYgrid ZapfChancery ZapfDingbats _begingroup3 _cputime _draw _eval _findroot _image _labelpath _projection _strokepath _texpath aCos aSin aTan abort abs accel acos acosh acot acsc activatequote add addArrow addMargins addSaveFunction addpenarc addpenline addseg adjust alias align all altitude angabscissa angle angledegrees angpoint animate annotate anticomplementary antipedal apply approximate arc arcarrowsize arccircle arcdir arcfromcenter arcfromfocus arclength arcnodesnumber arcpoint arcsubtended arcsubtendedcenter arctime arctopath array arrow arrow2 arrowbase arrowbasepoints arrowsize ascii asec asin asinh ask assert asy asycode asydir asyfigure asyfilecode asyinclude asywrite atan atan2 atanh atbreakpoint atexit attach attract atupdate autoformat autoscale autoscale3 axes axes3 axialshade axis axiscoverage azimuth babel background bangles bar barmarksize barsize basealign baseline bbox beep begin beginclip begingroup beginpoint between bevel bezier bezierP bezierPP bezierPPP bezulate bibliography bibliographystyle binarytree binarytreeNode binomial bins bisector bisectorpoint bispline bitreverse blend blockconnector box bqe brace breakpoint breakpoints brick buildRestoreDefaults buildRestoreThunk buildcycle bulletcolor byte calculateScaling canonical canonicalcartesiansystem cartesiansystem case1 case2 case3 cbrt cd ceil center centerToFocus centroid cevian change2 changecoordsys checkSegment check_fpt_zero checkconditionlength checker checkincreasing checklengths checkposition checkpt checkptincube checktriangle choose circle circlebarframe circlemarkradius circlenodesnumber circumcenter circumcircle clamped clear clip clipdraw close cmyk code colatitude collect collinear color colorless colors colorspace comma compassmark complement complementary concat concurrent cone conic conicnodesnumber conictype conj connect containmentTree contains contour contour3 controlSpecifier convert coordinates coordsys copy copyPairOrTriple cos cosh cot countIntersections cputime crop cropcode cross crossframe crosshatch crossmarksize csc cubicroots curabscissa curlSpecifier curpoint currentarrow currentexitfunction currentmomarrow currentpolarconicroutine curve cut cutafter cutbefore cyclic cylinder deactivatequote debugger deconstruct defaultdir defaultformat defaultpen defined degenerate degrees delete deletepreamble determinant diagonal diamond diffdiv dir dirSpecifier dirtime display distance divisors do_overpaint dot dotframe dotsize downcase draw drawAll drawDoubleLine drawFermion drawGhost drawGluon drawMomArrow drawPRCcylinder drawPRCdisk drawPRCsphere drawPRCtube drawPhoton drawScalar drawVertex drawVertexBox drawVertexBoxO drawVertexBoxX drawVertexO drawVertexOX drawVertexTriangle drawVertexTriangleO drawVertexX drawarrow drawarrow2 drawbeziertriangle drawline drawpixel drawstrokepath drawtick duplicate elle ellipse ellipsenodesnumber embed embed3 embedplayer empty enclose end endScript endclip endgroup endgroup3 endl endpoint endpoints eof eol equation equations erase erasestep erf erfc error errorbar errorbars eval excenter excircle exit exitXasyMode exitfunction exp expfactors expi expm1 exradius extend extension extouch fabs factorial fermat fft fhorner figure file filecode fill filldraw filloutside fillrule filltype find findall findroot finite finiteDifferenceJacobian firstcut firstframe fit fit2 fixedscaling floor flush fmdefaults fmod focusToCenter font fontcommand fontsize foot format frac frequency fromCenter fromFocus fspline functionshade gamma gcd generate_random_backtrace generateticks gergonne getc getint getpair getreal getstring gettriple gluon gouraudshade graph graphic graphicscale gray grestore grid grid3 gsave halfbox hatch hdiffdiv hermite hex histogram history hline hprojection hsv hyperbola hyperbolanodesnumber hyperlink hypot identity image implicitsurface incenter incentral incircle increasing incrementposition indexedTransform indexedfigure initXasyMode initdefaults initialized input inradius insert inside insphere integrate interactive interior interp interpolate intersect intersection intersectionpoint intersectionpoints intersections intouch inverse inversion invisible is3D isDuplicate isnan isogonal isogonalconjugate isotomic isotomicconjugate isparabola italic item jobname key kurtosis kurtosisexcess label labelaxis labelmargin labelpath labels labeltick labelx labelx3 labely labely3 labelz labelz3 lastcut latex latitude latticeshade layer layout lcm ldexp leastsquares legend legenditem length lexorder lift light limits line linear linecap lineinversion linejoin linemargin lineskip linetype linewidth link list lm_enorm lm_evaluate_default lm_lmdif lm_lmpar lm_minimize lm_print_default lm_print_quiet lm_qrfac lm_qrsolv locale locate locatefile location log log10 log1p logaxiscoverage longitude lookup make3dgrid makeNode makecircle makedraw makepen maketriangle map margin markangle markangleradius markanglespace markarc marker markinterval marknodes markrightangle markthin markuniform mass masscenter massformat math max max3 maxAfterTransform maxbezier maxbound maxcoords maxlength maxratio maxtimes mean medial median midpoint min min3 minAfterTransform minbezier minbound minipage minratio mintimes miterlimit mktemp momArrowPath momarrowsize monotonic multifigure nGrad nativeformat natural needshipout newl newpage newslide newton newtree nextframe nextnormal nextpage nib nodabscissa none norm normalout normalvideo nosetpagesize notaknot nowarn numberpage nurb object offset onpath opacity opposite orient orientation origin orthic orthocentercenter outformat outline outname outprefix output overloadedMessage overwrite pack pad pairs palette parabola parabolanodesnumber parallel parallelogram partialsum patchwithnormals path path3 pathbetween pathinface pattern pause pdf pedal periodic perp perpendicular perpendicularmark phantom phi1 phi2 phi3 photon piecewisestraight point polar polarconicroutine polargraph polygon popcount postcontrol postscript pow10 ppoint prc prc0 prconly precision precontrol prepend printBytecode print_random_addresses progress project projection projecttospan projecttospan_findcoeffs purge pwhermite quadpatches quadrant quadraticroots quantize quarticroots quotient radialshade radians radicalcenter radicalline radius rand randompath rd readline realmult realquarticroots rectangle rectangular rectify reflect relabscissa relative relativedistance reldir relpoint reltime remainder remark removeDuplicates rename replace report resetdefaultpen restore restoredefaults reverse reversevideo rf rfind rgb rgba rgbint rms rotate rotateO rotation round roundbox roundedpath roundrectangle samecoordsys sameside sample save savedefaults saveline scale scale3 scaleO scaleT scaleless scientific search searchtree sec secondaryX secondaryY seconds section sector seek seekeof segment segmentlimits sequence setpens sgn sgnd sharpangle sharpdegrees shift shiftless shipout shipout3 show simeq simpson sin sinh size size3 skewness skip slant sleep slice slope slopefield solve solveBVP sort sourceline sphere split sqrt square srand standardizecoordsys startScript stdev step stickframe stickmarksize stickmarkspace stop straight straightness string stripdirectory stripextension stripfile stripsuffix strokepath subdivide subitem subpath substr sum surface symmedial symmedian system tab tableau tan tangent tangential tangents tanh tell tensionSpecifier tensorshade tex texcolor texify texpath texpreamble texreset texshipout texsize textpath thick thin tick tickMax tickMax3 tickMin tickMin3 ticklabelshift ticklocate tildeframe tildemarksize tile tiling time times title titlepage topbox transform transformation transpose trembleFuzz triangle triangleAbc triangleabc triangletoquads trianglewithnormals triangulate tricoef tridiagonal trilinear trim truepoint tube uncycle unfill uniform unique unit unitrand unitsize unityroot unstraighten upcase updatefunction uperiodic upscale uptodate usepackage usersetting usetypescript usleep value variance variancebiased vbox vector vectorfield verbatim view vline vperiodic vprojection warn warning windingnumber write xaxis xaxis3 xaxis3At xaxisAt xequals xlimits xpart xscale xscaleO xtick xtick3 xtrans yaxis yaxis3 yaxis3At yaxisAt yequals ylimits ypart yscale yscaleO ytick ytick3 ytrans zaxis3 zaxis3At zero zlimits zpart ztick ztick3 ztrans ))
+AND Arc ArcArrow ArcArrows Arrow Arrows AtA Automatic AvantGarde B03 B13 B23 B33 BBox BWRainbow BWRainbow2 Bar Bars BeginArcArrow BeginArrow BeginBar BeginDotMargin BeginMargin BeginPenMargin Blank Bookman Bottom BottomTop Bounds Break Broken BrokenLog CLZ CTZ Ceil Circle CircleBarIntervalMarker Cos Courier CrossIntervalMarker DOSendl DOSnewl DefaultFormat DefaultLogFormat Degrees Dir DotMargin DotMargins Dotted Draw Drawline Embed EndArcArrow EndArrow EndBar EndDotMargin EndMargin EndPenMargin Fill FillDraw Floor Format Full Gaussian Gaussrand Gaussrandpair Gradient Grayscale Helvetica Hermite HookHead InOutTicks InTicks Jn Label Landscape Left LeftRight LeftTicks Legend Linear Log LogFormat Margin Margins Mark MidArcArrow MidArrow NOT NewCenturySchoolBook NoBox NoMargin NoModifier NoTicks NoTicks3 NoZero NoZeroFormat None OR OmitFormat OmitTick OmitTickInterval OmitTickIntervals OutTicks Ox Oy Palatino PaletteTicks Pen PenMargin PenMargins Pentype Portrait RGB RadialShade RadialShadeDraw Rainbow Range Relative Right RightTicks Rotate Round SQR Scale ScaleX ScaleY ScaleZ Seascape Shift Sin Slant Spline StickIntervalMarker Straight Symbol Tan TeXify Ticks Ticks3 TildeIntervalMarker TimesRoman Top TrueMargin UnFill UpsideDown Wheel X XEquals XOR XY XYEquals XYZero XYgrid XZEquals XZZero XZero XZgrid Y YEquals YXgrid YZ YZEquals YZZero YZero YZgrid Yn Z ZX ZXgrid ZYgrid ZapfChancery ZapfDingbats _begingroup3 _cputime _draw _eval _findroot _image _labelpath _projection _shipout _strokepath _texpath aCos aSin aTan abort abs accel acos acosh acot acsc activatequote add addArrow addMargins addSaveFunction addpenarc addpenline addseg adjust alias align all altitude angabscissa angle angledegrees angpoint animate annotate anticomplementary antipedal apply approximate arc arcarrowsize arccircle arcdir arcfromcenter arcfromfocus arclength arcnodesnumber arcpoint arcsubtended arcsubtendedcenter arctime arctopath array arrow arrow2 arrowbase arrowbasepoints arrowsize ascii asec asin asinh ask assert asy asycode asydir asyfigure asyfilecode asyinclude asywrite atan atan2 atanh atbreakpoint atexit attach attract atupdate autoformat autoscale autoscale3 axes axes3 axialshade axis axiscoverage azimuth babel background bangles bar barmarksize barsize basealign baseline bbox beep begin beginclip begingroup beginpoint between bevel bezier bezierP bezierPP bezierPPP bezulate bibliography bibliographystyle binarytree binarytreeNode binomial bins bisector bisectorpoint bispline bitreverse blend blockconnector box bqe brace breakpoint breakpoints brick buildRestoreDefaults buildRestoreThunk buildcycle bulletcolor byte calculateScaling canonical canonicalcartesiansystem cartesiansystem case1 case2 case3 cbrt cd ceil center centerToFocus centroid cevian change2 changecoordsys checkSegment check_fpt_zero checkconditionlength checker checkincreasing checklengths checkposition checkpt checkptincube checktriangle choose circle circlebarframe circlemarkradius circlenodesnumber circumcenter circumcircle clamped clear clip clipdraw close cmyk code colatitude collect collinear color colorless colors colorspace comma compassmark complement complementary concat concurrent cone conic conicnodesnumber conictype conj connect containmentTree contains contour contour3 controlSpecifier convert coordinates coordsys copy copyPairOrTriple cos cosh cot countIntersections cputime crop cropcode cross crossframe crosshatch crossmarksize csc cubicroots curabscissa curlSpecifier curpoint currentarrow currentexitfunction currentmomarrow currentpolarconicroutine curve cut cutafter cutbefore cyclic cylinder deactivatequote debugger deconstruct defaultdir defaultformat defaultpen defined degenerate degrees delete deletepreamble determinant diagonal diamond diffdiv dir dirSpecifier dirtime display distance divisors do_overpaint dot dotframe dotsize downcase draw drawAll drawDoubleLine drawFermion drawGhost drawGluon drawMomArrow drawPRCcylinder drawPRCdisk drawPRCsphere drawPRCtube drawPhoton drawScalar drawVertex drawVertexBox drawVertexBoxO drawVertexBoxX drawVertexO drawVertexOX drawVertexTriangle drawVertexTriangleO drawVertexX drawarrow drawarrow2 drawbeziertriangle drawline drawpixel drawstrokepath drawtick duplicate elle ellipse ellipsenodesnumber embed embed3 embedplayer empty enclose end endclip endgroup endgroup3 endl endpoint endpoints eof eol equation equations erase erasestep erf erfc error errorbar errorbars eval excenter excircle exit exitfunction exp expfactors expi expm1 exradius extend extension extouch fabs factorial fermat fft fhorner figure file filecode fill filldraw filloutside fillrule filltype find findall findroot finite finiteDifferenceJacobian firstcut firstframe fit fit2 fixedscaling floor flush fmdefaults fmod focusToCenter font fontcommand fontsize foot format frac frequency fromCenter fromFocus fspline functionshade gamma gcd generate_random_backtrace generateticks gergonne getc getint getpair getreal getstring gettriple gluon gouraudshade graph graphic graphicscale gray grestore grid grid3 gsave halfbox hatch hdiffdiv hermite hex histogram history hline hprojection hsv hyperbola hyperbolanodesnumber hyperlink hypot identity image implicitsurface incenter incentral incircle increasing incrementposition indexedfigure initdefaults initialized input inradius insert inside insphere integrate interactive interior interp interpolate intersect intersection intersectionpoint intersectionpoints intersections intouch inverse inversion invisible is3D isDuplicate isnan isogonal isogonalconjugate isotomic isotomicconjugate isparabola italic item jobname key kurtosis kurtosisexcess label labelaxis labelmargin labelpath labels labeltick labelx labelx3 labely labely3 labelz labelz3 lastcut latex latitude latticeshade layer layout lcm ldexp leastsquares legend legenditem length lexorder lift light limits line linear linecap lineinversion linejoin linemargin lineskip linetype linewidth link list lm_enorm lm_evaluate_default lm_lmdif lm_lmpar lm_minimize lm_print_default lm_print_quiet lm_qrfac lm_qrsolv locale locate locatefile location log log10 log1p logaxiscoverage longitude lookup make3dgrid makeNode makecircle makedraw makepen maketriangle map margin markangle markangleradius markanglespace markarc marker markinterval marknodes markrightangle markthin markuniform mass masscenter massformat math max max3 maxAfterTransform maxbezier maxbound maxcoords maxlength maxratio maxtimes mean medial median midpoint min min3 minAfterTransform minbezier minbound minipage minratio mintimes miterlimit mktemp momArrowPath momarrowsize monotonic multifigure nGrad nativeformat natural newl newpage newslide newton newtree nextframe nextnormal nextpage nib nodabscissa node none norm normalout normalvideo nosetpagesize notaknot nowarn numberpage nurb object offset onpath opacity opposite orient orientation origin orthic orthocentercenter outformat outline outname outprefix output overloadedMessage overwrite pack pad pairs palette parabola parabolanodesnumber parallel parallelogram partialsum patchwithnormals path path3 pathbetween pathinface pattern pause pdf pedal periodic perp perpendicular perpendicularmark phantom phi1 phi2 phi3 photon piecewisestraight point polar polarconicroutine polargraph polygon popcount postcontrol postscript pow10 ppoint prc prc0 prconly precision precontrol prepend printBytecode print_random_addresses progress project projection projecttospan projecttospan_findcoeffs purge pwhermite quadpatches quadrant quadraticroots quantize quarticroots quotient radialshade radians radicalcenter radicalline radius rand randompath rd readline realmult realquarticroots rectangle rectangular rectify reflect relabscissa relative relativedistance reldir relpoint reltime remainder remark removeDuplicates rename replace report resetdefaultpen restore restoredefaults reverse reversevideo rf rfind rgb rgba rgbint rms rotate rotateO rotation round roundbox roundedpath roundrectangle samecoordsys sameside sample save savedefaults saveline scale scale3 scaleO scaleT scaleless scientific search searchtree sec secondaryX secondaryY seconds section sector seek seekeof segment segmentlimits sequence setpens sgn sgnd sharpangle sharpdegrees shift shiftless shipout shipout3 show simeq simplex simpson sin sinh size size3 skewness skip slant sleep slice slope slopefield solve solveBVP sort sourceline sphere split sqrt square srand standardizecoordsys stdev step stickframe stickmarksize stickmarkspace stop straight straightness string stripdirectory stripextension stripfile stripsuffix strokepath subdivide subitem subpath substr sum surface symmedial symmedian system tab tableau tan tangent tangential tangents tanh tell tensionSpecifier tensorshade tex texcolor texify texpath texpreamble texreset texshipout texsize textpath thick thin tick tickMax tickMax3 tickMin tickMin3 ticklabelshift ticklocate tildeframe tildemarksize tile tiling time times title titlepage topbox toplocation transform transformation transpose trembleFuzz triangle triangleAbc triangleabc triangletoquads trianglewithnormals triangulate tricoef tridiagonal trilinear trim truepoint tube uncycle unfill uniform unique unit unitrand unitsize unityroot unstraighten upcase updatefunction uperiodic upscale uptodate usepackage usersetting usetypescript usleep value variance variancebiased vbox vector vectorfield verbatim view vline vperiodic vprojection warn warning windingnumber write xasyKEY xaxis xaxis3 xaxis3At xaxisAt xequals xlimits xmap xpart xscale xscaleO xtick xtick3 xtrans yaxis yaxis3 yaxis3At yaxisAt yequals ylimits ypart yscale yscaleO ytick ytick3 ytrans zaxis3 zaxis3At zero zlimits zpart ztick ztick3 ztrans ))
(defvar asy-variable-name '(
-AliceBlue Align Allow AntiqueWhite Apricot Aqua Aquamarine Aspect Azure BeginPoint Beige Bisque Bittersweet Black BlanchedAlmond Blue BlueGreen BlueViolet Both Break BrickRed Brown BurlyWood BurntOrange CCW CW CadetBlue CarnationPink Center Centered Cerulean Chartreuse Chocolate Coeff Coral CornflowerBlue Cornsilk Crimson Crop Cyan Dandelion DarkBlue DarkCyan DarkGoldenrod DarkGray DarkGreen DarkKhaki DarkMagenta DarkOliveGreen DarkOrange DarkOrchid DarkRed DarkSalmon DarkSeaGreen DarkSlateBlue DarkSlateGray DarkTurquoise DarkViolet DeepPink DeepSkyBlue DefaultHead DimGray DodgerBlue Dotted Down Draw E ENE EPS ESE E_Euler E_PC E_RK2 E_RK3BS Emerald EndPoint Euler Fill FillDraw FireBrick FloralWhite ForestGreen Fuchsia Gainsboro GhostWhite Gold Goldenrod Gray Green GreenYellow Honeydew HookHead Horizontal HotPink I IgnoreAspect IndianRed Indigo Ivory JOIN_IN JOIN_OUT JungleGreen Khaki LM_DWARF LM_MACHEP LM_SQRT_DWARF LM_SQRT_GIANT LM_USERTOL Label Lavender LavenderBlush LawnGreen Left LeftJustified LeftSide LemonChiffon LightBlue LightCoral LightCyan LightGoldenrodYellow LightGreen LightGrey LightPink LightSalmon LightSeaGreen LightSkyBlue LightSlateGray LightSteelBlue LightYellow Lime LimeGreen Linear Linen Log Logarithmic Magenta Mahogany Mark MarkFill MarkPath Maroon Max MediumAquamarine MediumBlue MediumOrchid MediumPurple MediumSeaGreen MediumSlateBlue MediumSpringGreen MediumTurquoise MediumVioletRed Melon MidPoint MidnightBlue Min MintCream MistyRose Moccasin Move MoveQuiet Mulberry N NE NNE NNW NULL_VERTEX NW NavajoWhite Navy NavyBlue NoAlign NoCrop NoFill NoSide OldLace Olive OliveDrab OliveGreen Orange OrangeRed Orchid Ox Oy PC PaleGoldenrod PaleGreen PaleTurquoise PaleVioletRed PapayaWhip Peach PeachPuff Periwinkle Peru PineGreen Pink Plum PowderBlue ProcessBlue Purple RK2 RK3 RK3BS RK4 RK5 RK5DP RK5F RawSienna Red RedOrange RedViolet Rhodamine Right RightJustified RightSide RosyBrown RoyalBlue RoyalPurple RubineRed S SE SSE SSW SW SaddleBrown Salmon SandyBrown SeaGreen Seashell Sepia Sienna Silver SimpleHead SkyBlue SlateBlue SlateGray Snow SpringGreen SteelBlue Suppress SuppressQuiet Tan TeXHead Teal TealBlue Thistle Ticksize Tomato Turquoise UnFill Up VERSION Value Vertical Violet VioletRed W WNW WSW Wheat White WhiteSmoke WildStrawberry XHIGH XLOW XYAlign YAlign YHIGH YLOW Yellow YellowGreen YellowOrange ZHIGH ZLOW aboveequationskip addpenarc addpenline align allowstepping angularsystem animationdelay appendsuffix arcarrowangle arcarrowfactor arrow2sizelimit arrowangle arrowbarb arrowdir arrowfactor arrowhookfactor arrowlength arrowsizelimit arrowtexfactor authorpen axis axiscoverage axislabelfactor background backgroundcolor backgroundpen barfactor barmarksizefactor basealign baselinetemplate bernstein beveljoin bigvertexpen bigvertexsize black blue bm bottom bp bracedefaultratio braceinnerangle bracemidangle braceouterangle brown bullet byfoci byvertices camerafactor chartreuse circlemarkradiusfactor circlenodesnumberfactor circleprecision circlescale cm codefile codepen codeskip colorPen coloredNodes coloredSegments conditionlength conicnodesfactor count cputimeformat crossmarksizefactor currentcoordsys currentlight currentpatterns currentpen currentpicture currentposition currentprojection curvilinearsystem cuttings cyan darkblue darkbrown darkcyan darkgray darkgreen darkgrey darkmagenta darkolive darkred dashdotted dashed datepen dateskip debuggerlines debugging deepblue deepcyan deepgray deepgreen deepgrey deepmagenta deepred deepyellow default defaultControl defaultS defaultbackpen defaultcoordsys defaultexcursion defaultfilename defaultformat defaultmassformat defaultpen defaultseparator diagnostics differentlengths dot dotfactor dotframe dotted doublelinepen doublelinespacing down duplicateFuzz ellipsenodesnumberfactor eps epsgeo epsilon evenodd expansionfactor extendcap fermionpen figureborder figuremattpen file3 firstnode firststep foregroundcolor fuchsia fuzz gapfactor ghostpen gluonamplitude gluonpen gluonratio gray green grey hatchepsilon havepagenumber heavyblue heavycyan heavygray heavygreen heavygrey heavymagenta heavyred hline hwratio hyperbolanodesnumberfactor identity4 ignore inXasyMode inch inches includegraphicscommand inf infinity institutionpen intMax intMin invert invisible itempen itemskip itemstep labelmargin landscape lastnode left legendhskip legendlinelength legendmargin legendmarkersize legendmaxrelativewidth legendvskip lightblue lightcyan lightgray lightgreen lightgrey lightmagenta lightolive lightred lightyellow linemargin lm_infmsg lm_shortmsg longdashdotted longdashed magenta magneticRadius mantissaBits markangleradius markangleradiusfactor markanglespace markanglespacefactor maxrefinements mediumblue mediumcyan mediumgray mediumgreen mediumgrey mediummagenta mediumred mediumyellow middle minDistDefault minblockheight minblockwidth mincirclediameter minipagemargin minipagewidth minvertexangle miterjoin mm momarrowfactor momarrowlength momarrowmargin momarrowoffset momarrowpen monoPen morepoints nCircle nan newbulletcolor ngraph nil nmesh nobasealign nodeMarginDefault nodesystem nomarker nopoint noprimary nullpath nullpen numarray ocgindex oldbulletcolor olive orange origin overpaint page pageheight pagemargin pagenumberalign pagenumberpen pagenumberposition pagewidth paleblue palecyan palegray palegreen palegrey palemagenta palered paleyellow parabolanodesnumberfactor perpfactor phi photonamplitude photonpen photonratio pi pink plain plain_bounds plain_scaling plus preamblenodes pt purple r3 r4a r4b randMax realDigits realEpsilon realMax realMin red relativesystem reverse right roundcap roundjoin royalblue salmon saveFunctions scalarpen sequencereal settings shipped signedtrailingzero solid spinner springgreen sqrtEpsilon squarecap squarepen startposition stdin stdout stepfactor stepfraction steppagenumberpen stepping stickframe stickmarksizefactor stickmarkspacefactor swap textpen ticksize tildeframe tildemarksizefactor tinv titlealign titlepagepen titlepageposition titlepen titleskip top trailingzero treeLevelStep treeMinNodeWidth treeNodeStep trembleAngle trembleFrequency trembleRandom undefined unitcircle unitsquare up urlpen urlskip version vertexpen vertexsize viewportmargin viewportsize vline white wye xformStack yellow ylabelwidth zerotickfuzz zerowinding ))
+AliceBlue Align Allow AntiqueWhite Apricot Aqua Aquamarine Aspect Azure BeginPoint Beige Bisque Bittersweet Black BlanchedAlmond Blue BlueGreen BlueViolet Both Break BrickRed Brown BurlyWood BurntOrange CCW CW CadetBlue CarnationPink Center Centered Cerulean Chartreuse Chocolate Coeff Coral CornflowerBlue Cornsilk Crimson Crop Cyan Dandelion DarkBlue DarkCyan DarkGoldenrod DarkGray DarkGreen DarkKhaki DarkMagenta DarkOliveGreen DarkOrange DarkOrchid DarkRed DarkSalmon DarkSeaGreen DarkSlateBlue DarkSlateGray DarkTurquoise DarkViolet DeepPink DeepSkyBlue DefaultHead DimGray DodgerBlue Dotted Down Draw E ENE EPS ESE E_Euler E_PC E_RK2 E_RK3BS Emerald EndPoint Euler Fill FillDraw FireBrick FloralWhite ForestGreen Fuchsia Gainsboro GhostWhite Gold Goldenrod Gray Green GreenYellow Honeydew HookHead Horizontal HotPink I IgnoreAspect IndianRed Indigo Ivory JOIN_IN JOIN_OUT JungleGreen Khaki LM_DWARF LM_MACHEP LM_SQRT_DWARF LM_SQRT_GIANT LM_USERTOL Label Lavender LavenderBlush LawnGreen Left LeftJustified LeftSide LemonChiffon LightBlue LightCoral LightCyan LightGoldenrodYellow LightGreen LightGrey LightPink LightSalmon LightSeaGreen LightSkyBlue LightSlateGray LightSteelBlue LightYellow Lime LimeGreen Linear Linen Log Logarithmic Magenta Mahogany Mark MarkFill MarkPath Maroon Max MediumAquamarine MediumBlue MediumOrchid MediumPurple MediumSeaGreen MediumSlateBlue MediumSpringGreen MediumTurquoise MediumVioletRed Melon MidPoint MidnightBlue Min MintCream MistyRose Moccasin Move MoveQuiet Mulberry N NE NNE NNW NULL_VERTEX NW NavajoWhite Navy NavyBlue NoAlign NoCrop NoFill NoSide OldLace Olive OliveDrab OliveGreen Orange OrangeRed Orchid Ox Oy PC PaleGoldenrod PaleGreen PaleTurquoise PaleVioletRed PapayaWhip Peach PeachPuff Periwinkle Peru PineGreen Pink Plum PowderBlue ProcessBlue Purple RK2 RK3 RK3BS RK4 RK5 RK5DP RK5F RawSienna Red RedOrange RedViolet Rhodamine Right RightJustified RightSide RosyBrown RoyalBlue RoyalPurple RubineRed S SE SSE SSW SW SaddleBrown Salmon SandyBrown SeaGreen Seashell Sepia Sienna Silver SimpleHead SkyBlue SlateBlue SlateGray Snow SpringGreen SteelBlue Suppress SuppressQuiet Tan TeXHead Teal TealBlue Thistle Ticksize Tomato Turquoise UnFill Up VERSION Value Vertical Violet VioletRed W WNW WSW Wheat White WhiteSmoke WildStrawberry XHIGH XLOW XYAlign YAlign YHIGH YLOW Yellow YellowGreen YellowOrange ZHIGH ZLOW _outpipe aboveequationskip addpenarc addpenline align allowstepping angularsystem animationdelay appendsuffix arcarrowangle arcarrowfactor arrow2sizelimit arrowangle arrowbarb arrowdir arrowfactor arrowhookfactor arrowlength arrowsizelimit arrowtexfactor authorpen axis axiscoverage axislabelfactor background backgroundcolor backgroundpen barfactor barmarksizefactor basealign baselinetemplate bernstein beveljoin bigvertexpen bigvertexsize black blue bm bottom bp bracedefaultratio braceinnerangle bracemidangle braceouterangle brown bullet byfoci byvertices camerafactor chartreuse circlemarkradiusfactor circlenodesnumberfactor circleprecision circlescale cm codefile codepen codeskip colorPen coloredNodes coloredSegments conditionlength conicnodesfactor count cputimeformat crossmarksizefactor currentcoordsys currentlight currentpatterns currentpen currentpicture currentposition currentprojection curvilinearsystem cuttings cyan darkblue darkbrown darkcyan darkgray darkgreen darkgrey darkmagenta darkolive darkred dashdotted dashed datepen dateskip debuggerlines debugging deepblue deepcyan deepgray deepgreen deepgrey deepmagenta deepred deepyellow default defaultControl defaultS defaultbackpen defaultcoordsys defaultexcursion defaultfilename defaultformat defaultmassformat defaultpen defaultseparator differentlengths dot dotfactor dotframe dotted doublelinepen doublelinespacing down duplicateFuzz ellipsenodesnumberfactor eps epsgeo epsilon evenodd expansionfactor extendcap fermionpen figureborder figuremattpen file3 firstnode firststep foregroundcolor fuchsia fuzz gapfactor ghostpen gluonamplitude gluonpen gluonratio gray green grey hatchepsilon havepagenumber heavyblue heavycyan heavygray heavygreen heavygrey heavymagenta heavyred hline hwratio hyperbolanodesnumberfactor identity identity4 ignore implicitshipout inch inches includegraphicscommand inf infinity institutionpen intMax intMin invert invisible itempen itemskip itemstep labelmargin landscape lastnode left legendhskip legendlinelength legendmargin legendmarkersize legendmaxrelativewidth legendvskip lightblue lightcyan lightgray lightgreen lightgrey lightmagenta lightolive lightred lightyellow linemargin lm_infmsg lm_shortmsg longdashdotted longdashed magenta magneticRadius mantissaBits markangleradius markangleradiusfactor markanglespace markanglespacefactor maxrefinements mediumblue mediumcyan mediumgray mediumgreen mediumgrey mediummagenta mediumred mediumyellow middle minDistDefault minblockheight minblockwidth mincirclediameter minipagemargin minipagewidth minvertexangle miterjoin mm momarrowfactor momarrowlength momarrowmargin momarrowoffset momarrowpen monoPen morepoints nCircle nan newbulletcolor ngraph nil nmesh nobasealign nodeMarginDefault nodesystem nomarker nopoint noprimary nullpath nullpen numarray ocgindex oldbulletcolor olive orange origin overpaint page pageheight pagemargin pagenumberalign pagenumberpen pagenumberposition pagewidth paleblue palecyan palegray palegreen palegrey palemagenta palered paleyellow parabolanodesnumberfactor perpfactor phi photonamplitude photonpen photonratio pi pink plain plain_bounds plain_scaling plus preamblenodes pt purple r3 r4a r4b randMax realDigits realEpsilon realMax realMin red relativesystem reverse right roundcap roundjoin royalblue salmon saveFunctions scalarpen sequencereal settings signedtrailingzero simplex solid spinner springgreen sqrtEpsilon squarecap squarepen startposition stdin stdout stepfactor stepfraction steppagenumberpen stepping stickframe stickmarksizefactor stickmarkspacefactor swap textpen ticksize tildeframe tildemarksizefactor tinv titlealign titlepagepen titlepageposition titlepen titleskip top trailingzero treeLevelStep treeMinNodeWidth treeNodeStep trembleAngle trembleFrequency trembleRandom undefined unitcircle unitsquare up urlpen urlskip version vertexpen vertexsize viewportmargin viewportsize vline white wye yellow ylabelwidth zeroTransform zerotickfuzz zerowinding ))
diff --git a/Build/source/utils/asymptote/asy.list b/Build/source/utils/asymptote/asy.list
index 49e945e0aee..6497acd338e 100644
--- a/Build/source/utils/asymptote/asy.list
+++ b/Build/source/utils/asymptote/asy.list
@@ -1,17 +1,18 @@
void drawstrokepath(picture pic=<default>, path g, pen strokepen, pen p=<default>);
-void endScript();
real legendlinelength;
+coord[] maxcoords(coord[] in, bool operator <=(coord, coord));
+coord[] maxcoords(coord[] in, bool operator <=(coord, coord));
bool prc(string format=<default>);
light currentlight;
pen royalblue;
real arrowdir;
+frame pack(pair align=<default> ... object[] inset);
filltype filltype(int type=<default>, pen fillpen=<default>, pen drawpen=<default>, void fill2(frame f, path[] g, pen fillpen));
void addArrow(picture pic, arrowhead arrowhead, path g, pen p, real size, real angle, filltype filltype, real position);
int Suppress;
align NoAlign;
filltype RadialShade(pen penc, pen penr);
real[] arrowbasepoints(path base, path left, path right, real default=<default>);
-object embed3(string, frame, string, string, string, light, projection);
real bp;
pen mean(pen[] p, real opacity(real[])=<default>);
pen[] mean(pen[][] palette, real opacity(real[])=<default>);
@@ -22,19 +23,15 @@ cputime cputime();
real inches;
pair SW;
real inch;
-picture legenditem(Legend legenditem, real linelength);
marginT EndMargin(path, pen);
pen mediumgrey;
pen darkcyan;
-coord[] maxcoords(coord[] in, bool operator <=(coord, coord));
-coord[] maxcoords(coord[] in, bool operator <=(coord, coord));
real legendhskip;
string ask(string prompt);
frame[] fit2(picture[] pictures, picture all);
void addSaveFunction(void s()());
pen olive;
pen zerowinding;
-frame pack(pair align=<default> ... object[] inset);
pen deepmagenta;
path[] margin(path[] g, real xmargin, real ymargin);
string file(string s);
@@ -50,6 +47,7 @@ pen darkred;
pair E;
plain_scaling plain_scaling;
pen darkgray;
+projection projection(triple camera, triple up=<default>, triple target=<default>, triple normal=<default>, real zoom=<default>, real angle=<default>, pair viewportshift=<default>, bool showtarget=<default>, bool autoadjust=<default>, bool center=<default>, transformation projector(triple camera, triple up, triple target));
frame orientation(frame);
void progress(bool3 init=<default>);
pen salmon;
@@ -65,7 +63,6 @@ bool EndBar(picture, path, pen, marginT(path, pen))(real size=<default>);
pen mediumgreen;
pen heavygreen;
pen dashdotted;
-bool diagnostics;
int debuggerlines;
frame bbox(picture pic=<default>, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>);
pen deepblue;
@@ -83,19 +80,17 @@ void filloutside(picture pic=<default>, path[] g, pen p=<default>, bool copy=<de
void filloutside(frame f, path[] g, pen p=<default>, bool copy=<default>);
filltype RadialShadeDraw(real xmargin=<default>, real ymargin=<default>, pen penc, pen penr, pen drawpen=<default>);
marginT BeginDotMargin(path, pen);
+frame enclose(string prefix=<default>, object F, string format=<default>);
marker[] Mark;
marker Mark(int n);
-projection projection(triple camera, triple up=<default>, triple target=<default>, triple normal=<default>, real zoom=<default>, real angle=<default>, pair viewportshift=<default>, bool showtarget=<default>, bool autoadjust=<default>, bool center=<default>, transformation projector(triple camera, triple up, triple target));
pen darkolive;
pen Dotted;
pen Dotted(pen p=<default>);
string math(string s);
transform fixedscaling(picture pic=<default>, pair min, pair max, pen p=<default>, bool warn=<default>);
pen Symbol(string series=<default>, string shape=<default>);
-bool needshipout();
int count;
path circle(pair c, real r);
-void updatefunction();
pen beveljoin;
pen orange;
pen green;
@@ -104,6 +99,8 @@ path unitcircle;
arrowhead DefaultHead;
pen white;
position EndPoint;
+transform Rotate(transform)(pair z);
+transform Rotate(transform t);
Legend Legend(string label, pen plabel=<default>, pen p=<default>, frame mark=<default>, bool above=<default>);
void exitfunction();
string cputimeformat;
@@ -134,11 +131,8 @@ marginT EndPenMargin(path, pen);
pair NNE;
pen roundjoin;
pen lightgray;
-void startScript();
pair relative(picture pic=<default>, pair z);
position MidPoint;
-bool ArcArrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>);
-bool ArcArrow(picture, path, pen, marginT(path, pen));
string Embed(string name, string text=<default>, string options=<default>, real width=<default>, real height=<default>);
pen deepgrey;
pen lightyellow;
@@ -161,6 +155,7 @@ transform Scale(transform t);
string getstring(string name=<default>, string default=<default>, string prompt=<default>, bool store=<default>);
marginT DotMargins(path, pen);
path[] MarkPath;
+picture legenditem(Legend legenditem, real linelength);
pen deepgray;
bool BeginArcArrow(picture, path, pen, marginT(path, pen));
bool BeginArcArrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>);
@@ -170,10 +165,16 @@ pen lightcyan;
pen paleblue;
real legendmargin;
bool None(picture, path, pen, marginT(path, pen));
+path box(pair a, pair b);
+path box(frame dest, frame src=<default>, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
+path box(frame f, Label L, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
+pen Bookman(string series=<default>, string shape=<default>);
+frame[] fit(string prefix=<default>, picture[] pictures, string format=<default>, bool view=<default>, string options=<default>, string script=<default>, projection P=<default>);
frame align(frame f, pair align);
-path[] align(path[] g, transform t=<default>, pair position, pair align, pen p=<default>);
object align(object F, pair align);
+path[] align(path[] g, transform t=<default>, pair position, pair align, pen p=<default>);
transform scaleless(transform t);
+pen RGB(int r, int g, int b);
pen thin();
real arcarrowangle;
void restoredefaults();
@@ -188,7 +189,10 @@ guide operator ---(... guide[]);
int JOIN_IN;
real barfactor;
pen lightgreen;
+transform zeroTransform;
void endl(file file);
+bool ArcArrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>);
+bool ArcArrow(picture, path, pen, marginT(path, pen));
void usersetting();
bool prc0(string format=<default>);
bool Bars(picture, path, pen, marginT(path, pen));
@@ -222,14 +226,6 @@ real barsize(pen p=<default>);
pen AvantGarde(string series=<default>, string shape=<default>);
real circleprecision;
pen Black;
-path box(pair a, pair b);
-path box(frame dest, frame src=<default>, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
-path box(frame f, Label L, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
-pen Bookman(string series=<default>, string shape=<default>);
-frame[] fit(string prefix=<default>, picture[] pictures, string format=<default>, bool view=<default>, string options=<default>, string script=<default>, projection P=<default>);
-void report(string text);
-void report(int i);
-void report(transform t);
pen Pen(int n);
pair ENE;
pen Courier(string series=<default>, string shape=<default>);
@@ -243,8 +239,6 @@ string outformat(string format=<default>);
marker markthin(path g, pen p=<default>, real thin(real fraction)=<default>, filltype filltype=<default>);
filltype Fill;
filltype Fill(real xmargin=<default>, real ymargin=<default>, pen p=<default>);
-bool EndArrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>);
-bool EndArrow(picture, path, pen, marginT(path, pen));
pen Palatino(string series=<default>, string shape=<default>);
pair[] intersectionpoints(path p, path q, real fuzz=<default>);
pair[] intersectionpoints(explicit path[] p, explicit path[] q, real fuzz=<default>);
@@ -256,13 +250,11 @@ real calculateScaling(string dir, coord[] m, coord[] M, real size, bool warn=<de
real expansionfactor;
position BeginPoint;
real arrowhookfactor;
-indexedTransform indexedTransform(int index, transform t, bool active=<default>);
bool finite(real x);
bool finite(pair z);
bool finite(triple v);
filltype UnFill(real xmargin=<default>, real ymargin=<default>);
filltype UnFill;
-frame enclose(string prefix=<default>, object F, string format=<default>);
pair I;
pair SSW;
transform Slant(transform t);
@@ -270,6 +262,8 @@ pair intersectionpoint(path p, path q, real fuzz=<default>);
real getreal(string name=<default>, real default=<default>, string prompt=<default>, bool store=<default>);
pen darkbrown;
int sourceline(string file, string text);
+void updatefunction();
+bool implicitshipout;
void buildRestoreDefaults()();
path[] operator ^^(path p, path q);
path[] operator ^^(explicit path[] p, path q);
@@ -278,6 +272,9 @@ path[] operator ^^(explicit path[] p, explicit path[] q);
real arrow2sizelimit;
filltype FillDraw;
filltype FillDraw(real xmargin=<default>, real ymargin=<default>, pen fillpen=<default>, pen drawpen=<default>);
+bool debugging;
+void shipout(string prefix=<default>, frame f, string format=<default>, bool wait=<default>, bool view=<default>, string options=<default>, string script=<default>, light light=<default>, projection P=<default>, transform t=<default>);
+void shipout(string prefix=<default>, picture pic=<default>, frame orientation(frame)=<default>, string format=<default>, bool wait=<default>, bool view=<default>, string options=<default>, string script=<default>, light light=<default>, projection P=<default>);
void pause(string w=<default>);
int ocgindex;
pen springgreen;
@@ -298,27 +295,6 @@ int JOIN_OUT;
projection currentprojection;
real arrowsizelimit;
pair endpoint(path p);
-arrowhead HookHead;
-arrowhead HookHead(real dir=<default>, real barb=<default>);
-real[] concat(... real[][]);
-picture[] concat(... picture[][]);
-pair[] concat(... pair[][]);
-pen[] concat(... pen[][]);
-coord[] concat(... coord[][]);
-object[] concat(... object[][]);
-Legend[] concat(... Legend[][]);
-path[] concat(... path[][]);
-coord[] concat(... coord[][]);
-Label[] concat(... Label[][]);
-int[] concat(... int[][]);
-void()()[] concat(... void()()[][]);
-bool3[] concat(... bool3[][]);
-string[] concat(... string[][]);
-marker[] concat(... marker[][]);
-triple[] concat(... triple[][]);
-frame[] concat(... frame[][]);
-guide[] concat(... guide[][]);
-bool[] concat(... bool[][]);
slice firstcut(path p, path knife);
frame UpsideDown(frame f);
pair viewportmargin;
@@ -326,6 +302,7 @@ pen nullpen;
void save()();
real dotfactor;
pen palecyan;
+node node(void d(frame f, transform t, transform T, pair lb, pair rt), string key=<default>);
marginT BeginMargin(path, pen);
path buildcycle(... path[] p);
void unitsize(picture pic=<default>, real x, real y=<default>, real z=<default>);
@@ -341,6 +318,8 @@ int undefined;
pen roundcap;
void buildRestoreThunk()();
void overloadedMessage(file file);
+bool EndArrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>);
+bool EndArrow(picture, path, pen, marginT(path, pen));
frame currentpatterns;
real arrowfactor;
pen heavyred;
@@ -360,10 +339,8 @@ bool[] array(int n, bool value, int depth=<default>);
string[] array(int n, string value, int depth=<default>);
pair[][] array(int n, pair[] value, int depth=<default>);
bool3[] array(int n, bool3 value, int depth=<default>);
-coord[] array(int n, coord value, int depth=<default>);
-object[] array(int n, object value, int depth=<default>);
+Label[] array(int n, Label value, int depth=<default>);
picture[] array(int n, picture value, int depth=<default>);
-Legend[] array(int n, Legend value, int depth=<default>);
real[][] array(int n, real[] value, int depth=<default>);
real[] array(int n, real value, int depth=<default>);
triple[] array(int n, triple value, int depth=<default>);
@@ -371,8 +348,10 @@ path[] array(int n, path value, int depth=<default>);
frame[] array(int n, frame value, int depth=<default>);
pen[][] array(int n, pen[] value, int depth=<default>);
coord[] array(int n, coord value, int depth=<default>);
+coord[] array(int n, coord value, int depth=<default>);
+object[] array(int n, object value, int depth=<default>);
marker[] array(int n, marker value, int depth=<default>);
-Label[] array(int n, Label value, int depth=<default>);
+Legend[] array(int n, Legend value, int depth=<default>);
int[] array(int n, int value, int depth=<default>);
string[][] array(int n, string[] value, int depth=<default>);
pair[] array(int n, pair value, int depth=<default>);
@@ -383,6 +362,7 @@ real[] uniform(real a, real b, int n);
pair viewportsize;
picture arrow2(arrowhead arrowhead=<default>, path g, pen p=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, marginT margin(path, pen)=<default>);
void drawarrow(frame f, arrowhead arrowhead=<default>, path g, pen p=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>, position position=<default>, bool forwards=<default>, marginT margin(path, pen)=<default>, bool center=<default>);
+object embed3(string, frame, string, string, string, light, projection);
picture currentpicture;
pen palegreen;
Label Label(Label L, align align=<default>, pen p=<default>, transform embed(transform)=<default>, filltype filltype=<default>);
@@ -395,6 +375,27 @@ Label Label(string s=<default>, string size=<default>, align align=<default>, pe
Label Label(string s, string size=<default>, pair position, align align=<default>, pen p=<default>, transform embed(transform)=<default>, filltype filltype=<default>);
hsv hsv(real h, real s, real v);
hsv hsv(pen p);
+arrowhead HookHead;
+arrowhead HookHead(real dir=<default>, real barb=<default>);
+marker[] concat(... marker[][]);
+real[] concat(... real[][]);
+picture[] concat(... picture[][]);
+pair[] concat(... pair[][]);
+object[] concat(... object[][]);
+pen[] concat(... pen[][]);
+Label[] concat(... Label[][]);
+path[] concat(... path[][]);
+coord[] concat(... coord[][]);
+coord[] concat(... coord[][]);
+Legend[] concat(... Legend[][]);
+int[] concat(... int[][]);
+void()()[] concat(... void()()[][]);
+bool3[] concat(... bool3[][]);
+string[] concat(... string[][]);
+triple[] concat(... triple[][]);
+frame[] concat(... frame[][]);
+guide[] concat(... guide[][]);
+bool[] concat(... bool[][]);
pair N;
real dotsize(pen p=<default>);
real pt;
@@ -405,15 +406,11 @@ pen palegray;
pen miterjoin;
arrowhead SimpleHead;
real arrowangle;
-transform Rotate(transform)(pair z);
-transform Rotate(transform t);
-bool inXasyMode;
real arcarrowfactor;
real mm;
plain plain;
int getint(string name=<default>, int default=<default>, string prompt=<default>, bool store=<default>);
int bitreverse(int a, int bits);
-int CTZ(int a);
int popcount(int a);
int NOT(int a);
int XOR(int a, int b);
@@ -430,9 +427,9 @@ real erf(real x);
real Yn(int n, real x);
real Jn(int n, real x);
light light(pen diffuse=<default>, pen ambient=<default>, pen specular=<default>, pen background=<default>, real specularfactor=<default>, bool viewport=<default> ... triple[] position);
-light light(explicit light light);
light light(pen[] diffuse, pen[] ambient=<default>, pen[] specular=<default>, pen background=<default>, real specularfactor=<default>, bool viewport=<default>, triple[] position);
light light(pen diffuse=<default>, pen ambient=<default>, pen specular=<default>, pen background=<default>, bool viewport=<default>, real x, real y, real z);
+light light(explicit light light);
real remainder(real x, real y);
int choose(int n, int k);
real hypot(real x, real y);
@@ -638,7 +635,6 @@ real norm(real[] a);
real norm(real[][] a);
real norm(triple[][] a);
int[][] triangulate(pair[] z);
-bool shipped;
pair[] fft(pair[] a, int sign=<default>);
real simpson(real f(real), real a, real b, real acc=<default>, real dxmax=<default>);
pen[] colorPen;
@@ -681,8 +677,10 @@ bool operator !(bool b);
int[] sequence(int n);
pen[][] sequence(pen[] f(int), int n);
coord[] sequence(coord f(int), int n);
+coord[] sequence(coord f(int), int n);
+object[] sequence(object f(int), int n);
marker[] sequence(marker f(int), int n);
-Label[] sequence(Label f(int), int n);
+Legend[] sequence(Legend f(int), int n);
int[] sequence(int f(int), int n);
string[][] sequence(string[] f(int), int n);
pair[] sequence(pair f(int), int n);
@@ -693,10 +691,8 @@ bool[] sequence(bool f(int), int n);
string[] sequence(string f(int), int n);
pair[][] sequence(pair[] f(int), int n);
bool3[] sequence(bool3 f(int), int n);
-coord[] sequence(coord f(int), int n);
-object[] sequence(object f(int), int n);
+Label[] sequence(Label f(int), int n);
picture[] sequence(picture f(int), int n);
-Legend[] sequence(Legend f(int), int n);
real[][] sequence(real[] f(int), int n);
real[] sequence(real f(int), int n);
int[] sequence(int n, int m);
@@ -755,23 +751,21 @@ void draw(picture pic=<default>, path[] g, pen fillrule=<default>, pen[] p);
object draw(picture pic=<default>, Label L, path e(frame dest, frame src=<default>, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>), real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
void draw(frame f, explicit path[] g, pen p=<default>);
void draw(frame f, path g, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen)));
-void draw(picture pic=<default>, Label L=<default>, path g, align align=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool bar(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, Label legend=<default>, marker marker=<default>);
-void draw(pair origin, picture pic=<default>, Label L=<default>, path g, align align=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool bar(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, Label legend=<default>, marker marker=<default>);
void draw(picture pic=<default>, guide[] g, pen p=<default>, Label legend=<default>, marker marker=<default>);
void draw(pair origin, picture pic=<default>, guide[] g, pen p=<default>, Label legend=<default>, marker marker=<default>);
-object draw(picture pic=<default>, Label L, path e(frame dest, frame src=<default>, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>), pair position, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
void draw(picture pic=<default>, explicit path[] g, pen p=<default>, Label legend=<default>, marker marker=<default>);
void draw(pair origin, picture pic=<default>, explicit path[] g, pen p=<default>, Label legend=<default>, marker marker=<default>);
+object draw(picture pic=<default>, Label L, path e(frame dest, frame src=<default>, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>), pair position, real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
void draw(frame f, guide[] g, pen p=<default>);
void draw(frame f, path g, pen p=<default>);
-void deconstruct(frame f, frame preamble=<default>, real magnification=<default>, transform xform());
-void deconstruct(picture pic=<default>, real magnification=<default>);
+void draw(picture pic=<default>, Label L=<default>, path g, align align=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool bar(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, Label legend=<default>, marker marker=<default>);
+void draw(pair origin, picture pic=<default>, Label L=<default>, path g, align align=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool bar(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, Label legend=<default>, marker marker=<default>);
+void deconstruct(frame f, frame preamble=<default>, transform t=<default>);
+void deconstruct(picture pic=<default>);
void shipout3(string prefix, frame f, string format=<default>, real width, real height, real angle, real zoom, triple m, triple m, pair shift, real[][] t, real[] background, triple[] lights, real[][] diffuse, real[][] ambient, real[][] specular, bool viewportlighting, bool view=<default>);
void shipout3(string prefix, frame f);
-bool debugging;
-void shipout(string prefix=<default>, frame f, frame preamble=<default>, string format=<default>, bool wait=<default>, bool view=<default>, transform xform());
-void shipout(string prefix=<default>, frame f, string format=<default>, bool wait=<default>, bool view=<default>, string options=<default>, string script=<default>, light light=<default>, projection P=<default>);
-void shipout(string prefix=<default>, picture pic=<default>, frame orientation(frame)=<default>, string format=<default>, bool wait=<default>, bool view=<default>, string options=<default>, string script=<default>, light light=<default>, projection P=<default>);
+int CTZ(int a);
+void _shipout(string prefix=<default>, frame f, frame preamble=<default>, string format=<default>, bool wait=<default>, bool view=<default>, transform t=<default>);
void asy(string format, bool overwrite=<default> ... string[] s);
bool latex();
string nativeformat();
@@ -800,6 +794,7 @@ void add(frame dest, frame src);
void add(picture pic=<default>, void d(frame f, transform t), bool exact=<default>);
void add(frame dest, frame src, filltype filltype, bool above=<default>);
void add(frame dest, frame src, bool group, filltype filltype=<default>, bool above=<default>);
+void add(picture pic=<default>, void d(frame f, real[][] t, picture pic, projection P), bool exact=<default>);
void add(picture pic=<default>, void d(picture, real[][]), bool exact=<default>);
void add(frame dest, frame src, pair position, bool group=<default>, filltype filltype=<default>, bool above=<default>);
void add(picture dest=<default>, frame src, pair position=<default>, bool group=<default>, filltype filltype=<default>, bool above=<default>);
@@ -807,10 +802,9 @@ void add(picture src, pair position, bool group=<default>, filltype filltype=<de
void add(picture dest=<default>, frame src, pair position, pair align, bool group=<default>, filltype filltype=<default>, bool above=<default>);
void add(frame dest, frame src, pair position, pair align, bool group=<default>, filltype filltype=<default>, bool above=<default>);
void add(picture src, bool group=<default>, filltype filltype=<default>, bool above=<default>);
-void add(picture pic=<default>, void d(frame f, real[][] t, picture pic, projection P), bool exact=<default>);
+void add(picture pic=<default>, Label L);
void add(picture pic=<default>, void d(picture, transform), bool exact=<default>);
void add(picture dest, picture src, bool group=<default>, filltype filltype=<default>, bool above=<default>);
-void add(picture pic=<default>, Label L);
void add(frame f, transform t=<default>, Label L);
void add(picture dest, picture src, pair position, bool group=<default>, filltype filltype=<default>, bool above=<default>);
void add(picture dest=<default>, object F, pair position=<default>, bool group=<default>, filltype filltype=<default>, bool above=<default>);
@@ -822,7 +816,6 @@ void begingroup(frame f);
void begingroup(picture pic=<default>);
bool MidArcArrow(picture, path, pen, marginT(path, pen))(arrowhead arrowhead=<default>, real size=<default>, real angle=<default>, filltype filltype=<default>);
bool MidArcArrow(picture, path, pen, marginT(path, pen));
-void exitXasyMode();
void grestore(frame f);
void drawPRCcylinder(frame f, real[][] t, pen[] p, real opacity, real shininess);
void beginclip(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, bool copy=<default>);
@@ -842,6 +835,7 @@ void tensorshade(frame f, path[] g, bool stroke=<default>, pen fillrule=<default
void tensorshade(picture pic=<default>, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[] p, path b=<default>, pair[] z);
void tensorshade(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[] p, path b=<default>);
void tensorshade(picture pic=<default>, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[] p, path b=<default>);
+file _outpipe;
void gouraudshade(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[] p, pair[] z, int[] edges, bool copy=<default>);
void gouraudshade(frame f, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[] p, int[] edges, bool copy=<default>);
void gouraudshade(picture pic=<default>, path[] g, bool stroke=<default>, pen fillrule=<default>, pen[] p, pair[] z, int[] edges, bool copy=<default>);
@@ -924,6 +918,7 @@ int size(path[] p);
int size(path3 p);
void size(picture dest, picture src);
pair size(picture pic, bool user=<default>);
+void size(picture pic=<default>, transform t);
void size(picture pic=<default>, real x, real y=<default>, bool keepAspect=<default>);
void size(picture pic=<default>, real xsize, real ysize, pair min, pair max);
string texify(string s);
@@ -939,6 +934,9 @@ void list(string s, bool imports=<default>);
string cd(string s=<default>);
int Move;
string location();
+string toplocation();
+string xasyKEY();
+void xasyKEY(string s);
bool pdf();
void _eval(string s, bool embedded, bool interactivewrite=<default>);
void _eval(code s, bool embedded);
@@ -1045,63 +1043,62 @@ pen currentpen;
string VERSION;
bool alias(pair[][] a, pair[][] b);
bool alias(guide[] a, guide[] b);
-bool alias(hsv a, hsv b);
bool alias(coord[] a, coord[] b);
-bool alias(scaleT a, scaleT b);
-bool alias(side a, side b);
-bool alias(marker a, marker b);
-bool alias(Label[] a, Label[] b);
+bool alias(coord[] a, coord[] b);
+bool alias(light a, light b);
+bool alias(autoscaleT a, autoscaleT b);
+bool alias(align a, align b);
+bool alias(Legend[] a, Legend[] b);
bool alias(pair[] a, pair[] b);
bool alias(scaling a, scaling b);
-bool alias(coord a, coord b);
-bool alias(Legend a, Legend b);
-bool alias(object a, object b);
-bool alias(cputime a, cputime b);
+bool alias(scaling a, scaling b);
+bool alias(bounds a, bounds b);
+bool alias(node a, node b);
+bool alias(Label a, Label b);
+bool alias(processtime a, processtime b);
bool alias(int[] a, int[] b);
bool alias(string[][] a, string[][] b);
bool alias(filltype a, filltype b);
-bool alias(freezableBounds a, freezableBounds b);
-bool alias(projection a, projection b);
-bool alias(framedTransformStack a, framedTransformStack b);
+bool alias(coords3 a, coords3 b);
+bool alias(object[] a, object[] b);
+bool alias(marker a, marker b);
+bool alias(cputime a, cputime b);
bool alias(real[][] a, real[][] b);
bool alias(bool3 a, bool3 b);
bool alias(bool3[] a, bool3[] b);
-bool alias(autoscaleT a, autoscaleT b);
-bool alias(position a, position b);
+bool alias(ScaleT a, ScaleT b);
+bool alias(side a, side b);
bool alias(arrowhead a, arrowhead b);
bool alias(string[] a, string[] b);
bool alias(frame[] a, frame[] b);
+bool alias(hsv a, hsv b);
bool alias(coords2 a, coords2 b);
-bool alias(scaling a, scaling b);
-bool alias(bounds a, bounds b);
-bool alias(light a, light b);
+bool alias(coords2 a, coords2 b);
+bool alias(transformation a, transformation b);
bool alias(pairOrTriple a, pairOrTriple b);
+bool alias(object a, object b);
+bool alias(marker[] a, marker[] b);
bool alias(bool[] a, bool[] b);
bool alias(void()()[] a, void()()[] b);
bool alias(pen[][] a, pen[][] b);
bool alias(marginT a, marginT b);
-bool alias(coord[] a, coord[] b);
-bool alias(coords3 a, coords3 b);
-bool alias(align a, align b);
-bool alias(object[] a, object[] b);
-bool alias(Legend[] a, Legend[] b);
+bool alias(simplex a, simplex b);
+bool alias(scaleT a, scaleT b);
+bool alias(Label[] a, Label[] b);
bool alias(path[] a, path[] b);
bool alias(triple[] a, triple[] b);
bool alias(coord a, coord b);
-bool alias(ScaleT a, ScaleT b);
-bool alias(Label a, Label b);
-bool alias(marker[] a, marker[] b);
-bool alias(processtime a, processtime b);
+bool alias(coord a, coord b);
+bool alias(Legend a, Legend b);
+bool alias(position a, position b);
bool alias(real[] a, real[] b);
bool alias(pen[] a, pen[] b);
bool alias(slice a, slice b);
-bool alias(coords2 a, coords2 b);
-bool alias(transformation a, transformation b);
+bool alias(freezableBounds a, freezableBounds b);
+bool alias(projection a, projection b);
bool alias(picture a, picture b);
bool alias(picture[] a, picture[] b);
-bool alias(indexedTransform a, indexedTransform b);
real pi;
-void initXasyMode();
int randMax;
pen heavycyan;
marginT PenMargin(path, pen)(real begin, real end);
@@ -1111,8 +1108,12 @@ real realEpsilon;
pair NE;
real realMin;
real realMax;
+simplex simplex(real[] c, real[][] A, real[] b, bool phase1=<default>);
+simplex simplex(real[] c, real[][] A, int[] s, real[] b);
+simplex simplex;
real nan;
real infinity;
+void xmap(string key, transform t=<default>);
real inf;
int intMin;
int intMax;
@@ -1122,30 +1123,31 @@ int[] map(int f(real), real[] a);
bool3[] map(bool3 f(bool3), bool3[] a);
frame[] map(frame f(frame), frame[] a);
coord[] map(coord f(coord), coord[] a);
-Label[] map(Label f(Label), Label[] a);
+coord[] map(coord f(coord), coord[] a);
+Legend[] map(Legend f(Legend), Legend[] a);
pen[][] map(pen[] f(pen[]), pen[][] a);
triple[] map(triple f(triple), triple[] a);
pen[] map(pen f(pen), pen[] a);
-coord[] map(coord f(coord), coord[] a);
-object[] map(object f(object), object[] a);
-Legend[] map(Legend f(Legend), Legend[] a);
+Label[] map(Label f(Label), Label[] a);
pair[] map(pair f(pair), pair[] a);
+object[] map(object f(object), object[] a);
string[] map(string f(string), string[] a);
picture[] map(picture f(picture), picture[] a);
void()()[] map(void f()()(void()()), void()()[] a);
pair[][] map(pair[] f(pair[]), pair[][] a);
real[] map(real f(real), real[] a);
+marker[] map(marker f(marker), marker[] a);
int[] map(int f(int), int[] a);
string[][] map(string[] f(string[]), string[][] a);
bool[] map(bool f(bool), bool[] a);
path[] map(path f(path), path[] a);
real[][] map(real[] f(real[]), real[][] a);
-marker[] map(marker f(marker), marker[] a);
guide[] map(guide f(guide), guide[] a);
real identity(real x);
real[] identity(real[] a);
transform identity();
real[][] identity(int n);
+transform identity;
real pow10(real x);
real[] pow10(real[] a);
pen linejoin(int n);
@@ -1162,6 +1164,7 @@ real expm1(real x);
real[] expm1(real[] a);
void label(frame f, string s, string size, transform t, pair position, pair align, pen p);
void label(picture pic=<default>, Label L, align align=<default>, pen p=<default>, filltype filltype=<default>);
+void label(pair origin, picture pic=<default>, Label L, align align=<default>, pen p=<default>, filltype filltype=<default>);
void label(frame f, Label L, pair position, align align=<default>, pen p=<default>, filltype filltype=<default>);
void label(picture pic=<default>, Label L, pair position, align align=<default>, pen p=<default>, filltype filltype=<default>);
void label(frame f, Label L, align align=<default>, pen p=<default>, filltype filltype=<default>);
@@ -1257,50 +1260,50 @@ int search(void()()[] a, void key()(), bool less(void()(), void()()));
int search(picture[] a, picture key, bool less(picture, picture));
int search(real[] a, real key, bool less(real, real));
int search(guide[] a, guide key, bool less(guide, guide));
-int search(pair[] a, pair key, bool less(pair, pair));
-int search(coord[] a, coord key, bool less(coord, coord));
int search(object[] a, object key, bool less(object, object));
-int search(Legend[] a, Legend key, bool less(Legend, Legend));
+int search(pair[] a, pair key, bool less(pair, pair));
+int search(Label[] a, Label key, bool less(Label, Label));
int search(frame[] a, frame key, bool less(frame, frame));
int search(coord[] a, coord key, bool less(coord, coord));
-int search(Label[] a, Label key, bool less(Label, Label));
+int search(coord[] a, coord key, bool less(coord, coord));
+int search(Legend[] a, Legend key, bool less(Legend, Legend));
int search(int[] a, int key, bool less(int, int));
int search(bool3[] a, bool3 key, bool less(bool3, bool3));
-int search(marker[] a, marker key, bool less(marker, marker));
int search(string[] a, string key, bool less(string, string));
int search(path[] a, path key, bool less(path, path));
int search(pen[] a, pen key, bool less(pen, pen));
int search(bool[] a, bool key, bool less(bool, bool));
int search(triple[] a, triple key, bool less(triple, triple));
+int search(marker[] a, marker key, bool less(marker, marker));
int[] sort(int[] a);
int[][] sort(int[][] a);
real[] sort(real[] a);
real[][] sort(real[][] a);
string[] sort(string[] a);
string[][] sort(string[][] a);
-path[] sort(path[] a, bool less(path, path));
-pair[] sort(pair[] a, bool less(pair, pair));
-void()()[] sort(void()()[] a, bool less(void()(), void()()));
-real[] sort(real[] a, bool less(real, real));
-bool[] sort(bool[] a, bool less(bool, bool));
-picture[] sort(picture[] a, bool less(picture, picture));
-pen[] sort(pen[] a, bool less(pen, pen));
-pen[][] sort(pen[][] a, bool less(pen[], pen[]));
-coord[] sort(coord[] a, bool less(coord, coord));
-object[] sort(object[] a, bool less(object, object));
-Legend[] sort(Legend[] a, bool less(Legend, Legend));
-guide[] sort(guide[] a, bool less(guide, guide));
-real[][] sort(real[][] a, bool less(real[], real[]));
-triple[] sort(triple[] a, bool less(triple, triple));
-coord[] sort(coord[] a, bool less(coord, coord));
-Label[] sort(Label[] a, bool less(Label, Label));
-string[] sort(string[] a, bool less(string, string));
-int[] sort(int[] a, bool less(int, int));
-string[][] sort(string[][] a, bool less(string[], string[]));
-bool3[] sort(bool3[] a, bool less(bool3, bool3));
-pair[][] sort(pair[][] a, bool less(pair[], pair[]));
-marker[] sort(marker[] a, bool less(marker, marker));
-frame[] sort(frame[] a, bool less(frame, frame));
+coord[] sort(coord[] a, bool less(coord, coord), bool stable=<default>);
+coord[] sort(coord[] a, bool less(coord, coord), bool stable=<default>);
+object[] sort(object[] a, bool less(object, object), bool stable=<default>);
+marker[] sort(marker[] a, bool less(marker, marker), bool stable=<default>);
+Legend[] sort(Legend[] a, bool less(Legend, Legend), bool stable=<default>);
+path[] sort(path[] a, bool less(path, path), bool stable=<default>);
+pen[][] sort(pen[][] a, bool less(pen[], pen[]), bool stable=<default>);
+pair[][] sort(pair[][] a, bool less(pair[], pair[]), bool stable=<default>);
+pen[] sort(pen[] a, bool less(pen, pen), bool stable=<default>);
+bool[] sort(bool[] a, bool less(bool, bool), bool stable=<default>);
+void()()[] sort(void()()[] a, bool less(void()(), void()()), bool stable=<default>);
+frame[] sort(frame[] a, bool less(frame, frame), bool stable=<default>);
+bool3[] sort(bool3[] a, bool less(bool3, bool3), bool stable=<default>);
+Label[] sort(Label[] a, bool less(Label, Label), bool stable=<default>);
+picture[] sort(picture[] a, bool less(picture, picture), bool stable=<default>);
+int[] sort(int[] a, bool less(int, int), bool stable=<default>);
+string[][] sort(string[][] a, bool less(string[], string[]), bool stable=<default>);
+real[] sort(real[] a, bool less(real, real), bool stable=<default>);
+string[] sort(string[] a, bool less(string, string), bool stable=<default>);
+pair[] sort(pair[] a, bool less(pair, pair), bool stable=<default>);
+real[][] sort(real[][] a, bool less(real[], real[]), bool stable=<default>);
+triple[] sort(triple[] a, bool less(triple, triple), bool stable=<default>);
+guide[] sort(guide[] a, bool less(guide, guide), bool stable=<default>);
pair postcontrol(path p, int t);
pair postcontrol(path p, real t);
triple postcontrol(path3 p, int t);
@@ -1332,10 +1335,10 @@ pair max(explicit path p);
pair max(path[] p);
triple max(path3 p);
real max(real M, scaling s, coord[] c);
+real max(real M, scaling s, coord[] c);
int max(... int[] a);
pair max(picture pic, bool user=<default>);
real max(... real[] a);
-real max(real M, scaling s, coord[] c);
void restore();
pen basealign(int n);
int basealign(pen p=<default>);
@@ -1424,7 +1427,6 @@ bool operator <(string a, string b);
bool[] operator <(string a, string[] b);
bool[] operator <(string[] a, string b);
bool[] operator <(string[] a, string[] b);
-framedTransformStack xformStack;
pair[] conj(pair[] a);
pair[][] conj(pair[][] a);
pair conj(pair z);
@@ -1437,8 +1439,10 @@ bool[] copy(bool[] a, int depth=<default>);
real[][] copy(real[][] a, int depth=<default>);
pen[] copy(pen[] a, int depth=<default>);
coord[] copy(coord[] a, int depth=<default>);
+coord[] copy(coord[] a, int depth=<default>);
+object[] copy(object[] a, int depth=<default>);
marker[] copy(marker[] a, int depth=<default>);
-Label[] copy(Label[] a, int depth=<default>);
+Legend[] copy(Legend[] a, int depth=<default>);
pen[][] copy(pen[][] a, int depth=<default>);
path[] copy(path[] a, int depth=<default>);
string[] copy(string[] a, int depth=<default>);
@@ -1448,10 +1452,8 @@ string[][] copy(string[][] a, int depth=<default>);
frame[] copy(frame[] a, int depth=<default>);
pair[] copy(pair[] a, int depth=<default>);
bool3[] copy(bool3[] a, int depth=<default>);
-coord[] copy(coord[] a, int depth=<default>);
-object[] copy(object[] a, int depth=<default>);
+Label[] copy(Label[] a, int depth=<default>);
picture[] copy(picture[] a, int depth=<default>);
-Legend[] copy(Legend[] a, int depth=<default>);
pair[][] copy(pair[][] a, int depth=<default>);
real[] abs(pair[] a);
real[] abs(triple[] a);
@@ -1540,11 +1542,11 @@ path3 operator *(real[][] t, path3 g);
side operator *(real x, side s);
Label operator *(real[][] t, Label L);
picture operator *(transform t, picture orig);
-bounds operator *(transform t, bounds b);
-path[] operator *(transform t, explicit path[] p);
object operator *(transform t, explicit object F);
-pair[] operator *(transform t, pair[] z);
+path[] operator *(transform t, explicit path[] p);
+bounds operator *(transform t, bounds b);
Label operator *(transform t, Label L);
+pair[] operator *(transform t, pair[] z);
picture operator *(real[][] t, picture orig);
real latitude(triple v, bool warn=<default>);
int sum(int[] a);
@@ -1624,13 +1626,13 @@ void write(file file, void suffix(file)=<default>);
void write(file file=<default>, string s=<default>, pen[] p);
void write(void suffix(file)=<default>);
void write(file file, string s=<default>, explicit path[] x, void suffix(file)=<default>);
-void write(file file=<default>, Label L, void suffix(file)=<default>);
+void write(file file=<default>, align align, void suffix(file)=<default>);
void write(pairOrTriple a);
void write(file file, string s=<default>, cputime c, string format=<default>, void suffix(file)=<default>);
void write(string s=<default>, bool3 b, void suffix(file)=<default>);
void write(file file, string s=<default>, bool3 b, void suffix(file)=<default>);
void write(string s=<default>, explicit guide[] x, void suffix(file)=<default>);
-void write(file file=<default>, align align, void suffix(file)=<default>);
+void write(file file=<default>, Label L, void suffix(file)=<default>);
bool operator !=(bool a, bool b);
bool[] operator !=(bool a, bool[] b);
bool[] operator !=(bool[] a, bool b);
@@ -1668,41 +1670,41 @@ bool operator !=(file a, file b);
bool operator !=(path a, path b);
bool operator !=(path3 a, path3 b);
bool operator !=(bool3 a, bool3 b);
-bool operator !=(autoscaleT a, autoscaleT b);
-bool operator !=(position a, position b);
+bool operator !=(ScaleT a, ScaleT b);
+bool operator !=(side a, side b);
bool operator !=(arrowhead a, arrowhead b);
+bool operator !=(hsv a, hsv b);
bool operator !=(coords2 a, coords2 b);
-bool operator !=(scaling a, scaling b);
-bool operator !=(bounds a, bounds b);
-bool operator !=(light a, light b);
+bool operator !=(coords2 a, coords2 b);
+bool operator !=(transformation a, transformation b);
bool operator !=(pairOrTriple a, pairOrTriple b);
+bool operator !=(object a, object b);
bool operator !=(marginT a, marginT b);
-bool operator !=(coords3 a, coords3 b);
-bool operator !=(align a, align b);
+bool operator !=(simplex a, simplex b);
+bool operator !=(scaleT a, scaleT b);
bool operator !=(coord a, coord b);
-bool operator !=(ScaleT a, ScaleT b);
-bool operator !=(Label a, Label b);
-bool operator !=(processtime a, processtime b);
+bool operator !=(coord a, coord b);
+bool operator !=(Legend a, Legend b);
+bool operator !=(position a, position b);
bool operator !=(slice a, slice b);
-bool operator !=(coords2 a, coords2 b);
-bool operator !=(transformation a, transformation b);
+bool operator !=(freezableBounds a, freezableBounds b);
+bool operator !=(projection a, projection b);
bool operator !=(picture a, picture b);
-bool operator !=(indexedTransform a, indexedTransform b);
bool operator !=(bool3 a, bool b);
-bool operator !=(hsv a, hsv b);
-bool operator !=(scaleT a, scaleT b);
-bool operator !=(side a, side b);
-bool operator !=(marker a, marker b);
+bool operator !=(light a, light b);
+bool operator !=(autoscaleT a, autoscaleT b);
+bool operator !=(align a, align b);
bool operator !=(scaling a, scaling b);
-bool operator !=(coord a, coord b);
-bool operator !=(Legend a, Legend b);
-bool operator !=(object a, object b);
-bool operator !=(cputime a, cputime b);
+bool operator !=(scaling a, scaling b);
+bool operator !=(bounds a, bounds b);
+bool operator !=(node a, node b);
+bool operator !=(Label a, Label b);
+bool operator !=(processtime a, processtime b);
bool operator !=(bool a, bool3 b);
bool operator !=(filltype a, filltype b);
-bool operator !=(freezableBounds a, freezableBounds b);
-bool operator !=(projection a, projection b);
-bool operator !=(framedTransformStack a, framedTransformStack b);
+bool operator !=(coords3 a, coords3 b);
+bool operator !=(marker a, marker b);
+bool operator !=(cputime a, cputime b);
bool operator ==(bool a, bool b);
bool[] operator ==(bool a, bool[] b);
bool[] operator ==(bool[] a, bool b);
@@ -1740,41 +1742,41 @@ bool operator ==(file a, file b);
bool operator ==(path a, path b);
bool operator ==(path3 a, path3 b);
bool operator ==(bool3 a, bool3 b);
-bool operator ==(autoscaleT a, autoscaleT b);
-bool operator ==(position a, position b);
+bool operator ==(ScaleT a, ScaleT b);
+bool operator ==(side a, side b);
bool operator ==(arrowhead a, arrowhead b);
+bool operator ==(hsv a, hsv b);
bool operator ==(coords2 a, coords2 b);
-bool operator ==(scaling a, scaling b);
-bool operator ==(bounds a, bounds b);
-bool operator ==(light a, light b);
+bool operator ==(coords2 a, coords2 b);
+bool operator ==(transformation a, transformation b);
bool operator ==(pairOrTriple a, pairOrTriple b);
+bool operator ==(object a, object b);
bool operator ==(marginT a, marginT b);
-bool operator ==(coords3 a, coords3 b);
-bool operator ==(align a, align b);
+bool operator ==(simplex a, simplex b);
+bool operator ==(scaleT a, scaleT b);
bool operator ==(coord a, coord b);
-bool operator ==(ScaleT a, ScaleT b);
-bool operator ==(Label a, Label b);
-bool operator ==(processtime a, processtime b);
+bool operator ==(coord a, coord b);
+bool operator ==(Legend a, Legend b);
+bool operator ==(position a, position b);
bool operator ==(slice a, slice b);
-bool operator ==(coords2 a, coords2 b);
-bool operator ==(transformation a, transformation b);
+bool operator ==(freezableBounds a, freezableBounds b);
+bool operator ==(projection a, projection b);
bool operator ==(picture a, picture b);
-bool operator ==(indexedTransform a, indexedTransform b);
bool operator ==(bool3 a, bool b);
-bool operator ==(hsv a, hsv b);
-bool operator ==(scaleT a, scaleT b);
-bool operator ==(side a, side b);
-bool operator ==(marker a, marker b);
+bool operator ==(light a, light b);
+bool operator ==(autoscaleT a, autoscaleT b);
+bool operator ==(align a, align b);
bool operator ==(scaling a, scaling b);
-bool operator ==(coord a, coord b);
-bool operator ==(Legend a, Legend b);
-bool operator ==(object a, object b);
-bool operator ==(cputime a, cputime b);
+bool operator ==(scaling a, scaling b);
+bool operator ==(bounds a, bounds b);
+bool operator ==(node a, node b);
+bool operator ==(Label a, Label b);
+bool operator ==(processtime a, processtime b);
bool operator ==(bool a, bool3 b);
bool operator ==(filltype a, filltype b);
-bool operator ==(freezableBounds a, freezableBounds b);
-bool operator ==(projection a, projection b);
-bool operator ==(framedTransformStack a, framedTransformStack b);
+bool operator ==(coords3 a, coords3 b);
+bool operator ==(marker a, marker b);
+bool operator ==(cputime a, cputime b);
bool operator ^(bool a, bool b);
bool[] operator ^(bool a, bool[] b);
bool[] operator ^(bool[] a, bool b);
@@ -1890,33 +1892,33 @@ string[][][] operator cast(file);
guide operator cast(cycleToken tok);
guide operator cast(curlSpecifier spec);
guide operator cast(tensionSpecifier t);
+align operator cast(side side);
guide[] operator cast(path[] g);
pair operator cast(pairOrTriple a);
triple operator cast(pairOrTriple a);
-position operator cast(real x);
-Label operator cast(string s);
+pen operator cast(hsv hsv);
frame operator cast(object F);
bool3[] operator cast(bool[] b);
-align operator cast(side side);
+hsv operator cast(pen p);
position operator cast(pair x);
+object operator cast(Label L);
+Label operator cast(object F);
+pair operator cast(position P);
+object operator cast(frame f);
guide[] operator cast(pair[] z);
path[] operator cast(guide[] g);
bool operator cast(bool3 b);
-pair operator cast(position P);
-object operator cast(frame f);
-path[] operator cast(guide g);
-object operator cast(Label L);
-Label operator cast(object F);
-pen operator cast(hsv hsv);
align operator cast(pair dir);
+path[] operator cast(guide g);
path[] operator cast(pair[] z);
+align operator cast(triple dir);
path[] operator cast(path p);
bool[] operator cast(bool3[] b);
-hsv operator cast(pen p);
-align operator cast(triple dir);
bool3 operator cast(bool b);
position operator cast(int x);
object operator cast(string s);
+position operator cast(real x);
+Label operator cast(string s);
pen deepred;
bool error(file f);
string operator ecast(int);
@@ -1944,43 +1946,44 @@ path3 operator init();
pen operator init();
frame operator init();
file operator init();
-hsv operator init();
-scaleT operator init();
-side operator init();
-marker operator init();
-marginT operator init();
-coords3 operator init();
+light operator init();
+autoscaleT operator init();
align operator init();
+marginT operator init();
+simplex operator init();
+scaleT operator init();
filltype operator init();
-projection operator init();
-framedTransformStack operator init();
+coords3 operator init();
+marker operator init();
+cputime operator init();
slice operator init();
-coords2 operator init();
-transformation operator init();
+projection operator init();
picture operator init();
-indexedTransform operator init();
+hsv operator init();
coords2 operator init();
-scaling operator init();
-bounds operator init();
-light operator init();
+coords2 operator init();
+transformation operator init();
pairOrTriple operator init();
-scaling operator init();
-coord operator init();
-Legend operator init();
object operator init();
-cputime operator init();
-coord operator init();
-ScaleT operator init();
+scaling operator init();
+scaling operator init();
+bounds operator init();
+node operator init();
Label operator init();
processtime operator init();
-bool3 operator init();
-autoscaleT operator init();
+coord operator init();
+coord operator init();
+Legend operator init();
position operator init();
+bool3 operator init();
+ScaleT operator init();
+side operator init();
arrowhead operator init();
+sCAD operator init();
frame NoBox(frame f);
real animationdelay;
-frame BBox(frame)(real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>);
animation operator init();
+frame BBox(frame)(real xmargin=<default>, real ymargin=<default>, pen p=<default>, filltype filltype=<default>);
void annotate(picture pic=<default>, string title, string text, pair position);
void babel(string s);
path[] bezulate(path[] p);
@@ -1988,7 +1991,6 @@ bool checkSegment(path g, pair p, pair q);
void connect(path[] paths, path[] result, path[] patch);
path uncycle(path p, real t);
path section(path p, real t1, real t2, bool loop=<default>);
-int countIntersections(path[] p, pair start, pair end);
real[][] intersections(pair a, pair b, path p);
real maxrefinements;
real duplicateFuzz;
@@ -1997,6 +1999,7 @@ path[][] containmentTree(path[] paths);
bool isDuplicate(pair a, pair b, real relSize);
real fuzz;
path removeDuplicates(path p);
+int countIntersections(path[] p, pair start, pair end);
binarytree binarytree(... key[] keys);
key nil;
key key(int n, bool active=<default>);
@@ -2014,25 +2017,15 @@ void draw(picture pic=<default>, binarytree tree, real minDist=<default>, real n
binarytree searchtree(... int[] keys);
real epsilon;
void add(picture pic=<default>, face[] faces, projection P=<default>);
-picture operator cast(face f);
-face operator cast(path3 p);
+line intersection(face a, face b);
face operator init();
line operator init();
half operator init();
splitface operator init();
bsp operator init();
-line intersection(face a, face b);
+picture operator cast(face f);
+face operator cast(path3 p);
splitface split(face a, face cut, projection P);
-sCAD operator init();
-vertex[][] contour3(triple[][][] v, real[][][] f, real[][][] midpoint=<default>, projection P=<default>);
-vertex[][] contour3(real[][][] f, real[][][] midpoint=<default>, triple a, triple b, projection P=<default>);
-vertex[][] contour3(real f(real, real, real), triple a, triple b, int nx=<default>, int ny=<default>, int nz=<default>, projection P=<default>);
-weighted operator init();
-bucket operator init();
-vertex operator init();
-object operator init();
-surface surface(vertex[][] g);
-real eps;
void addseg(pair[][] gds, segment seg);
pen[] extend(pen[] palette, pen below, pen above);
guide[][] connect(pair[][][] points, real[] c, guide join(... guide[]));
@@ -2040,25 +2033,34 @@ void collect(pair[][][] points, real[] c);
segment case3(pair p0, pair p1, pair p2, real v0, real v1, real v2, int edge=<default>);
segment case1(pair p0, pair p1, int edge);
real eps;
-segment checktriangle(pair p0, pair p1, pair p2, real v0, real v1, real v2, int edge=<default>);
-segment case2(pair p0, pair p1, pair p2, real v0, real v1, real v2, int edge);
guide[][] contour(pair[][] z, real[][] f, real[][] midpoint=<default>, real[] c, guide join(... guide[])=<default>);
guide[][] contour(real[][] f, real[][] midpoint=<default>, pair a, pair b, real[] c, guide join(... guide[])=<default>);
guide[][] contour(real f(real, real), pair a, pair b, real[] c, int nx=<default>, int ny=<default>, guide join(... guide[])=<default>);
guide[][] contour(real f(pair), pair a, pair b, real[] c, int nx=<default>, int ny=<default>, guide join(... guide[])=<default>);
guide[][] contour(pair[] z, real[] f, real[] c, guide join(... guide[])=<default>);
-pen[][] interior(picture pic=<default>, guide[][] g, pen[] palette);
-segment operator init();
+segment checktriangle(pair p0, pair p1, pair p2, real v0, real v1, real v2, int edge=<default>);
+segment case2(pair p0, pair p1, pair p2, real v0, real v1, real v2, int edge);
void draw(picture pic=<default>, Label[] L=<default>, guide[][] g, pen[] p);
void draw(picture pic=<default>, Label[] L=<default>, guide[][] g, pen p=<default>);
+segment operator init();
+pen[][] interior(picture pic=<default>, guide[][] g, pen[] palette);
void fill(picture pic=<default>, guide[][] g, pen[][] palette);
+vertex[][] contour3(triple[][][] v, real[][][] f, real[][][] midpoint=<default>, projection P=<default>);
+vertex[][] contour3(real[][][] f, real[][][] midpoint=<default>, triple a, triple b, projection P=<default>);
+vertex[][] contour3(real f(real, real, real), triple a, triple b, int nx=<default>, int ny=<default>, int nz=<default>, projection P=<default>);
+weighted operator init();
+bucket operator init();
+vertex operator init();
+object operator init();
+surface surface(vertex[][] g);
+real eps;
real treeMinNodeWidth;
-real treeLevelStep;
real treeNodeStep;
TreeNode operator init();
TreeNode makeNode(TreeNode parent=<default>, frame f);
TreeNode makeNode(TreeNode parent=<default>, Label label);
void add(TreeNode child, TreeNode parent);
+real treeLevelStep;
void draw(TreeNode root, pair pos);
void drawAll(TreeNode node, frame f);
real layout(int level, TreeNode node);
@@ -2068,6 +2070,7 @@ string embedplayer(string name, string text=<default>, string options=<default>,
string link(string label, string text=<default>);
string hyperlink(string url, string text);
string embed(string name, string text=<default>, string options=<default>, real width=<default>, real height=<default>, string image=<default>);
+bool XYAlign;
void drawMomArrow(picture pic=<default>, path p, align align, position pos=<default>, real offset=<default>, real length=<default>, pen fgpen=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool erasebg=<default>, pen bgpen=<default>, real margin=<default>);
void drawVertexOX(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>, bool erasebg=<default>, pen bgpen=<default>);
void drawVertexBoxO(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>, bool erasebg=<default>, pen bgpen=<default>);
@@ -2087,40 +2090,39 @@ bool overpaint;
bool currentarrow(picture, path, pen, marginT(path, pen));
real doublelinespacing;
pen doublelinepen;
+pen ghostpen;
real photonamplitude;
real gluonamplitude;
real photonratio;
pen gluonpen;
pen fermionpen;
-real momarrowsize(pen p=<default>);
void drawVertexX(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>);
void drawVertexO(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>, bool erasebg=<default>, pen bgpen=<default>);
+real momarrowfactor;
+real momarrowlength;
void drawVertexTriangleO(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>, bool erasebg=<default>, pen bgpen=<default>);
path photon(path p, real amp=<default>, real width=<default>);
+void texshipout(string stem, picture pic=<default>, bool xalign=<default>);
+void drawPhoton(picture pic=<default>, path p, real amp=<default>, real width=<default>, pen fgpen=<default>, bool erasebg=<default>, pen bgpen=<default>, real vertexangle=<default>, real margin=<default>);
path gluon(path p, real amp=<default>, real width=<default>);
-pen bigvertexpen;
-bool XYAlign;
-bool YAlign;
-void drawFermion(picture pic=<default>, path p, pen fgpen=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool erasebg=<default>, pen bgpen=<default>, real vertexangle=<default>, real margin=<default>);
+real momarrowsize(pen p=<default>);
void fmdefaults();
-void drawPhoton(picture pic=<default>, path p, real amp=<default>, real width=<default>, pen fgpen=<default>, bool erasebg=<default>, pen bgpen=<default>, real vertexangle=<default>, real margin=<default>);
-void do_overpaint(picture pic, path p, pen bgpen, real halfwidth, real vertexangle);
+void drawFermion(picture pic=<default>, path p, pen fgpen=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool erasebg=<default>, pen bgpen=<default>, real vertexangle=<default>, real margin=<default>);
bool appendsuffix;
-real momarrowfactor;
-void texshipout(string stem, picture pic=<default>, bool xalign=<default>);
+path momArrowPath(path p, align align, position pos, real offset=<default>, real length=<default>);
pen vertexpen;
real bigvertexsize;
-path momArrowPath(path p, align align, position pos, real offset=<default>, real length=<default>);
real gluonratio;
void drawGluon(picture pic=<default>, path p, real amp=<default>, real width=<default>, pen fgpen=<default>, bool erasebg=<default>, pen bgpen=<default>, real vertexangle=<default>, real margin=<default>);
pen backgroundpen;
-real momarrowlength;
-pen ghostpen;
pen scalarpen;
+bool YAlign;
void drawVertexBoxX(picture pic=<default>, pair xy, real r=<default>, pen fgpen=<default>, bool erasebg=<default>, pen bgpen=<default>);
void drawScalar(picture pic=<default>, path p, pen fgpen=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool erasebg=<default>, pen bgpen=<default>, real vertexangle=<default>, real margin=<default>);
string includegraphicscommand;
pen photonpen;
+void do_overpaint(picture pic, path p, pen bgpen, real halfwidth, real vertexangle);
+pen bigvertexpen;
Dir Down;
Dir Left;
block bevel(object body, pair center=<default>, pen fillpen=<default>, pen drawpen=<default>, real dh=<default>, real dw=<default>, real minwidth=<default>, real minheight=<default>);
@@ -2132,17 +2134,17 @@ Dir Up;
Dir Right;
real minblockwidth;
block circle(object body, pair center=<default>, pen fillpen=<default>, pen drawpen=<default>, real dr=<default>, real mindiameter=<default>);
-block rectangle(object header, object body, pair center=<default>, pen headerpen=<default>, pen bodypen=<default>, pen drawpen=<default>, real dx=<default>, real minheaderwidth=<default>, real minheaderheight=<default>, real minbodywidth=<default>, real minbodyheight=<default>);
-block rectangle(object body, pair center=<default>, pen fillpen=<default>, pen drawpen=<default>, real dx=<default>, real minwidth=<default>, real minheight=<default>);
+path path(pair[] point ... flowdir[] dir);
+void draw(picture pic=<default>, block block, pen p=<default>);
block operator --(block b1, Label label);
block operator --(block b1, Dir dir);
block operator --(block b, bool arrowbar(picture, path, pen, marginT(path, pen)));
+block rectangle(object header, object body, pair center=<default>, pen headerpen=<default>, pen bodypen=<default>, pen drawpen=<default>, real dx=<default>, real minheaderwidth=<default>, real minheaderheight=<default>, real minbodywidth=<default>, real minbodyheight=<default>);
+block rectangle(object body, pair center=<default>, pen fillpen=<default>, pen drawpen=<default>, real dx=<default>, real minwidth=<default>, real minheight=<default>);
flowdir operator init();
block operator init();
Dir operator init();
flowdir Vertical;
-path path(pair[] point ... flowdir[] dir);
-void draw(picture pic=<default>, block block, pen p=<default>);
block blockconnector(block, block)(picture pic, transform t, pen p=<default>, marginT margin(path, pen)=<default>);
block parallelogram(object body, pair center=<default>, pen fillpen=<default>, pen drawpen=<default>, real dx=<default>, real slope=<default>, real minwidth=<default>, real minheight=<default>);
flowdir Horizontal;
@@ -2167,58 +2169,8 @@ triangle extouch(triangle t);
triangle extouch(side side);
triangle pedal(triangle t, point M);
line pedal(side side, point M);
-point isogonal(side side, point M);
-line isogonal(vertex V, point M);
-triangle isogonal(triangle t, point M);
point isogonalconjugate(triangle t, point M);
point isotomicconjugate(triangle t, point M);
-point[] fermat(triangle t);
-triangle cevian(triangle t, point P);
-point cevian(side side, point P);
-line cevian(vertex V, point P);
-point symmedian(triangle t);
-point symmedian(side side);
-line symmedian(vertex V);
-pair[] intersectionpoints(pair A, pair B, real a, real b, real c, real d, real f, real g);
-pair[] intersectionpoints(pair A, pair B, real[] equation);
-point[] intersectionpoints(line l, path g);
-point[] intersectionpoints(bqe bqe1, bqe bqe2);
-point[] intersectionpoints(triangle t, line l, bool extended=<default>);
-point[] intersectionpoints(line l, triangle t, bool extended=<default>);
-point[] intersectionpoints(line l, circle c);
-point[] intersectionpoints(circle c, line l);
-point[] intersectionpoints(line l, ellipse el);
-point[] intersectionpoints(ellipse el, line l);
-point[] intersectionpoints(line l, parabola p);
-point[] intersectionpoints(parabola p, line l);
-point[] intersectionpoints(line l, hyperbola h);
-point[] intersectionpoints(hyperbola h, line l);
-point[] intersectionpoints(line l, conic co);
-point[] intersectionpoints(conic co, line l);
-point[] intersectionpoints(conic co1, conic co2);
-point[] intersectionpoints(triangle t, conic co, bool extended=<default>);
-point[] intersectionpoints(conic co, triangle t, bool extended=<default>);
-point[] intersectionpoints(ellipse a, ellipse b);
-point[] intersectionpoints(ellipse a, circle b);
-point[] intersectionpoints(circle a, ellipse b);
-point[] intersectionpoints(ellipse a, parabola b);
-point[] intersectionpoints(parabola a, ellipse b);
-point[] intersectionpoints(ellipse a, hyperbola b);
-point[] intersectionpoints(hyperbola a, ellipse b);
-point[] intersectionpoints(circle a, parabola b);
-point[] intersectionpoints(parabola a, circle b);
-point[] intersectionpoints(circle a, hyperbola b);
-point[] intersectionpoints(hyperbola a, circle b);
-point[] intersectionpoints(parabola a, parabola b);
-point[] intersectionpoints(parabola a, hyperbola b);
-point[] intersectionpoints(hyperbola a, parabola b);
-point[] intersectionpoints(hyperbola a, hyperbola b);
-point[] intersectionpoints(circle c1, circle c2);
-point[] intersectionpoints(conic co, arc a);
-point[] intersectionpoints(arc a, conic co);
-point[] intersectionpoints(arc a1, arc a2);
-point[] intersectionpoints(line l, arc a);
-point[] intersectionpoints(arc a, line l);
transform projection(point A, point B);
transform projection(point A, point B, point C, point D, bool safe=<default>);
transform projection(line l);
@@ -2268,23 +2220,25 @@ abscissa angabscissa(hyperbola h, point M, path polarconicroutine(conic co, real
abscissa angabscissa(parabola p, point M);
abscissa angabscissa(explicit conic co, point M);
abscissa angabscissa(arc a, point M);
-point centroid(point A, point B, point C);
-point centroid(triangle t);
+point arcsubtendedcenter(point A, point B, real angle);
inversion inversion(real k, point C);
inversion inversion(point C, real k);
inversion inversion(circle c1, circle c2, real sgn=<default>);
inversion inversion(circle c1, circle c2, circle c3);
inversion inversion(circle c);
-point arcsubtendedcenter(point A, point B, real angle);
-segment segment(point A, point B);
-segment segment(line l);
-segment segment(explicit side side);
+real EPS;
+bqe canonical(bqe bqe);
path compassmark(pair O, pair A, real position, real angle=<default>);
-path square(pair z1, pair z2);
-real[] bangles(picture pic=<default>, parabola p);
-real[][] bangles(picture pic=<default>, hyperbola h);
+triangle cevian(triangle t, point P);
+point cevian(side side, point P);
+line cevian(vertex V, point P);
vector vector(coordsys R=<default>, pair v);
vector vector(point M);
+path square(pair z1, pair z2);
+line isotomic(vertex V, point M);
+point isotomic(side side, point M);
+triangle isotomic(triangle t, point M);
+transform hprojection(line l, bool safe=<default>);
void clipdraw(picture pic=<default>, Label L=<default>, path g, align align=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool bar(picture, path, pen, marginT(path, pen))=<default>, real xmargin=<default>, real ymargin=<default>, Label legend=<default>, marker marker=<default>);
line median(vertex V);
line median(side side);
@@ -2295,6 +2249,7 @@ real arclength(parabola p, real angle);
real arclength(parabola p, real angle1, real angle2);
real arclength(parabola p);
real arclength(arc a);
+point[] standardizecoordsys(coordsys R=<default>, bool warn=<default> ... point[] M);
bool degenerate(conic c);
bool degenerate(circle c);
bool degenerate(ellipse el);
@@ -2304,8 +2259,8 @@ void perpendicularmark(picture pic=<default>, point z, explicit pair align, path
void perpendicularmark(picture pic=<default>, point z, vector align, path g, real size=<default>, pen p=<default>, marginT margin(path, pen)=<default>, filltype filltype=<default>);
void perpendicularmark(picture pic=<default>, line l1, line l2, real size=<default>, pen p=<default>, int quarter=<default>, marginT margin(path, pen)=<default>, filltype filltype=<default>);
void markrightangle(picture pic=<default>, point A, point O, point B, real size=<default>, pen p=<default>, marginT margin(path, pen)=<default>, filltype filltype=<default>);
-point ppoint(arc a, real x);
line sector(int n=<default>, int p=<default>, line l1, line l2, real angle=<default>, bool sharp=<default>);
+point ppoint(arc a, real x);
line hline(coordsys R=<default>);
line hline;
real binomial(real n, real k);
@@ -2349,31 +2304,30 @@ point angpoint(explicit ellipse el, real x, path polarconicroutine(conic co, rea
point angpoint(explicit parabola p, real x);
point angpoint(explicit hyperbola h, real x, path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)=<default>);
point angpoint(arc a, real angle);
-string conictype(bqe bqe);
+pen addpenline;
+pen addpenline(pen p);
bool operator ==(coordsys c1, coordsys c2);
bool operator ==(explicit point M, explicit point N);
bool operator ==(explicit vector u, explicit vector v);
bool operator ==(line l1, line l2);
-mass masscenter(... mass[] M);
triangle triangleAbc(real alpha, real b, real c, real angle=<default>, point A=<default>);
vector unit(point M);
vector unit(vector u);
transform reflect(line l);
transform reflect(line l1, line l2, bool safe=<default>);
-real EPS;
-bqe canonical(bqe bqe);
-point relpoint(line l, real x);
-point relpoint(explicit circle c, real x);
-point relpoint(explicit ellipse el, real x);
-point relpoint(explicit parabola p, real x);
-point relpoint(explicit hyperbola h, real x);
-point relpoint(explicit conic co, explicit real x);
-point relpoint(explicit conic co, explicit int x);
-point relpoint(arc a, real x);
-bool collinear(vector u, vector v);
-line complementary(explicit line l);
-line[] complementary(explicit segment s);
-arc complementary(arc a);
+real sharpdegrees(line l1, line l2);
+int ellipsenodesnumberfactor;
+line tangent(circle c, abscissa x);
+line tangent(circle c, point M);
+line tangent(circle c, explicit vector v);
+line tangent(ellipse el, abscissa x);
+line tangent(parabola p, abscissa x);
+line tangent(hyperbola h, abscissa x);
+line tangent(explicit arc a, abscissa x);
+line tangent(explicit arc a, point M);
+mass masscenter(... mass[] M);
+circle incircle(point A, point B, point C);
+circle incircle(triangle t);
real degrees(explicit point M, coordsys R=<default>, bool warn=<default>);
real degrees(vector v, coordsys R=<default>, bool warn=<default>);
real degrees(line l, coordsys R=<default>);
@@ -2381,20 +2335,58 @@ real degrees(line l1, line l2);
real degrees(arc a);
point foot(vertex V);
point foot(side side);
-ellipse ellipse(point F1, point F2, real a);
-ellipse ellipse(point F1, point F2, point M);
-ellipse ellipse(point C, real a, real b, real angle=<default>);
-ellipse ellipse(bqe bqe);
-ellipse ellipse(point M1, point M2, point M3, point M4, point M5);
+point[] fermat(triangle t);
point excenter(point A, point B, point C);
point excenter(side side);
-bool operator !=(explicit point M, explicit point N);
-bool operator !=(line l1, line l2);
-arc arcsubtended(point A, point B, real angle);
+triangle incentral(triangle t);
+point origin;
+point origin(coordsys R=<default>);
+string massformat(string format=<default>, string s, mass M);
void write(explicit line l);
void write(explicit segment s);
void write(trilinear tri);
-int ellipsenodesnumberfactor;
+point midpoint(segment s);
+point midpoint(side side);
+point relpoint(line l, real x);
+point relpoint(explicit circle c, real x);
+point relpoint(explicit ellipse el, real x);
+point relpoint(explicit parabola p, real x);
+point relpoint(explicit hyperbola h, real x);
+point relpoint(explicit conic co, explicit real x);
+point relpoint(explicit conic co, explicit int x);
+point relpoint(arc a, real x);
+bool collinear(vector u, vector v);
+point curpoint(line l, real x);
+point curpoint(explicit circle c, real x);
+point curpoint(explicit ellipse el, real x);
+point curpoint(explicit parabola p, real x);
+point curpoint(conic co, real x);
+point curpoint(arc a, real x);
+int parabolanodesnumber(parabola p, real angle1, real angle2);
+line complementary(explicit line l);
+line[] complementary(explicit segment s);
+arc complementary(arc a);
+pair coordinates(point M);
+string defaultmassformat;
+int circlenodesnumberfactor;
+coordsys operator init();
+point operator init();
+vector operator init();
+line operator init();
+segment operator init();
+bqe operator init();
+conic operator init();
+circle operator init();
+ellipse operator init();
+parabola operator init();
+hyperbola operator init();
+abscissa operator init();
+arc operator init();
+mass operator init();
+triangle operator init();
+trilinear operator init();
+inversion operator init();
+triangle triangle(line l1, line l2, line l3);
pair operator cast(point P);
pair[] operator cast(point[] P);
point operator cast(pair p);
@@ -2440,42 +2432,61 @@ point operator cast(vertex V);
point operator cast(trilinear tri);
circle operator cast(inversion i);
inversion operator cast(circle c);
-point curpoint(line l, real x);
-point curpoint(explicit circle c, real x);
-point curpoint(explicit ellipse el, real x);
-point curpoint(explicit parabola p, real x);
-point curpoint(conic co, real x);
-point curpoint(arc a, real x);
-triangle incentral(triangle t);
-pair coordinates(point M);
-int circlenodesnumberfactor;
-coordsys operator init();
-point operator init();
-vector operator init();
-line operator init();
-segment operator init();
-bqe operator init();
-conic operator init();
-circle operator init();
-ellipse operator init();
-parabola operator init();
-hyperbola operator init();
-abscissa operator init();
-arc operator init();
-mass operator init();
-triangle operator init();
-trilinear operator init();
-inversion operator init();
-point origin;
-point origin(coordsys R=<default>);
-string massformat(string format=<default>, string s, mass M);
-transform xscale(real k, point M);
-int parabolanodesnumber(parabola p, real angle1, real angle2);
-point midpoint(segment s);
-point midpoint(side side);
bool inside(ellipse el, point M);
bool inside(parabola p, point M);
-real sharpdegrees(line l1, line l2);
+transform vprojection(line l, bool safe=<default>);
+string conictype(bqe bqe);
+circle circumcircle(point A, point B, point C);
+circle circumcircle(triangle t);
+pen addpenarc;
+pen addpenarc(pen p);
+line reverse(line l);
+arc reverse(arc a);
+line vline(coordsys R=<default>);
+line vline;
+real[] intersect(path g, explicit pair p, real fuzz=<default>);
+real[] intersect(path g, explicit point P, real fuzz=<default>);
+pair[] intersectionpoints(pair A, pair B, real a, real b, real c, real d, real f, real g);
+pair[] intersectionpoints(pair A, pair B, real[] equation);
+point[] intersectionpoints(line l, path g);
+point[] intersectionpoints(bqe bqe1, bqe bqe2);
+point[] intersectionpoints(triangle t, line l, bool extended=<default>);
+point[] intersectionpoints(line l, triangle t, bool extended=<default>);
+point[] intersectionpoints(line l, circle c);
+point[] intersectionpoints(circle c, line l);
+point[] intersectionpoints(line l, ellipse el);
+point[] intersectionpoints(ellipse el, line l);
+point[] intersectionpoints(line l, parabola p);
+point[] intersectionpoints(parabola p, line l);
+point[] intersectionpoints(line l, hyperbola h);
+point[] intersectionpoints(hyperbola h, line l);
+point[] intersectionpoints(line l, conic co);
+point[] intersectionpoints(conic co, line l);
+point[] intersectionpoints(conic co1, conic co2);
+point[] intersectionpoints(triangle t, conic co, bool extended=<default>);
+point[] intersectionpoints(conic co, triangle t, bool extended=<default>);
+point[] intersectionpoints(ellipse a, ellipse b);
+point[] intersectionpoints(ellipse a, circle b);
+point[] intersectionpoints(circle a, ellipse b);
+point[] intersectionpoints(ellipse a, parabola b);
+point[] intersectionpoints(parabola a, ellipse b);
+point[] intersectionpoints(ellipse a, hyperbola b);
+point[] intersectionpoints(hyperbola a, ellipse b);
+point[] intersectionpoints(circle a, parabola b);
+point[] intersectionpoints(parabola a, circle b);
+point[] intersectionpoints(circle a, hyperbola b);
+point[] intersectionpoints(hyperbola a, circle b);
+point[] intersectionpoints(parabola a, parabola b);
+point[] intersectionpoints(parabola a, hyperbola b);
+point[] intersectionpoints(hyperbola a, parabola b);
+point[] intersectionpoints(hyperbola a, hyperbola b);
+point[] intersectionpoints(circle c1, circle c2);
+point[] intersectionpoints(conic co, arc a);
+point[] intersectionpoints(arc a, conic co);
+point[] intersectionpoints(arc a1, arc a2);
+point[] intersectionpoints(line l, arc a);
+point[] intersectionpoints(arc a, line l);
+void drawline(picture pic=<default>, triangle t, pen p=<default>);
void draw(picture pic=<default>, Label L=<default>, line l, bool dirA=<default>, bool dirB=<default>, align align=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, Label legend=<default>, marker marker=<default>, path pathModifier(path)=<default>);
void draw(picture pic=<default>, Label[] L=<default>, line[] l, align align=<default>, pen[] p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, Label[] legend=<default>, marker marker=<default>, path pathModifier(path)=<default>);
void draw(picture pic=<default>, Label[] L=<default>, line[] l, align align=<default>, pen p, bool arrow(picture, path, pen, marginT(path, pen))=<default>, Label[] legend=<default>, marker marker=<default>, path pathModifier(path)=<default>);
@@ -2487,34 +2498,24 @@ void draw(picture pic=<default>, Label L=<default>, explicit conic co, align ali
void draw(picture pic=<default>, Label L=<default>, arc a, align align=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, bool bar(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, Label legend=<default>, marker marker=<default>);
void draw(picture pic=<default>, triangle t, pen p=<default>, marker marker=<default>);
void draw(picture pic=<default>, triangle[] t, pen p=<default>, marker marker=<default>);
-transform vprojection(line l, bool safe=<default>);
-line isotomic(vertex V, point M);
-point isotomic(side side, point M);
-triangle isotomic(triangle t, point M);
-transform hprojection(line l, bool safe=<default>);
-circle circumcircle(point A, point B, point C);
-circle circumcircle(triangle t);
-pen addpenarc;
-pen addpenarc(pen p);
-line reverse(line l);
-arc reverse(arc a);
-line tangent(circle c, abscissa x);
-line tangent(circle c, point M);
-line tangent(circle c, explicit vector v);
-line tangent(ellipse el, abscissa x);
-line tangent(parabola p, abscissa x);
-line tangent(hyperbola h, abscissa x);
-line tangent(explicit arc a, abscissa x);
-line tangent(explicit arc a, point M);
-void drawline(picture pic=<default>, triangle t, pen p=<default>);
-circle incircle(point A, point B, point C);
-circle incircle(triangle t);
+void label(picture pic=<default>, Label L, explicit mass M, align align=<default>, string format=<default>, pen p=<default>, filltype filltype=<default>);
+void label(picture pic=<default>, Label L, vertex V, pair align=<default>, real alignFactor=<default>, pen p=<default>, filltype filltype=<default>);
+void label(picture pic=<default>, Label LA=<default>, Label LB=<default>, Label LC=<default>, triangle t, real alignAngle=<default>, real alignFactor=<default>, pen p=<default>, filltype filltype=<default>);
+side opposite(vertex V);
+vertex opposite(side side);
line[] operator ^^(line l1, line l2);
line[] operator ^^(line l1, line[] l2);
line[] operator ^^(line[] l2, line l1);
line[] operator ^^(line[] l1, line[] l2);
triangle[] operator ^^(triangle[] t1, triangle t2);
triangle[] operator ^^(... triangle[] t);
+real elle(real phi, real k);
+point conj(explicit point M);
+vector conj(explicit vector u);
+hyperbola conj(hyperbola h);
+mass mass(point M, real m);
+mass mass(explicit point P);
+mass mass(coordsys R, explicit pair p, real m);
point operator +(explicit point P1, explicit point P2);
point operator +(explicit point P1, explicit pair p2);
point operator +(explicit pair p1, explicit point p2);
@@ -2538,15 +2539,15 @@ mass operator +(explicit mass M, real x);
mass operator +(explicit mass M, int x);
point intersectionpoint(line l1, line l2);
bool concurrent(... line[] l);
-void label(picture pic=<default>, Label L, explicit mass M, align align=<default>, string format=<default>, pen p=<default>, filltype filltype=<default>);
-void label(picture pic=<default>, Label L, vertex V, pair align=<default>, real alignFactor=<default>, pen p=<default>, filltype filltype=<default>);
-void label(picture pic=<default>, Label LA=<default>, Label LB=<default>, Label LC=<default>, triangle t, real alignAngle=<default>, real alignFactor=<default>, pen p=<default>, filltype filltype=<default>);
circle circle(explicit point C, real r);
circle circle(point A, point B);
circle circle(segment s);
circle circle(point A, point B, point C);
circle circle(triangle t);
circle circle(inversion i);
+segment segment(point A, point B);
+segment segment(line l);
+segment segment(explicit side side);
transform yscale(real k, point M);
int sgnd(real x);
int sgnd(int x);
@@ -2565,7 +2566,6 @@ arc arc(ellipse el, point M, point N, bool direction=<default>);
arc arc(explicit arc a, abscissa x1, abscissa x2);
arc arc(explicit arc a, point M, point N);
path arc(explicit pair B, explicit pair A, explicit pair C, real r);
-bool between(point M, point O, point N);
point operator -(explicit point P);
point operator -(explicit point P1, explicit point P2);
point operator -(explicit point P1, explicit pair p2);
@@ -2591,28 +2591,25 @@ mass operator -(mass M1, mass M2);
mass operator -(explicit mass M, real x);
mass operator -(explicit mass M, int x);
real[] realquarticroots(real a, real b, real c, real d, real e);
-string defaultmassformat;
-coordsys canonicalcartesiansystem(ellipse el);
-coordsys canonicalcartesiansystem(parabola p);
-coordsys canonicalcartesiansystem(hyperbola h);
-coordsys canonicalcartesiansystem(explicit conic co);
+bool operator !=(explicit point M, explicit point N);
+bool operator !=(line l1, line l2);
+arc arcsubtended(point A, point B, real angle);
+point centroid(point A, point B, point C);
+point centroid(triangle t);
hyperbola hyperbola(point P1, point P2, real ae, bool byfoci=<default>);
hyperbola hyperbola(point C, real a, real b, real angle=<default>);
hyperbola hyperbola(bqe bqe);
hyperbola hyperbola(point M1, point M2, point M3, point M4, point M5);
-real[] intersect(path g, explicit pair p, real fuzz=<default>);
-real[] intersect(path g, explicit point P, real fuzz=<default>);
transform rotate(explicit pair dir);
transform rotate(explicit vector dir);
transform rotate(explicit point dir);
void addMargins(picture pic=<default>, real lmargin=<default>, real bmargin=<default>, real rmargin=<default>, real tmargin=<default>, bool rigid=<default>, bool allObject=<default>);
-point circumcenter(point A, point B, point C);
-point circumcenter(triangle t);
-triangle triangle(line l1, line l2, line l3);
+ellipse ellipse(point F1, point F2, real a);
+ellipse ellipse(point F1, point F2, point M);
+ellipse ellipse(point C, real a, real b, real angle=<default>);
+ellipse ellipse(bqe bqe);
+ellipse ellipse(point M1, point M2, point M3, point M4, point M5);
path fromCenter(conic co, real angle1, real angle2, int n, bool direction);
-pen addpenline;
-pen addpenline(pen p);
-path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)(conic co);
abscissa nodabscissa(real x);
abscissa nodabscissa(int x);
abscissa nodabscissa(line l, point M);
@@ -2621,8 +2618,12 @@ abscissa nodabscissa(ellipse el, point M);
abscissa nodabscissa(parabola p, point M);
abscissa nodabscissa(conic co, point M);
abscissa nodabscissa(arc a, point M);
-side opposite(vertex V);
-vertex opposite(side side);
+point isogonal(side side, point M);
+line isogonal(vertex V, point M);
+triangle isogonal(triangle t, point M);
+transform xscale(real k, point M);
+point circumcenter(point A, point B, point C);
+point circumcenter(triangle t);
line Ox(coordsys R=<default>);
line Ox;
real abs(coordsys R, pair m);
@@ -2636,22 +2637,17 @@ real angle(explicit vector v, coordsys R=<default>, bool warn=<default>);
real angle(line l, coordsys R=<default>);
real angle(line l1, line l2);
real angle(arc a);
-line vline(coordsys R=<default>);
-line vline;
+coordsys canonicalcartesiansystem(ellipse el);
+coordsys canonicalcartesiansystem(parabola p);
+coordsys canonicalcartesiansystem(hyperbola h);
+coordsys canonicalcartesiansystem(explicit conic co);
+real[] bangles(picture pic=<default>, parabola p);
+real[][] bangles(picture pic=<default>, hyperbola h);
triangle tangential(triangle t);
-real elle(real phi, real k);
-point conj(explicit point M);
-vector conj(explicit vector u);
-hyperbola conj(hyperbola h);
-mass mass(point M, real m);
-mass mass(explicit point P);
-mass mass(coordsys R, explicit pair p, real m);
line[] tangents(circle c, point M);
line[] tangents(ellipse el, point M);
line[] tangents(parabola p, point M);
line[] tangents(hyperbola h, point M);
-bool simeq(point A, point B, real fuzz=<default>);
-bool simeq(point a, real b, real fuzz=<default>);
triangle triangleabc(real a, real b, real c, real angle=<default>, point A=<default>);
void markangle(picture pic=<default>, Label L=<default>, int n=<default>, real radius=<default>, real space=<default>, explicit line l1, explicit line l2, explicit pair align=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, pen p=<default>, filltype filltype=<default>, marginT margin(path, pen)=<default>, marker marker=<default>);
void markangle(picture pic=<default>, Label L=<default>, int n=<default>, real radius=<default>, real space=<default>, explicit line l1, explicit line l2, explicit vector align, bool arrow(picture, path, pen, marginT(path, pen))=<default>, pen p=<default>, filltype filltype=<default>, marginT margin(path, pen)=<default>, marker marker=<default>);
@@ -2659,10 +2655,10 @@ bool isparabola(bqe bqe);
real approximate(real t);
real[] approximate(real[] T);
coordsys defaultcoordsys;
+bool simeq(point A, point B, real fuzz=<default>);
+bool simeq(point a, real b, real fuzz=<default>);
real epsgeo;
real rf(real x, real y, real z);
-point gergonne(triangle t);
-int angularsystem;
abscissa curabscissa(real x);
abscissa curabscissa(int x);
abscissa curabscissa(line l, point M);
@@ -2700,7 +2696,6 @@ bqe changecoordsys(coordsys R, bqe bqe);
conic changecoordsys(coordsys R, conic co);
bool samecoordsys(bool warn=<default> ... point[] M);
bool samecoordsys(bool warn=<default> ... bqe[] bqes);
-point[] standardizecoordsys(coordsys R=<default>, bool warn=<default> ... point[] M);
pair locate(point P);
point locate(pair p);
pair locate(explicit vector v);
@@ -2730,6 +2725,7 @@ bool sameside(point M, point N, point O);
bool sameside(point M, point P, line l);
point[] sameside(point M, line l1, line l2);
path currentpolarconicroutine(conic co, real angle1, real angle2, int n, bool direction);
+bool between(point M, point O, point N);
int ellipsenodesnumber(real a, real b);
int ellipsenodesnumber(real a, real b, real angle1, real angle2, bool dir);
path NoModifier(path);
@@ -2737,8 +2733,6 @@ void Drawline(picture pic=<default>, Label L=<default>, pair P, bool dirP=<defau
void distance(picture pic=<default>, Label L=<default>, point A, point B, bool rotated=<default>, real offset=<default>, pen p=<default>, pen joinpen=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>);
real distance(point M, line l);
real distance(line l, point M);
-int hyperbolanodesnumberfactor;
-real perpfactor;
pair attract(pair m, path g, real fuzz=<default>);
point attract(point M, path g, real fuzz=<default>);
point incenter(point A, point B, point C);
@@ -2779,6 +2773,8 @@ int conicnodesnumber(conic co, real angle1, real angle2, bool dir=<default>);
int circlenodesnumber(real r);
int circlenodesnumber(real r, real angle1, real angle2);
int parabolanodesnumberfactor;
+real perpfactor;
+int hyperbolanodesnumberfactor;
int hyperbolanodesnumber(hyperbola h, real angle1, real angle2);
path arcfromfocus(conic co, real angle1, real angle2, int n=<default>, bool direction=<default>);
bool byfoci;
@@ -2809,6 +2805,7 @@ abscissa relabscissa(circle c, point M);
abscissa relabscissa(ellipse el, point M);
abscissa relabscissa(conic co, point M);
abscissa relabscissa(arc a, point M);
+path polarconicroutine(conic co, real angle1, real angle2, int n, bool direction)(conic co);
void markarc(picture pic=<default>, Label L=<default>, int n=<default>, real radius=<default>, real space=<default>, arc a, pen sectorpen=<default>, pen markpen=<default>, marginT margin(path, pen)=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marker marker=<default>);
int arcnodesnumber(explicit arc a);
path arctopath(arc a, int n);
@@ -2822,117 +2819,11 @@ int[] numarray;
line altitude(vertex V);
line altitude(side side);
int[] tricoef(side side);
-void labelz(picture pic=<default>, Label L=<default>, triple v, align align=<default>, string format=<default>, pen p=<default>);
-void labelx3(picture pic=<default>, Label L=<default>, real x, align align=<default>, string format=<default>, pen p=<default>);
-void ztick3(picture pic=<default>, real z, triple dir=<default>, real size=<default>, pen p=<default>);
-void ztick3(picture pic=<default>, Label L, real z, triple dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
-void ztick(picture pic=<default>, triple v, triple dir=<default>, real size=<default>, pen p=<default>);
-void ztick(picture pic=<default>, Label L, triple v, triple dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
-void ytick3(picture pic=<default>, real y, triple dir=<default>, real size=<default>, pen p=<default>);
-void ytick3(picture pic=<default>, Label L, real y, triple dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
-void xaxis3(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, real xmin=<default>, real xmax=<default>, pen p=<default>, void ticks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, bool above=<default>);
-void autoscale3(picture pic=<default>, void axis(picture, axisT));
-triple defaultdir(triple X, triple Y, triple Z, bool opposite=<default>, projection P);
-real ztrans(real[][] t, real z);
-void XYZero(picture, axisT)(triple align=<default>, bool extend=<default>);
-void XYZero(picture, axisT);
-void YZZero(picture, axisT)(triple align=<default>, bool extend=<default>);
-void YZZero(picture, axisT);
-void XZEquals(picture, axisT)(real x, real z, triple align=<default>, bool extend=<default>);
-void YZEquals(picture, axisT)(real y, real z, triple align=<default>, bool extend=<default>);
-void Bounds(picture, axisT)(int type=<default>, int type2=<default>, triple align=<default>, bool extend=<default>);
-void Bounds(picture, axisT);
-void InTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, tickvalues modify(tickvalues)=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
-void InTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, real[] Ticks, real[] ticks=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
-void InTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>);
-void NoTicks3(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)();
-void NoTicks3(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>);
-void Ticks3(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)(int sign, Label F=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, real[] Ticks=<default>, real[] ticks=<default>, int N=<default>, bool begin=<default>, bool end=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
-void Ticks3(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)(int sign, Label F=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, tickvalues modify(tickvalues)=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
-surface bispline(real[][] z, real[][] p, real[][] q, real[][] r, real[] x, real[] y, bool[][] cond=<default>);
-void zlimits(picture pic=<default>, real min=<default>, real max=<default>, bool crop=<default>);
-void axes3(picture pic=<default>, Label xlabel=<default>, Label ylabel=<default>, Label zlabel=<default>, bool extend=<default>, triple min=<default>, triple max=<default>, pen p=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>);
-bool vperiodic(triple[][] a);
-bool uperiodic(triple[][] a);
-void zaxis3At(picture pic=<default>, Label L=<default>, void axis(picture, axisT), real zmin=<default>, real zmax=<default>, pen p=<default>, void ticks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, bool above=<default>, bool opposite=<default>, bool opposite2=<default>, bool primary=<default>);
-void yaxis3(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, real ymin=<default>, real ymax=<default>, pen p=<default>, void ticks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, bool above=<default>);
-path3[] segment(triple[] v, bool[] cond, void join(flatguide3)(... void(flatguide3)[])=<default>);
-void yaxis3At(picture pic=<default>, Label L=<default>, void axis(picture, axisT), real ymin=<default>, real ymax=<default>, pen p=<default>, void ticks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, bool above=<default>, bool opposite=<default>, bool opposite2=<default>, bool primary=<default>);
-real ScaleZ(picture pic=<default>, real z);
-triple tickMin3(picture pic);
-void axis(picture pic=<default>, Label L=<default>, path3 g, path3 g2=<default>, pen p=<default>, void ticks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>), ticklocate locate, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, int[] divisor=<default>, bool above=<default>, bool opposite=<default>);
-triple tickMax3(picture pic);
-void labely3(picture pic=<default>, Label L=<default>, real y, align align=<default>, string format=<default>, pen p=<default>);
-void xtick3(picture pic=<default>, real x, triple dir=<default>, real size=<default>, pen p=<default>);
-void xtick3(picture pic=<default>, Label L, real x, triple dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
-void Straight(flatguide3)(... void(flatguide3)[]);
-real xtrans(real[][] t, real x);
-void(flatguide3)[][] lift(real f(real x, real y), guide[][] g, void join(flatguide3)(... void(flatguide3)[])=<default>);
-void(flatguide3)[][] lift(real f(pair z), guide[][] g, void join(flatguide3)(... void(flatguide3)[])=<default>);
-void xaxis3At(picture pic=<default>, Label L=<default>, void axis(picture, axisT), real xmin=<default>, real xmax=<default>, pen p=<default>, void ticks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, bool above=<default>, bool opposite=<default>, bool opposite2=<default>, bool primary=<default>);
-real maxlength(triple f(pair z), pair a, pair b, int nu, int nv);
-locateT operator init();
-triple Dir(real)(triple dir);
-void ytick(picture pic=<default>, triple v, triple dir=<default>, real size=<default>, pen p=<default>);
-void ytick(picture pic=<default>, Label L, triple v, triple dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
-void draw(picture pic=<default>, Label[] L=<default>, void(flatguide3)[][] g, pen[] p, light light=<default>, string name=<default>, render render=<default>, interaction interaction=<default>);
-void draw(picture pic=<default>, Label[] L=<default>, void(flatguide3)[][] g, pen p=<default>, light light=<default>, string name=<default>, render render=<default>, interaction interaction=<default>);
-void xtick(picture pic=<default>, triple v, triple dir=<default>, real size=<default>, pen p=<default>);
-void xtick(picture pic=<default>, Label L, triple v, triple dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
-void zaxis3(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, real zmin=<default>, real zmax=<default>, pen p=<default>, void ticks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, bool above=<default>);
-picture vectorfield(path3 vector(pair v), triple f(pair z), pair a, pair b, int nu=<default>, int nv=<default>, bool truesize=<default>, real maxlength=<default>, bool cond(pair z)=<default>, pen p=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, string name=<default>, render render=<default>);
-void label(picture pic, Label L, triple v, real x, align align, string format, pen p);
-ticklocate ticklocate(real a, real b, autoscaleT S=<default>, real tickmin=<default>, real tickmax=<default>, real time(real)=<default>, triple dir(real));
-void OutTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, tickvalues modify(tickvalues)=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
-void OutTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, real[] Ticks, real[] ticks=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
-void OutTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>);
-void XZZero(picture, axisT)(triple align=<default>, bool extend=<default>);
-void XZZero(picture, axisT);
-real ytrans(real[][] t, real y);
-path3 Circle(triple c, real r, triple normal=<default>, int n=<default>);
-void labelaxis(picture pic, real[][] T, Label L, path3 g, ticklocate locate=<default>, int sign=<default>, bool ticklabels=<default>);
-void XYEquals(picture, axisT)(real x, real y, triple align=<default>, bool extend=<default>);
-void Spline(flatguide3)(... void(flatguide3)[]);
-void labelz3(picture pic=<default>, Label L=<default>, real z, align align=<default>, string format=<default>, pen p=<default>);
-void graph(flatguide3)(triple F(real), real, real, int)(void join(flatguide3)(... void(flatguide3)[]));
-void(flatguide3)[] graph(triple F(real), real, real, int)(void join(flatguide3)(... void(flatguide3)[]), bool3 cond(real));
-void graph(flatguide3)(picture pic=<default>, real x(real), real y(real), real z(real), real a, real b, int n=<default>, void join(flatguide3)(... void(flatguide3)[])=<default>);
-void(flatguide3)[] graph(picture pic=<default>, real x(real), real y(real), real z(real), real a, real b, int n=<default>, bool3 cond(real), void join(flatguide3)(... void(flatguide3)[])=<default>);
-void graph(flatguide3)(picture pic=<default>, triple v(real), real a, real b, int n=<default>, void join(flatguide3)(... void(flatguide3)[])=<default>);
-void(flatguide3)[] graph(picture pic=<default>, triple v(real), real a, real b, int n=<default>, bool3 cond(real), void join(flatguide3)(... void(flatguide3)[])=<default>);
-void graph(flatguide3)(picture pic=<default>, triple[] v, void join(flatguide3)(... void(flatguide3)[])=<default>);
-void(flatguide3)[] graph(picture pic=<default>, triple[] v, bool3[] cond, void join(flatguide3)(... void(flatguide3)[])=<default>);
-void graph(flatguide3)(picture pic=<default>, real[] x, real[] y, real[] z, void join(flatguide3)(... void(flatguide3)[])=<default>);
-void(flatguide3)[] graph(picture pic=<default>, real[] x, real[] y, real[] z, bool3[] cond, void join(flatguide3)(... void(flatguide3)[])=<default>);
-void graph(flatguide3)(triple F(path, real), path p, int n=<default>, void join(flatguide3)(... void(flatguide3)[])=<default>);
-void graph(flatguide3)(triple F(pair), path p, int n=<default>, void join(flatguide3)(... void(flatguide3)[])=<default>);
-void graph(flatguide3)(picture pic=<default>, real f(pair), path p, int n=<default>, void join(flatguide3)(... void(flatguide3)[])=<default>);
-void graph(flatguide3)(real f(pair), path p, int n=<default>, real T(pair), void join(flatguide3)(... void(flatguide3)[])=<default>);
-path3 Arc(triple c, triple v1, triple v2, triple normal=<default>, bool direction=<default>, int n=<default>);
-path3 Arc(triple c, real r, real theta1, real phi1, real theta2, real phi2, triple normal=<default>, bool direction, int n=<default>);
-path3 Arc(triple c, real r, real theta1, real phi1, real theta2, real phi2, triple normal=<default>, int n=<default>);
-void labeltick(picture pic, real[][] T, path3 g, ticklocate locate, real val, int sign, real Size, string ticklabel(real), Label F, real norm=<default>);
-void labelx(picture pic=<default>, Label L=<default>, triple v, align align=<default>, string format=<default>, pen p=<default>);
-void drawtick(picture pic, real[][] T, path3 g, path3 g2, ticklocate locate, real val, real Size, int sign, pen p, bool extend);
-void labely(picture pic=<default>, Label L=<default>, triple v, align align=<default>, string format=<default>, pen p=<default>);
-void tick(picture pic=<default>, triple v, triple dir, real size=<default>, pen p=<default>);
-void tick(picture pic=<default>, Label L, real value, triple v, triple dir, string format=<default>, real size=<default>, pen p=<default>);
-void polargraph(flatguide3)(real r(real, real), real theta(real), real phi(real), int n=<default>, void join(flatguide3)(... void(flatguide3)[])=<default>);
-triple ticklabelshift(triple align, pen p=<default>);
-triple polar(real r, real theta, real phi);
-triple Scale(picture pic=<default>, triple v);
-void limits(picture pic=<default>, triple min, triple max);
-void InOutTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, tickvalues modify(tickvalues)=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
-void InOutTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, real[] Ticks, real[] ticks=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
-void InOutTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>);
-surface surface(triple[][] f, bool[][] cond=<default>);
-surface surface(real[][] f, real[] x, real[] y, real[] xsplinetype(real[], real[])=<default>, real[] ysplinetype(real[], real[])=<default>, bool[][] cond=<default>);
-surface surface(real[][] f, pair a, pair b, real[] xsplinetype(real[], real[]), real[] ysplinetype(real[], real[])=<default>, bool[][] cond=<default>);
-surface surface(real[][] f, pair a, pair b, bool[][] cond=<default>);
-surface surface(triple f(pair z), pair a, pair b, int nu=<default>, int nv=<default>, bool cond(pair z)=<default>);
-surface surface(triple f(pair z), pair a, pair b, int nu=<default>, int nv=<default>, real[](real[], real[])[] usplinetype, real[](real[], real[])[] vsplinetype=<default>, bool cond(pair z)=<default>);
-surface surface(real f(pair z), pair a, pair b, int nx=<default>, int ny=<default>, bool cond(pair z)=<default>);
-surface surface(real f(pair z), pair a, pair b, int nx=<default>, int ny=<default>, real[] xsplinetype(real[], real[]), real[] ysplinetype(real[], real[])=<default>, bool cond(pair z)=<default>);
+point symmedian(triangle t);
+point symmedian(side side);
+line symmedian(vertex V);
+int angularsystem;
+point gergonne(triangle t);
path Arc(pair c, real r, real angle1, real angle2, bool direction, int n=<default>);
path Arc(pair c, real r, real angle1, real angle2, int n=<default>);
path Arc(pair c, explicit pair z1, explicit pair z2, bool direction=<default>, int n=<default>);
@@ -2966,12 +2857,15 @@ void labelx(picture pic=<default>, Label L, string format=<default>, explicit pe
void tick(picture pic=<default>, pair z, pair dir, real size=<default>, pen p=<default>);
void tick(picture pic=<default>, Label L, real value, explicit pair z, pair dir, string format=<default>, real size=<default>, pen p=<default>);
void limits(picture pic=<default>, pair min, pair max, bool crop=<default>);
+void crop(picture pic=<default>);
void ylimits(picture pic=<default>, real min=<default>, real max=<default>, bool crop=<default>);
-void xaxisAt(picture pic=<default>, Label L=<default>, void axis(picture, axisT), real xmin=<default>, real xmax=<default>, pen p=<default>, void ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, bool above=<default>, bool opposite=<default>);
+void yaxisAt(picture pic=<default>, Label L=<default>, void axis(picture, axisT), real ymin=<default>, real ymax=<default>, pen p=<default>, void ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, bool above=<default>, bool opposite=<default>);
void YZero(picture, axisT)(bool extend=<default>);
void YZero(picture, axisT);
void YEquals(picture, axisT)(real y, bool extend=<default>);
void XEquals(picture, axisT)(real x, bool extend=<default>);
+void LeftRight(picture, axisT)(bool extend=<default>);
+void LeftRight(picture, axisT);
void Left(picture, axisT)(bool extend=<default>);
void Left(picture, axisT);
int Min;
@@ -2980,16 +2874,16 @@ void RightTicks(frame, transform, Label, pair, path, path, pen, bool(picture, pa
void RightTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>);
void NoTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)();
void NoTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>);
-tickvalues OmitTickIntervals(tickvalues)(real[] a, real[] b);
+tickvalues OmitTickInterval(tickvalues)(real a, real b);
void Ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(int sign, Label F=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, real[] Ticks=<default>, real[] ticks=<default>, int N=<default>, bool begin=<default>, bool end=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
void Ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(int sign, Label F=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, tickvalues modify(tickvalues)=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
void Ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, tickvalues modify(tickvalues)=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
void Ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, real[] Ticks, real[] ticks=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
void Ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>);
real zerotickfuzz;
-void xaxis(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, real xmin=<default>, real xmax=<default>, pen p=<default>, void ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, bool above=<default>);
void drawtick(frame f, transform T, path g, path g2, ticklocate locate, real val, real Size, int sign, pen p, bool extend);
pair ticklabelshift(pair align, pen p=<default>);
+void xaxis(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, real xmin=<default>, real xmax=<default>, pen p=<default>, void ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, bool above=<default>);
string DefaultFormat(real);
string Format(real)(string s=<default>);
real upscale(real b, real a);
@@ -3004,12 +2898,9 @@ scaleT Linear(bool automin=<default>, bool automax=<default>, real s=<default>,
bool axiscoverage(int N, transform T, path g, ticklocate locate, real Step, pair side, int sign, real Size, Label F, string ticklabel(real), real norm, real limit);
void errorbar(picture pic, pair z, pair dp, pair dm, pen p=<default>, real size=<default>);
real linear(real)(real S(real x)=<default>, real Min, real Max);
-void yaxisAt(picture pic=<default>, Label L=<default>, void axis(picture, axisT), real ymin=<default>, real ymax=<default>, pen p=<default>, void ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, bool above=<default>, bool opposite=<default>);
-int Max;
tickvalues NoZero(tickvalues);
autoscaleT defaultS;
-real ScaleX(picture pic=<default>, real x);
-int Value;
+real ScaleY(picture pic=<default>, real y);
void yequals(picture pic=<default>, Label L=<default>, real y, bool extend=<default>, real xmin=<default>, real xmax=<default>, pen p=<default>, void ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, bool above=<default>);
guide Spline(... guide[]);
bounds autoscale(real Min, real Max, scaleT scale=<default>);
@@ -3019,89 +2910,200 @@ void Right(picture, axisT);
void errorbars(picture pic=<default>, pair[] z, pair[] dp, pair[] dm=<default>, bool[] cond=<default>, pen p=<default>, real size=<default>);
void errorbars(picture pic=<default>, real[] x, real[] y, real[] dpx, real[] dpy, real[] dmx=<default>, real[] dmy=<default>, bool[] cond=<default>, pen p=<default>, real size=<default>);
void errorbars(picture pic=<default>, real[] x, real[] y, real[] dpy, bool[] cond=<default>, pen p=<default>, real size=<default>);
-void BottomTop(picture, axisT)(bool extend=<default>);
-void BottomTop(picture, axisT);
-void LeftRight(picture, axisT)(bool extend=<default>);
-void LeftRight(picture, axisT);
+void XZero(picture, axisT)(bool extend=<default>);
+void XZero(picture, axisT);
void labelaxis(frame f, transform T, Label L, path g, ticklocate locate=<default>, int sign=<default>, bool ticklabels=<default>);
path Circle(pair c, real r, int n=<default>);
+void xaxisAt(picture pic=<default>, Label L=<default>, void axis(picture, axisT), real xmin=<default>, real xmax=<default>, pen p=<default>, void ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, bool above=<default>, bool opposite=<default>);
+real ytrans(transform t, real y);
string LogFormat(real)(int base);
string LogFormat(real);
+tickvalues OmitTickIntervals(tickvalues)(real[] a, real[] b);
void checkconditionlength(int x, int y);
+pair zero(real);
+void label(picture pic, Label L, pair z, real x, align align, string format, pen p);
pair tickMin(picture pic);
-tickvalues OmitTickInterval(tickvalues)(real a, real b);
tickvalues generateticks(int sign, Label F=<default>, string ticklabel(real)=<default>, int N, int n=<default>, real Step=<default>, real step=<default>, real Size=<default>, real size=<default>, transform T, pair side, path g, real limit, pen p, ticklocate locate, int[] divisor, bool opposite);
int Both;
ticklocate ticklocate(real a, real b, autoscaleT S=<default>, real tickmin=<default>, real tickmax=<default>, real time(real)=<default>, pair dir(real)=<default>);
-pair zero(real);
-void label(picture pic, Label L, pair z, real x, align align, string format, pen p);
+int Max;
scaleT Logarithmic;
-real ScaleY(picture pic=<default>, real y);
string NoZeroFormat(real);
string trailingzero;
+path[] segment(pair[] z, bool[] cond, guide join(... guide[])=<default>);
picture vectorfield(path vector(real), path g, int n, bool truesize=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>);
picture vectorfield(path vector(pair), pair a, pair b, int nx=<default>, int ny=<default>, bool truesize=<default>, real maxlength=<default>, bool cond(pair z)=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>);
void Top(picture, axisT)(bool extend=<default>);
void Top(picture, axisT);
-void yaxis(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, real ymin=<default>, real ymax=<default>, pen p=<default>, void ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, bool above=<default>, bool autorotate=<default>);
scientific operator init();
bounds operator init();
ticklocate operator init();
locateT operator init();
tickvalues operator init();
axisT operator init();
-real ytrans(transform t, real y);
+void yaxis(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, real ymin=<default>, real ymax=<default>, pen p=<default>, void ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, bool above=<default>, bool autorotate=<default>);
+real ScaleX(picture pic=<default>, real x);
+pair tickMax(picture pic);
+real xtrans(transform t, real x);
void LeftTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, tickvalues modify(tickvalues)=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
void LeftTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, real[] Ticks, real[] ticks=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
void LeftTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>);
pair Scale(picture pic=<default>, pair z);
-void ytick(picture pic=<default>, explicit pair z, pair dir=<default>, real size=<default>, pen p=<default>);
-void ytick(picture pic=<default>, real y, pair dir=<default>, real size=<default>, pen p=<default>);
-void ytick(picture pic=<default>, Label L, explicit pair z, pair dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
-void ytick(picture pic=<default>, Label L, real y, pair dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
+tickvalues None(tickvalues v);
real maxlength(pair a, pair b, int nx, int ny);
-void XZero(picture, axisT)(bool extend=<default>);
-void XZero(picture, axisT);
+scaleT BrokenLog(real a, real b, bool automin=<default>, bool automax=<default>);
void xequals(picture pic=<default>, Label L=<default>, real x, bool extend=<default>, real ymin=<default>, real ymax=<default>, pen p=<default>, void ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, bool above=<default>);
scaleT Log;
scaleT Log(bool automin=<default>, bool automax=<default>);
-real xtrans(transform t, real x);
string signedtrailingzero;
-scaleT BrokenLog(real a, real b, bool automin=<default>, bool automax=<default>);
-pair tickMax(picture pic);
-tickvalues OmitTick(tickvalues)(... real[] x);
+string baselinetemplate;
void xlimits(picture pic=<default>, real min=<default>, real max=<default>, bool crop=<default>);
void scale(picture pic=<default>, scaleT x, scaleT y=<default>, scaleT z=<default>);
void scale(picture pic=<default>, bool xautoscale=<default>, bool yautoscale=<default>, bool zautoscale=<default>);
+int Value;
+void BottomTop(picture, axisT)(bool extend=<default>);
+void BottomTop(picture, axisT);
void Bottom(picture, axisT)(bool extend=<default>);
void Bottom(picture, axisT);
+tickvalues OmitTick(tickvalues)(... real[] x);
void xtick(picture pic=<default>, explicit pair z, pair dir=<default>, real size=<default>, pen p=<default>);
void xtick(picture pic=<default>, real x, pair dir=<default>, real size=<default>, pen p=<default>);
void xtick(picture pic=<default>, Label L, explicit pair z, pair dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
void xtick(picture pic=<default>, Label L, real x, pair dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
+void axes(picture pic=<default>, Label xlabel=<default>, Label ylabel=<default>, bool extend=<default>, pair min=<default>, pair max=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, bool above=<default>);
string autoformat(string format=<default>, real norm ... real[] a);
-string baselinetemplate;
-path[] segment(pair[] z, bool[] cond, guide join(... guide[])=<default>);
+void ytick(picture pic=<default>, explicit pair z, pair dir=<default>, real size=<default>, pen p=<default>);
+void ytick(picture pic=<default>, real y, pair dir=<default>, real size=<default>, pen p=<default>);
+void ytick(picture pic=<default>, Label L, explicit pair z, pair dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
+void ytick(picture pic=<default>, Label L, real y, pair dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
guide Straight(... guide[]);
scaleT Broken(real a, real b, bool automin=<default>, bool automax=<default>);
axisT axis;
void axis(picture pic=<default>, Label L=<default>, path g, path g2=<default>, pen p=<default>, void ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>), ticklocate locate, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, int[] divisor=<default>, bool above=<default>, bool opposite=<default>);
string DefaultLogFormat(real)(int base);
string DefaultLogFormat(real);
-void crop(picture pic=<default>);
-tickvalues None(tickvalues v);
-void axes(picture pic=<default>, Label xlabel=<default>, Label ylabel=<default>, bool extend=<default>, pair min=<default>, pair max=<default>, pen p=<default>, bool arrow(picture, path, pen, marginT(path, pen))=<default>, marginT margin(path, pen)=<default>, bool above=<default>);
string OmitFormat(real)(string s=<default> ... real[] x);
+void labelz(picture pic=<default>, Label L=<default>, triple v, align align=<default>, string format=<default>, pen p=<default>);
+void labelx3(picture pic=<default>, Label L=<default>, real x, align align=<default>, string format=<default>, pen p=<default>);
+void ztick3(picture pic=<default>, real z, triple dir=<default>, real size=<default>, pen p=<default>);
+void ztick3(picture pic=<default>, Label L, real z, triple dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
+void ztick(picture pic=<default>, triple v, triple dir=<default>, real size=<default>, pen p=<default>);
+void ztick(picture pic=<default>, Label L, triple v, triple dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
+void ytick3(picture pic=<default>, real y, triple dir=<default>, real size=<default>, pen p=<default>);
+void ytick3(picture pic=<default>, Label L, real y, triple dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
+void zaxis3(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, real zmin=<default>, real zmax=<default>, pen p=<default>, void ticks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, bool above=<default>);
+void autoscale3(picture pic=<default>, void axis(picture, axisT));
+void zaxis3At(picture pic=<default>, Label L=<default>, void axis(picture, axisT), real zmin=<default>, real zmax=<default>, pen p=<default>, void ticks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, bool above=<default>, bool opposite=<default>, bool opposite2=<default>, bool primary=<default>);
+void yaxis3At(picture pic=<default>, Label L=<default>, void axis(picture, axisT), real ymin=<default>, real ymax=<default>, pen p=<default>, void ticks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, bool above=<default>, bool opposite=<default>, bool opposite2=<default>, bool primary=<default>);
+void xaxis3At(picture pic=<default>, Label L=<default>, void axis(picture, axisT), real xmin=<default>, real xmax=<default>, pen p=<default>, void ticks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, bool above=<default>, bool opposite=<default>, bool opposite2=<default>, bool primary=<default>);
+triple defaultdir(triple X, triple Y, triple Z, bool opposite=<default>, projection P);
+real ztrans(real[][] t, real z);
+void XYZero(picture, axisT)(triple align=<default>, bool extend=<default>);
+void XYZero(picture, axisT);
+void YZZero(picture, axisT)(triple align=<default>, bool extend=<default>);
+void YZZero(picture, axisT);
+void XZEquals(picture, axisT)(real x, real z, triple align=<default>, bool extend=<default>);
+void YZEquals(picture, axisT)(real y, real z, triple align=<default>, bool extend=<default>);
+void Bounds(picture, axisT)(int type=<default>, int type2=<default>, triple align=<default>, bool extend=<default>);
+void Bounds(picture, axisT);
+void InTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, tickvalues modify(tickvalues)=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
+void InTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, real[] Ticks, real[] ticks=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
+void InTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>);
+void NoTicks3(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)();
+void NoTicks3(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>);
+void Ticks3(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)(int sign, Label F=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, real[] Ticks=<default>, real[] ticks=<default>, int N=<default>, bool begin=<default>, bool end=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
+void Ticks3(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)(int sign, Label F=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, tickvalues modify(tickvalues)=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
+surface bispline(real[][] z, real[][] p, real[][] q, real[][] r, real[] x, real[] y, bool[][] cond=<default>);
+void axes3(picture pic=<default>, Label xlabel=<default>, Label ylabel=<default>, Label zlabel=<default>, bool extend=<default>, triple min=<default>, triple max=<default>, pen p=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>);
+bool vperiodic(triple[][] a);
+void xtick3(picture pic=<default>, real x, triple dir=<default>, real size=<default>, pen p=<default>);
+void xtick3(picture pic=<default>, Label L, real x, triple dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
+bool uperiodic(triple[][] a);
+void yaxis3(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, real ymin=<default>, real ymax=<default>, pen p=<default>, void ticks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, bool above=<default>);
+void OutTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, tickvalues modify(tickvalues)=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
+void OutTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, real[] Ticks, real[] ticks=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
+void OutTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>);
+triple tickMin3(picture pic);
+void axis(picture pic=<default>, Label L=<default>, path3 g, path3 g2=<default>, pen p=<default>, void ticks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>), ticklocate locate, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, int[] divisor=<default>, bool above=<default>, bool opposite=<default>);
+void labely3(picture pic=<default>, Label L=<default>, real y, align align=<default>, string format=<default>, pen p=<default>);
+void(flatguide3)[][] lift(real f(real x, real y), guide[][] g, void join(flatguide3)(... void(flatguide3)[])=<default>);
+void(flatguide3)[][] lift(real f(pair z), guide[][] g, void join(flatguide3)(... void(flatguide3)[])=<default>);
+void ytick(picture pic=<default>, triple v, triple dir=<default>, real size=<default>, pen p=<default>);
+void ytick(picture pic=<default>, Label L, triple v, triple dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
+real xtrans(real[][] t, real x);
+real maxlength(triple f(pair z), pair a, pair b, int nu, int nv);
+locateT operator init();
+triple Dir(real)(triple dir);
+void draw(picture pic=<default>, Label[] L=<default>, void(flatguide3)[][] g, pen[] p, light light=<default>, string name=<default>, render render=<default>, interaction interaction=<default>);
+void draw(picture pic=<default>, Label[] L=<default>, void(flatguide3)[][] g, pen p=<default>, light light=<default>, string name=<default>, render render=<default>, interaction interaction=<default>);
+void xtick(picture pic=<default>, triple v, triple dir=<default>, real size=<default>, pen p=<default>);
+void xtick(picture pic=<default>, Label L, triple v, triple dir=<default>, string format=<default>, real size=<default>, pen p=<default>);
+picture vectorfield(path3 vector(pair v), triple f(pair z), pair a, pair b, int nu=<default>, int nv=<default>, bool truesize=<default>, real maxlength=<default>, bool cond(pair z)=<default>, pen p=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, string name=<default>, render render=<default>);
+path3[] segment(triple[] v, bool[] cond, void join(flatguide3)(... void(flatguide3)[])=<default>);
+void xaxis3(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, real xmin=<default>, real xmax=<default>, pen p=<default>, void ticks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)=<default>, bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, marginT3 margin(path3, pen)=<default>, bool above=<default>);
+void label(picture pic, Label L, triple v, real x, align align, string format, pen p);
+ticklocate ticklocate(real a, real b, autoscaleT S=<default>, real tickmin=<default>, real tickmax=<default>, real time(real)=<default>, triple dir(real));
+void XZZero(picture, axisT)(triple align=<default>, bool extend=<default>);
+void XZZero(picture, axisT);
+void Straight(flatguide3)(... void(flatguide3)[]);
+triple tickMax3(picture pic);
+real ytrans(real[][] t, real y);
+path3 Circle(triple c, real r, triple normal=<default>, int n=<default>);
+void labelaxis(picture pic, real[][] T, Label L, path3 g, ticklocate locate=<default>, int sign=<default>, bool ticklabels=<default>);
+void XYEquals(picture, axisT)(real x, real y, triple align=<default>, bool extend=<default>);
+real ScaleZ(picture pic=<default>, real z);
+void Spline(flatguide3)(... void(flatguide3)[]);
+void labelz3(picture pic=<default>, Label L=<default>, real z, align align=<default>, string format=<default>, pen p=<default>);
+void graph(flatguide3)(triple F(real), real, real, int)(void join(flatguide3)(... void(flatguide3)[]));
+void(flatguide3)[] graph(triple F(real), real, real, int)(void join(flatguide3)(... void(flatguide3)[]), bool3 cond(real));
+void graph(flatguide3)(picture pic=<default>, real x(real), real y(real), real z(real), real a, real b, int n=<default>, void join(flatguide3)(... void(flatguide3)[])=<default>);
+void(flatguide3)[] graph(picture pic=<default>, real x(real), real y(real), real z(real), real a, real b, int n=<default>, bool3 cond(real), void join(flatguide3)(... void(flatguide3)[])=<default>);
+void graph(flatguide3)(picture pic=<default>, triple v(real), real a, real b, int n=<default>, void join(flatguide3)(... void(flatguide3)[])=<default>);
+void(flatguide3)[] graph(picture pic=<default>, triple v(real), real a, real b, int n=<default>, bool3 cond(real), void join(flatguide3)(... void(flatguide3)[])=<default>);
+void graph(flatguide3)(picture pic=<default>, triple[] v, void join(flatguide3)(... void(flatguide3)[])=<default>);
+void(flatguide3)[] graph(picture pic=<default>, triple[] v, bool3[] cond, void join(flatguide3)(... void(flatguide3)[])=<default>);
+void graph(flatguide3)(picture pic=<default>, real[] x, real[] y, real[] z, void join(flatguide3)(... void(flatguide3)[])=<default>);
+void(flatguide3)[] graph(picture pic=<default>, real[] x, real[] y, real[] z, bool3[] cond, void join(flatguide3)(... void(flatguide3)[])=<default>);
+void graph(flatguide3)(triple F(path, real), path p, int n=<default>, void join(flatguide3)(... void(flatguide3)[])=<default>);
+void graph(flatguide3)(triple F(pair), path p, int n=<default>, void join(flatguide3)(... void(flatguide3)[])=<default>);
+void graph(flatguide3)(picture pic=<default>, real f(pair), path p, int n=<default>, void join(flatguide3)(... void(flatguide3)[])=<default>);
+void graph(flatguide3)(real f(pair), path p, int n=<default>, real T(pair), void join(flatguide3)(... void(flatguide3)[])=<default>);
+path3 Arc(triple c, triple v1, triple v2, triple normal=<default>, bool direction=<default>, int n=<default>);
+path3 Arc(triple c, real r, real theta1, real phi1, real theta2, real phi2, triple normal=<default>, bool direction, int n=<default>);
+path3 Arc(triple c, real r, real theta1, real phi1, real theta2, real phi2, triple normal=<default>, int n=<default>);
+void labeltick(picture pic, real[][] T, path3 g, ticklocate locate, real val, int sign, real Size, string ticklabel(real), Label F, real norm=<default>);
+void labelx(picture pic=<default>, Label L=<default>, triple v, align align=<default>, string format=<default>, pen p=<default>);
+void labely(picture pic=<default>, Label L=<default>, triple v, align align=<default>, string format=<default>, pen p=<default>);
+void drawtick(picture pic, real[][] T, path3 g, path3 g2, ticklocate locate, real val, real Size, int sign, pen p, bool extend);
+triple Scale(picture pic=<default>, triple v);
+void tick(picture pic=<default>, triple v, triple dir, real size=<default>, pen p=<default>);
+void tick(picture pic=<default>, Label L, real value, triple v, triple dir, string format=<default>, real size=<default>, pen p=<default>);
+void polargraph(flatguide3)(real r(real, real), real theta(real), real phi(real), int n=<default>, void join(flatguide3)(... void(flatguide3)[])=<default>);
+triple ticklabelshift(triple align, pen p=<default>);
+triple polar(real r, real theta, real phi);
+void limits(picture pic=<default>, triple min, triple max);
+void InOutTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, tickvalues modify(tickvalues)=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
+void InOutTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, real[] Ticks, real[] ticks=<default>, real Size=<default>, real size=<default>, bool extend=<default>, pen pTick=<default>, pen ptick=<default>);
+void InOutTicks(picture, real[][], Label, path3, path3, pen, bool(picture, path3, material, marginT3(path3, pen), light, light), marginT3(path3, pen), ticklocate, int[], bool opposite=<default>, bool primary=<default>);
+surface surface(triple[][] f, bool[][] cond=<default>);
+surface surface(real[][] f, real[] x, real[] y, real[] xsplinetype(real[], real[])=<default>, real[] ysplinetype(real[], real[])=<default>, bool[][] cond=<default>);
+surface surface(real[][] f, pair a, pair b, real[] xsplinetype(real[], real[]), real[] ysplinetype(real[], real[])=<default>, bool[][] cond=<default>);
+surface surface(real[][] f, pair a, pair b, bool[][] cond=<default>);
+surface surface(triple f(pair z), pair a, pair b, int nu=<default>, int nv=<default>, bool cond(pair z)=<default>);
+surface surface(triple f(pair z), pair a, pair b, int nu=<default>, int nv=<default>, real[](real[], real[])[] usplinetype, real[](real[], real[])[] vsplinetype=<default>, bool cond(pair z)=<default>);
+surface surface(real f(pair z), pair a, pair b, int nx=<default>, int ny=<default>, bool cond(pair z)=<default>);
+surface surface(real f(pair z), pair a, pair b, int nx=<default>, int ny=<default>, real[] xsplinetype(real[], real[]), real[] ysplinetype(real[], real[])=<default>, bool cond(pair z)=<default>);
+void zlimits(picture pic=<default>, real min=<default>, real max=<default>, bool crop=<default>);
real axiscoverage;
real Ticksize;
real ticksize;
int nmesh;
int nCircle;
real epsilon;
-real ylabelwidth;
-int ngraph;
real axislabelfactor;
bool NoCrop;
+real ylabelwidth;
+int ngraph;
bool Crop;
guide hermite(real[] x, real[] y, real[] splinetype(real[], real[])=<default>);
real[] monotonic(real[] x, real[] y);
@@ -3113,79 +3115,79 @@ real[] Spline(real[] x, real[] y);
real[](real[], real[])[] Spline;
real[] notaknot(real[] x, real[] y);
real[] periodic(real[] x, real[] y);
-void checklengths(int x, int y, string text=<default>);
real[] natural(real[] x, real[] y);
+void checklengths(int x, int y, string text=<default>);
void checkincreasing(real[] x);
+position middle;
grid3(picture pic)[] YX_YZgrid(position posa=<default>, position posb=<default>);
grid3(picture pic)[] YX_YZgrid;
grid3(picture pic)[] YZYgrid(position pos=<default>);
grid3(picture pic)[] YZYgrid;
-grid3(picture pic)[] XZXgrid(position pos=<default>);
-grid3(picture pic)[] XZXgrid;
grid3(picture pic)[] ZXZgrid(position pos=<default>);
grid3(picture pic)[] ZXZgrid;
grid3 ZYgrid(picture pic)(position pos=<default>);
grid3 ZYgrid(picture pic);
-grid3 YZgrid(picture pic)(position pos=<default>);
-grid3 YZgrid(picture pic);
grid3 ZXgrid(picture pic)(position pos=<default>);
grid3 ZXgrid(picture pic);
-grid3 XZgrid(picture pic)(position pos=<default>);
-grid3 XZgrid(picture pic);
grid3 YXgrid(picture pic)(position pos=<default>);
grid3 YXgrid(picture pic);
grid3 XYgrid(picture pic)(position pos=<default>);
grid3 XYgrid(picture pic);
ticksgridT InTicks()(Label F=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, real Size=<default>, real size=<default>, pen pTick=<default>, pen ptick=<default>, grid3(picture pic)[][] gridroutine, pen pGrid=<default>, pen pgrid=<default>);
-void xaxis3(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, pen p=<default>, ticksgridT ticks(), bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, bool above=<default>);
+grid3 YZgrid(picture pic)(position pos=<default>);
+grid3 YZgrid(picture pic);
+grid3(picture pic)[][] XYZgrid(position pos=<default>);
+grid3(picture pic)[][] XYZgrid;
grid3(picture pic)[] YXYgrid(position pos=<default>);
grid3(picture pic)[] YXYgrid;
grid3(picture pic)[] ZX_ZYgrid(position posa=<default>, position posb=<default>);
grid3(picture pic)[] ZX_ZYgrid;
-void yaxis3(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, pen p=<default>, ticksgridT ticks(), bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, bool above=<default>);
-position middle;
-triple X(picture pic);
-triple ZX(picture pic);
+ticksgridT OutTicks()(Label F=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, real Size=<default>, real size=<default>, pen pTick=<default>, pen ptick=<default>, grid3(picture pic)[][] gridroutine, pen pGrid=<default>, pen pgrid=<default>);
position top;
-grid3 operator init();
-ticksgridT operator init();
+triple ZX(picture pic);
+triple X(picture pic);
triple Y(picture pic);
grid3(picture pic)[] operator cast(grid3 gridroutine(picture pic));
grid3(picture pic)[][] operator cast(grid3(picture pic)[] gridroutine);
grid3(picture pic)[][] operator cast(grid3 gridroutine(picture pic));
-void zaxis3(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, pen p=<default>, ticksgridT ticks(), bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, bool above=<default>);
+grid3 operator init();
+ticksgridT operator init();
position bottom;
void grid3(picture pic=<default>, grid3(picture pic)[][] gridroutine=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, pen pGrid=<default>, pen pgrid=<default>, bool above=<default>);
void grid3(picture pic=<default>, grid3(picture pic)[][] gridroutine, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, pen[] pGrid, pen[] pgrid, bool above=<default>);
-ticksgridT OutTicks()(Label F=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, real Size=<default>, real size=<default>, pen pTick=<default>, pen ptick=<default>, grid3(picture pic)[][] gridroutine, pen pGrid=<default>, pen pgrid=<default>);
grid3(picture pic)[] XY_XZgrid(position posa=<default>, position posb=<default>);
grid3(picture pic)[] XY_XZgrid;
+grid3 XZgrid(picture pic)(position pos=<default>);
+grid3 XZgrid(picture pic);
grid3(picture pic)[] ZYZgrid(position pos=<default>);
grid3(picture pic)[] ZYZgrid;
grid3(picture pic)[] XYXgrid(position pos=<default>);
grid3(picture pic)[] XYXgrid;
-grid3(picture pic)[][] XYZgrid(position pos=<default>);
-grid3(picture pic)[][] XYZgrid;
ticksgridT InOutTicks()(Label F=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, bool begin=<default>, bool end=<default>, real Size=<default>, real size=<default>, pen pTick=<default>, pen ptick=<default>, grid3(picture pic)[][] gridroutine, pen pGrid=<default>, pen pgrid=<default>);
triple XY(picture pic);
+void xaxis3(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, pen p=<default>, ticksgridT ticks(), bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, bool above=<default>);
+void yaxis3(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, pen p=<default>, ticksgridT ticks(), bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, bool above=<default>);
+void zaxis3(picture pic=<default>, Label L=<default>, void axis(picture, axisT)=<default>, pen p=<default>, ticksgridT ticks(), bool arrow(picture, path3, material, marginT3(path3, pen), light, light)=<default>, bool above=<default>);
triple YZ(picture pic);
triple Z(picture pic);
+grid3(picture pic)[] XZXgrid(position pos=<default>);
+grid3(picture pic)[] XZXgrid;
real fspline(real)(real[] x, real[] y, real[] splinetype(real[], real[])=<default>);
-real pwhermite(real)(real[] x, real[] y, real[] dy);
real fhorner(real)(horner sh);
horner operator init();
horner hdiffdiv(real[] x, real[] y, real[] dy);
+real pwhermite(real)(real[] x, real[] y, real[] dy);
horner diffdiv(real[] x, real[] y);
-surface labelpath(string s, path3 p, real angle=<default>, triple optional=<default>);
-triple nextnormal(triple p, triple q);
-triple[] nextframe(path3 p, real reltimestart, triple[] start, real reltimeend, int subdiv=<default>);
-triple[] firstframe(path3 p, triple optional=<default>);
-real eps;
void labelpath(frame f, Label L, path g, string justify=<default>, pen p=<default>);
void labelpath(picture pic=<default>, Label L, path g, string justify=<default>, pen p=<default>);
string RightJustified;
string Centered;
string LeftJustified;
+surface labelpath(string s, path3 p, real angle=<default>, triple optional=<default>);
+triple nextnormal(triple p, triple q);
+triple[] nextframe(path3 p, real reltimestart, triple[] start, real reltimeend, int subdiv=<default>);
+triple[] firstframe(path3 p, triple optional=<default>);
+real eps;
FitControl defaultControl;
void lm_lmpar(int n, real[] r, int ldr, int[] ipvt, real[] diag, real[] qtb, real delta, lm_real_type par, real[] x, real[] sdiag, real[] wa1, real[] wa2);
void lm_qrfac(int m, int n, real[] a, bool pivot, int[] ipvt, real[] rdiag, real[] acnorm, real[] wa);
@@ -3237,10 +3239,10 @@ real tildemarksizefactor;
real circlemarkradius(pen p=<default>);
real markangleradiusfactor;
real markanglespacefactor;
-real stickmarksizefactor;
frame stickframe(int n=<default>, real size=<default>, pair space=<default>, real angle=<default>, pair offset=<default>, pen p=<default>);
frame stickframe;
frame circlebarframe(int n=<default>, real barsize=<default>, real radius=<default>, real angle=<default>, pair offset=<default>, pen p=<default>, filltype filltype=<default>, bool above=<default>);
+real stickmarksizefactor;
real stickmarksize(pen p=<default>);
real stickmarkspacefactor;
real stickmarkspace(pen p=<default>);
@@ -3277,6 +3279,10 @@ real sec(real x);
real csc(real x);
int quadrant(real degrees);
pair exp(explicit pair z);
+real intersect(pair p, pair q, pair z);
+real intersect(triple P, triple Q, triple n, triple Z);
+pair unityroot(int n, int k=<default>);
+string nopoint;
real cot(real x);
pair log(explicit pair z);
real[] zero(int n);
@@ -3284,28 +3290,25 @@ real[][] zero(int n, int m);
triple intersectionpoint(triple n0, triple P0, triple n1, triple P1);
real findroot(real f(real), real a, real b, real tolerance=<default>, real fa=<default>, real fb=<default>);
void drawline(picture pic=<default>, pair P, pair Q, pen p=<default>);
-rootfinder_settings operator init();
+int[][] segment(bool[] b);
real acot(real x);
-string nopoint;
-real intersect(pair p, pair q, pair z);
-real intersect(triple P, triple Q, triple n, triple Z);
-pair unityroot(int n, int k=<default>);
+rootfinder_settings operator init();
bool polygon(path p);
-bool increasing(real[] a, bool strict=<default>);
bool square(real[][] m);
-int[][] segment(bool[] b);
+bool increasing(real[] a, bool strict=<default>);
int[][] segmentlimits(bool[] b);
path cuttings;
path cutafter(path p, path q);
path cutbefore(path p, path q);
obj operator *(real[][] T, obj o);
-void draw(picture pic=<default>, obj o, light light=<default>);
obj operator init();
+void draw(picture pic=<default>, obj o, light light=<default>);
real[][] finiteDifferenceJacobian(real[] f(real[]), real[] t, real[] h=<default>);
solution integrate(real y, real c=<default>, real f(real t, real y), real a, real b=<default>, real h=<default>, int n=<default>, bool dynamic=<default>, real tolmin=<default>, real tolmax=<default>, real dtmin=<default>, real dtmax=<default>, RKTableau tableau, bool verbose=<default>);
Solution integrate(real[] y, real[] f(real t, real[] y), real a, real b=<default>, real h=<default>, int n=<default>, bool dynamic=<default>, real tolmin=<default>, real tolmax=<default>, real dtmin=<default>, real dtmax=<default>, RKTableau tableau, bool verbose=<default>);
real adjust(real h, real error, real tolmin, real tolmax, RKTableau tableau);
real error(real error, real initial, real lowOrder, real norm, real diff);
+RKTableau RK5F;
RKTableau RK5;
RKTableau RK4;
RKTableau RK3BS;
@@ -3317,11 +3320,12 @@ real[] Coeff;
real stepfactor;
real phi2(real x);
RKTableau RK5DP;
+real phi3(real x);
+void report(real old, real h, real t);
RKTableau E_PC;
RKTableau E_RK2;
-void report(real old, real h, real t);
RKTableau RK3;
-real phi3(real x);
+RKTableau PC;
coefficients operator init();
RKTableau operator init();
solution operator init();
@@ -3330,10 +3334,8 @@ void write(solution S);
void write(Solution S);
void expfactors(real x, coefficients a);
RKTableau E_RK3BS;
-real[] solveBVP(real[] f(real, real[]), real a, real b=<default>, real h=<default>, int n=<default>, bool dynamic=<default>, real tolmin=<default>, real tolmax=<default>, real dtmin=<default>, real dtmax=<default>, RKTableau tableau, bool verbose=<default>, real[] initial(real[]), real[] discrepancy(real[]), real[] guess, int iterations=<default>);
RKTableau Euler;
-RKTableau RK5F;
-RKTableau PC;
+real[] solveBVP(real[] f(real, real[]), real a, real b=<default>, real h=<default>, int n=<default>, bool dynamic=<default>, real tolmin=<default>, real tolmax=<default>, real dtmin=<default>, real dtmax=<default>, RKTableau tableau, bool verbose=<default>, real[] initial(real[]), real[] discrepancy(real[]), real[] guess, int iterations=<default>);
pen[] cmyk(pen[] Palette);
pen[] BWRainbow2(int NColors=<default>);
pen[] Wheel(int NColors=<default>);
@@ -3349,18 +3351,18 @@ bounds image(picture pic=<default>, pair[] z, real[] f, bounds range(picture pic
bounds image(picture pic=<default>, real[] x, real[] y, real[] f, bounds range(picture pic, real min, real max)=<default>, pen[] palette);
bounds Full(picture pic, real min, real max);
bounds Automatic(picture pic, real min, real max);
-bounds Range(picture pic, real min, real max)(bool automin=<default>, real min=<default>, bool automax=<default>, real max=<default>);
transform swap;
void NoTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(int sign=<default>);
pen[] Gradient(int NColors=<default> ... pen[] p);
pen[] quantize(pen[] Palette, int n);
+pen[] Rainbow(int NColors=<default>);
pen[] Grayscale(int NColors=<default>);
pen[] BWRainbow(int NColors, bool two);
pen[] BWRainbow(int NColors=<default>);
-pen[] Rainbow(int NColors=<default>);
pen[] palette(real[] f, pen[] palette);
pen[][] palette(real[][] f, pen[] palette);
void palette(picture pic=<default>, Label L=<default>, bounds bounds, pair initial, pair final, void axis(picture, axisT)=<default>, pen[] palette, pen p=<default>, void ticks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(int sign=<default>)=<default>, bool copy=<default>, bool antialias=<default>);
+bounds Range(picture pic, real min, real max)(bool automin=<default>, real min=<default>, bool automax=<default>, real max=<default>);
void PaletteTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(int sign=<default>)(Label format=<default>, string ticklabel(real)=<default>, bool beginlabel=<default>, bool endlabel=<default>, int N=<default>, int n=<default>, real Step=<default>, real step=<default>, pen pTick=<default>, pen ptick=<default>);
void PaletteTicks(frame, transform, Label, pair, path, path, pen, bool(picture, path, pen, marginT(path, pen)), marginT(path, pen), ticklocate, int[], bool opposite=<default>)(int sign=<default>);
picture crosshatch(real H=<default>, pen p=<default>);
@@ -3381,35 +3383,35 @@ bool operator >(rational r, rational s);
bool operator <(rational r, rational s);
rational operator /(rational r, rational s);
rational abs(rational r);
-bool operator >=(rational r, rational s);
int lcm(int m, int n);
-bool operator <=(rational r, rational s);
+bool operator >=(rational r, rational s);
rational operator +(rational r, rational s);
-int gcd(int m, int n);
+bool operator <=(rational r, rational s);
rational operator init();
rational min(rational a, rational b);
-rational operator -(rational r);
-rational operator -(rational r, rational s);
-rational max(rational a, rational b);
-rational max(rational[] a);
rational operator cast(int p);
rational[] operator cast(int[] a);
rational[][] operator cast(int[][] a);
void write(string s=<default>, rational r, void suffix(file)=<default>);
void write(string s=<default>, rational[] a, void suffix(file)=<default>);
void write(string s=<default>, rational[][] a, void suffix(file)=<default>);
+int gcd(int m, int n);
+bool operator !=(rational r, rational s);
bool operator ==(rational r, rational s);
bool[] operator ==(rational[] r, rational s);
bool operator ==(rational[] r, rational[] s);
bool operator ==(rational[][] r, rational[][] s);
+rational operator -(rational r);
+rational operator -(rational r, rational s);
+rational max(rational a, rational b);
+rational max(rational[] a);
real operator ecast(rational r);
rational operator *(rational r, rational s);
+simplex operator init();
path roundedpath(path A, real R, real S=<default>);
-real infinity;
-problem operator init();
+simplex operator init();
void bibliography(string name);
void subitem(string s, pen p=<default>);
-void item(string s, pen p=<default>, bool step=<default>);
void asyfilecode(bool center=<default>, string s, string options=<default>, string caption=<default>, pair align=<default>, pen p=<default>, pen figuremattpen=<default>, real indent=<default>, real skip=<default>, filltype filltype=<default>, bool newslide=<default>);
void asyfigure(string s, string options=<default>, string caption=<default>, pair align=<default>, pen p=<default>, pen figuremattpen=<default>, filltype filltype=<default>, bool newslide=<default>);
void filecode(bool center=<default>, string s, pen p=<default>, real indent=<default>, real skip=<default>, filltype filltype=<default>);
@@ -3429,14 +3431,13 @@ void remark(bool center=<default>, string s, pair align=<default>, pen p=<defaul
void outline(string s=<default>, pair position=<default>, pair align=<default>, pen p=<default>);
void erasestep(int erasenode);
bool checkposition();
-void nextpage(pen p=<default>);
void reversevideo();
void color(string name, string color);
bool empty();
void setpens(pen red=<default>, pen blue=<default>, pen steppen=<default>);
int preamblenodes;
-int page;
int[] firstnode;
+pair currentposition;
pair titlepageposition;
pen foregroundcolor;
pen backgroundcolor;
@@ -3458,47 +3459,49 @@ picture background;
void background();
real pageheight;
real pagewidth;
+bool allowstepping;
void indexedfigure(string prefix, int first, int last, string options=<default>, string caption=<default>, pair align=<default>, pen p=<default>, pen figuremattpen=<default>, bool step=<default>);
pen titlepen;
string bulletcolor(string color);
real minipagemargin;
+void item(string s, pen p=<default>, bool step=<default>);
void incrementposition(pair z);
-void equations(string s, pen p=<default>);
void newslide(bool stepping=<default>);
void center(string s, pen p=<default>);
real titleskip;
+void equations(string s, pen p=<default>);
+bool stepping;
pen steppagenumberpen;
+void currentexitfunction();
void step();
void multifigure(string[] slist, string options=<default>, string caption=<default>, pair align=<default>, pen p=<default>, pen figuremattpen=<default>, bool step=<default>);
pair startposition;
-pair currentposition;
void titlepage(string title, string author, string institution=<default>, string date=<default>, string url=<default>, bool newslide=<default>);
-bool allowstepping;
-void currentexitfunction();
void asycode(bool center=<default>, string s, string options=<default>, string caption=<default>, string preamble=<default>, pair align=<default>, pen p=<default>, pen figuremattpen=<default>, real indent=<default>, real skip=<default>, filltype filltype=<default>, bool newslide=<default>);
pen itempen;
string asywrite(string s, string preamble=<default>);
bool reverse;
void numberpage(pen p=<default>);
+pen authorpen;
bool firststep;
bool landscape;
+void nextpage(pen p=<default>);
void normalvideo();
-bool stepping;
real codeskip;
+bool itemstep;
real figureborder;
-pen urlpen;
string bullet;
-bool itemstep;
pen pagenumberpen;
+int[] lastnode;
+string texcolor(pen p);
+int page;
void usersetting();
real aboveequationskip;
real minipagewidth;
void bibliographystyle(string name);
real pagemargin;
-int[] lastnode;
-string texcolor(pen p);
+pen urlpen;
void title(string s, pair position=<default>, pair align=<default>, pen p=<default>, bool newslide=<default>);
-pen authorpen;
pair pagenumberalign;
bool havepagenumber;
void exitfunction();
@@ -3513,16 +3516,19 @@ evaluatedpoint[][][] slice(evaluatedpoint[][][] a, int start1, int end1, int sta
positionedvector[][] slice(positionedvector[][] a, int start1, int end1, int start2, int end2);
positionedvector[][][] slice(positionedvector[][][] a, int start1, int end1, int start2, int end2, int start3, int end3);
triple nGrad(triple)(real f(triple));
+patch[] quadpatches(path3 edgecycle, positionedvector[] corners, real f(triple), triple grad(triple), triple a, triple b, bool usetriangles);
bool checkpt(triple testpt, real f(triple), triple grad(triple), triple a, triple b);
bool checkptincube(triple pt, triple a, triple b);
bool check_fpt_zero(triple testpoint, real f(triple), triple grad(triple));
patch[] triangletoquads(path3 external, real f(triple), triple grad(triple), triple a, triple b);
triple normalout(int face);
+patch[] maketriangle(path3 external, real f(triple), triple grad(triple), bool allowsubdivide=<default>);
+path3 pathinface(positionedvector v1, positionedvector v2, triple facenorm, triple edge1normout, triple edge2normout);
+path3 pathinface(positionedvector v1, positionedvector v2, int face, int edge1face, int edge2face);
path3 bisector(path3 edgecycle, int[] savevertices);
triple projecttospan(triple toproject, triple v1, triple v2, real mincoeff=<default>);
int YHIGH;
int XHIGH;
-int NULL_VERTEX;
patch trianglewithnormals(path3 external, triple n1, triple n2, triple n3);
patch patchwithnormals(path3 external, triple[] u0normals, triple[] u1normals, triple[] v0normals, triple[] v1normals);
patch patchwithnormals(path3 external, triple normalat(triple));
@@ -3530,6 +3536,7 @@ real(real)[] bernstein;
real B23(real t);
real B13(real t);
real B03(real t);
+evaluatedpoint[][][] make3dgrid(triple a, triple b, int nx, int ny, int nz, real f(triple), bool allowzero=<default>);
bool operator ==(edge a, edge b);
pathwithnormals_settings operator init();
intset operator init();
@@ -3543,78 +3550,76 @@ string operator cast(edge[] edges);
string operator cast(positionedvector vv);
triple operator cast(evaluatedpoint p);
real B33(real t);
-real[] projecttospan_findcoeffs(triple toproject, triple v1, triple v2, bool warn=<default>);
+int NULL_VERTEX;
int ZLOW;
int YLOW;
+real[] projecttospan_findcoeffs(triple toproject, triple v1, triple v2, bool warn=<default>);
int ZHIGH;
real angledegrees(triple a, triple b);
path3 pathbetween(positionedvector v1, positionedvector v2);
path3 pathbetween(path3 edgecycle, int vertex1, int vertex2);
-patch[] maketriangle(path3 external, real f(triple), triple grad(triple), bool allowsubdivide=<default>);
-path3 pathinface(positionedvector v1, positionedvector v2, triple facenorm, triple edge1normout, triple edge2normout);
-path3 pathinface(positionedvector v1, positionedvector v2, int face, int edge1face, int edge2face);
-patch[] quadpatches(path3 edgecycle, positionedvector[] corners, real f(triple), triple grad(triple), triple a, triple b, bool usetriangles);
int XLOW;
-evaluatedpoint[][][] make3dgrid(triple a, triple b, int nx, int ny, int nz, real f(triple), bool allowzero=<default>);
int[] makecircle(edge[] edges);
path[] cylinder(path3 base, real h, triple axis=<default>, projection P);
revolution cylinder(triple c=<default>, real r, real h, triple axis=<default>);
path line(path p, path q, real[] t);
-pen defaultbackpen;
revolution cone(triple c=<default>, real r, real h, triple axis=<default>, int n=<default>);
revolution operator *(real[][] t, revolution r);
revolution sphere(triple c=<default>, real r, int n=<default>);
+void draw(picture pic=<default>, revolution r, int m=<default>, int n=<default>, pen frontpen=<default>, pen backpen=<default>, pen longitudinalpen=<default>, pen longitudinalbackpen=<default>, light light=<default>, string name=<default>, render render=<default>, projection P=<default>);
skeleton operator init();
revolution operator init();
-void draw(picture pic=<default>, revolution r, int m=<default>, int n=<default>, pen frontpen=<default>, pen backpen=<default>, pen longitudinalpen=<default>, pen longitudinalbackpen=<default>, light light=<default>, string name=<default>, render render=<default>, projection P=<default>);
real[] tangent(path p, path q, bool side);
+pen defaultbackpen;
surface surface(revolution r, int n=<default>, pen color(int i, real j)=<default>);
linefit leastsquares(real[] x, real[] y);
real Gaussrand();
-pair Gaussrandpair();
+void histogram(picture pic=<default>, real[] bins, real[] count, real low=<default>, pen fillpen=<default>, pen drawpen=<default>, bool bars=<default>, Label legend=<default>, real markersize=<default>);
+void histogram(picture pic=<default>, real[] data, real a, real b, int n, bool normalize=<default>, real low=<default>, pen fillpen=<default>, pen drawpen=<default>, bool bars=<default>, Label legend=<default>, real markersize=<default>);
int[] frequency(real[] data, real[] bins);
int[] frequency(real[] data, real a, real b, int n);
int[][] frequency(real[] x, real[] y, real[] xbins, real[] ybins);
int[][] frequency(real[] x, real[] y, pair a, pair b, int nx, int ny=<default>);
int[][] frequency(pair[] z, pair a, pair b, int nx, int ny=<default>);
real kurtosis(real[] A);
-real stdev(real[] A);
real variancebiased(real[] A);
real variance(real[] A);
real legendmarkersize;
+int bins(real[] data, int max=<default>);
real rms(real[] A);
-void histogram(picture pic=<default>, real[] bins, real[] count, real low=<default>, pen fillpen=<default>, pen drawpen=<default>, bool bars=<default>, Label legend=<default>, real markersize=<default>);
-void histogram(picture pic=<default>, real[] data, real a, real b, int n, bool normalize=<default>, real low=<default>, pen fillpen=<default>, pen drawpen=<default>, bool bars=<default>, Label legend=<default>, real markersize=<default>);
+pair Gaussrandpair();
real kurtosisexcess(real[] A);
+real Gaussian(real x, real sigma);
+real Gaussian(real x);
linefit operator init();
-int bins(real[] data, int max=<default>);
real skewness(real[] A);
path topbox(pair a, pair b);
-real Gaussian(real x, real sigma);
-real Gaussian(real x);
path halfbox(pair a, pair b);
real mean(real[] A);
+real stdev(real[] A);
Relation r4a;
picture tableau(frame[] cards, bool number=<default>);
-Braid apply(Relation r, Braid b, int step, int place);
Component wye;
Component phi;
Component bm;
real gapfactor;
+real hwratio;
Component bp;
-pair min(pair[] z);
pair[] endpoints(guide[] a);
+Relation operator -(Relation r);
+pair max(pair[] z);
+Relation r4b;
Component operator init();
Braid operator init();
Relation operator init();
Syzygy operator init();
-Relation r4b;
-Relation operator -(Relation r);
-pair max(pair[] z);
-real hwratio;
+pair min(pair[] z);
+Braid apply(Relation r, Braid b, int step, int place);
Relation r3;
+pen Gray;
pen Tan;
pen Brown;
+pen Sepia;
pen OliveGreen;
pen SeaGreen;
pen JungleGreen;
@@ -3625,16 +3630,17 @@ pen BlueViolet;
pen RoyalPurple;
pen Plum;
pen DarkOrchid;
+pen Thistle;
pen Lavender;
pen Fuchsia;
pen Rhodamine;
+pen VioletRed;
pen CarnationPink;
-pen Gray;
pen Salmon;
+pen WildStrawberry;
pen RubineRed;
pen OrangeRed;
pen BrickRed;
-pen Maroon;
pen Mahogany;
pen BurntOrange;
pen Melon;
@@ -3643,49 +3649,46 @@ pen Goldenrod;
pen GreenYellow;
pen Peach;
pen SkyBlue;
-pen VioletRed;
pen Cerulean;
pen White;
pen Yellow;
+pen YellowGreen;
pen PineGreen;
pen Violet;
pen RedViolet;
pen Red;
pen Magenta;
-pen TealBlue;
pen Turquoise;
-pen MidnightBlue;
pen ProcessBlue;
-pen Emerald;
+pen Orchid;
+pen YellowOrange;
pen Black;
pen Bittersweet;
pen ForestGreen;
pen Aquamarine;
pen RawSienna;
-pen Thistle;
+pen Emerald;
pen SpringGreen;
pen Periwinkle;
pen LimeGreen;
-pen Orchid;
-pen YellowGreen;
-pen Sepia;
+pen MidnightBlue;
pen Mulberry;
pen Cyan;
pen Blue;
+pen Maroon;
pen Orange;
pen CornflowerBlue;
-pen WildStrawberry;
+pen TealBlue;
pen RedOrange;
pen RoyalBlue;
pen Apricot;
pen Purple;
-pen YellowOrange;
pen Green;
int lookup(tree t, int key);
bool contains(tree t, int key);
tree operator init();
-tree add(tree t, int key, int value);
void write(file out=<default>, tree t);
+tree add(tree t, int key, int value);
tree newtree();
real trembleFrequency;
real trembleFuzz();
@@ -3694,12 +3697,12 @@ tremble operator init();
real trembleRandom;
real trembleAngle;
real degrees(rmf a, rmf b);
-surface tube(path3 g, coloredpath section, transform T(real)=<default>, real corner=<default>, real relstep=<default>);
path3 roundedpath(path3 A, real r);
int coloredNodes;
-coloredpath operator init();
coloredpath operator cast(path p);
coloredpath operator cast(guide p);
+coloredpath operator init();
+surface tube(path3 g, coloredpath section, transform T(real)=<default>, real corner=<default>, real relstep=<default>);
surface surface(rmf[] R, real[] t, coloredpath cp, transform T(real), bool cyclic);
int coloredSegments;
real[] sample(path3 g, real r, real relstep=<default>);
@@ -3709,10 +3712,12 @@ pen Tan;
pen Snow;
pen Sienna;
pen SeaGreen;
+pen Salmon;
pen RosyBrown;
pen PowderBlue;
pen Plum;
pen Pink;
+pen PeachPuff;
pen PaleVioletRed;
pen PaleTurquoise;
pen OrangeRed;
@@ -3722,7 +3727,6 @@ pen NavajoWhite;
pen Moccasin;
pen MistyRose;
pen MintCream;
-pen Maroon;
pen LightYellow;
pen LightSlateGray;
pen LightSkyBlue;
@@ -3736,7 +3740,6 @@ pen Khaki;
pen HotPink;
pen Honeydew;
pen GreenYellow;
-pen Salmon;
pen SaddleBrown;
pen Gray;
pen IndianRed;
@@ -3744,18 +3747,17 @@ pen Goldenrod;
pen Fuchsia;
pen DimGray;
pen DeepSkyBlue;
+pen Thistle;
pen DeepPink;
+pen DarkTurquoise;
pen DarkSlateGray;
pen DarkSalmon;
pen DarkOrchid;
-pen DarkOrange;
-pen DarkOliveGreen;
pen DarkMagenta;
pen DarkGreen;
pen DarkGoldenrod;
pen DarkBlue;
pen Crimson;
-pen Cornsilk;
pen Coral;
pen PapayaWhip;
pen CadetBlue;
@@ -3765,83 +3767,84 @@ pen Brown;
pen BlueViolet;
pen Beige;
pen Azure;
-pen SlateBlue;
+pen Aqua;
+pen Indigo;
pen OliveDrab;
pen DarkKhaki;
pen Peru;
-pen PeachPuff;
-pen Lime;
+pen WhiteSmoke;
pen LightGoldenrodYellow;
pen DarkSeaGreen;
+pen MidnightBlue;
pen White;
pen Yellow;
+pen YellowGreen;
+pen Seashell;
pen LightCyan;
-pen GhostWhite;
+pen Ivory;
pen Red;
pen Magenta;
pen LightSeaGreen;
pen DarkViolet;
-pen Orchid;
pen Turquoise;
-pen MidnightBlue;
-pen WhiteSmoke;
+pen AntiqueWhite;
+pen Orchid;
+pen Bisque;
+pen DarkOliveGreen;
pen PaleGreen;
+pen LightGrey;
pen PaleGoldenrod;
+pen Wheat;
pen Black;
+pen SlateBlue;
pen SkyBlue;
pen LightBlue;
-pen Bisque;
pen ForestGreen;
-pen LightGrey;
pen AliceBlue;
pen Aquamarine;
-pen SandyBrown;
-pen LavenderBlush;
-pen Thistle;
pen MediumVioletRed;
+pen SandyBrown;
+pen SpringGreen;
pen FloralWhite;
-pen DarkSlateBlue;
-pen SlateGray;
-pen Ivory;
-pen BlanchedAlmond;
pen Linen;
pen Olive;
-pen SpringGreen;
+pen BlanchedAlmond;
+pen MediumSpringGreen;
pen LimeGreen;
pen FireBrick;
pen Gold;
-pen AntiqueWhite;
-pen YellowGreen;
-pen MediumSpringGreen;
-pen SteelBlue;
-pen Aqua;
-pen Violet;
+pen Maroon;
+pen GhostWhite;
pen rgbint(int r, int g, int b);
pen Cyan;
-pen Teal;
pen Blue;
+pen Teal;
pen MediumBlue;
+pen Violet;
pen Chartreuse;
-pen Wheat;
+pen DarkSlateBlue;
+pen SlateGray;
+pen Lime;
pen Orange;
-pen Seashell;
-pen DarkGray;
pen CornflowerBlue;
+pen Silver;
+pen DarkGray;
pen MediumOrchid;
pen Chocolate;
+pen LavenderBlush;
pen MediumPurple;
+pen DarkOrange;
pen DodgerBlue;
pen DarkRed;
pen DarkCyan;
-pen MediumSeaGreen;
pen MediumSlateBlue;
+pen MediumSeaGreen;
+pen SteelBlue;
pen RoyalBlue;
-pen Silver;
pen MediumAquamarine;
-pen Indigo;
pen Purple;
pen MediumTurquoise;
-pen DarkTurquoise;
pen LightSteelBlue;
pen Green;
pen Gainsboro;
+pen Cornsilk;
diff --git a/Build/source/utils/asymptote/asymptote.nsi b/Build/source/utils/asymptote/asymptote.nsi
index 9f75c70cdce..c9afcdb8b4a 100644
--- a/Build/source/utils/asymptote/asymptote.nsi
+++ b/Build/source/utils/asymptote/asymptote.nsi
@@ -14,7 +14,6 @@ XPStyle On
; MUI 1.67 compatible ------
!include "MUI.nsh"
!include "LogicLib.nsh"
-!include "EnvVarUpdate.nsh"
!include "lnkX64IconFix.nsh"
; MUI Settings
@@ -72,7 +71,6 @@ ShowUnInstDetails show
Section "Asymptote" SEC01
SetOutPath "$INSTDIR"
- ${EnvVarUpdate} $0 "PATH" "A" "HKLM" "$INSTDIR"
SetOverwrite try
File /r build-${PRODUCT_VERSION}\*
@@ -112,8 +110,8 @@ Section "Asymptote" SEC01
${lnkX64IconFix} "$SMPROGRAMS\$ICONS_GROUP\Asymptote.lnk"
CreateShortCut "$DESKTOP\Asymptote.lnk" "$INSTDIR\asy.bat" "" "$INSTDIR\asy.ico"
${lnkX64IconFix} "$DESKTOP\Asymptote.lnk"
- CreateShortCut "$DESKTOP\Xasy.lnk" "$INSTDIR\xasy.py"
- CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\Xasy.lnk" "$INSTDIR\xasy.py"
+ CreateShortCut "$DESKTOP\Xasy.lnk" "$INSTDIR\GUI\xasy.py"
+ CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\Xasy.lnk" "$INSTDIR\GUI\xasy.py"
SetOutPath "$INSTDIR"
!insertmacro MUI_STARTMENU_WRITE_END
SectionEnd
@@ -163,7 +161,6 @@ Section Uninstall
Delete "$INSTDIR\uninst.exe"
!include AsymptoteUninstallList.nsi
Delete "$INSTDIR\asy.bat"
- ${un.EnvVarUpdate} $0 "PATH" "R" "HKLM" "$INSTDIR"
RMDir "$INSTDIR"
Delete "$SMPROGRAMS\$ICONS_GROUP\Uninstall.lnk"
diff --git a/Build/source/utils/asymptote/asymptote.spec b/Build/source/utils/asymptote/asymptote.spec
index 07a8bf19c44..fbffdc242de 100644
--- a/Build/source/utils/asymptote/asymptote.spec
+++ b/Build/source/utils/asymptote/asymptote.spec
@@ -1,7 +1,8 @@
%{!?_texmf: %global _texmf %(eval "echo `kpsewhich -expand-var '$TEXMFLOCAL'`")}
+%global _python_bytecompile_errors_terminate_build 0
Name: asymptote
-Version: 2.44
+Version: 2.47
Release: 1%{?dist}
Summary: Descriptive vector graphics language
@@ -23,7 +24,7 @@ BuildRequires: ImageMagick
Requires: tetex-latex
Requires: tkinter
-Requires: freeglut-devel >= 2.4.0
+Requires: freeglut-devel >= 3.0.0
Requires(post): /usr/bin/texhash /sbin/install-info
Requires(postun): /usr/bin/texhash /sbin/install-info
@@ -36,7 +37,6 @@ that LaTeX does for scientific text.
%prep
%setup -q
-%{__sed} -i 's|^#!/usr/bin/env python$|#!%{__python}|' GUI/xasy.py
%build
@@ -47,7 +47,7 @@ make %{?_smp_mflags}
%install
rm -rf $RPM_BUILD_ROOT
-make install DESTDIR=$RPM_BUILD_ROOT
+make install-notexhash DESTDIR=$RPM_BUILD_ROOT
%{__install} -p -m 644 BUGS ChangeLog LICENSE README ReleaseNotes TODO \
$RPM_BUILD_ROOT%{_defaultdocdir}/%{name}/
diff --git a/Build/source/utils/asymptote/base/animation.asy b/Build/source/utils/asymptote/base/animation.asy
index 270adce713a..e2fd1ea18c9 100644
--- a/Build/source/utils/asymptote/base/animation.asy
+++ b/Build/source/utils/asymptote/base/animation.asy
@@ -56,7 +56,6 @@ struct animation {
string format=nativeformat();
plain.shipout(name,f,format=format,view=false);
files.push(name+"."+format);
- shipped=false;
}
void add(picture pic=currentpicture, enclosure enclosure=NoBox) {
@@ -119,7 +118,6 @@ struct animation {
plain.shipout(prefix,multi,view=view);
settings.inlinetex=inlinetex;
}
- shipped=true;
}
string load(int frames, real delay=animationdelay, string options="",
@@ -152,8 +150,6 @@ struct animation {
if(global)
export(filename,enclosure,multipage=multipage);
- shipped=false;
-
if(!keep) {
exitfcn currentexitfunction=atexit();
void exitfunction() {
diff --git a/Build/source/utils/asymptote/base/asymptote.py b/Build/source/utils/asymptote/base/asymptote.py
index 71e7b9beed6..19b72c50826 100755
--- a/Build/source/utils/asymptote/base/asymptote.py
+++ b/Build/source/utils/asymptote/base/asymptote.py
@@ -1,3 +1,5 @@
+#!/usr/bin/env python3
+
# Python module to feed Asymptote with commands
# (modified from gnuplot.py)
from subprocess import *
@@ -6,7 +8,7 @@ class asy:
self.session = Popen(['asy','-quiet','-inpipe=0','-outpipe=2'],stdin=PIPE)
self.help()
def send(self, cmd):
- self.session.stdin.write(cmd+'\n')
+ self.session.stdin.write(bytes(cmd+'\n','utf-8'))
self.session.stdin.flush()
def size(self, size):
self.send("size(%d);" % size)
@@ -23,10 +25,10 @@ class asy:
def erase(self):
self.send("erase();")
def help(self):
- print "Asymptote session is open. Available methods are:"
- print " help(), size(int), draw(str), fill(str), clip(str), label(str), shipout(str), send(str), erase()"
+ print("Asymptote session is open. Available methods are:")
+ print(" help(), size(int), draw(str), fill(str), clip(str), label(str), shipout(str), send(str), erase()")
def __del__(self):
- print "closing Asymptote session..."
+ print("closing Asymptote session...")
self.send('quit');
self.session.stdin.close();
self.session.wait()
diff --git a/Build/source/utils/asymptote/base/bsp.asy b/Build/source/utils/asymptote/base/bsp.asy
index 2a4d93daa81..cf9d7e0781f 100644
--- a/Build/source/utils/asymptote/base/bsp.asy
+++ b/Build/source/utils/asymptote/base/bsp.asy
@@ -184,20 +184,20 @@ void add(picture pic=currentpicture, face[] faces,
for(int i=0; i < n; ++i)
Faces[i]=faces[i].copy();
- pic.nodes.push(new void (frame f, transform t, transform T,
- pair m, pair M) {
- // Fit all of the pictures so we know their exact sizes.
- face[] faces=new face[n];
- for(int i=0; i < n; ++i) {
- faces[i]=Faces[i].copy();
- face F=faces[i];
- F.t=t*T*F.pic.T;
- F.fit=F.pic.fit(t,T*F.pic.T,m,M);
- }
+ pic.add(new void (frame f, transform t, transform T,
+ pair m, pair M) {
+ // Fit all of the pictures so we know their exact sizes.
+ face[] faces=new face[n];
+ for(int i=0; i < n; ++i) {
+ faces[i]=Faces[i].copy();
+ face F=faces[i];
+ F.t=t*T*F.pic.T;
+ F.fit=F.pic.fit(t,T*F.pic.T,m,M);
+ }
- bsp bsp=bsp(faces,P);
- if(bsp != null) bsp.add(f);
- });
+ bsp bsp=bsp(faces,P);
+ if(bsp != null) bsp.add(f);
+ });
for(int i=0; i < n; ++i) {
picture F=Faces[i].pic;
diff --git a/Build/source/utils/asymptote/base/plain.asy b/Build/source/utils/asymptote/base/plain.asy
index 3bb8cf7ce93..4afe3cb3de4 100644
--- a/Build/source/utils/asymptote/base/plain.asy
+++ b/Build/source/utils/asymptote/base/plain.asy
@@ -41,18 +41,19 @@ include plain_debugger;
typedef void exitfcn();
-bool needshipout() {
- return !shipped && !currentpicture.empty();
-}
-
void updatefunction()
{
+ implicitshipout=true;
if(!currentpicture.uptodate) shipout();
+ implicitshipout=false;
}
void exitfunction()
{
- if(needshipout()) shipout();
+ implicitshipout=true;
+ if(!currentpicture.empty())
+ shipout();
+ implicitshipout=false;
}
atupdate(updatefunction);
@@ -273,7 +274,6 @@ if(settings.autoimport != "") {
string s=settings.autoimport;
settings.autoimport="";
eval("import \""+s+"\" as dummy",true);
- shipped=false;
atupdate(updatefunction);
atexit(exitfunction);
settings.autoimport=s;
diff --git a/Build/source/utils/asymptote/base/plain_Label.asy b/Build/source/utils/asymptote/base/plain_Label.asy
index 516ed4be711..c50ce003be0 100644
--- a/Build/source/utils/asymptote/base/plain_Label.asy
+++ b/Build/source/utils/asymptote/base/plain_Label.asy
@@ -339,8 +339,8 @@ struct Label {
}
pic.add(new void (frame f, transform t) {
- out(f,t,point(g,position),
- alignrelative ? -Align*dir(t*g,position)*I : Align);
+ out(f,t,point(g,position),alignrelative ?
+ inverse(rotation(t))*-Align*dir(t*g,position)*I : Align);
},!alignrelative);
frame f;
@@ -485,6 +485,15 @@ void label(picture pic=currentpicture, Label L, align align=NoAlign,
{
label(pic,L,L.position,align,p,filltype);
}
+
+// Label, but with postscript coords instead of asy
+void label(pair origin, picture pic=currentpicture, Label L, align align=NoAlign,
+ pen p=currentpen, filltype filltype=NoFill)
+{
+ picture opic;
+ label(opic,L,L.position,align,p,filltype);
+ add(pic,opic,origin);
+}
void label(picture pic=currentpicture, Label L, explicit path g,
align align=NoAlign, pen p=currentpen, filltype filltype=NoFill)
diff --git a/Build/source/utils/asymptote/base/plain_boxes.asy b/Build/source/utils/asymptote/base/plain_boxes.asy
index 0c6401311d8..c675ab4cde9 100644
--- a/Build/source/utils/asymptote/base/plain_boxes.asy
+++ b/Build/source/utils/asymptote/base/plain_boxes.asy
@@ -131,7 +131,9 @@ frame bbox(picture pic=currentpicture,
real xmargin=0, real ymargin=xmargin,
pen p=currentpen, filltype filltype=NoFill)
{
- frame f=pic.fit(max(pic.xsize-2*xmargin,0),max(pic.ysize-2*ymargin,0));
+ real penwidth=linewidth(p);
+ frame f=pic.fit(max(pic.xsize-2*(xmargin+penwidth),0),
+ max(pic.ysize-2*(ymargin+penwidth),0));
box(f,xmargin,ymargin,p,filltype,above=false);
return f;
}
diff --git a/Build/source/utils/asymptote/base/plain_constants.asy b/Build/source/utils/asymptote/base/plain_constants.asy
index bf6988d4c42..136b3540218 100644
--- a/Build/source/utils/asymptote/base/plain_constants.asy
+++ b/Build/source/utils/asymptote/base/plain_constants.asy
@@ -36,6 +36,9 @@ restricted real sqrtEpsilon=sqrt(realEpsilon);
restricted pair Align=sqrtEpsilon*NE;
restricted int mantissaBits=ceil(-log(realEpsilon)/log(2))+1;
+restricted transform identity;
+restricted transform zeroTransform=(0,0,0,0,0,0);
+
int min(... int[] a) {return min(a);}
int max(... int[] a) {return max(a);}
diff --git a/Build/source/utils/asymptote/base/plain_pens.asy b/Build/source/utils/asymptote/base/plain_pens.asy
index 627ce2e8c84..22cf5ca4817 100644
--- a/Build/source/utils/asymptote/base/plain_pens.asy
+++ b/Build/source/utils/asymptote/base/plain_pens.asy
@@ -324,10 +324,16 @@ pen rgba(real[] a)
// Return a pen corresponding to a given 6-character RGB hexidecimal string.
pen rgb(string s)
{
- real value(string s, int i) {return hex(substr(s,2i,2))/255;}
+ int offset=substr(s,0,1) == '#' ? 1 : 0;
+ real value(string s, int i) {return hex(substr(s,2i+offset,2))/255;}
return rgb(value(s,0),value(s,1),value(s,2));
}
+pen RGB(int r, int g, int b)
+{
+ return rgb(r/255,g/255,b/255);
+}
+
pen[] operator +(pen[] a, pen b)
{
return sequence(new pen(int i) {return a[i]+b;},a.length);
diff --git a/Build/source/utils/asymptote/base/plain_picture.asy b/Build/source/utils/asymptote/base/plain_picture.asy
index f1dccbb8bea..025e6741cfd 100644
--- a/Build/source/utils/asymptote/base/plain_picture.asy
+++ b/Build/source/utils/asymptote/base/plain_picture.asy
@@ -169,6 +169,15 @@ typedef void drawer(frame f, transform t);
// TODO: Add documentation as to what T is.
typedef void drawerBound(frame f, transform t, transform T, pair lb, pair rt);
+struct node {
+ drawerBound d;
+ string key;
+ void operator init(drawerBound d, string key=xasyKEY()) {
+ this.d=d;
+ this.key=key;
+ }
+}
+
// PairOrTriple <<<1
// This struct is used to represent a userMin/userMax which serves as both a
// pair and a triple depending on the context.
@@ -199,9 +208,18 @@ struct picture { // <<<1
typedef void drawerBound3(frame f, transform3 t, transform3 T,
picture pic, projection P, triple lb, triple rt);
+ struct node3 {
+ drawerBound3 d;
+ string key;
+ void operator init(drawerBound3 d, string key=xasyKEY()) {
+ this.d=d;
+ this.key=key;
+ }
+ }
+
// The functions to do the deferred drawing.
- drawerBound[] nodes;
- drawerBound3[] nodes3;
+ node[] nodes;
+ node3[] nodes3;
bool uptodate=true;
@@ -266,15 +284,20 @@ struct picture { // <<<1
}
init();
- // Erase the current picture, retaining any size specification.
- void erase() {
+ // Erase the current picture, retaining bounds.
+ void clear() {
nodes.delete();
nodes3.delete();
+ legend.delete();
+ }
+
+ // Erase the current picture, retaining any size specification.
+ void erase() {
+ clear();
bounds.erase();
bounds3.erase();
T=identity();
scale=new ScaleT;
- legend.delete();
init();
}
@@ -445,15 +468,15 @@ struct picture { // <<<1
uptodate=false;
if(!exact) bounds.exact=false;
if(above)
- nodes.push(d);
+ nodes.push(node(d));
else
- nodes.insert(0,d);
+ nodes.insert(0,node(d));
}
// Faster implementation of most common case.
void addExactAbove(drawerBound d) {
uptodate=false;
- nodes.push(d);
+ nodes.push(node(d));
}
void add(drawer d, bool exact=false, bool above=true) {
@@ -466,9 +489,9 @@ struct picture { // <<<1
uptodate=false;
if(!exact) bounds.exact=false;
if(above)
- nodes3.push(d);
+ nodes3.push(node3(d));
else
- nodes3.insert(0,d);
+ nodes3.insert(0,node3(d));
}
void add(drawer3 d, bool exact=false, bool above=true) {
@@ -675,17 +698,20 @@ struct picture { // <<<1
frame fit(transform t, transform T0=T, pair m, pair M) {
frame f;
- int n = nodes.length;
- for(int i=0; i < n; ++i)
- nodes[i](f,t,T0,m,M);
+ for(node n : nodes) {
+ xasyKEY(n.key);
+ n.d(f,t,T0,m,M);
+ }
return f;
}
frame fit3(transform3 t, transform3 T0=T3, picture pic, projection P,
triple m, triple M) {
frame f;
- for(int i=0; i < nodes3.length; ++i)
- nodes3[i](f,t,T0,pic,P,m,M);
+ for(node3 n : nodes3) {
+ xasyKEY(n.key);
+ n.d(f,t,T0,pic,P,m,M);
+ }
return f;
}
@@ -905,7 +931,7 @@ struct picture { // <<<1
// picture. Fitting this picture will not scale as the original picture would.
picture drawcopy() {
picture dest=new picture;
- dest.nodes = copy(nodes);
+ dest.nodes=copy(nodes);
dest.nodes3=copy(nodes3);
dest.T=T;
dest.T3=T3;
@@ -945,13 +971,15 @@ struct picture { // <<<1
picture dest=drawcopy();
// Replace nodes with a single drawer that realizes the transform.
- drawerBound[] oldnodes = dest.nodes;
+ node[] oldnodes = dest.nodes;
void drawAll(frame f, transform tt, transform T, pair lb, pair rt) {
transform Tt = T*t;
- for (var node : oldnodes)
- node(f, tt, Tt, lb, rt);
+ for (node n : oldnodes) {
+ xasyKEY(n.key);
+ n.d(f,tt,Tt,lb,rt);
+ }
}
- dest.nodes = new drawerBound[] { drawAll };
+ dest.nodes = new node[] {node(drawAll)};
dest.uptodate=uptodate;
dest.bounds=bounds.transformed(t);
@@ -984,16 +1012,19 @@ struct picture { // <<<1
picture srcCopy=src.drawcopy();
// Draw by drawing the copied picture.
- if(srcCopy.nodes.length > 0)
- nodes.push(new void(frame f, transform t, transform T, pair m, pair M) {
+ if(srcCopy.nodes.length > 0) {
+ nodes.push(node(new void(frame f, transform t, transform T,
+ pair m, pair M) {
add(f,srcCopy.fit(t,T*srcCopy.T,m,M),group,filltype,above);
- });
+ }));
+ }
if(srcCopy.nodes3.length > 0) {
- nodes3.push(new void(frame f, transform3 t, transform3 T3, picture pic,
- projection P, triple m, triple M) {
+ nodes3.push(node3(new void(frame f, transform3 t, transform3 T3,
+ picture pic, projection P, triple m, triple M)
+ {
add(f,srcCopy.fit3(t,T3*srcCopy.T3,pic,P,m,M),group,above);
- });
+ }));
}
legend.append(src.legend);
@@ -1042,6 +1073,14 @@ void size(picture pic=currentpicture, real x, real y=x,
pic.size(x,y,keepAspect);
}
+void size(picture pic=currentpicture, transform t)
+{
+ if(pic.empty3()) {
+ pair z=size(pic.fit(t));
+ pic.size(z.x,z.y);
+ }
+}
+
void size3(picture pic=currentpicture, real x, real y=x, real z=y,
bool keepAspect=pic.keepAspect)
{
@@ -1408,7 +1447,6 @@ void clip(picture pic=currentpicture, path[] g, bool stroke=false,
{
if(copy)
g=copy(g);
- //pic.userClip(min(g),max(g));
pic.clip(min(g), max(g),
new void(frame f, transform t) {
clip(f,t*g,stroke,fillrule,false);
diff --git a/Build/source/utils/asymptote/base/plain_scaling.asy b/Build/source/utils/asymptote/base/plain_scaling.asy
index fd2dbae07c0..5bed3338e9b 100644
--- a/Build/source/utils/asymptote/base/plain_scaling.asy
+++ b/Build/source/utils/asymptote/base/plain_scaling.asy
@@ -192,19 +192,30 @@ real max(real M, scaling s, coord[] c) {
return M;
}
-// Calculate the sizing constants for the given array and maximum size.
+import simplex;
+
+/*
+ Calculate the sizing constants for the given array and maximum size.
+ Solve the two-variable linear programming problem using the simplex method.
+ This problem is specialized in that the second variable, "b", does not have
+ a non-negativity condition, and the first variable, "a", is the quantity
+ being maximized.
+*/
real calculateScaling(string dir, coord[] m, coord[] M, real size,
bool warn=true) {
- access simplex;
- simplex.problem p=new simplex.problem;
-
+ real[][] A;
+ real[] b;
+ real[] c=new real[] {-1,0,0};
+
void addMinCoord(coord c) {
// (a*user + b) + truesize >= 0:
- p.addRestriction(c.user,1,c.truesize);
- }
+ A.push(new real[] {c.user,1,-1});
+ b.push(-c.truesize);
+ }
void addMaxCoord(coord c) {
// (a*user + b) + truesize <= size:
- p.addRestriction(-c.user,-1,size-c.truesize);
+ A.push(new real[] {-c.user,-1,1});
+ b.push(c.truesize-size);
}
for (int i=0; i < m.length; ++i)
@@ -212,11 +223,12 @@ real calculateScaling(string dir, coord[] m, coord[] M, real size,
for (int i=0; i < M.length; ++i)
addMaxCoord(M[i]);
- int status=p.optimize();
- if(status == simplex.problem.OPTIMAL) {
- // TODO: Could just be return a;
- return scaling.build(p.a(),p.b()).a;
- } else if(status == simplex.problem.UNBOUNDED) {
+ int[] s=array(A.length,1);
+ simplex S=simplex(c,A,s,b);
+
+ if(S.case == S.OPTIMAL) {
+ return S.x[0];
+ } else if(S.case == S.UNBOUNDED) {
if(warn) warning("unbounded",dir+" scaling in picture unbounded");
return 0;
} else {
diff --git a/Build/source/utils/asymptote/base/plain_shipout.asy b/Build/source/utils/asymptote/base/plain_shipout.asy
index 972f44963c3..4562205966d 100644
--- a/Build/source/utils/asymptote/base/plain_shipout.asy
+++ b/Build/source/utils/asymptote/base/plain_shipout.asy
@@ -1,6 +1,10 @@
// Default file prefix used for inline LaTeX mode
string defaultfilename;
+file _outpipe;
+if(settings.xasy)
+ _outpipe=output(mode="pipe");
+
string[] file3;
string outprefix(string prefix=defaultfilename) {
@@ -14,8 +18,6 @@ string outformat(string format="")
return format;
}
-bool shipped; // Was a picture or frame already shipped out?
-
frame currentpatterns;
frame Portrait(frame f) {return f;};
@@ -58,24 +60,37 @@ frame enclose(string prefix=defaultfilename, object F, string format="")
} return F.f;
}
-include plain_xasy;
+void deconstruct(picture pic=currentpicture)
+{
+ frame f;
+ transform t=pic.calculateTransform();
+ if(currentpicture.fitter == null)
+ f=pic.fit(t);
+ else
+ f=pic.fit();
+ deconstruct(f,currentpatterns,t);
+}
+
+bool implicitshipout=false;
void shipout(string prefix=defaultfilename, frame f,
string format="", bool wait=false, bool view=true,
string options="", string script="",
- light light=currentlight, projection P=currentprojection)
+ light light=currentlight, projection P=currentprojection,
+ transform t=identity)
{
if(is3D(f)) {
f=enclose(prefix,embed3(prefix,f,format,options,script,light,P));
if(settings.render != 0 && !prc(format)) {
- shipped=true;
return;
}
}
- if(inXasyMode) {
- erase();
- add(f,group=false);
+ if(settings.xasy || (!implicitshipout && prefix == defaultfilename)) {
+ if(prefix == defaultfilename) {
+ currentpicture.clear();
+ add(f,group=false);
+ }
return;
}
@@ -84,9 +99,7 @@ void shipout(string prefix=defaultfilename, frame f,
int limit=2000;
if(abs(m.x) > limit || abs(m.y) > limit) f=shift(-m)*f;
- shipout(prefix,f,currentpatterns,format,wait,view,
- xformStack.empty() ? null : xformStack.pop0);
- shipped=true;
+ _shipout(prefix,f,currentpatterns,format,wait,view,t);
}
void shipout(string prefix=defaultfilename, picture pic=currentpicture,
@@ -95,6 +108,7 @@ void shipout(string prefix=defaultfilename, picture pic=currentpicture,
string options="", string script="",
light light=currentlight, projection P=currentprojection)
{
+ pic.uptodate=true;
if(!uptodate()) {
bool inlinetex=settings.inlinetex;
bool prc=prc(format);
@@ -110,14 +124,17 @@ void shipout(string prefix=defaultfilename, picture pic=currentpicture,
}
settings.inlinetex=settings.inlineimage;
}
- frame f=pic.fit(prefix,format,view=view,options,script,light,P);
+ frame f;
+ transform t=pic.calculateTransform();
+ if(currentpicture.fitter == null)
+ f=pic.fit(t);
+ else
+ f=pic.fit(prefix,format,view=view,options,script,light,P);
+
if(!prconly() && (!pic.empty2() || settings.render == 0 || prc || empty3))
- shipout(prefix,orientation(f),format,wait,view);
+ shipout(prefix,orientation(f),format,wait,view,t);
settings.inlinetex=inlinetex;
}
-
- pic.uptodate=true;
- shipped=true;
}
void newpage(picture pic=currentpicture)
diff --git a/Build/source/utils/asymptote/base/plain_xasy.asy b/Build/source/utils/asymptote/base/plain_xasy.asy
deleted file mode 100644
index efc739d8385..00000000000
--- a/Build/source/utils/asymptote/base/plain_xasy.asy
+++ /dev/null
@@ -1,132 +0,0 @@
-restricted bool inXasyMode=false;
-bool diagnostics=false;
-void report(string text)
-{
- if(diagnostics)
- write(text);
-}
-void report(transform t)
-{
- if(diagnostics)
- write(t);
-}
-void report(int i)
-{
- if(diagnostics)
- write(i);
-}
-void initXasyMode()
-{
- size(0,0);
- inXasyMode=true;
-}
-
-void exitXasyMode()
-{
- inXasyMode=false;
-}
-private picture[] tempStore;
-private picture newPic;
-void startScript()
-{
- tempStore.push(currentpicture.copy());
- newPic=new picture;
- currentpicture=newPic;
-}
-
-void endScript()
-{
- if(tempStore.length < 1) {
- abort("endScript() without matching beginScript()");
- } else {
- currentpicture=tempStore.pop();
- add(currentpicture,newPic.fit(),group=false);
- }
- shipped=false;
-}
-
-struct indexedTransform {
- int index;
- transform t;
- bool active;
- void operator init(int index, transform t, bool active=true) {
- this.index=index;
- this.t=t;
- this.active=active;
- }
-}
-
-struct framedTransformStack {
- struct transact {
- transform t;
- bool active;
- void operator init(transform t, bool active=true) {
- this.t=t;
- this.active=active;
- }
- void operator init(indexedTransform i){
- this.t=i.t;
- this.active=i.active;
- }
- void operator init() {
- this.t=identity();
- this.active=true;
- }
- }
- private transact[] stack;
- private int[] frames;
- private int stackBase=0;
- transform pop() {
- if(stack.length == 0)
- return identity();
- else {
- transform popped=stack[0].t;
- stack.delete(0);
- report("Popped");
- report(popped);
- return popped;
- }
- }
-
- transform pop0() {
- if(stack.length == 0)
- return identity();
- else {
- static transform zerotransform=(0,0,0,0,0,0);
- transform popped=stack[0].active ? stack[0].t : zerotransform;
- stack.delete(0);
- report("Popped");
- report(popped);
- return popped;
- }
- }
-
- void push(transform t, bool Active=true) {
- report("Pushed");
- report(t);
- stack.push(transact(t,Active));
- }
-
- void add(... indexedTransform[] tList) {
- transact[] toPush;
- for(int a=0; a < tList.length; ++a)
- toPush[tList[a].index]=transact(tList[a]);
- for(int a=0; a < toPush.length; ++a)
- if(!toPush.initialized(a))
- toPush[a]=transact();
- report("Added");
- report(toPush.length);
- stack.append(toPush);
- }
-
- bool empty() {
- return stack.length == 0;
- }
-}
-
-framedTransformStack xformStack;
-
-void deconstruct(picture pic=currentpicture, real magnification=1)
-{
- deconstruct(pic.fit(),currentpatterns,magnification,xformStack.pop);
-}
diff --git a/Build/source/utils/asymptote/base/rational.asy b/Build/source/utils/asymptote/base/rational.asy
index 0fa4ee36afa..a142063806d 100644
--- a/Build/source/utils/asymptote/base/rational.asy
+++ b/Build/source/utils/asymptote/base/rational.asy
@@ -87,6 +87,11 @@ bool operator ==(rational r, rational s)
return r.p == s.p && r.q == s.q;
}
+bool operator !=(rational r, rational s)
+{
+ return r.p != s.p || r.q != s.q;
+}
+
bool operator <(rational r, rational s)
{
return r.p*s.q-s.p*r.q < 0;
diff --git a/Build/source/utils/asymptote/base/rationalSimplex.asy b/Build/source/utils/asymptote/base/rationalSimplex.asy
new file mode 100644
index 00000000000..fd7128b8025
--- /dev/null
+++ b/Build/source/utils/asymptote/base/rationalSimplex.asy
@@ -0,0 +1,280 @@
+// Rational simplex solver written by John C. Bowman and Pouria Ramazi, 2018.
+import rational;
+
+struct simplex {
+ static int OPTIMAL=0;
+ static int UNBOUNDED=1;
+ static int INFEASIBLE=2;
+
+ int case;
+ rational[] x;
+ rational cost;
+
+ int m,n;
+ int J;
+
+ // Row reduce based on pivot E[I][J]
+ void rowreduce(rational[][] E, int N, int I, int J) {
+ rational[] EI=E[I];
+ rational v=EI[J];
+ for(int j=0; j < J; ++j) EI[j] /= v;
+ EI[J]=1;
+ for(int j=J+1; j <= N; ++j) EI[j] /= v;
+
+ for(int i=0; i < I; ++i) {
+ rational[] Ei=E[i];
+ rational EiJ=Ei[J];
+ for(int j=0; j < J; ++j)
+ Ei[j] -= EI[j]*EiJ;
+ Ei[J]=0;
+ for(int j=J+1; j <= N; ++j)
+ Ei[j] -= EI[j]*EiJ;
+ }
+ for(int i=I+1; i <= m; ++i) {
+ rational[] Ei=E[i];
+ rational EiJ=Ei[J];
+ for(int j=0; j < J; ++j)
+ Ei[j] -= EI[j]*EiJ;
+ Ei[J]=0;
+ for(int j=J+1; j <= N; ++j)
+ Ei[j] -= EI[j]*EiJ;
+ }
+ }
+
+ int iterate(rational[][] E, int N, int[] Bindices) {
+ while(true) {
+ // Find first negative entry in bottom (reduced cost) row
+ rational[] Em=E[m];
+ for(J=0; J < N; ++J)
+ if(Em[J] < 0) break;
+
+ if(J == N)
+ return 0;
+
+ int I=-1;
+ rational M;
+ for(int i=0; i < m; ++i) {
+ rational e=E[i][J];
+ if(e > 0) {
+ M=E[i][N]/e;
+ I=i;
+ break;
+ }
+ }
+ for(int i=I+1; i < m; ++i) {
+ rational e=E[i][J];
+ if(e > 0) {
+ rational v=E[i][N]/e;
+ if(v <= M) {M=v; I=i;}
+ }
+ }
+ if(I == -1)
+ return UNBOUNDED; // Can only happen in Phase 2.
+
+ Bindices[I]=J;
+
+ // Generate new tableau
+ rowreduce(E,N,I,J);
+ }
+ return 0;
+ }
+
+ // Try to find a solution x to Ax=b that minimizes the cost c^T x,
+ // where A is an m x n matrix, x is a vector of length n, b is a
+ // vector of length m, and c is a vector of length n.
+ void operator init(rational[] c, rational[][] A, rational[] b,
+ bool phase1=true) {
+ // Phase 1
+ m=A.length;
+ n=A[0].length;
+
+ int N=phase1 ? n+m : n;
+ rational[][] E=new rational[m+1][N+1];
+ rational[] Em=E[m];
+
+ for(int j=0; j < n; ++j)
+ Em[j]=0;
+
+ for(int i=0; i < m; ++i) {
+ rational[] Ai=A[i];
+ rational[] Ei=E[i];
+ if(b[i] >= 0) {
+ for(int j=0; j < n; ++j) {
+ rational Aij=Ai[j];
+ Ei[j]=Aij;
+ Em[j] -= Aij;
+ }
+ } else {
+ for(int j=0; j < n; ++j) {
+ rational Aij=-Ai[j];
+ Ei[j]=Aij;
+ Em[j] -= Aij;
+ }
+ }
+ }
+
+ if(phase1) {
+ for(int i=0; i < m; ++i) {
+ rational[] Ei=E[i];
+ for(int j=0; j < i; ++j)
+ Ei[n+j]=0;
+ Ei[n+i]=1;
+ for(int j=i+1; j < m; ++j)
+ Ei[n+j]=0;
+ }
+ }
+
+ rational sum=0;
+ for(int i=0; i < m; ++i) {
+ rational B=abs(b[i]);
+ E[i][N]=B;
+ sum -= B;
+ }
+ Em[N]=sum;
+
+ if(phase1)
+ for(int j=0; j < m; ++j)
+ Em[n+j]=0;
+
+ int[] Bindices=sequence(new int(int x){return x;},m)+n;
+
+ if(phase1) {
+ iterate(E,N,Bindices);
+
+ if(Em[J] != 0) {
+ case=INFEASIBLE;
+ return;
+ }
+ }
+
+ rational[][] D=phase1 ? new rational[m+1][n+1] : E;
+ rational[] Dm=D[m];
+ rational[] cb=phase1 ? new rational[m] : c[n-m:n];
+ if(phase1) {
+ int ip=0; // reduced i
+ for(int i=0; i < m; ++i) {
+ int k=Bindices[i];
+ if(k >= n) continue;
+ Bindices[ip]=k;
+ cb[ip]=c[k];
+ rational[] Dip=D[ip];
+ rational[] Ei=E[i];
+ for(int j=0; j < n; ++j)
+ Dip[j]=Ei[j];
+ Dip[n]=Ei[N];
+ ++ip;
+ }
+
+ rational[] Dip=D[ip];
+ rational[] Em=E[m];
+ for(int j=0; j < n; ++j)
+ Dip[j]=Em[j];
+ Dip[n]=Em[N];
+
+ m=ip;
+
+ for(int j=0; j < n; ++j) {
+ rational sum=0;
+ for(int k=0; k < m; ++k)
+ sum += cb[k]*D[k][j];
+ Dm[j]=c[j]-sum;
+ }
+
+ // Done with Phase 1
+ }
+
+ rational sum=0;
+ for(int k=0; k < m; ++k)
+ sum += cb[k]*D[k][n];
+ Dm[n]=-sum;
+
+ if(iterate(D,n,Bindices) == UNBOUNDED) {
+ case=UNBOUNDED;
+ return;
+ }
+
+ for(int j=0; j < n; ++j)
+ x[j]=0;
+
+ for(int k=0; k < m; ++k)
+ x[Bindices[k]]=D[k][n];
+
+ cost=-Dm[n];
+ case=OPTIMAL;
+ }
+
+ // Try to find a solution x to sgn(Ax-b)=sgn(s) that minimizes the cost
+ // c^T x, where A is an m x n matrix, x is a vector of length n, b is a
+ // vector of length m, and c is a vector of length n.
+ void operator init(rational[] c, rational[][] A, int[] s, rational[] b) {
+ int m=A.length;
+ int n=A[0].length;
+
+ int count=0;
+ for(int i=0; i < m; ++i)
+ if(s[i] != 0) ++count;
+
+ rational[][] a=new rational[m][n+count];
+
+ for(int i=0; i < m; ++i) {
+ rational[] ai=a[i];
+ rational[] Ai=A[i];
+ for(int j=0; j < n; ++j) {
+ ai[j]=Ai[j];
+ }
+ }
+
+ int k=0;
+
+ for(int i=0; i < m; ++i) {
+ rational[] ai=a[i];
+ for(int j=0; j < k; ++j)
+ ai[n+j]=0;
+ if(k < count)
+ ai[n+k]=-s[i];
+ for(int j=k+1; j < count; ++j)
+ ai[n+j]=0;
+ if(s[i] != 0) ++k;
+ }
+
+ bool phase1=!all(s == -1);
+ operator init(concat(c,array(count,rational(0))),a,b,phase1);
+
+ if(case == OPTIMAL)
+ x.delete(n,n+count-1);
+ }
+}
+
+/*
+simplex S=simplex(new rational[] {4,1,1},
+ new rational[][] {{2,1,2},{3,3,1}},
+ new rational[] {4,3});
+
+simplex S=simplex(new rational[] {2,6,1,1},
+ new rational[][] {{1,2,0,1},{1,2,1,1},{1,3,-1,2},{1,1,1,0}},
+ new rational[] {6,7,7,5});
+simplex S=simplex(new rational[] {-10,-12,-12,0,0,0},
+ new rational[][] {{1,2,2,1,0,0},
+ {2,1,2,0,1,0},
+ {2,2,1,0,0,1}},
+ new rational[] {20,20,20});
+
+simplex S=simplex(new rational[] {-10,-12,-12},
+ new rational[][] {{1,2,2},
+ {2,1,2},
+ {2,2,1}},
+ new int[] {0,0,-1},
+ new rational[] {20,20,20});
+
+simplex S=simplex(new rational[] {1,1,1,0},
+ new rational[][] {{1,2,3,0},
+ {-1,2,6,0},
+ {0,4,9,0},
+ {0,0,3,1}},
+ new rational[] {3,2,5,1});
+
+write();
+write("case:",S.case);
+write("x:",S.x);
+write("Cost=",S.cost);
+*/
diff --git a/Build/source/utils/asymptote/base/simplex.asy b/Build/source/utils/asymptote/base/simplex.asy
index 43920109ff4..16a495a082e 100644
--- a/Build/source/utils/asymptote/base/simplex.asy
+++ b/Build/source/utils/asymptote/base/simplex.asy
@@ -1,274 +1,253 @@
-/*****
- * simplex.asy
- * Andy Hammerlindl 2004/07/27
- *
- * Solves the two-variable linear programming problem using the simplex method.
- * This problem is specialized in that the second variable, "b", does not have
- * a non-negativity condition, and the first variable, "a", is the quantity
- * being maximized.
- * Correct execution of the algorithm also assumes that the coefficient of "b"
- * will be +1 or -1 in every added restriction, and that the problem can be
- * initialized to a valid state by pivoting b with one of the slack
- * variables. This assumption may in fact be incorrect.
- *****/
-
-private real infinity=sqrt(0.25*realMax);
-
-struct problem {
- typedef int var;
- static var VAR_A = 0;
- static var VAR_B = 1;
-
- static int OPTIMAL = -1;
- static var UNBOUNDED = -2;
- static int INVALID = -3;
-
- struct row {
- real c, t[];
- }
-
- // The variables of the rows.
- // Initialized for the two variable problem.
- var[] v = {VAR_A, VAR_B};
-
- // The rows of equalities.
- row rowA() {
- row r = new row;
- r.c = 0;
- r.t = new real[] {1, 0};
- return r;
- }
- row rowB() {
- row r = new row;
- r.c = 0;
- r.t = new real[] {0, 1};
- return r;
- }
- row[] rows = {rowA(), rowB()};
-
- // The number of original variables.
- int n = rows.length;
-
- // Pivot the variable v[col] with vp.
- void pivot(int col, var vp)
- {
- var vc=v[col];
-
- // Recalculate rows v[col] and vp for the pivot-swap.
- row rvc = rows[vc], rvp = rows[vp];
- real factor=1/rvp.t[col]; // NOTE: Handle rvp.t[col] == 0 case.
- rvc.c=-rvp.c*factor;
- rvp.c=0;
- rvc.t=-rvp.t*factor;
- rvp.t *= 0;
- rvc.t[col]=factor;
- rvp.t[col]=1;
-
- var a=min(vc,vp);
- var b=max(vc,vp);
-
- // Recalculate the rows other than the two used for the above pivot.
- for (var i = 0; i < a; ++i) {
- row r=rows[i];
- real m = r.t[col];
- r.c += m*rvc.c;
- r.t += m*rvc.t;
- r.t[col]=m*factor;
+// General simplex solver written by John C. Bowman and Pouria Ramazi, 2018.
+
+struct simplex {
+ static int OPTIMAL=0;
+ static int UNBOUNDED=1;
+ static int INFEASIBLE=2;
+
+ int case;
+ real[] x;
+ real cost;
+
+ int m,n;
+ int J;
+ real epsilonA;
+
+ // Row reduce based on pivot E[I][J]
+ void rowreduce(real[][] E, int N, int I, int J) {
+ real[] EI=E[I];
+ real v=EI[J];
+ for(int j=0; j < J; ++j) EI[j] /= v;
+ EI[J]=1.0;
+ for(int j=J+1; j <= N; ++j) EI[j] /= v;
+
+ for(int i=0; i < I; ++i) {
+ real[] Ei=E[i];
+ real EiJ=Ei[J];
+ for(int j=0; j < J; ++j)
+ Ei[j] -= EI[j]*EiJ;
+ Ei[J]=0.0;
+ for(int j=J+1; j <= N; ++j)
+ Ei[j] -= EI[j]*EiJ;
}
- for (var i = a+1; i < b; ++i) {
- row r=rows[i];
- real m = r.t[col];
- r.c += m*rvc.c;
- r.t += m*rvc.t;
- r.t[col]=m*factor;
+ for(int i=I+1; i <= m; ++i) {
+ real[] Ei=E[i];
+ real EiJ=Ei[J];
+ for(int j=0; j < J; ++j)
+ Ei[j] -= EI[j]*EiJ;
+ Ei[J]=0.0;
+ for(int j=J+1; j <= N; ++j)
+ Ei[j] -= EI[j]*EiJ;
}
- for (var i = b+1; i < rows.length; ++i) {
- row r=rows[i];
- real m = r.t[col];
- r.c += m*rvc.c;
- r.t += m*rvc.t;
- r.t[col]=m*factor;
- }
-
- // Relabel the vars.
- v[col] = vp;
}
- // As b does not have a non-negativity condition, it must initially be
- // pivoted out for a variable that does. This selects the initial
- // variable to pivot with b. It also assumes that there is a valid
- // solution with a == 0 to the linear programming problem, and if so, it
- // picks a pivot to get to that state. In our case, a == 0 corresponds to
- // a picture with the user coordinates shrunk down to zero, and if that
- // doesn't fit, nothing will.
- var initVar()
- {
- real min=infinity, max=-infinity;
- var argmin=0, argmax=0;
-
- for (var i = 2; i < rows.length; ++i) {
- row r=rows[i];
- if (r.t[VAR_B] > 0) {
- real val=r.c/r.t[VAR_B];
- if (val < min) {
- min=val;
- argmin=i;
+ int iterate(real[][] E, int N, int[] Bindices) {
+ while(true) {
+ // Find first negative entry in bottom (reduced cost) row
+ real[] Em=E[m];
+ for(J=0; J < N; ++J)
+ if(Em[J] < 0) break;
+
+ if(J == N)
+ return 0;
+
+ int I=-1;
+ real M;
+ for(int i=0; i < m; ++i) {
+ real e=E[i][J];
+ if(e > epsilonA) {
+ M=E[i][N]/e;
+ I=i;
+ break;
}
- } else if (r.t[VAR_B] < 0) {
- real val=r.c/r.t[VAR_B];
- if (val > max) {
- max=val;
- argmax=i;
+ }
+ for(int i=I+1; i < m; ++i) {
+ real e=E[i][J];
+ if(e > epsilonA) {
+ real v=E[i][N]/e;
+ if(v <= M) {M=v; I=i;}
}
}
- }
+ if(I == -1)
+ return UNBOUNDED; // Can only happen in Phase 2.
- // If b has a minimal value, choose a pivot that will give b its minimal
- // value. Otherwise, if b has maximal value, choose a pivot to give b its
- // maximal value.
- return argmin != 0 ? argmin :
- argmax != 0 ? argmax :
- UNBOUNDED;
- }
+ Bindices[I]=J;
- // Initialize the linear program problem by moving into an acceptable state
- // this assumes that b is unrestrained and is the second variable.
- // NOTE: Works in limited cases, may be bug-ridden.
- void init()
- {
- // Find the lowest constant term in the equations.
- var lowest = 0;
- for (var i = 2; i < rows.length; ++i) {
- if (rows[i].c < rows[lowest].c)
- lowest = i;
+ // Generate new tableau
+ rowreduce(E,N,I,J);
}
-
- // Pivot if necessary.
- if (lowest != 0)
- pivot(VAR_B, lowest);
+ return 0;
}
- // Selects a column to pivot on. Returns OPTIMAL if the current state is
- // optimal. Assumes we are optimizing the first row.
- int selectColumn()
- {
- int i=find(rows[0].t > 0,1);
- return (i >= 0) ? i : OPTIMAL;
- }
-
- // Select the new variable associated with a pivot on the column given.
- // Returns UNBOUNDED if the space is unbounded.
- var selectVar(int col)
- {
- // We assume that the first two vars (a and b) once swapped out, won't be
- // swapped back in. This finds the variable which gives the tightest
- // non-negativity condition restricting our optimization. This turns
- // out to be the max of c/t[col]. Note that as c is positive, and
- // t[col] is negative, all c/t[col] will be negative, so we are finding
- // the smallest in magnitude.
- var vp=UNBOUNDED;
- real max=-infinity;
- for (int i = 2; i < rows.length; ++i) {
- row r=rows[i];
- if(r.c < max*r.t[col]) {
- max=r.c/r.t[col]; vp=i;
+ // Try to find a solution x to Ax=b that minimizes the cost c^T x,
+ // where A is an m x n matrix, x is a vector of n non-negative numbers,
+ // b is a vector of length m, and c is a vector of length n.
+ void operator init(real[] c, real[][] A, real[] b, bool phase1=true) {
+ static real epsilon=sqrt(realEpsilon);
+ epsilonA=epsilon*norm(A);
+
+ // Phase 1
+ m=A.length;
+ if(m == 0) {case=INFEASIBLE; return;}
+ n=A[0].length;
+ if(n == 0) {case=INFEASIBLE; return;}
+
+ int N=phase1 ? n+m : n;
+ real[][] E=new real[m+1][N+1];
+ real[] Em=E[m];
+
+ for(int j=0; j < n; ++j)
+ Em[j]=0;
+
+ for(int i=0; i < m; ++i) {
+ real[] Ai=A[i];
+ real[] Ei=E[i];
+ if(b[i] >= 0) {
+ for(int j=0; j < n; ++j) {
+ real Aij=Ai[j];
+ Ei[j]=Aij;
+ Em[j] -= Aij;
+ }
+ } else {
+ for(int j=0; j < n; ++j) {
+ real Aij=-Ai[j];
+ Ei[j]=Aij;
+ Em[j] -= Aij;
+ }
}
}
-
- return vp;
- }
- // Checks that the rows are in a valid state.
- bool valid()
- {
- // Checks that constants are valid.
- bool validConstants() {
- for (int i = 0; i < rows.length; ++i)
- // Do not test the row for b, as it does not have a non-negativity
- // condition.
- if (i != VAR_B && rows[i].c < 0)
- return false;
- return true;
+ if(phase1) {
+ for(int i=0; i < m; ++i) {
+ real[] Ei=E[i];
+ for(int j=0; j < i; ++j)
+ Ei[n+j]=0.0;
+ Ei[n+i]=1.0;
+ for(int j=i+1; j < m; ++j)
+ Ei[n+j]=0.0;
+ }
}
- // Check a variable to see if its row is simple.
- // NOTE: Simple rows could be optimized out, since they are not really
- // used.
- bool validVar(int col) {
-
- var vc = v[col];
- row rvc = rows[vc];
-
- if (rvc.c != 0)
- return false;
- for (int i = 0; i < n; ++i)
- if (rvc.t[i] != (i == col ? 1 : 0))
- return false;
-
- return true;
+ real sum=0;
+ for(int i=0; i < m; ++i) {
+ real B=abs(b[i]);
+ E[i][N]=B;
+ sum -= B;
}
-
- if (!validConstants()) {
- return false;
+ Em[N]=sum;
+
+ if(phase1)
+ for(int j=0; j < m; ++j)
+ Em[n+j]=0.0;
+
+ int[] Bindices=sequence(new int(int x){return x;},m)+n;
+
+ if(phase1) {
+ iterate(E,N,Bindices);
+
+ if(abs(Em[J]) > epsilonA) {
+ case=INFEASIBLE;
+ return;
+ }
}
- for (int i = 0; i < n; ++i)
- if (!validVar(i)) {
- return false;
+
+ real[][] D=phase1 ? new real[m+1][n+1] : E;
+ real[] Dm=D[m];
+ real[] cb=phase1 ? new real[m] : c[n-m:n];
+ if(phase1) {
+ int ip=0; // reduced i
+ for(int i=0; i < m; ++i) {
+ int k=Bindices[i];
+ if(k >= n) continue;
+ Bindices[ip]=k;
+ cb[ip]=c[k];
+ real[] Dip=D[ip];
+ real[] Ei=E[i];
+ for(int j=0; j < n; ++j)
+ Dip[j]=Ei[j];
+ Dip[n]=Ei[N];
+ ++ip;
}
- return true;
- }
-
+ real[] Dip=D[ip];
+ real[] Em=E[m];
+ for(int j=0; j < n; ++j)
+ Dip[j]=Em[j];
+ Dip[n]=Em[N];
- // Perform the algorithm to find the optimal solution. Returns OPTIMAL,
- // UNBOUNDED, or INVALID (if no solution is possible).
- int optimize()
- {
- // Put into a valid state to begin and pivot b out.
- var iv=initVar();
- if (iv == UNBOUNDED)
- return iv;
- pivot(VAR_B, iv);
+ m=ip;
- if (!valid())
- return INVALID;
+ for(int j=0; j < n; ++j) {
+ real sum=0;
+ for(int k=0; k < m; ++k)
+ sum += cb[k]*D[k][j];
+ Dm[j]=c[j]-sum;
+ }
- while(true) {
- int col = selectColumn();
-
- if (col == OPTIMAL)
- return col;
- var vp = selectVar(col);
-
- if (vp == UNBOUNDED)
- return vp;
-
- pivot(col, vp);
+ // Done with Phase 1
+ }
+
+ real sum=0;
+ for(int k=0; k < m; ++k)
+ sum += cb[k]*D[k][n];
+ Dm[n]=-sum;
+
+ if(iterate(D,n,Bindices) == UNBOUNDED) {
+ case=UNBOUNDED;
+ return;
}
- // Shouldn't reach here.
- return INVALID;
- }
+ for(int j=0; j < n; ++j)
+ x[j]=0;
- // Add a restriction to the problem:
- // t1*a + t2*b + c >= 0
- void addRestriction(real t1, real t2, real c)
- {
- row r = new row;
- r.c = c;
- r.t = new real[] {t1, t2};
- rows.push(r);
- }
+ for(int k=0; k < m; ++k)
+ x[Bindices[k]]=D[k][n];
- // Return the value of a computed.
- real a()
- {
- return rows[VAR_A].c;
+ cost=-Dm[n];
+ case=OPTIMAL;
}
- // Return the value of b computed.
- real b()
- {
- return rows[VAR_B].c;
+ // Try to find a solution x to sgn(Ax-b)=sgn(s) that minimizes the cost
+ // c^T x, where A is an m x n matrix, x is a vector of n non-negative
+ // numbers, b is a vector of length m, and c is a vector of length n.
+ void operator init(real[] c, real[][] A, int[] s, real[] b) {
+ int m=A.length;
+ if(m == 0) {case=INFEASIBLE; return;}
+ int n=A[0].length;
+ if(n == 0) {case=INFEASIBLE; return;}
+
+ int count=0;
+ for(int i=0; i < m; ++i)
+ if(s[i] != 0) ++count;
+
+ real[][] a=new real[m][n+count];
+
+ for(int i=0; i < m; ++i) {
+ real[] ai=a[i];
+ real[] Ai=A[i];
+ for(int j=0; j < n; ++j) {
+ ai[j]=Ai[j];
+ }
+ }
+
+ int k=0;
+
+ for(int i=0; i < m; ++i) {
+ real[] ai=a[i];
+ for(int j=0; j < k; ++j)
+ ai[n+j]=0;
+ if(k < count)
+ ai[n+k]=-s[i];
+ for(int j=k+1; j < count; ++j)
+ ai[n+j]=0;
+ if(s[i] != 0) ++k;
+ }
+
+ // bool phase1=!all(s == -1); // TODO: Check
+ bool phase1=true;
+ operator init(concat(c,array(count,0.0)),a,b,phase1);
+
+ if(case == OPTIMAL)
+ x.delete(n,n+count-1);
}
}
diff --git a/Build/source/utils/asymptote/base/slide.asy b/Build/source/utils/asymptote/base/slide.asy
index 6195a97ec01..8a787c37a5b 100644
--- a/Build/source/utils/asymptote/base/slide.asy
+++ b/Build/source/utils/asymptote/base/slide.asy
@@ -225,7 +225,7 @@ void erasestep(int erasenode) {
for(int i=0; i < firstnode.length; ++i) {
for(int j=firstnode[i]; j <= lastnode[i]; ++j) {
tex(bulletcolor(oldbulletcolor));
- currentpicture.add(currentpicture.nodes[j]);
+ currentpicture.add(currentpicture.nodes[j].d);
}
}
firstnode.push(currentpicture.nodes.length-1);
diff --git a/Build/source/utils/asymptote/base/three.asy b/Build/source/utils/asymptote/base/three.asy
index 01eec97976f..742ceda1c04 100644
--- a/Build/source/utils/asymptote/base/three.asy
+++ b/Build/source/utils/asymptote/base/three.asy
@@ -1,6 +1,7 @@
private import math;
-if(inXasyMode) settings.render=0;
+if(settings.xasy)
+ settings.render=0;
if(prc0()) {
if(!latex()) settings.prc=false;
@@ -2916,9 +2917,9 @@ object embed(string prefix=outprefix(), string label=prefix,
if((preview || (prc && settings.render == 0)) && settings.embed) {
image=prefix;
if(settings.inlinetex) image += "_0";
- if(!preview && !shipped && !S.pic2.empty2()) {
+ if(!preview && !S.pic2.empty2()) {
transform T=S.pic2.scaling(S.width,S.height);
- shipout(image,S.pic2.fit(T),newframe,nativeformat(),false,false,null);
+ _shipout(image,S.pic2.fit(T),newframe,nativeformat(),false,false);
}
image += "."+nativeformat();
diff --git a/Build/source/utils/asymptote/build-scripts/build-asymptote b/Build/source/utils/asymptote/build-scripts/build-asymptote
index 4239babd6bc..f7f50c068f5 100755
--- a/Build/source/utils/asymptote/build-scripts/build-asymptote
+++ b/Build/source/utils/asymptote/build-scripts/build-asymptote
@@ -40,7 +40,7 @@ cp /usr/local/src/libatomic_ops-$ATOMICVERSION.tar.gz asymptote-$VERSION
chown -R root.root asymptote-$VERSION
cd asymptote-$VERSION
find . -type d -exec /bin/bash -c "cd '{}';rm -rf .git" \;
-rm -f .gitignore
+rm -f .gitignore .vscode
./autogen.sh
./configure
make $MAKEFLAGS check || exit
diff --git a/Build/source/utils/asymptote/build-scripts/build-asymptote.dos b/Build/source/utils/asymptote/build-scripts/build-asymptote.dos
index 3da86ae8ffb..78bc9847ace 100755
--- a/Build/source/utils/asymptote/build-scripts/build-asymptote.dos
+++ b/Build/source/utils/asymptote/build-scripts/build-asymptote.dos
@@ -44,7 +44,7 @@ make MSDOS=1 install-asy DESTDIR="$BUILD/" docdir="$BUILD/"
cp asy.ico README LICENSE* $BUILD
pushd $BUILD
mv usr/local/bin/* .
-mv usr/local/share/asymptote/GUI/*.py .
+mv usr/local/share/asymptote/GUI .
rm -rf usr/local/share/asymptote/GUI
mv usr/local/share/asymptote/* .
cp $SHARED/asydoc/*.pdf .
@@ -59,7 +59,7 @@ ls -p1 $BUILD \
if [ $MACHINE == i686 ]; then
sed asymptote.nsi -e 's/$PROGRAMFILES64/$PROGRAMFILES/g' > asymptote32.nsi
/cygdrive/c/Program\ Files\ \(x86\)/NSIS/makensis.exe asymptote32.nsi
-SUFFIX=-i386
+SUFFIX=-i386_32
else
/cygdrive/c/Program\ Files\ \(x86\)/NSIS/makensis.exe asymptote.nsi
SUFFIX=
diff --git a/Build/source/utils/asymptote/builtin.cc b/Build/source/utils/asymptote/builtin.cc
index 9be130c4266..ee0c3238941 100644
--- a/Build/source/utils/asymptote/builtin.cc
+++ b/Build/source/utils/asymptote/builtin.cc
@@ -637,7 +637,8 @@ void addArrayOps(venv &ve, types::array *t)
addFunc(ve, run::arraySort,
t, SYM(sort), formal(t, SYM(a)),
- formal(new function(primBoolean(), ct, ct), SYM(less)));
+ formal(new function(primBoolean(), ct, ct), SYM(less)),
+ formal(primBoolean(), SYM(stable), true));
switch (depth) {
case 1:
diff --git a/Build/source/utils/asymptote/builtin.symbols.h b/Build/source/utils/asymptote/builtin.symbols.h
deleted file mode 100644
index 05c40828a6a..00000000000
--- a/Build/source/utils/asymptote/builtin.symbols.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*****
- * This file is automatically generated by findsym.pl
- * Changes will be overwritten.
- *****/
-
-// If the ADDSYMBOL macro is not already defined, define it with the default
-// purpose of referring to an external pre-translated symbol, such that
-// SYM(name) also refers to that symbol.
-#ifndef ADDSYMBOL
- #define ADDSYMBOL(name) extern sym::symbol PRETRANSLATED_SYMBOL_##name
- #define SYM(name) PRETRANSLATED_SYMBOL_##name
-#endif
-
-ADDSYMBOL(VERSION);
-ADDSYMBOL(a);
-ADDSYMBOL(abs);
-ADDSYMBOL(acos);
-ADDSYMBOL(acosh);
-ADDSYMBOL(alias);
-ADDSYMBOL(array);
-ADDSYMBOL(asin);
-ADDSYMBOL(asinh);
-ADDSYMBOL(atan);
-ADDSYMBOL(atanh);
-ADDSYMBOL(b);
-ADDSYMBOL(cbrt);
-ADDSYMBOL(concat);
-ADDSYMBOL(conj);
-ADDSYMBOL(copy);
-ADDSYMBOL(cos);
-ADDSYMBOL(cosh);
-ADDSYMBOL(currentpen);
-ADDSYMBOL(depth);
-ADDSYMBOL(diagonal);
-ADDSYMBOL(e);
-ADDSYMBOL(exp);
-ADDSYMBOL(expm1);
-ADDSYMBOL(f);
-ADDSYMBOL(fabs);
-ADDSYMBOL(file);
-ADDSYMBOL(identity);
-ADDSYMBOL(inf);
-ADDSYMBOL(infinity);
-ADDSYMBOL(initialized);
-ADDSYMBOL(intMax);
-ADDSYMBOL(intMin);
-ADDSYMBOL(interp);
-ADDSYMBOL(key);
-ADDSYMBOL(ldexp);
-ADDSYMBOL(less);
-ADDSYMBOL(log);
-ADDSYMBOL(log10);
-ADDSYMBOL(log1p);
-ADDSYMBOL(map);
-ADDSYMBOL(max);
-ADDSYMBOL(maxbound);
-ADDSYMBOL(min);
-ADDSYMBOL(minbound);
-ADDSYMBOL(n);
-ADDSYMBOL(nan);
-ADDSYMBOL(perm);
-ADDSYMBOL(pi);
-ADDSYMBOL(pow10);
-ADDSYMBOL(printBytecode);
-ADDSYMBOL(randMax);
-ADDSYMBOL(realDigits);
-ADDSYMBOL(realEpsilon);
-ADDSYMBOL(realMax);
-ADDSYMBOL(realMin);
-ADDSYMBOL(s);
-ADDSYMBOL(search);
-ADDSYMBOL(sequence);
-ADDSYMBOL(sin);
-ADDSYMBOL(sinh);
-ADDSYMBOL(sort);
-ADDSYMBOL(sqrt);
-ADDSYMBOL(suffix);
-ADDSYMBOL(sum);
-ADDSYMBOL(t);
-ADDSYMBOL(tan);
-ADDSYMBOL(tanh);
-ADDSYMBOL(transpose);
-ADDSYMBOL(value);
-ADDSYMBOL(write);
-ADDSYMBOL(x);
-ADDSYMBOL(xx);
-ADDSYMBOL(xy);
-ADDSYMBOL(y);
-ADDSYMBOL(yx);
-ADDSYMBOL(yy);
-ADDSYMBOL(z);
diff --git a/Build/source/utils/asymptote/config.guess b/Build/source/utils/asymptote/config.guess
index 8e2a58b864f..256083a70d3 100755
--- a/Build/source/utils/asymptote/config.guess
+++ b/Build/source/utils/asymptote/config.guess
@@ -1,8 +1,8 @@
#! /bin/sh
# Attempt to guess a canonical system name.
-# Copyright 1992-2019 Free Software Foundation, Inc.
+# Copyright 1992-2018 Free Software Foundation, Inc.
-timestamp='2019-01-03'
+timestamp='2018-03-08'
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
@@ -50,7 +50,7 @@ version="\
GNU config.guess ($timestamp)
Originally written by Per Bothner.
-Copyright 1992-2019 Free Software Foundation, Inc.
+Copyright 1992-2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -84,6 +84,8 @@ if test $# != 0; then
exit 1
fi
+trap 'exit 1' 1 2 15
+
# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
# compiler to aid in system detection is discouraged as it requires
# temporary files to be created and, as you can see below, it is a
@@ -94,38 +96,34 @@ fi
# Portable tmp directory creation inspired by the Autoconf team.
-tmp=
-# shellcheck disable=SC2172
-trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15
-
-set_cc_for_build() {
- : "${TMPDIR=/tmp}"
- # shellcheck disable=SC2039
- { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
- { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } ||
- { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } ||
- { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; }
- dummy=$tmp/dummy
- case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in
- ,,) echo "int x;" > "$dummy.c"
- for driver in cc gcc c89 c99 ; do
- if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then
- CC_FOR_BUILD="$driver"
- break
- fi
- done
- if test x"$CC_FOR_BUILD" = x ; then
- CC_FOR_BUILD=no_compiler_found
- fi
- ;;
- ,,*) CC_FOR_BUILD=$CC ;;
- ,*,*) CC_FOR_BUILD=$HOST_CC ;;
- esac
-}
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,) echo "int x;" > "$dummy.c" ;
+ for c in cc gcc c89 c99 ; do
+ if ($c -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then
+ CC_FOR_BUILD="$c"; break ;
+ fi ;
+ done ;
+ if test x"$CC_FOR_BUILD" = x ; then
+ CC_FOR_BUILD=no_compiler_found ;
+ fi
+ ;;
+ ,,*) CC_FOR_BUILD=$CC ;;
+ ,*,*) CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
# (ghazi@noc.rutgers.edu 1994-08-24)
-if test -f /.attbin/uname ; then
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
PATH=$PATH:/.attbin ; export PATH
fi
@@ -140,7 +138,7 @@ Linux|GNU|GNU/*)
# We could probably try harder.
LIBC=gnu
- set_cc_for_build
+ eval "$set_cc_for_build"
cat <<-EOF > "$dummy.c"
#include <features.h>
#if defined(__UCLIBC__)
@@ -201,7 +199,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
os=netbsdelf
;;
arm*|i386|m68k|ns32k|sh3*|sparc|vax)
- set_cc_for_build
+ eval "$set_cc_for_build"
if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
| grep -q __ELF__
then
@@ -239,7 +237,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
# contains redundant information, the shorter form:
# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
- echo "$machine-${os}${release}${abi-}"
+ echo "$machine-${os}${release}${abi}"
exit ;;
*:Bitrig:*:*)
UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
@@ -385,26 +383,13 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
exit ;;
sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
- set_cc_for_build
- SUN_ARCH=sparc
- # If there is a compiler, see if it is configured for 64-bit objects.
- # Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
- # This test works for both compilers.
- if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
- if (echo '#ifdef __sparcv9'; echo IS_64BIT_ARCH; echo '#endif') | \
- (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
- grep IS_64BIT_ARCH >/dev/null
- then
- SUN_ARCH=sparcv9
- fi
- fi
- echo "$SUN_ARCH"-sun-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
+ echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`"
exit ;;
i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
echo i386-pc-auroraux"$UNAME_RELEASE"
exit ;;
i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
- set_cc_for_build
+ eval "$set_cc_for_build"
SUN_ARCH=i386
# If there is a compiler, see if it is configured for 64-bit objects.
# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
@@ -497,7 +482,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
echo clipper-intergraph-clix"$UNAME_RELEASE"
exit ;;
mips:*:*:UMIPS | mips:*:*:RISCos)
- set_cc_for_build
+ eval "$set_cc_for_build"
sed 's/^ //' << EOF > "$dummy.c"
#ifdef __cplusplus
#include <stdio.h> /* for printf() prototype */
@@ -594,7 +579,7 @@ EOF
exit ;;
*:AIX:2:3)
if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
- set_cc_for_build
+ eval "$set_cc_for_build"
sed 's/^ //' << EOF > "$dummy.c"
#include <sys/systemcfg.h>
@@ -675,7 +660,7 @@ EOF
esac
fi
if [ "$HP_ARCH" = "" ]; then
- set_cc_for_build
+ eval "$set_cc_for_build"
sed 's/^ //' << EOF > "$dummy.c"
#define _HPUX_SOURCE
@@ -715,7 +700,7 @@ EOF
esac
if [ "$HP_ARCH" = hppa2.0w ]
then
- set_cc_for_build
+ eval "$set_cc_for_build"
# hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
# 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler
@@ -741,7 +726,7 @@ EOF
echo ia64-hp-hpux"$HPUX_REV"
exit ;;
3050*:HI-UX:*:*)
- set_cc_for_build
+ eval "$set_cc_for_build"
sed 's/^ //' << EOF > "$dummy.c"
#include <unistd.h>
int
@@ -855,17 +840,6 @@ EOF
*:BSD/OS:*:*)
echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE"
exit ;;
- arm:FreeBSD:*:*)
- UNAME_PROCESSOR=`uname -p`
- set_cc_for_build
- if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
- | grep -q __ARM_PCS_VFP
- then
- echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabi
- else
- echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabihf
- fi
- exit ;;
*:FreeBSD:*:*)
UNAME_PROCESSOR=`/usr/bin/uname -p`
case "$UNAME_PROCESSOR" in
@@ -907,7 +881,7 @@ EOF
echo "$UNAME_MACHINE"-pc-uwin
exit ;;
amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
- echo x86_64-pc-cygwin
+ echo x86_64-unknown-cygwin
exit ;;
prep*:SunOS:5.*:*)
echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
@@ -920,8 +894,8 @@ EOF
# other systems with GNU libc and userland
echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC"
exit ;;
- *:Minix:*:*)
- echo "$UNAME_MACHINE"-unknown-minix
+ i*86:Minix:*:*)
+ echo "$UNAME_MACHINE"-pc-minix
exit ;;
aarch64:Linux:*:*)
echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
@@ -948,7 +922,7 @@ EOF
echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
exit ;;
arm*:Linux:*:*)
- set_cc_for_build
+ eval "$set_cc_for_build"
if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
| grep -q __ARM_EABI__
then
@@ -997,7 +971,7 @@ EOF
echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
exit ;;
mips:Linux:*:* | mips64:Linux:*:*)
- set_cc_for_build
+ eval "$set_cc_for_build"
sed 's/^ //' << EOF > "$dummy.c"
#undef CPU
#undef ${UNAME_MACHINE}
@@ -1311,7 +1285,7 @@ EOF
exit ;;
*:Darwin:*:*)
UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
- set_cc_for_build
+ eval "$set_cc_for_build"
if test "$UNAME_PROCESSOR" = unknown ; then
UNAME_PROCESSOR=powerpc
fi
@@ -1384,7 +1358,6 @@ EOF
# "uname -m" is not consistent, so use $cputype instead. 386
# is converted to i386 for consistency with other x86
# operating systems.
- # shellcheck disable=SC2154
if test "$cputype" = 386; then
UNAME_MACHINE=i386
else
@@ -1441,9 +1414,6 @@ EOF
amd64:Isilon\ OneFS:*:*)
echo x86_64-unknown-onefs
exit ;;
- *:Unleashed:*:*)
- echo "$UNAME_MACHINE"-unknown-unleashed"$UNAME_RELEASE"
- exit ;;
esac
echo "$0: unable to guess system type" >&2
diff --git a/Build/source/utils/asymptote/config.h.in b/Build/source/utils/asymptote/config.h.in
index 3262ae09315..69236240dee 100644
--- a/Build/source/utils/asymptote/config.h.in
+++ b/Build/source/utils/asymptote/config.h.in
@@ -114,7 +114,7 @@
/* Define to 1 if the system has the type `ptrdiff_t'. */
#undef HAVE_PTRDIFF_T
-/* Define if you have a working <rpc/rpc.h> header file */
+/* Define if you have a working <tirpc/rpc/rpc.h> header file */
#undef HAVE_RPC_RPC_H
/* Define to 1 if you have the `sqrt' function. */
diff --git a/Build/source/utils/asymptote/config.sub b/Build/source/utils/asymptote/config.sub
index 3b4c7624b68..9ccf09a7a33 100755
--- a/Build/source/utils/asymptote/config.sub
+++ b/Build/source/utils/asymptote/config.sub
@@ -1,8 +1,8 @@
#! /bin/sh
# Configuration validation subroutine script.
-# Copyright 1992-2019 Free Software Foundation, Inc.
+# Copyright 1992-2018 Free Software Foundation, Inc.
-timestamp='2019-01-05'
+timestamp='2018-03-08'
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
@@ -67,7 +67,7 @@ Report bugs and patches to <config-patches@gnu.org>."
version="\
GNU config.sub ($timestamp)
-Copyright 1992-2019 Free Software Foundation, Inc.
+Copyright 1992-2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -89,7 +89,7 @@ while test $# -gt 0 ; do
- ) # Use stdin as input.
break ;;
-* )
- echo "$me: invalid option $1$help" >&2
+ echo "$me: invalid option $1$help"
exit 1 ;;
*local*)
@@ -110,1164 +110,1223 @@ case $# in
exit 1;;
esac
-# Split fields of configuration type
-# shellcheck disable=SC2162
-IFS="-" read field1 field2 field3 field4 <<EOF
-$1
-EOF
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+ nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
+ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+ knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \
+ kopensolaris*-gnu* | cloudabi*-eabi* | \
+ storm-chaos* | os2-emx* | rtmk-nova*)
+ os=-$maybe_os
+ basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+ ;;
+ android-linux)
+ os=-linux-android
+ basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
+ ;;
+ *)
+ basic_machine=`echo "$1" | sed 's/-[^-]*$//'`
+ if [ "$basic_machine" != "$1" ]
+ then os=`echo "$1" | sed 's/.*-/-/'`
+ else os=; fi
+ ;;
+esac
-# Separate into logical components for further validation
-case $1 in
- *-*-*-*-*)
- echo Invalid configuration \`"$1"\': more than four components >&2
- exit 1
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work. We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+ -sun*os*)
+ # Prevent following clause from handling this invalid input.
;;
- *-*-*-*)
- basic_machine=$field1-$field2
- os=$field3-$field4
+ -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+ -apple | -axis | -knuth | -cray | -microblaze*)
+ os=
+ basic_machine=$1
;;
- *-*-*)
- # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two
- # parts
- maybe_os=$field2-$field3
- case $maybe_os in
- nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc \
- | linux-newlib* | linux-musl* | linux-uclibc* | uclinux-uclibc* \
- | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \
- | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \
- | storm-chaos* | os2-emx* | rtmk-nova*)
- basic_machine=$field1
- os=$maybe_os
- ;;
- android-linux)
- basic_machine=$field1-unknown
- os=linux-android
- ;;
- *)
- basic_machine=$field1-$field2
- os=$field3
- ;;
- esac
+ -bluegene*)
+ os=-cnk
;;
- *-*)
- # A lone config we happen to match not fitting any pattern
- case $field1-$field2 in
- decstation-3100)
- basic_machine=mips-dec
- os=
- ;;
- *-*)
- # Second component is usually, but not always the OS
- case $field2 in
- # Prevent following clause from handling this valid os
- sun*os*)
- basic_machine=$field1
- os=$field2
- ;;
- # Manufacturers
- dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \
- | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \
- | unicom* | ibm* | next | hp | isi* | apollo | altos* \
- | convergent* | ncr* | news | 32* | 3600* | 3100* \
- | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \
- | ultra | tti* | harris | dolphin | highlevel | gould \
- | cbm | ns | masscomp | apple | axis | knuth | cray \
- | microblaze* | sim | cisco \
- | oki | wec | wrs | winbond)
- basic_machine=$field1-$field2
- os=
- ;;
- *)
- basic_machine=$field1
- os=$field2
- ;;
- esac
- ;;
- esac
+ -sim | -cisco | -oki | -wec | -winbond)
+ os=
+ basic_machine=$1
;;
- *)
- # Convert single-component short-hands not valid as part of
- # multi-component configurations.
- case $field1 in
- 386bsd)
- basic_machine=i386-pc
- os=bsd
- ;;
- a29khif)
- basic_machine=a29k-amd
- os=udi
- ;;
- adobe68k)
- basic_machine=m68010-adobe
- os=scout
- ;;
- alliant)
- basic_machine=fx80-alliant
- os=
- ;;
- altos | altos3068)
- basic_machine=m68k-altos
- os=
- ;;
- am29k)
- basic_machine=a29k-none
- os=bsd
- ;;
- amdahl)
- basic_machine=580-amdahl
- os=sysv
- ;;
- amiga)
- basic_machine=m68k-unknown
- os=
- ;;
- amigaos | amigados)
- basic_machine=m68k-unknown
- os=amigaos
- ;;
- amigaunix | amix)
- basic_machine=m68k-unknown
- os=sysv4
- ;;
- apollo68)
- basic_machine=m68k-apollo
- os=sysv
- ;;
- apollo68bsd)
- basic_machine=m68k-apollo
- os=bsd
- ;;
- aros)
- basic_machine=i386-pc
- os=aros
- ;;
- aux)
- basic_machine=m68k-apple
- os=aux
- ;;
- balance)
- basic_machine=ns32k-sequent
- os=dynix
- ;;
- blackfin)
- basic_machine=bfin-unknown
- os=linux
- ;;
- cegcc)
- basic_machine=arm-unknown
- os=cegcc
- ;;
- convex-c1)
- basic_machine=c1-convex
- os=bsd
- ;;
- convex-c2)
- basic_machine=c2-convex
- os=bsd
- ;;
- convex-c32)
- basic_machine=c32-convex
- os=bsd
- ;;
- convex-c34)
- basic_machine=c34-convex
- os=bsd
- ;;
- convex-c38)
- basic_machine=c38-convex
- os=bsd
- ;;
- cray)
- basic_machine=j90-cray
- os=unicos
- ;;
- crds | unos)
- basic_machine=m68k-crds
- os=
- ;;
- da30)
- basic_machine=m68k-da30
- os=
- ;;
- decstation | pmax | pmin | dec3100 | decstatn)
- basic_machine=mips-dec
- os=
- ;;
- delta88)
- basic_machine=m88k-motorola
- os=sysv3
- ;;
- dicos)
- basic_machine=i686-pc
- os=dicos
- ;;
- djgpp)
- basic_machine=i586-pc
- os=msdosdjgpp
- ;;
- ebmon29k)
- basic_machine=a29k-amd
- os=ebmon
- ;;
- es1800 | OSE68k | ose68k | ose | OSE)
- basic_machine=m68k-ericsson
- os=ose
- ;;
- gmicro)
- basic_machine=tron-gmicro
- os=sysv
- ;;
- go32)
- basic_machine=i386-pc
- os=go32
- ;;
- h8300hms)
- basic_machine=h8300-hitachi
- os=hms
- ;;
- h8300xray)
- basic_machine=h8300-hitachi
- os=xray
- ;;
- h8500hms)
- basic_machine=h8500-hitachi
- os=hms
- ;;
- harris)
- basic_machine=m88k-harris
- os=sysv3
- ;;
- hp300)
- basic_machine=m68k-hp
- ;;
- hp300bsd)
- basic_machine=m68k-hp
- os=bsd
- ;;
- hp300hpux)
- basic_machine=m68k-hp
- os=hpux
- ;;
- hppaosf)
- basic_machine=hppa1.1-hp
- os=osf
- ;;
- hppro)
- basic_machine=hppa1.1-hp
- os=proelf
- ;;
- i386mach)
- basic_machine=i386-mach
- os=mach
- ;;
- vsta)
- basic_machine=i386-pc
- os=vsta
- ;;
- isi68 | isi)
- basic_machine=m68k-isi
- os=sysv
- ;;
- m68knommu)
- basic_machine=m68k-unknown
- os=linux
- ;;
- magnum | m3230)
- basic_machine=mips-mips
- os=sysv
- ;;
- merlin)
- basic_machine=ns32k-utek
- os=sysv
- ;;
- mingw64)
- basic_machine=x86_64-pc
- os=mingw64
- ;;
- mingw32)
- basic_machine=i686-pc
- os=mingw32
- ;;
- mingw32ce)
- basic_machine=arm-unknown
- os=mingw32ce
- ;;
- monitor)
- basic_machine=m68k-rom68k
- os=coff
- ;;
- morphos)
- basic_machine=powerpc-unknown
- os=morphos
- ;;
- moxiebox)
- basic_machine=moxie-unknown
- os=moxiebox
- ;;
- msdos)
- basic_machine=i386-pc
- os=msdos
- ;;
- msys)
- basic_machine=i686-pc
- os=msys
- ;;
- mvs)
- basic_machine=i370-ibm
- os=mvs
- ;;
- nacl)
- basic_machine=le32-unknown
- os=nacl
- ;;
- ncr3000)
- basic_machine=i486-ncr
- os=sysv4
- ;;
- netbsd386)
- basic_machine=i386-pc
- os=netbsd
- ;;
- netwinder)
- basic_machine=armv4l-rebel
- os=linux
- ;;
- news | news700 | news800 | news900)
- basic_machine=m68k-sony
- os=newsos
- ;;
- news1000)
- basic_machine=m68030-sony
- os=newsos
- ;;
- necv70)
- basic_machine=v70-nec
- os=sysv
- ;;
- nh3000)
- basic_machine=m68k-harris
- os=cxux
- ;;
- nh[45]000)
- basic_machine=m88k-harris
- os=cxux
- ;;
- nindy960)
- basic_machine=i960-intel
- os=nindy
- ;;
- mon960)
- basic_machine=i960-intel
- os=mon960
- ;;
- nonstopux)
- basic_machine=mips-compaq
- os=nonstopux
- ;;
- os400)
- basic_machine=powerpc-ibm
- os=os400
- ;;
- OSE68000 | ose68000)
- basic_machine=m68000-ericsson
- os=ose
- ;;
- os68k)
- basic_machine=m68k-none
- os=os68k
- ;;
- paragon)
- basic_machine=i860-intel
- os=osf
- ;;
- parisc)
- basic_machine=hppa-unknown
- os=linux
- ;;
- pw32)
- basic_machine=i586-unknown
- os=pw32
- ;;
- rdos | rdos64)
- basic_machine=x86_64-pc
- os=rdos
- ;;
- rdos32)
- basic_machine=i386-pc
- os=rdos
- ;;
- rom68k)
- basic_machine=m68k-rom68k
- os=coff
- ;;
- sa29200)
- basic_machine=a29k-amd
- os=udi
- ;;
- sei)
- basic_machine=mips-sei
- os=seiux
- ;;
- sequent)
- basic_machine=i386-sequent
- os=
- ;;
- sps7)
- basic_machine=m68k-bull
- os=sysv2
- ;;
- st2000)
- basic_machine=m68k-tandem
- os=
- ;;
- stratus)
- basic_machine=i860-stratus
- os=sysv4
- ;;
- sun2)
- basic_machine=m68000-sun
- os=
- ;;
- sun2os3)
- basic_machine=m68000-sun
- os=sunos3
- ;;
- sun2os4)
- basic_machine=m68000-sun
- os=sunos4
- ;;
- sun3)
- basic_machine=m68k-sun
- os=
- ;;
- sun3os3)
- basic_machine=m68k-sun
- os=sunos3
- ;;
- sun3os4)
- basic_machine=m68k-sun
- os=sunos4
- ;;
- sun4)
- basic_machine=sparc-sun
- os=
- ;;
- sun4os3)
- basic_machine=sparc-sun
- os=sunos3
- ;;
- sun4os4)
- basic_machine=sparc-sun
- os=sunos4
- ;;
- sun4sol2)
- basic_machine=sparc-sun
- os=solaris2
- ;;
- sun386 | sun386i | roadrunner)
- basic_machine=i386-sun
- os=
- ;;
- sv1)
- basic_machine=sv1-cray
- os=unicos
- ;;
- symmetry)
- basic_machine=i386-sequent
- os=dynix
- ;;
- t3e)
- basic_machine=alphaev5-cray
- os=unicos
- ;;
- t90)
- basic_machine=t90-cray
- os=unicos
- ;;
- toad1)
- basic_machine=pdp10-xkl
- os=tops20
- ;;
- tpf)
- basic_machine=s390x-ibm
- os=tpf
- ;;
- udi29k)
- basic_machine=a29k-amd
- os=udi
- ;;
- ultra3)
- basic_machine=a29k-nyu
- os=sym1
- ;;
- v810 | necv810)
- basic_machine=v810-nec
- os=none
- ;;
- vaxv)
- basic_machine=vax-dec
- os=sysv
- ;;
- vms)
- basic_machine=vax-dec
- os=vms
- ;;
- vxworks960)
- basic_machine=i960-wrs
- os=vxworks
- ;;
- vxworks68)
- basic_machine=m68k-wrs
- os=vxworks
- ;;
- vxworks29k)
- basic_machine=a29k-wrs
- os=vxworks
- ;;
- xbox)
- basic_machine=i686-pc
- os=mingw32
- ;;
- ymp)
- basic_machine=ymp-cray
- os=unicos
- ;;
- *)
- basic_machine=$1
- os=
- ;;
- esac
+ -scout)
+ ;;
+ -wrs)
+ os=-vxworks
+ basic_machine=$1
+ ;;
+ -chorusos*)
+ os=-chorusos
+ basic_machine=$1
+ ;;
+ -chorusrdb)
+ os=-chorusrdb
+ basic_machine=$1
+ ;;
+ -hiux*)
+ os=-hiuxwe2
+ ;;
+ -sco6)
+ os=-sco5v6
+ basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco5)
+ os=-sco3.2v5
+ basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco4)
+ os=-sco3.2v4
+ basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2.[4-9]*)
+ os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+ basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2v[4-9]*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco5v6*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco*)
+ os=-sco3.2v2
+ basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -udk*)
+ basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -isc)
+ os=-isc2.2
+ basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -clix*)
+ basic_machine=clipper-intergraph
+ ;;
+ -isc*)
+ basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -lynx*178)
+ os=-lynxos178
+ ;;
+ -lynx*5)
+ os=-lynxos5
+ ;;
+ -lynx*)
+ os=-lynxos
+ ;;
+ -ptx*)
+ basic_machine=`echo "$1" | sed -e 's/86-.*/86-sequent/'`
+ ;;
+ -psos*)
+ os=-psos
+ ;;
+ -mint | -mint[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
;;
esac
-# Decode 1-component or ad-hoc basic machines
+# Decode aliases for certain CPU-COMPANY combinations.
case $basic_machine in
- # Here we handle the default manufacturer of certain CPU types. It is in
- # some cases the only manufacturer, in others, it is the most popular.
- w89k)
- cpu=hppa1.1
- vendor=winbond
+ # Recognize the basic CPU types without company name.
+ # Some are omitted here because they have special meanings below.
+ 1750a | 580 \
+ | a29k \
+ | aarch64 | aarch64_be \
+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+ | am33_2.0 \
+ | arc | arceb \
+ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
+ | avr | avr32 \
+ | ba \
+ | be32 | be64 \
+ | bfin \
+ | c4x | c8051 | clipper \
+ | d10v | d30v | dlx | dsp16xx \
+ | e2k | epiphany \
+ | fido | fr30 | frv | ft32 \
+ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+ | hexagon \
+ | i370 | i860 | i960 | ia16 | ia64 \
+ | ip2k | iq2000 \
+ | k1om \
+ | le32 | le64 \
+ | lm32 \
+ | m32c | m32r | m32rle | m68000 | m68k | m88k \
+ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \
+ | mips | mipsbe | mipseb | mipsel | mipsle \
+ | mips16 \
+ | mips64 | mips64el \
+ | mips64octeon | mips64octeonel \
+ | mips64orion | mips64orionel \
+ | mips64r5900 | mips64r5900el \
+ | mips64vr | mips64vrel \
+ | mips64vr4100 | mips64vr4100el \
+ | mips64vr4300 | mips64vr4300el \
+ | mips64vr5000 | mips64vr5000el \
+ | mips64vr5900 | mips64vr5900el \
+ | mipsisa32 | mipsisa32el \
+ | mipsisa32r2 | mipsisa32r2el \
+ | mipsisa32r6 | mipsisa32r6el \
+ | mipsisa64 | mipsisa64el \
+ | mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64r6 | mipsisa64r6el \
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
+ | mipsr5900 | mipsr5900el \
+ | mipstx39 | mipstx39el \
+ | mn10200 | mn10300 \
+ | moxie \
+ | mt \
+ | msp430 \
+ | nds32 | nds32le | nds32be \
+ | nios | nios2 | nios2eb | nios2el \
+ | ns16k | ns32k \
+ | open8 | or1k | or1knd | or32 \
+ | pdp10 | pj | pjl \
+ | powerpc | powerpc64 | powerpc64le | powerpcle \
+ | pru \
+ | pyramid \
+ | riscv32 | riscv64 \
+ | rl78 | rx \
+ | score \
+ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+ | sh64 | sh64le \
+ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+ | spu \
+ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
+ | ubicom32 \
+ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
+ | visium \
+ | wasm32 \
+ | x86 | xc16x | xstormy16 | xtensa \
+ | z8k | z80)
+ basic_machine=$basic_machine-unknown
+ ;;
+ c54x)
+ basic_machine=tic54x-unknown
+ ;;
+ c55x)
+ basic_machine=tic55x-unknown
+ ;;
+ c6x)
+ basic_machine=tic6x-unknown
;;
- op50n)
- cpu=hppa1.1
- vendor=oki
+ leon|leon[3-9])
+ basic_machine=sparc-$basic_machine
;;
- op60c)
- cpu=hppa1.1
- vendor=oki
+ m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
+ basic_machine=$basic_machine-unknown
+ os=-none
;;
- ibm*)
- cpu=i370
- vendor=ibm
+ m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65)
;;
- orion105)
- cpu=clipper
- vendor=highlevel
+ ms1)
+ basic_machine=mt-unknown
;;
- mac | mpw | mac-mpw)
- cpu=m68k
- vendor=apple
+
+ strongarm | thumb | xscale)
+ basic_machine=arm-unknown
;;
- pmac | pmac-mpw)
- cpu=powerpc
- vendor=apple
+ xgate)
+ basic_machine=$basic_machine-unknown
+ os=-none
+ ;;
+ xscaleeb)
+ basic_machine=armeb-unknown
+ ;;
+
+ xscaleel)
+ basic_machine=armel-unknown
;;
+ # We use `pc' rather than `unknown'
+ # because (1) that's what they normally are, and
+ # (2) the word "unknown" tends to confuse beginning users.
+ i*86 | x86_64)
+ basic_machine=$basic_machine-pc
+ ;;
+ # Object if more than one company name word.
+ *-*-*)
+ echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2
+ exit 1
+ ;;
+ # Recognize the basic CPU types with company name.
+ 580-* \
+ | a29k-* \
+ | aarch64-* | aarch64_be-* \
+ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
+ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \
+ | avr-* | avr32-* \
+ | ba-* \
+ | be32-* | be64-* \
+ | bfin-* | bs2000-* \
+ | c[123]* | c30-* | [cjt]90-* | c4x-* \
+ | c8051-* | clipper-* | craynv-* | cydra-* \
+ | d10v-* | d30v-* | dlx-* \
+ | e2k-* | elxsi-* \
+ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+ | h8300-* | h8500-* \
+ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+ | hexagon-* \
+ | i*86-* | i860-* | i960-* | ia16-* | ia64-* \
+ | ip2k-* | iq2000-* \
+ | k1om-* \
+ | le32-* | le64-* \
+ | lm32-* \
+ | m32c-* | m32r-* | m32rle-* \
+ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
+ | microblaze-* | microblazeel-* \
+ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+ | mips16-* \
+ | mips64-* | mips64el-* \
+ | mips64octeon-* | mips64octeonel-* \
+ | mips64orion-* | mips64orionel-* \
+ | mips64r5900-* | mips64r5900el-* \
+ | mips64vr-* | mips64vrel-* \
+ | mips64vr4100-* | mips64vr4100el-* \
+ | mips64vr4300-* | mips64vr4300el-* \
+ | mips64vr5000-* | mips64vr5000el-* \
+ | mips64vr5900-* | mips64vr5900el-* \
+ | mipsisa32-* | mipsisa32el-* \
+ | mipsisa32r2-* | mipsisa32r2el-* \
+ | mipsisa32r6-* | mipsisa32r6el-* \
+ | mipsisa64-* | mipsisa64el-* \
+ | mipsisa64r2-* | mipsisa64r2el-* \
+ | mipsisa64r6-* | mipsisa64r6el-* \
+ | mipsisa64sb1-* | mipsisa64sb1el-* \
+ | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+ | mipsr5900-* | mipsr5900el-* \
+ | mipstx39-* | mipstx39el-* \
+ | mmix-* \
+ | mt-* \
+ | msp430-* \
+ | nds32-* | nds32le-* | nds32be-* \
+ | nios-* | nios2-* | nios2eb-* | nios2el-* \
+ | none-* | np1-* | ns16k-* | ns32k-* \
+ | open8-* \
+ | or1k*-* \
+ | orion-* \
+ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
+ | pru-* \
+ | pyramid-* \
+ | riscv32-* | riscv64-* \
+ | rl78-* | romp-* | rs6000-* | rx-* \
+ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+ | sparclite-* \
+ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \
+ | tahoe-* \
+ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+ | tile*-* \
+ | tron-* \
+ | ubicom32-* \
+ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
+ | vax-* \
+ | visium-* \
+ | wasm32-* \
+ | we32k-* \
+ | x86-* | x86_64-* | xc16x-* | xps100-* \
+ | xstormy16-* | xtensa*-* \
+ | ymp-* \
+ | z8k-* | z80-*)
+ ;;
+ # Recognize the basic CPU types without company name, with glob match.
+ xtensa*)
+ basic_machine=$basic_machine-unknown
+ ;;
# Recognize the various machine names and aliases which stand
# for a CPU type and a company and sometimes even an OS.
+ 386bsd)
+ basic_machine=i386-pc
+ os=-bsd
+ ;;
3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
- cpu=m68000
- vendor=att
+ basic_machine=m68000-att
;;
3b*)
- cpu=we32k
- vendor=att
+ basic_machine=we32k-att
+ ;;
+ a29khif)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ abacus)
+ basic_machine=abacus-unknown
+ ;;
+ adobe68k)
+ basic_machine=m68010-adobe
+ os=-scout
+ ;;
+ alliant | fx80)
+ basic_machine=fx80-alliant
+ ;;
+ altos | altos3068)
+ basic_machine=m68k-altos
+ ;;
+ am29k)
+ basic_machine=a29k-none
+ os=-bsd
+ ;;
+ amd64)
+ basic_machine=x86_64-pc
+ ;;
+ amd64-*)
+ basic_machine=x86_64-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ ;;
+ amdahl)
+ basic_machine=580-amdahl
+ os=-sysv
+ ;;
+ amiga | amiga-*)
+ basic_machine=m68k-unknown
+ ;;
+ amigaos | amigados)
+ basic_machine=m68k-unknown
+ os=-amigaos
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-unknown
+ os=-sysv4
+ ;;
+ apollo68)
+ basic_machine=m68k-apollo
+ os=-sysv
+ ;;
+ apollo68bsd)
+ basic_machine=m68k-apollo
+ os=-bsd
+ ;;
+ aros)
+ basic_machine=i386-pc
+ os=-aros
+ ;;
+ asmjs)
+ basic_machine=asmjs-unknown
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ os=-aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ os=-dynix
+ ;;
+ blackfin)
+ basic_machine=bfin-unknown
+ os=-linux
+ ;;
+ blackfin-*)
+ basic_machine=bfin-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ os=-linux
;;
bluegene*)
- cpu=powerpc
- vendor=ibm
- os=cnk
+ basic_machine=powerpc-ibm
+ os=-cnk
+ ;;
+ c54x-*)
+ basic_machine=tic54x-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ ;;
+ c55x-*)
+ basic_machine=tic55x-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ ;;
+ c6x-*)
+ basic_machine=tic6x-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ ;;
+ c90)
+ basic_machine=c90-cray
+ os=-unicos
+ ;;
+ cegcc)
+ basic_machine=arm-unknown
+ os=-cegcc
+ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ os=-bsd
+ ;;
+ convex-c2)
+ basic_machine=c2-convex
+ os=-bsd
+ ;;
+ convex-c32)
+ basic_machine=c32-convex
+ os=-bsd
+ ;;
+ convex-c34)
+ basic_machine=c34-convex
+ os=-bsd
+ ;;
+ convex-c38)
+ basic_machine=c38-convex
+ os=-bsd
+ ;;
+ cray | j90)
+ basic_machine=j90-cray
+ os=-unicos
+ ;;
+ craynv)
+ basic_machine=craynv-cray
+ os=-unicosmp
+ ;;
+ cr16 | cr16-*)
+ basic_machine=cr16-unknown
+ os=-elf
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ ;;
+ crisv32 | crisv32-* | etraxfs*)
+ basic_machine=crisv32-axis
+ ;;
+ cris | cris-* | etrax*)
+ basic_machine=cris-axis
+ ;;
+ crx)
+ basic_machine=crx-unknown
+ os=-elf
+ ;;
+ da30 | da30-*)
+ basic_machine=m68k-da30
+ ;;
+ decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+ basic_machine=mips-dec
;;
decsystem10* | dec10*)
- cpu=pdp10
- vendor=dec
- os=tops10
+ basic_machine=pdp10-dec
+ os=-tops10
;;
decsystem20* | dec20*)
- cpu=pdp10
- vendor=dec
- os=tops20
+ basic_machine=pdp10-dec
+ os=-tops20
;;
delta | 3300 | motorola-3300 | motorola-delta \
| 3300-motorola | delta-motorola)
- cpu=m68k
- vendor=motorola
+ basic_machine=m68k-motorola
+ ;;
+ delta88)
+ basic_machine=m88k-motorola
+ os=-sysv3
+ ;;
+ dicos)
+ basic_machine=i686-pc
+ os=-dicos
+ ;;
+ djgpp)
+ basic_machine=i586-pc
+ os=-msdosdjgpp
+ ;;
+ dpx20 | dpx20-*)
+ basic_machine=rs6000-bull
+ os=-bosx
;;
dpx2*)
- cpu=m68k
- vendor=bull
- os=sysv3
+ basic_machine=m68k-bull
+ os=-sysv3
;;
- encore | umax | mmax)
- cpu=ns32k
- vendor=encore
+ e500v[12])
+ basic_machine=powerpc-unknown
+ os=$os"spe"
+ ;;
+ e500v[12]-*)
+ basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ os=$os"spe"
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ os=-ebmon
;;
elxsi)
- cpu=elxsi
- vendor=elxsi
- os=${os:-bsd}
+ basic_machine=elxsi-elxsi
+ os=-bsd
+ ;;
+ encore | umax | mmax)
+ basic_machine=ns32k-encore
+ ;;
+ es1800 | OSE68k | ose68k | ose | OSE)
+ basic_machine=m68k-ericsson
+ os=-ose
;;
fx2800)
- cpu=i860
- vendor=alliant
+ basic_machine=i860-alliant
;;
genix)
- cpu=ns32k
- vendor=ns
+ basic_machine=ns32k-ns
+ ;;
+ gmicro)
+ basic_machine=tron-gmicro
+ os=-sysv
+ ;;
+ go32)
+ basic_machine=i386-pc
+ os=-go32
;;
h3050r* | hiux*)
- cpu=hppa1.1
- vendor=hitachi
- os=hiuxwe2
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ h8300hms)
+ basic_machine=h8300-hitachi
+ os=-hms
+ ;;
+ h8300xray)
+ basic_machine=h8300-hitachi
+ os=-xray
+ ;;
+ h8500hms)
+ basic_machine=h8500-hitachi
+ os=-hms
+ ;;
+ harris)
+ basic_machine=m88k-harris
+ os=-sysv3
+ ;;
+ hp300-*)
+ basic_machine=m68k-hp
+ ;;
+ hp300bsd)
+ basic_machine=m68k-hp
+ os=-bsd
+ ;;
+ hp300hpux)
+ basic_machine=m68k-hp
+ os=-hpux
;;
hp3k9[0-9][0-9] | hp9[0-9][0-9])
- cpu=hppa1.0
- vendor=hp
+ basic_machine=hppa1.0-hp
;;
hp9k2[0-9][0-9] | hp9k31[0-9])
- cpu=m68000
- vendor=hp
+ basic_machine=m68000-hp
;;
hp9k3[2-9][0-9])
- cpu=m68k
- vendor=hp
+ basic_machine=m68k-hp
;;
hp9k6[0-9][0-9] | hp6[0-9][0-9])
- cpu=hppa1.0
- vendor=hp
+ basic_machine=hppa1.0-hp
;;
hp9k7[0-79][0-9] | hp7[0-79][0-9])
- cpu=hppa1.1
- vendor=hp
+ basic_machine=hppa1.1-hp
;;
hp9k78[0-9] | hp78[0-9])
# FIXME: really hppa2.0-hp
- cpu=hppa1.1
- vendor=hp
+ basic_machine=hppa1.1-hp
;;
hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
# FIXME: really hppa2.0-hp
- cpu=hppa1.1
- vendor=hp
+ basic_machine=hppa1.1-hp
;;
hp9k8[0-9][13679] | hp8[0-9][13679])
- cpu=hppa1.1
- vendor=hp
+ basic_machine=hppa1.1-hp
;;
hp9k8[0-9][0-9] | hp8[0-9][0-9])
- cpu=hppa1.0
- vendor=hp
+ basic_machine=hppa1.0-hp
+ ;;
+ hppaosf)
+ basic_machine=hppa1.1-hp
+ os=-osf
+ ;;
+ hppro)
+ basic_machine=hppa1.1-hp
+ os=-proelf
+ ;;
+ i370-ibm* | ibm*)
+ basic_machine=i370-ibm
;;
i*86v32)
- cpu=`echo "$1" | sed -e 's/86.*/86/'`
- vendor=pc
- os=sysv32
+ basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`
+ os=-sysv32
;;
i*86v4*)
- cpu=`echo "$1" | sed -e 's/86.*/86/'`
- vendor=pc
- os=sysv4
+ basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`
+ os=-sysv4
;;
i*86v)
- cpu=`echo "$1" | sed -e 's/86.*/86/'`
- vendor=pc
- os=sysv
+ basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`
+ os=-sysv
;;
i*86sol2)
- cpu=`echo "$1" | sed -e 's/86.*/86/'`
- vendor=pc
- os=solaris2
+ basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`
+ os=-solaris2
;;
- j90 | j90-cray)
- cpu=j90
- vendor=cray
- os=${os:-unicos}
+ i386mach)
+ basic_machine=i386-mach
+ os=-mach
+ ;;
+ vsta)
+ basic_machine=i386-unknown
+ os=-vsta
;;
iris | iris4d)
- cpu=mips
- vendor=sgi
+ basic_machine=mips-sgi
case $os in
- irix*)
+ -irix*)
;;
*)
- os=irix4
+ os=-irix4
;;
esac
;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ os=-sysv
+ ;;
+ leon-*|leon[3-9]-*)
+ basic_machine=sparc-`echo "$basic_machine" | sed 's/-.*//'`
+ ;;
+ m68knommu)
+ basic_machine=m68k-unknown
+ os=-linux
+ ;;
+ m68knommu-*)
+ basic_machine=m68k-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ os=-linux
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ os=-sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ os=-sysv
+ ;;
+ microblaze*)
+ basic_machine=microblaze-xilinx
+ ;;
+ mingw64)
+ basic_machine=x86_64-pc
+ os=-mingw64
+ ;;
+ mingw32)
+ basic_machine=i686-pc
+ os=-mingw32
+ ;;
+ mingw32ce)
+ basic_machine=arm-unknown
+ os=-mingw32ce
+ ;;
miniframe)
- cpu=m68000
- vendor=convergent
+ basic_machine=m68000-convergent
+ ;;
+ *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+ mips3*-*)
+ basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`
+ ;;
+ mips3*)
+ basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`-unknown
+ ;;
+ monitor)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ morphos)
+ basic_machine=powerpc-unknown
+ os=-morphos
+ ;;
+ moxiebox)
+ basic_machine=moxie-unknown
+ os=-moxiebox
+ ;;
+ msdos)
+ basic_machine=i386-pc
+ os=-msdos
+ ;;
+ ms1-*)
+ basic_machine=`echo "$basic_machine" | sed -e 's/ms1-/mt-/'`
+ ;;
+ msys)
+ basic_machine=i686-pc
+ os=-msys
+ ;;
+ mvs)
+ basic_machine=i370-ibm
+ os=-mvs
+ ;;
+ nacl)
+ basic_machine=le32-unknown
+ os=-nacl
;;
- *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*)
- cpu=m68k
- vendor=atari
- os=mint
+ ncr3000)
+ basic_machine=i486-ncr
+ os=-sysv4
+ ;;
+ netbsd386)
+ basic_machine=i386-unknown
+ os=-netbsd
+ ;;
+ netwinder)
+ basic_machine=armv4l-rebel
+ os=-linux
+ ;;
+ news | news700 | news800 | news900)
+ basic_machine=m68k-sony
+ os=-newsos
+ ;;
+ news1000)
+ basic_machine=m68030-sony
+ os=-newsos
;;
news-3600 | risc-news)
- cpu=mips
- vendor=sony
- os=newsos
+ basic_machine=mips-sony
+ os=-newsos
+ ;;
+ necv70)
+ basic_machine=v70-nec
+ os=-sysv
;;
next | m*-next)
- cpu=m68k
- vendor=next
+ basic_machine=m68k-next
case $os in
- nextstep* )
+ -nextstep* )
;;
- ns2*)
- os=nextstep2
+ -ns2*)
+ os=-nextstep2
;;
*)
- os=nextstep3
+ os=-nextstep3
;;
esac
;;
+ nh3000)
+ basic_machine=m68k-harris
+ os=-cxux
+ ;;
+ nh[45]000)
+ basic_machine=m88k-harris
+ os=-cxux
+ ;;
+ nindy960)
+ basic_machine=i960-intel
+ os=-nindy
+ ;;
+ mon960)
+ basic_machine=i960-intel
+ os=-mon960
+ ;;
+ nonstopux)
+ basic_machine=mips-compaq
+ os=-nonstopux
+ ;;
np1)
- cpu=np1
- vendor=gould
+ basic_machine=np1-gould
+ ;;
+ neo-tandem)
+ basic_machine=neo-tandem
+ ;;
+ nse-tandem)
+ basic_machine=nse-tandem
+ ;;
+ nsr-tandem)
+ basic_machine=nsr-tandem
+ ;;
+ nsv-tandem)
+ basic_machine=nsv-tandem
+ ;;
+ nsx-tandem)
+ basic_machine=nsx-tandem
;;
op50n-* | op60c-*)
- cpu=hppa1.1
- vendor=oki
- os=proelf
+ basic_machine=hppa1.1-oki
+ os=-proelf
+ ;;
+ openrisc | openrisc-*)
+ basic_machine=or32-unknown
+ ;;
+ os400)
+ basic_machine=powerpc-ibm
+ os=-os400
+ ;;
+ OSE68000 | ose68000)
+ basic_machine=m68000-ericsson
+ os=-ose
+ ;;
+ os68k)
+ basic_machine=m68k-none
+ os=-os68k
;;
pa-hitachi)
- cpu=hppa1.1
- vendor=hitachi
- os=hiuxwe2
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ paragon)
+ basic_machine=i860-intel
+ os=-osf
+ ;;
+ parisc)
+ basic_machine=hppa-unknown
+ os=-linux
+ ;;
+ parisc-*)
+ basic_machine=hppa-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ os=-linux
;;
pbd)
- cpu=sparc
- vendor=tti
+ basic_machine=sparc-tti
;;
pbb)
- cpu=m68k
- vendor=tti
+ basic_machine=m68k-tti
+ ;;
+ pc532 | pc532-*)
+ basic_machine=ns32k-pc532
+ ;;
+ pc98)
+ basic_machine=i386-pc
+ ;;
+ pc98-*)
+ basic_machine=i386-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ ;;
+ pentium | p5 | k5 | k6 | nexgen | viac3)
+ basic_machine=i586-pc
+ ;;
+ pentiumpro | p6 | 6x86 | athlon | athlon_*)
+ basic_machine=i686-pc
+ ;;
+ pentiumii | pentium2 | pentiumiii | pentium3)
+ basic_machine=i686-pc
+ ;;
+ pentium4)
+ basic_machine=i786-pc
+ ;;
+ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+ basic_machine=i586-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ ;;
+ pentiumpro-* | p6-* | 6x86-* | athlon-*)
+ basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'`
;;
- pc532)
- cpu=ns32k
- vendor=pc532
+ pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+ basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ ;;
+ pentium4-*)
+ basic_machine=i786-`echo "$basic_machine" | sed 's/^[^-]*-//'`
;;
pn)
- cpu=pn
- vendor=gould
+ basic_machine=pn-gould
;;
- power)
- cpu=power
- vendor=ibm
+ power) basic_machine=power-ibm
;;
- ps2)
- cpu=i386
- vendor=ibm
+ ppc | ppcbe) basic_machine=powerpc-unknown
;;
- rm[46]00)
- cpu=mips
- vendor=siemens
+ ppc-* | ppcbe-*)
+ basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'`
;;
- rtpc | rtpc-*)
- cpu=romp
- vendor=ibm
+ ppcle | powerpclittle)
+ basic_machine=powerpcle-unknown
;;
- sde)
- cpu=mipsisa32
- vendor=sde
- os=${os:-elf}
+ ppcle-* | powerpclittle-*)
+ basic_machine=powerpcle-`echo "$basic_machine" | sed 's/^[^-]*-//'`
;;
- simso-wrs)
- cpu=sparclite
- vendor=wrs
- os=vxworks
+ ppc64) basic_machine=powerpc64-unknown
;;
- tower | tower-32)
- cpu=m68k
- vendor=ncr
+ ppc64-*) basic_machine=powerpc64-`echo "$basic_machine" | sed 's/^[^-]*-//'`
;;
- vpp*|vx|vx-*)
- cpu=f301
- vendor=fujitsu
+ ppc64le | powerpc64little)
+ basic_machine=powerpc64le-unknown
+ ;;
+ ppc64le-* | powerpc64little-*)
+ basic_machine=powerpc64le-`echo "$basic_machine" | sed 's/^[^-]*-//'`
;;
- w65)
- cpu=w65
- vendor=wdc
+ ps2)
+ basic_machine=i386-ibm
;;
- w89k-*)
- cpu=hppa1.1
- vendor=winbond
- os=proelf
+ pw32)
+ basic_machine=i586-unknown
+ os=-pw32
;;
- none)
- cpu=none
- vendor=none
+ rdos | rdos64)
+ basic_machine=x86_64-pc
+ os=-rdos
;;
- leon|leon[3-9])
- cpu=sparc
- vendor=$basic_machine
+ rdos32)
+ basic_machine=i386-pc
+ os=-rdos
;;
- leon-*|leon[3-9]-*)
- cpu=sparc
- vendor=`echo "$basic_machine" | sed 's/-.*//'`
+ rom68k)
+ basic_machine=m68k-rom68k
+ os=-coff
;;
-
- *-*)
- # shellcheck disable=SC2162
- IFS="-" read cpu vendor <<EOF
-$basic_machine
-EOF
+ rm[46]00)
+ basic_machine=mips-siemens
;;
- # We use `pc' rather than `unknown'
- # because (1) that's what they normally are, and
- # (2) the word "unknown" tends to confuse beginning users.
- i*86 | x86_64)
- cpu=$basic_machine
- vendor=pc
+ rtpc | rtpc-*)
+ basic_machine=romp-ibm
;;
- # These rules are duplicated from below for sake of the special case above;
- # i.e. things that normalized to x86 arches should also default to "pc"
- pc98)
- cpu=i386
- vendor=pc
+ s390 | s390-*)
+ basic_machine=s390-ibm
;;
- x64 | amd64)
- cpu=x86_64
- vendor=pc
+ s390x | s390x-*)
+ basic_machine=s390x-ibm
;;
- # Recognize the basic CPU types without company name.
- *)
- cpu=$basic_machine
- vendor=unknown
+ sa29200)
+ basic_machine=a29k-amd
+ os=-udi
;;
-esac
-
-unset -v basic_machine
-
-# Decode basic machines in the full and proper CPU-Company form.
-case $cpu-$vendor in
- # Here we handle the default manufacturer of certain CPU types in canonical form. It is in
- # some cases the only manufacturer, in others, it is the most popular.
- craynv-unknown)
- vendor=cray
- os=${os:-unicosmp}
+ sb1)
+ basic_machine=mipsisa64sb1-unknown
;;
- c90-unknown | c90-cray)
- vendor=cray
- os=${os:-unicos}
+ sb1el)
+ basic_machine=mipsisa64sb1el-unknown
;;
- fx80-unknown)
- vendor=alliant
+ sde)
+ basic_machine=mipsisa32-sde
+ os=-elf
;;
- romp-unknown)
- vendor=ibm
+ sei)
+ basic_machine=mips-sei
+ os=-seiux
;;
- mmix-unknown)
- vendor=knuth
+ sequent)
+ basic_machine=i386-sequent
;;
- microblaze-unknown | microblazeel-unknown)
- vendor=xilinx
+ sh5el)
+ basic_machine=sh5le-unknown
;;
- rs6000-unknown)
- vendor=ibm
+ simso-wrs)
+ basic_machine=sparclite-wrs
+ os=-vxworks
;;
- vax-unknown)
- vendor=dec
+ sps7)
+ basic_machine=m68k-bull
+ os=-sysv2
;;
- pdp11-unknown)
- vendor=dec
+ spur)
+ basic_machine=spur-unknown
;;
- we32k-unknown)
- vendor=att
+ st2000)
+ basic_machine=m68k-tandem
;;
- cydra-unknown)
- vendor=cydrome
+ stratus)
+ basic_machine=i860-stratus
+ os=-sysv4
;;
- i370-ibm*)
- vendor=ibm
+ strongarm-* | thumb-*)
+ basic_machine=arm-`echo "$basic_machine" | sed 's/^[^-]*-//'`
;;
- orion-unknown)
- vendor=highlevel
+ sun2)
+ basic_machine=m68000-sun
;;
- xps-unknown | xps100-unknown)
- cpu=xps100
- vendor=honeywell
+ sun2os3)
+ basic_machine=m68000-sun
+ os=-sunos3
;;
-
- # Here we normalize CPU types with a missing or matching vendor
- dpx20-unknown | dpx20-bull)
- cpu=rs6000
- vendor=bull
- os=${os:-bosx}
+ sun2os4)
+ basic_machine=m68000-sun
+ os=-sunos4
;;
-
- # Here we normalize CPU types irrespective of the vendor
- amd64-*)
- cpu=x86_64
+ sun3os3)
+ basic_machine=m68k-sun
+ os=-sunos3
;;
- blackfin-*)
- cpu=bfin
- os=linux
+ sun3os4)
+ basic_machine=m68k-sun
+ os=-sunos4
;;
- c54x-*)
- cpu=tic54x
+ sun4os3)
+ basic_machine=sparc-sun
+ os=-sunos3
;;
- c55x-*)
- cpu=tic55x
+ sun4os4)
+ basic_machine=sparc-sun
+ os=-sunos4
;;
- c6x-*)
- cpu=tic6x
+ sun4sol2)
+ basic_machine=sparc-sun
+ os=-solaris2
;;
- e500v[12]-*)
- cpu=powerpc
- os=$os"spe"
+ sun3 | sun3-*)
+ basic_machine=m68k-sun
;;
- mips3*-*)
- cpu=mips64
+ sun4)
+ basic_machine=sparc-sun
;;
- ms1-*)
- cpu=mt
+ sun386 | sun386i | roadrunner)
+ basic_machine=i386-sun
;;
- m68knommu-*)
- cpu=m68k
- os=linux
+ sv1)
+ basic_machine=sv1-cray
+ os=-unicos
;;
- m9s12z-* | m68hcs12z-* | hcs12z-* | s12z-*)
- cpu=s12z
+ symmetry)
+ basic_machine=i386-sequent
+ os=-dynix
;;
- openrisc-*)
- cpu=or32
+ t3e)
+ basic_machine=alphaev5-cray
+ os=-unicos
;;
- parisc-*)
- cpu=hppa
- os=linux
+ t90)
+ basic_machine=t90-cray
+ os=-unicos
;;
- pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
- cpu=i586
+ tile*)
+ basic_machine=$basic_machine-unknown
+ os=-linux-gnu
;;
- pentiumpro-* | p6-* | 6x86-* | athlon-* | athalon_*-*)
- cpu=i686
+ tx39)
+ basic_machine=mipstx39-unknown
;;
- pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
- cpu=i686
+ tx39el)
+ basic_machine=mipstx39el-unknown
;;
- pentium4-*)
- cpu=i786
+ toad1)
+ basic_machine=pdp10-xkl
+ os=-tops20
;;
- pc98-*)
- cpu=i386
+ tower | tower-32)
+ basic_machine=m68k-ncr
;;
- ppc-* | ppcbe-*)
- cpu=powerpc
+ tpf)
+ basic_machine=s390x-ibm
+ os=-tpf
;;
- ppcle-* | powerpclittle-*)
- cpu=powerpcle
+ udi29k)
+ basic_machine=a29k-amd
+ os=-udi
;;
- ppc64-*)
- cpu=powerpc64
+ ultra3)
+ basic_machine=a29k-nyu
+ os=-sym1
;;
- ppc64le-* | powerpc64little-*)
- cpu=powerpc64le
+ v810 | necv810)
+ basic_machine=v810-nec
+ os=-none
;;
- sb1-*)
- cpu=mipsisa64sb1
+ vaxv)
+ basic_machine=vax-dec
+ os=-sysv
;;
- sb1el-*)
- cpu=mipsisa64sb1el
+ vms)
+ basic_machine=vax-dec
+ os=-vms
;;
- sh5e[lb]-*)
- cpu=`echo "$cpu" | sed 's/^\(sh.\)e\(.\)$/\1\2e/'`
+ vpp*|vx|vx-*)
+ basic_machine=f301-fujitsu
;;
- spur-*)
- cpu=spur
+ vxworks960)
+ basic_machine=i960-wrs
+ os=-vxworks
;;
- strongarm-* | thumb-*)
- cpu=arm
+ vxworks68)
+ basic_machine=m68k-wrs
+ os=-vxworks
+ ;;
+ vxworks29k)
+ basic_machine=a29k-wrs
+ os=-vxworks
;;
- tx39-*)
- cpu=mipstx39
+ w65*)
+ basic_machine=w65-wdc
+ os=-none
;;
- tx39el-*)
- cpu=mipstx39el
+ w89k-*)
+ basic_machine=hppa1.1-winbond
+ os=-proelf
;;
- x64-*)
- cpu=x86_64
+ x64)
+ basic_machine=x86_64-pc
+ ;;
+ xbox)
+ basic_machine=i686-pc
+ os=-mingw32
+ ;;
+ xps | xps100)
+ basic_machine=xps100-honeywell
;;
xscale-* | xscalee[bl]-*)
- cpu=`echo "$cpu" | sed 's/^xscale/arm/'`
+ basic_machine=`echo "$basic_machine" | sed 's/^xscale/arm/'`
+ ;;
+ ymp)
+ basic_machine=ymp-cray
+ os=-unicos
+ ;;
+ none)
+ basic_machine=none-none
+ os=-none
;;
- # Recognize the canonical CPU Types that limit and/or modify the
- # company names they are paired with.
- cr16-*)
- os=${os:-elf}
+# Here we handle the default manufacturer of certain CPU types. It is in
+# some cases the only manufacturer, in others, it is the most popular.
+ w89k)
+ basic_machine=hppa1.1-winbond
;;
- crisv32-* | etraxfs*-*)
- cpu=crisv32
- vendor=axis
+ op50n)
+ basic_machine=hppa1.1-oki
;;
- cris-* | etrax*-*)
- cpu=cris
- vendor=axis
+ op60c)
+ basic_machine=hppa1.1-oki
;;
- crx-*)
- os=${os:-elf}
+ romp)
+ basic_machine=romp-ibm
;;
- neo-tandem)
- cpu=neo
- vendor=tandem
+ mmix)
+ basic_machine=mmix-knuth
;;
- nse-tandem)
- cpu=nse
- vendor=tandem
+ rs6000)
+ basic_machine=rs6000-ibm
;;
- nsr-tandem)
- cpu=nsr
- vendor=tandem
+ vax)
+ basic_machine=vax-dec
;;
- nsv-tandem)
- cpu=nsv
- vendor=tandem
+ pdp11)
+ basic_machine=pdp11-dec
;;
- nsx-tandem)
- cpu=nsx
- vendor=tandem
+ we32k)
+ basic_machine=we32k-att
;;
- s390-*)
- cpu=s390
- vendor=ibm
+ sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
+ basic_machine=sh-unknown
;;
- s390x-*)
- cpu=s390x
- vendor=ibm
+ cydra)
+ basic_machine=cydra-cydrome
;;
- tile*-*)
- os=${os:-linux-gnu}
+ orion)
+ basic_machine=orion-highlevel
+ ;;
+ orion105)
+ basic_machine=clipper-highlevel
+ ;;
+ mac | mpw | mac-mpw)
+ basic_machine=m68k-apple
+ ;;
+ pmac | pmac-mpw)
+ basic_machine=powerpc-apple
+ ;;
+ *-unknown)
+ # Make sure to match an already-canonicalized machine name.
;;
-
*)
- # Recognize the canonical CPU types that are allowed with any
- # company name.
- case $cpu in
- 1750a | 580 \
- | a29k \
- | aarch64 | aarch64_be \
- | abacus \
- | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \
- | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \
- | alphapca5[67] | alpha64pca5[67] \
- | am33_2.0 \
- | amdgcn \
- | arc | arceb \
- | arm | arm[lb]e | arme[lb] | armv* \
- | avr | avr32 \
- | asmjs \
- | ba \
- | be32 | be64 \
- | bfin | bs2000 \
- | c[123]* | c30 | [cjt]90 | c4x \
- | c8051 | clipper | craynv | csky | cydra \
- | d10v | d30v | dlx | dsp16xx \
- | e2k | elxsi | epiphany \
- | f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \
- | h8300 | h8500 \
- | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
- | hexagon \
- | i370 | i*86 | i860 | i960 | ia16 | ia64 \
- | ip2k | iq2000 \
- | k1om \
- | le32 | le64 \
- | lm32 \
- | m32c | m32r | m32rle \
- | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
- | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \
- | m88110 | m88k | maxq | mb | mcore | mep | metag \
- | microblaze | microblazeel \
- | mips | mipsbe | mipseb | mipsel | mipsle \
- | mips16 \
- | mips64 | mips64eb | mips64el \
- | mips64octeon | mips64octeonel \
- | mips64orion | mips64orionel \
- | mips64r5900 | mips64r5900el \
- | mips64vr | mips64vrel \
- | mips64vr4100 | mips64vr4100el \
- | mips64vr4300 | mips64vr4300el \
- | mips64vr5000 | mips64vr5000el \
- | mips64vr5900 | mips64vr5900el \
- | mipsisa32 | mipsisa32el \
- | mipsisa32r2 | mipsisa32r2el \
- | mipsisa32r6 | mipsisa32r6el \
- | mipsisa64 | mipsisa64el \
- | mipsisa64r2 | mipsisa64r2el \
- | mipsisa64r6 | mipsisa64r6el \
- | mipsisa64sb1 | mipsisa64sb1el \
- | mipsisa64sr71k | mipsisa64sr71kel \
- | mipsr5900 | mipsr5900el \
- | mipstx39 | mipstx39el \
- | mmix \
- | mn10200 | mn10300 \
- | moxie \
- | mt \
- | msp430 \
- | nds32 | nds32le | nds32be \
- | nfp \
- | nios | nios2 | nios2eb | nios2el \
- | none | np1 | ns16k | ns32k | nvptx \
- | open8 \
- | or1k* \
- | or32 \
- | orion \
- | picochip \
- | pdp10 | pdp11 | pj | pjl | pn | power \
- | powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \
- | pru \
- | pyramid \
- | riscv | riscv32 | riscv64 \
- | rl78 | romp | rs6000 | rx \
- | score \
- | sh | shl \
- | sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \
- | sh[1234]e[lb] | sh[12345][lb]e | sh[23]ele | sh64 | sh64le \
- | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet \
- | sparclite \
- | sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \
- | spu \
- | tahoe \
- | tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \
- | tron \
- | ubicom32 \
- | v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \
- | vax \
- | visium \
- | w65 | wasm32 \
- | we32k \
- | x86 | x86_64 | xc16x | xgate | xps100 \
- | xstormy16 | xtensa* \
- | ymp \
- | z8k | z80)
- ;;
-
- *)
- echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2
- exit 1
- ;;
- esac
+ echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2
+ exit 1
;;
esac
# Here we canonicalize certain aliases for manufacturers.
-case $vendor in
- digital*)
- vendor=dec
+case $basic_machine in
+ *-digital*)
+ basic_machine=`echo "$basic_machine" | sed 's/digital.*/dec/'`
;;
- commodore*)
- vendor=cbm
+ *-commodore*)
+ basic_machine=`echo "$basic_machine" | sed 's/commodore.*/cbm/'`
;;
*)
;;
@@ -1275,245 +1334,199 @@ esac
# Decode manufacturer-specific aliases for certain operating systems.
-if [ x$os != x ]
+if [ x"$os" != x"" ]
then
case $os in
# First match some system type aliases that might get confused
# with valid system types.
- # solaris* is a basic system type, with this one exception.
- auroraux)
- os=auroraux
+ # -solaris* is a basic system type, with this one exception.
+ -auroraux)
+ os=-auroraux
;;
- bluegene*)
- os=cnk
- ;;
- solaris1 | solaris1.*)
+ -solaris1 | -solaris1.*)
os=`echo $os | sed -e 's|solaris1|sunos4|'`
;;
- solaris)
- os=solaris2
+ -solaris)
+ os=-solaris2
;;
- unixware*)
- os=sysv4.2uw
+ -unixware*)
+ os=-sysv4.2uw
;;
- gnu/linux*)
+ -gnu/linux*)
os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
;;
# es1800 is here to avoid being matched by es* (a different OS)
- es1800*)
- os=ose
- ;;
- # Some version numbers need modification
- chorusos*)
- os=chorusos
- ;;
- isc)
- os=isc2.2
- ;;
- sco6)
- os=sco5v6
- ;;
- sco5)
- os=sco3.2v5
- ;;
- sco4)
- os=sco3.2v4
- ;;
- sco3.2.[4-9]*)
- os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
- ;;
- sco3.2v[4-9]* | sco5v6*)
- # Don't forget version if it is 3.2v4 or newer.
- ;;
- scout)
- # Don't match below
- ;;
- sco*)
- os=sco3.2v2
- ;;
- psos*)
- os=psos
+ -es1800*)
+ os=-ose
;;
# Now accept the basic system types.
# The portable systems comes first.
# Each alternative MUST end in a * to match a version number.
- # sysv* is not here because it comes later, after sysvr4.
- gnu* | bsd* | mach* | minix* | genix* | ultrix* | irix* \
- | *vms* | esix* | aix* | cnk* | sunos | sunos[34]*\
- | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \
- | sym* | kopensolaris* | plan9* \
- | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \
- | aos* | aros* | cloudabi* | sortix* \
- | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \
- | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \
- | knetbsd* | mirbsd* | netbsd* \
- | bitrig* | openbsd* | solidbsd* | libertybsd* \
- | ekkobsd* | kfreebsd* | freebsd* | riscix* | lynxos* \
- | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \
- | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \
- | udi* | eabi* | lites* | ieee* | go32* | aux* | hcos* \
- | chorusrdb* | cegcc* | glidix* \
- | cygwin* | msys* | pe* | moss* | proelf* | rtems* \
- | midipix* | mingw32* | mingw64* | linux-gnu* | linux-android* \
- | linux-newlib* | linux-musl* | linux-uclibc* \
- | uxpv* | beos* | mpeix* | udk* | moxiebox* \
- | interix* | uwin* | mks* | rhapsody* | darwin* \
- | openstep* | oskit* | conix* | pw32* | nonstopux* \
- | storm-chaos* | tops10* | tenex* | tops20* | its* \
- | os2* | vos* | palmos* | uclinux* | nucleus* \
- | morphos* | superux* | rtmk* | windiss* \
- | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \
- | skyos* | haiku* | rdos* | toppers* | drops* | es* \
- | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
- | midnightbsd* | amdhsa* | unleashed* | emscripten*)
+ # -sysv* is not here because it comes later, after sysvr4.
+ -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
+ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
+ | -sym* | -kopensolaris* | -plan9* \
+ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+ | -aos* | -aros* | -cloudabi* | -sortix* \
+ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+ | -hiux* | -knetbsd* | -mirbsd* | -netbsd* \
+ | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \
+ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* | -hcos* \
+ | -chorusos* | -chorusrdb* | -cegcc* | -glidix* \
+ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+ | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
+ | -linux-newlib* | -linux-musl* | -linux-uclibc* \
+ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
+ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* \
+ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+ | -morphos* | -superux* | -rtmk* | -windiss* \
+ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \
+ | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox* | -bme* \
+ | -midnightbsd*)
# Remember, each alternative MUST END IN *, to match a version number.
;;
- qnx*)
- case $cpu in
- x86 | i*86)
+ -qnx*)
+ case $basic_machine in
+ x86-* | i*86-*)
;;
*)
- os=nto-$os
+ os=-nto$os
;;
esac
;;
- hiux*)
- os=hiuxwe2
- ;;
- nto-qnx*)
+ -nto-qnx*)
;;
- nto*)
+ -nto*)
os=`echo $os | sed -e 's|nto|nto-qnx|'`
;;
- sim | xray | os68k* | v88r* \
- | windows* | osx | abug | netware* | os9* \
- | macos* | mpw* | magic* | mmixware* | mon960* | lnews*)
- ;;
- linux-dietlibc)
- os=linux-dietlibc
- ;;
- linux*)
- os=`echo $os | sed -e 's|linux|linux-gnu|'`
- ;;
- lynx*178)
- os=lynxos178
+ -sim | -xray | -os68k* | -v88r* \
+ | -windows* | -osx | -abug | -netware* | -os9* \
+ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
;;
- lynx*5)
- os=lynxos5
- ;;
- lynx*)
- os=lynxos
- ;;
- mac*)
+ -mac*)
os=`echo "$os" | sed -e 's|mac|macos|'`
;;
- opened*)
- os=openedition
+ -linux-dietlibc)
+ os=-linux-dietlibc
;;
- os400*)
- os=os400
+ -linux*)
+ os=`echo $os | sed -e 's|linux|linux-gnu|'`
;;
- sunos5*)
+ -sunos5*)
os=`echo "$os" | sed -e 's|sunos5|solaris2|'`
;;
- sunos6*)
+ -sunos6*)
os=`echo "$os" | sed -e 's|sunos6|solaris3|'`
;;
- wince*)
- os=wince
+ -opened*)
+ os=-openedition
;;
- utek*)
- os=bsd
+ -os400*)
+ os=-os400
;;
- dynix*)
- os=bsd
+ -wince*)
+ os=-wince
;;
- acis*)
- os=aos
+ -utek*)
+ os=-bsd
;;
- atheos*)
- os=atheos
+ -dynix*)
+ os=-bsd
;;
- syllable*)
- os=syllable
+ -acis*)
+ os=-aos
;;
- 386bsd)
- os=bsd
+ -atheos*)
+ os=-atheos
;;
- ctix* | uts*)
- os=sysv
+ -syllable*)
+ os=-syllable
;;
- nova*)
- os=rtmk-nova
+ -386bsd)
+ os=-bsd
;;
- ns2)
- os=nextstep2
+ -ctix* | -uts*)
+ os=-sysv
;;
- nsk*)
- os=nsk
+ -nova*)
+ os=-rtmk-nova
+ ;;
+ -ns2)
+ os=-nextstep2
+ ;;
+ -nsk*)
+ os=-nsk
;;
# Preserve the version number of sinix5.
- sinix5.*)
+ -sinix5.*)
os=`echo $os | sed -e 's|sinix|sysv|'`
;;
- sinix*)
- os=sysv4
+ -sinix*)
+ os=-sysv4
;;
- tpf*)
- os=tpf
+ -tpf*)
+ os=-tpf
;;
- triton*)
- os=sysv3
+ -triton*)
+ os=-sysv3
;;
- oss*)
- os=sysv3
+ -oss*)
+ os=-sysv3
;;
- svr4*)
- os=sysv4
+ -svr4*)
+ os=-sysv4
;;
- svr3)
- os=sysv3
+ -svr3)
+ os=-sysv3
;;
- sysvr4)
- os=sysv4
+ -sysvr4)
+ os=-sysv4
;;
- # This must come after sysvr4.
- sysv*)
+ # This must come after -sysvr4.
+ -sysv*)
;;
- ose*)
- os=ose
+ -ose*)
+ os=-ose
;;
- *mint | mint[0-9]* | *MiNT | MiNT[0-9]*)
- os=mint
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ os=-mint
;;
- zvmoe)
- os=zvmoe
+ -zvmoe)
+ os=-zvmoe
;;
- dicos*)
- os=dicos
+ -dicos*)
+ os=-dicos
;;
- pikeos*)
+ -pikeos*)
# Until real need of OS specific support for
# particular features comes up, bare metal
# configurations are quite functional.
- case $cpu in
+ case $basic_machine in
arm*)
- os=eabi
+ os=-eabi
;;
*)
- os=elf
+ os=-elf
;;
esac
;;
- nacl*)
+ -nacl*)
;;
- ios)
+ -ios)
;;
- none)
- ;;
- *-eabi)
+ -none)
;;
*)
+ # Get rid of the `-' at the beginning of $os.
+ os=`echo $os | sed 's/[^-]*-//'`
echo Invalid configuration \`"$1"\': system \`"$os"\' not recognized 1>&2
exit 1
;;
@@ -1530,261 +1543,254 @@ else
# will signal an error saying that MANUFACTURER isn't an operating
# system, and we'll never get to this point.
-case $cpu-$vendor in
+case $basic_machine in
score-*)
- os=elf
+ os=-elf
;;
spu-*)
- os=elf
+ os=-elf
;;
*-acorn)
- os=riscix1.2
+ os=-riscix1.2
;;
arm*-rebel)
- os=linux
+ os=-linux
;;
arm*-semi)
- os=aout
+ os=-aout
;;
c4x-* | tic4x-*)
- os=coff
+ os=-coff
;;
c8051-*)
- os=elf
- ;;
- clipper-intergraph)
- os=clix
+ os=-elf
;;
hexagon-*)
- os=elf
+ os=-elf
;;
tic54x-*)
- os=coff
+ os=-coff
;;
tic55x-*)
- os=coff
+ os=-coff
;;
tic6x-*)
- os=coff
+ os=-coff
;;
# This must come before the *-dec entry.
pdp10-*)
- os=tops20
+ os=-tops20
;;
pdp11-*)
- os=none
+ os=-none
;;
*-dec | vax-*)
- os=ultrix4.2
+ os=-ultrix4.2
;;
m68*-apollo)
- os=domain
+ os=-domain
;;
i386-sun)
- os=sunos4.0.2
+ os=-sunos4.0.2
;;
m68000-sun)
- os=sunos3
+ os=-sunos3
;;
m68*-cisco)
- os=aout
+ os=-aout
;;
mep-*)
- os=elf
+ os=-elf
;;
mips*-cisco)
- os=elf
+ os=-elf
;;
mips*-*)
- os=elf
+ os=-elf
;;
or32-*)
- os=coff
+ os=-coff
;;
*-tti) # must be before sparc entry or we get the wrong os.
- os=sysv3
+ os=-sysv3
;;
sparc-* | *-sun)
- os=sunos4.1.1
+ os=-sunos4.1.1
;;
pru-*)
- os=elf
+ os=-elf
;;
*-be)
- os=beos
+ os=-beos
;;
*-ibm)
- os=aix
+ os=-aix
;;
*-knuth)
- os=mmixware
+ os=-mmixware
;;
*-wec)
- os=proelf
+ os=-proelf
;;
*-winbond)
- os=proelf
+ os=-proelf
;;
*-oki)
- os=proelf
+ os=-proelf
;;
*-hp)
- os=hpux
+ os=-hpux
;;
*-hitachi)
- os=hiux
+ os=-hiux
;;
i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
- os=sysv
+ os=-sysv
;;
*-cbm)
- os=amigaos
+ os=-amigaos
;;
*-dg)
- os=dgux
+ os=-dgux
;;
*-dolphin)
- os=sysv3
+ os=-sysv3
;;
m68k-ccur)
- os=rtu
+ os=-rtu
;;
m88k-omron*)
- os=luna
+ os=-luna
;;
*-next)
- os=nextstep
+ os=-nextstep
;;
*-sequent)
- os=ptx
+ os=-ptx
;;
*-crds)
- os=unos
+ os=-unos
;;
*-ns)
- os=genix
+ os=-genix
;;
i370-*)
- os=mvs
+ os=-mvs
;;
*-gould)
- os=sysv
+ os=-sysv
;;
*-highlevel)
- os=bsd
+ os=-bsd
;;
*-encore)
- os=bsd
+ os=-bsd
;;
*-sgi)
- os=irix
+ os=-irix
;;
*-siemens)
- os=sysv4
+ os=-sysv4
;;
*-masscomp)
- os=rtu
+ os=-rtu
;;
f30[01]-fujitsu | f700-fujitsu)
- os=uxpv
+ os=-uxpv
;;
*-rom68k)
- os=coff
+ os=-coff
;;
*-*bug)
- os=coff
+ os=-coff
;;
*-apple)
- os=macos
+ os=-macos
;;
*-atari*)
- os=mint
- ;;
- *-wrs)
- os=vxworks
+ os=-mint
;;
*)
- os=none
+ os=-none
;;
esac
fi
# Here we handle the case where we know the os, and the CPU type, but not the
# manufacturer. We pick the logical manufacturer.
-case $vendor in
- unknown)
+vendor=unknown
+case $basic_machine in
+ *-unknown)
case $os in
- riscix*)
+ -riscix*)
vendor=acorn
;;
- sunos*)
+ -sunos*)
vendor=sun
;;
- cnk*|-aix*)
+ -cnk*|-aix*)
vendor=ibm
;;
- beos*)
+ -beos*)
vendor=be
;;
- hpux*)
+ -hpux*)
vendor=hp
;;
- mpeix*)
+ -mpeix*)
vendor=hp
;;
- hiux*)
+ -hiux*)
vendor=hitachi
;;
- unos*)
+ -unos*)
vendor=crds
;;
- dgux*)
+ -dgux*)
vendor=dg
;;
- luna*)
+ -luna*)
vendor=omron
;;
- genix*)
+ -genix*)
vendor=ns
;;
- clix*)
- vendor=intergraph
- ;;
- mvs* | opened*)
+ -mvs* | -opened*)
vendor=ibm
;;
- os400*)
+ -os400*)
vendor=ibm
;;
- ptx*)
+ -ptx*)
vendor=sequent
;;
- tpf*)
+ -tpf*)
vendor=ibm
;;
- vxsim* | vxworks* | windiss*)
+ -vxsim* | -vxworks* | -windiss*)
vendor=wrs
;;
- aux*)
+ -aux*)
vendor=apple
;;
- hms*)
+ -hms*)
vendor=hitachi
;;
- mpw* | macos*)
+ -mpw* | -macos*)
vendor=apple
;;
- *mint | mint[0-9]* | *MiNT | MiNT[0-9]*)
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
vendor=atari
;;
- vos*)
+ -vos*)
vendor=stratus
;;
esac
+ basic_machine=`echo "$basic_machine" | sed "s/unknown/$vendor/"`
;;
esac
-echo "$cpu-$vendor-$os"
+echo "$basic_machine$os"
exit
# Local variables:
diff --git a/Build/source/utils/asymptote/configure b/Build/source/utils/asymptote/configure
index fa273992199..dd96c036f7b 100755
--- a/Build/source/utils/asymptote/configure
+++ b/Build/source/utils/asymptote/configure
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for Asymptote 2.44.
+# Generated by GNU Autoconf 2.69 for Asymptote 2.47.
#
# Report bugs to <http://sourceforge.net/projects/asymptote>.
#
@@ -580,8 +580,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='Asymptote'
PACKAGE_TARNAME='asymptote'
-PACKAGE_VERSION='2.44'
-PACKAGE_STRING='Asymptote 2.44'
+PACKAGE_VERSION='2.47'
+PACKAGE_STRING='Asymptote 2.47'
PACKAGE_BUGREPORT='http://sourceforge.net/projects/asymptote'
PACKAGE_URL=''
@@ -1283,7 +1283,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures Asymptote 2.44 to adapt to many kinds of systems.
+\`configure' configures Asymptote 2.47 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1348,7 +1348,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of Asymptote 2.44:";;
+ short | recursive ) echo "Configuration of Asymptote 2.47:";;
esac
cat <<\_ACEOF
@@ -1462,7 +1462,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-Asymptote configure 2.44
+Asymptote configure 2.47
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2048,7 +2048,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by Asymptote $as_me 2.44, which was
+It was created by Asymptote $as_me 2.47, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
@@ -6007,9 +6007,12 @@ $as_echo "$as_me: *** Enabling GC backtrace debugging; remember to make gc-clean
fi
-if test "$OSTYPE" = "msdos"; then
INCL=$INCL" -I/usr/include/tirpc"
+
+if test "$OSTYPE" = "msdos"; then
CPPFLAGS=$CPPFLAGS" -D__MSDOS__ $INCL"
+else
+CPPFLAGS=$CPPFLAGS" $INCL"
fi
ac_fn_cxx_check_func "$LINENO" "getopt_long_only" "ac_cv_func_getopt_long_only"
@@ -6922,7 +6925,7 @@ return xdrstdio_create ();
return 0;
}
_ACEOF
-for ac_lib in '' nsl rpc; do
+for ac_lib in '' nsl tirpc; do
if test -z "$ac_lib"; then
ac_res="none required"
else
@@ -8547,7 +8550,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by Asymptote $as_me 2.44, which was
+This file was extended by Asymptote $as_me 2.47, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -8609,7 +8612,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
-Asymptote config.status 2.44
+Asymptote config.status 2.47
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
diff --git a/Build/source/utils/asymptote/configure.ac b/Build/source/utils/asymptote/configure.ac
index 83cb1f949a3..a2888d121d0 100644
--- a/Build/source/utils/asymptote/configure.ac
+++ b/Build/source/utils/asymptote/configure.ac
@@ -3,7 +3,7 @@
# this file.
AC_PREREQ(2)
-AC_INIT([Asymptote],[2.44],[http://sourceforge.net/projects/asymptote])
+AC_INIT([Asymptote],[2.47],[http://sourceforge.net/projects/asymptote])
VERSION=$PACKAGE_VERSION
AC_SUBST(VERSION)
m4_include([ax_pthread.m4])
@@ -218,9 +218,12 @@ AC_ARG_ENABLE(gc-full-debug,
fi
])
-if test "$OSTYPE" = "msdos"; then
INCL=$INCL" -I/usr/include/tirpc"
+
+if test "$OSTYPE" = "msdos"; then
CPPFLAGS=$CPPFLAGS" -D__MSDOS__ $INCL"
+else
+CPPFLAGS=$CPPFLAGS" $INCL"
fi
AC_CHECK_FUNC(getopt_long_only, AC_DEFINE(HAVE_GNU_GETOPT_H, 1,
@@ -281,9 +284,9 @@ AC_CHECK_FUNCS([feenableexcept])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include "xstream.h"])],
- [AC_SEARCH_LIBS([xdrstdio_create],[nsl rpc])
+ [AC_SEARCH_LIBS([xdrstdio_create],[nsl tirpc])
AC_DEFINE(HAVE_RPC_RPC_H, 1,
- [Define if you have a working <rpc/rpc.h> header file])],
+ [Define if you have a working <tirpc/rpc/rpc.h> header file])],
AC_MSG_WARN([*** Broken rpc headers; XDR support disabled ***]))
AC_ARG_ENABLE(gsl,
diff --git a/Build/source/utils/asymptote/doc/CAD.pdf b/Build/source/utils/asymptote/doc/CAD.pdf
index ea28b168966..0aae4cae4c2 100644
--- a/Build/source/utils/asymptote/doc/CAD.pdf
+++ b/Build/source/utils/asymptote/doc/CAD.pdf
Binary files differ
diff --git a/Build/source/utils/asymptote/doc/FAQ/asy-faq.info b/Build/source/utils/asymptote/doc/FAQ/asy-faq.info
index b682fabe9a1..9b5e996d3ad 100644
--- a/Build/source/utils/asymptote/doc/FAQ/asy-faq.info
+++ b/Build/source/utils/asymptote/doc/FAQ/asy-faq.info
@@ -10,7 +10,7 @@ END-INFO-DIR-ENTRY
File: asy-faq.info, Node: Top, Next: Question 1.1, Up: (dir)
ASYMPTOTE FREQUENTLY ASKED QUESTIONS
- 07 Apr 2018
+ 30 Jul 2018
This is the list of Frequently Asked Questions about Asymptote (asy).
diff --git a/Build/source/utils/asymptote/doc/TeXShopAndAsymptote.pdf b/Build/source/utils/asymptote/doc/TeXShopAndAsymptote.pdf
index bbf19a4f29e..763eb2d56c5 100644
--- a/Build/source/utils/asymptote/doc/TeXShopAndAsymptote.pdf
+++ b/Build/source/utils/asymptote/doc/TeXShopAndAsymptote.pdf
Binary files differ
diff --git a/Build/source/utils/asymptote/doc/asy-latex.pdf b/Build/source/utils/asymptote/doc/asy-latex.pdf
index 465b586e173..7d1736ad6eb 100644
--- a/Build/source/utils/asymptote/doc/asy-latex.pdf
+++ b/Build/source/utils/asymptote/doc/asy-latex.pdf
Binary files differ
diff --git a/Build/source/utils/asymptote/doc/asy.1 b/Build/source/utils/asymptote/doc/asy.1
index e8fbc42290d..e080948f5ba 100644
--- a/Build/source/utils/asymptote/doc/asy.1
+++ b/Build/source/utils/asymptote/doc/asy.1
@@ -283,6 +283,9 @@ Enable warning; command-line only.
.B \-where
Show where listed variables are declared [false].
.TP
+.B \-xasy
+Special interactive mode for xasy [false].
+.TP
.B \-zoomfactor factor
Zoom step factor [1.05].
.TP
diff --git a/Build/source/utils/asymptote/doc/asyRefCard.pdf b/Build/source/utils/asymptote/doc/asyRefCard.pdf
index de1d2999cce..c1c3b38e033 100644
--- a/Build/source/utils/asymptote/doc/asyRefCard.pdf
+++ b/Build/source/utils/asymptote/doc/asyRefCard.pdf
Binary files differ
diff --git a/Build/source/utils/asymptote/doc/asymptote.pdf b/Build/source/utils/asymptote/doc/asymptote.pdf
index 2f6f1f45707..a5a2dddf3b6 100644
--- a/Build/source/utils/asymptote/doc/asymptote.pdf
+++ b/Build/source/utils/asymptote/doc/asymptote.pdf
Binary files differ
diff --git a/Build/source/utils/asymptote/doc/asymptote.texi b/Build/source/utils/asymptote/doc/asymptote.texi
index 0857cc6fce8..e740a258855 100644
--- a/Build/source/utils/asymptote/doc/asymptote.texi
+++ b/Build/source/utils/asymptote/doc/asymptote.texi
@@ -384,7 +384,7 @@ The @code{ImageMagick} package from
@noindent
is required to support output formats other than @acronym{EPS},
@acronym{PDF}, @acronym{SVG}, and @acronym{PNG} (@pxref{convert}).
-The @code{Python 2} interpreter from @url{http://www.python.org} is only required
+The @code{Python 3} interpreter from @url{http://www.python.org} is only required
if you wish to try out the graphical user interface (@pxref{GUI}).
@noindent
@@ -947,7 +947,7 @@ terminated with an arrowhead:
@center @image{quartercircle}
@noindent
Here the directions @code{up} and @code{left} in braces specify the
-incoming and outgoing directions at the points @code{(1,0)} and
+outgoing and incoming directions at the points @code{(1,0)} and
@code{(0,1)}, respectively.
In general, a path is specified as a list of points (or other paths)
@@ -2812,6 +2812,12 @@ interval [0,1], with 0.0 denoting black and 1.0 denoting white.
This produces an @acronym{RGB} color, where each of the red, green,
and blue intensities @code{r}, @code{g}, @code{b}, lies in the interval [0,1].
+@item pen RGB(int r, int g, int b);
+@cindex @code{rgb}
+This produces an @acronym{RGB} color, where each of the red, green,
+and blue intensities @code{r}, @code{g}, @code{b}, lies in the
+interval [0,255].
+
@item pen cmyk(real c, real m, real y, real k);
@cindex @code{cmyk}
This produces a @acronym{CMYK} color, where each of the cyan, magenta,
@@ -3262,7 +3268,7 @@ integer power with the @code{^} operator.
The built-in transforms are:
@table @code
-@item transform identity();
+@item transform identity;
@cindex @code{identity}
the identity transform;
@item transform shift(pair z);
@@ -3292,6 +3298,9 @@ rotates by @code{angle} in degrees about @code{z};
@item transform reflect(pair a, pair b);
@cindex @code{reflect}
reflects about the line @code{a--b}.
+@item transform zeroTransform;
+@cindex @code{zeroTransform}
+the zero transform;
@end table
@cindex @code{shift}
@@ -5100,6 +5109,8 @@ each iteration are printed if @code{verbose=true}.
If the iteration fails after the maximum allowed number of loops
(@code{iterations}), @code{realMax} is returned.
+@cindex integral
+@cindex integrate
@cindex @code{simpson}
@item @code{real simpson(real f(real), real a, real b, real acc=realEpsilon, real dxmax=b-a)}
returns the integral of @code{f} from @code{a} to @code{b} using adaptive Simpson integration.
@@ -5353,9 +5364,12 @@ pete 7
@end verbatim
@cindex @code{sort}
-@item T[] sort(T[] a, bool less(T i, T j))
-returns a copy of @code{a} stably sorted in ascending order such that
-element @code{i} precedes element @code{j} if @code{less(i,j)} is true.
+@item T[] sort(T[] a, bool less(T i, T j), bool stable=true)
+returns a copy of @code{a} sorted in ascending order such that
+element @code{i} precedes element @code{j} if @code{less(i,j)} is
+true, subject to (if @code{stable} is @code{true}) the stability constraint
+that the original order of elements @code{i} and @code{j} is preserved if
+@code{less(i,j)} and @code{less(j,i)} are both @code{false}.
@cindex @code{transpose}
@item T[][] transpose(T[][] a)
@@ -8441,6 +8455,9 @@ which is the determinant
|c.x c.y c.z 1|
|d.x d.y d.z 1|
@end verbatim
+The result is negative (positive) if @code{a}, @code{b}, @code{c} appear in
+counterclockwise (clockwise) order when viewed from @code{d} or zero
+if all four points are coplanar.
The routine
@cindex @code{insphere}
@@ -9445,7 +9462,7 @@ The file @code{asymptote.py} in the @code{Asymptote} system directory
provides an alternative way of entering @code{Asymptote} commands
interactively, coupled with the full power of @code{Python}. Copy this
file to your @code{Python path} and then execute from within
-@code{Python} the commands
+@code{Python 3} the commands
@verbatim
from asymptote import *
g=asy()
@@ -9482,39 +9499,33 @@ The modified figure can then be saved as a normal @code{Asymptote} file.
@cindex GUI installation
As @code{xasy} is written in the interactive scripting language
-@code{Python/TK}, it requires @code{Python} (@url{http://www.python.org}),
-the @code{Pillow} fork of the @code{Python Imaging Library},and the
-@code{tkinter} package (included with @code{Python} under
-@code{Microsoft Windows}). @code{Fedora Linux} users can
-either install @code{tkinter} and @code{Pillow} with the commands
+@code{Python/Qt}, it requires @code{Python} (@url{http://www.python.org}),
+along with the @code{Python} packages @code{pyqt5}, @code{cson}, and
+@code{numpy}:
+
@verbatim
-dnf install tkinter
-dnf install tk-devel
-dnf install python-pillow-tk
+pip3 install pyqt5 cson numpy
@end verbatim
-@noindent
-or manually install the @code{tkinter}, @code{tix}, @code{tk},
-and @code{tk-devel} packages.
-Pictures are deconstructed into the @acronym{PNG} image format, which
-supports full alpha channel transparency. Under @code{Microsoft Windows},
-this requires @code{Python 2.7.4} or later and version @code{3.1.0} of the
-@code{Pillow} fork of the @code{Python Imaging Library}, available from
-@quotation
-@url{http://pypi.python.org/pypi/Pillow}
-@end quotation
+Pictures are deconstructed into the @acronym{SVG} image format.
+Since @code{Qt5} does not suport @code{SVG} clipping, you will need
+the @code{rsvg-convert} utility, which is part of the
+@code{librsvg2-tools} package on @code{UNIX} systems; under
+@code{Microsoft Windows}, it is available as
+
+@url{https://sourceforge.net/projects/tumagcc/files/rsvg-convert-2.40.20.7z}
@node GUI usage, , GUI installation, GUI
@section GUI usage
@cindex GUI usage
+@cindex arrow keys
+@cindex mouse wheel
@cindex @code{deconstruct}
-
-A wheel mouse is convenient for raising and lowering objects within
-@code{xasy}, to expose the object to be moved. If a wheel mouse is not
-available, mouse @code{Button-2} can be used to repeatedly lower an
-object instead. When run from the command line, @code{xasy} accepts
-a command line option @code{-x n}, which sets the initial magnification
-to @code{n}.
+The arrow keys (or mouse wheel) are convenient for temporarily
+raising and lowering objects within @code{xasy}, allowing an object to
+be selected. Pressing the arrow keys will pan while the shift key is held
+and zoom while the control key is held. The mouse wheel will pan while
+the alt or shift keys is held and zoom while the control key is held.
Deconstruction of compound objects (such as arrows) can be prevented
by enclosing them within the commands
diff --git a/Build/source/utils/asymptote/doc/planes.asy b/Build/source/utils/asymptote/doc/planes.asy
index da859200f03..a3aeb252e24 100644
--- a/Build/source/utils/asymptote/doc/planes.asy
+++ b/Build/source/utils/asymptote/doc/planes.asy
@@ -16,4 +16,3 @@ filldraw(faces.push(l),project(l),lightgrey);
filldraw(faces.push(g),project(g),green);
add(faces);
-
diff --git a/Build/source/utils/asymptote/doc/png/asymptote.info b/Build/source/utils/asymptote/doc/png/asymptote.info
index d8aead72d26..0fa270e9b0c 100644
--- a/Build/source/utils/asymptote/doc/png/asymptote.info
+++ b/Build/source/utils/asymptote/doc/png/asymptote.info
@@ -1,7 +1,7 @@
-This is asymptote.info, produced by makeinfo version 6.4 from
+This is asymptote.info, produced by makeinfo version 6.5 from
asymptote.texi.
-This file documents 'Asymptote', version 2.44.
+This file documents 'Asymptote', version 2.47.
<http://asymptote.sourceforge.net>
@@ -22,7 +22,7 @@ File: asymptote.info, Node: Top, Next: Description, Prev: (dir), Up: (dir)
Asymptote
*********
-This file documents 'Asymptote', version 2.44.
+This file documents 'Asymptote', version 2.47.
<http://asymptote.sourceforge.net>
@@ -339,7 +339,7 @@ available from <http://www.cs.wisc.edu/~ghost/gsview/>.
<http://www.imagemagick.org/script/binary-releases.php>
is required to support output formats other than EPS, PDF, SVG, and PNG
-(*note convert::). The 'Python 2' interpreter from
+(*note convert::). The 'Python 3' interpreter from
<http://www.python.org> is only required if you wish to try out the
graphical user interface (*note GUI::).
@@ -778,8 +778,8 @@ size(100,0);
draw((1,0){up}..{left}(0,1),Arrow);
[quartercircle]
-Here the directions 'up' and 'left' in braces specify the incoming and
-outgoing directions at the points '(1,0)' and '(0,1)', respectively.
+Here the directions 'up' and 'left' in braces specify the outgoing and
+incoming directions at the points '(1,0)' and '(0,1)', respectively.
In general, a path is specified as a list of points (or other paths)
interconnected with '--', which denotes a straight line segment, or
@@ -2248,6 +2248,10 @@ with one or more color components equal to 1.
This produces an RGB color, where each of the red, green, and
blue intensities 'r', 'g', 'b', lies in the interval [0,1].
+ 'pen RGB(int r, int g, int b);'
+ This produces an RGB color, where each of the red, green, and
+ blue intensities 'r', 'g', 'b', lies in the interval [0,255].
+
'pen cmyk(real c, real m, real y, real k);'
This produces a CMYK color, where each of the cyan, magenta,
yellow, and black intensities 'c', 'm', 'y', 'k', lies in the
@@ -2609,7 +2613,7 @@ power with the '^' operator.
The built-in transforms are:
-'transform identity();'
+'transform identity;'
the identity transform;
'transform shift(pair z);'
translates by the pair 'z';
@@ -2629,6 +2633,8 @@ power with the '^' operator.
rotates by 'angle' in degrees about 'z';
'transform reflect(pair a, pair b);'
reflects about the line 'a--b'.
+'transform zeroTransform;'
+ the zero transform;
The implicit initializer for transforms is 'identity()'. The
routines 'shift(transform t)' and 'shiftless(transform t)' return the
@@ -4148,9 +4154,12 @@ of type 'T[]'.
bob 9
pete 7
-'T[] sort(T[] a, bool less(T i, T j))'
- returns a copy of 'a' stably sorted in ascending order such that
- element 'i' precedes element 'j' if 'less(i,j)' is true.
+'T[] sort(T[] a, bool less(T i, T j), bool stable=true)'
+ returns a copy of 'a' sorted in ascending order such that element
+ 'i' precedes element 'j' if 'less(i,j)' is true, subject to (if
+ 'stable' is 'true') the stability constraint that the original
+ order of elements 'i' and 'j' is preserved if 'less(i,j)' and
+ 'less(j,i)' are both 'false'.
'T[][] transpose(T[][] a)'
returns the transpose of 'a'.
@@ -7228,6 +7237,9 @@ is the determinant
|b.x b.y b.z 1|
|c.x c.y c.z 1|
|d.x d.y d.z 1|
+ The result is negative (positive) if 'a', 'b', 'c' appear in
+counterclockwise (clockwise) order when viewed from 'd' or zero if all
+four points are coplanar.
The routine
real insphere(triple a, triple b, triple c, triple d, triple e);
@@ -7343,7 +7355,6 @@ filldraw(faces.push(g),project(g),green);
add(faces);
-
[planes]

@@ -8125,6 +8136,7 @@ Options (negate by replacing - with -no):
-wait Wait for child processes to finish before exiting [false]
-warn string Enable warning; command-line only
-where Show where listed variables are declared [false]
+-xasy Special interactive mode for xasy [false]
-zoomfactor factor Zoom step factor [1.05]
-zoomstep step Mouse motion zoom step [0.1]
@@ -8324,7 +8336,7 @@ see: <http://cnswww.cns.cwru.edu/php/chet/readline/readline.html>
The file 'asymptote.py' in the 'Asymptote' system directory provides
an alternative way of entering 'Asymptote' commands interactively,
coupled with the full power of 'Python'. Copy this file to your 'Python
-path' and then execute from within 'Python' the commands
+path' and then execute from within 'Python 3' the commands
from asymptote import *
g=asy()
g.size(200)
@@ -8356,21 +8368,18 @@ File: asymptote.info, Node: GUI installation, Next: GUI usage, Prev: GUI, Up
11.1 GUI installation
=====================
-As 'xasy' is written in the interactive scripting language 'Python/TK',
-it requires 'Python' (<http://www.python.org>), the 'Pillow' fork of the
-'Python Imaging Library',and the 'tkinter' package (included with
-'Python' under 'Microsoft Windows'). 'Fedora Linux' users can either
-install 'tkinter' and 'Pillow' with the commands
-dnf install tkinter
-dnf install tk-devel
-dnf install python-pillow-tk
-or manually install the 'tkinter', 'tix', 'tk', and 'tk-devel' packages.
-
- Pictures are deconstructed into the PNG image format, which supports
-full alpha channel transparency. Under 'Microsoft Windows', this
-requires 'Python 2.7.4' or later and version '3.1.0' of the 'Pillow'
-fork of the 'Python Imaging Library', available from
- <http://pypi.python.org/pypi/Pillow>
+As 'xasy' is written in the interactive scripting language 'Python/Qt',
+it requires 'Python' (<http://www.python.org>), along with the 'Python'
+packages 'pyqt5', 'cson', and 'numpy':
+
+pip3 install pyqt5 cson numpy
+
+ Pictures are deconstructed into the SVG image format. Since 'Qt5'
+does not suport 'SVG' clipping, you will need the 'rsvg-convert'
+utility, which is part of the 'librsvg2-tools' package on 'UNIX'
+systems; under 'Microsoft Windows', it is available as
+
+ <https://sourceforge.net/projects/tumagcc/files/rsvg-convert-2.40.20.7z>

File: asymptote.info, Node: GUI usage, Prev: GUI installation, Up: GUI
@@ -8378,11 +8387,11 @@ File: asymptote.info, Node: GUI usage, Prev: GUI installation, Up: GUI
11.2 GUI usage
==============
-A wheel mouse is convenient for raising and lowering objects within
-'xasy', to expose the object to be moved. If a wheel mouse is not
-available, mouse 'Button-2' can be used to repeatedly lower an object
-instead. When run from the command line, 'xasy' accepts a command line
-option '-x n', which sets the initial magnification to 'n'.
+The arrow keys (or mouse wheel) are convenient for temporarily raising
+and lowering objects within 'xasy', allowing an object to be selected.
+Pressing the arrow keys will pan while the shift key is held and zoom
+while the control key is held. The mouse wheel will pan while the alt
+or shift keys is held and zoom while the control key is held.
Deconstruction of compound objects (such as arrows) can be prevented
by enclosing them within the commands
@@ -8583,9 +8592,9 @@ Index
* ---: Bezier curves. (line 84)
* -=: Self & prefix operators.
(line 6)
-* -c: Options. (line 183)
-* -l: Options. (line 202)
-* -u: Options. (line 193)
+* -c: Options. (line 184)
+* -l: Options. (line 203)
+* -u: Options. (line 194)
* -V: Configuring. (line 6)
* -V <1>: Drawing in batch mode.
(line 16)
@@ -8598,7 +8607,7 @@ Index
* 2D graphs: graph. (line 6)
* 3D graphs: graph3. (line 6)
* 3D grids: grid3. (line 6)
-* 3D PostScript: three. (line 580)
+* 3D PostScript: three. (line 583)
* :: Arithmetic & logical.
(line 61)
* ::: Bezier curves. (line 70)
@@ -8648,7 +8657,7 @@ Index
(line 228)
* add <2>: three. (line 256)
* addViews: three. (line 377)
-* adjust: Pens. (line 119)
+* adjust: Pens. (line 123)
* Ai: Mathematical functions.
(line 48)
* Airy: Mathematical functions.
@@ -8658,9 +8667,9 @@ Index
* alias: Structures. (line 62)
* alias <1>: Arrays. (line 174)
* Align: label. (line 12)
-* aligndir: Options. (line 175)
-* all: Arrays. (line 322)
-* Allow: Pens. (line 343)
+* aligndir: Options. (line 176)
+* all: Arrays. (line 325)
+* Allow: Pens. (line 347)
* and: Bezier curves. (line 56)
* AND: Arithmetic & logical.
(line 68)
@@ -8672,16 +8681,16 @@ Index
* animation <1>: animation. (line 6)
* annotate: annotate. (line 6)
* antialias: three. (line 195)
-* antialias <1>: Options. (line 146)
+* antialias <1>: Options. (line 147)
* append: Files. (line 36)
* append <1>: Arrays. (line 39)
* arc: Paths and guides. (line 24)
* Arc: Paths and guides. (line 37)
* arc <1>: three. (line 267)
* ArcArrow: draw. (line 26)
-* ArcArrow3: three. (line 547)
+* ArcArrow3: three. (line 550)
* ArcArrows: draw. (line 26)
-* ArcArrows3: three. (line 547)
+* ArcArrows3: three. (line 550)
* arclength: Paths and guides. (line 153)
* arclength <1>: three. (line 484)
* arcpoint: Paths and guides. (line 163)
@@ -8699,10 +8708,11 @@ Index
* arrow <1>: label. (line 70)
* arrow keys: Drawing in interactive mode.
(line 11)
-* Arrow3: three. (line 547)
+* arrow keys <1>: GUI usage. (line 6)
+* Arrow3: three. (line 550)
* arrows: draw. (line 26)
* Arrows: draw. (line 26)
-* Arrows3: three. (line 547)
+* Arrows3: three. (line 550)
* as: Import. (line 67)
* ascii: Data types. (line 308)
* ascii <1>: Data types. (line 308)
@@ -8723,7 +8733,7 @@ Index
* asyinclude: LaTeX usage. (line 45)
* asymptote.sty: LaTeX usage. (line 6)
* asymptote.xml: Editing modes. (line 48)
-* ASYMPTOTE_CONFIG: Options. (line 117)
+* ASYMPTOTE_CONFIG: Options. (line 118)
* atan: Mathematical functions.
(line 6)
* aTan: Mathematical functions.
@@ -8738,7 +8748,7 @@ Index
* attach <1>: LaTeX usage. (line 50)
* attach <2>: graph. (line 407)
* autoadjust: three. (line 342)
-* autoimport: Options. (line 113)
+* autoimport: Options. (line 114)
* automatic scaling: graph. (line 691)
* automatic scaling <1>: graph. (line 691)
* axialshade: fill. (line 43)
@@ -8752,34 +8762,34 @@ Index
(line 180)
* BackView: three. (line 370)
* Bar: draw. (line 19)
-* Bar3: three. (line 547)
+* Bar3: three. (line 550)
* Bars: draw. (line 19)
-* Bars3: three. (line 547)
+* Bars3: three. (line 550)
* barsize: draw. (line 19)
* base modules: Base modules. (line 6)
-* basealign: Pens. (line 177)
+* basealign: Pens. (line 181)
* baseline: label. (line 90)
* batch mode: Drawing in batch mode.
(line 6)
* beep: Data types. (line 381)
* BeginArcArrow: draw. (line 26)
-* BeginArcArrow3: three. (line 547)
+* BeginArcArrow3: three. (line 550)
* BeginArrow: draw. (line 26)
-* BeginArrow3: three. (line 547)
+* BeginArrow3: three. (line 550)
* BeginBar: draw. (line 19)
-* BeginBar3: three. (line 547)
+* BeginBar3: three. (line 550)
* BeginDotMargin: draw. (line 42)
-* BeginDotMargin3: three. (line 563)
+* BeginDotMargin3: three. (line 566)
* BeginMargin: draw. (line 42)
-* BeginMargin3: three. (line 563)
+* BeginMargin3: three. (line 566)
* BeginPenMargin: draw. (line 42)
-* BeginPenMargin2: three. (line 563)
-* BeginPenMargin3: three. (line 563)
+* BeginPenMargin2: three. (line 566)
+* BeginPenMargin3: three. (line 566)
* BeginPoint: label. (line 55)
* Bessel: Mathematical functions.
(line 48)
* bevel: flowchart. (line 72)
-* beveljoin: Pens. (line 145)
+* beveljoin: Pens. (line 149)
* Bezier curves: Bezier curves. (line 6)
* Bezier patch: three. (line 88)
* Bezier triangle: three. (line 88)
@@ -8828,7 +8838,7 @@ Index
* brace: Paths and guides. (line 51)
* break: Programming. (line 48)
* breakpoints: Debugger. (line 21)
-* brick: Pens. (line 265)
+* brick: Pens. (line 269)
* broken axis: graph. (line 802)
* bug reports: Help. (line 19)
* buildcycle: Paths and guides. (line 270)
@@ -8849,7 +8859,7 @@ Index
(line 26)
* Center: label. (line 60)
* center: three. (line 319)
-* checker: Pens. (line 265)
+* checker: Pens. (line 269)
* Chinese: unicode. (line 12)
* choose: Mathematical functions.
(line 39)
@@ -8869,16 +8879,16 @@ Index
(line 68)
* cm: Figure size. (line 18)
* cmd: Configuring. (line 31)
-* cmyk: Pens. (line 34)
+* cmyk: Pens. (line 38)
* colatitude: Data types. (line 158)
* color: Pens. (line 23)
* coloredNodes: tube. (line 25)
* coloredpath: tube. (line 18)
* coloredSegments: tube. (line 25)
-* colorless: Pens. (line 53)
-* colors: Pens. (line 50)
+* colorless: Pens. (line 57)
+* colors: Pens. (line 54)
* comma: Files. (line 61)
-* comma-separated-value mode: Arrays. (line 354)
+* comma-separated-value mode: Arrays. (line 357)
* command-line options: Configuring. (line 83)
* command-line options <1>: Options. (line 6)
* comment character: Files. (line 16)
@@ -8891,13 +8901,13 @@ Index
* conditional <1>: Arithmetic & logical.
(line 61)
* config: Configuring. (line 64)
-* config <1>: Options. (line 117)
+* config <1>: Options. (line 118)
* configuration file: Configuring. (line 21)
-* configuration file <1>: Options. (line 117)
+* configuration file <1>: Options. (line 118)
* configuring: Configuring. (line 6)
* conj: Data types. (line 62)
* constructors: Structures. (line 91)
-* context: Options. (line 146)
+* context: Options. (line 147)
* continue: Programming. (line 48)
* continue <1>: Debugger. (line 31)
* contour: contour. (line 6)
@@ -8908,8 +8918,8 @@ Index
* convert: Configuring. (line 64)
* convert <1>: Files. (line 155)
* convert <2>: animation. (line 6)
-* convert <3>: Options. (line 146)
-* convertOptions: Options. (line 132)
+* convert <3>: Options. (line 147)
+* convertOptions: Options. (line 133)
* Coons shading: fill. (line 77)
* copy: Arrays. (line 167)
* cos: Mathematical functions.
@@ -8925,11 +8935,11 @@ Index
* cross <1>: Data types. (line 196)
* cross <2>: graph. (line 481)
* crossframe: markers. (line 22)
-* crosshatch: Pens. (line 282)
-* csv: Arrays. (line 354)
+* crosshatch: Pens. (line 286)
+* csv: Arrays. (line 357)
* CTZ: Arithmetic & logical.
(line 68)
-* cubicroots: Arrays. (line 311)
+* cubicroots: Arrays. (line 314)
* curl: Bezier curves. (line 66)
* curl <1>: three. (line 6)
* curlSpecifier: Paths and guides. (line 408)
@@ -8948,8 +8958,8 @@ Index
* cyclic <2>: Arrays. (line 39)
* cyclic <3>: three. (line 484)
* Cyrillic: unicode. (line 7)
-* dashdotted: Pens. (line 98)
-* dashed: Pens. (line 98)
+* dashdotted: Pens. (line 102)
+* dashed: Pens. (line 102)
* data types: Data types. (line 6)
* date: Data types. (line 320)
* Debian: UNIX binary distributions.
@@ -8960,14 +8970,14 @@ Index
* default arguments: Default arguments. (line 6)
* defaultformat: graph. (line 175)
* DefaultHead: draw. (line 26)
-* DefaultHead3: three. (line 547)
-* defaultpen: Pens. (line 45)
-* defaultpen <1>: Pens. (line 118)
-* defaultpen <2>: Pens. (line 123)
-* defaultpen <3>: Pens. (line 135)
-* defaultpen <4>: Pens. (line 188)
-* defaultpen <5>: Pens. (line 343)
-* defaultpen <6>: Pens. (line 367)
+* DefaultHead3: three. (line 550)
+* defaultpen: Pens. (line 49)
+* defaultpen <1>: Pens. (line 122)
+* defaultpen <2>: Pens. (line 127)
+* defaultpen <3>: Pens. (line 139)
+* defaultpen <4>: Pens. (line 192)
+* defaultpen <5>: Pens. (line 347)
+* defaultpen <6>: Pens. (line 371)
* defaultrender: three. (line 46)
* deferred drawing: simplex. (line 6)
* degrees: Data types. (line 78)
@@ -8978,9 +8988,9 @@ Index
* delete: Files. (line 150)
* delete <1>: Arrays. (line 39)
* description: Description. (line 6)
-* diagonal: Arrays. (line 296)
+* diagonal: Arrays. (line 299)
* diamond: flowchart. (line 54)
-* dimension: Arrays. (line 359)
+* dimension: Arrays. (line 362)
* dir: Search paths. (line 9)
* dir <1>: Data types. (line 90)
* dir <2>: Data types. (line 180)
@@ -8997,13 +9007,13 @@ Index
* dot: draw. (line 82)
* dot <1>: Data types. (line 103)
* dot <2>: Data types. (line 193)
-* dot <3>: Arrays. (line 251)
-* dot <4>: Arrays. (line 254)
+* dot <3>: Arrays. (line 254)
+* dot <4>: Arrays. (line 257)
* DotMargin: draw. (line 42)
-* DotMargin3: three. (line 563)
+* DotMargin3: three. (line 566)
* DotMargins: draw. (line 42)
-* DotMargins3: three. (line 563)
-* dotted: Pens. (line 98)
+* DotMargins3: three. (line 566)
+* dotted: Pens. (line 102)
* double deferred drawing: three. (line 241)
* double precision: Files. (line 76)
* draw: Drawing commands. (line 31)
@@ -9017,10 +9027,10 @@ Index
* drawline: math. (line 9)
* drawtree: drawtree. (line 6)
* dvips: Configuring. (line 64)
-* dvipsOptions: Options. (line 132)
+* dvipsOptions: Options. (line 133)
* dvisvgm: Configuring. (line 64)
-* dvisvgm <1>: Options. (line 151)
-* dvisvgmOptions: Options. (line 132)
+* dvisvgm <1>: Options. (line 152)
+* dvisvgmOptions: Options. (line 133)
* E: Labels. (line 18)
* E <1>: Mathematical functions.
(line 48)
@@ -9039,29 +9049,29 @@ Index
* empty: Frames and pictures.
(line 7)
* EndArcArrow: draw. (line 26)
-* EndArcArrow3: three. (line 547)
+* EndArcArrow3: three. (line 550)
* EndArrow: draw. (line 26)
-* EndArrow3: three. (line 547)
+* EndArrow3: three. (line 550)
* EndBar: draw. (line 19)
-* EndBar3: three. (line 547)
+* EndBar3: three. (line 550)
* EndDotMargin: draw. (line 42)
-* EndDotMargin3: three. (line 563)
+* EndDotMargin3: three. (line 566)
* endl: Files. (line 61)
* EndMargin: draw. (line 42)
-* EndMargin3: three. (line 563)
+* EndMargin3: three. (line 566)
* EndPenMargin: draw. (line 42)
-* EndPenMargin2: three. (line 563)
-* EndPenMargin3: three. (line 563)
+* EndPenMargin2: three. (line 566)
+* EndPenMargin3: three. (line 566)
* EndPoint: label. (line 55)
* envelope: Frames and pictures.
(line 25)
* environment variables: Configuring. (line 87)
* eof: Files. (line 93)
-* eof <1>: Arrays. (line 336)
+* eof <1>: Arrays. (line 339)
* eol: Files. (line 93)
-* eol <1>: Arrays. (line 336)
+* eol <1>: Arrays. (line 339)
* EPS: label. (line 78)
-* EPS <1>: Options. (line 146)
+* EPS <1>: Options. (line 147)
* erase: Drawing in interactive mode.
(line 11)
* erase <1>: Data types. (line 256)
@@ -9080,7 +9090,7 @@ Index
* eval: Import. (line 97)
* eval <1>: Import. (line 107)
* evenodd: Paths. (line 37)
-* evenodd <1>: Pens. (line 160)
+* evenodd <1>: Pens. (line 164)
* exit: Data types. (line 372)
* exit <1>: Interactive mode. (line 54)
* exit <2>: Debugger. (line 56)
@@ -9094,7 +9104,7 @@ Index
(line 6)
* exponential integral: Mathematical functions.
(line 48)
-* extendcap: Pens. (line 135)
+* extendcap: Pens. (line 139)
* extension: Paths and guides. (line 246)
* extension <1>: MetaPost. (line 10)
* external: embed. (line 11)
@@ -9103,13 +9113,13 @@ Index
(line 48)
* fabs: Mathematical functions.
(line 6)
-* face: three. (line 588)
+* face: three. (line 591)
* factorial: Mathematical functions.
(line 39)
* Fedora: UNIX binary distributions.
(line 15)
* feynman: feynman. (line 6)
-* fft: Arrays. (line 237)
+* fft: Arrays. (line 240)
* fft <1>: math. (line 26)
* FFTW: Compiling from UNIX source.
(line 63)
@@ -9126,7 +9136,7 @@ Index
* FillDraw <1>: Frames and pictures.
(line 136)
* filloutside: fill. (line 27)
-* fillrule: Pens. (line 160)
+* fillrule: Pens. (line 164)
* find: Data types. (line 241)
* find <1>: Arrays. (line 149)
* findall: Arrays. (line 154)
@@ -9143,13 +9153,13 @@ Index
* flush <1>: Files. (line 93)
* fmod: Mathematical functions.
(line 6)
-* font: Pens. (line 202)
-* font command: Pens. (line 202)
-* fontcommand: Pens. (line 217)
-* fontsize: Pens. (line 188)
+* font: Pens. (line 206)
+* font command: Pens. (line 206)
+* fontcommand: Pens. (line 221)
+* fontsize: Pens. (line 192)
* for: Programming. (line 26)
* format: Data types. (line 289)
-* format <1>: Options. (line 146)
+* format <1>: Options. (line 147)
* forum: Help. (line 6)
* frame: Frames and pictures.
(line 7)
@@ -9174,7 +9184,7 @@ Index
* gettriple: Files. (line 118)
* git: Git. (line 6)
* glOptions: three. (line 195)
-* glOptions <1>: Options. (line 132)
+* glOptions <1>: Options. (line 133)
* GNU Scientific Library: Mathematical functions.
(line 48)
* gouraudshade: fill. (line 62)
@@ -9187,7 +9197,7 @@ Index
* gray: Pens. (line 25)
* grayscale: Pens. (line 25)
* Grayscale: palette. (line 9)
-* grid: Pens. (line 265)
+* grid: Pens. (line 269)
* grid <1>: graph. (line 747)
* grid3: grid3. (line 6)
* gs: Configuring. (line 6)
@@ -9195,13 +9205,13 @@ Index
(line 63)
* gsl: Mathematical functions.
(line 48)
-* gsOptions: Options. (line 132)
+* gsOptions: Options. (line 133)
* GUI: GUI. (line 6)
* GUI installation: GUI installation. (line 6)
* GUI usage: GUI usage. (line 6)
* guide: Paths and guides. (line 314)
* guide3: three. (line 6)
-* hatch: Pens. (line 282)
+* hatch: Pens. (line 286)
* height: LaTeX usage. (line 50)
* help: Interactive mode. (line 42)
* help <1>: Help. (line 6)
@@ -9209,19 +9219,19 @@ Index
* Hermite: graph. (line 36)
* Hermite(splinetype splinetype: graph. (line 36)
* hex: Data types. (line 305)
-* hex <1>: Pens. (line 60)
+* hex <1>: Pens. (line 64)
* hexidecimal: Data types. (line 305)
-* hexidecimal <1>: Pens. (line 58)
-* hidden surface removal: three. (line 588)
+* hexidecimal <1>: Pens. (line 62)
+* hidden surface removal: three. (line 591)
* histogram: Mathematical functions.
(line 39)
* history: Files. (line 143)
* history <1>: Interactive mode. (line 54)
* historylines: Interactive mode. (line 57)
* HookHead: draw. (line 26)
-* HookHead3: three. (line 547)
+* HookHead3: three. (line 550)
* Horizontal: flowchart. (line 77)
-* hyperrefOptions: Options. (line 132)
+* hyperrefOptions: Options. (line 133)
* hypot: Mathematical functions.
(line 6)
* I: Mathematical functions.
@@ -9230,7 +9240,7 @@ Index
* identity: Transforms. (line 24)
* identity <1>: Mathematical functions.
(line 6)
-* identity <2>: Arrays. (line 293)
+* identity <2>: Arrays. (line 296)
* identity4: three. (line 422)
* if: Programming. (line 26)
* IgnoreAspect: Frames and pictures.
@@ -9239,7 +9249,7 @@ Index
* image <1>: palette. (line 58)
* ImageMagick: Configuring. (line 64)
* ImageMagick <1>: animation. (line 6)
-* ImageMagick <2>: Options. (line 146)
+* ImageMagick <2>: Options. (line 147)
* images: palette. (line 6)
* implicit casts: Casts. (line 6)
* implicit linear solver: MetaPost. (line 10)
@@ -9267,12 +9277,16 @@ Index
* inside: Paths and guides. (line 294)
* inside <1>: Paths and guides. (line 299)
* inside <2>: Paths and guides. (line 305)
-* insphere: three. (line 510)
+* insphere: three. (line 513)
* inst: Debugger. (line 35)
* installation: Installation. (line 6)
* int: Data types. (line 30)
* integer division: Arithmetic & logical.
(line 20)
+* integral: Mathematical functions.
+ (line 82)
+* integrate: Mathematical functions.
+ (line 82)
* interactive mode: Drawing in interactive mode.
(line 6)
* interactive mode <1>: Interactive mode. (line 6)
@@ -9298,9 +9312,9 @@ Index
* intMax: Data types. (line 30)
* intMin: Data types. (line 30)
* inverse: Transforms. (line 16)
-* inverse <1>: Arrays. (line 299)
+* inverse <1>: Arrays. (line 302)
* invert: three. (line 412)
-* invisible: Pens. (line 39)
+* invisible: Pens. (line 43)
* isnan: Data types. (line 35)
* i_scaled: Mathematical functions.
(line 48)
@@ -9340,8 +9354,8 @@ Index
(line 104)
* lastcut: Paths and guides. (line 266)
* lasy-mode: Editing modes. (line 6)
-* latex: Options. (line 146)
-* LaTeX fonts: Pens. (line 202)
+* latex: Options. (line 147)
+* LaTeX fonts: Pens. (line 206)
* LaTeX usage: LaTeX usage. (line 6)
* latexmk: LaTeX usage. (line 30)
* latin1: latin1. (line 6)
@@ -9372,21 +9386,21 @@ Index
* lexorder: math. (line 67)
* lexorder <1>: math. (line 70)
* libgs: Configuring. (line 64)
-* libgs <1>: Options. (line 151)
+* libgs <1>: Options. (line 152)
* libm routines: Mathematical functions.
(line 6)
* libsigsegv: Functions. (line 100)
* libsigsegv <1>: Help. (line 27)
* limits: graph. (line 640)
-* line: Arrays. (line 336)
-* line <1>: Arrays. (line 340)
-* line mode: Arrays. (line 336)
+* line: Arrays. (line 339)
+* line <1>: Arrays. (line 343)
+* line mode: Arrays. (line 339)
* Linear: graph. (line 691)
-* linecap: Pens. (line 135)
-* linejoin: Pens. (line 145)
-* lineskip: Pens. (line 188)
-* linetype: Pens. (line 119)
-* linewidth: Pens. (line 123)
+* linecap: Pens. (line 139)
+* linejoin: Pens. (line 149)
+* lineskip: Pens. (line 192)
+* linetype: Pens. (line 123)
+* linewidth: Pens. (line 127)
* locale: Data types. (line 315)
* log: Mathematical functions.
(line 6)
@@ -9400,23 +9414,23 @@ Index
* logarithmic graph: graph. (line 725)
* logical operators: Arithmetic & logical.
(line 6)
-* longdashdotted: Pens. (line 98)
-* longdashed: Pens. (line 98)
+* longdashdotted: Pens. (line 102)
+* longdashed: Pens. (line 102)
* longitude: Data types. (line 168)
* loop: Programming. (line 26)
-* lualatex: Options. (line 146)
-* luatex: Options. (line 146)
+* lualatex: Options. (line 147)
+* luatex: Options. (line 147)
* MacOS X binary distributions: MacOS X binary distributions.
(line 6)
-* makepen: Pens. (line 318)
+* makepen: Pens. (line 322)
* map: Arrays. (line 131)
* Margin: draw. (line 42)
* Margin <1>: draw. (line 42)
-* Margin3: three. (line 563)
-* Margin3 <1>: three. (line 563)
+* Margin3: three. (line 566)
+* Margin3 <1>: three. (line 566)
* Margins: draw. (line 42)
* margins: three. (line 247)
-* Margins3: three. (line 563)
+* Margins3: three. (line 566)
* mark: graph. (line 481)
* markangle: markers. (line 35)
* marker: graph. (line 481)
@@ -9430,8 +9444,8 @@ Index
* max: Paths and guides. (line 279)
* max <1>: Frames and pictures.
(line 7)
-* max <2>: Arrays. (line 218)
-* max <3>: Arrays. (line 228)
+* max <2>: Arrays. (line 221)
+* max <3>: Arrays. (line 231)
* max <4>: three. (line 484)
* maxbound: Data types. (line 134)
* maxbound <1>: Data types. (line 204)
@@ -9446,23 +9460,23 @@ Index
* MetaPost whatever: MetaPost. (line 10)
* Microsoft Windows: Microsoft Windows. (line 6)
* MidArcArrow: draw. (line 26)
-* MidArcArrow3: three. (line 547)
+* MidArcArrow3: three. (line 550)
* MidArrow: draw. (line 26)
-* MidArrow3: three. (line 547)
+* MidArrow3: three. (line 550)
* MidPoint: label. (line 55)
* midpoint: Paths and guides. (line 180)
* min: Paths and guides. (line 275)
* min <1>: Frames and pictures.
(line 7)
-* min <2>: Arrays. (line 213)
-* min <3>: Arrays. (line 223)
+* min <2>: Arrays. (line 216)
+* min <3>: Arrays. (line 226)
* min <4>: three. (line 484)
* minbound: Data types. (line 131)
* minbound <1>: Data types. (line 201)
* minipage: label. (line 116)
* mintimes: Paths and guides. (line 228)
-* miterjoin: Pens. (line 145)
-* miterlimit: Pens. (line 155)
+* miterjoin: Pens. (line 149)
+* miterlimit: Pens. (line 159)
* mktemp: Files. (line 44)
* mm: Figure size. (line 18)
* mode: Files. (line 76)
@@ -9470,8 +9484,9 @@ Index
* monotonic: graph. (line 36)
* mouse: GUI. (line 6)
* mouse bindings: three. (line 151)
-* Move: Pens. (line 355)
-* MoveQuiet: Pens. (line 361)
+* mouse wheel: GUI usage. (line 6)
+* Move: Pens. (line 359)
+* MoveQuiet: Pens. (line 365)
* multisample: three. (line 142)
* N: Labels. (line 18)
* name: Files. (line 89)
@@ -9489,18 +9504,18 @@ Index
* newton <1>: Mathematical functions.
(line 73)
* next: Debugger. (line 41)
-* NFSS: Pens. (line 202)
-* nobasealign: Pens. (line 177)
+* NFSS: Pens. (line 206)
+* nobasealign: Pens. (line 181)
* NoFill: draw. (line 26)
* NoFill <1>: Frames and pictures.
(line 154)
* NoMargin: draw. (line 42)
-* NoMargin3: three. (line 563)
+* NoMargin3: three. (line 566)
* None: draw. (line 19)
* None <1>: draw. (line 26)
* none: Files. (line 61)
* normal: three. (line 470)
-* nosafe: Options. (line 170)
+* nosafe: Options. (line 171)
* NOT: Arithmetic & logical.
(line 68)
* notaknot: graph. (line 36)
@@ -9520,12 +9535,12 @@ Index
* obliqueY: three. (line 315)
* obliqueZ: three. (line 302)
* ode: ode. (line 6)
-* offset: Pens. (line 119)
-* offset <1>: Options. (line 175)
+* offset: Pens. (line 123)
+* offset <1>: Options. (line 176)
* OmitTick: graph. (line 223)
* OmitTickInterval: graph. (line 223)
* OmitTickIntervals: graph. (line 223)
-* opacity: Pens. (line 233)
+* opacity: Pens. (line 237)
* open: Files. (line 12)
* OpenGL: three. (line 142)
* operator: User-defined operators.
@@ -9552,17 +9567,17 @@ Index
* outprefix: Frames and pictures.
(line 91)
* output: Files. (line 36)
-* output <1>: Options. (line 146)
+* output <1>: Options. (line 147)
* OutTicks: graph3. (line 35)
* overloading functions: Functions. (line 55)
-* overwrite: Pens. (line 340)
+* overwrite: Pens. (line 344)
* P: Mathematical functions.
(line 48)
* pack: label. (line 100)
* packing: Rest arguments. (line 30)
* pair: Figure size. (line 6)
* pair <1>: Data types. (line 46)
-* pairs: Arrays. (line 233)
+* pairs: Arrays. (line 236)
* paperheight: Configuring. (line 58)
* papertype: Configuring. (line 58)
* paperwidth: Configuring. (line 58)
@@ -9580,20 +9595,20 @@ Index
* path3: three. (line 6)
* path3 <1>: three. (line 42)
* path[]: Paths. (line 23)
-* patterns: Pens. (line 251)
+* patterns: Pens. (line 255)
* patterns <1>: patterns. (line 6)
-* PDF: Options. (line 146)
-* pdflatex: Options. (line 146)
-* pdfreloadOptions: Options. (line 132)
+* PDF: Options. (line 147)
+* pdflatex: Options. (line 147)
+* pdfreloadOptions: Options. (line 133)
* pdfviewer: Configuring. (line 6)
-* pdfviewerOptions: Options. (line 132)
+* pdfviewerOptions: Options. (line 133)
* pen: Pens. (line 6)
* PenMargin: draw. (line 42)
-* PenMargin2: three. (line 563)
-* PenMargin3: three. (line 563)
+* PenMargin2: three. (line 566)
+* PenMargin3: three. (line 566)
* PenMargins: draw. (line 42)
-* PenMargins2: three. (line 563)
-* PenMargins3: three. (line 563)
+* PenMargins2: three. (line 566)
+* PenMargins3: three. (line 566)
* periodic: graph. (line 36)
* perl: LaTeX usage. (line 30)
* perpendicular: geometry. (line 6)
@@ -9603,7 +9618,7 @@ Index
* picture alignment: Frames and pictures.
(line 228)
* piecewisestraight: Paths and guides. (line 92)
-* pixel: three. (line 570)
+* pixel: three. (line 573)
* Pl: Mathematical functions.
(line 48)
* plain: plain. (line 6)
@@ -9625,7 +9640,7 @@ Index
(line 19)
* postscript: Frames and pictures.
(line 294)
-* PostScript fonts: Pens. (line 220)
+* PostScript fonts: Pens. (line 224)
* PostScript subpath: Paths. (line 23)
* pow10: Mathematical functions.
(line 6)
@@ -9640,13 +9655,13 @@ Index
* pstoedit: PostScript to Asymptote.
(line 6)
* psviewer: Configuring. (line 6)
-* psviewerOptions: Options. (line 132)
+* psviewerOptions: Options. (line 133)
* pt: Figure size. (line 18)
* public: Structures. (line 6)
* push: Arrays. (line 39)
* Python usage: Interactive mode. (line 72)
-* quadraticroots: Arrays. (line 302)
-* quadraticroots <1>: Arrays. (line 307)
+* quadraticroots: Arrays. (line 305)
+* quadraticroots <1>: Arrays. (line 310)
* quarticroots: math. (line 22)
* quick reference: Description. (line 81)
* quit: Drawing in interactive mode.
@@ -9670,9 +9685,9 @@ Index
(line 39)
* randMax: Mathematical functions.
(line 39)
-* read: Arrays. (line 376)
+* read: Arrays. (line 379)
* reading: Files. (line 12)
-* reading string arrays: Arrays. (line 346)
+* reading string arrays: Arrays. (line 349)
* readline: Files. (line 135)
* real: Data types. (line 35)
* realDigits: Data types. (line 35)
@@ -9693,9 +9708,9 @@ Index
* rename: Files. (line 152)
* render: three. (line 46)
* render <1>: three. (line 142)
-* render <2>: Options. (line 146)
+* render <2>: Options. (line 147)
* replace: Data types. (line 269)
-* resetdefaultpen: Pens. (line 367)
+* resetdefaultpen: Pens. (line 371)
* rest arguments: Rest arguments. (line 6)
* restore: Frames and pictures.
(line 288)
@@ -9709,7 +9724,8 @@ Index
* rewind: Files. (line 93)
* rfind: Data types. (line 246)
* rgb: Pens. (line 30)
-* rgb <1>: Pens. (line 58)
+* rgb <1>: Pens. (line 34)
+* rgb <2>: Pens. (line 62)
* Riemann zeta function: Mathematical functions.
(line 48)
* Right: graph. (line 272)
@@ -9722,21 +9738,21 @@ Index
* Rotate(pair z): label. (line 39)
* round: Mathematical functions.
(line 26)
-* roundcap: Pens. (line 135)
+* roundcap: Pens. (line 139)
* roundedpath: roundedpath. (line 6)
-* roundjoin: Pens. (line 145)
+* roundjoin: Pens. (line 149)
* roundrectangle: flowchart. (line 66)
* RPM: UNIX binary distributions.
(line 6)
* runtime imports: Import. (line 97)
* Russian: unicode. (line 7)
* S: Labels. (line 18)
-* safe: Options. (line 170)
+* safe: Options. (line 171)
* save: Frames and pictures.
(line 285)
* saveline: Files. (line 135)
* Scale: label. (line 45)
-* scale: Pens. (line 119)
+* scale: Pens. (line 123)
* scale <1>: Transforms. (line 34)
* scale <2>: Transforms. (line 36)
* scale <3>: graph. (line 691)
@@ -9763,16 +9779,16 @@ Index
(line 6)
* sequence: Arrays. (line 118)
* settings: Configuring. (line 21)
-* settings <1>: Options. (line 117)
+* settings <1>: Options. (line 118)
* sgn: Mathematical functions.
(line 26)
* shading: fill. (line 32)
* Shift: label. (line 33)
* shift: Transforms. (line 26)
* shift <1>: Transforms. (line 28)
-* shift <2>: Transforms. (line 44)
+* shift <2>: Transforms. (line 46)
* shift <3>: three. (line 427)
-* shiftless: Transforms. (line 44)
+* shiftless: Transforms. (line 46)
* shipout: Frames and pictures.
(line 91)
* showtarget: three. (line 319)
@@ -9806,7 +9822,7 @@ Index
* size <4>: Frames and pictures.
(line 74)
* size <5>: three. (line 484)
-* size <6>: Options. (line 146)
+* size <6>: Options. (line 147)
* size3: three. (line 244)
* Slant: label. (line 42)
* slant: Transforms. (line 38)
@@ -9821,10 +9837,10 @@ Index
* smoothcontour3: smoothcontour3. (line 6)
* sncndn: Mathematical functions.
(line 48)
-* solid: Pens. (line 98)
+* solid: Pens. (line 102)
* solids: solids. (line 6)
-* solve: Arrays. (line 271)
-* solve <1>: Arrays. (line 287)
+* solve: Arrays. (line 274)
+* solve <1>: Arrays. (line 290)
* sort: Arrays. (line 177)
* sort <1>: Arrays. (line 181)
* sort <2>: Arrays. (line 196)
@@ -9833,7 +9849,7 @@ Index
* split: Data types. (line 278)
* sqrt: Mathematical functions.
(line 6)
-* squarecap: Pens. (line 135)
+* squarecap: Pens. (line 139)
* srand: Mathematical functions.
(line 39)
* stack overflow: Functions. (line 100)
@@ -9864,17 +9880,17 @@ Index
* subpictures: Frames and pictures.
(line 113)
* substr: Data types. (line 261)
-* sum: Arrays. (line 208)
+* sum: Arrays. (line 211)
* superpath: Paths. (line 23)
-* Suppress: Pens. (line 347)
-* SuppressQuiet: Pens. (line 351)
+* Suppress: Pens. (line 351)
+* SuppressQuiet: Pens. (line 355)
* surface: three. (line 46)
* surface <1>: three. (line 88)
* surface <2>: three. (line 102)
* surface <3>: graph3. (line 99)
-* SVG: Options. (line 151)
+* SVG: Options. (line 152)
* system: Data types. (line 353)
-* system <1>: Options. (line 170)
+* system <1>: Options. (line 171)
* syzygy: syzygy. (line 6)
* tab: Files. (line 61)
* tab completion: Drawing in interactive mode.
@@ -9895,12 +9911,12 @@ Index
* tessellation: three. (line 114)
* tex: Frames and pictures.
(line 302)
-* tex <1>: Options. (line 146)
-* TeX fonts: Pens. (line 211)
+* tex <1>: Options. (line 147)
+* TeX fonts: Pens. (line 215)
* TeX string: Data types. (line 207)
* texcommand: Configuring. (line 64)
* TeXHead: draw. (line 26)
-* TeXHead3: three. (line 547)
+* TeXHead3: three. (line 550)
* texpath: Configuring. (line 64)
* texpath <1>: label. (line 113)
* texpreamble: Frames and pictures.
@@ -9922,8 +9938,8 @@ Index
* Ticks: graph. (line 160)
* Ticks <1>: graph. (line 233)
* tildeframe: markers. (line 24)
-* tile: Pens. (line 265)
-* tilings: Pens. (line 251)
+* tile: Pens. (line 269)
+* tilings: Pens. (line 255)
* time: Data types. (line 320)
* time <1>: Data types. (line 345)
* time <2>: math. (line 30)
@@ -9937,24 +9953,24 @@ Index
* transform: Transforms. (line 6)
* transform <1>: three. (line 459)
* transform3: three. (line 422)
-* transparency: Pens. (line 233)
-* transpose: Arrays. (line 200)
-* transpose <1>: Arrays. (line 203)
+* transparency: Pens. (line 237)
+* transpose: Arrays. (line 203)
+* transpose <1>: Arrays. (line 206)
* tree: tree. (line 6)
* trembling: trembling. (line 6)
* triangle: geometry. (line 6)
* triangles: three. (line 114)
* triangulate: contour. (line 149)
-* tridiagonal: Arrays. (line 258)
+* tridiagonal: Arrays. (line 261)
* trigonometric integrals: Mathematical functions.
(line 48)
* triple: Data types. (line 137)
* TrueMargin: draw. (line 42)
-* TrueMargin3: three. (line 563)
+* TrueMargin3: three. (line 566)
* tube: three. (line 125)
* tube <1>: tube. (line 6)
* tutorial: Tutorial. (line 6)
-* type1cm: Pens. (line 188)
+* type1cm: Pens. (line 192)
* typedef: Data types. (line 384)
* typedef <1>: Functions. (line 46)
* U3D: embed. (line 22)
@@ -10006,7 +10022,7 @@ Index
* vectorfield: graph. (line 1005)
* vectorfield <1>: graph. (line 1044)
* vectorfield3: graph3. (line 157)
-* vectorization: Arrays. (line 315)
+* vectorization: Arrays. (line 318)
* verbatim: Frames and pictures.
(line 294)
* vertex-dependent colors: three. (line 79)
@@ -10024,17 +10040,17 @@ Index
* Wheel: palette. (line 22)
* wheel mouse: GUI. (line 6)
* while: Programming. (line 48)
-* white-space string delimiter mode: Arrays. (line 346)
+* white-space string delimiter mode: Arrays. (line 349)
* width: LaTeX usage. (line 50)
* windingnumber: Paths and guides. (line 283)
-* word: Arrays. (line 346)
+* word: Arrays. (line 349)
* write: Files. (line 53)
-* write <1>: Arrays. (line 385)
+* write <1>: Arrays. (line 388)
* X: three. (line 259)
* xasy: GUI. (line 6)
* xaxis3: graph3. (line 7)
* xdr: Files. (line 76)
-* xelatex: Options. (line 146)
+* xelatex: Options. (line 147)
* XEquals: graph. (line 265)
* xequals: graph. (line 278)
* xlimits: graph. (line 640)
@@ -10073,7 +10089,8 @@ Index
* YZZero: graph3. (line 21)
* Z: three. (line 259)
* zaxis3: graph3. (line 7)
-* zerowinding: Pens. (line 160)
+* zeroTransform: Transforms. (line 44)
+* zerowinding: Pens. (line 164)
* zero_Ai: Mathematical functions.
(line 48)
* zero_Ai_deriv: Mathematical functions.
@@ -10131,115 +10148,115 @@ Node: Paths and guides75620
Ref: circle75874
Ref: extension85581
Node: Pens92390
-Ref: fillrule99897
-Ref: basealign100801
-Ref: transparency103635
-Ref: makepen107215
-Ref: overwrite108098
-Node: Transforms109312
-Node: Frames and pictures111094
-Ref: envelope112252
-Ref: size113345
-Ref: unitsize114332
-Ref: shipout115405
-Ref: filltype117756
-Ref: add120928
-Ref: add about121934
-Ref: tex124963
-Node: Files125859
-Ref: cd126846
-Ref: scroll131531
-Node: Variable initializers134449
-Node: Structures137166
-Node: Operators144668
-Node: Arithmetic & logical144982
-Node: Self & prefix operators147353
-Node: User-defined operators148147
-Node: Implicit scaling149060
-Node: Functions149623
-Ref: stack overflow152766
-Node: Default arguments153048
-Node: Named arguments153804
-Node: Rest arguments156374
-Node: Mathematical functions159496
-Node: Arrays164159
-Ref: sort171267
-Ref: tridiagonal173696
-Ref: solve174927
-Node: Slices179066
-Node: Casts182974
-Node: Import185241
-Node: Static190499
-Node: LaTeX usage193392
-Node: Base modules199909
-Node: plain202466
-Node: simplex203140
-Node: math203414
-Node: interpolate206123
-Node: geometry206402
-Node: trembling206996
-Node: stats207265
-Node: patterns207525
-Node: markers207761
-Node: tree209621
-Node: binarytree209806
-Node: drawtree210472
-Node: syzygy210673
-Node: feynman210947
-Node: roundedpath211222
-Node: animation211505
-Ref: animate211926
-Node: embed213043
-Node: slide213998
-Node: MetaPost214339
-Node: unicode215058
-Node: latin1215932
-Node: babel216301
-Node: labelpath216531
-Node: labelpath3217352
-Node: annotate217663
-Node: CAD218133
-Node: graph218444
-Ref: ticks225605
-Ref: pathmarkers239397
-Ref: marker239868
-Ref: markuniform240222
-Ref: errorbars242030
-Ref: automatic scaling246504
-Node: palette258251
-Ref: images258369
-Ref: image262543
-Ref: logimage263063
-Ref: penimage264168
-Ref: penfunctionimage264430
-Node: three265201
-Ref: PostScript3D292212
-Node: obj293951
-Node: graph3294200
-Ref: GaussianSurface299480
-Node: grid3300629
-Node: solids301413
-Node: tube302405
-Node: flowchart304639
-Node: contour309247
-Node: contour3314562
-Node: smoothcontour3314875
-Node: slopefield316596
-Node: ode318085
-Node: Options318342
-Ref: configuration file324506
-Ref: settings324506
-Ref: texengines325749
-Ref: convert325749
-Node: Interactive mode329073
-Ref: history331223
-Node: GUI332527
-Node: GUI installation333078
-Node: GUI usage333989
-Node: PostScript to Asymptote334897
-Node: Help335655
-Node: Debugger337309
-Node: Credits339065
-Node: Index340047
+Ref: fillrule100079
+Ref: basealign100983
+Ref: transparency103817
+Ref: makepen107397
+Ref: overwrite108280
+Node: Transforms109494
+Node: Frames and pictures111326
+Ref: envelope112484
+Ref: size113577
+Ref: unitsize114564
+Ref: shipout115637
+Ref: filltype117988
+Ref: add121160
+Ref: add about122166
+Ref: tex125195
+Node: Files126091
+Ref: cd127078
+Ref: scroll131763
+Node: Variable initializers134681
+Node: Structures137398
+Node: Operators144900
+Node: Arithmetic & logical145214
+Node: Self & prefix operators147585
+Node: User-defined operators148379
+Node: Implicit scaling149292
+Node: Functions149855
+Ref: stack overflow152998
+Node: Default arguments153280
+Node: Named arguments154036
+Node: Rest arguments156606
+Node: Mathematical functions159728
+Node: Arrays164391
+Ref: sort171499
+Ref: tridiagonal174124
+Ref: solve175355
+Node: Slices179494
+Node: Casts183402
+Node: Import185669
+Node: Static190927
+Node: LaTeX usage193820
+Node: Base modules200337
+Node: plain202894
+Node: simplex203568
+Node: math203842
+Node: interpolate206551
+Node: geometry206830
+Node: trembling207424
+Node: stats207693
+Node: patterns207953
+Node: markers208189
+Node: tree210049
+Node: binarytree210234
+Node: drawtree210900
+Node: syzygy211101
+Node: feynman211375
+Node: roundedpath211650
+Node: animation211933
+Ref: animate212354
+Node: embed213471
+Node: slide214426
+Node: MetaPost214767
+Node: unicode215486
+Node: latin1216360
+Node: babel216729
+Node: labelpath216959
+Node: labelpath3217780
+Node: annotate218091
+Node: CAD218561
+Node: graph218872
+Ref: ticks226033
+Ref: pathmarkers239825
+Ref: marker240296
+Ref: markuniform240650
+Ref: errorbars242458
+Ref: automatic scaling246932
+Node: palette258679
+Ref: images258797
+Ref: image262971
+Ref: logimage263491
+Ref: penimage264596
+Ref: penfunctionimage264858
+Node: three265629
+Ref: PostScript3D292801
+Node: obj294539
+Node: graph3294788
+Ref: GaussianSurface300068
+Node: grid3301217
+Node: solids302001
+Node: tube302993
+Node: flowchart305227
+Node: contour309835
+Node: contour3315150
+Node: smoothcontour3315463
+Node: slopefield317184
+Node: ode318673
+Node: Options318930
+Ref: configuration file325159
+Ref: settings325159
+Ref: texengines326402
+Ref: convert326402
+Node: Interactive mode329726
+Ref: history331876
+Node: GUI333182
+Node: GUI installation333733
+Node: GUI usage334415
+Node: PostScript to Asymptote335331
+Node: Help336089
+Node: Debugger337743
+Node: Credits339499
+Node: Index340481

End Tag Table
diff --git a/Build/source/utils/asymptote/drawclipbegin.h b/Build/source/utils/asymptote/drawclipbegin.h
index ffdcf449e63..58b4ac57949 100644
--- a/Build/source/utils/asymptote/drawclipbegin.h
+++ b/Build/source/utils/asymptote/drawclipbegin.h
@@ -22,8 +22,10 @@ public:
reportError("cannot clip to non-cyclic path");
}
- drawClipBegin(const vm::array& src, bool stroke, pen pentype, bool gsave=true)
- : drawSuperPathPenBase(src,pentype), gsave(gsave), stroke(stroke) {
+ drawClipBegin(const vm::array& src, bool stroke, pen pentype,
+ bool gsave=true, const string& key="") :
+ drawElement(key), drawSuperPathPenBase(src,pentype), gsave(gsave),
+ stroke(stroke) {
if(!stroke && !cyclic()) noncyclic();
}
@@ -80,7 +82,7 @@ public:
drawElement *transformed(const transform& t)
{
- return new drawClipBegin(transpath(t),stroke,transpen(t));
+ return new drawClipBegin(transpath(t),stroke,transpen(t),gsave,KEY);
}
};
diff --git a/Build/source/utils/asymptote/drawelement.h b/Build/source/utils/asymptote/drawelement.h
index e171dc9b18f..cf77fef722b 100644
--- a/Build/source/utils/asymptote/drawelement.h
+++ b/Build/source/utils/asymptote/drawelement.h
@@ -121,6 +121,11 @@ typedef mem::vector<groupmap> groupsmap;
class drawElement : public gc
{
public:
+ string KEY;
+
+ drawElement(const string& key="") : KEY(key == "" ? processData().KEY : key)
+ {}
+
virtual ~drawElement() {}
static pen lastpen;
@@ -159,6 +164,8 @@ public:
virtual bool islabel() {return false;}
+ virtual bool isnewpage() {return false;}
+
virtual bool islayer() {return false;}
virtual bool is3D() {return false;}
@@ -232,7 +239,8 @@ public:
copyArray4x4C(T,&t);
}
- drawElementLC(const double* t, const drawElementLC *s) : T(NULL) {
+ drawElementLC(const double* t, const drawElementLC *s) :
+ drawElement(s->KEY), T(NULL) {
multiplyTransform3(T,t,s->T);
}
diff --git a/Build/source/utils/asymptote/drawfill.cc b/Build/source/utils/asymptote/drawfill.cc
index 3147fbe8850..49a0e17c385 100644
--- a/Build/source/utils/asymptote/drawfill.cc
+++ b/Build/source/utils/asymptote/drawfill.cc
@@ -52,19 +52,19 @@ bool drawFill::draw(psfile *out)
drawElement *drawFill::transformed(const transform& t)
{
- return new drawFill(transpath(t),stroke,transpen(t));
+ return new drawFill(transpath(t),stroke,transpen(t),KEY);
}
drawElement *drawLatticeShade::transformed(const transform& t)
{
- return new drawLatticeShade(transpath(t),stroke,pentype,pens,t*T);
+ return new drawLatticeShade(transpath(t),stroke,pentype,pens,t*T,KEY);
}
drawElement *drawAxialShade::transformed(const transform& t)
{
pair A=t*a, B=t*b;
return new drawAxialShade(transpath(t),stroke,pentype,A,extenda,penb,B,
- extendb);
+ extendb,KEY);
}
drawElement *drawRadialShade::transformed(const transform& t)
@@ -72,8 +72,8 @@ drawElement *drawRadialShade::transformed(const transform& t)
pair A=t*a, B=t*b;
double RA=length(t*(a+ra)-A);
double RB=length(t*(b+rb)-B);
- return new drawRadialShade(transpath(t),stroke,pentype,A,RA,extenda,penb,B,RB,
- extendb);
+ return new drawRadialShade(transpath(t),stroke,pentype,A,RA,extenda,penb,B,
+ RB,extendb,KEY);
}
drawElement *drawGouraudShade::transformed(const transform& t)
@@ -83,7 +83,8 @@ drawElement *drawGouraudShade::transformed(const transform& t)
for(size_t i=0; i < size; i++)
(*Vertices)[i]=t*vm::read<pair>(vertices,i);
- return new drawGouraudShade(transpath(t),stroke,pentype,pens,*Vertices,edges);
+ return new drawGouraudShade(transpath(t),stroke,pentype,pens,*Vertices,
+ edges,KEY);
}
drawElement *drawTensorShade::transformed(const transform& t)
@@ -105,7 +106,8 @@ drawElement *drawTensorShade::transformed(const transform& t)
(*Zi)[j]=t*vm::read<pair>(zi,j);
}
- return new drawTensorShade(transpath(t),stroke,pentype,pens,*Boundaries,*Z);
+ return new drawTensorShade(transpath(t),stroke,pentype,pens,*Boundaries,*Z,
+ KEY);
}
bool drawFunctionShade::write(texfile *out, const bbox& box)
@@ -165,7 +167,7 @@ bool drawFunctionShade::write(texfile *out, const bbox& box)
drawElement *drawFunctionShade::transformed(const transform& t)
{
- return new drawFunctionShade(transpath(t),stroke,pentype,shader);
+ return new drawFunctionShade(transpath(t),stroke,pentype,shader,KEY);
}
} // namespace camp
diff --git a/Build/source/utils/asymptote/drawfill.h b/Build/source/utils/asymptote/drawfill.h
index c75c714d962..4f7df49f967 100644
--- a/Build/source/utils/asymptote/drawfill.h
+++ b/Build/source/utils/asymptote/drawfill.h
@@ -21,8 +21,9 @@ public:
reportError("non-cyclic path cannot be filled");
}
- drawFill(const vm::array& src, bool stroke, pen pentype)
- : drawSuperPathPenBase(src,pentype), stroke(stroke) {
+ drawFill(const vm::array& src, bool stroke, pen pentype,
+ const string& key="") :
+ drawElement(key), drawSuperPathPenBase(src,pentype), stroke(stroke) {
if(!stroke && !cyclic()) noncyclic();
}
@@ -51,8 +52,9 @@ public:
class drawShade : public drawFill {
public:
- drawShade(const vm::array& src, bool stroke, pen pentype)
- : drawFill(src,stroke,pentype) {}
+ drawShade(const vm::array& src, bool stroke, pen pentype,
+ const string& key="")
+ : drawFill(src,stroke,pentype,key) {}
void bounds(bbox& b, iopipestream& iopipe, boxvector& vbox,
bboxlist& bboxstack) {
@@ -85,9 +87,10 @@ protected:
vm::array pens;
const transform T;
public:
- drawLatticeShade(const vm::array& src, bool stroke, pen pentype,
- const vm::array& pens, const camp::transform& T=identity)
- : drawShade(src,stroke,pentype), pens(pens), T(T) {}
+ drawLatticeShade(const vm::array& src, bool stroke,
+ pen pentype, const vm::array& pens,
+ const camp::transform& T=identity, const string& key="")
+ : drawShade(src,stroke,pentype,key), pens(pens), T(T) {}
void palette(psfile *out) {
out->gsave();
@@ -121,10 +124,11 @@ protected:
bool extendb;
ColorSpace colorspace;
public:
- drawAxialShade(const vm::array& src, bool stroke, pen pentype,
- pair a, bool extenda, pen penb, pair b, bool extendb)
- : drawShade(src,stroke,pentype), a(a), extenda(extenda), penb(penb),
- b(b), extendb(extendb) {}
+ drawAxialShade(const vm::array& src, bool stroke,
+ pen pentype, pair a, bool extenda, pen penb, pair b,
+ bool extendb, const string& key="")
+ : drawShade(src,stroke,pentype,key), a(a), extenda(extenda),
+ penb(penb), b(b), extendb(extendb) {}
bool svgpng() {return false;}
@@ -148,9 +152,9 @@ protected:
public:
drawRadialShade(const vm::array& src, bool stroke,
pen pentype, pair a, double ra, bool extenda, pen penb,
- pair b, double rb, bool extendb)
- : drawAxialShade(src,stroke,pentype,a,extenda,penb,b,extendb),
- ra(ra), rb(rb) {}
+ pair b, double rb, bool extendb, const string& key="")
+ : drawAxialShade(src,stroke,pentype,a,extenda,penb,b,
+ extendb,key), ra(ra), rb(rb) {}
bool svgpng() {return ra > 0.0;}
@@ -169,11 +173,12 @@ class drawGouraudShade : public drawShade {
protected:
vm::array pens,vertices,edges;
public:
- drawGouraudShade(const vm::array& src, bool stroke, pen pentype,
- const vm::array& pens, const vm::array& vertices,
- const vm::array& edges)
- : drawShade(src,stroke,pentype), pens(pens), vertices(vertices),
- edges(edges) {}
+ drawGouraudShade(const vm::array& src, bool stroke,
+ pen pentype, const vm::array& pens,
+ const vm::array& vertices, const vm::array& edges,
+ const string& key="")
+ : drawElement(key), drawShade(src,stroke,pentype,key), pens(pens),
+ vertices(vertices), edges(edges) {}
bool svgpng() {return !settings::getSetting<bool>("svgemulation");}
@@ -198,8 +203,10 @@ protected:
public:
drawTensorShade(const vm::array& src, bool stroke,
pen pentype, const vm::array& pens,
- const vm::array& boundaries, const vm::array& z)
- : drawShade(src,stroke,pentype), pens(pens), boundaries(boundaries), z(z) {}
+ const vm::array& boundaries, const vm::array& z,
+ const string& key="") :
+ drawShade(src,stroke,pentype,key), pens(pens), boundaries(boundaries),
+ z(z) {}
bool svgpng() {
return pens.size() > 1 || !settings::getSetting<bool>("svgemulation");
@@ -224,9 +231,9 @@ class drawFunctionShade : public drawFill {
protected:
string shader;
public:
- drawFunctionShade(const vm::array& src, bool stroke, pen pentype,
- const string& shader)
- : drawFill(src,stroke,pentype), shader(shader) {
+ drawFunctionShade(const vm::array& src, bool stroke,
+ pen pentype, const string& shader, const string& key="")
+ : drawFill(src,stroke,pentype,key), shader(shader) {
string texengine=settings::getSetting<string>("tex");
if(!settings::pdf(texengine))
reportError("functionshade is not implemented for the '"+texengine+
diff --git a/Build/source/utils/asymptote/drawimage.h b/Build/source/utils/asymptote/drawimage.h
index 860e8283bfb..a3c5971dc4a 100644
--- a/Build/source/utils/asymptote/drawimage.h
+++ b/Build/source/utils/asymptote/drawimage.h
@@ -18,8 +18,8 @@ protected:
transform t;
bool antialias;
public:
- drawImage(const transform& t, bool antialias)
- : t(t), antialias(antialias) {}
+ drawImage(const transform& t, bool antialias, const string& key="")
+ : drawElement(key), t(t), antialias(antialias) {}
virtual ~drawImage() {}
@@ -37,8 +37,8 @@ class drawPaletteImage : public drawImage {
vm::array palette;
public:
drawPaletteImage(const vm::array& image, const vm::array& palette,
- const transform& t, bool antialias)
- : drawImage(t,antialias), image(image), palette(palette) {}
+ const transform& t, bool antialias, const string& key="")
+ : drawImage(t,antialias,key), image(image), palette(palette) {}
virtual ~drawPaletteImage() {}
@@ -53,15 +53,16 @@ public:
}
drawElement *transformed(const transform& T) {
- return new drawPaletteImage(image,palette,T*t,antialias);
+ return new drawPaletteImage(image,palette,T*t,antialias,KEY);
}
};
class drawNoPaletteImage : public drawImage {
vm::array image;
public:
- drawNoPaletteImage(const vm::array& image, const transform& t, bool antialias)
- : drawImage(t,antialias), image(image) {}
+ drawNoPaletteImage(const vm::array& image, const transform& t,
+ bool antialias, const string& key="")
+ : drawImage(t,antialias,key), image(image) {}
virtual ~drawNoPaletteImage() {}
@@ -74,7 +75,7 @@ public:
}
drawElement *transformed(const transform& T) {
- return new drawNoPaletteImage(image,T*t,antialias);
+ return new drawNoPaletteImage(image,T*t,antialias,KEY);
}
};
@@ -84,8 +85,8 @@ class drawFunctionImage : public drawImage {
Int width, height;
public:
drawFunctionImage(vm::stack *Stack, vm::callable *f, Int width, Int height,
- const transform& t, bool antialias)
- : drawImage(t,antialias), Stack(Stack), f(f),
+ const transform& t, bool antialias, const string& key="")
+ : drawImage(t,antialias,key), Stack(Stack), f(f),
width(width), height(height) {}
virtual ~drawFunctionImage() {}
@@ -99,7 +100,7 @@ public:
}
drawElement *transformed(const transform& T) {
- return new drawFunctionImage(Stack,f,width,height,T*t,antialias);
+ return new drawFunctionImage(Stack,f,width,height,T*t,antialias,KEY);
}
};
@@ -108,8 +109,8 @@ class drawRawImage : public drawImage {
size_t width,height;
public:
drawRawImage(unsigned char *raw, size_t width, size_t height,
- const transform& t, bool antialias)
- : drawImage(t,antialias), raw(raw), width(width), height(height) {}
+ const transform& t, bool antialias, const string& key="")
+ : drawImage(t,antialias,key), raw(raw), width(width), height(height) {}
virtual ~drawRawImage() {}
diff --git a/Build/source/utils/asymptote/drawlabel.cc b/Build/source/utils/asymptote/drawlabel.cc
index 1baaf18fe57..35a01094f70 100644
--- a/Build/source/utils/asymptote/drawlabel.cc
+++ b/Build/source/utils/asymptote/drawlabel.cc
@@ -196,7 +196,7 @@ bool drawLabel::write(texfile *out, const bbox&)
drawElement *drawLabel::transformed(const transform& t)
{
return new drawLabel(label,size,t*T,t*position,
- length(align)*unit(shiftless(t)*align),pentype);
+ length(align)*unit(shiftless(t)*align),pentype,KEY);
}
void drawLabelPath::bounds(bbox& b, iopipestream& tex, boxvector&, bboxlist&)
@@ -265,7 +265,7 @@ bool drawLabelPath::write(texfile *out, const bbox&)
drawElement *drawLabelPath::transformed(const transform& t)
{
return new drawLabelPath(label,size,transpath(t),justify,shift,
- transpen(t));
+ transpen(t),KEY);
}
} //namespace camp
diff --git a/Build/source/utils/asymptote/drawlabel.h b/Build/source/utils/asymptote/drawlabel.h
index 56d4f2d3b2d..c16209bc51e 100644
--- a/Build/source/utils/asymptote/drawlabel.h
+++ b/Build/source/utils/asymptote/drawlabel.h
@@ -33,10 +33,11 @@ protected:
public:
drawLabel(string label, string size, transform T, pair position,
- pair align, pen pentype)
- : label(label), size(size), T(shiftless(T)), position(position),
- align(align), pentype(pentype), width(0.0), height(0.0), depth(0.0),
- havebounds(false), suppress(false), enabled(false) {}
+ pair align, pen pentype, const string& key="")
+ : drawElement(key), label(label), size(size), T(shiftless(T)),
+ position(position), align(align), pentype(pentype), width(0.0),
+ height(0.0), depth(0.0), havebounds(false), suppress(false),
+ enabled(false) {}
virtual ~drawLabel() {}
@@ -63,8 +64,9 @@ private:
pair shift;
public:
drawLabelPath(string label, string size, path src,
- string justify, pair shift, pen pentype) :
- drawLabel(label,size,identity,pair(0.0,0.0),pair(0.0,0.0),pentype),
+ string justify, pair shift, pen pentype,
+ const string& key="") :
+ drawLabel(label,size,identity,pair(0.0,0.0),pair(0.0,0.0),pentype,key),
drawPathPenBase(src,pentype), justify(justify), shift(shift) {}
virtual ~drawLabelPath() {}
diff --git a/Build/source/utils/asymptote/drawlayer.h b/Build/source/utils/asymptote/drawlayer.h
index ca877effa15..1f4500dac2c 100644
--- a/Build/source/utils/asymptote/drawlayer.h
+++ b/Build/source/utils/asymptote/drawlayer.h
@@ -28,6 +28,7 @@ public:
virtual ~drawNewPage() {}
bool islabel() {return true;}
+ bool isnewpage() {return true;}
bool write(texfile *out, const bbox&) {
out->verbatimline(settings::latex(out->texengine) ? "\\newpage" :
diff --git a/Build/source/utils/asymptote/drawpath.cc b/Build/source/utils/asymptote/drawpath.cc
index 9e2bce31bde..bb6dc393bd9 100644
--- a/Build/source/utils/asymptote/drawpath.cc
+++ b/Build/source/utils/asymptote/drawpath.cc
@@ -157,9 +157,9 @@ bool drawPath::draw(psfile *out)
return true;
}
-drawElement *drawPath::transformed(const transform& t)
+drawElement *drawPath::transformed(const transform& t)
{
- return new drawPath(transpath(t), transpen(t));
+ return new drawPath(transpath(t),transpen(t),KEY);
}
} //namespace camp
diff --git a/Build/source/utils/asymptote/drawpath.h b/Build/source/utils/asymptote/drawpath.h
index fe519a7258d..93ec38eb69e 100644
--- a/Build/source/utils/asymptote/drawpath.h
+++ b/Build/source/utils/asymptote/drawpath.h
@@ -15,7 +15,8 @@ namespace camp {
class drawPath : public drawPathPenBase {
public:
- drawPath(path src, pen pentype) : drawPathPenBase(src, pentype) {}
+ drawPath(path src, pen pentype, const string& key="") :
+ drawElement(key), drawPathPenBase(src,pentype) {}
virtual ~drawPath() {}
diff --git a/Build/source/utils/asymptote/drawpath3.h b/Build/source/utils/asymptote/drawpath3.h
index 0c5672aa9da..dc5b1273967 100644
--- a/Build/source/utils/asymptote/drawpath3.h
+++ b/Build/source/utils/asymptote/drawpath3.h
@@ -26,13 +26,14 @@ protected:
Interaction interaction;
triple Min,Max;
public:
- drawPath3(path3 g, triple center, const pen& p, Interaction interaction) :
- g(g), center(center), straight(g.piecewisestraight()), color(rgba(p)),
- invisible(p.invisible()), interaction(interaction),
+ drawPath3(path3 g, triple center, const pen& p, Interaction interaction,
+ const string& key="") :
+ drawElement(key), g(g), center(center), straight(g.piecewisestraight()),
+ color(rgba(p)), invisible(p.invisible()), interaction(interaction),
Min(g.min()), Max(g.max()) {}
drawPath3(const double* t, const drawPath3 *s) :
- g(camp::transformed(t,s->g)), straight(s->straight),
+ drawElement(s->KEY), g(camp::transformed(t,s->g)), straight(s->straight),
color(s->color), invisible(s->invisible), interaction(s->interaction),
Min(g.min()), Max(g.max()) {
center=t*s->center;
@@ -93,8 +94,8 @@ protected:
public:
drawNurbsPath3(const vm::array& g, const vm::array* knot,
- const vm::array* weight, const pen& p) :
- color(rgba(p)), invisible(p.invisible()) {
+ const vm::array* weight, const pen& p, const string& key="") :
+ drawElement(key), color(rgba(p)), invisible(p.invisible()) {
size_t weightsize=checkArray(weight);
string wrongsize="Inconsistent NURBS data";
@@ -131,8 +132,8 @@ public:
}
drawNurbsPath3(const double* t, const drawNurbsPath3 *s) :
- degree(s->degree), n(s->n), weights(s->weights), knots(s->knots),
- color(s->color), invisible(s->invisible) {
+ drawElement(s->KEY), degree(s->degree), n(s->n), weights(s->weights),
+ knots(s->knots), color(s->color), invisible(s->invisible) {
controls=new(UseGC) triple[n];
for(unsigned int i=0; i < n; ++i)
controls[i]=t*s->controls[i];
diff --git a/Build/source/utils/asymptote/drawsurface.cc b/Build/source/utils/asymptote/drawsurface.cc
index ac82cfc9a5e..2b0b7fefa23 100644
--- a/Build/source/utils/asymptote/drawsurface.cc
+++ b/Build/source/utils/asymptote/drawsurface.cc
@@ -114,7 +114,7 @@ void drawBezierPatch::bounds(const double* t, bbox3& b)
double X,Y,Z;
if(straight) {
- triple Vertices[3];
+ triple Vertices[4];
if(t == NULL) {
Vertices[0]=controls[0];
Vertices[1]=controls[3];
diff --git a/Build/source/utils/asymptote/drawsurface.h b/Build/source/utils/asymptote/drawsurface.h
index 811387a3b2a..4c1736cc279 100644
--- a/Build/source/utils/asymptote/drawsurface.h
+++ b/Build/source/utils/asymptote/drawsurface.h
@@ -89,11 +89,11 @@ public:
}
drawSurface(const double* t, const drawSurface *s) :
- ncontrols(s->ncontrols), straight(s->straight), diffuse(s->diffuse),
- ambient(s->ambient), emissive(s->emissive), specular(s->specular),
- colors(s->colors), opacity(s->opacity), shininess(s->shininess),
- PRCshininess(s->PRCshininess), invisible(s->invisible),
- interaction(s->interaction), prc(s->prc) {
+ drawElement(s->KEY), ncontrols(s->ncontrols), straight(s->straight),
+ diffuse(s->diffuse), ambient(s->ambient), emissive(s->emissive),
+ specular(s->specular), colors(s->colors), opacity(s->opacity),
+ shininess(s->shininess), PRCshininess(s->PRCshininess),
+ invisible(s->invisible), interaction(s->interaction), prc(s->prc) {
if(s->controls) {
controls=new(UseGC) triple[ncontrols];
@@ -271,8 +271,8 @@ public:
}
drawNurbs(const double* t, const drawNurbs *s) :
- udegree(s->udegree), vdegree(s->vdegree), nu(s->nu), nv(s->nv),
- weights(s->weights), uknots(s->uknots), vknots(s->vknots),
+ drawElement(s->KEY), udegree(s->udegree), vdegree(s->vdegree), nu(s->nu),
+ nv(s->nv), weights(s->weights), uknots(s->uknots), vknots(s->vknots),
diffuse(s->diffuse), ambient(s->ambient),
emissive(s->emissive), specular(s->specular), opacity(s->opacity),
shininess(s->shininess), PRCshininess(s->PRCshininess),
@@ -361,7 +361,7 @@ public:
drawPRC(t,p,opacity,shininess), half(half), type(type) {}
drawSphere(const double* t, const drawSphere *s) :
- drawPRC(t,s), half(s->half), type(s->type) {}
+ drawElement(s->KEY), drawPRC(t,s), half(s->half), type(s->type) {}
void P(triple& t, double x, double y, double z);
@@ -436,7 +436,8 @@ public:
}
drawTube(const double* t, const drawTube *s) :
- center(camp::transformed(t,s->center)), g(camp::transformed(t,s->g)),
+ drawElement(s->KEY), center(camp::transformed(t,s->center)),
+ g(camp::transformed(t,s->g)),
diffuse(s->diffuse), ambient(s->ambient), emissive(s->emissive),
specular(s->specular), opacity(s->opacity),
shininess(s->shininess), invisible(s->invisible) {
@@ -462,7 +463,7 @@ public:
invisible=p.invisible();
}
- drawPixel(const double* t, const drawPixel *s) :
+ drawPixel(const double* t, const drawPixel *s) : drawElement(s->KEY),
c(s->c), width(s->width), invisible(s->invisible) {
v=t*s->v;
}
@@ -550,7 +551,7 @@ public:
}
drawBaseTriangles(const double* t, const drawBaseTriangles *s) :
- nP(s->nP), nN(s->nN), nI(s->nI) {
+ drawElement(s->KEY), nP(s->nP), nN(s->nN), nI(s->nI) {
P=new(UseGC) triple[nP];
for(size_t i=0; i < nP; i++)
P[i]=t*s->P[i];
diff --git a/Build/source/utils/asymptote/errormsg.h b/Build/source/utils/asymptote/errormsg.h
index 245fe62ed89..22e7f79f1fe 100644
--- a/Build/source/utils/asymptote/errormsg.h
+++ b/Build/source/utils/asymptote/errormsg.h
@@ -65,8 +65,6 @@ inline bool operator == (const fileinfo& a, const fileinfo& b)
return a.line() == b.line() && a.name() == b.name();
}
-
-
class position : public gc {
fileinfo *file;
size_t line;
@@ -98,6 +96,10 @@ public:
return column;
}
+ std::pair<size_t,size_t>LineColumn() const {
+ return std::pair<size_t,size_t>(line,column);
+ }
+
bool match(const string& s) {
return file && file->name() == s;
}
diff --git a/Build/source/utils/asymptote/examples/p-orbital.asy b/Build/source/utils/asymptote/examples/p-orbital.asy
index 1932e098c67..4638aa21a22 100644
--- a/Build/source/utils/asymptote/examples/p-orbital.asy
+++ b/Build/source/utils/asymptote/examples/p-orbital.asy
@@ -12,7 +12,7 @@ triple f(pair t) {
real r=t.x;
real phi=t.y;
real f=f(r);
- real s=max(min(c0/f,1),-1);
+ real s=max(min(f != 0 ? c0/f : 1,1),-1);
real R=r*sqrt(1-s^2);
return (R*cos(phi),R*sin(phi),r*s);
}
diff --git a/Build/source/utils/asymptote/examples/slope.asy b/Build/source/utils/asymptote/examples/slope.asy
new file mode 100644
index 00000000000..ae7fb45daf9
--- /dev/null
+++ b/Build/source/utils/asymptote/examples/slope.asy
@@ -0,0 +1,83 @@
+import ode;
+import graph;
+import math;
+size(200,200,IgnoreAspect);
+
+real f(real t, real y) {return cos(y);}
+//real f(real t, real y) {return 1/(1+y);}
+typedef real function(real,real);
+
+real a=0;
+real b=1;
+real y0=0;
+
+real L[]={1,2};
+
+int M=L.length; // Number of modes.
+
+//real Y0[]=array(M,y0);
+real Y0[]=new real[] {-1,2};
+
+real[] F(real t, real[] y) {
+ return sequence(new real(int m) {return f(t,y[M-m-1]);},M);
+ // return new real[] {exp((L[1]-1)*t)*y[1],
+ // -exp(-(L[1]-1)*t)*y[0]};
+ // return new real[]{-y[0]^2};
+}
+
+real[] G(real t, real[] y) {
+ return F(t,y)-sequence(new real(int m) {return L[m]*y[m];},M);
+}
+
+real lambda=sqrt(0.5);
+real[] tau,error,error2;
+int n=25;
+
+real order=3;
+
+for(int i=0; i < n-1; ++i) {
+ real dt=(b-a)*lambda^(n-i);
+ Solution S=integrate(Y0,L,F,a,b,dt,dynamic=false,0.0002,0.0004,ERK3BS,verbose=false);
+ real maxnorm=0;
+
+ Solution E=integrate(Y0,G,a,b,1e-2*dt,dynamic=false,0.0002,0.0004,RK5);
+ real[] exact=E.y[E.y.length-1];
+
+ // real[] exact=new real[] {exp(-b)*sin(b),exp(-L[1]*b)*cos(b)};
+ for(int m=0; m < M; ++m)
+ maxnorm=max(maxnorm,abs(S.y[S.y.length-1][m]-exact[m]));
+ if(maxnorm != 0) {
+ tau.push(dt);
+ // error.push(dt^-(order+1)*maxnorm);
+ error.push(maxnorm);
+ }
+}
+
+/*
+for(int i=0; i < n-1; ++i) {
+ real dt=(b-a)*lambda^(n-i);
+ real maxnorm=0;
+ for(int m=0; m < M; ++m) {
+ solution S=integrate(Y0[m],L[m],f,a,b,dt,dynamic=false,0.000,1000,RK4_375,verbose=false);
+ maxnorm=max(maxnorm,abs(S.y[S.y.length-1]-exact[m]));
+ }
+ error2.push(dt^-order*maxnorm);
+}
+*/
+
+//scale(Log,Log);
+scale(Log,Linear);
+
+//draw(graph(tau,error),marker(scale(0.8mm)*unitcircle,red));
+//draw(graph(tau,error2),marker(scale(0.8mm)*unitcircle,blue));
+
+int[] index=sequence(error.length-1);
+real[] slope=log(error[index+1]/error[index])/log(tau[index+1]/tau[index]);
+real[] t=sqrt(tau[index]*tau[index+1]);
+//write(t,slope);
+draw(graph(t,slope),red);
+
+
+
+xaxis("$\tau$",BottomTop,LeftTicks);
+yaxis("$e/\tau^"+string(order)+"$",LeftRight,RightTicks);
diff --git a/Build/source/utils/asymptote/exp.cc b/Build/source/utils/asymptote/exp.cc
index 673f3670a3d..4dacff72ec1 100644
--- a/Build/source/utils/asymptote/exp.cc
+++ b/Build/source/utils/asymptote/exp.cc
@@ -22,7 +22,10 @@
#include "stm.h"
#include "inst.h"
#include "opsymbols.h"
+#include "process.h"
+//void runCode(absyntax::block *code);
+
namespace absyntax {
using namespace types;
@@ -61,7 +64,7 @@ void exp::transToType(coenv &e, types::ty *target)
access *a = e.e.fastLookupCast(target, ct);
if (a) {
transAsType(e, ct);
- a->encode(CALL, getPos(), e.c);
+ a->encode(trans::CALL, getPos(), e.c);
return;
}
}
@@ -71,6 +74,7 @@ void exp::transToType(coenv &e, types::ty *target)
if (target->kind != ty_error) {
types::ty *sources=cgetType(e);
em.error(getPos());
+
em << "cannot cast ";
if (sources->kind==ty_overloaded)
em << "expression";
@@ -171,7 +175,7 @@ void varEntryExp::transWrite(coenv &e, types::ty *target, exp *value) {
transAct(WRITE, e, target);
}
void varEntryExp::transCall(coenv &e, types::ty *target) {
- transAct(CALL, e, target);
+ transAct(trans::CALL, e, target);
}
@@ -736,7 +740,19 @@ signature *callExp::argTypes(coenv &e, bool *searchable)
*searchable = true;
size_t n = args->size();
+
for (size_t i = 0; i < n; i++) {
+ if(string(args->args[i].name) == "KEY") {
+ stringExp *s=dynamic_cast<stringExp*>(args->args[i].val);
+ if(s) {
+ if(getPos().filename() == processData().fileName)
+ processData().xkey[getPos().LineColumn()]=Strdup(s->getString());
+ args->args.erase(args->args.begin()+i);
+ --n;
+ if(i == n) break;
+ }
+ }
+
argument a=(*args)[i];
types::ty *t = a.val->cgetType(e);
if (t->kind == types::ty_error)
@@ -962,7 +978,7 @@ types::ty *callExp::transPerfectMatch(coenv &e) {
args->rest.val->trans(e);
// Call the function.
- ve->encode(CALL, getPos(), e.c);
+ ve->encode(trans::CALL, getPos(), e.c);
// That's it. Return the return type of the function.
return ct ? ct : dynamic_cast<function *>(ve->getType())->getResult();
@@ -1110,7 +1126,7 @@ types::ty *castExp::tryCast(coenv &e, types::ty *t, types::ty *s,
access *a=e.e.lookupCast(t, ss, csym);
assert(a);
- a->encode(CALL, getPos(), e.c);
+ a->encode(trans::CALL, getPos(), e.c);
return ss;
}
}
diff --git a/Build/source/utils/asymptote/fileio.h b/Build/source/utils/asymptote/fileio.h
index fd1dbd0e803..d5e78cec294 100644
--- a/Build/source/utils/asymptote/fileio.h
+++ b/Build/source/utils/asymptote/fileio.h
@@ -50,10 +50,8 @@ extern FILE *pipeout;
inline void openpipeout()
{
- int fd=settings::getSetting<Int>("outpipe");
- if(!pipeout) {
- if(fd >= 0) pipeout=fdopen(intcast(fd),"w");
- }
+ int fd=intcast(settings::getSetting<Int>("outpipe"));
+ if(!pipeout && fd >= 0) pipeout=fdopen(fd,"w");
if(!pipeout) {
ostringstream buf;
buf << "Cannot open outpipe " << fd;
@@ -249,7 +247,7 @@ public:
class opipe : public file {
public:
- opipe(const string& name) : file(name,false,OPIPE) {}
+ opipe(const string& name) : file(name,false,OPIPE) {standard=false;}
void open() {
openpipeout();
diff --git a/Build/source/utils/asymptote/glrender.cc b/Build/source/utils/asymptote/glrender.cc
index 9214c19a133..af405d6d853 100644
--- a/Build/source/utils/asymptote/glrender.cc
+++ b/Build/source/utils/asymptote/glrender.cc
@@ -376,7 +376,7 @@ void Export()
transform(0.0,0.0,w,0.0,0.0,h),
antialias);
pic.append(Image);
- pic.shipout(NULL,Prefix,Format,0.0,false,View);
+ pic.shipout(NULL,Prefix,Format,false,View);
delete Image;
delete[] data;
}
diff --git a/Build/source/utils/asymptote/gsl.symbols.h b/Build/source/utils/asymptote/gsl.symbols.h
deleted file mode 100644
index caaa2f0404b..00000000000
--- a/Build/source/utils/asymptote/gsl.symbols.h
+++ /dev/null
@@ -1,394 +0,0 @@
-/*****
- * This file is automatically generated by findsym.pl
- * Changes will be overwritten.
- *****/
-
-// If the ADDSYMBOL macro is not already defined, define it with the default
-// purpose of referring to an external pre-translated symbol, such that
-// SYM(name) also refers to that symbol.
-#ifndef ADDSYMBOL
- #define ADDSYMBOL(name) extern sym::symbol PRETRANSLATED_SYMBOL_##name
- #define SYM(name) PRETRANSLATED_SYMBOL_##name
-#endif
-
-ADDSYMBOL(Ai);
-ADDSYMBOL(Ai_deriv);
-ADDSYMBOL(Ai_deriv_scaled);
-ADDSYMBOL(Ai_scaled);
-ADDSYMBOL(Bi);
-ADDSYMBOL(Bi_deriv);
-ADDSYMBOL(Bi_deriv_scaled);
-ADDSYMBOL(Bi_scaled);
-ADDSYMBOL(Chi);
-ADDSYMBOL(Ci);
-ADDSYMBOL(D);
-ADDSYMBOL(E);
-ADDSYMBOL(E1);
-ADDSYMBOL(E2);
-ADDSYMBOL(Ei);
-ADDSYMBOL(Ei3);
-ADDSYMBOL(F);
-ADDSYMBOL(FermiDirac);
-ADDSYMBOL(FermiDirac0);
-ADDSYMBOL(FermiDirac1);
-ADDSYMBOL(FermiDirac2);
-ADDSYMBOL(FermiDirac3Half);
-ADDSYMBOL(FermiDiracHalf);
-ADDSYMBOL(FermiDiracInc0);
-ADDSYMBOL(FermiDiracM1);
-ADDSYMBOL(FermiDiracMHalf);
-ADDSYMBOL(H3d);
-ADDSYMBOL(H3d0);
-ADDSYMBOL(H3d1);
-ADDSYMBOL(I);
-ADDSYMBOL(I0);
-ADDSYMBOL(I0_scaled);
-ADDSYMBOL(I1);
-ADDSYMBOL(I1_scaled);
-ADDSYMBOL(I_scaled);
-ADDSYMBOL(J);
-ADDSYMBOL(J0);
-ADDSYMBOL(J1);
-ADDSYMBOL(Jn);
-ADDSYMBOL(K);
-ADDSYMBOL(K0);
-ADDSYMBOL(K0_scaled);
-ADDSYMBOL(K1);
-ADDSYMBOL(K1_scaled);
-ADDSYMBOL(K_scaled);
-ADDSYMBOL(L);
-ADDSYMBOL(L1);
-ADDSYMBOL(L2);
-ADDSYMBOL(L3);
-ADDSYMBOL(P);
-ADDSYMBOL(P1);
-ADDSYMBOL(P2);
-ADDSYMBOL(P3);
-ADDSYMBOL(Pl);
-ADDSYMBOL(Plm);
-ADDSYMBOL(Q);
-ADDSYMBOL(Q0);
-ADDSYMBOL(Q1);
-ADDSYMBOL(Ql);
-ADDSYMBOL(RC);
-ADDSYMBOL(RD);
-ADDSYMBOL(RF);
-ADDSYMBOL(RJ);
-ADDSYMBOL(Shi);
-ADDSYMBOL(Si);
-ADDSYMBOL(U);
-ADDSYMBOL(W0);
-ADDSYMBOL(Wm1);
-ADDSYMBOL(Y);
-ADDSYMBOL(Y0);
-ADDSYMBOL(Y1);
-ADDSYMBOL(Yn);
-ADDSYMBOL(Z);
-ADDSYMBOL(a);
-ADDSYMBOL(aI);
-ADDSYMBOL(aR);
-ADDSYMBOL(alpha);
-ADDSYMBOL(atanint);
-ADDSYMBOL(b);
-ADDSYMBOL(beta);
-ADDSYMBOL(c);
-ADDSYMBOL(cdf_beta_P);
-ADDSYMBOL(cdf_beta_Pinv);
-ADDSYMBOL(cdf_beta_Q);
-ADDSYMBOL(cdf_beta_Qinv);
-ADDSYMBOL(cdf_binomial_P);
-ADDSYMBOL(cdf_binomial_Q);
-ADDSYMBOL(cdf_cauchy_P);
-ADDSYMBOL(cdf_cauchy_Pinv);
-ADDSYMBOL(cdf_cauchy_Q);
-ADDSYMBOL(cdf_cauchy_Qinv);
-ADDSYMBOL(cdf_chisq_P);
-ADDSYMBOL(cdf_chisq_Pinv);
-ADDSYMBOL(cdf_chisq_Q);
-ADDSYMBOL(cdf_chisq_Qinv);
-ADDSYMBOL(cdf_exponential_P);
-ADDSYMBOL(cdf_exponential_Pinv);
-ADDSYMBOL(cdf_exponential_Q);
-ADDSYMBOL(cdf_exponential_Qinv);
-ADDSYMBOL(cdf_exppow_P);
-ADDSYMBOL(cdf_exppow_Q);
-ADDSYMBOL(cdf_fdist_P);
-ADDSYMBOL(cdf_fdist_Pinv);
-ADDSYMBOL(cdf_fdist_Q);
-ADDSYMBOL(cdf_fdist_Qinv);
-ADDSYMBOL(cdf_flat_P);
-ADDSYMBOL(cdf_flat_Pinv);
-ADDSYMBOL(cdf_flat_Q);
-ADDSYMBOL(cdf_flat_Qinv);
-ADDSYMBOL(cdf_gamma_P);
-ADDSYMBOL(cdf_gamma_Pinv);
-ADDSYMBOL(cdf_gamma_Q);
-ADDSYMBOL(cdf_gamma_Qinv);
-ADDSYMBOL(cdf_gaussian_P);
-ADDSYMBOL(cdf_gaussian_Pinv);
-ADDSYMBOL(cdf_gaussian_Q);
-ADDSYMBOL(cdf_gaussian_Qinv);
-ADDSYMBOL(cdf_geometric_P);
-ADDSYMBOL(cdf_geometric_Q);
-ADDSYMBOL(cdf_gumbel1_P);
-ADDSYMBOL(cdf_gumbel1_Pinv);
-ADDSYMBOL(cdf_gumbel1_Q);
-ADDSYMBOL(cdf_gumbel1_Qinv);
-ADDSYMBOL(cdf_gumbel2_P);
-ADDSYMBOL(cdf_gumbel2_Pinv);
-ADDSYMBOL(cdf_gumbel2_Q);
-ADDSYMBOL(cdf_gumbel2_Qinv);
-ADDSYMBOL(cdf_hypergeometric_P);
-ADDSYMBOL(cdf_hypergeometric_Q);
-ADDSYMBOL(cdf_laplace_P);
-ADDSYMBOL(cdf_laplace_Pinv);
-ADDSYMBOL(cdf_laplace_Q);
-ADDSYMBOL(cdf_laplace_Qinv);
-ADDSYMBOL(cdf_logistic_P);
-ADDSYMBOL(cdf_logistic_Pinv);
-ADDSYMBOL(cdf_logistic_Q);
-ADDSYMBOL(cdf_logistic_Qinv);
-ADDSYMBOL(cdf_lognormal_P);
-ADDSYMBOL(cdf_lognormal_Pinv);
-ADDSYMBOL(cdf_lognormal_Q);
-ADDSYMBOL(cdf_lognormal_Qinv);
-ADDSYMBOL(cdf_negative_binomial_P);
-ADDSYMBOL(cdf_negative_binomial_Q);
-ADDSYMBOL(cdf_pareto_P);
-ADDSYMBOL(cdf_pareto_Pinv);
-ADDSYMBOL(cdf_pareto_Q);
-ADDSYMBOL(cdf_pareto_Qinv);
-ADDSYMBOL(cdf_poisson_P);
-ADDSYMBOL(cdf_poisson_Q);
-ADDSYMBOL(cdf_rayleigh_P);
-ADDSYMBOL(cdf_rayleigh_Pinv);
-ADDSYMBOL(cdf_rayleigh_Q);
-ADDSYMBOL(cdf_rayleigh_Qinv);
-ADDSYMBOL(cdf_tdist_P);
-ADDSYMBOL(cdf_tdist_Pinv);
-ADDSYMBOL(cdf_tdist_Q);
-ADDSYMBOL(cdf_tdist_Qinv);
-ADDSYMBOL(cdf_weibull_P);
-ADDSYMBOL(cdf_weibull_Pinv);
-ADDSYMBOL(cdf_weibull_Q);
-ADDSYMBOL(cdf_weibull_Qinv);
-ADDSYMBOL(choose);
-ADDSYMBOL(clausen);
-ADDSYMBOL(conicalP_0);
-ADDSYMBOL(conicalP_1);
-ADDSYMBOL(conicalP_cyl_reg);
-ADDSYMBOL(conicalP_half);
-ADDSYMBOL(conicalP_mhalf);
-ADDSYMBOL(conicalP_sph_reg);
-ADDSYMBOL(coupling_3j);
-ADDSYMBOL(coupling_6j);
-ADDSYMBOL(coupling_9j);
-ADDSYMBOL(dawson);
-ADDSYMBOL(debye_1);
-ADDSYMBOL(debye_2);
-ADDSYMBOL(debye_3);
-ADDSYMBOL(debye_4);
-ADDSYMBOL(debye_5);
-ADDSYMBOL(debye_6);
-ADDSYMBOL(dilog);
-ADDSYMBOL(doublefact);
-ADDSYMBOL(epsilon);
-ADDSYMBOL(erf);
-ADDSYMBOL(erf_Q);
-ADDSYMBOL(erf_Z);
-ADDSYMBOL(erfc);
-ADDSYMBOL(eta);
-ADDSYMBOL(exp_mult);
-ADDSYMBOL(exprel);
-ADDSYMBOL(exprel_2);
-ADDSYMBOL(fact);
-ADDSYMBOL(fcmp);
-ADDSYMBOL(gamma);
-ADDSYMBOL(gamma_P);
-ADDSYMBOL(gamma_Q);
-ADDSYMBOL(gammainv);
-ADDSYMBOL(gammastar);
-ADDSYMBOL(gegenpoly);
-ADDSYMBOL(gegenpoly_1);
-ADDSYMBOL(gegenpoly_2);
-ADDSYMBOL(gegenpoly_3);
-ADDSYMBOL(gsl);
-ADDSYMBOL(hazard);
-ADDSYMBOL(hy0F1);
-ADDSYMBOL(hy1F1);
-ADDSYMBOL(hy2F0);
-ADDSYMBOL(hy2F1);
-ADDSYMBOL(hy2F1_conj);
-ADDSYMBOL(hy2F1_conj_renorm);
-ADDSYMBOL(hy2F1_renorm);
-ADDSYMBOL(hydrogenicR);
-ADDSYMBOL(hydrogenicR_1);
-ADDSYMBOL(hypot);
-ADDSYMBOL(hzeta);
-ADDSYMBOL(i0_scaled);
-ADDSYMBOL(i1_scaled);
-ADDSYMBOL(i2_scaled);
-ADDSYMBOL(i_scaled);
-ADDSYMBOL(j);
-ADDSYMBOL(j0);
-ADDSYMBOL(j1);
-ADDSYMBOL(j2);
-ADDSYMBOL(k);
-ADDSYMBOL(k0_scaled);
-ADDSYMBOL(k1_scaled);
-ADDSYMBOL(k2_scaled);
-ADDSYMBOL(k_scaled);
-ADDSYMBOL(l);
-ADDSYMBOL(lambda);
-ADDSYMBOL(lnK);
-ADDSYMBOL(lnbeta);
-ADDSYMBOL(lnchoose);
-ADDSYMBOL(lncosh);
-ADDSYMBOL(lndoublefact);
-ADDSYMBOL(lnfact);
-ADDSYMBOL(lngamma);
-ADDSYMBOL(lnpoch);
-ADDSYMBOL(lnsinh);
-ADDSYMBOL(log1pm);
-ADDSYMBOL(log_erfc);
-ADDSYMBOL(logabs);
-ADDSYMBOL(m);
-ADDSYMBOL(method);
-ADDSYMBOL(mu);
-ADDSYMBOL(n);
-ADDSYMBOL(n1);
-ADDSYMBOL(n2);
-ADDSYMBOL(name);
-ADDSYMBOL(nu);
-ADDSYMBOL(nu1);
-ADDSYMBOL(nu2);
-ADDSYMBOL(p);
-ADDSYMBOL(pdf_bernoulli);
-ADDSYMBOL(pdf_beta);
-ADDSYMBOL(pdf_binomial);
-ADDSYMBOL(pdf_bivariate_gaussian);
-ADDSYMBOL(pdf_cauchy);
-ADDSYMBOL(pdf_chisq);
-ADDSYMBOL(pdf_dirichlet);
-ADDSYMBOL(pdf_exponential);
-ADDSYMBOL(pdf_exppow);
-ADDSYMBOL(pdf_fdist);
-ADDSYMBOL(pdf_flat);
-ADDSYMBOL(pdf_gamma);
-ADDSYMBOL(pdf_gaussian);
-ADDSYMBOL(pdf_gaussian_tail);
-ADDSYMBOL(pdf_geometric);
-ADDSYMBOL(pdf_gumbel1);
-ADDSYMBOL(pdf_gumbel2);
-ADDSYMBOL(pdf_hypergeometric);
-ADDSYMBOL(pdf_landau);
-ADDSYMBOL(pdf_laplace);
-ADDSYMBOL(pdf_logarithmic);
-ADDSYMBOL(pdf_logistic);
-ADDSYMBOL(pdf_lognormal);
-ADDSYMBOL(pdf_multinomial);
-ADDSYMBOL(pdf_negative_binomial);
-ADDSYMBOL(pdf_pareto);
-ADDSYMBOL(pdf_poisson);
-ADDSYMBOL(pdf_rayleigh);
-ADDSYMBOL(pdf_rayleigh_tail);
-ADDSYMBOL(pdf_tdist);
-ADDSYMBOL(pdf_weibull);
-ADDSYMBOL(phi);
-ADDSYMBOL(poch);
-ADDSYMBOL(pochrel);
-ADDSYMBOL(pow);
-ADDSYMBOL(psi);
-ADDSYMBOL(psi1);
-ADDSYMBOL(psi_1piy);
-ADDSYMBOL(q);
-ADDSYMBOL(r);
-ADDSYMBOL(rho);
-ADDSYMBOL(rng_bernoulli);
-ADDSYMBOL(rng_beta);
-ADDSYMBOL(rng_binomial);
-ADDSYMBOL(rng_bivariate_gaussian);
-ADDSYMBOL(rng_cauchy);
-ADDSYMBOL(rng_chisq);
-ADDSYMBOL(rng_dir);
-ADDSYMBOL(rng_dir2d);
-ADDSYMBOL(rng_dir3d);
-ADDSYMBOL(rng_dirichlet);
-ADDSYMBOL(rng_exponential);
-ADDSYMBOL(rng_exppow);
-ADDSYMBOL(rng_fdist);
-ADDSYMBOL(rng_flat);
-ADDSYMBOL(rng_gamma);
-ADDSYMBOL(rng_gaussian);
-ADDSYMBOL(rng_gaussian_tail);
-ADDSYMBOL(rng_geometric);
-ADDSYMBOL(rng_get);
-ADDSYMBOL(rng_gumbel1);
-ADDSYMBOL(rng_gumbel2);
-ADDSYMBOL(rng_hypergeometric);
-ADDSYMBOL(rng_init);
-ADDSYMBOL(rng_landau);
-ADDSYMBOL(rng_laplace);
-ADDSYMBOL(rng_levy);
-ADDSYMBOL(rng_list);
-ADDSYMBOL(rng_logarithmic);
-ADDSYMBOL(rng_logistic);
-ADDSYMBOL(rng_lognormal);
-ADDSYMBOL(rng_max);
-ADDSYMBOL(rng_min);
-ADDSYMBOL(rng_multinomial);
-ADDSYMBOL(rng_name);
-ADDSYMBOL(rng_negative_binomial);
-ADDSYMBOL(rng_pareto);
-ADDSYMBOL(rng_poisson);
-ADDSYMBOL(rng_rayleigh);
-ADDSYMBOL(rng_rayleigh_tail);
-ADDSYMBOL(rng_set);
-ADDSYMBOL(rng_tdist);
-ADDSYMBOL(rng_uniform);
-ADDSYMBOL(rng_uniform_int);
-ADDSYMBOL(rng_uniform_pos);
-ADDSYMBOL(rng_weibull);
-ADDSYMBOL(s);
-ADDSYMBOL(seed);
-ADDSYMBOL(sigma);
-ADDSYMBOL(sinc);
-ADDSYMBOL(sncndn);
-ADDSYMBOL(sphPlm);
-ADDSYMBOL(synchrotron_1);
-ADDSYMBOL(synchrotron_2);
-ADDSYMBOL(t);
-ADDSYMBOL(taylorcoeff);
-ADDSYMBOL(theta);
-ADDSYMBOL(transport_2);
-ADDSYMBOL(transport_3);
-ADDSYMBOL(transport_4);
-ADDSYMBOL(transport_5);
-ADDSYMBOL(two_ja);
-ADDSYMBOL(two_jb);
-ADDSYMBOL(two_jc);
-ADDSYMBOL(two_jd);
-ADDSYMBOL(two_je);
-ADDSYMBOL(two_jf);
-ADDSYMBOL(two_jg);
-ADDSYMBOL(two_jh);
-ADDSYMBOL(two_ji);
-ADDSYMBOL(two_ma);
-ADDSYMBOL(two_mb);
-ADDSYMBOL(two_mc);
-ADDSYMBOL(u);
-ADDSYMBOL(x);
-ADDSYMBOL(y);
-ADDSYMBOL(y0);
-ADDSYMBOL(y1);
-ADDSYMBOL(y2);
-ADDSYMBOL(z);
-ADDSYMBOL(zero_Ai);
-ADDSYMBOL(zero_Ai_deriv);
-ADDSYMBOL(zero_Bi);
-ADDSYMBOL(zero_Bi_deriv);
-ADDSYMBOL(zero_J);
-ADDSYMBOL(zero_J0);
-ADDSYMBOL(zero_J1);
-ADDSYMBOL(zeta);
-ADDSYMBOL(zetam1);
diff --git a/Build/source/utils/asymptote/interact.cc b/Build/source/utils/asymptote/interact.cc
index 70569d1505c..c49f50d2b91 100644
--- a/Build/source/utils/asymptote/interact.cc
+++ b/Build/source/utils/asymptote/interact.cc
@@ -122,6 +122,7 @@ void pre_readline()
void init_interactive()
{
+ if(getSetting<bool>("xasy")) tty=false;
#if defined(HAVE_LIBREADLINE) && defined(HAVE_LIBCURSES)
if(tty) {
init_completion();
diff --git a/Build/source/utils/asymptote/main.cc b/Build/source/utils/asymptote/main.cc
index 946dd4d9094..c6c80bb88f0 100644
--- a/Build/source/utils/asymptote/main.cc
+++ b/Build/source/utils/asymptote/main.cc
@@ -40,7 +40,7 @@
#include "settings.h"
#include "locate.h"
#include "interact.h"
-#include "process.h"
+#include "fileio.h"
#include "stack.h"
@@ -51,7 +51,7 @@ using interact::interactive;
namespace run {
void purge();
}
-
+
#ifdef PROFILE
namespace vm {
extern void dumpProfile();
@@ -75,11 +75,11 @@ int sigsegv_handler (void *, int emergency)
cerr << "Stack overflow or segmentation fault: rerun with -nothreads"
<< endl;
else
-#endif
+#endif
cerr << "Segmentation fault" << endl;
abort();
}
-#endif
+#endif
void setsignal(RETSIGTYPE (*handler)(int))
{
@@ -107,7 +107,13 @@ void interruptHandler(int)
em.Interrupt(true);
}
-struct Args
+bool hangup=false;
+void hangup_handler(int sig)
+{
+ hangup=true;
+}
+
+struct Args
{
int argc;
char **argv;
@@ -117,7 +123,6 @@ struct Args
void *asymain(void *A)
{
setsignal(signalHandler);
-
Args *args=(Args *) A;
fpu_trap(trap());
@@ -129,12 +134,27 @@ void *asymain(void *A)
doUnrestrictedList();
} catch(handled_error) {
em.statusError();
- }
+ }
} else {
int n=numArgs();
- if(n == 0)
- processFile("-");
- else
+ if(n == 0) {
+ int inpipe=intcast(settings::getSetting<Int>("inpipe"));
+ if(inpipe >= 0) {
+ Signal(SIGHUP,hangup_handler);
+ camp::openpipeout();
+ fprintf(camp::pipeout,"\n");
+ fflush(camp::pipeout);
+ }
+ while(true) {
+ processFile("-",true);
+ try {
+ setOptions(args->argc,args->argv);
+ } catch(handled_error) {
+ em.statusError();
+ }
+ if(inpipe < 0) break;
+ }
+ } else {
for(int ind=0; ind < n; ind++) {
processFile(string(getArg(ind)),n > 1);
try {
@@ -142,8 +162,9 @@ void *asymain(void *A)
setOptions(args->argc,args->argv);
} catch(handled_error) {
em.statusError();
- }
+ }
}
+ }
}
#ifdef PROFILE
@@ -162,7 +183,7 @@ void *asymain(void *A)
}
#endif
#endif
- exit(em.processStatus() || interact::interactive ? 0 : 1);
+ exit(em.processStatus() || interact::interactive ? 0 : 1);
}
void exitHandler(int)
@@ -170,12 +191,13 @@ void exitHandler(int)
exit(0);
}
-int main(int argc, char *argv[])
+int main(int argc, char *argv[])
{
-#ifdef HAVE_LIBGSL
+ // cout << "hello?";
+#ifdef HAVE_LIBGSL
unsetenv("GSL_RNG_SEED");
unsetenv("GSL_RNG_TYPE");
-#endif
+#endif
setsignal(signalHandler);
try {
@@ -183,17 +205,17 @@ int main(int argc, char *argv[])
} catch(handled_error) {
em.statusError();
}
-
+
Args args(argc,argv);
#ifdef HAVE_GL
#ifdef __APPLE__
bool usethreads=true;
#else
bool usethreads=view();
-#endif
+#endif
gl::glthread=usethreads ? getSetting<bool>("threads") : false;
#if HAVE_PTHREAD
-
+
if(gl::glthread) {
pthread_t thread;
try {
@@ -215,6 +237,6 @@ int main(int argc, char *argv[])
}
#endif
gl::glthread=false;
-#endif
+#endif
asymain(&args);
}
diff --git a/Build/source/utils/asymptote/memory.h b/Build/source/utils/asymptote/memory.h
index d29b117855e..8d8b53e0d83 100644
--- a/Build/source/utils/asymptote/memory.h
+++ b/Build/source/utils/asymptote/memory.h
@@ -11,6 +11,7 @@
#include <vector>
#include <stack>
#include <map>
+#include <deque>
#include <string>
#include <sstream>
@@ -124,6 +125,7 @@ namespace mem {
GC_CONTAINER(list);
GC_CONTAINER(vector);
+GC_CONTAINER(deque);
template <typename T, typename Container = vector<T> >
struct stack : public std::stack<T, Container>, public gc {
diff --git a/Build/source/utils/asymptote/parser.cc b/Build/source/utils/asymptote/parser.cc
index cbeb54fe230..c12a47c50e1 100644
--- a/Build/source/utils/asymptote/parser.cc
+++ b/Build/source/utils/asymptote/parser.cc
@@ -6,6 +6,8 @@
#include <fstream>
#include <sstream>
+#include <cstring>
+#include <fcntl.h>
#include "common.h"
@@ -17,26 +19,47 @@
#include "locate.h"
#include "errormsg.h"
#include "parser.h"
+#include "util.h"
// The lexical analysis and parsing functions used by parseFile.
void setlexer(size_t (*input) (char* bif, size_t max_size), string filename);
extern bool yyparse(void);
extern int yydebug;
extern int yy_flex_debug;
-static const int YY_NULL = 0;
extern bool lexerEOF();
extern void reportEOF();
+extern bool hangup;
+
+static int fd;
namespace parser {
+static FILE *fin=NULL;
+
namespace yy { // Lexers
std::streambuf *sbuf = NULL;
size_t stream_input(char *buf, size_t max_size)
{
- size_t count= sbuf ? sbuf->sgetn(buf,max_size) : 0;
- return count ? count : YY_NULL;
+ return sbuf ? sbuf->sgetn(buf,max_size) : 0;
+}
+
+int fpeek(int fd)
+{
+ int flags=fcntl(fd,F_GETFL,0);
+ fcntl(fd,F_SETFL,flags | O_NONBLOCK);
+ char c=fgetc(fin);
+ ungetc(c,fin);
+ fcntl(fd,F_SETFL,flags & ~O_NONBLOCK);
+ return c;
+}
+
+size_t pipe_input(char *buf, size_t max_size)
+{
+ if(hangup && fpeek(fd) == EOF) {hangup=false; return 0;}
+ fgets(buf,max_size-1,fin);
+ return strlen(buf);
}
} // namespace yy
@@ -88,8 +111,19 @@ absyntax::file *doParse(size_t (*input) (char* bif, size_t max_size),
absyntax::file *parseStdin()
{
debug(false);
- yy::sbuf = cin.rdbuf();
- return doParse(yy::stream_input,"-");
+
+ if(!fin) {
+ fd=intcast(settings::getSetting<Int>("inpipe"));
+ if(fd >= 0)
+ fin=fdopen(fd,"r");
+ }
+
+ if(fin)
+ return doParse(yy::pipe_input,"-");
+ else {
+ yy::sbuf = cin.rdbuf();
+ return doParse(yy::stream_input,"-");
+ }
}
absyntax::file *parseFile(const string& filename,
diff --git a/Build/source/utils/asymptote/picture.cc b/Build/source/utils/asymptote/picture.cc
index 5914f92af77..7580ec727a9 100644
--- a/Build/source/utils/asymptote/picture.cc
+++ b/Build/source/utils/asymptote/picture.cc
@@ -248,6 +248,16 @@ bool picture::havepng()
return false;
}
+bool picture::havenewpage()
+{
+ for(nodelist::iterator p=nodes.begin(); p != nodes.end(); ++p) {
+ assert(*p);
+ if((*p)->isnewpage())
+ return true;
+ }
+ return false;
+}
+
bbox picture::bounds()
{
size_t n=nodes.size();
@@ -440,7 +450,7 @@ bool picture::texprocess(const string& texname, const string& outname,
if(svg) {
cmd.push_back(getSetting<string>("dvisvgm"));
cmd.push_back("-n");
- cmd.push_back("--verbosity=3");
+ cmd.push_back("-v0");
string libgs=getSetting<string>("libgs");
if(!libgs.empty())
cmd.push_back("--libgs="+libgs);
@@ -485,10 +495,14 @@ bool picture::texprocess(const string& texname, const string& outname,
cmd.push_back("-Pdownload35");
cmd.push_back("-D600");
cmd.push_back("-O"+String(hoffset)+"bp,"+String(voffset)+"bp");
- cmd.push_back("-T"+String(getSetting<double>("paperwidth"))+"bp,"+
- String(paperHeight)+"bp");
+ bool ps=havenewpage();
+ if(ps)
+ cmd.push_back("-T"+String(getSetting<double>("paperwidth"))+"bp,"+
+ String(paperHeight)+"bp");
+ else
+ cmd.push_back("-E");
push_split(cmd,getSetting<string>("dvipsOptions"));
- if(getSetting<string>("papertype") != "")
+ if(ps && getSetting<string>("papertype") != "")
cmd.push_back("-t"+papertype);
if(verbose <= 1) cmd.push_back("-q");
cmd.push_back("-o"+psname);
@@ -514,7 +528,7 @@ bool picture::texprocess(const string& texname, const string& outname,
continue;
if(s.find("%!PS-Adobe-") == 0) {
- fout.header();
+ fout.header(!ps);
continue;
}
@@ -656,7 +670,7 @@ bool picture::reloadPDF(const string& Viewer, const string& outname) const
needReload=false;
string texengine=getSetting<string>("tex");
Setting("tex")=string("pdflatex");
- haveReload=f.shipout(NULL,reloadprefix,"pdf",0.0,false,false);
+ haveReload=f.shipout(NULL,reloadprefix,"pdf",false,false);
Setting("tex")=texengine;
}
if(haveReload) {
@@ -671,9 +685,46 @@ bool picture::reloadPDF(const string& Viewer, const string& outname) const
return true;
}
-
+int picture::epstosvg(const string& epsname, const string& outname)
+{
+ mem::vector<string> cmd;
+ cmd.push_back(getSetting<string>("dvisvgm"));
+ cmd.push_back("-n");
+ cmd.push_back("-E");
+ cmd.push_back("--verbosity=3");
+ string libgs=getSetting<string>("libgs");
+ if(!libgs.empty())
+ cmd.push_back("--libgs="+libgs);
+ push_split(cmd,getSetting<string>("dvisvgmOptions"));
+ cmd.push_back("-o"+outname);
+ cmd.push_back(epsname);
+ int status=System(cmd,2,true,"dvisvgm");
+ if(!getSetting<bool>("keep"))
+ unlink(epsname.c_str());
+ return status;
+}
+
+int picture::pdftosvg(const string& pdfname, const string& outname)
+{
+ mem::vector<string> cmd;
+ cmd.push_back(getSetting<string>("dvisvgm"));
+ cmd.push_back("-n");
+ cmd.push_back("--pdf");
+ cmd.push_back("--verbosity=3");
+ string libgs=getSetting<string>("libgs");
+ if(!libgs.empty())
+ cmd.push_back("--libgs="+libgs);
+ push_split(cmd,getSetting<string>("dvisvgmOptions"));
+ cmd.push_back("-o"+outname);
+ cmd.push_back(pdfname);
+ int status=System(cmd,2,true,"dvisvgm");
+ if(status == 0 && !getSetting<bool>("keep"))
+ unlink(pdfname.c_str());
+ return status;
+}
+
bool picture::postprocess(const string& prename, const string& outname,
- const string& outputformat, double magnification,
+ const string& outputformat,
bool wait, bool view, bool pdftex,
bool epsformat, bool svg)
{
@@ -692,21 +743,13 @@ bool picture::postprocess(const string& prename, const string& outname,
} else status=epstopdf(prename,outname);
} else if(epsformat) {
if(svg) {
- string epsname=stripExt(prename)+".eps";
- status=pdftoeps(prename,epsname);
- cmd.push_back(getSetting<string>("dvisvgm"));
- cmd.push_back("-n");
- cmd.push_back("-E");
- cmd.push_back("--verbosity=3");
- string libgs=getSetting<string>("libgs");
- if(!libgs.empty())
- cmd.push_back("--libgs="+libgs);
- push_split(cmd,getSetting<string>("dvisvgmOptions"));
- cmd.push_back("-o"+outname);
- cmd.push_back(epsname);
- status=System(cmd,0,true,"dvisvgm");
- if(!getSetting<bool>("keep"))
- unlink(epsname.c_str());
+ status=pdftosvg(prename,outname);
+ if(status != 0) { // Dvisvgm version < 2.4 doesn't support --pdf
+ string epsname=stripExt(prename)+".eps";
+ status=pdftoeps(prename,epsname);
+ if(status != 0) return false;
+ status=epstosvg(epsname,outname);
+ }
epsformat=false;
} else
status=pdftoeps(prename,outname);
@@ -730,7 +773,7 @@ bool picture::postprocess(const string& prename, const string& outname,
cmd.push_back("-sOutputFile="+outname);
cmd.push_back(prename);
status=System(cmd,0,true,"gs","Ghostscript");
- } else if(!svg) {
+ } else if(!svg && !getSetting<bool>("xasy")) {
double expand=antialias;
if(expand < 2.0) expand=1.0;
res *= expand;
@@ -820,8 +863,7 @@ string Outname(const string& prefix, const string& outputformat,
}
bool picture::shipout(picture *preamble, const string& Prefix,
- const string& format, double magnification,
- bool wait, bool view)
+ const string& format, bool wait, bool view)
{
b=bounds();
@@ -846,22 +888,25 @@ bool picture::shipout(picture *preamble, const string& Prefix,
else dvi=true;
}
- bool xobject=magnification > 0;
string outname=Outname(prefix,outputformat,standardout);
string epsname=epsformat ? (standardout ? "" : outname) :
auxname(prefix,"eps");
bool Labels=labels || TeXmode;
- if(b.empty && !Labels) { // Output a null file
+ bool empty=b.empty;
+ if(outputformat == "png" && (b.right-b.left < 1.0 || b.top-b.bottom < 1.0))
+ empty=true;
+
+ if(empty && !Labels) { // Output a null file
bbox b;
b.left=b.bottom=0;
- b.right=b.top=xobject ? 18 : 1;
+ b.right=b.top=1;
psfile out(epsname,false);
out.prologue(b);
out.epilogue();
out.close();
- return postprocess(epsname,outname,outputformat,1.0,wait,view,false,
+ return postprocess(epsname,outname,outputformat,wait,view,false,
epsformat,false);
}
@@ -873,13 +918,6 @@ bool picture::shipout(picture *preamble, const string& Prefix,
string prename=((epsformat && !pdf) || !Labels) ? epsname :
auxname(prefix,preformat);
- if(xobject) {
- double fuzz=0.5/magnification;
- b.top += fuzz;
- b.right += fuzz;
- b.bottom -= fuzz;
- }
-
SetPageDimensions();
pair aligndir=getSetting<pair>("aligndir");
@@ -1023,7 +1061,7 @@ bool picture::shipout(picture *preamble, const string& Prefix,
buf << prefix << "_" << svgcount;
++svgcount;
string pngname=buildname(buf.str(),"png");
- f->shipout(preamble,buf.str(),"png",0.0,false,false);
+ f->shipout(preamble,buf.str(),"png",false,false);
pair m=f->bounds().Min();
pair M=f->bounds().Max();
delete f;
@@ -1102,17 +1140,12 @@ bool picture::shipout(picture *preamble, const string& Prefix,
}
}
if(status) {
- if(xobject) {
- if(pdf || transparency)
- status=(epstopdf(prename,Outname(prefix,"pdf",standardout)) == 0);
- } else {
- if(context) prename=stripDir(prename);
- status=postprocess(prename,outname,outputformat,magnification,wait,
- view,pdf && Labels,epsformat,svg);
- if(pdfformat && !getSetting<bool>("keep")) {
- unlink(auxname(prefix,"m9").c_str());
- unlink(auxname(prefix,"pbsdat").c_str());
- }
+ if(context) prename=stripDir(prename);
+ status=postprocess(prename,outname,outputformat,wait,
+ view,pdf && Labels,epsformat,svg);
+ if(pdfformat && !getSetting<bool>("keep")) {
+ unlink(auxname(prefix,"m9").c_str());
+ unlink(auxname(prefix,"pbsdat").c_str());
}
}
}
diff --git a/Build/source/utils/asymptote/picture.h b/Build/source/utils/asymptote/picture.h
index cd46aeb50f0..915c05703e2 100644
--- a/Build/source/utils/asymptote/picture.h
+++ b/Build/source/utils/asymptote/picture.h
@@ -36,7 +36,7 @@ public:
nodelist nodes;
picture() : labels(false), lastnumber(0), lastnumber3(0), T(identity),
- transparency(false) {}
+ transparency(false), billboard(0) {}
// Destroy all of the owned picture objects.
~picture();
@@ -57,6 +57,7 @@ public:
bool havelabels();
bool have3D();
bool havepng();
+ bool havenewpage();
bbox bounds();
bbox3 bounds3();
@@ -68,6 +69,9 @@ public:
return transparency;
}
+ int epstosvg(const string& epsname, const string& outname);
+ int pdftosvg(const string& pdfname, const string& outname);
+
int epstopdf(const string& epsname, const string& pdfname);
int pdftoeps(const string& pdfname, const string& epsname);
@@ -75,14 +79,12 @@ public:
const string& prefix, const pair& bboxshift, bool svgformat);
bool postprocess(const string& prename, const string& outname,
- const string& outputformat, double magnification,
- bool wait, bool view, bool pdftex, bool epsformat,
- bool svg);
+ const string& outputformat, bool wait, bool view,
+ bool pdftex, bool epsformat, bool svg);
// Ship the picture out to PostScript & TeX files.
bool shipout(picture* preamble, const string& prefix,
- const string& format, double magnification=0.0,
- bool wait=false, bool view=true);
+ const string& format, bool wait=false, bool view=true);
void render(GLUnurbs *nurb, double size2,
const triple &Min, const triple& Max, double perspective,
diff --git a/Build/source/utils/asymptote/pipestream.cc b/Build/source/utils/asymptote/pipestream.cc
index 3fdff1d3c7e..a1e3e76e682 100644
--- a/Build/source/utils/asymptote/pipestream.cc
+++ b/Build/source/utils/asymptote/pipestream.cc
@@ -120,8 +120,12 @@ ssize_t iopipestream::readbuffer()
errno=0;
for(;;) {
if((nc=read(out[0],p,size)) < 0) {
- if(errno == EAGAIN) {p[0]=0; break;}
- else camp::reportError("read from pipe failed");
+ if(errno == EAGAIN || errno == EINTR) {p[0]=0; break;}
+ else {
+ ostringstream buf;
+ buf << "read from pipe failed: errno=" << errno;
+ camp::reportError(buf);
+ }
nc=0;
}
p[nc]=0;
diff --git a/Build/source/utils/asymptote/process.cc b/Build/source/utils/asymptote/process.cc
index 5bed94c807f..8622be8366e 100644
--- a/Build/source/utils/asymptote/process.cc
+++ b/Build/source/utils/asymptote/process.cc
@@ -31,6 +31,8 @@ pen& defaultpen() {
}
}
+unsigned int count=0;
+
namespace run {
void cleanup();
void exitFunction(vm::stack *Stack);
@@ -306,9 +308,11 @@ public:
block *tree=getTree();
if (tree) {
for(mem::list<runnable *>::iterator r=tree->stms.begin();
- r != tree->stms.end(); ++r)
+ r != tree->stms.end(); ++r) {
+ processData().fileName=(*r)->getPos().filename();
if(!em.errors() || getSetting<bool>("debug"))
runRunnable(*r,e,s,tm);
+ }
}
}
@@ -361,8 +365,7 @@ public:
ifile(const string& filename)
: itree(filename),
filename(filename),
- outname((string) (filename == "-" ? settings::outname() :
- stripDir(stripExt(string(filename), suffix)))) {}
+ outname(stripDir(stripExt(string(filename == "-" ? settings::outname() : filename), suffix))) {}
block *buildTree() {
return !filename.empty() ? parser::parseFile(filename,"Loading") : 0;
@@ -749,7 +752,9 @@ class iprompt : public icore {
// line and is being continued (either because of a backslash or the parser
// detecting it in multiline mode).
string getline(bool continuation) {
- string prompt=getSetting<string>(continuation ? "prompt2" : "prompt");
+ string prompt;
+ if(!getSetting<bool>("xasy"))
+ prompt=getSetting<string>(continuation ? "prompt2" : "prompt");
string line=interact::simpleline(prompt);
if (continuation)
@@ -775,15 +780,33 @@ class iprompt : public icore {
}
}
+ // Continue taking input until a termination command is received from xasy.
+ block *parseXasyLine(string line) {
+
+#ifdef __MSDOS__
+ const string EOT="\x04\r\n";
+#else
+ const string EOT="\x04\n";
+#endif
+ string s;
+ while((s=getline(true)) != EOT)
+ line += s;
+ return parser::parseString(line, "-", true);
+ }
+
void runLine(coenv &e, istack &s, string line) {
try {
- if (getSetting<bool>("multiline")) {
+ if(getSetting<bool>("multiline")) {
block *code=parseExtendableLine(line);
icode i(code);
i.run(e,s,TRANS_INTERACTIVE);
- }
- else {
+ } else if(getSetting<bool>("xasy")) {
+ block *code=parseXasyLine(line);
+
+ icode i(code);
+ i.run(e,s,TRANS_INTERACTIVE);
+ } else {
// Add a semi-colon to the end of the line if one is not there. Do this
// to the history as well, so the transcript can be run as regular asy
// code. This also makes the history work correctly if the multiline
@@ -836,7 +859,6 @@ public:
while (running) {
// Read a line from the prompt.
string line=getline(false);
-
// Check if it is a special command.
if (handleCommand(e,s,line))
continue;
diff --git a/Build/source/utils/asymptote/process.h b/Build/source/utils/asymptote/process.h
index 514e81feacc..1a5189cdb5e 100644
--- a/Build/source/utils/asymptote/process.h
+++ b/Build/source/utils/asymptote/process.h
@@ -17,6 +17,7 @@
#include "pipestream.h"
#include "callable.h"
#include "pen.h"
+#include "transform.h"
#ifdef HAVE_RPC_RPC_H
#include "xstream.h"
@@ -85,6 +86,11 @@ public:
~texstream();
};
+typedef std::pair<size_t,size_t> linecolumn;
+typedef mem::map<CONST linecolumn,string> xkey_t;
+typedef mem::deque<camp::transform> xtransform_t;
+typedef mem::map<CONST string,xtransform_t> xmap_t;
+
struct processDataStruct {
texstream tex; // Bi-directional pipe to latex (to find label bbox)
mem::list<string> TeXpipepreamble;
@@ -95,6 +101,13 @@ struct processDataStruct {
camp::pen defaultpen;
camp::pen currentpen;
+ // For xasy:
+ string fileName;
+ position topPos;
+ string KEY;
+ xkey_t xkey;
+ xmap_t xmap;
+
terminator<std::ofstream> ofile;
terminator<std::fstream> ifile;
#ifdef HAVE_RPC_RPC_H
diff --git a/Build/source/utils/asymptote/psfile.cc b/Build/source/utils/asymptote/psfile.cc
index 4d03c6837ed..8adce3855db 100644
--- a/Build/source/utils/asymptote/psfile.cc
+++ b/Build/source/utils/asymptote/psfile.cc
@@ -140,15 +140,18 @@ psfile::~psfile()
close();
}
-void psfile::header()
+void psfile::header(bool eps)
{
Int level=settings::getSetting<Int>("level");
- *out << "%!PS-Adobe-" << level << ".0 EPSF-" << level << ".0" << newl;
+ *out << "%!PS-Adobe-" << level << ".0";
+ if(eps)
+ *out << " EPSF-" << level << ".0";
+ *out << newl;
}
void psfile::prologue(const bbox& box)
{
- header();
+ header(true);
BoundingBox(box);
*out << "%%Creator: " << settings::PROGRAM << " " << settings::VERSION
<< REVISION << newl;
diff --git a/Build/source/utils/asymptote/psfile.h b/Build/source/utils/asymptote/psfile.h
index fd25663cb74..3dd5e74394c 100644
--- a/Build/source/utils/asymptote/psfile.h
+++ b/Build/source/utils/asymptote/psfile.h
@@ -150,7 +150,7 @@ public:
void prologue(const bbox& box);
void epilogue();
- void header();
+ void header(bool eps);
void close();
diff --git a/Build/source/utils/asymptote/revision.cc b/Build/source/utils/asymptote/revision.cc
index d33cc785843..079c8f194aa 100644
--- a/Build/source/utils/asymptote/revision.cc
+++ b/Build/source/utils/asymptote/revision.cc
@@ -1 +1 @@
-const char *REVISION="2.44";
+const char *REVISION="2.47";
diff --git a/Build/source/utils/asymptote/runarray.cc b/Build/source/utils/asymptote/runarray.cc
index 0325acef92d..a21565cad9a 100644
--- a/Build/source/utils/asymptote/runarray.cc
+++ b/Build/source/utils/asymptote/runarray.cc
@@ -1100,23 +1100,25 @@ void arrayFunction(stack *Stack)
#line 911 "runarray.in"
void arraySort(stack *Stack)
{
+ bool stable=vm::pop<bool>(Stack,true);
callable * less=vm::pop<callable *>(Stack);
array * a=vm::pop<array *>(Stack);
#line 912 "runarray.in"
array *c=copyArray(a);
compareFunc=less;
FuncStack=Stack;
- stable_sort(c->begin(),c->end(),compareFunction);
+ if(stable) stable_sort(c->begin(),c->end(),compareFunction);
+ else sort(c->begin(),c->end(),compareFunction);
{Stack->push<array*>(c); return;}
}
-#line 920 "runarray.in"
+#line 921 "runarray.in"
void arraySearch(stack *Stack)
{
callable * less=vm::pop<callable *>(Stack);
item key=vm::pop(Stack);
array * a=vm::pop<array *>(Stack);
-#line 921 "runarray.in"
+#line 922 "runarray.in"
size_t size=a->size();
compareFunc=less;
FuncStack=Stack;
@@ -1134,12 +1136,12 @@ void arraySearch(stack *Stack)
{Stack->push<Int>(0); return;}
}
-#line 939 "runarray.in"
+#line 940 "runarray.in"
// bool all(boolarray *a);
void gen_runarray38(stack *Stack)
{
boolarray * a=vm::pop<boolarray *>(Stack);
-#line 940 "runarray.in"
+#line 941 "runarray.in"
size_t size=checkArray(a);
bool c=true;
for(size_t i=0; i < size; i++)
@@ -1147,12 +1149,12 @@ void gen_runarray38(stack *Stack)
{Stack->push<bool>(c); return;}
}
-#line 948 "runarray.in"
+#line 949 "runarray.in"
// boolarray* !(boolarray* a);
void gen_runarray39(stack *Stack)
{
boolarray* a=vm::pop<boolarray*>(Stack);
-#line 949 "runarray.in"
+#line 950 "runarray.in"
size_t size=checkArray(a);
array *c=new array(size);
for(size_t i=0; i < size; i++)
@@ -1160,12 +1162,12 @@ void gen_runarray39(stack *Stack)
{Stack->push<boolarray*>(c); return;}
}
-#line 957 "runarray.in"
+#line 958 "runarray.in"
// Int sum(boolarray *a);
void gen_runarray40(stack *Stack)
{
boolarray * a=vm::pop<boolarray *>(Stack);
-#line 958 "runarray.in"
+#line 959 "runarray.in"
size_t size=checkArray(a);
Int sum=0;
for(size_t i=0; i < size; i++)
@@ -1173,11 +1175,11 @@ void gen_runarray40(stack *Stack)
{Stack->push<Int>(sum); return;}
}
-#line 966 "runarray.in"
+#line 967 "runarray.in"
void arrayConcat(stack *Stack)
{
array * a=vm::pop<array *>(Stack);
-#line 967 "runarray.in"
+#line 968 "runarray.in"
// a is an array of arrays to be concatenated together.
// The signature is
// T[] concat(... T[][] a);
@@ -1204,11 +1206,11 @@ void arrayConcat(stack *Stack)
{Stack->push<array*>(result); return;}
}
-#line 994 "runarray.in"
+#line 995 "runarray.in"
void array2Transpose(stack *Stack)
{
array * a=vm::pop<array *>(Stack);
-#line 995 "runarray.in"
+#line 996 "runarray.in"
size_t asize=checkArray(a);
array *c=new array(0);
for(size_t i=0; i < asize; i++) {
@@ -1235,12 +1237,12 @@ void array2Transpose(stack *Stack)
// permutation (021 or 120, etc; original is 012).
// Transpose by sending respective members to the permutated locations:
// return the array obtained by putting a[i][j][k] into position perm{ijk}.
-#line 1022 "runarray.in"
+#line 1023 "runarray.in"
void array3Transpose(stack *Stack)
{
array * perm=vm::pop<array *>(Stack);
array * a=vm::pop<array *>(Stack);
-#line 1023 "runarray.in"
+#line 1024 "runarray.in"
const size_t DIM=3;
if(checkArray(perm) != DIM) {
@@ -1324,13 +1326,13 @@ void array3Transpose(stack *Stack)
// Find the index of the nth true value in a boolean array or -1 if not found.
// If n is negative, search backwards.
-#line 1107 "runarray.in"
+#line 1108 "runarray.in"
// Int find(boolarray *a, Int n=1);
void gen_runarray44(stack *Stack)
{
Int n=vm::pop<Int>(Stack,1);
boolarray * a=vm::pop<boolarray *>(Stack);
-#line 1108 "runarray.in"
+#line 1109 "runarray.in"
size_t size=checkArray(a);
Int j=-1;
if(n > 0)
@@ -1347,12 +1349,12 @@ void gen_runarray44(stack *Stack)
}
// Find all indices of true values in a boolean array.
-#line 1125 "runarray.in"
+#line 1126 "runarray.in"
// Intarray* findall(boolarray *a);
void gen_runarray45(stack *Stack)
{
boolarray * a=vm::pop<boolarray *>(Stack);
-#line 1126 "runarray.in"
+#line 1127 "runarray.in"
size_t size=checkArray(a);
array *b=new array(0);
for(size_t i=0; i < size; i++) {
@@ -1365,13 +1367,13 @@ void gen_runarray45(stack *Stack)
// construct vector obtained by replacing those elements of b for which the
// corresponding elements of a are false by the corresponding element of c.
-#line 1139 "runarray.in"
+#line 1140 "runarray.in"
void arrayConditional(stack *Stack)
{
array * c=vm::pop<array *>(Stack);
array * b=vm::pop<array *>(Stack);
array * a=vm::pop<array *>(Stack);
-#line 1140 "runarray.in"
+#line 1141 "runarray.in"
size_t size=checkArray(a);
array *r=new array(size);
if(b && c) {
@@ -1395,22 +1397,22 @@ void arrayConditional(stack *Stack)
}
// Return an n x n identity matrix.
-#line 1164 "runarray.in"
+#line 1165 "runarray.in"
// realarray2* identity(Int n);
void gen_runarray47(stack *Stack)
{
Int n=vm::pop<Int>(Stack);
-#line 1165 "runarray.in"
+#line 1166 "runarray.in"
{Stack->push<realarray2*>(Identity(n)); return;}
}
// Return the inverse of an n x n matrix a using Gauss-Jordan elimination.
-#line 1170 "runarray.in"
+#line 1171 "runarray.in"
// realarray2* inverse(realarray2 *a);
void gen_runarray48(stack *Stack)
{
realarray2 * a=vm::pop<realarray2 *>(Stack);
-#line 1171 "runarray.in"
+#line 1172 "runarray.in"
size_t n=checkArray(a);
double *A;
copyArray2C(A,a,true,0,NoGC);
@@ -1423,14 +1425,14 @@ void gen_runarray48(stack *Stack)
// Solve the linear equation ax=b by LU decomposition, returning the
// solution x, where a is an n x n matrix and b is an array of length n.
// If no solution exists, return an empty array.
-#line 1184 "runarray.in"
+#line 1185 "runarray.in"
// realarray* solve(realarray2 *a, realarray *b, bool warn=true);
void gen_runarray49(stack *Stack)
{
bool warn=vm::pop<bool>(Stack,true);
realarray * b=vm::pop<realarray *>(Stack);
realarray2 * a=vm::pop<realarray2 *>(Stack);
-#line 1185 "runarray.in"
+#line 1186 "runarray.in"
size_t n=checkArray(a);
if(n == 0) {Stack->push<realarray*>(new array(0)); return;}
@@ -1482,14 +1484,14 @@ void gen_runarray49(stack *Stack)
// Solve the linear equation ax=b by LU decomposition, returning the
// solution x, where a is an n x n matrix and b is an n x m matrix.
// If no solution exists, return an empty array.
-#line 1237 "runarray.in"
+#line 1238 "runarray.in"
// realarray2* solve(realarray2 *a, realarray2 *b, bool warn=true);
void gen_runarray50(stack *Stack)
{
bool warn=vm::pop<bool>(Stack,true);
realarray2 * b=vm::pop<realarray2 *>(Stack);
realarray2 * a=vm::pop<realarray2 *>(Stack);
-#line 1238 "runarray.in"
+#line 1239 "runarray.in"
size_t n=checkArray(a);
if(n == 0) {Stack->push<realarray2*>(new array(0)); return;}
@@ -1551,12 +1553,12 @@ void gen_runarray50(stack *Stack)
}
// Compute the determinant of an n x n matrix.
-#line 1300 "runarray.in"
+#line 1301 "runarray.in"
// real determinant(realarray2 *a);
void gen_runarray51(stack *Stack)
{
realarray2 * a=vm::pop<realarray2 *>(Stack);
-#line 1301 "runarray.in"
+#line 1302 "runarray.in"
real *A;
copyArray2C(A,a);
size_t n=checkArray(a);
@@ -1571,13 +1573,13 @@ void gen_runarray51(stack *Stack)
{Stack->push<real>(det); return;}
}
-#line 1316 "runarray.in"
+#line 1317 "runarray.in"
// realarray* *(realarray2 *a, realarray *b);
void gen_runarray52(stack *Stack)
{
realarray * b=vm::pop<realarray *>(Stack);
realarray2 * a=vm::pop<realarray2 *>(Stack);
-#line 1317 "runarray.in"
+#line 1318 "runarray.in"
size_t n=checkArray(a);
size_t m=checkArray(b);
array *c=new array(n);
@@ -1595,13 +1597,13 @@ void gen_runarray52(stack *Stack)
{Stack->push<realarray*>(c); return;}
}
-#line 1335 "runarray.in"
+#line 1336 "runarray.in"
// realarray* *(realarray *a, realarray2 *b);
void gen_runarray53(stack *Stack)
{
realarray2 * b=vm::pop<realarray2 *>(Stack);
realarray * a=vm::pop<realarray *>(Stack);
-#line 1336 "runarray.in"
+#line 1337 "runarray.in"
size_t n=checkArray(a);
if(n != checkArray(b)) error(incommensurate);
real *A;
@@ -1629,62 +1631,62 @@ void gen_runarray53(stack *Stack)
{Stack->push<realarray*>(c); return;}
}
-#line 1364 "runarray.in"
+#line 1365 "runarray.in"
// Intarray2* *(Intarray2 *a, Intarray2 *b);
void gen_runarray54(stack *Stack)
{
Intarray2 * b=vm::pop<Intarray2 *>(Stack);
Intarray2 * a=vm::pop<Intarray2 *>(Stack);
-#line 1365 "runarray.in"
+#line 1366 "runarray.in"
{Stack->push<Intarray2*>(mult<Int>(a,b)); return;}
}
-#line 1369 "runarray.in"
+#line 1370 "runarray.in"
// realarray2* *(realarray2 *a, realarray2 *b);
void gen_runarray55(stack *Stack)
{
realarray2 * b=vm::pop<realarray2 *>(Stack);
realarray2 * a=vm::pop<realarray2 *>(Stack);
-#line 1370 "runarray.in"
+#line 1371 "runarray.in"
{Stack->push<realarray2*>(mult<real>(a,b)); return;}
}
-#line 1374 "runarray.in"
+#line 1375 "runarray.in"
// pairarray2* *(pairarray2 *a, pairarray2 *b);
void gen_runarray56(stack *Stack)
{
pairarray2 * b=vm::pop<pairarray2 *>(Stack);
pairarray2 * a=vm::pop<pairarray2 *>(Stack);
-#line 1375 "runarray.in"
+#line 1376 "runarray.in"
{Stack->push<pairarray2*>(mult<pair>(a,b)); return;}
}
-#line 1379 "runarray.in"
+#line 1380 "runarray.in"
// triple *(realarray2 *t, triple v);
void gen_runarray57(stack *Stack)
{
triple v=vm::pop<triple>(Stack);
realarray2 * t=vm::pop<realarray2 *>(Stack);
-#line 1380 "runarray.in"
+#line 1381 "runarray.in"
{Stack->push<triple>(*t*v); return;}
}
-#line 1384 "runarray.in"
+#line 1385 "runarray.in"
// realarray2* AtA(realarray2 *a);
void gen_runarray58(stack *Stack)
{
realarray2 * a=vm::pop<realarray2 *>(Stack);
-#line 1385 "runarray.in"
+#line 1386 "runarray.in"
{Stack->push<realarray2*>(AtA<real>(a)); return;}
}
-#line 1389 "runarray.in"
+#line 1390 "runarray.in"
// pair project(triple v, realarray2 *t);
void gen_runarray59(stack *Stack)
{
realarray2 * t=vm::pop<realarray2 *>(Stack);
triple v=vm::pop<triple>(Stack);
-#line 1390 "runarray.in"
+#line 1391 "runarray.in"
size_t n=checkArray(t);
if(n != 4) error(incommensurate);
array *t0=read<array*>(t,0);
@@ -1709,13 +1711,13 @@ void gen_runarray59(stack *Stack)
}
// Compute the dot product of vectors a and b.
-#line 1415 "runarray.in"
+#line 1416 "runarray.in"
// real dot(realarray *a, realarray *b);
void gen_runarray60(stack *Stack)
{
realarray * b=vm::pop<realarray *>(Stack);
realarray * a=vm::pop<realarray *>(Stack);
-#line 1416 "runarray.in"
+#line 1417 "runarray.in"
size_t n=checkArrays(a,b);
real sum=0.0;
for(size_t i=0; i < n; ++i)
@@ -1724,13 +1726,13 @@ void gen_runarray60(stack *Stack)
}
// Compute the complex dot product of vectors a and b.
-#line 1425 "runarray.in"
+#line 1426 "runarray.in"
// pair dot(pairarray *a, pairarray *b);
void gen_runarray61(stack *Stack)
{
pairarray * b=vm::pop<pairarray *>(Stack);
pairarray * a=vm::pop<pairarray *>(Stack);
-#line 1426 "runarray.in"
+#line 1427 "runarray.in"
size_t n=checkArrays(a,b);
pair sum=zero;
for(size_t i=0; i < n; ++i)
@@ -1745,7 +1747,7 @@ void gen_runarray61(stack *Stack)
// [ a[2] b[2] c[2] ]
// [ ... ]
// [ c[n-1] a[n-1] b[n-1] ]
-#line 1441 "runarray.in"
+#line 1442 "runarray.in"
// realarray* tridiagonal(realarray *a, realarray *b, realarray *c, realarray *f);
void gen_runarray62(stack *Stack)
{
@@ -1753,7 +1755,7 @@ void gen_runarray62(stack *Stack)
realarray * c=vm::pop<realarray *>(Stack);
realarray * b=vm::pop<realarray *>(Stack);
realarray * a=vm::pop<realarray *>(Stack);
-#line 1442 "runarray.in"
+#line 1443 "runarray.in"
size_t n=checkArrays(a,b);
checkEqual(n,checkArray(c));
checkEqual(n,checkArray(f));
@@ -1850,7 +1852,7 @@ void gen_runarray62(stack *Stack)
}
// Root solve by Newton-Raphson
-#line 1539 "runarray.in"
+#line 1540 "runarray.in"
// real newton(Int iterations=100, callableReal *f, callableReal *fprime, real x, bool verbose=false);
void gen_runarray63(stack *Stack)
{
@@ -1859,7 +1861,7 @@ void gen_runarray63(stack *Stack)
callableReal * fprime=vm::pop<callableReal *>(Stack);
callableReal * f=vm::pop<callableReal *>(Stack);
Int iterations=vm::pop<Int>(Stack,100);
-#line 1541 "runarray.in"
+#line 1542 "runarray.in"
static const real fuzz=1000.0*DBL_EPSILON;
Int i=0;
size_t oldPrec=0;
@@ -1905,7 +1907,7 @@ void gen_runarray63(stack *Stack)
// Root solve by Newton-Raphson bisection
// cf. routine rtsafe (Press et al., Numerical Recipes, 1991).
-#line 1587 "runarray.in"
+#line 1588 "runarray.in"
// real newton(Int iterations=100, callableReal *f, callableReal *fprime, real x1, real x2, bool verbose=false);
void gen_runarray64(stack *Stack)
{
@@ -1915,7 +1917,7 @@ void gen_runarray64(stack *Stack)
callableReal * fprime=vm::pop<callableReal *>(Stack);
callableReal * f=vm::pop<callableReal *>(Stack);
Int iterations=vm::pop<Int>(Stack,100);
-#line 1589 "runarray.in"
+#line 1590 "runarray.in"
static const real fuzz=1000.0*DBL_EPSILON;
size_t oldPrec=0;
if(verbose)
@@ -2001,7 +2003,7 @@ void gen_runarray64(stack *Stack)
// In this implementation, the binary search is interleaved
// with a modified version of quadratic interpolation.
// This is a C++ port of the Asymptote routine written by Charles Staats III.
-#line 1675 "runarray.in"
+#line 1676 "runarray.in"
// real _findroot(callableReal *f, real a, real b, real tolerance, real fa, real fb);
void gen_runarray65(stack *Stack)
{
@@ -2011,7 +2013,7 @@ void gen_runarray65(stack *Stack)
real b=vm::pop<real>(Stack);
real a=vm::pop<real>(Stack);
callableReal * f=vm::pop<callableReal *>(Stack);
-#line 1677 "runarray.in"
+#line 1678 "runarray.in"
if(fa == 0.0) {Stack->push<real>(a); return;}
if(fb == 0.0) {Stack->push<real>(b); return;}
@@ -2103,7 +2105,7 @@ void gen_runarray65(stack *Stack)
{Stack->push<real>(a-(b-a)/(fb-fa)*fa); return;}
}
-#line 1769 "runarray.in"
+#line 1770 "runarray.in"
// real simpson(callableReal *f, real a, real b, real acc=DBL_EPSILON, real dxmax=0);
void gen_runarray66(stack *Stack)
{
@@ -2112,7 +2114,7 @@ void gen_runarray66(stack *Stack)
real b=vm::pop<real>(Stack);
real a=vm::pop<real>(Stack);
callableReal * f=vm::pop<callableReal *>(Stack);
-#line 1771 "runarray.in"
+#line 1772 "runarray.in"
real integral;
if(dxmax <= 0) dxmax=fabs(b-a);
callable *oldFunc=Func;
@@ -2125,13 +2127,13 @@ void gen_runarray66(stack *Stack)
}
// Compute the fast Fourier transform of a pair array
-#line 1784 "runarray.in"
+#line 1785 "runarray.in"
// pairarray* fft(pairarray *a, Int sign=1);
void gen_runarray67(stack *Stack)
{
Int sign=vm::pop<Int>(Stack,1);
pairarray * a=vm::pop<pairarray *>(Stack);
-#line 1785 "runarray.in"
+#line 1786 "runarray.in"
#ifdef HAVE_LIBFFTW3
unsigned n=(unsigned) checkArray(a);
array *c=new array(n);
@@ -2160,12 +2162,12 @@ void gen_runarray67(stack *Stack)
{Stack->push<pairarray*>(c); return;}
}
-#line 1814 "runarray.in"
+#line 1815 "runarray.in"
// Intarray2* triangulate(pairarray *z);
void gen_runarray68(stack *Stack)
{
pairarray * z=vm::pop<pairarray *>(Stack);
-#line 1815 "runarray.in"
+#line 1816 "runarray.in"
size_t nv=checkArray(z);
// Call robust version of Gilles Dumoulin's port of Paul Bourke's
// triangulation code.
@@ -2199,12 +2201,12 @@ void gen_runarray68(stack *Stack)
{Stack->push<Intarray2*>(t); return;}
}
-#line 1849 "runarray.in"
+#line 1850 "runarray.in"
// real norm(realarray *a);
void gen_runarray69(stack *Stack)
{
realarray * a=vm::pop<realarray *>(Stack);
-#line 1850 "runarray.in"
+#line 1851 "runarray.in"
size_t n=checkArray(a);
real M=0.0;
for(size_t i=0; i < n; ++i) {
@@ -2214,12 +2216,12 @@ void gen_runarray69(stack *Stack)
{Stack->push<real>(M); return;}
}
-#line 1860 "runarray.in"
+#line 1861 "runarray.in"
// real norm(realarray2 *a);
void gen_runarray70(stack *Stack)
{
realarray2 * a=vm::pop<realarray2 *>(Stack);
-#line 1861 "runarray.in"
+#line 1862 "runarray.in"
size_t n=checkArray(a);
real M=0.0;
for(size_t i=0; i < n; ++i) {
@@ -2233,12 +2235,12 @@ void gen_runarray70(stack *Stack)
{Stack->push<real>(M); return;}
}
-#line 1875 "runarray.in"
+#line 1876 "runarray.in"
// real norm(triplearray2 *a);
void gen_runarray71(stack *Stack)
{
triplearray2 * a=vm::pop<triplearray2 *>(Stack);
-#line 1876 "runarray.in"
+#line 1877 "runarray.in"
size_t n=checkArray(a);
real M=0.0;
for(size_t i=0; i < n; ++i) {
@@ -2252,12 +2254,12 @@ void gen_runarray71(stack *Stack)
{Stack->push<real>(sqrt(M)); return;}
}
-#line 1890 "runarray.in"
+#line 1891 "runarray.in"
// real change2(triplearray2 *a);
void gen_runarray72(stack *Stack)
{
triplearray2 * a=vm::pop<triplearray2 *>(Stack);
-#line 1891 "runarray.in"
+#line 1892 "runarray.in"
size_t n=checkArray(a);
if(n == 0) {Stack->push<real>(0.0); return;}
@@ -2278,13 +2280,13 @@ void gen_runarray72(stack *Stack)
{Stack->push<real>(M); return;}
}
-#line 1912 "runarray.in"
+#line 1913 "runarray.in"
// triple minbezier(triplearray2 *P, triple b);
void gen_runarray73(stack *Stack)
{
triple b=vm::pop<triple>(Stack);
triplearray2 * P=vm::pop<triplearray2 *>(Stack);
-#line 1913 "runarray.in"
+#line 1914 "runarray.in"
size_t N;
real *A=copyTripleArray2Components(P,N);
bound_double *B=bounddouble(N);
@@ -2295,13 +2297,13 @@ void gen_runarray73(stack *Stack)
{Stack->push<triple>(b); return;}
}
-#line 1924 "runarray.in"
+#line 1925 "runarray.in"
// triple maxbezier(triplearray2 *P, triple b);
void gen_runarray74(stack *Stack)
{
triple b=vm::pop<triple>(Stack);
triplearray2 * P=vm::pop<triplearray2 *>(Stack);
-#line 1925 "runarray.in"
+#line 1926 "runarray.in"
size_t N;
real *A=copyTripleArray2Components(P,N);
bound_double *B=bounddouble(N);
@@ -2312,13 +2314,13 @@ void gen_runarray74(stack *Stack)
{Stack->push<triple>(b); return;}
}
-#line 1936 "runarray.in"
+#line 1937 "runarray.in"
// pair minratio(triplearray2 *P, pair b);
void gen_runarray75(stack *Stack)
{
pair b=vm::pop<pair>(Stack);
triplearray2 * P=vm::pop<triplearray2 *>(Stack);
-#line 1937 "runarray.in"
+#line 1938 "runarray.in"
size_t N;
triple *A=copyTripleArray2C(P,N);
real fuzz=sqrtFuzz*norm(A,N);
@@ -2329,13 +2331,13 @@ void gen_runarray75(stack *Stack)
{Stack->push<pair>(b); return;}
}
-#line 1948 "runarray.in"
+#line 1949 "runarray.in"
// pair maxratio(triplearray2 *P, pair b);
void gen_runarray76(stack *Stack)
{
pair b=vm::pop<pair>(Stack);
triplearray2 * P=vm::pop<triplearray2 *>(Stack);
-#line 1949 "runarray.in"
+#line 1950 "runarray.in"
size_t N;
triple *A=copyTripleArray2C(P,N);
bound_triple *B=boundtriple(N);
@@ -2346,11 +2348,11 @@ void gen_runarray76(stack *Stack)
{Stack->push<pair>(b); return;}
}
-#line 1960 "runarray.in"
+#line 1961 "runarray.in"
// realarray* _projection();
void gen_runarray77(stack *Stack)
{
-#line 1961 "runarray.in"
+#line 1962 "runarray.in"
#ifdef HAVE_GL
array *a=new array(14);
gl::projection P=gl::camera();
@@ -2461,87 +2463,87 @@ void gen_runarray_venv(venv &ve)
REGISTER_BLTIN(run::arrayFunction,"arrayFunction");
#line 911 "runarray.in"
REGISTER_BLTIN(run::arraySort,"arraySort");
-#line 920 "runarray.in"
+#line 921 "runarray.in"
REGISTER_BLTIN(run::arraySearch,"arraySearch");
-#line 939 "runarray.in"
+#line 940 "runarray.in"
addFunc(ve, run::gen_runarray38, primBoolean(), SYM(all), formal(booleanArray(), SYM(a), false, false));
-#line 948 "runarray.in"
+#line 949 "runarray.in"
addFunc(ve, run::gen_runarray39, booleanArray(), SYM_LOGNOT, formal(booleanArray(), SYM(a), false, false));
-#line 957 "runarray.in"
+#line 958 "runarray.in"
addFunc(ve, run::gen_runarray40, primInt(), SYM(sum), formal(booleanArray(), SYM(a), false, false));
-#line 966 "runarray.in"
+#line 967 "runarray.in"
REGISTER_BLTIN(run::arrayConcat,"arrayConcat");
-#line 994 "runarray.in"
+#line 995 "runarray.in"
REGISTER_BLTIN(run::array2Transpose,"array2Transpose");
-#line 1018 "runarray.in"
+#line 1019 "runarray.in"
REGISTER_BLTIN(run::array3Transpose,"array3Transpose");
-#line 1105 "runarray.in"
+#line 1106 "runarray.in"
addFunc(ve, run::gen_runarray44, primInt(), SYM(find), formal(booleanArray(), SYM(a), false, false), formal(primInt(), SYM(n), true, false));
-#line 1124 "runarray.in"
+#line 1125 "runarray.in"
addFunc(ve, run::gen_runarray45, IntArray(), SYM(findall), formal(booleanArray(), SYM(a), false, false));
-#line 1137 "runarray.in"
+#line 1138 "runarray.in"
REGISTER_BLTIN(run::arrayConditional,"arrayConditional");
-#line 1163 "runarray.in"
+#line 1164 "runarray.in"
addFunc(ve, run::gen_runarray47, realArray2(), SYM(identity), formal(primInt(), SYM(n), false, false));
-#line 1169 "runarray.in"
+#line 1170 "runarray.in"
addFunc(ve, run::gen_runarray48, realArray2(), SYM(inverse), formal(realArray2(), SYM(a), false, false));
-#line 1181 "runarray.in"
+#line 1182 "runarray.in"
addFunc(ve, run::gen_runarray49, realArray(), SYM(solve), formal(realArray2(), SYM(a), false, false), formal(realArray(), SYM(b), false, false), formal(primBoolean(), SYM(warn), true, false));
-#line 1234 "runarray.in"
+#line 1235 "runarray.in"
addFunc(ve, run::gen_runarray50, realArray2(), SYM(solve), formal(realArray2(), SYM(a), false, false), formal(realArray2(), SYM(b), false, false), formal(primBoolean(), SYM(warn), true, false));
-#line 1299 "runarray.in"
+#line 1300 "runarray.in"
addFunc(ve, run::gen_runarray51, primReal(), SYM(determinant), formal(realArray2(), SYM(a), false, false));
-#line 1316 "runarray.in"
+#line 1317 "runarray.in"
addFunc(ve, run::gen_runarray52, realArray(), SYM_TIMES, formal(realArray2(), SYM(a), false, false), formal(realArray(), SYM(b), false, false));
-#line 1335 "runarray.in"
+#line 1336 "runarray.in"
addFunc(ve, run::gen_runarray53, realArray(), SYM_TIMES, formal(realArray(), SYM(a), false, false), formal(realArray2(), SYM(b), false, false));
-#line 1364 "runarray.in"
+#line 1365 "runarray.in"
addFunc(ve, run::gen_runarray54, IntArray2(), SYM_TIMES, formal(IntArray2(), SYM(a), false, false), formal(IntArray2(), SYM(b), false, false));
-#line 1369 "runarray.in"
+#line 1370 "runarray.in"
addFunc(ve, run::gen_runarray55, realArray2(), SYM_TIMES, formal(realArray2(), SYM(a), false, false), formal(realArray2(), SYM(b), false, false));
-#line 1374 "runarray.in"
+#line 1375 "runarray.in"
addFunc(ve, run::gen_runarray56, pairArray2(), SYM_TIMES, formal(pairArray2(), SYM(a), false, false), formal(pairArray2(), SYM(b), false, false));
-#line 1379 "runarray.in"
+#line 1380 "runarray.in"
addFunc(ve, run::gen_runarray57, primTriple(), SYM_TIMES, formal(realArray2(), SYM(t), false, false), formal(primTriple(), SYM(v), false, false));
-#line 1384 "runarray.in"
+#line 1385 "runarray.in"
addFunc(ve, run::gen_runarray58, realArray2(), SYM(AtA), formal(realArray2(), SYM(a), false, false));
-#line 1389 "runarray.in"
+#line 1390 "runarray.in"
addFunc(ve, run::gen_runarray59, primPair(), SYM(project), formal(primTriple(), SYM(v), false, false), formal(realArray2(), SYM(t), false, false));
-#line 1414 "runarray.in"
+#line 1415 "runarray.in"
addFunc(ve, run::gen_runarray60, primReal(), SYM(dot), formal(realArray(), SYM(a), false, false), formal(realArray(), SYM(b), false, false));
-#line 1424 "runarray.in"
+#line 1425 "runarray.in"
addFunc(ve, run::gen_runarray61, primPair(), SYM(dot), formal(pairArray(), SYM(a), false, false), formal(pairArray(), SYM(b), false, false));
-#line 1434 "runarray.in"
+#line 1435 "runarray.in"
addFunc(ve, run::gen_runarray62, realArray(), SYM(tridiagonal), formal(realArray(), SYM(a), false, false), formal(realArray(), SYM(b), false, false), formal(realArray(), SYM(c), false, false), formal(realArray(), SYM(f), false, false));
-#line 1538 "runarray.in"
+#line 1539 "runarray.in"
addFunc(ve, run::gen_runarray63, primReal(), SYM(newton), formal(primInt(), SYM(iterations), true, false), formal(realRealFunction(), SYM(f), false, false), formal(realRealFunction(), SYM(fprime), false, false), formal(primReal(), SYM(x), false, false), formal(primBoolean(), SYM(verbose), true, false));
-#line 1585 "runarray.in"
+#line 1586 "runarray.in"
addFunc(ve, run::gen_runarray64, primReal(), SYM(newton), formal(primInt(), SYM(iterations), true, false), formal(realRealFunction(), SYM(f), false, false), formal(realRealFunction(), SYM(fprime), false, false), formal(primReal(), SYM(x1), false, false), formal(primReal(), SYM(x2), false, false), formal(primBoolean(), SYM(verbose), true, false));
-#line 1667 "runarray.in"
+#line 1668 "runarray.in"
addFunc(ve, run::gen_runarray65, primReal(), SYM(_findroot), formal(realRealFunction(), SYM(f), false, false), formal(primReal(), SYM(a), false, false), formal(primReal(), SYM(b), false, false), formal(primReal(), SYM(tolerance), false, false), formal(primReal(), SYM(fa), false, false), formal(primReal(), SYM(fb), false, false));
-#line 1769 "runarray.in"
+#line 1770 "runarray.in"
addFunc(ve, run::gen_runarray66, primReal(), SYM(simpson), formal(realRealFunction(), SYM(f), false, false), formal(primReal(), SYM(a), false, false), formal(primReal(), SYM(b), false, false), formal(primReal(), SYM(acc), true, false), formal(primReal(), SYM(dxmax), true, false));
-#line 1783 "runarray.in"
+#line 1784 "runarray.in"
addFunc(ve, run::gen_runarray67, pairArray(), SYM(fft), formal(pairArray(), SYM(a), false, false), formal(primInt(), SYM(sign), true, false));
-#line 1814 "runarray.in"
+#line 1815 "runarray.in"
addFunc(ve, run::gen_runarray68, IntArray2(), SYM(triangulate), formal(pairArray(), SYM(z), false, false));
-#line 1849 "runarray.in"
+#line 1850 "runarray.in"
addFunc(ve, run::gen_runarray69, primReal(), SYM(norm), formal(realArray(), SYM(a), false, false));
-#line 1860 "runarray.in"
+#line 1861 "runarray.in"
addFunc(ve, run::gen_runarray70, primReal(), SYM(norm), formal(realArray2(), SYM(a), false, false));
-#line 1875 "runarray.in"
+#line 1876 "runarray.in"
addFunc(ve, run::gen_runarray71, primReal(), SYM(norm), formal(tripleArray2(), SYM(a), false, false));
-#line 1890 "runarray.in"
+#line 1891 "runarray.in"
addFunc(ve, run::gen_runarray72, primReal(), SYM(change2), formal(tripleArray2(), SYM(a), false, false));
-#line 1912 "runarray.in"
+#line 1913 "runarray.in"
addFunc(ve, run::gen_runarray73, primTriple(), SYM(minbezier), formal(tripleArray2(), SYM(p), false, false), formal(primTriple(), SYM(b), false, false));
-#line 1924 "runarray.in"
+#line 1925 "runarray.in"
addFunc(ve, run::gen_runarray74, primTriple(), SYM(maxbezier), formal(tripleArray2(), SYM(p), false, false), formal(primTriple(), SYM(b), false, false));
-#line 1936 "runarray.in"
+#line 1937 "runarray.in"
addFunc(ve, run::gen_runarray75, primPair(), SYM(minratio), formal(tripleArray2(), SYM(p), false, false), formal(primPair(), SYM(b), false, false));
-#line 1948 "runarray.in"
+#line 1949 "runarray.in"
addFunc(ve, run::gen_runarray76, primPair(), SYM(maxratio), formal(tripleArray2(), SYM(p), false, false), formal(primPair(), SYM(b), false, false));
-#line 1960 "runarray.in"
+#line 1961 "runarray.in"
addFunc(ve, run::gen_runarray77, realArray(), SYM(_projection));
}
diff --git a/Build/source/utils/asymptote/runarray.in b/Build/source/utils/asymptote/runarray.in
index 0f1502f6abb..501d36e609f 100644
--- a/Build/source/utils/asymptote/runarray.in
+++ b/Build/source/utils/asymptote/runarray.in
@@ -908,12 +908,13 @@ array* :arrayFunction(callable *f, array *a)
return b;
}
-array* :arraySort(array *a, callable *less)
+array* :arraySort(array *a, callable *less, bool stable=true)
{
array *c=copyArray(a);
compareFunc=less;
FuncStack=Stack;
- stable_sort(c->begin(),c->end(),compareFunction);
+ if(stable) stable_sort(c->begin(),c->end(),compareFunction);
+ else sort(c->begin(),c->end(),compareFunction);
return c;
}
diff --git a/Build/source/utils/asymptote/runarray.symbols.h b/Build/source/utils/asymptote/runarray.symbols.h
deleted file mode 100644
index ce7a164bde6..00000000000
--- a/Build/source/utils/asymptote/runarray.symbols.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*****
- * This file is automatically generated by findsym.pl
- * Changes will be overwritten.
- *****/
-
-// If the ADDSYMBOL macro is not already defined, define it with the default
-// purpose of referring to an external pre-translated symbol, such that
-// SYM(name) also refers to that symbol.
-#ifndef ADDSYMBOL
- #define ADDSYMBOL(name) extern sym::symbol PRETRANSLATED_SYMBOL_##name
- #define SYM(name) PRETRANSLATED_SYMBOL_##name
-#endif
-
-ADDSYMBOL(AtA);
-ADDSYMBOL(_findroot);
-ADDSYMBOL(_projection);
-ADDSYMBOL(a);
-ADDSYMBOL(acc);
-ADDSYMBOL(all);
-ADDSYMBOL(b);
-ADDSYMBOL(c);
-ADDSYMBOL(change2);
-ADDSYMBOL(complement);
-ADDSYMBOL(determinant);
-ADDSYMBOL(dot);
-ADDSYMBOL(dxmax);
-ADDSYMBOL(f);
-ADDSYMBOL(fa);
-ADDSYMBOL(fb);
-ADDSYMBOL(fft);
-ADDSYMBOL(find);
-ADDSYMBOL(findall);
-ADDSYMBOL(fprime);
-ADDSYMBOL(identity);
-ADDSYMBOL(inverse);
-ADDSYMBOL(iterations);
-ADDSYMBOL(maxbezier);
-ADDSYMBOL(maxratio);
-ADDSYMBOL(minbezier);
-ADDSYMBOL(minratio);
-ADDSYMBOL(n);
-ADDSYMBOL(newton);
-ADDSYMBOL(norm);
-ADDSYMBOL(p);
-ADDSYMBOL(project);
-ADDSYMBOL(sequence);
-ADDSYMBOL(sign);
-ADDSYMBOL(simpson);
-ADDSYMBOL(solve);
-ADDSYMBOL(sum);
-ADDSYMBOL(t);
-ADDSYMBOL(tolerance);
-ADDSYMBOL(triangulate);
-ADDSYMBOL(tridiagonal);
-ADDSYMBOL(v);
-ADDSYMBOL(verbose);
-ADDSYMBOL(warn);
-ADDSYMBOL(x);
-ADDSYMBOL(x1);
-ADDSYMBOL(x2);
-ADDSYMBOL(z);
diff --git a/Build/source/utils/asymptote/runbacktrace.symbols.h b/Build/source/utils/asymptote/runbacktrace.symbols.h
deleted file mode 100644
index 150dd5741b0..00000000000
--- a/Build/source/utils/asymptote/runbacktrace.symbols.h
+++ /dev/null
@@ -1,16 +0,0 @@
-/*****
- * This file is automatically generated by findsym.pl
- * Changes will be overwritten.
- *****/
-
-// If the ADDSYMBOL macro is not already defined, define it with the default
-// purpose of referring to an external pre-translated symbol, such that
-// SYM(name) also refers to that symbol.
-#ifndef ADDSYMBOL
- #define ADDSYMBOL(name) extern sym::symbol PRETRANSLATED_SYMBOL_##name
- #define SYM(name) PRETRANSLATED_SYMBOL_##name
-#endif
-
-ADDSYMBOL(generate_random_backtrace);
-ADDSYMBOL(n);
-ADDSYMBOL(print_random_addresses);
diff --git a/Build/source/utils/asymptote/runfile.symbols.h b/Build/source/utils/asymptote/runfile.symbols.h
deleted file mode 100644
index a0ad7ffb623..00000000000
--- a/Build/source/utils/asymptote/runfile.symbols.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*****
- * This file is automatically generated by findsym.pl
- * Changes will be overwritten.
- *****/
-
-// If the ADDSYMBOL macro is not already defined, define it with the default
-// purpose of referring to an external pre-translated symbol, such that
-// SYM(name) also refers to that symbol.
-#ifndef ADDSYMBOL
- #define ADDSYMBOL(name) extern sym::symbol PRETRANSLATED_SYMBOL_##name
- #define SYM(name) PRETRANSLATED_SYMBOL_##name
-#endif
-
-ADDSYMBOL(a);
-ADDSYMBOL(b);
-ADDSYMBOL(check);
-ADDSYMBOL(clear);
-ADDSYMBOL(close);
-ADDSYMBOL(comment);
-ADDSYMBOL(delete);
-ADDSYMBOL(digits);
-ADDSYMBOL(eof);
-ADDSYMBOL(eol);
-ADDSYMBOL(error);
-ADDSYMBOL(f);
-ADDSYMBOL(flush);
-ADDSYMBOL(from);
-ADDSYMBOL(getc);
-ADDSYMBOL(input);
-ADDSYMBOL(mktemp);
-ADDSYMBOL(mode);
-ADDSYMBOL(name);
-ADDSYMBOL(output);
-ADDSYMBOL(pos);
-ADDSYMBOL(precision);
-ADDSYMBOL(rename);
-ADDSYMBOL(s);
-ADDSYMBOL(seek);
-ADDSYMBOL(seekeof);
-ADDSYMBOL(tell);
-ADDSYMBOL(to);
-ADDSYMBOL(update);
diff --git a/Build/source/utils/asymptote/runhistory.symbols.h b/Build/source/utils/asymptote/runhistory.symbols.h
deleted file mode 100644
index 64ed302f8b5..00000000000
--- a/Build/source/utils/asymptote/runhistory.symbols.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/*****
- * This file is automatically generated by findsym.pl
- * Changes will be overwritten.
- *****/
-
-// If the ADDSYMBOL macro is not already defined, define it with the default
-// purpose of referring to an external pre-translated symbol, such that
-// SYM(name) also refers to that symbol.
-#ifndef ADDSYMBOL
- #define ADDSYMBOL(name) extern sym::symbol PRETRANSLATED_SYMBOL_##name
- #define SYM(name) PRETRANSLATED_SYMBOL_##name
-#endif
-
-ADDSYMBOL(history);
-ADDSYMBOL(n);
-ADDSYMBOL(name);
-ADDSYMBOL(prompt);
-ADDSYMBOL(readline);
-ADDSYMBOL(saveline);
-ADDSYMBOL(store);
-ADDSYMBOL(tabcompletion);
-ADDSYMBOL(value);
diff --git a/Build/source/utils/asymptote/runlabel.symbols.h b/Build/source/utils/asymptote/runlabel.symbols.h
deleted file mode 100644
index 2cf93e4df82..00000000000
--- a/Build/source/utils/asymptote/runlabel.symbols.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*****
- * This file is automatically generated by findsym.pl
- * Changes will be overwritten.
- *****/
-
-// If the ADDSYMBOL macro is not already defined, define it with the default
-// purpose of referring to an external pre-translated symbol, such that
-// SYM(name) also refers to that symbol.
-#ifndef ADDSYMBOL
- #define ADDSYMBOL(name) extern sym::symbol PRETRANSLATED_SYMBOL_##name
- #define SYM(name) PRETRANSLATED_SYMBOL_##name
-#endif
-
-ADDSYMBOL(_strokepath);
-ADDSYMBOL(_texpath);
-ADDSYMBOL(align);
-ADDSYMBOL(f);
-ADDSYMBOL(g);
-ADDSYMBOL(label);
-ADDSYMBOL(labels);
-ADDSYMBOL(p);
-ADDSYMBOL(position);
-ADDSYMBOL(s);
-ADDSYMBOL(size);
-ADDSYMBOL(t);
-ADDSYMBOL(texsize);
-ADDSYMBOL(textpath);
diff --git a/Build/source/utils/asymptote/runmath.symbols.h b/Build/source/utils/asymptote/runmath.symbols.h
deleted file mode 100644
index 5ce861b48a4..00000000000
--- a/Build/source/utils/asymptote/runmath.symbols.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*****
- * This file is automatically generated by findsym.pl
- * Changes will be overwritten.
- *****/
-
-// If the ADDSYMBOL macro is not already defined, define it with the default
-// purpose of referring to an external pre-translated symbol, such that
-// SYM(name) also refers to that symbol.
-#ifndef ADDSYMBOL
- #define ADDSYMBOL(name) extern sym::symbol PRETRANSLATED_SYMBOL_##name
- #define SYM(name) PRETRANSLATED_SYMBOL_##name
-#endif
-
-ADDSYMBOL(AND);
-ADDSYMBOL(CLZ);
-ADDSYMBOL(CTZ);
-ADDSYMBOL(Ceil);
-ADDSYMBOL(Floor);
-ADDSYMBOL(Jn);
-ADDSYMBOL(NOT);
-ADDSYMBOL(OR);
-ADDSYMBOL(Round);
-ADDSYMBOL(XOR);
-ADDSYMBOL(Yn);
-ADDSYMBOL(a);
-ADDSYMBOL(abs);
-ADDSYMBOL(atan2);
-ADDSYMBOL(b);
-ADDSYMBOL(bitreverse);
-ADDSYMBOL(bits);
-ADDSYMBOL(c);
-ADDSYMBOL(ceil);
-ADDSYMBOL(choose);
-ADDSYMBOL(cubicroots);
-ADDSYMBOL(d);
-ADDSYMBOL(erf);
-ADDSYMBOL(erfc);
-ADDSYMBOL(factorial);
-ADDSYMBOL(floor);
-ADDSYMBOL(fmod);
-ADDSYMBOL(gamma);
-ADDSYMBOL(hypot);
-ADDSYMBOL(k);
-ADDSYMBOL(n);
-ADDSYMBOL(popcount);
-ADDSYMBOL(quadraticroots);
-ADDSYMBOL(quotient);
-ADDSYMBOL(rand);
-ADDSYMBOL(remainder);
-ADDSYMBOL(round);
-ADDSYMBOL(seed);
-ADDSYMBOL(sgn);
-ADDSYMBOL(srand);
-ADDSYMBOL(unitrand);
-ADDSYMBOL(x);
-ADDSYMBOL(y);
-ADDSYMBOL(z);
diff --git a/Build/source/utils/asymptote/runpair.symbols.h b/Build/source/utils/asymptote/runpair.symbols.h
deleted file mode 100644
index a8a7271075d..00000000000
--- a/Build/source/utils/asymptote/runpair.symbols.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*****
- * This file is automatically generated by findsym.pl
- * Changes will be overwritten.
- *****/
-
-// If the ADDSYMBOL macro is not already defined, define it with the default
-// purpose of referring to an external pre-translated symbol, such that
-// SYM(name) also refers to that symbol.
-#ifndef ADDSYMBOL
- #define ADDSYMBOL(name) extern sym::symbol PRETRANSLATED_SYMBOL_##name
- #define SYM(name) PRETRANSLATED_SYMBOL_##name
-#endif
-
-ADDSYMBOL(Cos);
-ADDSYMBOL(Degrees);
-ADDSYMBOL(Sin);
-ADDSYMBOL(Tan);
-ADDSYMBOL(a);
-ADDSYMBOL(aCos);
-ADDSYMBOL(aSin);
-ADDSYMBOL(aTan);
-ADDSYMBOL(abs);
-ADDSYMBOL(angle);
-ADDSYMBOL(b);
-ADDSYMBOL(bezier);
-ADDSYMBOL(bezierP);
-ADDSYMBOL(bezierPP);
-ADDSYMBOL(bezierPPP);
-ADDSYMBOL(c);
-ADDSYMBOL(conj);
-ADDSYMBOL(cos);
-ADDSYMBOL(cross);
-ADDSYMBOL(d);
-ADDSYMBOL(deg);
-ADDSYMBOL(degrees);
-ADDSYMBOL(dir);
-ADDSYMBOL(dot);
-ADDSYMBOL(exp);
-ADDSYMBOL(expi);
-ADDSYMBOL(gamma);
-ADDSYMBOL(length);
-ADDSYMBOL(log);
-ADDSYMBOL(radians);
-ADDSYMBOL(realmult);
-ADDSYMBOL(sin);
-ADDSYMBOL(sqrt);
-ADDSYMBOL(t);
-ADDSYMBOL(unit);
-ADDSYMBOL(w);
-ADDSYMBOL(warn);
-ADDSYMBOL(x);
-ADDSYMBOL(xpart);
-ADDSYMBOL(ypart);
-ADDSYMBOL(z);
diff --git a/Build/source/utils/asymptote/runpath.symbols.h b/Build/source/utils/asymptote/runpath.symbols.h
deleted file mode 100644
index fcd2a9dc7b7..00000000000
--- a/Build/source/utils/asymptote/runpath.symbols.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*****
- * This file is automatically generated by findsym.pl
- * Changes will be overwritten.
- *****/
-
-// If the ADDSYMBOL macro is not already defined, define it with the default
-// purpose of referring to an external pre-translated symbol, such that
-// SYM(name) also refers to that symbol.
-#ifndef ADDSYMBOL
- #define ADDSYMBOL(name) extern sym::symbol PRETRANSLATED_SYMBOL_##name
- #define SYM(name) PRETRANSLATED_SYMBOL_##name
-#endif
-
-ADDSYMBOL(a);
-ADDSYMBOL(accel);
-ADDSYMBOL(arclength);
-ADDSYMBOL(arctime);
-ADDSYMBOL(atleast);
-ADDSYMBOL(b);
-ADDSYMBOL(c);
-ADDSYMBOL(cyclic);
-ADDSYMBOL(d);
-ADDSYMBOL(dir);
-ADDSYMBOL(dirtime);
-ADDSYMBOL(extension);
-ADDSYMBOL(fillrule);
-ADDSYMBOL(fuzz);
-ADDSYMBOL(g);
-ADDSYMBOL(incircle);
-ADDSYMBOL(inside);
-ADDSYMBOL(intersect);
-ADDSYMBOL(intersections);
-ADDSYMBOL(l);
-ADDSYMBOL(length);
-ADDSYMBOL(m);
-ADDSYMBOL(max);
-ADDSYMBOL(maxAfterTransform);
-ADDSYMBOL(maxtimes);
-ADDSYMBOL(min);
-ADDSYMBOL(minAfterTransform);
-ADDSYMBOL(mintimes);
-ADDSYMBOL(normalize);
-ADDSYMBOL(nurb);
-ADDSYMBOL(orient);
-ADDSYMBOL(p);
-ADDSYMBOL(phi);
-ADDSYMBOL(piecewisestraight);
-ADDSYMBOL(point);
-ADDSYMBOL(postcontrol);
-ADDSYMBOL(precontrol);
-ADDSYMBOL(q);
-ADDSYMBOL(radius);
-ADDSYMBOL(relativedistance);
-ADDSYMBOL(reverse);
-ADDSYMBOL(sign);
-ADDSYMBOL(size);
-ADDSYMBOL(straight);
-ADDSYMBOL(subpath);
-ADDSYMBOL(t);
-ADDSYMBOL(theta);
-ADDSYMBOL(unstraighten);
-ADDSYMBOL(w0);
-ADDSYMBOL(w1);
-ADDSYMBOL(w2);
-ADDSYMBOL(w3);
-ADDSYMBOL(windingnumber);
-ADDSYMBOL(z);
-ADDSYMBOL(z0);
-ADDSYMBOL(z1);
-ADDSYMBOL(z2);
-ADDSYMBOL(z3);
diff --git a/Build/source/utils/asymptote/runpath3d.symbols.h b/Build/source/utils/asymptote/runpath3d.symbols.h
deleted file mode 100644
index 63ada7763e5..00000000000
--- a/Build/source/utils/asymptote/runpath3d.symbols.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*****
- * This file is automatically generated by findsym.pl
- * Changes will be overwritten.
- *****/
-
-// If the ADDSYMBOL macro is not already defined, define it with the default
-// purpose of referring to an external pre-translated symbol, such that
-// SYM(name) also refers to that symbol.
-#ifndef ADDSYMBOL
- #define ADDSYMBOL(name) extern sym::symbol PRETRANSLATED_SYMBOL_##name
- #define SYM(name) PRETRANSLATED_SYMBOL_##name
-#endif
-
-ADDSYMBOL(a);
-ADDSYMBOL(accel);
-ADDSYMBOL(arclength);
-ADDSYMBOL(arctime);
-ADDSYMBOL(b);
-ADDSYMBOL(c);
-ADDSYMBOL(c0);
-ADDSYMBOL(c1);
-ADDSYMBOL(cyclic);
-ADDSYMBOL(d);
-ADDSYMBOL(dir);
-ADDSYMBOL(dval);
-ADDSYMBOL(e);
-ADDSYMBOL(fuzz);
-ADDSYMBOL(g);
-ADDSYMBOL(insphere);
-ADDSYMBOL(intersect);
-ADDSYMBOL(intersections);
-ADDSYMBOL(length);
-ADDSYMBOL(max);
-ADDSYMBOL(maxratio);
-ADDSYMBOL(maxtimes);
-ADDSYMBOL(min);
-ADDSYMBOL(minratio);
-ADDSYMBOL(mintimes);
-ADDSYMBOL(normalize);
-ADDSYMBOL(orient);
-ADDSYMBOL(p);
-ADDSYMBOL(path3);
-ADDSYMBOL(piecewisestraight);
-ADDSYMBOL(point);
-ADDSYMBOL(post);
-ADDSYMBOL(postcontrol);
-ADDSYMBOL(pre);
-ADDSYMBOL(precontrol);
-ADDSYMBOL(q);
-ADDSYMBOL(radius);
-ADDSYMBOL(reverse);
-ADDSYMBOL(sign);
-ADDSYMBOL(size);
-ADDSYMBOL(straight);
-ADDSYMBOL(straightness);
-ADDSYMBOL(subpath);
-ADDSYMBOL(t);
-ADDSYMBOL(unstraighten);
-ADDSYMBOL(z0);
-ADDSYMBOL(z1);
diff --git a/Build/source/utils/asymptote/runpicture.cc b/Build/source/utils/asymptote/runpicture.cc
index 08e12a12788..cbff720c613 100644
--- a/Build/source/utils/asymptote/runpicture.cc
+++ b/Build/source/utils/asymptote/runpicture.cc
@@ -112,6 +112,28 @@ using types::pathArray;
using types::penArray;
using types::penArray2;
+static transform ZeroTransform=transform(0.0,0.0,0.0,0.0,0.0,0.0);
+//static int tag=0;
+
+transform getTransform(xmap_t &xmap, picture::nodelist::iterator p)
+{
+ string s=(*p)->KEY;
+ transform t;
+ // Don't apply xmap without an explicit corresponding key
+ if(s.substr(s.length()-1) != "1") return t;
+
+ xmap_t::iterator q=xmap.find(s.substr(0,s.length()-2));
+ if(q != xmap.end()) {
+ xtransform_t& v=q->second;
+ if(!v.empty()) {
+ t=v.front();
+ v.pop_front();
+ }
+ }
+ return t;
+}
+
+
function *transformFunction()
{
return new function(primTransform());
@@ -143,71 +165,71 @@ triple Zero;
#endif
namespace run {
-#line 104 "runpicture.in"
+#line 126 "runpicture.in"
void newPicture(stack *Stack)
{
-#line 105 "runpicture.in"
+#line 127 "runpicture.in"
{Stack->push<picture*>(new picture()); return;}
}
-#line 109 "runpicture.in"
+#line 131 "runpicture.in"
// bool empty(picture *f);
void gen_runpicture1(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 110 "runpicture.in"
+#line 132 "runpicture.in"
{Stack->push<bool>(f->null()); return;}
}
-#line 114 "runpicture.in"
+#line 136 "runpicture.in"
// void erase(picture *f);
void gen_runpicture2(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 115 "runpicture.in"
+#line 137 "runpicture.in"
f->nodes.clear();
}
-#line 119 "runpicture.in"
+#line 141 "runpicture.in"
// pair min(picture *f);
void gen_runpicture3(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 120 "runpicture.in"
+#line 142 "runpicture.in"
{Stack->push<pair>(f->bounds().Min()); return;}
}
-#line 124 "runpicture.in"
+#line 146 "runpicture.in"
// pair max(picture *f);
void gen_runpicture4(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 125 "runpicture.in"
+#line 147 "runpicture.in"
{Stack->push<pair>(f->bounds().Max()); return;}
}
-#line 129 "runpicture.in"
+#line 151 "runpicture.in"
// pair size(picture *f);
void gen_runpicture5(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 130 "runpicture.in"
+#line 152 "runpicture.in"
bbox b=f->bounds();
{Stack->push<pair>(b.Max()-b.Min()); return;}
}
-#line 135 "runpicture.in"
+#line 157 "runpicture.in"
// void _draw(picture *f, path g, pen p);
void gen_runpicture6(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
path g=vm::pop<path>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 136 "runpicture.in"
+#line 158 "runpicture.in"
f->append(new drawPath(g,p));
}
-#line 140 "runpicture.in"
+#line 162 "runpicture.in"
// void fill(picture *f, patharray *g, pen p=CURRENTPEN, bool copy=true);
void gen_runpicture7(stack *Stack)
{
@@ -215,12 +237,12 @@ void gen_runpicture7(stack *Stack)
pen p=vm::pop<pen>(Stack,CURRENTPEN);
patharray * g=vm::pop<patharray *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 141 "runpicture.in"
- array *(*copyarray)(array *a)=copy ? copyArray: nop;
+#line 163 "runpicture.in"
+ array *(*copyarray)(array *a)=copy ? copyArray : nop;
f->append(new drawFill(*copyarray(g),false,p));
}
-#line 146 "runpicture.in"
+#line 168 "runpicture.in"
// void latticeshade(picture *f, patharray *g, bool stroke=false, pen fillrule=CURRENTPEN, penarray2 *p, transform t=identity, bool copy=true);
void gen_runpicture8(stack *Stack)
{
@@ -231,13 +253,13 @@ void gen_runpicture8(stack *Stack)
bool stroke=vm::pop<bool>(Stack,false);
patharray * g=vm::pop<patharray *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 149 "runpicture.in"
- array *(*copyarray)(array *a)=copy ? copyArray: nop;
+#line 171 "runpicture.in"
+ array *(*copyarray)(array *a)=copy ? copyArray : nop;
f->append(new drawLatticeShade(*copyarray(g),stroke,fillrule,*copyarray(p),
t));
}
-#line 155 "runpicture.in"
+#line 177 "runpicture.in"
// void axialshade(picture *f, patharray *g, bool stroke=false, pen pena, pair a, bool extenda=true, pen penb, pair b, bool extendb=true, bool copy=true);
void gen_runpicture9(stack *Stack)
{
@@ -251,13 +273,13 @@ void gen_runpicture9(stack *Stack)
bool stroke=vm::pop<bool>(Stack,false);
patharray * g=vm::pop<patharray *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 158 "runpicture.in"
- array *(*copyarray)(array *a)=copy ? copyArray: nop;
+#line 180 "runpicture.in"
+ array *(*copyarray)(array *a)=copy ? copyArray : nop;
f->append(new drawAxialShade(*copyarray(g),stroke,pena,a,extenda,penb,b,
extendb));
}
-#line 164 "runpicture.in"
+#line 186 "runpicture.in"
// void radialshade(picture *f, patharray *g, bool stroke=false, pen pena, pair a, real ra, bool extenda=true, pen penb, pair b, real rb, bool extendb=true, bool copy=true);
void gen_runpicture10(stack *Stack)
{
@@ -273,13 +295,13 @@ void gen_runpicture10(stack *Stack)
bool stroke=vm::pop<bool>(Stack,false);
patharray * g=vm::pop<patharray *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 167 "runpicture.in"
- array *(*copyarray)(array *a)=copy ? copyArray: nop;
+#line 189 "runpicture.in"
+ array *(*copyarray)(array *a)=copy ? copyArray : nop;
f->append(new drawRadialShade(*copyarray(g),stroke,pena,a,ra,extenda,
penb,b,rb,extendb));
}
-#line 173 "runpicture.in"
+#line 195 "runpicture.in"
// void gouraudshade(picture *f, patharray *g, bool stroke=false, pen fillrule=CURRENTPEN, penarray *p, pairarray *z, Intarray *edges, bool copy=true);
void gen_runpicture11(stack *Stack)
{
@@ -291,15 +313,15 @@ void gen_runpicture11(stack *Stack)
bool stroke=vm::pop<bool>(Stack,false);
patharray * g=vm::pop<patharray *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 176 "runpicture.in"
- array *(*copyarray)(array *a)=copy ? copyArray: nop;
+#line 198 "runpicture.in"
+ array *(*copyarray)(array *a)=copy ? copyArray : nop;
checkArrays(p,z);
checkArrays(z,edges);
f->append(new drawGouraudShade(*copyarray(g),stroke,fillrule,*copyarray(p),
*copyarray(z),*copyarray(edges)));
}
-#line 184 "runpicture.in"
+#line 206 "runpicture.in"
// void gouraudshade(picture *f, patharray *g, bool stroke=false, pen fillrule=CURRENTPEN, penarray *p, Intarray *edges, bool copy=true);
void gen_runpicture12(stack *Stack)
{
@@ -310,8 +332,8 @@ void gen_runpicture12(stack *Stack)
bool stroke=vm::pop<bool>(Stack,false);
patharray * g=vm::pop<patharray *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 187 "runpicture.in"
- array *(*copyarray)(array *a)=copy ? copyArray: nop;
+#line 209 "runpicture.in"
+ array *(*copyarray)(array *a)=copy ? copyArray : nop;
size_t n=checkArrays(p,edges);
size_t m=checkArray(g);
array *z=new array(n);
@@ -331,7 +353,7 @@ void gen_runpicture12(stack *Stack)
*z,*copyarray(edges)));
}
-#line 208 "runpicture.in"
+#line 230 "runpicture.in"
// void tensorshade(picture *f, patharray *g, bool stroke=false, pen fillrule=CURRENTPEN, penarray2 *p, patharray *b=NULL, pairarray2 *z=emptyarray, bool copy=true);
void gen_runpicture13(stack *Stack)
{
@@ -343,9 +365,9 @@ void gen_runpicture13(stack *Stack)
bool stroke=vm::pop<bool>(Stack,false);
patharray * g=vm::pop<patharray *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 211 "runpicture.in"
- array *(*copyarray)(array *a)=copy ? copyArray: nop;
- array *(*copyarray2)(array *a)=copy ? copyArray2: nop;
+#line 233 "runpicture.in"
+ array *(*copyarray)(array *a)=copy ? copyArray : nop;
+ array *(*copyarray2)(array *a)=copy ? copyArray2 : nop;
if(b == NULL) b=g;
size_t n=checkArrays(p,b);
size_t nz=checkArray(z);
@@ -355,7 +377,7 @@ void gen_runpicture13(stack *Stack)
*copyarray(b),*copyarray2(z)));
}
-#line 223 "runpicture.in"
+#line 245 "runpicture.in"
// void functionshade(picture *f, patharray *g, bool stroke=false, pen fillrule=CURRENTPEN, string shader=emptystring, bool copy=true);
void gen_runpicture14(stack *Stack)
{
@@ -365,14 +387,14 @@ void gen_runpicture14(stack *Stack)
bool stroke=vm::pop<bool>(Stack,false);
patharray * g=vm::pop<patharray *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 226 "runpicture.in"
- array *(*copyarray)(array *a)=copy ? copyArray: nop;
+#line 248 "runpicture.in"
+ array *(*copyarray)(array *a)=copy ? copyArray : nop;
f->append(new drawFunctionShade(*copyarray(g),stroke,fillrule,shader));
}
// Clip a picture to a superpath using the given fill rule.
// Subsequent additions to the picture will not be affected by the clipping.
-#line 233 "runpicture.in"
+#line 255 "runpicture.in"
// void clip(picture *f, patharray *g, bool stroke=false, pen fillrule=CURRENTPEN, bool copy=true);
void gen_runpicture15(stack *Stack)
{
@@ -381,13 +403,13 @@ void gen_runpicture15(stack *Stack)
bool stroke=vm::pop<bool>(Stack,false);
patharray * g=vm::pop<patharray *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 235 "runpicture.in"
- array *(*copyarray)(array *a)=copy ? copyArray: nop;
+#line 257 "runpicture.in"
+ array *(*copyarray)(array *a)=copy ? copyArray : nop;
drawClipBegin *begin=new drawClipBegin(*copyarray(g),stroke,fillrule,true);
f->enclose(begin,new drawClipEnd(true,begin));
}
-#line 241 "runpicture.in"
+#line 263 "runpicture.in"
// void beginclip(picture *f, patharray *g, bool stroke=false, pen fillrule=CURRENTPEN, bool copy=true);
void gen_runpicture16(stack *Stack)
{
@@ -396,57 +418,57 @@ void gen_runpicture16(stack *Stack)
bool stroke=vm::pop<bool>(Stack,false);
patharray * g=vm::pop<patharray *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 243 "runpicture.in"
- array *(*copyarray)(array *a)=copy ? copyArray: nop;
+#line 265 "runpicture.in"
+ array *(*copyarray)(array *a)=copy ? copyArray : nop;
f->append(new drawClipBegin(*copyarray(g),stroke,fillrule,false));
}
-#line 248 "runpicture.in"
+#line 270 "runpicture.in"
// void endclip(picture *f);
void gen_runpicture17(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 249 "runpicture.in"
+#line 271 "runpicture.in"
f->append(new drawClipEnd(false));
}
-#line 253 "runpicture.in"
+#line 275 "runpicture.in"
// void gsave(picture *f);
void gen_runpicture18(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 254 "runpicture.in"
+#line 276 "runpicture.in"
f->append(new drawGsave());
}
-#line 258 "runpicture.in"
+#line 280 "runpicture.in"
// void grestore(picture *f);
void gen_runpicture19(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 259 "runpicture.in"
+#line 281 "runpicture.in"
f->append(new drawGrestore());
}
-#line 263 "runpicture.in"
+#line 285 "runpicture.in"
// void begingroup(picture *f);
void gen_runpicture20(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 264 "runpicture.in"
+#line 286 "runpicture.in"
f->append(new drawBegin());
}
-#line 268 "runpicture.in"
+#line 290 "runpicture.in"
// void endgroup(picture *f);
void gen_runpicture21(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 269 "runpicture.in"
+#line 291 "runpicture.in"
f->append(new drawEnd());
}
-#line 273 "runpicture.in"
+#line 295 "runpicture.in"
// void _begingroup3(picture *f, string name, real compression, real granularity, bool closed, bool tessellate, bool dobreak, bool nobreak, triple center, Int interaction);
void gen_runpicture22(stack *Stack)
{
@@ -460,62 +482,62 @@ void gen_runpicture22(stack *Stack)
real compression=vm::pop<real>(Stack);
string name=vm::pop<string>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 276 "runpicture.in"
+#line 298 "runpicture.in"
f->append(new drawBegin3(name,compression,granularity,
closed,tessellate,dobreak,nobreak,
center,(Interaction) intcast(interaction)));
}
-#line 282 "runpicture.in"
+#line 304 "runpicture.in"
// void endgroup3(picture *f);
void gen_runpicture23(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 283 "runpicture.in"
+#line 305 "runpicture.in"
f->append(new drawEnd3());
}
-#line 287 "runpicture.in"
+#line 309 "runpicture.in"
// void add(picture *dest, picture *src);
void gen_runpicture24(stack *Stack)
{
picture * src=vm::pop<picture *>(Stack);
picture * dest=vm::pop<picture *>(Stack);
-#line 288 "runpicture.in"
+#line 310 "runpicture.in"
dest->add(*src);
}
-#line 292 "runpicture.in"
+#line 314 "runpicture.in"
// void prepend(picture *dest, picture *src);
void gen_runpicture25(stack *Stack)
{
picture * src=vm::pop<picture *>(Stack);
picture * dest=vm::pop<picture *>(Stack);
-#line 293 "runpicture.in"
+#line 315 "runpicture.in"
dest->prepend(*src);
}
-#line 297 "runpicture.in"
+#line 319 "runpicture.in"
// void postscript(picture *f, string s);
void gen_runpicture26(stack *Stack)
{
string s=vm::pop<string>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 298 "runpicture.in"
+#line 320 "runpicture.in"
f->append(new drawVerbatim(PostScript,s));
}
-#line 302 "runpicture.in"
+#line 324 "runpicture.in"
// void tex(picture *f, string s);
void gen_runpicture27(stack *Stack)
{
string s=vm::pop<string>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 303 "runpicture.in"
+#line 325 "runpicture.in"
f->append(new drawVerbatim(TeX,s));
}
-#line 307 "runpicture.in"
+#line 329 "runpicture.in"
// void postscript(picture *f, string s, pair min, pair max);
void gen_runpicture28(stack *Stack)
{
@@ -523,11 +545,11 @@ void gen_runpicture28(stack *Stack)
pair min=vm::pop<pair>(Stack);
string s=vm::pop<string>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 308 "runpicture.in"
+#line 330 "runpicture.in"
f->append(new drawVerbatim(PostScript,s,min,max));
}
-#line 312 "runpicture.in"
+#line 334 "runpicture.in"
// void tex(picture *f, string s, pair min, pair max);
void gen_runpicture29(stack *Stack)
{
@@ -535,33 +557,33 @@ void gen_runpicture29(stack *Stack)
pair min=vm::pop<pair>(Stack);
string s=vm::pop<string>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 313 "runpicture.in"
+#line 335 "runpicture.in"
f->append(new drawVerbatim(TeX,s,min,max));
}
-#line 317 "runpicture.in"
+#line 339 "runpicture.in"
// void texpreamble(string s);
void gen_runpicture30(stack *Stack)
{
string s=vm::pop<string>(Stack);
-#line 318 "runpicture.in"
+#line 340 "runpicture.in"
string t=s+"\n";
processDataStruct &pd=processData();
pd.TeXpipepreamble.push_back(t);
pd.TeXpreamble.push_back(t);
}
-#line 325 "runpicture.in"
+#line 347 "runpicture.in"
// void deletepreamble();
void gen_runpicture31(stack *)
{
-#line 326 "runpicture.in"
+#line 348 "runpicture.in"
if(getSetting<bool>("inlinetex")) {
unlink(buildname(outname(),"pre").c_str());
}
}
-#line 332 "runpicture.in"
+#line 354 "runpicture.in"
// void _labelpath(picture *f, string s, string size, path g, string justify, pair offset, pen p);
void gen_runpicture32(stack *Stack)
{
@@ -572,40 +594,40 @@ void gen_runpicture32(stack *Stack)
string size=vm::pop<string>(Stack);
string s=vm::pop<string>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 334 "runpicture.in"
+#line 356 "runpicture.in"
f->append(new drawLabelPath(s,size,g,justify,offset,p));
}
-#line 338 "runpicture.in"
+#line 360 "runpicture.in"
// void texreset();
void gen_runpicture33(stack *)
{
-#line 339 "runpicture.in"
+#line 361 "runpicture.in"
processDataStruct &pd=processData();
pd.TeXpipepreamble.clear();
pd.TeXpreamble.clear();
pd.tex.pipeclose();
}
-#line 346 "runpicture.in"
+#line 368 "runpicture.in"
// void layer(picture *f);
void gen_runpicture34(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 347 "runpicture.in"
+#line 369 "runpicture.in"
f->append(new drawLayer());
}
-#line 351 "runpicture.in"
+#line 373 "runpicture.in"
// void newpage(picture *f);
void gen_runpicture35(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 352 "runpicture.in"
+#line 374 "runpicture.in"
f->append(new drawNewPage());
}
-#line 356 "runpicture.in"
+#line 378 "runpicture.in"
// void _image(picture *f, realarray2 *data, pair initial, pair final, penarray *palette=NULL, transform t=identity, bool copy=true, bool antialias=false);
void gen_runpicture36(stack *Stack)
{
@@ -617,14 +639,14 @@ void gen_runpicture36(stack *Stack)
pair initial=vm::pop<pair>(Stack);
realarray2 * data=vm::pop<realarray2 *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 359 "runpicture.in"
- array *(*copyarray)(array *a)=copy ? copyArray: nop;
- array *(*copyarray2)(array *a)=copy ? copyArray2: nop;
+#line 381 "runpicture.in"
+ array *(*copyarray)(array *a)=copy ? copyArray : nop;
+ array *(*copyarray2)(array *a)=copy ? copyArray2 : nop;
f->append(new drawPaletteImage(*copyarray2(data),*copyarray(palette),
t*matrix(initial,final),antialias));
}
-#line 366 "runpicture.in"
+#line 388 "runpicture.in"
// void _image(picture *f, penarray2 *data, pair initial, pair final, transform t=identity, bool copy=true, bool antialias=false);
void gen_runpicture37(stack *Stack)
{
@@ -635,13 +657,13 @@ void gen_runpicture37(stack *Stack)
pair initial=vm::pop<pair>(Stack);
penarray2 * data=vm::pop<penarray2 *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 368 "runpicture.in"
- array *(*copyarray2)(array *a)=copy ? copyArray2: nop;
+#line 390 "runpicture.in"
+ array *(*copyarray2)(array *a)=copy ? copyArray2 : nop;
f->append(new drawNoPaletteImage(*copyarray2(data),t*matrix(initial,final),
antialias));
}
-#line 374 "runpicture.in"
+#line 396 "runpicture.in"
// void _image(picture *f, callablePen *F, Int width, Int height, pair initial, pair final, transform t=identity, bool antialias=false);
void gen_runpicture38(stack *Stack)
{
@@ -653,63 +675,60 @@ void gen_runpicture38(stack *Stack)
Int width=vm::pop<Int>(Stack);
callablePen * F=vm::pop<callablePen *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 376 "runpicture.in"
+#line 398 "runpicture.in"
f->append(new drawFunctionImage(Stack,F,width,height,
t*matrix(initial,final),antialias));
}
-#line 381 "runpicture.in"
+#line 403 "runpicture.in"
// string nativeformat();
void gen_runpicture39(stack *Stack)
{
-#line 382 "runpicture.in"
+#line 404 "runpicture.in"
{Stack->push<string>(nativeformat()); return;}
}
-#line 386 "runpicture.in"
+#line 408 "runpicture.in"
// bool latex();
void gen_runpicture40(stack *Stack)
{
-#line 387 "runpicture.in"
+#line 409 "runpicture.in"
{Stack->push<bool>(latex(getSetting<string>("tex"))); return;}
}
-#line 391 "runpicture.in"
+#line 413 "runpicture.in"
// bool pdf();
void gen_runpicture41(stack *Stack)
{
-#line 392 "runpicture.in"
+#line 414 "runpicture.in"
{Stack->push<bool>(pdf(getSetting<string>("tex"))); return;}
}
-#line 396 "runpicture.in"
-// void shipout(string prefix=emptystring, picture *f, picture *preamble=NULL, string format=emptystring, bool wait=false, bool view=true, callableTransform *xform);
+#line 418 "runpicture.in"
+// void _shipout(string prefix=emptystring, picture *f, picture *preamble=NULL, string format=emptystring, bool wait=false, bool view=true, transform T=identity);
void gen_runpicture42(stack *Stack)
{
- callableTransform * xform=vm::pop<callableTransform *>(Stack);
+ transform T=vm::pop<transform>(Stack,identity);
bool view=vm::pop<bool>(Stack,true);
bool wait=vm::pop<bool>(Stack,false);
string format=vm::pop<string>(Stack,emptystring);
picture * preamble=vm::pop<picture *>(Stack,NULL);
picture * f=vm::pop<picture *>(Stack);
string prefix=vm::pop<string>(Stack,emptystring);
-#line 399 "runpicture.in"
+#line 421 "runpicture.in"
if(prefix.empty()) prefix=outname();
picture *result=new picture;
unsigned level=0;
picture::nodelist::iterator p;
-
- // If null is given as an xform, just use the identity transformation.
- bool xformIsNull = xform == nullfunc::instance();
+
+ xmap_t xmap=processData().xmap;
+ transform Tinv=inverse(T);
for(p = f->nodes.begin(); p != f->nodes.end(); ++p) {
- if (!xformIsNull)
- xform->call(Stack);
- transform t=xformIsNull ? camp::identity : pop<transform>(Stack);
-
- static transform Zero=transform(0.0,0.0,0.0,0.0,0.0,0.0);
- bool Delete=(t == Zero);
+ transform t=getTransform(xmap,p);
+ bool Delete=(t == ZeroTransform);
+ if(!Delete && !t.isIdentity()) t=T*t*Tinv;
picture *group=new picture;
assert(*p);
if((*p)->endgroup()) error(nobegin);
@@ -739,10 +758,10 @@ void gen_runpicture42(stack *Stack)
}
}
- result->shipout(preamble,prefix,format,0.0,wait,view);
+ result->shipout(preamble,prefix,format,wait,view);
}
-#line 448 "runpicture.in"
+#line 467 "runpicture.in"
// void shipout3(string prefix, picture *f, string format=emptystring, real width, real height, real angle, real zoom, triple m, triple M, pair shift, realarray2 *t, realarray *background, triplearray *lights, realarray2 *diffuse, realarray2 *ambient, realarray2 *specular, bool viewportlighting, bool view=true);
void gen_runpicture43(stack *Stack)
{
@@ -764,7 +783,7 @@ void gen_runpicture43(stack *Stack)
string format=vm::pop<string>(Stack,emptystring);
picture * f=vm::pop<picture *>(Stack);
string prefix=vm::pop<string>(Stack);
-#line 454 "runpicture.in"
+#line 473 "runpicture.in"
size_t n=checkArrays(lights,diffuse);
checkEqual(n,checkArray(ambient));
checkEqual(n,checkArray(specular));
@@ -786,188 +805,154 @@ void gen_runpicture43(stack *Stack)
delete[] T;
}
-#line 476 "runpicture.in"
+#line 495 "runpicture.in"
// void shipout3(string prefix, picture *f);
void gen_runpicture44(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
string prefix=vm::pop<string>(Stack);
-#line 477 "runpicture.in"
+#line 496 "runpicture.in"
f->shipout3(prefix);
}
-#line 481 "runpicture.in"
-// void deconstruct(picture *f, picture *preamble=NULL, real magnification=1, callableTransform *xform);
+#line 500 "runpicture.in"
+// void xmap(string key, transform t=identity);
void gen_runpicture45(stack *Stack)
{
- callableTransform * xform=vm::pop<callableTransform *>(Stack);
- real magnification=vm::pop<real>(Stack,1);
+ transform t=vm::pop<transform>(Stack,identity);
+ string key=vm::pop<string>(Stack);
+#line 501 "runpicture.in"
+ xmap_t &xmap=processData().xmap;
+ xmap_t::iterator p=xmap.find(key);
+ if(p != xmap.end())
+ p->second.push_back(t);
+ else {
+ xtransform_t *v=new xtransform_t();
+ v->push_back(t);
+ xmap[key]=*v;
+ }
+}
+
+#line 513 "runpicture.in"
+// void deconstruct(picture *f, picture *preamble=NULL, transform T=identity);
+void gen_runpicture46(stack *Stack)
+{
+ transform T=vm::pop<transform>(Stack,identity);
picture * preamble=vm::pop<picture *>(Stack,NULL);
picture * f=vm::pop<picture *>(Stack);
-#line 483 "runpicture.in"
+#line 514 "runpicture.in"
unsigned level=0;
- unsigned n=0;
string prefix=outname();
- const string xformat="png";
+ const string xformat="svg";
- static long arg_max=sysconf(_SC_ARG_MAX);
- const unsigned maxargs=::min(arg_max/(prefix.size()+xformat.size()+25ul),
- 256ul);
openpipeout();
- fprintf(pipeout,"%d\n",maxargs);
- fflush(pipeout);
-
- string preformat=nativeformat();
const string Done="Done";
const string Error="Error";
- mem::vector<string> cmd;
-
- // Enforce ghostscript limitations.
- magnification=::max(magnification,0.0001);
- real res=::min(::max(magnification*72.0,2.0),8192.0);
-
- const char *converter=NULL, *hint=NULL;
-
- if(magnification > 0.0) {
- mem::list<string> nameStack;
- string outname;
- unsigned arg=0;
- unsigned batch=0;
- for(picture::nodelist::iterator p=f->nodes.begin();;) {
- if(p == f->nodes.end()) break;
- if(arg == 0) {
- cmd.clear();
- ostringstream buf;
- buf << batch << "_";
- outname=buildname(prefix+buf.str()+"%d",xformat,"");
- converter="gs";
- hint="Ghostscript";
- cmd.push_back(getSetting<string>(converter));
- cmd.push_back("-q");
- cmd.push_back("-dNOPAUSE");
- cmd.push_back("-dBATCH");
- cmd.push_back("-P");
- cmd.push_back("-sDEVICE=pngalpha");
- cmd.push_back("-dEPSCrop");
- if(safe)
- cmd.push_back("-dSAFER");
- cmd.push_back("-r"+String(res)+"x"+String(res));
- cmd.push_back("-sOutputFile="+outname);
- }
-
- picture *group=new picture;
- xform->call(Stack);
- transform t=pop<transform>(Stack);
- assert(*p);
- if((*p)->endgroup()) {
- fprintf(pipeout,"%s\n",Error.c_str());
- fflush(pipeout);
- error(nobegin);
- }
- if((*p)->begingroup()) {
- ++level;
- while(p != f->nodes.end() && level) {
+ unsigned arg=0;
+ xmap_t xmap=processData().xmap;
+ transform Tinv=inverse(T);
+
+ for(picture::nodelist::iterator p=f->nodes.begin();;) {
+ if(p == f->nodes.end()) break;
+
+ picture *group=new picture;
+ transform t=getTransform(xmap,p);
+ bool Delete=(t == ZeroTransform);
+ if(!Delete && !t.isIdentity()) t=T*t*Tinv;
+
+ assert(*p);
+ if((*p)->endgroup()) {
+ fprintf(pipeout,"%s\n",Error.c_str());
+ fflush(pipeout);
+ error(nobegin);
+ }
+ bool clip=false;
+ if((*p)->begingroup()) {
+ ++level;
+ while(p != f->nodes.end() && level) {
+ if(!Delete) {
drawElement *e=t.isIdentity() ? *p : (*p)->transformed(t);
group->append(e);
- ++p;
- if(p == f->nodes.end()) break;
- assert(*p);
- if((*p)->begingroup()) ++level;
- if((*p)->endgroup()) {
- if(level) --level;
- else {
- fprintf(pipeout,"%s\n",Error.c_str());
- fflush(pipeout);
- error(nobegin);
- }
+ if((*p)->endclip()) clip=true;
+ }
+ ++p;
+ if(p == f->nodes.end()) break;
+ assert(*p);
+ if((*p)->begingroup()) ++level;
+ if((*p)->endgroup()) {
+ if(level) --level;
+ else {
+ fprintf(pipeout,"%s\n",Error.c_str());
+ fflush(pipeout);
+ error(nobegin);
}
}
}
- if(p != f->nodes.end()) {
- assert(*p);
+ }
+ if(p != f->nodes.end()) {
+ if(!Delete) {
drawElement *e=t.isIdentity() ? *p : (*p)->transformed(t);
group->append(e);
- bbox b;
+ if((*p)->endclip()) clip=true;
ostringstream buf;
- buf << prefix << "_" << n;
- group->shipout(preamble,buf.str(),preformat,magnification,false,false);
- string Preformat=group->Transparency() ? "pdf" : preformat;
- string name=buildname(buf.str(),Preformat);
- nameStack.push_back(name);
- cmd.push_back(name);
- b=group->bounds();
- b *= magnification;
+ buf << prefix << "_" << arg;
+ string outname=buildname(buf.str(),xformat);
+ group->shipout(preamble,outname,xformat,false,false);
+ bbox b=group->bounds();
+ if(!b.empty) {
+ fprintf(pipeout,"KEY=%s%d\n",e->KEY.c_str(),clip);
- const char *oldlocale=setlocale(LC_NUMERIC,NULL);
- bool override=oldlocale && strcmp(oldlocale,"C") != 0;
- if(override) {
- oldlocale=StrdupNoGC(oldlocale);
- setlocale(LC_NUMERIC,"C");
- }
+ const char *oldlocale=setlocale(LC_NUMERIC,NULL);
+ bool override=oldlocale && strcmp(oldlocale,"C") != 0;
+ if(override) {
+ oldlocale=StrdupNoGC(oldlocale);
+ setlocale(LC_NUMERIC,"C");
+ }
- fprintf(pipeout,"%g %g %g %g\n",b.left,b.right,b.bottom,b.top);
+ fprintf(pipeout,"%g %g %g %g\n",b.left,b.bottom,b.right,b.top);
- if(override) {
- setlocale(LC_NUMERIC,oldlocale);
- delete[] oldlocale;
- }
+ if(override) {
+ setlocale(LC_NUMERIC,oldlocale);
+ delete[] oldlocale;
+ }
- fflush(pipeout);
- ++n;
- ++p;
- ++arg;
- }
-
- if(p == f->nodes.end() || arg >= maxargs) {
- arg=0;
- ++batch;
- fflush(pipeout);
-
- int status=System(cmd,0,true,converter,hint);
- if(status) {
- fprintf(pipeout,"%s\n",Error.c_str());
fflush(pipeout);
- error("deconstruct failed");
+ ++arg;
}
}
+ ++p;
}
-
- if(!getSetting<bool>("keep")) {
- for(mem::list<string>::iterator p=nameStack.begin();
- p != nameStack.end(); ++p)
- unlink(p->c_str());
- }
-
- fprintf(pipeout,"%s\n",Done.c_str());
- fflush(pipeout);
}
+
+ fprintf(pipeout,"%s\n",Done.c_str());
+ fflush(pipeout);
}
// Three-dimensional picture and surface operations
// Bezier curve
-#line 629 "runpicture.in"
+#line 609 "runpicture.in"
// void _draw(picture *f, path3 g, triple center=Zero, pen p, Int interaction=0);
-void gen_runpicture46(stack *Stack)
+void gen_runpicture47(stack *Stack)
{
Int interaction=vm::pop<Int>(Stack,0);
pen p=vm::pop<pen>(Stack);
triple center=vm::pop<triple>(Stack,Zero);
path3 g=vm::pop<path3>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 630 "runpicture.in"
+#line 610 "runpicture.in"
if(g.size() > 0)
f->append(new drawPath3(g,center,p,(Interaction) intcast(interaction)));
}
// Bezier patch
-#line 636 "runpicture.in"
+#line 616 "runpicture.in"
// void draw(picture *f, triplearray2 *P, triple center, bool straight, penarray *p, real opacity, real shininess, real PRCshininess, penarray *colors, Int interaction, bool prc=true);
-void gen_runpicture47(stack *Stack)
+void gen_runpicture48(stack *Stack)
{
bool prc=vm::pop<bool>(Stack,true);
Int interaction=vm::pop<Int>(Stack);
@@ -980,16 +965,16 @@ void gen_runpicture47(stack *Stack)
triple center=vm::pop<triple>(Stack);
triplearray2 * P=vm::pop<triplearray2 *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 639 "runpicture.in"
+#line 619 "runpicture.in"
f->append(new drawBezierPatch(*P,center,straight,*p,opacity,shininess,
PRCshininess,*colors,
(Interaction) intcast(interaction),prc));
}
// Bezier triangle
-#line 646 "runpicture.in"
+#line 626 "runpicture.in"
// void drawbeziertriangle(picture *f, triplearray2 *P, triple center, bool straight, penarray *p, real opacity, real shininess, real PRCshininess, penarray *colors, Int interaction, bool prc=true);
-void gen_runpicture48(stack *Stack)
+void gen_runpicture49(stack *Stack)
{
bool prc=vm::pop<bool>(Stack,true);
Int interaction=vm::pop<Int>(Stack);
@@ -1002,30 +987,30 @@ void gen_runpicture48(stack *Stack)
triple center=vm::pop<triple>(Stack);
triplearray2 * P=vm::pop<triplearray2 *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 650 "runpicture.in"
+#line 630 "runpicture.in"
f->append(new drawBezierTriangle(*P,center,straight,*p,opacity,shininess,
PRCshininess,*colors,
(Interaction) intcast(interaction),prc));
}
// General NURBS curve
-#line 657 "runpicture.in"
+#line 637 "runpicture.in"
// void draw(picture *f, triplearray *P, realarray *knot, realarray *weights=emptyarray, pen p);
-void gen_runpicture49(stack *Stack)
+void gen_runpicture50(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
realarray * weights=vm::pop<realarray *>(Stack,emptyarray);
realarray * knot=vm::pop<realarray *>(Stack);
triplearray * P=vm::pop<triplearray *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 659 "runpicture.in"
+#line 639 "runpicture.in"
f->append(new drawNurbsPath3(*P,knot,weights,p));
}
// General NURBS surface
-#line 664 "runpicture.in"
+#line 644 "runpicture.in"
// void draw(picture *f, triplearray2 *P, realarray *uknot, realarray *vknot, realarray2 *weights=emptyarray, penarray *p, real opacity, real shininess, real PRCshininess, penarray *colors);
-void gen_runpicture50(stack *Stack)
+void gen_runpicture51(stack *Stack)
{
penarray * colors=vm::pop<penarray *>(Stack);
real PRCshininess=vm::pop<real>(Stack);
@@ -1037,15 +1022,15 @@ void gen_runpicture50(stack *Stack)
realarray * uknot=vm::pop<realarray *>(Stack);
triplearray2 * P=vm::pop<triplearray2 *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 667 "runpicture.in"
+#line 647 "runpicture.in"
f->append(new drawNurbs(*P,uknot,vknot,weights,*p,opacity,shininess,
PRCshininess,*colors));
}
// PRC unit sphere
-#line 673 "runpicture.in"
+#line 653 "runpicture.in"
// void drawPRCsphere(picture *f, realarray2 *t, bool half=false, penarray *p, real opacity, real shininess, Int type);
-void gen_runpicture51(stack *Stack)
+void gen_runpicture52(stack *Stack)
{
Int type=vm::pop<Int>(Stack);
real shininess=vm::pop<real>(Stack);
@@ -1054,42 +1039,42 @@ void gen_runpicture51(stack *Stack)
bool half=vm::pop<bool>(Stack,false);
realarray2 * t=vm::pop<realarray2 *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 675 "runpicture.in"
+#line 655 "runpicture.in"
f->append(new drawSphere(*t,half,*p,opacity,shininess,intcast(type)));
}
// PRC unit cylinder
-#line 680 "runpicture.in"
+#line 660 "runpicture.in"
// void drawPRCcylinder(picture *f, realarray2 *t, penarray *p, real opacity, real shininess);
-void gen_runpicture52(stack *Stack)
+void gen_runpicture53(stack *Stack)
{
real shininess=vm::pop<real>(Stack);
real opacity=vm::pop<real>(Stack);
penarray * p=vm::pop<penarray *>(Stack);
realarray2 * t=vm::pop<realarray2 *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 682 "runpicture.in"
+#line 662 "runpicture.in"
f->append(new drawCylinder(*t,*p,opacity,shininess));
}
// PRC unit disk
-#line 687 "runpicture.in"
+#line 667 "runpicture.in"
// void drawPRCdisk(picture *f, realarray2 *t, penarray *p, real opacity, real shininess);
-void gen_runpicture53(stack *Stack)
+void gen_runpicture54(stack *Stack)
{
real shininess=vm::pop<real>(Stack);
real opacity=vm::pop<real>(Stack);
penarray * p=vm::pop<penarray *>(Stack);
realarray2 * t=vm::pop<realarray2 *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 689 "runpicture.in"
+#line 669 "runpicture.in"
f->append(new drawDisk(*t,*p,opacity,shininess));
}
// General PRC tube
-#line 694 "runpicture.in"
+#line 674 "runpicture.in"
// void drawPRCtube(picture *f, path3 center, path3 g, penarray *p, real opacity, real shininess);
-void gen_runpicture54(stack *Stack)
+void gen_runpicture55(stack *Stack)
{
real shininess=vm::pop<real>(Stack);
real opacity=vm::pop<real>(Stack);
@@ -1097,27 +1082,27 @@ void gen_runpicture54(stack *Stack)
path3 g=vm::pop<path3>(Stack);
path3 center=vm::pop<path3>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 696 "runpicture.in"
+#line 676 "runpicture.in"
f->append(new drawTube(center,g,*p,opacity,shininess));
}
// Draw pixel
-#line 701 "runpicture.in"
+#line 681 "runpicture.in"
// void drawpixel(picture *f, triple v, pen p, real width=1.0);
-void gen_runpicture55(stack *Stack)
+void gen_runpicture56(stack *Stack)
{
real width=vm::pop<real>(Stack,1.0);
pen p=vm::pop<pen>(Stack);
triple v=vm::pop<triple>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 702 "runpicture.in"
+#line 682 "runpicture.in"
f->append(new drawPixel(v,p,width));
}
// Draw triangles
-#line 707 "runpicture.in"
+#line 687 "runpicture.in"
// void draw(picture *f, triplearray *v, Intarray2 *vi, triplearray *n, Intarray2 *ni, penarray *p, real opacity, real shininess, real PRCshininess, penarray *c=emptyarray, Intarray2 *ci=emptyarray);
-void gen_runpicture56(stack *Stack)
+void gen_runpicture57(stack *Stack)
{
Intarray2 * ci=vm::pop<Intarray2 *>(Stack,emptyarray);
penarray * c=vm::pop<penarray *>(Stack,emptyarray);
@@ -1130,63 +1115,63 @@ void gen_runpicture56(stack *Stack)
Intarray2 * vi=vm::pop<Intarray2 *>(Stack);
triplearray * v=vm::pop<triplearray *>(Stack);
picture * f=vm::pop<picture *>(Stack);
-#line 711 "runpicture.in"
+#line 691 "runpicture.in"
f->append(new drawTriangles(*v,*vi,*n,*ni,*p,opacity,shininess,PRCshininess,
*c,*ci));
}
-#line 716 "runpicture.in"
+#line 696 "runpicture.in"
// triple min3(picture *f);
-void gen_runpicture57(stack *Stack)
+void gen_runpicture58(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 717 "runpicture.in"
+#line 697 "runpicture.in"
{Stack->push<triple>(f->bounds3().Min()); return;}
}
-#line 721 "runpicture.in"
+#line 701 "runpicture.in"
// triple max3(picture *f);
-void gen_runpicture58(stack *Stack)
+void gen_runpicture59(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 722 "runpicture.in"
+#line 702 "runpicture.in"
{Stack->push<triple>(f->bounds3().Max()); return;}
}
-#line 726 "runpicture.in"
+#line 706 "runpicture.in"
// triple size3(picture *f);
-void gen_runpicture59(stack *Stack)
+void gen_runpicture60(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 727 "runpicture.in"
+#line 707 "runpicture.in"
bbox3 b=f->bounds3();
{Stack->push<triple>(b.Max()-b.Min()); return;}
}
-#line 732 "runpicture.in"
+#line 712 "runpicture.in"
// pair minratio(picture *f);
-void gen_runpicture60(stack *Stack)
+void gen_runpicture61(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 733 "runpicture.in"
+#line 713 "runpicture.in"
{Stack->push<pair>(f->ratio(::min)); return;}
}
-#line 737 "runpicture.in"
+#line 717 "runpicture.in"
// pair maxratio(picture *f);
-void gen_runpicture61(stack *Stack)
+void gen_runpicture62(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 738 "runpicture.in"
+#line 718 "runpicture.in"
{Stack->push<pair>(f->ratio(::max)); return;}
}
-#line 742 "runpicture.in"
+#line 722 "runpicture.in"
// bool is3D(picture *f);
-void gen_runpicture62(stack *Stack)
+void gen_runpicture63(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
-#line 743 "runpicture.in"
+#line 723 "runpicture.in"
{Stack->push<bool>(f->have3D()); return;}
}
@@ -1196,132 +1181,134 @@ namespace trans {
void gen_runpicture_venv(venv &ve)
{
-#line 104 "runpicture.in"
+#line 126 "runpicture.in"
REGISTER_BLTIN(run::newPicture,"newPicture");
-#line 109 "runpicture.in"
+#line 131 "runpicture.in"
addFunc(ve, run::gen_runpicture1, primBoolean(), SYM(empty), formal(primPicture(), SYM(f), false, false));
-#line 114 "runpicture.in"
+#line 136 "runpicture.in"
addFunc(ve, run::gen_runpicture2, primVoid(), SYM(erase), formal(primPicture(), SYM(f), false, false));
-#line 119 "runpicture.in"
+#line 141 "runpicture.in"
addFunc(ve, run::gen_runpicture3, primPair(), SYM(min), formal(primPicture(), SYM(f), false, false));
-#line 124 "runpicture.in"
+#line 146 "runpicture.in"
addFunc(ve, run::gen_runpicture4, primPair(), SYM(max), formal(primPicture(), SYM(f), false, false));
-#line 129 "runpicture.in"
+#line 151 "runpicture.in"
addFunc(ve, run::gen_runpicture5, primPair(), SYM(size), formal(primPicture(), SYM(f), false, false));
-#line 135 "runpicture.in"
+#line 157 "runpicture.in"
addFunc(ve, run::gen_runpicture6, primVoid(), SYM(_draw), formal(primPicture(), SYM(f), false, false), formal(primPath(), SYM(g), false, false), formal(primPen(), SYM(p), false, false));
-#line 140 "runpicture.in"
+#line 162 "runpicture.in"
addFunc(ve, run::gen_runpicture7, primVoid(), SYM(fill), formal(primPicture(), SYM(f), false, false), formal(pathArray() , SYM(g), false, false), formal(primPen(), SYM(p), true, false), formal(primBoolean(), SYM(copy), true, false));
-#line 146 "runpicture.in"
+#line 168 "runpicture.in"
addFunc(ve, run::gen_runpicture8, primVoid(), SYM(latticeshade), formal(primPicture(), SYM(f), false, false), formal(pathArray() , SYM(g), false, false), formal(primBoolean(), SYM(stroke), true, false), formal(primPen(), SYM(fillrule), true, false), formal(penArray2() , SYM(p), false, false), formal(primTransform(), SYM(t), true, false), formal(primBoolean(), SYM(copy), true, false));
-#line 155 "runpicture.in"
+#line 177 "runpicture.in"
addFunc(ve, run::gen_runpicture9, primVoid(), SYM(axialshade), formal(primPicture(), SYM(f), false, false), formal(pathArray() , SYM(g), false, false), formal(primBoolean(), SYM(stroke), true, false), formal(primPen(), SYM(pena), false, false), formal(primPair(), SYM(a), false, false), formal(primBoolean(), SYM(extenda), true, false), formal(primPen(), SYM(penb), false, false), formal(primPair(), SYM(b), false, false), formal(primBoolean(), SYM(extendb), true, false), formal(primBoolean(), SYM(copy), true, false));
-#line 164 "runpicture.in"
+#line 186 "runpicture.in"
addFunc(ve, run::gen_runpicture10, primVoid(), SYM(radialshade), formal(primPicture(), SYM(f), false, false), formal(pathArray() , SYM(g), false, false), formal(primBoolean(), SYM(stroke), true, false), formal(primPen(), SYM(pena), false, false), formal(primPair(), SYM(a), false, false), formal(primReal(), SYM(ra), false, false), formal(primBoolean(), SYM(extenda), true, false), formal(primPen(), SYM(penb), false, false), formal(primPair(), SYM(b), false, false), formal(primReal(), SYM(rb), false, false), formal(primBoolean(), SYM(extendb), true, false), formal(primBoolean(), SYM(copy), true, false));
-#line 173 "runpicture.in"
+#line 195 "runpicture.in"
addFunc(ve, run::gen_runpicture11, primVoid(), SYM(gouraudshade), formal(primPicture(), SYM(f), false, false), formal(pathArray() , SYM(g), false, false), formal(primBoolean(), SYM(stroke), true, false), formal(primPen(), SYM(fillrule), true, false), formal(penArray() , SYM(p), false, false), formal(pairArray(), SYM(z), false, false), formal(IntArray(), SYM(edges), false, false), formal(primBoolean(), SYM(copy), true, false));
-#line 184 "runpicture.in"
+#line 206 "runpicture.in"
addFunc(ve, run::gen_runpicture12, primVoid(), SYM(gouraudshade), formal(primPicture(), SYM(f), false, false), formal(pathArray() , SYM(g), false, false), formal(primBoolean(), SYM(stroke), true, false), formal(primPen(), SYM(fillrule), true, false), formal(penArray() , SYM(p), false, false), formal(IntArray(), SYM(edges), false, false), formal(primBoolean(), SYM(copy), true, false));
-#line 208 "runpicture.in"
+#line 230 "runpicture.in"
addFunc(ve, run::gen_runpicture13, primVoid(), SYM(tensorshade), formal(primPicture(), SYM(f), false, false), formal(pathArray() , SYM(g), false, false), formal(primBoolean(), SYM(stroke), true, false), formal(primPen(), SYM(fillrule), true, false), formal(penArray2() , SYM(p), false, false), formal(pathArray() , SYM(b), true, false), formal(pairArray2(), SYM(z), true, false), formal(primBoolean(), SYM(copy), true, false));
-#line 223 "runpicture.in"
+#line 245 "runpicture.in"
addFunc(ve, run::gen_runpicture14, primVoid(), SYM(functionshade), formal(primPicture(), SYM(f), false, false), formal(pathArray() , SYM(g), false, false), formal(primBoolean(), SYM(stroke), true, false), formal(primPen(), SYM(fillrule), true, false), formal(primString() , SYM(shader), true, false), formal(primBoolean(), SYM(copy), true, false));
-#line 231 "runpicture.in"
+#line 253 "runpicture.in"
addFunc(ve, run::gen_runpicture15, primVoid(), SYM(clip), formal(primPicture(), SYM(f), false, false), formal(pathArray() , SYM(g), false, false), formal(primBoolean(), SYM(stroke), true, false), formal(primPen(), SYM(fillrule), true, false), formal(primBoolean(), SYM(copy), true, false));
-#line 241 "runpicture.in"
+#line 263 "runpicture.in"
addFunc(ve, run::gen_runpicture16, primVoid(), SYM(beginclip), formal(primPicture(), SYM(f), false, false), formal(pathArray() , SYM(g), false, false), formal(primBoolean(), SYM(stroke), true, false), formal(primPen(), SYM(fillrule), true, false), formal(primBoolean(), SYM(copy), true, false));
-#line 248 "runpicture.in"
+#line 270 "runpicture.in"
addFunc(ve, run::gen_runpicture17, primVoid(), SYM(endclip), formal(primPicture(), SYM(f), false, false));
-#line 253 "runpicture.in"
+#line 275 "runpicture.in"
addFunc(ve, run::gen_runpicture18, primVoid(), SYM(gsave), formal(primPicture(), SYM(f), false, false));
-#line 258 "runpicture.in"
+#line 280 "runpicture.in"
addFunc(ve, run::gen_runpicture19, primVoid(), SYM(grestore), formal(primPicture(), SYM(f), false, false));
-#line 263 "runpicture.in"
+#line 285 "runpicture.in"
addFunc(ve, run::gen_runpicture20, primVoid(), SYM(begingroup), formal(primPicture(), SYM(f), false, false));
-#line 268 "runpicture.in"
+#line 290 "runpicture.in"
addFunc(ve, run::gen_runpicture21, primVoid(), SYM(endgroup), formal(primPicture(), SYM(f), false, false));
-#line 273 "runpicture.in"
+#line 295 "runpicture.in"
addFunc(ve, run::gen_runpicture22, primVoid(), SYM(_begingroup3), formal(primPicture(), SYM(f), false, false), formal(primString() , SYM(name), false, false), formal(primReal(), SYM(compression), false, false), formal(primReal(), SYM(granularity), false, false), formal(primBoolean(), SYM(closed), false, false), formal(primBoolean(), SYM(tessellate), false, false), formal(primBoolean(), SYM(dobreak), false, false), formal(primBoolean(), SYM(nobreak), false, false), formal(primTriple(), SYM(center), false, false), formal(primInt(), SYM(interaction), false, false));
-#line 282 "runpicture.in"
+#line 304 "runpicture.in"
addFunc(ve, run::gen_runpicture23, primVoid(), SYM(endgroup3), formal(primPicture(), SYM(f), false, false));
-#line 287 "runpicture.in"
+#line 309 "runpicture.in"
addFunc(ve, run::gen_runpicture24, primVoid(), SYM(add), formal(primPicture(), SYM(dest), false, false), formal(primPicture(), SYM(src), false, false));
-#line 292 "runpicture.in"
+#line 314 "runpicture.in"
addFunc(ve, run::gen_runpicture25, primVoid(), SYM(prepend), formal(primPicture(), SYM(dest), false, false), formal(primPicture(), SYM(src), false, false));
-#line 297 "runpicture.in"
+#line 319 "runpicture.in"
addFunc(ve, run::gen_runpicture26, primVoid(), SYM(postscript), formal(primPicture(), SYM(f), false, false), formal(primString() , SYM(s), false, false));
-#line 302 "runpicture.in"
+#line 324 "runpicture.in"
addFunc(ve, run::gen_runpicture27, primVoid(), SYM(tex), formal(primPicture(), SYM(f), false, false), formal(primString() , SYM(s), false, false));
-#line 307 "runpicture.in"
+#line 329 "runpicture.in"
addFunc(ve, run::gen_runpicture28, primVoid(), SYM(postscript), formal(primPicture(), SYM(f), false, false), formal(primString() , SYM(s), false, false), formal(primPair(), SYM(min), false, false), formal(primPair(), SYM(max), false, false));
-#line 312 "runpicture.in"
+#line 334 "runpicture.in"
addFunc(ve, run::gen_runpicture29, primVoid(), SYM(tex), formal(primPicture(), SYM(f), false, false), formal(primString() , SYM(s), false, false), formal(primPair(), SYM(min), false, false), formal(primPair(), SYM(max), false, false));
-#line 317 "runpicture.in"
+#line 339 "runpicture.in"
addFunc(ve, run::gen_runpicture30, primVoid(), SYM(texpreamble), formal(primString() , SYM(s), false, false));
-#line 325 "runpicture.in"
+#line 347 "runpicture.in"
addFunc(ve, run::gen_runpicture31, primVoid(), SYM(deletepreamble));
-#line 332 "runpicture.in"
+#line 354 "runpicture.in"
addFunc(ve, run::gen_runpicture32, primVoid(), SYM(_labelpath), formal(primPicture(), SYM(f), false, false), formal(primString() , SYM(s), false, false), formal(primString() , SYM(size), false, false), formal(primPath(), SYM(g), false, false), formal(primString() , SYM(justify), false, false), formal(primPair(), SYM(offset), false, false), formal(primPen(), SYM(p), false, false));
-#line 338 "runpicture.in"
+#line 360 "runpicture.in"
addFunc(ve, run::gen_runpicture33, primVoid(), SYM(texreset));
-#line 346 "runpicture.in"
+#line 368 "runpicture.in"
addFunc(ve, run::gen_runpicture34, primVoid(), SYM(layer), formal(primPicture(), SYM(f), false, false));
-#line 351 "runpicture.in"
+#line 373 "runpicture.in"
addFunc(ve, run::gen_runpicture35, primVoid(), SYM(newpage), formal(primPicture(), SYM(f), false, false));
-#line 356 "runpicture.in"
+#line 378 "runpicture.in"
addFunc(ve, run::gen_runpicture36, primVoid(), SYM(_image), formal(primPicture(), SYM(f), false, false), formal(realArray2(), SYM(data), false, false), formal(primPair(), SYM(initial), false, false), formal(primPair(), SYM(final), false, false), formal(penArray() , SYM(palette), true, false), formal(primTransform(), SYM(t), true, false), formal(primBoolean(), SYM(copy), true, false), formal(primBoolean(), SYM(antialias), true, false));
-#line 366 "runpicture.in"
+#line 388 "runpicture.in"
addFunc(ve, run::gen_runpicture37, primVoid(), SYM(_image), formal(primPicture(), SYM(f), false, false), formal(penArray2() , SYM(data), false, false), formal(primPair(), SYM(initial), false, false), formal(primPair(), SYM(final), false, false), formal(primTransform(), SYM(t), true, false), formal(primBoolean(), SYM(copy), true, false), formal(primBoolean(), SYM(antialias), true, false));
-#line 374 "runpicture.in"
+#line 396 "runpicture.in"
addFunc(ve, run::gen_runpicture38, primVoid(), SYM(_image), formal(primPicture(), SYM(f), false, false), formal(penFunction(), SYM(f), false, false), formal(primInt(), SYM(width), false, false), formal(primInt(), SYM(height), false, false), formal(primPair(), SYM(initial), false, false), formal(primPair(), SYM(final), false, false), formal(primTransform(), SYM(t), true, false), formal(primBoolean(), SYM(antialias), true, false));
-#line 381 "runpicture.in"
+#line 403 "runpicture.in"
addFunc(ve, run::gen_runpicture39, primString() , SYM(nativeformat));
-#line 386 "runpicture.in"
+#line 408 "runpicture.in"
addFunc(ve, run::gen_runpicture40, primBoolean(), SYM(latex));
-#line 391 "runpicture.in"
+#line 413 "runpicture.in"
addFunc(ve, run::gen_runpicture41, primBoolean(), SYM(pdf));
-#line 396 "runpicture.in"
- addFunc(ve, run::gen_runpicture42, primVoid(), SYM(shipout), formal(primString() , SYM(prefix), true, false), formal(primPicture(), SYM(f), false, false), formal(primPicture(), SYM(preamble), true, false), formal(primString() , SYM(format), true, false), formal(primBoolean(), SYM(wait), true, false), formal(primBoolean(), SYM(view), true, false), formal(transformFunction(), SYM(xform), false, false));
-#line 448 "runpicture.in"
+#line 418 "runpicture.in"
+ addFunc(ve, run::gen_runpicture42, primVoid(), SYM(_shipout), formal(primString() , SYM(prefix), true, false), formal(primPicture(), SYM(f), false, false), formal(primPicture(), SYM(preamble), true, false), formal(primString() , SYM(format), true, false), formal(primBoolean(), SYM(wait), true, false), formal(primBoolean(), SYM(view), true, false), formal(primTransform(), SYM(t), true, false));
+#line 467 "runpicture.in"
addFunc(ve, run::gen_runpicture43, primVoid(), SYM(shipout3), formal(primString() , SYM(prefix), false, false), formal(primPicture(), SYM(f), false, false), formal(primString() , SYM(format), true, false), formal(primReal(), SYM(width), false, false), formal(primReal(), SYM(height), false, false), formal(primReal(), SYM(angle), false, false), formal(primReal(), SYM(zoom), false, false), formal(primTriple(), SYM(m), false, false), formal(primTriple(), SYM(m), false, false), formal(primPair(), SYM(shift), false, false), formal(realArray2(), SYM(t), false, false), formal(realArray(), SYM(background), false, false), formal(tripleArray(), SYM(lights), false, false), formal(realArray2(), SYM(diffuse), false, false), formal(realArray2(), SYM(ambient), false, false), formal(realArray2(), SYM(specular), false, false), formal(primBoolean(), SYM(viewportlighting), false, false), formal(primBoolean(), SYM(view), true, false));
-#line 476 "runpicture.in"
+#line 495 "runpicture.in"
addFunc(ve, run::gen_runpicture44, primVoid(), SYM(shipout3), formal(primString() , SYM(prefix), false, false), formal(primPicture(), SYM(f), false, false));
-#line 481 "runpicture.in"
- addFunc(ve, run::gen_runpicture45, primVoid(), SYM(deconstruct), formal(primPicture(), SYM(f), false, false), formal(primPicture(), SYM(preamble), true, false), formal(primReal(), SYM(magnification), true, false), formal(transformFunction(), SYM(xform), false, false));
+#line 500 "runpicture.in"
+ addFunc(ve, run::gen_runpicture45, primVoid(), SYM(xmap), formal(primString() , SYM(key), false, false), formal(primTransform(), SYM(t), true, false));
+#line 513 "runpicture.in"
+ addFunc(ve, run::gen_runpicture46, primVoid(), SYM(deconstruct), formal(primPicture(), SYM(f), false, false), formal(primPicture(), SYM(preamble), true, false), formal(primTransform(), SYM(t), true, false));
+#line 605 "runpicture.in"
+ addFunc(ve, run::gen_runpicture47, primVoid(), SYM(_draw), formal(primPicture(), SYM(f), false, false), formal(primPath3(), SYM(g), false, false), formal(primTriple(), SYM(center), true, false), formal(primPen(), SYM(p), false, false), formal(primInt(), SYM(interaction), true, false));
+#line 615 "runpicture.in"
+ addFunc(ve, run::gen_runpicture48, primVoid(), SYM(draw), formal(primPicture(), SYM(f), false, false), formal(tripleArray2(), SYM(p), false, false), formal(primTriple(), SYM(center), false, false), formal(primBoolean(), SYM(straight), false, false), formal(penArray() , SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false), formal(primReal(), SYM(prcshininess), false, false), formal(penArray() , SYM(colors), false, false), formal(primInt(), SYM(interaction), false, false), formal(primBoolean(), SYM(prc), true, false));
#line 625 "runpicture.in"
- addFunc(ve, run::gen_runpicture46, primVoid(), SYM(_draw), formal(primPicture(), SYM(f), false, false), formal(primPath3(), SYM(g), false, false), formal(primTriple(), SYM(center), true, false), formal(primPen(), SYM(p), false, false), formal(primInt(), SYM(interaction), true, false));
-#line 635 "runpicture.in"
- addFunc(ve, run::gen_runpicture47, primVoid(), SYM(draw), formal(primPicture(), SYM(f), false, false), formal(tripleArray2(), SYM(p), false, false), formal(primTriple(), SYM(center), false, false), formal(primBoolean(), SYM(straight), false, false), formal(penArray() , SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false), formal(primReal(), SYM(prcshininess), false, false), formal(penArray() , SYM(colors), false, false), formal(primInt(), SYM(interaction), false, false), formal(primBoolean(), SYM(prc), true, false));
-#line 645 "runpicture.in"
- addFunc(ve, run::gen_runpicture48, primVoid(), SYM(drawbeziertriangle), formal(primPicture(), SYM(f), false, false), formal(tripleArray2(), SYM(p), false, false), formal(primTriple(), SYM(center), false, false), formal(primBoolean(), SYM(straight), false, false), formal(penArray() , SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false), formal(primReal(), SYM(prcshininess), false, false), formal(penArray() , SYM(colors), false, false), formal(primInt(), SYM(interaction), false, false), formal(primBoolean(), SYM(prc), true, false));
-#line 656 "runpicture.in"
- addFunc(ve, run::gen_runpicture49, primVoid(), SYM(draw), formal(primPicture(), SYM(f), false, false), formal(tripleArray(), SYM(p), false, false), formal(realArray(), SYM(knot), false, false), formal(realArray(), SYM(weights), true, false), formal(primPen(), SYM(p), false, false));
-#line 663 "runpicture.in"
- addFunc(ve, run::gen_runpicture50, primVoid(), SYM(draw), formal(primPicture(), SYM(f), false, false), formal(tripleArray2(), SYM(p), false, false), formal(realArray(), SYM(uknot), false, false), formal(realArray(), SYM(vknot), false, false), formal(realArray2(), SYM(weights), true, false), formal(penArray() , SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false), formal(primReal(), SYM(prcshininess), false, false), formal(penArray() , SYM(colors), false, false));
-#line 672 "runpicture.in"
- addFunc(ve, run::gen_runpicture51, primVoid(), SYM(drawPRCsphere), formal(primPicture(), SYM(f), false, false), formal(realArray2(), SYM(t), false, false), formal(primBoolean(), SYM(half), true, false), formal(penArray() , SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false), formal(primInt(), SYM(type), false, false));
-#line 679 "runpicture.in"
- addFunc(ve, run::gen_runpicture52, primVoid(), SYM(drawPRCcylinder), formal(primPicture(), SYM(f), false, false), formal(realArray2(), SYM(t), false, false), formal(penArray() , SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false));
+ addFunc(ve, run::gen_runpicture49, primVoid(), SYM(drawbeziertriangle), formal(primPicture(), SYM(f), false, false), formal(tripleArray2(), SYM(p), false, false), formal(primTriple(), SYM(center), false, false), formal(primBoolean(), SYM(straight), false, false), formal(penArray() , SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false), formal(primReal(), SYM(prcshininess), false, false), formal(penArray() , SYM(colors), false, false), formal(primInt(), SYM(interaction), false, false), formal(primBoolean(), SYM(prc), true, false));
+#line 636 "runpicture.in"
+ addFunc(ve, run::gen_runpicture50, primVoid(), SYM(draw), formal(primPicture(), SYM(f), false, false), formal(tripleArray(), SYM(p), false, false), formal(realArray(), SYM(knot), false, false), formal(realArray(), SYM(weights), true, false), formal(primPen(), SYM(p), false, false));
+#line 643 "runpicture.in"
+ addFunc(ve, run::gen_runpicture51, primVoid(), SYM(draw), formal(primPicture(), SYM(f), false, false), formal(tripleArray2(), SYM(p), false, false), formal(realArray(), SYM(uknot), false, false), formal(realArray(), SYM(vknot), false, false), formal(realArray2(), SYM(weights), true, false), formal(penArray() , SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false), formal(primReal(), SYM(prcshininess), false, false), formal(penArray() , SYM(colors), false, false));
+#line 652 "runpicture.in"
+ addFunc(ve, run::gen_runpicture52, primVoid(), SYM(drawPRCsphere), formal(primPicture(), SYM(f), false, false), formal(realArray2(), SYM(t), false, false), formal(primBoolean(), SYM(half), true, false), formal(penArray() , SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false), formal(primInt(), SYM(type), false, false));
+#line 659 "runpicture.in"
+ addFunc(ve, run::gen_runpicture53, primVoid(), SYM(drawPRCcylinder), formal(primPicture(), SYM(f), false, false), formal(realArray2(), SYM(t), false, false), formal(penArray() , SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false));
+#line 666 "runpicture.in"
+ addFunc(ve, run::gen_runpicture54, primVoid(), SYM(drawPRCdisk), formal(primPicture(), SYM(f), false, false), formal(realArray2(), SYM(t), false, false), formal(penArray() , SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false));
+#line 673 "runpicture.in"
+ addFunc(ve, run::gen_runpicture55, primVoid(), SYM(drawPRCtube), formal(primPicture(), SYM(f), false, false), formal(primPath3(), SYM(center), false, false), formal(primPath3(), SYM(g), false, false), formal(penArray() , SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false));
+#line 680 "runpicture.in"
+ addFunc(ve, run::gen_runpicture56, primVoid(), SYM(drawpixel), formal(primPicture(), SYM(f), false, false), formal(primTriple(), SYM(v), false, false), formal(primPen(), SYM(p), false, false), formal(primReal(), SYM(width), true, false));
#line 686 "runpicture.in"
- addFunc(ve, run::gen_runpicture53, primVoid(), SYM(drawPRCdisk), formal(primPicture(), SYM(f), false, false), formal(realArray2(), SYM(t), false, false), formal(penArray() , SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false));
-#line 693 "runpicture.in"
- addFunc(ve, run::gen_runpicture54, primVoid(), SYM(drawPRCtube), formal(primPicture(), SYM(f), false, false), formal(primPath3(), SYM(center), false, false), formal(primPath3(), SYM(g), false, false), formal(penArray() , SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false));
-#line 700 "runpicture.in"
- addFunc(ve, run::gen_runpicture55, primVoid(), SYM(drawpixel), formal(primPicture(), SYM(f), false, false), formal(primTriple(), SYM(v), false, false), formal(primPen(), SYM(p), false, false), formal(primReal(), SYM(width), true, false));
+ addFunc(ve, run::gen_runpicture57, primVoid(), SYM(draw), formal(primPicture(), SYM(f), false, false), formal(tripleArray(), SYM(v), false, false), formal(IntArray2(), SYM(vi), false, false), formal(tripleArray(), SYM(n), false, false), formal(IntArray2(), SYM(ni), false, false), formal(penArray() , SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false), formal(primReal(), SYM(prcshininess), false, false), formal(penArray() , SYM(c), true, false), formal(IntArray2(), SYM(ci), true, false));
+#line 696 "runpicture.in"
+ addFunc(ve, run::gen_runpicture58, primTriple(), SYM(min3), formal(primPicture(), SYM(f), false, false));
+#line 701 "runpicture.in"
+ addFunc(ve, run::gen_runpicture59, primTriple(), SYM(max3), formal(primPicture(), SYM(f), false, false));
#line 706 "runpicture.in"
- addFunc(ve, run::gen_runpicture56, primVoid(), SYM(draw), formal(primPicture(), SYM(f), false, false), formal(tripleArray(), SYM(v), false, false), formal(IntArray2(), SYM(vi), false, false), formal(tripleArray(), SYM(n), false, false), formal(IntArray2(), SYM(ni), false, false), formal(penArray() , SYM(p), false, false), formal(primReal(), SYM(opacity), false, false), formal(primReal(), SYM(shininess), false, false), formal(primReal(), SYM(prcshininess), false, false), formal(penArray() , SYM(c), true, false), formal(IntArray2(), SYM(ci), true, false));
-#line 716 "runpicture.in"
- addFunc(ve, run::gen_runpicture57, primTriple(), SYM(min3), formal(primPicture(), SYM(f), false, false));
-#line 721 "runpicture.in"
- addFunc(ve, run::gen_runpicture58, primTriple(), SYM(max3), formal(primPicture(), SYM(f), false, false));
-#line 726 "runpicture.in"
- addFunc(ve, run::gen_runpicture59, primTriple(), SYM(size3), formal(primPicture(), SYM(f), false, false));
-#line 732 "runpicture.in"
- addFunc(ve, run::gen_runpicture60, primPair(), SYM(minratio), formal(primPicture(), SYM(f), false, false));
-#line 737 "runpicture.in"
- addFunc(ve, run::gen_runpicture61, primPair(), SYM(maxratio), formal(primPicture(), SYM(f), false, false));
-#line 742 "runpicture.in"
- addFunc(ve, run::gen_runpicture62, primBoolean(), SYM(is3D), formal(primPicture(), SYM(f), false, false));
+ addFunc(ve, run::gen_runpicture60, primTriple(), SYM(size3), formal(primPicture(), SYM(f), false, false));
+#line 712 "runpicture.in"
+ addFunc(ve, run::gen_runpicture61, primPair(), SYM(minratio), formal(primPicture(), SYM(f), false, false));
+#line 717 "runpicture.in"
+ addFunc(ve, run::gen_runpicture62, primPair(), SYM(maxratio), formal(primPicture(), SYM(f), false, false));
+#line 722 "runpicture.in"
+ addFunc(ve, run::gen_runpicture63, primBoolean(), SYM(is3D), formal(primPicture(), SYM(f), false, false));
}
} // namespace trans
diff --git a/Build/source/utils/asymptote/runpicture.in b/Build/source/utils/asymptote/runpicture.in
index e3c19c13fb4..7b47d7e6331 100644
--- a/Build/source/utils/asymptote/runpicture.in
+++ b/Build/source/utils/asymptote/runpicture.in
@@ -76,6 +76,28 @@ using types::pathArray;
using types::penArray;
using types::penArray2;
+static transform ZeroTransform=transform(0.0,0.0,0.0,0.0,0.0,0.0);
+//static int tag=0;
+
+transform getTransform(xmap_t &xmap, picture::nodelist::iterator p)
+{
+ string s=(*p)->KEY;
+ transform t;
+ // Don't apply xmap without an explicit corresponding key
+ if(s.substr(s.length()-1) != "1") return t;
+
+ xmap_t::iterator q=xmap.find(s.substr(0,s.length()-2));
+ if(q != xmap.end()) {
+ xtransform_t& v=q->second;
+ if(!v.empty()) {
+ t=v.front();
+ v.pop_front();
+ }
+ }
+ return t;
+}
+
+
function *transformFunction()
{
return new function(primTransform());
@@ -139,7 +161,7 @@ void _draw(picture *f, path g, pen p)
void fill(picture *f, patharray *g, pen p=CURRENTPEN, bool copy=true)
{
- array *(*copyarray)(array *a)=copy ? copyArray: nop;
+ array *(*copyarray)(array *a)=copy ? copyArray : nop;
f->append(new drawFill(*copyarray(g),false,p));
}
@@ -147,7 +169,7 @@ void latticeshade(picture *f, patharray *g, bool stroke=false,
pen fillrule=CURRENTPEN, penarray2 *p, transform t=identity,
bool copy=true)
{
- array *(*copyarray)(array *a)=copy ? copyArray: nop;
+ array *(*copyarray)(array *a)=copy ? copyArray : nop;
f->append(new drawLatticeShade(*copyarray(g),stroke,fillrule,*copyarray(p),
t));
}
@@ -156,7 +178,7 @@ void axialshade(picture *f, patharray *g, bool stroke=false, pen pena, pair a,
bool extenda=true, pen penb, pair b, bool extendb=true,
bool copy=true)
{
- array *(*copyarray)(array *a)=copy ? copyArray: nop;
+ array *(*copyarray)(array *a)=copy ? copyArray : nop;
f->append(new drawAxialShade(*copyarray(g),stroke,pena,a,extenda,penb,b,
extendb));
}
@@ -165,7 +187,7 @@ void radialshade(picture *f, patharray *g, bool stroke=false, pen pena,
pair a, real ra, bool extenda=true, pen penb, pair b, real rb,
bool extendb=true, bool copy=true)
{
- array *(*copyarray)(array *a)=copy ? copyArray: nop;
+ array *(*copyarray)(array *a)=copy ? copyArray : nop;
f->append(new drawRadialShade(*copyarray(g),stroke,pena,a,ra,extenda,
penb,b,rb,extendb));
}
@@ -174,7 +196,7 @@ void gouraudshade(picture *f, patharray *g, bool stroke=false,
pen fillrule=CURRENTPEN, penarray *p, pairarray *z,
Intarray *edges, bool copy=true)
{
- array *(*copyarray)(array *a)=copy ? copyArray: nop;
+ array *(*copyarray)(array *a)=copy ? copyArray : nop;
checkArrays(p,z);
checkArrays(z,edges);
f->append(new drawGouraudShade(*copyarray(g),stroke,fillrule,*copyarray(p),
@@ -185,7 +207,7 @@ void gouraudshade(picture *f, patharray *g, bool stroke=false,
pen fillrule=CURRENTPEN, penarray *p, Intarray *edges,
bool copy=true)
{
- array *(*copyarray)(array *a)=copy ? copyArray: nop;
+ array *(*copyarray)(array *a)=copy ? copyArray : nop;
size_t n=checkArrays(p,edges);
size_t m=checkArray(g);
array *z=new array(n);
@@ -209,8 +231,8 @@ void tensorshade(picture *f, patharray *g, bool stroke=false,
pen fillrule=CURRENTPEN, penarray2 *p, patharray *b=NULL,
pairarray2 *z=emptyarray, bool copy=true)
{
- array *(*copyarray)(array *a)=copy ? copyArray: nop;
- array *(*copyarray2)(array *a)=copy ? copyArray2: nop;
+ array *(*copyarray)(array *a)=copy ? copyArray : nop;
+ array *(*copyarray2)(array *a)=copy ? copyArray2 : nop;
if(b == NULL) b=g;
size_t n=checkArrays(p,b);
size_t nz=checkArray(z);
@@ -224,7 +246,7 @@ void functionshade(picture *f, patharray *g, bool stroke=false,
pen fillrule=CURRENTPEN, string shader=emptystring,
bool copy=true)
{
- array *(*copyarray)(array *a)=copy ? copyArray: nop;
+ array *(*copyarray)(array *a)=copy ? copyArray : nop;
f->append(new drawFunctionShade(*copyarray(g),stroke,fillrule,shader));
}
@@ -233,7 +255,7 @@ void functionshade(picture *f, patharray *g, bool stroke=false,
void clip(picture *f, patharray *g, bool stroke=false,
pen fillrule=CURRENTPEN, bool copy=true)
{
- array *(*copyarray)(array *a)=copy ? copyArray: nop;
+ array *(*copyarray)(array *a)=copy ? copyArray : nop;
drawClipBegin *begin=new drawClipBegin(*copyarray(g),stroke,fillrule,true);
f->enclose(begin,new drawClipEnd(true,begin));
}
@@ -241,7 +263,7 @@ void clip(picture *f, patharray *g, bool stroke=false,
void beginclip(picture *f, patharray *g, bool stroke=false,
pen fillrule=CURRENTPEN, bool copy=true)
{
- array *(*copyarray)(array *a)=copy ? copyArray: nop;
+ array *(*copyarray)(array *a)=copy ? copyArray : nop;
f->append(new drawClipBegin(*copyarray(g),stroke,fillrule,false));
}
@@ -357,8 +379,8 @@ void _image(picture *f, realarray2 *data, pair initial, pair final,
penarray *palette=NULL, transform t=identity, bool copy=true,
bool antialias=false)
{
- array *(*copyarray)(array *a)=copy ? copyArray: nop;
- array *(*copyarray2)(array *a)=copy ? copyArray2: nop;
+ array *(*copyarray)(array *a)=copy ? copyArray : nop;
+ array *(*copyarray2)(array *a)=copy ? copyArray2 : nop;
f->append(new drawPaletteImage(*copyarray2(data),*copyarray(palette),
t*matrix(initial,final),antialias));
}
@@ -366,7 +388,7 @@ void _image(picture *f, realarray2 *data, pair initial, pair final,
void _image(picture *f, penarray2 *data, pair initial, pair final,
transform t=identity, bool copy=true, bool antialias=false)
{
- array *(*copyarray2)(array *a)=copy ? copyArray2: nop;
+ array *(*copyarray2)(array *a)=copy ? copyArray2 : nop;
f->append(new drawNoPaletteImage(*copyarray2(data),t*matrix(initial,final),
antialias));
}
@@ -393,26 +415,23 @@ bool pdf()
return pdf(getSetting<string>("tex"));
}
-void shipout(string prefix=emptystring, picture *f, picture *preamble=NULL,
- string format=emptystring, bool wait=false, bool view=true,
- callableTransform *xform)
+void _shipout(string prefix=emptystring, picture *f, picture *preamble=NULL,
+ string format=emptystring, bool wait=false, bool view=true,
+ transform T=identity)
{
if(prefix.empty()) prefix=outname();
picture *result=new picture;
unsigned level=0;
picture::nodelist::iterator p;
-
- // If null is given as an xform, just use the identity transformation.
- bool xformIsNull = xform == nullfunc::instance();
+
+ xmap_t xmap=processData().xmap;
+ transform Tinv=inverse(T);
for(p = f->nodes.begin(); p != f->nodes.end(); ++p) {
- if (!xformIsNull)
- xform->call(Stack);
- transform t=xformIsNull ? camp::identity : pop<transform>(Stack);
-
- static transform Zero=transform(0.0,0.0,0.0,0.0,0.0,0.0);
- bool Delete=(t == Zero);
+ transform t=getTransform(xmap,p);
+ bool Delete=(t == ZeroTransform);
+ if(!Delete && !t.isIdentity()) t=T*t*Tinv;
picture *group=new picture;
assert(*p);
if((*p)->endgroup()) error(nobegin);
@@ -442,7 +461,7 @@ void shipout(string prefix=emptystring, picture *f, picture *preamble=NULL,
}
}
- result->shipout(preamble,prefix,format,0.0,wait,view);
+ result->shipout(preamble,prefix,format,wait,view);
}
void shipout3(string prefix, picture *f, string format=emptystring,
@@ -478,148 +497,109 @@ void shipout3(string prefix, picture *f)
f->shipout3(prefix);
}
-void deconstruct(picture *f, picture *preamble=NULL, real magnification=1,
- callableTransform *xform)
+void xmap(string key, transform t=identity)
+{
+ xmap_t &xmap=processData().xmap;
+ xmap_t::iterator p=xmap.find(key);
+ if(p != xmap.end())
+ p->second.push_back(t);
+ else {
+ xtransform_t *v=new xtransform_t();
+ v->push_back(t);
+ xmap[key]=*v;
+ }
+}
+
+void deconstruct(picture *f, picture *preamble=NULL, transform T=identity)
{
unsigned level=0;
- unsigned n=0;
string prefix=outname();
- const string xformat="png";
+ const string xformat="svg";
- static long arg_max=sysconf(_SC_ARG_MAX);
- const unsigned maxargs=::min(arg_max/(prefix.size()+xformat.size()+25ul),
- 256ul);
openpipeout();
- fprintf(pipeout,"%d\n",maxargs);
- fflush(pipeout);
-
- string preformat=nativeformat();
const string Done="Done";
const string Error="Error";
- mem::vector<string> cmd;
-
- // Enforce ghostscript limitations.
- magnification=::max(magnification,0.0001);
- real res=::min(::max(magnification*72.0,2.0),8192.0);
-
- const char *converter=NULL, *hint=NULL;
-
- if(magnification > 0.0) {
- mem::list<string> nameStack;
- string outname;
- unsigned arg=0;
- unsigned batch=0;
- for(picture::nodelist::iterator p=f->nodes.begin();;) {
- if(p == f->nodes.end()) break;
- if(arg == 0) {
- cmd.clear();
- ostringstream buf;
- buf << batch << "_";
- outname=buildname(prefix+buf.str()+"%d",xformat,"");
- converter="gs";
- hint="Ghostscript";
- cmd.push_back(getSetting<string>(converter));
- cmd.push_back("-q");
- cmd.push_back("-dNOPAUSE");
- cmd.push_back("-dBATCH");
- cmd.push_back("-P");
- cmd.push_back("-sDEVICE=pngalpha");
- cmd.push_back("-dEPSCrop");
- if(safe)
- cmd.push_back("-dSAFER");
- cmd.push_back("-r"+String(res)+"x"+String(res));
- cmd.push_back("-sOutputFile="+outname);
- }
-
- picture *group=new picture;
- xform->call(Stack);
- transform t=pop<transform>(Stack);
- assert(*p);
- if((*p)->endgroup()) {
- fprintf(pipeout,"%s\n",Error.c_str());
- fflush(pipeout);
- error(nobegin);
- }
- if((*p)->begingroup()) {
- ++level;
- while(p != f->nodes.end() && level) {
+ unsigned arg=0;
+ xmap_t xmap=processData().xmap;
+ transform Tinv=inverse(T);
+
+ for(picture::nodelist::iterator p=f->nodes.begin();;) {
+ if(p == f->nodes.end()) break;
+
+ picture *group=new picture;
+ transform t=getTransform(xmap,p);
+ bool Delete=(t == ZeroTransform);
+ if(!Delete && !t.isIdentity()) t=T*t*Tinv;
+
+ assert(*p);
+ if((*p)->endgroup()) {
+ fprintf(pipeout,"%s\n",Error.c_str());
+ fflush(pipeout);
+ error(nobegin);
+ }
+ bool clip=false;
+ if((*p)->begingroup()) {
+ ++level;
+ while(p != f->nodes.end() && level) {
+ if(!Delete) {
drawElement *e=t.isIdentity() ? *p : (*p)->transformed(t);
group->append(e);
- ++p;
- if(p == f->nodes.end()) break;
- assert(*p);
- if((*p)->begingroup()) ++level;
- if((*p)->endgroup()) {
- if(level) --level;
- else {
- fprintf(pipeout,"%s\n",Error.c_str());
- fflush(pipeout);
- error(nobegin);
- }
+ if((*p)->endclip()) clip=true;
+ }
+ ++p;
+ if(p == f->nodes.end()) break;
+ assert(*p);
+ if((*p)->begingroup()) ++level;
+ if((*p)->endgroup()) {
+ if(level) --level;
+ else {
+ fprintf(pipeout,"%s\n",Error.c_str());
+ fflush(pipeout);
+ error(nobegin);
}
}
}
- if(p != f->nodes.end()) {
- assert(*p);
+ }
+ if(p != f->nodes.end()) {
+ if(!Delete) {
drawElement *e=t.isIdentity() ? *p : (*p)->transformed(t);
group->append(e);
- bbox b;
+ if((*p)->endclip()) clip=true;
ostringstream buf;
- buf << prefix << "_" << n;
- group->shipout(preamble,buf.str(),preformat,magnification,false,false);
- string Preformat=group->Transparency() ? "pdf" : preformat;
- string name=buildname(buf.str(),Preformat);
- nameStack.push_back(name);
- cmd.push_back(name);
- b=group->bounds();
- b *= magnification;
+ buf << prefix << "_" << arg;
+ string outname=buildname(buf.str(),xformat);
+ group->shipout(preamble,outname,xformat,false,false);
+ bbox b=group->bounds();
+ if(!b.empty) {
+ fprintf(pipeout,"KEY=%s%d\n",e->KEY.c_str(),clip);
- const char *oldlocale=setlocale(LC_NUMERIC,NULL);
- bool override=oldlocale && strcmp(oldlocale,"C") != 0;
- if(override) {
- oldlocale=StrdupNoGC(oldlocale);
- setlocale(LC_NUMERIC,"C");
- }
+ const char *oldlocale=setlocale(LC_NUMERIC,NULL);
+ bool override=oldlocale && strcmp(oldlocale,"C") != 0;
+ if(override) {
+ oldlocale=StrdupNoGC(oldlocale);
+ setlocale(LC_NUMERIC,"C");
+ }
- fprintf(pipeout,"%g %g %g %g\n",b.left,b.right,b.bottom,b.top);
+ fprintf(pipeout,"%g %g %g %g\n",b.left,b.bottom,b.right,b.top);
- if(override) {
- setlocale(LC_NUMERIC,oldlocale);
- delete[] oldlocale;
- }
+ if(override) {
+ setlocale(LC_NUMERIC,oldlocale);
+ delete[] oldlocale;
+ }
- fflush(pipeout);
- ++n;
- ++p;
- ++arg;
- }
-
- if(p == f->nodes.end() || arg >= maxargs) {
- arg=0;
- ++batch;
- fflush(pipeout);
-
- int status=System(cmd,0,true,converter,hint);
- if(status) {
- fprintf(pipeout,"%s\n",Error.c_str());
fflush(pipeout);
- error("deconstruct failed");
+ ++arg;
}
}
+ ++p;
}
-
- if(!getSetting<bool>("keep")) {
- for(mem::list<string>::iterator p=nameStack.begin();
- p != nameStack.end(); ++p)
- unlink(p->c_str());
- }
-
- fprintf(pipeout,"%s\n",Done.c_str());
- fflush(pipeout);
}
+
+ fprintf(pipeout,"%s\n",Done.c_str());
+ fflush(pipeout);
}
diff --git a/Build/source/utils/asymptote/runpicture.symbols.h b/Build/source/utils/asymptote/runpicture.symbols.h
deleted file mode 100644
index dc28a68d77f..00000000000
--- a/Build/source/utils/asymptote/runpicture.symbols.h
+++ /dev/null
@@ -1,139 +0,0 @@
-/*****
- * This file is automatically generated by findsym.pl
- * Changes will be overwritten.
- *****/
-
-// If the ADDSYMBOL macro is not already defined, define it with the default
-// purpose of referring to an external pre-translated symbol, such that
-// SYM(name) also refers to that symbol.
-#ifndef ADDSYMBOL
- #define ADDSYMBOL(name) extern sym::symbol PRETRANSLATED_SYMBOL_##name
- #define SYM(name) PRETRANSLATED_SYMBOL_##name
-#endif
-
-ADDSYMBOL(_begingroup3);
-ADDSYMBOL(_draw);
-ADDSYMBOL(_image);
-ADDSYMBOL(_labelpath);
-ADDSYMBOL(a);
-ADDSYMBOL(add);
-ADDSYMBOL(ambient);
-ADDSYMBOL(angle);
-ADDSYMBOL(antialias);
-ADDSYMBOL(axialshade);
-ADDSYMBOL(b);
-ADDSYMBOL(background);
-ADDSYMBOL(beginclip);
-ADDSYMBOL(begingroup);
-ADDSYMBOL(c);
-ADDSYMBOL(center);
-ADDSYMBOL(ci);
-ADDSYMBOL(clip);
-ADDSYMBOL(closed);
-ADDSYMBOL(colors);
-ADDSYMBOL(compression);
-ADDSYMBOL(copy);
-ADDSYMBOL(data);
-ADDSYMBOL(deconstruct);
-ADDSYMBOL(deletepreamble);
-ADDSYMBOL(dest);
-ADDSYMBOL(diffuse);
-ADDSYMBOL(dobreak);
-ADDSYMBOL(draw);
-ADDSYMBOL(drawPRCcylinder);
-ADDSYMBOL(drawPRCdisk);
-ADDSYMBOL(drawPRCsphere);
-ADDSYMBOL(drawPRCtube);
-ADDSYMBOL(drawbeziertriangle);
-ADDSYMBOL(drawpixel);
-ADDSYMBOL(edges);
-ADDSYMBOL(empty);
-ADDSYMBOL(endclip);
-ADDSYMBOL(endgroup);
-ADDSYMBOL(endgroup3);
-ADDSYMBOL(erase);
-ADDSYMBOL(extenda);
-ADDSYMBOL(extendb);
-ADDSYMBOL(f);
-ADDSYMBOL(fill);
-ADDSYMBOL(fillrule);
-ADDSYMBOL(final);
-ADDSYMBOL(format);
-ADDSYMBOL(functionshade);
-ADDSYMBOL(g);
-ADDSYMBOL(gouraudshade);
-ADDSYMBOL(granularity);
-ADDSYMBOL(grestore);
-ADDSYMBOL(gsave);
-ADDSYMBOL(half);
-ADDSYMBOL(height);
-ADDSYMBOL(initial);
-ADDSYMBOL(interaction);
-ADDSYMBOL(is3D);
-ADDSYMBOL(justify);
-ADDSYMBOL(knot);
-ADDSYMBOL(latex);
-ADDSYMBOL(latticeshade);
-ADDSYMBOL(layer);
-ADDSYMBOL(lights);
-ADDSYMBOL(m);
-ADDSYMBOL(magnification);
-ADDSYMBOL(max);
-ADDSYMBOL(max3);
-ADDSYMBOL(maxratio);
-ADDSYMBOL(min);
-ADDSYMBOL(min3);
-ADDSYMBOL(minratio);
-ADDSYMBOL(n);
-ADDSYMBOL(name);
-ADDSYMBOL(nativeformat);
-ADDSYMBOL(newpage);
-ADDSYMBOL(ni);
-ADDSYMBOL(nobreak);
-ADDSYMBOL(offset);
-ADDSYMBOL(opacity);
-ADDSYMBOL(p);
-ADDSYMBOL(palette);
-ADDSYMBOL(pdf);
-ADDSYMBOL(pena);
-ADDSYMBOL(penb);
-ADDSYMBOL(postscript);
-ADDSYMBOL(prc);
-ADDSYMBOL(prcshininess);
-ADDSYMBOL(preamble);
-ADDSYMBOL(prefix);
-ADDSYMBOL(prepend);
-ADDSYMBOL(ra);
-ADDSYMBOL(radialshade);
-ADDSYMBOL(rb);
-ADDSYMBOL(s);
-ADDSYMBOL(shader);
-ADDSYMBOL(shift);
-ADDSYMBOL(shininess);
-ADDSYMBOL(shipout);
-ADDSYMBOL(shipout3);
-ADDSYMBOL(size);
-ADDSYMBOL(size3);
-ADDSYMBOL(specular);
-ADDSYMBOL(src);
-ADDSYMBOL(straight);
-ADDSYMBOL(stroke);
-ADDSYMBOL(t);
-ADDSYMBOL(tensorshade);
-ADDSYMBOL(tessellate);
-ADDSYMBOL(tex);
-ADDSYMBOL(texpreamble);
-ADDSYMBOL(texreset);
-ADDSYMBOL(type);
-ADDSYMBOL(uknot);
-ADDSYMBOL(v);
-ADDSYMBOL(vi);
-ADDSYMBOL(view);
-ADDSYMBOL(viewportlighting);
-ADDSYMBOL(vknot);
-ADDSYMBOL(wait);
-ADDSYMBOL(weights);
-ADDSYMBOL(width);
-ADDSYMBOL(xform);
-ADDSYMBOL(z);
-ADDSYMBOL(zoom);
diff --git a/Build/source/utils/asymptote/runstring.symbols.h b/Build/source/utils/asymptote/runstring.symbols.h
deleted file mode 100644
index 38128a278db..00000000000
--- a/Build/source/utils/asymptote/runstring.symbols.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*****
- * This file is automatically generated by findsym.pl
- * Changes will be overwritten.
- *****/
-
-// If the ADDSYMBOL macro is not already defined, define it with the default
-// purpose of referring to an external pre-translated symbol, such that
-// SYM(name) also refers to that symbol.
-#ifndef ADDSYMBOL
- #define ADDSYMBOL(name) extern sym::symbol PRETRANSLATED_SYMBOL_##name
- #define SYM(name) PRETRANSLATED_SYMBOL_##name
-#endif
-
-ADDSYMBOL(ascii);
-ADDSYMBOL(digits);
-ADDSYMBOL(downcase);
-ADDSYMBOL(erase);
-ADDSYMBOL(find);
-ADDSYMBOL(forcemath);
-ADDSYMBOL(format);
-ADDSYMBOL(hex);
-ADDSYMBOL(insert);
-ADDSYMBOL(length);
-ADDSYMBOL(locale);
-ADDSYMBOL(n);
-ADDSYMBOL(pos);
-ADDSYMBOL(replace);
-ADDSYMBOL(reverse);
-ADDSYMBOL(rfind);
-ADDSYMBOL(s);
-ADDSYMBOL(seconds);
-ADDSYMBOL(separator);
-ADDSYMBOL(string);
-ADDSYMBOL(substr);
-ADDSYMBOL(t);
-ADDSYMBOL(time);
-ADDSYMBOL(translate);
-ADDSYMBOL(upcase);
-ADDSYMBOL(x);
diff --git a/Build/source/utils/asymptote/runsystem.symbols.h b/Build/source/utils/asymptote/runsystem.symbols.h
deleted file mode 100644
index 7cb8be37566..00000000000
--- a/Build/source/utils/asymptote/runsystem.symbols.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*****
- * This file is automatically generated by findsym.pl
- * Changes will be overwritten.
- *****/
-
-// If the ADDSYMBOL macro is not already defined, define it with the default
-// purpose of referring to an external pre-translated symbol, such that
-// SYM(name) also refers to that symbol.
-#ifndef ADDSYMBOL
- #define ADDSYMBOL(name) extern sym::symbol PRETRANSLATED_SYMBOL_##name
- #define SYM(name) PRETRANSLATED_SYMBOL_##name
-#endif
-
-ADDSYMBOL(animate);
-ADDSYMBOL(args);
-ADDSYMBOL(atbreakpoint);
-ADDSYMBOL(atexit);
-ADDSYMBOL(atupdate);
-ADDSYMBOL(breakpoint);
-ADDSYMBOL(breakpoints);
-ADDSYMBOL(clear);
-ADDSYMBOL(convert);
-ADDSYMBOL(divisor);
-ADDSYMBOL(f);
-ADDSYMBOL(file);
-ADDSYMBOL(format);
-ADDSYMBOL(line);
-ADDSYMBOL(locatefile);
-ADDSYMBOL(nowarn);
-ADDSYMBOL(outname);
-ADDSYMBOL(position);
-ADDSYMBOL(purge);
-ADDSYMBOL(s);
-ADDSYMBOL(stop);
-ADDSYMBOL(stripdirectory);
-ADDSYMBOL(stripextension);
-ADDSYMBOL(stripfile);
-ADDSYMBOL(t);
-ADDSYMBOL(warn);
-ADDSYMBOL(warning);
diff --git a/Build/source/utils/asymptote/runtime.cc b/Build/source/utils/asymptote/runtime.cc
index b9f5e1f03e2..6861428a19b 100644
--- a/Build/source/utils/asymptote/runtime.cc
+++ b/Build/source/utils/asymptote/runtime.cc
@@ -219,8 +219,8 @@ void writestring(stack *s)
string S=pop<string>(s);
vm::item it=pop(s);
bool defaultfile=isdefault(it);
- camp::file *f=defaultfile ? &camp::Stdout : vm::get<camp::file*>(it);
- if(!f->isOpen()) return;
+ camp::ofile *f=defaultfile ? &camp::Stdout : vm::get<camp::ofile*>(it);
+ if(!f->isOpen() || !f->enabled()) return;
if(S != "") f->write(S);
if(f->text()) {
if(suffix) {
@@ -230,6 +230,13 @@ void writestring(stack *s)
}
}
+string toplocation() {
+ ostringstream buf;
+ position& topPos=processData().topPos;
+ buf << topPos.Line() << "." << topPos.Column();
+ return buf.str();
+}
+
string emptystring;
pair zero;
@@ -252,54 +259,54 @@ void unused(void *)
namespace run {
// Initializers
-#line 227 "runtime.in"
+#line 234 "runtime.in"
void IntZero(stack *Stack)
{
-#line 228 "runtime.in"
+#line 235 "runtime.in"
{Stack->push<Int>(0); return;}
}
-#line 233 "runtime.in"
+#line 240 "runtime.in"
void realZero(stack *Stack)
{
-#line 234 "runtime.in"
+#line 241 "runtime.in"
{Stack->push<real>(0.0); return;}
}
-#line 238 "runtime.in"
+#line 245 "runtime.in"
void boolFalse(stack *Stack)
{
-#line 239 "runtime.in"
+#line 246 "runtime.in"
{Stack->push<bool>(false); return;}
}
-#line 243 "runtime.in"
+#line 250 "runtime.in"
// bool isnan(real x);
void gen_runtime3(stack *Stack)
{
real x=vm::pop<real>(Stack);
-#line 244 "runtime.in"
+#line 251 "runtime.in"
{Stack->push<bool>(std::isnan(x)); return;}
}
-#line 248 "runtime.in"
+#line 255 "runtime.in"
void pushNullArray(stack *Stack)
{
-#line 249 "runtime.in"
+#line 256 "runtime.in"
{Stack->push<array*>(0); return;}
}
-#line 253 "runtime.in"
+#line 260 "runtime.in"
void pushNullRecord(stack *Stack)
{
-#line 254 "runtime.in"
+#line 261 "runtime.in"
{Stack->push<frame*>(0); return;}
}
-#line 258 "runtime.in"
+#line 265 "runtime.in"
void pushNullFunction(stack *Stack)
{
-#line 259 "runtime.in"
+#line 266 "runtime.in"
{Stack->push(nullfunc::instance()); return;}
}
@@ -308,222 +315,222 @@ void pushNullFunction(stack *Stack)
// Put the default value token on the stack (in place of an argument when
// making a function call).
-#line 268 "runtime.in"
+#line 275 "runtime.in"
void pushDefault(stack *Stack)
{
-#line 269 "runtime.in"
+#line 276 "runtime.in"
{Stack->push(Default); return;}
}
// Test if the value on the stack is the default value token.
-#line 275 "runtime.in"
+#line 282 "runtime.in"
void isDefault(stack *Stack)
{
item i=vm::pop(Stack);
-#line 276 "runtime.in"
+#line 283 "runtime.in"
{Stack->push<bool>(isdefault(i)); return;}
}
// Casts
-#line 282 "runtime.in"
+#line 289 "runtime.in"
void pairToGuide(stack *Stack)
{
pair z=vm::pop<pair>(Stack);
-#line 283 "runtime.in"
+#line 290 "runtime.in"
{Stack->push<guide*>(new pairguide(z)); return;}
}
-#line 288 "runtime.in"
+#line 295 "runtime.in"
void pathToGuide(stack *Stack)
{
path p=vm::pop<path>(Stack);
-#line 289 "runtime.in"
+#line 296 "runtime.in"
{Stack->push<guide*>(new pathguide(p)); return;}
}
-#line 293 "runtime.in"
+#line 300 "runtime.in"
void guideToPath(stack *Stack)
{
guide * g=vm::pop<guide *>(Stack);
-#line 294 "runtime.in"
+#line 301 "runtime.in"
{Stack->push<path>(g->solve()); return;}
}
// Pen operations
-#line 300 "runtime.in"
+#line 307 "runtime.in"
void newPen(stack *Stack)
{
-#line 301 "runtime.in"
+#line 308 "runtime.in"
{Stack->push<pen>(pen()); return;}
}
-#line 306 "runtime.in"
+#line 313 "runtime.in"
// bool ==(pen a, pen b);
void gen_runtime13(stack *Stack)
{
pen b=vm::pop<pen>(Stack);
pen a=vm::pop<pen>(Stack);
-#line 307 "runtime.in"
+#line 314 "runtime.in"
{Stack->push<bool>(a == b); return;}
}
-#line 311 "runtime.in"
+#line 318 "runtime.in"
// bool !=(pen a, pen b);
void gen_runtime14(stack *Stack)
{
pen b=vm::pop<pen>(Stack);
pen a=vm::pop<pen>(Stack);
-#line 312 "runtime.in"
+#line 319 "runtime.in"
{Stack->push<bool>(a != b); return;}
}
-#line 316 "runtime.in"
+#line 323 "runtime.in"
// pen +(pen a, pen b);
void gen_runtime15(stack *Stack)
{
pen b=vm::pop<pen>(Stack);
pen a=vm::pop<pen>(Stack);
-#line 317 "runtime.in"
+#line 324 "runtime.in"
{Stack->push<pen>(a+b); return;}
}
-#line 321 "runtime.in"
+#line 328 "runtime.in"
// pen *(real a, pen b);
void gen_runtime16(stack *Stack)
{
pen b=vm::pop<pen>(Stack);
real a=vm::pop<real>(Stack);
-#line 322 "runtime.in"
+#line 329 "runtime.in"
{Stack->push<pen>(a*b); return;}
}
-#line 326 "runtime.in"
+#line 333 "runtime.in"
// pen *(pen a, real b);
void gen_runtime17(stack *Stack)
{
real b=vm::pop<real>(Stack);
pen a=vm::pop<pen>(Stack);
-#line 327 "runtime.in"
+#line 334 "runtime.in"
{Stack->push<pen>(b*a); return;}
}
-#line 331 "runtime.in"
+#line 338 "runtime.in"
// pair max(pen p);
void gen_runtime18(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 332 "runtime.in"
+#line 339 "runtime.in"
{Stack->push<pair>(p.bounds().Max()); return;}
}
-#line 336 "runtime.in"
+#line 343 "runtime.in"
// pair min(pen p);
void gen_runtime19(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 337 "runtime.in"
+#line 344 "runtime.in"
{Stack->push<pair>(p.bounds().Min()); return;}
}
// Reset the meaning of pen default attributes.
-#line 342 "runtime.in"
+#line 349 "runtime.in"
// void resetdefaultpen();
void gen_runtime20(stack *)
{
-#line 343 "runtime.in"
+#line 350 "runtime.in"
processData().defaultpen=camp::pen::initialpen();
}
-#line 347 "runtime.in"
+#line 354 "runtime.in"
// void defaultpen(pen p);
void gen_runtime21(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 348 "runtime.in"
+#line 355 "runtime.in"
processData().defaultpen=pen(resolvepen,p);
}
-#line 352 "runtime.in"
+#line 359 "runtime.in"
// pen defaultpen();
void gen_runtime22(stack *Stack)
{
-#line 353 "runtime.in"
+#line 360 "runtime.in"
{Stack->push<pen>(processData().defaultpen); return;}
}
-#line 357 "runtime.in"
+#line 364 "runtime.in"
// bool invisible(pen p);
void gen_runtime23(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 358 "runtime.in"
+#line 365 "runtime.in"
{Stack->push<bool>(p.invisible()); return;}
}
-#line 362 "runtime.in"
+#line 369 "runtime.in"
// pen invisible();
void gen_runtime24(stack *Stack)
{
-#line 363 "runtime.in"
+#line 370 "runtime.in"
{Stack->push<pen>(pen(invisiblepen)); return;}
}
-#line 367 "runtime.in"
+#line 374 "runtime.in"
// pen gray(pen p);
void gen_runtime25(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 368 "runtime.in"
+#line 375 "runtime.in"
p.togrey();
{Stack->push<pen>(p); return;}
}
-#line 373 "runtime.in"
+#line 380 "runtime.in"
// pen rgb(pen p);
void gen_runtime26(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 374 "runtime.in"
+#line 381 "runtime.in"
p.torgb();
{Stack->push<pen>(p); return;}
}
-#line 379 "runtime.in"
+#line 386 "runtime.in"
// pen cmyk(pen p);
void gen_runtime27(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 380 "runtime.in"
+#line 387 "runtime.in"
p.tocmyk();
{Stack->push<pen>(p); return;}
}
-#line 385 "runtime.in"
+#line 392 "runtime.in"
// pen interp(pen a, pen b, real t);
void gen_runtime28(stack *Stack)
{
real t=vm::pop<real>(Stack);
pen b=vm::pop<pen>(Stack);
pen a=vm::pop<pen>(Stack);
-#line 386 "runtime.in"
+#line 393 "runtime.in"
{Stack->push<pen>(interpolate(a,b,t)); return;}
}
-#line 390 "runtime.in"
+#line 397 "runtime.in"
// pen rgb(real r, real g, real b);
void gen_runtime29(stack *Stack)
{
real b=vm::pop<real>(Stack);
real g=vm::pop<real>(Stack);
real r=vm::pop<real>(Stack);
-#line 391 "runtime.in"
+#line 398 "runtime.in"
{Stack->push<pen>(pen(r,g,b)); return;}
}
-#line 395 "runtime.in"
+#line 402 "runtime.in"
// pen cmyk(real c, real m, real y, real k);
void gen_runtime30(stack *Stack)
{
@@ -531,25 +538,25 @@ void gen_runtime30(stack *Stack)
real y=vm::pop<real>(Stack);
real m=vm::pop<real>(Stack);
real c=vm::pop<real>(Stack);
-#line 396 "runtime.in"
+#line 403 "runtime.in"
{Stack->push<pen>(pen(c,m,y,k)); return;}
}
-#line 400 "runtime.in"
+#line 407 "runtime.in"
// pen gray(real gray);
void gen_runtime31(stack *Stack)
{
real gray=vm::pop<real>(Stack);
-#line 401 "runtime.in"
+#line 408 "runtime.in"
{Stack->push<pen>(pen(gray)); return;}
}
-#line 405 "runtime.in"
+#line 412 "runtime.in"
// realarray* colors(pen p);
void gen_runtime32(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 406 "runtime.in"
+#line 413 "runtime.in"
size_t n=ColorComponents[p.colorspace()];
array *a=new array(n);
@@ -576,78 +583,78 @@ void gen_runtime32(stack *Stack)
{Stack->push<realarray*>(a); return;}
}
-#line 433 "runtime.in"
+#line 440 "runtime.in"
// string hex(pen p);
void gen_runtime33(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 434 "runtime.in"
+#line 441 "runtime.in"
{Stack->push<string>(p.hex()); return;}
}
-#line 438 "runtime.in"
+#line 445 "runtime.in"
// Int byte(real x);
void gen_runtime34(stack *Stack)
{
real x=vm::pop<real>(Stack);
-#line 439 "runtime.in"
+#line 446 "runtime.in"
{Stack->push<Int>(camp::byte(x)); return;}
}
-#line 443 "runtime.in"
+#line 450 "runtime.in"
// string colorspace(pen p);
void gen_runtime35(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 444 "runtime.in"
+#line 451 "runtime.in"
string s=ColorDeviceSuffix[p.colorspace()];
std::transform(s.begin(),s.end(),s.begin(),tolower);
{Stack->push<string>(s); return;}
}
-#line 450 "runtime.in"
+#line 457 "runtime.in"
// pen pattern(string *s);
void gen_runtime36(stack *Stack)
{
string * s=vm::pop<string *>(Stack);
-#line 451 "runtime.in"
+#line 458 "runtime.in"
{Stack->push<pen>(pen(setpattern,*s)); return;}
}
-#line 455 "runtime.in"
+#line 462 "runtime.in"
// string pattern(pen p);
void gen_runtime37(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 456 "runtime.in"
+#line 463 "runtime.in"
{Stack->push<string>(p.fillpattern()); return;}
}
-#line 460 "runtime.in"
+#line 467 "runtime.in"
// pen fillrule(Int n);
void gen_runtime38(stack *Stack)
{
Int n=vm::pop<Int>(Stack);
-#line 461 "runtime.in"
+#line 468 "runtime.in"
{Stack->push<pen>(pen(n >= 0 && n < nFill ? (FillRule) n : DEFFILL)); return;}
}
-#line 465 "runtime.in"
+#line 472 "runtime.in"
// Int fillrule(pen p);
void gen_runtime39(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 466 "runtime.in"
+#line 473 "runtime.in"
{Stack->push<Int>(p.Fillrule()); return;}
}
-#line 470 "runtime.in"
+#line 477 "runtime.in"
// pen opacity(real opacity=1.0, string blend=defaulttransparency);
void gen_runtime40(stack *Stack)
{
string blend=vm::pop<string>(Stack,defaulttransparency);
real opacity=vm::pop<real>(Stack,1.0);
-#line 471 "runtime.in"
+#line 478 "runtime.in"
for(Int i=0; i < nBlendMode; ++i)
if(blend == BlendMode[i]) {Stack->push<pen>(pen(Transparency(blend,opacity))); return;}
@@ -656,25 +663,25 @@ void gen_runtime40(stack *Stack)
error(buf);
}
-#line 480 "runtime.in"
+#line 487 "runtime.in"
// real opacity(pen p);
void gen_runtime41(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 481 "runtime.in"
+#line 488 "runtime.in"
{Stack->push<real>(p.opacity()); return;}
}
-#line 485 "runtime.in"
+#line 492 "runtime.in"
// string blend(pen p);
void gen_runtime42(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 486 "runtime.in"
+#line 493 "runtime.in"
{Stack->push<string>(p.blend()); return;}
}
-#line 490 "runtime.in"
+#line 497 "runtime.in"
// pen linetype(realarray *pattern, real offset=0, bool scale=true, bool adjust=true);
void gen_runtime43(stack *Stack)
{
@@ -682,7 +689,7 @@ void gen_runtime43(stack *Stack)
bool scale=vm::pop<bool>(Stack,true);
real offset=vm::pop<real>(Stack,0);
realarray * pattern=vm::pop<realarray *>(Stack);
-#line 492 "runtime.in"
+#line 499 "runtime.in"
size_t size=checkArray(pattern);
array *a=new array(size);
for(size_t i=0; i < size; ++i)
@@ -691,272 +698,272 @@ void gen_runtime43(stack *Stack)
{Stack->push<pen>(pen(LineType(*a,offset,scale,adjust))); return;}
}
-#line 501 "runtime.in"
+#line 508 "runtime.in"
// realarray* linetype(pen p=CURRENTPEN);
void gen_runtime44(stack *Stack)
{
pen p=vm::pop<pen>(Stack,CURRENTPEN);
-#line 502 "runtime.in"
+#line 509 "runtime.in"
array a=p.linetype()->pattern;
{Stack->push<realarray*>(copyArray(&a)); return;}
}
-#line 507 "runtime.in"
+#line 514 "runtime.in"
// real offset(pen p);
void gen_runtime45(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 508 "runtime.in"
+#line 515 "runtime.in"
{Stack->push<real>(p.linetype()->offset); return;}
}
-#line 512 "runtime.in"
+#line 519 "runtime.in"
// bool scale(pen p);
void gen_runtime46(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 513 "runtime.in"
+#line 520 "runtime.in"
{Stack->push<bool>(p.linetype()->scale); return;}
}
-#line 517 "runtime.in"
+#line 524 "runtime.in"
// bool adjust(pen p);
void gen_runtime47(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 518 "runtime.in"
+#line 525 "runtime.in"
{Stack->push<bool>(p.linetype()->adjust); return;}
}
-#line 522 "runtime.in"
+#line 529 "runtime.in"
// pen adjust(pen p, real arclength, bool cyclic);
void gen_runtime48(stack *Stack)
{
bool cyclic=vm::pop<bool>(Stack);
real arclength=vm::pop<real>(Stack);
pen p=vm::pop<pen>(Stack);
-#line 523 "runtime.in"
+#line 530 "runtime.in"
{Stack->push<pen>(adjustdash(p,arclength,cyclic)); return;}
}
-#line 527 "runtime.in"
+#line 534 "runtime.in"
// pen linecap(Int n);
void gen_runtime49(stack *Stack)
{
Int n=vm::pop<Int>(Stack);
-#line 528 "runtime.in"
+#line 535 "runtime.in"
{Stack->push<pen>(pen(setlinecap,n >= 0 && n < nCap ? n : DEFCAP)); return;}
}
-#line 532 "runtime.in"
+#line 539 "runtime.in"
// Int linecap(pen p=CURRENTPEN);
void gen_runtime50(stack *Stack)
{
pen p=vm::pop<pen>(Stack,CURRENTPEN);
-#line 533 "runtime.in"
+#line 540 "runtime.in"
{Stack->push<Int>(p.cap()); return;}
}
-#line 537 "runtime.in"
+#line 544 "runtime.in"
// pen linejoin(Int n);
void gen_runtime51(stack *Stack)
{
Int n=vm::pop<Int>(Stack);
-#line 538 "runtime.in"
+#line 545 "runtime.in"
{Stack->push<pen>(pen(setlinejoin,n >= 0 && n < nJoin ? n : DEFJOIN)); return;}
}
-#line 542 "runtime.in"
+#line 549 "runtime.in"
// Int linejoin(pen p=CURRENTPEN);
void gen_runtime52(stack *Stack)
{
pen p=vm::pop<pen>(Stack,CURRENTPEN);
-#line 543 "runtime.in"
+#line 550 "runtime.in"
{Stack->push<Int>(p.join()); return;}
}
-#line 547 "runtime.in"
+#line 554 "runtime.in"
// pen miterlimit(real x);
void gen_runtime53(stack *Stack)
{
real x=vm::pop<real>(Stack);
-#line 548 "runtime.in"
+#line 555 "runtime.in"
{Stack->push<pen>(pen(setmiterlimit,x >= 1.0 ? x : DEFJOIN)); return;}
}
-#line 552 "runtime.in"
+#line 559 "runtime.in"
// real miterlimit(pen p=CURRENTPEN);
void gen_runtime54(stack *Stack)
{
pen p=vm::pop<pen>(Stack,CURRENTPEN);
-#line 553 "runtime.in"
+#line 560 "runtime.in"
{Stack->push<real>(p.miter()); return;}
}
-#line 557 "runtime.in"
+#line 564 "runtime.in"
// pen linewidth(real x);
void gen_runtime55(stack *Stack)
{
real x=vm::pop<real>(Stack);
-#line 558 "runtime.in"
+#line 565 "runtime.in"
{Stack->push<pen>(pen(setlinewidth,x >= 0.0 ? x : DEFWIDTH)); return;}
}
-#line 562 "runtime.in"
+#line 569 "runtime.in"
// real linewidth(pen p=CURRENTPEN);
void gen_runtime56(stack *Stack)
{
pen p=vm::pop<pen>(Stack,CURRENTPEN);
-#line 563 "runtime.in"
+#line 570 "runtime.in"
{Stack->push<real>(p.width()); return;}
}
-#line 567 "runtime.in"
+#line 574 "runtime.in"
// pen fontcommand(string *s);
void gen_runtime57(stack *Stack)
{
string * s=vm::pop<string *>(Stack);
-#line 568 "runtime.in"
+#line 575 "runtime.in"
{Stack->push<pen>(pen(setfont,*s)); return;}
}
-#line 572 "runtime.in"
+#line 579 "runtime.in"
// string font(pen p=CURRENTPEN);
void gen_runtime58(stack *Stack)
{
pen p=vm::pop<pen>(Stack,CURRENTPEN);
-#line 573 "runtime.in"
+#line 580 "runtime.in"
{Stack->push<string>(p.Font()); return;}
}
-#line 577 "runtime.in"
+#line 584 "runtime.in"
// pen fontsize(real size, real lineskip);
void gen_runtime59(stack *Stack)
{
real lineskip=vm::pop<real>(Stack);
real size=vm::pop<real>(Stack);
-#line 578 "runtime.in"
+#line 585 "runtime.in"
{Stack->push<pen>(pen(setfontsize,size > 0.0 ? size : 0.0,
lineskip > 0.0 ? lineskip : 0.0)); return;}
}
-#line 583 "runtime.in"
+#line 590 "runtime.in"
// real fontsize(pen p=CURRENTPEN);
void gen_runtime60(stack *Stack)
{
pen p=vm::pop<pen>(Stack,CURRENTPEN);
-#line 584 "runtime.in"
+#line 591 "runtime.in"
{Stack->push<real>(p.size()); return;}
}
-#line 588 "runtime.in"
+#line 595 "runtime.in"
// real lineskip(pen p=CURRENTPEN);
void gen_runtime61(stack *Stack)
{
pen p=vm::pop<pen>(Stack,CURRENTPEN);
-#line 589 "runtime.in"
+#line 596 "runtime.in"
{Stack->push<real>(p.Lineskip()); return;}
}
-#line 593 "runtime.in"
+#line 600 "runtime.in"
// pen overwrite(Int n);
void gen_runtime62(stack *Stack)
{
Int n=vm::pop<Int>(Stack);
-#line 594 "runtime.in"
+#line 601 "runtime.in"
{Stack->push<pen>(pen(setoverwrite,n >= 0 && n < nOverwrite ? (overwrite_t) n :
DEFWRITE)); return;}
}
-#line 599 "runtime.in"
+#line 606 "runtime.in"
// Int overwrite(pen p=CURRENTPEN);
void gen_runtime63(stack *Stack)
{
pen p=vm::pop<pen>(Stack,CURRENTPEN);
-#line 600 "runtime.in"
+#line 607 "runtime.in"
{Stack->push<Int>(p.Overwrite()); return;}
}
-#line 604 "runtime.in"
+#line 611 "runtime.in"
// pen basealign(Int n);
void gen_runtime64(stack *Stack)
{
Int n=vm::pop<Int>(Stack);
-#line 605 "runtime.in"
+#line 612 "runtime.in"
{Stack->push<pen>(pen(n >= 0 && n < nBaseLine ? (BaseLine) n : DEFBASE)); return;}
}
-#line 609 "runtime.in"
+#line 616 "runtime.in"
// Int basealign(pen p=CURRENTPEN);
void gen_runtime65(stack *Stack)
{
pen p=vm::pop<pen>(Stack,CURRENTPEN);
-#line 610 "runtime.in"
+#line 617 "runtime.in"
{Stack->push<Int>(p.Baseline()); return;}
}
-#line 614 "runtime.in"
+#line 621 "runtime.in"
// transform transform(pen p);
void gen_runtime66(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 615 "runtime.in"
+#line 622 "runtime.in"
{Stack->push<transform>(p.getTransform()); return;}
}
-#line 619 "runtime.in"
+#line 626 "runtime.in"
// path nib(pen p);
void gen_runtime67(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 620 "runtime.in"
+#line 627 "runtime.in"
{Stack->push<path>(p.Path()); return;}
}
-#line 624 "runtime.in"
+#line 631 "runtime.in"
// pen makepen(path p);
void gen_runtime68(stack *Stack)
{
path p=vm::pop<path>(Stack);
-#line 625 "runtime.in"
+#line 632 "runtime.in"
{Stack->push<pen>(pen(p)); return;}
}
-#line 629 "runtime.in"
+#line 636 "runtime.in"
// pen colorless(pen p);
void gen_runtime69(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
-#line 630 "runtime.in"
+#line 637 "runtime.in"
p.colorless();
{Stack->push<pen>(p); return;}
}
// Interactive mode
-#line 636 "runtime.in"
+#line 643 "runtime.in"
// bool interactive();
void gen_runtime70(stack *Stack)
{
-#line 637 "runtime.in"
+#line 644 "runtime.in"
{Stack->push<bool>(interact::interactive); return;}
}
-#line 642 "runtime.in"
+#line 649 "runtime.in"
// bool uptodate();
void gen_runtime71(stack *Stack)
{
-#line 643 "runtime.in"
+#line 650 "runtime.in"
{Stack->push<bool>(interact::uptodate); return;}
}
// System commands
-#line 649 "runtime.in"
+#line 656 "runtime.in"
// Int system(stringarray *s);
void gen_runtime72(stack *Stack)
{
stringarray * s=vm::pop<stringarray *>(Stack);
-#line 650 "runtime.in"
+#line 657 "runtime.in"
if(safe) error("system() call disabled; override with option -nosafe");
size_t size=checkArray(s);
if(size == 0) {Stack->push<Int>(0); return;}
@@ -966,57 +973,57 @@ void gen_runtime72(stack *Stack)
{Stack->push<Int>(System(cmd)); return;}
}
-#line 661 "runtime.in"
+#line 668 "runtime.in"
// bool view();
void gen_runtime73(stack *Stack)
{
-#line 662 "runtime.in"
+#line 669 "runtime.in"
{Stack->push<bool>(view()); return;}
}
-#line 666 "runtime.in"
+#line 673 "runtime.in"
// string asydir();
void gen_runtime74(stack *Stack)
{
-#line 667 "runtime.in"
+#line 674 "runtime.in"
{Stack->push<string>(systemDir); return;}
}
-#line 671 "runtime.in"
+#line 678 "runtime.in"
// string locale(string s=emptystring);
void gen_runtime75(stack *Stack)
{
string s=vm::pop<string>(Stack,emptystring);
-#line 672 "runtime.in"
+#line 679 "runtime.in"
char *L=setlocale(LC_ALL,s.empty() ? NULL : s.c_str());
{Stack->push<string>(L != NULL ? string(L) : ""); return;}
}
-#line 677 "runtime.in"
+#line 684 "runtime.in"
// void abort(string s=emptystring);
void gen_runtime76(stack *Stack)
{
string s=vm::pop<string>(Stack,emptystring);
-#line 678 "runtime.in"
+#line 685 "runtime.in"
if(s.empty()) throw handled_error();
error(s.c_str());
}
-#line 683 "runtime.in"
+#line 690 "runtime.in"
// void exit();
void gen_runtime77(stack *)
{
-#line 684 "runtime.in"
+#line 691 "runtime.in"
throw quit();
}
-#line 688 "runtime.in"
+#line 695 "runtime.in"
// void assert(bool b, string s=emptystring);
void gen_runtime78(stack *Stack)
{
string s=vm::pop<string>(Stack,emptystring);
bool b=vm::pop<bool>(Stack);
-#line 689 "runtime.in"
+#line 696 "runtime.in"
flush(cout);
if(!b) {
ostringstream buf;
@@ -1026,34 +1033,34 @@ void gen_runtime78(stack *Stack)
}
}
-#line 699 "runtime.in"
+#line 706 "runtime.in"
// void sleep(Int seconds);
void gen_runtime79(stack *Stack)
{
Int seconds=vm::pop<Int>(Stack);
-#line 700 "runtime.in"
+#line 707 "runtime.in"
if(seconds <= 0) return;
sleep(seconds);
}
-#line 705 "runtime.in"
+#line 712 "runtime.in"
// void usleep(Int microseconds);
void gen_runtime80(stack *Stack)
{
Int microseconds=vm::pop<Int>(Stack);
-#line 706 "runtime.in"
+#line 713 "runtime.in"
if(microseconds <= 0) return;
usleep((unsigned long) microseconds);
}
-#line 711 "runtime.in"
+#line 718 "runtime.in"
// void _eval(string *s, bool embedded, bool interactiveWrite=false);
void gen_runtime81(stack *Stack)
{
bool interactiveWrite=vm::pop<bool>(Stack,false);
bool embedded=vm::pop<bool>(Stack);
string * s=vm::pop<string *>(Stack);
-#line 712 "runtime.in"
+#line 719 "runtime.in"
if(embedded) {
trans::coenv *e=Stack->getEnvironment();
vm::interactiveStack *is=dynamic_cast<vm::interactiveStack *>(Stack);
@@ -1065,13 +1072,13 @@ void gen_runtime81(stack *Stack)
runString(*s,interactiveWrite);
}
-#line 724 "runtime.in"
+#line 731 "runtime.in"
// void _eval(runnable *s, bool embedded);
void gen_runtime82(stack *Stack)
{
bool embedded=vm::pop<bool>(Stack);
runnable * s=vm::pop<runnable *>(Stack);
-#line 725 "runtime.in"
+#line 732 "runtime.in"
absyntax::block *ast=new absyntax::block(s->getPos(), false);
ast->add(s);
@@ -1086,31 +1093,59 @@ void gen_runtime82(stack *Stack)
runCode(ast);
}
-#line 740 "runtime.in"
-// string location();
+#line 747 "runtime.in"
+// string xasyKEY();
void gen_runtime83(stack *Stack)
{
-#line 741 "runtime.in"
+#line 748 "runtime.in"
+ processDataStruct *P=&processData();
+ xkey_t *xkey=&P->xkey;
+ xkey_t::iterator p=xkey->find(P->topPos.LineColumn());
+ {Stack->push<string>(p != xkey->end() ? p->second+" 1" : toplocation()+" 0"); return;}
+}
+
+#line 754 "runtime.in"
+// void xasyKEY(string *s);
+void gen_runtime84(stack *Stack)
+{
+ string * s=vm::pop<string *>(Stack);
+#line 755 "runtime.in"
+ processData().KEY=*s;
+}
+
+#line 758 "runtime.in"
+// string toplocation();
+void gen_runtime85(stack *Stack)
+{
+#line 759 "runtime.in"
+ {Stack->push<string>(toplocation()); return;}
+}
+
+#line 762 "runtime.in"
+// string location();
+void gen_runtime86(stack *Stack)
+{
+#line 763 "runtime.in"
ostringstream buf;
buf << getPos();
{Stack->push<string>(buf.str()); return;}
}
// Wrapper for the stack::load() method.
-#line 747 "runtime.in"
+#line 769 "runtime.in"
void loadModule(stack *Stack)
{
string * index=vm::pop<string *>(Stack);
-#line 748 "runtime.in"
+#line 770 "runtime.in"
Stack->load(*index);
}
-#line 752 "runtime.in"
+#line 774 "runtime.in"
// string cd(string s=emptystring);
-void gen_runtime85(stack *Stack)
+void gen_runtime88(stack *Stack)
{
string s=vm::pop<string>(Stack,emptystring);
-#line 753 "runtime.in"
+#line 775 "runtime.in"
if(!s.empty() && !globalwrite()) {
string outname=getSetting<string>("outname");
string dir=stripDir(outname);
@@ -1119,13 +1154,13 @@ void gen_runtime85(stack *Stack)
{Stack->push<string>(setPath(s.c_str())); return;}
}
-#line 762 "runtime.in"
+#line 784 "runtime.in"
// void list(string *s, bool imports=false);
-void gen_runtime86(stack *Stack)
+void gen_runtime89(stack *Stack)
{
bool imports=vm::pop<bool>(Stack,false);
string * s=vm::pop<string *>(Stack);
-#line 763 "runtime.in"
+#line 785 "runtime.in"
if(*s == "-") return;
trans::genv ge;
symbol name=symbol::trans(*s);
@@ -1135,18 +1170,18 @@ void gen_runtime86(stack *Stack)
// Guide operations
-#line 773 "runtime.in"
+#line 795 "runtime.in"
void nullGuide(stack *Stack)
{
-#line 774 "runtime.in"
+#line 796 "runtime.in"
{Stack->push<guide*>(new pathguide(path())); return;}
}
-#line 779 "runtime.in"
+#line 801 "runtime.in"
void dotsGuide(stack *Stack)
{
guidearray * a=vm::pop<guidearray *>(Stack);
-#line 780 "runtime.in"
+#line 802 "runtime.in"
guidevector v;
size_t size=checkArray(a);
for (size_t i=0; i < size; ++i)
@@ -1155,11 +1190,11 @@ void dotsGuide(stack *Stack)
{Stack->push<guide*>(new multiguide(v)); return;}
}
-#line 789 "runtime.in"
+#line 811 "runtime.in"
void dashesGuide(stack *Stack)
{
guidearray * a=vm::pop<guidearray *>(Stack);
-#line 790 "runtime.in"
+#line 812 "runtime.in"
static camp::curlSpec curly;
static camp::specguide curlout(&curly, camp::OUT);
static camp::specguide curlin(&curly, camp::IN);
@@ -1185,179 +1220,179 @@ void dashesGuide(stack *Stack)
{Stack->push<guide*>(new multiguide(v)); return;}
}
-#line 816 "runtime.in"
+#line 838 "runtime.in"
void newCycleToken(stack *Stack)
{
-#line 817 "runtime.in"
+#line 839 "runtime.in"
{Stack->push<cycleToken>(cycleToken()); return;}
}
-#line 821 "runtime.in"
+#line 843 "runtime.in"
// guide* operator cast(cycleToken tok);
-void gen_runtime91(stack *Stack)
+void gen_runtime94(stack *Stack)
{
cycleToken tok=vm::pop<cycleToken>(Stack);
-#line 822 "runtime.in"
+#line 844 "runtime.in"
// Avoid unused variable warning messages.
unused(&tok);
{Stack->push<guide*>(new cycletokguide()); return;}
}
-#line 828 "runtime.in"
+#line 850 "runtime.in"
// guide* operator spec(pair z, Int p);
-void gen_runtime92(stack *Stack)
+void gen_runtime95(stack *Stack)
{
Int p=vm::pop<Int>(Stack);
pair z=vm::pop<pair>(Stack);
-#line 829 "runtime.in"
+#line 851 "runtime.in"
camp::side d=(camp::side) p;
camp::dirSpec *sp=new camp::dirSpec(z);
{Stack->push<guide*>(new specguide(sp,d)); return;}
}
-#line 836 "runtime.in"
+#line 858 "runtime.in"
// curlSpecifier operator curl(real gamma, Int p);
-void gen_runtime93(stack *Stack)
+void gen_runtime96(stack *Stack)
{
Int p=vm::pop<Int>(Stack);
real gamma=vm::pop<real>(Stack);
-#line 837 "runtime.in"
+#line 859 "runtime.in"
camp::side s=(camp::side) p;
{Stack->push<curlSpecifier>(curlSpecifier(gamma,s)); return;}
}
-#line 842 "runtime.in"
+#line 864 "runtime.in"
void curlSpecifierValuePart(stack *Stack)
{
curlSpecifier spec=vm::pop<curlSpecifier>(Stack);
-#line 843 "runtime.in"
+#line 865 "runtime.in"
{Stack->push<real>(spec.getValue()); return;}
}
-#line 847 "runtime.in"
+#line 869 "runtime.in"
void curlSpecifierSidePart(stack *Stack)
{
curlSpecifier spec=vm::pop<curlSpecifier>(Stack);
-#line 848 "runtime.in"
+#line 870 "runtime.in"
{Stack->push<Int>(spec.getSide()); return;}
}
-#line 852 "runtime.in"
+#line 874 "runtime.in"
// guide* operator cast(curlSpecifier spec);
-void gen_runtime96(stack *Stack)
+void gen_runtime99(stack *Stack)
{
curlSpecifier spec=vm::pop<curlSpecifier>(Stack);
-#line 853 "runtime.in"
+#line 875 "runtime.in"
{Stack->push<guide*>(new specguide(spec)); return;}
}
-#line 857 "runtime.in"
+#line 879 "runtime.in"
// tensionSpecifier operator tension(real tout, real tin, bool atleast);
-void gen_runtime97(stack *Stack)
+void gen_runtime100(stack *Stack)
{
bool atleast=vm::pop<bool>(Stack);
real tin=vm::pop<real>(Stack);
real tout=vm::pop<real>(Stack);
-#line 858 "runtime.in"
+#line 880 "runtime.in"
{Stack->push<tensionSpecifier>(tensionSpecifier(tout, tin, atleast)); return;}
}
-#line 862 "runtime.in"
+#line 884 "runtime.in"
void tensionSpecifierOutPart(stack *Stack)
{
tensionSpecifier t=vm::pop<tensionSpecifier>(Stack);
-#line 863 "runtime.in"
+#line 885 "runtime.in"
{Stack->push<real>(t.getOut()); return;}
}
-#line 867 "runtime.in"
+#line 889 "runtime.in"
void tensionSpecifierInPart(stack *Stack)
{
tensionSpecifier t=vm::pop<tensionSpecifier>(Stack);
-#line 868 "runtime.in"
+#line 890 "runtime.in"
{Stack->push<real>(t.getIn()); return;}
}
-#line 872 "runtime.in"
+#line 894 "runtime.in"
void tensionSpecifierAtleastPart(stack *Stack)
{
tensionSpecifier t=vm::pop<tensionSpecifier>(Stack);
-#line 873 "runtime.in"
+#line 895 "runtime.in"
{Stack->push<bool>(t.getAtleast()); return;}
}
-#line 877 "runtime.in"
+#line 899 "runtime.in"
// guide* operator cast(tensionSpecifier t);
-void gen_runtime101(stack *Stack)
+void gen_runtime104(stack *Stack)
{
tensionSpecifier t=vm::pop<tensionSpecifier>(Stack);
-#line 878 "runtime.in"
+#line 900 "runtime.in"
{Stack->push<guide*>(new tensionguide(t)); return;}
}
-#line 882 "runtime.in"
+#line 904 "runtime.in"
// guide* operator controls(pair zout, pair zin);
-void gen_runtime102(stack *Stack)
+void gen_runtime105(stack *Stack)
{
pair zin=vm::pop<pair>(Stack);
pair zout=vm::pop<pair>(Stack);
-#line 883 "runtime.in"
+#line 905 "runtime.in"
{Stack->push<guide*>(new controlguide(zout, zin)); return;}
}
-#line 887 "runtime.in"
+#line 909 "runtime.in"
// Int size(guide *g);
-void gen_runtime103(stack *Stack)
+void gen_runtime106(stack *Stack)
{
guide * g=vm::pop<guide *>(Stack);
-#line 888 "runtime.in"
+#line 910 "runtime.in"
flatguide f;
g->flatten(f,false);
{Stack->push<Int>(f.size()); return;}
}
-#line 894 "runtime.in"
+#line 916 "runtime.in"
// Int length(guide *g);
-void gen_runtime104(stack *Stack)
+void gen_runtime107(stack *Stack)
{
guide * g=vm::pop<guide *>(Stack);
-#line 895 "runtime.in"
+#line 917 "runtime.in"
flatguide f;
g->flatten(f,false);
{Stack->push<Int>(g->cyclic() ? f.size() : f.size()-1); return;}
}
-#line 901 "runtime.in"
+#line 923 "runtime.in"
// bool cyclic(guide *g);
-void gen_runtime105(stack *Stack)
+void gen_runtime108(stack *Stack)
{
guide * g=vm::pop<guide *>(Stack);
-#line 902 "runtime.in"
+#line 924 "runtime.in"
flatguide f;
g->flatten(f,false);
{Stack->push<bool>(g->cyclic()); return;}
}
-#line 908 "runtime.in"
+#line 930 "runtime.in"
// pair point(guide *g, Int t);
-void gen_runtime106(stack *Stack)
+void gen_runtime109(stack *Stack)
{
Int t=vm::pop<Int>(Stack);
guide * g=vm::pop<guide *>(Stack);
-#line 909 "runtime.in"
+#line 931 "runtime.in"
flatguide f;
g->flatten(f,false);
{Stack->push<pair>(f.Nodes(adjustedIndex(t,f.size(),g->cyclic())).z); return;}
}
-#line 915 "runtime.in"
+#line 937 "runtime.in"
// pairarray* dirSpecifier(guide *g, Int t);
-void gen_runtime107(stack *Stack)
+void gen_runtime110(stack *Stack)
{
Int t=vm::pop<Int>(Stack);
guide * g=vm::pop<guide *>(Stack);
-#line 916 "runtime.in"
+#line 938 "runtime.in"
flatguide f;
g->flatten(f,false);
Int n=f.size();
@@ -1368,13 +1403,13 @@ void gen_runtime107(stack *Stack)
{Stack->push<pairarray*>(c); return;}
}
-#line 927 "runtime.in"
+#line 949 "runtime.in"
// pairarray* controlSpecifier(guide *g, Int t);
-void gen_runtime108(stack *Stack)
+void gen_runtime111(stack *Stack)
{
Int t=vm::pop<Int>(Stack);
guide * g=vm::pop<guide *>(Stack);
-#line 928 "runtime.in"
+#line 950 "runtime.in"
flatguide f;
g->flatten(f,false);
Int n=f.size();
@@ -1390,13 +1425,13 @@ void gen_runtime108(stack *Stack)
} else {Stack->push<pairarray*>(new array(0)); return;}
}
-#line 944 "runtime.in"
+#line 966 "runtime.in"
// tensionSpecifier tensionSpecifier(guide *g, Int t);
-void gen_runtime109(stack *Stack)
+void gen_runtime112(stack *Stack)
{
Int t=vm::pop<Int>(Stack);
guide * g=vm::pop<guide *>(Stack);
-#line 945 "runtime.in"
+#line 967 "runtime.in"
flatguide f;
g->flatten(f,false);
Int n=f.size();
@@ -1405,13 +1440,13 @@ void gen_runtime109(stack *Stack)
{Stack->push<tensionSpecifier>(tensionSpecifier(curr.tout.val,f.Nodes(t+1).tin.val,curr.tout.atleast)); return;}
}
-#line 954 "runtime.in"
+#line 976 "runtime.in"
// realarray* curlSpecifier(guide *g, Int t);
-void gen_runtime110(stack *Stack)
+void gen_runtime113(stack *Stack)
{
Int t=vm::pop<Int>(Stack);
guide * g=vm::pop<guide *>(Stack);
-#line 955 "runtime.in"
+#line 977 "runtime.in"
flatguide f;
g->flatten(f,false);
Int n=f.size();
@@ -1424,12 +1459,12 @@ void gen_runtime110(stack *Stack)
{Stack->push<realarray*>(c); return;}
}
-#line 968 "runtime.in"
+#line 990 "runtime.in"
// guide* reverse(guide *g);
-void gen_runtime111(stack *Stack)
+void gen_runtime114(stack *Stack)
{
guide * g=vm::pop<guide *>(Stack);
-#line 969 "runtime.in"
+#line 991 "runtime.in"
flatguide f;
g->flatten(f,false);
if(f.precyclic())
@@ -1480,11 +1515,11 @@ void gen_runtime111(stack *Stack)
{Stack->push<guide*>(new multiguide(v)); return;}
}
-#line 1021 "runtime.in"
+#line 1043 "runtime.in"
// realarray* _cputime();
-void gen_runtime112(stack *Stack)
+void gen_runtime115(stack *Stack)
{
-#line 1022 "runtime.in"
+#line 1044 "runtime.in"
static const real ticktime=1.0/sysconf(_SC_CLK_TCK);
struct tms buf;
@@ -1499,103 +1534,103 @@ void gen_runtime112(stack *Stack)
// Transforms
-#line 1037 "runtime.in"
+#line 1059 "runtime.in"
// bool ==(transform a, transform b);
-void gen_runtime113(stack *Stack)
+void gen_runtime116(stack *Stack)
{
transform b=vm::pop<transform>(Stack);
transform a=vm::pop<transform>(Stack);
-#line 1038 "runtime.in"
+#line 1060 "runtime.in"
{Stack->push<bool>(a == b); return;}
}
-#line 1043 "runtime.in"
+#line 1065 "runtime.in"
// bool !=(transform a, transform b);
-void gen_runtime114(stack *Stack)
+void gen_runtime117(stack *Stack)
{
transform b=vm::pop<transform>(Stack);
transform a=vm::pop<transform>(Stack);
-#line 1044 "runtime.in"
+#line 1066 "runtime.in"
{Stack->push<bool>(a != b); return;}
}
-#line 1048 "runtime.in"
+#line 1070 "runtime.in"
// transform +(transform a, transform b);
-void gen_runtime115(stack *Stack)
+void gen_runtime118(stack *Stack)
{
transform b=vm::pop<transform>(Stack);
transform a=vm::pop<transform>(Stack);
-#line 1049 "runtime.in"
+#line 1071 "runtime.in"
{Stack->push<transform>(a+b); return;}
}
-#line 1053 "runtime.in"
+#line 1075 "runtime.in"
// transform *(transform a, transform b);
-void gen_runtime116(stack *Stack)
+void gen_runtime119(stack *Stack)
{
transform b=vm::pop<transform>(Stack);
transform a=vm::pop<transform>(Stack);
-#line 1054 "runtime.in"
+#line 1076 "runtime.in"
{Stack->push<transform>(a*b); return;}
}
-#line 1058 "runtime.in"
+#line 1080 "runtime.in"
// pair *(transform t, pair z);
-void gen_runtime117(stack *Stack)
+void gen_runtime120(stack *Stack)
{
pair z=vm::pop<pair>(Stack);
transform t=vm::pop<transform>(Stack);
-#line 1059 "runtime.in"
+#line 1081 "runtime.in"
{Stack->push<pair>(t*z); return;}
}
-#line 1063 "runtime.in"
+#line 1085 "runtime.in"
// path *(transform t, path g);
-void gen_runtime118(stack *Stack)
+void gen_runtime121(stack *Stack)
{
path g=vm::pop<path>(Stack);
transform t=vm::pop<transform>(Stack);
-#line 1064 "runtime.in"
+#line 1086 "runtime.in"
{Stack->push<path>(transformed(t,g)); return;}
}
-#line 1068 "runtime.in"
+#line 1090 "runtime.in"
// pen *(transform t, pen p);
-void gen_runtime119(stack *Stack)
+void gen_runtime122(stack *Stack)
{
pen p=vm::pop<pen>(Stack);
transform t=vm::pop<transform>(Stack);
-#line 1069 "runtime.in"
+#line 1091 "runtime.in"
{Stack->push<pen>(transformed(t,p)); return;}
}
-#line 1073 "runtime.in"
+#line 1095 "runtime.in"
// picture* *(transform t, picture *f);
-void gen_runtime120(stack *Stack)
+void gen_runtime123(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
transform t=vm::pop<transform>(Stack);
-#line 1074 "runtime.in"
+#line 1096 "runtime.in"
{Stack->push<picture*>(transformed(t,f)); return;}
}
-#line 1078 "runtime.in"
+#line 1100 "runtime.in"
// picture* *(realarray2 *t, picture *f);
-void gen_runtime121(stack *Stack)
+void gen_runtime124(stack *Stack)
{
picture * f=vm::pop<picture *>(Stack);
realarray2 * t=vm::pop<realarray2 *>(Stack);
-#line 1079 "runtime.in"
+#line 1101 "runtime.in"
{Stack->push<picture*>(transformed(*t,f)); return;}
}
-#line 1083 "runtime.in"
+#line 1105 "runtime.in"
// transform ^(transform t, Int n);
-void gen_runtime122(stack *Stack)
+void gen_runtime125(stack *Stack)
{
Int n=vm::pop<Int>(Stack);
transform t=vm::pop<transform>(Stack);
-#line 1084 "runtime.in"
+#line 1106 "runtime.in"
transform T;
if(n < 0) {
n=-n;
@@ -1605,55 +1640,55 @@ void gen_runtime122(stack *Stack)
{Stack->push<transform>(T); return;}
}
-#line 1094 "runtime.in"
+#line 1116 "runtime.in"
void transformXPart(stack *Stack)
{
transform t=vm::pop<transform>(Stack);
-#line 1095 "runtime.in"
+#line 1117 "runtime.in"
{Stack->push<real>(t.getx()); return;}
}
-#line 1099 "runtime.in"
+#line 1121 "runtime.in"
void transformYPart(stack *Stack)
{
transform t=vm::pop<transform>(Stack);
-#line 1100 "runtime.in"
+#line 1122 "runtime.in"
{Stack->push<real>(t.gety()); return;}
}
-#line 1104 "runtime.in"
+#line 1126 "runtime.in"
void transformXXPart(stack *Stack)
{
transform t=vm::pop<transform>(Stack);
-#line 1105 "runtime.in"
+#line 1127 "runtime.in"
{Stack->push<real>(t.getxx()); return;}
}
-#line 1109 "runtime.in"
+#line 1131 "runtime.in"
void transformXYPart(stack *Stack)
{
transform t=vm::pop<transform>(Stack);
-#line 1110 "runtime.in"
+#line 1132 "runtime.in"
{Stack->push<real>(t.getxy()); return;}
}
-#line 1114 "runtime.in"
+#line 1136 "runtime.in"
void transformYXPart(stack *Stack)
{
transform t=vm::pop<transform>(Stack);
-#line 1115 "runtime.in"
+#line 1137 "runtime.in"
{Stack->push<real>(t.getyx()); return;}
}
-#line 1119 "runtime.in"
+#line 1141 "runtime.in"
void transformYYPart(stack *Stack)
{
transform t=vm::pop<transform>(Stack);
-#line 1120 "runtime.in"
+#line 1142 "runtime.in"
{Stack->push<real>(t.getyy()); return;}
}
-#line 1124 "runtime.in"
+#line 1146 "runtime.in"
void real6ToTransform(stack *Stack)
{
real yy=vm::pop<real>(Stack);
@@ -1662,127 +1697,127 @@ void real6ToTransform(stack *Stack)
real xx=vm::pop<real>(Stack);
real y=vm::pop<real>(Stack);
real x=vm::pop<real>(Stack);
-#line 1126 "runtime.in"
+#line 1148 "runtime.in"
{Stack->push<transform>(transform(x,y,xx,xy,yx,yy)); return;}
}
-#line 1130 "runtime.in"
+#line 1152 "runtime.in"
// transform shift(transform t);
-void gen_runtime130(stack *Stack)
+void gen_runtime133(stack *Stack)
{
transform t=vm::pop<transform>(Stack);
-#line 1131 "runtime.in"
+#line 1153 "runtime.in"
{Stack->push<transform>(transform(t.getx(),t.gety(),0,0,0,0)); return;}
}
-#line 1135 "runtime.in"
+#line 1157 "runtime.in"
// transform shiftless(transform t);
-void gen_runtime131(stack *Stack)
+void gen_runtime134(stack *Stack)
{
transform t=vm::pop<transform>(Stack);
-#line 1136 "runtime.in"
+#line 1158 "runtime.in"
{Stack->push<transform>(transform(0,0,t.getxx(),t.getxy(),t.getyx(),t.getyy())); return;}
}
-#line 1140 "runtime.in"
+#line 1162 "runtime.in"
// transform identity();
void transformIdentity(stack *Stack)
{
-#line 1141 "runtime.in"
+#line 1163 "runtime.in"
{Stack->push<transform>(identity); return;}
}
-#line 1145 "runtime.in"
+#line 1167 "runtime.in"
// transform inverse(transform t);
-void gen_runtime133(stack *Stack)
+void gen_runtime136(stack *Stack)
{
transform t=vm::pop<transform>(Stack);
-#line 1146 "runtime.in"
+#line 1168 "runtime.in"
{Stack->push<transform>(inverse(t)); return;}
}
-#line 1150 "runtime.in"
+#line 1172 "runtime.in"
// transform shift(pair z);
-void gen_runtime134(stack *Stack)
+void gen_runtime137(stack *Stack)
{
pair z=vm::pop<pair>(Stack);
-#line 1151 "runtime.in"
+#line 1173 "runtime.in"
{Stack->push<transform>(shift(z)); return;}
}
-#line 1155 "runtime.in"
+#line 1177 "runtime.in"
// transform shift(real x, real y);
-void gen_runtime135(stack *Stack)
+void gen_runtime138(stack *Stack)
{
real y=vm::pop<real>(Stack);
real x=vm::pop<real>(Stack);
-#line 1156 "runtime.in"
+#line 1178 "runtime.in"
{Stack->push<transform>(shift(pair(x,y))); return;}
}
-#line 1160 "runtime.in"
+#line 1182 "runtime.in"
// transform xscale(real x);
-void gen_runtime136(stack *Stack)
+void gen_runtime139(stack *Stack)
{
real x=vm::pop<real>(Stack);
-#line 1161 "runtime.in"
+#line 1183 "runtime.in"
{Stack->push<transform>(xscale(x)); return;}
}
-#line 1165 "runtime.in"
+#line 1187 "runtime.in"
// transform yscale(real y);
-void gen_runtime137(stack *Stack)
+void gen_runtime140(stack *Stack)
{
real y=vm::pop<real>(Stack);
-#line 1166 "runtime.in"
+#line 1188 "runtime.in"
{Stack->push<transform>(yscale(y)); return;}
}
-#line 1170 "runtime.in"
+#line 1192 "runtime.in"
// transform scale(real x);
-void gen_runtime138(stack *Stack)
+void gen_runtime141(stack *Stack)
{
real x=vm::pop<real>(Stack);
-#line 1171 "runtime.in"
+#line 1193 "runtime.in"
{Stack->push<transform>(scale(x)); return;}
}
-#line 1175 "runtime.in"
+#line 1197 "runtime.in"
// transform scale(real x, real y);
-void gen_runtime139(stack *Stack)
+void gen_runtime142(stack *Stack)
{
real y=vm::pop<real>(Stack);
real x=vm::pop<real>(Stack);
-#line 1176 "runtime.in"
+#line 1198 "runtime.in"
{Stack->push<transform>(scale(x,y)); return;}
}
-#line 1180 "runtime.in"
+#line 1202 "runtime.in"
// transform slant(real s);
-void gen_runtime140(stack *Stack)
+void gen_runtime143(stack *Stack)
{
real s=vm::pop<real>(Stack);
-#line 1181 "runtime.in"
+#line 1203 "runtime.in"
{Stack->push<transform>(slant(s)); return;}
}
-#line 1185 "runtime.in"
+#line 1207 "runtime.in"
// transform rotate(real angle, pair z=0);
-void gen_runtime141(stack *Stack)
+void gen_runtime144(stack *Stack)
{
pair z=vm::pop<pair>(Stack,0);
real angle=vm::pop<real>(Stack);
-#line 1186 "runtime.in"
+#line 1208 "runtime.in"
{Stack->push<transform>(rotatearound(z,radians(angle))); return;}
}
-#line 1190 "runtime.in"
+#line 1212 "runtime.in"
// transform reflect(pair a, pair b);
-void gen_runtime142(stack *Stack)
+void gen_runtime145(stack *Stack)
{
pair b=vm::pop<pair>(Stack);
pair a=vm::pop<pair>(Stack);
-#line 1191 "runtime.in"
+#line 1213 "runtime.in"
{Stack->push<transform>(reflectabout(a,b)); return;}
}
@@ -1792,292 +1827,298 @@ namespace trans {
void gen_runtime_venv(venv &ve)
{
-#line 225 "runtime.in"
+#line 232 "runtime.in"
REGISTER_BLTIN(run::IntZero,"IntZero");
-#line 233 "runtime.in"
+#line 240 "runtime.in"
REGISTER_BLTIN(run::realZero,"realZero");
-#line 238 "runtime.in"
+#line 245 "runtime.in"
REGISTER_BLTIN(run::boolFalse,"boolFalse");
-#line 243 "runtime.in"
+#line 250 "runtime.in"
addFunc(ve, run::gen_runtime3, primBoolean(), SYM(isnan), formal(primReal(), SYM(x), false, false));
-#line 248 "runtime.in"
+#line 255 "runtime.in"
REGISTER_BLTIN(run::pushNullArray,"pushNullArray");
-#line 253 "runtime.in"
+#line 260 "runtime.in"
REGISTER_BLTIN(run::pushNullRecord,"pushNullRecord");
-#line 258 "runtime.in"
+#line 265 "runtime.in"
REGISTER_BLTIN(run::pushNullFunction,"pushNullFunction");
-#line 263 "runtime.in"
+#line 270 "runtime.in"
REGISTER_BLTIN(run::pushDefault,"pushDefault");
-#line 273 "runtime.in"
- REGISTER_BLTIN(run::isDefault,"isDefault");
#line 280 "runtime.in"
+ REGISTER_BLTIN(run::isDefault,"isDefault");
+#line 287 "runtime.in"
REGISTER_BLTIN(run::pairToGuide,"pairToGuide");
-#line 288 "runtime.in"
+#line 295 "runtime.in"
REGISTER_BLTIN(run::pathToGuide,"pathToGuide");
-#line 293 "runtime.in"
+#line 300 "runtime.in"
REGISTER_BLTIN(run::guideToPath,"guideToPath");
-#line 298 "runtime.in"
+#line 305 "runtime.in"
REGISTER_BLTIN(run::newPen,"newPen");
-#line 306 "runtime.in"
+#line 313 "runtime.in"
addFunc(ve, run::gen_runtime13, primBoolean(), SYM_EQ, formal(primPen(), SYM(a), false, false), formal(primPen(), SYM(b), false, false));
-#line 311 "runtime.in"
+#line 318 "runtime.in"
addFunc(ve, run::gen_runtime14, primBoolean(), SYM_NEQ, formal(primPen(), SYM(a), false, false), formal(primPen(), SYM(b), false, false));
-#line 316 "runtime.in"
+#line 323 "runtime.in"
addFunc(ve, run::gen_runtime15, primPen(), SYM_PLUS, formal(primPen(), SYM(a), false, false), formal(primPen(), SYM(b), false, false));
-#line 321 "runtime.in"
+#line 328 "runtime.in"
addFunc(ve, run::gen_runtime16, primPen(), SYM_TIMES, formal(primReal(), SYM(a), false, false), formal(primPen(), SYM(b), false, false));
-#line 326 "runtime.in"
+#line 333 "runtime.in"
addFunc(ve, run::gen_runtime17, primPen(), SYM_TIMES, formal(primPen(), SYM(a), false, false), formal(primReal(), SYM(b), false, false));
-#line 331 "runtime.in"
+#line 338 "runtime.in"
addFunc(ve, run::gen_runtime18, primPair(), SYM(max), formal(primPen(), SYM(p), false, false));
-#line 336 "runtime.in"
+#line 343 "runtime.in"
addFunc(ve, run::gen_runtime19, primPair(), SYM(min), formal(primPen(), SYM(p), false, false));
-#line 341 "runtime.in"
+#line 348 "runtime.in"
addFunc(ve, run::gen_runtime20, primVoid(), SYM(resetdefaultpen));
-#line 347 "runtime.in"
+#line 354 "runtime.in"
addFunc(ve, run::gen_runtime21, primVoid(), SYM(defaultpen), formal(primPen(), SYM(p), false, false));
-#line 352 "runtime.in"
+#line 359 "runtime.in"
addFunc(ve, run::gen_runtime22, primPen(), SYM(defaultpen));
-#line 357 "runtime.in"
+#line 364 "runtime.in"
addFunc(ve, run::gen_runtime23, primBoolean(), SYM(invisible), formal(primPen(), SYM(p), false, false));
-#line 362 "runtime.in"
+#line 369 "runtime.in"
addFunc(ve, run::gen_runtime24, primPen(), SYM(invisible));
-#line 367 "runtime.in"
+#line 374 "runtime.in"
addFunc(ve, run::gen_runtime25, primPen(), SYM(gray), formal(primPen(), SYM(p), false, false));
-#line 373 "runtime.in"
+#line 380 "runtime.in"
addFunc(ve, run::gen_runtime26, primPen(), SYM(rgb), formal(primPen(), SYM(p), false, false));
-#line 379 "runtime.in"
+#line 386 "runtime.in"
addFunc(ve, run::gen_runtime27, primPen(), SYM(cmyk), formal(primPen(), SYM(p), false, false));
-#line 385 "runtime.in"
+#line 392 "runtime.in"
addFunc(ve, run::gen_runtime28, primPen(), SYM(interp), formal(primPen(), SYM(a), false, false), formal(primPen(), SYM(b), false, false), formal(primReal(), SYM(t), false, false));
-#line 390 "runtime.in"
+#line 397 "runtime.in"
addFunc(ve, run::gen_runtime29, primPen(), SYM(rgb), formal(primReal(), SYM(r), false, false), formal(primReal(), SYM(g), false, false), formal(primReal(), SYM(b), false, false));
-#line 395 "runtime.in"
+#line 402 "runtime.in"
addFunc(ve, run::gen_runtime30, primPen(), SYM(cmyk), formal(primReal(), SYM(c), false, false), formal(primReal(), SYM(m), false, false), formal(primReal(), SYM(y), false, false), formal(primReal(), SYM(k), false, false));
-#line 400 "runtime.in"
+#line 407 "runtime.in"
addFunc(ve, run::gen_runtime31, primPen(), SYM(gray), formal(primReal(), SYM(gray), false, false));
-#line 405 "runtime.in"
+#line 412 "runtime.in"
addFunc(ve, run::gen_runtime32, realArray(), SYM(colors), formal(primPen(), SYM(p), false, false));
-#line 433 "runtime.in"
+#line 440 "runtime.in"
addFunc(ve, run::gen_runtime33, primString() , SYM(hex), formal(primPen(), SYM(p), false, false));
-#line 438 "runtime.in"
+#line 445 "runtime.in"
addFunc(ve, run::gen_runtime34, primInt(), SYM(byte), formal(primReal(), SYM(x), false, false));
-#line 443 "runtime.in"
- addFunc(ve, run::gen_runtime35, primString() , SYM(colorspace), formal(primPen(), SYM(p), false, false));
#line 450 "runtime.in"
+ addFunc(ve, run::gen_runtime35, primString() , SYM(colorspace), formal(primPen(), SYM(p), false, false));
+#line 457 "runtime.in"
addFunc(ve, run::gen_runtime36, primPen(), SYM(pattern), formal(primString(), SYM(s), false, false));
-#line 455 "runtime.in"
+#line 462 "runtime.in"
addFunc(ve, run::gen_runtime37, primString() , SYM(pattern), formal(primPen(), SYM(p), false, false));
-#line 460 "runtime.in"
+#line 467 "runtime.in"
addFunc(ve, run::gen_runtime38, primPen(), SYM(fillrule), formal(primInt(), SYM(n), false, false));
-#line 465 "runtime.in"
+#line 472 "runtime.in"
addFunc(ve, run::gen_runtime39, primInt(), SYM(fillrule), formal(primPen(), SYM(p), false, false));
-#line 470 "runtime.in"
+#line 477 "runtime.in"
addFunc(ve, run::gen_runtime40, primPen(), SYM(opacity), formal(primReal(), SYM(opacity), true, false), formal(primString() , SYM(blend), true, false));
-#line 480 "runtime.in"
+#line 487 "runtime.in"
addFunc(ve, run::gen_runtime41, primReal(), SYM(opacity), formal(primPen(), SYM(p), false, false));
-#line 485 "runtime.in"
+#line 492 "runtime.in"
addFunc(ve, run::gen_runtime42, primString() , SYM(blend), formal(primPen(), SYM(p), false, false));
-#line 490 "runtime.in"
+#line 497 "runtime.in"
addFunc(ve, run::gen_runtime43, primPen(), SYM(linetype), formal(realArray(), SYM(pattern), false, false), formal(primReal(), SYM(offset), true, false), formal(primBoolean(), SYM(scale), true, false), formal(primBoolean(), SYM(adjust), true, false));
-#line 501 "runtime.in"
+#line 508 "runtime.in"
addFunc(ve, run::gen_runtime44, realArray(), SYM(linetype), formal(primPen(), SYM(p), true, false));
-#line 507 "runtime.in"
+#line 514 "runtime.in"
addFunc(ve, run::gen_runtime45, primReal(), SYM(offset), formal(primPen(), SYM(p), false, false));
-#line 512 "runtime.in"
+#line 519 "runtime.in"
addFunc(ve, run::gen_runtime46, primBoolean(), SYM(scale), formal(primPen(), SYM(p), false, false));
-#line 517 "runtime.in"
+#line 524 "runtime.in"
addFunc(ve, run::gen_runtime47, primBoolean(), SYM(adjust), formal(primPen(), SYM(p), false, false));
-#line 522 "runtime.in"
+#line 529 "runtime.in"
addFunc(ve, run::gen_runtime48, primPen(), SYM(adjust), formal(primPen(), SYM(p), false, false), formal(primReal(), SYM(arclength), false, false), formal(primBoolean(), SYM(cyclic), false, false));
-#line 527 "runtime.in"
+#line 534 "runtime.in"
addFunc(ve, run::gen_runtime49, primPen(), SYM(linecap), formal(primInt(), SYM(n), false, false));
-#line 532 "runtime.in"
+#line 539 "runtime.in"
addFunc(ve, run::gen_runtime50, primInt(), SYM(linecap), formal(primPen(), SYM(p), true, false));
-#line 537 "runtime.in"
+#line 544 "runtime.in"
addFunc(ve, run::gen_runtime51, primPen(), SYM(linejoin), formal(primInt(), SYM(n), false, false));
-#line 542 "runtime.in"
+#line 549 "runtime.in"
addFunc(ve, run::gen_runtime52, primInt(), SYM(linejoin), formal(primPen(), SYM(p), true, false));
-#line 547 "runtime.in"
+#line 554 "runtime.in"
addFunc(ve, run::gen_runtime53, primPen(), SYM(miterlimit), formal(primReal(), SYM(x), false, false));
-#line 552 "runtime.in"
+#line 559 "runtime.in"
addFunc(ve, run::gen_runtime54, primReal(), SYM(miterlimit), formal(primPen(), SYM(p), true, false));
-#line 557 "runtime.in"
+#line 564 "runtime.in"
addFunc(ve, run::gen_runtime55, primPen(), SYM(linewidth), formal(primReal(), SYM(x), false, false));
-#line 562 "runtime.in"
+#line 569 "runtime.in"
addFunc(ve, run::gen_runtime56, primReal(), SYM(linewidth), formal(primPen(), SYM(p), true, false));
-#line 567 "runtime.in"
+#line 574 "runtime.in"
addFunc(ve, run::gen_runtime57, primPen(), SYM(fontcommand), formal(primString(), SYM(s), false, false));
-#line 572 "runtime.in"
+#line 579 "runtime.in"
addFunc(ve, run::gen_runtime58, primString() , SYM(font), formal(primPen(), SYM(p), true, false));
-#line 577 "runtime.in"
+#line 584 "runtime.in"
addFunc(ve, run::gen_runtime59, primPen(), SYM(fontsize), formal(primReal(), SYM(size), false, false), formal(primReal(), SYM(lineskip), false, false));
-#line 583 "runtime.in"
+#line 590 "runtime.in"
addFunc(ve, run::gen_runtime60, primReal(), SYM(fontsize), formal(primPen(), SYM(p), true, false));
-#line 588 "runtime.in"
+#line 595 "runtime.in"
addFunc(ve, run::gen_runtime61, primReal(), SYM(lineskip), formal(primPen(), SYM(p), true, false));
-#line 593 "runtime.in"
+#line 600 "runtime.in"
addFunc(ve, run::gen_runtime62, primPen(), SYM(overwrite), formal(primInt(), SYM(n), false, false));
-#line 599 "runtime.in"
+#line 606 "runtime.in"
addFunc(ve, run::gen_runtime63, primInt(), SYM(overwrite), formal(primPen(), SYM(p), true, false));
-#line 604 "runtime.in"
+#line 611 "runtime.in"
addFunc(ve, run::gen_runtime64, primPen(), SYM(basealign), formal(primInt(), SYM(n), false, false));
-#line 609 "runtime.in"
+#line 616 "runtime.in"
addFunc(ve, run::gen_runtime65, primInt(), SYM(basealign), formal(primPen(), SYM(p), true, false));
-#line 614 "runtime.in"
+#line 621 "runtime.in"
addFunc(ve, run::gen_runtime66, primTransform(), SYM(transform), formal(primPen(), SYM(p), false, false));
-#line 619 "runtime.in"
+#line 626 "runtime.in"
addFunc(ve, run::gen_runtime67, primPath(), SYM(nib), formal(primPen(), SYM(p), false, false));
-#line 624 "runtime.in"
+#line 631 "runtime.in"
addFunc(ve, run::gen_runtime68, primPen(), SYM(makepen), formal(primPath(), SYM(p), false, false));
-#line 629 "runtime.in"
+#line 636 "runtime.in"
addFunc(ve, run::gen_runtime69, primPen(), SYM(colorless), formal(primPen(), SYM(p), false, false));
-#line 635 "runtime.in"
- addFunc(ve, run::gen_runtime70, primBoolean(), SYM(interactive));
#line 642 "runtime.in"
+ addFunc(ve, run::gen_runtime70, primBoolean(), SYM(interactive));
+#line 649 "runtime.in"
addFunc(ve, run::gen_runtime71, primBoolean(), SYM(uptodate));
-#line 647 "runtime.in"
+#line 654 "runtime.in"
addFunc(ve, run::gen_runtime72, primInt(), SYM(system), formal(stringArray(), SYM(s), false, false));
-#line 661 "runtime.in"
+#line 668 "runtime.in"
addFunc(ve, run::gen_runtime73, primBoolean(), SYM(view));
-#line 666 "runtime.in"
+#line 673 "runtime.in"
addFunc(ve, run::gen_runtime74, primString() , SYM(asydir));
-#line 671 "runtime.in"
+#line 678 "runtime.in"
addFunc(ve, run::gen_runtime75, primString() , SYM(locale), formal(primString() , SYM(s), true, false));
-#line 677 "runtime.in"
+#line 684 "runtime.in"
addFunc(ve, run::gen_runtime76, primVoid(), SYM(abort), formal(primString() , SYM(s), true, false));
-#line 683 "runtime.in"
+#line 690 "runtime.in"
addFunc(ve, run::gen_runtime77, primVoid(), SYM(exit));
-#line 688 "runtime.in"
+#line 695 "runtime.in"
addFunc(ve, run::gen_runtime78, primVoid(), SYM(assert), formal(primBoolean(), SYM(b), false, false), formal(primString() , SYM(s), true, false));
-#line 699 "runtime.in"
+#line 706 "runtime.in"
addFunc(ve, run::gen_runtime79, primVoid(), SYM(sleep), formal(primInt(), SYM(seconds), false, false));
-#line 705 "runtime.in"
+#line 712 "runtime.in"
addFunc(ve, run::gen_runtime80, primVoid(), SYM(usleep), formal(primInt(), SYM(microseconds), false, false));
-#line 711 "runtime.in"
+#line 718 "runtime.in"
addFunc(ve, run::gen_runtime81, primVoid(), SYM(_eval), formal(primString(), SYM(s), false, false), formal(primBoolean(), SYM(embedded), false, false), formal(primBoolean(), SYM(interactivewrite), true, false));
-#line 724 "runtime.in"
+#line 731 "runtime.in"
addFunc(ve, run::gen_runtime82, primVoid(), SYM(_eval), formal(primCode(), SYM(s), false, false), formal(primBoolean(), SYM(embedded), false, false));
-#line 740 "runtime.in"
- addFunc(ve, run::gen_runtime83, primString() , SYM(location));
-#line 746 "runtime.in"
- REGISTER_BLTIN(run::loadModule,"loadModule");
-#line 752 "runtime.in"
- addFunc(ve, run::gen_runtime85, primString() , SYM(cd), formal(primString() , SYM(s), true, false));
+#line 747 "runtime.in"
+ addFunc(ve, run::gen_runtime83, primString() , SYM(xasyKEY));
+#line 754 "runtime.in"
+ addFunc(ve, run::gen_runtime84, primVoid(), SYM(xasyKEY), formal(primString(), SYM(s), false, false));
+#line 758 "runtime.in"
+ addFunc(ve, run::gen_runtime85, primString() , SYM(toplocation));
#line 762 "runtime.in"
- addFunc(ve, run::gen_runtime86, primVoid(), SYM(list), formal(primString(), SYM(s), false, false), formal(primBoolean(), SYM(imports), true, false));
-#line 771 "runtime.in"
+ addFunc(ve, run::gen_runtime86, primString() , SYM(location));
+#line 768 "runtime.in"
+ REGISTER_BLTIN(run::loadModule,"loadModule");
+#line 774 "runtime.in"
+ addFunc(ve, run::gen_runtime88, primString() , SYM(cd), formal(primString() , SYM(s), true, false));
+#line 784 "runtime.in"
+ addFunc(ve, run::gen_runtime89, primVoid(), SYM(list), formal(primString(), SYM(s), false, false), formal(primBoolean(), SYM(imports), true, false));
+#line 793 "runtime.in"
REGISTER_BLTIN(run::nullGuide,"nullGuide");
-#line 779 "runtime.in"
+#line 801 "runtime.in"
REGISTER_BLTIN(run::dotsGuide,"dotsGuide");
-#line 789 "runtime.in"
+#line 811 "runtime.in"
REGISTER_BLTIN(run::dashesGuide,"dashesGuide");
-#line 816 "runtime.in"
+#line 838 "runtime.in"
REGISTER_BLTIN(run::newCycleToken,"newCycleToken");
-#line 821 "runtime.in"
- addFunc(ve, run::gen_runtime91, primGuide(), symbol::trans("operator cast"), formal(primCycleToken(), SYM(tok), false, false));
-#line 828 "runtime.in"
- addFunc(ve, run::gen_runtime92, primGuide(), symbol::trans("operator spec"), formal(primPair(), SYM(z), false, false), formal(primInt(), SYM(p), false, false));
-#line 836 "runtime.in"
- addFunc(ve, run::gen_runtime93, primCurlSpecifier(), SYM_CURL, formal(primReal(), SYM(gamma), false, false), formal(primInt(), SYM(p), false, false));
-#line 842 "runtime.in"
+#line 843 "runtime.in"
+ addFunc(ve, run::gen_runtime94, primGuide(), symbol::trans("operator cast"), formal(primCycleToken(), SYM(tok), false, false));
+#line 850 "runtime.in"
+ addFunc(ve, run::gen_runtime95, primGuide(), symbol::trans("operator spec"), formal(primPair(), SYM(z), false, false), formal(primInt(), SYM(p), false, false));
+#line 858 "runtime.in"
+ addFunc(ve, run::gen_runtime96, primCurlSpecifier(), SYM_CURL, formal(primReal(), SYM(gamma), false, false), formal(primInt(), SYM(p), false, false));
+#line 864 "runtime.in"
REGISTER_BLTIN(run::curlSpecifierValuePart,"curlSpecifierValuePart");
-#line 847 "runtime.in"
+#line 869 "runtime.in"
REGISTER_BLTIN(run::curlSpecifierSidePart,"curlSpecifierSidePart");
-#line 852 "runtime.in"
- addFunc(ve, run::gen_runtime96, primGuide(), symbol::trans("operator cast"), formal(primCurlSpecifier(), SYM(spec), false, false));
-#line 857 "runtime.in"
- addFunc(ve, run::gen_runtime97, primTensionSpecifier(), SYM_TENSION, formal(primReal(), SYM(tout), false, false), formal(primReal(), SYM(tin), false, false), formal(primBoolean(), SYM(atleast), false, false));
-#line 862 "runtime.in"
+#line 874 "runtime.in"
+ addFunc(ve, run::gen_runtime99, primGuide(), symbol::trans("operator cast"), formal(primCurlSpecifier(), SYM(spec), false, false));
+#line 879 "runtime.in"
+ addFunc(ve, run::gen_runtime100, primTensionSpecifier(), SYM_TENSION, formal(primReal(), SYM(tout), false, false), formal(primReal(), SYM(tin), false, false), formal(primBoolean(), SYM(atleast), false, false));
+#line 884 "runtime.in"
REGISTER_BLTIN(run::tensionSpecifierOutPart,"tensionSpecifierOutPart");
-#line 867 "runtime.in"
+#line 889 "runtime.in"
REGISTER_BLTIN(run::tensionSpecifierInPart,"tensionSpecifierInPart");
-#line 872 "runtime.in"
- REGISTER_BLTIN(run::tensionSpecifierAtleastPart,"tensionSpecifierAtleastPart");
-#line 877 "runtime.in"
- addFunc(ve, run::gen_runtime101, primGuide(), symbol::trans("operator cast"), formal(primTensionSpecifier(), SYM(t), false, false));
-#line 882 "runtime.in"
- addFunc(ve, run::gen_runtime102, primGuide(), SYM_CONTROLS, formal(primPair(), SYM(zout), false, false), formal(primPair(), SYM(zin), false, false));
-#line 887 "runtime.in"
- addFunc(ve, run::gen_runtime103, primInt(), SYM(size), formal(primGuide(), SYM(g), false, false));
#line 894 "runtime.in"
- addFunc(ve, run::gen_runtime104, primInt(), SYM(length), formal(primGuide(), SYM(g), false, false));
-#line 901 "runtime.in"
- addFunc(ve, run::gen_runtime105, primBoolean(), SYM(cyclic), formal(primGuide(), SYM(g), false, false));
-#line 908 "runtime.in"
- addFunc(ve, run::gen_runtime106, primPair(), SYM(point), formal(primGuide(), SYM(g), false, false), formal(primInt(), SYM(t), false, false));
-#line 915 "runtime.in"
- addFunc(ve, run::gen_runtime107, pairArray(), SYM(dirSpecifier), formal(primGuide(), SYM(g), false, false), formal(primInt(), SYM(t), false, false));
-#line 927 "runtime.in"
- addFunc(ve, run::gen_runtime108, pairArray(), SYM(controlSpecifier), formal(primGuide(), SYM(g), false, false), formal(primInt(), SYM(t), false, false));
-#line 944 "runtime.in"
- addFunc(ve, run::gen_runtime109, primTensionSpecifier(), SYM(tensionSpecifier), formal(primGuide(), SYM(g), false, false), formal(primInt(), SYM(t), false, false));
-#line 954 "runtime.in"
- addFunc(ve, run::gen_runtime110, realArray(), SYM(curlSpecifier), formal(primGuide(), SYM(g), false, false), formal(primInt(), SYM(t), false, false));
-#line 968 "runtime.in"
- addFunc(ve, run::gen_runtime111, primGuide(), SYM(reverse), formal(primGuide(), SYM(g), false, false));
-#line 1021 "runtime.in"
- addFunc(ve, run::gen_runtime112, realArray(), SYM(_cputime));
-#line 1035 "runtime.in"
- addFunc(ve, run::gen_runtime113, primBoolean(), SYM_EQ, formal(primTransform(), SYM(a), false, false), formal(primTransform(), SYM(b), false, false));
+ REGISTER_BLTIN(run::tensionSpecifierAtleastPart,"tensionSpecifierAtleastPart");
+#line 899 "runtime.in"
+ addFunc(ve, run::gen_runtime104, primGuide(), symbol::trans("operator cast"), formal(primTensionSpecifier(), SYM(t), false, false));
+#line 904 "runtime.in"
+ addFunc(ve, run::gen_runtime105, primGuide(), SYM_CONTROLS, formal(primPair(), SYM(zout), false, false), formal(primPair(), SYM(zin), false, false));
+#line 909 "runtime.in"
+ addFunc(ve, run::gen_runtime106, primInt(), SYM(size), formal(primGuide(), SYM(g), false, false));
+#line 916 "runtime.in"
+ addFunc(ve, run::gen_runtime107, primInt(), SYM(length), formal(primGuide(), SYM(g), false, false));
+#line 923 "runtime.in"
+ addFunc(ve, run::gen_runtime108, primBoolean(), SYM(cyclic), formal(primGuide(), SYM(g), false, false));
+#line 930 "runtime.in"
+ addFunc(ve, run::gen_runtime109, primPair(), SYM(point), formal(primGuide(), SYM(g), false, false), formal(primInt(), SYM(t), false, false));
+#line 937 "runtime.in"
+ addFunc(ve, run::gen_runtime110, pairArray(), SYM(dirSpecifier), formal(primGuide(), SYM(g), false, false), formal(primInt(), SYM(t), false, false));
+#line 949 "runtime.in"
+ addFunc(ve, run::gen_runtime111, pairArray(), SYM(controlSpecifier), formal(primGuide(), SYM(g), false, false), formal(primInt(), SYM(t), false, false));
+#line 966 "runtime.in"
+ addFunc(ve, run::gen_runtime112, primTensionSpecifier(), SYM(tensionSpecifier), formal(primGuide(), SYM(g), false, false), formal(primInt(), SYM(t), false, false));
+#line 976 "runtime.in"
+ addFunc(ve, run::gen_runtime113, realArray(), SYM(curlSpecifier), formal(primGuide(), SYM(g), false, false), formal(primInt(), SYM(t), false, false));
+#line 990 "runtime.in"
+ addFunc(ve, run::gen_runtime114, primGuide(), SYM(reverse), formal(primGuide(), SYM(g), false, false));
#line 1043 "runtime.in"
- addFunc(ve, run::gen_runtime114, primBoolean(), SYM_NEQ, formal(primTransform(), SYM(a), false, false), formal(primTransform(), SYM(b), false, false));
-#line 1048 "runtime.in"
- addFunc(ve, run::gen_runtime115, primTransform(), SYM_PLUS, formal(primTransform(), SYM(a), false, false), formal(primTransform(), SYM(b), false, false));
-#line 1053 "runtime.in"
- addFunc(ve, run::gen_runtime116, primTransform(), SYM_TIMES, formal(primTransform(), SYM(a), false, false), formal(primTransform(), SYM(b), false, false));
-#line 1058 "runtime.in"
- addFunc(ve, run::gen_runtime117, primPair(), SYM_TIMES, formal(primTransform(), SYM(t), false, false), formal(primPair(), SYM(z), false, false));
-#line 1063 "runtime.in"
- addFunc(ve, run::gen_runtime118, primPath(), SYM_TIMES, formal(primTransform(), SYM(t), false, false), formal(primPath(), SYM(g), false, false));
-#line 1068 "runtime.in"
- addFunc(ve, run::gen_runtime119, primPen(), SYM_TIMES, formal(primTransform(), SYM(t), false, false), formal(primPen(), SYM(p), false, false));
-#line 1073 "runtime.in"
- addFunc(ve, run::gen_runtime120, primPicture(), SYM_TIMES, formal(primTransform(), SYM(t), false, false), formal(primPicture(), SYM(f), false, false));
-#line 1078 "runtime.in"
- addFunc(ve, run::gen_runtime121, primPicture(), SYM_TIMES, formal(realArray2(), SYM(t), false, false), formal(primPicture(), SYM(f), false, false));
-#line 1083 "runtime.in"
- addFunc(ve, run::gen_runtime122, primTransform(), SYM_CARET, formal(primTransform(), SYM(t), false, false), formal(primInt(), SYM(n), false, false));
-#line 1094 "runtime.in"
+ addFunc(ve, run::gen_runtime115, realArray(), SYM(_cputime));
+#line 1057 "runtime.in"
+ addFunc(ve, run::gen_runtime116, primBoolean(), SYM_EQ, formal(primTransform(), SYM(a), false, false), formal(primTransform(), SYM(b), false, false));
+#line 1065 "runtime.in"
+ addFunc(ve, run::gen_runtime117, primBoolean(), SYM_NEQ, formal(primTransform(), SYM(a), false, false), formal(primTransform(), SYM(b), false, false));
+#line 1070 "runtime.in"
+ addFunc(ve, run::gen_runtime118, primTransform(), SYM_PLUS, formal(primTransform(), SYM(a), false, false), formal(primTransform(), SYM(b), false, false));
+#line 1075 "runtime.in"
+ addFunc(ve, run::gen_runtime119, primTransform(), SYM_TIMES, formal(primTransform(), SYM(a), false, false), formal(primTransform(), SYM(b), false, false));
+#line 1080 "runtime.in"
+ addFunc(ve, run::gen_runtime120, primPair(), SYM_TIMES, formal(primTransform(), SYM(t), false, false), formal(primPair(), SYM(z), false, false));
+#line 1085 "runtime.in"
+ addFunc(ve, run::gen_runtime121, primPath(), SYM_TIMES, formal(primTransform(), SYM(t), false, false), formal(primPath(), SYM(g), false, false));
+#line 1090 "runtime.in"
+ addFunc(ve, run::gen_runtime122, primPen(), SYM_TIMES, formal(primTransform(), SYM(t), false, false), formal(primPen(), SYM(p), false, false));
+#line 1095 "runtime.in"
+ addFunc(ve, run::gen_runtime123, primPicture(), SYM_TIMES, formal(primTransform(), SYM(t), false, false), formal(primPicture(), SYM(f), false, false));
+#line 1100 "runtime.in"
+ addFunc(ve, run::gen_runtime124, primPicture(), SYM_TIMES, formal(realArray2(), SYM(t), false, false), formal(primPicture(), SYM(f), false, false));
+#line 1105 "runtime.in"
+ addFunc(ve, run::gen_runtime125, primTransform(), SYM_CARET, formal(primTransform(), SYM(t), false, false), formal(primInt(), SYM(n), false, false));
+#line 1116 "runtime.in"
REGISTER_BLTIN(run::transformXPart,"transformXPart");
-#line 1099 "runtime.in"
+#line 1121 "runtime.in"
REGISTER_BLTIN(run::transformYPart,"transformYPart");
-#line 1104 "runtime.in"
+#line 1126 "runtime.in"
REGISTER_BLTIN(run::transformXXPart,"transformXXPart");
-#line 1109 "runtime.in"
+#line 1131 "runtime.in"
REGISTER_BLTIN(run::transformXYPart,"transformXYPart");
-#line 1114 "runtime.in"
+#line 1136 "runtime.in"
REGISTER_BLTIN(run::transformYXPart,"transformYXPart");
-#line 1119 "runtime.in"
+#line 1141 "runtime.in"
REGISTER_BLTIN(run::transformYYPart,"transformYYPart");
-#line 1124 "runtime.in"
+#line 1146 "runtime.in"
REGISTER_BLTIN(run::real6ToTransform,"real6ToTransform");
-#line 1130 "runtime.in"
- addFunc(ve, run::gen_runtime130, primTransform(), SYM(shift), formal(primTransform(), SYM(t), false, false));
-#line 1135 "runtime.in"
- addFunc(ve, run::gen_runtime131, primTransform(), SYM(shiftless), formal(primTransform(), SYM(t), false, false));
-#line 1140 "runtime.in"
+#line 1152 "runtime.in"
+ addFunc(ve, run::gen_runtime133, primTransform(), SYM(shift), formal(primTransform(), SYM(t), false, false));
+#line 1157 "runtime.in"
+ addFunc(ve, run::gen_runtime134, primTransform(), SYM(shiftless), formal(primTransform(), SYM(t), false, false));
+#line 1162 "runtime.in"
addFunc(ve, run::transformIdentity, primTransform(), SYM(identity));
-#line 1145 "runtime.in"
- addFunc(ve, run::gen_runtime133, primTransform(), SYM(inverse), formal(primTransform(), SYM(t), false, false));
-#line 1150 "runtime.in"
- addFunc(ve, run::gen_runtime134, primTransform(), SYM(shift), formal(primPair(), SYM(z), false, false));
-#line 1155 "runtime.in"
- addFunc(ve, run::gen_runtime135, primTransform(), SYM(shift), formal(primReal(), SYM(x), false, false), formal(primReal(), SYM(y), false, false));
-#line 1160 "runtime.in"
- addFunc(ve, run::gen_runtime136, primTransform(), SYM(xscale), formal(primReal(), SYM(x), false, false));
-#line 1165 "runtime.in"
- addFunc(ve, run::gen_runtime137, primTransform(), SYM(yscale), formal(primReal(), SYM(y), false, false));
-#line 1170 "runtime.in"
- addFunc(ve, run::gen_runtime138, primTransform(), SYM(scale), formal(primReal(), SYM(x), false, false));
-#line 1175 "runtime.in"
- addFunc(ve, run::gen_runtime139, primTransform(), SYM(scale), formal(primReal(), SYM(x), false, false), formal(primReal(), SYM(y), false, false));
-#line 1180 "runtime.in"
- addFunc(ve, run::gen_runtime140, primTransform(), SYM(slant), formal(primReal(), SYM(s), false, false));
-#line 1185 "runtime.in"
- addFunc(ve, run::gen_runtime141, primTransform(), SYM(rotate), formal(primReal(), SYM(angle), false, false), formal(primPair(), SYM(z), true, false));
-#line 1190 "runtime.in"
- addFunc(ve, run::gen_runtime142, primTransform(), SYM(reflect), formal(primPair(), SYM(a), false, false), formal(primPair(), SYM(b), false, false));
+#line 1167 "runtime.in"
+ addFunc(ve, run::gen_runtime136, primTransform(), SYM(inverse), formal(primTransform(), SYM(t), false, false));
+#line 1172 "runtime.in"
+ addFunc(ve, run::gen_runtime137, primTransform(), SYM(shift), formal(primPair(), SYM(z), false, false));
+#line 1177 "runtime.in"
+ addFunc(ve, run::gen_runtime138, primTransform(), SYM(shift), formal(primReal(), SYM(x), false, false), formal(primReal(), SYM(y), false, false));
+#line 1182 "runtime.in"
+ addFunc(ve, run::gen_runtime139, primTransform(), SYM(xscale), formal(primReal(), SYM(x), false, false));
+#line 1187 "runtime.in"
+ addFunc(ve, run::gen_runtime140, primTransform(), SYM(yscale), formal(primReal(), SYM(y), false, false));
+#line 1192 "runtime.in"
+ addFunc(ve, run::gen_runtime141, primTransform(), SYM(scale), formal(primReal(), SYM(x), false, false));
+#line 1197 "runtime.in"
+ addFunc(ve, run::gen_runtime142, primTransform(), SYM(scale), formal(primReal(), SYM(x), false, false), formal(primReal(), SYM(y), false, false));
+#line 1202 "runtime.in"
+ addFunc(ve, run::gen_runtime143, primTransform(), SYM(slant), formal(primReal(), SYM(s), false, false));
+#line 1207 "runtime.in"
+ addFunc(ve, run::gen_runtime144, primTransform(), SYM(rotate), formal(primReal(), SYM(angle), false, false), formal(primPair(), SYM(z), true, false));
+#line 1212 "runtime.in"
+ addFunc(ve, run::gen_runtime145, primTransform(), SYM(reflect), formal(primPair(), SYM(a), false, false), formal(primPair(), SYM(b), false, false));
}
} // namespace trans
diff --git a/Build/source/utils/asymptote/runtime.in b/Build/source/utils/asymptote/runtime.in
index da26c9f88cd..f3b6899cb45 100644
--- a/Build/source/utils/asymptote/runtime.in
+++ b/Build/source/utils/asymptote/runtime.in
@@ -197,8 +197,8 @@ void writestring(stack *s)
string S=pop<string>(s);
vm::item it=pop(s);
bool defaultfile=isdefault(it);
- camp::file *f=defaultfile ? &camp::Stdout : vm::get<camp::file*>(it);
- if(!f->isOpen()) return;
+ camp::ofile *f=defaultfile ? &camp::Stdout : vm::get<camp::ofile*>(it);
+ if(!f->isOpen() || !f->enabled()) return;
if(S != "") f->write(S);
if(f->text()) {
if(suffix) {
@@ -208,6 +208,13 @@ void writestring(stack *s)
}
}
+string toplocation() {
+ ostringstream buf;
+ position& topPos=processData().topPos;
+ buf << topPos.Line() << "." << topPos.Column();
+ return buf.str();
+}
+
string emptystring;
pair zero;
@@ -737,6 +744,21 @@ void _eval(runnable *s, bool embedded)
runCode(ast);
}
+string xasyKEY() {
+ processDataStruct *P=&processData();
+ xkey_t *xkey=&P->xkey;
+ xkey_t::iterator p=xkey->find(P->topPos.LineColumn());
+ return p != xkey->end() ? p->second+" 1" : toplocation()+" 0";
+}
+
+void xasyKEY(string *s) {
+ processData().KEY=*s;
+}
+
+string toplocation() {
+ return toplocation();
+}
+
string location() {
ostringstream buf;
buf << getPos();
diff --git a/Build/source/utils/asymptote/runtime.symbols.h b/Build/source/utils/asymptote/runtime.symbols.h
deleted file mode 100644
index ac070cb5958..00000000000
--- a/Build/source/utils/asymptote/runtime.symbols.h
+++ /dev/null
@@ -1,113 +0,0 @@
-/*****
- * This file is automatically generated by findsym.pl
- * Changes will be overwritten.
- *****/
-
-// If the ADDSYMBOL macro is not already defined, define it with the default
-// purpose of referring to an external pre-translated symbol, such that
-// SYM(name) also refers to that symbol.
-#ifndef ADDSYMBOL
- #define ADDSYMBOL(name) extern sym::symbol PRETRANSLATED_SYMBOL_##name
- #define SYM(name) PRETRANSLATED_SYMBOL_##name
-#endif
-
-ADDSYMBOL(_cputime);
-ADDSYMBOL(_eval);
-ADDSYMBOL(a);
-ADDSYMBOL(abort);
-ADDSYMBOL(adjust);
-ADDSYMBOL(angle);
-ADDSYMBOL(arclength);
-ADDSYMBOL(assert);
-ADDSYMBOL(asydir);
-ADDSYMBOL(atleast);
-ADDSYMBOL(b);
-ADDSYMBOL(basealign);
-ADDSYMBOL(blend);
-ADDSYMBOL(byte);
-ADDSYMBOL(c);
-ADDSYMBOL(cd);
-ADDSYMBOL(cmyk);
-ADDSYMBOL(colorless);
-ADDSYMBOL(colors);
-ADDSYMBOL(colorspace);
-ADDSYMBOL(controlSpecifier);
-ADDSYMBOL(curlSpecifier);
-ADDSYMBOL(cyclic);
-ADDSYMBOL(defaultpen);
-ADDSYMBOL(dirSpecifier);
-ADDSYMBOL(embedded);
-ADDSYMBOL(exit);
-ADDSYMBOL(f);
-ADDSYMBOL(fillrule);
-ADDSYMBOL(font);
-ADDSYMBOL(fontcommand);
-ADDSYMBOL(fontsize);
-ADDSYMBOL(g);
-ADDSYMBOL(gamma);
-ADDSYMBOL(gray);
-ADDSYMBOL(hex);
-ADDSYMBOL(identity);
-ADDSYMBOL(imports);
-ADDSYMBOL(interactive);
-ADDSYMBOL(interactivewrite);
-ADDSYMBOL(interp);
-ADDSYMBOL(inverse);
-ADDSYMBOL(invisible);
-ADDSYMBOL(isnan);
-ADDSYMBOL(k);
-ADDSYMBOL(length);
-ADDSYMBOL(linecap);
-ADDSYMBOL(linejoin);
-ADDSYMBOL(lineskip);
-ADDSYMBOL(linetype);
-ADDSYMBOL(linewidth);
-ADDSYMBOL(list);
-ADDSYMBOL(locale);
-ADDSYMBOL(location);
-ADDSYMBOL(m);
-ADDSYMBOL(makepen);
-ADDSYMBOL(max);
-ADDSYMBOL(microseconds);
-ADDSYMBOL(min);
-ADDSYMBOL(miterlimit);
-ADDSYMBOL(n);
-ADDSYMBOL(nib);
-ADDSYMBOL(offset);
-ADDSYMBOL(opacity);
-ADDSYMBOL(overwrite);
-ADDSYMBOL(p);
-ADDSYMBOL(pattern);
-ADDSYMBOL(point);
-ADDSYMBOL(r);
-ADDSYMBOL(reflect);
-ADDSYMBOL(resetdefaultpen);
-ADDSYMBOL(reverse);
-ADDSYMBOL(rgb);
-ADDSYMBOL(rotate);
-ADDSYMBOL(s);
-ADDSYMBOL(scale);
-ADDSYMBOL(seconds);
-ADDSYMBOL(shift);
-ADDSYMBOL(shiftless);
-ADDSYMBOL(size);
-ADDSYMBOL(slant);
-ADDSYMBOL(sleep);
-ADDSYMBOL(spec);
-ADDSYMBOL(system);
-ADDSYMBOL(t);
-ADDSYMBOL(tensionSpecifier);
-ADDSYMBOL(tin);
-ADDSYMBOL(tok);
-ADDSYMBOL(tout);
-ADDSYMBOL(transform);
-ADDSYMBOL(uptodate);
-ADDSYMBOL(usleep);
-ADDSYMBOL(view);
-ADDSYMBOL(x);
-ADDSYMBOL(xscale);
-ADDSYMBOL(y);
-ADDSYMBOL(yscale);
-ADDSYMBOL(z);
-ADDSYMBOL(zin);
-ADDSYMBOL(zout);
diff --git a/Build/source/utils/asymptote/runtriple.symbols.h b/Build/source/utils/asymptote/runtriple.symbols.h
deleted file mode 100644
index 581ed2aaa3c..00000000000
--- a/Build/source/utils/asymptote/runtriple.symbols.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*****
- * This file is automatically generated by findsym.pl
- * Changes will be overwritten.
- *****/
-
-// If the ADDSYMBOL macro is not already defined, define it with the default
-// purpose of referring to an external pre-translated symbol, such that
-// SYM(name) also refers to that symbol.
-#ifndef ADDSYMBOL
- #define ADDSYMBOL(name) extern sym::symbol PRETRANSLATED_SYMBOL_##name
- #define SYM(name) PRETRANSLATED_SYMBOL_##name
-#endif
-
-ADDSYMBOL(a);
-ADDSYMBOL(abs);
-ADDSYMBOL(azimuth);
-ADDSYMBOL(b);
-ADDSYMBOL(bezier);
-ADDSYMBOL(bezierP);
-ADDSYMBOL(bezierPP);
-ADDSYMBOL(bezierPPP);
-ADDSYMBOL(c);
-ADDSYMBOL(colatitude);
-ADDSYMBOL(cross);
-ADDSYMBOL(d);
-ADDSYMBOL(dir);
-ADDSYMBOL(dot);
-ADDSYMBOL(expi);
-ADDSYMBOL(latitude);
-ADDSYMBOL(length);
-ADDSYMBOL(longitude);
-ADDSYMBOL(perp);
-ADDSYMBOL(polar);
-ADDSYMBOL(realmult);
-ADDSYMBOL(t);
-ADDSYMBOL(u);
-ADDSYMBOL(unit);
-ADDSYMBOL(v);
-ADDSYMBOL(warn);
-ADDSYMBOL(x);
-ADDSYMBOL(xpart);
-ADDSYMBOL(ypart);
-ADDSYMBOL(z);
-ADDSYMBOL(zpart);
diff --git a/Build/source/utils/asymptote/settings.cc b/Build/source/utils/asymptote/settings.cc
index db3d396394c..76fa409167e 100644
--- a/Build/source/utils/asymptote/settings.cc
+++ b/Build/source/utils/asymptote/settings.cc
@@ -98,7 +98,7 @@ string defaultPDFViewer="open";
string defaultPDFViewer="acroread";
#endif
string defaultGhostscript="gs";
-string defaultGhostscriptLibrary="/usr/lib/libgs.so";
+string defaultGhostscriptLibrary="";
string defaultDisplay="display";
string defaultAnimate="animate";
void queryRegistry() {}
@@ -184,7 +184,7 @@ string getEntry(const string& key)
void queryRegistry()
{
- defaultGhostscriptLibrary=getEntry("GPL Ghostscript/*/GS_DLL");
+ string defaultGhostscriptLibrary=getEntry("GPL Ghostscript/*/GS_DLL");
if(defaultGhostscriptLibrary.empty())
defaultGhostscriptLibrary=getEntry("AFPL Ghostscript/*/GS_DLL");
@@ -1231,6 +1231,8 @@ void initSettings() {
".."));
addOption(new boolSetting("multiline", 0,
"Input code over multiple lines at the prompt"));
+ addOption(new boolSetting("xasy", 0,
+ "Special interactive mode for xasy"));
addOption(new boolSetting("wait", 0,
"Wait for child processes to finish before exiting"));
@@ -1330,7 +1332,7 @@ void setInteractive()
{
if(numArgs() == 0 && !getSetting<bool>("listvariables") &&
getSetting<string>("command").empty() &&
- (isatty(STDIN_FILENO) || getSetting<Int>("inpipe") >= 0))
+ (isatty(STDIN_FILENO) || getSetting<Int>("xasy")))
interact::interactive=true;
if(getSetting<bool>("localhistory"))
diff --git a/Build/source/utils/asymptote/stack.cc b/Build/source/utils/asymptote/stack.cc
index 3a4711becb3..7ffb6bcb590 100644
--- a/Build/source/utils/asymptote/stack.cc
+++ b/Build/source/utils/asymptote/stack.cc
@@ -14,6 +14,7 @@
#include "errormsg.h"
#include "util.h"
#include "runtime.h"
+#include "process.h"
#include "profiler.h"
@@ -333,12 +334,17 @@ void stack::runWithOrWithoutClosure(lambda *l, vars_t vars, vars_t parent)
/* start the new function */
program::label ip = l->code->begin();
+ position& topPos=processData().topPos;
+ string& fileName=processData().fileName;
try {
for (;;) {
const inst &i = *ip;
curPos = i.pos;
+ if(curPos.filename() == fileName)
+ topPos=curPos;
+
#ifdef PROFILE
prof.recordInstruction();
#endif
diff --git a/Build/source/utils/asymptote/types.symbols.h b/Build/source/utils/asymptote/types.symbols.h
deleted file mode 100644
index c1657e3a36f..00000000000
--- a/Build/source/utils/asymptote/types.symbols.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*****
- * This file is automatically generated by findsym.pl
- * Changes will be overwritten.
- *****/
-
-// If the ADDSYMBOL macro is not already defined, define it with the default
-// purpose of referring to an external pre-translated symbol, such that
-// SYM(name) also refers to that symbol.
-#ifndef ADDSYMBOL
- #define ADDSYMBOL(name) extern sym::symbol PRETRANSLATED_SYMBOL_##name
- #define SYM(name) PRETRANSLATED_SYMBOL_##name
-#endif
-
-ADDSYMBOL(a);
-ADDSYMBOL(append);
-ADDSYMBOL(atLeast);
-ADDSYMBOL(b);
-ADDSYMBOL(csv);
-ADDSYMBOL(cyclic);
-ADDSYMBOL(delete);
-ADDSYMBOL(dimension);
-ADDSYMBOL(i);
-ADDSYMBOL(in);
-ADDSYMBOL(initialized);
-ADDSYMBOL(insert);
-ADDSYMBOL(j);
-ADDSYMBOL(keys);
-ADDSYMBOL(length);
-ADDSYMBOL(line);
-ADDSYMBOL(mode);
-ADDSYMBOL(name);
-ADDSYMBOL(nx);
-ADDSYMBOL(ny);
-ADDSYMBOL(nz);
-ADDSYMBOL(out);
-ADDSYMBOL(pop);
-ADDSYMBOL(push);
-ADDSYMBOL(read);
-ADDSYMBOL(side);
-ADDSYMBOL(signedint);
-ADDSYMBOL(singleint);
-ADDSYMBOL(singlereal);
-ADDSYMBOL(value);
-ADDSYMBOL(word);
-ADDSYMBOL(x);
-ADDSYMBOL(xx);
-ADDSYMBOL(xy);
-ADDSYMBOL(y);
-ADDSYMBOL(yx);
-ADDSYMBOL(yy);
-ADDSYMBOL(z);
diff --git a/Build/source/utils/asymptote/vm.h b/Build/source/utils/asymptote/vm.h
index 5be4c7a104f..2ba55dfa15f 100644
--- a/Build/source/utils/asymptote/vm.h
+++ b/Build/source/utils/asymptote/vm.h
@@ -29,6 +29,7 @@ string lookupBltin(bltin b);
void run(lambda *l);
position getPos();
+
void errornothrow(const char* message);
void error(const char* message);
void error(const ostringstream& message);